diff --git a/train/CANN V100R020C10 benchmark工具用户指南 01.pdf b/train/CANN V100R020C10 benchmark工具用户指南 01.pdf new file mode 100644 index 0000000..2fed7de Binary files /dev/null and b/train/CANN V100R020C10 benchmark工具用户指南 01.pdf differ diff --git a/train/README.md b/train/README.md new file mode 100644 index 0000000..8faa7a8 --- /dev/null +++ b/train/README.md @@ -0,0 +1,50 @@ +# 训练benchmark + +## 支持的产品 +Atlas 800 (Model 9000) + +## 操作系统 + +centos7.6 & ubuntu 18.04 + + +## 训练方法 + +1. 根据实际情况修改 ./yaml/ 目录下的对应的 yaml 文件,建议备份原文件,且保持 yaml 文件名与模型名称相同。 +2. 在当前目录(train)下,执行:`./benchmark.sh --help` 查看帮助信息。 +3. 根据 **帮助信息** 或本文件中的 **运行参数说明** 选择配置运行参数后,执行:`./benchmark.sh` + +## 示例 +- 示例1,docker 环境下启动 MobileNet 多卡(8p)训练:`./benchmark.sh -e MobileNet -hw 8p -y ./yaml/MobileNet.yaml -docker` +- 示例2,host 环境下启动 MobileNet 单卡(1p)训练,yaml 使用默认文件:`./benchmark.sh -e MobileNet` +- 示例3,host 环境下启动 ResNet50 集群(cluster)训练,yaml 使用默认文件:`./benchmark.sh -e ResNet50 -hw ct` +- 示例4,host 环境下启动 pytorch模型DeepMar单卡(1p)训练,yaml 使用默认文件:`./benchmark.sh -e DeepMar -hw 1p -f pytorch` +- 示例5,host 环境下启动 pytorch模型DeepMar多卡(8p)训练,yaml 使用默认文件:`./benchmark.sh -e DeepMar -hw 8p -f pytorch` +- 示例6,docker环境下启动 pytorch模型DeepMar多卡(8p)训练,yaml 使用默认文件:`./benchmark.sh -e DeepMar -hw 8p -f pytorch -docker` + +## 运行参数说明 + +| 参数 | 是否必填 | 参数说明 | 默认值 | +| --------------- | -------- | -------------------- |------------------------ | +| --execmodel, -e | 选填 | 需要执行的模型名称 | ResNet50 | +| --hardware, -hw | 选填 | 选择 1p, 2p, 4p, 8p, cluster/ct | 1p | +| --yamlpath, -y | 选填 | yaml 文件的路径 | ./yaml/{execmodel}.yaml | +| --framework, -f | 选填 | 模型训练框架 | tensorflow | +| -docker, -host | 选填 | 选择 docker 或 host | host | +| --help, -h | 选填 | 显示帮助信息 | NA | +| --list, -l | 选填 | 显示当前支持的模型与框架 | NA | + +## 查看日志 + +- 可在 train/result/ 目录下查看各个模型最后生成的含性能与精度数据的日志。 +- 中间结果ckpt或其他文件存放在 *device id* 下。 +- train_x.log 为模型训练过程日志,内容较为详细;以 hw 开头的日志为打点日志,仅记录数据。 + +## 注意事项 + +- yaml 文件中的值可以参考注释,根据实际情况自行修改。键不可随意修改,否则可能导致训练失败或训练结果偏离实际。 +- 集群(cluster)执行时,请保证各节点环境配置相同,且包括**配置文件、数据集、代码**绝对路径相同。 + +## Benchmark工具资料参考 + +https://support.huawei.com/enterprise/zh/ascend-computing/atlas-data-center-solution-pid-251167910/software/251732401?idAbsPath=fixnode01%7C23710424%7C251366513%7C22892968%7C251167910 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/README.md b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/README.md new file mode 100644 index 0000000..80fd3b2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/README.md @@ -0,0 +1,40 @@ +# DeepMar_pytorch训练说明 + +### 1. 数据集处理 + +#### 1.1. 下载并准备数据集: +百度云盘https://pan.baidu.com/s/1q8nsydT7xkDjZJOxvPcoEw +passwd: 5vep +或者https://drive.google.com/open?id=1q4cux17K3zNBgIrDV4FtcHJPLzXNKfYG + +存放地址 +./dataset/peta/images/*.png +./dataset/peta/PETA.mat + +#### 1.2 运行以下命令,分割训练集、测试集(路径修改成自己存放数据集路径) +python script/dataset/transform_peta.py +生成 peta_dataset.pkl,peta_partition.pkl 文件 + +### 2. 模型训练参数配置 + +在train/yaml/DeepMar.yaml中修改相应配置, 配置项含义: + +``` +pytorch_config: + data_url: 数据集路径 + epoches: 跑多少个epoch + batch_size:1p 参数为256 2p 512 4p 1024 8p为2048 + seed: 49 + lr: 默认参数1p 0.01 2p 0.016 4p 0.016 8p 0.016 + docker_image: docker 镜像名称:版本号 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/__init__.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/Dataset.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/Dataset.py new file mode 100644 index 0000000..dcfb0f1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/Dataset.py @@ -0,0 +1,81 @@ +import torch.utils.data as data +import os +from PIL import Image +import numpy as np +import pickle +import copy + +class AttDataset(data.Dataset): + """ + person attribute dataset interface + """ + def __init__( + self, + dataset, + partition, + split='train', + partition_idx=0, + transform=None, + target_transform=None, + **kwargs): + if os.path.exists( dataset ): + file = open(dataset, 'rb') + self.dataset = pickle.load(file) + else: + print (dataset + ' does not exist in dataset.') + raise ValueError + if os.path.exists( partition ): + part = open(partition, 'rb') + self.partition = pickle.load(part) + else: + print (partition + ' does not exist in dataset.') + raise ValueError + if split not in self.partition: + print (split + ' does not exist in dataset.') + raise ValueError + + if partition_idx > len(self.partition[split])-1: + print ('partition_idx is out of range in partition.') + raise ValueError + + self.transform = transform + self.target_transform = target_transform + + # create image, label based on the selected partition and dataset split + self.root_path = self.dataset['root'] + self.att_name = [self.dataset['att_name'][i] for i in self.dataset['selected_attribute']] + self.image = [] + self.label = [] + for idx in self.partition[split][partition_idx]: + self.image.append(self.dataset['image'][idx]) + label_tmp = np.array(self.dataset['att'][idx])[self.dataset['selected_attribute']].tolist() + self.label.append(label_tmp) + + def __getitem__(self, index): + """ + Args: + index (int): Index + Returns: + tuple: (image, target) where target is the index of the target class + """ + imgname, target = self.image[index], self.label[index] + # load image and labels + imgname = os.path.join(self.dataset['root'], imgname) + img = Image.open(imgname) + if self.transform is not None: + img = self.transform( img ) + + # default no transform + target = np.array(target).astype(np.float32) + target[target == 0] = -1 + target[target == 2] = 0 + if self.target_transform is not None: + target = self.transform( target ) + + return img, target + + # useless for personal batch sampler + def __len__(self): + return len(self.image) + + diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/__init__.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/add_transforms.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/add_transforms.py new file mode 100644 index 0000000..76aa64c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/dataset/add_transforms.py @@ -0,0 +1,65 @@ +import torch +import numpy as np +import numbers +__all__ = ["AddPad", "AddCrop"] + +class AddCrop(object): + def __init__(self, size): + self.size = size # two + assert len(self.size) == 2 + def __repr__(self): + return self.__class__.__name__ + '(size={0})'.format(self.size) + def __call__(self, img): + shape = img.shape # 3*H*W + h_high = shape[1] - self.size[0] + w_high = shape[2] - self.size[1] + h_start = np.random.randint(low=0, high=h_high) + w_start = np.random.randint(low=0, high=w_high) + return img[:, h_start: h_start+self.size[0], w_start: w_start+self.size[1]] + +class AddPad(object): + def __init__(self, padding, fill=0): + self.padding = padding + self.fill = fill + if isinstance(self.padding, numbers.Number): + self.pad_l = int(self.padding) + self.pad_r = int(self.padding) + self.pad_u = int(self.padding) + self.pad_d = int(self.padding) + elif isinstance(self.padding, (list, tuple)) and len(self.padding) == 4: + self.pad_l = int(self.padding[0]) + self.pad_r = int(self.padding[1]) + self.pad_u = int(self.padding[2]) + self.pad_d = int(self.padding[3]) + else: + print ("The type of padding is not right.") + raise ValueError + if self.pad_l <0 or self.pad_r < 0 or self.pad_u < 0 or self.pad_d < 0: + raise ValueError + if isinstance(self.fill, numbers.Number): + self.fill_value = [self.fill] + elif isinstance(self.fill, list): + self.fill_value = self.fill + + def __repr__(self): + return self.__class__.__name__ + '(padding={0})'.format(self.padding) + + def __call__(self, img): + """ + Args: + img: a 3-dimensional torch tensor with shape [R,G,B]*H*W + Returns: + img: a 3-dimensional padded tensor with shape [R,G,B]*H'*W' + """ + if not (self.pad_l or self.pad_r or self.pad_u or self.pad_d): + return img + shape = img.shape + img_ = torch.rand(shape[0], shape[1]+self.pad_u+self.pad_d, \ + shape[2]+self.pad_l+self.pad_r) + for i in range(shape[0]): + img_[i, 0:self.pad_u, :] = self.fill_value[i%len(self.fill_value)] + img_[i, -(self.pad_d+1):-1, :] = self.fill_value[i%len(self.fill_value)] + img_[i, :, 0:self.pad_l] = self.fill_value[i%len(self.fill_value)] + img_[i, :, -(self.pad_r+1):-1] = self.fill_value[i%len(self.fill_value)] + img_[i, self.pad_u:self.pad_u+shape[1], self.pad_l:self.pad_l+shape[2]] = img[i, :, :] + return img_ diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/DeepMAR.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/DeepMAR.py new file mode 100644 index 0000000..ce169aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/DeepMAR.py @@ -0,0 +1,81 @@ +import torch +import torch.nn as nn +import torch.nn.init as init +import torch.nn.functional as F +from torch.autograd import Variable +import numpy as np +from .resnet import resnet50 + + +class DeepMAR_ResNet50(nn.Module): + def __init__( + self, + **kwargs + ): + super(DeepMAR_ResNet50, self).__init__() + # init the necessary parameter for netwokr structure + if 'num_att' in kwargs: + self.num_att = kwargs['num_att'] + else: + self.num_att = 35 + if 'last_conv_stride' in kwargs: + self.last_conv_stride = kwargs['last_conv_stride'] + else: + self.last_conv_stride = 2 + if 'drop_pool5' in kwargs: + self.drop_pool5 = kwargs['drop_pool5'] + else: + self.drop_pool5 = True + if 'drop_pool5_rate' in kwargs: + self.drop_pool5_rate = kwargs['drop_pool5_rate'] + else: + self.drop_pool5_rate = 0.5 + if 'pretrained' in kwargs: + self.pretrained = kwargs['pretrained'] + else: + self.pretrained = True + + self.base = resnet50(pretrained=self.pretrained, last_conv_stride=self.last_conv_stride) + + self.classifier = nn.Linear(2048, self.num_att) + init.normal_(self.classifier.weight, std=0.001) + init.constant_(self.classifier.bias, 0) + + def forward(self, x): + + x = self.base(x) + x = F.avg_pool2d(x, x.shape[2:]) + # x = x.view(x.size(0), -1) + x = torch.flatten(x, 1) + if self.drop_pool5: + # x = x.to("cpu") + x = F.dropout(x, p=self.drop_pool5_rate, training=self.training) + # x = x.to("npu") + x = self.classifier(x) + return x + +class DeepMAR_ResNet50_ExtractFeature(object): + """ + A feature extraction function + """ + def __init__(self, model, **kwargs): + self.model = model + + def __call__(self, imgs): + old_train_eval_model = self.model.training + + # set the model to be eval + self.model.eval() + + # imgs should be Variable + if not isinstance(imgs, Variable): + print ('imgs should be type: Variable') + raise ValueError + # compute output + score = self.model(imgs) + score = score.data.cpu().numpy() + + # set the model to be training + self.model.train(old_train_eval_model) + + return score diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/__init__.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/resnet.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/resnet.py new file mode 100644 index 0000000..f85a707 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/model/resnet.py @@ -0,0 +1,217 @@ +import torch.nn as nn +import math +import torch.utils.model_zoo as model_zoo +import ssl + +ssl._create_default_https_context = ssl._create_unverified_context + + +__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', + 'resnet152'] + + +model_urls = { + 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', + 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', + 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', + 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', + 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', +} + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = nn.BatchNorm2d(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = nn.BatchNorm2d(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + + def __init__(self, inplanes, planes, stride=1, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) + self.bn1 = nn.BatchNorm2d(planes) + self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, + padding=1, bias=False) + self.bn2 = nn.BatchNorm2d(planes) + self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) + self.bn3 = nn.BatchNorm2d(planes * 4) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__(self, block, layers, last_conv_stride=2): + self.inplanes = 64 + super(ResNet, self).__init__() + self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, + bias=False) + self.bn1 = nn.BatchNorm2d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer(block, 128, layers[1], stride=2) + self.layer3 = self._make_layer(block, 256, layers[2], stride=2) + self.layer4 = self._make_layer(block, 512, layers[3], stride=last_conv_stride) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels + m.weight.data.normal_(0, math.sqrt(2. / n)) + elif isinstance(m, nn.BatchNorm2d): + m.weight.data.fill_(1) + m.bias.data.zero_() + + def _make_layer(self, block, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.Conv2d(self.inplanes, planes * block.expansion, + kernel_size=1, stride=stride, bias=False), + nn.BatchNorm2d(planes * block.expansion), + ) + + layers = [] + layers.append(block(self.inplanes, planes, stride, downsample)) + self.inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append(block(self.inplanes, planes)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + return x + +def remove_fc(state_dict): + """ Remove the fc layer parameter from state_dict. """ + for key, value in list(state_dict.items()): + if key.startswith('fc.'): + del state_dict[key] + return state_dict + + +def resnet18(pretrained=False, **kwargs): + """Constructs a ResNet-18 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) + if pretrained: + model.load_state_dict(remove_fc(model_zoo.load_url(model_urls['resnet18']))) + return model + + +def resnet34(pretrained=False, **kwargs): + """Constructs a ResNet-34 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) + if pretrained: + model.load_state_dict(remove_fc(model_zoo.load_url(model_urls['resnet34']))) + return model + + +def resnet50(pretrained=False, **kwargs): + """Constructs a ResNet-50 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) + if pretrained: + model.load_state_dict(remove_fc(model_zoo.load_url(model_urls['resnet50']))) + return model + + +def resnet101(pretrained=False, **kwargs): + """Constructs a ResNet-101 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) + if pretrained: + model.load_state_dict(remove_fc(model_zoo.load_url(model_urls['resnet101']))) + return model + + +def resnet152(pretrained=False, **kwargs): + """Constructs a ResNet-152 model. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) + if pretrained: + model.load_state_dict(remove_fc(model_zoo.load_url(model_urls['resnet152']))) + return model diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/__init__.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/evaluate.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/evaluate.py new file mode 100644 index 0000000..c25ae82 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/evaluate.py @@ -0,0 +1,105 @@ +import os +import torch +from torch.autograd import Variable +import numpy as np +import copy +import time +import sys + + +def extract_feat(feat_func, dataset, device_id, **kwargs): + """ + extract feature for images + """ + test_loader = torch.utils.data.DataLoader( + dataset=dataset, batch_size=32, + num_workers=32, pin_memory=True, + drop_last=True) + # extract feature for all the images of test/val identities + start_time = time.time() + total_eps = len(test_loader) + N = len(dataset.image) + start = 0 + with torch.no_grad(): + for ep, (imgs, labels) in enumerate(test_loader): + # imgs_var = Variable(imgs).cuda() + # imgs_var = Variable(imgs) + imgs_var = Variable(imgs).to(device_id) + feat_tmp = feat_func(imgs_var) + batch_size = feat_tmp.shape[0] + if ep == 0: + feat = np.zeros((N, int(feat_tmp.size/batch_size))) + feat[start:start+batch_size, :] = feat_tmp.reshape((batch_size, -1)) + start += batch_size + end_time = time.time() + print('{} batches done, total {:.2f}s'.format(total_eps, end_time-start_time)) + return feat + +# attribute recognition evaluation +def attribute_evaluate(feat_func, dataset, device_id, **kwargs): + print ("extracting features for attribute recognition") + pt_result = extract_feat(feat_func, dataset, device_id) + # obain the attributes from the attribute dictionary + print ("computing attribute recognition result") + N = pt_result.shape[0] + L = pt_result.shape[1] + gt_result = np.zeros(pt_result.shape) + # get the groundtruth attributes + for idx, label in enumerate(dataset.label): + gt_result[idx, :] = label + pt_result[pt_result>=0] = 1 + pt_result[pt_result<0] = 0 + return attribute_evaluate_lidw(gt_result, pt_result) + +def attribute_evaluate_lidw(gt_result, pt_result): + """ + Input: + gt_result, pt_result, N*L, with 0/1 + Output: + result + a dictionary, including label-based and instance-based evaluation + label-based: label_pos_acc, label_neg_acc, label_acc + instance-based: instance_acc, instance_precision, instance_recall, instance_F1 + """ + # obtain the label-based and instance-based accuracy + # compute the label-based accuracy + if gt_result.shape != pt_result.shape: + print ('Shape beteen groundtruth and predicted results are different') + # compute the label-based accuracy + result = {} + gt_pos = np.sum((gt_result == 1).astype(float), axis=0) + gt_neg = np.sum((gt_result == 0).astype(float), axis=0) + pt_pos = np.sum((gt_result == 1).astype(float) * (pt_result == 1).astype(float), axis=0) + pt_neg = np.sum((gt_result == 0).astype(float) * (pt_result == 0).astype(float), axis=0) + label_pos_acc = 1.0*pt_pos/gt_pos + label_neg_acc = 1.0*pt_neg/gt_neg + label_acc = (label_pos_acc + label_neg_acc)/2 + result['label_pos_acc'] = label_pos_acc + result['label_neg_acc'] = label_neg_acc + result['label_acc'] = label_acc + # compute the instance-based accuracy + # precision + gt_pos = np.sum((gt_result == 1).astype(float), axis=1) + pt_pos = np.sum((pt_result == 1).astype(float), axis=1) + floatersect_pos = np.sum((gt_result == 1).astype(float)*(pt_result == 1).astype(float), axis=1) + union_pos = np.sum(((gt_result == 1)+(pt_result == 1)).astype(float),axis=1) + # avoid empty label in predicted results + cnt_eff = float(gt_result.shape[0]) + for iter, key in enumerate(gt_pos): + if key == 0: + union_pos[iter] = 1 + pt_pos[iter] = 1 + gt_pos[iter] = 1 + cnt_eff = cnt_eff - 1 + continue + if pt_pos[iter] == 0: + pt_pos[iter] = 1 + instance_acc = np.sum(floatersect_pos/union_pos)/cnt_eff + instance_precision = np.sum(floatersect_pos/pt_pos)/cnt_eff + instance_recall = np.sum(floatersect_pos/gt_pos)/cnt_eff + floatance_F1 = 2*instance_precision*instance_recall/(instance_precision+instance_recall) + result['instance_acc'] = instance_acc + result['instance_precision'] = instance_precision + result['instance_recall'] = instance_recall + result['instance_F1'] = floatance_F1 + return result diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/utils.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/utils.py new file mode 100644 index 0000000..891dc7c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/baseline/utils/utils.py @@ -0,0 +1,347 @@ +import os +import pickle +import datetime +import time +# from contextlib import contextmanger +import torch +from torch.autograd import Variable +import random +import numpy as np +import torch.backends.cudnn as cudnn + +def time_str(fmt=None): + if fmt is None: + fmt = '%Y-%m-%d_%H:%M:%S' + return datetime.datetime.today().strftime(fmt) + +def str2bool(v): + return v.lower() in ("yes", "true", "1") + +def is_iterable(obj): + return hasattr(obj, '__len__') + +def to_scalar(vt): + """ + transform a 1-length pytorch Variable or Tensor to scalar + """ + if isinstance(vt, Variable): + return vt.data.cpu().numpy().flatten()[0] + if torch.is_tensor(vt): + return vt.cpu().numpy().flatten()[0] + raise TypeError('Input should be a variable or tensor') + +def set_seed(rand_seed): + np.random.seed( rand_seed ) + random.seed( rand_seed ) + torch.backends.cudnn.enabled = True + torch.manual_seed( rand_seed ) + torch.cuda.manual_seed( rand_seed ) + +def seed_everything(seed): + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + cudnn.deterministic = True + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + +def may_mkdir(fname): + if not os.path.exists(os.path.dirname(os.path.abspath(fname))): + os.makedirs(os.path.dirname(os.path.abspath(fname))) + +class AverageMeter(object): + """ + Computes and stores the average and current value + """ + def __init__(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = float(self.sum) / (self.count + 1e-10) + +class RunningAverageMeter(object): + """ + Computes and stores the running average and current value + """ + def __init__(self, hist=0.99): + self.val = None + self.avg = None + self.hist = hist + + def reset(self): + self.val = None + self.avg = None + + def update(self, val): + if self.avg is None: + self.avg = val + else: + self.avg = self.avg * self.hist + val * (1 - self.hist) + self.val = val + +class RecentAverageMeter(object): + """ + Stores and computes the average of recent values + """ + def __init__(self, hist_size=100): + self.hist_size = hist_size + self.fifo = [] + self.val = 0 + + def reset(self): + self.fifo = [] + self.val = 0 + + def update(self, val): + self.val = val + self.fifo.append(val) + if len(self.fifo) > self.hist_size: + del self.fifo[0] + @property + def avg(self): + assert len(self.fifo) > 0 + return float(sum(self.fifo)) / len(self.fifo) + +class ReDirectSTD(object): + """ + overwrites the sys.stdout or sys.stderr + Args: + fpath: file path + console: one of ['stdout', 'stderr'] + immediately_visiable: False + Usage example: + ReDirectSTD('stdout.txt', 'stdout', False) + ReDirectSTD('stderr.txt', 'stderr', False) + """ + def __init__(self, fpath=None, console='stdout', immediately_visiable=False): + import sys + import os + assert console in ['stdout', 'stderr'] + self.console = sys.stdout if console == "stdout" else sys.stderr + self.file = fpath + self.f = None + self.immediately_visiable = immediately_visiable + if fpath is not None: + # Remove existing log file + if os.path.exists(fpath): + os.remove(fpath) + if console == 'stdout': + sys.stdout = self + else: + sys.stderr = self + + def __del__(self): + self.close() + + def __enter__(self): + pass + + def __exit__(self, **args): + self.close() + + def write(self, msg): + self.console.write(msg) + if self.file is not None: + if not os.path.exists(os.path.dirname(os.path.abspath(self.file))): + os.mkdir(os.path.dirname(os.path.abspath(self.file))) + if self.immediately_visiable: + with open(self.file, 'a') as f: + f.write(msg) + else: + if self.f is None: + self.f = open(self.file, 'w') + self.f.write(msg) + + def flush(self): + self.console.flush() + if self.f is not None: + self.f.flush() + import os + os.fsync(self.f.fileno()) + + def close(self): + self.console.close() + if self.f is not None: + self.f.close() + +def find_index(seq, item): + for i, x in enumerate(seq): + if item == x: + return i + return -1 + +def set_devices(sys_device_ids): + """ + Args: + sys_device_ids: a tuple; which GPUs to use + e.g. sys_device_ids = (), only use cpu + sys_device_ids = (3,), use the 4-th gpu + sys_device_ids = (0, 1, 2, 3,), use the first 4 gpus + sys_device_ids = (0, 2, 4,), use the 1, 3 and 5 gpus + """ + import os + visiable_devices = '' + for i in sys_device_ids: + visiable_devices += '{}, '.format(i) + os.environ['CUDA_VISIBLE_DEVICES'] = visiable_devices + # Return wrappers + # Models and user defined Variables/Tensors would be transferred to + # the first device + device_id = 0 if len(sys_device_ids) > 0 else -1 + +def transfer_optims(optims, device_id=-1): + for optim in optims: + if isinstance(optim, torch.optim.Optimizer): + transfer_optim_state(optim.state, device_id=device_id) + +def transfer_optim_state(state, device_id=-1): + for key, val in state.items(): + if isinstance(val, dict): + transfer_optim_state(val, device_id=device_id) + elif isinstance(val, Variable): + raise RuntimeError("Oops, state[{}] is a Variable!".format(key)) + elif isinstance(val, torch.nn.Parameter): + raise RuntimeError("Oops, state[{}] is a Parameter!".format(key)) + else: + try: + if device_id == -1: + state[key] = val.cpu() + else: + #state[key] = val.cuda(device=device_id) + state[key] = val.npu(device=device_id) + except: + pass + + +def load_state_dict(model, src_state_dict): + """ + copy parameter from src_state_dict to model + Arguments: + model: A torch.nn.Module object + src_state_dict: a dict containing parameters and persistent buffers + """ + from torch.nn import Parameter + dest_state_dict = model.state_dict() + for name, param in src_state_dict.items(): + if name not in dest_state_dict: + continue + if isinstance(param, Parameter): + param = param.data + try: + dest_state_dict[name].copy_(param) + except Exception: + print("Warning: Error occurs when copying '{}'".format(name)) + + src_missing = set(dest_state_dict.keys()) - set(src_state_dict.keys()) + if len(src_missing) > 0: + print ("Keys not found in source state_dict: ") + for n in src_missing: + print('\t', n) + + dest_missint = set(src_state_dict.keys()) - set(dest_state_dict.keys()) + if len(dest_missint): + print ("Keys not found in destination state_dict: ") + for n in dest_missint: + print('\t', n) + +def load_ckpt(modules_optims, ckpt_file, load_to_cpu=True, verbose=True): + """ + load state_dict of module & optimizer from file + Args: + modules_optims: A two-element list which contains module and optimizer + ckpt_file: the check point file + load_to_cpu: Boolean, whether to transform tensors in model & optimizer to cpu type + """ + map_location = (lambda storage, loc: storage) if load_to_cpu else None + ckpt = torch.load(ckpt_file, map_location=map_location) + for m, sd in zip(modules_optims, ckpt['state_dicts']): + m.load_state_dict(sd) + if verbose: + print("Resume from ckpt {}, \nepoch: {}, scores: {}".format( + ckpt_file, ckpt['ep'], ckpt['scores'])) + return ckpt['ep'], ckpt['scores'] + +def save_ckpt(modules_optims, ep, scores, ckpt_file): + """ + save state_dict of modules/optimizers to file + Args: + modules_optims: a two-element list which contains a module and a optimizer + ep: the current epoch number + scores: the performance of current module + ckpt_file: the check point file path + Note: + torch.save() reserves device type and id of tensors to save. + So when loading ckpt, you have to inform torch.load() to load these tensors + to cpu or your desired gpu, if you change devices. + """ + state_dicts = [m.state_dict() for m in modules_optims] + ckpt = dict(state_dicts = state_dicts, + ep = ep, + scores = scores) + if not os.path.exists(os.path.dirname(os.path.abspath(ckpt_file))): + os.mkdir(os.path.dirname(os.path.abspath(ckpt_file))) + torch.save(ckpt, ckpt_file) + +def adjust_lr_staircase(param_groups, base_lrs, ep, decay_at_epochs, factor): + """ Multiplied by a factor at the beging of specified epochs. Different + params groups specify thier own base learning rates. + Args: + param_groups: a list of params + base_lrs: starting learning rate, len(base_lrs) = len(params_groups) + ep: current epoch, ep >= 1 + decay_at_epochs: a list or tuple; learning rates are multiplied by a factor + at the begining of these epochs + factor: a number in range (0, 1) + Example: + base_lrs = [0.1, 0.01] + decay_at_epochs = [51, 101] + factor = 0.1 + Note: + It is meant to be called at the begining of an epoch + """ + assert len(base_lrs) == len(param_groups), \ + 'You should specify base lr for each param group.' + assert ep >= 1, "Current epoch number should be >= 1" + + if ep not in decay_at_epochs: + return + + ind = find_index(decay_at_epochs, ep) + for i, (g, base_lr) in enumerate(zip(param_groups, base_lrs)): + g['lr'] = base_lr * factor ** (ind + 1) + print('=====> Param group {}: lr adjusted to {:.10f}' + .format(i, g['lr']).rstrip('0')) + +def adjust_lr(optimizer, ep, finetuned_params_lr): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.1 ** (ep// 30)) + lr = finetuned_params_lr * (0.96 ** (ep // 8)) #decreasing the learning rate by 4% every 8 epoch + for param_group in optimizer.param_groups: + param_group['lr'] = lr + +def may_set_mode(maybe_modules, mode): + """ + maybe_modules, an object or a list of objects. + """ + assert mode in ['train', 'eval'] + if not is_iterable(maybe_modules): + maybe_modules = [maybe_modules] + for m in maybe_modules: + if isinstance(m, torch.nn.Module): + if mode == 'train': + m.train() + else: + m.eval() diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/demo/.gitsave b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/demo/.gitsave new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/demo/demo_image.png b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/demo/demo_image.png new file mode 100644 index 0000000..d017bda Binary files /dev/null and b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/demo/demo_image.png differ diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/pa100k/.gitsave b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/pa100k/.gitsave new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/peta/.gitsave b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/peta/.gitsave new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/rap/.gitsave b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/rap/.gitsave new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/rap2/.gitsave b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/dataset/rap2/.gitsave new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/demo.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/demo.py new file mode 100644 index 0000000..36cf184 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/demo.py @@ -0,0 +1,141 @@ +import sys +import os +import numpy as np +import random +import math + +import torch +import torchvision.transforms as transforms +from torch.autograd import Variable +from torch.nn.parallel import DataParallel +import pickle +import time +import argparse +from PIL import Image, ImageFont, ImageDraw + +from baseline.model.DeepMAR import DeepMAR_ResNet50 +from baseline.utils.utils import str2bool +from baseline.utils.utils import save_ckpt, load_ckpt +from baseline.utils.utils import load_state_dict +from baseline.utils.utils import set_devices +from baseline.utils.utils import set_seed + + +class Config(object): + def __init__(self): + + parser = argparse.ArgumentParser() + parser.add_argument('-d', '--sys_device_ids', type=eval, default=(0,)) + parser.add_argument('--set_seed', type=str2bool, default=False) + # model + parser.add_argument('--resize', type=eval, default=(224, 224)) + parser.add_argument('--last_conv_stride', type=int, default=2, choices=[1,2]) + # demo image + parser.add_argument('--demo_image', type=str, default='./dataset/demo/demo_image.png') + ## dataset parameter + parser.add_argument('--dataset', type=str, default='peta', + choices=['peta','rap', 'pa100k']) + # utils + parser.add_argument('--load_model_weight', type=str2bool, default=True) + parser.add_argument('--model_weight_file', type=str, default='./exp/deepmar_resnet50/peta/partition0/run1/model/ckpt_epoch150.pth') + args = parser.parse_args() + + # gpu ids + self.sys_device_ids = args.sys_device_ids + + # random + self.set_seed = args.set_seed + if self.set_seed: + self.rand_seed = 0 + else: + self.rand_seed = None + self.resize = args.resize + self.mean = [0.485, 0.456, 0.406] + self.std = [0.229, 0.224, 0.225] + + # utils + self.load_model_weight = args.load_model_weight + self.model_weight_file = args.model_weight_file + if self.load_model_weight: + if self.model_weight_file == '': + print ('Please input the model_weight_file if you want to load model weight') + raise ValueError + # dataset + datasets = dict() + datasets['peta'] = './dataset/peta/peta_dataset.pkl' + datasets['rap'] = './dataset/rap/rap_dataset.pkl' + datasets['pa100k'] = './dataset/pa100k/pa100k_dataset.pkl' + + if args.dataset in datasets: + dataset = pickle.load(open(datasets[args.dataset])) + else: + print ('%s does not exist.'%(args.dataset)) + raise ValueError + self.att_list = [dataset['att_name'][i] for i in dataset['selected_attribute']] + + # demo image + self.demo_image = args.demo_image + + # model + model_kwargs = dict() + model_kwargs['num_att'] = len(self.att_list) + model_kwargs['last_conv_stride'] = args.last_conv_stride + self.model_kwargs = model_kwargs + +### main function ### +cfg = Config() + +# dump the configuration to log. +import pprint +print('-' * 60) +print('cfg.__dict__') +pprint.pprint(cfg.__dict__) +print('-' * 60) + +# set the random seed +if cfg.set_seed: + set_seed( cfg.rand_seed ) +# init the gpu ids +set_devices(cfg.sys_device_ids) + +# dataset +normalize = transforms.Normalize(mean=cfg.mean, std=cfg.std) +test_transform = transforms.Compose([ + transforms.Resize(cfg.resize), + transforms.ToTensor(), + normalize,]) + +### Att model ### +model = DeepMAR_ResNet50(**cfg.model_kwargs) + +# load model weight if necessary +if cfg.load_model_weight: + map_location = (lambda storage, loc:storage) + ckpt = torch.load(cfg.model_weight_file, map_location=map_location) + model.load_state_dict(ckpt['state_dicts'][0]) + +model.cuda() +model.eval() + +# load one image +img = Image.open(cfg.demo_image) +img_trans = test_transform( img ) +img_trans = torch.unsqueeze(img_trans, dim=0) +img_var = Variable(img_trans).cuda() +score = model(img_var).data.cpu().numpy() + +# show the score in command line +for idx in range(len(cfg.att_list)): + if score[0, idx] >= 0: + print ('%s: %.2f'%(cfg.att_list[idx], score[0, idx])) + +# show the score in the image +img = img.resize(size=(256, 512), resample=Image.BILINEAR) +draw = ImageDraw.Draw(img) +positive_cnt = 0 +for idx in range(len(cfg.att_list)): + if score[0, idx] >= 0: + txt = '%s: %.2f'%(cfg.att_list[idx], score[0, idx]) + draw.text((10, 10 + 10*positive_cnt), txt, (255, 0, 0)) + positive_cnt += 1 +img.save('./dataset/demo/demo_image_result.png') diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50.py new file mode 100644 index 0000000..52af411 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50.py @@ -0,0 +1,483 @@ +import sys +import os +import numpy as np +import random +import math + +import torch +import torch.optim as optim +import torchvision.transforms as transforms +import torch.nn.functional as F +import torch.backends.cudnn as cudnn +from torch.autograd import Variable +from torch.nn.parallel import DataParallel +import pickle +import time +import argparse +import pdb +import sys +from torch.utils.tensorboard import SummaryWriter + +from baseline.dataset import add_transforms +from baseline.dataset.Dataset import AttDataset +from baseline.model.DeepMAR import DeepMAR_ResNet50 +from baseline.model.DeepMAR import DeepMAR_ResNet50_ExtractFeature +from baseline.utils.evaluate import attribute_evaluate +from baseline.utils.utils import str2bool +from baseline.utils.utils import transfer_optim_state +from baseline.utils.utils import time_str +from baseline.utils.utils import save_ckpt, load_ckpt +from baseline.utils.utils import load_state_dict +from baseline.utils.utils import ReDirectSTD +from baseline.utils.utils import adjust_lr_staircase +from baseline.utils.utils import adjust_lr +from baseline.utils.utils import set_devices +from baseline.utils.utils import AverageMeter +from baseline.utils.utils import to_scalar +from baseline.utils.utils import may_set_mode +from baseline.utils.utils import may_mkdir +from baseline.utils.utils import set_seed +from baseline.utils.utils import seed_everything + +# Apex +import numpy as np +from apex import amp +import torch.npu + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] +cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") +config_info = get_model_parameter("pytorch_config") +initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} +hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) +hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) +hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) +hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) +hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) +hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) +hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) +hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) +hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) +hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + +CALCULATE_DEVICE = "npu:7" +PRINT_DEVICE = "cpu" + +class Config(object): + def __init__(self): + + parser = argparse.ArgumentParser() + parser.add_argument('--npu', type=int, default=0, help='NPU id to use.') + parser.add_argument('--set_seed', type=str2bool, default=False) + ## dataset parameter + parser.add_argument('--dataset', type=str, default='peta', + choices=['peta','rap', 'pa100k', 'rap2']) + parser.add_argument('--save_dir', type=str, default='/home/zhusiyi/dataset/peta/') + parser.add_argument('--split', type=str, default='trainval', + choices=['trainval', 'train']) + parser.add_argument('--test_split', type=str, default='test') + parser.add_argument('--partition_idx', type=int, default=0) + parser.add_argument('--resize', type=eval, default=(224, 224)) + parser.add_argument('--mirror', type=str2bool, default=True) + parser.add_argument('--batch_size', type=int, default=32) + parser.add_argument('--workers', type=int, default=2) + # model + parser.add_argument('--num_att', type=int, default=35) + parser.add_argument('--pretrained', type=str2bool, default=True) + parser.add_argument('--last_conv_stride', type=int, default=2, choices=[1,2]) + parser.add_argument('--drop_pool5', type=str2bool, default=True) + parser.add_argument('--drop_pool5_rate', type=float, default=0.5) + + parser.add_argument('--sgd_weight_decay', type=float, default=0.0005) + parser.add_argument('--sgd_momentum', type=float, default=0.9) + parser.add_argument('--new_params_lr', type=float, default=0.001) + parser.add_argument('--finetuned_params_lr', type=float, default=0.001) + parser.add_argument('--staircase_decay_at_epochs', type=eval, + default=(51, )) + parser.add_argument('--staircase_decay_multiple_factor', type=float, + default=0.1) + parser.add_argument('--total_epochs', type=int, default=150) + parser.add_argument('--weighted_entropy', type=str2bool, default=True) + # utils + parser.add_argument('--resume', type=str2bool, default=False) + parser.add_argument('--ckpt_file', type=str, default='') + parser.add_argument('--load_model_weight', type=str2bool, default=False) + parser.add_argument('--model_weight_file', type=str, default='') + parser.add_argument('--test_only', type=str2bool, default=False) + parser.add_argument('--exp_dir', type=str, default='') + parser.add_argument('--exp_subpath', type=str, default='deepmar_resnet50') + parser.add_argument('--log_to_file', type=str2bool, default=True) + parser.add_argument('--steps_per_log', type=int, default=20) + parser.add_argument('--epochs_per_val', type=int, default=10) + parser.add_argument('--epochs_per_save', type=int, default=50) + parser.add_argument('--run', type=int, default=1) + # apex + parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') + parser.add_argument('--loss_scale', default=-1., type=float, + help='loss scale using in amp, default -1 means dynamic') + parser.add_argument('--opt_level', default='O1', type=str, + help='opt level using in amp, default O1 means FP16') + args = parser.parse_args() + + # gpu ids + self.npu = args.npu + # random + self.set_seed = args.set_seed + if self.set_seed: + self.seed = 0 + else: + self.seed = None + # amp + self.amp = args.amp + self.loss_scale = args.loss_scale + self.opt_level = args.opt_level + # run time index + self.run = args.run + # Dataset # + datasets = dict() + #datasets['peta'] = '/home/zhusiyi/dataset/peta/peta_dataset.pkl' + #datasets['peta'] = os.path.join(os.path.abspath(os.path.dirname(__file__)),'dataset/peta/peta_dataset.pkl') + datasets['peta'] = args.save_dir + '/peta_dataset.pkl' + partitions = dict() + #partitions['peta'] = '/home/zhusiyi/dataset/peta/peta_partition.pkl' + #partitions['peta'] = os.path.join(os.path.abspath(os.path.dirname(__file__)),'dataset/peta/peta_partition.pkl') + partitions['peta'] = args.save_dir + '/peta_partition.pkl' + + self.dataset_name = args.dataset + if args.dataset not in datasets or args.dataset not in partitions: + print ("Please select the right dataset name.") + raise ValueError + else: + self.dataset = datasets[args.dataset] + self.partition = partitions[args.dataset] + self.partition_idx = args.partition_idx + self.split = args.split + self.test_split = args.test_split + self.resize = args.resize + self.mirror = args.mirror + self.mean = [0.485, 0.456, 0.406] + self.std = [0.229, 0.224, 0.225] + self.batch_size = args.batch_size + self.workers = args.workers + # optimization + self.sgd_momentum = args.sgd_momentum + self.sgd_weight_decay = args.sgd_weight_decay + self.new_params_lr = args.new_params_lr + self.finetuned_params_lr = args.finetuned_params_lr + self.staircase_decay_at_epochs = args.staircase_decay_at_epochs + self.staircase_decay_multiple_factor = args.staircase_decay_multiple_factor + self.total_epochs = args.total_epochs + self.weighted_entropy = args.weighted_entropy + + # utils + self.resume = args.resume + self.ckpt_file = args.ckpt_file + if self.resume: + if self.ckpt_file == '': + print ('Please input the ckpt_file if you want to resume training') + raise ValueError + self.load_model_weight = args.load_model_weight + self.model_weight_file = args.model_weight_file + if self.load_model_weight: + if self.model_weight_file == '': + print ('Please input the model_weight_file if you want to load model weight') + raise ValueError + self.test_only = args.test_only + self.exp_dir = args.exp_dir + self.exp_subpath = args.exp_subpath + self.log_to_file = args.log_to_file + self.steps_per_log = args.steps_per_log + self.epochs_per_val = args.epochs_per_val + self.epochs_per_save = args.epochs_per_save + self.run = args.run + + # for model + model_kwargs = dict() + model_kwargs['num_att'] = args.num_att + model_kwargs['last_conv_stride'] = args.last_conv_stride + model_kwargs['drop_pool5'] = args.drop_pool5 + model_kwargs['drop_pool5_rate'] = args.drop_pool5_rate + self.model_kwargs = model_kwargs + # for evaluation + self.test_kwargs = dict() + + if self.exp_dir == '': + self.exp_dir = os.path.join('exp', + '{}'.format(self.exp_subpath), + '{}'.format(self.dataset_name), + 'partition{}'.format(self.partition_idx), + 'run{}'.format(self.run)) + self.stdout_file = os.path.join(self.exp_dir, \ + 'log', 'stdout_{}.txt'.format(time_str())) + self.stderr_file = os.path.join(self.exp_dir, \ + 'log', 'stderr_{}.txt'.format(time_str())) + may_mkdir(self.stdout_file) + +### main function ### +cfg = Config() + +# log +if cfg.log_to_file: + ReDirectSTD(cfg.stdout_file, 'stdout', False) + ReDirectSTD(cfg.stderr_file, 'stderr', False) + +# dump the configuration to log. +import pprint +print('-' * 60) +print('cfg.__dict__') +pprint.pprint(cfg.__dict__) +print('-' * 60) + +# set the random seed +print(cfg.seed) +if cfg.set_seed: + set_seed(cfg.seed) + seed_everything(cfg.seed) + +# init the npu ids +CALCULATE_DEVICE = "npu:{}".format(cfg.npu) +torch.npu.set_device(CALCULATE_DEVICE) + +# dataset +normalize = transforms.Normalize(mean=cfg.mean, std=cfg.std) +transform = transforms.Compose([ + transforms.Resize(cfg.resize), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), # 3*H*W, [0, 1] + normalize,]) # normalize with mean/std +# by a subset of attributes +train_set = AttDataset( + dataset = cfg.dataset, + partition = cfg.partition, + split = cfg.split, + partition_idx= cfg.partition_idx, + transform = transform) + +num_att = len(train_set.dataset['selected_attribute']) +cfg.model_kwargs['num_att'] = num_att + +train_loader = torch.utils.data.DataLoader( + dataset = train_set, + batch_size = cfg.batch_size, + shuffle = True, + num_workers = cfg.workers, + pin_memory = True, + drop_last = True) + +test_transform = transforms.Compose([ + transforms.Resize(cfg.resize), + transforms.ToTensor(), + normalize,]) + +test_set = AttDataset( + dataset = cfg.dataset, + partition = cfg.partition, + split = cfg.test_split, + partition_idx = cfg.partition_idx, + transform = test_transform) + +### Att model ### +model = DeepMAR_ResNet50(**cfg.model_kwargs) + +# Optimizer +finetuned_params = [] +new_params = [] +for n, p in model.named_parameters(): + if n.find('classifier') >=0: + new_params.append(p) + else: + finetuned_params.append(p) +param_groups = [{'params': finetuned_params, 'lr': cfg.finetuned_params_lr}, + {'params': new_params, 'lr': cfg.new_params_lr}] + +optimizer = optim.SGD( + param_groups, + momentum = cfg.sgd_momentum, + weight_decay = cfg.sgd_weight_decay) + +model = model.to(CALCULATE_DEVICE) +# apex +if cfg.amp: + # Initialization + model, optimizer = amp.initialize(model, optimizer, opt_level=cfg.opt_level, loss_scale=cfg.loss_scale) + print("=> Using amp mode.") + + +# using the weighted cross entropy loss +if cfg.weighted_entropy: + rate = np.array(train_set.partition['weight_' + cfg.split][cfg.partition_idx]) + rate = rate[train_set.dataset['selected_attribute']].tolist() +else: + rate = None +# compute the weight of positive and negative +if rate is None: + weight_pos = [1 for i in range(num_att)] + weight_neg = [1 for i in range(num_att)] +else: + if len(rate) != num_att: + print ("the length of rate should be equal to %d" % (num_att)) + raise ValueError + weight_pos = [] + weight_neg = [] + for idx, v in enumerate(rate): + weight_pos.append(math.exp(1.0 - v)) + weight_neg.append(math.exp(v)) + +# bind the model and optimizer +modules_optims = [model, optimizer] + +# load model weight if necessary +if cfg.load_model_weight: + map_location = (lambda storage, loc:storage) + ckpt = torch.load(cfg.model_weight_file, map_location=map_location) + model.load_state_dict(ckpt['state_dicts'][0], strict=False) + # print(ckpt['state_dicts'][0]) + +### Resume or not ### +if cfg.resume: + # store the model, optimizer, epoch + start_epoch, scores = load_ckpt(modules_optims, cfg.ckpt_file) +else: + start_epoch = 0 + +model = torch.nn.DataParallel(model) +# model_w.cuda() +transfer_optim_state(state=optimizer.state, device_id=cfg.npu) + +# cudnn.benchmark = True +# for evaluation +feat_func_att = DeepMAR_ResNet50_ExtractFeature(model=model) + +def attribute_evaluate_subfunc(feat_func, test_set, device_id, **test_kwargs): + """ evaluate the attribute recognition precision """ + result = attribute_evaluate(feat_func, test_set, device_id, **test_kwargs) + print ('-' * 60) + print ('Evaluation on %s set:' % (cfg.test_split)) + print ('Label-based evaluation: \n mA: %.4f'%(np.mean(result['label_acc']))) + print ('Instance-based evaluation: \n Acc: %.4f, Prec: %.4f, Rec: %.4f, F1: %.4f' \ + %(result['instance_acc'], result['instance_precision'], result['instance_recall'], result['instance_F1'])) + print ('-' * 60) + hwlog.remark_print(key=hwlog.ACC, value="{:.4f}".format(result['instance_acc'])) + hwlog.remark_print(key=hwlog.PREC, value="{:.4f}".format(result['instance_precision'])) + hwlog.remark_print(key=hwlog.REC, value="{:.4f}".format(result['instance_recall'])) + hwlog.remark_print(key=hwlog.F1, value="{:.4f}".format(result['instance_recall'])) + return result['instance_acc'] + + +# print the model into log +# test only +if cfg.test_only: + print ('test with feat_func_att') + attribute_evaluate_subfunc(feat_func_att, test_set, **cfg.test_kwargs) + sys.exit(0) + + +# writer = SummaryWriter(os.path.join('runs/deepmar', str(cfg.npu))) + +# training +for epoch in range(start_epoch, cfg.total_epochs): + if cfg.seed is not None: + cfg.seed += 1 + seed_everything(cfg.seed) + # adjust the learning rate + adjust_lr_staircase( + optimizer.param_groups, + [cfg.finetuned_params_lr, cfg.new_params_lr], + epoch + 1, + cfg.staircase_decay_at_epochs, + cfg.staircase_decay_multiple_factor) + # adjust_lr(optimizer,epoch+1,cfg.finetuned_params_lr)n + + may_set_mode(modules_optims, 'train') + # recording loss + loss_meter = AverageMeter() + dataset_L = len(train_loader) # crop batch data + ep_st = time.time() + ep_st_mark=ep_st + # runing every batch data + for step, (imgs, targets) in enumerate(train_loader): + + step_st = time.time() + # measure data loading time + data_time = step_st-ep_st + + imgs_var = Variable(imgs) + targets_var = Variable(targets) + + # compute the weight + weights = torch.zeros(targets_var.shape) + for i in range(targets_var.shape[0]): + for j in range(targets_var.shape[1]): + if targets_var.data.cpu()[i, j] == -1: + weights[i, j] = weight_neg[j] + elif targets_var.data.cpu()[i, j] == 1: + weights[i, j] = weight_pos[j] + else: + weights[i, j] = 0 + + targets_var[targets_var == -1] = 0 + targets_var = targets_var.to(CALCULATE_DEVICE) + imgs_var = imgs_var.to(CALCULATE_DEVICE) + weights = weights.to(CALCULATE_DEVICE) + score = model(imgs_var) + + criterion = torch.nn.BCEWithLogitsLoss(weight=Variable(weights)).to(CALCULATE_DEVICE) + loss = criterion(score, targets_var) * num_att + optimizer.zero_grad() + if cfg.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + optimizer.step() + + + ############ + # step log # + ############ + loss_meter.update(to_scalar(loss)) + # one batch time using backward calculation + batch_time = time.time() - ep_st # include data load time + ep_st = time.time() + fps = cfg.batch_size / batch_time + # do not include data load time + + if (step + 1) % cfg.steps_per_log == 0 or (step + 1) % len(train_loader) == 0: + log = '{}, Step {}/{} in Ep {}, {:.2f}s, datatime:{:.6f}, batchtime:{:.6f}, FPS:{:.2f}, loss:{:.4f}'.format( \ + time_str(), step + 1, dataset_L, epoch + 1, time.time() - step_st, data_time, batch_time, fps, loss_meter.val) + + print(log) + + hwlog.remark_print(key=hwlog.FPS, value='{:.2f}'.format(fps)) + + ############## + # epoch log # + ############## + epoch_time = time.time() - ep_st_mark + log = 'Ep{}, {:.2f}s, loss {:.4f}'.format( + epoch+1, epoch_time, loss_meter.avg) + print(log) + + # writer.add_scalar('Train/Time', epoch_time, epoch+1) + # writer.add_scalar('Train/Loss', loss_meter.avg, epoch+1) + # writer.add_scalar('Train/LR', optimizer.param_groups[0]['lr'], epoch+1) + + + # model ckpt + if (epoch + 1) % cfg.epochs_per_save == 0 or epoch+1 == cfg.total_epochs: + ckpt_file = os.path.join(cfg.exp_dir, 'model', 'ckpt_epoch%d.pth'%(epoch+1)) + save_ckpt(modules_optims, epoch+1, 0, ckpt_file) + + ########################## + # test on validation set # + ########################## + if (epoch + 1) % cfg.epochs_per_val == 0 or epoch+1 == cfg.total_epochs: + print ('att test with feat_func_att') + res = attribute_evaluate_subfunc(feat_func_att, test_set, CALCULATE_DEVICE, **cfg.test_kwargs) + + # writer.add_scalar('Val/Acc', res, epoch) \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50_8p.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50_8p.py new file mode 100644 index 0000000..e8d461f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/train_deepmar_resnet50_8p.py @@ -0,0 +1,587 @@ +import os +import random +import math + +import torch +import torch.optim as optim +import torchvision.transforms as transforms +import torch.nn.functional as F +import torch.backends.cudnn as cudnn +from torch.autograd import Variable +from torch.nn.parallel import DataParallel +import pickle +import time +import argparse +import pdb +import sys +from torch.utils.tensorboard import SummaryWriter + +from baseline.dataset import add_transforms +from baseline.dataset.Dataset import AttDataset +from baseline.model.DeepMAR import DeepMAR_ResNet50 +from baseline.model.DeepMAR import DeepMAR_ResNet50_ExtractFeature +from baseline.utils.evaluate import attribute_evaluate +from baseline.utils.utils import str2bool +from baseline.utils.utils import transfer_optim_state +from baseline.utils.utils import time_str +from baseline.utils.utils import save_ckpt, load_ckpt +from baseline.utils.utils import load_state_dict +from baseline.utils.utils import ReDirectSTD +from baseline.utils.utils import adjust_lr_staircase +from baseline.utils.utils import adjust_lr +from baseline.utils.utils import set_devices +from baseline.utils.utils import AverageMeter +from baseline.utils.utils import to_scalar +from baseline.utils.utils import may_set_mode +from baseline.utils.utils import may_mkdir +from baseline.utils.utils import set_seed +from baseline.utils.utils import seed_everything +import torch.distributed as dist +import torch.multiprocessing as mp +import torch.utils.data.distributed + +# Apex +import numpy as np +from apex import amp +import torch.npu + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +class Config(object): + def __init__(self): + + parser = argparse.ArgumentParser() + parser.add_argument('--sys_device_ids', type=eval, default=6) + parser.add_argument('--npu', default=None, type=int, help='NPU id to use.') + parser.add_argument('--set_seed', type=str2bool, default=False) + ## dataset parameter + parser.add_argument('--dataset', type=str, default='peta', + choices=['peta','rap', 'pa100k', 'rap2']) + parser.add_argument('--save_dir', type=str, default='/home/zhusiyi/dataset/peta/') + parser.add_argument('--split', type=str, default='trainval', + choices=['trainval', 'train']) + parser.add_argument('--test_split', type=str, default='test') + parser.add_argument('--partition_idx', type=int, default=0) + parser.add_argument('--resize', type=eval, default=(224, 224)) + parser.add_argument('--mirror', type=str2bool, default=True) + parser.add_argument('--batch_size', type=int, default=32) + parser.add_argument('--workers', type=int, default=2) + # model + parser.add_argument('--num_att', type=int, default=35) + parser.add_argument('--pretrained', type=str2bool, default=True) + parser.add_argument('--last_conv_stride', type=int, default=2, choices=[1,2]) + parser.add_argument('--drop_pool5', type=str2bool, default=True) + parser.add_argument('--drop_pool5_rate', type=float, default=0.5) + + parser.add_argument('--sgd_weight_decay', type=float, default=0.0005) + parser.add_argument('--sgd_momentum', type=float, default=0.9) + parser.add_argument('--new_params_lr', type=float, default=0.001) + parser.add_argument('--finetuned_params_lr', type=float, default=0.001) + parser.add_argument('--staircase_decay_at_epochs', type=eval, + default=(51, )) + parser.add_argument('--staircase_decay_multiple_factor', type=float, + default=0.1) + parser.add_argument('--total_epochs', type=int, default=150) + parser.add_argument('--weighted_entropy', type=str2bool, default=True) + # utils + parser.add_argument('--resume', type=str2bool, default=False) + parser.add_argument('--ckpt_file', type=str, default='') + parser.add_argument('--load_model_weight', type=str2bool, default=False) + parser.add_argument('--model_weight_file', type=str, default='') + parser.add_argument('--test_only', type=str2bool, default=False) + parser.add_argument('--exp_dir', type=str, default='') + parser.add_argument('--exp_subpath', type=str, default='deepmar_resnet50') + parser.add_argument('--log_to_file', type=str2bool, default=True) + parser.add_argument('--steps_per_log', type=int, default=20) + parser.add_argument('--epochs_per_val', type=int, default=10) + parser.add_argument('--epochs_per_save', type=int, default=50) + parser.add_argument('--run', type=int, default=1) + # apex + parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') + parser.add_argument('--loss_scale', default=-1., type=float, + help='loss scale using in amp, default -1 means dynamic') + parser.add_argument('--opt_level', default='O1', type=str, + help='opt level using in amp, default O1 means FP16') + # distributed + parser.add_argument('--addr', default='90.90.176.152', type=str, + help='master addr') + parser.add_argument('--world_size', default=-1, type=int, + help='number of nodes for distributed training') + parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') + parser.add_argument('--dist_url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') + parser.add_argument('--dist_backend', default='nccl', type=str, + help='distributed backend') + parser.add_argument('--multiprocessing_distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N NPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') + parser.add_argument('--npus_per_node', default=None, type=int, + help='number of npus to use for distributed train on each node') + + args = parser.parse_args() + + # gpu ids + # self.sys_device_ids = args.sys_device_ids + self.npus_per_node=args.npus_per_node + self.npu = args.npu + # random + self.set_seed = args.set_seed + if self.set_seed: + self.seed = 0 + else: + self.seed = None + # amp + self.amp = args.amp + self.loss_scale = args.loss_scale + self.opt_level = args.opt_level + # run time index + self.run = args.run + # Dataset # + datasets = dict() + datasets['peta'] = args.save_dir + '/peta_dataset.pkl' + partitions = dict() + partitions['peta'] = args.save_dir + '/peta_partition.pkl' + + self.dataset_name = args.dataset + if args.dataset not in datasets or args.dataset not in partitions: + print ("Please select the right dataset name.") + raise ValueError + else: + self.dataset = datasets[args.dataset] + self.partition = partitions[args.dataset] + self.partition_idx = args.partition_idx + self.split = args.split + self.test_split = args.test_split + self.resize = args.resize + self.mirror = args.mirror + self.mean = [0.485, 0.456, 0.406] + self.std = [0.229, 0.224, 0.225] + self.batch_size = args.batch_size + self.workers = args.workers + # optimization + self.sgd_momentum = args.sgd_momentum + self.sgd_weight_decay = args.sgd_weight_decay + self.new_params_lr = args.new_params_lr + self.finetuned_params_lr = args.finetuned_params_lr + self.staircase_decay_at_epochs = args.staircase_decay_at_epochs + self.staircase_decay_multiple_factor = args.staircase_decay_multiple_factor + self.total_epochs = args.total_epochs + self.weighted_entropy = args.weighted_entropy + # distributed + self.addr = args.addr + self.world_size = args.world_size + self.rank = args.rank + self.dist_url = args.dist_url + self.dist_backend = args.dist_backend + self.multiprocessing_distributed = args.multiprocessing_distributed + # utils + self.resume = args.resume + self.ckpt_file = args.ckpt_file + if self.resume: + if self.ckpt_file == '': + print ('Please input the ckpt_file if you want to resume training') + raise ValueError + self.load_model_weight = args.load_model_weight + self.model_weight_file = args.model_weight_file + if self.load_model_weight: + if self.model_weight_file == '': + print ('Please input the model_weight_file if you want to load model weight') + raise ValueError + self.test_only = args.test_only + self.exp_dir = args.exp_dir + self.exp_subpath = args.exp_subpath + self.log_to_file = args.log_to_file + self.steps_per_log = args.steps_per_log + self.epochs_per_val = args.epochs_per_val + self.epochs_per_save = args.epochs_per_save + self.run = args.run + + # for model + model_kwargs = dict() + model_kwargs['num_att'] = args.num_att + model_kwargs['last_conv_stride'] = args.last_conv_stride + model_kwargs['drop_pool5'] = args.drop_pool5 + model_kwargs['drop_pool5_rate'] = args.drop_pool5_rate + self.model_kwargs = model_kwargs + # for evaluation + self.test_kwargs = dict() + + if self.exp_dir == '': + self.exp_dir = os.path.join('exp', + '{}'.format(self.exp_subpath), + '{}'.format(self.dataset_name), + 'partition{}'.format(self.partition_idx), + 'run{}'.format(self.run)) + self.stdout_file = os.path.join(self.exp_dir, \ + 'log', 'stdout_{}.txt'.format(time_str())) + self.stderr_file = os.path.join(self.exp_dir, \ + 'log', 'stderr_{}.txt'.format(time_str())) + may_mkdir(self.stdout_file) + +def main(): + ### main function ### + # pdb.set_trace() + cfg = Config() + + # log + if cfg.log_to_file: + ReDirectSTD(cfg.stdout_file, 'stdout', False) + ReDirectSTD(cfg.stderr_file, 'stderr', False) + + # dump the configuration to log. + import pprint + print('-' * 60) + print('cfg.__dict__') + pprint.pprint(cfg.__dict__) + print('-' * 60) + + os.environ['KERNEL_NAME_ID'] = str(0) + print("+++++++++++++++++++++++++++KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + # set the random seed + print(cfg.seed) + if cfg.set_seed: + set_seed(cfg.seed) + seed_everything(cfg.seed) + + os.environ['MASTER_ADDR'] = cfg.addr + os.environ['MASTER_PORT'] = '29501' + if cfg.dist_url == "env://" and cfg.world_size == -1: + cfg.world_size = int(os.environ["WORLD_SIZE"]) + + npus_per_node=cfg.npus_per_node + #npus_per_node = torch.npu.device_count() + if cfg.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size needs to be adjusted accordingly + cfg.world_size = npus_per_node * cfg.world_size # world_size means nums of all devices or nums of processes + mp.spawn(main_worker, nprocs=npus_per_node, args=(npus_per_node, cfg)) + +def main_worker(npu, npus_per_node, cfg): + cfg.npu = npu + print("[npu id:", npu, "]", "+++++++++++++++++++++++++++ before set KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(npu) + + print("[npu id:", npu, "]", "+++++++++++++++++++++++++++KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if npu is not None: + print("[npu id:", npu, "]", "Use NPU: {} for training".format(npu)) + + if cfg.dist_url == "env://" and cfg.rank == -1: + cfg.rank = int(os.environ["RANK"]) + if cfg.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + #cfg.rank = cfg.rank * npus_per_node + npu + cfg.rank = npu + print("rank:",cfg.rank) + dist.init_process_group(backend=cfg.dist_backend, #init_method=cfg.dist_url, + world_size=cfg.world_size, rank=cfg.rank) + + CALCULATE_DEVICE = 'npu:{}'.format(npu) + print(CALCULATE_DEVICE) + torch.npu.set_device(CALCULATE_DEVICE) + + # DistributedDataParallel, we need to divide the batch size + # ourselves based on the total number of NPUs we have + cfg.batch_size = int(cfg.batch_size / npus_per_node) + cfg.workers = int((cfg.workers + npus_per_node - 1) / npus_per_node) + print("batchsize:", cfg.batch_size) + print("workers", cfg.workers) + + # dataset + normalize = transforms.Normalize(mean=cfg.mean, std=cfg.std) + transform = transforms.Compose([ + transforms.Resize(cfg.resize), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), # 3*H*W, [0, 1] + normalize,]) # normalize with mean/std + # by a subset of attributes + train_set = AttDataset( + dataset = cfg.dataset, + partition = cfg.partition, + split = cfg.split, + partition_idx= cfg.partition_idx, + transform = transform) + + num_att = len(train_set.dataset['selected_attribute']) + cfg.model_kwargs['num_att'] = num_att + + distributed = cfg.world_size > 1 or cfg.multiprocessing_distributed + if distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_set) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + dataset = train_set, + batch_size = cfg.batch_size, + shuffle=(train_sampler is None), + num_workers = cfg.workers, + pin_memory = True, + sampler=train_sampler, + drop_last = True) + + test_transform = transforms.Compose([ + transforms.Resize(cfg.resize), + transforms.ToTensor(), + normalize,]) + + test_set = AttDataset( + dataset = cfg.dataset, + partition = cfg.partition, + split = cfg.test_split, + partition_idx = cfg.partition_idx, + transform = test_transform) + + ### Att model ### + model = DeepMAR_ResNet50(**cfg.model_kwargs) + + # Optimizer + finetuned_params = [] + new_params = [] + for n, p in model.named_parameters(): + if n.find('classifier') >=0: + new_params.append(p) + else: + finetuned_params.append(p) + param_groups = [{'params': finetuned_params, 'lr': cfg.finetuned_params_lr}, + {'params': new_params, 'lr': cfg.new_params_lr}] + + optimizer = optim.SGD( + param_groups, + momentum = cfg.sgd_momentum, + weight_decay = cfg.sgd_weight_decay) + + # model = model.cuda() + model = model.to(CALCULATE_DEVICE) + # apex + if cfg.amp: + # Initialization + model, optimizer = amp.initialize(model, optimizer, opt_level=cfg.opt_level, loss_scale=cfg.loss_scale) + print("=> Using amp mode.") + + # Wrap the model after set_devices, data parallel + # model_w = torch.nn.DataParallel(model) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[cfg.npu], broadcast_buffers=False) + + # using the weighted cross entropy loss + if cfg.weighted_entropy: + rate = np.array(train_set.partition['weight_' + cfg.split][cfg.partition_idx]) + rate = rate[train_set.dataset['selected_attribute']].tolist() + else: + rate = None + # compute the weight of positive and negative + if rate is None: + weight_pos = [1 for i in range(num_att)] + weight_neg = [1 for i in range(num_att)] + else: + if len(rate) != num_att: + print ("the length of rate should be equal to %d" % (num_att)) + raise ValueError + weight_pos = [] + weight_neg = [] + for idx, v in enumerate(rate): + weight_pos.append(math.exp(1.0 - v)) + weight_neg.append(math.exp(v)) + + # bind the model and optimizer + modules_optims = [model, optimizer] + + # load model weight if necessary + if cfg.load_model_weight: + map_location = (lambda storage, loc:storage) + ckpt = torch.load(cfg.model_weight_file, map_location=map_location) + model.load_state_dict(ckpt['state_dicts'][0], strict=False) + + ### Resume or not ### + if cfg.resume: + # store the model, optimizer, epoch + start_epoch, scores = load_ckpt(modules_optims, cfg.ckpt_file) + else: + start_epoch = 0 + + #model = torch.nn.DataParallel(model) + #transfer_optim_state(state=optimizer.state, device_id=npu) + + # cudnn.benchmark = True + # for evaluation + feat_func_att = DeepMAR_ResNet50_ExtractFeature(model=model) + + # print the model into log + # print (model) + # test only + if cfg.test_only: + print ('test with feat_func_att') + attribute_evaluate_subfunc(feat_func_att, test_set, **cfg.test_kwargs) + sys.exit(0) + + + # writer = SummaryWriter('runs/deepmar/6') + + # training + for epoch in range(start_epoch, cfg.total_epochs): + if cfg.seed is not None: + cfg.seed += 1 + seed_everything(cfg.seed) + + if distributed: + train_sampler.set_epoch(epoch) + # adjust the learning rate + adjust_lr_staircase( + optimizer.param_groups, + [cfg.finetuned_params_lr, cfg.new_params_lr], + epoch + 1, + cfg.staircase_decay_at_epochs, + cfg.staircase_decay_multiple_factor) + # adjust_lr(optimizer,epoch+1,cfg.finetuned_params_lr)n + + may_set_mode(modules_optims, 'train') + # recording loss + loss_meter = AverageMeter() + dataset_L = len(train_loader) # crop batch data + ep_st = time.time() + ep_st_mark=ep_st + # runing every batch data + for step, (imgs, targets) in enumerate(train_loader): + + step_st = time.time() + # measure data loading time + data_time = step_st-ep_st + + imgs_var = Variable(imgs) + targets_var = Variable(targets) + # if 'npu' in CALCULATE_DEVICE: + # targets = targets.to(torch.int32) + # imgs, targets = imgs.to(CALCULATE_DEVICE, non_blocking=True), targets.to(CALCULATE_DEVICE, non_blocking=True) + # compute the weight + weights = torch.zeros(targets_var.shape) + for i in range(targets_var.shape[0]): + for j in range(targets_var.shape[1]): + if targets_var.data.cpu()[i, j] == -1: + weights[i, j] = weight_neg[j] + elif targets_var.data.cpu()[i, j] == 1: + weights[i, j] = weight_pos[j] + else: + weights[i, j] = 0 + + # loss for the attribute classification, average over the batch size + targets_var[targets_var == -1] = 0 + targets_var = targets_var.to(CALCULATE_DEVICE) + imgs_var = imgs_var.to(CALCULATE_DEVICE) + weights = weights.to(CALCULATE_DEVICE) + score = model(imgs_var) + + criterion = torch.nn.BCEWithLogitsLoss(weight=Variable(weights)).to(CALCULATE_DEVICE) + loss = criterion(score, targets_var) * num_att + optimizer.zero_grad() + if cfg.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + # for name, parms in model.named_parameters(): + # print('-->name:', name, ' -->grad_value_max:', torch.max(parms.grad), ' -->grad_value_min:', + # torch.min(parms.grad)) + optimizer.step() + + + ############ + # step log # + ############ + loss_meter.update(to_scalar(loss)) + # one batch time using backward calculation + batch_time = time.time() - ep_st # include data load time + ep_st = time.time() + fps = npus_per_node*cfg.batch_size / batch_time + # do not include data load time + + if (step + 1) % cfg.steps_per_log == 0 or (step + 1) % len(train_loader) == 0: + log = '{}, Step {}/{} in Ep {}, {:.2f}s, datatime:{:.6f}, batchtime:{:.6f}, FPS:{:.2f}, loss:{:.4f}'.format( \ + time_str(), step + 1, dataset_L, epoch + 1, time.time() - step_st, data_time, batch_time, fps, loss_meter.val) + print(log) + + hwlog.remark_print(key=hwlog.FPS, value='{:.2f}'.format(fps)) + + + ############## + # epoch log # + ############## + epoch_time = time.time() - ep_st_mark + log = 'Ep{}, {:.2f}s, loss {:.4f}'.format( + epoch+1, epoch_time, loss_meter.avg) + print(log) + + # writer.add_scalar('Train/Time', epoch_time, epoch+1) + # writer.add_scalar('Train/Loss', loss_meter.avg, epoch+1) + # # writer.add_scalar('Train/Acc', res['instance_acc'], epoch+1) + # writer.add_scalar('Train/LR', optimizer.param_groups[0]['lr'], epoch+1) + + + # model ckpt + if (epoch + 1) % cfg.epochs_per_save == 0 or epoch+1 == cfg.total_epochs: + ckpt_file = os.path.join(cfg.exp_dir, 'model', 'ckpt_epoch%d.pth'%(epoch+1)) + save_ckpt(modules_optims, epoch+1, 0, ckpt_file) + + ########################## + # test on validation set # + ########################## + if (epoch + 1) % cfg.epochs_per_val == 0 or epoch+1 == cfg.total_epochs: + print ('att test with feat_func_att') + res = attribute_evaluate_subfunc(feat_func_att, test_set, CALCULATE_DEVICE, cfg, **cfg.test_kwargs) + + # writer.add_scalar('Val/Acc', res, epoch) + # writer.close() + +def attribute_evaluate_subfunc(feat_func, test_set, device_id, cfg, **test_kwargs): + """ evaluate the attribute recognition precision """ + result = attribute_evaluate(feat_func, test_set, device_id, **test_kwargs) + print ('-' * 60) + print ('Evaluation on %s set:' % (cfg.test_split)) + print ('Label-based evaluation: \n mA: %.4f'%(np.mean(result['label_acc']))) + print ('Instance-based evaluation: \n Acc: %.4f, Prec: %.4f, Rec: %.4f, F1: %.4f' \ + %(result['instance_acc'], result['instance_precision'], result['instance_recall'], result['instance_F1'])) + print ('-' * 60) + hwlog.remark_print(key=hwlog.ACC, value="{:.4f}".format(result['instance_acc'])) + hwlog.remark_print(key=hwlog.PREC, value="{:.4f}".format(result['instance_precision'])) + hwlog.remark_print(key=hwlog.REC, value="{:.4f}".format(result['instance_recall'])) + hwlog.remark_print(key=hwlog.F1, value="{:.4f}".format(result['instance_recall'])) + return result['instance_acc'] + +# intermediate variable +inter_feature = {} +inter_gradient = {} +def make_hook(name, flag): + if flag == 'forward': + def hook(m, input, output): + inter_feature[name] = input + return hook + elif flag == 'backward': + def hook(m, input, output): + inter_gradient[name] = output + return hook + else: + assert False + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_pa100k.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_pa100k.py new file mode 100644 index 0000000..e6411ee --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_pa100k.py @@ -0,0 +1,96 @@ +import os +import numpy as np +import random +import cPickle as pickle +from scipy.io import loadmat + +np.random.seed(0) +random.seed(0) + +def make_dir(path): + if os.path.exists(path): + pass + else: + os.mkdir(path) + +def generate_data_description(save_dir): + """ + create a dataset description file, which consists of images, labels + """ + dataset = dict() + dataset['description'] = 'pa100k' + dataset['root'] = './dataset/pa100k/data/' + dataset['image'] = [] + dataset['att'] = [] + dataset['att_name'] = [] + dataset['selected_attribute'] = range(26) + # load ANNOTATION.MAT + data = loadmat(open('./dataset/pa100k/annotation.mat', 'r')) + for idx in range(26): + dataset['att_name'].append(data['attributes'][idx][0][0]) + + for idx in range(80000): + dataset['image'].append(data['train_images_name'][idx][0][0]) + dataset['att'].append(data['train_label'][idx, :].tolist()) + + for idx in range(10000): + dataset['image'].append(data['val_images_name'][idx][0][0]) + dataset['att'].append(data['val_label'][idx, :].tolist()) + + for idx in range(10000): + dataset['image'].append(data['test_images_name'][idx][0][0]) + dataset['att'].append(data['test_label'][idx, :].tolist()) + + with open(os.path.join(save_dir, 'pa100k_dataset.pkl'), 'w+') as f: + pickle.dump(dataset, f) + +def create_trainvaltest_split(traintest_split_file): + """ + create a dataset split file, which consists of index of the train/val/test splits + """ + partition = dict() + partition['trainval'] = [] + partition['train'] = [] + partition['val'] = [] + partition['test'] = [] + partition['weight_trainval'] = [] + partition['weight_train'] = [] + # load ANNOTATION.MAT + data = loadmat(open('./dataset/pa100k/annotation.mat', 'r')) + train = range(80000) + val = [i+80000 for i in range(10000)] + test = [i+90000 for i in range(10000)] + trainval = train + val + partition['train'].append(train) + partition['val'].append(val) + partition['trainval'].append(trainval) + partition['test'].append(test) + # weight + train_label = data['train_label'].astype('float32') + trainval_label = np.concatenate((data['train_label'], data['val_label']), axis=0).astype('float32') + weight_train = np.mean(train_label==1, axis=0).tolist() + weight_trainval = np.mean(trainval_label==1, axis=0).tolist() + + partition['weight_trainval'].append(weight_trainval) + partition['weight_train'].append(weight_train) + + with open(traintest_split_file, 'w+') as f: + pickle.dump(partition, f) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="pa100k dataset") + parser.add_argument( + '--save_dir', + type=str, + default='./dataset/pa100k/') + parser.add_argument( + '--traintest_split_file', + type=str, + default="./dataset/pa100k/pa100k_partition.pkl") + args = parser.parse_args() + save_dir = args.save_dir + traintest_split_file = args.traintest_split_file + + generate_data_description(save_dir) + create_trainvaltest_split(traintest_split_file) diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_peta.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_peta.py new file mode 100644 index 0000000..16150d7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_peta.py @@ -0,0 +1,84 @@ +import os +import numpy as np +import random +import pickle +from scipy.io import loadmat + +np.random.seed(0) +random.seed(0) + +def make_dir(path): + if os.path.exists(path): + pass + else: + os.mkdir(path) + +def generate_data_description(save_dir): + """ + create a dataset description file, which consists of images, labels + """ + dataset = dict() + dataset['description'] = 'peta' + dataset['root'] = save_dir + '/images/' + dataset['image'] = [] + dataset['att'] = [] + dataset['att_name'] = [] + dataset['selected_attribute'] = range(35) + # load PETA.MAT + data = loadmat(save_dir + '/PETA.mat') + for idx in range(105): + dataset['att_name'].append(data['peta'][0][0][1][idx,0][0]) + + for idx in range(19000): + dataset['image'].append('%05d.png'%(idx+1)) + dataset['att'].append(data['peta'][0][0][0][idx, 4:].tolist()) + with open(os.path.join(save_dir, 'peta_dataset.pkl'), 'wb') as f: + pickle.dump(dataset, f) + +def create_trainvaltest_split(traintest_split_file): + """ + create a dataset split file, which consists of index of the train/val/test splits + """ + partition = dict() + partition['trainval'] = [] + partition['train'] = [] + partition['val'] = [] + partition['test'] = [] + partition['weight_trainval'] = [] + partition['weight_train'] = [] + # load PETA.MAT + data = loadmat(save_dir + '/PETA.mat') + for idx in range(5): + train = (data['peta'][0][0][3][idx][0][0][0][0][:,0]-1).tolist() + val = (data['peta'][0][0][3][idx][0][0][0][1][:,0]-1).tolist() + test = (data['peta'][0][0][3][idx][0][0][0][2][:,0]-1).tolist() + trainval = train + val + partition['train'].append(train) + partition['val'].append(val) + partition['trainval'].append(trainval) + partition['test'].append(test) + # weight + weight_trainval = np.mean(data['peta'][0][0][0][trainval, 4:].astype('float32')==1, axis=0).tolist() + weight_train = np.mean(data['peta'][0][0][0][train, 4:].astype('float32')==1, axis=0).tolist() + partition['weight_trainval'].append(weight_trainval) + partition['weight_train'].append(weight_train) + with open(traintest_split_file, 'wb') as f: + pickle.dump(partition, f) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="peta dataset") + parser.add_argument( + '--save_dir', + type=str, + default='/home/zhusiyi/dataset/peta/') + parser.add_argument( + '--traintest_split_file', + type=str, + default="/home/zhusiyi/dataset/peta/peta_partition.pkl") + args = parser.parse_args() + save_dir = args.save_dir + traintest_split_file = args.traintest_split_file + + generate_data_description(save_dir) + create_trainvaltest_split(traintest_split_file) diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap.py new file mode 100644 index 0000000..56803f1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap.py @@ -0,0 +1,76 @@ +import os +import numpy as np +import random +import cPickle as pickle +from scipy.io import loadmat + +np.random.seed(0) +random.seed(0) + +def make_dir(path): + if os.path.exists(path): + pass + else: + os.mkdir(path) + +def generate_data_description(save_dir): + """ + create a dataset description file, which consists of images, labels + """ + dataset = dict() + dataset['description'] = 'rap' + dataset['root'] = './dataset/rap/RAP_dataset/' + dataset['image'] = [] + dataset['att'] = [] + dataset['att_name'] = [] + dataset['selected_attribute'] = range(51) + # load Rap_annotation.mat + data = loadmat(open('./dataset/rap/RAP_annotation/RAP_annotation.mat', 'r')) + for idx in range(51): + dataset['att_name'].append(data['RAP_annotation'][0][0][6][idx][0][0]) + + for idx in range(41585): + dataset['image'].append(data['RAP_annotation'][0][0][5][idx][0][0]) + dataset['att'].append(data['RAP_annotation'][0][0][1][idx, :].tolist()) + + with open(os.path.join(save_dir, 'rap_dataset.pkl'), 'w+') as f: + pickle.dump(dataset, f) + +def create_trainvaltest_split(traintest_split_file): + """ + create a dataset split file, which consists of index of the train/val/test splits + """ + partition = dict() + partition['trainval'] = [] + partition['test'] = [] + partition['weight_trainval'] = [] + # load RAP_annotation.mat + data = loadmat(open('./dataset/rap/RAP_annotation/RAP_annotation.mat', 'r')) + for idx in range(5): + trainval = (data['RAP_annotation'][0][0][0][idx][0][0][0][0][0,:]-1).tolist() + test = (data['RAP_annotation'][0][0][0][idx][0][0][0][1][0,:]-1).tolist() + partition['trainval'].append(trainval) + partition['test'].append(test) + # weight + weight_trainval = np.mean(data['RAP_annotation'][0][0][1][trainval, :].astype('float32')==1, axis=0).tolist() + partition['weight_trainval'].append(weight_trainval) + with open(traintest_split_file, 'w+') as f: + pickle.dump(partition, f) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="rap dataset") + parser.add_argument( + '--save_dir', + type=str, + default='./dataset/rap/') + parser.add_argument( + '--traintest_split_file', + type=str, + default="./dataset/rap/rap_partition.pkl") + args = parser.parse_args() + save_dir = args.save_dir + traintest_split_file = args.traintest_split_file + + generate_data_description(save_dir) + create_trainvaltest_split(traintest_split_file) diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap2.py b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap2.py new file mode 100644 index 0000000..ca1ffac --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/code/transform_rap2.py @@ -0,0 +1,86 @@ +import os +import numpy as np +import random +import cPickle as pickle +from scipy.io import loadmat + +np.random.seed(0) +random.seed(0) + +def make_dir(path): + if os.path.exists(path): + pass + else: + os.mkdir(path) + +def generate_data_description(save_dir): + """ + create a dataset description file, which consists of images, labels + """ + dataset = dict() + dataset['description'] = 'rap2' + dataset['root'] = './dataset/rap2/RAP_dataset/' + dataset['image'] = [] + dataset['att'] = [] + dataset['att_name'] = [] + # load RAP_annotation.mat + data = loadmat(open('./dataset/rap2/RAP_annotation/RAP_annotation.mat', 'r')) + dataset['selected_attribute'] = (data['RAP_annotation'][0][0][3][0,:]-1).tolist() + for idx in range(152): + dataset['att_name'].append(data['RAP_annotation'][0][0][2][idx][0][0]) + + for idx in range(84928): + dataset['image'].append(data['RAP_annotation'][0][0][0][idx][0][0]) + dataset['att'].append(data['RAP_annotation'][0][0][1][idx, :].tolist()) + + with open(os.path.join(save_dir, 'rap2_dataset.pkl'), 'w+') as f: + pickle.dump(dataset, f) + +def create_trainvaltest_split(traintest_split_file): + """ + create a dataset split file, which consists of index of the train/val/test splits + """ + partition = dict() + partition['train'] = [] + partition['val'] = [] + partition['trainval'] = [] + partition['test'] = [] + partition['weight_train'] = [] + partition['weight_trainval'] = [] + # load RAP_annotation.mat + data = loadmat(open('./dataset/rap2/RAP_annotation/RAP_annotation.mat', 'r')) + for idx in range(5): + train = (data['RAP_annotation'][0][0][4][0, idx][0][0][0][0,:]-1).tolist() + val = (data['RAP_annotation'][0][0][4][0, idx][0][0][1][0,:]-1).tolist() + test = (data['RAP_annotation'][0][0][4][0, idx][0][0][2][0,:]-1).tolist() + trainval = train + val + partition['trainval'].append(trainval) + partition['train'].append(train) + partition['val'].append(val) + partition['test'].append(test) + # weight + weight_train = np.mean(data['RAP_annotation'][0][0][1][train, :].astype('float32')==1, axis=0).tolist() + weight_trainval = np.mean(data['RAP_annotation'][0][0][1][trainval, :].astype('float32')==1, axis=0).tolist() + partition['weight_train'].append(weight_train) + partition['weight_trainval'].append(weight_trainval) + + with open(traintest_split_file, 'w+') as f: + pickle.dump(partition, f) + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="rap2 dataset") + parser.add_argument( + '--save_dir', + type=str, + default='./dataset/rap2/') + parser.add_argument( + '--traintest_split_file', + type=str, + default="./dataset/rap2/rap2_partition.pkl") + args = parser.parse_args() + save_dir = args.save_dir + traintest_split_file = args.traintest_split_file + + generate_data_description(save_dir) + create_trainvaltest_split(traintest_split_file) diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/config/set_env_b023.sh b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/config/set_env_b023.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/config/set_env_b023.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/run.sh new file mode 100644 index 0000000..033cd74 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/run.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name=$(cd $currentDir/..;basename `pwd`) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +# 清除旧日志 +rm -rf /var/log/npu/slog/host-0/* +rm -rf ${currentDir}/result/*.log + +#mkdir train job path +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + this_ip=$(hostname -I |awk '{print $1}') + ln -snf ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/0/hw_deepmar.log ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp ${jsonFilePath} root@$ip:${jsonFilePath} + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + rank_id=0 + #for device_id in $device_group;do + ln -snf ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/${first_device_id}/hw_deepmar.log ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + # let rank_id++ + # done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/train.sh new file mode 100644 index 0000000..3090063 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DeepMar/pytorch/scripts/train.sh @@ -0,0 +1,173 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_deepmar/training_job_${currtime}/ + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +export REMARK_LOG_FILE=hw_deepmar.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + +#source ${currentDir}/config/npu_set_env.sh +source ${currentDir}/config/set_env_b023.sh +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export HCCL_RANK_TABLE_PATH=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 数据集预处理 +python3.7 ${currentDir}/code/transform_peta.py \ + --save_dir=${data_url} \ + --traintest_split_file=${data_url}/peta_partition.pkl + +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + # 多卡多机 + export CLUSTER=True +fi + +if [ x"${mode}" == x"evaluate" ];then + pass + + +elif [ x"${rank_size}" == x"1" ];then + # 单卡 + python3.7 ${currentDir}/code/train_deepmar_resnet50.py \ + --dataset=peta \ + --save_dir=${data_url} \ + --workers=32 \ + --npu=${device} \ + --partition_idx=0 \ + --split=trainval \ + --test_split=test \ + --batch_size=${batch_size} \ + --resize="(224,224)" \ + --exp_subpath=deepmar_resnet50 \ + --new_params_lr=0.01 \ + --finetuned_params_lr=0.01 \ + --staircase_decay_at_epochs="(50,100)" \ + --total_epochs=${epoches} \ + --epochs_per_val=10 \ + --epochs_per_save=50 \ + --steps_per_log=10 \ + --drop_pool5=True \ + --drop_pool5_rate=0.5 \ + --run=1 \ + --resume=False \ + --ckpt_file= \ + --load_model_weight=False \ + --model_weight_file= \ + --amp \ + --opt_level O2 \ + --loss_scale 512 \ + --set_seed True \ + --pretrained True \ + --test_only=False > ${train_job_dir}/train_${rank_size}p.log 2>&1 + +elif [ ${rank_size} -le 8 ];then + # 单机多卡 + #source ${currentDir}/config/set_env_b023.sh + python3.7 ${currentDir}/code/train_deepmar_resnet50_8p.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --save_dir=${data_url} \ + --dataset=peta \ + --workers=80 \ + --partition_idx=0 \ + --split=trainval \ + --test_split=test \ + --batch_size=${batch_size} \ + --resize="(224,224)" \ + --exp_subpath=deepmar_resnet50 \ + --new_params_lr=${lr} \ + --finetuned_params_lr=${lr} \ + --staircase_decay_at_epochs="(50,100)" \ + --total_epochs=${epoches} \ + --epochs_per_val=10 \ + --epochs_per_save=50 \ + --steps_per_log=10 \ + --drop_pool5=True \ + --drop_pool5_rate=0.5 \ + --run=1 \ + --resume=False \ + --ckpt_file= \ + --load_model_weight=False \ + --model_weight_file=ckpt_epoch101.pth\ + --amp \ + --opt_level O2 \ + --loss_scale 512.0 \ + --set_seed True \ + --pretrained True \ + --test_only=False \ + --dist_url 'tcp://127.0.0.1:50000' \ + --dist_backend 'hccl' \ + --multiprocessing_distributed \ + --world_size 1 \ + --npus_per_node=${rank_size} \ + --rank 0 > ${train_job_dir}/train_${rank_size}p.log 2>&1 + + +fi + +#taskset -c 0-20 python3.7 ${currentDir}/code/densenet121.py > ./train.log 2>&1 + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 deepmar train success" + echo ":::ABK 1.0.0 deepmar train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 deepmar train success" >> ./hw_deepmar.log +else + echo ":::ABK 1.0.0 deepmar train success" + echo ":::ABK 1.0.0 deepmar train failed" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 deepmar train failed" >> ./hw_deepmar.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 deepmar train total time: ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_deepmar.log diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/__init__.py b/train/atlas_benchmark-master/image_classification/DenseNet121/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/README.md b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/README.md new file mode 100644 index 0000000..7ba1672 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/README.md @@ -0,0 +1,25 @@ +# DenseNet121_pytorch训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/DenseNet121.yaml中修改相应配置, 配置项含义: + +``` +pytorch_config: + data_url: 数据集路径 + epoches: 跑多少个epoch + batch_size: 1p 参数为256 2p 512 4p 1024 8p为2048 + lr: 默认参数1p 0.1 2p 0.2 4p 0.4 8p 0.8 + seed: 49 + docker_image: docker 镜像名称:版本号 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/__init__.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_1p_main.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_1p_main.py new file mode 100644 index 0000000..5ef0e11 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_1p_main.py @@ -0,0 +1,515 @@ +import argparse +import os +import random +import shutil +import time +import warnings +import sys + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models +import torch.npu + +from torch.utils.tensorboard import SummaryWriter +from densenet_0_2_2 import densenet121 + +import numpy as np +from apex import amp + + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +warnings.filterwarnings('ignore') + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='densenet121', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', + help='number of data loading workers (default: 8)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=128, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=1, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('--npu', default=None, type=int, + help='NPU id to use.') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=1024., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + + + +def main(): + args = parser.parse_args() + print(args) + + if args.npu is None: + args.npu = 0 + global CALCULATE_DEVICE + global best_acc1 + + best_acc1 = 0 + CALCULATE_DEVICE = "npu:{}".format(args.npu) + torch.npu.set_device(CALCULATE_DEVICE) + + if args.seed is not None: + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + ngpus_per_node = torch.npu.device_count() + print('{} node found.'.format(ngpus_per_node)) + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + + if args.gpu is not None: + print("Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + # model = models.__dict__[args.arch]() + model = densenet121() + + if args.distributed: + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.gpu is not None: + torch.cuda.set_device(args.gpu) + model.cuda(args.gpu) + # When using a single GPU per process and per + # DistributedDataParallel, we need to divide the batch size + # ourselves based on the total number of GPUs we have + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + else: + model.cuda() + # DistributedDataParallel will divide and allocate batch_size to all + # available GPUs if device_ids are not set + model = torch.nn.parallel.DistributedDataParallel(model) + elif args.gpu is not None: + torch.cuda.set_device(args.gpu) + model = model.cuda(args.gpu) + else: + # DataParallel will divide and allocate batch_size to all available GPUs + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + model.features = torch.nn.DataParallel(model.features) + model.cuda() + else: + model = model.to(CALCULATE_DEVICE) + #for item in model.npu_unsupport_list: + # print("npu_unsupport: ", item) + # item.cpu() + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(CALCULATE_DEVICE) + + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=CALCULATE_DEVICE) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=False, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=False, drop_last=True) + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + + writer = SummaryWriter(os.path.join('runs/densenet121')) + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch, args, writer) + + if (epoch+1)%(args.eval_freq)==0 or epoch==args.epochs-1 : + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, epoch, writer) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0 and epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + }, is_best) + + writer.close() + +def train(train_loader, model, criterion, optimizer, epoch, args, writer): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + + end = time.time() + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + target = target.to(torch.int32) + images, target = images.to(CALCULATE_DEVICE, non_blocking=False), target.to(CALCULATE_DEVICE, non_blocking=False) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # add tensorboard + writer.add_scalar('Train/Loss', losses.val, epoch * len(train_loader) + i) + writer.add_scalar('Train/Acc@1', top1.val, epoch * len(train_loader) + i) + writer.add_scalar('Train/Acc@5', top5.val, epoch * len(train_loader) + i) + writer.add_scalar('Train/LR', optimizer.param_groups[0]['lr'], epoch * len(train_loader) + i) + + # compute gradient and do SGD step + optimizer.zero_grad() + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + optimizer.step() + + # measure elapsed time + batch_time.update(time.time() - end) + writer.add_scalar('Train/Time', batch_time.val, epoch * len(train_loader) + i) + writer.add_scalar('Train/Time_Data', data_time.val, epoch * len(train_loader) + i) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + print(' * FPS@all {:.3f}'.format(args.batch_size/batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(args.batch_size/batch_time.avg)) + +def validate(val_loader, model, criterion, args, epoch=0, writer=None): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + target = target.to(torch.int32) + images, target = images.to(CALCULATE_DEVICE, non_blocking=False), target.to(CALCULATE_DEVICE, non_blocking=False) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + if writer: # and args.gpu==0: + writer.add_scalar('Val/Time', batch_time.avg, epoch) + writer.add_scalar('Val/Loss', losses.avg, epoch) + writer.add_scalar('Val/Acc@1', top1.avg, epoch) + writer.add_scalar('Val/Acc@5', top5.avg, epoch) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar'%(state['best_acc1'], state['epoch'])) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.count += n + if self.count>(self.start_count_index*n): + self.sum += val * n + self.avg = self.sum / (self.count-self.start_count_index*n) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + # 日志打点 + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_8p_main.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_8p_main.py new file mode 100644 index 0000000..6d3b0eb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet121_8p_main.py @@ -0,0 +1,538 @@ +# -*- coding: utf-8 -*- + +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models +from densenet_0_2_2 import densenet121 + +from apex import amp + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +BATCH_SIZE = 512 +OPTIMIZER_BATCH_SIZE=2048 +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('--workspace',type=str,default='./',metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, + help='npu or gpu') +parser.add_argument('--addr', default='10.136.181.115', type=str, + help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, + help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=0, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') +parser.add_argument('--device-list', default='0,1,2,3,4,5,6,7', type=str, help='device id list') +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=1024., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + +warnings.filterwarnings('ignore') +best_acc1 = 0 +def device_id_to_process_device_map(device_list): + devices = device_list.split(",") + devices = [int(x) for x in devices] + devices.sort() + + process_device_map = dict() + for process_id, device_id in enumerate(devices): + process_device_map[process_id] = device_id + + return process_device_map + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + + os.environ['KERNEL_NAME_ID'] = str(0) + print("+++++++++++++++++++++++++++KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '29688' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + args.process_device_map = device_id_to_process_device_map(args.device_list) + + if args.device == 'npu': + ngpus_per_node = len(args.process_device_map) + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = args.process_device_map[gpu] + print("[npu id:",args.gpu,"]","+++++++++++++++++++++++++++ before set KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(gpu) + print("[npu id:",args.gpu,"]","+++++++++++++++++++++++++++KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[npu id:",args.gpu,"]","Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, #init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + print("[npu id:",args.gpu,"]","===============main_worker()=================") + print("[npu id:",args.gpu,"]",args) + print("[npu id:",args.gpu,"]","===============main_worker()=================") + + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=False, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=False, drop_last=True) + + # create model + print("[npu id:",args.gpu,"]","=> creating model '{}'".format(args.arch)) + # model = models.__dict__[args.arch]() + model = densenet121() + model = model.to(loc) + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node) + + if (epoch+1)%(args.eval_freq)==0 or epoch==args.epochs-1 : + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args,ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0 and epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + }, is_best) + +def train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + end = time.time() + if args.benchmark == 1 : + optimizer.zero_grad() + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + + # compute output + output = model(images) + + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0 : + optimizer.zero_grad() + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + if args.benchmark == 0 : + optimizer.step() + elif args.benchmark == 1 : + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:",args.gpu,"]",'* FPS@all {:.3f}'.format(ngpus_per_node*args.batch_size/batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(ngpus_per_node*args.batch_size / batch_time.avg)) + +def validate(val_loader, model, criterion, args,ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:",args.gpu,"]",'[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + return top1.avg + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar'%(state['best_acc1'], state['epoch'])) + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.count += n + if self.count>(self.start_count_index*n): + self.sum += val * n + self.avg = self.sum / (self.count-self.start_count_index*n) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[npu id:",os.environ['KERNEL_NAME_ID'],"]",'\t'.join(entries)) + # 日志打点 + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_2_2.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_2_2.py new file mode 100644 index 0000000..43f8e7c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_2_2.py @@ -0,0 +1,225 @@ +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +from collections import OrderedDict + +__all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] + + +model_urls = { + 'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth', + 'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth', + 'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth', + 'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth', +} + + +class _DenseLayer(nn.Sequential): + def __init__(self, num_input_features, growth_rate, bn_size, drop_rate): + super(_DenseLayer, self).__init__() + self.add_module('norm1', nn.BatchNorm2d(num_input_features)), + self.add_module('relu1', nn.ReLU(inplace=True)), + self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * + growth_rate, kernel_size=1, stride=1, bias=False)), + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), + self.add_module('relu2', nn.ReLU(inplace=True)), + self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, + kernel_size=3, stride=1, padding=1, bias=False)), + self.drop_rate = drop_rate + + def forward(self, x): + new_features = super(_DenseLayer, self).forward(x) + if self.drop_rate > 0: + new_features = F.dropout(new_features, p=self.drop_rate, training=self.training) + return torch.cat([x, new_features], 1) + + +class _DenseBlock(nn.Sequential): + def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate): + super(_DenseBlock, self).__init__() + for i in range(num_layers): + layer = _DenseLayer(num_input_features + i * growth_rate, growth_rate, bn_size, drop_rate) + self.add_module('denselayer%d' % (i + 1), layer) + + +class _Transition(nn.Sequential): + def __init__(self, num_input_features, num_output_features): + super(_Transition, self).__init__() + self.add_module('norm', nn.BatchNorm2d(num_input_features)) + self.add_module('relu', nn.ReLU(inplace=True)) + self.add_module('conv', nn.Conv2d(num_input_features, num_output_features, + kernel_size=1, stride=1, bias=False)) + self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2)) + + +class DenseNet(nn.Module): + r"""Densenet-BC model class, based on + `"Densely Connected Convolutional Networks" `_ + + Args: + growth_rate (int) - how many filters to add each layer (`k` in paper) + block_config (list of 4 ints) - how many layers in each pooling block + num_init_features (int) - the number of filters to learn in the first convolution layer + bn_size (int) - multiplicative factor for number of bottle neck layers + (i.e. bn_size * k features in the bottleneck layer) + drop_rate (float) - dropout rate after each dense layer + num_classes (int) - number of classification classes + """ + + def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), + num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000): + + super(DenseNet, self).__init__() + + # First convolution + self.features = nn.Sequential(OrderedDict([ + ('conv0', nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False)), + ('norm0', nn.BatchNorm2d(num_init_features)), + ('relu0', nn.ReLU(inplace=True)), + ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)), + ])) + + # Each denseblock + num_features = num_init_features + for i, num_layers in enumerate(block_config): + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, + bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + self.features.add_module('denseblock%d' % (i + 1), block) + num_features = num_features + num_layers * growth_rate + if i != len(block_config) - 1: + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features.add_module('transition%d' % (i + 1), trans) + num_features = num_features // 2 + + # Final batch norm + self.features.add_module('norm5', nn.BatchNorm2d(num_features)) + + # Linear layer + self.classifier = nn.Linear(num_features, num_classes) + + # Official init from torch repo. + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.constant_(m.bias, 0) + + def forward(self, x): + features = self.features(x) + out = F.relu(features, inplace=True) + out = F.adaptive_avg_pool2d(out, (1, 1)).view(features.size(0), -1) + out = self.classifier(out) + return out + + +def densenet121(pretrained=False, **kwargs): + r"""Densenet-121 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 24, 16), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet121']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet169(pretrained=False, **kwargs): + r"""Densenet-169 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 32, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet169']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet201(pretrained=False, **kwargs): + r"""Densenet-201 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 48, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet201']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet161(pretrained=False, **kwargs): + r"""Densenet-161 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=96, growth_rate=48, block_config=(6, 12, 36, 24), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet161']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_5_0.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_5_0.py new file mode 100644 index 0000000..df6c9cc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/densenet_0_5_0.py @@ -0,0 +1,279 @@ +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from collections import OrderedDict +#from .utils import load_state_dict_from_url +from torch import Tensor +from torch.jit.annotations import List + + +__all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] + +model_urls = { + 'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth', + 'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth', + 'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth', + 'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth', +} + + +class _DenseLayer(nn.Module): + def __init__(self, num_input_features, growth_rate, bn_size, drop_rate, memory_efficient=False): + super(_DenseLayer, self).__init__() + self.add_module('norm1', nn.BatchNorm2d(num_input_features)), + self.add_module('relu1', nn.ReLU(inplace=True)), + self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * + growth_rate, kernel_size=1, stride=1, + bias=False)), + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), + self.add_module('relu2', nn.ReLU(inplace=True)), + self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, + kernel_size=3, stride=1, padding=1, + bias=False)), + self.drop_rate = float(drop_rate) + self.memory_efficient = memory_efficient + + def bn_function(self, inputs): + # type: (List[Tensor]) -> Tensor + concated_features = torch.cat(inputs, 1) + bottleneck_output = self.conv1(self.relu1(self.norm1(concated_features))) # noqa: T484 + return bottleneck_output + + # todo: rewrite when torchscript supports any + def any_requires_grad(self, input): + # type: (List[Tensor]) -> bool + for tensor in input: + if tensor.requires_grad: + return True + return False + + @torch.jit.unused # noqa: T484 + def call_checkpoint_bottleneck(self, input): + # type: (List[Tensor]) -> Tensor + def closure(*inputs): + return self.bn_function(*inputs) + + return cp.checkpoint(closure, input) + + @torch.jit._overload_method # noqa: F811 + def forward(self, input): + # type: (List[Tensor]) -> (Tensor) + pass + + @torch.jit._overload_method # noqa: F811 + def forward(self, input): + # type: (Tensor) -> (Tensor) + pass + + # torchscript does not yet support *args, so we overload method + # allowing it to take either a List[Tensor] or single Tensor + def forward(self, input): # noqa: F811 + if isinstance(input, Tensor): + prev_features = [input] + else: + prev_features = input + + if self.memory_efficient and self.any_requires_grad(prev_features): + if torch.jit.is_scripting(): + raise Exception("Memory Efficient not supported in JIT") + + bottleneck_output = self.call_checkpoint_bottleneck(prev_features) + else: + bottleneck_output = self.bn_function(prev_features) + + new_features = self.conv2(self.relu2(self.norm2(bottleneck_output))) + if self.drop_rate > 0: + new_features = F.dropout(new_features, p=self.drop_rate, + training=self.training) + return new_features + + +class _DenseBlock(nn.ModuleDict): + _version = 2 + + def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate, memory_efficient=False): + super(_DenseBlock, self).__init__() + for i in range(num_layers): + layer = _DenseLayer( + num_input_features + i * growth_rate, + growth_rate=growth_rate, + bn_size=bn_size, + drop_rate=drop_rate, + memory_efficient=memory_efficient, + ) + self.add_module('denselayer%d' % (i + 1), layer) + + def forward(self, init_features): + features = [init_features] + for name, layer in self.items(): + new_features = layer(features) + features.append(new_features) + return torch.cat(features, 1) + + +class _Transition(nn.Sequential): + def __init__(self, num_input_features, num_output_features): + super(_Transition, self).__init__() + self.add_module('norm', nn.BatchNorm2d(num_input_features)) + self.add_module('relu', nn.ReLU(inplace=True)) + self.add_module('conv', nn.Conv2d(num_input_features, num_output_features, + kernel_size=1, stride=1, bias=False)) + self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2)) + + +class DenseNet(nn.Module): + r"""Densenet-BC model class, based on + `"Densely Connected Convolutional Networks" `_ + + Args: + growth_rate (int) - how many filters to add each layer (`k` in paper) + block_config (list of 4 ints) - how many layers in each pooling block + num_init_features (int) - the number of filters to learn in the first convolution layer + bn_size (int) - multiplicative factor for number of bottle neck layers + (i.e. bn_size * k features in the bottleneck layer) + drop_rate (float) - dropout rate after each dense layer + num_classes (int) - number of classification classes + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + + def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), + num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000, memory_efficient=False): + + super(DenseNet, self).__init__() + + # First convolution + self.features = nn.Sequential(OrderedDict([ + ('conv0', nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, + padding=3, bias=False)), + ('norm0', nn.BatchNorm2d(num_init_features)), + ('relu0', nn.ReLU(inplace=True)), + ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)), + ])) + + # Each denseblock + num_features = num_init_features + for i, num_layers in enumerate(block_config): + block = _DenseBlock( + num_layers=num_layers, + num_input_features=num_features, + bn_size=bn_size, + growth_rate=growth_rate, + drop_rate=drop_rate, + memory_efficient=memory_efficient + ) + self.features.add_module('denseblock%d' % (i + 1), block) + num_features = num_features + num_layers * growth_rate + if i != len(block_config) - 1: + trans = _Transition(num_input_features=num_features, + num_output_features=num_features // 2) + self.features.add_module('transition%d' % (i + 1), trans) + num_features = num_features // 2 + + # Final batch norm + self.features.add_module('norm5', nn.BatchNorm2d(num_features)) + + # Linear layer + self.classifier = nn.Linear(num_features, num_classes) + + # Official init from torch repo. + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.constant_(m.bias, 0) + + def forward(self, x): + features = self.features(x) + out = F.relu(features, inplace=True) + out = F.adaptive_avg_pool2d(out, (1, 1)) + out = torch.flatten(out, 1) + out = self.classifier(out) + return out + + +def _load_state_dict(model, model_url, progress): + # '.'s are no longer allowed in module names, but previous _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + + state_dict = load_state_dict_from_url(model_url, progress=progress) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + + +def _densenet(arch, growth_rate, block_config, num_init_features, pretrained, progress, + **kwargs): + model = DenseNet(growth_rate, block_config, num_init_features, **kwargs) + if pretrained: + _load_state_dict(model, model_urls[arch], progress) + return model + + +def densenet121(pretrained=False, progress=True, **kwargs): + r"""Densenet-121 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet121', 32, (6, 12, 24, 16), 64, pretrained, progress, + **kwargs) + + +def densenet161(pretrained=False, progress=True, **kwargs): + r"""Densenet-161 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet161', 48, (6, 12, 36, 24), 96, pretrained, progress, + **kwargs) + + +def densenet169(pretrained=False, progress=True, **kwargs): + r"""Densenet-169 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet169', 32, (6, 12, 32, 32), 64, pretrained, progress, + **kwargs) + + +def densenet201(pretrained=False, progress=True, **kwargs): + r"""Densenet-201 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet201', 32, (6, 12, 48, 32), 64, pretrained, progress, + **kwargs) diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/eval.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/eval.sh new file mode 100644 index 0000000..16d5c5e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/eval.sh @@ -0,0 +1,22 @@ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export SLOG_PRINT_TO_STDOUT=0 +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 7" + +export TASK_QUEUE_ENABLE=0 +taskset -c 111-150 python3 densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 7 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --batch-size 256 \ + --epoch 90 \ + --evaluate \ + --resume checkpoint.pth.tar \ + --data /opt/npu/dataset/imagenet \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.cpu b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.cpu new file mode 100644 index 0000000..59b935d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.cpu @@ -0,0 +1,275 @@ +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +from collections import OrderedDict + +__all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] + + +model_urls = { + 'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth', + 'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth', + 'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth', + 'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth', +} + + +class _DenseLayer(nn.Sequential): + def __init__(self, num_input_features, growth_rate, bn_size, drop_rate): + super(_DenseLayer, self).__init__() + self.add_module('norm1', nn.BatchNorm2d(num_input_features)), + self.add_module('relu1', nn.ReLU(inplace=True)), + self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * + growth_rate, kernel_size=1, stride=1, bias=False)), + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), + self.add_module('relu2', nn.ReLU(inplace=True)), + self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, + kernel_size=3, stride=1, padding=1, bias=False)), + self.drop_rate = drop_rate + + def forward(self, x): + new_features = super(_DenseLayer, self).forward(x) + if self.drop_rate > 0: + new_features = F.dropout(new_features, p=self.drop_rate, training=self.training) + return torch.cat([x, new_features], 1) + + +class _DenseBlock(nn.Sequential): + def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate): + super(_DenseBlock, self).__init__() + for i in range(num_layers): + layer = _DenseLayer(num_input_features + i * growth_rate, growth_rate, bn_size, drop_rate) + self.add_module('denselayer%d' % (i + 1), layer) + + +class _Transition(nn.Sequential): + def __init__(self, num_input_features, num_output_features): + super(_Transition, self).__init__() + self.add_module('norm', nn.BatchNorm2d(num_input_features)) + self.add_module('relu', nn.ReLU(inplace=True)) + self.add_module('conv', nn.Conv2d(num_input_features, num_output_features, + kernel_size=1, stride=1, bias=False)) + #self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2)) ######### xupeng add ########## + + +class DenseNet(nn.Module): + r"""Densenet-BC model class, based on + `"Densely Connected Convolutional Networks" `_ + + Args: + growth_rate (int) - how many filters to add each layer (`k` in paper) + block_config (list of 4 ints) - how many layers in each pooling block + num_init_features (int) - the number of filters to learn in the first convolution layer + bn_size (int) - multiplicative factor for number of bottle neck layers + (i.e. bn_size * k features in the bottleneck layer) + drop_rate (float) - dropout rate after each dense layer + num_classes (int) - number of classification classes + """ + + def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), + num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000): + + super(DenseNet, self).__init__() + + self.avg_pool = nn.AvgPool2d(kernel_size=2, stride=2) + + ################ block 0 ################ + num_features = num_init_features + i=0 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features0 = nn.Sequential(OrderedDict([ + ('conv0', nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False)), + ('norm0', nn.BatchNorm2d(num_init_features)), + ('relu0', nn.ReLU(inplace=True)), + ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)), + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans) + ])) + + ################ block 1 ############## + num_features = num_features // 2 + i=1 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features1 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans), + ])) + + ################ block 2 ############## + num_features = num_features // 2 + i=2 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features2 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans), + ])) + + ################ block 3 ############## + num_features = num_features // 2 + i=3 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + self.features3 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('norm5', nn.BatchNorm2d(num_features)), + ])) + + # Linear layer + self.classifier = nn.Linear(num_features, num_classes) + + # Official init from torch repo. + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.constant_(m.bias, 0) + + def forward(self, x): + #CALCULATE_DEVICE = "npu:0" + #self.avg_pool = self.avg_pool.cpu() + #print("avg_pool move to cpu") + #print("tag0") + features0 = self.features0(x) + #features0 = features0.cpu() + avg_pool_0 = self.avg_pool(features0) + #avg_pool_0 = avg_pool_0.to(CALCULATE_DEVICE) + #print("tag1") + features1 = self.features1(avg_pool_0) + #features1 = features1.cpu() + avg_pool_1 = self.avg_pool(features1) + #avg_pool_1 = avg_pool_1.to(CALCULATE_DEVICE) + #print("tag2") + features2 = self.features2(avg_pool_1) + #features2 = features2.cpu() + avg_pool_2 = self.avg_pool(features2) + #avg_pool_2 = avg_pool_2.to(CALCULATE_DEVICE) + #print("tag3") + features3 = self.features3(avg_pool_2) + + out = F.relu(features3, inplace=True) + out = F.adaptive_avg_pool2d(out, (1, 1)).view(features3.size(0), -1) + out = self.classifier(out) + return out + + +def densenet121(pretrained=False, **kwargs): + r"""Densenet-121 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 24, 16), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet121']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet169(pretrained=False, **kwargs): + r"""Densenet-169 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 32, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet169']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet201(pretrained=False, **kwargs): + r"""Densenet-201 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 48, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet201']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet161(pretrained=False, **kwargs): + r"""Densenet-161 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=96, growth_rate=48, block_config=(6, 12, 36, 24), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet161']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.npu b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.npu new file mode 100644 index 0000000..baa8f2c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/cpu_adapter_file/densenet.py.npu @@ -0,0 +1,275 @@ +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as model_zoo +from collections import OrderedDict + +__all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] + + +model_urls = { + 'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth', + 'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth', + 'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth', + 'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth', +} + + +class _DenseLayer(nn.Sequential): + def __init__(self, num_input_features, growth_rate, bn_size, drop_rate): + super(_DenseLayer, self).__init__() + self.add_module('norm1', nn.BatchNorm2d(num_input_features)), + self.add_module('relu1', nn.ReLU(inplace=True)), + self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * + growth_rate, kernel_size=1, stride=1, bias=False)), + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), + self.add_module('relu2', nn.ReLU(inplace=True)), + self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, + kernel_size=3, stride=1, padding=1, bias=False)), + self.drop_rate = drop_rate + + def forward(self, x): + new_features = super(_DenseLayer, self).forward(x) + if self.drop_rate > 0: + new_features = F.dropout(new_features, p=self.drop_rate, training=self.training) + return torch.cat([x, new_features], 1) + + +class _DenseBlock(nn.Sequential): + def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate): + super(_DenseBlock, self).__init__() + for i in range(num_layers): + layer = _DenseLayer(num_input_features + i * growth_rate, growth_rate, bn_size, drop_rate) + self.add_module('denselayer%d' % (i + 1), layer) + + +class _Transition(nn.Sequential): + def __init__(self, num_input_features, num_output_features): + super(_Transition, self).__init__() + self.add_module('norm', nn.BatchNorm2d(num_input_features)) + self.add_module('relu', nn.ReLU(inplace=True)) + self.add_module('conv', nn.Conv2d(num_input_features, num_output_features, + kernel_size=1, stride=1, bias=False)) + #self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2)) ######### xupeng add ########## + + +class DenseNet(nn.Module): + r"""Densenet-BC model class, based on + `"Densely Connected Convolutional Networks" `_ + + Args: + growth_rate (int) - how many filters to add each layer (`k` in paper) + block_config (list of 4 ints) - how many layers in each pooling block + num_init_features (int) - the number of filters to learn in the first convolution layer + bn_size (int) - multiplicative factor for number of bottle neck layers + (i.e. bn_size * k features in the bottleneck layer) + drop_rate (float) - dropout rate after each dense layer + num_classes (int) - number of classification classes + """ + + def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), + num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000): + + super(DenseNet, self).__init__() + + self.avg_pool = nn.AvgPool2d(kernel_size=2, stride=2) + + ################ block 0 ################ + num_features = num_init_features + i=0 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features0 = nn.Sequential(OrderedDict([ + ('conv0', nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False)), + ('norm0', nn.BatchNorm2d(num_init_features)), + ('relu0', nn.ReLU(inplace=True)), + ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)), + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans) + ])) + + ################ block 1 ############## + num_features = num_features // 2 + i=1 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features1 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans), + ])) + + ################ block 2 ############## + num_features = num_features // 2 + i=2 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + trans = _Transition(num_input_features=num_features, num_output_features=num_features // 2) + self.features2 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('transition%d' % (i + 1), trans), + ])) + + ################ block 3 ############## + num_features = num_features // 2 + i=3 + num_layers=block_config[i] + block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) + num_features = num_features + num_layers * growth_rate + self.features3 = nn.Sequential(OrderedDict([ + ('denseblock%d' % (i + 1), block), + ('norm5', nn.BatchNorm2d(num_features)), + ])) + + # Linear layer + self.classifier = nn.Linear(num_features, num_classes) + + # Official init from torch repo. + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.constant_(m.bias, 0) + + def forward(self, x): + CALCULATE_DEVICE = "npu:0" + self.avg_pool = self.avg_pool.cpu() + #print("avg_pool move to cpu") + #print("tag0") + features0 = self.features0(x) + features0 = features0.cpu() + avg_pool_0 = self.avg_pool(features0) + avg_pool_0 = avg_pool_0.to(CALCULATE_DEVICE) + #print("tag1") + features1 = self.features1(avg_pool_0) + features1 = features1.cpu() + avg_pool_1 = self.avg_pool(features1) + avg_pool_1 = avg_pool_1.to(CALCULATE_DEVICE) + #print("tag2") + features2 = self.features2(avg_pool_1) + features2 = features2.cpu() + avg_pool_2 = self.avg_pool(features2) + avg_pool_2 = avg_pool_2.to(CALCULATE_DEVICE) + #print("tag3") + features3 = self.features3(avg_pool_2) + + out = F.relu(features3, inplace=True) + out = F.adaptive_avg_pool2d(out, (1, 1)).view(features3.size(0), -1) + out = self.classifier(out) + return out + + +def densenet121(pretrained=False, **kwargs): + r"""Densenet-121 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 24, 16), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet121']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet169(pretrained=False, **kwargs): + r"""Densenet-169 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 32, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet169']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet201(pretrained=False, **kwargs): + r"""Densenet-201 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 48, 32), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet201']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model + + +def densenet161(pretrained=False, **kwargs): + r"""Densenet-161 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + """ + model = DenseNet(num_init_features=96, growth_rate=48, block_config=(6, 12, 36, 24), + **kwargs) + if pretrained: + # '.'s are no longer allowed in module names, but pervious _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + state_dict = model_zoo.load_url(model_urls['densenet161']) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + return model diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/densenet_print.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/densenet_print.py new file mode 100644 index 0000000..3011376 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/densenet_print.py @@ -0,0 +1,300 @@ +import re +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from collections import OrderedDict +#from .utils import load_state_dict_from_url +from torch import Tensor +from torch.jit.annotations import List + + +__all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] + +model_urls = { + 'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth', + 'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth', + 'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth', + 'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth', +} + + +class _DenseLayer(nn.Module): + def __init__(self, num_input_features, growth_rate, bn_size, drop_rate, memory_efficient=False): + super(_DenseLayer, self).__init__() + self.add_module('norm1', nn.BatchNorm2d(num_input_features)), + self.add_module('relu1', nn.ReLU(inplace=True)), + self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * + growth_rate, kernel_size=1, stride=1, + bias=False)), + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), + self.add_module('relu2', nn.ReLU(inplace=True)), + self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, + kernel_size=3, stride=1, padding=1, + bias=False)), + self.drop_rate = float(drop_rate) + self.memory_efficient = memory_efficient + + def bn_function(self, inputs): + # type: (List[Tensor]) -> Tensor + concated_features = torch.cat(inputs, 1) + bottleneck_output = self.conv1(self.relu1(self.norm1(concated_features))) # noqa: T484 + return bottleneck_output + + # todo: rewrite when torchscript supports any + def any_requires_grad(self, input): + # type: (List[Tensor]) -> bool + for tensor in input: + if tensor.requires_grad: + return True + return False + + @torch.jit.unused # noqa: T484 + def call_checkpoint_bottleneck(self, input): + # type: (List[Tensor]) -> Tensor + def closure(*inputs): + return self.bn_function(*inputs) + + return cp.checkpoint(closure, input) + + @torch.jit._overload_method # noqa: F811 + def forward(self, input): + # type: (List[Tensor]) -> (Tensor) + pass + + @torch.jit._overload_method # noqa: F811 + def forward(self, input): + # type: (Tensor) -> (Tensor) + pass + + # torchscript does not yet support *args, so we overload method + # allowing it to take either a List[Tensor] or single Tensor + def forward(self, input): # noqa: F811 + if isinstance(input, Tensor): + prev_features = [input] + else: + prev_features = input + + if self.memory_efficient and self.any_requires_grad(prev_features): + if torch.jit.is_scripting(): + raise Exception("Memory Efficient not supported in JIT") + + bottleneck_output = self.call_checkpoint_bottleneck(prev_features) + else: + bottleneck_output = self.bn_function(prev_features) + + new_features = self.conv2(self.relu2(self.norm2(bottleneck_output))) + if self.drop_rate > 0: + new_features = F.dropout(new_features, p=self.drop_rate, + training=self.training) + return new_features + + +class _DenseBlock(nn.ModuleDict): + _version = 2 + + def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate, memory_efficient=False): + super(_DenseBlock, self).__init__() + for i in range(num_layers): + layer = _DenseLayer( + num_input_features + i * growth_rate, + growth_rate=growth_rate, + bn_size=bn_size, + drop_rate=drop_rate, + memory_efficient=memory_efficient, + ) + self.add_module('denselayer%d' % (i + 1), layer) + + def forward(self, init_features): + features = [init_features] + for name, layer in self.items(): + new_features = layer(features) + features.append(new_features) + return torch.cat(features, 1) + + +class _Transition(nn.Sequential): + def __init__(self, num_input_features, num_output_features): + super(_Transition, self).__init__() + self.add_module('norm', nn.BatchNorm2d(num_input_features)) + self.add_module('relu', nn.ReLU(inplace=True)) + self.add_module('conv', nn.Conv2d(num_input_features, num_output_features, + kernel_size=1, stride=1, bias=False)) + self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2)) + +class PrintLayer(nn.Module): + def __init__(self, name): + super(PrintLayer, self).__init__() + self.name = name + + def forward(self, x): + # Do your print / debug stuff here + print("{} mean data: {}".format(self.name, x.mean().item())) #print(x.shape) + return x + +class DenseNet(nn.Module): + r"""Densenet-BC model class, based on + `"Densely Connected Convolutional Networks" `_ + + Args: + growth_rate (int) - how many filters to add each layer (`k` in paper) + block_config (list of 4 ints) - how many layers in each pooling block + num_init_features (int) - the number of filters to learn in the first convolution layer + bn_size (int) - multiplicative factor for number of bottle neck layers + (i.e. bn_size * k features in the bottleneck layer) + drop_rate (float) - dropout rate after each dense layer + num_classes (int) - number of classification classes + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + + def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), + num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000, memory_efficient=False): + + super(DenseNet, self).__init__() + + # First convolution + self.features = nn.Sequential(OrderedDict([ + ('conv0', nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, + padding=3, bias=False)), + ('conv0_p', PrintLayer('conv0_p')), + ('norm0', nn.BatchNorm2d(num_init_features)), + ('norm0_p', PrintLayer('norm0_p')), + ('relu0', nn.ReLU(inplace=True)), + ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)), + ('pool0_p', PrintLayer('pool0_p')), + ])) + + + + # Each denseblock + num_features = num_init_features + for i, num_layers in enumerate(block_config): + block = _DenseBlock( + num_layers=num_layers, + num_input_features=num_features, + bn_size=bn_size, + growth_rate=growth_rate, + drop_rate=drop_rate, + memory_efficient=memory_efficient + ) + self.features.add_module('denseblock%d' % (i + 1), block) + self.features.add_module('denseblock%d_p' % (i + 1), PrintLayer('denseblock%d_p' % (i + 1))) + num_features = num_features + num_layers * growth_rate + if i != len(block_config) - 1: + trans = _Transition(num_input_features=num_features, + num_output_features=num_features // 2) + self.features.add_module('transition%d' % (i + 1), trans) + self.features.add_module('transition%d_p' % (i + 1), PrintLayer('transition%d_p' % (i + 1))) + num_features = num_features // 2 + + # Final batch norm + self.features.add_module('norm5', nn.BatchNorm2d(num_features)) + + # Linear layer + self.classifier = nn.Linear(num_features, num_classes) + + # Official init from torch repo. + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight) + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + elif isinstance(m, nn.Linear): + nn.init.constant_(m.bias, 0) + + def forward(self, x): + features = self.features(x) + + # features_p = features.to('cpu')' + print('the features mean: {}'.format(features.mean().item())) + + out = F.relu(features, inplace=True) + out = F.adaptive_avg_pool2d(out, (1, 1)) + out = torch.flatten(out, 1) + print('the flatten mean: {}'.format(out.mean().item())) + out = self.classifier(out) + return out + + +def _load_state_dict(model, model_url, progress): + # '.'s are no longer allowed in module names, but previous _DenseLayer + # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. + # They are also in the checkpoints in model_urls. This pattern is used + # to find such keys. + pattern = re.compile( + r'^(.*denselayer\d+\.(?:norm|relu|conv))\.((?:[12])\.(?:weight|bias|running_mean|running_var))$') + + state_dict = load_state_dict_from_url(model_url, progress=progress) + for key in list(state_dict.keys()): + res = pattern.match(key) + if res: + new_key = res.group(1) + res.group(2) + state_dict[new_key] = state_dict[key] + del state_dict[key] + model.load_state_dict(state_dict) + + +def _densenet(arch, growth_rate, block_config, num_init_features, pretrained, progress, + **kwargs): + model = DenseNet(growth_rate, block_config, num_init_features, **kwargs) + if pretrained: + _load_state_dict(model, model_urls[arch], progress) + return model + + +def densenet121(pretrained=False, progress=True, **kwargs): + r"""Densenet-121 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet121', 32, (6, 12, 24, 16), 64, pretrained, progress, + **kwargs) + + +def densenet161(pretrained=False, progress=True, **kwargs): + r"""Densenet-161 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet161', 48, (6, 12, 36, 24), 96, pretrained, progress, + **kwargs) + + +def densenet169(pretrained=False, progress=True, **kwargs): + r"""Densenet-169 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet169', 32, (6, 12, 32, 32), 64, pretrained, progress, + **kwargs) + + +def densenet201(pretrained=False, progress=True, **kwargs): + r"""Densenet-201 model from + `"Densely Connected Convolutional Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + memory_efficient (bool) - If True, uses checkpointing. Much more memory efficient, + but slower. Default: *False*. See `"paper" `_ + """ + return _densenet('densenet201', 32, (6, 12, 48, 32), 64, pretrained, progress, + **kwargs) diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/1p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/1p.json new file mode 100644 index 0000000..aef2e79 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/1p.json @@ -0,0 +1,32 @@ +{ + "board_id": "0x0000", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "1", + "server_num": "1", + "group_name": "", + "instance_count": "1", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "10.246.246.76" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0" + ], + "para_plane_nic_num": "1", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/2p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/2p.json new file mode 100644 index 0000000..b9cb713 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/2p.json @@ -0,0 +1,44 @@ +{ + "board_id": "0x0000", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "2", + "server_num": "1", + "group_name": "", + "instance_count": "2", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "10.246.246.76" + }, + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1" + ], + "para_plane_nic_num": "2", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/4p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/4p.json new file mode 100644 index 0000000..ed403c9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/4p.json @@ -0,0 +1,65 @@ +{ + "board_id": "0x0000", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "4", + "server_num": "1", + "group_name": "", + "instance_count": "4", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.190.102" + } + ], + "rank_id": "0", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.191.102" + } + ], + "rank_id": "1", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.192.102" + } + ], + "rank_id": "2", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.193.102" + } + ], + "rank_id": "3", + "server_id": "10.246.246.76" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3" + ], + "para_plane_nic_num": "4", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/8p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/8p.json new file mode 100644 index 0000000..c506a29 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/npu_config/8p.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "10.246.246.76" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "10.246.246.76" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/net_show_cpu.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/net_show_cpu.py new file mode 100644 index 0000000..a0a18c3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/net_show_cpu.py @@ -0,0 +1,40 @@ +import os + +import torch +import torch.nn as nn +from torch.utils.tensorboard import SummaryWriter +from torchvision import transforms +import torchvision.models as models + +""" +alexnet | densenet121 | +densenet161 | densenet169 | densenet201 | +resnet101 | resnet152 | resnet18 | resnet34 | +resnet50 | squeezenet1_0 | squeezenet1_1 | vgg11 | +vgg11_bn | vgg13 | vgg13_bn | vgg16 | vgg16_bn | vgg19 | +mobilenet_v2 | shufflenet_v2_x0_5 | +vgg19_bn (default: resnet18) +""" +model_name='densenet121' +model = models.__dict__[model_name]() + +img = torch.rand(size=(1,3,224,224)) + +#print(model(img)) + +labels = torch.rand(size=(1,)) +criterion = nn.CrossEntropyLoss() +with torch.autograd.profiler.profile(record_shapes=True) as prof: + outputs = model(img) + loss = criterion(outputs, labels) + with torch.autograd.profiler.record_function("label-bp"): + loss.backward() + +#print(prof.key_averages().table()) +print(prof) +prof.export_chrome_trace(model_name + ".prof") + + +with SummaryWriter(os.path.join('runs',model_name)) as w: + w.add_graph(model, img) + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/run_cpu.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/run_cpu.sh new file mode 100644 index 0000000..8efbefa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/cpu/run_cpu.sh @@ -0,0 +1,20 @@ +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export PYTHONPATH=/usr/local/Ascend/atc/python/site-packages/te.egg:/usr/local/Ascend/atc/python/site-packages/topi.egg:/usr/local/Ascend/atc/python/site-packages/auto_tune.egg:/usr/local/Ascend/atc/python/site-packages/schedule_search.egg:/usr/local +export CUSTOM_OP_LIB_PATH=/usr/local/Ascend/ops/framework/built-in/tensorflow +export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +export PLUGIN_LOAD_PATH=/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/librts_engine.so + +#export DEVICE_ID=0 +#export SLOG_PRINT_TO_STDOUT=1 + +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +#python3 pytorch-benchmark-resnet50.py +python3 net_show_cpu.py +#python3 pytorch-resnet50-profiling.py + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/npu/net_show_npu.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/npu/net_show_npu.py new file mode 100644 index 0000000..3c0e8bd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/code/tools/profile/npu/net_show_npu.py @@ -0,0 +1,51 @@ +import os + +import torch +import torch.nn as nn +from torch.utils.tensorboard import SummaryWriter +from torchvision import transforms +import torchvision.models as models + +CALCULATE_DEVICE = "npu:0" +torch.npu.set_device(CALCULATE_DEVICE) + +""" +alexnet | densenet121 | +densenet161 | densenet169 | densenet201 | +resnet101 | resnet152 | resnet18 | resnet34 | +resnet50 | squeezenet1_0 | squeezenet1_1 | vgg11 | +vgg11_bn | vgg13 | vgg13_bn | vgg16 | vgg16_bn | vgg19 | +mobilenet_v2 | shufflenet_v2_x0_5 | +vgg19_bn (default: resnet18) +""" + +img = torch.rand(size=(1,3,224,224),dtype=torch.float32).to(CALCULATE_DEVICE, non_blocking=True) +print("img prepared") + +model_name='densenet121' +model = models.__dict__[model_name]().to(CALCULATE_DEVICE) +model.train() +print("model prepared") + +outputs = model(img) +print("cal done, results is {}".format(outputs)) + +labels=torch.rand(size=(1,)).to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) +criterion = nn.CrossEntropyLoss().to(CALCULATE_DEVICE) +with torch.autograd.profiler.profile(record_shapes=True,use_npu=True) as prof: + outputs = model(img) + print("output ok") + loss = criterion(outputs, labels) + print("loss ok") + with torch.autograd.profiler.record_function("label-bp"): + loss.backward() + +#print(prof.key_averages().table()) +print(prof) +prof.export_chrome_trace(model_name + ".prof") + + +# with SummaryWriter(os.path.join('runs',model_name)) as w: +# w.add_graph(model, img) +# print("tenorboard add graph ok") + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/1p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/1p.json new file mode 100644 index 0000000..5669d75 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/1p.json @@ -0,0 +1,14 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [ + { + "device_id": "0", + "device_ip": "192.168.10.103", + "rank_id": "0" + }], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/__init__.py b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/hccl_sample.json b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/hccl_sample.json new file mode 100644 index 0000000..96ec094 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/npu_set_env.sh new file mode 100644 index 0000000..24ff126 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/npu_set_env.sh @@ -0,0 +1,52 @@ +# main env +export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe +export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:$LD_LIBRARY_PATH +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/ +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +export PLUGIN_LOAD_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/librts_engine.so +export TASK_QUEUE_ENABLE=0 +export CUSTOM_OP_LIB_PATH=/usr/local/Ascend/ascend-toolkit/20.10.0.B022/arm64-linux_gcc7.3.0/opp/framework/built-in/tensorflow/ + + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export GEN_TO_SOURCE=1 + + + + +#export LD_LIBRARY_PATH=/usr/local/OpenBLAS/lib/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu/ +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/opp + + +#export DDK_VERSION_FLAG=1.60.T17.B830 +#export NEW_GE_FE_ID=1 +#export GE_AICPU_FLAG=1 +#export SOC_VERSION=Ascend910 + +#export DUMP_GE_GRAPH=2 + + +#export DEVICE_ID=0 +#export DEVICE_INDEX=0 + +#export PRINT_MODEL=0 +#export ENABLE_DATA_PRE_PROC=1 +#export RANK_ID=0 +#export RANK_SIZE=1 +#export JOB_ID=10087 +#export FUSION_TENSOR_SIZE=1000000000 +#PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe + +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe + + +#export CUSTOM_OP_LIB_PATH=/usr/local/Ascend/ascend-toolkit/20.10.0.B023/arm64-linux_gcc7.3.0/opp/framework/built-in/tensorflow/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PLUGIN_LOAD_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/librts_engine.so +#export WHICH_OP=GEOP +#export NEW_GE_FE_ID=1 +#export GE_AICPU_FLAG=1 + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env.sh new file mode 100644 index 0000000..6bd8f33 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env.sh @@ -0,0 +1,9 @@ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export SLOG_PRINT_TO_STDOUT=0 + +export TASK_QUEUE_ENABLE=0 diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b020.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b020.sh new file mode 100644 index 0000000..ed79fb6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b020.sh @@ -0,0 +1,21 @@ +############## toolkit situation ################ +#export ASCEND_HOME=/usr/local/Ascend +#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +############## nnae situation ################ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/local/python3.7.5/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/hccl +export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + +# pip3.7 install --upgrade /usr/local/Ascend/nnae/latest/fwkacllib/lib64/topi-0.4.0-py3-none-any.whl +# pip3.7 install --upgrade /usr/local/Ascend/nnae/latest/fwkacllib/lib64/te-0.4.0-py3-none-any.whl + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=0 diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b023.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b023.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/config/set_env_b023.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/eval.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/eval.sh new file mode 100644 index 0000000..16d5c5e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/eval.sh @@ -0,0 +1,22 @@ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export SLOG_PRINT_TO_STDOUT=0 +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 7" + +export TASK_QUEUE_ENABLE=0 +taskset -c 111-150 python3 densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 7 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --batch-size 256 \ + --epoch 90 \ + --evaluate \ + --resume checkpoint.pth.tar \ + --data /opt/npu/dataset/imagenet \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/run.sh new file mode 100644 index 0000000..dfeef3e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/run.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name=$(cd $currentDir/..;basename `pwd`) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +# 清除旧日志 +rm -rf /var/log/npu/slog/host-0/* +rm -rf ${currentDir}/result/*.log + +#mkdir train job path +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + this_ip=$(hostname -I |awk '{print $1}') + ln -snf ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/0/hw_densenet121.log ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp ${jsonFilePath} root@$ip:${jsonFilePath} + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + rank_id=0 + #for device_id in $device_group;do + ln -snf ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/${first_device_id}/hw_densenet121.log ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + # let rank_id++ + # done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/train.sh new file mode 100644 index 0000000..f79439f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/pytorch/scripts/train.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_densenet121/training_job_${currtime}/ + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +export REMARK_LOG_FILE=hw_densenet121.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + +#source ${currentDir}/config/npu_set_env.sh +source ${currentDir}/config/set_env_b023.sh +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export HCCL_RANK_TABLE_PATH=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + # 多卡多机 + export CLUSTER=True +fi + +if [ x"${mode}" == x"evaluate" ];then + taskset -c 111-150 python3.7 ${currentDir}/code/densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 7 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --batch-size 256 \ + --epoch 90 \ + --evaluate \ + --resume checkpoint.pth.tar \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 + + +elif [ x"${rank_size}" == x"1" ];then + # 单卡 + #source ${currentDir}/config/set_env_b023.sh + + taskset -c 1-40 python3.7 ${currentDir}/code/densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu ${device_single} \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --batch-size ${batch_size} \ + --epoch ${epoches} \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 + +elif [ ${rank_size} -le 8 ];then + # 单机多卡 + #source ${currentDir}/config/set_env_b023.sh + python3.7 ${currentDir}/code/densenet121_8p_main.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed 49 \ + --workers 160 \ + --lr ${lr} \ + --print-freq 1 \ + --eval-freq 5\ + --arch densenet121 \ + --dist-url 'tcp://127.0.0.1:50000' \ + --dist-backend 'hccl' \ + --multiprocessing-distributed \ + --world-size 1 \ + --batch-size ${batch_size} \ + --epochs ${epoches} \ + --rank 0 \ + --amp \ + --benchmark 0 \ + --device-list ${device_group_multi} \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 + +fi + +#taskset -c 0-20 python3.7 ${currentDir}/code/densenet121.py > ./train.log 2>&1 + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 densenet121 train success" + echo ":::ABK 1.0.0 densenet121 train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 densenet121 train success" >> ./hw_densenet121.log +else + echo ":::ABK 1.0.0 densenet121 train failed" + echo ":::ABK 1.0.0 densenet121 train failed" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 densenet121 train failed" >> ./hw_densenet121.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 densenet121 train total time: ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_densenet121.log diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/README.md new file mode 100644 index 0000000..3b6b1d5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/README.md @@ -0,0 +1,46 @@ +# DenseNet121_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/DenseNet121.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + # 基本参数 + data_url: 数据集路径 + epoches: 跑多少个epoch + epochs_between_evals: 1 + batch_size: 32 + log_dir: ./ckpt + + # 1p参数 + mode_1p: train # train、evaluate、train_and_evaluate三种模式 + max_train_steps_1p: 100 + iterations_per_loop_1p: 10 + display_every: 10 + log_name_1p: densenet121_1p.log + + # 8p参数 + mode_8p: train_and_evaluate # train、evaluate、train_and_evaluate三种模式 + iterations_per_loop_8p: 5004 + lr: 0.1 + log_name_8p: densenet121_8p.log + + mpirun_ip: 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + docker_image:docker 镜像名称:版本号 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/create_session.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/create_session.py new file mode 100644 index 0000000..781356d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/create_session.py @@ -0,0 +1,22 @@ +import tensorflow as tf +import os,sys + + +class CreateSession(): + def __init__(self): + self.estimator_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True) + + self.estimator_config.gpu_options.allow_growth = True + + self.set_env() + + def set_env(self): + gpu_thread_count = 2 + os.environ['TF_GPU_THREAD_MODE'] = 'gpu_private' + os.environ['TF_GPU_THREAD_COUNT'] = str(gpu_thread_count) + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1' + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/data_loader.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/data_loader.py new file mode 100644 index 0000000..4c4a803 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/data_loader.py @@ -0,0 +1,133 @@ +import numpy as np +import preprocessing +import tensorflow as tf +from tensorflow.python.util import nest +import os,sys +import numpy as np + + +class DataLoader: + + def __init__(self, args): + self.args = args + + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames_train = sorted(tf.gfile.Glob(filename_pattern % 'train')) + self.num_training_samples = get_num_records(filenames_train) + self.args.num_training_samples = self.num_training_samples + + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames_val = sorted(tf.gfile.Glob(filename_pattern % 'validation')) + self.num_evaluating_samples = get_num_records(filenames_val) + self.args.num_evaluating_samples = self.num_evaluating_samples + + print( 'total num_training_sampels: %d' % self.num_training_samples ) + print( 'total num_evaluating_sampels: %d' % self.num_evaluating_samples ) + + self.training_samples_per_rank = self.num_training_samples + + def get_train_input_fn(self): + take_count = self.training_samples_per_rank + + return make_dataset(self.args, take_count, self.args.batch_size, training=True) + + def get_eval_input_fn(self): + take_count = self.num_evaluating_samples + + return make_dataset(self.args, take_count, self.args.batch_size, training=False) + + +def get_num_records(filenames): + def count_records(tf_record_filename): + count = 0 + for _ in tf.python_io.tf_record_iterator(tf_record_filename): + count += 1 + return count + + nfile = len(filenames) + return (count_records(filenames[0]) * (nfile - 1) + + count_records(filenames[-1])) + + +def _parse_example_proto(example_serialized): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.FixedLenFeature([], dtype=tf.int64, default_value=-1), + 'image/class/text': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.parse_single_example(example_serialized, feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(bbox, [0, 2, 1]) + + return features['image/encoded'], label, bbox + + +# since the preprocessing is done here, we add args file +def parse_record(raw_record, is_training): + image_buffer, label, bbox = _parse_example_proto(raw_record) + + image = preprocessing.parse_and_preprocess_image_record(image_buffer, bbox, training=is_training) + + # label-1 for VGG16 + return image, label-1 + + +def make_dataset(args, take_count, batch_size, + training=False, shard=False): + + shuffle_buffer_size = 10000 + num_readers = 10 + + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('DEVICE_INDEX')) + + if training: + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'train')) + else: + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'validation')) + + ds = tf.data.Dataset.from_tensor_slices(filenames) + + if not training: + ds = ds.take(take_count) + + if training: + ds = ds.shuffle(1000, seed=7*(1+rank_id)) + + ds = ds.interleave(tf.data.TFRecordDataset, cycle_length=num_readers, block_length=1) + counter = tf.data.Dataset.range(sys.maxsize) + ds = tf.data.Dataset.zip((ds, counter)) + + if training: + ds = ds.apply(tf.data.experimental.shuffle_and_repeat(shuffle_buffer_size, seed=5*(1+rank_id))) + + ds = ds.map(lambda image, counter: parse_record(image, training), num_parallel_calls=14) + + ds = ds.batch(batch_size, drop_remainder=True) + return ds + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/densenet.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/densenet.py new file mode 100644 index 0000000..0a83ea4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/densenet.py @@ -0,0 +1,158 @@ +import tensorflow as tf +from tensorflow.contrib.layers import batch_norm, flatten +from tensorflow.contrib.framework import arg_scope +import numpy as np + +class_num = 1000 +nb_blocks = 4 +nb_blocks_layers = (6, 12, 24, 16) +bn_size = 4 +growth_rate = 32 +init_layers = 64 + + +''' +denseNet:121,169,201,264 +return _densenet('densenet121', 32, (6, 12, 24, 16), 64, pretrained, progress, + **kwargs) +return _densenet('densenet161', 48, (6, 12, 36, 24), 96, pretrained, progress, + **kwargs) +return _densenet('densenet169', 32, (6, 12, 32, 32), 64, pretrained, progress, + **kwargs) +return _densenet('densenet201', 32, (6, 12, 48, 32), 64, pretrained, progress, + **kwargs) +''' + + + +def conv_layer(input, filter, kernel, stride=1, layer_name="conv"): + with tf.name_scope(layer_name): + network = tf.layers.conv2d(inputs=input, filters=filter, kernel_size=kernel, strides=stride, padding='SAME', use_bias=False, kernel_initializer=tf.initializers.variance_scaling(scale=5.0, mode='fan_out')) # scale=5.0, mode='fan_out' + return network + +def Global_Average_Pooling(x, stride=1): + + width = np.shape(x)[1] + height = np.shape(x)[2] + pool_size = [width, height] + return tf.layers.average_pooling2d(inputs=x, pool_size=pool_size, strides=stride) # The stride value does not matter + #It is global average pooling without tflearn + + + #return global_avg_pool(x, name='Global_avg_pooling') + # But maybe you need to install h5py and curses or not + + +def Batch_Normalization(x, training, scope): + with arg_scope([batch_norm], + scope=scope, + updates_collections=None, + decay=0.9, + center=True, + scale=True, + zero_debias_moving_mean=True) : + training = tf.cast(training, tf.bool) + return tf.cond(training, + lambda : batch_norm(inputs=x, is_training=training, reuse=None), + lambda : batch_norm(inputs=x, is_training=training, reuse=True)) + +def Drop_out(x, rate, training) : + return tf.layers.dropout(inputs=x, rate=rate, training=training) + +def Relu(x): + return tf.nn.relu(x) + +def Average_pooling(x, pool_size=[2,2], stride=2, padding='VALID'): + return tf.layers.average_pooling2d(inputs=x, pool_size=pool_size, strides=stride, padding=padding) + + +def Max_Pooling(x, pool_size=[3,3], stride=2, padding='VALID'): + return tf.layers.max_pooling2d(inputs=x, pool_size=pool_size, strides=stride, padding=padding) + +def Concatenation(layers): + return tf.concat(layers, axis=3) + +def Linear(x): + return tf.layers.dense(inputs=x, units=class_num, name='linear') + + +def bottleneck_layer(x, is_training, scope): + # print(x) + with tf.name_scope(scope): + x = Batch_Normalization(x, training=is_training, scope=scope+'_batch1') + x = Relu(x) + x = conv_layer(x, filter= growth_rate*bn_size, kernel=[1,1], layer_name=scope+'_conv1') + #x = Drop_out(x, rate=dropout_rate, training=is_training) + #x = Drop_out(x, rate=dropout_rate, training=is_training) + + x = Batch_Normalization(x, training=is_training, scope=scope+'_batch2') + x = Relu(x) + x = conv_layer(x, filter= growth_rate, kernel=[3,3], layer_name=scope+'_conv2') + #x = Drop_out(x, rate=dropout_rate, training=self.training) + + # print(x) + + return x + +def transition_layer(x, is_training, scope): + with tf.name_scope(scope): + x = Batch_Normalization(x, training=is_training, scope=scope+'_batch1') + x = Relu(x) + # x = conv_layer(x, filter=self.filters, kernel=[1,1], layer_name=scope+'_conv1') + + # https://github.com/taki0112/Densenet-Tensorflow/issues/10 + + in_channel = int(x.shape[-1]) + x = conv_layer(x, filter=in_channel*0.5, kernel=[1,1], layer_name=scope+'_conv1') + #x = Drop_out(x, rate=dropout_rate, training=self.training) + x = Average_pooling(x, pool_size=[2,2], stride=2) + + return x + +def dense_block(input_x, nb_layers, is_training, layer_name): + with tf.name_scope(layer_name): + layers_concat = list() + layers_concat.append(input_x) + + x = bottleneck_layer(input_x, is_training, scope=layer_name + '_bottleN_' + str(0)) + + layers_concat.append(x) + + for i in range(nb_layers - 1): + x = Concatenation(layers_concat) + x = bottleneck_layer(x, is_training, scope=layer_name + '_bottleN_' + str(i + 1)) + layers_concat.append(x) + + x = Concatenation(layers_concat) + + return x + +def Dense_net(input_x, is_training): + x = conv_layer(input_x, filter=init_layers , kernel=[7,7], stride=2, layer_name='conv0') + x = Max_Pooling(x, pool_size=[3,3], stride=2) + + for i in range(nb_blocks-1) : + # 6 -> 12 -> 48 + x = dense_block(input_x=x, nb_layers=nb_blocks_layers[i], is_training=is_training, layer_name='dense_'+str(i)) + x = transition_layer(x, is_training, scope='trans_'+str(i)) + + """ + x = self.dense_block(input_x=x, nb_layers=6, layer_name='dense_1') + x = self.transition_layer(x, scope='trans_1') + x = self.dense_block(input_x=x, nb_layers=12, layer_name='dense_2') + x = self.transition_layer(x, scope='trans_2') + x = self.dense_block(input_x=x, nb_layers=48, layer_name='dense_3') + x = self.transition_layer(x, scope='trans_3') + """ + + x = dense_block(input_x=x, nb_layers=nb_blocks_layers[nb_blocks-1], is_training=is_training, layer_name='dense_final') + + # 100 Layer + x = Batch_Normalization(x, training=is_training, scope='linear_batch') + x = Relu(x) + x = Global_Average_Pooling(x) + x = flatten(x) + x = Linear(x) + + # x = tf.reshape(x, [-1, 10]) + return x diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/hyper_param.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/hyper_param.py new file mode 100644 index 0000000..5c014c4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/hyper_param.py @@ -0,0 +1,44 @@ +import tensorflow as tf +import math +import numpy as np + +def warmup_cosine_annealing_lr(lr, steps_per_epoch, warmup_epochs, max_epoch, T_max, eta_min=0): + base_lr = lr + warmup_init_lr = 0 + total_steps = int(max_epoch * steps_per_epoch) + warmup_steps = int(warmup_epochs * steps_per_epoch) + + lr_each_step = [] + for i in range(total_steps): + last_epoch = i // steps_per_epoch + if i < warmup_steps: + lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr) + else: + lr = eta_min + (base_lr - eta_min) * (1. + math.cos(math.pi*last_epoch / T_max)) / 2 + lr_each_step.append(lr) + + return np.array(lr_each_step).astype(np.float32) + + +class HyperParams: + def __init__(self, args): + self.args=args + nsteps_per_epoch = self.args.num_training_samples // self.args.global_batch_size + self.args.nsteps_per_epoch = nsteps_per_epoch + if self.args.max_epochs: + nstep = nsteps_per_epoch * self.args.max_epochs + else: + nstep = self.args.max_train_steps + self.args.nstep = nstep + + self.cos_lr = warmup_cosine_annealing_lr(self.args.lr, nsteps_per_epoch, 0, self.args.T_max, self.args.T_max, 0.0) + + def get_learning_rate(self): + global_step = tf.train.get_global_step() + + learning_rate = tf.gather(tf.convert_to_tensor(self.cos_lr), global_step) + + learning_rate = tf.identity(learning_rate, 'learning_rate') + + return learning_rate + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/layers.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/layers.py new file mode 100644 index 0000000..c144c97 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/layers.py @@ -0,0 +1,25 @@ +import tensorflow as tf +#from tensorflow.contrib.hccl.python.ops import hccl_ops +#from npu_bridge.hccl import hccl_ops +from benchmark_log import hwlog + +class Layers: + def get_accuracy(self, labels, predicted_classes, logits, args): + accuracy = tf.metrics.accuracy( + labels=labels, predictions=predicted_classes) + top5acc = tf.metrics.mean( + tf.cast(tf.nn.in_top_k(logits, labels, 5), tf.float32)) + if args.rank_size == 1: + newaccuracy = (accuracy[0], accuracy[1]) + newtop5acc = (top5acc[0], top5acc[1]) + else: + from npu_bridge.hccl import hccl_ops + newaccuracy = (hccl_ops.allreduce(accuracy[0],"sum")/args.rank_size, accuracy[1]) + newtop5acc = (hccl_ops.allreduce(top5acc[0],"sum")/args.rank_size, top5acc[1]) + metrics = {'val-top1acc': newaccuracy, 'val-top5acc': newtop5acc} + + return metrics + + + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/logger.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/logger.py new file mode 100644 index 0000000..d0a1a69 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/logger.py @@ -0,0 +1,92 @@ +from __future__ import print_function +import tensorflow as tf +from benchmark_log import hwlog +import logging +import numpy as np +import time +import sys,os + +class LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, args, warmup_steps=5): + self.global_batch_size = args.global_batch_size + if args.iterations_per_loop is not None: + self.iterations_per_loop = args.iterations_per_loop + else: + self.iterations_per_loop = args.nsteps_per_epoch + self.warmup_steps = warmup_steps + self.iter_times = [] + self.num_records = args.num_training_samples + self.display_every = args.display_every + self.logger = get_logger(args.log_name, args.log_dir) + rank0log(self.logger, 'PY' + str(sys.version) + 'TF' + str(tf.__version__)) + + + + def after_create_session(self, session, coord): + rank0log(self.logger, 'Step Epoch Speed Loss FinLoss LR') + self.elapsed_secs = 0. + self.count = 0 + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=[tf.train.get_global_step(), 'loss:0', 'total_loss:0', 'learning_rate:0']) + + def after_run(self, run_context, run_values): + batch_time = time.time() - self.t0 + self.iter_times.append(batch_time) + self.elapsed_secs += batch_time + self.count += 1 + global_step, loss, total_loss, lr = run_values.results + if global_step == 1 or global_step % self.display_every == 0: + dt = self.elapsed_secs / self.count + img_per_sec = self.global_batch_size * self.iterations_per_loop / dt + epoch = global_step * self.global_batch_size / self.num_records + self.logger.info('step:%6i epoch:%5.1f FPS:%7.1f loss:%6.3f total_loss:%6.3f lr:%7.5f' % + (global_step, epoch, img_per_sec, loss, total_loss, lr)) + self.elapsed_secs = 0. + self.count = 0 + + # add by wx983399 + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=int(global_step)) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=epoch) + hwlog.remark_print(key=hwlog.FPS, value=img_per_sec) + + def get_average_speed(self): + avg_time = np.mean(self.iter_times[self.warmup_steps:]) + speed = self.global_batch_size / avg_time + return speed + + + +def rank0log(logger, *args, **kwargs): + if logger: + logger.info(''.join([str(x) for x in list(args)])) + else: + print(*args, **kwargs) + + +def get_logger(log_name, log_dir): + logger = logging.getLogger(log_name) + logger.setLevel(logging.INFO) # INFO, ERROR + # file handler which logs debug messages + if not os.path.isdir(log_dir): + try: + os.makedirs(log_dir) + except FileExistsError: + # if log_dir is common for multiple ranks like on nfs + pass + # console handler + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + # add formatter to the handlers + formatter = logging.Formatter('%(message)s') + ch.setFormatter(formatter) + logger.addHandler(ch) + fh = logging.FileHandler(os.path.join(log_dir, log_name)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(formatter) + # add handlers to logger + logger.addHandler(fh) + return logger + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/model.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/model.py new file mode 100644 index 0000000..dae298c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/model.py @@ -0,0 +1,72 @@ +import tensorflow as tf +from densenet import Dense_net + + +class Model(object): + def __init__(self, args, data, hyper_param, layers, logger): + self.args = args + self.data = data + self.hyper_param = hyper_param + self.layers = layers + self.logger = logger + + def get_estimator_model_func(self, features, labels, mode, params=None): + labels = tf.reshape(labels, (-1,)) # Squash unnecessary unary dim #----------------not use when use onehot label + + inputs = features # TODO: Should be using feature columns? + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + inputs = tf.cast(inputs, self.args.dtype) + + top_layer = Dense_net(inputs, is_training) + + logits = top_layer + predicted_classes = tf.argmax(logits, axis=1, output_type=tf.int32) + logits = tf.cast(logits, tf.float32) + + labels_one_hot = tf.one_hot(labels, depth=1000) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot, label_smoothing=self.args.label_smoothing) + + + base_loss = tf.identity(loss, name='loss') # For access by logger (TODO: Better way to access it?) + + l2_loss = tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()]) + l2_loss = tf.multiply(l2_loss, self.args.weight_decay) + total_loss = base_loss + l2_loss + + total_loss = tf.identity(total_loss, name = 'total_loss') + + if mode == tf.estimator.ModeKeys.EVAL: + with tf.device(None): + metrics = self.layers.get_accuracy( labels, predicted_classes, logits, self.args) + + return tf.estimator.EstimatorSpec( + mode, loss=loss, eval_metric_ops=metrics) + + assert (mode == tf.estimator.ModeKeys.TRAIN) + + batch_size = tf.shape(inputs)[0] + + global_step = tf.train.get_global_step() + learning_rate = self.hyper_param.get_learning_rate() + + momentum = self.args.momentum + + opt = tf.train.MomentumOptimizer( + learning_rate, momentum, use_nesterov=self.args.use_nesterov) + + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + opt = NPUDistributedOptimizer(opt) + + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + + with tf.control_dependencies(update_ops): + gate_gradients = tf.train.Optimizer.GATE_NONE + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + train_op = opt.apply_gradients(grads_and_vars, global_step=global_step) + + train_op = tf.group(train_op) + + return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op) + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/preprocessing.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/preprocessing.py new file mode 100644 index 0000000..4ae0b90 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/preprocessing.py @@ -0,0 +1,72 @@ +import tensorflow as tf +from tensorflow.contrib.image.python.ops import distort_image_ops +import math +import random + +def decode_jpeg(imgdata, channels=3): + return tf.image.decode_jpeg(imgdata, channels=channels, + fancy_upscaling=False, + dct_method='INTEGER_FAST') + + +def random_horizontal_flip(image, prob): + if prob > random.random(): + image = tf.image.flip_left_right(image) + return image + + +def decode_crop_and_resize(record, bbox, size, scale, ratio): + with tf.name_scope('decode_crop_and_resize'): + height = 224 + width = 224 + crop_ratio = 0.8 + initial_shape = [int(round(height / crop_ratio)), + int(round(width / crop_ratio)), 3] + jpeg_shape = tf.image.extract_jpeg_shape( record ) + + bbox_begin, bbox_size, bbox = \ + tf.image.sample_distorted_bounding_box( + tf.image.extract_jpeg_shape(record), + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=ratio, + area_range=scale, + max_attempts=10, + use_image_if_no_bounding_boxes=True) + + # Reassemble the bounding box in the format the crop op requires. + offset_y, offset_x, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_y, offset_x, target_height, target_width]) + + image = tf.image.decode_and_crop_jpeg( record, crop_window, channels=3 ) + image = tf.image.resize_images( image, [height, width] ) + + return image + + +def parse_and_preprocess_image_record(record, bbox, training): + with tf.name_scope('preprocess'): + if training: + image = decode_crop_and_resize(record, bbox, 224, (0.08, 1.0), (0.75, 1.333)) + image = random_horizontal_flip(image, 0.5) + image = normalize(image) + else: + image = decode_jpeg(record, channels=3) + image = tf.image.resize_images(image, [256, 256]) + image = tf.image.central_crop(image, 224.0/256) + image = normalize(image) + + return image + + +def normalize(inputs): + imagenet_mean = [0.485 * 255, 0.456 * 255, 0.406 * 255] + imagenet_std = [0.229 * 255, 0.224 * 255, 0.225 * 255] + imagenet_mean = tf.expand_dims(tf.expand_dims(imagenet_mean, 0), 0) + imagenet_std = tf.expand_dims(tf.expand_dims(imagenet_std, 0), 0) + inputs = inputs - imagenet_mean + inputs = inputs * (1.0 / imagenet_std) + + return inputs + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train.py new file mode 100644 index 0000000..16b3eac --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train.py @@ -0,0 +1,140 @@ +import tensorflow as tf +import numpy as np +import os +import sys +import ast +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../'))) +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../config'))) +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../../utils'))) +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../../utils/atlasboost'))) + +import data_loader as dl + +import model as ml +import hyper_param as hp +import layers as ly +import logger as lg +import trainer as tr +import create_session as cs +import argparse + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + + +def parse_args(): + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + + parser.add_argument('--rank_size', default=1,type=int, + help="""number of NPUs to use.""") + + # mode and parameters related + parser.add_argument('--mode', default='train_and_evaluate', + help="""mode to run the program e.g. train, evaluate, and + train_and_evaluate""") + parser.add_argument('--max_train_steps', default=100,type=int, + help="""train steps for one NPU""") + parser.add_argument('--iterations_per_loop', default=10, type=int, + help="""the number of steps in devices for each iteration""") + parser.add_argument('--max_epochs', default=None, type=int, + help="""total epochs for training""") + parser.add_argument('--epochs_between_evals', default=5, type=int, + help="""the interval between train and evaluation , only meaningful + when the mode is train_and_evaluate""") + + # dataset + parser.add_argument('--data_dir', default='path/data', + help="""directory to data.""") + + # path for evaluation + parser.add_argument('--eval_dir', default='path/eval', + help="""directory to evaluate.""") + + parser.add_argument('--dtype', default=tf.float32, + help="""data type of inputs.""") + parser.add_argument('--use_nesterov', default=True, type=ast.literal_eval, + help=""" used in optimizer""") + parser.add_argument('--label_smoothing', default=0.1, type=float, + help="""label smoothing factor""") + parser.add_argument('--weight_decay', default=0.0001, + help="""weight decay""") + parser.add_argument('--batch_size', default=32, type=int, + help="""batch size for one NPU""") + + # learning rate and momentum + parser.add_argument('--lr', default=0.1, type=float, + help="""learning rate""") + parser.add_argument('--T_max', default=150, type=int, + help="""T_max for cosing_annealing learning rate""") + parser.add_argument('--momentum', default=0.9, type=float, + help="""momentum used in optimizer.""") + + # display frequency + parser.add_argument('--display_every', default=1, type=int, + help="""the frequency to display info""") + + # log file + parser.add_argument('--log_name', default='densenet121_training.log', + help="""name of log file""") + parser.add_argument('--log_dir', default='./model_1p', + help="""log directory""") + + args, unknown_args = parser.parse_known_args() + # ['--config_file', 'densenet_config_1p_npu'] + + print(args, unknown_args) + if len(unknown_args) > 0: + for bad_arg in unknown_args: + print("ERROR: Unknown command line arg: %s" % bad_arg) + raise ValueError("Invalid command line arg(s)") + + return args + + +def main(): + + args = parse_args() + args.global_batch_size = args.batch_size * args.rank_size + + session = cs.CreateSession() + data = dl.DataLoader(args) + hyper_param = hp.HyperParams(args) + layers = ly.Layers() + logger = lg.LogSessionRunHook(args) + model = ml.Model(args, data, hyper_param, layers, logger) + + trainer = tr.Trainer(session, args, data, model, logger) + + if args.mode == 'train': + trainer.train() + elif args.mode == 'evaluate': + trainer.evaluate() + elif args.mode == 'train_and_evaluate': + trainer.train_and_evaluate() + else: + raise ValueError("Invalid mode.") + + +if __name__ == '__main__': + + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.128, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, + "batchsize": 32} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + main() + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train_helper.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train_helper.py new file mode 100644 index 0000000..2674c3e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/train_helper.py @@ -0,0 +1,22 @@ +import tensorflow as tf +from tensorflow.python.ops import data_flow_ops +import re +import os +from operator import itemgetter + + +def sort_and_load_ckpts(log_dir): + ckpts = [] + for f in os.listdir(log_dir): + m = re.match(r'model.ckpt-([0-9]+).index', f) + if m is None: + continue + fullpath = os.path.join(log_dir, f) + ckpts.append({'step': int(m.group(1)), + 'path': os.path.splitext(fullpath)[0], + 'mtime': os.stat(fullpath).st_mtime, + }) + ckpts.sort(key=itemgetter('step')) + return ckpts + + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/trainer.py b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/trainer.py new file mode 100644 index 0000000..c27a9ec --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/code/trainer.py @@ -0,0 +1,128 @@ +import tensorflow as tf +import math +import time +import os +import train_helper +from logger import rank0log +from benchmark_log import hwlog + +class Trainer(object): + def __init__(self, session, args, data, model, logger): + self.sess = session + self.args = args + self.data = data + self.model = model + self.logger = logger + self.print_logger = self.logger.logger + self.all_preds = [] + self.all_targets = [] + + self.classifier, self.training_hook = self.get_npu_classifier() + + def get_npu_classifier(self): + from npu_bridge.estimator.npu.npu_config import NPURunConfig + from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + + run_config = NPURunConfig( + hcom_parallel=True, + precision_mode="allow_mix_precision", + enable_data_pre_proc=True, + save_checkpoints_steps=self.args.nsteps_per_epoch, + session_config=self.sess.estimator_config, + model_dir=self.args.log_dir, + iterations_per_loop=self.args.iterations_per_loop, + keep_checkpoint_max=5) + + classifier =NPUEstimator( + model_fn= self.model.get_estimator_model_func, + config= run_config + ) + + training_hooks = [] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def train(self): + print ('training steps: %d' % self.args.nstep) + self.classifier.train( input_fn=lambda:self.data.get_train_input_fn(), + max_steps = self.args.nstep, + hooks = self.training_hook + ) + + def evaluate(self): + rank0log(self.print_logger, "Evaluating") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.args.num_evaluating_samples)) + time.sleep(5) # a little extra margin... + try: + ckpts = train_helper.sort_and_load_ckpts(self.args.eval_dir) + print("=========ckpt==========") + print(ckpts) + print("=========ckpt==========") + for i, c in enumerate(ckpts): + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + c['epoch'] = math.ceil(c['step'] / (self.args.num_training_samples/ (self.args.batch_size))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + for i, c in enumerate(ckpts): + if 'top1' not in c: + continue + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + rank0log(self.print_logger, "Finished evaluation") + except KeyboardInterrupt: + self.print_logger.error("Keyboard interrupt") + + def train_and_evaluate(self): + epochs_between_evals = self.args.epochs_between_evals + + for i in range(self.args.max_epochs // epochs_between_evals): + + rank0log(self.print_logger, "Starting a training cycle") + + self.classifier.train(input_fn=lambda:self.data.get_train_input_fn(), + steps = self.args.nsteps_per_epoch*epochs_between_evals, + hooks = self.training_hook ) + + rank0log(self.print_logger, "Starting to evaluate") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.args.num_evaluating_samples)) + time.sleep(5) # a little extra margin... + + ckpts = train_helper.sort_and_load_ckpts(self.args.log_dir) + c = ckpts[-1] + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + # top1 top5 Log dotting + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top5acc"))) + + + c['epoch'] = math.ceil(c['step'] / (self.args.num_training_samples / (self.args.batch_size * self.args.rank_size))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/1p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/1p.json new file mode 100644 index 0000000..c1b3e8e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/1p.json @@ -0,0 +1,23 @@ +{ + "group_count": "1", + "group_list": [ + { + "group_name": "worker", + "device_count": "1", + "instance_count": "1", + "instance_list": [ + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.193.103" + } + ], + "pod_name": "npu1p", + "server_id": "127.0.0.1" + } + ] + } + ], + "status": "completed" +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/8p.json b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/8p.json new file mode 100644 index 0000000..421197d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/8p.json @@ -0,0 +1,51 @@ +{ + "group_count": "1", + "group_list": [ + { + "group_name": "worker", + "device_count": "8", + "instance_count": "1", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.190.102" + }, + { + "device_id": "1", + "device_ip": "192.168.191.102" + }, + { + "device_id": "2", + "device_ip": "192.168.192.102" + }, + { + "device_id": "3", + "device_ip": "192.168.193.102" + }, + { + "device_id": "4", + "device_ip": "192.168.190.103" + }, + { + "device_id": "5", + "device_ip": "192.168.191.103" + }, + { + "device_id": "6", + "device_ip": "192.168.192.103" + }, + { + "device_id": "7", + "device_ip": "192.168.193.103" + } + ], + "pod_name": "npu8p", + "server_id": "127.0.0.1" + } + ] + } + ], + "status": "completed" +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..96ec094 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..092c803 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/config/npu_set_env.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +rm -rf /var/log/npu/slog/host-0/* +#安装toolkit +#export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +#安装nnae等 +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=/home/train/resnet50_tf/code:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/opp/op_impl/built-in/ai_core/tbe/:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/fwkacllib/python/site-packages/te/:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/fwkacllib/python/site-packages/topi/:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/fwkacllib/python/site-packages/hccl/:/usr/local/Ascend/tfplugin/latest/x86_64-linux_gcc7.3.0/tfplugin/python/site-packages/:/usr/local/Ascend/tfplugin/latest/x86_64-linux_gcc7.3.0/tfplugin/python/site-packages/npu_bridge:/code +#export PATH=$PATH:/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/fwkacllib/ccec_compiler/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/x86_64-linux_gcc7.3.0/opp/ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export DDK_VERSION_FLAG=1.60.T17.B830 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 + +export SLOG_PRINT_TO_STDOUT=0 + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/run.sh new file mode 100644 index 0000000..4f278c2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/run.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name=$(cd $currentDir/..;basename `pwd`) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +if [ $? -eq 0 ] ; +then + echo "modify inner config file success" +else + echo "modify inner config file fail" + exit 1 +fi + +#mkdir train job path +currtime=`date +%Y%m%d%H%M%S` + +mkdir -p ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/0/hw_densenet121.log ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp ${jsonFilePath} root@$ip:${jsonFilePath} + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/${first_device_id}/hw_densenet121.log ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ + rank_id=0 + for device_id in $device_group;do + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +fi +wait + +#echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train exit " >> ${currentDir}/result/main.log + diff --git a/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/train.sh new file mode 100644 index 0000000..a77062c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/DenseNet121/tensorflow/scripts/train.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name="densenet121" +currtime=$4 +toolsPath=$5 + +export YAML_PATH=$3 + + +mkdir -p ${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_densenet121/training_job_${currtime}/ + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +export REMARK_LOG_FILE=hw_densenet121.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +source ${currentDir}/config/npu_set_env.sh + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + # 多卡多机 + export CLUSTER=True + python3.7 ${currentDir}/code/train.py --rank_size=${rank_size} --mode=${mode_8p} --max_epochs=${epoches} --iterations_per_loop=${iterations_per_loop_8p} --epochs_between_evals=${epochs_between_evals} --data_dir=${data_url} --lr=${lr} --log_dir=${log_dir} --log_name=${log_name_8p} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ x"${rank_size}" == x"1" ];then + # 单卡 + python3.7 ${currentDir}/code/train.py --rank_size=${rank_size} --mode=${mode_1p} --max_train_steps=${max_train_steps_1p} --iterations_per_loop=${iterations_per_loop_1p} --data_dir=${data_url} --display_every=${display_every} --log_dir=${log_dir} --log_name=${log_name_1p} > ${train_job_dir}/train_${device_id}.log 2>&1 + +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + + python3.7 ${currentDir}/code/train.py --rank_size=${rank_size} --mode=${mode_8p} --max_epochs=${epoches} --iterations_per_loop=${iterations_per_loop_8p} --epochs_between_evals=${epochs_between_evals} --data_dir=${data_url} --lr=${lr} --log_dir=${log_dir} --log_name=${log_name_8p} > ${train_job_dir}/train_${device_id}.log 2>&1 +fi + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 densenet121 train success" + echo ":::ABK 1.0.0 densenet121 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 densenet121 train success" >> ./hw_densenet121.log +else + echo ":::ABK 1.0.0 densenet121 train failed" + echo ":::ABK 1.0.0 densenet121 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 densenet121 train failed" >> ./hw_densenet121.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 densenet121 train total time: ${hour}:${min}:${sec}" +echo ":::ABK 1.0.0 densenet121 train total time: ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_densenet121.log diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/README.md b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/README.md new file mode 100644 index 0000000..654c128 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/README.md @@ -0,0 +1,25 @@ +# EfficientNet_pytorch训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/EfficientNet.yaml中修改相应配置, 配置项含义: + +``` +pytorch_config: + data_url: 数据集路径 + epoches: 跑多少个epoch + batch_size: 1p 参数为256 2p 512 4p 1024 8p为2048 + seed: 49 + lr: 默认参数1p 0.2 2p 0.4 4p 0.8 8p 1.6 + docker_image: docker 镜像名称:版本号 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/LICENSE b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README.md b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README.md new file mode 100644 index 0000000..2501928 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README.md @@ -0,0 +1,253 @@ +# EfficientNet PyTorch + +### Quickstart + +Install with `pip install efficientnet_pytorch` and load a pretrained EfficientNet with: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b0') +``` + +### Updates + +#### Update (May 14, 2020) + +This update adds comprehensive comments and documentation (thanks to @workingcoder). + +#### Update (January 23, 2020) + +This update adds a new category of pre-trained model based on adversarial training, called _advprop_. It is important to note that the preprocessing required for the advprop pretrained models is slightly different from normal ImageNet preprocessing. As a result, by default, advprop models are not used. To load a model with advprop, use: +``` +model = EfficientNet.from_pretrained("efficientnet-b0", advprop=True) +``` +There is also a new, large `efficientnet-b8` pretrained model that is only available in advprop form. When using these models, replace ImageNet preprocessing code as follows: +``` +if advprop: # for models using advprop pretrained weights + normalize = transforms.Lambda(lambda img: img * 2.0 - 1.0) +else: + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + +``` +This update also addresses multiple other issues ([#115](https://github.com/lukemelas/EfficientNet-PyTorch/issues/115), [#128](https://github.com/lukemelas/EfficientNet-PyTorch/issues/128)). + +#### Update (October 15, 2019) + +This update allows you to choose whether to use a memory-efficient Swish activation. The memory-efficient version is chosen by default, but it cannot be used when exporting using PyTorch JIT. For this purpose, we have also included a standard (export-friendly) swish activation function. To switch to the export-friendly version, simply call `model.set_swish(memory_efficient=False)` after loading your desired model. This update addresses issues [#88](https://github.com/lukemelas/EfficientNet-PyTorch/pull/88) and [#89](https://github.com/lukemelas/EfficientNet-PyTorch/pull/89). + +#### Update (October 12, 2019) + +This update makes the Swish activation function more memory-efficient. It also addresses pull requests [#72](https://github.com/lukemelas/EfficientNet-PyTorch/pull/72), [#73](https://github.com/lukemelas/EfficientNet-PyTorch/pull/73), [#85](https://github.com/lukemelas/EfficientNet-PyTorch/pull/85), and [#86](https://github.com/lukemelas/EfficientNet-PyTorch/pull/86). Thanks to the authors of all the pull requests! + +#### Update (July 31, 2019) + +_Upgrade the pip package with_ `pip install --upgrade efficientnet-pytorch` + +The B6 and B7 models are now available. Additionally, _all_ pretrained models have been updated to use AutoAugment preprocessing, which translates to better performance across the board. Usage is the same as before: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b7') +``` + +#### Update (June 29, 2019) + +This update adds easy model exporting ([#20](https://github.com/lukemelas/EfficientNet-PyTorch/issues/20)) and feature extraction ([#38](https://github.com/lukemelas/EfficientNet-PyTorch/issues/38)). + + * [Example: Export to ONNX](#example-export) + * [Example: Extract features](#example-feature-extraction) + * Also: fixed a CUDA/CPU bug ([#32](https://github.com/lukemelas/EfficientNet-PyTorch/issues/32)) + +It is also now incredibly simple to load a pretrained model with a new number of classes for transfer learning: +```python +model = EfficientNet.from_pretrained('efficientnet-b1', num_classes=23) +``` + + +#### Update (June 23, 2019) + +The B4 and B5 models are now available. Their usage is identical to the other models: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b4') +``` + +### Overview +This repository contains an op-for-op PyTorch reimplementation of [EfficientNet](https://arxiv.org/abs/1905.11946), along with pre-trained models and examples. + +The goal of this implementation is to be simple, highly extensible, and easy to integrate into your own projects. This implementation is a work in progress -- new features are currently being implemented. + +At the moment, you can easily: + * Load pretrained EfficientNet models + * Use EfficientNet models for classification or feature extraction + * Evaluate EfficientNet models on ImageNet or your own images + +_Upcoming features_: In the next few days, you will be able to: + * Train new models from scratch on ImageNet with a simple command + * Quickly finetune an EfficientNet on your own dataset + * Export EfficientNet models for production + +### Table of contents +1. [About EfficientNet](#about-efficientnet) +2. [About EfficientNet-PyTorch](#about-efficientnet-pytorch) +3. [Installation](#installation) +4. [Usage](#usage) + * [Load pretrained models](#loading-pretrained-models) + * [Example: Classify](#example-classification) + * [Example: Extract features](#example-feature-extraction) + * [Example: Export to ONNX](#example-export) +6. [Contributing](#contributing) + +### About EfficientNet + +If you're new to EfficientNets, here is an explanation straight from the official TensorFlow implementation: + +EfficientNets are a family of image classification models, which achieve state-of-the-art accuracy, yet being an order-of-magnitude smaller and faster than previous models. We develop EfficientNets based on AutoML and Compound Scaling. In particular, we first use [AutoML Mobile framework](https://ai.googleblog.com/2018/08/mnasnet-towards-automating-design-of.html) to develop a mobile-size baseline network, named as EfficientNet-B0; Then, we use the compound scaling method to scale up this baseline to obtain EfficientNet-B1 to B7. + + + + + + +
+ + + +
+ +EfficientNets achieve state-of-the-art accuracy on ImageNet with an order of magnitude better efficiency: + + +* In high-accuracy regime, our EfficientNet-B7 achieves state-of-the-art 84.4% top-1 / 97.1% top-5 accuracy on ImageNet with 66M parameters and 37B FLOPS, being 8.4x smaller and 6.1x faster on CPU inference than previous best [Gpipe](https://arxiv.org/abs/1811.06965). + +* In middle-accuracy regime, our EfficientNet-B1 is 7.6x smaller and 5.7x faster on CPU inference than [ResNet-152](https://arxiv.org/abs/1512.03385), with similar ImageNet accuracy. + +* Compared with the widely used [ResNet-50](https://arxiv.org/abs/1512.03385), our EfficientNet-B4 improves the top-1 accuracy from 76.3% of ResNet-50 to 82.6% (+6.3%), under similar FLOPS constraint. + +### About EfficientNet PyTorch + +EfficientNet PyTorch is a PyTorch re-implementation of EfficientNet. It is consistent with the [original TensorFlow implementation](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet), such that it is easy to load weights from a TensorFlow checkpoint. At the same time, we aim to make our PyTorch implementation as simple, flexible, and extensible as possible. + +If you have any feature requests or questions, feel free to leave them as GitHub issues! + +### Installation + +Install via pip: +```bash +pip install efficientnet_pytorch +``` + +Or install from source: +```bash +git clone https://github.com/lukemelas/EfficientNet-PyTorch +cd EfficientNet-Pytorch +pip install -e . +``` + +### Usage + +#### Loading pretrained models + +Load an EfficientNet: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_name('efficientnet-b0') +``` + +Load a pretrained EfficientNet: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b0') +``` + +Note that pretrained models have only been released for `N=0,1,2,3,4,5` at the current time, so `.from_pretrained` only supports `'efficientnet-b{N}'` for `N=0,1,2,3,4,5`. + +Details about the models are below: + +| *Name* |*# Params*|*Top-1 Acc.*|*Pretrained?*| +|:-----------------:|:--------:|:----------:|:-----------:| +| `efficientnet-b0` | 5.3M | 76.3 | ✓ | +| `efficientnet-b1` | 7.8M | 78.8 | ✓ | +| `efficientnet-b2` | 9.2M | 79.8 | ✓ | +| `efficientnet-b3` | 12M | 81.1 | ✓ | +| `efficientnet-b4` | 19M | 82.6 | ✓ | +| `efficientnet-b5` | 30M | 83.3 | ✓ | +| `efficientnet-b6` | 43M | 84.0 | ✓ | +| `efficientnet-b7` | 66M | 84.4 | ✓ | + + +#### Example: Classification + +Below is a simple, complete example. It may also be found as a jupyter notebook in `examples/simple` or as a [Colab Notebook](https://colab.research.google.com/drive/1Jw28xZ1NJq4Cja4jLe6tJ6_F5lCzElb4). + +We assume that in your current directory, there is a `img.jpg` file and a `labels_map.txt` file (ImageNet class names). These are both included in `examples/simple`. + +```python +import json +from PIL import Image +import torch +from torchvision import transforms + +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b0') + +# Preprocess image +tfms = transforms.Compose([transforms.Resize(224), transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),]) +img = tfms(Image.open('img.jpg')).unsqueeze(0) +print(img.shape) # torch.Size([1, 3, 224, 224]) + +# Load ImageNet class names +labels_map = json.load(open('labels_map.txt')) +labels_map = [labels_map[str(i)] for i in range(1000)] + +# Classify +model.eval() +with torch.no_grad(): + outputs = model(img) + +# Print predictions +print('-----') +for idx in torch.topk(outputs, k=5).indices.squeeze(0).tolist(): + prob = torch.softmax(outputs, dim=1)[0, idx].item() + print('{label:<75} ({p:.2f}%)'.format(label=labels_map[idx], p=prob*100)) +``` + +#### Example: Feature Extraction + +You can easily extract features with `model.extract_features`: +```python +from efficientnet_pytorch import EfficientNet +model = EfficientNet.from_pretrained('efficientnet-b0') + +# ... image preprocessing as in the classification example ... +print(img.shape) # torch.Size([1, 3, 224, 224]) + +features = model.extract_features(img) +print(features.shape) # torch.Size([1, 1280, 7, 7]) +``` + +#### Example: Export to ONNX + +Exporting to ONNX for deploying to production is now simple: +```python +import torch +from efficientnet_pytorch import EfficientNet + +model = EfficientNet.from_pretrained('efficientnet-b1') +dummy_input = torch.randn(10, 3, 240, 240) + +torch.onnx.export(model, dummy_input, "test-b1.onnx", verbose=True) +``` + +[Here](https://colab.research.google.com/drive/1rOAEXeXHaA8uo3aG2YcFDHItlRJMV0VP) is a Colab example. + + +#### ImageNet + +See `examples/imagenet` for details about evaluating on ImageNet. + +### Contributing + +If you find a bug, create a GitHub issue, or even better, submit a pull request. Similarly, if you have questions, simply post them as GitHub issues. + +I look forward to seeing what the community does with these models! diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README_NPU.md b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README_NPU.md new file mode 100644 index 0000000..8e0da51 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/README_NPU.md @@ -0,0 +1,45 @@ +# EfficientNet PyTorch + +## About EfficientNet + +If you're new to EfficientNets, here is an explanation straight from the official TensorFlow implementation: + +EfficientNets are a family of image classification models, which achieve state-of-the-art accuracy, yet being an order-of-magnitude smaller and faster than previous models. We develop EfficientNets based on AutoML and Compound Scaling. In particular, we first use [AutoML Mobile framework](https://ai.googleblog.com/2018/08/mnasnet-towards-automating-design-of.html) to develop a mobile-size baseline network, named as EfficientNet-B0; Then, we use the compound scaling method to scale up this baseline to obtain EfficientNet-B1 to B7. + +EfficientNets achieve state-of-the-art accuracy on ImageNet with an order of magnitude better efficiency: + + +* In high-accuracy regime, our EfficientNet-B7 achieves state-of-the-art 84.4% top-1 / 97.1% top-5 accuracy on ImageNet with 66M parameters and 37B FLOPS, being 8.4x smaller and 6.1x faster on CPU inference than previous best [Gpipe](https://arxiv.org/abs/1811.06965). + +* In middle-accuracy regime, our EfficientNet-B1 is 7.6x smaller and 5.7x faster on CPU inference than [ResNet-152](https://arxiv.org/abs/1512.03385), with similar ImageNet accuracy. + +* Compared with the widely used [ResNet-50](https://arxiv.org/abs/1512.03385), our EfficientNet-B4 improves the top-1 accuracy from 76.3% of ResNet-50 to 82.6% (+6.3%), under similar FLOPS constraint. + +## About EfficientNet PyTorch NPU + +The source codes are based on the open source https://github.com/lukemelas/EfficientNet-PyTorch with least modified codes as far as possible. + + +## Quick Start + +### Train on 1 NPU: + +(1) modify the last line in npu_1p.sh with the particular params: + +* fp32: taskset -c 0-64 python3.7 examples/imagenet/main.py --data=/data/imagenet --arch=efficientnet-b0 --batch-size=256 --lr=0.2 --epochs=200 --autoaug --npu=0 +* O1: taskset -c 0-64 python3.7 examples/imagenet/main.py --data=/data/imagenet --arch=efficientnet-b0 --batch-size=256 --lr=0.2 --epochs=200 --autoaug --npu=0 --amp --pm=O1 --loss_scale=1024 +* O2: taskset -c 0-64 python3.7 examples/imagenet/main.py --data=/data/imagenet --arch=efficientnet-b0 --batch-size=256 --lr=0.2 --epochs=200 --autoaug --npu=0 --amp --pm=O2 --loss_scale=128 + +(2) Execute run.sh,ALL the train log will be recorded in nohup.out. + +## Know issues: + +* Distribution train is NOT available. +* top1/top5 accuracy is lower than GPU about 2% in the same setting (dropout). +* O2 Performance is lower than GPU about 50 fps in the same setting (dropout, depthwiseconv2d). +* torch.rand is replaced with numpy implementation due to the lack of AICPU operator (aicpu). +* momentum has to be set to 0 due to logsoftmax precision(logsoftmax) + + + + diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/__init__.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/__init__.py new file mode 100644 index 0000000..182abec --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/__init__.py @@ -0,0 +1,12 @@ +__version__ = "0.7.0" +from .model import EfficientNet +from .utils import ( + GlobalParams, + BlockArgs, + BlockDecoder, + efficientnet, + get_model_params, +) +from .auto_augment import rand_augment_transform, augment_and_mix_transform, auto_augment_transform +from .rmsprop_tf import RMSpropTF + diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/auto_augment.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/auto_augment.py new file mode 100644 index 0000000..b6c15d9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/auto_augment.py @@ -0,0 +1,817 @@ +""" AutoAugment, RandAugment, and AugMix for PyTorch + +This code implements the searched ImageNet policies with various tweaks and improvements and +does not include any of the search code. + +AA and RA Implementation adapted from: + https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py + +AugMix adapted from: + https://github.com/google-research/augmix + +Papers: + AutoAugment: Learning Augmentation Policies from Data - https://arxiv.org/abs/1805.09501 + Learning Data Augmentation Strategies for Object Detection - https://arxiv.org/abs/1906.11172 + RandAugment: Practical automated data augmentation... - https://arxiv.org/abs/1909.13719 + AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty - https://arxiv.org/abs/1912.02781 + +Hacked together by Ross Wightman +""" +import random +import math +import re +from PIL import Image, ImageOps, ImageEnhance, ImageChops +import PIL +import numpy as np + + +_PIL_VER = tuple([int(x) for x in PIL.__version__.split('.')[:2]]) + +_FILL = (128, 128, 128) + +# This signifies the max integer that the controller RNN could predict for the +# augmentation scheme. +_MAX_LEVEL = 10. + +_HPARAMS_DEFAULT = dict( + translate_const=250, + img_mean=_FILL, +) + +_RANDOM_INTERPOLATION = (Image.BILINEAR, Image.BICUBIC) + + +def _interpolation(kwargs): + interpolation = kwargs.pop('resample', Image.BILINEAR) + if isinstance(interpolation, (list, tuple)): + return random.choice(interpolation) + else: + return interpolation + + +def _check_args_tf(kwargs): + if 'fillcolor' in kwargs and _PIL_VER < (5, 0): + kwargs.pop('fillcolor') + kwargs['resample'] = _interpolation(kwargs) + + +def shear_x(img, factor, **kwargs): + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, factor, 0, 0, 1, 0), **kwargs) + + +def shear_y(img, factor, **kwargs): + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, 0, 0, factor, 1, 0), **kwargs) + + +def translate_x_rel(img, pct, **kwargs): + pixels = pct * img.size[0] + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, 0, pixels, 0, 1, 0), **kwargs) + + +def translate_y_rel(img, pct, **kwargs): + pixels = pct * img.size[1] + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, 0, 0, 0, 1, pixels), **kwargs) + + +def translate_x_abs(img, pixels, **kwargs): + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, 0, pixels, 0, 1, 0), **kwargs) + + +def translate_y_abs(img, pixels, **kwargs): + _check_args_tf(kwargs) + return img.transform(img.size, Image.AFFINE, (1, 0, 0, 0, 1, pixels), **kwargs) + + +def rotate(img, degrees, **kwargs): + _check_args_tf(kwargs) + if _PIL_VER >= (5, 2): + return img.rotate(degrees, **kwargs) + elif _PIL_VER >= (5, 0): + w, h = img.size + post_trans = (0, 0) + rotn_center = (w / 2.0, h / 2.0) + angle = -math.radians(degrees) + matrix = [ + round(math.cos(angle), 15), + round(math.sin(angle), 15), + 0.0, + round(-math.sin(angle), 15), + round(math.cos(angle), 15), + 0.0, + ] + + def transform(x, y, matrix): + (a, b, c, d, e, f) = matrix + return a * x + b * y + c, d * x + e * y + f + + matrix[2], matrix[5] = transform( + -rotn_center[0] - post_trans[0], -rotn_center[1] - post_trans[1], matrix + ) + matrix[2] += rotn_center[0] + matrix[5] += rotn_center[1] + return img.transform(img.size, Image.AFFINE, matrix, **kwargs) + else: + return img.rotate(degrees, resample=kwargs['resample']) + + +def auto_contrast(img, **__): + return ImageOps.autocontrast(img) + + +def invert(img, **__): + return ImageOps.invert(img) + + +def equalize(img, **__): + return ImageOps.equalize(img) + + +def solarize(img, thresh, **__): + return ImageOps.solarize(img, thresh) + + +def solarize_add(img, add, thresh=128, **__): + lut = [] + for i in range(256): + if i < thresh: + lut.append(min(255, i + add)) + else: + lut.append(i) + if img.mode in ("L", "RGB"): + if img.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return img.point(lut) + else: + return img + + +def posterize(img, bits_to_keep, **__): + if bits_to_keep >= 8: + return img + return ImageOps.posterize(img, bits_to_keep) + + +def contrast(img, factor, **__): + return ImageEnhance.Contrast(img).enhance(factor) + + +def color(img, factor, **__): + return ImageEnhance.Color(img).enhance(factor) + + +def brightness(img, factor, **__): + return ImageEnhance.Brightness(img).enhance(factor) + + +def sharpness(img, factor, **__): + return ImageEnhance.Sharpness(img).enhance(factor) + + +def _randomly_negate(v): + """With 50% prob, negate the value""" + return -v if random.random() > 0.5 else v + + +def _rotate_level_to_arg(level, _hparams): + # range [-30, 30] + level = (level / _MAX_LEVEL) * 30. + level = _randomly_negate(level) + return level, + + +def _enhance_level_to_arg(level, _hparams): + # range [0.1, 1.9] + return (level / _MAX_LEVEL) * 1.8 + 0.1, + + +def _enhance_increasing_level_to_arg(level, _hparams): + # the 'no change' level is 1.0, moving away from that towards 0. or 2.0 increases the enhancement blend + # range [0.1, 1.9] + level = (level / _MAX_LEVEL) * .9 + level = 1.0 + _randomly_negate(level) + return level, + + +def _shear_level_to_arg(level, _hparams): + # range [-0.3, 0.3] + level = (level / _MAX_LEVEL) * 0.3 + level = _randomly_negate(level) + return level, + + +def _translate_abs_level_to_arg(level, hparams): + translate_const = hparams['translate_const'] + level = (level / _MAX_LEVEL) * float(translate_const) + level = _randomly_negate(level) + return level, + + +def _translate_rel_level_to_arg(level, hparams): + # default range [-0.45, 0.45] + translate_pct = hparams.get('translate_pct', 0.45) + level = (level / _MAX_LEVEL) * translate_pct + level = _randomly_negate(level) + return level, + + +def _posterize_level_to_arg(level, _hparams): + # As per Tensorflow TPU EfficientNet impl + # range [0, 4], 'keep 0 up to 4 MSB of original image' + # intensity/severity of augmentation decreases with level + return int((level / _MAX_LEVEL) * 4), + + +def _posterize_increasing_level_to_arg(level, hparams): + # As per Tensorflow models research and UDA impl + # range [4, 0], 'keep 4 down to 0 MSB of original image', + # intensity/severity of augmentation increases with level + return 4 - _posterize_level_to_arg(level, hparams)[0], + + +def _posterize_original_level_to_arg(level, _hparams): + # As per original AutoAugment paper description + # range [4, 8], 'keep 4 up to 8 MSB of image' + # intensity/severity of augmentation decreases with level + return int((level / _MAX_LEVEL) * 4) + 4, + + +def _solarize_level_to_arg(level, _hparams): + # range [0, 256] + # intensity/severity of augmentation decreases with level + return int((level / _MAX_LEVEL) * 256), + + +def _solarize_increasing_level_to_arg(level, _hparams): + # range [0, 256] + # intensity/severity of augmentation increases with level + return 256 - _solarize_level_to_arg(level, _hparams)[0], + + +def _solarize_add_level_to_arg(level, _hparams): + # range [0, 110] + return int((level / _MAX_LEVEL) * 110), + + +LEVEL_TO_ARG = { + 'AutoContrast': None, + 'Equalize': None, + 'Invert': None, + 'Rotate': _rotate_level_to_arg, + # There are several variations of the posterize level scaling in various Tensorflow/Google repositories/papers + 'Posterize': _posterize_level_to_arg, + 'PosterizeIncreasing': _posterize_increasing_level_to_arg, + 'PosterizeOriginal': _posterize_original_level_to_arg, + 'Solarize': _solarize_level_to_arg, + 'SolarizeIncreasing': _solarize_increasing_level_to_arg, + 'SolarizeAdd': _solarize_add_level_to_arg, + 'Color': _enhance_level_to_arg, + 'ColorIncreasing': _enhance_increasing_level_to_arg, + 'Contrast': _enhance_level_to_arg, + 'ContrastIncreasing': _enhance_increasing_level_to_arg, + 'Brightness': _enhance_level_to_arg, + 'BrightnessIncreasing': _enhance_increasing_level_to_arg, + 'Sharpness': _enhance_level_to_arg, + 'SharpnessIncreasing': _enhance_increasing_level_to_arg, + 'ShearX': _shear_level_to_arg, + 'ShearY': _shear_level_to_arg, + 'TranslateX': _translate_abs_level_to_arg, + 'TranslateY': _translate_abs_level_to_arg, + 'TranslateXRel': _translate_rel_level_to_arg, + 'TranslateYRel': _translate_rel_level_to_arg, +} + + +NAME_TO_OP = { + 'AutoContrast': auto_contrast, + 'Equalize': equalize, + 'Invert': invert, + 'Rotate': rotate, + 'Posterize': posterize, + 'PosterizeIncreasing': posterize, + 'PosterizeOriginal': posterize, + 'Solarize': solarize, + 'SolarizeIncreasing': solarize, + 'SolarizeAdd': solarize_add, + 'Color': color, + 'ColorIncreasing': color, + 'Contrast': contrast, + 'ContrastIncreasing': contrast, + 'Brightness': brightness, + 'BrightnessIncreasing': brightness, + 'Sharpness': sharpness, + 'SharpnessIncreasing': sharpness, + 'ShearX': shear_x, + 'ShearY': shear_y, + 'TranslateX': translate_x_abs, + 'TranslateY': translate_y_abs, + 'TranslateXRel': translate_x_rel, + 'TranslateYRel': translate_y_rel, +} + + +class AugmentOp: + + def __init__(self, name, prob=0.5, magnitude=10, hparams=None): + hparams = hparams or _HPARAMS_DEFAULT + self.aug_fn = NAME_TO_OP[name] + self.level_fn = LEVEL_TO_ARG[name] + self.prob = prob + self.magnitude = magnitude + self.hparams = hparams.copy() + self.kwargs = dict( + fillcolor=hparams['img_mean'] if 'img_mean' in hparams else _FILL, + resample=hparams['interpolation'] if 'interpolation' in hparams else _RANDOM_INTERPOLATION, + ) + + # If magnitude_std is > 0, we introduce some randomness + # in the usually fixed policy and sample magnitude from a normal distribution + # with mean `magnitude` and std-dev of `magnitude_std`. + # NOTE This is my own hack, being tested, not in papers or reference impls. + self.magnitude_std = self.hparams.get('magnitude_std', 0) + + def __call__(self, img): + if self.prob < 1.0 and random.random() > self.prob: + return img + magnitude = self.magnitude + if self.magnitude_std and self.magnitude_std > 0: + magnitude = random.gauss(magnitude, self.magnitude_std) + magnitude = min(_MAX_LEVEL, max(0, magnitude)) # clip to valid range + level_args = self.level_fn(magnitude, self.hparams) if self.level_fn is not None else tuple() + return self.aug_fn(img, *level_args, **self.kwargs) + + +def auto_augment_policy_v0(hparams): + # ImageNet v0 policy from TPU EfficientNet impl, cannot find a paper reference. + policy = [ + [('Equalize', 0.8, 1), ('ShearY', 0.8, 4)], + [('Color', 0.4, 9), ('Equalize', 0.6, 3)], + [('Color', 0.4, 1), ('Rotate', 0.6, 8)], + [('Solarize', 0.8, 3), ('Equalize', 0.4, 7)], + [('Solarize', 0.4, 2), ('Solarize', 0.6, 2)], + [('Color', 0.2, 0), ('Equalize', 0.8, 8)], + [('Equalize', 0.4, 8), ('SolarizeAdd', 0.8, 3)], + [('ShearX', 0.2, 9), ('Rotate', 0.6, 8)], + [('Color', 0.6, 1), ('Equalize', 1.0, 2)], + [('Invert', 0.4, 9), ('Rotate', 0.6, 0)], + [('Equalize', 1.0, 9), ('ShearY', 0.6, 3)], + [('Color', 0.4, 7), ('Equalize', 0.6, 0)], + [('Posterize', 0.4, 6), ('AutoContrast', 0.4, 7)], + [('Solarize', 0.6, 8), ('Color', 0.6, 9)], + [('Solarize', 0.2, 4), ('Rotate', 0.8, 9)], + [('Rotate', 1.0, 7), ('TranslateYRel', 0.8, 9)], + [('ShearX', 0.0, 0), ('Solarize', 0.8, 4)], + [('ShearY', 0.8, 0), ('Color', 0.6, 4)], + [('Color', 1.0, 0), ('Rotate', 0.6, 2)], + [('Equalize', 0.8, 4), ('Equalize', 0.0, 8)], + [('Equalize', 1.0, 4), ('AutoContrast', 0.6, 2)], + [('ShearY', 0.4, 7), ('SolarizeAdd', 0.6, 7)], + [('Posterize', 0.8, 2), ('Solarize', 0.6, 10)], # This results in black image with Tpu posterize + [('Solarize', 0.6, 8), ('Equalize', 0.6, 1)], + [('Color', 0.8, 6), ('Rotate', 0.4, 5)], + ] + pc = [[AugmentOp(*a, hparams=hparams) for a in sp] for sp in policy] + return pc + + +def auto_augment_policy_v0r(hparams): + # ImageNet v0 policy from TPU EfficientNet impl, with variation of Posterize used + # in Google research implementation (number of bits discarded increases with magnitude) + policy = [ + [('Equalize', 0.8, 1), ('ShearY', 0.8, 4)], + [('Color', 0.4, 9), ('Equalize', 0.6, 3)], + [('Color', 0.4, 1), ('Rotate', 0.6, 8)], + [('Solarize', 0.8, 3), ('Equalize', 0.4, 7)], + [('Solarize', 0.4, 2), ('Solarize', 0.6, 2)], + [('Color', 0.2, 0), ('Equalize', 0.8, 8)], + [('Equalize', 0.4, 8), ('SolarizeAdd', 0.8, 3)], + [('ShearX', 0.2, 9), ('Rotate', 0.6, 8)], + [('Color', 0.6, 1), ('Equalize', 1.0, 2)], + [('Invert', 0.4, 9), ('Rotate', 0.6, 0)], + [('Equalize', 1.0, 9), ('ShearY', 0.6, 3)], + [('Color', 0.4, 7), ('Equalize', 0.6, 0)], + [('PosterizeIncreasing', 0.4, 6), ('AutoContrast', 0.4, 7)], + [('Solarize', 0.6, 8), ('Color', 0.6, 9)], + [('Solarize', 0.2, 4), ('Rotate', 0.8, 9)], + [('Rotate', 1.0, 7), ('TranslateYRel', 0.8, 9)], + [('ShearX', 0.0, 0), ('Solarize', 0.8, 4)], + [('ShearY', 0.8, 0), ('Color', 0.6, 4)], + [('Color', 1.0, 0), ('Rotate', 0.6, 2)], + [('Equalize', 0.8, 4), ('Equalize', 0.0, 8)], + [('Equalize', 1.0, 4), ('AutoContrast', 0.6, 2)], + [('ShearY', 0.4, 7), ('SolarizeAdd', 0.6, 7)], + [('PosterizeIncreasing', 0.8, 2), ('Solarize', 0.6, 10)], + [('Solarize', 0.6, 8), ('Equalize', 0.6, 1)], + [('Color', 0.8, 6), ('Rotate', 0.4, 5)], + ] + pc = [[AugmentOp(*a, hparams=hparams) for a in sp] for sp in policy] + return pc + + +def auto_augment_policy_original(hparams): + # ImageNet policy from https://arxiv.org/abs/1805.09501 + policy = [ + [('PosterizeOriginal', 0.4, 8), ('Rotate', 0.6, 9)], + [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)], + [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)], + [('PosterizeOriginal', 0.6, 7), ('PosterizeOriginal', 0.6, 6)], + [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)], + [('Equalize', 0.4, 4), ('Rotate', 0.8, 8)], + [('Solarize', 0.6, 3), ('Equalize', 0.6, 7)], + [('PosterizeOriginal', 0.8, 5), ('Equalize', 1.0, 2)], + [('Rotate', 0.2, 3), ('Solarize', 0.6, 8)], + [('Equalize', 0.6, 8), ('PosterizeOriginal', 0.4, 6)], + [('Rotate', 0.8, 8), ('Color', 0.4, 0)], + [('Rotate', 0.4, 9), ('Equalize', 0.6, 2)], + [('Equalize', 0.0, 7), ('Equalize', 0.8, 8)], + [('Invert', 0.6, 4), ('Equalize', 1.0, 8)], + [('Color', 0.6, 4), ('Contrast', 1.0, 8)], + [('Rotate', 0.8, 8), ('Color', 1.0, 2)], + [('Color', 0.8, 8), ('Solarize', 0.8, 7)], + [('Sharpness', 0.4, 7), ('Invert', 0.6, 8)], + [('ShearX', 0.6, 5), ('Equalize', 1.0, 9)], + [('Color', 0.4, 0), ('Equalize', 0.6, 3)], + [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)], + [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)], + [('Invert', 0.6, 4), ('Equalize', 1.0, 8)], + [('Color', 0.6, 4), ('Contrast', 1.0, 8)], + [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)], + ] + pc = [[AugmentOp(*a, hparams=hparams) for a in sp] for sp in policy] + return pc + + +def auto_augment_policy_originalr(hparams): + # ImageNet policy from https://arxiv.org/abs/1805.09501 with research posterize variation + policy = [ + [('PosterizeIncreasing', 0.4, 8), ('Rotate', 0.6, 9)], + [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)], + [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)], + [('PosterizeIncreasing', 0.6, 7), ('PosterizeIncreasing', 0.6, 6)], + [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)], + [('Equalize', 0.4, 4), ('Rotate', 0.8, 8)], + [('Solarize', 0.6, 3), ('Equalize', 0.6, 7)], + [('PosterizeIncreasing', 0.8, 5), ('Equalize', 1.0, 2)], + [('Rotate', 0.2, 3), ('Solarize', 0.6, 8)], + [('Equalize', 0.6, 8), ('PosterizeIncreasing', 0.4, 6)], + [('Rotate', 0.8, 8), ('Color', 0.4, 0)], + [('Rotate', 0.4, 9), ('Equalize', 0.6, 2)], + [('Equalize', 0.0, 7), ('Equalize', 0.8, 8)], + [('Invert', 0.6, 4), ('Equalize', 1.0, 8)], + [('Color', 0.6, 4), ('Contrast', 1.0, 8)], + [('Rotate', 0.8, 8), ('Color', 1.0, 2)], + [('Color', 0.8, 8), ('Solarize', 0.8, 7)], + [('Sharpness', 0.4, 7), ('Invert', 0.6, 8)], + [('ShearX', 0.6, 5), ('Equalize', 1.0, 9)], + [('Color', 0.4, 0), ('Equalize', 0.6, 3)], + [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)], + [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)], + [('Invert', 0.6, 4), ('Equalize', 1.0, 8)], + [('Color', 0.6, 4), ('Contrast', 1.0, 8)], + [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)], + ] + pc = [[AugmentOp(*a, hparams=hparams) for a in sp] for sp in policy] + return pc + + +def auto_augment_policy(name='v0', hparams=None): + hparams = hparams or _HPARAMS_DEFAULT + if name == 'original': + return auto_augment_policy_original(hparams) + elif name == 'originalr': + return auto_augment_policy_originalr(hparams) + elif name == 'v0': + return auto_augment_policy_v0(hparams) + elif name == 'v0r': + return auto_augment_policy_v0r(hparams) + else: + assert False, 'Unknown AA policy (%s)' % name + + +class AutoAugment: + + def __init__(self, policy): + self.policy = policy + + def __call__(self, img): + sub_policy = random.choice(self.policy) + for op in sub_policy: + img = op(img) + return img + + +def auto_augment_transform(config_str, hparams): + """ + Create a AutoAugment transform + + :param config_str: String defining configuration of auto augmentation. Consists of multiple sections separated by + dashes ('-'). The first section defines the AutoAugment policy (one of 'v0', 'v0r', 'original', 'originalr'). + The remaining sections, not order sepecific determine + 'mstd' - float std deviation of magnitude noise applied + Ex 'original-mstd0.5' results in AutoAugment with original policy, magnitude_std 0.5 + + :param hparams: Other hparams (kwargs) for the AutoAugmentation scheme + + :return: A PyTorch compatible Transform + """ + config = config_str.split('-') + policy_name = config[0] + config = config[1:] + for c in config: + cs = re.split(r'(\d.*)', c) + if len(cs) < 2: + continue + key, val = cs[:2] + if key == 'mstd': + # noise param injected via hparams for now + hparams.setdefault('magnitude_std', float(val)) + else: + assert False, 'Unknown AutoAugment config section' + aa_policy = auto_augment_policy(policy_name, hparams=hparams) + return AutoAugment(aa_policy) + + +_RAND_TRANSFORMS = [ + 'AutoContrast', + 'Equalize', + 'Invert', + 'Rotate', + 'Posterize', + 'Solarize', + 'SolarizeAdd', + 'Color', + 'Contrast', + 'Brightness', + 'Sharpness', + 'ShearX', + 'ShearY', + 'TranslateXRel', + 'TranslateYRel', + #'Cutout' # NOTE I've implement this as random erasing separately +] + + +_RAND_INCREASING_TRANSFORMS = [ + 'AutoContrast', + 'Equalize', + 'Invert', + 'Rotate', + 'PosterizeIncreasing', + 'SolarizeIncreasing', + 'SolarizeAdd', + 'ColorIncreasing', + 'ContrastIncreasing', + 'BrightnessIncreasing', + 'SharpnessIncreasing', + 'ShearX', + 'ShearY', + 'TranslateXRel', + 'TranslateYRel', + #'Cutout' # NOTE I've implement this as random erasing separately +] + + + +# These experimental weights are based loosely on the relative improvements mentioned in paper. +# They may not result in increased performance, but could likely be tuned to so. +_RAND_CHOICE_WEIGHTS_0 = { + 'Rotate': 0.3, + 'ShearX': 0.2, + 'ShearY': 0.2, + 'TranslateXRel': 0.1, + 'TranslateYRel': 0.1, + 'Color': .025, + 'Sharpness': 0.025, + 'AutoContrast': 0.025, + 'Solarize': .005, + 'SolarizeAdd': .005, + 'Contrast': .005, + 'Brightness': .005, + 'Equalize': .005, + 'Posterize': 0, + 'Invert': 0, +} + + +def _select_rand_weights(weight_idx=0, transforms=None): + transforms = transforms or _RAND_TRANSFORMS + assert weight_idx == 0 # only one set of weights currently + rand_weights = _RAND_CHOICE_WEIGHTS_0 + probs = [rand_weights[k] for k in transforms] + probs /= np.sum(probs) + return probs + + +def rand_augment_ops(magnitude=10, hparams=None, transforms=None): + hparams = hparams or _HPARAMS_DEFAULT + transforms = transforms or _RAND_TRANSFORMS + return [AugmentOp( + name, prob=0.5, magnitude=magnitude, hparams=hparams) for name in transforms] + + +class RandAugment: + def __init__(self, ops, num_layers=2, choice_weights=None): + self.ops = ops + self.num_layers = num_layers + self.choice_weights = choice_weights + + def __call__(self, img): + # no replacement when using weighted choice + ops = np.random.choice( + self.ops, self.num_layers, replace=self.choice_weights is None, p=self.choice_weights) + for op in ops: + img = op(img) + return img + + +def rand_augment_transform(config_str, hparams): + """ + Create a RandAugment transform + + :param config_str: String defining configuration of random augmentation. Consists of multiple sections separated by + dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand'). The remaining + sections, not order sepecific determine + 'm' - integer magnitude of rand augment + 'n' - integer num layers (number of transform ops selected per image) + 'w' - integer probabiliy weight index (index of a set of weights to influence choice of op) + 'mstd' - float std deviation of magnitude noise applied + 'inc' - integer (bool), use augmentations that increase in severity with magnitude (default: 0) + Ex 'rand-m9-n3-mstd0.5' results in RandAugment with magnitude 9, num_layers 3, magnitude_std 0.5 + 'rand-mstd1-w0' results in magnitude_std 1.0, weights 0, default magnitude of 10 and num_layers 2 + + :param hparams: Other hparams (kwargs) for the RandAugmentation scheme + + :return: A PyTorch compatible Transform + """ + magnitude = _MAX_LEVEL # default to _MAX_LEVEL for magnitude (currently 10) + num_layers = 2 # default to 2 ops per image + weight_idx = None # default to no probability weights for op choice + transforms = _RAND_TRANSFORMS + config = config_str.split('-') + assert config[0] == 'rand' + config = config[1:] + for c in config: + cs = re.split(r'(\d.*)', c) + if len(cs) < 2: + continue + key, val = cs[:2] + if key == 'mstd': + # noise param injected via hparams for now + hparams.setdefault('magnitude_std', float(val)) + elif key == 'inc': + if bool(val): + transforms = _RAND_INCREASING_TRANSFORMS + elif key == 'm': + magnitude = int(val) + elif key == 'n': + num_layers = int(val) + elif key == 'w': + weight_idx = int(val) + else: + assert False, 'Unknown RandAugment config section' + ra_ops = rand_augment_ops(magnitude=magnitude, hparams=hparams, transforms=transforms) + choice_weights = None if weight_idx is None else _select_rand_weights(weight_idx) + return RandAugment(ra_ops, num_layers, choice_weights=choice_weights) + + +_AUGMIX_TRANSFORMS = [ + 'AutoContrast', + 'ColorIncreasing', # not in paper + 'ContrastIncreasing', # not in paper + 'BrightnessIncreasing', # not in paper + 'SharpnessIncreasing', # not in paper + 'Equalize', + 'Rotate', + 'PosterizeIncreasing', + 'SolarizeIncreasing', + 'ShearX', + 'ShearY', + 'TranslateXRel', + 'TranslateYRel', +] + + +def augmix_ops(magnitude=10, hparams=None, transforms=None): + hparams = hparams or _HPARAMS_DEFAULT + transforms = transforms or _AUGMIX_TRANSFORMS + return [AugmentOp( + name, prob=1.0, magnitude=magnitude, hparams=hparams) for name in transforms] + + +class AugMixAugment: + """ AugMix Transform + Adapted and improved from impl here: https://github.com/google-research/augmix/blob/master/imagenet.py + From paper: 'AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty - + https://arxiv.org/abs/1912.02781 + """ + def __init__(self, ops, alpha=1., width=3, depth=-1, blended=False): + self.ops = ops + self.alpha = alpha + self.width = width + self.depth = depth + self.blended = blended # blended mode is faster but not well tested + + def _calc_blended_weights(self, ws, m): + ws = ws * m + cump = 1. + rws = [] + for w in ws[::-1]: + alpha = w / cump + cump *= (1 - alpha) + rws.append(alpha) + return np.array(rws[::-1], dtype=np.float32) + + def _apply_blended(self, img, mixing_weights, m): + # This is my first crack and implementing a slightly faster mixed augmentation. Instead + # of accumulating the mix for each chain in a Numpy array and then blending with original, + # it recomputes the blending coefficients and applies one PIL image blend per chain. + # TODO the results appear in the right ballpark but they differ by more than rounding. + img_orig = img.copy() + ws = self._calc_blended_weights(mixing_weights, m) + for w in ws: + depth = self.depth if self.depth > 0 else np.random.randint(1, 4) + ops = np.random.choice(self.ops, depth, replace=True) + img_aug = img_orig # no ops are in-place, deep copy not necessary + for op in ops: + img_aug = op(img_aug) + img = Image.blend(img, img_aug, w) + return img + + def _apply_basic(self, img, mixing_weights, m): + # This is a literal adaptation of the paper/official implementation without normalizations and + # PIL <-> Numpy conversions between every op. It is still quite CPU compute heavy compared to the + # typical augmentation transforms, could use a GPU / Kornia implementation. + img_shape = img.size[0], img.size[1], len(img.getbands()) + mixed = np.zeros(img_shape, dtype=np.float32) + for mw in mixing_weights: + depth = self.depth if self.depth > 0 else np.random.randint(1, 4) + ops = np.random.choice(self.ops, depth, replace=True) + img_aug = img # no ops are in-place, deep copy not necessary + for op in ops: + img_aug = op(img_aug) + mixed += mw * np.asarray(img_aug, dtype=np.float32) + np.clip(mixed, 0, 255., out=mixed) + mixed = Image.fromarray(mixed.astype(np.uint8)) + return Image.blend(img, mixed, m) + + def __call__(self, img): + mixing_weights = np.float32(np.random.dirichlet([self.alpha] * self.width)) + m = np.float32(np.random.beta(self.alpha, self.alpha)) + if self.blended: + mixed = self._apply_blended(img, mixing_weights, m) + else: + mixed = self._apply_basic(img, mixing_weights, m) + return mixed + + +def augment_and_mix_transform(config_str, hparams): + """ Create AugMix PyTorch transform + + :param config_str: String defining configuration of random augmentation. Consists of multiple sections separated by + dashes ('-'). The first section defines the specific variant of rand augment (currently only 'rand'). The remaining + sections, not order sepecific determine + 'm' - integer magnitude (severity) of augmentation mix (default: 3) + 'w' - integer width of augmentation chain (default: 3) + 'd' - integer depth of augmentation chain (-1 is random [1, 3], default: -1) + 'b' - integer (bool), blend each branch of chain into end result without a final blend, less CPU (default: 0) + 'mstd' - float std deviation of magnitude noise applied (default: 0) + Ex 'augmix-m5-w4-d2' results in AugMix with severity 5, chain width 4, chain depth 2 + + :param hparams: Other hparams (kwargs) for the Augmentation transforms + + :return: A PyTorch compatible Transform + """ + magnitude = 3 + width = 3 + depth = -1 + alpha = 1. + blended = False + config = config_str.split('-') + assert config[0] == 'augmix' + config = config[1:] + for c in config: + cs = re.split(r'(\d.*)', c) + if len(cs) < 2: + continue + key, val = cs[:2] + if key == 'mstd': + # noise param injected via hparams for now + hparams.setdefault('magnitude_std', float(val)) + elif key == 'm': + magnitude = int(val) + elif key == 'w': + width = int(val) + elif key == 'd': + depth = int(val) + elif key == 'a': + alpha = float(val) + elif key == 'b': + blended = bool(val) + else: + assert False, 'Unknown AugMix config section' + ops = augmix_ops(magnitude=magnitude, hparams=hparams) + return AugMixAugment(ops, alpha=alpha, width=width, depth=depth, blended=blended) \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/model.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/model.py new file mode 100644 index 0000000..ced7b30 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/model.py @@ -0,0 +1,432 @@ +"""model.py - Model and module class for EfficientNet. + They are built to mirror those in the official TensorFlow implementation. +""" + +# Author: lukemelas (github username) +# Github repo: https://github.com/lukemelas/EfficientNet-PyTorch +# With adjustments and added comments by workingcoder (github username). + +import torch +from torch import nn +from torch.nn import functional as F +from .utils import ( + round_filters, + round_repeats, + drop_connect, + get_same_padding_conv2d, + get_model_params, + efficientnet_params, + load_pretrained_weights, + Swish, + MemoryEfficientSwish, + calculate_output_image_size +) + +class MBConvBlock(nn.Module): + """Mobile Inverted Residual Bottleneck Block. + + Args: + block_args (namedtuple): BlockArgs, defined in utils.py. + global_params (namedtuple): GlobalParam, defined in utils.py. + image_size (tuple or list): [image_height, image_width]. + + References: + [1] https://arxiv.org/abs/1704.04861 (MobileNet v1) + [2] https://arxiv.org/abs/1801.04381 (MobileNet v2) + [3] https://arxiv.org/abs/1905.02244 (MobileNet v3) + """ + + def __init__(self, block_args, global_params, image_size=None): + super().__init__() + self._block_args = block_args + self._bn_mom = 1 - global_params.batch_norm_momentum # pytorch's difference from tensorflow + self._bn_eps = global_params.batch_norm_epsilon + self.has_se = (self._block_args.se_ratio is not None) and (0 < self._block_args.se_ratio <= 1) + self.id_skip = block_args.id_skip # whether to use skip connection and drop connect + + # Expansion phase (Inverted Bottleneck) + inp = self._block_args.input_filters # number of input channels + oup = self._block_args.input_filters * self._block_args.expand_ratio # number of output channels + if self._block_args.expand_ratio != 1: + Conv2d = get_same_padding_conv2d(image_size=image_size) + self._expand_conv = Conv2d(in_channels=inp, out_channels=oup, kernel_size=1, bias=False) + self._bn0 = nn.BatchNorm2d(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps) + # image_size = calculate_output_image_size(image_size, 1) <-- this wouldn't modify image_size + + # Depthwise convolution phase + k = self._block_args.kernel_size + s = self._block_args.stride + Conv2d = get_same_padding_conv2d(image_size=image_size) + self._depthwise_conv = Conv2d( + in_channels=oup, out_channels=oup, groups=oup, # groups makes it depthwise + kernel_size=k, stride=s, bias=False) + self._bn1 = nn.BatchNorm2d(num_features=oup, momentum=self._bn_mom, eps=self._bn_eps) + image_size = calculate_output_image_size(image_size, s) + + # Squeeze and Excitation layer, if desired + if self.has_se: + Conv2d = get_same_padding_conv2d(image_size=(1,1)) + num_squeezed_channels = max(1, int(self._block_args.input_filters * self._block_args.se_ratio)) + self._se_reduce = Conv2d(in_channels=oup, out_channels=num_squeezed_channels, kernel_size=1) + self._se_expand = Conv2d(in_channels=num_squeezed_channels, out_channels=oup, kernel_size=1) + # self._se_relu = torch.nn.ReLU() + # self._se_sigmoid = torch.nn.Sigmoid() + + # Pointwise convolution phase + final_oup = self._block_args.output_filters + Conv2d = get_same_padding_conv2d(image_size=image_size) + self._project_conv = Conv2d(in_channels=oup, out_channels=final_oup, kernel_size=1, bias=False) + self._bn2 = nn.BatchNorm2d(num_features=final_oup, momentum=self._bn_mom, eps=self._bn_eps) + self._swish = MemoryEfficientSwish() + + def forward(self, inputs, drop_connect_rate=None): + """MBConvBlock's forward function. + + Args: + inputs (tensor): Input tensor. + drop_connect_rate (bool): Drop connect rate (float, between 0 and 1). + + Returns: + Output of this block after processing. + """ + + # Expansion and Depthwise Convolution + x = inputs + if self._block_args.expand_ratio != 1: + x = self._expand_conv(inputs) + x = self._bn0(x) + x = self._swish(x) + + x = self._depthwise_conv(x) + x = self._bn1(x) + x = self._swish(x) + + # Squeeze and Excitation + if self.has_se: + x_squeezed = F.adaptive_avg_pool2d(x, 1) + # x_squeezed = torch.mean(x, [2, 3], keepdim=True) + + x_squeezed = self._se_reduce(x_squeezed) + + x_squeezed = self._swish(x_squeezed) + + x_squeezed = self._se_expand(x_squeezed) + + # x_squeezed = self._se_sigmoid(x_squeezed) + # + # x = x_squeezed * x + + x = torch.sigmoid(x_squeezed) * x + + # x = torch.sigmoid(x_squeezed) + x + # x = torch.nn.functional.relu(x_squeezed) * x + # x = x_squeezed + x + + # Pointwise Convolution + x = self._project_conv(x) + x = self._bn2(x) + + # Skip connection and drop connect + input_filters, output_filters = self._block_args.input_filters, self._block_args.output_filters + if self.id_skip and self._block_args.stride == 1 and input_filters == output_filters: + # The combination of skip connection and drop connect brings about stochastic depth. + if drop_connect_rate: + x = drop_connect(x, p=drop_connect_rate, training=self.training) + x = x + inputs # skip connection + return x + + def set_swish(self, memory_efficient=True): + """Sets swish function as memory efficient (for training) or standard (for export). + + Args: + memory_efficient (bool): Whether to use memory-efficient version of swish. + """ + self._swish = MemoryEfficientSwish() if memory_efficient else Swish() + + +class EfficientNet(nn.Module): + """EfficientNet model. + Most easily loaded with the .from_name or .from_pretrained methods. + + Args: + blocks_args (list[namedtuple]): A list of BlockArgs to construct blocks. + global_params (namedtuple): A set of GlobalParams shared between blocks. + + References: + [1] https://arxiv.org/abs/1905.11946 (EfficientNet) + + Example: + >>> import torch + >>> from efficientnet.model import EfficientNet + >>> inputs = torch.rand(1, 3, 224, 224) + >>> model = EfficientNet.from_pretrained('efficientnet-b0') + >>> model.eval() + >>> outputs = model(inputs) + """ + + def __init__(self, blocks_args=None, global_params=None): + super().__init__() + assert isinstance(blocks_args, list), 'blocks_args should be a list' + assert len(blocks_args) > 0, 'block args must be greater than 0' + self._global_params = global_params + self._blocks_args = blocks_args + + # Batch norm parameters + bn_mom = 1 - self._global_params.batch_norm_momentum + bn_eps = self._global_params.batch_norm_epsilon + + # Get stem static or dynamic convolution depending on image size + image_size = global_params.image_size + Conv2d = get_same_padding_conv2d(image_size=image_size) + + # Stem + in_channels = 3 # rgb + out_channels = round_filters(32, self._global_params) # number of output channels + self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) + self._bn0 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) + image_size = calculate_output_image_size(image_size, 2) + + # Build blocks + self._blocks = nn.ModuleList([]) + for block_args in self._blocks_args: + + # Update block input and output filters based on depth multiplier. + block_args = block_args._replace( + input_filters=round_filters(block_args.input_filters, self._global_params), + output_filters=round_filters(block_args.output_filters, self._global_params), + num_repeat=round_repeats(block_args.num_repeat, self._global_params) + ) + + # The first block needs to take care of stride and filter size increase. + self._blocks.append(MBConvBlock(block_args, self._global_params, image_size=image_size)) + image_size = calculate_output_image_size(image_size, block_args.stride) + if block_args.num_repeat > 1: # modify block_args to keep same output size + block_args = block_args._replace(input_filters=block_args.output_filters, stride=1) + for _ in range(block_args.num_repeat - 1): + self._blocks.append(MBConvBlock(block_args, self._global_params, image_size=image_size)) + # image_size = calculate_output_image_size(image_size, block_args.stride) # stride = 1 + + # Head + in_channels = block_args.output_filters # output of final block + out_channels = round_filters(1280, self._global_params) + Conv2d = get_same_padding_conv2d(image_size=image_size) + self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False) + self._bn1 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) + + # Final linear layer + self._avg_pooling = nn.AdaptiveAvgPool2d(1) + self._dropout = nn.Dropout(self._global_params.dropout_rate) + self._fc = nn.Linear(out_channels, self._global_params.num_classes) + self._swish = MemoryEfficientSwish() + + def set_swish(self, memory_efficient=True): + """Sets swish function as memory efficient (for training) or standard (for export). + + Args: + memory_efficient (bool): Whether to use memory-efficient version of swish. + + """ + self._swish = MemoryEfficientSwish() if memory_efficient else Swish() + for block in self._blocks: + block.set_swish(memory_efficient) + + def extract_endpoints(self, inputs): + """Use convolution layer to extract features + from reduction levels i in [1, 2, 3, 4, 5]. + + Args: + inputs (tensor): Input tensor. + + Returns: + Dictionary of last intermediate features + with reduction levels i in [1, 2, 3, 4, 5]. + Example: + >>> import torch + >>> from efficientnet.model import EfficientNet + >>> inputs = torch.rand(1, 3, 224, 224) + >>> model = EfficientNet.from_pretrained('efficientnet-b0') + >>> endpoints = model.extract_features(inputs) + >>> print(endpoints['reduction_1'].shape) # torch.Size([1, 16, 112, 112]) + >>> print(endpoints['reduction_2'].shape) # torch.Size([1, 24, 56, 56]) + >>> print(endpoints['reduction_3'].shape) # torch.Size([1, 40, 28, 28]) + >>> print(endpoints['reduction_4'].shape) # torch.Size([1, 112, 14, 14]) + >>> print(endpoints['reduction_5'].shape) # torch.Size([1, 1280, 7, 7]) + """ + endpoints = dict() + + # Stem + x = self._swish(self._bn0(self._conv_stem(inputs))) + # x = self._swish(self._conv_stem(inputs)) + prev_x = x + + # Blocks + for idx, block in enumerate(self._blocks): + drop_connect_rate = self._global_params.drop_connect_rate + if drop_connect_rate: + drop_connect_rate *= float(idx) / len(self._blocks) # scale drop connect_rate + x = block(x, drop_connect_rate=drop_connect_rate) + if prev_x.size(2) > x.size(2): + endpoints[f'reduction_{len(endpoints)+1}'] = prev_x + prev_x = x + + # Head + x = self._swish(self._bn1(self._conv_head(x))) + # x = self._swish(self._conv_head(x)) + endpoints[f'reduction_{len(endpoints)+1}'] = x + + return endpoints + + def extract_features(self, inputs): + """use convolution layer to extract feature . + + Args: + inputs (tensor): Input tensor. + + Returns: + Output of the final convolution + layer in the efficientnet model. + """ + # Stem + x = self._swish(self._bn0(self._conv_stem(inputs))) + # x = self._swish(self._conv_stem(inputs)) + + # Blocks + for idx, block in enumerate(self._blocks): + drop_connect_rate = self._global_params.drop_connect_rate + if drop_connect_rate: + drop_connect_rate *= float(idx) / len(self._blocks) # scale drop connect_rate + x = block(x, drop_connect_rate=drop_connect_rate) + + # Head + x = self._swish(self._bn1(self._conv_head(x))) + # x = self._swish(self._conv_head(x)) + + return x + + def forward(self, inputs): + """EfficientNet's forward function. + Calls extract_features to extract features, applies final linear layer, and returns logits. + + Args: + inputs (tensor): Input tensor. + + Returns: + Output of this model after processing. + """ + bs = inputs.size(0) + + # Convolution layers + x = self.extract_features(inputs) + + # Pooling and final linear layer + x = self._avg_pooling(x) + # x = x.view(bs, -1) + x = torch.flatten(x, start_dim=1) + # x = self._dropout(x.to('cpu')) + # x = self._fc(x.to('npu:5')) + x = self._dropout(x) + x = self._fc(x) + + return x + + @classmethod + def from_name(cls, model_name, in_channels=3, **override_params): + """create an efficientnet model according to name. + + Args: + model_name (str): Name for efficientnet. + in_channels (int): Input data's channel number. + override_params (other key word params): + Params to override model's global_params. + Optional key: + 'width_coefficient', 'depth_coefficient', + 'image_size', 'dropout_rate', + 'num_classes', 'batch_norm_momentum', + 'batch_norm_epsilon', 'drop_connect_rate', + 'depth_divisor', 'min_depth' + + Returns: + An efficientnet model. + """ + cls._check_model_name_is_valid(model_name) + blocks_args, global_params = get_model_params(model_name, override_params) + model = cls(blocks_args, global_params) + model._change_in_channels(in_channels) + return model + + @classmethod + def from_pretrained(cls, model_name, weights_path=None, advprop=False, + in_channels=3, num_classes=1000, **override_params): + """create an efficientnet model according to name. + + Args: + model_name (str): Name for efficientnet. + weights_path (None or str): + str: path to pretrained weights file on the local disk. + None: use pretrained weights downloaded from the Internet. + advprop (bool): + Whether to load pretrained weights + trained with advprop (valid when weights_path is None). + in_channels (int): Input data's channel number. + num_classes (int): + Number of categories for classification. + It controls the output size for final linear layer. + override_params (other key word params): + Params to override model's global_params. + Optional key: + 'width_coefficient', 'depth_coefficient', + 'image_size', 'dropout_rate', + 'num_classes', 'batch_norm_momentum', + 'batch_norm_epsilon', 'drop_connect_rate', + 'depth_divisor', 'min_depth' + + Returns: + A pretrained efficientnet model. + """ + model = cls.from_name(model_name, num_classes = num_classes, **override_params) + load_pretrained_weights(model, model_name, weights_path=weights_path, load_fc=(num_classes == 1000), advprop=advprop) + model._change_in_channels(in_channels) + return model + + @classmethod + def get_image_size(cls, model_name): + """Get the input image size for a given efficientnet model. + + Args: + model_name (str): Name for efficientnet. + + Returns: + Input image size (resolution). + """ + cls._check_model_name_is_valid(model_name) + _, _, res, _ = efficientnet_params(model_name) + return res + + @classmethod + def _check_model_name_is_valid(cls, model_name): + """Validates model name. + + Args: + model_name (str): Name for efficientnet. + + Returns: + bool: Is a valid name or not. + """ + valid_models = ['efficientnet-b'+str(i) for i in range(9)] + + # Support the construction of 'efficientnet-l2' without pretrained weights + valid_models += ['efficientnet-l2'] + + if model_name not in valid_models: + raise ValueError('model_name should be one of: ' + ', '.join(valid_models)) + + def _change_in_channels(self, in_channels): + """Adjust model's first convolution layer to in_channels, if in_channels not equals 3. + + Args: + in_channels (int): Input data's channel number. + """ + if in_channels != 3: + Conv2d = get_same_padding_conv2d(image_size = self._global_params.image_size) + out_channels = round_filters(32, self._global_params) + self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/npu_info.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/npu_info.py new file mode 100644 index 0000000..e9e6775 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/npu_info.py @@ -0,0 +1,7 @@ +def set_value(value): + global _npu_id + _npu_id = value + print('set device id %s success'%_npu_id) + +def get_value(): + return _npu_id \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/rmsprop_tf.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/rmsprop_tf.py new file mode 100644 index 0000000..5557961 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/rmsprop_tf.py @@ -0,0 +1,122 @@ +import torch +from torch.optim import Optimizer + + +class RMSpropTF(Optimizer): + """Implements RMSprop algorithm (TensorFlow style epsilon) + + NOTE: This is a direct cut-and-paste of PyTorch RMSprop with eps applied before sqrt + to closer match Tensorflow for matching hyper-params. + + Proposed by G. Hinton in his + `course `_. + + The centered version first appears in `Generating Sequences + With Recurrent Neural Networks `_. + + Arguments: + params (iterable): iterable of parameters to optimize or dicts defining + parameter groups + lr (float, optional): learning rate (default: 1e-2) + momentum (float, optional): momentum factor (default: 0) + alpha (float, optional): smoothing (decay) constant (default: 0.9) + eps (float, optional): term added to the denominator to improve + numerical stability (default: 1e-10) + centered (bool, optional) : if ``True``, compute the centered RMSProp, + the gradient is normalized by an estimation of its variance + weight_decay (float, optional): weight decay (L2 penalty) (default: 0) + decoupled_decay (bool, optional): decoupled weight decay as per https://arxiv.org/abs/1711.05101 + lr_in_momentum (bool, optional): learning rate scaling is included in the momentum buffer + update as per defaults in Tensorflow + + """ + + def __init__(self, params, lr=1e-2, alpha=0.9, eps=1e-10, weight_decay=0, momentum=0., centered=False, + decoupled_decay=False, lr_in_momentum=True): + if not 0.0 <= lr: + raise ValueError("Invalid learning rate: {}".format(lr)) + if not 0.0 <= eps: + raise ValueError("Invalid epsilon value: {}".format(eps)) + if not 0.0 <= momentum: + raise ValueError("Invalid momentum value: {}".format(momentum)) + if not 0.0 <= weight_decay: + raise ValueError("Invalid weight_decay value: {}".format(weight_decay)) + if not 0.0 <= alpha: + raise ValueError("Invalid alpha value: {}".format(alpha)) + + defaults = dict(lr=lr, momentum=momentum, alpha=alpha, eps=eps, centered=centered, weight_decay=weight_decay, + decoupled_decay=decoupled_decay, lr_in_momentum=lr_in_momentum) + super(RMSpropTF, self).__init__(params, defaults) + + def __setstate__(self, state): + super(RMSpropTF, self).__setstate__(state) + for group in self.param_groups: + group.setdefault('momentum', 0) + group.setdefault('centered', False) + + def step(self, closure=None): + """Performs a single optimization step. + + Arguments: + closure (callable, optional): A closure that reevaluates the model + and returns the loss. + """ + loss = None + if closure is not None: + loss = closure() + + for group in self.param_groups: + for p in group['params']: + if p.grad is None: + continue + grad = p.grad.data + if grad.is_sparse: + raise RuntimeError('RMSprop does not support sparse gradients') + state = self.state[p] + + # State initialization + if len(state) == 0: + state['step'] = 0 + state['square_avg'] = torch.ones_like(p.data) # PyTorch inits to zero + if group['momentum'] > 0: + state['momentum_buffer'] = torch.zeros_like(p.data) + if group['centered']: + state['grad_avg'] = torch.zeros_like(p.data) + + square_avg = state['square_avg'] + one_minus_alpha = 1. - group['alpha'] + + state['step'] += 1 + + if group['weight_decay'] != 0: + if 'decoupled_decay' in group and group['decoupled_decay']: + p.data.add_(-group['weight_decay'], p.data) + else: + grad = grad.add(group['weight_decay'], p.data) + + # Tensorflow order of ops for updating squared avg + square_avg.add_(one_minus_alpha, grad.pow(2) - square_avg) + # square_avg.mul_(alpha).addcmul_(1 - alpha, grad, grad) # PyTorch original + + if group['centered']: + grad_avg = state['grad_avg'] + grad_avg.add_(one_minus_alpha, grad - grad_avg) + # grad_avg.mul_(alpha).add_(1 - alpha, grad) # PyTorch original + avg = square_avg.addcmul(-1, grad_avg, grad_avg).add(group['eps']).sqrt_() # eps moved in sqrt + else: + avg = square_avg.add(group['eps']).sqrt_() # eps moved in sqrt + + if group['momentum'] > 0: + buf = state['momentum_buffer'] + # Tensorflow accumulates the LR scaling in the momentum buffer + if 'lr_in_momentum' in group and group['lr_in_momentum']: + buf.mul_(group['momentum']).addcdiv_(group['lr'], grad, avg) + p.data.add_(-buf) + else: + # PyTorch scales the param update by LR + buf.mul_(group['momentum']).addcdiv_(grad, avg) + p.data.add_(-group['lr'], buf) + else: + p.data.addcdiv_(-group['lr'], grad, avg) + + return loss \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/utils.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/utils.py new file mode 100644 index 0000000..d5285d7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/efficientnet_pytorch/utils.py @@ -0,0 +1,624 @@ +"""utils.py - Helper functions for building the model and for loading model parameters. + These helper functions are built to mirror those in the official TensorFlow implementation. +""" + +# Author: lukemelas (github username) +# Github repo: https://github.com/lukemelas/EfficientNet-PyTorch +# With adjustments and added comments by workingcoder (github username). + +import re +import math +import collections +from functools import partial +import numpy as np +import torch +from torch import nn +from torch.nn import functional as F +from torch.utils import model_zoo +from . import npu_info + +################################################################################ +### Help functions for model architecture +################################################################################ + +# GlobalParams and BlockArgs: Two namedtuples +# Swish and MemoryEfficientSwish: Two implementations of the method +# round_filters and round_repeats: +# Functions to calculate params for scaling model width and depth ! ! ! +# get_width_and_height_from_size and calculate_output_image_size +# drop_connect: A structural design +# get_same_padding_conv2d: +# Conv2dDynamicSamePadding +# Conv2dStaticSamePadding +# get_same_padding_maxPool2d: +# MaxPool2dDynamicSamePadding +# MaxPool2dStaticSamePadding +# It's an additional function, not used in EfficientNet, +# but can be used in other model (such as EfficientDet). +# Identity: An implementation of identical mapping + +# Parameters for the entire model (stem, all blocks, and head) +GlobalParams = collections.namedtuple('GlobalParams', [ + 'width_coefficient', 'depth_coefficient', 'image_size', 'dropout_rate', + 'num_classes', 'batch_norm_momentum', 'batch_norm_epsilon', + 'drop_connect_rate', 'depth_divisor', 'min_depth']) + +# Parameters for an individual model block +BlockArgs = collections.namedtuple('BlockArgs', [ + 'num_repeat', 'kernel_size', 'stride', 'expand_ratio', + 'input_filters', 'output_filters', 'se_ratio', 'id_skip']) + +# Set GlobalParams and BlockArgs's defaults +GlobalParams.__new__.__defaults__ = (None,) * len(GlobalParams._fields) +BlockArgs.__new__.__defaults__ = (None,) * len(BlockArgs._fields) + + +# An ordinary implementation of Swish function +class Swish(nn.Module): + def forward(self, x): + return x * torch.sigmoid(x) + +# A memory-efficient implementation of Swish function +class SwishImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, i): + result = i * torch.sigmoid(i) + ctx.save_for_backward(i) + return result + + @staticmethod + def backward(ctx, grad_output): + i = ctx.saved_tensors[0] + sigmoid_i = torch.sigmoid(i) + return grad_output * (sigmoid_i * (1 + i * (1 - sigmoid_i))) + +class MemoryEfficientSwish(nn.Module): + def forward(self, x): + return SwishImplementation.apply(x) + + +def round_filters(filters, global_params): + """Calculate and round number of filters based on width multiplier. + Use width_coefficient, depth_divisor and min_depth of global_params. + + Args: + filters (int): Filters number to be calculated. + global_params (namedtuple): Global params of the model. + + Returns: + new_filters: New filters number after calculating. + """ + multiplier = global_params.width_coefficient + if not multiplier: + return filters + # TODO: modify the params names. + # maybe the names (width_divisor,min_width) + # are more suitable than (depth_divisor,min_depth). + divisor = global_params.depth_divisor + min_depth = global_params.min_depth + filters *= multiplier + min_depth = min_depth or divisor # pay attention to this line when using min_depth + # follow the formula transferred from official TensorFlow implementation + new_filters = max(min_depth, int(filters + divisor / 2) // divisor * divisor) + if new_filters < 0.9 * filters: # prevent rounding by more than 10% + new_filters += divisor + return int(new_filters) + + +def round_repeats(repeats, global_params): + """Calculate module's repeat number of a block based on depth multiplier. + Use depth_coefficient of global_params. + + Args: + repeats (int): num_repeat to be calculated. + global_params (namedtuple): Global params of the model. + + Returns: + new repeat: New repeat number after calculating. + """ + multiplier = global_params.depth_coefficient + if not multiplier: + return repeats + # follow the formula transferred from official TensorFlow implementation + return int(math.ceil(multiplier * repeats)) + + +def drop_connect(inputs, p, training): + """Drop connect. + + Args: + input (tensor: BCWH): Input of this structure. + p (float: 0.0~1.0): Probability of drop connection. + training (bool): The running mode. + + Returns: + output: Output after drop connection. + """ + assert p >= 0 and p <= 1, 'p must be in range of [0,1]' + + if not training: + return inputs + + batch_size = inputs.shape[0] + keep_prob = 1 - p + + # generate binary_tensor mask according to probability (p for 0, 1-p for 1) + random_tensor = keep_prob + random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype, device=inputs.device) + binary_tensor = torch.floor(random_tensor) / keep_prob + + output = inputs * binary_tensor + return output + + +def get_width_and_height_from_size(x): + """Obtain height and width from x. + + Args: + x (int, tuple or list): Data size. + + Returns: + size: A tuple or list (H,W). + """ + if isinstance(x, int): + return x, x + if isinstance(x, list) or isinstance(x, tuple): + return x + else: + raise TypeError() + + +def calculate_output_image_size(input_image_size, stride): + """Calculates the output image size when using Conv2dSamePadding with a stride. + Necessary for static padding. Thanks to mannatsingh for pointing this out. + + Args: + input_image_size (int, tuple or list): Size of input image. + stride (int, tuple or list): Conv2d operation's stride. + + Returns: + output_image_size: A list [H,W]. + """ + if input_image_size is None: + return None + image_height, image_width = get_width_and_height_from_size(input_image_size) + stride = stride if isinstance(stride, int) else stride[0] + image_height = int(math.ceil(image_height / stride)) + image_width = int(math.ceil(image_width / stride)) + return [image_height, image_width] + + +# Note: +# The following 'SamePadding' functions make output size equal ceil(input size/stride). +# Only when stride equals 1, can the output size be the same as input size. +# Don't be confused by their function names ! ! ! + +def get_same_padding_conv2d(image_size=None): + """Chooses static padding if you have specified an image size, and dynamic padding otherwise. + Static padding is necessary for ONNX exporting of models. + + Args: + image_size (int or tuple): Size of the image. + + Returns: + Conv2dDynamicSamePadding or Conv2dStaticSamePadding. + """ + if image_size is None: + return Conv2dDynamicSamePadding + else: + return partial(Conv2dStaticSamePadding, image_size=image_size) + + +class Conv2dDynamicSamePadding(nn.Conv2d): + """2D Convolutions like TensorFlow, for a dynamic image size. + The padding is operated in forward function by calculating dynamically. + """ + + # Tips for 'SAME' mode padding. + # Given the following: + # i: width or height + # s: stride + # k: kernel size + # d: dilation + # p: padding + # Output after Conv2d: + # o = floor((i+p-((k-1)*d+1))/s+1) + # If o equals i, i = floor((i+p-((k-1)*d+1))/s+1), + # => p = (i-1)*s+((k-1)*d+1)-i + + def __init__(self, in_channels, out_channels, kernel_size, stride=1, dilation=1, groups=1, bias=True): + super().__init__(in_channels, out_channels, kernel_size, stride, 0, dilation, groups, bias) + self.stride = self.stride if len(self.stride) == 2 else [self.stride[0]] * 2 + + def forward(self, x): + ih, iw = x.size()[-2:] + kh, kw = self.weight.size()[-2:] + sh, sw = self.stride + oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) # change the output size according to stride ! ! ! + pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) + pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) + if pad_h > 0 or pad_w > 0: + x = F.pad(x, [pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2]) + return F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) + + +class Conv2dStaticSamePadding(nn.Conv2d): + """2D Convolutions like TensorFlow's 'SAME' mode, with the given input image size. + The padding mudule is calculated in construction function, then used in forward. + """ + + # With the same calculation as Conv2dDynamicSamePadding + + def __init__(self, in_channels, out_channels, kernel_size, stride=1, image_size=None, **kwargs): + super().__init__(in_channels, out_channels, kernel_size, stride, **kwargs) + self.stride = self.stride if len(self.stride) == 2 else [self.stride[0]] * 2 + + # Calculate padding based on image size and save it + assert image_size is not None + ih, iw = (image_size, image_size) if isinstance(image_size, int) else image_size + kh, kw = self.weight.size()[-2:] + sh, sw = self.stride + oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) + pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) + pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) + if pad_h > 0 or pad_w > 0: + self.static_padding = nn.ZeroPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2)) + if kh % 2 != 0: + self.padding = (kh - 1) // 2 + else: + self.padding = kh // 2 + else: + self.static_padding = Identity() + + def forward(self, x): + x = F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) + return x + + +def get_same_padding_maxPool2d(image_size=None): + """Chooses static padding if you have specified an image size, and dynamic padding otherwise. + Static padding is necessary for ONNX exporting of models. + + Args: + image_size (int or tuple): Size of the image. + + Returns: + MaxPool2dDynamicSamePadding or MaxPool2dStaticSamePadding. + """ + if image_size is None: + return MaxPool2dDynamicSamePadding + else: + return partial(MaxPool2dStaticSamePadding, image_size=image_size) + + +class MaxPool2dDynamicSamePadding(nn.MaxPool2d): + """2D MaxPooling like TensorFlow's 'SAME' mode, with a dynamic image size. + The padding is operated in forward function by calculating dynamically. + """ + + def __init__(self, kernel_size, stride, padding=0, dilation=1, return_indices=False, ceil_mode=False): + super().__init__(kernel_size, stride, padding, dilation, return_indices, ceil_mode) + self.stride = [self.stride] * 2 if isinstance(self.stride, int) else self.stride + self.kernel_size = [self.kernel_size] * 2 if isinstance(self.kernel_size, int) else self.kernel_size + self.dilation = [self.dilation] * 2 if isinstance(self.dilation, int) else self.dilation + + def forward(self, x): + ih, iw = x.size()[-2:] + kh, kw = self.kernel_size + sh, sw = self.stride + oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) + pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) + pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) + if pad_h > 0 or pad_w > 0: + x = F.pad(x, [pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2]) + return F.max_pool2d(x, self.kernel_size, self.stride, self.padding, + self.dilation, self.ceil_mode, self.return_indices) + +class MaxPool2dStaticSamePadding(nn.MaxPool2d): + """2D MaxPooling like TensorFlow's 'SAME' mode, with the given input image size. + The padding mudule is calculated in construction function, then used in forward. + """ + + def __init__(self, kernel_size, stride, image_size=None, **kwargs): + super().__init__(kernel_size, stride, **kwargs) + self.stride = [self.stride] * 2 if isinstance(self.stride, int) else self.stride + self.kernel_size = [self.kernel_size] * 2 if isinstance(self.kernel_size, int) else self.kernel_size + self.dilation = [self.dilation] * 2 if isinstance(self.dilation, int) else self.dilation + + # Calculate padding based on image size and save it + assert image_size is not None + ih, iw = (image_size, image_size) if isinstance(image_size, int) else image_size + kh, kw = self.kernel_size + sh, sw = self.stride + oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) + pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) + pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) + if pad_h > 0 or pad_w > 0: + self.static_padding = nn.ZeroPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2)) + else: + self.static_padding = Identity() + + def forward(self, x): + x = self.static_padding(x) + x = F.max_pool2d(x, self.kernel_size, self.stride, self.padding, + self.dilation, self.ceil_mode, self.return_indices) + return x + +class Identity(nn.Module): + """Identity mapping. + Send input to output directly. + """ + + def __init__(self): + super(Identity, self).__init__() + + def forward(self, input): + return input + + +################################################################################ +### Helper functions for loading model params +################################################################################ + +# BlockDecoder: A Class for encoding and decoding BlockArgs +# efficientnet_params: A function to query compound coefficient +# get_model_params and efficientnet: +# Functions to get BlockArgs and GlobalParams for efficientnet +# url_map and url_map_advprop: Dicts of url_map for pretrained weights +# load_pretrained_weights: A function to load pretrained weights + +class BlockDecoder(object): + """Block Decoder for readability, + straight from the official TensorFlow repository. + """ + + @staticmethod + def _decode_block_string(block_string): + """Get a block through a string notation of arguments. + + Args: + block_string (str): A string notation of arguments. + Examples: 'r1_k3_s11_e1_i32_o16_se0.25_noskip'. + + Returns: + BlockArgs: The namedtuple defined at the top of this file. + """ + assert isinstance(block_string, str) + + ops = block_string.split('_') + options = {} + for op in ops: + splits = re.split(r'(\d.*)', op) + if len(splits) >= 2: + key, value = splits[:2] + options[key] = value + + # Check stride + assert (('s' in options and len(options['s']) == 1) or + (len(options['s']) == 2 and options['s'][0] == options['s'][1])) + + return BlockArgs( + num_repeat=int(options['r']), + kernel_size=int(options['k']), + stride=[int(options['s'][0])], + expand_ratio=int(options['e']), + input_filters=int(options['i']), + output_filters=int(options['o']), + se_ratio=float(options['se']) if 'se' in options else None, + id_skip=('noskip' not in block_string)) + + @staticmethod + def _encode_block_string(block): + """Encode a block to a string. + + Args: + block (namedtuple): A BlockArgs type argument. + + Returns: + block_string: A String form of BlockArgs. + """ + args = [ + 'r%d' % block.num_repeat, + 'k%d' % block.kernel_size, + 's%d%d' % (block.strides[0], block.strides[1]), + 'e%s' % block.expand_ratio, + 'i%d' % block.input_filters, + 'o%d' % block.output_filters + ] + if 0 < block.se_ratio <= 1: + args.append('se%s' % block.se_ratio) + if block.id_skip is False: + args.append('noskip') + return '_'.join(args) + + @staticmethod + def decode(string_list): + """Decode a list of string notations to specify blocks inside the network. + + Args: + string_list (list[str]): A list of strings, each string is a notation of block. + + Returns: + blocks_args: A list of BlockArgs namedtuples of block args. + """ + assert isinstance(string_list, list) + blocks_args = [] + for block_string in string_list: + blocks_args.append(BlockDecoder._decode_block_string(block_string)) + return blocks_args + + @staticmethod + def encode(blocks_args): + """Encode a list of BlockArgs to a list of strings. + + Args: + blocks_args (list[namedtuples]): A list of BlockArgs namedtuples of block args. + + Returns: + block_strings: A list of strings, each string is a notation of block. + """ + block_strings = [] + for block in blocks_args: + block_strings.append(BlockDecoder._encode_block_string(block)) + return block_strings + + +def efficientnet_params(model_name): + """Map EfficientNet model name to parameter coefficients. + + Args: + model_name (str): Model name to be queried. + + Returns: + params_dict[model_name]: A (width,depth,res,dropout) tuple. + """ + params_dict = { + # Coefficients: width,depth,res,dropout + 'efficientnet-b0': (1.0, 1.0, 224, 0.2), + 'efficientnet-b1': (1.0, 1.1, 240, 0.2), + 'efficientnet-b2': (1.1, 1.2, 260, 0.3), + 'efficientnet-b3': (1.2, 1.4, 300, 0.3), + 'efficientnet-b4': (1.4, 1.8, 380, 0.4), + 'efficientnet-b5': (1.6, 2.2, 456, 0.4), + 'efficientnet-b6': (1.8, 2.6, 528, 0.5), + 'efficientnet-b7': (2.0, 3.1, 600, 0.5), + 'efficientnet-b8': (2.2, 3.6, 672, 0.5), + 'efficientnet-l2': (4.3, 5.3, 800, 0.5), + } + return params_dict[model_name] + + +def efficientnet(width_coefficient=None, depth_coefficient=None, image_size=None, + dropout_rate=0.2, drop_connect_rate=0.2, num_classes=1000): + """Create BlockArgs and GlobalParams for efficientnet model. + + Args: + width_coefficient (float) + depth_coefficient (float) + image_size (int) + dropout_rate (float) + drop_connect_rate (float) + num_classes (int) + + Meaning as the name suggests. + + Returns: + blocks_args, global_params. + """ + + # Blocks args for the whole model(efficientnet-b0 by default) + # It will be modified in the construction of EfficientNet Class according to model + blocks_args = [ + 'r1_k3_s11_e1_i32_o16_se0.25', + 'r2_k3_s22_e6_i16_o24_se0.25', + 'r2_k5_s22_e6_i24_o40_se0.25', + 'r3_k3_s22_e6_i40_o80_se0.25', + 'r3_k5_s11_e6_i80_o112_se0.25', + 'r4_k5_s22_e6_i112_o192_se0.25', + 'r1_k3_s11_e6_i192_o320_se0.25', + ] + + blocks_args = BlockDecoder.decode(blocks_args) + + global_params = GlobalParams( + width_coefficient=width_coefficient, + depth_coefficient=depth_coefficient, + image_size=image_size, + dropout_rate=dropout_rate, + + num_classes=num_classes, + batch_norm_momentum=0.99, + batch_norm_epsilon=1e-3, + drop_connect_rate=drop_connect_rate, + depth_divisor=8, + min_depth=None, + ) + + return blocks_args, global_params + + +def get_model_params(model_name, override_params): + """Get the block args and global params for a given model name. + + Args: + model_name (str): Model's name. + override_params (dict): A dict to modify global_params. + + Returns: + blocks_args, global_params + """ + if model_name.startswith('efficientnet'): + w, d, s, p = efficientnet_params(model_name) + # note: all models have drop connect rate = 0.2 + blocks_args, global_params = efficientnet( + width_coefficient=w, depth_coefficient=d, dropout_rate=p, image_size=s) + else: + raise NotImplementedError('model name is not pre-defined: %s' % model_name) + if override_params: + # ValueError will be raised here if override_params has fields not included in global_params. + global_params = global_params._replace(**override_params) + return blocks_args, global_params + + +# train with Standard methods +# check more details in paper(EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks) +url_map = { + 'efficientnet-b0': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b0-355c32eb.pth', + 'efficientnet-b1': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b1-f1951068.pth', + 'efficientnet-b2': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b2-8bb594d6.pth', + 'efficientnet-b3': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b3-5fb5a3c3.pth', + 'efficientnet-b4': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b4-6ed6700e.pth', + 'efficientnet-b5': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b5-b6417697.pth', + 'efficientnet-b6': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b6-c76e70fd.pth', + 'efficientnet-b7': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b7-dcc49843.pth', +} + +# train with Adversarial Examples(AdvProp) +# check more details in paper(Adversarial Examples Improve Image Recognition) +url_map_advprop = { + 'efficientnet-b0': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b0-b64d5a18.pth', + 'efficientnet-b1': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b1-0f3ce85a.pth', + 'efficientnet-b2': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b2-6e9d97e5.pth', + 'efficientnet-b3': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b3-cdd7c0f4.pth', + 'efficientnet-b4': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b4-44fb3a87.pth', + 'efficientnet-b5': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b5-86493f6b.pth', + 'efficientnet-b6': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b6-ac80338e.pth', + 'efficientnet-b7': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b7-4652b6dd.pth', + 'efficientnet-b8': 'https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/adv-efficientnet-b8-22a8fe65.pth', +} + +# TODO: add the petrained weights url map of 'efficientnet-l2' + + +def load_pretrained_weights(model, model_name, weights_path=None, load_fc=True, advprop=False): + """Loads pretrained weights from weights path or download using url. + + Args: + model (Module): The whole model of efficientnet. + model_name (str): Model name of efficientnet. + weights_path (None or str): + str: path to pretrained weights file on the local disk. + None: use pretrained weights downloaded from the Internet. + load_fc (bool): Whether to load pretrained weights for fc layer at the end of the model. + advprop (bool): Whether to load pretrained weights + trained with advprop (valid when weights_path is None). + """ + if isinstance(weights_path,str): + state_dict = torch.load(weights_path) + else: + # AutoAugment or Advprop (different preprocessing) + url_map_ = url_map_advprop if advprop else url_map + state_dict = model_zoo.load_url(url_map_[model_name]) + + if load_fc: + ret = model.load_state_dict(state_dict, strict=False) + assert not ret.missing_keys, f'Missing keys when loading pretrained weights: {ret.missing_keys}' + else: + state_dict.pop('_fc.weight') + state_dict.pop('_fc.bias') + ret = model.load_state_dict(state_dict, strict=False) + assert set(ret.missing_keys) == set( + ['_fc.weight', '_fc.bias']), f'Missing keys when loading pretrained weights: {ret.missing_keys}' + assert not ret.unexpected_keys, f'Missing keys when loading pretrained weights: {ret.unexpected_keys}' + + print('Loaded pretrained weights for {}'.format(model_name)) diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/README.md b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/README.md new file mode 100644 index 0000000..fcafce3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/README.md @@ -0,0 +1,23 @@ +### Imagenet + +This is a preliminary directory for evaluating the model on ImageNet. It is adapted from the standard PyTorch Imagenet script. + +For now, only evaluation is supported, but I am currently building scripts to assist with training new models on Imagenet. + +The evaluation results are slightly different from the original TensorFlow repository, due to differences in data preprocessing. For example, with the current preprocessing, `efficientnet-b3` gives a top-1 accuracy of `80.8`, rather than `81.1` in the paper. I am working on porting the TensorFlow preprocessing into PyTorch to address this issue. + +To run on Imagenet, place your `train` and `val` directories in `data`. + +Example commands: +```bash +# Evaluate small EfficientNet on CPU +python main.py data -e -a 'efficientnet-b0' --pretrained +``` +```bash +# Evaluate medium EfficientNet on GPU +python main.py data -e -a 'efficientnet-b3' --pretrained --gpu 0 --batch-size 128 +``` +```bash +# Evaluate ResNet-50 for comparison +python main.py data -e -a 'resnet50' --pretrained --gpu 0 +``` diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/data/README.md b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/data/README.md new file mode 100644 index 0000000..310c6e0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/data/README.md @@ -0,0 +1,5 @@ +### ImageNet + +Download ImageNet and place it into `train` and `val` folders here. + +More details may be found with the official PyTorch ImageNet example [here](https://github.com/pytorch/examples/blob/master/imagenet). diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/main.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/main.py new file mode 100644 index 0000000..9a0bfad --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/imagenet/main.py @@ -0,0 +1,531 @@ +""" +Evaluate on ImageNet. Note that at the moment, training is not implemented (I am working on it). +that being said, evaluation is working. +""" + +import argparse +import os +import sys +import random +import shutil +import time +import warnings +import PIL +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models + +from apex import amp + +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../')) +from efficientnet_pytorch import EfficientNet +from efficientnet_pytorch import rand_augment_transform, augment_and_mix_transform, auto_augment_transform +from efficientnet_pytorch import RMSpropTF +from efficientnet_pytorch import npu_info + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', + help='model architecture (default: resnet18)') +parser.add_argument('-j', '--workers', default=128, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=256, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-5, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='hccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--npu', default=None, type=str, + help='npu id to use.') +parser.add_argument('--image_size', default=224, type=int, + help='image size') +parser.add_argument('--advprop', default=False, action='store_true', + help='use advprop or not') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('--autoaug', action='store_true', help='use auto augment') +parser.add_argument('--amp', action='store_true', help='use apex') +parser.add_argument('--pm', '--precision-mode', default='O1', type=str, + help='precision mode to use for mix precision, only support O1, O2') +parser.add_argument('--loss_scale', default=1024, type=int, help='loss_scale for amp') +parser.add_argument('--addr', default='127.0.0.1', type=str, + help='npu id to use.') +parser.add_argument('--nnpus_per_node', default=None, type=int, + help='number of npus to use for distributed train on each node') +parser.add_argument('--val_feq', default=10, type=int, + help='validation frequency') +parser.add_argument('--device_list', default='0,1,2,3,4,5,6,7', type=str, help='device id list') + +def device_id_to_process_device_map(device_list): + devices = device_list.split(",") + devices = [int(x) for x in devices] + devices.sort() + + process_device_map = dict() + for process_id, device_id in enumerate(devices): + process_device_map[process_id] = device_id + + return process_device_map + + +def main(): + args = parser.parse_args() + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + args.process_device_map = device_id_to_process_device_map(args.device_list) + nnpus_per_node = len(args.process_device_map) + + + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = nnpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + os.environ['MASTER_ADDR'] = args.addr + os.environ['MASTER_PORT'] = '29688' + mp.spawn(main_worker, nprocs=nnpus_per_node, args=(nnpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.npu, nnpus_per_node, args) + +def main_worker(npu, nnpus_per_node, args): + args.npu = npu + + if args.distributed: + args.npu = args.process_device_map[npu] + + if args.npu is not None: + print("Use npu: {} for training".format(args.npu)) + torch.npu.set_device('npu:' + str(args.npu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * nnpus_per_node + int(npu) + + dist.init_process_group(backend=args.dist_backend, + world_size=args.world_size, rank=args.rank) + # create model + if 'efficientnet' in args.arch: # NEW + if args.pretrained: + model = EfficientNet.from_pretrained(args.arch, advprop=args.advprop) + print("=> using pre-trained model '{}'".format(args.arch)) + else: + print("=> creating model '{}'".format(args.arch)) + model = EfficientNet.from_name(args.arch) + + else: + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + + criterion = nn.CrossEntropyLoss().to('npu:' + str(args.npu)) + + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + model = model.to('npu:' + str(args.npu)) + if args.amp: + print("=> use amp...") + if args.pm not in ['O1', 'O2']: + print('=>unsupported precision mode!') + exit() + opt_level = args.pm + model, optimizer = amp.initialize(model, optimizer, opt_level=opt_level, loss_scale=args.loss_scale) + + global total_batch_size + total_batch_size = args.batch_size + if args.distributed: + args.batch_size = int(args.batch_size / nnpus_per_node) + args.workers = int(args.workers / nnpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.npu], broadcast_buffers=False) + + + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location='npu:' + str(args.npu)) + args.start_epoch = checkpoint['epoch'] + if args.amp: + amp.load_state_dict(checkpoint['amp']) + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + if args.advprop: + normalize = transforms.Lambda(lambda img: img * 2.0 - 1.0) + else: + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + if 'efficientnet' in args.arch: + image_size = EfficientNet.get_image_size(args.arch) + else: + image_size = args.image_size + + if args.autoaug: + print("=> use auto augment...") + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(image_size), + auto_augment_wrapper(image_size), + transforms.ToTensor(), + normalize, + ])) + else: + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(image_size), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + val_transforms = transforms.Compose([ + transforms.Resize(image_size, interpolation=PIL.Image.BICUBIC), + transforms.CenterCrop(image_size), + transforms.ToTensor(), + normalize, + ]) + print('npu:' + str(args.npu), ' optimizer params:', optimizer) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, val_transforms), + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True) + + if args.evaluate: + res = validate(val_loader, model, criterion, args) + with open('res.txt', 'w') as f: + print(res, file=f) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch, args, nnpus_per_node) + + # evaluate on validation set + if epoch % args.val_feq == 0 or epoch == args.epochs - 1: + acc1 = validate(val_loader, model, criterion, args, epoch, nnpus_per_node) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % nnpus_per_node == 0): + if not args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'optimizer': optimizer.state_dict(), + }) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }) + + +def train(train_loader, model, criterion, optimizer, epoch, args, nnpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':6.4f') + lr = AverageMeter('LR', ':6.4f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + fps_time = AverageMeter('FPS', ':6.1f') + progress = ProgressMeter(len(train_loader), fps_time, batch_time, data_time, losses, lr, top1, + top5, prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + + end = time.time() + for i, (images, target) in enumerate(train_loader): + adjust_learning_rate_fraction_epoch(optimizer, epoch, i, len(train_loader), args) + + # measure data loading time + data_time.update(time.time() - end) + + optimizer.zero_grad() + + target = target.int() + images, target = images.to('npu:' + str(args.npu), non_blocking=True), target.to('npu:' + str(args.npu), non_blocking=True) + + # compute output + output = model(images) + + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + + losses.update(loss.item(), images.size(0)) + lr.update(optimizer.param_groups[0]['lr'], images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + # compute gradient and do SGD step + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + optimizer.step() + + # measure elapsed time + fps_time.update(total_batch_size / (time.time() - end)) + batch_time.update(time.time() - end) + end = time.time() + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % nnpus_per_node == 0): + progress.print(i) + + # print(' * FPS@all {:.3f}'.format(nnpus_per_node*args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=('{}'.format(fps_time))) + +def validate(val_loader, model, criterion, args, epoch, nnpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter(len(val_loader), batch_time, losses, top1, top5, + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + target = target.int() + images, target = images.to('npu:' + str(args.npu), non_blocking=True), target.to('npu:' + str(args.npu), non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % nnpus_per_node == 0): + progress.print(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % nnpus_per_node == 0): + + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + + return top1.avg + + +def save_checkpoint(state, filename='checkpoint.pth'): + torch.save(state, filename) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.skip = 0 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + self.skip = 0 + + def update(self, val, n=1): + self.val = val + # the first 5 value are not accumulated in the average stats + self.skip += 1 + if self.skip < 5: + return + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, *meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def print(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + +def auto_augment_wrapper(img_size, auto_augment='original-mstd0.5'): + IMAGENET_DEFAULT_MEAN = [0.485, 0.456, 0.406] + assert isinstance(auto_augment, str) + aa_params = dict( + translate_const=int(img_size * 0.45), + img_mean=tuple([min(255, round(255 * x)) for x in IMAGENET_DEFAULT_MEAN]), + ) + if auto_augment.startswith('rand'): + return rand_augment_transform(auto_augment, aa_params) + elif auto_augment.startswith('augmix'): + aa_params['translate_pct'] = 0.3 + return augment_and_mix_transform(auto_augment, aa_params) + else: + return auto_augment_transform(auto_augment, aa_params) + +def adjust_learning_rate_fraction_epoch(optimizer, epoch, step, steps_per_epoch, args): + """Sets the learning rate to the initial LR decayed by 0.97 every 3.0 epochs""" + + lr = args.lr * (0.97 ** ((step + epoch * steps_per_epoch) // int(steps_per_epoch * 5.0))) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + +if __name__ == '__main__': + cpu_info, npu_infos, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_infos) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/check.ipynb b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/check.ipynb new file mode 100644 index 0000000..a147ef0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/check.ipynb @@ -0,0 +1,177 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TensorFlow Consistency Check\n", + "\n", + "In this example, we demonstrate that our model gives the same output as the original TensorFlow implementation, when using the same image pre-processing. Note that this notebook requires TensorFlow in order to do the pre-processing. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from PIL import Image\n", + "\n", + "import torch\n", + "import tensorflow as tf\n", + "\n", + "from efficientnet_pytorch import EfficientNet" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "model_name = 'efficientnet-b0'\n", + "image_size = EfficientNet.get_image_size(model_name) # 224" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArgAAAJlCAIAAAC+AhaJAAEAAElEQVR4nHT9WY8sW5odiO15b5t9jjnOOffcIe+QebMqs7JYlVVsNptsSNCLIKEF6J/oTwgQoEe9S4AgoNESSUENkt3VLGZlsoac7nzumWMOn2y2PethR/iNvEXaQ8DD3dzcbJv7Xutb3/q+Df/P/6f/Y1EUm6asu5ZFwgD06PG7/+K/+d8cn74DPAUIDlcX//DLv1ovz/IEY+icQHGUZkVuPeyGASCkrVsul33fE0IAcNPJeDTKL87evH39SgihPdlsNqPxeDabHR0dLxaLq+vby8vrpmnenF84C6qqghDFaSKlXMz368327Oxstth3AK5XmzdnV0LEt7e3QsR5kjJCOaGcEaM0Ai7P85//+Z+cXZz/q3/1r/b29tqh18rMFvOLq8tyW3/4ycfFePTs2bPxdP7+++9vt1vC6NnV18bYtu44i7S21oA8LZqm2dvbqzbbpq0Q9nmaZFmSpJEQnFiMCL68vFxvN0cnJ6ePH5Vl+fLN6ydPnv7o40/evn17cXb++9/8djGfHx4eVtty4rhzLs/zOI7jNGKMNX0HADg42v+bv/mb6WL+L//lv8xHmffeObdarX75+3+4uLiICB/l4x99+PHl+dV//9//DwcHB4RRC0Fvhj/6059MDhbZtPAEAgTXy9uubRlj3377bd+0R0dH2/Wm3pZaa2etYJxzTiAihBhjyrLce//Jp59++u/+3b+LomQ+nX3++Rec8/Xt+mD/iHMOHKzrZhgGAJD3Xmtdl6brOkyJc2a13QAATk5ODg4OxqPpxx9+SDHbm8y6pv/rv/oPb1+/qaqKzMef/vBHl5eXRZZ89rvfz8aTvb29YpRfXV31fS+1TvNkb29vtrd4+frVL37xi+OjJ2kae+/Wm2VVraNYzOfToihubm6urm7KbSN4GseZdxBCwqhQ8poQMpqOEIJlvY0iHqWiqipljIfIGm8cpFzEUc4YBwCgZAAAOOes8cYYpYxW1lq3vLkVIqaUG+2UUt4DSimltFuvkiSJ4xhCb4xxzmEEEELG6JgLiPwwDN6aoigWi0We59ATQoj1DgDw9uzs/OpSRKzve4QQxrirG4rJ3nxhtSw3W875wUG62WyA81maCEqSWBRpRjE5OTl57733Xr9+e35xVRSjQZmLi6vzy4s4TrMkff36NbLeWfv45NF//V/9s8vLy9/97rNtWW7r6vD4qOr6LM9ne4s/+skff/v8y81mU9e1994YI2WPEIqi6Ob2CmMshEAIMMYWi0Wapm3bwsYqpYz13gOlTNP2UkpvwXw+F5yqtgfOeGv+1//yX/7yb/4jhBBCHMfxer1u23pvb288HkdRNJ2OvfcvXn57cXFBKbXWnpwcG2MQQhHGP/z0x998803b9cenjy9uVtc3twCAvYPDsixHebZYLA72987evJJSDsPQdY0Qwnv/5uwCQjiaTLXWIooJZ6v1tus6kaQHBwe//d3vwt2cF6ht2+Pj4yiKOGVZlimlpuPJaDRqmqZcb25vb733x8fHo9GobZqX1zd1XTvnFosFgoQxNhqNrq9vvPe//e1vx+NpFEUffPDBe++99//5f//rf/Nv/s0HP/qAMtE0jYNIG1d3PYCoLEspJULovXef/ulPfzIqsrPXry4vL4G3xfS4aRqttfceQpimOaW0ruu6bouiuLy8xIimaeqcG41GWuu+H7TWWmvvHaU0S+M0jaMoMmrQWjnnvDNd122362EYIIRphIo8PzjY04OczWbWKELIarnBGFMublfbuuny8QQi1g9SCKFVixB6/OjR+fl5GgnBueoHa21VbYui+PrbZ9bbKE2qquJCAACkNAAArXWe59PJfLvddl23WCwIYQAAIQSEuGkaay1CSCkFCEYIaa3btlNKEUKEEJRwjDGEGCFkjOm6bhgUpTRJEsKdcw4AQClljHmIwuW3/UAphRDGUZpkqVKqbVuMsdceYwwhlFJWVdW2LQCAc44QCscBAFhrrbWUUiFEnKfX19ec8zzP67bV2hBCejlAgKuqqtrGGAMhBgBACBHGnDHnnLUWAIAQghCGYxJCwl/GGADAe08I4ZwTdvdeIcSomKRpGi4QQrxara6vr5umBQBgjO+nHei9996HwzrnjDHWWu89xjhchdbaWgshRAh568JEFI4QnsQYSymNMRBCQgiEMAwaAEApRSkFAFgtvfeUIO+9kZJRzCnjnApGIITAeeet995jrLV2zkEIwxQRjrk7w92HQgghhAWGSqko4pwzaSShKMsySjHBmJd1M0gZx7HD8PbyhvGk6xqAoGlrp3Tdbi00ZbMtt52I0HRSSKuQV8b5bpBERABiCGwkKEKoqtrXr7dXF7gsN5vNhnM+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bb1czm/eutu0VV1X33zz1fHxMaAjtBNCOFnXlU5iVxR9KSVnab83GfS3er3hRx/9II7j99794PDweHt7N45jzsTZ8mi1uryzde/OW/c+++SL2dQWeYEIzrp+nyMUXacRnHet9Z33aJQGfz2V+h11NMsS9BvLwc1NK3iaZw8ePbp37/7nX3395NmzB48e33/n0ddffztdLkSWaOsIInDqCVBGMKZaa2Yz03WeEkv4bC1n6wtnVVn5JBu1XX7z1h4X2/PFdLVadK2klFqYWUwN5OBRGaOcocip4M26Iox6cFHE93f3Tk7Ophez0Wik2q5put3d3Z2tHQB67+5Dj+TsYvbr3/yubSWltO2U936YZePJdtu26DEax3GWauu79dooxSOBiGVZCSFaqY1xJydH55cXeZ7HcXz//v1WdjwSq3L9V3/1V0+ePLm4uJjP55PJ5OL0rCiKO7duc87X63XExa3d/STB5Xw2nU4fPnh078HD5y9eNdJ6333z/LfK2OFg3HWqVTKKIhs7rbUGrNtuPOipdmVk+9UXn/70h9/7+c9+nCb83t37QPhsOV/Xqq7rddPOpguPHWMsyrLReDAc9hFxVa5U11mp2nKN3r589tQax0QE6IQQSEFr7bwLekrO2SuqTShsNGUeiWAUnXPeWw2mNy52tveklHXdtp0ybSNolCRR16mqbYx34/GSEk6RRDwyHhizSmkjldbW+oAQE8owioRzJo6F6WpnLBIf6PNtK2ezGSAHZFGciijiLCrrinPaNpJzkmXJ1vaIUtCm1eUqjuPxaPDO2w8fPHiwXiysUkYqdnp66r1HRpu2Nei1d+uuqZoaCFHOamdRK2V04HAKIeI4bTsVwt5sufziqy+jJP7h93/w7Mnzw4Pjum7TONPKLKqOJQWlvLOG8JhznkYpRWa1o4SF/gIiFr18uVxShlXbeOLjNKnqstfrEYpSylhE/X7fOTedThljxvmIMmWs1MYY00nL4my1WqVFbq09OzvzYOI009Z89fW3dV1W9TpJU8IEpVFdlqVoA01GSimlJoQkSeI7r7V23hAKSLzfhA0LKIxRSvkootZopZRHQq8Oa51WSnmvtA10QgAQSRxF0drYwEptmq5tW9XpJEkYYzFHwhhBorTS2hpjnQPnALylBDjjlFLG+aDfo2EmmkCWxh5j55xgeZZEbDKKIs4isapKdD7P8zTLnHPeOaREG8OBEcYIMuY2wSbkmMEk2jmXpqm1NmgYBEbC9ZBkYBpnWcYprZfLYKMcbAy7rrEuWCFQxsloMNzd3c6ybDa/PD4+RtdRwrgQjAkE6gC9xyhK2i4O+V+rZAD/AcBardSmilLWOOe88kor4yyllHJOtA6te0AAgtqapmnW6/Xt27fn8/m6rsiVW2PoHYQKOERNxhgQhM5FjAsevKOAIgHiHTJGkAvmnLNKgjWMCB4JEVEtVVXVHmySRr1eL47j0Xhrd3f38ePHVPBIJEFsW2vNBHeErteVtb4oUkKI1qYs6yAcqbW+rsUDtBOQD3VV/wcAyW+GHy1jAikjxAeqpt8MDVCDgcXiN65Ob4wzAICH6+FJ8AQQwbtNiHVAHHUbkQNC7KZq98ya62iEiP5q0a5/+nCwK6rBm90HAFCbd7kAO2lP0DjrTUQ4Ae/B+SufUkRABG/NplymngIlAS25co4IHQdEDJQFfIOgcP2feCXr9HeQhoCQMcuQIBIABEKDhBmlQC2AJQCEIUUw1mjbNZUxhnq3qlZ1Xdd16b3nglGKzrmst8WTYrRFst7We10DAGdnZ21X18upEIIQQIadWrFolPf80en67n2S9/bPz8+//Ob16emptX68vbU12blcLaYXx/u7ZHfnzsVueXG2ns8XL18cjgYTRJqlseBcNVKpxjkHQEZ5L6zCdesBKSGE1HVJCAVnkVAkYJz11nnrnr98ZR05PjnR2s3m86opl+XSORAiIoxFJPLe85Tt7O6KiF1eXholOGcAsF4tVqsmSSJOo1bJVjmP8c7OHe+5EIOtLa1UV9d11LuhtbZaW2ujzPPIW6WNUtrISCT9frE13knjuCkrVcsKK6UMY4xjfHxwqq2/d//2weHhv/7X/3o+n/cGIyD06OiAiWi8uz0a9s5OVUTTPM+jKFJStq201jIRgzNam7Kqy7LMiv5k2wRqeWg3RGmSFjnxsFwuF4vFx598UpVlIiJKKadstVpRQESMGPfOyVaPtyaL1frbZ0///B//j09fHNSNnGzv1K+Pu04x0QauQ5Ik6HwHXoLvtKac6dJQCr/77a8/fHz/g/cfF0nUSv31N8+VI4PB9qpWlHMUzFviiY+iaDzo94pe3VReG+K807qrag7keHoRZ3kUJ73+kEfMOh38xI1VVbW21s+ns8ViEUURAUcIMNwI0RqjlFLIDRE94F51urOyka00qhcxSiJpLKJvmu7k5CSO0lBaK6mzNNdGWbDWWqTIGNvb22McsjjO85wS6KqSMFoUOaU0SNFHUURZ7DyhEdNaG+2UUpSiMTpJk+Gg6PXyy+lp01QFY0Wvd+vWrVu3b3POGymrtp3N5sxoRwORJracEksoVCVy0SnlKSNIDKA3ziMNoofGOWWcdVpQVjer1WoFlABA16nj8zNKI6SiLFsaZeNiUte1giZN0pjHBJEhSyLqje86JaWOIs4YW65WIhHGGGW0cFEsoiSKu7Yry7I36FPO1ut1WdWBxUYZL8vSGJNlmYhixtjx4cmwP1isVZbFW5NBW6+MtW3bWuuNRUKEEDFlsfG17BygL8tyOp02TVMUWZZlCSYebChbEb0xSlmDCIxRD8Z5XMxn1xuWAaAsOEgxY7T33hvvrHZhzzWWCgiNhqZpwubrrOu6jnOexUkoW4OQiL+KGKGSE0IE1t5oNGKcM8Y4oUCJ9361WsVpYowJikAszwMBfjAY9LLcGFOWZaDaWWtBSRIqTkYJIUgI2o2aYRRFg8FIqY3+SYhkXacQMfDey7JerUpv1Wq1Mkr3+/3+oNiQ7SlPej0tZdNWi9UyjjeGK8aYoHVtvCNaGQ2EIiBBCmkaiyT23kMFWmvjNDqwznpjlA4WoEgpVeAseM55p2QgH8krtxVEVEotl8uDg4OHDx8Gc9HwWwQ6BVzZ0cLVUIBHIJQiUucceghe1c5bLbs0i/M8F5QoLQEgT5OQNVariiFJ8uztt9++det2kqZFUUwm24Qza4IeEsZpxr0L4a3tpLHOAxrrmrZrOxmU+JqmuQbJ7VU97r03V72D0HG4+t1pSM5ClEBEAEIpIYQpv+EibEpL2MT4cL3XnQhCCG7mORkCIIJH8J5AEHAiaB14sM57g+i9vb7fGDLvvHP2KrpvDuO+E7nCN2SanNsQ8QJXE5xX2hDrDGzy5rAtfndWxIdTRgs+CGiHqw9tCAdAEAEDjw8R3R/CCde5Al5JP20ygStcAQkCAfBglVLOWu+qrq3reraYSyllp5WUupPVulwul1VZrtbrkKM4b5qmWS7nTdNYq7Msa7s6z7MkSXZ2dkajwWKxkFIy2w4GA0R/Y7i3uxsRAs4b7613vXt3P2zqL9vGGp30eoNecWMw2Hl4749UM0DbX814Ed9+dD+1d+2je+u6rnWnl8vl5eVloxR6NugVRVEszi+924yweo9ANsiQiBg6zwAJ44QRKZ1XxnTy+Oh0uVhHSToa50cnx89fv6q7mjGRJpmUktGNjmExjotezlK4vJgLQZ1zVMnYw2CUpFEsEjPoF2mPZ4OYL0lKRRQV4HxZliZqm6ZpqrU1HXjrwTl0SKE/6nkD+3s7P/reT7755unscr63vd+1Kk57SZ5p6V6+ep2maduqJ0+ft418660H2tqqqXnM+8O+c7rpKsI9p3Ecp4geCYniBMFrLefzOUVs23Y6m4+GA6VM0zQ2iogybddFcZylaZIk4/HYex/md4qiuHv3rmD8+OCw67rdnR3O+Xw+j2N29/YdcnT8m48/PTo92d7d+/3nX3eWxEmufe0I0Z3UUhFCuqbpug6LAacotQL0jJJXr16cHB9++N671Xh4dHx6ePjaEbFD49CbZlQ40gFspJOcNeVq3TW1YJRS5hEEp3HEdddyIZq2ktqi37j5EEK01nVdr8tl3ZSAjiFwQb0n1moHzhjlnEFBLOhluZzPFlpbo21oITlnAlFMSr1crNN0g3rWdRvHsZI6yVMAkqZp05RJksQJy+J4UCRdkzTrhXc2iiJjFAI9Pz/nnNtQqBjTtEpKyTgH9IwRxkiep1HMj47Popilca8YDJO8uJwvnj5/3VRV3ajz2ZKlaZrnOXDaGeU4Fd7GaeIpsXXFYhF2LGMMeiiyLM/zsm57vR4AKN2ptvHeN237xddfMSrKqtzfG0ZxenGxYixKuGi6Fc8IExFSqjrtAeI0AgTVSQooGItEbO3cObchRRPs9XqMsbIsV6tVb9AXQsRRsrW1tVgshBDIaN21AGQQJ3ZdrlfrOBatbHxr80f3d3Z2Dl+/rKoqTdPt7e2Do0OjndYWPCIwB6iUWS6X1tpgWdY0TdM1ImKTych6xxgRQhgZKloXsOhqtQoWZ4hoPDhrQi3krQMA9MAJtZQEo0WGhLEIoaWE93sppdQaE1Jaa2yoqbS2WllEZIwiAKfgCcaCR0kUx1GSRExwqSJWEuNcmiZay+Fw0HSttbqq1uQKIddaN00jKJNS1nUNV+REAhjEGDZte8dCV3Y8HjPGFotFwPHyPA/pRdiC27ZdLpfee8EwKH1KKcsSKKVxLHp5KqXknKWYKqXmy0XV1Kvl/Pj4OBvmPIqCnA6jiEQwxglhZd1GURSYmEgJ55t2gLPQdV2QJRCcb8IVJWHIE8h3CIHzvlPKqkZK+d57713RMNE513VdHKchflzT/bz31jmK6K3TxjpKOaeEEKeNUmp37+b2eNQf9Jxz4Gwcx4wTa+3sYtbr55Px9g9/+MOHDx86D1prKiJEbDYFUBT0GZ31Fnwep13XBdZSkOIInqXBCf6qxbChiQCAxiAT+Z15Y1BGc84RvB5T3NBREfGaanqFTm+Oaz5UONy1CgIgbuRFbZDHIICEghCCWvR+gyeA94R8h8RcTx6GyYXrpph/wzpyk5RcS0EjAdxMVGrnVdtSSikTmzZQuBbvOYGra/fWOfQeER1uhBwAA9Hq6tz/cAT0v5grXCcKm7VSDozr6vpienmxmJ3PpqdnFxezaafkfD6/ODsvlytrPYYUy9jKWKUUgAvyGMbq4Oi9vpwzRkRCytn6+PyyKIosy27cuHFn514cx0p37334Q2uN9zZNU6lazvl7779//9FHiDibza5/sv2t7z9662eImGWZNaYsV9baiAtrLTjbNM304vLk5GQxmwUmf71/rpQONKmqbruuC9Ca1YY6gsQLwThjVivw3moz3rqxtbV1595bs+n86YuXjJP9mzcODw/TIj6fnnY26o/uaOgOjl8U60wIkfVBqYpysn0zp6Q3GAwGvb4xe2TDIW2kXXdts1wpCEKfyIEgi0TXNXXTOKNjEeV52sv784vlaDR48ODBf/zL/1StyvtvvX1xMRU8i6LIaN81kvPo88++PL+c/umf/tdIyZdff93K7tGjB3s3b5yenc1ml71ez2rnEbyDIB5MKNZlJeVpFPMoGC1C6Lxke3t7eZ6LmI9GoyzLnLWr1QqdL7J8PBo5bWIRWWujKKrK8sWLFxgyUmw4i14fHp2fn/+//9W//h/+yT/9m19/3MhOO+vsdX8KGGNZliVJtECW8FgpRQhhhNZtfXl5TvDxaDTwAP1BcXK+nM1mZVUhZSKO2u46Z3dt21brpVGq3+93SiFl2tuYi6ZpeJKuyrJTajwchDpHCEHo5vbePCPeWWuVUtYGdlnQTvaUUsZIlqeM8rbRddO1XWe1a5qOUso5VGVHKY2iGACiKKKUt22b94tgvDefXy6Xy514nOf5YFB0gsdxLLu265qyLLkTR8dHsjPKWECWRDHnjBAioohQNLoNtVagqw9HQ1q1SNi6rD/59PPXrw/7Ra+s28VKs+H+jksi45wixDrsbe3w/vDk4lIMdH8wyos+Ilq70aJBpGlUVOtytV60bc0ICMEFpxT8erWK+tHlurxclIQTR9xartJhbJSs6pYQQpF0XperllIaJyLvj05PT+9sPbzbT58/fSZ4upytu9r2R8np2XHTNuNJH0FdXhzFcXzjxhaAGvRHVVU51RljZucujaJ+NqlXUwBw1taruVPbH77/wenJiVRmdrmIaCyb0nZqAVNEKOc157xc1977fr8vBF8u510nGWNa25u3bxRFgoiz5bysVlW1NsY0TYNRosFZ1Vmrw5oqA0opQhgi9Q6sQXBIkXqDqnVNNxcR8xBlWUYIaZomjtJQ9wPjhBDfSUupEBETwnsPXUcIWoNaeYJusVgxzillk8nk9eHh0dFRFAtATyiV0gU/4pAIME6c001VSimtMV3XWeuMdgDE2jBOH2qyBhHjWCjVffPNV2HYRkqpte33+4i4XKy7tiUoGPVlWfKcp2lGKdXWQqd7vZjxRBqiHdHSeU+BJLUyy7qWEqJiCxmTBqI0I4QopUbDYbBy4Jwq1QVmH0VCgFrttDYeSCRE27aL+TwUChHjoaWPHvxmVIEwQqy1zhjOMkr4bFoaxybj/ePj47ruhv0JZxwRGUHgG3XCjVWaaReLRZIknFAPzjoTx+LBg+8/eOtuLKK8SNM0TYS4RtqPzxZKqaIobtx+K85GWmsgmjIRx3EcG22dtdYap6ztlNFar3zpva/b9abub9V10L0mnWxAAgTvvduIQLjAiBRCAIIxOooij2jRG2/CbkIJJYSAsYhIEGnovnvvgrebdZRS4sFpo50LgZxSquoO33B/8N6HzMB01yN5eP0GAGciuYnHjAKiJywodXPKCCUE0TsIYIjzSJBooJRQxhhwDpTaQDB0PoAQqFXYBCmlxBNCiHbhTIAQTwgC+EBHUd4E4diQ8QTESGsdx2k4PRZMb4kDD+iBMYLgvTPOW+8U8RAyxVXdLJfLw8PDV69evXr16vj4eDabNU1znahdZxvhiKO+tkYp5RlljHEgXpl6tSaECJIsLqeBAXPjxo2trfF4PL65sxWEaARN4iwOZPuQecsKB/lNABjkN8OHAwDwZB/+y0fAlgJ0FzAw5xzTa6VUuV6dn58fvHrx/PnTg1evF7PLSHBntJatlK3sNHWGAq6PTyff7//k/cdtZ/+nv/23Q9Hfu33rP/7yV6PB5PJ4NSx2mRCyoXk/VdDVnY+yFOoujwopZZYlnFBdKyM8Qe69d94eH5wWaTEoBk1THR8fR0JkHW0aaaUpXMoJaW0rIBY0M4qOtvcdT7589fzOe28nW+NnL15+/09+VPDUAVmslmSYHi5nOCzu7O/Oja7WbUPo/oNHP/zh99M46YxtpEKkVX2xt9efz+fgvDF8sVgQQkREAiophHjx/GWWZXVdd9Lcvn3blcAY+2j3tjXaKSjyHD30+/35fP705av5fM4EN84uq7VHHAwGt/Yf8H5/+uUXHlS5eF1fPP0//qOf/y//r//5bDF9fPfBi9eHjXLD8T4habEzLtd16uXJwev7d+7wuHd5fPj2w5+B2/r1b14y8Ij4T/7h/6FqGiqi/8f/83+iWn/54kQCFAWMB0NKmKPQ39o7Pj2Z1iqKok4aqZVzhHLeVA2lPBWJ7NxgMOi6rqy68XjsfV3VbRSnACCSGNFTBEJd29aE4Gg02ikSzvnl+bTtZFr0VrOF1S6KIgm2rKaUMsESKSUBiHkUM76GtQE53hkBmqZZOy/bcu1NR9GeHBz8/b//pxrcwdmZ93bZ1dbaVZcpl0pqgQKhtPEMGAPmOmttK7M0H/d7vXxwdnzBPAeJHRSvzxullmFyct5VSrN8d4858MoY42xrlAGkJgZGkzyLCaZ5EaepA4/abvYCwqxHlsU9MSpsAeC8s1p2Sssojp21RmmnnTFGGeW9Jx6TJA4bAVx5WYbtrKqqXq83mUzm83koIAKHMYD24eE0oY2jFAAZDAaCi+9ard4HYnxvOPLGaq1FnBLGiQNA6p1bLUsmOCJFisaBtsYYhwziOFWqQ0SkxCMJTy9ljFKa5704iwmnxqr1et0pqa1RVcU5D7JanNNQgcVxbK0nhCEQR4lSRimjpPa+jRkNNIhQDzVNYxLnnAv7YxzHV5Uc2xTcBK8KTcquDkrpYNir23YTeK6skpxzHlmISai8tSbw5gJ9xBjrrA6zltc1WdiRN0EUwNpNHx2Rhg5IEKn03lNKe70eOOUsBKshRHRu0wUmJLF2s9khUMZ8yIi1UwHeAACltFIqjuMoiqbreShStbbXwLIxhvEIrvgT10egvFyl21bEcVDnNMYY16VpmuTZeDyuqiqkX/5KalArHfCP4AQNAA50EG4yxoD0WZLu7Ow8fvvtR48eUYoRF1xQQdmGzYcQZyOlFBUidFIZY4xHiKiUCtHdWmscbCQQtKa44aJex6Sw2m+++GbY1lcFepA+vG69B5mm6zo+1NaEkFDBB8tKuNJEgvA6IQ7AAVjvXfhG7wEoQeIBCZLNXwQPCMYHxxHY/OOvBDzshk0J4BGReEOQIQLl4D0QRCAASIJaMwbVpD/kFV4/gP7Khioc12/DNzoXf/DTMxYgk2tcxHtf13W4+UPjmVDgnHPKpNTgfdgB6rpsyqqqKinl6eX85OTkyZMnr1+/Xi6X5sq6wnsMxdvVYm4u/A2i64ZHTAhhjAb9mDSNe71ecPPKsiTP893xMIzYhOQgMGrpldXnd1cUPh3A/SEH8/q4fqL5FWwWjkgMARC8f6y6uvzparlYrVZdU33+6SeMQNe1Z6enr1++mM/nSHwaxUcHC0G/FSKejPff/+B7RX/4+vXrF69e94ajQb/HI4EM4ogWfNDKZj1bjnqDoihsZhIReW+15pwKazUh2JQN9PpRlGitY5Fsjbe99+v57Hx2FgjRDj2LuFISwK9W68l491KcPX/6fDZd5PmgiFMnpRfF55999uzFS8rFcLLF4yTI1e/v7ydJ0uvl/X6fUtLr9Zqm4pwX8Y26bq31aZpqrcu6ccamado0Hed8axT/8R//6RdffBG8X16+fM1i+t47j43Vy8WiqSolZVPVWusgdB32bWONcQ4RldHT2azX6+3s7R8fH86mi6+++eYH3/v+T37287/5678lSG/evHl0Nq3rCll8eX7mkbS63t/b1qo5Oz3d2x4/enBfqe7ls9P57Byce/TOO3/v5z+jgjvTnRyfbI3gooQsjZM0JoRYZ8Pmj0AdeEppROLweFLKQ36fpGm4aa2VwajMOeeM5XHCOafoATwSG0URYzTPsv2bQyV13TGkbjjsZUV6eHx+Ob0AT5033oBRjbXWO9Daeodhpsp7T+mmeZckSZrFq9Wqa5um6VbLcr1eh059mqbEB90UTQjzznW6CSR35wx6pzowmdnb2/3qs0/rqjJa5/lIytYYE0D0qqmllJQSpsChlo2SZdt4QrlJaRzRJCKUkohbitY6SwAoEkYcoEX0VPCYonfeGS07b6SSlhAAC0gJGk8AnXXg/TXN21obprcgiPBrU63Lvb29OI5DEL2GFh1BEUfee4/Qyi4Mw8RaewClbZhuHxVFrzdIkiRJkuXiUrada0FbM18utZTB/Ons7KwoCqTEOIeUSKONMZGKjbNSG1+VVLJ1WWqjEmel0UcnJ1VbpXmitVLaAiIQ5tEIce07YIxBrW1QlJNSc4ach1lKag1YMNYai3Ad7I0xQRM6/LTBqyKKImstIgnbkDbXBj9ovdPGIfGeOCBMiFjEkXOOEBpQZQs+Diz0jeSOeTNchcMYi0ghum4bY5j2DPjtdaLgnLqug8OnhbcZpZxz3nrnHCWBfweEUO+dtcQ5e5WFUM4oo95IjYhB/scYI6W0xidx1nUniDQUeUGlOOQTCWF4ZW60+V7YAN1aKiklXOkoBwJm01aFK5wzRZHVdUkppmlstaYUtTbOKG8tYYQRYAH0pizP8zzPvbOEkMlkcu/e/ffff//27dtwZRuFG+IgRcS4h6HmQ0RtHCGUEDDGdEqHTCUIcF0XhQY2SYO7YoyG9W/b7rrpcNVQAACw1Ib7P1AZKGU0qCU6fy1ecN1qcM5v4j0AbF4NYgRASLBX8AAY3gkAzllKSVi96yz8Onhffwi+YRepdXjdIgTLSh/o2cZYQth3mgpAwxKBCP7dHsBdySn9wecjIqK7zgz+gEXxRqJwtTbBvtI5B+GcvUdKwTlwgBvKpCfAfF3X3rq2qxeLxenp6fnJ6XR60TTN6eV8Npudn59XVRXyxbC8Qojr1skbJ4anp6dhc48iEa4oiqI4EaGfyK+OQMDK8zwvetf5+iZFDg1nulHCejNLANiIR/3nx3VJc02w2NwPpqOUAgGMeR4X+WTnhvdg1A9+8ScAYKry9PT44NWrb7/99vnzp5fnF3lMTo9aQqTgxe7u/s7O1qOHtxfLs6LPbu4XSOl0vjQt5PE4SvO2bXe2tra2tkIWqJQyWuZ52nWdM8pIzXkUiySJ0jiOt7d3Oecff/Kr9etVTnPrjNSdEEK2jTGKc7aYnXtjZ5fL9aqckcvvfe8HH77z7l/86788ODpeVWWSZnRdUWniNOsXRVlVysimo2cX54IxIH40GsWx6Kq2Kavtnb2u6w4Ojy/Op977nR2OHrS3Dsjf+3s/Pzw8DrNLFxeXd+7u/+xnP1vOF1+8/jRL07qqTo9PghQNISRKYguecJYkmfVOSt1y+vU3T7q2ZiLZ29pal6028OjhO59/8c1iue4Pt6IoklXnQS9XFRcxowa0BQLvv/fwT372M7T697/5dcJJEomDg1fL5ez+vds379zeHfc//T30h0ApRFFEkXSy1cp4ghSJdd46S5ESQj2EfQeABPsRRA9b4wnn0Xq9bts2ieKu68xKWRUj8QBecET0PI44500711ozbjMm8h6Pk6EF9+zZQVlVUSScJW0tQ1VjjPEehdjww0IrBxHTNE/iqK5r7yBJsuAMjEjrus3zXrlYVU3trM96BWPCe88ojaKoKdfeg1JKcDooeovFwlprZBeNaA2WEp/E3IG3a+msipOMOYqNklXbSKNZzCwB5511ztJgIm+cd0HSxTkL4B0l1llntbfaGe2UMtY48FVdMY/EeeIQArkMMES4TaA11ntPCXHOuYDoWrtcLsMdcB0eaEwCiA2A0dU4+3i01TSNUiboG3rv1+v15eUlIgI4pRQ4D55Y652x1tqIccYjnqSEEOIsUkqcNc4KIQiJ4zRRxkgpRZLuT26OJkPn7GI5Ozo7t1bHsegNe/3JJNWyruuu1QDgvHWOAGyG+ANdTmvtHUUM+VDYHNnl5UWv12NMZFkW9qzQwI6iSEoZ8BJ4AxQx1nm48vUx2CkjjGaMVXW7XC2k1EAIMg+UEODsyvrIe+/BXocG51zbtgCotTXGUcrfzB7CzxGqnNCp9d4rJUMVSAkPEngh+FEk3iNAGM9Do52ShhAVcNSry0fETaQPooAbBp+FtpFN1MRx6hw4p4MpYhjxt9YabQmVCBCq83CShjLn3PWJXUfZq2Djuq5br9dbW1tSSqt1mqZJnhtjtFRJFGdZFgYTwPk0TTmLcdDf3t4Oe/3u1va9e/du7N/qFYNwDt57wO/0MTlljEdd1zVNo00jhDDOBw62cZtRBW2sMdZY55x31lwx0a4GF4MIhPrOc+E6anrvLdlMlxhjnAXBneOAgBgUbpCFn8/5TSNUvyGDcX1savcrKygXxBHCPeMDXgDfgQcb1eTN9oVXrIAQ2aUyV0mDu8IMQqEvN2KXGza+o5RS5xEZIUAskCu3qrBu5ArtuM5CyJX99JuJwh9GT+u9f3PpvPcRF4CeEMLJhtfZNA14L6UsV8uzs7PDw8Oj44Pzk9OgvSZtoLK6JMnC0oU+GmNBnWJTnIT0CxGKogjncy2/oZRqO/Luu++Ox+M0jZMk2dra6vV6WZZkWWYBEZAgsYCUUIeEEOoJsVcLiojgN9nBmwvy/+24zqg2jySyDdCDHpx3Dq0z4IjrDDjHo/zWo/dvPXr/j/7bf7i4vLycns9eHJ6eHlfNupMleD5fruNEDEcZISaOPee0qYl3GowWIo6yQimptXJWa62D2X3MmTc2uJxcnJ3Pp2x7a6tr2qqqbt682Z/0oiwWaWSUamXjnFmWS+KJt+TW/s00Tr4++3Z3a+/nP/vFO48eH7x4+ennX/R7g5s3bjWdXJZr1kmkrG1bJjghZL1er1ZLY5RWHSEkjkUm8jjPHrz99ovnzxfrlQYHztV1nSSJYIJSevPmze9///uffPLJarHsmna1mL98/iyJIsHpr3/9q6aqb968uV5XwfohENuzXpHluTa6LEtkqDtZl5U2wEXSG4wZjydb25PxzuHhedUcExEXvYxSEidMm65drxDcjd29B/fu5Fn86e++ePLNV28/fHDv7UeC02fPnrx4/m2vn/70hx89f/Z1Vakig1gwrQPsinGSAoDqpAMkFAkBj+AdIiUcGWc8BLL9/f0kSp88eQLOCyFU16HzAEAACSFJEqVpPOgVO9s7/eHSGDOaDKzDutWLxbQsV027thaKfGA0qM5wJiKRWOsBICj6WKuTJCmKYrFYoPdt2/b7/VhEo+G4bdt+b+y9ndeds0TKRrYdIYQCRoyGpz6LI3CJahoCbn9/fzGfluvl9njEOe/lsbGpUooy743hDAAJZ8CiKGo65cCLJE57vThNtHXGO0aYQ6CIlDEM7UMPxmysjJzVzqiQKPiNw5DdzHRb8NZ575FQRCRIAkrsrSOEiGBdqHRRFMaYo6MjrXUwsCGAURRJbDxBZJRR3u/3J5PJZDLp9QbHx8fWeu2sQ9Bal2V9cXHRNI2xKo7j3a1tFgtpjbM2jeMkTXvO5HlunPNaMcEjROMdY4wIK1xSluW6KrMsufvg4Xg8PDs/Wbe1rVTbKYueNq3SOtTHTdWFxaWUIgFrN/tsJGLnoNOdc8Q7ACAABIGEXolzEIpUzjlBBgAh+wskGkppKCuvKjP0iNZZZy1a68Az69frZaeVdSAYoYR7BOcRvA0ORgBwrf0XfLS994xxSqm7mpcLeEYo//CNMUK48g0KCoyCxwHbCH+L4HfThuHTwtsAwEMYNCCE4BUs4az1AZYwxgJAXbfOQa9nnQOtrXOOEkY4RSQEgVLQWuPV2EKIghpJeADA+2saZui5xHHs0UjVltXq7r3bRS87OTwCcINenxEk4HtFcffuXYp4enqKiPv7e4NBgYg7OztxHCdJEnQ4er2+EFEIUYF+769VkI0N8ck4b62xHrTWq7ION63zsMEVXLipwTsPSBin17V1+BwP6Dw4D957513YF7z3joRxancFifu/A0XgFb0/vCGga2+mCP6KD/Vm1Hmzsr8uXt88/k64eqOy36QNiOgQCEGHDpEickSKwAluHluClCBV1qMLQ+F/oD7+5vm8+aVCwH/xNK6zK7jCT8IbZNuFP0ecc86tNU3TdE1rrDo5On7y5MmrVy9ms5lsWymlMYZG8XXOaq9sQoOsyHV29eYSRYKFV4QQeZ73+/00Tbmg+/v79+7d29vbyfM8SZIAz163G8Jx3T4gf+ihhW/Yc5M/BAz+8+Pv/BYbZCIwOQlQAgQ2aT1eOW6FpyMfbg229h49/KFZLztZr8vLsp6enL4qBlvjrb2ua7pOtY3mlCV5xghaJTmLnG3bZtk0jZTSKMU57xcxo6Quy6IoppfnUsrtrfHl5fzLzz5vq3p4Mx2OBm3brtcrKWWR5fv7NxORgEPdmuVyvbe3/4u/98cfffQDo+zvfvspJUwaazpprKeEWw+L1XJVl4PRyDmntGzbWhuJzjLGtOl0pAtSiJTt39l7PH80m81ml1MEd3p2OB6P54vk668/392daNWcnR8dn8ycXf3f/2//1//dP/4nv/jFzz//7JOTk9kH770XDOIpZ0qbVlW1VLnSQfnNOHv37l3GxHy+/OyrbweDybpS9+72f/LTP2pa/cnnX0z6Ax7HVdONxsV8PqeC3bx589HD+6vV4i/+4i9U24x3tkUcXc5nu3t7PGKjyXgw6P/RL3729NnXT58+xRYZY0Z1WioeRZHgDEFrzZjw1jkg3nuPhCGLeCSiiCeMEJImibN+NpvNp9NeryeE8NZQQgAcRYwYz5IkEOrjOG6ahjLBeKxtNV+UWussy5p6Za11btOYZowheuM8ASAEvCdCiDRNT05OKIJSant7oolZLtdV2QJg4Hoh0iyJvTUOPCVonbFKG+9r7ygSRMzS5P7du7//3d8ao4peJhhP0miEvTBJp5TinFKKzmgmhLDGuzhhkcj6A5ZEVddxpQmSMOhEEBmhlNBNKaAdA6CEAUPjQROrnTfWpVFMrA80BSUlWCCEcMrjNL7eH9/YrVyQLDw9PaWUCsYDAgEA2hhApIyJKIqSmAnedG3VtCdnp1laOO+tcx6ARyLJUuNsuWzihPbHk62dva5p6rIyDppORUkWJRkaLa11QEiYnibUegdIjXPK2JSyKIkpZ51WUinKWZEMKMW6ldX00ljLBUMNbuN9bK/3O0IIKbizYK1HpIxGnEeUcELIzuQDQkhVNaHFkKap4HFwVb5CHULTgW82HcYJIQzRWq2DtIAHC55wkTDuMRgB4PU+GNCH6yTjGlFI05RzYY1vWxn2NWtt27ZCbPrxsKl0WYh8YaPvuq5tZFA6y7IMEVXXhfyGcx4iUVCepnRz8pSRq8931rqgoCdlaJtRKeum6bxHY4ySwTYz4BkhPeKtrOHqZgjNCI+EEKK15pQF8QbOOVyp/WuHdV0H97nt7e2j1wdaKqVUlqRCiF6e74wnjDFvXczF/fv3b927KaUMYo5pmvYHAyGiILHskbqQJwBa77UxStm6bcK3hzjUdEopVdc142JTifqglLLpECFleNW5COvgUDk0hAtPrDNmMyvrr4SWbSiyN5W692iMA3Ba22vs5M3wZtx3Zff1iwDAGF5H5esGP3jvLFwFbA/fqSzgm+nIH/z7OwEDgoDgA7mBIBJAGnADDwCeoCfoyVXvP3z+d5EvjFy+GZKvMgPyd1KH69MOrS7GGHmDl+O1Chcb2DZN0ywWi3K1Oj8/Pzk+fvbsyfn5uTFGUEYZUkq7VhFCguCSVjZgUQj0Oqm6tpAI6EpZlmE7zvP83r17Dx482N/fT7N4sVj0er00Ta/ng8J2zEV8nRwgogd0HsEjEvb/OwP4//O4RnfCiV5pWThrLV490YyxiEeb/0OBDQc5ZPnOCOzdrf2baX/yzrs/PD56dX5+cnBwoHQnIiToCCFpJvJhxDnKzkQCKCEUfRzRNE1fvax9zj3oLOHbk4Fsy7pZLZaXu3fu74y2Pv7447Ozxf7u5PHj937yw5/c3L89ny1/+Zd/dXhw9uCtm8iTv/pPv+U8ivNB1msup3NjTNYfWO9nsxkRbLK9e3p6ygQXEWeCi4hs5mTBtratL8unL588evDwRz/70bdff2Os1FLd7d/uFUUc8d/89lfvvfee96Yo0kcPtupqfnHufvubv/3Jj3/4f/k//Z//+T//54eHh2maXl5eDkdjEUedsWVTd8aKOHJItIf5YtU2XX8wXk4vv3ny/PzkkgL98MMPPaEGUDvbyM5Y2YvzNhWDcf/Gzb2bN29+/fXXLw5ejwaDm/s3SBQt65ZGJWGciTgt8mG/2N7ePjx8nXjsOtXUpTYuqMhbY7zVNEoA0DkPiAwJ54KziFMhBEtEVKSZMS7inBACzjNCHXgKaIw13nnnvHVd0y783NhqtVopbYveiEWx9wSApElPCFnXtTVojPVO+8iGDoiHhDPur8QhjDEijr2Xy+W6LqtPPvmsbduq7ABcJBIE5qFjG4N7CQAEwQMYpT0Cp5hnGWfk8uIi5gKcp5QIFmlivIWuVaEfDR46rRgaRwnJkzTKU5EkjqCgrEhSAx4JBeu9s94TRILOg3UJMIII4AC8dOCsN9YT5wkQIN5pY62VWjnjGWMAGF89UaEHEfZE9f/h7c9ibUmz80BsrX+KcU9nn/lOeW/eHCqzKiszq7JYVSJZLJZEtSg13ZIts2XIhoFuw4Zh2E+2Xwy/+s2wAaNbBNr90jAMobspthqSSImSyOJUxRqycs6883jms8cY/2n54d97n31vZrFlQGQgcfOcfWJH/PFHxL++tda3vqW1ty7Pc900VVV1slwpxZG1bdvaRUomhHPn87kxpizrsiwFV1rrUO7MuQzh682t7SSKkyxXcVwUpTbWkHWu2t/f7/UHjjwIYb3zAAxAKEnAjTFRkvY3BmmeNa2BWVG1WkQRY3GcRioSRTEzzjJvsiyj0lmnYRG9X3TTCWKL5BGAcaakjBgTQMx7unRpM8RCw0IZEv/r6+nKp185hcu4rURHAN56zy1GUQSLkj+zDHajJ4ykWD9gmKjAPRFCarBEzdLX98aYNI1DtGAJcSBwBoVQgSAyn5VVVQUVB8aY4IvoWTiLMWZZxraQ0iOPdOHKEgDzfkHeFEJY60P/J84EUWutZUyEpgfhKrXWq5z8wiKyC3MSUsiRUgHocM6jGIwVrWmm0/H29ubGRr+T5Vmabm5utlXdyfJOlqRp2s+zwWBw5cqVvUs7ZVkHH1HGUZ51rHeBvKmtsdaHph5Gu7quG902bUVEga4YHk7rPCAzxqCQIXZCRAQMEBAXdU3r8YAwvYE0ujLwfqmmQMCCBVpZ9+AvrtIT68kFRITlGZ/zjFcztmI/wAWJ4WJbWejPhxnCVxjwYK+W+sEs/Oc9IYbWDOG8mnPJmHdKLk/0DFB4bnirB9uDWZ1uHShIKW1oTsCBLS4HOFvUXlpr5/Pi/Pz8+OTw7OysnBcPHz6Yz2aj0aiuy0B19B6JyFgf1gchJACGuJoxoaTiIuISCBIA2Ol0AgUhyGaE/Z1zW1tbcRyHiuLQf0SpOCiSrXD5aibX3+LnDf/nyju/8PPV/PMFy2FBO13uhlKqQEWWMnBywRPMZjOkNk1T3bac8yzNN3ZvvrP1wlu6evT4wcHTR+9/8JMH924V5bhpyzSN0zwGbOqmLKuxEtI7W7dmPFHW5M43T548tFoPBoN5MSFvsjQq5pNyUu1vXfqEf7rTp3fe/MY3v/atX/zFX0o6Gx/85P1f+uW//rOffXj71r1//Qc/7PeG16+/eHQ+M9YHH9o5VzTNvCxS6AghmEgw5OeBjLOmapu2MsYkmSCijz57j3Hb6XQm89PWltZpcsy5quDi9mcf3L/36cOHDyMpo5iDS9/4cjSbTX7vn/+Lv/f3/t5Xv/rV9977IE1TzrkxxiHz3iMTyJkHhoBcqLPxhANKLvcuXRufnt36+E7bGkKxv7/7ve99789/8uPRvdtckDF1r5elKj06OXOEWtvtvUsc2WhWlK0GaybTea+b5odHu08Pmmaj1m3TaPCqbWvvLWPCe+u0cc5JKTmgDa8jcM4FJ07WWbIqYYhojPEeOlneyXIpJSOQKpWSm5YjgzzP0zQl8lpr3TIlerPZ+Xx+2ukNq9qUhSYQl/avHh2dGG04l0YbIsrz3LRacSTnQ89CY0xRFEkUAeB8Pm/r5vatu3meKxVrrdM0aRrdVjUAAJLVRjCe5hnn3BnryWZxmih1+/Zt50yaRG1ddfOMM9k2pq5aJKZEZJw1xqFHYVqNyGSslJAc0BqLAImKQHAHaI233i0lxNBzikGS89bZtm1t0zit0XlBqI1evYfe+5Ct4FIGJrm11kkLixpLDFOZ53nLeSjfl1JGUoUsfuBbrufXA3M4pNLDG9vrDba2tuq6PptMnHNBv68oitaaWCryUFRlp9cFzpxzVV0Z54Bh7OK6sWVZGtMiE23bPj54yhhMpqNuv1PXVWuaNIsdEHAGHowxiYwQERklSSKl5ByVUkmSRVFEHok4EDpHbePKsmqa5smTRmt9djaK4zjkzjkLKo7EuQyUq5BkDY6LNk4QCrFozRDUuJxzMlII5L3XxlmrV3Y0WBe33FbRUVqSRo0xAMwpF7R+Qyg1BPO990QYXDdEvsju64VWYyASxjLy3gfXdGkGlskjWiygzLOV1xvg6iLKwhb5FIZLEWXCgEsWq/cSKKxbPloLrYdrDJHk8K1erxcMQ5CCuHTp0t7ObhxFe9s7ptVElCVJv9sLfRk2N4ZMoZQySTLnHHAmhDC1aVsjI+YcNbq1xltrW6PrummaxngbwN/Cv0emOMRxPC1KvrSCnpDBgq8H5Nbd/RUcZMttPQbuA7zzEFz2VUTBGBvKOmAZTqBV1QDjBOTJ08o1X0g1h2pJT4RAC5K/8wDIwv4+TOSy0oEvqycWjZpCWhyRVn4wYjgsYdiBEzJiSBeFA54ROOOeu1PrIADW4G8obbXkVh+um0xrFt3IjLbhAQ4RI9INEdV1eXxweOfOnXv37p2eHTdVXZYlkA9vDSIFr8Bam/UGQUHELRW3aEGYveBMrPv6QVUlfDYajcIz32my0GmQcwwYQghhTDufz6M4J/CAHBBZQFGMI+P+oo3VMyCAX8C2Z7Z1PAdrSIut6UgE1mjorUlAnHHOuHW2ahrnKJT+e0aCCaFU3bTaozeAJKNk4/r17s2br79485Uf/+iPf/Lunz68f6tqqkbXaeSsqZ1teCwISBdVWUyAzOUru599/AkiSsnPT0+MMd1u3jTVwcOn77zzzotXb/R6vV/91e9tDrfns/qjD384Hs3OR7OHj57O5vXJ6Zk2QDx6/Pjx5vZmkmSNbpumBYDhcAsZG03Gcay0M56s4oxxIG8AQEo+nY12d3fPzk9+9NMyS5KDJ0+9dU6bNEkET7d3drxtZ/NxnMg0ijnnsZTb29tbG5t37tz5L//L//Ltt7/+7W9/88MPPx4MBkVZzWZzQpb1unGcOqK6bXyNN6/fyNPsD//1v9kbbnXy3rw7+/CDj733/+Af/OaXv/zlDz7+oCznSTfXptkebMdR9/T09NHjJ5zzy1dfyLLs6OBAN+2HH368t7O5vf9a3eq7Dx5OpuO60UyKIH/KOZdSKSGRkRCiI6KmDZQlJE4B8WltiUzSk2VZPnr0qK312dlZEMrLk3Q0PnOO66bmgllrvXXatMYY52B7eztL/flozJjs9zKpemmWA4hi3pAvwHOjK2SQJBFngOCbqq6qyph2MpmMRqMsSdq2ZYxJqbTWSZKkcTyZTKIomU6nHDFYz9DCNFaRlLKBJlZJt5PZtv3oow8iLpjgbdvGcSyZ1LUO7YGEEGY2c46kVCEE7pEZ8JohS2IpUWrnTeCpMWJOcCkZZ0bb1jTEuCULRBhHAL5pyqKcW9O6RgdNzaqtvPVJFIcKECV5rJRhqOvKGOMlj4RkoeNA23Ipu/2+EoIQqra1RGne894TijjNZRRbD0mSDoY7SdZptO70e3uXLxVFEUXRfD7vDvpCsLIsybZHh082ehuHT5+kcbK1uR2W4KPjk6qua6urut7Y2CwaA8Tr1jaNSZJYKFnMayInROw0RDLy3lVFzRh0k46PEmOMFqSyJFZJyNlLKROVRFEEAE3ZWNsopRhD7cqiHtd17XVnNpshMiVT730xnxXzZjAYhKxqcD1hwTDwnLM0W3ii3hkuIJMqcCM4QiAycKEsLHL2jDEDTd0sWmNrbTgXWZwwQs75fDory1IiJpHk0HryGx3Ry/KyLB1RkqWMsbKoddMgw9Cku26aJEt7g34URVwKAMhFHKCeM6EE3AghODLv7SIkCzwsbhwFE9yAYUxkWWc+n5+fn0dR1O1266ba2toCJEAyxqx6J3rvPWJYlyEUCDDmgGxTMSQeRUnEs1h415ZF4YzOYiXrUpBrJ6PpU/7K1b1vff3Njz79JO/ubl/apkVuO87zfNgfdAd9kUaNtSxJG/LAF8V4TkitNbWtcbQquG3axXgMASBHREeBbBc2K0Ox5WJ9p2CsiRwAw0DOJQqtngJOKqtmVRkBIbYMjADiiHNOodWTc957i0yE6lIHIZ7EgDNA5iE0gQ4WhC359Rjcz2WMihOBc3RxFnLr7v4KwQTPmK1tYQfFVhEGBOAIHjwRYChGIUJgHlnwpL3zEPpErAOFYNlC/dUFGgjJFu9D4xC/1HRawCm+zJUAOPIBxBjv28aWZ2cPHz68d+/e2enpaHQ2Ho+ttbFUHkgbE8KhFPSmAKSURVUQkSfvlrmPcCl1W8OSRsoYYwuyDaokMeQjzgbDjc3NzThNuBRpmoanOkvSKIrAkwCM4gQAkDvOgSMwcAyCljpnwMGvbgewtQt3fjWhX4wkFpjg2R2e+dNqBkPzC8a7abb6q8EkqNHFUcqICQkAQA4456Zudwb7v/Yrf+fK7gt//Ef/9t69O8XIO4jSrO/Qn40LJXA4HD56+OTKpWvMw2b/uq6stDm2yWZ3887stuJciviTj2/93f/of9LW+vRo9Oj+4WAw7PY2To4nDx4cHB6PhcoKi23ZHtx5sLu7W1v39OhkY2MDpfBtyxhrqnaYpuiZ9GAJgDnOpYgSxoHIGWjPx1NCPqvqoqpFkoWJ0K2dI7t3ekZSjltjPZzXDUfmJzOZZ9Om5nn86OQpfERf//rXHx3fv/fw0c7uXnE0FzLiirSrpvPZK196PUW7N0xG4+nu3ob3UCOxXl/E6c/uP4B/8bt/L+a/9B/89bPy9MHDu29+9XUiP567/WuXOJOn5+fTttm7dj3pbvzkhz9UcS5U4jW887V3Dh/efXr33gubm7S396CIdwZXprOZdjZSOSAXMqoaLfPEtq0lAkk1aONqFSdZltWtSZLkzr0HVjf7+7tZdhUZEXmZ0ZOnj5BDlMQkyDA/ayohWEdEp6enHsABTqZzYIJx1Yvis9NJpzswGqqiyeLcGzY5nSZRClSDbhKOvU7n+OnTneHQau29YwyBgUqSKvQG41g509vZOj6aJFJJhoy3xnnTtsNe98b+fjGf1nXtG8N9dPXazXlVIvJJIZBZBxFjqdbgHHKeJWkqgieKXCBwB0TWeQ+GvCEgRG11nCaAC852oNFR4ziAAzBto5vKWeuM1XUDnixgeJmZYJGMEVFrfXx8nETx0u+Eum4tW6gBtrhwjmFJetemNWTSNO10Oou88sI5s0KwsmzLcrHclGVZ13Xw8uM4Dp66lDz8LJVAxLqu67p0jpbl+hhFirO4bVui0Lci8l44Z5BBFEUhtWad9gv2FhK5rNcPYZLg80kmQwKlnFdVVRljJBMAEGJBzrmslwUEF1zGwWDg16rX2LNUcFpIGuAKRoQdggMdQtahpDtEU7z3xrHQuHfBmQdOhN5D09RaW0SulIpUvFqX8VmR48AA4EoGupOxNoqSNE2TJCGEEMta+WrrZLoV/TBoPYWheu9hGfpeLYVht1CTVlVVuFN2uaVZzpElMuKCcc4l40jgvCHrIiY4Y+S80do12jljCdCDECIoATe1Ns62bTuflaG/sxAqFD4kScI4D7nkIFNES3/d+oXIgfWwaNdkLgRwlj2MLprArm7N8wZybWHHpWjg6rurO7vafz0ItH7fww5sTVAS1ihybk3Vcd0CrX+yfpzwZK4PeLVzOO+qPC989wJSwEouEmnxOSMMKtBAHj1iePefO+z6eNY3Wsa0VvggIEvvvSOvtQ4vadu2IRdgtS6K4pMPPzw4ODg4OJjPZmU5L8uSiNCTsdoYgwREF6zJMD/LNcGvz0kIV+CShxse+/DaJ0myu7t74/oLW1tbIX6wikOsjkOLulNieGH417cvvNi/ko39HHyBnHPnXZwmX3r1tThW7/5s886tzyxNx8enzHpmPSDV81k9n1Wz2dUr108ORgjWWs15BxGzbqeqih/+8EdvvfUWYwLRHB4en52dzabvlWV948VX4kjubG4Rl1cu7ROTp+fTpqo0tZxB6F8jEIwnYS0iZnlirdBO+6UGOSJyLi4EUax13iMwzrngfJHms5aWtOgA+Hobg9YaybjKkizLmBSbm5t//z/+zf/sP/tHztv9/f2mNYxLGScvvfLyzv5ewuns7Gwym+7u7yme3Lv3oKnKK5cvHz21tz/5+L2re//L/8U/+J//5j/48U/+TApG5O8//TDLdNVYRF6Wk5999O7O5o7lHhPx+Phga2fQgLv00o1/+69/dzo673ay2HIppVSq1i2XoqobrXWra0JwzjOGjDFCEMQEQyV4JCJnjF9eV13XTVuB93GiXrx+Qwj2+Mmjxw8eDoeDKIoSlTx99GRjazOK036nPyuK6Ww23N7O02zCp0msOt2MIbZVq01VeG1sXdbneZ6HOHGn0wkxWq9pldZf+aKLwCfpujaGgeQ8imSSRJ1uNtzs7+5sPn78eDaeXLlyiQtyziiFzplQJNy2bdM0ZVkWdZUkSa/XE84zQOAEznoiC5K4UIpzYGhck8RZXddEXknV1k2epZ6hZLyuy7PpaDIeN3Wl67quKsWFFSQYV1yFAvpiXrZ1PZ/OkijudrvdblfJoArAwrvKka38ntXz3zRNkiREVBRFgCar1945V5Zza7UxbVBfMSZzzgAuyt7atl2o2Xq/t7frrGeMCUaMIVVUFEVMaSdPEIGIAL0QjPPEOUHgoyhKsziKpHPW2FDNj4iIctHDgxELXGgiMu2ikp6s16DDQpNEaRpjIIAEXMWWfOyg8htenqCztLre9SUYABaIZjknuNRKIqJAuDNgdNuGxYsvlXe995zzNE0ZY3EcR0KuHppQEBEE5hARiAGAiFQoXMRlB21ErJu6LEtTNKtQPCISeCmlI88YeO/8ov2BCLW8zoXO4dYvhQJDqj6YvSB0MZvNQpw5PL4CUCKLpAy9npUQROQM44qladpLM8kFoLNCImdSyrZseaw4Qw+MEPrDjes3bvZ6vayTh9RzEsWxiqVSRNAa7Rlf5WUcLWpDtF2QBrSxoanj4i1C5p4VCV7N/Mp++DVGIVxUDayv2EhLAeaV+Vn/K1vTX3rmvq8JEvjVn+iLgQIAhHsdPnnWwj3DIXgON6wOtaREEC4qAAEAPGCIXXhABEIC6xdKQiFyYN3zEGF1ybSsclydl4hQoHE2vAVcCuQMgJx2AGCtVUrFKvLej87Oj4+PJ5PJRx99NBqNxuOx0TqEexhjS8kaB568XwAFFvD0GtlzfZbCO/IcoMFl+U+osFVKBcEuSKLl3Vw8GKvLWd2s9Yt97o6vzzbg/0DVw7/j9vmzLD5fnDJQYzwRQwhPiGeRYg4AfDKIXht8PclyqdKjB++NDw+3tvvTSUtOt3XVTaKr+zu9LH3SPjaWqPHG5UVl4zQ6H58SYdua0dl4e3vbGX92ct62+oVrNz764MPdvcuT0bkn1snSOMnrqooEdxYGvW6eJUTknQKtKZKRVEjAQgmN89ZarUlIxiQLQCEsX8YYoFAItiibYktXcPUszebz6WzW6+ZMckI4OTu9c//eL/3SL339629//OlnKpLIGJeqqGopRV0U944eHx4eArC33/za9nDr+Ojg8f3RJFZgmiyJzp8+ufvxx19+7ZXf+N7fnM3Hn332WbeTNk097PeSNJ9Nk9mseHrwgKG9fHV/Ohk1pH/03k//5q/96u6N6wejY9PWcbwROPVQgiOPCIJjFEnrDUfGBCcg3WprnVRccuzm+dnZWViQrbW6befzqRD80t7145NDjrjZ74nNIWPgjO3mMbe7WZo/PTrsdHqxiAqqmnn52UcfOkfWQ6pEZ3vgnK/LSmuLnobpsN/vh9rXfDlvvV5vMplorS35KIpWPGtjTBzLpi6dwyROuKC6mY0nPFVsf2+HoD07P3rxxRed18h8FAtrbVFU5+fj09NzlcSd/gC4aLWu6lYQ44ILwSNizDNkILiQTElPyJgGorqqOOdJ3hnp8/HpmTAiyzLbNrPR+fHBU2taRt5aS0KAVFzGBkxbl8W8nE/mVVUhAEfWNDqO0yzrIGIkeZqm1lpnFsSiELMNr18grZydnQUpruFw2O/340Q5b/JOWpalJ0NguYCYSetaaxwR1XUJABQaNZFDpCRJxuOxczbw9a3T1aRIbcu5rJuy1bWQgJjHsSIQzrksS5M0iiLpvXcuRkRkRETT2QwAFFfBfpjWBqtfzorFEuMW7mCw6NYtrghCcGXNsw8XGExYWAdXcnXhZ7ZUAYJQLrhc8kLcPlg4kEiEnIvgnymlBDIrfSgvDD4cOL9qDVDXsyCVuCBzmYWCRcBqoRNROHhRlVVVMULrHQAsywh9UAPs9vJgmhyQJe89WGettcgWbsFKZiqMORAkkyQJGeLw+GqtY66SJEmjmHFkjAnGwZPjvK1rThDqd3TToPOMIXhK8yyKIutdKDC5tH9lc2un0+uHZLMUSkoZSnJq4733IIRb27T1i0aOSw3g1l6oIARq53O2gdYEB9cNUticuyjeoS/ys1dAAZekP0RcZaYREddiD6vjrDiJDJ/5fDWw9ado+ZUFQPz8YNYt5YoVFJ4Hv6jvZS7oOCFQ6ODgPSHH0K8J+Soj/xxOWs2VXyMzPgNWOPMIxNDjIrYUsFqSJG3dWMAoU6PR6N13371z63ZVVfPpqCiKqqq8c+Hl8N5rWkQygFZJFgphD7tsZ7XOEcFlItYvVTLDyBlj0pP3vq7r2WyGiCGe0evmK7rPOpy6uEdrQOHzM7/+L/v3gxN+7oaBfIqw8C2QkBDQe+e5ABDC6ZYzDoxdunwDMLpF1ejgeH+47ZuqasbWw5Xd/Te+8vrTJ8cIPo6jcNXz+TxQx/q9oUB1eHCyNdzZ2Bhe2i2fPj3UTfP0yROr7aPHh3He293ei5Ls6PCAeZMkSkUJOlM3rdHaOc8QnDOuMcAwIC9jjPcWLQojknTBW3LOeWvdgjF8IRYCz4JpywCREcOiqhiAdebu/Xs3bl7/a7/07fF0cufeAxVHeTeblbNbtz9WShW6qXXTVO0HH71/bf8q49TPE9cUpJu3v/7VLI7+6T/+x7+fxb/wjbe/851ffuG733v9na/9/u//m7Isnz49TJjcvbT94Ycf96Joc3OgLm3NppMPfvbuC1f2Y6mqUret6eV9760xtXWaC5FmMbEeIatbzQRnXNbanLeN8S6Noq2NjUx1jg6POecMqG0ap1tn9KAzyNK0m2VScvSOwHFkLIn2t7ZcbzNKk0cPHmvRKKUG3Q4Be/jgIRPCe591OpcvXx0Oh1rrs7Oz2ayQTAbuLWMsy7L5fF6WZZpnfllUGGhquNQKS1KpW2Do40RKhtV8fuJadHq40e31OmU1nc7O86yb5ZEnjYwm80lRF/NqnpCVkWhNY6xRkRDVrE7TNI6EShImpAUiAGeIyMUoqdHUaJWmCqgcTe7dvduNOpcuXepmaR7Hg06OlMeJEow75xIVSa7a1pyfnE31zBhHhAxFXTUTLPr9IkkyzjlZh8DrprTa1HVtrVFBFxPRORNnqTF2MpkcHx8G1duymhszZAz7/Z5zuigsgE/TmAtsmkYIxTmvy4qItKY4VpFSWZadnBydnp7OiipK4ihLpRRlGYLqnnOUkgvBlBJJkgCStTo4+kGthXPBGAY2tbVWMImIprUhkK7rNuAAwSRjHDhAkGVhnAFL0zTU8oW0SABASZJwzkNAPvDdwuoJS9LTKvUAy0Iy51ywu+HGB5OQZZnnxJEppZYKj8hoEd8ONkpr7bQJsoYhcxHEvMKS7ZcOdJgN6xzRgjbovJNSsmVAPZwdgFbBgM9bU8YYwUVL63VPdzweh8hYmqYBMQghtNbdJFdKScY9OSISjDNA720kZZ5mUnLTtkKISKoQdomTDufceGecJcQkyxV5oRRyQcgcEFrvkCAUznrvtHbOBTnFgOSMDa3Dyfil5gERIGcMgXAlEETLECh8zh1/Fgp8sUTBav9VLCf8NXT05vS8wUZEwIs0h/MLIwfk12HBcxaL1ipL6VkS6LqpozVff92sEhEgW/DsARZMRiIPoerBA+MIEDpcw7NXuhpJ+CE8e+unCAMwrV+BIe0sEaEnRFRCeunm8/nd23fu3bt369at48PDuq6lZAEHk1/IUgMAWRfSWwAUlEsAYPlngs/BF0Rc6Xctdl7OkkLs9/svvPDC9WtXQzghcM5DRm+Fy8P41wEiPJtgWpElVzvDX9GGAMAIYIE1PSEgLQIZBOQQddMyxmScX3/pS2x8/PjRIWPWOUSQROC9H4/HASdFURRFCRFOp/MAqNrach599smdgyfHaaxe/9KXr1+7cXJy9s6bbxvnxmfjjeHG22++UbXt3c8+nc6LLM47iSqKoikLZAIJnPPlfBalCZeMcZBMAgPtLirhQzIoiiIGoFsT3sp16gzCRbBNxEmiZNW2R6cnvU6ep8nZ+Ozd99/7G3/jb7z5tTefHj2dF0WaZ1tbwydPnhBlXolBZ3N2Pj4dnUoERUxF6Op6o59621RFoyKRJXHoD3LlyhUzGf3Dv/s/quv6X/zz3/vss1s4n1zuZicnJyJNru1cn0oujX782a08z6m1+ztXRvOawLW2FQLybsY4j5vYO3DkuYqQ8el8VtclZzDs5fs725ORruuaATrn55MpIknBhxv9r7z6qn3p+vnZyU9/9OfW6Vdeesl58/jB3UF/+8b1azeuXWradjKZDQaDzZ3tzX7v5OTk5Hykq8rqOoqkUBzHULfFvCalVL/fv3r16tbOTlmWZ2dnRVEs2lDJhau2CC3HcXM2c94QEYAXQkrFlRJxHG1tb37ptVdPjg7ruknSSEbJ48dPnXPDze2r2W6csdFodHzy6PR8urnZu3p9V9y//bDf7+/s0dZ2FPVULLjxznjnyadJ3LbtRtbNs4yMV9aNDw4fz+628/n16y+kUby3vSNw0ZehbRrOJAArZ8UYBRFyLtNUMRLOUNvq87OJNZ4xxpGUUkIw8kErjci5wJVDRFPXZVmORqPAABiNz46OjuI46nQ6SgltmlbXxtZSSsXjpql6WRJFkW5a732Q7RNccIGz+byqKgLnvWWMJUkyn8+5YEqJLEsYgziOpRJcLFI78/mcMUawkuuHUAhQ11UI47Rt21ZNAGuCyeCmS65gVdpObGWcVr7Uqo3CyoKG12PlZ4cFbgWog4O4ervCr3bZTyiO47JtAnVBCKV1pXVL1jVNI2UUGgUCAC2UIjki73TS8OiEno0MRRRFMo7KsiYiWIcsgjPGjLPWWcZY4CoGBWghhDZtGDkBeCCGyKUQShpdr8ySW9RcLNR5Q6g5JJJWPAlg6IE0OWeM914GiONs3unESYLktNZMiDhJBAOtNedcJWkvTVHwwXAzSuK61VobJgQCZ+gQDQcOAIF7XBu7CiavoggBIhCRXdIVGVuECgKbF9aqD9a9UnjWrQcAxsTq19XOKxD2nLUGgADyBC3SEwGj4LMhbiJCtgyD22fkmJ7b1mMVsLRkP8/CrOzZKjGEiFxEALAojSCyC0lHcgQIgN4jsKX3Ss8dDdYc69VIVr+G09XehjIlTkgUulYyDhhenOPDo+9///sP7t0TQighW2iCnNfyEVpmIYOCy0LJZRE4Wcw2XowH17bwYbhMtdyEEJ1efzgc7u3tXblypd/vh5cuzxIAWAGFpekCIlopG6zjsNUDvP6nv5ptSTCBZRYCATwgILDWaOcoiiIpU+8hCDZtX755/ZWvfPLZz7QTDmRjafTk4GQ0Ic+dZXHjB31ele2Tx4fO2+mkrgo/Hs2aqnZG97q5EtEbr3/51Zde5ZzfvXu/qWoVJZd2d6qqubS7JYCiSOxubRwDWWtlnLRGt9rWujWGOeJCcQj1gqi8tx5oRb0SQnBEzoTW2hrD1wS/YZlf985rrdMs01UZ1CvqtplMR0+fPr569fKXvvSl4+PDP/7TPzs+PnzppZc6nVwIMW0aQE+Mkiz26EfTkbH15rD34rWre/s7vW5+8+aN69evI0dr7d2nj/r9aF6NTo6O/9P/7X9y+uTJ/+P//v8c9pMr+6//+Q9/POgkRBBxNj0fvfjCi1/9ypunp6etbUTE4ySSUvb6PULw3ldt441jlhF3SBRxFrrWOl0Vs3Y6mURRZFtdlPMkUpLFkZCCs17e3+p3fFMdHTxuyulsNtNN3clyKWhz2J3NimI23tkc7G5tXdnb1S/d/PDjTx8eHLR1MxqNrHfj6Xxe1nsbu91ulzG2t7eXZFmgly2XJraqlocVRyH0eHO+aTTzhABRFKVpJqXc3t7++tffeffddyOV5N0+4oG1Ns1dp9ORUTfOrXNZeuQRSdNYtLNqrL03vqnawcZGmmcskogI6Dmw2en5xsaGtHR8fNxVyeXNnU9Ht2eT8elx0ulkCN45N2dMCOGNtca3rZnPi5Pjs9HZ1BijVJTEHc6kJzufl0GtWXKmlNjc3JBCxLESgjOA0HAIEafj+Ww2K8syXOF8Pp9MJlW11elkxrZ1XTIGUnJrNZFEtmA8SCWIqNKac+6c0boBAESSkltrrdNCsMBsa9raWO3JadOWZemcc24hthPMuTZNCAMEs2eaGtYcDo6CcY6IujHg0XIHAALFgoypdbhVIcy+MvYheR+SC+v+ehRFq0ACLP3y8MqsyhphjSCmtW6a1lunZOQd6daUZQWLhkOcGIVTMwGCy7DUrrxbQmCMSbGQPtzc3GyapijLptHhpIShkkLbtbY9jC3CG0RuZWwuWI1C0HKQsFQV5HxBKQ0GYxV4DLjBBgYQoGNgg1305Lyx3jW6tU5XRSmllJEixNrobn+71+vt7e+rJN7a2olUrK0jYOSRwHtg4L0mi0s1qtrY4J2vTLhe6oVfFP4Bw4Wd86vY8wrhreIKq5uybtdhTScA1jKsy1mi5/7q/IKsCkt2oaeFZSK24DnSUgLyOaixPoYVGWX9E3yW97AOL9a9/JU1ZcusByICMR/YOkTAloLQjCMSEgCwcCYGF0PCzzWAps9tyFkwD54xgQwWTwudn55NRuNPPvnk6ePHs8k04GzOeWsWIS7yPgCFAC8WYi8+dBshxhhbICr2hRcVUg/hzYqiqNPp5Hkex3GcZqHVXFmWQZYxSZIkiVZZvzCl1loAj4iRiNYncx3cw+cA3M/Dc39pW0gDAgB5QOAMgABFEIa1DohA5IOvfP0Xn5yfpMX5aKxrC5OqOZvM28buDC9V5TTPBk3VVoUpyzkRSpHMp5W1Oo2VFNEP/uQHTx882t7e/uVf/uWqKMHaWs90PU+ieG9rs5zPBsP+9WtXEdFai6EHjSRL0hlrvTMOUCATjIA8kHMOaOE5BM1LhCDhf1FDyxgDWjzb3jmRRMEDeXH/pSRSB08fcyFmpf3hn/9gZ3f7jTffODg6/PTWZ+PxeZLKptFpnjVVWZSFAnB1XY5nV3e2vvOdX7q6v/f1t9/u93uzsphMp2knv/bKi5cBTudPesPN9+59/P/57f/qa2+8/X/5v/1fJ+fjf/Lf/s4Lr16btjNrvSEvpIr6nbcuv/Pf/vbvBCOiVMw5ZwyNMZ4skuMMvLcMWBKrQb+nSmHa9vT4eDrF6XQ6HA6dc946njBn2mI+/fEP//za1f1f+sVvvnjtyns/+/GP//wHtqlfevFGZeqz08ezySl4iDjkiSqn426/P+h2+93uydl52+rT03NtXF23Kk52dnY6nU5ZlgcHB8a5siz7/T4h1HWNiLAsmIcgk2+t96BkyqTnTAAxIGEt1HV77+5D3borl689enhgjBFcbW3ujMdThwWPorSLeX9rb2/v6dHhxx9//PTwttjZ3NFaV9OiKsrJ+ajT72XdjlKKGCLSvVu3/QsvSMYf3L+/u7t7ZW9/c3MbAIRgQgjrtK6bxhjGmFKqLOuiqOqytdoxxqIojqKorlsGwJkMvZEYA5bERJIxoZTKskQp6YypqgVNoWl08H2FEN6HWgMMuoHaNIyxbjd3zs3mUxXJTqcjuYzjOJRI2FZLKbVrnXMh8cmkaLVFJVQUhfVlNBoFxnsgm0RRFASCAqcPANrGVHURQBkAsKXvEmKVDHhg5XTz3kK+zeMKB4Qtz3PGWIg593q9OI7DpYWyCERs27YsS+994BmsbMDqh+CGLgz1Wj4ikDmQANdI3bhcxWAJNcSynISI5vN5EDMWoYcekwCgte71BoiojVlWe6Fx1hjTNhq9D8opK4PpyCslmOBMcCIKvJCwWrNlH0i2VHRYLdNhkhdVvG0bgg2WKKAH07Zaax8yai0QQ88RPDLBkyztDgeRFKooggbz/v4+k1Iq1RittQbkKDgAoEdHzlnn9ELTN3RccEsxA0uwSDfAsu4A+YUgHgD5BRfVLVWB3bJqY/EALOtQcCEYZVcfwhpQWDfz6zZmpS618rkDXiEiYnyVj1ilHji7ABnrgGNF1lv3dNdByXPb6uu41JEMD4wnBFrWYAbYhAzCyJHBAhMwvwwnrIkCPaNSgM9SE1ZbFMWB3w4ewj0y1pqmvXv37meffPrkyRMA6Ha7p6enTpssyzzza2jYLMCQ8yFDggTrOY7VthrDOlZYxXXCXIVHEQCappnP52ElDdy6INayihZ47y2GklSU/iLLBmtQ4POA7K8cJaw28gAAJJgQjHkC7yH86yxJVNvXXrh0/UahJ+P5mUORdvqC84PHB1m325am2xlI1vR7A7I+TdO9yzeqcv7RRx853X7nl38xT1Mi/0d/+P37d+9Za0/PR3nWMU0bR6lgOJtMXnr5+tb28OzsDLytm6YqSlSKkUchLNmlphZjnNHK/C/TN3JZfsYY8xdLSCgAXmilR7GazGej8/P9/V3OeV3Xu9sb21v81u3bP3vvve9+97uvvvrKvCxOTk42t3fLsqxrkkJsbW11ogi0QavzTjrcHHzjm98IpD+UjEXcMDcup9Pp3HX1ycG9S6+9+Mff/6N373/U2d04mp383X/49731v/3bv9PUdri1PZvOT+eTl9/86le/+c5P/uzPhBCMgfWubkqjnXNWCDHoDYwxyEQUJe3QTCaTqmrapmkabBuDntiS3K2bcjqdXru0d3T49N2f/OSVl1/85jvfeOXFG9///h/eu3fPsNbaZjadpWlu2qqcj8uizbLs0f0HZyendVlZYE3rGuuIszzrjcdj7/10Oi2Kom5bAMjzvKyrlZZoeOwDAaVt27YxQqg8iXvdXCJ4rQVnRrv79x+enp6/9D9+qd/fePz4sfewsbGptfNwkHWEjFIiynoqnXMurPGtUDEJxVmj67oqxqXXU1OkQgT5fXly96Mb25lH1LODMc0YY6mUu7u7TPBpNfeEnV6mrQl8qGyYJBM5PZt2e1EkL01H06dPD6xzAblHcRSppKqqeTUXgo3HY7WzYzQ5axHZdKbbtt3d3R21c5UqC7ZpG+tNquKyru49uBvSDfv7+3mStroej8fG6I1evxsNRqNRFqnZbDabTZqm2tzcLOv50+NHAMAsY4IX0xYAFANTjHiWA7pWV3Vdc85DF0pkFHI8uFgveNM0wbb18jxYHnLApEySJI3BGKOUCm0PgzZ8MZ+1bdvpdBoj07zDOYeqiGO1vbeZ53kgXVvSZJmUkQe088oYzwRv2nEUJSG4KpXUWtd1G0L0jkDrUJfPlu4jxCpjjHEeOYfo0bZWSrm5MUySaGZmpmnBO1TKWF2XlTHGSnY+G6um3N7ayZIkvLoRj5QSxggpRFWWbduGlEQep9RlSi1IJ62unXPkHDk3mk72d3Y7edQ0jdFWcowRufecL1oOeqAoyVRPMcaCvgAieXB124YSReKAjKARgXNhAjfTeau1bozkvJf3ZJxHshkONm5cu5nFyXg8jjrdvNv1QkZx4oHNphUAAqNyVhORcc4vTSwiEoPWLJozOXeRAyIfSoaICIMUTPB+AaBtDCxjNhcMBoAk4St7DwDGXGCLlYXwa1t4M1dsklWoIFKh6yCHNQARoAwKiWvdBcOHPFIrVLGw8YwholkiVwpGGsB577znXKwPac16EeKi1I8t1Yit88AUXCg0rBnCAAgWERd3cZRnexms4M7Kyq5jI0RETYIYLjIEzrT6+ODw6cGTj97/4OzkdDIdCWSMsVgwC5yoJXsxsxhyZuQJiTEe2AlMcAAIBFtAANLk16mdjEgsrRFjjCMy71C3TrdOSa8U29rYvHLl0vbWnpSKAYtVpCIhGAfwBKDEWvQMkRGw0LcjQCUMSlXktGGMYaiICSAsTCwPe+ISSHwu8PBchOj/T3Tx7O4sHJ+vsynJhVkABBKkItXOpl//6jt5lBw+Or47fgJeConokgd3Hl3au8wAm0bXc5dEG9NxkWxV48lo9+pl7+3JZCIE89b96q//+q/8yq98/w//+Lf/u386rsaPTkZZZe4fnI4r/emth6++9tb9x4fTuh1PJxvbW/OmmsyncZpQeNo8Wm0QUSATIGy06OppvS+qmjGGDOM8c9oAgHXOWhvHcZ6nomGzmfG1F0Lsbu0fHZ4xDtnGxtx5r+ua+d/9/u+//uZrl6/tfXZLdZO9gydPu3GsRFrWlXOmcFbrVkfyqa3/+x/9WdWNh4ONTp4KZHkc94Q8OR9Np9PiZPrKSy+bpv3qq29+8OOfNF8qU5L/4r/+J7/+N/+D/9nf/g1E/PjjT+tOXtetOz3862+/8eiDW/28fzY6b42hNLXexVEGnLXaDgYb1nrOeduamEf5ICuK4sn5nWHKz8+ORZJ5mR9M2iSOZwYuX3/x0k7/D37/d99/9wdfe+edv/E3f+2Nb/zCp4+efHjvszfeeAM7nftHR71eb2x0ttE1ip3MRw+PHgIT2vmirLa2d7mS8/nE69QhGGta52QUAbF5UQNg4NUxBCRjtfGOGGNJBGCkMeb87IwT5GlWlnpruNnf2r/16WfOx3/0p+9a7edTPY5n+7t7I5hA2qsIhru9uh2dVp+aaJRuTZsaxGwyZRwBIFq0YOdWm6rQnU7W7w729/aSKD0/Py/nRb/bG/QHx6fHD+7dFpEabGxEqRpPJ8Rwb//y2dkZZ4z1sziSEiNE5sGpiTKklZLWWm0aT9Z7KyUXkSBybVs3TeWd63Q6WZ5wgU1bCa402EUPXGDOuWJecmQcWZqmZF3gRi0UVT2Mx+dtG4x62+3lnU4njqO6rrMsCZbekQ04K8/zbrc7mtdtW6OnbpYTUVNWjKDf7/c73eBq1EVhtBXImIok4ycnZ1mW5Wm26EFAUNd1XdeI1bA/IMLJZAYA4Elro9txnHe1tkIsTReRsW2ra20a5w2B51zlnQRZvyxr51w7a0Pamy2TduEHpVRIVzPGEBehJK01Yy7IxSilXJZ2nPPet1ozBm3bVnUVWRGiESqOVBxN6nIR91Mi1C4CQOikERofBwtH5I1tnTecK2OMdi3jC1XHpqrqug6Jsapqqqpo2zZSCrElojzPw0GY4EGagjFmydd1SeQ8kPfWOqO1bk3jnANMGC3YDAwxiiIpRcLjKErybreTZZzzreHm3qV9pVSUJsbDqqB05aB4IOdCb1Pv3FphAls48PBsyoCW8RUAduHZU2g20cKzZXJhSS6KYnWE1bZYu5fuJq3F5FfxHr8Unw77aB0KxP36QVZfX6UkQttxKSXihQ0IB18F+dc/XDn3q89Xx3zO234OEDzHLfhCj/mZ7dnPV1P9+X9xrWaSIRK5ttWjs/MHD+8/ePBgNBoV5cxay4UEAGSEjBAZfVG56ReP5Ods4YzeeyH4ulR2AH+7u7u9Xq/b7QaludVd4JwjEuOAjHGE1a15Luu0uuTVto7J1mfv5w4bP4cV/n1suEwDff50UZ5FWXrz5s0Xb7z00YfvHR+fdfO4qhpGUJZl27bgvHW6bcz56engUv9Xf/k7QogP3v+Z5IwBODS729vT8SSJ1bVL+2fn04f3H3zlja9e3t+7e/euUmpazJM0ZZNxa/RkMtHkxFI/e308Dp4fHq1RcVdvNCw5LmFVZ8Q554C0qpq3xrdNu7ExPD0+/ZM/+bM3Xv/yN7/57X/yX/83X/7yl3/2s5+Jfl8wDgCccVDKWtvW9eHh4R/90Z+89dU3bt54sSpm7x8cSs73d/e2Noem1k8fPZ2OxmSd4JGzcOfewz/4wz/+6U/e+/rbb//CL/zClWtXvYP5fG7JT+azLEnv3LkzGG6kadpozSNV1TWTgoAVReEczWYzADbo9S9dunT45OkdzqMoMmiDBGrIRLdVHULUs+l0Mjr5/h/8gbX2q1/7+t/5O39n8KMOAJwcnAzy7o1r1xkT83k5Ox/3Op1ep0vAmFQDZ6M4Nd5Fgw3OIu99WWpjNGIU8mVKqbLSiGxVVsUZE5JxzmVXBqOZZZkUMk3T3d3dKEniNKlM+/jwgDFmkCqrZ7qOutn7n/zx3Tvw9W98eWsnj1keRf72LbhydSA4USC6SymTOFFKad2Qtjsb29evXHWtjpgan4yK8Zy2fCfO23zGpGiaajo6yWyeJxEhVPORbktkrfcgIp6mkRCqcf1tM7zz8RNCb71pKogim6ZxlmWdTnb58mXGWFvXgQFbl5XWDSKBR/DIGcuSXHQE5xgpQQTn52PTtuRcWZaRVFxgCK2cH50wxqqqstZ2+z0id3Z2UpZlf7gxnU49WRcslWml5AB5r9flnNV1LYSIopgx5pxrmubk9Ihz7h00TRO0BxgTAJAkabfb63d7nPPQFr0q66qqhsPhYLBhjJnN5gDQzTtpmgVSIRGtqG3OOWuNtYZzSBKFiEkSpWk+9N3JZDqZTOo6SZIElm0OOOduWbkechyBnBXMj9ZaRRwQA18BEdNO7o01xtCivzA0WmtrkSgYrRYswELOwTrDOWfIAXzb1tZaRApZpNX66L01xnjnmAsdClAIEZpaOefatm1bzTlL03Qpnu8Y84hu0RFM10TU2pZxCGSAUGPCeYTca61Rcu+9bqxuGwAmiCspBVNCCpA86eQbGxs7Wzu9wUAgkypqW7MqCw7ZfWOMcXbR6XsZUVisRAhByC+YM1yR1REDq/QZbWUKlQ4L8qNdKgmu0tL4bND+OUuPS95A+GTFul+Z/xWfAxEZX2uczRa9oEJp3dL8wDJo5FcIYGWG1/HByk4szrXq1XTxOQEAX1NuBkQfaCqI3j1Ph3zuyOumCABorYID1qwmu+h9evEnRHTeSCkF48a4siwPjw4ePnx4//79pix02xIRgHfOr4I3nv5dx7M6z8rNXk3dyoQvanSZCHdNCMGVRMGJoXY2iD458t57FnEMba8YAwbAWNC4dmuaCqtbTGvk1nV8gIgelkrSi1LGMF3P2m9cDvzf67Y+jAsQgwxAAHObO3vXX7yZZvl0Omfge91+W9ch4T2fzK02g343TZKYiW997Z22rR989olAZnRbzIv5+TgVanY+Jm0lwOnhQfz21166eXM8Gs3K4tatWwFwKKWiJI4FZ1KMphMEDDTn0ADp+dtGhEtAsDYpQEvyHQAopbwFIkceEAlBMIZExjmcz+pIxZ9+cnt7uP2tb34DiM3nZZrmFkAsOMIkhciyrG3bVte3bt2ajic/+dFP63LeVLXiIo4iItocdl+4chURIy4mo/GVvXvjUZnlGw8ePjof/8Ht+49+8Rd/cW9vD4UoplMC+N73vvtbv/Vbk9E5SgUMr2xvG3emrauq0jnqdruzyZxz3uv09nf2Rqfnk8mksd46MNYzlUgpBSdj2j/70z+N/to7Alm/2zPGfPDee93+AIG/cvX6ycnJFLmUQgEzrUm43O5vqDienE3OzsdVoxlD22pE3N7ddshG55OmqVYpNsYoz/O6KUNbYoaAoV0LheATwlKIyDjLGBtubRZFodKkaZqj0VmSJDKNCqf9dBTH8ZWrlx4+ulMUs93d1JNhjMoKdrZ6Io3ikBwyTcsIJONZnKVx3FRVXdRt1TZlMx1NwTFwjJF4+823Nob96Xx26+7t0XhclEWpG+1spz+wvtXWEkoPkGRZlKut/c1hZ48xdnx8fHh4SERCcGP0ZDZJRnEI4Hc6HdO0o8kIEbv9rtPgvZeKJ1GcJAnn6MmiJ2O09z6wc32WdXt5LBVZF8USEY3laRYPh4OiKKbTMQAgknPGOcOlQMbqup4XU8ah099OkyQEyW7efPHGjRvj0eTDDz98+PBhHKeMsbqu67rlnGeZSJKEsTjPcylV0zRFUYUGo71e1On0BFdNrb0LCnSKMUaEUawYA08ekTgPfQqRcS8kRHEMAJyjkF4IZayq6tBMb6FkEG5EUVTOuX6/HzzUABRCuitJEmQiiiJtTFVVjEOeZkwKZzTnPEpiQrBaB0hRt23btiKRwb8KQlXeS8ZcqGnkHNM0DjsH2ME5N9Y674DIWhf0m/M0S9O0qiqilQKBoFAsD8AQhRBKRYSOyBE461rr2hCKFYrHSR78OWDonGsRvXVlWc9mM9MYzrnkkkOQ0ydimOadNOswLj1AlHQ4b4LxNsZ4WFSWaqOFWICn54ACXQgWXSxVq5U07LwEBKEUlq2AQpjwYMMCQ37dZtOSfr/mkl749Cv7YZcinuHOkrfB4Czzs5zxRd2EX5ZHwjKkD7CQS/w8Vli31l8YKvj8r3+B0V2PAcCz1RPPecnPudHrU/HcYcPOum0BAJibz+cHB08fPnx4dHQwn0/BeSIXTmSd1roNcRfCLyhewJ9fzbGCBetDXb8itix8iOM4y7KiLKWUQftE28gHegeidY4hEQNPxEPehYV2mg6IgBayVEDEghQ5AXgC5AwZhJ5OjMGih/tCCIsg0Cn4knL4bB+IvxxKw3MPgLOWCxbSOPt7l26++OqDe/edbRujB/3BjReuX7t85fGjR7qse3kGOQw2evV0enR0oItKRFEzL0+fPv2zP/r+2197p57P40gi5rdu3/9X//JfSqUY4y9/6ZXT8zPPSFstIglAs2KmjRGRIgy8F4/ICAkQ6HOFM7Qk5Hq/fKiWT1SIkrZN670zxjImOJcMlRRgOU3Go8v7e5Px5MMPPrm0d+m73/3ef/c7v3358mUnYytE3Ta1bpEzuYxtSCmFjByBcdhq23g9n5fW2u1+H5zQxjx4cu+D9z68d/ep5GJ8dt7vDQfDYV27Dz/69NPPbr/++ut7ezuXL1+mBt58640nT59OZnNLfjQ+H52dl1XDpKqrNkty5zx6KKaFtb6t9Xw+Rxl5YsY5hosuRYElA873u72jw9nW5qYH+tM//CMRxV957cWbV1+4srk/Go2m01kxL3vdwUa35zxtbwzbqp3PT5EzBsx451pTOj0an43GZ3GUAuSLnKnToWk154zIeQoo3HrPqKmFEN468BQEDJng0/mscQaVaJrG66abRIVuRsWs0+l0O0I35s6t28NhkneRge93QUVSBKZ6KAUMVQCDwSBJktFodHpyPp+VWZZtbe4ON7aHG9tKJknS8SSHGzu/0B8+Pnj645/+aHQ8SrLMJZaABHAUAoLiL5GKI84iAEiqKKsSyXi8MJY868SMpUmSKCFriVs4bNt2Vk7yPEeQ3vM4juNEoietrSUTKRErmeVRGsW9Xies41VdOttqrRnDbrcbp8nZ+Wmrm8Fg0LaN1q0xmgkmpQCIAcBac3JyEnrLdjrdzc2Nvb29JEnOR2dlWYYut0Q0GPT6/X6oun56cFpWVFdYVZXWOoqifq8XuplZp41tszyJogiR6rokorqZSclVJLI8yjuRVOipca513nChiKiqq7ouhRB13bZtvb29rVRc1/VCIZuIMREKBIy2AJAkSZ7nQZVBCFE2LWOsLEvrHZDjcpEar5qFoiJyJjgTSsZp4q3T1DLG4liJRa+KhXlLs0RK6axHxPl82rY1EUZR5AmM0eBpxUuXakFU5CgQubW+rtu6bIJbLITI8zTvpDLiQoLgKBWC4M4ZAh8aEwqJaRrLSAFAyzwDZowpirytWu8AiYEjzqXiSRwlUZQIobwHxoSU0pk2oARalPuvahNaWuMoLFYiBH7RpWdtAf1c1WKwNUQU+IvBtIcZDjAiTVNYs77rNum5z3HZYHD1J7+U62aMBRIlfqEWJ14cOVQ9rLmyuH7w5777jFnl7LkhLXZdajyFxXpl5y9m51kD83mrv/7hOmi4GP/aeFbf4px574qqOjw8vH3ns9u3b52dnBrTLupgyVmnlx0xaJUn+nffnoOAKxyzqit2znF2EV2IoihOkiRLQyYu1JoTA601MmIMODLHgXPOiAGAXLULXZSL+iW1FwLGCH9CZERBCQqXsCDcEVxDCV8EF/5ytgskh4HHQJ7Y3qVr3/5rv3x2cvrZJx+QMVube1euXBv0uo/vPyBvB/18OBx2su5nn358fnK60etJwaxpNwcb0+n00cP7r37p9f0rV85Hk7rRj54+9YRf/uobQnHOEcA7stZ64qBt2zrDUXgABGTIAkRAQL72DuICdy3fvpXU0nLkC+KzcsYYbcgYw7kUEhkqpaDfE9awqmo/+fhOvzv4h//xb97+7PZsNuWIyLnlQoO21i2BCDrnp9MZEnjvhYwFY3VZzcvik0/vHR2Pm7qdTebTwk7mOk8Uk91pYfp9Pqlra4+vX7/y8s2XOeInH3600R3+xt/+9ZPzsydPD0/G49F4KrhsjZUqvn//4cnhUTUvut1+W+v5tCjLOut2VJRqYLzWFkKPE++cT6M4TZIXrl57cv/OzReud3u9f/57/zJOsv3ht1577bUs63z88cfvv/8BWhCAJ08PtXMccDjYKOuWOMZpPp3PxuMxRZzIJUk0HG5sbW7VdVtVdShBD36Ic9aY1nkI7CaPnohWsuVENJ1OR6NRWZUhm6yXW1EUAIDUpKo3Ohm3pd3Z2iwqs7PZPTk8E7WupZTAgRh6otaa1hrulIxjS8SVipI871LTNKPJrNH2zz94N0mjfr//4ovXr79w/Tu/PHj//fcfPXmELfNETKgkyZRMvUdrLXoQiiuldvnOcDjodruDwaCXd/r9vnNOcuGcm0wm3vtup3N4ePjDH/6wrGZkHeccCL0lIodopYAsU3mqOp00z9M8TRmzbdvqtmLcI3NJKtNMGdsSmU4nGQ57DshTLiQ48oz7WAgAYIy8BWd1mkRZkp6dnB4dHJZl2bam1+3M53PyvtPpXL58udvtTsazw8NDAOecdkQEVkhUERcSkfl5MSfr2rYVQiD66WwSxM6iDgKLUtnLOyLNOWCrddvqEhGdQ+990zS6NYyJUEy3s7MTRUkACkmSMMbKsm7bdjwe86WucHi70jTt9XoDxhCxrerBYBDy6/PZrCzLRrfgSWutTcsBQ3UiCCGQL82YD5WlIWjvvUVUUgkVyVB0johxHNXa1LVBgDhRG4MhERXz+Xx+EqkkSFgrGRltm3aRdQuDZByUF8J6qRgy48AqJTx5D23TwGTimqYSMkJEkBRFEecyFkxmkWSSswg8MhKcyyxJOKDVxjMSSFZCqFwNqZwVUAiW2K/JHtCSo7CWAoDlDxTqr4JNeS6iYEy7yhQsaCh/YaH8ule0Mp+w7HABS8d6lb8I9nq1LAIEtWR0zgGnVXwClwrNK9u5Dhk+bxUuPv85EYXnLmEtYHARS1hHA5/30Rd/fdYOfR5VPPenNI3rup7OxodHTx8/fnx0dNBUtVLKORNabDnvvPecL9uFOPuFs/3zbsFzHI7VeIJWXbg7bFmWzBgbbA43hsNOrxfKHBz5VmvyoVCZJEcfUuIAPOSb2MXc0lr6fPXJ6mFbwLglYlxKHiwm7HNwAf5qEIMnAgQADlx0NoZvv/2Nw6cH8+m0mIyVituqPTNn0/GIc9zf271+/fr3v/9HD+/dd85euXqpLqvx+DxNU102B0dPdy9fao396bs/G88LHgvBxGhy3t63/eFG6PJVzOcxgyiK0m6nahsEJARCWKUePAJbPmyMsZBWC9MYkomwrBlePZBxrBhj1pHWQeKWGGMIKk2i+WyyMdg9Ozn46U/f+8qXXvvN/+k/+N3f++c/ef8TIvJAyLkQnAABuVKh6Z3RWscq7vf7SkTT0VgbYlK2FrXnnscyxZPz4nF1XhXll1979cc//SiR/D/8W7/2nb/2XUXig5/99MMPP3zp1Vd+4Rd+odPNB8MNAlZrYzyWdXN+Nq6q5sH9x22tRV9yJkdn43JeKaVkHCkRMWm1RymlYsRT0VT1dDTe6vfRUy/vvPnmmycnZ51O78qlS50sY8giIdMoNnnuCKuqaq21BMDQkW8a0xlsdHivqptCl0Lwfr+3sdHv9XqcV95TKGeTciE26hf99rgQTLPWOCsjpYNssfNPHj2ejidRFAnCmEvgMuGSMQ8q7kSJqYQSPaPHjx+dZWk8Go8j2Z9NRoLHCjlnRAIJkcs0Js61d5VueVkVTQu8Oj0flWUJAHt78UuvvdXv9yMpN/rda9e+tL+/+7U3v33//v3Pbt06Ojk+PR+1U2sbjUxYD0B80o7jeBnfHunZbLq9vR2lcTfLy7IM9TBxHA+HQy754fHh04d3kCEXwLgl7wFISpHGKkkUY+RdbQ3M5k1IRDnnIpUiqiRJlBKNroebgzS9lKbp2WgURcNOJ5sV86DwGB7NKM4RMYoi6/TTg8cnx2ehvebu7n4cx2madru9LMuIqKzm09m40+sSkdVmSR0w82I8mbrRaCSQBckBIURbN977brc73OxJKdMMhXLWlU3oCkEkuLBWO4dAyJggzxmyOFKz2SxNfcB0QQFGa13XdfChAcAYM51OV+WUKs8BQESq0++RNeGLSZpGSgQ5hKaugixjiDQkKbfWheAHLJv+GePm83nbtowJrbWQPM0SRFQyckipjzmKJEmcN1XZhNsExMB7KVQoORNsITqZ5Umnk+edmAlAZpBpQEbgAR2iZwDO66p2dV1jCLkLn8axFAqAcRQsyqI4UjKKoljyOIsS5tFUGsBo5AwaTc3KtFu/4EM58oyhX9vCKkkE3i8Vfy98dAJaENwW8iMrSuTaxteUE733oel2+JVdiCjA+s/rXw8AZWXDQtCDMRYpQYvWz894V4wxfyGKElouBEbFxTFhRWv4HCnsuZ9XeOXz4e11swoADC8gy3OHfW6EsKT8w+fwB67lLGANuCBiVVWnp6dPHj16/PjhaHQWqCHIyBmHBAQeFuEWAiBP9vMHX03sFxpC/NwMrF8pIoZsZr/f73Q6QUE8RGWNc6BbKSWRd97EKkIky5DRggIW+nGHfpEBTi2eHQLvA9TGEIVae8AIuFgOxiGyNbgQRurX8MG/zwDDF87A4umlQOpl4HFrZ+/tt78xG43/+A/+TUCow97wxo0b08kYyT28fxeABpsbjLGNjY0JAy7Z5cv70+l0uL3T6XWxrcfFTCXpzpUrWzt7BwcHTLIvfemV8XysEtWMGqa5NUQNqDgOFAmi0AOVGLJQS3PxOC3poiHUFl5qzi6qKL33CReMgZTSOUJg5BFQcAZGa/J8e2uvnM2nk9nv/M4/fe3VL73+2lf+7Ec/nc1L42zW6WSdnKFkDKVU5+fj4XC4tbnTNM352bhpdKyi7d39qihQJZJH3DMOajorqnlNho5PJlLEv/Y3/vp/+Lf/tiT7j/+r/6/V1dtvvvl0cvLuuz8ZDDcnszkB29rfJ2Nmk+nh4aG3pJs2IFSGeHZ6XlfNfD6PPMgYQiWKtTZJVCftxNwfHx5lYg88PX746Muvvf7XfuGb2vrPPvvs4cOHG4PNkH0+PD5O88727r4nODw7s85Z78bTicrzJEuZksW4CJlu51xVF2VZVlVprWUoAilhufJbxqxzwnpXFUWe51VVcWSc85OjY6VUxEVbVrGKtra2sjg5OztDMAmxoylZB8Pe5fFpO9k201GzvTPY2+kLFUdEpLX2QIIxLkSQTKlbLaOWgAFDLlVvEO3t7X3ta1/r7V5J09Sadnx2+qd/+uOymF+9fOXtt9989eWv/PjHP/6zH/75o4OnHhomFJeCC1W39So7G6za0Lk8z6Mkefz4sfd+c3Ozbds7d+40TZNlWX/QCUQkJNCmsdYiQyGBcdC6NqbUpgbwptWMsSSNptNp2L8sy9Fk3Ov18jzXWs/n88B2DmIUYR9r7XRc5nnOCEK9w6W9He/BGJMlkeAdImqb5vGDh+FV3BxsaDTGGG1qbVpEdJ45Y5umkVKkcRy6bDnvszweDAZ7e3sb+9IYY612vmlKY61lTEgRee+NNs4hghBCeccAkKEoy5IxscqRO+fqup7P57AI5PJgtILVSZLEV9WaQ0NOmyBNc/ny5aABrtumLMuiKCaTyXQ6BdSwNEhCsuBXca5D/af3ddNov9Sccc5xIbrdbiQVIg/deiRXvV7PmsWbLIRQKg4dLrz33oFz3lki9OQ04xbQOLSAjjHgUjDki8URiTEOTlvdOmOdcQicEs89QwWb/Q0pkkjEHNmigbCzxnsrFk1AnHPWLUULgLS2/ouqHlZkRr8mu0Qe+ULab610wgMRxbFa8RKC2FS4F36pY3HBLViWKa97+atTr/ud65/jChcsD4VMhN0sLcoyiQiX4ktC8HCx4QjrlhjW7DQ8G8+gtfDAOghYDeNinPiMRPTKwDz3A3wRmFi/OnyWnLEa4dOnT58ePH5w997h4eF8PnfOBV3v8AAALZ5bxCCRboSMPm//fh5K+As27xet/OI4DpHLfr8fmDFB+cc5h4wcUMw54xAS6ohI7JnCFsaeKSf5eYNZQ3MrXsJiIH8hVvj3tq1GtX6DiIgJ5h0Bw0BXEpF86eYrxWRcz+emKQVHRMyyzNm2aaqzk9NK243NoW7qoqpq3XLGQreOo+NjS/7l115/8eWbrbV5t/+Nb77z4PGT99//WafXreuaiOI43tzcrK2elwWsngpcG+Fzz9Varg2WiukMMTDKvfdaax4nCAwZiSC9ypgQEjx676Mo0doaY/r9zuHB+e/+7u9+5zu/tLW11bZtMbKMlVwK5JYJLgH7/b5xNBqNAFiS5Z0O9x6sNlmvX1fNdDav6zaLO1EGQAKdv3X/4Hvf/vqv/NKvZHH2/k9+8LMf/eTm9SuDrKO5m06n166/cHh8/O577/U3d46OTw+Pzz759JZSqdF2c7NLDoy2s9kMPdVt45ArYg542VrnnEsj1omMaw4EfenmC1/96lfjKDo7O+NS/ds//KMnT+9ubm5+5zvfvXHjBr9z5+7du93+4PLVF7Ju92w243Gyub09qcu6bQz4umk3NzeSJBNCRCqVMkLgjAmlovmsJCLv0FrbNG3T1GGxkoLVuk0xt9rEWZ6m6Xw6297cbKq6mM7EYLDZ7ScqGh2dtNOisvT2W98ytnz9yzcOT25v72afftI4S/1eX3Q6W2VZGuO0JisYNmDJMc48y8ZzH6e93vYVng7zvPvtb3/bE9UlnJ0eN01jTPvkeHrr1qd3n5yQSl577dX+7m4+6NCBiZSKIrCulsym2aZaaLBoIWMiGk3bT249yrKMyRyIzmZtkiRRN2thZnm7d+Xluq51WzvbcOcZh4izSAhdzEOynIwOU6C1PTudcKGiSDVteXJy0ui6108BW20Kxt10dgbAzkeTJEmdo7t3Hm5sbB6Nzm/0bpS60E3b63SKct5U9c7Ojm7nlbWhXJsQkTNigALduK3L0oPrdnLGWFXXHqnf6SqlimLW28xzE0dR9MLVK1mSCiHiPhwfHwMyFLKYleQoieN5YThI7xl5LpAj8lAWTki9Tuq9VoInUax1Oysqa32WZU2ry6oVXEVJSqwlD0JlRWW0q0O7rCSJQ1zEe8s5yjRyjDRpkYntjc1t2CyKYjaborPlvJhO595756zzhgEH7ztZwlFUVTWvZtTojorJQ13X/TQbDAZSqclkAjIa7u/HaSKEaJoqpMONadq2RWViBYyxphk1bsZMnMpYRRzAG6ut1pFMyJNvDS0rAxE8gIF43moveJzl3Uhl5NDYlohX2nREjjJ2wJx3QIyQPPqyWYjwrJckwDJ6yQA8eWetW6rH+5VTTR6WJsJ7AhIA4D2sjuO9J4+lM8F+e+8DTyVkIkJ0JxSU8rXGS03T4Bc52QAQcAYt6fewhh7WtwA4nHMAF9ECWmrOOLM06gSccSYWNReN0YjIF5K3S24mkbi43vDvwiZxLpcTtYoNACIa7+AiqbFYxAmAL1lg4aPwHyJytypJBc45Q3RE3jnkoXBjwbG2NgjB2bt3Pr5/997Dhw/DRAkOzpE3BiAw3QicJ6KQhggpoXX7t5rbnwdlDCEAASIL5RLgESwCjyMJyIWKVdJReV91hzzvg5QoEkPoUcZxJKXUhsi3QjLFkQnGUEjGw0wgEAJZEBzYItHuPQAhMgBGBN4SMAJGggFjCNYReuskAAXowxjjXDAWoBjCsj4wTP3yCu3yWtfRw+eQxGpWfg4FkrEvBh/MAwGCB8YFE8I5w/P07V/8aw9PDp88uOd1/ejs/M7tz8Ca4UZfGzvXZnx6+s1vfiPNsx//+Med4XDv5Zfr+3edc4/Pzg/++E+sta6uPGd/+nv/rKqqg9n8//WP/nNgOJpPuZKNM5WpeSSiSMlI1XXZto1MEimlMxYAirLZ2tpCBpP5BJGYWqiUIjGG3LXUWCdRRCxhQjDAsqziWAqRAFhL5JlvbeONJe87aaI42xpsnh4ebuSDj3/82a/94t968+Wv1OdF4Y9iEsKCZELxyGi3sdGP4/js7MwYx4FxoiyO51qfn8+BSILo9RIOqM+PzXmVx/DOjY3/5Df/9stXN/+L/+K3jg6fJv1spvWT0QgTMRpN0JjtTrTTkfc+/em81uPTcZ4IlSVR0iHrj44fvvbiddfMNiLL4k0hFTiKOKYxa4oCy7mI+5Kzmy+/1N/ZPR6Ps04+0/YPf/9fnZ+fe8LucGf36hUv2GBruHdt59ad22eTJ1n/hdaMnx4dARfDjfj23Vu7+/vTyWQyjbvd7v7+PhfQ6aRNU04nJ/1+X+vCe8+5FELESnmtrbWI3nNknCsZdzv9g8dP+72tbm9zMq2zJEky6HT7yFmpK5T0wsvXbt588bUvv7Ux7MQpSPVGWZ+Rs/fv37Y6EiFMzTkHsFprKVWv1+t0+4wJRB4lyebmVhRFjInRaHR2fv7o4RFjzDptTDufz5tGn5+Pfvb+h3mexol69UuvE9F0Oo6iKGSbzloMIn1BWINzHhIBRhPiQmzAu5YxU9eGs0i3ZVGUZTFHsIohR2wbZ/UkjSPySLDQD/YI1npjnJAsRIkZY0rGRKS1NcZtbm56D96DdcCY0K0FYMaYX//1v7O9vf344aOPPvjw/GzMGDPGjUYTDNqLIY4khVDSAxlj9i9vFkWhrZWRQg6yTQBAxdJaGyVJmsXFdBZJNRhudvPMOTdvTshjcG6SKGaMK5mSq8OaKBhXKuJcWuPbtnXG6sZxKYLsI6KRVau99p6xReITGBDnHDiEdgDT0biqCiKCSDHwAhkxLgQbn50DeMZYFMtuN0/TNJaK0nxzuOGta5qmrmtrnTFmNpsVRTUcDqWQSilAP51OAaDf729tb3aSrNfrKaUixTvdNMgwE3qtcwCwtKgLICIuuZRSSGjbuqoLrdumIS6IMYwTRRSIRRYgiAqI4DNr570jIN/U2pkGQcVCCsakiFZ8tNAiaT0g6dc6aCwDBgsb7NfaBF8ss2tBhQAUcEEdeEYliTx6Z1c9NXDJgMNllgGW/LiVAXNL9dnVicK/682lYM3jDN3GGfehBtV7j26BJPAZI/DMAS8SHEsqxnpEYaU9gM9SHcP3w//9sg5t3eNc5WhWh1r9df0a1/exNiR9llVty4yPtYZzbskTUegnXlXVkydPHty7f3x8XJYl0qJAlIcneTkhi9wBXtjC527cF9q/v3hDxLquozgNsmmh3kRKGWg9KhKRioLbSp7AM08Ypel6TuciQPBzNuccLXsXrbiLRATcI+KqgRaRD5dI5BH54sahXws5/KVvFwKbF/EeHprdzMdn6Exd1/PxqCrnHKHQlgl+69adS5cvX3/hRRR4enoa+vcW04l3bmdr88YLL4/OTj/+8MPZbJbtXh7NxnXbNK2N8khAnnIpk7hsau89OYhkjMB1a51zSqnNjZ26rKbzCSLm/Q55p5uGcx5wDuccGUrGAQi8c0vhMgAmhEDn26YFYlIIqaJQJtPtdsvpVErZaH337t3d3d26rrNMeqKiKJA1Wzvbg8GgaZo8z6WUnMskSSaj8Ww2IyKpVDkvIqmAw3g0stYMt+JEihsv3/j6N75x/8G9g+Oj0WT8jW98Y9DrHJwcXbl5o9Pt/eS99wW6K1evVW0rxvO5dtPTqQfWtBqIkiyNs1SDTaNuNzmazcamrdMkjqUQnPZ297782iu721uvvnzz6uVLB0+e/vjHP87zfDKebW3ufO2dt+/cufPee+/t7++//pUvG2dPz89G43Ha7Z2dnVV1vXfp8rXNLaFi49zjJwcixrqux+PxZDKZjGfBt4miCHFeVRU4L2UUVnulVJqmKo6bqiWC+WQWRcmDBw84skuXLummYozVdXl8ejTodV//yuuvvvzSSy+9NCtMr5cTVp6qOI63t3Ymk5G1WhwdHS1XW4qS5MqVK2+99dZLL796cnJWFNVoMqnrZjabCaEODw8Pj47ORvM8z7231pg0TdP0ivNmNpt9/Nmtl1568eWXvrSxMXz8+JGz2lp7dnYWcdXLNsIqGZq2hfr+kEqBJYfLWiuSqJdtnJ/qiS/KokFwIkuTJEJw3pmqbONESSmDwxYplWcRIiZZOp2O27aNVKIQOJNATMl4MpshcgSGyBG4lHxzcyvLsq+9/c5wOEyj7PT4rC5KKWUxm8+mRZ7nKouTNGWMRWmS5bkjP5/Ps6yLUhhnQ2OuDByXMooiY1vGWKKiJ/5xq+vWmbJt27ZlggsmvfdN01ZVzZlUnSzPOsfHp2RRcMe54CictW3TaK25SJVSsYqUip0rg9qIA2AcOQLjwAVGKBBRckbeRLHQhjdNU1WF1hVjLE6UEIlzLpQvWqcD2TusmEopEEAEdd0EYqAQqtsV3vu2rYmo2+2iJwDY2tra27s0PjsGtM47IaErExkp713b2iyPiZz3HCBCgYHPEUURcDsej4+P/XTWWmuC8QkeMpH3C7jAvbdSEudcJTlwYCiEiBlKzqI4TrM0DyWgwTI5bQGAiLwD662/qHRwK0wQ4OYXWEoAWK77ztGSCElL6ACr4yyAAtCFGHbozcpYMCorp5vW2gk+Z1BXsGAVMIDnrQ6Gwy5kqRhbNP57niKw9KSdxzVWhIclL1KK1ZFhvYTS/0VAYRU2uAiVrzzbL6prWPmpq0v2a0kQD6ENxAWiAmO0tyFHOxmPb3322cP7D4qisK1WSnGORGBp0UIbANiyYI4olM89c7/Wbx9bCvKsxrkMgKxN2QJKISIOBgNPWNf1wcHBvGyM80mab2xs1HXtvADnw01WkjPGpBSrGX4O861/sj42ejaQvtpoMarQXAuIkMiHiolQDgoQ4IKDZw/7l7StowQiCmKOCOzVV157dPduMRlz7pVS2jRFYTtZEsdpUZbv/vS9Vuvvfe97xpsPPnx/Oh1X1awoJ7PJdGuz98L1S71u4mwVx/G8cty287IoWy2SKBJ8XJfaWSDw6BiXXAgAZq32HrX23tZJEm/2dwk9cqjrkjGVpllblYBMCGCAHAjIEIEDxzExxiDyOI4FA2c8Ik/jhBGURSE4725u1vO5QFZXxce3Pvtbv/69Xq9HCFXTOPChMjaKIm0cIoa3P+gNRFGUpundJ0+uXr1aF+XdW7fR2Ss7e8NeN1HRf/q/+V9funH1t/7fv3U6Hc+ralQUKk9b5yz5Sy9cvf3JR508vvbijbPZZFQ1xJn1TnI01iCxRPJ53RSTqdwa6tnxZp5mO1tEpLVOomRvZ7OTpa+//npdlI+ePLXW33/wcGMwaJpGiGg6L1QcnZ6NAo36ypUrly9dLcv63r17UZq++eJLg61t5GJSVMiEipJb9x4KIZqm0a2ds5IhcsF6vd7+7u7HH398fn7OUMWRBHKcc/TGOZXFaSftnNfnmxvDk5MTRAz9Wvu9bhyLui6EpCvRbn/YiTMOshMl0hEBg0a3Rd2Mp3MAEEGwjIja1nii+Xx+eHgoVRyAyXQ6ffr04Pz8vNvta62n02kULTomI2NJmkvB6ro0xpydjpV8Gsdpmve3NrUxpm7KybQAw5wLUvncWrBWSykHg15RFM5VzjnOJWJIogNjUoqUMWkNGG0U6ljGSgpkXEkWx4t2DFLKvNvt9/tJkpR1UVdtXbdSxsiBCL2HKEqwKIHQEwiuOJdSql53I01T72E2K6bTeV21VdXkucjzbprm8/m8bY1xhfe+4yjNOojcOQLkUsXgHSEQB8aFkBIE6+QDjizP07KpT4+OR5NZpRrOeRx758Baz0gIlFXZODPqpr1IRA4pklESxaEAMpYqEpKcBR/IjLYoiroqnPOcc86lVEJwEUkBEpAzKblzLk0iIMeZt9bqtjXGlAUWUTTYCL0nwFk2B5SchcDA+dkIAdrGFEVlrVMqytM0VJnPJtMgYTns9wJf8uHD+xHzbb3ox62SOLKRMW1RlZ1Ox3vryDPGFCkvwBk0YEszL6vC+ZZzQMa8163W1to8zwCAMfQelnI1rfcy7vQlV1JEgkeIUoq0k/TSpMeYJEJrrdbGm4vOjYEu4J5txEBL8iCurd2L1ANeOM3erRINq44MzwAF74AJHgIkwTitsgwr3MD5hZbzyph93sysf7i+Z5C4DoGZhbICPBNvXx5hcSi2jG3Aov7hmeDBKqJwcS56Vm/gwvAvmi1dzEaASwzX0RV+juUAS5QQMBlfNgIGBAwaToAEC/2PsG81n08mk1uffHLv9u16XoBzUggpBIZyj9DHhBZH/jwmWP2wGsn6nV0fWBjxs/O2+GEymcRJlua9vNPLOn3O+XQ6tdZu7mzGTjECxIivdSRZklTCvXiGCPKFW2CXBOYyZxdKjmHgIaiAnhjzSITAQ8AEiS0gArEFxPlLL33wsGzjsag5AI6MXn3ty08e3DdNOTk7DkpUXGAUSYNCStnq+uTk5ODwiUc6Pz9tmuro+KCbZa+9/sq3vv3O1av7SSzyVDDG6sK/dO2qAX98fl61TQvw4PGT8+mMnCMmuBDOo3FGcOXAzWeFLqpLly5lnawx2hgDnkvknITgERAReViQjkKDddJNG6aanJdSbfYHDAVDlIxTa9I42R5unJ0cW2080L0H96fT6RtvvPEnf/anzjkRya2trTiOq6pKs07btlJKAFcURRzHGxsbk8nk6rX9JBLTcXX50k4aq3u370eK/R/+9/+7azeu3757+/1PPrLOyix9fHw0ravBYPDg8ZOvv/XmzVe/BLZ1BHGaEzBgQsRJp9tvWmuNcdaenp9Nz042NzdevjbsdDpNow+Ojvu93ne/99233v465/JP/uRPHj9+vDXcvHz5cpb3s86AYNq05kc//cml3T2tm5dffvkP/+j7N2/e3NrZPj47PT45ff2Nr7z2lS8fn57fe/T4+Oh0uLu9s3fp0dF5lKTe2LDOJGnqvRcMX3nl5ft379ZFwYiUjGLOnXPzyVimmMZJoOfO5/NepxtF0WwyMkYb20SK5Xly5ere/pWdKJHj6Xg8L6yr62bCRFtWo48+uzWv25deekkEz0wIISXMy/Lu3bv37t1jXO7tXVIqZkLM50VYo2ezmdZ6sLnlvNXOci4QsdXWOK/ihAv19ODYODfo9cuyYIz1er0Xrr9qH5yYxjVlEcexZJHWWtdW8ZiDJIu6sWSRMeZ0cCUpTXrDDUuWVeU8FixSUnD0TudZqpRiHLz3gstI5WnSy7Ls5Oy0KCrd+iSOkIOz1DStUpSlXa11VTXOUdu0UkK3G2vtP/rwk9AUe3//cl2UTdOQ93Esm0Zb65uyNsYglxvWS6UEV855ISQQt97ahdFrXOW9A4bU6/V2d/a98Va3iLi5uVkXo6Zs67odDAb7+1eno8n5+fl5fd7Ne0geQzPS1tZF6ZxTKiZiRjvvyrqui6JorZFSchYzBrEUSsk4icI6xRhrWzudTohIKSmlQIS6KYppYYyZznrdbh60H0LrXgDW7XaJOEMWRQvaP+cciUJVZ+BIxnGsuJjP50U50Vrv9HpBnYYJnjuD3mlnjW6KubfOWbcgiHAhgo1pqXTOee+QEefImHDeEPlAsVzQUv3K5kpvJRdxHHWlUIwpKZIoSjmXzhIu1Se9WbTZ9Ms2Pyuy54qmsLLuzy3xluzKI1+rioSl+ttCIXHR84kYXuguPFt2CLAKA8CSSxyYEGGfFfkt/LqekqBlZgQAwufMuVX8LHRK5px/3sVERLFsH7pIEyypds/Y0We1mJ45xMWvC4rlKoGy/MoXxGBwrbZihRLCbKtoSd5EdOSXDjxap0l7ItJtfXh4+Mknn9y+ffvs9JR74KF4zoP3Dj0xWrITPjdafJYzuL7POlygNe7kekhhPaIQ9uScx3Hc6/X6g0GW51EUxXEcxyqO4yhSfNm0nRqXKMWQnEPiuCRmfAE4Wz0VjCEuu2CvTocLgLAkLVIQshQEFhER+dJsM8BVm62/bKTgAQkIl486BIVZQH79+ovnx4fT85O6rq21CNC05aScqVjt7m4Buh/96AfEyDpNRINB/8Xr17721psvXLvy0fsfPHn8cG97Zzqdes2uXX9hY7iFn3369Pg4UqrbyUazqYok4wKEKMvaaNvZyInw/OzMtfbo6dMkSQabw0G/X9RVUc0tJyUS5wKJWIN3HBmXTHI+LZper6e4sK1ORLQ9GDLgk8mkm+a6amKpQg25B/IMx/PZD37wg1/5lV/58OOPpvN5qDBP07TWrZTSGLO5ucmYePjw4cbGxt7e3p07d4wvkySJOI+6sQD21S+/+iu/+EvvvPO13/rP/1EURVs7e0+ePNnZ3tnYHNZ1fXR23tb1yaWT17708sGj+5999lmadfb2LjmeFOZhHCfW1Va7qmp8i1JE165dr8dPrly59sKNm92Nza3t3c3d/c9u3ftvfue3f/KTdxlj3/rWt7YuXdm6fFkJkfW7w8EG4+7g4GA6Gyd5J4mzn/70p9/89rcns7n33jo6Pxv/+KfvPj48nBfVaDZ3S6+gtSYSEgCSJJmNJ2dnJ5vDQSdP00gJBFOXAJAliWRU6cZLTt7s7+189NFHvV4vzWIh+HBzezodl1Wzu7t19foLG5ub49n06Ojo01tjberj0wee6t39Xn+QvfTyy2+99bWFOFJIC0VRJIT03nvCx48f53l3uLWFiEmSxHHsve/1elknL8sSmY6iSMaJaxopom6nZ611zsxntdE0nY7bptne3t7f34+Vmk6ns9ms1+ttDYfdPK/r2rStEIKc003TVBVjbOXBCEmRyrc2eZMVZDR4bXRjtNPVVKqFcYqiyHrhHS9TfXJ8XpZVFEXdbh85q+uSPDiLTdsa7Yz2cZxBxJSKt7f2mqY5PDwxxsQqypLUKT+dFuS8FDFnCgERHWPgHbaNBRScq2I2j+NYKImEErhU0iNYa2fjCRENuxtKcsF43ZjKkOnaXm84OZ89Pn5azqpXX+1c2r+SRGkxrziX3jS21Q2ht65tGiKSQoTafeecD72bGY+E5IIBOSlYnKgk4t77ULVljAcyfukQA/k0jgRDa61SMkvSTpYHk1aX1VzOvHUbwx3vTNPotjUAwDmBt8aYqqq8dSGf64wRkg0GAylFPZ4Z44wxEoAceA+MQDHV1Np5Q0RcCBScLa249jqsR4H6xxgE9Y/pdMqQIeecSeRccBVFsZTSQRRHnSTuKBkLEUmRSCaBuLWe0AWgsBDSAHDeaPPFqYd1buMqB0FExpsLAjsuOkASQej6zZbivqsdAt8x2HW+VGuGtZ4IyyPQ6rzr4YSVDVuPIqxs3mpPWm8viTyM+ZlgwJpFfMaZhgUoCWwAWHIP4ecVCFyEClZEDQ9f5K8/F1RYTSA9Sx3Vy57j4btsiSrILfaZTqePHjy8c+v26clJ0OIhIr98niGEMACdDwBpMQC/NPfs2eDKKn6w7tyvf+IvkieLP4VtY2PDOmqaZjQaeeAyivNOLzyKsGbavfeWvCeIhAga3uHWe8Sg0YzocSmnDWuRKgqqwov5odU4mVz2LFhcDXmwiAi0alLKcQEXLsIhf5kbrRVcBN4nAkgA2N+7fPPmS2fHjw8Pu7rOra28t1xabdtEJoxT3WgZR4zTZDJ59dVXr1y5tLm5OR5Pv//9Pz58evCtX3jn9PS0LExva6s73DqbTG4/uBdl+Ww+b9s2Hwysc4wBYx7JRBKTJJn308IaIfDS/u5XvvoGl9F7H7w/nU7zYa9tGwyiYKECUvAkSZSS9djGSjHgrtURF4NujyxNz0e6qr020+k0z1MA4Ermva619v333/+N3/iNN954o9H68dGBtTaKorSTOw9BbTY8up1O59q1a4eHh2197L2PVXJyeGQI/qO/9/ev7F/5P/+f/o9PHz0ZDAY3X3z5+Pi40+lFKtHGJakadFKrHRg/Hc/u3bn/zje+cfPGi/3h7sHReDSZHp+MTKvr+Wx70LuyvfnC5avf/dr/CpjY3Nkjrj65c++n/+rffnLn/md370+adtAfVp4mTZ1vDk3bRErkm4OXr18VSpbz4cnJyQsv3nx88PTFF1/6ybs/qxo9Gk2YSo5Pz5wlJlRR1c45HsXBTeqkGSJ2u93jg6dNXXNkw37v+gtXTdM+fPjQaJ1GXDIQ3OSpuLQ3fOutr0USHjx4VMzGWZZ573d2dra2tvb2t7VxP/jhT46Ojk7Pju89LJJUjCdHKvLXb/7yr3z3u1evXs7zXLz44otah87ORIhCyJBGraoGkXc6naoKbREirXW/36+1XhS1Ox8K07Tz86oG55Mkdh6KompbN5vXrT6yDpGJJInLshiPR3me7e7uJknctu1kMq7rejabhghhSKiH+yqlZMgQBaBHBpx5z8hbTZ4Fx4eh9A7Lsq4r4xwpGXfybp53jDMhQCKl9MAiBZ1Of2//shBKimhra/v09PT0o08fP35azOcM0DQtAOxsb/d6AyKMojjNOgBADOfzsqpbIiLdRlwBA3AOORNMcM414Kwx3rrZdArOj09Gs8nUtPX49OzmSy8kSSqEfPTwSRKlb3zlzf29y3WnHo/HdVGbVkcySpKEMeG9D5mUwCQIbm4wJs46AkCGSnDJmSYXGFQMfKebBd8aAMKkeQfhqrMsi6IoVGwCwEKMAQR5vwgSMAjxA8ZYFEWCYdCCbOvKe8c5E0JEQqECyQRXUghFDrxDAKa4ssQsWCWiNM6UUoEAQDbYIUdERjshQztoznkFILwT3gGiRwUIUookjXtZkidJxrmQIlEqZp4b47wHgEXYAJz3ZInIGKOdX9mtdTLjqjUDLNMEy9jBReOZlSWmtbj3uuH0AMjZylrwtYYOYYbDWVb749q2+jCwFr6QJ4iIocw6VD+uXPOAjAnXncvFV9yyMdUiss2eD1EgIrKLs/8FQAGeZS+ujw0+x1F4ZlqW9EnOuUcXVHSAyJP3AJwQgJH3RL4si6ODp0+fPp7NJkhOMA4eANCRD/MGDEMCIjjqF1jh34HMv8IK+D9kXxFxPB4nad7t97q9QZp3iGg2m7Vtezm5bAzTWiNCqBZjnAeguIIOYUzeo3NOKUT2TMxgmZBafbzgYS5u0+LncAyHiEAMEViQEkAE8OBZqMUEor98UqMHQAJHtCy2WMKGpD+4efNmOTu1trgj/dnpEXjtnasaXdV1Vw0GGwOP0DRNt5uHMMz5+bipaueors3R4ejg4Fh1e5YLTBIvxKzWzM+190k3ZwLLskxZmqWRNY13TbczuPni1WlytrE53NrZVRLPR2fT8cS2xrTW21AzI4RgAiGO406eJklUZw0ikqc4jvvdXr/TNa3tJlnTNOhpMhqnaaydBURg6BHatv3kk0/efvvts9Gotrpt28lkIuOobrQxZjKZMCbqup5MJsaYt9566w9+7x/fvfO0k8pvf+tb3/7mt69fvX739r16PpOcl/MCAbpZFxFPT88RcW/vkrI6i+LjoyPbGLTeNmYw3M7y4c0bJz9+98NiPGeIYCmVcS/vCRQc1Kys7OHZ4en5P/vX//bOw6ed4dbl6y+3LEqy9OB8/LNPPpNJbGwzmY7GTbnV71y9eq1p6qPj0xdeuHrt+gvn49G8LD3gaDyOOp0kSTr9wWgym8zmvcGwqpvQT5VJIZB1u3m32+31euOzUwTY39nmjDmri9k0luLs7Cze6G3v9vJO1Ounv/q97/zzf/Yvnjw5CPUgr7766s7OnnHuZ+9/cnDwpG4qRCwq0g6sp8t7+6986bVr11/MOylDIdq2ZYzleS5lBIxZ65qmabVNksR7iKIIkSmlpIzqugYAxljA6YyxYKiscU3TcM4TYOPxtCiKLEnjKGWMWeOTjG1ubgP4zz777M6dmsj1ej1jjJQcMW4aNR7bpqk4xySJhBC93oYQArx3thFAaSwFJ/JW1zUXi6WNMYacew9a6zCYOI7Jo25NqK1QSnGpAIBzORwOibBtTF3Xx8end+7cmU6ncRRtbAwZQSiHOzw8vH79eohYMsamxXw6nznvOeeuYkkUM8G11ta0DBA5a5qGtCXvm3ldzmfj85Fumul4cnRwPBqdvf322/t7l0+Pz0bnk7Is+/0+AJycnBwdnbR1s7Ex3NjYAI/WWqsNY0wwLqIoqGxqrcuqKqt5ABOL5cwTLbRjiQOkWR46YSZJYow5Pz8/Pz8PfqvV2lsb1lpvbaP1bP4kT7MsTzudTvAMyTpjzGg0iqSIokgqgURpmjpniChNc6Ws955zBM5C8MJZn3c7bdtq3QAwaz2AtVZrrUkGPw+0Nlo3RD6QiQSPAcA5b4wjj85ywa0QvtPPlYoRGdCCZrV008WFR+scEjnnjDHGLXpr+WerG1Y8g7B2hzAAESF7XqEofGO1Q0AAS1DBkixdCEhwHtiUuCx5WJ0R1jzLAEourP7FKb6gld86pPBLHTpcNWh+Rgl/8bPzCxLlwolHoLVwxeLSPtdM8vMbXqQnLpDBysjBGppZmJeLpprP8jA4rHIfsAxyMMbaVgNAOS8ODw9PTk6s1gDQtm0mBBGBAwJPCAzQhrKRn1POtz6M9Sl97oe1uX0mArH6SmDXrpTOQ4n/xsZGnMVShVgXW93ZlSrGBVYg8h4YY1Kq1Tysh444F0iLOeH4fBQEAoVxERPyS6VsTxR4p35JU/griCgEOcTlVC0IMOBawxX2eoMrV65MJkej0yeT8YkzOC9GaZ4RcS69de3J+ZkQ8qtvvPX221/P4uxnP3338OnR6HzaNrpp2iztnpT1+bza0dYgb5zRRQMMZaSIUVUXKhL9Tr+sps7UaSz2di75re04jh8+evL7v//74wnJBIVS9+7d29u7hIiIkjOIJE+SJE2zJEmSZOStI+uzvNPv9/M0s9xuDAZt2yLi+eg0SOlrY8q6qOt6v5f/4Ac/+Po33tnc3Nwc/f+Y+69mSbIsPRRbW7n20CeOFikqM6uyVFZVd3UPBiMwwFyQuAYDScMT+RNofOAzafwzfKBdGs1gJEZAzEz3dM/0tKruqspSqU4efUIL11vyYUdERmZWNwa4ELOtLCtOHD/u27dH7LXWt771rc5gOJ6dzSspuFBxHKdp6nmB7/vPnz/3PO+tt94Sef57v/PAc/zvfvDgn/3hH/7yZ7/48z/5t0gBL8tWs40xDjzfSGOUNpjMp8lweH3z4OB6PCYYalF9NpnWm50oCj96/8Hl1XAwmPiOqwXf7m7Wo1iW1SefPM3ykvjB1Wh6enqpNAbijOcpYp4bRnmZn11fHuxvz/K017s2oA7b7Y12ezAYuK7juu7B/tGPf/xjKWW73Z5Mp/riouKy3ooHk3lvMKiE8oMQI7L6MjqOE4Zhs15TSnme02lu7Wxv3jw6zNN0Mhn/+te/Bp82G+FgcPG3P/nr3/n+78a1yBiV5+kHH3xQbzZnSXZ8/PT09JRzbtUHNrcPB4MroXSj2fSCsD8cSa1uHt6mDmWEkCAIwjA2CNIk00IabABhxigFVEmlQER+FAdhOp0Fra7neQ6jk8lkNp00m816ozYcDhljQHAQR1lZjOZT13UppdOzE5ePb95+48b+oYNvFkIgbAbj0e037jLGLq/O722/xUWp+0WVjdsxu31j34+coijA0Gb9oNlsUuqUZcWLUggBYLQSUnKEDEbAOc/zNL1Ia0Etmc8YNkrS+aRk7bBQouQVABBCvpg9lFLbxuGu6zZqATLigwcfdTrdVqvje8GPf/y3l5fXR7feunPnTr1eHw77V1dXCGiSJAhBrhEREklVVRUXZVHkSBsuSkIINfj69NxoiGg0EUqWSCt29vi07tZu3rz50TvfHQwGX336VbPZrNcaRVI6mAmQ4+FEVLLVanluoLWmzOMcpBQIg9bIaMKIF/nY1vEjBSANQ7QqK0RQI4hneOo4xPUoZaiqytlsNhqN5vOUMSb4ok/Ekg6Jjaa1kDBq5uOBlDKOw9D3hRDG6JBRKWWlOAiHUoqNAUAIY7fBLHfBxhZZkVFK43YNIQQaSQmgFVLSYKQwNowpxTHGCBhGGgHTRkipAPgyQKcOYwBgqzAYY76zSZFNRxKMsODGKGXhZCGErcswUlkvwUIWhBAwRglhtSDtLk8xwoAVGK21Esq2XkIIYYOQ1ga0weiFXDEsInXbf3KxjWKEEBLCtjQ0Whsh7OaurDjYCzOwEJpdZL5ecU0WANuSM2FT+yvzxitpDDJoIUGIMcZkYbQ0rIgOFGxpPiCtXhyJEFp2isCWt2HWcgT2jkSpLVMSbAnfCgl4TbPZgtKB65u1PIjR2tjbtKkWWMgQLcyMMRXnvu9jTJQUyBhGqda6yHIuSs55r391fnEynY0MNhShsqwKZOF3rbGxXgXCyArJWbO8WMPVBMDCP/aiaMUrhJeVBJYHALZCWAghoMggpCnGlFBHcqIVkwqVXBlSMF5pYqjPlBZE256ci6pXpRRwYFghIBgjbAESWCQgJBOANYABIAAGL+iPixIGs+hPsfIfkBZrKScECBHrwKhlHagtlkAAtkLCdoh48VxehVbw2k3/lwxjHADAWAMo66kAJsgAcRgYUNq7cee98Xj0w/w/UIcQh27EB0aZspDGeOlc8wxv7m/fuPHGzZtHw/HoZHj51fGTRKiLAi6/uuhu7BZI/PrkUgfNx0+vatHmbDZJ5nPUYEVVNjY3vdjlSOPAmeXJ2fkzhPbTuRn0hw8/f16rBYEvETAkqCjkoBjFcWyMcT0mUCV9VXfqQkomSZYXPqX7G807+9123U/nU1OaVmfvF78c4o1WIVRn4+B6nETe9qy8dp2w0755fp4haGYT0r8sGHXnaYFAk0rORvnm7e7orFfkxX7UKpub/6f/w/+x1ek0Go0gCn/18OH/50/+5OHx44ODg9pWu5IybsWbVSuZzagoIj9Qk0FcR73hsTGmPxqWvGoebNKYfvPkV3EY/f7HR3f33VGvL8qqFnkbG5GU/Vvv3pvNZs9OT56dfTVNLonvVyWquAgYzWeFlHrGy7/84lE9qu3tHX322cOfOY/H/R+9cbTTjNybey0+750++Yy6waSovLjp12o4UEILpIv37h2NJ8M6c6t5PyC6SAdxvVaU0xs3tpPRaHz9/I+//6ERVRi5v/Pgpsbq9OqM+LPRxYxVRdMJBs97f37x70fDOSrZ977/j/YPd9Ni/jc/+fHz5887m1ueF0ymSavVyqdjkaf1Jnvz7v7mZnB+9XA4pTcP69TuGjY8tEIujDGMaV5yqyVshRbsHk0pxUYrXilegZJGI1EWCCGPUS1FmaVFUcwnY845hCG4rhQi9n3bJfLOnTtcqsF4omeJ7zkAEAVhmae721t5Mh0mSVmWGxsbGolmo+04DsbUZR6lVEpVKDUcDl3XQaCrqiAE+YGnQUmtfN+1ve2LIsvydDabMIZc1y25xT8ookQrEEIhhDgvjTFRFG1vbx8e3mi1OhiR7e3tqhL1er3b7Xa7XUrxcDicTqeT6djzvCxP8izB2MaCRghR5mme557nEYSFUAiwS10AbXlvVUHG47Hrur4faq2TJEmSxPeGVlYWIWLbOuR5LrjCGDsa2RiI0EXPYkIIgGNLUZb1IIYQQikmhGxtbQmhbP8qwZWUkjHWarUAgGBmoyKltN0QBVdaK9shWmutlLHsNmOQ77plWdr2POtBc1EUSilECV3JEZJFihphbA0SZtRgZLPUBDNA2hhAiDDG6JIPrmwqCyHHdV3XD4IwiiLX8VcJb4ClpIGUC6qgWIg0gHqhmmBbA5i1zt3WBFqO4XoMutx/l8XuyqrlIADQgKwhl8qsEhaAEUJECWJTP6v6zKIo1jMRK+tibbPjeCt8Hi0LHFZwwvoLWLoRSymB5QnxCvd+gTeAWbIiXj4DWnIPF+xLG/ojgCVKbyheORArH0JKuR6jr79eYzWuTItZ8ypeZQZ4nieEUItiVKiqCgNyXbcos9lk2u/30zRF2uBl/YVatmNe0RrMWo/m1X29cpW//3hB+7CdI4yyz7dRj+2N131/e3ens7Ud12tKKSttvvqrFUawBp8ghBBeSmivFt+uiVJGIcsKXB6KzGpdAYDi/34CCX+/sd5dwg4DgIwChIEwBsi0250bN28DqhymkStHg5Hy3KrUpVaHezsH+3sBY1ky+1/+l//X+dV1s9ms5Nz3/YrL0WR4eLSVTabH3zxyMDo+OSt5QRjWQtTqQcbz6SRnjBKKarWaG/jamCiMf3b8C9+3TrkoC+77vkPdsiytxEjgOVzk29tbgesVRTHoXbZajTu3jo4O932XCllUVTGdjjUCpUVVVlkpVV5RTAwiroMNRllZlFU1HA4V6DiOKKUGZJ6nvkvC3U46G25vtv7w9/7xx9/9KI6jq8snf/e3PwKC//if/09pkgBSjVpcZPkbt273rwcXpyfD/qhMs1ajFUURpVTD3O7JnudNZtOvv/56OB6dnp7eu3O3Xq/fvXtXHd1A2hCEsyybjMfxdNrtdIwxlDqTycyJ4yTPsQbsMOawlBceYbubW0VRGKU/evD+rz77+e7mBkL05s3bUuo0zR+8/+Flb4jzwotbvOJKqI3tblmvXZyeRKE3zZJGswlaDibTSst6q9mo1bZ3d27fvh1FYey3qzLVQgY1P/aC73/nu0/rx0XOm60d17367LPHrhu89/5bYeRowz/91S/SZL5/sCe4roxp1ht5mgkhKCbI4PFomqZZ4EZ5Mf/l57+m7XZ7GaVRoeQq6et5HufScRxA2G6jFuhgrrsKXDjnk8kELXltxpgkSabTqc2XW8qY65PJLBmMxnfu3QvDiAs1n86S2aTZrO9tbZydne3tbite+IxgjKXi0zTpNClCJE0TIYTDXMH5bDbzfd93XW2k1AKDJdg7rsc2uk2tNSBVVYWcl1KVZZUTClxUi11b2HwKtzHNcDhPkuTHf/PXP//5zxEiCOgXX3wxHI6llEmSvPPOfcaY77uE4izLkiRxfYeXFYCO4iAKIyl5MpsMh/0gCKxeAmMu9mEV6bZaLaVUnueNRqter8/n8zRNwdhezI6N+C3LxnVd13WVRo7j+L7PnAW73hgDsJBttopvS5IdIoRIKRFaGGxb/mfDQiEEGGGVAyyzvSzLPCsJUbYJpI3JtYgRQhUvGrU651xKgRf7prIXklJjjD3KCGHMMY6r7IWQVVOloBEQYmv6tbb9jaTWWhswCBEwi75ydoMyGBHCXNfzvdBzA8fxLJCwslhKqZWjoKVa9BVc8hKUUlrxFyUAxphlHYRedm9aGR67cXOzgJetf7M0lBisDVuzWItN9GWy28pvXrhES9R94XysyT3Zv1q9s37Y6szLnw1GC/1my1dYXu4lUH3pGbxkSs2Sb7HiUizj9MWwDuW6q2fXbfUjfuGXAAAoJZZ+gz29WuU11nwX+69BCDFCqqKQxgRBgIwuK24XJ50nl5eXp6enyXRmv2irB7p+xRV0sV6o+YqvAN/moPwnx+K5IkwIWSwupRaJtY0eKKVCiDgKVjoZttaVYPTKw7JPgyz6W2or+7BkniIJtjsoWmItev3BUecflqOAEIJFcSYCMICMhS00ADEArgNSdLpbb771TpKOfJ988M7G118/mU6SJ49PGMP3797sbm+16mHv6urJ48c5F1terdPpECd++vSiEiIZDrTnC9d9/803k971aKobG616tzkp5lxhW9dsn78yOs/z73708V/+4K8CNwCgjuOURaWEpI6rtQatCWNGaS2V57ie607GQ4aF76BGI6jXfNcjnuNWBS3KTE8hivxSKlRW89mg3trMecrz+dPJtUGQldnx6XG/f805j+IgCug/+6f//HB35/337jsYsnTqUTzoP3/05TDncwNVt7sTR94PfvCXqsrfe/vN0XCSzaayLDSvbuzvPfr68Ww2BaVv3Lhx/537juNUVdXZ3Nra2TXG1BuNRr11eXHhOF7ghQ7zHEpd5hiDpuPZk0ffxGHgUXr/7p0vP3/Y3dn9+snTnEvmeCUXoyRpR/Wtvd3T09NsNtu7e/f//n/7fwyvL37xkx/95G9/3m1GHz549zvf+/ibJ09/+JOfbu0eVEoppQ7299o+e/bwq71mfD1PY4Kw4ziBI5C6uDp3CP7g3pt+4A4GA9SsVXnmOaRWDxkmb75xe29n87OHX3muNxwyoeZHO3tvv3tvOp3+6K//g9Ti+x8/uPnGnck4ubwaXl32nz456bY7jotKNetd9SfD2f337ijV5pxTzrleyNpTLkWxAPkxps6KZ26hhaIoOOchoZxzwTkCbbTMiwoWvYajqqowMg4jnufV4jAMQ6WUNGI2n4nHTxChe3t7BANG5uTZY7GzvbO1NR5cZ1Ma+t7W1pZRon91Pa+qNM2NRmmaci4YJnbvu3F0mJWFVCUoqZDJCuW6LK5Hkc+UUmFM5/OpgdLgijmYOcYFZLuOKoOU5mWVFXmllPLdaDaW5yenZcnB4FarE/p+fHD4yc9/dn7y/Ad/0YriwHWdLMvKLGWMzee55EIqro3sdNrb25vIqNFoUBQFIwIA2+Q6wlbG1SitOefT6TQIok6nEwSBMaYsKqVUURQIEQCo1Wqu62JElVIOecHiXCoOSSnVfD6nlHq+YykXAKCUUErNZzPfD636BcESAISQnHOzSHlbj8S1Vt9olOdTvVDeBK3BFtWMx2MlFgi5yxyr+bjYzRFG2hCpmIMcx9XalLwqqioIAg1IGQADyvaSRxgTShnCmColEDIIG6VUUeRlKYIgIIRR6gIgJY1SxrI218PllRXRWnPOzRJIAPUiTLdoluUQ2E/COo1xZS/xqm5tiecjgmGp46mMBVpeEB2sjbHDPhrLs1kUcTJmAYZVWAwvOw3rJEG9rLyANYcDVsQFjPFawwgbkJplQd5qczcrduHSM1icffl/vQR+rH1bHWC7g5plxgEtaZWr9Ae8XE2wupc1u/Ltltv+SlScILwQT0AIY1wV5Wwyve5dXZyeDa57ZVkySm09JXxbN+pXDP/qt8v3X+1n8duH3axsCgdjzAizhCRjjO/7zWYzCALbMzeMI8/zbAoPvxgIvVxRaZ8mwouJCSEMXpSlYNumF2lsKdSrFTN/X2/mf8BY1JAucAUD1knAhAEoAASgkR839o5uffX4S4pllQ232mG3UfMwrdc3Ops7nz/88osvHrY2N969f//x6ZnW8t79O0KzuLmBsMOyYS0MYt/pNmrf+fD9r776QlOseDUa9iVDjsMQQVxxUWliwKFsb3/n/fff+/TTz5CmGGPmQFUIUEngBc16QyqOjW41w1rgp9PJbDTc3mwiJEFWnWZtb28v9Nwvv5RZlgql2p0toQ0XYjKTgYuzNFc8q8eR41DQUlTF7vbmjRuH9968u7nRmYx6nksffvqzyHOePf2GGJkmcyn5OE8+/vjju2/cNIr/5Ec/KIrqvffecylgJVyCQs/98IN30+nk7OxsMMyPbuzbJmdJkrS7G5Zd57puu92+urzM8xy0MVwapTAg29Vpp7uBQY961xqgypLYdfc3N7lU01kqy6oR+I048DCAFGXBeZ5JrqqCv/POe8++efidj97/7nc+HE8nv/7sCynBc8Oj3R2ETOCxmoObISnTJGzGpeFVKbwoNMZc9nrNeu3mG7cjTDJeJUkS+04tDkErK2MCVDZbEcHu937nwUff/ch1ouPj468f/UqI2b/63//v7t27l2bV3vbO/s7eV/5Tn3qXl5fIpboSw+ve5en5m/duNZqtrCyoBQA8zwtDN/Y93wuklFqD1EAIJ4TwLAcAxlwbaV1fX9vQ3H4DLSLqOE6tVrM0e4SQLWa1sU6WccrceZJZ3ajNjU4ceslk9PTRl8moP+pdGWNu3bqVp3PG2Hg89pvtJM2FkARhhEhWVgDgO+zy+mo2mxgto8inDGstW43a9vaW6xEhVL0RYCK0qTs+FGVGCCGOwzlIoRUYQIRVUJZCSz4eVmVRGm2BUix4SYmDEPieoyQfDfvJnEVRpI3M8xxAp7wEo7IsGw4HtVp4eLR7eLg/nY4vLy8dxsBg12WOw5RShC5Syq7rGmNGo5ExptFoUEoBKowxY4wxd2XVBJdVVTWakZQyz3MuiI1iq6oqy3w8HtdqtSgOwjD0fV9rnWWJVevEGNvSBsEXNo9SmqYpGGzlCtBSOI8QEkd1KaVFdxyX1utNY8x0OieLnQO01sggY4BSxhiz5YJCCKGk53kOuFyKNM8dz9NaS62MMQQMogQRTDCrx7FSShuLdeuqKpRSnIuFyBB1CWbGEK2BYOY6vlBGL43EwlHQS8hav7AuK3tmlFSCG2MQRqANaAVaYTBaClhyAzEhBIF96TDP2gBltBDK9r6qhLQGTGl4kVagBGMKDluF1La6xxqTVc39yg+wfR+MeeHlvG4tVjbPrFEZMH6RwjDGnmBRHrmyWNZtAQD7uVw/s1la39WxBsHK49HoRciOlmS99WTEa5PUCK3QaQOgl//BCpWARb4DWbfDdV2tNS8rSrHnuDkh6Xx+evy81+sVWQ7IGGO0kFpKC9+bNfbluhv3G4CEl2CV9QX8VjuIXhv2/ZXGhu01pZSybSTtU1v3RRCyhOgVxUSjZSIDY6yNMPgFBELgRU9RvDjJoofyP1xf4aVhDGhbPGP7YClAxPE3Nne2tvdm8/Hl1Red9mZVVZTiza3uLEk/++yzWZbtzPYPbh71Z/Nao7O13VXgHt66M5kmOLl2Kbs8OXv67NHe3s7xsXMxvJrzXGIjwEiQtibUxZQxQik+vzj+3X/83U9+9anRQnBgFIwDtTi8+8ad2zdv9q6u5/PpZrfFHFqWeSPy2j4zxkSes7XRuX3jyLbHnc3mDWJxbQcj5GDEkHEwxC5TReFhjJTc3ug0Go1Ou51MxpPB9enJ09/9R9979PVXD957O/DcWtQIfOf89PnBwUGj0ciS9FoqXpXpTB8/eRwH4Vvf+ZgvbA1qNLwoumE02ujERZHZZjquyxgjSTIDbIIgaDbrlFLHoa7vJdNZ7+oqz3OHsVYtnE3GlMJ0Og89t391Ppsm/eEYO+5sMieul82mvavr8WTq+t5kOvrLf/9nvMzu3D7yXafT6f7608+lNoh5STZ8fn4VtjoImeFocHN/6869tx59+Xm82ak4z/KcOIJSqkFRSv3QQ1x2NzeL6Tiux1Kp8+Mn3Eg1HRkmwzA8O72+eaP1z//Vv7o6Pv31p78IPPL+g++HIfm7n/z1T3/6C4y8Wzfe0oZSApPRtV86iAoM/nQ8Pj89M2aHOi5dYaeMMT8IlLStcaTjOISwRai33Ci11rwq7LdIY0AIUYK01lJUs+m4LMsiT7VSYByjpVaglcgq2Wo1PKVEVfZ61z4jB3s7piqePH2cEHzn1o1ms9ne6PSuLsfDAUKovrlTFCUlThiGADCZTHhVSaMJY5RSpRVgpJQQoqqkp0BNZ+M8zynFZVUwBzdbsR6V2khKiN1gCQJCidae1pxWSMuVGcBFXmZZhqCsqqpWq+/t7XU6bQCQik8moySZlWXJAodgVpZFksyue5ej0UHgOq1WK89zgrEUlpqAGaPWc3Jo6HkeQshuXJRS3/cDPyzL0uolJElihbjrtWaz2QSE7CJzYaw5Xwn72JTESmhh5QEgZBUMuRQaISSEyPOyqipbR0AIMQaszGdZlnEUGAOu6zFGCSG1WoNSPJ1OPTeoeCGEbYJtMAbLiRPaKA1Kg+CKUQOYAqYIEYOwQRgAK6ONBqoRJgRjRKmLsdSaAhhtJEIEI4dgxisJhmKkACjBCAEFQABEa43MizI8pZT1F4QQGJDFrs0abUIbZXWgDRAApLQEZBijtn8dKEBrAskEiKoqu4Mro20ixkbYtmbHLMzoSojJ2A/z6gwroWWbSltRJSzYY4xha90OzRp2/fo7K0dhxUxbAgkrqvxLePvSCXhh/NAa0rByX5CVUl5qM6yyDCvjujrshYVbc1MQeuGHrYf+q7t4xUIThBmhXPGyLBkjgecZpdI0vbq4TOeJMYYiBEtNBbwUtFg5CqtAfuVdrV9xfayb899i915NaljajdIEs8lkIsEAJrVGPYoiq8xjH9zazYJe+XmApJT24dg2W4QQA1oD0kuhqtVUzdJ1emUa/+DGIueAYSFRantXaoOwNkAwEOYAgnpr49adt7/+6nOEI+L7k16vMmY0S54+PdPIOTjc6o372TePJ/Pp0c07/f51VukHDz5+fvLs8ukXNw4PWezM8xlx92jIQhnubR45tbA3HV6O+nmeOwT7nkspVUJ8+vCX//pf/+tbtzfLQkxG8ziou9Tf2drf2ujubLV4OQPIo5AQZAgg2gxjrJrNZuQH5yenohBZUTx7/FxJ5LDAGIw1EZVkxCnTDLgMXXdvu/3Hv/ePP3j3HaLl8fHxk2++Ho76eZ7fuXNza2PL98NGozUeDT7/4mvPIc3O1u7+Ub3WYpSen557xIk2MRIyn8+Tcf/OnTuMMUa556r9O0dbW1u+73/+8OsoihCWSTouRmW/3+9ubUbxQRS7VVUZ4I7L/IC6HqbMbzWb82JOPLq9u+2FAWZ00B/FcRyGoRdEn3/1dZKX47GIGs133nvHYIQpUUVmVNG7OPnOhw/a7eaf/bs/ffOdd6VG2vXOhyP/4przkhfzg6PD3/n9P8x59dXwOojCMPAqwZVQrkNH48Gf/umfvH379rt37satmhsGk2R81rtqtpvEIfX6ZhBEx8e9JC1BoyRJfN/7gz/83YODvT/9s397fHxcFYJXidxLt7pH1+cXcehwkWsleKFOT576Aeai3N07WDQ4tumGvCzKohqPx/N5urm9G0U1C8AihHzfz7JsPp+7rgtLvM5+D62dU0rZMNf6HLYPvVIKYcql8ijpbG8bWQHSnsNazUYt8APPOdzf3dnZyUu+u7Ntm3aUlQBEEDFSG6M0xhRhoZSy4bWWpRBlxQtMARFIklmRXo3HY8aIlDyKg7geMQdLCY5HtSEGJEaEECM94nJiQPGyFFVZSkMI00o7jEZRwB3H99zQ94xSvZ5tjyuQUYHnEN8PA79Wi7MsIYRcXJw1ahFlOAg9LRdLJ4jFxrHrusK8iPKFEJPJhHPuMNcYUxRFmuaTyUQpZZEG3/ens9QaM6kE55wxZvtpBUFQq9VqtQghtEoPua6bq8xCBa7rOswWC8iqqlzXRbBo6Gx3McspyLJMa+37vjFQlhXn3HVjx/HyPFdKmUXfANtW0VjtSYyxRiC0KniFMSaMeoEP9ryUUouNIytEZ7K00FZQwShjtFRcKWNdTCk155ISz3U91/WNQXlWIspg2QB6kUSQC8kEK3KrlNLLtAjGWEtllGX5gVZKS4UQciiTRCyiaq2VNsgABoQBlaK070utFs2N0aL7MEIIE7biClgyo0MX5IsVBmNXb70RyXpM/Ip5WHcRXrG4a8Z7odGzwr7RkmK5HhPbM+BXhATQ6sWykA9g1QDCHoaXytPrb9p01bfME5TWL9nslUVfZgHMgpEPthiBCSG0kAwTZMx0Oj0/PTs5fp4kiRICL6dEELYJLMsuXLf6ZklcWN3m+qzMyzD+38f6LlbV2nujbbab0cXCWppCGIaMsRUY84J5irE2VgLcaLs1LJrFLsEP8uKhrNxZ+2HGC68LEFpLM/1D8xYWqQf7g179z4JIWhjGiJGIuMGNm28cnzzvTaVMCxzEb95+4/Ji9M3xedzcaG9uTrJslqRpko8nQ+IEXJrLy+eD3sWTi2cV8J3uphe5V5M+i9y2137wvY+8RnzRuw6ePTo/P8+TlFeVqUQBoFCpdPnue3eHw8moFm92thl24zBOZ7NvHg1n0zEy+uJ8HAVOp9Mu0tQLam8c3cyy4m9++LdcaUqc0WQqhZnNUkqmUhts8Garm+QZxaQWRg/eunf36ODs0ePTR49/8fOfpVnR7LT3d3YVV/N54ge1vBTd7YO/++kvjVGbu4fnZ/08FR8+eF8USnLl+lRJLpWYDPrum290Nxtx3fN8VJVjIDWuKs+nG91mUXhCq0C6hJpGsx7H/ngkizKZjPsTwghCnk/r9fZGu4MpS+ZZmqdJNnccuru3fXTjVhDWzi+v42bj0dPjWZa/8+CDg5u3+pNRFEU1LL/5+mslirfevD2djuqtemdr+5uL3jQrkBPmgGZZUab5SX/0zr03P8yyh//v/6dmLPQ9jzl5VUoshsPhD3/010iK7Xb7rTu3KIEKqt2jfSdwo1pMZBQE0bvvfGdv91CXYjKZN+p1l5GyyHyP/dM/+oMH7380HqVFrsHYDhHF9fVVWkwwElky7feu2t12GEU0CAJr3Vcuv2UkgG0nuLHh+QHGeHt7t9/vc86FqBBCSimtFHUc3/MVJbnR9Xq9KIqUYM45RaAFF1oZY6jrTydzz2W3b94IXFplc60kMoogEFV5eX42m00mk1mr022325xzzrk1M9bCEYSDIDCgptNprR5hSsukLMrU9z2l1HA8Mnw+Gg0wBm0koRvNdp0xggl1XSYllxIpUMtedcYY5TgUwOOVZMzV2lDi2ExBFEVRFC23M40xLvIqyzLf1FyHbWy0t7Y7RVEkSQJa1ut1uwFVVaWkFXhDAEAIjppNy1UkhHHOh8PhbDarxXXP86qqEkIEQRCGYRRFWuurqyshF3uZkNzKitnmJVYmAROwhScIIYyR67rWWi3CXMwcxzEGpNSj0QgjahvWESIwxkKIquJKcryUQ86yLEtz3/cBYDqdU4qDIAg8H+EF/VAIIRdq9tgYw7kklBJCfY8JrTBGlC6K3lZRYylLKaVUXCmx2KgQMOZaD5Jg5rpeHMdRFCEgVVW5JIIlYVDYike1KIYkCIPFkNcdBa1Xu7z1AKxFr9Vq9gx25qtmCobiqqqqqsrLgnO5wJAx6XQ62Ho9lC64AggAMDKLjL7tVbaoQLHS02vWAtbs8evGDL3c3wHWIPclm+Gl+H7pf7zwCVaJDIpftprLn1YLrrVeqQEjhPBSHNssRahg6dGtImlYM8+rk5iXmRbrZMPVFQEAlBJSAoDv+0qL68urZ8+ePXnyxCxpoUopZMAul4Vf0LK+A9ZAi3UH6HV/6/X1/FbUAV5ypxBCiGLKGMOUxXEcxrXO1ubW1latVlt1CV/cyIoHusj8GCGEIdgYAwis+2bPv+7Jwcu+AloAJICWJAaEEPyDq3p4dWgAAK1h8eVijEkpGUaNdgdjQrxoOMtBuyyMHz/75LMvHv3TP/pnnc2d/njccjb48yeXl5cPvvPdWqM9T4rNbjvsfHx+enp8cdKO66cXp1EUzdNkMBnc2Gw2WvWtcns+n09H42xe+Bg8xw3r5PTsaaNTS9O02Qq7W80q47P52MHksn8een6n1bq+PAvC+OhwV/Bc5FW33b3W/dOTk+ksC+N6muVC6cFoNt/IW+0NRt2dnd1er8ddnxBy7+bNkLEf/fpX437PxdRp1ikmg97w5u0byTybJel/+I8/+Jf/8n/+8OPvzyZjg92yzH7ytz976+79W7feuHFw4/zsWJZia7v5xu0bGJk8ncY1j1FzcvpkkvaNMRg12p2G69F2vRXFcb/fH08nz0+eKik5L2bz8aQSoee3mk1MTMXz2ZRfnV9wLikmhFBC2PHxMcJUAezs7JRaPz05IQwPx4PBeHznzXsXn/8snY9+9x99/5137//bP/mT7/3O9wVxTy/PHx+fHd59y41qkGWZNl8+fnbr1o3Nwxvbne5kNlVKuVFIABFAXuDXXP/Ro0d73c7tW4dlVRlsujvbvVEPi2Iz2JtOZpT4WuEf/+jvvvryISHm/Pzq+cnjvf2de/fu3H3j9rnX++Ff/d2gP223Nt97562Ndq2UWdjw/IjV2vVup+UwQj0voNTByzoFAsTddXa3d+r1ZqcRyzIjmiNDxr0LWZbtWjCcyrIshBCOQxlFBrg2kjLjx44TMDfwyrISUgMi2hot6vhRFDh0OOg1a76H0fj6jGC02apFUeQHrlHSxtYPPvzgpz/9eZqmtVpDSsnLKggC1/XzNMmyoiLlbDz1XOp6LGBxmebpJDXGBH7WbtaHw75GOo4jRnEYeCVHYRAoKTnntk5aEIkxAcBuHOeTSaE5l8J3fI3INM0wIOo4g9EoT9PJZOR5ju/7SvIiy6ss9bY2upstP/Sms8l0PjEuQID8tpckAkvQXCpHhn7gOz5CSBUVcbRSuhS5MsB8opQYTPqIsmajFbebRcmTssxnidXsa0VNpZQQlbV5dieK4iCMXKU4JiSKXcqsCI8piiLwnKIopMo9j7XbHUJIrzdASFdVgTElmFHqEEIwoogRgpnrhwRRpUTgesqhWlSB40ElG2HMPA9jnBelMsA81/M8hDHIUmmwNALb5HiBHYPGGAxCSi1ywNbMsDAuy5JzSSkzxnDOMWZBEGCMHd+1GjigvaoAShElflmWNgwUspIVl1Ii0NiAgyFPpw5jvChkxWu1mBBijKxElifzer2+tbExT5LZJAmazVu3DylxiqI4v7zI81IpJZQ0CGbJHAex1BI51Cex62sAy2FgjhtqrQGw0Uwoo7WmlDmOg2hh91Mb7QPSBpRSq3JEbIN5hBAAtmyKFZi/blEscce8XKaolNIIAQJsMMEYENLGKK1AW43qxcF6LTvARbVYbwC9tPoYY2wAAdLGIFhUW65xKYwxAgEwYpZ+hlGiWJkKszZeARJW5zHyRbWCWcsdaKyAGkJIwdPzk9OHDx8+P32ujagkt4WsGGNldJlnAGBbicMyL/CSuVr+iNe0m9a9gXWHZn1hX3khK0kcIpUhBFzf0wo44FoQsjAMGo1aoxnV6q4fuNTFCnFe4cixadOl77K8a7RyCBYTWfimGgwoqTUhBAMQTC1SBdpgjAnCBCOCMAIE2hgwCq3V0Vh1DCua8EL0SMLyM2QAjPFWdwwAFs+A/5Tn9J8xXvgtFICitTekqphDAAFQFwirqureO3+Q/uAXCpJGuz4enDInf/udnf7weJqO8wrSXF71wAkQ/upq/yba3tvQIXKU6fXPu1stZqqaJ8b9r8dXhbzRCfnR3XsPIKXujcbTT3tMuaJShiNeBFfnxd7ezYvn0+lk7DpjLVWWJM1GI2r49biWlVnUaU6S9PnldXfvYJPjQb9/edmbZnxaadqKWKfdarSzoiykNFHz3lsHnkuaGx2jhUOpE6Ivnn5mHOnX/Lvv3k2KcjCe4Aqen1/0x6NbN4+EkH/zo781qtrZ3ry8vOz3zm8e7EWBE/j+g/ffdSlJZ/Nbt269/+73pJRBFF6dDqdDw8xGgDpFWXRrB7vhnclsPJmmzdubRLhJP9s/3Ot22oPBIJnNRr3BsN9HhUaOub6+upxlpeDD0QgI7u5sCV59NbginrfR7R7sHpUT3jyqo1iUejSaPP/iSzw9/fIP/tnvffTdB8ejJ5tv7UlDfv6TT3rJNKjVZSVPH5+6rhs5tck4/dN//1ebm20nCl2jer3rm5sbZZn5Pmk262WeZaAHMpmYPPDZZmu/ytJ20DRCbdSbxXyGiKl5kE3OfvrXf3r3zhuf/vIXYRCwZudWa2f2/LL36MnZ578Yj6bu4aFmdV/TRtTtbnZrrVqlef90dPLsklr7tMIJeSXslvf48eOrqyvOeZZlvr+A8hzHqUcRRShDBYAWstKGGABCSP/q2vEDRl3GmDFSG7SgjscxMsbByKVGcIWx9gK3EQcHe7unp6ftdnM6SyejC6XUgw+/s9FuXU0L0ErLRStqLQUhpB7HQlRaibIsyypXoizLXEqOEKqKme/7BtmeSTzPSiE1GKy1Rhg7jieEKCpRCo4Q8jxPKhpGvuUoEEIpopQ4juNVVVUURVFmZVEoJQhFBkEl+JK97xDCrCSWFLooivl8bvUhoiD0/dBlHtJGSkkc126LUmiplVIGI4qRKriwALgyuiiMUgJjz/O86+vLKIrCMHRcxnJKCIprYavVMkZxXhGNPM8TgnDOPc9pNpvjbKq1brfbruMTwlqtluN4lxfXlFKEiNGGc04I9cOQUiql9EMMGtnqWBv22dBZCGEwXvwIiGhmjMEIOY5rjeBi/fWCZ240Iov2QGhVemAxlRWpYhmkaillo9FwHHdFO1+ZCgMLYEAvRRW10lppyySygIGsqqIoanFcca6qQsuqHgf1KEqm08hzuhstl+DNzXZRltubG2VZXg/6vetBWZbdTnvOOQZA1PF93/dDIFgKrZTK88JaIltfqLQCpbEyDl1F+eRFagDwUnBpPdkPAC8UHuG1YP31F6uxbvnssKZ/CV+j9cNeOXIVQ7/yqxXgsX7Rbz1gPUB/Zc6vXEi/XCsBAICAEMI5v7q6evz48cnJyXw+x6/NcPX6dWTif+V4BX5wXNcmpGw1lhRaWdIHprVGM4jCZrNp0TgAAPIaPGAlGAEofdHNYX1ovXDOVn6VZavQNWFJtNaPe32sn9C8/OY/hGGnbZEnizk1Gg1KnaIoDOh6vR7Hca1RT2Z8lsxPTvte0LJgVZ6V88l8c3uzUWsNRwOHSIL4brdd87fH7VjLr05Pn+wd3Yxa3SD2dpzN9z54Z9jr93u9bD5PCwRIUgZKVUIWCCQGJXiezJTrOFk6ZYTUo3jGy812w3fdB/ffnqfZ2WUvDqN6a7PW6Z5eXJ8/f05dNwzD2WgktzffeOs+RajMUyn5dHxxcnLy8KuvhNSHN2516nGWzsf9q6Iq/b29bDapsoRCu7nRphjnaer7fhRFo9HoyXhcFMUf/uEfNuKa53mCl5YQ5rru5uam7/tb29uUUqYCQsCADCOfMqyE0FqDNkoZSp16ramEzuYFlzCdpZPJVGJ3nhTztDQICnWFGK23mnsHB/Miu7rsn59dnZ6e5nm+tbXlOM5gMFSFisLGeJoOJ5NCq8fPLz777OFwONzYuiGlnM0nQeBRAmD4cHg9nV1vb24ZpRPHzWfJfDz1PDeFmdGSgJkPJ0VatLdqDnUn6SCZJg5jWVp2N7a1Vj/72U+rSty9++YvfvbTt+6/9Y++9/HO9natVjs+Pvnqm6+u+70iy6/6ztGdzVan2dxoxY1aIbN8mmKCNzc36bIQX5dlKaUUXAIAIaTdbiOEbA9AS8GjlMZxjAlTSoGWxhipJUfaKgSk2dzh3PMCwlxKsTGIIACteFm5lGKMhJAVLzlSLgEVepgSIUSeZoHvff/j7/zJn/27dD67fefu5fhRWWRFUShlpCCaV0IISikliFeiKDIuSsmLqiqsgl7FciCUENcYlaS5MlpZbTuCMaZhSCuhpE4xLih1GENhreNM2GgwTuaZ1hAEYavVajU74/F4Np0KIYBAJYUxxvO8VXU1LLdRrUCIUhtZlpxSGkZeFMS+7xsFRZpXFSfKILBybsggbIw02AAAY7anA8U0ZozZVIWUXGk5m0+LMo/jsNGo+YHrOM5sNomiUCmFseP7vjFKa02pEwT+tJgTQprNJqNuWfJarYYQscUmjuNYaSnLZrCMvKIolNBCCIpwVZQOZdPp1JIhbEfjlbDBaoNDyIaV2nIjKKWUSq21Aw5zrDGlCClCFllztISazYIYSOmi2ZXzAudfBqnKah9JK8asEGgjlRBVWRZxFBVF7jEHAKQQzWaT83LWfyayxEWmUfP6FHiZijypsuT6vDo5Odnc2jk4OLh1+OFwMv7Rj340HV239g5sKI+AMGoIw5VWZVUgrJE2GqQBoo1WSmvASGksF88XoTW6vtErP2b525d4dqtoeB1aR2tNHdd3Z3jZ9KIlOdHA0oatnfbFg3jZF3ndD3glBH/pii9PwKzVTcDLdn3dtsFaBmQ1DQWaECKE6Pf7Z2dntpbH9xaqU+hbOAffnjL4VrsFi1KLbxm/8X5hQeFEBFNKMcXaIM/zbty+tbm13W63CaOcc4OKFYrw0q0hA4uuFgjgpZPb869cXljURCwqg4iz0qt4yat7fZ6/ZSnWHYj/zmM9l2cdfVvm9/4HHzLXmU7HQsmirEaj0fnFqOIornWDKEbEkWBm42klSsxoVAu0vtpo+0dbnaPdTQfMdiu8d/cGYVF/Vhmdt9rhaJxubrWGoysvoJTF4/Hk+OSZ5zmU4TD0tZagVaMW7W3v+I7rEZYmyd7OriirMAgajUYlpJLamp7Z9GqeZkqjo/298XR+++hgNOhpXjTiuMiSyWhY5ilKehjkZrPBpfCJAZFH1Gx3GmEYbm11jTG6Gdcj1yc4nY9DjxI36Ha7nucZY1zXbbVaHnP6/T6jWErZHw44rxaVEXk+Go3u3uxUVZGVMyklpprzyqVkMpn0er35POVFdX3ZO352Uovq9+69tbV7q5cVF/0xVyiq19wwwJQY5PT6k7PLC4xxmpXdjZ0sTRu19nA4/Ku/+Ov/6bvfjaPO82dXZ/0Ljcnf/t3Pvn70WCM2nU7jeiukCEAn6SwvJg41YeCEEPuE3T267Yd+yNw4CizMfHSwf7C7V3PD65Or6+MLzUWr0dzotpO06rRbg3HvyZPTrc3OO+99+OjRo8OjGx9857txEA4GveF4kPOqtdGObx6FYRjEQb1Z39rdjurhYDIcZzPCUFSL6eoDZAneKyX8+XwOy5wWYwshLdd1HQccRnyv4foOxiClRBiY6zYajaIoKi4Jxg5zFSAhRFmKPCtch3KXuRRR0JpAUfHJZDro96fjkTFmc3PzjVs3PWIef/3F3ds3AodyzkFKAkCMrqoqSRKEUKPRWNQEykoppQETjCglmLjGMExASZMkBefSIK2UKKqSMOZ5HkIYEWwAa2PAGNfBrkeZh2iFlDSUIoM112UQerO5cTwGmqbpXCgVhL7je5Q4CIgU2gAXQtlqPl7JMIgppaHvB56PMbVii8k8Q0JZjUJbasgrmzbGjuNIJfI898NgY2MDAIbDYa/fr/thURRFWTkujnFICBKiEqJ0XQcTsBr1tmUUAGRZodRSaVFVlLKqqsbjsQ1/GWPYoYQsxILKspxOp3HdEULaWMpxHCvA0Gq1OOeIUoQQcxwNyOAF6UxKSYhZaFCWlSVpOo6zhBA8ADAaEUJspw8hhNFoBbxjjB3Hsw04VmNV8ocQUlLa1k/Ygt5aKSUkFwgMY3Q2LikYrQRCaLPTllI+/bwkoMoiRUq0auG5rCaj3v7Odrse/fTq7OryfNi//L3f+717t2+cPz++uroKQ6/RaAihzi8uJqNpENfA4KpIGXM0hhctFZHGgLVBS3/gBXXA7qoWfXkZUcDfahhet76vjNXfw1ohgzGLbtGwLIm0g6xFwHbYGVvYD6/VL+jXhIzQ2t+u5rl6CrBmDl+ZHixpFnrZkOJFKoRz2xlkMBikaWovsdKrfh0zV69JWi3u678IaXjFxQEAqRVCSCjJMAOMGWEIUzfwwzhijEmtyrKUWvuAASODwEUvIUAG9JKVgmwHy0Xn7GW6BMFLS2Re8DnwckmNtfZ4rfBhNcNXPhirp4Bee6z/ncf6R2XFv2GMhVHH85vVYFLN0yTJpNS1Wq1W7yap1FJlWQaUub7jMo9hZhTqXRzvbW9RpGaj3mzYIwjfvHmbBZTlpZIFJt7J6ePry5OT40cOY51Oy/HC2XSUJdNbNw/3tjfzWcLLcntj897tN6q82Nrofv35F7sbbcnF559+Jre2BC2H49HFxYXiohFHfhhzpZthsNlsfPzh+5999hkDDVUx6l2ePz+Wkm+4sub78c0D685eD4YuUm/sb1FKteb9ft/zHI8iyXNs9Ifvv+fEcej5NraZZdmjR48acU1KWa9FjuMkWaq1tvynL7744tmzZ9PJpNFoaC3zPDdYMcZGo9HnP/j88PAGJW67vbG56Y5GWVWJwWheVEAbLTdott04rMVcVqUU0+GsNxzkeR7GQRSERwc3McaRHzTj1s7G9u7+TaXYyenVRf+6N5n88pOHQJ16s9kfz5kbSMk5AS5LqUqHEeb5FND+9s7R0ZEW8mtDGKMFy+/cvvXRRx9tbrRrUfznP/lkNOjfunFzb/uAIG9359Bx6S9++YnnRSenF/fefOP//H/5vzYa0enZeVmWJ8+P8zzvbG/6tej2jVtCCDfquK5bb9X8OBLU5KrMRaGVoasie/sZQkuJG1tkbxEFKfVkMinLMk3TWq3GGGk0GrUoJIRkecqlAK0dSkqElJRVwed6rqTGmDqO09nYtBUEGOPA8zwHG61nSZbMxlrwWhQMeleflOm9N27UI+/kyVc7WzeSJNGSC6EoNsIYpDUA0kKAWqhGEoK0JggbSqlLkTFISSMkCMUNYEJQVpVpUQJoTAkhREmTlYWUEiGSDq8QQvVm1Gw3CDCtoSxkr3ddq9WFFg6hQEAomZe54zm+7zuOizEWQgkl7WogijHGURQghCiixiBeibIsFz6BBK2FUgYAw7KOEQD7jHLOMc4NWlUPSNv5yHUthQ6l6UzKqtVqtVptTMB3fACYz+fGqCiKlFLD4XCaTTudTpIkGNH9/cOiKI6Pj1dyeFaoTi/bRQohtKbLhygxICsu5HlenudgzILnj7DQSkr5Ai/VSCswi2bASGsrroABOMCCwE8wc5hrmZuwtBDWgXCXt7QC6lcpaiGEktLqA1KEtdZKCiWFMQa0VJILgWXFAemizIQQhKCbN498z+tdXTmO0+1uIITjKKh4YRut5nl6cXHhOE6eJWWRRbK9s7XtOE6ZZ1VZBg5zvUBrnZeFMRoBhqUzYPduS41kjDHmrLInGsOSt0hW3wtYGNqXYu4V2rQQo3zNY0CvDfuW1nrVFGq9cbLFaf4LzMArTszrgMS6u/DKn6/M2LpJtsfbFnxPnjw5OTlJ09S+n+e5rSmAb/M8ftMM1y+39v5vu6PXbw0tCkZAKMWlIAYQAVepp0+fdjYSbtTWJmvV4iAKbfCzfvsAgEDbfo9KKTBWiMxgjFcaSoR++3ysKwwAABrwi1X9Vv8ALZED9HJZxP9AX2HFaAYAz2qiSEkIcd02IfF8LmfTREhab3SbLbrR3W21d/NCPT85n+dFIUpANjkoG/VOp7Xheb5DYHtzJ/K9ehSP0yyfzyZeD7nxfDwMPRz5JEvEbNTvtFsiK4pZ4jQ7tVpjpiCV2sGk5odOrYGkrkURMvD82fHV+cXV+UU2UmEceW5wdLhPqJOVZTmcyGKuK9w7P3785afJbK6rNJ3Nz87OPM9tvbHZv7o2xhwcHGx0WlKUGUPdToM6rN/vp/MR0jWMDMJIIoORGQ6HE0AYYzDG5tRsqHx5eWml7aQUs9ksTdOiKLrdrut5iFgxCqO1juP46PCwyMqsKNKqIsx3vbC5sTVLslTI8XWfFAIcrxnHRVE8O7maJVMFZp7O3nzzzZs3j2px3Gm2Tk6Of/3Jryaj0QcffHD7jXtJXgDgMGr0Hz2ZTmH3qCaUqteaQurBcBzFvu/TiMUAPMmy796/v7nR3dzcPDk5vjw750XZqNV3f2e34ceGgywUw16t1orrrbwU55ePa1EZRdF0Ot/c3uoPe+Pp9Hd/93fLKj85O//qqy9Pn5/4vv/BBx/gycyJ6slo1G20ldFJXk3SbF4kRckNwdIAtTIJq3rx1abfbrfsjmDtjW3YQwgBrWwiIAw8wkiazvM8xxjnZWGbAUoDRV4B4E5nY2d7L97oFEWRzmdKcsAEAFVVkacpI3Sz0w48h1dFHPgOo199+glC6O7hPWxMNp9P8qxQUmtwKMOUGGMMKFv8BwAAxtgOghiLSlKKjcZKg/IwIUQrrIwsioxzrtEiQmLMdRyH85I5nsc81/Eo9bRC6TwD0HmZGqPlQsl4ga8EkU+JSymzjHsw2HV921zGcTyllBRSSy2E4FwiRBzHI5iUZamVAYMJpRgrY4RNfFrBECH4dDrxPC8I/MPDg3QyLoqirDLP8+r1uh+4nu9gApbqKISYzWYIIc8LtDZZVkynU4sHUAJBEAghsixDCNlyOBv9CCG0AoxxHMfGLISJyqI0SoM2WVZstNrz+RwIcRzHcV1MmdBKaw0IeV4Ai20dM8aM7SVAwBgGgGzLDwAgBBBSWheccyv6s+Lb24+Q53mELBxQJRcfMGOMVsK+xgY0BivgCqCNkkWWI2SQUYA0MtC7us7zvN3eePfd96qqevTkCcak2WxRSudJNhgMpNGN+kKSfTKdzpOk1x/WO1sM4WbU6La7aZoz7CCDKcZaatCgkUZAAQxCxCACK89gGUwvI8gV8r/OyDMvPn2/IXZcHLdmP9ZfrByFxZNa6vboNedj3fysTo6WAlCr99dN+7o9WFnEdS6heXms/mqd9/DKFWGNkDgej8/Ozvr9Pi9KW0zxSonH+utvTd7/l41XfAX7gi8FRaxEN6bU8/y4Xguj2JYvcSmEEFJrRhbPd/3GMTKWP6j1AkqwEAICpBeamMsko9Zaa4xfLM7K30VrJZ3fipSsnvLf04v67zBWG7t9QBjjqqoAoLv7ZutkoOUX87l0vaDRIHlWJvPs4Rc/9Pxakpal4NN0poD7Ad7a7l5Pq04bO0gPJoN64OA2K/IRUD/2Igc7jLAbe7sH+0dv3bz9Nz/64cXZVTlKXdctJtm5OGnWG1EUcXAm/Ul2UOzc3Dk9OTk6vMUI/ezTL77z8e8Mh8M//fV/vHXr1u5Ou6GUUsqdz7HWhztbQRAgyT2CrueTsydPPc8ByUM3Lis1TzL7aMIw2Gi1W43a/v6+53mtZt3zvEqKmzdvul4wm81maTYYDpq1OiEkDILG5maz3oj84OzsrNvtOo6T5lmaplzJNE2VUp1O5+uvv7E0rCDwO+12luSu6966dbvXG3z+8Msnz54DdcpKuX5QazSVUtOrK8/zciEqKUolkqIsq7ws81/84hdZlhweHNSj0GUOxSgKgjdu3drZ2Tk5P221241u5+GjrxttHMTRZW9cb3QBUUIdrU2ecW1KSoTr4Nls1mg0ptNpVfAyK3tXAxc7HnGrXJyfXO7s7Ny88UYYR1EUVVJM5tlkfIwxSFWp0ty9+8btN24WVek4HqHOdW/06OlpGIaN9naelWcXw16vV2ucMpdyJSazMZdVY6Oxd7jX6TK6crottkkJs5+k6+trq8hmjPE8v9vtKqV832cIpOSMMYwRQeBQZnx/AU0boIRFjheFAIBbrXajWUuz1KJeUpg0TRPNeZYV6azTiJnrNJtNUbAP3nvnqy8+vzw73t/fH/SuPC/wXTYHKKsCDCaYOA6tqnKh04ANQguNekAaNDZGE+ZiSqpSaA2AsDaIc1lJVQlpjMKYEkapA5iSRlCjlAJgIaSqMkJcL3AxJYPrMaZISIkBOb4HAAUvPM+DRR9kbRUFCSWIIK211SFQXCohlTJKaK0WfHiL0ruu63guY2xFF7WRK9ICIeT5C9m4EdKXl3mazglBcRy2202M8Xw+tc2p7W6vlErT1BIObCRncbbZbGbzCMPB2PZfsDQIzkVVCsaY7/sGIWRwEASgtJbK5jKazebFxYXgXGttAIg20mgAIJSaZQLCLPLlVjXZUEqVFktoGq0MPyBlqzQXRRCM2dzw+gatlF6RH40QBjRorYwxwjYwlAQhREhZ5p7jMMYcSsIwZIx4LnPjNmKs226nBT89PTWAg1pzPJu5QYgm86vrfqsl/SjOSxnXWvsHmGfV2fFFOs2rgmNNp9O5VFooLYRSGgwimBoDGIxGCCO0EFYCAGPW+hjpF+bhtX/XFHheM9LfGjKuW/fVC71s2wgvQ9PGfEuZ5be6Ba9fa/23v8lR+C1WZHWhVeWClHI+n08mkzRNzVo/i/Wyw/8sROF1d+Q/+Vev+ApKKUIpYZQQgiihlHqBH9dr+3uHXhh6vo8xzquS5vlKSsGsAVovdCng26f9oooSAAAsJAlrnhm85nihl5Mjr9/X+hP8Hz601hZ0VEp5ngcy9twNpYLZXDaAen7o+ZQQ0u12m80OVzot0pMzeT2YJ8nQCxDCrUbzoBm5p0/P+5fjaT8FpN99/6N3PnpPAOuPp00vv3d06/6Nm1Bkj6OvdOVSSutRXUqpS+lENGQ+NzybZ1cX154bMNfPksT1g93Dw7fff3+rfjQeD4fDoZLy7t27zWb97ORUa00pmc1md44OeDrv9y5830+SpNNuh/XGjSh2HdrttCm12qnGBrdKqTfeeKOo+O7egdCmvbkzGo02d3fiIJxOp7yqOK+qqmo3mlEU9XpXV1dX/eFgPp9xJQeDQVGWm5ubnY29zsb25kZ3Z3er02pXVZGmqeM4nU6XMneaZkKZi+v+JEm54coYL6pPp9Pz/rXve5hRwEYZ2eq0b926YbRM01m/d316/IxXxc72Ri32uaqu+1eGgMIgtKg16sYYjGlRVr7veG6AsCmLSgge+oRF0ZNnzxBCruu2ao39/f0iyx3Hy7JiOBzPZsnOHgmimDiOxoS4JKg1v374xXQ6BdCPHj1qNutpkR4c7rdardFkPp4mT48vwiicpXJ3Z//hw4fj8VQKqLeaBulZMg7rwYMP393a2+VCUbRs6bTIQTBsCS8Y01qtZrcMGz1zzjHGoUvTNNVClGXpONQY4zrUDz2lapPJZJ7nrlO5bii4Okmen52deXEtjmPPd4wxZVkWWVpl87JICQIlT966c2s84LPZzGHkowcPhsPh5fnF3t6eFYHWaSb1Qpq3LMuiKMoy1wgIQYv9FBuEKMbAmAsgsxy4UExRKeU0mWtt07pUg7ETRgj5zGOOS4lTYVUWQpS5VlgIjZDBGFdVhgz2PE+IKklKY4zvECm1lLbvoEKEaGmkEmVZaq2NVFrazkbGSKU1KKmLorRcIS/wVyrXWtsKRqAOi6KoXq9bH8LznEajxhgJgoAxYq0pxtjCvJajaysy8jwvy7K52bQRVZbOLy8vDw4ONjc3nz45BgBbVeH7YZblVTmzsuSzZKqlvbXKKE0QphS7ruv7PhJW+eAFiGqTLPZrZrmiCCH76QjDUGlpdxmECEJgZQyC0HEd11oOWKgge5TSqqoIsUWAoOSLqjzbEBoAjNJSStAKIYQR8l0nSSo/CChGYRjv7u56rqu17l09Pz45+/DDD995/0GSFwBQbzTKSpydnY0nszRNXS84v7yezeb2EpEbP370yA8iz/N4ydNZIjX4YSSF1oAM0oCxAaTACilgQl4k/mFlMvEqIQ3wIvJerAaseQnrRgX9JjLjK77CazUOaK3YUktlvg1RWBm8lcVdxwNWF339Bbxs2NBv4Bu+4issPTx1eXk5Ho9tgY80YD/2bCnS8PoZfhNH4b8W0mCzRLaaUQghlcGUFUVxPehvQDeMoiAIHN+jlFqOwuKJrLkpr9wpetkbWwFLdq00ftFnfLWcr5j83+IlIPQPRZFJL7Um7Q2uIgFATqe126hvCg7DwdQPKSEoiiJCCMbgEoxZ1GrV03JijMzSaW8mbs+relivOPaIx9y4KrJOe/ud9z6aTea9619enZ1fbm69ceNov7sdEUpVYzweI4Ss5Pzgcpjnue/7ySx/8uinf/RHf/T110+Oj4/TNE1+9sm/+Bf/4sGDB6enp0KI66urdD5zGa2KzKLdSsoPH7znOfSXv/4VwbQWxUcH+4dHt2xXYYyMFpwreXlx8fz589u3byd59sadewqR68Hwy6++2d7d94JgNLwyG13GWOD7l6cnv352fFpvJEkynYy63e7e3l4c3yt4NZlMmq3WO++84wbtGweHmEAym/ueQynWQjLP/frRN34QRY2mMPDJZ5+dnl+E9Vq93vz0m/OsyKfXl9P5VBp5fT1vt93vfOfD/f3d+WzaadTjMPr1Jz/jRdlu1hlB/f71yclxIcu0LGyZoYLC932DnLLggk/DMAjDiGDXAOeVoI5TCTGdThu1Zru14XlnADAajUajUavVqtUal9fX12dnca3W6rRLIS8vTzc2Nu7fvx/XgocPH372+adb25vPjp+7ntvZ2A7CqNFoTSfpu+9tp/mvS26SucY0B2yEgChubO0ctFptAE1VVbquizHiUgilPce11DnOeZLMqOMGQSC14IJzLbGhWJFMKN91uNBlmTXiuF6vV1XFsahFjcA3UpvxdD6eTInj1hutGnWLrJRlxRihmIAUeZZWRTJVVZmRi+uLRi18dPIk8Jx3P/7oz//dnwpUIdf4Pt1krctfnURhjDEF0JRIMFwrTjBlhGmDlVKggPqh53m8NFqqyGt4jIisMCXko7zZabq+lxY5r4TjuYRFEoiPO4gTqcFI6QAzBHEpQVWUOggJACyVlkp7fk1rXZRc47lxWhoLJSV1KCO0qirFtcyl1ppzLspqrbEWpopijDBGo9Folsy73W4cx5aPiTGl1KGEaQV5VtpSgrBRCxs1m9wBhKQWBBGllEdchBCApsRURkzGY6XURqcB1AS+43thLYqMgSJPCYI3793rXfcZc9vtjUa9VZbV5eV1kiSMMVPWKl2VsyLyY631bDbrdALH9yspbTmJwxjG2FTCGEMwrkxptEKgEAIEmhKKGQWXSllZq1/muTHGshAcypRwuEEIkOs4C545AJLGZ66QnAAyxlRFhjF2EC7LkmJclaWUktiWA1ozh/q+n+d5vV63Dk3sMk2QxFBrNMZzn1Lny28eVZUw1GXMuexNucRZhbMSuAnHCZpm+XxWAOC4XisIxhrhpMBZhTFGfowASgA/rsOa+VzYCKUAu0oaKSQhZkWqsC4mQgihBUqEMcbYvqavBJfWeK8st3m5q7IQApMXBXXachOMoZSalX7e0jgBgIMRaGNTHtaGgTZaWyENZPszLW4BEBgw8GqkviDlveZb2KGkQMsOZNZFATDGKqNLYUmMgleEEK3kbDoRaZ6Np8V0jrR2MFEIcyWNFZMwYF6Wg5RaWXu68qJWVlkpYSti4EXU/lIranjZTfmNZagClbwkhBCHIYmZQx1EeF7u3t3a6HZ93zdaMgQOBawFhVUqxy6ZMQZpgxBChCAwyGjQFsVRWCuNMVCGEWikDSEAWAM2RkgkBZcEo4XSObBlsxKjtdArGizS2ihNKSWUyqJafXLA6jdYp9P6GdaBQAgAL0SXNQIAg9Y4Ioun/ErP6P/k+HaHzK6qDVqMMWzhbxlEzM7t/frGBoD37Pjk5o3dKHRkpWPfS9IxYVhjlFTz/nQ6LYqjWze9sP7zT56ddqfM2e4N+7TW+vj7f5hrbzYrRCU3GlG75n3+yd/eOujeun3wSJddGuj8quDFvOyVojo42o9qNSllknw9m/aK2c3h2dcXXz2Kw4ar6M//7V+4re5XX301Gg09z3v45LH46kvfdfzAdV3n5q2ju+/eCZq+33AYY8wh3W53a6crpfzyyy9rtVq9Xs+MyhAazufuZNJoNIzrGCWFKDa7DWyK54+fzscTH5lGoyEE3d7exhg/fvR0Pp/v7u7vHt1+6623NzY2lNRlWQKA4zjPLgd/9/P/X1VVp+cnN24c/tN/9k+EEL3ek6urqyzLonCSpwU2dLe+fXBw5Hnez785Sao8qwoEUAujuzdrlJCnXz6VaTUYDILAI8jMZ3mn09o+PAwajf7g4mJwdt0b5lwAYg7Bs1m6e3jjejBBhBqiS6l16XieFwQ113U32g4m9IM79/c3toqryX69+9Zbb3UbndPLC7rjPzk7+eLLLx8+fNhptwPX++LzhxzyvSK9Gvb+t//zv1AEPXv27NHx8ZdffBG4nqj4O2/eCVxvb3vncHfr+U7zq9nMiYjM8q39bQXxRqMTesFsXna3O9Sy27iUnEsAAQCUOQghpZRQGguplMKMagUAQMiiroYQLKV0GLWxr211KKW0Dn4URdqApcaNx+OiKJSoXJeFge8Q0ul0kKnzPA0DZzabEaST+fSte3cYIXEc+36bYWKkUtwyBEUQBM1mez6fV1Vp1vKvhFFKKXMcxghCYBCjDHme4wLBGHmBn1d5yStG3SCMCXMQITYvoLUGs9LGWTQgtiXFxpgsza1AMlq0DpJk2X2OIJuGUGbZoM9ItRrGGNCGZ9J+IRFCGBPHcWu1uuf5aZ6DQUpq5mCMiWUI2raCVtjAliwDgEXpg0bTomd8SZSzdqhWa1DiYIw9z+dczqbJdDpPkqzX6zHmCqGUNIQsihKLolgZLWs/VpHi6lqW4W8xG845DdzVlr1gGCxBDrPU7bYCWQBgyYYIGaO1WjR4BFBIARjQSkiNFcZg9WqEFpxzh2KH4lpUsxVKlvji+3672cryxHJm89y1vcrKstSY5Lyaz9PxeJxlhVZGGpBCe14gDBgEUilKMPNdjDFzHGH0Ouq+ZqjU6p31sWoGscxJL8y553mwDNzXQ7G1AsaX6gt+0yCEoLXyWoSQXmpBmleEdgEAQCm9ft3VtVYR7SuXW/EbVr81yzI/+A29FV6ZvH1tPyq2m/yKl2rlRFdLhJa64LZk+rfc9evzXL/o6rq/fele/60xBq2X8hpbm1MiSk5OTgzAxsZGEMe2HsdYwQCG7f2jtf4adkmWxTgvXUtrjQwgrDHGlqpiL2pxCQBijDEaXizIupzzWkXlyrkxxlidaliUd2orzLS8J70w7UiD+a9G7/j7j+lkFvruzs6OH3o27neYCcI4TedCc6IZdlnoB9vdDer5rXpjnBlklDEKCLguczyn2+28e/9eFAUzURJCsixJkmQ6nSKElBaT8aCs0rLIyiLf3d/53/zzP261GicnZ7Np0uv0i6xs1prIQDbP8mn5cPZl2NkeDvuEEEYYIKOETIVM0/T+22+ORpOf/PSXR0cH3/ne97XWjUbDcWhVFVrr+/fvWwYixtj3/QcPHthmYJzzIAjSNE2SxP7KxHI+nytlNjc3Nzc3tzZ3jg5vVlX13e9+D2PMuZxOp5eXl6cnZ+fn56PRiPm1Xq+nlGCus9FsXF9e/fSnP/3iqy8555vd7Xa7/fz5aRTWb926pTF6enL6q08fzqdTKQ0GM5vNsYZaFHqN5nQydynb7Gx6niOE4LzqD6ftjaLkqqrMLCkqqcJaEEYuN3SxESEDYLRWUlVCQsXBgCy5ievBeDa9d3RrmsyLovjss88qKb56/MiNw7Qqzs7O5vP5fDbjWTEajfzQO+UX23u7oVd/5+0Pvvry0c9+9osiy6MgSOeJrLgWsh7Fw/H47pv33nnnnc8enSdJMkumcSMCI87PTt/tvlflBSXMrapKSo0xNggqLpQ2rutKvUjscanpUiQHISQ5D4LAWpdmsxl6XpqmhJAsy9I850K5fsBcv16vSwOASJHleZ5XRRYEXhQGrVazUY8CjzoYfI8SrMuyeP78+Va3U+b58fExa8rxaBBGNc/zXMo455TSRqNmbuwraQAwYAQGrSzWJJ37vuc4FCPjOdR1KRgVBEle5mhKKHXiWs3xvZJXXApEGMWEMUYwXW6+mFFOCKHUQYhIKZXUVjGCMVaWJRcZIw5B1DYZ0lpVBeecVxUXVWVbb1v5F8tFaNfaCCHGmJWjTpLE8zyMcbfbLcsSY2yLAuwOgjGuSpHnudba932MqBDSyqEQwoRQyurjEsdzAyml0UgIWZYzQpjjOEVe9XqDyWQmhVLKVFWepqfDwTiOa5636N5ZKglgAIyUgnNeVWWeZ0kyZ4zmua6qihAMEBqjjdFSSqzZenhnlsQus2S8wtJlWUSrWkultFIAmmGEsGMQGNAgbUqLW2FmrbWQldKiKqXjOK4T1uLAGJOAUkobLed5arNLCKEsy/r9vm2dVZrKaMQ5r6rKGKDMtU+qUBI5lGgkCQAyzPcwxpqYlSu5Qo9fGQufb9k2SS+NwRI2eEk14RWbaoyxZv0VGqBZS6Wvmzd72hfsRetvIWwdl5WOwkuOwlpLSfhPpRiMMbbic/1NeFkA4JXgnqxJRL8yrObx6kEbY2y/Zquw8q1r8q3jdRcB1liur8/2t5/kW49/ZQLGmPl8nue5danR2oJrArCKztdqH5XSsLDxi3zQysHCgDBgrUAiiZDBBgi1ngbWSGO84HUR+hKMhNYqUZdUngWlA7RGL0iwAGDAaEBo6RkoY10HpC0j6rcv73/d0Wg1AfT9d97udDrtbqtejxnVCKksT1qdVnurIwwkRY4QUlKmaaoVM0Yl6cwlqCqzq8FVfzLw4w8Qo0DADz1EMAAk6azb7Rpjvnn0WbvdfvPDd/I8r1RVpslYinyWIAV3brxBkffu3QfFtLw8Gwihq1xUSeYTNwxDnzlCCOL4jDGhBQKys7crRDWep4TgqBY3u9uDYe/y7EJK2e12GXODAG1t7UwmM2NQvd4cj8ePHj2JosgY43nBbDYbjUaNKFbK1Ov1Wq3W7w3TNK3X691u9/PPP1dKjcfj4+OTs7Mzy9AnhLy5fzOfzx49Oq3VojJNyjT7+uEXXz58eO/+W1EUMdebptm8rNxGPTfw2eefz2aZNiTwa8RoyQVoQRChiJw8fb611U3n2WwyzdJKSvn0yWkyz9sbLQ2M0qCUFZfACNLaTOcpIA2ADAgDYAzVBgxgA/riYrLRbHHOB6PhvXv3vv+d7w6ue5e96wcPHvi+/+TJk/ls9uD9933HffjZ53mahkHLGDMfF7/65OHW1tb+zo3nz58zZlwn3Ly1tbe907u67Ha7QlY7O1v1en2aVQraZxfnewf7vVF/OhzsdrvYJZQ6LC8LqfQq46AMYMocTJRB2HbXJVQIIYXkvHIwQggRBHEcd7tdhrExJgzDXq8njdFm0ZKHUIYQVnoR2SCEtNZFUcxmSMkqd8nh7nYcR5SYQS+1EYDN3H/59JnWemd/7/bt2/u7O9N5EsRRGIYXV9dSSiG1UopLS6pQxhjkoEhEURR4joMlGKM5L8uimM6nnHMFejZL1WwupcSUeL4/y7IoinwvQIvCcVDSSCml1ITYhkyeRRRsdGWAL46UCgCEEHmeKyEopQpj21sPCDXGMEw44laIyRozMBojWosbcRwTh00mEyEExhQhIqXQWiNEpKk4t54KxRhXQhhjHMeZzWZCCABw2UJEwQZP0zy1pQcIEc75fJ6WZQnGCjiqsuB5nltxYkqZUgohY5nbSgkpuZS8qor5fEopJgQZo8oyR8ii7ohSR72s8ouX/aVWwAkA2I5fi31QCq01YKwx0kwb0BgwGEDYMIIrabguCSwq7+Mg9IhSSiHFNS+kNnk6z7IMYzybzQDTsizDMOS8Ojs7E0pGYaycBZyDHQ8ANOBKaa1V4DjUcwGw0mCMZpQCRqUSFL8KWaMllI2WkPtLwbp5qdZxna9gh17TIMLLHlHrvhSsm7iUuoUAAQAASURBVIRvqzA05oV2kzHGdpSWUr6oeli7HHnBtnsxVo9j/fViDgS/fiS8bFZfn9grfwIAtjcsLHnNVVWlaToYDJIkqapqVRy4Xhv1reOVlbdvrjs6KwfuN53h9bO98mLh/xljPXLP88IwbLVatVrNuuBCCMsyoXRh1Jd22hhYdI8E0IAWNBQ7O/t0YNFlGymljMHGGCCaKOK4DJACIAoppO3jJoQQocTrS71yss2K37BcNAMKAAEQMICQBmS7q9k3Fy0fjYFVXe5/6yGVmc/GyhjmuYeH+5ub9WQ2zLPpW/fvvv/Be0c3b55dXpVVddXrcaGqgldGGi2NpMbBWZENh5dRQFuN+P5b94pkzrURSpe8Onl+hg2+Pu/H9eiqd0kdsrGx4TN/MphQ6lBgb9178+zsajyc+U797bffb7f6j7958s3Xj+u1jk8dlxKRl5P5zCDDXKcUPEmSSsh6q56WlUGwS/BwOh1O5kEQ5Hk+n8+zLAOAKIru379v2XW9Xq/f70dRhBCyMFi32/3ehx9XVdXtdjHGn5x98vz5852dHc8LvvzyS4uOX19f5nlqJeMQQt//7nda9dqk3zegZMUZQgSg025rIQeDQSEl17pIs/lXX0Vx/ezyQimipAElidEOYUEU1IPApWxnY7Pb6RR5cX19jR1aa7TKQj784vHBrX3AXtRo6yQrhMhlJqQ2UCGMgQAGjDDGxBBiCFWU0XZ9AxGS58Vf/OCvvvP2e41GY3drW3/66/Prq7Ori2enJ1zJRlxr1huB57UaTerU4zgej8f/8c9/0O40/+kf/3Gr1f3880/7w0G73b7z5r29ne3nx0/T2dwY3Rv2O+2a1ArQVqtZm6WjwPVqUcCVpILLquRCCMIowUwZMFJyqV3XBaWUAS4V1kYDIEIR0VbBChHsui6lNE/TPM+jKGq1WlG9nhdVXlZcaiFVwauyEgAQBEEUeBiDUqrX613KiiA1Hw93d7o3jvayLKvVakKITqu1s7PTm8nZbOZSEvlBo9Gg1xQwKatif3+3tHIFSgNCxiCrATUrJxqEkJUBJSUhCBslpUL1uCWVSrP5ZD7RxoS1MAxCQvEwH7iu67nGFhFIqQlmGGOlpA3TPc+TUtrotigK32NKaAFSKYMxRhpRRBFBouKikkIoUAZjjBEG6hiDfDe0mK3t32yjtCAIKrkQTrZuwaqLMSXE1m0y5koppdAAgBFNksweU+DSxnaccymlYQQAypKnaSqEoIQRTG3jR8dxwiB2HMfzfNtmuigyyxuwWQy7kdn2u8YYK7602uAQQoQQtTQVsNZpaWUO7cxXZR2u6zqEGdAYY5cxSjAyYEAZpbVGlGFklOICUWy0dF23u9GuuWY0GmVFipECAMHzqkzBYKWEKMvrfr/T6cRxPYyjer3eaDRO+yMb8GGMtQYpJZdKGyOEoowiZKRUCCHACCkspayF0fquvbLxsGauYM2gSmXQWn7BLKEFSql1ec2iHNSqbRKlvuWcC4RgZbzXriKlBETWvRC0TGmv4eGLCSOEKH2JY78KT18xtC/s8Rrrfv23694MfJvNfmXYD+dqxax8wuXlpWUvrhZndV+/xfas/3YdGjFr1QevoAu//SSvXNd+cUBhjLW1AbYhu9ULt279umdjXTGMMSzRf1ikbBYugv1XL7W3bCpAa+tbI03QQu+ZEoQ0SIywMgbbPiCW3PrKkq6+L6+vg9VpBVAIsDGAgFhMCCECoA0AAuvpKvj7+VL/KwciyPWDVqv+B//kD4zMDvY6eTaaTQfz+fTdd9+qt9qn52fJfC65QEBlJRXCCBvHcaJ6pI3sD65/9flDxlit2XAJ1lwx6oFhg/60EbeVgsfHp0br/SNHAeldDHrX41s3br/99tsPP/v6xz/6O6NxHH9zsH+z3mq+/9GHt+7ey6bp5ubm0c0bnuf1hr3rfu+61zu9OJ9MJr/85c/3Dg+ObtzY2tkO/OjJkyfGmHnvstls5nlpjBmPx2madrvdshweHx8/fvwYIfTmm/e11kqZg4OjDz/8kGj85ZdfPnz4JQAMBiPOZa83mE7nBwcHGEO73dzf3w2CwBjz9OnThw8ffvPoKy54o1krilxWFQgVen4zjikhWtmCeXeSFf3eIIzmSZZqHSBMQRutJCG0UYv2uhuNeuwxh/MyTzNCiOcGCKGKCyV1ISRxXMgLjbEGYwC7gWOL1Y0xxvKVtNEGgSKgCGF0lswdjTAhk8nk2TePm41GkiRpmj55/iyryt3d3Uatvr+7Ww8jUVRVRULPp+2OMPLk5GR3e3tru4sxfPnlw9lsdn19/d7b94ejfhRFnVZzOBxubW6fnZ0ZbK4HV8Ph8I237o2HIy4F1YAQodgAsR14mWsWHeqQULooCi6V4zhBENiW0wEjxpjAcxljk8lkPBhMp1PXdQkhju8TQl3XBawQVpXVYy8rSqnvu45DpeBZmXHOjaqm02kceQihIAgcFmutGWPb29vjVF85TuD7ZZHVHIc5xABO0zQIQ0DaYIQRch2fuo4v/KIofPCwlXWVWkppEGWYea4bR4ExJgiiWtzwQi+uR1yUo9Go0WjU63XfC6wrYJZxCaUvQOmiKPJ8ZM2ht7mhhZIatNbUIQYThzqIIafWkJyXZWmxytXGpyQyxjiOI6gwgDGmQqiy5FxJrQEhoqRR0hDMAAAjKkShlKkqIWXCOS/SDAA4l77rAWCjdcm5LUOw243vRQCgVYYgR0AZcymlUuqiKARXYARCyOKbFi4mFFGKtUEIY88PgtBzXddxKRel47Iw8gHAqjNprYxSiC4+ACvXwdrOVTdCjLHtKm7tR+B7qzAdIWOU1MYYUEYqgjwpORjlOp5ACGPkeW5VDKaTfpJk9Xo9rjUaURCHAXOdIIiSNGceOzy4cXjjqKpErVYzxjz7//65UsoYIMuWjy51KaWzNGNMEUIsbIu4IIRg9Grpwer1er3AyzH3yta/qoWw+hGtDYxfVUSG1yLI9R+tH2AnD6+WSi7fWTPeK9cNXram9kGsT96+UEvVS/PyeO1aq39h/VfrC2VzTGw5rPdjdVbs1WEtFfKbbPy3vr+a3gqTX03p78l1WJ0Wr6ln2robm5ayqYc4jt2ljOnCz0MaY6wXDwWMMUYbAMBg7LaxWv4XabWFB2DxMw2UGmMIEWAMQswYBRoRgjC2at/GOi7rn5ZX/Cq0RjEBZMtiLTRFjLG3j5dCXsgSRWHhz+D/1lUTBgBTKo1ClFxf9zxPd5pB/WDvydMsS2fnF2c/+MFffv7rX5USgqhWFoXADiGENbzAj6qq8vwoq6rPv3p065efHe7ugFQGOQR7vDJakRsHb4z716PB6MtHp77b32htvP3W2wiRH/7V3wEgLqC70TUIC62y+bTb7b5z5/beZteavevRxWQ6qTXCo5sf/Q773hdffPHpZ5/5vp+l8zwJN7sdrA3GOAzDZrOpta7X661W6/r6mlL6zTffaK3v3r2LMZ5MJlrr3d1drfUPf/jD3e5ev7+ovGi1OkEQzOfz0Wg0m01arVYcx77v+4EbxzEgLRV/dPzk8PDw3v03z87OKMPMIXvbO0KIqF5vdDZrnc48LyfzglJHA2RFqakX+gHWpEwqXmVGBmHgdFv14aB3enZWctFptRTCk/kcE7q1u7N3sD+aTM56F0VVaIRsy/Myz5jnIgSwQLYUQaYEpLW+vLra39kVQrfjOCvyw8ND3/Mopc9OT0ajURBFW93N3d3dvZ3dPqZIG6Ors7OnnufdvH3j/OLZo8cP79y5849+93t+4PzqFz///OHD+/ff3NzaGY8Go8k0K0rHD/y4Vu+2n52fjibjm1rPkvnO/h617duFVoy6hBBMlVBSA7JZSr3cyzBhCGOjjJQyCIJWq0UptURFKaXloIW1mueHiFDHC8IwdPzA9YLryytjwUBkzMpnR8iWDMzn81qtBkZZR+TWrVuPTwaewzCY0WhkAIQQrufxrJRKaTCVkFIbqbWHASGEKaEItAbDQWrJK66FRgYzTHgpAGlCUBTV4jjEDKSoXNfdCDZc17UsBztstB1FNc6lpW5xzvO8tOQXhok9TCm1aHsoBCOkf33NOa+K0v4JwMIYKIkwxvV6PQxD2y06iiLP8+ajoV1J25fBbsRSyjyf2ZKHBUaqjTFmMpk0640wDH3fx8s2TvYSVSWs3+B5kePYqYHjOGCw/YI5jsMYQwhbVFZXleVPqKV6ozEmz3Mrt4KWxbF6peS93NdWFD/rMK0fAwBKKdud3GfUcRyKKcZIKS0Vt7RyKblWRCtFKY2iME/SLMtm4wmuJlkyq4oCotB1sOtFvh9G9dr+wSEXqtFoNNqtZqszmUyiKEryzKd+ZbjWGhmkpOKca1QSzDCABkkAOYwZhEAbhOH1uvmVc2OWfIUVQWG5cZN1OGFlDq1ntiIurIWnL1IbK7OnX66pe2kjNmZpipbew7IqYeWBWNYCfBsDYPV6naH50q/Mbwz0103st57zlbPZ27RP1jY3F0JYFs7KEK77T/+5Qy9v/HVT+pvG6weYZYEJppSQBWOxqipbPMw5x4wJYTO7xhjDqK0mQIuJmwWsAEsOo3n5GSmlDSaYIGPWq1GwEAojpBQBwAjZohIKgK3SNyw5v6vpWddZLzukw5r7uOZmLb0EpBDCxuDlrFbPSK+3g/xvNBhzymIaRdF4PNZiLqpGHLmYaEyA8zKZT4UQUdiIo3qS5WmlENKCmzSpJuM5Iq5H3dE0++Ff/93vfPc7SGohsJB4Oimvzsc7m1vUb+8cdBzHO312PBqd7+7d29loYSYeffV1rzftDZN/8kd/9NHH3+WcV6IazyZnnzyxajGMMXB0KbP+uJJSttuNt+/fswKAmpc8TTabDaUUd1gyz4QQ08lcSlmvNQGg2WgPBoPdg/0gCM7Pzw8PDj/++OM8z//Nv/k3n/3i4c7OTq1WK4pimQ2flWWptQzDEAAuLs+eHeOtrS3fd5vNOgvq9959q1lv/PgHP1RC1mq1o6Oj60H/6uKyEkYZXCQpaOMzz/WjyC97aUWxVcCvXIqiwIk8xqiZjnvJdOQEvueStKwoxWGj5niOodpgyWVliAFAZVU4WBe8Yp5rEDagsSHGgFbYaKI1diOfMJrOJmePnrbD2vv/8u3vfPTR48ePf/g3P37nnXcOb9zY2NhwKB2Pxx5z/uD3f/9vfvq348lVf5CkxTjNJv/xL/4sSccHR0dvvXUnjv1hv88Y++ijj379619fnl9EcX08m1daR368uXugqbO9u4cdN6rF1GBEmAsLyjo2CEBpIYT9Hvo+BgDH9R3H4ZyXZclFEYZhHMfGGM65hftsnyGU52UlMGV1TJutduR6nh92OxuWzKiUUFIQIzHSSiDbieDrr7/e3e4O+tetRu2Z60ZxYJRyKKWU5mVeFoHRGiFfCFEPY0yJq3RRlQYRjIFShgnRqmKAiEuU8Apc5UlelaXU0mWeEJxQhAjSWiKKmq360dHRrEyNMXlW2O+qlHqlG5jneVEUgi+kgXzf73Q6jGCMsRBCVFxLZYkCjBBLZQBt+Q3SKG0AEUpLoRDSUmpjEEZECDWbJXle5kVpjJFScVkSUlkhRc65MYXd5qSUnueFnq+1zvN8Nplub29vbW05S/0ia7rSaZplmWWSUkqtEk4UWhUpsM6N67p2lwcArDgAFEVmpRGsyeS85LxUSuT5oqLagreO42T8BUXL7mj2ADtDjLHrugBgmZtFUfiEhGFIMVnkU5SyOyJZGldKSeQHZZbPZjOt9d2Dei2KHEqjOAg8B1PMGPF9X0oJyMxmk9OL89k8vbi42Nnfw5iOhyODwLqzxA045ULJhTyDMYxQz3ENAltv6TKmFsr82rycd1jlDqxm88r2S/Win5OFSex2bwVuV9yRVcBNyAs6wipQXmc2rNs2s9b1cQUPrGoK0JIwD2sHrMbqHfvvspvlq8e84pq8jiu8amt/A01htWhVVQ2Hw8lk0u/3x+Nxnuf2Wdsj9Vot6G8yPK9Myd7IOr109f5vOsPqPK+8gKUeAKWUuS7GFC1X3uKdWuuqqjDGVEq78nSJhbx6ZvTSVfSSRyKlAmIoULPotb64WaWk1iudR7TMICyBrjVcAS2bnqw/hbVraWMAIfytHsByfQz895JfyCoZutTzgw8/+qjKB0rMGFVJMuWch6Fvt6B67TkQR2tdFYVBgTaKczmZzfuDCaPg1+Isy/KCe0FMpO7U2oabcX88Hs02mt07995jhEZhWIs3yiRz3fjicvTpp5/1r3sYo8GgX2s2pFZXg+tpMn/+/PnhZnM8HRtjgiAghHhe4HkBxl4Yhnkxr4rkwwfvAcDjx49HjFVV5fqhlPKNN97I8zxJko2NDSHE/fv37Z5mayYdx/n8888vLy8/++yzuzfv7u/vM8Z6vR4ARFEUBB6ltNNpeZ43m0+KMlNKScnTVIxGo/b+0ebO9hs3bz169CiZTJnr+oGbTGdSiFF/AIiqSiEDRZ4rQKBRFAcMI5Cq2Ypv7+0+ePvujd0dn+FPfv4ThBQYdd27mMyzuL3Befns+HjfTIVUwlSO51VCCcG9wA/DUINBBqwoHMGIMYcx16VOUZWDweBgY2t0ellV1Z/8+Z8hgKdPn3Y6ncODQ0Co1+ttbmyA1MJAp93+6MN3upvNzz///PjkfHe/m8wnz58/+/rx1x999NHR0VFVFJ9/8fAPf/8PLDbTaDQGs3Q2z3Iu2p3um2/f72xv9oa9bx4/poCIBmUQVhpJBUohBI7vhkooTBHDDECrqsyrHGOIfFoArZSUGF9fX08m03a7nWSF02j57XZVVYwx25Xg6bOvGWPNZjOktOl5yG+WhajyojKOR1zOU+bos6vnUf1mbzK6HAwUdqLQ+/zxs4owTPxCEOo25gq5bjDnyqvVgBE3CEZX557neYFbFIXDQCpOsGuM4UopIxSTLMY08MAorhK35mJkKp4oSYLQS6eTSa83zVOb/G4ENQcxxlgl1dXVlec5RVEANpgB8QnDzI1cv+ZDJous1FobA1JWWmvHcSgjGGNkVC7yXOSO52iN0ixTpXJRDACMMUqx57kEwbDfi2vhcDgMQ991XRcbBNrCFCAqLYyuFOJADcECAUUu84JGmKapUWg8nJpFcsRzmK+Uyqosz8okSUbDSRAsKJnJPLPbnBU+Qgj5vm8hWV1yAKDE0wrPZ3kYhp7nJfOi3x8v+F/OYvNFQKUAKVVRFJRS13VWcWRZ5dpITIAxxByEMcaE2eAQiDJYVjIHbiilvu8YpXlREkJ4ngLnRZ6FBwetw8Nprxcx1m62HMqu+/3xYFLlsr3Rrcr0/KR/cdnHjFWlmkznZVkRHJ0/GuV57rTrruNgjFPOlars7l9JjTFGCCuFZCVs0YqhpJAA+oW8P4DBGBCmGBED2P6nDVIa1NJurQoCzZLTZyGEFThhESDrZBBCtH6pG5BetiFelVGsXR0QQtQhVlfDgFK2hTGiGGMCCxUgS7DDeAlyIGzhbFj8cmFmtNEYY0uEXNldrRUyAMZoo1fG3v4VfVmHwJ7QGGO0segBwlZEAYwxCJCUiiIihCjSPE+yUX84Hoy0UJyXAIAxLF0ie1vISmvaua18IQBYfCpeY4ToZZdRAFixYmGZIINX8yOvuk2rgbABpA0orSWAJsTBBCjFjkO5KKXi2NCyLBzQvu8b0BgIXqN64IX8BCgwGjRGmKJF4QlXwkiOlBSEULVMRGKiQHHFXdc1AEJKpTHGmAI2SAplJMdLb5Ji/MIHWjF7DKwKYRHGWEuDEAFjUxz2g4QxQkYbMGCsNIadpq3F+A0Kkr/ZzXrBRF4/+DcdX3eoUooQXJX82bPT+/eOkvnAgMt5OZkUeV4SYI1aEwHlwuiy8rzIGKRzmedpw2/O53Pku3vd2/ls3gw35sPRaDjc6XRPvvg6N/p3P3jfN83RaHRydX122p9MZojG9Xo9kQjH9ZPT41ar2d7dcQI/bsRpke7tbaE8o9rs7u4ihIqiIADpdNLtdvN58uVnn9fr9Sj0q1IYpS97F0VRWH4bQzAej7vd7vHjR0KIRqOBEEJBkBndiMLJZKKqajoc/O73Pt7Y7Gb5rMZC5uobN25wzieTSZYWt2/fJog+fqzOT/phEG91alrBO2/eeXj25fOz03maFEJmlZil5STh1K83vDp23CSXQiNjEABMR+Mgjm5udK6vL0VZbOxt7+5uv/vBg6PDvb/50Q8h8MtkFkQRBtR2Q8rc4fUw9oOCo8kgMQXBBAJEgYTVrDAUIeJM8zlmJPRdYoxrNEEIJG+wlmNoOit/5/f+gJcVMfp03H92edJsN8ajXq0WRVGIdJnms8lkklbtm7cP33rvzbgRxI0vTk9PXS/Y6W4yxv7q3/9lnufGmKObN3Z3t+udxiyf3//gHeU6n3zyCVj0uiifHz8+OTlhjFG7JyJEMCJa2xgXYYzIgsy12CUBIaWEEML3/VqtZvF2xtjqe26/V9ajtztvWZZZlgUOc12fEg8ZghBirtPwG9r4RTHZ297Z3toihNSj+MbRbVnpbJb2y4oSQm3Oe9GvmWgAY4zDmMM8W2RoeXZlWQImxnI+NKIIG8YwQxgZIxXGGIxCNiLUSCvAhMVx3XV9x/EwxlblTSOMMe71esYYy5l3iYso0kLOZrMaCeDFRoOt4grBRGlpMwY2L2BjUK0hrIcWH1PKW8VSNlRljFlNobIsrSaE67oZL2yRxYoyZslZVigTVqIRhKzq1/Gylh2WLHSABepu8ybLGEjBks2+MooWAbJCeytQdIWaGmOUAd/3fd+3zVEAwPoWvu9XVcV5aSlvxhhKseM4vh9qbQBwFIWUYl6UgnOMUJYntSjmVdHptHzfLYus1a6laTqcToxGQRhTL3QdHyhN02IwmY5mM8fxpDKVUoZQ5vrUA+wwuVaKqfXC+lpjtxrrlvuVbXQ9oH/dIMHLkD56OZUO31YpsHIFXnlnPdeO1iCZ9W3arJVrYoxX2jj2jfXdfP34lc/xiiOyZF28ylowyzK/1XxeCanXz7M6wDJeF4RZs+iGYMU9V0m69c/J+glXP76ytua1UP718a3IxOvLvv6rhTNkCTQI22nb61rusHXp1s+wfqfrUzXG6G8rY1kdbJbaIUIIwAuoAGMMZlkVqcAiGYSQVaex1bcPoReNpRd3ivCyHnZ149rYOkm0eJoILTIOv2UdftP41jX/LefhXAvJw5CFYbi9tZMXlQakDfqLv/j/E/dfTZZlWXogtrY8+mpX4R46InVmZckWaAEM0GOwAfEA0gZmMBu+8ZF8wSuN/C8gH8gxGjmC0wM0uoHuRovq6uqqrNQZ2sPD5dX3Hr0lH/a9x697RFYXGuDMtrRI9+vn7CPvWt9e61vf+uPHjx/zwJ/MFpiQupZFJQEjY4wyWghRSRFQQhh19d6y5hcXF9UyrZbzkJIoCc9Pjn/y07/y+nuvXr1yld5FnX3z6Avf90cXw3a73YpjhvDw9MTHiFjwCK61effdd09PT110s91uz+eLyWTCGDs/H+7t7YVh+NOf/vT05Lzdbu/v7zs6nrX26OgIITSZTLa2tlxodmtr6+LiYjQaMcbKsszzvNPp3L9/v9vvPH/+PMvzZZpOptO6FGVZep53enoupZzOZ2EcJklMGK6LajqfDF88P47C55UMeOBr+Pyv/vrs7AJXdZC0oqRTKGW0LgoaUoZ9CH3v2YsX9+7cmk3Hp6enP/j4QyHEi6fPzk5Ox+Nxr9PtdrtFLaSyXhR7UQtjPMeySeZCU0QN2Frrcc59bq3OlkvNaMx50mq3wzDw/a1el2I02B48uHPXSoFkjcAMz86tVqoqBSNZtpyOhsjoW3f3xuOh7/N/8A9+O8uK49OTdjsOguD2nRuOEY+xLYocwC4W86+++vLGg1tJHFRVdXR0OJ/PKcKL6XSxWFCErGO2Y0yV1I4g6sKzdV0boxCyjDOMQUqwVnNOkySaz6d5njLGiiJzeIJSihAxxgihKKWeFwih5vOl7kRpWdW1rnLBMOm0291OFPpkb3vH83bu370d+YE1xiP+0ctTD1OCDcEMAdZu/W4MxtiCDqIII8IZK4pCSdOOosDzZF0Xq0izQcZaiwlCGANBGDOsZW01YEYJstoasI4ZAK6ogXEupa5r6b72SdzmzC/LuhK18tT6G4asstZYq601K66TVVYbWde1qGqGSRzEAGCtpggrpdrtNgCEYdhutx0sYIy12nG326UUM8ZcjsPV8xhjKOYNdcCRCRo2GQC4vEZj19wr5coompin+yvnqwCAWVO+3aG1Ug69aa2DIHBQw6lxOzDXWGq3o8ar3KqTm3SVq9pIp4+ktWzOxwEaqzCl1KMhJZwAwlgBCJekEKKy1t68c5N7+NHjw6ou8zI9OkdhGK8I6owLDWldL6u6UEphpS1WgAxGGFlARBPiCGhrIsXK4K45ZJcFC2sfb8hVL9g47E3P7cY1Z3kNOlxDFRu/XokZNH/dTFG7zzfJDdemWk+4+cn69Da87Led7Ro2rdMrTkoBuXDBKhaxeRVXfgAX2b5O27TWOl6glMJagxBYa7RWdmO80dNsjtcd0t+64+uO+ZcfwmW4tNawZpbAui04Y8w5LUII5avmpZuoxRjb8I6bHWEDvcFrKMoF/lY8x40un2ZdJaE2yKQYX/IWG/4KgisoxFyiOg1gwbozXMkuWWvWL5gGQIDRfwpHoTnuL9mGeRgTD8AoAwD4j/7oD/NsVpTz6WyaVXUcxwSzVqczmaW2UmErKQTSQteqllp54OjaFDCtRP30+bOYs3Q6Ytjs395LEp50w+/85sf2r8V8tmSE1SJ9dfQq8LxW3L51sPPWg99qt+L7N2/VZbGYT7BSN7o957YbaqqUMk3Tsiwp5efn51prVwq7tbXleV6WZb/26z+Mosha67o/cM4fPXp0dn4ShB4gE8VBr9fzfT9NUxdIfvL0KSGk1+sBgDGQ5tloNKKUR0nr1atXo9FomabGWj7m1lqhqu04Xp6ff/3l1w/vPfS98HA4thZt97cm0znnvK7EZHgxmc1KKQlnjLHf+p3fTpfzIk+3ex2M8R/8639DQIce/+5H33nvvfeENs9eHp2cDcuq4l4ktGqMGJgrNk0qbcAgCwQTRqjPuO95oR/0kiD0/J1eZzIag6SmKs5OjzmBrf42VkLKmnMeRQHSYkEwAnN+fra1tbV/sHtwcMA5H45HRtvj4+Ot7fZgsA0AZSUwMdrUnW6ctKLJ6ASsNLqo8lmVzznzCTYMI0dl19YSY4w2Smtp1xr4jBGEKCD3RQLGCMa+H/Aw8k/Pjp3olROmcIh78xsSBJG1SEqtkbUIpDW1UbUUaIm0qXwKZUbCkNy6sX335q2Ae0cvjvNlevvg5smjJxYbKVVZltoayjBCSEjZaseiqhZpmue5VgqszdLCGIM4QwawRQZhgpAFo7XVRvk+V8oYY3zOACGtNUaEct+ALYqiKGvPQJqmrq7GGNPrDrDFohRWaABwRbRSSmxXMWelnFUyWmtVK8ap6/fo+37TbU5KiYzHOb9x40av18EYl2UJAJTSoijG47kQwtVxdbvdIAiklJPRrKlCdOETa21DH2v4X7Be9jlVRLdZs/gj6yZMZi3kDhuuBa/jxa4eMk1T1yYY1sVjbhHm5qlr4VpLUEp6vV6327XWXgzP5vO5Uspa3ST4GSOUUitNq53EcSxELWTNKEW+XyoVhuHo4nyw1dvZ217MZxfjoTEqjuOi0gZkqcCa2lqkjE7zKi+ltNhoa60RAKtVstHKWmJW62OlFMBaePhN62x3segqIHDP7hpR4PVxbRJ7denfDOfdNx3n5jZ2I0vdfPj6Ua6dxnqey22amTd/aHZZJx1WQMElBZrPmxNb9728ckCEEBizzn8j55TdO+NUlazV1mqlhJS11tIY5Sirm/5704/C1bAHrLFsA2jgb3NXeF3FsDnPL0EMjNH1hWMXP3D4oFmWuVf62u7rCTc/XZdrbgDKa89rfZ+h+YptXri7KKfM2Dya5vI3YUeTt0IIGd3cf7AWAdIAyFqMkIsPuTyJ2/3vSFO4Buzs1ZDJ5skDgCNNaG0p5VvbN16dXKSLUVllUeRNZ8vJPHXie4s8L2SNEMLMQxpZBNpajbBFWBiNtSTcQ4S8//FH5WwcUPvBO2+FnLRb8faDB5jW49GUU97rhYGHAy+8c/PWvdt3eu3OYjZfTIZJHIKoTl68GI2G/Z3te/fuVVX16tWre/fu3b//oN/vp2n6J3/yH+q63t/fv3HjxnKRnZyc9Hq9g4MDz2OdTqeR0xBC9Ho9rXWWZU7pbrlcWmu3trbu3buX5/lH3/kgz/Ozs7PHjx9fjCeU8CiKbt66tXuwP8/SWqtWr+15XpiEzlreeOvg6dOnPGS5yGututs9KbQmNux3/CSeqtlclqkRNuB+ktBWdDa8KLMUE5J02p9++qkVJcdwcXb6e7/3e0kUX0ynjsJ/Pp70tnYBoZIbYwymBGuw1jJiwSIDyCJUCCVQHQVeK45jzqlFxTL1e92tTkK0RLLKF/KL6WR4fraztbW/tdWKwjy3i/ksXc5d4b3PaRB4nudauGlAinM8m82mswuLkZA5WJzly+cv8sCPWq2O57EXzx8hhLSycRwEgaelCYPAuxusWgJKKQGwUkYKJwtIXJ0CIUQqUVUFgGGccM6DwMcYGaMJRdyjQq4SBHUtCSEIkaqqjBFgCQLscX+eT0I/arfbnVYPGUsMGFPVdeFRSilxwrHucMvl0lrUilqMMaEVxhRjCMMQESyEELJaLjKtNKeUYFoWlVKq1WqJyhV/Y4oRIgislVJKLapKVLXEYCillBLArgk2ckKB1iL3n1IKLEaAKCGMMJ/7xjcIIc59a21ta0pY45W1lsaYUpaiklqpuq4xEJ9bUQsA8DwPAy5yFcfx9vY253QymYzH4+VyqY3UWruLdZ7ewQWtdV1KvJZrdOjERRFcBgfWLLzGCeF1ib8DE25ChJBLOLkNHBHPGYKIMfeF0VonSdLMH0VRQ0FvBiEkTVOXYOp02q1Wq9PpCCE8z1ssFlprjMFJUTnIwjlvBQlnlGDkcapkXRQFQTYMQ6lqA3b/xs2qEucXQ88PqqqMk/ZoVueVVlldVaIUtRSrBpzGACKACLXWFagjQNgSqmSJVtJYpjG4YK/oIK084fq3xkNfs9EIoWs2tDGXjS9t/vQ6Slj7gCtGeRNPNC4c1qRFay3Z0GJa7wOwijTa5iQbHwMb9v2NP5gNtqab2L5pXLs5zQU66uTrTqWp3DHGNBEvF1W6dls2J3/dd8KbUIL99tD35pybR/m2jTcdnrt1LqFm13LOFhHGmFm3bkJ0FcM3xlWfNUGI1YU3aSb3FNavyGVEyr1pWmvXNNUd10UUjDGIbDb4aNAbZoysb+8Vz23BAKC1OPRKfKkRXLKgAVZSCmvE8B8XUXgjwGru/+aza/5qjMHIApDt3T3uhZUAZVCai0qISlYYY8IoIAKUaGOUVQYZgwFTgjC2ANqAVBoQQozdvX/HJ7frbHbr7kHoUS3LVy+/BCj6/aAVtyMf9TsBw97e1i7DJF1MXx0+nYXRvTu3F7PpdDI8PXl19+GDnZ0dl0I9OjpaLtPlcjkej+/fv++ewnQ6jaPWD3/4Q8bYaDQKw8QYtVzm33xzijGez+dr5cDK9XsTQo7HQ89j5+enk8mkNpJzvre//7/75//1cDj+5tGTr79+9PLklPpBXpU08HZ3B4PtfrvT6nbbCKFsOq2Pnt/+4J26qK3Bv/4P//5X3zz9m5/9YvvGfkZsanWOoWYMGFNWl2VJde1x2mon/+yf/TMkKl3lT7784qTTDrmXLpdFmgXcI4TM06UmDDNaM2uUJWvEjDF2hW+UMq4pRRiMNUpZhEFpoNhKubuzPb4YImvbUSzr6sburhLy5NUxJqCUmkxmhNJbt249ePj2nTt3aiLOz8/n86mQlbX68OjQqebzwBsOTyeTmTbgeaHvhe12PpstTsav+v2+MQYBCYNAE8s95POAaq2kVMYYjKi1yAIYA0oJrSVjDJCt6zLLlhZ0q9UKAp8QtFzOMcaEYGM0IUTUCgDcqtQYrZWplRC1xJhqbX3KGWBQ2iiDLSBKPcYRhf39rSThSaedFwXGmPuesubpi+c5Dlxa3RidJEmn0+OclmU5nc/yIiUYI8uQQUqLPM/jMKyEdB6Oc84oa4yCE4oBjKW2FmmEkLaolrrM8zzPGas451UpjAbfYwhwWVRGKYZZJ+kQQqwxdV0bhJU0GBFXK+ViLS6S7yPfVRzUdT2bzQBMt9sFgDyTLr+wXBaz2cyRxquq6na7OztbnPOqqrIsWy5L93V1ezl75xCAq5Z0psf5J7LqVOQ8xKUlbTyHq35sjHKDMJwJc2lmJ/TkTsasq7ZcuqERaSCELJdLjHEURRjjNE2dhLaDBW5Lt0sQuOoKrx14eb7UMo/jmBE7zxYY436/XxRFt9tP2p2nz14+f37IORUSTs/G81SBXeEeobUT2DSAOPMtQmARWGwM1JW2Vhmw1F4uEMlaVNGYy0KDN/rFzYzDho+/dAwbjvMKenjdzjZbrl1m0yXk8ojNzJuueoXDiKOXXnG0zWzNo8TrLoXXgMLm+bx+FADY7Ga5OdCq5NLx55v/AK0UpS240wZrwViwrpuBVHVepPPFdDafZPlSSOHInk0A45c4frtmNrzuqP5Wx/+3btYM9waidVkv1RrWtB5HRHWvcROlu3ogu+KEbvb+WP91lSxYNZzcvOdgrVVKIXz5qrjVkUMM9hJtrHpxYYy1pqsX4zJ+4IooAAAsMhYAwKlAaosAAbVWA4I1XLh8ZP+x49rLvGkrXr/DBoBzZsEoLTwvipLuZPqZlFXUDqzFCDMN1gLCBFmEpTVaS20NYKQRaLDSgkEYYQqEjqfTFy9f3trraVnOlqPKp6OL87qaK6G0tvNyYRXaGSQeC1sh85ivqiJphcjavMqFLPZv3uh222mavnz5crFY7OzsxHEMgKIo2t7enk7nvV7PWrtYLMIwdHTF5XL5Z3/2H5IkAYD5fH7z5k2M0e3btwghh4eHs9m03W6HYTgaDVutZDabUkqHs9F0Or15cOcf/t5/eev2XepFeSn2bx60Wq2k2z46Oax0LawyRGMPGaPPl4tRsWy3ukLIVtx9+NGHF4uMhuFn3zziQbIo67xUBjNtiCwVFvWd3R2j5cuXL8uy/LWPPvz0b37y5NHjWwc3dra2RVnFYeTHycV0HgRBXpW6MCYgjHBCqMUI9NqwWKOVYoT6vkfAClkizrcHWwe7e5AvkjAaG4ss9Hq9XqeravH5Z58VVd3r9Xr9HcICQsj23m4URWGre3L4zXy+mExmw+EQYWuR9jzm+34pJPfY7u6u58fzWbpYpHVlp9OnkuOotT2fp4vZIkkSznxjTJEWjrGojLGY0rXSuzVWW2PxuvAHIcS512ol/X6fezhLsygKmhx2WZYICGNMa7sm9azieJ4XJARZi0RtqrIGAOIHnDPGaVrkCMtainmeLrI0zypghAbe408fuTw6YLS9vW2MYb6XZdlsNinrilKa5UvOOeM8yzKw2ItiANBYI7Oy4K7c0RhDKSMEG2OUAnd6WZbN5/O6qN3zkFL6nscIIwSVeS5qhREKwxBZLCqhhKaICV0bjI0xsnb6B9Rjvsfqgxv7PvfiOOYeVcK1O/KMMVpXTtUuTRd5nrugKEKoqqpOpxWGoVOwccsghBAGatfEAlcI7oiizTLFrIe1lhBizIp84L75Tt7AMR+bLZ0JcLbSCOGokY6m0LBQG5RgVzTMVWuowWDg2EAY48ViIYSIosgPuONAuJiK2eBXGl0xarUVZbVkzNs/2NNau0cQhuHxq7PRaDSbLimlykCWzaVYmXJMCQFmMQFrjbWEUGuQthYQBm20klJbay31ANYx3sblr1+zSxPvQIHzjk2aYBMoNCvjTaDwuo/fRAB4XRW5aYJds+lms81zWDmejRlgrQBtNtpNoXXdHLzWsHjTysNrKAFeyy9s7nJtvL77GpFcNrOADfBhjCnLcjabjUYjJ4tiX6vxs6+hqM1zQ68F/K/dpV++77Vd3gg43B5onSNwgkvu3jY5CG89HG4AuxkRcekHCwD2KoejuUbjcjRvJja+4WwuQ0Hrc2tw6tV9V28p4HWLKevaRJlVkAMZWHEg3IX/p8onbL5Fv/wpaACKsAHS7vTee/fDTz/9VKmqFqXUUoMmDGshqqxWWmOM47hFgSCKDFihZK2k0togFkZRLcXh0ct+1/OwTfOlF7QqlelqQQzKF1meVx4P4rBtAYrcdncTqUpjhFLKgGz32p1O5/T0VCmyWCxOT089z3MasGEY5nlOKT85Oanrem9v7969exjjTz/99LPPPiPUuAqvVqvlQO1kMlkul0mSzOdza+14PP7iiy/cLg8ePHjybx8XRVFWhZSSEj8MwyiJoyTe2tkOq/gXX37y8vjF1nant9Vpd6KiKPZ69+KkYwza3r5x5+b9upDji1k77H12+tiPjQISQOBRqgBZQpOkFbWidhzJsvj93//9fDwaHh1GQUAQfvzNN8enpwf37nlJMl3MgyhkQColJTGccY8yZJEBBYCRIQiZSkmELAFEMOKUJVE86Pa2B1uVUZPZnPt+q9PxgtDzoyKvo1a35/IvUbJNvVqK4/Ph6elpEIZegD2PYcTGs7Hv85t3bhCCl8v5YrHs9wZBkGiDsqywhgwGO1LAzKiiRoevRuPxuNPqNpZhhbgRQpRhjzNjQIgVgc5aixBQiqM4cLBua2tLqjLP806rW9e1EIpzXhQFAlfor4y2nHNKOUIIY4oxzqap74VJJ0IdSgARQgBJY6q6zmemrOqae97R0dGLZy8n40Wn02tyjXbl761rI5nnpZMBSJe5H8itMHQSbHaj/w3XHGErlJJSEoqdkxai1tYQsEbrqqop5ZJpI9WqWSKmAICs3drazbPMWpuELYxxxT2CUBiGj5++cD7JxfydMBRCKAiiKCr7/X4QBFmWLRYLhzy63a7neWVZTiYTpVSv1zPGuNYjCCGn71HXdafT9n1fCBFHsbVWSpnnuSMHNFREuw4qbF4jol5T3O8iBA4BOEvUCCshhNx5UsZcjqOqKmfFnD11HAUXLXD7ep4XhuHBYGs8HltrKV0125RSej5rwIFLDDdMharOdnd3lVKj0SSJw/fe/7Cu5ZdffimlXC7Tw8NXrU4nbvWGw2G73Y1jqqq1V0bIGgTaOAqtlMYCEMIwoxghSjglzo4Xq6DchgtpEi6bbmxtoFfv87XxutNtfjbrshS7wY5sLHsDI2BFE7nSLfDabNfcMFz14rARwIA3Le/QBtnt2sybF9t8jhAyq2Wo84BrMiPaLKpbcRHWuRm2DjM4hGasNQBWiCrLlpPJaDodF0XmaMvWkvks2zxD/FqByRvvKlz1/a//9fV9G3T1y70aWqeTzFrByX3oxB6aX+26tRVldONm2oYMYjbybrD5mFZhg80ntQJYGF/iTrIeaJ0/cqMR6nBGAyGE8JXSG3tJQbgkMDomKiC7WQrhuAv/WfQUfjlWcEWdUiuldBgl88VSyLLbTYSUgIH5HtLa1BWipNVuU8oBK8KotbZWsq7rWmnfwDxfAPh5WQRh6BGxyGa+D4vFbPr8cRBEUiqjcSsMPYaUrOqi/Hw8poTfuXdnMpmOpxMp5Z27d6Mk0pIul8tVz2GtW612HMfn5+ec+++8887BwQHGOEuLZ8+eHR0dKaUQBs/zqqra29vrdDrdbreqKrfU3N3d3dnZmc/nx8fH3//+9y8uLjqdTqvVevvtd2/dvhtF0en5cDwev3z58vjk7Ld+97eiJPKjcHtn6wc/+u5b797rdOPFYv7056dv3X6wmC3fefjOWw/eOXx69NlPPlESAmBMIjBAlNFGKqV4GLWSIGm3Hn31VcQZIeT8/PzzTz/9B7/1m7/2/e/9q3/1rw4PD6N2B/L87OzMMkY5o2CpTzzmc0KtMtoCxkAACAGkaFZldV37jPqMc0LLohiene+2k9PT8/39/X5vy/eDRZoPx5P79x+ORqPh2QWdTMO45XleLUxRKz+iHveLPKeM7O0ecI9IocfLkVJqf3/fsRqHw3mWVR9/54e/+zv/4Ozs4t//4otlrk9PZ0pZz7PD4QVGqN1u07okntdxd7YqNcbYaCuEcExGSonvt3zfT1qR53lpmhmjOQuHw7Fr9Icxrusqy7I4jp2z6XZb3W63iViqO+FkMuYERSETRU4wdKJICQDjEUJ0DR4JOYnnsyKOO7fv3KPRgFKa53lVVXEcA8G1UlEUOxjOOd/fu+l5XpIkVVUdHx9jKwlBAGCNELVepaMppZSq2gn5E0KIFshaTElAuTXGFrqI2+1W0nFNGYqyToXgcVzX8nQx+/DDD7e2toYXo3v37m0fHPz3//1/b6394IMPrLXOQRZPnx+fnRFCTi9GVVUVRaGUVUZ4XhD3WlLKWTELuzFCSBsTdcIwDIPQX2bLNE3TNOWUVXVR1UWe51EUL5aLuq4ppX7oKSN1pQCBRYZ51Cee53lN/psQwlnokAFjlCEotQKC/TBQSglllFYMIc6oRwkoWUkRhN7FaOj7ftJuaa0Jo9u7ewBQlqWqpDHWqdxZo7QhFpjIy9gLHLG8FSWhFygtq1JEUSSVAk0w93jok8DThNTWYmCLohZ17fl+lmVltijLEmTBUD1fZkkUqDrL8tIPaFYsrLU86ap11MQiAgQsArNOCde2BiUaywsYEWzBydxaMErpNYvt0viuu/ZiC0hbxK60bGhwJ8Z4RRpYF5radRHvJjhoDGuTrdj0KBhjQq1jgBmzSXxzLNRGVsiAXYc0ELIGW0CAVr4GXab5V3xDY4yDggihpuYIALQ2TVKcUgrW4pX4wmXEQkvn5wAAYbiEKUavlRUaYqYLy3tMa+2aWVsLShm3KJdSW4uMgbqWQii3YHBU3NdhzTUQABuO1sHcTa/vhqtgbHa5Ntvmr02av5l58wdDjDIKG0wwI4wgimpVp2kat9pGWQyEIoItwnp1K6QRzbPDFhCA1cYCULeON1avRJSbmA0GbAFjxBBBmCBiDTLGGDBAMbIYA7EACmkAZIytkSWE0FWmB2NtFGhsLCKYkDV/QRmLwWIghJBG7Mu6qIbj5+KVqVqFMghy9S8IGbhsjw5rtAcrrsObvb4Di05ao/m8yVlaN9X6nhPAWgOiIEvpc+/dB+8e7Nx+8uRRzXQr7k/nEy8KIp/LwviRL0tZgvT9ACmCgRHDWgHLp/PdTisKw3I6pHLXZGONyxDX5XSqlq9u3tg5H052dm68ODw7Hc/1KKsl0gpHYbK71X55MXv2zWOk1e2D/ZOXR2HgWyUXk8lHb98NovjsbEQwv33r7nfe+/hv/ubni2lxdvwLKWVZ5i9eHtZ1fefOna3dzvb21s2bNwPPr+uaUNRqx0HInj9/Tgkaj08Yo//4H//9s7MXnsdGo5f9Lm+3UZSon/78Dxd58dNPfvH1qycGobd+7XYv2vrB7/5IayOE+vlnLymlDx8+/O6v3yKAXr08Oti/9eTFs5eHL5bZ3Ci7u9vuD3YtIpPFcp6mi0wQVno4m01UkiRGisOTs7IQNQ2HFSxR9NFv/97U0mEpfEoUBotku5WMXp2+tf3BdDp97/sfHh4dvjg8pD7d2dkqioxQq6vapxxEFfnBoBNYWaaZ2vP5/vZ2L47b7faLFy8+++yzOI41yFar5cX8Bz/4wXg85py32j4lOs9zWWMMoTW4KOuiwhcXF4s0/cEPvt9qbYdRdHz61wZbP04efPABiYNX47P5aD4ej+uy5pyDgU6rp7WKwoQmSQQAUkopBQAQirXR1mrGfIxxGIb9fr/TbTnefp7nUoqqqhoVGgBgjLVarUbqx7HqXLi7LMtOv6WFsdxWeWW04YxJqZM4phj3ut0ojKfTaVUXD9+6W1dyvhinad3tdsMwdO/3SjXImKIoACCOY8f4W/cdttPp1JlR3/e9gFKKjTFGGyezWEvpfMBKgZjgKAgRQkncjuPYtZszBqSUw+HQiSsQQjAivW6/lbT39/dbUWd3/xfj8Xh3/873vve9drv99OnTyTxX42FVVWVZaK2BUIRwKcQiL3jEEULcY07B0PWcdIRNY0iz4HCAQ2t9fn7etJl2q2SyFn91SyKHThwJw/M8rZ2ypwEEmAChCGswRlvQmIDnM2stwtaCBoQoJcvl0veUMaYpc3COw6WNOOdJkhDCXNMKQojDf46HUYkakPU8L4giqWpXekAUMoaDsciC1YYHoTS2rIQ1aj6ZOoSRLdOiqKQy2tRVLUshPD80gIuykJA312XsJSFxtepFqCEkOqAAVl0auzVD0BjrODGUrtLSzqMTTFwo2Gx0OFyt5Da8XcPngDWGuLSz68XitdX8hju8PJsN+3yFsb9puJtoxDXn2nhQ2CikRAgZo9945q9HRK4d6I1Hef1wTTLr2j1xECoIgjAMXb+xFTohl9mH5ribAYDNc7jm8u1ViuJ/ymgmaXBbc8cc491V3qO1bEkTlmtiPO59a6YysIo9YHQFuxht1gcCRBByr9OqURQYWGUDXV9cjDFgcFm/NSxd6S4Igpqgw7WazKsXZa21b/jbeov/lIjCtUf8xqE1aKMIUM4585jv+2EYUoqHw6GX+dwnZVnKPA0CLwjD4XBIGFVKIqSllEAxpUwDiKr2GfT7/SRp52V5MT2Rxagd+xSj6SLTBs7Hk1JKMERIJS3hLIw7nRu3b3LK6rr+6V/++Hw0/Oi9d+/du4OUmC6WZa1u3w53dncnk/mf/tl/ePz4KWOe1FpKTQgKgqCdtPbe3rl//34QcWPMZDR2XaSllE4/uSzz/f39waBnjamqOk1TYyJrbZx0MPXyov7pzz49fHX09MUhUOoHASd0MZkus8xahC1MJlNCSOLR7XfeHU9nx0fPnz3+Cikghr777v3FbHH3zkNMWJrnN+/cqJT+65/+7PjsfGdnsLt74/jlURLHcRAPT8/iwCecf/7VVz/5yV9lZaWMLucTYSwlLCtKP4yW8wVjrNtqdT76ThyHw+GwzgqP0UqK2A85xoDwnZu33n/7baO0EqLX6xFCLi4uJpNJWZaDwcD3/aqqXKhbKZWmKQDMZrOTkxMAUCrb2dnJskwpVdTVxcX5YHvLtRd49eoVAPzwhz989913b9298/XXX//85794/uICAIIgSJLE9z1jNMYoCD3q+RwhhDAUZeq0gZMk6fU6eZ4TgjyfRXGAEJrNZi5jnSQxADjqvrPIhBDf913TRaccTNYtfSmlZVbLyvgEp2mGQEuUn2fp7VsHNw/2KcWM4/HkIssX7XZ7OD4fDofSdjqddhRFAI0pV3WtsiyVUmqtCMF1XcHKZIDnec0iBq95f8hoY1Rdl7USQRAQirUxCAzjNIoiz/OcWSGEGAPOB+/v33QuuSwqFyTgnI9Goyja+83f/i+LohgMeuej5TdPDqfTadLt37r34OLi/OjoaDIZaa09P4i7bcYY0rUzD446oIR0bTP73S7GjYgbbsru67pqGAnOxrmiR7xmwqO1jIzz63Utm41hnQuwjmy1TljARhm9UkoR1agkmRUlc7VodhDkMt1jLcaw4k5aLeoKERxFQSsO56nyOEVgKKEYAFltlDAYCmOUUqKufMYXaV6rE2yBMaYBEca1RQYpC9gAJoxpU9Z1jS7T/6sKdYtgtcZ17+JGsHTTMeBLfgBuHjdZl4a6vZxE4TVz6X7YDDA0CZoGZ8DahZANTUM33INYu731p1eBgotRv9Epvm6mnT/b9HbNzxi/QT6hOcYbGYXNJ7ABFzYQ2GWpp3sfrm3vxmayv7mlGGPzLT2bmhmuIYZrWGETkfwdxrfdz+Y5ojWZ0TWzRet8gUM5GGOELgMGdqNgxKhVpIHg5s5jAEDGYosJEOTahGKwFrC1hDGniqStAQvImBXXmK6A1CqUuRZnbHrHW4spJs38mzf/EgRcRX6/Aqfzbx/oMnD1SzfDgJt8h7WMsV6vkyRJGPmz5TSO24hAtswxRbgukySqpQCrEWACFlmLwQJAUVRRN7HIng/Hg7bXTSIjs5PT8yJf3r/zlpeET58dVspiZrTBWaUwKnKpkn7/O+9/8OCD9756/GgxmRiPkzjBVRG2kjwvHj17Wtd6Np0Lobb3dqtSFJNJXdceY4qg9lb/7q3b+7s7v/jy09ls5mjjxqxqynzf397eBcAnJxdFkUVRJJWZzpaz2ewHv/5rUiuEvdk8N5q89fDd9z543yLUjpJXr16NLy7CMEyiiBghSzE9O17s9Yo87XT8k8Ph+HxU5bKdtNvRVp6NW53eznb75u07cacbhPQv/vLHlMqL4cgAkspqY7OqbrVaxxfjFycn4zy9d+/eNJ2Pj17QMKScFbIMW20oNCWglfjRj370zoO7X3/99Vdff5EkSb5cYARFltd5NojbO91+nmaaeaPRCCF0cXEhpXSiy1EUZVmWpqnneWdnZ4eHhxjjLMum02m32z24ub+7u5vm2fn5+dePv8EY3759+/nz53/9s7/xg+DBgwdlWf71X//1n/75nznwYbQihGAE1mijJQJDCeKUUYKV1hoj1WlHvW7SEOyj0A+CIPD8uqzOTk7Pzk4xxr1eL10ssywzxjj9YKWU53lREIKx7k+rDKIx7plVeU0MYoQX2mBra1mPR6PtQZdSPBpdaFMLWShVzRbyxeGjsiyD2FdKaM2NUY7MjJBFyO7t7aRp6vt+GDrlHx3H8WDQK2QmxKotk1SiqktjDGCLCSIUAub1+90w8h2x3w8CRgL3FXI5MBc18f3wnXfe0lpz7juugLHaWnt+ft7uRRazrBTLoxNCiBAVxuTmnQfGqrutZP/27SxLZ/OJW4QBQIsja6020pE9KaWMEc/zXHtGAHAowR29rmuM2DreYNx1ueCH89+ux4ELTqyhAyBktZbNUpgQZC3SWrov+9r9I2u1UiYMQ0Y9t5R0w4XqPc9TUkspsyyzFrmzJYTESUApsRZzxZm3orAYYzxK/FYbAIxVxhhQ2oDUFjIjwWpjDImYH0acEiGEUgYAGUDGGD+IlK0qIX1EEXEn7Ayo1UKteJoIhFDIla9h0izxm24I7qIwoutCR9ysHfG6yZP7FTai1rD2ppvOrHEVDmQ0ObJNmgJc9dCNzXW+Zj3163Z546DrGZpKjeYHdz6b/nvzbBt3sjn5pXt7A5nxEjfA1UUk2oglbF6+263hIWmtXRNzJ6XqAnjN1ELIzVVpc/5aa/RaOAFeQzavX8uvODb3unqBK6dujXVAwZ2t02cUQmBCG6Bj1+Se1bguNeH+vSSKIoTMWglDaQsIuS+ARdZzOssIACxeqS2viCHNaG5RE9Oy6068zc943QV0fQLN+Vy/b+5u/h1u3X8UMnMiUQBgrAJEOt3222+/nReL58+fVVVV12WURJ1uS1sVhuE//If/8H/4H/87rSz3SOBzqSwAgLHu5hfpIp8Pqa1/4wfvRlH35Ojl8GJ8//7Hg+29n3/2ZFlUXojCVqfWYrEc14AOT48fvPv2nXfe/sHf+3vHr16F3c7FfHH29JtWq8U8vy7qyXy2TPOdrd133313Pl08fvxYVFUQeEWWz6eT50+fTMbnZ6PhZDKZTCYY41arZcAUWWEtVKVk1Pe9cL5Ij755+sWXj9rtdqvV+v/8j/8zpfT23TtnZxMeeHduP/iNX/9tZRXn/PT4uC7LVhj0WknMWV3XrSR5+eKREKIdJ4Pt9vMn3wxPh/Tm3ft3H9y/93A2T0fT2dn50QDkwwe3Ti9e/skf/1nv49/96KOPz05enZ+etXtd4vmffv1lHMeDnZ2w36mw5VFssNEIEGGYe0yJssyfPXn0D3/3tz545/vtMFiMLyI/OMmyOAi7PJRxst3pybxeTKbtOOltb2GMEQJXj9ZqJXt7u+t1lzk/P3/16igMwzAMB4P+nTt3xpPl6enxbDEfj8dB6DHqnZycrGhznW4YRv/uj//9dDoN4xgAsjQPw0hrLURdlhogkLLWWs/mQGVdLJdLrfXW1tb+/j7nfDgcnp8Pb968KaUssnQyGo5Go+Vy2e/34zCsqopiDE7ZHCG9ViRYzufHR0dZlrk0RFEUURRFQUDAUkaJNSHzCDK1lb1OezDocYqtllprhNxKzASB3+p2uNfxAypVWYsckMcRBqQAqSj2lK48jzKOpFRGCUCMMm5q7fCE1nqZLxeLhVKKchJFESGW+TwIie+71jCWcVSkaeMyMaa+71vggNTLo2eMsW6nzxgTQgtR+D4XshyNz5fpcr4YYYxv3Lixd6PPGIvj8PHjx5QS3/cwsQhbSmmep0qpqsoBQGnh1HDxuuPzcrnEawlYs/5q1XVdlalz29Zax9N2/aKaFSdes+Wb3K0zBE1wGK8FrR3CwBg7qRDnAChdJeMb5hdj1K0aXQvNJhnhPhSqVkYihBCB0A+0kVqJ5WKGMSRJEoahUirLUiGEW7UxRq3FSgqrJAbr+UzLuihySqmUuqhEt9tDVmfLBe1RRomQl6H4DUu6NpcbRAFnv9wysXE/679atIqii+bMXcCpsazX1rjNWtOugzFNnOA11/vLht2AA1c/tnZdMb9pstFr4YHN62p+bTIUGF/qdm+eW8NXfe0QV9zeG4/1OhZpXgkAcBWzDjLOZjMnGNoAgl/lnlw77us+/u88mt1f/8FdRVMJqdaj+XY7VgTBGl2+AZd5ffctgzWVr7lS7dig1liLsDEKAFuLsBVKroQXV2gAXEcGvD6r1SNDeP0cr4DCBrIQuiFItUYa8G18w79D6gEh2JjqKih5w1iDQkMpBgydTuvevTsXw5PDw2c3buz6oWeQioJgvlwYq956+0Ho8WWdWc08zqxVYFZkoDTPOaBaVC8OX7Vj7lNVVHpr+2AyKW/d6fYH+4ujV8us5Emf+YFO80LUry4uDk9OP3jn/bc/+vjG7dsM8HK59IkNPB8AIyDv+SHFjBMeRUk2SJVSBNm9nd3xePjq5YsiWypRzsezLM3KrIzjuNfuEc7quvZ8n3O/KCpjLaO+F8Sj0WSRXnjePO60vcCXwrZaHYOgqKrj0zML5u7d24s0nU6nlOIwDJE1SsipUmGHB4Ff1TUlZL5cMo9P5hP/zL//4K2f/vynX3z1dSXtW++8/U//2f/2X/yLfxFE0b/59ChPF8v5Ik2XhBDMMPV40Aqny9nwszGiGHOcZ4XF1gv8qiqYNXmVHh8fTqaje3dvc4oogKlqXdaEB9v9XpIkW73+bDabnI9bdxNApqorbaRb/Z5fnCJsO52OI9pThnf3tuM4ppSenJwMR+eelxRFBmA8j7317vdHo9G//+M//e53vxsEgWuXBRYHfhTHrbquAaisc0IIp0CQBaPAKIqtRwkdjc/c2mI0VnmxCIM4DMNbt25oLebz2WQycUoAjHkY47Is2+22q8t3i8KGAF9Vlcs7mHVpvvOUPkcYkFZVEvlKlmVebw/6PuNVVbVaLUqpEFLUsr81ePvdDwghXrjDGFsul0LWjFMLxliNMBRlLpWgjGijalGVZSmVSLNlUVe+7ydJ4nmsVrVbbWNjLUjuUeYRqYRMKyGEMQrnpMoVWpOTCUUIS6lyW8qXR6MoitJ0PhgMqqoqq6WQ+TKdjucnSZL0Bp7WuqzH1WjighB5MV0sFrPZzCE7SqkrEJienhJCMFmv7CldRQ7WHhpjjAhYWPH2lVwZu2YB2gR1nL1zfX4BYN36QSMElBIpXc26gw44ilYkRyeKRYhTvtJlWRKsGvafS+h6njefz9FlF+XL4pesSNEqqo8AA7JICKG1RBY8xsPAxwgoIMCIU+JRQgjS2mgtjABV55pZAjrgpN1uFUWVp0tdl8Tq0CPbvXZVibPxfDPs794iu65uB4w3GOUEMKJkZYWVUmCbcH3TtOkyWeNuF9lYzG2uHV3MBl4LyzfFIO6ThkTy+sbrf99scDeBwqbFbwI/m3gFIeQc1ab/s6vEB2pAYXMVzSebmGB9FLu5e3Nd9rXQyOa+ze1CCLn31nWULsuyEdXA69qZa1jq9Wt8ff5f4pl+9fFGlGDM6rYQggkhnu+7SkgXcHZiJGStNmaMsUa52+4IBM1pN1DMXA3JYEIsgLGWAFLWYAvUAFhTiRqDbdw/o3gdObgkT2CMkV13s/RXddGbz3fzscIGULBX81b/WVIP66n+lrlc4BYAOfMihDBWzWZTz/PuPrwNGIbjC2WVE0CUst7b3VrMZ2WeEhYQhA1YSimjntU1C3yfdSilWVpVSChhPI+dn86q9+zbDz/KK3s+nkiplbHagMWkruvj07MoanuYdnrbvXYHA5qddabT6cnxWb7Mep3+wY2bxtgXL14s54vh6Dz0/HYSI6vLIp9PZ57HJrNUKFXmReD53W53e3tXg42i6Mb+/jePnzx79kxq3UoG3EvOz8+n02ln0D8+Ph5PJ4tskbRaw/H4D/7w31ai+pf/8l+GrVZvd7e71adhmOf5ZDmfz+db252//9u/E/qRrsW7739w7/YDbLHPgycvXs6WedIZkKr+xRdfVUAePHw7q+RWuzU+PeEYdre6tZS7e4MHD+9ILf/8L//s9PS8O2hv724BUsZajHSWZ4xyGlDCyXg6PDs/vrg44wQbqR7eu1sWBWijajEdT0aj0Yrw7vtOE/nOnTuMseFw6AStnT8FABfpb7VaW1tblNIgTI6Pjz/8zkePHz29GI9+9KMfCSk///xLwngYxZz7vV5vsUgXi1QI0W51a5G6TtFlWZZScI/t7d24f/8+5Qy3khbnXAqdZ5mWcmvQe/DgwVdffRP4vN2Kfe7hlXRgoKUSVe08mBKrZkiiqvM0y/OcU4bDiCDsnAoYO5tMb/QjB9Du3L2Vp8tjK/Zv7BIMi9m0N+jXlbQGWUu0Qr3etpQy6bSUUpTiIPDcQgHA+D4H4JRi3/c9jxmjMF7F8GHVEEFQ6rs2RYAM95nWKgxDQnFRLKuqsqCRUzvRiHNOGabUAqqFlFIVGOM48aLIs6gytjK2mkxTC7UQYjQ+mi8Y55xRLwgCzwuqUhy+mC+XqRBKSsmoB9jWpVgsFovFYrvTAQBjFULI9/3A8130RkmJEDQmDK17JQR+3Cys4bWFxaZ9WRlobAghfsAtaKVcyyQwxvoBJxQ5AEcoMkYpLYxV1q60mddB+1UUoaoqglcEBUJWIWVjjFOUc4cGa52mLxirjJJ1JUrPWo2s8fm6VB2UttaL/HYrKRYTWWSEkIPtwQcffDBbpLIsyqpgjN/e33v44N7p6ek8rxvD7cTBAcCqVXy7IWNv+HLTDFhngp3XdxDHWusImAAAFm/et837idYlc00WANb+sklebK6hm73QBpPA/aExwpsG2V6NHl+z1JvTbj5f9KYocbP6bLzdCiet/3ptkk2U0GCIzWkb6ADrbo1NqqVBpQ6PmrXqg4MO5lLv+W+5rmsg5vUt/2NxwxtRQnMtxhiDjPNtrnXLJVNHCISQq9CGjcicozQ174PSajXhVaDgM7b6moB12yswKzEGDNaC1RZjrC0QsAasq55osGkDJhpuDQCshROuQ7orra5fS9nAr+Dm3zwQgl/5bq/zdMZaY6WSskYIVVVR1cV0Og1jv9ttz5azra2t3/3d37579+7HH31wenw8HM9C4jNGtcFKGYQQZR5Yyxj3g4Ayn2IkajKbZyEKRmfTh++8XUuzXxQaw3AyLkrZa3fiuFUW9eHhoc+8JEhkqTqdjh8nXUItkBfPnp8PL4IgCv1gNJlgY7vdLta6LnOP8YMb+71WEoZhZ55Za09PTxFhURCHYVjWEgFRCm4e3EaEPXny9PjklFLaG+zs3ri5WJ5PZ0MxlPfferh/8wBzdjI8P7hxh8VR1O21hPDbbRaE/U6vs3tjuVyG1B7cfiBr9dMf/9XTlyfnF8t8mVdFjRH3/OD2/ZtCG/n46adfPPrqyUtASNFgORkighGCTr83GZ2PxibL8047Kkrf8wlGhjOsjERWEWQEEpRj7JFX58fbW30hxIMHD4o029ve+fKLL5az+XK5DMOQebzn9wmjSglKsefFTjhysWCMEc9jSomyzI+ODo+Ojkaj0fvvv//ee+/duXPn7HzMORNCnJ4dv3x18o/+0T8Kwt/78Y9/0up0z87Onj17sbN7o9vtAqaTyaSu6/5WT0pZlHktKs/zOKcYgxAVvXv3NsY4CIJWq8M5twa5Rd729iAMY8ZYXddlUbsCfa11WdaMMYRQ06XQcRgppVtbW2gtzUbWveGtlVHIoyj47scfllka+uze3dvj8fDJkydVJZRSUZRIBXleAWZKGZfsr6rKvcculugavbjvjwtd4DVvMYoiKVfyA5WojFWEIMZYlqVB4BljizIrioJz5nmeBWtBAyIIGwtKSG0tMMYwYVJqIVCWCYyhruvxeGxBcc4xrnyfJAkTtZjN5r4f+l7g+0gr5nEiBKnKernIjQGC0aDXDzxe13WRV3Vde55Xeb5SIs/zbrt9aeOUNnaluoiRK4RbpQaaJYvLLDS6TK5MXGtN6Iq6Za112k1uuHS7u2nGGCGE2yWOEkY998jcE6zrWgjBOXepByklxtrp1SCEWknLrvPWStZuZkqwUggAhKiQBYSQz7nTsQh9z1rbjqPt7e3FZHj8csoZiaP973z4wXQ6ffr4m8OjY4+Q3UH/4Mb2bDxqtVpNEsQJkTkXuDK1xjhnuk4tu5LD1fYEY8aY53mUMicsTSlzoEdrzRjzePDtxhM16zm0ZlPajSpKtBEittY2VTzX/fq329yr6OTSEL+Ro9Ds0sy8OUlzbrAOaze8gc2TgW9xwNem3fS1DSHGjQa5ulhCAyXruna0U9cWqpnql6ckNr3gNSTxn2uQteyHBg0Atq7zPMeIZlkmpRZCUMbDMDQG3BeH0csbstkokq0Fu9DVEBG6HGCtNQiwW/xjvErnoytj84ZsXqzZqKq1YN/4mNy4hmj/swx0VRX7jXh0YxhtNFhLKG21WgcHB7du3VosZ2fD00TED966P5qObG0ODg46nfYH773/4x//ZDieIWwJoUgjo9wixyhrJLJFUV5cyMi3Pqe+53MZDs8nH30UPXz4bnfQFVZ/+egxYPrN40f9vlLSlHk56A4YYkVRhaEadNqAEODZ+cXo5eGh5wXvvfVep9NJF4t+v18sFmmadjvt3d1tDNutVtwdpwghxlielUEQMOYVRVUU1enpabvT9f3A9a3qDrY6nY4U2gtkGHmYkrfff2+yWLw6O5lMp9/94Q9enZ48fvbsmyePnSP76KOPPv7441arpfOMBfGLw8ffPDmMkp7HfEajKhCz2dIPWxfjWVmr3YM7Qad/dHyqjRmfHu/s7Eijgij8r/7xPzo9P39++Gx/f+f49ATwXlFmWbbURiIAo2UU8ryohDFSyhcvX967edsPvbsP7k8uRlpop5EThmGv19va3RFCaGNcysBFpk9PTx89epQkyXQ6jaJob2/v4cOH29vbn332WRiGLgNw+/btJEn+p//59//iL/7yR7/+68Ph8OeffNrtdk/OzrkfTKfTwdaOEMoYYy1SSiul8jzP85RS0u22AeD586dffvk5/af/6Hedt0iX+d27dyshhhfjw8Ojva2dJEmiKNHGFkXlEhDWolorKeV8vszz3CiT5zlY2BvsWGsIRRisVJVSwoJWSgRERjaAvI6i9vnzk7gV3b91P89LTELmt0fjpTIKYxxEYV3Xi+VcKeXp2vM8TFRZlkpjrTUgrTQgzCgza2dpMbaYIMqwVSVgnef5fCm4H2xt9a1FaZZRygCIUlZJQwhxagRVlROMlba10IwRz6ecU2Orul4QgtLSIoROhxdVVRkNWan2OnthkGm1nIxPjbbWkkLRuuAYc2RNwH2PYo94OEl8PwDAdV3nee4HvKrxbJIu57NWq8U9hqxRSnLuO9cbBB4Ykud5obUmzLmlIAgoxnVd16rEGFOflmVJCS1VSSlGDOVFSimNEW+3wtPTUwQkiqLZbAaAhRA89oxpYtTIKkKR7zOaq6wV4rQuD24cZFnBAEuhkzB2wSViLCaoqipAEmNa17VhIWMsz9Jut2sMGw/HURDWda1rxdscWdJJOkmSeIxzzsfjcZ0trFb9vRudINhtd0w/G/Q6iceZEfPR2bv377739lth0kKEnxy9HA9Pi5K76BRjjHIfALIsW6aZK9nX0EgRIGsRshQQIGQBHJCygAzCBpDFhCltla4RQpQxyhgACFX71L800OuchV2HIhpHCACulsSum3Y6c+PQElz1tU24RWtNyGqD1VJ0NVwi6XIhh5B2Qrxa001/gDY0G97obKw1AAYhF5RewUettavJ3/QuxihrrcUWYwwI0KUIMSYIIwTIrpSC3d10nH+CQNaVEMIoRQgBo61W2K2WtarLoiwKWdcEAacEIVRraVeu1LoDw1Vp4UsPZC0CIBtNnjb91jVX2vxw2bLi6vi2yAQyBAEQTCihLtRvpJF1fX561mq1+v1+HEa+xykBvAo5WHs1Z+9+KMtqBd3WHIUVjNN2detc0cO6isEiqxAiFBACiyxohJQxVgNiLv2KrLHWGgxAOWGMrlC7sdYCAowxwYhghAFjwE0rKQtAEMaArCumQC53YZ2KAlhwghCAGjaEca8IJtelG9f3a7UdvsqKJa9vvwrhEa0VIawo0zAKy7J+5+33/u/L/1uRV2GQFEX5/PkhIJym+R/90b8XQk1PRxgiimMCARhW5wXFhFuEwGKtKLE3BrtFNjx9dXbzxtZynPo93u/cUCEKvfBvPv3Z118/euuttxjYfhzf3d8DgEdPvsm2tvKdndPJq9/a/a3R/CzyoyRW+7tRbHd5uXz16Sf5PK2K+ng2J5wEUajqepHOT86O272urvw0Tc/Pz+tK1JVJOu1Xr175vh/GkTFme3urmI0DbOdnR/V81Gq1aBhub7VLsbg4P+QhFuWZleMnX/7k07/+s6++fpqErdF8fviLz+xsZsYXD9+63x20z9Lh7o3u4Ob2T/7qbwaDQdwJ2h1258G2KPLFrDy/mI1OL7Df6na7Z+ejdius0rlHMDMyypZvJYEJWHfQuXj5eDY8Ac4R49IQimhVmDiImW8BQFb1s+OX8Wef/OaPfm1a5bkWVZlLLdrtBBl7f//gxu7uX/75X7Tb7YTEkR99/vnng8GgvzX44MEHL49fBTRKgs5iku3cuDHo76VZPZvNzi+mo/HiOx+3Wu3e++99PLyYddrb1tDd7RsvD4+TVrSYTY0WnY4vRH74/BcHt25WVXn66iSKonbMlBIEysFg0Irh5OSE/sG/+SOEEKW0ruXJ6UWa5ovFYjieYvyN7weeHzolGWstAgIEewGPosj3/TiOkUWLxSLPc8YY5yzLlxZsHMd5np5fjLSW/W5bynq5lFLWi3ROCKmksNYSRo21eZEtlkttDWOM+S6w7wVJgjF21RMYr1yva4CE1ln8xpTrdcdkSilj1n3zKeWAUKsdY4yXeVrXtTbS9z0X6qeEuAWrUkIqxBgBpJSSjJPGnQCSmGBCFaGqqDNrkdbWGmQtYMQRkhgJSn2DFSBKPez7PIpCowFyjXForXVupchzQLaua1VXjBGErFbKBQ8QsrUUAGCgYfg3sW6yubB0X35CKELEWoQx9njg8cAtASnlhBCMKUIoCD0ldZqmUl722SIxyvO8zKunRXXv3gMALJCQSmCMOWWEYruucXLWfDIcuX5RboMkjnzfZwSTKNra2go9v91uh37gEgGMYkQ9UcFksbQIiOdv7e13kjgIgq8ePX15fDqdLSzCloy1JZPp9ORirL2+e2qEEMIqhFBVVU37iSb1AG5NBpecPnjTQK9VnV1b1G56/cYZ4A1+KKwXc01u28ELvEGrvGperzie5kC/ZDH9uuPc/Bxe86n4NeHkhjABrzldBw5X69/mDrhqfrjSDhFdZU02d8bdBydU2qQ8rqGl/9XHJsK4drsc4HO9ylzN8+YrYe0qmYK+nV9y7UCbY33oN3AD3XBRPWOMY0oaDBhjgoCt4kerM2xIQm/kvsDmO/MaDxHWv/8n3cFfNi51urTWAIZSVpalBu16a4VhCBg9e/bs4uIi8qOLydgQJK1BWlBGCJCyLJGRN3Y6v/6DDz/+8K10en788rES2QTBBx+83263n3z5xfn5+eHLV4yxkNP3H9yfX5x/9eknQRD4lDBQUOfTxeLf/A//7zs3w06rjY2NYxze6gTEq9JSLufJIEK+L2pdqJwRP+n3yXxxMV3+ve+9fffu3cePnwZR1Gp1zs7O+oPW0+fPHj/5klLKAuAeBGFQFJZ52I+w9eu8mrx4+VSa8s79W+2Otyzg7OxZK+n97/+bf4oQsrq+OH95cvz06fOXf/PJ+Nd+41+8+977ezcOfvDD70wmo7PzkzhEQlT9rf5iki8WeVlP0jyntjLEw6ySRSXqsjvY1lU1n4zjdlKWuR2PkjAIAt9QAoQgBGCsNkqKQlDpc8+R8Uej0fPnz7NuX1Z1N4x7g0HIvcV4+uXXX00mE+57zu0+e/EcU5KXRfby5WQ+6/V6u3t7cRwXRVFV1XK5rKqqERfZ29mtRL2/v08I+cM/+ANC6A9+9MNur33j4EBpWdaF1rKsC8qplMKC3rvZbbfbQRAghFyivygYZoIu0xohFIZEKchScXE+yavKGlpWoigVxjklnHqcMc4YwwZLLVy9AMaYESalZIyFYWidvyc4DANCkLEqCLz9vZ3Tx8/SPMurXGjBfb+u61oKi5Hv+1VdA0YBD3jgu3SjlFJnqbW2KAqtdRAE7vtljKkq4aLrZK1H1LQ5cKR3Qoy1VilFCKOU+gE3xuAyh7U1dF+8OGoZq4SoalFLCZgYQoBQq1QFyIIz0yARRhYVBkoha2sd5QlZi8BKhChYzIxEQKwlBDMPsAVSS5EV85PjMUXYWqu0NCBFLayTcCFAGcaY48vYLxhjNJKbZesbP1OMqQsHAWAA7KS1dVn2e1vW2tlskaa5011mjLmXA5B1SaIg8BDy8hwxQsFoz2Pz+RyMkkIjhAEQQcgywjmnGCFrtJHWWowhDiPOuBAiTzMEIKUMPd/n7O2HD1utlqhqSinBlmDkc8/0O9OF8nxSVnI8XwLxgMH5PBPDaVU9ny8XtdSAiNTGIiKlKqRGSDSFeZhyQohSqqpW4gqIXqonIYTA6oa89vq6EG0oZ9h1Xn/TxTYworHFeKPDVpPr2VzT2w1ORHOsTQhirko5XbWwlx/CRlkHXDX6r8+zmc9udA7sumZPb0gkNSinObRUq3wBfv0oV2dujtXcHLTmbVzTP3abrT+50nn5f7GxiWau+VS4wv1cdZpu+js4bjVcfus3pZo3ovHfclz0puE4KJvgqUGTWq9fZicCAi7Bh/M8J4R4jDBGVrkHgxFCTiLMrsuX3kDKWV8gWqUPvvUGAcCmVJPbEcElpNhEouhbJnI4BgAY88CiIIislTdv3vyLv/hzwhGjbDFP9WJOGKacW5uOp8vRYmEtMLBaa6ssYZgRHBCfIVwusy9//mkn4b/xgx8ZWT5+/HU1n+o8PT09LesqWy673S6u8x/96Ef1cvrHf/zHTKJ+Z5BNR8P52BgzyrKjJ9M4iXyKtKgo2F4n3u4N9h6ECKCHugiHZWV7vRtB2At6O5PZMumGN27taKSms8WLo6fD4XB7a1ca2el3er3OnXu3prOx7/NuPwYMSot4m8aKe/GNKAn3bx0ss9QLQApNKf3ud+6U1WIxO94ahAcHHe5rUXcPj44fvv2AcXjn3XtPnu4en31jEZI6O7moiDWDXdLq3ywVEL9bSHR2Pj56fHF+mnLPJq1Of9Da3t4Wuqytfn72UiuhLQFrEGBGmSUGI+eWADNKKQWMFmmqhKyyfOGFnThRQlaiXkxn5+fn77z19off+ai31fvs6y9b7dbz58+n02mv33/w8OGdO3eePXtWK+n6vjJCkySJ4zgIgucvng7623Vd+r6vrPrZz/5msD24eeeWEKKo8iDya1khiu+9da/dbYWhnxavOCeUOp9VIc92k7C/d4922n2lTBAEUmvCfKmxNcTzwyimdV3XSmFKCeZgsdIWGUOZzfM8TXMhROiH7vvpM66U5B6nGNV1zRi7f/9+p9OKQ398dEhrwJj0t/tbW1tFWZ4NLxaLhVQKERx7cRBHnucJqZxsc3ergxAOQo8QEoahlJJ7FGN8cnJiASxoQHjd8m6V6bdrCrfRpixLKV1FfODMR6vVErJaycggQwhB1q6XHRohSyhGiCitjNGwEkCV1oLShVSpAQ0IgAAYF5K0xhhAWGprLVLKYEQQVRqVi8ViNBpdDJdOQIJzTn0n3Et9L3RkSISQkYYQUpZlLYSUGlHEGDOGbjotYwxGhBIGFtWVUFJrDnlWlWW5UNXe3r4xMJvNlFL9/hZjXhh6ztZLKcFdEQbGabvTYgEyBm7cuFHkVZ7nRV5FQez7PsZEVLVGgnpe4DFjiNZSC5J0YxeNMFJprRPfj8PAY2Sr3/M8b6kVaClVDdZyEhFsKOVBEqyNGqpLcXwxm81mlHl5VWFMAKFKKIwNpgTzSG84YKOUXbekMsawNZGyWUO7vMO1Fd4maGgcZ4MFGwe86VZhw/81DtiNpvyyWUzbjYFfaxK9mXveNLibXha+xattmm9zhex2OWEjddxgF3cOUsrmWr6NKLA527VzQ+v708Cp5sTca+P6mqIN4a812/F/HaDQjG/zo81fXUDxdfLH+mW4Mpv9Fdblmw+xAQrXdm+APkDTFuRKJKYWNaWUIIYxGEy01ta4di22oeIihJoMAl63w4Zr9ALXn6JhO14Nm21ezAo0XFWk3vjhzUDBlSY7FXwA7IchIPveux/s7OzMljNtVJ4Xpaja3VbSDra3ty/SXE2mRVqAxUpoXYtulLRaETbKQyhg9PFXX718/vXnD27funmj323fPtj1PK8d+Fu7g6Ojo08++eTf/H//u8SnD2/tftHyl8slrn1cZ0LUQRC0OVpqrEQpATCRUuXnk/PZ8rnneRizwOvs7t0PWzsCi/Hw9Hw65iyiLLgYToO4/fyTL7766pted3A+Xnh+q6xUf3uvv7W1zBZe7O/v73o+m0xGf/X57wdBsLUzGGxH5xdHf/mXfzWeyHv3dh/ef3Dy6tnNm/1hPTF2vLfPT44fBRH0+p2iWC6Wo8DGlMsgUhpmiGYGVRhp4nlJFHWDdm9314t6aVb/fvbnk/FpWS1+84cff+/7HwHA7s29eZH99ZefYgwGWW00gMaUEGoRNoSxWitkbOj5xOPCqOXF+ej0fGew1XnrneF4rJRsdzoX5+de4H/w0UdfP/qKcR7FsTaGh8H3fviDnRt7lRRCq0bANwxDrfXZyWlZlr/2G78ehJ6sRV2XGGMhq06n9ff//u/8z//m96Wu+km3kEUtyrgdZ+WSB4QEthSpqpV7CXnFW61WHMdUGVxLaZEAwMZgbcA4iV+E9DoUpq1ytDmMMRbaWuvIhg7LK6Xm87nncQtaY0QZYoxorZfLZbqYaaRa3Van09nZ2eK+V8oKIWsRcJ+ZSldS6MxWtUAIYUZjrxXHK0fl3u+yLJ1IokseO7sGG96iKaG21iK86gEtlVJaxHFMOQ3DENdACGaMccLKKncllNYaC0opY8EC0oRYQGtVV7zC8sZc6vuuGreABQwAmjHmUubWWGNLqYxUmVSZH2GMgXCDsLTaaFCOOwnYGtBamKoSCKGqElUljDEYMCHEpULWZgmDdT0qGMZEKdDaUAoIEaOxkRohEsctY6AoqlZLutaRSZKskxHYWlsUGUKIMRIEXpZl9+7d293e+7d/8EecEWOVEtLzcFUVskYEWUoxo1QpKyhJ54sgCKIgVICZj7rdbiuJgiBYLmZJFCArGSNW2zwvUlWnabrMSi0iaXRZ1tpAlpezNM+F6SQB1ivNJWkl0hYZXQuJ0IZ3R5c+3pHs8KWukbHWIoxc8HZzNIu5TctuX6sFuDaaORvTubmx84tKqYZ1aNZaC+h6duP64nLTHNt1W6lLyHI1K3HFym+s7JvzaSozNzfecHtXcMwVCLXpGFx9jd248KYNqb2cpLlwd/PRRi8lu6Z5/q+VfLiGDzb/tHn3mn8bEYUmULR5e9+A7P6u19XcOqcr6vrTAgDCDomugkCbJNbNt8UF/ByyccFS94AYXl2pC6Ft3oQVSrjq+N8AFDb+v7nNLx9KGmOVMURUEnuACQKC7969e//+g7/8yY9rWQRBECaRF/A0za0dhVs7vd7AqlG6zFUtumHIKRFFYapibkU7+uA3fu2HSUjm44svvvhqb29ntlz0+30Ac8u78e7bbxVZ+s2jr/NssX9j6+bezs/PXmVzvL29XdVFURTImH57kBfLqszCEPlRoIyp67IsxPZWL6umCnb6Ow8A2PPDp69Ojm7s3SR8f7aUoi6qCvf7N3f39oqiODs7W+TlcDzdWW4ZYhGxi2xiM7lczm/f3eKc93odxu1scb7IJPeg220PtrcWWX5A9vrbN14ejctxuswhLUEKcfjy+WCnN0kvltlFq0OrfNxKEJC5BQU4BGJqqSczbJfTxbIsVIYo1Cp/672H23s7P//5Jzdu3gLK4lar1enW1pZSSCk1thoBWGUpN1IZo2sl5+lSK1VnRZqlt27eLETNPN5tt2Ut7ob33nn/vdF8+skXn5VKFLK+9/bDTqfzne9+/OWXX+Z5nmWZxzhCyPf9drtd1/VyucyyrMjyNE27vXYQBGWZv//+u7fu3nr0/PH7H76XFtmtu/uLbDGZjTyPZUVqsJIW1dZqAMoYwjiXMh2N8GRCi6JSWhPKMQZCaRAEiBJCSFEUymjKqOdxbY00NcKI+7wuRQPe3ZJda+1Ue9NsEXi8P9jxPDabT8oyDzyGkN0/2N3Z21XSnF6cD4ejsqoYI9pIDRYRDBgZBJSSwPeDIKjrDCFXu6+llOPxOM/zIAiCILDWGqMdUFh9zRBGsOrhyxhBK1E2hDCu6oJSSgx15gPAGmMoJVpLSjGhiAEx1jYrKIyJNY5ERCklAECpR0mACVtbZWMB2abzHjKUM0yR1hZRi5nxI9pSYRgwhJAxIIRAVjOMCEIaNKfYWFVUdZrmyIJrB+N5flXnzrIIIQCwq2l27XlcDsUaZAEY9aOwhYDKwjDKOeeMcowIXitYUErrupRSrHs6SADEuedkONtJvL098HzmcZ5nRS1KTrESlQIIA8aoj5ArpmD5eAFKg5LL5dJjvNNOAo/v9Hvj8chqraoCKDZKWy083yeJL4TIl7PZYjlfpFklCeXEC8K4JRWUYhXN1soJSqLm2TUu325EAsy6CtT5KgDAqxY2VwsUN0Kpm47cbYDXxev2aofoa59sbnntrw2DAdaqPnZjGbc23fbazK/Pg9Yn9LrV3oQO13wh2tDQtBuLe9fipNlXXxVGtNbCxtVpC5RStIEzmhQG4MvVNmwABReRWn9ZoFmm17X8W53N/z/GJhBshrWrXkdoI0nkKjldmY+7CrruuXoN2P2K401AcL3EvxpRQAhZu9JpMAgIIWCxtdYoxAgGAIkBIQvUkss+k5dy6dZatE6g4CaghS/fZ2utddoP64jCJh79tpN/4w/ftj3nWGsOAAgRKbVHOIDd2dk72L+F8U8IYZx7taqzrCjqijHmVerm3s3tVv/l8xfFcrG/s9dP4tl4mPS6t2/u3r59+97dg9/8zR8Rol+9evnNN1+//dY9zvnh4eEvvvz89u3bvZ0Bfkp+8dkn3/3+Rx9996Pj86Pz8/NKFel81RivPPUYx0HolpoFoLrXiwZb/boop9MpJS/bcT/wu8XyOJ8fZoFstX+nLKs/+dP/gDHdu3mAEGr32r/48hPG4WL8aj9vJT0WxPLo5JvZckwIvPN+hxBj8SQtVdwWv/abe0oTQFqiwvfj4Sy9devhvKiPXz16+P5bWTr/t7//Zbffe+udB6XKF8sR84yS0gtomS5DjoIo9n2eVXaxmI1mF6dn4/NJRkIIwxgxejYZffLll0fjySRNF1lZSK0plggkAoqxJRgwVlozznzfB2PzssAWep32/t4NiunJ+dnN3Rvb/cHx4ct3Pnjvnfff+/Ff/GVeV8ro6XLx8P79brd7cnb613/z0ySKXbVg6Af7+/sunr29ve37/mw2GwwGZVlShr/38UcWmT/+k3+ntfyv/uk/mS3H3UF3vpyenB2lRToaDwnDeZZIiytREU045wiHxmqlDV1mC9/3HZVPGim0qKpCalWWJaHIQz7W1mm7Okq4U30ipHSF1275xRhvLK/Wuq6N03rzOaWctDpJkkTnw/FiMZNaBqFPKMvL2vd95vmYUmvBGIMwBbQqhnYURRdFsdY6lHBtIeUoQlYbVytiLTIr2VPCPY9QxBgDjBhjhLrvmq2qCpDChBNCCQELmBCMiQEwWmuNCMaYYOoE3JD1wTJGfWdkARljTaPNr7Wl7hAgrdUAJgg8QjoEhxhRIUSaZkpozkKEiKqNtYgwxphyvh+QBWQopaZUxihnqR3+QbBqV88op4QCIEcK8bwAAGtsHFuCMa/VarWStlTCLVMIIb7vE+KCsdgYY0FbY7a2tqIw/Oarr5fzBQAWRd1ut4UQyIJrIYEQgDaEQOB5nVabcxrHsawFJSj0PY8xj7Fet42tkSWA1QTbOPJ3d3cDz4v8k6cvDonVvseENl4QBklSVGqZ5S4s5F4JjABjwiipaq3XGkRmQwDnde/ltsEb49J6XiUN2I1MxObq0V4lLlzboNmmmXyTN7B5iE27fN09v5ZZgDVWWOEE9GaOwqY3QhsEPRfYcBoGdsMtbTrOK/yJpjfEGmkhhIzrjGEvD3fNPaxe6XUuxlrrHO21YIbe1D/+X3bgb+GoGrhES45IsaoiM5dj01a4Bbp5jcz4bQmVjcNd+fjaiwHXFRrW/aNdJgKBRkAIsZoawywzlFKC3eKKbL57zdvg9C0QQu7UNpkov+w8Nz9x/7ss4F3DUzfHtyMll/3gnBslACHQJkna3/3ud3/81z8ejod5tZwtZ34YYIzjuIUN6oSt1vb+IG6fHx15BHdbrZ1OstVtvf/e2w8fPtja7ubZnHvkh7cOdm8d7O5tpWm6rKqvv/7yvU735p3b0milRaX0zs39e289nGfpeDaRdc05m6eVxnwQd/qDrs9Rlk+ybDydqKqYt2LfZzGxaHh21IrS7Q4hD/tbg3bS42Kc5fWUc594gzzPiYHeLq/FkjBhyEhhQD6N+0vWln5AlTpSBhFECCf9Xb7N46KA04vl0eib3e27qGI3WLhz+4OzcfXFo9nRq9PFou5vDSaTSWWyPM8Qkf1BW5aTre0WKGmMyvN8meNCBGBp4CcC5izyW73uJ199XlTSYPL1o2dfvXg2LapxmnqdtkVUYdCEGWo0IAMKEMKMYgtYWyA4TOLtwfb49FxLARiFcXTrzp1uv3d8dnp6fiZBGWN8EkitR5PJ4eEhpXT/5oGW6sWLFwasEGI4HLoYPMNkd3cnSeLHT59Mx5Pb9+/9/BefvDw++j//X/8v73749ovjw0oUoQm80BvOz2fZNM/zqHUXIW5MXtdSCOp7IcbYGE05561Wq9frlKKmDBuralGWdcUYoxQzThC2UtV5lXvWC03Y9jpJksRxK8syq+1KM1XIKArDMASjT09PlRKUYUpxURSxb41RZZkXZUYp7fe7jPtSKuYFFmEALLWu61pq5QP2fR/AKCXquuSccx74PldKMEaqqnJffADAmGAMhCBCELYreprWtqyFE2tilCatAYCrPTKEIilFmqZ1Vmldu0ZLgAzBhHPGPYqQdbX4AEAw0dYaDUZTJTH1fK21VcpqjTYIZVoIwhml1CAwxgDBjDHqcV0DIUhpUEpKrSjlRqm8rCK/RRnxo9AYrJUtS0cyv0T9SimMqTGGrG0EIYQQaoxRyihprEEIiENOxhjOeRQF/X5/sVi4bpRJEgEYF4yhDDtiS7fbunVwM47Df/2v//Xx8ZFVKPDDg4OD2WSOMfYD7vu+VUrqGhPGOYcoGAwG9+/fT5dzADi4sauEoAzT2t3VyHd8UjD9bpsx9uRROrk4y8qaB2HAGWVEKzUcDrv9gWserbVWUmitkTVWqyana10z5nXXqyY339h6+FYK+pXV0utpiNddcrMZvqq21LifzXqHa/NvTrV5lGuHwBuRg03H/8bZ3vjrtQOhtUwk3mhbtRlUWO3eRDhWatwWIWTBMMYaoLB5ZxC6svvm/dm8e8YYx+cnhL1+kv8LjGuA7PJs4cqNbbDC69tvAoX1dV0+mjcFLFb7rmdYnYZ1Ccc3bHM19rB+EGu+wpVwFFp3hW1OZjMMBhsRLECXqbTmcK/D018+fpVt3BDCAgBjyFpkNFitpay5x37nd37nf/rX/9N4Oq4r6XnB1tbWPF1MJpNbtwaiqpOtnRtvv0OkfPnkiYrCDz98r92Knj17Mhmd/m/+6T/GjH756OvBdj8IwvPxZDKZlFpSP9je3+t2u29LQShWYJMovPfwAQ98rUSSJFqrP/uzP/O8u+PJ8NHXh4zj3e3u9uCOkHmRTlNVb/W32lEwvbgo2Wxna/v+7cFg0J0uTs/HZzdu9afTaV6OClkdPXu+s9fp9G9ECezs+c9e/CKVpt3lkQ+1WAahKktFGfJiP6um84WxyE96iVJ4UY993fnm+fOD/buD/Yd/+P/4b2ez2dvbt7e3tx1QqOqC+7LfH7x8dlpi5RHKuU9IXNSmXIiz4ezkZOLHLV0Lg8mPf/o3nEa37tw7PPvJs5fHQaejEWHcMxhpVGmEhbHIGsKJ1EqXmhLCEalEPRyN6qzoJq2tbs9aSwj5/ve/f3p8/Kd/+qdJknz66RdbW1sHBwcGbFkUy+Xyw+98596dO9PpdDgcutoCKSWltJO0bGxPT0+rqmKMep43nU6Xy0UlxXwxXSwWo9HFdD4lPmY+C5N4e3swX7Ks5MwLWqxd10IpVSudZcVisaBVVQTBzsnJSX97q9PuLRefVaWoaoWAUcJljWng72x14qQUQng8DLyQIEoYWB5Ya30/BICqyDFgirExutfuHtzce/Xq5fZWX2tdi/N5umR+QCnN89wL/G63L2pJpahrWZVlLYUUyhijLdTI5nXurpMxVpal64+J8ZVmQnaVwiecc2Otc0gEoyT0MKZuEepxT6i6rkutFeEEY4QxoZhzr0JICSlduQRjHrI+AhSHSVWJMAx9359Op2mVSUHqCi0uSkppEEQexkLVhFGE0Hw2TdotK61SltIAUWsNlIXQWnNMtKjrorJKqlqklQINWqFCLT1CjbRgJUMUGAOllNIKGUBGm9paSylGiEslsqzo9XpSS21pbxBmWTZbvoqiqL/VkSU2oJd5+uDdm7PZ5HT0YjDYXi7nyNBOpzPodwnVy8XFZHwiVZokKI66Qi0//+LnXkCA6KIWSdTOZKWYZcQDSmohCEbWWqMkI3iv15J17iONQv/s7OyCIEKIWUIl6k6ng4LkLE21tmEcjc5nRVH8/EVa0u0cMr2QgR9i48lcJjTApfQNSKmMVj5hyhplDCLUaltUlTEGU+J0wbXWtVQII2m0qmu7ljwCsMgaBsxVwNnVAtdSSjGmCK3rz1Ym+9JIungTAHYJa2eWm9C9KyFprLbWGiFsjKuYR2jVR0O7MBXGGAA78ACrZLFunMSmXwEAJ3WglJJSWGsdgwcjC1ZbY123K0Kw4y1os+qD3HgaB4/qqsQYe3zVi9yusu/r+P8qSoHQ+myFUBYsgEEIuS6FsKop1crIJsaAMBgwFq1XrnhNbwQDyDSghBAGILW2UmprHaJ6s8v5tsWuMZf4Y9Njkas9OS/hy7d47E3SqFnrRRpjECUAgDBYZI01RlmtqbJKyprSlgEtVBmRkDAstbCIcrvWL3fhRljrJSAEYK3RZqM0xlorjUYIIYuwxQit/kWu45e1TW9qgglgCpggYQleaSkYo4xS3CeRHxijtZGiqjFYn3uMEveqR4FXFAVQSjivpcQYszgiBLueEwYAgdXWJSYAAUIMAGCzQbZdv4oAb3g42miE1lpSq4eEAcAai5oySLeBe2mxRQhZYwlBNAwQAk4YICO1+Of/9X/z9dePbt7wv/rqM39319dodnq+aHUObtxApBKy7nYZfbjX8rmoZ9PhNKLwJ3/wB3e2d7YHW77wFk9n58U56RGl1PsPPirn4vzFuJ7r08Px7u5uf/9mEHrdpMA32t///vcpJVmW+WyXb6HH3zx58ggYZqOz8yTeD0i30haEJbpPcdIbdJfp9NGrs06nTdudZfnly9k3wYFtdWsWRV4V11PGdsPeHYbJdJhdUD/CKkK5p6pUVkXJ97CvCLdaV0bUpgSKIAnbAnWU6X3zs8l4fnbngZpm2ddPq0Wq9npooVJSXNT1q50BssJcPJ/td94yAs1mabtzg4TB8y8/ffZiKWp+cWG82zzsxsN6SRMYm6Gc1efiiHZNRQvfDyslAYAYQFUZIaDYZspQjy/T9O79e9Pp1Fi9207aQXsran94763nXz+627uxF/cOF0/euv/W559/SS2KveB3/95vPXnyZHIxfPvhw68++zzknhTaKOsx31q0XGZaaGzxxcVFEnenw6zb7eva+4uf/CyIuB8Gf/zv/v35+FVrK8YhpFVeW0riPY77gx7xx6QoCmTBZ3o+n1dFagVgbWgQBCsqhOfdunVrpQOoVRzHQogiWxJCtre3t7e3Xf/oIk1dS8Pt/la/33eC0qKql+mirsu6zD2PMY7n87kUVRzHhBrP84bD4WKxCKKwKIrPP//c436UxEoZJwSJMXXB87IslTFaWwejCWFBELnVc1mWdtXJxiF0MAaUMoxxY4zWRptVYpVzjgjRWtdVNZ6O03SJMQRx4PmMEFIVZZIkAeerfscWZF07vne71e13uhhjWdUe5YSQMsuVBIJJ4EdlWabLgnISxeHBwa1ltnB5YawAqFsTaGN0ltdgUFXVQiitDQJCEMEYRVHEme97pCwn7tAuMu/xIPBDjHFVibKsXZ+qJGmnab412MYYL+ZLJXWvuxUEgRBCm4rQeLvbiSK/1wsvLi6qsqLEai2rMs8WxPMJMjSOO37QbXciJcPZeJLmr/JCJElMqFBaTKeTbrdrtcUIEAbPY0ErdgI7osykMUenp3meF5WolLEIur0e5yFQr6zr4Wi2yNIgCDCmrlAFIRQEgaEMI6TBIoQIo05CXzcBUbRihbs+0I1dbmDfNeICbFQ0NCZyM6iwyTC4XF6vfUzTuXszGrE5mu3xRtVMM/+1kMNV94au/no9AfH6Yu6Ny8HN2MDmlo5iAuvI//qdvyJ+8PpFbd5ABySunfy1C3n9tJuYir0eXfiV1qabgOD1Y30bqvhVJmxmcNeI1wqta06GlVISIfI8b7fbsA7aa6mklEZpxnFzORsXdf1Y6G/ruOisnyueQmuV67quA7iMBxAM1tqyqF2EVSmlpWjSN0EQUM4Wi0Wr1fI8L81zKXW32/L9IM9zyhla13TgdQHD5n34trfrTbfOvckrUS+AdY0rsuvSiM2q10ale4W53e3hnN+7d+9HP/rRH//JHxHCxuMxgN3dveFE3uqy3N8Z3L17P3yblotZsZhzziPfU0p9+umnezu7e3t7WVZ8/vnnUzG+d+/eO++8c/PgdiVUu9fdN7frul7m2XQ6Vdq2ux1tTbbMhRDKmI/e/s73Pv7hp5/84sd//uPZcPrl51/12h1Q0miJrBn0O/fuvy2lODp5MZ2Ov/76cXvvzmCw3e558zSrKr8oTJIknPOiKgirtZWACQLQoI1StZLlhUxavhRSVIpQv9ttUxxVpffk6WFRjh4/GT0/LPpffw6MTKdpqwvz8VgchFtbAbK+knXkJbqCZ89OHt7/iHJ8cpZOFq8eP1vOF2CszWrAtVSYetzvxVEYhkIoq8H3/VKSdVbPgW8MoBEQSleLllXvUwvz+RzyOgT0+Omj3cHA9/3T8/PpfDZfLpb58p333vnggw/m2TKrCqD48dOnw/Ho+Pxsf2/vYjxK0/TBvfvW2udHLx13bX976+PvfG86XxwdPqHEYKTqSvoeUaKajKplnZfKRO2+F3QHvAOYgRJhK5G1GA+HZV15QTAYDJRSNInDqiqs1UqpQbeXRAHCNs/J+elJ0m61k1a7lRCKXQrT9/2trb772ozz0Ww2e/bs2XK5nE7GSZJMp2MM6vbtW612fHZ2whnb29u5e6+3vb396PHTyXT64MFblNLxZNbp9gghUlsNlgBgSrA1UkqtpIFVBNXVgzkiggunNCXm7kP3tXFNgJzQARiEMbhoxNnwzBgVeD5CBmHLOcUYaa05ZYxQjLCWSilFMfH9MPD8JEk67Z7PvfF4vJjN4zgJ/WApZCvsZFmmhfVocPt2J4qiyWQEFnHqKSWU0dZapK211nWD1CVGAEJoKYzWCGPAgKxFolYllL1eHyGkjey0e9YiQghmtCzL2WwhpWy3OmGQ+L4vhLJGuEAygGtUHVDKRW2UWQAOeoNOuxVS2mJMfvPF44CFXhAJYYos14ohZBkJkzjqd7snp+Pz8/PJZOoFEfcCY6xUqqzSro0JJlrrqpA+RVHQ5owJIZbSGAOj6VJKyX1PGkQYa/e3K6mIF6paz7NqOJ4HQY0Iy7JMSRP6ged5SkhVC2MMWEspbepWLIBxPC57tez7qjtZOaoNTIDXmgeNKd+0hpsB202fR9YNu51LIOvxJnt6BVs06GRz7bvpOJst3zjDtStqcMA1lGCuVlduzobWVQ/NQc26oNH93Gy26e1W8QIMG6hoxYi0GwQOl3F4nd3ZDJfjaA7XPIJru/ySe/htn7x+H36V4c5q80pXDxSQXhciEozBIowxAUSd6hqhZN1Ygax6iMtN6HONxdIcy3xL1WszGhS7+StCiHmeqkVVVUoLACjLvMwLIas4jrUQUtUY4zgM3JoqSRJRV8wLATOtARBWepUrJJa66111pwSEASFA1urN8/zV7x5C7sG5N38DK0CDFSy4iM4lenAvLbiw3PbOzm/8xt/7wz/8A9/3q1Jwj0ZRVBQVQZZiLIQT14/9bj/k3nR4wTApK/H42dPxdD5bLNM0/fkvPrGRkVo/evJkOBx+8803mJJer+cH0dGrk0ePHkVR9PF3P/J6fZSm89PTJy8Oj6ev/vk//+c//MGv37t5Twv5//p//rez4fj0+FUchsPzie8del4QJ/52/0a/t5Om6aQUASNZVmoFWpssLdNl/tmXxz/40R4DiREinBFgmGKlDWAbB/sEjFUlxoQw0IotcjWdVhcX6XxRpGkRx3D/wb2bd/aX2Txq+XCxIEaUaVEWRV3p+PbOWw/fmm/hw8NxWePhdHR4Nl5kQDmz0OOR8qh/c/dgZ9ANGC7S9PDw8OJijDEHAAQEAbl8eQBZBBhjTijG2DGEMMJ5nmOq8PYexvjDjz8s6+JnP/vZk2dPX52e9Ab97//mx/fevv/JJ5+cnp5ubW3F3Var30Gcng4vKl0viux4dB76QVaXjHt3bt364bt3LQYzKQaDeJEOB4Mb/+V/9Y/+/u/9zsnweJovsuMiTwsNgScDay0miIZ+URTTfPlqeJ4vlrvb22ErUUJShJBWqpUkgc973XYURRhjqzQAbPUHnU6HeRyMLYtCCGGNzpYTBAQhRBF1gfo4jghGZ2cns9nE5xSQiaLg1q1bebbknBVV6QX+1taWlLLb70VJLJXp9PsY48U8XaSZUBKhVQNlA2CV0toqpaytm1IxrWuECEIWY+uggBNo0tpaWxmzUrO1FBmltRQAhhPqhQHudrSRSgmlRCUqpYVRqsxzRj2PMp9xn/F+p9vpdLTW1qLlfD4dj/Ms85lnuQfaaKmNsb4XdTrtnZ0dTGA4HC5myzDyDWIEIQQWwEop6kIURclxBwCsRtYYa4xjqBhtl3UmuOp2B27FwznnvMYY+2HsxBIwYpRyY6CuZV3LIIiWiwIAOPMxxmUhRK0JIcwTmBZRZKPQdlphlYffmMzDfLsfT8ZZlpZIK8oJwrZMxRTnF2fnoqo9j3uMIGQJAUKw7zMLknvEKlyXlWtbpTGui7IQUkrZ9YNOu1NLpYwJwlhatFjmiPBag0bUYh9IgAkBogipMSWUUqP0iq4B1oDVYDVYY63FK/9/2Ut6wzqvjdpaJtle8QoYY9jo3bxpyhsvCFeXiZvW3Hl9V1682VTp25a8m87A/buJOZo532i1N4HFGy37tZ+bngWbwKg5gU0m4y93xpuCVGZVnb+i7znRxjdetX1tNHTOJoDhFvDfhhNev7T1v2bzQM1wX9hfPs8bP29AxuUjNhZjRBHGBAMmPvcCz/d9n1OKrK3rmpDSCTVGQSjK5ea0zXu1ec6bB30jpgQA1zJ3JSFPiItcYoyNlMs8m8/ndV0KIfI0nc+neZ7TVRdQTRGO43hnZ2f/YK/f7w963fki5Zx3u904jtM0JwVqt9taGwDABKy12FpkLQZAANZsvKUb5/ltgMai9RMHQEAczkCIrHEABrSmN64mNhu9qZowg5VSMqC3b9/e3d1Ns6XnMWt1mmZBpxMmSRz42TJ9kuejJOi1WjGnw8l4Yq1QknsBYHQ6HCqlBru7BeTaotFkFkQJYd7LV6effP65C+B99dWXH37now++9z0IAqr1vCieHh3t7vXTZZlDBYghgNt37v2Tf/xPWnH0x//uj7756svRaPlnf/4Txsjbbz88ODhQslgu6qKsJWR+nCyX+vmz84vJrBT5d3+4T4FarAnlBKglgBGhnGOmZ8spoDrpBkKZw1cnZ2dVWcKzp1AW4Hlhv9vb6t2+f+sdS6QfsPa9xeOnn5RiTrBXlsVoWHbagR/t/PwXnxAvnKblNAcvjAxuVRWjQY/akgDTwgqlF9N0PlmCRlJojLmxCBCxCEDrNZ4HMBYAGKXGGEqpz7iVJgi8wXb/oLtlkfnq0RevTl9WuipkseVvEx+fT85+8eUni0Xa6rff++i9KIqePnn++PlTxGgh6kdPnty7d+/WvfvtdrvVaj0/epRlxc2bt/+P/6f/w88++fnnX31ZlIvnLx5HvZhLyhhDiJaFKqrMWs09NIP81cuXp8cnZZZHfkAYswi0NZQA+Ix1ksQgEEIgMB6nW1t9F8ebzsZGQ5IkhBBrdVUV+zd23bJDC21B16IEAM7p9vZgZ7cfcN5uJ4vFLM0WL1+8ODnhv/0Pvss974OPPty9sae1rZXcB2yM1dYggq210mhnIN0L3lS0N0sKa62TCoB1wBmvlRmllKHHATAmCAEFAKNlWSlUo8DnFtm6zPM8LUUJyGIMyEK/2xNCMOZFUVTXdZZlczQLPB9jvFxmSqlOq92KE0JoXVVlUcwXxcHBwb27dxBCWZqOJsPlbNnvd8uyXi1TCAENRipVg6oBsMVAlERGE6MBLAXbWHOEEIqjlqxkLUqp6rquMfW2t7fv3btXlvV4PF4ul67GgVIqhYYVpOAYE6UUISRMDOeGeSoIbKfNFgnjqK7LichjVRaqFggCz48ZY0ajbF5YpQeDAedcGS2EUNZgRBBCccS7rTYGks6XGBBYbaSVUvb6nbqu79y7u7e39/Llq0WWtrudoqiOXp1kVU0ws0CCIGReCACUSowxIkRqJZTUWruAsFarVkKrlSwCC6Ct1ZtKBva6SNGmKb/8YcPrbKIE9564hWAjmgQbColNc4dm2usmdWN1eC3xcc3rbwKUX7LA3uTbbyYv0JvC2q/jleagTXXo5nGvETabn/Gq/v4S2Ti+wjXE0xzw2uU3CAPWKZtGovFXGa+jmdcP8W0u7Vec2Y3L+wDI2pV5RQgRjOk61+DSDdZaTaVGWGHs0knNw712Mq9jhV9yqnajiStal7Baa18+ezwajYbDYZHlrn9KURRKVA6YIguYgOd53W535/lWu92+f/+ey5DuH+zdv38/CAKfcC8IiyxFCLlGVyv/gSzCdjOicHme8K0ZoTWNAgOAa5kLFq+TEQ1cIACb9RENtrCXsxioa9Hr9X74w1/76quvgiBAiIhaDaKEES6EMrJGvmc05Hm+nFRgcV5klHtBkuzs7gIAY4wSPi4mYRgaSyzgGzdv8SB88jc/Ozo5QgjlZfERY5VSi8lsMpm8ODnNhHx5fIF5mITRYjb907/4D2VRDHb3Bju7/yROvvPd711cXLx8+XI4HBLeHk6Kzz9/QoJI6CULVQ+3Ls4XL18OmR8c3NzShtbSEACsjAZtrAVkDcLz5XEtcsyR0BoTxkK/1fO8KmlPZknS6XfvVMK+ejEP+OjOvYOt3RuseDQY9EohC0GWWX0xLs7PPx+Nv35+XPgxqTQBmhCvO5uL+axqt9vFovr682/qPL11Y2d3Z+venQeFkF8/fYkQQYjY1ZtM7KqRqQXA1iKMqNVmFUG3dmt35+adWwnmn37xi4uLs9sP7nTSlMXsnfff80L22ReflnURRDzLlst8nhbp8xdPZ/O5taCUAIxuHNy8//DBcDj88ssvPT3W2qZff20wavU7lpjxbHzj5n9RWdGPIs18Gi3G83o8FUUtAu2fzk9fvHxZ5vmg3W23WohgoRRjjPYHXZdTmE0Xw7OzKs8rKYMgyLNlGCWh50spLWgA4nMvCILFYrbi4ddiJSqsNRg7GPRu7u/vbW9rUx8dHQZBEIZhp9tqt9tpmmpA83T56tVJWZbcCxjjdV2neVkriTGmhOqVKoxW0ihptLYYWc4Io8wBBSXd24ytBafk576qJGxIbdgYEErJWmmth2UOAFLWlcwBrO9z3/cpRVqqqigFlu5rwghtJcn21hbn3OozIUQURdbaoigzISkmu9u9tx/eZcSOp5PJZHJxMcKAfD8cj+YIISDYqTNJiYz2MEJVaQkyWoOSyFqCAAMga7Tv+5wxa+3u7i7FuKqqdrs9mUyErJWW3GOtdpIk0Wg0Go1GaZrPZkWr1QLAk+kiCIKdnR1K6WKeUr/QphJVynqhx0wS4n4nOH45vKiNNT7HHico8njYijFFUtUDGISRzxgrRS2kRNjWUldVFYdeGHEC1EpfCQ1GCQ1KyKAVdLvtKORR6CdJIGXNKKmqvCyy5YxyP+SUoTBBCAmtKOUYEBgrtJZaGbAIIzDQyC+6pIMF0MYaY/R6udlYXliBv6axwqVrdxuQtSgT2hiwLo5oPEFTGtDIADSf23Xt2abRv+aHrvEhNk8S1qe1XnOvfr202htsg2uRgGZcXxOvW1lunsMmZe91YHHFGWz8FW8QGNfz/+2O+RpKcPet0VH4FR38G1ECxgSu3sO/G1Bo7uq1Dy+fvtLIAhgQWCCEtJBaa4Kwzz3f9ymloI0oK9c1uokTbL4k8B8DZYqicA6eUqr1/4+4P3uyJLnyg7Hja+xx99yz9qqu7i50Yx8Ag9k4HxeJpJaRzPSif0Qy/RcyPetNZtLDZ5TIITnkpyE4MwAGaKAb3UDXXpWVlXvePfbwVQ9x89bNrOoecESZ3KzKbsaN6+HhHnHOz8/yO3o2m02n0zRNH/32N7PZbDabNUW6rbVNiY2yLMmSetxmk3FyfHTuuu6Lvf21tTVM4OmLF1lavPfee71+pyzrC9c1WGvBWABtwVqLDbwpOP77T2ZDXA2LmIOlD+LKBwvQWC0W0QmN79xexKxQytq4++Mf//G/+Tf/pq5L7jDPC2azpBWFoe+GcWtz0Nte71Ow89nYdVjGWBCFs2TeX1tvKgnPZrOqlpTpw6OTLMuiTtRf3xhsbr04PMQIEONJUb86Pu6srx+PRo9evJyXVeR7CvPD0eS//Of/9Jf/z3/zwz/4vrAgpIy6vQcbmw8ImZ+Nzs/PMSZnZ2fDpBQF/vSLV7VJBhNVlJTR2HOiTitSimiLEWikgRorhMREY4zm2aTb7WCKprOEu+Hmzs21jej8VH326/P5fCJlVJUqzeZKlHU5Oz/Zf/82WdvaPBsVe09fSuBuuH56ig9PMmXjWngGU0aRBVdrQ6n1PF8XtszLMq3xFnOZL7Vuh1EUTOaVskAAEdswY1ho9sYEkNVm+VhKWRNEdna2d3d3oazOjw92b+yurfUfPnm8vrX+jY8fiDqbjM93dzY3N7fn8+TZk0d5Vs5miVYqjtvf/OY319c37915r67ryWg6nc57EcnKcm2tk1cqK7Pe+mbcb+2fHCtkWOAJAMQdg2xaFfOk9iQ3SoW+32931vsDWdWTySRL0lYUUUYoI9RaC1YXZeZ53nw+l1IYYzvtOIpjIVQToMAYC1sxwGIrr4UuimI2myXJrMjyokwIBYdhxojSotWK+4Pu9vb2PEsPPj1KkkxKOZ+np2dnruvfvHnL9X0hlDHAOLcI4CKMXCnd2OyNsQhhQmgTwFjXYqkPEEKEUMdxCSEObcw4RFvQWmopGwqH6WSCKcIEEIKmWDNl2BhzfnrqOE4rDlph1Gq1Op3OxsbWYDA4OTlxOZd1XZellLKuBAHkO2486LQ7wcOHD+ezxHV9zqnnBbPJXEqFELG1lUYpqbW2ABghD4FFgBHgxilsDW6YXo0BoyGZZ1ubO0aJk5OTfr9X12Ul6sPDV+fnx5ub21tbW9eub2NilZZClpQ2uR4WIY0xMEYcl0hZS1nPZpOd9R4jdq3b/vjB+zKvk1k96A78oC+0BYpchzDPEQIpWVltFFKEIKJNJWqjtcMQIFVXOdJIKWktSCmV0EIIORldu3bt9asXZydHlLuz6TRJEkp5O44AAxjlcsYYCCGIApeSsq6aFcEYG9CAERCMGdVaW0AACJmFVUDbJnd/1XR/4RvGqLHoNjpuFQoQgt+pdZbn4JUSSsscyCX5/0VZjatbZHvZeLuIqP9qjgS8TJe/OL7U/W8jgytYBy6Ai13xYqzGTi4vdyU5c3VsXw0dmlD2N+O5MkWrR1bRzxU8tMpseOXe39neiRJW5+GrfvhV/VxpVyb2zXFYTCssDxprm2LoaMFAwBlr1LldofRePieNMWAVOlz58M7WGDUbJJdl2eHh4YsXL05PT8fDk2bD1GAXYwwhxGFcNrwoduHQqYXKiwojNByPJrO5UqI5ZzybXd/ZuXvv9rWd7cYw1BAyIAvIWjAGNUG7y4f/H4r20AvjAVh7kdlhm0wHsxKvgC4RSTRIwiJYhERcMIUTghS6d+/e97///V/84ud1VYdhmKZZ6AekKU5AueN4CBQhbJ5kUtQWkeF4GrdHiBBj4PT09HePv2j3uj/4wQ/WNje9wCOUt3v9eZpsbG5WWXpwctw/2vjGd787TbNHz56XUlVJ9vLoZD4Z/83PfzGrRCbE8WgYtttpMm9HLd/3g073RquHMW2v77bXd2dH+dOnT09eJ5PZqed32vFOKerJpLhxbwNIiUAj5CDFAbCF2iIqywh0Ryo5nabcMX5IhVDHp9OkFLMEev1qsB632rK/AcoeP3t53ut8+N76DTlG87JeW7/msJ2z4dxvh7UxlDFhc21KWUnPdV3mOJRa5CCm2uv+h/cfgFUPHz3y45br+PMyJUA0kGYhEOhF+S8LF1zDyBijlMW+c+PWTS9wp8lsfXONEqKU6Aw6zHN5wKej6eb6oNVqbWxseJS/mCWM0o219WSWbm5s7u5e63f6dSWPDw61kNe2d/qD+PHjx73N64WUnz985ofOXJWfPvltrYUTB9gJqdslrFMIogk3hAXIXev0wiCIgnBcDuuyqnReFQU9Pz9v5CkhxHPc7Z3NNE2FEJ1eBwBGw2GW54w5hJCmyp9GCixyHCfygziOoyjyPG8+nW1srgVBoLV2HOJ5HqXkBEApkaby6OhoOBxvbm5ubm0NR6Ozs7P1zS2nYVq0jcRsOOMQIW9q8i6b1rqJCF0GpjWlsZqiF3kyBACjwWrVMDUpIWohNjbXtNaVKIWorLVGa4Ostuq9u/du3Lixs3ONc968w/NZ+tmvP53P59PpvDHvSykRwo2sybOJqNdPTg6EUJuexymmFJ+cjDnzjEVKm7oQeSmNAUop547rOBiBUsqY5RNgjQEpNRg7mUwauZ+maa/Xq+taGZ1mcymlVLW1Oo5jzmm/3+WcNp10um3GmFQVJrbVimrFKeWirgEM57yzEYT8m9k033t5fOParh/1h6PZNE2lqrFGxug0Ta3V3GWO42RZNpmNHccZDAbImrLMjTRGAiPuQrhr0+20bt3c/dWnn52dnN65d9eoajKZrG9steMoK0qtJSMUELJKg1YM07kQTSYhIgQRDcY2G69ldJhFYOylBV0KqCs61VqLLuLUloofyBtVsapZrzgLzAW9Y1M2zHEWxUjRIl9RrmqdVd28RBJLQLCSdXlJlS5/DhdqbPn/lZNXm1nhXV7VSat3dHkG0JWD5oIgYXUAK/03M2ZXRn7Rib2kbgGu/rl63QYirF7o7Wv9Pk1fLs21vBf8FWmQX9VWZ3X1yCrso4QQyjjnDuPNOoqyQghx7nqeBwDoXVxVTZ9XxnPF5PN2a0LTG7vLfD4/PT199erV69evfZfChZ9LCFHmBQAw5siGlh5jht/UjTSAba1OT0+LogjDMHq+NxwOj69fd133+u61NwGGxlr0jkdu+ec713HZLqZ9iQxWsMKbKITmWng1A2L1ilprAFYUZRy1f/jDP3zy5MnBwX5ZVGsb65TS+XyeJ8Ax9jlJk9n+i2eT4TnBOC8LiklZV2fDESEEMKLcLfLq1q1bt+/eGY1Gk9mMOw7C9Hw8QcgqY6WxBuzx6cnB0eHa+npd61ppQ8hoNicOf/z8xZMXL7/7x38SxhGyIIQyFhzH1RrCVre3uQM7+O9/8VNN5Iv91/NZ4Xqkqqxbg+tEQCuCDQEPJDcyt1Ah6g261zll2op+J0QcS8nHk2KeFIhA3CV37m23W/7pSUb5zOBK2dPXJ+3d25vUdW7cvnPr9jeePZl+8fDx+JzduvVNTCkSMM+yui49NwIEyWziaDWbzjtxOOiuGSu1/LKq6iYB+WLBMIAGiy6IN5A2CvBFYRoMrutsbW0JIV6+fOlzZrV0XffHP/5DS/DRyfFsMr19+3ZRVEWWhoG3vbWJERFCxX4UBpGs6tev9ofD8XQyb2J79w/PNfCi0KPJOO70MYPfPvoMe6iQpc0SYF7U1t1BjLlPMLOEEoMYJlhbVQuKSavVElVVFAVFyNvfPyGEeJ4nBG63Bg8eeGVZai0ZY43KXxJHK6WSPA2CIEvm0/Go1+t0Op0g3NK7g06nI1V99+6dL7/8UiMYDocSMDCPISdL7PbmnXv37mVZ9ic//qcHR8dBEKhacR4URZFkmeP6jLEGjBNGKGfGGKNB1MZojTH1edvKHKzBComqVlh2o1Y3ailRx/HGdDoty5xz7nmcENZux0HgUYYB7GQyGg6HxiqOUeh7cRx/+5vfa4CRqOrGoZgksywrq1LXtQjDsKoqawEhq5S8d+9etxf+9Kc/J8pQA88fPXL9CMFUVQobgohTFeVsllmLAFMAcBzXgAGEDTYWGUQMZwxjYiS2Gqy1nbgzn6SqptiEv/v0hev6Es8G/fX5fA6WPn36stfrgbb9fl8RGcW+LKoyS0MMPsMqy4ye+63+TnDt5q2diHl1ob1OSCP49h//qHft9MXzw+PDPSHM5sa2EJIAKqraDy1CJI5iSimjthX4lFJjwKEMACNnkUaldY25DQLueZ4y+vbt20fOaVVKz+9o44JlgBzPd5TRtZRSCoWMIUaZKmReIz2pxZhwDVprbSxgQi1obIEAIEAAxlqCrVWUaa2VkkobAIMxthSQxUIIx3EYZ9aCUsZa61CXUceihQ7DGlOjGWPYYmttWVee5/lhoJSqqgop5HleEPhCCESwRaCMBikWygaBucg2xBhTjAjGFsBY08TtItTs3BCAbZQR54u02yY670LfIG1U4ytp4tPt4mvU9MyYA284+5pKhpeCD5Z6q9E6zZmNEloq7FWJv8RAS+yyqswaIIYRJgQtawoYqy60qUEIIUDNEJthUELyPJdScu4wQmUtlJBgLQLIs0zWgmKizMIOLaoa00sb7uW9XAE9S43eeMev2DC+pn3VCUtv0bIrc0FnYTEihCBKpNFKWkswAV7U1bzInNDnriOtsaLmnGOwgeM09i5onEdLp88KEEGNAb5xCVnMGUcIyVpovdicNJQNxtiqLs/Ozl6+fLm3tzc9OydaagnLeAUAcF238YkhAgDWgBa28R4sboRzBgAaGY3V6fjs5f7zs7PTbq99bXdzY30A2kRhQBFOk3kYBIQxISsAsA2AbhQ/XtgDFvwYzbAvwguwWUGZyDS5soARRhQADAZAi58vSEM1u1hHAGhsMNJa6/k8TaeeTx2Hf+tbH//bf9up6zLLsqwaxizCYFtxe2djnRg7Ox2rwsR+zxjT2d44GZ0ejubj2avBxrrrebmyg0H3i8cvw8HWLBNP9g6zLHPCfllXOzs7laIHJ/N/9+//9uDw1As3j0/TqBt9+Wz/i88+JUFXCqDB2je+90/KkmkTEUSxQznlABQsqFpVuWp1h9/9ow9JhFjQ+69/95kizw2CaG371Wvwwy3XY61WKykz37t169adV3uHJXuV1LjX3eh0Q87i8+FsYz1Ok2ft2Hn65OlPf/rT++9v37416HZdIZLNtc758+Szv3nInOj+B//69vWPDp7/LAyfxR2/EmORSwQEA/WYi7TJs9NBt7eBre70i6o8PX566727/+xf/fnPfvHLRKUuFXmdRjwGwHklKOUYMYJZyhLOnDrLZVqv97rpZPbDj76z1V87Pz37xWefb62v7e7uAtCTUVJVlTHwg4+/m5VFYerReF4KIYUus7JKiirJOmHbalPWlSXYIJtIlcwTOZUA8Or5M+Zz5uBC1t3+xihNN7ZvZ7WqFVI6KArwYxZ5AcYoSyqHMoMgr8raKMQpZX4c+ZRzvr29PRwOMcavD17dv39fSglg1tZ2Z7PZZDIuyxIh1JAcJOnMAJaUOY7TabV939VKhGG4sbGbpvMoitfXesl8vSgyBNKaOo7cl8+fr6+vt1qt8/Pzqqq+973v9dfWx+PxwcGBAdTQJ8BFuVhKaVXnS8FNEFnwziBqjKmqAgFyXVcpkSQJ59zlrCjSwHPjMNBGGWPiMHAcxhjTRna7ne2tjVevXp2dnfT7/ffeu7uxsTEaTYbDszzPKaVBEACAlLIsy4bWaTabVVXVbreMMYyxu3fvzuYjSnhdJVlRSmE8n3he1On6o/G8qupFbScNccePozZCaDIbU0oRtlYbSonrupxTZCynTl3XhJC6rq1GjWHcWht6vtFyrd8/G47jOC6zPAzD16/237t3t9fuWClm45FVkmPEI993vXidfPs7HwuZnp4eOe5m3IowItevXz89mRZFUVby7p0PJ+MZIcRqGfpuJZCoRYFT13URAKUEY6yUqMrScX3HcTCmzfoWeZUXOUFsPJ6mST6ZTV0nRIQhjAln1liAS6bspiDFakMrjLZfrx6WnSw/LI3zSyXUxNYhvCDXWmrTRmE0wa2rSrQ5Hy524cuyBcsrwspO942dYGWkq/pvuXO9oq7QmyrYq7rzajzm23e6+hV6K0bBXKQbvHPqrhxcNTysRuqtnvx2yMXqXDU/aTYxzdz+g4ERV9rqNveyCeTSsP/BJ+Gr2lf9EF2QJduFBQgtb6HJi27aKtUmWmnLdV/QqFwu2tQ8MFVVYYwJwk2qqjGGU8I5n8/npydHr169evny5fHxsawFY6RJblxyYsKKG2vZ7SrGqusaALTWVVVlJMuSBAN68uTJRw8+NFpurq0bY4RWrusSSrWUmlw8hAgZZBAQZJFFBmOKASzYBitgeIMVvr7Zryxd/Sb/FgCkFJ7nSSmtNevr6x9//K3RaEQIyfPSdRyKcFEUk+k0DsLB+ubO1vZp49LttOPz1jiZJWmaZVlVVWvrA0JIks6fPHpYS9mEahKKTaWzPHVc9/mTJ69e7dV1nZdFEAZffvml6/HD1wd1njmUeZ6rlHQ5K4RE2DJOMHMAEWyAICw1rrNybWPnX/6re//0n8Od9/7zf/nbvz09OysLORnPaum6JXWdoN9bX1/f3Nq8phX+T//pkyTJwmD08Te/u3ajgwmnlL93/87B4XPHA0RxFHd3d+4EAXny6HePD1+J1BmmBlM/Ec7hVD5+sZeWNdOkEoYxxgiuKmmt8n2HAHNd890HHyKEtq9dz+oyCry1nZ2f/eJnoecXZd1YXg1Qyi0CrAFpoxBFVVUxxizSRV51Wu3bt2+7rjc+H7quO5slCA42NjaKomjS7/lOB2prQBqsjK1rUWklOLOaGmxqa4BjiyhiFCNjtTHh2lZRZrWsEBCHcZ8zX6sAIMuyUhgN1AIt0kQp6wUiCKIwDBFCGuzykW4oAChleGNzq6oL13WHw+HHH38sZW2MStN0Pp+dnp5OJhPKcONW0FrXUgIgSikhKMuT0ei802n1B61evz2enD189Nnrg1dRFAQRzksQar65uVnW0lrrum5TZ1Jb6Ha7cRxbhKfT6Xw+NxZprfM8b95brY3WWiurrJZSE0IYZmmaTqdjh/FOt0Upret6PB47jKZFHkURxjjPU2ttFAVSOtrIMAxevnwZxcHu7u7m5rrjOI7jnZ2d5Xl5fn6epmkQBFLWUsrpdJpm81ar5bpuVZUA1nGcplh2qxX95je/yfPKGMSZ5zoUgE7G0yC0Sto8q8tCZmlZlrUfdhzHS9P8Qu4sXlqttVJAADUU1M176Hpet9sFY5MkU0LWdb3WX/ddryjr49GYICyl+MlP/vpbDz66c+vG9vY6sgaUJAiiKLr70W5eZrXI291OWVePHj8Jw/DWzdYHH3xQlfb4aHjj2u7h64N+vytkZa3ttII0BYwsxUAYNQisRVIi13UxhtlsNp+nABAGscWokmK73aKMaQzaWqEVxQwIRkCUNQANgzYCQGAuEv0vsg/MSsz/1yuApZZ6o/Auws0u9uILQFDXNaGo4S1vIIi+qMvXpBcuq0zBhaN9FTRc6BK8jGpcFd/vEqBvJPsynRLgSkrkEnBc4jxeOeHNbS4n48pxtOJ6uOI7bwiXlvps9YdvwM3KZF4AhXckj8AKN9RygZZVJK7EbbztdHi7zyvTtXKhVRPCpSOrwOiruvpvaujCYb9cr+ZhaPIhm0abCMaLALGlCefK+jbQ8wpWYIw1cKGxBi3RlVJqOBzu7e29fv365ORkMplwyny/VWaVWSHPhguc+s40S4SQEKLBH0KIilSNI+PZs2e/+MUvTo63f/zDHxGMtJBxHFpjqqqy7hJPN+YEgxACizHHAAgDQbAoTYO/Noh1sV5XXF0AyzBYu3BULZZJSun7gRCiqkSn0/nxj3/8y1/+cjZLABMLBCxOsmLv9UEvbq91O3F3gAh98uTR070XUkqFdFmW3cC/trObpkOlpDHi6GhfKRXEUV7MCdKdVpjnc9el83SuZ7q3NmASlCzXNwbN1hRjTBkRQnzx+WcMgef4BGPX8eK4HYQxGFTkeZYV/dCPW90o6vth76Pjyf/0k58j4mhLw6j7zW8+2NxcA4DRaDQeJYxMfa/9pz/6X/z24ZfPnj2bTgrfGyVZCmB6/a7rMc9n3KV1Zfb2hkrUL16cZqmsNTKTqbHJwVhHe9PJLBWWag1hFElRZflEiXznxo17t24c7b88Pjm0ohvH7WtbPY1w0O64cctIeXpyirjHGBPaADGYO0aDsUYp4zC3VmUcxrquqjRHXkAIOzw8PDk5bYXxdDoZj6aU8PXB2vb2NudcQgncxJ0w7Iaz2ey4yss6oQb1YxeU1kYDNHnRmChZy/pofj5L5nme+ZGzvrUetyPHa4WGHJ2eKG0QA2x0lc2LJDWtTkBQ43DXWjeConm2lVJ0NBq5rqu1NkYVRXZ6emyMmUzGTS0v1+Oux+u6llI6Dmu1IlHbJkDBcxyrpVGiLosim+1u363K6Ww2AlMFXqvTbXkuIIRctrG3f5AkSbfb1Vrv7+8LpXd3dzc2NrRdWO1qodI0bbgXW+2w4V7EGIO5qOaCoYkYauo7YYwab0iZZ5iYIosaix9CaK4qpVSeZ4SQW7dvfOODDxFCn3zyiyRJ+v2+MYY6lBC0ttZvtVpa6/FkiLBtt9sAljHa7XaVEtZqQpDjsL29vfF4wqjT7XiACaPePM2G57Oqnnp+BIA5dxEieWaFUGBJXQk/9q212khtVaPqpAQCyOWe67qN4zwKonar245bSZJNJns4jHa2N++/98Ff/dVfGa3Ho/PNzXWGBlWdvdx72onDu7dv3rp2p9Npx2GUw+yTn/x8MOi+/+Gtg/0XCNnr129mWbG+tvMH3ws+Zw+TdKZNTRnkWVGW+Xv3b0351FpLuSOlFkpag6zryLpChDbsXa1W6/qtm+vr69ba0TixlCJMmOMiwqnDEVBEsFVNcOJyhwpW26bYx3I3DBdb/K/XCo0UaOodLxXMKlBoDjbog9BFvTFY2as1kr2BAg1NwnL7uDxzqRLQCnHQij67cMeuBBysytDVzDpY0dPLCzWIYaGE3to+Lv+U8g3ggBVg0UTGLfvXb5VfeifqWh5ZxVuNTnxzX2h5poHLaAMAlpF3ALLRf+YiK3JV260M9d2w7wpeWZnbS8P7RwMFdNkN/855sBcMHISQIAiaZIflFd+JcpbHG+i5ZPJeYkGEEOe8QVSU4gY3NJWLnz179mpvL03TBjroRSE3WF2RppMl+LsyhuVaEEIs6Gb7hAElSfKLX/zi+bN2r93xvW9hC1VFFSFSSspoMyxA1mKEDAEEFmkwFBBYrAEQRgTesCJ8XbOXA2uaYxc3fsmiRjADWNCXSanv3//gxo1bJydncS90GddK1bU8n0zSJMuybJZmke8VlTg+Ps6K1Pd9zlg2T377m8/Wt3pKKUYpWKu1rvJiPBxhjIUQsha7u7udrDOeTgbdniiryXxGfPfs7ExLgcFyzpUWjx59GbrO/XvvESCglc85eC5Qx3Oolph2B1vxAIDNp1ldQ1mrbm+j1Yo5C7RCVa0czrc2ryPErLJCmI8e/Mhz+lmiOQuSpMiKDIjdjbYwA2U0s9wgdzI3o9P52ZkO/LUKdFEKCyQ3FUrOGHX9Vg+MFUqKupSiDH36zW/c+9Mf/+Dls/5nn2JZzKey+Hf/5sWte/d3bt4pDo9bUeTPstoi7vrzrLJaMZdZZDGlYBWymnNOMbGYIkSGp2effvKrg05vcn42Oj+Xteh1ukZrpUwct4uieLH3klDaW+v1+/0gcGajswwJhumgF+ezrJS1NKoslMakBp2XZW6jRJhJWpAyz5QJJ3OpRV7lAAAY+czljBdFVeQpx0hFPg5iKWUl6ka6LpOhKKU4yxLPcxhjg8FgMhlvbGxgjDGBVjva9Nc3NtaSJKnruokoBDCEYKVFURgAE8cxpShJZi9fvggjd2dnZ2NzgAlQih2HUUpn42QwGGitmxjJMAzTvDg4ONjf3yeMN/u2JkYhCIKGQ08pTSklmGEg1iJKqcc9Qshg0HMYF7Iajc7zPJVSFlkaxQ5CYbsdeZ5XVVVRFITgMFxvtaOPP/54Z2fniy++ePr0qeu6nU6nKIp8nBNC2p1YKrchYQWwjsPLsqzrst1uW+scHR11uq1Ot/X5F59lWWmMxRgXRYGREkIaY4QQjmscxwlDp6xkmuSNrGGMLXaGZjX/6s2uUQgxmUyypHC4hwEhhHY21v0w/uDue9eu7fTaHZ+xpEzm07G1+uR0DlrdvrkbRR+ub605jGhV7h+9kkqNpsO/+7vj45PXOzs7YOnz56/+xT/9V2HQsdbsPX+2tTEwqi6LGWM0cJkMnCaxK0lzJTQiLKTuqJoFfuA6fhy3w1bc6XQIIWVZvT4+oZSWZVWW0vOIiwmjLmBiQTVVKxcZHAasfSNxVlXC21L+iqhaSuQrm3hjjF3ZJTcijFzUcFoaCRrDchPiai/TdCKEGsjS/GqJIZbfLgMVl2NYxDBcJt1bjnMVHHytBF6es8C4q5vLy5d786EZDLpsXUBvsS+vTt2q+llBCWi5P2zGYBe2FvP2fa3abPRFseNmbpdYahWO2N/PoP32PX7Nkf+mrv7BmW/OaVCCMUZKadHCE7EKxeDyU9rEMsNKxefmUanrOggCpVRRFIwRzrmUcjgcPn369MWLF2enx82qMcZEVWdZhi6ycuAyVlhd91UFvMCs1hprtNYuZxQTIcT+/v7B61d3b92+/969fqdbVZXrOJxzbSRqKk0QjAxGSFvcxJ0oixG2GCwBpFc4T98925fftRUDA1rk+y7+sxasBYMYY1laNLnik8mk1xt877t/cHR4YnxTlqWxlrs+Yi6yZpZl0/msFcXrO1uUky+++GI0Gt28eRMhe3R05Ls75+fnw7PzMI4453Vd10Xpckcptb25+b3vfHeeJr/5zW8wxq7rdmxrWhdpOncYD8IgjkPO6TyZzufT8fDM5Y4svSKZnxwdBH7U6/VanU4+mQa9tXyS//KTz37x61+PJ8napltU9eMnz7Ii2dhcC31va2tna32HcMd1aJ7V16/f+uEPRdzykmzqpLwUeS1Ut7de1kYq0els3rvz3kH7OMuhqoRGFjBjlCHCtMGOG8ZxS9b1eHjCuetiQ20ty0KUqcfo5qBLzk4JQnVZnZ2dWeohJ9AKXOa73PVanbw6EtogIMYITqnFqChq3/OyrLBSxWF0OJo8ffyM3EGtVmc2mq5vrb/33l0tZSuMKSLnJ2ej4Yh7nHt+GIq6lloqh7KWGzSWAGOMtiYvKsUIuK4hvK6NpZR4njGqqI1GNYAxmtZSOI6DgDHMOFEMYauVrCvEvWX20+pbQ+M4ruuKc4Yx7nT6RVEM1npVXUwmSspaShKGoe+78/n87OwsTecEcaOZqGRdac4pBhB1fXZyroQE2y8wUIaVEgjB2elESul5a4N2lzHWpC00gQhJkpyfnzPHJYT4vs+4izFukhiFLFdftiY500gTRZHjMIrJyenRcDis67Lf76/1e4TU7XYr8F2tVVlkGKHrN67fvn17MBh8/vnnX/zmc0LInVt3EUJK6DKvgJqyquqzMk3TxjIhpRSiIoTked7Ug0iz+WCt1263f/Ob34jaeJ7fakcGrFKm3WnVdT2dZVmWOF7UGB7CyEfI1qJgnAK2S7Yca5udIiKAsjIDAOYza206H+dZWWR5VYkH99aVkKIqvvzNF77nOJzGrXB0Ptze2Xj/3oMP3r97/dputx3O5qPTo8OyKrRrbt29NR6fGVP9yZ/+kyJPnzx/Rix/9er1+prCAIDsB+/fffLkIWews7tWl5mVgnCgmCEwVmvGGHe9WCjXcwExnRezaTKfPSyqaj6fG+JaA8YAxhRh7roGEyPKGmMqjVYGjAatloQBeLm5Ryu28a8R7vYryAbMhXG86WdpFl7qzred+qvxbk0nzU6lkYmrjuoGjy77XH0B7EVWwvKps295KJahA8t7bAIb33RyMWx72aLwRnhftOUdrZ627HP55yrCeHtzvKr7V3+y+AotcyyvLgRCqIntsNYuK2Y1XzVA4e3zv2ohrwDElVG9feQf094GZ8u1sCtFn82CT2VhLF0Y9hFZuhuWMRlwGfZdAWRXlmBpbGhcA2dnZ+PxOMuyJsyoEWKaNDNmloauVWW8XI6rTwJGUkowFpCpqgpZYwiVtSYItBKPHj1KkuT6zm6SzJoHWKqyGTMGijBYhJDBCIFBCllijEXEIkDIXng6vt5b9FbYBFrYIJpfXYAqbKGJJ10U00IIk+9//w8OD49++ejXeV4Zo9pR7Huuy6isytlkNMvTKA66g/73vv+dxw8fpfOZw9j9O3dbYef06Pzxo+f9fn9ze4sQwpjHOS9ykWf100fPs7I4OjpDCKVpmmWZ0wsQwYDBcRilWFalpLgq88dPvoy9gCAynU6TWdrp9L797W8/ePAAO/zk4PVP/uvP/+Nf/dej47N2r9vudrzAPT7ZPz09RdieKH18fPrBe9XW1rX1/nqRzba6m/fv3VZWMYdSz5FS1FXVbq17Xrss61lSTpOyrFRRiyzNjUOtAUwRxYxRyinHQCginVZXlakQFQIiK1MmlRG25bd1JPqD9e/+4M8ePn2RJtXOrWujs7mUdn0w6K6tz6Z5UuQOoaLICaMWLBjAgEVdYWPisNVpdVut1s7OTjuMOlF89/YdbOGzzz4TQkRB2G13PH4nr8pkVtfVyXw6mk5SojHj/jwp5kmuLamBJsoooH7kG+JOjyeN3QtTBhghvGAUTY4PMWKV0IgoA8T1Q8ZYXcvKJsYYafTSNqyM1lrT6XRS1zXn3HEc1+MNOXmep1LWaTqnFHe73Sa8wFrLOe+0277vX7wVtiwLLLHjOLu714PAOz4+tmCEqFzXLQtTFHUcswaee55nrR2Px2UtXNft9/uASeNUbhLYGqcIdxbGQEY5GNQEwDfyaDqdKiHTLMUYh2G4tbW1u70l5dRxHCllliUYw9raYGtrI47DV69ePn36OMuK+/fvh2H46tWrLMt6vR4PiRB1w46CEPI8z3FY85lxkmWZ67pB4HFOtZZCVI7rra313n///bIWWVq2u/3z88nDR49f7h1Qh1e1NVb6vmNBZlnCGGOErrIFN9NNADU7HkopQqQuZZ7n08mkruXzp4nruhSTuN3yHNaOQwOwtbn2gx98f2drI/Cd6eT8s09/+uzJk2Q28X0XYufa9W1RZbdv3/jggw+++OKL8Xj63u370+m0HfaiKIrDgBHse87O7ubm5tr09FxJwSihGBjBhCJKKWNkQamLDCHEGCGEEFJSSksDtajBUsfh2oJBYAALLRzKkCHGKH1hMcEWN/7RpWKzF7l8bxvSl20llGFlimCpWi4C0RGijC1NBfaiXihcxCIstUijCZp94RWXRGNUaFQI5xxdzi9Y6PjL0nypQjC+xN/wtiliEU/+Lqv4am+rIGMJFJpnHl2ENK66VK7sROFqqOAlLHIFWCxGgpZOllVX0cWjeJHm16zD0g3ZfLhy6a9pV/DQcqKa2LrVHv7RcGEVel6agcuVphvraJZlrtELLc5deAvELFd8dT7RhRtrCRGWss73fWv1+fn58+fPD/ZfTadTYwznfOm+JYQghGsplssHK+Eyq6Bk9aZwE6aACWVYKVVZYxlHVjOCGaVNmOSD9z9oQijyPEd0kTKhrbUWI0MwtgYBAQrIGoww0IVjAjUn8q+ZUnvZhgcAKyxMsEyVRAgZbXzfN9oopeI4tgZ2d69/61vf+dWTz8tKSFFRygEAYx9TBpjWVbH/+nB7a+0Pf/RHt27c/PUnv/jNp7+bjEbX1X0t8WyUIuAODzEljuOCJTeu3x2Px3svDxElgdvCGHMaGDU8Gh1aZSoErcBXSiEpoyiKorDK0nkyLZJsNku0kJziyfD86PX+UZ49fvz0J3/z8ydP9msJfhAdHB1uba2vb60fH+6XVcoIvXnz9tr6oN9p13Up9Ww8VtpAJaTjuAN/0/HcF8/3jPXW1m+ORqPHT148f7FnlJ7NJ5RSxwJB2EqJEGYOlWWVlBIjRDHISlHLOnHcCrtaUi2p73ZsbN2gq8E5HSbDSYqcnpA4DGJkeOC2HeJ5WDJEcmWoMQhMQw3OGLNCFUUZuN76YAMMOjo4vH7tWuAGv/j5z371y0/CMEym6Q9/+MPN9VuHp4fD4ZkQs7rMpMDGQpLVIilnufCCWFM2rcYFVKGvhbF+wIUAVFopZV1WQiiEkAGgPMDUkQqZQnDOuechhLJS1FmBEGrI+NWCqFUDAG0wOCEkCL0m+7wxNzVVnhvjvDGmrHLGyVrYt9JSjDjnjaFP1BXmvNvuRUG8sbEBhhRF9vr167rIVQ0u92ezmRdETUmnuq611ggTQojrusrYBh9AWTY7e2ut57cawB6FLUa4UgZjHLhBnucHB/vz6cwP3MFg4Lq8iYikhDQWrcB32+321taOUmrv5cuXL1+ur61tb1EwtsyLKAitNkWWF0o7jrOsMkUpblQIJoCwnc1mGMNgMCCEzOdzrbXjMM932p2YZIUQottrU0qPjo8ZI4xRrRVC1g9cA1jIknFS13Vd18YqRijGGAEQghzucOoURTGfzKXURVZlaWG1CYJAy7TU+uDg4H/+jW8kWdrtdqWUf/7P/of1Qef4+PCTX/709OSAYiAUxZ3Y5RTHvu/7rkuFEE+fPj07O8uy7He/e7i9cX2jv+26blVVe3t7nNNBv+s4LGOM4YoQxChxORXcoYQwTFyXc9dnjusHgMh8NJk0tFqGEiE1xsjBCBFMOXNd92Kb2GzpwBjTVIEEwI2dSq+ENDZHllUQ3xZVqyrk6g4M3sjZxsCrtLAXbt2lZm3EKLrs42+0YJNn24SwNQ/SqtRe1RNLoPDOthyYuUyE0AwMLzIkl5oMrshf1JiLL4IP8EVxgcVFLzQ3XKg6uKzY4DIm+AfbKqZZuj+WWnYJCFY7vLIXf9ucsJiEr5igt4d6cYOXTlu1i/w+N/I1NwhLlIDedGgvsGme5wZsI3bRZY8DvAtg2QunVQMolwqeUjqbzQCgFcVVVb9+/frhw4enx0cNsGsQ3kKOWWig4/K5Wr3oKsRBl01WxhhEKGNMNY88AEJISul74fn5+dnZWVmWjdSdzWZxx110DqCtxdhaSxBCBmlkMQZskV6o+Wal/tvoKpbNNMGS1pqGJlVr7biuqEWe551uvypLx3E2NzcdxwOAqpaz2SxJIA4Dl7O8yKWojBDJfLre7d+8ce0v/uIvAs//5S9++bvfPVxbW3Mcj2GW56WUsr82QNqen+2Vom7KFFdCCCF835dS37hxg2FSFcX6oB84XORJt9dpd+Ka0eHJ6XQ6tUr3+4ONjXWtxN7L52ey9sLgL/7iLxgLnj5//fTZ8199+uv17fUsnzi+s729rpWq6zJN0/X+mue5YRTkeaENUloHPK41VKV+8uyVMajdGtSVOjk9lHXe6caexxG2HqHGgqilFRhRJSpZV4Jz1+XM5V477DJQjx+9fPjZF6PhaRz62x13Z/f6LHksNKLMf/psvy7NdD7eogFoa5UGY6lFyGoKgCwiGNV1HXC3MuL06NilTEr55MmTOi+6nc7h4eFvf/slISSO4xcvXqytrXHy/vQ8Gw5n1hqXU9cJVFXlWa2kFgYc4koL81KOK+mTpLbGl6DqWktprKGUc+5iQg0CQhihtAkQxARc6mit87KQuiaEAMFNgJ0QQlsDAHS935tMJqHnxn6oKjEYDKbDcTtsY4zzee770aCznmWZS8JW2xFCgCNc15vOkjwv/TBmbgtTxrzOaCajFgDiGDmtIHY5rhy+vr5u3Xg0Gr135z6lZH9//+mL51rrMI7arQ6xpizrsiy1wYRw13U4d0llUaWUlUVlwjBsyjWNTg+Oz06VrNqdkDFmEURx7Hh+Vom1bqCU8oNWt7eOEErSPM/z4WiyubXT8C2Ox+O1tTUXvKIqe73edDqv0gpTQyljlDsepxTnRaYrJaVCBtWZsNoMgt6Lz5/zihwev3Y8NpmNPTfClI2GE6VxEHZcJ6prRajrumSe5ghZQkiap9h1CGecuARhbDEYa7URtc2TohO3QFRlOaeIYWPzouCUEix83xX5BETRi8MffPs7UpvZ+UhV5cHR698+fhi3A0XMPJtuba8fnhytDdYGNwc3dq/NRpPNrZ2tjd3Z8eT85AyJAstiNhnJdJ4Z01/bKOaExrFShefFGIGpcctzfCpnaTI9P2WOP5ocC6AWueO0THNdS7escaULBNh1GeFBGPcJ9QuhpDZWaa21kJXSQulKKWWMNsYgrZvqDk3QS0PVbK2V2hhjtbEKwFisEbUEAAjFiy2gXKUKRgRjXFQlAA6CgFIqtbZSIErQZZKc5bZeCIEQYoyhi0qJC4lHmVUaEAZMlQErlLXAmQsWaWVhwYKAEEK2CWinC/5aeyG1V+MMEHrj6m6OULKSjmjBLvSvadLtLlCLNGZhVVo1JKzqNrtS23r5Q2MMvuDkQ2CgyZ8HQIDAgpKiKanKOacEITBKKo2qN9K+4cA0jd3YXNFVDdmzEHUz/0JIuHCZN1xq6IKcqtGgC7MNfkd6CFwEny7v8YpShMuaslHA78QWq+Grq/0saiWsTM4CqKHFJbTWhBDOqcMoQYBBOwT5nAYOixziMEQpIGSkvFQ3Eq809K4GSCKsjDFFOR8Oh4dH+6PxWV2XGGOtF6k+ixBICwDQ7LfwBVP48i6uQNLljS8xdFUKgjEAVtISBJ4T1JVuWNFOzw63tzeHo2OEZVU4nucSSrXSCCHKOSXUWmukQQgBQlgjhN5kPCotEUKIYIwIwRg1FR00QshajIjBza8AN+UekFUN0QIswnoBwFoE4DjUyJpi6HRbYGpkRZmXd27t/vGf/eD1wTM/aE/G4/l0Nj6p+71u7HuckkoaVdb/8T/8h//T/+H/GPrB/+5/+7//4rNHqUqBwPVbN6UydS0A2OnprKpEWZZSa2PM6DQjFPmh57aC3a0bt7/7fl1VW1trR4evtaymk3MctK0fp0mRYdLa2cWAEJCnB6ez6aON9a1r3/w4DkOtLOPenfu3Dk+O2+12Niun06obX5uN67rWm1v+ydkEETeKg04cCkFEWXU6ncNXL5XSrut+/vf/pRLSgD0+etVdGyDSrbWa5hloJBqAyBnCVtoCMUQ4QlAQzkxdz+ajXuC1WwM/6jiqOnz9GkuYFaNWu+8GXUpJmmVOxKrM8MCV1ji+bxDKstT32mVRcUaMqesy4xjarTixFmn76PETasmtG7cZb//9r36ncLh7+16aZiwIn74aHxz8vRK1UVU7DgI3AuLUhHg+Q4RU6iirSw3EIYRUCYznsR9kRjmeSx2eJFlepFJKz/MIYbKWDW2RiwmqTTGcY0Q9xDUILZUV1lpLLDCMQBqlFA0jP8sTpUVVF5RSQhHCFpBZW18bjs7m87mQ7d1r2029E4TQYCvQ2nTmUVZUnLsWUFnWVZ2srbfTdMoYEWA7nVanFQ3Pzuu6jmLmcOZ53vbu1q2b12/fvvnq1auT87OqzFw/aMcBIaiu5TzLCGGMMUQxIzhJEi3F5vpauxXt7e09fvSltiYMwyjwhFJZljmMYrAuZ0cnx91uN/ZaQso8z4MgaHXazOFCiDTPxtNJVuRenhljhJLT+SyKQsaIRcZiJEQlpdQaGsOGEkJrDUYzQhG2SlfzbDopZRyOk3nme20APJsltbBFVhLCkixFRDPqGGPKshJCcs7jfmi1aUgim20HJYRh1mq1tNKT6Wg+nQWu57rcYTSO47ZD5vNESbt/ePS//l/9bwzYk7Pzv//Fz+vXlbZqd3e31QqOz14XWQaw+eDBR9feu/btb303DkK0ezN0/JODw8Hm9myaH5+N49ZhmZXH5+MwkJa5vV6/zbnnB0IIsEYZm2dZlmVVVQLCyuiqqmqFDFGylqqWGDOPUUM4JczzPIfxRoVYi6zSQihjjFZyGfWGG/mIL/PEXfCWw+X9Maxsbd/YD1bSIy9wAF1EL2rd6DNOMbpsv30DLy7v+FdF/5Uzm2z7K1+hy7kMV9TeVwn6KzeFVvIb4V3tHarora6Wv7ULaij7zvtdVZkrm/h3WB1WZ/hNzwg1Crs5suIDendkyeJa7zIpoLfyRJYHr1z3CjhYhQL/uPb2ejWtMROu5r80ViWE36zmu5HBSrcA0BC0+L6vpaqqajabJUlS5U3hlTcGDGNMs1Bfk5No32Hnf+teVmJEMLI88BFCrutaaxljGAMgY6wyjTcbkAVtAQEChC2ARRgDMoAQvLkRDADIWMBm4Y2wAPitwFSjAaOmxKQFi+ybHq5MNVzQlDWOvB9///svHn35n/7qr7L51OMcc6/dCrA1QlR1XVJGBp0+ouhsMrJKt3ot0oqCMESYASgloa7rWkgpdV3XemFNsdpiVMj5LCeY5Z9+iTGUSYGJ8Vw3DuK6FGDQ9es3RSXTNE3TosjzPCuzJBP69FUy73a7rbhz/fqNdqu/tt6P40gpgTHM51MpJSE4TdPDw8Ph6Kwoij/7wx9du3ZNMF5VVRRFg8HafD6fTCaYMj8MgiDgjKVFWQmBjHUDHwuz+pA0S6mtAWC1FP04+ua3Pv72hw84MmdHh+Oz4a173f3Xx2lWxp11DUzuH56NUoTQ8PTsvffu3719Zzqdvj7Yr+sSA0FAMIDLHWRsVVUEId/zuu1OHMS+7+d5LoQosnwymeR5UVWVMUYyTikGpeZJapVk2FACjucm86SqZa0tYq7vBb5fS22klI7vhmHYrF6aptYgY4zWwvcC13Vd1weAsqzzPK8raYwRpAaCli8RQghT5LoudRzmuhxjzBgJAj+KAs4ppfj8/LTVinq9Tr/fZ4yNx8OyLNfW1n7z2596QRTHMeF2lk0o4UEQIUuKcioFubFzDXSFwQ08V7Xa0+l0NhrOx+Pa5XHottvx+qBdZK35fOh6ntCqlpXn0FYUZkVdFIUStUaqyPM4DG7cuOE4zt6zJ6Pp5NbNawghi6BxObcjv9PttiJfiGpzYzuKIkrp+dno7OwsDMNOp1PX9fHxcV3XSinOeTLPGteGFJpSXNUVIQQzrK3R0mjQRVliAGW0QcZIyRmxVhlQZSWDgBS5mIzmUdjPZsXx6dBaYgzyvEDURjY1KQx43HF8jxBSFaXLeOB61CfGGK2UkQqMrYrMaoNAc4rAKoQQJQiDFkp/7w/+4Mc//mPPC3avX/ubv/nb8XSaF+V0OqlV0WqFjLFBby2Ow9t3bty5c6u709/a2i6z0nHdMi+TXG7u3D47z14+e3k8TupSJEJLLOwkFYjToAUW1xpkLaSqy7Ko6pI7TrvdTvOirEUhNKWgylpUFeeuw11pmO8HcRx7bkAIAWMafr8mOEFpZaQyTVis1QAgyxpWVBe6yDRrKt+hC9v1KkpYxQpNW2r6ZboaunAoYP6G1RutGO3xCnfCUm+ttncMyVqzmjLQRCOudL78Cla4E650u/QXwAqkaLz+79QWX4UPlq6Bhdxemujhqv5e7Wc5quUwCLmUt7k6sas9LKfoynXRRXqhXqnysPqteUvbrcrNd2KUK3cK79LrXwOtvr5dgTXLTpYooUl8aD5gjJn3Jl4BrZh2lkGO6HJRCdSQjxVFw8HcbrejKKqLcpFWrvWirIMxC6/V13pUvgYiXFI/YLXWUktKY62153nGGMdxpASp3rBiN+afKzYYdAV7IQNAFvNjNBCMAIPR0KTxNoUeGiJn3djQmpGgBjK8cV1Ye8HZ2oQHMYwxELIRRz/+9rd/+j/9Va5qbepKVLmDojgwtla2otRt9Vvn89Gjh08wxpqTQXtDSlnkSgqVFzJJMlErcxH+jDAmlCBjjVYE59piXgilxbPfPvV8RonBVPs+31zf+NM/++P/+l//9uHDhxSzVtwOgkgkxeMXr8JefHp8IoSK47jX7Q+H42Q+DsOYEjg7PW3y7KwRDqNRHDRB9NevX8cY12XFGHMY11pHQTAcTwmjDatN8/xc5EzZhm3ZWou0Maip1mAalBO1Wzfv3r5x97YRZdSO3v/Gg/PTF8bieVrO8iOlyehsUpcVsbgVx+/duSul/N2jhy+eP9fScMo44z7TAXVEXVulXcKQBaOU73mh7x+8fn12epqmWbfbjcOooQ9grqPqajgc5em0HUXt2Hc5m+cFIcQSJpUAY8NOq7ZoluWcO5M8byoeQJMcUCtrrTHQ7fRc122SDOq6LsuyKVYsjaSWEkq1NkIKa21DZEwpxZ1Oq8lODIIgCDyEEKU4TfPhcGiMqaoijmNKsVLid7/7omZnhZoRvkEIq0QS+BF33bpSk9l0rTMwtpaizObJea3u3rqNLfzsF7+s69r33TKbcpdhDHmVU1TXZVXWIklLwNT3IlGruigs1xI7nuf86Z/80Xe/+90nT57Mk2mv39nY2HA8bzweCyEIo437GQDyPN+9cWMymRyfnY1ns0pKVFVyPM7zfP/w0Fo7GAwI50cnJ0VRbGxsdPp9o8pS1Bhjj/qMORYhZCTGwhjV2JnLqlRGlaLExBAG7dZgOp0eHBx6bjydpPPJPGr11gcbnPntVpUkydlwZJT2w8D3/KqqkvFUeE4QBA7j2ILR2hqDjDZaMkJbYYC1rooMAYo7nX6/+40Pv/Xee+9/+OCj0Wiitdk/OHr06NHzly8oxbUsEVrnDg7b/v3379y6dWN3d4cEnAIHK1++2H/y+EVdyjCMkdPqbN1kcZuGaLu15jgOIcxynmlcTHNjVF2LsiyN1UHQbnVaXhQeT/bSUlS1dh1Si1IUuZUSjAbuO44Tx3HohVohKVUDFASRyFqjQBojpZS1aKgwiyxfyl9CCCC8BApLibZkQb5wlL9pV7QOWkm4x5eZcJa6wVyYf2EFKLxxKFzWvhdBZ0gIAReEB81o7bssClfgAqyggWWfVyDIapDj2+1tmb761duYoIlCXx5ZvSO0Yr1YAoWlwrsCEa4o1NVzVoe9GlbyFuC4GnixOhvvVIHvnM/V9b0CDv4RWGH1vlbblcQHAGgEPb+Y9lWI8PYqL0fSEHlVVZXM5rPZTGvt+36r1UqSpJl3uwxuBYQQUkb+gwN+e1ou3c7FwaqSDUtsI9w451pLhIwxqvFkEUKUgqaux/L5v4gfWvSGgYDVCBAYYzFGBgEyC+MBmItakSugdoGWl46kZYGoBZZFCDVk0YAwWES1und999sfvn8Q+0rXZV3M5xNOfc0hjBzAGJj98tnjX3/xqecGSVX4Hp4neZrm1qK6kvOkUko5jqctBgACGAxF2Bpjawm0Mv1eR6rq+PVhQs14krseRDEYY54/f/p87/k8mwd+Kzk9xohjTFu9nsOwlDKbTs8OD18xBwA4d1wWZVVtZdUK/E47EkKoqvR7XafdTWbz0fmwCcXDGB8fHx8fH1+/fr2WmjOulNJCMkKZw4uqKrPcpxwsLElfEEKAEQDkea5FPRyP/vbnP/vkk19OhqcYzFp/0I8cA9gS+mr/4Hw4tcBdP+Kchy6LXJ4qpesaaR15PoCppTCgCCBiIArjVhgVaQ7GBtyNgvDl05fz6YwQ1mq1Op2uUsrzvDiOj47me69eTWfjWzeuh624UGZ8Pun1+4R7VSny+Zw7XqWklJJxdzabNSHSTfz+MqC+1+tJKbMsn81ms1lS1zXBjDFGGWOEUbZwuTaSoS4t7XTbnW4bAJRSSsssT621Qtau5xirAUFZFRbMzZs3r13fffToUed6dHRyMk1H1lpCKGLe6dn+06cvbl6/NehGJ8d7WZKPTsaz4fS927ddx8FScmtAVKPjJM3nwlTKyKzId65d63danXaUF3VZKmTVoN9ZX9/cbMV5WRiwv/ni84cPH/b7/fsffJAkyXA4zIqcEOJQmuZZcpY0QOn8bPLy5cssy6Io6nWDRt65TrizfSPLMtcJ60qMhjOMca+7fuvm3bKe2cPDNCuksJgRQilCBCElZKqk4pSUQlJWz7OZBh2ESEo5n9etaWqV9jyvFcXdbnd9ffDevfdfvto/OT0NAu98PKqqilHkdiI38LTWIi+TaqqV4ITGURR47mB9vSyyMssdHLC19vXdaw8ePLi+u7tzffPg4ODnv/zFfJ7WUjHGirJuluP2zTvvf3C7qLN5MkymyfnJaV0W19+767t6c337s08f/u3ffcLdsNsZEOqC18o1Q4jwMCKOY4wprR1m5WxWBkFgCM6R4k7I2t2akekkO5vm01yCsZihplSBlNLaHIhLADFMKKXIgLJKaU0AkaZAoQWrjdVmYV24iI97s1dbVD0Gbd+hGq+I+OWfsKKiGjgPGFNKOefNKWYlkQ8u9tPowlfdSFV0YYRYQo3lDw2gRTTAiouaINwI+iso4Y1EeJfpHuN3+A7evs13tncqy9U7stZi9EavX/ktvKXYlor/CkS4Aj4ufzBLfdnE5WVZ1mhEexljNYbrZf/v1P1wGUhdOe3KV3bFOPH7TNc72+pDtcRMjRVhtfolWjEerAK1rwJty1GVZdnpdMIwTGbzg4ODJ0+elGXpcecdw4B3dHKltyvT0jzrAPDmv4vjhFJloWHqhcuwRq9wezf/N0L83Vc3uunZYoIBAJTFGFsKRl9CCRcFIwCZxrCAAAFCYK+Y2JpQBgDAVhtjdNjt7yj1T/7wD5++WLNWKiv+81//lahzQKbVivKqLqry+fPnZ8NxHFmhIM/L2SybJRnGxGiQUhuLATGrlQZrAFFksQVMqQVsLJrP53Ec9fv9qMWVeUIZBBFZ32xpU5XVTKqCOy0LOM9SazCJ2+NR4nlepx13Oy3f9wkhQgilZBQ5N2/sbm9vB0H44sWLNJlNXJcx9p//82enx8c3b968desW5/x3v/3y008/ffFq79btu47vzdNEI6iEAgCttWwi/QDgIutqIesQDoMAhwGm6PXpcZXndZn6vltjq1XYbnWZ6yKMq6owugIAzt1kdH6w93w8m6bjYb8dDQaDWTI/PDx0GQGAdqt9/977N3euJdO5qOsb126eH59rISM/cIMQI6SUYoxxyoy1xiLEeRB1OoON9vqGlFLgeWUxw6yo1elwYgDXUohaCfPmfaSUhmHouUEYhpy7rVZrMpmkaTocDufzVGuNESWE8Ig3PAWu6wZeaGDhAqatVkAISdN0PB4XReE4DqW02aVFkde+SIaMIo9SGgTO85cPp/NZmqZa6yiKtFZpmk2mZ+3QTzsdgd3ID0XoJePx6fGhFDqdjCaTUSUrTCxhptWN4nbYajmqTjAKPM+JoqjTHfR6W+12L2p1Tl8fPnz48Oef/Kosy9lsduvWrfZgDQBOzodHpycIoX6/TwjRCEsh81poRPOycv2g0+snSXJwdCCE8Dyv2+1WQkptDKC43QmCIIxbBlAYtQkZV+U8yWptACFkwJZlrpWoyiyOfVEb60Ga5EoZyh1jbBTQzY21nZ0tKS0hlDNqtcLEjIZHWZr0B33u4KcvnpdVtdnZNHNQxtZal0VW5QXBoOpKBp5L0Xw6JQhtbW7ev3vnW9/61t07txhjn3z++a9+9avffvGllOrV/qE1aDgcamXDKLh58+aNG7fKKhmN3VYrdLl3dnw2zcvt7d3777vzWTGaZo5HgKmtnf60nMhKK6twZQAKZCwggxCiioN1GWMkCrBDS8LPJrOTk1NjqHVbPmd+4DHuUcc1UkkphTGyFmVegEFGY1VLKbW11uo3OhgjxChtCmm73FlVrvpivw1vJba9LUbfaLtmo4bfKH7CWCMlrVFLy8RqAJ25TMK4PKjMJVSxGLBdCPfGhrYMRkMIgbnqd1haCK7o2otwerJ6U78PRFjtZ9VufAkqvctov3ra0i/wNoK5cq2rIGylrUKKxpBQlmWapvP5fNk5esNa8cZlc+U2EUJXoNvKsL/OGXEF0PyDU/d2W529JUpYpm8AQLPEDe33O3mUV0eyegtLHdw8Wk3GOABUVWWkWtR9uMjueTP838/18PYcXhoJWvTUeBwAgDFmraWUGquVkkpJjPGF98wALAi2EboafKOXb4PWFmNDMCHM2iZDAyNkFxBhYWBA1jZBkQZQ45JYeBysBYQpoCam1gKgpgQuoeC53ve++wfWmleHz6s0lXU9T6au53luUOQlAj6fl6Cx1qAVZGVRCaGUwtgaiwAjZJAGq6wxxmhjLMIEEDWoWcGkmLsRaQ+iwVqclseU614/7PZ8xyW9rpvMzzDkG4O+agenJ6Nsfr7e21qQbFLU6/X6/Z4Q4uzsLIpia20UtrKsUKLOkzR3g3a7vbu9vb+///Of/1wJ2el0XNcz1vY73bqqonarFcVZVc6SjGhFMaZBYJpc94ttTxOQjBCaTCaEIAwakHI5D3ptx2GpFqfT8dl4hBDhPrt+e1eWEiHiMH97awt0cbr/MplOwiheX+v4HjO6PpqcGqmAOtQij3GvPyizXJTVwevXSshWFIdxazabzaZzx3N935dadXrd++9/KITodttSo0Ia7PjAuGWM+iHm86oShDk+d9FlarWG6dxxHErZeDyeTqdJ0tSaMsaYJr9skk4ZY40VLWqFnucxzg3XNMsTzvk8mQ5HZ1VVNRzDhJAmvm88Gd68efP73/++EOInP/nJ559/Ptavu90uYwQAceYQyoIguH37JkfMWNnrr0dubIRCeuv4+PDGtZu6qvL5rJKy0/X63fb2ja2tnQ3Hd5wg5K43nqXjSYrBFvl8f2//5Ox8c+tGqUxRq83taz/6oz89G55/8tnng8GABqEXtaSUQHl70I/jOM/zw8NDTFmr0w3DkDA2ns6OTk6tta1WywAyxjiYYMp6gzXXdctaHJ2cgtHn55OskAhTIVRZCSllVRdCVGky3t5a44x7QUtUmdLWAPJdx9nobW2vx1EwGk+NqiujzVwPhyfHJwcIY0Z7QchbkZvnaZ5OphNhrTVSYAuMYkao5zCXM2SN5zg725sfPfjg+u61MHCePn747NkzRfnpyTljjBDucK/T6ZRlPRyeCVkVRfn8+fNur7Wztb17bevGjZ29vb2Xx0d7L/efPNl7tneIqS81FgZP0loCVwQAI6FUWeYYWcaoMcbFXplJzm0QBAbRNKtmqSzB9cM49lqh47gMS7dw60rkebOzzPMcADyv4sRFgJsAO2PAWgvGYlgobNZYJilZClljjAWzpLpbaoJ3bukaf8TiHISMMQTTxgtrL0LGpJTkwhC+tLE3fa6GKawelFIt3Q3LYWB7KSQQmqxFY40xgN+9CX5beS8vcWUYq8N7txq4OHMVUa2e8PZVVoeBLjijvkIxX96wvoUSlje+enyJrpa1lBpWlss62AKARZc03FduZFcCTd7GLvAVmvIfgRVWB7B8Thp5pS8oqJfMWqvzszrPq3OyiskQQr7v13Wd5zlCqNvtdjqdPM9VLd5essb0g74CirwNEa7MgLUWLsJ+AUBr7XLsOE6/30cIcc5FXTmOo0xhQRurrEGAjLEIkMENGeOiHiZBgPAFq4eRarF8CJo9oiWLbEwAYzFF5gI441VUZ621CAFYbK1eiVRAWklrESEIAUFgIK8A6Ob27rXRyXg2nCWzjz/++MWrF8k8QwCiFK2AWV27LNQllEkNXqGMBGy11U3wpUaglDBG64YGAsAioq2SGmqJ17Z62MdhEIRdtzUICK5aHZpkJ2KU3b23ORgEo7PJdLSvJGYI1jZ6uzs3Xdc1Rs1mMyUEwdDvtRiFhqnv9OTo5ORsOh5Zi8BqTlktijzNKCZhu9lbO1LKpnQsJ5RSShAiCHHKLEEAUGqNAaxdPGzmwjcaRhECY0FpKwxGuazTOhdCkMCrqwoDGnR7t2/fWOv3OXGstteu3cCYPn3yO4q1w8FziMMi17t2Oj6thRifnX+W/2p4dLK9sVUV5d7ePkVUS6m1pphMkkkl5N27dwkhlagwo2ErLopimubp8Wkp6iAIXM9jjCHCW92BJ+s4jjHGk8mkUHJZfsgYUxRFWZZSaiV1k8nfvC/WWrBgrVX1gtO9rus0TcMwDOPAdV16dHQUBEGSJM27sZR3s9lsY2OjkbntdvvRo0fPnj0LgiATQRC2jNGEoF5vEATe8Py8rusPP7rv0WBzYz0ZJ+lsHob+5Hz83e9+u8Ock7Pjqs4x1Vk1T6rZweuXtVGz+Xz35h3Gvbwy3I19z+v1sTFmMpuvra0dnZyeng///F/8i+76+quDw0mSKqW44/lRrIyZzhLueAYTaRfV2IwxTQXITqcTRVGv15vNZo7jYIwbNggAIIRwzo8PDrOyCoO43e3VlZwlSVEUWsNoOJlOZLcjfdeP405iVA6pMUYbSSk1Ro0n58dHp6PROIg7hBDu8A8+uBdFURhHQoj+oH16enJ8fLy5tq61rOtaCsEIHvQ613d3NtbWtjc3EZhbN67t7Gzlaba/9/Kzzz79m7/5G0E4pfz+/fePDk9evXo1HI5d193Zuea6fDDonp0eKVkVuat03et1hBB//Md/+tOf//1/+B//X0VtsBNlhbCz7NXJFBDjrhe1YmN0mpWM4gATaw1gOpvOMMZrxHEBZ1llMR9sXa/KlGPkcoaNtJVEWFmEKyE1wWVZGqVUrYIAPNdnhCKKhFBgFsHP2GJkrEEWISQvQgRgRWsaY6y9pLfQ5bYqTK21zUNMLkIIzUX2oBDC5dRc5DXA5Q0lrCjs5cEldl6V6UvXg1lpWiqttRe4cFljNZe4ErS4PKHxjDSt6Xzh7XLdr1EYv49GfPser+i51ftdOe0dgOaKRoQVLbU6mZRS13XjOC7LuiiK1f6bdbP294rqf2tIby79VXjrH92WM38xyMXztup3WAVD6LLrZKHj36W53yDIRUUoXNf1fD6v6zpwvTzPjTF2xa6Dm06+urrC2/PTTCpAU3j9UlNKOY7j+35Dpk4prSvLOS/r6sr9NrepL4pdoZUAVXTBNtb8aYixlllr8QV0xlZbIGiBTpogvaamOHkH/rPWGq2UshZhRBeBEcwDVQO2t2/d8X1+NrrVagf/9i//8mc/+1nghZzOW1FbVrhAJk2KupAGMqWFtXph2sMAxhqjLLIILMaAKSEENUEmUolczGWScr9jMKeOEaIYz9Jf/+bnD96/u7XdY8S83nueZanPQ61slc32Xry8ffv2xsaaNfr4+HB/rwxCL01TrawQ4uxsPDwfAVCHe3maDe359u7m6fGJ67rtdhuMLcsyjuPrN27USset1snovJYiCALX9/OySLKUXTBzNO+DWRQAg9ks5w51XUYYlVJIUVKH+q1IycoPPVHV49l4bdDb3f6o1+mms7TXibU2ceQh1PHDiFGkDMShf+fmrTRNp+PJbDI/Q3h3Y9vlfHw+3N29LqUWVbW0ljHG0jSttGjYQvOizKtyOpkrozu9bsMp1+12Oac+Dxu4OZ/PW61WGIac8wY5KamLokjTPI5adoV+TQgBFiOEOnGn+TNJktls5nlet99ptVr05s0bh4eHAHptrZekM20qh+BalJ1OTCnZ2tra3Ng+OhwqQb7zrR8/fvy4w8tsWnmeRxyHoZYo4NnjMyNVedfZuXHt+HiKte2tbzKE795978nLp95a+/WzL589e4YZDYJAGSQUQZTvXHvv3offeP7yxd7hw+eH51r/emNz8/79+3fw+unp6fvXr0/nydHT5w8++sYfff/7z17ssZhrrdvdfiXqF3sv06Tc3d1dG2xVxawsaqFNVVWTeYIw5U6QZhUmjlQYAKRARlPmRWD5eJSmidzeuu77YVEJUUpdIVUCAR76MUb29Gy4de2BQGguhQ0caaoYQlGI09cjXaIXL17Ms/nHH7dCBzCRHBSqZyYXke94LebZuOva/aOZVuLeN+7cu3P38e++dBj/X/6rfyEqub6+bowtyvrw9dHZ+eiTTz/74rePFfHLOVrfHJweTV3uYaJv3Ol3uuGd+zelKh2Pf/75cDIfD9Z2p3pynJ0kkNcERmlaGTNJ0ih0Iq+lC+locFyHIFoMp0JJ7jnI2GyeME6sHboMOY5TzIfZ3LZaLd9vlWVpDamErivBAGvl1zWShgb9DjJVnudaGuK7DncxxkotWCyNlUJWTfg3bsQdgG647o3GGCOCLbYWWcAATVElhLHUWktjJSCNiTFyUVagMa4uSO4oNcbUda3UItwGU3phMJDGNCYKBmDworCkJYQoaay1jQjTCkmwGGPMFhJNggGtFlZoQoUQCGMLIFe4ijElRuPFXgqaGLGmeGNjx166CRa2WQvQvE5Le+9iZi6sBctd7BuNZQxuKm2Q5R3ZxpqylMaX/l9J94fLW/xVTbn8Lb5IXVtAlqYIB4BpSJyuCH4ARLBFoIwWSgKAtkYoWZRlLYQ2RlvT6FfCKF7U8nhHbMTbR5Z/LgkkrkAEay0AWjlzMedoZUt+Ba69feOrRxazSmnzFDVAsKke2eyQFj+0ejFnsCCqBGtNkzmJUKO3EUKwpN5CVCvteZ71oSGoQYjM5/OGYs4aJYTQWgFAQ0FpzDtiVq60VcTAELs4mQAYA2DAaGNch2dFfq978/4HdzGGPJsHvmtlpYTEgCgmWmttFEJICVkVZavVwowBWCFruEj6AAAOyFgrGi+hRohagpjFpAleUFYDGGQQIIwtRoCUaGJWoKEQs8sVIWgxqwRRRixStVLSSN/gusbT6dRxOnfu3UTk2U9+8pMqGxRJL080RWuHr+dSyqoqqrLgzCS5BWAWqEUX6U5gLWiEECEYIbBaAaKcOQghLWwoy07calEbclvkM+TKmbD+Wqh82D99rXUd9d3JdFbWc6RgPk0qqU9Ojq7tbE8mk2Q+bbfbUtaUUs8LACFKqR+HRaXAZf6gHcXtre01L+C/+fxTaYo/+NEPLMDvHj189OrLk7PTm7fuII4tgaLIuOuXuQjdOKulMSaI3VrkyirmOllVONg1hGAWSGFMWQcejxysVIHzJJO1IJRi4rmulOL45CBLZ1rIusqePn1KsL1xY0MqU+QjrfU0mQcG9/v9HnNnftTrDiiis6pa29qdlfX27i6hdDQZKwaM8+cHz1zfY9abz+cA4GCe1hkF5Ls+0XY+SxKlJuejOI7b7bYoBGMs8GNDM0Rwu93O87woCquskYYYINpqaVGloTSkMkwiYzS2oAlXyiLCO+0Q4YUAq2tNMWKtuEsIraoyDNoYg7VWCNHtxIQgaw0gg5AmFILQHax1Xa2n02lZltl8AkAYJlbZ9cHGy6cvxyeT29dv+NyRpTg8PUMWnx2ffPyt73zjGx9Lqf0o/OCDDx49eXx2fj7P0ocPH3PPL6sq8FulqJUsEWJao/F0rJQq6uqb3/oYU/L8+fM8zzc2NhrG6TiOuajjMNLWjCfD0Wi0s73uOg7GWNTWaqONMUYx5lhru92uUXaohoQQx2FFUY7HYzcMs7oU1taVnI4naZpLWRurKCa+63EGoE0ynaWzOWPIZa4RSmkByPQHXcZJnmc3r19zfO/LL3+bZZm1tt1ut1oRQkhUFSP42ua2VmprY9tzfM8NRF1/+unnk8mkKgVjjrJGSJ3mxflo6LjB5u712TA1RhGCsnz2zW9/9PE3PwhCZ+vahrXmpz//O9+LNrZ2j46OpJQU+Y+//I3j7mhFN9Z3KZ7V0ghRAVKEOhZVCAOhhgBYq1WthZJacyDyTfA/wQ2ddpakhBBkLMOEMEIx4ZgYz2BAZTZpVFEYx77vA4AAYaXVWpuLDEbUcBxpY4yxFF2R701r9tmrnvVG8zkOQwg1DD9wEVndRHo3cVTN7hBZSwgghDglS9W47A0Aaa3xynGE3oSwwZKoEVCDjjVSCwK+FYLhZlO4St1oL8ihrX1T06s5E+E3Nmq04hFYBQ2remJ1X/tO/bGqzOxlA/jqCJf9vFMDrZ68et2vObMhBWoci839NvlgX98/fLUW/P9jW94sukjyXI0BfGdCyuoirh5ZLkHzQEopKaVbW1v3799HCB282ltYksAsz7moyPzfYVrQIjwCNYXx4HJIynK0qw+DXWmrU0EpNhojgxBCFqAJZcAYW6ttE5qAtQWCjUVgDbIUNQctQJMJixauB20tXBCGWrBwYYgDhZAlBJVlPhqd//SnP/3JT35ydHS0TDlp4IXW2hpMMF8d6du3DBf+o8aTiBBCwIwCazCytN3upcXQc1Sn1et31h5lj2Uh1/pb3AbTk9nwdKwlRHGrSLM0zYwxrbjT63WzLKuqKggCqUylCq2sUsqU5XyWKG3y9cHte3d7a4OnTx+/2n9NOGu1Wn4YJnnm+F5InbwsonbLcVgch0IIl3GhgSBA1lhkGEHIYb7nV0XtMKJBg9ZGa2FqKXKCrcdiQhlGSAhzfD6pKxN4HrJw48aN4SxnjPNKj6az6XQehGEYttNsmheFHwZeGCVJ9tuHXwIirutrQJg0ZTwWOxDCOOdcZLLhpQ2CYI3Rpq6jRZBlmZSyKUdSlmUYhmEYur4HGDCgLMu01gSQMDoIPGOMUFJqLYxWoDVBGFGKMSE0EaXWiiLKqcM9jxDkOA53Gf388y8JIXVdai39wAVAZVlIobM8sQYRQnq9nus6Qhac48GgE2vPp9F4Ni1Z6ZHQWru1fv3B+x+sr63t772KgnYynU2G588eP23HnTwv//Iv/+M/+fM/973o1d5rSpzffvGQOVwZA5Y9evj8fDi0CNzAN8YcHw1Hw/lGa50xZzgc/tEf/3GWZQZMq9UyAEmSYIyVFnmWlGWJMQbuuNwRVQ3GWmuUkGA1wYQzFoZ+XUlGaClKSjFjnlKqqopWK+qsbYzHY2E0IlApUYmSMgzSIIyIsRgTUyvLsIc4AWSNJpzqymgwnU57MOjO5/MoCgDgmx89aBiowtAHgNPT09Pjw+FwWKSsqqpsMnO4W5Z1v9M9OjzLy9pa0LZK87KoSmFsLZTv+04QtrTgPOp0WsZu//n/8CdR7J+cnxwenA4Gvboyd+58+ODBg08++WRvb98opiX9v/yf/68IIUqp6wRegJSxRVWW9dzjIWBAxFKLKMUCgBpEMV9Q7CmNGSOYoEYgWEsRtmgRLo60EVVtlAYALQRCyHEczjmixCptrdV2YQYw1i5FlwKrjAagV17+Row2QWFwEUywFNla6GUA2rLyglLKdV0D1l5YVsEYYwBjrPWbUj36DdUxUUpRghchZsYA6GVM8jJIwiDcbPeFNkEQoBXKmaX8XRW1S3eDtYYQYu2biIQmcvNtqIFWvHXL48ve7OV2RT0sb3bZ1Vehjd9H2axeCP0ezo5mZt5Jn/D2mVc+fNXx3+e6bw/79zlhVa+8/SdcJEMu8cGbpUGLgS3b10STNN02j7rvuTs7O03ph9HZaZqmAIDRAhoaYxoGzP9WnGAvOT4WY2ts2pzzfr/vOA5CSGujlEJGL58Ne7m22ZXnaolHFQJjtLXaGA2YNCGDYLBWygJYTJBBiFgLuDFeNUEWeMGjYOwiOkEbi5CxBC0CGqw2VmujVCqm1iKDVCWLl/svP/visy8fPZzNZnHc1rrxqmujwVowBhlDrJVXUOyVP5fGsGZiq1K7LqjalpmM/c50fI4UVInqR5t1qqfnyVpnnUIkRVYVQDEr0qIoKgyorPKqqrJ5whgjnFHCa1U3xe0ItRZhqU1Z1j//5Fd//6tfTyYj5jr/+l//y3/xL//58fHxv/vLvzQIyrJUXEsjMYZalJhaWQqCHZDSKAtIU4ysEUWWi6pGBnGMMADBxuWEEMapw4jV2rcEY0IJBsC41JoY6zjOz371q7Ko1ja3fGtZEMSYlXX9dG9/t9d//fo1Yc76+iZxnCACoSDJiyAMMaXGGIsRxtRA4xHjpc7LsmzkEnOdBlnWUqyvrydJMk/T5nWu6xpjrK0hDDNMJsnIdX2lVFVV3W43yYtZmhhtpdI1SIm1RRZjSwgYW2OCGEeOSwKfUoczxhhj1GM+55xhaq3hDh6Nzs/PzxyXYTCNfVjLUtZlkc2l0GAkQ24n6vs8Yg51HGc4HFZVxYgTBZFD+XQym43Gk9Hs7OT8yy++dF33+OwMAG7fvvuLX/16b2//5PR0fXPDIMw4N0AJcYSUx0cjKeW9++1edzOZz3d2Wjei61LV83TWbne1VuPZFCzClMiqLIrCGsUdL/Bdzkg6HRNClNFVkSNjKQVkNAHkuCzLk9k04Zz7oXd2dsYc+u1vfztVNqtLhJDHvbQqEEWB58i6TuZTUSlrhKxqpx15vfWiyLIsBQ9ZZJSRiOO405FggDSvJe70O4HrOY4DYCkleZ5lWerjoHJ45PpS6/X++vbu9XmaYubPs3w2nR+dnUttwlYMhE/SNHlR/tkffez7/t7eXhj5Byev8+c5QqjX6yVJ8dGDb/X7fVmbKOycnnzyN//l77TWW2vX0jQdz8a1mHiBG8Sh5xILAmOhpalriwnnPOSMS8c43FN10Yghq7TWpia17/uRH1hrlZRIGymFEqLKCtXkZRHFOXcwsgi01hasxQhj3Fh0GisCAFgAhDGhVL+1S2s+NBujRrWvRgYIIRoWrDBuAUATWdIIRwTQ6NbVrsybssjQbPcJIYRgpRRGb0gGjVFL28AShVhCm2+1UotyBhcxXwsBjbE0iyA+colmgFyVaysUPasSH11YFMzlikrLkVxS4Csm6EYbLWs2ootN8LK64ztl69eon2Z67eX95TsauhRKsizG9lU9vxMcrB78Khjx/327cgt2xYqD3tphryK/VYgG9tIIr4z/ypjtIkl4wcoQBMH29vZoNNp/+aLZLhst0eUn4R8RfLH6GCCEACxCSCnlh+7GxobruoQQUeu6rkGrJb9Ts2WHC5/LpWdsBShIVVlrrUEGLGqcUdYiKRElzSOGGqMgYYYSjDEmDVNCk/WAkNXWWoMwACCwgAiyAFYprYSspZJlNldKaWWTJDk6Ojg5OanrmjEnSTIEzSUoRkhpI5ryPdQun8nVSVh9ZZZ3QQghhIdBx3V8K03sdzkK6ip9+XD/1vadtr9271sPdrduJOPsqfPUFA+n07msVTrPkvFUSltWkPpVp+N7YTCaTIpKlJVQgCh3EKGYMAtUg+KM8zAaDs9/8nd/191c29xc3762++XTx1mR6hy1WlFd10VZaq0tyHa7XZ1O8ry2VoWtwOU0tXWZV9ub277rq7pStdFKK1nKuqgRIOxoLY1VlBLPIYVySut7yt28vZGmaZJMz56crQ02f/iDPwyC6PPPf/v086elMf0oqrU5Px9yJ+h2+4gypXQlhLUWLAKEjdJaWaPBcRytdZOt4IVBGIaU0qIqHcdptVpeEDQ4crHDIdhqhS3kacapA8bWokSUGKOkVgghYIhgSok1xiBMEcYx8Tnnnue5rospwRgIMhYU5YxhhBzGXdcBpERVa6VCv+05LsbYdd3QDygmSsiyqMqyrArgnCGApr74fvb69PS0zovj1wcO4xDoQa+/tbZGrD0/OQ2CwHGcL7/88qOPPrp+/foXX3zR6XSa9Js4blOHawN+EHtBXFUVwTyZ58cHr8I4+MEPflDVNQBo0EKLKIoaJVEL6VCys7nhOE6el6dHx7rOPW9BXUABMAJZi7ouJ5OJBjSbzRhjZV0kSdpqtYIg0ID8KGzKbCjQeZYGridF5Y1pnjlgFXMdoMzzI6AMcyevUsuYACi17jLOfY87DiNkOh37hBVCDqcTh/M4jt/74IMgjo+enlLauXbthrHEC2LG/b2Do/EkYdyd50WWV4iSMAxbrZYxChEsTdXqrmUP53/0Jz9WUu7v7zdlQE9PjzudzsuXz8/PTzHGZ2evHcfZ2dnZ2Ow6LlI6m6UVBgCttDVKaEZRXlTzpKA8cHjIKEEGkNVVURZlQSlVUtZCOI5D19bCMCyLwmoD1lKMEaHWcRghBGGFasdxmONgjBuW40blK/uGlg4hRNBCpdVGrUrqpSDQFzWi7EogurU2ipzGhdTtD/I8f/Xqldba9YIr4h6TRTNGXSgAtLL5NuatsLWm1JlsAM3lNAR0EeSFMFlK+ZWN3aVASIRQQ6az7Bwh1FgXvkYXrsrBK9r9MlR4Y28wF/kdb/eD3orX+6rrrqrMps+lvnzn+UKKBq5JqYQQRVEURdG4gb6mLdcF3oUS/rtDBHhXiMPFily1Wq+u4FKnNqjLGNNQOK/2duVBvXLFJmqseWDKsvQ8r9frXbt2bT6fp2laFnJ1OTDG+ish1lfe1wXcWRxZWhQYY4PBoHmtlFLWKC3qWi3IIqWUVVVhjFfTPq88JA3QadAAXQTEgFbCgAWBL5Aos4yCtRQoYGzQhWtPL7jSLSAwCiFkEQarmy2GEKquKillJVSapnmen50NHz5++vrwMK9KhIixgJBFYBsNpaxRFtSFTc6+C79eeUEQQpzzVtzZ2NjiDrJQcmY3ehtJyo72zv72P/008PwbD+5ure0Wgby2/v53Pvqz+Tz5f/+Xv34i1Pn5KA79zQ2fUooJSYv85HhYVEIj6/iR4zuAmLYEDHA/midJkpXSokrpLC8rpYESPwwRQUaq996/p62qjk6KMkdAfM9gVGIjvZDtbneDKGTYzOdZvx0zwgQG65BBN4wj12HAHfzoyUlZ5aUwlELc8XqDThR7nFPPIywKsK+L43kmxpbXG7vXpL2djvOTk7NaaaHyeVm6hrCyKsoqz0tpgVKqTUNOjwEAyKJ4OrqgkGlEVlVVTf4Ccxzf95sap1prwKguKwQE2YVtzWqDrCaAKG5SVY0xCAihnuv7vud5MkkXH4wuy7IoaosAY0zLMjPGME48nxqjXc/p97vdbjfPU8fxXNen1LUWgSVgiVYwOx/5QVBVldU6DENZVkibPM3S+ezazo6uywSmoe8qJYajk047/PDD+7P5lDvsww/v/+IXP58lJcKwe2O33+9aTBDGd9977wc/+lGn06ulGI1G//4v/0dlzGQ2wxhvbm9SSofDYcOLMJ3OZ9OJlHJzY6vVau3t7U3HI1Xm6+vrhBBKEPVdQrnDqMNZURTdbtfE4XQ6Rxh3Oq1utztLpiju+62IUhq32oTTuswpxWD1YKdntOIET6YjLQVvRU6n7Xney73HNIwQIdOy8ou8EFITyhCO++txFNV1Pc8LUUnmaiDc8aOd68ZxvG6/a4EWlRrORrMiGyeT7Z0bcatd1aIWlSgLxXncCjudDnNUXtanJ+dKqeOTk6IsXc+jFBeF/PLhb+oyn81GYeR1O9QP2Gj0rJARxnSw5vfXolrqopSiFAT5RjlVobJUElZwNsekaOz5otJlXjiOY62tylLUdRgEvudpqazS1liDMbJAMbaEYowpQ004WJNthgEWeyljlDXSaNAGY4wIIo0zGN5EXK++/EtSRXxBo3kBAVxjTBzHQRQ3ptQ3Bn+wTaIyxhhfmJHt0hlxUQB3RXmvskEvsiQE1ktZvLrJXvzkglh6pS0s1faCWqQBCpTSKyGHi8vhq8kXV7Z0cBk0AMCV4ytjBnSBw6741Ff04hsk9A9qoFVB/FU/WWIIdGHN1l9dE/zK+OFdyODK7vxrMM1XDfvrv1od7erg4V2KZ+lMeQMXLF5+hVY8TfhyGufq58aLUZVFnueNaarX6wVB0BTOan679IL9I2wKdsWi0LTmMWCMtVotpZQQQghBMKi6lmZBjdVU28EYc87fOWmLg9giAoQgjBECssC+BrSW1iAgTMOCq9laaxGxaFmWrInLvHgCAYNRxphaaSFEE1QkpcyKcjrNZrPZy73Xz57vjcYzpRFC1nE8pZSUyhjRUHVhahmmSqorS7n6iK4C0CYrrVm4bF5QZvI0j70o8pyySF4934/8KOK/ewjPy0Jd37nd722tDdo3r92hmG2uTwaDntb67OxUa10TqREAILAYYwqIaIusMYiQUmoniHa6varOhKh+9stPgi9/d3S87zi8KQwRhkEYh/J17XjMGDsaP0dY37jWvnn7xs7OVlWJ2eh0OhZpMnJoAAbaQXh959aN65ut2PV8fvtGVpb52fj05PygqLNalDqptJaYk431zR/86A8QsIP9o/F4FPpRGIbf/cEP//qv/3p//8DzfNcLlNLnk7GSNs9zacFxHMdhlFIgGlHqut7R0dAYE4ah67qY0eZhaIxMqyZbs6h4R5p09wZMVEVplK6KkmCgYLVUSgpRVdZaDn4QBS3PGaZZA0zrskznaVYWTW/0w/fvVlWFsLXWZFm2uTaQUtaitMpShLHFZVbUiIpSaWFlpSlCDKHRbGaN1L2ug/GN3Z0g9FqtuNtpdVrxi6fPlKwZsZsbfdejv/3dZ0Lqra21tc2N6zd2Pu70bt6+9b0/+AFg0l/bODg6rIXqdDq+76631h48eLC92z06Ovrkk0+CINjY2FBKHR6+rirxox/96EJ82yD0wygIQj+OY01hd3vT87zRZFaWZVlX1mqGyebGehCF1OFCCNd3r13f6fXXlFJJljUEHcoo13cws9ZqSp2AhpTiIAjgiBVF0ep2LeggCLZACiHm83lSSyer6qpKaoktUIJaWeE5LvUDLdWsqIQQQkPY9ZU0R+cHRSmfvnz96tWp1CiZl9ICIayqyyyZl+lseHzgctZqtaSjfd/H1EvzajieCaFOTo/Go9N5Mnry+ItWKxistW/d3t3eWWu348PDg7T2prN0OslmsyJPqzQzlIbduD9PCmKAIWW1LctaykQZEeqQaE/VglLqEyoplVLmec45F1VtpEIWKCAwVksJTWwjJcpo0AjZRbJiXddlnjcGBoSQJdgipMFapQAAU7LcECwFlr2cT78q3LXWlNKqqqbzZDqdNoxjC5IAdGnn2kAEgi7y3BBZgo+mE7hwbTStkYmSmCaurdGCC2F0IVf1SuD9cmO3CiyWN2KMAVjFBItvCTb4cj6CeVfc2aoOuDIzS0OCvey8WG4UViftii58u62qzFX88VW/avhcmwiMJS75GpPA1yCDt0/7795WZ+NtILI6OW/PM6zgA7iYkys/eXuWlj8xxjSqMc/zZpvenLB8urRS/62oCN5CCRcPl22KWnHOi6Ig1gghGMXGNMkrDUGIbAw/rutKKRuzx5Wu7EXRrwtwaZpSDot3FwgCi6wBY43SYKzFBlFqAYBg1NQCQgstD1Zra6RQdVVlZWN2EkqpNKuKXNWVnc/K8XguhOHcbZxoSqkmmnyxUmABvVmIr5qKZWvogOq6Hp+fJel0Y6M1mZ69d+/6rZt3kDV5nr/ee/3q+SstSDKvnj8+JNgFwDvba+24E3hhv989OTlJktT3/VarTRzOsryUCjMHEFFKG0wwRczx8zwdz2faiHY7xpxXoi7rinJa1HkURa8O9hC2CNvvfOc7ZVmeH/5yezv6xjc+3L62DQAvnu/PZ6M8g9DJsEM4dTl3CLDZOHn98lWWz14+TfqDrkXybDjLRNJba29sD7zAQZR0O2u9zhYhzuS81tLG3mB39/qX1d7dDz6grj8cjs/PRvN5HoXx+vpmUdWNBGuyw4wGBIuarg1pEmNMaNVI2oZLUQghtW4KlDcxH5QzDKjBl3Vdi6rilCJteq22xzgYK0TVZENgbXSaVdpoaaqirqAu60oICdqqShd1RQkFxjFCtixrQGpzax1j/Pr1a4JZq9UBQHUlhajns0wINZ0m/Th2Xdcalc7nlGFjVbsVtdutLE+09j/66AEYlcym6XwSReHp6UnQam112nmRBsHN999/797993r9Ncflv/3dlwdHR//1b//u9cHB+w++8eGHHz74xkfvvx9du3at2+3++3//76uqOjk/XhtsRFHEeT0cDgeDwZ07t4yBbqsNAJzQKPA3djYfPHjAXWd/f//14XGapmVdEUKUhf39/clsVpZVEIXdbpc7jlJqrBobuBZaui6XUkgtPN9RhSQEYZdbRvx23Br05vN5KmVrsC6lrJSRFqQFjZm1oETte15aCouI74eA6tlspqVwPB9gCshqoZjPEQGgdndnV9R2b28/DlsOZYNeJ/BdpFVdlqoueNydzZOtra2nT1++ePFsZ2t9a3vr+rUthNXGejRPz0WdaJPvv3785Flalfna7jfy4nQ8nZc5qmtc5MYYXJYpZQGj1Pet8oZNAAEAAElEQVSQAQlWC1EbKwA5QpC6rht3BqdMCJHnORjbRDhSQJwyhjAYSwAhhBamy4WzceHRl1rzRtoS3JC1WGsbI3/Ag+XmdVUWN8HPzd5oWXASALShnufVdX16PizL0vd9x3GqWi5DEdFCXC3imwhdbMExfuO/MGbhWVjRi4tICA1vNMqyDAQG1Gw0G+YltEw9J0Rbu+AbucgDJIQQ0sRGvHGHw2XNvcQKF6EXl9DDcjbgItZtqZNW52eJEuyKzWO1h98TKyxPXlWQX3VaY5NspHpTVLohP/4H+39n+/8RPoCvVi3vVO3wFSgNLs/hFaAAK0/s8uSlKaLRfEKILMuSJFlap/BFDS1YoMmvq/Tx+7eG5g5jXFUVQyClpKRhJV+MrfE+WGubzILVl2W1n+aGljzmCCGMKEYIM7aoBQUAYEAja6xBBphGCGEAS5p/ABYAG2NAKyWVqOu6LsoqL4q60lpLgRBQShyjbVlUUijsECnlkrqH0osIYtFk1tDV4V1ZvtW1aybWcaEWZZrOd3Z6StS9TuebH3086HW01v/3/9v/Y+/lIWeB64Zx1I7Cbq83eL3/dDqd5kXabKld7kVRhCmhrieMVUWpAYSQpVSIEkK5LGsL2PH8dnv9vXu3trbXTs+OhpMh91yTJ67L9/f3tra22u34n/7TP0/T9HQfcc53rm1rI1/tvd4/eJ4XEAWglGQhG3QGu9s76+sbVZ6eHJ7uvXoesfvdaNvxWZbK8TRP57rTxY7DweLpuHzy+LWs7HSc7GxcJyiejepr128SyifT2ctX+4BJr9+XtTw4OOj1BoudAwJrUfPOWoOiKLLWNs6FKhPW2oZuuSiKJp5lGejaWChd7jQ8ik35eM/zAs/vd9ucc4qJMSZL0tFoNBtPqqoq5wnxYmtBa40s8tzAcwNGK2sR5bc2xTyZzWbCEsSjubYiySx22t0ewwRZGJ2Pz8/PUZOjzCDJz6P29r33b6RFenZ25nhudxAiZGytaEB/9eWn2KdHR6Pcg1TYnVv3P37/Ozdv3pzNZr7vf//P/rCqKt52Hz3/7WC3G8fxP+/8eG9v7+Tk5Pn+r4UdFuJoNpfW2n/2P/vnk+Go2+3Ok+kH33jf4/58Pi/LPPTC4dnZyeFBHMd5luxu7+zuDtqD9ng8qbU4H51MZuPt7e2yqvM8x4S6lOV1Ok7PiAEr1GCwHlqZJdnRyXGv1/O21rHRketQxCUGbe10PGfMo5T+f2j7z2dJsuxOEDvnKleh4+nUpbtEa4gBsBgsdneGGBJL2gjyH6AZ/xkK228kP++YLWdJYgbkzkDMzIKQDXSjuxpdVd1VlZmV8sl4IV1edfjhRviL97K60RhxLe2ZZ4SHi+vXj/yd35mvSg/cOhfFjKHfu30IAJoRRMJYZwT3xkSAOi8XyzJVUSfpV1QuJnOZlJ1Ohyl5dnx+cLD3zW/8IhPJ5WTx3rvvzqaLPC+VUr1eT8URETlnrF8ZM5RSItJrr71mrTYOKw3W+m/84m8iWWQuzxdn5y+LanZ68fR8mS8WRL7vAPJqXugyThCUYInnQncTBC6LqmGGGHAP4EnHiWh0cXFSCaGkEGiMtquyLJVSKkk558g5ERnrGqvTOPEWtXWInhRjjIFjAhVDQd6StZ7IWxuWnVKxdwyAhWyXtc4YZ61zznlP3oOz6CwaTdauMwLWmqooiShRUSSk994byxkj7xkwQCIg5zwicqE4Y14HeQbIwSMhkYc1Cg+YuzIXWIAfMO4AjPOOkHtcGxbgAELyRTsrEJRSXErGmAcoqzqKIsEEORscMsYZITnyQOsOgYjIBYZo7rYd05LzbEeDbygk3OJV3M4vtHT9N8aNg2ykP7ahRb8FfgQAjYAEPlAgIHgk8M46cs6EmBAiMrgCQzhXgvfMEfPAvJWIEVOSK9NY8BufMpyaeQQgWhuL2zYcfBkMcHOpLS8Cbf0FojUHF2wVngAgZzfDAGGbXWdJavfgHAF8CIdwzoJmYgy8t84Za7X3FsATOe/RWp/IBADIE5HzntATco6MOb+GJXLGYGPwAZEkZIwbY8D4mCvtdJOXujbkQEkZRQltQg7IhPdeySsu0e1ZsnbNI7K5hQ2DJ8/AEwFh6OPoNGfAAGIGB6PR0d5+vapc1SglVrrinHswy+W6xbBSKtguRVF1Oj3GiCHzDsPyJwwkzUDkybu2/xkReSKGHLZq7ULdJAEwWzImGHJOfF0HCUAGQ9EcM75erhaX07KpvfdAbFUZKWVelbPlihj3yPKqllLWukySBBivtXHOcs4BFTCGPryhjsgRuCtkBmNEpFSsZMdaJ0Uaq7G36aKai9pY8k8ff3JrPx1H1VFqBqyaLVa/+MZrD0b7j56+/N4PPhodHP3Sr/5a3PeRi1dFQYyez49t3bz79ff3dna+ePx0NptRYwR5wQDJWaylUFmsdKMvLk729of7/fTuAQd3nrLVMPGuLg56/eXFvNvtltNFL5KuXNzZ70dVpKK0Xs4WucuXePxcv/Hmu3lu68qrbn946/Y7X/9aR4k//vcf/eBHH3EGs/Kzi+nLbnc4ubgU0YDmyX78FemJoJm9PE1cHCcq4m4yffrp5+add97dVT1wl7o8T6W7+9pRtzN68fz8iy+eCUJwaK0dDMfee/D21uG+t9owiONEKeWMzcjXRVkXJSLqojLeeSBCDFQqgilE6clY18RJd7m4MNbsd4emybN011rT1OXXv/r+xdn5eJA85Xq1oizLnk10r9tjQpxPJo32B0eHHtijR4/Fg9fvf/+v/zovV9049cZPzy6m5xfz6Xx/tEPOkUddN1rrbrcbx8p6J2VnUebL5ZwJnvW7cRZ7hLqps35vvLsrlOBS7OwfHN65lXY6SZI0M7taFY+fPglY988fPtw/2M2ybHIxJaIkSd966+179+41RnPO8zyfTBaj0ajbHWRxkiRJp5NFUdzrdBmH6SUJyV5/40HTNJeTWRzH4/GYMayqylpzeHRw9+7dly9f5nmZdTv37t1zhJ988smjR198//vfL6viydMvyqrIRnshbVMUhUe/s7crhCiKIuumDMgDBX1DDBExpL5bqzf4h4QIgI7AOQ/ktfPeesV0VZTLvKBy5bxQKh3vHjFUwMVyuby8vEySFBlJyZ0zk8l5VRdlVVlrPVQAEKsoEG9Np1MhxHg8JPBvvfXGcNTd3R0f3dp/7/1bq9XCQ/S9Dz8r8ipK0n5vtH90eIgySXtcxIs8r2ttnSOGnKMQTAjR7XYvT1ZN0zjnIrlmv5dSxjKOoihwVsZx6pzL8xwJut1u0zRyE9Wv61oIIZBxzuu6dmad+gpxxhDqV63oab2VTYbYb0j4/RYaHzeB/W1VytpWkxtz2DnnvEZEFQidtvRvcNIZY7Sl1rxbC2slolY93wh14Favh/Y6WcsFuYFKOOc8uW0VtdaObTHb5vrbfbZPBK8Mup6XgS1owraOxE3++8bPXz3jNd1MQP4qneG9h+tdIbaPE3wR771jhJZaeqsQ3mxL/W64ff8Bo33cf6f9f5oV8tN+Eh5fazxtn7Q1buhG07KfEnJoR5vMorVdwnq93v7+/sXkrNFRXdfWrnPwAWwbWLm2H822XdUetr01zrmxGhkoJQG91ZZz3klTrbWUUggRxVIJzjkv8lVd11EiQkzOOdc0JmAtaYO7tH4dZmhtxytTAODV+6VN7OrVAFj4Olxr+K3167ggbKRBXel5bYOk0gGTvxnbET74WQugjZFs7E4IfCzWe+u90drECkWcdAZp1u8QF6eTy6dPn//1X/2AvOoND4bD8eGt24bgxYsX8kKpTO70egIZR+GN7aUpJ+wkcVkoVYtGWxJcCK6QAefOM2tskmRFUWVp99bRnUaX77zzzrvvfvD/+B/+x/l81usOlIx3d8ed7p2maR4/fvLugzceP3rWG+1pqh89/Jteb3A5me3sHtXVwnvf6/b7veH5yYtPHz6az+3t24P5KnU+NSYi6Az7e3fu3b51+Jql+q+//xfPT55mT0/SNHYesiwjF9+9Y8qmQS61s9PFPEr6WZf1hoPXRfT06fNQBC7jiHN0ztRGh9RD0zTkHG3A127TFQ+ctd45Iu+c9c6Fx6mE9W6+XCTd3sWTL0LRxEF9oOv68mLS6WXdTseRH+8f7B4eLWbzew86y+WSSXH3/j1PGKVZ3ZjOsCdmi+mjLx566x7cu+u1sbrMkuj27SNT1ZKroiguTvPuoPONb3x9PB6fnJwMdnthUXa73bzKl8tlnCZVXTtvFnWRXxa379zykmvAVMiz2Ww32U973dF49+LiYnfv4POHjyeXs7JqTk9Pj+4cvfvuu3t7e1Lxi8lkPp+fn11oDYvF4uzsjAOG+yfCfre3WCzqupGM37p1q2n02fmJ5KKq4qb2oeifS3H//v3BYPDhhx+madzpdF4cHx8fv9jdHf7Kr/zy4a2jp0+fVlU1nU6ttdPpFACSThIlcW/QH41GxmkKrVYC7cfmbfHegL8ZLgsygBCc88ZoR0Yz3ui61o2xvq4XACtjHBADwCJvlsu8qirw6wSn995ag4iRUlxkzjnGhHPU1K4sDIAhkETe+2dFsdKmzrL43v0777333nBw9/BQT6dTAFRxiiiRccGF9YYDIJInS5aInBIyTqIsTapMO6+JQAiGSE1TWWs5oBBSCEHO13UdZG4klRBivpxlaRrYrynAZPimF0DopYToNwIoLNyg824InVethDB1jHF/RVdArRxfFzkIBW39gnVEJFASEeFaryMibPx62CpMCGEGxhhTN0vMYathbiu+aYPj40KtXzZaS0/nnDNNFEVEPjx6IsJNgmD7jlpovfc+RAhelYy0BcHbti3W+Y4t4ELYDjnmL51P2FI/dOXCBk5cf+XXbsEY25mCLSXhnLPWG7OujQyjvdrth/XzKOxX73d740sn5Mbd/V3tEmp9esSQJvBbo72FbVOvjeVcC1Fc32gfxCa9FdiLiXFIs1gpJSXnHJ1bE1aGeIbZNHvcvotWZ29fxuaCrfUGPCjOkJG1VjBCRuQoy9KQ60fyQnIiMqYB5oK2DrGE8NDDIvHeB8Z+2NRMIpKScm0vXofRbN/m9usAcLUIbzzt1twP/zXGlGVZ1pYxFmCeLarGbzVeaZfZZnpfBdWuT9NGg5B5zkEqFBIK6502ZHOleKdkhXGTxer42cu/+sFHt47uoxw0FqWIlovlyYvjbr/fr2VPKgbcag3AXF1V1idSJVGcY2mtd0RMRci4I2hqr7WRMpovzp3zcZyu8kUUpTvj5Ojo7rOn3y0L8+jR48PDg699/b2msUDi6dMzGQ9v3XpzZxf++//+/6udmExzJbtZkh4dHb333nv7+wcPP/3s8nKVV3A5XaHbJZ9WDZtMV5Yw7qQvXp7zCPqDgxfH55OLFRc1kY/jXMr4zTfnD946ODrinU5vNptZw1bLusi14LExjryr63oymSglAPzkIk7SiBACrNUZ44OEFIJzHtSX9+CBPJAlj9YCYl0VxuiL2fTB3Xtx1kl7/fPz0+99+MNultV1ObqcDnZ2Ty4vtNa7u7urplqZynsfK5aXDXBxePeoNvbDj5eiaFbI/d7OeLw3ePL4i4vZpJdm/V7nvMz39vaSQp2cHdeujjoRKjy9PI2GKsuy27dvD4bDZ8+ePT87eXp2XNflwa2j6TSXUh7evVto/fz4Zey7MkkYF3HSefud96R6dHh4+Prb7zjnvnjy6OXp2SIviPDly5MkSYqi6PU6sUpmi+nx8fHHH3+suOh2u6+//joAC8HqptHPTs+apun1BqENzA9/+EPdVOPxeDQa5UUxubh87bXXHjx40O33FouZtfYrX/nK0dHR2dnZF0+fnJy8NMZYnoWk7P7+fr/fr6qqLMv9fl+vmrCAw7oPOBwAIEKAUFuCFOhaiXnySkpERt4SMA+IXHAZiThJRVaWZVnUWltjTGDY9taFaLlzzrs1KV4URQRpvayjKBoOuoPBcDTcT7PBdDq3xkoZTSb5YrFkHI6Pp59/fryY2/fee++1N76SnJwsl7kxpqwK74HzQhvHOdfGmEDE64iIvOGmbvb2dpQSWutYRc7Rcrl01linp9OpEAoJiqJijGVZFscJAFZVFSnV6XSCrQAA4HxohU5urSCdMUHWcM7d9Rwwbpqxto4ObNXz0HW3tRXowX4SQggZIWKQiQS2lVN0TT2woCGuRRToWh1E+FWrG1opFnAPrcp3zjEu1846+Jb53HtvrSVyIfXAGHOOQn2RdY3btJMIgLJwugCz/RkO69YMXKuDaD9sJewNTzT8DVcOG93f/pBz9uq5XhX67QiL0GjX6HVXmDDgpyj1n2Yp/DTt3n78pcr45sFfMa2+1Nj60rO3M/mlVsKNs2wPAPBrOOcV1HFrrWIwpZxz1ummaWaz2Xw+t1Zvgg2+fQ5tImn7OYbx0yJD1tqgO41tOEcukIiKYrUzHvZ6vdVqUeZzBNrdHYOnKIq0bbaUOgCAECJJkvZ2wgrn17ugvTpXrWHaXkxrKISn3L5EcAXmvRaTYKEy06wt7HAZUkqt9Zq25PpYP3EMhkKIfrGr19+v3/oQ/pQKhSQuPCOHZGXEZCx5JFCKZa1/8viLRdGMrb9c5FXlGuPrxtZ2FSXZ4iLf398na/PLOefcN0YplXV7qZJcoLVWW+BMiSgGxjwAkHPWAonJxXy1rMjzly/OGBN1ZYwm73ykMu/x4nw2P8qt1WKY/tov/trp+fT8YspZ6htz+/DOalUw1Luj5uJsMp/MfvLpw25/9GbabZrGYBL3O0kqGhpEMUv6POrCG2+88eSJODkfw5QcGECnfbUsLyszPz45S9MOIDfWN9oUZV2U9WCQ9voDa60jnxelaLgnq63pdruhvXNwSyzotvpGW2OMsc4FP4oxhowBZ876tNNxRJZovLfXGw0Z58+ePatn0yzLnp2eHty5pRFrosvF8nK1Eip25K1rlmVOwLgSr9+/W9SV0LbOBll/1C1NeXL+8mJ65uygqYujO4d3bh9FUvWGnaYx3UHmveUK58vZ2fS8NNVesaedGYz6s3w+XS2GZqfbG+wfHQ7GO/bhI0CuoqTX650/njTu6ZtvvqnSzulk6gHu3LvXGKMb+/Tp0x98/0dVXQTWiA8++KDf7+/s7CHyXm/ACBiTVaVXq9ViuorjeDabXZxe9Hvje3dfH492yfss6z787PMf/c2PsyzLy+KTTz771V/91Vu3brG8mVzML6aXd+/eHY/H4/H4i6dPBoMB5xyiftM0XIp+v9/v95Ez7/3FxYVQHDhjjCFHAPAbowHalt6b98eSp5D2Y+AQiCEgY0pGQiBnRd4Q81Gmsr4wup5Op0VdWaOTLMGSmsYFvkvvwDvQjY2jrGmai4tpXbk4TtOkx3diT/js2TPtrLa4O9wd7hwao4Fn00UzKfLFYhl8i6YxQskoieMUm6aJgSFya9Ex5z0heGsaIrCuJnCAEtABeOtMXWNRrrwDwWQUJQBQFCVHHtCz67atnAfHxbgmIBI8XfMY1s6NUq1oaN0dIgrgpjZa0O6wCcdck56w5WhuxAcXAhhjZE0QM61nwxA451pr2BLTbf61bYrTytbWUGhxfNtS1Vq7NibwSqOH4wD4kOYPNx3sA7/phtCaINtqfvumcCuQAK/oxfCGb5sRN6aiPcK2hXFD+odvt6tFWkEPW82iwnNrxb3fQk222o5eTT38h+IUf4aJcN2Uwe07vTF7P8Nc2J7P7azWtn56dfvGHP60awtevnUmkHY3TTWdTk5OTsoy17r23jLGAP1aBaLn19uPbb8g25fanpdxUDImcuQMokiShIHXdXV4eHBwuNc0ja7Lpq4QKY5kKHDYth2DtlZKhQenFA/WbXhnnVuHo2nLZg2BgaBaAK4tFUTcgn8QQMvxwAAgmMKbCOia66yFeXLOg6zArZLRG9MOAGtD4RWD80poUCBcENZVrqo55qNRdvfOrQf3dnsZu3O0W6+Kzx89ZEp6JovaNIZknDFRz5crxheHvSRLB4xA146xdT4oSZK8LKWUQjBHGEVR1uvxKEHBp2cX09lFpLIXL04mk9mbb75W13Wv1x8Odg8Pbz9/9nIw7DFUDx9+sbu7W1b5Tz5a/Nf/4J/tH4z/3b//H4qSJpPFPu9mcfbtb/3CfL78znf+6vnzl48/f+gdJHG8XJaRrGal7A0i41bWw8lsdfH9T+f1Bxfns5OLZ03TZFmUdZV1GCUm65k8LwWPpZRZ1s3SbhzHQHLQH1VVbYyra71YzLyX3ruynDpH491RJOM0ScFTnue2KBqjjbPOOeOcI4/AiCECC6QLurEIJks6eZ6PRqNHjx53u92Dg4PpdIpMfPbw89HO+O7d+0KIy8uLoTWJYi9PzpxjO6P+bLF69PjTtJP8wi9+U8zyKTFX2XKxwjhTr715f2cwBE+C+OnFcRzHURJpq5+/fJqm6e27Rz/+9CefPvzcWru3t/e1b3z9jdffLOrq5Ox0uci5UGdnZ+fn56dnF2+99dZgMDDGrKp6VdXvvPf+/dffePLkiVDpeHe/3xu+/95Xv/OXf67rZjqdKiUnk8nlZPbs6Yuvf/sXB/3dr33127qq8zyfXs6fPXthGp0kiXc06PWEiF6+OF+tVrs7O2+9+Z7T/MefPC7yxXhnZz6b/ft/9yfj8ZjQK6WePHv29ttvz77y9re+9a3XXnvrK1/5II5jL5O6rv/4T//kyZMnMpZvvv1Wfzg4PT9nAhlnQggmGAR+Ie+BKIQTwjp35C2Bc+QJ0HoidNYb5wkxYZxLLpHV80J7D4FKnSEXQkpOxAO9UhRFUacvhCRC9ITAB4PBdDqdr/KiaMiLKEm7vQ7nPC/1zu6obpplsVwul8iodub44my+WDpn0zRVkUAmpJShewKR5Rw5xxBI9h6ByOnmcjp1jhhjSMS5iBMlpeTAd3d3p5dzweR4PCaiy8tpWZa7u7sHBweRUu3732pu2Pj0bU6BiLYdDtqKq8OmDC+o4VZg0aZ5MW55+eHbNacCrflxW0uZtiTL2pVHQERjDG64FmBL/oXjbLuP21fur3MeEBEyE2J3BBSiqWv55T1jwNacDjxciPcecH3Sbcm77a7hdZ+YtrLv25/7rbI9eMVg+hIFdt3xvaZxr+/fHv8q8wDXyKl+mv99Q5vSf0Tq4VUFeePD1gb60nPh3xZXaA8VbvDGOmxvs500vwUi2T6Rv56mga14e+hoQETGmKapmqax1iIjzhCAex+iC1epIthaZl9qMWyOb4Eh59yT8956z6OIx6rzwQcfvPXWG0kaCUbkjfe2qiwiNU1DW8kC2FownHOGPJgIAevqnG1vcDv3sW0dtjuEF4rz7XVFRNRmXZmQTlFLAGWMCZUyZblmmFj3b9swk/qtnpZXzxE25sJ6nbZMIUjkCRwAcg5SAYGp62rUyY8G/Q9e37t//0Awd3gwnicyidWtB2+k6U6Zk7GNB+ZJ1Npdzpb7gx2ZDtM4cii8M0TWeWO8KXRJZFUkyGOsRNZJ0t5QKVUuqro6jlP+7OnxRz/6ye7urlKq1x39o3/02/t7d//lv/zdPF96B5PLy+l0YUxT5PDjT0/29vb+5E+/X5U+S4dWuw/ee3s+XfzgBz98/Pi5syAEKhWLqHNwa7TKpyCNl01vhKNxFsX0g+89PT5/6q2ochfHqVC8K6JYiSRjvUGka1jmq7KqgaG2hqqmaeyqKLwD54iANdpyKZjgdWmsc/1+nzHWGF3mRbHKnXNRFKk41taiDyWvCAChvy95SFU0m8663e5gMPilb//SH//xH5+8fDkejxnjUso4Suez5YMHQioVJenrb771/LMfvf/Wa8Px7nSZl/nq5dMv5vP5YDgWq3xOzJVN4a0VSvQ62ag/iFVcLJZ1WWmnnTbz1aX3QGzU6/UaXTHwDPz0YrKYzTvdbG+8M+j1z8/P5/O5Bzo+Pu32+7/6935FxQnnvLmFcRzvHhz2u72s0zs8ut3tpIhoG71cLvf29sq8KMrVd77zHQ64mi+/8xd/naZpHMe2sVLKItcIAogET1Sibt+6Xxb24ec/Ojs7S6L03XffXc6X1qC1rtsZMYyePX9a5EbFMo7jOO4AiC8ev5hczF4cv9zb29vZ2Tm4f38wGIxGo8ePHy8Wi7qux0JEUaR1IxnKTcwQ/ZXc35jeV61R1nFgB9Y7bQww3xijEAmh2+9VVVVVpbaNc0bGcsD75LwxztTGW0Li3oFtvLMEYFerE+ecZEpFKSJfLvK8rKqmuX///jvvvi1jeT45+/zhZ5PpRVHlebkgSAmkA2Y9kF+3UHLOAnoC65w1Rhtj19zBHqNYcs5DiZSScZKkjAkyVFVNrztAYoi8rutOp6OErGvdH2ZpkgTIW9uUT0pZVZXbdPJtK8iDe9EaE5v8tw2h3TU7wnUl17o7LYoQNvEJa63zcOUmIr/6+QajQEQhCNQKvk06dq3gW8rebWlIW0SNraBc2w3GsE1l/JrmmYjcOswQgH7BiQxQALjKB2MwmMIBW7vhVZWGW4GBdp8bOnJbDdwwEdqpvqHI252/FMwYDIW1NQZr3Rnu0VprjDPGhe3tPPT2ZQOu/37p+GmK/KelHraNSPiZVsjPtk62j9AGdW5A87atImiTiUS08YnxerDn+vGD/rabudKMQZqmebEUkhG0NFzrgD/batBMW7ktt9UU7fpZsG7qKJJxJBtd53nV6wxfu3/v/fffvXPnTr5aRLEESqSUZbFCpMDgzK+3saBXAmZtZCtkkXAD+oFNII02hZ3bRj8RhXapm6m4utRw/BA2yLKs0k3TNNY2AdVYVVW78uG6jYVb0GbGmKMvp/Nim44waZpGMe/3u0rJvGCvjc29/fjOOOpJXVariA0Odvp3bh0opZqmWayaVe4cWENMyswDnS7q/vmi3+nM56umyoGMs433Ni+Lumm0qbUHqhhbCWJooqiujPfMOzAaPvzwh4vF4ujo4N69k8OD26PRzte/9s3PPvssTgTjMJ8tAf3xcfEv/sX/9NZbb9679/b/7n/7CycnL3//93//D//g333729/mnCspUbE065dFczldxXG8KMu9/SjpRdkAj+6ODg72Hj48Lgtw2kaqI0XPNKzMiQlbVU4bevToi7Ksnz59ao2PpIiiSIpUKZWvymCtESFnUkhmjPEeUPAQlU2yNEmStrKpKIr2WSAibsK/O4MdsMAY66W9X/rWL/TSzj//5/9cVzUAeOvfe/ddIcR8ugiUIbu741E3/c2//+tJ2vmjP/4TsIZ5d/L86Wc//on46JMfMcAkSmOpBGAnSTtptjveaerq1ngsuXjx4oV21nt/enH6yaefFPN8d7wzHo9Pz8/ml9OXz19Mp7OmrNIkEUIgE5PJ5NmzZ3/6p3+eJMk3vvGN1998a2+8k8RpWdXj3Z3Du/cWk4vVcv5n3/mLs+OTJEmqojw7O3/+5PlwOAQA3fjlYuKcyxfLW7fu5KtaioSE6GQDrXW+qsryMoriD97/+unxyaOHjznGd24/uLi4KIqmrm1dmd2d7tHtwzzPG6ufPztBpCRJkMPHH/14Pp/feuPB22+/zTm/d+9ebeqLiwtCsN4TehS8jWSuHQsiCTzEdtdZPMLQyBeRE2Ohz7ohsp64I++h0rVz1pPVtvHWOau10bbRVVHbxprGkWXOITpQKo3jOOJ8tVpNZhfLvHTOySju9ntppxMl6mxy5slyyce7I6FwMOypOD5+sdI6MG0YQBczJYRgnJrGeh9IXxtrDBAGqmwPTAjhvCkrraQN+QTbWGPM7dt3vMGHDx/neb63t69ENJlMgFnOWBzHjLGgSLyxPvSA1mYN5XMuhAraqObG7cageAIhDLyiLbz363gkIm4C5t572kJNB6EGQcv9FE/xxmHDVtAKHMW2i9n+JDhGfDOoJXzcnK41AQEAvA3MEyH/EgyF0DTLuqtCidZQYBv6/VbIvioZf5rFAK8YBPhKzmJ7z9bSurKTvgzMSBvBDxtDodVY29vX7OD/1FUPX7rx6m7tk2oVz88/cAvq/6qhsH2/18ToK5P/6nmttXVdhuY6aRZHy8h7H1ANfkOoIIQAf22Jho0bS3T73qVUjXOI2O12Iadc13Ecv/X2m+PxWEq5XC4kR/DOkw3MOQFsu20VtYwjrWpnW1DK+XwOG1aotrrHOZemKW0Z6O17EUVX7+n2HNAGwBFFUbfbbaypqqos6tbO2H5wrbl/42YREWibaoK1fznnAOHgWa+f7u7uqEgsFtEbB+zerZ17BwMeYbWqnS6kzMC7j/7mQ+MygIzLvoykVEmcQtnUz08nIKJOqi4nZ/n8QggvmG+aMkkj633jfWMdlUVeV1meiyhaLAxjTEq1szO+nMw+//z8jTd2fvKTz62Bu3deQ2QnJ6dJqhD9+flkZ2dknfjs82ff++6HcSKaxnz26cfj8XB3d/f58+dSyk6nczldIGsQOSF3xIejzttfeePgqGPsNOmkw51x1oW6BkKloqFgSVEU1pYoChXxxawum3o6n2vnO/1eJ+srmRlN1nuuIkQU1qDgKDghNNY01lxcXAwGg9uHR0dHR92ss1qtXj5/cXZ2FhrE07oghzEG4BEQF9NZv9NdLBZPH3/x7Itn+7u7SgjOuYzlbDb7yjvvBMi2rpuyLBez+a9/841empxfnD978sXk4my5qjyTt28divrCMsT+bhxjPO4Nbx0cKq5cIc++mD/Xk/5w/I1v/erlFE7OTtM0tUBSmCdfPGtqf7B/+/nz57/zL37n8NY+ZwZZM5/PHn3xVClZVe7P//w73srv/PlH/81/+1/+yq/8GnaieVFAIcjOLqdndZX/z3/5p51EffqvPklUYgo3v8zzqcuyXmFW0+m00+kIFjWV3t89ODs7k1JOp9N79+7VTTOZXWZZZrxdVvl8Pr9za3c0HC/K89rMMeKg7LKap0XS6KZpTJylWutysSKi1WoVRRGLUFMz2h8mvdg4a4xubMMY6/U7DkjrijFSsUw4r72pqoolmbXWWQcAjKFk6Mgb3VS6CW21sm7qnKu9ts5LKSkCkJzLiFXkSl2V1Xy6XC1yp82aLRi4R08KnUIvvW+kj5N4JDDrAKCSceiR/dff+2gwGOzsjFQkyrIoS2NWy14PqnrBOUcmGAEQK1d1UxrJWd2UsZKpzKJeVFWVrkoixzibFwtBBpF7Xde6Yt5wHhltibjVutPpHx7uL5dZmmYMRbfXcwSnF5PpbJGmqRBCa+2sBoDa6DWHAZBHjwIJqNKVUHxV5kqp+/fvj8fj45enT58+BUYeiAmu4ijAOUNek4gkcOusdw4BOGcchQNHzlrjpJSMc2Br2PY67K+wLMtaN5xJKSVj6L01BqSUHtZ5Aeec0Z5zUEoYa4Jqp03PaNyEXgEgpFSccwHkwTmXEoAc0DrpEIQjF8oRomfo0WqHa0AWIgrgtnYGnOGAnHMuBRGRJ2st26pQZ5ssv4dgG4VkcFAqax4Fuj5gHSHY1mdroQ0A1mrGGJEPZDthKog8Xzd/4Y7AeAfWbQwmQIT14YjIb6wJh96hc20ZBTFOjDsuKOjBq4vEtczZ9hqDPUGbNPardsANZXNDib6qj2/o7PY4IRz16rdXDjHRWkc5R5yHq0QA8h4BGCIPgSK3CXIgQLD4EQHQubaKhAEAhUAtgEUOIgLg3oEh4TyzDo1hziJ5jqA4OkQPGNBiAsjSJpvGGXObCqA4yQIm1zlH3iNjnHHOubG21+9zzrXznaybJfGdO3def/31+/fvnx4/63e6gmNZLU2jh/1unufeSkRGDmrTMMa63W4kFZKPlTTGMAZJkgRkt3dGSQRgs9msaZpOp5NlWSANU0pxHjJ14L0l2PQ04egsQ0TkDDE0FODeAYAjQgDnyUspe72uA19VZVWV0JCQkSfMi6rRVkWJVHFRFAyvONDaElOttVID5yyR9qCJb6w6kBY4B2ENQ+KdOI6FSaTp7UdvPej3+n42eayi6M7hfl2aDz/9mzgec1kDi+dLK8F3x2lZ16XJ40yV2rw4e1nrqqoqpUQv7gKjQkNMMUoO4DVqY0xVNJVdSimtY7apL4scwdc1H0SRL+ISnVLqyeePrbdZJzbWEgMEMV01lKyWdql6kgl8/PxzEHwyXyne6Nof7OyspIFUeO+ddrd6o7Is+zv5/+F//xuz6ZTB64xYtzOiuRjL1KNy1gI0zFpDADzJl+nxc+yo8czUMfaGWcK4AMcFgiMQAsqyqPQq6fDaLAnccCer9GJyIRfz1Xy2nEzno9EI0E/zxaIuHPOOeUDgHMhbqzWEFr6xqJnVwoJi/9Of/MFXv/rVztHINnq1nHcG2YsXT/eHgyTJUmt9Vadxcru/84f/8l8bgmE6MKWdz/wv/9oHv/zrvyH6g+7h/sG3vvFtyfjk5HxV5GVeScani3kcp0Gq/te/+ZsPHz/W1hwczOrFzvnF9HRymfVHUaezmpSnlxe9fuyNm+eL2pbdzrgzECrmTe0dmT//zv8cJ/ytN9/znhntZ7PF8+dPl4spF1iW5cnLl+QADZ9PV92EOFcoUCkV2gmGaHaQBp1Op6qqoii01gGQn6Zp0zSPHj06Oqp2dkYvX54URXH79m3O+XRyWVSlECKUjTpv4ygZDoe9Xm8ymTaNYQxkpA4PDwfDYWO11poIAxTBOWf1ugVzi9xpU+Zuq9fRdjCwjfVFaeK0Ie+dEE6EjF2gFomMdlXZGOOISMaRFAnjsna2aZqqaoCw2+32egPOpTFmQF5r/eLkOI5VkiRxlgrBjHc3fOV1v0W3fi2bprHOaK3RrzOIo52xMcZZipIYgDny5I2MImPcYrXU1jamdmSX+dIaV9d1My2dc0rIbrebpmkQ1YgohADXJn2vMu5tCUAcx71eL1+VSZKEBtztCLMUnqa3V8FJR0Rk13fgDOccA3ajLV4AQrgZNfUtWJ2uqZZWzbfz036y7VO2sqy9POfWNWawccWCYbH981aleb+OQLT9phExROlpm11x41ZZd4WZoC1Kx/bytg0F+LLa9/Ys27fm1+xJjtFVMGbbZXRWtzF52gRL2r9beh03mRcNcDVv8B/SFhHa6f1bP/lbv3rV9X91h+2DtEhVtxnh3jl3AezJGCILCEQkIOddeExbBhAQkYOr2gFGfnv1ruEIhG3Qi4giKfyG7hMR0XsKeAJwQSYoAOuu2EE6WRLoSZRMq6oyupJS7u3uTyaTpjF1lTdVURU5Q+KcW6ujuNcGuuI4jtOESxElsfXOkQ/Jf8GZQMmlYIz1ml6IBQaWX+dMiAq01t7PeBbbg3OOPBRIr0+dZVmn0xEr1+l0Op3O+fn52dnZ2ekxIo5Hg8Vi0c7JZiaC/DSBKWGzuMIL5ZSKyZIQLI4jAF+WuZLRYNhflSdxFo0H/cF4R8jk5ZOTly9Pzs8X8/my2++l3bSu/Xy2cuCUilUcpykyxqJEZFkM6AFs3TRNU0WRQADGmFIy3EsUKSXjwhghRNM0QC6KIvLu4uJiOsU333yTM84E4xG3zjlwoX2uAOm809abRnsP5LziCgVzzjW6UpGIk6HV7vT0NC9mzrmjo36327faRUrtDMeXk1VdW2tWzkjvlFIdIuKME5LRbj6fH+zeKou6LGsgDohFWWjtpJTWgzEOPQqhwlPzaEH4sixDsNY5d3l5SeCqqqqqSso1TKpNQoYlJ6UAROuII7zx2muxkr/8rV/4w9//N4Mss3Vly9VPjp+98+C120e3Pjl58cE33z842P/z73zn4ZOnMusOh/2Du/1vfvsb77z3lrh//36/348S9eTx03//h/92ejaRQvQ6/VjG3nvd/PDjH3/yW7/1W6apuZBHB4d62HlwPDk/n6S9/s7BocwibavuTkaoK6hGfme0s0teGY12Xnth3nnrtThydT3t93bv373HmLh75+Di7PTbX//g+bMv/uJP7OxyLikSEDGQxpjFMg/UTFEUhbx1cBDTNM3zvKoqACiKIszUarVK4vj05OStt96KIrlaWYFstVjmVbm/d1gURZ4vm8Z0Op1ur7NcLi8m53KgiqJomiaO48Fg1O+T4pIkeOeQITDmnWs2DQNDAu8qUb2pLmubCGxLOr/J0FvvCIBzybkl5Ay54FJry5mIYy4jJELGmCMoy5rziHOJqI2xeV4GLgBrfBRFuc7zPBeCdTppnEThBUuHKW6SoN57CCgiBGTknPXeI4MsyzpJHFp3nswvm/lcOxtFEWO8qY0nJgUbDfqcCWKgEmXJr1ZFWZfGGGca5xx5GxkZeRlFEQ8kyOCBYQAneM+JgNZrcZ1rqOtaa80YC6QLRLBtJbQK0hmHiEJw7711bZ/ltSbdSH8f2PeAKChmvN4KYftv+0qs8yD8qmvUdiw0bG9wahgKusIltYZgiycPO7SPtRWyiNh6Y8S2DAgMOMer0erZjeN+pfZaMfqltkIrZ1sD9FUh3v7KOUcbLdXiDMJP2utnjIW8zFqJktvesz0X3ERK/u3qZNtEu7Hx0z78+ccN2MH2rd34b/t8WwOIro/tdbhtosEr1gYAEDLvPVkDoULSWmsaaxrOuRSMIUcUZI3BUGPJpBRX8xZAIdYCcO89ZwRr/k23ecreGQue0iRKVKSrstvtB9D3s2cvYsVWy8Xk7MyaJrwLgvOsg3ZDhDoYMAAWRUmadowxiJwInSNr/eYWeafTkVKGu9NaG+ODhd2+XLhV6QAAgAGG0j5xDwhADJEQKUB/pOJJEnW7XWNMZ1bmK+esztL47p1bSvLT09OLi4s4jtt5aCeciMJrwTkHBn7Nic7WbxJzUvIo5sio0ZVzLIrEaG9/9+Bgb38/ipLTi/nDR08+/smjyURH0ShJe8JK4yrrmVCSrG5qqyLunMuSeGfnqNfrGKun88vlcl4UhQNrnSdCIiS/biBujIsTVdVFUxmlJCFwjuPxUErpyBpnHBEBeYIQzGdcgXMQMNjOe0cO/Cbxaju9ZDQYWmvrZpnnuZA4Hu13OwNvAbzb3zt8/OhFXQNnlGWpbjBOIvJIjCzpqqpevjzZ6R+ZhshhnCSMiSJvnLGCqyrPERGRSyYZMQeOMYGIjiwiN8YtFqs2zcQ4IHIhOGNr3BjngjEUQljApm6894PO6HD/YDmbHb98fu9wvyrzycWy1k0ssJxdDF6/+wtfe/v9t+6XZa4innXizrB35/UH41u3927vn09ORdmUNHen553T85PL+WWpq4git5y9dv/1k5enZ2dny+Xy8HC/1+kPh8M4TV8+n+0f3Uo7/ThNeoO+FXR2+bImy5gz6FRXRVnsHS7yZd2UilKjFy+fP8wXy/3Du5GMh4Od8XCUKjkY9BjCD7/34aWbCSW6PUFWFEW1s7MDACFmgIihI0t4Y4N273a7eZ5rrZVSaZqO+lFRFNPppCxW/V5PKYFIiovFclbXteDKGJNlSaKkT1KBzCHEKpZMevT5cjURIo7jKFGNsZxzJsAGGCD64EOsihK3uiQ3TVOWVV3Xw+GwxRC5NWOxdY48EmOMq9iQLnxVVXVZN8b5oqikiIRQiIxxwRizhsqyGQ06WScSUi0Wq7Koy6pRKhZCMMHjJIuTBBE92UYbIXjLg0S09qbbZLTY5ClDfXOnkyVJIoQoyzJgsjjnUgZ0NGlTc96PYyGldJYIPIHlnLTmHGPnPAMMnUeiSHJktPaiYBMgWfumGzfJFUVxenrqva8r7ZxTStW1viE4WkXLGGfIW+XuPQFiFEnOBfKgcf3auBDcmvBOXunUUIrQzkEr5deG9FbC+1WN1bIRtMqViIIgZpsas/B5G0Pa1vSMsZBUoOu4+lBDS5t4wLah0F7GtroKwRXYsnjaudqGg22bF23t2Q2rYrMQrpV1vHrjV9+uoSHhUbrto90YP1vB/2e1EmAL24/XzfF2RW3v3JoIN2wCRCRyV5oJfMgBhQkL57lxzet25t4bY6xpjK611kbXSnKGCpxFRC/W0oCzQI8NjrYDRRxCaRQigmNIwICxdXEEA+hmWRrFeZ5bY+698cbBwdHJyZmzzc5osJwvL+fzWCqlpNWNlyCN9d4DMqmiJM3SrBMnqYpi5ylUaWpjrfPtjQvO1o0A6rosy7ouNz2EtpEN1yYP4AbrNgJ65z2CQPRhooQQcaw6nbTX7cymlwL8oJN2kygSvFwtJ+eTLI4ArgEXwzPi60aWjhg4cOHojKHzJo3jTjdREVeKcR6pCI2tysZ5lJWByWL64nhSNjgcHXV66SrHoqLlMifEbhqpWOWVLfM8zSSRyTqdt95+8Mab9xFpMp0sV/Mf/OAHs8Viucyt8YicHNPaeO/fe+fr/U73xYsXTx5/YWxTl1Wapjs7O51Op6jyqqkr3ThywBlg4JNnCCC5Wqc468pZr33DGDPeZnEiIpak6e7+0IP23iMoJbMkdpeTc2v9dDpNM0iintXce7suYAQQQnqwy0X+6OGTxXwFJMjBppQGjK49WQaCIwIx410b2wrBXLuBkwcjkDPhLDEOADzA2Bljwb91jkkVh95ms9nstbu3/83v/s5X3317r3uwl8a+rt64f+9HH/4ATPkPfvPXHz98+Jc/+ojIv/2VtwZ7+4Pdg8HhQaHtx4++EL/927/98OHDFy9efPKTj+f5ctDvd9KuQO45WbD7hwev37t/cnwMe65YLZ4+psbrOE57/W5/NBrujCqqnp+bsqikIk1GJQo4MGLGNJzzKIqq1XLUHdy/e+fO7dcRxWK6iON0NNwZj3a+9j5NTs4+G31WLorlrLANIeJkvlBKhdBZgO0EGM5qtQqQnCzLAIAxdnh4mKbp/dvjo6Ojf/uH/+6jjz66d+9Ov99P4vjZs2dlkfd6g93d3cv5bDlfmEYLIQaDwUU+b8sd61qvFrm1lrGeqY1XXpAARAc+vNKEEEeJ1rosqkBZioiM8SztSBFatoAnj4EQyJMjr7IYETkyKaN8WWrjylpb7RmPnMembLyHOEqzbhInUeK9EJJzzpgEYFnalTKKophzfnFxwTmXUjEGxoK1IKVMkpSLqy4DbN1kHJA85xz8Oi1SlmVTFiFpkvs6LBpjGkQMGZDVauac2ds76DCs6lobEydCqU5VVRByt2tYsrfWOADvrjQTbBoHbHy4NTXecrkEAGu81nrbvbih29YiHj2BI3JrkY3IuWIMnLehFhwRueBCcgTpAiPpJhjAmdigEa/50Gu7Y8NQ22qL8FV4z2nLg28NAn+dncm3HYqvc+Zc2Tp0ZSus5avz4cevph5oq4FeODjfIrLctma2d7txRgAIPiX8dNW7/VDwFQf66uBsk5vYxCi3ajfC9fwdVPvWqrj2yY1t2qo6uTG2LZvt0d749ifbB78xdW1KZXt470Pij7YoF2HL2rhxCiICcuQdeRu0nhQsjqR3CYcNnzF5YwzQpvQpLB4Izx1c6F4RPGfnwFnng0Bfd68edft1XZtGe2dG/cHt27ezJJ3P51WZe+/rMrcGRBYnWWaaChEDr3Mcx51OZzQa9fv94C2E0SZc2ntJkzgoklCbYIy+0ZY6POfrc+gh4DsQAHhYAN4TQ0e05vnkAuNEeUr7WXxrfwds8+TZ8ycvnh2/eOGdvXv7YJUXRITeOVrnswgYAJL3oV7PB28cPGOEhEkS7+6OdncGWSZ6XTkY9CLlja1rzTVFk2n1+aPHp+dzZ9XO3j2Cjn2+eH58fHGxiLPUM4ycUoqNdwYEutdP7t47uHN3fzjqaFPuiGxnL5vOTvCFr5scAIQQzrOmds4RgFdKdDrpYNjz3jdprZTIsiyIhI1kYIgcOQMAZjkBokcAoDVtfSDZAWNMychNmizLVBwxiXXZcBYLnjKsvAOl4l63f//+7aYCoIT80hMVVVHWNRNonCmKYnleBToKXdWWPIJHcEW+ipIYAYi8BUfOeEuMMeDQsnMGPxbR17X2vpZyzahBsG5AE3D3Ko7AkzXN6Yvnjz77/B/8+n/xa7/89/7mB9/75W9881e++Y1BN33y8POAaGma5o//9E8//Ozz0c7ua2+/0+12d/b3sn4fGn379pH4v/x3/+flcumcYyh+5b/4lXt3H1ycnV1eTAeDkff+/bffe/P1t/7yz/5cCQmeyjJ3aE5nFypODo72+/2MnxKBixPFJWUui6IIPJADXWkw0lbG1m4+XVXLmlNEjjeVQe8Y2I9efrQ7Hr733vvD/vD5k+ef/viz6cWs0UV4/bz34fVAxH6/771/+PAh5zxUcZRlGcexEGJ3d3fY66ZRnC8XcRIdHR6sljki3bt3J89LIWW/3/Xem7opq1xrrU0t+z1rfWjfKZAxgqqorfHASXkFERNyrX6d80Q26WRN0yyXyxDn6fV64/G41+uFlq+wqURqX0VtLSLGMk6SZDAarlaFabwuNRFIHjMUTIhO1ut2+8SwqqpiNXOWnHdSxb1+liYZY8wYNyas61Jr7YiQCRVxISUhRFEUPOBr4LFNfA8RCbwxpmqCP1EnvVQlCUpsGgPWIBdktK0rkgqtJVM3xaqqmkAgX5clF1IppYQkQk/aOo8E3gNDHhjltsj6GCJ6MuExIaIN/cs2ivaGSgsvYagYCPItmB2IBMict57QA7YJZiIOINeBU4sBjYeI4QXedvpbJRQU4rZRckNJbCvOoFPDq98epP0w1H1sq7cb3i1tpQDWPAXXbna94fwVAc72Vd2ov99W5/AK3gI2kQa4rn3DL9rgRBt+JyK5maUw3W2wYXOzV/e7eS4MADxRMBfWYemfDhHYvowbG9v//Wlmzc8ztm2m7QPeUPDh+ts2mK3uhDU9EQJgKKzZJvtijAHQWm9usi2IEKaKvGVIkRLQ7SrOdCez1hrdNE0TwKTONOBD1xfwtIneI2PkCbwDCKhf2gAdBILijEmZxYmpmzhJ337z9bt37+7t7NR1vVzmTVUSEQdkXDIhuVRCKO+9UHGapv1+v9vtdjodoWIPzDiyHhhjwNBZ7zwwhgwZEW2o2BqtNQAote7wsr26WiMVEUOUJUwJAGyIFBljyEJXanIAIDiL4xgARr0OQ2rqcnJxZnWTLxdNVXHOGV7P46whseDBEQGg894SeEQQgkkp9vZ3Dvb2Bv2UMZ1mYjTuCW7mi1JTVtZ8sVh9+vnJdJb3u3tSsca67mA3SVcqMR7o/OJM5vDa67dv371dlfPRaHD73m0u/JOnn15MToDRYNDnwiJvkHkuSAiOHkmhEOKLJ49mlxfW2iSJxuMxAyzLMqT5jbPOE2OCAABZmK0kjpqmaZoqJFg9WSmllGpttXtcFqVHxhg4QibUeHSoZCZEsbt7MBqOj46O7t69++zJGYJSkQCIAqt01k0JKeSzhoNemsZVUxujEXGlwNhScB/wtQiOIxJfI6CiKPHrahQZGt2VZdk0FWOJ945IE5GUMo5UHEeMsYbcxfm5FGxnZ+fk5fEf/fv/3z/9x//s+MmT7373e++8+dadO6//3/6v//eyMuODO7//R3/62ZMXhtjZ5VSdnBzef9Arm9PLx7OiAqnE6elJXTfL5TKO469+9aujneF0PpNJfHx6rIs67WTL1Xw2my0m01Gvj4iNnter3DTlxcmzZX75/MmTus6jrBOanzLAYl55wxcXS9cwYy7v7iWz8xeJ2BsPH4wGhxHPBCpT0fMnx3VZLuaToiiSNLp9+2jUH1xezqyLkiQJFQre+9VqZYzJ8zxEhvM8b12ri4sLKeX3/uwPV6vVw4cP9/cPZ5PLk/OzIi8/+OCDL6ony8XCOyeVunPnVogCKaUwWuf4EZEc1LVubCOEiOKYAtEpj4RkATHnrJnNFvP5fDKZzufzEA3v94eIPNQmbDsxfpM2ttaCg6Q/HO/smdrb2i9whR6TuBtFseAqy7oySoqibOpVUxsppZRR05j5fD6fLUKUcjQabd5XCLwmYWWwyARR5UNUfPPXWrsWUEDhh4Hsk7xzjWaMSQTwYMrSW59I2c9SMrpaWa+1a8o6N6GwPun14ziKk4g8hBYAuO5O20qZNbRwk/XgckMv36rDtgEEEW2olte+eOBXWBdBADEO5JkHb63jXAJjAcC+Ft+whhxyznHTZ6H1gP0GUoprwDvAhugJtjz+FoKwtfOX6OYQbfabQq9wrjZ5jxsoIrJW8W/Ft3+6F74dgbgx/Ctjo8B+lpalLchFaNsRxrZr3orstSXkbOtwuzVFP4etiEWIhjC2JqMAACL0fxfCpS+1Em7Mw895qPYI2yGE7Ql59VB0LcTV3sLVRhuO2kpJXG9N2Z6FHNDadpRSCoRIcOdcVRY1ZwDAkchxK+X6OM5elwPBcLRIDgAYArJ1/xjvPVqzXC6VUoN+9/bRrbfeeJMxfPnyZbHKOedFXmWdJIkTo71ubJZliEjk+BZDYrCHgpAJoLbW2A0bTdm0uzHGpORCCOdcSzSybSVcD/OE9RPSED5kxLcXthBMKTEa9o2u0yg62t+371kl+aefPTw5O1dxypkPxCnbB5dSco7IHKFyYKSUaZrGcbq/v5tlEaC3Vte1LgpMYi8Enp0VTXNyMZk+fz71ILJOLFjCeWQsT5POeIxFtVxVU8VEpxcPhnG3s5NmiXPN6dnzy+nZ5fSU0F9O0+VymecL5ytkyjljLCLKOI4EE95bRBScG2M4sqqq5vN5r9fzQJ688855Tw4Zl5xzIcFYD+idN843QeIF6Rr6eCFnjEvnHKAc74yHgx2l0iTu7O2MrfVFUTDGolg2FUkph8O9o6MIOT+8dRSnEQBVs1UUK0RsmkrrujG1dWUSofE1EQKhkIxz4T1Y451zSdZljIW0u5TSmGYtMcB77611RC6KojiOkzhFxHw1bXSFTt67dXT68vjf/tt/+1/+2q//1v/it/+7/9P/8cMffjTe2X95Pn/77bcKy374kyfzxgsVK6WMhS+evHh5sTi5mJxOpyikaJomjiNrUxXHvWEPBb+czy4vL6plGQnV63Xqoh72urPJLI7jYX9Q1HC4vwtCFk357OTZZDVXkZRSNroEj+jROYq4TFRqCU1VffHwORfRG685gTF52VTOKSsEOzy4c3L85F//m9/97NMfx0pkcSdWajFfSTXqdDp5nne7XcZYnufBXAg3v1qtAKDf74eOq6vVaj6fr1arBw8eeO+fP39ujDk7P0sfpaGJS6fTSdPUWLtarRApTdPLskySRDJJSFVVheSP7ElrLdfcRU4CMBSA5FxjrQUphRCdTgcRhRAh+tftdsuy9C1AbAtP3tnp5stVUCpxFCdJQoRFUaSqU1XVclFobYWKkyRtGjNfLLwvd3d3O52srGcvjk9Wq1Wadvr9/rOXL6SUSRLFccw5U5GQsYzSJBBHhlMirqW5JzJGr1MP5Lz36Nega9eYqswDcAGA6rpGxF7aQeeW00sikjLi5Ku6Mtoyxpw3jEMgXPLeh2AdbpXtBTebmAg5CMYkAGgdKkeIszUiV6m1FNtOGCPiJqJgvCdCYIwRIJF3zoXwLFuXMq5thSDfg6HQ6oNgiGxrhVZ5tAZKq4zb2CyFLtLXuRnajVbahuvUWuMWQzNsOBiE3OiwrXbJ+GXE/rRJIuJ1oANuyjVfNRdoK0R/Q4HduOw28hH4JnArXNF6iq1R5deI0YDH2iStNtcZzD5r3Y1g/M+j2n+GKfPTvv15jgCbCXzVVti+tm2DYLMy1xCQq8QTth3IAAGBGMNQ/0BttH19fCAC2iw/ICL0DkI1E8M6GKxInjHOuVJKcsYYsyYwGpHz2FqZm9n+kq6qhc6Pjo4Q8fj4eDgcjsej8K2UsmkqzmRo6wo1y3o9LrhprPVkPTXGekAum46x1pMjCG3zHMG6KTyRtVYXi9boDFwgQS5xHrcTFWbvan42JbvhMsM2kQtpM08u5AbDbzudzmq16mTJzs5OOHhVa0K2XC7dOosOsEnkAUC322UMuCBCR8zFSdTJummaZllCRFVVOldYawhWw4FKEpV1xlr76bxYFUZIPl9WslwAJfNFvcgL6x0yiBO5uzse7/a48EmcNU11cnrpfO2piSLZ2GqxnM7ny0bXnDMEYY2z1kshQ8A7EKI0jS7LPEs6SZIAQJZl1ruqqXXljXHAWSxZFEXgjECKBGNMco5BkoQprZo67WRpmnHOV6sVEYxGY6VihjyO036/d3by/PHjJ8vlMkmSr33wwWxaDodHzkFeloPR0IMry3Ln7u2iWFVVJRUSYF5URbms6pxz7ggYE5LHLJLeYYOGtPMeQjVfy5+tVBVFUZ7nztsghOPYtrLLOffg3v3z0+PFYlGW5b2j2z/+8Y+/9bWvf/sXfzkvmsvp8tu//Kuvv/760+NzTXxWWl42r722B0x8+MOP8rpxyIpGN8aI/80//V89e/bsww8/fPvtB+Pd3unZ86wjdB0bXd4+OtCgP330yarOL1bnt167VVL1fHY2GAyYZyqNcda4Kt8ZHNgcsIp2kp3HT46dzzq7R09Ov3j//a8+m3y0Z7q3ju49e3FW61La+WQ1lZHynvb29gZu1OmOhOiUVeO1joYdhNg6aDRxkSxXNSJWlbm4OOOcZ1mW5877iIhfXtZpykajEVGa9O88ePvg7Ozs+OQFS9Iold0eXlwWg75I4r6SqeTqxbOXg8Fgd7Q7Ho/92ZPGLAJlZVWX87yQUSyjpD/see+r3KK3nntAH0XRuDuYLleTi5y0PhrsZr1up9OJuFzO5kJKxoAr7o233mnfOCTgUNYFMPJIq6aygJjElES5d+cXJ/3uIFZR7ctyOomk6ve7B4fZdFUbLCxjUc91BugZIBaLVd40xpc+X4koipIk6WS9WIpGqjhWwkcx45rzxjZWW6218zpJIgqMcsBC1xvnjPPOKxwORuS81Y0SUmbKaSNcY5dFJBQielMroTqjkXOuaZpEpbSsy3oaJ2nCZePJOOeBWesRmaPQeNCQt4H8y1motAZgjGSVa85dFEVKKiAATwxQcsZRSs7WrXIrzZiSkiFa6z15Qgx9+CRDHoq5hZDBK7KNMU5v9ASG6njvfV3XSikOHBlDT2QdInDGgICso7aVVFB1zqMnDgiIZJ22blNpiU6bZquewm96VbSftBFs3nbOdGs2DES01gN4zpEj894DBnXOiMBRi8C/loJpjQO2her3W2kUJI+wrvzcNi8Y5+QsADAgAvLWeO+RiAjd9c5Gm2CDvjopR49rEB/33BvvQSOAEjKJ4qaqGySO4EJiPiRK19FoBLjqcrmtyLev7YYibz/ZNjX8T8Ei3Bi4FQv50h0CIoixbQsgyEPTNEVZLus6ThIZxcg4AYAzre2EDBkSgkciYDx4+qx9BOQ9EDSmZozJSDDGtAYynggZsIjHIImMRud4LBSXprFa17HgjTPeGQ5McsaQO6uNs3EcN8Y55wjQe2/cemkNBh1NJovStJNdzqZlXcYq2t07cN70ej0hBHne7fSTKGLEBMp4kGadjowz4ghMCBUjl865KIrqutZ1BQBKcOdcWed1UQKtk7Ybixm9B86ZMSQlE0JyLrZmE3yg9iOGwIEQAFmLKbEeiAQhAZGxDIAD5rbe2xkwBoQvi6YZ7e6NDmYnswU3rm5mjdVpnEgpyVnGKEmSZJh1Oh2puNYagNJMJUnEONUmb3TJOaZZbElOCuuizq3RrfmKzs7Onp+7pelyJ+uFU6pmTM+LedSJuPeK5GjvNiKePJ+7Rjl+4b1nnBBdbcuqKq2rAdESkyrWTje15UL1Rl3rYF5c9qKBjDkjMMxL4CqBSEGUJIPhMM9Lt7CNcZ5xJgRnyjpRQGWdtwQEzCEjLphSIo7neZGmiQdAwabzSwB44+0Hk8mkmhery8Xh4d6g0/1s9mjYv72Yf9LvjQF6Ozt71vjVctHppqZeHR8/S9JI4V5ZV9ZpAKqaepmvhGB37txaLpd1rYkgS6I46mhtmCfuoXGOiLS23heI5L1vGlPXOtQDAqAQ3Dkqy1rKKE1TnoiKdLY7AsDXbn8w3j/6olic/vV3b337W7PpQo927n/7V8uqrnx8YVWy/1pd5o8vzZ07B8mwszo/b6oqX5bek7DWMyaSJFMyRSbiOE7T1HRMscqNb+arqSU9GncidZRkcja9nC1X55dTRHznnXdu377LhVqt8qdPn+/s7huSitzpxdTk1biTfeeP/vKDD94Yd3tVVVnyn3/+6N3332uaRghJQN57qx0ipmna63YlSiaEMXMGa2ZZ771Sqg27ISIRhHgg5zIAHpfL5XJZGnPivT08uJNlyeT8fDabA9Bo2L+4uBCCVTUqJXZ3h5PJ5LPPPvGStLZMNIkn49Fab13D5bLXHwgupRIh88dAAEBjzWq1WuYrrXUcp0nHcymUitGbsqq4FEIwVCrg8I3RlrwzNvgVTV17i1rrSKpRfxCJKFYJUsAPx4JxY9xqVRjjGLNNY5rG1bXW2koZIUKaKCKSTIYsIxFWVcMxdywhIueMddaR9QEzgLwoqhA8ZDzgFhgR9x5iIdH5uiq9sXHKpBAGAV2TxHHI0XKOyDyRNs4ghHpFcIBcSMUE5xwYc4QhfuC2WjAEs9pvkpGtMwcbiH54jrRFOOE2yfJAkbvRQA6QB6nlXdA3LkAa3aZgHQBoq1p92xGEdZh6/W17im33HQDaTsq4Cb2yTXvi7Xhse7V1XbeXjVv1qJsYw3aOHIBxznlLgNiqT9oasKmh2FaB7VdwPWC7HR5gW92ntoMQrf7e1sfbZ7xyu7dmazv8wK4RVJhr8YTNU/7PPdgrwZgwfp5oxI3920m7cYQbn//sg2z/vXoKW42qGWOhIwnbEDq1a5IxxhGFEEJ412Jl1g8RGWOh12KapjKOuJIBcggAsYqyTsYYQ1qTsofURhRFKolCas86R84HCAJuepq0XmPTNGVZVkXRDce5nl94NYp2dWuvRLDCZfOtNujbOZ0QyZNSJknS7XarRgdG/Pl8EU4UwPa0ud9ut9vrdwJHvnNOKi4E8952ux1ZR95bIGxq2zSasyaNy3yynEwm+aqyBiwYa4ssxU6nt793JCX33hN4RFoulxfnl/PZcueWcs4h81JyZA4AOJOMMc0s5yTQ16SNMeSN9+Sd6w+6URQJZMY05LwUjDFBRE1Vh+y58wY8C9TInGEAXW2/eiGnMxoNjDHGas47wWhzjqIomcym3X5/WeSNqxy43rA33tv57NPHz1+eZ+kgibvOuaOjg53d/nhvt9vNlgvdGLdYLJfL5XwxresyTeNulCYZ03ZRlQYq46EBYsglV5yvYdMhfLUJGXrfxoBhk0XVWnPOTWOCKIiktI2dTCZFUQihjg4OmeCPnj6x1iVRPNof//Y//m8R8ccfffzkyZPdw4Pbt29/8ejxd7/7Xa310dGRePbkZDabVZWbTGc/+tHHy+XSGMMReoPu5fzyx5/9CAm+/s1f3h2NsyT9+Ecf/cVff9cYs7e3l3W63axTlTUS3j7Y/8H3f/iNb3zrt/6r/+rhZ48+/fSR5nh7rP7+L34zifvf//73J5OT7/7lX712/0EWJXVRTiYTW5mzs7Pp5LKqmm7WieLIWmuB5LoLS+M3pfBho2maoAKklEKoUJK3XC6Xq3K+yKWU3S41jcnLGrn0tlkV+UeffNLpxt1uFiXSgYkTPhx1NLC8LDygkJHkwiHT1jtPi9UyyzImuDaGWRSCUUPGmJ293cVqOZlNV2UBM8YER84DgJkBeg/BOLDaGGudcyrljDFw4I3VpraaIil7vUEad7XWxapoau29BwGuds45HkXecWeZ0d5orxtiCEpIHdx0QUQhMMi8B2Nc3hTBhSLrvPcWrEcgxjxxRpxxYIxxBACwZImcpJpZz6xPInVrf2/U7zlnkDwi1nVtrQXGm8bMFyunG0Agyqx15IkLybgkRAIgWjdsvKq2IEYBcyDWLR5wQzkVnO82k9pK4W39zRgjcpwhEENEYOvgp9/stl70SN61apVtqc+bifxt4b5lglzp4G1DYVuXtw0pwlfhyXrvw2sWgrdhbKsu2vpPgBM652DTnQpgbUggonfX8iPbwQP4KXV9rWDCTV6gtRL8q4xJgPRTdOoNTbk98Ho1RGuItNZVu9t/BPHSzzV+Hv3984ztqgfYQqhsG1I3tuH6FPktkI333m2aqjPGGNA68SSEt5yAe79pbrJJjRGsV4kQQimoGg1hMZMnWpsTtKEmy7IsjuNgEwRje30NRIAgOFdKpZ1Op9djAkP9l3UmcHy5Da8obPg92x4leL3fNFzlCq+ztG3NPG4N2HqDtqelHe0K4ZwnSdLvkyPY29ubzpeTyWVjdDvDfkMI1tSFiaUSgiNDBhwZOXAWwDFvWNO4pmlCVHzVs7YR3DlrgPMIAepaE2kpPOey0+llWcYYGNMURWHMrCxrIWyvJmOMBxfFQkqOjHkg75GBIAQpWCTQGiIixphSyhtNnIGUDMl6W9frRSJl1DSN1o0xDYFAzgkcMiZQePKh2kUyHgmZZnGapkLweVNXVeM63UhEFq1A1u90X758KaW0zpdluVwu5/NpkkacY5rGcRxJyauqmFyeezJFuZhOWVMJ731duaKo81XjHEnBy8J7L4xm+aoBMEnilYwAAICF3nWb57VpqMtYALlbawNhWLAdiQgdNHVDRJgAuXy5XAY3e7FY7OwdLMtib29PdRKRRgd7O3lZvP+Nr6oszrJsUa6eHj+/mF/WFZ1fngvOEuvnSdLVDf34J58/f/40SeLXX3stTpPzydl0er47Hq3qVcfGCnlvnI3G+/P5lKFYrYqqqKfTqbe21+nuDPqg9d39PWbsnZ19InzvK+8+efJs3oC1tlgWpy9Pnn3x9M6dO3VRexN6Si1D0bIxTivvCZJOl2EExHzTrIvnEImhR9BGBzyAcNY4Ct3SrLX94W4kJOdYVvl0NgcgxtjZdGq8YQzeff8rZbl6/uyJmPnxeDwY9y6XNQFW2jAmmIwS4qA1Aczny/CiBc2opBSCAUDcHSRZdwSMS8EYNLWpqkZK2+l1ich6A9YCkxAxKSMAcL4mQEfee0BPThvdWNPoOE5NY5qmqeuaiBSFHg0CQQIJBCl4LETMueZcCqHqynrvwRlEHjgqw/upbbV+n4GIrAcAhuR9QMCiDw3gg4svkJjyDWdMRFEniw7G/b3dMUcHQFVVrVZQa8OYyBktVxao4Vxyzq31zntjDBcGGDoiRyiECguREXDOETxwDwCOKFivRKSUgk3csnVKQo1GK2ik5N4j5+gcbpwxDBEFALAerLXeu1C93fq+2yo/eG9hAtqv/FWNwJVmuxG+bg/SamsiatHarYzbdr/a93D7w5B+ZVdu2YZuYVvpvlLOB9ftmPYCtmX6lpa64qPc1tzb366vFq66BN2wk26MdqLajZbGsDVKcBMyWR/wOhrgxjT+px3/kYfd9nppq85lW+e9apRsWxXbtkV7tJCbYFvdzznnnjbhBCJyNmx4Wj+ndk/GfPvkAnsF53w4GvX6/TTLojj2zgGQiFQURdoaRJRcJEnS73fH4/FwOEzTdLGYBfY5Ao8Egc2sKIr1pWxuiDEWx3EkZAit+XXDp6tih3ZaWrNgnU273ilj+x1pj7M9je27o5TKMjTOD4fD3d3d8XjcGG2MCbWXQgilVJZl3SzppHESq4CVxpAuszS/XFZlHaoz6soxiFLV78bjO4cj8jibzb744ulxcUrek4Gm0CuXSyal5HVZL+fzuijTKN7b2+Mq996D90gcSZD33joiX9ceEZG4FDGQI88YY1xKAkfgWEhDCUAT5KqwtvGuAXLgnCMLAMgIvAfvm8Y0TQUAUSTTLB4M+oNB7/z8HMBrXef5Mo5TKSXnChEvJ6cfffLjwTAztlrmC20bFfN33nvr6ZNT42oZKQ+uquuiKsuqqhqqCsY5b5qmKHWjPQArK2tMaYzJ86YojbW+rGwURVJEjDESV0zzQqzXoZQyMOUEHyo0qAuumpKyqHOtNTkQwhhrhRBpJ4vSpG7KsqqsN8DF3t7ewDSI+ODNB4UuL07PPv74408//wlyGB9mo/5A/OIv/crHH388X0yRs+Pjl1wmMkr64zHnXCZpEqvBzs755eT45GRvd9zpdN5447Uf/nA1mV6cnPRef3D//XffrcuyLsv90Y7gvKmKP/ujP24afffW3XK+/Ff/6l/df/fbTVn3Op0sir/3F99FC73h4Nbe0aNHj0jbndFumVfaGuudNi5KM/CMPHIpCIFLAQCSgHMes8ToNXe6cTY8eeSsKAo1HI52d/bEXt2U3pi8mEeJKvLF17/1td/4zd98+sXD07PjxWqp4sjMtXZyVRZ5Ucm6UXHqkFvnPKCKU0LugIDAWhPYIaUQP/nsM611v98fjIfhqaRpopQyxoXKIsGkUFLSGi9WFg0RAQEHgZxrsro2+bIwjauqxnsIVU+hWItzbBpjrVfKMiaSOLPGx3EcSYWIdV07bYxpGAMhmPcRQKCVDzqJAACQAIgheaudM+Q8gmeMScYFBxCQsTiKJHgtBVpTLecX3jWBJWlVlM4SE5HW1jtCLpSM/QaRxLbwbpzxNiTOGN/WrEavO0wGVRr47b33gTU2fBi0UVjQ3jnvcd0Od12gIWDt0YZ2OED6iltpS8xdZ0ikG+2V17uFlwWu62AAWEvzjSYIws57L/k1s6AtqWgdo02ZwNW9hKPSlepdYyGQbZkCmwO+qmhbgbutq9qd/QZ9SbS2hretpRvqEDeYyhtWwrbxES6WtoyqG2ZHuNnwfBlj3m+1M97YXa9abH/X8aqS3r79Gwf/UqX+s0erCNspap/1l579hulz9dsNCDQkDTZE3euDtFCVdtJaUC349WUzxjiHOI6BCSllaG5GjCul4jje2d9LkoSFkLcQQvIkikWkiDgDiKJoOBrt7e2Mh6NQdRx4FILpGbp/GWOQXNAKDKgNSyBDIaU1ur3lbbszfNJGBEPkjHNO1wCwV8syxAK3F9L2XIULUx6TJOn3+3t7e3t7e0VVrlYrbx3nPJJRr9cbDAYyiwLwfLlcLJd5cDaMtnEcG+PCyxXHnW63e/v2ndu3b795bz9SycuXL0+PL5yxQkggWi4WRb6qyoLINbpwznpnkjhJk8hizZF5z8AhiQCwEUTkdY3ICDlHdAAbJjxmddOAIysZY+AskeeMCw7WkmAgODEksM740ntrpKEG67o0VnOOnHlds7JYceYR/HDQI2+tMZYZAGwq3TTNcrH6vd/7vXffe9O6kgs4urW/XC3G4+gH3/8bhPloeODcGjDLuSRyaZLVdZ2vyvlsWZYV59xoYMxWZUNEDBVD6yxpsOQxtF3cjii0tqDf9LIRct15PCwVzmPw6C2BIQLnGm2NQQByvi7KKIoQoCxLyfD85Hg8Hu8Nsnw5Pb84rurV/sE4y7LxePzm62+I4XA3y/qErGkaoZLxzr4Q3HtZGlMbSLN49/Du3u6+bioVx3Ga9gfz8U5P15GUrNNNXnvzwWq+OD+9+PTHPz7aP5otVsenJ52s/+D1N//oj/74zoPXjl+eSikjpQSTXzx+/ODea6PB+OL49C///C+FUkxwrW2jTcPsssi73S5aROChjVB4GZzzjLHBYKCbNU9wW8pPRNbasl6VdXJ0uD8YdlerxWCn9/VvfPD06Rer1eLi4vLtr7x/fHb+B3/we6en5+PxGFSnrJqmMY2DyDOuFArJuex0OkxwT0jkmsYUVneSRPZ6yzw3xiDnQikhRKebdTq9fr+/KpYbwQFE1DRNVVVN0yghiYAIgRiAaNAhgPd0cnIGziNyziVjZEwT+gtoC+HVTdNYRaIDaRzHsZJVvfLeWqsJUBISSGQOmUMAIIZriwE4hNJnr02F3iF4wTFWIpJcCI6IPSXTSFknvGuMrZeromkqAJJSNsZYC1b7srK1AedkYzljoXeDCDIRglPLZaCJDb41bCK9nPNerwcbRRIi9oHrgjZA/da5CQTJTd0AAHGiYOSExkmIoSjUrVPjzjpNRODXwQPaqLuN+fIleiXIsvDmtNfjN5i7wFvQKlS/qUWkTXi5PdRVemXDXrBtGG2UEG1FFIiQSSnpepfGzeXdhFPcsCVubK+zjptuxbTVJrsNBrQ/uaFQv/TgNxTkdmgE0bV5ZWuvAstbO6zhIDfUKvxnGDcshr+robCtFMMIT3x7xl69i+310BoKG2RMmAgEWLOVb/+2fRZtaGHdlXud+KdYSGU9EUkVSSm5iuL1UOs3izOhVKykiiLGueQSAOSG9sB6l5eFtVZJCQAhHR7oOjjnHPm60srogBFGRC5QMs7ZuviijUXRFiEpbAJ+rdEDrzBVhLEd8dreaA8uhJAeoyjq9/vGUZ4XjdF5nq8Wy+3144xtoG6a5vJiOpvNgk1jrR0Oh4EqcV1CImA+uxCcFNRxHJ+fTebzqbU2SRIhePjVbH6R50vGaTDopakCdMvVrNNnodSOyAYZBQw5F510aANhLnqSLPTOiFQErvbWWCAlQr7HWesAPBAxhpyjkGAceee9bZg3qBP0qLiUkgkE01SzSbWcTw4PD0ejASOoaw0EVdU0hamqalUuPv7xJ/deu1XVC2PLTi8BRs7rg1t782klI5HwmIg8kfWOyMURcseiRA3HoyipqrKpa22tF0IIKSSic8Z7L8Qa/oVbMKbgMoQWP7Cm/MKAEQkRBSIi6yUTIJVkHD2Sg7qoqmUOAGknGw77mZTF5PLUupenJwcHB5nE+3fu7AyH/U5nOBweHh4WRZGmqfjoo4/KuhoMRs9evLicLoEEMLVYlaZpCCTjGeeZx1jGylp3Ma3ShL/91v3QzvH45BmgPT85f/b0RZZ0Xpyd0YtzmaUP3n67MO7x85dSRt3uLnmPiLo2VjtbN/2s86d//GePPv2cRzLr9pdVIZViSpVVDUJwA5zLxmhrLWEQ3BT5qGrqptahm0CkYkRsmqap6zffeMA5r+vy5clzLlDXzc7O6PD2rf393d/7vd/7H/+f/+9/9k//MRC/nMy11v3BHjgnhIoSJOTEmCeUKLgQVaNdWQWu7LLMm7rWw36cZf3haDabrYrSOMs5H5phkmahF5x3XpsGYIM/0sZbJ5AjQ+ewaUxVVcv5qlyVpm7Qk3UEYDcaiKrGELhAMl1VhYqYEAxRpamKpELmhUTBhFIqSZIo5ow7Tw1aHtYEAwrgeEDPEFAQDzk5JdJISSVCWJI7AkHOOU+WiHkGxAARPIJQkfG+Lk1Rg/HSEzeGC9QAjIt1/t4RMSGEYk2jw8prnUspZRRFB0e3Q6OHoigC3zYRBfhVCP/gGt4lGGPWWiFYANwAcPIbGl1ELhCBE0PnXNDaG7HLbsgptqbKAbimsdbbgYYdX0nTbodS4TpdQRstCEdobQvYgrDRVgUEbbCTG8FKbankDUVNRB6u6ilgEzO4cQE3lFkY207ediBhW73RFujsbx2bn19zDdvZwOvj2pz+pxh/q+LfDlr8Xa2E9vjrN9Fa7yX9lFrT7fHqzPurdr2hx8m1lbNtVWzPHuccGQIAX/N/MGBcekBEFcVRFDGp4jiOosiRFUJIpZRUURRJJQNaO0geIYRxbpGvtLORkIwxwa6qLpHWhqwBzzm31hqtW7xwiDUyJduluzYFtkIm7QW3N8XX3SiuHnp7uu37bbe1NrjBlQNAqEcj5ABY6ybP80uprLWCYZqmSZIk3Y4Qoq5rrQPhxLq8MNgwIaLAhdemOL/Q88XF4uwFIpZlreuy14mTWElOkvM4VsZyBoZx3+skUnLGodOJO4OUc+4WrizLxjoiUjKK47jbH5RlaUztyKNHyVnA6feygbWWIyolwJOu64CHM7UmAsFQcmYYbh6w50wgOmShOjoIXOsc1XXpXFdIlvHMGppMZroJvezZxfll0zR37tw6Pnn65MnjsiytYeNxfzHPPdkolkBMCIEs5pyXRe3JdLppr9crivri/NL7lRAQ+IiNMd5bpUQUSwDSWhOJNgoYnkgIQColaNMaLQjJsE8AOa6DSZ6YIzCurot7d+6maTydTHG0u5pM5scnzrlGqH/9O7/zT/7JP4niqM5XNk3ml5PvfPev5vO5+OzTh3fv33vrzXcWq6KqqjhLO51eknSzrPvm21+5d/tOEsfPnzxdzOacgVLqTtd1ukmv18uLha4Nka90NV1MG+vA4u7u4Tvvf5Amvf/X/+d3dw+PrPW2NgxFvzd01nLAPM/Hw52mqvb392tthJRc8yhJ4jRdlDnnnHsIaibMgrXWORJCnJ6e6sYQUafTiaIkvCdFUVzOzg8PD22hT05edrvd8Xi8szve29sry3JnZ+cP/uAPlFKr5ZKI93qj5bLMhhwRpYgsgbaWrLeOOFG9WOZliYhJJKuqqKsKkcbjsbvSEIIxrKrq+Pj47OxsPpsGU47ISSnjOA41God7AwSutV0sVtPLxXQ6v5wul4vVrVt3VquiqioghoyYEIoIAFQkqHSAnsghEucoJBeS7+6OjW3Qk5RSrPNSrmkqphJEBOZZKGbCgAZ0KFAylkQ8iWUSccYh0OxoK1xtqiI3tkaWqogb2xAReUMYNYaKxjYagUWcx0TMNivO5Xr9aastMCGk9XVrpQX5JYRkPMuynZ2d1WpVluVisQgeQ6jxDW0mmqYJzgdjLICw+j21ERMW/IYtETHk1ZB48AU51wBAsIEjXBfr23qk1Svh28DrzLawh8EOCBbMthHQbrSGwrZkDB+GVGsbXXDOBWudsatARyDFu6F+aGvjho7fNhSu/YRo+5qvuw7XwBatmIDranV7oq5NC1595Te1lK3zHdTeDUPh5zQ+/uPHtiZr7+4/+OzbWnz7UF9qedxYOWG0DyvgEnDTpnv7Cm/8d30XhIwx4BwRAbkjALem3GcbEsyAeA118FEUKSGF4EIILgSSk1KKTfwgEBOlaVqvVgGFxwULNVPee+1cmqbtqdc2AQdG1yp3Whu3zcK0qqX9RG1W2vYq2n4Rwthk3Ci80R6uKoaEEGmaAuDOzs7u7q4SkoiU4N1udzAYGOc456Us67IyjQ7CxzHodDrBaIiiSEVr8hXvvbG6KAprXLebcd7T2jpnQihXyt5wlGndcEGc42DQu3X7iHigoGjyvCxXRWNMFCXW+ijulEWd53lIUqtIBKEUx7HWGslJLjxzztmyLLTWAOhhnX3jAnmgjYG1h2Ctdg4j4lEsojhRis/nsyiKnKNONmAIurFa2yzryHTw4vjss4cPf+HvfS3rxz/84feJ4apcdfo9jy/LphQqtcZDWThvlFJCCO2M98S5bKx2QFmv2+30tdZVVem6aEwdc4Uics5op8Fui6wr2cX5OsgUIvFtADWJMwSuG1vVJRFxhkpKMpJ5OtrbF45+8etf6wjxySefOGDLyaVmrloVHNnOcDTs9n7y+Wd/9sd/k/RAyBjOzp+/YV7rDwf7e0fEOJHqdPacc7OZefzwr/Z2RvP59K0333j5/GmS0AzM/t5h0/Bu96Cz3x0OdusiehGXr99584uHT59/PhdCdlO5k93pJL3pdDqrmjt3br+cTF+//+D0sra8W0GkMRnt33OeZstFpDhH1dTQS8eMMQQXkgtKxd77oLACvxVjbDadXUzOx+OxtXY+n3POBYeffPJ5mB2llrqBTjb6q7/6m8vLyxcn87sP3n32cn55eWl94htxMZt2yjqIfo+QJEmWxc655eTUWquUlEJ6U+uyaHQzn8+fPn364PUHw25WFGVT5L1eLxZyOZ1Op5MfffTDXq9TVqumKXb3Rt1uxgV2OimZ271uX8rENMvJ5cn52dQYr6IoyJA4i+M49t5C6bNe1O/3Afx0NnHOqYh4Jqp8ZZzu9XtJopxHKaDf7caJappqOZvn+cKBVUpJLrz3ttHee8Z4JFNLMolVLBUCVZUFAAziMkmQI1AqyFOWVN7WVCKiA2e009pq4iDJGeNs45wrq5hzEsaG5BcAQqPrskLk5BwxZhhyJjmTKo5llBRFMZlMjo+PA8V1SKyui77iuNPphCLJQCSXZVlRzIPo5Fw6skTgPXkCL1gUJZJza5B8ZTQDYELKxlgiRoSwoUXwHrwPgRnfZtAR13T3nHNPdtNdJfDihYlwBITrwgSgwNVLKK10zpO9AiKEHWyjOaBD01i3fvGIyDoyFhnzsPa6AIAYQKhZFygYMgRAsLBx4JB58iFKyIAC/3Qw8AUyzhgxZATeOXKenK91TZtwQoiOwCZc7Db0grjFpmK9CZcXTMkWmci53EpOc1xz+JP3dQsypTVEX3mgtgys1T3eew/r2Mnmt1eeZZsDatXl3xYFuKb7W4vEWn/jw7Ad6EdbOdh+bo3H62dqVXawRNdFbpvCWtzkVtbmEVE4XChyo00VqA+Nznyo2wVExsCDI0/eWUvOCGHBaEOGo4+ElAjWCu+9trVbW5brwohA9MCRJ7FCwQHQec8IOKBAtjva894yZBEqgQI9oiPGwDlw4AUDrqSSSsmYoSCPFrhDwYRkjDmjtbGCMyl5nuccgQuUxIk8kmWeMcbAE2eMMy4YD+20N5bveoWHZMq60zZYJxxjjGCLO8QDETlyHtCDd+Sc87ol97TeNcY47wjX/bUJkAi82xkMXr93b9rNrDZKsNCJaulFv9/HpeTzqYgVGTSmUSKJkyxOlDNWSknkmqaRTFRNFXU7TMm6rp3zXPJ+JyPyWuskiRpdeO/iRDR1vlrmuzv99997O90VZ2fnP/mIzi6eOJf3kqQsVsY76HSGSSKBqrpWScylIOerqpqbEkg4B1VZNGXjnAeuOJfAnWNkvPMqQozzqmwMDvrj0q0aNMNhtpyc9pJOx+mDZJQlcnRrVzt/MZ3NX16IpHfn9mi2KJbFtDeQvV78+//mT/7+3/9Hv/qr/8A2e+Txwx/9zdnZxc7umxeXk1Vte73e5WS2KvKDg4PpshZClXUpBJ7PZqZp7ty5M5lMnbHDUR9jXK14r5txzvM8l0lKIJkQRV0zxrpZp2pKQrr7+oNytTw/PxdCDAejKFZN0+R5vlqt+mnXGh0pMdcNEXV6XVsXYE1dLncGveePH64uJ//r/+Vv9VP14YcfDofDZ/mLk4tHR9GtbMD27w8/flKmu3D/tX2xv7tnnD958VJy+Ru/8RuLvHj86ElZ5kVRKCG/ePLo6GAnUvLxw8+01rPLSf/W4PLyMo5Tjsx5n+d5kqXf+ta3BKrJxez4+LSX9S+biYxEVRXT6WT31v35fHp5eZHGKusk3ts8X87n8+DLrIq8rGreCGJICFJK5n3AyQdBHF57IgqtTRhjQf3Axl2o6zpJEsZYqAYxxhwfHz969Ojy8pIxFlgUhRDT6TRUxocenQCOS4kQ+sRGjMuyLJGzYIh5D1QWWtvLy1madRGRMS6lAGL5qry8nF1MJpxFk8lUSn7v3ut7e6Oyyosib2rnnHHeRswnaTQedpwzRdEY7bUppEIJzINmHPuDVCkVRWKZL4LI9eS8MQSOMwCgbi8D7+JE9btdFYm6kE4bIrcsPAMSggEwRl43jXXaW60kd85UZEJOcq0tkIwDznndlNbaqqqtNY2uOOeRSqy1WjtrQmIWnSPvr2jpQhwFcQ3h9psyMM45QxYeDSJqrReLRQg2BCACbopa+/11C93ZbFYUhfdeKRX1es65bVFORN6TMQaAeYAAcVjrpBvphS2N0uoo3KLjheve4Zf+6saoqmqdcJWyZezAKyzCJhC9SYFXVRVwGriVm6B13vdngeZabXcVOfwS7OOXjFePsJm0YIhgGxdpN2AT/2gjKO31860L5uveWk54B6B/9tn/1pn82eNL4wQ/495bS+JnXMaND/F6gW57yzdO3Z50e6P9tsW4MCDEQO7EiJi119qJtbYaCi48toaCEGtDoW06DhDSxlGcpXEcW2uJrgAoRIQeQxQNcV0BLwQLJeKhyI0xJhgIIWiDnmGMySgC7zxZa61zFjfMoS1qOLCTIQIyxkMvRLwCzBCu/3kXAndtkdF65TtHa1ynvYJ9eO/JeetD11dwANYzRwAAHlCoKPQWqrEADPYcQ091UZWrAgh73T6QD00onNXO+ChKdFUGuliPPomzsqyklJ2sv47nSemcU6pZLvMokpyT0Q2QyLIOADs5vnhz7+7h7uHqVhGrH+WsHo/2u6k12kmZMBSdTPUHQijVGM0lG4/HWRob7awmrY2pnDEGyDAJRbEgRo3RjgAwTlR3crkqlwsSSESz2SyNIsHV62/dv7077vcya5q8qFAlPes18aKxZW3tYnFxvjTGaAt/8Rd/sVzm89myNxzUtT5+ebKzt3v79t2mabhQaScrqvr09Dx4P0LIOI4PD/c5YFmWT548Ptjbr+qCC5Z1EgDQWiOCEAKQM4ZpGiOiNnVQf5zzJMk4l4gCUValnUxmwVs7OTlhjIU0kFuTzwKT4sGDB7dv3/mD3//973z3r4bD4S/98q+8//77v/M7v2OMe/Lk2d7B4d7uwdnZxWy6uH1752tf+4YYDcYvjl9+76/+ejAafvXr38ziCMkwFL1ucnl+oeuirkoG3nnHEfYO98t6vipyxsR4MO71cLFYCR4d7t9+9uT57sEuIk+i9M//7C/Ksu5lvb2DXRJUN3kU87JcZlm3KFbT6SSK5MuX58bZWlvjLGkQKopDNUHTGOdqvcbuamPWHCOccwAVx1EUxWlKRLKutdZSqV6vJ6VcrVaMsb2DfaXUbDHPy4JzbpwdDof7hwf94eD8/LwoCke2rmvvfZJlQWNFUZSmqbXWete27wSAqqryPF8uym632+/3syzTlXfOlXnjDY9lp8zL3f2jr773TSHY5w9/oisPzv549jej0Wg42onjTpqJW2qnqJq6boq8EipyzuWr0nmj4th5kReOMRYpBBCeam80IkgZCQbGNAzJW2adhsoWRVGWZVXUvc44JPy9tyRI+vCOQ5II7723zhsb1DACIGKhTRTJwP0upHXOWeviWDLGrSVryVjyHrwD59hmJV0JxIBqxA2ktFV1QZCF6qaARVhzS2wIB3u93v7+/q1bt6y1T58+DejUoIBDysa5IHHX+4fMsnGurpuWfcF7T3Azxt6qvVbut7bCq5pjex/Ysi3afa5SvK/obNoqYmxv3BoT6tK2AfB8zRn8JRp0W1W3qosCtoB9yQVv67DtcUPPtRYM41dYh/YItFVbD9cNBYI11dW29PdbEIr2LNtn/NKL/DuN7fm/8UC/dLQL6cavQirq1aACXLct2knzGzqWG1/duJIr9b/BfKwrDylk9LGdzO07CsqMiDwQAuecoxCcMQDGhAQmGGOh0YOMkzRN4zi2jSUAYMgEZyJE7cgTWec8ucZobQ2hB4aBXb6TZnzDAu6sJQp4V8YRwTvrtDfWOcsZC5buqy9C+/RvvDhhbNYnwLrg1zvvidA554FCPMFaa511jrz3gSbeOPIEHjb4CcAoinq9nvdeSlmWJTnLOHDAlMVxHHfSLng8OX05nVwS0XA4sJZAwN545/Ji0lRaSVWWZa/bTdNOyBEEjNeqqgKaj5zLssw5rOscwSklF/P8448/OZ4+zbJsMVvWlYll2sn6PkLvoZMN6rohY4RKOt1u7J1K4sOjw8M7d4qiMrUDB2SpqUvvrGB2cnlCYKw1znnAWBsYdxYX57O51Zz87GI12B14wN29w1t3j4aD3u/+zu8s8lXa6w139iUT3Sjlccbj6GJyLKW01n7/+x/+4IcfCyG63f7F+USoKO10kzhzHkytnaNIxUSU9TqLxSJJkrquZrOZaZqyLNMsKsrlYjkNLUNDNkdrXpYlMBMq4wCgruooiobDoRTR+ck5kGAo57NVXddN44yBoihKbkO5TRKn1hly3hMpFQOx3qAfJ8njL57+3h/+wT/8h//wl37pl374Nx/ty7uffvrpky+eMxG9OD1J0+6bO3vDwY4ABy++eH56fnZ+fu6ci6Joenl+dHQ0Gg2fP/n8tbu3wOtIsnu3Hzz89CdH+3tgoiKvqqoSSTQYDfO8bEpjvcl63elkFqUyTpOkk8wWcwMxc+A1BFwegfVkdnaHy9VcKjSmaYwmYEIw4zxjmGVpmmYLY9r0bRDBoalJeCcDICjIQdrA7OfzORFVVRWMJillr9cLumcymdR1HWxtKeVwODydnNWV9t5zGTWN8b5oGhOnCWOCrNfahHiGNZ48ksd8sWKEEY85Ca+Iczns7uwMdo1tFou93d0x8/Ll0+PZRS54orhybIlIztbOsjhOk1SpiJZLnaQZEWpNyITWHsBw5gXnvUFfSkHOFUVRVSA563XSOFaxioAcY8zWtnGuLhtyIGXU73adc1rXuqmdc8h8FAnOMY0jY4zR3iCQIxsUM/CyAiABIAAIQXJEGXW6na61FskBafLGO2dNqKr3TLDtYG8wFDjna0RxQDjaNesibHK6LaQu6N32E8ZYlmXD4XC1WtV1HUVRVRa0yaFa7611/3/W/vzHsu1KD8TW2tMZ7xQ3ppwzX76XbyL5OFSxVGJRNaiGbhm2ZdiA2jAs2RDa/43+gIYNGIYFyw3/0G60uiVLXapSFYtkFVlkkW+ecoyMOe54xj0t/7DvPXEzMskapINEIuLGuWfY+5y9vrXWt77lvScILa29ttYYC7DiqXgiay973NOLLQ+ubJuIobMxuJGl7nbYxA3dAenFVsVBAb6z6100fnPx7dLDYSnfjK5v4hjYYAt2SzPbqPK/Yrc2v9jBgk1Og9/YXjkOm/dylX5BlwIDL5uTlw8FL5pS+OsM/C/ZNm9/435ffajNSaSNLSh00SobcnX/kH1omkaqlSqa22gxunmPmzBi8yCsM6UUQhEvoJArg0NEwdgzAELOOGc8SLvyKHh4nAHjiCiEElJiINYjciW5kmtQ4oEx45y1JsyodFJ6R9Yg4oBzAAiB1bauQodrxkAJgeSRESNgDNW6a5SQUgghpGScQ9CEWd/b5Q/r4SMAIgzNh1aIyoEnCE+9X+FR8B6CUmoACo7QAzkiR9wDEiLnSMCiGPK+Y4yFSihvjTFGpf04jkfDoZKSeTc7uzg+PplfXCBinuf3bt0UjCkh8jStigUjyPO+Uso7WrbVclF45wKfA7xEEFrXTa0ZktZ6sVicnfF8KhBRMjnIR729Xr+3VZU6SdIkzZmo68lkMa+QR0meRXFKwGe1LUtjWyuY5B6sQ+88A9BNy9HFEfeMz2fzunIR4fYgQ5cmSoJtlYysN9NFRTxqLC1au2xsbztJeoNFVTtkWS/pG1M2RZZlg8FgsSiWy6WSSauNjGJn6eT0PM91EqetNZPZ0hgT+n41TRPHsfPG2JoxuH5j+9vf/vbjh48++OCDxXKiItbL+pFKgoSGSjhQqMyHfr93795rOzt7s+ni6OCoqmqAetgfkee6ra0lwWNjps453ZgoipRkXAEA5Hma9XsySt75yleOjo6mi+XPfv7B3dfu/S/+8f/qydnh8dH5o4fPFkVTts327s727t5wsC36+UA35sb+tel0+viLL/avX3OmBmqaejboJVvD4fbWIE/T0Wh0ephPJxdxRPmwHyUxlwIER87rdnE+m+rGVE25d2M/ktHO9e3Pvvwso7Qumzi11tXTyWzY6ydJ9LX33nn29Pn5+ZlUvDVeKsmFslW5XsS9I++BmOBhCVYvioRIKQmgrCvG2HBrxBirinIymRRF4Zyr2/bJs2dbW1ve+7pte73eYDSaTqdPDw6CItB4PN5850NEoaoqXhb9fp8xFqr/3VpnEBHTPMvTPIuTNEqFEJFK+v1+r5/FcbxYzMpy+cUnDx8+/CKK5f7+Hjio2qbmAoGs0ULiVj/t5SrLpZRRVTbaWSkj8qi1jqK4N+gzVIhYluX56dmCM8GYUooBJ+eNsVbruXXBceeAUkpvyWirW+OMBXBCMsaAMfBknTceHOOcSwFarCoKBOcqAgBwApnw5AiFB9loZy1oA9ahc+gBPTKPpITo6IeICOueQ1EUsbVSQiiA3vTDNgP1YQ0ty/Lo6Mg5t7W1RURRFIWgaMgWK6UAWN22TdO2bQvIAZi1vjUm1PGvcvMvig1sWv0rH24u4r8ET2za7/W3Lpl9V6z1y4eFDfGl7hrCXTPG4AWy5C+8NvJERMH5uwIUrpz3Clbo/tqFE7pTbFrfDkNcwQHh11CXvzomrNIQjnxdt79orP5zbVfw0OY9vryxF8meV45zZXxg1RfehdRs4KMppZRSHVDontXNi+nOsnlJ3V+pG+u1lsbmvIc/MsEhSFAgxxBXEhy4QETkTCglpULOQiGz955zDi82sezmBdaie7RmkBDRZDIBACRnjNFNbYxBIERK41gwVJGIhAwN2DbB3xVYwzZkNzdHbz10DIgBBFTkAzgM7wcReu9CxNE78D70fwj7IBH5lbwYI68JgTwCci6Z5Exr1uiWkS/ms6osski++87bSRz95Md/8fz5c2MM86ZYzOuy8LaVLJMMGfnJZJIkCQILmc00TUejUa+Xnx4fVlW1WC6cc0ywpmmcM3mejwaDptbOeMlFEmdCqKKYzGbLu/fy7e1txuXjg2eHh8fpIMvq3qKs5LIgB+BAEAciZi0nK4Sdzi7SWPb7YyD2bPr09GTSy7eGg+15rWOlru1dN23FUJ2dzyzxs1kxrxqQKhmMk15/oS05RMFlpOI4BWBZ2mdcMa7iOPYO+oP09PQctXcEwIVrrLF+viiOT87qah6IqAD+2rW92zdv9Pv5W2/fv31rH9B9/tmX3tv5fBpFjeChoQFHJOsaIty9tvPOu2/2e8OPPvr4xs29w6ODqmzGoy0Wy/OLSghx48aN+UXoPA6BZp6kcRjSNOt98fDL1vk0z3uDQW31n/7gh//kn/yTp+cnUkZNo4+OToizRpt8OHr77XfFa7fvvv7aa0RUlcv5+QXQ9s7WUAps6sWD+3eePXu29dqdvd3dpmy+8+u/9vmnn/3Vhz959913pVTT2cx5aGu9XJbE2NnRmVLx/Qf3B/mgbpvT0+Ms6z18+LA4XwohGHeeTN0skyR6fvik1aVSHCoSgqlYFhUYu4pjt9Z4BK5WCePw0Ashgi668aElhh4Oh/vXrydJMj2/aHTbGq0QrbXHpyfLsgiZiKqplVJZL0dE0bZVVV1MJ0KIKEoAQKmYMUHktNZV3ZLHrJfHccyY8B6081pbra3TmiMlkUyjWEglOSrBIiHRUy/NdFO1VcuBRyKqi2q5XGZDELgKYGRJvLM9yvs9a21VVfNF4ZzP8z4hb1uTxNn29narqSpK3bQAgB5bbdpaB5UE0+i2bpqmMU1LRFnW6/V6aeK9I0aCSxQSuQi0eluWZdM03oGUEQADFMiQMRbLRMXSWbLOa+uaWhtTV3VQ33DOWe89IiEi4xz5ukJayjWNDsIUhO7mIVgNaxd507Xt7Gi3Es3n8xC3ZIyFpu/WWrvW5w463N26tu7v4Tsz7ddcvE0L8fLPRC+kHjYNc2cdNy1u98WViXWXSuEBHnV46CVrBN57fLFwwHtPxAJQwEvnDTu+Qrc6X16zf2Epp41t8+66T/y6PfQVE3UFZGxe0iY7oTvXJrLpLGC3f7fn5vDSOqKwuf1yA/+Ltlfe5i/ff/N6Nj/HlyIK4XastSGjzzmP4tDOOA6407+YAIJXpSRW56Krh13N8osahZeHWtv8EDkAhig458I4S1xIRC6FEILWZQKrcA6A855WyTVHCIIhMARC611V163W4ewLYIwxHiRHAoE/tJjZCGhtRsVq3XoEFBw44wiMQDIOnJH3gAjrGAli+A1Wyuir6Qai0B8LvQMP3jnyvmvvTt6TsQ4RPaAjdKEFJ+OMC0FAhFxqbBrnaa0ZyRhpp8vZ5LSu6zSNe4n4yjtv3n/t1unxSa/X29keeNcUpBm4LFEcfVO3iCSEACQuGCJoXReFt1ZX9dJanWZxEsuy9IjR3v5OrKRgfDqdn52cMmCD3pAhnp4eJWl6r/dGPsjpuT8+O4YZT9I0TtTtt97oZf0ojpuqtXUbIUrFARznmCRyPB5prQmsJxvFSkWiOp04b5JIKRVFiltgIOLzk9OTyXJnZyyilLhSaU8QcSljY/LesK7rZVkRkW5tWc28B8GlI1BJyll0enZR122W5ZzLh18+unbt2re+9a29/fHTp4+5gNfu307TWOvq9OwwSeSNm3ta22rZtK0BYmmaVs2MiNq2JQJj6rJcat0sltO6Wdy9d6Op23I5rapma5wNh0NEd/PG7VbXURRVVRX6YhO5oq6Kunr45PH5+SnnfHdvG73/yc9//t7XvyElt1Z7b7314/Hus+cHp6djY1oxm0zfevDWRx99SNYpIatieevWtdY0Uax6WaybEsjGUpRG7+3cPn5+AAyjJAbA1hrjHZciTpJev2+tPTu9+PMf/fD2zTv90eCf/Z//WVXV//Jf/svDg+dkzWg0cNqoiC+L2dnZiRCMfFCn4nEcR5F0gDw0CF+zyULYMKzXiOica5om+EOBqs0511pfXFwsFou2bYP3YK0NFUQBK0gpQ6fp8XhcVdXx8bH3JKVijDHkDLmMFBBqY+u6EUoJISFQS6IksH2aYtLUUJdRnmYQSfLC6KZtRBADiVW0u73jrJ5MzqtimWXZb/6DfzgY9FQkrDVMin6/LxUnbxmDNImcIyKHALFUsRLgvWCqqprJZFYuyqZp27oxxnnrYhk755xh6CQQCmSRyLN46DSzDp3zXCAKjh4IDDnQxjRB5NFxRGYdEgjGlAuipt5ba7zHtm2rqmmaNk3TsHIFk8YFIgIRD5V+G7b/snQQNxrYdwvTZpJ7k0EGGwV4YXkN2ixtg2dnZ0VRcC7ZqvyBI+PeAyIHxnyoZF/97xFf8Pm6/3+JCbli82DDmr6MFby/zOsDQMe0CKx7vqGcH+4LV9+6RCTOrZpRbRRMMr6ubrhiejtT1FmaTTRwxYh2v9I6+/CiLwib19b92g17NyObN965qsYYY1wwroFf1o3b5lBfuZLur3/bbTPm8eLIvPpoG4AAYBPBvGpPgADsVitG0BQPvBzyuAkUrmR8uoNsgkt4FQzaJIfCBoXCMWQrag4jBB4yUUJIJriMhFolAgCYc86Slyj9Wtl5dSUIAGCMWcWaiNr2UvI8ZqHDMQohIimiKEqTWEqORIKF1/byysM7/EoMuvkovnBfNgTDOuwb/jnnyMOKoOAsWes7rSTkDIA5D4YAGQNOHACYULHMvG+axtaVIxQqynpMUJVn6oL7o8MnVVWlWTwebV2/fns0THfH20mScGaPSVvbJDH3rolixQUROSIDYK2zRamXhVOCp2mcZiLL4iRWccIAaDQaIrbOmkCJiOMozeJeL+n3e7P55PD4ufW+aSsZCSYZoDUOiuJ81E8iFS2ni/lsnipJTjHfMk7IfFEtTo5Oj09OlMrSLFvWy6aqjW3n09m13R1jKYrT2bL4/OHj1x68dePG9a3dHe0sAXiAsigWy6VurTV+sSyzLFNxAlonWQ7AzHTqCY3zdd0WyzLNe3l/0B9tcU5xoiaTycXknHNKItzeGTtnjNHj7SHjMJ+VDLhzhbUmFjG0IfgEnHNP7osvP5VSCinyXvSNb341juOf/uVPPvzwwyQDFbuLi4v9wb1+b5imqXOuLMuOVZblaVGUxrgoiWfzZRwrZOzh0ye/8u2vJmk0GPZOzs56/WzcjNIs/slPfyy+/2c//Hu//m2tdZIkSSpny6mnndnkYn9/9/T0OE0ib602rTbNxx999OzZs/HuThTFs9msauox50IpZ0lILqQ0xnz/+9//afKzJIr/+T//r9/75jcuZpN/+z/8j8+ePQsFMPv7u3GsAg9Oysh7yzjGsUrT1CNL07hpGCffrSyhlpSIQjFCKFsIFo6IZrPZbDY7PT5eLBZEFISJVuwPpcqyLIoCEUM2azQaDYfDnZ2dw8OjEEUPa0EopqjbJpwi4BIhRC+K0jRt25bSCBGzLIsiJaVgDAIPLE3TKJLO6SiWWjfPnh2Px/nf+/Vf6/UGo9EojlVVF9Ya55xrTFVVTdMIIRB5qw1jkGe9NM0R0VpbFGUxXzZNG/o/kXPesaKtOAqGnHMlhWCIUqSCJ9bqptFNWxO0cSyjOLSN9VJGiMY7b9EhMGuICKUQxtSMQfAGghMS1l8ppXPOewcAjPtL6hgBrSkgRNRVPQTDSRv5hZC4wbU73tmkzaKGPM+jKAqx7jzPb9y4UVcTxljbtsZcih4aY5SKiZB7b21Y69cswhcZf1csxysRw+bqv2lr4SWgAACM8e55C1SYYGLdhnJz9y3nnFjllS990/CD934zokAbeGXTMoXvXFm1OxRy5Tqv/LUDFrQBNWijm9Hmzn7N9t88OxExfln1gPiSP/3iIFOngfqfvG2OQPchIhK9gmZxZQw3P7wCFbpLtdYGL3YTwlprGYpNELZpO18+YzcrjDFcB36643e0D0REXD8buOKvQHiQ1l5+PhgwFFwKHrKDwDwC9yilshYQQ0kCAhAiQ8actYwzvlLsAPAIHgHAGw8Abq2S1N2ylJJB6Mt2+QBwzlFIGSkZqUASIgzqxZ4xFhDJKhTTVT2sRc86oLCG/hTIi97BJu/VOYeAHsgDek8IHj0gB611FEVMCFiXtkapiuO4ms0BPYFxvvWu1Q2dnR/Pp+dCiN3tkXdaCc4FVXWVqKhpGsdYAEzek4pEEsVSCiKyukmzTEqhIiY4IbPWakCrlDg/X9ZNlSdxrMRkcn58cti0uj8YnZ4ez5YLS/7a9b18OLDeOucYmCwV/SyeXXhnKmIJETqv8zxWSiwWiyfPnk7nswdv3NjeHT89OAIAa/zR0fF4PGqremd/9+jk7JPPv3jw5psyiiaz+en5mSOvlKrbtixLbwA5a9tWqVhrXVQ1l3FVVYzLptFJku3u7DExqaqmLGutden1+++/f3Z2cuv29W//2rdu37y2t7fjnEmT5Oz04s///EfPD47Kpa6q2lofqWRraytU+UVRJIWYzSZpmr777rt72zs7u+O9vb3X799W/z1+73vff34Io1F6dHQ0Ho/zPBdcMVYLoYiIc9br92fz+bIshlujyeRcCLG/v/v06dNvfOutfj/PeumTgyd1Xe7t79y/f+/x0yciV41eHseiHWQi7Y+3t8eRSNv67Pyi2dkaR4pXFdvbuffJB0+ePHp87/a9a4MshvTW7s7ps58u5x7QtK3vDeLWxYsGnp7MdXO0vTU+Or14+52v/rP/0z+/uXPtX/yLf1EuyhvXbr5x983DJ8fLSRXzrFw0kpLZWVmXPkpT5Gy+bIQQ9WKRZVm/39da67LOVCyUXD1529uhGC/Lcy7Esigm06kQMo4TY0zbakSWplme94gIoBJCWmulVIzx2Wx+dnaOiGkmsywBgLIs26YV3EnB+5mSUgoBkYCVBArnUqacD3Wzvw5gyFWsTygCZqxtTTObTcu6YAJ7AzUc90fj/o3r46qqlouSCWGtmx9NlFLD8ba3y7Y1xlrGIkaiqVprfRRFH//kw+VyWc/ntm6BmEIUijtOGkhKBcCqsjbOJUnGIukYmNYY54wl57i1qPUq649IpkGrtQlNqQiE4ESka3B6xTpERMFJCl8UiyzlaZpGUWqtreu6rduwWuRJLOVKH8n7VSrBGgvON0Yjcg4YSW6Mcd4yAE/oV72u2arvC6KUUVBBqeu2LOs8z6WMrPUXF9Ob1we/9u1fuTg/JY/Pnh9sb+8iCV0XBiCO4ySKA5XaWlssy6Iw3rQh8+tX0jEEQATMW0ewKuVHhLBaA4BgvjOrL5uT8GHnDiJiqMsPZikwNAMwWjXZWitBdQ46MGICCSB08YmiCLkgZI02nHMpGeMSmQBkobzcOQOwagQAAAGnrQwPdTQCHyr5rbVu1YXwhbhOiL114RkA6LJyWnftsNF7F9xpa62UqypBIrJ21ZuYhY7hhERgQoDVkwckFIQOGGdcgdOevHPeEQHwCEzweT0yT+gJHTACNG2jkkQKbowBZ6VgQgggF6GbzOteHlvnG2MJmCfM+oPlcomIIW6FiAierUJW4pVAIWydB78xdxxCUCbUzDAGhN6TECLIoYZWBlWplay8A6Xi0KU9iqKAqY1x3pvgloWmSLDS9QIA4oI8eedd0EtGIGAITBAy4Ip55kmQt56IM0REDhXnyLlgjBFyzqVUkVCRcAwFk6gEKkARegJb5xy1CIAIoaNkyHUhoJCCQsmB90iCEYULQqoFoORccrHBHIKyriPJpQzECHQIFogBKWIKhQQODgCQc86BgyVkFGDSGqoCEnlrOXFvnV+9DtzD6ho8YIgi6IAPPDlPzvmaODogXEEWRsQIyfk8FQ4845D2Uuu9cbYhjJjob40uTi+SZPTmG988OT47Ojy0VZuP49nZ0XO3+LVfeW9bKHPa9LiRgOlW74n2iKC1aWrNiCURRFx6b53SvRiFtEL6OOF56utaM661rrK0qau5Zq6xvio4i4qEU5zLh4+fZmn/K2+/M97a4Sqqq+b4+LiczOZPnunkvM/54M7e2dnZ5GK2v7N/cXFx9+5ry2V5PnFpvj/Y2m+MLcqlqc9d2/YzPD16fOPGNbD1k0ef97Mkj5VgjGybCMa5RMZ84x2QFymXwktoysZ7GGYDBjyN0uVyyWV0dhIq73wSp4yxNFIxlEdffsFF/N1f/e0/+If/CBG1bQ+PH3348w+SBLcGyY2d7KCe9IcsiXqMbJSJN966MZmeVs00SZWSy/395M0HcPNmMhrEWeK/+e43dvso9fz501PnPCNBi5mRDIrFdprsX9+dzKba6fnklKGLYzWZXQyGW8RwWeujs8lnB89KsM7rG6/tY9Qasov58e//3m+JyWTy+OkTxtitm3eI4aOnT4z3t2/fPjs7Y0xEUqVpqrVuW8OYODk/G5G7d2/svGdSzKYLLgURXMwunj97Nl9M00xyphh3z54/fPL0+tbW1mt3b/3u7/zmv/u3/9609c7O9t7OnvfWe+/IA2fMg7HOFIVFYkKEhqqBYBiWtjhNkiQxxjRGK6X6/b6x1hizWCxC7T4TLEmSJEnCktp9dzqdhor8S4cPUQjR1FpwlSRJLx8wxlbsegdZmrG1EkDIbiAiAkrJoyjq9XpRlKzUssJ5GUxnk6JYBvJE2+o8z69du5Yk8Yp7KGW/30/TVLe2qgrG2Hg8ao2eXMyIKM8HZd08fvzYOeO9BfCIRBDSlmStJQgBLeCCAQDn6L3VujGtJY+CK+90aEJPRAAU7lQpEcdxkFZERgCQJFmw+k3TGBOk0BIpIykjRB4ijatIBhEAdpGVEJMHAKNtqBxB3MyGhu4MHoGtUYVf1ZF731WZBl2s+Xxe17UQot/vW917991333zzzf/4x38ajpZlmeByUVZhFWPIumbqw+EwGBiAoNL4y0LfVxzQTScbNhxNuOIxr7fOGnUPTDDMeDXh8upIANugT3ZIhVbx8xdM3eUZNz/vwg8bufAr28tXvukZd9SEK9GFlyMQtEFx6C5m0+Hurmr1RALROu7SbXGWIZDW2hvNkJzjzmprLSrWS4XWGpAJIeIkm07ny+mERzGjzezDK3z6v8PW3ew6ygVd6iHwFUJRX8BMm/Bx82nZfAAAOqqNBwBa6xV1YRhgFFqis9XE8dBzlZAz5Mg4IgdgKFYvi1/tGVScGHuRpNk9Kl2Mc2OIAFbYFDcDO8hXvAQhmWCIiF2OgDEmkHfxpJeH6+UXxAKtBMgJATwRWfLWkwPvyBsi51cEcwPgujfo8oBdKJIhAudccKWUArvq2E4t9Xq90Wgcy3gxn3368YeffPzzx48/eeft13qpdK49PT9aLqd7O3t3b9/b2tr6gwdv7+zsnJyc/Pt//4eff/55EkOvF1dVEcVJmiZCAqB1TldF0epKSsmljCIaDEZZ2rtz796gP2qtcx7ef/+DshwPRuO7d26mWd62hlwbxUyqLe/9ZDJRSu1s7YyHI/RQlmWa5m3bGmMGg4Gz1DTNYrGczubL5TKO49FoFMexlFFY2ZSKlsslVzKsq0opIWWI6PSywenpqbV2uDXiTM5mM1NVWa9f13XGmPfknEuSZHdvhzycn58ryKTwcZJXVbOcF1vbI8ZpPBo9VcjApAl74/Wb9+9dE6BMa+uifn76RVUcersEX3pS9+/t3rl7y9nF7VujYW9QV4bs4mtfuf1/+a//qx/94Mf/7t/9zwBbSZIMB7nzWkRcSc4ZNItqa2fbOEczb7x1zgU8nab5wfNHBPr84qhuFplj+3vXy2p6cnQglmX17s7e7buvff7lF+fnk2F/yKWoddvPB5FUdVnNZotPP/n85OSk1+8VReG8H21tT+azfm94fHrCueBSuosLROjlyf17t85OD72zn336l9d2kzt37twaXP+t7/7aj37wfQQaDXOta20NZxFyLpCBB2Nd1bbG2aBKHToBWGu5FB6IiFprmrYRQiBjXAhkTGu9LIumaZxzN3ev9fv9wFdYLpeBNti1PguOYDBggQXtvVcqieMsjuNQUOS9j+Ms5CCICIB5j6F+HoDyLA8KzWmaAcBisQjs/aap5vO51m2ra2PMeLy1vb0dShy9JwAMrN2wWARJ9lBSwQUqJeNEVU1d12VdLZtWG2c8uNAd2pHz4IGBBwdAyEEwwSU6slVjvQ1LA7bWLZdlSMdIyYlISikZRyGRc/IeGTAhY6lCfSmwlWDiWhfBGWeDtKFQkgkeViXjLgX+hBDoqTG6bGqlYkSHiIG/3a01QQQxaC+GcSYg610/TcIxtTWhY1Ycx3Ga9Hq9nZ2db37zm3/2vR8oEQWgw5mIoihYr16/NxgMFovFfLYIY7iydbjB3IbLSsWXLUe3Jm4uuPiqNARASM5eWtDOcIbUQ9ffofucr2+f1tyCsAUPdXPpDz+vcj2wyZwgCO2mNiIKQRfQORfYZJu3s2nsu/Pii/n7K8imq2twa2GM7ux+Y6PLboc8MEyvwBHYRCRwaeEQCMi3WoOzcSTTJFKcee/Ju/lk8eCN28+PjlvjdKOHw+Fg0APkbdsG1udqnMETIv/P0U2CaFXPBwDOUchshu4i3vs4vhS1pHUwJowPvPi0rOACrvpvYWiIABBscLdPyCMAwIpLxWLGGPIVSuCcM7FSXsJ1n1UPBJesx6vtxS+f6hcnOnz3UjwKwcNqvpjgDJALBCQkoBXUx9Bt9YXH+6XXoZvQ8LkL/WeJCD0QWA/OeeMsATrntLc26KGtAIRbESwYdtkKxICNAIFzhlEUWWuZlYwxzoWUUnKhItbvRdevXdvZhp0t9/AhZ9Agd8ZWHvXuzd3f+Pt//1d/5dcGu7tn88XOrVvXTwdffvHzg6efertMomzQ789mE9Nqhkop4Zwma5kHTricV957cJDG8c54+9atO3GSyDh57e69n3/wgTZmZ9yzHoDo2v5od28wn7Ra6/OziW51WzdSqiztWWuFUHXdWmt3tvcAwDlf1wsiGo3G4/G4PxwAhLauXlvrvS+KUkSR966pNRCjdRua2WwWnM+zk1NElCpmjC1m05CaMVpXVaGUSuNEStk2dXlRxElfqfjP/uMPimXzm7/1nSwXdXX+3lfeWC5O5nPbZt407eTk4tnTp4cHR72BPTo4JvSM42zaxrz6+tde29raQrNMo37EONliPMp//dfeubadDHL3/f94tlgs5otTBMrTLEQqV8+6R2s9oSdCRixM4snJE86xKE7jmO9s9/auDT795IvHj4XYu3G9rKut7e37Dx6kR0enZ2flshqNRkVVBkmKYr6YT+bT2eLmrTtFWYso9giTixkToiyrRlulFGOwvTVSSqRxenHh2nrxyScXe9upEI0sWyXw2t7QOua8/tGPflSWS6EoTnL0zGvTyQgSkfO2aVrOeZTEQgjtbNU2vq6KohgMh8HrcuS5FKPRKAj+HB4eBq2PsD6GtqeMsc8//3yliLCmHYTlQ4pEt6VufZatFnchRBCgQADvXaut9yYkgYJURZd0h3XXGWNMUSzC6lOWZZ7n7733tW988z0p+fn5F1mW9XqDpm2rskFEKaM0zeu6rqoqmNW6rmez2Xyx0LpZlIUxxjgDyBAZeSBGHgEAHZD3zpFjKDxCgH7cRYyhtb6pdVVq512eJ/1+P8uSdRqbrHFEJKJIyaR1AEwILmNguJb1tdZaR8ZZzklKCchXMrTeg2nYmlHonEdEa70PkM0jkSdysGEzLFCwMZxz75y2VimV9/syilpjQqVD0zShv1RU1/P5/NNPP93e3r59+/Z0Pgs2sZf3uYpms5kU0fXr18fj8cXFxWeffn58fAxr0+vWq2RY94jWntArLceLi+OVv25+2HVVvgIUcN0du1usw9btdnlhLvTbXNW//SJn7sr2MlAIWfCAhzbvokMksOERdnfBN5oEbuaqO5ZJByw2b7Pj5a2SFhtW6gq6Wl3Axg0x8h5ZJLg34JHI22rZzrRjAErCr379zT/4gz/48JNPHj568pc//3Q+uai1GwyHfN2OOUAFhoSIHtnfFipcXtJLWzh4eFvbtg1AIXR1x42oQ5eR6Q7YDQIihltljHXWfJWYf3FYMJAUEIkJYJwxzoXgXHIphFDARKh48AjQNetmxBC9fQWP8mWUcPknxgGRWGAsQAAEGAQSEBBgRa9doxMGbDO41c14eD67s+A63GXW/Y88rFZXY6zxjhCcJe3WMkuWrCdHQJ7W9T0ExLq2K94DMGKMSRlFkQe2oscKJj02dbXUzcl4GN24noxHD958c/Doy4cc+O3bt+/RbfL49lfeHVzbgoiPIIW24Ghff+3W44c7n332GVB569atJGJFuWgbiiLpnCPrGDHTmF6SM8aatvXGX5xeSCZH2+Ptsbp5ff/g4GA2mxldV3XjnBvu7Y1GowO/BIBYxkeHx5OzCyFUnKWD3nAymXnvAXkcJ0IIY4xzxLm0HobDYZwmIXxrTOu9t9ZLuWJ3OuettcDQOQJgpm3SNDUtTc7PjPO7u7tRFLVtKxhSKDEj0k1VFYvBaLS9vYXGLRYLo/3jR58/P3x2+OyL0VDt7meDAddmylFnqUIi5+ZJbPb2U+6Xk3nDOdy5tz+bzT76+ZHEP/nVX/3V3cF2NS3ytCcEN9XSGf/arb3X/o//+zz5yx/+4C8+//xLGcVxhG1dOGuSONa1BqJYxsAZRxYMXCOkF7Pd3Z3RMOHCX9sfpgqMmT99WglLNF0sxm0zGo3iKO3lg8PDQ+eoqVoGPEtyQpjP5yqJ8/5QXUyFlAfPnz98/IgJqa0vy7ppNGPAEcmbVCFD5ByXUzh49mg4TLKGFotiOIj6gx1tiu//4E+aFhcnkwdvvRv4MsY75EwxwRiiJ66kECJKExVFrTXaGO8947xq6qyXJ1naNI1HyJN8JKW1Nrt7P7zqRVGcnJy0bRuq8vr9fjBRQTeQ1upMDGPvvTHOGLdeJ4EIp9N5eJcCtoiiKI7TJMm6BY4xFsdxlmWLxaJpml6vx2ssS++c07rtyrWr0kaKpUkaKeUsd855xwAwUplzTpu6WFbn5+cXFxehjWwsFRBjKGAVYA+sY48QahHJWeI8uIbgnLfaCYGeCDmXUSQhSrNemvWSNNW6McY4F3KOIAg8YNs2nTgV4mZmwXfrpve+qqogmz3IhyGM1rZt26zU/ZAJ6yhwqmC97gEhAKhIhahGlmUBNkkp9/f3Qw4iZGq6AI/W+uTkxHs/Ho/fe++9/+6////2egMppdY6ErJt27pqJ5MJ57yua8RVKXyIJJO/jBW/0vyvfnjJ8nR295W2ENYZjU07BBsGtduvE8jbPKBf13DaddfKTauzPvsLHl4XXXjl5jcIa1d2u/JruAAh+GZm5NLgvdhlu/uK3+gNuHmRm2GG1RAhAKzCXLhx2YjIAsQhx5AEgnNOIdy8MX799dffe/uN3/jOrz948ODp8+dbW398Opn//P2PjG6QiZWG6GqaGL3K2P+1W2fhNscBXtTwDlA4lHLY9daxOvyatdrdfjd04cf1Fb742LxYHtl9xTOOjDEuhIhkpKSIUKxCCz50eAXw4BA4IvpL8uBlfKJDpd3pNqc7cB5xhavAIxCRh1WkKrSsDHbbIzigmF9yU7pHFH7x82+RuXW1xSqK4KyxHhGNdyasE0B+3f+cgSRaES0BCSCwKZBWmtWMMZIy8oRh1bW6FQrIF9PZ02LZ1HWsJHpXDwbMan7t2rUbt16TIsp6Pe1tO1v0hluuroUQb731ltbNcNhHRrdu3RKCffnll6enp6HQOnSeq+t6MV0kSWKNWc6LYlGen17cuXOHA9/a3h3mvX7Wywf9k5OT49OT48OT0+MzsLmUKhZRmiSzybypWikjUNA0TRQlgksiAmBZ1suyXt22y2XNOW9qXVW1JyeEkh40syHBtJ4mJIIgvXbrxvbR0VHgGMZxzBCqqiJvyVtjjOR80Mutd+fn50KI3d3d5FbyyccfG2vTNFnMJn/2p/9hayT/wXff2xndHI7UoN/jjA4PDy/OHk0uZgDMNy6PWNbLf+Vr3+6Ptv6Hf/2vP37/wNTizftfn7gq3usneQZMO1s48P3x1j/+x79/8+bWn/7JD54fnizLcrFsnGeIgoiUjPO8Z5yz2ja6BQAkHMR2f2d32I8/+fT9timVhGs7o48+/lIMR+M0TYuyrsomEnJnayeN0o8++kihbKp2MExmi+V8WcZJlvd7d9+4z5g/OT8p6ipO0tHWdhTnxlhvXaR6w0EyyKPdra2ymBw++wKJLeeF6c2//OxDRu7NB3eRUVWVKLPDk/r6ncp6pq3V1gBA8Nm8typOIDDnrTXWeu+VUjJSRVEIIeIs1c4uppOzi/Pg8R9NloiYpiljLJAYtra2AGA+n4dlIhgq51yIQACJriWgc0ZrV1WeiObzeWAnAADnXCnBOSq1UgcK1H3GWJ7nVVUtl0vnjDZNkiT37t2bTi+ePHkC6O/evd1UdFheHLOpjFSIQVVVUTZ1r9dLkkhbWyxb3VKkcm18Vc5iJQAhxDmdI2Nc21qtLWehaQI4S857QB8SrrpplSIhhIySFDkRAZONNkV1Ya0l8F2ssm6No7qsGr8mDYTCkNC5otUVACADZIIhcaGQCaWUitKgBdQaZ3wTBBmRobYhk0qM8c1FFjkLKQbkDICABdU2b3WrrbHeAUMVR0qpNE2TNCVyw+Fwe3t7ONj6v/8//iURSimLZXn91m3nXNuYJ0+eHB0dIaKS0c2bN4OkY1VVsFq0vPfeukvT+7L5vIInaMMjfwklwFpUcV0UsFZa7ML4m/YJNmIGV1beLuDU2dqNS/Ih1R92QAbeeyFE9yGs09dEFIQp4VXYpbMrsDbtRIQbrH627iDVcdRpnVx42WcNy3q3/yuv/HIMgeGqO1SwTN7oxlmtOIslAy4H/fy3vvvd/+IPfu/86Fk5n+zvjF67d+fevXufP3yyWCyOzi7CkRE2WAIr0Pm33vDFLNJmjIHoBQDnnAu9OQJs3dDQXHUv29zgctG/alAR0W980sFBxhgXMSJyIYRUSkZcKQylkisTjiu/HzwAg7XO4+bMbkYUXvUnWAECRGDovTfOocNMJowj44AE3jtPpI0hgCyJ6KUNNupvO6QbNgur5yQImDgCb7z3joAFdBA4neRhpeF4ubGQJvPeexfcHEDkjCHnxLkIvGMkB143zeT8/FHbHJyfQ6aU0VguSbCRdzga34BsAFKqpmJRY0pgPJMKBsPk69/89Tff/pqQGMeqbevxzt6jR48ePXp0fHzcHw63traLonjj3l2l1HQ6ffLkyenZxfPHB/Pp4vxs+vY7Xylm9WBr1IuHdeqq2JZNXS4rahZaaxmpmEeDft9ox4BXZZmoJIpTxlhrLBEJFSulZGQET4wxy7JwzgEgF1JKklIyXJFwGRMhaB8MkJQyiiIksEb3t8db2zvn5+dffPEFE1IYk6ZpFMWuqhazqWAYK4lMjXfGs8nFeVv0MvXO22/cu7N1bT+dnx/0bg7Gw6HgNJ+AkpAkKLiywvzKt769tb1z7+5rUdK7eeO15wfnz54e//Effv/NN9/YG18PugNSyqYu5fRiuH3nd3/vOzu7wz/73l/88Ic/ratlFPWsc8gcekBiTuvKNsvl0oNzzqkMB73x2289mE7OJicXHOnB668fPz8W3/nub3z44YfPD56/9eBtgezhw4exitI4W8yWs/ksjtKjo6PZYnH95k3j/LXrN87OD2aLuYxE0zT93nYv35rPl7PJNInzOzfujoZ5nrD55GQ8GJyePEcnpufPp5MTAnn3zo3nR/PX7t+dLe3WdjlbLoRMgZgjdM4gQujI7om01shYElYWzoAhec+VnC7mHkHFkVDy8Pioqqo4jkXrQ2fCYMirqirL0hgTBMPDChIWiPC26NYyJqzVwYcORURaayFECKpHUZTneb/fz/NUBqqxECFi4b0PYXat9eHhgVR8Z2f79p3rN29ev7g4X6mdWzo4ODg5OeFS9Hq90N/FeOMdn1zMgWEc5zdujKqq0gfk7HK5aFdvsw+FhU631lpP5JWMOJcAjDy3BkMtt27JGs855wLDa0mEWtugp0G0UjxljDkH1vq21YwF2TUyxiIGhpfDVYg7CLAAIkuSOM/zttbBA2sabe26H5JHxkIyu2vosHJZjNFd8AAAOOdN0zx+/DgwOkMsIazO4bCn87PBYPDZZ589eOOtW7euGeM45wy5Umo0GunWNto45wKwCLCss3+d4V///AI/8ZfEG1781uXOuCG50y2jmx4ebDjffi18dCV2vTKBG3jF+xe4+ptAIaR1cKW78ELqYbOooTNInQN95co3b6dLkYT9wzi7tXzFZm6CNvgKm5PYoYpXGsgrUAzBE0AcSXRacAbeFYXxelos50ju2t7O9//se1vj7Zu376S9UZbEuqnqslaxonUb3815/LthhZcn168LdLvbDFv3WCJioCVt7ryJElbDy1Zj1cVjVimn8MAwBkCIxNfpKB5FsOI9SCYl4xIA3IqqyYAhArjV+22JiL+I/1626LCBEmDFFkZatxHxQNZaZGSUQmSMs0AXCBAkLE3rN/TyUPAiUNiMWnm67EPtgZH3gSKF4Ml79IieCAg8oQMkROBAAJcjhuTRo1cqDiU9DDlDz5jjqw5V2DblcnG6LI6sOZaCMa+8jSK1Nehvb4+vgcihQlDQGqGt7KVjiCVY7efnUmHW20LmjallnN5/IHb2b8R5XrU2SpK019eO/uMf/WGSJNb4ptGEXAjpNS1m5R/++z8ui2Z7d29v95oliKNkf7zjhu7g0bOzyRkK3uv1mGfgjGm1dSSj0GaICEFwVRQFADhHUqjAUQvyAwAgZZSmSOQ4k0AOwHjvnQ75H1pUk36etlvD50cn1trd7XGvlxVFobUOj0FdFUZrTz7o+jjye3t7cS1uXN/5xtfe/i9//7vjEf/5z753sixsw+tiCuBNW3F0SL6t67fevvfWV+6mSX+6OH/28QcXk5Osny+Xxfd/+Kfa1vdfv+to4E3D0bemTBCKxUm+vfvO269HUVQ3+vnRH1Xl0kFkbE3AtTYMuOLIGNONror69NA8/uLwtbv3/sFv/M7/9G/+u+fPDm/fvPX6/fuiqKr9vetWuziOnTZpnDAmvvj0s0VZTGeL0XinrZsgyH8+uUjzbLGcXVycJUnv/HwiZJZG/bpuT08nAsXta7dsSsmo16jlsL89OT0jzw+efWl17cFvj0aHJ7P79+89en7xBk8PDi8yHnMp0aJzzjEk4kII61e5HyEE8lXupGqbKIpOT0+rpn7w4MHdu3fruj44OHDO9dMsNB/DNXM4JJOCBFNYF7pahuArq0hYawmcVHw8HoeY+YpVx3me56PRqNfrKaUQkaEIlX6TySycKHjnWZYho8lk4klfu7YXOBAnJye3rt8/PZkWy7ZqJrNkmabJYDAYjrZHw+2Hj75w3r/19rXBYPDxxx8/eXJwcnLS74dOmBwAgJhzZE3Ie3kAFTGOQWTXB1r7Sl4iuEdRFEXxSr8ycIiaRgO0ALCupPLWuzSOAotTa62tCYHZPM+ttYCoranrOkTzkDPXOu8h0A+JVtjZk1dKBWebMUZ0yYlz4KMkttaWZck5T5KkLMvD46PhcMilUPFKEhsQHXnrnW7bR48eXVxc7O7s379//5NPPquqqpf35/M555xWjfjQOXdxcXF0dBQyfFrr4GqvJ/rSkF8xGK8M7G9ChO7DsNsVBcZNS3NpPEL36rXP7Te4iptHu2KoYA1SiS71DcMVhvOCdx1QAE8r6/4S+nmZGHHFQIasfPCbYd2yCzYUJDetxeYFI7LujuBF8LG5eVpVaGwObMjopZGII2Vq4x2YttZNfXJ+8t/+q3+V9Xq37r727te+6QC01oN+VjYtbFzMxg2+PI2/bMNX8U5gg8OxGTsJQxGYzmGiQ8ToZYiwefxubLvRYIz5lcscejytIk+MMSkiCpRVLhmKDmQAriBBGHFCIE/ee7XuitIdfNNsv+pi1o8lW42bI88ctG1LSjAuuwhiCIUFn4dvyNbBi0+1fzGHslI3W/MpkQg8QhhMj+A9EiAQI3Qh1YCAuOI/BqDpvWdMcM6JIQKDtbDE6tEFr3XjnU5jrnq9LPfMU7U0kuPW1tZ4vAcQl0Utc8VFyomTlVijs+R8ZL22jUNmAHE5X/QH+dbOzvl0+tOffTAvCmLs5PhsPNrinGvjsqyXJFlr7HxRLaaLNB9oibp2pyfTtjV5f+idsNYncWytNXWNHqeLeVk1cZYKoYyxy7JojYuTTCllvNPaeu+TOM3znIlOeA0ipZIkqet6xV8m5pyzzoXHIOLCWhvH8f7udhTHVVXt7Oz8/u//7gcffFTX9dnFRVEUwXwoyau6QCmm0wsp+P/2f/e/+Ue//1vjgXr25IPz08O2LqaTFqBiHNq6ybPMOayr9ujk0fd+WCVxD1DNZ1V/K9m/8e6TJ88Wi8XJ6cGXDz8kfyvPFGe+bZfEI4ZDs5zKKHvrV745n1V//Ed/dvj8SEU9bVDIWIgo7qUqjoRgF7MpY+zooP7xn//0q+++/du//90//MN/9+HHR3duHe3u7orljNcNqXhb+yjp5ztJdnT8HAdxXc9abj5++CkCF0IcPz87P5ke3jxeLCdF2ZqYCyY5IRdUN/Otncxx/fmzz+P+281xc3J41Mt7JwUsvbfTuNHwO7/zewdz+/Gjk2y8MzYM5CIb9j/74tHOcD8bDBcLgYJbR0neU8Ssg6KqkPP+aIACJ5PJfDljJUuzPMlyD7w/2HntPmtadnJ62jJfg22bdnu09fZXvvLG/Td00z5//vzs+KxYLgFAcVFbH3r6Nk3TCIgdpHGytXMjpJGQwBiTZJIDMQ6cs6qeW1NIJTjnbF2uGTSSAUBKqZSitoyipD/IGWPHx8dhGTo7nfzFjz5WShliRWXrtqo1GOKeKevnR8eLfr8/udB1W3lMjVXTmZMx297ellIuFgvvaTAYOGsvzqdcovdgjFVKSa6IyGpntHZNjcAFYwjeW21bQo/IuW69d5xAagOIAkCtChkI0AvJYmDgDVrbgAfJhDeIJIiobS05FsuMASsXTUhfGUs21GETc95prYGxNFVJmnaxmaZp6rqWXCEwJOTIrbalLcHTqDcUKLhHyQVn3JHzznFDjPu6jAWLj4v5xcX0H/3B7x49fUixkFLNpmWa91WSNdoUdWGNsWQsWnJIAmUauQbatvXOM8akVN5bBLdidiEAOOxW2rVlxg3v7cpy3P013M7m0hxWBLfm2EIw6gAAQYsGvGNCYMgzGO2EEFJxay1jwLnkHImctWZtD2LGQKwHjTbaMvG12+c9uTVocM5sepaIq3gvoghck87UBYhQtx4RuRQAoG1QIzTOu+A0C86BofXO25XYH1PR+va5914b01jrCbVZlc8HAj0AIYX6/oSInPeGPBASELLQuZjaBtC788ny9q3RH/zuP/zmN967/vbrg2qf7Qyenc312cnH/+Zf11V7OiniNOZMAjAPgRJLBG4laPSyedww/JvbaliYCQb78nMAIAggCSC0JwCtrXOEqOMk0cZxofLewHmoG20dJUnStEZKCRhY+1xIFXwAZ4k8kIMwCB44kPUEXCUhTe+JOBIKAUIg5w6dilQQaXbkkUKPEuQcgRgQ8oCHHCCEWMoqsc34ylo774kcIg/VicEMA64UlxUXAICE6AmZCO2iySNZZwkaT1JxwTgieus0tXmUL4qqbl0axUpKMlayFTMJiBEwAvJANvSQBtJ2xTr04TLX7EXdWr9+eyBcmfcI4JgFRAS+6pECBMCBrHZasIhxJE8kUPKIGLZtW4FjUdbWaUJ3/TKbHp/vbg8Sq0fD7Vja0/MP9uVCV+3kqE6iNEkSPfbVorYGlMyyNAOS1jJn2fXtu4wBA/b67bd/7zfNZHqeplEURcycWGuljKI4ffTk4Pjk4u4bt6ez4vDoVPWkAQdcy2HiJZ3Xc86llLEajr/8+GMxK4qqcs41xyc3bt3Ossx4hpITQweUJJkQ5mIyqarC2CaOYyBSkinFFWeMoUgTIqrKenZ2zjkfj8dCiOVsmeyM6ro8OzvZ29s1Rn/w/o+2trb+6T/9p7dvbP/L/+f/yzfLu9d3T47PqGkFl0VRqH5/Wl70B9mTwyd/+fHP8pR/8MGPf/LFs53twfFhaR89I9cqjmrVq0/YMtFT9vT5w63BVr/ff/OdNxpr2nJpfFnQ/Icf/CDewrd27n72wfsXh4fvvvXmcFTcvv+grapIwLtfed0zN9oenF3UQuatA44AFsjyrL+jkqG1tpdExweTjz98PBwO98d3v1SPDw9mr732VRFJ/qM//9mymH/961+7ef0dxrEqFndv3R72+ufnk+l0enh4HEfJnTv3OJfeWMZYL+uneVY1q07Qu7u7g8EgjmPdNHVdL01bliVnGMoXuTbb23s3bt49Pbn49NPPARWBSOKelPiVd7+2vbt3eHRyPpmnKkpiJZScnp23bbu1tfX2V97Z29s5Pz/3QNY7IYRQsXP2/PycPBKyGzdv7u7tFYsTf07WO5UlWb+X9nt5v8cEj9PMtJoDaq2nF7PVxTgrBTLGuiRC27bkvNZaSAbOerLeOwID3gXtYBmJbmlmHJylwFEAgCDeEJLooTmC1toa1u/38yTNk5RztMEqOO+dk4LFkTS2jay8trv31Xfe5UAkaDjsSxkBQNu2giMQj2IJ67o8ct567Rxp0xprkAjQERD5y2AjIQ/OWZAJ8mSNQYEghPCe2rYNOKbzUMO5ujxrWA/Wtylo3VmgK1ho25aIQlFJiFUEq2OtdRsLejBd3rq2bdM0bVsNAGmapmnKoyhcahSzqpn2e2mrl/3B3bfeev2zz76Yz6fes6ouq6a1johhkiRMph7c+flkTTRZhRCstUa7tYFfuVkbjual7/tKL/yVWxdO6H7tEIPfYCTAi1515xp2fvkmrWHDcYTNg7C1mh4ivHx5r/wZXyJRvrxPdxlX7uvKFmIPm9HprvzvlcfsDsIIPAJDDD5lU5T7N/bAu+P6vCzLN9544/r16xdnZ1wJwaUxMJlMtHYIMlz/ygcNY4Me6BfGBv5uWxdReOGaGQvvZlVVk8mkbdsoirIsCyHGl/MORMQ5d+RoIx2Dazl5WM9+yFp0pw7j6VdSRoDrnrdESCtiR/gKEBH4rrJmNa0baaxXRMLCm8vXuUZEHq5NEwnhQ2wDuVs/Ib6hKqxUgAqRgMiSZh4Q0WPgGdCqpQMQhQbZYT+ilW46raIOHYrzG8G2XzL+3b10EJxznveHs7O6rVtqa1+Vumnktd3da/vGQ1mWR0fPGY85i5C5VpdtvazKGoAxVAiNNRdN7QCE4PLatRuDQQ+H+b66vlieCwmcMy6QtbG1vmnNycnJ6fFhHOfX9na0tlrrZbUEFHl/y3solsskzcfjnY8+/GQ2m52dnWVZ7mGFL+u6fvDgwcnx2Wy5CGoKxqxKmbK0Hxa90Lc9RDdDwDuKouA0GmNCa1zGGHg36PWNbpNYKckF31ZKXZyd7u7uvvH6azdv3v7ZX/38yaPHe3vXzs8m4/G4Ba5U3NT6Z3/18+fPHuWZqKvZfLK0bTMapAiybVtNGslLzpIk6ceCc7Z/bUcQU5I/e/xotLu9New/Pz1czuaS4fNnx9LB0ydH89Mz5uTXv73flCWBKufTi0nFwTVNYXRLwIFFgklE73y7QsCSjUfXelX6F3/xYw/1/s3xV979ehTz5aIW//FP/ufvfe97vV4vTVWvn16/fp1zfufOvab5dGsLkiQzxhm9WkcYh+CZ6MbkaXrt2vU0TRE4eWjrxmlTVU05n50cHy1nScSj69f2t5Lbg/5w0N/6y5987/xiNhzsGmuK6qJuzGA0TpPe7duxjFLrXVmWWuskTy05rkSWJUkaASMAr5RojM6TvuCKEFrTCKFUJLlgRSNACRFHUZZGWSrTOBISBBdxorgQnE+nU2I8ZIkM+JghY4x80Lo3iOiM1VpLxdE7T5bIA1okjwwQkZtLlgoA1HU7n8/Lsuz3hnEcE0FXBBFFkXME1qHzSZYEfuVsNmtNQy62Te2dMbo5Oz48R7x9986gnw0H/agfbW1tCa4Ex7IsgZjT1iUxAENiREQenQtajNZbk0bJylQgMIaBNACceQdRFHEprHUBFQH4IOIeosTdq9shhi4XE9bEwMYIrQBggwfOGJNSJkkSRiAMWvgwy7LTs7NQNxLWZSICRitiBwGu6yy6dO+tO9uMwb17N9Icl8U5cj3e7r355puPHx01LRZl07aaGBJ6TtzDJb0uYJqATuxl8P9ySQ0KOcH80cbS9rLlvvKnK3Zx89438cE6ZrvCQ6GuenV6DKYXuoJ7ok27Dn5Da2i9KHu4BAqXTPgrV7K5EG/CF1ijmU0DeSWwfAU6hJ9DM5ROgMitmyNsDs76B0JEcj7Q8QCRA66HDACgLkqj20FP7u/sJnEsGd/e2/ne93/YNNo5WC61biFJGEMgv64uJAYbZSkvR/7/ztsmS4PWbcEZY9Y5RAzhwDRNg757N00dObRDcpu9RboHrzv+6o3Ay4ngjIX3qOP5M8aECJRJvDS6xGCVRVqRYBjDbuI6DuaVUwOAMYGeHCadd48BrPMFANpz3uVbwBrOueDMkpEB1xEaIoYMPPNAoUO09+BXxQ6se1Tc+tl2RB7DExaqO9eEhl88Xd2D181CGP+zg/MnDx8++vxxrtp+RFLGwKRUCRAUrT2fTD17JniMHgUysg56ob17U5V6Piva1qVJPhxuCc7qapkvZ2fnJz//q58+PzyQkisl6tnjXm/Q6/etBc75zs5OkiQHBwdVuXSGjNPOuTTpCxVXy8ViOnn06DHRSp4uz7Lt7e22bXuDIQCEyHFY6wLiT9M0zPXmItAl+0LxfJZlRVEEnpxSqlrO4q0tiWCb2nsbC1EuFz/7yx+/9957t67t39jf+4CIkxdAXrdNsXTJMI5jBrZcLNuyHPSjSGGsesw7XUO5XOq2GQxSIpou67Kqk11WLKeJSpbL2jbt2cX0bfbVdNB7cOf+zz/92GtIRZ7Ho1v7r1/rX+/3esuiOj49ybOt+eJisdR717aq1kZRsqwcIHHluXCAQEhCcBnFy+V0a2frsy/eP5/Mvv4rX7VWz5ezLB2KP//hnykJ77z9+sX5yb/9n/7H119/vSzLLMvOTy/quh6NRl9996uIqFs7nU45Qp6mQIxJ0ct6eZJ6YAzRGIMiNC8RSqlBf5Qm0Xg4unP7Nrbl1tZ2o/37P//o4nwOEE/n9bODo6qxUsXTRfHuV9977fX7k8ms0YfMQz8RbVvPFhfvf/jz/GlalmXRlDxi13f2b925nWW9umoJuPdQlqUxrvb9KEmcc3me80g6IE2uMRok50opqSLdJnkGnDVN0xi9Whes09puLscUQq6MITJkKBhywRhjQgZemHGWAMBb44zWTUuZNVoLzpWQXrigzR5JFaexlIKss6323i6Xc+dMnibZeJjFcZ5GVdMU5byuRoN+78Ebd2pnQmQiTWMO5D3UWIuGMwiGipED74zzoeOGFrB6apngnMdKCaUUCmmMUUpwoRiz1pqglUBECC4Yg7AUdqzvXq8XDEbHeO9Mjl8zxu26I1eo+wgKmBjEmowJVSRhN9ro/wSeQnAlUVEURQBQVZV3Ls/zwWDw9jt3hqP+vbs3k1QwoFaXd+7e/NpXv6XbH86X2hM2rSmbutE1cAC2aSAv6QIIfNPer40cwAZ0eKUDtLkWdyjhlX5SBxT8ujh2bYa7ddN36QxPIIRAvPSlVmyEyxD6Bq39Esp0IOaS7XjFYG9eamfSup9po6vky4s1bbS97g7L1ipAYRIDRWtTdKHbwoBT4FSssQIDDD7ocDhomqqpzf3Xrjlj/+IHP/zw5z9788Hr//F7P5hNC84AGTPogZDzkJcRAC+oFxARoAf6he2k/1bb5oht8ksAMTiC4YlN07SbXHyxiuQKtOoiLrTOCnWzwPCyP3WghiilQlHOykZyHrRNrV+HJYAjXAYiukBG9wC7dYPpF7EaAK0UzQEEgAXGGQ85DHRAWmvnuODYMRU8cwDgSFurLUdEZIBA62cDkIgseee9JSAi62V3496D6ZSpWNBQQgcEnYjoLw4A4fqWcM2rCJtgCj1nKJ3VmEbI8fHTo0++fJwOB7WGtH+xNZopFY96/Rv714bDwbOLaeh5rbVtWte2hqBCLpDDslzICT89Oz48PjyfnAWm+eNPPur1Brfu3N7fuz7c2h4Oh02rnzx5ImQ83ho1rZvOiyz2u9tbJydnP/+rn9ZGZFkWfJ4w5qFN8Ww2K4rCGNPv9weDQVFUVVUlnDdtE0BAiButM1wQ6reDaG+YrLV35JWQsZJCMueYlHwx14fPn33l3bdv3bz+5RdflMVi0O95a+7cvjmZTJaLkqxTEVc87mcqi6RuF/PJcmc8LJpqPmuEAOrFWmuh8jv37g2jC7LOVDqwv3d397/6la/2xuNpWXz6+UOv+Xjr+r2778A1L5ElMjqpjpSMs96w1YskHf2v/5f/6OD5mbb8hz/8ybxsi9p5xgGlBeRCxnE8qcmT7fX7yJk2Luv1T87Oh4Ntwbi+c+feO+8++PjjTx8/fnxyclLXdVFUbdsuFkshZL8/uHXrFiJ+9NFHp6enuoVev4+Ei3kxm35aNW2apru7u2VZVsWymM3bpk4iZVtbVOX56XnM6bvf/c2yas4uJkcn0+PzGYFojGFCamsePXkS59nt23dr3SZpFMVSMLMndpu2sq5dVj5O1F5/B0PUpd9Dzs1Sa20ROQpMomgv3suyzDm3nC+WZblYLOI4bo222hljFBdaa65khBDmdbW441pejXNyXkrJBYaIgvcuMIiDmZTCITkgFIwEl5IhuYwjplHsjQYVDXq9WKm2MWRdkiR53jPetVq3tnXO1XUJDCxpY9valImTUhFrqWoXo+3e219585NPP7Omreva6pYLxj015MlbYx0iR2TOOW+N1ZXVlW3tvGo453GcqDhSkWAcjDGmbQJpAFZmnqy1YZGS/FJ9JZi6lbTqOm1xJfLMVkV6q/57uBYzCJXoWZYJIZqmadt2uVzO5/P+YBBI9h3aQAJEtNa2tGow07YtAiRJAgCHh4eL5aRYTr7xzXdv3bxRVWUcFR9++H4I6IW3EQCs1QhMClHXLawsou9sdrA9sGHmac2f3zST8Cq4sLnor83g1W91e3ZraIechFBw1cyvxja0kVy7Uy8YrU2XccNF6066Ilh093IF0FwxXZ0hfBEn0SZKuPJJ92EIuRORMbqu6yBz7l8q+Lwck4BgVrUAAAihaUBVVf1e1lazSMg4ElEUHTx79lc//cvnx9O69mmqAHnb1M4RY8KuqA8vTAQygksT9Dfdrszm5dFeJTIBG4mVplm9I8E8bEZoNr9orYW1nuYqfLW24vhi6iFsfK1bwPlGQ5BXRUroVRLjL07fpohFV5zCiSh0l3NOkPASJAa04sl4Z611jEsJKgrt7QUSOCDjLDOMr3wD7tddUhyQJ7LkvQcPFJqe2nX/J+9XKQmOzAN0txzqIukX16h0IZxL9Ow9EfV7w9t37yWK5pMniTL9vqrqeTOftRBPysXx4vz5WclRbPUG02k5Gg6/fD5ljEVRlGW5lNICq4tqVlSTxVwqPhoNoix98O47990DIYS1enecHh4eTuaVSioVp9NlWdUGkCdpng9HiUUXWgQHVilj165dG4/HdV1zLqqmIaKyLI3z4/E4TVOPkGVZlmXLZVkUBSAGukrAE+GpCICgi8+FwOrqCUGUImqapm2NUhkhAiAAs9a3rbFm/uWXj87OLqxx5LUQsZRRP8q5QCQvEJEYJxaxuJ8MltPCulawOM+y5VIvFsW7X3vnD/6Lf/zmHTGfzj786fuJUMO8f//ea6OdXUuQzOe68otqUiycc6mUTDCJjO/t9pqm4TxTgvK8/xvf+c50Vnhi4/Hos4dPvnx0sKxbYsoCJ86FUG9vv3l6drS9Mzw+Pvzkk09+5Ve//sH7Hz1+/FT81m/+hrWWvLl5Y6+fZ0rFx8enVVGSo2F/EEl18PRZVZS7u7umbYvFYrm03hEAG4yGcZyGllZATAnZ27uWxmp6dsbRG93EcbqcT+dVmfezs9Pp1vaIgM2XVRTnQqXGup29/bo1nszF7Bw5kxHT2llvs0E6EH3nDCIBw7Zti2Lx7PnT+WIhZVTWzYpyRUwpxVe9xczp6SkSOW2vX7sWq8ihb8pKAyKiZByYd5wHnWZEJOeFWHnY4MkY47wBh84TAHlarV9EZEwLAJxzKbmU3BgQgnGO2jTGGAA2Gm2lSY5QC6HyvKe9IyJDFgC4YlGeeHAO/ayclu2SlxDHMTF3Mjkm4Ue7Q0BXN8ViUXjnlIwAwHlDXiNjCMQxLGckOcuSOFbOaIzjuN/v9wb9KIqMsYvFoq3r0MHFesdwVc8ZZCRbS13GIbhQXSeLsELx9RYKQ+bzIvASuoRLlmV5nnPOlVIBH4SiEsZYr9frDhIsEABwXHXQqIuy69nBGAv1qAcH50LwPJNxrLaG49lszjA6Ppp6K6uGtNEEDhmR84iA7HJt7Y5PRCGfEhaoX2JINg3/KxHD5ocvm9jNPTv+gVLxpvO0+hlD5eTqiQqopTMD3hPSZWhkJZ9JK/AAAAC+Y2JeMdVXEA+ugwovI5srKAEvcyUvfBguzzkXuiGEmNAmMti4d4K1pgxbJR2QaJU6ccZabTjCaDh8843XXrt7r1oufvbTnywqlIJzFlnnQ8NiJWUIs7+4vVqB+++8XbHB3Y24jR6nxpjlcrlcLpMkieO4m8HNgzjnV22rEHFDB4lzjpfztYpGhLepO8ImkgsH7jJ9QGwFttaCV+Es69kOBa6bOha0xjE8VG+QI/IQUDiiJEQfwhXggSNjzjtBDBE5AXnPjCfmvAOUniGEmARzK6YmeQdBZ8ms6yq9957WYiG4Cs0R/k2hXDcIiC+0uhax2t7fyzPxxWeFbWe98d5WcvOW4IvWlF88np9cLAsC20xm5tnh1GnD03FgRKVZPBgM8jzLsixJomqxdM7Mq3q8Pcrz3v541Ov1nHO3b+396C9+/Omnny606yn27PjiYjKtLKUoZstGqTjrjcqq+eLxU2v8/dffFDLb3d11zkVRPFssnHNt2wbz3+v1HFxeOWMsSRKjm64cOkBqpVRINgVpvvAzW8uEG3Ja67JqkzS3znMZx0kPEX/y0/d1a9M06/VHRjul4qOj462tLRCCnPfW1La19TLBrbfefP3+aze//70/fXLwkLwXQmnjVJzt7t0a7928dmtbxSfJF6eDJEtklOQ7TU3TokSVeIoWy/npRbGs3KiXE1ONg5hyckVTIlFqtUjiRG5nzvvf/s3vqFjOlzN7YbxgDpghAmZFHPcH8XC08/EnPz84fPIb6a8dnxyenJyJd7/y4OHDR0fHz9KkPxj2yqKtq/bg4HkvH4SGRs+fP3/8+PH+/p73Xio+HvWzLNPWXdu/sb+/fzGbG2Pqun7+/OiN1+71897FyUlZFk1d7o63XJLnO/29vZ2/+tn7e3u7t+7cOzw6AyaRiYvJYntvPF8uCVFIX7cVoCLm26Zp2pJzLiOBSGVZXlxcTOezMHN5f6hUrJgo66aqSqGF1+7s6HglxObJWy8Zv3PzViqjxpXeUxRFjnHtWkaQJymGQhfnO5EAZywittohcGTEGBJAR2ZkUAEgQyJvrfGmtdZocp7AcyHI+bZulIqTOJYiYoCV1UIyEAzAR2ki0qjVtWMeI97bGjCOJHySpGVZns3OZuWMI5Cz3hki8uSQgCPEsUIf+NueIXGGSRrnPOOcA8lQ15ukeXDutdatMd7XK9uAhhFwXClEwUqM2QVWQYizdeaQrTOsbNVmcKVlSaHRA4Z2eFIplWUZIgbx6a4SMs/z07Mz771cN/Ty3jNY9Rowou3ITWG9BoAsicqi6uf9i/PCaNjdudnL+74nHj08KIq2KIxxjsgD+CCHFVqAAkBQVkDEsizLot40Zut3+5K1cMXEbhqPzpasd7iKFWBtZTvj2q3lsGFHGXvBzBARwCVLoEt1B5rjy0Bhw0jQFaDQ/RC2K6CkW9YvYcpL8Kj7v7tmWHesCIPZpVq7q3rV+MDl2CIirWQBA1AYDgZVVdDKbuHHH398cHDQVo6xmHNurfOEQijvgDHhvAs0DAqM/lD6H9j0/zl0FLptcxy6tEuQvgjgtSzL2WyWpmm/399M4sDa9hNjsKFfCWt0xTknf+UBYB3NuZsptupxGtJSbOP4a8mmbuLWoSzvfQAKRJcVvwEi02UqZCUp7T1Z64k0+JDH8eszQkg1QnAJwJNn5Jnz5NGR596DR0+EnsASOfI+MBKA/IsX7BEwvBRsdembz9Yvgg0deF3f8gpIGfJV3TS6vliWi+lZoRsDVmZZZfHgZFlWLI5TyQURtM62utbONY1tmgrO53E8297eun3n+rVBP4p78/n0bFnMdRPH0XBRpFlsjFmeHT4+Pj8v2q3r6XDn2tOnB4dns2VjVW18OVexSdOsdTRdVJzL0WhULsqLi4u2bQeDYat1iHcy4du2Dc29gvkPblKWZdO2Xs+bD6zw8B6FPUMQtAOLjDEZZUwZEJFKc980+WCoktw5d3x8zLm8vr0XZ6OiKL0H4HGWZU9PDp3R6CyZttFVIiCP3/nKm29PT0+ns7NlWQgmk4Ttj7eu37w9XxR/8sOjar6cLEiikDx59OgkThIDftHMQcSE8fOTi/NJORrdYFHSVJUw/SjqCeb7OTe6YmCiXgbeSsXjSHhqtCkJrGXCEwKXZ+cHvX4mY7a9Nxz0srJcnpwdp1FP/Pgvfnh+PimW5c7OtdFwm7Noe7S1nC2apn16eoqIxpgkiZw2jMPWYOhc0usNlmVhtTk5OTs4OgxPahYnwV8P3S/iSI7HY2dtFKOKo9OzYyl5FEljWuQkIwZoT06Pnh8eb+/tqlgtl4usl45Go1E/Pz0/q+uSyzyKJBeoYrnFh03TECNj2lCy6L31ZBlTSRJNp1NrbRon3rpisZyeX+xtbed5nxEAgODcIHrnOGCepDyJMJQSabvGgOCcS5IEnLVOG6Odt57IOx/e2MBdc84xJrwDIUSaYRL3lIoRwuMCSZJorYui8D0JXIQgHgmMpALujDdFXXn02prG0VY64pIvyvlkMQl2WinhPQiG3oNUQrCsKpvAYTTGOudCxUEcx0AyRFOXyzljIiz4l7REEl2sFRlD5FmWhUyB3+AodCy8TVJb8C/DYhde+1B9HoQR9/f3A5QOTJ9QChEgRWdHrbVVVemmXRnadd7dGOOsDSyhOIrm86WS6WJeMVS3bt6dTRdV1dR1u1yUy6IBhkwKIZiDlekNWYkoikNXraIoqqpeO6kv9ACEF3s3bBrRTcfxF5mWlz/cxAFhAAPcQUTGYB08AEDf9WHaWFS7wDJ1ejiMsSsnDDuQpyunuwJfNq+/u5guxb550u6Hl28fEbUxHc1+A2q8EFHoztIdJHw5/BDsynw+F4IJAcV8cXZy2tZVv9+/f//WJ4/OAdBoK5RM4sxayxhvtOm87Y3t7xJUeOV8/ZKL50LAujAhJNSqqgppiCtH6NZ6WtewhFno0ABcMgZXo9cVDXnvO8wUvhs8eFiLH3jnupA+dWD2sl4mILYNTut6glaZ0g1s6ZzznsBzxi7RKhFZ652j0HBBYATEAJgHj55pCIRKDEUPnsh7dOSJwK0qH/0qZRDKWkKuYfVs/43mpcs8AgSpiRWK+un7Pz8+fOJ0eXz80NnqfDk9Pj+1TMa9UW0oz8dp1DOta5qWEyLGi6JVKhps5QBkXVO1ZlE2vVobcmXTWqepdnVda/1pWZaTycTVc+89EHv9TTnc3pssaiaexXmvNh4ASTvGnVTp1jgqm/p8Nu+puCzL8/Pzum4IkXNe17WKwRij0jhwtuxGA9K2bTstig4ZhOIyePHlCvfbaC2lRCaa1i2WZa8/JGSNbq7fuJPn+fHxaRTFdWPn8+X9+69PJ7Nr13Z00zLv0eticuGNXswm04uJdyYSUg5HaZbNqmI8Ht+4dTPJUm9jpGRrcC1lwKz9q5/+Zb/fl2l0dHHetLbW5tHjgy8ePxmN9/sJTSaTvsoH/R5TAP0eatfUdRYr8LScLxaL2WIxL8oZyJhUjEIIgigV1uvPPv+oP0j3b+w1Te2cu379uhhsvXHjdi6F0tp6D0mUpkn21a//vfPTsz/6oz86OjpKorgqW86Lvb295aL5yttvvv76G59+/tmP/vKnSZIBcgB44403l8vlw88ejkejN+4+UIJxBuAJHf+tX/vW+Zen+rw9Pj8b7++bunGo+6P+9Xzfebh9/9be7rU4zUKyZ9Dre1MsFvtlWQbxRA6tYj0AmBelNR5ti06gxZgjcWbqguJMJjFzzjskj7FInObHB9PtbZnEWwBQtbX2TGR527aLpt7GFAgZl3HEyaNzPhaQJXYxm8oEgUzTLq0GUMLYum3rFlXaSwXyuqzAQy/vxyrx3gflTsYYAVrvjHatay1ZVyCLeRRFEEXee+OBK07ex3E0n5tBvtU0TVu4YTpGLSdP5reu73s7jXlkQZfLRSxVLuWyqpkzVhvTamMBmQBUy8rMlo0QTMqIiNq2dY7iOM7SPO+PptNpXbec2aBN1JRGCBHHSts2yWJCT0RRouq60lrv7u4G6+uds42xhe2iCGWx6qEFCAROG9fqqmmNJxwOh3Eca+NavdofVrRQ7aSXImKMewfarDK1oaBRKaXSKLxOxPl0XsRpf1nUH338mVDRt//+d/6v/83/7eJ8VpSmNT5KkqptyJNDWBTNcCsLDSSDhHagZBJRFKl1KvTqMvayrd00it0OHb6hF9y+S5PjNxQMN7nxFwt789a10+OD7XE/Vuzi/PT6/o26qGNMyqLOB8NmUW3dHJT1jMDGiajACyHKZckI8rRXLwqr3e72dl1UWZYFmS9HHpF6w4HWWqBvmsZanySJ1la3Js8y5xw5JEIiQATOgBM5b7zxqLIr9jJswb/sBiGkuAHAIQuBnw7ndat8GL+Ncg8EAKYIEReLIoojLpU1RkWiLOssiZKIV8vq6eNHv/2dr//Wd39dN/X/57/9f3/48AiBZMwb3XrfciY9gVDCWns5V957DI1LV9qQ3dx107RhgC/v4hehvVc+A+FQzhvGWFW3YX1HRq2utWm0aQAzIVcVDQTkvLPWRgTeE/cAoT81ATAp2Cq27NbNOTsnEuPUhSiRQABwRH4VVwj9mdf9HhmQc945LlQ3UWvqyyqu02WF1i8gWudE6rxdnZdz7onQEhEVthRsnTTkGMJ+UkqhgUsOHrW2YQa9t7SuSNpEz+Hklsfek3PeEYT4hBAcmPAOgSFDEVAKIa6ba9vLeQoYZd04sW1XUm9EJAR3zi2Xy+WyLGvd1AVP4mpRFtNZnvY4k6bRPZXlglNV1G0TSc4Vb9raVLWSmUNb1UVZlkKI1jVnk7PhcJgkiRCsbU3TWG1sXXsP0bJRed733v+bP/yLzx/P9vevVyYlNnx2eBRFSZ5FtXHWLquqDiyrMp7Gcdy/ucOIW2srbUSetK3mkUBJjPtW18aKPEPvuNWz2XSZJMnpycWNGzeGw63z83PnXFmWUvIsSxiH8GCAM4AeGcXCXVwcRVEEIhqP0ru393Z29p4+ffb8+fPJWZVGwntbLs9Pjo6q4uL+/fvDfsRZtJxNTw7Peol/497d6/vDk5NHr7123djq8fNnxLmzvmoM4/H5RTk9evbg9Tectz/++fvPD55yZH3j0zotSz8/q6CRs+Pln/6HH0Si/+1v/73KYLX489oM7t2+4+v5+eREcJVRD3gap6N33v36F88OMJIQsYtiIhTl/aiFSHDOnPKKb+9fF1H0e//wd44ODwWg9tRIpbI8Z0xEIknTPI7jzz/7VJvWk2ttC2SVUlEkGYOyri6mk9CEO82y8Xhna3v84I23/vyHP5zMpsvlUilBRj95/FBKee/OHSB28PxoMBpu7e8mvf7t11/rb42zfr9s6jTrcRk58lJGvV4PEZtac+jvX7ve6ubo6OiDjz84ODoG8KOtbSGlVJwLyZio26YsamMcIaO2REQE9M4FP74olk4b78yNGzfG43FZ8qOjw7JaJklyY3vc1EtEZEwwrgBQOk6E6FkSj71rq2ppHRMsFhKdl20rNbNZliku8zTjgLFKAJhu2lVDW62d88gZl1HWy6WUy8pESaSUcOg8WGQIDAUjRKaUUnHEGIuEytLUe0qjuN8fWmsPnjytijoYJ6UU501YF5RSQgkhFOPCODLGeW+9twAscAzzvB+peFUJZn2SJMdHpwDw/PmhEGK5XCrHQ2Yh5BTC4judTqMo6irK/Lqzkfd+MyQbFsQAILz3RVGEEla3IWPcGBvMUohGdBJ4YcnuKBHdcp+mqSfjnENGddVWVXN+fg7Eb968+ezpcUgAEREyFAKMMYytJBFD5jKc629iLf4Tt1eiCgDoJdHs/CTiyMmS84nEcn6huIqFH+xtnZ+fR2k0u3guFIy28kW5qJd+2O8P4mQxm2tfpEpq8oJo2MuttbquskEWxWld19ZqAN82VZamRGiNB09AviiKtm1Ho1FwWwE8oPfeBfd2s76fNrbNe9n81XmH68aYfmP7ReNQVU0URchC9GIV646UjON4Z3s452eRoLfffjtLeydHhx988LHWYIzlXHAuhOArftwvjR3gLyjQf+WHf9utI9nBOhLj10Whbt1C8wWkskYY3Ve6P7F1tfAVls8rr7lDPFe2zTPSRkqoq1CFFzGutdZb5y/rgRHXEQsPLtya45cVoSRYR8ugdQKRMRa84e7a/BqkeJCrJ4Au/4Tg+brb5N8QnAkhkME6ibmKUBZFYZ0zxtS6dcZorZ31GjWCQxRBiVQoIaUEDqGlQp4PlFLOOWt8GJPQCPTg4CCOY84xkKw7vx9x1ZbFGt80zboyHPb396WMlIyttXVdt22DyKIoGgx6g8FgMBgwwsViMZlMnHPgqeMcSKmEkG1V69YyFGEwQ9GZ1KJpKu9tVVW7u9tEJHCVd3DOeu+NMb1eT4pKcCVFrLV+9uz5ZDI7Pj5J09S5lsARhWYF3rm2LOdcxZIJlWZ7N671s/TGjRtZv2+8f/T02aIuG+ucdShV0sviNE3zHjRL49vJ+cVkelrXpZS8aLxD0xv0xrujxZPHT55+MZmf7eyPZYx11VbnRwh89nbx1Xe/OuzvOWN8g0yKfn/vjXvZt742GW5db8lMllOLjkum8tQY41sTcbGzNb518+b2YFRXldi/OWJMREoJIeaT2SeffHBycqYb0zRtWS/SVMVxjIyyfuacm06nJ2fz50fH3nttTVGVMopZJL98/IgAhJJN3cznc2va45OT4XC4tT1+8923P3n4xe3X7skknc5nKs2yvGfJqygRKgaGrnWIVrcWAKqqImiJiMCJOB6Oxv3ZfLGYLctCJbHW1hitYq7SBKWqysYYY5DiOGLA27JFdBLR2LqtFlbXXjdtOc/SdGeYjfux9c45A1ACcABO1DKmGEcgARxSqTwBFxbQNJWx1gCg4DFIrbiIogikEsgEk02jW6PrugViyBmXAjlngocnhUvOlWSSe0/W+bXAWqjnZs5557wh19TatVQ7Y60dD8dPHz0tyzJREXhkKJy1zmpjHDmUCoXkyASRcQySJHPrttfWstC9WrcGkW9vb9+6devs7GwxLy4uLu7du7e9vT0rpm1rtDZRlGRZz1pLFBhtIaoJjCEAC7xoa72SGBz3kCkIUlpxHIcoXKgYho0UeMcPDyikc33CqtoxJTtrJKXUxmltGOehNm8+X964fvvWzduHBxfeG865tm2Qi9ZaC0zCkhcq3GhDXPlvu11Z9X65HbpiJ2gd7e+n/Pnzg9EgE8ByJa/f2efItgZb3/zGr3Iu3//5h+++97YHm/cij+0f//F/iHyEHqXi87JqfKn6/WY2rwHyPAfyVTWzvh6MRoAEyDxZchbJ60bPZgshVJrkiNjPcmvtWnvSE7jLuP0GUICXKI3h1838sYcVStj0ZX+JPWBcMi4Zs0RkWm20VpIj0f7u9rd/9RufffTBfHbe7w+Fkv3h6MatGyd6Ute1MVZxgYihCzcX6m84a93Fd5byPxEubEYpwgHdixt2QlhBLyHIDgGFf7AmaoQaRyY4Y4wJjpzBmmdx5eK78WSXSkqXF7MZ6dn8a/erX1egdFcLLzyEIXtAiJdFj52IExEBWcZYa7TU6xiDEIyx7rzdgxGgEsCqPNLRRqQAPGMMCLqa5L92nOu6RraiUTPGhJBhPAeD0bKYa1Ma0owJA2is994pKWyjiVVRRB6ciAQhIrAoiol8qGW1xiOQMaauWQABYQCdWymUO+ckk0F+TQhhjAuFPG2rQxLBYNs2pqqKYMKHwwGglzKOopSsC3lVY4zgvNfrzabT4MkoGS/90lpyDkZbfSGEkCglZwyUUgCeyGmtAT0yFbhfnLPAAUcQUsRJnGZZ1vDGOV+WlTHm7OwsjqO9vb3hcDgY5ta1h4eHn3w627uxwzkHcoohl/KiLC6K+Xw+d84Aw1LrShumRG3s2Wxyq9/3zB6fHR48eXo+PeUCVCJlRCLyy+osH4psyqdT27r50dkXn3wpGGPlwbIoisnZxXJe3rvz2tZgC33roc23tjLV6ycjBafet7kYqFSpJJZ9yRjrR32ObDjcLuf1l18+OXp+KJ4+/7xtmkjFW1u7RvtZcXYxOaorU9ctMkyyVAgR6Gna2aKuWg0EmPVyoWTZ1G42bZ09O58wxrb3dnXdaO9kpF57843r+9cevPXmrK5Pp9NWa1+VF5NZlJc0vYjilAlFeBEnWa/X84TFyQljPI7jOM1D15ORiltnL+bzw5Pjk9PTO3fuAIBKEiYE44IByjhikQSj4zRmHp02znnF0DtX11VbFno51+X81q0b12/sxypaLGbTaaGEJr9qhuasICYYckTemkZKGSfSWFHVvqpbjiCEiMRKZQg8ETKLvmnawPkH5KGlLDG0RN4ZshRlfSY4SE7OITFA4pwRI/DEhTLatY1unK6w9cYS0cnh8Z07dySX4CBoROq2DZ1syHnnPXecEQAQY6gEE5J5ssa2xbJyzoXaG631aLg1HA7btmaMldVSCO6cJfKDwaCua6VUnufOufl8zhjb3t6ez+e0ll0Ki0MIRAc+fEfnGQ6H/X4/TdOiKJbLZddwyG90SOLrXouw6o6zIkx0FYwrj4UIEY1xxhgknfd6iMwaDwCDwSAgeu+ASWFtLThjKIxxyFy3SnaxhFVrjL/T9jc0PPgLFJkmZ0/3tntff+/tNx/cHfSzfpoopZx22+Pdsqzf++r9b379HQcWuKmbxZNbO3/2+ePDw8Pd8dY4z7fHoySJj7nb3h7sX7sWZ2mk/OODZ/OZiZJkkI4iKc+m1XyqEVFJNujnQqjpdC5khIiBFO/RA4aQz7q51NoQbhoY3CBLbmIFjytg103KLx8QISPGJbCGkAF4FvolM4gU+9Y3vt4sp+9fnH788cdx/N6du6/9V/+Hf/r8v/lXZ2dni0UZNK21NsEDD9yOXzLOV8zYpr++CX3+tls3Alcw4gvB8w3/vrWGNnL2sGYMrEghiMjQI3QMP/UCm/UVFNSr47/enLuUZ7gyWfSCHijgRj1Fd0lhWQ77MPDd22Fa3zGUpdSduFZIq3c37r0PTgvhuswYu5TTqpY3EGs2ZuSXjbNzjsGK7UQMO5xkHRjttCFjPQWHBLx35BDqtm30gvHKAWW9bDDIev2tug0CiNo5z7mQUgIxZ2mjOrGr6HGMofHkjc2jWMagnV0U1bIqF2VhrQ3kRGttU2tERIFc8bJsZtOF1tq2ejI5Xy6XUoo0S5I0vjhfscFWo4qCMxnHQTLOW6vL0hhbA4CKRNNWK6QipRAhfiYBUGsvRMyYco44l9G6zs5aWxQGkbRunDf9Qer82DnHY4UE1pJl2HiaVY3VejpdAGdSyqWxVdsK8g+fPkl++lcopKvmy+Vyupx47nu9JE0igSBjV82LrZ3E8b3hcqmtfXr08ZPjT5VS5sLquvGWvvf9f/+Nr37rd37zd772lfd6eb9enBtHTrd5LFOuYq2yXtobDg7Oj5lgEYsZ4HxSFIvF40cHBwcH4vUHN54/P1wuy0V53jZ+Nj87m5xWVTvqjZVKgXC5KBFRRVmSJP3BuNXWeN9aQ8Bao5mKUHDGRVVVW4M+59zpNkqi4bB/7cb1fDj4+LNPJ/PZydnFoi4BmT/Hoqyv3bqZ9wdpkqeZ4FwCIHLOOJdSNo0BIKWUECpSWb8/3N+7lqTZfD7v9/tJkkRRVNftcll674WMvHVknPfgW2MazbkHQ+CdAEyTOE8Tr9tnDx86bwMeNK50NngVhCCEUFJGgqu2NYVz2lnnHBcsy9MwwUmCzjmrjXPOEDAmrPfIWZrk2vmmbY0xyJiKkyRNpVLaI1OcKw5egIxDo7mg4hdx3tYNQ0VACCxNEmfsbDK/ed2P+qMzcdI0rTNeIkNPcRTZ1mrrPPfIiCMwyVGpsm2sddZaY1vd2pCjjOO4P+hxjicnJ3t7O1LKN9988/nz50fHz+8/eDOO0xDbLIpl2NlaH/4hopQopQp6OG6tQBI6YQ6Hw1BoYIyZzWYryLyOJYTIgdVm0xMK8CLQWkMMwK47GbKV/oH3DhBAyggRJ5MJQ9425uzsoiwrZApDc23nABljPGQWN1kCfwdrARu2Z9P2r5bhv9kXw69CmN/97b//9tv3b1wbl8Xc6fbBa7fLZf2nf/KD+bz42te+dnF+VrfFYjnZ3hv9vW//2lb87p/+yR+nafyNb3z9xvX9s/MjKV2WJd/5zreiJAZsm3Z5MZ83dXvt+s6DBw/YW699+MFHk8msatrlYg6Ay0W5u3/NGk9AIXS5tlKXlomt+1GFi9w0PJuYAABWCtIbpuuVvm+31cYS49aDYoxzheA4krf2+ODAW5Pn+XA4/PzLL65duyaEGI13GOu6b1wWKLpXdfDqNnwxhk8bipN/LY75aze3rvvYhFO4LmS4pKNeFiBQNyy0DgzgBlulexpfBi6blh5eFdShjVbg3Z82sRG8GFHw3jtHDLCL28FaoMp7Kxhf4YBVzmQVYOAIDNARgPPWGwADAMjFi9MNHtAD+nVE6ko3tQ4orG7nr0NpaZoC8mCYPQJjPDSWe/786Oj4rCwnyLS1DjxIoYhTa50x5Lx12tVtY6xVUZTlifctETImglZbqNLy3hGRR884MMaF4MYYIktEjCttjDZOa6un86pui6pqjUZEZ1vmGXlkQbYfXGuawKUwtgVnndcqwjxPhsO0rKZFOWvauq5XZVZJkjDGelmaJAljo1AT7imp65rzlUQsEXUSTMF9YkhKKa31cjlHxDxPjTHn5+dlWRqjz8/51tbWYNjL8zxJEiKyAsW67UcsFQoFxGTa11oXrdaOEZeO2MnJGeEH+/v7o9x58CpVPZ6nWYxkKl2ZBkCYdChv9MY32E7V1F8+ejiZtBg32Zbss7gum8n0/Ad/+f8rmhNDi3/wnd+azaYemBD6+vUtpuTR2YlxrdVljNH0fPr48eOLiwuhZFAeGm/tip++/6P5fIkgd8d7HBMZCaE41thak2RS8chZTgSemNGAoDS11jouBFeCKenIL6tSCJUmSdnUjLE0Tawz0/ms3+/Xun349JmXctFW08UiybPFsp7OZiyOZZJv7+Yyji6mM+fcIB8AY+cX04NnzxaLhbU6z7MsT2IZ37111znz0aefWGuL6ZwNWT/rxVJNp/PlfAZOWNKcMbIEhpyxiok8Ssdbo1hF1tpnz56dnh4X5TLO4tFoBKwO721IHEiplIyZ4EQ4n8+rsomzdDQaJUkSKo6cs86smu0wAsYcY0JKWTY1AUPBExHzWKkoUUkshNB17Tl6BB96qQEYZ63VzliR9rwHxgQXKJkc9Ppta9riXNd6Z2fn8OD5yWIZZcIYk8ZJKPhs6woAlFIYoeCCCZ6wxDkXFhkbWyXjKIo4l5wLAl8slzdv3iaiu3fvjsdjY0xZ61ASprW+cf3m22+/Xdf1j3/8YymUs95ZZ7QVXAIgZwKBNU0jhOj3+7u7u/1+HwDatg39n4JTGPgKdt0/uqMOwNrR6VbVbuUKL9JKl4ZxIQQ5zzl3jp48eapUfHJyJmRpjImTeC1bxD0Zzrm/jCLgy8f8W230Kj/1l+y8+X+3hu7tj37ju792/frYmebs9NmXn38+m07nk/LDDz9ZLqob1+9JlUaJampvDb99+87J1gGP1NnsAhjtXtva2e997b030yz69NNPVRQt5ifOFowaY2hvPPrt736H6to29XxZTibTo8OzutGMQxpHk2YOABBqdwmRkScEWKk8wUsx9k184DcogR4wxCE20cMv2by1VkgIzqLXpnGKt+RhMavf/+lP4li99dZbjOPx6ckXD7+cTCanp6dVVeFa54dz7xwF/sorj9/NyGZQYdOO/s3m9pfN48sH6aAVvFg9CwDIGBB1LNmOyspWbaUvv9VRH37RSa/MRTgFw8tvdZE52CDPdsAijIPWWjDeAUEiH77ctrXkIrizgkFX89yFEDZfFh/U2ABg/Rp2V+W6MluOV6//b1O56r2HNfdlM6JgHBHjQkacMwDtHDHOAanVGpDJKJPAtHWNNvOiMN5xrkL8I3ydc+69JQKtDdGqZS6GejZgACCELIoSsQotcIP2UYfkQoAzXEyaxlEsvSXnDCIIBSlT1lKcYhTDxeSwaeeA2OpSm0bKSMqoLGsVqTRT/d5wsVi0bRvH6vTUIGKWpcYYXFODuxnnPMRNjbWac25s68kH9ca2DbQPRJBSRECmaZq2qViSKBV7BONQV9oYoy04FK1upEgYKEAPUC5m8/PTM4kJYyCjhDFgghNY9EiCrLeAlkWgFAMpRjt53K+2trZ2B9tpmmUqLWfV+z/94E//4q8I7Y3b127euAMkZMxm00Wz1EdHR1XTCCXBpueTi9nZfDKZa2viOE6zTEop6rpSSmRZHqVRU9u6KZfL5WRa7+1kSiVZOlDSWuOt9bOittZCwmQsuJJxksQZ1+2KUSIjNZ8VcRxzKaaLWVMV169f90A/++gD76hpddrLVZrFBHtJily2Rp9fTI9Pzk9PT72l0WikuFgulxdHF+fnp2W5zHtpfzSQkjtnCP1WfzCfz5vGmKoBlTJPrtHFYplCTzsdSRWRRCJwXiqR5kks0+VyvljMy3JZlLPy/8/bn/XKkW1pgtiet40+u5+ZQ5DBYEQwGHHne3O4U2ZWd1WjWtUtQRAEAQ3oWX9FkKCGAL0J0IOeVCmpurI6K6tQyrxj3iFuzBGceXjm47O5jXvWg7k7nWTEzcxCZm0QxDl+3M23mW1b+1trfetbZemm4PzyIuRk7RkAvHzyHQCcc+MsY4xSrNSSEA4hxKrO7QGEUF3vV6fgSpFTRlnoe35AfA4QscBpZxnnCGMH3VLbxJiyyouiQA5QyqtSIoCMAcoYhv00TaEUw8vxG7dudjud+WzSbDZlJQhHWZZVRV5VChHqrIbOQggphiwIlwUL1joHOOcIEmutUrIoCqnEeDzM8zIMw06ntbu7+/Nf/rYuWN3d3b19+/bbb79d695fXl7OZrMkSYwxVVWhVUnk2osCANTwqBZKWouRoZX2SE1lWBcWP9+KVmHVVRL0RaqdhSsRY2gNuLy87Pf7x0fn1lWEMIxpKRRGlDFSVAphwhhaH9htfMff34Stbd+XuoBf5Sm9ChHqE0nT+Wh60RtEYejdufuOEOK3v/rdw3vPIGAYBb/+9cevv3ErioJpMh5N86OjMWRRZ7t3Pr344um9ymatpn/96v7h8cUXX3x2/fr1Ip/NJkOHcL/d3+61W5H/4PCpz9m3v/mtvKj++q9/enh0Uo2mo9HIOQgxAg6CF8sBrP0S3xdsAIVNlABWHvY6Q7/xl68YmCLCnBRSSmC076PXX7vebTUuz09/85tf/fH3/6g/6CGEPr93//Dw8OzsLElsLTTknAOgJtM583eRGcEruG09rTWM+H2H+L0H34RQbhXheJXMuP6KzR+eA4XVD25DGPsloOBeHGCFftZPBHyxCcjmzVp/5OWIgjVooxRl/dWgLtZwTilFEKhlpJ1zDmLjLDQOquc5KQCAKyqw0oRYR9ettQ6uZdE3LtRKmOv3rowXRlmWywTZqjtMTYfUxiFICPcoJtYJACzGCEFIKYQAUsoxocoaaaS1oBTCowRjDAACDgFQAykIAKh7L9VzRgBZA5yFCCGpdVFVmFLjXCXlOlIklaKUMkoJpdYZiBBmhPlcZIUDum6AZWylTamNcYBDpNvdgBJPSSeFiSIPADSbTUejLE2TvJkuFlmNsWrz22634SqAWhtP4BBCyFiplbZON5phnXELw+D69euMsYuLi6Ojo3SRGw1arRbn3ONhkaSGWAO1dVBrYwAEAGDMqqKwFgaBX5a51jLivjH64uS007nheQxAJJQhBPlBEEYeZW40ukAYaidni/F4Nk7zQiiQnp7PkrTb6uzvXu3ubu8tiidPPr739Nn7H37W7u034qay7OnhxSxZzLMUIGitPX3ymXXO87xBty+Uqnk5WhvyvT/8rjHOKJdn8iwfWwiiKMIoaLY6UdgghFWlUdJVlZRSEsIgssbYJF2kRen7oQWIcx63mnlVamPqQtL5IuGMxM0GZSzLC8YY870ojguplLHc9y9Hw7KS0+kn4/EkyzJgIcaYYYYxLqap53nNZqyEPnn6LC8zz2ftdtPZViNq9ru8EuLwydPRaGQt8DyvKgooLQkxhggZqKVxGFDMLi6GZZkLWVpgCOPUaq2VgahINSGQMEoIgNAqp5TSSoMo4ls721euXKEeHw0nw+ElACBuNoixhBBKGSc16wcSwhAhXhAaBy1wyhojBGKAUMowZoQ67IwxTjtjgHG2psxQVPMHnXPOVFqW0mo3mUx9pBBCd995u9loN8JGq9keyyFcZZEBAIxgzjnnnDDKuVdoI6WUsrLW1gJKRjspZbPZLopKCHGRXwAAHj161Gq1JpPJdDoFANy5c+fWrVtCiKOjo3a7/YMf/OCXv/xlvY7zPK9DBbVRaDSatYVaLBZpmq7F+6IoqvVGloGBVT89sNGuaW3CrLU1OdlauyRjrwyfUgoiA1Y9oqpK7uzsXJxP0qxizKvp2cyjlHAAcgghobQmb66TDs45Y5as7H/ocC+mHn7/O1/6SP3/PHV/+R/+8oMPO4N++8c//NG11268/9uPo7h5cjw62N/+6OMv5vNqMp+kxfzKlYNWt3X9zZvd3a29Yh40ImGl0KgQxa9/+7dbg97bd25LJT79/DPgwMHediMOj549pQTFjXBnZ+vp0+OTk6PpdM4ZbcbhZJYAh+vW4RA+7za0Bgpo1b+gnvZL+GA97EpK6EV31qGvcI4BpohgAKA1gFN8ZX//xz/80Z23b//lv/s3f/k//+Q73xYlxh73P/3009lsnuYAQkBpTfrRzhlKOGPUWPBVHIXfc4/+UcZ6+a1Xpt2oeliTGes3Qwi1ex5lQbBuYeVq5SELHNhQuwIWQozwV4CYzZW2eSNEJTZRy0txnTWGeD6H1Vh9xNbOMufcmeWJaGfWAXBtn3/jZq5kzWWpET9aCUNBvAoBQmRXYlC1YsRmO6i/c6xYEdQY4yCs3Y8sy05OThfpjGAdBkBrBZyxBBFMOSPaLJ0xShmihDKOEKgjmhAuKdWY1PAXc76kPdV3rWZzI4RKJaTUGNMwZFLKdQu6+vQxQQ481+1mjCFonTPGCq1UWabaCO4DTEyj6fk88LxoPkuTeR7FnlZAqgo6U+vQJEnSbDa73X4QepTwPE8hxIwxjIlzzhoAocUYC5kXRYEQihs+BGg2W2CMB4PBYrHweNBstAn2KKWEeGUpsyzzOLbaVLqUymptEaaEM0KI1hYCzBhPkpmoqiBkUlRnJ6ff+O67HqdCllIbokFMvDCk3IPHx4eNpu97cSlzwnAv6mitLobpeJYZxxCeYhg12tu7BxfZrPzlrz9Sir/91t3jk/Hjx+dJuoCUYUYXSVbmldJaCGUhWKSpdIZ53AJArvV/eO/evUVS9Ptb4b6tZl+U06OQgVarm2dKSmEtMAZLiw1k1kKoGYSQYk9rW6XG8ygnTCa5UQopBZmoVMmg8zG4fnV7NjmfZ6Pt7V1UGVHlyEFqNapEYMHhZ5+XhagqhSEhBDsFsmIhhOm1A46BrnKrYDOO7rzx2sHBXrvZfP3GzdlshgGeTha/nP5qkVwa46wrFXMIEucWxhhCsB/7BtuL7IL6lHPuo1BrPZlM8yJ1DkVRI9MFx5xaqgsrpSQkaDab/Wb89ttvQ2SEqMbDWZGrIGgAYLVUiBNrnbEyl5m1mhCCSUS9BmFeVdnxcJ4VZa/fbXd96CywFnmtKAilKocX52kyIxj4CGCfckoDpkhop9OpsdYxl8jU79Cm4cls9G/+/F+/++67+7s75+fnk9F4b29vOBwfHBzMFwnzWXerI43WWknnKIqCVnB1/+pkPi8LASEcDsdlKcajw0WWCyH2964AgJ4ePorjRrfbvXrj+ptvvNHv9w8PDz/44AOl1Lt33/v6179+/fr1wPdHw6GzljGmpMEIKaUIwsYYo7QEAgCwbqs6LkZ1VFNpWauR1ECBMbZp8mq2Y40bIIRhGDrnhBA1caGqKg9XCKG8KsbDiee3PK8DUOAQ1UAoUzldIgqM1UVWckSAAco5ABDBfNXlziHoMFq7Vs/NKwD6S12g9Ta/BivrF9e749rSwxc/tfQLwXPRx6oEv/7bJ4F/8vqNa4x8fvXK/te//cev3Zr+u3/3lyeTR/1r/VFxnqmqv39FIO/x8XQhHiTJrBL5+dn4xvUr0e3XCO/8D//7/0M2n956/c3PP3nUiVplXl3Z2oqhe/jBBxVkP/qTP/vFb373yWf3j8Yz5oXDScJ7OzBqAefKqkLa+B5HxjrlAs4yUEIIEQaEIAidNW7FRSWrXQc6V8996USubp/dcEzXZXub1DwIAABCYt8DWhFqGjFvxHj3oPXaa/0/+oP3fv2Lnzy69xkjvpJ29HQehEELuznQzgLrbD0BY5WxygHkgHHuedweQrrcCOEL++LmZrl5I9avrG/Zq297KXIAlnjoBbY/2MgLeN4SmNbR45qZyyGFaLk2Ng9Yl/gaY4wF1gKEEIOUQgowW5MwIES15LE1FiFitFFKrkiLCDhnjDWw3lcstMsYwypI76xRAIDl9VDaAQAhNAgoa2pXCiAIHJJK19seqq/HCrhbgKWGhNbdy5y1DkKLMXQAYFB3q4QYYeuQ0q4u4wAAcLqMVSyPuYKb1tq18Ha996NlieyqY/iLdwesajoopZWSNR17Op2eTx8h6ALspYWr8pxRjBHVwBkpfU59HyOCAKRCCGxRHMalLWGtAAaBdtpKAzFEDCllMMbG2UqKeqoGGKOMqXzsgmRStNvtXmtvPp8LUXLOCaTAYFk4ABx0xCMeAVwWBiEAICOEFeWCh41sctzfOej0qTb5oB/t7LQePVwcHj9UZh6Hg0IsfK9dVZWR1c7BXrMZa62CBq/KkhGYpwtMWr7fAg6HXhyGUVkI7lyDxIRyY1xeFnHUQZj/8lfvR1F0//7DwWAQxc08z01eFkURBYHCkXMOAIsZYgGCEBqjpKoQNAiDskijMETQFXmOMQMOgww2o06lCj3XRsOFyhZQtTvRoLlTyXK+yHXFqelUC+2gv93sjqa5lSxN4f1yaDTs3HgzluDhxXT4/kcfnYzyRTWbLDrtduRHo8thMS3mecE5J5gk83mSZdeu3zg4OMjykjx9+rgoMsYJY4RS1Om0hvFoPJ4nyVRrBwBg1CMEQ0jKUimloEYYEwwRQsAZV6fSIXJVUShR5nnqe2Q2nw5uve574c9/8dNG2MAAckIhxFJojzLPC6q8Otjde/L4UFU2DAFyIMvyIAhev7E3mw4RApTS/qD35u2bX/vauzevv9ZoRqPRqNPpBUFQZmWj0bp9+82HDx9+9MHHYeRzzhCoO7gYIYQEQAo1GDRajUYcxx4PCCFlURwfHx89O4nCRlmWUkrfD65evbq/v7+1tRWG4SeffJQX6WQyXKRzjF2z1YjjkFIqhXIOA4AcMNroSiipAC8BgFJpiAAc9HpRGEohIurv7u3klZ9OFufnp8PRmawqxhGnGADDIk/lUAoUkAbzvTwv0iIFjgECLs6Hvu8HfrSztZsk6RTPW53et7/1nfkimaVpr7/dbLbH0ymAjjHPamyMyfN8MZuXZen7ISfUb/LTLPcIVgIm82lVybIQO1vBztbW//p/9d9DCI+Ojh4+vH///n2lVJHlTx4/un79ep4XdViCMYax8X0fOJTn+fI5NAYhVON6sGIvghc9pE1PaB0CqW1rrQi59thqc0kImY/GrVbD9/1WqzWdTquqStO0DofWBzQrzek60ogYf3nnf3G85I39Ew23iiQ3WrHVylg7X6SPHz8t8vxgb/drX/vG2enlr3/92zwvIaIOoTTPIChLqdLHc8YJQuD8bHR2fPTs6ZOq+MPI/9ZgsJdl8uj4bDLNuu12s9G5HE1/+rNfSoi3d3dns9kvfvkzbeC112602t3Do2Pf9wmhPmOUEeisMsBanRUK+WR9eRFCdfyTELKONIAN0PP3jKZsDhaGSimAsbVaCn3//pO//Mu/fOfNW/1+/7333nn08InHwsuL8cGVrSyvLiYJ8Og/9MK+NJ/N+M3vvx1/n7EOJAAA6uK9WgF9M/wOVr3QnHPrTkh2BRDredRbqwWg3vYhhK7+92U8D7ihVLGe8MtpoNUPsFbHhkuE8NIJLj+xyWAw6wzgczzkVr1I7IvICWy41+hFzaXNK4NWneKX8RLwD4jY1V/kVrwKuGwjx51zQRBcPbgmpUTAaimAsZQgSjgCoNKGEMKYRxhDiDgLrbVlWZWirKs6OeGILkNBiEAhhHVGW2sBBMs6MAwRRAiEob/2TKIo8DzmnDu/OPN9P45j3+eUerWGN8bYiCIIAmuNFYoxfrB7cHX/KvfsaFJwz0eYWgcRJdLqSTJbFFlrsG2tJQQRgmqqRy0B53kedAhBkue5s0hVSimFMQmCYDabIWyZx+veqQBhtVjcv3+/quR8PqeYOOcCL4jjOPC8ySJ1zkHkIMYQ1Zx+QjGE1ghRqVIBaDHAPvMJIQyzIPQZIwDa4WQsTxeNpu9xNBrDwfbAOYCgxyh2zsPEAIQRJXkRSCnTuQFIWIMC3+csiBv9NC3GdCHzqhQyXeRlVgohWt3OJBnPk5xX2vPCa1e3rly56nF/PJmTR4/vY0zDIJonYwgoJi6K/TzPtVYOWAgwJrauxDEWIow0QhgjiglCSFmplJAIIAyKoizSVMi83+toZW7cuBFFjWeHx81m21pLKYcAi0oFQRBFjXSRn54ettttjMlkkvoevHJlvyiKDz982OuAK1eu3L179+7dOzduXu80G0qp0XBCCAuDgBCilX3zzpt379798MMPy7L4+OETzwtq4qjn+UEQesw3xjQanf29fd/3x+PxfD4nCIdBs90ujdONVjOKona7W4sLnV2cJ0lyfPysKLK8SDFGvV6n0WxxzowxGCMEAYTAAeqAVUqWogROi8pi5BPKOPfCwEOIAWCqdF4MZ+cnJ8+ePcvzNIiCsBlzSAEiOlcOAuoY9+Nms52QFDsehqFIxkJajO1ske/s7EFAjYZ5Jra298pKD/q779x59+DqlVIKhHGl5H/6939T1+QUeaak5pQh6AjG21t9KTQZjxHCzW7rrVv9b33rW9euXSPYVVWZpYkUJWeIUWatTpLZ734345wvFolaUTWttYQ8V4AGS3XFZX/qTeL62plbR01fBQrj8VhK2Ww2u92uXckwG2PC0K8RQN3ptdVq3bt3L0mSrKiWFmdV9AX+rt1ic/xToIRNq72eSVVVZakQAEqez8aTRjP+4z/8gzt33/3a17/90cf3ZvOk3W6WwgohLEDWWj8ICUTOGQhEXtknT89E9Teff/bgxz/8/sH+LoRBGPWSTByfjRlj7fb2Qmfj8fj1Wzfv3HlrOJ4cHT7e2zu4drB1enquBYBeqBRQlSCE+NyzVjuM63hsHcjBiNZAQSmzmvbLbMFXr9jvuc51dIkQoitBCMkX+oPfffrk8WGv1fzud797cT7MFnl/0P1X/4v/fjyZ/et//ecT/Y9zI37PlL4KGroXcxabb1uv1XrDWHPl1nmE+oc1JfDVyaz3XbhihNT+95dGsdaR8zUsqINtxhiAV1Lfm1wH6OCLca+N0Ih1ztmNr0CrjEB9+CWOX83QrlqxrxOC9QHrmPz6sOuxPn0I0XqqEGzwgVZlNkuQgVYdx1fDvXgo5xzCS00qjPE777xnpCIEW6Pmk3G+SMo8WyzmRSYUtUZDz/McwhgTVhMVCWKMUM6cc6CCZVkKJZxwGGNlrDYaQAAAchA4awGCnDLGmLVWiLIuDVVSZnlKECYIo7q7iHUOWAOlsxqUFQtCoZWqBAhorzNohK1Sza1Bk1l6dHZ5/96TSZaGAbPa4pAqJQCwnheEYYgxri8nJayqJCXMGltVFaN+fYUHg4EqkvF4LLKMKCm1arRamNK6XiwIgjRNA8/nnCdJEgQBxThuhGvLidaC385SyqWUdU6QUQYYs9YqZT6/99ndO29v7Wxfv3792dFDhDAmtBJiNs0gwdbBSpisFEJqBzFCGIGOKBZGO4iJ0U4LE0cYI26UFCWwFmHKtQNFlnmMbe/uSK1OT09ns9l8nrJ5mqWlg2g0HpPxeMiYl+f5cDisKp1nQlQ6CHlVSYSAtcbY0khgjCEUcI9qyOqMmZJGS6iU0hjX56m1thaUhWi1W7dvv5VlRRBEnhcuFgtGuHMOAdSImkEQUExCPxgOx2VRtZsBhHh4eQ4Auna18y//xY8ODg5u3LjR7XYBAEVR1CV5EEJtTF4URVY2Gg0/4lEzaHUb5NAZW4pKFYXEiC4WC049re3Rs7MqE+12ezgcjsdjRqnneRCi1994HSFkjMuy7PzhZe1VY4y1BdoBgIgX+K1ur9XpWavTNA25V2vhEUQR4QAKFvQa9gABAABJREFUmYuylEoCn9kiT0VeUGC7vcZscv7p+yd4pheLRZYKgEHouY7XYBQKLbV0AQHOoSxLZJFbaz2CIophENy4cRMAcHJ82my0HEReEI6ns+F4NJnPuO9NpgvELrv9XqPdnh8dNdsNCGEzbg0GAwAAxng8mkgpO82Gcy70eRAE24Ot7e3dvb09o+W9Tz8OgqAZ8rtv3cbOPDs+kSKnBJVl6fvbzWaslKnzBbVFqPfvdSZ7vYifG5ENjv36nZtAoTbBzWZzNpvV0vq1bmPN0I7ieDQaeZ5XMyiVUrPZLE3z56zClVJ8bezUVyOAL90wvgox/P0xx6sHhxtRa+sgIcgY6wDKSyXl7OT4/OnjEylMVSqtgQXIWCuNJphBDIy2hSgRcEEQNZttY9Q8yUfDew/uP/32d77ZiuO7X/tuksy6/f3t7e1vfucPf/vhL3/5tz/XVr11+3X6hAwvzpXMoIP9bsMYgzFVSgmrnYPKyKIoAhJvIra6+PHvPLWXUMLv+YApS8RI3YbAOdhue0ZX/+bf/Ls/+cEfYUQJIZeX2Q9/+Pabb72+SPN/+xf/BmR/Xy7CS9d5c/yDUMJLmPJV9FDvynCzOfSqhfSaEv98V6yPAwGAANYuQh1shwAgCFDd9BEBBCFGAEGrzMvf9eL86xeXZAKta5dmfZpLwAGfQ7rl87W+Du7lC7LspmUt3AAK62OZVRPtNZcIPS+tfKEUdgVElgmdlzDEc4jwoibHV92XGmPZJW3T1pHmqqoefvHYGNVqNluNkBEOwpgg5IyNo6iWbMnz3FoACfa4bwiRWkAMiMOEEC/0MMO+8S1wSZJoreWKoemcM1YBAKjVzkCMEMXYAKC1EmUhirLTaSGEgLGizHUtcYs8SjAAhgIjjY4op4AijWeTbJqO5tlCGJNki1xIxMi8WADH+vv99CKhlDJOwjAEABDCKDU+C8bjcbvZcQ465yjDCAEIXRQFfivM83w6S/KqtMD1+/242cqLwvd95+Djx4/jMGo2m6PLUW0VQ68B8DoytIxCWeMwxoxwyFGthaqUEqUQsjo5Obl+/eqNm9cRcmWZT6aXqHLGQiERdcw6ICtXlVYZhhCxiDjpy1xCjD3iOWCK0hqjCHGERn4QA2cUqxBwxipIEGI4CLx2u+mcW2TZfL4YDqeUMc45MWYZt9TKTiaTy4sJADAKG1pb5yDCCMA6M2coxZ5PAQ201loqB4yxWmlJEDLGBEEgy9JHXJRFu30VQfz+b38Xx02ljVaGYOqcpZSHYegsrPd+Y5RUDoDSOed53ne+870f//jHN69teZ5Xy+/kea6NC4IgjuOyLAmhACCMMYDuyeHjjz758Pj06OBqT2uzmKdKSyVVJXJZCSltllbIwWazOZ/PZ7PZoN+/c+ftr33tax98+jspZZIkl5eX6SKPovjGjRsHBwfHx8eXlxcnJydCloskXTUXsBJYqYUDivncCzzucaGKqirbrabPg3yRLqajR/e+OOcYgApCsx861m1IbQpZAeYCnGXFbDZfxO1Ot7PfbHWOT88uLi4Y5ZSQ8WTSbu/xLa61nozGJycniJL9/X0p5YPHD8qy5L63yLP54+Tw9DiO4y/u3dvb2UcIRa24gZoIIWBAWVUwB37gxUHUaEa+7zei2Lrqi3sfPXjwIGrE7XZ7e3e30463Bp3jo8PZfOGMNg4g6DzPo9RIqaVWCGNQZwc37PXafOCNLnmbTs/amqzM7HPGOOe8blFdizXleW6tDbY61rp2u11jiHv37qVpihCIm63akkqlN/08t/JfwFcAgi+FC/8o49UjQwgBIIxTo7QFlhKMMD4+Gf6H//gTCOHlcEo4y/IiKwtCGKAOAlRncBCG0liZllpLjLDnN6bz+aefPrp16/U7b7/Z6g6Qz0azBBD69W9+bTqf3Lh5PQzDJ08fXNnf6nYaZ2cXlxeXQRB43DcOMF53PFdZnvIosCsxK7jK8oAlNaG+NS8gg0039/eb/uXAGGOsqooxlqalpqDbiX/20w/ffetO4HNK6bVr/Vu3bhZF/ujxfSEKAP5hqQfwZcDlP+PWrPezzaXiVuwM8GLZwrrow666/61rQDbJDptTWm+oL+2sm1d+E7FtHmH9p03eIlxVqSCEEHRSyk0/3rolItfOwLqpzLq2aIUP1k3XlmjjxbqMGiuADTrn84OvyIwQQgTR5sfRRuHM+omuL8vzFwFYWwnnnFvpedTvsNZaB9YBlfF4nC3SS3IWhR7BkBPse5RTLKWC1kBrnNUQwYD7UTP0fX90dF6VKM8YRMs2HEIrY4zneVprJWU9Q21MnVxDWkgpPM+rmwDkee6cYYwYY6zT0NZVHogxEgSe53laZxBYBOBWfwAQLEt5/OwiLaeTxdjzw929Kzv71yazxSefPJhNk7jZ4Jz4fsA501pLqZWqa7I8Sn3GPABgvWyKIpOy4h7uRI0ag6ZpSjmre94GQSCE8LyAc66UCsOw80YHQjibTBaLRc0DJQTXNhYaiKBFGEAYICSrqioKIURZy9KcnF2+/8EnWltCkHUYQY9yrxkEl5cjypADuBTQGs/jIfcCQuhiaimxhFKf+86VSlRKWaWk73vc9yB0FmgKgQNcqmoyH7351mvGXFfGlaU4P7948vhwsci4FxDPC9qtTqfTM8YBR9JFlczT1Oa10K/neYzVGji6DtlJB+vrpbWydlkgp5SKgjCKIsbYWGlK+P37D3/3uw+3twfWAqsdAlhr4zHOCB+NRoskefr4iDHUavhxHF+/fv299957++07/X5fl5NsUUIICeOe5xnttFTT6XTJp3UOMyJldXx+dHp5AinY3mspZXwfYgJEaRFiVqGykEKIZDFvtZs/+vEPr169apS8uDz7yU//k0ZWSl1UBeO8vxW2Wu1mu4UJu/3m261Om3J+eXlhnVmkBYROSlm4ShlpofOEjCyglDrIKYFh0PSYF3tRxNjZs4dHJ4uvf+3av/pv//m3e5hxP6uqJycnXzx99uT0LJ1ejscOMej59Lvf++Z7Qj18+BAAkCTJr3/1q/FsUhQFBhAAkGSzRhS3220AwMXoLG5Gt26/8e3vfVtIeXx2mqQLY9Xx8BwAkMoSIeRR5nkeoLDZbbXb7UYULeaJlLKShXPOQeMF7OmT+yeUj4bnOzs70OlOK4LQcS84Pj6dx7G1AKxUDq0zSkirlhV0ayu2NoUvJ1k3xtrWrI3saDQCAARBgBDinLfb7TpDvNUKq6qqj1k/P4SQslTr+Hn9LXXUFCH0+/exvz9c+PtsP1965JdGVUnKiJIKAmAlYBQ8O744Ox0FgZcL3fbCshTOQcoYQBAhSACyFtQSUrUeHCEEQLy1e4A5I15QCPn5F18IUXa77T/eGjCf7O/v9vtdTpkUBUWmSKetmHfar8VxczJdHJ2eOQARAtrZuBXbF3PkdlU3jxBZnQV66Zb9gxAV4VRJCZxrNlvT0ag0wPeiyk+fPTt649brr712860337hy5cpsNvvrv/6P6h/eheOlWcEXI/C/5/3gK1DCl57mJv+/Lp+rQ/FuVVa6driXShXweVCh/tU4CyGEGGG0qjFB0D7v6/iC2CV4Zb3BVcHh8z+tQgU1otBaA2fWUAPaZaBCIwAhdPi5lELdOB4hBFfzh6tcwxqdvIRaXrqAbhUatNYiDDfH5tvgZlxh85jweaGNtbau19VaU7SsPK9RTq0B3+u2IbDAaAidEJWujFIEQ7OYzxljmCKKnUMYIu1MpYTZ6feNtha49T0qpVrKt0ttKu0QAhgtOU+Y4TpYYh10gBBIMOSMcUbyPMeYULosGeOcIwiMrhvmCOdMo9XMimqRJcIU2glr8GS8kEb3Bv39nV1RmXtfPJwn473uvscDSvFsNsuyQivr+yEAqNloUcrWCAwAoLWazaanT58BACqhjDEexkmSCLVUnIvjeG9v7/z0rCiKW3dvaa2HFxcQOAgcggAtFbiXGh6McIcdsLDQpSil1g5Dhigdj8eiejAeJdevHnS73cBvSllBiLQmAGIDgJQIIEpIRFkIHGxGCCEEQF3sYRBChGALjIPaAIOQIxxyxgBROi2FLTTMKi2SeVpVWulSqnw0PncWEgRpFLUacacsRRy3drb3MJrO53PggFBSK+Ms8AOPc58QRAgRUisllJIQYkqpMcv1pJTy/cDzOAR9QtgXX9wHANS1p/WjaowLAh9COBwOx6NpsxkihF5//fUf/OAHt2+/VZfbSSlasZ9mRS0PggHGmBJCEKFFUThnpNE+4BZaoSoLTKMVUi4xQUriWDCMlZYgL8u8KPr9zt2333vnnXcghL/73a8Pnz6OovD69esaQQiFEAIAVU87z0oI5s1mkxLe6XSMMXmeGaO0NkprKSRAEBJXlVqbDFFCMEfEMxZKqQOMW1GsO+2Y67u3X/+T7//xbnpkHVQQNxotIe2Tw9N84RAEZSEfPzp6481Zu9sjLGw2m424+9GHn09m49lsFgTBa9euBb539fp+GIbT6XSRz+JGA2DLPLq1v9Xb7Y3G41LkF/NUa62gyReJ1rrTajXjxv7+vkeZ1SaXRVmWoedHUdAJWoiBZHzpEKzKdHgBMGXtZhNCmBWV5zFCsagkgIB7AaYMIVQUhXFLWtzaEamtBlp1o16TFeonBG2U1a3NLsa41WrVxnc2mymlOp3OtWvX2u22yWZVVU0mk729vSiK4jhWShWFqtHD2qZvujWbnuKX7hn/eVvg32e8ZPSdc5gQSjmwUGtNuAcBNFJY6GRaMOIBhEspGOeMk7woOOdJNpVSAoBCP4qiCDWWaeO8qISUSbp4cqQ++ewzP+BRMwqakdaZQ/Dxk0fddutPf/RDo+XTp08PDg6+/vVv+kH01z/5+b/9i/95kmRSVQ7i7Z296TQxq4Zea+NurYWrHMRaf2J9y17FeX/HMAYzZoxjlDil87zsdrZ++9vfXb929Y033tBaz+fT4+Ojk9ML+591+V8Fna+++Hs+tT61L18hL+IAQgjn3Pf9IAjWWbZ1OGFzMa83TrhKsdUO36sLfnN7Xkd3Ni/1GnNTSpV9fv2fo7qN1MPy9q3ZPxA55/SGsuSqszQELybFNk/8eaxiRcXAqyZPLy0G+1wrenN8JUehDtE4t2Y2QACWwQ+6jl7opZo753w6GqZpQjGiOCDIIeh8jikhreau73OMcV4WaZoKXcyTzDlX5MuyqajZ6HS6vu9ThAsHM6mRBlYoiDEhDFroEGIIE4wgxA6YeTLFGFOKOada63a7WUMNQggmCEJYZ0MA0JAh6BzmTKelcdgYjJlHgFrMs9Hocng5euPN269duQo1ePj4sdYSBYG1Nk0XWVZ6PCKYWeM8LxBlRQhhnBhjfN/jnCMMnHO+73t+2NsaBFFYVVVeVp1Op157u7u7abKYz+drHrcfBdbaNUusvqQQIEocIcT3Ahs7Sphd1fTyZuR5zBqwSOXWIFSmOHr2dD6fv/7GLYyp1ABjCRALghhAXCkdUOv5yBiXF6VUOaIEU2K1NtYm2YQg6PmUB0gZhz3c7rUabagnVZKdFbmMo85rN/e6vTYlPilyKYVOknQ8nqSL3POiRmwWSeoALMuiqqo8L1utRhzHwGPOaeuWVF6MIfGYcw5aiBAqy9Jvtiil29u7nsdOT44ODq4OhxdOO4wxcsBpwzCB1i1m8zRJDg4OfvzjH3/jG99ACDmjojiEEM5ms2mVIURCP6Dc08qUeW4BYoz5vg8QYkYGAdNOI4SybDGbT4RTjPoI0VY76HYDgkJR2EVSvvnmO6Ko3n//NyenR5eXl0apVrtRlFlzsOV5XtxoRHFTSg0BMs4qo49OTo1RaZpleZ7lGYSQEMS4r42klCIKlJFpXgCEwxCFnmctqISsZMmRbTWbBzutbrM9ubh4/9//W2NBe7AdD7ZkadOkrEoQNT0Ew9/85pPpQkVR4/jk5N13373x2mvKUObRuBE2m82Dgz1K8d1372itR+PLqiqDKHjy5HEli9tvv/XWnbcPruydnB55vUFdTZDm2Wg2KarSOLfjtitl8zQdzUYYojD0pdHJ+fnDR/et1XEYe55nnMYWt9oNRLAy4+UTaIyzjlrrnFXKpHke8ah+2ldd0cza0LhVqnXTeq5N1dqqrnOivV5vf3+fUjqdTqWUo9Ho+Pj45t6g0+lkWba9vV13tDLGxLFHuQ+WCgGgLnmoNZ0Aoa/uAV/qcf6jo4RXDw4hNNpobBAhHBMEsagqA2zIAmsNIlAKXUnp+b6xNk1TA2yjGUkplTTaqvliBiysWfeY0qdHzybJqNtqzpI5os2f//Lnn37+6X/1428MBn0A7CeffLKz1XdWi6rY2R5oKcJej3vEOk0oIpAwL7h27dp8/sl6vwEAoNVdsM/59i/km/+hl8s5hxkLPD6dTmKfRVFwfjmXMaHINpvNGzde+z//n/6Pt27dLIqs14uyLMtm//kX+SWP9u85vZd+fQlnrPmJ9Sv17uX7vu/7lNI1SlgDBV0v6VeqHqxzoEYSa0ywsSrqsbmzbvJ7ao+/no8Rcr03r+8RBJYQUqtmrs7Erue/3M9XEuloJa1Y10msT9yuu1G8mEdY/wm8CMLW81xu+Rthht9z6VcY022+tDyLDe3UdbVUp9vWRkhRFkVmtWAUNiIehoEf0DiOPY+XoirLhqkbXWKkKliWpVKGcx7HsQMwSZJc5dABZ6zTxgEMMagb7XiYGS0451LKNE0559vbgzAMhRAOmNWUVkJktVIyoY1WXJWGcGYh4L5HOUHUzE5G/Z1Wg0Zllc5G42bc2tvZLbL86f0zjLHHo9rucc4ppXW4vSwFIco5TxsZ+T73aJ1WYIwBiBvtFvP4/YcPSyF3dncRQuPxNIqibrd7cXHx+PHj2jWaT6brO7UCsh6lyCjFKQ2CIPR9a4DWOsuyLMuMlc1GLy8Wk/Gi3ZgB4NJFWeQyzwQhTmqbC4WJA6i0FiyyAjc86ByAVptSG0EJsE5IWTrs9KQgFG6xjnO8khVCoN1t7R+0ghDPk7ExmnEIAbPGBbxBktHkyNh+f0tUWpVSSZvMFgjQ8WQcRGG/38/zdDgZeRHvtdppmhjJGQkZghDCqhTOKkpIEARlWQIMsyqLWp6yBSAmrabEh4yg8XB4dJZACHn4+i9/85Ph+UWv3/iv//mPbly/3u2EECJRlLJInHMMGQtDzJiFMC2EdZp6lGGkrEAMz2azosp3vV1jDCau0Yovhudm0mSMYYxHl+etln733euEkKqozi4ejC9n4/FMKxDGTYo4wVQr7/Jw2G63Gw1ogat3KeFluecxxoqimCfzqiwYoYQQqVWa5tgWALIgaGaVaHe7SZYSHwNu5uVlwChChvhcCOOz8Iuji6uj/KePnp4NR1Gz19rae3Y5fjzXwo8zzYzBKNg5vMg515HfeXh4/vn9Z3me5Zf5W2/fKrL503uPm2321//x/LWbe1oe/uEf7P/4T/7sw08+hZCHTAFV5nMBhG3hzs5rO4vF4uL+xeJsQbs03m+qHJayyjLBceyAzQudZnI2m5USYe7H/Z3BYAAtTJIkW2QEsYPtK624GE2mnHAvjKyDwkqhpAVA6rrXKuXYgxBqa7Q1lNI0z8CK0rXWb8aUMEyWDKYVq5xRWovEQQAePnhQVVW9PPI8D4JgL0Df+Pa3vv+9bzkHt9qNfjPWoii1JcBZB+NmY3//oNVuG+PqdpSPnhyORqMkSWr/oM4rU0qh22hPUEdxl2yGr7RyXwovVu9fb6XPzejmm9ebgedR5xRwwDonDXDEIQAKkxtjCCCc8yAKlTJS6tBvQAPzTNQePyEEY2CttUAJZZVB7W7LGDOcJgB6k5nCOJjM9F/9u99+7zvf+q//9Mcdf7fMkuNnj0AB9ju7t27e/P/+T//2L/7f/5+zZ5ev3brxL/7Vf/fGm+8ki+zGrTf+/M//PJvllDAIIWEsTXNOqLUWQYwxlVIIocIwZISnaarhUuUGIWS0sxbWDQTgSpICAACgBasGlZAKq01W5thDEtikKgkni9K8c+f2aCHeCtt/8IM/ee/u20WxmC7m936aIR9SSqVSCCNtjVCKMCK1QBQBYJ1D0CHrLLIOWAgAME5t7GFrp/XvZrCu7svLf3npowjRGgEYY7IswzWvjRBjTJ32QgjVlClKqda6ptAbY+wqvlVH9SnGAACrdb3r4/XrPq9d1c1maWAVhFs79OucPTIAAWgdtAihdToPOKXUmjthrXVgWY2M9YYjD4FzwIDnxRr1QBA5uOpTaw1CiEDkgLPOIojqdIs0GkKIgcMAY4zrgANYxR7ASk+6frgQfoHTAGqJRAsghBp4q/vlVuEEA6DzPFaVOeeUkgDaimFCOGFYx4iNKzVoxr1+4/z8JMvnZUW1kelhQQjZ293ttkPuQL8XD7ZaSleW71BKlRBpmkqhjNamgjNT6CIDWjhnrLXKOQugNU4I1cQEGAgMwABS7DyGW00fIT/LFkmSlFXleV6SpAih69dvOOdK2Vmkaj6fK+OC0BPKxnEry7JOe0cVRillQHPmkMqHzjlXBdf6rzPMkkkyvZyFYTxotH0/nE6nURQJhhEkHqbGwYjGMW2WutQ4KYtsni58H0Ok02QqnTk/fzaZzpRSZRER7DDQ6XzUbbWBR+4/HhVFUadp6nK2fr8fBH63202SBGPUarWklElSYgKCkOu8DLC12F2Ohp/dX0SNEEf+oNfKrRJpAQGmmDtrgdTOOJMWoIOlNFVptSHWeXluEMb9nT6hCqGMkGr3QE5GH1VmXOQZoHY6d2Ecv3bTGjsS1bDT7+5dbTJqCUKoFmChlEIIZ7PpbDazFmxvb/th0O/3paxOL861cllaOUs5JUZJqTQAyDoDnauVBxtRpLRwzpR5DqGr993pdMopWcyTyWSilLEWBEHwve997/btt+7cuRMFoXOgqkqjFIQQQgwh8Dy+Vv2r/VrGGIXu7Oyi02n1twbPnj39m7/5mw8++CAr8k6nk5dCG9NsdbcGb+zs7HQ6ncPDw9Pjs7IUeZEaWyFMCTHAikoWeTHHkBljkiSp9ZVrC44IqR9pqVXdyt0YY9zSGxBCqCSxwJV54ZzL0yyZzW/ceK1YJPP5PKBdZ41zTkgJMVIYVwakk8kwl2fTJC00j1rMC7OqqrPUoiiN8FqNOPC8gDGV6FJUSbqAmPlhZAxBCLWb8ejyNJvP/sU/+zOl3TypbFUsprNb1/eHKZnOxsfHz/IiiaIgigLOSRT5UuJCZJhBn4cIgfl8XlUZhCYrcms1xtgYNZvNjg6PPC947frNJM2UUtZBr5Z/NwiAGqejSiotFcXE8zwMkdCmEDKKojqioJSCDhhjlkVHYCkDvI4lgI18gV01mawNMaX048++yMri7t27u7v73W633W4HcXRw5drjp4fOQoBRnudn5+dpmmNGW61WrQu59tjWJIkNj/lFXxm9EHt4dbwUAvn971y7jOsXX837brqVdlXOvv7U5mfXr8BVt4X11lIPhNA0Kf+f/69/+/HHH//pn/zwO994T4hSaznY3nly+OxnP/tZmqaDflwWmUfxjat7v/3d7wI/ZJTXXUW00LJcWGO8KK69WYQAtRgAyxiC0FqgVu2Gn6swQQhf2lxfOEH7AmACEENoHIKtVqcOmb7xxhuc82736qDXZ/ix1MYgBCE01hpjCMYIYaA1YAC45b1ZqVxZAF5wTf8pxrrWF7x4p15951e9vvnXtbO+5gTUymMrVaXna6bWBXmV07O5AW+QfupigecNOBxYFU+uFJDWT1Z9B+u8yeZ5rQ5u6ujFOpSCNoQpN+ewnu0GEllGJgC01lpgIUKrR9g5WIs8g6WyJMLL+AVCz+s1rAXGOKOdksYaYA3ICmEcXGR5pYqyquJmF1N+en7JMC3nqTEgyxpSZeeXuHkaKC3G6T1RVlmWYQgHg8FgMAAAhUEshS0vx5zwIG6Mp0khZLvT85nvlM6zEmHQanUIQUmysNa2O82qkkKoxSIzxsVx3O9v9Xq98/Pzw8PDuh9EEAR1eIAxz/cNXuB6r8EYe2HAOa2DmpAsoV59GevqLUppUeTOOeYRjLHRWhtprMIEZlXFPR6YAAIc8GB/f3+R51maB56fKjubzKfTaZokg94WAGgymcRx7JyTUpZl3SkpqJkZ4/G4vjtpmpZlCVeMrkZn11pLJGk0GtLK6WSOKIqbrSiKPB5gzGSl8qwUSHPqceYfnRwbC4DDFhAHDPdxp09296N2l9248W4UwsDH5yfPTo+Pnjw5VFmWx3x7r4dZcDGemtkC+1C5YjYdk0oUYRytZD6VUopQZA2glEqh00VOKfW9WEpZ5AZjjLCsRFFVFcOMYAYYthaAFQTe295VWoxGl57HQz8Idnma5rzvRVEjCIJGo3H9+o2D3b2dnR1KmRIyyzKtLUX4OTFkFbWrH8rV9uB6vZ5SajSa/OpXv7l37wEASEqdprkBJo7jvf2dfqdLCJlMJs+eHU9G435/q9kEYRgz6hHCVaWytChLIUudppXW2sFlfxTnnIWg5tyRWoIcAgAsQoBSbIVT1oCqYr63WCw6vW6z2eSczyYTK0RVVQjjbFGKwPc81t8ahFvbvtAiKwHl7a0tJm1aqMlkRHlAKKa1Xp4yVZbbqnLOYY9MF8loOgYoDCIYVFhKGQRBkae/+ttffOubX/e9uBWW83n2ZH7R6w6ara3J9GI2H2MCmq2IcYiJC0LmhzhJocuVdk6W8nJ8NplMLATX9q/MkvnZxfmgt3X16tUgCI4Oj46ODxvNNgbQWI2BA9BZbaxWxmgN9DoUVtNUa4NVB8rchrZPffWsMXXEzG0wDAAAxphanKQGXu55phacnZ21Ou1KqOFwSD2ezcuaZTNdLJIkEVJJKSulIYTz+ZwSvlb/rXdW8GKEGb7EYPgKWw9fJLv9/l3hq/YJsOqVAF7BGWu7vI42bzItwIsoob629cW0G/WlCCELcKPdenY2+h//b/+PR3/66J/9+AfXb791cnZ+fHz0+PApcGZva3c8mz7+4uNuFHz68Uc//c2Dh188CIIgbAWaamttrtTl5Xmv19NaQYitswAa65SzUqrcrAod69u1eXFeOuXlK8YuRXxcXcBfRx/Q8elJUSzKfHGwvz2+hO/cuU0p5xQYgMq8chAABCwA3OcIUUk0dLBufFirIkNgXV3j/k88lhrXK+rMeoN/4RxfpKG8dCngxnip5hBCqKRyG9ScNaKFq+zPS1hh/f8mXADAKaXApnoBWK0KYF/KI7gvQ8kbqNRtvrge4MuQsdvgKIAN9GBdTYZYHgMAYJxDS3KEXq5th2szAFbkD0IIxhQhQqkPIYUQe14kDOBhzD1kbKWyJC8qiAhnHoRUW5VXmuZSKi20qSwoyzyruJayKCpnrLMTCHCz0Wg1m51WN44bJ2cXizTzGSUYizxTZbXbGyRJihBoxC0H9Hg0KcsyiqJeb9BstoNg4pzjnGNEp5P5wwePlRaWcYKxVbYshbXaalNJYbVhjDGP12wDCKFSxhhX61wihKIoIoQJIepkkLXQ87jvexAiURkpq6oqIIRSG76M5Mk8z60xBCJRVrnRUmiKcRQEVhrOOfV4FEUimfs+RwhYa33fDwJPKTGblfv7+3XoK8uyosjiOA4CDwDrc5KmabfTfu3G9SSdn15eGOMY4aLSYej7LGLYUii0qNWpHPVibGs9U1tUmbJplpfzZPG1r33z7p19p8tiMbftpll0nhaP7n34+aLcw7zr+x6P2r52wghZzYUsCSW80WgghCpRVlURhN7elQPOvShsTGbzdJEbYxqNFsbYaFtVVVWMlCiBNYQzzjG3CABECPEZtRZ3uq2Ls9NkPiPdNvB5DeUwRMaY3d193/fffPNNI3WSJItFarUDzxuJrh5a6JxzEDrGSf3gaa2l1oQQBDFw+snjZ598fNjvhwTzQX/n7nvfrLW1hxdp3Y1ie3D9+sHbX3x+DzqfIAIcUhJK4YwBzqIw9JeN1BBc5903n9u1QTGrNGGv14uiRhTH9x48WMyT2WTKGPvRj38IjL44PRn02lNGtvq9dDG/9/TxsNQ5pInMisXMAISIBxDigU8po4RhCLVURiphlXQAWAfjKC1SoSoDQ4SptlYK3Yj9IIguzy9mkynuEYYhAsYjoEinsNflHm61I+tkkjhrTVYtFsU8iiKAndDVopR5nk7TaaEKQojQotlpdnCv22r3t/qcc4yJx3xtXFFURSU8z5NGA2eANRhCKURd0kMIKcuyKksIoe95eZ6DjS7Ptd1CEIIN+1tfwPWGalfJCLdUdKcAAOYxznlZlkIrRMmf/Omf/uQnPzk+Pbn/8NFikUkNHAS+zyilxtpKCCn0urf1JlNs00/atOz2q13UTUix6aL9nW/efHF9BcDG3g8AqCkdm/AFbhDdXx3uRXdzvcFoQBwEGHOLyt998sVoMu63G3/0ve9ki+mVq9cvzk8vzk873e5Wu3V5cvjFB79NpqrdiD3PE0VeFEWn04kGvdlsJqpCa40pgRA6YIyti9w0gjWkq+f55RMDm8lvAyBAwNVlqsgCiACCCJ4NR8PhxeXF+e2b19+6/brV7saVaz/4o/nZAn3w0YeVcBjWWXSklKGIagsAAMgBAC1cpooseKEa959mbCTsNyNemzv3+i6/upVu/gmuAMfmcdBGWRBc6ZKtY0WbrafWB9lcEm7TjwebTILl22qcXefd1ugEv9gde/OYnNNNPIQ2SiFe+sb1KS4vxYqyoLWGCFhroUGErFYmhMuHHikAoQPQAeIAss4haIHDa74kAKDuQwsBCvzYIViIykHcaoUOtFVVUUqvXLmSJLnvRUEYA2h1hcNm6Ee0MCPmGCaeg1iJXFmT5QsEDSbw6tWr7773x++//8H/769/QnnAPDYezTDjwHaVLIxRZeFRhhmFzUbc73U8zwsCb2drAACqIz7W2uvXrnFOue+tboQxxjgEKTacen4QNJtxHMeUMyGEtdZIJYSEEAZBFIYxhBABWCcICEIYY+dMWeaVyKGE2giEEKXYIQehk6IsimKxWPhhEHlemhdFVbIg6HW6PvcIIZTiqBkVqtxq9Osogu/7hJA8z/M8B9Ami1lVVUVRAADCyMcEUoaPnj2dL5L+1pYXcCk0dIhSbLT1vIBiprW2ylBMADVlViql0spqLRljQch87kutndYiXwzPT8XNXQIsEDDGDaLnEe5VCn326eTy4vNev9WMA4gbeTpCEOwf7JJWqwMAEkI0m00I4XQyu3J199q1a87CRZYfPTu+uBgaBzBGVVWk2YJShZHGCFECMXLaGgwshphxIspKS+EH3ptv3L569QBjSAixAGupkiSRUopKnp2ep0kyHk3b7XYYBFHYIIQ4a7VW9bKuYz7WWryWFrcQY5gkC4yxBQ5jOhg03nnnnW6/d/PmzariZX42Hc9m4ywM4ka/X+Xz8WWezCwjBGOotZJSAgMw5r4XUmoAtIQiWOcapAQA1skOraVxGtUNwTCz1iglIASLxeL09JwyNp+n165d2d7dOTg4+OPv/sHZ+cnh40effvppFAd37rwlVPXxZ5/eeufrvXny+PHTBw8fLxaZF9C9vZ2d7b0nTw6RQ1VVlUpqJTnndexrVGaVLlnAm+1W0IyZh5WDlAfd3na70yPUl8oNR6PhcNzu9pRS4zSjmDQaDaWEUqKUYrFYPHhwP4yjPM8zkVdVpY0OmiGPPGutRXbvYL/f7UmpK1lCAq9cOWg2W0eHx61Ww6skxETnGgBLCbHGVMqYVT/JWkLROSeEqFNom3pzepWvXXta9sVWQ8aY2rrVXkutqC+E9MNQW7u/v08529nZGU8nH3z8SVE4iIAXUISwUFJXsmaw5mnh3Msti17yz14wfL83TPCq3TcbipOvvnntY710hFf/3yTNwQ3/dR36dhvcsU3Lvj54/QplbJHMfZ/3B9tCi1/97sGNK51vf++7N95468r1aw/uffarX/1yZ3vw/T/+w/Pz088/O+pfe81nBCEkKMqzJJlPWp02dLougCAIIYIBcBACQogX+nVXcGuBtc6uVAa+6mI656BdoR8IjQMQOIiQA05ba4w5vxgX2eIbX3vXWnv71pu723sPLxfHx8+G46kXhFJpqWwlFeM+Wh7TQoeAMwBa6CwAwIAX7uw/+th0qetFWwsBbe7Wm/dx02d4CUBsooSN96D1p+yq10mdlFnzGddL4iUgsr7sq+/aUCUBK/KsXXb7XCOGl0APeGHXf1k6ab3e0IvFGq/+vDkZYIFzDmJkjFtiDoyXpcrQAlAXUNT4RzuHIbRlaeuwYv11WgPnHGPE84mxcjxJAIyasYcCH1pd5DMEYDOOue9PF0lZVe1eG3Ov0k7JEkBrgDBQUg+1O16r6SNopJxg0r/zzsFovP/Z5w+ApTev9+NGM0uLdosaAxgTjUa0t7u7tbW1u93J8xxYWRUZIQQAVGYlY952f2DAklqR53mNpJ3RyKEgiKIwaDc7rU4bY1gUhdUGAbRQeU2WWuaStCEE+T5XQljnsrRI09QZizEWooQQ9nsd7mFtoJA5IeTKwU6z2RyPx9YoAmPP9yHE2pAgCBjD88WUUtRqxTU/xvd9CCHGoNWKfd+fzcbj8ZhS2u12e712u93WWkuxgBACa0eXwzQvECZhEGrjoAMUQSFklqYQQqeNdabRCICks9ksyzOnAsqc0s6Uwkn7m59/HCJvp99rRw3s/HRsW/5BuLX7+YfvZ9NkeJy3O0EjxgiZ/lZjb2efQIimk1kURX/0R+9IKf/6r//TbD5sJeFwOAzCGCBhbCG0gRoaq8MIWW0lskqqsrKyKpQyzkLOWKsRN/rdMPAD32OMhKFPEIqiKK+MoVpJvUjS6XT65MlhLUBLKfeYDwBQSgEDatk+59xisaj7GjOPR1HEmV/b3GazmSRpslgc7F+9euXGrVu3pvPZ5cXkyZNhVUmEUFXqqkwWSXl8fDqbzHu9HqMMAKCscw56nMVx6HnefD5cm4/6wXbOYfJCQHKZhqyfOod83/e8YDAYbA22McYnJydffPJZMp3u7m7v7OxYp+I4LEV1dHZ6dHz4x9//s9lsdno+YV705sF1z/PLshwOh5RihEitWiSEQghZBCutCpFbpxvNOIgDQqmBoBBaOlwaGIate4enHg/OLs6rUu0d7OdKpWmqlLLaWAso5Qa4LMsuh8O8KjzP8wKfMeZHvKZrlVJ0om5R5WcXIk8LI00jajJMRqNxmmTOWM65ECLPFrKsnHNOK4ZZVVVZsiCE+L7PCZVSFkUWBMEmOXxpj8AL4gpri7O2yHX0bB2vE0JEvlf/EEThycnJ3/zkp7/67cdaA8qABVBrbYGuW8sqo21ZvOTWvxThf9XS1f0V/56bx6se5Kvv3PwIWEnhvvqGl972pdbcbQSN1+9/6boRDHq9TlXk5+cXlIBOJwibrY8+/vTKlStVnn3zu39w592748uLSgqM6dYWG14elaXmPu73+82mr6Te2e6F4fWHj56UUkAIa88HIGoBBA5DWLPBl+T91fc+n5JbBg9W17M+o1qnCDgAoHEOImABoAQDoMdTiSGZT+Y7/V4zjI7nVVlkWgFgrFEWAggBopiu8kcIAuugRc46CP5LpB5WA6yalwoh6piie+nMv5LuuryheDXgimJirYUrL7zO063br2/GKdcQZDOGZFe1KtbaVTnic2AB4DK6wDnfBBzrRNXm3Db/X7Ml1oihHnijd4N7JQe3vsXLa1K3egG4brRWZxMRsgghZ1cZqDWkAfU5OoStVtZaSSl1zjiAPR9fuTLY32+n88vx+FgUE4JcVVXZPN8a7GsJtKkWyTwXlXVdRAJEMODFzvaAoObZ6aEoh5awvav9rUFneH7+6af/8erV63/8RzetuUSY3X3nbSHU0fmEsYZzTkpJCGq3w0aDSDNVphqOF/e+eAAhbbc61qIwiBljUi7LLyfzmda6DjA7CILAs0oTwurHNsuyRZZJKZ1z9ZqprxUCrm50Z4yB0AlRClGGgef7vHY5SpFGMXdAGlv1m4O7d98MPP/nP784ffbo7t27b999J1lk9x8+IJx5vl8KLiX1Ay6EyIvMOk0I8Txvd3f32rVrYeQ/e/YMABDHsR9w63RZ5YHn6WazLMt0ngqtCOez2SzPcwvsjRs34tjzvJARJKvSAdvrtZvxtSdPnpyenjkLrHaitMo6pNx2u/fx+08/c4/eeP31/e29ZCah89LFpEE6rcirRHr2+DgJwe5+k7tIZnPSiDtJOi/LUimFEBAynx2Pzs4PhagaraYUqqoq6vkQ4DCmnU5vci6VKCtVOqMg8ygmkGBKse/xrUF/sVgIURKIHj+ccM739naanZ16uadpijF9/PgBtO7KlWv1s1SWQinFCfU8Tykzm83OR8+qqsIYtzptjDEEGCFkIfI8L/CjeZIiRE5Pzx8/fjqdzWaz2fWbN8uqxJhm+XyxyBEkmNB37t5WSiEApaosMITB0MdBgAjRhCDnjFICEbx6IAFCqx7qlICl5raFyBGKZGm01nU/j29+7RvOOVGWVVUF3Hvttdcwhk+ePjw+fnZ2cco42b929Wc//3VRFNbau3fe+eEPf4gx/uijj46OjvI8r9UeeRQgrrTWVaWEEJ6PEQoHg04YR9oBK3SSVe3KzjO1KBaZ/KLZ6aaLvNFqHV7O87zELnTOOQshwFLoNCuFEs7BspQWAB4EQRghSsqqKCsBAKiqUkrRbXW0Vc+Ojzzq9bsDWcrJaNJotCIvkFLKstJKQIillJxwigmgrobPmCJGKPZRVVa1ccQYY4oIWkKryiwJBGjFulob5RpYQAirqqKUIoS01oBCqZUfBlEUIYI/+OADQkCn28iyIivq+DTABHjc01pLqTzC19Ztve9uxjndS97wV2wYr1rG3w8UvmrPWAOFl/5a0yw2rTN4EcTUVv6lPNf6DesNoJhPtbUAgGYj4Jzn6ezzz548ePBkOBmrqvzhD/7oe9/5hgPw6bNTz2P/m//d//DXP/1JURTDybTIZ1bL27fe+Ff/y/9usLX7f/kf/6/T6bySBiOKGQeIKKWksMbVsfHneYf1JgFeQV0AAOgQgmiZMHDWWAcQtAAySoDVjYafqnmSJItG9Pr1a6Ionz19PEskBEAbKZQJ/FhpBR1a8SEsqBMQ4L8ESlif4DoMsBkMeOk9ry6G9Yv1fa/j/8t6xRW/BAJYR9o2UcL6+JuHXX9quRJWhZnW2lW9g1oHJCByS8aDW0YC1s9X/eua4buJEgAAdSP49Z/W+OalU3Mv5uBeWgNupQv5HNxAiFDd4G15WOAQJrBGkgAACB0hyFoNoEYYG6MdMJSBd999favfElX6+MEnx4f3inyBYeTdvBLF3fOL+XRRcOxAQAmFlIC44Tc5PLjSUbI4v1wUqnRoxoOcBbTZlhcXl5NpdfXK9T/503eUNBir2XS+d8C7nR6EcDgcLhYLAJHSWgioFYCwkjKTwrQacbPRjsIYYzyZps4BShnDBANIKU+SRCmVJInv86IoFosWhLAosjrshAGtO+i6uqSLYKVUXqRWaUI8hADGMAh83/eVUgghiKusmBuj280wDKjROXSoETFODEam1fAb7WCaDKfJHGHW3+moErTbrSzLIHSe50kpnTOexzqd1rVrVzCG4/G4qsr53CmlhsPhbDi11hZCAggb7ZZWMs2yUpV7eztxxBiHUch6/bazssyzdsePWJXNlRWY0ABTX8oOQjCMeKvtnxw9FmJhtCWMMo4YIw8fX/7Bu28Ntlra5OeXj4UaR03g0wpoR27duj2aDD/66INf/OIXlML5fAoJOjl92mw2k2yczFNKaXewpZWFEHo+arUaRZEVRUEJaTabgRdQwglhVVVMp+OPP/448oO33r7d6/Xa7ebe3t7J+bTMiywrZrNZFEVa64AHg8HA8zxCmNa6LEvInZR6PB4/evQoyYcAwEaj0e52VjrKWhqNMZ5Opx999NHHH396cnKitW53up7nPzn8dLFIe91Bt9Xt9na0NlLqdtdrNAZaqixbZDkEwIV+vVFJP/frjbzu3Fonzgmldd0H9706yielNM7WvgIAQEp5enR8cXExm82ePn0KAFBK7u/vvvv1d/f39wnDaZpI7bRVwBFGAyHL8Xj64YcfZln2+PFjqSrGmFASAGCcxYgSzrzYp5EfRYgQsjPoBz6tRKmVlcZoAB1mBkFAfUe8wuQc0MvLCeO+bzWl1PfDvKzyvBwOx17A+1tbcbMttQjjKG61lVLD8SjPc8/z4v72bDKFEA4GgyIroYW+74tC1E1KOp2Oto5xqt2yCNsYE8cxpbQsyyzLpJRxHMdxPBqNaisGNuSca5pPbYzqJP3aEtWwoMYH9Rs458YYKRdxHO/v7zfbrcFgcD681BpMJgtpAMGAM6KNVcpWVYUZ5YGHDVo7UnCVvwCrnhTgFaAg9Vf2Gvgq7/8fNNbCNeBFl3QtL7F5zM3daNOP/NIX6xFQ1PJDpZTVMpcVhLDR4karn//i0/29+N//h//4xRdfvHf3rbgRSqWuXnvtvXTcancODw8//PDjy9Fsd2+wtdXP82x3Z8daNF+kmHiUcoBwlhXWQmOXXY/dUgJuuVu8ioqW5wuW/Q7WkQfnnAWgEJXKhd8NCQHPnj1rBQGGpKqqJJkRBNrtQGlQlAUhBEJdliUmbMlOgAAsC/3AfwGOQr1NrntFruRyyd/9yS87Tj3cK5Eh8GIpwSYqXePm9b2ux6tAoQ7C1TkLhJdU6yIr6/nXXK51BqGexvrXTTgCVtiotm/1BzdTYC+h2DVQ2FwGCKE1lxwscfCyRqz+KghrRUFcf1Rraa3RWgFosAFSVgghY8XN67uEQGBgt/XOe+9czeZTj/G93Suj4fxXv/nk4dNjykmpDQRaqgIhe/vNqxC50ZOLQmS7+/jdr72+tRMtZmfTZPjWnSsXZ5fjyZP33v3mxcXot795PwgiGLSpJwghmAllFkgpz8eeH/BWuLO7lWXZ6cnIWJXnWVVKIRRGnjHG8zyMCaU04B4AqG674JxjLMcYOwTLstRaYwxrC+d5Xn0XCIJ19EKWFWPEOVcDXmutMQoAvLXVGg6HBNHdvYFR+smjeztbu7s7gx//yQ8ePXzy81/8ZP/qFQdUls2FKoI4qiojpW+tJgRhDBeLeZZlzpmtrT5jpN/vlmWutfR97nlssWCtZlNpa8AibjRev/1G1IiNtVHsMZ8BaA6fPaiKpNNhUewjhAjVHps34wo6EgQNQptloR0EURT85re/AFC9/vqVN9+67XMmbc65b0D+wz/8Wq/fCmMs1Dvj6eHZ5X3l5v2tiDw9/igMw26fT2enFlpAlNIKYjNbnHPOGj1irZhnjyiljVZDIbfT3up0+2enLpkXvS7lzMtS4SzAiE+n892dg063TXloXJGkJZskWioAkFKKc18L22kMEMIY8CKVoed8ToGx82SaF0mR5QCUGLO6N/RiljO82N2NKKVFMcO+FzfZ+flDxvOwWe7tbc2Tsed5Vzr7eZ4753YGca/XS9M8y7I4VJwVJMZhw2+UAGPKCc2yfDhMkixJ0pnvh0EQJvPcONpoNBFCUUystRgRzydClIt0ppSglCIUURqHIS1R+Ytf/8YYhRDc2toSsvzi0b2oHd65+072t3lRFBTR2WyGMPYZjhsdZeTvPvxICs0YazT6ZZUTwmrQjQnyfcI5RRhc293pdrvG2dFopIoKYISgJySUCvUHgyiMF0lhlJ1cDiFGuaj8ZgdgCxEhFBigjBEUh51Wy1oLAbYQ2NKqytgcuhJ7XgSEeevGG4SQNM0Hg4FSJl/kFsGg1Ujy7PrrN8/HQ6VUmWdx1CAQtPvx66+/QQipqqrf7zcajSwrqqr68MMPCaaPHz8OgoBSXhRFXWUEgKEU1+ellDLG1OZJyiqKAoyxUsr3uVIqz1NKabfbytLitZvXr1zZ/83772OMtQbcgxhDjEhWSAAQQRRBYkoLGDFIO+cQRozSmjjGMK5bgWw67mv+xFITvm5RvZFRrm3fuqCmRjDW2nUZ26aRrX9eu2J2o1Hv2g/bxAr1YcEKytSVxkslNc4hhGtPEaxcw5dIkc89RYkKrQFCDnEHLQSu0Aghn0Z6oZCYlqPs6fE4e+3a1V6n+/B4scd7bgF32/uzvaTT73zre+9VJv2f/sNfngzHpXaQc8o832NaVs4mnJe2ClYKTBYAB4CD0AFoKEF2Yzy/DsxZq6x2GNGGH2JMyrwoyzIKIgPU5SRnFP3isweg0QQffgghHJY5iMFpUsQNbnyw0AveDPIkN7CuhIDAOAgIcsQ5BwFA5MtTSF8FXL5qfBXmw6vumnUtXL1r1om5OjFsra37/dSZsvViqG99zbOpPRbnXL2duFWdsNbayJVT7hB0CFhbd09YVopY59xzlAAAEDJf3mizBAd1jKF+duo1YoyT0mhdGWMQpsYY4AxjLAxD3/cpQQAASimsCxABABCiVbILOOq0M85ACxFFxhlgrFl2HtdaO1Br5ZElVXxdGF8JUXfJwhivmStuVSIOV/0wOQYQIYIxQgABAJ2DgGGEIaFCYM7bEEKIWbO9rZTSNjs9ex84ky+Sdju8/cZbcEfOp0ML4GQ++ujDX7Rbnd2D7aKQl8NJh+++vnu96bksnfY9ufuN3atXm61WVsyfmSrfH0Rpenj1oHF6fnZx8TsDzM6BrMQ59YeXF59TwqHBFJdxMNjdIhABRPR4/Gxn3zu48pasyHQqyxzEjYazAmLmgPR8XFXFPMnDiPpBQ2tdlGVZlnEcB36cpVWWVo1Gw8OIc78oS4TwwcHB6ekxIMhoZAhyjHEAm70OdGAxm/ue53lePk4PenvO2EGzQwl5/PixFPlgMLh2fT8K/C8ePfjwd782DlrgqiJPZ7PeYOfw8F6r1fJ938Fqe79rTMsL+LPLw1IowujClIKjW7dueoHfvHKQHh+laf71/tf2r1y7c/ddAMC9+/e7vXZZpYdPH/32F798+80b2WxkSxw3fJ1PEhFw34NZEce4yMZVXmz3dx7d+2x2Oux1uslJXg3dp48/+eBXXyilOCOnj5/aon9wZRtBGOPGlcGNNL9AQpJf//rX7XbLGFNWudZSO00IDnzfOAqAMVIJLZ0zCBKrrRLq9OxiMNje2d3vdh2CfJGUQmpGeRyFDcKU1A6ASgoHkQM2LwtrQZ3jkVJjVGNbM5lNs2fpdDrt9jo+o5RRjKFxVq1SfYxaCGFVFaPJkHPunBvPxp1u++7du2mRFOWNra1ulqdlmRMeGWPyPIcWGqM8jxHS8HkQRTF0QFSqdiAYJgCAsow8nkNkpCo8yzwfY8SCkAOHMMbaGkKIz3kch+12ezafTCaTRqNRNxgF0CKEjFHGmLIsCUUnJyeU4jiOkyTJ89L3LWOs0+5nWZZlhda2TjgJIS4uLlqtFlySoUhNNPZ9v9lsNjtRt99JkmQ4vHjy7DCKGu12ezAY+F6gtUnTQkqppK17PCqlOlFPWmttVRYCOcJ5yLmPITHWtDsdY8wsWSCID/av1MHJ11+/1uv0fd+XUi4W2bPD43E5FpUihFDMFotFHWEriiKO4263u3/lCmNkPp+Px9PFYuH7flmWxri3335bCNFoNJ4+fTocXhLCIISNRiMt0npXBhuaLet8am1i1s4Qxng2Hfu+H0VRVVXPnj0zxjAGnHNCON9zlGKlDCEcQgwhJARbt2yXXNvB9S5SW7f11lIffJM4tt77a4tcRyDgxvj9u9Hm2+rvrSewuYnCFUdsnXHYJCXUr2xuEuv/f48HD4CtS9aXv0AAHXQQOAi01hA6W9mLiwstpH3NXrl6oK3hLNze3op7jS8eff7BBx+UUj07PMKswSh2lDLCEEJupV6cLOTmV2+e5uaLm5GS+g1ClpWoMCKcsjiKqqqCALbbrSDwHNDD4TBJku3tbUo8hlmFJLDQ6Zq7iHkYCiGAQwA4AC1wwEK7DCr8E5MZ10U39WaMEKqqqqqqNR7avDv2RQXD9YvrHX2N9upPQQiNlfWbtdbaaG2WgaVKVOs5bF5w9GUK0HZVpl/H4YwxQoi6wYFUxjmHoKv7CSmlAp/X2zlyS9z50pw3j1+f3DJqtSQTPNdqhBDWHIj69TruYq01FhhjMCV16MVa66wlBDHGjNEIvhyNqI+DEKpVTyKCGWNKqTRNv/j8yacff5Tlyf7u4P1ff9hscI8TVZVlWaa5DCI4z0olrXIIEBa0O702P9jbvyF3i+rY90tCc22dc8qClDJbqSwIeCnLZrOL6dyDDGLDqOIs0AhzbhGClSyVyqSwpZSUhFHMTECVMtZUzgE/CGoieSXFcDisqgJjKrRaLBZRGFLmQQiT2WQ+n1prIXTGiKpSns8XebZYTP3Ih9BV0rW7g1azQQjptTtFnj6VJYbQ86jPfCFThNBkermzs7Oz0x+Px5zTuNn49ne/df3Wzb/+m59++sXnQmov8D3PO78863Q67W5rPp93+r0f/ehHgR+dXZxPp/MvvvhiOkt8P+jFsU8JR+idN944wWA0GntBsH+we3CwlyyyVrfjBWGr2zk5OQqj9iyt0DDxPbTlCOPk4uzCOdhp98bjWZ6JTntwfH7x5NmhFwQ8DBCnJKK5KVNVYOi2tnpH05nk+GQxWaQjRKSxOSLy6kGfKCkWyazRanLOIXQMEmkUxjhfpBbUJfKMcowZlcLOVeYDymgWx4QSHwJKqW21gmajl2WFx32CbZ6nUiiEoZRVURS+F5WlyPO8qiQlXFkjqur09DTP87Isy6rodFph6AOrkySpqgohnKapVpZyRhg1xlSqqtcrYXiwvZU+SQhmUrkobkmlK5GHYWQdzxepkNDzPIwpANYYiQBGGHAPU8IoxoFhDREBeBwGFGPseYhxBBxWIltkebvdhRBTyiGEslLWWqdRlSufSyFLYzWE0Npl7XtRZoN4cHZ2cngI9/d3CaaUUgAQY14YxrXGg5SFs9DzuLUuy3JrrZJ1GtspJSF0vh8eHBxwKgCxWbUYTobTaVmnPzrtbhQ1lDSlVBgxjgnQ0jkJCIWOAAeAQx6Pu50BJR71OII8TUacBc5BVRmMMSKsDiYWuawC2Wp19vYOpNBlIZ4+ejocjoIg6LS60+mcENJqtc7OLheLRa/XazabWZadnZ2Nx2POeV0QDAAYj8e+79++fbssy6qqCCFKKYxhvWHbtb7sqkhynZ5Ye9i1Wbkc68GgubW1o7W9f/++UsrzaFkpsEy7opogCYA1xgAIuUdrRkJtxdau+drgvuSA1nZznSCok0foxaKJdWzgpUQA/IqSyDVcgKs2vuvxKl2x5jTBFZfiJfC0+c718Te/zgKHIHQQAGdqnph1dcMbKpUyxniUKSkv9Nj3Qy8IM1uRCU5ltzdodXrdjz/75PxyjBBTosQk8jnn3HfOSVlpB4Qym3OAL8arXzrrl65YnTmCEGACGCN5LggGi8V8OgPXru28/fY7lLK/+qu/Oj++rHINNbAaOA0csEIopRSsTw7aZSnF85TDPy1Q2Lwdz8MAxiil6mW5Xgb1PXopK7EOHtRJgTov8AK6si/EtNZcwpcCTqs922kt6yPXa2N9TACWDlXNtazVzaWUUhmEECWoxg3WWgRdEARaaww25RNA/YPbmLldNldbLTb4cqgGIVTndgEAiFBCSH0Rasxtra03fmstxNhaYK1lyGHgahy/uUjWALr+VF1eiDFezNWHHz4wWjiFDh+fNhvB9k4vmU0Xi7myvL11EEdNwhg8PRcOppWafnLZaXMLx8pcdjoyaggIMogLCwH2cJEVjMdFUXS6u5y2NLKlnikDnLRaOa2tcVYbUVYlpdTDMAxpFEBR2WRRkaJwDglppcoBVFpra2R/0Lt65Rpj7Oj0ZDyezudzpUSz2eh0WmUpiqKI41AIwQNGFYBIR4EvVDU6O/uzf/a/jeKgEcX9Tvfo8Nk8GZVZDokhXCVVyhFLysntzmsHV7bffz/FFJdlXhRFq9X6/ve/P9jZ/vVv3i+q8urVq8NsiCjgMe3wjjXq/v17rVY78KMyXci8zGdJkwegkpPjk7Is/Tt3yjI/OT9eLLJmu7Wzv5dkOfc95nn3Hzz47N4TwhvOEYQaUrlScG3powenV65c+8Y3/vhnP/vlw4ePXnuNX16OokbbISCAmqQzQ4BGGvjOQOP3ww8O712xVxxQZZVFIQXQEGQFFOTHP/5+LQKVpmklCGWsEmVt5YUQUlYAIIwYhdRqq4zBxJ6dD9kkazW77dYgjFoYeb4XZ3kltVFKOYgwJcboohRSVaLSUuqiKou8grACFpZVVc6mTpssyyazSRh4GEOpKimltTqK25PJiBDyxhtvUI9yQ9VCWWcgBmkxm8/n82Th+TxN84E/wIhT6jyPE4IJRHUljBBCa4UQooRgRCHESosy10VRKC1u37rBGJPazGZJkVeUcqUtJg5DDQlsNUOM6eHh0XgyI4QEQZSmiZRVXeaHMeOcQQgZJ57nRVGEMTbGIYQgQGVRGWM8ntRwoSxUVVUQIsZYq9VSSmutHTAQuqoqjPEwxt1uP8tPx+PR+eUF5ezq9a1er44lWEaDskhFpRjD1gJRWAsw554UhlLKGePU5zRoNnIpJTCo29kiiDoL4qhVVdXl6VBK2Wy27XZrNJycHF/UqH82m0OIfN+v1S/qmMH29uDs7KwOLeRFenZ+ejk8r/GBc5VSy+QRY4NerxcEQRgFtVb5fD73o9Cs2vXiVU96u2Lt1W7K2hc3xiAE4ri5vb1bFMXl5VAIE4aMECul4Zwr67TWtbSLtdBYRam3PjhYEddr/AE2dtzNnRtsVLLVamu1N+mcW2dqX/Kk4UZlI9gIGIAXgxBwpaPwErzY3FTAhurUep9YA4XNffrVXW0JL2AtdOfsMjPgrEMEYyulMZZR1Gh0KCazJP3kk89aPun2mshHUTd87eZNDWyS/er8ctLr7PmB7wUNSjwpdVEUlZDJIue8vZ7SevcCr9SCrqfHqCeldND5vo8xFEIUeZblC9+njTBywE4miZSVEGI4HH7yyafTYaqN8zjHgDJiEaEQIqk0pAQBu8QKy0vw6gX4xx91tUWdaQIbbSRriT2ykmStF+dLDNl6rIHCZv5ofbnqGoDNqEN9SetVt5lfeE5jXIlyrt9gV+UYZVnWQLwm0CmlHEAYY2vQmiFEyXJhQ/Cco7BeaQA6AJ4HDNZPk3MOouc31640TuxKxAxTVn+EUkooL4pikaZJkmqtPc/zgkAIBSHsNEJsTQ3vVlcA1ScCEamVAKTRs9nM9/2dnZ1Wd3ewfbWqiiAeFHmSFWo8LqrSIhxHcSPL9OXlUbvbEcoZZyxwAe0mk8miGAVRMRh4fmCEsBYCpYCzBiKgnDSOVcL4fnORlX7QVCoDjlpgMCVxI+x0W0HIaqeOMQNJ7pBlPG93IaMex1tpmtdFPNyD7Waj024ZZwfdniwrIcpWq/Xmm2/evHlTGX1ycnzvsw9cpoRM+1ud/av7fugPBoOw4Q92OoHnE0IqnU/ml0LkzCeeR+Ku70U4TXPtqkLmLnVFVVZC9frbp6fnAKPtnb07d+4cHj372c9+Nhpd3vne7du3b16/+tr9ew+On51MZ8Ph+cXl+WUrbvVbzZ1Ob29vDxgbhmGR5e/dutXpR0qXn997BKCZJ9Onz45n8yxJFqUQx6dD7sXaOaG4LCutKwTE3t7rpbRHx5PJtADIxySSZiKVbLQbi3RWVmllZdAOutvdvEgcMaVXTM3IWluJclzqRhQbpf7Tz98nP/7RDw4PD2ez2eXl5fHpiZIi8HzCaKfTmc/nw/G4LMtSa+tBQghwsCqtMSoMmIsJBDTwY85D4PD21n6e51laOOcAQFobrTWCJM0zY5wFzjgrSwEhlkpVVVVnuPM8z4tUiLIscwih77FS2aKsgsATWlVV4RA3RgEAPI8LJVud5tvB22EjPj8/536g7ezs/Hw8nmitMYBBEEEInYU+D6qqctSjFEkpp5P5dDwuigI49LV37u7u7hZF8cknn5W5DKPI84JmI8rysiyrTitudrrj8fDkJI2iRrfbnc4lxsj3vSAI6sp+7lGEUJZltYrteDwuy9I5QCkHQFWVxJgiSAAASmmEFAAIQmyMhtApaSByWltrXN1l3iGSFpXRbnd3n3MfOFgU1Xg0z/MyzwopdVVaKVWWZYxw0qKilNAhglxdvsioV1VVJYVSmlNunMPGYUhAFxJCeoN+4LNGHM9ms8PDwyKv1RVh3RaHUp5lhe/73W739ddvHB4ecc61VlmWSikRQtYti6Occ5RiKeWDB8t0Wp2UqXt/13awNl61IsXaLIJVvRZCqH4nRshZwCgfZeOqkloD4BBjjBAQRVEppLWWc0YpVbJWSVma1DWXu7bLay3Il7ZzKeX6lXpK9ai5C7UJBhvBhs1N5SXcsB7oxdLZtVFeT6b+arcx7EZTvk3TDH4vRHDOWWihcwAhC4AFDjpgAQLWKmUI5QhAgBAi1PeDsihGo0u33brzjbvbux1hLGHka19/l3n04YPDy9GcEuy0yUUuhKqEWjbj3QArm+MlzsTGPJG11gGgtdQaSFlxDwdB1Go3Lk7PytJyDpxz9+/fxxhDiK1xTd8njKdZYa0OgghTIoQAKxrj829cshr/yQfc0D+ooZ5SqqoqxhjYYK5s3qz1B90Gb3ENhdeLR2tt9XPd5c3IBNhIe60RRr0q1oKn6wfEWjubzYSoI6/V+q/Oubpls1JLsOKcwwhYa4MgQPAF1YflOkTOuee0jxVkBcYYhOGquvh5UKR2D+qnyW3IzSVJcnx6cnp6jhDa3d3d4hxjJ6UUghBnIXwesUN2yfSsNdmiKAIY1TpF7Xb7ymuv37n7zQ8+eP9iOGs3I6Or8TjjDENgSqPS9On5+enV69cIQc45LQsswkVyKu3ptRvMKF6kRVbmDgLGgNKABzSZa8qjNC9bje15JvOsyksNARRCl6KuOtHaCCFKiIx1gjkFAWo2EKNxFLZUGTHqKqk8n/R6nUF/BxM3HU7TRdput69evco4JZRUIg9Dv9dttnud7qA3HI0Orh80ms2Li4sbr7/W67U++eQj3/chsEVRPH74qMqLmzeue553Mfys3W5P5zME0Odf3FfSEsQZdkVRtXv9JEk+/PDDqNm489bbeZ7+6lcfjMcnTx4DaOV8Pq7KJJlAqwA0xkhRSY0AHAMgK2GttsZc29uKe82tQb/I8kGnyShyRh0fPfnVr3+nlD49OW80WhBCctPvtTtXDq60Wq0nD96/PDv55d++r5SBJDi5GFXSCmEiC5yDNQOGc04IqqWSbr4xMMZpBRhnRpFvf+fb3VZ/NPy/k16nGYe381JkWfbTn/70008/ZYxVRTUdT4WUwDiP+pBgCJAUxhjj+z7jrNHqYOpX0nZ5uHdwjbMwz8uzs7PhZJrnaSlLqSophe/70mhRKQQAIaSwlVs1Z/N8v94FrNUQuno1E4oAAHt7e1tb/UYrrlQFhI2iwAt4FEVCCC8M+ox5XiCVQYgwPp2MZ5RyIYQsKwixUgpC3IgaGGMCaV1YMR5PJ8NRPflufBz6EaW0EcWEIM8LAADWgwDSRTJRJovD7XYrCDzMKcDYbW33a03lMAwRQlEUhWGotZ5Op5zX5TQZpXRvb7fZbDrnRsOJtVbKCmMSBBEhRCtbliXjBGNIKUPYEYLC0AcALBaZdJCzqNtDxriqlLPZzBrSac+nk5mUGgGMKEQQcMp832vGIcWAYmitFsJgjD3P83ympBkOh3Ec5XkxHp5jSgeDfhQ1MMZpmhzsXWu3+mWhHj9+nKaZKEqtdZFXOS9q69loNN56663z8/M0TfbZVUII58xaW1UlAJBS6oAbj6eTyfTi4uzq1esHBwcA2DD0G43GxXCytkprq7rp2a+VD+phjMuyIs/Lp0+faa3dUl4UAuAopcaBsiwBsBA6TCCwsG6VWR+kzj6glUT02pqDjdCCWWk817/iVROgdru9yTCok8FKKfyieOIm7ACvbOrrPWNz/6jfvIlj1rgBvNJrYHMr2sQlbs1FhwBAsKTCAecgsNZiiJXUURRxSrVUWVoBRzCknh9X1ly7+fpbb984Pnownc8azaDTbh7s7z58+BQioSRaLKpSaQixcSCKGlkiNiewib1ePXG3lNXCNYFOyopx/PZbt7/2tXc9zzs5Ojw7O7u8vCyKYj6fAwAmk1nEMCO4rHJlFAQgTxPKfUqI1trVItAOAmAddMuIwj8xUlirAK1jWlmWTadTSmmdVq/j7etbs97ON+9arbaymUhaVygQ9DyBVXc9QAhZC+oUg3MOQocxRGiJa6XUaCUCvQk40jStBf9rNADXJZ21ksVK3bkObyxj++i5RCNc8Q+gMzVAreNw9UqsT4eyuvYbOWfqq1GzCtbttuv9XmudZsWTJ0+eHR+dnV3ULbm7/X4Y0mWeAkGM9Xr+wDiEULPZTLNCKUUI4YFft4EQQtx6681M5J8//Ozpwwe+f6MRhIWUoR+k87GRJUKWO9MgiHGS52k+PvfplThsRC1243qwO/Ah9f0Aep47vzwDDhAcQiABosroIA4ccou00MoyRq0BUuqsqKbJPFvMMHaYAOgDagmChFHGKMDYTLNxWZXj8cRouL93nXFstMYI1bpG169fB8idnBxNRudl7idJEsXxtWvX3gBud297kaYPHj28/+jhs5Pjsix7vd6g1+GMtdtt2G0NtrfKslwUImoh4gVAo0eHR8k0f/v2O34jnM6zVmdAMDs5OVGH4uvf+vq//Jf/zVtv31rIo6KorMpaPpsBI4vi6+9985//2X/z+af3fvWLX16eX2TzmTX6/PQYQugxKDAaz+Z5UXiMGaUHreb+dv8zj2qC77z9Zp6XxaKo8mKinRLK84KTs8M8LzXAvd7A2MXR0XEQBM6BZJpiArqNTrUoRFrms5RR6io7Pz9xFhjjCA58Ggyi9sHWFR/4JM/TMIyNMZ393cFWj96nO1vbSbJ4+vQpJZxzn3oMIWS0g8BAYBgPPc8LwoYxIFnk3Z6yDgqpPT9sd3rRaDKdzbIir5U6HATOuVpiGcJaL9liTACCaZpaa5WWwBpMIMJIKZUtsrhB4kYjbjbyPJvORs12A9OeQyavCmutL0UQxpUwjUan2WxaA6eTi6tXrzLGRpeXF+eX5+eXo9FoPjnz/VAJCRyEEJalqHLDGGE0rEo1Gc/jRrizs+P7PM/zyWzMuZdBi7CxphQiKasFJjaMqO+huN1ZLBb1FiWlrDvOlWW5Rt9RFA3627u7uwihPM9r3beqEhBiz2POQuUqAICzkHrc9z1KCSYwCDyj7dnpuXCi2WxS1sxms/k0zXPJma1KUVWSIMw5Z4x5lGjuUUoRgpQizimEsCxLYRxCgBBijdra7lNKk/k0zzPGWJ7yZDZN0/T61WuXl6MkST799PPDw8OqqjzKwjCcTscQgH6/75xrN5q3bt0KgiBN08ViLmWFMQQASekQcpwjrXWrHSlpfN9XSmxt9Q8ODrIs833fbpD71umGtZmrTc86Dl9bba11lhWffvq5FLqef5oXoI4PE1IUuZRSSmmtBQgCR+rD1qy6dRh/kyuw6VeBVXh5DVxqK59lWW33a/Y7xriqqnUkeXPAFSPhpSzDS55iffw1cPnS5MKX7jpf6tDDjfzFGjE4AKxzuCYuEGyt1RZARIwDVSXjIOy0e5kaj2bzQiri8Ytxcvjs0WQ0nk3TrX6PsjjNdJ4PF5OpcYAwtlnbCV5xnTfnuQY6zi1VBAhBSpcQuigKtrcHO7vbf/Kj71dV9Rd/8Rd/9Vf/YT6fB0FgNCDUSpERjAedhgNoNEuqMqPMBwBAhxxAABgAEHAbSg7/xMOueCr1KqotT6vVUkrVvSLXNwW+SFvZXF3rwEC9ZuofjDGY0bUvvk5kOOfq/b4+zpqECwCwVsKVGoe1tqYj5Hled7Jdp67WM8c1Z8I9r3isp1QUBUWQUlrHRSDAyy+ytiYqwBVz6DlvAbrVk/h8Ydc1zACAumiQEDKfz58dnTx9+nQ8neR5boyZTqetyYQxz/f99VV16yAZArU5queWZZmyxvcDY8xsNuvstN94+/V3vn43WUyUERB7jWYce2y3ez1Pphi5BgV7nbjRDCgdcM4nadPznbajy4sLIc+CuMAkI8wUFUTEU9pRFqZZGcWBhRpAFTcawELG/IxUQmlCCMGMEEIIwARgiAAAyAFjrRLCaRhFXd8jo+HFxeWQMc9akJfKWRTHzaqqqqpoNKNOuxlEQaMRzebBwyfHhNCrV/YhRl4YvXXn7nQ2DqOG0hYA4Ifx3vYOYyxPM4JZVSbXXnuj1ey8dfvr6bz69S9/U4ns/GysBGIkfvrkyA+474fP7j9175tvfeubN25c+91H965sD1px/LtHH58/e/bWG+81w2B8cTm+vDx+duScE1XZbjeZzzCGz549hdSrhAIYPfzsc2TB93/04/2tfq8ZPXz89Jvf+t7R0UnEebfVBADlWTobjTUDjiAFbFGWlLOt7d2qKI8Onwz6vUbkhdSfX848x7pec3d3xznjd3r9/tZ4NAOOBX4z0GF6mnk6IHWX68ePHw8G28l0hjF+4403sixPFlnd6respFKCEBoEge/7izJzFiBEnIVay9l0/oW4f3Z68Wd/9l81m83BYDAcXqhMEMLqejnoYA0UPC/QzjrrILTGGMS4UqosS6uVH/AgWEaGt7aDKIoQQkWZSy26pEMIqaQkhARBwDwPQpjnue+HRts8Ly8uLr/+9W/cvfueKMrRaHRxMfz/8/anvZJl23Uotvq12+gjTp9tZVZfdVvelhQlvScJkvXcCDZsGf5bAvTBMB5g2QYsSID1YFp6pEiKInlv3ctbfVVmZXPy9OdEH7tfvT+sOJGnsoqU9ERqf0hExonYsWPH3nPONeYYYz5/9uL87Gw+W2TLvK5rhGgU0ZC5KIq63W6vM8yW+WI+H4z6YbjllwW9fodQNCg77U5ijCzyBUSm1293u11Ew6apAADWaiGEz39FUfjSgdEgjlKfbp89e3Z8fNw0jbUOY8xYoLVW0jjnOOc+VDHGOGdByILAQx3TWZ7fucMoIYtFlpd1yIIoSqxdG0ARghCwyiohm7JQi7m7c+8WhABj5JyVjfBZsGkahGme57PZDBM2GPSCICjLMo5DQuhsOr+8vKzr2rsrFkVRlmWr1VrMp6vV6vz8HFr3zjvvjEajfr//4vRksVjgtVc8wBgQsu4mCFm3Wq35fI4QGo0Gs9kEwp4XjIEbi9QNI2HT8b3ZDqeUe5jn+PhYKYUxQAg1jUiSOI5jREhd10LMm8YAAAACcRRsEF0fnf28vpuuMuDreMZmxbb5L0JosVj4RaQHh3yXxFq7KSBeSZPg6xpIcANF2NQEN9/lORA3y6ZNleC+QZB035xldaNEsB5gcc4BByC0wCEHwzBumkZr24qTgHM/sZnz0PHWf/zTP/3o0w84URCKKECjwfDBg9fjsMeD9mLZfPjR5/KjL64m46YRECPfO99E+ZsF1ua73/wvpVSIxldpUhohzGeffQKRvXv3NifU+20cHBwQRK0Bnc6KNIVzYDDsvfX2e5CyX/36w6PzS865rrwKYD0aCgDkgFszHP8mN6UUcM4ag67nnPlk7OWI36zbNmvxm8+7a7OvDagArhtSQtZ2I6eEFq/tjZ1UL80fb25Sms094g+jKArvcL8pOMA1jGGMQcZLFc0G/PBIWF3XBq/HTGCMyfVg6HX/6vrqgteNBucctmhTtn7LL36tBy6K4uTkZLlcerzNWrtcLq+urjgP+/1+GrLNTbf+gtZCCJfL5XC0HYZhnueVaJwDnnE5mYm4FX/ne+9dnB6eHh6uMtMJuRLaBXE7Ce/e2tP3drdGPQytlI2x6mJSay1enDw6PjnujcDb78DBVoCw0tZFKSlL0em2suwy6fSVboyTEGIDnJAyz/PVqqG0SJLIOBBSiqADAFproQMQIAQJhEjKqtvtd7tpkVdxHBqjyiwnLDTGNNny6ipYrubT6bjVjnd3t2tR7ezsZGWBL68+//KL0dYWQujs/FII0el0qqq6uLjCAF5djvNV5hz0w8YRLH/0W7+jGzO5WDLccga0Wr3xeGqtvnPn1nA4PL9oaa0bUaHKddNocXXhGvng7p37t+4THD/76smXHz/Ksmq1Wr3z7tur1WpvZztOuFLiq6++SsM+4aydts7Oz8s8T8KAItjURSuJ3njtbjafSWEZAVprURbZqihovr+//86b75ydnB8dHadxCxqbRGlIGLKIOKTy5uBgC9x948GDu/PFDOLqjdtvfSVfaAV3tm9z0AIKf/eNH5I//8VnaZo+e3Z4+u/+uCyzre0hgPrW7a2Ts27TNE2DZrNyMplEYee1+7d2d3crIU9OzrSYW4u0UQh3i0J89Mkvd3aHjAVF1TgElXHaakqpg6TM8iTtaq0bISEigFihFMAkLyujHUIRiwjB1BoShb12685oqzNfFJPpklDU7Y7CoINRFDLKGIMQUkdFKetKOAltA1phanU46N2eXBVBEDDeffj6zusP3mOMPXv27MmTJxcXF8aYMi8uLy+11srpuZxijBvRzE+W43zGGDPOXS0KY8zOwR3n3LLMKccPHt4hBEpVLLJZt9Uti7pq6rTdtgaMJzOEcBK3EIQIaSHk8fGJc7YoCgdMFEW+7ddqxWEYXl5erlarNE2TNEDIlWUBYcIYy1YVhLDf74dW6JXQoA4Bjts9IWpTVxEjsioAYwQlgAXWWim0c4hz7hBslOylvelinpU5Y/zi4kIpxVl4dHTEOXcObg2Gu7e3P//8c611XjTL5Rw4NxhuV7Ws6hmAiHEOEO71h03TRHF6Pr46v7r88c9++vnnn/OraV1qzgilLGIsjlMpNdASAkJh0JSgnQ7LvPnH/+h/KIuiqopBp1OWZS0aCIAFQChpgSOExHFsrTXOIAcpJs4B2UghBHRie6uTJrTI54y6ugKMgHbMe/3e++++d3R0NCeMQJyEtKobYEFdlz6WeSt1CCHGkBB6HYXNmtB9ba/puaXWWk9W8JeNp7j7ssATudvttiedBEEwn8+FEFEUQbgualut1k0C2ibmboxrNtF2AzPcRCZuLiXt10nyNxevL0PtjaiNMQUAAOj8JAYEAYYWQ6OrIqCIUoyQcgCwgNLAKVjWFjhhy5not5Nhb1erOluy3a1hsRLAqJjSlAcBsMO0gyC9uBo7/nK8tQXXI38QtNcyEw+3GK2V1c4aJCHDCCMMHepEPedcndkP/uTzT3/9vCzzQa9FKdneGb3/3turxTJfTnAlZzPRCvH/+f/4v35xevHZpx9iAAhWEEoHEAQ3R0Y6BwAE6OZJuHk2NuUauFGrvVJy/Sc36ADGBEKopfLFa8CDgAfAOqO0n24kG8E5p4xbbTDGCDhntGzMdZNL+jrJWUOwxWtkYi2gkLJeVwbSNQ2+JkOs56RcV0VAr60bDYQvnRw9+uj9325iYP5bry9dbZ03xoJwA4p42ZG0xuMBG9gDISSNdeBrF60nMyKEpNbWz5THgBACrXEGQgv9EqLd7oRhOJlMnjx58vjx46IoeBgEQQAAqKpqPp/3eoNerwduIDS+HDcOWmu9jtq7m2ywVUqpXlJVVLujgyRsaaEtJbPFdPjaHQPV7t72/bcfRmFwdHS4qgpKw7K0YhUog2aXrdmcFdpmiu7cTl9764AFZrqcDQfprBZBMsxWYjF5giGqRcFoQChq9+KrSRG2AhQwI3kpUCuNldJSqk6LRymrijzPc87fthZoo3rDlIa212fzPFcmK5t6OVsauQhoFAUxa/DycHH37t2n06OLi4tfXfypQ3A5mZZNXTRFEAST8bjb7RZF8cXjryIeGOAuri53d3dJMgqC4GKWz66mjw9PjNB39g7yPB/0+k6rwydP9/Z2fvDu966uLkDl+v3u7t4/+Gz16fJ42WpxSGADxPZwOBpunV1crvL5F189Tlvd23GvQ5K6Ut1tNs9Od3qDUrko2atW9Pf/P79ECNxK9x58/+5v/+A73394ezybXlxd/Yf/+IuqWMRhqA3e6vTeeHA3ZnA2OWqqeRjg7/zw9s721qcffexoBCIoICgM+M1nz1erVWOaL1+stre3V6vluChHo0FRZgdvdcnnXzzp9XrLZQ4Ri5Ouc/TwxelXT57VtWmE0toBwCDkjTBX42Xd2NH21t7eAXD44mqmdMM5lxCEYfjJJx8RHlgDsiyTUmJKfBu4laRKGWh8EQ2kn62AMaU0X+RKyTAMfdxP03Q02q7lCgAQRVGv3+l0WoyToiiM0X6EUqvVCoKAUh5FEaMBxlhK6an7zjkjlXSgrmtr7XA4HA6H1to8z4+Ojp49e+a9BUPGMcbAWGOM085CCxCilHrTFaVUmqavvfn6cDj03KK40j7H+IWsNcAZay1o6vr6/veO+tA5Rwn390kURfv7+1EUeZmTH3Pud+LXxAAAT69LkkRKaYwKQkYIaZrKWuvnN27CZRAEGFHnPAJMIURKaa2c0UA6XVeqqqosu9TaMhbleX55OU7i9snx+WQy2d7LJ5OJM5YyXBSFtTZgAWNUa62ESNNktVp1u92LiwtvF2GMCcOAYGaMRRghBBACQeDHqWkIqVTNZDJZLpcQwsViEfDWRvWwxlTRWukAAAD2pW+xX8K20qTVajHGfFcFgppSeufOnXa376GasiyrWhK8jrDG+LTqNn5wPlXgr7vSvrL+eyUN38zc8JrO5uMdpdQjWD6LRFHknPOe05vPurmE+i/dNvD1N4/tWzd3Q3lx80sxxjCBN6UfAACttSVIKYXJGl9RSk2L4iv41Wg0Oju7uLyYPD88OT8/F42hQUAxgteUEQghcusOOEIoF2WSJIyxsqqqvAAIesV5Ocucc3ZNJUFo7dZkPHekqCu9FIwTAMD27s7b5p3x048gWXV6KWUoDClhKAzAclmiterQ+1/5M/DfqPXwzc05V9e1R5i89kFfW45ugJZvIkzu2rZ547Xstxs/08aVazNeEoBrbMnXnVmW+RJho7f0BcfmozefeLO+BNcOSJummxACe1qPMcYYCK5JM4iDGwAbhNDa9ezWG/fCy692Pbx3rdqYz+cXFxfL5dI5hwjGmKJryzJfoMScrBWu1lprCSEQU4SQlBIZp/2YX7rmEkEICcbQAVk3RiqIUBhHIYsGW9vIiv5oi8bxeDb96IsvxuNxu93mQfD4KG93ExxCGnFl6tmiLo3Ia8m4a7W5LGC3nTgNWp22I3oxm7c72toqLxvO0rfe3P3hD34aBJ35NDs7vZqNF1GQMEJtzRqJdMNubb02XxqnLQaoKso4TLSUnTRBiARBSAFqJ0mZ1y+eX4pKhDw0Wi5N+fTR41qK73z3u51e97NHXwaUfe/97xRleXp6mlf53s5ukiRPHj2+ms85wP/d//B3jl6cfPjBn54cvpicn/W7A6sKLcp2MspWmRALo6I02i4TdHn5/MWLL4hsc87TpIcpNcbUdd2IVZHZoqydCQIeIcfOTyfT6RwSCgDZ2hpFIWWtJNxOEKDOmTTt/PjHP41i8uGHH3a77Tt37kitb9++/eYb76StzvOL893d3W7aBju78r3vAGARBq0kRhhyzher5bPDw8VqtZgtOedSaGONkjZblUYDo+FstsrzfLkoyPnpoiqMscrfNUrqR1+8OL84i+PQGLNex5MWo1wJPJ9Wlbh4+PAhpdyezxEihHIA3GDQa6TWTaO1Ns7yMIiiyF89axCM4JAzz91tpLAGIAiFVo2QXj0ftkOIUVlVZZ1D6ABYW5UBQBhjCPEgCPwtba1bN7BdtVqtdkY7nPCQhRRRGnjgAWutrQXXHTV0//6Dfn/47Nmzp0+fckQJJpBCiTSGWCltrQE+5RttjAniKIyidqdjgEuEcNJpZb3tGgRISosQ0tp49pbnFjnnvAYQQmTMmtLspf/gOvT78UtCiKIo/LI1SZIoikLKFouFtXpnd8ubE2hNAQBhGG6Y0oQQL5J0zk0nGcY4WzWTycLD5ot5VhQFQshZ1NRqfDVbLsrjo4vpdBpFkVKqLMu6rLxvlZcLYkx8YyhJ0ul0Sgj56vHTJG6VRS2qOgkjjHFdizCIooivlGCMOQOAtRQD1TTjy/Myf21rMDw9euED5Zo25WmJ6FV3gY0SzFprDAjD0J8czjnndRRF9+/fvxxPj4+Pj4+P87zw7wo4a4S8EdzBKxn2myAq+EZ+dTf4BJsWrzHGd5F8egjDkDGW57knoPgX+EIB3ZCffTPZbP79K3L/BsS+2ZV4Bdn+5rbZ7Te36105X/FQGkG77suUVbNarCZXly9evLh9cKvfHxhnpWy2hoN2t1cW4uLiQipgLbAWmjVtEkAILQQch9Bg0RirIeOxlyrU+ZJibIFDa+WnsxD6SQ3arBfHZaOqpqGU3r179979u8HvvPnnv/hAGzienb84PTk5PwcYIAoABBBs+Pgvf76/6XLhlesBXEsZi6Lw8S1JEgihvl7AGGN8N+Qm9uPrSHfNJfSua/rrI6QBANc+117V+qplk1JKSr2hMa0XHl9XW3zzd9/sfJP7/aFCCDl5KT0wYE04IDzwtJKbtSlYa3OuJ0RYePOr3XRNGI/Hl5eXSqkgCPy39vWBMsY5uFwuX7tzQDmL49SvKzDG4HpXmxNCESTk+lBrRyDU0kRRsrW1tbs9iEKytbt3fnaUa3k+X16NJ+eLbJqXkvIWIXN1wdA2beFYpasSVrJqllAbTQnsdOyj+XEnJa2Q/sO//3q7m4ZgvIJ/0uuO5jOsFGu1RvvD14aju+l7o6Yw/+GP/3wxWyIHojAkGFyszs5fiKQbOAljli7BKmScArQ96BNCiqJKAppGnEO8HI9PL0+BhTHnl/kiTZJ7d+6Oen2A0bDT1sYgaaBS3TjeHwy2toaTq/Hi8tJZu9NtO7GCYlFMT0w9v7ff3x4NGTKlUVV+mnCyvx3GoTRqSnFFItBKuBVdrcxkNoMQJ2lbCmiFa7fjQb9nDFXKCK0QhISgNI3SdEuAK2tQxHhAuZJQVLIqyjjiJycnz55/Ndrur4rcWfjGg4eT2fL87Ezm5VidPoUIE9gO46QVO2eMVWVdC6WXy+ViVXSXRVmW7XYXIcQQJjR2gPUHI87pdDrNc5FlGUEoaRoEIIWQMBYiZOtalqXL80xrfd3QjRAKlaJSyqxa3b4FrHPGIsZjrU2jdLvXxXnVSNlUtWgU5YxojBCRWlFMAIIBD9ppy0fsRirVKGMtItgYk0vZ6nSHwyGldDFfQqx3d7d3drbDiBOCCEXWar8oX3MarJNSY4wZpUEQOGMnV2PV6Xh4kAXcF/Wc86Ioaimsta1WqzcctHvd4fZWfnrmnKua2hhDCCmbOi8zKRTBNIlTwkgcx+dXl/DqstVqtbud7GJqhCLAtaIQAiKZRQA3tZhPTwCC1gCllLHqmlJA/DBW3+eL47iqKn87+f7iJiT5W5cxFjE+m80IQd2m7alJniF4HZ7WBZM1wJszlnXDOYcQL5dLXyhIaZ3D1sKqbIAjSdyRUk0ni2538POf//zo7DgMY6u9Zlp7Vqm1llJOMAMABEGotZlP50+fPpVSLpfLMPTgikiSyAFVVpk2nHGmjSMUGGuybCmEuHv37ldfPSpr7++EAQDGOeCscdYjkAB4nhOENwwKlVJeV6nX4yUxAABjfHl5aYxbrVaMB0Iar2kEQvpM/a358mYM3UTGTfWw4RhuguyGVmmM8aCOD/dBEKRpijGezWbex9fP1L4Zal8J5Tf/Bd9WRtxMVOCapeGf2SzRvvX119/i5dv99ayUsuuF+Es0BUIIrDXGYYfqSjhjiqoRSivRfPjppz/50Y9u3b595/a9wWCkpP7Vr/5iOrkoKulPoOd5eQGqcw5AmOc5cI4yFrVSSilBuHKAYl/TIOcccJuZVwgDqLRxAGAMpJTHZ6dRmhwc7F+Nx8cXJ++8+z7ihIcsSulyqdKU5YUEAADkvDTPOd+CQAD+pWO+/xq3m6iSz/eeptdutyGEHpj0FbkvFDaNgM153vyOr9AUbv4WN2yIXrJb/Os9D9p7T92sMDaV6CYsvHJtX/8XbgoFH0UxxojRjRPzzbrk5jFvNvfSf8kihzYveEmwAKAsy/F4XFVVu932Sx0PJAghyrquazGZTFRdtLudnZ09j3pubu0wDLW5tqO49mYAAEDrAs6MMa1WSwxGPAyt07NF9vnjp189xzxkBrhKOxy3cuPyRZ5uBw0urUM0jTgismCYMM7al2en+VypBsiVJQM+6rx+dvzsyePjzgGJhzuFy5bz3NVgdmnaQdjdf70B1d/5na3J5dXpydGjLz5fzic8wE2tGA1yVcjaiMpYCVaLLG3FWglKMGA4Cuio18fO5ovl5HJ6fnaEo/SdN98ejYbnlxez+RwREDOezaZaa6yVATabAKzUG7dvK6VUUT799Nec0J0O74fDTtrCENV5wVo2W7wIt4atFIjmqqotY2R3b3dvb+/jj2eXF+N5Nt3fu71/sPXi+Gw1z3bg7s7OVhDx8/OzYjxzARoMOeOakBwgUBd1UepZNccuoDiYjceHz59sbfd3tnaDkC5ny7fffb/T6//pf/yzIAjqRSGLYjmettsp4cQqLVSTZdnp2dlymQmlrbJcyFIoKiVjQcwiSqK60nEEIHB51iAYYiQJhpFWBiEqjCUYhmGEkei0trIsM6A2mmiFrYYIAKNMXcvOsCUlMsZxlmBGi6opy5JQmrRiXBMLLCYCIQIAaFQjhKIR8TQcylmImXWOUS6E0lpPLicNl6Nu9+6du51eL8/zRsnvvPX6gwf3W6304vJstVp0uq00TaMo9Cs8QojWBl77f1VV1UraCOB22qnrWluDIaGEUsaUUgYARgOAoFRGmypJ29/57igb7CyXy/Pz87IpCSEawKqu/ZBynzBYwJqyKlbZMo5HzUgvyiIva6kgwAiBgPCgG6jEPn/+AloMIEQIGYOUttZp62AUEl8fXFxceEzbz1jyWLFnWSOEfKSo6xo7QCmNosDHpk6n0+12AADebtb7rntSpJQeq4DeVEpKWdfCg+eMBlVVOeeMsVEUc25Wq1WelycnZ4vlsq4aX3n4EAMAAAApZQgheVZ2O30ha0rpdDpL07TX6frxBBiCOAwwQXFEPdUUAgWcZgQbo/PV8tatW9ABL4haCxedg9b4WbN+tDQjFGOMb/gUcc673S4hpCiK1apqt2II4Xw+l1JiTKMoiuKkrhtfUmwC5To7XecpcGNRfgNQXYemVyL7t4IB/nkP+XqFmO89rVYr5xylVAhxM/j6DX4bhvHXu7kboPfNQO/j+ytgiXNO1LUxxhBstCwwxBi1u0MA7NXF2aOvniJI/t7f+3tvvv7Wr375QZHPITAYEHw9MNlCsFkZd3pd76bnACizXEnJOB/2+nmxuqbHXU8y9KcWIdlohBDEMC+LX/7qgyfPnr71xhvYXmV5OdzaOzo+e/zseRBG5eUKEAMQ9I7DEALPlH8VYfib3zb50hepHj/YnPBN+ehzt9soYOGr5eDmUnTXFl7Xv9JmwONGiQM2gsa6rptGenXDTbmNLz5uVgk3a4VNofDyxdffwjdwr2+E9ZWplHJgnaT9QW4OdXP13rxf/KdzzgEA0+n08vLSGNPttebzOTAGIegp2A6upZhXV1fK6ChKkiTx74KYXh/nt5BvoLYKqWKVKSGlVNNpXZer8/PzvKiVUtJIHgTtbodwVNd1I1SvG19cTYxG7c4wQnEjidaulqjd2avyeRxti2YlFWek+/jx6ScfP/su2xVb29UMrcZWBPjsMC+Wz6qcvfbaw+H2dpYtb93ZM7Y6emHefOshMHpyUR2fHhtVExQDR6VoRKMQBldXJwhgq3W0H3W73Vu3DgbdYRzHR+fTzz/59COlFtmyamrnTNpOdnd3w5BThgkOZFE2ZcEgYAyrIsttxgeDABgta5Gpuimbsmy3EoqrYnUuVFOJpt/vtrvbFpSL1floP71arE7Hj5bFlTBFWWiHaBDCLJ9EEcO4FnqCHen1B0IWRZnFrWGWT4zETe44aSVhVwgRMp4v82U+h8gKJfOs3D24VVXNqD8wRe2cw85C56qinEyuainmy9nJ6WkjJA8i7SzBlBCGEWc8XKxKiGez2Sw4PmeMlWXe7XadI0QZJKXkAZZSCW15LWbzedNUTdNobQCE3BJEKaZREIaYxtq66TynlFpAMEB5UVZ1mSRJp9duO7gNtrQDWpmmkR5j10JbA0xZamOSKOWcD0ZDY1y2XK1W+W7afv/dd4eD0fPnz798/Gg6nScxJgR1u535YmqMGo763W4XQuBr5yAIjLFlWTvn6koYY8qsmF5NDnb3nQMYYimUkho2wk83QATHQWycK8uyFjJxIOr2Jlk+ybLFYkEIapqmKLONHJli0mm3Rv1BXZfWWlOLdpooIZ21Rru6Kg3RLEgghBRhAyCCBDPqsRMIIULEr1AppWVZegqCvabrM8ZulDvaJ28vsGy1Eghh0zRx3E3TFFzLljYRA2OMsY9K1jnnjVmapqqqKo5TrTXjzIMoy+UiDCPGWJYt/8N/+JM7928bYxDChFDnAMYIIwohzIsVJzTPy4ODTl3X7XbXOdfrDY6ePm+aJk4iAF1eLAG01skgTBhLlK6NFZRw68DV+HJra0sIoa/H2vrjJIRAvJ7G9s2Q5xc0nvzhI+zOzk6v1/MK8m533a4yFjinEUIYQWVfshNuJtENOfzm5v+yObGbguDmompTc/jnKaVZlhVF0el0/Aopz/MNv+zmOvKbQfA/p2K4WWFsvsV/8i03CRnwGlTABG4EeJ6MaIxBACqtrIZVZZUWaZr2eh0I0Wh7v8qz86vL09PTbqcjVcMIcFogCCFwEDgHLHQAAQuRgc4U+cJY62t6gp2CVsp6PDmn3CsbAfC+Ds5BCwy0yCFjjXaAUEoIWiyy6TQDwP2d3/5Of3SbBe1//W/+1YcfPY8S6hwQ0gKHvRkQAABC5/FqDMHfNJ6wOeGbX2FTI3qqR13XQRD4n8lXvc6tX3xdKFh4AxJ75efbyHQRQj5T+pdsVv83C4W6Fh662FwVG+7C5mJ75RrbFL6b62FTUuBrX3NrrYVgI6Pw3pfo5dj3DS4FNwX05uQQTKy1XiF5dXU1nU43x+O83+KaeIRueplIKcuy9LwHHiJKqZTSAbTp7vn9I4SkEbIUZ2dnF1fjbLWAzlktEHQBTThzTdNAhJELnHLYuV7atq7KV9oC0OnzOAiEdMtlNp1Pd7ZGtnSIIlFqad0sLwxgPOrKcpQGD28d3LX2aDqfPT86NYfHp+cns/xKSvn4iy/vv3a31U3DaQwQHW7tDged2VKcnE3DsI9ITDEBEDJOjQWYkKyopvOZ1RBANNreSpJWqbGUjVJqa2ur3e1Yqy0wrVailSAEj4b9OOQvnh+OL044ZZ1O20hdr/K6LkVdwpDpplKqELXRVkudY0LihA23+4Ot3myxqGYlCStASh4BSAULESbJp5989ed/9osf/ehHrz24W1ZLSk0U414frzLloKTENPUqIGkcRRAgB8yg2/ve977X63d+/etfjOdXL46OPv7wk/v3H/7jf/S/evbs8MNf/srXlp1ep1Eyy5aUs7wqZaNCHnIeNo2kiDMMCOIBiSpTQYR6/b4npPv5QXVdEweRMpY6oIy10llglqtcKaG0wBhTHvAwwohiwgjlELlVsVouqjgOIQZV05RlZqxCGBtrOecsDBgixhihGqGkcdZBCAlSQjZNo5Tp9/uccSk1C/itW7c67d5wawsYtxn4/etf/3o6Hd+5c3sw7LXbaVVVX3zxxWq19Ay4TqfDeQAA4pxb6wAAom5mk2nTNMDaMIkD5xwAFjjCGbHGAme82J1grXXV1Ofj+dH5+dHF+XK5DChVShkto5BTiqscxDxgEO/0BtZ2rDZJksiqZBRjGBoDynJRVDmuVCONtVZbB5wljEKECQaYIMaYFMKnQE/Wc9duLeB6Po1zbjO2wMdlf/s556qqSpKIUuozltbaGGktIGsvamiMUVoB4fJiaY1jjBhDGUNSaoQYY7isHESOBySO0l6vK4QghBHCoAMIrSOLxzOMdjT00/OAUms2YpIk/V6Pc/7WW2+2WkmWL4WoGad7e3vz+fyzzz67OL8EziDgVoslo3RrNKrPxj7KeIE5psQT6/yKB94w0vdfsyzLy8vLPM/7/T7lbH9/HyF0cnKWZVmvN9Bay7oB1yrwIAiMFK/kS/8Y35jm8Eqh4K41YzcXfJvA53fiY5yv4fyJLcsSY+yFrH5lebOe2MTW/8z6YLPZa0HaprK5+eQ3N/cNGt3m+2L8UnrqD8NaGxDqjIUYO+ekMg4giIhUTcBY0u4EYfzixYsqz4A13U67nYRNAZyz2minHQAAYoQhJBSt8ioMKYJA6SYIWaebCiFWq/w6EWIIoTdfNs46a5C1lDFEgFKKB1HEwrKsK9F89vnRG2+89cmnz8/Pl1KDFo0ZL72+AjkEAQBgPXwBOl8k/M3Oetic1ZuP3bX4sGmaxWIBIYyiaHN7ro9uc1HBNWK/2a7ZNuYmEuCc2xQKNzsFG4GDH+JwsyN28/fd/Pcbx+z/DG+8GPgCl3POOfc3wkaDgAECN5xJEUL+9Riv50G/Uo4wxqqqIoQ4iLIs80Cg5zxpa4zRfud+1oNSaqvf8bM04bWpib9ijTEIvzSS8sHNB7G6rs8uLyaTiairgOCAE4LQcjmPoghbDBV2jZNSWweiKHE0DsmibOpy1YQJ7nQTGsDz8/zpi886SWQQbw2iMOVPDp+3Br1+scNYK04HvZBqpwuZSbNc5stCjQFvDm7d+f6Pv9dq9VTjIJtfXpkf/+Snk5NlVeOLy2z31ojQFPNI6QpS9uDNd6AD+TLDPEAEsShWDp1cjJdZtru7uxNxbQxhxAGT56vZbHbn7sFkfFkU2d7O/bfffD0N+Ww6zrMlC2xpCq0VIzxgnBKEodFOW6cBckk7YQGP2y0aBqDAjAe7e/tZVrVaV7NJ8/jRc057dWXLQj/68lApkxfTMLadDnNW11UGgSbUJTFN41a5sqJUCFkAAKf8/t3Xoig4fPFEa31yekoIuXvr9mKx2t3bW67m4+kUV6VSqhZNEIWU0oCFYRRhxBojGaQOA2SAaVS32+33+1tbWxjjXq9HCPnyyy9PT0/97w0QIoyxMORxHDZN7Wm9lOFOp8NZWFVVnudFUUkpu/0B42EQxULURVFUVW2BEVJShlkYhCJ2DuZFtVplQigAQLfVw5gKQuqiXMd3BKWUnU5nONjCkFxdXeV5kXbaP/3pT4VQFKnZbDKbzVbZIooCB0xVFUI0Xr4fRRHGBAAUxzFwaLlciqXgnLfbbYjRaDRiYUAodRDQgIdhSCnJsuxqMm6apt1uD0bD44vL8XJeK40wRZxhCDCBcZQWq1WNADS6kySL2RxhwDDhmJydnWVZEccpYRw6K6W0wmQeN5PaAkSdwx54hxgRSi31d3gQBF7X4DlTHif0q5bNDeZreZ/M1vnbGF8PIYSEEFVVG+PCMAw4klJWVcVCBqEDwCZpwnlPShmG4Ww6t9YyFrRaSZrGUsrjkxd+2pOHHYB1lFKInGeDrhsWLLDWelfj1dJ5QeN0Ou33+zs7O/fv370an62yZRyHt27dkvIgz1eTycRoDQDWWnc6nddee228KAghymittTLGQUAxghB6WNKrHvz6FwKAEFIW5HnunNvd3Y3zLEmS6XR6fHwMAIjjmHOutKEEYkw90dUTQjdRb1MobFoPaOMQtw6rLxWJ4OtLMX/a4bW1s6+N/KWIMa7rWggRBEG73UYI+QEom51v9vNfVCVswv1Nducmtv7V77qZPK4/92Y6WR+P1hpYS3DIA8QCPhwOu4N+lWfL1VxLOer3oii6urqaTydKNAe39rIXY62157sAADAilDFCyM9+9qPecLBarT744IOLqxVjRRwHlAHj1mcbeoc/87JZEASB0rWUrijKdjuyFiyXy2OJOt2djz/+VAoXBrzIBXDEQQcAshAgZwFA19OhAAD2v02h8Mq53azmhRBZlnlu0GYcFLyxprfWQrRO+TcLBY8R3vTzQGuDUf/Gl5jTK2/Z6FasfZUy+W1VwkuBAny5AQCArxIYY/4S9WsAjDEkZNN6gGuu4uYXfLmrzQd5dBNCiAnxXwchVDeNnwGmtb3eCUaIbEpe7k3gw3AzE27DxIIQehfl9e2D1lV4URSiriSCOgygM9AhhhhAgLGg1ep4uCVAAY3TNJoV+fnlxTTpVPdeu9PuhUpnxqwGW+nV+aWVoMhWCJt/8Pf/fpQmxdVssZq4XFVqkXZx2mnb83I8vXT0dnfQ/vHPfza/KpVgRvZ//atPZzMapQNEQoiD/YP7w50WD8FyNU5S/vTpIwRAWVQ7Owd3Du7J10y5qh89ejxb5kEUpq1kvly8ePHiYnIBgB0MO48elVHIe71et9vN3DxJIwAHnPOmXmgtrYEGuLquHdB+yFu315uv5lVTC6O6ShoHlbaOmBdHZ0K4O3cfRmH5+PPT6fi8393/7vs/hRACy1bzOuBJwFMEeV0rTEwAdaeTJFE6vbwoCxt2W/PZ7C/+4i8Wy/n9+7fTpH2wf2u+WP7e7/0eBPj+w9f/wT/+R8+ePfnoo4+sM3meex53WZaEEIopABBYxwh3BjptRNk0rjZWKS2aptne3u51B4eHh4eHhwRhESfI2KrVjtrtNg0Yj+/WdRlEfDQa5cXqcnypcHV4fDif17u77SgK6py0W1EcRnmeW9MY5+pKKttQLhirDXBKKW01oogQktUlRRghEiQp5YEwzjrEwjRp98IoxRj3nRtujdrttrV6sVhghO6/9UZR5YeHz6s6G25td7tta/T5+blsZJPXohKyUdm4qMtaCAEZrkvxP/6//u8Y4739A8ZYJSSllAfBwzffunvvHgBouaq11hAJ5zIUkv7OkKdhVZRGKWdsU1dVUcIwbqdJGMUa8kXRMMYI0nZRyoYnUdzUTd2ovd07xtmz88tKNIQ6bQxjpGoyqEmSJEprZCBnXGsNIZJSaZ0RQihlCGGMibWOEBqGnmwPGeMY40Y1qhHW6jDyjoFUCeOMq4qqzDMPVNarZRQHGGMr80qgg4ODN370I2PMbLnKs1Ip3Wv3mkbWtdAKSmmcw73ODoTQGDhs95hjZZVrPxTOAENsEEUqz1jILi7OopBv9TtKyHbEZVH0Wq1bu7t1mf+zf/bPsiKHGHW73Vt379y+ffu3/9Y/+PzLF9Or6fZotFosnj8+/Nlv/fyzz57mZc4p7WzvWGCUNdqYqqmbpsaQrFar0WAktKGYZ8vVYDAQsswqyeO2w3Q6y6U6hhCWtUjT9pqOSmkUhstlFnLinG3FkSdGQYwppQBAKaVQIo5SoaSxBmMMHDIOIIwYY6IsIHTWmna7l+c5Y6QsZRQF5nqKIMbQGFVVhQ/fjPGyLKMoopSGYbhcLu/evcs597NMrbU+Fm+KjG/mkldKh1dWbDdbJK9E/G9NYxgTY4y1DiGIkEe/KaXcOUMwI5hYpz2/lVJKKZGmlFaKvDnY21UK3N7dCoJAUBJYZ4w5fX783sO3333z/Q8//PDR51+8/fb37z9c/sc/+cV0Vu3v7pVVM1ksd3cH3/neew/evDsa9ZfzaZadFquV0wBLFUG6MgBj/xWMMQY6gzBECDhryqpJkjgK4qIoVksZBm2nceHq8/nk8PzMGoIQ5SxUuqYEMY6yPLcQhCEzGmpFEeJaW4zrzWm5eSZvnuFvPvnN7S8r4G6e9pv7gRDWdY0Q8n0He60msMABtF4ur38+Z5SQAADsAHZAaWOlslI5Y4C1hFPoIAZrSaQ3nDTAAQu1NHXT+BQohDIOAAQ988ZvmwWDu56o8s3vwhlSShlrMcYIYQAchGg9M51QgInxrQXKHSbCGITMhrR7vRqBGCOlzCaRQ4AhYBgFlASWkdZoQJJ4NV/kVekQttZqbYMAU4gRMhBiAgl3lECKEDIaIxhQEvrpwc5iP4QyCMKyqnwjNa/Kuq78x83Gk9VqZR0M47YyzjpQa+AcSJPUMX58cvT6g4eFKOq6JIRECV40F1EXdl1cVVUaR92knaZtbuIW6oq6ubc9MKJhBBAXf/nJ5c9+/CO1e7GS2YOH93fBzovDw4gHLz4/bbmBvLTRw7S+rHtRD3db2bzsdoPHT34z6BkNLn74W3fv3GpdXV2+mF0O+wMD8Fa6XRVlJeT0YiHLZ+2kzRhbZXOp1WQyefHixd27t1+7f7/bad25c8tY9cUXn22NdngYOcwKbZ6cnkEIO51ONT9stVpSg6ouDWKMhRBzguEyr3k4EKLGBpeZCFgWIFoVVcMPg07cGvQevnPvzXff+f3f/83hs0lQd0f9USWb3mhAA1U32WpZthOYZ8vp0V7TBK52o/7+zGWVLHkSHV8cL8vlo6eP/9bv/vb9+/fLqjg/P56MD68un33vez997423ZpfTx4+fOIlD1CUgbvM0y7Ko3bfW7vRbAWYKyqque73e/DTTRb64rBAln356hAhmnL+4WpEgZJ6izhglxLtzOAAtxhgTyBiN45AxUhSZ1hfOOa/vL8vaU4EIIdAhrbUSDcQIYwMwQghhQCACAAAeYKedtdpBV9e2aRpGOGMBwqDIVhjDKIrSJLJOAmjTVmiNZCEKAUlSZiHXWk5nk6IoFrM5QYRRFscMQyEbLZSua7WazpMkjniSFfnnnz4LIxomsXNua2c7y7KyKFrt9mgw9DDGcrWglBqjvDsyCUOrjdGqtFZLVdYVhDAvS084kM5BCFut1mQ+a5rm4ODg7r37y+VyPPHTHGQtRYQJxtgBKKVUyjDG9Nf9AT3Rb7OMAGADA67bkwA4KVWjTS0VANYC1OkNwjgCCDtIfFtAKeXb7FletttthCCAxgFjrVZaVFUjlMKIAmARggg5a50Dxi9G8nxV1pVSCl4vfZxzxmjGWFmW3W672+0uZ9MwDFer1Wg0fPfdt4fDYVVVazYlIWVZnpycGO0W0wXB9MGDB1a78eXlbDa5vLyMYl5WmdKiwzud3sgAN18shBAIQEKIx0uMMRhA55ynDWqtnz9/fnJycnV1tVqtGGPeVqGqqvl8CQDo9bqtVmKtLYoKYxiGESFMr4feasZYnCZlWdqX2hDr+81aa37tEo2uLXXruvYdB3CthtiQvDyi41WpURR5yetisfAX9jUH/qUybRPE/0txhf8Fm/+tbpj4YQghgBaClziHUtIzEL0q2JhmuVzGcYwAfPj6A+fcn/zx1XQ63dnZ2d/fPz1+8eWjz3/4w7f/yT/5J9Yhodx0tvzks8/PLs9++ctfHp883d3b6vU677/7ThKlv/7Fh/OZIsg48pKgR17aWsPBYDAej/O8HA367XbaNA1EbrGc94O4aaogCAgJrPGGH5IQnq1yAAFlwForpUYwIAQhRIyp/6bP5Ldur7QGNlQbIQSEDrqX/FnwUjb56gYhNEatlQtuTWWwxhng97w2ZdJabpQOr9Q9N+uhG8jEDUDCQQAxJsT7K6/BCePanV6StoMw9vsklGGMATQIrq/wzQ79Wh9dT3vyz3gQxd95XsoOAJjPlwgh704GXpKKjFIOWgcAoJQWZZbUsdYSAHttJ22MUdZSTCDCwFiljVRaFKWo67rO6zzPjdZxHBIIpGqMktaCPF8pUcVxHEXB1cUFxvDBg9fv3LljqDo6Ovry8VclYTt7u4NOV2oNoet0OqgHKUEXJ8dnZ6eMYAft5exeewCiuNXpDoC1vX5BEB5s7xw+PYQY7d7eSwZdpxzg6Pbdg1pUi2X2wQcf1HWZRIFSMkkjTLZaaZymcZ6vptPp5eWFUorz0ISqKGQcxxivfE+qrute2Lt//8H29ujx4y93dvbefvudnZ1tHtB+v//OO+94dOrevXthGJZlsVoxhAAk0DqNkFParZbTMOR3793uD7qz2cTzoghpOUuM1HkzUw29td0DCmhZOp0jYBACFBAgkSyckkhk9Hw6qSvR6dhedxgnHQgJwQHCHAIklb28mmndRHGyt3/HWPj48dMk7Y1GI4RdGNFut9vp9Lr9YV03GNHpfMY5v7y8VEqIRo5GoyzLbt8dKWlWeVaLqhFlzFphlKZJSJRqfBi1TlrHgbXGKmMUgAYhGIZ8SIZRFGxtDU9Oj7znYFEUQitKaS0aa7UFTilzDbKB9VW6vvwhhMAB44BzzkCAgUPWIefw2dlRvlphjHd2tnvdtrXWORMEgTZlXMbWWmkqhA2AxtfchFAMCXDEAoARS5NuzNvOuVpIz5mPgzZwJUGEEw4w6rS6O6Mt77m0yjJPhOx22/PVnFMGkwQBUBVlVVU+kXio3OcbhJBx1ii90jpfVlEUhQhVda2M3t7dmSyW5+MJpdRWtV0PsEeeMm2McXYdUDZVArmeqQhuyOh9l0FrDQi1DmllG1kaY7SDvemi2xsoiwxEDjNnIdBAAwgBNBALWRblki2JMaYRNUKWMqgtkLK2zmHisIVWaetbyxh7uzTnHMaAEAKQs9YoZTGGRZFtD0ej0WA1n4VRsJjPEEL9fndvb+fjTz+hlAIEgygGAGBEV6vs8uyi3W6//uDh1cX48vx8tVotFrM3XruLoFksszjkO9sjY0FZlkoZpUwQYMa4Py0AE0SgVE0UB1EUeY9YrbVnNQ4Gg6KoGGNRFAghq6rynNBWK7kOcNBCgDAAADNGecAJIWZdKBBjDJPCr9XQtUbLExEQQp6Z6GMfuHZ0RtdDcfyF4R2WiqJIksS7XOA1gAHA14Him5lmE+7/irrhL1sE/2XPO2cAsBujSYyxf4AQgsgB4Fno1Ji1cIYx5l1ufM6bTqdSynaa/vCHP6SUfvCLP//44w8//vhDynBdlGmaTq/G27v7aaursyaO49/6rR8cn40++/xjCGFRZAS7H//op3cO7uWL4smjw7oWtbHOGS9ztRBCiIF1wNnTk0tGIaeEEFLmmRJN0g0zB4xSdVUwSjBC2oFGKQAsgg5CwBjAGFpjGMUYEWeNURriNUf1P/N8/i/bXsnHm2d8Bz27jg8IIYiRcwYG65NvrUXf+KE2zQLwkiWjgPNsWWCM0dY6B5RSUq0HRmstjVHWav+yVw7sJlL1CpTifZT9peiLQm9D3u/3vfucL0F8TQwhhOBlm8xfNmuFy3V3AF6zIH2ZEATBYDBaLpdFUU0mE4wxAIgQZIzxlJjrI7HQj4q4Lg02Ck9/zB4O9K/3XQkhxGw2e/zZF6vVqqoqBKy1VtSV0gJDFIeB1jKNEwydEPX29uj9d995880383LaDUORFWeXVwljoqqWq5VQ8uzs9Pbtg3uv3U3TUDo5vrz4/KsvVlX2/ndfu3P71n0FoQMaICHkrTt3p/OFcjZOo6JYXF5N09YA04DF5OjLw8vLyyRJjBJHR0dhxCF0TYMHg57XpgWBH2oPpJQvXrzI8zKO09lsIUTNeWitnc1mGEPfPo7jOIoiiFy32/fFVpYt1fwFIWSxmGMEHLQQOqlq5wwm8WCQxHGYxBS4ptOOkoRACImMoqTlLD06np4cTpyie4MwW9VOLzCiGEIgYDnTYqEbIavSFtIUhYSuaSU4ClvOQeBwGNA4jk9OTj78zScYQ4isUmKxyFbL6t/9u//v66+/DjEZjYatVrvf2xpt72JMT05OT85OKaXL5dJavb+//3f/7t99cXT4m4/++M79u68//Pn+nbvGwkbp8Wz+R//hP5K6yZ1zhBCtkTHCIWKt9rIlrSVCKAzDwaC/tbUVBMFkMhkf51JKZl0Ueakx9A05ghkE2BjjPXUtWGOtStaMEGuAMTYIojRJMSRNU9dNIUSFCazqDCOttIAQxDqWeiFMCCGUWkhroXWcha1uByOipZONghYGEWu3A0Y4RWS5yHZGO5hAB+Hx8fFXT5/spa3/zf/ufxu3YkKIELJRTbfTanc7dV1fXV0ZqdJWHAWBKKvpdLqcLzAEnPMoCJ1RhBALHGZUKaWNbppGFHJ/fx8SPF0t9KNH3W63auputyuNbpQG6wYetVKubx7w0twUfJ0ej25IqjZOcFIbAKF2TkurtVImu5zOtna2q6aRykKIMYEOIB4EhBAHMba5UmK5mmptjYOUcuec1EqVAkKPTBrnjHUOAoicg5AiBJwDPuU4CJ2zAFjrgLXWAdPpdAjFzjkPHc3mk739naqqgiDQVemcY5SnacdaK4RqtZhzME7Cfr9blnlZZXdu79VV3lS5rEstGgOgFtJqo5QGABJC6rLykYsyYqyBkA0GgyzLAABpmvoT0u12ve9ku90uy8pLEwkhYRgiYiEEzhmM8cat0lqrtTLOOgusbay10lxP8AMv7Z48UOEVIjcRhZvgvy8CfKfWFxbex2KDPWyqBP8Wa79F0ffXntsghN4T00dnhAGl3rnPQri+uiB0WtskbXlD3xtHbjnnEDqlxHQ2ZoRqLTHGsm6Ubr6o53/wB3+4vXtw6/Z9beFguPWdd9/b298OQpzni5PTo5Ojw+FgJ02SMODzec0i6mkfAABveAwgRIDEEUII1UXVbbd++2e/tbOz04jqX/3Lf7mzP4qjtqrkbJop5TjGFDGGAWRQaSeEAw4wZp1ptEIEE/P1swe/bTTGf+WZfOWZm9QWb0cGIZRSBkGAMe70uoQgQxm4vnkR/NrQ8Fe7SMhBCCAEdq10MNdOpG7t2qyFNje8leyrjapXagX7dfarhxMARFIZKSXnfDDc2tvba7U7nHNMiAMIomuFjjO+rNl8x00sunl9bupgzjnnIWPMWXhyclbXwjOrRN1YawFwCDmMEcaEYkwwgdClrTSMOCbQOm2scgD78ZjWakSwc8ZayBhN01QppZQwRsmmaqqMUooRgMgFjMVhCKHDyGLorNX3793e2trCBNVNJZbZqNPdH40mlxfZfKZns7yuwjja29vZ2d06ONiLIp6VSxbg+WyyKOZHJxcBT2bzHDi9WBairh48vP+O1kqpvClefPno5PQ8bfda7X4cp8rWWVZgjMeXl3m+un37VrsTB0Fw+/Zdxlg7bQmh8jzvdvtN2VxcXOV5TlnHWjPoDQPGF7NlXqxCHkRBTGgaBTF0EEOsncpXBQCWUkrCkDGmtdJGQgwAMEJyZUXdgG63HUS0rLImU91um8FgMhnvD16zDla1KObLycVZFHe6nW2rgLMOI4QAdhqWlVZSNY3VgrJhjxBibeAcRzjQygKA4iQBAExny7IshsM+RG4yuep02rdvv/HwjeFoNErSlrVgOlleXFzOHi0o4RjTdifRWpZVhhC6d//u3Xu3rFNS3U7aCQ9tu0XSds8iGpyRfi8mNwtYY5xD/oIGdd3MZgsAACLYORiGYdPooqi0NhCiMIjSNBVSCiEsMBDCWgrjtBRG+9Fk8NpxzEmWdpwzZVl6yqQS8vLyvCxLghAGZLWa1dWKEEQp1aZp9SBllvAAUQAqqbSCGgWMxK1UVAoBTCAJWEAcFkJl5Qoh0+93y6oCADx4eE+qOk7C7a1+GEcWgqZpcAm11tlyUdd1U5UWQCWktbYsS1E3zrkwitI0VUI657wHFERIKmWsaZRMO+3pcoEQStN0ma2+ePIYI/raaw9pwIuyLorSxzXvVKqlouxr+KEvCDbZxSN7G1UhIaQsSu8lpaUyRlVVNR6P5/Md/0bfU/TLHcYYQiAka5+TuhZ+nk5d17PZDAIMobNgM1/RQQgdAAR4er+2FjvnqU0IIeSASdO4risAHOfU62UhhE1dTybj1WoBoLUWFHkJYVMLgzHW2k4ms6oot0aDNE3Oz04mk6t337o76rdOj9FidoUQAphmyxWBGAGIAOY0KExOKZVGAQCMUc4F3W738PCwqiqMaBzH3oZmMBhMJhM/YiqOY295pJRqxZGXlRrg1tN1LQDQNU1lHPAOuM4CgNe6LOheDvD1uTMIAm8AdTMhbSK+X1N6prcfIO6naG5cHDYx96/IQ3+tVYIFwPqGt89DAFrnHKXEGGMMgNB561J/XYlGaWUphRjjfn/Lah1FIQ/o5eX5nTt33n77zelkfHl52YgKGIAQ2BoNyrxazefNcLfXH07Gl1LV77z35iqb1uVCi6Yoin5XYQiapoIAePmcL5YgxB7dgBBCZxAArXb0+sN7v/u3frs/6CwWMymyNE3rWkRBNJt8rKVMkhZCRBshGpckIEmjNGlDSE5PrpSSSdRaNSvwjRX/f4POzqYL4CfBblTNrU4bvOLDAay9dh+6ySrw+9lUpQh6DiOwFiLsjLHXzQ3jK3K/KHfg2y8YjwnZa6LrBveiLPBmz0EQDAaD4XC4t7fnDeY9+xJdzxPxb7Rab04juiFW3BTH/kmPJYRhyGikFXDOHR0debuXdrvti3tn1yqhNSbhpBKmS3oeIvX/ohsqSmChXyw5JbXWq9Xq2bNnTZUJUWotMQLWOK0airBzJM9WEQ8ap63p/s7f/jvttLVYzi7Oj4kWo9Fo2GtzSoqqtghAp5yVg/5gMOjeunXQ7SVVs2x3wum0Vdf1zs4eQuTq6go6KxvlnEvT9OHDh2VZlmU5Hl8CALRR48nl0Ll2pxVHLaORFJbRKIpSJc10kl2cTzDmd+8+CIP4+PjYOUhAGYVpVYpeu/PGG2+0Wq2jo8OLs7Mw5PkyG08uvvOd9wLKgLXAwFbcaspqOp3Oy3mLS0wYDcMEdBkjELpaVNqIRKfaKgdYkvaappIGY4wxjylOnj07PDm9GE+XGJM4ThFhFjQ8CCHg2DENgRZSKOwsxxQgGHEKgKN1ZQjWSilKeCsNp9MpY6xpCOchpVi1TauV3Lv34Hd/9ztVWedldXx0enh4dHU1Pru4ms+Xu7u7t+/cubo6k7La3hn9+CffuXV7ezhqP3wjvLi4GE+XR0dfBXE7CNOqbBhFBELs269KmapqwDqTySyvEVpB6Aij2aqM41hK2dRr0TCllLNAGwuAgBBTiirRGOOU0gYYCKGDa6vUXrcVRbFSpqqENUAIVWTFdDo3xqRxKKXNsqU1mjFCKDLGjG7xOEp7vUGctBGheSa0thKpfmdYuMIoDRwgFBIIpJLaNdAKpfHV1Ym19q133v3B998+Ojn5wz/6/Xfefbfb7SJKZ9PxZ198vlwuB6Ptg4MDrXWRrcqyXK1WGONBr8cYJQgrAByCYRhCCClgNrOYEEKpQcAgYIBVwBJG01aLUh4lMaakO54aY72Dir+rjTEcsVfun02K8tHBwwl2bcNuobPM38nYccpKo4xorNZpHDurvcBS1g0lgBFgMESIxHHKWUhJUdSNaGRdizwr07RtrVXGae2sBc5CBwBwQJhaKgUAwNaHFUAIJRRBSCgmZZ7NF1PG2Go5D8K+dXow7JydnWT5ChEehmEjdFFUq3wCAIw4r5sSOssojgLKGFksZgF1tw62xuPt2SefX5ydaIfKSiNKOeEQYEo9kkmUkhA552y73U7T1NcEEGjOuVKqqiqtbZ7nXsUupfRBkBBinaYsjOOwkTLP8zzPAQAs4FprcM3Ehxgggn0oN3Izy8cAAPzKCd8Yr+yuVQwbkZtXmtR1nSSJf9L77G6C7GaNezND3Nz+itz2ly2O/7Ln1+IGaAG0AAIAkF+kQggJQdT7VyGntbZOIwOm0yml1AvZoyhSQjjnyrKcTqe//Ts/+6f/9P/07//gfw5DyjlP43Bvb+/dBw9H2zv/6l//m19+8NHf2jsYbI2eHT598tWjqimyfNrv928d7N0+uPXV8JlRqtuiOXR+JDR0EEGIEMEAAmeLqmQY7+yOOKfzxeTxo4+Wy9mDBw92dvZOTk6bUsYhVY2wunEQSlnHAfhbv/2zH/3oh+129+jF6f/v9/79o6+eAatfOXWbhPfXVSt8s5LbQPqbasD7efuUv5kq+QrO4bO4ud7cdenvnF1nYQSB9WnY46wIIuec78ka5yxE4OXA52/7gpvjuflf7UAlJMZ4ZzB86623dnd3/XwHwgP39U1r7YwBunGbkZLX/Qh3bUuKvPcdpUEQRFGUJAmgfjwNybMy4FFRFL5PwRhzwDpgjFVKO2D9HWSMUc4ZjCGlmHNKCLLASKUBAFAjP9K6lqJpmtPT0y+//DKfjH0z11pljVFNLZ3TqqYYOWBlI1fZbHtreOvW/nzSHg6H08ujgAdhyFutxCHnEAY1FFq9OHwOoLl/75Y2sqlKa3S3lXZb6bDXb+ry+MURQa7TjnvddjZbME4Dxpq83B7tDLe2lXYfffLFpx9/Nl8uMeDz2dJo1O12nSXT6WK5mJ0cn3/3u9/dHsEoskUurAUMhw9eeztNrpRSUqrJZDKdzq0BVdUcHR0J0QCAOp0eQkCqZjAYJEnSNPLo6AiPGIeYBnGEGaXYAGMwxUaFpNeISkpxenGxXC7393e3toawRB9//vj45Gy1LAFkhHdWFaiVgrRTNA4ChCCCjkiINcKAA0aocgTTSEo5na9qoZumcc4UdTEcDl9/883nh88q0cQk3Lt1gBDSFsym2fn5+dV4+uzZM2PsnTt3BqPtk5OT27cPHr7x+nx5ham2rq7qxdHJ462tYZ5lUZTcvt12EH7x5ZNHTw6LSrw4PiHOQmehsRY45SwGGGltlHJKW6UEpZQarGRZV4YxRnAEqZZSCqGqqqrqqq4biBGEwPh7ASFCGSHEAaC0kFLGURsjaqAOg9QasJivyryEgHS7HU6wddpaq5WAEGlltFEnJ3POpkVV7+8hymOpdVHUENRVKWSjoHVpFAcRDQMWRjhO6PjkGcb04HavKKqrq0NjASLq/Oyw12t99eRRnpXLPJtOZ2XVVGWjGrG9vS1kXZelMyZcWx1Yv6bEBMatVDVCa9lIwRizwC2Wy263a62dLxatVnt7d4cRbq0NgqDX61nr23V+rjTbVNnoJe1r3c70zDhfOqxHWBljjGlFQRSFVeWcxZxTAl0Y0FbMi5ACSwhBSinplBFKKCnqyhAC+5TzsCjqPKvqWijpCOHOImOcUlZr4xx0vmNqLILAz6HHGFOGCaWYrAcwStFwTs/Ozlpx5FFrjPH29ujp06f+yHnAjYWMBso0TS0xgNYAStByueTD3v7+/nwxnU2vhqPt7a3+l5Ss5rlyUCnEMXMOejtkCCFjTMiKYULI2pZxuVwmSWL0y8ztP30wGAghp9OpD21JklhY+zHHyhhrNSFIKVPXtdKC8TAIAs6dc9BB6F2eiFsHR3Nj8CP4OiHRh2B//gHQ3t0BIeSh3aZpPLHD/46bwG2v5/H8tSSwv3SDFrhNGeGhbGStlrIJgiBOQq/499WVEIKz0MvkpKillE1dIQS0Qi+Onn/00YeddjoY9H7ww//9aDSaja+staP+4Nb+Qb/bG18uv/zisx//5GejwbAoVsvVROl6NBpmy5XcbrYGQ2Oc0spS6I8HE4IQQQ5Za42xu1t7WTZfLGYf/+bDVsKzfPbhR7+izG2NRsv5nBE87PcwJNmqsM4FjNy7f/unP/nRe++9M58vj5zFCEAAjFr7VWxuk78hLGGz51cgpU0Fv0EBV6sVQoARuqGw+PFk17DKtX3C9YWklPQAvx+a7a7dCeF1UWCt3rzXOefdG28WIv5ff2lt+mKb3G8d5kE4GAzu3X/t9p277Xa7aZqiKPwQ502Q0Vo7bXxbA14LgH0rbfPp4AZHyscrzrkjLEnS1SqP4xShKcZYNMqvczCBABBjjFICEepxvlar5We1gI3Qd20g67Qx3mYtL/LlculHx8m6DMMwCkPf+IeOAesQglHIoQNRK85Xyy+++AxY1e/39/Z3L8+fvjg7upxdYYYxRdrYNI07lEiti3z16MvPi2z5+eefcUa2tobtdls3ZUgRdqYuypA42mt//tmnSRi9//77zoB+u8MRz/JVsSieP36+WGXchE+ePLFa7uxsn5+PMYaUkNk0+3/+P/4lp0wpBQBijPXaPUr56ekpBPKLzz5XSsVxNBj28jwXon748LX93YPbt+8Bq6ezsVFmcjWeXI2bSkTdrdZwSAjxfD6tpYIUOVeWubRhrcDVWBweX9aKCxNPJtnyYozDeNQaMd6qa3hyOp0uRZK2ilxABDnFjFGHkaIWAosYthpQyqXUvllmjMqyrKrL7Z2tbrd9eXU2m82EQACALMvG4/F/+OOrw8NDTEjTSGttGCwhgdvbo9HWEEDT7cUPX7/dH7SVyaraIdIa9LeV0oRyRNjR0WVd1mVRAgsJQsQ5gxBGiCCEESYIYgQxD2BdC0IIJqRpGinKMLTercljwnW99i7HYD0qEELISMAixjl3ADQNRbAxxuVVba0FDmstV6tCSxWGMYJYCGWMQphEEYbreSrccSO1qiuRVyVTbrFYjsczKez0atJtd27vH+yMBlvbg4DRusxLCrZ7rx8eHmKMu71oPJ46gEOOz8/P/+Df/1uMeNJqs2BtXqS1JYSB6yFAdV178aFR6hphQ4SQ2tW1FMs8CxmXUmIaFkXhWfRlWVZVFUXJaLhNGUuSRGtTlmVZ1n7EEWMMoZdd8M1Nu2HMeVZdEAQQwqqqyrIMAx5SohG00IWcaklDSgJGlWgQcMBiKUSd58YqAEBd14PhNqUMI1aVzXg8rcoGIYwRhRBbq7U2WjsIIQTIWWsdpAGCGCKE1tMaMbiOTa4sy0G3M5lMuq177XZba8k5bbfbZVmGYdhIJ4QoilorhxENQ2ykYowlMV8uF2kcvP7wXt0UX372KX4fO6OMUc4AjCCgNAiCcrF018GXUoIx5pxTiv3at6qqTqej5MuZOnfv3rXWhmHIecAYi+PYj+1JkmS5XJZlSRhvt9vtdnu1Ws2Xq263GydJHKf+I6TRRV7leV4uy5vcAvty5ec2tYL/da7/arznTL/fr+u63W57mZy7Jo1vovammvnWPPTXldJubOuk5j+6aRrPYuv1eowxrWVVVU3TPHywhTGsquroxXPf1eKcQoin0+mvfvWr/b2tDz/6i7LKj49fGCUfPnz4+PHjP/j9fz+erB482Pv880fzxepnv/OzN9984+w8VLomBD99+qTb7R8cHPQ66el5bpAHZgjBhEBiLdDaGKUvri7aacwo/urJWdL6i1Y7nM9Ko9V0fHVxfh5Hra3RKOSJlifW6l6/defWASP4N7/+iz/6oz96/OjZdNpAAMKAlY3enMP/Bh2Hb243rxNjzGq1IgQFbD1BjVIK8Poa2DQdfKGwXvF7EwJs4bUGwPs6+n1fv157aGFTH7xSJfhlw8aKwB+J3wjDw+Hwtddeu3fvXpIkviMZxzG69t3aXJ8+LJMbMcc3Ljf7d9dNtM1NASHEmKZJi9Kxbwj6DOdBBbq2ATVSGkhZksaDwWCwPWScE4KU8kAM8CyHIAiyIve+Ulm+XGWLqi4cMFmWIegwAsYY2VQAAIoxAsAYAoEdDbZOT08/+MWfnxy9eP3118uy/OTzz05OTlZFaaytRWOc2x7u7e3taS1ns1kchAS4Qb9rpCiWq9nV5RtvvH6wf5Cm8fnpsdGNkfLpl4/b7fY//Af/sCiqqqgfffns8mqRl00at9rtfjmTVSUX08l0OpeyuXXr4OGD+0argCfZajWZTIaDLYIDrUC/1+Vs3jQyjuPVajWbzQghdVPO59M0jZVSsmkYI5zzLFs+ffqsLMu33nprd787Go0QwXmei0Y1TWMxBwAAHMzPTuO494Mf/Q4LO6fn5428JIRsHezFcQvjJAh71gbCvrj69NmiyOK4hR0nKACUI6IgtM5KQ4wWmFBCGSMU9QZdrVMHnbHqxfGhBfsO2sGoTwipRXU5vggini/F6cnlu++/9957dy4uLs7OTmhAv//97+7tb1uofvSjHzCOKEPz1XQ8ObkcH+337n7y+WdVI77/w5989/3vj7YPTk7PP/zkU6KlqpoaQhiliXC6zArjvNqKwpBpYxshEcJef6WUmQgRp70gCKwxQFgIkRLGAasFdBAZ5IyzzgEeBjTggAQhxJZdjyCra90UzjkICSXIQODWfWsUhmGSJGEYKpoVRVEX9cnhRRKlQRDuD4damtvDkWrUdrdPIb46vdre2h12D4CerPIXYafjBYTd0aAoiroSt2/vvXhxTDCgCAaIorAToTRN2zGK2/3WcrlcZEspJSeUEAwhsNYKIaCEspLz8bwoipDGCCKKPZPJGK0MQBghRvlsMn325OmDB6+/8fpbFxcXz549M0YxxijDCAPZGIQc55yxEAEthDAQIEaVsFGQwhBKKa2GGGNgsWxMg2gStYKQzSYXEQWdKGEEDZJYbA8//vjjMIwRZU0ljQUAIOciKYqqzBAAF5dnVuk4TsbjaZx0GmmkVMYCzKi1VqoGYMQYs1bxiBsLIEYsiLOyqut6MBhUVd1ub9Wi7rR78+mi304arSOCJhdZJxlejqdRnGrrnNHWaYgIoxhFrN/vX5yevP+d97QUPE3f/e73n372y68Oj97/zg/Qn/1GuEY2loagKIW2qB21EEKcxXleMRoSSAPK77/+8IPf/AUPAl+iRUGYKR1iTix4cOf+48ePD27d6feGvcHwLz78ECKclyULwjDhSRreubt797WDKGZNU1POppPZxflsvixFY23lIDIQORRiCZWlrr89mE6n+3cPNDSrPBNSQggxWlsga22UMFprHiI/p2o8Hm9tbbVarSdPnkgpkyQB12umTZLwAfRb880rtYK70cO+mRI25ePGuu4m6RUA4CBB2AEIjV2vCwmlCFPGg9liWVR13egkifxc1jhOWmlcFIVWwhc6kGBEGQmieVZ+9vjoj/70w6pqDs8k50Gato+v+NXF2a9+9Ushxd6tbRnigsi9N2/98Aff3znbi3jw+PMvnj09rnPBgLBaQAAi1jbGVFWV9FlRFIQx5ar+dj8rVrksb+/c0oz+4sMXEIEf/eh7z87kH/3J/5tzdmv/YFUXmLvtg24cRlEUlUL88Z980Ch9eLY6njUAgU6nWwBkjId8NhMNHFjzoL+9l79Zqf9XbvjahxFeEwKcc76E5ZzGYeSVSkqpgFPGGLgeBmHWdsvI/xVghDBGiK47X9ZY46wxSiqnIYWEQqIAtsZSCyDElZacc7CecGsppQBiv09prDHArM8EDdNWmqaD3tb29vbBwUGn3YEOAueiIGSMFUXhEHJGWWOttdARigNAMNDSOedlmeDaxMwzMHyJ4KtJ/0W01oQaIZskSd5+++2PPvrID6NRymAMrQEQQIxpGNI4isMgYTRU0jAKGQlDnlASAMeg4QSECAbdVogQODx6/viLLy8vL7SRi8XMWVvXAgCEMQaIOW2UgwYhrAlC6PBkDkB0Pq7G86Mvvjonv/cnWXHeGw729vYwAEZozmncbaOALcfz3VsHd+/cgdrKWn752eeqEYwFSYtYWM/mK+vqgKHTk8Ot7X4aJ5cXp6usmEwXTw6Pq0Y5QBarjAVhaKNeKxb5KoqiWSMZ4nWhEOJpzFthZ2e475EkhPB8Pu90OkXDOeeQJHYxrqp6OBrcu7MPrNVNOT4/M04XRfHpF5+fnJ6+/73vPnj4kEepM1gpS2EStGm7DdhicXl1xWmXYC0awHhr/+C7mGwnSbK/vw91/Qe//4c//um7YdoqK/Hu9947Gl9leTFZHu4f3B5stzFEUkIOIuBCpZQpp3UJwjDsDYdhgKtGhhEvS12W5cnJmbV6tZxbazqd1u39oRYZBa2AtoDCP//pbx+dPP9n//wXq2x5fPb03uv333z7rZ2dHRwlZSN//enZhx9+zDnfGnxxeXk56I9GB8W913/4+ts/vji/un3wFomiyBiTFXnZ1JhQRLCDUCkVhvHancPXpNooaJ2xDiMAgJIyz3PV1JyxMAics9ABbY1DjmKCIbLaOOCQA0mS+vBaFLmPtlJK54ySBiHEGIOQ+46ap5WtVitgLQQEI2wN1I2GEENApZCMMISpsxg6oJQRSnMedtAgjtaXvtKCEp4m2lpPWSeUBACQbFVp0zjQWCeOj1845xACQcCgdVI2dV1LIXy80EZqI41V1mkIsHNGCOnPACGYc85ZACE0Jp3NZk+ffWUN2Nvbq6rK0/jb7Taw0H/Hsiydc15C48+kDzfu2s7Zs44RxwZaiAELGeYEWOmgdchhAoeDHqW8KGtOUcBjTDkhpGimeZ4raeqyyvM8SWAURXEcNo3UGkGngfVaJm+o7wxw7ShphMjz3AEYBAGKQ6cVoVgrAa1jjFoj/PFIrZfLZdU0PsNhAFjAGQ4ZDZJWqrVM4hjdOojjeCXFfD6P47jb60dR0m63D27dGs9yRHEQxUoDopH3OwpDDiDVWvq4vLW19fjx4yzLIAAhCwEAhJAsy7TWW9s7k8mkrPJsXE3nM4gcAA44a6yr8nKVTYXOHFIHt3bCOPzkk0+yVTlb5E1tjEZKwqoUtWg8DTBNUy/cUEp1Op3J5cQLHxz4mh2CX435lZEnTyyXSy8i2LzM3WhU/7WkqM3ebsJO/slrGONbyPC+FUIIEUJI2Rhjer1er9fL83yxWOT5CiEUBAxAV1XVYrFwzgEH/YgBrawxFuOr5SJ79OUXaZKOht26UlGY/u3f/e/ff+97V1eTxXx1VpxYa7e2tpbLuZaqP+g24uoqW3V6XSGhJ23k2SppJXfu3CKE/Oaj35yfnxtjophEUdTtdtvt9vnRc0qZR8uMEnVdH+zt37p1589+8efnZxdlrRChnGOpXFVVDuJvPav/DZoRG4QJfL0tJaXM85wgbIxptVpJkmwoIJs3GmOAdT7R4uvDd8AA51f5FqwbVWpj3w4RcMZttA/oehQ7QgjANTaw6RRIKRkP+v3+/v7+g/tvRFGUpul1ClfGmLquN/2FDRxy3RnBCEFCESEkiuMojhFCG1sRvweMcZK246QVxamBGELIOR8MBjs7W8+fP/ffV4jaGUsIoQyHYZimaRzHfmJkFEVhGFLOKKGUkiAIeBR6WLqRdV3XCEEHTF6WRV2ljFNOKCcQQicNIJBzHvGgKIowDClbT7iWRjZNJYTgiUMIQYQscAHjYRRYa6fT6VePHh8dvnj86BHU9uLspMjyQb+/PdqKwpY1KMvKfLlqt1qtuN1ukTRt/fKDD6UyBkClbBim1kE7XzVlk/LWzs7OuvMSBu1Oqo0EBoQkjFuJ7zzO5/PFbOUhJUwxJgBhu7+zPRx0rZZGN4Ot4b/6l//6j//wj773g+9Pp9O8LIZbO2nQunP34VfHp8bIMAwHwwHnPMsyQMu43Zkvpt1+z59YrWXSirvdFqbg5Oh0uZqdnx/v37nf63Upj27f3vvq6WEYch5QyjDFhDJMCCIIW2tfnM/LMs/Kotay16sppZSB0KEwZM5Wi8Xk4uIMOofRbhJvhRE/P31eNMurGfrk8w8W2SJKMGKJQ2CxmE/mU+PceDp78uzwq6fPRCO3trbm87lvMNV1WRTZwcGdfr9PCCEYwDAMAUK1EGY9zA05BwghjAYQQuikFlpq7e14IYVNXQNjyzyHwMZByCmz1his/eVOMCYQOQcCzsOwVSxzAEBZltPpOM9zuDbht1EQI4TW9qjGKi2VAAghiyHnUcgDSjmEkELCKKWEF1kZRRElYVVKpVReisl4jjF++PpOGIbW6vliulwuJRfeWX3/9i6ECEEipXZIaQcgFtIu85UKw+tGrxBGKOu09/JDiHhDM+cMhA4h4NayYWstcE5UFRJCNLUoy5KxoGmaOEq9qZ8xpizLui6jIPU6K9/n9pvWutfrecnDhqngi/qiWBWiQMA6JbgCRtQhx0KWd+4e9Htt1cgXh8eqrrQWq8kcY3Lr4S0IIees1+tV1doDQ9QNJhQhBJSz0GOhGCIAncWYbmh91mgpGgihRSCJ47oQnJE4DvNlY60FCNa1aKVRq9XiYRSnbSEVDULMKA+iyWSSJFGSpvv7u0HAGSO9bvu1115rlltnl1c0TL7/Wz86u5pfjWfWOQvd7u72eDqzwARBoo3UorEQaK1ns9l0Oo3jGAKAASyKwqs5mqYpywIAl+f5fLkUVzJKE8ZY3KaMkVCTLJ9NJhMhq9PzkzDkTdPUwkipnMOYEogIgIQwnmclAIBSmue5F/T6Zpldu2C9bFFvWsJeiX7r1q0oip48eWKMCcPQQ8rgP1vRcDPhffMtzn3tc8HXJ/uB64zonHMQbAqFm7WCEMI647OUtev0EwRBlRdlWWot/SVtrPYWrdZa4KC30PD0ZGtrZ2HAEoy40RAzRilqGnV2ejW+OqubsqnyfrvVarXiJPytH35P1Pk//+f/yjhDECQINlWZtFIIw9/5+c9+9NOfXFycHx8fXY6vIIQB41qqbLkKGG+321EUyUZQStM4Zqza2ztI03S5WM3ntXYgCAGjAcLOaKekIAhvvuPfXOvhZrV3E+DZ/PVmoaCUEHXjBTiUUs7WHhX+KlqDTNcPXk7nWtsurUkt1w0N7VVz6x/OGP8niF5KQDeXhLneT7vd3t3bf+utt+7du0cQ96/ZGCr4ALK5ftx1N219YHrNTuCcx3GcJIlfg3mvhXXyw9jPa8AYWwe11pTi/f3dt99++8mTJ5RhSrHW2DljHcCYJUnU6bSSJOKcAuQQgQB5praEBAMMEAKYckJQXi4b3STtVlf0DTCU4ZSxcK0Y1EWW13VdC2OMipIoCAKrdVHlHvAgGEMCwyjkQUApJQiGYYgxKrJ8tVo5a6UQxSqjmERRxClrt9tRmkgFCEbW0kYiM6+rwtdhS06YcTAIIs7SIIql1MBiay0IzM7OFsYQAJAk0cZmDSLkfK8IAAeAVMrTXfNivrO7lS0XVZF/9zvvvfvWm3VVTMfjn//k57PZ7Pf+p39XlmVvMChWzT/9P/xfQGWDdm82mymh24hRyjUiUasz2N4eVTvdbhsB++jRF1eTS9eoq6uLzz//NJ9d1E0+m497W4O0nTigh6Pe2cV5GPJ2J2IMO2usk8ZiCDAAAIZO17IWJZaq7VAat6IYGAuDwIq6ruoiSkqCYKsjkpbgHJBo2abK0NlXLz4ACI722w6CLC+ErqqmRCV9/OzpBx/8hlD23e9+/+79+0T76hacnJz84R/+4ZMnz66urn75i1+Rum4AACEP0jSthcqKXCmNKBO1dAZAgLWUUkroAEIIOmiszGsBIeSUhiHnhKpGKC2nk0kthIOWhwGihFDaGw467TRq94qiyLPx+GouVdPtduM4hdBpbQAwzq2h3Q0Z0AGAAXOWGAGsNRo5Zwjgbnt7nxBS5cVqtZJSykY454Ig6g6Tu3cHo0E3SNqInld1UdeFK0vKsFmPGHA8IaGhSpna5IRGEDmlhZBW1o2UEgDHGKmqCkIMoPX6YGMVckAb6W37tJa+T+w5eqKRQWCUWuY8j+M4jtLBoJ+m6dXVlfc1C8PQuwVsjPP8fvzUDC+9U0o1TVNAZ6ziBAcMKk0AMJQyzlkShcQ5E2kEbu1tb61W+enpOcGslUS1UEmS3L931xg3ncxlLRblYjjYgs46Z511iBJ6zdjnAc/yHELYbrchAMvlEkIXsUHEMIn41taw3+scPtMAAGtcLRrgMmU0hFAplRX5Mi8QxpQWDsHh9lav3QkjfnJ0JGRtjLpz9+75ePFnf/4rZfGbb7333nfeP7ucIBIghDFhLKB1XTNKTSUwQYQQYOH5+fnl5WWv3YEQAoe8HAsBWFXF46+mvnZst5NaNNrpKE6VyngQx0kAaauusYOuaRoDnJJGKWMssA4iCyGEiBICUBwD6a9YCOu6vry87Pf7Puvf5BxACNcqP+e8tMTP+fQz8TyxcZOqwY2WwV+GK9xMdTfXwd+a/NwNAsSrO/x6obDJB4wxqcS6b02wtTbLsqZpOKGegOK1bY2orbVBEOR5brT1i0VnvdkJhBD2+4Orq6tlpjrdzkIU/9O/+bdffvHYGvHZ50/eeLj7uz//qTEuz8rVasU5b7WBWAFgFeM4z0VTF5zzXr97dPj8yy+/nE6nCEBKKEG0aMqmaQAAW6OdJEnGVxeDweDh/dccsPfv3nv86KvVahVFGCAmpKqrKghTGlApX04SB99AVjYP/msKiG9rXqx1jzdf8xJnQtAY5RXU664EdFEUSSlvkgfBtcWqturGnq+1owBvPDAYY5Q6Sr1xFgDo5XQSv0F0zfFCOAzDra2t27dv7+0f9Pv9KIrKvPH0Ah8hvYQHIbTxGrmuHdcCTkf5pl3lJ/lRSgm1TdMQSiGE/uMQpg4gY4EDpmkqxthwOHzn3bf+4N//z0opKZsw5EpKazVCgDEWhiHnHOHNjDctjbQAUG4dBABBQpCFdpGtFos5Iag36LIQY4zrVbYxP5VGCSXKslwptR/uGWeU1Y0SxhiOAsQJghYzKo1W1sRhrLWWslFaW23SKEYIeUfdVhKVZamsKcpSX6gkSZxxxlBjAEQYQmiUieOWUwpA5rTTjdXScsSiJGqnaRzHdVMopdJOHIWJMoox1u518zxfLefWWshI2E51nldV1Ru2s2IVJVGv3z4+Pp5eXX7/e9/53d/920ZJgumf/emfN0qnjb26XLRb/eVsifspIoGxuqylcUAqhQhmAXfApmmMoIvjMEnDRuQXl1effvIJNFUr7RgrlqtpVuTGoaquEHadbjuKGERGSSGlhMhRTCCEyYDgOFYSJxHt90GnpQgxzkglZ2Fso9Rt77UYY602RnDZSLF/n1tLrQG1OcWOdvrcAYxZuFgVQuaoRlVdWGDuP3zt57/zO9vb208++fD4+Go+WyKEL87Pv3r0uCzrs9NzsjXcPrs4r7Jl2mkzSiHASgniVCmNIAo6JxrprGWEetN7BEBV10EQDLq9dpqsVqvFfFoUOaKEAKi0qYvSQhDEEdAGAxgFkRI6YGEat6xN4iCGDopGWGsxhoQQSgila10vpbRW3DlntTXOzxuklHCCWRzHVVUtVtlqtQIA+MnNyuiPP3kURq3haLfXpw7Aqs7ruiyrXIgmz1dlUTRNI5WGGELrlBEUB0LUZamllEaqdTjwwQhSAKzWUspGKemckUJQyn0/whofvrF3NMtWeVU1CBUeGOCc9/u9TqethFssFlVV+e5glmXOOe8sJKUsisK3JHw7xjmXpGldV2FAooCGYUAg73VbrVZLa301vpC+D5fGdV1bqzGn5+enUmojVW846nXai/kKQQAtaJrGGoMAMABABwiGXqdFCINQQuiM1lZJil0rSTppFHM66rfeffudra0titFisZhPps6CvCyEEBYgaZ0/WoiQQ/VwOKSULrLVxbh69MXnYcCWyziO49OTk6+enwbp4+Hu7dHubtju1o0cj6cO6E63xTgRdUMIwWHo145RlACAiqJCALaSKI5DQlCR5XVdlnX18OHD5eWiqKu01ZpP55Ti197aBgBI1SAFGKMsDLrddpIk0/kCC4Ow1hYhyCHAxABDHcOsLMvlctnv9ufzuYcHOOd+LB72ccQzzDECADSyDsPQR948zz2h0qeEm8v9/2RC2tQf30xvr3AUNi975b2bx5tCYVMlIISSJIEIXOvXXxYZBCJjDFxTadQGPQqCoCprjDGEQChlrQUANU2TL0tKCUfMOScaVdXN06eH2aqkFJydXn36yaM333htb+/2ZLw4OTkbDlq5rOeLZbsdtxIehuGD118fDfr/9t/+2xfHR02l2u1Y+7Z3rabjmTMAWN3vd2ezhZQ6CILRaNTt9FarlTHOGOes9g+apuEcAoC+9dzCr7ce/qbxBr/5IgBi71wEmqZZLpeMsTBg3rb1JgK0ASGs09fHti4AEMIIAYQBIYRz55yf1+oYY0KIWqw9mDcKGkKpN1ROO929vb1bt27t7OxQxquqOj8/73dHG04iuFZ1bs7STUTBExgR5xtZry8g0LWbgh9N5/fgDaERQphAIQQhKEyi27dv37q1//Tp0zzPR1sDrbxXhwHAQQSg99CgGFEMCcYYUk54GHBOAQZlUzZNc3p+cnRyjBDgnBJCkiSuq1VjaiCtcw5TEKTcQOVqM80mXdDmnEetAFjHONZG1KJMHS+qsmrqNE0xxlZrgtCw28uyJQCgaRotZZiEkGCKaNJtc0KzVb5arYQQnIcAMmdhluVCQqVUyAOnDcbYamOU7rTat27vUUovx2dV5TqdVtxKhRatTjtJWohgBaw1DmJkCaqUglo3Tl9NZ7vbW4TRRZ7duvP2u9/9XhxH/+Jf/Iumqt/77vdm0wXEhDH26ceftjptFJF2wDAOAwSQlgQ4IZr5ZVlWq9nVqbFqMhkbJZ3Vsi6aOu+1k+GojzFaLpeNUFI7zCOEAMbIWqu1BNASiiilIeeEkPYQQtSDTkJXU6QCsqRUEyiXiytOQasNAHKcA0KKqqqaLOu2b2utlbJlrZQiVrFGAIQCRMx4cgJm07yYRyEd9tsY6dPjw+PD5+fn52VZx3Ea8SDkPAkTTjj5yU9+8qtf/erLR1/VlegP061RkBeV1Aoh5CxomgZ4ig50Wmi/8Aooi1kQh1HAWG5dU9X5Krtz547gsmxKoSTAKGYBtC5bro4uT4wxzoHRaAusW4BZURTb29uME18jQwidM84BKbVS0ocGznmSJL5zzDmvinI2m8zmYyGUr+UddEVdqrE7v5yMdmZBwBpppXbaIuMwxExbmJdNlmXGGAgxAMgBqHTjm4vGGOeMNlprbbVptVqUIsYxJgAii7BD2EFkN9RlAJ210DlDCKOUR3GotXYOYgyFEMcnL/b399966y1Rufl8Pp1OAQCdTqfVakEIO52O70H4dap3T/KPAQ4NMhxz6oCWhhBkLcjzYtjvXVxN5pNpEESE0PlseXR6QghL2pEvTZKkFTBqtLTWhpzKpgLI+/I76AwAGEEHINDGJq3UajWfT6Ezb7/++oP79zACBIKdnZ3333l7MBgUq+WjJ19Np3PCA1XXDkEAICI4bqVJp8uj0AEUBAFAcDydrBbzsqlbrYRSWonGWLS1u2sBfvLsWbvbVUafXZx+8MGvu91umqZG2aaqsR9s4UC32/Ugf8i4lkpLKZt6tVpVRdnrd+7v3n399QdVUx4ej6Vuslxbd/n9zv1aCpE7gCEChFIKMXEAd9r9RmopLXAQkwAArKRRSs0u5845r03yiy0fha+lbniTtuG1lzYAIIqi1Wo1Ho99/N00pDcr/g3D/K9GFMA38tkrQLe7wXt/5TU3Hr/EG/D1RilttVMvipOy4Zz3er12u10X5WKxyLIlhDCKosBxL5v0X805gBB2zutjqVaWccQ5tdZigsIwNM5GYQIsDAKWr+Z/9mefzSbzmCXboyFnSa+73RpEH330kWxKa0E6Gvz0x781GAystQThNIaEoHJVcs6BBfPpdDqdAqu3trZE3cxms73tHYxpFMRBEN2799rTJ8/LWiVJjB0qq6YqK3CtPr1ZYIGvV1rffPBftG3e+8ov9c3f0V3LFP04b38VFUXRNO0NIoWubQk8tGOtBXizT+ecgZB45isAABMIEYEAe6VMEDCtw0ZCrbW6lkw65wjlniLQHQyHw2EURVVVISG9PBgA4C8Adz0aG14TYP0hbc7J2nCMRS81vZg4hCGhGGOACQsCjDGi2jmHGQeYWIgizrTWEDmtZRyH77zzzvHxC23WRAoIN9IJC4BFCEMCAIIAAYAgJhBRpJ1WtaqaOsuWq2yZ56tG1kkSRXEIEOAhK8uyFKUzllJKOOEuAMhxziFDFlpIIADQYkcJadE0SVMAgBeTy7qp65pTxhFxxgRB4Izx3RPnHMI4SdM0SWbLRdXIKGl1Oh2M6Hg8eXZ4tLO17YxpJQlGCBmjZWOt1aNe2oq0NphAGmBIoHEaYsAjrqwKkng7CgCAZV1bhLuE9rdGi+W0u4MAp5eLZdrr//f/8B/v3jr4H/9v/9e/+PiTTtryFhech00tLqZXqyoPiivfYi7LQhlJCLFWC9U4YJb5SmvpgJFSAq06rdZr9+4NB92AR7UQAIDBYIRpUApZVhJCzywh0EGCGaWEMU4pbR20Ak6Qa6rsqshOpckpEJiYTlsjII3V1gIICog4C3ULWmfnCFlMAHQCWCoEWMyrJN0igE9nSyEBMHhn2E5jNhufn56fTadXhKJOp+UcFEIoJRRQs9mEDPujNx6+6RxcZVkUxXHaSpNqvlzUdaOdBs5BgCklnKxHJGupkihOwkhUtZUCQ9RKUq1kU9dKa9UI62w7TdudjtXm9Oi4WnhPsV6v13POzedzAlG31Wm325igDRFXijWyV4qlh+4pJoxggiB0FlizzBYXV+dlVRJCtDGYBozSRpYOJOcXEwc/xRgKWWktlRJC1pSSpmnKSksFnSPXVTbSuoLQS5mQddYY54feWqcBtH6Cs/dQw35KnnMAWISAc0gZJYWWUlKqwjDuD2hZVD6IlGV9cXExGAwwCAkh3jlca/9iuklazjnOuS+WPWvaauUkQAQppU2tHIM5QifHF2kULxf5Kq8abSnlPE62bt2SUjOsMcayEdaoIAis0k3V8CCoyiYMESLMGGOdAUZbRCCEjZIxDjGmnozy8LX7P/nxDxBwVpt+v9vtpFpJT70sy3Jra2u5XNZ1bSwIHEjS1mB7ZzQaYcJanXbTVEopP/KnaZow4g6CVV5hwqtanF1cjXb3zq/Gq9UKEjiZXBGCZKOkEEmYlHkRRdG923eEEAcHBwSi5XxxevzCKD2fLzlDaZreun3AA/b9H3zv+PyoKFWng9rt9mQ+9oUdYwSRMAgCzgLMaJ03WltjLSEcY2wt9N/CDz6I/v/M/WezLGl2Hoqt16Yvv+3xfdpPjwHHAAM3AAiC5AV5v0pUSJcR92dJ+iCFpNClFJdXAA0gggA5IAbDHgymu2em7enjty+fPl+39OGtqrP7zAxNBC+gjB07ateuqszKfHOZZz3rWXHsxwdba8fjcbEqdq53h/oSQn3dwVrrS5U7GuPOl+ze8l8OKvwil/aSx/pZmGGTpCLu7LzHEryf2HmpHcdlN0bEbxu2Gm4UO7xT8W0TjDHOqZRhC4pRlecLrSFKAuegbjpCSC/NLi4vBlk6TMVq0XzvL37wa9/+ld/57X/w3//j9PPTZ4zTn/zkJ8uVlpxlSfzjH78/n14a1SoDWmujIctkkqAHZpqmUcpkWda27Xq9Pj09tdogogfYWq2FCACBc2OtQ8IAXkhTvHTefm6s4CUp/2u33RW8vq/r12K3X2ctIRRgs0g8T9mT+MBZb6N2r6eUIt0e2Iad4BABke6gHUo9OY96WCJFaa1F2PRZWGspE151MUozIURd14gYJ+lgMIjjeLUodpDA9ZPDNjLeZBfB+CdhOwsNAIIgkEEoZEApBWIYF5xzQpnz4pFArEMgjjKglJZl6Zz7ylfeeffd77dNI+UmhY2TMIqDF8EHAIK11jJmHQEE2zRN1dRlmZdlSSjN+j2z7CgjXMrOdIIRJpgIBFq3aRqigBSyQa9t26rZKNsKFGHW89MrwjAMo6hq6rIsKRCKkK/XdVnFYSQY19ZorVfrNSL2hgNKsG3brN+7e/eVOO0ppYExbTEOQ921SZoISsDoYtVq1WrVzOdTpZS1JopDY1S9rFblOkhjKUOgEIQRocxRohHGB/uDwSDOeuvVgjMC1tbF8tMnT5+fnQZpdvOVu4N+9tOf/vRgsieyEBzpXFsscvPg1BiT5/l0MWu7LooiGUsgxIGtVMuEiOKAMhbG0dFkf9zvt0qXZWkNRlF0+9adtDf6/MnzxbK0Bh0S54BTRiknILziEdBREAaCKTRWN4VxLaAlzqRx6CyqTbMLUkDJBY+F6lrBgIBUjQLJOaPrGVJspZRoa6uwlw77g2Esoa1mtl0X67UQMsv6lPCubc5OTglhZVHyk5OTNE1ff/31Z8+f153yBsg5PD09RURngTPmpTYIYUbpqirGg6GUsshzcHY4HO7t7VFGfPdtEARpGNy6fXv/6HC5WpVVHobhVlE89Pw+KcPRaNS2tTWuM0rpzs/Y8H0K+/uTKIqSJPGUQACom7JpyXI5XyxmjLE0jY1VaRamaUqobWo4PT87vzwzVgEgYwTBGqOstX7JMR6QjXrAhvROtzNYvTEFAC+5I4RottuuQYMAbFulKYCw1gJSSmld18PhsCyq1Wq1tzcZDvtKmYcPH0ay7wuNlNLFYuE/1lcr/H3uqUaI6LHuKEzAIKcBOCTOUGDOQF3UXWuNQ8qFsk6ZbjhOUtq/ms4jIEQIpRqyEW6yXQcydM4AADBOnC/cWEs9PYfSsizjKByNRh7munPz1nCQobWc86IoTs4uTk6fX15erlYrJCCEIIw6Zynn/eHg7t27d1+5F8hosVoCuF6v50lzi/VqMOxNJpPHDy+sxaptEuwNR6Mf/PDdZb48Pj5cLBZpmq7NimrKOfX++/XXXz9fXhVF8fCzByfPnq+W1cEksxYYYw8ePDLOWGv/0X//+wcHB7OPT3pDORoN7ty50zRNWZZ123hWByCx4FcpEEqECKSIlTYWXdO1fDtn7/T56d7eXtu2+/v7jz9/fN0lbNFa59EdXznyq8JfJl/vv26I/7Ou6D8Bkv/sn9dd1PUo4WffsnMDnvRe17VSilIghJRlWRRFW9Vmq9pb17XSGwqeJ7rvklHnvPZJw1gThAQRg0BSyhwipXy5XA/6o7aqbWsIuA/my7psjg9uvvPO2/fv3b1/7+7F2bmU+Ze/8s6dO3f+/Z9/l3OepmmnLaXUuZoRWtfKOZcmGWOsLMs4jBBxvS7q+sGDTz9rW3Vydtq2LSU8z/POgpBBHMV11/6XnNv/NbafxRV259xaZ51/YOq6Xq/XmxfjCxhg57yV23wFQgHdriphvUb7LqyhlHJOOeeUZYjIuPQ9UMYY2FYz/cXyj4UMlFLr9TqN+x5LeAnP8Eya6yHUJpgg4DkBPjTx9Vz/yo0U+obmsokg9aYsBU3TUAp3796dTCZGK0JIIGQUBx7+ZIx5lrfws3AZ4LZxQ1lV1+XV1VWrWi7oaDQwpg3iMOslVVXl6xkAeO4kpVS1nVIKCFkul148Owkjn4LXbSPDwMFmQHFZlkqp8WgQcjGdTtM4SeOkauqmaE1j2rYVYeB5RYyRIJTa6Wcnz5eLFWMsTpP9yV5d5kkQSAbEGup0zSAO5MXFhXPOgh2kaVGVTdH4uYDD8ahulTYGwFrAIAqzXm80GStkd+6/3lZlWax7vR4Dg6Z77e03f+3Xv9229d//h3//4uKiaRop5U8++uDg4KDXFMzaGMxeEraCGLREdcgpJSSVUoZBZ8xssQCAIAyttUTK5XJJmZCxC4IojtOu67SyiASBUEqYEFIGQRBEgZRSViUNZRSkcRB2SVIZarlbAaLTQEAGnArqgDBCuHHgrI2kYjRA4MUKhOQYRFNZMjSSEg6WWCc4CE66etXWFG07Go2qquKcjoaT2WxxfnYhZTgaTfi73//e66+9OV3Mu05LxucXU6CcahCOrdfLJIpu7u/3+qlg1BlVoZ7c3EPbTS+nXdeFYbxYmiSMbt+4OZ3OBOOHh8d7e3uqaecXS72ssjZa6RpRLy4upqen3WZSJVmvpoRikkRMsLZrlGqzLDs6nozHY7Dc22frdNvWbVt3Wlmr63x9tLdPCHEOsqR3dHwrSZJevP/8PEdEh0awENEBcQSc5KGUHMBZVMZpRIu4nRJridM2EBKNLfMmFDIJoqJYjwbDhElqTC8MLqu1EMzYRreKhD1kBNGBsYgoAomOAAJjrGu6LOkxIlVrBWA/6Usql8spIaMgYJPJZDy+JyW/uroiBBljcRxLKWfTxcX5lZSybVS/NySMKWW1rWXA28aOB8OiWC6rWiZJpy3n/PL8bDwcmjJ32rx+Y18De/ToEVJ2Pp3df/V1kUbtVPUChhEYARZti8YCSsZpEDLGXLkWnKeJCCm8+dorb929J8B5axEFYmXazx9+8smDj56dPh/u7Qc9aQrSWB3FiQyDg4ODGzdulHnRCRXKwMZxHMcikFGaUEGDLLGM9Ia9VrcXFxf379///NPPj/ZuXJ5OQcEwHj/67MmdO3fWi7PDg357epH0+9lkPF1Mz54+P3l2qpQZjvoO6XA04pxrW8zn1cXVPPyT7751/y2O7PHjp1/+jbfeevX+usg/+eTjuB+3ur26ukrTWJta8IAw6PX6QRDnZVvUVdU2Zd1GNF3lRa/XmxzeuDy/uHfvXtOa/cNjxljXdUZpSkkch4CotbbWCJHcvHmzLEs/9dU7Y48r7EwwuVac3jlguDZV0if6L/mb/7Rz2kbGL5T4/B4FB0BKPBMOGEGOlltN81WTpiSOw0AEWqv1cpVTJIQY3XpT7pw1VjuLiOisaWqVpj3/yVkvqeva2jZOWdfGWiMQW+SKEEIp153xvodwYoijlICgl+36z97/y1Kad27f+sqX3vjTf/uvKXbr5dPBiPwP/8M/evcHh3/2Z//+ydOyl4XWYlW2R3u3zq+uiKNNV8Vx1LRahMm60XvJSGt9Mp8ta4csRIqARHK0gI2uCX35dO3CMntt2uoXPTr92bjqPxltuJfAG7+5n9HDeLEvIL4mQoA5y/Ncd2pFWZRlSRDKtm06ZYAYwQUhQDXfYlT2i7tAX04FAEoJIQ7AOofGVYwKgmispZQJyZiXc2XgrYQQApB4cTYAaky7PSee0sGvw12UUgKMALN0IztNKGeUCSaEEFJwgmC1QUYoIUYrAlYIEQYBIQTRWKPAEs6oZ2tNJvsXFxdZlpVlT0opA+FZ2F5WyNfvCEFrteSZ4LStKt/GtV6tEFF1XdNUQHE0Gmmj8uUK0frmZ0Ts9zPOAyQuTqPRXv/8/Hww6SVJ5GN05wyllDAbCrFaLxCsiGVR5dNi1c96PI2FEKu2WS1XQRCAdSGL9gd79byM++Mo2nMAjKSXZ88//PijNE0Xs3kUBa+/+sr+aCQ4lYIAZ6O9STYea2zqthEBX6zmXWuMcVna7zq9XBTKGiCEhZIKRoWpbXW5slxGRbfknJOI5tY4Z4Mkxjj8aL0Ca8DYYDS+M97rZUm+XJ2cnFxd5YwxQlhVYFWZOEq5DJbT4tnJMwf4D/7R7w9jqeEkiMKL6UWnle3KIOtLGShnr5bTvK5W6ysZYlHkcZLxQBrTGtOhjBkjhiDIvUI5VThmqMEQIQAuQkGtWnPWcQ6cgHGAjsY85iJUtDC60x3s7YPuqqZsj8dBVVnbNvnc8YAN+gcORV4TJsJl3TYGIUgWnW3zgoUxzQZ53UDX8e9///uXl5eUS22NFGEQRVyGxpg33nij65pBLxv0+saqrqnByTAMW2NX69yT9dI0bZqmabrhENI0CUQQx6HW+urq6vLysmmartOD4YAQgmC11oi2sbbrOmxtkAQAVDBBYhKGYZYladKLo9Rq7LrOo9zGKqV0WZdN02htqqpCwrKsH8RJFEVhEJnYDkbCtyFthr47ba1CsJ3SAIhA0AdmG1sPCIZTXuUlJeRgst/Ule7UzYOjd770pTgOOaeXF+doQYTSiy1WhjnnZ8PszM119Nh3e260E3x4nue5D5Ynk4kvozDG8jz3nf1ZlnlRSK21b0xl3Ccizpc+vVmYTqeU0slk3yitmvaqmkkhhsOxVUp65jMCse5gvNdULSGUOSDWEUAOhDEmCLXaGKXTNNVK6a6L4rjf7x8cHw2HY8Go7erZcvX82elyuWSMjUaTyd7eaDB89vgsSZLRcJIkGWOsrWplDaW867q8zIuiMEp7Sp0xpigKpVSe50EQKKUePnyYpmmv13v+/Hma9Pb39y8vL8fj8XQ6jaJoPB4vFovvfe97s9msLKsgCAjZ+QM4PNoj6JyNu7Zw0L1y/+bF5dPZ4jRgb4Rc3jq+MZvNCMgbB4fG2aw/tNYVZb2aL6xZKI2IVBIWCV6uy7ZtiUPfWmKMQmdG48H08txP2dgp3yGi/yLWWq/DsRMO8fnZdS9yHW3220s+xl1Tu/tZwPyl4sVLoPf1qgSlGxB7B074cCTP865r8pwBcYiOcxonHqONdmQ3usGzEQD83FvnlcQI8RUW5xylgMwi+klCG7QcAHzYRBkAgFKuKKrz88vHjx+/ffumQ7xx48bJybOr2eJ73/ver/zKr/zTf/pPF4u8qt9VnUOANIvPr04B2NHB/rKwANB1XdU2uB3NtUFNtp7bu7ntmf2Ct/4vrPL8r7dtr8XmT9/6qDX4NIsyPxmBIvjQEPkvaIch17iou9+EEN/mtVtjQgghA8aEX1R+d4AOKCGECMF/0XG+CBTopurkn2d8q9cuBOe7QaObt1z/jv4B2c6U8l2UVVVZa+VmE96Le0m6HY4CW5DVaEcRvQ5VVVWeJsk4IwQRHKIFoIyD79H17e7+jgvD8Gtf+1oQBGEod1IQ/l/dum2axpsXv2KVUs7YsiwFYz7dIg4ppR4sKdYrP/dVtXXbtpKL8XCUxklTFUbp9XodB5wlkTGm6NqL89PBXj8OI0Hlcp23besIlWEoZXhyfsY4T3pZL4lkEBgwsBVG83c3IeD9CzpfmGbOWY0Ouq6oq0Byznm/319kKWNMMknDKB6ODvYOB4NR26nLP/xDKngYJzIM4riHxFVVN5vN9o5jzr1whS7yysaotVVKUcJhdzuQnYNA1bQMBfej4iw4B9razmnJJWFGcMcFlcCd5dYway0QoASEAMFFKJNQSikhbdhPPjwXAiaTOIlxVeadwoilUuq6ccY4ra3WinNRN2XdtIQAF4LOZlfj/T1rnQIYTcaEcQCXpnGvl46Hg1AGV9OLoigoOEpp3SjOZRQliKSua6WMjCVjbDwed02X53nbXl2dXxRFRSlFdHVVbfR/GOWcRxAyQpTRxBKKwJjwS1zKEJEoZVRrfEt917WIyATt9QbD4bioqk6fN03Xdrpp27KqCRUGQQSht0fMBtR0WmvUzDnjLHHOWOcQCXgMhzHKADsdRaFSJQekMatWhdX6q2+++du//puTvdFsNnv46WeRDAMeWEDJg8ZtWp+3NxghhFBCfXCAzlFKhWAEiJ8JKcPQQ8F+vErXad/Q0bbKGOPvJQ8jbxFL5JwiWICN1tuuJh2G4WAwAIfFap3neRxFQRAU6zKknBBKjWuLan80FlScX05LWhHjnNUUgAciEAFhfqg8t9RYax2AsUgoVc46sHXTPPj88w9+8uPPnzxeLtcOECzUdWuMSaJ40O8zKvI8f/z4MSEk7Q+MMXm+ms/nbdsKxpFz3an1cuVbOXq9XlmWn3/+6Pbt237CLCJGUXR2djYcjrxYwu3btx8/fjybLZyDfr8fBAEimk4RikIScLqo1oR0eX4VR69/5avvLGZPq/zyu3/yb7XWWb9XFEUcx4Kxy7PLTKafP3hIqOw6XdWdFGGSDdqqWlxcySCVlKiu0VoLTtumKdf53t6eJ/ft/JZ1DgB8wtR1nYf0EXE3R4dt50hd9+W4Ha6zcwy7IOALRdyf1+9w3cTDF+MAuJbpMkY9gk2uSUd7HNtaa612aJyzQjBCkVI6GQ92wAZcE+sNw8hbWw+B+Eb2rusYI4iADAAowIvRAwDgVzKl4BkOy+Xy+fPTn3z04SuvvPJ7/+Af/us/+len5yf/5k/+tNcfEi5++3d+Z//g+Ed//ePzyx8LwftZImU4W5wj2bSVIgFKqZDMd6siWiSwjYFwt+vdefjZs/e3tSHiizAGUWvt0PgZEIwj54xS6tA3CjopNqQW8gUixQudjJc2TjmjL5glfvNVAKAbxiIBSoD66gBa84sO0u+Lkhe9OZRSyrYjKjZWZPNNri/aLwQKhBhjKaVCiLZt5/O5bxTyS92LL1G66aMJgmBd59bapukopV2rHSHW2vV6rY1BcIwR5iiAM1Y7ZwjBIAzCULut9jmlXEqeJr0kzoRknpa4G4dhjAFHnIVGdVprQMq54FwCxbZVBBiiUcqgscY4wYM06a3OzlqlGsSqqtq6TKM4jWLByPH+XigZozBIkvGoR9Bp1UZBqLqWBQEAMELjOOZBSJnQxsGWNOrDAmc3MBvj4ACopYx/Ybl6qaEN9mWt0ppzlvSy5K03rcG2bqrL2bos7CqvLFVKvfalry2Xy+cnF1ez6Xw1v3HjRhb1wsNo1ZxRISnlXpI/iqKiKIzdEDbRe85tnYhySp1DYzVY5wxYoCApCylLCDOEWofaWaSUAFAAQGuRgp/V4nv7QLowJoRhksJRAOO9MIi6vFlTdA47BJ1l+9ai6owQPAxiwdl6xSjh/Du/9RsPHz6M46hT2hhnrVaqI4R4cSTBqJJBnud5nqO1AK6ozd07dwghJycnVbXOssznLgcHB6fPT6bTaV03zrnJZOR18U5nM78cBQjOGZW+68MQwtAR1IjEaWetRd3Z5XxtOyQELaCxlnPa7w9v3765f3R4dXV1cXV5eTWbzxfrvCJiZYChI3VnCSFAHAIi5cCQIIClnHDrNJoNR9I5QMIoUHAdY8GgPwGj0UIaJ4eTyTtvvd1P0ttHNwTjSZJFYUIYs51mjAPY3c25CeIJo8AQCTp0DgEIpZQg+Nlyfk5xFEVa67OzMy8VHsdxr9fzjqqpa0T05UNERGcoBWsMInXOaN1FoeScj8djrfXV5Ywztr9/OBpNmG+EM05QprUGZlfzBePicLKHFrI4K+p6nZedVsQ4ypExwiirqioKw0AGURRraywQIFSGoba2NbbqlFdXFUxIKdHYLE58hX5dFUVRIpIgDHu9AWOsUc16tdKd8omoV9L0rhcRV6tVnufz+TxJkslkYg0WReFHM3gu2HA4/OlPf+oAKWeEEA8aOWOEYIwKTez+3jAOxTqfzq+e54vJt775Fc75w89PhkmW5/mjTz6TIojS7PLqanG+ePa8vnt/DMjy6Wo4HO/dGgyTTFdNo5BHom1bcMAYb8piNr2cjIeCU84I2muDdynlQlBK27ZVSu0sqb9Fr1/0lwz0S+5/5xheMuL4RWH/n/uZ/vnrYYdfYrsnfYqJm8KEJcSnEs45QxkQQtokvN7MuYEUEH2WSbZdc7AtlFBKKCXOOUK9297k94hICCPAGKNSOmuNUma1yn/43vv90fjg+MaXv/p3yqb59LPz/88f/Ksf/+Tjt99++5133mk6+4Mf/vj8YioFBCGv6lWUhJxJxph2Vqm2KNbWotYdokWgG+oiet/28gn5Ww8RdtsO2PBUa2O9IgIXkkRRCOAQvH4Xvd7hef2B73GllBHix+jwTaDAJaOCckavSXc754QQuF0G1z7kFwpWXwtgv7AOyRc/ZLftame7t+8ebCPLsCzL6XTqnPOmiTIC4DtyKXg6BUCv16uqancAZovMMc4RHIBD4hA372KMaNP5GMZtoRRfiXdeJMdZIM439xhjuk7Vi03IDgCciyAICVDGaZKkkQwaWhNCOqOMzwERKIBumrKurbVWmyyNtWpXi2UaBq2BMBCMAqdUctlL4iQKnp+fNKZ2QKIo6o0SIKysm7wt++MRYZQy5sFgAOfjJG0VEuCcMy4F50CZEEJKDmhDwTljxDnOGFKCAFyIuH/UdbqdzefN8wdPn1gNIQuapjnaP6zrWlm3XC6100oZBNK11jlalV0UZmnac4B5XtZ1G4QhIcQ5IM55xolPYCil1KJpGgSDpgTTcuJizozgBATlUqPtug7RcGooEYCcUe4ArEGHDl1njDIGraXHx6QzTAbOQpEkOnDEYVtVa3QxZ4JwFMz1Ehly5jpdVx3/zd/8VS8JKSRljBmruk5nWR8RfabFCPVDelTbdl2nlNbKCCEEl0lMfJTgQ9HVauWxaEYI41RI7tDujcY74XGk6Iyx2hhlgiBwBrtGeRYrIiJa55wQIec8DIMojcbj4dHR4d7B8Wg0ipPsxu278+Xyk08+e/joibGoHaGUKtQ7iRqkBBkDQEIJAwArHBGUGPAhP6WEQdznQGjWTwXBkNK7X/vqV95+69bR0Xw+7/f7q1WuOuOAcyoJpzJO3arx2RrdtCQxHygAUN1pax0hzN+APir3QJxP5tbrtceRtNaTyb7v87TmsigKuoWJtdVcSNVpBObfmyYBISRJkjwvL8/OR4NxdONGFCWBkJeXU08sWjYtISTPc87F4VF24/Ao7Q/Ozi8ePXk2W8yV1g02TPnOIAcBdQ5kEHEZpv0BDYRj5Hw2W5Y5kyLOekXTMsaDIKSU3bx5s23bq6vZbLZYLdedsVmWLecrLgUhqLW2YCkjVhtOiZfhyrLMi+RnWVaWZZ7nd+/effb0ZL1eDwaD1WrNOb9//36e54vFwl9lba3VBgBCyQPBGaFKt02FV+drZwD1071h7+/93u86Z/rxMIqiH/31++PeEB1xBvb7+xdX0y+/deuXfunrq3Xxl+t3ddOiMgxIwPgsv0rTlDgjGWWMlk1ZVaVzfugXs8zufLa34ADgeyn9pC5/lXfKu9dNtn+865SDa0HDzkNfN80vvealjVyrR/ysiX/J3HvH78s0UkrGKGMkzeI0TZfLpbWWMbarQWyZ9pu4R0qJSDxYRQhB4mUBgRAEgoDUH90Wk3CI3Dp0Dpu6Wy7Wkrrvff/d4ah/9+7dL1XlxdXsk88eUS467VZ59eTJk6Pjcb4uj46O8+UKHXgmGiIapVerpb8pyEYQ0++CAXnBD/j/Q0Th2jF4IQHnk4C2bauKIDpKgVDLOReC73og/EKAa1eTUurjNELotZ+fsyo2i4FuEAhAAnSrCPsLtl2ry0bd9mc+0C+BDQBGt82TZANibVcX7uAoSmld14vFwjv+MAy1Ubvl7WtYbdu6plgsFohbIS9KvUXiQmij2rbrdEsIcsEYI845pYyzAEC2e2Ge20027EsE2HRgWlt6/Wwf1/pjoJQqpSghXvSJAnGel6u1J+c6azljaRS1nRKMB1HYNS1Dt5hOJaNyPARn6qIwjI6G/VAGsQw6oznlIoodZWXTVl3rANBZSsA6Z4xB5xgjURAC46prDTrGWOhsEATA/Ak0geR2c/Og09o5wykjhDSFZZQ6zoAL5VArhYIY656ePGeMWUBHIIoS68CT2eNx0irV742Ojo7qtn7+/Dk64iNL5xxYuyuVKqWIs11XUoIcLKIFjZ0xla0Bl8cHnPNACIqITikLSCgS4oAIII5ScM4BtZQRGQDlRGmMeSBE0ChiTdBorFvDCSADwUlnjdGts50UMgxYWzveH6S9fnw5u+QiCMPYWs04CQLh3Ka2RDYXKaEA1tp+f7hcrimlg8EgTdOiKFartfcTaN14PDZWNWVlrfayRU3dbtp/GRVCSM5JmnrY2Tls280ISovOI/NZgp5SMN7fOzy4ORqOlDJPn532+v0wiQ+PblWdW1dtVTcOCGGMR9eo5gjEMuqIz56Ilz7hHK6VlrOAl/m6MchDMdnf+9ovff31V+6U63Ucx5ez6dn5edG0GtEhRRGAiBFxe9P5W4v6CJ5sCWh0o3mCPhkliG3b7ojo3v1Mp9Ou04eHhwcHB9agz8W11kEQdFZvW/LQoW272rnEl9IJIcY4ROxaDUhHg3GatI3VYRiui1wI0SrTdp0yOk57URyLMBCB5FJYQgGIV0wLeIjWzud5FAXL9Xq+Wj58sshXi4cPP18sFgTBIXadkhI4Zc7gcDhcLBbFOi/zQinlLKKxhSoIITLgCEAZEKRoLJGbhDWKIn8Rh8Ph5eXler1+9dVXhbhM05QQMhgMiqJ44403PvnkE6UUIR4ZIwSoECIOQnC2axvBCCOslyRRyOuy+Oinn7795pcuz08Xq3KxWDgk/7v/7T+hLPiX//Jfn5xdUuSRTOKopxUGQlZNfXF2ppRaLpdgNEEbCIaIzlqwhjMiOHXGcMosY9u+NcGl8ObYqyYEQbAjLvg06+ca6N3zO5zgJTe/gxD8y3Yp/s9GDOTatnMwzjkC5KXPJIQEQaDUJtFhjO6K/kEQ7Bo0rLVdpxBRSpkkmTfNQgjnYNfd03UNokVwiOAZcoQQAOJj3I1BRwpAldJ5XnDhNOJ0teiPJ4c373z1a9/47LNPHj85UcodHh7euXNrOOzPLq++853vPHz48Ic//OF00fgGqCRJvCtSqrPWbmMFj2EAAm77CV8GbH6Ra/yb2XbXDr9YgAAApVRdoyeIUOaCIOCcWeuuX9yfvXAv/bbWIiGUvACifBuU39EuUPDjJ51zFH7+titbAL7MjdhGCZQxugsUtoHjS7Uw3FkqAKjruizLXQi74/N6OUjfkXG1nPrXSykFD3gQ+Fbw84sL78yss2EooyhEtG1bu92IS19QowwRldJxHHO+YUV0XeNDhPV6HdPYx5oAlHOJiNooyQUlXGu7WuV1XddFSSnFA8K5LNerKIqO9o+qtqvr2ll0yhwdHlR5IRgd9rLJYGR166xGq41qKZBekiLjtdLLVV61neU8iMJ1XvJACsqMMVopgs60XUWpI1xbQyntulCGwUY2g0G/lyJa4hDBMUIlp4GQnkIRZv3xaLiYDPtZVrgyDmMInFEGAJqm1tZoq2BNgkBkgz6SVuuGEBZFiXFICLXWtW3X6wW+Cww38h4a0YKjHAMpZBymgQRnkrqAfJXXldGTGCnnIuSUWd4ygmhBa62abrO0gBDCuCBCCECBjibJHmXZYm2K9bpclGVlHcqkF0oZmM6Udd2IIkn6ggGnjnddc3Cw//jpU+s0IVjXNTC2Wi8CGfmj9FSvtm3RAuc8TkdtUznngiCilFdVtVosmia6ceNGnCSDYY9SWhe5v3OqqrqcLnYKowQhiMI4iElI6q51zinVtK0vYaJXHUBTZlkWBnE/7fmezK5TTduyICyaNkzSrN8bDEfr8mRVVlmWEQk7HWjnAAkCEoKUWEo5gmMUN5Uev7XWsShpyzW3tD8Zh2mSV2XT1KPR4JNPPnnw+Mm6qrQjCMQgydtuhy4S52NJz29yjL0Q4kVEa4yvWuGWGE+28sB+inFRbCTNkzjzLL/VaoWIhCDn1Gu/W6vb1vomQD/ZXQgRhrHW2jkMZJimaVHMh/uTk8tz4EwE0ild1rUBssiL2XyhjJZRyENiLRrnAIATCgh13c7nywcPHvzovQ8+/fTj07Pn4GwYhrdu3AgJ4ZyHYZxlfSnlarVaLBY+spFcIiNSyjYvvSNB9CNvtpP3tiZSSqm13s2t8a3nPkQAIIPBgDF2fn7edV3TNaFgAMQas3HJxrVVt3/r+Mtvv/Xrv/btxfzqD/6X//nhg/l7P/jJdHp5vri4uoJv/8prBwdHnTKD/ujB58+u5upy/skqrxCgKusgCtu2JYTcuXePggvDUFtcr9fz+QLQBZwRh9ZaKQVQ0rUaAKIk9kStrml3vBDPRfVY386Y/lwf/4u2n33ZdWBg9wK/Nug1mttuR9ZauiXe7iw+IcQb9CAIsl4CgE1TefrY/t7In0a2jYGklH6ET57n/s5yzvnyCmPMOeOcL2QQgBe+cFc64ZwTgs5xIE5re3F1KcMgSuInT5996UtfeuOttwlnf/Hd7+X5g7/zd/7OP/7H/+jZsyff/9739vZH48ng1u3jv/rrzz777LPVaiUDHoYhOtI0jb8DtyfAq6ACguexspdCq7/dWGGH3Ow2QgiiVzk0QAwA+kABESklAsT1KIFQ6sMAdEgoRUfAz4zxP+AxhZe3DVq5vQSI26oypeB+fsD6gtoCXwhYd5/whfAUd9cXv3i2ffPF5vXe7PgboW3btmsJIW3bUgpRFA2Hw8lkcjY9r6qq67QxhhJOhfAcbSGEtBIxlqHY2xunWVLX5Wx2NZstAAARvDNxzpXFZrpKmqaIrqqq+XzedZ0HvWQmPTNaKdW2rbVWd4rGSVEUnNLlcllVlW67MAw9/2a9WhAcyQNBY8oJreu6tCYJe7ZtCdpAyiSNu8pVebOcL+bTqXFuMBohw+Vy2RqXDQZUBkXdICWUM89RbdsWjO6AICKVodIaKEmMNsYQBga99hQ4qwEglCIOI0qpRWeN25dynCWSycswsqrJF9OG5wQpInpWe5YlTLJWVcbxMA6sNut18fTp8/W6qJtG6ZbAZrKo0ZYKYIwFgdj0uHIWs0EchGkWp3HEmG7K3moVFEUgwxqhbtoSbSsZkUHgjDWdgi0n2yECGk4IIRSB9Xs9rWA6XZxfNldX7XzetS2EQUJoS1OOFozSqtWhNEZ3bVPx/f39b3wjXObr1ToPZEKXKwes63TTNLBV+/KSgoKyKIq4DEbDoTGmKNaLxWKxWHVN42OCpi7brg6CgAF68lRRFMfHx0qppmn8UmiqllA/ITdptUJEo6xWFv3kX2XbpsiyrNcbxFFqtO26LoiitN8TYXB+caWsi5M0jJNWGdeqOE6VbQEA3W7pE0IZAZBCeKfuHDoLm/Zn54r1+vjoEJyRnA33JpSzum1G49E6X330yccPHj9ZrJYKLQDRiHXdxJQSskHtrLWIzg/l8W1a/ma2Fv0gDQCo25ZstChcVVUAm4yBMXF2doaIb77x9ng87rru6upqO9WN7lBBX6fwyfF6vVZN2/U7ikAp01orZZRScZIwzpEAF8ISUrdN0bTK2LKqDbowiiyQpu66rjXGxCKM4zgMQwC4nM4fPnn84NHDi4szwcje3t7R0REAKKND55xzqu2eP3u2Xq/n07nYjMpkhBClVBRFCL6cCZxv5F98CNh1nRea9Ig9pXQ6nQoeeO87m82/9KUvTafTtm2rqgoikFHIgDjhoiga9oYMSR0nUZg+fvzs1Vdeq8pyf+9ob7w/6O9//smj+QIOD+mNGzf+53/+z9vWfPOXf3VyePOP/+jf5FXVdrooCm1dSEhelkmS3Lp94/jgEBHLsnz69Pl8PncOCIBSCoiTMiKMGe388ouiyFrbNZvBWrCtOBBC2Hac9I7E+nPxgN2D634OfoYsdv3Jl+KGXRywy2IR0eHLik+U0jRNg0Ds70+Ojg84Z8vlPC9WzrmqXPsIwJdUpQj6/f5kMinLGrdgiQdpfZfNtpEPEIDAi3y16zovM+rZdb7f01qrjTk7v2RcChEMh+Ou615/7Y31Kn/44LN/8yd/cni43+uld+/eCQLRNE2SBv/kn/xv/uAP/uA//IfvrddrrT1attF1APBf0wFcI238bbY4/JztJXe7ceGbHgdHqO9EoGD9ncu8EPh/ettdXEKIlJIA2whFb9msvtEAt5ASIPEENEqp+wWBgr/oiEi32JJfKsxtOHf+gDfkFQpetuELZx7Alx7YduL2juzii8Ubd2VMUax9KDAcDkej0XK5dK50znWq0VXVdV0YhpSxTrWIVoZ9L4TTdY3vPMJt669zDlEppZqGX11d7e3thWG4Wq1Wq5WvYI5Go2E43D2Z67Jpmq5tVU/XdT3qD4IgSpLMKm2tVZ25upzptitguVoNhRCccsZY0zR1WaVpqtpacpFGsSBgmqYs1qvVUqMDSg2Q1XLV3z+4f/9+rc3VJ58A3eA93gIzdJwLBqTqOq01oVRLIVxA6Yu73hdHhv1er9fjlPihSGA0dZZSZ3RX5uvZ1aVkkjERhiEQRwihnAgmmraKkySOh/PFrMirJ+pZ1z1Qprt161bSS4BuYinCqZeP84VFKniEPclFEkVpHMcRc71gNBJtE8+mnzrbrMpSt0WWkEAMGKWEkLSXoHXWaauNMWAtWtQEmSX26dOTD39qLi+BABgDiJSiSJDGYRKKJAqSfn+YJj0KrC4b3poqyoJvfvPr77/3k5PTaSQzzsKOKp/ICsYpJ2Es1oVqVJ2IZBCNRsO4qovTk/OyLA73B4yl8/m0a6YAYFSgtabArHWU8jt37lAmmqYJBLcmsUCcBaWMMto5qlvbNgYRpWDOGUC0HOdFldYL5ZogC+J+6gBbrXUDXVlHWVbWleuaRqvBqH8xvWpt0646D9/5FqMN29MBInDGGAsRiLbaOOPz/yAqTblKgmDcH9SNXddE0vDi4fT9996bzbpVjkrJUAgGnFGQYJYzPD7eXywWlAGlvGqrNI3btlXWhqFEhKZSujOSCUopWvBju33ZO45jQkjTNGEY1nU7HA6bpvnss8+Oj48Hg8Frr732/PlzLkWZNwGPVeuyaOScQxcCSdcrl8T76MpWs/5oHEn54WePb926dXhw8+zk8vbtu6vVqnFNEslVnlNKBSXgGtt0hlBroOsUdySWkQHM87xr1f7+PiEkIAl2bK9/I5QyixPTstlseevotbLMF7Pi1VdfffcHP1oul4EfsClZ16pu1aZpSDixxoZh2ClV1RoAAhkdH95fL/Pp2cwaF9BQVd3BaL+u6lY2N+4fP378WFIWcv5rv/zLf/RHf3T27Gx/f9S6vGmqgIterxfHqXZKIYokyFUFDv/Zv/gXfjq21vqDB89VZ6IkC6Lxuz989Oqrr/7ab3zr69/65tnpxZ/+2V+wRj1+epElPI5TySNwrFzWi6tiuHdzvV4vFqtHp5dlhyyMi9a0xjnHm1Z3nXYOJpPx/v5h27YX84uyLPv9vnfVSZJ4RMTbNU9Hd9ttF0PsUNmdIwcAxpiX1vZgr/8v59yjLL7rdQckwpZchtcaCP0yRkcREZBSIJwyzjgAOGvQmvFo75V7t8eTIaVwfDxaLufPnj1zmkkutdaqLSmlcRwTUHW5Xi1WaFUcSnSEOJKESW0b2zlCEkIsIRbRIRAAQOIQMMkibyJbpQUKxhgSdA7jSFpdxyE7PholCXz44Q/u3bn11ls3xmP2wfvv/7/+3/+3O3fuvPHqGx9++OHHH3/KGPvv/tHB7/7ur//gB3+udGcUZsnodHo+2tunQJqm7TQyJgkAGgRKhRBG1756Yq3xPZxaGw9Q7fzrzgv6M/dSZPafRSB+FtR5Kf/+wn8d21T9wSJYs2nfRQDKGCHAmloBABcUENFZTRshhBD+ogMAUgqeokQoUgaEIuOEMmQMKAWnDWOEUUoo5YxLP0OYcYIAiJsGMUIQAa2zzgAFQnfFT+LQOus839CitVrtQklP1YpYb+ebd4gU49T7bEK+sGgJIcY5ybzKrXn/Jz9utQqCgEmaV0VZlogYBNJPtovT3v3Xwq++88290Y3T09OiKNq2blVHCEgpmWSCE+u0atqPP/rIZ4aIqG234+I553SnCSGGWUbpxckVIoJ1TmMQyePxjddee63N1bNnz9pSSxIW+bqpas55sSp0p2oWhJKXVc0pG4/HWZIyTg5u3aOUNxqtA0StO9zrH1hjmKVgqGpUXVa6q8omny6vLs5Ps707/+4vfhDF6WtvvRMFo9l5RXlwlN2Zr5b5aq10IwRLkqip87KrGacOYsI3ZC/VtD7r40KQ1i8JGtK4Hw19HOCc62aXn3z0aVmW63Wxf7RPpdBaK6UZ55RyxpgWiAhh0ncAF1cLq3UaZcDoaHiQ9jJCiLLGGZRBxIRRWteNGvNAhJFxGsAGTieCpwJC1hGHgYAsPZByb29yXJWzn7z/7mJ59vzp4o3X97Mkms+mx0ljdEeQBzwImVNKgQVGYTaftbmLGBwMvaMcAEkApLE4O59GYUqJ7MXj+/feGqZL7DJOHE6nl/OreRiGk/GwyBvnmiQOg4h1nUHotG6UKR1UnV7rPN8fDMpat109mkS3707298ZVVQFtHn/+sNcbJHHa7w8psOVyzblANNPpoq5bQshwOI7TTGu7XhWuQT9wZTKZWKfruizL0rfDHh0N0jT1tas4TWUYUM4IY8zZfLV2gJxzzohzJpKCOOvvB9zcY14KjQLxWS8DAIcbYhqlQCkTcSoYQ4eLvDCfP768uEJjy3U+m15prS3hQZI659wm2woCWZTFusiXANDrp2EgqjJfr4t+mnVoGeGcIQhitfJ3IiNiuztPsGc+YI+iqK5rn4K3bVvXdRzHb7zxxsnFSVkXXdPGcRxnKWOs38uGo1GUJmkvq9umbprVallynue5QbeXBq3qIhIhYqdVW7RlXae9THkxAe5HWgC33FlAdEx4Oi4xRvX7/aJcNm3lD6zfzw4P943tuqaZzq4Gw/46X5Fte7eUkm57phExFpIQEgQBFwJg03vt5Qd85rFJaLZTQLXWfoahl4UOwzAMOfXtYbCBYTyvxTlkjHFC3XawBgA4iw4oMFpXRRyFh4eH6/Xqgw/eb1TnnOu0QgJZFsRx3Glrm9Zatyrrh4+fffr08Xq9RsS29cUgkqbpYDBgnGhlEa0QUgjhnFGq1br7RYAtuVYOuO6rrncz7giDu+++e9Inan7ar0/LvKV2W/LbL3JUdDuteFcLoJR6E6OUevz48aeffaxUSxkq1eZ5LjYYAPMActNUSrWMCUq4tZYQvmuVo9uO+d3BwzU4pCgKuMbKxO084lYtjo8OgiAIgmAwGBwdHYVhOBwOj44O2qZ5/71Pb926tVqtPvjgg+VyvV63g9Het7/97d/6rd/69LPPF4tVlmWDQbNYLNpGh2EYRYG1SCkPA6GMrqtSCOIDFLIZQP8zFL+/VVmF3WY30s4Am9IA9cdMNum48MO6AMC5TfGRkk39yK8gv3I4+zlRy8/GOi/c+Rdnju+2Hc9x968dKnY9DvBBqkO7RRRe7jShlPqqlnU6DMM4jruuy/OVfxIAfYVLSrlYzj748XucBc5ZQkiWxZwTrC2lNEmi+WrZtq21WgjBBAsC6ccaRTQwxvj24yiKvKZZWZaq63zfuG67xWKxXq8nk4lfAFVVzWYzQES0xM/SaxvJhV+9YRhmSToej5MoJnTTsqHbLs9zZzYKEMjpcrno9ZLBoBcEwXI1Pzs7L4o8jJL5fN6qzlFxdTWrGhNn+Y1bd1955ZXo6vLiik1nF13XodNKGWM0OEoYEgBwaJR2xlK2kU6nQLquA9fnhyyUAQVCgKdJ9PnDz8/OLhaLRadUp4xHLhkXdV0DUOvHuACjlHpuSRIPva2QQQQAddeCI5QQY4xXB/elfy6YRcMYaU0dRYJ6ZUzBmASt26IsBBe3bt632n360QefzYr10thONxX54feW9165e3AwtqY2qsnSMJTcaLdanH/tl45+7VcneeVm03Y2r6ezcrmYC5bFUVIUK3SsWAY//WC9WharZclXi9X56dnJyVnTdIA0S3ma9LIs+9EHPyIUKEcZsDCit25nDkNtzXr1FAs0VhFCHBkUVbdcLlf52WQ/6WUJIeyNN+9ORgcnJ6eUcMbEydlZ0zboCKW0VcpaUJ1hjNy6dcs515murpFzniRJkkSUs7OLsyAI+v3+cDjsZxlhzKIDSmqtl/PZcDIWnCVBYNpWEFJXJVLqeQmUCEqQ+MZFgoJzdMRaCw4JOEY3vB5wwhGGxDVNW1TTq+lctV1TFcaYUAYikMwy3bZKa0IIFywIOVg9GvQYI3fu3hoPR+fnp+v1WrW6qiqlakYDxolSxljDmDDdJpD3LciMCV97C4Jol4PWdW2MGY1Ge3t7MguB0ZOTk7KulOmiMMxISji5ml1WbVPUJQUgnHjKnp1eHPTv19XKWitkeHycdlqfn587QBEGKWUiMG1nQRlgASWcc0mFL+vEWRbfvXfDKAVgg1AEIWccrGu1brRpEfTNW4dFsfZ346ZcInjXKkS01jZN4yfcR3HMmCiKYj6fn56eBkI6Z6xF32/tB8cxRlarhZeUvXHj6OLizDkThtJaHQQBssPKsJwAAQAASURBVA2Z3BhjjCWe2yECNNZa65yvYwMSIIzGQjbV+qtf/XthGD56/PSf/bP/KQwjrXXddkGUAJNtU0kKMkxEbMvOUKbbVgtB0zSklBtjpJRZljLGFCjKIAwl57SuyzxftW1NKSfXQOAdeLDzl94S7azq9URtFyjAluS4ixJ2iIKncJMNjPyipvAFZ7BzP7Bt4CGbQQAARgjBOZtMJqPxQKlmvijatvbjyqSURrWUUkKQUobojNFaK8Q6DCMAynw+6geXMOLcF3a6ixJgy6rzCIpfsbhpUeNHR0dt256dnX388ceLxaIq1vv7+6PR4N69e6cn50VR3Ll559vf/vbZ2cUf//F/fPDg4f37r7322htVraqqKYqi1+shZYzWzvmxRkgIWmqBkDCKKPEX3XnGnA86r89I3EVp29//bYZF/dduzjlrX0yjdrhxw7AZQ298LEUpWmuNwSSJCCEEKOBmITkHiE7wF+d/FyU45zjnAGS3KHaST9fX2PWz4R359ZjP/+kbfX0Gv6VWuGtdD1/Q/ED0kwkZY3Q5zZum6bpNjXg+n3lAtG5KSmkaxE3TfP7550q13lxHUWSMarpWCME5EOKvmwJAwgSlxM/W8hx2D7Iqpfz9pZSKo2hjZ2LmxQM8kSuJMwAoisIaE4YyCkIA8OIucRxnaSylnIzGSZKotqurqlznvrDljDbGMIJV16i2cWg9J6DpuqIonp2cLRazvb29xgoHvGv1Yr1qjbuaL2plRBSWZb5erubTWdc1hDoKjhAEDtptECN/CTgTYRh4fSSfFK1W+YMHD58+fRyG4b1796ApT07Pu65Le1maCaUUAnRGEy420SL6qwAeqDDWCiHCMATG27btlHLOUc6UMUEoBPMBKBNCSMJFwG/2DmUYcsGs1Voh54KJKATgDOJkcOeWMDV99mj67HGumqskiVDff/SxfPjh0ugyTthkIhCa1Wp2//79piTLxbKqO+t41guTXnLj5vjhw9mwl1Z5ThkYVc2uzqMw3ZvEnBq31x/aTl1cXDnn0l4oJbTdPAi6IBDArbGlcRhIRtGBa0T0AlxVdlYvbNuoOIWAM0q6fL3YP+x/+1vfuLi409Td8+en8/lVFCVCyqJYz5YLSjjnAWyq/oQH8uDgIAhutm07m83my5mUwWQ4Pjo8Hg2GGzgXkQlOwaFWo16W9Xqqqjh1QSSqqrJEIPqOZOs7rwhQAGKMBiCeuMM2Wh+EENDOh6rOACAw66xyrnXEy9Q5R6x1nXXaOs45BRYHctDr33/1Xpakr7/6ys2bN0+fP7fW/tVf/fCzzz579uyks4pSro2y1lHue6apTyXDMORc+tvDeyzGmODC1/8IIdZalvLJZJQkUVmWdVE6NE1TTafT0XiYZEmcx9ZpAGecdmCLqvzgJz89Ojq6/+prAHA1n+q6DeMo6fWrqjKh450G0ljEkLIs66dZH0jnv74Q4o037z/6/OFwlPV6vTQOtWmePX9yfnEWh1GWxbduHf/VX536Oxm25XMfMVBKCWMeC3GIQgRd11VVRSk93D/wmkU7k+21Dquq6vf7N2/ePDo6evz4cdu2vV7Pa655c2+t9fVXQjljAgAcUO2HebptdxllXEpK6VtvvVFU9QcffvTg4XkSs3QwrJUGaY02VEgRJETwIOkxzkPeWWs5l/6c+ypGVVVCcGO4lCJJQwRTFOU6XyrdRmFvZ7J3UcKucLt7Zmeyd+qN10mIsO0y9//y1nkHt14r0H4BnNg5oet+zjrrYWRENMYw5usdYrVaxUnoux6klIQ6r48rGPFUdmM0giUEGSeMMSAagPp2L22se9ER9/O3HbOdbAsi3jsyQff3951zSRLleT4YDCSnVVWdnj4f9Pu///u//9Of/vTs7OzVV1/N8zxN4cFnDzn7s1//9V//yle+kqbZv/93f951pSN0OBzO5wvvUAFoXdeE8izL7LUePNgmytbaXSPAbtsd/8+GCP+Jr/bfMITYnUN/Ff19TS0SQpxFSpgQApE5h9Zqa0P/hQCAUo6OUMbItf7J7eF9AVHYxUP4M00xLwVDdjuleuf1YRtA7OyzD6qcc+BwizSgX5O7JghKNrPLT0+fP336uKqqMAziOFZKcUEBwPfUtG1tjFJKBSE3tiPUMQ6UUkKdNm1ROmDUoVG67VRDGrozI0BJmqZRFAFAXdfL5dI32x8dHs7nc611P81u3769Xq8B4PT09NXbr3vL02qNaHeAmGfbEEI8V5dzPp/OVusFR9KZlhAShiE4o5SyVnPB9vb2+720M1p0XdYbjMYHTavCKJMik13bNJ3gUkh5fnr26cNHnz54QCktyrxpKs5pHMpACiF8GzwyQgWTlFLOeCBlFERCCKW6IAjQwunzkw8//PDzzz9PkmS1WE96ycXljAoepj1CSGesNgYAkiRxBIjbDBk31hBnCSGdaoIgCI3yEKBFxwXngWzbGgihlPgkjTLCGLGWR8exF16jnDlwZdWFgUiSYSB4vmop9t5845fzhf2P3/vLB08+vHNrsLhSYYC9fsRZeHJ19fFPH/b60dHR3r/6Fx84AMKACwFUGofaAgAITHqRxo5Faapr3Yt6v/zLv8wJ5/PLyziObx8eHe2Nu64rmzKvll2bC9qFESXM5XXVtpWyFACVamORyoBG0UbSrqlaGQSMpsRRZ2nXNYTYTlVXV+ePHz95770P6qYcjvq9rFdVjbQQBFFddReXV75fVkahUirLMsZImqaE0dt37+zt7SVRpJrOV7mAokNjOuWsJtZYVVtVC+fiOA4YmbeGUkJ9pdUaQjmAJUBV68eoMEp9gyvxob1k3Dmnt4vYOmytbo0CcA6QW0PRUUqllIIyRlnXtAevvvbNr/2dXpbtj0f7e3v9IIrjeJT2JWXL2XK2WFmKiEgoZYwFPPTDV7x4M+fSO862VX7MlWducs6rqlqtVoODwcHBQZYlRrW5Vf2s98q9uwcHB2+/8WY/iZM4XC+Wbdt2bc0oECCL2SqQ0cXVLIxkkqRpL3t2euKRLueNCQNf8WSCJmkQJynn3N9maZoSguPxcDgcojUe8Vuv187qfr/fqebs/MQXDq57tU1nVBRVVXV5eam0jqLEz7UKw5ALGsWB0i1lAIDOWcGY0i3nPAjFV776DiISim1XD4Y9IM6PDN3YL6QEvCAuBcKAWqDMgdVoAYECMMbWVbu3t/fs4urPv/sfPvrk4zAiR7duz5cryrl//97eXhBFs9miVY1AUedrACDE1nXt788sS6TkYSg9Uy8Igq7r6rpUqt1OB30ZToBrocNL6PcuULj+rusRwO4B3Srpko0E7AsemV8A1+0+7rjom9fg9c05N5vNCEUpWVkV1mohKWNEa80pADhE51ABOC4oI5z6OoNFY23Xmq5FrTfBnx+FtTvO3S42QPr2sH1QSwiZ7PVu3759586dXi99fvKEUuia6oc//OF0ennj+Pi3vvM777zzzkc/+eiP//iPLy/z+/dvnp2vfvjD96Iovv/aq1KEPhGP0rAsSwAUciM0JCW3CG1XW70Zd2St3Tm/bUL8C5387vz/zcAJsNVQur5toBe0/qwaY7QygAQIWuuUMpSCc0wI6hz4fJ5eE1kiX7zG/jNffKPN90K41tTw0jfdPXn9Q37u2UB8EShsgNVN465zaJQiWpPnz5+v1yvnHGMUwfb6qXPOWs0YUaqbzRqf/BjbSCnjOPRDH3yGwBgTgvuVYw1a66zdaB1qo9brtedTO+fKvAiCYG9vbzKZlGW5Wq2stb6TVim1Wq0e28dt26ZpCoh1XfrBK1prq03btgSttfbo4NCvVSHErf1DLxcrJXeOWKOjNB4O+1EUyYBba5VxYZzcvH0n7fXH43GpaNU2eZ5zGRDKm6Y5Obm4mF55tmYahUEYMcLAokVn0Ia9nhASkbStQmzaVpRFDcRVVeWcM0Y75whhX/nK17Isi+PQqBYZV9oulmtjjAUcDAa9Xo8L4ddMp1XTVm3bKq29CQVCGq0Q9QYKEhwAgigMw9A6Y4wqy1Ib5ZxhjDwWiXNuNBrduHEDGC1Wa20gkFkkg3kxi7g8OLzxy99KVBM8+nxaFGwwTMMwODzYm0xGqm2enzxdzmYXJ+bVV36Fcz5fLp89P2+0SXsDY+xsPh+lbMaV1kFDyGI2u3fv3v1bb8znc87QVesV66WTyXC11o8fP50tpjIWZTkDGouIUTCMgeCESx7Fol4pnzBtBjwSXpZl13b7470k7u/t7QtJHz3+7L33f/TjH//044+K3/7tr/X7ww0FickkyWbTFV5e+BVeFMXV1ZW1Nkmio6OjvYP9/rDnKfRN06RpwgLRdU2dr0/Pztb58oGzIpTT6bQu1oJCGEdbQTPi0PoKN6WcEGesIsAodUL4+5s5NM45QdA66zlLiM6CA3DAHN8Io2xIw2DRWe10dzA5eOPVN+7cekVSAs4Wi5w5ElHxpdffPnl68vmnj7UiGpE7BEoEDxhyHyX4zNKnlP5G9YXqtlGedOacq+vaXXVZFGZZxoFGUg6z7Gj/4ObxURoG48FwmKVE64VW2qIH3Bbx+uTk5Pzq8tadm7/1W7/5ymuvMil+9N57q3xd1zVQlmQ9yljbtnlViFD2+8dCCE/1L8uy63QQRJTS58/Pq6pSqvP/DYN4Nl0URZHGe555ANfoygDgAUkf7EspfendxxB+fi7dzuRkjHVd57nTR0dHn3zySVmWbdv6fmtEJEjRbdjclHJE6IwWQBEJEuIoxY3rdYCEyWhW1P/y//unH3/8CVCWZX2NsCoLLgRjTHB6dHQQRVGZr9raCeKA8100gIhBIOI4DoIgjj02AwBgbOtQeVX8bWvti4z/euiAXwQAPEJ+HQfGLWt9q0OwoUN7VIlz7jU6ET0iba6HFC+Zdf+Ye+HILeeMMe6dQRAEdV0jSm9SwygJQ7larQw4xggXhDPfLg+EaodW8AjA2c50nVYKAQVjnADl+DJWvwsH/Rfxd7ffCCFHR0dxHO/v7/f72fOTJ3meo9XL5TJJksVi8Qd/8Ae/+Zu/+eUvf1kpNRpNmqYZDseXl+WPfvT+x598tr+/78fGMilm04UQQiu1rgoASNNQMNE0jdHW63n7vgxKqSd4e0rH9SPcOezdM+S/gMTw3yqKINekJL3HBR8roEVESqnWllK9i3V8CUAIQoihlCJyAOp7QTdr4NrS2vh7wO0ucHvcuPtAuIY3kC+WG146Sz8ndCAvClsvnUwZSD/OqiyLfr8fhKJt27ZtfRsLISSKIsZIXddCsMGgt1zNENFPtmxbhQQODw9v375tEaqqatuWUsq49LcAY2y6OD8/P/d69kEQdKK129Eq3pj4d3kgRAjx+PFjIcRoNErieLFgzmwU0vYPDkajke4aD+QQQjjnWZbpzhilndHIKAAiag+glFUeuYAQti7ysizLopZSakODKGNBLGTcqi6vyjCK7tw5EmHg45VekgrOrdJt25rOmE5pV3DOnTNesVFKCcT5ATdScs9WnkzGd27e2t/fl1IadKPJoRcUmM6vnNZAmEFoqpJSipRo3bVKtUppaxBxkI59U1LbbkY3e1jo8vI8SSKH1jnVH2RJEiNaQnH66KTVajQavfLKK2nSM8YMh0NG5b07d0ejQwbEKBLHo9u3XkMrHzx4/q1ffrvt6uenz5Rq79y585Uvf+OTjz97//0PLi4f/O//D//0zbe/9Bd/+f333v9xnPXCKBr0Z5GgQoimreqyXK3bulInp+eXF2f8q196e7mca6fB6eVi+vzpw9PL0zCWk4MxF4QSFJwC4cYaU/sOhR4AoGNaISWE0YAz00G9WKwYjXq9flEU+apExH6//86X2d7+hDFmtA0jqQwUxVrpttfLyqKJ4zgJE8ZYWZZN083nc+OslNIZNEqXZblYMM8761SzXi2sNeenp1EclFWVRAFazSEMhPRWGB06x4AiASCEM0Kds86iAYWWU2oRiXNOmRoABKOOoDHWoaLMhZEUlAIiaGuNQmUoIYIyIcWd23dvHN7q6q5W2jQNI2Q06K91kRdVW3SShaEMwTkCxCEByhhspMo2shBIdjIS3vbthsASQtI0nU1PYiljLl65fdvdvOmMKReLx1VFlFVtLQkbZX3TNu163U/ivb1JV9sgCKxzdd1+9OlneVUChe985zt/8Zff+/zxozwvuBRhnBp0piqEEGV/0O/3gyDq9/uAnDGBaBaL/Opy5scF9fopp+z4+EZV1YJv1Amvb94S+YwziiIESJKEc962rR/0xRjx6sKUUucgCETXEedM01TOmfPz04uLM0KwLHPGWNcZD36iBa8lbwFR2a7rgG4EgMDLlwJxCDxIy7KaffYk7U+yXnJ5eVnU5w7Bh2PWGmcVcYKCjkPGGKEk8P7YO5uiKIIgqOqCceI0egvVdS2lhHNmrd0GJV8IC2AreOx9AN3KGeE1Mjn8PKdlrfU1xV3edt314hfVmq+nidfMt5c8eiERhog+1Gg7NRweHw73q6oYjnqMkcVisUOpKaWUIaGWEEKoQzRACBCLYIEAY4QS4SgaILsD2/kSHwDBC+KI8Q17QgiPQud5HkXBcDh88uRRP0t/9Vd/dTIZLReLn/z4w+fPn79+//UvfelL0+n8u9/9bhTvZRmnhOd5OR7v3b179/z8/HI67/V6XddFUTgY9AFI0zSd6oJAjIeTGzduWGufP3/uafY7AOa6n75+aQBejnX+Zjb8gmsHf7o8Pc0TGNGLGTPGGDHaMgaU+knc4Fu1r0cF17/e9UABESklfogMAKJ78TWv8xXYF4eWXT9I3AJd1uI2nsBteLHTYvLynSDlRn5Da80FFUIURaF155u0KQVKuVccEZJzwSaTfevnXoogjrI4TY6Pbx4fH+dVCcgBeRjG/eHA4wfWuEYVYRj6OTh+WkTXdbPZLJDS59OmU3VdO+d2+aHHYqUQ1mrfAyUYPTo6Oj4+LtbLrus8KaGqKoemyBeI1qGptKKchGEoJFOqpZQ6JyiF+Xz++YNHWtu9vYOm0eneMSJyKZgIgkDfv39fhIEPfRgQY0xT113dGWWttoi4KqeMMR/cCMm8GFRd14zRKIj7/X6SRGEY6k6rViVREoQyihPGWFVVUZpUVUUI6UxX1Y2X3NRat22tlLKAlFKvJ9QZ3XSdr1f6rDJM4qSXckqEIMc3Dvf2JowRQjFA7tOwOErHe5PJZO/48GgymRBHspgywtuy6jptHbTaWIuffPwoCAIpguWivDhbTib7/Wz8W9/53dli+fDh47/4y+9//uThK6+9+pu//StVVVz++6f9yS3BmVvqqnWvvHbz6NZkVU57w5Br1fZ7KeW0bet+lt69c5tQs6rWXdfUraGC8IBTxggw337dtEpK6axrm5rQKpQBYyKOU+ooIhrtTk/PnXFaKyHYwcHBw4cPsqw/Ge8NBr35srg4n7atCcM4imKjXaO0FzwOw7DfH2ZZ6kUJ67q8uLiYzaZM8L298WDY6yVpGAZ5sUr7vTSN0zRer9dRFK1bbc0OAfb4KiIgYwSAbuY80A1NARGJUZxzRplxTqumKUvfyIRSorFaNbpuwbosike9Qb+fza7mTx89/eSnH5umYYhSiLu3bxHEs4urJ8+erhartjHKoSag0SGh/dE4jmPGmFcL8WiSlNKTFTjnvWzgqzY+Pr15MFiv15fn52htP+txAMnFuD9wqguEnAyGlIJu6jP1vC7KKghv3r41W8wXi/l8Ps+r/NGjz2/fvf3tX/vVt99+e75aLlf1tkMPjHEWTVGU/f6g3+/funXLWpsmvdVqtZivoihpW9V1ajDgURQfHBxdXFwQwjwzC7eT4nzdhDGWRrHXYymrqm1VHMe7SUXX3ed11No513Xder1erVb7+/td1/X7/aKoGN00hniLYJFQ0lVNzRj3mjOOUKTOo67TZX50dDSfz1kQtwY7ZUIZJL0kkoIzulrOry7Py0CuF3POCDAGNPRpje9TVapljGVZ5qlWVVU1Tb1x2BR1Z9g2AbtubckXWxmvJ23XzP0XCIk+SrgOKuCWBOqnMe16Q3ax1896u52JR+d2lWbnnJ+aA8QdHx+/9fYbXdf0+knTVGdnZ2W+8pGEsZoQxwUKyRhhDg3Ahr/GGBdcUMIsAQHkenTituR5rfVOacpuNaHTND04OOj3+34lDIfD8/PzizPb7/fffPNNSshvfed33n333UePHo1GI+fc7/3e7z1+PM/SftM0V7MpIk4mE6UU5VJrfXFxcXh09Ku/+qvW2j/7sz97+uwszcJ79+7dvXvXy9n60YUe2PBV7Z+9BC9tf2MRw7U1cj28A4c7yNDt0mIA4d/iLCLfVbUoIbAb73n9q72EKPhXbH59cSrpbuXsOkSuhy/XDvWFTrPHQrZh5wtJR/+nv9aMk7opF4sFY6wo1r69E9EiUp9OWGd0rZqm6WX9tm2DIJiM946Pb4pAKmUePXrCRHB5ebVarZMkMRbiOPa9XRezCy/i5I/QBxBaa48xCCHolhbqnCuKwiN2WmtrDKU0DiPGGAVUShFCPCTp7ed6ve5Us58MpYzKKp/N5kHIXnnl7mR/jOiUUkJISul8vkRCwyhMsx4ATK9mDnA4GsRpOorHk8lERuHV1RUhpK3qxXxe5UWZV8YYCpTiJp72itG741RKMUa8NsytWzf8HB9fAXFShGGYpikSyLJefzT0CfpsPkfYjNmsWlR2Y2PrpmGMUca4FAAQCOnLcA5NlmWM0Tjke3t7R0eHQjAEe9Db92ZBhsHh4eHt23fSKLXWobXMgQjiSEijLCGk3+8fHh7ePLpxdXGZ57mgoqpt8+yi2zd37tw5Pg6YoCzCwX48GPccrHmov/SVW598eNLv96t2Sbj+2je+cvvmERD35Xfe4kB7XIowknl1xkT6G7/191+fnfwvf/jPy6oejftAER12bRMEwbg/nE6nYRp1XYfGSSaZI6TBMBRpmmltB9HIOqebbv/o6NnpCY9lnMbT6eVyWRrdhEFmDBsPB61Wy/XCOSPCQNV52VRZOhZhJMP+4cH9/kHv4aMHbdXkdVfWNXFuPbtMojDrpYeH+2+++ebXv/714Whyfn7+h//qXyY8E92Kom8LBwPgkBpCgYBxLIzCcrUKpewN+lVZ1HUpOWeCEsGsNWVZtnUDDhgQVE63bSDYfLqqqure3ds3btwQlAFjJ+tH5+9eGWOaqkXEQdYbPH8UBTE4h0gUC0aTSDB+8vxUIIyG/bTfH4/HlNLZbNY0TRR5sWqDiHt7Q5+xxUnYH0QecFu3jcySapUv54uLZ8/efOXVveHolYODXq/3yv17/5f/+//1xq2b6SgOR9HCrt5648tJcOvDh4+F0dbqZbFsncmK4uT87Mtf++rRzRv/p//j/7kq6lAm+8ODPC/adfd4+el4lEUhu3P7qGmqcj3+/l/+uziOTk/O9vbG43HSVOuvvPNGIMnJ80f5ejbZO46iwFpLCHZd03YVIgmE7FRDKTHGRHEgJa/r0lpbFOteNlSKcp7mueKcEwpn53NKKaKJ4l4QppQFR8c3lVJKW8ZlOtwLw7Bt2yiKKKVd10VCOIB+f5DnuWpbX7bpjPZJxjgW5fRUIppKE0KGaeRV39u21cqFUVrVXd2oIOkDAGNMsjgIUwrIGaDtgn5089YeM2UqbED5IJl0yi1W6045h1KpeSheZGDeqnq8Zwf54lbO+fq/dtJMO1u8K9b6J71npZT6epPWele42dVodokdXmNIAHWEAFDnEJRx1HMbCXGA+3t7ypj+YEQITvZGz58/5SLcyupZgpQyjxwwABSCGWOYMEGklaoRayoCGQtbhB7PAgTngFGqtdVGScGNUY6AlIxSZ50TUvUH9LV7x/fv3vjBD35w+nQwHo8FBNPZvC3p+z98eP/+/bt3j3/pK7+9Xvz5e+99fPfu3W9849fW1U+enb13NV0LERRNi4x+9RtfefTo4bPnT4C3b79z7+vfeKdtu/c/+GHTFoC067rFYlZVVV2XvjsDAKxFAOeHIDoH1vhLQACAshfiRd4v7gr/Ozd5/QGl9Pqf/9moAkFvUK0vPP1ijDiAbx7ZjG9Goi04tMZzPxgwR6wFg7UTQkiUjqDzEpiUEsa61ghBKPEDDpjvNPad4Rvgx+M9ANYZX7feIFiIzjqADRXAOPAEesa4CMJdIsQcEI/J4Ubb02MIQCihjAvBvNYTIUAoEColl1KenJxMrxaU8JPnpweHe9Zuel6sM1YZIZgQwhjsVKOq+GDvMIqSpjDPH59lg6HqzGwxH4wncdwXMjm7OJ0tP3zttVf3jw5pAYkeEhH4u8M4goSFaa/HeK/X81MVDDMGmq6unUPBpNbOEVo2LXE2TjICzvdbAXGPHz7Y3xu/fv+uoHA1v0LTgFFPZs/2x6Omqy2qQbYXcsFaM+j3191aEjFfrPLpKgmitNdHSrTWLkx7vV7a76dpGschpXS5WNVFs1otV6tFWZZ5sSqKIg6DXq+HhIyig6aqAZo0SfpZwigpy1xpS5GEAQ8ErZqK1qw36NNINtwEHJSzs7x0zhHBIxk5aUUYShtaq13jQINF03UNpySIotVyOR6PkzhmhKO1vk5qtYnjkAuqmkYQoqomi+Llcs4ZadLTXjoCFxptq7WbnbRulIwGI+DONOtyNk+zUJuyM+XhzUmW9W8dHBJqqHBt21ptbt6+3ev1vvdX/2FvPPzd3/1d5w4fPXp09vD09MHZfD7/1re+dfvG8OLyDN3g8GBI6WGrhmkWN2rMpQw5Z0pbra21tq5rAuzu3VdOT58CUNW2cZr4CmKRV0Y7xzvCCAHamY4ilVx0Ttm66PcGNCDOURYwEXERCNIBcNy/eXM2XVwultas0YkoTbMs6w8n6/VKaRPGSZoNnBWq0wQhieJynefzZb5arhZz1bZxKDhnSRBkUajqKl9MnWrSiI0HcSLg8vRZyTQTkjAhCEdnjLFaKQcUCeWA1FmnO6MVIxgJGYZhW+eEoeAiDqO2rFfLBRobCNlLY92pNE2Pjw4ODw8ZkOl0WhRFVVdCCIJgreOEIoJXzheMDcfDMAgYEK21Mco5l2XZjXv3KKVeMt2rEZAt4cj3KHtpUh9ORlE0W8wwDPM8X+sFBzTWrvL8o08+/ta3vnXj5s29vb0/+dN/K+MgSZLTy9NynY9vh3ESTmdaqS4MQ87ZxcUFEKyqam+yf/fu3aurWZ4XzoJv4+j3++++++7BwcE3v/nNPM+XyyUhJM8LITbgQRKHiHh+fq6U8tJD3nJ5mAcAuk77PM+3KiCB7Z8AAF5ZxTtCRASySWWs1WEYepUFn0/716dp6vunR6MRpXS5XO4cLb2mQbQrQ/rfAOB/++zNbifh+kY+pZSU8vDw8PDwkDE2u7qazi5V1/R7yfHh5OaNw+Egu3XzoFMGgFZNa2w7na+drglshi3tnMp1L47b3shdBECvMeyu4wr+BS/ldvhFqiN+sZpOrzVN7N7o97/tud/tYaPF5AduFUUxGPT8OfeETUIIoZwxZIxQCn6qJG4GSNIgCChl25FDJM0Ca5EQL7qIgJuJANtjI+gIIYKAtQbaxgYyLIvqzTfe+vjjT6uq+Yf/8PcfP3r613/919/97nd/+MMfDfojxth0Ol+tVs+ePWfs3Zu373eqTp4FZ+fP5vN5VRdxfPPmreOLy7NXX33l8PCwKNcfffjJbHYZRcHx8fHJ8/P54rJpmsViYQxEkQhCsWnq25zwnXf3k6n/pisOfvtZSGNbJYHtsKsvcAh8oLkrFuwKWHzb8PXS+nHOEUp3t5WDF6MW6Pb5XUZrrXXwgqNw/XO8auo2Wt2AfDsIZHcwu6P1d+h8PuecZdko6yWU0vl8ulotOOdcsCAQYZgMBoMgFACwuJw3bd52hdLOWnRnJ1qbttMykgcHYxkGi9V8Ol13Xcc5j+P0BbyBGzEpQTfEJsG527YmOWM9Q0VZ7XmXFB0gMkplIARQRjDL4jiMVqsVGuusGQ6Hxpj8+fPLi5nRatTL0rRX5UW1WmmltFaUsSxLjm8eySRCSoByymG2WlIKUSTaFqpqXdd10zTaqLau87wsiqJtOwKMi4iLyDlXl7W2HWMsSuKkl0nGKCdInCMuiILeoD8YD5J+T4YCAVXXFOsVABjnkICMwjCKKBdeSSKKIhmIMAg2SgwIzqLXt0BEIQThnBCilNKdIgQD9NIRnHMeBEGapmEgdLfUnWbABYvTOIyjgINzuqYMm2rVNGvdom7zspzV5bKtiueffgoASZIQa54+fvjsyaPJZLJer/f2xn/+F39BCHv77bcd0B//+MdUyCcnp5UmWndxIoQkRbkEojuVAVi+Wq+zLBOSpFmPCUDQRkZvvPo6cbZqqyIvpXBRErWqAqW4jPOmllxQSi0aioRQCqA7bYUNQDGlTWNqhbpzbdOVlmgq+2vVzta5NRQd72lEIoJQxFnWtY0QQvCwa10Sh3EcL5azvJgtp7O6LFVdCYICkFojwFbL6c3jo3tH+zcmvWpxefnsWVvM2/XaphEHlJwQSgUhjlEiJReRNY7LIOHQdR1Vrc8biTX7g5GXQwk5N3Wzns+N0TIKnbGAdn9vPB4Mi6K4ujz3lTNnKXHIOZeUcc4Z2Ywz2N/f55Rq3bAwvHl4ePfeTT9V6K9//GlVVev1um1bIYT3fz6t9G/07R5BEPjf1phNiS6QIecGnUWHlDx49PDOK3dv3r7V/mlbdXXSy8DhcrmM43NEC4AOTS/rUQqr1eLqkpZF9Uu/9PUbN24RIqryCaU0jhOvIZ3n5WuvvUEI+dGPfvT8ydM4Sm2gvT552zZ7ewdCBKenp1rrJEkcvsiJ/UQrY1zbthb9wBJr0VGyaYtwznmi4q5DGjfFfcc5dVvRIbLl94VhmA3Hfijc/v6+t1a+RrMrdvgSnacHeobdzuDuPK611tMtfaUjy7LxeHzv3r1bt25dnD5qSrqiOgzJnZt7b7356nDYJ+jqglICnLNAhvmazlyDrg74RtvfRwbXAYNdVcVb/N1X2BESXzLQ9Iss/Z1Bvx5UXfc6jL3gtX3RiG8yRbctTnsfI6UsyzzP86urq/F46KPMrbvyr0HGiJf/84x0vxeQu0/zfkwjWMoVoQqIBWCEEsb8YEMf6zACFNBoRcui+3/8P/+nr3/967/x698Bwn7y00/eePOd3/67f3eV53/9ow/q+gQA4jjinGtl1nkxnc2+bCwhcHA4rpv1bH5xcXEWRXK1XrRtfXh42Lb1w4cPfvTeD9quPjw8vHnr6OTkZLFcOQdCgjFAKRFCAPiyHfFC6de983+5a/9vu+2iOvgiaOFFYH3RkxCC6AN0S6nXdCf+t48DEYHKwH1xe7EItiINhBC3bXbYhQh+/W/FpDejoPyavH6DSC5hF3Sy67SGjYLCjj3jn/eOarlcOOe06Q4PD7uu0bpr25px37bDsl4yGPZ6vZ4QgoPqOt00rTJNVXZ1pygRMozyYmndTc4jD3F54YQ8zwkCpywQEvxNoU1nOq31ejPphjBCKZBddy4qJyUnDn2riOBCciYFY0CyLCUE8+WKEkjTNJJBXqwkk5KLMOuN+n0hgjpfdk0N6G7dujUY9qMkjnqJOJfz5UI5FwVCz1bLlUZQw+HQObda5Z5GoJTKy6puWgDKhKA80JZ2ne7a1t9rQRRSwY1D5VAjKKWAU2s1gOMUGAXjNGrdtZfoR65RRkhISWyRtJ2WYRgEKSM8R2eUttYCMGNcGHBvJQIZcUq9ZfOUCEIRrHWOEkJ8y0kch6hMwjLOojhIsyhiaOpyoRvo2oJAE4VivZpVeVHl04NJNhnv67V6dnrCGAz2R1kaGWOUts7Zy8vLtlVZv/fa62+yIEz6gzfeeOPzh4+Vbv/u7/7OZDL58z//83ff/Y/3799//fXXHzx4yC2iA0CgcZxGUZgXCwbN/vCgOipX+WqxWDWNRuDW0KzfGwwGavrcL7JAxoiojTVWc87nxbo2ChGVs5YY7bqqKTvdOkFbZ3gcRjy1imhH87rlnTo4HHujvFqt0LFbNyaMuvff+yvdlUq1SRxGWSQ4SApo8WCU3jw+pBRtl5fLqTFKuLYn4Gx5CWxsXEdtRxgnwMIo7cdpkqVl1Vrr4kCsmgobK0VglXba1FotZnNPF6iqol6vKKUsI/fv3F6tVlKIslg/e/o0X642c4dBUGQMOOOUAtHKlq5mBJxzaPXZ2WkYBG3XHB8fRmnYqO7Bgwd1XXtdwiRJaj9vzjkvPemc8xU+f9tUVRUEQV2UURTtTyZozdVsSggeHr9Wd+1fv//e3ft3/97f//s//ukHV/PZV7/61ddff/2TB8+B6DiRDlUUBQDAmAiCqK7V2dlFmqacySRJoiiWUlZVpZS6f//+V7/61bpuP//8kVXdvXv3ELEqc8ZYnuc3jm/Gcdw0HSFMa+vtx051FQA8JACUMsadc8YaRjfwgIegdlECIYTQTdtYEAgA8JgKbhkJ3uH1er0NfLqdC+VPjt/vDuf3hs8/D1ss4Xpy5oEK7+C7rnv06NGzZ88Eqdq6jAI6HPTu3D68dWOfMbJczDhzgts4DmIS9JZhKKFlAAFYfJFsXQ8Uridh/su6L7Y4Xg8UXgK03VazaFdxv+5gdvYat8Mydt+LEIJorwUPLxjsPkltmub09PTOnVuDYW88HkdR1FYLSim9tn9ERDTwog0SgCAhDMBRSqytKacycNYRrjk6bg0wxlRnCSHoCDoGAASYVlA5m/Umt26/ioTvH9746/d+/O5f/eh//B+/9sZbXw6TP3bQaq2Nc6rt2lZRCtrZjz7+yWg0Go/HR0cHQpK2bR88+Hw+n1EGs9lstVolSVIU66OjvclkOBik9145ns1kFCXW4sPPn7StEkIAwW2m7n0n7E743zqi8FKssH3SLwMAAGuRkE31BMAiEgDqJRABKCcafEGEcdh+KQYeynrBgHHwAm3a3Qt+T5t1eI3sAttFRV7S+aDXq2ObQHwXW8AmstGeNyADXlUVom2axjnDuCfwaus6WkEYSiEYYpj1Q9kRhK5qNBCdpEEvG8VJGiWp1m3dsCCQe3uTNE3ruj47O0tSQSlNwogQ4klCXdsqrQvn0G5QQwYEnWOUCsqSMIpkoE0HGsEhI0AISMbjKHBGl2XnrBkMBkkUFEVRFMXeeP/oYC+No7oqmyJnjPmhtUWxBoq1bpZFfnF1dnpx6Sjp9Xr9LFqtVtNZwznNskwIRghah03bKaMJ45xzh6Qz6IjulNZOJVESJSGVola6qcuiyJu2DkPpADqjq7qgzMlWIFhrtRQ1YwIIcQQpU4RsSN5giepqpex8drVer4kjMpSMiV1e5C+ZtzxBEHBOKaVG65cypUikWZiFYRrJLODM6bprS0OtMSW6jiGbXjyhSDhRt4/3j46Om6USHNK0l2RpkVfrsmiVfvXVVz9//EiGejAan03Pi6JarFd1pzqthoPJv/2Tf9c0zeHh4be++WuDwUDwsKlzTmVgHFilGSAlVnemaxSAEyRKI5gMDirVWgJZLzy+eTPr9Rblqq5rQmgUJsaYZVMg2oQLZzV1gjMZhsJ3TgrJKaUy5L1+ksScQFgXRitkjPkcyAJqrao6N9rmRWoNnF88QdNMhoO90VhwEnJCnaEkeuPVO1/7yttWq7arTZOv1+umrnuRnKTxWbnCTjjO/WxcE0bCNLQt14t1q0wYZcV8qSyOhpO2aa21geCmrp0xhlKi7d5wcOPGjddeuc8YqfP15dlpU9VdWw/6PULI1dVVGk+UQ3CInBFCurZFtADu6uqqP8iEENqYzx48ODl7fnR05CdH+/p0kiTbadqOUtrr9XyHG6U0jmPOue8HC0XQUuodpDF6MZsrq4JIHhwcnE0vacCiJM4G/Y8+/eSdL7998+bNp6dXYSSCQCjFfV2Dc4mOBZJfXky7gWnbljFeVVXTNM654XA0HA61so8fPRVCHEz2Dg+PrbXnxvR6vSTJer0eAIRBhA7yPLcI6IiHAZRSu7ICAfDuaGe8Nsi82xo+n/uyFwbOh8Y+NvLmrGkaUZZpmjrnvDyld/Y+UIAtwr9Ls/yT9FrTQRAEURT5mojva/D8pqZp8jw3xoS8DqUMQ3+KutVqwTip6ypOQqAkDEOgPEmSOA6bprFordkaa89W38osXocK/IOdR4drUQJ5wWt74d53uSC9NmP6ussh27lT7hrjzG/GWF968L7HxxmwHQKklHr27Nnh4X6chFv6i38VcQ6cQ2McRS+7tD1mv1MKlHJKgXCPFckgsEo5o4nqgBCjOkMpRec1ygigc84pq+taXVzMus6GYXjr5v3lovjjP/q377//vuqMc+h7igEsY36wRVgURVmWy+U8jmNKeFNrpYu67qIomF4t82J1cHAQBNHBwcFgMBgOh3fu7Y/30iTOlsvi0aNHWkPXNWEYNLXedAYg9Ui8d4Z/470O/5ltq6T5co/GDgmArRf3Qa3jbIfGvbRgdkxGQgiSF8SLXfQA15Sbd3OorbVkS3/ZeZTNn/Q6k+MFgeb61rSVsaoo14wxzinnvGmqqi6dF1QHT8emURRlWRZF4fnpmRCSc65NB8SNx8O9ySGXwWT/CB1Rqo3j2Nulpqm07igKXzwihDBKAykF54xQpZRC5bQx1mkvcUao1SZgnIADh+j8MHTr78swlMU610YlURgFwhlL0A16WdYbC8aNVka1aLtQijSJKQUhBJdMCBaGYRRFURKzQI7Gk6LG65VQSmkQhYyKum2DKCTACGddp5kQ6aA/knKcJVmWZVnfObdcLhcLDpwl2OunCRcQSBYIBKfbqtRaGauyQcVoRBmzyJw1TlkARh1ZLFdMFF1r8mUBzgZBlESxEIEhG8DSOWe2+KXgIo5DyqBD9DnbVueXgUbOwyRKwyCWjDZd7UxDQ+j3gvOz89Pnl48efD6Z7HdNfX5+fvr8NKS9zz77LEmS0WQchUlelR9+/ElRlndeuV8UOZMiL9dSyropHz3+7Ojo6O03v/nBBx+8++67VdVVVdfvr+7cvtfvjfmTZyeDrDce9eIwQHSCBWDZdDbL88JRN5kcHgRyWeSGwGh0CJSsZoVSikvBSIAABDilhDJpnQZklDLBRSACyWXAJOecC2ICoQC0MhxcKIMgkMaYgDNkJAhgPMnKop6vzinlx7dGDNvxeDgZZVZ1gjjbWepsnNDhIDncf6WqKs55V1bTomiqymqdhoxTQik6p7U2pqzWbdEs4sUy1xb3D26W08vZIld7eV7WFqEoCq+tYVQHAAcHBweD8eHe5A//8A9Xq1VVlb48HwiOiIwAOm3RGOIYDYAQa40HdYMgsAY7YwghSmuqhDLYtHqX43oHs7vG3h/P53OPwPtuNEopWhfKgBAyWyyyJEp7GZPi4bMn67q8d+/uBz/9SVVVWZYQQj7++OOjo6PxuH95edq0pUPLGAmCRIqi61SWZW2rnANE4sevOecODg729w+UUtPpLAwDwYM8L6WcpmlaFrVn5ypl2rb10z4BoGmaQEb++LV9Eeq6bWmAWPNiZRsj+EagaVNZ3Lbewbb8CVtxBf8yL9T6gtMA4E9IVVU7O3u9BuGb9HYG1x+zL174UbPe3frWhjRN51dPuBBIXF40Dx89Xa1Ww1E/CQNjVVE1rGgJ5WXVApVURthWu2PYIJ8vYOAvGPqdNd8FE9fdw+7116OonTN4yYvAtT63XcGCXMMtdgn07sM3UCQhTdN0XfvBBx8wTkajQVmWmxcYALBAkAEiWEItJxKIIwTAEUIRYONLEAljjDBmLYJy1hqlTNfZLaoBAA6RAkEgiA4+/uQBAnvnnXcAIIiiJMv+8vs/mE6n1hGlrb9AQRDKICKEIIDRuiyr1Wp9cHAwHA6dI6buAIVWRGvbNjCfrQbDrCiqKEoQkUuT9bkUBJcd4wAEEFwQBG1jKKUEmB924M/3f40H/2+8vQQkvMjUN0nvi+m16AgS4iwAgkGHjgBaSixnjoDF4OdzKl+EdH6xUXZ9v7uQFLdii0h2PZDWuM3yE0Jcjyqun7Ed+cbaTeThV3IURdPp9OnTx1dXF2maRlEwHA2CUBbF2jptjGGMZFmWZWkcR1JKo1EKEcgkDFLJSb8/TJJMG2utrau2VV3TtW3bVnXBJHNo1quVtwN+tUsu0jRN0/Ty7ByNNcZQ2OKFxAFAJCRjlDMKyAPOwiAIOIujIApCjDWJgl6aUsC2bbI0vXf3bl6uP/no43KdD/pZFEhCnQxokiRlVTkH2rhOmU47ZRCdIusqDEf93phSmoRJ12mPpCZZugcYJQnljBBSNnUYhjdv3p5MJvujgRSBc26xWK2rUqPThAACkTyIRBLxgKOzje2AUispcEBqDUHwPSPIwADThqiuIdoC8jSNoyih4GtAkMTJzpwSQnbtkYwxIRlxTohNSkYIkVKGnEdhEidpIKQxpmqKspxHCpbrZr68Ojt7/vDJ4+fPzuez/MGnj40G7sKbd27/xm/8RlmWP/7pTx4+fHh+kd+5szebXfX7fcFgNpsdHB298epdREwTGYTuG9/80snpg48//ti6cjh6J+2R9XrFy7oJw5AJaRHaqpFcDnvD6eVlW7V5U+wfH92+e+/J6dnlYtYpty4LasQgzpjgWlkkkMV9JMRqSxx3lqIhxqFqrK4NaCJFoKp1KoJsMAnlkJKIiThfl89PnlK0USy4sTIgSSqbpiNAe71BwFUQCnBW65oH3OhuuV5cXGaE/VLd5B99/PGoPxgMBlIGl2cXdVH1BiP0XBjbMW0QEbTWXSuNiUR0czJcXs2eLlviLvOyIwQYoyIIQCnUZrK/98Zr948O9pqy+vzTz7yItwyltXY+nTFGR6ORVs45SxAIUiTEoXZuMwhgOp3meZkkCWOMM1dXarFYr1YrPw1PKeXl33fiox422LkiSqkQArX2/ZNd1/FAEmtFGDSNuZxeZf0sS2Mm+HA4fP31188vTru6ERFv2soYRQipqkopZ611jihlnAXBA2PMcHjYtm1RFL1eFobhYrFIkgQgzPNiPr3yUph+tGscpcvl0j92DrKsT7kIg9iLSHbaUxE1Y8xZ6509s2aX4ltr40jsUPSdd7TWSrkpIvhv5x28lLLT2rcVxXFMKfVMjiAI/MnZNRTsEm7/CTv37KMuzrnvv9qNL/eRh9Zaxj20TqPuurZs2qpplcWD/YlSZrmulTLaYlUrSwQXiaN6d39eBzNgyznYJXDX0zW4BgBcjyp2LuS6id9J6l5/wfVEE66libBJH30YsfkNW2U9xog2OorCR48eyYAfHOx51Zrt+5y1PvNGSlCbbpNEUkoJOgvWaeu0sRIRAHnXqbbVXWu7zmptHRJCOOPUGodoAYgfxWoNOTu9Wsz/f8z9WZNsWZYehq21xzP6HMONuEPOlUNN3YXqrkZ1NwA2YcIDKYIgjSa96UE/S3yhzGB6lEkARFIY1Y1q9FBdWZXzdPNOMYdPx8+0Zz1sd7+RWV1gm0gAOpaW5tfDwz38nH32Wutb3/q+n11dXQFAWZbx2jEmON+CQPvs0DknpSxyyhgblJPjowfOucvLy/V6XdeVEDLPYFNtpEwvzm+iPwjP1kIk2rSEhocPj9Okahu3Z7beCXgY/anhP5Ev9a9jQtsF4L517XD/Z98Fkyilcb4uhkxKKe7cmxCRbI2HXr5VILsexDddxKLHBCIGfPlZhJl9iWy34xjbFXT374/ZvNt2F7eNNslC29YR/EsSgQQmk8nBwfTFWei6brNZK6Wrag0QFstb5xxaBO+cY0U2DQGDY+tVrYy9XVTGGOudMhoxMDZGJvu+je18ay0GoJR6KYUQ3uxOQtiBiNZ6H9mLSAlxJNoexeQTAIBQTISkFIVgulfOasRECIZgjK2tbwJI7xzylHPKOT05OUmy3CHpLaTZYDgKPiDlgoBIExYVI0zfRysU730xHLBUJklCOMnqGhGzQiQF3zS1UvPVcn11O7+6ulou1rpvvbfeu7IQwaVOBIpW0DAqh1kqA0m0NZ0yzjog1Hk0vVo3fdQXEFyKJNXK1nVrrc1oFknZxhjvfJqmcVurVuu6rgfDghBirVksFpeXl4hBcDocDFmSMMEJZ+Btp7vF6pYQbVRN0HXKNG3/5PLKGqo1m06O2kZ1yj95fnZxcbFYVoPheLGsuq577/vvfe/7763X62fPnmw2FTjirP3i4wuR2d///d//P/2f/4u2/c+++uqrf/mv/sXt+pPvf/+77O233+acp0l6fXV2dXb28PRoPBzPJge3t7fVajM5PBoOxuzqtm46uljNV8vXH74+PZgZ784uXjR9V2Slcfby5rosSwo0OLDWmd6Y3oIDDqyu63vHo3ffeeu1V94bDo+cpb/66OPNetG39XBaWGO7fjOZTKYHk65T3nsqnQlWNY3W7WBwwCzp+vZmfvn5F58eTA8/+eSjJMkenT4ajcavvvr6aDT5tx/+W9P3Xae0AnDAKSSJZSzNE54Xgwcn926u54/ZBQleEBAycc7prq8qHQI8eiAOZweq6z/44rPvf++7xpim2cSk8sWLF23rp1NE4r0zxtq4/2utjfcEmdYakc5mh2VZ3s7n5xfXm7pbLpcH01maphF8i/dA3/d1Xd/e3g6HQ9iZMe4LBUKp1ppzHj2OX5ydTaajYVlsuu5XH334d37/p0Mh5svFYDDo23o8Hq91jRjyIjU6RKK4NYFzGW23tNbW+NlspvVWxQEAVqvVcDiMsieUMM75+fm5t66qKu99U3fz+Tx++nA4zMuCMxkTW6qZc67rVNRoiyXp3bDnd+P+e/FBwLBT7GGRwhlTopgrMMaqVb1cLtu2PTo6IoTc3NzEdCpmG9s2x+6z9kV5/Cfc0TWq67ppGmttURTRQbvruq7rjEHrPEFgNAVCrIO2t71yh4cnNrDlcq371nrkIuOOImn8HWOLu/GA7KYh9lF8L5O1jxb7LfhuoXk3luw36Lv/vBt+fj2uwJ6JhjE3IvvcJWZOeZ7P59uNg3MONgSIRKO7f0lQyjIW3wpCAOciVQIAGYncDxNVH5AxFjwxRlMSEAOg995FgztEbFtjrD9//GQ8mRBCLi+vZ4fTi6vLNE1DAMqFB2j77iWepCBNc0KYUkb1hnOBwKwJRoc8T6VMq2pDCVeqXy0rpb76zvdSQoR3riiS77z95mRcffbpk/PlWgpJkO0Thf/kHYe/9hIDAADZkxZDQAAMAUOI0xB7hCk4t/1Pax3XcyAv4avYJwqwXYG4JUUi3tHz2CcK8XHAl3IOaLcZOaXUUQcvx3Ze6kyEl82O7YIPITDGLi8v+74/Pj4OwY3H4/gyKeVkMqmqSqnOGK2UWlfLSJEp5RhCEyUJIZDFouo7bZwFGrV3AUg4ODh48OCB8XY+v01Ewgi9C7OZXtVYTyaTyOlDxOBc27axFxlLBaeVUopRCs4ait4kKedG9QTAa+W9N8Ysl8u+79M8nBwfhMOpVXpTrfI0TRIZdxLo+1bbm9vFZtMFTwgXhApGhXc6qgUmSQaEKtV1XS+zBMDzhCeZNE5vmup2edX0Ffe8qurbxXKzabQxSZamaRrANX1HiaVgNPeSWDFIinx0MJ14FOuqNnqpvUMk4KFpuuV8DZQGT5PM5XnoO7vZbCILO5KmnXMQSJIkw+GQELJaLNfrtUw4J6RX3WazPjs7E4KliRim4071UknKOROUMLTBu74fj4fe9p3qtQ3WwcHBKYXhvXsPVuuNtfbievHJ548Fp6+99gpQMhgUb73x2uF0orr6h99/709/9ieffPj+wcE0hAB0NTkgVJCTZPbbv/Pqd394j1KcTEfsvXfe7vrmi68+v17PL+r57deL+48eXPTLNdEN9RvVaa2HIp2xNOmD3vh7bxz8wU//oKo3/+Tqpu7WvEAgpEiSXHIg2HX1aDAczgbtp3UP3SAt7cIxwZCG8VF57/hgU/XFM9G1lbW+uq3TIhselWkquAhFQnulTGUIIZSlTNDVskEkB6evKe+/vFpDfnjeWFctbzq3mK8ePHhAKT04enC7XCjcJBl4H4x2NaGJyEIgIh0Yll+v+psV5Np4B0YZRRwgyJQcHU/vv/KwKGW1WVizHg0zipKfjPM0Z0y8+eDhk6+ePHv2Qma8yHNKed02WlkuRSZkQOICciFCgMV67QkrRmOPJB9P180GGEG6bUlGm7WoNtrWdTTzDUkiZKKtW97eSs7yPO+6ThkdNCRZuVg2600Xgjs+nH3x1ZPD2bhr6+Ege/jo9Oz82b3J4QjFcJAUg8knX355dn5VDkabpjfWSpmuN9V6ve5U//qrr8Ep6brus8++CAGzrPjii68QsRgONk07HI/n83k2GC7rqg+WZVlrLSHkajlPspRos7XCE5wIDowGSvI8i86OsYMQN6YQgg0OAJARJjlYjPuQByBMOOdu5ksX8PTBq13Xtb21tu+aZr1acc4xBMFYKmVd1zqSGLzHEOiOSmmttVoXgyHnnFFGAI0xulc9oZiCtTY4PyjKk5OTsiy7rqsZz9NsVa+btvLOeGtGgzwbZlKmJ/cfTqdTbeHicl6tO5kWIRCt+iwdbZbLOLsMANGPihAmZRrDN6WEsZd9X8aY1u0uW4ogsIuclbvsdETcR5YdH55wzuJWHmlrSm1zL9xOOnjvnfeeEQEAwQUbzN22RdiS2sj8Zlnmg3qtv9qcISJhtZRSckqIoCQwisE5rXok1DkwmgD6EAIClTxhnKX5QIhEigJBto1ZLurlommNIcIZ7ZxzDD0BtFYHEiijWS5W61vKodqsynyQ53m7Ua88eP3m+rpr+zRLsizTXW/AxEjhArm9WZ2envadfvL08Ww269UmzZhMBsYYpfVsNg0BGc2qtZrf1kwOf+u33pIJU101GAwAshdnN2mxFpz0fWu0J4RFS1hERggD//K07EPgryP5+8gaHeNgO/IB/4vtixDcX/v8Pk/dv/n2Q6MrOARAIAQBwIPzzuV5vv3DSAASMwdnvXGYIFDtEaxHEpAEQO/DtmW5TVgRgzMxqmuPW+7zrtPvvdfWp2mKiNYHYwyllFCeeNDGLU0d3QhTBBJilukoonOMwEuZUfAupo+BJRZ5MhjNEIfDklC4vb25uTiLo1i3q00iMwc4X7bT0VTwrNusKOEdoLOeUi6TjFMKLhDCmOCEEGSEAVvcrvu+BQOd1845wXhR5FEUQWtNGYHGH0ymRZFppZqmySS3ZW6MylmCiIFzW3jOeZKIGEoNEA202dSc0DJNAJLggbMiBz2592gyHDRt/ezJ0xDcZr1crzet1r112uOL86vOk4PjYwqU0MBS2TvlnPNowQdrWggmT7lWtaBErxbd3AH4IeXQW92sFrrP89ybtq3XWVp2nWqqdjId9V3Xel+koiyHGNpNXxcqPckOoWarq+WyXrM0q51adn0XnB/l2oe+s7Vpe4UMOU0YAaK7brW4SpKEEdI19fmLZjlfEEIo0LquV7QaloMXz6/fe+8d9HKYjcEm1bLTvUPn+mZxc/M8lWSzfjEs0yIb17X+8KPPlPFiWJxXl3/77/7BfLUeTwfvvvtda/3zzeWLF2dZ1/LhdBPIX356/v/4F381Go3KsqztAWT41UWV54VRs88/r0azEQS8enFx+vYby+rq2fqMSSnni5tnz549f/5ssZoHMIv1crmcc4rT6XQwGLRtGxXTLFrnXFmWUUYNACilSikDXghBCPPg4m7GGLPGJ0lmjEOkdd3MV8tYlXLOiyI7ODiI6OLB4fjV1+5PpsN1dfP8+ZOuraOQp7WWEACgwTokIcuyxe38c+tevHghKCvSTEhWVRVjrOt6pbTWJt66xtiADoGHALc3ixBCkiSzGXEWGZWbTSsHYjXX7/z2a+++99Z8fvvZZ1+kGb++nVfLrxAxkXIynh0d3RsUw++8+86j116/urqImlllpzvVG+cBiAt+03RN21vrCKNMJAAQnA8hRLnTWPxF2FkUPHKAASCqDMWRpDh/2Lcbzrm/I/0WWxJKea31Rx99RN57d7W8mU2/Wy0Xl5eXR6NZURSr9Sb26fddAGON1hYAoo1KBOTdzsA3Oq5GUmF8XJaltXaxWET0fgdFQtM0jIp4pWJr3DknhHDOWesiSiGkJDuZAReV3e4IB8GOZphlWVmWx8fHi8WCMRZpE7BzmYp8T9hNSG7Hqb3vus77sA+rTdNEj3nYARj7nTp+YvS1qus6TrL0VhnjBKeSMyll/CKTycRau9lsoo4sodQFECKx1jNGKEVKo/AAhACUonMQ7V7iR8XPRUQAf7ey3IeNPaYCd/oI8ad7GPhOKHo5Wol/XeC6G/nCHfrk/pn9/AUhJOeCIkDwRlnPAkFGWQBKtVFAgtmWpMA5I5ILydNyMBhMRsNpng2dJTfXq88/e1J9feYQLAaHIVL4HdnS9NpNSykMB+Xv/M7v/N7v/bSpu3/8j//xkydf3Ts+NcYopSBgr5V1VgopBA/eyYQ37UYplSTJeDzM83y5nMeFZJ0GAGu3eK9z7upydfbi+mB2VOTjROaXzbJtFCXCWo9AhGCMCQjEGOM9eO/wr1Nj/GtP4/50/aYf/W9y/KaPjusZduthj5BFkD9e1ngXxPvobnMK7gAAIsmttV3XOeeETLIs45wTtm1jw05n0+i+qaEjJCtyF6wHZ62OmwNFoJQa54IzdCscGXxsEhVFtVx758q8SATPU1ltltVieXN9tV6vCSFNtcEiMCbAeWu195YxFpCAi9BEgFgwIOm6DikJBIMxddt4CDHliuQnFi1LfAg7N6xocEApeuestVop51wIvm3beL8nXEQxqO3okDdRJz6KjCdSjIejw8ND4eq+7/te952JVAlgnvAELXT9prceqRwPytFw1imjtS0JSCmdM5RSJJAkiTE0eN/3PecsdjzjXx5ztihXL6UUQjhnGGN5kXpvk1QMioQxolRH0VCCUvLxeHy5XGhrjHaa9L3zWmsH4DxkaU7QOROHoMB736lOtR3Z0NFoJGXa973qTd9rIQQFSgi5vb29urgsyizLsh//+Me67w4PDzer9cnJMaD56uvPri6eceqbZu29/vzzT631V7dXBLkPfFO1H3/2yWKxHI+n4MP9k9Pvffe7nPKES60tAlFdTxC1UjddIxl/eHr/WlxeXl4+ffz1xeVZUaRvvfPa6+88SkW2cFjNN+z6+nq9Xkc7cM55AOj7PhJNJ5MJALx48aJe19ZaTmiSJE+fPnXO1W0Tu8ta69YoyhjJCCXMu5ZzqbXV2pZ54b2XaaatX682q9Wq73vO08PDwzdff/XZs2dCiEcP7v/gu98bjcuvn3wxv77ihAPd9tI4oRTAhEAABaN931+enZPgiyI7PT311p2dnSF47wCBxtgGAMFTv6VtkzhikOd5nue3N5vRYU4IMcQ+fDh66ztvjEaTJ0+ezOfzssiaWomksFo3rdZ6XjeqzAdCCELIG995O03T0WiUZXnb9+fnly/Oz5brTV6Or66vl+s1Q2B7+jGQ6JYUt4kI1mVJOhqNTk9P45hsZPNVq/VyuayqqswTAB99KFxcWM4hSO89AqWUt223WlUX51fHh7PY1j08PLy+mTPGIowZeZFCCGNcnMyMpyIOSsUzMBqNIicghJCm6Xg8zvO8qqqq2tyVFJRSaBtnfGFPJwwhRAoFfBOZ34cr+LWoCQBa69FoRAjJsuzi4sL7rd/afk/cIy6RahDJB3FeJmowRx9LAIw/gh2gGscs9x8UJVMirS9NUweBUiqFFBwRaVXVkgshEmNMtd70vZYitz5sJzvgJe30Lgsd7sT7fVwnd7Qc9t80/sh7L4Tw3xRO2P/oZRl35wTGjOdbT94Ngd/KFX69ho7NEa815RwDoTQwjIMNHggKKUUmYlaEiEzILMuyLEvlWMoUGVfWC56MZwezdTtfVbe3C4/eY5xKDB4BkXiE2UB4D+16Q52ZDsuHJ8fDMr1CLwThkgWPTAoGHgwlQgITXq3KsgghlGU+nU5fffXRwcHB8+fPv/jiC+eNMdsywBgdT/hyDk8e3+ie37t3z1t3dbFaLRtEHrbnMNJftLE6eIwJ6d0g/esdgf/Ix2/63H3DaJ8SRRpB3/eIGB9HpnO83WJSG3833HU8N3q9qZfLpVKqKIrpdJqkWQihaRou08jzRcZhZ3QeOiKlREqRUg6BIPGEhGAggPOOY6DIAMAED84Kq9rlyntPrQXvTdeubxerm5t6tQzWImOZ4GkiKOEYAIJHCECIs04p0ytNCHMehHABCRNcSkkFN84455TRQrAkS6OgO4GXSEx8FBN354wUAgDcVrwkrvQA4COBTylljFJKGdUG5521TquW0PFwdDCdZFny+smDs7OzqqqQWpkOO9VzkReD1K/WqaMSmMw9T7MsL43boIe6ruLH9X0fXYWVUm3bGqMgg61UjDPOOcoQEXsFAMAYGQwKpUwi0+D8crkcDIvZwYhT503NGOFMRKBx0/XKOOudMyTaPiEhGEIiBKXBKm+1RQAhmNK2qjfYkzRNs6yI7Pi4KjKZjcfjm5urq4vLcpB/8cUXr772yp/8f/7NYDD43vffOb1/SAmkWfLbf+u3vOv7drNc3fyTf/JPKKXWuzRJpUiTLEfmi0E2GY7Ae/Th9PgeB9p39uuvn65X6yIt8kQSgucX15zTyXg4LMv5zc38et509b3To8OjmW70V58+bfo1DRn7p//0nx4cTmN6yxkDZNoZznmzWcdmCadsVI5iyTgYDBpdVVW13qy06YWUnJLAiJDSWZ/mifdhPJrd3iyDJwA0qrgAkPV6/dVXX1GS3js4EYxOJqNnz56URTYejqQQ3jrwgRHOCDOu45QESpyzGJBRRBL6vq/XlTFmMBjMJtPZZNy27Xx+wzlnQhIiOI9tYIporAuIRGkjRMo5f+WVVx5//Wwxj551hcL+Rz/6kRDigw8+6DrFOV2uNpxlIUqlUA6Edsr2ehkL36dnFwAwGA0fPHhwdHQ0mh2cPHyU5+Vf/vzngMTH6IWkNzqEIASNhbsFjH33WJQrpZqmETvGXFxSccYPQ6yktwS6GB3H43HfF4zg/fsPVa/KYvTs2Ysf//aPHz0ExnAymUTbhYj0xO1GJlnf6zifGd85pgURKogZcQyKkTITdYX3HVPcKSzxIIx28Z9wh0gohKDUx+AUv1G85UUiw47JGBfJHsaQUlpr+76/urqSUkbRiNiV9N5vNhvGWOzLcM6Hw+FWvtS5OJMZuQ5Jku5Rk5hFxRfshx3iXhnjtPdeGQsQEGn8ldVqxSmBgJPxNI5xUyK1Dc6TAGitj0mCtdt3DiF4b723AH5f5FGKnFPGtidkDxHv43f8AyKbch/L40/3M2n7GBAf7N/817OEb714/xHfQtpjOtK3ClNgqWRUUBK8C8YaZfp8kGf54ODwsBgOKKUhsqw5sx33SNdN3zZrIbI0KZAzkaWeoKfBbyno6DyJs/pN1Q9yXqQkFXSzvG02y6ur55NpeXX9wnmUMrXWKGMIYT5g0/Zed1E9ejqdMg5d3xB6wAWVCY9uo/uMh5AIpMvlvNf9RbOxWZbNbzdaAaUgRGJB7/mt3jlCKRfU2/Ctc/Wtk/Yf+fhNn4t3mhSwi/0xPuHWV5ZIKfcTPW6n+rVnxsQHStt2U60X881msxaiaZo8zwkhhLLEOS8EUs6cowjgOQBUfV2WJaFAKCDhJHjQ3jnHOOWUBYRed4JzIZlS/fPzhTeaUswT6T1VunW2J+iKLPXBIWJRZGmaEsJ63nsHJCCh3HptI+kYPCB1AQljo9GIJxIJCRhc2I0RCU5gS1qE3U2xg9iwbVvnDB0OhRDBeaUUYhCUkK2WiaEUo6gGEmiaDSVAkVjXt1WHYNdVLm7g5tnjxWLhnBNSdtrOV831ciPTvByOkpLKpKh71fVqvanrppNSMkLjXtH3fazrAKBte2Oc3NE8nXPGKjQBACwK59xwOMrysm370WgkGP/6iU04HY5yDFp3fZExRpxS6vz8fFU3yrlAGVJKARPKNaAPRnV9kmRcMu0BA2Y8lZQFcAG2G7IXHgKx1sfFEJV4Tk9PszxZLG5fvHjxwQcfIOLz8683zZozKPPkv3jvf6fa9Yuu/vzLJ4tqE0KQMlXWeGKSNFemF0kSAl6eX2zW9eXFddf1RoeubqxWpCgE40mSLBJerder5e1kMvnRb39/ubhcrVa6Nbfn84/pl59/+SnhMBqX7P333/+9v/27x8fHfd9V9Rq3vNzAOY+b9f2T0++88Z1qve7qRjCZGpYk8mau1+u1TJIkz3wA76FpWplmjIl7904//PBDzmW9aRljTd2WBe+79a9++eHV5fw7b7w9mx7Xm5XgLBHC6P768mpQpBxYwqRuDASbSsEINk0XIKRCeh/athGccsZms2lZ5gSDs7ap67IsrUNr/G5kLwSPkf+tlMl4dn5+Pp0cpWl6cDDre4WIJ6+eAMDTp0+//vrrsizz7MBZBLTeO0KJkEwI4RGMiRMUlAhZVdXi2fnVzVImSQy6WZYVRamtiaiDsyFCTPs4igFibI7p6mKxuLq6YoTE7rv33moTwQDd91prG3wAIoRkQmRZcXR0lGXZxdlzqzVjgnCuut57eO21N7785P0oVRSpfHd5hTEAx9CrtQb0cXowhtiYEwBANAO8urqq6zo2OPdNBO89EoyCo3IvNUpInIILARhjfd93Wu0TlAgt7BOFuOtZayM5gxCilIqugPsUIeZPXddF6LUoijRN0zSN4wzxK8T2VswY9vtmXJB75Db+DWVZRniwaZq2bVulhRBd13nHJEejnbVeSjkajSjlXasQag8sAAlAI3iGO93ofcghuysVb1q2tfVi+6TqLkLgd2Px+2NPQUfEfaWIO1Mf/GYbYn9sg8qdn+KvPb774vh/a8DQQHkADEgoo4wjD4T7QEMQQBJKMkqZ8UFbjw76zua5ZIIThdo623SbtulMhwwxUAAbQgiAEVFwgLHTMx6MB4MBJdD3TbNRwzEh4JjkjEPbNcFakrBE8uAtSAxgrVPWqfn8dr1e9X3X9/1qtUQkeywkdugopc5JY8xise46PRwOKeWj0aTve+/dzoiccM5jjsE51VGX8A5N4T9VivDvP76FTm1Ze3fugngrRdgvKmTsAuhLg7H4MkogkbyusWkaY0ydpoSL4XBojaaMAwClNE1TJhJCiEYfOQhKyYQLKSUS8NYhCEawbZq2bfM8H40G7aZ6/PhxffssTVMhuJRcWbVeLRDCZDrknBtnOeeECQCQSlZVDQ4SygGI80AYI8iokEKmnAvCmXUuWOvBU0YCovEuOMsJDSGQqP4eWb2Aca/Qro8Jv5SSU0YptVZ7ZeLZ8+AIYYABMVAakATO2XBQgM+6qh4Ny7xItOm++vjTLMums4PpwaEHwvP5elMTIZZ1q4xLAtvUTacVEIztG4csbpnGGAhICHHWexe8wxAwTloAQAguum/rALFlCYRUVYXEzSYTxoOQxAflbW+tJoSVZWlN9/z589tq3RkTKCVMEGI5IAIqY7qqlkwKkXhqwCPjhLMUMfhAv9GJ7nXf953tYuNjUJRa95EG/tZbb9V1PV8u/ur9XzR1dXpy+N5337G6u7lebOpOyExrTZls2r5uK95pbV2WZbf9ejlZDwaDq6ubpmkpMI/+9OGDptrMl9V4PC7KrG5WZxfPgLh33nnn/slR2+tq3V5ezKlM57d1p7uL88V2Aj7OoNftRiYcKHJOgzOEkEFRvvfeeydHJ59+8olSCsN27DtN04ODgyzPA6Hrpo4BclM1eVZKmTa1okRWTcOYi+OxxriuXTRN541/eL+eLxZZKp1Xi5trrzu8d49zxgLtN105FrFcE4zE0+e9wRCGwxEhRHJmlK7rWrWNZDThrFbgHQZPAnpE2I0EuSwrtNZ/8sc/e/To1Zubmywr2raVMp2Mhr96/xfGuKIogkeljJTZ7WIznc62k0ucaK171UbTMy4lkylPMA4y9Fqvqmp/t0eDIsqQC0qcIxBnfAKElzVl9G5HxOC2ra+YKMTQniXUWt0bC0hDAOu9cyFN08PDw6PDe9dXF5PRwYe/+iWn7INfffzDH/wodnyibYQQAnA7VRi0JoQhYkwUlFIy4eyOSwLsoPKu625v3Xw+BwBCX8rRx5tHGd13Ou5uWZbFbT1qSyCSmCdBIG5njHm3JR92CoP75AMRI+wR1Z+iatDdYEkIGY1GkcMRK/6+7+PG2nVd27Zt2+0TkX0lvW+4kJ3+Aewan2maC7H1j6covAelTEzGKOXW+rZtKU99INZpa70UEXvwgB5JoJQSCoDeOeCcIqIxgVLkgkZbaiHSuxX/PlGISVv84ngHEv9W73n/pL+ju3AXVMDd8EU8vhUF7+IK8ZnOgzPetEZKHCT5YDgqRwMm+GJxK0XiFNmsDSE+ICBQRMDA0DGCiJ50dW1M3dUNBZScog/oaQjB+uCBBh8IIePRqGma9aZ7/uzslVdfnUwns1natl1R8K433ljBWOCBog22I95mZaK1pixE95MkSZwz4/H46dOncb5xD1bBFhQJMS4o1fc9GwwGUh60bXt5een8NpmmOzltrW0cj/x1RGF/Qv4jH7/pc2NDYf+asBPg2tIVdx3e/TP7+wK/qf4ZmTdFUSillkvVtXVszLWbigoZb14hk7iBc86L8ZAjBGM7bTznFEBKSRG8Vr3RzaZq25YDWCmr1fry/OLDv/rTSE6SmeSCAoHT03vvfe/dfFBWVUU5M8b02tZ12z950vcKAyGUJkki04xSThjnTDIpXZy9DJ5wygTjnLtgrbXeWEIIRYKIwbsQgg/B2sDIto8Ub59dF8ZEFREkATwYq43tte571QZrsjSZTIrJcMwPp6f3jg9ms/V6/antkmysnf7sy882na673gEthiPjQ6t0a22n+ths5XzVdd2mXnpvKeV9r7wL1voQMASaJBmjMoTtVkAIAQwhOI7UOVfXtfVusbgFcASt95oL0baVt8rpWmtalgcQkvMXz1d145wTlHkI3gEQAsEHbZ213mggDHxwzhqjGWOcMx9YLIGKrMiz0rnQtq1qVdd1SnVr541Vo9EghPDd73735uZmcvo7jNCz58+M6f7Vv/7Z9eXZ82dPFotb8DaEAOhcIMAoUsFIIEyILAdOgfFiNJwdHg0GI+fCeDwO1j1+/LgosjJ/Y764f3NzTRk66gbjw+N7J7eLOfLEeTae3E/63oNjiPj5558H9G3bOOcoFZJIzmmz6TnniZBt23744Ycff/RRKuTD+4Oj44eImBfFm9nbo/F4XTfLTTUYjf/iL/7i7PzywYMHL56fbzaNUgaBItCyHBBkjENZZM6FxWIhmDBKU8qt6lvY6LbxxgrONuta8iSVdL1eK6WESAghfdc455IkMVpxzq+urjCEIksil6frOiQlpeA9hOAIEkQE7hEpY8KDfvH8sq7bum4RaZz5uZ3f1M2GM5EleQBirTPOMpo0tXLBCyFEmqRMuOAp50CxLEaxwt40bQhBCJEVAwC4ubxijHnm4yz7vgDdxjC/VRV0O78AYwyGsCMTbbsMSZI400aMnVAMIcSoBkCOju5F+r1WZr2q8yz9+c9/8Ud/9PePj4+NMScnJ9e3q4jLAQDnPOzoEVEOsm1bLspYr8QPilV7DGl7k2vKtkIfsZWotVZaIRLvfdu2zrk9IcAYA7AttUWZxG9kjDHOxxGJsCNqxXox0hK11vP5XGsdoQvYzUqQnSF1TCzi6GZshXRdB7s6MssyY2wEEvaN/3iSYxUVcYhotRXztrwsGWPVet7WraAkhKCUqqoqtsYppc4Gxqn3ru+jNV9UxXXeR4k0ICR2FTH2GqJII6WEUuK9uxsbwsuRs7DPt2IScDf874/9C3DXpb77mj3wAH9dorAPh/uELD6vPToblHedVYGLpPAyI4TS4EVXu66pERtKGaMiZlQ8SY3yzrmogKu19g4k55yywDyE4GzwQDE4CAAeq8721iHjz8+vem3unZ68/vqrf/WLj4W0fQNFHr7/vbc5F0+fnJ2dXVoHSkDbQppC3VSIOBoPtNbOmYj3hhBwN7lujDHaITXeey4ooqubFaF+MpkMRweEQnTAugvYAAAjfH+67p69/39LFPDXWg/7bxFzgkj6iet8SzW4c+zfx+heSplIXuRp7DYaY4yB2LmLOtBSStV3fdcyLgAgaGOECN73lNpeMUa8sQDggyWARVHkUvSb6vbifHVzHUjQTltjetcxwfIiHc5Gb7zz5mA8ur29ZZx3qlfKzJfrq+WNAU8UMsaQcc4EYTwE9LBb+YwSyoXgXDJEjOCUalpKKVIWQoDgvPckQLDeIol0xRiGBeNxGxScRAFsY7VzJgSnTa9UF5z1Tvf9mEwGRZYeHM6GZbFc3t6/f++Nt96sNs1XT5989fSp9pgUw7FzIs0CAnBmextISHKRW2lsl/IkSYXgCefSaEuIiKikcw7RGdv3yhpjCPGEBsSQpunh0WwymeRFsa6WzhkpGONBcLSq4yxwIijD8XgsBb08P7POASXAuffBOBuHjpy1knFvrAEF3pGA0SQCICDyWOlFOtdW3hZopG0RJG+++Waep2mant47nk6nK9NlMnnnvRGFwCg5PDw5PnqQpfKf//P/mXMegi8FJ5xTStMso5SOs2mSJHleWmunk9l0NF0u14h4dXGpvAaFyDAwZClfLG4//PSj9qQDxtO8RMJfXNxyKRxIQggbDAbX19d5mQ0GZZ7nZZl3uqcUe0qzLOOUVVX19PHT5XL59u/87u//7T9gmb++vrm6vs6G5XQ2o0KOD2bfeefdy8vLrx4/IYR8+eXjSEHPkoxznibYdR0hbDabaW1X81VVrSlSb9vgPKXUGVWt1pEKOhoMKevruu66bjYTGEgkqQ0OSueCEMKZJeciz3NEnB1MqqpSNg4ub33bKY0Fmeu6Li8Hp6dHxrgsH9R1K4XIsuzjL3/5yiuvql7XdX1877TvzPXtajgcaWswhCTNhsMxUAgEPay997eLZZqmIkkBYhkNWuu2bY9O7qEPWmulu4gw7xizQQjhrYvrHhEZ2fohkV1x3/e9URp2RXCsvJMkKYqSCRN5BsaYxc1t33Y3VxdxTuHFxfrP/t1f/Hf/zR/N5/Ob28X55S3scPIsy7pexzZBDI2q62XCY3yNYTUeu93KRfJBCC6G8Bjate4Jo1Kk8U0ikEB3ZkhRaSoqKMeNvuu6gDxJksht3nKzhdibWTjnorIyIg6Hw6gcZ4yBHfsh/lYcCYngW4yCUZjZGNO23V5Y6S62H9OCSLaoqiqiuDtCkG2bvq7rYZlyLiilIeCLF+daa0pZ8J4xZmxwzjEqvO/jG+7n0/b7O/k12cQQgjb6W3FiH8LvFoJ34/q34se3qsbwzX4E+aZB5bcC0j5LeIlY8DSg1861rWq12dTt2fklIYQSiCgMQSaF4ExSygBgMBnGyOScC9ZZpWNblFPikQQMSIIHTwF9QBKA8gStTYvh109ffPn4yd/63R/94Ac/sE4tl/O6Xr39nVf+j//dPxqPpv/in//rf/Nv/vj6+rYYDThvRqPxzc2Nc4FSeju/ns/nfd/GOzRKlVJKrfEhWGtb7z1liQ+4Xq+7vi7L/OjoYDqdnp+fP39+tl6vnXMIlFFGKfU7XYG7p/SvTcv+4xy/6XP3MN4+/4tHvBfczuODcx75wpH0c5cwu2+xxew8LvWICGqtAUTEcXtjI2eoqipCyHo+n0wmRVFAzEIYiUDdsCxCCLPZ7PTocJDlZ2dnFy/Obq+ui0EpBOOcEkYa1TTN5sX588+/+vzd777X9E3BCsKZZLxwlmcJ6VtJJVKLSAWXAYnWVkUBV+eQErpzV9/mymTLxtjmSbFqss4HhwEymQghvHNN0xjG48lJBL9zP2KaZkNRhuC6pna2JwScs9r0bVtr1Tz++ktKwvG9g4Ojw8fPn14tF5tWa2Pmqzlp6/F4mgiurVoseiFJ3zRt2/BE+p00C8SOLdBEJlmeaN2vq0UsgQjxDBAxXF1dDYfD+/fvv/HW623bPn/+9Ob6wnvLeeItDAaFoCAZHY7KJJY9XMTzoK31HpAEEgARuRARUsWdvRwABAC244wrpRBqY9xqtWo3rRBiNJoIxn/0ox/N5zer1SoRXGudDwec8yJLdK+W85vTk2Mmsrwo/6t/+N8i4u3ttQ3eGNNrNRwOjbPVoi4no8OD482qMs7erpebZpPKrDUdT5MsS4BiytPB5OFoUiqlqrrNihy0toB1286Kge7qumvZuz96+OyJD1AVw1QKprqbjABn/MHrx53SzsKmbstR+eCVV++//kYLEGrV9Pbg3v2yLAmjRRqW6/WzLx5TD0ez6fz66nYx//GPf/yXP//50enMe9+1VVLmwfmrxa1kcjQdkUBUr711qZQMeV23XdcIxofDYZpmCcg//O2/+8tf/iJ0rmnXwzQXQgTrKOJyuaQ82bT90xe3RTm6utWMFYFBt2n7XgMh3nutDSFMJsm6ajatQ0KSNNtsNm+89fqrr7/+L//lv5yMTq4uVkmSZll+fXntXEgl12rNGFs3Vd/fJEl/cHQguaAkrNdVLjPdV721SALnFBE8MVKYq8vHRZFnWU4YU71Rqk+SVEqpekeQOh8nPAnn3PuglGkaVWY5o8wY07XGKC8ltwY8oUioAAjBKdVLzhORONt//dVnnPO27TddW9eNEHxwUPy//s0fn7wx+N3f+ckDp3755adkQ1ynVptFMRi6rtXGTw7H0Y2pqTbH6eHFi0uJoiiKsiy998a4+Xw+Go2yrKRU1HXNWJJIWdc1QVsUhTWGOxoAEUnGC85537da63ExXC6XCReI6JRqtKaUMvSZZDrwmNmkaRpBiH06MpvNRqNRXddZlrVte3JyAgBNv9ysFaVcSNJ2dVVVfdOt5uujoyPJZTnN67puqkoyyhhb6y41bJBPbWpW6/Xl/GZ2dLislrLMZ7NZCL7VnTOWcSxpwinjnPdWN5tNCGpQJGkirq8u7r/z1mq+ePHiRdM0lJK673S9YDJJCtqrPqWi73vvA+eC7GblkyQ1xjjnKaVFUYYQtDbOeSEEhi1VAnZznhApDjsiRXyeRB0V78NOV1FKmWdZ3+lNXQshpExDCLB9BcBOYIewnaLtN1MNCrBlPwQXgoedxUBwjhDKKUOWhBB059tN43cWEuTOEV8/3GyklCKRezwfCaGUtrYDSsA7a7VDA8JTRMSwXNbT8WjTLFwIX37x0Qd/df+H77354CC7unxx/8G9k5PD8YSVpZv9Nz84Plr+83/+r+6/9vDN19/SjXry1dcfvP9x2lUmYOuhHOTLuvOEsCQHIBy5ZERBOze6U11vMUuESKjS+vx6SXk+mUwevvLa2cXNcDCO8t4hBCGSdecAPcXAY6/ba6+V8z6RDALxEFxAH6gHcAEBgKH9Vr71LajmbpaGd0w77+JGv54WfCuZ+xZ+ADsoMS6GCMvF2B+7dSGECK1FLk6sE/Yhdh9LrLWB01r33nsMQWapDV6Z3nXGOwseESBlEEJA3WrVAIBTfb1ZR7oPISQO9HrvAY4ePXp0/+GpDuazx5+fn58v65WnwWmdpul/9Q//W0eg7VWr+mI0Tsr8qsLy8I35Yt629WCYzZtu06vOmWE2FdL1fd+j5Uw455zpOZGcovfWa6esphiFI7b65c65SGmMzCqKkGWZ5AwxKN0ZpRGR0UAJJRQc+LqttdZplg0GAyFE8Bac71x/ODqhClKXfu/Ru33dPHn81YSUh+8+enp+/cFHn5xfXlTNRjl3+vDRYlVr03Wq9msXAmrtzs7mIQSt7TgbVp2lqrPWWmWzrKDeXM+XszAtyrTMZd9KGox12nQ9ISQl/UAWYNab5Yteqa65bvs5glLaZkWMEiFN8tWy1r1ylliJAMG43nsIFJS3IYQ0y7TzxkQ0QmprPHGCJcYY6nySJIzxzWZzdXnjXEiSbDCaZFk2nU4PDw/rzlFZFIQ3GhhLdL3pvV9db2czPv7sK+/99bqOywYZRaSIDGVWKQRk4+Fxs7FfrhcAAOit7Zq+6fsbAG9EtvbgrV9t1hGRbdv2ZDS9uL6OPkSMMdZUTDJbd+z+wwdaa6OaNE0hGEqp5DzLk2JYHGWl1u76Zp6VJk3K65uLzz77tGsrQgiX4ic/+cm905PFYqGUury8/OEPf1iOhvP5/LMvPj87O4vWdpTSVx48vLi4mF/feA/G6c76YTk6un8qKFvczq3SZZGOR+WgKDnnVVXdO71//8HJcrn88usvCePWeMqgyLJltfYuSCmStLTWnr84i0oMlEshEuNAa621VUpr02HVcs7bTgGgc/Dud3/w5ptvnp2dcS4ROOeOEGaM09oCUuLBOWc9BA9IqXXBGoeEEmQQCONAKItBgQuKGCIN++h4GgI656wJEdC2VvV9R1B+q2rEnX5zTJn3dLz4Pi64XY2IO878lvFntIs1OueMc+lcUKp9/uzF299ZP3jwKEmyqqqMcZzL9XoZN7g8TwG23MMo+EgDxd3EdpQuODg4GA6H19fXkfMY3Sxj7wAAtLPEM0SkCBg8UJbkohwOF+sKKENCiKchBCCUciIArdo2VmJ9vyckCiHyPN9sNmma5nkeXbb7vh9PJxSpc8EYV29arQ0FgkibpiE5ckH3m7n31jkH6LV2AUEmnHPqnKGETMcjZ3SUcpNcJEIyAhQJpdSpnbA8otY6SWSs1SIHImzbDGavpb8Nz7tQCjssIUIa+wov4t7WWkq37LN9MI4H2U2O7C/9HmGKu388M5Rup0P3rAsfPNlRqADgWwXqPoztEYX9M/tUAL7ZBMGdh/W3omN8fHMzl1ImaRpNNKSUSZJJKQlhxkft5Ma5WisVezFpkhvjOuUA4OZ68f4vPlzc3gSvX3/11eN7s+lkIlJGqMwL+trr7/1e6x+98e7rr77GAv354K+ePH7a1C1w+fqrr5+8+uoHn37+5MVF11ZE5sCpdzaA4yQY9N5vPRGCt6rr1+ul1j3nD6bTqRAi9iBWq1XfVIkc+mCD83GqHhEpZ8T54BEgBMCtBBIAYtg//k3H/tzePcn/Pxy/Dh196yP2F2sPEsQFEwG2fStw34OAHSBHOd1d94CIaZo65zhlfd/7nXL53Y/bkTm0McZaHW/5LEtms9nJycnB4XQ+nz958uTs7Iwx9uqrr1xfP1O9OT+/GE+ns4NDZJxK4SBU9Qax7uq215pTupqvV/Nl3WxKx63djTihK8t0Nh0BkKZpYxuLUo4BjNlymARl3nvdq7ZtKYHxeOytadt2NDighAZwu3Q3Uoa5ajdCkMFglKap9e729uz29rarm/Gg5GAn5TBNpXH6ZnHTNM3R8UHG09uLG6c0mIA2cGTNuqmWq3I8Ibvz7IK3WkWEsmmaTCajUUkpWywWWnUEg2C8aTblICvLsuvqrq3rug7BlWWhLWrru66r1nWvu6ZunXYAJE0SDEFrDdaaTjmj+rY7OzvDabq7GSMkCd57wO3VtNaGgMbZPStFEGKdbtu2aTpjbJrkaSqj+ohMuDZ9ALMVZQ1WG9B9E2OHcW6Lr0IAgCRJAkG0OxXO3S2/Wjdd1zVN06vWhjhSYax3WZZIKUUa6fadEDwCVPPVxVZmF5x32GkmQDjoGE9kMSiNZSJNrfJM8sGgnE5GnHPGsGl6QDsa5AHJ6mZZbW4fPXw4HA6fPnt2c3O1XC8eP358+vDB7GAyn998/PGHq9UKCNZ19c57704mkzfeeOPpZ88lTUf5eLVaqLbL0vT05PD03r3NugKrjNKq7zmBN19/NBmNP/3009Wm+uHhb//Wj39n3dQhhCQRk8kEKHk3z/teK20ByJMnT25unhHCjO6vb5eU0uDROSSUF2VGkHnvO6ViR9kDOz19IHj2/i8+nN+upcyMMYz6gGCtT9OUCWqcBW+RMiQkJhBJJoXMmWgJCZQRzjlj8dJut13OudamaTqte6VVNNNDpMZGovJWEc8HJBDvBKs1eM+894wRRrkQQggGVuz3DkppCLFl7qNMXtd1zgXOZeQndp39/PPHb7zx/D//z79z//79X37wUZqKohjUTSOE5FweHEzrum0an6ZpXdcAUUrIxf+07r23nFMhmFId57zvrVKdlJJSjD/tjA+UEUKIDyZABPwtYG+dJ44x9D4454gPiAiEh6Ai3yryOmNzIbpMzWaz5XIZfefiAEhRFOPxpG/VcrnedROC1rau67Ztx6NBWZZ936muKUMcZNiYzgkh0jyjQlASrO4YhYPJuG6att4YpTORpGkK3mutoy5xbKYwgkqpKNpIKY1ZBdzRA45Dg3d37btV+L7yu1sjIqL1L40l7zIn9pQ02A0uxoAtJY/kj5c5CjhE7pzZpZHgwCEgQRYZ4b8eYOCOrsPuK3xD0GLfwt8FFbxL6YCXWsLbmZR48mOzxnoXB48dhAiNxmR21zjj2hjvAQHWq+bnf/XBkydPhmWKQDvlq41ijDEZta3K45O3rHPr9XqQlt5aq5VWRreGov2Dn/7ucDIsPvz46mZplbW6DzYQFnIO6MEaoOAQnANndV9XVV1VnFJvdVrm2eFsNBqUZd62bVNrb4MFF7z1wceMEOiWHOoBPWy/JwJGycTfdPym0P6/5vhWzvGtVJIQEvtu+2wyTiT1fb9PHPfk3C2HF7cmGmS3aNM05ZQxxrRS+wSR7OTOmmazr0kAIE3T09N7x8fHb775ZpYncfyq61rOWUxKRsPp9e3NF59/XY4Wo5sVE5wlCWXs3v0Tp8EZoJ5a7YyyHOUgI4T0zvWcc0p58H44mMxmh/WmYRQ3FRhjOWcBiAsao0YyjeaxcZo6WGvBe0rRe9+qzjmDAQCD0co5naYp44EyoNxqu2mapq2XGPo8p8G3TesSFpp2/ey5++yTT5tNnebJifKXz85V1YXeUk/SLHfGeue8c+C2XdfYV42lFIOg+naz5pzzvm1V3zurKKXeW2saY1TXtQEco6Lrm/W6pglVxlZ1R/nGWm2NoUg450bpTIrJaJwlsq2bqG82PZxe+W4Xvrd7SywGwsuRZhd3ktitJs56B4QELjJKZFEMptPZYDBgVBhjun7d9cAYRcQ4wr2vdrbcHdgmBIQzcHAX2owVabs0UbmnbVvj9H6vSIt0Op0Ocdh2fad6LgVjLCBu1IIQIqRA5/q+X7WGG96oht3O152xnEkPsNxUbbWyVjNOxuPh6naxWlVCpknKFqvK2vbwYEIImU6nPoSovoeIWussy54+ffr06dMQgjJaSvn2229PJpPhcPgCz3/7t36Lc/75Jx+/eP60LLJ7hwdpwvran54cCM6//PLL5e0iS/nrb7zaq/ZXH33RKH1y/2FejpfL5Ssnr/zRH/09KaUHjPre1tpEpn2nvPdPnjypNqYsS8a40cYaLyUVCSHIGA2YouDJbDYzNvzV++9/8dUzKYl1xHvPWAgBrfdMSGqd1toFzziEgNWm4ZIBKQGAIGNCCSGkZIzFW3EbbPq+BiCMIaBtmk3fQ57J4bC4utgQQuiuXHDOIaGwqzhhJ20EO1BuZ/hG2M43LMpu9H3vXNA66ruRnaU9PHt6/hd//ovvvPXea6++cXT0fuz0j6ejNE2Dx+lsbK3VWgsxWCwWgCTm0bCdH9keUW1zPB7HPyb+DXE8AaiI7VNOCBLiQ2jaVmnrPDgP4EIEA0J4SV+IYTVNU7+N1jaC5OPx+OrqKp6HaJ01nU6V6btOrVYrox0hNMsSRlnf91pr70zbNkp1jMBwmAvBCEVlG8J9AMYoG4+ycjjquo4GT7yjAQTBRAjBWNd1fd8HH8dNAuecIWjVDQaTrtlEZbA9qMsIS7KMEKK0DdrBNwv3PWK83+v31w4AtO73XJCIeeyBBEIgKjx670PYflYqBSUMnFdKOa/QO0QkNFZ+CBA8BEQKCAE94NYj4C5ysI9A+78n3OH53wUS9s/vw9XdLxVfkCY5AHgI1jpjlFKmU5pz7j2QqNCFjFHB2Nbl2SjnPQiRCEq8U/NFtV5XiWTX14vDw9l4NmWMUM6klAGh7zSTbZakB+NJs1y/9cbro9Hoq6dPGbi2Wrz66JRJ8cFHHz99/LxWDQOeyURyQklqjHE2KG9INMC0RhtzfXlBCEGwRVGkguMglSx06413FpwN3gMJ0egieATAgACR3AsekW5P3l+vyPztLOHfAwn8+4+7F+VbsMS33nB/TXeA2dYgPOYBMTF1uzJx/5rgYTcquW2rc87jyIDmnOxkXknYWoGg0pEkxBjJsuzw8PDRo0dHxweEkPV6vVotm6aJyF/b1uv1kjPGCJ/fLK5vF+azLy3g4fHR6YMHeV52XbOuVgCeUlxdLcGELEmnI7dELTinlHsP42E6HuZ1XVEatOmbukvSwPmWB2CM6ZpGax3paFp1TdMwgkWR9arVXeu9k4IhovUWieOCcqqM9doE54xVmjF7OCvLPDdKow9SMmV13TXIWT4sWZZ1TTe/WrjggwPwKJhsrU5Eih76XgekhG11aZ1zba8ogtKq3qyTJCkSORmUSnc3Nzdpmi6XTdu2iFAOciZk6DulLaHgNi2jy8igSpNcckEpSSUfDwdvvPawKPOnXz9+/NVXbVvHvWJLQInXi+A+/4t0DUpp9LvPsowxVi+vkySblZOyGCZJSilHoCEE57Wxqu8jgydSpK1zjhIZ8wMPYZsJE0REY7aa3yGEmPpHerjpvQuOS5bSjFuhtVZKWe96pdquS/IMKSGUOw+IRGR5MKMIBmutzWKhrLcBjGfsel5Z50sumk6dnV9fPH+SpeJgNvqjv/f3KGfj6USK1LmAGDinjEOaSgA/O5gg4un9+z/+8Y/W9UYIYb05eXjCGPu//Pf/PWI4PJxNJpN/+2//LQXpwQEgMB/QdmpzeauDdQSRIRkUQ0JIXdePv346Gk+Dxw8/+aTT9h/9o3/0d//o73/44YcYQBsADGmaDMpxng0QA2fi4ODg6upqvrh9dnOZpiml3Fjbdr22JguBctkbbYyzMkxm05ubm1/88pdJxpMkIYRprUMcovRgnAENneo9OOYJkqBMhzwABUTwxAtBhCBcAGKw1jqvQwiI1HuLSIVkw+HQe9hUTUzkAX0AF8K+jt+KKXHOGSWRawkOrLZKGe/9YDQMYTs87x2o3hhjEKkxsSVBEbfNaYI0SzNr+g8/+ORf/+t/83u/95NXX32965rF4vZgNpNSRhEwxkmWJUUx0sogJWpTa61C8EJwKYX3LgRfVWvvHSIkiXQuj8IDxmhELAdbJqMPgfEkSYWxCgIwxgl5iavvA2ScXMjzPPqexQHINE2j68nNzQ0ixjQihMAYmy/b4FGKFMEY4/ZyxoPBIE1ErDmSTIzGwyRJNvXK2eboaDIajb33MqGz6eHFxUW3WW9Wa68Vp5xT5r23xtmtJOfWKoIEv6/y93dv3K+jGD4AGOutfymRdDfE3o2ve4CBUpokkr70mfRh6/gX6NZEKcaJsJ+eMEoTiYwSlGI3GtNuHX1IhBQIkAiZB0Dw/mWM34ecfVzZpwv7B27noXU3Annv9zM4cCddAICtUhbBPYgVw9Xl5SXfdaD8XWUI4wWnhFIbHCKhQjhj1hvbq8Wy6uTz6yjjSAl3wRtjZodhVJSr2eGDo+O/8wd/+O677/7Jz372/ocf/MW/+9O3f/iDXDJvTST8IyVACVIvBAGg1qodiu7BeeJdLsVrr7/KGbRtvVxeL1fzqlqjTyl4oD4geIQQ0HnwwSPZkgc9xqj8EoD5a49vBXX4X9F3gDvTKPDN/AB3fav9NYpLcb8a4/knO73ReMr3NMYQQpz/hW0nZffmSBhjnLE4S4KIdG8/TQljLE455XleDvIsT6y1NzfXZDtqxPq+bdvGe59lWds0s9mMUC4SWdVNo3QiZJnnNxeXTd8o1SeCAXivTSZkKiUjDUeUlCSJRMpHw2GWSEHZul+3bV1VjdZGJpn34FwwxnSqzfNcJFzrPs/zyWQcnGmajbU6BM84kZITCs4ApQHRdarGAJSh5EQyZrUnYFS/oYCUUMRgrebD0WtvvGmNR55czVe9sciFA+oBtXXGeSETyqW1Vjct5zxJ87jy+7YxVkspy7QoimIwKCaTSdPWwZumaZJEJomM2dimmreNFkIsVnUITvWGy+RIJFlSetuDd1abzXq9XK6l4JRSIEEZ7b3HZDuqHVM+Ep1iGPHO7xcAITS2mWLxRghIydNMCi6sdU3b9p2OZaS11gcLGhBDvPKOvhyfjkt9i5pFnS7Y7gDGmE4rpZQzARGRk0RI7zk3jErKDedcmgDGhTwvHBLtHHrIi4G3edT2ttYaX8YutnOOzdcNOOsdCa6valO1WxaeBzIcTIUQi8Viva6m4/Hx8cn19XXbNldXl8bZuq43zSZN08Vq9fDhw9FoODmYZVn28NGDLMucs4xRaw2T/JMvP1R91/etZ7q1xrZtmiTeusuzy0Exmg4Pju8/aJS+ulkPBqN33vve++//Svyz/3E6PfjVh5+qXs8OTn7605/O5/PgqfPWGDUcDn/rhz+4vr42uiPFZ0mShIDr9Xo+n7e9VlYTb7U1i2Udwurw3mFd1+tqdXBw0HUdoUHrHgC4FIGAdT2hnrBACSIGoMAkoRSs14wTmTIukDKy46ttucoAIIRQykCAsizLYrxaVYv5ar2uOGeUkgj/bGfEowWwsp6yKNAUgkcExigAZVQ4cIQQRrl32lpvjKMUnNuVs0iDDx5CTGmLNKs267/6+a9+64c/euONN7788tMAjlJUqsuybLNZh+CTJBkMim4yCQg3bTRbbgI4yjBJBWW4XFWUYd1UIQTKENAD+iQVjLE840qptums6Ql6a701PaOc0cQ57Tz42HswBrynSIBuN744BBGntmI/Pg4uxhwitlE2m03TdYzxg4PDum4vLy+7rsNyENsWaSKc000btfEju7MTKX7/t9753nvfv7m5+Xc/+7O2XbXNmhLJCZGDUsqccamMic0/ACQEthMoxsU/IOYosT+y54tFXN3uBPn3273f2UnczRtwRy4jhFDGXgbRO5j/3do93CE3WN0ngglGCBcyS40xPrhOacSAGMCjBw8BPGIIiAC4Cyp+p5D9srj85uP4ubFM+Va1+q2Ydzf7ic1jyhnZDrITBBI8Gu0CWoDYX6OMCe/BWovME0a8t6prGYE8Sxij0PVcJK12Vbtx3gNllAlE9AFx3pbpWPXhcHby9pvvvPHotbNnL37xy1+21aar6nWvNqsNpVQWqTfgA7XeBEIsIQ4QKZVUUEDvDPH+ldN7/4f/+r+UCfn6q89//pf/Tlcvag2UOw/eBfCEeEAbCMK2vxe2Bk1hb8lBts7Uv/G4m43tTtTfPD34xrn99QdwB/XBnZg3vePJvl9yYSdWFn+0TyxC2JtDhbviXNFEEgHirDUism3vi1ApCIVYFMaatevaqlorpRjb5rvGKmMVpTRJ03FZHJ+eWBfG00nd9vPlYtO2N1eXSSqdc5IRyai1NpdckJxR3Cxa03uBQBKeiRw9Ou2kEIgkT1KTuwDogyWEAYEAfjo5ePDgAYKfz2+ODmfvvPP2anH7s5/9SbVeUBIYo4QCIYAckXhje0oxeA8QKKEEgQZ01mLwxngui4hkCJmXxWi1qp4+O+sWTRMArVUEWVF6wQUVIskcQtt3fd/Hmamo6N80TUFxNBqFLG3rtepqAm4yHb399hs/+9nP6nplfSjLMksL5/xqtdbauwScA+9hPB6PBkMGGByAC87Yy9sb3XfW9IRAORgYp6Pqy/7ShxAoopSSM9H0KvK0QgiU0D0qORgMGBNa68VigcCcC84G5xxARDF9COCDjVsiISTQEHODAGHfWENEF3bNCAQfvPEuggcYyJ3uGwmMCJrwRFImIrTgCCDjznmPhAvpgBmgBjIqaTrglNI4Y8jOzuaq77KEJZJaS6aTe5NxPhkUq+WmXtej0Ugpq5R++GA6mx12dffp519Op1Pj7OHhYZIkf/mXf/ni/PzRo0dH947X9SbLsldfffW1116jlMaYUetVtamcVjJhWZJ4SyXnZV6s5qtASavVmJDh7IhTiSIbTY4nR0dEyF9+8OFserBcbZzx/9P/+19tGnX/3nE3UnkmN/U6TfloOBgMip/+9KcP3v1B27ZRDv3y8vr58+fXN/O27fMiUVZb656/+JoS/ujV+5FbJ6XUtlPKMI7WWm0tYSAT5hECOClZXmZZnhBiAZELEqJsiAd42SeO3HjqvQngOUuTJIPAnSWct02tENGZl93rePPTXcm5Dz9RwDWGhIjfA9g94WX7WWFb+e27D4hciuzy8vqzzz578503vvjik6IolO7qui4Heb2oKJEBXIyLxllKad/3xpg0TU9PTweDwYMHDy4uLm5vb+MggJQyCkLHVFp3FUHMJEGkqSSOgiBJmuZt2zprvHUAhARHg6cBibcOaFSfZIxF24WIhUopx+Px0dGRlLKu65ubm8h5DoiM8Dhg6WzwDpwLzrm+b4s8SZK8VzWhaK11ztRNJVMTwBalzNKTq7PTm+vl7cVVcDYTPM1KwkTTm7btIgBjnZOC7kcrs1RuNpvJg9PIIc2yjAvSGdN2KrTtNp3H/Rl+OalIvqmvvN+1I2LknI0ksgAeSYisFR+21y4iKIwzIRildChKznnXddr2zJDtCvIu3ugevPfgEdCjR4OILLx0u95nJPu0YL8B7Z/HHfHtbsDb5xnwawB4vDqwq3T9juWfJInHLesCd+OpiBhAI7rgLVLwELTVjFAquA1eG2t8IMgYlYQKpIxTWuRiPDrGEKaTo/HowBkYlqMiySulbq5uLxfLzXojWQqBGm+lSLVE7xx4whOalzyhUvVtW60ZIyknbz46PTwYPDzMC9YOpf7yy8+fXIKB4J0PznlkAUOs1QNsrwSJ3QfvCEDYMhX+piH/b/jKX//FX88V4E7u6O4ord2Ff/xOqmsv8gF3couw0/fYLsgQwk6xMTiPiGznxBZCQEajdrunW9V2ussDnYMQHCHQdZ11Ouza9vEeefPVR48ePTy/vJKCaA2ckWazWlXVwcGBD5YTXIFv6w0Gxxjx3rHgJSsYJMFS1frz5zeULT0ip2I2O8wHw2pdK6MJQckFIs5ms7Isg7fe28PDw8lkorqGC2qt5ZISCsYowBC9z41Rw4FwXgfrdAg0+OAtQ8IpmwwGicwH5SwvxoKnPtBNay9ulvP5fHZw0KoeeToaDlvVB0qQMxoCMTyA1kpFfpLVzlrrGK1WS04JE2xdLV88//rRqw9PTo5nB5Ozs7P5zdxam8iMc45IlfE0pUgdoyIEtNqpYBgGSvDg4CCRdDAsOOdt3zRNs2mapml8KvfLIF6IoiiKvCTVRmvdd9p7z3YGud57kZaEEAjEmuC9gUAo5UKkOy4CAniECOWG2L/abg53lpnf5QIOQvDBe2+c1dZ0qudUbBdVQAAAgoQwJMQG7yD0xoa6NcYwJgjl1gWltXPOWBsHd6NZDKWUXd8sV8s5RRgP0iyh4+HwYHYwGecvXlzW69Wbb71+7/gUgXIujTHr9eby8nK5XD4/e/EP/sE/ePDo4Xq9Xq1WAFAMynxQrtfrOHVaDgbPnj378z//c8/0eDzMi7Rq6l51JHjO2M2C9U1n0XdNffvRxxST6eQYIOmVv3d8+oMf/ODP/uzPP/r0s0xk4/H0l+9/sFpWv/vjH73yysO3v/NmvB+stVVVzQ4my4AePRAymYwfPLj/4NH9y4vruq6fPH8xHI8JIU+fPh9Pxz/8wW91XRe2EmB0uVwSwqp6o+pWG09E5p0NwYuECEkoDdbZeLICvCQfxSACECCg954gY0wiUu+AMXF4cCyl/OCDj7Zgwp3Cwnt/fHzMcCty0Pe9t1vo3nmzo8SZSGvqe82Yo5R6t+1ZULq1RLLWLpd1kiRt3X788afv/eDdvu+LIqvqSqk+uqJxJpUyVVX1nem1iVtJtJJ69dVX33rrre9+97vX19fvv//+n/7pn7548QIAohl8BLsEV6PRaDoeDgaDshh670PAshz88v0PvLHBASHACfPUI1IhmCV8r3AQv1E8omfjw4cP+75/9uzZV199FT3GjA3WbOKcCCLGokcpRSkmSTIcloAWvEtT6YPlnGvX/OIXf9G3zffe+/73v/9dZ6Br2s8/+UJbAKRAzLpqa9VTJihnAQhAiNMc1lpKs2hG53a+O4zLTddt6tb1vZQyMuHupgVh12vYX+/91Q93GgFhJ/YQC8T4T611fHEUb4/Axsl42mvVNE21WiulCGORLRGHIr33DkK0YIqfxfAbOco+nN/96LtHpLbsM4lvQQvxt76ZMZDYQAUIsUZBuk18rTVbcVJKkRAIBELE0iwTVCaZUVr3xqCTkseZeMYY4ymh3DjvnCHEAVCj/XI5V73VvblWt1Y7BuzJ48/nm26+aZZVWxQTpZTRYTychoygMQGokHRcDHKZVIuVbpuE4Gq5OD97JsjBMGWvPzypF/f69dXz65W1zhkwDiyYQIlHDoTs2nfgIeydBQA8/obBh7udgrvn6n/zY788/I51uF9vbndEhfW4nParbot7iS0HiALuk78ASCmNiYLfDVtmWVYUhafbTkeUC9utUjw/P/feI9l6iVmrEVEIFoWxm7Zuuqaqa20t53RQZASsNXpj1Ga92qznaSIHgwGAn5bjPM8p4976TdtW51cAZDAaiiQrBpnMUtWbum0I80wwQokx5vz8nBKQkldV9f77719fnm82G8qiyBsarQE8IwwArdNNYyiBhDNCiNNGNY3VhiIZZiNrvbVea7vQaxfam+vFclWDlEcPHlzd3hhnRZLUN9faGturtMiBkkikc1p76xgjeZKTXpleIYHpZGR0++zFs2qzmM9Pf/KTnwyHwxfluQcEwBBwOJ4en6QX9ZwAFoMykVnwUTYehRC317dJyqNkRVWv664NIeRlsdbq7m0Yu66DwcAGaJpGKxvXwF7LRDe1FGnsiQePcVqZIGPUbr14IFAaDUF87CmEb/YigSAAcM49QkwYXNgK3mut/VZtliKBEMA7p3ZN7YCgjemVCgGHY0kY7fteB9/2bWuamMekLg3MU0rZi7MPppMJhWD6nidD6MjmejmT+fPPns0m00l2UN1s6rapq68ePHwo08wHoo1//bW3fCDVunnvez+8/+i1k9PjZbVqulaZ/pU3H/GMPL/6+v2Pf/704ovgTrJ0lKRio1qkNs2YC8pYLUcp6zHLpa1Du+5MXd+8eL48OxPHxfR4zNLA+9Db9nZlhgcDZfpN23TK3c7XZV44y5yFYXkaLJlhHxz29WZtFAhRTkqS87pXfsCrqkIkD6Q7uXevGND1enV0dLQ2yze+d+L9cd+q+Xx5dXW9qZrga85YURTDspCSh+AIeMY4peh2ri1R1sn5EDyGEFIuiVGcE8pcCG2WiTRNAGCQF5vNRmkTjEVA4jCVyWw8eHhwfHx83Kn27PKsbpv1erlplznLC3Anh0dXt3OwnKFHYqeHY2cRCHE2XF9dE9LnSToaDM8uLh6cnnYmVd4aTH/5yVfjf/mng/HxRx9/8PrrrxzfS88vFpRk3nGrQ28VBBYsrdpOJslicZunskzYe68/TLx+7XCiHj24ePyV7/Tz8+umCYRPehscBOFJ37Hf+dGPf/D9N4uM3FxfnBwdv3hx8fyLL9SmQ89FMmytbZ1BQsDDgeSQ59775XxeluXRwcHNfB4h1rquDw8P//iP//h2MR+MhlyKs7OzVJTee0BNKS0yQSkNYBj1iMb5jrP8/sm9EFwIGDxiINCNNlfsf/7kz0g9+J0f/63j6fCPfu/3p5l4cf6sVpuPPrsqJ6l2GCAnOGCicGStlZaMJklSLStiw6wYQ++EQW7w0cMHXz9+ZrTOx3kgDCnB0DMKcdLVQ2CUEAoeLKOCIfN+G3cIpSSOOwKhnBK6db+1zkUcOEk5JzSqSQJ4Z20m+Hg8HqYyUfDF4jrYsN40VEjrAAnzzgVCKeGxJvQQfBRhZSRAnJDfbgfW+4h0xOozz3NltDEmz/O6bj3XEOWZt2FpnyjE9ijbBZ5dVwJMlGqIBSogZZQzxrRqKCGMIQA4p73xAMARWcKNAa21cg4RWcIBwHgEoMijuU5LKaeUgrW91mfWr1fzn/zoB49eP+jDAr2b3R+2oV13zfMvH/NsoB0u63WR5YkMwJrXRqfn5+dV06dZgcreLK7aumZUbJpKZqWy2GlCGEuLg3fe+/FqpR/VHz19PrcORMIahcoRwiQSQila1wejwTkIhAZOAoZAPe1/PQdAhMhKvvtMPO5iS3/zBOJuVbB7w5dH2LWNnXMYgDHGBN+zgAOCMnqxWnIpAWDL8smzOCIxSEsmCE/EPodAH0IIUkrV9cYYzrlkXAhRFEVRFJ5Za22RlSGEuq6JoNb452eX5xeXqUiiAKsQyXA4jJ/11fPmqxcflaPh7PDgeMauFzctLKxUq7aWInWgRSEPy3tWG+tDkec+593O5IUKl7K867rbqlc368GgYYw5F/K0bNu20e1gMJgvrjjnQohO0cVqabVRSgHN0jzzxNlgCE85p4SjtVpb6jSkaUowUS54nxk20KbvOmUuzWiQXm9Wr7wymoyK86dPLdE/+sm76xZNgNnxEeXEescL0fad8S7Kti7myy8+/aJv7XA0EpRXVdUENxwMfTY4X/XPr2oDQ6LFL375rG7le99/9+Hrw6ubS5mL8mhwEuxoOnmtqimSrtmUMqXB67aVWdqtG+o9KLh5frm8vq1VEzSQIBgwE1SUqoswAHR90nYy1VKkg3LSd7bvNUVGAvPWEyQUi+Cps5QKzsXWUUHbbmvXR4EA3a0xQgjhhDZNAwQZY9ZaJASB9H1rjEFGAUAZ3XVd2/fWeyoolUz3SneaIHJCKZKUSSEEAgMgvfZd75BK1QawxgNrultElELGppXqm5qEAI4djEfgTd+1KHiWTo8PxsS7s/MnPiiREhu0Dvp6ea2c1cSGgH/n7/801mez2Ww0GRtUxnfK9oyRvtvczucYPA1etd0gHbzx6I1ew/ERT1JvfWd9KznP81SKnNO0XVpdQx+sVt6GftXfWGVzPnvttdf+8A//8C/+/Odnzy/L4WA6niUsQULqprq4gE1RHB5MsywJELyHw8PDrCgCxdvHXy5ur1mSgmDOmslkMp1OVddnXA4HA6QkK3JKKbGMCsq5LDLPuSSE5lkdnItK6ZySAN454xwSBAQSgglbUiEiEooAlACAUYoxNhwOB8XAWu+ca9t2vV6v13PvfZKILJXee290QO08jsbFZFoELNJSOOfmy9vHT54sl0suskZZIdMQAkKYFslkkh8cHM1vl4+/fnY4SOpGWaO0NZPZwe1qwxiLNpBt215cXExnIwC4vV3cv3/fGKeUJhiMcQAEAULwnPPgnVIqE5xzLrnggoKD2Wwym82ub1eEXIcQEIBTpJQKyopUDgflvXv3ZpNsNCyOD2dpmv/8rz6aL5q6a0F32theacoZk0yIsmmaWNMgpW3fR1pAURRN00QrbdX1iEiRQOQbkuB9CNYZ76wz4IP3djQepEIWedl2TV1XeZrFbkjd10obJvnl7c2f/OnPvv/e248ent5/9F/+s3/2/7xe3rzt4fGL68ngMC0ONq3z3iutjdKeYjAagiMEAdFaXbcbXice/WQ6Yql0SOpeMeRh1+MnhFC6HY+M8EAMEgS3QhS4my3cF4KxOGCMEkLSVILzcU/03jprjTFt2xYEjDHO+xDAhlhFAoEonfBSjREgREvlu4wH95KO4BhjveoASJy5hxDABwQPbgvhxJp1T2UgEBMYSwgJLytsCOEbjgN3MfA9hgF3lJoALSGUELpv9sdEOVJ3YwoCEMd2SAiUEA8ASZI450KgUoi67Y0xw+Fwfb0CgOl0mmQZhuCcOzg4cBBklkprjLOma7RWdd+1zWY6LFvdL6r1weGIaoeEDMfjk/unxbOnIcydg9GoSIpkuemVDTF6xq9DGKNAiWckoHfkN5EO8Dc8/x/62FUd38B7CCFKqU6pePU559Zv5RBYSvM8T7PMO7dH4KzSGKVOKYv4gWQ8hNC2bTkuOBVZlkXpFAQa24LGWKUqAMiyYjLk+07o5dUVAPBEHh0dlcNCWfX48eOrq6vJdKS8171yRgfnu6YN1jnnOoeRURTdzvbfwnsfhzzjBEdck0mSZHxr4x4bcxGy4pyD90iAAnIqkpQxRnrVWWu9Vt57FywGQEYEoRQlZbhaLw5nk4cPH37/u987OTn5Wz/+7Uij/h/+b/93QoASyTj1xgdwxihljfdeiiTPy8FgtF61i/maEOKN994yxlKZGDCIiMExioOi/OyTT9p2gyTITL73vXfKYXF+dX7x7MWmr9M0DcYIDCwE75RgKZeZ1e1gkAvJqmazXq/avgESvCeRNUIp9Q5idljXNSFM8MR7zzmPY7BxOJkQEtxWID92gmKi4HZylvtlcwfOdIRAdNMA8HYHHngTtrwEo40x1nsfrI+GW5wXAQiiN9pqZ4MlloTgkDJCKOcsEPTetn1rreudCiEEBETsuo5zhpQgInvzlftNuzFt4p2xqrJaZqlUfT2aZtmIVd2CJoKkgQay6tfj6WR6Ooh+gI1bUQUoTVoyRF2UcjTIMilms8Pjg5P1cqUKfX+6SUbm9TcOkxSvF7ra3NigATSnbJgPbGeMciA8SKeV6U2o2zqnh7027373u12rptOjIivytHDOzcYTRshqs1KqSzPOGIYQDAkuYJpl08PpaHFbd60LLljfdT3hbDKZ3lo3HA2yJDW9HgwGlLOMZpRSKVNGeJoWeTbo+54EIqU0Vule9X2rjXLOYIi0ZL69Th5C8AEICR6ASJHmWTYZTaRMlVJG6WbTLucrmXDJeJJIzliwzlnNOc8Sqfp1r3IhRJnzrBzPDofW9pt6qQJft3qQpV51HN1skr/y6OD3f+8nn376+dcffsETyDioEFZVPTk4vl03BQZChKCiqrrz80suGKPJYr6+d+/EGNs2PYD1LjAmKEVrbSqkM9ZpF0LghCIiQ9Lb3lubSCEkC+BDMARYCAAIVmkoJCIOBoOjw3GRsmE58Da88dort/PVetO6OIxre2SCIqWCevQBgpSSC2qsirzIh4/uW6fX1dI6zXikAWKWJ5JS7zFWz4hxTtQTQlIhGRNlWdabqq6aMh903YozmY1GzrnxcDTfbH7x4a+enz9/7dHJg/uH//v/+h9eXV2cX179D//Xf9xu1vWqAcjunTw8W9otIBECZ4xmKU84kCjNAzGfU0rLPMsSERDVLt4jIqXbm9N7z/nOmwDI3c097rDspaJRoLiNuH7ndmGtNlrHpsAkkxYCUIKASG3Y0pO8gxDVFbf3f0SUAWyEl++MNsTgkSQJIaRpmxBclJGmFCfj0Xy5CtGqDSH4AOAJblXwAJ0PFsIuIYi4ZHgpKrUPVHcDf7jD0ieEeI8ISBB8sBGEiGouTdNxTpEE5zwAIHGUUi6QUgYBpZR13QoMw6Ks6jZL8zRNrV1xj5PJdDAaVqv1er1yLiw2CyFEORpu6tbbkBQ5EPTepmVRNfXVzfX90wPnUVAYjkb3X3n06Oxssaq1Zq++8R4Rgy+fnH397Gy9qQIBHxx4v1VQ8D7OkP0vSS79BzzCNykL22d2ysHhjvJSpMvEQBvj316WLe71RVHEzDXLMkJI45xkfDKZCCFiSysQ9D50WmUuJVFw3UHwUb0ycC5OTk7atm07ZZ1bVOtG9WmaSynL0fDq6ur88uzR7cOsSDnnglMuaNu2GLxzTjDGOFUMkbF8mK8218ow47TQYjtZg55yQgwG9NYb593O8AldsG299aGNHRZnLKHAGReMBTDeW0aClEmWiaLMy7Js1ou4FCP6gkgYE4xhmorZ0fToeEY5Wa7mlFIP6c3VbdfVhBPgQAMJNABinGhbLJe90t6RttcAxAWPnhLG84RJwfq+b5vGam216VyjdC85b9aVst3scJYwXmappGzZNtZtAvfgvbPorHNdpzPGpDg4HJ+c3KMMv3j8hdIbQM84M94i8sg1cbDVM+i6DoAIrr3fjrfgbqKBUiqYIHdm6cOO6Hp3zdxdQsZqH6z36BxxzgHZiultmro3uu97ZbRzzu8wrdvbW0ppKhOZ8EDQgwMINljnAkNAgkRQQKQU43LUVsZfD95HdXfhLCGECeoq1aYCB+VQCnpwkJ/ePwE4efz4sXb1l89ujh88YCWTQiyqjbDicvW867qqqqx2RVEM8gETFAOzpp4ennrr6uX6rHXz+eLJ18+efPVUjDepgEevHN+bHB3PRk27Wa1WXR+W83o1b/sWnWUWaBCMCZJSwrh48eLF22+/++Of/N7ydvnkyZOu6cpykOSZ00a3PRKvdaeMjASwuu1za6x3RZENR2Xdq7rvbN9JzIs0u9Tncf9t+nY8GCqleCJDCNZ6II4QUhTFcDhOuIik/QYq7y0i+sC9Nd57JiDS/F1wGD2sgUCAwahMk4xzCT4wwrNhLmXqvV8v1iEEDEDAeTTIvRQhSel4miUJ+KB0r7ggQsosTxgBJkrnrBBJ125c11DqCtCvH09ORz/8F//sf3xyDfkAGE3qdXu7WslymBCLJBBCkyRp276p2yTJjDHeEWug7621ffCQJIGx0Ku2SDhQGu86a23XNJISZ+zi9gaDSzjjlEjBkFPba4TQtn2Ri8268kYTQgSjxijv7cnp4eDTIgoWcwqcIaHAeCCUZnm+XcqIe9ml09PTvu/bTU0BM5nEkjdP0m2XDhHJdjyPEYCoW+A8I5QSBh6KLL+9vqHIRMHBe5SyMybJCwv48eefG9e/8tpDzvmwLP7wpz9dLZuPPvpqudjY9dxZSxAFZdoaJHFImHkaCMckSwknXdd2ShVlCUC2ziuE7PhleLe2/muPONAhdqK8Wivdq31BsBNWshA9tyjtjI5TBsgIsRaBBO8DQWMMBI+Iwe28HkisieleJCgSkBAR0C9XSyl5maVFkUXrLAxmtaySnZuls875rYkGBo/BA2JMNhAREGKVQODljGt8EK9CbJCTXRjbAxuU8jiTrXVvrQ2BRIlAKUFIFrWkjInGJS/JlZSwuq4Tguwe41zeu3fv86cX3sGW0g/UubDZ1FdXVyzPDg+mQgh6dds0XSaTMB6lRcoxNPXqejnvjAYEKimhtBgO3njjjVXVbjbu8PAwLQ+oLICKs4vzqtlYB05vDQXCjhX+nwo5+OuzhC0G8w1EIV4RKaXZGapxzj2EyHSZHI3zMk/zNC/z6GfT971SPSJs2hrrcHt72zRNURTT8WQ6nRAkEKBrlbXR5I9Z7/OyODo+6fu+aurlcr1er5teAWUiTSAEJmj0jTs8nCWJaDcVBrdYLJz34C0hjLOtbZVIhLpVSqm9R/xOb5R672OJbIyJqyj6F6yq1cHBQTkYIRCAZaV7q30IQTAWtWi1sz5YxgZlmZfFIBEcALTpTa+s1QTBgQvUUcD56tp5c3193dRtIuXx0clisVBWEU8Ceg8uEAzghGBMcB9wtdos5iutXZqX00kGgM4GwRsEUm1W3oaDg1kipLd2s64APKHgO63b5vzFc6WaYPSgLKjTmeROq4QHQGeMJ9QB6CIXR4cTwvDFhYgevJSRvuu13yb3cWwtbizOuc520S0IANnOtp4QkogEd1zpeMQ8KRKevrURxXoAIGIVyjnHueRChBCW65X3AEAQqHfOeMe5EELe3C4BIBFdlkgW9WR9oNR7D84DMk+JpJRSTqiQlFLTBGsti+o+VHkIxjpEz371q1/e3tjTe+T+/d9+5dHJ8eFkPCoCWI8nrephHYbjzFFqga77xhHf9K022gbTm1YvO/CmyApvw2QwGw6Krz9//Bf/7hd9b7xBrf16sbK3NYdL3eD0oMgLUddwfdGtqp7RvK4MYEKoYJRRJoqioAzbVQcASMnh4aFWtqqqTVUXRbFaLbz31ihCQ6c7rignREqZD4qu6+q2AQycc71aNXVlnT0+Ph4NS0rAefTgjNOO+Ea3Oc+dCyFYijR49B4ICeAidcgHj5E54oNzSJwzlKJH75EEKhCRER47smVWci4F44g0k3Q6PWCMTYaTx19+1XWd7lvnDLBAkApKGLUYjDNdQPRBO2fG2fjRgwdt3bw498BMkiROiL4Jm83m7Ozsyy8+++nv/+Ef/uHvVv/Tn1kGktPZbHJ1s5oOByml0ZugLAeUkq4zeV6Ohsya4CwYbZVSccVQ6tq2RccSweO0glF6vV4XuSQYuKDT6XixqhLJJWfIURskBF0IEEKzWWvVgbOUEWs0wZBKmSVMcnRIGKM0IZRTnkjCcDgehBCWy6WxigvOBNW6F4KdPXu+XM6tUQieIDFGO6u1MrjlPCIjRHDKOeeURRBVdVryJJFZluXBeqsMzTJO2XpdWe0OZwflaPT86S1Qsmlq1de/fP+v3nnrna61q5ulbfvF1XOT8kRKgsF7Z7xhjFlvlNZplhlvAHF6OM17DeD7pvHO3VUO2LmLRXbY1vqBII27YdziY/hnNGql2f2+H79UHBYAoHFP11pfzm+klHXfcZ64EICEgICUBB0AQtTcwS1xPwAAkB31HX3MFJAAAimKxCrdKNO2HWeQJAmlgAAMHAIGBMqABxbF2ZwNSALiy+mprWkjIif8bqCKu3zsmMT/xzJxP0YRt/6uY31Pte7Djo43mUw450hCnDqLgzPGaASUCQcgwcftDxFoUQyc9YyBtf72dhGAEUKyrEAgr7/++vHxsXNuUzXL5ZoCZlk2Ho9N1/QdbZrGex9HxaIv83A4TNP02bPnq80Ho9n9bDA9PT3lUjw7e650o1qilQIHBCkhCIFZNP8h8oC/4XG3HLybN4SdowTiS0+EPRE4hMAFn0wmBwcHw3sD7z2gH46GiDifz5tmo4yy3tR1FS3sm80mmt0PJwOBnDCutbbWhQDKaAgkTXLCWcpKIqVMs9F4qq2JjYDL64u+743TH3/6EWWY5yklQAC9NdYYrTUEH5IkDvEqrWUqt/n9LkuIAY8JVpalMWa9XvfRnAKRMCIEG4+Hjx49YEycn0tnbVVVSqngHGXonNN917Zb/5Q0Ta0NAbxWXumthmMIIaZNi8Xi9mYxKIb1uiGE9X0ghFAurLVtr3rnkBAHgTAuOM/y0oXQtL0QMBxMiqwEB8bYTvk8yzjnucim48mwKK0xXd2Mx0PrdFWtlepYQhA8IZgKicA4BWU8p8AYlwh5yglgtV5W1YonUcnNAqC1plet4zlsaaox6m/ddwkhcbwrXme29eQL+/QxroQ9yBRrj2+smW0nlFEClLHIn/YOuk6vVtXtzVo7a63VximlPMJwKIo8Pzo+7btOKaW0NxiCsyEECjSEwCRkVDAumZAQRWAQdW+894xwCIgBggdnfAiOJXn25kx+773v/Pi3vzccpF27WqyvAfyDh8fK29eoyMbj28X6erEuiiLNMqvWzlhBJYitorhSqm/VK/dfy4q0N/rq5lq1TvBC8rQcToM4saY4e+FWi3WWM9VvlkttTMhSahrHBUuK1NNABc0zwaXoasNl+tVXXyUy6zqVZFm9aS6vrmbTCQZw4IzTm7YytmecFEU25JPeKaBQlKV29nY598Y6Z53VThsAsEZxTjnnyCiTApES4glSToVzoeuUUp1qFGPMWO09EGSEkRAcAUREHywiZYxxyqRM0zRPkiSm4CGEVKSUUkJYKhMAInniHZJAOJN5mghOOA2UIae03qycs1mWgYeuaeukJgGTJHP9RZlngrB0POsl03VVG/zwqxcnr9/+7h/+vZvG/eUvP26te3ByUlVr5hoqCgCvlB4Oh0II74CztCgGXWeshRDQWh+VMCi1XdeEHulwaLUhAZw2zabydgoAB9MZ53y+XAewWrcYEq1akaQUCYCvqqptW2sMo9QGlSRyUKaTyWg6mygXkAtgSAQDgABUCuG9h+VSGxNbdFELcr1eR5VZCigZd9pQwFTyuNHEuyURMpZQglECuFwu8zQVjAUbQkDnAkdSpEWzajmlzrnzq+uz88s0Yz/8rfcIQ6X6okir1SVF8+D08OLiSjkiKOGEUkRkTCSCCmq8OX3l/s3NTbVZSSkp5fPFEoJ75dEjxrm1dqeZ/3LiIOJDzrngX276sWzy3kfTlKh0HGfVjDEEMaKsAN4a07ZtXddVrfNBWXUhDUo5T3xU9QYSb/VdtIilJiI63NYNuP1/BBEDpVQWWWI053yzbpq6Hw7EqOTVRgMAQRACmUgIIcZZbeP4JQAQAHSAJDDEKAH1snaJn7ptZu90paSUdxkMbbcOEGQgPmAAau22s9O2LeccgGjtnEUIIurHOmu2zh2EZVluzJbOEWvl3oX5fI6E3Ts6Pvz/EvdfTZIlWZogdo7yy4w6Dx6Rkayqutg032kMFouewS5kMRAsfhwegHcAsrJ4wMoshvQMZLunq7t4chIZPMKJmRu7TLni4bp75VRTLADBfUjxdHezML9mqufodz5ycFDlxd54SkKqt3W92darTc8YmaWqyANgLqRpOtv1lSo5Y7rvObmicWy328vNmTrfzg9vE67W20361rAmxQQxQkL8uxGFvwc0+v/KdXOHv40o3PRn6VsvAANBRHbNEASAAek8ODg4Pj62zGy3W+ecUGpQILd9BwBCCO30YPJjvW9Xq5BS03WP7zwqiiI6r7U2xnV9H2MsRmOwFhFjQsblwWyOiC9evn7x4uV6s0gh2uX529PXn3/2yd7enndmuVx2XQeQfAwJyulstn+0L6WsxqOUDq5cT7JsWOw3bpKDwVqr222zHeTZyJBCGlI5pOTj8bidNgDJOWe14YQzJglE56zRbrXaMNYEnwDjEDAtOJOMUIo0xqIoulZv1jtrUlvrzWbX1n48Hk9PjmPqtLMxuAiAFDkgodDbXmbZ8cl+DEQwKaVkhKaE04Pjk6PjTObeWIoMfPDW7R8cAEbTdzJXlENKoeub1XbdNDtKIngXjHaIQGi0Rnd8oAednZ0hw91uFyNcearite0awE3MqffeuVAWo+uZwnC3rrgI4Lqh2bppGYf1+JuPyvXRZfjauUHSPICIYF3Y7OpXr16dnl0YF2IEIJASUMGUgOj53uG8aZqura21ybuEjECkjIWQOFNZPirKMVDmbPAhYUxBe4ABaSAcGCAIQlMi7Ls/+uH77z56+ODOuJDW7to+aqcFpZtmE1O6c/cBFRJSMo0usjzGRFJm6h4ACOU0RU65EMLb8Pr0rfdps9uWo8nefmU6r3tPKW9Msd7hrtWFSrNpxpmaVAd5nq8Wq+hDIoahAwIxaq17rSPBiZTy1x9/vLd3sD/bPzg69N63dc05d84Y02sdYjKUIadsMhmZEKWUXAqtdd81puudNSGEy8WyqiqMwTlHjAEKITihOE0MIRIyNMIQQoJE8CoTlTGWYoSYfIxASUJGwhV4O6RyIQFkyCilmZDWekRUV6HMbgiCqzd1TJ4AYMQUIZCgJGcUptMpJEIp09Zcnq9O3y7bXj97+qJg5UiMg+1UUWTZ8YZmjLFXK/Pf/eu/+IM//qMf/fE/++btZX92gcHsT7IQuhiVlHLwthvsBYWQmcq3m1Nnh9k8Dnvz1RomjACGkAjgUOGstSk4xFQURa4ESTFFn4Lz1iAipxxjqre7dle3bV0WIgUnudg/mN++dbRYrS+3jQNgmSSMdH0fIVpvCCAVlAAASYyRqiwkpwmClLxQ0hIclQVFEIwCuVpLmAZkmzBGOCWINEZYnC3k7dvOhrbuBJNlDolypw0l5OjwaL1eW62r8WSxXP2f/y//13ffvXty+5hJJhR7/ME7s9H8V7/6aPvklBASU0gp5FkxGo1kppxzVPBEsO371WqJSKXgk9H4+PAAGR8Eq4Mh5k3VbJruamR4ta6vrHaHc5iz9jofHCgSQkiCcMMZpPRK/uSc0z5kkAgFyhk6O1hMxxiH0/YVRp6u/HMAIEJKkFKIAEAgIiaSIEGqt21RsN/73R//yR//Z8vlxU//6q8ppePJ6M2rl3XbbLe19wmTQSJYwkSJtm4wIEpIUqJIaYo0IklwZVl9IwG9KWMDVjx4ftDrFDEfOiQoJAByQB+75Fzw0dd1TQhLCWMAREIph8QJAueQUnr96u3QSXjvORfDWOeqa/Gp703XXY2uT1+/uWYB18E5r80GMHkH3lLAzWq9vFhMS8mS6rWtRtXQVg6wx2q1Wtc6Ed4bjYz4oKOzMQSM1xwFAMr+f9oP/APX32xHriSO186+KSXw115M164qQojxeDyZTPI83zUb6020cXmJjLFWt4iJECIzIQRTSiglylFhjdFav3z1HA1OJhNjzGq7Mca0nWZS3LoFk+k8y3OforU2ROCcuRhW281ueaGqqixLiljXddfWgw5zOhpRSo13eZkdnxye3L6dFYO7wFVEyLV33G8cogBgmOUNzfR15XPLywtErKrxMGEZjUbOOcM1YwwwckKj8gApRm+0c4EgJgJ0SNXlTBCIMcJm21obt3UXA6dEpMjq1goFpcPoeQoRCAWMIQT0Aajb7XZKqWJUBusQQSkqpcQEl80OL1mzq1+/eN3Vje11DGFSVH3fBu9Go3L/YC4UjSl4b3ujc+4EZQSQJIg+BBcxEc5wPpnrztR92/eaIB2SfqTI7fW4IcUrhMB7b+0ggrjSLzjntNbX5f83VvE3HIWbDTxddxY3fYM16H0k1hLCEDljnBKHIJyFEIhS2Xg6yVSBjGZZoeQIiJAZ4Sy3ptdtY41hjGZSGWMYF5B4CBhDMjZEJJyzXMgYoyAcAIYcYYE8QWKXq9XZcrLdXlrbHO2P5uMCKTHBmNp47+/eQ0boqBzPpm4yP9jtGppA11rrDgEoMiWyUTnmRJ2dXRgdV6tVUZVHh7cvzte9XRPBTUtoICkR60LTWQqaksSQpOiDbV2ywXPCo/em1a02XfCPZrNZXbfHx1dj4LIsD/f3F4vzvu3Wq4uYgukLIVmWSSYwn8y4FN77Fy9efPHFF5erFSKlgkfnog95nre6d865GJqu5ZxjGk5FztNACAMAKSUndCCTx4DOYfKDQm3w4+MDZOScSwGiT9Y4yaQ3vu9NkZV0yijlMbphhz06uu29DV57p52p+2gRIudMa22NV3kePFrrYqIpIudyVmaTKl+t15pSLlTnQTC+WjU//+zJ+Oju937nu5O9/fPL1XJxXnDmILmUsiwbhAacS0KIEIpSrrXxPgzG38OsnRCSUlCiuLFvg8GrodfG9gBAORdicHtVifK2I0hgONYY02vdGWMKRb33nPNRUY7H46IoLrc7Z2zCFEjc7LZFdTScHgbbAExJKbW3t8evjegt5ynEwWGJMxYACVwp/a6EA4ApRM6BJFitVoeHh87aoZBIKcvjyfNnL7u6idPw+uUrgHh4MHn18tSYDZdx9v3v/eqjXxKg9x7cf3DvnfPzc3hy6p31JhhjKlJxyRCxM/3z58+kVCoTTdMIoe7cuae46Jrm9fmF1rptW+ccIUwIMQwXnAs3ZMZvm2XVdQ3XKxiuIPqIiCoTyYfBsEgpITivqkpKiT1UVdXUnVJ5DOB99CFcR1JcPfyqqFwxIgd6aYQEESLFBJgQyHw+apqd1vq99x7/sz/5p+8+fgcRD/cPPv7k5y9evPj8889fvXnbdyFGHQB9SClBHLh8V2blCJSSSAZbpxvA4IaUgNfRpnAdZzWMIaiInEtKqfKJMQIAqbXOeaXyGMEa730kiJQwSAkBlcLg9du3b9fr7bBwsizLVHHN5Rac8hjjZrNDTJiCbpv1em2MUVmhmGh0s1lemrquCpUJWq83m+WlPpqncRG9l1xMJhNK6bAe6zp40FRkeVnUzQ7QQ4qUEEYZBgohhfD/H4LC37y+DSN/G+RI1+Q1a60gZOhHhzJMKR2QOaWUc67r+6GzU0U+mG3ITCmlqqoqikJKuVgsXr548eLFi+1223XdxeXSOedDmsxnB0eHRVUeHBwESKdnF03fqaSUUrP5fHf51lrbAGCIpu8ypd599M7jR4+klBHS5ebSBT8ajfKyQEytbhUHa21d1zeqn2siMEXEuq4H018hxHA4Foxrrd+evs7W67IcSa6G3y+KwntvrI0hcME4Z97bGCMXFZIEEClGqSjnJAQPQGazvVEVrEkMRJ6NMUrB8zwbae29j2mg5pMISAaOTTUuhRDRB+8tp5hlgjFqrZ3sTUOCNxdn37x8SiORQhRCqaqYzida90ryRNNyddn3HeMEKPDgeM4lV3lecoSUxaOjozLLx+Px2eKi67QxLkZwPiSClLPg7dX8iA190gADuK3dKpULIRBh4HWSawP1b6/Ha5XTb+RL3+4VAICzwrvkXKQ05Fk5ns2LcgaJGZMSobPp3t37D6bTqbZuSB421ClZMCRG9+uIziUEZFxZF51NW980rQkACYjMCikyJaT3fiC0OeMRk6MMANh/81//N8H5zepCMPbOw7tS0PVqmYIxxixWy9OX3eHxiKfiBx/e9xH+6vlfLzfryWQyGs9PT0+7xkxGhWT7JAsx9E+enPFsev/WnvahWy/DCFJGY/+JoeVmFcbF0aYVwYnbt+e2q2uzmtyC6YxC2m5WPfo8F0cKuaPRxc39+9PN6rmuzzKpbNe5Bk3TvXz+/ODgsO37rJgkhNdnq1998mw8+qLruh/9kx+fn583vXUBmGCUKpWPnSdnp+vxeNppW0lBKcVEtb/s+14IKcXIORMDISisM1fzaQ8xYoosRUgBY4wIkGISTAyWU+2m1cTmebCd6TvTy66rG+8cQTaZTMo8L+8Vfd/u6vV6Y7T1Aa3H5JAqIYpcAETC6aPHt8ajmZRZDCBE9vbNmX8Jm80u9F1KpN7urHUM2NOvnprWjMv5/vyw6zpKaQapaa1M8WAyEpIJiTHFxfrs9r27rOCXpxe674tMCZZY9DxEmWLG2bSqwLuLs7e3j39n/+Bg22yVUsPOgom06y1zqcqr2cmk77V1tTbN/t7xZr32NkGUUmDw0Xh7eDSdTOXZOurkt22XCCWcCRqbrsnHYyDJ6JZznmfq4HD/66dPpJS73a61mnHhAFiWOQCRktZ6YPxyTmOEhEAYDcm/OjvjnAcC2bh6cfrm5ORkPp9f1uvVekk4WXdLWpJO+2Xv+eikmB0/e7XtuoUkPrntwfy4KuEHP7q9sF+nhKdvF89eJOoXofWxb9Zvz5mlmcpfPz3bn57s7+9rZ7968qxpGufhBoGnlFFkFBkjLK+KYT0bY4zu4ZrGSPA3gM1QhAmljFGn+yyXWmtrdV6MVZ58sITbe+Vca/3weC+EKJPte5ME7Y1Bis6DYCwA8y5yKRgTfd9XLDatUVKFhDFgnpUxxug8ROVN8+Szp3/2P/zb//V/9af/7A9+nCkmOH33SL158/DTByd/9bOP/voXv1puI5UAhBMARHJ1rElJUMJYICT0vb0yZwQghCilBpr90LoBQNu2wzeXy2VVVTnSTGUA4J0lKCAZrXfWOimyEAIS4AIRQ4Q2JQSMfdMWhayN+Q+/+GVxfPDhdz7QbdsrsjY7yqzXFhPzVrd1xpk6by417wghRKnW6pQSFSQFaEyLLCVgB/Ppar1bXbbzyf58cte5ZBepO+26xYaYWHBoXYTUWhuEIC5ykoARjjGFYCAMh9rfJH7d1Oa/edD/NrLyW8OCf2QH8Def7duPvWnIIKYYI1wbehFC4Fp1MuiBB+Whve6V87zUugsh+GACAcowQXQxAhKvY4qRRuL6SwjJGTvP+Bndne62MSKqKJSsRD6qZru67zvbtU5Kvjy9IBR73KQUwWmVD8LsyBWvJgcHBwf33nnn8M4tKSVl6J/H09PTutvSJQ5dS1nJYf0O3oXD6WjQ/hFCLs4vu9aMRlNjTNu249EY0IUQhr1ut21PTqZjlb15/TpAoAClzEBJ0zW7ehGTl1wkMM1md+furaOjg/PTV21djydVJsd1u0PKR3uTrnd16GyOgXitPHMuhND1DSKWowISmhhVLpFgllXVfNy29eV61VhTcNZDzLU/ODwe/864wPL0zVmVV5Oiij4E6/cmE2Pr/dmUkuRcfXyy9/z5UzbaM13o207R3Hj36P6D44PDR48eXlxcfPOTv7TRRoLr7SofVVKJTb1zlqILTBBKGFLwIfgEPgHn1ENEHxkhiAQCQU8Ykcg9MoKMINAIEVMIIcSIECMjHAnGGIP3eM1e2HZtXuTa+eVivVzXt5Cd3Lp7fHLv4eMP2153XRcxGm+YZAJI03SKlJnMENFpRKyEpCSBc7Tv+xgjQAIwCQKlNGeChwCC90avt5tBookRmqYbhpJEciXV8XRcHu7tGd2S/b292dR582f//t9//vnnne6P79xlUpy9fv3JJx+1rn733XcVF6/ffLPbbGezXNtidbn+/POfFtXo6Ph4Mme99tMZiRhT2k0mk1E1H1dIUq77pIPvdB26FdJYjqbTaQUx5SqlkJFQQOI8F9Pp1Bm7WaybdZ2rom/betsomc+nszIvrPEUsBpPm12LCRaLBaX0F7/4xXy+J4QYjSaUCZ+itV73xnvfddo4l+fleDzmnAcotNaMCcmldxBCapt+06yHsRBAQgIUASMApQAYLGf0ahullI5GI0gkxth1nTVea315eak7I6X03k8mE0ZE2zbb7Xa73WqtCfVS8hig7w2lnhJOKcQrVgsqJatqvLrcDAZegktIbLPZGbPJ83y73Q6N+bBre+/zPJvP9wYs3cagtfYhVHyUCd5sN9bavm8hBskZUBIBlVIBUtu2SBJlqWl7a62QrK5rpZRQ2W63CxEiQjUeSZEtViuig/c+AiGUE6TOOectYpLXbjBN0/TGIRLGObv2GYxXgUlKSpnJvKqqV69e6bYfaG6MxkEmEEKAIVETMc/zLMtCCMa4geI7TFJ2u4211nsLELNM9hc9XGfnwLUcYABLrLWbzSaa2urLF69uffDBvdFk+i//6/+t1vbLr544+xfWQ5Gptt5eLpez+cFkuu9CNM4yxvrdtq7rpmnKanpDIBqA38HVceB1D6DIoDa8VjSxK6w1QbrRNbkYY4oxCiapEmVZCsGoQ8l4cIkLKqVEoECwqhKl3PporaNMpIR9b9peDzY4k3HRN610CQijQFIMLnjGmOSZMXpv74Bh/I8/+WuA8C/+xf/89snhbrN+fPeIKzk7ONg/up1Vo5//6tOLy7XtnQ+AhAChSAAShuAAIiGkqipynXbx7do25MXFGAdobTAJlVJORHU1aMcYYyQEsixTKrPW4pUVXASgADAMX2KEGIi16eWL17/4xUdSZnt7M0g0RZISTSmkCDGATy5Q4h2E3F7Jya5muhj9lVkhBrtldLNrnPecSWTcG22c7bTRNiYCjCKG5ANE5wjlEFKIMcQAMUBKCMASGUic3y7ev1XXb6a/f2sf8G2Swd963ahM/+Zz/mOulBIkGOCceG3gaK1t23a1WjnnJgelAEaz3AYWoo0QCKGEsQQBkZJIMJEQY/DBRu+S29ufxEHLFxIkKkSeKSkkf3v6yrp+s9k8ffo0pfTw4f26rhfnpwnsfG/++PHjw8PDQcefF6Jutqu1SSldXJx5b8uy3NvbM8ZYa41pBs/pruucc8YM5B4QXHHON5t13/dSykEB1Pf9vfsnV42Ci23bBm+1SQBxVJSACVOMXkfOi6KiCEIyytSkzGdVRZPPpcToaUIEFER4G1xno42UZYqkkMD2XhtDrs1nB6gpxhicb0xvnO6MphSllJPJaDQaee8RaVEUjNiqKldSaq2XvfHWVaOsadKuvmQCfPDXOzbvdCsY54Jq3SkuIgRkxBhDOEkYvfdEUs454xQJcM4kCs455SwRJIgJCCINITlrKQ2CRc5lSpQQS5EBWMG59TFFh+hTSkOee0oJCRsogAOhCxGNMcYY4HnX6U6bvu93dbtcrl+8fDMaTYTKBzoVEyKKyBCVyjnndeeGlU4praoqy5X3Pjr/G0wRcbBNAYAYY9M0dV0PiBEdssc4l4yz8/PThw8fcpZv1pfe68ODfQ7ixZtXl5cL693h7ZO948OY/MXFWdPV09n4/OsX56eviiJjNMzn5WisVEbykv6z//z3E0LX92eLrxbLpYvh4LiaTqeT4kHf+edP3qyWfQLHVABinNfT8ShTVdu43W7HUCEkwfjefC4ZfffBYyWkIuLJl0+idUfzw1t7t2KMs+n8/Hzxtnm7o9tbx7dn40nyYddvDw4OzhcX77/3ITLqfWRcIqO7bV2NJ0Cod7Ezej7fn8/nlFKZCe/iQLpPKSGSzWbzCsh2u0UEIBFSAAwEI8QEmBIhgweWcy7Livl05pxbLlf1rh3CeTebXbOr8zxXSjHGlUramq43Tdv3uuWcUM4I5YwTcJ5zlMhdiL22QkaVsafPnj17/uLVmzdSZIcPj/f3jpumuzhfLJerum0ipL29vbwofAhN2zLBfAw8xggQnDemB0oUn+SZzJQ43J9tOKGAZV7EGINzQpWK5y5Gbb0Pqe5a4+x0Nm6apK0LITx/+UI7a6xHykWWxYQugQ1RG9v2xjiPjGeScUG3260LPqWktdbGESGj0SnJYZtL16oepVRZlANYOuwgNyenYew9KvKmaZxzhFHCaISkbb/b7Zxzg0Y8Qrh15wRIavvmfHGm+x4RCb0hhyfAmAi4YF0IvTVe933jz84v287evnVCFdXams4J9tf1rtnfU5TiycmByqqyVC6m1KS+79q2DikSdrUIbxBUuBYHDmemm+yWG/SP0yF1A0MMcOW4nFwK0TtDgDHMVcaQeuOtdVJxIQbxNI0xMjrAjImGkOVCcNX3PWdxNilSwoE7UlWVEMq4kBJqtH3fIlLOqTF9USjt9fnTiyznP/zR9x89ejSXWd/XgGRvb/49mWnrfIg//eVH690mywgQRhgb+tphL2CMdV1zrXRgVVUNHrSMsd1uh5hCCEJcqR4oxSyTQrDB9IJSSlngnEt5lXafyEDhGKJrhlTDyJhCwgn16037y19+WlaT73znw822j4nFGBKQQfgxHJFpiJRZwuVgYnZVOxESgrXWQ8IEy8t10/UDwd2mvrG+sVY7SBQSIwAhJcBEvB/OXBwwUTqc2hAA4jUn49uF/9v4Af5DDox/Fx3yb636N8/zdz3q7/q+9z5eD6qHtJ6hKefsSCklM84YaBtduAoT8SGSIcguxGCSSd5jjIyMZ4X33rsYIw4e8wQB0VrbX67sq1evvTPOueD1bnsZvbv3ztHe3t53vvvO4eHhYnHZ931RFISQi4s2hDRE3A0pd1IKKQXpnFLCGNY0nbU2peC9NcZt/VYppbUe6HfDH+Wc227XUmaTaiSrjCJ0Xd81jXPWBxe9G8KmUwxCMKYUJdQ2u/neVJIIzhxNp+Jgb/h7jQ6r9U7XzgenVAacuwCCKpIHSmkIbmA1BAgUkBBydHTU922wLnESQthttn3fG2O8j2/evOma/uzV6fpyLajYn8xm07H3lpArO7UiL3e7jdFWihyCjhCUlG3XKDHx3pVlmVe5DRoAettzJimnEYJzPkLI85xLJYQgTCAlIYIs+qxoCTIAQhJEn1KI3scmtLTvcyg450lKKSWjNPk0NGSZzCIiUAqJxAgxRheiC1EIOvRzQ/W5vFysN7vxeKqtZ4LneV5UVVEUqpDD6DCkGJ0FgAhJZkpE3nVd1+vZbOa9HyhXfd92TdvWzfpyNZuPMUH0wWg9rA7FhROC/eKXP12tFwBxcXExHlfvvPOo1+2XX345m00IARnDF199tVhezObz27dvv//+4y+//vybJy+ODg6/993vHx0djYoyy7L5eP/Z82+avmnqWreNd32ITvepYenW4ftd1yVqbdo2uvY2iGw8n0+UAiTC+5gX81Ex3m11CmkyGaGH6XhyeHCgmEQP9aa+c+tumRcXF4ujw5PF+RIixhAkk5KIMq90MFlWHB3ezvNS5WXTNBFgvrd/eHDChZrvHTRNt97WeZ4rmWmtNyuDiAMznVCoqmo0Gs3ns+12AxhTDDH5GH1MAWJKKUC8Sl5HjFLK0WhS17XWerut5/M5IsSYANA5X9cNY/zgQDEmhBAApO+MJimlFEKaTscppUQJAA0+De1hnl9p4uu61sw2TTMZX6m5ptPp4ACPiFVVTadTABBCeBe7qBNJgJEzopQqMgXe3j05SseH69XKWqtkvt1u15eXiJgVufc2IUQgy8vV27OLg+OjLM8vFovVdvfZF1/12nTaXq5XvbXr7QYgBqCbtv3m2fOj44OiyA4O50rwxXLJOd872K+qSvttAmjblvuQqdEAxuC1GpgQMvTCwwvOskyKbDKZSClDCAwJIu37fhAT53k+uM9q0yOi1rqsig8+fL/r26dPn6zWi6KaSS5ijL1uY/SEYkouxLTerUPwGWYiU9G3ddteXG7u3Lt39uqF976rO933zRa81ZDi++8+PD2/tKZrjavrtul1Smk6HQNA1/4nEscblt+A5YQQBhscALhhIw8tkdMp+BBIooRgwpQw+ZQAvY9953RfpxQFk7zAEJ21OsYYITBOU4zW9ZIoa2zXtISwvb1pSvjmzZvVqgvxkhC0PjHBBFcJLCJJwJQidXMZvKUU1tv1T376kyzjjx8/znJIIYTgilL94PsfFKNCKtF2/77XwUcbjA2J+Bh9AMaoECLPxY2qTUiawGvTJp2ct8Z2AIAkAgAlUFbZweE8L+hmsw0hDPRML7wx0HWGEEw0DZQ1AAKQhgRzwjLjElJBKV4sNx9/8nUE9vbtW+uIjzQCAhKgDFJMgBGBpISYKBJKMUAadnkCGLwFgN7Y5Xr99mx5vryMKem+P1utdp1xaSiuMUagFJWU2noh1OA1RFKkhHjvjemHwQr8p4jCb/UK3/7i24X8twYWf2uBJ9cOejfPDH/HPOLbT/tbz3XzqKFJdc75eEWi3S5WvsiLKkdBMCaEQfkbACARBEwhgaMxMaCMc2SEarQRaEQkgjJKMMYUvCkqEZwZjQSbll2nN9vLvmtHVfn9772fZdn+fMIpdM267/tcMcYkJ4gkKEGaRj9/+uT1y+dlWY5GI8YHy5OQgoPoOaFAGbBoe+3REoiCEUwJU6QIKfjF+blSClOoirLtunq7U0od7k9n0+l6vW7rdbOrERGigoh9St97/967774DMW03q3FVCMb7pqWUc1m8Zmfby9b1NQeGTDFKhcrLjKSUmq4OIVBAJWRZ5uPxGBm5bnCJi2nQKDnnrA/GmN2m3m7XTVNTREmJ4ERIRikyxlJCxgQC030oyiqjwhtLGeut6a25WC6MtVLKq3POddAGAJjBQwWQc54VFWWCMEaYmCKPKUmpUgDnnOn6rmn7rgnWxRidj0iSIkyKTErlB8aFjcZ6xpgg0nvfax2sQ6RSFNvdDgBDQgCilKrKsY/JGp8Ago8xpKsMayYZ5ZQiI1eppBgjSeB9CiEY74iLKUZCiBJSCe4LTwE5503fWOO8C8lfGUAN9ZAZ2/76o58LIaazmQ3+iydfxRiR0SfPnue5anTHGBWZEJJ99vlHP/3pTzGVdW3v3xq//+6Pbh+f7HY7TDAeV+xR9eTJV8uLWvHJ4byw0RCGWZ69ePVN1+lqwlW2f56lzeWmqMjDd+9a3QdnmyaWRQaYBa9H1eiD73xYL+sYoWv14eHhvXsPvmq/qut6ebFcr7acSe/jycnJfLaf5zkicdYLnq8ud0cnx8vl6vbdCoDWu11WjDnDXb3Oi4pRkWU5ALatXq1WQowopY7Yrm2s1eNJk+eKEGKdBogIMaVwdTBI6TrrEyjllKbBomez2V1erp1zIcTBpNJb51zw/tJan+Ul55wJgYQZG503MWGImOUjSilLNESCBEIC612n+wiJMJoAmq69WC6kKglhPgapsnJUee9d8Jyzo5PjrMhD9FyMnbOUYpFJqVhRZFWV276ejQul1LhUurfD7HC3qyNgSBiRGOs6q5+9ftk7XY6q2Wzy+ddPLi/Xr87OHEQP8WKxZLumqbuiypnIul5/9NkXjLGyzGUmQ5FlWbG3d/DgQf/Fk282TZeAxBgZQWstQTYY1N+cvIcYSZIwXZkcX/UEALBerwlnOSuFEGWZF0VBKY0xpJR29Wa5XOaVKkZZ3W0vN5dZlpWjuZRZp5uu70J0hNEAwXqn20ZQrh3hJEVKzxbrz794MplN8+Tbru/r7nB2oFgzHVW628VwwDjs6rrvrPMWIOVlXtFRSimG7cAgu6EL3bjPDp37wJv7TVWIUQjBKY0ueOdSIoQOiT2JEk4Agg0mWWuikEypQiqwLvjkKWfTrKiqCoCsVqum7kIIUjDGGMGUIEpBGIHD/ZFS6s3pBWcxrwilSAjG6KQUbaOFgqO9cVWqN6+efvxJkWWUHY8ppdSbhLQqsx989/2+qc/OXr8+vWh722kfUrIBfUycCZEpDE5KnmWDrJeE4Jwzg0mOtZoxRukVtUoIcXi4nxd8u912XatUdnV/GMboCWGDogITphQBbtyESNNsGWPT6bRutk+fvkgJttuttcG5EPxgbZkoI5CQ0hsZ4XUhJowRGFjGCNE7d7mpv/zmG5VlR4f7GNMvPv70dLl0CJxxCJDQMcoRqKCEIbHem64nBJRSEcIgEf12Cf97Sv7fWtH/wUYBvoVS/INwws2P/uYz39Ao4rU159CztrvWG2uMyaqMZZRxmpDEGJAiQIwAEQIhQBS/6uScRxopJxSJUhmjHCMGjykA52pvb/b86Utn9eJ8l4mMIZmMpnmeKyEhAQHUXX9xdsYYb5pmIEUaY3a7ndZaqbwoivG4HMxCrLXO+ZslHyOY6IN3MYDu2pQSgZSCl4JHHy4Xi81qZbR2zt0pbt29c/L973//+TdPP08BE8QQCCExYPQhk+r44BBCjFqXXDFKI2qKlAGRhCkuJBeEkJiSj5HEYIyLMTpjB+BBKSUyMZ1OQ/QJBkEONG07xGpTSpOxiCj25Hw0aZum3dUsoQ+W+Jiidc7WdY2YYgSVFUeHx3sjut1uGSEUGYG4Wddv355Op9Om6WOEBCRERMYiYkoOKbqQgDDKJCB1FmnCoiwHIjNwkCJm3CiVWz3yzgyHhxCC0d67mnPNOadEZgXvus7ZFKONMcZAEvKYkvex63ol84TJGk8pm81m2oTdrh5NJ9YFRCqEKstKZiqlGEKQSgwHG++ccy4EP+zGy/OzGAJFIoTgBFNKCGCNOTs701oPB1REQhEpMkTKskxkmZjM5kVVWWtDikRKJtiYYlFmijPddzHEkGyWyeOT/e0Kjw9vffc7P9ifHpIkBC0ZY5Rk0baZmrzz6Dsnt48m8+pys3zx+ul2uz69vLxYvE4JGWMyhwpo0y1fvKT7e8cx4qiaTyYzq91ytYvAts0uyzIuhcqLyXgSIjx/9bLKS6vNZrMTKrMu5EU1mc0oFyd376iyUFVxdnZ2sH9Y1+14PJ2M96RaEmSTyezFq5dFSbKszMoRAg0hEGQXix0AhOAuFxdn528AY5aJ4MzgN0cJEEII8gG9RMRrFkmSUjobTk/PF4vFblvPJpOU0upys7rcSCEA3BDAuFwu8zz33htjrQ3ORUYDgNlt+zxXlDAEBwk5T8OIfbFY9H0/bBCDAXCWFdMpa9t+8G01xiCK6XRaFEXbNcYxAMhzOZ9WZZGPJ0WmeN+3IQROoCoKyYU2oSiK2WxmXXAQEUiru1FIVutPPv10Mhndv3/30y8+b9uecR4SYUJ11qGLHqKNKDhzxiyWq6+efHP//u2TowPGSFbkkeB0OieEWN0jkzE4zvl21yuZO2tvZFEAYIyhlFIgA5G+rmsEaJompUSZuPEvMs6ajfXeGWPyXCFJ4+mIS6Ztv1xdaNvJjDvtOOfMs+BsjJ4ChmBijFQQSplx1gZLUrrc1J9++XUxqn733UckkuDi9z78TjGqhMw+//rrtl5zSkI0hKayLLj3CVgC0nX9kER6w7QYsF8AGDwWh91naBcGRYNERM4Q6eCyzAnlhAJAcJFnnHMGGCEGRrjiueJZVYkYQWudInIhy3JEkDkbml1LgMwm0xDC6nxBCBllBT8gkrn9w1m3Ax9joQzEKCXpTaRUywkUGR+PueQhpfb09Tc/g6599HA2m00mE0Q0WTadzB89uvNP/+h3/+2f/T8JaRIEn5hE5hMhTEipqpyXZTk0bUMnNFxaaxn5YBQ9/EhKOZ5UecF9sINJToyREEoI44IGP8DLCckQmEYAIgAghYRgvYuQCKW7ul4sV4QQH4IPIcQEBNPgKk0wkRi8i4wFQmKEAAmBIqWMsRgFxJBi0ta/fHVqtNubTZSSH33x1cVmlyhBwgGSFBQIdcYPrZ5zDlJSKjs43AOAzWbTNe1vlepvl/xvf/1b1f3b04q/p/b/Pc/wd13fRhRSuoq9HJqDmwuvZ3Y+QjDWQQwUR7KQXCKNHhxSiBhTCkgQJef0yhZsExAoIQicMpmxIisYEyRSiqwqp7qzv/z5r9bLTQzkYHrQddo7DJ6sVw0ASJkXxcA9lE3TrFarrmvLshyPR1mmfLBNu47JEEI455TwQeYXQhxMMq6EQpB8iJTwIQxiyFaAlIK3iCkFo/u61/WoVIwiIuZZFmPEiASZlDIGJMi5JBRoW2uKyfRWKdKZxjvHOS2qnKhCRzDamqhT4xAxeM+FIIjGmLar27atJlVwjnBmg3fWIkUpJY9Dai8iA56pssjceMQAMynqurbGDHi+c2E2PTg4Orx3797BjHdNiyk1JzvdtNvNKgFbrZvT0zdNZ1wg3gSMDBlYl0iiWam4UJxL58F6TxJQmwhD3VtCCCMAQCmRnAMhBGJiSmy328Vqsd1uIaaiqMbjcZ7nlMre9sYYTphSKqXUtm3TNJPxrCgKFxNCHSIqlRvrB9Xx0NUVoyrGQe0cnHMo2RACGwchKwJlTCk10GJ6YykgpGDtle1QoiSGcBNSHmOkgCQBM7afTKdVVdhga92VoyqG9Ozli6ZpHj28f/j4/nF21O920eu8Uj/4wfdXF31VVQf7Vd0um5oKKghk9Ua39W632a63y129vn33aDwrHz24b/3JbLkYj8uYvLdGKUVRfPPkeV+bly9fvvPog9/78e8fHRx//vnnL1+8WS4vf/rTn/7uD//o1mg83d+jQF+fnT55/vzh/fsUWGfdrms9pnq7JUIkwd55593xfG+3200nrq5bre2XX3yd56ULfrXZfec7v/PZ5184f6F7y5UcZrRN0+x2O0JAKVFWxUiXfd/CkOERPSIiEIKcMUEpZYQhIoHgbCAEOefGmPV63dRtnud5nuvebjabvjdVMUopdV0XA2zqnfHOObetW+MCIvERownbuqdcMg82aBkD4cw417ZtCEAYy6sykT6k1PRdSGit41xyJSNC3/c2+FyWqshFJlcrQymdzcazacUolHk2HZcmE5vNyjuLhMYY63obQihHle7tuu4ghV3b3Fd3ijJbfHH+5JtnCeHVm7dSZPcePPjm2SsmfCQphASR+hABIBGKlO+a9uunz44O9zlnBwd7Qx0dBiKCsWGedyOYhmvsdGgUOOck4ZWSzVpIaeDZHhweU8oRwTlnbK+13m43db2tRsV0Op1MRtvt5vJyGaIryswHu9lsZvszpRSlNPkYY4gAiRBKqRRKN22KaZQX1uxOzy+/fvLsbl7sHeyTRO/euXN4dORTvLhcvj59i1wa0wEyzqXxEIJLwIzRAPSGQnGDGKeU+r7H65gluN614XqKPKCYDMmgJnfWAkBZjkZl4YMLwYXglGAUaIqUoEjRdV3XNRoiEUK0dUuQx+jnkzkA1KudEvL2rbtaa3Bv/uDHH7778EBm6vjWUUQYj8dt31x1Vwm8sSEEvCKpGONd3dVZLrMsg+hSsLcO53/yx3+gdXd+uV3XHbKMyjwCjUgYl4rGYQZ0eXl5fn4+sJbgipQXlRLDT+vaeW9DcJtNu1qtdvWmTKXRjhCSZfm1OdV1r4AImAgQAHC+zwthjHHOwJVFjBsGTCklQIMkAF6BN4AspRRjCIGEkCICwcg5x+HtACSKMgQf0vli2TRNVVUBicgLa512IbioVE4pr5vGhyCEFIXgnB8dHRyeHHZd56IbkO1vv7PDf29IiL81cfgt5OAfrP2/9fCbz0m8Tgb/m13C3/oMIYSY0jDIiDFGn4ZTnSrGEYIJkTprvGCJc0Y5QUJhCP9ExMHJgyRIPoZhFIqIw6SpLMq8kFRNx3u7TfvqxZvkozNeySIGUuTjTEwZirM3S2PMdDbO5SgEf3iwzwg/ffPWWVMWGSHgPY9Jaq0ROACUeTEajYwxFxfLvu85oxRJjI4Rgsi89wQTZySl1HZdVVWAiVIsMmUZcoEE/Geffvz551++efUKkQoqIZH5dHT79p0f/uDxBx/+IAXf7to3z5939S54n2WuGk0QE2IiAkXOQ0wkGg9eRBauUmPAe9913XK1cCFIJZCCyBQhQDk7OjqYTaYxRiqMMcboLhjrvQeMkNAHpzLprKmqijDKGJtO5+PRNEVsOq9kZU0/quZlPnr88L0EAUJcb3vGirKQJpiEAIRCcpAYGSjwEYBQITklCoE7mxiVhBBGMKIPIQxMnZgCGaxfmUSgTdfUjV6vtkKI6XRGABljCanurda6aZqu6ziTiDQCSWmIkjKEsslktms6Sg0hhFEhhJAiY8xxzusUUvDEg3V2YJEzxiLnjDE36FoJZZRlQqaUMEHd64BsqImYUkgBEQlQNptNmq7Zterw6GQ0myeEXd0wKUNTf/HVl6/fPD863JuOKiXpuCqn49H+fH+9Xi8uX/bdVoisVCMhpNHOeUNZBAwXizd1tyhHWWfb9fpyZ9zh0f577z5ab1bb9ca5ruvr3a4f5QdFUVXltG70029eXq5Xs+lYSsmVJJz1RvetXlwu277rtNXtpuu1cZ4xtql3PsVE2bsffJgQzs7OOJfPn7+klH7x1ZM8z6ezvbfn548fv/tv/s2/29XtYrFI5MqK3BhTN32WZbfvHB/u7/lgY3RScYZQliUiUmRkmD4RjkARKGfBmpZSmmWZ995ZTymdTCZOu67r6rqOEfI8DyEMhXDgjQ/Ye0qJMQ5AnHXO+pQwRhg4qFJaY8xicZESGXLGBmRsKE7ee6XyocreQJpSSiE4IQkg7u9Nc8X6ZgcxMIqoBOdc6zom2rXdYrHwkaisvHlVdV1zLvb3pk+esPV2c7FYNG2b5eWtO3eev3yLSDgnCZLzBijzwRNEoVTX919//c1klAtJZ7NJCL8xKlZKIdbXKkfunbvCX65h/K7rOGGDyfHgspBl2dBDpJSGnMbBNpgxKgSTikvJjdGnp6uizAghs9lktVrtdrv5fDokTqHFMJigMmq0SSLzMVLErMgRTNv358vL1Wp9//6DMs8lU9aYRvdtWy+Xy7yq2qahXAVkbatjIozLm9eTrnOhbjgKA8YwKCEH6ddVqfbee297G6xjUgkhUoy9i3me783ms9nEWG1MH5wBAELobttqbXTv6l1njQkhlWXZ92Y8Hre7djKZVUXpjJ+Oxvfu3bu4uLDd6vvfe+TC/axQ84P9TrdSyuVqMRqNCCHRhxCSYFwwpnvb1HVIWdd1u90OALw1KcS8LIpSUQIIgUCSgvFcRaQuIBIWfOccaq03m/VyuRhskaSUu902pZRlinPmveu6NoSw2ax39WqxWBoDeT4gXinG1Pcmy7LfRtpJQkhtZybT0oegbT/MN3ujkRKVSyAJTAJMKYUUYwJI6PGmtF7PCAghjInoYiBOCFFlKsVgdRcSREhHxydCri4Xq6Zep0QUQc45RYqMVFVVVWVW5IeH+8Wo2O7WF4vFbxX+m0bh72oI/laE4B/TLtz0kf9IXOG3rkE4j9ehXNduh3FcTUIiBKKL0VgvvWeJcMYpg5QGp2HghEJKzjnvHKUckQJEIYSUMs/z8Xhcqmoymj998uKjjz5hTBBkzqbzt+d37twbj/YopadvL3Z1O5nMgg9N2486k+flQO/o+75ta2P7PFeMMQCWUqKUDkNDxDTMra7NywEg3nB6Bldmxkjf9yk4PhmNJ9XJyck777zz+aefvXn7arvdVnnlGIGInIv9/f0I1LrAEEPAzXbXbrdKcillniu6JdrrTpuoREAWSAgxUSqS98M+GX24ziWxKpMxhr5pe9szxrJMcs6ttY3xhBBGqcxzzGIKwfd6gOX7vq+qath1vQvr9ebs7Jyi3pvNdNcXKhuX5Yfvfddbs75cKFns7x8FiLu2MdECoyYApai1ZowjEUwUXEgmcoLCByjLnBFKCEAMlABFcBZiJM77PM/lLTkaTZbL5cXFxWqz1p1erdYHBwcHe4cppYvl4vJy7Y1ljC0WC0IY5ZIQal2IkVSj8Xy+/22TPe+i9354NwY0Yig6jDGCEABTjFVVYUzJ+uB8tME5F5yPMbp0NfySnNMre1smuGCS0mw2G0/GwXa7pismo1snh3v707fnb7/55puuaz758ivByN27t/f3Zn2KE9sBwHvvv/v0+bP16vSZ1iFFJllVVREiLd1qfXr6zelsb763t1e33cHB7VxkT7542vVbb3WMcX9WUpdGhTycVYUgzboR3s1ldnu2/917j/Zn0+dffz0aTabTaTkeMcGWm+W4mowyuVgtqnL8ox98/4vPv3z9/Nn5/YdN0/SL9ZvV6i///M/btp/NZtM79+8/3D8ppm65ffrRZ1RIQujpYlFUWaf1bG8+k5W3dvv2Qng3nZVSUiUwzxUSn2flbtdUxdTaOCpy54I1vu91VY3yPD8/P6eUEkZfvHp5eHh4dHT09NWzSCEv5KpdUUrVWPWxL2CqTWha02sfE0XCfEhta7i0vXaEihASILGWORet5dNJtd1uQ0gDSVXrLkbPuLC2RyQAJM/zFLFrvdENYyzaPnh7aZoVBK97ONh7dHT70bv3356dLi7Xb96e/uqLT1yCRBhh7PLysl41XDCWeL3p3n/0HomSpvz44MGb16uuiW/fXE4mB3UfY4jRaSol+o5z7q1FRM75+cXFT3/+a0bFeDKfzSa/+uXHr56+4ihcYwrCS8ZC4HXdlnnhbBjNJ6vVChGVUuPxGEIkBAc/oiK76nsIi8butNYhJKUypVTw4B32fZupUb1rynL85OtnSubL5dK5EER3Ub8pimLQ7zVNQxEFZxi9bzeCJO/9cu2yrOBl9vKi+/XnnxTT8Xw0e/P8TVUU+/PZHsqPX59N78bS18d3914vtl3TbzXk1UEiGVc1AFoTrDGMsVwWQ5fj/VAXIw4BH0gZEYIJ8AkAiMykGPKpKRNsOhdcUJELprgJtndX/oa2N0AWXIi27SaTPIZidbkLHiejSQxwdHKyWC3enD+vRlmTzp9dbN9//91q7/u67KbjimI0sIiod42ucg5haT2ECDGh8RQCiRTShNSXF1FED6Rva2Sc9Fx0hcqq6Z3jN3XdbjYUc0G87TrnXFaUjd+AI8bYiE7lMqTofTDGC17EEC7OVvSYxxhJhOOjk/M3p5eXl/uTvbbvdesQGRfERkQuto1WQnDKUoIUhgDRRBJIKkzjlch11zDGVKba9UYABEgEgFFqtPMxIRWDxyLS6JwjSDklQesIhmdKUAgYOGcpxt4aSqmOYKyTyLJSqVgK12fRWGtN7IzuUCBDRGKPjvcePXhojPnkk0+++eZZNI6JjBAyuAIP/vmUAeVUCNa0PaUQHDCORVnudnVMAIlnZUUJRucZQrAuRa+UNLEHgIQkAkQC8WroAuj+kyyJmxbkt9qFm/4jQEREhG/1JVdmnYkzxgilgAjIkBIg6ELbbbMs44JTAIjIUBWypIIRhsgHLmhCTD552/dt8iWW1tosU5DSreO7pusZ8Ezm56dnzXa3Wp6tFu3hwUG9qZvOhjQPrje9p5gghNPXb7ig3tvn3zx7e/pG645EHi1KlmNk0QIAz9UkhLBb6uXbJ865EByJzDqPXnPOMUBKXlLCOcMUESEQQrhUQC8XyyIno8PDSXFYyDknVSbGBwe5dY4yNpqMV/3y3//k302zo2Zj7h7PP/vo169ffCUErXty74N35N7e9myxDbRxtLuoBePMO73dXRQtpRQpuuC2y633nnKecV6Vo7ZtE6TD6YRSarZ+ZbfT6VRJo7W2AXyCEJ3kIgleNztOmRqVAQIFQiC9ffPSGEMAVHHyH//iLx4+uP1Pfvyd/ePDdbNqdnXX6c7GB4++r8pquVk3Zsdz7qLZ1hsXR4iotXYuUAqma2OssyyLDtzwkUgkRkhEImcYI7MhhURTKnLFDotCTVflerfbrZaXX3z69At4OipKpXJIVMkqz3M6Ohgo4c7aGPo8U0WRa91mkvjAE0Lbbb58snPBFqNqf3+fuDwiSCmRUa01Y5RJHr0FyeW4DJBM1zNIFa2sNl3bEgxKFQDgtCEk5XmOiEZr9qMf/ejw8HBbN7/46FevXr3yL0Jr7Ga3vXXruO/7LMsEo4hpyAkNIdx791FRFBfL5dM3r549e9Z1XVGVf/RHf/SjH/+TvCw++uijt28W9+6865x78c2plPKr+rPZtCI0Eeqn09Hh/j5J7GxvtVv155dP+dM4Lsf7d/Jaq9adf/Hsp5+/fNK1ejQazafzV6+/QR4Q42Jxdnh4dHCw1zQdAJycnPzlX/5l13WbzebXn3z63e9+93f/4A9//ctfvXl7ORpPV6sVZWy3242K/O1i5TxUBUnRM0zdblPyygfbdW6zQUqhGsmYvLV6Op3GCIQMg5lhaA1KKUCx2WwuLpZd1+V57n0UQpXlaLutu04P8QoAhBAmxHBCtSH4gfY/4AQxeu9TvWuV2l0zyIK9AqvLGOFKWnadSBQjpIhU0JTgCqBFTCk4F51z0fbBeYs6eMMRskzt7c/m86nKZaf1an1pjLnc7h6//6EsytXlZsBCBu5rnudFUSilJpMJY8y7MLj2GmPikGmmMogmeG+cKzJVTSqpeNO1v/r4I5ln40n181/9+vxyVY1HfW9UUQJhQwuPCQbHYgAYwnsopQB4/QXANUnQx5ugxcH2FBGpUmokSyllXe8GZ7c8z7qus05TwrTWA+JdFEXf9wNKYUyQkgziabhW4Xvvn789xZ/+bD6ZC8Ie3LuXl9XRyfHJyYE2Rgp+sLdPeIl0S1c9cmYteI+ccyk5HWSsfEh5iaOqiDEbmNIpJcmoEIQx0N2Gc84ko5QgJko9Y4RSSmjou/O+O63rum1bRFSZ5Jx/7zuP2rbfrVsCtChKCkLKTAgZgr9crwA9YFheXpZVdjCqrA8ffvhhmRfBma6pfQqDlzNQoo0BAEBKGQdCfEjGWOtcUZRaa2Ostl2M4ANQUjO+BUomk0nb99rq2AAi9dGtVsvJ/sQ555wfToFSRiGAIgs+UUIAYG9vj1Kqx5UQouvaoG3wHkOkmBBITCl675zL8zJY35qeEZ4pRQl3xui+H1VV13XBuRCSEEwI4VyIEfKytNYOfCvGKCHEW9v3/d5kjJiGNBbGCALEEIzuhGAxRmtdSkEIcTP2GlOWCVlmucttSslqE1yECJRdZWAywW+IFyrLI6QYfQwxpTicgAEgxdh3PUQgjFCJzoXNugaA2Xzc9o6T0LZtcJ4RqgRLMRrT/11IwP8E/ODbncTfz4TAK3cvB5FRSqWUSikhFOHIBL1qFFJMGCESQgxEpIKPx0VZ5sF5RrlD633s+76u26+++mq3bYUgxpiiqKZTZa398ssvZ7PZ8G8ppapRsd2uLy7OdtvaOkMIMJZJkQ0zEcbYZr2NKVzlFABQSoW4Co1E9MOvUXpl7kkI8T7p3iopDw+P5+NJ8okiW19unA0pIqMCkKaUQkiEMKXydx48+ODD9988/yrLJAAwxibzWQrh888/f/7s5W7bECYJo8OWyTlPiINngzFm2BkGnHLge91QjuAa7IkxckKHWVjfdV3X9G3Xdb3uujLLq6oiBOp6t9lsYoxKKbe8mFXF8XzabVdPm/XhwSyEsN203tjdptYmdF3vEhJBGM+qkr453w2GZogIgABXbO50HbEG8JusSABggt6AAYP+a9ioddc754YdlTEySJoZIzkVVzc/BAwhBm97HWMkjHIkIcauaSKAzBRHEp2XJYuQKCAgMiTReZPSoP0Oxg6NrQ8eY1JSFnneBzMajQRlw6QjxhhDsNayUVm9ffv2Z7/45ceffuJD4rkyLoQYttuts1YyCgPozblzrm2aT18+effdd5+evjAYu+hqZydZ/u6H30OWMV7cvf14XB1NJpPVavXJR5+uVqt1fL7ZraSi00kB6Le7peTy4KiC6HfN2fPX7Xy+39luY0/X68vzRmT8NgCsm3y1G/d2fXg0kyI7fX1WNyvOGUW6XF7cu/egKsqLiwshxNny8mRXP3r83sHRyX/4sz87X1xY7/70T//0Fz/9KaPkeH/SW1NW1duzi1HGyqqiWBUpSylmGRdCCKGCd3Vdv359mlIiyB4+fEcIxZlbr7eI+OjRo+fPn19cXAxvoXMuy7LJZPL8+XPn3BDkc83cvhrJhxBTAkLo9aeBEALWur4zeW7yPE8JrfWc87IctfUOEiIQRDrMJuKVeedQ/PCKmwQQQvTeC8IIR2910zSKIUCM0e/qTUwpJq91pzJhLgwArNfri4ul4FlRFEllAz1tAAzH47HW2hrHpLhitMHVnH7VdNPxaDyf5EoKSoAk1/ht3//kpz+bTEfniwUwWU33XNyUk1lKSQh9sxSHz3oIQQjhnEMkg9v/AN0Pz08SDmMg769m/5nK8jyvRgUArNerlFKeF4eHB23b9rpVeTnM0Qc3J631brcbNqOBvgtX8QpXgTqbXf/50+cHe+39k9tEyNFsigyObp08ffY1l6JUsusDT4l4R9FDIkAzihhTpIhCiKqqKIHpZHL6+lVZ5eOqGtIdGSfDu78vi+l0Op2NCSEDZ3Nvb29vbzagHbvdtm3zwYtm2Nnfvj4vy3J/sseYsC6u+7VzQSl/dHJ8evoGCBrjLzerozvf+S/++X/1wYfvffnFv4YIJKWEhHOOKViLEZJQcugZkDLCOPrkYvDeI5JBLoVIEqTgQ+/bFLXKi8lsbL27WK4TpKLMVQjbbd22rdZmt2uaTdN1OoQIiVASjHaMUiFYSmk8ro4O5iGErmtbtiEpEYRMSKDEhKiNSwkzKYnKh1i1Xd2mhEVR7B0cdbutt05KqUSGQINHSCwC0703zlsbUwJKKaeUK04I4SQGCN6FFN3Q8Dmnr4lUabjDw0dr+PwMlhuM0DIvKJJuMF/3iVLadO2zZ8+UUsfHx+PphDDqguecDpySAUQlVzbJMSWABHmWee9jCEOUDmfUt9vxvBztjaIPSuUUcLvdda1OBBMOQMJ1FU+/+foffw0dz9/aH3y7S8DryxttCFBKpRQMBx9HwAiCSSQQBw4oAQzBsoxzK4Uaj8dlWZpeU8rzvORcIlLv/du3p1rD3qxMEff3909Obp+fny8WC6WUtWa73RJCxpMKAOq69d5b4whFIQJiMCZo3aWUgv2NMyllZKjKlJIYI0EKcJVfgEgJYSmlQvIUIsREAOu63prV97/3O4yxt2/fXlxcSCkTgvfeOCulFJniFCiJn3/6Sd+sF4tFnonZ/v52U0MiEZExQTl3LnR9462NwQlGh25+MG4Z3t9rUNAPY8Rvl2qBXIfACJ/PZnE0Xq1WSxMwAaVMCKmUIohGOSn7EAJjbCZFWU5mGX399Zf1bv3hh++X5ejyYgNEnr050z72PkSKRDEUCCRtmraqKkqvzEgAgBA2qHggDbRCBCCUkkFERWJKKQ33kzHGimKgV3dNwxht27bIsqLMh48uIYQT7hA6Y4I1DBINwes+xtgbXeQVMuqNJpSW48msmhZFxbLMORdDTClRJDF5jEkJ6XVvYkJEQZmPITgPjOd5vlcdzGazLMvqur5cLAcvAEYFe/78+c9+9rOm677/vd8hXCzXKx+SKDLGSELIcwUpTiajIldnZ2/btr1sGoPxbHEupMonExPg1oOHsqjmeyevXrziJLt1tNf35v6t/aP5/V/96le/frGN3BU5M7pvd0vOiOJqf49st/XF2brvX5VlmZVZZCSfjyjFYDRjzMW2M4mIUM2zUT5OEEikMdjDg9tvXr6+ffv2e++/+4tf/OzevXs/+PEPPv38088///SP/uiP/uX/7l/qtvvko48zKR4+uPPRx78wWqtMvf/Og/v3bjVd23Ud8nGWZZwzypKUnDFaN9uutavLTdsaALA2QiLT6cxae3h43NTderXtO3P3zn3vfQyQqaIsRjEAZxIUEVyllLyLjgaPEdJVnBrA0CsMexzlnMcYvYsIlJKrQw/nHJETIiiNiBgDCT4lhgA4zIMBgLHEiAIAAB+jZyKTXEXJnW0VJ1kufdDn52+r8aiqsv39eaMNcmGtvbhYSCn7TscYEWCz2bRtK4RomzZeub91XElCiFLKOK+1Dgl2XTvb29s7OFSCe9uH5AlnAOn8cmVjunXvIfJTrgpVRhvSQJAeNk24Do0MIUyn0+FUPQiWhk7/N4xuRM55SjjgNzfj/+HhzjlELIpiWBu5VAMdlyTgXIzLymljjC0yRZAONr2MUs6uIpINbSAlWY1oljfWtMbGBMOdzJU4nM8zNe47v1v3xln0yUdOpaSEUsKVEJILRgBjUJKVSijFIIU8zw6P9meTKWPsuCzDzQA5+eEcNvSOg4psAB43m433XimlA9nfO9Raa23enl1sNrsYBlN3n+UyJJ8ITGAWEz59/rw3psoySQtCCAuOMrRWuxB8TGVZemOMs+A8Y4iIDDln0HbBWoDEhJQSKGUuNr2OfrOrOZNZWVTOORe4ZJIIwnBb6yEDeuhHQwjBe0hJcOWs9t6en58SmuT+njG6rrc0xYgJCGWCU8YFRCFE5uObt0sAUIpX1Xg6nUYftLZ126A1kILiglLaamOM8QkA6Wg8Heirxhire6s9gyTzPIReMgSA4ZRltYkxlmVpTT+QXoeRPQAMzj/O2KHRrKqqUJnOcudcSjj4Ctdts613B0eHKs9Ulllrg9cphRsm49DPM0IAIuGEEd53LaMwHld939frFQd4cGv6/e//cFRNUsKz8+XnX3715vVZ0+lv13sCECH+th/C/5vX30Vo+DbjgVICISZ/Jd8lAAjAKMUIiSAGBEQEQglmQkGWMqGKfMwojxwZVZzTlJI10ZpAkEkJUijO5eHh4Z07d5TMUNA8z+p6t91uEbEaFcMYNMuKKyZvujrAhIDeh1yWMQ7pjoNMbKCjAueSEIgxJgjDp2vYAxURlFMC6LSptztO2d5sv93ViitOOCJNkEJI3kUgwdkAyW3Wy0xymvL9+cwHd7R/cHj7wbIxb5bNrgsR0AWjraUIQ8rPsAYH2Gm4BteE4RUOLfsAoQNAplRT133dpMk0U1mZ5TvOCWHTUUYpdcYN+yGb7w8nnPt7e1WhJtOy22Q5dfdPDjNV+d6fL+uL5WK56wNlNJOeRBNdhJCNFKVs4GMRMlR3gERSGnbJwSr0hisD0bsUIcXfRNUPnc3e/kwq3nUdJ5RzPmyfiEiQ0RT74JOznFAKKTmLidi2Zwm5kixhAgjWJesZII+QEvbahhAIozRCSqCkNJQhAAFkUjJIve36vueE+hAoEmds3/dDgvwgamWFyqSU777//vd/+MNPPvv84nJ5eHg0mc96083n89G4bNuGM9L37Xa9rustGVd//fOfJZ8EV32rKeMffvBdRlXX9X1vUPDW6/PTi1ExIoS0W3P+WmeSqXm+qxuKYrQ36Xf61XZ15/Y7Auq3pxfr9W7XdPkoQyq6vie+YVFEH0KMzgVvoxTZZDbutr3Msr6v+76zun/w4N7nn3x8ubh48P579fby5cuXT77+/A9///c//OBxU2/r3ebxu4+ODveRkF3bPH/2DRdqMp+99/jdfHKrLAulVIw+QUgpDI7L3zz9erfbee+Ndq9evV0uLwGgqqqvvvrq8vIyz/M7d+68fv06xnhj4TLg3kKIQUo3fDS9czFG53wMEGNKaTDmTIyxGMFaP8wjEDFF9C5SwhmVlAwYT/R+oC0P2FQc+tB0nT8UQrDGSy4GI6Mq5/P5eDwug7cJXJaLLOcphQ8++OCTz76u6/bw8Pjrr55orQlgCG673Y7H481q7b2fz+fBR0KIoDTLsgi6aRoXYlEULvim7xAzRJIXFSLuNluuVEJ2/96j7a4/Pz9HwlYXayllJkWMEWJyzm02GyEEAkwmk9evXw8MwUEXEP0VXNnp9uZEEoe8ZhsYY9bp4Q/Uptc6Q8Qr12TnBOcpJd31oFKZF66yl3YtuYhXqDyhhGCC4HwKsRjPOGX5aLxtu8+++IoBZAI3m42UclyN3nn0QOXjyfSga93zl8uu73VSjDEpFSVAKfFWt7pr641gZDat7t29czCflWWeKeGc67omBv7m9flqtRqNRicnJ4KL1XK3Wp1++eWXzrkhpCeEsN1uU0plWUZJEJ68ffsWEfOyYozNjvbKsvQxjMfj0/O3XddOp9N62/2r//u/5pz/L/7ke+PxmFIEiHlV5IWSclSWuQ8uAImJwmBmgwxioIlzIULUwVpvWUix732ng7FBawvUAhIhlPXter1GRCp4DAQSYYxlWYHInL1KOxskFJxT6wxAHI1GQrK9/cmqs8noNKC40XvvQ4yMkg8/fDA4THStXpy/1DpVOZtOp8e37j958hSCTcgBIqV08K8fRlQhhkyKUvEYHCJwErw2h0dHs9ksK3Ln3PNnL86XixQ9YhKCMCbctfUQUuJjGI3Gw2yIIA3sCv0ekl3LsizL0Xg8vlyvL5ZLFwMV3NgaCTJKU4AYIUbPCKeUJR+cMRZwMKF2xibnFceHt8Uf//jDP/jDHx8c3tI2ffzJF4vF+dnpBVz5SgEAgQSAcVB9/E+jLsLfxpS86Wa+zYsUnCMiYMIh5itGSrgUKkGkSIHQGAnESCiXnBEiJDJGsxC8FDmjEgHevHm9vlxdLlaUciEUIs5me0rlRtvRaCTLbBiuZVkmhLjyXGeCsUApBwiUcsEVJULwDABSGPBOdQ2XxpRS8DHRlBIZcs4AIEWERADANN1oNOKMiZwqLk4OjxQXf/Xxx5lSQogAyVprnUNCWt33ff+z7ebs9dOj/eni/I239vLy8vXrt6P5MRkmhDLzgAoI51RwJihZXG6uoEpChk342vmY4JVAyd9ospxzUglJBCM8uNjYWte9pHJvsickSyFaa7UeHCev8q52mwWjk7vVwXc+eGxMf3S43/UOETGmrtPtrhHlSOTMx2D6zjiNgoSQrnUYQJBRMrjXJ0Ry0x8CJELw24oqAhQRYozeW+89Y6yqijxXBIbSMERwISVccLLbAiZPCYUUnLOUcs6ItRYoETJzISwXiwFomeGRlNIBxhCllC7GtmujdeOi7Da7LqY4AJUpWWs77JKx1nohRHBea+2MdzYEFxjn/PbxydHBIcSICd558PD2vfshxuVmub+3Rwi8fP68aXe279brdZZJiMTu+vl8v21b2/WT0YQjOX/99q+ev7h/5z4Htms1xdR1jTFmPp38b/70f//Rx784Odr78H/2Lybj7OzNm88+/XR/72hv/+TH3z3srP/1J5/+6pNfn52uCUuJwMnBiHNurRdZQaw3utHWlLKMGE9uH3/28WdScmO7sHMnt46ePXu2/sn5fD7/nQ8eeR+b7eVHlwvd72bT0Z1bJ7du3fr5L34RAFWWiZy/OT17c3b+z//Lu4MwYQgrA4yE8PF49nu/+4dd181ms6qqdrudc/bP//zPjdFvXr/WWpflaDyePnv2IkYQQjRN51xICQdYabAaQqTeuxivEnUZEzF6AAAESqNzfpgmhJAACGMcAFKKlApKPSGDGi2khEJcpZJf7RfkKsh1KJw2OmttwOCcixGRABeUMeZDoBRHo2q+N338+PHZxfr12SKGNGQYQkxFkYUQHj16tLxYcM6Pjo6MtlTwmJBzjtrgkBaslGBcyZwx3m430XtGaZ6XnNAYozFBsmy5WI9Gk+iAZzIEj4gxRe+91noQkZZlyTkP1qVrwyUXBiJuGpIUYoyEsJTAGJOiJoTEVN5oFFNKQ4BelmUxRillSslZH0LI83w+n1PKr+YyiJTSGKOzYVhLSo44Y86m9WrTbTa+bY8OpoSQ+XzOGEFMVVWMxyUh4IMhNGaCUxad7XV0meDZqBzNJ3uTUgp2dDC/d/v24f48pbC4uHj+/On5+fnmEvq+J4TM53ZTe+fcbrfrO/PmzQoAssw3HQkh9L0TQlDOx3sVAIAQ291u23YxRm3taFweHBwcHRwSSGdnZxjTdr1dr9fj8fi//7/9+Xx/VlXVaFrdunOyf8DykjkfhcgApZIMEa9ygbwNxjJRpgBdZ/uuMca0ujfWp5SYVF3bp5QoF86m1XbnnFMyd5YgopRZoUqCg16aUyRv3r7q2248rooyPzk5Orl11DS7lPxITrqu64221u7aXbvtXPBCsOXiNQBITidlfv/k3p1bt3/wgx9858MP/uo//FXTrN6eLmIglDBV5r3zztttvdGmowiTcVlkKjhvdG86Ox8X7zy68+jR4/l83nStt+b84qJva6TUMfQuGh8YY0gISzyEYLVp23ZIrwYAa4y9jv30KfoYt3Xd9/1utzPOur6nLBGCZMidjgkTSTDkaAIAYkxVViAEimkynzx+950/en/04NG9vUooGmyyut/Vu+12twVCI8JvIQh/S8zDP3TdiGu+3RncfP+3OglEdMZESCH4YXUARgAIYcwEzQjjnBNCrfcYkTCklHOgiCy4OBqPKMXdevPJx188++apNcYbDwm9j4SQ3W6329Z5nsOGDKrCqqrKsuy7frFYWqc55yEk50LfG++vFi+l1GoDv8FCbhIOr5DzoRQyxijljAmASAIGG+pNnUuV5/k7Dx/vNvXHH306RARLKWMAIVQ1mfR93xtNku/a7Xt//E9Ct52Nyvl8nmdlDOBDyIvRwRG3Pm7rTd8hRNcZPQwcb6RJ5DqcZTiXD1vNcGOHKPnkfM7V4f5hkeebzYYiu3VyUhRF27aDOuPVq1cvX75s21opVRRFKKiNgUoh1Mit3cXqcrNu1ut1IpRznmWZyDLOlbdd8sFbB1cBCmwYZA+3AuDKa/wmUx4SSTHCVTdyNRlJEEPwzjnrtLWaEOCcYsIYkZArQRBnPCUmBAsQIvjBPkEpBYjBuxA4YyxF1J3pur7p+5E2s9GYArYhZVwywI1ZN73OTw5JAquN1RpiiCEM8eJ5roZDFwAIIRghknPnHHvy9deTySQTMsb43e9+l3K22tUvXr6UgscY1+v1m5evEoSiyGaT6cHBnrHw3t1Hd27f++bJk49+/TGN8JP/8S8IYc74aVFlQl6uzjeXm4ODg0cPH4/H4ydfv9peXM4KtT+aFpn46PXPvvnsyfiHMxjBSE1uHe9RWvpIvn7xjfEdMpIVvCpKa21VjCSTm2KDHqzxk/GMUlpWlW761Xq5Xl4i0PV6GW29WbypqurenfsP75385Cd/HXxM3v3Ff/zz3/u93/vym6dcKO3D6cXSOCdU9q/+1X8/GIOQ6+BgSpFzPp/PrdOPHj26f/9uVVVFsS+EOD099T4QQoez/maz9T6kBBcXC2ud92Gg7BFyNUYNIQ6h4wP3JMbBgCgSQoZQPinVML4iV3lCiMgQ6IAueO8DS1KEGIASQoZllyCCDzEARsoQI8YIhCTAGKLr+7braoJpOp9FII/eecCzwkU/n88PD4+NtsfHx1muTK+n07G19uTkhBDSdV3XddZaxdnweoYJnxQSfUwhKMYLodqYggvjYjwpxpvNxmrz6a8+vnf/4WQ0F1zN7hxwLjqzTik5c0UdGv5S731RFF1sBij+ZmdMKQ0khhBCjDBIgYNPhBDv1c0hAACKosiyrCzLZCNFkiABpcE53XWc8/3ZvOu64Rw5bHMphCzLxuOxECQ412uDESjQs7ML9ProaFKN1OX64uzsDJnc1Jv19rLTNRMFZ4lg8N6mEFjG92bj48OjPJOZ4Jv16puvv/7y00903282K9P1iHheJ855kamt7V8+ubi4uNDaSilHoxEiBSEMQkCIggfONODi5av9/X01GlGpjO3bXe2i1dacn59jDLPxpFTZdrsNrTFE1Iu1yuYYw3a1K9beOXVx0fW299E9fHifUcoJhZictU4bb0MIwSId9GAhBBeDdQ4ACGdSpc1mo63J85xJIUUek7beZ2rEmVBKZSKTUiqVD8Z8Dx7eWy0XRZkb0yOm7Xa9XC52u93s6LC0NgRvg9/tNtV2DRiLIleC9F2TCf7OgwcP798t8yJ6u3zz5b07R7NRtlqBB/ApIIlcYEKopsUUCyk4g7DbrprtjlOYTco/+sM/eO+99w6Pj7IsW22208lISUxAxtN5SrDZbb23QzINpRhCqLe762SQgkvhnLPGJHCMsc1iJ8V6IDPOZrN3RuMnT56Q1AGkMGiNCMFIU0LvIkWiiMyktK4bj7L33n9069bJvTu3Hs82k7FE364X3fPXi08//uWbV8+cB3aduPn/2bThN+SDm7bgb6okbiQSiDiwniGmNqW+7y83l6vNejSZVOPRfH823ZtTxiikCECGOA5kMRBrPKUieNc03enp+du3Z7nKkh+i59N6vW5pmyIgUh27wfF3NBqFEAa9ft/3x8fHnLkhYKuzuuu6QcgD6So7g1xfV1Z1lA4FjxAiJFdKDYJJlWhKyfaGJeKtl0ycvTl12m63O8HE/v4BMJoV+dHJSd02y+WyDNuDvfm4KsfjMU3p0YNHdeefP3+5NbFLjHNlvG7bfrvdONvrbleo8Q1oP0C8Q0c1zKfgOrVrCDnrus7tH87nc4gpuOCtR4BBCU8IEUKlhEO6vfdeSsW5nBztIUld9Ahexxid37bdcrNuWq91JIRG79p625jW6Q5TQKCQyNC4DHYj6UqdeP0OD2OI37hr4dBG3Lz1KaUYI6UImGIKGAMicnF1bowYGWeRhpC8B2K9N87ITBlvCONIiU0hIcii4JkKMbpOs4TB2MvlcuI95TQYa/r+7avXg/Nm37YpeMG5ZNx73/cGANhgpA4QQgg2QkRmrT08PIwxvnz+ohhP6rZ5/uKVTzEkv9lsttv15eXlya2jvdn8YuHatjV1/NF3fnD//n29a7/mX1ZF+fbV66Ojk+1mc35+9sPv/04uxf/w+WeUpsePHz17/vWnv/4Eo6sy8eblU0g+6E4x0te7h3fvOGtWi+UoK370/R/ko+Ljzz9+/uo5xBElMgWAkk3G80wWzbZZnC5enb3+8rMv7t99sNmslJAAsayq73z4fuhWhBDngtXNann2q5//rJpMEanIqz/95//l/+H/+H+qZH777i2a5SGh9369vGyaJoSUZdlA1B8WwHK58t7udrtf/epXhMAPf/iD0Wj04Ycf/tt/8+cD3W84pgz37vLycoBDybXTOwAMszGC9Po78XpQd0VfUkqVZSmEgCGeeAjsCgSAxAhD/z4YLdznSk21AAEAAElEQVQwioffuVkJjDHfRUQUQhRFkWeEUhyIj5QiQTZQt/7s3/+PEeSwy+zt7SG58mkY+Erb7fbs7Ozly5fr1eaAH+WFHA761loulaBivdwo+ub2reNROeZjlJzrrmt2O92bp18/+/GPfv/OyZ2u7W/fudv3hnTOORd9uPGK2Ww26/U6y7KBjgtX4DAOm4tgou9751yMLiXw3qeIlNIB/0wpDkzAm98HitcGgmk4ExRFMZvuDSyHYWvbbrcp4XQ6PTw8rOt1r7tk/SSvcsaXpy9Xq9XJyYwQonWnbY8MheIBknZWUrHrV2VZFkWWCTkZj0ejkjL03n798tnl2UVTbwXjEP1ms9FdzzkPWbVereIyVlUlZVZMctrTlFJrWsZYJDFgIMiQk0RB+55l0qXYWSsl359UZVlGZ3e73dHB/ieffCI4P5jvzSbTD/7gP6OUfvP113/+V19dLhbrbgMAt+6ejmeVC857+/VXLxFTCtFqbdo+2IGBRfsUGWNFURSjajhYUEqZFJerer1et11XTcbHJ4fVaCKtbduWkquYK6113/eMdUqpTCrGiTGGcdp1nfeWQNRac0GXmy2lmOf5vJhM5yPvj4pS7c2ns0m5NxlVZb48e/uLv/6rb77+am8yffz4UZbdITRMx4UBXG0brRsiMqXEZrM6OTo8Otpzfbtbn3EG3/vw0R/8/u9/9zu/s7+/H2PsjeWUSMlHo5HKivfee2/XdC9evUqrjZSScZlSMqafVpOOsYG2xgi1AN57H1Jd163u2Vi43nddd/fB/e997/uP3n387/71fxddDDGmCIwwghQC+BgjhL3pBJLfNnqC+R/+3u/ff3BH6y71F5Jhngmz6xcXZy+eP93tfJVjH/6WDgHTb2MM//hG4ds9wd/sFW7+d6h2Q+XrW+23dnDoGzUTQkhRVCpnN79PKaXIQ4jGDNEG3lmfUlJKzefz7WoDQAiy1eUmE0op1bZ9oK4sy5RS17HBhHRoy4ZoKGsdIhpjYkwDHm61vqlncBWAcpX3xjkdGgXOrwhDMcagfZZl8+msqqr18jKEsFwuB/lSNRlPp1NgVOXZdDpNCJvNBnwcjcpdvQnOxgTHx8fd87efffbF1y/P8r2D8d5R7+zp+ak1LaMwpLwO/+JwDZqyG5bYcKtDCMaYuq4vLy9HQgHA0A00TRNjXC6XQ6I3E3RgQQ4bNeccEV+dX1jbh+RHlVKCKM42u+2XX3/VtYHwUsoRcd6mYIIlDEuh4rXpe4yRczlAGinBFe06YiI3OWQ4TGqGFzwgCjefhKIonLfG9DFGxgljFAC89y5YpCSk6KLjiUdIESMygpQopQhjXd9HBKmyEMJquym5bJvm4uz82ZNvZvt70+lk2EXfvHkFMTljnLEpegQgCbx1CJwQEm/C8EK8Kj2Ls8uP0xeHt25vWvPzzz+6WG93Xc9UhpSw8yYEJ7KJpflXr89c31ZV0V+m+7e/E3pjtv77j78Xg8P9uF2tDvPMb5bLl8/2D4//l3/yT7/48us3L54vF6vd8uw779w7ff7V5ZuvYtB929p+OyrYxemr0fSQCmaMk6AeHD8yjbN1aJafvbx8PRqNQF+a7VmeVU6j0zZYytmIYX60f6den+3vV3dO+Pv/+R/O2MWnn3z5059/st24n/yH5zTZZrM2Oty9e+fJV6/+V//8X/75X/3lL372y8Pjgx/++IdN0/zaktOLOsYolWo7z1AdHhxUZR5jLLMMMK7Xl31df/3Jkw+/8/7J3nEpaWBQlurzj34xrQpjTF9vgzG66wgAJhjahQF4jzFGaIWQhBBnIwBwLimlKcKoyqWorAGjGyHYeFJVVcUYI1L66OIu9KZDxLIomODaGiEEYRTIcMImlA3Iv5EKbOxsi8GnopgwdeDpyNuayLztahRYlEp3rTZ9oabV3uTe41uffvopQ7JdbRdvL/74D/5EiYphTlPWN0vThuOjWduaFV3PJlNtjav7XIq+qXdbOZuNQkq73u7WtfVcW5TZ4X/73/4//uk//ePt7nK9OM8LpQhvm52kHITquq5eb+eT2ddffPX48eO37RtK2XBzkNIIIKRcbNebtuvbfnBxts4SQMWV9T44xzmXouSs9IZuLnslpru+P7/YDQjN6enGW3f7diklUJQppXrXd50bl/t5nk9H00xUa7Mdl3PTdbtmB8GJInPRf/XN6z/8vd8t81uvv9lkbNWtd7dHVVfQ9XqD032WK1WU0YfJeBY9/uQvflrlhZISScElbfqu60znuENMLoFtBRUyk5iwXm+bpiGE5HlOCKTgTGct4hC5lBiLhGR0/Oarl++99x7n/Pz0LMYomLr/4P5sNHrn+EFw/evnz1fN69dffv7owb0P7t+vZvTly5fbnbhcbk9fnentKsurl6eXBEBlOVfSx6CdDcFdKcQg+AiMLbMiQ0o8xrwsptMpMux0F7wjfdc0TS5VxoWoqNUIETjheZ4Pu6dzhjGya3quMusTE0U5mgspC1LsdjtReK27VXPhkuIieadHbHb3zoO9+fRo/+DVqzcff/7lxVqX8/siH/Vx9k++96PVznz0yadnqxVRDXLhAS+Wi+ne2CedlVRK/sHv3H/84N6920fvPHx4+3A+n89jwuVyfXH+RjeNbfvQx1//7JOEJEWseOlDjMOEy/te2Wo6bk5Pt009poRxPp7P+t4UiHuMaW211kwKQsjBwcHJycmTTz9++/ZtDIZLbpxzwXKBKSXO2fn67d68KnJ663jv/r3bh/PZi2c7L4+2frJdwVffXPz1r1+8Ou9dAhekC5hwCOMBxITIkAASDDEmCEIIiMkYM+Defdcxzhm5PgwMHAtERBz0rt/GDOA/ZSfcEJKGh0hZ9n0fEwohFBdEkhDc6YvzvnH7swNOJAVmfEgEIqXaRSaScxaEvFjXjNDe4t7+3XbrJ+ODfusFZXvzeSbV2Zu3r1+9Pj46QplrbepGizkXE0oYl1wwQpWQlNLBO854a4MLMQQfOWPDkV2wYW5FCSEEcNBghxB0p30y0ANjIaUEpA6x8973l/XDh+9QRS/WS1UV5WS6t3dgTWwuG6MXH/31p5zLe/fu/Rd/8t7+/v52W2/6EEL86vWiNpGKbDYd50r1y/Om7seMs2wvABJF1rH2IQBSRrlLJLoYfUgplfmob1oABIfeBEg+9GF/vD+bjgglp29eVpMxkLTZbRPBXmvlVQGFM3673ZZZuTc/jjGen55NOBvl+9szzX354P33m1395mV/fhb29sYBCXCUmSAJbB9DgJAES6StuxQAKanr2jmf53kETEiBRMQr8xW4bgpZYpAgXhFxUnDR2mBt8sYDAoKiNEYfO+uu2KxUblvjel7mh5JzZ3eMYyYnKXQUqACmGHoXQq2BeSXE8+bZ+fkZE1z33ddffHH3wf3RaPRmsdyud5JxSIkiE0LlKqOIptfoImDyNrh0dcwb3m6WwHfdbrW+0AEQPGdYlJlQedO1hPAUsK3bV30HyUdvt9vd/fnDTrdSsOPbx85Mk7PeWyH4xcXFcr365vkzyiXlfDydFEXRdd39h/e0bndtXeasKkRRzjinzve7elVN9giJ1vSJ8aPDPcBH1vUvXy12u522hvWdC173jiSZwGeZ5JnIlezXSwxhPh4/uH337sktu9rev3u/7+KXX72u6/Dg3hRoSVN88fzJeDp9eP/Op599dMnp/Xu3M042tvPOSEG6ztfNRnFBFev62ppOCNa3uxBcAj+ZjA6P9gmBt29fv//++33fD8gVQBzyHlerZTma3MgCb0wVGWNa91cQHDIAMsj2UoRhyOfcwEWgWS6995wzH648swanigFOuOmL4VtesMN3dPSZlFQQ5+Nitfjm2TdSwWxStG0bkx+VOec4GuV20XZ9Xe8W5UyFENhgN+Z9CGEIcrw6f1AqhBiNRvv7+xGSCz4YF5MXgkjJo7dt2zqbUqIXFxfWxhjIZDKhlOa5MrZp2pZQGIwXh4Z3kHIM0zsAaNt2GG0OptdZlnXetm3bxmitHXqFYcLSti29Pmw1TXNxcaG1Pj09Tf8vuv6rybLsSg8Et95HX+lahI6MjEQKAIlCAVWoKhqbRdI4TbKtaTbWzbGxtumH+Rfzd3rGpruppnqKUxpVBSCRSC1Ce7hWV9+jtt7zsN0dARTplpYWEeYRfu8956y91rc+AchsNsMYB4uxwF2glDJCpJQAgKIodrd3iqKo6/ry8nK5XEacWqWMtZxgb4k1WirjEbx393631+l0Ov1+/3I8Ojg4TCJZWssxihldVNXx4X7EuGxrClGWpt57iH6d6RfGlIj/Oo0wCCDDQHMdowLhG/oOAAClGAAzujztdrtZQgGgRsuL88OLEzOfTHrdIqLkxz/6YbeTn5+cvHr1/B//6/8W/B5YLOq//bufTf7yo+VCISj6WcrjZDSZVm3jAUQYKusAAIyRKOHaGEwgIQQg6ENWCYQQ4DiOLSbee9Gq8FlprZ0lQRAYzP+8c945o3W30ynLMoxWEeeMsbqqqrKsRI0JsrpdTKeMwjTjSdTu7x/t7+0zxsp5ObqcSWWh9w0208Xy9elxJdu4k29n2UBbgImyJsuTxWJWZNnm6nq/kxQpvbOz1cuT1ZUhJkxIXdftcrmMomhnZ+f45PxyPK8WC4AwRARCaK+znRzwBoGsyMG1X3iapsO1Vcai4XDY6/cRIuPx+JunT9q2/fzzz2ezWdu2SpkgdQMAIASCgg4hFMVEax3H/P79+3meStl2Onk363gPXu4f/fKjzz755ItZ7SihjCeqEQAA5EPCQgATvPcAAuCMtdBcMZS9h9ATihFwb3IYbtCC0Dq82R/8F3978+uwVwriuPAohX6ivf5ywCujAYZXhiwIX8EPbcsIDXqcSZa1bWut7fQH9+7dS+PESBU4MYu2ChPIYrEIM7T3PkkSSmlYoYcqEVB9jDGD+Oa13YzCgWV51SgI4ZwzSoW9e29wtacPZo6c8/BBtW17eHjovaeUewestXnO8jydTBbOodHl+NWrfec9jYooSrJOUQwGK6ubVdO+ePFqOltoFyZ1T2IScAWlFAJQKaWltNaKpl0dDPM8Z4yVZdnUdbfb7ff7lDHvvbJGCAEQdBYwTj0ACBFGOKcRBhB6pJQkGGd5uj1IHz58KKU8Pjg8PDyMomh1be3OnYWH2AEICPUIeg8inkCMECWIkJs7IdAJpZTaWms9xOj68wTwmqrir91Ib4rMTad45XTu3c0RAwCYzuZpmhIKluU8CCIwxpPpKE1yhBDwEACIEBFCVVWDAGyA1FrzOAot3U2uEKUUQWTCy/PSGUsxNkoHJRq8dgi9aWrJP/7jP3AeSu1nZVmKqr2Y10JDyniStJWAEDDGquUcQc8JwZT2V7rHZ4cxZw5YD531xgFvrKOUVVV9cXm5s3t7c7iCGI+iqKzr1eHw+Oh1ksVNO59MjuKIJ3HqvG7asqnnlMdxhBSwTtVZSh89vC3MUSPFeHy5XC455918kKcdiikiPqEUOe21wt5ljA06nZxzMlxf6W2myVC2+JNPn0ipEfWjZj4Ybp4cvnz4+J3t9RXZLjYGHVEt6vl4Y63f76ZnZ2ez2YJRGHFodNsotbm2aq3VRgBnAUyMUZeXF1W93N661e93syzjPE7SlHP+8uXLtm2l0V5ZrayVwnuH8VV00E2Gr0fhqaUAgPDIOeeEEFK2lOIoZpxz56hWMlw2xliwE76pJmFfgK5N6cODwSIEsAMAEoKAt2W5qKrlxnq3aStKYb8/7A86Dx/edu5QNH65nI9GFxB6TGArhNKiFfVg0APAEYoYJwgDCH2axp1u7gGw3qllPRqfqVZjICfezmYziOjqylZ/0CuXYrmolBJStUmSGJvXddmK2l6HBQSwMWB9obWq6zq8uxuWIkaUEh4Sga/gOHsFyWBErPEIkrpqZ7PFYLBycTHywIXnLRzMLEROty1OkiiKer0eY2w4HCZJUpblaDQyRkDovbMEY0IJcFYp4ZU+v5jc+uHdIk+bpk2SuMjyYb/fLQqoWbfIunmiy8V0MsIQyaZVQlqrjTFKGSFlMEBllHpwNQkEiTZC6KblChUwPMz+Ok0KY7xcjCmBBNmdzUEU8Wo5d0YvF7NHD99q6/rOrR1v3cbGmtG6qqM1OJhP5ufn51GU/LM//uc//tEf/v3fffTZF19oLZbzWRzzGCBtnEcwY1cJfggBjDFGGEKMMIbIM8oJphY4SjiBRCnRNE25jFwKIITeGaVE21opr0AdALDWsiyNtTaKGKWkaar5XAkhOKfKEIxxq6SWltEoSzp1pX750Wfrq6ttK4AFWtu6lhAQyoCS9sunTy9Gl9JYHiV5lmBErbUU+1tba+trK9/7ztv9TppyksVMNWU5mcWdASVeCHl2MTk9Oa/qBhEGIRJKIUIIhpBgCKED3l6DtOFOa+q2aRrGWHC/0FrXde0caNs2IOebm5tpmh6/enXTat+cx97bqlJFFjFOtjbX3378Fo9oOZ9nedrrdZ98++yTj79+8nRPCBcxilhqrceYOu8BBle8IXC1UqSUNkYBZxCGGHrgDHDwv0hyvNqm/VfEDv+wpQhfNwXhpr8Jdx1445jBGAMMEUIOeKVUzDkAoG1bS0wWJ4PBoF5fX8znwWwgz/Otjc3paLy3t1eWZX910Ig2/LOB7e9hSFv2N5IBeB2GQilF9npXct1AO+e8ddZagq7gcXBtF4ExVsqEREBGoziOw4Mfatrl5TnGdDAYWOu1UcaYxWLx7fhyZ2enFWq5aFqhsuIsSbPZbLG9c+udd95mUUIY/eyLL5pGBGk15tQYE1S1CMAb6XKIq5VSMkLDi799+/ba2tp8ehYOQmV06JAIZxgSa+xsNnPaaKWcsfPxCEIIvB+QPsW+M+hPL0aj0YRQniTpw0ePq6Z1AEljylYgZzvdNMlSGvGT+Vlo6ewVJqRCexgahbDW8R6i68KO/K/bx7CzCOU07GG9995Z7z2A15RMWQNolZLOaYhRHHPOeQhF8x4YazGmjDEEmXcGEZKnbDabOee63S6h1DkXhOv9fh950DaNlsoqba1F1823fyMJ5aYjJ7u3txHCy6pJyrRs67Pzc0ggoRHEuFrOKKWrww1ZN84ZSqNOt8i78Yu9JwShJIqN0tB7gvCyKqVWiLJWqslynna6AMFFuTy5PDsQ7enx/rJaANuWoqYM9frdJI+sk2fnR4jQrd070rrDsxOh2n63+NEPfryzub2///rk5KhtKkpQGsUOgsWyVhYZTPpFjjtxP+/ElDmlraEI4Z3tOz/4PrWa1cKvb9ymUcHjrKplJ43/6Ce/++DBTpTEysjdrVWSred5vr9/8PXXX2tlESJlWQqhFss555QxBBGkFHHOkjSKEx4OsyDGBTBO0/Tu3bta65ev9wMuZ6wlhAUbgOAbSAj1Vx4aPkwV1lxd5muGi5NStm2rtVLSh94ihPFcwXqMhRIAr6MHQo3AGEcJklIppWLGszS7+VveeykkhL7XyR/ev31xPm6Z86A/rZs4jgNfwXtf1/VwOLTWpmmaZVk42kMJUFpDCCMOCfJZnq2uDpQW1XJ6OV5gSNK4T/EVC6Ft214v1yaum8UbbwoEJWS43efzecieDq8tSHK994CyYP0UgAdrrVHae08pJQgHE8ZgFvngwYP5fH52fhnHsbU2HAmM0PBeFCHr6+txHNd13bZtXddN02CMMY04Z9ZaBDzjDAAPpHBWvdw/vHXnLue8KsvD1/unZycrg8H29jZ6faGUUlUZIcgh0Foi6FtRai2dc8ZdNTeYBNAICdHeIHLhioR6HRqFUM1DeQ0YkndifaW/ujr8zuMHBLrTY7+zvTnsF7PJJM3iB/fuAwA+/fTT/+X/9f8MRfw//9nfxWmOEOn1hx988N0/+MmPdnd3v/7228+//NpY10phnCeUIkws8MBBo8N60yFrEcGEMEr5lan71UWJnHWhWPR6veWivAoBRyiKoiiKjNKiaeM4JoQkSUIxUUqJpoUQ5mkWVtQUs15vsDLsdrudo4PXX37xNPndrmwVpVwLt1i0aZpHcUpo/PrsuFzWWmvG6nCVCSGMkJV+cXd7o9/JuzFPY0aA94AAaxdlQ1jcCPXi+auPfvnJ+fll3WqpLKYUAuwgwAAABKEPJ7O7JjbiG7i+aRopdZIkrRBa23AclmX55MmTJ0+ecADANUvmpvBZa4EHCIE8T7e2NuKYaq0wgdbKv/rrn/3d3/3sFx99KQDodzoA8/G8VM4kSeGAd8B6j7y314e8jVlkFUQIUAwggMAjBDxwwbkBvXn2ewgB/AfCiX+QLvEP0YWbkzW02ghhQgiLo7DmQGGQxAhA6KxVRsNgj2GttI5AFEXR9vY2JWT/xauzs7Ozs7NbO7u7u7svXrwol8s4jq13V6x7751zxjmlVNM0ddtcrVOv9/2EENHW4bVheEW0ghCGLLrwgtG17WA4b0QjDbGc8yzGFDOCMMU05pG3AEFIMCQIGyWgd1K0+6/31hKwvU1XVwa3bjdnlxdKO13VrVBCSURJp9fd2N4UWiptQr5l6X0YzBBCYV0SPvRu0eGEvn79ut/tDYfDtml2dnYC4BHHMeccIqKdJoTnSYEpZYRcXl7MqrnVBjhjtcIQcs56xa5q60G3e+/u7aZpvvn2eSNlXvTrVkJCqlacnZ8v6ibs+3gS44JeQcL+N3LyjDEI4BvkwN/0Ug7e3MlhIrLOAACsMQFRgM4656zT16w4MBpdzOdLyjBjNJiIMMaaWngPVKsQ0hBgrbUxLo2j88mJbAV1XGvNOHcQQAjzPI+iCHlACdFStb5+o4f2v3UHhktMptNp3u0CAOKYxxHlxBNKrXfWyU4aee+9U9q0nU6HENIqSVN8eXjqLciT1GoXRxEnLER/J3lW1u23T569PjpO07Rp22fPnqVJcn56mMSk34k2ss08jqKEj8djzrLl4ny5aKIk7fYGVjZH+6+lUe9978P33v7+/dsPP/vs46+//EI3StHWaZQlCTIo4dHunXtFTLOUJTwDFmtDvYeMsk5n5a233+dRvrG541GkjBPSWO9u3d4qOsnB8cHKoO963WkL1lb7nBEt5Xy+UMoQDKXQFKM4jnlEGSNJlmZFTinGhCyXi7Ztw7CojAlXuixLCAEhiHMKNSIEE4K9txhD73E4O40xwZ4s9Ps4aF0Rcs4gdMVnVsp7R8KRyTkP8HW4SOH0fbNGhHonrLrCGDHyHk5mS8bIxtrw1u3N5UK0TUMQTNPYatlUTUSIBxZhYJQK2YBtW+9sbU+nU0ox59RaLWSDCXHOCNlY5yIjBt38B7/zvXfefWSd/uijj/7sz/96MZ2ciQnBkVaOdDIpW8qI93a+XHaLQggR7qewFwi/DX1rkiQBRwldlLXWQAkAwBBZ47USxhhwpQUF3phw6BnjRKv6veGgv3J+Mcrz3Hsfx3Ge5xSTgM5xzrvdbpqmUsrZZBrI4f1+v5FLSilUGgAHKMY+ZonGPm61/OKrr7vd7u2dnU/Pz148e37/zt3vvffuUsNnz54dnZxRSiNCsIeOUOcs58xYi4xzLljahCfchMJ9M+eFofxmMREqQhgLwnd2MoyAsapp6zmFTotFP7/z/fceffHFZ1Yb2c5///d/kqTk3//H/00Ivbdf6gaswhog+Pz84vTk4OGjtx8+evzf/et/8eDB3c+//Obbp88a4bzRpVaM0CLvNGrhvPPea20hcpQGzNPxJG6amdMmiiIp5Xi+qOs2xLtEnnvgrLUIQ8YpoRgAQChWSqqFDEuiLusEPXqnSNsWra70B4NelmWMIOjAbLpczCvgvDVICIkZH6ysZUW3LEthrEfQeGdVC4CzRnFKsiRZ6XXWVwYUAikaZDX2DgFAaSQAOTm5ePb85Sefff7F10+kAJQhrR3l3DjvrLHehXPZOn3DUwvdbZ7nnU7Hez8ajQAARaeTpnmWZYhewd29Xm92fm60gxBa6O1VxJr1HnQ7ifc6z7PtnU0eMYgshPbbJ9/86X/+m+WyilNoG1+LhnLAOFGt8d6GVAbgPQDWAweBgwCqpsLecsYxxs5oiAHGyBrgPIDeAXCF4np4tVgLqgHwD+Ilb1YSN1+/MVZeOwQYY7ynxpiUUgjhlQW7NWH1oIz2EGkpw7+glZ61Io6iXq/X1HWWZZPL0dHR0f2793q93qNHjxbzuUE+6IbChwMhtEFS3zR1UwcC481qFV/H1CGEwPUMA6791uBVaIUzxlitjTGc826eQAgjGqVxnEYJJyyNYk4ow6VZWbXWOqO0bCkhzqjZbLZyazVOk9t372XdXu/goBGttp5QjjEdj6ZV3YpWbu/sJll6fHxcVg1UIjyGwduNcx7IE2mceGM555ubm2tra/PZLNhBegQJZ9QDY60xFiPa7fSLopjP5xhiBLAHSkthjez1ezs7O3e21rE3TslukXU6HQihkBoLFaV5nOaZsx4TPB57CLz3ThtvYIA/AbpyhAw+04QQeGUvh95sIIjDAIDgih18opy3AAApJcIAIYSvz+xw80OItQ6Bxsg7ADBSSs7KOWcx59g5h7FnnNS1r6olwRAh1O33MCWhSQr43BVIgMlV0B2ExhgPoTM27EbebBTCjEr29o82NozUJoxrWRqHUFdMyerK6nyxqJYzq8XW1ltKqdls5qASplHSVE3pLehlXYqp9/DO7h2E0DdPn4wPD1ohsiK11l5eXt6/93aUdrqdCCBtbFsLuQJJmvIi6Usxq8tqPpoMBisrvf43X3/18a9+NT6pv/f99+7fv/Ng6+H0ZFzXdTfrxzSJee6Ez+Nsd/d2wokStcesVW7Q3RStuhhPDg9Oq1omjk2evDg8Ppdaf/d7H7I4UtPJ0cnJZ599JpU6Pz/vr9063tyhlLdlZbWBHiQ8JVAVRddaSwjKO0Waxsaq6XRRVZU1MmSgYUTny0VVVdY6KSVAiFIOITTOOm+cY8FvPJi2uWu2f+j6nQ3WQyFgzYV8XqWU1oqzDFwLHG4uoXuDChuKyM0UK5XO0wJGCHlUVmJ0dtbW1c7G+uO337LGAI+iKCEIIwAWsymlMYQ03CJhgpzNZu99512l1HK5rOvaAc/iKMtzpVRd19a5ZjHq97u3djYe3L2FKDJKPX/28vRkbEyTpKkkBkI4nU6l3qURT9P0TaTkRr4chrZQ4AJ2Aq8p3BBRhNC1t4lwznHGgtOztVeWCWELE/qzkE8Rbtwsy4DzIZYzjuOw2phMJqJpwRsiEQCAh8A5YDzwCGMeRwQTCI/OLiez+R/9wU/mk+mvfvELrUQepz96/31q7fj0RDRVnGYGOAQBwg5iDz0AGCCMECTQe6O9N5YwerNfCEhMeIYD/+PmqqEb71iEtFSiqcvZdGOlPyyy5fTi9YtnKSPfvnx6ePCiU2Qekw+++x7C9OT8rJn4vb09COGjR7elVp99+vHhwYsPPvzB2vr2P/3jn7z73qOPP/7s2fPX3gJGkVUtIQx65713FhhjkLVaWyGUBX6xKLWQnNO2bqbjajqdaW3ubm8RhBLOpJQYeOQdBt5aW85nYSyrlwtRV+F9GXMFpK8O1weDXl03ysGNjY0kSb744guMKYQwwXRjs7O5uSmlnMym3gLOYwgh8iCJuXcGOUuhz+Jo0Cm8lUYpi5AyimEEMZIGfvLpl7/4+Ucv9l47C4pOCgCq25IlFAEbgFeMkIfOO+CveTA3IFZouBeLRZ7nSZIMh0MI4WQ+U0plWYEQ0upKC+2c89bCKytcIGSDAIgT/vDh/Tt3dqxRF2eHv/zlR2lBf/JH/4Ty9G9++vc///iZl4u8KHKaSGmunNW9BcAB6BDwAHihXb8XD4eDtm3rsgRaoyi6Xi0HTybsr4GE31or/NcQhTe/Lezswi0XZtBwd4XgdWOM9U4YDTC03kmtEKHOGIQQp0xrLerGaM0gDuCzkWqxWDx58mRjdQ0AsLW15SlCBC8Wi7Isr9RGGEN4heFDCDnnAN8oyfFNkAH+TT2nMQb66/UKQsC5K/5T3gEAxHHcKboBtQpBskVR5Hk+nU4nk5m/YnFahMB4PJpMxvcePtja3rDe7R3sL2cLbV0zm52cnWHKL0cTB3wUJVXTsCij3kZRhK4d6P21asBaa7VOkgQhFA5gIQRjLM0KzuOqbufzRVnWmLBerwIOnxydirYhEAEHlnXtneoWW28/uJtGRFu7nI8XS3l2ehzH8SpPlQWHx6d5p8vThLKo6Pa0lhBCazVy+Aq9h1ddAmPMQ0gIDauHAEy6a/zGOeicM1YFhbNzzjrrvddaYw8JITg0HPBqIBFLk6U9zjJrbTfvbmxszGazzz/9rKoqCCFErtst7tzZSRJWNzMAFcGk2+16CEKMMIFXGhkpJebhamMIryxGw9MUNCw3tfSqjn38yy92dqbamtu3d1f6gw/ee18Z/eVXXzkI8pSdn1cQoyjGPEKtkEnO63ZpnGpkM5/OOYw6WYdFvCi6t+/dnU7mrVBK60a0BloAXJzFo8nCW2sAEmUdYe+xT7PO+nDTa6QENI5ELGaYMMITHmdRvDhZHCYnPd5ZL9Z/8N7vNE2VpjmjSb1ogKPeeuNQKz1EJOsOIfSQRFY2jZhalLA4XtRyNJ4um/rBW29/93c+7PeGo+lkY2f79t07T58/u7i4aFq4XCys8c4BbwEljCVRBdvRaNS0bZIkaZojxKzUwJMkLjDWgSkzr+ZN22ZZkee5Meb1wWGS4DiOrb+GBzEwVlWlQOiq+w63RThI3mwkvbdKeeecEK1PrwIL3DUv+qbrvJlTb6oDIcQ4RllitTXCKA1bYRfzZjpvyqVIkjxiJI6TLJnubO1cnE+19tZqIVzTVJRSY9TBwWv3+z/GBFbVUojGONs0aZLFADhrtQPeiorTXppwJWpkcJ7yXrdYLhuEo25ndbaopDKj0YUQIsvTlZWV6XgcXnM4+ENFDjUiMA+klGHXED4KRDmE0HoDgEGIIAQwosAjCLA2Js+jtm0xpk0jRqNJsLfqdDphmwghdN4558IAMZ/Pl8tlVVUBcgySJI88wAA6DACwHnoPAMQAc0wAwnRvb//rr7/N0+ydx4+VaE+ODh6/+72Uk8nF+dNXLyAGyljjgTdaIxIA1ysoyCMEg789Cc2fvbZnv6mVV+wqQkLCb2jVmZcRYxGNqsUy3926s/Ho5Pj1t199eWtno6nLJM3/9E//VDmf5/nDx+/8fpL/9E//dj49Pz+vT0/2ByuD737woKzrv/jzP7v34O4H3/3eWw93KYaU4qPjs7Ksy1bm/Q5wzjrjAYAQI3j1hFdlE3ZAQgjZtgAAY8BoNKLOFkVBCJFSOueUlGF7xRjr9/vhUw1W32H/JfWUYBZxvJiPj45OEKaDwUAIGap/uCf7/Z51ejIdSVV7j2hEPUQQgIhQrYwzElg2vjytdta9NZyyKI2EANKYpqqfHVx+8tnnr/YPnAU8jjCmiNA0D7EWCCLIMMaUBEJAcCwLA67WuqqqOI7jLI2i6OXLlx6AsAScTCZ1XSdJdXFxEcJNwtNk/BWzBCIgJUhjIGVrjLZOH58cTCajjc2VW3d2v/+DH+adflxEBtqXr46qtm6EZTRCwc8DInR1onsIwOYwf+/9D27duvX69euq+nhRCQQ8I1hqczVqB4O+K6tliPyvBc83p9pv9QrgN4Hf8H5vdpEYYwRxkAI656w1N2RGpRQw1lsLANBSBY5hXdeyambTaXg8m6Z5+vTp/qs9QsjDBw9WtzeyLMuyLGBy1lr4xr4jMBABRs658A2BtgwAgNcjjb8JrwNvNArXY5JRFiGEAMaQeAtkq5TQccw5Y3maiabVmSqyNHwCG2ur3syEaYIn/aycnp+fTqZLwrgy9ujkAnh0MRrNF6WyhrO42+1CCimlKKRxOm+tNRCG5kA0DUJoMpmMx+O2aULSTZjQyrIsy7JtNCJuMprMp3OjlDcWQ4QZS5MIepwmccxJL8+kMlWjzs5P9vb2Gg1o1Kla2UpVjUZswaI4JhQjxL33EHpEaSj7CONQpjDGLgD46AZRgDc2CgGAkUpela+rkPEAfXlrLbAeIQSDSwbGwEOCSZEPiqLYWt/Y3t46Pj4+Pjg5Oj4QsnHa8Ght99ZGnJDL0YnRenyxVEpBjDDGgzgOly9N0/l8bjDxzt1g1YwQ6EHTtKEjeRPWcs6RyXTBeNKKut8f7Ozcyrudpmm++earu3duT2azxXKyur4GEB1PLo9PTnZ2dqpqqa2Ssp3P3aBj+yvDnc3t2zv3jHFVU89mMx4zzrkHXltTFIW3VBpZN8opv7LWBUpdXo7H5zMCopPjyyTurK5skYPj/cPXk9F4bWVtLXnUltXhi8N7b93aHG5V9bJum3pZCeESHkmt5ouKM7y+2t+4+wBQ0h6PIbRR1tlNu3Ujvvzyq6ZVd+8/vHf/ofVwspwfHB1ubW//6Me/X/QHSZJcni5+9atfvd47aGVblQ2AFEI0Wy44izE2GFNn4WK+nM1mzttutzudjsL1ppQmEOZ5aow5OjpSWgKQY4wh8Na+YVJrbXjKwv/DfSBaiRDSGgSWn7UaG2iMadsGQR4Om0ACCkNqcCW6qSM34yljrNVEKV0uKqdhwniSZBD4ppZHh2d37+2giMZRmqb57du3Dw/Op9O5FbW1VkqJEGrbdrFYVFWltQ7nGTCaUhpFkXEuamrrHe8WW9sbd2/tdjp5LWqMsTG6qerRqGU0v+kJrNPe8/Dy2DUkEKY9jHHwSoqiSGsdZtMoipxzYQGBEArDxw2ZMWT/hPy3IDhEAE6nU3cd7gKuR8kwSyVJQggJ3g/omhQZSBgkIYwxBN1VcoS13nnr3XxRZ1nx4uWeqJb/+Ce/9/jx46PXe69f7d2/92h7Y+Pu7s7Z2ZlwRjuMPEJIRhEzHkCIMSKEMGCB99JZDK5bwPA4/dZoGN7+jWEGhPDy6JVscbWw+y+eMW9/9IPvlrP55cXJ0euXddv87o9//8//6q/3Ti6//+H3it7l5jbf3dl8+SLXRuzu7g7XVlfXVxCmu7dOT8/Of/b3P73/4NFP/uC/uffwwX/493/y5Vff9Hr5UnkAAAQIQICCoJxwSnErZRJnBKKyLDmPekWEMAi7rVAxw6cdjHu9951OhzFWVVVd1wihoO65vLxcWYsAsK0oZ3N1enpMCCuXy9OzM8b4xoYPutC6LqeL+Xw+j+PYCk8gUs47q52h0DhnLPQ2iXiRZVIKQhDEaDqfnZ6eXlxcHF3UJydnlNI8yy4uR7P5vNvN+/3++eUF8BASdD0pAg+BdT6484bklPB2+v1+lhUPHjygjDWNOD8/Pz09jeN4Y6PjnIPyCldXSml35c/hPYgi0Olk4/Hll1993pSTo8PXO5sb/+bf/BuWoU6n1+kO/uW/+udbO9t/8qd/8fNffCbOppiEDKiwnscQegQghPDDDz/8R//oH92/f/8XH/3y4ODA2rMoSawHcr54w/UZAAA8BNBfbfDf2Cz8toPCb6EO12ssH6bMK8gawV8vI5yVRkOCPARaa4AcDisJIxihjJCmrieT2WQ8vjw7c9pghJSQF3VDCBn0+7UWy6oMJmmhs8eU3pClQpXw6Ncw4a+n9jf8YwAEaZoGXWKohEqIcPLpGoWeJvgdhRsMQh+i3Ywx3W631+sppRCGW1tb60NalvW8nFyMzo9Oz45PTxCmncGQGT8ej0fjWSsUpVxqWy7nZdl2NxNrLXAeQhg6l/BhzWYzUTdJkgRzuXK5FEL0er3+IAYIl2UJAMjznPKIMdY0DQKgaYSRFUYGA4gxqpeL13sv19mdVmoDMMNXe5Y0TaO852k8Gk+nswWr6ySNw/iNMezQ/Ao2CC3pPwj6evMX4Joxc1M8b/6EEOJ8ACkNhBDhK+EDo9l0Oo042tzY3dnaZIxZe1Vyvbd1rYRsMAGMY+tU0y7XdzfiOJZaYYy73a7Qqq5rAICUkiLsr3MxEIDgWq9x0ybevEgIISFxfjFbeK//8m//8t7bO2nECWsfv7Nz6/bO0RE+Oux5D62PVAnvbH5ne2MX2ye/98F748tytqZ63fX7t9+5d/9BkiSHhweffvYlIthaq7XFiHhNgYqmap7GsfSw29lAJNOy/vbbc121RZIupouiqL/yv0rTPE7zAuXTycyS84ST0cXru3fXXx2+fvriudKGc+4c6Hd7O5s7q/3i/u37w60doDGYVXsHY2v13t4poiBJmccNTaWDU2XOXr+eLBblxfn49Ysn9x++vb29CyGWbH5vc4VD/+r10avnLy7GSx5ngJDd252Es14/Rxmt6wVgmlHQ2hng1iGvlF7ZHhBCJuOZsILEmAJkgTZeEcwA8EppCH2SRFKUAAQYwACIKMMQOW2M9U3C8/msxhhyntR17RyCgGHtsHZQGq+1lxp6CIwFxsaUGIIghARD74yxljFGCIpqhIxi2k4mk6lo45jjJPrm26+kapIsz9Le+cU8TYrd3d3p/N+dXZwJvB7Hsce6lg44DwCWGiXZwAAGaYqgMT5qFG4N0Y4771knWb13p7GgsCwCiIjR41sPmWMvoqN5fc7Tgic8iftnpxeq0bdv3ZULNV0sirVe1IlHkwmw2HukpDMaYEQXomZRkuZUCAExhQD28kwI4YwNo57W2moT8JI8TcOJZYwJAq233367lZUxVkqZpqkxpt/vL5fV2sYmIeTk+FQajzHTgHjvPYkAhAAapZ3UWsiWUpx3UwydaOuoixeLmYDtRTP5y09/9v533u3eu/XTv/rr3i//8oc//tHqer61u/L5t8/y4QaOMkmmBqBut+8caKrGAwiJR9ZHGcMYaq3bViOECWbQQuOBd8hZyHnMmHfQQh6hKG6MnM/ntTS+UVq2eZbsjZu7LbmQ8YtT9fajt+7eHf7V3371/MXcGPT5R6/mI78/uAToDLEmyuHm7bXf/dFPNjd2x9OZ0Gh392HdiouLi9H50VtvvfU//V/+1eef7vyH//B/LGdgZZhKbYRScTeNGXJKQppEjLWNlMICixEkELAkSvvdqJMwCGmWd42dUcaatkLELxfzJMJp3MVec+QIgPXlWAmxnudra2tSytOjM8ZYUXSllKEmZllaVWUjRWgTEUJxHFsHMAPCNK1uB73uvCzjJBIGzo01UfLl3uu1tTXk3fRitGzE06OT/f09RG9LmCVFb3x5zijdXk3WVocvX77MEWI8hpRqj4QyxiMPMsrTLAJtWSMACcUAw7Rb9NdWkjRVyty9e1cpdfB6HzM6Or+YjUdKSAIJpdRoXVeVV5ZQigGMEYPOydLmg84vfvbFrz76/Hd+58P7jz9k+dpa5GRtlZMrK2sfPHzv289ffo6+ThnV1jRCxjEFwBtntAZxDL77wXd/58OH3/3gfpRm3/3+20L/sz/5//7ZweGJBZAQAgAC3iNj0PUWH3llKHnzkLjpFcKod72HvirWzjmGMEYQOe8A4JRZ75SxUZJgwrSFWjoHgFMeSAsJjmBU1pUnJDguyFacjU8vzs4X42ldVQQiDFFwEU6iFGP8/NlLRCDnvN/ryVowwiqhGcWXp+fdbtcD0Ol0GCQIohZRhwxG2EN/JYXw0DuglXHOEYylVEH7EOiWcZRYa8tl1SA4HA73j8+khVHWBSBaLtXl5VIr1el00rTwzlYLZaxOkmTY2+xHdU7iP/uLv6Osy/BaTPH27dtSS4fahMgNHpVNWS5raDXGwBhVT1Cn09FGAui8d9VyjqDjnCKE0hytrhbz2RIIiYiTuubxkPN0PJo0tXYOYGK8aMvKYEyVEsAZCChyAEPEGReIzYT9dm//h7/74+Pj06cvnicRXVsbKgOsNy22JdTCGwqIakQrBSI4y7JmvmTdLoDIO+cpk1o3SmMeOdVARChlEeOEEAyId8BZb7wRWgtlgAUAIOu18/4Kh9AAI4QJtdYLIbxxGKNGTYsec1AcHL6cTM+NVE3T3L9/f2Vlpa3rra0NgmG5qJVQWZK9/857j+4/cMC3Uo6X88vZBDY2yfo8iXFEyvnCWxfoCwgiCrEUkkeRMUYqFSyzbjAtAjFXosYQYcTKZSuaJkvJ7Z3dnc0tUTXHB5Mkhbu7D+7cubt7+75odUwf3L3zVqdYHU9ao3GRDyiLMLySuUOAkixjkUGISqENgHGEEDQIOuPqshKukd2CD2+tIed73YhTlmSARybJPItwv2F7rw66/V6apkdHp3XTOAsvz0fvvv/extq6kcpbN52N9yB88ezJ2soqhPBXn37qnBmNLzqdjEf44uKikY0QDedxXnQHg2GRD5aVkFLO50vvvbImTtN+vz+el1mnuJwu6rZiUXw5HjFGopQlecwY88Bg6J0z3W4vOJdFPKnrmnM+HK7euoW/+eZJaMCNvqKwhbDTsBW7IqqQK1Y855bzKI5jpRQE+IYTFEUsj3NCqbYmRN0EjN05lySRRzDkHUCEwlTtve/3h2VZVs28LGshmqZpypJg6AEA29vbnU5n2B8QghirIp4Wec+DqGlq4CwlxDmnpZqMRrdu3QLaNGUpjUYYai0c8FZLZUy3R4s45YSWy3lbVqKtEx71Ot1t5/BkgmiEMOeUAmfapm6rCl+LtjHGEGJjHAAukA8AQN5Dra21XgillLHOEWpvdsxhSArSJiklI1fecL/FWQtqeCFEcOYIUUPee4RhmOwh9ABc2RwBiCCABPqYRSzmMWdaS2OM9RoRFMfUe3txcf4yZndv3+p009F8XCnBktgCz5Oo6OYr2zudlZWTi0uMsXeQdDOjdVNWAPk8z7USjBPgEfLIGCuUCangEMIoiijDxlngXV2XQoimqmiccIqbGmmtZ4v5vFy2bd2K5v33352OL6typqRaW+lkWXa0/+yzXzW9FdDppHnaH13Onj19tbl1j7IMYnZwfDEcDpO09+Tp3snp+M6t299598PBcOt//Y9/tqyrxWJsPVCtUEoRzvJup2pqpYW1FmLknGuN5D6mEc/yCEIoZcMjzCnB2ELo+t1sa3P1+9//frUsTw5PPv7ol61oOaHvv//ug+++9fTp09Fo5K51U1mW7e7uXqHlGN8IW5xzxjhtDYSQEBRQKwhhHMeU8rOzs/k8rus6WP5V9dIYw3l8MR6LpnYEt/UyjujKcOXOrS2K3bNne0a30GkHMAIYQ4QR8BCNJ+M0i1dXV5MsrZqmqsrRaNTRmnP++vXr6XQqpUzTGKyshJsKEwgsgBgEiY21NiABEMBl1VZ1G3HQ7+cB9BoOV2E7GXaH2oIXz1/96vOvv/z669lsIYTmUQThFSsikBoDezemmEATEb/a79y+tb29uTqZTBbLGgaSi0cOAujRdSD1b7gtvYlFyWsG4s0wF74taGcAQoQQTAm65iswxghEzjnrXVh6QecAAMGId9EsRNM2VTWbTGeTaVNWcRRhABG4iuMMewNrrRGaEFIUxerGel3Xn3zyCYQwL3LGWN00i8Ui2JOHqxaIyb81HzvnTHhHN8kPN0wr5yDC4TGfTifj8ShmvKqXbd0QghF008nl6Pwiilie53OMRV19+O7KZLqo6wq1vr+S3rm16wAwxkScA0wciPM8NQPnrEeIIUgOTg/ruq7rMooZZcgZ66DN8/T+nbsAOmttU7VJkkQ8CYGZTV1nmZTaaOUBRM4h561zkGKorAXAIoygN8DCAHlCDJ49e6adl1KmWffDH/xgOitfH51Erep3e1GSEUYBIspoBzyllKYwTjjCVFtjjHHGWA+od8YBjClwQcdKEAwgsbfaeu8xgA55G0AF7yFCy+USAch5jDBwxqpW1HVjrc2yFCLQ1s1yOsuStNPpDPq9teGAc65ku76+LtoGQt+2LWfwnXfeefzWu8enp69e74Hl/IoGzlg3LxAiEWVt3ZRmSQhx2ggl0XUkN7gWCoWnHkJI6kYiTAFyRsty2a4OUoZjJarL49OE0Nvr0TuP3/vOu99N06yV9i9//nNRj+uJ/aM/2lnJMyFhkQ+aRvAoGvQGlHKhFVaqahpCIkYj4/1iNsUI9bKsn6UZZzxmK73uzvq6EtIq6Z1rhdK6tR5ZaCFuzi4uKyHjOH65tw8Q1FpPF/PV4dqgO3jx4tnx0TcEImf1qxcvd7e2vfeTpYoiniRRmt0GBsVpurW7NRgOAUBaG4AIizisFaU8iqLZfPGLjz423lW1mC2WURLhiCxmpYKuHoksyzqDwrkimAg5Z7Sz1GHgkTWmsWK5rMqyDiFsAS5T0jjvIIQ3Hy4h3Htv9NUhhzFEiHDOGbvRdDlwzeyjlPb73WAYAoBDBCICjVFCi0YISmmaA8qiiFIAkFKqkSrmed2q6bysamkt0NBq4wmG43H5yadfEcw/eO87/X5PKieVqxsVFXi8XMQ84gRraz3209HZO4/u51k0m2rktJXNTFSYUUqpFnUe9Qf9fi/P6tnCK1PE6fb6GoRwvJg5JbUyhGloXSW1xGXOeQh4NcYE46ZQHTiPjXEQYoKZc85oa40PoYU3pgv+WsR1A7uFCnOzWV8ul4HNXl7H/GTZHQhhURRJEs1mC+89oRj4wAANChEAAfXeI8QIYVkScU5CGhunAFGMCMPI14vp0elrHgFhSkNSkkRru5voU4Ii4pApOimN+PHFEYAQYQygB9owjijlcUQ5chBC57yQWhtpnUMYY0R5HOV5Timt63pZLaQQUkqr9Wg26xa5NcYIuShLqUWWpVtba/fubr/76M76IP8//uQ/HR4eLmZL7P27D4cP3n/v1q1bNIp/+clnf/YXP52WejxZnF9MLicTa3wUhVRl/803r7a2tu7fu/d//R//7VfffPP3P//Z2egyIpglaWvUxcXZ6vqG9V4oZYGz3lsl9XxSijrGPQjhZCLW11ezNIYAjS7PiyxbX+l+8O4jLdXBsHe8/2q5XMZx+t77b+MsCVcEQuj8Fc0+TDzeXzH4/bWySxunjMQYR4xLKUO2b5Qw59xsURrnGGMeIu/9fL5slHYALecTrVsKKeM4iUi/l66t9tIYaVlKZaQ2ynjtgQXQeuuBzzbXV1ZXh6srPWum85m2XhmljJrOZ7PZ7PLyctAbJlEstHDaOGeE0EKopmmUVsYo7702gGGEEMAEYAiMBYyxvNOljCultDB5l41HF3/+F3/zF3/zt89eHixKGfgfwXGcUooggdBQyvM07WQUmlYLlCfxnZ3NO7d3Xh8eTefLYKPioQPgpksAYWdwc9C+iSiElcoNqRnd+DJBCLynlCZZGsfxFXP+KkrG3dh8kSCi9l6IJmwYl/N5tSxF04auPfyYq2xj7533wIHQiARgbyXPIYTBKi1QWEJfGA59eM16e2P1AG4eYQ9hIDP+ep9yFTLpnUXG2bAWkbLVRtTVrC6r/9v//D95Y2eTqXh0p63qZ8+ezcsq43jv5eT0fCwlbNpl09q8uzKazTUwnV4BCUDkiqKBr0h+SCl1dna2WMyKPM3yuCwXCNgiTSilSczH4zHGODgNRJwv5nPZtLJtw5YEQYixJxAjBIyx3lkILcUUeAyAIwhnWba+Woxn8yROCeUQk5WVlaqWk8lECIUxjDk1AALkOSPaGC2Fb6FOEuK9sS5oDR2CEHIMAIQeBAWMt/5K7+ut0uDauM9bZ40CwEOIIsa8984Z1ToptRBCiNYYa6VM01Q07XI5b9Iopmj13q3Hj+7VdTmbOSOX8+nIWosJjCNEiUOEQIzmy8WLVy+ni3nR63c5RwgNe32bFZPRSCybJIobUwkh0ji54aZc8X9v5F1CgZWVPoZ2LqRRbm11h2H79OCg18mSOH7/7bcfPri30omt0dPpReSF1tH0fKkr5zzQwljuykWFKNrf35/Pp1prSJAxxnqVdboAQGCGGKFeXhRxwSHkFHhLLs7Hbz+4H/NIKXl0cjyZTJumCcLTd7/7vZWVlfX1dWfBcrm8vLwsyzImUaDDlPPFYNCbTefaytHsfLlcZr01CwFLMsxgWS7LulpZW02S7GI0ttYrjapatK387gcrUumvvvrm4y8+Qwi3UlMWFf3eetu0ViPCPASEI4iB9Ve7Igihs8A5VNcyGIBTyuM4VcpMp+eEkJvsL3hNCU6SxBjvnEPoSix3cxBmWQYhMEY75xFCSguEAWPMehP+c8B755U1TjuttbGeUqqMNt6laRqksUqpciYuLi7G47m1hmAIAYaIRnGUZMXLvX0IMI+TO7d2WyGUdmXVZlw4o/NBj1LqKI6jHgQ2S9mjB7cJtsY5ytminGNGeRxdjnWWxkUcc8o0IZ0iZ4QiDMumLrKIYC/b1lhtWllqBxxkCOzef4tx0rY1ZRhTqrUNfU+SJBAgzq+oCdY6CBHESBl1xSe7dpoL+ArnHF9PUeEPpZTT6VQb6bxBGCyXJaW0KLKg1A3Gw2ma3hCCgIcIIWRhaJwxxoxQQjCGKJjlaSWFbjtpFKe8VfXByatqsdzZ3NDEdzo9HGFITNXOW7WAmFLqIw4xRnXdIqg73YRiVtd1RqGxRmvVNo22jrI4iRPKo6IoOIucc1I1EHhoLYWQRJGECBHivSdEL6vy8PAQO8UjAoHJs3RjY7C5Puh3osdvPex0OsPh0MXD9c2t1c3NpLOyd3T58vXh+Xi2c+vuUvm91/tZBgnCzvj53snnXz67c+f1u28/2Nnd+df/6l9+/NmnT54/r+eTOM8oY0oJTCCLODI45OABAIQQzuuIRwiSt9+6d/vWzmI++fSjJssS7I1YztM03Vjt/eEf/mg0nkopGYdPnj8vyzJYVijjAoPE2GttzvXBcH2fO+C88xbHWEoZRZExBmFSNyUmqNsf5EWHEFLXtbae8tRj0Rv2ik6SZzFDW9jbQa/oFMnmWpcTP18sJvNF3bRSOeW8BRBBrGhat5U8EYRHmGAaUxZRQsja5jpPojzPh8OhaNrJZOK8y7sd1dSNFMYbjCFJk+CgTDBsqmZtrY8hmE+n2joIsPdQKu2UOTw6+/hXn//nv/irTz/fMwAgDCjlxgEAgLUeY4cQJAQwTCilDEFrtKhKGnsELWeEopAIbTwgDkAAfsM6gbhfdwlvIgrgJqzhGqS5+nMEgQeI4DRNu/0eY8x6DwAIMqW2bd01MS6gC8tqIVsRqABaKug8J5TwSAsJIQrkCHiVu4oQvMpaPDo6qkUbCK1Zll2OR9bavCj6/X5Y+TVSBIJCWJEEoWYgCVlr0XWjcMO/xuDqvVjgq6bFEKZpnBcp41CbhmCNvOh2i93N+8P+4Pjg8Pj189aKhIJHb91fGQwBiMYzcXA8OTx41WpTdDvHRweIAMyCeA9ZA6z1zoJ5tZxPZ3VTiraWbeKccV63bauV8hGrqsoZSxBujdBaT6dTDKBSGgFHMArmKCA4QSDgjMeEpAkDDgFvkijO0tRBxKO4rBtEGeXR0cnp/tHRyckJ5SlEWGpTi9YDQCk13rVtmyCepjGIYuA9JshjjBFmBNM0CtFThBAIgbfOWOOMtVo5ayFw4Eo9Z6EHkLgoZj4cJRAzQikmFJO2bV0jnFAUgvXhoD/org37g2426GVnp3unJweLxWIymXBGOp2O1vqJlbPaa60vJuOD46OqadOQJLlYrq1tQEwXABGIsiwDzlXL0jmHr8bdK+v9m76BpFmH8xR6zWiymDd1KXmRFPmAU2KkvHvrbhGnppVxHDME/vD3fjib06oU3pGIxQiCiHFCEPLOO/3Ww/sOu063+/TFy6PD08V8KlrdS3oUYGiiyUXtpNga9te7KzFFZyfz1eGKdUA0EPokS4tOt0vusbaKGWO9ohdF0YtnL40yW2sbr57vleXSO6OliaNoMhklaWS9sV5vbA6ttYQBFpEu6wAECWetVKPRrNsbeICn03lTK2XMYll98+1TAwDCEMc8zvMkK2rTtk5HcYIpoZR2ehlhWCuDEUGAWuutAdaYuhLWAM5ZyA9V0ohWwWv3vXCEh5sAB/ErDqAckFIaq4xxjJGQYuecAwA7Z4O/9+XoAmNsnJNKWWuBANaBgMoqa8q6VcbVVRsYRlrr0eWiqiotBcbYOSC9ctBTRx0Ck+ksKy6PTk7CIlk5Dwj2wAxXepub6x5Y5MHWxuZwpZPl0YOHt1mMAEaUk+lsBglGBCYFHfa6EMKqKrXWScSSKGZzAqCt66ppKqEMIhSzNIoZhiTNOKWw00m1br3XmBCgDIDGGNW2tfOOEOwcDHsTa62zxgEXcJZQKwkhnjEAQNu28JoMmCRJSMe21rZtwzkLPqwQ+SSNEELz+RQAF5JdvPfGhNxwAyHw2jmrgbfQI2stMt4DRxlWShktlVImxgADWem5000NXp8eP3v1cnt3x0KNGfJAGVEWvf7qIGlqhaHrZLQFwbVSWCMwJR46jGwcwYxmSdHhUeoBslYpC7x1GMM0jiICnbHOOcMi1QoAUZrntq1Ojg4Tjh7evjWfTxlyp8f7VTm7tbP9g9/5sJMXdV3+L/+fv+gPVj748Ad1W+WdvDHWYsiK9F7/7ZWdbQjx3ou96XjCKGu1efF6/6tvnn74/UcPH73V6XXX1ldbrTDnyllC0O7arvf+8vJSKZUlKcYYAaj1YtAvBt2V73/v/bcf3J9eXpSXF1pJbM3Bqxf379+PI/aP/vAPXr3eOz27ODh4/dFHn2CMV1dXOefLqgnrM2tNoI7aNyDocNuHjMfQqAUAKXSKRTFYW10HCC6X1WS+VEpHSQYXZZJTa1iU8H6RNotZ1Vaz5WR97f729noUY4gsI6CWSirjAKSU1STz3vMkHqwM+yvDvCjyTjfJMgBA28q2bbM42d8/2Nvb00IhzAgjEIPgs0kRhRA6Y5VyDgAltfO6VWA8mn3z5On9hw82t7akVC9evvzbn3/09PmeAQAigDC1HmKEPUAAhhB5iDzQWi/m5fn5aGvndpplVdm+fn308uXebLaAEFgDPLQOwDDC3/QEyAc2pX+TqQB+M2baX9m1Ae+9cdY5BzHS1jjn9PXgobU27gqQCwjcdYKottZ6Y8POIgAUBCILIAhUzOuf6JyDGFJK27adzWYewW63WxRFsFVIkuRG3fMmChigU621FjIsBL33JKyfnLtBByEmQThjISrLkjHagzkhEALjnCgKfnl+UMS3xxeXJ6+enB6fAFk9urfz6O72W/d2F6trQoAtTarmi1d7+0nWgd4tZzNIPWNhvYiNAVpYrW1tJAKgSLOqWrZtm6WxtQ5B2O/2MIZWG61NRBlFmGHCMPHWRdeKHg8hQIFVasumlLJlFrXQAKetUZMJK7Ik3uhlafHk2SvK2K1bt2azWdM0hJA0TSHCqG2lbC3wEaeYkiRiLRDAe+QdRJAQAjACECEAk4gHh+2Qzu2MtVobY51RQQcHvAXOA+c9dMCitmkBAIzwJI2zLCOQ1HVblqVvzWw2cd48eHDv4aP7CDtt2ld7zy4uTqpqaa2mFENEICKY4Pmibo4OEEIewc3trcVi4YytliWltK0bZ6xoGm9dGsfAWCWkfwPuwtdeumGlS+I4XS5q4DTw9OWLw3pZfufRw52tTeCUFNX6xmqWRAiBTr9XCbW9vX12Yj795ItnL17du/cwy3sAeUaAFPWjh3fXNoq6LZXRStayrhBmkltiiZaqsWWzXFTzaU7oxvfX79269fzZE0rjdrlsG9MIZ4Ewvul2GYvQfD6ez8ecxMfHh21drdy7vzfft9INh8P79+8zhj77/HNMmPc2KQqIrZKNXNQA7ty+d7dtJQTEOA8RSZOC8qgV5mI0er13sL6+2ev1nh/tAa8RJdKqcno5Xc5YwnqrvTzPIcBRFGEAnbMIwgDuUcQQQkKotpWz2UIpkSSJtUEIh4L3HABAyMYaTyyKeBLoPNdEBA8AcMw5b4x2WsuwcUDXWelKtpxzjKhzVlvtnPcOamexd9hBqZVQallVCCFngVJKKA2QpzEHziqrvHXEYqHk2eVFI1pE8GgyfvbyaczZdDF1EPRXOoG44L2HwO/e2o0ZxdSzlPZXCwAhpohmGIQUSmo3e6uA4qqpsbMQc22V9SZOI8xgmsdAKm2tgZoA5Jxe1HM8OfbQSr30QCHmPTA8IhB5ISsIoYfYOuu8NlZK1Wrj4jRBCGH0a7lXUEBorcEbVrsIIWtt8GiKoggA0OkUodOaTEdSSkajazgHQegRAhB65yx0BkGPMMDQWS2MtVpLhJAQknHmgXEQOQesBwnnKyk9uzj9+tuvWtkAZzmFxuhyPlrp58zLs8vjiCerq5sA26aRUZRGRQraikcsT7nHjMYJSzJtXFXLi/E4YizmCWckIqlTTLZCKZVA6NoWU9bLk1LLpqqYizt5LhupMn1yfHZ6fiGEyoqP79+/37btspwsqylkYLQos37cifLO9nqURsuqTfsZ5/G6asqmnI7GNMbrqyuMguf7e3unR5s72ysbq5Aybc2yrqzzg26HUrqYzs4OjyfnlwmPrLU+s5xv37t3b3N9Y9Dr+1Zsr29MLy9jyi5OTnc2NvNOd3U4nM/nVdV8/PHHJycnwQnRGDNfVoFEAuCVbYu/bhGuJg8CgTdaAw9cFEWhY3DA553u9u6tvNM9PD49Pj4JjIe1tbVKSIcjB3ClVKTYvKm8qvmYbG+vU04pJ4xjxnAttGgrbQ0lfI58bzBY21gdrq1GcUoYhQQiAjGmiGBMEadRmibdfrdcLp1zSRpZW2it5vOFUvoq0deDOGLLusIQZDnzzvzq08+KotjY2OAQPn2x/3zvQGgQJwxAUjXKeZtRjBElBFmjAyemqsTx0dE3XXj3/nuA+IODy1/84vPPPvvmclpjggPaAgAEwEHwa3WMA/imtXqzUQDXqhljzLU0wwMAEKMOAOOc1Lpu2+BaGsaSG2GU1cZq44yFAFipEEIh9RlYF3YEztiQ4wADXxICcM0BQgjMZjOEUKfTKYqCUnpycpLnea/XQxhXVYUxzrIsSJSbprnmHrhgHHKl6IOQc+7RlabOORdiJuI4bpStqsoYPZmOprNhkRKra075/btbK7306PXIqFq383J61o2pV82L50/mi0obFseDtpwb2aAsk22FvIEWOOOdD1JLDDFBHs1FEOlEbVN56zDG1gKKCSGkrkvoPbDOQCOadjIaSynTOKahaGMEoYcEh5bp7r1t5D2jNKLEWW21ydO4KAqlrfXg9OwizwtM2PnxxXQ6XSxKgJj3vhUyOMthjGIYYwgpgt5bY5V3mAGHCUMYM06vV6sQAAQ9cBZ4a4Gz3jrntHPBXMcj4Lyz1gLvjNa6LqtqsRwMhmurG9vbm4Sw6fmlA7puyjSP+4NiuVw8e/ks6NXjNOl2+nFOm1oKjXiUiEY4rYJl7cO33hqNRkcHx+PxeGd7ez6eKKXqsgLXyQNJkoR777d6hauJTktTLZYYgTRm5xfjy7Pzumya6q0H92+nRdKIstW1cw6wJMp7kCVFnyzbunzxfH1rp9MftKLUTjX1PINRt4jbZmx1e2tzvZtk/cEaIezs5Oz1y1de62F3MGbKuWo2OxslaHtnjREqZR3FzHgzX0xfHx4QQhAjbSNWh2vYEehpHMeXl5eL+XxjdUNZdXvn7svXzyGkjdBpFhVRoXTlkCuX9fnoIi3y6WRZ1YKSGAB0eHzSNnp//+D49Hy+bL77wfd3bt352y9+eX56Ya2Ns1RqpYzOikKoNvExhNY4bLwPezsAgNJm99Y9762SZjKZGN1obb2/6iFCg04I4RFtWhyc7CCQ7jqqNdwbCIGg5bPWAuiSJMmyzFotpVRKEIIgQg5YB64fe2C9923b8iihFDvnrAPeG2OMlBpgQChxziklnbdxxKKUUY5nk7GDhka4bOZ7+6+2NzeHq0NCyM7d28PhEHhPCHLa8Jg4YGvVWKBYQhvZSO0gARAj43RcMJ4mxhkNXJREiOO6bgy0vZX+7/3R798ejRZ1c345KuelkWYxWy6beSKjTqfDONS6kgoZ4zCJjJGEMASJR8YDgJDjHANAUfD1YgzDq8h2hJDHV3l0CIRFpryxikMIUYoDzX57ezuOY2vNfD7nnDtvgAu+s8ZfM7ystbatMSWMEUShcVKJVlnlgXUQMMaMUkY7CDCmhNGEc+7bxcXFBaEYE0Sg10ZdnhxsrQxTirZW+3nWY4w5IYbraysrq1LK49fP8jyOksxCbBF2CLRKt6p2XltAIPaUYuSQNgYjGBGy1R2KJEXQMQTFbKxqWWq9nC+dA4t5/eLVIY+K4fpWLV0l7GRaOl9XdXt0SkbLKup0KzXvrK7Vom1dQ5F3xu7e22YMv3z2vEizjfV1wrB+6uq2bYxanp8yxta3Nu9v3P/ss8+Ojw4xQPVs5qV0zkFE8zhOU7+2uvHed94v0twK47S7s307AhgAcHhyuN/fv3X77vnpGYSYs7iqmuFwOJlMFouFMaYVKo5jY0yS5vZ6sXpTVgAAEECEcDicQpQwAIDHyebmZrc/LOv25d6rxaJsmlZKmRRdbUFUZHHEVVN6SjwmPM8bpU8vRwyDqqqMc4giTLED1hjlIdy5u7u5ubm1vcPiSGplrL2m+LRJkmGMHbCY0ZWVlTRNm7qOORusrHR7xf7rw+l0xgjlhFtrvXUIAQgB51xrsFioL776+tbPPxJV/eLFi/OLsQOQES61tR5AAKVUECIIsLUCE0QJaRt9dnZ2Muw937uwe+dfff3ks6++vrisHQAIEQSAD+MqcOH/ICT5/peCqW8Ahpul5w3AgCkBCGJKIEYOeHft33ezpCNXiy0SEE2jBL62FffAueukhrCSv/lBHl2Z7DjnhJDdbsd7H8fxo0ePAABCSWNM4FCHhyuO48BECeZplFIUX/HhrbUkpKMBCK5lzAyTOI6jKJK+ieMYeLNYLKbTy1vbA+tUVU5Gl8eDgm9vrW6srD7rdr765Ffnx/sJQ2/nu9PJtChWj4/2T48P8jRhFLOIbW+uCy2Fklpro7T3xjsEPOCUNVUNIk4IQch767RShJCmrM7PT5umccZjhCCEZVkGZXWWZVGSIAwgBoQQj7y1BnobRVEaRxFj2EMEXKA8pSkDAGzv7mDE2rZFlIQVYZIV3vskM51uARC8KmsYsl7EedRIIbWilDJKQEAyvPPWew+9twAgb66WdaFoeaNDVohFyBrjrPXeQ+dF3Vwul5eXl9WyvHv3/nA4jLP47oO7rWgssM9fvZjOJ4dHR9PFxGjXcQDgxDtcN4YmvF+sO1jiDHuCQufEFgvvvZKyrWrRyLZtgXXeg6a6UkRrra9oFG8kjITrTmTTQog5Z1HE27oxWh8enM4n09Fk/N67bwvRREkkVavPLzHGl9OXDPdf7r9uavXO++9vbG9BAgfDHq/dYjlO0441Elq9Nuh2szxLO95h5JuTI0kidP/OPV2tNWUl1PTgsFzMFmmaGucZjx/u3GmlOr8ceQ/Hy7lzhnF8tH+6tbrT73W00DubOwCAV69efec73zk9ueh1B5D6nVvbeZ59/u3fZVmGMFgu52dnZ6dnI+/QzvY9AO3hweFkMjMOQoiPj4831rfee++9ldXV10eH43GZiwZTwqIIYrRYzCywDLMkURgS3WpCCAIobAG11otF2TQCABAGWaUMhF5rDSEID2p45JRS5bIOy7xrcb8GAFBK85wHBni32+12u977xWLhnMMEemC1slJKa71H0BqntYWIRDHkPPIAWOudc0oZ58CimhFCjDGq1YSCokiyImWULJYIYUwpdgBwzu49uNvv9yPOa2t7vc58Ok2SRLZNo1tvdNWUmNMIR42uhWoo4QgD6xyPeVmXcRzlaRYnCUKwlY12Nivy9YSlg65DeDpfKGkYotWiwghBb9bXNp4/74/HY49wUwvGWCuVFBoiCyDGGBFCecRiEymtAYwYYyHnLSwaQuQ5hDBiLCwpguVzGGQ554FovbGxFvywjdErKyvhM/fuyooKXaWq+Fk5ZoTwCEMMTdsqLZRVCHkAgNGuaRpKUBpzglkj9HJZrgzzpq1nk2lRZBh6aM1sqoys79++NRis5Fn35ct9J+3bjx5vb+++erU3Pt1LIs4i1igtlZK2rVslZBNy6iIWIQCNUlpr5AEkpF4uIAScUwodI7RIeJFERd6VQm+srb/16PHq6mqaps9fPC2rtm7kxnp/2TTbd7ZXrSN58dNf/IqIdNkIwqJeP5tOlq6x/dXuj1d+WCTp6fHJaLFotZJWm+XMejgcDq13l5fn9+/fn1yOZtMJcH5lMNBSIQ+o94SwJMmGw1Uh1Hl5sRhNYp6kUVpV1eXZJUJP4yhtpFrd3OKcI4TzPD8+PoYQBgupMFZiwiilNwXlhvRkHUAEho0D53w+nwd78s3NzUVZX45Hr18fZFmWZLmHKESQjGoRZ6mFqGxFIyWG5GJ6WS2nq/2uNQpjTBjN8zyErnLOO90ui3jdVLPlQmiFKOFKIEhoxHkSY4ybplksZlVbOeO0McDrPOtQzq21TjmhJM4pgtA6l+VptSzH4xIAgBGAEJ6dnf/tX/51K0VZGusBwkoqBwBkEZdCAeAQgh54CDFjtG10XWtlyauDk1evDz77/MuyrhGmnEetlBDQACSgK8wfAuARAPofeCvdFOWbP7lZDAd+4m+0FBBAjLDDgWwYlhRt21bLZbBbdkY7ZN8kIQbTHymlf8PE6eapwRhhjLz3JycnvV7v/ffft9aeX17s7e3lRVEURYi5CSqtIGO5khoxHp5NYwwKPwXhK4qrtQSisBkEVZN3CgTd6HxhjOGcAqenM7n36tl33rrLKRlfnl5enKyvDh8/euet+w/SNUzJydrG7f/fn//s8PBwsLpVVcuVJLnz4MGiWk4mk9li3jZCa+8sdA4Ee8cwEzN6Fa2U8IgQUpZlWzfGuDiO19bW0jS9c+cO9D7LsjjmFnjjdIAhtZGc027R6XXyiHHOWMy4M1ZKSZCFEL/9+N2qbMpa9noDzpLpfAHQVQAexMh7b70JI/ioHhtrz0ej0WTsAHAQaeet1Ywl9jo8HFgbEs6cscQHNb0DEEIIEPQWAOfMYjqJoiSKWdOQalnu6/22ld1u9zuP3370+CGA7tmzb17tvZwtxhCjze1trS3C3FhvnGdRsbK+c/vuW7PZwsV1FEVGqaODw0AdM1qPx2MMiagbzjn0MBisdTodhJCx7mbtFbrVAFwRDqFUWhgAPEGsS2nPQH++lNNPDi9m4L//V/8CA21kM+imX3/56dnJCVndokmUMkRjY8Bs0UyLIvOwKrpsPLnsZEWLW4xxnsaL2cQ5gFr79q3b3SK+e3cduvZ4/xVB8O7tOx/94tNvv/ns/oPHP/idHy/K8uzi/PbdNQD8fXc7SZLZbHb/9tann36Oad1fH9b1dP/V3mCn++Lgk2+f/aLb6d/euhMRqqpGLYpGRv/in/53f/If/9Py/LBcLqOI/bOf/GMeR6Cd39rOhVb/27/7ikXg7z763//wv3l4+87OJ1/8amU1bdu6U6RRTCGS1lpda08IBbnysC4bBDHnsdN6sbxsmkbpUrnGI08wa4RQzkYRg8ApaBZiQSjCOcYUCdG0xoY2NiTuIIQIvHL8dcaur671+0NrLTDWa5OwWGoTkDpvYdmWCKGIMWgdY9iKkiQ00FKstbyfINQ9ubSj0aTf76yurIU4HAoIx9Hm6s50MlrM28eP35vNFsPVjft370ynUwnHilSGtwtZ5XkxnYyBdcu67HQ6+/v7yLNmOdczsb6+blpjrYXNqHGmTZjuFZBxxelUyPHJqXEeYkIYjRjPig4iuNPrAwCqSvsoe/zhD7WWSinnTXBWllJqZY0JsT5QCDWbLpbLpZES2IDGeIIoRgRijBD1jlR1a53mcRanmQnsROBjSmNaAAC+//4Hn3/15enJ0d3bd6bzGcY4kLMAANZ5b41zzgEvoKMUDPpdiMC8XtRtyyPKOaUYCtFQziEEy1YoLQghSZpJbLz3E1E5RmDScYps3OKVoFG6oiRcu7O+3h9+Bu3xi1/tf/v3AADg9MZqr9MbHp+OZ5endWuMR1hjhJFsDYx0kiQWmoUUSqmIUSVLHqeVpYynqLdae7eze+uiEvzsHEB37/6dnZ2t//e/+/dP9/bj/cPL8eztx8PBcP0P/8k/x5Qdn1/+8hdf2GnVjbPJtFw0Po1z5+F8UTdNAwDClMI02bh3t6qqpmqV0k2rzk7HnLJip/P48TvVcrmYj1++er660pNN27QVpAniWHmd8FjaUrjl0+fPgLMnR8dlO3UXprPfuce+w2bl3qujtrGz6cXacOABAAhbiKz3LM8bb7FFwCPoPIaYEcYohR5ZYAlzdV0PV1Zmi7l0pugMeZFJ5CfV7Nnec5oQwomQNYbu/PRICXl6OT15AR7cvdPp9mhvHQEIUVbNZ8256Hc63ShzzltTxRRzpL31xqLJeGl6OO8UhCeIEMqZNDpNc+cAj/jo4ODg6HA8Hh8eHmopoVNFUXDOkwwjkjrntGyFtFtbK9WyvPdwZz6fnxzN1taLeVXSOJppWbcGUoAgqqREECVJYo2jGBrrtVYccyN1pV0UcWvtnfff/6u//dsXL15QymDEhJCy1YRQaxUAAHjkrnoCDCG2EBD86zXwb/3iRlyArt2IrbXAAEpphAi23jTCOSfaNngsdjqdO3fulGV5eHiIsjyc6M7qANT92sPf+5uTHr5hEh/6DAyJ0Y7TSChJEWWYffDuBy/2Xs0m87ZtEcDWOgQ80L5qa0ophQhjQqM4aHyCjVJYQ6ytrQUt2Hg8XiwWWutGyy6i8/lcOTvI18+O5ou3EWYb0/npx18edgbf/J//1f/p9OC5R/Kd72z/3//n/346Hh2VtcH48+cvPvr2SUXo2fFpzAuJ4qy7nE0vMHR3NzYbKV7uv543c5akutJxyozTWZZhjJ2zw/7W6flsd0dsbd52q8ZYhaGN4+jO7fU0jZP8SpkFgEOI4jBAA6ulckrPpzNGaZZlsICUYgwJALnSejou27YlhJRSNEZbZDBBOJBPGQ+zYiB4Zin1kL7am56e7G9sbvd6w7oRHjOKqQZQKwv8VfWDngJgkBsz5FpjEKI0iqTRjdKcc0d51QjofCfL13sDDCBQsjo/i+8+KBycTKbtxbjPIkvoxfiCoq7RptXlcGVDNHI0Gd19cL+32q1kXYlIto4QFscDB85aYSACnFGnDY2oVlJrG0WMEW61gQAqKaIoEkI4azqdjlayXC6iKCIGehYzHiWMRVoZ44HTRkhpLT47vRhNFjubQ+hB0yptMGXpoJs9vLtLGSbYxxFVLVpML8/PTzY31nRbkoRnCSYEI+RNiqIowsNoMcfASYhMnPBb93a98RCD7334XetInvco4RCK5bIiUq2trXSzgdY6TiLuGMYQE3jr1k4cp6oVm5ubWZafnR6/fn3w5GmDEZ3NZh6l29ubbVUWRSaFmM/nGxsbJycXD966f//h46LbOb0431z/hMTcey8kWF/fKNJ8sZivra0B4KxycUKt0gQi6LzVxlqvtabIG6CklGW1CA8epcRahwkkhGOKhBAeekwgAIgxlsUZIQMI/eh8WlWVaBVBmBCGruZ82un1tNZGmuOTs7Zt67oRTWutHQ6HwYIw5EIF4C7ceUHB3O/3wy0YnP4Q9oNOd2tr6+GDR20rnj17Np/PKUHlsoVBkIVBnEZCicly6rFvl7VCqGka6DxDhBOKKFRaxHzIKYUQ5mmmrfHWtnUjpYTYCauV0cJq6EjwfRNKVo1ABCNCCSGEhRirCGOMCXHeaG2MMRB5AhHn1Puo3+9qba3xEGLvYF03oVuqfY0xBh4i5AFABBMAIIRUCHHtRGa9B1ora62xSqmEELa9vX1xcRFA18lkUrcNAADCqzQYjGlgzCmjrbVtK8uypIw45xghFGECwHRZIuwYxgAYwlDGkyiKeMS6WVzXtalt2svLpulEBXSQgujo1alW6vJk8ujh/cFw59nTg729Y84Iipi2fjKbPn/+fDQri84K51xbNZ/Ps6Krtb64PAMAxHFMGSnLklMOETXWC6HqqtFKnp6eE6+x0cNukSVxK9T6xhaO8q+fv5DaPH3yqtudfOe9/cfvfCemacziZdUQGneLwgHkrLYOIGgpxdZab6Vz/mr/xTlCGHmAr/SH86aq33//vZ3f++Ff/0387VdfOeeyLDNKy6YNeTlesqpqDo6O6sUSerCxsTFf1MCjKIr29/c/+uijuq6zLDHeaWu0cc4ZDxGCGCEIvI0iRggzSmspnJEUszDGQQin0+l0Ptva3Xn/g3frVh4cHEyn0yzL4iiVUgohgHOcc1YwcrGYzWav7H671vS63bRIrTF1I9qm0dIY69IkBphZqA3AHnhd10GPRzlj0XXGN0ZKqXA0VlUVXKjDVdDKIYKjJO50OpRSD+xiOhuPx8I0K1vDDz/8wDnz1VdfTccTr0zVTjnn1oaYXaS1CDChcy6JUqigc8YjiCHWRkPo8zwP/u7WAoSC7S4IkW/gOov5N+CA/3rGNHrDWh9fZ8SAN1SUAWYLMEAURTcLhTD5hVYAIWTNlQLiRgrhf1NecYMD+WufBs5Y4KCELCjO+a1bt7744ovZbFY3DYRwOBxGUaSMNsa0jcQYR5zGUZokSZY6XWjvfWBBTqfT4+Pji4sLKWUAkyKPWiWl0RG0nDMWR0mWoyk+v5g9+fbZs0cPt1a7f/iTP/rsFz/79usnG6srVdksl+VXXz47P19KC9j1Mby39wp4nSVca10Uxe3bt93h4fH5WZwNIQAIIa1VXSvvTFFkSZRiAobdbp6nxurlbNq0VSsWACoRrLXhFaACnQ/BjFYbxgilVAohZStEkyQJxphg7z1ECAVEjVISlmvKSBDcuKVA6Nc+7kIpa3y1rBfzuui0RR8ghJRREEJrrDMOeAh94G1La7UQIlzoYHV/nT9MKMKOAuxBzKNOmmVxwghFAJ6cnymrJrPxycUJItBam+edLCuwFOVkXlV1lBTr60kQuBZFsX/8RAgBvW3bq3xdRjElyCOMISIZssa0jWyqdrlcQu8N8N77cPkCPSUA4aRsKwCQAXBZNcbYNM0Zi+I4r5aLV5PDly9er6+scp5YI1lSRNav9nvTy4v5dP73f/3Ts4PD4HTx8OFdVUvdCgKcs1rpxnurlMT9/rzRnCGE7XRxCuY6z7Ju0U14yjRe1PU3T/aFRmtrG1WjRgcno8sJdE8IIRsbW1mWLcvFcjG/ffs2AODe/VtZWihl/vAP/+Dx4/F8Pj8+Pl6W05/85Pfeeeed6XR+/96d8/PLyWSCIPn2m6eT6WJja+f+vXdu3/tOK4hH8LMvPv/226N3vvf93d3dZ8/a7bWtql5qLRMWQePyKAmIGYI+IhgTijFS2k8mI0KIc0BrqVQID8QBDwzshChiSRLxhDNGCSGDlWHbtrJV3gPgkXOBPIVOTk6hJ6JVZVkZ4yhmgHCl2+V8Jpp6MBjcunULITSZTGazWVVVUghGMMUo5iyJOMY4TVNCyPFeM0yHd3Z333v7oZLm8vT01bNnHgIex4Qi67T3dri24pGvRT0YDPRFQ5Okm6VtJabjsTO2SLPlZOZX14GzXhsMgdK6rRuCUJTnupm3Ws2qOlnMmRKTxXyymI/nM2UNxAghEmjumNEoihjjKc20Ck2AhQgEjpWzRkmhlXEOIEgAQFpJ0dR1NXcOIoQgCJIkHIABhECe50EVTSkO6nGlBYRQCLGy0tnc3Hz58mVQ89d1bZxFCEEIvLX42sm/bdu6bbKIa+OqpuWaeA8ppZRA4HxMCUYeeq1kK4XSAIC4QTrxmK5kQwzhWtEfH422NjaMdsTixWRJKX11vt/NBhsbGx4lhHfjLAO0zfNcaecgQAgZZ9u2UcYjihCFHjjjNEIIEQSsU0ownjkHnEWEUB5nGFOAmG7F5Wjs3VsQMSHM6urm5q0HBxdjZdF0tsDUPH/2Oo57l6MJxcyZslrMk7xQykhljQeIEorIlSYNIIxQxDlB1AdUxUHo/HK57OTF4cFBHJF//sf/1Bvz85//nOBOgpHVRjRtW9daqSRJs6y7mC46RaGNT7Js987tw8PDg6NT772UrTICAOAB8hAgCBACgYOqrQGeAg+AtwhbiikhHgFDEd3c3GzadtGUq+trWzs7z1++ePHyZZqmWd4JyewQYAehEIoQEuEIGjC9mFBAOOExT4DHwNOmVUrOG2k73ZwQoto2MIfgcum9zzudLMuiJLbXp2BoMYUQi8ViOp02VR0KHMaeUIYpSfNsOOwnaVSWi/5l5/Bwv5Lz09nh/Tu3/+iPf7x/8Npamw+40KpVBmOAEQUAAAgA8hhiZSTE0BoLoY+iSFmNMdzcXJ9Op23bOgfslT8/eJOK6H8jzSGYbf92lwCvXVXctaVV+BeCvDC4ub/JCAknnHNOSlmW5U3wI/pNA4Y3+ZLgN9ccb7680GCFFuQmfa0oig8//PDFixfHJyfj8Xg8HkMIjbOU0pBNH2I+gtorGMSdnp4aY+q6Du7IwaDJe19JKYBttRRe5ThrlDYALEvTz8nh4clP/+Zn7zy8+8/+0U9Whlv7L48SmiRJkaXd4+NzKQEggBLuvW+aSjiHoGUEMsayLJPWMMYIobIVGOMsz3r9DucUQx/HLC9iCGWSdoaruVKibcbtbO691Sb2oIXXLuyEIHit7AXOApAAAJzVTeOFEFJKznkSY8ZYkkThs4fXMRb4jSQ27zW6TrBEmiMKOEsIxN4hTiMAkFyUiHkEHQQWAI8hMMBC13oj27ZK8gxhoIRyEDKMWBxxzjkAzljoQcRYliWdLI84xxAdHxyPF6O6LoUSEANIIGFYa90K1e/3PcCXo1HE85C9MpsusiRyRimlIHBxHCFgEfDWKOuMMTYol0QrmraiiCZpqp3OsoRRjBBKk4gQksQ8jmMCCKKEU8q90AiAKIoSnjhjBEJGmdlsUdcNymLO4pX1DR5FqtaXJ+NXr14BAF4/Pxpfjooi/+H/4yfOCGy51vXJ4eF0OuIR5hHGHkjQEl5gDC1UwCtAUhJRHPGvvnl+eHrx9PlRUqxsbt/Z3NhZzKv5vGqrRXAR2dzczvOUEQ4hePrs2zRKd3d3P/7lJ874ra2tt99+NJvNLy8v79x+azhcQdB/9913hVCvXr3ee7V/fjE+OjyratsdbK6tb969906S5Sdny8PDk8fvgw/e++7k/DLhccKoVsJaG+eUYKKsh9ZCADmhnDOIqTPGOEcIAB5ZQAOh1zlvnUEIYcziOC6KLE44JDBw8g2UHlkSY2CBtV4LJZQxyq5tblSlUHoOIPYAaOe9AwgzQlwUMUKQcyaKku3tzVu3drTW5+fnKysrjx8/3tzcbNt2NBqdn5+fn5+7csY5P9l7FUGYFrnXghJAGD08Ouv0eRJvbu9sPHx8T8r28PiglVVEWSBKGtGqpk6ilBPalktR1U5pYHQacWi91IpjzCgVGFdKgelYecsYmy+Xl5PLWTVnjEGAQji6thY2VxEPlreEhPirqxi0UMsshFpZ5wAhFEHitUDeEOikRwA4iAJwhxgjCBLnfBxzhEDw8gEAAOgg8gA4KZvhcBjiLoVWN1XPBX2I96HzDQQrrDCLk6Zp2kY6Zp1zGBLovdWCIMyJ73aKIttpm3J8ca6NjBB8dPfu9vZ2nqTj8TSCTpYzY9zr01PO47t37tuUK6tPL85qKVY21q13zuooiXMW7+7uAnw5XVSNsCzJ0zzTWhpnKacQuGU5bZpKGdl6hi32ABKO4ijFSZrlWWu1EBogXNdNLdrjs7N8sNLrDi9G835/M8uy588PLy5mo9GIc84gLpcLDKD1wBptrPcaUx5BRBBwCEUAAAwgRdBT4K0L8mtnoVH6m2++OXj94t/+2//hw+9/Xwqxv79XzReTi/PpZJIyQhHsFL3VtfW6arTWFtiIx0rbjz/9ZDKe553CamOgDmx/QghA0DhgjHHWMYy8aZSC3ntKKY+4Mapsmt7K6t37d7TWLI4Gg/58uZgt5t77tMidB5PJZL5YpnFipRtNpwCADCX9vDubzZqqubyY1FUbxzHAhMd5I2qxWLbWUYoDHzuKMBGCc55lWa/Xw5QsylIpZYEP5k7GmDB5w2uDoDiOgyfH3M8oR1lnY2tna3NnFWB5enry1befQCJ/9KPfvRNtDQaDpqmKbq7URCkAiAYYABAEn05rF3HugXMAYgK9Bw6C7qB/cXER0IvrUx+A69wW768iobz/L2MJbzYK+Nrg8obVGBaONxgDuvYoCxLEcLrPZrNgZhC0V4FKEvqGG3lbAETfhBNufrRzDmMEABBCIII556PRaD6fS6N7vV6WZf1+P+SuAQAwJb1eL4oSAIBSpm2noe0LQ3DYRBRFt9cbhD6maZq6rpXRPIkdQdZaTKiyjscpYdghMp7UH338+dMvv04x7yX8/GIxGX/88Ec/jHhutE8TKBxxzgGgjaGDTj6fjdq2tk7XdX1ycraYL/OsYzU0RjMEN1aGd+7sZnkEoPVe180CYiXVsm3rVpXaC2CdNtDaK9so56j3lGKMECAEIYApw4QiB0lQrGitnLMER3HM8zyHELZtK5QEPqRgYACgww7YkPl3ZYDBMEOEFEWX89hobaSy1jR1mSbMAQOddNbqEBbZtlIIZWUKE4Q8Qj6KeESZ9x4jpAgCzgPrgPfOyLrxUmDnnAZqtphCjNI8q0XtPMCQNq2ezRYra6nxwFvAOAEAQOeGK73prJKydUa3zhmpmqpUsm3KqtspnDYU0zROOklm+4Moijp5IaXs9/vhygZLYoFpFEUEYBT6VugRcNIqvWwX48vzhEX3793d2lhrm3o6Pc3TKE3jTq9wQm2t76rW7+7emk0XHB+en5y2Czxc2YJ2frk8OT0qy7K6dXuzSIqEF1nOjVFSG54QxhJl7JNXr5YL/dHffzUvRZyl1hNMko3Nbl238/ncdbL9/cOTkzMhVBQlu9s7nU73Z3//UVvXf/xP/pkxH//v/+uf7O6u/fEf//HGxsbv/u7vXp5Pvvj8k/FoiiHqd/rvvPMOgvThW4+n8/LFq/2/+PO/ITxiSXbrzj0PWF4Mxxfjdx+/++rp8+ViNuz3PItGF2dZEjdVY7QCGEGMgIcQUAw9hr7VwlrivbfOY4IookY7600UMUyvWvgoimhEvfdaKxRR55w1zmlnjMMYE2KN8uWyPDk9H52NrAUIEghxxOIsy0w9HfYHOzs7KysrnU5nY2Oj0+lIKT/++GMhxN7LV8+fPqvrOuwvZSuGRWKMOTp4dXJ82B8OpNDdLOFxNOh3rDdtvfj6q892b++EpXGnSJtSlmVZL0vRtDGPdzbWVwZDqzQw2krRVFW3P0y6naqpq7YZX5yjjLdSNkIsq4pSqrUWSoZZHyEUOI9BsGAUwhh7LKKIFUXBKHdWK9mE6ixl4KR7jQgEWEkFvKYEQMQIYRBC50BwDIUABmaotdZ7Zy1w3igljNHBU2F1dfX169dBCQIhjHhilJRSeg8gxoQQzj2lNE1TRLDVSgghrFMMOWcYQg57o1QS8yKLP3j/vR//7u9whl69eD6fz4si6+ZJ27acUqPbe3e2ZrNZJ4u86ZxdnDf1qNMf9AbR/uHhxey42xtcXl5S4ISQaaeHCK6aWinFoiiOeSuUMlpK6b1lnDBGooRD5LSwwFrtHFIKQowwtta2UvT6eZ7nCHsP/cXFxel4euvOvRd7r61zy0VzeHhcZLkQzTvfeZszmsVxfzgglAljx/NysliouvWYQIgh9VdkKAcRxBAhhwGCkEf86Oho0Ou2zfI//Yf/+N3vffCv/9t/+Zd/+edffvLLo1evj18f7Kyuam3394/39o8Xi9pa+9577xnjDk9OldRSK79crq4NS1ffKOKctsB7AhBAuNvvRVEEMVFKOeAxxlJrjyyLKOc0yZP7nBHOLi7Otda379313k8ms/myAh4yHmnlAMQR59TyguDJfBakd9P5dDAYOOcsgMZ67SxSOsYE04gwioL83XshxHg8Ns62UsZpEqVJ4AOFyThJEhD5EHTEKATeiUbNJvVyMbNG3r232+9333r7rbWNwXhyiRmcLkbL5Xy41kHUv/340Uv6KiSXAuiccdJoYD1ECFOEDEYQOGA9BBBDyun+/kXbtoHU7Jxz7ioYKeAC/r+SLg3f+LppfMNUeqN3CB95YEaTaytGrXV4UkJqV1jGgTfyHim5IvaG73fX8fTh8HbXjrw3+4jgNxQCnM7Ozn7605+enJw0UgRqVJwkoRF0zrVV5Zwj6CqOK/yVm/4j7EoCRAHh1dyfJAlkiDHmnBNCRFHE42Rjc7csSycay+tOr6vL2bcv9r//7jt5Z/XwYL/9/NvZUrSNppQ3jTXexHEcxxHjBGFYVdXp6SmP0+VyqbV1CKQskcASBBiBSYw6eYSw84DGkWMEtG0tlaCMZGmutQ7v+UpagjyhIeKRIwTwtRUSDWADRaGeN00TxzGEHmPkvQ3vDpNISXWD4mCMvXfGKGMUAAB6jyFyxs7Go04n53HknXaBoy5bIYRWSov2KlY3zTCBxlgEHEEAQS+FUKEtZpxgqpSSspWyDVcfEtoambAEc+Zlbb0njEPniu5gvigtgN1ul3H+zTdfzWazH/7wh4zgiHFntWwxRiCOopSzhLFBt4ch6hTF6spanqZa/v/Z+o8mybI8yxO7/PGnnBln7h7u4eHBIzKzkhRpUmgiM9ODGUwLBBAB8DUAfAwsIJDZAZvpBRbTXdXVVZ2VmZUZSSIyiJNwapwoV338vUuxeB5e0S2whYu7mZqpuprqu/ee/zm/I6uqMhpaFG9sbJRlOR6P65CLlohiSBpeg5ciS1JRcCWUpTEjNGSWqLIP7n9492hvuRp/++QrQuDRrb3RaBA0nNt39wqeMpv1er1OezTemAiFlvP8+mZ8cXk2m8aNZjja2G61fcZIojLbth3XMghMJpOnz16eHF+ul9ViJh0aSI0Xq3i1jg4P9putznK5jOPccbxWs80rGa3TS3ODoBVFCTJICL2zvf/227c3RlvTyXI6WfZ7GxTBxXSSZ8WThw8Jsba3dm9ubrZ39h3H4UJM54tCaITJIl5DRBzfG4+n7z54cOfWW7/9h18ZrggEuuSQMsAlUgpBCCAAQENTp5+1VBwZCQGGCDNKLcuBEHOhGo1GkqVVVSUJsB1muy6hiBCSFktjDC9FWXApNcYEA4wwUqIixnQ7rU6nFwZNJVS9oO4OPx4MBr1eL8uy6+vrp8+eLJfL8/Nz9V3zr+u6lk3rd1pepPMiRwhpICEARvMgdJlLjDFFWbY7XWKR0LYsCLJoeXV2cnH84vBorx0GgWWtF2stleGiHTS2t7Zubm6QBjcXV2mcNNstgplLrZVQRhpZSSErUVWEEAMhxsD3nPl8Xo/h/vHSppSW1bpMLYtBIyluGq1FlQEAKDZ5mmgF6qS30ZBzKaoSGlkHvI0BSimplZTaGFj3ZXBeKaUgMrUvEgBNCD06Oqwjsp7nOY5T25uV0YwxY4CpeezfY5IXWVqkmTFGSaK1lARZDCsJ0tk6jtN2Z7K7t2q1Ggp5fsvtDQaUiD8+/FWZZxTiBw/ef/XieTMM79+/f35+zqVqdNq9fmc8H1OLCi0MAVXBi7LUWqd5PpvNsOV2fb9SohKl5TrSyDhOmt3+g/tvQ2hOT08vj5eEYSAQJhBhbDHKHItZOKuStEhbDR8YjSm+mU5+8NMf94a9J0+eiKq0GNnf3/Vde2d7CyHAGOt2u8z10qJ6+vLk0bfPp8tIG4koBFBqqZRSNWmv3nlpA+rIuOe4EMjZZHL84mW/03333XdDjF6+fLmcTmaT6WQy+d3vfnd5edlqtQAAV5PZvXv3rq+voyS2LDoabZRlOZ4viqLI04xzTjFpNJr1WXNzc7M/HIRhmBdFkmcGAg2AECLKMmpTgHDQDIqKx2lCLStstiaTiQEgbDYsajnMwZj6fthsNtPZUkp5cmGUUpACKSU3QkiRJEmtwxsIEMG24+Dv4MFVVV1fXy/XK2W0H4a7+3t1gKJe+SiljUaDIAwhzNNU85IwhrQSRV5mKUYGAhmtm71ee39vr9UMlZJlXliWI4XOs9JyHESxNBJoYICpcwtAAWN0KUoAtIFASMlsNBgM2u1mHMdSakJeL8x1nfQ/SgjfawuE8B9dCP/VdqFevdB3hY1vZgTgOxCT/q4bBQBgWRb6rt6zfk5et5wAQCnFCLzRMN7cUb3Y18bGN5OReutQFuXr+h8Ez87OXrx4UVUVZnQ2mwkh/CCAENq27ThOmmdFUbh2UGO8a8BJ3ZIKAIiiBL2uvVY1zb32kHqeY1mWMjpNU2l0WXJMqOOGzf5AZNmw0wJlPl8Xl5PV/vZec7D5m89/f3Z5oxQ0CANg0HdNoVmWOY4lqmIymTTb3Y2NzbDFryZTnqe+72xvDHc2h82Gj5HWWkCsXc+ud2wQENsKlENSlRVFgbEywCitoCJKKWMUQqS2KygltdaUIJuyuvmWc85FmeWJlVDHcfRr2gE0xtR0FowpogSh1zhtwaXlWFqLur8xLzjQwnVCABqKV0YIJbko8iLLlZQAAAdTy7UM1FVVVGWhpQBSZUmqpWy1Wh6ljmNDoIWs6t+dNhIjQhg2GFSySsvKGENtDjDSGmBMIXw9TlKS53k6Hl9j4lMMHcaUa/d6HccetZsNBAzUBhhDEHYt12a2dnSRFnmeN8NGp9XOsmy9XBVKE4QJwghA0gjaK75USlqIYsZC23ZtKyBwPs1v7W0NO8FqcSKrdZHlaWojHEbFlFmuIdE33z7tdjabfufB+28RC0xn468ff3l5deK46ODWrb2DrYqnZZXnmWi3eq1uezqfnF9Onj8/nc4roDGxbIjsSpXzRXRxfbOxseH7oecG68V6f+/23bt3F4vFo4dPJuOx77XarUG/051NV5ubu//sn/6L/f2D4+Pjly9fLuaxb8GtjU3H8cqSR+s4SaOb8dXl9bWQ+mo8g5Tajl0pPVtMCLM8WQSOs15GR/tH3371TZnmLmOB7RIAHUoZwcRiGsFKCgRhvVfodluEUAix1AAhYjGbMRtALIQqF+V0OrYsi1nED0PKMISwHXQwxlqBqiy1qvP9SEuzU++jhXYc17IszmUaJ2VZXl9ezSZTQkgURePxWClV+1AghMKAJIrjdVQURS23hn6QLBe2be/s7YxGI9t2CCF1n0JZ5b3BoKyKy8vzZ4sbrZVWilBEMdnZ2rYpm89myTqSXK5Xy72trWYQ7mxtrBazPC/Hl9eI4MFg4NtWLCUEAAEMtJFcAAAgQcSyGEJCiJqWzzDBGNcnWcFlVWbACIINxrDIUi7Kqky1qs8xBECktEHQ2Bam2F0XygCgNdBaaV0n66BUGgBggHodwjemBi/6vr+/v399fZ1lGSGk1WplWVYfXwghAEDznaXrNVBWcIKwxV73bnAujYYGYEycwUZfaTGLqn/4w0PbtpWobNuerEoMyauzdL1a7GxsKNDIS2t8fTXodba37yhgbNcpS0Bo0GoO5+sVxr7tk/OrS8sLB4NRu3u5irIkz/KigogIUWktw4Z/69bRO++9k2XJOlnOJykmzGCJCIBQYWZZNmY2jZfL8fjKsTbHs7Ht0TSNVtHSDWzLZp1u886twx9+8rFvM8eiRmmEUK/Xs7xwGaXzWWRRF4MMImoRp9Svr/4UYUophkgCDbSpiqLf78frNSN4NBqtl6u//Zv/9OFH73/4/ns2o77rPX3y7NGTx1dXV1rroqi0Mb//wxd37769XK5PTs7a7eb29vZ6vVwuojzPsyQzGrRC33f8ndF2v99vNpudXtf23IJXgSgNBFlRrKK1T6Dr2WUlojS+vpksl+tWt5emsZLGGOj7AcHMKOB5ASUWBMBq2B4hdtOrqgrbpEhLgAymqNluvK5xEtIoCbRSWpVlSZgFIYR5XgmOKWl1OvX7pVbj6xXRdV3HsmuEl0k5Q4hgLG1LKYWEWEymq9mUF1ujjWEcZVG0chzrvQ/e852WqPTN+Nv5fM4zA8jrVhbbdkhAqoKDOuCoNBc8DIPhxiBsNuqM9BuMhzEA43ryBgEA8HsWxdcrNNDfnzt8/6vfRXzV9wcE9U+uJwj1q7oe+dXSgvxeN3EtSNQ5z/qf6rtWaPQ97OP3dyr1j61h27ZlJ0mSZVkQBNS23rgi3gwXIEae5wVeWFUVqIuavit8l1I2Go03G5r6Qda2ocBhCEClNAIYKbOcLSE0VcW57UiDzq/HDsUiT7hUfqu7v7fT7Qz++PVTBKkQklILM4YQWq7mFgb9XtuxwiRJtNbNZnN7rzPa3llcnLiuu7HZH/TagedKVVZc1VYSADEEFBitpBIcKUmBBhrW48u6sk4ppbioEEJAG6WEUopRSghhjGAMGSMW85RStfGCMeYAS0otJTegPuQYSiAhrN4oSCVknnPOtSkboc0sYFm0HkoncQSUroqySLMiLQAAnuO6jlsaKcoqz1NelpUGPC9EWTmWHXpup930fX8dRWWZV0qYetQKFHMtjKlUCmEspUryTGuwWsfNZttyHKFkp9k8ODhoNptlVc2nY845BKZ2rTaDsNVoQq2AMdAAXpRxtIoN8mz3tdSkpeBlniVJvNZaYwQZxQgBMr6+yeKUEtLyQwJglRfLyU00n9862um1Qosaz8KbG72Kp82G0wjYeL1q9rx3PzqQIN/aGK0X+eGdLdu21pFYrG9W8WRj5+jO2wcbO72z8yiL13nG4zgvuDi7OL2+mnAJmEWVYHFUIgcQakVp8ujhk8B1NjdGw+EwcINms9ludY1Go9FGEmUYW41Gq93uKwncwDk9ueCVarU6t47uSqmBhW3bTtP06uqmLKpuf9DvtCeL9fnF6XyVUMfVCHFjEGV+2ARYO5RNp9Pb+/vtZmtydQkIaQUtpSujFDGGECqB4UBoKevlhyKbEAwhqooqy4ocFbbtEmqtVqurq4vxOGo02GDYgxDW16ksTl3XtSgjtlcvhKKsqrw8uX6VROl0Ok3T1HG8VtjAGJdlyfNKKVUbFfM8FULUIqrWilLL910IoW2zTqezubnpOM7G8E/TNG02277v39xMonVsO8yyLEq7+7u7SRpNrs7H4ynCsN1u+rbda3dCzzdaD3v9g+3dxWy+Xqyffvvt4eHh23fvtZuti6vLr79+eD0eE4S5FMazIYQWoca8psNqCYDWvuMWJs25UUppYBA0xhitlM1olmVlXlRlbllU8DLPsqooy7JkzLZtG0GmNZBCvQbMY4oxRhBCiI2BGBEAkFKv++kRQnUJXf18Oq7tOM7z589rRGOn38uyLM9zy7HX6zUhFFNKKUWoPhwYhJAbepi8vg5mGTTGIMIghFleIYSmi9XVeFrzbmsJF2nfdx0Mjefo88skWpvHj85O3PF0lr377js2a51eXiSxVJodv7wpubh/q/Pw4UPXazx476NVnP7qs9/PZjMFIGEsW2QG6sOj/c3NTdtm02mSJAnGsIbblmUupZaiRKaK1/PD/c1Wt9kfdE8vj4fDoX18slzOgsDrDbp3bh19/OH72xsbUHECjORivV5DA5ABUEOjAFC1s8hz3ICXKwAAgYhSi1KGAERAcm0cx5FcMMY2R73pbJxlWVmWT548GX384f7uruM4X3798PT0tNloM9uaTCb7+/sYY88Px5NJs9lUSl1cXARBYCchBBRDhiHqtVubo63t7d2NwVBoVZVinYzLqsI208acXpw/e/H84M5hDUEaj8dPnz/XAPnNVpbFQsG8KoEywHDJle/7SpY3Nzf9YSMIwqDhgUSXskyTygtz27bffusuQiheR+PxlHOuhTTGlFmOlXZd13Ec1/ccz+12uxjj1Wrlum6dBahfOYwx13W1lEaVEEIEceB6iCDGmBBVlMWEEM91l/Plq1cvpDT7+4e9zqDbGkZxXPIKQIDJ67Ie27Zc1yNtUhWlECJNU5FzrWVNUatVg/owLeXryAN+Xf8GvoMm//9xF/5XikI9dHjjQqgFBoRQVVX18PvNd9WtYLWTsb5NHYys77cePZjvMAlvRg9v9hPge2aFOggTRRHn3Av810EACNM0zfPScaxuENSMZwhhEASbm5vIWEVRAIOqqrKYw6htjBG8ynjx+gQPoed5jo0gwFrraL40xghtDAQQY1FxZluYsChJXMYm80Uz8ELLyZVcZ1mclb3uKIkzKXSec6fp+r4vpUySgmPQbHC/6RtTfybZ3ju898571VsHi8UizaPlci5VDgnQhhsIMMaEUgiIVrIsNK8MAo7j+mV1A76bxUAItVFCaACAlqI2jUohGCOOYzHGLMtqt5ppmkrJtdaMMUJplhX1zql2MtazewCQqhH783MuRZ7nGENKsRTFcsWn0ymvJNCmqqo0zso8p5jY2MIuLstUcVFWuRICKlNVBcO42QhG/d5g0GeOLSWfzTXnpdDKGCN5yagNMSCYhmFYSVmWvOI8DMMky/KybLVaCKEsS7MsXSwWvt9TSjJKa5MZZaSqiiLNpKgaQUhw/XJBhGKooYDcSFXlRbKO0iiu57kGEwAA4cll4Nhpks/z2TtvP/j6jy/G1/Gd26N/+3/8nxDFv/zlL4OAZlEsRU4ViKZzpnqkaDFt/+jT/43fbJdSaYsJhuYqQy3PV50f/PSnxljLaYG4++KbiyItJi+XBpNcVKBqd4IAwzRKE9fTEFcew1KkaXH9639Y/rO/+Cf/6l/8y+n4qev6y8VyPj7eHrQg3/nkk4+eP33S7Xaafvm73/5iPj2N58c724d/8qOfuW5wffbq4sWrq5sJpdR2vG67tbe355xfnJwdD4btvKqUVulq3RuM3r27f3l5yaOzixfizk6n2w0F78ZxGvhhkZeaOQaoUlcASN91CAVSVTYAQLtFVCpjLIYBMWkeZ2VkOfYqiyuV3nuw47khIowx10J+mi5Uvu702tKA2Xx1cnZ1fnEjlQYAVVVFEMaIHh0d/exPfkAw/N1nv5GOWSistUTAGMUp1gSRQb+3vXVweHAbAOD7PsLq9p1dLiNmQQB5tFhujhr93rDXG33+hy+ePf7KsWm7E56dv2Tko2+//bbbaf3pj//bh988Wy6Sht1zPb1aXORJOR3P/vwnf7E/3LniDAtczMvudq9zq9Nv9ZDWCMoongpRdeTQ8dxC8ul6LQxwm6HBaFXkmCJiuTazijQtstzIgiKMEUhMxhgzqoqXi06z6RPMRZVHuW3biOdGCY0IqPVwDbTWqATMspQGjBAvaGoD4zQzBkCEGkFQlmW0XBCMt4ajaLn68x/9VKssS1eYaOaQ5y+/JRbjQlBjY4y5lEAWhGMIIQIYY2xhUhotMeZl9ZoyBmCZlEopzqWuM5wQEsIQoFJCIUSrWZay5FL+4osbZZG3jvbZ9enVxQllWlXLD957QEV59fLxYrkOAw9kxfnLhe+BfBkxSYf+kBYkWWWO71gE3Ez41o71ybv3j/Z2z0+uf/6ff3txdeM3+gFzQ8+iBLmMISlti/qdzsH24Wiwd3I+vnXn3bLMG55/fXZs2/ZbmweHG7s7nU2q8WKxdBw7CANWyagoTibT04urpyevpuurRRJT6YaoaSoHQii0phg4Ni2qPONrDBE3FSHE872M50KZrBIWdYvCXJ+fHhwcGYhu37797PnLZZy0mc0BuVlE/+f/y//p1dm54wcAji1mhYEPlGhhiJuBClytdRj6zdBlBBRlEiVJFEUAgDTP6sTj2dlZp9M5HO5Mji9Pzi9enZ5waA5uHzGLZJUpywQzlURxkWYIoKJAVVGmcZIs8YO37z+4dfv87CxeJySUJs57jX61zDe3d0GFb8ScYI9Yfikk9RhyUKEU4WIQthBC88lClHK1Wrqu+9GHH+Z5XkRZNFuleA0AcCxbMlcLuVqtur32ajF3W8zCrBQa5zy9ngWMkcKUOVieToqg7wb+u4dDz6QX55E0AFBgNGCk7DQ7GGLj2zdXY5Xx7W5bS/Xpvff/5j/+R0QVBqASQmuAKcAYQAwpQRgTKbQQ4vWqhGm9QhNMzPfyim+8BfVBvF7R35w6pJQ5aUHBqZAu1hbUQEiuVA4goi7CVpRzxhiCOM/zVuA2PauU+o0IUR/x69N/vb2oP1PbC4wxGGMBodtsxnEcXV4FQRC02kIIhGl/0BgMBpxzY2CvN4AQ9nq9jz/8mBKHc358fBzHcf04CSGTyQQAMJ/P8zwPgsBxnNrJCCHEsKjL7apKuIHfdJqcc6igFrpSlc0cgi0F0Vtv3+fG/P7hV7998tkNzINeY8/f0YpCQLMs29resmzkujSRRbMTVnm2Wl6V8XByki1mJ1wKwljYHGBGCaXUatu2XXIOACrSrMxSbHTDcwTnWZZgAKWUCigCEcRavinGBIBgbFuWTRnUJlquLMtyHCdPE8n5armuKlGVAlMWhE1suTKKkjyJ4qVcV7bHMIZRtJrMp1mWQ23iaO3YzGU4X59jBFCVxNMpRjQvRCk0sWxkwRylBFOV8zxJfdfjCiBgmq02AfDD++90Wu3FbEoY3R+NOr73xy8/P7u4YIy5nW1jDJAIQAS0Vlwgoz3XrjhvNYJKCkLRer24vr6qk40S2I5tKyFkVVFCMJLawgYy3/OlkBCbMGhCoyQXFJNet9VvDTudTpakw24vCAJjar8eIf/D//Bvjo5uJ+v4yz9+DQ0iBPk+HAwGxsCvvvp6fH2xMepGy6zXbyLorGc5cKhb5FwJBGCWJRpRBYrpfPr1N19dXJxtjHpBs+F4LM6T+XyWl0UuRCIFF6KQXGnAjSp4VVUCU0tyzigFWmdx1hgEw/7QcT3fdgik16fnJ89eGE2k0CfPjz3HzbPk5vr85bPnrVan0+4vFvOHDx8eHNxaJvNHz75ZRWsAwF/+i39l+3C03dakvL/cR5QprQEm6yjqdrtbO0Mtl4uJqfHdH3388V//9X9yXNcL/DRPmM3qZKkBXJuSUjTsjtrt5unFerEUlRSu55JKZHlJIGr4vW57e3urGgwGGEAhhJFiuZiURbE9HJ2eni4Wq/lyPV+s84oHfmu4MUzjNFoub9++9T/+9//m8GAnWsyjxWK9Xo96qCxzISrbob1ebzAYNBsdxlwI2GoZHT9/ajtk0A3eeXA7zRc3NxftdvvFs5ez6WJzM724uMiyTCu6XE0fPX758vnLMLTb7S4GVrvdRdByneD85LzZaBdZ8fTxU4f4791/f7S5YRRUXKzi2ETaQHX//judfufly+eX1xeL6+V8NcOUOq4NlVguJojRZruVV0VeZEpUQBuLIYOp5FyUnDALKFBVHCotXY9QBCFWQhDXhQBzzqWqqGW5jq8QLIpC6aISSmvgssD1qDYoK7Oq4lWZGy2TdZRlGcE4WUej0eDW4dFf/83/F0I4GAxs11uslgoYhxDXD+phRC1OaK211EopDWWhRG3aejP6ra/LruvK6nWUqzZ11ZSYslBSa6NhWfLr8c2H7z744IOPfj69Xq3WndB59eoVIgRCuLW1/c5g49G3zxosVxJ4YbuoOKYOJgwhlKbpeAY6TfDg/tvvvH0XAv3i6dPJzbUsS+BrwTlQEgKaC0WRKYtsazQsy/Kv/uNfKyXe/+BdhKDWuipKaMDh3bvNpi9VyYWSWkIMKs6jKBnPZ+Pp4vjs/Pj8cjxfVAr4AYCAEYQ9zzNGGa2UkAwjh1lSCmy0Q4kWYhVFRoNRf1CW5c3NlfPOwWS9LItqa2f3zv17X335zWw2sx170Os6zJpPZ2kU97rdLImXs/nezm5Widq7qpQqeXV5eSml7Pb7QoiLi4skS9M0rQX/wWDwo5/82PIbv/v950+ePwvazf2tTc8N6jkaIcwY6HgugRhoA7TmZaW1rvJCCd5qNrvtFjbaYRQABJGGSK2j+XK5UlB6nksdwo2AWiMDGWNQ6zzPjDFpkqxXyzzPP/nkI2PUdDqeTG5q2k9VVZ7niWjVaAaIkuV63e60BC+xRVvdlu+7zLF93+sNeoHgYbNVKRWNJ0dHR5hahL1aR4kGEAKMEC3LHELMCHNdO7OTvMqtuqRN1jw+WJ/VIaiNhK+TIBBohFCdwsffbRTQdx6CNxaEN3lI9F/2QtW3wUhjiKnRQHNhODam5iWX2gCgEcCknjdII4RIksTygu97IMx32Mc3EsKbr9Z7iHruUC8JdcUaAKCOTtTvr9pwwDlfrVYPHz68d+8+pbTbazeaQZ37Rwg1msHFxTps+JThLMvErGq3247jKK2B0cDIWjKRUqbxmlLa7zSKNDVaetjvNsOtzcH9O4cWJdPx9edPUCt0h8PN7c0jAK3ZdDkeG2b5EMmKp1rrej7iWe5ysa5KEccpodTxasgBZZaFvkPlvtGWEMD1c4oxFhJpDeoRqlYKY0wpgRBiiA1QSqlSlQAAjGGt8TQaDaUUJSxotmzLLaoyz9N1Ej99+jQvMwUUcwi/KdfxSilhO1a0XHuehyECSgutEcSB71vUxpBkeZlmc8GB7SCKidG6SnMMFcOQ57kS0rEdignFOEmSOI4Xi8VoNGq2Osz1sOUS5jS73Vma1U8mYxZCiBEqDIAAeWEDQZLnOdMQQqggthEBADDFiYQIQMVznstSlEGn2wyDRhASQlzbppiUeRZFUVUUSojZbCJEVVUVZkQaVQMVNNSk1fBGg85o0HNtmyIWrVZXF9dvvfWWbblff/V4tZjISuVZebDTD52B5znXyVlaFhpASnRRFZBKAvVsOVmsZ0m+bnWP4jRSmkWL2WIx0wRJC1dVlYlSKA0xBphgSgilGJIyzSBxet3Bzsbmnb2j/f19oLRPnFcvT371t784O71pt3t7uweXp2fNlq+1yIuUcx4EQRAEx68utX7heQGHVYVFYcpOp3PnnSNKKbF02LAOjkau67quK41eLBa9Xm9jY8Mh+a9+e1UIeT2d3bv79jqN8rwM2qEhOuUxxsZxGWVAS4AdsLG78eDd+zs309/+9g/PX5xgbFyv3ZTtJOFZpAiTvteyYFBVWVlU0XKRF0m32759+8Pj41NC0MHezuHhoZTq+Ph0ObncGG0Bnh/sbG4OB+v5Yjqe8kql6+z/8L//n4xRBtQ0aJTn+cnJ2cNXF5//4WtgiG27//pf/8tm4MuKZ1G2OdxMy/jq6moxXy0W0Ww6bzQaR4d7UpUG8Iuz8zt37tzcTP72b//2rTsPbCvo3R5lOgUaEESLovr8D19ARe7cest1vGgVQ4IRxpiA4cZgOBwMur04i0+fnT568vji6tw2ntcIEbbSsogXN5XgderMYgQow8tSC4kxHvZHnu1oLQmG/W4HaJWt00lWEkQJtQAASmkIlSAKYAIhJlRJnVeVgFhzHkBMoBEAKsoQqm07QmADjFZvv3XXtqxaehVCIM4ty6K2pbQWSmmtKcOUUiVlWZZlXgkhgNKGYoxrbBp8Y/N+M46t5UFj4JtKXKmA0JBRGxD95dePtoYbP/3BR+8+eO8Pv/65495qd/vD4TCXj2br9O7du9s7+6evHidJapD96vRKClhy1ex0ANLbDto/2j483Gt6/vHZ2fMnj7P1uiqBCKRWCmrDMMmrInCcOE7/7Ke3At999vJZt9UMgoAQvDEYzufzIAgGwzYhJIqWVVXVDrX5av3y+OQ3v/1dlJZxmhZcA00N59E8ilZZrz98nUuV3KFgtDFs7u7YDpNS9jpdKeWrVyc31xPbtjudQ9u2V8V6cjpZRWsa+Fvb22lZvXr1yki1XM6h0UBroM3+9o7gZVEUD95+p7mYHB8fAwAODg6klI8fP/7m0aOtra3z83PLsYMgKMsyKwvXdQ9uHe3u7r68uBrPpqvVqjsatdtdQ3FS5lKZ2pPoOK5FLaA0zwuEiIGIGJVHq/2tjd2P3yuzUgihAeRcvnj1sihjDbnnM4NFkhdcCOpYMs8t6vGyilYzjPF6taolYt9zBC+vry4m4+tasU+ShBK0SlZ+K7B9O46WQXPj5moJIKGURPESQGW7zCBoIEjLPC6y5WJNIQII2r5r4iTNMwARAEhr4zo+qrDWGjKgoO6N+sjCBc/frMQAAAhqpId5I/gbYwBA8Hvcgu9ISOb7G4La11z/uvX3EEkQQqgqLQVAutXytod7Dd8XQiRFdT1bISy4hpRgiqBQMM/zIs9C9Y92xdevcCm/74V88/Phd2SF7yhnrx9Ju93e29vb2NjAGN/c3Mxms9qfb4wpiqIGztaLaBRFdYK3rqKu36dxHNcBFiklpVRzUJaF1tqyLIdg26Ku6/g2fbWe8jz1bWojeTDqbvWaTd9jKncx3tvcDINWkSRSl1VZFkVmsB02nFW89D1qtEYINZtNQohlOb1ez3Fd23OpxerJO4RQSQMAAgAgRAhh0EgAgJISQVzLNhBipQzXEkDOOSaE1PQ5jDFAAGPsOF632x8OhzV9i1gUISBksVot87JYLBZFmWgllJZxJYSotOQQQSVkr9keDYZCiKrIy7zABPY6faVUs9GVUvd76zwvKbOlBpxzTGmRr6hNJ9cTCIDHMKTYsqzZekkwpY4T5+V//vVvkjRfrlJs+3n1uhRUaw0hwhhTiCizMKYQQqOMKbnUACFEpLFtAwAAyQIK27ZsChTX3Dak5zv7u9sY1Ocrw4uiSNIqyxUXCCFBdJysINKNRpCXRZQsESVaazIc9RA2FKHtnREyBBjBq8yxqOs4RVooDii2Oo2hkvTkxc27777b6feqkhujKMM5r1TJKSUUg7t3DhgxvV7r5PyVa1tGc4mU0wiiaG0gpsjBWgOE65es6yhRCqiN0fLOW2/97/7N/9hvdyzK8ixlGp2+PMnjzLfdXrO7MdiI4tXkZmyAvHv3DqUYIcKrkjLMGMmyJIOi09u8mSwwdZ69OPF9fzab+Z7zv/wv/25ra+v+/fu+72ZJ0vQCKFTT9QeDQZZlZZkjDFvt5mz+vKwSZsHR5rAoUwAkZQALRCi0bNxoeI3WcDxt30zPijIl3KEIY4irXEbrEnYpAqs4mhVlvF5NMJSH28PA88u8AAA4jB4dHe3v7//qV7/64osvx5evhr3hrf2d9XyGMd7f2b9zdCdNc1Asy6rM8ihOFpPJzdnZycXFzXqVGQGkgE2XehR5hETT+Wx8U/ieP/QwxicnJ+fn11XJbdve3hrt7m29+969P37+2/39/S+//PrseHxxcWFbQbczHO211uvYtdzDg1svnr367Hd/WC6S27fe6vf7zPIgNGWVGQWanaZFme/7O70N37WVLK8mV4Ln2CKqyJbJynVdSkhNK8uLXJVVGIbD4ehg963BYBB4jmXRVjMsszywPYdYNzc3vOQQEcwoMChNc4IZtS1qK1NJoUseCw0BwpbR2HNsz+6mcdZqNF1qAaU3BsOf/OhPnj/+9urqqigKLoUlJEBQaFWU5WK19n0fQQIhFJwXRVGVXEoJtZESUEoNod9ZqzQCsE7Sy+98CQAgBF5LvoAgWZQKqGa7f3V+8ZvPfr/R7/WHWz/703+yNWgRbBaLxXKxnq/WX37+5fV0Ol9MpDCNMKkq5XuNy+tZrxdYNvrgww8++fQ926FFnh4/fz65mrkWRUoArRUH0GgEiTEQM6qMPrh9J8+idqfX63fTJG80g06nd352Nuj3CZJKi6KUAADHb0sAr65vHj199ujbF0pDxlzHCyjB0JRlyY0CGAFgBMPA9YLNfnd3ONjcGm2Ohowxz/PSNDVV9fLJk6eXl3t7B++8887FcnExvonj2H/+tNvuvfPu/SDwfvOrfxgN+xvD/t07t3mRc84xIlroy8tr1nAAAFmWxWlq2zamdDabXVxddjqdn/zsp0d3bn/22WevXr1CCNmuM55OLi6uGmHr4OiW63lJllLHhQBXohD8temSUAtho4QmlFqWZatqNrnih7v3Pv6obi+kzE7T9P/5P1/EWcpFziwMCFClwEYjrDwLNzwrTQXS3LYchgAjsNtuIKCMFGWZl2XueR5jBCGgtZTQpEWEIaQWiuKFkCUhpIxLx7E5zwlFAGipVCm47XheA0yvbxREQatdKS1mszzPqUVCz4MGrddxmQmpge/A/dsHzLNEjbjSpuZjou9Rj2qtC2Osdb0/eL1Cay3/K4/Cm0P8dwHL71VNak2ULKvYscnB7q1/8tMfb20Mj89Ov370HCA8j/M4LTUASinJRZ5lgleV+se8g/mO1vxGY3vz8Ua9gBDWYIbaLa+1rokIxpjFYjGZTNI0rU2LBwcH77//ft1TU88dioIQghqNIAzDIPBWq5VS6uBgL4qi09PTNE1936/fnpyXBnjDQXtna2hbhFfZsBeUiQochlVeZfOr46dZGFyfHr9z+3a7M5jN07//5e/SQje7/ZoYEcUizbNWe0gQcBx3uLkVhM1+b4hBwGxLaJVmWcklQJhQixCsa3+0EVqb1880QAAASi0AECEMIYAArOcvlOG6NokQjOoJESGWZbmuO1+u61EO51We5/PFRAiRF0kjsDEL4ni9WmW9Tmt/f5/z6uTkZHu0ORqNsiybjicLoQAA2iAuVKs9cF13Y0NlWSalVkY7tttut/NsrrX+4vM/RlFEqVVv2VbLFcK03+8riBazVVFUmDlI49l86XiOAQAZYKTSUkMIHcuyLQcCADUylrAZo5QigJuNpjFGyyUlgGEtlC7TeD6fo7LUeWYxWyklpTZK15sqgjFGWANZFRxh2O60aIrinAEAsrwkO9ubvu+rSl0uF7PJLIlX/W5rZ3skysxzGYHh1mhrMBgs54tf/PLXAOAf/os70/lCFgU0WpZFmucEaceCD+6/1W66g0H/6voCURR67YoXleBClAAAZiEIsZSyzCsjKqQlkNy1CIaq12ncfu8BAGB5ckwIOXn+8sXLV612t9WihNL1ek0oXq0iy0adTstxrOVyWZZy0Ou2Wj0pqlToRnPUbC2XK/7lVy9sRiGEd+7c2d2+1+m09nfudrvdLMtarZZDKYN5q60cl1o2jpP5D374wTqaBKG9sdWBUBXjZRyvLJtSihhzGGMY07y4PDgaQPTg1avJeJxVAlBiY2xZlHoWQ1ojrYgGmgvbYZuDkVJq2OsjDIzRFjF72/3ZwdbFq29B6Bwd7m/22xenx9vbe1XBA68JXfr/+p//H3mROC7u9ZvaVMZU29ud9959ezGPP/zgh4Pe1pdffv3bz37JefnJpx998MH7UsperwchvLm5cWwXAJAkieu6e3t76+U0TdOdnZ1/+2/3jaarZeo4DtQ4jVK3Fx4e3p5OosuLm5enZ41Wb+/wqFLatRhlDkIEQcbLuIBF02t89MGHw0Hvm0dff/nNl9fXl4DCQSOAECpgTFVxrYHSnUbz6OjW0dFRwxttbW10Wi3btpqNQCkx6g0+ePDBP/zm10+fP7seTx1AbNeSFS9FhRCtgAAAYkQrodbrNYDU95qdTp9iNh/PfNsetjvXF5eddmtnY+MXf/d30+m02Ww2Wk1MWZKlaZHXGqkQQlIJAKjKsj7u1MHLSlQQQqDfDGghRK8d6QCA70xhtecMAgAKrhUgaZK32oP9w9vL8fVXXz++d7Dx7lv3mg42mj99+rQsy2ajPZ/PkySZjOcYWQjaCNIgaLguybJstdbzxbTT6bTa4enp+fnZRZGDfq/lOtoQCxgDgGGMackhwogwatk8Wg5GG0Crz7/846cff7i7vfvtw8eu5QnJMSIYY4s5XhBGSf7y9OL5ixOIqJa6qITUKQQYQTzsdjqdDoeVUhIC4NsUS351+ipbzXQa37t3z0VQQYC1hIoDVRV5vJiPS6mEAY1WJ03z6fTx4cHevbduHz9/tre9dXN9maSR1vLk/Np33LIs5+to/94hYSybz3//+9+HYej6XtAIb57fNDsGM4oxNhAEjZBSOhwOGWNZUfSHox4YFZInRUEMgIwqqYVWWgNSt0siggmjtuMHhhqRJMnNzc3Zxenezu7t27fb7e7VzbVt4fkizZPE8hyLOK7DKsGFKJBCQBRAlQQyApTmWSGyhMCqTClG0EiCIDS6XgezLA2b3jqJoDJbG535Yry3Ndzd3FwuZpyXeVlpxTkv65eK1GAVranjVmmKGB1sDt2mP1/NMcatVotARG/w5GbOlS5k5TbcnGeWb6My1VrVsGaIahMuhRBallUjfrUGUkopX9NHjPnHwCT6DtOD/stwxBs+EgDApcpySa8dHOwO793Z6/d6cbREpgo8u5QqL6qirIRSUlbAGKhBWZbfN06+8S3WcuAbS8SbexFC1itknUKM43g6nVJKz87O4jhWSgVBIISopzlBELTb7aIosux132Cj0Wi3261Wq4455Hle5yCSJOGcp2mqRW7Z1LIsjBWmstFiFsOrWcmoYA066rQULzGU0XpqRJ4mq0HYbfhBvi5NJXheioqXZVlpLoEAEBBGKSYuswhmRV5pZZTiUqtKqCTLAEa26yFEGLOAkkrqN2ZShAhCBGMKkAKvGRWgPkLUvlcEYd1qpYUsyjyKJKUzYyCzbcdxANQQwiwXXOQAaNuCWRbb0CHINENvd3PzaG8vjuP1fKGELLIyWierdRzFuTFGGpokyWQe2batuKiBj2EYtpt2p93+wSfvCiGMBi+PT5I4i9NEI6CAkUadXl5Ranle4Hh+DdDc2NhC2NSP2aYWAABoQyl1bU8LSanV8HxKKUUYQtxoNKSUWkHGWF2s2uu2k3XCmE2AUVUFIbQwRpQBAIQQRV4URQEtVYu4rk2hVkgLLkSeRWQxnVR5JoQ6OX4uhPrgw3dG/eFw1JlP5p7PjBYI60bo5nEkeamFTKIYaY2N0ZybqiyTqKCIUuxRb397M2z4vstqTXg2m02nU89GAAAMEUJEVgZxgCg0iFZGUd+F2vAqjcav8qxczGa9Xm8crSoEgWN7bugy3w/CdruVlllRxlEUGaAajYZFSiNAK/CLnOfL0mbuDz/5k1evXu3v7J+cnBwcHOxsHu1u3bq5uWGsqZQFgIHGTVKR5ci3SZFm60W1Xlzfv39/e6Pd77f29/fSNAWq1DwHAFiI2tjSlYkXCfXF5kbX8zzHc71wOp+Vy0W2XCZVqReLtc0caIBvWcpvNZvh/uhgNV90Oy0IwXo5jRbT1fR6o9f62Q8+DsPGahWdvnj25ZePz16eJZlAkCpljl9dpVnUHzQ2NgfdXrfZ8m2bbW3ttVs9RoMsFRXPMDHJMrq+vnZdZ//d/e3t7ffff//6elrTdH3f55x/9dVXq9Xq8vLSdf39nVuO3RgOgJIQozL0Wxa1bNsPw0ajUeYlv5pMHz761nHsDz94r+X7eVaNxSReL5vN0KNWJ+yMesO97R3fdf7mP/3VfDmHlgUREGWVFaXRsNXqbAw3drf3Bt2NptsPrRBpJEtRooIxsjXaOdg77HR66N//h+nkF0VW2m7AmF1WosirWEpKKQQ2oQAAJLjWEkCDjDRJFNudbq/dubk4N4In60WRRsPh0HGcoiqhVBBCxlhg264vi6KwmF0bvsqy1PJ11Im4ttZaGfCdnwtJ/fpcBQGozeFaAy1V/clc6Xavz1U8ma9bQSgNms3man/ryZNvkcxboY8RHY02v315fHJ1s7N3+P47D8qCc659r7G7uXGwvzuZjHWe+b4vlIzi9NXxyXgeMRdh5pe8DC3XmLpQm0BMq0pAhE/Pz5uh32g1r87Ojo9Pf/Dhx4f7BxuDUej7gmtkQQQxwlaaVy9fnT16/PTiZmJbvjJCK2kMQAZQShuevTXs9XaH05vr5WJGjMyjVRKvy6XXcdg5xbdu3VJVGc8mqiq2N4Y7uzth4F6u1xDiwWBEMbw8P7s8O711ePSzn/wJIeQXv/r7k5MTRu11FGNmIcepldysyLkUtutoYKbTaZJnvaErpTw+PSl5labpcDRSSjVbLcd1Hc+P4lhoBQnGklRSAqOlAQYgbZQCkCJcK+sEM2YDrDwXokUU/+JXv345OhZKb29vv3rxcr1cWpgMu528LGbX1zUWMPB9WJQEiqbHtjeHQRB4rmWMwZTlSRwtF3G0YhRCaAhGvmtLo28d7V+cnpRZ0m4ETOWffvDej3/wcRKtfv7zn5+cXSApLQi8wLepXeXVqxfHW7t7i/WKK94fdEedjUYv4FI6rhW4gd8KHd8ZX01Xs0Iofn5zQV2LUgohBEAZYxB8DUKozYnov1yw36A+vr8nePPBOf8u9fNfIJZdZjq93tHu5sH2kGFdJCteRAioPEtFJbQSUlRKKaQNY8wiJFf/mG54c0cAgBrd+P3dQy1d1I+qVhTqY/Sb2ggIoW3blmXFcZxl2XQ6vbq6arUaxiiMoW1blGJCULPZsG2WZajVamgt43hNKd3b23Ec6+zsDOBiY6NrWTRJI6CLqowwtiDiGlW+a4Ud38ENmzIEQSHLyig5m0+vJ3kFtoaDRmUyaeJkXQgetPzBaEQthyAQhM2iqKo88t3QZhVAUNQNh5hKoYuiUEpTq8YoUYIZxAAhJInAGFdclwVP07QsSyU5hLAunkbQ1MIJRVBKhRDilSjykkuJSR03BUJUghcQGqUFRApB1es2g6Dhuu50PFmv1xii+XJRcbmM1llWCAM0QJUypYKT8YwSIqW0Ket1rVLIy6ur2XyuFJdSrpOyKKUE0PZD23EcvwEhrqpKVFJrjSH2bZtgjBCSSgEAGKaOZRNCjNJv3KkUAICgULLklZJGAiM4r3jkum7LENd1meMHyIYAKIgaYUgIxQDWgyfbZr7rSOlbLqyjPRY0ikCidZJGIolIGIZaa4oRY4QS1L+132o0x1cXNrNuHe2mUYKR+vbpN1mcNZougvLRV1/v7+87lEEpXUKkzRxggNZVElmuk8dRt9PhnGdFUWdvWt5GURSScwiwsVloURUIAJDk9eNztS7/4dc/Rwg5truMpn/32W84l998/arXajXDdrfdaQR+Ei9Hg3aUxBYjvbYfLaM8S3e29kMn+PbqCiN7sDVwnTutVuvy4kTJUogCAHR5fVGUZaPRAABZtuv7/v7RLWd5Gi1vlMym0+nR/obDYLyaTixweHioxZZnsaqqOOeCq/n1EoqXdz9xpOSWTXb3hq1WczKNz85v3JvV6cnValkSbAVuw1AXamhjj0D/4uzxzfhmNZ8LkRZx66lH33tw/+N/86+ePXsxvrwc35xCJY9fvWq3NwwkQulmc0MbXFbi4nISpyvC1Pb2Ztj0/NCPo1wZ85Of/cl8vvziiy+SLFlFa3cyCf3GD3/4w+vr6W9+/dlqtVq2wt/9bhLF8+3NgWVZp6enD7/6djjY2drcR5A1A5as4zKtun3sOn6zrabTeVnx2WKFofnoww8dx7u6PIeKayWbYaPIuNbScWnDa/zgg09UVX3221+dX964LrEd2292CHP7g41be7eH3S2LOB5zEQC6UhDDClZVmhOLMdY6Orj19lv3T47PTi8vq7yijkswLiuhlVUpIIUmFnMcDxopBYyjjGHS7fQ82yYYdpuNjeFgMZtoyT3P45yfn58TZgWNUBoNESrKynVdizl1G7VlWRqbqqqk4a+ns+Z1uswYUJsWCWEEo+8SaEZUvM62Gcy0ga4fLBdrWS2BEItVlMTZ3Xdur2eXZ6fHd+/eef/TTzWmx+fXJycnnftvOxgrLTuNwGLYtSygue+iu3fvaq3nq9XFzTSrhOU2cgEFYFoqgKAxRlZcax2XBULwm0eP93Y3T1+dRMsFAEApo5TxXFdLDQGFgEoJ8ryKptHDR9+enF0ZQBChWBsKoMMsoyUCEAAOdVXmcZpE8+lYVpUFAC/yIvBDRm2IPEJzUaXR2rUwYmy5mJycvsqxhzUyUkllsAEnr46BlA8ePAiC4Pj41Xy5dDy/MkoQiAmuUTl1fG57e5s59uXlpWd0u9sJguDWrVudbldpHQTBdDqVUs7n8yzN5/NFxkvEKCAY2zaAoDbSG6MNMFproGEpZCW4FMIgpDDOuciKxXIdcan3tneKPE/jrNlsNhqNxWpepll/OLz91h3Lsop4mWUZpuT+22+1e10ptR80hFZPn714+vR5Gq0bjQBCLJWyrDbGeHM4UFUeLSCQ1aDbbTrWsNMaNPzPLeYxMmw1kn6feY1Oq93rdht+A2LiN1sAar8ZBqHrNR2lBUJIStnuNxEGQdCYNRZBO/zqj1+v0nX9MsMYGGMQfK1dKaWEkAQzjDGE/0hIrBfsN26A7w8IavMg/K7EGXwHVOg0/cOD7Xfeur2zPQRGzCazyfhqvVzMJktuqFKm1s9qtYwQUlYc/Jcf9X29iUJ8PyEJvuND15UNtm0zxhzHqbnXdfAyjmMp5ebm5t27d3d3d/M8BwC8nq0g5DhOjXKybfs190Ipy7JqKhelFIlpt9dGCKwiY4CUIOWCa1Rt7w0pQYhA5thZXtjYWi2XN/P5jt+fzpaI+cNet2VozHUmqulyYTvO1tZ2FC+xxs1Oez1d1z4QCGFZCqEVIrh2UShjLMvywxAAVO9+CKIQQo6E0TDPSyl1XVchOOacl2WptXZthxAJAGDMtixTM2Ft247yRK+V4CVCIEljKUtmEQx0GDitVqvd7iKE1qt4Pl+WJYcQagBKJbSBzPeRA7jU2PEsQHp+WK/rNiPNMABSRPEqSpO/+8WvldZCiKSUrhf4vg8AaDabaZqOXI9iUhWFqgTUpirLLE5cL1wsFsvpDGLieV7tC+FcNlpNbWBS5FVVZUUuhAqLUEq5TtaMMYrGnJdVWUouFBdSyk8/+ajdaPquB4zBAIRhONoYNhoNoHPbtieTCYSQUIwkb7o277TJ7du30zipba6nJydZFrcaIWWw3Qnfe/8+Mmg2mf7V//pXi8XSKP3NQ2i3xc7GZsPzpeTMc2yLYgwrUQnOFUaT6dSxrPlyESUxYVa33Wkyd7VaxesIAEQQ1q5jjMEAAwOjKGp1e9E6OT19GTYbw+HGs2+fjdeLTz/+wbcvTzk0F5ObdZoEjnN0uMscG1NSE91n02myyjzHavjt7c2W0VDxaGenP5stCJaz+XVZ7b48Pjk7O3EcywmsNMmFFn4YtNvtt27tRcuJZVmBY7mMEKC/+vqr3/063djYAADalhsEDYwxNFCVqkzK4+Mb3w9bnV6n3bAsZpDxA3b/7be++PybZ09Pi0RioHlRZkme0GI+WWutkQEImluHR712sF7OT45fBK496nW6nZaswLDv/4e/+s+txjDKouvxjCjlB63t3e72bscLgOvhg8OdO3fu/Pw//+rifHx2ev3uux/eOrpz+/btzz///WQy+dWvfnXr8PZPfvwzxtx//7/+hyiKXNddrqbz+fxwf/vBgwdpmj/86iVGjmOHaVJCXbx6dcws5+NP/8S2bc+TlCXtdvf9Dz949u3TvCh9x9VS2cySwJRZyQy2HQsbQiC6fXRn0Os0G8Hf/t1fjyeTnc2dnb0D1wu9oDXobzZaLQiw0Rpo6Lp2GIbMpnG0EoKrUkij+/3+4eHRIkrWUWIDRKiFkHJZM03TLE2ZIrZFIEC84mmUB4F3+9atMsu0kMPh8J0Hb4uqKvIkg7rZbO7s7Lh+ABC8noxr21R9GSWEeJ5n2zbFTAhRpNksWn0nNtapM62UqqrK8wKL1NAFJKXmZVVTehC0bqYz1/F9P/BcR+bp+Ob6888/96n6ySfvja8unj9/3uz0ep3+xx9//OT5i2/++NX+3l6r079z+8hxfd9zIIR+EBgAuNRB2AybHUKdLK/yQrY6/SJaYYw1UBhjg0CRV0HonF6c53l6/PzbXru1vbVr27aseBiGrmXbtkcIkVrklVouV5Pxoix4q9UJg0aaJZILgqGWEAJNkEZQCVE1GgGF20grB2OeZ0hrjECRJk+/fYwIvnV48OHHH2ZV9cWXXx0fH9PWVuj7eZKWWQoNWM7nq8V80O/a9l6j0XB9L68qgIkbBhARv9GAUG5ubs7n87wqO/3eX/7lX2KMV9H6m2++abfbg8Hg1atXdQ0Hc+w8zy8uLrIiz0VVCE4du7+5ySxWcW5Z2BijgJYaAClf1xNzgXQVr6PQD3rtTp6kX/zxq+nNdG9ntxGERuksSS1sffDgg5/87KcHBwfT6fTRo9+WZa6lAEYSBINWY2trR0iptX7x4gWEoNvtSinXUVKveVIIh1kFQpOrm6PdjdNXL58NOgyj6/OzZLUkEFGAdCVkUYWev7WxlSO92dykDpWyzIpUqBIijRAqiiL0Q8u1dvdb/d5wZ2/nl7/8h+k07jj2G3kAfOeQ1VozZhlUk44QIaRetAAAlkXfqAvf1xXeLOdvqAk1k2DQb21u9Lc3h51WAyqxXs3Pzk5evnieCYDtEGGXYKggNNpobfR3G4Lv7xLeGBHA93AOb/7CRVW7QWtGOwCgbplqt9u1Vlfjojc3N/f39xuNxmo9o5RCZKTiWmulhdJCKeV6dlEUnu8wa/D6vwC9vf0dD/ta67xMm8DHxNgOM0AYJEshi1LNy2pjMIIK9gdtjbAC2BWYQlCURVwWHFledzgYDFZ5YoxxPPfq+tyxbM8NcpYD13i+X2ZpmqYFr5htMcfmQipjMMZZVhBCoDb1kwq+s23WfsxOp+P7LkaoRqoAoDutNmPMsimBqDZv1gBjy7K0VnGaYAik4pZNw9BHCK5WK89zLYJns8VkMtMKUESklI7nYmoRqRhmlVBFVgptJACUMYxJofJsvYqiFQQaQxD6PoCuKvNWr+NWlet7ruvOlgtqMR/4l1dXPM8arm+EzNZxp91+/8E7dtB+9uzZixcvyoojF9T7M4g5Zcxy7EJybpSuoEYQUoIxQsJHFqm4WGdVmecIQGi0lOpmPCWEuK7LeRmt1jc3N5PpTSMIGZbD4XCxWFBMut1u6Lo2IZ7jkPHZeVFkVVVRBI72NzjnnBetnstc0Oh1Hj16NDzc+PP/7s9PTs7Wq+jq6ip6NtvcObn7tgUo7LTb6+XM8xwAYJWmWbF2m06SrhiCASJASAtSYFJqSt/WhABMlBCci7LGlXRsIPgpswShAOh0tVhujqzwn7zNsPqnf/npHz57eHycM5RvjTbRyToMts+vym4bAp3n3CsBevJy/OMfH1HLazabju0aY4qcO443GG5YljXodV+9eK5kIYqEV+nF6moymRweHhr01p37t8fj6XBrs9Hq/uCHfwaN8+LFyXqeWJRJYkxR9Xqdbrsjpbw5Hl+uytHIDawmxmE8Pl/dRIQQzwPDMIgDJ0fV1uYOBOzs9ApjeX39yA9I9/Bo+2d/Gnp+keWPH32Vr+Qv/+6XCKvRRv+9Bx989dWT3W2ymD3CyN3oObfv/eDTTz/xA4aJRlitoylhdlbCrBLHF2dZUf3yN7/+u7//hx98+pP33/9B+3pyBM5fvjj93W9+qSS8OjvPczAdj8fjy+ub5Wxv9uWXf3zx4mnQJJYLl9E1pU6SZYvV4u5b97vtJudSltVGK5yfn5r79442+yKNSgsxYtJsZdusVEUsaDfwoG1VWhhIG9uHP/lnbm/n8PPPP3dd17IcCLCSaL1OpICMMafpYIpdx15Uq2KdhUHQ7g0MBJbjDqvdB5+oAtBvHn67jBOCiNSgnGeY2ZbNpMFJSZUSvJRVtQ49+uzJH//5X/xpq904ubiMZPGHh9+kjltlRkK71aGiWhmVb7RKYHLLslfLpQc6GjKuqrwsC4gkVBUWBisAAEYME6SU4ZzX1GcMDcHAtlGv3fIDdzGbnZ2fKFmUGe2GtuKZg4hczYEQP3hnv99uKki+fn6Cws56NfvtN1/HWby9s6XMxrd5cjUdJ7zYnG1sbG80u6Q7sqeLqNExs+WrB9sffPrDd//hN7/2XJtSlwCSmAobbADUBtiWjwIyzwtLwFW8ihOcF/F/969+JAUs88q3HEaJyleAstBrKCXms6kCZrC1xaUpAEROQ4K0rDjBlpbicpEU+ubjro8JaA5aF+dnh3tHjdDP02Q+HT89eWLbtlKmPxx8/PH7BRd/+1f/fn7OaXGRB+HRnbuGOdub+4Sg8eXF8dVsONq8c7A7vzg5O70Y9DYun7zcPbitdCnc6t6dg6eq+PqrL3YH/o8/+POtrc3r6+vdDkUqOX86a1B6en4ThF2Z4sV1Pl2vESWl0mklGdOpUARLgZlUQCoQuL5UZr1KtIAQueto0m05mInZKqLMGY021rPZPImGhjf77en4Ugjg+Nb2re67nxy1Ok3oJuenzumrZ4PucHZ1o0t5c3n9r/+b/35jc3Pwbv+Pv/mDGJSGYgnV7u2trx9+s7E16Fm2SHBzf5fC3cP9g367dT3Lf/mLXyxmSeA2k1XpQmu9ii5XD2/3BqsnD68q0Oi273/wIMUmFwm2nSRLCNRIkyqXi8kCytndt+6v1rOg7QAIvMBPksTUFQ9a2Mx2XKssSwS042DPsymib+SE1351jDkXSZYCAGzHrQ/0lJEyj6Q0rm1pURgl9nZ27t57Z6elGCMUlpWskrS8iapIsMLYEhqMGCQYCIUtiogHMdJah/C1J7HefNQzBYQQRKiOP7yxKbw27zGKKSrLshJVDWPWRiuD4zSK4qjT6XDO/dAjDGOKTs6OqR8yjKAT5HmRJElVlLPVGgNTlZntEEog0FwrrYDhPKuKlFi0lv0cOxRVQRS2qe1bDjIAaEAdSgVtNFoHvaP+3V6elzOMv/j//L+Pj0+Z5STZqlPi7lZnWw04571W51kpg4bf67RuLk85yEu1kgissyTLsnar49iu5CIuqzItbdexLbfWSDQwnMucc651mclRv9fptIxRBkjXthyb1MJ76Aey4uenZzfX1xSRTqej/Ry3cK/XMb6dpJFSot1ud3u9vCyY40U5v15cFXlVGmgARABBy45NjpXCHoYY2RpTGxoFQs+VlUyjmGrdbXUt5vCqqkquOWi0jeTlah7brlfler1cFEW1ni0mkwnQphEEgkcYGo3VJF60slXLtgXWjUF7r9nsdwda69VynaYppowS5Hleo9kE08lkOpcIJGXRbvtRFFk26w07EPUIIXleOr7X6vX8wQi3mphzq9VWSiUAraQMM3H1/PTk5KQqsq2tDYxxVRWDfpcQgl63FxqpNeS8jONovV4HQXh0dDQajbqdntag1epQwhaLxYunjz0/fHVyJk11C96uRAkxKKvM991SK6Ol1hJBhBlGADCGeGUgopaNCMEASm0gQwhCUFUFwsh2me26AAAESc3saw8Hjh0OBgPbcnd2Jppji9oEoryaZkmcJOee65a6xNQIE3/16LPLy8skTmvVK8/zdrs9HPQazWCxnFk2ffHy2XvvvTfod6+uKtdxxjdX25OOKoRFmOUFQKoffPThsN3zvfD8/HI+X64Xy3oXORqNIISXl5fSLxmjsjJaoTBoSWHquqMH73xw6+j+apmkUZalFdpnjFkbGyMFc6jhKlpeXJzNx5OXz59tb/YhElqXV1cXnh/cvn07Sjg09s7O7Xa7H7SHp6fHs8V6a3soZBrFy5Lj45Pnl5cXaRqHQXt39wBB2/Ot8/OTq6ubjR1MKKKUDPqDP/2zn8RR2u12r29Oowg4jjMc9W/fvv3ll9/kef7+e/fm8zXUmNmOFwbPnz9fr+PhYNP1vE7HLsqMcx6GvtI+V7JWERljjuvVyEilJLOI67uB39ja2rl9+63xeHxycjKfLbU2lIp1tKxKYccuw6TZCoMgsJklLJ2mWVVVvYE13NymzM3y6uT0MskqXnAFDGUUYgi1MUrVnQ5lnhPIT08zXqwvLs+6vfe73e7rEDnGVbleTHLb1oxJ14KtVq/VanqO5/ntNBNPX56PJwtggOUwaIAxmrVaRkMAADKoqiqBBKCEIMw5xxjxqBRlsbk1ajQaNRAaYamVDhvevdu3NnqDbjPYHo14kTc81/VY4LlFkSklnjx5Ml/NZ9O5bdsXF4kGpq7hiKJkvY4hBGmSj7ZGdc57b2f38nKdRAUyhBHmOI4ByECkuQBC2ZiGnpes5lCJ0WiwPepPLk8vHOi5Fi/z3Z0DLlVS8Ol0Oh6Py7Ksle11kiJIBFdKyrKoiizzbDsIgrPTa9d17t294/th0/ekKBEijUZrb2e3rsYACErFLYtsbAwHw1fCcTEjm5sb3eFwa2dPG/nrX/zcdkiaxpPL0x//+E86naerKBuOupPJddDq9DrdRtjiXCoNIcCWEyBoOXZ4687bUoCT04somodhs9FoJUny6uS45mwaBRBC0ADJK8KYy5jUyibMIpCLipdxlqQOZb1+Y3553e92235z0O3tjDZBpReziax0K+zwghdlNuhvNML+9fVSa2bRJoSvS4yiKGo0WgCR9Xq9tb1NGTs4OJhHq2a3NVnOby4uR4Phvdu3dhqd7c2tbrvZ7bTee/sdBM0vf/7zq4sbhAAO8GAw2Nvz1nF8eXm9Wq2ePX+BukNA4Xq9Ai4iBBkA8jQr8pQZSLt9i+BKKC5KwqjtMOyBWrh+44/DGNdSfCNo1qTIigtoTB1qqFduwhilVANT1yJQSgkh2ijHcQiGGBkE7dBvHh4e3rt7fxjwoig8N6DEKvJ4Ml9E6xhCjBDAmBLGLJsgQjGtMfPKVEUtR7+ZaHzfkQC+h3iqLZzNZrP2Ida3rMON9beUZbler+s5Qo2ODYJgFsdSSoaJEGI6nV6eXwAtw9BnlBjNIdKMAEKgVlXFC87LggGjFEIQAICgafiBy0Jq0WYYYkhkJaaTZZoX3W5v//DWxk4jubis26RsxzPwtXC4sbHhOI7nebWzcjabFUWRpslqtULA5Hme5zmjFqUUEvzGCqqUqs8JECOlTD3ID8Pwu1pt4Do2sFjFC6A0NGA2m2khfd8/ODjglbAotRwbEIMQYYw5ngfLkguR53kleF6VgquqqkrBORdaAYAkhFBhCQkhhBGENQDSmLKsOBcYYCklMKaoKq0AhDBsBL7vn189T9NMCFkJDWDOuTQAMWYNB5tJkgCEtDYMYy1NlKQX5zcvz66RAXt7B+89eNd13bOTsyIvCSEGojiO11HS6LRrVJQxBmpzeXlZ/5brZDhljBDSCoNmM3Q9y2IYE+a4zLZZTdHAvIii6Hx1vcrmYnkjpeRVsZQpWUdzrbUQlZQSISil5KJcR0uEkDE6CLxaJXNdtxE2GWMHe3uYkdlsEqerRthcR8pizHVsLnJgFDQAQkgJhoAqpTRQyjBCGcYQYSglhxghqDAxQgFCCKVv6lONMUYBZXmW7VhB0Or1t/7kT2iZ86uzq7PTU4IqF6nVYg4quyw5QVSh5sNvX0ntIYhd160Pju1207KJ4MXGqH+wv/P73/9eKx74ThKtsySez+cuUv/yX/7L7e3dv/1Pf396evb2ex/32+3zsyuHsjSKF4tF3XK2v7+7tbvjBq7xTFmWjTBohB2L+VUBZpPTy8tLxiYff/xxv7f16OHjq5tJJUSj3eiPOgb5eZbxXBij2t3WXfrW9tYoL9bfPv5mOrvev3X7k09+9OOf/CQMepyjFy9O/vrvf75cLd57777j77x6fDqbj7d3RuPZDVe8O+jt7e2/c/99YPD4ZhnHsdewpotrv+EHzQASiAgpeJFXebvb7UUrRPFiFdVlVm7gP3j/g8ePvj1/dU2I7br+9dV4PJ4M+kNMIKaoLPMkSZpNX6mW1hpT6vie1tp1XKVFVVUQAiWNlppS1m51pZS7O/u97uDq6vri4mK9jmtpNL7J0zS1LNpqNF3XrufKEMK8ELt37naGo1uHtxH6G855kma+H0olIABSSi410LKqqiJLKFIaKyPKi4uL9957z3Xdq/F4uVxWVWVBPb46x4gPe344au1ubd25c8tibuB31kkRxcXZ+aXRBgIleamNBsCGAECIldHGAIgRI8xmljFKSlVkOee8kaa4EbY7PT8IkOtVZdFrd+7cvq2qskrTq+uzk+OXRRK//+67f/7nf661/Prrpw8fPtRa723vfTX9o+8D33WiKKqqqtfp4rv3LsfnkksCyVd//Prho+cIIVGVACDLYsUq0UhBBIGRCihdFa7r9hoBj+Z26Nw+3Dna33rx6Pev+PrDDx7EUZIkCcSkLMsoirI8RwhhhNO8iKMUEQK0MUYrbqQAdsffGG1vbo1W88XNzerm+rJIonbTPzrc6w83tjaGnufYzIqSCAAV+sE7D96Kk8XTi0gZsDHo7hzudXuDOFk3Am93e/TF57+dXF/cv3vr448/+PyPX19Pjs+vxhvQJJkvBby6nhW5KistBcwK6XhNP+ycnl1FcW4g7Q82K6FfHZ+en18aCBVXUkogVRGnVVUx17FsKpUKfN/wQvPKZkZAoQW3nbAfhk3XVUJu9jt/+qMfxXfv/e73nykhLcpGg43L64vAaTTCXp6pdVSVZenZfitsN5ttCDEwMMuyx48f7x8cYCF3d3a+/OoLhrAFIYXg/bff3t3c3giaPC/G1zdnx6+wNIf7u+1Wa2dnc71Y2ra9sbFx//4DTOnjx98qDRijgEBR5YvlxMdtx3UgQ67rFnk6m82arg+MMUZxXjme0243bx0N0mvFbBtCWJallrLZbLmum6Wp4IpQ6rmuFLqekWkpsyyrnQSUUql1jaJCiFgWhhAySjDSSlRaynarNRhsdDrdhicAiontEuoYgKQAluttbG5JDRGzICYAYgORqquABIff2x/o76ANEMJ65aj3CrWlt75Bo9FwXRcAUJZlURRpmtZTiaqqatVhNBp9+OGHjUajXn1tyjDGvu8DEK6Xi6IosiTRUhEMuCgpNkHgei7TRolSCK7KMqKUAgSM1sSyKAGMQkJwo92ACmdZDgnO0mK6Xl4vppkQFxcXzWaz3+9HcSqEIIz6vt/r9aqqyrLMcRxeVtfX10VRLBYLDNH25kaNsyyKohZICCHGwJJXBBd1Bz2mBCGitcYYb+/uEEKU5AjhOkZbFUxLMeoPKKXQgCzL4igSXNq27XneqppzzvOKQ4gNBHlWIpIAAKpSSG3qdg8DkAZGy7qUEhkFRMWV0FAbIZQQQpSV5YeOC4yGCIG8yusFjzKWFZxLw4VRVVmUvKo4sWzfgxRhy/YD3xdFXuZFUUgAmee3TFnkeT6dL548fVoV5fn5uWO5R0dHq2gdrZPlamm5juc4PAy1MSVEBFFMsc2c+WIxmd5orR3HgkiNNnpaFmVlIDKMMUyRBpoLLoBcmzwlPKNCmFxpKREnpiAAKAAlF0VZlp7nNFsBoUOEAKW0KLM8qyAsOC+FUFrrNMkihBkjeVEx5jrMWShTZlVd0A40xhg6zLEsS0pZllxK6Xo9CCGslSZYGehqzQHUjWYHYQ2h0VoLwQHgNYtkMa9SljUb3vbm1mC0B7gE8PeX4/PpZNwIXY2UxhoQ3Wq133nwoNm6evFqzmxnMBoyQg3QhCApS2NoI/A6raAROAhIiiCFRvPSJkRX1fXZGdEoi6PZePLN3/992OgsZpOb68nJ+UVdO5plyWQ+c3xvNps0cDtZp1mcr+ZxlhaLxWK1TItc//GLLybjpW3b1CKHtw4cx8mydLa8IrYGBmKHeNBhmPq+3RsNVkt45+37P+z86KOPPlESvDo5fvTt6cX5+NXLs0W6uHPn1tGdvVJkv/vD75araaP9p41Wc/9oD0Hiur6B8ur66uE3T9I073UHjTZax+tnz4+NJlWpEMHaQGY7d99+i1AmpBqONv7sL/ph0Ini9MXLk4Pt21fXkzjJhVIQwiTPWq2W5zklL9bJshkHlRhgihzHYdROs7iuSq8jiJRagteND1pKLaUhxNrd3d/c3F6tVqenp5eXl67TrPJKCyCEytNK8kWRlRjjNC2bzXbQaLbbbZtZyAAphO+7y2WMADJGaa0gggBojBElgBEMsVmv10KIQsgnT55c30w8v+k7xCKmGYb7O1ubG6397a1ht5cmBTQm8MJhfzTsj1dZkpYF5yWipO5RhEADDYRSUmiDldTKZlYUrSpeMYssVtF8udzaGH3yyQ++evqlANwPmOfTs/HFerW4c3Tr7Xfu/ce/+quvH35jgCqzvCzL7c2dyeQmiWLXtTGGGIHZZJoVedAM9vcP3MB1HG88nnz22Wcnx1f7+/eqqiLYrcrcc12tNTTS9TyMcQJEw7f3Rp3DzTaGqt8JjS7Xq/nsJr51a1dKfnx6YjlewdVsMY+iqNJIQZqVhYFQcKWUwggBABEhjLqOFySJ4Iq4QffgMMizaKPf8V26Ws53NreMgc1203ZtbaRl0zu3DoWsSvDs9OKyyBIgRbRe3txclUXSahwdn7xSZfL48cMf//inu3s7v/n8j1KVRZEJbqQBaVLajg8Mnc1iweH29rZUajpZrFdZpzdodHpPn784PT2VWuzsbq+i9WK1KoqirEpYYt+2+s0m57zh+0kaxUnsEIp8a71cRfPcFuDmfIqA3ui5ZT7t9xr7253Hjx9PbqLN7W0EKmPKVsMZbg6CMHz+/KXWgFKLUsu2HMuykiT56uuvf/yTn23v7d46POh3e+toBapqqzvwMD178uyEi9ViWZTZ5PJycT2+e+c2MFqUVVVVdSxLKTUYjba2tgxAu7u7awDiPFvOF9ilDb/nuO6gN8AGhNRthi1VcgppkeXz+fz0/CzNEkQCDGtLXSm1lkZrrYWUWVEEQYAJAdAoIQEAEGPCGDSqHuEzxqSUxsB6AQPAUMoogVwbiInrhgiSNCk9DDRgALKc65wbYrvd3sgLRKPVU9pwpaVSQumqqpIswxiv57PamfjG+lBvDqSUb9KYdaea1rouTQ7DUCkVx3GapgCAegABAPB937Is27a3t7dd15VSZlnGla6BgDWkyKL0erWejm/6vQ4j0LKoRalvW57jI4OkiGSZu1aIMVbAUIy0FFmWEMKklOvVknPlhgG27Pli9fe/+FVVVWup/TDwPO/hoyc3k9lgNPSCsK7VqOFOQJs0TevNQZ7nvV6vjkYrqbXWRkpjDAClgQAjWfswMCWUWnVGdJ3EQghe5GHgBb7jsMCxbOLY25tb7XY7juNHjx4VZdnt9nzfL4qCMCsryiiOHNdFiCijOZcAIaGk1sBAjCmkAEFstALGAIIh5zwv89oyaVFGCAXMUEoZoRhjoyEAeZaV62Rd8EIZrQ1UAAqpuFLCIKCgkEYhbSMKEVWASiMgcW1M/KA1Xi7TNCuKKs9LLWSeFk4/oMTqtft5VlKLMcYE54pXy2g9nU4t5tYbPl5VFBOv6bZaje2tzV6/bVmUMYYJhAQqJeN4tV6vX12dCyFW0QpTbLuWUVRpQi1C0myptc6yrOIloSZEXhC6SrcvL64uLi6qUo1GG73uCIDKGGPZbLaMpJRZnvQ7nU6nBwDgosjz1AADIIQGakWNsiEClEmINCPO6yQvUBaBNgRKCaWF4zADlFKVkBUikgGFMcQYx7HPrMC2e5h0gXK4KJnld7obUspOyy8LDo2hlFluI2wOBoL+4fPjJM48z3McVhZZxTMC4a3bh0WpVstJtxNaGAYOu3vnVpZEnUYTITGdTpM4Pb84rarys88++6f//C/jOP7666+zsjg4vNXpdG7GV2dnJ0kSzWaz5R+W/dHwvfc+2NzYvry8fvL45ddff3N8dtrpdJ49e9HptX/60z/56Z/9CBNwc3MlRDWe31DCGLbnk/VsOZ3eTNMiS+OlHzh+0Hjx8viLL786PbmZTNeLZbq9vf+nf/aTd955+9atw3U0397ZLKt0Op0GgVdPEK+ubm6ux5PJ7OZ6JqVMkshd0bIUJ8cXSqIwaLuux1wOibVarbJX52Ho7+7uv/Pex93ORhKX/+xf/DcBC8fT5aOvv6EUI0xvJuPt7a2dvd2z85MsS+bL2Sgdtpst13U1MFwoynntFmTMopQBgJWSSkLfa0oplRIIgyAIGo1GEHij0eDkZJJEseAlAtBhFqGIl2Wa5xuULmZTqbXv+xuj3tXN5Wq9AEYyRhDB1ChuAEAAY2jZ1KEQ66re/hNC4sXy+NXJOi8pc4kqDna2P/r43Tu3dyGofNdVEqRJibGKs6TIBaEWsxTRGjPLQE2JAwCAGkijNYClkKaoiqKyKCuLQkpBiooLoZVoNBpSm72t7fF4jBHKk/T88mI+m+zu7t7aO/i//t//bxenZ9cX59eTccsP7711l2B4+ur4wf27X3zxJef81uHBxdX11c01IejTjz7dv7X76uRlt9Vtfzi6deudVvO8KsDNZG5rk2YJZXRzYxA2/Hi9Chv+228d7u1uQiPPT1+NxzcIg7wsprOZ5zvLaGXidZwU51eX4+lEYYs5gTYQU0sZKYQ0xgADilLejCf2t88JdYosPTs7T+KVw+D/9r/91zt7h2WvYxDO0kJr4zhOmqa1h2tnc+v+XXxxcfXy22dhs93qdFeLBQJQS/X23XuijK+urp49e9Zo9999993iD18t1ivCKLMcxwuanTazvPF4phTY3NoVQli2v7G144cBJERrmVeJ1vJXv/pV3TRICKqkkFIawXVZDgYDJFQ6X82ubzY3Nt69+/aoPwjDsGXDKIrCwHNsixcJNOa99w4agbq+vn7rqGvRot0Omz6yCUcy5fkiWkaL6WI+W21ubu7s7EFEJpPryWQyHA6B0puDfplGzAsO9varqgBlKSrhu+6o13UQsihL4tiz7U67nWeZlHK1Wr18+XK2WExm873dg62d7exmbIxJosjPW24pIObAEALtsogm4zmDuNdqep43mUyi1dpybMv36xM8ItgIIITIUZlXpWVZECMuRVW8DhS02+3BaCiKnNoWgiQUvChK+R0fiXNuMQtBY6ixKAmDFiW2ECorkdZoFZeL+fjk7CpJKoioMno2mwupuZLaGA2MlLLglRCi0WhQSt+EId/AlNI0rWcc9Z+1jlvvFVzXfSPU27aNMX5z4yRJLi4uVqtVEAS1I9JiREmTpikCACHU7/am48liNvcsG4UuQTpeRUDrbqcBDdQSaAmkBFXFhaiUMkVRIYSCoNHr5dfXYwDgcLCFMZ1cj1fLqKrE1lv36ornsizrAdPJyclisWg0GrPZbGM4gAbU1a9hGIZ+UP9FCFHkJQCgHj0YYwilEKA6OmgEJ+R1yV+ZC2QAwdD3/Xa73fQ9qJVtUa3U+Obm9PT09OTEdhzLsTUw0+WiNWoKJQFEvu9TiymthVYV50VRaYA0AEZDA1HNStHQ6EpWJc+zQkrpup5jORhAjWSaxhBiQgjFBFPkeLaSBkCjjBZAK6AMQTZ2iEYQYA1Bq91Jo/h6PJdV6Xue44Vlnl5P593+BrPjMsvLQiKEbNfjXL58eey6NkJoNBjmZRFViee6UsrCzZQCVVmmRsuKNxqNra2NZivsdbpZkpY5xBgjCiE0VVWuVqv1en1xdgYAgMbYjFADNYBAQplxcn5xUg+rjFEASELqHaWO4vXLly9s29/e3tnd207iAgBk27Y7W0gpZ9OxNmYxj2bTZV2d6jiuMVRwlXJYMMmYBZEFISw5rgNECKF6IGeMFkIgDIxRCEtMJESKEGTZjDHW67QajYbn+EKo8/N5Gi+5BNs7e51ugKBer9dZktuWawA5Pr2sCuF5QRStoihar2UcLYQsbYb29kaBz5TIdrdHnssogdsbwy+0KvI00kWz3zUUY0YHm4MKCMToMloVvMjLYrVeGKCur6+rqhpuDj3Pe+vO7War3W21McBCqNAPHzx4/969dybzccmz23f2P/j4nVbbjbLlYCtst5s76XA2nk3HKwUqwjAkMCvSyXL+1cPLJ8+eLubLi6uV5ztJLJTG999550c//mEQeFmRE0Zv3X7renxzfnEdBN7zF8c1JDWOU8tywlYghc7L/OzptNsd2o5fFnqxjM7OJ553wxihDBVlAiH86qvnv/zlFxBYSqD79x/86Q9+wqh7PZ42mkGjESyXyzhNIAYQGmKRghdZlgwGPUwRlwJiBICp2fNaa62AxRi0MAS4yCvKMCFMSp7nuWXRzc3N7d0dox/lWXJ5uZ5Px7rdHA6HjmPZNrFsvI7mUgttet1eq9dtTmfX8XrO3IaBShvBeaVAJaUESjLEXNuyiBkOh2EYPnt5ulgs1nnJLEdhcfv2+/fu3et1G4vZjZAGE7s/2FrF1cMnL79+/GwWRZVRAigNSV7mGBQ11kZrLbgUSkquMFRJkniOixBJsrwRuM12Sxnw5MkTyfl6vcpj7tCg1ezZzLGdIOO81enu7+8n6+j4+bPVdN5uNcJrHwEoJYfQIGBarVYcp2dnZ9Eyopg+ffT8m8ffHJ+cOG6gJF4t8rzQ6+WKQQkA8Bus3fW2N0fa9ELP3T/YNFo4NgsbPoDqvY8+nI6vseMSx11dXsZpmhZCKeUGfsGN1AAAIITQBhkNDYIU24TwKKqevzhBjPY6LS9wHc/tNoPD27cObx0aUS3m4zha5hk3QCVJyrlQSmHEus1Ot9G+PL9i9kPI2DpeHe7vNYP2hx9+NLm6ePzw67/+q7/58NMffvzRD569ur54/PRqfHUQ7RGGKaVcyfli1e0NipJLqTa2tzqD/qvTk+uLCwMVc+hkPh6NRlJKrWXtMNdCBsxvMO+t3aP7994eDodKCYIxpTTLsjiOA08bhD2HrpfLF08fDfrt+/fubG32W6G7Mex6lFDboZqrZA28oO+7L4UEAF5dXBDChFC+7wuhHj16tLu7bYzZGI5Ekedp6kAULVfbo5HX7CyXS4yAKHKLss3h8N7dtx68886/+3f/jnPe7XbX6/X55eV4OvP8EGNsFMKQCQ2gpnkmFusCIRSt8+ffHhNl+p3O/tbBweFeJZXUutlqza6qNE25eo0tEkqqUldV5bZ8gyCl1LbdOohr23az2WxubRoEIcAaGK2NVEZKXUcSgFZVWVZ5Rgl2XR9jCgyeLqKqEtE6Obu4HN9MqOXari+lclwfSkE1hBgAAISSvhIQQi1NnudlWdaTglpdqPtp34QpalY05zzLMi/w692D67plWTLGiqKoc4b1Ob7uWa0H/5zzfrNZVVWtFjuWvbm5rYQOHLcs88DzLEIqXhRpEdU4CUMhCYUiaVoqIY3RUlUUk1bTpsTBAGkNsAFaKAzRcDBoNpvKDV+8evnixQtCyMbGRlGVy+WytkPWm546xIQRqBkPk8mkDrR/1/eGjTFKSQMBgv9YqFGHOQkhzHIJwqHv7uxsD4dDLGWeJUCqm8urKIpqTwZjbLFYAIQIowghxmw/aLS7XcZoXpXL9SJN0zQvDQQQIgOI0VC+doJAXuZKKaAMRcS1bIdZdcDnTSc4Iay+C0wwhMDyLVBCUBojtQEEK1BxkecVoVaNvhZVCQCwGKsqUQn10dsPxuPxxdlpEkVGSAJRlVfz+dxmVqfTaW23hBAYQC8MLMuyLev6alxkWVpVWZH70o2W0Wq1urq6qqpKgxo0DjDGEL8O7Ng2U0ohjBhhQEOkoEUsBBHxfEu/RoKboswmU27btsUc22a+729v7+7t7W5tbV1d3ihlwrDZ397BGN9cXU4nE9f1KLEdy0IAAoAIgoIYpaGGyGhmDAYAAIxcz3cdnxCGMaWUGg2EEFIJjDFCup5KIGxqRcFu+o7jYICSbL5cL5JkAU1JHZMtVxgZYhvH4EF/gIETZatus//xJ59OZ5PhoJMk66TpAKCKLELISF5YDA8HXaDBerVwmGMzWsiShs7xzeWtW3f+4l/9c8bcRw+fSKj+7J/9eWfQPz+/AEoTQsLQn80KoPSw11dGCV7xqgiCxsZg6LkhwpRQ9PzVs7OL406/hbBapzNEBETycvyiN9wGxGggMIOE4UpwneokzpIsb3c7m9tbkNppxuMkarZaw41Rt9u9uro6OXmVJNHLly/Pz67CMECIKKW1llojy3IIZggSKfP1OvLCdiX0cp0DQ2078KBdVdXlddRqI6U0paDdbi2WeRwtO+3hi5eXWH4Wx6nrB0VeNRoBIuTq6mJza9AbdH3frapKAYUZ1VoXRWnbNoaQUguA19XyEGKMCYTacchqtYrihePYm5sjq9cERR4tFvfvvx0E7qDXvr6+FLzEyGxuDDzPW6zmXPE0XRYibzfde3ePbAePJ7NlxDUwQlRlmUsDlDIYKG0hy3ag4p1OhzFWS6DGmLKsgo1ObzjAhC1X67QUvutxCSFkxyfHv/vi68vrGXbdTFSlqQzUqySzseGcK2kwJAAACDDGAEIIBCKEKG2MUdR2HNvTWs+XK6YthoKyMMtF4nntZrOTJuXz5y9ffPvi04/eG/X7n376KQUASFWmybPHj9Ik2tvdXq2yi7Oz8/NLSliel0+ePCUM19ejy8vLq8tZ2BgUuex0umU13dzc3NoYjkad0UYnDDyMMbPgch6VJW60Go7j9Aej9PCovpCd31xejcdxWrp+c9MO5lGR5EIBajKOMTYQVkJSwlw/xKiABtiuFTQb1KaOTTv9bhCGSinHshzbK7J8Pl/P51Ot9ebmJqWUEo9AfrR3+2b6+cnL09lqraF+cPftsqzSda64ujofT+cpJN90+rvvvfdBXqrZfFKIwg/cLMs4L7XWrVYrSRJIMMbQ9ezlav7y1VM/CPyAQSKfP3/BMHQcp9Vq3b11+52373/wwUe3Dg4RQkkUT6ezly9ffvvtt4vFopaCuSml4qLKVZW3Gi55x85judHfjOBSFQZJuLycmQzcf/tBaDUymCkh79y+SzBrtbuYkGaz7YXBixcv8vxn/V6v1+7Mb67W08n0IhtfXTAAKgkmk0kYeJ5lW5al/n9M/VeTJNmeH4gd7do9dEZqUZlZulrLq2buYAAMBjPYHQK2NK5RLF/4QfjID0CjGWlGGs1o5GIpFwM56uruvi2rumRWahE6wsO1+1F88LoNxFNaWkZEhvBz/ucnubCYsbLTvXNwOAsXtmlVQtSLeBiGZ2dnnGMEKVBScTCfxqPZzLLtKssN6ldlUmVSS+xajU6jN/XmtunYNk6SREqJGaVaaaFrAWkNjJum2fUCy7LiOE7zjCVxy3dKIZSqKDMty1Ia5nkppTRNU0tFEDUIFbzMs3I+iwBAi3C8WCyWYTQPl3GcWQoTZkFE8rzkUgIEodSc86xIa3KBEaOmDhljtUqxji13XbfORahniFrPWFMPWZbVYF6tYyCENBqNsixrIKROXaynjVrEUKsCJVdhGI4G4+V8YRq2looAYttOM2hkebSYLQDQlmVJjUsBl5HABFNJkiglmGuFkMZ1nqAoK8WFZ5iu63qu+8Xx6ePHj6+ubvygabsuQJAqXf9jtYcTalC/kFpuuVgs/tCp8Z8jsTkXCmiC4Q8BVj8kUQKMxR9eSDibl2kShwuTYM4rjHGj0dAIZnm+jGPTtvxmI1zGSqnaKVpynmZZWfC85KKO4wRaayU1VEpLBbTWkkvwpmOCMGZiTIXI4jiuP4u6xlNooZE2iYkxJghJgLFCCGipJdAQIQCRmoUTy7C8wMshElzoKkcY2q51fnEVxzGhVq/vAKmKJC2ylBDSCHzbtn03KMsyDMMqL7I0VkoQikyLaa2VFhihWuohpVwm8RsVCwQY43q7tywLuoRLRTEBlAmlEKOmYWBEydpaP8uyMAzjeDmbzbIsMwzL8zzBgQbK8zwAQBiGl5eXVSUajRbxXcXF1cVlkecNz/dsT3A+nYUbG1sGswm1JMSVABWXZSVLwQPfbbc6rVYHY6oVBABqDQVXUkpCEaUYQiBkVVWZkFwpVfG0rPKqqoo0UbDCVBVFlqcR15lpst5qo8yrdtNdhsV8PO33u57TAFBvbKxGkVNVPsLy9PjlMlqMh2mWJQhoodRsMgq8xtbGJgDgJB25rruxt0VsM46TlY21SorAMtc21us2l26rvb29fXp8YhjGzvbWJBwXRX5+fj6dhEUpuQSmaSKCKaWbW+v7tzcM2zg7P6Km6q+2yiq6uDxFhO4d7Dj24qsvnnz/7InvBgjA1fV1ZtoQY8Jog9rr63uU2OPZ9D/8p7+9GVxNJhMp+WKxaLQ6/dXezc1NUeRaa9M0CcNJktbKQUTJchkHftt1AimQkshz3Xt3Nxkj88V4MLi5uZm2W0RwYZnug/tv31yPXr486nRaK73+y1fPssxudxpJnmkt19ZWpZTz2YwxhjGspCh45fu+5rLGLbVCWkOlgBA8TVPXdV3XJQRJVSVJogHHGDHGABS3drdXV9rPn9lPnz5ZhJNe1nI9s9NtxWlaVDyOF51us7++eutw9+Wro7/5uy9kfeUiABXEGDDMarCR52l9aimKwnVdwMxGo7GxtdlbWUWE8pL7QcMyzPFkcXMzffby7OT0ElCr3+qms1EWxZDBQsi27wCNCllorSHEEGqAINDANE0uhVbSMAwIYRhHtsk6nc78OjVNc3ozPD+72txc393b4UxeXw3OqtMiT6EU77/1sN9u72ysP7h716R0Gg4ty3ny+DmEUGvQbDaLohBC+Q1ve28naLY++93n80XKDLJYRLfazXZ/5e23H62u9LXkrus2fK/I83A229nbGQ2HtusCAGSpOr1VvxGYppnns+lsPlmcYyEQtTDGlALMWFkprVGW5WmaIw0c27YsG0LQ6gSE4WUcezajBq0EH4xGjmEgpZQCs+n8+PWZ6zgba1u26UKEXFtsbe04j5+lnBPCTJOZzP7+u+fzyY1vG+fnyfqGO53OHz95/i/+6r+xneYXX/3t6urKbHfr7PiEEGK5VqfTGo1Gju8tFiGmKMniMAqZbbqe1eu1c85u3779/vvv3zm822o0oYJJFB+9PPr2q2+fPHkymcyEELPpQkpZNzvEUga+e3Md5nH61oMgXqrry3Ctu/XBOz9azOYnr46+efHUseb7G3fjyfBv/uPfhjy/fXjYbDYRZZ4XVJVYWVnJ8/zLL7/85OOPZ9PxZDhKwmWn1ew2Wprz2XQ6n80oQQSBJIoHlxeeY+/s7Ozs7KhzQCk1bafX73d6K81mc7lcchRIKQspomW6KPKr4ajT6UGlFQdlJufVcjyap2luWW6z2WUmdawVTEkSxfWRt6qEFpJzHkVJFEVFUQiu6j7A2vhwecnTohRC2I7n+wGAOI7TJM4ghIxSy2AUw6qo0ijmZcU5z6t4PJlmWYEQMSwHAFhWAmNauysxJRjDevWvqgoTlCdTIQQhJAiCWmHwQydkrWGEsMY5TNd1TdPMyyIMw5r7qKcKhFCn0zFN8+LiIk1TAEAcxxhjwzBqcwfG2DLMEvHZZPrNN99Ei9DzPIJhQYltGY1uF2h5dnKaZnG73eKyQgilWebaFqNqOo+VKFa6/Y3VVAilpS7THABAEIwX4fX5xbJSpmlub2+7XgAQaXc7pu2YpjmZTCilGEGDMmiyqsyVEnmer3Q7dYZVWVQ19SCE4Fyapkkwq4dRzjnnsqYe7E6QpWkiuEmwhZHmleICGyycx57nSS4KyRUEjUYDUJym6TScIoSqqhBaAaCm82kdn0UI1VpLBYQCQAOlNQAQAMQIrZ8I6jchFrXdoP4gqGnUKhDLsizLJIRcDMZKAaGkggpBQmzDtInWkHOJNCKEMIsx10YA5mma5ilJsmUYioozSrM4mYyHDOJer1MUZVmWjUZDS1Ur5wBQbdPc2NjK8xwAMJ1O6x+KoqoqYRBDgTf9ulIrrQgEJqNeWIUVrxyCNdBSA6QBBAhqRVZ6641G6ze/+Q1SyWp3++zsbDqOhzcxZWZvbaNQbJRUy6vB2Ty8Ggwd18cVNi2WJ/GLl0+/e/msKor1jdWDvV27b0kuFSxdy2fU4pVeLpM04psrK8ywijSTkDp+B1IjL4SgChFATcIoASqTcaLyWJcp1HJaDQlFCEqhUy7mVbWAqmQIrjQbBKBbtw6ePXllqmBj6/bfH//y+ugmCq8IIeFoRinZ2d48PT1WpVdqI47l6VFC4SJPi16v77ntv/gXf/773/8+nFuu6waN9ZOz65cvjm7fvt1ft+bpUmI9CsdFmu3sba1tbwzGw/3dvaqqilIGjbaQ+ouvv4rivLe62mq3t3a2N1c2KYXLePryxfM0WzQCOxvnEAFge6bJclD0e2t7u7MXa408L01qhcsZNdjwYppmJcSW31qPi+Li5lpcLbXWQolSVNCgSVW9Or+EEBqOrwCotNZaEy9AQGutLQBwroJmk8TRdDzpr3Y/fO+9+/furbRXXr8+/df//f+zXOYGtDWjFdfnJ2fEYIkuLcUlxq3uGqZGGutO04/miijHtZjd90ej6yLLNAKNpqVQSYAZLZa1HNpkCIEKqMoyYJkvCSFKVGVRGIQhZUCADGwBU84mE4OyW7d2o/nk5uJ8dnFlA40pqUoupPAte2t/P8ry6Xz23nvvPX92fHR80gucXtNZRplCqKh4xXm4zDDGBXWAEzw/Pu72Wma4WO/YP3/vQRrPh6ep4/rUsqVSpzfTv/n7f7i4GTLP9fxGniYqE5Z0dAr9EvJUEU0NBKqqAlARQhCAVVVJrSnAhJiIMikppSZA5jLWmWZCYGIFRMlwllr77MHtO/Fg9PzZ019f//Lw1t5jSMPtjURoy7IOPvikcfMUAIAsBBB4+OGtVy+PZuHirbfu9bprRSl++Xe/M1HDRmQxiG5tHty7dXfz0VqzGWRlgnRVLpPR6LQZtLIsGw4nZQEIxqXgpeRhNZ9ky42tdcPvM6+7SI6m0RRAGmVVf3UTEcOk5mAwAKJwbMBMBXEOicZQx9OCiSZBoO34bdf83T/87R/9+EdcFlWR24wgLaajq5ezWRqH77zzTqvVmufqfDBhtiOyzLfFeDxa63cXBknz7OzmanWnM59Of/5Hf/TowWET5v/s4wfv3LENA00cmVryrYP+B2/tlcsbnwETceTQ68Ho3u6uKsrffva7P/0n//SDtz9YWbtXK+YUBI+fPD07O4uS5Onz50mWKggUVgJKttHAGBdSLMsiQcloOTQDeO/BrhLlzfz8g/dv51Xy+Om3CJFYVlsP7wFi/M3Tb88urz7/5qtkHr6+unnrwf39/d2qyNf7zdnYy3OSJ7PZfLjM05so+ebFqeWMgUa251fVc0aMF6cnDrP/2T/6pwfb20k4p5Xiy/ndzZVXR896a+vvvvO2Yfi/+/03DCAhc5fRhuGKMvEU32oYRTWTEOZioSyBvWBWhNfTMQYQCOgQV0D59lv3kiRJs8JvBEqBMAyBhstlfHVxORlNF8vQd71Go2EZFiMsTHKMsWHaCKGiyAEAGCnPo1JKxhAAIsrzPM8hhEUqZ0VSZFVRVEoBShGzXUppbRT0m/4PGQlSysD334RAr4C6iJlXxTIU9Z5kmqYQosiLN3ZBCNMEE0JsyzAsFobzWrqIEIgiYdv26uqq7zfSNFcKNBvdaJkRbAoObNtejpN+v88QwbjyTN+z7HgxP379am2tn2i5u7d9cXU5nU4NxxlOp1wtNDKUEpRRA7GwKEstLULyOBJputPuDgYDUQq31QyLKkQqtx1l5Cv2VrvZjqJES2BZzuhmGC+XLb/Ji7wOq1ZCi1LyUkGEoFDMop1OZ7EIwzBESiMN+t1eq9UCiLx69UprbdpWHKe1n9MKY5OyaDkv58mdnVte0Pzys99QAmVZAFk9f/4UY3z79m1oGJ7n2RhjxxsMBpwXecW5EoAXUghUlkIrRDCBhAIgFCBS165sYuE8zzGSjs0MongRIV12Wz5jZpqmFNFWs+15QY06mKZZxulwNAZcmtQouSjzlDITYlxmeVUJ2Gi1Om0ltBTa8RoIknA5r8oSAKAgMl2viwiGkFoWJtixjKvrmyLPCAVlqjRQleQ+hI1GkKZ5ooHUqOSVZ9k2M0ouZvNwPEs1AISATs9jhoOJaWnZ9BzDMCHACgCMqU1ty7JJ4HcgQPdu399c2woXEaNWGEbTechMc7W/6gYtIeRkNJ1MZtEy0QpRMI0TQKlFGbRZY7238s/+7F+0G93lMposx8PRdZHfACAJVZQhxsj336eEGVwozJz+2mbQWoGYUkrzNIUKCqhklRbpvMojIEoMgWVSAJUSQlcCa2BRkwMteKWkDILG+dXli1cvt9a5aXndlZWqEjWqA6E2TePp82fPnz8FQB0cHMR5hi1jHIYAgK5BFlny/OSYeS5YsoKr45OLJElanW6WFa9evd7f3UMQXpye5WnW7/Ye3L3T6zSi5SxN02WyNCzWanXu3T/UmLleUAlOKIyzWEo+mw6ubwaz2QBBxRiCSCO7RRDSWq90O9PxOE1Tx3Jbzfb9+w8d28/SLx0XMsttd5o9ZFzeXFdC1jwaBJRgRDCAtagDoVpBLYQQUkhZB74pglgUJWmUtlrtDz/45Kc//tFaf5Vh2umsnByfKfV1lBRRlJiWbTsUEVoKVFu9Xc9uN5oEQsHLFy+erfU7/X4PE4AxjqKIWQaEkFIcjRcIIc/zDNsiBlMAcCW5kqZtSSmFVgoCzKhGMC3ysiyFzrRUrmkBSCDEeV6+fv365OTE87zNvR0NUBbGbqPtNHyCyPePn2QFz8uq3enfvnefGdZ0Pn/6/OV4PHZscz6ZqqrMk2R3c204uPYdw2Z4NBpBjDq+zyw7LYrZaHx8ejKezU3TBohwLsuiyLJMSk0IIxjX62CtduacSy7q99AyjJpGRABSShlj9QorZGEaGCHFRZWVxXQ6KcvtW7dulUX69OnTm5shAGg2W3z97ff9ft8wnLXe2uPHjw3TffDgHkKoEbQLXiFIkiT55tunw+FwMU8QsRzHw4h4XjA+H0WDie9ZgW+ZzAQEq0S4xG6aDUkQM6yiKAoNp/PJJF0QrgqhlstUcAAx4gpiTEuuDAyVAoiYzLJFWdVB7obBDIvhSgohMCM3V4M4XFCoWn5wsL+zu7WppAAS7N+6Ey6+/P7ZizQv+/1+yL2jo6P5bIIJSdNkc3OTELK3t8MYSpNohPHG1ua777//1v17QRAkUfz29vuTyaQsZBzlWkHfazmOWxY8ShOMaaPRSvLsYP/Qcb0/+qOftzudi3H2/fff//KXv3z9+vV0PnMDf2NjAxFcSQExUkArrYWskEZSK6mFKrLVXreIwrPXp3d21/7qL//ipx9/9OSbr//P/8f/07179/YP76ytrl1cDbMkefXiOQKi3Qh4md5cnzsO7TQb3fX+o7ce1NfL6urKwe1Dy3ePTo+iJAIIj85HSVwe3DpMCwkkI6x9fh1+8ZtfHBys2xbsIqkQjNKw4im1zKBhGpYquSmVklxQapqUSAi15BqCmJCyLONwAaE2LSarChOQJEvTchkmtm0jTC3DrIQ0DAMCVJbccZzCK5FGdbCBqESe577v1fD4Hzqi/lBEAqFSihDCGIN/aEjnnAMAal6glhnW1oMsy2q2HgBQRz7XPyOEKCW16az+gyRJkiTBGNfugBr6Vkr9EKUACKyN5fXdLcvo9XpbW1ta606ngzFutRumadYpNUIIh7DFfKKUchyn023s7+8RAniZIiAN04BI5VlSFonjOK5taK0wZUUlOedVxU3DbDRaTcfa2Nxut7omoQiSsijyyWS0jJFp+u2m5qyqBKUGYyJL8mgZc84dy55Ox57tNAIfIRAtF1zkCAPXtmrpm+u6SumqqrIsWy6XWVY0Gg2EACGklgjUeSSWZWEAlRJ1GGXtGnVdN44WvCohQpubm2maTqdToeTh4eHH778XijxOl+PTmzQjCqqyzKVWEkhCCAIUYgI0klppACFCEKM0ndiW63kexjhNwyzLCCHdjkepURYhJai/EmCMz88vlVJbW1t37tyhhE1mUwUgpVoBDRCruLBMk2JlMoMxpjGQkJdllUQzDHRRFLUyhRGjjpqllGZpoiUv8yzLY0YxQkADZfLSc+wkXZYldz2LmjRKYmYQPwiSvPAbfqu9LCrOTMu2bcMwENa27TBqMmYiRCDAhFDLcgxmEaztaBH1e9v9HhgNh53WyiJczmYzxw9sPwiX6auTs/Prm+ks5EIt3cx3X2epcO2uaTi84EWiTdzJIyOwdwrbmON8kS6LasFM6TcoNYy8AEhkWc41XGICK1kZzKQG00qqCgBVijIu80jznGKNCGIAaKVKLnXJsQKEMqikKCuowLNnLz7/7Csg0db2wXA6ibJICLWxtnp+fn52+nptY9U0TQn0cDgoJPcC3276acU9v6FMYxiFV999devWwbsffDoYDI5evsIAvv3Ww8Vs/uzJU1mIt+7fawW+sm2eJ4PLiyRc5HnWbDSa7SBou62OT0xacKGRBFoxi9za3kvTuNF0vIYTzlerMsUYUYaPzi6KotBSFZnNCN3c3Ox1Vlb760Lo9bVNISFj1mg851K3O8F8PoUc1PgPhEIDoZQCGiqAqkqAumpGI1gTwlApAAxkFkXBmLm1uXfv3oPNjR2DMlFVnXZva2trOBxfD4ZlmfuB3Wg6XMlKWowRAu0802kWOabh2AajaDIdBg3b87x+v08Zdn1fKWUYxrAMLcsiBsOMKgiEEEIrjaBGsCiqJM8AABpBruQyieM4LvMIaTAZDEc3N8+fPQunE6BkVVWtVivNi8vBMCnKly+PvGYzL6pFtLS81kefbNy/f18D8OLFy4uz83QZ+rZFMDJQ6/at7a5v/9GPPn7x/BkGuigziQDQYBGG40U4nofzKJ4vE8t0K6U1wH9wiUNGCGMUAV2BN4sgAhAoLbUCdcVvzSIqrZnGGBOEEYBSSkK1ZROOqRAJl+VgeDmdbe1sbwpeXF1djQbDLCswxklWBEFQlep/9d/+5b0774wnwxfPT3qrPWba4+l8Hi4GN5OnT1+0uh2pCQSsKsWLFy+iJL1zsIExWlvtzpFoBv7uztbgZiRKzTMCNJZyniRRWmTPnn97dPJ8b2/n4UcfD0dToaDruLKQCMHZdEmNsuSiLAXBlqZICc6FohQCjR3HZIQ+enAPI21gVCTLIi+1glUliiw3HWd7b+/J0xevnz7llaq4sppbRZZgjAxGV3qdn/+jP1lb6wshbm5u8jxtNBq721tra2uI4CzLhJKDm2maZv2VTc9qra1uTyfLZZi5rt/trGZFAbFJmHV45+F8sYij9Pzi6j/89uvj4+OnT59CjNrtdqvTkRCMF1MFNEUIQqS1VFpprSXQAMOWxQxZmSZrtINHdw53NzYNjIDg/82/+pdFUUzGQ6lVVZbbm2uPHzOg7cPtXcMwOu1m4LmCl+FiIngRNBqHh4eLJOKK3Trc/OCTtyFlJa8+++wzoYOcUwHdZSF/+9XTOJw8+fqr06uzIED3H+xTBhZpPJ7PGhopqKI0UkYnK3IkNXOZZZqAUCoFoqjdbmdZGi0Xm+t9RsHpxVUUhmmathqrWmtiMAShEEJLzRgjmJZ5VZcmKK4QAEDVpjDwQ4vjf9n1UNsTOOcYY/1fVDPUM26dNV7j/z+Q8Wma1ojCD/nE9YYhJa9lfYZh/OB9qM2E9Wjyw4BSP1SWZFprrQwEQe2pIRiazFgulwYlgee7toOg5lWhlBK81BjneVwURaPpm5Q1fGut3y2z5WIxC/ymY9JhmYyG155j8aKoMUhGqeW46xsr62tdioFv0M2VrgIwSfMwTiDCjuO5QhVKVEUJkCWFrEpNkQF0xYvcd4OdnR3FhcEohLrIsyRdFlmMMeQUJEnCLBMAYNt2o9GwLIsyZhjWcrk0bbfWJfwQSWlZFsKMMRL4HtZiOByYBNiOmWdkc33HD9x2p3l2dnp1dRWniWEZH378YX+1RahK0jlm1DCYgpUEAiEktICqghorCIBGACGMKMLYs1GWzdJ45DiO5wZmYGdZsZyPTMPybcMwjGgx5pwTIL3AsxkKXN8yDKC0lBJjRAlTGlZaQa0gUEryqihMajiuUzEhi2IZLfI8BxphBKAJgNZCaiUqpQQSquBFJUqICAZIaQGQHE2vIIS2bbdXekqp+PUijWPLoczArqKEehBiahiW5dTMFGm0MKaEEAgQAAhogjFBCBHJGS+w4kxKYZmewZwsLdfWNrZ2d84vbl6+fPnd0+cakKDRroScz0Ib806jVRZVw29Nx9fhYvpv/u3/hVfwv/6v/mW3bwXNW4MhmS9GWnOly7LIXc9i1GSsyIsqz5ZClAghwzBcz0ZQIiAFT7UoIeIIY0KhKkoAlK4qnmdClpRigxjYhjc3wyePn56fzxqBNVvMk7Sch9Fqf61hBUXZK8oUQngzuimqXEJdCA552V9d9yjZ2NoxLddoBmlR9na2b999OJ0np2dXZVHsbO12mp313qpvO1Cq23v7ZZ47jlXk2Ww6KctcSe5tdA2LOA2ngjIchWGcaIDaq82Lm9M4jpMk4mWuAOIaaQkYopsbq0IIinAQNCWXnVa30+xsrG998cXvh9dDRilCqCiyN1HkQFL2xpukNIcSKiC10gggqWqFDlYQaKgBBBBqDADQ0LYd3+3t7t7yvVaSFLHMKMKz6WUUJY7jbGyuE0IQwaaFkFQWN0TFtZYIAUbo2lp/Y22FUdxuNIsiS9N4c3MTcggh1lpbltNb7WOMmWVKoAteKaUgwYzRSoi8KgteUUo1gkKrGl3w3CZQYjqdjqcLANHm7l7D9zCEw/H46mZ4dn7RW+kv5/Gz58eMsZXVtb/4539ZlmUcx0+ePAnns41+X1XF6clrAsGD+3fvH+5trvfWVxrvPDiklJ5fnI3H4XwZvjo5PTu/irLcdANCTYQNLSqAEMEMmtpzRR03p4HkFddS1eWQpF4mtFZKiYrX6y/UQAlZc7Faa8ogJlJwAZFCWE0mo2fPnvq2ubW19dZbb32n1Gg0poR5nq81+PzzL7ot90c/+oRQdz4YlYKbtiG16vf7q+ubBeeT8WI4mgZ+03EpgOTo6KisEkrxcDa5OD9eW+v9q7/6V18/fXV8dAY1sywXQgiA9nzr9Ozs/OLKazUajUar0YyWGWFWHC2F0MswthxfKoAx9mwHAEtpCZTEBFJKteRSl9ubG61mw7XNyeBqOh5dXw+aQVBkebvd7HZWG602QDhOinmYNFlECQw8xw3cW/v7n378kePZf/3Xf/31N19KKTut9vbebqvThphOp9M0jaWGi8UCQfPgYKsRNEfDSVEU6+ubUiPb8fb3907Oz66vBr/53W9///VXECO2splVlaak2+tubGxoCJbLZVbkpmNCAjHGGiogtMaaQkg0DkriMXb39v07B/suJecnx7Obq2g+z7Ks2WwGgddqNRBJeJkd7O80261kllCKO52WY5sYY8NgaZYsw3mj0xiHo+miWF1f++kffxy0mhdXl9PFlZDx2eXLlU7Psq2vnn7hWcbG/qaU2auL6/W9za3u2ng8nYdCaI5RUys/jLO0yJlJTe4hppUCBGPbtjorXUJQHC4P9vc4L09OX5VZHkVRlYOyKPwgIIaJMYaI1LXFWZJbpskIyfK80oIgbDJan/VrYV09JfwgyK+J9lp4WNsQ6puWGiEgJfnhXvUe32yu1dhADTyUZVkPDYxAYLD/sgeynjw450BJqBVBEGJSPymE0LEYhJAxs06SllJSgHieaV7ZzDAJdU2DAK0UgBpgDZJ0WTtWqjLWWqdxBCHsdhpJPF9f6d6/e9htehSqJIosimzbNrx1iCFmuNVquV4AZFlWfDINVZY1vUArUJSlhMsiSyoAuBDIs5UAVcEZMymiFax6vd7dw9tYKSG5kiWhnTtkF2GlBJdSTodR/a6maRZFUVVVeZ5jTEejkeV4WZbleQ4Q5FzUBdydru86tm0a4+HN0dGRSaDlOF2kqcmm06lScrpcAIq7/ZVKybOrSzEpb8aXhUgNbFComAExQJUo6zgAhzohRwABAABJREFUCQHQSEOEIFJYQIxbtu87LtBQa1iVqixzCLFvNW3bvXXrYH19vcjL6+vr6XRalPngahAnejaZFmkhgdYAUUNDQpEGoiqriouyyqPEtu3V3qprGsKz8yIRgiulAVAacKl0keVVVQSeh6SWgGukIcMQa8BlHZNMCGEu8Rs2AKDRdjXiTmAQwnILGQVWCmBKGUOEYACAaTdqGSbBDCGsNVQSaA0Jw27g4aoEWZq6nhOG08HNTa/fzZP0/Pz0+OhVsgx39g7379wdTxaD66EqWu//5E/Oz0+rqhByvrG5fj36TZ4Xj5+jw4O7nfZaSzBM2kDTJC3zdMFhadt2QD1Kc62VKBMBNNasADkmmmCAgACwxFACKJWWUnIheRwv5/N5WWSOY6/0u/3e6tnJpajk3k7v6nL83TffPnr0tslouxX41C3L4OIK3IxulnG4vbvjNoJC8iRN4zQJ2h1I2WA63tre3W53V9Y2Hn/7mGHyj37+p4PLi+lwwuPUMRyLGLPJ3Dbs06PXvX7XMAyldVbxl19/043Xl1niNoNOr204Nry6HI4nYTQjhCTZsqgKCBVkCHLAlSg514BDLQzTRFADBH3HtSzLdZwH9x7+4pe/TtM8LyvTdjY3V5Mkw0TzggMAhFL1BY0xBggihAigP1APUkouRX0OkEo5juP7fqvVsixLKaWlZqZxcXE5m82riju2GzRyBXS703I8b7GohoObNFp2uq3tzdXdrS3HovEyfPjo7tOnT69vrlvtRiNoYUwxpo4doK5Ro/fgD71z9VpWLyK1JEr/IUPeNE0DEcYYQEQotb2743sOpVQL0VvfAI+fXE+myzhFzArcwHJdx3JOXh1dXFy8ePH8+NVRf6V7eLgvs0Qk6fsfv//jH3/abzcarjWdpu12mxmUGXRjF5ydXpxf3QynM0TNjtdQgFTxDBNTKaDUD/8kREhDIBkhNZLLCEEI1eHNQGlGaN0ziTGWnOdC1FS6JiLL07ra0TRZHscvXz43MHj/vfcOb+9bBn327MV4PIYQaK2Gw+nf/91vvv7q8c/++Mf7B9tX12dqXu7u79q2CQD6i3/xZ4LDb75++qtffvaLX365u7O1vbs1SeYVL0KeDKZj6FkxgseTyZOLS6CpbToAAIrhSr+15IVgGLnWdHAFRDUeXEHEwmXGbA9p0fSc+WIJtJQCAKgg1BgCKIEUXCGZllUSR6LMFgQMr68uz87yZHn/7gEzqWlbGiK/0SDMnIWLSsu0qPI0Wt/avHf//vsffQiRzvLkm2+/Gg6HaZrOp9O7d+/YnuvZzvPnzx8/fryxsdlstnu9VS3k2dlFHMf7+/vvvvP+IlrmZVFVVVWJJEkGg8HJyYkX+B+8+1El+CJaYkKjJF4ul1VVMItprQFQCCKCNYCg9ksDoB2JH9w+/Md//McGpS+fPR1f3TCKeZk/efLk4OCgv7a2u7tbSvXv/sO/xxgfHh5MB9PJZDJbzJOE7O/v93o9qdXVzeWvf/EPhmsyixVl3GxapgUtS3/wwf3h4G8Gg4gZ2LYCXmXNtm0abDScBz0v6LWtoBmeXj9+fhp4abe3LrSX8kxoRYAuOZe5LkVJKVYmCyczP3Ad224GjWW0qJ2HYRi5LKr3acO0AQCEmUEQIICSOBZlBTVAAEghJdQKCok4sdgPU8J/eX15nvdD5HA9atTb/M7Wdh0RWMvma2i91hj+wFwURZGmaT37Yq0AAHWIb22DrN004g+3H560Pm3XhoJ6bqjFmIQQBEGz0XAdBwDAqIkxrk/khJAMCkaQqDCEUFSlEtK0mGtZTc/3LLMd+Dtra03XOTk5WSwWhBAjWE/SdLqYHL06Pj09KfK0TCMHkQ/efuuth2+v9lYfP378+uQ4zJL+xma71cwxNgwDKo0BJAgblHWaLd/3gyBQUiAgLJt5jg2giKIwDMP6pSVJEsdJ7cjIi4IQ5vs+QIQxVlUVNZhtkzzPMcZKijzPgeZJElkmNS220msXmRVFYRgvkywOo0Wj0ej1V+bz+W8//22JojCcE4al5lGaW7aBCCrK2LBMBQGAUCklAYQKYVlpgOdjOZlMypJvbuw8fPDO+voW0CRLS4RIu93e2tgxTOoYr6L5l1nJG37r5mYgStFwPQVBUuRaaYowZjBPgZZSCF7KpEwTCoHnuFmaMoqVQaWUlBJKCUKyxFppmZWp0ISLEgIFsQIIVJorqTAgCuhpNMtEYZomoLqx0my1W+12tyiKNMnysqrHU8GFlLJIC9M0TYosZpqmjZFRq7aJrKBtNbJ0STAzmJVlWZYlZen9+je/SLJsbb1n2lZexK9fvZwtwtHommUtE3S7vjw5e+4w+2c/+dFkep2m6euT77jIVrpTBB0EfccKWtQwSDdOTxtBi1JaG2yqohBCGAZVuiIAYagR0BJqKbngsgBKK5UkyWKxCGfTJI1c12m1Wq1mZ6W9Mp/Mer3+7uaGVihw3GiZxPOZomQyG4+mo7OzM8dzV1f7vdX+9Wg0GA4hhKLi48Ho9OLStvyG376+uLYNoku4vb621mqpqrSoMbi8ePn9i7cePei0utEyi+IzQHElK2oYFYCj8TwvhBu0Hr3j9vrdVOQ3k8F4dtNotyqQK1ghBDHUVJKqEhxwz2K5VhQjUZVaQIxYlqThYmmaNgLYsqwoitfX1zc211+9PsJQIsK01qi+7CGQSgEJhFZvEEUIIEYQaAJJvS4QXUpZ5sWy4hnCwDAMAYQU2mCWkqjIK0wNRi2/4d25fbe/vrZcVuPRaDYeQKAci8XxYrkoIVDj8eDVq+dxnN6+fbvZbNuWW1V8uYxkxWvIhyKMIZJSSsE1klVelFnOi5IiXOVFVVVpFGOMC4gMKUslrSAwKJWSR2kCAFjbu1UhvMyrv/3bv8+5+vM//+dAo9evX1+dfxOFIaqKbmBjng/Pjz3T+Ff/4s/eefetg4ODIkuyzLq5uZktQkRIu91e21qfLaOciyjNvIapIRVCa4Udz8uLggvBq7IsS8YIRhhjbTpeDTZqqeolmHPu2k7N9TJCpJRFUUgu6nAnAECWlhRDhJBjOwYis+no7Oxstd9755137hzsv/XWwy+//PLx02dxHGMCojg5v7gYjK7efuf+7fv7e7c2NKiOTk43NjYAUkKCP/qTTx88ethd+f/eXE8uL6+thpvPM4HAzuF+e6WTiGqe5cixIWASEiHEMo34uCqKZVqJ8WKCZP7+23fD2RBTexmlaaEm0wVWhcOAEDzP84oXBEHDpBgjrUSuJAQgXk7mVcHLYjS4CRczz6FXVxfNZjPLrKwsLNswLJZk2nJM17ZMRj/96MOPf/Tp+ubGZ198ETSDO3duX11dJokuirgeE0vBB6Ph5fXVYDD+9NNPd3Z2qrxQSh0eHu7t7TmuNQ2nFxdnURoBjLa21+4/uH1xczadzS4uLizL2tne5pzneZZEsZScYKCVenP+gtrAuM5uV0pt9td6ftN3/CSOb66H8+m0DgJf29w7uxxMlsn9d9/fO9iXEL06PrJ89/bhgxKALE4ur2+Y7RmWbVqu5zZevjy6++BuVRWv06VQ3LRZkif72+vv3O3vrTlpUqVJebC3u7KyEoZhf31f6Wptr40RECR/df68EcwVBRKXpm/WtDeiQEqOtAIAi4ovF2GaJP1+TyngmM7O5t6IjaIok1KGs3mWZYyaRVVSanhBQAidDCdaa6AghJBiUoNbSsr6iP9GH/MH7qBuVyGE1FURtVuh/ptajVg7F+pUg3qnr+uef2imfpNVjLGBUX391rPFDw8o/3CrGYcaipBSIqDqGgiMMTRNIURVVWWWUxeblGJM6nSm+nEoMQLPBgBQYlgmwxincaSEmE8n3VZ7Op796u9/1W4G8TKaT2ZllkopZxezQvDFMsx4ThguyyKPSyLA4a0Dw3Qdy2WWKYTiVZUmERgp1ECGYQghgeamxRzLaDQakgslJQBASj2fhJPRGENdL5mEEAUBY6zRaNTmqWUUmaZNCMmK6ofXW8s5TdOMoijLEqBlmSerdw+2djYtkw7yGABNGFYZIAZRSBdVnvP8anjltphhmX7DT/IkSSKpJUEIESh0BQHUAEgA3yzdEiONeCG7/RXb8qSAv//q29/87utmo9ftrP7kJz9bW13v9HpZnlLD8xudxTK+vB55vmObjmGaCuh5GFWCI0qkAlmSao40wggZGCKkJC9zURVFWVSVkFJCqBEGGGPKsFRUaakAVEBBLCFDmCAMqBbVkqcGMmSlF0XqOA4hFEI8SxZOM5AYMs+irqW1lkLXJmFRGSYzGKEEYagBApBggjEhUmrJpZbSte00Xk5GA9ukgufHr58FjVav01RAD168vry64Uprxaej8a9/8ZuHDx+23K2Nldt765+ud3Ol4dHR66yoxgPVblmu53LOIZRewFx/zfd9qHSBqVayoqwqMoSAVBhBqYQoRZHncV6kRZELUWkIlstFlqac8yxNsyxrtUarq2uMGWnMUQe9/87b8TJxKDWbjSKOv331ut/vH9w+HE/Hk1l0enp65/69tfX133/9tVTAsn3P841bdr/V05Waz6cnz590W+1HDx9Sgk5Pr+ejie95P/vxT6IoWl/fevTWu9+/fDqcTdorPcOxd+88SKsoTdOrm0Gn38eGWZRlyQtNGISKGRgTgjEmCDguLUtWVZXNsOQVZVgJDTQEUg+Hw8UkqirR8H3TtheLhVQijiOgVJ5n1HalUgBpqQEQSmspgYYKai01BAAACAEiEAEMAAYAUM2V4kUZL5fzJIkc0+El51oixBgzMTaURJQartMAAE2n8yyTnue41jaCsirS89NXRZZsbaw/ffbk1dELBMnJyUm7tVJyBSGeTRcMKsdxGo0Gw0ToN2XthJA8TbM4KdLMpEwLyYsyT1KMcY6wTtKizAyDIpNFSR4lse/7uZSdtbU//fM/nycJBmhzZ/fZ98+PT88whjKLbAwa/a5tm2WRKSUbjkUhFFU1GAyEAgJgKGFVFpUOv33x8vmzF0+ePQ2XCTK8q5ubvNAKAK/RQkgQgiAAACjLZIwRhDUAxDCM2mldm5QoJiYzeFnWxzigNKpP5TUlUQIMgenaQnOtoO/7WRqlaTqZTMbjIQKy1Q4+/Oi93lp3sVgcHx8vxrntOaPx5bdPvn3wzsG9+7fTPMzK8PmLx/21dYIt27Z7ayv/8n/6X//+i283Lq5fHB+b3bbtWkGzESfpq2fPL8/Py0KVhUQAG4RWeUJEblm67RpMycX4/N33P/zGo8QwKJTx4noxSZaLpNvxCAQm4VgLjICBAcVIAr62vWUQ2ltpCl5CLU0DdLteK2jEydwPnKSIy4IThkyHrttrP//5z3utHpfipz/9qR14p6cnXFSWZf3jf/yPr66uEHpFKX3w6GG707m+uprMZ8RgIq9OT48ZIwd7tz755KNGvz84Pf0f/of/fjybQozeDd73/UaSRYtwijHIiyReJof7t9vN1tOnT8fDUbyMTItBABECWGusNYKAUWqYtN4IPdOdTebDm5EQYjoNX78+s2373n3vZjS9uLzur/efPH8pCe6trf31f/qP1DQXcWUYhuc40yiCF1eEGc2gAQBqBO1+ty9EMVkMRzeXhCGpOIPqnYP7puWUhTg+PcPU2NrZNEzit+wvv/5sbdsiBL+Lt66vRqYFzGbo9uMi7VBMINRclhBCw6AIwTLPCUKi5AwbcZhIKdutFYM5jh3kYTaZTaEGQog8zTJYVFXFK7FcxiYzbMMm6I1QAAKglOJFUR/ff0g4qE/8aZrWYYiEENM0bdumlCqlLs5PXdetD1o1eF7PBJ7n/RDJjDCA6I2sr2FZ9SBSIwR5kWVa15v9D9KENwkWVcU5N5lRXwj1wIExrvuTlmFlMMswDIkxIRQZBiRAK4EQhhBSTBm1GCW6UqXOMMCW4czjybMnz4DSVZFBDUzTLMv8dBwS0+BAIQM7tuf7fuVkWMokzcfTmQFRjWFoIWfjyWQy6t+1PbcPtEJYm4wZzGQED26upJQGoRqBQuWilIAgy3IoJXnGuZL121IHTSZJkiQZhDAvOQAgSRJDCgBQGIa2bROCeFWE4VwJXh/GFovFcHRzfX2VJFG4nFPGRBLHRWbbtuU6UhaVwMxEpmlWoqy7rahppGkMMQIYAQCkUlpDCCWE0CR6mWSzxUgrUpU6S8XV9TUAj3/567//+ONP33vvvV6vs77Vvf/ov7q+vv7uu28uT64554gQqZRtMgYMhFBa5M2Gr4Ssk7IMSg3KtNYYQUwQ5FpKnmW8xnQxRpZlSMkxQVxpgDRh2DAYwEpKrGyLYFZPnEHQ0FpXBQeIDmaTGlrCGBPMCCHENimEPAEYYSGqKOZKQoxpXcJJLMeRZa4VxIRcn1yfn582mk4UL2zbCpezebwsKuX7bn+tISG27evw9eVvf/PLd9569+7t9zvtdSo3KTUdr7m68Y+Pn3w3DSedZtuw4fXNWRTPXNde629JqcssL/IUY6yFEBUHQEAEhCwrnidZHEXzZbRI06Qsc81gEsUQQtc2NQTLOL65uWk3W+PhZHtz9e7h7dWVtZuL39vUfO+dd85OL47OF8w0Go0gaDYqwWuOKi+Ks+MT222srlrtZufth9ueF8wXy0iHxy9ffBsuXz39/sN33ttc7S8Gw7/5d//hq8+++JM/+RO0f+vBW2/nSlEv2D3cvxkNocVRSYVCANKSyyRNkyThinuWR01ENFMKAa0RglBhDQQXaj6bh4tIcoUQpdCo8vL09DRLy729/QcPHuVlWWtGMAJb2xtllV8u0ze8I5CYQIAJQwghpIB+s5MpCeR/liBRxgkhCKmKZ0kS+Y6PQa17KAhmlukAjIRQSZJ9/+TF6cV5WYn1tf7m+sq9u4erB9sUq6uLE9ez/X7v6uoqibOrq6te93xtA6yvbTOWhsMbqLRjWiXCtWC4TmIBUikutJAME8e0tJAUYaDB5fWNlFwC3et1TFdHRbbMc8t17Ia/mIW99dXN7e3Tk/Onz18+efIEQLycDrvd9s7mludbjm2F4Xw0GlGseVkYJmWMJVlKqCEAuByMjo5Pz05fzhbhMko2tjZW13eWy3wZhbbjC6EgxKbJKLG1dk2DQqQQhpPJG8+31rrI8prxfcNHqDfahRpdqJfvIq8Ihtpx8rwEQlg0QIhURfrixbPrm4vlfLa23v/0008fPboHIaQUnrF5ksT3H/x8pd+YzSbffPfl4e3doOGcXVYY6yQJf/P5r7c2Dw5u3Ts/P/71r3/7ybufNNsNhEGaZaPLy5k94nFS5cq1G1BBx7BLWSFZuYhihEFeXF+cfPLxe0DkjU5ra2Ntd2frxwI22h3fa1iOY5oGAABBTQiAWldVCalRVdX6al/yyvecKFwkSSKqotlsrq6uCgWkDCnDhOBOp/PTP/5py2nleb6+vv7577/4u1/8w50H9yte9Pv97e3t4XCIEFpdXfU8b75YnJ2eL5fL9ZU+QshxHNd1B8Obp8++HwwGw9GgEoIwmheJI22EgO+7zVbw7eNw9PjJ2w8f+Y4rK15kmcmYZztVmVOMMUQIaoKJaVDLNDCEQojBYNhut8uyWi6Xo/FkvkiiODOds739/ekyDpP83/z7/zCL4z/90z9h/4//+zwMl8VRr9Nd6/eXaW4a2fVgfHZ6fvzy5Uq/ffvw4Pad3f5Kp0wjoStMTJcyv7nuOM7G1rbDvvwf/+2/mU1Ge4ebw1mxiK6y0u02Ow/fXfV7SiuUZ1NBoqK0JKVKgqosGWOMeELILMnqViRGjOlkXoci9Lqrm9t74/Mry7K4FAiSuWkKpTHGSZwGQcAIJZCISvKKV0oRRBBC2GI/IP9vloIaCTCMOg8xz3OlVC1QgBC6jlWnFNe9d7X9gRBSe+LhH+bdHySQYRjWigfGmP4vSiNrA8WbWRm8EVBLKSFQAOia1UIAGpQZlCpmJElSsyOCcymE5KLMCwAAV9owjDzL8ryUvEqiCENYZCVQcKWz0mk0eVEmcYQAdBxruVxW1IEEx2Veqso0TdtzaattE7qzs7e2toGUbA6u6jpH33PbvTZk2PPtPEMQIoIRRjBJksuLi6bfxCaEGigFkriYTsej4XA2m7Q6Da5kr9dzXa/uEI7jGEKMEAKIvPnUTMM07TrF3DRZniWLxSzP0+VyeXNzswxnw8GgKIo4joejkRf4WZbNwmpto6G11rhSSjSbgR94WuuiqiTgCqpKcKwxBPgPucZaQwQhFCAGBFFCIcAAq1JwLrVSUCP9uy9+8f3zr/f2dt55962Dg33DoPt3Ns6OLtI05TV9ATQ1LA2BEKLT6aRpWkdlY4iUUqKsqjxr9bppmsZxXOSllFxrSggBCJelBEgrJYBWSkmEAaUYEog9M8/ztMwdjBWChBiOZQdeI03zoijSNC9LrrVmmNW5yTLRCCElQVUJwSVjZhA0PTcgWitAsO35osqur8btxhrneZrlQDKCYVoWo/FEY8IRiJLU8qzuO7cWi+Wvv/v7P/un/9xb3ZhVZxCQSQpXuv2gB5jnQlgoCdutBqMwTdN4ckMIYpRaEPI8q8oSKIEQ0kILpfJcLqJyPM8WyzytuFJIFUWeCoswXoo0TBCvUjo/Fl91W417O22moldPfv/Fr7787/7X/xvH2rpzuD0L6Wg0SmTuYJ+b6uX3p3cPh41OO8+U37QfvPNea6WrIJyW4bPLF8so4iV5+epqb/ceMb1Sqt3bB61e+/PPP399eTyNZ2+/+97rVy9KCQzNbm/d5pwTDxVlluQp0kArZRDaa7YDzzexoaWqZMVLASFGAINc6VikPIvyJabk3u1HokRff/7dZBwSaKZh9fDOu59//vne6v7Hn36QZvH14Pr21q34+DLLMgAxMGhRcgQBxKTi3LRYURRaS0ax0FIWOdTSNOjD9du+7weBZ9s24nGRjFwvgKQScClganikEfQWYRaGcbgIz86WSMW6UPObec9fvbV+50cf/pNXztOqzE1Kb63dS5PoyXff/D765Ycfvt+zWTkf5dV4cnxciu3trd0oWSZJYpp2lEiESBQvsyxrtuyLy0wI0Wq3hsOhidVkPmeEwsQ+uxp8/+RJt9X60eHDDrIBTJ7+9nOdpu/e3V/b7L/31mG310vgkCGzLIVjN2fjZRA0x+PxeDxUQBwPrkpZybz0/PZ0Hn/5zdPPvviCOJbBrNbqtmE4QiPMaNDwMCJQVYpXyzivs+SYQWrxhNYyjsJZVZUFhxCapkkxFkIwxnhZSS21BgQiBFFNCVu2UkrN5je2bU7mM4U1tpz923fCMDy5PN/Y2F7bvzdYKnqzvHt4+8c//8t7D88uL87m01mZJp9+/MF0MPz3X//Hfm/l/b2PNjc3Ty4uFzfP0uns6/mvOV8wqzr6/utWq/HWW2/d2tvaCtz5fNr+6P7oZrC6ttLr9d4I0KjpBv76+rpSKuaZZv3/7f/u/3B8dMwwswyzKKqL04tGu1WWJUQIM6q1Pj492drZTuKxIfl6t5ctsqqSBgyQ7oiKuq4rBFoubSn5Yg6KnG6uH9za32sFPYIFT/OnL75bXeu+987D1ycnzcBZ63V/+qOPtRJRFFGK4zT64puv5unS8qxHD3/6/vvvWiaL06XFcFVKislHH7y/WM7Pzs7OXh+v91epwTb7m7/9h89ubexFBrm4eH779m1MeZzMVlZXNdRRFjeDwDYM1zYZwbZFLYOVRZbkqUHN2wd3siRP4wwoGC3B+qZbCdDf2P3Nl99KBBCA2u389vmZtboPPffybKYMnKl0XuDl1Wzz4F6rY/z6s99nVfV//b/96//uf/nfPnhwn6Am1lLwKg2x46VBo71YnLue/LM/+yhoe/Nw2uuvzydXIsHj82Rze2un15iHkUjnSIJ8IaBNTNsyLAsQLDRRQGvLloYZx8t5Gjf7vdn1pRLSj6JHjx7t7Ow5jvf8+fPJZOx7jTr9t4zTWj/IAapHfAAAV5UWkCFFDWY59hv7rnhTUR3FWT3KAoCkgnlcSJkCAPr3uqu91fX1da11HMc1W6GVhuo/WyIxwAooLXSVVxiAmtSoihJjSOrY5px7rltVlShyWfsqlbIB9BjOyhwAgCDECEIFykxACCFAFGpRxKJA9VhTQQgA0lrbhpmkS4RQkcs68tkwTUQgY0xoFYZhhbHfbUMIkyRRlLrLOMuylutqrVtB486dO4bJ5vN5UuSprBhju48eHr73zmg0evbs2Xg8zuaTl2HYbbW73a6oUsUzAThRRaPBprNFp9cvYDW4WkZAxBYJGSmShcHMrmVMs9x1KC+k5feEUATh7e3t999/fz6dKSU+++wzDPEnH32yd7j6b/7Hfzufz6tMhXP+8tlwPhtVPNOgihMuFR0NEg0JQf7ohgCAMxhBCKdhstK3hAAVl71eEyKZxRwziLBWSkCkKMWEYKAVNdyiqPI8kyJFCBsuZjaWQmnNKTGKcvb0Zfj86HvO+e7urZ///Ocf/Ozd3/3udzfHp2/4oyqhlLqMwDJ7eHALIcRL4TiObdtnpxeDq0uirZVud6OxMV+EYZzwVKUxrwS3XMv3fdt1uagICwzH12VepLEGFDHqUo9ixpVBiUsZqySuJEKYWQ5kplBaACU1yDiAdW6YFFwrThCggKo8LiUhRVGYjJZVuZhNKKVSCEItxzMxI+eXF1oqkxkKQAKRTQ1MKEPcMhEEYjIe+m4z8FuO3RAAhGEohFBSIwwBQAa2iE8825sOzoWogNYmZZZlUUqRglLKsqoKXqR5lud5HQqGNJBaGyblJdJAQoRs2zSAASFYLBaKl41G4+T4rL+y2WxZtmOUVYYRazTtvDA3N7apgf7T3/2t7ZqGRdvt1qN33nrv/Q9WtzbCZawxyvM8WiaLefjku++2NtY3N9aicMFQw6Ck2Wy+/+57Nzc3NVjt+37J5WI+3dm91Wm1oKWXy6WWyrPcTtAxCBVKIqSAxmXFhdCGaWFMtQQNZrY7vbPLBEHbtQKMLETxSn8dCgNqgjFdzJfNZjNo+qurq5Rt7OztnJ2dXaT5fB5mZSGVhkgiiCFSCEoluEGgxkRLznlBoXJdu9lsvnNvf2try7Ss+XzOlWx5FiZgvphSqBu+yRjjVXZ9eTqZLBAxfN9QeQxl8slHH+5urRT5/PDWgyJdyZL0669+v4gntmkQC12NLppn3gefvDuYXF0PrhpBazyaxlEKIczzUmvtur5lWeFyES1jSimlRg1UFkXRaDRWVlYMygLXOz0+IQQrpYbDIeflyclJkiSPHj2wLMt07CzLrq+vu1ue7wdJXEWLbBmmq92N3Z1bzWYzzaOzy1NmGr12FxB2dHx2eXXuWNbdt99KkjRaJmXJKw59P+j1+kqCJEmKosyyrO7DxQRKKTkvmWERjDGihoHekM0I1fwugpAxmmXZfLmAEDabzW63M8smFGHNUO2obrVanU5nf39vpdP9+3/42zIvhJJVmnzxxRfPnz93XRfoFABADTNLk4urgefYttv4N3/971qt1l/91V/df/Rwd/dWnBfHJ2cb/Y1m0EonWTNo3Llz7+DgFsUEIi0rPp2OTcNot9u1861mUgkh0+n0+1cvzk7OOedFVnz5+Zenp+dFXsVxnCSp6zcWy1BpWPDKbzcXi0Wr3b27t1FV1dXldZ6XG+tbruvHccorkWVZo92ijCAEPM8JGo1Gq52XVTwf1Kcuiund23dM06SYFFlOEOo2Wof7B/2VlS8+//z3v/0scL1333339v1bkKpJOAnnY8tkQlSj2fTZ0fNGo7FYRj5CN+NJUVWD0aRS2rLdCgJRVjeXVyYzd3d34ygtirQVtAzDWFtbX+l0qjKPF9MiK2zbaTfaK8w1GRneXBVF0em0bh8WCsDpaJiny1YzWMQRhNJmVBS5rMrpTaQ04lUe64oQRCHCGPtN37KsPM+qsvju26eeF5xfXAvBbcdcWVkZjaKgUWoERIU77fW7D+7eDK/yMtvevIcATpIqDmGcppfXUwTxev+gyoz5fJ5EcdBsMMMoyhIg3fDcKFqWec45l0IURREvo/FgyDn3LQ9j3Gy1PL/RarUQQtQwalVyEmecc6MOOyoqhKDt2JzzLEs453VkAsKoLKosy6qqSNM8SRKttWEYhLA61O/o+FgoxaV0XRdCCCCsOK8TmfQfgIE6M0FrjZQiiteCA4AhxhhhDAGAEBZlKYWokcmafVAQQPWGlaj1lRBCrd+4Kngp3jAmEP9g5tRaS4Ity4QQLhYLzstOp9XqtPM839nZefbixfn5aRiGiOCaQ6GU9vrd4XBoUIYQyPP88upCa312/Hptvf/06dO33np4cnL85PHjNE2DwCMYlpliRLW6vffe+1BrfX15vVgspIZf/P4bLuVoFoZJnFXV9vbOpobTxbxaTiHElFoP7t7mlVAKZFnGS2HbdpIkv/31r9qdJiHYD6w7tz/Y3V579vjry9PXUPKVToMgpVX10UcffPTRO3mZ/Po3v/jFL385ms4wMhSgeSbLqvJ7fpZlVaGiRZamCcTAYMVsNgFQMkYABkoLADSlihANoAoVp5Qahm+YFEIshOBCaiUsy4YQA4BrJL8oCgj1ZDKSSmsIfN9FiNRyCoyw1opLHYaLsiwRwkHT7/d7hJC8SMfXC4SBFAWvcgQkBBIC6bmGFzhBy9PQ4YoHTd92DJICjSU0Sa1NwZAAgN6wXQBSSoGqv0Q/ZHpIrbVWSAGtEYSUYAABRJWWshSEEQoNI18uzs/Pq6q6vDovy7TTbTi+W1UVQajp+UXJmWE5zAYAmSwDyjAZjMLJdOw5po1szQguixIjSggEAGihAYQYGcQwTdOMlvlyuaxjfCxmJHkax3HJq6LKkzzL8rzgRSW4kEJqlWYxF5XWEHJOFKAGg1DFUTwZXa32ukevr0zTOTjYHY2ulUbra9tZvizKuNP3bW//y28/Z5adlUmSL7d2Nnf2dqaLeRguNnd2EUIGJuF0ZhDk2dbl+VkWJ289euA5VpIklJLDO7cXi3Bwfd3vrbheEMZRGi0nw8H69jrPKiiAKnWVCck1kKisZJollRSu63rNllJqPpkXRWFZlh+sNnxoUJMyDxK8sb5jsSAJM8dyuRSr62u+79q2adpGk7Yvr68VElznQlUIEWwgoCGEQCLdafhpEiVRJHnVduz+yvb25nqn09n1jNW2SyjFFU0LZehKC0VUNR/dLKfDNBcQMQxK0wCUAkGxY1iu6zzY3z5//ex6ePXw3q2t7dXJZDKeD7Iycfye5Ztn16fLLLIalqLq8uLaveunaRrHqed5dWBLp6MWi0UURTXgWZuvbNt0XRvYfqvVEhUPfK+/urKyssIImk7Hi8Xs+fOnjUbj7v07v/vd76aLqdaamcbl/+vc8wJGHYs5GDECjFv7u/1u//mryUq3Swxydn52M54madlqegYle3s7R0fHi8UiSSLOJcHU9/2iqOI4DsPFbDYra4jYIDVCYCtkMoOxN126hBCoNeelYdA0TqSUACjTYoQQiHS4nEtdtzdLSrFlWY1ms96/p4t5EATDPH959ApCqP5gxZ4nk1arsdrteZY1i2O/EfRX188uxqen4+HN/35tY/Od99772R//8c9+9JMP3vvINE2beXWAK0IoDMPFYhEm0WSRlOXsu+9ffP/99+PxmGLoOI5pmuPxuJDF7du3hZCz2ez758+ajbbU8PnXrzyfCVLEXC/CSCGcgvT8Or9tq0ZvbTAYSMLshruytbO1tR2G4enp6auL00SUhGDLsrzA73RXTMsbjac2kLwonj99enN5/ejRIyBUnEWJu3SYubG+7vv++euTb774cnNj4+OPP7Ztm+vs9HIYR2FRFK5jdzodqcVnn3/eaLcIYZ00j5Iyzou8KtOiVEAThC/PzqeTSa+7YmLjbHruew3LsLe2NwxCp+PpbDqRvFzpdvrd1W63i6Ioy+LxeAAA8Byz3WzMwoUSZbyY9xr+bDqUJbQwrKRY77Ymk0lnpevaznIREgrKNJtOR6vddlVVZVkFrndxNRhNFjfDeVUVnuclqfQIJGywWM4vLk/avdbG9j5jQZzJbncnTnPbMQ723x4MJq+PIl4p39qV1amsSqUkEBxrBqUoiopXldIaAEAJoZSazMgJWc4XFxcXntf0PK9OQSC54bm+12woBG3b1Vq32+3V1fUkSb799tujo6PpcrG1ui6EEKJSSlCKIcRC8ixPIYSMEcexhFAIIUpxLUUEkk+n07qOoY4KME2zNlTXu3uNH9SghZRSqArXSALGiGAEka7Lr4sKaK2UrHWMEACtNVdSAwQAgpDWLoxa71izEqAWSQEBIfxhXKh4oVE9XgBCECHINBkh6MWLZ0++f3J1dUUIoeyNP1NrmS5DhECjFVCCLy8vr68vu612b6UzHg+/+erLg/3dq8vzo5cvbt269Zd/8efdbveXX35lMLPX6zHTaniN9bWtV69eD8ZfMNsp4mQ0W8zmc6FBUco0z7jUjhaNRiNdFq+ev261Ojs7O28/2vzum2+XywXBej4daZVdXV0gDA9vbaTp7MWTr6bDc4s5tmlVSVymcbcV7GxuHJ+/rpkagqnjBhIYWhdCldPhWAgQBDYQrEi01/A8a2XKs9kiZEwAjJQCAGhCAMZaAUCAoBQyhiAUGkiEEGOEMbMooFICIuC4zHJsgGBR5eeXJ7NlvExiRDCEQHCFEFJQccEJYUopoTgCuuRlJSpEgBc44Ti2KF4sw2U4hRiVJS8Ft53uo4eHQaelMMiKlBoEEmjnpl/6AoH6MwVKaw21gkoprRQACAKMEHmDw6J6TlC8tt9hWH+HtNKci5yXBJsGQLCsqlKKZrfz/PXT0XhAbExtw3Gc1UYANIyipN1dcV2fc5nEp0M8MQ2HAFllWR4vDWRadgNBiCFCkEgpNdAAagCgUtpzXF4VcRwXRSGlDCFcRuF0PivLspIVF0JBADGov/RIAaEEY5RBokuulIQQKqXzvGw3O2VZttssisIH99/97PPPXe/oww8+dW1jYWCMQc7T/cNdZjuGTU3PNC17ES3G4zFlRpEms9GEIWhRcnBrO0mWl+ecUjqbzZ4+vbm+vm40Gj/5yU+m8/lwPP700x/7jeDm5qaqKlFlg8trBTSmSJQinC64FlrAqtJFxTHDCDOpYFnxXFSVEkBU2bJ0bJcgmmbCt+xev0GwJYqr1fV+o+kHQcBMWpZ5kmewgEIIxjClSCkEEYIcag0oJSaBj+7fPj89GYvC9zpvP7h/9/ZhM/CUkF6x4MkiV9rEmNqW4AWl1nqnNby+iWbj47Mr2wlsN1hfDepj95a7enBwACrxd//xP51fXf7P/2f/i82DfThfjKeL4Xg0GC+WizCrdHd1a74st7fvXLy+dl2/3W7bto0QGo0mQiilVH3WsSxLaRknWZoh0zJ6vV7g2ErJ2WxKMcIYGgbFEGZZNpmMXr9+vb29rbV8+vTJeDZdW1tzPFdW+uz4nGGr014t8+r06DwInHaveefu3rvvvw0ZGA6Hi8kIM+ej996ZzRdS8SQNEdKdbjNaplIJzksh+GQ6iqM0y7I6Zg5jXBdACSEkJvUvAQAayDr6jlIqZFWWZX0KMwyLUpwkUbvf5pzXNVTNZnNtbc1xnBfPn0ZR1GwGhmVlWYYJKXg5GA7SNKceKaRK0vzu/i1F2GAyX2k2V9dXeFakaXF1cRV4AcNGyWWSpb7vu41OWXAhRFGVSZLFcRxFURzHYRhurq8Ry13fsossF7wizOx0ernIzs8vvn/y7Gc/+5lpeYPB4Isvv9o/XJeQ5CVv9/qZQH6rM5jMd/Z3P/z0J8cXr6fTqQRkfW1jd39/f39/MpmEcYQISvOUUup4NrMty/GoaXClLdPIk7RK83FeHr16xYVwHCfPMohQYLtQgySOe93uw/uP7ty7e3p6ejk4iaLINE1EQckzZtJmr4OYkWZFq+NqTM6urkvBW51us9OOooiXRTidANlu7u1PTWO917/34H6a5NPhFAIleCml8F3bcbyqEoPBCGVzXkmEQV0+NF9MZVX2ux1R5v1e98XL55xXBoI8r/bW1qnWze0dCGGRJ1iDJJwPh8Pbt/YhRpSZzXY3y/lotBiNFgAjSK2kWGRMKCwXi8nRyWtyCda2V9zA1QDUkr3Vte3Dw/vNYDm8iafzJSPB1cVipdNMsyyMoywKqWUhzOI0tW2bvPEAYMdxGCZIA0pplCQKgDhOFouFO550Oh1KDa2B32wIrqhhaQhN293c3rUcT0qZh/PaTqkUqHcR33cJIY7jeJ5HMF0sFuPxuCiquo5BK15V1Txc1BR7r9frdDqWZdXyNAhAyd+0O9ZkOZSi3vIVBBDCuoFaCq6UIhDB2voPQO0ZkEpAgN+MBfW93oSTqXoyAAAADbXWEGqEEIQIAJ2ksWmatmMpZUglwnChlPrmm69H0wlC0DQNqZWQHFQ6zYTDzG63yzkvq8y2zTheEgru3L0/HNwUWbpczI9fviiyxLVZ03Pbgf/jj39SywVevzxBhLTb3aub4TKKb4ajKE067d7e3j7E9OLqcjKa9Xq99d6a5wa+511eXvY6K4Pr4d7m9tnJ6+Pjo1t7u4vFZDq9KrLoRz/6ZGuzZxjMpKDX8im2LNOk1FjttoAov/j8d5998duT85NlGM5nxWSaAGhwgXmlpAKUAt9qmtQu0pHBIM/weJhUFRCMIYSEAlprTGmNuBDCAQBKFUJwpQGlwLKYZVcIAQClYVAFcFYWnHOMoYIgyUH5B521EtI0TUCwqkSW57ZtO77HOZ8v50ILXpRJFjfbvuOZi6VAgDuOp3SZZJGSNoTcYAoQXApZ8EpKrTGwAhdj9gZAElpwVddeKCErXiBdk04QYww0AQBAKCoFlNJQA4ShQlBrLYDiSpKnz54qLRaLeSrKptXiUKe8LJS4HNwAghutVhanCKGVbnd7c0cKvVhAXQmEKMa43oDLTG5tWkBjCIgGXGmFEKKEKqA456KqajVcxXlZVVKrnFcC6EJwoaXGECFECIIQAiE0UIZhQQ0ZpBAYhAJKUTKf3VyPPcuCWu/s7M1ny6qqlBI3N1fT6Xg4mi6ipZC/++Wvf+sEHmJGs9vzWp21ra3pfCK1sIn9+We/O371emdn5/atvej4PIr4+tZ6EARplR1fnEXLpFDq6PzcsWzIyM7B7uvXr29GN7KqOp1OyZXWby4bjLHtuIgxsZgigqlpaA3n87nS0vd9z3Ns265ibjJDlCKJYmpQx7aK1AQYGCb1Gx4zKOccU4OLsiirjc2dt6g+tU+Hw2Ga5aoChsFWVlZ817t3+9DCsN8IdjY3Pnz/3VZ/RcbReDhqd/vRPEyylGIDUxNiQphpO/57j8hisghnyySLC80Vty3L6rWs7e7ugzuPvvr664uza8yMwWCyeXDH9Trvf/TTX/3qVxcXF2Wee25/rb//7//tL9959Fa/v7ZYLC3L6fX6cRxLKetVqdFo1BpACHVVVXEcX16ez+fTtxptpRhluCzz8/PzFy+febZz++DQdkylxSKcZVkGEbBty3WdJE3yLJqPJ7bteY5vGXYURVFYFvnSc6kfGKZt3L97IIR48v0L37EhhL97+vjy8jQImuur64yFs+nipqoE1/WIUMuXpJRvJgCoEKb1Gav+PVEIKi1ElaYKQu04Vp7nSRIHDXel33FcMylywzA453me122whJDBaJgkSZonjuNsbm52VnonJ8eTxbzl2Nt3dmzTGt9cl1IQxsajEZTizp07WioCUafdXltby4vq+++/Pz8/pwZrdDcZY1LDoiiTNA+j5TJOlVKy4t+/PBZl+fGH7/74008arnNzc/X1V1/OoznG+JtvvguC5r1799Y3N7578v3N6Obw3kNXoawUiNKb4ShOiw8/+jFh9s14ksWJ67pO4PutZtBqIAr3492T05evX7/OZ5Xv2xgBAOtKWVQUGYTw0aNHluvGcTxfLCzL4pzHSeJ5Qa+/0uy0m83m+dnl2dkZhNBxTcqQbTtxuJyOZ0EwbzU7n3zyyfPnLzzPM00zHw2JwSyLGiaOrufL+SxwrDJZjAeX2+ur6/0+s6xoMZ9Ph4wxhCDSQAkpecm5gSHIk7iqROD5e4cHvU63qKrBzQhgVBRFq91t+oEtuGtYNzc3CACRl3me13SSxQzTNMuyLHkV+M2yKIqKx+n09OpqNJ+XZSk1CBqNRTX2O8be7e3NWyvDyVXOo3y+8H0/yYpomXuBO5leS0W2t9fXVtfTotzb2MrL4vTs4vvnz8bTCaHYtPx2s5lkWVFVvKyiRVhmuW277WaHUhqnN3U9IQAgy4rhcKy1BhoBjWpC4E3MF4QAQABAXdhYM8FKCYRAo9HodEin03FdX2vNrmme50otEQJCVIK/qYKsH6eOcJZSBkFQx6jkeV63QNUuElmWSimIECGEY4gB1PAP0ABGCAApZT1DAFVXTkOltZJKKVW3FdQDAUIAQgAhrpV6AAKEIUYYYcUQglBWVYYQgpDFyWIwGExnQ8e1GWOcc6B1u91eWVmxLMuzfd+1//qv/3oymdy5fZAl+urqstnwbu3uxMsFL9M0ibpNH0rx+Juv282Wu7J9dHQ0nU6H42nJK6DRMonbne7BwYHWemdvf3V1NUkypHQaxg3H80w3i2LPsve2d7qt9u9/91sDo6oow+n0WRoPhmNKwI9/8u5bj+5PxgPGCKVYKzGZD/rdtW6rbZh4uZhfXp34trW3taklz5KjwQggXFKGCcBVCUQJlosFkMBkdq+54rtNIIgSUCOqEFEaKKm1pgAAJUEOi9pLAADUWvJCRkmldOX7wLRwgxpFBfKqME3W6fW63W4SVxpIId54ZQ2LaEgqXURxwpVmjGkhhdRCSqVUpaTnetQ27cBbZ6jb7Y6nIy5yDPh0fG3Y2PY9BIAGSkpFGLUsK8tKCDCEb9xhP1BLEGAIFQAQAgyAAgABAABAkEAkgFKKKwmUBkoDABDB5PtXL6QWXFQIi+g0vVlMR9FCXuqm77eazUrL6XIRxXFd+E0QbTiBRUyCLc5Vkac5SpCmSkjLsiHCleBVngmtGCMAgLIsZVUZhLqum+V5kqWlEgJqYhpMK1InFGsN9A8uX5lGGdTApo4BKZA6KarRcH55obC+2FjvNJstx/G++eY7121MZzdHr19S0traPGg0m8xw19Z3CyE3Nrd39g8gIkdHx3meO5b9/ePv8qS4d/v25tr6yWorrTLXtyvFoyJb29u+4zXyPK+A8myDUFQBNZqN5+G0LEvTN1wvWMZpUZQqA1bDbgcesth0OYd1H6hWQCuDkoZruY6JMXCavtZ6WWWlyJQWBkPEhO1eQAyEGVRQlZx7pim1kpL3emuSqGwWLidzripiWCsrq3fv3l1fXzeZsfSaRIFOp2dQE+SV5NJx3KoQ1Gwa0szLyqZ20OggZgIpVtprP/rwR932yuX1xeXl5XQ6JSZa63a3NnqEql/9+m+zLN3b3Ds+fX33rfutle7+4f6XX3+VJJkW8t6dW02v+f/51//vXtBBEJ+fXYSLJYK4ZhmCIKiBTSGqOsXFNM3FYnZ0dBRF4enpabPZbDWb4/Hw66+/fPLkyeba+ocfvBc0vNPT0zzP5ouZYRhc8f5qrxKclzPPRUoWg6vjXnfVdVzLMuaLycX5q8nswrSNjz75tOG5a/2VwHeTOJ4vJhoo02SWbZAlnC+m0TLTClWV0BpqDX6ATBFCCGKtgZSqqqo6TYFpgoGWUpZVDpQOAr/R9Mh6/969e57nPH78+GY4bDQajNAsS6bT6cXFRa/X84Kg1ekAqMIwPLk41xh1et07CFZVtdLt7O/tnDlWulwGDaflbrVcb2dj7d7tw7IsCSQQ49FoPJyNzq/Pj47P9Mmo1e1atgsglhBnHAlomI4pDGEzW1Z5Wshvv3sKgVppNx48fPtqNJjNZjeD8e+/+rrXX3Fd1zBor9fN0+Xe/p3RZHHvcP/J85eHt253m/71+RkEWEGQlVmWp1wUFc8ME+8fbBX5x2myuLwY2DZxbUqxxlogxSXQxGDrK91Ou3t0dDScTgrJdZaleba9v7+2uVFW1Ww+n4Rz5li2bXetNuc8jdPxcHJ5fiUq/f477/2jP/r5fDoXQvA8A4Izx4jjWbyclkW82m2+9dZbT5+/CGejd95+kGbF3//iV9P5wrKsIouLIrNNq9cLut2m57plWWaZmaQLVJaA0M1bt25NF7/81e9Gp0OpICTMMEzXbzJmziZzZhhJlE5OzgPfL9KCAkKJURTV5cV1JZVUYDAc+r6fFwVl7Pj8LCny3d3dfgtVQvTX+7cOdq+uT7lIZ+HMcEiSV5VMknQxGl4ZRuAHrlbYSIqHe4eDwSBw7GbDvby+ubi5jrIcamKbJgBA8nKxWIRhaDLLMAzGWL/b11rzglvMUkqVWSmEMAzj5vKmLnpGCNcrYRiGy+VyZ7NX5xdVvALVG+8DAEYcx8vlMkmS8XgaxzFEQGmZpHFdUlAnkgMEpVYKaIAgYZSZBuecS1HyCiBIEBRKFlXJ1RuRo4aKEQq1hhjVGJvWWgEttSIQawSl1rIslFJ1j8yb9CdEa98ghARCDaFWqpZDAIQh54XtubWrEGMcNLw0Ly4uzpQS3W6bUhpFkWGZ/X6/3+/3er0sSVutltYyyxIAdF4keZpFy0UauM2Gb1vGvduHrmObzCjSuDBZdHpyfXxydnF+cn52a//wvY8+lBp4QVNrPV+E6TL89csXFxdXs8k0DMNiGfkYSim/+PzEMIzPfs1ns0nT9+7fPjx6/nQ8GmsBNrd7D+8/mE2nf/Mf/r3v+9RGOReDkfa9ijE2nU7zLDVNQii0GO41g72NXmCnGhhSkTznusXm86RMM9wIHty5c//BQ8NyTo7Pjo6PtdY1g6OA1lJqgKSUEkkAAJAaQgiRBgAABCAAEBvMtFrtdT9wAQD9fu/+/btra2t/87e/SAtd8lwIJCWHacUKlaYlMayiFHGSA6Bc20GEQogUwNMkKSGUCDS6vc5KVwG5WMwh1DajFiGuaZgmqwDIeMmFRBoKrhACCBGtlFJAa1CHgDNmACml4lpKKbXgUkillECIvpEuKFVJgQAkCDFCScQL02KYmXkVPXn2JCxSxfBoMeut9bFlZKLKeYUJiaLo6OgII0p5GC+ylZVAcWVi0vSbhFkEQcUrSHSZZ/P5OMsTahqGwQBQlgY1Vcw5X0TLnFcQQ4CggG9mBC2lVBwojTGmmCDUtE3Ht9x8mV8cnSwn4yJaAg0ItqTAEBhrq90n371CJEuS7Le/efr2o4/2D/rNRvvhg/e9dpOYxubejuu3jo+Pr4eDPElFxRGAtw/3TAKTeLG9uzUNZ5fj62WcbmxuP3zwwA38m5vh+fn5cnDVbbWPL8+CXgsykCWxBirXRakzIWUZlRxKwzUNxzYMGk4WWR4Rgh2bMYTKLKrShdZ6ukwQQpJLWVYmsxjRvu3v3dpAiAjBLYtSgyigIcRCgTQveZyrTNiABSvrfhCsrq5vbm01Go35fF4UFedSK5AXVVmWSgnHtMJZSoiJTMdiCiHKhYE1UopE0dJ1G3cP766vrqx2uy9fPi+r3GUQm/kyvZklV3YLOE04Sy4H0xOO4u+e/u7p899P54uWxx7e23UMZWKeLG4sz1UKnJ6eC6F2d7eDIKgdhnEcQ6gppVmW5DnN85xS2l/tzcPZzeDKtZ3XL1+9evESQl2WeVmWjmNDCKIoStP4zp3DRbR8+PCh5dhxeBxHk2iZlrl07PW9vbXd3e0sS16fHUXJgtDg26+/chutRw8ecIEuz6+CwPN937IcznOItOPYVSm0xnleCqEEV7UMsDaXQwiFEAhArTUAdccrhBBoILXWCALKsOvaq72VDz96V2v94uWzGvGmlPqBmxdFVVWO7+3s7DSbTcLwycnJ0+fPipcvtre3KGNhEo+H11vr/ZVu6yaPfdfe3di0COZ5dn551u/3u6sdIcQyXa5tb9xOI8UAwyuB3yy4WMYZl0BoJADCzIFU5EVVCcg1miyW1+enJoGu42wfHLz/wSdlmX7x+e+++uqbP//zf/Knf/onUvIvvvgSQ8iFbrZXP333rf7q5nA8yxdTy6BVgbmoMATNhutYRGvZba2E8+7+7nrLM2/f3uu1ApMAkyCTIK0Rl+JmOCyEEFCXki+WYa9vm57DDANScnV5/vj5U99rbO3uTKfTIs0FVxdnl1enl3mST9F4tjF/9OCtTz74+NvH3xS8DHzH860wXrYa1q3dD9998GBja/ud9x48e/7SdVgch4KnpgEX86lpkv5Ke29v7/7dO81mMBoMB4MrAaAmLCn5s9fHQbubVVXKxTwC1nwhIZFSutiYzqObwWRtbc33W7NlDHVe5RVQGQBYCHl2dl6HuUEIe6v9MA6ZxVqdpu/7jmc6TmM4yU4vJqubO5bTIoLBZZSkBcIGhNQ0bUINxkwEcJpUVSV4nmKoO61msxns7u4+f/3qm28fH59ftNrduj1EcC4qWUcOMMY6wFgul1Aoi5gIoVznCtNGo4UxLstSlYIaGGMMsdHymg0nKMtQKVW3KpimCaCqTcjT6RQAlOd5kiQQYsdxEEK1/uYPVIWqwe0aWkiSpA4LSZKkzhys7ZRvpLtSgLIAUEkqEYBQK6hB3XvCpQRKAUIQQAihvMjenNYAQAjXPm2lNVSwVidIqev3FmOoNSIYVVVpWVa/v1KLILmomEF3ezt7B7fKsjRM5npenuePH3/XarU67bbtWL21Fduxms2gzFt0ped5TpwsW83AoOTB/XvxMiyyDEOtROUZ/v3DfYviweXl+kr3f/KXf8GVnIfR85evXgyuRsPJZDyuSn6ws7P+8ce+7xOGHMf5+uuvnz59Nri+cRxnOLje29n0XFvJYHN99YMP393Z3Hny/TdQI6hRf3OLmZ7jvj7Yu33v3sP5eFQWuWUyigFEqHt7/92HD3kF5mEeRyWv5LxaTqbzKIpW+mubm1v9ldY8XFY80UBpUGmgNNBKawiw0lAqSSxQe1MpxfW6ZJqmYbL6fLW+vu44lhCi3e65bl8pm0tUCagUQYgIgbJcVEiXlWq5LVlxpXMhRF4IpXOMsdZgtFxOk8RAWABNFjgvCs/zGCOM0CrL55xrQphtIw1FwXmhmMUQIgghJbTW/M3Mh7WUUr8hm9Qb0AgAAJASEgOIIJJaKqmABpggygg5v77s9TrMMuaL+XdPv+90A8tzF+EkKjO+EEmSLMMFhfT49HQxXQAFt5pWUVRrq9smg5Q5a/1VqSBBeDIbE2ZmRTqbjuM0dj272WlallHGJUC6bkyP47gQnFoMUVJUJYS1wkJDrRmltmmZptnfXet1er4VPP/26XdffHv0YhrYoNdiSsGz05tOp3N4cHd///Dx968ODw9fvjgeDuaj69lsnhSFjq4mu7dv2Y4XhvH55WUjaHVb7Yuzc89z1/r9cD6dSUlMhimJ01wB3Vld8dvNSihAMDZYnud+uxkX2dbaqtYSAHVzc+1ShQ1EiZlk2WA6dJvetrvX7jQHo5twNlOad9pB4NlQK0yga5n7BzsYYy1VnhZFkgqR5xWyDafVaJW8cDzXYx7nmjBqGDxNimyR6Ep1g/bm1k53rW85HkAwnC/LvOKloMTodlc6K/04XEwmoyTJuo1dXpaWZRlBCxTFeDCSUrYaQVmoJI6TdImw7nd7ebIcjq5FWYbJddNo7R70OFDNrum1cJwPr58euz5sd03Xarb85qNH+3kUBR6+vnwVdDfLsnz58uXp6WmevxcEwXK5JBTfurVrWRbG8OrqarlcSsUNw3i7/0jO0+fPn0/Hk+++fmKZ6O7tO7Li5+dn77//fpqm19eXZVk+ePDg1fHrMAzPLy/u3N2dTIdlnhqUddq+69D1tZ7r7uZlGL4YNzz3ZjKKk3xv987J65Obm5s0ix3bS5JoGI+EAJZloTaFkPJKpWnOq0JKhZD6gw5LQowxRAAAhP6zZRwAACEwDEopjeMYalkUxerq6tbWZpzwKIoAAO1O07LtetnlnI+nE8OgXuDfv38/SpM4SxljrVbr5urF4PpitdtjFAtRMgrLIp1NxttbG6bJwmgxXczTsti6tWn6NrVZNGWYknQ4jZJUaCw1smy/0elWRaEkwJ6/tr4li+Ty9CTPK9uy/u4ffvX577/62U8+eeed97Z3d7Isu3/vzu7OZuC711cDgGhVxp9+9PHNcHJ58hphEkaLNE2l4ACqVsO3TBZFcwjovTsHSFVQwW63m0RpEiVFHhMMhaqqqjq7OF/Ns42NDdf3i6p0fU9DOF7MeuurnW5XSBmmMaIEYBSHsRR6Pp4VWdnwAiDBfDQReXnv9p3nTx/HUcaQJhjk6XJnZ+tnf/LTt+7cn8ymd+78rN/v/f/+x383mkw3N/pcqBN9trW5s3drZ7W34jhWVeZKC9czzwaLIAgUFy9eH2uAlNBSw2YL2k4QJ5nWupTg8vJ6cDPqray2O71hqSDAWuM8Kz3boRQKoQK/kaSx69orK92vvvpKKH737u3Du4etVuv61cX06ujo5c321txxCWZ2kog4nvV6PV4BrQiCBsEWwJhgYlskjiIEgGUwBWCz02512mUlLq8HtUbnh1zFGi0ghJVJxEuBIWk3XdM0l8tlnpeOZXc6nclkWpalbduCq/lykaYpYywpwtrq4jhuo9HwfR8AkCa51trz7EajURt5CCF1DTEzzR/CFeqABKFUmuecc6GUEGIZx1VVmbZtQggxZqZRw8U1H1fPzQhoQghRpL5I3gBxCEJcXynoh8qJOk8JACD4m5KIHwaFWhrvBd5kPvM879GjRxDC169fK6U2NzcBAIyxurkqCIIoiq6ursqy3N7aqqqq2Qy21tc6rXa7GWAEBtc3CNAyz8q86HXaZZpog/Z7K4ZhMGTsdTb3tv//PP3Xk21ZfueHLbu9Of6cPOnN9ffWLdvVBg20ARoYEJghODOc4WiCQUohvjAUof9FoZBCCkkR0gNFDkkRwwEwABpt0FXdVV32Vl1/86bP4932ey+rh1NARkY+nJcTmZFnr7V+6/v9fHZYVdSajXg1r7i0bLvm2cv5LFku6oFvUqvXbjdD37Edr+EYhvF7v/s7rWY9S4tff/jhxfnZ9tbmvdt3lqt5GPqeGwyvRy+evWy321VVeEGwvbPvBa1es3f73t1xrXZ5+jqOZ46JhCib9XpQa2S6ypbTaJV7Xo3zKvBt2yK9brPRDAGUWRYBLSACEHEANYAaIgCA1BpoIBFWjWZje3u70WhQSteYDEIIRkQpFQQ1AMAiW0zGy7J4VZal4FArQgxiGAYuCs4rACE1YFly06S+bbOiSJIkL1LLNhzH4QAmaYaA5ppnaYq18B2n2ahBAJIozipGTaPV37Q8HyOqIaroWhGCJRBSKoSQVnC9IgOppND/SMHHiGCsq6wEGGOENIBKayA1JABDRK4vL8oyF4Ivk/nW1o7t2VwUjqvns0LJ1KHmcr4M3UCWaaPWhEq//eAn3f5GkmVRnG5sbVpemORZXPCsFMnkqsxTgpALUYjpzfbGZDjS2NEMUGC0Wy2uqslyzFWBEbYsqZRCiNjUYSVbLpPAq7/7znd27r5rEMshQd1+8+tPlqPTn25vedH8NTEZ9YHTml+ufrPzIHgyAEbT/q//j//t5PXyq6++fPju20ZZWpbR3/STZLS4XEqZYkIVNm7dv5ulxbKUbmPj7OzCznhv4zCo4ovh+ZdPf/vq6hkHoBY253msOMxK9erVZejWFov45OXL9955M0lSpVSelyGxujVfl2w5GW9t7x5u77+W4OTVSTKvtre3TWoURWFgECp2sLtn2SZFZWirIs6LtADAITJoNNtaaEAIgaAqc8fwykIY0Lx38y6iBFOCNKyylGulAIQQ+n7oOI7nr0MAdT8geZ5LyzB9F0EsFEcGafS7aZpO4xgYBjRtxCtWFFnOqeF7XrsocqENwwn+7b/9txBJxjMAGZWjgFSwUf43/9VPilwuF+nB7Z5WhOH/dD5bqZTUw9p0Mrq+vv7Z331g29C27R/+8IeUWJ/89vOyFFLor79+zLn8we/96OosN03w3Qfvfv75p+rm/vnFabwc+DU3yi6xdbvRhfu6Npw+uXm3pcH0o49/NZvNbu4e1b3OnLKw1pkV/OsPPh7F2b/5l//SscM7R3cvLi/7m9uKGuMkvkqjv/7kN0Bjx2ecSakBNewsraQGGxsbD7o7VxcX15fXrKwwBEoIoDRFuAJC/EPRaw3JdUzHND2CZBqljgXq9R7F4OT4ejRYnp0OHZ8WDHiBsUomtm13ev54dHJ2+kRrqBGs15q1WsPGdDRZmqbZ7291GvvTcU5RPJsvR9PJ3Ts3LgbDXnNDClvzgFfCxxuGUQledWyw2+i/SsaLxRyCwsTFfDimlhk0mqvBHACw3e9VVfXGG/uT0eDFMY5WEawgDTvbB3vHl1OWnzx5+vJ//1//l1fn47cePvg//Df/7eOnT37+y19Nl8uT0+cnF5fTeHDz9h0f1oej69Fo9PjZ8Yvjq0azL7STZYAge2vrdppEWVGNJpM0jsN6aHvUNDvD4dCx63FUnqtxLexgjPOMLRaLqqosw26320f7R+fn50++eNRoNDr1tgT6+uoqDMPJZMIYS1h8Njzd2dkRWDe7nfF4fHE+vnXrjWaz6dHOcrBMVsli+DxNCgNYJnQbW5uvjk+2Nw567Q2sjdU8ZTnjVTGZTNI4ApYqRMq5ZEA8P31tErO+0bu6uC4hyDhzXdcK7EhmJRWDeLjXOihWies6BsSCK8E5NikAEFPMON/d3R6Px65nv/ng/ffee4dzPhgMxrMXg8lrQJL/77876/f7u7s75+fDqqocq4dgOJvllxfjmzcaEIGijGzbldJVQvhhIGWVZokF9bfu3TBk/vL18fnF1UbN4rIwMBuOzxrN9o9//PvlZPjs2bNrFDGel1VaawQ9u51n5WwxxZQQTaqq1FJRpCnSFgWMO61ejxAipXStwLNDxtiyiCzL4GXFdCmlNDAiGGktoZZUSmwarkHXhz+pFNBKS24QNF9MOeeQAAPTuEgAhbVajU0r33en06njWtQ28zzzPUcIaWLMWe5admjXgVC2aSIAsxgL3xZCaIAQohWXRckAQKZpA8CklIIxLSUEgmCIudKKp0j7pgO4oshAxOACcoFen13v7m1zIaVStm0uFxOoSgMyKNNty17MFoTxcTR6fXbKhQrDUHKACb28mh3t3zYNz/bCXIjPXjyrNRssZrVGa3d312s1FcHt7kZQCz///HNWFP/sj/9oPh0Pr68kLyjJeT4Q2pxmziJaXF9fbm33D/caFn3481/+LIpe7+xurfJskURXY3A9GFWa+81QLEE6GchkudMNebX89Qd/5XmB45OisuZRWlXSsKwdf/P47KnUtpDFYDgUXiCl1MiYLctVdsmZXMZRvdEWGiJqaAA4lwoC0zQt2ybEaHWDNYGbUgwA4EpKznhVrhFQs3m2frHMdZzPIYQmdkLP54IVRaZ0RQ2odCV5VW910zSer5KyZFprDWCeZOPFxLADDAHUWrJKUGTbpuGaGunhZMg539jalkoYCBkAGJQoCRAy1DfKUA6AxBgoIJUSkCoBuBCl0gIBCCFSSkqhAt/P87zIsvW2WAhRiNLgBtEaTqdTKUUlKpArzjmlmECKITWpCSHc3drHCklHCCYcy2r1Wo5rYUq2drb8sDZbzIVgWsvVcqqUYqyaRUuDgHrNjeIVNtE6RQuRsCzaaobIkNPVLE4jiJGSgCsODGgQux5S23KqiiNiOnbNAO7mtvcHv/9H8+H18YtPeQkaTXj3Vr/X3pvNF41muN/fbgetlhvSbt14x3/n3beTMlFAAqony0mWLoCqDKLKMkrja0rpwa3bW1tbhpMsr1UyjoWSvX7P8u2iysfzlda63++PB7NVtHANazKZraMlUZqMxzPP8xAhCkDGRCUVIKm7jFw/3Nne89ywEdYajcbxq1ePHn0VL1fmk/BJt7uzvX2wvd9uNLGNiCIYojwvG20EtWJVBda3WVpoLYltUkqJQSFCCgIEEEYQIDgejxljtm1rqcokK8vSprTV73O+7ikBgjAgBCFM8kJrzapKKYUxBmvYu2X1ej1CCAOZ5waGiQDkWa64WN/3QNO0ASSCF0qBwWDQ39jd3t5ut7s//fe/sCzr4cM3ms1aFEVpnmxvb7c6dYjUycXr589mjgNsy2g3WycXx59/9enDN+/+4Ae/+8/+sz8djQZ/9R//1+HwivPKce08T2/dvrGzvQEAwBB02635tDEaXD/+8rONzV2L4PHwGs7ma6XparWazGbnpyclZ/3DQ2B6qyglhrW7f7RarRgTSZZyoShlSVYYpgOQ3tnfxhgrAObTaVWUQEgEAEQIqXUCfA2hW+8YpNZyDWVCCErJF3Hy+PHjbq8TBMEynmNI2s12WXmNRuPwxkGSJIyxnZ292Ww2ns4Xi6XgyvMCw7Cqioc1p173W03/jXv7kmfHr184lvUXf/nnt27c3esfSAEc216/i+c5vV53karBeDKfzw3D2tjYWESr+XxuGMbGxoZt26ZJCUW1WhD4LgTKtkzP2ihKlqVpkcR5hn714W80L0ejwe//6Afvvffe0c3bk8Xipz/7eVlk3Wbjq88/aW7ucc4Dz1VaXl1dDXe2lWAZUN1OEyFw48bhcj4dXV2cn59v9DpK8tevv+h0OoSgPM9d166Hvu25hmFMJyOEQBqtoJJKCcexCEEQ6mazTghJ9veEVkWRXV4uJuPh+cWpYZLAcyazmevalGLTpJ1Oa7GYFUCOxuMozaI4Oz05YUrXGvVWs86FKrJ0NLjGCGxtbTZqgeu6SvCIJZBA0zCAAkrooijWBEAIoWkYa7wxQqgqyjiOMYSMFQBITCCvWJZz13XrtZAQ2u7UK14Sit55563vfve7vu99/ejR8etXWVFmWT6bLRCBjHMh5WB4DQBAmNRqDaXA6empYZieW8uLHECNGGCsBJoghLAC1CCtWv1ob98glCIaeP5svuBFblLLN+2a4+69/x7FZLFYLZcT03Kj5Wo0nDhuIKWWMi+yEgBgmXR92S+5qNVqZVmuJw1a6+VyCSEMazUNJMYYKM05X9+mEUKADaSAQCmppF4bBcA3+pVWq8WlztKCCY4xdhzTNmzXchXJi6Iqy9K0jX+8UzAMIiQr0rTIVr7tOKZBpeAVWyxn0IEIE9t2DZMiioTSVVXmBfsH3rOCUEKgIYR6LQkXImcV43w4vCaG9fr1q5OzC8MyHz16BMAD0zQwJnkS53nuOM7uzp6EsrXR/vLVk9enJ81+FxF8cXmWreLbe4c//IM/ONzfk7xKIufi/GQ5nUzGwzDsnlxcnlye247XaLafHr+ixHx5clYUxf379w9v3x0Nrq4uL+bzaZkXXIB4em7b9v7uJsCo3W4pzTf7/dl80mzVbcMMe/2iKLTUR0c3m42uZXqBpyGEj754rDW8efOmknqexBrhrb39oijDejMuWC5UIjjDJOZien2ltVYAIYQwJYQYECPDtTb9Hd/3vaBm2hZCSGlYVVVVVRqL9d+KKw0QVABqiDQEUgEMMUIAQIggWv+HI4TKjCmlqqpgvCIEWLaBoQkASJKsqhjn37RVtYJCKCXB2oJrUINaJoQwLyshRJ7nFePr0Kth2o1GA2KSZ2VVFXGaIfQNahooqaRUQkol1jMkSfC6BaYlVBoABaqiqIqiLEshBOPl2vBCCCLtdns6nVqWXbcbq9WyTArkWBjT4cW439tYLBYJzUPXu3fn/vn5+enJxavXzyzL5pzfvHXHCz3fd9YrynJuvD55xVgJtKqHDdczh+OLRqORValhGNTSLiW23+hs1LaqbpJlaZqblgMhlUynaTmfrfJMzEZL8mpwsOs0Qx9h8r3f+1GyWv330UxUo/29zb3tTSRAtpi3PdvHgYyZiIq/+evfhmHoe/VGt+7XnNcXrybzwWQ+6PXbimVVmRom6vXqN271tnZ3Lat6JJZPjp8uVtOdg82trf5gOi6urlerhUmYYIxSurm5aZpmPXTSeMEqTm0Hm5ZQkgsFTWQYZsXlcDrd3t6u1VtKQcfzfD8k2CoLUVSyGkbpOBFLZglTZ9KxbdM0CUSmaQLLlmnKOaemoaCSUlADwzBcc1HWO811Z+QbCCuh5lq2JxUSiiAAFfzGbqARQBBgAjQA/8BiE0IIqTHGpu1ijLWWhKJlUqxr0OuYEtdECii4ns9WmFhVJZRSx8fHvtdwHMv3/c3tXlVVtaab5IvORr3Vbd++fXs+n/8v//7PJ/NZ0AS2jVnFch5JwhksfvHBh9TEb739sF733/3Ou8vFTpbHpkMfP/kSQqAk11rHydKxaC1wHYsmy3h/s+/7ta+eHUugt7a2PM97/Oxpu9tbRquWbdlOsCr4aDUFpgMgLctSKGkYxDCpWEexgJJAS62pY1mOrQAoOMNQE4QVkBhjiL7xSa4/jeub3bIs/+GnjFeL0WiACXrnnbdevRJQaYKQbVgbne7bb77zxRef1cOGadiuE1hmWeQCY2AaVEq9WMYKsiKfmHTzj37ynWgx/eiDX7Gs+vLRp6ysFJdJXHRa7TAMyyoNAn+6mAitWs1OXlRZXpqOXUdoMp2uVivf98NasNXfbNbqBoKMsaosgBb1dkPwqtlyYoQtCiaLZbSYZHn66tWrza2Nd955x6TkD378o5s3b/7VX//H7Y3er778Kk3LRuhUQP7lX/z5xx/+4sH9u3/4kz+QrEqTqO57WZKa1LBMahKarKJ4FSGELi4u4jj+/ve/3213NARpmu5sbnElgdbRaoUBxAAmqwgD2A6CdfWjqqrpaDwejyGE8Spa10Om4/E77723u7urte71es+fPz8dX5+dXy6iFTVMqFUjCELXLfPi2Yvnt2/ffuvBfUxQWZbT6Xg0GOZ5juoW51xyxUteZmWW5HleEogk4xBBVlUEhZSQsiwXiwXG2LQQxrrZCBFCy+XSsmgQWkqpLKuKKOu0mls7fWKgrx4/+ujTXy9mc6WF7fterY4xtFxPaACxYVlWUG8cHB0Z1Irj9Pj0deCHvu9TC9csR0kAgSQQagII0IbtHG7vbnY3QjcQUquCT/QElCUo82KxDA+2At/lZbGaTZ1AxEme5uX2jtntbuR5LhiXQhgGsahvWwYhRFOMMGCMAaiKMvtHKjNGdJ1O1wBJJaHUAGoIYVHy9YnwHyHuQkml1GqZJHnOmESImNSi2KxKMZsuQ8dO0xSgbxoWVVVlGBoUVkWKoO42m9tbG75tYQTyJKFWVamyKnlezrIcSA24hAAhhIjiCoB/iOMBoCHQGnAJbRtmcV6W5dXlxfbObr+3MRgMMEG1ICToG7iT1lpykabpZDQib73lBV5aZasi3q/fyPJyGS0sRK4Hl1qJi7MTAoCBoEVw0/eZFFmRRqvpfDFudzfG08mT588QJudX17fv3Du4eeuNo6P21kYFwOlwVJRVp9NBixEXOTWcyXjQbdcglEdHe3GclmWJIKn5QbRKpYRI09FgijGeja42NjauLsdbW1sPH743nc4n86cQ4yhnluO79c5wPh/G6TLJPC+gCjQb9X8MP3EhMMaW61m23Wq1AEJCKcYYl0JKIZHiQHiet34SAwAwRMgga+GfkBL9g9pbaLW+DdUQGgbhnCPEKdGYACVBURZZliol/vE6Valv2goAAAIAxdgwDIINIQWvqkxLg3yjDhlP5hBjRExEMGeScx5llWEZhm0RSgGCcA2axgZjTAOAEAEEScmV1gpBiSGWEhNIKMIQI2AQCCCE3xSDGWOe12g1mqvFcnQ1Nk3TolQIWUSsSoUm1UajT4nl20EtbP79B780DGO1Wj159uTu/Qf37t3bunvfKnMIRJZGtVotTVeT6eDe/ZsSVJBorLVTswhBUcySLIMYuqZpm1a32YmTYjZdxlG5mCeXFwMpYTTPublbdzdCp1PEWViv/9Gf/pmQZTy/2Oy6vJyXRdRt3NrZuCFihzOFmCYEBnW3rFKTtlqNxsUlqns1SikXfLWMISZHNx8cHBw0alsANG1rk6NFxtK0SqlNG91mzgvBq9FgKAVu1bue4663/K1mN6zXk2jZ7u8KIZLlQmrVDINWp8M5z/J8Nl9ijGfz+XAwzvoFl6JWq5mmmY0TCKGhUTSZJbNFu93e3NzklBBuLIfXk+nUdd3ORk9KUZaFhsD2/X+wEEgAEQRaSrl+CpsmRVDzsvAssxb6WshsPrObbQgRwBAABXilyooxpqTAGJdrYAg1TNMsSxLFy1USW44huOa8IBRICbUiUgDOgBSIC26ZztZWYxWlnDMJNaX6/e+9F0VRksTD6RWX7MbtA79h//SXn6RVZPmg3qz3+lsQ4iIvq4rHKQFYPXr+6Pjy5d07t959762Hb9+dz8bLxYQVxWg8WMymzVpdVCXAuCpzxza3jm7ev317lTOALMutHd25g4nx+OtHBEEmFAXo8y+/Gs5WyrC3D24tZiuMYRCEthNIDRarpKw4E2o4HggpOZerZJWUaSUqk1JMEJACQggABlB9szfC66KXFoIRjIoiKyvNqiJJ4yhaGoax1e/WQ282myECEdRQScHK+Xye57nScI1CqioupIIYOY5T8QmBgJqqrKKt7Xa7E/zVv/+PlayGkyvfD6eTRcGKDb2xWi3IDL58+ZzJWqPR2j84mq+WURSPJ1POebfbTdN0Nptt9FoYw729nZs3jmbjkVR8sowatfDWzcPVfEKRDFwjy5PxfD4YXdebtb/+m7+5devOt779nU67e+/evcvL67DX/elPfzqb5fWgDGt+VeZffP7Z8PL8f/e//a9a9QbQkiDU7/Ukr4DSVVFaBinTJFkuao36Gw/u9Te6r169Go9GUso0TWeL+bo/kmVZUK+1mvt5ljTqYeC7c1YaJum0GrVazbIMgqBrW91u+8G9O3t7e5eXl1xUSov5bLlcLllVbW/t3Ll127QdiPFyMQtsk0ItylJRAjVAAHPOkyQpeFJVXEtAMNVCl2UpGYcQSSmRRhVnlFLbtgnGVVFahnlwsEkIuXnzZrNZn0wmSilqkOl0ihfaNM2jg8NWt3V8evzhRx8maXTj7s1ms/Hs2bOiKNqd5vvvv7+9vX15eV5m+Xw+50J5vmmU5cuXzxzHefPNN7Mc9Ds+QhQAYGDCkS7LUkvgW85Gq6O5youqSLPZaJxmxep6+OTzT2U6v7oaAM6xVtPhoKy47QZYS9cxgZIxAayqBFvbm6BhkGWWGAbVWkZRxBhb9x4rxlzX/8bJBL6heiPElVKSqW82u0CvXTbrduXV1dXaJOk4zrqLhCAUnGtKKKX1VtMwDM4rYhqQYKlFXuWtRtDf6R4d7hoEKF7ifnhw1J1MR9Pp9PJ6uEoTqTUiFqGmhgQRpDXUGmqhpYZKaq410MgkAGO4tdVHmJZlsbu3tYwW19fXxLGEEJIzixIEIaXUwAbnPCuLRRqPF1OAQSVFnqe1Zu2NG7epBGWZ59HSs8wg8ELX4VUOtMJGsffmTSG1Qng8mcd51dzYYE0XynR0+Xq23z88PHznrfuLyeDJkydJMk/ihed5hwe3vvPtd7Z2tler1fVmn0v10Ue/lVIXRWkbZkmti9OLZRzblvt733vj6OgoWhXEMJK4nMxjgC3HD18dv755527Q2bheRiVAqQLtZtNut/MqNQyDULrOfEgpESWmaSasKMtyFcdrG47juZZlWb6lgOKScyEghAAjA2PwzXkFAYQ0hEIpKdd6CAUhdABFUBuGBSGFCBRFtlqtZrOplJKQdSPmGwr42hBCqSEBUEpzLhirWFEBqAxClRLL5bJgKsuywXDq+36r1arX677lGIZhUFNhyKVEWmOIAUa5yLUGGiANlAboG3ICgKwo+To9u/5loV7nxEmWx5xXBsWu4xgIy1JIAaFn1OxwfDmilO4e7d27fe/i4mI9/Pn4539RVdV0Oh9NJ5eXl1cXF7+X567rFllKIOq1W6+i+ePnT37n975v2vZgPFDYUBh6nkMNK0AIIq215kyen18/ffLiydOXVakgtspChEETbOB+dw9pw6C2MLSqGArDH//Rn0SL4ZeffPjo0RfJalr3LAJ8360bAZkMru+/cxDUa1VV5GyZFtZ0OhZSc6WlwkAGjXpvb/P9rY1Dy3BlDsej2dX0Chio3mlgC5csV0BgDAHU9dBv1EIhxPXVVbJa2hbhXF4NB9p2JNBxHkNEuJYSao0hJHg8G7daLcMy8zzPi9S2zXqzIcaTIl9tbGyENWeVLKbTaZTHgEKAUPwizvM8z/N33nmn3euut6hKqcCtVVUluFAAYIwQQExV67b0uqQ0X0ylYP2NPnQsVCSiLAzTBBABLouiKEu2zi0DAEzTNgyDIMB5pQDUACFs1kIPIZwkGcJ6HdkWCuRFwZhK0rzRMGuhl2U8z3POBUb01o27/a1+VRWWZ/z9r35xenW6/Hr+6aMvev0ucWmn333w8K4XhNPpfDyZlCUTu6gs87LIJqvFYDImBrQIqTcaq+XCdd08TTzPgwBADQjCDT/c8DcajY7XJMSpu/XO9t5+nGbnV5erxcTxXK3h2dnZ+dU4aHa3tg8Dx5nOZqmUySpJy6qsJCaGQcBqsczTglIquKKUQltSSgnCEgEgJAAKAAWRxhgTggkmCCFMkG3ZZZlzXkIElJKDweCrr74kKu10OmUx39zctC1Y5sujwx0hi5Oz8ywrKiYAMgCEhNIwqDWbzazIm61ws99ZLce2qe7euzUdjz/45ceT+bgWtoSEXIrFajmfzyRQg8lUKblcJc1O++bNW7P58tXxScH43t6eZZt5mmAAKUFbm/07N298VaTT8XB4cSWK4u7No263K3imeaEBwKZhu/Zf/O3f7u3s/+KD3/xf/u//j3/1r/6Lne09Sswf/eB7//RP/hBD9LOf/eyDX/1SMo4hSlfL/+7/8//+z//Fv8AQYgiUlN1maz6fhr57eTESQtimtdvfIho++errdcF1MpvN5/PhcIgJcRwniiLJBbqlDYMahGpLF0UBlG7WGzt7uwCALEn6/f7R0VE9rF1fX08mEwBA6Pndbo9SAyF4+/ZtPwyyLMuyvO7ac8ckEGTxcr5cRXG8StI8zxHCRZGuFhljwLOxbTprx5FWGgEINVBc2KZlfHOeKbXWt24fIYTu3b+9t7eXZRljZZ7np6enZ2fItu1Gp8GUGExGSZHVW+2d/QPDNm4gOJvNeFm9eHXy6uQ0S9J6vT4ejU/Ozw5293Z3t4kJiQmD0F4sZnNCAAAUE4pdaqCqUJwJahuL2VxVHHLpYOoQmrEoKvLnWSqKSGv9xr3brUbj57/6QHFWD31WFWWaEERqgU/X+nOpFBQIa9syAQCK4DXQ0LIs03IwxllZSSmziq29JBBRhKACGiINILBsyzCMPEmLIgMAuK7d63XWzxOlZJVnBkbQMCCEg/GSUtpqtbSWRVVSiqWUSZEoDcqyzIq8ZAWCEBPtuKZj+oFr2BblvNSAFyVTgDHOKsZN05YaAom0BloArSHSSGu9WhWe59++ccSkePrsBTUtBAHCUCuw9jHyik2n0yyOOGMUG8PhcL5almWlNby8vKz5te98+3tv37lfRonK8sAPk+UySRLfD5IsXcbxXs+/fXufGlbOxKlNZ6uk0291Q09BVMWTkyefdwNz9+bBP9W/C6vo0aNHX335qNVqNpuNbq99dXmOEKqqwrKc0HcxNZO4sC2rtFkURY5p5lny4W8+4lJBSIaD8X/3P/y75SoOm61ub0MTQkwLGabheLVWhwFo+TWM8XISaS01wIhig9jf4CgQSqJISIEINB1CKbUdSgjUWnPGtZZaCwgRgFIDpZSSQmkI1tGzdRl1TbgCABScrXGxhCCglRBMa40xVv9wO6C1FkJKqQCQEMI0yU3TRJAgiyiNuIZSAKGE1jpnEmfVahkBgLKssC2r1Ww2Wh1iUIhRyUueZ5JLCQEGAEOioAZKAIDXDTEMNULQdALOmBK6ECWrOEKIQK2RJnG80IApxZWoHMuq+x6GJHQC13aKKBOVkCXb3tyCUF9fX0dRhAiN5wtiUITIYDCcjCZ5mv3pn/7p7vbu08dPxqNRp9PJyoxL8fjx1y9evFiVkiLseU6n3Ww06kDL1XyxWKy++PzLLKuipNSaIGwZ1DnY69y/8/Bo90aapqxgju+WWUYFcLs9t1lfxvnlaDaexRdPL+aL5I9+/Hube5tJEQNbliCpZBEX2M0tiLXjONRw0rza2Drc3NrtbR1YfgcYjirL2YoP5kNgQgjg2eXZfDWFWtu21Wn0HLPmOTUDk6qqKKVcCoBgmhVfPvtybXTVEFcn1enViYbYNM2tft9yLMexPd82qWFSU2tpGAirvN/fQEidn5+cX14sy2UOMkqN66vhar5wXf/WndtCMIsaJKylaaqYBEJDBQkCCBKANJYEIaG1pJRqoKbz+Ww2EYJt9TcN16wKRhBCUpUly5KcMaakXo+FXNc1TcpFNZ8XJePUtP2wDkBeVTyKEqWE0rKqCmrRosyyLJsvFqySgmsAMed8fegxbUsIARC8++D+IloMx8OCs7fffzMIQ2zQjc3+xuZ2FCXzk0VSpn4YLAru1Zp+vRGtZq9OTi8vz3udZqvuI61v37q7v7WjpYIauZZrIqMqGAhNLknQbDuNLWhaxHJcTHf39inFQFSzydQimEDF81Tn2Rs3juy3714PB5dX11mSV2lCLZdQGwghZAGkQgi5psERVEoBJaBWEIE1RQ4hgAlECEEEANRVVRlkPWmACGNKiVJisVj0W6LXc0xzs9vfIIQNBs82t3fbbfvRV8PRZJ4VZVBrtTtdz/Vdn1oekIAMB5dVFR3ubYwnQ83E7/3e716eDV48PY+SbGf70HK80XS5WK6UElleUVMPrwaDyRQi0t/e+t7vfv/4+PhycN1q1BHQlmXVwxpUkrPy6uJsMop44U+u8+HF6c7upmCVbRpBLWw0arPpWAD0F3/763bL51z+n/9v/69/9k//0+3tXcdnlolrjeYf/P4P/uSf/FhL9ZsPP/zis8+KLFvMJqPBsFmv26YRhiEvK7veqIqsqirLILXAW8wmjx8/fn12urW15bquRcn+znar1TId++rqSgiRZ4nnthmrgNZAKYMQCMFGt4sQms5njUaj3W6fXpxHUVSv1znnpmkau7sbGxsAgE6rFcfxZDgAADRr/hWGnVpgOe56dGEbZrfb7W9s5gZ/8eLVq+ev4pXMQAIhgBpAADjn6/i9RY08zXhZMSGyJN3a7K1Hbpxzz/O0dqlhdXvVYDRM8+zs4sp13bxkrU6PUnp6ebW1u7WxvdPe6KdRPJvNnj17Pp/PN3tdTNB4OCjLfGuvf/fuHakqJrOT8xfpdOw6vmvboVd3bY9Jzjk3DKPdaoV+jXPp+37oB8towRjL89zzTdv13n73vWWUjEajV6/PHZMWZTUeXNeaDWddvAOAsZKXCgPtONZ4PK4q7gcBIYQJEYbh5s42ACgr8tlitVyuKsYkBEBDDZAGQkkVGkG324ksc7qYFUXhes7V+ZVlWY5l2567/iKEKKU8B2uINrf7AAAyogCAosi0wlUploJnaUUtu9trYiQUL7ngvU5PaxCt4vl8sSyWTAqNoNIwKSqtoNYAaII0QohgiCHEFjXLPJlNR7VGQ0k+vJ5BTFzbUUrFqyhJEsexFrMp1EADVZYl1iR0whu7NyerFbXMt95+9/e+9ztEgc9ff2xIRVz82eePlqv5d7//PWw6EpDBcJpXyvFcz6+XTM3ny+F0jhF1PF9U7FVZpavojfv3arXavVtHLsUOQWmapnH69Otnk8nk4MY+pRRDBCFwbTNPUiG1FGXg293Oxvn5+dNnL7obvVs37wign794JZS0LKvdbsPlKo7jp0+fJllmWVa72ZJcsLKyXV9rzaUGiq9TBQRCCLXvu1JKkoOiUFprLYWGQGvtOFQIIAT8BnCFBAQAIE3WnRKItdacfJMdgRBixjnnQnKlOCvziuUYg3rDp7S2vvKQUpZlWVV83bjhpVCEAAAIMSChQiFVVRIAoRiAhmG7ZlEqBRazuVaiSLPNHe54ru25AEKlgNIQQA0hsqgpgRICQcGU5JBLCCAA0DY9ioXgoCykFoAQYpmOSQ2SpAuCseBZGi8NBE1KV7NFvoiODm4c7uyNxoMsTipWvPP2W4TC58+fG5ajAAqDkCAsgVwuFh//5tM37r/1/vvvtRqd4WC4u797eHDDdbzFKtEIpymfjK7jZGUb1DaMPI1nEx7HwDRBuwU9yysqQYi5sdG/dXRrZ2cPSUixsVwu22YbUJhVRUADQHHv4OabjJcVX6XZLE1Pri9LmU6W16MlgBA6ll0CgUyCLdRoeUG9MZ0t6g272XecuizBKInYchVfzh9nLC9lBRQXvLBsErheWPM9M5BcU0objYZlmibBjFWYkk6v++XJYw44pVQCvUgWJasIIa1We2e3H2XzRthoNsMizxGW3V4DIkXNzDDJxcXF5eIkVdmSGWACLcMuZJXJ0kHeKl6+ePGiETbazbasuNaSAEQwVUCv8Slc8fVEMU3TqioYKyTjw8XYCd0wDJXmnHOlqqIoueBgrfcAYD2QpNTUEGBiaAjKinEpsmgEIFxFKwihlJzzykcBgoZlwjDUjuNNp/N2p2PbZhDUGGOCyzTNlvHKdq17D97wG7Vau95oNZ3QzYoiL4u0yBfpKsrTs+GluJA+3crN0jRomlWu61ZFrpSaz2Zvv/Fgb+9QFEUWJ1VeuLYvmZqOZhR1msPpvt+pdRsckYwpKTWiZGtri0IFBL9z48C1HWI6N/e27t578O53v3VxPRiOxk+ev/jrv/35V0+elmVMAMQQSlbJ9edNCsmY1pogTAyKIULoGyg4gEp90xbjeZGusc6cV7Zt3rx19O1vf/vmjrQci/NmyarhcHh6PovT8cXg2rSFFyCAkWFx09ZegAEq58s4T2ZffH78zltbnudEq/Lk/My3Fu1ubzEriop5QUgNu6ympuXGWcIUJADZrlOW5eOnz/OSHR4eOo7z2WeffP75555j13ybi29ppdrNumNZYVgA4hgG4XkazSeMF3e/8y3XoyVnTOmLwZADkAsVBI3hYPp/+r/+P//4j//k4f3aR7/5YDIc2bb9kz/4g2+/963/7M/+6X/5v/kvXj1/4Vi2Z5n1sJYmSZamSIM0ijFElmEGQeC7HlAaAVhm+bPHTxqNhuU6tVoNAhC43r3bdxBCtVoNQJlES8dxPN+xHXM1XAjJWvVWmsVlmQ8GV1kcBa5TqwV5niOEDL8mFReMI4Qkr/IkNg3Dt403790ruTg/PZkvV/1e7+ad+/uHRxsbGwuVPHv87OPeJ69fvU6jlJW8zKuiqATnhmH4rheG4TpfYhv0m+G8lNPxBABQr9cxIkxw07Qare5gMEizUmmEsNFsdUvOJtPpNJpLKZMo3dvbu3vnDsDkow9//ejxk26raVrkanB9fX313rfeWs4nJ6evxpMrGeQN1cxKI07TVtiSHPBccC44k+uWuZbC911CUFUVI8HqtcC2XN+2HMe5dXR0fTWMlwts2MPBlVTccrx1rVEJtr5P1NTI85wxZtumUipOU8YYJHhze8fxgiYmGsDFKqqqSnMhNTR0VhRFre60ezW/Zg2GZ2m24CKr1Z393b3bt2/v7Oy0m601d0FK+dtPfzsajfr9Xq3ebDSbSZLNZxPXdSfjgYG064X1WqcWNnmV5EJKwSEwA7fZafaur4fXYljkueFalmOneQEgXINuNCQIAoAgwtDzHAjhy1fPa/UmpZhQZJhmWK+/fHl8fX09mUSdlgu16na7vue0Wq2aFSoHK0W3t1B3Z/PG0S0t4Ucf/fbq9fn9GzeipIiyUgKyjDNs4oyLx8dDIS4b7U6r3TVtd1bg0XjheX55tfL9JSXENI8//er57tb20eH+O9/+AVT4gw8+KDNWFAwhPLoeS62EZKZpzucz0zKwEGUecaVX0ZSLfGOnRU3T8R0NAaFIAT2bTW7evtVqNbIse349sF2PmpaBcZYm1DCISdYZES4E5xwqjRDAGCstpJR5nud5BiHEEDgWNU2LsxxCBaFQCmgloMIYYkK+IWIjBJUGSAKl9JrUiQ0EEUZClpXI8yROVkoJ0yKO6wCw9ndgiAyMv5lAQw6FEGmaC6EAIlxKqSFCSCpYSS0VAJhAhMsym46mZZZfL7Jer9ff3qrVapgSAwIFAUYQGUgJCYAUQsqcc8YAABjoZca01llWpqs8y3KCcZEKQhAJa27g+aEXeo7nGHa8WI4vrlcLSeDrW7duCSG0Ei+ePkVIR9Gy02npqojjxDbsxWxuEpMS8+WL8UcffLSzufXuu9/6zce//uqrr2vN8Hd+9/vvvPOehmqVWa9ePDt5/SqL4yrPkIbhAQo8D2OMILkaTJK43N3Z+uEPf/+tt9/tbPSLrGh328tkvlotgloADUcCUAketjrvfqder9du37mRLi+qbPr66hTKcv/BO4yxeuBrJaht+XWv3g5anXAWXS+zSzNVXWDPo/jrZ8/H89nJxQkTlVDcc61+b+v2rRsmMh598Xg+XhnQBY5yHMc0DCn52clZu9PY2dk5np1qpLMywxgblmlhYph2ELizxaQqGNxVvU63WhbRcmEQUpTJ9fxMaXB+dZnLrLvTCYIaZyyXwAk8ziU1yfX19fByuLe1e//OvdFgeLTtUcPABq14mZc8KzMOBCIIY7xYzLIs8wPXCV1iGAIqTSCB64eOZIxpDSg1CDG01pRSJnhRlRBqx3EMao1Go9lsBkVqOTZjlWlRrTVCxHU8yzazLPMCnxBydnZBKF2tVlrr+XxOaM33fcuyR6Px9t4modR2PWzQVy9fm57FuFxEq1WcIII3NjdN0yqWlhYSIkBMq95s8SIFkq+Wy48/+iSaLZCS9SCsB6Hr+I7j+W7w8tWp6TWJ37IbXeqajLOCZXGSFfGiHliXlxdXl5cvX5wTShezxXwyvnP/TqsWHty+c+/O/cl49uzJc6bkZm9juliyvORSEITXEQ+EkGVQSAnUcF0KXyNL17q8IAhYVaw/e2VZuq5969atn/zkJ9Prvzk9fem67nyxKFlluwgTYdvwzbfu5RWbTBfTeQQgA6gCEDOeM8ZcF7z77rsYY8/zLMv6D3/5VxvtnV5v4/jltZIAQOx5Qa1ZG40Gy8Wqqnit1nA8bzqdfvrpp6PR6OGbD3784x+/evH84ux0MBjM5/P97f7t27e73W6RpxYNe5s9x7UWk3HB8u3Nflmmzz795MWrl0zpeisg2Hz8/MqgYG/36Od//+vV1HzzzTcbd25++fkX//O/+x8eP/ry8ODgW+++12jU0lV07969na3tr7/66otPP/M8zzCMrc1+HMeLxeKXv/g5MajjOHu7O6ZlnZ6e5nl2dnb66aefdLvde/fuHRwcCMk9z4miyHGcmh9cEzIejyejse/7hJAsy7gQzWbTsqzJcCSEaHU7EGMuKiGEZRjtViOO2kAKgJGypWVZUeIsozjP8yxJtdau6/q1mm3YrUZ7+GAwnc4HV8NXL47Pzy/X3Pd6o9Fut4sy813P9Z1Os2UaFoKYcx6tYkoMjLFQklLTcwPbiauq4lzGWQoBRggBTZbxlFKzZFWaZ4tlNJ8tKy4t2z27vPzWu29m6Wq+XASBV+bRaiUPj/bTZYIoKjkrCwYAAgyVSZWZOWxTg1CtNcTItu1v2HWSL+eLGEcvnpl+vWlZBquK8TzvbXUdxyaEKMEYY+tbXtM0TdMglmPum0IoCCHjUgGd5sXr168vrwe1Rsv1fKGklLKoKiEUAAAaIq8KBXWz1UAInbw+XkVLQvCbb35rZ2t7e3vbc12l1CpaMsZExeJk9frkle06lmMjRDjnZcUJtvb3jpQsHDtI4vy0yMtsZVDtOPZiunI8d2tzN07zVZoMxwMJtNbadiwp1io0oJUGGCAEEAZSsPtvPHj54vji/DRstDnnrhdsb26enp56nidYSQiZjCIIJ7a1EwRBlTEmRZGUezeP3nnzfSb4L37x9//+f/yfA8c+2j0UlXj41ru7+7sA6VUW5VKezZgsy8oIz2YlMXTJ4OtRatuyVqudvrrWUuzv7SiUD6fP4kI2N/ZrYfP18ZnrOo1Go9vdODs7EYIzWd27d+/09PTg8JBS//T0dDYZnb0+oRblGmV56njO0dHBzs7OaDz+9NPP8zS5e//BeDRbLBYUQllVEFNVVfV6fSLStZ1LCKMsS875emCJ0fqKCkOtyyov8lTwCiFEsfimyCqV1hpiahgWIQbSGkKpAJNCM6mEEGtgNq8yhAHGSIiqrPI0XQGoAbSEKP+RAbMWcEgplQIAWEVRrJaxhAgRgolhWY5pmkqBquRJVggmQ89Fvm8Q5Pvu5XLhBH4fQst1EEJ5lTPGpNQYQwWAFopXjBclKyutNYFISbx+R8ZklpVKSAi11poIuioQbzdcwyxvvnnzzoOtd79z+4tPvyxS8fXzz303ICX61S9+8/Offtjtdv/1v/43NdT81d/+dq28tExnsUgUBB99cbx/6/I7333/j/74X3/51Yeb27UkveL89Or6dGP/J3/4Rz+qiu8XUWkRczYavj5+wkRiWuBqcBlXMOjuvP+973/3R3/W6d5KEqmddLCcEwItQgEkFCAhFVQUE7MsweHth4Vgo2vy8ourWVL4gXVgbO/f3tVIj8ZXELH+flPq+Hj0eFq8yst4xYNSXbhe0wS5UfG9xkbd7UZRpJXwrVbL3yqKIlrls9lsZ8ttdFzHg45tPfrieDRY+W6nyjU1sNaaYkopNg1kWZZlEAPE8XSVRCtYXmWLZpkXWutareb7+PbB3mg0mhik5rmmYWhITNdynRrUuJzEKq3e3dj67DcfR4v48uwiWq7md5Od3V235pc8y3leqRJTZNvWYDCIRTKLJke3vrOYzT/77WfNoBWL2FLMcbzpZOh6NdPzoyRBBsrKipeVEEwrYSCkFbNh4cIqVanlE9smhmFprTFFjuMQ0wAAQG14bnBxPbANV0s8G6fXF/OyrEx7Nl3Ep6enaZ49O764c/8OxPrjTx5DhHac1snpq1UcJXlKDFoxmGQp0gZXrF1vcJZdTCYIiMC1G1vbqiyv54vFZLLR6/Xb3HCDB++9//mTFxN+/fXJWXPrHqsu9g92m21Lqezl4w/iZHWw92A8U/NlUPJWq+ZT03jy7LdffPHozbfeml2eJ2V+dHO7v1O7Gg0Nr8R5WnNpELShIrZhK6HOzy8VF4bhEYoqUXFRmpYFIMiZAJrKQiBk2qaRZ8ui4ptbrR/84B3HLs+/+lprNZlOuJJvvffup4++4KIECAwmg2a3Rx3DLq2KCWoY5+eXEMLx4OLwyN3cbiyjRRg0948e3H2Y/s1f/7xZ6yiTPDt/dfPgVpxn0+Xq9u3bQdgtBPrVr341evp4Y2PDqXtPXz69GJ7dPLpxeLC/udHL4+TTTx4d7R71Wnt7W3egdLDr5FWpqMSegQU6ny8GafHBo2dCCE2dVVGGDrl7b/vp15cEZN96+9b929sXFxfvvff+P/9Xbz99+jQry+fns8Hi703TqIUuEPxelm7tbY9/8deJTB/sPGjXyOir8UV0rSWwpGOwyixyiuhotuh2WmmaEaRfPn8cLcfTyfn7771XVWGSJJxXhmH4jn3n1mGZx5qXokxsilieZSvudjoUMMGL0ESVQ4qVogZFPgXUSYGKkmx7ezustaqq6iJjvIhPjo8pokd7u6vRsMEDv+K32p2H2zuGYVwNBr/4+199+GuZlUWcF4ajNOXLaGU07DsP3+jf3jehhNBRAEgpE5ZalmXZDiZYI9lo1KbTqVKq3+7OZrPlbOq7buD38rwM27ZvuovxjBWVazm8yLe2Np++eOr59NaD/ednX5kW3LnbefHySS4ntuZ5ztOFpNja6e1VjsiiOEpGRZb6geNYdlmtKsEhRvWGpwS9urqqKtjrlSpjO51u0y+pYSGTHh7spWU1WS0sz68ELxir9ze0LC1OkyznTLTrzTvNOwDAKE7XXWgm2SrKcIDbNT+OV9PpFBRmzwl6jidWsda861rW3pbnOfcONsPQjyZXz66uIUSO43HO86y8unyJWHb16mnTNxfzJZdKFFHOWLPZ1ArEUXF1taAEZ3Fqm0a32/Datu3VqB3cuW16fuOjj359/PolVIgzoZSyTK/iYrVMXNe0PTdZpN0N9ur505sHN/Ks+s2vP0GI7obd/Hr+YOvGub7A/d04jRHAlmMCg8RVpdEiyap6r9/Y3j8bR59+9uizT79QxHVrjVmy8ix65/7dvCrPL65bvQ0OljXfQKF1enIehnXbMkaDaxcqlsYlUFWSIAQUFw8ePJjMJynjJ9eXNtHQM4FjNrc2kiRRxDANu+5YhDhHB3ek5AUrQj+IFytpMF7xRJqPn5+/+RZrN7e0UgQ6+G1ndD4u4qooGcSQCQ4NksgSucZKFgywZbT0vMAgJqSmY3paSKgVhoqzvEwjIGKPypKtijw3DMKEBkAhDDQCnFcVLyHBhmnbticEZgJyASUnTCC+HqYq8Y/MK62QY9YZY2Wq/nF4tqbRG4YJIdRCJJEQAnIGpOQYK0AUK6RAWVVVjmGAEhjIjZaCUsu0fIA9YhmLiL18fSUV7vd7BrYA1NTErKziVZrFiZQaAxNBpLSCiLJsprXWgruWCXxvPcyDEBLD8iAmUZTkqBxc/f3NnRu9Xu93vvfd8fXEQDDwakgjCPDV1WCz1yCweuPewz/40R/++Z//OaU4qwqTUI3wZDD9H//7/8kkxu07N3qt7U4jeHn85XSSYuUNLo9ZGrfqPcs0izjlTFalevrsuGApk9z0ake33rx556EbBgIKYGibWAwzhABGSAOpwT94SgC0HQsAvpzNr6+vpZTNZrNR96azoedb9XrYqte5zpN4Nl9dlmxZlmUtqEOMvnr8Natg6PfqYb/edJ1c+L7PeaWkfH12mqyioih6vZ7tON2N7ubW5mQ4i5IVsRAgGkKAKbUsS3KWJMladhJ4DueVaVAEsOcGjh0ggIUQWsOSCcexNjb7xHKXq2SZ5JPpoqxAGDITO7ZlqUpGq4VpmtPp5Pnjx7PJLI15war+9mZSxtQkezf3DMccT4brXGu300uS5NPffnb84phX4j//F//CMIyqqjqdjpBr+aQRxzEASGstGGdVwSCgBNius72z0+62CNWO62ICi6IoigxgYNs2NWmeFxBChBShkBAoZJ5mUZrmAIDHX331dz//ebfb3T88iBbLaLW6OL0Im41uJaWAaVIu5ktiGlwKAIBjIUhMgihFOHA9y6RAVPPJvBF6tu2G9TqCeLFcXVnDDQlM07YMKkV5fnpCD+0ia14VY6EXgpcvnj0rM6WVRQkMAyfwbSmq6Wzwi7/7KQb64dsPLYKvz854mTUDN5pPGp5brzcf3H9IqTW6Hg0H42boE0JPLpYYwyDw3MDlkqdpJqXGGK3JE45rSI6UiZuNwLHNLI/v3bt3cXWuYx3PpqPZyHatssyDwJutosVi9vr1iZTAdgLLxrduHwoh3n67Np/OIKZcaS+sYyIevvnub37zaDiZJyvx9NlotSp9N7i4uEqy8s0337QJffvtNz7+uDg7f+37nmmRqion06FW1d2bt7Z3+4vp5Kuvvnxw996DN+/tH+yMlqvPPvuiYmxje2eRJE+fPn324lWRZQAR33HHi2w+WmxtlP/8z378ox/+Xq/dsQy9WKy2trYIpWFQBwheXFz8+sNfYQyj1bJMo78N3D/8/R/3+1tK8MV8aYVeq9mkd4zHj58+fvzkaP/o1q3bSIM8Dx3HefjwDa1lkSWtVsOyjZfHx1fDZa0WHB0dNZtN23Y77b5hEARJVUqpysViZVlWu92p1xtSzqbTWdDpUUyUUnmazefL2WTKGJNCtJpN1/FMevXSMJv1Rhh4Z6evv/zis1an2e/3fT+UUgZB0G63/8kf/tHNW7f+6m/++tGTp3EcV1W11gkCAHrtTpmtCDEQQnwNGYRwra65eXTjq6++9lwXITQZzxAA/X4/SRKINGOMc+44XhiGBHdYVQpeViw1CGrUakiD5WxZqzuTMktXaZaWLB9ibRtGACF0HKffa7K8GA8vIbAcx3EcByCoNVASEWLESVawrBjn2ACGhY+ODhAxiGGYtruME0ppo9Ycz+dRlhuWORiMAAZaa86lkgAWpZXntuU6jrO1taWUEpK1GnXG86LIPNsMPQ/nACJtUwJERQlu1IMwsMMwzOLo5NXL5XLpun673ZWcAaWajRoAO8PxiBLz8uw8z4uSiTCse657dnqKAayyBlTSIDhPM8cytJR1p2NaBqHU88P+xs7uzmw0iaIoIthmrKqqAiHiuD41jKxIkyz6+OPBw4f7G5ubrXqTMfH0yfPLq3Nq2kdHN5t5DRrE8S3LNxXQQgvBq3mV3Xnw5v2H75Qc/f2Hn3z19ReNMPj+e28jwSgQ7VbTIvi3Hz86Pjv79nd/t7+xMZtdryu4YRi6rucHHiHE84J6syGE4Lza3t7CBA6uruJ4VQs8U0WUIMuktm1/8cUXL18+b9UbP/rRjxzXEtyllLqu47su1HqxWAAA+k7bMAyI1Odffv782TOt9dHhje397Q8//E0puGm77Y1u2GwBgqVWZVkavgG0ppis644GJtgwCYLT8aAq0yiKOM8sA3AhGZcQYCC11gAThCgiGAFoAIwIplWpGWd5oRhHgsOKa1ZJwYEqs7VJhxCyxn1a1F4bD9ahAQPDNZ973c+s1WqMsaIo1q2Etd8cAGCaplKqLMv17GqdWpvP5wCD6XAGJWvWPCWZQaHr2hjQy/OTMi8Y4xhjDLDiUmuttJIKSKmE1ABiy3Ztx1tvWch8EdVrNWEC17Svzq4bTt02zHo9rHuBLIpmo4E0AgCsZte9lpMsr+/uvfGTH/3+//I//f8My5wti2bDQYgOriMCr//y3//lX/6v8vadg3/zb/8sWbDJdSRVdfjGZplMYRhu9HqVq0KvXlXi+PXVy5NJo9O+ffjmt77745t33iCWmfNYQESBjQDECAKgtFQKC4QwhjiKo9D3eFmMRoM0iZq1MAzbrkeTKYuWE9OA7U49r6qXV5enV8+JKbJisViQOI1Hw7lhBPfueu2O4bruxfAsyzKtdVkUk0mZrCIuxNbW1q2bd+bLBecCIbJ/Y4dVQkqBDbK5uVmW5WJZSim5UIIDarq1sGGbVmJHFCMICaE2JnodMGYsp5S2282wVnemyzjKqrIkEGEIfcetdFWWZb0eTgejoihqtXCxWr58+TLKE6GF4RhuI/RC9/Li+uXLl8evX7ZrjVPD/PzzL6PZokyzP/0nf9xshVG0bPc20rQUjDmuF60SCHGn3U7TOI4AY5XSkmBs+a5pG6XINNIKQEggNrACiqtKlCXjlUbQMGG94dg2pobyfGpanhBssZhdXZyt4c3n55e+7/tuwLLKxHbo1GIjXYLYgJZpIEIIRsZqtUphxPICBCFQGiiIEJJS27ZrUQMqXWZ5VUrDcu7cvT9eLuNV8frlU9dwuy0fkYKYea8dWlTLKrtz89bQjUYmhIhpVWrBzo9ffOqZZRl3Nzrtmtdv1NM82dnovvnWW6PRhGg2v55cn10Y1GyE9nQ8adSaaZoYhuE4zmI5Z6yyLJsQZAe+EpJihYnqdOubW51a3W22Qkm2p6vZMo9KXl4Pr9wwGI1HtVart9lexWnFUstyEZZ5sWo0WoPBNAitpKiuRlNWSUQCxWGj3TfsYDafUwqjVE9nqyBszZfx5fVvIKHf/53vfP93vqMk+8v/OBCiCkKP8wpC+dnnX2Mkfuf979iO8ezFE4rVRrdHiP/Z148H15derU4xLtJsMJycnl0QREfj3Ntx64E7K7Nuq/3t998jEL4+fvX3v/h5nue+H+7s7fZ6vRs3b944ujObzH/zmw+vLk+bYRjrLE2KO7eOxqNBVcm65UqhW412v7eRJfn+/n6n0xYVPzg4eH1yfOvmLSn5YjkzDEMItlhFBFOg8eB6PJsuCSGWbVJaS5Ki0+kVRZGlFUKAYEtrvVwko9Gro3ucMYYxDoIAKu3ZTgkRBnqj0y3LkiD4zlsPfd8XQozHY9c2f/XrD28d3djbOwjD0Pd9wzBqNWOz3799+/bl9UBC0Gm1AUah86osiuFg0Ki53+jvtP5mMi4BpOr88qpIMwzXYVa9tiTU6/VlOldKZVmmxIiVlWmajmX0Oq35QnGiNro9io08zna3NlbRzCJOBVMloef6Da9jWbZSAGkAoV4ul1WZlmXRaNQoNSGiEmnTspaXJ0UZBUFtY6Pj+2FZVhXXRcmEgq9OzrFphc32eB7ZhtvtbRRlNUqWpmnanmUYFqWUawBYhRC6HlwqJS2TBoFnGQ5FwMCw26g3qFcUGUJIVVlVSl1lgrFM8/l8Ph5N8jwPglqyXFQlVwpYlkUMjDXodburKLIMsyp5t9X2PC9ZRWmczKezKk0xglrIwHeVkL5TKCDDetMy3Vpj487ddzUMx+PpyckJJqKscoy17dkaCM6rnt9pHlKTWl989bllulEaG7YhlaBQzJeTrIw1gwBCP3BLVsTzlWGQe28+cH1nES0Btm7c3G/Uw3i+5FnSa4YOgr5Jh1eXs+FwMZ6+ePrsjYdvOY5DKT08PGy1OkVRtVotrcDm5maWZePx+OjoYH9/97e//Wi5mvd6vfOz13s97/BwHyHU6bS2+xtKlFJKg2LbNLlteY7b7bUd21wsZ1xUjmnNFUFaZVk0nV3PFuONjc3do13b9fQnqCjZcpkVWtQ5dzwXG5RQA4qMEEPLcr0JEJBRTDCEaZpXZZ6nRcUKZWENtNIEQKNiknOu12U6BKUUEmgAhRCqKHlWcM6A0kQKyLlkFTfW7gWMFQVQYs15BbiU0rKsNZECIUywgTWRUkOJAQJr2ccaRPaPpgal1PoVAMB657EmK0ADGAhCxYeX5+dV4ftuo1GvWJHFyTcwcmIqjJXUWmsl0TopvG7eGoZhWZZpmpRS0qj3MEKj4WIi5+kieVI8yVfxd955z3Wsbrdec716rbZarRqh4Vp6Nb+ajE+bDetgv0UIcB2xu7sFNHEd0G5tZulkNptxtpr8+DvT4WRwOd7a2rARzKtsdH1GNG3U+rVavdXePjh6cxbD/Rs3Hr757f3DNx2/wbXUWBgmqaIcQo0wgZpqrYAECEMIoGObAGqEges4Gxsbvq9NU0LNYZHFqwkrIyH6abZ68virs8uXjY7PVVaKPCskq4Bt52cXFxpY7dZGEATrQDVCSColgS45i5OMCV6IsmbWhBBMFRwIrnh/o+2izePjY6VEs9N2XdcwzcCv3bhxA0i1Ws6jaJmXhRCMYsQh1FpBDAXnSgHP9wm20qR0zaReb2VxWWQlECKLIwKIH7g3bxzubm3/5qOvP3/0JXn2xAm8QpS/+eRTL/Tmy9nlxfl8Mg0Dr+GH8/EMK7CYzSej8U6v6TgO0FoKkSWpFMoiVAEE1tg2hCilmBAABWdVKZllkvUekRjYcH2peJYl616ZaZp+YFKjrhTAGPle3TAMIWW9Xu92u91eWzA+GY1brVa/05+vlqEXxG5iU8uAholMDQCUEEquytLwnZoXWASXaUaxbtTqZZpwzjGAjPGSi7LiUoH2Rv+dt9/44rOny3l2dvbcdWF/q1awoRBpr1czCHr3nXv5bX3y+uxq8KpkwHZb/V63Hhqff/xLPwwevvXGH/zutx4/e3rz1p1mp82SSAM9KaJ4NqrXm0Wcnp7km3stzrmSEkNg2zQIO47tLZeR42BRKSXLRs17cP9Gs2mvFrO7d/YnMfXCQE+HtXaTK6GhZpLNltMt3yJUBaFTq9UrJharITXAxfkxk8Hmxhbj8tnz4ydPTotc9do7j5+eagza7S3DiCXECpBWt/fq1euPP/2sHlp3795tt2q7O/3ZbObYtLHZrddr29vd6Wj85Omjrf5GvR36dY/J8pPPPnn02SeWYW5t9GTFJ9ejUkgtgYHMdk1JJgSTjgUQ1KwoXlyel3mxvb17dXU9Hk8QJuPRZDSe/PjHP/7hD388HA5ZVfVa9d3tfr3eXK3iq8sBxrjT30jjDIfk1q1bh3uHCKEkidrt9tb2xq9/86vDw33DMPKiuLq+Xuc8knht6YSO43mep7Uui2q1jIQQSkvOebvdNgyLc06paRiW5CJeRXlepmHmeZ7veQalQOskXi0Wi8l42Ov1Hj58OB6PqzLb2uydDa+TPDu7uKiH4WKxuLy8bLa7jVbzcG//ZP+gFLxZrwMAdra2bWK8fPb88GhHSg01wBgjACGEBmaCUlXxu0c34zSVUu5s7T5+/PjZi+etVits+QahtmnNZrOzk2OMoee4jmvWA5cLtLu5ZSBcpoWBaJlUUEBe6m6nZxu+ElpzPRmNB+fXEKiqKqbz6TJC1CSdjqckZEIS07I8ajoGNqBCAhuwFbZdJ9CAPHtxbJqm1EByYRLTdcxWvZnmpdVqIYQoJgghJbkWkiBoUpIy6ZjEsilSglUVKzIopYaaMcHLXCmleUpNgoGEqsqiDErR77XXqADJmWtbUZI9f/4UU7K5uSkZB1oXRSE4T+OEYlILwjLNV6tllaW2YUAAijRZzOZh42anvxnW6kqS2TRarArOqdbW0c2HGOPlahZnCyHKVTwFQPQ2N3/43reFEIPr4XQ8VkITA8dxyiWDGGZ5WnEOEPTrdamkSWmn07lz77Zh2UrT2SodDi5PX56Mr6+qaPnP/+Q/uXV0sJiMXzx5vLvZ73b78zjb3tq6nl3i0YRSulwu4zglhOR5fnVxsbW1ebC3e/fWTWrgq7PTsBZQqJ8//rpp397e3HBdt1kPv/+73709PppOpxCpLI2LPMVIAVm3KAFSZHGkbGbXmr4fdrv1JO2torlfsxWQJ+cngEABZFbkuRBxWRqWTQyKMUZYt1otoCCEEGjIqwpCyBjLkkTIMolXZZlhoqGWlKJaDWcpW8tiCEWYUoiA1hpAqRQoSl7kXCkNMUSQQoUxhKHjrBd1pZRiWgj5zQIv0RpLCgmCEgEAKTSQgZdZth4k/KMebF2hXDvGTNPknK+3DpZlOY7z1dePer1GlaZZtAg812mGihUsy6QoCSEEYaWYUkhr+A84H8iFqpjQWmuAsFAACiE1uXd0N0mSy5QJXn3rrfdePH0yHUzUQ8l0ZVEjS2PHNqfja9uhCCuE0PnVE9937tzf5LwIwp3d3d35LHJ8aRDnxfOx5WipCoR1lmWfffb5xUUDmGBnZ08rdHx8vLUNu919J/Bv3H4wT9Wtuw/3D960rAartMbAsgxMcbwoCCEUQ4ShklIprjFFBqaUAKCAVAbBlZarRQR0hrAklVpMhxJoACqpZVXmGCLPdnYPb2ADZlU5Gk4Hw/lstoDgoiglsZ0oimq1BsIIIWSYtudDYpmVqJqdJqDw8ZNHaZrubm8zUJ1cvTA8GCczoSrLqXmeAyFmgmdZ3mjUPRFmWRYnKy2FVFCzAmkQNj0iJQTEsjwCK8e0clqYmAosBGQYkyLLKSF37ty6d+d+kiRKw8FwnJVZ0Kit4jjnlW1bFWdJrLotmq4yIjFQMI5K10affvzpwVan0esDLnhZXV5eJkl688btIKgNrq6qqmCSGQZ1TJMYJiBQIWU5SimlgVrzwThnUgtEoGf5WiqllGUhziXGGEFUFIWGVbfd2d/fb9aay+WyyPIiyaRgzXpoQFRlWbpaFUkEBFtXLcKwdmNv6+Bwbzi8FlUpoTKpgRHo9tqua2shlRKmZQEK0yLXCCIs42SugTkcXTgu3r/xrSjPqKGEzFarVVEtb9x8Y2e3+/LYWkaXUncEd/b26rPZ699+9JFB8l5/68ZezzGkg1QrsPYPb+1vbw0uLl8fDzAB9RDEcYShtG2jXnN29zsHB3uGbT1/dnx5diG5UJy1e9379+4cv/r6Zz/72e5OH0HU6W9eTketfn80HysEavX6fDU/OTuzHNt2KKUQAMSYCEO7061H0ewnv/8Hlxfj169fn56UCALPel3koBb6eV5JAZeLaGgPO50OhHo2m+Vp/OrFs42NjR/+4Afj8bDT6967d9dxLMH52etj2zJCz0+jyLSsMAgc33Es8+Doxs7u3ni+4hWzbM8gZRSnQMEkSgUXNc+sB6FnO7hR93Y2N7cPh8PR8fFxUZavXr26vL5qtVp3bt96++23LZOuZmPbtvM8X8ySNZmjSAvf8dMo9Tyv222fn5+PRsPbt28WRQahphRzXk0Xy9FovD5PiBK2Wg3P85rNZlmWg8HAcax1wJ5Q3Gq1tra2EELT6TRJEsMwWo02ULAqRtFyVRWllJIS5FhmGkeWQU1KyjwTrLIM6tqWbRrtdltrjRHJiiKKIoTQRpwJIYDWm72NSok8TufTaatW39ndlVpPp1OlgEmN0A9cx4UAaKFVyVTJijiFWtXDsN5sz2az16cns9ms1a3Xut1ut9tq1EajURKvyiLNsqXvmIHj3NjbC2y3SsvJ1WR6NdVah17rzs0HySofXs1qNmKMpUncbbcEI4yVacqyLGNCpkkZxblpWqXgTFSIYSYqYuAw9G3HKwtxcLAnFXh5cn5+fZ2nCTX5aDAUSpqtBmeyqFhZ5koKixLfcwgwCRCuZWIgVvNZmWeu4/ieRwiBcWpiXIiqzDjUJqYUaJnGCTUNg1rEMSFEgquw0SSGdXU1ME0TAPDq5DXCOE0z1wsur69mizlCqKhKCbRnO7VayMtqOLiaTqfIysNae3f3Vlnypy9fPX3yajZbJWlWlqXneRIITKAf2F13K6wHN2/eYBLt7B5hbJ+dXQ0GAy0kpdQL/P7Wxmq1itM8LwsMETVprVZ7+OABgtK2COfg+vz1f/z3/+HJ14OdnvX+wweA56Prs6uz89PXL3cPbzhhSwiRF+X3vvf9quJVVQEFHcejlE6GI8YYr9g7774FgJqNR3fv3KQGTlbR0d52v7+xs7PTaTctyzQo+uzT35Z5JoSwLAsBRbEWknm+EwaOVmy1TF2Cd/udZujOAsu2CONFWaVpHk0mo0oqw7IsxzUtG0JUFUxKCRT3LW9Nx6KYrkWdRVEgBClBSgIpAWNSSuk5FAJnPFkUJRMCWBZwXWKaBjEoRoQJhgEmmACMCKEYUQCAlNqxnDVDsyzLNVnfMAwAQJZlEOL1t5Raa0UIsSwTFcV6ErA+664rxAAAz/PW4tD1sIFSuqaAOxalhKyWyyDw7t27Z9n0/Px0fWdHKUUQV1XFhIQAK7WOWJL1Vd0/RDLlekpBtpq9BTRUo0AAvnH73vj0MlosVtOIYlhkZZ6nSZJdXV1RSrnUgeuWPJtdDsOmU1W6128aDozz+TwaUZJejeYIgrDe1JAMRouLS3BxuYDWi+3th51u6+z8cpnGXj01HKu71b2Z3NrdO2jU2wQaVVUoxJVUmACDWNTAFBOoNGdFyRkhBlAKQaIkZ0VSsSJLkjQdY1z5gVUlMaUytL1ep+mFnuOipIi7/bpXtxVQ51eXg+EEQmzbdlGyFy9eaELXwlZCjOVqiRBqddq9Xi9s1BfL2fnzs6vBhec7y3xWljlCKIBm2LDDum9Sk5qIYrpKVp998dnRwSFEOsnissxtxzIpElJCCOJk5Tq+7ZgIQlaUeRqXaVZiu9NoGe1+UZSWYduG/cYbb0gu/vqvP3h9dsqVxNTISyYVsi0fEyILZhrAdWrxYpaCvFuvFasSSPV3f/vT7e3mD3/4Y1Hx4XD46vmLi7MLIMGd2/cE41oqrTUTXOUCC4gIQgbN+ZJSSiiSTKR5UpSZaZqdWq0oitUqLvNKK2gYlu+FVcmHg4XlhoeHh995XxFCyrLMZpPZZGRapmlSKXNerkwimjUrCHyMMaWk297Y2tpqNGrnr5/NZ5Mg8ELPUIpblg+gVEhCpAwbQwyibGmaZlZGAIugXhOcxNlC6tINiICo1nSm88lHn/y9ZTvb29u7B712iTFlo+GyYOPDm22uNq6un1HKdrd7Qdishc3rq8t66N+5c//ly5PnL/+mSsHBfu1qxkPXcx1UssjhgBqqFthbmw0tq+H1pARKSTmbzV48f1WV2b07d28chAgZrtsImuEyy9Iq82u1QjChVBiGpmkmSUoIMk23VgsOj3bPz8sw8J6nr1bLsipAIwDLWdGsOQSR0WBCKbGowYqc4kY99JWo8rR49eJ4e2fnxs3Ddru71d8MgnC1WtZrwfe//33PcZfz6enrE8O2Gs1mb2Nzb2fLMmi0XKVxYlBqGTZWEVYoSTLXsjzX2Oi0dra2TYqJ52CgF4tZELg3bhxdXl/VGzVPeKvV8quvvrQs4+BgZ+FZhID5fEqQJhS5ruNY3ka3/4tf/IKx8nu/8x3XcTb63XanORqNbt+7bTr2+cuXZ2dngitqisUy7jZa7Xaz02m7rj0cXp+eHe/t7XU6HYSA1poQFEXzx48vP/300+vra4zxRrfnmtbe5vZaXchF5XneZm8jy7I0jZGSjcBHio+vL7Josbe1cfvOHcF5HKVJkliGsaa+nl6ce57Hyipo1BAAeZq5lr27vcM5X1UrqFHoB712J3BcwTgvmJRyMZlezc5uP7i30d14/PxFlqRvv/nWZDY9PT1tt9udVqvf729tbuRpenF2cn52XCRVze32ul3HMjc7fQMYrbCllLIdz3fCfCVEKbOsgAIgANvtNoK82+0uokUleJKlcZLPV6llOmlWpEUpNaq4JMSwHBsAkKRRvdm9d/9OUZUnZ6ec5QpIrirDsFanyyDwPMeyTAggtk1KDQVFSqEAEqZZPhuPgNQ1z23WQtt2pWFxUUURjpNkPQ3m3FIgGgzHhmF1N/oAkdPLs+z5a8/1Lc/r9tuWZS1X8eZW/zCoNdud05PzLMuazSa1zDJLDYpdx2ZF6aS+mWdX16sXL69qzeM0yT/57LdnZxcaQQCQ7docFkIIIIFYMS7FYLQ4P58c9Tdct9ne2P7DP/5njVrgWNbZ2dnp69eNRqPikgkllOJcYo1tx1CSYMnLOCpKTgTb2WgFJr5349b33nm7Ww+Pnz/b2uq12j8ZzFYJ46bvvjw7aec1xlhZMkppVbDFYmEaxt7OLsLg/PQkT2OEtWeZjmsd7Gzu7u50WhZjTAiGkGVScnbyyrIsx7KKrArD0KTEpGR7u18Wb8zm0+vra1UkiOXRZAB5ceNgm5jO9tYGVxJAhRECUAOlkQYIEZtiCTWE2LXsq/OL1WplWZYQwvM8zipCCCUWpbZS63F9hYlDqK8BAUAgpCA0tTaEIFojiUBVaSkBUFApxSUTkK8X+ETJIAhCL/SVv16VlVKMMY00V1xJpZFGAAEFhBYUUMdx1kCF9UpvGAYhBEJoGMZ8Ps+yzDRNx3HWUA0hxOHh0Ww2i6Nsd3e339+6Hl5dXY8d1zJsy0BUQ1hwlZclxgQAUJUcaiWE4FIppZDSXOn1ZJF0wxZf5REygRSPP/9qfDHkFbs8u6CY2LbdaW+OxsNme9M0TUAdAQ2KrKxYKED9WitKitFkcT2arOISI+x4BtDWzt69vDA/+vhls1lvNBpffHEdhJ+8/913avV6Jfir85emGVh2c+/mbi0IKKW26UCks7zkjEMDIaCUgpwzxmVeZpxJy3IoIn7oqFIyABzTcjY3IQyVSiHgqSx3tjYarXa726OGgbGOs5Xp0Vevno7mo+PTk9F4QUzXMGGWZZPJ/M7DB0oC3/fX6hTLdQBGeVVOF/PZbDpfzTv9FkLg6cuvPc+5/+CuHxgUUQAQ0JgiC0KSxWWRZhdX54HvZmmUZAk1gGXbGEFq4MlkoQEQQgJNijLDEGGoRVmY1GjUastFfPvmTdOwhWA//8UvP/7ktycnS9M2EcZVXgKIKTUBgpTalgGKooKQVHnlb4eRs/AsM4mixWKxWCygAhcXF8vFYjwe/+ynfzefLvb294lJEIEFY3mcQaK80PcC16AIIY0poNQCGJCCEISoYc2mK1YpralWCGjTtVuOBVezAlK71epgTBkr4zgusnQ+n+4f7CKkTazbrbDV8qQUlmUIISilodsiFPEykSwlSFKiCFYKyfH4Yk2WZZWAEDNZZVXaaDT2b+4JjfIUGtT/+vEXX794tH9UX6az3aNtSI1FMh0vh07NgpgRB2AKNg9qk9F4u9/u9N65OLvUStgOunvncDqLj4+fK43+7ODWP/uzfx5n4qd/94uLwcrynf5Ws9H04nRxdvFitriu1esYG/3uTryKNjptXlYnL8/SuIBQf/zhp2W+TSk2LLNismRKA4IA9oI6MXCr1ZJSPn/+3LE9Smme56ys7t4+EmXergd3bmzsbuiqQE/mgzzOmw3HswzHcQAABkaK8zyJMJBIIyDBdDxrNFo3bhyGYX00GH/51Rc3Dg+HrrucTwnCO1v9/uYOIahg7M7tm3GSLVZpnqSKC14xXnKKjc1eH2qgZbU+a15dnIe+rZVUReF5gVJqMhkwlrc67SyP5vNBu928cXS4tdFazMZFmrg2/frRmW1T33EpwrysEAKEkHo93N/fdhxLCHbr9g3OpOXY3Y0eJSZjvCgKAHWn29zZ2azValyUZZXt7m5TSiGEUnHboZhAxzVu3Nzf3tlACFVFEXie5ftrOXJVAdswTYIXeXZ1cVZV1dHBXhKtPv3tx5PJpNNq3r37cDabCX4Zx7GQ0jAMz/Ns215EqyRJ/DBoN1tJkjClPMvONajZNaiRazuUEME4L0qgoGfaVZoPrq5t2764uPjzv/jLebQ6vHGUFXkl8jzPF7NJLQg3t3rdXts2sW2h6XDIqmI1neNG7dbhURAEUIPRaPDq9PyLzx7Z1KsF9TTOklVUrwWraKG13tnZcpbOKo4mkwkXmDFWMVWvt1xvnGfly5fHi3l84+DG4eFRvV7nvLIsuru3eWu6hw3IpcKEAADqtn10Y7ff70klqqqgFGsgsyzzXa8oitl0oXlDKWAQWmQ5K3k2nWJKyooLITD1682W6wdMqukyzhkj1A6bIb2eZIvYDYx2u1tvB17gb+0fbO/t7u3tFyWrpJrP5xAhrxZSk2RJPF3MJRfUsfq7264ZxLH48qvnabo6vz5Nq5XrO0oppgqtECWWlHAV5xpSBGkUJy238fXT1xRDjOC9uzf39w77/c2Dg8OPP/54NpvnRYUxBQBLCVfz9PHXz94ztm7evN086jW8GmB8Mhj2O00DSVYleRaHtX6735vleRIvljl78uvTe3eOWq1OFEXz+bzISpPQ3d3djV6HlcUnH//G89xa6MbRUktnb2dzfH11fRktZnPf93/wgx+0Wq2dnR3HMhBC19fXlOCyKmbz6f7u1sHuzsXBPityimAr9Mt4ocp8d3MDm07gWb7r+K6TZlWc5llSlnZlWy7UiHPe7NRsw6zyIo0SpIHWGmkApCp48Y2oS2uMDUgJBJQz1Gi1OJMQAEopQugbA4/UUgIIEaWGlFJKoZRCawsN1pZn1Wo1IURRFIwxVrKc5QijqqqggsQilmutyUtCCdO01wd9jPF65rdubyZJwjlHCK1DHmtTued55+fzyXTuur7t+C9PzmfzkeW6putorZBhYkQUKQVAWmOlVCkkVkBKKdYFTq0ppaaJMMGESF33g/Dm7dAPfvXLX5rUyqPs+dNX/X5ve9u7e/8Bpkar00mylDFWcgYgwSSASLQ73ePXz2ez2DBrWztNy6hxdvnVo/Pvfrfm+5tJAnu9/SRJi9L6D3/x9xqRf/lv/pTJ9MXxC9vyej1je3MTSMEZqwV1g2LFSg1Q4DvTaYIE4BhyUeVl9g+bLA8AwDmPomVVVf1+s15vz2YX11ennXZ9a2c7DOpFJUbD69cXp4PRdaWK8ezqejIomKrVa47fYBUwTXJ4eFiWZVmW5tIuS1Zy5pM6BDiKIt93IYZREvs1q7fZLVhUlPnL4+d37+6N41RzEIZN2wx4pSTXju+YJjVNmqSqKLMk0wByAIWljSAItIJRtIIKYWA2aoEoRFXKyXjIczaZzN5+802CjQ8++ODf/bv/kXNATeq6rgYIMKEJkgoApX0vXC2XUKr97b3FZLRuNPjtVqfVOjo6sm1bMpElKaXUNIxff/DReDh55713G51mvVlTGGQsRSa0PMdybIyzPM8rphzHsT1bSjmdztPoGiFiECsMgirnVSWBpqEbdFoMOb7gMooijPHm5mZZpc+ePZnPxt2Nju2Q7a1OvR4qJSpWzudTrbVpoMHwmhCy2e8axmYUL4tyfQQnrmu5rl8UJedcSS0lpxRryOrNepLMWp0mE+xqcPm9H9wVcMl5de/B7eF12t1oUxMzIbIiZklEDeDXaVktB+Ox49mS67PzV0FQ29w8nM1mp2d/1+ruvPHWt/+TP/mnQpNPPv1cI3jv/o1bt46W8fTrx1+8fP1yOh02G72a34Ra37t7N0vyk1cvm40OhurLLx5TKyOEvPXu21UphFSW7RSi9NxgOp/4Xmi7jpLA8zzDsKLlajab1bzm61fPNvv7333/fdMIz1+Pq1TOJolFje3NvlJgcHlhU6y4z6vMNIzjVycAgLxcXZ5f7OzsVCV//uzlZ598fnVxWavV5tNJo1bnZYUhuXl0+P63vgOW0SKKjo8vs/wlr1jF0jRNITYAgGVZ+K55sH90/87d18fPyhxooGzbStMVxhRAtb2z+e3vfKfRaNRCfzC4Nihs12ueQ22D1kP30ZefAahZyU3T3Nvbb7ZqrmWPpqNerwOAdhz76OiIVeLhW2+naZ4X7OrqilViu9d46623kiSJosgwyPbOxuHRfpZlX3zxmVLKcRzHsSml9+/f831fKeXSOiZwNpuNRqMkSbSWRVEgBAAArVZrLSQcDAbD4fDy8vyDD/5+Oy4dx+l2u91u9+LsbDwe72zvvfPOO69evfrwo4+zJF2D86Ik1VorKYlNBJNZllVZzrOC52Xohe1ma393jzF+eX6R88q27QZGa6KiF7q8Kq6vr09Pjhfz7TffuN9u1QLn7olhvHzx7PmzZ5u97tHRUbvRpgRfnl/EcTq4HL37zvtv3Hvn5Pj0Sulms4kQev78+cGNvaLIXr16xQVynXpZqari9ZYLNPG8QAp4cnKWJ4XWoNvdaLQ6mNCDg32ptdRqsphrrVdxdHd/7+bedr0ejifDkuWEWLZtOsTLijyJllWRhr5LTVsrVJZMyoJVlYMxwEhBxIWqqipOsvFs7rjeeDafRVGt1X345jt370mAyGKxbHYbzWazu9FHCGGDnjx/MVnMy6p8/Oirer3u2GaaRMvZTHDuWqbnuotlMRwvhpOx51Pf91pd37JJnCyE1Aa1fa+xiqvJdICR06g3EFDPX5x4Xm13a3MyHf3VX/7t1189ef+9d27eOKwqvlxGAOJWq05NWwO4WsXXV+Omm+5ubvk7tmeZBGjFqvHgOl/ODne3/MDOsiStuO05nb7JZ0sdRcvlcn/v8Ozs7LPPPgu88I179xECH3/8sZaiqqp2q04gOjo6KIt8eH11eXm5XF5altXpdBhjk+lIS75cZsvlAiNUFEWSRPFy0e926vW6aVFMYLWKiRJFVsaLpWFbxOZbO/v37tz+6c9+jrFJiImR6ToBxjRN8zzJecW01LxinIP1NJ5zXhRFu92BGCsFCCGu62sFIYSe53HFgQvWSzgAiJVVWZZS8bIsCSEIAa2kEExKiTHEGCPLcQNPQR2lcZIkhBDbtd3AW61WmlcAAtOx6q0GIWTddECKMsaEEFVVrZ0M64lCHMeMMd/3wzAsiiJN03XU7OXxSaPVu3f/jmGQDz78tVRi92A3TvNao247PibEKnnFlAJICcH1WrHwza+5Hl2sdzyEJznM2e0bt1zbbfwk+CUJTk5OVqu4SuRynBQxO9y7OZmNWVlt724NBgNMVrhY/fD9bwVhM8urR1+esArcvfPQNj0hTvd26v0NH8O4GcLL00dhGFq+TlP5xZfP7t1/5+HDt3aaDaUAZm4yE/2NIHCsMouARnW3XVV8crXUqIIYKw7KsuICGoYDFMqSBGvuuRaBrOYbIs+fnFydnry6e/vIqWfTaJ5w3tnYMyE9/uiLX/3mC00gB6zW7PgNKyvLeJE3G90bN290uxsXr86fP3+uXJnNI6jUzq0er6os5zjTb+690TFaT58/zwH81o0/GE3GL168+PLXjwAAYehn81WtHhgGTZLE9/1GYwuiAuOo1/cn49lgeHn79l2EbRfZlFJOq2gZS8FaoUuUGl1PDSzSdLG3t/fF51+/Phk8+urpfAkwwUFzS0CRZpFpQYpEVRUGMcskNgH0rBoC9vbencVyioI6ada337gX1HYhDhQsDu/cMayT33768cZmezAY2I+fvfvOe6391vXgzLMVRcrgk7blM01M23QcaxXNF4t4Plu5dvDli5c3jx74ftMwLKQrw2RczX/24V97nhMYNzwTp6s5IlgBYDjurQcPjo+PWxubJ+cjoGWyylzbmk3H8f+fp//qkWxL0zPBJbeWps1ch4d7qBNxtEhRlVVJVlHNNLs5GNFEY4AB5mLmpw1A9rA5LFazyGKlqmRmnjwyTujwcG1uemu19hJz4STt3gAzwAxr7e973+eJk343rO2NZYrF+ro7MncOJsuVNp3Nwu7Q1AMhYBj0XMstigwoLmSzWs6Xl/pimR0eP5jNLzoj54uffoZpaJg7EFW6Th99uM1JPN3M0zQti1ophY3V9tYuwKC/NS7ydjPPDXf87iLzAufDJ/9ktUy++/1b3xj/7E8+l+nKFvEfX73Bsh6E3s//9E8++eDzZ8+elVXz5s1bApBnG53QZmVi6NDUQtu0ju8eL8vrP/nZj5wwHI6HWSsvrs4NR3d1r+Oj5TzGIMGcesT74PH7b9+ctHGDsKvpVEK5c6dnmo5m8LdnJM7KRkqEOo7THe/sE0Jmq/Tu3QdZniTLXNM0wJssywa9/v72zndffR06XjxbZ4u15IJHeYD1sds9Z7AqMp20umnvHIypbSldX6flNFnPl2m341a8rDbFncPdX/3674hkwd2DIkv/5E9+IpSkVP/ZT35kGCZAECgEIewFnYuz8zZn/e4AAp7ElUb8PG1LHlua1R16CCHNNCzLuZmuA3/gmL0qEb4fzC/mvJWu6xqKrpeLzLV/89s/UErrstxsNppGVstYI3R3++CX//nvPM/78Y9/vFzOG1wDpgaDAYKQM9FU9eXlOee8P+pH6Top4ztHd4f7O0rCmrXXUWL0RkPNeX6xuAan/W7v7l231w2x2cN6QwzHsFzDsAbdXlnmiDNV54GBCSsNwDDveYE3m15BCF89fZUl8fHxseu6putCSi5ns7ppkyiL0kw0iBBtBqadThD2QiVsLsrnL77ZGQ/uHd0ZdHS+FVy+/U5r9+/tdE1gzc6nzeZ6FWXD4cjuhdLE3f0xtyjnIpI4J/5NhotMF6rLebOaR6xubNsUjYYhCvygqhoAwNXN9Pzy+u6dOz/70z/v94e2bXcsZ38wDDWrrqplC7JGSWoYQaiXeRsv4iJigioggBIIFJTUCArU8qYWLWshxFRvN9EUY2JZdlPXb16/Y61qGwSR+fD4CcDo/PzcD4Pt7W0h2qaN87YUCbS7ge+Hf/ubX331zbd3j+7N4ihumyJa6zmhlGrdDm6bOE2vpldA06GSF1f1sON8+PDu3qRHVKO4BTj3Xc+wzKpky206Xayub37Iovzw0SfL9HT97HSxWHAmNsWqZHktudEJw8n26fmZTQBxjbKpu4cTBQDpmQumwqyMsjTN4qvrMyDVJx99Cqhd1sCyXCHh1nYvqJp+2NEFL6r2YGd3enV1eHhwfHzsOFaWpZez89B3hWoZqz96772u7z395tsfvvlGSlnzxurY+4ODq9fXdc0GwW6SRM6wU9cVUJC3MJXlm3dvgo5fizoc+G7XPz15vX/3vqmb3/7x+fuf/DiOeFZVnrt7c/NGIQNrlFoGpWQZz72eEYvi9c2pt9WDjgYAwhgLhPpbE8MwDMMwdQtCeHumUkwwgQaGSinJ6rwqEEKapoWeibFzu/W/jRfcbv1vM4lW4FRVJZjs+IHrulVZY0wtx55s7adpWjNu247juoQQ01ZCyaZaFQWApeIct3Vb5hUCSNd1JDEBtKlaxvjVzbRt2wdPHjaS6Ujv9XoWcV69ellEjW4ZVyeLrd0JFiZFNkEEyUQJSDACAEEhm7a6dVARCnVDp5QCKKo6J+cn7wzDaBtWSmUb5nvvvTfsj1ar1W9+85uiKF6+fB10/KzINslGNw3LciBGRXl9PZ15fv/Jkw8wMhbzuBv2MdKTOM3iDEOwXi9N2/B8J042wXjC6vzNq7N//+/+DQLy8PCoZfLV8+9Zww8Pj+7du9/rDgAmeRYXRVGWFRMrQ7e4FEGnZ5laURQU6whwXcNZvk6L5PTi3cmbZ5v1oq6yrNxgPBcc3nv0GBL3ZrFq23Zvb69RDaZAEQGgNE3ftl3X6QjJLi7fxVm+3Kw20VrX9XtHx/1B7+r84vT0nWNZZRAMej3tvfc0Sn3HcXS97/k/vKuvr69WdWI7pmnatmErDubThUFNz/PCoL9crvO8bpmc3cyPj+9PJmPO2ngdazoxXNe3g9BvTM3TNWd355AS59/+2//wi1/8Jo6ylgHBRc2Svb2dba1r2XSzmp2fpxAShKHluBRqm3jD5g0AvD8Ih6OJaVpRslFQ+J7T63U6oZskyX/467+RoG3bZmd3IiWXkmFMXc+2Te3i4pwCOhj0ZqczACRVpEnb6elJzxtcnU4NFECbNg0vynw5K149e2ea2ifv7/O6CWx3vppDik1KbNMrB/2qLHSMZ7Op4MzQSJkXhq7d8LWAbVXlRZNZ7o7nhrbj7u0f3j1+WOTs4vymKBpN04JgR4omzSIl5PW7M9s2snx9fX2V5+nbt283m4VhEgCVpgVAkapshYCBPxiPTIIp1Ba2bS8X67KqhJCu69pmB3JLKTEY95SCL168ePbsu8fv3/V8w7S0yXZnNj397X9pbccYjibvv/9oud5E0XqziU3TfPvqdZ7njx49QgB4jvvkyePzzdOH7z1wHCcrEt0EZxev+qPBaBwqQINwjCH0PavbDU1Tv3O4Zxo6pKoos7aWGgRciTKrWc2ABAY1AAdVXkAFep2uY2nbW+OrK74x9aZplFLdMDQtPcuyqio0TWsNKnlrWkYvDIJuQDRcNflsNX/36sWnn33OJNwk2YMHj1qBXr85S5Oc1Y1lGHcOdg1DW60WWbSajAd37x72BkOMsa4ZCsFNlLx9++7V2zeLxUInNE1jjIBrmvu7O+Nh33bcNImn0+nOzl5dsyxbB0HQ7w0ppU3T1nV9cvIWIZznOQSYEHJzc5Nl2fXiGmN8//79O/v7dV2/fv0yz/MP3/9genPFOdd1HSHkOE6WZS9fvkySZNDdtm1LSllkpW2boec33KjrGgOoEXp1OR2OJz/98Z9QYv7www/T5tpxnDjZfPft1x0/8D1nMBjYtj2fz5ngvV6nYjbGOC+Ktm0xJYZhaJRADHTLFKzJyizJs6IoqqrKFgvPcX/8+RdNK757+gO6vpkMhphSkNTvP3pycLBn6ASoNt0sWV0IqQbDLSGE4/jBYKQ7gSJGC0gjERNQIRoEw95oax2/fvn6pK7ZoD+yHBcTTbPN4WQMJC+ytKlr13W9jlucnEwXsyTOCCGu7QrJVnEU5WnQ7SBKdNMMOh3H86qqERBcL+fr+cyksC5zxQVvm5zVUvEsiZVSGGDetusoSuMMI83zPKGEruum47RMTW8uV6sIEw0RbXf/oNfrUUOP4riqqun0CmMMhEyW68n9UWA5m8Xq+vwi3kQYom4YLH2fEEQIIRhKyaVqEcFEw1mZ6BQSoCDiEHNCpU4IkeZiNlWg0WpDAeIExvuThx9/ZiJInr6czW9mSqmOb/FWiqYSvBkOOu8/eY8inBdpNwjvPXzUMBanyWq1yqJ8NVvb2Lg4uy6y0jFdBCEQMt5ESZZHUVKU1aAsCNXjNLk4f7d354Gu6w/u3UcICCGm02lRFAihMAyP79wd93uq5RdXl1yIyd4OQZj6CALkdoLZerlYLG6FI4ah7+5tAyiDwBGSQQibuvIc27XvLM4uFSZMCtv3hlswq/Lf/va3JxdTywu7g55hWVXTFHUpCoE1OpyMc94YhiGlHPSGmqbVdb1ebVjTDIdD3srbv7YQQnAFdaTrUCjQthwhZDmupmlSSiGlksrx/P/ujL5NJ2CqUaXStLjtEntBICWI4zgvC865aZqYUgihYRiEaK3gEHMCEFQGQsjUTM5llVdJm5Z5mWWZbdtFUZi2eSv90TTCWJ0kUVHlWk6bi2oTrRHFECkuWBRFW1tj0zQxhrqua5p2i5e2LBNw9N802ei/lzARIsS1HaWUanmS5VmSvXz2Mk1yz/OePHliGEZTVs+ur5lkhm0amrl3sD9bnZcFf/v2rNsZbW/vD/9svFhsbN1J0zJwvbpsHMeFSD158qSqqqdPnwJTGz16cHNzE2/mr18+3Rr1PS+QvPjdb3/77OnXvV7P9wMpQNM0mmY4jqPRBmDUtmJnd1c3rShJgk6INdzyKkk3ZZU8/e7LFy+/x0hqOk6ajcyW/eHk4896VLOvps/jNLdtm1fMsrWKZQCBXs/f3t6hxL66vDk/O786XwSh1+l0DKppBl6ubkyL3n9wd7GcahTePz6+f7hfZnldVURKl+L3H35UpawoMqp0DRodf4iBMZ1eJZt8erk0DCNJUtfxvW5ntVj57goLTglBEGNCLi4u1vPvdWJ1wuHD47tVIb/74dtf/eK3q1l85+BIKBRF0dbdwYcfvUcp9Bzz3enrsoos00s2RZqkhg44l01Z2Y6p6WYU56uvv6mT7Pj46KMPH2tEaxvx6MmDL7/8fRRFeZkAJPIiYW2tC3V6ek00kWWxw/Wtncn05ioMAyklxgRXQKr26uTK1zuZlUkpJeAQcdewAt+bXZ1DwcZb45urc90wvDDwHG970JdA9budMk1urpOsbSGEhmanSTVbTS3LTMu0al4Fnc69B8et4G/evL1/70mn0wKV6rppmnYaMwTp7u6dfndX1/XFcoY0YVrvIQSuri640kfjQW8wwYheX183Tbu93ev1xxhT0/KklOtlzttaAWJZlka1KMu//uZLKenh8V6ULs8vX3/z7e9sR79ztN3Q5sWrl2cn8dndbU0HXECguGObQKnNOi6rQtf1xXKuYfLxhx+GYXidCcPEQWhukhvH1bN8U55nugHv3r07mUwoonwsFBdlWYdBz7X9aJOwUuRRXcTNsEeHndH+1kG+EnkqWlaXdSm40oDSBl0NgH7g571+msXL1SqK1rPrK6WEZRlB6I7GXYyxZWhQSWoRYqKa1W8v3v7yN787uZof339gWkG+SO4/ePzjL35UFMVyuW4EODzYGU9GP//5nzVN9tGTR3t7u3XV5nkUp3maZ1GUrDabLCsgoGlecg6qpi6zcjAYlDU7OnqQZYmU7a3CrqnblgnkoNtHIk3Tbs3Fum74vg8hoBrudAPDsZIk0TSt1+vVdX16enIbPnj48OH1xSVC6M2bN5wzKYSmaa7rxusNbxhCME8zoARUyCB6LerxcKJp2lfTb4q0OLpPNERGg5FlWNM6hwowVq9Wi7rKUH8Q+HbLGSFkMB4VRaEZuuv6jDe6rpuOzRWvWUU03LYqSZIoWm+STRStj4+P37w5qYpia2tn2PvzumZlw7799lvf9u7uHN47vKsb1LGNokjydOO5TpYljhfWZe77vu73Mg4uo+zdYoOoM53HL16fW8GgaGRe8aZpOQBI02reCqAM3zIINmxdsNZxrevVjGMlCGJItFyaWFmh5wRuyaqirvS6qnlDNGraloKpBMLWaVPmyWbd8hopCaQCUiCgkEKMsaqui6Jcr5I0zXXdVELMorVje8MhVIAw1nIhMEEY02i9MQ3LJxhBWNd1w6putzsZj9M0Pd7d14n58upFvFgZEHccz3Wc2WyGMaYaphRDCFresI7PWWOZimDYNqWOONFEWqxkW0LZAsDzplZ1hiD2/K7l0eFgYLuObvi/SucXF5cYEoqokhAD1vGcUa/z2ccflEVWN226Xp9fXjUt932/zMqbixkRJI+LpmCiBa5jDTrdtm3LNGGcl6yFCNS8BQgFrm5ZVhRFnU5nf3fv8vKyZQwotTPZeu/ho/FwpES7XG+qqsSWoUu7qepVvEYIDfnkfD6N4xgqcH98z/NcPwzSbGNZFiZWXeZ1mXm+47me9+gRtmxi2K7jucNJkrfvpm+ibGMGLiJQIWnapuHoSinOuRu6lDtVVaVpqoS0LKuumrquJedv37wTQji23esOLNO55Sdyzk3DZ01S1QwjRQmlhNymDqNNZBiG4/i3GQIAwO2A4V6/yzm/rTAUZVY1jMtbtAJwTMs0TUIpF0xVDECJEKLIpkRjqCnL+r8CRSC4LTgAoHRdZ6ymFA8GPYiAAvKLn36KEHr27FlepYjgmlUYwzTdlE3ZtrWm2YZlaMXtOoMJ0QohWy7alt8OP6jQCSEQSoKh6nb7R4d3ZrMFK2qlFGNM04wPjo79IHjz7uTNl3+EGLz34WNCDaFQFBdpyZLrBQTayZuLXtBvW7G3sx/6nqHptu0CAFomvvjJZ6ZpjbaGTuA9ePCgLMuLi0sAgGmAwNXuHowM+gVruG2a3U4PIRTHMWPMMHQp29VmXZXN1384r2pWsaZuGsPSu4OuBE3NiqvZOTWR69oNKxtZjfs7H3/82eHR/SQvzs8uV6uVE5hKCcZKqVpDp46r6QZhVZEky9XyptPpdjodKaXt2ft39kPfZ3Ujbtqzs3dJvMFK7ownTVWbVOv4AdCNnJgdp2cRi1DUFpKX0jb8js+CIDgvzq+vZrbt7u0dKqWSOG9qdnH5TikYeCGF2nKxfvn81dZo/8HRB4ub9ZvXF2/fnEMJXcOMNpuWSdOwLRMS1FZlrusu1YBl64ZOlqLOSqZASamp27Zp21yBxWqdZolNdcOxhpN+6NvRajUZjz794tPNZlNk5fdPvzk+Pm6aamQHX339qmhSxzX8Sq6nZ5Rilq1Xq9X7H3743tHOL371Xz58eNzpmvP5vGIVwtKwSOCAjo+u3pxjWR/ujvLVTUGwDlulKwMIrFEDgb3xcDWfRZvMsb3FcsMYw9BijYyjch1Vr169dn0v6IQY4/V6fftTaxlvGS/LOopjJUDDC2IElqvtH+7qur5arQCkZdWORnvj8XZRFGV1maX1YICEoHUthFJSCi41olmKKwVQXmbnF5c311HgD/70J5PPv3j/+YtnN4uLPggG45CTyYvnX79+mwH4Vycnb4bj3cnk4PGjB0+fvSryKs9zhFBdVr0w6A97QraMSQQ1KZFh2Af7xz/9yZ9fTaeO1ZWcAmlirAWdYHEzf/t6enRkjwbjdFOOehOEwWazkRyGQfdo/262ar+dvQCCepa/t7PjeQ6AAvJWA+r+8d2mqV6+eZ2XxSZa9UZdz7eXmxvb8/r9vm2aV9cXm3SZN0Ml+SqZNwh88+KUOPbWBL58deJ47vHdAyB/9u7dOwj4P/0nf3nveP/O3mC+uN5k8fl/Oc8TJKUECGOMhYKE6LaDAABNbdV1xeoSKkmwfn09G42Gg8FIycoyHdfxeSvbtr28vDYMY29vTylVVVVRFJbFbdvSdZ3S/5qm7vV6t0KHwWDw3nvv3W4uT05OhBC33UgAZBxFUsqmabphT9MIxMg2bChBy5iCsiyKp99+NxiPdnd2GsZn17M0zVjdmLrVJEvfcW3bUUK2TRNF68B3et3OrXyorkuM8XA8AhgAAISSFSu5wFCBljdNU0CoMBS6hgRnWbopy1oJBjhQkoeudbC743acB4dHBtGj5RowC2KkFGatdNyAambDaoJpyVEcx++uFm8vFhz7SZwS/aUddoRQgBAMgICwZQ2CQPEWQYWQ0h0DAQ0hBDQy2t3GGFdFwVtpm45pmpZhcahm63mcpVVVcSU1rAEEFQQaVlkSNVUmBK+bsm0rjDElSCNGlhRlWeuavb/fbZo2z4qmaUzL41Ilaalpum5Yngersp3P54ZhVnXTiTpIw5xzyzJCP9jd3grM+1uTnavpTR3nfS/o+J1ht5OXReg6AiiEANUpoQhCAyOAMaY41Slu6kK2pWkhhaSEHBPFRXtbrAcA8VQ2olptlpTSrcH9O3sjW8dtw03T0rCmY/jDd18l69ViFS9vplUjHNevswIS4tvOPMnWq6Trd03dQgDXRUkCfzweG5peFJkACiKSFPn56cnW7s5nn31M7a0syzDGhmGYuu5atjKt4aCfJMlyvqib0rXswHerqgKM2FbAGimEII69ztPZcgWVuHN81CqRVsXNfOnaer/XzfM0TVIAAAKwt73jFkVeNJBqvuUl5QIi2e2GlqVzoBDRLMemula3rChLAQGllDGmJGgZL1XFGEOIOK4TxzFCxDTsbrdr225RFHVZEUK4AI7nSSk1TTNtG0KYZdlssej1ekEQDAYD3/chhEVRJElSlqWmmVLWVVPeykhbJjClt2FhhDHRMCFQAIgpVlBACJDSNKpzzZQyTlX634AKQAguFQeQR/GG6NS0tjAluu7t3tkFALy7euvWNsY4iiJISCtZmkV+4NiO6dhmXdtpKppGSinLsrwFLgmuEEKENBgTCCF5+vTp8fFxVjyM4xgSHHR6l9fzs8uL+++9F3S7xnwW9geabfbH20UrpvMFY2h7+07gZQjS7797ihSCAKjPhYY0JsTuzr5h2etNzARzdb83GvRH/V6/g3F/e2eS5zlnLUR8OOpMRt2bm5siKy0Ldjrh3k7/9lwJQuvmZm5Y5osXr+qmHY8n09nMCzzDNixXPzl9E6c3AugQySbKtnYmf/r4J4+evJ8X1a9+9ZuT07eAQqmoZesS1lTTLEvnbX19dZbHdbKJdUr6/T6ltK5r13V39nZd1704O5+tl5O9Hd9yiEavptfLm3kvCI27mmPZqIXb/R3Hc6Tkq/VMNtKw9UGnjzDe294TQvX7QwzRi1evbk3NvX4vXsdRtDaoOZlMht1JJxj0Or2z02kSxZ7j/uwnP2mYmE4X11c3juPNZlPXMzmvy8rNsgwACSFElHgBEhw3LSdEqzkvGtbpeqOdLUs33747z/P85z//iULIdOwvfvzFs2cv3r56+9133x0dHcVx+sX4k35/XF5kvAW+qykgBgM/KxON1HW+6BxOBiEedFFRXi5nJ5atEQsb1OyFjUZWvK55gX1D+SYsikSUlGUKYOTYvTJd9gcTx9DnvL2tztuW63j+ZrPYmmw//uDecLsTReu8zA4Oj4oykYK0vEEAaDr1PGe+uH7z5o2E5c7O3u7u7mAwuLqc6pr1+edfEKJJASDQlWhFi6SASpKmlnleJPlGKcFaqVGTgUYKKRUo68KwCUSCyWqyO6Ym4qyQirG2GvVCzzVtPa+y9OZ62jJQFtw0/YPdvfffe/+v//qvv//++8loqICbF/FoNDq++8R1+kVWO9ZQKvPBvU80/eTJkyfRJoHK5AxTzxVtNL2KPCcf9604i4MgeHDvqK7L68tptEnSNAVKdDthnQvHNo8O72o6jtcLILjnOKPhVl7ldVM2nHWCgDd101RJumGyUoh3uoFArIXNPJnplPgDr7c3EPPF5eIKUCRU8e13v7cM+/7xgwf3fm5o5MPH9//+t7/6+9/9OkmjnZ3tfr9r4T6mRNMMTCnjom7YbcqJc44g1DRNCQ4xYm07n8/zPN3dGmia0en0iqJar6PVatXtdsfjcb/f7/f7Uso0jaXkQRDUdQkAWMXRYDDQNE0IcZvKLooi3kS//s0v66IMw3A0GoWhDwG4vr6ez+e7Q5dXwvMdLwzrumoYJwQRqr96e1LUzc//wV8s19HTpz9ommbZLuf8/vFhVZQQQts1EYBStIzVcbzpdDoYQ6prpm1BSgCCZVnmeeY5Huect02ZpbxtKAYQKMe142i1XM6jKIEIZWUVR8l4a5tSemd3xzWsuqlYWUHH8DyfIiiB8H1fQcA5b4UAAEmg7e7frxj69ofXtmvbrl3XdVrkRV3wVi43Sw0TSjBBCirJJTQ1HUhRZEnQDynCQgg/DAxNR4gIJrIkdaE7n88ZY4ZmdoPQtm2M8WQyPnuTcM6VEgAAKYAURCkFAEqzoiyVYfh37hxOtnc55zc388VisUnSPC+AQgoQxwkcr9c0TFuvKaVCiDiObceybdO1bEvXKMK9oKMaUcSppel7WztcAccwkyi2da2oK1Y1StZAEEIQooQSBGWDoIaRkIC3rRJcCM40hErGMFAYEghBWVdpngt+AwAgwh2Ph6EfvHz2krNmPBlxLl8+f75erjAxoAKmRhFUgjMMAAZAQoAAQAQjBU3bGm1NRpMRImS8NdlkkaZpCpP5YrFKkp3d3YeP37Pc3Xdv3vKGSc6rqsrTzDRNTdNm0+WtrQYQvErj6XSqlNje3h4N94ssx7qV5vV0vnIsW2FNAHpydp1Ea31vR7dcGUeLTZLXDQcABaVmuhbUbMeBmArR+o7tev5gPOES1VxwJeMsi+NNKziCJI4K27Y7nQ6QSggVxzFjHEJ8//5DxphGdEr1W8R4UzWEEKkghLipmzTJgUIHBwf7e3eKoiiKwjAMJWGWFnVdR1G02WzyPH93eUUptWzDsixIMDV0CiQiWNN1QggXgksuhAAASAiE4Igpy7I0S6+q6lZfXpW1UooLlmWJUKysq+FkYDsmIhAAFaVz13W3dkbbu2MI4XQ6VUo1TYMpUJAryKmOHFtX0qAEOLa+IVrbtnVdM8ZuvbsAQikhGe9MXr87ofqvKdUn4y2kUw7U3sG+3+/XUlZSTvYPsEEU0aarte06WNHDo0cGwVABVrd5nFRpjoFaLmZN09iG4XbC9WaZZEXTMibY1fS6rCvXtX3Pm86n79689X1/OOgtFour84vL8wsp5fbWeGdn55b7VtZl0zSTyVYULS3L6fdCy9T8IBhPhsEwDHzr8vLNIprnVey57kcffHjvwUNMyffPvn319hXWsBc6CrKyqhxfIxoGUGZJkiZVXQnbCEZH24t5Fo7Cx4/f7w36puVwoUrOkW6MB8Ojw7uTwfD63fl8ub5aLFoFfMftdDqB7e/v7HLQ6gQz3qhW6LqeFqlt24HruZaZpvFquQiCoG6qquKdTqepWBbnFrX6YTdaJP/uy//fu7cXi+kSKAIh1aguhFqtl8sloGMnz2o/sIu8Xq02RV6XlUIQG4Yex03bck2BVrCiKbGOO/3ecpW8O33tOubh4WEYWt//8INlmHt7e8vZOk1ypeB8thQcvffo/aapnj//4fEn9y1bN0xSteXWziTJVlm6/uijh7/73R9uprMsLz797D3LRrbDuj6p67yM5wWtWbnc6hsLlWggJ1LXNUs0m/l8BYGgWGIM8yIty9J2vM06TtKMmr6u64NBzw306ez6q69/PxxsuU5HNyyTUs5rhEGnE2gEI91XEGR5Sakep6mUwPP7q+W6qhrTyqQEluNDTCBGNWuqpqa6LMuStZVl6Vy2GBEvdMY7Q1Gj7a07vUFXiNYwNOLqLa82G54nUT/o2U88oWhVqSwuWT3XjGrQ33Js9+ju8enpyenpCYAtodB2NGzvJnGVJIkfeqtlsl7Fm3VKsPHhh3ezLBOsdWzHsixd16NovVgs1vH84vot0fmD+/f3tW3GT6JseXl9JhTt9Ls744P9/d13b9+cnJyYBtnZ3eZhs5hO49VqtD3GSF5dn1V13h/1FeQKcYnE9u4EYVBVRc6y8f6IaXT5qwV15e7dAUDVZja/vsyyaPrzn/9D1+4lyfz5i+//8OXvqU6OH9x774MnPCNVVRV1U1ZFWdYVqxFBjulE8dq0bCVJmaWaSQ+HB8+e/vD3f//rzz784Pj4nuO4nIv1eh3Hsa7rcRw/fPiwKDIpeZrGcRxrOtF0YpqmC2kcxz/88EMax5zz9Xqd57nkglI6T5Kvvvpqd3f3wYN7YRhCCF3XZTVdr9dQIwDCtMiv57PBYNAdDpRGStYu402a51Xb7O0eHNwLqqqyev56uSyKgmLCGEvjREpe12VZapZj93q97d3dxWpZscZEsAWyY1kQqjRVN2Uu66Ys84uz0+O7h8fHx1Qj55dnNW/9sFPx5vTqTAgRLW9e/vA9woBzNt6e3Lt/FIahgki1nGgaxjoQnBASDsOO17+7f+T3OpvNhlKtrCIg5aAX3m6Uq6KsmtbUKdZoy+qqkAiALMsIlciwpZSEICllU2WGZlqmiTBseZOneUtr17QoQdjQLV3jrdQ107AtCCFuGljXTctqBpqWYo1otiuQUdQcKOSHA7cz0K+uGGMQYsFV2wrbdjzPE1zdEq7qpiQE27bp2g7BWHB+cXEFAIjjyLIsTEjeNFiCusxly5ssr5rcMnXDsSjSqFJUCUyQhrAAqG5lIYRsm5bVGAFNI1IBhTFQgLeMMQEAoERfLVPbCiFSq03CKtYJh7blQkjWmzjo9rr9LqZamhc1qyRrFuuFZmsUQaRj3rRBPzy+dxg4TtXUN8sFwtTyfIXwnhs4/cF4suX7fl0pCGEcx3VVbFbr66urXq8X+J5hGIZlcs6yIq/bWmDYSjVLNvV0CqTy3C4itqG7k63dsDPknH/3wytMgN/tZ41ISnY2WxIIJNGonwVBgIlOqd62wjGMh/fvmpaHdWO5il68eZvXTcnaMs8lBGVZFoWybVfXTc7atq0BQACg28ajbbue42qaXpYlQviWm4Q1HWEEMVIQSKCoroXdTtjtfPPNN3lZgM36vwKRNDocj4YA6L5JKb3FJAMguRS3lcs4jRhvRSPqlknJb/cabduSVtY146xdrTZxHEMI/cDVNK2qCl2nTVNblr6zOx6N+hKIoiiUDtMqsXyDEFKXpeMbGFEhBASgbVkcR0rKuq4BVI7jUEo7XfLfXRKMMd7KW701gRo5u7osq8YwLIAxV9Lthu998D7QaZkVRdsKDZd1g5u6rItScp0jqpmFFK5lWZZjU/2maXnb9DpempcIA4KQphHN0MumhBhBinXH0h2HCXl2efGHr7/qhP6dO3ccyxhvjztdv2mawPP7/S5rmtlsvkpj0zRfvXkluayq5tuvv+p0evEmKtJkUgw9y37/4XvnN06SRbpF7989Qgg+ffbdm3dvTFszsU402CjVlKWtsBJKAtwyIVpJkdHxu5PxrqjnSqB+ZxiGPc3QNcuU55cZ41WU7CNi+OHwAB8xcXV+UXFBJagvLhEClCBCIJQKKxmnCdWJblANo53tUdNyyMTBwQ4AqC6L3799df/+w0FnpGsma1gcx/P54vrqQrb1/QdHnuO/evn68nKh68CzgWbQROhxVOmaNZsvrqdXTQuqqjJ0SIjDWAsgxURTSqRFVp+WUbpuY7lZr10H/c1//sVnHz9JN+u2qmzDdv3QdQIhFaXmchENR1vbWwdff/U91MKkrJebhFDSCGHongIEE61lPI4K3QDbo0EcT6NF4ng0jVcE1VDqTbHY2wqbYtmKVDQIaWJ+HV9cTM/OT8P+NiHy5ZuXCulVy1gpEZZRNputTn+0+eAv/tGfB92jr7757mZ2npjJaLiDLbW5XnLWuq7bO9jpj/tJnEVRQggYj3Z4q9Kk+P3vv3JsT0nc6/V6vV7burdBG8sybB9lRVJUOcKirktdNx3P3toaRZvy4O4BgfTqaqqUcjQTI12j5iq5QUrTMF0s0zRrdg6GHX9oO/4v/vOvR+PxZGvw+PHjZz+I4ajbG3YA5Iv5cra4aXlzetEWdZGki7KKnj77w2jic5k4rgVh5fpweze4urr69ukmF7OLizNJagGrna3dO8d7j27uXV0uzt7cbG8djLfHo8noZjZFCM0W802yUULOFvM8TynZanmT55nrO8Odnh96fui2sqUUh51gvV6eX5xKKAa7Xm/b+ujJ43/0D//0+y+/3dxsphdXNxfTH777w9HR0d7O6IsvPg26fpylfiecLpaU6xBCw6CG5RmWHscwK4uat4Qg1pZCtC2vG1b1ertlleZF0jIhuNI10/fCLMvyvEBouVqt0jRt25YQApHK0xStgOd5vu86fu/y8vLi4iJar4fDoeM4nU4HKpAXaX07CbBtXde73e4tDi8r4CZNTNcxfXcRb67nC4mh3fFvFsuyLM9vbu4c3g16fWhoYb/H5nPXNm1zW3JRVVW02SjJkUKapiml6roOu50wDOfLRZZlNWtm83kuZjvbW55uBJY17HamTbma3eRpXFb59vbk/Poqb4o2UcsoVgCZpmkDjqAYjgaWa9V5kkdRL3CVAtdnZ54XEN1gDSeEIgfqGIem98Wn7z19/mw+XzAGHccbDoau61OqvXn1+ur8gjclcbyqqYqEu7bjma7QqanTBkhd03jDmqoOHK/j+kmUOroBTJ7GWbpZy9FESZlFcZwXWDeJAE1Tp1lRlnXZ1E3dep4HMaoYuphFp9crAEC32x0Mh3cOjzCmlNIsK9bLNcGa7/u3HXohBGvruq4Yq29rbVLym/mKc85aLiGAUlCKbccULQeci6aWNaM6tSk1CEJAEi7ivGxN3raN4Eg3iGEaQrcIIaJlEAAFAJRKAYSwcCzLc4Mkat+8u9YIHQx3DN0yraCoKsMgmNCr65s4Sydb234QHD84blpWVZVu0SSOkzLyLFt3dKRDjqVU4PnrV2XddMoaU+r6IdFsiegqKWcXF0mSXFxcmIamUw0DCKWK1xuuuFjJJIsBwXuHe1sHe2merKLN9GzuOA6v4bA7yaJyPNoVgs5my01SEoLOruem5zOoSWLGRbYpWu1m4ViuYRgE4bKpdI30+30uQNWwzWL26tkPVcttPwCEWqZVyWIwGARBIIRIy+xWwieEEEwkSeK6brfbu3Um8VYSRJumqdpSN+zdvS3LsqSUN7Orl6+eVVUVhuHtyNww7SDwbk9lpdTpzbtbwlJZV6z5r8kAiFEYdhFCjPO6rjmXAMFbgBJuaghLzlrGmO/79mhsWxbGeL1ebm9P0iL2And3d0c3qOMFPnNv0vnrk1cQIiHEarHEmGqaBqWyLKeuy02ElVJAKoSIbduEYtfzOOeGaTLGOJdt27ZtK4QiQRj+k3/2T3u9we/+yx8kgo8//MDrdJGm16wxXLs7HOA8TfN8tL1VVGWaZ0DCOE6X02nouXlW9gMXAlnlRUtIniZKqayokjwvGhbnhVKQU6IAqpuWEMQV8MMgCDtU13b3b/MB9W3TqdMNlFISiArKXth5+/pk0O0DCa+vr0f9EWPs26++ni+GH3/64eeffr51M96kSy5bnehJFn/33TfrOAk7nU2y4RXrDUPb7SEiIJIIIU3DtqUJToAirBGcccZaQzelVKtNZAtR1Y1CKOh2kaZlTQMQCoaDOM2S9QZoVKaiZNX1xYVp6b1hx7K9hpVYw3Vd6gbd3t5+/vLFfH7jhcFmHed5fnm5AAC1e2LcGwfdjq17h7t3f/Tpj/Kk9F3fsb3ZbCaE8Hzn4uLi/Pz83//9eZ6UhmHcTBdpAlyflAWnmik4wERDiBBdwxhKJMo6mS2WJncxIWnO/9N//MO9wzuYaC9ePd0ajAzD7AZdBLX9vUNWC0O39/fuHhzc9YOdZ8+/T7N0MulcXlz87E9+FHa2v/z9f0FIa2pgG8jUrcs4i+OZpY8IADtbA8c2LR31O92rc7BcpZlkSjSKcyCbm9n86P4jAfFX370IOnYcR00h9/bHvfEIUVbX5c3s2nJ0qZjjWvPZTVGU/c6wLGophFRMSdYooetm03Kqk6ATRFE6Pbt6c3Jq2w6ixHIdz/chUpRiw9AJIYTG19egaWpNh01TQQghBLqpmaYSsp0tlnGUbm2PLctYrZZZUWrU0rCBIPZs5PnmsLv15t358xdvhuNxGIZlWff7/X/5L/9nqqmz8xMg+XS9vJpetm3z9NnT8c6wN+iaNnj6wx9sFwAgjw/vapRiTQzG5uuT+fnFwt923MCkhnp7+qos05/86M9++rOfsBr+0XleZ+o3v/376XRWZrkXBoCAaL2YT29M29jf3dvZ2TE9S0Bu+baEfGdvZ/dg+/r68urmqkc7o8lwvppeX18vy/Xhg73t/aHj0s9/9MHyavm7Ku84dlU0ZZlOby6G46179+5tkhgbGiLUJw6EEBNNSimUBJC3bcMYcyxjvV4DKTUNS9ASA2uG9uT99yaTyS0cfjwes7Z++vRpnuc7OztVVXDODVPzfT/P8yxLlBK9XgdCeLt6kFKu1+tOJ9A0DUI4Ho8xgACAvb09TdNuVXWEEC5sQPBoe2c46le8fvr0+9lypbv2m3cnRVn/+rfnf/mX05/89E83adbp9Vsur6+vHMshhEghHMfxHbdpmrIsdYOmWUF1rSzLxXp1dnG+XC5fvHzZV5j+9KcHd/bG/cGDo7saQfP5TbcT5Hmum5oEYraYma5b1k3VclzQ2XK+vb3d7/uO7cXx5mZ6RbBijFmWY+jUdRymSSkUhUhyJVmb5WsEWOhbpu0qBaRoPNfc2tppy2p+fZ0nKdfNpqyaug5sd2s8KQ2RJMn06rrXa2zDbttmvV7PqhsNad1OBzogWW/qsqIQAExYVVu2Z9muphtp2aR5XVUN47yp27RcmbYVBEQHqKrrpmmqhjetHISubdth2PVcHwJEiOZYrhCibYVlGRCp1Wo5m17VRVlrOrdMQmlRlnlVcSF0yxyMhmEYYggNqmmYCAgowhoAivGa1UJwzaME64IrCAUEmlCKCwkBhMiAQBKEAQAQUARhGPaG/f5MNt989W0cx4Ne/86dO3FSJEkymZi6oTs+sTzX9b1NvInTaDAejbe3zmZnFzcXtmsG4WHNmxdvrjqef2f/cJVEy+U6ynLNsIm+2sRpfzJxbFeWom3bzXq9PRlPJpMyT3Vdz/OcGjROk0289johJoQpkZT5Jk0o1gnSJIe6ZlNi9rojz+2so8QLukWRL1bxKCu2d7Z2Dg6nN1dQN5qKWaazs7VlWdZiNl+vIwrQ5eVZ04q6yKHggLdlmkGqBUEwHgzjUgqhyrJO0xQhhDHO0mKzWt27d++Wf7xcLm+m8zzPpRCcc2TCtEjzKr/Ftd1GtcJOKIEEEEACJZRpkc6Ws9VqFUVRowpMCMb0VtNjGKamm7cQCKJpACApIRcSKYQQxQg1TWJZVqfTcV3fd1ydakWeR9F6MOgNhv0o2egm0XU9jjednt/pBK9u3pxdnnU6HYMaCirPc5RSbd1mWSK5AgBgTBGAGGMAJAASQEtKyblUCt5+JAixEIIoqA9Hw729vbysm4ZxwDSTQMSLvDZ0e+SFoBCKt+VpYluOzFijIycIt3YOnn7zB8O37K7bqTruyAZSLZPC050kWyzma9aq9SoGCMek2druEkNwUd05GhkOXy0WSKskKddZwVmreZqpGQzwumEKo1DXXE073t09fXehEfO9e48xpFkSvX19tl5HlOjvffhod2s/CIIkj7IkVQht7x4IdFrzUpG2KFIQsa3dSZ7GB3v7bd2Ymr5uVxijH394vFqtEysQQgyDoet7881Kp5ZLTMKhjY1JONjqjdfzRSnBsNszAMqyrM2u9vfvQECePXvVpPX9+/dt6OsUQS4Rb6PVtefrsxV4+uIHTXe3d/dav1zNNx/tdizbn91sDMBcLfjZj/5cMVUW7Be/+NXb03d/+OPvmWp1wzBMLS8r13XjpBLSCENPQQDhBmPHMKjXoaxpkywVQpimabs91vAFyHQduaavAfBunj45Pv6H/+Cfn7x4SWTTlAVnhWVq0+nVP/iLP0uS7H/+l//Pcrr54+/+P1gT1zfLTt9r9d7ZGvzr//Rqsy5MYxBD6++egijuFGX96vsIwMZBD5u06W+6h+HBRXGxaigvq7HpIgPsfbiVvzw5W2329x7p1rOiNB4/+qJQV6ZF/9E/+QtqwN/9/tdfffN2d3fX0LbmszWCIefkcr6SqvZ8c13fnC5f9LyRbbmeF3JRYM1BBGZF/tHHn0AId3d3F5u15dt5Fo/G/av5pW5QjW4ArfJ2la3ZaGsEUP16+jTwhkKDN/HN8+dvAdccrxt44yJZEhUi09zbw0pBoumbKJ0tVp5NPnhymBX5xdXz6fLF0f3D3vaB65mbZKGUsnrsvfHB86fPJxOvSC86R1rHKxxat8mpoe+cPksn44eQwIurZWc4CSZufF0EQaAJb+hvH0zuraYAKOt/+hf/9zv73z/74dWvfvWbv//jL8Mw3N+/45jdTLDGII3gf/rpjz774tPr6WVS5YIrrJMsSdeLpWhbIMVqtfB85/Dwzu7BXtXI169fp2kdZXXH9Us527p3GLoBlCgMgk7YjVYRq4vJqCel3KzjREMYYwoEAKgVAiCiYYIpkFxJJl3brOtKp1ZdtaZp2Y5/dOdelTedTgf7OHXTo4N7Nzc3y9lKcUSRdnFz+dMvfrbZbC4uzj3PQwgZRDvY2ZtRXUpZN83Z6aXvp91ut2lUK/FgPOpNdjHGi/U6bdTpy9d+Z1hzHmXZYLy1d+dB3aIoimbTPI7EixfnOyMbAff1i4vdnf3FNDVNezNf44BqmmpaBgk0bQsjJAWrJccG1g10fXFiY9nR8Vc/fHM0mXScTpxs/tN/erO/u/fpx59pmvHowXtPHn/UKjldzA7uHm7y9Go1BxhJBDOW7lpalaXxch2toj/72c+73e7J2ZlpmpPDg3W0fvbDq9VmqWlksjUaDAa6rqk8F1kmWkZ0DRGMMVAybdnGcoXlgSjLZlHZtm2/0xvemQy2x0pW3y1v3MDeFMn3J68M3cIAv33+uueET44fyJqJpqqhenf1ejgZS7MxPAOauAE8LvOIlUGv55v2ZpPWDauahiWVbSOCMAekrMUmLoo1b5oZxu983/d8xzAM3kLPczu9rmUZdV0bZuF1ukmS5HVL8wobRDFMAIEMqpbLolY5U2nFNimqWxvRLIp81wi6wXyV9oY9qZZAtbxOQ89Lko1lWVC2nuOxhmNspknetsqxfc7VasGQEmlSVi1Py8oVqhLKNIkehlHTGh0dAFSX5fW7y6zIIcB1u6Q05m3bM4frq2gGl7ZuVstmlWweHzzmqRgFY80wBcYA0q2tXdNyENE26fWbk9eMMaIjv+fswN31eukHQStUx7e8yahp5fllIi5iwZWUfusja9ArMds66FOjhih99vK/jHf2vL4fs6qq24tFrNveeLg9DntAtkCjZtANJ9tS8Xx2XVIuVX1T3rC2tXrOT//i86ur6c10YZqmAVnZlLYK6nVEEJn0Bi2XeVG6lmNs20f3Hnq2U5bl5cX1fDbDAFKKBee6QVzbwEBtlhvTsHYnh6ZhKwUJIXmeUg1TCqN4M59dR/E6TRPiIgrokycf6ZpRFIVtu0mSlUUdrZKrq+m9e/cwotlq3e12oeSsqrbCcGdnx7btsiyrqpgtpqvVqqoqCGFV5IvFoqqqXq+HMd4K9qOL+fn359vuNuBSMuZirY4jKbkCAmMMoZICKIUBplBRVkvRNsR2EEICq9vsDsSIsTYvSgKQWqyWJ6fvkiTZmmyXVROnydNnzz/84BPdAKZlffv9N6en5wTTyWT7k08+sQ1XMl5lbDjY6fimpaEiz1sGHNvo9Pus5UmSVE1ZVc18db1YrJz9/s3sTNNVpxv6js9loWQTuJ5tmwhCxYFSUMMUY4pQDSSUdb3ZbOI4tW17NNiyLKMo8jRN+/0el+18Ph/O+9t7Q9/3yzJfrzY3i/V0epXmBdaIrtkuxLpBAadJxKY40hBeFjEUYH97mzPimv2riz/u7O0CCaUEGFEhlBSorVsNa5pmmKbt+yES0DV9k1gGjcpqJTloWcsqvpgtgyDAGtI0w0JGC5oo2WR1iQgcbY2kQmWTl0n18PgR5AgqZGgmL3kwCE5O342HW9Pl/O3lu9Pr81UaS6xgXbIF26RUIahpWtXUqOWapkml2rY1bOtW8nH7AgBomEAdd2xdcoYRqYvy4uIq0K0/+eLTDx4/rrL4zYvnVVO/evVMKv7Nt19iSgHg33z3rW4aN8vlk93DDz/6KI6KOG7LWlxeVxhVu7sDjbqrVblepwq2EADI3ziO87s//KHb7789fXd+cTIcdxVqxluDTi/cP9g6O5+W7eTP/sEXf/fL33ldallblq25g7Btq6jI5ifTkrWPHj7WLcs0XNu2hWirOgeQrVeb8/Nz7dAIvbAXdpTECEDPcfb3doAiYRgul8tBf9ezLcmqm8ur169fdjrB8cOu4/q97iCvY4SQVLBu6tVmPe4fbJabt+/eEagHQTiZjIaTHsZ4dnE1pCPDsCAixFg2grOlSMvi8OiOANL2jJ3drbop48slInAw7GETAIU+/ezDzd29xeJsMDDPTpee79w9uuO7dw2ya5njKInHw4np9TBt/vr0f4/jlNVi2Bu7ruvYYZ03om1++tOfHN053t3e+e1vf3f69mSzmhuG2esEq+nM9/3VcnlxenZ+ecZZW7VlVqRX52c7+7udvg8EvLq4gVD1h73xeKxIAwkuynq12ZiGFfQ6pmn7jt+WTEpZVKVAAGqo5ZzqWm/UW8dNWZZ1zSBAOjVc15WtjDdR09Q7O3u2oX/73dfPn7287SIFfme+WpqmyZVECBi2dXT/nhcGeZ7ezOdRvH598na0NRmPx0SncRxPp9O0LC3LUgAIKTnnvu8PBoNbXIxpmr7jIgWqqlJKdTodpdTldFmW5YsXL25ubizH3drachznm2++22w2hoFv3/v69euLi4uGVXfv3k3imEup6zqXAlEkgUIEYgAFa03TyPO8LqumLh3TOjo6cmz7k/c/PD09rYqUUjifXxdZrJvG0+++qlij29akGxaH+xDwVRI1rNEE7/jD9Tr6w+9+t793h2C8Wq3/9m/+4yaJe/1+kqVxHEkk+8Pe9vbEtm0puSIVhBBTklxeSAj2dvd1XRdCTKezumIa1pGCommRQq7lbg+3Li7fdMOOiOOaiywtTleXSKH5xU0bNI8P7wdBuCiruuWM8Yvzq/Oz68ubTEpZM75cb4qy7g8nw9FEQmSbFoaobVsuGo0Yge9YlmUbZhXlnqdpmgYAXy2nt0eCrtPhcDgYDDzfGQ4G/V5vvV5FUQQUIEQry7LMK9VKCIBpmnEcn56fzeezNIuJTsLQzfOybplQCijEGgghlIIqSQg2lcKMty1TYdi7DcBzpqye3usOyrLeRIuq4r7vuq49HI6DwIMQV3UjhEzijCvZtgIAhJHGGMuyHEIcBjbWKK+rJElo4IfdjmXoEgLX93XT4EIxzjXd0HU9LfL5bLm6muZ5ijFerTeGafpeFyKS5FmZ5uPJxA+6UZpdXkw3UQIh1jStqsrVarW/MxqNRr6jL2ZzzjmQajwex0m+WK3SKE5Dv7Mzcly7KlKgRLKYn4iGUponMRLS8/yDnYPnz1/Ok9VgOP7pT35WV/zs4mJ2swCKxHHsOI6um0zwoigwQo/ee7i/v9+27bt375JoMxwH29ud9XKZpymlxmBnVFeMc6FRyzBsBHFT10rCRZK0bet6puvapm7s7ewf3b0DACA+EkL0uv00TauqKcsyjmPWcAhRv99ljCEoTVNnjGmaNh6Pjre3fN+fz+dff/v01q5yW7bMssxxHCml4wZpXimlTs+vZrNZHKe6TnWDQoiUBFICABBGiDXsFv1023NkqsWYEkLevX7j+77r+BBiKaVSUEPYtx0CADAMLU3FbeyZEDIaTVqmmqahtAl8u67LPE+bpllvVt1e8NGnfwmkQIDbHVPXAYa8G07ydGNbWn8wWS7nuqnBXF1Nz5areV7I3a6pGQoRpunKcrBbGWVh6DqK4hXFlCCKIBGghZAwxhhjEJM4Taqqnox3Or2wqorlcllVJaW4SNPr62tq4JoVtmdfXF+9fPb6q2+fNi1DFFu+qxmUS56lLFo3rh1UKUSmVRWcKPzq+ezf/qu/i6OauNZwNN5sIq6UEKJpGgyx6wRFXiebrPArAjXLdCVTpuHAEAfNTpJknPHQ6UBEMNA820IAaJggJBsJWFtBJF1PZwLWNTsc31U1uDmdoRFNVtnTr1+eTq5+9MWfaJYDdTw52GMEFkhAjLlszy7ORcIgRrppYEqkAAhjXdclBJxzjDFA8NYDhjEGAECl6kqwsuFUNHn58tXb67ML1lSff/j+3YPd40f3qQajfPXq9fNvvv/6k88+FqBZx2vb9zqy+fjTH3th8Itf/+YnP/3ZP/s//It//b/+u9PTeVUL0+kmiVxHEirQchD6yoL01evTf/4/WhjbTS27nZGugeUyevDkvSiKvvnuLbXcjz/72evzd4A2yDUqyf/d3/7N2dnbQS/8f/y//1+T0dZysbl7/D5GmuRqsZyBaIWQ5C0w6XqzivrdIWdtVZUqKUzDHXY6rutHUXL29s0nn3xEAZKMnb05uXh3itWBYe5Zjt2qVszaoqwhRkJJVleLzerVy/OXJy8ManMpbc8c9Pq+5VqOVVbrpEwhwPPl7HJ61XIRdHxqaHvbYyewbubXz199Oxj1jo4PhWibJi5ydrB7PCA9jBvblrZn372z1+v2bDMAXF8uFl99/f0yuhpO7LqNJVdRtonERsN64HZ63SFBhmkIqJBrG59/+uHezta7tyevXr06OTmZz+cd1wcSqJpRiKosf/r86XK9NCwdUXR5eXlw987O3vagMxwMe4PRSCn16sW3eVGVeXF1c0MINTXTDXzf76Ae3Cw3t35nJnmWrk3H9n3ftl0hVLRJ87zUqWZZDkKEEK0s67pibd1apvf48fv37h01ZbNcLoUQq9VKCDEc9h3Huc0cnJ+f6ro+GAxOTk4uLi7qurZty/f9brebF+VyucQYHxwcrNfri4sLxphpmrfG+rZtb8MNCCGDagSiKFpblmNZVtu2aZr4vuf7/ng83D/YjTZJEAS6TpVSWZZdX19TSm0dM8YgRgAAJRRjTEP01qzR73WrquiGHVabVVHe3T+oquqPX/3h22+/NXVjOOq3bauA2KyXv/37X4fdzoOHD+/eO94djx7evXszn63jqCxLtyYdr7NabXa2t2XLT9+dvn79tmasqJuasYbXiBCaVXCx1vSESynlJgxD03GzLKsb5np+2wqEyP2jB47mxFFUFXUWZ65hOcigkuqatjXaSvJKtEnbNDdXN4EXhn6o6yZjvNVEHGVE17K0VAjePbz3y1/969UmKRsAESAU6KbX7Um/49/c3AAAmqYqZ7mS3Pfd0WAgPJdVSaAHuomAQghjy3YopRjT+WLK2spJXM/zwjDs9fqu62GMc17fTOcANgAD0XIpQNs2m82Gc65RQ6hWKDBbrHVTPzw8MExPSkkI4TwBQAuCwHWsuq4sQ2OM8RZQrEHKdV3b2RoLIV6/rlmZDUd927Z9L0SI3Lb5EUJFUZQNF1wSomGkKynaViAEEEKdTkfx1jbMoNvZ2toSnCV5VnOWxuViud7EadjrT3Z3i7q5uLhQNUdYz6py8+JNklXH949MOygq7noUKBrH+SZKmqYVnK/Wy+Vy6QR6XSSCH+sacvvd6fUla6qyzK8uzufz2SZOqiIXrApto7M7EY1WbW4akzKsiOuIvIrTxKLm7mg3WReX06lg0CC27lFDjwVfN7W0dEMI0dSlaVn+9sT1vN6gHwTOm7evzi9elkXW6z/c2Ro6dlsUKPC8FtobGSsgTItSgtM0jTYZY1yjBiZQ0zTTNC1kWJbe6Qaapr2bvhJQJFG0Wm7atpUSsKqmVK+rJnC9JMkghLbtclaHvrs1Gpum/e2335+enkopw7CbJEmel6ZpGoZVlrWU0jTty8vr8XgshEqSLN7EjmMjaGOMRQsEVwhDCLESHAAIAL51RGJMNIoN3fQ1x3Vdx3ERJJxL1oi2bVslyWqz9DzPsExK9VZwLAWh+t3j4yRJqKZJII7u3T05fZtHSVm2v/rN394//Hww6GECiyLJosS0aL+3LYTMa27bel63SKPEQEkRURPdGXdMG0HE8mJTXUSLuV7XdZaksULj8RZGAGONUoIkkVIRQpCJizSxbDvwO4N+X4h2vpzlRWHZZlEUhq5jjNbLVVnmhqWv4/V8umwZdO2O63vUMrjiFWtqxttaQA5vkhWvb0a9fs8P3528OX9XGxTMo/Ls9PTvf/Xryd5O2B/UTZPnpalbvU4fIQ0ratsWEnhdrtsGBE4PBNlykSpFd3cOMcadINQtsskXgErTNw1XQxRdzudRmgJIiWYEJPj2h++3t3ZkpUbdrfU4//0fv7TdMOgN+sPRgw+fEM8OtoaT7e28qf7qr/4qS68Mx7Y818zSoqgQJUTXlFJ5nmu6Tgg1TfMW5tW2bV0z2+0opgxNIxaglGzi6I/ffLucTyeD7icff/DwweHjjx6ndUxMrJkaa5ukTPOmuv/ek8Fo59//zX/8xa+/+R/+xf/yo5/cZ4r+m//v/8ZZqzBpBATI0SgGrO4O9hhjrVSUhg8ffrpc5FWB37w+7Q5cJawkaVsOBNSpaX/6ox+/evNO1HKxmEnV+r3O8fuPAdVm60g37NH2Lm9UtNpkab1cZoYO60a1DK2r9fX1tecGhBgQYATKsqil4Cdv395MLy7e+Q8fPizitK3qjhu6hqUgtV1riFWSp6v1DGCBNQ1Rarim13Pvv//AoGYWly9OX8w317Zt3xnfTZqsrpmS6PTy7PnrF2HQfTB5RDRse3a/30mLFZ9xquFOJ6CGJnQqAWC8UgBBROJ0TSmVihsmUjJnrdY0HKh20B3sjPs3ywteN6qVQMEkil+9eHlj3xBsaJp+dOe+bbuEEEvHx0f7e7vj9UeP5/M537DFanVwcDDp991PP1eCX994FauW0XI5z2zbBQBWTXV4dHc03PbCIOx01R1Q5jlBeL5aYwAt3YizvBd2StbM1gvOBYCwrmtHNLVk2+FhEAT9fn8xXyZRKoSCEBqG5XmBErJIM9O0MaLrVQIBOT56oAFV1XVZVRKouq6EEJZthd2O5djj8XC92czn8+cvXpiW0e129/b2gm5nFW00XQ973bplCsGyLKMoOjs7a9s2z/OqLD3P832/yPPrq6vlcuk4VRj6vh/MV8sffvjBsiwpheu6aZrWTWk69mDQk1JSissyd4yAc47aVtd1TLBSSrScUgwVqOs6jZPjO4dJpK7OzhGArml/89XvptcXvu83VR4EwdZ4sF6vERDz68teNzg63D86PHj/wf08z6fT6WKxOHt1OYD9fqd/sHvn9OT07ck707Atz3cc34SKybYVnEkV56UJbMPQHacrIFYAm5YrZJmmZRIX/Q7SMB32R6P+yKImr5o0SaqsfPrVN95Atx1Lw8jWjH7YPaUXSkidmrPr2Qv91cO7x0HQMR07TcpVtHnvyaPt7b2qesOaStc1gGCySU7EW9t1RqPRaDTQNG12c311fZ4lG1YXGsXj0IlEGa2BlMAwjCAIodJKxo8O9yDEVdlslqsyy2+j+JqmAUtnrUSIKCVrwSRQmmk4vtfwttsJW8EgwZvNyod0NN61LAsCQ9O0NG0Xi3Rne9Tv7ynZsrZ89fyZFELXTQ2LaLW+si97nZ7nuG2DWykMw6CUVlUTRZEC0Pe6nEvGypZJy9SopmtUIcg1zYAQOI4DBG/qumJNt9/jjMxmMwZVyZqqZRzIVoq6rhlrAQASIUJIm4nVOgZE6w7HnufVtWxbsdlMN5tNVha27VqWRZOkyNPRZMuxrcBzizKnjum7jqYR13PTNDU0fdjvs7qO15vlfDEIXV7X8WxeZ1myWG5t77RltbpexKsUa8Z0vt5E6c11fHoykxgrCZIsv5kuJ9s7vBWU4v6g2x+OEUJxGk2vz66uz5RqbBvm5Xwd1YaBOx3H9ay3p5mUZVWWZZ5RaiqJMFIahQgKijVKEFCCM14BsRJt27Zxmd5ei9u2dV3/FlxhWdZisfB9v2kahAil2PfdBw/uOY737Osfvvnm+6ZpHj161Ol0ZrPZfD4XQtiGsVqt6oZVdZvl9fvDied3WCsVV23NakQwRlJKBYDiCnCFAYESAqWgAhqmhmHYtm1Zlq65CBJRM4UkhkRDSEilGCeGqa3WC8f24jglmLpueH114ziu74VBEGw2mzuH+2WV1027tRNiIlc3b2WzsSyL6BpGAEhFqB52BhCJui6WqzUhOOz0PvviM4whhPAinSIEAJCbTQKkMAwDY8yqmhCEMaYa0agGJWyZRAggoizXsVxHJzqGZLNaM1ZTCk1TB0Datkk0LIQo84oxDgTynXBvxwo6oR8EXIEoS2GWY8iUUt1u39HyOIo+ePJFnRf/2/e/iFdgZwd8+OEOlPLFy+cAo63tbUxRlGLDMMbjLcswb+mYWZss5qsqLd1d13ZCyw4QJN3uIE3TNKl9YksGESKIE8fzKDGytJ5db7hgYcdAQutZo2SWv/72Fx9++PHnn3xR5Ozp02c7+3ewbmANKwhc39/d38vKgjGGDa0FkkOlCBJKCiUVBG3LMcZCCADgf2d43dqxq6JkVS2aus5L3zMAgiVrLmbTl2+eT5fTZ2+2f/YnPz5+cH8y7kugpFK2b+06e/cevffizbtvnr4Ie77h2OGg8/EX77989/38ZspRLlBdtrnl9juhzxE4OT/v+P3lJvvJT/+SIHcxn16cLWfX5csfZgf7H6SF5rkTLq3Dex/kFVnDdUdJQ4OmRaMo+ru/+6VS4P33PnGsLlK4Yi2AGGMsgZISSAAIwkma1qwZd3uGZrZMrDbL9Wbputbu1tbLly963U4Sx8P+YGs8yfP85N3l9s7Y7zjD8XbByiRPAGuE5On0quT17uHO/s6d6XQKpEqz5Ca68i3fcAwn8OI0F0gSk2IT1aKyqHly9pqJyXhrpGCbVcl0cb29Pama3Pb8tMgdI/TD/maV7e/faerVan1dpLM6d4QIHYf4QacbdpJ4FXqhpmlBEHbCgWXYrBFXV9OLs8u//+Wv79170PGDq6ur9WbZ7Xb3dnbHA79QNQAcI/79d19/8NGH//gv/0EL5Nffff3yzeuvv/u6Ys1ovMVlCzGJ00Ii0lSMc1mVTV1VigsCiKFpK229Dtae7WRFXjWN4zhIJ1DDeZmXRjryJqPRYDAYzKfz1WqTRilnbV3XQCrW1hjj22K0ZVmO48CWTSYTKWVRFNPplBBy584dCOFiseh0As/ziqK4Ja48e/bszZs3H3/+OdU1otHp7CZO4uFwKKV8/eUfT05OKCGUEN/zdEJb3RCs5Q3TdbpeLxEC4/FWVhZVVaUZaZlYrZZFkVuWbZp6GI4QQo7j+b6/mk2FkpZldfo9jzpCCCm5UpgScnVxeXN5cbS7f3F++qv//It+Nzw4OLi7d2BRfTqdvnv3bnd3FyHk+/5nn3325ZdfQqmasuINM1yf2i4POlio0Y+2kyRrpdje2Xv2/NXOzp7fHUznc6JpTAmhJKREN3Xd0g3L1HWdlXzrN5IAAQAASURBVMtbWo6UUglNIzar+WaT3BInBWsNTA39FvnJCSVFEmka8R0baxQRPJ3OLk4vkjI52t4NPN9xHCgVJHi5Wm3iqChr33Ety2qZcDwfYtwI0bZtGiebzUaI9s7Bwc7OzmTUR1AJIeq6tHBT13VZlpTqo9FgMtlWCsRRWlWVZTmmaQIAMaZZlq1XEecceGbZMA0T3rKmaYqiABAOBoObm5uGta7rjbYmjhvUrAHQ9Pxh21oIg7y4ePXighJrNJQIws2mUFJnTW4QDWtwvVo9/+HlaDA0TdP3O6vNhjVcWRAA1DIOMTEMgzFJSQWBNE1TM0yEUF01CEHO27IsyzKfT29ubq5bKXzXzuuylQJRMtgabxEdEVrWTRzHbdtWTaspTbPMwWSr0+kAiMuqqVm7Wq1uH8cVgoRg09T293e63aBiyf7O2HGNi9N3iWs6ljEY9oSin33yUV4JxtokiWVde56nBBBCdLvd6XT69s1J3fCDO8fD/uRqtpienDIpMTUci1YtV630wk4Ydm3LreoiDLyw2zENY72cbeIkLzKheFXnnqtTTZei2Gwyz9UwsgHMHr73pKqq66v52zfnq/WKEgshra7aTjhAWLRtXVZcSi4VZQwmaYxNSg0NQ+ZYrmPZeV4CqeqyggpURalTDUJY5tmg1+11wuvr62fPnpmmORwO67o+OzvDGFuWdX19XRRFWZa3S+per7u1tcUYu7q6Mi1bKVXkDcLgdtcAIWCqhRAirDCGmCCEkJSiqkrGmipdAgAgxBgTjOjtOt7UDNId9BSEnU5vMd9wBYSCSZ5LgDu9USvFOlmPx6Of/OmPW948eHAvTRONxcvZXDftwWgUdnpcgsVyCgkOO52L6fX51QIi8cGHjz/8+LM8T9+evAn8gef2gtDDWK/yzLIsSkhDKwCQEIIxBgGCEtY1b9sWSOD6nlKqbXiWpTWrNFOXLa+bghDCGONMAgQRwhhiSAzbdCsGMSRKICEVbyRrBARY1835zdJz7L3t3R999vlmuXjv0ZZtmkeHd4Lt4PzyIskzy9aHgy4HcDq9blmta4hAoIRsWS2EQBBSDesagdDojrcRwq7pz5bJZrOipmGZAQdVUzaUKMvyR8Fe6vMkLfTWngz29sdHf/Mf/+Ob58ss/rUU+M7enfn8y//93//1z6rq089/tLez++7s9Pm337dcFutUNwzWti3nhFJICSJEgxARaRiGbHnb8rZtpZQUE41QQzOhYYHA03SyWS0tQ4Oi9bo+gbJuy02e2qt10B3YroswmM9nQRB8/tMvJMDrVfJv/t1fIU3/P/7z/8EJnZxtwhH95KeHm7UbjGVngs6nguOkMwoHo+75zauiXf3+m9/8X/6n/9uHHz25PA+k4v/qf/1X/+F//8X/6V/+nxnHb95ddyZHPex+8uM/fXb6ewvTvNisbpYQcMsyfdfHCGxWC6CI5BIS4Him61mmNdzeG8SrG865RHAVRwSltu3arn07n+SC/d2v/9YwNV3XP3jyPiHal19++WL5dr5cPP7wvud3HS+4WS3iJCnrtmVQSTIaaoavbWkTKfnZaZ5E0at3byaTLV0nUR43sjm4u9ftDRBCTFRxGpd12o0CJuuWl8vlnBCA/IwQb7VOKoN4ll436k5vGMVl2LGkqHlbdazxsDeAyNR16treT3/8UyEExZqhW47jEUKhkG9fvKprhpXwfTNJ9KurZFokUFbdbleWeLme3SzlbDGPixWi5PDe3Tt394hNvn353WI1L9vKdp24yL5/8QwTIqnazNfT6bQpSoqJZRgaoRRhz3a63W6SJLgsfN8FCGqGEUXRfD5Nko1hWEqBpuRlVUMkLFurK+bYduBZTdMQimzHNDSUponvOHcO9rMsm82mTdtqhqEZBldyk8TrOAIYQYIhwf2wG3a7lmU5nnvLWRJKGobRtq3kotPpDIdDx7b39vY824njuG2YaZpb48mmrhBCjLG3b19nZRGGYRh2K1FJyTnnjDWE4uFwCAAoiiKK1nGaZFmm6zrRNc9zMERCcSkEISTZRGWWV2V5cz199t33mkZWN3PHNn3Hr7yaVTxPytsn5v5wcvzwvclo7Hghb1UUZ0AqSozxYHJ6My/axvOCxWZzNb8RCjesXa+iRsisLISSYbczGA8I1pMyqZqmYxqGYSGosabUgNNxB0hqV2fTuioIhmWWNnVlaETH1HGcgdtRSglWeLbW8CbwnUcP7qqWNTn77POPx92BgfXZ9XS9iNZJnGXJs+dPg9C7s7fX7gjPD6hhYqJphimUsm2bUipky6oaAggwqvJyvYnq5LppGilBp9MJvTJPc6VgVZbLxbrb7QdBJww6nucZmi5aXpZlCclwMCEEZ0kkhJAQMMYc1x0Mh03T9IajTz77vCjr7394nsTVeGIOR0HbNoRaRcVZo1arTIomiRPP7a4q3jLQHfZ9u5tlGQG6rfu6HdaNghC7TscyBWsUF0rXzapKdV03TeR5jmbolGKlxO1NpW1bACTRtVq0qyRqAY/KXEKgMNAo1UyzbQVjDELo+74TQKUUhJASzXEcolEAgG3bmqaZjkkILsosSaKmqQGQtkM90jk42At9Z3VVrRdZcPfANsxGgMlovIqz1Tru93r9IAgdHcoWa5bdp3nT3qzi5SYfbnHDDvp9iog9W0WMS03XDROnRV6kiWVZvcB1wi0IYStEGm9my0WcZJBg29Ydy255IXlLKCII5HlSlZFuEL+33Ql9yxgh0E6vl3UlkiSNNhHFEmPa1PFtlaDf71q2YWgoTgvZSsaY4ziKq7ZuKMJN0yAF2qYOgwAhFCnp2pZoWbxZS8CrsoBYUUpvEZYAgLLOLcuiOsYYKyhGkwFAcr68adrKo37TNKxplFKEEEIgQkgB1TSVrlPDpBAhztq6KoVolVK+04cASynyvKqqWqPW1tZOv98ns9nUcTxKqWEYt2UPoFDbCs45ANIwDM7ZP/1n/3i1mgeh1zRV9PJ7gjkicr5ITQuG/eHVPJIAtlK8O7103MAPHIj01SqdL6Z52oyPDwg2oTI8l0CBhWgpJqbhUqIDpQAACCFKqFIQYQAVwlQXrGXtLSwTmZbe1uCW3VY3FYKYUp1zXpWtUorVAgBUFjUXEGGMEDZ1i2jUdd3DO/usqU1KkmQBQfOP/+mfD7udwPP//a//Q1mkd/b3+12vKJOSNdfT8yQrlJKmpWOi8jzlrA5cpwAgy5K62ACMLd12u/1OUuRlDRQVrRQSIUxFiQCmQ2ei3/HSpKyZ6Lp9COF7955QbDLGoISGZu5ubX/39Idn3z19//EHj4+PmzT/m7/9z4Zh7AxGVyVINhEi2HYdoYCpGwAAICHGuK5rIcpb8ugtTFfXzaypIFQE24ZJKUVJVMhlLXj78MHRxx++//Do2PL8uiJNVeRla1hqtDP+/rvnX3793dlV9sln9/cP9xAVN+tTRIp77w0bZigpPv3T/bi8GnS8hw+2jh/vaW7y97/85t3V71+93SHQWmwum3bj+UThdpMsARJlU8Z5VN7wveMD/BJenpwZJt6f7MbR/OTt29FoPPzTP5dClmVW13VeJFWT61KNuqPJXne9cG/vPa9fv14vN/fv3x8PhpZrtXXbqlZB+ertq0cPH/thwFsJIKxKdnp+7ff8u/YeIoS1bdnUrZB37j1QklCk16Iu2wIAyWQFqZJYlazmQLWC+aHX6fXHo4lS6uz81PGdokgup5edrtftdV3XUkB0+n0D2/2eW6RqtU7PTy8AjCRYCp5WuWC10wu4rpE4SoWkYcfb7uwkSbZeLK8vL03DPji4M+wPhoOerpuhb5sa7Xf9dS/crNZNXUAQuKG9TkC83nQH7sn5y+lieXL19ud/+Rd/9hd/Rl39/PJ6vlleP/uu2+t98vln4/G4KStHsyzNXC9XabwpspwTapuWZZidIFxYtlLKNM2qqoCUUKk0W80XFecSY0qgTgjtBYNBbxiGHZ1qdVm+ffv25cvn06n7+NGj7Z0t0XLdNOI0CbsdzdDLsmS8lUrVdZ1k6S0oJivy0WR0d2dnb2+PSXl+fp4VRYdSQsjy7BxDtH94p9vtAqVcy47j+PTknWEYjx4+3N/bi3h12ws/OTm5DUMYhnFLs3ccy7Zd13WpRuI4ns1ngstuGERRdCvMhRBCCHnTcigt3cAI+b6vhBSsdS07iTcnb9+Ouv3hkyePHzxGlHAlS9aMxuP+cOAGoWmalm1XQtRZThC2DMOwTKXHxDZ1zzk9PUOanmfFzXQBMEk266K+DQZW0TLJ4uy2Mg7NDsa15VqGpWuWphjO07Io0tV6Np70g25omwPbMtI4urq6uLx58/hwL00jbJrLxVUtwPbWEAppUovVZdOUAjS6Qdq2ubq+WCyXf/z67QeP70EILdNuWRXFG6EQwrRmLcE0z/PNZlOUuUaoa1sYY8ZYz4MQUl3XBUdnZ5dnp9eEEEr1fr8vJcjzHCOCMa7rJs/zJElwp9/t+AgqybltWgBKomuO7+0e7EdR4ocBwcbWZFAztYkSwaHl200rTMPu9Udhd5gkeVMXFNM8q6qq5Y00dt07+wdN2eR57lh20eJuxwQAIEgUFIHfq5q6rlnbtoRiSinVkK4TTcOEqqIospRxKXzf7fZ7dV0ijPOqLOrKdX0AAFCwamoIsB8GQacLJSpFLYRQClJKNWoQQpVSRCee50kphGwxES0vqzrlrMYYPnzv/eOjw61hV4NidnVJMUrTBGlGkkRF0RR51u90J6NRmW2WNzPbNLgGnM7Q6aVxUb0+u6LEwFQnuruzF0RRDBGiOiUE123t+bbrut3hYLPZrDcpoWA0GvUHIwCAQgoiUeYRazNNkwQ3jKmWMSnYL3/5V+PRTifsGyaabHlNBRzbMA2yXm00zQDKuAX42jY2jABBDgBkrJVSGYYJADAMYzgcFkWRpqmu6wcHB7qu34aIIYQHBwdNzZ89ewahGg77rmsXRQEA2Noa32IbblPGo9FosZitVqvhsM+aSikAAJQScK4gBBAihBBrCk2DCBEhOGtrBaRp6rZt7u3czbIsjtNWSF0Ztm37oecHAZnObvZ2jcVqDoFuGgZAsNPrZlkhlPQc1w+9759+s7M7fvn6hVRsb2+vyqeT7T1Cjd/+/lvdpAfHdxzXTLOS6JrlOj/+k58+eHDv4uzkyz/8Ltrk9+4/CrbGRZZirHt2QBEtisx17MD15vMbyVWrcQgQoFIpBaFCECCEJMGapinHJATJlhOICMK33hpKNIxpUdZpmgJMIIT/NQKZl6bjIEoIIbqum6aulNxsVqFrvX79YtgL3n98f71afPvd77//7pvJ9taHHz4O+4OmrfI0q6rCNvU8jVmvk8ZyfjPPNmmdFYv5PFrHjme4rtfvwl3b2j845K1Uiq9WM9PAjmtQZCCu6YblDwdNV1UlMyD+7rvvECAEkHDQ/fOf/TzJUsdxEMIXFxfffv3NeDga9vqYKx3ge/uH+XRdFAUkWCem2QpN06ACACAl5O13QQgpIf/b1Ah6rpXnqRDMsrUgCCiFBEPJ215/+PGnnz44OnrxwzOKYK8TeH63KluDgl/++lfLVfrxp0eHR0cKSt2im9Waq43ltLatWF19/OlRFM86/vDhg+MGzB59OHz+CvRGEOoZxUDCVMHi408fHDw4hjr+/McfVgoarr3J83fnb4ooSZfxVbY+efGcUNDth+PBII029++9F6VZURQIi3adVSzNShNrAlIy6vZ0XX/x5vVsNRtno8FgICQr6oIrcff4aDFbBp3Qcrwsy/xOuBOQ1WqeJlldNQogrFE/DIhmQAg1U6+K5nJ6mSWJ69q6rd85Ptgyj2/ntPceHE+2djiXnusbtvXdD99zUQvRTrb7e3vbrC3zMvNDL0uLGtODnffziCfR6hJq0+mNF7CWG1SjCEDTQoq38/kUYzoY9Io0a8oqjuM3b94IroAEum5ijGfXV5audbrBaDDYrBfr1axpKkqhbtJuP7xZTkf9Ud7k27vj5Xr27dOvBFHUoMiA756eCAj+0Y8+/eDjD6fT6fXFJSGkH3SohLyoeMFc39nd2anKsiyKLMuapjEMLc9TW9kASIikbhBPNy3TBRJKgQbDzp393bKs37x6XaSZrutb2yPDMFzXVkpYlrXZbGaz2fHx3clk8u233y4WCyHEYrGwbOPW6XB7RM1msyzLJvt7t/a865sbBEBVVbcbul6vt1mvl8vl1cXlmzdv+r3e/Xv3wjD82c9+lud5URSO4wCEOJcAACk5hPDo6Oj4+Hhrd48xtlqtbNve2toSrF2tVllZcM5v3XpFUXDBSIAghBih1WpVV9X+/n6ehW3Djg7v7+8eumGQZOmrk7dIp/sHRwd3D1+9eV1VVVpWKqswxhomWVETkhNDaxMxnc9+ePFyMt5uRXZyduoHnbZtTc3UTANDkmwiLoVhGK7rVhmPonnYDY7u3bU1K0+Kqqo0E1KqCyGSLIbIHgxDostNqkdR+e70dd20o7299XpRtWJv/66mId9zzECvi3q9TgLXU4DneWLZuiRNXRej0Wi8tdW0arFcM64AwjKH33z97e2TgG24CAEAMCG6bThVvnQcw9QcJdR8scqyIgzD7e3tJErLvMKYSC4t0xS8bVldFtkiypVSBEOl5HjY1yh2XTcMwziOTdOsK/bd0+/v3L03Hm1JhZVEcRxvNpuGC8/zXMefXp3VVT4a9s/fXfC60jWtLphrBiblrOYAYCmwZVpt29zaeRAGrGnjONZ0ijCBUHHOAKSOY1u25lSGRvEmjgAAuq43bV3WFcBAAJXkmWmaGGDBuU4NXdcZ43Ec17C2LNvzPcfxdM2UEpR5WRRFFG0wgZpGMEEYK0NDTqc3Gg9tQ4cQIABHo8Hy5mo2m93MF57f93ujXmgjRPqdruM4F29fv3jxYjzoP/rwsaYZ/ibZRAlXSEnY5FWeF0VRNIyZluE4DsSgG/quayMMVusZY9yyjcFo5LkBIkYruBAiL2IFWJos1qurvCwJ1rCG2pY5rl6zZLGqlaSsUayGUmDXtYIgsC1X1808z5umCUM3CDzdwLVsGWO3yumyLBljYdi5TaTZt9dq13Ucp22b6XS6tbVluc5kd3xri3j37l1oBf1+v6qqzWZDCLmd+W1tT7788svL6eX29naexAAADAmAQkmoBEAEa4QQRCjWMMRt23ImLFvfGo+2t7fLRqV5djOfAYX6/cHW1s5oNPYCl+xuPex3R/fvP4yjpCyZY3tRlIbBSLQoS1nTNNuTe21T3z/+hFLcNI0iB5uFMgzw8O7jmrGnX/4+6E46VrDcVDu9I8CCi3d1lNg7Bz8+vI/KuqSKbY/3r66uAseiWPVCn1KcZsVmXQAgDVNDGEvIIYRYg5hCxiqEkO2bVMOZglQn0pDpOkGSKoqEEAByS0fCgAJw0zQ1w2NcKIgx0eq2besWKAI1BaTq+b2w48XrxfnF6cWod+/46GwxV4Ya39nu7gwARCa2GJCH9+58+cevn5880z1ydXW1XM4vL854y6qqsCxroIaL+EaB+uvv4sB2RxN3OYuBqvNcxKnoTwbhwEya0jZRMO4iwZtrsMzrFy+fdQLf87yzt280CkFV3R33HuyO0+V1Ey9NyP+X/+v/+M3X3y43ESuXdbFSsvTDbgvqzXrteIFlOevFRnKFgMQYQsWlEBBzHaPrGIXeMM2XOzvdn//8Cymy5fLizv74zsFOUb/44/c/QIE3m2S4/ZO4mAZBeLWGOdMeffCJaWkQiSSb3UxNhcDJu5u9gy3NMdd50+lZ3t3x/SePsiK5mn1bFvyTP3u05T8Ybx16Wk9xu+bi3tgGGsvZRjcNHjc7jrtj+Oz6ZuQ51XrNiqJq6g8/+fif/bN/kuaZqLUkKjAiBjERpBg7sgVpQhE0uzpSBYBA67m7WF5/8/XJKqofPjoyQn11Nov4jIQgFqvT5alqUdY2oC3GYdhzui7phpOhDrs38xnjbL5aYlK2rVgtZ67tEQA5p+PRBGqkjGqRJ7Zuuob++vT/z9N//ci2pdm92PTLu/CRbufO7Y+tU6d8dzWrWbfZFxcgpasWIOD+SQL0qFcBfBMkQAIEiU1RxXZkVbPLHb/9zp0+fMTyZlo9RF0m8iEfEonMDMSa3xzfGL/xko2nHuzFpL24u6SOs10ZDZRCmCsZT88+HT0uC7mbVTbpUQVH0eecpw6QsMNcrByXrHavBr17USKbCsxuFzKajEaHvQZ6zrJtmt06IzjvR3Gbl7O7G941QRRuNmsJcNnJV+fXD8bMc5MHp0/mm8XRvXvJeFi01Xy1/Orl17uiqJuuleLDDz9+cP/R2xdvf/+7P+7Wi48//Ojs3v3JaDLsjeZ3M8E50rRMq9cvXquOC163DbIpKPKlbbMgDqWUEFKCMGE2Qw4wbLnY5WkBFcrzosxv4yQMPbftStu2ymLX7/cJNkryrtW+51xfX/u+n8RxU7XDxyOKWZbkvhtSQrNdweGbsqzDOGzqTgkzmEzbqvWDxHPc6dHx/+P//n9zYzfoe+HQUagCtLWVjPseGUfj2Bn3/MvrWy6V4x47nj8cHbhBWJRVlpf9yYHr+pZtp+tdLWDbguUyPTrUjuMsbrdhEBiHBqx3u6yvLzeeOxlP8f0zp67rtJJ/fH33wUeJMvaX3737H/+nvx4OJ//ym39BWPu+mzd5lu56vR5zXQjxYDCudf/qfHV3ezPpJaLaJJb8/Mnxy+fvTCWYl/iWjw2puOjqSnU1MJ0nXYhk1RR3q3kCBoaArpQAaoyhHfm///U/u4x+/xPx+P6ZJScB8FqxXK6Xq807x3GwVNXNZuJETVFKW69Wc8dxHn365PDhPezQuq4JIbF/iAi2bXc2nxdFdvrg7MmzD4qiwES+evW6qTZKmY8//GgyPjicTne7XbkIRqPR3d1dW5eH/X5OMWPYBrKr6pvFYnRwyHmzWC2iOLGD8CRJgpQ7yNqsV1WdY6NPTo9byT/7yQ8W2abWYlNnqK22X5fD4eTw6IR4NNuumAVO7x8eHQy3m1Wv11stJcFWHA8Cx26q8t27y3yXO64FtPE8T2NmOTa1LURlUWR5WTDLisf9VnCMMSXMQLhZ57O79b4jsOACMlsBenu3RNAEnt9WpQdsii0LWllWcKHDUaIFrsoKE4swC1m2hnbDjVQSQiiV0Qb6XmikoJhIDgfBcNKbYAzjOEak+82v/8vh4eEnn3wyOnu6We+Ok+lmszEEIaiffXBfSnl+9z4zHA8GhWUvinw4dFgcEaH90Zh3avbuUhlYtqooapA3rtvVTbXbbaI4OL1//+NPnlZVk2X5xdWNVNf7xQGhaLNZtm3G2wKAllGDiVZCa6mbNteWZRiDEAJtbJtYlmNbZjgYUGoTbBvtSwE4V1pxlxGH1haCdhy1ojKyWy8WvuNAhHebXVXV0+lUKbVeL5nLAAFlm/fCST8a7dubDscn2+12sVgUuzryelVVIU1PDo4kl7Hfr8K2TBvLxRBiwRWvhRQaQEw04ML4QWKARJhSpA9Pzp598DBOgigKVrN2u9z2wh4hNA76948e+n788vkb8vTZY98Lu66BCFRVcXd3FwaxbScIYQihlJIxajEn8CFlGKHKnva57BDS0gBUGwEboUuMgTKlF8RBAJnd+UrH1Jamq6pd1RIhhOt4EGKEiNJKd6Kqag2QUaprRUEqpRSl1LIpxsAYoQGA2GEMM0agBITRIPK1NKRhigsNASIMYoII9jzv4MGZ4EoDKDVIs3y+2JRNLYAeDwcGKMsiXVfZ/vGwH0GKpVbUcmzbEVxajk0YoxTHcei49Ne//se3754ThHbpqiyyJImODw9ubm7WKWOEvG0uob68f3Ty7NEzRqI4otvtNt2upcoIiW3f0Y0la4wQHY/9oswwxh999JGS3X/6T/+pFyd//dd/FYYhIUwbWOSt0sAPE4ycP/z+nyrFgHTbEjX5Li8rZrsOjrBidaEJBBhhghFjFtK667pZtvKHQ4Sbqlje3qRd8/Szz561zVCKWnDeCyOo4d3N7OL8/SiZVFXdi/oWJd/79KPr60sh7N///rdPnj6cjIar7eyff/O72Wz22Y8+tVigBeE1Wtzt2rYG2lGiQ4ZZzLdtz6JOGCWHxyfM19Qzx/FRVdeu03DFk7DnOCix3OFweDefffLJJz//+Z+FYbjarH//xR9/8rMfjycT13UZY/u0rux4vkupTZL+wCKO6MTNzSwrUmnkYNCbTPvj8YHiar1cS67KrFIS5mnRdM29e6PQH7aNYoCMR8e2E6w2y5PTB3mel2XpWp7jOJ4XFGnWVKWdTDzPWy8LCnGtlZSSSx6G4dHxgePZgOJG8KYp86aq6tr1qEt4EgwD38UYjscD33dev/7y229+a9tN3S3v3zt6+PBxmQvfS5DBq7vbJEw835oeTi7Oo+ff3ixnd8Ao3nbHB4dVVTV5iRF0mHUyPXRd13Ecgi0IYW8wrHjresHr168VBMy1dtt0W2TbXZYkycOHD1er1TfffLPdbp88fui6dp5nWiqpOgB1nqfb9cL3/aQXJr0AV0AbKUQDgMIY5WXGOxGG8cH4kBA739VCdJjGp2f3edv1hoOXz7+9uHjPOf84+dhyfIfqvTd2uVwmSbJYLPabAgjh69evlVKHh4cHBwdRFGmtPc/rUGdMVeRVXdaUUteytdZpmmIEbCcej8cWw8Ao12JCyJcvX263W0rp0dHxwdHRcDhcrrdIyNFo9PDxk11apllmAIyTUGrQdV29rSEwvuvMbm8oxW3bKi7qurYtC0IIALAdp67rtqp2u93aGMG5kKZpmpevvh0Oh48ePLx/fO/924tvvvrGdZ3Do+l0fBD78W63k1gfjg4DJ3j75ma73VRVgaBQggshqroVSnZCWgACgAxAnud5oSu1aGV9t7g7vndy/8GZ7Xt5U2x3WdWUQouTe8fb1ZLztkzXaXqw3viu7wjZuVYvciMAgAIQAOC5QRhHlmW/ePUGYsKFKYuWS0GYFRCbMbZZbDAlBwfuZDLplN5fDY0xh4eHTdNWRSmEGgwGnuftdrvnz58PfasoMmNEGPpRHIShK6Usq8zx3CgKbIvWTd7suIHakRwhBI2rtXRcywAXACA4z/O8apoPnn5wN5/d3M3rugUQV1WxWS8Jhq7nGGMCz22aqipzm5Lac6QSURQtZneia1zbuZndaSF7/diyrLyofR2EjLquO8TEcmwuxD5n7jjOPghT5oUQYu9W9/ohY8x1XNG1TV1iiIDWge9rBfYisevZjDENkOM4COLhIJJSOo5rWdZ2vVsul0kYPX3ypN9PPNuBQBmg8nRXN1WabiPfk4B88OwjxlielQBA1/Wapun3B5vNDmPMmC24qsoGQTIcjMfjcV1si7zGiIVRn1JL8M4LAgDwdHK0TXdVVUnJ27bFlAFIOZcXFxdV1WzTLM/zTkitAMAAIoOh1ppDKCyqEUQEQYgwxtRCDsEEGGQMMEYrpThvtdZv371EkCFEgSFGI2MwggQh1Cmr67q2Y1IDIbQQnRAdRMSyLG1MVdW27VDKCLbbRqa7enX3No5jjHFVVUqpXq/nOE4YhrPZzPM8QkiWZfu4suu6VVVpDZSUbdu1bQcMIkTv2185b4ej5Nmzp0nP93zq+ayqCs63TY0vL27zvHj08JnjeJeX10rebLc7MpvdPXkSLFd3u23WdSqOkg8+eJbu8rKsMd7L3QhCwpjtui6CDNJR1zWYGK7aat5synWpWtsKT+8/CcK+Y3t5niOcWxaFotNys97iuq5P75/sshIoiQkiBBPCxuOJMZpiSCnGGAOoEcYGIGopKSXCDDmI1KblHTIUYAS0BhAbbAimxPa8qLd3WhmGMVY2tSzbi4fjeHrQtBwA4AUuQqCpi4qXUejZDKVluS3Leydn49G0KKpOSDcAWuujo4Pj44O82KS7+b3To15/StCkP4h+9IPPv/jii/Y6dCy7yqvb61nqZukm7xoBDGIkoqgz3O4qqKVu65YAP+lH17Pzf/2vfyGl3G22F+/nD84enxwdG03yrMuydRglUtcHR0ee0xsOjoqMr/POskLXcduuk5Q5zFE1SIuNR1wEtJSi7TpNgGvbvue4jmWHwpj2yePB08f3T0/6WpSiLaFRRkCgPCkUb6SFbAIpBjjdZpxnk1G8Wly/f/vGpsx3vMCNGGO3V6um5k+ffWx7rNY6tIdYBi7zi92KNxi0tCpkuisFI0IIajFluqas7cjuhPaisMo4ZEaILltX3//B5/1R76NPPpFS/of/+Ld7YfzXv/71j370g4ePHzFCLEYhhIRiLrrv3r178hj14ilGTlOLzTIP/PXybh35/qg3CZ3gLTxva0mJM+oNkbGVNsenJ+PpSCi+TlfbdDPfzLbpdjxWQovRcDIZTpRSBGEKQVnWt9c3DrPevn6Tp9nJweF0PAQAvL88tyxq2bjsKs4byqhr6bouV4t3b7F59sSeju45lqcVdoE9nh4I9cFvf/t37y9n2Y5H/r3kUe9g+uD6av3m1T//4Y//7Re/+MWD+2fUJlWdr+aL0PPjIAx8DyrFudA1T5IkGfR7vZ7v+244zvLdrsgvZrcawJvbmZ8ED44OVnnGGLMs6+OPP3706NGXX3755s0bx3F26Wq7WSCDCMIY4LZu6qaoi9L37cl0EIbBq7cvFqu1ZTNmU6W7ljdlVTObERsiCKqmgKCL9XA2nwOADg6ODo9O3r55lWVZx9V2V56MBwCAOI73IZr1er0nMO7JPK9evXIc5+zsLI7juq7rugYG+W4AABCdIAhBCClGUnSbzUoLbluMEPTo7IGU3AB1eXk1HA7PLy7eX15ND4+UNPPV8ujk3ocffrhYrZerdSfUeHIQx8lyvXr17vz88iJyw8lk0rWt1rpta2w7SRzXdWlZ9OpqtZjP6rKyLItQkm13UnEIYRR7u/PFSvLj6fj89Zuvv/5yu92enJwgaUbRsBcM66yjgAFD1qscYTMa9+KeQ7CpqmK9WO/SEjELMVRzXq/WECHbs93AhlBJqaeHkwePzo5Pj2vRFF2qdMtFVba50n2IwaPHp1fn795dvnn96rsPnz6DQP/g6Yeu6+6yNMtyPwj8KLaYE0ThLm2UJk3bCgObTgJsO57NGBsDj0vhOA5ESEr5/Pnzt+fvMcabbZrnhWPZxphXr14Bg85OTx89euRjaVk0jL04CqLAxxg2Vfn8+XNK4XAUx/2krJpdlvseJdRgDJpOi65BxmAM67Labre73Wa1WQ/H4zAMH56dNZ3IsuzmdtZ1XRyHQEJjjG3bGAGgpB26lNLlcjlI4r27sJdEXdO2bet5HkBw74ljjEGE9u0D+zIC5tiEEMVlURS77RYh5Fg2IWC73SKEQGwwxnEch36geGcxdnV5AyH0/RBCuFqtACK9QT8MIkGhbTuMMclFURRlllOI8jy3KYl9v+0a17YwQchI0VUAem3Z7Zf6t1d3jDFgUFEUAIDAieq6Ttd5mqbbbdp1nTEGGfLw4ZlSKkCu62rOZcu1ZbkQ4JZ3WgOtAZdKA2gxFwJSFk3Hy7pr67puO641MBBiBJGBXElKDKOMUQCg4kpCKYwxGiOllDESAA0AgBAKISBsMaYQCAAQMAQhTAij1KaUNkXTdDlokQYYIQagMkZJqRzHKatmvdpKARhjBsHValUUmWv5x8fHQRBUVYUQsizHcTzH6Uajie/7Qoj5fF4UlWU5w+HYtouuZVKqpuksxvfAZqVU27aUYkppEAS9pIew6dqmKBrLoqtl4dj+aHj48OHjPCtubuYIEs/ziW3bCCHXdZqmcV0yHg+NEXmx7ToBoW+MllL8dzwgglSQiLCw1w8AFLuaX8xXIGt8T3z2ed/3IqWgNELyrgNKG+E6zmJX77L0WB7n+RYhZFnUtS0AMaHYYsRxbGYRCI0WUipujNGm7HiHkXaYTxgErVGSa4OVNgAjiBjCDFNCCKWOg5mjiNJK11wI2EBsWbZLbQcgxBizbCwMR8wK4ljwpsg2BqPDw+PheAIA2ntrAdSe71IChoMQgNJ30L3TqW0h32WjkfvxhyfkZIQQuXx3vd5cpPndNy/rthST4fHB9Pj4+JhaTGqwWa0BghYmkecTgnrjIaXUZpboOMNsPBoxaj9//vIPf/gjgPiXf/XXrhNXJU/i0b17Z+s3t3Ec+V7Qtq2NUNu2dZnVRdYfJMYoz0O25WEMLJv2evGwnyA35bwdjUaPHj5gDGfbmVbCtu2u7kpQYUCDIDo6xJblAA2ztFBGNk3z4OzeH37/27/5m7+ZTA4IYif37/fCKVAaG7+ppCx54E2aqivLImsw7zzY4C2o13Zmj0Pbc10V1NLM59eLbOsGzvFxf+RTDEhWpJh5Z4/OmMMwJYvFLMt2kPSqqpgt7p48eUQQcl0nbH1KKaKkaaqNAIRYUdA7GE+n48PlcnVxcdN2tR+4JyeH/d5YHIN0XURBcnBwPO4fVBJgjBmNHBe8e3/9q1/94+38Jur5xhilhG87jLGqKDHGdV5s1+uDwUkQevtMqdSKMCaVdIgNkMEYi64jSDsuJhIb47gu3S43b8wrgp0njxxKvbJqe4PB2YOjw+ODf/rHX60Wy3/4uy90G6uz0HN6zx59+P/61R8uL98lse+4NIqCbLOu61o23cn0yLYdBJBRQHIlG2EEdKjneL6C6PJutlyt13laNm0lOub7TdO5njccWsPhcLmcv3z5sus6y7IWi7mWyrUcz3ExhBiT8XgIRz3btn3fowxWdbHdbQaD2A1o13WOb0ktIVJFlSuJs7JwWSCNBBi9fXV+fn7xw89/8P3Pf3x9dZHneb/fF6Lal2GGYbgviNvLCYyxvWFKCAEAwBhrrbfbbaO6OI4dx9FCdV1ntAx81xhTFfluu1FKQIPG43tNVUsp12Qznh7WXBRFAQwySNuuxzt5eXnZdLyu664VSzgry7IsS941QMvrq4t+L55MRlrIy/P3CINHDx56nvPi5fP5fO5YtoF6sZorITnnZ2dnUlQnR1NGIW9aoOXbly82i/XpyT0G6Wa+fcvePHz8aNgbKKDTbVY1dQNbP8SeN7Qslue5UNxab9w49GJ7drdOs51lWZ3mRZ25gd0fRH/5i19oYHblLi8zBZoosbHVkaJrmy0lfDQYBv6ji/P3l1dXfmT7rmdTx3eC2d1yt87jaOBQr+k62sjp9IhZbpoXlDhNm7dcQ2y45FQZzvl2uxVS7na7LMtI01qWRQjZbrdK6DAMgTaCqzSO+/1+0guMMRTDMAwoQcNewqxpUabL5dKy7SBwxtNBUVSuHxZV6bpumuEsy5TRRolO8aZiTde+ff3u9mZ2/+GDwWgYhmEY+vtCDUpgEvlt27quFXqWEgenJ/cC1y3yXV3Xk+mIYeI4zoMHDxzHUUJijNFy3ev1/DAUUioAHc8llGJMIcFa6zIrhBBAGwhhHEZBECkKlstlURTQ6F4SIYTWu11VllqB8Xj84MEjqcC7d++FMgihtm13aZUkSV1W8/kSKP3kyZMoDEXbvHzxvGur9Wrm+W6V7yAySnAI1HK+autOKZVlGQSYMbZvWYxjxlsBDaLY6id9SimldDqdOo5/c3PTdAIAsNnsyrJCGGsNuq4zEGBKPBpYjrf/IULp9XIhpRRSAgARJdSilFKMIQSIEGQxAIEyquNCAw0RMELu6x8VxpAygvckMaMAgAbsjekSQAKgAshowIUEXFRSaA2wbfsASi6asuJN3RVl03VitdpJKZuOp2maZVkvjvI8Hw6H+yTkZrPRWhdFcXR0tCc37x99QggIoW3bgW8bY5Q0xhiEiDGmqqqiKJQSWoN0lwMAwL4xrG2SxAYKffj049FoTCltyy4OfNt299A/+vr1m4ODg3sn9znne5dWHPcIpnWTb7epbblRlDDGuq5br9ezZeoHthtOe32P2bOyflNVlVD8y2/eDvrjwIu1tqidSN51XDIWDwauMcYL3KarDVB1XVV1rrXUkruuEwSe61iUYoQQgMYA0/KmaSoIIaM2sbGjbCWA6gDxLKWgVsAgrA1QStWiawsRDiMDtdLKSE2RwZQiiACCTddCbEulMaYAo7ptlDLD4chx/cCPgtCzHcfyrKar0836/cW7Mt9MRv0iX89vO4L1YBh/82VFMXJgDQRQZGcFRZVtF9fvm1LZPn4Qnwz6Ewjx7G4BgcAEKVWV2Xp6OJnd3O2Jtp7jZ9tMSSihOTw4+fabV989f/k//00MAbq5vWWMHR8f1kBJKYXIGeahzYluE588PbuvlFC66497jx7dDyMvL3dCdp7nAaaM8QHQ795+KaWeTg+m4wMtdFV2UhhqW1HoK0GKvEIYD0Y9zydXV1cHB8c//1d/9vjpE6MxZW7dyidPP6ma3PWSXb6RhoRufPv25YvXL7jmFFLUwoJInyTHB/d8328Nn9+sb2bb2+XtoycPlWEHk2mWrrbb7aT30PHsw+OD8/Pzoq7OHp3tY9+2xTBGGGOXWMJ3McaEUpuSa4hFK4SQ/WTw+fc+dxzn4uq8btLVYu25VuB6cRCp1nRdVxclwbZjB2VZNnXnRw7nYrfLhJDDwbjMy6JMjRRKKd7WSRRDCBmCSRQCrQb95OHZg6aq/vjHL13X/Zv/+X/TNCXGuOGNVA0Qsi1KDJSNQcH1119+dXV52/yi+/5nP4z7fttyYcCTp9+LwsHt5fV//P/8x826fP/mP5+dPvIcazToNW2VpqlFWa/X2yw36Wa7StM0L8MwJpQ0TTtb7q7vNtHN6t79U3ddHp4cK0gs27+aXQdhPN8sXr15hymq2sb3/cvLy9VqlW13R9NpnhfJMMnTbO//11ozhl3XhUbVdf3ll186Lu26jhBSliW1ieu6DDs2cwi2mqrmHWCY2LathLSw3TTNd998y+v23/27f9fr9bq6iYOwyZq6rs/Pzz/99NOmaSilVVXtdru9VTaKooODgyRJuq7bt0G2BccAi1ZorTFEjJAoioCWUIk0TSnGAOg4TGzmYIiAhpbnP376gVJKawAxklLu0vzy8iqIItd2LMtSUvOusRgLA9+1LLs/mN3cOq5FMfniiy8sy/r4ww9Ho9G/3N40TUUpBghyKcoik1IqI3/xyz9vykYDVZcNxUhyEfqBRahRGmi1Wa1H4/74cLJczKu6OL53b5PNbc+GFBusqAfjUXgGz47OHtQNbP75j7v6CtsEUSRV0+uPvv/5p+Pj8atXL969fys1DyOXWMRxIISkabZpOmua3V/82Z/3+sH9s2ObWQihbZpjajUdr9tGSN1JIaXGmBjOwzDGxBZaAQ0RAKLr6qphGhoIOJdVXRtjRqPRnjrw7vyi1+u5tuN5wW6zVZYxxuR5HrqGc44h6LpWKcEYeTw5Ozs746LFhBBkxqOhbVtSqkWVRYFvO2S9adq2tS039P3IDwghQRAkvV5TVm92u+l0+vSDZ8+ePFhu1pTB0Pe07IAWmNLRsH/v9DjPdsYoA8x+/aGU+OyzT33f3242/X5/OJoQRoVWTds6fmC7jtK6qppk0K+qiuwLhBBumsayLMdxFAUAgK7rMAR7BaKu6yzLDg+ODw8P79+/33ElhCrrtm6bV+9fK4aLoujqbr1eH0ynx0dHo35vtV4u5rdVma8W8/ld17V1rx8dHx8Ggbfdbp8/fx4EQa/Xq6vWtu1er7c/QQkhURRpbeq6Rgh5njeZTPJKNp0WQvu+F8ba9T1CSN02XcsxxpDg/WnatSIvi6qqQAUhQhhjBQzEEACtjNRaAa0MwAYAZKSRAhhACUEYYqOAUQZgjBEllDIEodlng8E+zwahNkZILZUAAHSdJWXbcdV0UikjpW6aarncrJY7qYBlOZblVFVVNS2lVAhx8T7dbdO96VhrvR/rEUJGA6NBr9dDEGtltptd27ZKqfGojxBBNkIIWZa1b7/sum69XhpjICRSaISR0UyKrm1UEiUQwq5p8zQzWsZRoJQqix3Jdq1S2rZCALDWnDGGELBtwpi12Wzmi2vbciwbO26f82a9Xvz2t28pRUXZfvDhg6rRZS1221IIvP1vf3j86IPT0wf9ZOCF8Xa7Xu52TVtbHhyMEg2l41sYgrop8zwHRiMEpOFtZzpeYowtmzLGCIK2bQOALGoBALTWGGOMiADKYrYBGCECENHAcKG6ruukqLJKQ0AItajNLBczpiEyxtR1XVWN5Aoh1JTN3c1MSs7Yn3zdtuPsFRghRFlmdVGGYfjTH//k/N3z5eKGd6XLcJtnnueV5R8ty/O95NFHk7o0F++WN++Xm3qBHBP0XGBg2LluYO3BtHWdv3+f313fdJ0Y9ke9uB8EUZEV11e3jx8/ffDgQZpnCIHtbrVa3/X7/eEo3tbzbFdXohqN4uHwHgDAd73T0xNqo+12Qyx09ug0SvzZcnZ5dZGXWdasHceLo57nW7ttUdc1F2rQn9gOL/Imy6soSvrjMUIoHvY9zyuqeWfay7vLn/7Fz169easkPDi5d303++FPf7ZcL5jj47Zkjj0+PMjbohLN+3cLyaWoa0g6KSVCmlqEMpaXTZbzxar0k2K1LW4X67LIkAFGBlEvefD4wWw5q++ug8Cr6hJhGARBXRWr5dz1PaWUUgIh4NiMEczbpi4Ky7KePXsymo7evTu4W1xSipuqXixmvOHptkwC3Q+GTuQiRhzP0kYul/PtdkMIsizWtfV6nfZ6cT9JNqv13c1scXuXRPHBwUFTF5xzKUXHG601F8oFaLMr4jjkcn5zeSdEMxz1KKRQ6tX10o8eKaHP377bI60++d5nzHbKos3SKukdhN7g8t1dEve/+N0Xb7577gfu+5uLqqh7YS8Jk7u7+WKx9N3g/oMjYTBXqJOyVbBp9d3dTKi7Rd71JjtsWVwoYjvL7e743pHrBUILhHBZlhDCd+/elXn+9MkHH3744fn5+cFB/8V3z6u8QgATSByGjYFl3qzXq2+//XY6nXz4yTPP92fzOylALxnUuyawPYws3imojG87NqFd2ezKbRIGgzhaLWY3l++m02nsO7Kt4ji+vLz89ttvJ5MJQmhfobtYLJbL5b7a+ODgII7jN2/ecM6TJBmMJ8aY9XJBEHZDz/O8wHOKIsvyXdfUWgrOeVs3cRz7fhjHvS/fPQ+CAFNmpHQdP4hCP8iMAU3XRZFDCGt5ByE02oi2ybYbRmyEEMFwsZ13XfvDH/7g8PDw5vaKEDQcDgHQ221TFBnC6OnjZ9/7/mejg9Hz588N0dRCUksuO9tmTVNhAqM49ENPmfZ2/v7L519gis4+OBo6DqakbfNd0WkAmYdOk6PB4KSt4S4vrm5vFptl4LPDo9GTp2cff/L0+asXl7cXu2zjuFgCrHgtdYOIIkZx2XJRBIkdJ4dnD054J4UQxV0VmAjbhHpOp3leFlrrHhoWReG5QeA6GsBRL9Gd4Jzf5FVeVH4YAGD2wVHfYgaitm0/+eSTJ0+eeo779u35P/3DP2JMOOd3d3effvSviiKry6puO9G1VdVgjIfjkRBCKWUgCFyvqqqmaeuipIdQdHVbF1XZ2CM7Cn3XdSGmp8f3/TBoeVeWOQCatw3GyLWplt12syiKQkpJKcUYp9vNfH63Xa2Hw2FRlkqpwfi4Nxxk291iuWSWNegNpVaqbWzbjnp9Pwzmi8Xl5fVys1ZKyU7UdS2lNMY0TSOE2taZEGI4HEaB77m26DjGeK+gpGn6zTffNK1oWw4Q2Ww28/kcMJZu0n3gJcuy3/23f6EUC941VYmR3mxWu+0SIk2QSj562lRZke5ePf+u1+vRJ0+2223Xiel0Sim1LCf03SQK0jS9vbpaLBYY4/ntbcHx1dUFxng0HhKCNDCct5vNZnww5ZoDjiAiWhsu+J8eWY6jlOJKaqAQQpgihAEAyBgAEdB/+jDIAKQRRAgYAiEwxhgNlTKAawiNNoYxCwCwZxlBCI0G+4wPAMBxHK27XVZiZFFiI4SqqqjqmlDatsYYU5Z506i4Ry2LQQ3bli+X6z1YqG1bSqnv+zc3d9ttur9CLJfLqqr23gUhNMbKGCmEgLB0XcdxHMuyHjx4UNe167pKCwAQwYQSBYxVN3Vd10JwTCDnvCgyraXneeTTT36MEOh4s1wsMIbDUc9xrO1uTRlGWAPIm1bs0iXCxrYcy4YYo/ni7vlzlfRshGEQOnkBWt4gxohDFQQlb7FjIdsuOZ8vl64rp9Px1dW553lB6CECMAGWZfm+a1sMIcBFa6QwBmijhYYUMddhFmGc67JqLOqEngc8XFccEUQYpZRChIRWuAWoNS72EcQQEwOxUaopKy4Ul4IxUtcVMiByQ6naPM2ZhX3LsSyraSvbtdbrNbHJXsDp9/u2RRxmH0wOjRS8dcu8sShk2DKUl7xzAtfteXboKGBVHSja5mo+98JhEg7DZEwJ4U2bpqlW6uLi3e/+279oDX72kz+zqbdIl13Dbdu+vb1u2/p73/uorHbCVLPFRV4uqEXO7k03PquK+v7JvU8//mS/nOv1ekf3DrfpNi22GijJFUWUUUtJo4zEFPQGSa83XC7Si/Pb5TpLekeIEsRMpzpIWW80RAh1XZfl+eXt1eXt1W5XdMpc3t1YzL+ezRHBk8MDgVTZVcDGfuwRj45PxsPj/mCQLm9ud/N53/enR1M3cIlF/Ch0vNC2437/WEO7k+LqekWx8XzbQL3LtrZrYUr8MIAYUsYGg8Fw2JdSLhaLnoiVUlVVWZYVx/HR8WEcxYSitq0Fb7XsuKibuqIkQQg0VbFarKu8DtyAWRhjmFXbrmuk4mWdV3UGoCqyzXf54vhgOhr0JqOxqFti4Hq1ybe5Q+z7Ryec4sBzsu3u8ODen//5URwndcMhqCn2lSCbZUkxG/Rjx/F2q5xSHgeRVPrm5vpffv8b6rJHjz9gtgUhMQCVVdfrDZbLOdC86Xauqxzm7tbpxdurvFctF5uqEf0kiHoDjdg6rzfbDDHL88MGWfP1Ss9W7maz2GwhBq1smpbv8kwjKJS2LQoVlhrk67VjWaPxIAiCR48eRaF/eX6Tb+u2kQhI1/YhIMZAjK0w6B0dHZ+ePmx5Y1mW7dpR2IdVzogFIUZQY2QwtJBGmovAcT3LVvdPL9+f/9Pf/eqHn3//yZMnzCJt26ZpWhRFnueTycRxnOPj436//+LFC4zx3gzFOX///r0xJkkS2wkAALtdlsSh4zjQKCl519ZFunMch0O9mM/fvHnz/e//wHdch9lv35wnSTKZTAajoed5Qoi27TDGw+GQMdY0TbZL0zTlUtR1HYTe6nYzHA0sSoBWn3788Q8///z2+vIf/v7vq7b5yU9+FIZh2dTq9irpJX/2F3/2+eef/1//n/9+t94kUeK4roWY7dr9pD/o9xaLmeWQMLGhpRbbu1bniR9lfIWtDhHaqbxsCwWJlMghBFnw9PDe93746Ys3rxe/f9l30EcfPz48Gt3cnn/x7ReSdwYpBU3HS0IBNNwYHgaW6/iYksXydjo9xJgYqW5ubj0V3Kxn6+2qlW0jW9Fo3nV4RjmXgetSyhhjdDqNXXe93i5vb15eX48mY9f1jTGWZSFKpDaWZdV1fXV1ZZTmXN6/f/+DZx+Fvs85nx4ekNVS8LnRHGMKDNprhxAiz3M474SQdVFJIZTQCJGuy4xRBiiKEGOsLquiqm3brsuK2dZwOMQELpZzYxSEpusa6nm2RRVBWmsIdFUXbVfHSWjZFGHw8PGDp4+faA12eVG13dv3FzdXt3EvcQOfWda+g2avRd3e3oRhCJQpigIaMBqNMERZVriuCyEcDAYWJV1bp7tdURRKSoRQnuez2aLtJGO2gbjl3cHBwbYsq7KEELquu12tX373bVs3jm0lvaBrcwRVmm4di+RFCoB68eJ5lm8h0hBpypAfuOvNRXtRTiaTARu1bVmWadvWAEoAZVWXy9Vdye2u65hFlZG+G2ACq0pRB603M84lgNCybAhxy6WUGiMCMDZGGw2AAQZqA4wCAELgOpYxyiitlUHaQAClMkoqA7kxBkCjtdRaIwwgNABoKZQxBgAEIUSIQAiVNEopaluuaymZd+2WYOE6keM4xhjbxgjTrusApAhrAAHCknNuWcF/b3KSUlqWtcdpb7fb9Xq9V2sEl8yi+7kEQ2RZFoSwrPKmaQghvu/t3/Wcc611nufGGNf1m6YhpM2WN0oJxlgYuUqKMt9gAoeDkBxMj9++e/33f/93jJH7Z8eUkSjylFJVVVoWi+Moz/PNdqGUODo6GY37n3/f+eLLGkHJbNMf9IvqWEHe1N1kOp4c9imF22KDbURdakeO3sBttu6Pksuby9Ggb0CijVSqo8wyQGJCLYsSakuJCIJ7WMRumzuOAx3S1F3bdq7tJ4O+Y/sXF1cYE0wQItAgAKRRQAkttFEQQ2OUNloDDBGmhOz5x23d2A5J4pjzOvT8KPYpQdvdWmrhBwFXkkLq2W7T1K7tFeXum2++Gw6SyfiAQvPVF79ze5Hn+L3x8eXFzdXstq3nDPcCZxokw3TVfffqnedO2VnPcwIjzXqz2W1Sz/M450EQEcIIYcaYMAxRiCml33739WI5++Vf/WXZlEiKm9v3TVM9ePzgL37+Vzc3NzeXV4PecDo+cJizXq+7WuwWqe06oZvczu/W2aqVLe+A4lgZzYV68ep1VX6NkU2wy0X+xy++noyP+v3haBwwxoQB6WZdlNlisZhOe+E6AcT67sW3P/rhn2NkzzeLn/70zy6vrrb5DmAV9B1DwGI1X+1mcS+ejI9Wd0sppWVR27baruFSKEgMQE0rEbWrknuBvd2t4tgFDd9ut47j+L4fBAEhOE3To6Oj73/2aV3XTdMAoLXWe5AXNKprKtRBSmlV5Ntdend3u8u2y/nder3sD/wkcm3boRQTgi3Kuq7J04IzVFUVtUic+I+fPKi7FCJR10XTVldXV7vNtsqLfr8/nUx40/Z6g8Oj6Wq5GQx6GNHBYIAxOzo8Kct6s1p/9NGnGMLf/Pof16s50PD05GAyPLhZZoRhizFEEOfNaj0Pwtj3EgiYQ70gCD799NO//X+fB4HrO+bk+PD49OE//MM//P73Xz558ngyObh/+th1/bLqBNe3y/XV9SwZDs96E+bHYrndNSLPivdXl8f3jg7uHT5+/LiRLdfteruu2woRAjHebrdJFG02GwjwvZOTtuVV1eR5oYSsizrbFocHB7Lj08nBZDr+4IOnbmCvt+soihzPzvN01J9oqaQEWCsGjVaYQMowtSwn3e4OxiPR1t9981XoWgeTAYCmrLt9pH4PblJK3b9/fzwe720K8/n87du3Wuvr62uM8cXFxWKx6w96ts2ePnlkWUSJzmhXSukH7mgwnM+X2+32zZs3Tx897RKulIqSWBnNpaCUKqU2m03bduPxeLZYWJY1HA4ppU3TzGazpmkwxsPRoKqqruvCMHz27Nlsdvu3f/u3y+WyP+rvo19S8p///Ocff/zx0dHRr3/968VmQRANotBjbuiG2S6ljDienfTjvNh2krmU2S559tGD3rjHTaWqLGKx4yFNHIisvJLaiE62ButHTx/+8EeflcXu7PT4pz/9SVVt//Zv/zZtpG0zhDXPuVQ0TjyClWi7IHCrOq/z9Kuv/zCdTi2HZUX+xy9+/8Hx94rbq9ntnef5g9GQMtZ09e3d9ag/0kYajRlCNPAoBHVWiLq2bZsxtr/ttFJlZdF0nDE2X6zW641rO3HcWy6XbfPH0WBwcnLStLwsmu12ZzHqexaXcrfL6rp8++Z8ejA2xhBCN+sdZrTrOtFxRnEYeAAA13UppevVdrNLh4MxF7LlHcJAA6WhCUPXca2mqmLHiqJkvx3YL9dtyo6Pj/f+1sePH4dxdP7uoq7rOI5vb28vV5tHTx5T2yrK8v3Vdcu75Wp1ezv78c9+Oh6Pu7pVSlFMnjx5YlF2fX27yNb7LrG2royWFmVBEPSSJAoT27aVMtogKfXN3ZwBc3rv/t1qdXt7u9ls8jw3UmGI4jjuJSFva4zxcNCvqsxmGGOIEbq6fM+75uhwOhqNzu7fo5QCrXe73XQ8xphUZT6fAQhhHAWUoNVqJXhb19JAYCDQWtoO833P9ihzyMXFhQaCYGbblkFIKKU1oAyNozHnXcs7ITplpIYaIgOAaTmHRgFtINAQQaMRNMYYo7SCECIEIUR7ohREACGqlNAaaq0Q3OMRCYQGQbIvMTYG1DUAoIqj/n8vDRaiq2vFmKCUEEtggkQty2LnBx5jbG9BTZJk/y6+vLzcDwSO44QhZYzVdX1zfZtusziOPc9pmqYoM6VUWTqu667X6/3Nra5rpRSlxXa75ZzbsDVGYQK1GQyH/enBsK7LusnIV6//+esvvyr44nh4AHEzm63ndyKJ4iLP27bth24/dtbrDYQNxK3veZNT8SFK8qq4Xb+sTOyPw7E5efP2slTgar25uvxKStnvhQZwSrSEW6DFxfmb+/eOxuMx2wccgG7qajAYbNfLMittRi3LcimTUm6yDSU+MQExntHQIGP5sd/rM8uK2ni+WrRlbTnE820nsoDTNWrlxtPdNgs8r6saKbVF7DxNkyThbRUGVtM1eZlJLThGRw8ftW0rUA4AyLocM2NZRHS1SxCvq7v3N+UmJU+tX/7ylxDC3//hQph+1UaJTXqxebu61gJlxU64LjbuydEYacsA5XmOzdjV9YU0Tdj30zS1lPPo5Mnh4SFCSAlBbda2VZgMHzw8efvuxe9/9y+ffvrpu+dvZMEPR4ekJbVZnD4b3H86qvJqmV8nYWKHuCiq85u3hNFWtMvtarld5lVBLTKYDpevbtd32WA0/O6bl3lV/ujHPzaGC7F5P3v713/1P8b9seRScsUQXt0sFjezvvfgB9/7ya/+4R+sJEaJm5d1FEd2QstXm2/++DuM8YcffrC52yy3m2iUeMQDUA+G4+1sHfiHjj3JUxz4ngTGd5LdJuVGDA9GSEOsKdWeyLsrOQcuXqxmZ4fHR3Fvs1qktzdD36XYGJdeza6vFtdn906jnre4vZvPWiSw69kYd7/97X+uu6KqijCCy00teFY3fp6nxkBIyWx7i210e3vbH8QIIQjspmo8G33yyeMHj446Ib799tvvvntxd7ejBPai3ve//wMMAjucwE7PLm8JQI/unZ0cnwlpCESSi7/7+1/906///n/5X/4PxMfffff1cnN7kS5836Wesim1tA01HjnDRAV2iWDd+iH1lMI2Xd5uBofjgweH08MJsZiab7q2/vbb55PR8NGjZ/dOzr57/no+f6MVbgs+TCaiNsvz5epuHcFIbaQVjC3SCGlT4kyP7Kv5RZoW8TDK8lIjUtXCDwYQ0XdvL7ab9Ob2KluUQnSubZNA+yERbbVJb5N4jKmjhLVdyWLbMis2qr18f0cpYQaHYQy0qmUJKaEWFdoACAHR/jAWXYcYsV1/Nlt899W39+/fn62XURSdnJxADN68exVE3sXVOcQIEPP++j2m1m63u7udO55nU7uWdT8+AEqv5jtRf/fhR4/6g7Co8jBw752dtFV99vBUKP7HP3z97uqCaz2ZHIz7E9tmQRAYobO0aMuGEGxhMoxio0S+WT24f99j6Ordi67cGmPujz/gxP/q268+/Pij92/fv3j94m657A17kLLv3ryaTqeea//lv/kf4iD8zW9+85vf/Prk+NBxnPtHZ9CArqntkPo9R7B63c0LUTy896g37lcz2Rv0mGNf394E5mh7qzRgEPqIkggRqdH2avvsxMd96y/+/OfHx0dB6Hg979XNi4vNHQr9SrUMUtdmAtG8Bi5zGAvaCth0lG8WBebzm+Vkgq6vLiiB0hDKfIgsKTRB1KNWDZDhostybzBOgrgqW4hp4PaUuOUN0Fg0vGAOIrZlCaMBtqilAOz3fNf1KbNb1Y6OxwjiFou3s/cXt6s83Wne9mPfc2yjQFOVwzhYhl6+3TqOk253SS+aL9euF1DHv2f5B4PBq9dvJ8NBVVQ3Nzfa4IMjywn9MAy5qIsic2zquFRraduWBd226JIw6tqWt11Lqml/6FFaFMX9eydI8G//8Ns4jnfZwrbtzz44492plJIqfn17udlsAACru7lNcATVgW8XUG4swCihql2sbt++er7Jbge9PiYUgBJDPEmS0I+klB4FFjHQwlVVLXZLwneMki47T9wwZ8od+Eaq0XCIAAxcL8/zzXZ11Ot/8tFHNkLvLy+ePf50s6nu3XvWTwqIjEWJ6Frfpj/90afL5XI+n2PGLNdb5WtAWCtMWjbKcrZpRkhiuZ4CquKtZbFnT+57Ft3tVpPIfvn61SbLuQSAMG0BaONWSwM6AUUHOo0EhJAgCCGCRlFsKSUkF9oYgABAEGhgkAGIGaMAAABqCDVCAEGAIKp5tReQOtEZyQkhEGBlVAijqiw9x/UdYFtOuskf3Q+gIYpDAEgvCoGBsqs9yoBgDgm8Huy6bruper3QaCm5GJ/cu7q6sqgtOsE5BwBJYkSnESJx1MM24KZDEjLbspWXpnletEajqqq0Ep5vR1FggORN7fnO0cEIVE1ZllHsQ2iy9SwIXZdCYDoyu551bUsBqvPiIs83m9W+5LTX6xGCDYQIEz9OLMeJe4PheAQcvNguitV11my3VWi7ftspy2Uv3nx7cX01my0YI6NB4rk0CJ2iTE97E621AaKsdhgh13U9z/N9v+uaPUnKtm0MAcYYIGK7PsFB3fGmU5yLtuW3t7MsrbTW88XddrtWSvqBGwRO0osJQV0p3i3eB0GQ8txxvLatR6OoyKv5co0QIgRBCCmlbdV0dbO3bhlDtJZAAWggIQRDO8t2m80mK9IgdPuDeDiKsyxDRChTN53JspRZ5OmTR7PbVImmbsrD8bSfTM9OnmJg13Xd1p3FHKfnaK0pZangXdcRArSWSpmmEeWflDQPQLzZplqBn/30L376E9M0ze3t7eJug4HVi3qagSIt5uWCMXu/xvvuxfP3V++vbi5vFjeHxwc/+umPemEw6I/fn1+tN2kYJFEyWK8yY8z9+w/+8i9/aRGrbQQ0iDHbdcF0eug7QVGki9U6z3Nk21988UVZNT//s58nSdLr9Tjn2XYXRaHB5mJ+ra/A67evjCQutZmFwsiFQDd1QwlxAn88Hn/wwQfvrs6FUPfvP3QtuywyYLDrOkYARm3PDbxo4DnOd9999/bt27Onj6si3+12TdMgoHthHAQBNGCzTZeL9XC4Pj4++bu/+89VUyIMXNtr6267yizHVdLsdiljdRj0JpODrNhyJWnXhFoyx5ZaYEqTMDg8PoHE8oOLi4ur8cH0bj53mP35ZIywZTROkl4cDcqqpdRKkv42LaeTw1dvXr548frxswe9XvKP//Sfz8/faqHtyHGYXdetFtAJ3LCf9AaDMEwwolrrpmiMRmHQi5Lw5OgkiHwwznuj8b0HD30/sJhzu5x1smOOfXszBxjytjUap9n2cDpsGz6fz7XnSi2qqrib30Iqt+UaYxTGseBGaaMUhEbt0+cQAiXdN2/e9PrxwXTU64WebxOIJNe80+fn5zO2IJg9uH9mO7QuW621UiqIPEypQ5hlOwiRsmpAJ2zbbqpGCYmA6ff72WhwfXn58vVrx3GYa1NK4zg+nB5ooNu2BQCUZbnZbPr9PqaW47TAoK7jECKMUJnnEJp991IQBIQwAzpKrSSJRNu9e/f+wYMHwBDOOcZ4t9v4vu+6NgBgu91WVaW1rmuxXq9937cdliQJpfT4+PiTTz751a9+1TTNLbh5/OTJL375F4vN+ur6vD9KolF8eX1VtwW2hs8+fPLjH/848P3/+B//wz/9wz96nne3mj1+8NDy7LIouOZe4FGLFFURBH7cC0eDPjBGdbzK8qrM6zS9m99hjPrD3ngy5EIsFgsDcNybXl1dEOp4nnv//n1mIa4bSmmv11tVJXVdQohRWmtgWZbnOgRhybss3Smj5/Pl7e3daDqlxDo5PsWAGAiCJCbANIILoF3P46TbZDtvuRBSI0gD27Ftpz8YnD48W3y7wcgyGhsDMWKeaxNCEGEPo5hRG1MitdEaGGO4FF0rrs9nhBCl8G63E21J4PT0aHJ6elo31bt37wghR0dHYdIbjrP1ZjccDpFQuyzv9Xqe5/X6o6+fv6jruiiKycF0j/8jhOxXBnEcjgZ9ZNh6vTbGuK7ddc18PuddY9v2YNDPsqyu6yRJptPpZrnaK0Cff/7ZarXKsuzg4KDf71dVRSk1AHZdt9lslNG9Xo8Qkhfp7e11mm4BBHu3nW3bDrXCMHRsqyr1Pp27V5Fd143j2AsDy7Kw7U4GURgEFmW9KN5t0izLLt7VDcOBwxxK+lHYDgcUojLLm7KaTEdVUSol9m5/znld1w3nvmVpBSDEjDkGKVJ1kEDfdZbLbRKHEKPFbL6e371/9+Lp4weT0RBihBm1HNt1XcRsywBhEBdC8RxCQwgCmEEIjdFa632z9v7vApoAqAEAxmgAUNcpAxQABgCNMEAKYIwgUhhbABCtgRRAa220RggZA5umCYIIAhTHITC069R8Pt//Vzn/k1dx7/kAEHLOjVZxnPi+n6bpZDK5f//eZrPZ50ootRhjAAClzB4UTQipqsq27T3hd9+q1bZtWZau62pFADBt21KG4jg+OJwcHR1FFN/d3SgtiiLruFK646KWihNeVB5h2Pa6sq2qQoouSZLhcMQ593wPICIMgpRVrbiaz7mBs+1MAO4nHsQQYFCJAmFrcjhM+oPNOm1FTTGyPDIcx6f3D4FR6fWs67qqEXWTAQD6SW8Pq8rTTGuNKVXG8E4xhlzXH1qe6CjnHAAgVbXdzFerjRZSdBwhlGc7IToMjTHasZllWW1b+/0nP/vZzxAhvh+sV7u8bOuOL5brKA5c16WUGIDatrUsqx/3J5NRq9K6rrWRm01V143NcF3XLW8c39JANLzIys1mN8eUY9p1ot1uNp4bJnFvOS8ohpriw8PpMJliCLXS282GYHuQ9LQGN1fX8/kcq63WuqwwQgghQghBCGktgyD4/PMfCiHGk8Pjk3uWZe12mcHWPDuvU+kzwLBLsKzbyhjuee75+fkXX/xhuVm2vJFcxFFwcnDo+s790yeOHb2/vJjN5oobzws++uiTH/3oR7yT5+9uLEIPDw6URDfXs9ntrMzy09NRWTfT8YFE6N3llVRaK3Vzc4Mg5Jw3bY0JjPv9TvPZZrFaLKE2dDgah/3AsaAR0AiLwtGgdzO7Gw4Gs/Wy47zfH9ZFfX15Y5TyhqGUIB4M+vFg3B+eHp5sNyl12Xq5ent1kZdZMugxakMILcq0kPfvP5jP53e3cz8KHj9+JiV3HNt13f/6m18bkT56NGKRiyFVGgihwigpZdNst5uiWGUpV6KsKkxRmMRpmtddO5iMx5MDLU2el5hRP4rTNKtqcXAY+0Fclq3RmEtzfX1DiGVZ3ts3577vHR5OD8cnWiGt5cGzodbg9mquuD48O7r34H4c9jwrVMq0dUcI7PVGhNjEIlqgbF1D2ATD3vjeQZYVUnZfv3i+nC0W8w3Q2LMDtxf6dvDNN99J3gANXZcUbQGgNNAGUCMMLEq54rzqHGYJoQ2ExCYQGQiNbVHXtT/59EPLphhqbQSz/MlwBA3KsybbVavFYr64G/STvABtnUspLZtoCLSRmDDf9TEiXdfVFdeS9ntJvkuzXWqUsF1HiK6oSsd32k50/ythySJMS6WMhgYkUTyaTLK0SMLk4YPHxgCtwatXr15nL7XWhAKITNM0BkhmIWCg43hlVl5dXQ/6I8YYhqSqS0JIluV5nkII95VvQggIAcZ4s9kgDPbM9cGgd3h46Ps+Qujpxw8Hg+T7P/h8l6XnV5e2Z0f9ZLXdrFaL3qB/cnLSiOrVV99lxXYw6T18+PDwaDqdTsfD0XqF24phCynecdntdtskifI05byVdWMwgRgMvNCZRnVdXV5ePn/x9cHR4dnDxwCyu9na9SLbDt0gDKJRx6vtbCGEmEwmarOxLIsgJLlACNnM8f2QEbyYzaTUSTxs6pv1Nq+qpqxahJnteEKIIZkYwcuu8brWsploG0iJBIYbZTPb8l3XD+PxYHQw7d2OESJGg7oSUmhEsONQi5CqbGsoAIQAE9u2GbUJxhKDe/eOKUZFummKdNRPjo+njLHtdtt1nVLKsqyyLK9u7xouKLPzrDgYDDa71Lbttm21QQihg4OD4+Pjb777VgghZOP77nCQOC7FGGI8wgApJdqu7LqubkopJTDGspiUMt3tIDSTyWRvKi8Kvt2k+466zWYjjd5n7eI4juJ4uVw2Te14bhRFCKHz8+v3F+dFURwcDymx9rgFCjFERkpe1UVjAAAaUwsAEIbRcDj0w1BrTSzgUhN4nug41I2RBQGNTdTJdOgQcHf57u7isq6qNZtRSh1I97nZqiraui6yzEDIpXG9AGFLGqAMIIQgDYUQkGDPdR89nGy32/liJpoy9J2qbtO8cBznZjZfrbctF4AwCyBAKNRKig4jBCHEBEEDjDH7YUtrsC+k2A8NwECwb4DQGiFmjAFAQ2gQAghBjCDCQAEFAdJaG22M1kZTAAmCEBjU7w2k1CcnsGtl04iiKBzHEVxz3iolCGGUkn0qUGlplJZSWJallAqCgDF2/v5tVTaj0Ugpta/XUkruAUgIAQwwhLDrOtnJPUgbQtg1tRACI7Af1DxmHxwcPH788Ojo6Pbd1wZyTIztYEyp4xJtoBGaFGlGCLEJA1J6rus7/cF4lCRRVuTxoI8J0wghgle7dLnJWwGCvv346RNEnzRdc3F98fL1G8H1cHRkW4EGqteLLUqEqosyvb0Rbdf4Ggsh9w8Oo4Bt0boOlVKd4MZA03ZpVu52O4xpv993HCdPVb/fD/1gm5azxXJ2e4cMAEp7tiMbQRGBBgjeSq6IraEk+S7jTef6FsEsTHpN0yCMy7qCGERJGEWhlLytG4xAXRW7Ld5sbiEGhJAqL6BWOg7TIkeUnJ6d7dLV67cvmKXbroKI267RQpZFZTTBJrUps6jojw581+665uZyeXzwgFILGeNYrta6rpv5fOGx3HEcqToLOwgZjGEQB47jAYx++OMfE0K5UGlZybTgnLteFHSDppBbUPT6cRj2IMRN01R1gxj1woAUO5fAZNA7mh47lh26IQfeoD/FxDs5fvThx58cHp1UVXP5/vrbb79dLZaffPjRdHzStt3rV+fz2W2Z5eNx5DBHI7rJC0qp79s3NzeLm3kvDPJdapTGAMZRQJxjQMG7ywuoOdKSYCBF1dSU13y7htSxz9+/na3XWmvLdbpWbNa73a7QWjZvm1HSH3jJ3e1SVnw07DuWc3B0XLbV9Wx+dBR99tmnoR9oziEAom6rQiltyqp9+/b9YNDfrtbMcU2He8EYQjjsHSCC60o0XbtcrjBld9vNcrMqyxJiULfVNksJw4PBACG03W7H4+lf/Zt/8+//L/++F/eSfk8pdXO10IAyKyDMDWO3qur355ffffuiqouf/eRno1EfEyilOTo87Vr1u9//y9H3J5EXAgi7RgWRr5AWSmoICGGea3suJNjSAnHJ1/N8tVo5I4EgIYHrAPDw7CGy7H/+9X+rOk4QrbJm3B89fvi0qvNvvvlWS3VwcNA1wrIxc4jjMOYibTqetbvNNgwTbSCmzHEcAKWQrTFGG/nsgydZtlvMbze7tG4yZNRoMEmS6NGjM2QuMEabzSbLt8hITEDTlorDwI9cF0jJAYYQQiVkwdOmKC3KHIsS4viu0zZVWeZplgGAEEKKCwwgAmBvaDJKa63zNFvOV2GcKGUOpocPHz5WXJSblDFm2dRzGACAcymE4u1stVpVRTEYDIw2tm0P+4NvvvnOsqyjh0/m8zsI4XA47Lru4uJCKbk3om+2K8uy+v1+mqae5/3iF78oiqLlzWx9zdXT/jRMph/vspS69oOnp71e77uXL4qicAN7m27uVjMF1YeffvjRJx/tNtvr+W222yAAO9EiqEeTyWg6hlp1Tds0jUssKLSoeRzH3ihACHayfvP2eVZk06ODR4+fxb2B0rjr2roGUlvb7ebi4iLL0jAMqeu3bds2tWUT27KMgUIoipngyvcialPbDbK8urqeIWIzm9ieZ5rGCwPVtdl2V3YNpbTuWilVIziqyrLh1HGdIBRGZ3WZxOOu6/K82KR5WZYGIMdxLNdpO6G1ltoAhDzPC8OIMKq1xhq4jp3nueat5ztRFCmlVqvVPuSW7rI37y5evH4TJf2T09Oq4U2Wrbc7y3aFEJdXb6bT6dmDJ5brnJ6eCiHariQEea6lDc+y7ObmxqJss10qLlarFed8PB7bzKrrOs22ru0YYxaLxT5oBwC4ubkpiv/sed56vR5ORkEQbDabtm3r2QwTKGRHJQFAc86rOgNA9nqh74VG6bxIs+0O9TQAmhAKoRJcdl1nIUIpo9RWEu52RVN3Uq6LonBsuymLwPWgNjazfActZnNRuxAgyyg38nmWX63Wbdt+9ONPXZtRHDZN0wkVBIEXhELqoqo7ITmXUmrZ8aauHdd1AxdALHhDIDg+Ozs7PXYdq6yyr777Ls+zXZYrY5jrYos5FsMYSYEQpXutAmijlABAaw0gxvuCBmOgMWD/DUYZrQ2CFkB71BKAUGEEMYYIIWAkQghBACyq5J+4TQihOm+MgXleSqmMgZ4bXK5uMKbMI5xLpQHGECGK0D6gAR3Xy7LMcZyDg6nj2BcX7/O8DkM3zbZts09gAkoxIQwA0LatANwYI6WkiPq+73mBEKJAsOs6SqkBsm1bA+TGdS4v6W63q9LLoih83+1U23alRkxDxRxGGGO+7zuOBQBACFgUcyW32xRTAgymxI76g8FofFBX89UKIWQFwvYcKVuxW0FIlFB5Xjl2mRyNGbGQjZTo2qLBkjQYQqRtJ7AZoJQqabgUhDotF1XN9zYcCgmX7XqTZVmGzy+MMZKzDz744PBgulgt0zz3fT8JI8mFaFqCsEMZAqgpK6ANBkwbxIW8u7m9/8DSUt2/f+/t+TtmUwUUsUh/NOj1wvVynuXrLN387re/bspqs5kdHR8/evQIMmIMlFLt0hJhazAat7xZrBfguQCgsxgGQNoOnl9WDo2By549efJ186ofJxcX5+tFKVrYj4dJONytt9CAJExC3+vF0fL2CkNUVRXvpJRSGuN7oWVVXKoo7tme2+5yLgVXuhUdMMh1oqatpIaEuZZFs6pMy6LhTX/Q+96PfpBc9o0xR0cHCKHb21Vdy1waY4Bted/79IdPP/jo+mb223/56vnz5/PZcrNeBk4ceBFGcD6fd12HEOoazly76kot5cnhsQImXaeB47JebzwaNk3VtfV2vWKB43mOzUhZ5hiaYRKHQWAjIgGvyrzMC6P0mzevNCGHR0eb7WqTbahFyrxRWRNaTp5uZVmmjqe6+23VIoPqqjESdLW6ej8z+tZhlk3wYjavG/3w7MHx8fGrF2/Tdfnm1WtCSC+On37wAbXYsHc4m88vz6+X203Du+U6vVzN67ZBCPihZxAg1PJcLwiifYsM0LCt2tViCRW4d3xqEXp7Nz86OnH9gEvFCFutVhcXF2WV379//2c/+2m/n6zX6126sZlrURsDdvH+3cMHjweDQVPwNE3Pu7eRPxwlnUVdzw1tastOSqEptgyFGOLf/vG/tS1/9uwZUMBg5MX+YrPYlbvJaJIvdsS9d3Bv+NeDX1Y8v76+Tuu1pq4Tun5kG2SaquRNjTWwsUUBwRhgQgmAvBNVXRY5L3JapqllUdehUey3bX1x+VYrde/k4fRgjAyOo0HX8KIofIcZYHbpxgDmBD5AsG1b20a+53SVne1yTYwb+F1TbVbLIPTu3T8pitwQ6CCLUtqLk36/LyTPsmyf8OZtJzqhlNpttn/43R8/ePbhs2cf9vt9qXhgu2EYaMnTNIfQdLzO0u1nn30W+FEcx/tsS5qmGMMHD+5nbbuHwPT7/X0CM88z27b3YTCE0KNHj9J0q7X+1//6X19dXf3Xf/670/uHUexusrQ3HETQrzqOMBSSWxbjnC0W8++efztfzAe9PkLw9cvXq9Xqyy+/uL29dZh1cu/o8cNHTz54Nh7237873y6XFoX9OMIQ1XV9NDlobLbbbX3fffrsseUwxhDG4Oh4vFju8iKvshQguNlsZrPbsiwdzw5st20aDFASx67jyK6r8lpxLYRxA2+z2UgNN5vs3fnNn//Fz4MguLlZCyF812MYFWmmtMaUMMdu29xA0HRt15Z+GE0Rwhh3XQcAltI0TVeVTVm0BgKljFAmiEIAkNSKSymEyPPMQCiEIACEvpduVl1VhD5zGeqF3rjfm04O/ut/+fV6vZYalVUdJYOqbFabbH13I5Q+Or6X9Merr7/781/8JcLWP/3X/xrG0WAw8AO7LPMsy5TugsATQlRFen7+Ok/TNE0ppQBo13EIIb7vHx0dAQAWi8VqtXItmxBS1/W+pmi1WuVZ4TiO4zgYw07wfZd0lvNdumqaZrFYSMX9wGnbVgm5b0KilIRhwCjO8j2PFwK4l+tF02yaTrRtl6bnbd0MekkU+qenJ7Hvia5pyu1knBRpMZ8vKbWipI8BHCcJQBAD6FCrlKqpO8slnh8aCDfpChNLdrLjuuNSCAG1shgLfN8Y6+RgqsYjSvF6vSmKlFmk308wsRzPNxAQxigmNqOYMgyNAN0+qK+lMgZBCDHGECGlFIRQgz9lGYwx2ihjlBDdnpcAoEYIagKUMghp27b3oEaCbYGEEEoIBQGIooRSq6m7oiwZdfu9+O5ugYjte0HXiazI21YbYyjDCGNCEELIGEAIevjwrCiK29vbfj9ECCml/IAghDCi+2u5lFIpiSjar3gIIa7r+r7ftm1TlUKIvanSGEXIn+oaqqpyXB9TEkVBmu6KKjdtyyzi+QEZTiaWxRBCRktKKcVIFkXbSVE2ZcUdz9OAhkE/chMysrUGi+yqa5rVep5XqUui6eC0zt6v71JRXpV5aVsuUMYjfuLa2GiGMMX+/leEEEspmW1BCKs2r5rO8zzbJX4YB72qaNvtbpdlWeD0m7aumrpta9ezp6PheDSqi/LdqzdKmU5JoHXFWy0MQrJtW2N16W4dhZ8qzbN8+/zlt9S2IFGnj0+Svq9Ml+XrXbowQNVlVRbZMInHSX84GBBKJTQI0qrhbpBg5o0mRwqoTnAIjOdZXd05Sbic8UGCI3/4+NGHL7+5yrL8229eXF8sDyb3y3yXBKGQ9XbdMQI9n/Z7/vIGU2IbCQ0GSoGOC8c2Tdfq3W44KpnnWK4FKERSEoYNhLLFbhSEod8bDYTieocENcqg69XcdV07jBmhw+nJdrWZL5basGDUhxDGybAs6v/8q3949ebt2zcXUkpKrbaR8/kyCv3jo0NMYBB4jkVHo4lUqqg713a9KJ4vFl3b/tmPf3I8Hsu2nd/dcN4uVwtfhQAq17XLhYEKO8wxXLeqJRDZoXf/3vEq2/3qv/xdVYuoDdtF2bal59Msb+PIT3qe0l3XqQ4hwVuMcVU2juV/9OH3MLXKuqqKsjecGC6Xd29u5rff/+wH08nR9z76/Ksvvxz2JrPbeUt1uWuPjoeJ1+9iqSW+uZ5JoyAirVAYUcooNEQJoSXgrSjSOtWZyxwowe/++V8OR9Myr5iGvuUUVWMgzPN8tVrtabhpmu57b7/55quz05ODgwMMVdd1/PB48u/Gb9M/os5AqB3ENNdctfPtzZuvXmtFpuPpycmp5dgEIcoYJjCKojN6luflaDTinN/Mbr578e2L129kB1re+EEwOh6ykI5Oxo8/edDBer1ex5F/fHpweDRSst6uGwCAbVkYWZQwYtsIUwWU0cSzHWEAAGa5unnw4OzR41OM4Zu3r+6ubxixhoPJdNQ/PJxS4l2mF0qJMBw4LvN8xyDIbEosooWmGNm2qzthuBz0+hjjzWq5Wi/aLhiMBmF8ZFnUQ54QIs9zJSVvO9FxymgYhkDrqmkZs4u8apomy7Kbq+vlfNE0tZRdnqei64ToBoNer584ljsZHwAt1+v1w4dnaZpevH//ve9972d/8Rf/x//T//nu7kZK6brucDh8+vTpYjG/ubm5urrK8l2/36eUcs53u10URbe3t+luc3J8uJjfLZbL3W7HlRRGQQjXEFKLhb7//s07oMFPf/Dj4+Nji7Dn377o9XqyVe/fXDStdBz36RPWH0zCOFH6Kq851gAgx7VtCBijnjeIMAZFPYJIur41GvcgErt0KYTioqrqRhvYNJXSYs+zA9IYqWxmxVHk+35b1U1VQ4jqtnM6VZWt4/lFXS2WG22QNqhr2z/BqQiGEArOIYSj/oAYbFFWlvV6tYMG2cxZLFdFUeRZ03WdVoAxO4oItZjneZbjOJ5LKYUYSfMnLnKaZWWZIW3apkhXqzhwh8Oh7/sIQdd1Dw4OKKUQ4oOD6VADzCyljMUcx4ZIyL1QpLWOoujlq3e/+93vlNEffPDBcJTsdpvNekEoePr08aMHZ5ms54u77WrtOI7nOVWdaSVGo9Hx8eHB9GDPKXr9+rVRAAAURUkcx9PpFCG0WK2yLMuyDEIzPZzc3NwAoNM0Xa2WTdNIxRElQnYdVxgiCKFtW65rEwrqupzPb3zHhxB2UtWVEBI4to+pg5FFaACg0YB6fnR67+FoEC/uroTgN7fXWkjPtz549tF4PG0bqZTOygKFbtM0m+Xq6uY2GQxHk0PmOJDaBhEAudL7c5q4rht6bug6k8nJ/oVerubfPr+bL2YHB5OzZJiWFSZsH+RumqblneM4bdcwn0EIEQKQQAOgAQhjDI2BEGoFtFL7hIJSSgGFoJKS7yP3e5lBa7P/Yu9pgBACgJRSWgspJQTm8PA48CNKF3XV0siL46TX6zWd6iW9NM2LqhRCCGGUFsymEJm8KKLY7fUSynCe58aoKApub2ddpy0LEUKbphHCMIYmk8loOHFCd7PZLBaLuq4hhEqZvW+PEEIJUpprTS2Luq4bRZHv+7xeOY5/fHQ0GXeDwVgpoZS0bEoUQa3Rqm1FxymGlmUZoy3LYszebtI8q9pGZduiPxyHYWwAYDjkvM22XVl24+loFMMrs1wvlkj4g9700YOHnsMC35Zd/tvf/fpqfjEaGsZYFEvHcZhleZ6PMUZYNHXBhTYAWzYDCAVRBDFGhIyj8XDYHw6Trs07XgWJ3x8mvV50fXPRyrbtOqChodjxXcfxlNDz5W2Zb1er2bbIVrvt89cvIUVBHEnTvr9+W+bbPNsCKA4mfUaxw06nvYnlelEvURC1UikEBDeOHU6mJwbwpmnKYu1Ydhz1ynQjBTIKVIVWgohGC27qtraZkyTJ8eEYQQWg8j3a1K0UFaOW7eDDw3uj0QgA4Pk+QkganfR7bcvrpulk1/IGYWSUxgxZvoUQgiZQWluORTwGDeodDGlsA2gurq7SNLtdLquivpmtjYGe7QXx1PdpWVZKiTfv3lUNHw0nXavm80Ucx9ku3SN4XZdBaGyH3T89QQZWVS2FaOqubBez2UxwLjoeRRHDBAFDKVPAFNmukm2Rp3XZLu9Wl+51Zu1iJ+wnfYqoY9lHh9OTk6PFbsXbslSibjLk2tp0npeMRwmSwHRdXcr5/K6pm/VqhW0nSPrJcKQ10EIO40GR59PJujVyu90JoYbDsUM931HjAVRcrW43tuWtF9u4Pzg6Onn+5hUyUintMIcxBjBomqqoCs5rRGCZ5hije8cnnmvzukuCEHDt2U6b157nXV9fz+a3s9lMKbFbbxzXggb85p//yXPsf/tv/+2HHz0NfEcpVRY5IRFLntZFzbCDsd1JGdg+B+ZqfTu7W81u7pqqPXv4ABFY1IXWykDz9NHjqmqqqvJs59WrV19/85UXUovZg8Hg448/PX1wjwWWxCI57Fk3dkiin/78X4W+jwDfrIXr2hYjkgveyP3hQQjpRIstO4pdTAHXHSOjo6ODMPTzYidlB4Cp6uzy8r3sgMsijEWWZcYYQhFjzPV6Rfenvd5eyQQAMEIC3y3yXAjBKH306BEARiiZlZkpzMf3BoWUknPRdvuBwBhDLaaU8h3Xcj3Xqb+Pqet6z7/97nZ2d3R0sFqtuq5jBEHIPC84vXe/3+vd3d0uZrdd13z22WePHz8mGGIMX333Tdftb1SgqqrVatW27Wx2d3NzI4SglLZt+80337RtLaX8+uuv5/P54Wiihbx8e255frbZUtuK+wMG8Xy+WKyWp/fOvv/J93/02Q85513Dec2RQInfm/Qmo95kuV7xDiwX29l8IzjIy67rTFtWWi2G/YHoujy7wel8OOxNp5M0W1xeXRR1+fDx495ggjvjeY4ysGkFIci27bqumqbhAmBIMCZlUSONXMfxHF9rfXs722x2QmoHEW1g08rrq1nc7zBEBGGojeKizItd0/rEOjo8jMKQt+3ibnZ5eXP1/urq/ZUQcrVYCsUA1I5rUZtijPfuOebYeZlBpAhFjDAILUphWWdStYubOSUIKvX00elHH33g2bQtijAMCSHf+973pNSYOjezWdMp2/WCKLExbzoupG6aZjQapWl6e3t7cnIilAzD0LIsz/Pqyul4tfe7Jb0wTgKgVBDsTV0MQ0QIklJy3lqWEwQBpVRqKaXUWn/5xdd5Via9aDKZEIqbpjk/f2u71mg0EJKXdUkoCqhHSAAJdhwnTdv9RdEw5rgWADrNtrd3154V3LtHDZTv3l01jT4+Pg1jXBYVZp7lEsuJhCSbbYYQ6oSiFjs+Plyv113dNG25Wi2CIPr4e58wZn/3/m1eluPxWGoECKnrFhArjntFXVPLopRBiDAGtmUxSpVSVVlSi/iBH4QPXN+/uLio2/putuiEkgZ0gtd13XVNVJdhGErJAxru8c8YIYT+1G8HNUQI7QcFrYzWGkEFFDfGMEaMMQYoABDYpx4QgMhoI/eKGkYUY0wp3rtKgUFVVUupl8u1lKDrOoxo19UAAMZIFEUIgb3XRwPDeWdZpN/v+75/e3tbN2WchHVdS6ldF1NqYYxd1/H94PT09OOPPz47O/vim6/3DXB75x+E2PM8x3EYY7xruqpu25aLZokRRCZJEt+22lbXtWaWE0VjjGFR5py3BGBk2TYNfaM00BIaoKXEmI5Go7fmPE2zMiubslMc2NTBGLdCCKGqXZMVzXRsTYZHTx/xYVI8OH3kWr5j2bvNojVdVVbX727vbq+Xc2FZVq/X6/f7/WHP9xLLsi3LY8wt66KqZhpqIQRhxPU9TElgeXEcjidDKdrVet6JGlEwnAzvPzqb3c7X602Z1Q3vhAFcGyFUHAWL5ezv/+H/ty0yjSDz3eVutS23X30VlVWKtBwNkzDy+oMIGx1HQbUr67rWwPhxYlmWgrDrOCDw4YOnVZ1+983XZdHGfi+JB8UuFVyPhoe8M1Xe3lwvtQSW5Xz00UddqwIn7Hi9mF03dVdkZVNXcZzUTW4xj2Cbcw4hdRxXQ+04XtuJo+OD9Xab5jsvDILAC6Jw3wA2GhyneVo0hcLSi/zh4XhMpoiSweH03btzQq3dJt+udkpqywm5QF988cV6vekPRt98/WKXlT/56c8PD48+/viTr776Smudptu7OxiFzstX3x1OJx998LgoiqooMaJKyqypCKIaq9vb25/+8AcQQt/3D48PNNbXy9vNfJvnmVGozKsiq8OB3+8PJqOplDLLMtu2Hz9+6K68VbpuirLtSogkwmY8Hjx6fFbvimpXpPPNYjHHmGHLbvJqk1WtNMdHp0EUMEh9l3728Q8ff/wg3WwH/dHtxV2eV1/84auTw5P1ctXvDzfL9Juvnz/9+BkhzBhIqKU0WM9Xvu8Thuu6bERtWdRzHcbIZDIZJD2bWf7Y+btf/X3o+S515nez4Xjwhz/8oSiKIk8JQYyQiPnL+cKyqevaYehv16vFYnF4eNx1XbZLIVM2so5HJ1KC8/WlRvJwdIQVVe23RVnNF3dREgIEdsXOsu3+IMGQurbz5tXrDz/8kFLa68U/+MH/Po5j1/cPD482mw11CcCgNxloAphv/83f/O+ub95/+cXvZvNbZHS/FwMBtyLrOoUM0Fo3TWOgtDyPWRgKHSeOVPzy6v16vaiqKgg9JdW787dX7+dH09Ph4GB/4jZNU5SpZVGvP6y7VkrpMVcb2dRyz3juDF8ulxjD/nBQ1uViMTMI7jcF+9d9MBjgHSrL8uLiIk3T+w/OfvbTP3v06Ele1m3Ll8vVu7fvkyjWoFmtNbPIqD9o27Zt281mhxHy/eAfX7z2fOf169fDYf/zzz//zW9+/cUXfyyKYk98832/67o0TZumHg6Hp6enXLQAgHfv3g0GvclkMp/PJ5MJMTUE+G45ixKV19VHn3x6dHj07v3F65evmO04tl1mZa/XGyXjtVp/+YcvdaOWt8vNaht6oTFQdPLtm4vhYPoGvN9uVlqqumwQZIeHnu/HXd1c3Z2/fPmd0A0mCiE0X9xRizleEAQJZR61us1uV5SIUrr3fNWVCMNQdPx6tXYt++z+/eFwCAyKwuTt27fK6E6qqqnjJNlmaW84ci0bGUAQFk2dZ9lmvvSoNez1J8PR7Ha+H8rzpmjrzvP8XhTvSv6nmyVGGGPKGGMMUew4tjFGawUBopTZjkUpQQg+fvw48F3Psj754EmSJMvZTZPnTx6cnZ+fx3HMmH11My+Kyg9jz/O01gqoIAgMQNSyHz16lKZpnuc//elPn798wTlPU27bbDwel1WKEOKcD4fxw4cPs96urmujoW1bvOWr1UoIRRD2/VBrXZala7l7wP9kfPjtt99KxeNe74c/+sHJyclqtfB9X2vZNE1VF8YYz3MIQVxJrSVChFIKoAYUua67x0hgjPMiJYRIDReLxWqVY2RneXt7O+uP+/1+L+mNCZTbtFBa+DaZTKZ1lSulMoSEVjezG7/IHzx+hBBaLRauHzx9+vT43oPzq5vL2xtxeWP7/nhyQJjB1EIIaW0QQkrIqsgxYt26Awi6rgsxHk3GbdsqoDXU6H9dD+0lAYtghu22bfY9WJgQjMEerA4U0FoDA4AxYF+DBND+E2NsgNIaGaMBNAAYAAEAUAiutcaYYAtTShCyCGGO4+ynfMuytNZGQ0JIGIZF3VRVBQDo9eIwDIUQWZZlRSYEPzic7lvcbm5uXNcNguDd2/dR5GGMOZdd19m2TSkRQrx79+7m5qZo6vV6rZSKosjzPMZsQgjFKE1TwVsuGkKI59tJkozH49FoZGPr+vry3durtqshBFEUdLzpuoaEuEl8m4uKMGKMquv6H3/zj5blhEHU1KIqedfqwO+fHNyLrchxvHb3FiP16OREqcPlYtnvJ48PjtARMsYwZq6vX79/fy6lLMsSIDY5PFuuUtf1tQZS6rpsuoZHYZiudrxqBlG42ax9lyIbzxczgQDnHDKe79IbwHrR5Okpe/PmTb3DKPE/ePQRQ3jYC9+8edPVucVszksEsfa7i+tXY3z85NlHbhA3vMNMbYvt9e2LqOeudqvXl19azEt5c3J0enm5iWkIob54dXnvPnzw4MHtfHY4Olivl1Shl3/4tlyWk+hgEo94Dl06zpfVkyefX19eVYW8fH897g1CP+B150RRWzV1VWAL3jscXauuSBeU6OViJmsgZBFFUVl2LceMsbZZGWMK0kae+/Ll27tL9ctf/g+jZHhzdQOFbFsehz3WVgaCwA6FFuvlGhKsjAyD+Ec/PcSUvXnz5rtvX7w4f/0f/sv/N6YIQLhab0cHA2yjb1/97smTJ6UI8ubuJ3/+0bu3b3f5cruLXSe4eH+b/G8nl82b+CDcbDbHh4PubWrboH94jIGo6vzP//Jf/f3f/z11Qt/3GYlja9Ijt/WonozHWCPquIsyXZXZ4b1TR3W9g6E3iBevvrIsup3NPIg9A1UjnniTvrBkk0X9ITE4Lyri0IdPH80Wy5ev3nZ1Ve8ygtnNzaws6p/97GejIAx69vp6DpU8OZ5s1uOuy1uUa6eb7+bGF42+ZwdOmpcHR4cIIsxU2Wx/+MEP3rx5s1zcNYT0/fjs6KwXJ6enp77v1lX19OkHXdf1xsMkSd796nx2fiO0woQ4Tnh4ctR13eTQi+P4r375S9HxP/7x5cX5+x/+AFnQC+Ok2CGEEN8BxtjB8IBLvVzNijoHjOft+n50pEDTtF1/2GOM2bY926yur696w+GmyJJB8un3PxZCPHl6f7PepduVhdjiZn4wPRkE48cnH/7w+z/UatFU8zJdMgTjYGQhllYFEJAYTKEuykK2Vac5ofD4+EkY+uGgtR32+vWrNJ9tlpXjwGF/3HWcK/D+5m1eF3lexr3k7e1LIbvRaHhPVaPhNJme8lIT5FVtzbDHuwJ07d35qzzbPXr0aDZb3Du8v1hsbTaIRj292z09+mRVVBd3c+on8dRoK+CabYtOAgwhJMDotnx0OqaYbLalfd/abteiqRlGjkvLbP7y+W97vZ7tAttBL18+R+gjrUia8qZBQrQIQdu2mqZ+/fpVx5vhcNjrT/r9pKoqKSWlU0rx1dXFdDrN87yqCs65lnyz2j774MNHx4+rqmu3PLL6lu1t74qqqbWkcMTeXVxj5jgOyJv8+Ozo7NkpN7yo8oY3357/FmE4nU4Ph6PZbVvW6017dzQ9uP/w8PKfvrm+ekspnR5NVdt0FSTatZHvULvIUihbwLvdcq0qefj/Z+rPemTL0jNNbI17Hm02N5/dzxxzRkZmMskki1XVVLUECFBBQKOBBgTo50h3+gNqlErobgkQoOoGu1lJZg0ki8wx8kTEiXP8HJ/dbTbb87gmXVh2QXbtV+Zmttf6vvd9ns5B3x+XKp/P50TDlm0QiDqdjmM6D/fT6f2ccxAn+WBvEgQBJAQSd7WpCLCBwnWDsm3LmV3m+Ptvrg/6x6HZlY1oi6oTuI1tZlkmoSagCjvOfL5sBbcdRyjUtLVqUc1az/PSLN+d4bI4nT48lmUZmI7voCAwRoM+JWo2f1gtFnG0Gc2G+/uTm9ltsXlgQJR8DlmareXe/j6XkNXZ6cnTvGxm01lRtqambi6+swiZL2e9flfXdKVhy+3oBtlmq72+3fU8RzcxplmSlUWLdSNPMujg7SppC15VFeRgnayk4q5jWV7X9jv/+I//6fL6dtjvHR7uPz09wgQtVtssjX3H9n23bGqqa7pCs+Vi+1AMhj0EJVYKcoAVGHY7P/7yi+12W1Zbr9PHthBZrQ/xNltu1aJr0IyVl7fJaDh0c4iRW+dAN0LO0Hisv3zld3rhYrGABFWq+vbbb3/7q2//7M//9Nn5k7wquWqKOtqmiU7Jcnnx9NlL0SbL5co2XNXApCpd27mrr9M0F0LYtqtrJgLIspwwDAPDMwwDQDmdPr79/rv1/XL7sEEIdA+oME1ZW4TqAAAFEKIaJboALaJYo1gwCZhQUkkoheIY6wBISOCOjykVk1JKJSAhlBClFFAaJpQz1jbKtnRiGHXd1lxYjpfk2XQx7/fGWVlgTKNY2ZbpuY5SAkFZlUk3cP2gp+t6FEWYaAhTiMhwPIrjmOoaksJ3veFwaNt2UWTT+UPbtoZOs7RoiszpdqPtAgAAANrb23M9q6qQrwUHBwc/+fFPu93uw8ODpmmr+fv5ah0EgWY4jDEJ9LpplbJJUVS9Xi+wQojAdrueTqc7npqSINpmVcmfP/v4s0+/evr0RRIXl5eXxFOe7SGFpJQa1mzbdhxLKfX+/fvp/fTm5qooCtu2CcSmZhiG0Vas47lt2waO/ezpszRNL99euK6NpAgcT0PIcSwAOauqNIvbsnJ1WZd5gTTHsGzLGPW6rmVCJcLABUpoBPc6YRLFUAkoZVmVtWpOjs+//OFPXL9z8f7y7uG+qDPftwSvCTQDz5a8yuJoes8NDCCgGHDHcShETVm1dRN6/nA45Ly9v79/mE3ruvE9p2K8ZoJxWbZsvYhsy7+/f2zrxjHMl89fXL2/kkJ4bmhq5vXV7fXVnaE7QafveYFSMF2Xo9FI00he5jsvOCEIa1QI0TRVr99P0/zdu3d11eqm1bCWsUZKnuUpIpAFtgSirUqhZJxnrusSiN5+/+av//oXt3cPu05O1tSWZZmmfXR4Mtk/nM1mnMs8LaQEnhf88U9/Jpo22mwxpvv7hxBiCPDhwXHgd5qmSZJks4mqqur1em3Lqypar9dAQc7E7hdqOBwuo02vO2zLarOM8iTVNM1wXMf3PB4qpeI4Rkj2+70yi6sqoxpsWJsVuWGZYdDdxikhRNf1NE2jKCrLEkFyeGLGcbraLl+//mabrj86PRZCfPHFF3EcD0bDZy+e/7f/7f8Q9qzlcrlYLiWGf2SanvAGg55haIZhtLRQSg32+xIyosMyrwxD0ynpdDpAKt/2Pnv12dHe0dXVVWj6miTfv3lXlU2WFf3RDgJY7+9PfN/v9Xrr9fLnP//5fPaIAZzsDztBSA3sB0FVVYggRLBQqqqq1WZ98eGKakaWpdPpFGJKCIGY7FyLehcjqaCQeZzEcZznqRTi8X6qUSNaryzL9uxg3B8a2Bj1+rqm/epvf02wtj/Y71pdDRtAAJazjKUAgDAMvdCLku02iQRrl7Pp3V39xY8m3Y5/dnoMZX2BL/KshBA4rp1EranT45PDaJuleUII0Q2SprFpnneCoBOEBWwVEIw3CBFdpzFvCAWM13GyKcu0bFNClR9Ym+2y3xsKJa8uLuaL1YsXr372Z392d3f37vvv/+7v//bd2+8C3/VtK08SjPH08b4/Ojk8POz0O1fXF0WRO77TsnKx2myiCCGkGdb+0XHY7UMIP/n8szwv4r/5+ZMnT46Pj1er1Wq1Go2POp1Or9fbbFa6rmdZliQJIUgptcNIG3gnkKe2YWGM67omhO7v7z99/jxKsrquAYKj8cDzvLqqLt69ZU3V6/WOz44PDvcNS9vEm6vb9/P5rNPpSNYK3uqUIkPt2LQY49PT081mE8dxVTUQYt/3fd+3TbOpG53QFjMpBARAI/jgcPLk/Nk0evjmm28W09nkYLQ/3ut1+kIoyzSLLJdC2KYTuh7SdKkgYIpV9bsP1/t7I9e01+t1XVa+40pWT6fTftjZbDbr9ZpSSjStqiqi6fu9nsLWZrOp2qquayZF3TZcipbLLMssyxoMRp7tLNmSMVYVpRKSQC2O0zxNjw+PlJSLxaosMtYK1wkcxy/LGggBAeUMFEW1mm+++uqrum4tyyprBqCSUnLW1A03Hds0dEpxURQIy24v0AzKGHt39aEX9ka2HUcZF6DbdxzLbZpWSlkV5WKzZoxRShzP3WxW6/Vas0LHtbo9X9NAXZfrzXy9WTHW1G1TliWTAhIKCYYIcN4CgA6fnhRp1rA2dK0oy79+/W2v452enp2dna83Eab6k7PzTtg/OThYLDeCcaXEbsIPITRtK+x2mqJaJXNMiOt7nW736PDID8P1el1kRRzHUkrbdoFCZVmenZx+8cMvPlxf/d0v/4EAY7mYpslW1xCADCKua1pRJ4UqdoaFuq5ZK3Sq67rJOW+rOggCquHDw8PTk6M8T6+vr5fLeVI8NjVDeYkIpZQapml7FBOoGrWDJSjAGGtY2wIgqQaZbBFCACgpBBetUgJCiDGkFCOEOZeccyVhVdVAodpoM1j4fkjIVkrpOC7BmlJqNNpbrVaWZbVtu9lsbNtUSui6PhqNdNPbLUcQApRiIRjnLaXYMDQpedvWaRorJRBCnU6gaVqWpk3TwEJxzndGD13XHMf59NNP+/3+ZLJPKQUAvL+4/Ou//uvtdnu075dluVtR2bataVqv19N1nbiOv1pt2rZeb1ZFUXDenp2dVVUzm85fvnxJsKkU/sv/+X/6q7/6+Wg4+clPfprnMTEIYggqaCJzdvNoGEbTVJfv30+n0+VqbpqmrHmaxkKIjuN9/OLZ8fHJHzKWXOqI2H6XajhZbxtas6opBAdAIqkC2+14bpmL9Xw6re4ebm4N3S7LMk3W6xWdTEZlkRqUuLZhahQAuHswb/L1sD8e9seMyzKviizHGhj0u3E6w6ANPb3vT7abDW+UZ0KMYTHLHE3jLb9++1ay9uzpk8O9iYYJUBAoFHR7w8mEYihkQ6hWMVHX7OTkZDGdT6eLjuubnzlcys06EhzZE7/h2XYTG2ad1y0itNsbGJj1h/3ZbPb69Tdt24T9cDQajEYjCVTL2Wg0QmTz7u1Fy9inn35OKZ4+3u1A3KZteJ6FCazzvGHt0cFB1dTXlx9e//Z3bVV/8vHHjuMsluvZ5ZVt22mSX15cdgd9jejpJplOp57npZuke9IBRH+4ewyD7tMnTxDVbNvt9QYY0zzPbdvd7irgeZlnBee8bViel4RonucZBjWM9vbum6oUTVbIhlGIDEPleZkWeZezXr9zcDyBij99cvZ4e11EkanTpMjpemXbrusLhKnjuL3ByDTtQX+03sQCyIeHOwVR2WSAyrvZTZNv4zhGOrYNc7PZfPLp55j+D2Gnx7iM0gwv1rqlG1wbDHtciP6wJ8vy5Pj41SdP5ot7LppeL/BcK062Z0fH4/7gYDQZBL2OFZ4Mjzab6NvX32zXCQI4ikAY8rZm7958n2WpH7hJFve7naxMBqOebRlEBxVPERd9t1PxVkKQVcXD9DGvyrKooyQeDodcik0cOb7n+WFVFVEUrddrMyZCiCrNm6apqso2rfFg72B4eDA5+PDhStdNz/aQUPF6E63W71vZcRzf9wf9geoA0zQBABrSok2cZLHrWG7Hc1MbzWDdVggDWfGriwvfNnvdAJ4cx9E6T3MumWU5lNp5xqhOXN/aRvOySHv9wLYsSzeqqnp4eJA1MAaaYxpNWWRZ3Ok6na7/8HiZF5ugY/UHQZLmmqmCwGtZOV+uAFCM11fXF3sHe0fHk+nDzXz+kGeb/b29KjN4W+/v7w0Gvels1u93Xdc1DZtSure3LwSr6/by8tK2XcOwXNfdbrdJkpydPcEYf/LJJ3t7e7Zt39zc5Hl+eLRvWZZSyrbt3cq8LEsIVRAEAADP8wwqSVl7QWc4mhwdnViOF0d527J//MUvqqqCGPf7/adPz01NQwjmea4RhDGEUEElbdPSDdzWeV2WrmPpmOiEdgKfNVwI/vBwv1gsIGzqqiGYEogEQgjCpqqzJKWaAZRoilLD5OnpaZTkJtVdy3RyOukNsuWmH3Zcy765vtawphFKMNaIYZh26AR1y5M8e7i8VUrdP26QFKNeX7TMsx3LD5sy1SkN/YBivJwvoihCABqaRhA2NF0gyjlvygpC2CpRVbUECiF0fX0dBIGlG6P+4OXzF50gfLi/j+MYsUa0IovLRzjPo2yzXtdFfvXh9ujgtCl5XXDDsvfGR45jbaKtpmkYIo1QKaUSQgiBoDJNXUoJFbdt0zC0vEilgrZtU4qbqoEAV1Im6+16sdZ1s+t5huXoQuZ5WaVZnKcAgE4ntHRa8RrnacszhPXxXk/XYJJuAGSEIACo5ZiGYay325ZL0zAw0gDGg/5keHj0cHcvWD3sdVVdzR7uuWi73f7ZyWlVNhCT08Ojk0N8+vRZy4RS4Pdvfp/GCQAgCLyDo6PAsR+K2zhNN6tVJ/Br1iKqIQRWq81sNru5vhsMx+8vLi+vr03bOH/xTCd0bzz64x/9eLlZ3z8+cJZr1BC8lYBjAvMiyZvaMCxCCGNCcEUxFUJkWRZ6vm3bjDcQwm632+t1EEJB4P3mzYpzwdpGqpoQotdt2bQ7DaOumVTDGqRSCqA4EAAhBATDGCKEpQSMEaUwpVTTtB3ZTEqpJEIEYaRjTA3dZUxQonMG8rxCUC+KyjDawWAghYIAbaNNkiRScs5bjHG3FwJkllXORUsoohpumkZIRjWsgCB0t8zCUnHWCgAA480ObAUhBFACKHcUJkLQq1ev7u/v/+qv/pd37y52WKcdjL8o6Wg0chyn0+nsKB0QQgAhmd5Pb++uT06OFJNH+wfdblcpcXf3gBUiCK0WM8fuDLodywyiKP7lP/z96fHJql5G0abT6Ugp33z9bdu2jDV1XedZokNsINLmJSsq27YDy8mr9PHuJgzDuKj+l1//pWU5X375ZZqmDw93k/294bA7HPYsW4uTIMsSCJV7GgKF86zGSHOcgHPOeYuw2KxmirPpal6WZa8f+l7P0B1Ktdult5iv/t2//zsp1DaJm4ZhwZuy3B+Phch0JMbDXtfV8yR3TVDmKZWeSalO6Hz2+HhLjo+PO0GIEGpYreumbdvd7oCxBkJgaARAmq1SHduj4WG8LSDQOAcH+2dtpRbLbV3LPC+lQDVL87rVbY8r/GTydG88ztIizcs42SJKev0+1bWDgwMhZRAEAMH379/PlvPBcqbrOpAtodTQkKURA0MmmGoa0dSz25v3l5d/94+/vLm7O3/y7PNPPjZN+612gRoehuHXX3/9u9/9/tWrV8+ePaOIfnj3wdasy/dXH959sG3btexnz168fP4CAhwEnbpuGRMIESmgaVg7ocbDw3QwGJyePnVdd8dNe7iffvvt98t1DAQmAPqW01b17Pa2lSKus2DY8cPgj//4pwqwF0/O7iZ9xVrB2zdfXymCVtGWA0gNw0A0CDq93qDXF9s4XkfbD9cXB0dHDDT9vc4mivI6a0SdFEnYDb7+D998+aMf/+yf/un9/T01dAVAWVcIoYY3Qcev2/roeF8vm4OjseebXFRNmwHHdm27E/RCPxiEPcdwqrjQidlxe/mm4AU7Pz5ZbTZF9oc1+WI1v7i48EIbY+gFzni/HwSeFDyuYwtovuVyoBQGAsooTx8WU0q03rD/0tAAIo3gpu34QeB5Lsa4ZrZRlY5BTNMcj8eWZW232+n9dPGwqLP229989+7de84Fq1hd10pBpZSaSA/apWyAhZVSRbxmgld5hTEOw1DTdYNqoR8URbZY17KVBKAyKpq0xiEKnSD0Q02b7VbaSqn1enl19d73Q8c1Hx4Tta6fnp9BIKuiyLY5EtQ1HddwFOAKsF5vOBh1tHeQiXqvO/Q7NlNNw4u8iO/vHufLxatXH0swvr29z/P08PCQUNTthUqIKN5sWbtezNfruW0ZErgXH967ro0xHu/td7q9ljWff/HVp599uV4v1+v1b3/3+5ubm06n0x8OgiB48eKFUurt27dJkkAI7+/vd66aMPQppbvsJGPtLp8VhqFmINsJDMMwbDvNy02UbbZxFMWj0ShJksVi8fDwcPHu7fn56ZOzE9+17+9vbdvWCY23Gwyl7dmuZQWWRSQUbYOU7IedXbFi1jIhRBxFvBUIQ4KpoZuMsWgTXbTvjk/PVsvNxYdL1wlevfrY0ZPL69tvm7pqMw0hCpFvWoHjXsQXgkNKdd/xhIKeG+rUbMq8LZoqrZum0R0vS1KqoIaAbVpICKiApRmmph8/31/PF79cr5WQ/W6PEp3VjRE4BEOIFMZQB5RrHGGsGabneW3bZlk2mz70+/3Adx3jKWPs/vpKpxqlNE+zum5DNxSm29Q8iwvJQVNz1wlGfdf1fYItxtjj48z3fdtWCEDFmZCt55q6QaWCAEjPd3UNIYp8x+VKNk3j+KEAIM0LibAbdjgA6yimlCZ5KoEyHFtKKTGUCNq+N4LSpETXse2EgldpHBsmPpjsm6bJBK+qhgkVZxlGVClIqT4Y7XnDvsKItY2JgDC0E8PAQEVJlpeVEMqg9GBvQnTNNbUKMcOwXjx7fnV1RSB68uTJ4eHherl8f331/bu3nuOMLLtu2O3dg21aZdE2DcOYlmW1WHyvW+arj1+WefrLf7wtq6o76H70/Fkn8NIkWq23uq5DpGpeACJkJXcQvKpqgEK70UKaplmcrNdrQlFR5L/+VSolhxBKyQVXSkEI8I7EWNdtUTVKqd0iMvA8z3FN09SpprgAAPCi1jSCMeYcCsk4F1JiIYSum0pioBiCmq6bugYNw+r3B2XRMiYAgARrRVE1DTN0k2AaBMGut6WUSpLEMDTbMTnnQtUQAl3XhBCEYM53cAYgBCcEG4ah6xoAgP2hsAowxEoJXaeWZTDGNI1iApVSv/rVP75792693nLOHcfZZSNs2z48Odrf399sNmXTSoiSvNjRHglv+XYd/fEf/ZRSvDcZjcej77//XiNUcG5o9HD/wDTdqmxNww+DgBLt4vu3O4vlFz/4DAAwe3isqiIIgiBwDQ394f1VYtALe71OEATLFLUtA0D2+91+vz+fL+fzpW3bZdk+3M/qupaKHx8fhGG4m6K0batrVhAEEBDLcqSUUbQRQkyOJn7X+5u/+fl0Of/88x/0uuMkLlopDo7P76ery4tLAJDlmAAiBaGu60eH+4vFNZANhkC0TVPnlmbIthoMTkf9nuU6WZkLqRCEGiau67ZbZlILYCAFAhw5nu37vhRQZTCOioPJSR5XabS9urw/Oz5BWIOIzhcbzqUXhK4fPn/x8d7B/vdv3l5e31JDx5oeBEHVlhAjznmSppPTUyAlaxvDNsb74+nj/M2b7/b29ohGdR1SAhWr4/UiSaPbm5uqaebLVcOYBtS4Nwg8P4+TOE6bspICQkAw0gQHTcVkqzzL3x8daJhst9uvv/56MBj8i3/xL54+eWFa7mq1IhpfLdeaZrhOoBR0Xd91/cVicX//2OuOTk/OdV1fLtdF3rx79/4Xv/j3euA+PTsf9vo8r642l1mWCSURQnGSMCyCTgiRwJT0hwOd4Pvrq9H+hDFx9/g2LaqXz1+1Lc+ywg84Y9ww9DRPHd/BOmxAdTX9wEV7/OzzL89/dHxwmESpE/hv3198+aOvLt5f2lJhSiDBZV1ttxtdJwpSz7NKZK+WU8+2Bt1Oc3CQR6mukT//2Z9QpAMlWVWbtkcQrrICCfXFp1+0sHn79q1lEA6F71rPnp+XTfnp5588ff4UELlczhlrW1YrLPK2XGdraaBaNoyrVjEndAO/M5ns121TFnW330MIeUEHIVRVtevaGEPLxpxz3rbYcpuSXVxcrRZLwzAp0Yu0oJSWZZnnpWs7uq7fXF3/5j++7na7p6cnmKIPlxer7cp2bdPUmWh/+ctfUkM/Oj6wTTd0mFIKImTgoE7Y4nbNIWtyJTgu8root4buOr7HAcdEffnlZ6apZrP7XtfmbeU6umpFXeWX7y9c00FAWRpeR1vf9/f2J0mSLFZrBYjl+IblSCkdx9GTuCxLxtguPz+dTvv9/o9//ONos6nK/ORgf/74UJalbRlFQ5bLZZJEo9Go3+/7fnh/f08IOT050zWjE/Z//ZtfVVXT6XSqqoIQdvvD9Xr97t0727Z93//m299jjPM813W6yzY6jiME3Gw2u9S9H+x5ns8Y+/D+arFaE6LZlosxEXXNGIuibZZlSrRZsgm7Xds0Dg4mlmlKyTlnEEgoOGiYrJplMhNCtEXV7XaDICBEk4IhjCaTA00ziiIzdcvznbIskzStixJKuNlEt5fX3W7v5OCkyvNktVJNg3RICCmTjDF2dHTEOLi6vLm8ueUScC6UAoJJBLBvh03TGMSyAh9AWWZ53pSyLBEX+XatCXk/HJmUAiEpJrZuaLouABQtowRbpuHajmlZXEoIFaIa1bS6rrFuEEKSaDt9eCyznBDiOa5BqJSSIEwxhgpYtqVR2g173W6/KIrp4zzPS1xhzlSyTcum9Fw0GU16YUcKhaCSrHWD0FGqaVndNq5t+oGzK8ixsqSIzqarvb091+toWmuYFsFaLTmrGs4kNXRP13hTC8mrphaSEY1qGiEU+77L226ZpzuzK0RGkWZCKEqxZZlYI3XDMNYc18K6Zno2zEGWJBSos9PTUa9XZSkGyLIcTdMs29ZMI47TDxfv4iy1XF8jqNPpKAhmi/lsNkuKkgNlOM7k6JA1bRrHTEjDsEK3yyqxiMruoI8Qmj48rtazhjVSyvVqcbi///z86bfffnv54XpvfwIATLLCNE0XaJqmFUURRRFQiCBCCEvTNN5si6I4f3La7Xaur68Xi6Vpak3TOj0CIUSUUF2DECFEAFBSyvU6klKutHWv0w+CQKcaBhBC2O0OdxJtIURZ5m3bQoj/YHbgAKhKcCA4YK2EQDS1UBJNHxcQ0PF4sl5vHdsdDEZlWWqakSQJQigMwySJfN/3A7dt26xMNE3zA7ssS4SlbmCTUcYYhAohpQBrWQkhJBTohkEpTaOCUrLzkFGKNY0QohGKyiqP41hKbpp627a7PV2/3xsORpRoy8Uqy7LdHXIwGBBCyPHx6Xa71XWTsebu9qGqquVyaVlWr9eLoxhjPc9LoKjgsNPpKQW30fr1N18jhJ4+O8vz3HVtwyQvXz7jvF2uFlGUc966nn14NOp2O2VZtqz84Vc/LPImz6of/ehH33779vLDtWFYUoDb2/urqw+Xl97nX3x0eLSXFxkhqNcfatTASNtu0zZJdV2XEJm20xvuma529XBXMJYW9Xz1Li/qwO/AsmmUwqYpJZCISqkMyx6MxxBRiDSqI0p1waSluy+fvTBNW1RdCLDl2J7nrKIoTWNCqem4g97w+dMXQgiq4QaVvhV0nQBzrLVGmqajwQFv1PT+IY4icYRZqzy3E3YpgrhuWc2VZlmmZa+20dub91ESB6EnAWxq1rRMKJllWZEmhKDtdptlmR96m+12E611U+OsCsMQSIkAKPMk3qznDw9SgslwsH90ZLlhCwAHIMrym4dHxlhvOJJSWpYzHu7lafH6d68n473jyVGRZhQQR7eH/dGTs6e27SZJNl0sEaw6nU63q0kJGBNAYUO3XMfnXKZprhRcLNavX79u2/b9+w9p2k5GOAx9SvE6jynFH3/6yYtXz83QIbpWVmkcbTWKgFSakq1qV+sYm+7d9OZuOvNd/7CsonWcGHndtG3baqYRx9tnnzyrRW0FRlZXZ0/3D072f/iTHyCA//oX//7o7Pj199/983/6X5w9e75er03HdTx7upjePz5UTdm01XT5mGSr0Pcxl6JqTEyNIHRNCwHF28ZzLcPQmqZCAJq2HnRD27bTZpFnG4jb99dXcbLqjnpPnp7+s//iz3VbF4q7oVdWRV2XWZat18v4oRBd8gelvFKTo8NerwcAqvMMa7jn9ziXuk7rqk3TZHet32w2URQVRdXrDaJtMpsuLcsZDifLxcL1u7quW2bj2DUmMEmS+/v7Ue9MYGj67ngywo4+iDeGZRCCDFPbbDZKyOfPPnr+5HmZF1VRJknC66VuGXkZCQB8Z3B2jCEhZd3mRXM0mACplsvZp588+/iT592OMRwG0SznLXu8W5QpAwx4TlhnBQTy/MnJ2cnk/Oz5xcXFuw8fVuv8p3/8pweHZ0JBKZDj5NE2u3u4z7JcQVLXNW/avb29brcn/eDF848DN1itFr7rff32EhJMdR0RrdMb7B8czRabLMuipNAMpzcczVdLRMjTF88VglEaBZ3eDl2+6xEwxgzDOD4+DkN/PB67rgshzPM0TdNut9vpdI5PT5uazWazumWO4wV+BwCQJOn9/b1lWRSTfr/bH3R1XdcpFoKbpqnrVCnMW0UhwkoZlPiOTbFK07TOs4csXZmWbpplWVLdwJAYhjEYjHzfV0osF+uyKDqdznw6syzrcG9sGk6dZ9Fq2ZalFgQtbxvG0yz+5ptvLNsRCgsEECYNF0VRaUYtFQaKWJaDkYYUAISYGm3KahUnhIuO4wCltptNuolu0HWaJP2w47heVhaiZRjjNIqFELpGNUIgkIjYRNcwxju7t65ppmFDKZqmEhwLywjCcPrwyKrcNAwgZJpEtmkZGjE0EnieYGyTZQoC27aZ4BhgBJDrurZtm1mOEKAE9TqegvDhYdrURdPYDnWEknlalGWJEBICKInqul4t1oZmP//slRDqw8X7PM0UB/+51IcAlJxJwdpGNXULA9zp9Iosi+Pt4+NjFEUSCCWhYZKgFwBMsrzUNM2ytKQsGWOapknDElWFEXVsnyi0Wi7alidpGih5POjYgSOw2G63RSn29vY0Tbu5ufnbh7/dxbzC/iDOi6yqsQRCgKbmSgAICQKEECyE2GxWcbLVNM2yDKpT1rR3l7enT5+IRtZFQ5EpIJKipprdsSjncrcsUxLuMgpVVTHGVqsk7GyGw0G3262qQilV1y3nHEIMJBcSUAqpjolmEJ0qoW02m1VUpduZbacUEwwwxvj4yVjXgWkiQrBGfEMDmqZRqq9Wq7ZlRV4XRcOZLMsaIRxtU4TIcrnu9XqB361KrmnGrs340Ucf9XoDSjHViGVpQehRSqNoC4DUdQqAIQTbpR9s2xRCq+uaEKJpGiFkV81QSnHeapompWSMKSWVkgghTSOGoe3t7c3ncwhht9PfFVuapnFdu2GtqoDl2A1rJVCmaSgIGtYSpMCgO5jeP3Y6/jZar5dzAJRt2x/eXcxmix9++ZNBf1jX/Ob63jZsCKHfCQzbHAx6k8PJd9998+zVkzxPX3z0/P2H78WqaUQpJGs4LpsMJGyxWDAoX7x6Xlf8/cWVrrlVzaM4T9O0qiqE6WDUdz1DAriJtuvNwrb1sLsvJFQArqKkKplpmkWVB6HtbzY4VkgzBpOD2Wzx7u2VaXlFq65n3ymAECJFVVVCYKxEKRabWMI6TYswNBHWMNFdxz47fdHp9K6u4unjDJnEcCyYpsv1armNwrB7sH+0v3cApEySCDTSRJqmqKe7dGBauouxfrB/6tn+7e01a6VQqK7roedLAKOsnC9WUfpXQad3fX1r1tpqtR6NRicnZ0Lxfr97fHwqIb+9vXVdu6yrqikhhMNRXzM1JhmUAkgGlIIQ6Rh4ltkPA4zp4dHR+OAIElpwjk3LdPJtnMRx6vnh9OFRCOV5QR4nSZTuDyc9vysbARXa3zv46MVHnU5PCIWprlEjTaJBX5s+zjnneVYqBTmfa5qmFJjPF1VVtw2/u31IkiSO0r1x/+NPXlATrrezpimCjuuHTl7l0+1idLgHMZnNVp5naUTnTZFHESWW7jnXd7dRlnpu+DCdLh+Xw+F4uVxnWfJf/u//d5PDyXT6aIZG0HE+++HT82fnHvHvHu8RxNt02yl6ddve3t29+vijf/tv/y2hFCD09u3b+8fbTt9HCEbRpuu4nz7/tNPp/M38r+uq+fSjT8fDvTROLMMyTM20tOVijRCggauxEmrg5GS8Wo/jZIEhj+INsdAXgy90gz5Op4iirMijKGpYk+c5V0jX9ZrXmqZlSaYE6PS6VNeSOGt5qxQwbYeJFguioGw529Xn0iKzHNvx/L3xoe8XdSMtw3Ud7/MffKUTPS/SsiwpxmEYhh0fQriNWVWVh8dHp2eHQnEIQdNUt7e3SZJUecFqNuiMeQOKqBEMEmmZ2l5dVdPrm2U2r3nRIq5bZlyUmqY3TVPX9f3d9Xdvwr29judqCLGmzvNsffXhA1KGa3Z8O4zjOE2SMPR7YUdBzXK6vpu6Xu9g8hRh9+LdN5t1ZLuO2/Fm89XD/YeHx7VpmlApw3A+/fgjQ6cAwCTOBIcAICZa3TB830cEN4ynWf44nZVlOd6beEHYtjWhuut7QsnAsxFyHx4ePM979erVxcUFhPDTTz8VQgyHwxcvntm2nWXZYrHYAV6Ojo50XWdcRklcVHWn2/d9H0J8d3f/8PDg+75h6JvNuiyK2eM0jaPJ/pgQ0iihEQqkkJyZBgl9jwA47HYsaz/NEsb5Jo65EBohjFJC0P3VfacT4n5f2UJKWZel4iL0/NALTdN0TEdyBTijEHiWqWPUSmA55vHp6e39w89/8TcKUS4RoZrCqBGi5RK0TMPIJLqULeNq6HqUIJvqJgKDMDAxoUq4pkEJKfOiLivesjzNWtYCiKu6bFkLBNd1ijEWXGJKKKFcyZcvnj08THchDKsbdMJwMpm8fPa8qVIlWVvVGiG8YYIJxpuiyFarBWMtYw1vawEUIUjTNM3QTZNgiNI42W43RZYyKQiCTHDGK942TV1KKTnnWNN3rbzjg2NKaZmVkisMyWgwpgjP7x/vywYCqZSAUOkUUQ0jTQOSt5XK81qPMs+1u51+29ZSckoxIlqeZ5Zu9AchV5JokFKKKecFRwoYmg403rYCYxpFydtvv9lu191O2LA6aXJiaYNR//D84IScyJK6vte2bV3X17e3i9XKsqxuGPq+3zDGqlZyKdqGNS1WwDCsdDZtmkYw3u/3PdtJ07iIMyXUZhlhdL9ZJLxBRc4VJhBaSuimqwuhXNf1fb+p//+USwBYFplOpwhBxzYNw0jT1HVNDqrdkl4pyLlEGBCKCbbCwGtq0BYxa1RUN7wtoVSU6ov1mhBiGLqu66ap245p26ZhGGVZti2P47QqGyFUVdUYUV0zpcBAQQSxphmeF0gJNpsoz0sA0MHBQVUVTVsPBgMA5WazxhgPBn0hRFWVGCNCCOfcMPSdNR5CuMM87E4GTdMwxjw/gBAapmaZDsbYNE1dN1zXdRzLsqyd4ANj3Ol0dvTGKEocxzk8PLYsZ7vdIkTyvGSMEdt2O53O777+zcuXL/I8V0q8fPkiCIKyrNI039vbOzo8TZLi4t1ly2opQFnmQjRB4JkWjZP10fFemjHGK0qxbmhB4CklGG8222UUo+Vy7g26l9eXw8HecDyaPq6jJO72ep1ubzab+YFzcDBOsvXjbMofSs6bZ8/PFqttt9sf9Hthp6dpjYQg36wb2Vgz+83b1+vNcjTZ4wBLhCGmd9NpI6UXhEChpCg1jTqOVVbRzf2Dpk+SNMcEZG6TFY1kdLHaxlGx3LLpcmaH/nh/LBFuW3Z1c4UxTeJsNBhohKabpCpKAxET6QhCCJHjuNE27nW749FECBFvIyklAChOs22caprhh+HV5c2btx900+jBQAixtz/xfdfxbNOkw/F4Gy0BABAj3/d33dFuv2+77uPjo2nqVMO8biFQBCJdI7ZhYkKSKIKYrON0naSD/QMrDE3TdBzrP/2n/zR7nJZ53u/2KERBELi2k6WpaRhFntu2PRwOCSFCyclgACG8vys7nc7FxcVyuSaEAACiKBqNxlmWNU3T7w0PD0b39/fv3r1XCvp+KACfzR+qtOwFoaNby9V8td0gQ5vOZ27HT9PUMDQmxGqxXU4fv/ziB+OT/VZw07bcwF+tNtP5LAy70+n06urqv/pv/usf/OAH/9f/2//lxz/7ShH1yRcfcclZw/7df/jF0dHJ0xfPP7y9PNw/+d3r3//wix9mWcZYwxW/+PA+y+LhXjfoBoSin/zgy5OTE9a0OqKGox3s7x/tH3e7fQJx27KiLF3PdlyvzePFdnlwfh4Y/aPjyfurt8cn+7qreZ3w+YtzQhChiAnBGGOC67qhIGqaZqeuCFyvqqrtNi7ryqhrCUSn112vNxhDAACl1DCMoiiEUFJKomndfg9BzXJsxtVgOB70RqZpl2VpWZ6hnIaJzWb17v2FYWie5335039aVZXp2yVvy6awHVNquBasapvBcGxphkXNeJPlaXmwd9DvDnQMNvE6TrIoTwveQA0hRIHCpu3mee5Y5mg0AFDxpnFdqlNUN4Wm651uaFDPIt5oNKKIctYAgKbzBeccAHx2/nKydzwcH81ni9ubB8/zPv/sS8fxojh///763fsPTdMgBaqy7nd7x4cHSVxkWYkxLPLadd2iKAghTdNcXV29/f7dz3/+N6ZpUqp/+eUXEOHnz5/nRZqkWyllnqfffPP9Z5999vLly6urK8MwvvjBZ69fv26aJooiKeWuQ++6rmEYQRAsl8v315dCKE3TDN16fJxNp9PZbF7mBed8NBpatoGJqusyjreCt4TgZRobmmbqukahZ5qsqiyDQKjmUSwkp4aOAUCa5jgW1XVE8PPn7nK5vLi4yLLx4eF+GIZFUSAAP/nk0/l8fnN1m6XF/j70XY8grGkGpma/398/PPa+e/Pu/fvH+Xq9SXTT8f2ughBQjDClum6YZlU2SrLDw8M0iaiNTg8n/cDfzhf5dj0ejpqmgVIWaXZ9dwsg6vV6fthZp6k16JmmiTXKpagaoZTkUpR1U5alUuLw8LDf6W5W69vbWwzUqD8Y9j3fsZdlsVpvRd1ahqkYu76+Ojs90XWdUsI54W1blWVd17Si4/EJhGiz2cwep6vVCkIYJ1FeFIRgw9QIIW1TtUwEhrWTCsZxTCG1dGtvqEvGLy8uKSarxVIJqWsEIcJ4w9pWCogx1KnGG16V7VrGBGHTtMKwSzE6Op5sok2eZ1w0QrZNy7loMAF5nhDSwRBJxqPNhgDkur5o6m+++64uy06n43heksXfvvkGXWI38H3fC7WhfHgYjkc//qM/Onvy5Ldf/y7P8/FwzzbMuqqm23teN21e5mnmWTYE+OzsjLEmzzIhBMbYdX3H8RzH04g+my6jbaokjrY50nTDtIXEO4liv98HAOVZCRXk/A8ey8lkMl9MF4uFd36KMc5zNpm487gyDK6bBqEUY0qprmmWRs2iqIDSTMNDAEsJa9gAITXNWEePUrYAlggBXQe2Y1qWqevUdV0hRNtwCLFhUEo1Q7cGg4HgyLIcXdfbtiVE0zStrtodNW5XUYni7f7+qCizxWJxdHQ0HA539CSEEKV0pwMNgmA0GpVlGcfxLn7oOE6320UIsUbtIA2e50XbYNdxCIIgjuN+vxuG3aIoZrNZ01YAgLJUQnEuRLfXK6vq7v4+DENd1w3DILZlPDk/ty2jrivOGoyha/tNxQSTQMLZ42y7jiGgGqH9bg9CuFqsu17vq89/pGMTA0qI3uuP3l18yKu8aFugaQow3dI3WbzerPr9/rZSb2+nSasODiZcrz7Mv4YQ7u3tDQwtCJybxw8Pt1NCNCWRYdhx5FHoKi9scpysCsZaSkC53QKkFpDMr9eW5//ki3+yjaOi+KvVdrNN4sZ1t5tFN/Q7Bz5rCqEJi6Dru/calcNuL/D3JTMxJuso/dXvHp4+efJhkY6PX0QN1i0XOO2Ht983GG82K2no96s5hrjMcowQMHXquE1dayAkGBMEHu+3h/ujveFxus4/fvn573//O8DgsDNI81wJcLB3sFpvbdv94uOnJycnTZs0Lfr441dlWUMBPnn+RVVVWAJHNzsH/sPddRj6aRZbqp+Wq+X8VgHU7Qz0sGNgrdYi3fSoZnEFHm+SxaoBRutxhrh9dvAqeVRvfvlGCmb3DN5Wp+d7FLC9wfDh7v7Z0Z5DQLFY8L39sm7OuntJA6hSVCkDoXS76vf7GOOWgDhaPs6mL168sH0tr6Mf/ckPXr/9bTi0HceRSXG/Xruuax/uE4rrbc3qbNQZjrruajVfXF8OHOP3/3D51R99dXi0Z9v21d3jD3/yRx/eXSKsPXl6dPPh1rG940P929ff/Hf/6l//n/7P/83QCy9ef/eTP/2xofAmjovNCrFy4NuRyFiZnh5OVrP52zffd8PuN6+/6wTBdrrt93su6H15/sN4G+nI2szTb7/9btQ7HgxGk97Z3uCoqdlqEw+Hw7rgQegBpNVFHLgeqGpguZPx+Zc/5P/3/+f/A2nuD3/6TzalANssZ7BuRdkoJWlTSpOYrulACAMS8Iwf9E4OuihOk1Wx9TuhgR2dNIJjLqBu2Ov1+nGxOjg4MABohFhvCoSatxfXcZSWZfn+/funT59blv345uF3v/29bbuB59/fP0IIbdte5jgIgh/90Ik2manRZJZKwXABQMotjxbLGNmy6ziyqLM4qos8AWmWZffJPG4rSWmSbh/mD7Zn1YXSMGia6tnz027o52nWCKgRHpccATg4OOv6I8fsQIUnfg8q2dYFQixbzQfdzmgwNiiK1x/S9cpG+sDtWIgQoIo0cRwDIi5h2ypZwfpqcUt8XdM0EDqbOG7TYp1mRweHmmZ0/PDm6vbN778zdWf6MP1Oe4Ml+ov/7T/HGN3cXRojsyyLsmL9jnd58caz9R99+dnbt29vPrzXEJxOpxSCxN5SSncRh5OTk4eb++12u40S27YRA7P5ajabxXFsWvr+pLe3N2a8OT876Ha7aZq+efPd3d0txrjnGc8Oj5++eLrYrlveGK65Wq+RhlNVaDqxbUUp2RuN8zRBiDd17TpD3zu5v9Pqsr65nFZV49quqJ1oKfeHr5a96ubD32GwPj0+tHQDIVQxHK+Ko5Pjf/bHf/7k9GmUJm/fvf/L//mvbIOOB+Fnn74yDHu1jKCEYc9jrXAD1/XM//jvfhFa5pVSk0F3uXoUbea5ruu623RdVHl/vJc11UG/e7ecY9589OJFWdeP07nSDAUR1Q3YZICjuq63d6s/+uiHXWzLqGRle/X1N9X+sM1ryJRsmE41AECcxZiorIhtd3BysjedTl2h7YxWxweHQW+IICmLZjZdthXHlNxd3RuGZdgWBTJdx03bUkqpr7qOy5jQtJpgAABjslmv6+n0g5RAQeA4jkKiUZyjViiGIEQAQagwFVGypjQEMMCE9ru9Mk8fbqebzappGsHEQ33fCqZpGrBtAEAhxGg0IoZB98Zt26ZNSikN90erxSzjDYpr3wvj9RrXKlmvp9lN1AjLss5PTj/6qA2C4POnnyCEgiAoiuLdh/dffPWj2Wx2eX11M7tXeXR2djbxOsvlEpvcs+1NtAYmevXRR5phnpw9yYryH99/bwOFNC0IO3leMyauL5cfffTR3umZRm/u7u6EEEQTUnKlbIiA3wnaqtxst3t7++tNFCfFeBy0bcslAAojZCBiGLrtuGHLIFB5XuWSSUp23haIcOVQulNgIIQEUBBiHesUaSYJmWJWZ2RbrpSyrmvbtvvDgYKgbVveMoR1qhEFpFTcsqw0jTt+gAHuhV3RgiJqxt1DHTrFtjaRdbZ/jjFu2zbPc8YbWYsqKTlrNIADy0UIYozBHwxRfH9/VJblZrPxA1tKwDk3TBwEAcJKqdZ1LaX6RVFgjBFCitPHx8fvfv8/cs51XS/Tmvo6NXWilIqiaDemaGomFX98nOm63jQMKHR3d1dX3PMCKVVZ5re3903VdEJ/sj++uHgbx/HN5dXkcBJ4YVVVGtHLKl+uNgII09Q7Xr8fjpDt2bZDqZamea83ePHi46+//rqu+YsXHysJsrS27UxwkJVFWbRze5lG5Taau5Z1c3tVVYVl6qvVQgJJKMQYTmcP//pf/6tNFM/Xq7DXc10XaZRz+AdglkIa1Q2d9MUwybLxeE+zrDjL3t9dl2kJqdbNBhqhdVnFacIYm87nd7f3VNd4y9I0XVerpqoVF4N+HyFkWZZGaZ4IhZRuapj4ENOmqt3APzk8aqr6t7/9bZJmvd5gfzIpi9q13JOTkx98+nK9Xn///bvhcPjFF1/ujcL1ej2dzkeDvpCsLGrbpBrVbdsVQtR1nRSwKArTcAFAUkoh2sViSbT8h1/90Wq98TxP0wyE0HT2AAAYjUaTyfBnf/pH3/z+6/VmYekaF/XB4alrmXXVwRgRgltWvbv4jmpGv98Vsh0Nh0pKx7Z/8tWPEMa3t7eyYd+9+yYMw/Fw5Fn2dD6r6/pwb2IYRtu2Uby0LGcymZyfnEoIdrPiJMlev37tOE6/3xdCPT7Ofv0Pv+50OoPB4DHeDvvDumbZNs3q8sd/8tMfffXjLMv+6q//6vb+bh1HP/7jP3nz4ZvZYtUfdhAmv/v6aynBn/2Tf6bp9otPPhrujSYHB8vlGlNS1G29Woa+s3e4NxgPiE4a2UKIkyStqmo4HD579nLQHwqu0jTffRV3KSHVNEopy7IAIbN3H8anJ0/OFSFktVnVdRvl+W9++1vdNDzP03UqhSAIU0OzLRMD6OsBY0xBwDknCjMu8ygr4jzNM8BFmqZtWV9eXn64ulSs6XQ62/VsOBwfHBwEnv37r1+vl1OlYL/XS+MkiuLVcpkbBQLYsqxut9ftdh2/izHcrjdNVYxHfQRVlWd5mq1WCwzBZrV1bfv46FRAcHd/c/n+fYUqw9QklI7jGI7e7QdRusqrTNO0+/tb3aCK87+bTg/293/yo69ms1kaJ6tVhKH19FSOB1QwJVphaPSLzz5OkmXblLqu67puGZbrulIAySkiUEIJgOz1Ov1B9/nzp1TXwl437HRGoxHGsCyyqi4ohqZrs5pJxiGSHdc3z59SCZFCB+NRmqZJvF1N525g87qpWc0E81w3Xix2KUXXdeM4/v777weDwbNnz/r9/mKxiKJICEEpjeM4juOmaTSNACAxhmEY7m57VVs1TYMx1g1nf39/tDdeLhf3j/dJluq6/vTZ6Xhvr9MdcAi3SSy4NAwr6Ab7k4O7+9um5qEXdrtDVrNaVLaj70+OKaWO619f36RRwTmP08S0nPV2lWVJt9v9i7/4iyxLkzQqyxwIOY1y07G7/U7X7AElbNt8+epp1eT309lo2Dl/OnFsP/SN7Ta9u7mbL+aP9w4CsMozURa2hjUoG9Y2jF+8f//q5cvzJ8/Onj4DiBRlJQRTSu1a6VlRIIR8z7EdTzctx0mLoqhLbGikbbI03+gG8Fyn3++H/X5ZV1mRY0qIrgGpmOB5XUVpEnSDvK4WyyUhxHbsycH++HA/zsodQhEhpOt6w9qqqiilmkYsK6BUb9pWKRUEga7rTZPe3T7ouqFpmlKwbXgrpBRKKUWJBiEEUEkIMKa76ZpUwtB1Smme53kaD3qnvutdfUjfvHmzC6tSg+qmsQv97BRGQsiyrHVdR4goxeqqNQ17PJ4ErmfqxnI6Y1UdbbYGoQRhKVVTFgSC29vr9XrZ6/X29/cHg0Gep2mR+74bhF6SRk1TbVdLSuns4T6nG8938jxPslgzDKDkdrsdjvcIQUVRACDD0IdI44pDoohOHN23fJdamoKQS6mgJAghgib7o6ZpDA1J33RtZ9APez23LEuCMNJ0TDSqW0KBpmlLkGNMJReWofe7XcH4LoW/y5n5vr/LClBKAUZKwd3vPKWlruumaTqOs+MTUEoRwQ/TRyklAnAXFCjL3DLNMAzDMBwNhoZhCMkghLxldV1zzsumZIwppRACOxAn0TRNJ1jDAhAgmNyFESRACOwayHme53lumqbjeLsKUrfbZ4xxzqUAAqldP0LXdU3T401BCLFte2cwSdNUSimEIHe3D1y0hJDZbH57e2vblpJwNBrFUToYDCHEabKMokjXDSHZYjFbLzemaZq6tlosJ+MRhqit2rvHO8dxyqzOyiZPG6G4qbmD/ujs9KnQ0dvvLz7//PMw6Are/unP/nw82r++vq0rpusmgnpdMc4lwRpXcrvd4p6satjr2HuTXhQhCKRuoNVme3V1EXQ7AMjH6X3TctM0bduiVIO82YWDCIKQEIQIIZrrBZvNJi2r+Wodb5N1kiopV3lycXd30J8ozgiCEiKCkKlToum2aZmmqWHqu55O9NAPdjRJxqXuOUpIgmib8el8sZw+sqY+nBw+e/pScfj4+KiUGgZ9/8hPsty2bYyplKBt2zwtos0WdSHGGEhl27ZUvMyypmG7Qg5rWigRb/hysTbNKk0KKdBk/8Q2rSDs39/e3Nw+JFmOCGFCMsZ0y4yi6OzJ4SefPfv3+/1vX7+2Db1p6s1m9eFiNewPlBItKzebTVFm/4d/+S9d172+ubBcY7GNm7zc258ghMBkf9wfLBeLF89f7A9G2TaO5qs8z8edvmEYSZJ0O65pWycnJ5PJeD6fK66EUJKLt2/enT05992wzMvtNsrz4ujoqKra7x9uHrxZW7N+0JtO56Lm3324+OyTTz798our26tv377rj8f6w7WQUNPdpszGh/tSgr2jg9UyGu2xydGB7QWX729YKwRU283GMDSv40MNAQq7g7BtRJrkSuLhcNIJu2VRK9VAiAnROJcIISllWhSMCaLrQKnx0VGyWgsh/6v/43+9SqOiqdbr7bPT55t4gyRKNlmexoHnT7qjUX8IIezhbl3XTdPksuR19PgwjaINl2K3+atZNRoNHA0HhiaKrEYg2sybKqWYE6Ltjbq8rdarbRytfvTVT+u67YY9x/F63QHnglJ9d44hFFGg5uuV4m2WbB4e79q6KYqcSb6aL+fzuW3/ihK9LIrFYhF2LNt1Dg7GnUEnb/JNlLVt21a13g9M0wSSb7fRdtPuTxSEOI7ToihEy7zA9BxXSrndRq7lTiaTbrdb1wmlFCEEEFQIcik1TUvySCQi6PqYEkSB59kvXz3r9LoQ493iFkIYK06Q4lhRDb148jSKomS7uZUAA0iACnz7aG+4Wq2yLP3w7k3Q8YsiS/I0yzLNoJ0w3PkFOp1Ov983DGN/f//8/Pzq6mpHVoAQapq2OzEMh8MdjkIpFYbheG/oenZRVQBKomOlVFEV8+X88vLy9v6OUnr+9My03DgpqvdXaZ7UTeP4ju/3xv0xkwzIKWdCSU0pygSJ0ibL0qxCnbDX7XQsxxEK+r3OerEuqnw2fyzLcjAYdILQMIxO56xpqzdv3hCMlWAYIgRAnkYciKAbnJ/vf/bFC0JIt6Nl2RqifG9i+d7+yWmHYAcB+OT8pC2L0HWoAho6sU3j6Ojoi88+39ufcM5//duvhZKL5ZKzZrPZOJ5bFEVepHXLkyTp9noEwo5ntSaajEe2i00LHJ8OCSGB57aAcKAEBNQ0DNMsiiKrSwkEJJiaOtU1w7UHg8He3jgMQ4jwYrHYhdgJIYPBoGpqjHG/3y/qyjRNy7KyIi/LkvGmbkBepFBhBDDFBtU0y4ScCyWhhEDTNM45l4wSSikWQLVt3bbCNrFrW3mep2maRFsCFABAIzTw/KqpKaWIkrIu2oZplGFKCNUFUwIJXdchRJwrirV+b1gadlsUaZoXEuRxxk3DMk2KcMfzia4BpbI0rapqu91CCKu20XW9LEvN0E3TPNjf73W7uq7f39/vD0ZHJ4e//e1vP1xdOTpJ0vTr17/37x8Mx54ulgABzaAtFwAAquO6zaFtAwoFAhJJpCFKKFQSN0rTEYBQCQ0jHQJBiJwM+01T1ZLXdQsV0ghpmJJty0CLhFKsBVIpzuuqZHVDEA48x/d9x/YxxkqppmnSIq+qmnMOIHx8fPQ8z5cCQWKapmEYnPMoinYFSEwIhLAsy/l8blsWpdTznN3td/eV4ZwLIRhjeZK2bcs5RwhRDWuaZlkWhKRpas65lByAHYsaYowhhE3DyrLeUdWVUhhjAFBVVYSQtvmDlrosq6ZphJCUNnleAQBc1zVNsyzLuq53xz6CEMrjkjH24f1N3ZRHRycA4Pl8JQQgRIu2SRRFO76EUlIqJgTrdMaMNZvNand4XK/Xt7f3p6enq+WWK25bjoKAEoMSwzQc7FEI4Xq9lRJURbm/vx/4AyUf/v7vfnV29qQqWZ6XddX2egPTpIwx2yGmDTo9e3LQSbMOVODwaHj3cC+E8MJAINWwOgjNivM4jnVdt7s+AIogLKUESkgppYCaYbuukArXXCFNN12vLMukrHC83Q8HimPHMCtQawQbmk516rlBEIS2bXfDnkE13grbtBAilILpcu06TjjoW5Y1u7tfrDbX7y/mD7N/8qd/dn5yPhnuzedzz3Z6QagYL7NsOV84lnt6bFVVdXNzF21ix3EopbdXt65nZ1miUbRarNerFWNtXZdZmWlYGw9GedlmWV7mxWI6u715DDrdi6vrJE65VEyI0d44gOri/k6J+osvvvjo4xdJvOz6YZ7GaRqXZb5YiCRJdp88QtBo3IvjuCij0fhJmeeMsXffvyWE9Hq90A9+8uVXe3t7bVE9Pj66rkttFyFUFAUWyjBMUzeaqr54+/7du3dvvn8LIXRMZxtFSZR6nlcWrWeHSikC9c0yNnQnTfNhf3T29GlZNP/pu78vqvro7MTrdU41xBTo9IajvQPLsY6ODou6+OjsaZYVYae32eZpWRmW9cnx2XB88Hj32Ol17+9vN+sl522SxUwwvxsggU3D64RS16yrq7ur91f93vCjjz6SErQt1zTCmMjzctdybsuCNVJKBAHt+L3+YI9a2s3dbSO4rNlytbq+vEyT+Pz8nDzRdGTUdb3Jk7ZtEYY6NgxsVmnZFHWv1yuKTEKsIeSbds/zqFK6rtmWrQG+fLjRoXxy/uzzVy8+ff787mFeVe3p4YHg8HDvSNdtSrQ8L7ebOIuL6eOtYWhUI4vF7Pz8NEm2d3e3RZEZhpGXWSOb+WaZ39+aphmG3dHJvksBY0w3qOs623i5mM+Fak3TjDfxeDiMoqitqxfPD0zN/Obr13d3d23BJAcYIs55keW8abVA241q27a1Hcd1bdu2MaJMcIVgXuUQwrzMojRREJiOabuOG/g7T6Dv+wQijSAC1M4ZEZhetNpsl6urtxempju23RYZHQ2haB5uLu+u3/VHw4ODfcd1WFUqIbfbbVVV0+kUY/z06dNer8cYu7u7++6775bLpWEYCKE8zwEAg8Hg6dOnnues1+uiKBDBEMKdIB5TYprG/eNDlER+xy+bUkBZV/nDfCa6uwuQ4lJYluU4QTfssRbc3N5LBvvhyA183Qw8r47jaja7/dXvvt/b2/v8888Xmy3G+ODwWCqFIVlu1sv5fL1dn5+e9Xo927YNw9gb77OHKWMN4BwCCZXUKfRdq9/zXc82TDMILQQrBImuY41gTUMdZ6CUGne9eLMddrtpFLdlzZrKdz3NMgFCEqDFaun7fq/X3d+fAKxMS1+vW84ZQRABDkSjAMjzqmkq43iMIev2nX63kxdpUWTTVRaliYSAGjogmHHOOJfYOH1yHnRCrGt+GJyen43Ho6qqZrNZlmW7e8iu6/8HCmFTWpbpOJZhGEWVSckQUrpOTFPraT1CNF3Xdc0EAHKhAAAY07KpOc8kVxgCqGGshOJKtKwQdd3UgjW+O3RtuyxLyzA//vhjztumaTAlbduWZVkUhZTANE2/p2EA25YDgKBCGqEIYd6wMi9MTQ+8EHDWlhWGhNUsrdLB3lBw7njuaDQiuraJtpso4pxjirzAZYzVZRFtQFVVo8GgytLg6blp6ppGCEW7q3DdNtvt9vXr10wqTSMAoVa0CnBE8HqzhiJcblcBr2vRGo7uWjYCCkCOCLSphaGUXMTRJo63tqP3B2HD0SbaCi4dtyMBVHJbFs1mE7UNZ23LOYdSGZru2ma/3w/9wHb8XTdytVpt4qhpGtM0HddFiNR1vV6vN+tos9mMRqNOp2NZloKAMUYx2cWhdqcBKWW/3/d9f71e73gknPOdqFpSgWpcVZXYiduV4kLUbZMVOQAAQoUx3q2JAIIAQtYw27aVUlXVJElGqW6aMokzjChjjBAqhCjLMkkSpaCUEkqilKKU6rq+c2r/gdHUNA2EcAfJeXh4WMw3nueNRqO98eH19fVqdbWzkO3v7xEKqAYPTw5evnwBsOKAr6b3tudSSv3Qi/OkFa1pWxCjtm05VIvtOvvNr4+eH/zZP/nZ9HH+8HAHJPz1r3+73UYQ4Kpqmpr1+/1XLz+OoghjvJvJOF4DoYrTWcuttm1s0zo4HNme/ubNG8aqJNmsVsuzJ0/2R0fz5ZoxhgwKIWzblvEGKkAQdRxv0O0VQdEJwvHeEGN8c/nh8vJSw7QTBF3f51IghArWypbpBFuWvTcaB0FoWZbnBUihpqoNzUREkw33XJtSohGiIBoNRl98+nnX8QnCWZQTjHTdnowmuq6LluV5LqVsGua7lJpOVdSb1Vq0O4MIz/PcMvXb20vHtZuygEg0TZ3n+XR5hxBy3WC7SYu8PTl+dnZ2Fqcl1Q2KCed8E21Xq1WWJ8fHx1mRc1EvV1Pb0U3TJIQYhtFU9dOnz6cPj+/fv8/z/MnTszjZ/u3f/fuiKPzAff7yJZcyybLLy8sdXdvQtK+++gpIGW02WZKcHB3tvHCCMWXbddvG1XY5myd5vlgseMsty+JMtFVT541jQ0Oz9vcO27Y1DPvx8TFh9d7e3tMnzzRqGIYBIKzb9pvvvvt//3/+v5999pET+mVRI2jMpusir09OTuzApMRaLrecqdUySpLc94Rtu8vlynXdpmFJkiEkMcZCiLKsoTQAIEBpy8X27duL3/36t2dnZ5blvnz+QqMEY6T+8EKSsSwrirSdHOwzxm7zRxvQw5ND1/DuHu7j5dYAescKe054tn8aOiFkkJfcIg6QUkpJEUEKNWVDET0/OYVQuZ7TNBXGuKoKDSDPsE8OTwbD4PHxcTAYDYdjJlQS55Ap2YgP37/fRilrlVJIQSwlKPKqaRrHo3VTVbVomkrTie3ahqHlhYiz+N2Hdw1rORRhz9c1ExFgedZHp0dJkui6lsbbNImA4FKxzTr+7LNPjo8PpeI61UzTTLZRlmWBF16+eZ8kxWa1lux9P9zz3NDUjSiKZo93Wb5BUCoghFAIEs4FRnSyv9/pdIZ74/TNdxCjgTXQTUNCYNs2hLAuSgihYHynJMIQGYZhGZrvOmWaHOyPjo+Opvf3q+WMUIQQz5KEPdSOY3qeo2kaY+zt+4tduLppmp126P7+/he/+MWu5+a6bl3XjDFd1y3L2uWkbNtumqqoih3VWDM0Xdccz2X3rBVssr//+XjUG/X/w9/+x199/esvP/5hGIamacqmKeu6yCtKstls9u7dO93U9sb7k70j13WXqwgQAxCt4rxVikOYljlj7PD4qD/qW5aVZLEAAiF0eHzUDbvff/99EsUH+0dF2dR1bVBdx8S1nYZXyWY9vbulBj47O7NH3VJH62W6miXr9Roh5E7GSilTt0ydWJZR5ZQTlm7KtuVUN8q6sW27KIqw23Vcy/O8z7787OLi4pe//GWapicnJ6PhnqHpSZIk2/VqtVgtBnVlEYIgUhKI6fxhE5tt22KMpVS7fP4Ote77PsaYMcYYq+t6R0wvy/Lw8Lhpmvl8vl4v67puWCskq5uyO+hhglpW1U0pJJOKA8gxUU1eN6BuKs0wGoiIEBJCTCllbVsXZd2UumVgApRSkjMlJGNVFsdSiKPjg2fnT96++V5IMR4Orq5uJFcYQylBWdRpnAGADGq0bSsl3z1ldF03Bn0l+HIxN6h2dnp8dnCgpLy7vKyrKt5s59N6PV/sHI+8ZZpttpwBAAzLTNNU0zRd14s2T6KoKsqO5xuYRptlU5VScN+2k20ECR70hqvNOolioaSuES/wnaq6u79njGXZBmO8WkyL3MjzHGPk+67jWp1uQDEiCD3e3wMpNcMMPB8AaZomjyspcMsBoWbQ6bveIIrTtmVRlBiGHQaYUmrqVKcaxWjXoRBC7G78QRD4fmiapmXbjImqqoJux3V8SukfVFtA7WaiEkpN03zf7/f7hq6HYRgEwU4ZtfunQwV2tknDN6uq2rUZAQAIod3MQNM0jCGhGsEEISglEIIDADyvo+s6xhSArG1bwRVQCEKlFJBSMcbaltd127Z8Z99G6g8ByV2T4j+3J0iel1VVUaoPh6PlcvXh/fVgMAj8rn/U8f3o6dOnbVuHYWg75vX15WazcoNhydusqV588lFaZISQx+m0hm3LG2wjzaVxHG/iTQCCtm3X6/U0OgwCdzjqHx0f3N8+fP/991VVbdbRoN/fbree5z1/8XS1WkynU8MkR8eTwVgqpZqyQghKxZNsUVZxlMTvLr47e/JsvDc0LPPHP/mjl5988vU333737fclbgFAVVU0VU0p1bDW83tPT55WVaWE9A1/MOiN/M4w7LOm7na7eRqXZakZFmtqnRLf8xCmmqZNJhOMKSW6YAxDQrAWbbfv3r3TMK3LahZ2OkF31Ou/ePbR0egIKhBv145lYwKXy4WmU930Nul2tVqljxVreKfTkQJIJqFSQRA4lp3n6WI5+9U//IpQ5Hl22PF1Ssq8HPaG1NCBgOvVpr6fDfp7R8dnBCGCMAbQtkwAw+VysZhOx+PRi2fPzs7OhBC2bZ+cnJRpDiWEioyG+1CS0ejhw4eLaJsw3qRpyjl3HGu1WS/Xq7KuDMtMsvTy+qobdnqDwWw22+lfq6qKosgwjMDzQz/gJthut8vlEko17PV7YSfNy8VsiRBSChOoOY6BoFaWtWhhXYiizI0D3cC677iHBwcvnr08OjqaTCb9Xtc0zaqoBVOnh2evXxfzu/XL80/uru8wpknyoFEz2xZ3V1MsrX53AAQu0vqXf/+r2ezx6bMz76NQI0ad547l6hrRdQ5A47nh3viwEw4EVxBiXTc5bxkTBGuYQMZY27ad7qCpuRDy7OhcQrCerTVD/+IHPxn3x4+Pj+v1GmOom0ZbsCqtEULmwMAtiuM4T6IkT2rWUgwp1Z88OaMErVarJIldO0AjCpSAiux19/NNZSKLFWI2W909PN7dPaRZNRpObu4eMDEQwlJBXTcZEwihoDe0LMu2zarNP9xebbfLKI2ITvIqXW0roBDnTEpaVrmUcrw3dG1T00iaJavFAmN8fn4eZZuLi3cfPnzYbFa9brff70/vp3Vd743GnuOLrEn9crVI0yhmFRA9RRCtqiJPo5blhknVimvUsCynbZmumR+/+uz4+NiwTE03G866nS6EkEvZNpy3LQDANi3bsG3dYowJxj3Po4ZuWCbRyf7h/vOXTx8er2fL+1evXr149TTLssV6VVb5fDnL8xJTcn5+niRJURRpmuq6vlqt1us15zzLMtM0d/DBuq41Tdtut998802v41FKuZSsaZumxrvzpqUXdWE7TmBQvxc4nt0bDZ4+fxZ2O7puBv2OhkkxL2aPU4RQ6Ps7glBdNgiRXm/Ahdhs47JlQa8/Aerps2dnz54rjFbzBTaI77gE4d6ogzDQiC6lhAh5blDkVZSkkCOdGk3VptsMcFXm5fZhfXFxoVu6Tg3btNbr9Wq6XK/XdV0fTA55k0OIqKnZlqbrtNMJuOcBAAkhYb/f7fUnk72TDx8gUnGcz2aPP/zJ50I0dZ03TcGaWrHW8lxb73uWqWFkaxZSpCiKu9sHRPB2kyBk6oQqpcq6ggDYlqVr2v5wfPX+w8HhxNYNnWppnORpKoSQXOjE/s81Oc65AkLTNNu2oihqmspxLAUBIUAp1jRVXZdpHAEADMOEyCVYaxomJNhx+ioNCYkMDWkENJwL2QrZDjq+Zep5nusErxbLb37/2vO848PDIs0aznZXZJ3oluUEXtjp9LZFSiltmgogCJGUikne1HXeVIpgNRgMbN2QdbleLlhV+K6FEA7DEOta2dSSt51OqFlmw1qAFMTAMLQil0WWbtdrwFmWpM+fHnFW7/V6gWP/7re/z5PUM10NIB3itCg1g3Zdl/Y699fv4+1a1KVLhk0Z8wa3bavrplTcdz13fEAp5Yw9PK4dz3n6atINw912zO8KhcyH6TxKG0VKy/TCnquU6o+AUkpxoYDUCKaESNbWdQ2lqKqqbVtK6WQyoVRv27asqrIsMcadfm9vvK+Ums/nWZbVbaMZel3XBOFd9nkymVim2e/3kySBUjHGdkpoJaRhGJRSjjEhlqY5nPPdEKVt26oqIYSEEErxbmGxMztIxYUQq+UGAGCaFmOsKArDMHu9HgBAKdg0bVVVgivLdAzDkFJWRV2WJee8rmul1O5YjxAiruuWZXl5eUWw1u0Mbct3XX8+X1N6nef50dFx09RCNpy379693UbrbSWxqTud4NnHrzzPXUdrbJPVerHcrOJF1MKqUW1Wb9u0tCwrGDlZvv3v/vt/9ad/+ueff/YDKfkXP/gsz+p/+29/Pp0+xHGMCQSyzYukqnOpmodH2B+PO90OszXHsTjvXr6/Wq9Xi+VqMhmenh5Pjk7Lqj46PneCoCzL1XoRHg4QxGWJEQIEEiWUZJJCajlGHEVVlAE3OBru7/ndIs+FYN99/evH6ZxoVCiICIGYZmlBiHZwcGgYCClWFrXkyrJwWVTLxeof/ubfZVn24unzLz77ATjhiZ4s54u2qvf29hwLSQWKsmoVM1zT8lyHtUVcJtvINuxuGAKheMsll57nGVRjTYMQAgBQrAG5M5OCh4eH0WiPQv3w4CAv/hDK28bJ7e2tEKLb7fZwv2maJIsdy+iG/mq1SpJk4/iD/mjWTJGiod/FSNM164vPf6gkXG+Wtu0O+sOWNcvl8vHf/7uiKIqi8LudVbQFGH38xWdEo5toy1smhCjruqqqqqpIv48QQoAYmm7qBm8ZRARCyBnYbuPj4wPbdKqy0TUbCGRQg3NOiFYlxepx8bfr//DVj380e5jF222/20UAfPHZZ2mazh5m79++n+wdgBYkq2Qz2xRFgxDbLlPbVpbuPdzMHL0TuoPJ4EApAQTSoO7ojoFNLImh2a4TeJ5nGg7nstcdnZ88tSzLNM3NOkIIZVkiBPMcUye6lBJjXBSN67pSCiEU57xpGEUUlO147zjfxCmMdapXRX1zc11VVRiGi/nUcZw0Teui1DTt8PiAt4xLuVptCCGrVVTmxcHBQeB3V4tlEpW//83r16+/7XQ6o+Fe1TYtFzb1iGOzRmZx4XjEMDTORauaqmqorv369W/DMDw+Olhu12WVV1VmWZbnu5ginWq6rm82m6ZhQkjHso4PD3YXHSm5aZp9v6tb1PXMMAzevn0jhfjw4cPj3X0QBBrRq6rpd7q9Xs80G4LseFNKQXeLzyQBoe8AqFmWmecpQNDzvKqqESQAEoS1NCubhidZ7gddroTrunmeZ2lZlqXveuae5bs+kIoxVrdNWVUSyoY1aRmvNvObu8siz1rZeB23O+y4HU/XTaoZxDDDMHz+4unj4+OHDx8sy9pdeYMgePLkyfX1teM4QRCoP2h5wWq1iuP4k4+ej8cjxzIVkEwwTCkAsizLsqkt1wq7HS7F7f3NOlr3R/3TZ2fJMjJNs8wLhAChyLT0/f09z3OgEo/zmZR8G2+KqkzyxLQNao0aCGzPbwX3wwAh4HiupuuP9/dJluzMTL/89a/7nd7L5698P/z669c3766CTsiYQEQJxZGODM2ajA/fvP3OoDcEUM/zzk9e9sL49vYWKc0gkFLNMnSDaoZGQm9s2+7e3kRK2el0LMPsHx2enZ8kSRKGvpT8629/1zbtyfkR4MrSrSJPDUId2/NsbzLYP5gcm7bx/ur91fXd3t6IS4pYK1vGOW/LyvM83/XqusYQPd7dH072As/fLlZtUWGClFJt2z48fr87jbVtq5RoeB0EQbfblVBy3hqmZpgmwmA3xyYUEioJ0cLQ6fcHBGtRmmZpISVXgGEkLZN6nm1aelUVgmGowKDXc1337uZmtVzeljd39zcvn73c8bXquq7rVjN027II0WzbNTTTYDkkEmFKKcUYsrZAnjnsdz68f3d/f1NlSdcP7u4vbz5cFmmGEGpLYRmmaxoYYwHUbiCPKXn9+jUh5Pz0rCmr9XodrzeOYZ2fnOoAVHmOdHMQdM6PTxardeh4GMBtEusYQaV4WRzvnz09PdKwmM1qEyOkBAZQw5jXdbTahF6n1x0hTIXEs+U24OjFJ5PucCzJCmN8dnT6YrG4vrmbzpdlXUuAEEBCguFwyBkriqwuSqAEIhhhjUJqAPa/PrOpYZoIkd1IIAzDtm2TJMnSYjcJsG3b8dxtHAEAdqe6P4zVLUvX9aqqDKphjLvdruM4TVVjjHVdzxpFsKCUQQh3zu6mqbIsm8/ngnDB/4B7V0BBSCjWsrQoimI3tyOEmqblOI5p2rvwQVOzHUxi9wdCiLZmu6OGEAIAgHeVUF0n9/f3L1683N9v7u8eV6sbx/G++OILpdR0Os3zsm3bpmlczxwMDu7ur01Ln+eybJlCkAPVSB4XycHxwavPXv1Pf/k/zhZzosPxZIRNmNZVby/8wQ9+sJ2u/vIv/2H+3/+//v7v//7Zk+cfvfo02iaWZdZlFQSeaepFmTPW9PuhlHI2v2e/vD47O9MIOT4+DsMw7Lgtq5ng3klgWjpCACE0m82K29sduw1iYOi6ZVms4UiRtqrjbbRdbX3b0ZFmEsLLpklKjeLAdACUL168KMtyvYmyItcs23Y9IZkQ4u13b8KwS4i23cQI4OPjkyAIzs7O7r79/rvV+uHm1tXsIs51avCGeZ73q3/8FZe82wsd3zKVHl1FSokXn7ykjH7//TsIYa/Xw4jc3929f/9+s9nwpnFc6/DweDTsWpaZpFGaxlmWnZ8/dRynbbhl2FW93q42dVnVZZXFSScMu70eV7Jt6yQLIIRXVx9M11utVm3NvvrBDx8fZm3VTsb7Hz7cIKA6ne7p6Zlt21K1i8WK87YoikVRjcfjireGaWZFjjB+9dFH13e3v3v9+7aqJ5PJs2fPPM97eHjYRFFdlsgmmqZpmqbrJoTQsu1OpzeZTGzPF1ytViuMKefCdV3GmGs550dnZ+dP3r592xTVw919Wzdlni2XS0KI5MKx3Lps8iQniLqWjyVWHAGMTd3RiX04trabJF6naScTLdibTD5/9XnTVv1+BwPUlq1jm9ttTKleVU1RVEopCFFZVovF0rVtiFQUbaTkOp0YpqYUpJS6QbeqqrKsQz+AED48PMRtQrEmhHj35mK+XBwfHxOd8JbHcQIhaqLi8PCwYXVWZkN32B/1F9PF1c314+Njvz+s8mKz2UCIwzCsWxH4PitAWylWgyypNtutQtiy7V6nc/84XcwWaZoRzajrFhPCOfd93z100iJdRmuB5HA8MM0DAGSepTsXs+/7QgjFxS6E67vuq9Pjuq6TPJGA5VX+9v2bqinPnz352c9+dnJ69G/+zb9ZzRd/+id/JoRYzubaaHx8dDSbrhSne8Pjfm+fEmOziRaL2U4Gs8PaG4bhBT6AiDFhGjZGtCwSJlSaF3leNoz5Xsha8fg4u3z/AQN4cnR8enIShqGGCTZN23V6/Q6hsNvrSSgBAvuHEz/0HMdxbC/s9Rzb4wqs1ttut6tp2osXL3q9nlKqKIodlc9xnC+//NLzvE6n8/DwcH19vbNDMcZ+/etfPX36tNPvZVlWVpUbukTDvBUCClt3Xdf1fZcaNMrT1WoVp4mBabKM8zTTqRF0fMsypORZlqRpnCTRhw8f7maPDWuLpt472OdVa7telCSr362gFJapt4KBRr2/vLy9vFrOl+PB2NLd6w9XAJAXz15ijDVNdyynrdpNvAIEeKGrGdqov5dnRZmV795cnp2d/fCHz/bHx7wBdV23TYUgZE0tAUzT1DI9y3VM2xl0Bxjj9WapqooJznl7cHDA2/qb7177vu/77rA7JJBeX97c3t42VWuZNqZE143RcPIwnW/WSX84ocSMt2nTNEIIzpmlGaEfrNm6SNJRrx+4XrzebDcbQshg0Nd0XdQtIdqOpe26LmNNGRcAqCAIqEGjaCMVV0AohZqmFkJUVWXZhmEY/X53MhkjRBAGbdtUVbVcTOu2MU2dYN+yDIwVgNxsqaZpQRDcAZCmiW3a5+fn+/v7dV3rup4kSVOWSinBlRCiKAohRGc8VEoBjGzb/s82o8n+ECPp+Y6QDWNVmsaPj/eCNePxOBwOdI1qGFPXSetys1nXou31+4cnR7/79W+yNKnSvOP5k/EYAZUmMYHDKi8267WpW0d7+1DBpuW8aZP19vTJCVcijWPftn705Q9C3ynyBMqWAOoYulIwitPNZuO6frc71HSLCTVfxUnOZssIEjsrea8X5BUb758cn7+q6zrJi7yosqIs8vL+/p5Qw/WooTuSt1Lypi5bqQwEbNu2LItz3jSNlM1O7LJcrjVNMzQqBdgN9neu1N09HkillBJCYAyllG3bMtbudkkQKYzxDt5jmmYhdyLiRghBCMEYF0UWRVGWZYRgSimllFC0W9NoGqaUdrtdwzAAgFKy/6x6AgDsQg7/q0oGti2vqipN091EYdfL0HXdcRzf94mNuj17EvHYd9of/+hgG0cXV9cvXj3vT8a1bKllZ1UtoWGa4dHhS4LxoiSGbdXM3qYibUuns1e22bfXH94/3A6PR0JWUbakpuzaIEun0wdL8wcvvpxsNlHKs9fvv716uBMtzIp8G8e25RdJAyysYw8wlUbRdl5/95ub2VP41Y++/O3i0fY3H338QkBvEX+X1Py7q+960zVAWlE2UpCq5N1wz9LsJM6yeU2Q5XlelmWrdXp9/3B8dGTpmm1oZdtYogEQt3VlmiZRmCj48umT7777RrJSk5RqCpRLJ9Su3nwwDMew3LPTZ5CXlts5mIyefPRqmUSObT+up4v17L/8F3/x/OxJkae/+93s7uoDwvuGNcoz3PI2TpOqzk3N5qBebNYIt1WWWTphbXR/fd9U1XDY3594WbYlmhN2LMNG/ZHf747OTs+Lovr699/86IuvINaghC+evcRI7w36nU6napuDydhxnJrVt7e3RFFLEt/3A9MY9nxCyN3ddRj6H66v49cxoej8/Lwoiv6of3V15QXh5cN8DVCv14MQPjk7n0wmlmXNOT8+Odl9UBolHNd5+dkn33zzzSKJRK4Fng+EuL5+gFL9yZ/89MnZ2fThfjqdlmX29HC/KLOS17ZmL6JVlS8lhEo0H796sd3GH3/0xdlJy6Xq9w+jSCjlur43m04Nu/P5Vz9++/ZNDaRr+Ofn551O58O7i7dv36bR/Pe/21oaOzw8Biz7i3/+s+VyKYTQKQWtahSDGl9tZ7PZ7P3791VRappuGIalG7w3CCrXdV3OpQS0KEESpbqus3K+WCweH++/+OILRBBE7fvLi1/83YNlG7PFFGtknkKIQTA2vOFoE21BIRaz6XA80nV9upiP9yfrIr66ujo+Pk6aXEmJEbpf3E9Xjwd7k5pl+y+eAtd6eHiArjnpnU4X82W63d5fTuezw2f7XMmqqceTLiIEAOD7ftC3m4blZek4juX5vhdyLgB2sgI1LVbK2R92qzLPkzTbpL/529/ogBqGMRjsEUIefvvb17+8Xa+Xl98uPv74pc7dL579SD5tAVOh71y8Wf3yl9OvfvTTYNDrjw48q5vGZVu0k36P8CaJ12EnvLm5EUIM3MF+72jaLB6iecq40Oj1dPrmw4XvuyUr5/Op55tJvFSyoVhuFhtWFC6loWFzxD3X6tiWbdujL3+8o7/9b/7FvxRCdDodQshwONxsNgihg8HAczdKKQg0CE3HHziuv42TyfFHmzgaHkkolaET09AINrpewFkTb9dNVWWrWbJZrfMM6XS9WV3ft4fnp+fPn+mWfXB6DDHhnNuej3B8//Curuuj3iCK8qZphQ5934dI+903b6LtOoqT6XQOhNR1nXPe7XTiy9tOJ5Cgns+WnLedXhh4FqEMEv7skyMO8u4o2K7iUuSbNP75L37ech764cmzJ2VZEggcN5zP520tgiCoqkJl2EauxjQHOjrXq6rSJRWcdUZjIUTbqKZpqzLnDdKw1e32NdOr0rTf2bv8cNXWOE35el3qZv8wPK/rWgiRrmtdV77X5QwwEXMoIVRSimi7qbL8fP9I5+DT85ez3jTP89VqwxoFSJ1kc4CEbmAF2uGgr6T4x7//e99xCcSi5axhSDLftrCSURQJoPYGe57nTB8eFWDHx4c1K+fzhyB0Pd+SiAeH/vXVva4TADOq1f3BoGF4uU5tF2sG1XWnrJr1ZipV7fu+7waMc16V8Wo57g83m814MDw+OL69f5SAnD1//s2HSwBhz3OirFonkcpgGIbAE51Ox3I8zitiUIngzcMjqxvBwXoVH+6NMSTb5cLSyHgyGg2HNceTg/00Ta9urz/6+NP3V5frm7t/+pM/MgXchvfv3r0jEBcM2IaJdH1TrNaD8eW7OyllsWXj8RgJFM3W+4cH2TLCtdQJhoSur+c/+emPm3V6afZuiwYIrGFDQRIGo5rJ+TLxu8lo7H74cDUa7UsBZndTJCDV8O1mXffHg8HAMIxOp7PXDbnva5qW5NmTw8n9/f3944MAkuq6lBQAhLDu6H+IjGw2kRDCcRzLcjCAWKNl3VqW1emEbdvO54vdzEkoZhgG1amUAEK4U9nppoFb3Q6C06BXFIWU0nR7Simia4e6Np1Oy5ru4muccwihBLLT62hE+//x9F9PtmTpdSe4hWvtR6vQcePqm6JSoFAFoACqJgDSGmwb40OPccz6vf8dPvTDjM3LmM20mOaQDZBAkwQKVYWqzMq8mXllxA0dJ452rX373nseDoljdp7jmJuH+7e/tdZvIQ5IXdO8hg01FKWtu3JLj6IoTVOEkCDIRdmkWcE5FwSBcQ4xUDQZYhBFYbEpAACGCob9/0IH6PV62/Gl1WoJYbS+vDmzbfvd+9fD8aggNRbR9fXleHdnMB7tjke7u7t5ll1cXF1f347H4+P9iawoUIRp7lclVZWWoSJDRev1HcKN27Z7fV1RpKrOkjCom0xiRZSs0oyYuizKsqJCIKMiA+NJ23FkJFRVXQNBViTZdiRRajesOju7uLq5MS3tp3/wu4psqkoCuEAIh0CoKpLmWZrlum5butFy7bSsAGCqoiCMRVGklHvrdZ5mvuc9PTkxFFk39KqooSSsluumJv56QQiFHLTb7TAK6qIUFbHXbWOMDF03TKvbGWmyQhtQ5gUE4NGDIwlD1jTr2WKzXi6nU5HzNApvry5ZU+uqXBZ5UZaaaZRp/tWH88cnTy1D67ltWzdATeqqImWVRfF6vbYMXdfVPEkDz1cUpSJ1HIehnyRxWjfU87yqoYBjTTe7g6GmaVmSWpZ1eHgIIU/zjHM+6g8oAWEYaprmOM5wONxmnzRNefz48fX19Wq9ODw8jOOYUh4E0XaM3ZprtmDd8XhMKV0ul2EYtlqtfr+fZdlmszk4ONgeAUUV5XlWpBngfDwe26Y5vb379ttvIeTtdvvm5ubBgwc9RWaA/uxnf/jm3duZH452D3TNLMsqSfP5YlOWtWk7b968WS6Xoii0O+4D4eDB0QGpirOz077b8cOgqMqFt16sV9P5rNfrWY699laqqmKItu/soijCMCzrmpQFhHi1Wq3Xa0JIr9NttVrD4bDbanc6XcYYqWrO+WazSZLEMAySZd999+2LFy8UTa2qcjgevPz+W8/zKqI3TcMASNKUAwoA0Ay93+/XSVnX9XJxX5FaVdVhv7NcWepS+fSzT1bL5d3t/Wq+MHT96OBYMk3DsufTtaZppm1tzcmdTqfd6bCLi4rUk71dCOFyvaKUcgC2w7jvB4SQvCybhiVJslH8pmnKvCzLUpEku9Rff/dyd7IjI+Hu9nbw+ed1Xfd6vbIs37179+7dO1VVB4MB4/Vf/dX/Ob0/Pnl4dHC4o6iYMQYga5rm4uJ0b+eQNeDD7PT+dgkIbLudOPAtUy2KAkI+Gg36wwGEnAJm2+bueKQrap6nooBUTYGQr9fLy4vT44PDKPYaWmu6NOh3J3s7/WG3KirEgSrJvKEbz0+SpGmabdRqvViWZbllIZRliTE+ODjY2dkJswQhVDfUspzZfMkAbxpm27Ysy6whiizuDAfDh08pKRhjkFHQ1EmecQjiPHt38eFmNo3C5OXL7x8+eiQqsq7rCKEoik7fvGrK/NmjR9dn56Io2qqlaZpjWhjjJIm2gbHj40NNViil1zeXs/n0s88+e/Dw5Ks339ZFGWdxXZeU1QAww7YYaZ49e2bqlrf0v/nq+x8Wb0Qk+b6/N9lDQIii8L9avJ0tzTBJki1FXxRxmuS//frb65vLPM+Pjo7evXs3HA4t09nG5YMgWBueLOtWkkRh3O/3tzWYl5fnW2Ty1iO2Wq0uLi4QQp1Ox7KsbTBKluWtIiPL8vHx8TZi9/mPvvA87+bmZrPZUEop5YIgGJoOAFosFr7vy5rmui4AIEmSuiGqqhJC/kuPEcaqqmJRoLQhDU3zLIp9hFBVVRyaw0n//PwcIZCmcZJEWZZ1N73AjzxvwyDstHtVVZRVqciaaRqyLFNKFU2WiMY5p4ArqoEktWwopbRhdDgcOqbhhQEldcu1VU2er5b3tze0tljDB0iCSKANwQCrkmpZ6jfvv746v/gX/+xP958+FZHY6/T29vZkSQAlOz8/J5RjJMZxPJ/PIRLCICaEMAAgRJRSRgEDqKpIlmUfLi8Jo6Sm94t5kKaapmm66bhtUZIWqw2lRJIF27Wurq4YBS9evGCzpecFZV4oqqaqMhbB5vb+61//5uRRvFyu0zSVBLEoszQORVEkhLScuq5rAEAcxwghyphtuwJElm2cqCc7OztBFN7d3W+h7IyxRbI0DEOW1U4Hb++i7WerLDRNs9lsyrJqmkZVVVEUIeNhGEKI+/3+aDRSFGX7DwUhLLKc0GZrd8AYU8qaukqrijVUFsV+t3t0dAwxKuoqSRJCCGcQUAYBQBwgADmHnIMPZ5dbBK0oihywbXrCNPW6braSNOec8YbxRpSwIAj9tjMajbb5C8MwEEKEEFEUheGkXZOkO9yfr26B0IiKrOra+dXi6OQoy5LvX79q2S3btjd++OHDxcuX3+/tjSeTyc7hnuVahqNrMv5wffa3v/xrVYYIC5IIJUmwbA1j3TS1TqfT6g5Xy7kkRKZuIyiZpixipcrz2XSW5RDDRsC4wrisBUppXVad7ghA0TA1t2NLonF5Od14yyyty7rgFDEKeEMhB5qiKqoOIVAkmWmMMSAIgiQqZV7FYVRkOebYNG0MBctyWF1pqpbG2Ww2kxAv8vr16/euaw56A4BYEATBxnv6YlQVVZ5klZb5DbdMFxAqIeHR4d7haPD27dub0/c3F+dVEqnSj23TkkTU644O9vaSLK3ybNBpG4p8d3P1l3/+Fwd7O5999pkqSgKADeUyFnRFxe2uIoiAsiJJwyQcDAaGqmZRWJNm43uUco7g7c2douk7imFbbsPo2dkHPwwRQlGafPPN10mStLudltkqy0LTtG63u82xpFHcVPXh4WG/2w2CYH9//+3b1zc3NyLClmPoAAEABEHiHHY6PcOwXr9+fXNz12q1AEC27QIA0jSnlMuyyjn8Z3/8x77nffvtt4Cyj549n4x2fvGLn3/3zbdN0+iW/vjx4+VybbnOZHcMIP7k4x8dUqwoynw+P724/vD+w9u3b5umOT4+zuIkj2MI+XjQAQ3RFGVvZ+dXv/y5IilHD0/SNP3Pf/M379+/Pz4+7o2GRVNrugYgqikVIcKQNoxwyAQFG2qLc14ULUJ2tpYax7IVRUmLXMtTQighxHVFXVeLIkvT+M3Ll3d3d5/86BMIQZKliiZrpkYp5ZwrmiEIyLZtWVWSJGmaGkKcRitFUdJolRcV6LSieF2TvNN1r26vNU3/6LNPry5v7m5u7lar28ViPB4/GB8mWbrVHdMi39bfYVFo97qtVosBXtZVWddpmm58L80zRcUcAk5pXVdFkcE43g7puqICxrI8XS2WrmFxTT88OLZ0i1KuKNo2zwIASNO4qgtZFlVNOj09X63vN97xs+cPP/nkI8o+ubi42N0bTybDq/PZu7O3WVh0nG7dFAXJaFQC2ORlJquSZZmyJldVdX9/P1/cU0aiwNM0VVNkRcYt17y6PAu81ZNHj//5P//j4WCgYFlT1CzOFuupv4kEQSCEvHv3brFYbEPV3W7XMAzLsuaz2bYCgzE2Gg6nd3cE/Zf23tV6/vVX34Rx3O30Hz161Gp16rKqy1wRpSAILj+cW6ah63oYB7Ztj3fHO4Nxa7L7UZ74kb/arLMiD1erVBAwhkVR0CziRVIEa8sxFUnebDb393fbPLquyt1ulwG6OxlTSm3bbrXt3/72t/P57KuvyIfpze30JgxjWcMjrw8A28f7giDYtskpjNLo4vK8KFh3bJckK5u81XKbhlBK0zQ9Pz9fLIp2x1VVNUmSskyrquIc7u7uuk47TfLLi+tury1LKkKCquq97kiRdYzFqqoW8+UWfc0Y0zSt1eoghBACEsS6rjPGwjDchty2xvKdnR3LsgghFxcXnuc5jtPtdg8PDweDgeM44+EoSbL1ej2dTn3fD8NYVfX3Z6fVtvJYVZqmQYKkGVZJCa0h5VDA0tZvL4piTUrNUCVJaQhtAA/XG0mVPvro+Xw+X61WW89aEHqzxX3TNHXdyKre6boIYcoAAIBzEEaerpnj4VgW7NvrGyA1Dw8fjYbD64tzCmBd16/e/FDVhaYppCrSMAcAqIKgtduQsyovYz8WRVFAIgQihIQD1pRVEUfBahNPIkPXLcNUJCVN05//6ivO+YOHj4uqfvv+rCjrwaB9eX39ww8/0IafPHyMIMzirMjyKi+2tlnLsqIwqapKVWMsiYqsvj8///FPfqwoCmmq+fx+tfGLH14JgnB0dLzhOAmjklSNIDY1EbBMSXO/uG8aWhHKOVewSMoqieIt7Tj0A0WSFUVhjHIOOOcCxhwgWZarIsvzUpHkw/09XVevrq4Wi0Wr1dqilBljpmnbti2KYkNYp92TJIlSFgTBdvJACBFCJUWu61AUoeu6/X7/v7p9c9M067rcLp8oqSmlURRFURRvojhJoICfvXj+xZdfapa98jZYkFTNKIqirhtBEDRFRQhVRZ3n+efj3aqqOKd1XS9X8+VyDgEyTTvPU8ZYnucNrSEEW4ITAFBRdct2ZVmO47goawBAURR17QuCCNb+xna0TsetaKmIWpKnYej7oXdwdLhZeVEUffhw8e70DCBBMyxakPX9Mo6iilQVrY22wQVepIRkoKBFnBYcNO1uy3VtSpmisL299rC3p0lJluXBJoKNqGtCmhZF0QiogFBURAkjUG7RirTRFOnk8eOHD090U7u6/vDnf/6XQRwgBAxLFwQB8CLJ0rpqiFEYhsEoQUhGAAoIcsqKpgAAuLbDOXjy5Emv3QsDTxgJWESGZglYZoQdPnp8P7ubvvx6Mhk9fvJAFNG792+SJLI0NdfV2A9Cz4MgcXSnTLMkySoBTSYTTcS2oQ46Lds0RqPhZDSmtFEUZTgcir53c3Mzn84ZY8HK99eZIszqJ6WMBcXWGkXDCMjSriAIW0iJqRsYw1F/YNiWgODh04/zPN9s/CTJLi5vWlCsaVMUxWAwFMXrIss3Gy+KIm/lhWFYVSQ3cwCAquaUMkmSthlLy7IWi0Vd1+/evdveoxBizuHV1U3e0O1bR1VVTVElQWxqsr+753ne5XxRZPmLFy9M3YiC0DLMttuqi1LEgipIogYd22akKbPStu0gCPqd/u/+7k9FWWIAGLpzeztTFOV86bVaLdo0qiQfHex32y3OmGvZeZ7m+b6qyYqi0Kq6OD/f29uRBPH69mb/8CCOYy8KxjuTP/3n/2w0GpZFUVOi6zogIMkiL6irquKcW6Z5fX0JAIjjlHKmqpIo4rohaZ6OBkPLdeI4TtOYEA1j0Q+Dm5ubNI2fvXjGGFus5pvNxo/8TqejGbpq6AAAJMBOrzcYDC5vrl69enV5fTuyEBYkyipBBJzTd+/ffvP994KkRFmepNlgMCKEUoR11727uZWj5Kef9t++fTtfLcfjMeZssVzarqPret+2ZFWhlB4cHRmWOZ1O37x5E8exINqiKKoy3kqSDW8wxhKWAEB1XqwXmWkaeZoByv6H/9v/cH5+3tTE1A1N01RZA4w3hEiCOBz0k0Tyg7WA4dXlB0KSvd3hyYMj1zHm3hoLiKMGC9xp2YZpYgEihLIq02QJIdQ0DQXcMCxCm9dv31CMP/vsUwGjXqdV12VRoJ3dSRgFnFPD0r1o422WZV7piooA2mw2MjKePn3a6XQ0Tbu+vs6ybDabxXG8BSVtufEIoTzP4ziO49jpG3VdAID8zcbzl0EQNXWdpdEf/dE/GE9GkPFOp/Pu3bv/9Ne/sCxL07Sr+xtJkW3btmyj3+89f/705OjR45PHRZkKAlou57d312Uc26rGqmI9mx4//9gwjLqpZov7ipRijnirtWvstrnDAPNDvyaFrMnj3THGWNZkUzc0RS2kVNzGwQUBIbD1ey1W88VyXpF8vOO22s7rd28Wi8WXH/3k5uYGQmhZluM4hmEIglCWhSzL/X5/s9nc3k4ZAwcHB4PBRBCE2exWkqSqqsqiabldRVGyrEriNIlTQmhRVGHoi6JombasSFmWVakviqJlWQ8ePNia15qm8X3/7u7Otm2EkO/7cRx7npfn+bNnz+qSFFlZllVRFGkUV3kFGaSUYiREYQwhrAn1gwghxACXVSVYpXVdU84ESZRVRZZVURYEGbuug0QgKvJmsV5t5hDD5Xqzu3fw8uW3sixvD46bzQoAZBiWrqvb5TOAcJvro5SWVZ5msTXcN1tVt+U+f/YkicOb+9nN9A5hkKbxluIMBWyY5nA4JIxXVfXw0SNS10VRVHmFJFDTPMjWcRCCun728HGWpFmcPHn8rCyK2d307u5O1S3P88Iovrq6uputHNeSFf3Xf/fVxcVVp9PZneyIWMpB2VCeFuUmCAeTYX9n1+03CKE8L26u7+4X6+k0oxD90T/4Wbs/yKry9esfWm1H09SHj564jtVyXAYgh5izRpCUtmuXZX1/dyfLimFYjJIiTyGj27boxZIiDDTVsIm9vcjbxUBRlrpuWqYpimLVEEVR9nf3RFFcz6//3oWDECI1raumqiqEMMZse2bbjpJ5XjIGdLNj27bjOL1ejzG2WMyCIFAVBUHYkApwCmmTxFEYhovFYj6fK1DBoqAaBqtIkeclabIssyynoZxBVDNOSAMEqqqSZEmCock1RgLBGALAGg4I5YahTXYnURQwCDiCdV0CyJumZowhDCRFL6qmYbBueFGUeZ6naVoUhfDNd98vFovHT54NRsP7+dI0TRonu/sHvd5gb/dAU437+/n11e1quWm32512W+XSaDTYPTqoSPXdm+8/3FzUvOKCWBWYMBk0vGmAImMMYJxk3pq42i6iBmZgOV1dfAgcO3ZMZzbzLEMrCtjUhSBWIsKSJBiGoTuOoWqKJtW0EGoYxNF0NiOEKKrUbrctx95GQlerVVXU3Va73+9PFysJC5qmEUKDIAKMm6alKyprWBwnq8X6we6RIgmUsJbdEY9FCcu6bBiqJUAhT1IOmiJNIKdZErRdGwPMKY6jQmCgLCp/sSKY99vtrtP6nR99/vTR4zzPCWlevXs3vb/P8zwpipbjMMaTJN3d3f3pT3/v4vyKUbLt2M2yrMoLUpeDfncymSwWDCGoaGqaJ5qmCYJg2/Zitdxs/M3a5xwAgCy3xRn88OF8MBibhp0kyWbpkaYa9AaOZXPOB92hJEkIIUkWCCF3N3eUUgHhD2FUVdVvfv3rs9PT8Xi85SuEfqA7bQRQGqW84WmUzum8Lup+p399cR0HcZ7k+zv7siwnWfLxxx9jgFlNdkdjCeFg4zVF9fbian4/63X6/+xP/vmjJ4+Xm3VZ1DVjcTYdjUZ3s/tPXjyRRWl+P7s9W3nrtWNao3G/5bjbgJbl2BdXl0Ecnb598+DwYDweh3GxWm4QBv/oH/2jXqfbarlnZ2dFnuu6+vDhw7Zrk6YIQi8MfcZYnkVuuw0hBBitVqvlcs4YcF13b2dXUmQkIFVVqOtwBFfeygs9CPmzF08fP34chuHL774B/5Vi64UBR1yQREEUq5JUhDYNTdPM831HcXiSBGG8e3QwGu+cXV6tvUBU1AYKs9kySPJWqwM5qhtaEIJlCWBUkjrPcywILV3PilxRFN0yt5iXhrH9w4PBYBAlsSCJqq7VZQU5EGVBQBBjyBsuYiArQhREWZoywsq8yBGWJUnX9clopyJZx21Np9Nf//JX11eXO5Pxw4cPdvfG33z7mzhaq5LY7Tl7OyMEmjjc3N9dv72+tCyn2+1++pmWx00WFrSmsqqIoiDJAhIlDsXlypOVeRLnlKEqLQ3VePTgoaTK55cfKKkcp3V4eHh5eX4/u/O99aDbGw3GLdf1lp4f+m1D2iLlp9Pp+fn5FpZQluWTJ0+iKGq1WpIk1XUtSRLn/OjoKCz8qsq2gfL93cnjk4eSKF5fX9/dXB7u73U7PcuyOIIcowbwME2ApCRFFST3zVWlKNJisXh4c6yqoiTi0WjYcZzO0xc1qYLAm06nnr8uqnw0GT7/6Fl/0CmKYr1eZ1nm+2tFUWpad7pOEASEEEkRG1L1B+2Hj56cX10ul3OAqeUYvWFPluUsyz58OI3jFGJwcHwgC2pTsflyESbo9PTUdd0nT55gjH/5y1++fftWlmXTNPf29jrtHqnpeuUVed0QLuiyLMmj0aTb7YdhvFnfX13eyLIqScpoOJYkRZLAtuwHQhiGIQBAVbQi3mx/oWmaw+HQcZwt8eb6+np7JYfD4cHBwXZ58Ld/+7fHJ0fbYyIhhFJuWZahm2EY6rquKJrjOKvVZrXxt65VCCGhjAEoSQoAQJQViAWMRSQKFWmSICzK2vNDAFCapr/41a9+//d/X5YVxpggYEURQUW2zWdpmr9/f2pZliSrlmUNBqNul9/eTL/+6pujY2l/d+/45DHC4g+v3pyefyiqcr5cui17srfLGAvCkHNYN6BhDCKp1xtlSYpRxJoGAVjlxWp2P7+fAcr6vV4cx73eQNOMX//614tNcDtbYkm9vFo0lFdNI0qiH8av373Ps7Lb7S7X3nKxERBWZNnSDYQlUjMmCLrb6hsGxuLlxXWY5xShwVifr9bLjccR3D88ipJ4Z2c8vb/1goAUhSIJummLsgYQVnQLY5EQOpvNMEJNXVUIAkKJnKuyIstyDnMBIlEUs8SRVAUjsalJXddIEDBCooDqWgQAyKK4bffWJL63t/ejTz9fr9fX19e3t7dhGG11h7Kst2e2brdbFrWiKLZtQ4mJsrT1G2ZZFoYhqWvbMhipOSWKIHCM8iwWMOi4FuKNDCTbbeumoWvy+dnZ2vdFTXn89DkFEGOsqjIhNM/zLehJkTU/iLaGYlkWBVExTEdVFSxIvf4QCVg3jW1BaFVVVV0yxkzDTtMcYyxJEkJC0zDGAMaiEATZdLr64dVZw8QgzPaO1MHQ+eRHnx0eHt7d3Z2ensqiopuWYVtVVU3v71tmxz9Lb701h/B6ejNbbwRV1AzVbvfruqppnRepiEwRGawusqIpUmooraZEgAqcgSymVeYnMWg5IkJIURVTN7AAIeSKpummgYWm5sl8Xem6XlaJKGHT0iGE796dHhwc7O3tjYaTumriOE6iuNNqAwAQBq5uQ4jzJN/khSCICpZvLm9EKMhYMQxTkyRO2f7+oSLJqiRf31xqumqYkuPqnFV5FlRVmUbRaGjsjIbeJi6iiuSlrRmgP0YkK7ICANjqdHYOjjgEWZYt12u43Cw29378/Wg0mU+XjDHHHQyG+6btblaLBrB14N9dXSEAl/P73d1Jp9ulnHEMOQR5VYZJrJuGrqubJIuzVFKV4XD00Sef7+8f0obf3c0Mw9jb2U+ShDLCGJuMxhjjLMv6/aGiKFvsGiEk9CNNU548eeL7PoSAVHUcx4NefzQacf7o8x99UXJQFMXd3V2v1+t0OtPptCxLCNH+/sGDByeMMVXVZFm2LPvx4yemab35/mXkiUUSy6LUdluaorbd1nA48sNgsVh+98MPi9V652D/+UcvLKf12HKuLl61Wo4GSUdFaZMVXrqqwkAUHz96ChCiWVTGIavqNEniOB0MRqSZu47Tbrc1Sbm8vPyrv/wPq9Xq5Ojw0eMTzJksCrIo1FXmLRdVVdm25bZbtmMripQk0enp6d3dXb/TbZrGdp2iyERR1jSNNTQIfFVVXrx4Meo4eZ5zxN+fnQ2HQ7fd+vkvfxFFUZy2HNd1XTeII44ggPjR46dN0yT+zHRbAy4enTyXdY1eTgVZ0wyrqmmr3e1NIur1AABjFklEQVR0esPBeD6bBUGQxnEax2EUdbpdz/cJIbppdLtdgFHDaJIkSZYVVQkxCuPow4cP6/XasCzIACEEAAYxAJwyWpOqQZBKIqKSKOvy1ftY328gg/+///3f/jf/5I8/PnlOSPPDDz+sVqvtNnI0Hjx//rSqk/OLN6omPX/x9IsvPxFE8OHD+9PTd4rtRnGKAQVAxFgEsKaclRXFEKZZyTkvq+bduw9XV8uqors7R48fPh32dgDkooyqsqaAaJqk63oYhhdnp7c308Vi5XnBaDDGEKmGvg78H96+sW37/Prq9ft3tm23Wi3NMjdhMBgMBoPBb37zm+Vy+eDBA1mW14FPecMoUhSlKpZNTQeT9ieffOL7z3/729+WRRIn+Oru8u371zUvVaSWtFZ0DUtYV9q6prCmLrL87P0p4mwxv9d0+eHDB1988dl4ZyRgMa9qjvAsDfIi0TTNsHSAuJLJNcnzKpM1SdWUg4ODzWaTxhEhZDqd+qFvaG0JCy3HERWsW6qiKLRpsjzx/HUUJmVZcwChAHVZffr8SdttsVggTbXxVqZh93o9QRA450VRRlEMAEzTTFUMCPDtzfR+Ondd90/+2T9sGuZtIkIa2uSUQs5QkmQIVYIgtNvdfn8YBN7XX3/NOX/y5NFwOPR9f5tYgxAmSZIkSRzHo9HIsqw8z7es306ns/3ToR8JgqBYMoNUQILdtrEgbD3qWKKd3sBpdfLZjDFGKKvrGosCggBAhBASsEg5J5RDzjf+YrG8lyQBYqHf72CBX1xc7e3t7e8d39/f13VtGCpCKiGEUR4GSdMEGMmG0battut0qqoipNmsg6p8Y6n6/d1tFPrnH06PD/d7vc7s/q7VcfcPDqAgvnt/dnl1O52vi4rouvnyu1eKIlmGaZg2hhxQpqqqZVl5kn44Pz85eWQ49lffvvz5L39tuQ6XlR9eXfR61njn4OrmGgkiIE1ZEEmSDcPkHFV5UZGGMaDIhq6Zw9GEQPT+8pIziBDK0wIIomE6/U43L9Jvvn8ty+If/uz3nVZHt+zFS//u/m+wguM4dlt5tzfaOTiynE4SF5Az17QgEiDntKoJ4yJUGGooRDWtAh9SSqMoUFVdluWq024IcxzH970wDBVFsSyLKUqWJXle9jstTdP6fbff749G493dvfV6XVVkuVzGcUxqqsiqaIjMYrIs27adlvFWhtge3GVJkiVBESUsQJEILcdWFMlQJEEQWm2HMfa3/+ffbrzNbH6j6DrAyItiJEpRFL745BPDtA2n1VCeJFmR5SQrQN202+26LrdBR0FEgoA4Z1VFOBcgwIbmyoooSeKWWMg5T71w4wWcc9M067rO8hIAJIiygKEBmOpvMtXQGRXznBmG3u0Mzi9v3rx5kyeJaZrr9XrbJcU5v1xcNIyqkSpIYpInSAWyIQCR1XlVNnlZVVmWGIYKoSEgzhra0JIDkXHSbTuGpmRZFkepZcPxuIcQMAzdsg3GmrLIMIaKBtLMtywLQJaVpRfOw3hjQ4eSRhAQY8w0zZ/87u999unn79+/tywLAXx+9qEoiuFw3Gp3t20oAhI4BW2n7dotU1NbdkuTpTgITUOHjPt+cHZ6DmBD6ty2VNuxLcNc5omIYJbEli6QIgecrhbLbgsAwpKkyLK5aVkMQ46K9mDg9oYPP/rRn/3L//7i/HKxWCiSdH56cXV5STheb6L+2EECBIxXpL6d3R/s7ydFHibxfLOSZZEjWNEGyxLkrKKNAoGqaSahmqZLskpo8/Lb7yllWVZgJG4ZHbIsc0AFQVBVXdO0Iq9ITQkhuq4DyObzeafTYYwVRbFYLKbTaRRFg8GAUTCd3pdVjhVt2ykyGY0lSYrDqNvtOo4ji5Ioit1u1/M8VVaGw2EaJ5Q0e5Oduq5ZQ0WEWdNkSRJsfMb4mzdvojjtjgZ7uwePnz57cPzw8ua61xucTDpxEGbeRm4yR6SA87YmqLoBqkRRtSBIDF3Fkux2+tPZ3LJbs19+tT/eQZR///Llr3/1d4TUk53Rk5OHlm6UWZpFooyRqahNXZdF2nasoigcx2l3OycIcs4NQzMMa7QzchwLYzHP8zosBUHSTcNtt0aTkQjIzdkNAKDTbXX7HQq4pilIgDWhACDVMBES4jSzLGt3v9s0TWhZw8lYX61Mtx/GUV4BzWypmjEej4uiuL2ZcgrKLJ/0R3wwpBXxfX8wGARBkJcF5xyJQpKlVVUhQZBVJcnSm7tbZb3a+D4DQBRFUNa0ppxTUcIIAABZQ2tYNqIock5EpKoaIISkcXL27v2f/tM/7bTab9++DbzgwfFxr9fx/c37t+9sS0+T+GBv//jBXsux18tFGHmkKQ72JxFTVktvvYiqjEEmu0bHNh3O4pJUCGFFUURBr+tM15TxsGvYraODA9bA5XpZ1JkXeoomxnFs2MbzZx9zBpTpHWDc90NvEyqyjDG+PLsXRfGnP/3p049ebMJgPp8Tb6Np2s7B/s7BPgCgZpRjpFlmt9sNw5AQVmREEtU0KefTOWL04cmxrimqIoqYqZqY3AVJGii6jBSgyUpZkuVmFSM87HclJAAIZF3vtt22bV1dXX391bfX17ejybDV7SiqirAkKmKUJlmZpWmaRnFdl6quCBgx1hRVcXV9maYppaTX67345EVdlN99+21W5rIqWcgQKoRyyBGllHa7HUXT/LVPCKd1QzHudFtVVbfttiiKjuNUVeV5XhiGmqZvVwK25UqiEsfz29upqqofffTRp59+QQhdLBZbf7GqmAgJDaGr1SaKIlXRNdUYT8S6bmaz2VYi3B05lmXZtr2Nzm/x/ttPr9fDGM9ms+Vy6bruaDTa29uDDGw17x9++OHi+urB8cOHDx8qilKWdZqXR4e1pMiCJEMI67KsqkpBuK4JpVSQJQkCzkFd1w0jQRCFQWw4mmmaEELKuG4aa89/9uBxEudpmqqKVZEacFHXdUFWAIfdbtewbM6E5cILw7DIabc7VJAWBZvTt3mRRYG32tuZHB/tQUR7vd58ub67u5+vPVm3FEsKb2fr2aaocsuyRoO+KIqmoSu6optGVRW6rlYN2T/aL0izjkIoy5s4dV33x7/zo3/wj/8RAPD0f/qf6oogQURYHE92MMattqaOFEaaMAgo5VAWO51ersGV78dx3BDWa/dGO7tN3Yiq2rHNy/ML2zbni1WrbemG9fTZi5vry+XmLouTMIw2fqDohijKSRxWReGYRkkaUjcMMSyJWEAYQcBZURTb2gvGWJHngihusQeev56Md0ejERaFqqrqulYUxbHNoiiSJPU8f6usHR8f7+0dMMaurq68TbDZbKqqwliEEBJC1mtPsyRFUSCAXuBXRYkgFEWJMiJBRRKwbRqttmOoiq6re3t7IsLff/31D6+vb++T/lDvdPuKhBvWLKY3w26HdipdFB3TNgQxF6Rt/Nir1lsAlyiKsiI6SqtpCCHEC+KiLBljHGEOAeMCwoIgCCmIAUCUNnGcxnG8xUBxzoW721UUVw3Dimo5br/IyXoTvn93/vb07cXFha7KgoBvb26wgA1DC8OQy/V4POoPBht/fffmOsniFuqYthnESwCAICLDFNsds9c1G5KkcTO9vdgGNyVROTqehGG4XALLsgxNLcq8rIPaC6q6KIpM01UgtHf29i3LSuIsjlPS5BwQLIC6arbXGgDw4vnHg8FgvV4XaT5d3/m+l2W547QUSbYsy7IsWZTb7W631R0MBoooMQoQFKqqghwsZrOX337/3fffPH50iATS7Vm9ntXrdzFknPM4jCATeUN1Rb27XS6nq80mtE3DcuzRzm4QRb/99oeCfM0h2jvYPzw+kWW5P5gcHx8/e/Hp+el56AdnZ2dhHIkCIoxUdRNE4RNNQ6JQM+qHwc7OWNIVWdf2Ta0sy9linheZ291TVd22HW8T3N3df/Pbl71e/3D/qCiKJEk0TVMUJYnz5Wxumma73VZ1M03TKIpkWSaEvHz50nVdSZLyPK2qahsE2Nperq6u+v3+2/OvXdfNsuzx48dFUbx+/frzzz93XXfrmfrRj340m80ePXrU7/d//etfV1Vla4pt28cHh5IkZVlxcXFx/uHCtm271d7dO8gJ2T84sFrtr7/+hiOYFSVcf//h9Kwu82F/cLI3RgAihCAS2qbe6g3ZbDGa7C2CqDfe2YTx7v7eeDjCEM2m9/fXtxjAg6Pj/YPdYb+3Wq2aqoSM7u3v7u7szG5vIG1swxRFXBQZIRUhxHLsbrfLOayqamstjuN4tVju7u5++umnW8LPzfm7NE055z/67DPLst6dnf7RH/1REIVv351utUCAYJIkeVkSSheLBRIVuAovru9rhg3TfPTsI7vdK4qiqqqnB8eKpJKyuv5wISLMG4YQSpKk3+/LqkJoIypyWmzBpmKaZQ2jYRyFYei0WqIobqHIDaVNQzCFADKEOGCcU0Z4nSVx6BeZmO/s2LGXBCX94kdfYIzPz8/LsjRNE0BumqbnrS8vL/IisWxVN1RJFt69f6tqWDcU2zYZY74XSJLGIaqqqkhL1xrs7x217c6H89OW49i2Y1qOaXWfP/3UafeKvNYxCvz4zav3F1dnfrQxbK0i5cHx/t7+zmbjh0HS6bYcy0YcQQ4ghMMdMJ/PGQLdbodjOF/7rZbpdtv98fB6evvu3TvGmGrqZ5fnQECSJPWc4V12jZDU6XQBayBn52cf7mfTxWr+6MnDZx+9qJraizw7jArSiKK4mm7qsqAQItDFEGRJChqCOdM0bTKZZGXhh97Z+dUBBwdHh1gUEfE5p4ZhmaYZqnKRZWVZJklcB5XruuvNMk+zMAzX6/Xz588X6xXnXFEU2zJNQwMi2LKeBAEv1qudye5ksitA4eb6Po1z1dBXq6swzCmlW08GQsiyrCRJr6+vjw4faJpWFBWldDSanJyc7O3tAQDOzs6qkrRarXar1zQsywpSM8YAIUTXDABAnpUY406nt/WOfffd9e7ubrfb3UbYt2Y3RVEuLy+jKBJFcTudbGNKdV3/+LMvDcPY2uY3y5WhW47jeIE/mewuVqskSSjllFLKWVbkeZEjLCR5RgjRua6qKgCA0Kauq6qqGAScc0EQZ4s5xvDgYI8xZhiWYViSpKmquvECCMFotLOzt4exuF5707t5VVWyrBJCKKWW6ewPjzinEoJAke/vbj+cveWAyKoync08P175wcYLoKiapmq1up3hDqQJZU0YR6auSrLYMJqVWRAErus+ff7k8y+/gBg9efbMcNz/9f/7b9qS/Ojhyd7efhhFH33y8Xg8Pru4/PblS0ppp9PblodBiAVRpqQhhFSMNbIEEXJbnSCIGs6gIESe3zA66PVlVRmNRqfnH8yZWhRFr9dFWDzcP5gp84ur28vzC0N3ipIsZvOqKBHCjDRVUTYYy6IEGN+SLssytyxDFLeROloWxfbxwjlfLpeEENd13XbLMMztaW3LWAQApGnq+z6lXNd1x3E+/+zLOI7v7+/Xa29bzuR53nQ6JYzasgwA8PxN6AeqIlm6VlGAAKCkQgjJopRjCBknZVVxynkDeGNoQNeVhpYcYtOwBFm5vrrI00wAUN4RbNNRBaxglOd5HCWCIHCAWN1wQEVRqKpqWwXSEEYpLWFDG7gNTGKEW+0ORHjLhmI81lTVdty6rgVz1DKG7nSz4DIsSB7eBfv7+3/x7/8P3/cppbksYozTLFcURVRURW96Tm9//8B1bQaN0ag8vz4LowxgwbTcKAzDIHtwdNxuTQ72Hupy7/zD5Tq4s2372fOP93d2fW9TpKkqoGg1vwlzy5YkSSqqvK6ZrAlMluI4JjWUBbN3MCElcdXee/nd/H5hItPp2GVe7erDgeA8sHd7D80t5fDR5Nnh4WFelpIkNU9q/zPfdV2IYdM0hFS306uzd98eHh4eHx/neZqBjFRMROrsfsNBtbu7G4dEEuzxSM2LtOXwPM8rlvY6g9k8C+PA6RoTy/rkk491w3r3w28PBq37xfK3331/dfb+1z//W8dx/5s//qcC4EVRSQLmnHe73bZlCILw9u1bWtcIs7enr/zYJ5z89S9/9a/+1b9arlayrHZ6bceRb27W797chtVby7IePXqSRLG3ua+LoMqF6V3z5PHeYr6WRMcLUt/3BUnkJTWYwSsQhqFuGg1nAIv2cHB5e9O+v1FV2TK1p88PR5uWZap/8x//CqOqqiqMakXmL55/qsrCr37xW9Y0r79/myflg8PHIrq+vZqpqloXDWS43+l/+PBhcHSURHHalCDO7m6uQF3/3hef7+3tvX///vzN6+cvXtA4WgTe/fmlIImHD477ckNb0s3NvFiXMnEEUZYUrQGI1NpsXkmyLkvYtUzEuAhQ4sea1UnSShTVf/wP/8lmvWB11es4tiTM06iRJFC3yiQnRYNF4+TxDkICK/LL2xtKiSzLmqJIvFrOF21NvDt7d3R4nC2XGsAKwZffnxq61W538zLd3Z/EcezHHhTBJz/6OIjCJM+6g64oK3GaVITkeXl5e7ellEiSEUWR4zi0Yp1227KstuZczD1OQbSM+s4g2HgnB48IIRxzSunl/c1P/uj3316cUUHYhBFE4myxcdx2FGVFkQGOJEmyTWOxXsiyjAWW8EDRFVVWBEFAEOqqjADEAJdSIbMAcTAaDK/qC4yxaXEAw+tpaFnW0rvhnJmNSFi2sz9ECCyWSw5oGGXr9bLVch4+fHgfVVhQdN26ubljDX/4+AlkuMjrhGf2qH2iPWtqKiBEEVB06fTyO3ttdjptYqr/7uf/bjm/twyzrL35+w/j8bAIvF9fXWRFygH9cHHhRYHba3/yox8dHx8/yJV2u71YLA73D58+fioJEmPs6Ohwi4jp9/s//vGPTdOEkEdR1DTN2enXqiMs1jPAESGF50UACA1hpjae32c/fHfe6rSenLx4+/7N/f0dYIzE64GtJWEWzVe6Zi3nK1EUR909U7eePH/wt7/6j6TZ2C2VwVun42q6JIba7e2NLha7B/urhbdaL0c7uw1XSc1qhgSp/ebNub+OWw5Lg5s8K2WBQgg5bZqmQQjIumhZhiXpjY4Hzjgt8tVqTQjhAiegGh9Nwrv06uqGxlTIJUYR4ngTx73xvtsd3s5WWVYYTscyTFXTsSAGYXT5YZHnebfbHfb2HUsz9cq27SovwrZDCLFUwVKFy8tbTIkty6Yo5nl6e/Z+dXttOa0HDx48f/4CQPj+wweE8GrtVQ0Z7R3Jhnd1cx1XzcV02R7eKIoSl6Vs23a/vww86e5ub29PNQ0lzdK8sCwLQlimZRZndV0LWhPnma7rUJQWm3Wr1XIsMwg8WZYt3QCsqcvSlFVBAHkU5RE4m1/M05UiqYPRiCogTVOjrRdNTgoSp0FN0oYSUDcCwhDzPA1fvT8ri6LVaqVxoiqDblsPPfTpp8+qqlrevffnxZsfLgzTFNTFzt6uY7c2XjQc9HVFddqtyWh8c3Y2vbiNfQ+U5cBxaJHZw97Bbl/X0OefPp4t5vP14n//d/9mPB67Lefk8cMnHz27vr10O+5wd/Dtt98iAWOML9bXtm3vjHY3m0242AiCgLFoaCrnPE/Sdru7bc1+ePJoNB7Kc3GzWdzNpl64OXywf7+ZD/YP4oo2cPny1auspAwiWZQaCg3NlCUtz8uyYu2e5bpulhUuqmmTCrIsICxiyBhqmlRV9CzLN+usKqPVYvrg0UNRAKvVynXbTYI0Q2saFqQRlsR2t4VFYeFv5t5akiS753YGHQRgURSapsiymBZ1EmaMMdvoWqpLqgJBrmtaU+fdVr/Mq+nNFCEw92eXFxf7+/sa1k8OnlxeXnp3HkfAtC2JSyqWKa8wI6E3D/yF2+5MdnaABKLIr9MMyjKDkHMOVR0xOYui5XyJMdZ13XHcbWcQAAAgCCFUNdl1u1VVRVHU643qui7LklIiMNYoimIYumEY7XY7TsIkjbIskyTBNN2qqjabtePYnU5na83lshbFnmaoDNL5fE4IAYjVZVVWOULIdV3btgEA2+q5bq+tW2w8Hp8cHRuaXhdlv9NjVdMURBaqneGBbdvr9TpKE8d1TdOklLISNyVEutSy260ng3574m88jIVPPvrUNmxJEEejkagaOmdZlvm+3xn0y4YEUYgQMgwNC8J8OS+KotVyzs/PXr161dBaFNCw1y3LfLNcUNIAxv2NjzBdzjaQM9+bN03V7tj7+/vtjuN5eUVYfzSWVXs+n98up4/h883y9u++/buDowe/9we/3x53zy8v/vpvfm6a9mins1jeZUnaarU4BUkSk7y0LEtVTASrTrsny/JWsg2CYD5fQQhns3m/N5Ilrd8bxbvZ2//zLxZo3hSk1WohDnVdFxBWZYU1lFGa5zmEmJQVBhCLMmhI6PtRkjRljgRpvLPz0eMTVhdpGJQp7tiHIpYO9g9Dfy1gWbP1hycP7E5+fn7+/fffZ2lhWRZjXFV0Xdc/+uijLX6g3++enJy0Wk6SJMNRP1ivoiiSRcnUVde2GKkDb71ezi8uLmbLBQDs8PiIUNpxrSTLNrN7VSkYx7JiEEKCuLRtue22Hbc73NmP8tJPCoAwY1WSxUEYVqQGAIRhnGVJkUQNqWQJR0lRNVNVM/M894I4Sou8qjESKeV1XTJaxHGKMVYlVZG10XAii4phGIw1i+WcUjqZjIsq+3//v/4/juO+ePHx+LifZZkXBqIoAih4XnA3nfq+77puw2hZlmmWRnFclqWmSY4zLEomKwJjbL6YxpFvWRbnoCxzDFEQrAmhtCaWZWwjbWmaiiK+vb3OspQ2TRQVgiCVZX5zG9q2zXg9HPV9XwjCtWvrnPPQX2mabBi6rusCEjHGmqwYmq5I0nqxMQ2D1qTVaimStLe77zrO5eVlDVir1dJ1fb1eXV1dWZbRH3QBAN9++9uiKKfTaZ5XvV6vLOuiyB88eEAUqcyrPK9FjPOy9j0P0QtRUCmhh/tHB3t7AIDA2+R5LoriFpURh+GHDxeWYbq2eXh46Lqupml3d3dBFJakJJwZmu7ariQIZZ4bWPPDQFYVp+V+8TtfHhwdlmXZdltRFLquCzmY3t7Vdd1utzFEeZ4bZnt/d78s6unN9PzD7eXFLWfoYG8/K/L5/F5SRUkRJElomno2n5ZVpUKlaZhjt0RR8r2wKGtNM1arVbvbEgX15METu2UwVDagyLNKNywAclGUOYcIipZlB2HCKJAkCUHOGbw6P18slozAg4ODbqu9ajYQkKoq4jhmrOGQ1l7ZNKRq8oqUdV2bjjUZj83HT+q6Tot8uVwqSnN4eNgQ6vthQ4CpWcPhUNds27Z937+/v6eUlm5LFPEWvVdk+dY75jrO/v7+aDQaDAah50+n06qqMESEkC3YX8RYUZTnzz+6v79fLpdBlBBC6oZiQbibza6vry3bBRh5vsc5f/78OYQwjuM///M/393dNXQrjuMsy7YM/21bjyAIpmlyzmVZDoMIACBJEiFc123HcURRZAwURcU5bxoWhqHjmJouVXWWJKQiBaygZRu3l1dRlIxG6qDX63U6m+WG02Z6exMFIUJCVRZJkimi1O32FGXb8ISLuPBXsySO8zzPE62pi7tuq9vvQ4FrhtrrdRiGUBA1w7Ace+XNARIhEvKCrNabOEt1XXcMfTzst1puEoVnp+873Z6la19+9vF6M/nm12/b7XZTV7fXV7qqfP7lFz/9yY85g7ujUeB7VVWlWWYoarfdHnZ7oKFVsSU5cEHAgiBCiP9LAWNDAWBJYpCGYSxWZb1lDiq23G53Hpwctbu9u7t7QQR5WSPM8zRpGsYZ3H4pqQBkiiokIVORLECZcwgAFEVJlVVJVqIohhCTmnIBLu4XeV5uMRiqJpRVSimVREhh4/sbVddMXWcQYIwRBwAgSZJN03Yst98fXlxeE8fyN15Z5pQQAICmaQgwyEHTNFVZNHUJAFvM5lfXF3/5l395tHsoy/JkMun1+1VDyroqiiIrcsux5/P5cr2SFAUgbFoWYyz0fNvubZ31W4wHFmVN01zHquoGQkjrmkrStiISIYQxhqzeShXbiFDTNFt0oxCE3ng8fv7i6cOHDyGEr1//8MMPPyiKlGVpVZWMMUFET589Ho/Hv/jFLwxTawD0vZXns+F4UOSpqekAc1038zxXZEVRpLpuPO82T1LOIWvo8cHEddw0is/fvr+/mwkQKVh19K5r9Cy1rYtW+3gyHu+cPHrY7XYph47W2VIt67ouiqzXWm83chDC8d4uY2AdRcuzs1evXt3e3vq+X3O8ZQplaazrugBhUWa9Tvf4+PD8w+l6PlM1OVqv7q4ugiD49ptvzl/e9ftdW9erqnj17ffvZBSGm/6gd3szVxVnvLOHRY0heTDuQGH96t0pIByqSp1nQZ6zu5s/7bY/mQytrjPfLBhjQKDL1e352QfbsnRdDzaepVq2bauqCgDe3z9SZK3dbne73bKsHz58yDn/+c9/EYZpUZAwTOuaPTo+iaIIUu6aNmzgoN0HABiqIUCB1iRIM0GQOGOiigQA0zACVYbrnKZNVjew0zoYDqskTvKsrmtvvry9vHj44IRSgkUNIyEIijzNHp08dN325eX1d99+H4bRk8fPHMv9f/4//u+qqvZ6vfFwsL83xhgXeaKrari8hYxosixhVKbJaj7L04wxxmlTxPG7V981VVLW9fHJgyZLp4sbbahgrDru0A+DvKoUJnCoSrr96v2Z0+kXNcnjOC1rgAXPX13fXitKT1VVjMWKsDTOVUWQFVUVtNn8ftjvj3YOCCHB9ZUgyVXdRFGkYFAktWUZgiDLomqbDmcsSZINRJKkrP1lVqS9Tp+wUjVkP1rd/3apaYokSZKsJ3G2WC3TNO6PhlhE0/u7+WoJEDctVVZBEIahtyI10jSNNLUfJB6AoigjhDAWHctWNdWRVbpVfAWIsayokqELG28lyUgU5aapDUMfTwZBEOR5ut4sdEMydHG1DgxzwFhTkwxXkiAgSmpCCKBA1zTbMFVZC4NAwtJgOBr2+7P7uWWahmGUeYGxwCkbD0fj4ahpiG3blJGzs7PryxvXteuiqUtACUiiVBCEyWjvYjkXoIQ4gRypsuaYxLIsWVQ2K282n1JSbaGcgiAIkmSa1puzN5Zl7U52er3ejz7+ZDjqbyWGhtHXr1/HWToYDk8en4wm46Iqr84u7tkiTdNnz555UahomqrreZ6vNmt/4yVJcvb+VNd1x7Q6nU7TNKvVquQEQ8O2HSxqttMWFWlbfoMxCiMvf59giX3x4y/+8Ge/J8nw22+/JRmsK6ZYAqNoudqwhnU6Xc+PLi+vRRmbrtrpjgqSeuF8uUxsp08pJgTezzZI1NKkjKMc4szQzbIoEORRlJR5KWJ5Mhzt7u5NRjuz6Y3vb6qmghDrmpZXICxLWrPN2iP1O91QHz5+fKLbtu1qmlFmpbXb8v3w7nba6/UU2bi/nWHMbds+OzsrioIQYlmWLMtbX8JqtXr86KFlm03T3N3dUtoYhj4Y9CEEeZ6ladqQOgj9m9vrMArajss5KypCKJUUjXO+WK2X6w2AMCtLURTzPBVkxbFtUZJEUUySpKkr13W3+UnO+e7uriRJoijP53OE0HrtbWvit0S17fOdAQlBnqU1xg3nuG6aus45B5PdQwjpYnmX5VGv31aUVpKGUZK1FRUBmMfp/O6eUuZ5niyIQRCsVpvRYKhJYo2BLKFey7FtO8uyumDJpiqKShYa0RA5oFWdrNbThlclyVs99+NPP9qE0XK9SpLk5uYGYrmsaJVHWRRXWVplhWHZtq50u11dVaPQ5wF3TCP2PJKlmR8g1uxPRs+ePfeWs6//7hdRuFFVXZCEPI54WWqy5JhDAUDdMm3DoO12UaMkScqiEkRJlTUAAAeAMcYhz8siCAJCaoTFhtEkzuMoqefFcDiUZUWWFdvWBVkkrBElUTO6QRCVBUENIE0TxT7nFAAgiaoi6xiJVV5xzjVD4AzRmlqW0xBGG4pl0fM8z/OGw3Fd1G1TV1VVM0wOYVHVFSmrEmCM0zQVRZlSSqpGkiTLMAWI6qLc3xtrmracz6uqKLK8rPKWbSdpdHdzDTjftqlJktDpdBAGW/aGoqrdXk+3TIRQVuRJVtQNKetK0XQsCoTSIsvvp9Ntm5SIkYAghwAAzBgDpGKs2ZKeK1LXdS3VNRLF7ZQgiqIM0db5yDnfOhsEQZAkSZBlkXM6Hg8nk9Fms5YkUZYl09IBpPP5vN12J5PRZDKyLFMUcbvtboINYpWsKrvjwXx+BzCM0yThsSBInHNS0y0lTRRF0zQ1TXv+7AhjoUizWcPLrEQAa7KImOj7EWzUwx89/cOf/aP9kxMAAKkIQogRVOeENFRRTMWxZ/fe3/7iN69fv3r49CGS5fFkImhKhfjVYn4zn6mqut54giCIGG02G6cyRQEFm7WmyIv5vYjhweEuRiCN/bevXgaBN735ICDR0OT1ZpnkiSQJR0cHDeFNjTESlqvUtKqWO5QVpdPpdLpDQZRfvjxtgMqwevLkk4rUDZcU2RqM958//1Gappbp5knKGOQMWZpdKtV3L1+bpnlycqJpGqXg1dkbXTfb7bbrur4XW5YV+NG9tNB1/fLyJo7jnd6OqdpN00hYZU20JSDZtr0lwSVJhqGgKoqhaCIWyzg1ZaqLgixLTV4UwQY3TcdUTUXceEGdZWkYkpI8ePBAEbXFevXdD28ePz3pdHq2bZ+eftgSvjDGVVVwTr/88vPd3V3dUPM8i+IgCII0jUFVlEVRYQFzXhYZ4HQ0HuxNdqIoEjGMolBCQJSxhrisS0VQRCHVTcMwnJIAgAssqOsgydmiJo2k15dXN1hWDo+Pjx891jTtN7/5zevXrx+fPBxPhqIo3lOapHF5v1wsPV1T+qMdRTU0HZmmX5Yl4Pzm+trVzcCPFUmt8iaXS13XBSyFYVik2XA4XCxmaZr/8T/9k8nu8OBot9Vq+UkTJfFq7UuKenB4bDnubDmVVSlJ4zAJkzw0TV01RFzTICJlHbXdybb7WBAhJU2e54Ko7O9PXMeRRKVpmsiP8rygVLBtV9d1hCrAqGtbm42va4qmSx3XGfRat9Mp42WRxy8+fqbqiFJSVSV1tG2otSiqLImrogwDvBFEBDAlzDbMk+MHn3zyiSzKVVFyykajUVJVnheYpq3r6jaukmXp+3dn3W5/Mpns7jZFUYxGI9u2DUNTFYPXvGN3Bu3R0dERgsLt9W2el3EUGIb24fT0/PT04cOHiqRMp1NVVR8/fowAPjl+yCmYz+fffffdxYWpqupg2EvTPAzjJEkmk0mv1W2Z7rV3fXd+s1xHTdM8evqEEGJYZlmWTV3XVTMr5mfvP8xmix9/8eX+7sF6vfa8oCqaRRR/9+qDAFFDag5F02rNZou0+O7x45Od3XFdl+/evWl3rJ/9gz/SrX+oqNJ3vzmLo2y98uq6SZKcUuB5gevas/kyTqPhpOd2DCjzNGVh5BtWlBSlHxZhHImSKUpSRUAUprJkYCQWaSlgqdPpHu4cWJYFOaA1ef/+NE0TCLmId2zblBoV0JAxOOrvJFl8P11CIDYNmEwm3W7XMp0GMEr5HZi2Wq1+bxx6kecFWzDitvaXUhrHcRQFg8HAsizGmuPjQ0mSVovlZrO6v78bDHoQ8V6/AyCDHBRFFsdhWeZFIS2X86pKyrK0bdu27ShOVqvV1j3gui6AEAMuKzKDoCpzCFi75UiKnCRJFCYY40ePHu3s7CAkxHGMMfa8YL1eby0Of89CIAXdOu9Mx2y3O2WVr9ersswbRoejjmm5eVnkRZmVvCaVbdtVWiGKqrye3c3zPE+ieMt9QozKInZd2zI0TVH7vZau65oqnv7wrsoD1jRuq60qelYUWV4u1jNRk6PE98M0r8liuVxvNgCjmpSqZsVhwupClyVTUTRNlxCUBVg3jQZBHMeWYa7ms4uLi/PLqyAILKO/mN7tjUfDXjv2fdA0bccuimI1n62Xq06nM+qPRIgo57Zmtkwnbe4hECDIBEGQVRUAwGmzhSFiBIqyAoAjJAHANN2mlAZxcDu9hxAOh0PN1DqdXlmWACAEhaLIwtCnDQQAVkUeM9o0bNSfYChQwqqixqIgYklAYtNQQzcKUCR1LYtSU5M8z8syX60WmSV99tlnB4eTJMsXqzUUpKqsbjcbLEimacuiQhFralKkmSRJEELMmakqsN9WJXm5XLx//35dFUHgJXFomToAYLPZRFFkWYaiKLKkckyRIAGMmqZhgBNKRVGUVaWtdBRNlySpqMowTquiVCTZdh0RK9vo7H+pnmJckSSo87phVVXVTdGoEucabxpKKeKcS4hzzhhDCG1/oSiKmqYJBwf7lmVZtj69v3n37h2EcHdvFEWR41j39zeWZdi2uVjMwmiTpIHneVWZCQh1XXtvZ3J7exNlybaOs9Pv/P1aTBRFQRa2kIfp9F4QBEu3Dg+PHaNdZCWniBRNr0sOD45/53d+srd7srr3X799F0epZVmT0d4PP/zw5s0rt2P96EcfA8Q5glVDrm9uoiwdIJClxWy5WqzXaVGImtHrddI0JVU9Gg9/98svRAH9/D//pzjxFQW1bEvV5DSO4jCII58yYtl6bzIZjUZlE0dpAJA42Tk4eagRQq6vr5dTX8Sz8WQYeFGW5IeHh3/yL/4vCP41giqphEcPP2Gcq3KLVCD0q0H/IJRDAYm2ZezvUsswx4OhIrn31zNd1/f29ra34Onph83mZrlYm6Ypy/LJycOPP/5kMBh0u31dN4ui8GZ3454BMWp1OpxDw7ElSdJNgyHc6vQkRTNVjVOmq6qhqSGjN9fv8jy3bTuKojSNsyzLihwgwXZdTTYG/S7mTJFkx2mZpj2fLZ8+frZcLpfzlYBwp9X21h5G4Mnjxx999NHOzni5XHietymzzWaFMQSc9zqt++k8yxJBECRFtmy30+72BqNWpxcEQVVmjmN1Oy2ImKEquoRuLk+LMgOAMU41TdNNM0jyKC1avb6um5Ryf7lMkjQOI8O0//AnP+n11rquM8riMCrLUsCibhiGph4fHw6GOy+//S2EHCOYJknbtbMoLPwoTVMMeJ7GReYaqiIJgq6oJan9KJyvlpKoyJp6dnG+8vw/+7M/0zivG5IkkecHt7e3DDVxmrC4ma3u0zwRBFhU2d00KkkJIeyP+lVWBWGZpUXTNHVJPM9znJYo4clkslwub29v/bUvimKvN1BVVZbl1WxhaZYqyds6RN/3kyR5+PjR7mS0vzv6zTe/pk096Hd8fyPJkLKq220nUVQVmaJIkogZYZQ0DW3qoo4a6m82TU1c20lxSkqSxdlwZ7xardrttu/73tp7/f3r4bDfa3e33W6qYe6M9uq6rnLiWuriftN2eoSQIs+bsjFNtdNqM4c1Dfvw/hQAZlqm41oYCtsjAmMsDqLRaDTsDZaz+cX1TRRFALCDgwOMMRZFS7eyOHv525eaImdZloexLIiIg6aqto/pLMuytCjLcrlc+0Gka2a3P1Y14276fRhGuq7v7J8QBuarRVlkvXarNxhwTi1b1zTtd37nC1HE//lv/vO333zndtqPHj362c9+xioNi9L3334fp7FuKcGmnC1WhqV1Oq3lZlnelGnVdjsWbVBRgdUi8tM0zyvSYFW1e8NB3cCqqhRZ73bsl799ySnvtNp/8Ad/GIfJuzdvLs4uwzDEGGu6oip6y+7kSlpWuc51BhkhJKLJarWp6yZLC85QURT+3N/Z2dsmOERBbbValPLp3WKrpW4/siBCCIui2PoNW61Wu90WseD7/vZxbBrGaDSq67ouK0opxnjLTQmCoCgTSqkgSlgQwzAMw7DhTBCEOI673a6iqlmWlVWh67rlOgihu/kcALBVvrIsS9P06OjBs2fPFovFeu0hhEzT9DwvSZKqqqqqwjLGGFuWNegNdMtcLKokzdIsWXsbxnlDq7xiQACUNXXdiApI4lRVVVEQEZQNXWYEMgqzrIBAzLPSNBvHcXRVY4yWZYEQnC+mSRw1lFqWhQTIIa9pHa5mnUFfFIWa5Lqstm2TNY2KMSRkNZ22W07bsdst17YMCQEqYsgIoc32hrRdZ3o3TdM88ELDMAGnURTVdS0Jom3bpma0W60kzYuC9LsD3TRISaqyUVVVERUBS6KgqbpDuUBpwwASMQQYA8A4ZUgQG85kQQQANA1XNRsA4OCCkCpN06woKQcNoxAjEQuW5XBGNusVbYBlurbpmIbNGMvijDccYAAh1BTV0HSIYVGUGaMMcAQY5JQDKohIkcVKEgJvQZpS0yUOmRSKRZkVRZElaZxkrVaxVevqMs8Rch3LcRyBA1aXuiTbjrlZL2b3N4Hnk6YqikJRZFPTGWPbI5wkSVmW1XVNCN2+ZxvGMMaGZZum+fjpkyLNIhpBCCUsYIwBZXmU6Ka45fpIksQ4Ak2NAJdlkfOaNXVVVaRSiVyWlHLORVmqENwuqBhjW88mhFCSJEHTpS++/PTgYO+rr756//5tv99ttVpJEm28FUSc8SYIvdn8rtfrKYpMSK1JiAJA6nSzuKekYg3RVVVWVQEKHMPt1iJJkvV67SEoCQLJ20mSqbLSdtoYioqmt52uqTsttzccTHTdfP3+/fv3Z4vlmlIOsfg//y//Zr1e+fFmNBqUtBQkeHN3k9X50eDQdq26rk8/nL1587aoiGG1GgIeHO4wxooi3xlP/ugP/zD0NmfvXy/n89ni3jAlXLO0iAUZCaJQVdwQdCxzycJ7D3f1lkEJF2TJclur+Wo2W7VaLVO3Ok777u7a36w39/dd29gf9Fu2LTCmiEIYRUkQQgFPr++63a4iqYSQfqfbaw8FhBVFoRQ+evRoa57YbDbb7s1erzccDquSVFWVZammqYwxhEC77WaZNHRbgiQKsiSIotFqC5LQAE4IqTm1ui3DMnVVK9MEQWg5NqXUaLWSqipJU5JGqnIAmGFokiSlSSTK6mh/d7ZaJ1EAGMMYK5JU5UXbceu6SaykzMqnjx7/+Isv//if/OOrq6tf/u3PP3w4ffDgqNfvxCEAgJGGzO59SqlmWgDhoiIlacqGpyUhVQGQUFZks9m4jglYbfXa+3uT++sfwmADeVUz7rR6iiRwShjAdVkWWR57gRcE0+l3//Ev/sOTJ09+9rOf7Q67AKA4jkFT06pSNPXoYP/BgweMElkSijwNNpvxaLCa3tjy4aOj3endoiE4z6I09Tgng2EXY2hZlg54EmdRmChKE8WprBieH6834XS5BoADBDx/dX59yiEzDE3WlJu7WyxwDnlVFUmREEKwiGRZNmW3aRpFlUyjSwmTZVlVdVEULy8v0yQnhIqiDCHKshzBUJaLm5s7w3B6vd5qvorkiHNeknp/f980DNu1pO+kl7/9xu067ba7t3MQJ2EcBFHkV0Vp27ahGnVJ6pIIEFPCHNNp6uq3X31dltWgO/j7Vo4tXN1xHFVV1+s1QihJstvbaVEU/X4fI+nDhw9Jknz55Zc7OxLJSkqp7/sCxJqstl3HNE1VVVlT9wddAUvdbtc07fFkUhQl59xfrVlDW63WRx99TChdrhbrzcYw7bLIEBIYBXEYVVnhWrZpGOPu8OGzj7IsMySlyjLothDjGCIBiYIgaJoBOIziRNFNJoiCphWUCpQxSmRNBYABDDXL6LBOr+NiDKMo0nVd03Tf99++OVUV4+jo6Hd+8qVp6VVVRn4oiuL52UUQZIKMVENFIdz4vqSLqqliUWkZJgdSWYKmETiEomy1W0MsaIw1sqjkeV6VDUKCACGG6N3rN0mUkJrYZkvTlIqUq8UGAMB4nVel45qSIgKOKGVlVUVh3G4VgAJAge/7sqwCAOq6Xi6XkCHbtltu7/zsfAvGhxB2u11JEmazGWNsPOpSSsoy1w1VknuyIiZpBFizbbNkDW0aIknCcNhvu26e50mmDIfDyWQSBMHl9e39fKkbaqvVCsMQQjCZTHYm4zRNF4tFGkfbGBfnnDNYVVWappeXl5KkOI4jCMI2gLe7uxsEwbY1WJIk3dYghLZtYAHe39/d3t6WZW2YTprG93PP9zdFnbZajmGbhtmz7N7+yYAQMp/N7mcBhJwQIiAQx6Uo4Y0fY0kWJKVhIIhCRVEcx7GdtiRrfhTXjJc1YQDqhkV4mud5u+UmcWxbjmOYAmNREMdxHEZJV1d3et22a9d1kReFgICIUV1VDKHhZG8wnJyeXbitvqxMTbMNAGq32zs7e9//8HqxWNYNV+5XWV4CLE529lVVD6OE1FxSxOlsc3d3V4quKMm6IeRpQkgFgIAx5JRWVYUEDBsAJIFSnpeloSoQQoQVQzERVgCQAj8RsCTJgm3bx8fHs/vFcrmJ/RQDKEBBlRQA0DpZM97IsizLooghaSpa0SJPuKbqui6JclHGpCoURUGA2KZyt06vzj9Ioqxoep5kSZQyxh2npaq6qqq6JokYRbyoygwLWq9jFkkRhRtFURCkZZ4JGALW9Dtd3/cYaSDiW5iHLMuKoiRJNF8t66ohhGzzO6IsWZazZXqKIoIQFnVFyvrvTQaiqHLOiSRtGUoQCFvdIYaxjzFgjFNSVUVRVNt2yhqB7ZSw5XdtGQ8IIcFxLNe137x59d133waBF0VBu+NKkrRarShtbm9vMMaKKvkBwgIcjvoaboqq5hD7m7WuKVVDRFwxxtbrjW4ZlmUZuhVFAaXUspz+oHu8d3R7e5tGSZjmgEFTMw2TqZxVDfGiYOX5s9kyylKOUZrFYRjfrqZ1XWZ1fnp5ere8YLChlCiKdHZ++hd/8X+Ionw/Wy0XG4SkdsvNsoKXpN/rzcsqCfzvf/vbd+/fnL57jzA3Td2wjDgOZ+t5t9tWVDMnOZIRUMjr8+8YhYPeuNcdS0hZe5t//5d/KWFxf3cPAZCFMabc0bRgtfz+668tswUIaluoLmmRlsH60rCczfJyMb8oy7KuGufLL5989Om2qKIm1qPHx0mS+F54e3tdVVWn4xwdPRgMBmEYxnGKMVqu5nESNg2xbSvLUtKw+XqORQEIGMlikcUcwiRLBoNBXleh7/c7Xd3QNFHGkrjxvU2cVwC6tiNzjiQRiXSbz6+qjALaci0KGG1KEYtnF2fL+Wy9HvX7w6qq+v3+p59+enz0gHMehuHP//ZvVqtVWaZPnp4gBJIkBpAlSXJ7dnVwcNCWlTgtwySXDcfp9QVZ/eH1m6bhV3f3kFWyJExGXVEUR4PBztitypDTrCqqXBLSxEhiX9YcyzDzJD1985ZS5mi62PC7s4v/7X4BNXdnb/fk5OTx8YFrGrPl4v72htaVZVl5HHQcZ3l3peJhuJrfY/bpp59KgpimSZqmSRbblq5IYkVqWZYFWaINf/joadMwCMU/++/+5Xy+IA1qtc3T09OsLBRFkmXRtA0k4vningOKRYkxVjWUM2iYtqZpCAEJypxzjMSmYVVZqqouy8p8toyC1DAsy7Qdo53nZZ7nRe4LgpDGRejFL55+rIjaZuNtHWTLhVe3mjRNHz58+ObNK1LWrmV3Wi3TNPM0wggYprq/u2NZduCFZVaZmqmr+tH+kb8JNiuPlLUoiookm4bprf2ri+vQjz7//HNowUFv+NVXX4VhSAjp9foCEtdLvyoaXbUMzQYM397ctdtty7DHw8nezm6SxP7GS9P0k48+CoLAD0MI0La6Pori2WxxvLPv+f7FxUVWpqZtcwA1TVdVdTabFUUlCEK31e622r1WW5Wlsiw3s5mumxfvTiVFBoTFWb4FD5c1CaPYC4O4LHd398+vrxFCRV4NsVTX5aDX6Tt9y1AhbZLYmy0Xmiz9x//8n0RRVGTNNJ08rk/fXzW1sHswHE36P/npl2ma+mufM7LZ+IIIb6ZXdV0WZVbXdZZloiL2Bv2iqrKCMgZ1w9QNx7Tamm5RSpIkuXn3PksL1nCEhNnd7PTde0ro4eHxcLA7Ho/KMvdDTxRQ1VBFVEzD1k3NMh3HcbIiz7JsPJy4bjvP7/M8f/XqlWXaum5whnkDTNN69PCZYznffPPNeu0FQWAbZqvVStP04OBgd3cXQhhFkaoopmnGcTydTtuOm2VZURQYoi0bzXXdw/39oijCNHv06NFkND4/P7+4uKCUuq5rWnqappQ2AIBer2Oa+mq1SONUU5RGEPM8FwXZcRzTNLMsy/M8CILtPhlj7DhOp9PZipWSJDEkpmnKQVNV+XxxHwSB7bZabjtOc1lUev2JFwbT+4Xs57/7k9/57LM/2B90qqr6Fn57dnbqeWva1O22KyimLGNBEhgU0pKkWUEZ6XREQVFHO8dN05DLi6KuijCBgmg7js7Rdu2xmM1nN3eQwzSOq6LUEXYHnXHLdBSRlulqfl/XpeM4uqFijBlAh8cP8qyMk7rb2xMVe+lFvXanqqkfx1c3U8Np7+0fr31/dr/oDYagoKRBSJAVw0nTajabvX//vr3/eDIZmYZNCCmqHCEIIaob0jTN1tUoSQqlvK4oNCSEUJ1hVdM1VeCA1IQxBkRBVmRNVfT9/QNSsNlsFYU54kJTc0apIgsQMs4IY4g0JaeSaZqdru37PhYo5zwJI9u2h+NRWZYNrXudPudwcT8DSCIMcChiLAEORFHMsoQ1lSzjwF8tV/dxNEewRKX44cMHTdMIIWmeSRhLktjrdTVN3a4NZFneQqMRQoZhfb63u+XoNIxuD6KMAYzxarXSVB1CWKRZVRFJVbazxRbYACHEEKiqIgiiLMuapi2W6yRJWENEUUQAsKbmnItY2y4Stu6ELV+VUgohFJ48eTKfz//1v/7XNzfes+e7URRd38CHD09kWeKc3d5d27Y90SfT6RQANhwOHx8eMIBEWTHdliQr78+vXr56PVutAAC6bmxH3TAM0zSRFUFVdzeeTxm3Xdc2bAwFDAUG+Gy56A938irP0iIu0jAOvDCSJGmw09872WOsqUmlKIJhqmG0ub4+j5MojpJXr79nFGmqhaHQEJqnRRKn11XKavLqzSuEwHq1mM2mpqEfHO3LMj44OPjuh29upzcVKRgYUEZs2954y9ls2e0MRVUq6+L85spUrLquJUVQRGk5X2xm01639ezJwygKsiBURXp/NRMliUE47Kl5VYpSmaSL2XxBCM3y8ujBBOCnZZHOl/PVcnNz+n4wGFi2MRoPtkqYZTpFURBSiSKWZdn3N7qup2l6eHj47v2bZJ2/PX0vKnKr33707CmUBKfrWrKIZHHlB+en70ldP3nwwHadPEmvrq4aVd4/efyHf/B7pMjrKk8CP0viKPBtx4rCuCiSu+ur86vrnd29IIz3dsZlWUZRRAh59uzFwcEBZ+Df/tt/++7dO9LUkiTIsuR53sXF2eXV+cnJiSQJjx4/2d3dFUT5brYpCeuP2hBJpxfX51e3Rwe7FEDLsDRDPzl51O+1DE3d3+nF4ZoBXJZlkSe+t9ws13YbnJ2++/ijz0zdWMwWTVlLggAhCjee4qLV/N617aMH1qDfzfJkPluul/OnT59en3u2qd1dXT0+2uekvr28+MmXn3W6rm4oSiTohry3v9Prd1brNeeQASRr0p/8yZ/Iso4Eudvp39/Pp9PZOoyTIhIEwXbMNE8Zp7IkiZJkiVa312OQ0ZubhtHhcPzpp58eHh6upqvZbLZcrmezme8FnU630+7leakoWl2RoIlMzVRVXZbVLM3LspREtapIrzewLOfi4ooBruv6xdk5FFBZpf/9//VfSpKwXi8ZA6fvP5CmkkQsCEiSFMexVFnd0HVNSgBMWZYNXc/TwrZtpSMbmr5t6Hn04kVVVR8+fPjiiy9ms9n9/f319fVHH33SNM3Jycnbt2+vrq52d3efPX1hGMarH1677ZYAhboo0ygts5wxJsmCifTFctYQZhmmaTkACIEfiaI4mUw8zzs7O/twfi6rChIEQpuyLAEADx48ePzo0aDddWyzTLIkCOMwCsNQluXJoL9YrBDGpK7TKDZsy7btXq/nh5GgqIKs+HF0ez/r9/vtfpdDFsXBoNfaO9j7+NnTTtt+/f23N1eXN5dXddUwClxHb7f7nIE8qzabQNZBXqQ7+yNG+Kvy+1bHlWTB9/3ldNZutyHkAPE4S1GJdzgvy3IxX5uWPt7ZOdh/sLuzn2bxfH5/ezs9Oz33PY8SNumPOeeUsvPzTRYn+QPS7/d7vYGqyRUp54t0tpj5kT8aDTVD1TRD181ETRVFCf3g1Q9vVqtVXTcttw0AUBRl1B8jJPy9vWt7dHMcp9ttbxWi4aivqNI2JiZJQlnmjDWuZXa77TxPEYR5nsuKaJhap9Mqy7JqwGq1ms/nt7e3AOFnz56ZphknYavVEkVBEITlfA4A2N+dsMmIUno5W1ZVZehWu92uqmqLiNgm1BaLxTahGsdxURRbAzhWpDjxdVOz7LbrOk3T6IZFKW23u0VZCrI01ixZMZAANa2V52y+CieTyZNnH0uKdn5+tt6sNN02TE1RRE2VNV1irMlrImCsaIbtthc3IRaEivCNF5V1LSkyluS8qCgN9nb2t72FuqYpABZY1GTl8bPHqiaLgG68tbdcIBFZps6YbFsuQNB0W2/f/Xa+9g5Pnhimu96EN/n9gwcP+oNJtz9QdZMw5vmhYdlYUM4vrwRBOjg8VhVzsQz8MJEU3Q+i8WSi60aWZQAgDgEAgFKKRAEAUBSVJNYIIAjxdlMY336glKdpzJoqyyNdVwEAAKDT09OiqHu9AUaKADcN4RBgAJimKU3TcM4AJxhrtm2enBzv7O/9L//r/1zkDeVNVReTnYdPnz5++/btPA1+9NGnjuPmRXVzN6cMdntuTenddHZwcEDrCkKuapJWShiyskryIiQRvrm93u4OBUHodrsQAITQZrMhTbUFdCZJEkWR5Tiqqv7m268AR1uD4bbNq64bzjmhDQSIUipJ0ni8M5lMHMdpmma1Xm/LybavfEXTtn6Fdsf1faeua0mRIMTbtYGqqmmaQgi3xsbtHUUIaZpGyPPyP/2nv+YcD3ouyaGt9dI0nd34Bwf772ZvLaM7GA4VXT+9vux0u5ssvg2cXr+jurbadj5cnK+SDYG81RsO+juk5rqiV0WiCg6ElY6l1Ftzx7y8/KAp9mRwcHL4jNV8MZsPen1AWVWkX3/1y9PT0ygpaANstyNgeVNMdV23dEuSJAGJnPKqYCzDLAZGywKQiYSaGJZNjtKkjSGj1bu3t3VWdPqDJFzKIjo4OBjtTI5PjvI8jqJMMyxRke2WvVjN/cTTbDQSzX5fD4vTi7uwzJv24OOdh3aZcsFSIm9TZOntevXg+VO916G0/n49293dr5vm/Pxc0XTXdess/cf/3b949f0PjIHzs4swTYIg2GLsZFHKcz8MwWS8c3K8kyQJrfMiA4iDNPCOjo45Za9+eEMp7bgd73b68OHD8+rdjz87+eHNa5nLJFns7O3KsDZa5nq97hpiM2hvFrcvs6DdahVFQYWmM9r5x3/6x8PDQ57nv/7VrzYlXfqpolh6q0/4/f/2H38eBAHnfPn2jaqqzXqxR/afPXtxcnJSFNn7969P37+/u7uzLEmTLQCArIj+YlFVlaNamZ90Op2d4/1+b0AIb16dVUnx5tu3T548O9o5fv3NG1WxRnuHqiFIw658MIBtsxRg+6OPq+n08vR9z3GK2PMX/tDtnV+/3T95MV8t50HojMdRFEiq7M3vOy3nX/6P/+O2822eZeu1N9zZ3T151Ol0rs7Os2p5efl2er/5+qvXP/29f/K3f/Ofk4jZMrg9v6qb5tGTp/1eO0rCvCrTrGAQTcY7HMG0SAddYz67rotKFujpu+86tqqoKkTEtGTKWZz6WOKj0WS9XpZl2eu3Tx4d7I4nk8lIEeBHX3yx4/tRELz85ttX330/Hg8O9vdvr24jb6VphuvYWVYUNTMtJ6tKRiBVhKDOaxG6k8EkP4qi6OnjJ0EQVFVV1vX333/4yU9+93Avf/Xq1XS6iON4f3c06T33PG92k0NY3F5ver2BY42KvLy4nq/mC0PTd3aPIIRAEC8uLiY7B45uAsZfvvxm43vfvXn56PnD3k6nLEsv3si68vjJk/3dA0MzLk8vby9u93f6T08OKOfz1Ww6nY73dyVFyYoizYvr+1vHcjnSlrOpKms7o8PLy8ub2er6fmm2u6KIHz5+ghA4P/+Q5zlnjabLgJPZ3e39zW2WpKSuszjRgdTRzJOjQ0FRl/7GNPXRZEJAs3e0v3N8iDB+9+795eXl8cFuHMeGKqVpiFm9nF932kq463QH8uGjUQPC6eoDLUleZlEm8wXvdHreLBh1xy2lBVT24fKCc9py7N7vfEpo/Ytf/KKoIy7UQRiIM9jrDkzbUZEqmcrOcYUx/unP/mD/8EgUxU5r8Obl22//7tv1/VoTdd1SOKe/+eqXNckme5JtW5vF9Ne/+GtRFLEo2LadFnnsVbFfi8DKslXDmeXY7XZ7USSX5ZpX6oPRU0EQ0jS5+nD17PkTVUC6rq4WV4F3ZxvC7G4NKVwtZ9PbG4SEqqiTOOCM1HWdAiC1WgKC3nqlilL/2bMXT57+h//wV61Wq+2017PVJVYVRVmvFrPZjFJ6eXk5Ho+rory7uz8+Pt7b25tOp2lS5HkuCIJhGJRyy2oNLB7xCFOIGtDk9fp+qWjqk5OHtm7M76dlWe7tTOIoWm8WnueNRiN7cGC4g4KAq+ms4kx3bYQRluThsL3YeFmW9fr9ycMDt9VxXff87i6vwt70+vc+//z508fe7Lq3O3jw4CDOwiD1vWC+c/xpGIbRej3sD9LYm9/hCkez+4WfLvqDNiHN2zfvg/VqZzwRRTePo45rbtvv3IE9Vnuu6+qi5PkeACAMI8PQRFEOg7TXnYhIa7ldzoTXb96Lil7UpL8zzpsmXi1VVX/79m2r1bq6udlsVpRxTunN/QYI9H59h5T68PiB1YZOJYi6ali9NJzdlB7Cgtt2hpOxIIlXN3er1Wq5DiRJib3AMIxet58SoktSEnF/E0kY6XrbNbvBmtcpJgW+u3pnmXqr5dYNqmitaYos09VqJVCo6Jq32Tx9+riu66u7s89/9wWp4yRYpHEkIvxHv/97O932WMKpJNxcX5Gd8YNnD/7i3//V1eUNFOXZ3eVyEyiamiernZ2dk6NHsoQmPevRwXC9miPePDp2WdZ69eZUYAUCSuBXmq7Gic8RlxRNVnXXbUVJDjhyLMfzvCanuq5UReUtNpxzjiCEUJZlTVMNw9j2uRPafDh/X1UVpRQiBWMMALi/u9V1vdPrOo4jSZJhW4xRy1I456omd9rjIAjupxeQI9M087yscgEhxBgTMfZ9T/j5z//6w4d3eZ5KggxgA6GgKKLrWs9fPE6L4Oz8dHpfHyi7OztDp+VEUfTh/P3L71LCyGgyTPPMdruj8UA3WpbZCfwYACAgbW9vT5a5oYm+79/c3FRFY8quv/ZPy3eT0WR3MhoOB0G49oPV3fx67t03jGMkwwI1Da1BWpM89DeEUMC4iCXEEWsob+iyqSAHuiqLIuascV2n3+8jWM/n87KoEWeEkCxN67qUJAEwSgiZzaZJGLfaNkKCaRhxkrT65rjfEUXxze3U2/i7o/3ReDCfenkc27b56OnJbHp/c3Px+vR1q222O7YkiAihTqtVjMc3d9OXL1/mWfHllz/+9NNPWcNVQREQbpqmYEyVlcFgMB6P0zTlgB0eHeVZ9uqHN57ntZ12u91mjJKaNE1TliVvQ9XQOYKu63IEHz5+tHd4oKgqEnCe56RpsiwzNd148IBSKksShHA5myOENovlxekZKcokSdbLVZqmmEMBoMV0JiL8yUcfn5+fB0Fwd3fXdlvtdvtnv/cPZVn5xS9+dX19DSEEjMqSqmmaIglb41VeFFEYpmkaBLHvR1Gefk+/35nsI4R6vd7f/eprwzAcx/nkk486vVaU+bKGHMfZis1IQru7u6PRaH57QzmjnGUZkeXCcRzf9zvDPdsx67rEGMdx3DTMsKxPPvrYtu2K1NfXt7/4xa+2c25Zlk+fPn3x/Ol6Pvuq0765urJt+9GjR0EUOi7c3d21XXdnb59D1IS+JElyw+Is3x7+IMSKqACOBFGUZdl124ZhKJpKaJOWBWsqSVIFUWkIVWTdNBzHtQ3DUGSjLBpS53eLHxAAW1XY33iuZe+OxoPBYDlfdlrt8WTX98O7+8X9dEoZ6HS6e7vDTqfz4Oj4X/y3f/abX/0dQqjVatVllaTR3d2da1mwYQJE9v+/pzNpkiO70uubffYYPIaMiByQyEyggCxUFQE2VVYkW23G3rTJ1KalzPQv27TRRpS0YJNdAwtEAQWgEjlnZMbk4fPwBn9aeFvvw2IZcd+95/uO622YFfMIQZKlxXKxrry61+tZllOW5dnZmes4Wus0TRupsiwzDKOVCkrJV6vVh7NfANJ7B7tffvmlEHyzWa9W6zROHMf7zcuvDw8ef/j5w5s3r6+vb3/9m1PGWC8IANZxkrx5/TcuBTNNz+uURWFQsxHSMAzLsqSUknNqsP4gwIwQgoRSWZpCgpnFEIGb7fbhYR5v4u16QzC2DRMb7Ppqbt90jY4bjHeiOH5Yr3NeWZ4fDEZ7e3tNA+5v7oJO93C2F0WJEOJmu82LjDFkUqaUXj4sqzpn1PzyxVeLh9Wb1z+VLB8HE9/3RS1ub68blc9mk9lsVtellBwiUItqOp1mWZZXZZIAx8nNPXMymQyHwzwvT09PT05Onj9/rpTSmqZJslgs2sN2med1LUwT9no9RqjW2rbtbF06jgMAaF9NhBDbtlErACzLSvAG6PbATxhro4ZxHOd5ppQqy3I+n89ms8lksl6vWw68lPVms5JCd7tdrXWS/LuPmHNeFEVbt6yVPjo6SrZR26DaNA2E8OrqSghxdvkpz/PZbOa6dlnm5+f3SqnhMFitzIeHeVmWVVUxxoSom6ap63K2MxNCFHWllAqCYDqdzh/uv/vuu1evXmGMW5NQURSt+eXq6mqK3OF45DhOVXOkgUZISpkWZRht86ICGDmOc3h4eHz8pNfv+77/x//zv1RZ/5W8plLkWe07VAitIbm7XzkdByHKpSTMoIRtNuFqsaE2q6qKYeL7vmlagquqqNtrJsPk+PhYa60EhxC6nm3bdr6N0jSLoqiu6+l0t9/v390v3r1798//9b+5vt++WZMkybLMcZzj48d5r7sON4TR0WgEEHr3/ue7u/v+ILAcp67r9XKpte70+hBC3/MAAKvVajgcdjodpZtgMPzyq6+UbjbbOIqiFjgt0izLMskFI6QNdNR1ySFElDjYQAgq3XDOwzAkBPV0T0q52WwWUk7GY9/3i7pqFLRMu8jrNEsAAMtFOB3vnJ1ddj1XoYYyixC2jTKAmJKwSIvzs7MsTTFEdVGZPfdwb4+a5v7+fq/XjTfbPN3OpmOKEFBNrxsMh8NBMPL9+6zkWZZVdQwwM520USBOs7woEcJCiEpwwzAePXo0mUwsyyrLstVVV4ILITDGXsevqipN0+VyqXRDKbUsy7Zt3RCMsWwapZTWusjyNkk7lFIj+B/phjY74/t+VdTtYNE2h7aMAiGE/PDjX7KM97qeY5kUQ4iEYUK/a7z44jPHp4OxezO/bUBp2rAX2LaLf/z2B6XUJpLnVwkm4L//jxf7+8e/fLopykwqDgBQUhJCHIcpWc7nc5FWlFgJjIpkMSf3e6Pp7mxqWOQv376VoKp1SmxJEUEEWi7gErrYb6Qqy1pIIRsFoaaEIAipyURVUkIaKLngSgkhLYQbz3JDygjGGGOlVF2XZZWLuqx5admmqDkhmGGqNdwZ71KyGXbYcBQwxniedV1vb/dwGPQ931kvtg0Qw/EgybZmaJzdnO2CMXFglpWNVIQQ17afHJ/s7+/P7+4ZY3/+858fPzqaTqfj4Wgy2om2W1Fz0Ci/67UNykJy23G8jus4zvHxkzAMtdTujocIXt6v+v0+xujy8vzZ8ydCCGYa4/F4tV6LUpqOTSl9eHhocTYlZVQUeZJeX15dXl4y231t28vb2+1228ZMLMsSQFvUFEL0/d6oP5yOJgZmw2DIGPvbmw9Znrx79y4Mw+PDx3t7e67nuo4ThiFjFChd5LLmDaEWQVgKsFw+pGm+M54Nhn2GTS6qzWZ9d3eNMEhShBCYTqfPnp32hzsASS04QHAymcx2dy2Car84O7tcblYSGoA2mOHJZOfi+jYIgsuLiBpkNpuNRiNimsnNTRLFoNGu7bS/oWoyPdidDcej0xefn338aNrW17/9Jg63kKTdfs/v9pVS96uHqhZepzvYcbqdXpLlRV4VWVlUPE/SzWazWCwpsW2r47guF0IjagJt2pZhGUVV+Z5CGCCE8oxvFtecc611mMZHR0fDYPDk6Ljn+gjCh4eHeJt0Op26rpeLRV5USAPGWF0JzjmDnoHY5mG90wuKJNVaX5+dSSn7QY9qoKW6vbrO8zyNYs+wjNmu1rCuedMAy3SenHzW8X3Oebha86oO+gPYQIKw1ipN481mtV4vGfsVQmizWa3Wi+efP3v8+PDNmzcXV5eTyQRDtLMzPXi0Z9tmVZWmaT579lRyUZZlgFAQBBqAeH5X1pXrup7nMcYk53EcI0Acx3EsazAYVABanisEb4AqRXl5fQlII6oyykBV5qjRSjfYpia1mGkiZvzDP/0jNVhDUCmqVRR+/+MP+vVfEcH7e4/+/u//YTyeGBiPu0EQBKQB19fXh4eHd/PbRjSLxRK90QDKjutMZ5PHh8ee3f3+2x8Wi5XndKFGdS3Oz88ZfYEQ0Ai6rq21Pv90bljs66+/dhzn8ub6/NOKc66UAgDEcbxabb76xz+8fPmSmMZ2sajr+v37D7/88kuv15uMn93dXK0WSwghowTq1sUF2qJ+pVS7lOZKKqU0AEVRtCnu9gOc845lBUHAmibPc9O0LMtqmubDhw9lmX/xxRdpmta8HI9HhNA4StM0p4ykaYxJYdu2ZVktIu66bp7nSqlPnz4t7x/af/F2Ibzdxoyxly9ftkbpNmnJOQcA+L7vum77JS202LY5aa1vLm92d3fbuHUrFkIIua57dXXVTtjv379vYXiEUJJwzjlBmDHGawEAoJRqAIQoVps1FwpREkWRlsp13W6nYzAGNUrj/P3bj1SrOs3qHGXFR9lwvzs4ODns9MeLddTtDDyvt7hdLheLp8+ObdOUrmtZlud4k52dbRgvFosvTr8YjUZpFv/w3fdNI23b3t37ajKZ/O93vxwfPzk4OCiKIksLCKHfHRDM2oaf1iYAQCOlbMMjo273X/7lf8Zp2urgw2jLpRqNRq7vR1F8dXUVRVG8jXq9nuM4UsqXr46ARllZlGWFMHRdx+92X72qV6tFXdtSSsVrAKAQQnKOEBoOgzzPhawxgQq0NiLORcU5L4qq5pyZhm27m80mKwrTHmCklQTd3rgo1f39Rin1f//fvz45Prq7W5F906JAcKgBExx4br8XjOY382gbb9YhxUYDtYlQv9vBhOmqjpfLX84+rJeLl6++pAS8efO63+1O/vm/aIRtx3OcuihFlMRFWUFsYMriOAYa0qdPHdc9P/90dXvjuq6WqtPpEEJ6vZ5lWe2FxTTNMNpuNpvtdhtFUcVrxpht24Zh+F4PAEIwppgQggFspKi11kkStR5tDXHTSAS1ZbJe109RaRhGWZZKNe2sgBBSShFK4WBgT6cTgnCZF3VdAwA1qAlVxyd7AFd+YK7DVZxtG110uvbz0yPDMKI0up3fVVw8OpyZJj379F4r5nuDXq9XyTpOthDaBgUQQpe6Qsh8m9pWJ+gPHx8+Mgz69qe/Xt6eTfcGuwcjswvTsqqFdDzqIEwlhhBK2fCSK66gRo3UiktKCGeo43kIISlqgoCGzWqzTAEuyxJjiBEAEDKCeFU+PMzzPHl8ciylBFqvV2HTNC9evLCYHXgOEg1G+vnRk1U31A2ty2LQ74T9LCli5pgSysmjaVZsoAWLprRNs67r7SZMkmQ4GO/u7kour69uj46OdidTBLBBabTdbjchw8TpdI6Pj4fDoRAiTpKWCkEMcFl3Op3NZuP3Oq1by3XdIq8uf7k6+eyIGsxynbworm9vbM/tDoK2VpNznmfZdrut8kIJmWcZBIBn2eLmpqmqMIwGg4FslCa0qnmvG8y30VJIg9DRaOSYzna7TZLk3cc7kxlSAMfuEGbnZZ1lRZZVRZF5josxVhq5Tsf3fcuylFKb5Kbf73e7PsNMCXBycmgY1jZaFUXhp65ohO+7s9kMmBaoMimbRqiDx0d1ntVlJsoiTdPr+aYqawAwhM1wPJgvFi++/JwyzAj55ne/10otb29/+O67zXrbPscRQkWalWWZ53ld5q7v9wfBzfzuxfNnmFGIDcvxGqCvb++ubm79fjA7eNQfjKlhcqGlAMgnfrdTVTVXquQ1QojXABMplFISE4NZpms7jga5VDxJkjgO43ibbKPW47J3tEcxSaNYCbm/twcbvbh/wBh3PX+13MxvbqMksx1/OBxHOkvjBPUGTa1EWc0ms8O9g6oukFagkXd3dwihJNz8bbWazx/KkjOMEELaohBpzrnkajye+G6nUSDLMseyu92uyRiGwHXd5XK53W6Xy+UmXEGkW7A03G4gxtc3l5eXV71e79HBwe7uXhxv3/3088XFRbfXOXp8fHy820pMDNtwHYdhskpShFCvGxCIMMaNUqZlm5RJLizD7HS7hmkWZaqAiJPwfjN3XTvLYyEEhqjndzzfUpXDiNH1upTS3/7n319eXt7e3haaQ4Z6QX+z2dzdPFyd32VJur97UJalYzomIV9+/uKb//T1n15/r5VaLhe313eL+wdRF6PxQCvQcOW6Xsf1i6xsmoZi+Kvf/Hq73c7nc9NkDQTtRuHu7s6w2Onp6e9+97udi/OyqJMkJYS08qTVatNaEnhRYkwf7hd//OMf3737+dWvXhqGQTBrGsB5WWtQV1XTNJRSy7SVUk3TQIyklFLJ9rVEKZ3NZn6va1hmXddVVRmWZRgGU6Db7bquSympefn27Vut1WQySZIoSaJutx/0h21Xne+7jRae1+/3+67raqlbG0un08nT/OzsbL1YGobVggWe41JKj46OsIkuLj9dXp1HUTSdTgfDfp7naRY//exkOAqU6jKDzOfzssqLouCcY01t20aUtGGWJ0+ezB/uW3bEcZx2tjAMYzgcGoaRpqnvuFLKJIqrqpZKUQghAAahFBMldZ5mF+fnEELGzOHO+M2bN5vF2iCUGSDo9YZ7B6aBMUXMYcFOf+/xAW8qfH5JfYYwraUSsoEaOJYNGii5iEQEIex43nazCcOwLIqu36mqCkOwWa2vL6+WD4u6FnUl8qxGiPb7gyAI8rKez+dZlhuWVRZ1W5naAvaMMcyo0nq5XFa8DoJgMplgytI0dV3XNK3WvSmqWillUGabVuvvPjg8/NWrl72gf307/9e//Pn86hIAYFmGaXZ8x1VKUUKqvACgGU9GbZNmo5USknPeNBopRQ2W5lkYhrPZ7OTJU3p1kWXZOtwSbDVNM50Nw3AtFaqq6tt/+2sc5YPRVEmgKb2+ve93BoN+rygL2+q+/fjaNE3BVb8/CAZDjGC8WtmOl6zXRZltNisMAdWQaJRF6dWny2EQZEWhNOr2AtmQMC3XUVJWhWlbUjWYEtO2nNpugF6tVnG89R2/bdaCEBZFwZVsg7u9oO84zu7ubr/fz8uidXMAABCAUAMMEaaEUkoJxRg3EDRKEYxN0ySEMExaLoEx5vu0HeBatVjTNP/usNjdm7UMRZmVVZlroKSUZZktlndc1rd3F5io8U6PRKrmGYDi1d99vt1u+9w5eXawXG2kKm5uwzgOEbR6vcDznUbylv3xPHs4HGbXW6EAJvBXX3x5cvL09PT0/OLjj6+/B1CZFvWJWWtbACFAJUGlVFMVkFKDQIQZhhACBZpGKtDARkKC/G5HCQktYzweZ1kSheF6ubBtkxEqpWwaZZoG1M1yMS8r//DxAcWEUVOJJk+qRiEIqMWsON6uHlZuxy+ysuY5hnbH7+3tIYgQ5xxRtDebhTHu9hzDYg508yRVXGjVPDw8XFxc3D08YETD9VrWMgrjLIqTKOFltbe3NwxGh8fB/uG+krouy6IoIIZZli8W9/3+4HZ+BwBoGrBYLzGltmNShj+c/XJycmLZdlGVWVl43Q4hpMVPOOfRdhuu1lo1jm33O12GSRLFBACtJMXQtU0hhFZNkecIkjIviqIaDAZJklmOd3VzBxCxLcf3fcO0hBC260CIFdCYGoahqGFCCIkQjDGv02srWnEOGaNplsx2pps0Ony8XxQV5zwYdCEGsuZVVdV1TSOFKaKGC7A7HAZFsr34+B4hMNgZNBgtw+J2lcdZiJmDGTn94oXruo5p/vab368fllESJ1EMIZQ1f7ibB6Nhv99vmoYarCxzKeXzz0+FksRgxDSqItIAykbXQmoAbMdhli0bFa3Xq81aysYyHYOZlDHbcvu9QZYnQkgeZRWv60YQg3GhkjSvpdBabzZhGIZSyqZBtu2Ox2PbtOq6jjah5MLa33cNy/M827BFLaaTSZpVq+Xb+2jOmIkRoQgv7ldJlJwcH7u2YztmnkaubXJenT77TAhxfX3Ny4oiTGyrKnkUy55jWpY1HDiM0M1m67uruq6XyzXUwLZtg1LPcVs+2bZtz/Nc193bm52eno4n4+l0p9PvXV6dY0Lm89uTo+NOp7N6WH369Mvd/G4ympiW4ZjWw908SpPZ3nQ8nUAAqrzQWn86OyuLejLxbdvuur5Wze3dnRCiBDgvUqUFswjCACFAGWoKiVCDCUIUyUYmRWab+tEweHTw2Ov7bGVUvORSOI719LOT1UOvyPJRMNyfznodzzbNJEnevn3r+/5wONyd7g2DQRRFSkmKdV6kJmMdrx9H+WQ4Gwaje34PlASgefz4kainf/rTnw4PD9yOv1jcE4J2d3fX4erDhw9/+MMfmGVK0VxdXdeVoJQihDqdjud2qpJblmWa9sXFxesf32w228VisV6twtU6TeKmaYBqGqnak61LvKIoAADMNLTWXEkhhJAyCIKDg4PeICjrKk3TpmkqzqMoYgpQaoxGI0LwNtowRhBCSgnLMsoyb/Or680KQeL5Vkslh2GYZVmyTQghnU6Hcx6uw3ajPhrZSqntdquE1BpqrdsfX611r9f75ptvGGPX19e+7y+Xy6Ioer2e53ntTbCl1fr+AAAwn88dxzk9PT06OsrL4sOHD5TSXhAMBoN2ET1/uK+qqh330yiWUhLDYIZRlxWXQintmBZGlHOeRvHV5aXr+jthePbhY7haTkZjzwkGg8HB7q7r2Y5vBZMhYMALvMurCwkgQ2CbxFmRQqhXq1W/PzBNU3GVJLFtu/1+vyrK8/OLvd3dZ0+f2KblunYSRWkU32d3sDE/fbr66af3EML9/f1fv/o7w7aiKB6Nxh2/t1qtdnZ2AIJS8vV6KSU/P+PXtzdREleSM9M42jnKy+rnn39WWg8GQ89xy7wQnNdFafjUMa2OF4RhWJSZECIMw+9/+Pant28RZQAAAIFpmhRjIQRodA2h1rqWHFFsEquRvAINAZgR0zCMONlmcbLZRtPdvdHOJIqizTos8tKxkdINJgwi1un0fN+/vLyUQj1//vnZh4+W6Vxe3T3ae7SzMz0//zFKktVm63leWdZSg6dPn2VpfnFzsbOzUxTFfD7vdDoHB/tBt+f7/snhSbgM//Jv31uW0w36rtfzutDdbMk6EqryCDMsohGMoqgW3Pd91AWGYTBIGWPtnYtzvgo3bWvn8ZMTz/PaPG0teFVVbfsybgsZAYAQgEZJ3jQEI9RepYBlMkopIhhD3TQN1IpSo92N/UebQpub+P9mz0Fh6kOt6AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Show image\n", + "Image.open('img.jpg')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Preprocess image with TensorFlow\n", + "tf.enable_eager_execution()\n", + "\n", + "# Constants\n", + "MEAN_RGB = [0.485 * 255, 0.456 * 255, 0.406 * 255]\n", + "STDDEV_RGB = [0.229 * 255, 0.224 * 255, 0.225 * 255]\n", + "CROP_PADDING = 32\n", + "image_size = 224\n", + "\n", + "# Helper function\n", + "def _decode_and_center_crop(image_bytes, image_size):\n", + " shape = tf.image.extract_jpeg_shape(image_bytes)\n", + " image_height = shape[0]\n", + " image_width = shape[1]\n", + " padded_center_crop_size = tf.cast(\n", + " ((image_size / (image_size + CROP_PADDING)) *\n", + " tf.cast(tf.minimum(image_height, image_width), tf.float32)),\n", + " tf.int32)\n", + " offset_height = ((image_height - padded_center_crop_size) + 1) // 2\n", + " offset_width = ((image_width - padded_center_crop_size) + 1) // 2\n", + " crop_window = tf.stack([offset_height, offset_width, padded_center_crop_size, padded_center_crop_size])\n", + " image = tf.image.decode_and_crop_jpeg(image_bytes, crop_window, channels=3)\n", + " image = tf.image.resize_bicubic([image], [image_size, image_size])[0]\n", + " return image\n", + "\n", + "# Process\n", + "tf_img_bytes = tf.read_file('img.jpg')\n", + "tf_img = _decode_and_center_crop(tf_img_bytes, image_size)\n", + "tf_img = tf.image.resize_bicubic([tf_img], [image_size, image_size])[0] # ok it matches up to here\n", + "use_bfloat16 = 224 # bug in the original repo! \n", + "tf_img = tf.image.convert_image_dtype(tf_img, dtype=tf.bfloat16 if use_bfloat16 else tf.float32)\n", + "tf_img = tf.cast(tf_img, tf.float32)\n", + "tf_img = (tf_img - MEAN_RGB) / (STDDEV_RGB) # this is exactly the input to the model\n", + "img = torch.from_numpy(tf_img.numpy()).unsqueeze(0).permute((0,3,1,2))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Load class names\n", + "labels_map = json.load(open('labels_map.txt'))\n", + "labels_map = [labels_map[str(i)] for i in range(1000)]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded pretrained weights for efficientnet-b0\n", + "-----\n", + "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (82.79%)\n", + "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus (1.52%)\n", + "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (0.37%)\n", + "American black bear, black bear, Ursus americanus, Euarctos americanus (0.23%)\n", + "brown bear, bruin, Ursus arctos (0.17%)\n" + ] + } + ], + "source": [ + "# Classify with EfficientNet\n", + "model = EfficientNet.from_pretrained(model_name)\n", + "model.eval()\n", + "with torch.no_grad():\n", + " logits = model(img)\n", + "preds = torch.topk(logits, k=5).indices.squeeze(0).tolist()\n", + "\n", + "print('-----')\n", + "for idx in preds:\n", + " label = labels_map[idx]\n", + " prob = torch.softmax(logits, dim=1)[0, idx].item()\n", + " print('{:<75} ({:.2f}%)'.format(label, prob*100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the result obtained by the TensorFlow implementation. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/example.ipynb b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/example.ipynb new file mode 100644 index 0000000..6af47a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/example.ipynb @@ -0,0 +1,144 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example\n", + "\n", + "In this simple example, we load an image, pre-process it, and classify it with a pretrained EfficientNet." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "from PIL import Image\n", + "\n", + "import torch\n", + "from torchvision import transforms\n", + "\n", + "from efficientnet_pytorch import EfficientNet" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "model_name = 'efficientnet-b0'\n", + "image_size = EfficientNet.get_image_size(model_name) # 224" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArgAAAJlCAIAAAC+AhaJAAEAAElEQVR4nHT9WY8sW5odiO15b5t9jjnOOffcIe+QebMqs7JYlVVsNptsSNCLIKEF6J/oTwgQoEe9S4AgoNESSUENkt3VLGZlsoac7nzumWMOn2y2PethR/iNvEXaQ8DD3dzcbJv7Xutb3/q+Df/P/6f/Y1EUm6asu5ZFwgD06PG7/+K/+d8cn74DPAUIDlcX//DLv1ovz/IEY+icQHGUZkVuPeyGASCkrVsul33fE0IAcNPJeDTKL87evH39SgihPdlsNqPxeDabHR0dLxaLq+vby8vrpmnenF84C6qqghDFaSKlXMz368327Oxstth3AK5XmzdnV0LEt7e3QsR5kjJCOaGcEaM0Ai7P85//+Z+cXZz/q3/1r/b29tqh18rMFvOLq8tyW3/4ycfFePTs2bPxdP7+++9vt1vC6NnV18bYtu44i7S21oA8LZqm2dvbqzbbpq0Q9nmaZFmSpJEQnFiMCL68vFxvN0cnJ6ePH5Vl+fLN6ydPnv7o40/evn17cXb++9/8djGfHx4eVtty4rhzLs/zOI7jNGKMNX0HADg42v+bv/mb6WL+L//lv8xHmffeObdarX75+3+4uLiICB/l4x99+PHl+dV//9//DwcHB4RRC0Fvhj/6059MDhbZtPAEAgTXy9uubRlj3377bd+0R0dH2/Wm3pZaa2etYJxzTiAihBhjyrLce//Jp59++u/+3b+LomQ+nX3++Rec8/Xt+mD/iHMOHKzrZhgGAJD3Xmtdl6brOkyJc2a13QAATk5ODg4OxqPpxx9+SDHbm8y6pv/rv/oPb1+/qaqKzMef/vBHl5eXRZZ89rvfz8aTvb29YpRfXV31fS+1TvNkb29vtrd4+frVL37xi+OjJ2kae+/Wm2VVraNYzOfToihubm6urm7KbSN4GseZdxBCwqhQ8poQMpqOEIJlvY0iHqWiqipljIfIGm8cpFzEUc4YBwCgZAAAOOes8cYYpYxW1lq3vLkVIqaUG+2UUt4DSimltFuvkiSJ4xhCb4xxzmEEEELG6JgLiPwwDN6aoigWi0We59ATQoj1DgDw9uzs/OpSRKzve4QQxrirG4rJ3nxhtSw3W875wUG62WyA81maCEqSWBRpRjE5OTl57733Xr9+e35xVRSjQZmLi6vzy4s4TrMkff36NbLeWfv45NF//V/9s8vLy9/97rNtWW7r6vD4qOr6LM9ne4s/+skff/v8y81mU9e1994YI2WPEIqi6Ob2CmMshEAIMMYWi0Wapm3bwsYqpYz13gOlTNP2UkpvwXw+F5yqtgfOeGv+1//yX/7yb/4jhBBCHMfxer1u23pvb288HkdRNJ2OvfcvXn57cXFBKbXWnpwcG2MQQhHGP/z0x998803b9cenjy9uVtc3twCAvYPDsixHebZYLA72987evJJSDsPQdY0Qwnv/5uwCQjiaTLXWIooJZ6v1tus6kaQHBwe//d3vwt2cF6ht2+Pj4yiKOGVZlimlpuPJaDRqmqZcb25vb733x8fHo9GobZqX1zd1XTvnFosFgoQxNhqNrq9vvPe//e1vx+NpFEUffPDBe++99//5f//rf/Nv/s0HP/qAMtE0jYNIG1d3PYCoLEspJULovXef/ulPfzIqsrPXry4vL4G3xfS4aRqttfceQpimOaW0ruu6bouiuLy8xIimaeqcG41GWuu+H7TWWmvvHaU0S+M0jaMoMmrQWjnnvDNd122362EYIIRphIo8PzjY04OczWbWKELIarnBGFMublfbuuny8QQi1g9SCKFVixB6/OjR+fl5GgnBueoHa21VbYui+PrbZ9bbKE2qquJCAACkNAAArXWe59PJfLvddl23WCwIYQAAIQSEuGkaay1CSCkFCEYIaa3btlNKEUKEEJRwjDGEGCFkjOm6bhgUpTRJEsKdcw4AQClljHmIwuW3/UAphRDGUZpkqVKqbVuMsdceYwwhlFJWVdW2LQCAc44QCscBAFhrrbWUUiFEnKfX19ec8zzP67bV2hBCejlAgKuqqtrGGAMhBgBACBHGnDHnnLUWAIAQghCGYxJCwl/GGADAe08I4ZwTdvdeIcSomKRpGi4QQrxara6vr5umBQBgjO+nHei9996HwzrnjDHWWu89xjhchdbaWgshRAh568JEFI4QnsQYSymNMRBCQgiEMAwaAEApRSkFAFgtvfeUIO+9kZJRzCnjnApGIITAeeet995jrLV2zkEIwxQRjrk7w92HQgghhAWGSqko4pwzaSShKMsySjHBmJd1M0gZx7HD8PbyhvGk6xqAoGlrp3Tdbi00ZbMtt52I0HRSSKuQV8b5bpBERABiCGwkKEKoqtrXr7dXF7gsN5vNhnM+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bb1czm/eutu0VV1X33zz1fHxMaAjtBNCOFnXlU5iVxR9KSVnab83GfS3er3hRx/9II7j99794PDweHt7N45jzsTZ8mi1uryzde/OW/c+++SL2dQWeYEIzrp+nyMUXacRnHet9Z33aJQGfz2V+h11NMsS9BvLwc1NK3iaZw8ePbp37/7nX3395NmzB48e33/n0ddffztdLkSWaOsIInDqCVBGMKZaa2Yz03WeEkv4bC1n6wtnVVn5JBu1XX7z1h4X2/PFdLVadK2klFqYWUwN5OBRGaOcocip4M26Iox6cFHE93f3Tk7Ophez0Wik2q5put3d3Z2tHQB67+5Dj+TsYvbr3/yubSWltO2U936YZePJdtu26DEax3GWauu79dooxSOBiGVZCSFaqY1xJydH55cXeZ7HcXz//v1WdjwSq3L9V3/1V0+ePLm4uJjP55PJ5OL0rCiKO7duc87X63XExa3d/STB5Xw2nU4fPnh078HD5y9eNdJ6333z/LfK2OFg3HWqVTKKIhs7rbUGrNtuPOipdmVk+9UXn/70h9/7+c9+nCb83t37QPhsOV/Xqq7rddPOpguPHWMsyrLReDAc9hFxVa5U11mp2nKN3r589tQax0QE6IQQSEFr7bwLekrO2SuqTShsNGUeiWAUnXPeWw2mNy52tveklHXdtp0ybSNolCRR16mqbYx34/GSEk6RRDwyHhizSmkjldbW+oAQE8owioRzJo6F6WpnLBIf6PNtK2ezGSAHZFGciijiLCrrinPaNpJzkmXJ1vaIUtCm1eUqjuPxaPDO2w8fPHiwXiysUkYqdnp66r1HRpu2Nei1d+uuqZoaCFHOamdRK2V04HAKIeI4bTsVwt5sufziqy+jJP7h93/w7Mnzw4Pjum7TONPKLKqOJQWlvLOG8JhznkYpRWa1o4SF/gIiFr18uVxShlXbeOLjNKnqstfrEYpSylhE/X7fOTedThljxvmIMmWs1MYY00nL4my1WqVFbq09OzvzYOI009Z89fW3dV1W9TpJU8IEpVFdlqVoA01GSimlJoQkSeI7r7V23hAKSLzfhA0LKIxRSvkootZopZRHQq8Oa51WSnmvtA10QgAQSRxF0drYwEptmq5tW9XpJEkYYzFHwhhBorTS2hpjnQPnALylBDjjlFLG+aDfo2EmmkCWxh5j55xgeZZEbDKKIs4isapK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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Open image\n", + "img = Image.open('img.jpg')\n", + "img" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Preprocess image\n", + "tfms = transforms.Compose([transforms.Resize(image_size), transforms.CenterCrop(image_size), \n", + " transforms.ToTensor(),\n", + " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),])\n", + "img = tfms(img).unsqueeze(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Load class names\n", + "labels_map = json.load(open('labels_map.txt'))\n", + "labels_map = [labels_map[str(i)] for i in range(1000)]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loaded pretrained weights for efficientnet-b0\n", + "-----\n", + "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (90.04%)\n", + "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus (0.62%)\n", + "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (0.19%)\n", + "soccer ball (0.14%)\n", + "badger (0.10%)\n" + ] + } + ], + "source": [ + "# Classify with EfficientNet\n", + "model = EfficientNet.from_pretrained(model_name)\n", + "model.eval()\n", + "with torch.no_grad():\n", + " logits = model(img)\n", + "preds = torch.topk(logits, k=5).indices.squeeze(0).tolist()\n", + "\n", + "print('-----')\n", + "for idx in preds:\n", + " label = labels_map[idx]\n", + " prob = torch.softmax(logits, dim=1)[0, idx].item()\n", + " print('{:<75} ({:.2f}%)'.format(label, prob*100))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/labels_map.txt b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/labels_map.txt new file mode 100644 index 0000000..0c06838 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/examples/simple/labels_map.txt @@ -0,0 +1 @@ +{"0": "tench, Tinca tinca", "1": "goldfish, Carassius auratus", "2": "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", "3": "tiger shark, Galeocerdo cuvieri", "4": "hammerhead, hammerhead shark", "5": "electric ray, crampfish, numbfish, torpedo", "6": "stingray", "7": "cock", "8": "hen", "9": "ostrich, Struthio camelus", "10": "brambling, Fringilla montifringilla", "11": "goldfinch, Carduelis carduelis", "12": "house finch, linnet, Carpodacus mexicanus", "13": "junco, snowbird", "14": "indigo bunting, indigo finch, indigo bird, Passerina cyanea", "15": "robin, American robin, Turdus migratorius", "16": "bulbul", "17": "jay", "18": "magpie", "19": "chickadee", "20": "water ouzel, dipper", "21": "kite", "22": "bald eagle, American eagle, Haliaeetus leucocephalus", "23": "vulture", "24": "great grey owl, great gray owl, Strix nebulosa", "25": "European fire salamander, Salamandra salamandra", "26": "common newt, Triturus vulgaris", "27": "eft", "28": "spotted salamander, Ambystoma maculatum", "29": "axolotl, mud puppy, Ambystoma mexicanum", "30": "bullfrog, Rana catesbeiana", "31": "tree frog, tree-frog", "32": "tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", "33": "loggerhead, loggerhead turtle, Caretta caretta", "34": "leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", "35": "mud turtle", "36": "terrapin", "37": "box turtle, box tortoise", "38": "banded gecko", "39": "common iguana, iguana, Iguana iguana", "40": "American chameleon, anole, Anolis carolinensis", "41": "whiptail, whiptail lizard", "42": "agama", "43": "frilled lizard, Chlamydosaurus kingi", "44": "alligator lizard", "45": "Gila monster, Heloderma suspectum", "46": "green lizard, Lacerta viridis", "47": "African chameleon, Chamaeleo chamaeleon", "48": "Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", "49": "African crocodile, Nile crocodile, Crocodylus niloticus", "50": "American alligator, Alligator mississipiensis", "51": "triceratops", "52": "thunder snake, worm snake, Carphophis amoenus", "53": "ringneck snake, ring-necked snake, ring snake", "54": "hognose snake, puff adder, sand viper", "55": "green snake, grass snake", "56": "king snake, kingsnake", "57": "garter snake, grass snake", "58": "water snake", "59": "vine snake", "60": "night snake, Hypsiglena torquata", "61": "boa constrictor, Constrictor constrictor", "62": "rock python, rock snake, Python sebae", "63": "Indian cobra, Naja naja", "64": "green mamba", "65": "sea snake", "66": "horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", "67": "diamondback, diamondback rattlesnake, Crotalus adamanteus", "68": "sidewinder, horned rattlesnake, Crotalus cerastes", "69": "trilobite", "70": "harvestman, daddy longlegs, Phalangium opilio", "71": "scorpion", "72": "black and gold garden spider, Argiope aurantia", "73": "barn spider, Araneus cavaticus", "74": "garden spider, Aranea diademata", "75": "black widow, Latrodectus mactans", "76": "tarantula", "77": "wolf spider, hunting spider", "78": "tick", "79": "centipede", "80": "black grouse", "81": "ptarmigan", "82": "ruffed grouse, partridge, Bonasa umbellus", "83": "prairie chicken, prairie grouse, prairie fowl", "84": "peacock", "85": "quail", "86": "partridge", "87": "African grey, African gray, Psittacus erithacus", "88": "macaw", "89": "sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", "90": "lorikeet", "91": "coucal", "92": "bee eater", "93": "hornbill", "94": "hummingbird", "95": "jacamar", "96": "toucan", "97": "drake", "98": "red-breasted merganser, Mergus serrator", "99": "goose", "100": "black swan, Cygnus atratus", "101": "tusker", "102": "echidna, spiny anteater, anteater", "103": "platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", "104": "wallaby, brush kangaroo", "105": "koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", "106": "wombat", "107": "jellyfish", "108": "sea anemone, anemone", "109": "brain coral", "110": "flatworm, platyhelminth", "111": "nematode, nematode worm, roundworm", "112": "conch", "113": "snail", "114": "slug", "115": "sea slug, nudibranch", "116": "chiton, coat-of-mail shell, sea cradle, polyplacophore", "117": "chambered nautilus, pearly nautilus, nautilus", "118": "Dungeness crab, Cancer magister", "119": "rock crab, Cancer irroratus", "120": "fiddler crab", "121": "king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", "122": "American lobster, Northern lobster, Maine lobster, Homarus americanus", "123": "spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", "124": "crayfish, crawfish, crawdad, crawdaddy", "125": "hermit crab", "126": "isopod", "127": "white stork, Ciconia ciconia", "128": "black stork, Ciconia nigra", "129": "spoonbill", "130": "flamingo", "131": "little blue heron, Egretta caerulea", "132": "American egret, great white heron, Egretta albus", "133": "bittern", "134": "crane", "135": "limpkin, Aramus pictus", "136": "European gallinule, Porphyrio porphyrio", "137": "American coot, marsh hen, mud hen, water hen, Fulica americana", "138": "bustard", "139": "ruddy turnstone, Arenaria interpres", "140": "red-backed sandpiper, dunlin, Erolia alpina", "141": "redshank, Tringa totanus", "142": "dowitcher", "143": "oystercatcher, oyster catcher", "144": "pelican", "145": "king penguin, Aptenodytes patagonica", "146": "albatross, mollymawk", "147": "grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", "148": "killer whale, killer, orca, grampus, sea wolf, Orcinus orca", "149": "dugong, Dugong dugon", "150": "sea lion", "151": "Chihuahua", "152": "Japanese spaniel", "153": "Maltese dog, Maltese terrier, Maltese", "154": "Pekinese, Pekingese, Peke", "155": "Shih-Tzu", "156": "Blenheim spaniel", "157": "papillon", "158": "toy terrier", "159": "Rhodesian ridgeback", "160": "Afghan hound, Afghan", "161": "basset, basset hound", "162": "beagle", "163": "bloodhound, sleuthhound", "164": "bluetick", "165": "black-and-tan coonhound", "166": "Walker hound, Walker foxhound", "167": "English foxhound", "168": "redbone", "169": "borzoi, Russian wolfhound", "170": "Irish wolfhound", "171": "Italian greyhound", "172": "whippet", "173": "Ibizan hound, Ibizan Podenco", "174": "Norwegian elkhound, elkhound", "175": "otterhound, otter hound", "176": "Saluki, gazelle hound", "177": "Scottish deerhound, deerhound", "178": "Weimaraner", "179": "Staffordshire bullterrier, Staffordshire bull terrier", "180": "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", "181": "Bedlington terrier", "182": "Border terrier", "183": "Kerry blue terrier", "184": "Irish terrier", "185": "Norfolk terrier", "186": "Norwich terrier", "187": "Yorkshire terrier", "188": "wire-haired fox terrier", "189": "Lakeland terrier", "190": "Sealyham terrier, Sealyham", "191": "Airedale, Airedale terrier", "192": "cairn, cairn terrier", "193": "Australian terrier", "194": "Dandie Dinmont, Dandie Dinmont terrier", "195": "Boston bull, Boston terrier", "196": "miniature schnauzer", "197": "giant schnauzer", "198": "standard schnauzer", "199": "Scotch terrier, Scottish terrier, Scottie", "200": "Tibetan terrier, chrysanthemum dog", "201": "silky terrier, Sydney silky", "202": "soft-coated wheaten terrier", "203": "West Highland white terrier", "204": "Lhasa, Lhasa apso", "205": "flat-coated retriever", "206": "curly-coated retriever", "207": "golden retriever", "208": "Labrador retriever", "209": "Chesapeake Bay retriever", "210": "German short-haired pointer", "211": "vizsla, Hungarian pointer", "212": "English setter", "213": "Irish setter, red setter", "214": "Gordon setter", "215": "Brittany spaniel", "216": "clumber, clumber spaniel", "217": "English springer, English springer spaniel", "218": "Welsh springer spaniel", "219": "cocker spaniel, English cocker spaniel, cocker", "220": "Sussex spaniel", "221": "Irish water spaniel", "222": "kuvasz", "223": "schipperke", "224": "groenendael", "225": "malinois", "226": "briard", "227": "kelpie", "228": "komondor", "229": "Old English sheepdog, bobtail", "230": "Shetland sheepdog, Shetland sheep dog, Shetland", "231": "collie", "232": "Border collie", "233": "Bouvier des Flandres, Bouviers des Flandres", "234": "Rottweiler", "235": "German shepherd, German shepherd dog, German police dog, alsatian", "236": "Doberman, Doberman pinscher", "237": "miniature pinscher", "238": "Greater Swiss Mountain dog", "239": "Bernese mountain dog", "240": "Appenzeller", "241": "EntleBucher", "242": "boxer", "243": "bull mastiff", "244": "Tibetan mastiff", "245": "French bulldog", "246": "Great Dane", "247": "Saint Bernard, St Bernard", "248": "Eskimo dog, husky", "249": "malamute, malemute, Alaskan malamute", "250": "Siberian husky", "251": "dalmatian, coach dog, carriage dog", "252": "affenpinscher, monkey pinscher, monkey dog", "253": "basenji", "254": "pug, pug-dog", "255": "Leonberg", "256": "Newfoundland, Newfoundland dog", "257": "Great Pyrenees", "258": "Samoyed, Samoyede", "259": "Pomeranian", "260": "chow, chow chow", "261": "keeshond", "262": "Brabancon griffon", "263": "Pembroke, Pembroke Welsh corgi", "264": "Cardigan, Cardigan Welsh corgi", "265": "toy poodle", "266": "miniature poodle", "267": "standard poodle", "268": "Mexican hairless", "269": "timber wolf, grey wolf, gray wolf, Canis lupus", "270": "white wolf, Arctic wolf, Canis lupus tundrarum", "271": "red wolf, maned wolf, Canis rufus, Canis niger", "272": "coyote, prairie wolf, brush wolf, Canis latrans", "273": "dingo, warrigal, warragal, Canis dingo", "274": "dhole, Cuon alpinus", "275": "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", "276": "hyena, hyaena", "277": "red fox, Vulpes vulpes", "278": "kit fox, Vulpes macrotis", "279": "Arctic fox, white fox, Alopex lagopus", "280": "grey fox, gray fox, Urocyon cinereoargenteus", "281": "tabby, tabby cat", "282": "tiger cat", "283": "Persian cat", "284": "Siamese cat, Siamese", "285": "Egyptian cat", "286": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", "287": "lynx, catamount", "288": "leopard, Panthera pardus", "289": "snow leopard, ounce, Panthera uncia", "290": "jaguar, panther, Panthera onca, Felis onca", "291": "lion, king of beasts, Panthera leo", "292": "tiger, Panthera tigris", "293": "cheetah, chetah, Acinonyx jubatus", "294": "brown bear, bruin, Ursus arctos", "295": "American black bear, black bear, Ursus americanus, Euarctos americanus", "296": "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", "297": "sloth bear, Melursus ursinus, Ursus ursinus", "298": "mongoose", "299": "meerkat, mierkat", "300": "tiger beetle", "301": "ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", "302": "ground beetle, carabid beetle", "303": "long-horned beetle, longicorn, longicorn beetle", "304": "leaf beetle, chrysomelid", "305": "dung beetle", "306": "rhinoceros beetle", "307": "weevil", "308": "fly", "309": "bee", "310": "ant, emmet, pismire", "311": "grasshopper, hopper", "312": "cricket", "313": "walking stick, walkingstick, stick insect", "314": "cockroach, roach", "315": "mantis, mantid", "316": "cicada, cicala", "317": "leafhopper", "318": "lacewing, lacewing fly", "319": "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", "320": "damselfly", "321": "admiral", "322": "ringlet, ringlet butterfly", "323": "monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", "324": "cabbage butterfly", "325": "sulphur butterfly, sulfur butterfly", "326": "lycaenid, lycaenid butterfly", "327": "starfish, sea star", "328": "sea urchin", "329": "sea cucumber, holothurian", "330": "wood rabbit, cottontail, cottontail rabbit", "331": "hare", "332": "Angora, Angora rabbit", "333": "hamster", "334": "porcupine, hedgehog", "335": "fox squirrel, eastern fox squirrel, Sciurus niger", "336": "marmot", "337": "beaver", "338": "guinea pig, Cavia cobaya", "339": "sorrel", "340": "zebra", "341": "hog, pig, grunter, squealer, Sus scrofa", "342": "wild boar, boar, Sus scrofa", "343": "warthog", "344": "hippopotamus, hippo, river horse, Hippopotamus amphibius", "345": "ox", "346": "water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", "347": "bison", "348": "ram, tup", "349": "bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", "350": "ibex, Capra ibex", "351": "hartebeest", "352": "impala, Aepyceros melampus", "353": "gazelle", "354": "Arabian camel, dromedary, Camelus dromedarius", "355": "llama", "356": "weasel", "357": "mink", "358": "polecat, fitch, foulmart, foumart, Mustela putorius", "359": "black-footed ferret, ferret, Mustela nigripes", "360": "otter", "361": "skunk, polecat, wood pussy", "362": "badger", "363": "armadillo", "364": "three-toed sloth, ai, Bradypus tridactylus", "365": "orangutan, orang, orangutang, Pongo pygmaeus", "366": "gorilla, Gorilla gorilla", "367": "chimpanzee, chimp, Pan troglodytes", "368": "gibbon, Hylobates lar", "369": "siamang, Hylobates syndactylus, Symphalangus syndactylus", "370": "guenon, guenon monkey", "371": "patas, hussar monkey, Erythrocebus patas", "372": "baboon", "373": "macaque", "374": "langur", "375": "colobus, colobus monkey", "376": "proboscis monkey, Nasalis larvatus", "377": "marmoset", "378": "capuchin, ringtail, Cebus capucinus", "379": "howler monkey, howler", "380": "titi, titi monkey", "381": "spider monkey, Ateles geoffroyi", "382": "squirrel monkey, Saimiri sciureus", "383": "Madagascar cat, ring-tailed lemur, Lemur catta", "384": "indri, indris, Indri indri, Indri brevicaudatus", "385": "Indian elephant, Elephas maximus", "386": "African elephant, Loxodonta africana", "387": "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", "388": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", "389": "barracouta, snoek", "390": "eel", "391": "coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", "392": "rock beauty, Holocanthus tricolor", "393": "anemone fish", "394": "sturgeon", "395": "gar, garfish, garpike, billfish, Lepisosteus osseus", "396": "lionfish", "397": "puffer, pufferfish, blowfish, globefish", "398": "abacus", "399": "abaya", "400": "academic gown, academic robe, judge's robe", "401": "accordion, piano accordion, squeeze box", "402": "acoustic guitar", "403": "aircraft carrier, carrier, flattop, attack aircraft carrier", "404": "airliner", "405": "airship, dirigible", "406": "altar", "407": "ambulance", "408": "amphibian, amphibious vehicle", "409": "analog clock", "410": "apiary, bee house", "411": "apron", "412": "ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", "413": "assault rifle, assault gun", "414": "backpack, back pack, knapsack, packsack, rucksack, haversack", "415": "bakery, bakeshop, bakehouse", "416": "balance beam, beam", "417": "balloon", "418": "ballpoint, ballpoint pen, ballpen, Biro", "419": "Band Aid", "420": "banjo", "421": "bannister, banister, balustrade, balusters, handrail", "422": "barbell", "423": "barber chair", "424": "barbershop", "425": "barn", "426": "barometer", "427": "barrel, cask", "428": "barrow, garden cart, lawn cart, wheelbarrow", "429": "baseball", "430": "basketball", "431": "bassinet", "432": "bassoon", "433": "bathing cap, swimming cap", "434": "bath towel", "435": "bathtub, bathing tub, bath, tub", "436": "beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", "437": "beacon, lighthouse, beacon light, pharos", "438": "beaker", "439": "bearskin, busby, shako", "440": "beer bottle", "441": "beer glass", "442": "bell cote, bell cot", "443": "bib", "444": "bicycle-built-for-two, tandem bicycle, tandem", "445": "bikini, two-piece", "446": "binder, ring-binder", "447": "binoculars, field glasses, opera glasses", "448": "birdhouse", "449": "boathouse", "450": "bobsled, bobsleigh, bob", "451": "bolo tie, bolo, bola tie, bola", "452": "bonnet, poke bonnet", "453": "bookcase", "454": "bookshop, bookstore, bookstall", "455": "bottlecap", "456": "bow", "457": "bow tie, bow-tie, bowtie", "458": "brass, memorial tablet, plaque", "459": "brassiere, bra, bandeau", "460": "breakwater, groin, groyne, mole, bulwark, seawall, jetty", "461": "breastplate, aegis, egis", "462": "broom", "463": "bucket, pail", "464": "buckle", "465": "bulletproof vest", "466": "bullet train, bullet", "467": "butcher shop, meat market", "468": "cab, hack, taxi, taxicab", "469": "caldron, cauldron", "470": "candle, taper, wax light", "471": "cannon", "472": "canoe", "473": "can opener, tin opener", "474": "cardigan", "475": "car mirror", "476": "carousel, carrousel, merry-go-round, roundabout, whirligig", "477": "carpenter's kit, tool kit", "478": "carton", "479": "car wheel", "480": "cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", "481": "cassette", "482": "cassette player", "483": "castle", "484": "catamaran", "485": "CD player", "486": "cello, violoncello", "487": "cellular telephone, cellular phone, cellphone, cell, mobile phone", "488": "chain", "489": "chainlink fence", "490": "chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", "491": "chain saw, chainsaw", "492": "chest", "493": "chiffonier, commode", "494": "chime, bell, gong", "495": "china cabinet, china closet", "496": "Christmas stocking", "497": "church, church building", "498": "cinema, movie theater, movie theatre, movie house, picture palace", "499": "cleaver, meat cleaver, chopper", "500": "cliff dwelling", "501": "cloak", "502": "clog, geta, patten, sabot", "503": "cocktail shaker", "504": "coffee mug", "505": "coffeepot", "506": "coil, spiral, volute, whorl, helix", "507": "combination lock", "508": "computer keyboard, keypad", "509": "confectionery, confectionary, candy store", "510": "container ship, containership, container vessel", "511": "convertible", "512": "corkscrew, bottle screw", "513": "cornet, horn, trumpet, trump", "514": "cowboy boot", "515": "cowboy hat, ten-gallon hat", "516": "cradle", "517": "crane", "518": "crash helmet", "519": "crate", "520": "crib, cot", "521": "Crock Pot", "522": "croquet ball", "523": "crutch", "524": "cuirass", "525": "dam, dike, dyke", "526": "desk", "527": "desktop computer", "528": "dial telephone, dial phone", "529": "diaper, nappy, napkin", "530": "digital clock", "531": "digital watch", "532": "dining table, board", "533": "dishrag, dishcloth", "534": "dishwasher, dish washer, dishwashing machine", "535": "disk brake, disc brake", "536": "dock, dockage, docking facility", "537": "dogsled, dog sled, dog sleigh", "538": "dome", "539": "doormat, welcome mat", "540": "drilling platform, offshore rig", "541": "drum, membranophone, tympan", "542": "drumstick", "543": "dumbbell", "544": "Dutch oven", "545": "electric fan, blower", "546": "electric guitar", "547": "electric locomotive", "548": "entertainment center", "549": "envelope", "550": "espresso maker", "551": "face powder", "552": "feather boa, boa", "553": "file, file cabinet, filing cabinet", "554": "fireboat", "555": "fire engine, fire truck", "556": "fire screen, fireguard", "557": "flagpole, flagstaff", "558": "flute, transverse flute", "559": "folding chair", "560": "football helmet", "561": "forklift", "562": "fountain", "563": "fountain pen", "564": "four-poster", "565": "freight car", "566": "French horn, horn", "567": "frying pan, frypan, skillet", "568": "fur coat", "569": "garbage truck, dustcart", "570": "gasmask, respirator, gas helmet", "571": "gas pump, gasoline pump, petrol pump, island dispenser", "572": "goblet", "573": "go-kart", "574": "golf ball", "575": "golfcart, golf cart", "576": "gondola", "577": "gong, tam-tam", "578": "gown", "579": "grand piano, grand", "580": "greenhouse, nursery, glasshouse", "581": "grille, radiator grille", "582": "grocery store, grocery, food market, market", "583": "guillotine", "584": "hair slide", "585": "hair spray", "586": "half track", "587": "hammer", "588": "hamper", "589": "hand blower, blow dryer, blow drier, hair dryer, hair drier", "590": "hand-held computer, hand-held microcomputer", "591": "handkerchief, hankie, hanky, hankey", "592": "hard disc, hard disk, fixed disk", "593": "harmonica, mouth organ, harp, mouth harp", "594": "harp", "595": "harvester, reaper", "596": "hatchet", "597": "holster", "598": "home theater, home theatre", "599": "honeycomb", "600": "hook, claw", "601": "hoopskirt, crinoline", "602": "horizontal bar, high bar", "603": "horse cart, horse-cart", "604": "hourglass", "605": "iPod", "606": "iron, smoothing iron", "607": "jack-o'-lantern", "608": "jean, blue jean, denim", "609": "jeep, landrover", "610": "jersey, T-shirt, tee shirt", "611": "jigsaw puzzle", "612": "jinrikisha, ricksha, rickshaw", "613": "joystick", "614": "kimono", "615": "knee pad", "616": "knot", "617": "lab coat, laboratory coat", "618": "ladle", "619": "lampshade, lamp shade", "620": "laptop, laptop computer", "621": "lawn mower, mower", "622": "lens cap, lens cover", "623": "letter opener, paper knife, paperknife", "624": "library", "625": "lifeboat", "626": "lighter, light, igniter, ignitor", "627": "limousine, limo", "628": "liner, ocean liner", "629": "lipstick, lip rouge", "630": "Loafer", "631": "lotion", "632": "loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", "633": "loupe, jeweler's loupe", "634": "lumbermill, sawmill", "635": "magnetic compass", "636": "mailbag, postbag", "637": "mailbox, letter box", "638": "maillot", "639": "maillot, tank suit", "640": "manhole cover", "641": "maraca", "642": "marimba, xylophone", "643": "mask", "644": "matchstick", "645": "maypole", "646": "maze, labyrinth", "647": "measuring cup", "648": "medicine chest, medicine cabinet", "649": "megalith, megalithic structure", "650": "microphone, mike", "651": "microwave, microwave oven", "652": "military uniform", "653": "milk can", "654": "minibus", "655": "miniskirt, mini", "656": "minivan", "657": "missile", "658": "mitten", "659": "mixing bowl", "660": "mobile home, manufactured home", "661": "Model T", "662": "modem", "663": "monastery", "664": "monitor", "665": "moped", "666": "mortar", "667": "mortarboard", "668": "mosque", "669": "mosquito net", "670": "motor scooter, scooter", "671": "mountain bike, all-terrain bike, off-roader", "672": "mountain tent", "673": "mouse, computer mouse", "674": "mousetrap", "675": "moving van", "676": "muzzle", "677": "nail", "678": "neck brace", "679": "necklace", "680": "nipple", "681": "notebook, notebook computer", "682": "obelisk", "683": "oboe, hautboy, hautbois", "684": "ocarina, sweet potato", "685": "odometer, hodometer, mileometer, milometer", "686": "oil filter", "687": "organ, pipe organ", "688": "oscilloscope, scope, cathode-ray oscilloscope, CRO", "689": "overskirt", "690": "oxcart", "691": "oxygen mask", "692": "packet", "693": "paddle, boat paddle", "694": "paddlewheel, paddle wheel", "695": "padlock", "696": "paintbrush", "697": "pajama, pyjama, pj's, jammies", "698": "palace", "699": "panpipe, pandean pipe, syrinx", "700": "paper towel", "701": "parachute, chute", "702": "parallel bars, bars", "703": "park bench", "704": "parking meter", "705": "passenger car, coach, carriage", "706": "patio, terrace", "707": "pay-phone, pay-station", "708": "pedestal, plinth, footstall", "709": "pencil box, pencil case", "710": "pencil sharpener", "711": "perfume, essence", "712": "Petri dish", "713": "photocopier", "714": "pick, plectrum, plectron", "715": "pickelhaube", "716": "picket fence, paling", "717": "pickup, pickup truck", "718": "pier", "719": "piggy bank, penny bank", "720": "pill bottle", "721": "pillow", "722": "ping-pong ball", "723": "pinwheel", "724": "pirate, pirate ship", "725": "pitcher, ewer", "726": "plane, carpenter's plane, woodworking plane", "727": "planetarium", "728": "plastic bag", "729": "plate rack", "730": "plow, plough", "731": "plunger, plumber's helper", "732": "Polaroid camera, Polaroid Land camera", "733": "pole", "734": "police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", "735": "poncho", "736": "pool table, billiard table, snooker table", "737": "pop bottle, soda bottle", "738": "pot, flowerpot", "739": "potter's wheel", "740": "power drill", "741": "prayer rug, prayer mat", "742": "printer", "743": "prison, prison house", "744": "projectile, missile", "745": "projector", "746": "puck, hockey puck", "747": "punching bag, punch bag, punching ball, punchball", "748": "purse", "749": "quill, quill pen", "750": "quilt, comforter, comfort, puff", "751": "racer, race car, racing car", "752": "racket, racquet", "753": "radiator", "754": "radio, wireless", "755": "radio telescope, radio reflector", "756": "rain barrel", "757": "recreational vehicle, RV, R.V.", "758": "reel", "759": "reflex camera", "760": "refrigerator, icebox", "761": "remote control, remote", "762": "restaurant, eating house, eating place, eatery", "763": "revolver, six-gun, six-shooter", "764": "rifle", "765": "rocking chair, rocker", "766": "rotisserie", "767": "rubber eraser, rubber, pencil eraser", "768": "rugby ball", "769": "rule, ruler", "770": "running shoe", "771": "safe", "772": "safety pin", "773": "saltshaker, salt shaker", "774": "sandal", "775": "sarong", "776": "sax, saxophone", "777": "scabbard", "778": "scale, weighing machine", "779": "school bus", "780": "schooner", "781": "scoreboard", "782": "screen, CRT screen", "783": "screw", "784": "screwdriver", "785": "seat belt, seatbelt", "786": "sewing machine", "787": "shield, buckler", "788": "shoe shop, shoe-shop, shoe store", "789": "shoji", "790": "shopping basket", "791": "shopping cart", "792": "shovel", "793": "shower cap", "794": "shower curtain", "795": "ski", "796": "ski mask", "797": "sleeping bag", "798": "slide rule, slipstick", "799": "sliding door", "800": "slot, one-armed bandit", "801": "snorkel", "802": "snowmobile", "803": "snowplow, snowplough", "804": "soap dispenser", "805": "soccer ball", "806": "sock", "807": "solar dish, solar collector, solar furnace", "808": "sombrero", "809": "soup bowl", "810": "space bar", "811": "space heater", "812": "space shuttle", "813": "spatula", "814": "speedboat", "815": "spider web, spider's web", "816": "spindle", "817": "sports car, sport car", "818": "spotlight, spot", "819": "stage", "820": "steam locomotive", "821": "steel arch bridge", "822": "steel drum", "823": "stethoscope", "824": "stole", "825": "stone wall", "826": "stopwatch, stop watch", "827": "stove", "828": "strainer", "829": "streetcar, tram, tramcar, trolley, trolley car", "830": "stretcher", "831": "studio couch, day bed", "832": "stupa, tope", "833": "submarine, pigboat, sub, U-boat", "834": "suit, suit of clothes", "835": "sundial", "836": "sunglass", "837": "sunglasses, dark glasses, shades", "838": "sunscreen, sunblock, sun blocker", "839": "suspension bridge", "840": "swab, swob, mop", "841": "sweatshirt", "842": "swimming trunks, bathing trunks", "843": "swing", "844": "switch, electric switch, electrical switch", "845": "syringe", "846": "table lamp", "847": "tank, army tank, armored combat vehicle, armoured combat vehicle", "848": "tape player", "849": "teapot", "850": "teddy, teddy bear", "851": "television, television system", "852": "tennis ball", "853": "thatch, thatched roof", "854": "theater curtain, theatre curtain", "855": "thimble", "856": "thresher, thrasher, threshing machine", "857": "throne", "858": "tile roof", "859": "toaster", "860": "tobacco shop, tobacconist shop, tobacconist", "861": "toilet seat", "862": "torch", "863": "totem pole", "864": "tow truck, tow car, wrecker", "865": "toyshop", "866": "tractor", "867": "trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", "868": "tray", "869": "trench coat", "870": "tricycle, trike, velocipede", "871": "trimaran", "872": "tripod", "873": "triumphal arch", "874": "trolleybus, trolley coach, trackless trolley", "875": "trombone", "876": "tub, vat", "877": "turnstile", "878": "typewriter keyboard", "879": "umbrella", "880": "unicycle, monocycle", "881": "upright, upright piano", "882": "vacuum, vacuum cleaner", "883": "vase", "884": "vault", "885": "velvet", "886": "vending machine", "887": "vestment", "888": "viaduct", "889": "violin, fiddle", "890": "volleyball", "891": "waffle iron", "892": "wall clock", "893": "wallet, billfold, notecase, pocketbook", "894": "wardrobe, closet, press", "895": "warplane, military plane", "896": "washbasin, handbasin, washbowl, lavabo, wash-hand basin", "897": "washer, automatic washer, washing machine", "898": "water bottle", "899": "water jug", "900": "water tower", "901": "whiskey jug", "902": "whistle", "903": "wig", "904": "window screen", "905": "window shade", "906": "Windsor tie", "907": "wine bottle", "908": "wing", "909": "wok", "910": "wooden spoon", "911": "wool, woolen, woollen", "912": "worm fence, snake fence, snake-rail fence, Virginia fence", "913": "wreck", "914": "yawl", "915": "yurt", "916": "web site, website, internet site, site", "917": "comic book", "918": "crossword puzzle, crossword", "919": "street sign", "920": "traffic light, traffic signal, stoplight", "921": "book jacket, dust cover, dust jacket, dust wrapper", "922": "menu", "923": "plate", "924": "guacamole", "925": "consomme", "926": "hot pot, hotpot", "927": "trifle", "928": "ice cream, icecream", "929": "ice lolly, lolly, lollipop, popsicle", "930": "French loaf", "931": "bagel, beigel", "932": "pretzel", "933": "cheeseburger", "934": "hotdog, hot dog, red hot", "935": "mashed potato", "936": "head cabbage", "937": "broccoli", "938": "cauliflower", "939": "zucchini, courgette", "940": "spaghetti squash", "941": "acorn squash", "942": "butternut squash", "943": "cucumber, cuke", "944": "artichoke, globe artichoke", "945": "bell pepper", "946": "cardoon", "947": "mushroom", "948": "Granny Smith", "949": "strawberry", "950": "orange", "951": "lemon", "952": "fig", "953": "pineapple, ananas", "954": "banana", "955": "jackfruit, jak, jack", "956": "custard apple", "957": "pomegranate", "958": "hay", "959": "carbonara", "960": "chocolate sauce, chocolate syrup", "961": "dough", "962": "meat loaf, meatloaf", "963": "pizza, pizza pie", "964": "potpie", "965": "burrito", "966": "red wine", "967": "espresso", "968": "cup", "969": "eggnog", "970": "alp", "971": "bubble", "972": "cliff, drop, drop-off", "973": "coral reef", "974": "geyser", "975": "lakeside, lakeshore", "976": "promontory, headland, head, foreland", "977": "sandbar, sand bar", "978": "seashore, coast, seacoast, sea-coast", "979": "valley, vale", "980": "volcano", "981": "ballplayer, baseball player", "982": "groom, bridegroom", "983": "scuba diver", "984": "rapeseed", "985": "daisy", "986": "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", "987": "corn", "988": "acorn", "989": "hip, rose hip, rosehip", "990": "buckeye, horse chestnut, conker", "991": "coral fungus", "992": "agaric", "993": "gyromitra", "994": "stinkhorn, carrion fungus", "995": "earthstar", "996": "hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", "997": "bolete", "998": "ear, spike, capitulum", "999": "toilet tissue, toilet paper, bathroom tissue"} \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/hubconf.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/hubconf.py new file mode 100644 index 0000000..dd0ea97 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/hubconf.py @@ -0,0 +1,43 @@ +from efficientnet_pytorch import EfficientNet as _EfficientNet + +dependencies = ['torch'] + + +def _create_model_fn(model_name): + def _model_fn(num_classes=1000, in_channels=3, pretrained='imagenet'): + """Create Efficient Net. + + Described in detail here: https://arxiv.org/abs/1905.11946 + + Args: + num_classes (int, optional): Number of classes, default is 1000. + in_channels (int, optional): Number of input channels, default + is 3. + pretrained (str, optional): One of [None, 'imagenet', 'advprop'] + If None, no pretrained model is loaded. + If 'imagenet', models trained on imagenet dataset are loaded. + If 'advprop', models trained using adversarial training called + advprop are loaded. It is important to note that the + preprocessing required for the advprop pretrained models is + slightly different from normal ImageNet preprocessing + """ + model_name_ = model_name.replace('_', '-') + if pretrained is not None: + model = _EfficientNet.from_pretrained( + model_name=model_name_, + advprop=(pretrained == 'advprop'), + num_classes=num_classes, + in_channels=in_channels) + else: + model = _EfficientNet.from_name( + model_name=model_name_, + override_params={'num_classes': num_classes}, + ) + model._change_in_channels(in_channels) + + return model + + return _model_fn + +for model_name in ['efficientnet_b' + str(i) for i in range(9)]: + locals()[model_name] = _create_model_fn(model_name) diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/npu_1p.sh b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/npu_1p.sh new file mode 100644 index 0000000..f617134 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/npu_1p.sh @@ -0,0 +1,9 @@ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/python3.7.5/lib/ +export PYTHONPATH=${PYTHONPATH}:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/hccl +export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ +export PYTHONPATH=$PYTHONPATH:${PWD} +export SLOG_PRINT_TO_STDOUT=0 +export TASK_QUEUE_ENABLE=1 +taskset -c 0-64 python3.7 examples/imagenet/main.py --data=/data/imagenet --arch=efficientnet-b0 --batch-size=256 --lr=0.2 --epochs=200 --autoaug --npu=0 --amp --pm=O1 --loss_scale=1024 diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/setup.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/setup.py new file mode 100644 index 0000000..c4d3fee --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/setup.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Note: To use the 'upload' functionality of this file, you must: +# $ pipenv install twine --dev + +import io +import os +import sys +from shutil import rmtree + +from setuptools import find_packages, setup, Command + +# Package meta-data. +NAME = 'efficientnet_pytorch' +DESCRIPTION = 'EfficientNet implemented in PyTorch.' +URL = 'https://github.com/lukemelas/EfficientNet-PyTorch' +EMAIL = 'lmelaskyriazi@college.harvard.edu' +AUTHOR = 'Luke' +REQUIRES_PYTHON = '>=3.5.0' +VERSION = '0.7.0' + +# What packages are required for this module to be executed? +REQUIRED = [ + 'torch' +] + +# What packages are optional? +EXTRAS = { + # 'fancy feature': ['django'], +} + +# The rest you shouldn't have to touch too much :) +# ------------------------------------------------ +# Except, perhaps the License and Trove Classifiers! +# If you do change the License, remember to change the Trove Classifier for that! + +here = os.path.abspath(os.path.dirname(__file__)) + +# Import the README and use it as the long-description. +# Note: this will only work if 'README.md' is present in your MANIFEST.in file! +try: + with io.open(os.path.join(here, 'README.md'), encoding='utf-8') as f: + long_description = '\n' + f.read() +except FileNotFoundError: + long_description = DESCRIPTION + +# Load the package's __version__.py module as a dictionary. +about = {} +if not VERSION: + project_slug = NAME.lower().replace("-", "_").replace(" ", "_") + with open(os.path.join(here, project_slug, '__version__.py')) as f: + exec(f.read(), about) +else: + about['__version__'] = VERSION + + +class UploadCommand(Command): + """Support setup.py upload.""" + + description = 'Build and publish the package.' + user_options = [] + + @staticmethod + def status(s): + """Prints things in bold.""" + print('\033[1m{0}\033[0m'.format(s)) + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + try: + self.status('Removing previous builds…') + rmtree(os.path.join(here, 'dist')) + except OSError: + pass + + self.status('Building Source and Wheel (universal) distribution…') + os.system('{0} setup.py sdist bdist_wheel --universal'.format(sys.executable)) + + self.status('Uploading the package to PyPI via Twine…') + os.system('twine upload dist/*') + + self.status('Pushing git tags…') + os.system('git tag v{0}'.format(about['__version__'])) + os.system('git push --tags') + + sys.exit() + + +# Where the magic happens: +setup( + name=NAME, + version=about['__version__'], + description=DESCRIPTION, + long_description=long_description, + long_description_content_type='text/markdown', + author=AUTHOR, + author_email=EMAIL, + python_requires=REQUIRES_PYTHON, + url=URL, + packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]), + # py_modules=['model'], # If your package is a single module, use this instead of 'packages' + install_requires=REQUIRED, + extras_require=EXTRAS, + include_package_data=True, + license='Apache', + classifiers=[ + # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers + 'License :: OSI Approved :: Apache Software License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + ], + # $ setup.py publish support. + cmdclass={ + 'upload': UploadCommand, + }, +) diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/tests/test_model.py b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/tests/test_model.py new file mode 100644 index 0000000..0a03467 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/code/tests/test_model.py @@ -0,0 +1,124 @@ +from collections import OrderedDict + +import pytest +import torch +import torch.nn as nn + +from efficientnet_pytorch import EfficientNet + + +# -- fixtures ------------------------------------------------------------------------------------- + +@pytest.fixture(scope='module', params=[x for x in range(4)]) +def model(request): + return 'efficientnet-b{}'.format(request.param) + + +@pytest.fixture(scope='module', params=[True, False]) +def pretrained(request): + return request.param + + +@pytest.fixture(scope='function') +def net(model, pretrained): + return EfficientNet.from_pretrained(model) if pretrained else EfficientNet.from_name(model) + + +# -- tests ---------------------------------------------------------------------------------------- + +@pytest.mark.parametrize('img_size', [224, 256, 512]) +def test_forward(net, img_size): + """Test `.forward()` doesn't throw an error""" + data = torch.zeros((1, 3, img_size, img_size)) + output = net(data) + assert not torch.isnan(output).any() + + +def test_dropout_training(net): + """Test dropout `.training` is set by `.train()` on parent `nn.module`""" + net.train() + assert net._dropout.training == True + + +def test_dropout_eval(net): + """Test dropout `.training` is set by `.eval()` on parent `nn.module`""" + net.eval() + assert net._dropout.training == False + + +def test_dropout_update(net): + """Test dropout `.training` is updated by `.train()` and `.eval()` on parent `nn.module`""" + net.train() + assert net._dropout.training == True + net.eval() + assert net._dropout.training == False + net.train() + assert net._dropout.training == True + net.eval() + assert net._dropout.training == False + + +@pytest.mark.parametrize('img_size', [224, 256, 512]) +def test_modify_dropout(net, img_size): + """Test ability to modify dropout and fc modules of network""" + dropout = nn.Sequential(OrderedDict([ + ('_bn2', nn.BatchNorm1d(net._bn1.num_features)), + ('_drop1', nn.Dropout(p=net._global_params.dropout_rate)), + ('_linear1', nn.Linear(net._bn1.num_features, 512)), + ('_relu', nn.ReLU()), + ('_bn3', nn.BatchNorm1d(512)), + ('_drop2', nn.Dropout(p=net._global_params.dropout_rate / 2)) + ])) + fc = nn.Linear(512, net._global_params.num_classes) + + net._dropout = dropout + net._fc = fc + + data = torch.zeros((2, 3, img_size, img_size)) + output = net(data) + assert not torch.isnan(output).any() + + +@pytest.mark.parametrize('img_size', [224, 256, 512]) +def test_modify_pool(net, img_size): + """Test ability to modify pooling module of network""" + + class AdaptiveMaxAvgPool(nn.Module): + + def __init__(self): + super().__init__() + self.ada_avgpool = nn.AdaptiveAvgPool2d(1) + self.ada_maxpool = nn.AdaptiveMaxPool2d(1) + + def forward(self, x): + avg_x = self.ada_avgpool(x) + max_x = self.ada_maxpool(x) + x = torch.cat((avg_x, max_x), dim=1) + return x + + avg_pooling = AdaptiveMaxAvgPool() + fc = nn.Linear(net._fc.in_features * 2, net._global_params.num_classes) + + net._avg_pooling = avg_pooling + net._fc = fc + + data = torch.zeros((2, 3, img_size, img_size)) + output = net(data) + assert not torch.isnan(output).any() + + +@pytest.mark.parametrize('img_size', [224, 256, 512]) +def test_extract_endpoints(net, img_size): + """Test `.extract_endpoints()` doesn't throw an error""" + data = torch.zeros((1, 3, img_size, img_size)) + endpoints = net.extract_endpoints(data) + assert not torch.isnan(endpoints['reduction_1']).any() + assert not torch.isnan(endpoints['reduction_2']).any() + assert not torch.isnan(endpoints['reduction_3']).any() + assert not torch.isnan(endpoints['reduction_4']).any() + assert not torch.isnan(endpoints['reduction_5']).any() + assert endpoints['reduction_1'].size(2) == img_size // 2 + assert endpoints['reduction_2'].size(2) == img_size // 4 + assert endpoints['reduction_3'].size(2) == img_size // 8 + assert endpoints['reduction_4'].size(2) == img_size // 16 + assert endpoints['reduction_5'].size(2) == img_size // 32 diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/config/set_env_b023.sh b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/config/set_env_b023.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/config/set_env_b023.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/run.sh new file mode 100644 index 0000000..7a90b4a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/run.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name=$(cd $currentDir/..;basename `pwd`) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +# 清除旧日志 +rm -rf /var/log/npu/slog/host-0/* +rm -rf ${currentDir}/result/*.log + +#mkdir train job path +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir}" +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + this_ip=$(hostname -I |awk '{print $1}') + ln -snf ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/0/hw_efficientnet.log ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp ${jsonFilePath} root@$ip:${jsonFilePath} + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + rank_id=0 + #for device_id in $device_group;do + ln -snf ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/${first_device_id}/hw_efficientnet.log ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + # let rank_id++ + # done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/train.sh new file mode 100644 index 0000000..bc48baf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/EfficientNet/pytorch/scripts/train.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_efficientnet/training_job_${currtime}/ + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +export REMARK_LOG_FILE=hw_efficientnet.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + +#source ${currentDir}/config/npu_set_env.sh +source ${currentDir}/config/set_env_b023.sh +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export HCCL_RANK_TABLE_PATH=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + # 多卡多机 + export CLUSTER=True +fi + +if [ x"${mode}" == x"evaluate" ];then + pass + + +elif [ x"${rank_size}" == x"1" ];then + # 单卡 + taskset -c 0-128 python3.7 ${currentDir}/code/examples/imagenet/main.py \ + --data=${data_url} \ + --arch=efficientnet-b0 \ + --batch-size=${batch_size} \ + --lr=0.2 \ + --momentum=0 \ + --epochs=${epoches} \ + --autoaug \ + --amp \ + --pm=O1 \ + --loss_scale=128 \ + --val_feq=10 \ + --npu=${device} > ${train_job_dir}/train_${rank_size}p.log 2>&1 + + +elif [ ${rank_size} -le 8 ];then + # 单机多卡 + taskset -c 0-128 python3.7 ${currentDir}/code/examples/imagenet/main.py \ + --data=${data_url} \ + --arch=efficientnet-b0 \ + --batch-size=${batch_size} \ + --lr=${lr} \ + --momentum=0 \ + --epochs=${epoches} \ + --autoaug \ + --amp \ + --pm=O1 \ + --loss_scale=128 \ + --val_feq=10 \ + --addr=$(hostname -I |awk '{print $1}') \ + --dist-backend=hccl \ + --multiprocessing-distributed \ + --world-size 1 \ + --rank 0 \ + --device_list ${device_group} > ${train_job_dir}/train_${rank_size}p.log 2>&1 + + +fi + +#taskset -c 0-20 python3.7 ${currentDir}/code/efficientnet.py > ./train.log 2>&1 + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 efficientnet train success" + echo ":::ABK 1.0.0 efficientnet train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 efficientnet train success" >> ./hw_efficientnet.log +else + echo ":::ABK 1.0.0 efficientnet train failed" + echo ":::ABK 1.0.0 efficientnet train failed" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 efficientnet train failed" >> ./hw_efficientnet.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 efficientnet train total time: ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_efficientnet.log diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/download_dataset.sh b/train/atlas_benchmark-master/image_classification/MobileNet/download_dataset.sh new file mode 100644 index 0000000..a9bf588 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/download_dataset.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/README.md new file mode 100644 index 0000000..46314cc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/README.md @@ -0,0 +1,25 @@ +# MobileNet_pytorch训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/MobileNet.yaml中修改相应配置, 配置项含义: + +``` +pytorch_config: + data_url: 数据集路径 + epoches: 跑多少个epoch + batch_size: 单p默认768 2p 1534 4p 3072 8p默认6144 + lr: 默认参数1p 0.03 2p 0.06 4p 0.12 8p 0.24 + seed: 123456 + docker_image: docker 镜像名称:版本号 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/README.md new file mode 100644 index 0000000..c69bf2e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/README.md @@ -0,0 +1 @@ +# MobileNetV2 NPU训练 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/hook.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/hook.py new file mode 100644 index 0000000..6216f0e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/hook.py @@ -0,0 +1,29 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +g_feat_in = [] +g_feat_out = [] +g_grad_in = [] +g_grad_out = [] + + +def forward_hook_fn(module, input, output): + g_feat_in.append(input) + g_feat_out.append(output) + print(module) + print(input) + print(output) + + +def backward_hook_fn(module, grad_input, grad_output): + g_grad_in.append(grad_input) + g_grad_out.append(grad_output) + print(module) + print(grad_input) + print(grad_input) + + + + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/main_apex.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/main_apex.py new file mode 100644 index 0000000..8ac73ca --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/main_apex.py @@ -0,0 +1,498 @@ +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models +from mobilenet import mobilenet_v2 +import torch.npu + +# from torch.utils.tensorboard import SummaryWriter + +from apex import amp +import numpy as np + +from hook import * + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +# model_names = sorted(name for name in models.__dict__ +# if name.islower() and not name.startswith("__") +# and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/dataset/imagenet', + help='path to dataset') +# parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', +# choices=model_names, +# help='model architecture: ' + +# ' | '.join(model_names) + +# ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=256, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') + +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--opt-level', default=None, type=str, help='apex optimize level') +parser.add_argument('--loss-scale-value', default='1024', type=int, help='static loss scale value') + +parser.add_argument('--summary-path', default=None, type=str, help='event file path') +parser.add_argument('--stop-step-num', default=None, type=int, help='after the stop-step, killing the training task') +parser.add_argument('--device', default='npu:0', type=str, help='device type, cpu or npu:x or cuda:x') +parser.add_argument('--eval-freq', default=10, type=int, help='test interval') +parser.add_argument('--hook', default=False, action='store_true', help='pytorch hook') + +best_acc1 = 0 +cur_step = 0 + + +def seed_everything(seed, device): + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + if 'cuda' in device: + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + cudnn.deterministic = True + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def main(): + args = parser.parse_args() + + if args.seed is not None: + seed_everything(args.seed, args.device) + + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + main_worker(args) + + +def main_worker(args): + global best_acc1 + global cur_step + + # sum_writer = SummaryWriter(args.summary_path) + global_step = -1 + + if 'npu' in args.device: + torch.npu.set_device(args.device) + if 'cuda' in args.device: + torch.cuda.set_device(args.device) + + model = mobilenet_v2() + + # set hook + if args.hook: + modules = model.named_modules() + for name, module in modules: + module.register_forward_hook(forward_hook_fn) + module.register_backward_hook(backward_hook_fn) + + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + criterion = nn.CrossEntropyLoss() + + if 'npu' in args.device or 'cuda' in args.device: + model = model.to(args.device) + criterion = criterion.to(args.device) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale_value) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=args.device) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, drop_last=True) + + if args.evaluate: + validate(val_loader, model, criterion, args, global_step) + return + + for epoch in range(args.start_epoch, args.epochs): + + # train for one epoch + global_step = train(train_loader, model, criterion, optimizer, epoch, args, global_step) + + if (epoch + 1) % (args.eval_freq) == 0 or epoch == args.epochs - 1: + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, global_step) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + # save checkpoint + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + if args.stop_step_num is not None and cur_step >= args.stop_step_num: + break + + # sum_writer.close() + + +def train(train_loader, model, criterion, optimizer, epoch, args, global_step, sum_writer=None): + global cur_step + + if args.seed is not None: + seed_everything(args.seed + epoch, args.device) + + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + learning_rate = AverageMeter('LR', ':2.8f') + losses = AverageMeter('Loss', ':6.8f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, learning_rate, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + + end = time.time() + steps_per_epoch = len(train_loader) + for i, (images, target) in enumerate(train_loader): + + global_step = epoch * steps_per_epoch + i + cur_step = global_step + + lr = adjust_learning_rate(optimizer, global_step, steps_per_epoch, args) + + learning_rate.update(lr) + + # sum_writer.add_scalar('learning rate', lr, global_step) + + # measure data loading time + data_time.update(time.time() - end) + + if 'npu' in args.device: + target = target.to(torch.int32) + + if 'npu' in args.device or 'cuda' in args.device: + images = images.to(args.device, non_blocking=True) + target = target.to(args.device, non_blocking=True) + + # output = None + # loss = None + # with torch.autograd.profiler.profile(record_shapes=True, use_npu=True) as prof: + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + optimizer.zero_grad() + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + # sum_writer.add_scalar('Accuary/train/top1', acc1, global_step) + # sum_writer.add_scalar('Accuary/train/top5', acc5, global_step) + # sum_writer.add_scalar('Loss/train/loss', loss, global_step) + + optimizer.step() + # for name, parms in model.named_parameters(): + # print('-->name:', name, ' -->grad_value_max:', torch.max(parms.grad), ' -->grad_value_min:', torch.min(parms.grad)) + + # print(prof.key_averages().table()) + # prof.export_chrome_trace("mobilenetv2_{}_npu.prof".format(i)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + if args.stop_step_num is not None and cur_step >= args.stop_step_num: + break + + print(' * FPS@all {:.3f}'.format(args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(args.batch_size / batch_time.avg)) + return global_step + + +def validate(val_loader, model, criterion, args, global_step, sum_writer=None): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + if 'npu' in args.device: + target = target.to(torch.int32) + + if 'npu' in args.device or 'cuda' in args.device: + images = images.to(args.device, non_blocking=True) + target = target.to(args.device, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + #if not args.evaluate: + # # sum_writer.add_scalar('Loss/validation/loss', losses, global_step) + # sum_writer.add_scalar('Accuary/validation/top1', top1.avg, global_step) + # sum_writer.add_scalar('Accuary/validation/top5', top5.avg, global_step) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best.pth.tar') + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + # 日志打点 + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, global_step, steps_per_epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.98 ** (epoch / 2.5)) + lr = args.lr * (0.98 ** (global_step // int(steps_per_epoch * 2.5))) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/mobilenet.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/mobilenet.py new file mode 100644 index 0000000..356f491 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/mobilenet.py @@ -0,0 +1,179 @@ +from torch import nn +# from .utils import load_state_dict_from_url + + +__all__ = ['MobileNetV2', 'mobilenet_v2'] + + +model_urls = { + 'mobilenet_v2': 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth', +} + + +def _make_divisible(v, divisor, min_value=None): + """ + This function is taken from the original tf repo. + It ensures that all layers have a channel number that is divisible by 8 + It can be seen here: + https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py + :param v: + :param divisor: + :param min_value: + :return: + """ + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +class ConvBNReLU(nn.Sequential): + def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, groups=1): + padding = (kernel_size - 1) // 2 + super(ConvBNReLU, self).__init__( + nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, groups=groups, bias=False), + nn.BatchNorm2d(out_planes), + nn.ReLU6(inplace=True) + # nn.ReLU(inplace=True) + ) + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, expand_ratio): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2] + + hidden_dim = int(round(inp * expand_ratio)) + self.use_res_connect = self.stride == 1 and inp == oup + + layers = [] + if expand_ratio != 1: + # pw + layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1)) + layers.extend([ + # dw + ConvBNReLU(hidden_dim, hidden_dim, stride=stride, groups=hidden_dim), + # pw-linear + nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False), + nn.BatchNorm2d(oup), + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + +class MobileNetV2(nn.Module): + def __init__(self, + num_classes=1000, + width_mult=1.0, + inverted_residual_setting=None, + round_nearest=8, + block=None): + """ + MobileNet V2 main class + + Args: + num_classes (int): Number of classes + width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount + inverted_residual_setting: Network structure + round_nearest (int): Round the number of channels in each layer to be a multiple of this number + Set to 1 to turn off rounding + block: Module specifying inverted residual building block for mobilenet + + """ + super(MobileNetV2, self).__init__() + + if block is None: + block = InvertedResidual + input_channel = 32 + last_channel = 1280 + + if inverted_residual_setting is None: + inverted_residual_setting = [ + # t, c, n, s + [1, 16, 1, 1], + [6, 24, 2, 2], + [6, 32, 3, 2], + [6, 64, 4, 2], + [6, 96, 3, 1], + [6, 160, 3, 2], + [6, 320, 1, 1], + ] + + # only check the first element, assuming user knows t,c,n,s are required + if len(inverted_residual_setting) == 0 or len(inverted_residual_setting[0]) != 4: + raise ValueError("inverted_residual_setting should be non-empty " + "or a 4-element list, got {}".format(inverted_residual_setting)) + + # building first layer + input_channel = _make_divisible(input_channel * width_mult, round_nearest) + self.last_channel = _make_divisible(last_channel * max(1.0, width_mult), round_nearest) + features = [ConvBNReLU(3, input_channel, stride=2)] + # building inverted residual blocks + for t, c, n, s in inverted_residual_setting: + output_channel = _make_divisible(c * width_mult, round_nearest) + for i in range(n): + stride = s if i == 0 else 1 + features.append(block(input_channel, output_channel, stride, expand_ratio=t)) + input_channel = output_channel + # building last several layers + features.append(ConvBNReLU(input_channel, self.last_channel, kernel_size=1)) + # make it nn.Sequential + self.features = nn.Sequential(*features) + + # building classifier + self.classifier = nn.Sequential( + # p=0.2 + nn.Dropout(0.2), + nn.Linear(self.last_channel, num_classes), + ) + + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.zeros_(m.bias) + + def _forward_impl(self, x): + # This exists since TorchScript doesn't support inheritance, so the superclass method + # (this one) needs to have a name other than `forward` that can be accessed in a subclass + x = self.features(x) + # Cannot use "squeeze" as batch-size can be 1 => must use reshape with x.shape[0] + x = nn.functional.adaptive_avg_pool2d(x, 1).reshape(x.shape[0], -1) + x = self.classifier(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def mobilenet_v2(pretrained=False, progress=True, **kwargs): + """ + Constructs a MobileNetV2 architecture from + `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + model = MobileNetV2(**kwargs) + # if pretrained: + # state_dict = load_state_dict_from_url(model_urls['mobilenet_v2'], + # progress=progress) + # model.load_state_dict(state_dict) + return model diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/profiling.json b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/profiling.json new file mode 100644 index 0000000..d0d9b1f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/1p/profiling.json @@ -0,0 +1,18 @@ +{ + "startCfg": + [ + { + "jobID": "123456789", + "deviceID": ["0"], + "features": + [ + { + "name": "task_trace" + }, + { + "name": "training_trace" + } + ] + } + ] +} diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/README.md new file mode 100644 index 0000000..c69bf2e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/README.md @@ -0,0 +1 @@ +# MobileNetV2 NPU训练 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/eval.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/eval.sh new file mode 100644 index 0000000..16d5c5e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/eval.sh @@ -0,0 +1,22 @@ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export SLOG_PRINT_TO_STDOUT=0 +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 7" + +export TASK_QUEUE_ENABLE=0 +taskset -c 111-150 python3 densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 7 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --batch-size 256 \ + --epoch 90 \ + --evaluate \ + --resume checkpoint.pth.tar \ + --data /opt/npu/dataset/imagenet \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/hook.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/hook.py new file mode 100644 index 0000000..6216f0e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/hook.py @@ -0,0 +1,29 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + +g_feat_in = [] +g_feat_out = [] +g_grad_in = [] +g_grad_out = [] + + +def forward_hook_fn(module, input, output): + g_feat_in.append(input) + g_feat_out.append(output) + print(module) + print(input) + print(output) + + +def backward_hook_fn(module, grad_input, grad_output): + g_grad_in.append(grad_input) + g_grad_out.append(grad_output) + print(module) + print(grad_input) + print(grad_input) + + + + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/main_apex.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/main_apex.py new file mode 100644 index 0000000..ace66d3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/main_apex.py @@ -0,0 +1,556 @@ +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models +from mobilenet import mobilenet_v2 +import torch.npu +import torch.cuda + +from torch.utils.tensorboard import SummaryWriter + +from apex import amp +import numpy as np + +from hook import * + + +# model_names = sorted(name for name in models.__dict__ +# if name.islower() and not name.startswith("__") +# and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/dataset/imagenet', + help='path to dataset') +# parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', +# choices=model_names, +# help='model architecture: ' + +# ' | '.join(model_names) + +# ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=256, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +# parser.add_argument('--world-size', default=-1, type=int, +# help='number of nodes for distributed training') +parser.add_argument('--node-nums', default=1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=0, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') + +parser.add_argument('--addr', default='10.136.181.115', type=str, + help='master addr') +parser.add_argument('--device-id', default=None, type=int, + help='GPU id to use.') + +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--opt-level', default=None, type=str, help='apex optimize level') +parser.add_argument('--loss-scale-value', default='1024', type=int, help='static loss scale value') + +parser.add_argument('--summary-path', default=None, type=str, help='event file path') +parser.add_argument('--stop-step-num', default=None, type=int, help='after the stop-step, killing the training task') +parser.add_argument('--device', default='npu', type=str, help='device type, cpu or npu:x or cuda') +parser.add_argument('--eval-freq', default=10, type=int, help='test interval') +parser.add_argument('--hook', default=False, action='store_true', help='pytorch hook') + +best_acc1 = 0 +cur_step = 0 + + +def seed_everything(seed, device): + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + if 'cuda' in device: + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + cudnn.deterministic = True + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def main(): + args = parser.parse_args() + + if args.seed is not None: + seed_everything(args.seed, args.device) + + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr + os.environ['MASTER_PORT'] = '90000' + + args.distributed = args.node_nums > 1 or args.multiprocessing_distributed + if not args.distributed: + print('dist param is not correct!') + return + + if args.device == 'npu': + # device_nums_per_node = torch.npu.device_count() + device_nums_per_node = 2 + elif args.device == 'cuda': + device_nums_per_node = torch.cuda.device_count() + else: + print('unknown device type[npu/cuda]!') + return + + if args.multiprocessing_distributed: + args.world_size = device_nums_per_node * args.node_nums # world_size means nums of all devices or nums of processes + if args.device == 'npu': + # main_worker(args.device_id, ngpus_per_node, args) # 需要外层脚本启多个进程 + mp.spawn(main_worker, nprocs=device_nums_per_node, args=(device_nums_per_node, args)) # 这里起子进程,就不需要外层脚本启多个进程了 + else: + mp.spawn(main_worker, nprocs=device_nums_per_node, args=(device_nums_per_node, args)) + else: + print('dist param is not correct!') + return + # main_worker(args.device_id, device_nums_per_node, args) + + +# first param must be the index of PID +def main_worker(pid_idx, device_nums_per_node, args): + global best_acc1 + global cur_step + + # dist set + sum_writer = SummaryWriter(args.summary_path) + global_step = -1 + + if args.distributed: + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = pid_idx # args.rank * device_nums_per_node + pid_idx + args.pid_idx = pid_idx + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + if args.distributed: + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.device == 'npu': + loc = 'npu:{}'.format(pid_idx) + torch.npu.set_device(loc) + else: + torch.cuda.set_device(pid_idx) + + args.batch_size = int(args.batch_size / device_nums_per_node) + args.workers = int((args.workers + device_nums_per_node - 1) / device_nums_per_node) + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, drop_last=True) + + # define model and train + model = mobilenet_v2() + + criterion = nn.CrossEntropyLoss() + + loc = None + if 'npu' == args.device: + loc = 'npu:{}'.format(pid_idx) + elif 'cuda' == args.device: + loc = 'cuda:{}'.format(pid_idx) + model = model.to(loc) + + criterion = criterion.to(loc) + + optimizer = torch.optim.SGD(model.parameters(), args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale_value) + + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[pid_idx], broadcast_buffers=False) + # model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) + + # set hook + if args.hook: + modules = model.named_modules() + for name, module in modules: + module.register_forward_hook(forward_hook_fn) + module.register_backward_hook(backward_hook_fn) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=args.device) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + if args.evaluate: + validate(val_loader, model, criterion, args, global_step, sum_writer) + return + + for epoch in range(args.start_epoch, args.epochs): + + # train for one epoch + global_step = train(train_loader, model, criterion, optimizer, epoch, args, global_step, sum_writer, device_nums_per_node) + + if (epoch + 1) % args.eval_freq == 0 or epoch == args.epochs - 1: + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, global_step, sum_writer, device_nums_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + # save checkpoint + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + if args.stop_step_num is not None and cur_step >= args.stop_step_num: + break + + sum_writer.close() + + +def train(train_loader, model, criterion, optimizer, epoch, args, global_step, sum_writer, device_nums_per_node): + global cur_step + + if args.seed is not None: + seed_everything(args.seed + epoch, args.device) + + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + learning_rate = AverageMeter('LR', ':2.8f') + losses = AverageMeter('Loss', ':6.8f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, learning_rate, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + + end = time.time() + steps_per_epoch = len(train_loader) + for i, (images, target) in enumerate(train_loader): + + global_step = epoch * steps_per_epoch + i + cur_step = global_step + + lr = adjust_learning_rate(optimizer, global_step, steps_per_epoch, args) + + learning_rate.update(lr) + + sum_writer.add_scalar('learning rate', lr, global_step) + + # measure data loading time + data_time.update(time.time() - end) + + if 'npu' in args.device: + target = target.to(torch.int32) + + loc = None + if 'npu' in args.device: + loc = 'npu:{}'.format(args.pid_idx) + elif 'cuda' in args.device: + loc = 'cuda:{}'.format(args.pid_idx) + images = images.to(loc, non_blocking=True) + target = target.to(loc, non_blocking=True) + + # output = None + # loss = None + # with torch.autograd.profiler.profile(record_shapes=True, use_npu=True) as prof: + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + optimizer.zero_grad() + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + sum_writer.add_scalar('Accuary/train/top1', acc1, global_step) + sum_writer.add_scalar('Accuary/train/top5', acc5, global_step) + sum_writer.add_scalar('Loss/train/loss', loss, global_step) + + optimizer.step() + # for name, parms in model.named_parameters(): + # print('-->name:', name, ' -->grad_value_max:', torch.max(parms.grad), ' -->grad_value_min:', torch.min(parms.grad)) + + # print(prof.key_averages().table()) + # prof.export_chrome_trace("mobilenetv2_{}_npu.prof".format(i)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % device_nums_per_node == 0): + progress.display(i) + + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % device_nums_per_node == 0): + print('FPS@all: {:.3f}'.format(8 * args.batch_size / batch_time.avg)) + + if args.stop_step_num is not None and cur_step >= args.stop_step_num: + break + + return global_step + + +def validate(val_loader, model, criterion, args, global_step, sum_writer, device_nums_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + if 'npu' in args.device: + target = target.to(torch.int32) + + loc = None + if 'npu' in args.device: + loc = 'npu:{}'.format(args.pid_idx) + elif 'cuda' in args.device: + loc = 'cuda:{}'.format(args.pid_idx) + images = images.to(loc, non_blocking=True) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % device_nums_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % device_nums_per_node == 0): + print("[device id:", args.gpu, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'.format(top1=top1, top5=top5)) + + if not args.evaluate: + # sum_writer.add_scalar('Loss/validation/loss', losses, global_step) + sum_writer.add_scalar('Accuary/validation/top1', top1.avg, global_step) + sum_writer.add_scalar('Accuary/validation/top5', top5.avg, global_step) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best.pth.tar') + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, global_step, steps_per_epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.98 ** (epoch / 2.5)) + lr = args.lr * (0.98 ** (global_step // int(steps_per_epoch * 2.5))) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenet.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenet.py new file mode 100644 index 0000000..356f491 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenet.py @@ -0,0 +1,179 @@ +from torch import nn +# from .utils import load_state_dict_from_url + + +__all__ = ['MobileNetV2', 'mobilenet_v2'] + + +model_urls = { + 'mobilenet_v2': 'https://download.pytorch.org/models/mobilenet_v2-b0353104.pth', +} + + +def _make_divisible(v, divisor, min_value=None): + """ + This function is taken from the original tf repo. + It ensures that all layers have a channel number that is divisible by 8 + It can be seen here: + https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py + :param v: + :param divisor: + :param min_value: + :return: + """ + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +class ConvBNReLU(nn.Sequential): + def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, groups=1): + padding = (kernel_size - 1) // 2 + super(ConvBNReLU, self).__init__( + nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, groups=groups, bias=False), + nn.BatchNorm2d(out_planes), + nn.ReLU6(inplace=True) + # nn.ReLU(inplace=True) + ) + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, expand_ratio): + super(InvertedResidual, self).__init__() + self.stride = stride + assert stride in [1, 2] + + hidden_dim = int(round(inp * expand_ratio)) + self.use_res_connect = self.stride == 1 and inp == oup + + layers = [] + if expand_ratio != 1: + # pw + layers.append(ConvBNReLU(inp, hidden_dim, kernel_size=1)) + layers.extend([ + # dw + ConvBNReLU(hidden_dim, hidden_dim, stride=stride, groups=hidden_dim), + # pw-linear + nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False), + nn.BatchNorm2d(oup), + ]) + self.conv = nn.Sequential(*layers) + + def forward(self, x): + if self.use_res_connect: + return x + self.conv(x) + else: + return self.conv(x) + + +class MobileNetV2(nn.Module): + def __init__(self, + num_classes=1000, + width_mult=1.0, + inverted_residual_setting=None, + round_nearest=8, + block=None): + """ + MobileNet V2 main class + + Args: + num_classes (int): Number of classes + width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount + inverted_residual_setting: Network structure + round_nearest (int): Round the number of channels in each layer to be a multiple of this number + Set to 1 to turn off rounding + block: Module specifying inverted residual building block for mobilenet + + """ + super(MobileNetV2, self).__init__() + + if block is None: + block = InvertedResidual + input_channel = 32 + last_channel = 1280 + + if inverted_residual_setting is None: + inverted_residual_setting = [ + # t, c, n, s + [1, 16, 1, 1], + [6, 24, 2, 2], + [6, 32, 3, 2], + [6, 64, 4, 2], + [6, 96, 3, 1], + [6, 160, 3, 2], + [6, 320, 1, 1], + ] + + # only check the first element, assuming user knows t,c,n,s are required + if len(inverted_residual_setting) == 0 or len(inverted_residual_setting[0]) != 4: + raise ValueError("inverted_residual_setting should be non-empty " + "or a 4-element list, got {}".format(inverted_residual_setting)) + + # building first layer + input_channel = _make_divisible(input_channel * width_mult, round_nearest) + self.last_channel = _make_divisible(last_channel * max(1.0, width_mult), round_nearest) + features = [ConvBNReLU(3, input_channel, stride=2)] + # building inverted residual blocks + for t, c, n, s in inverted_residual_setting: + output_channel = _make_divisible(c * width_mult, round_nearest) + for i in range(n): + stride = s if i == 0 else 1 + features.append(block(input_channel, output_channel, stride, expand_ratio=t)) + input_channel = output_channel + # building last several layers + features.append(ConvBNReLU(input_channel, self.last_channel, kernel_size=1)) + # make it nn.Sequential + self.features = nn.Sequential(*features) + + # building classifier + self.classifier = nn.Sequential( + # p=0.2 + nn.Dropout(0.2), + nn.Linear(self.last_channel, num_classes), + ) + + # weight initialization + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode='fan_out') + if m.bias is not None: + nn.init.zeros_(m.bias) + elif isinstance(m, nn.BatchNorm2d): + nn.init.ones_(m.weight) + nn.init.zeros_(m.bias) + elif isinstance(m, nn.Linear): + nn.init.normal_(m.weight, 0, 0.01) + nn.init.zeros_(m.bias) + + def _forward_impl(self, x): + # This exists since TorchScript doesn't support inheritance, so the superclass method + # (this one) needs to have a name other than `forward` that can be accessed in a subclass + x = self.features(x) + # Cannot use "squeeze" as batch-size can be 1 => must use reshape with x.shape[0] + x = nn.functional.adaptive_avg_pool2d(x, 1).reshape(x.shape[0], -1) + x = self.classifier(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def mobilenet_v2(pretrained=False, progress=True, **kwargs): + """ + Constructs a MobileNetV2 architecture from + `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + model = MobileNetV2(**kwargs) + # if pretrained: + # state_dict = load_state_dict_from_url(model_urls['mobilenet_v2'], + # progress=progress) + # model.load_state_dict(state_dict) + return model diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main.py new file mode 100644 index 0000000..ff89201 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main.py @@ -0,0 +1,638 @@ +# -*- coding: utf-8 -*- + +import argparse +import os +import random +import shutil +import time +import warnings + +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models + +from mobilenet import mobilenet_v2 +from apex import amp +from multi_epochs_dataloader import MultiEpochsDataLoader + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +BATCH_SIZE = 4096 +OPTIMIZER_BATCH_SIZE = 4096 +# model_names = sorted(name for name in models.__dict__ +# if name.islower() and not name.startswith("__") +# and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +# parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', +# choices=model_names, +# help='model architecture: ' + +# ' | '.join(model_names) + +# ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('--workspace', type=str, default='./', metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, help='npu or gpu') +parser.add_argument('--addr', default='10.136.181.115', type=str, help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=0, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=64., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + +warnings.filterwarnings('ignore') +best_acc1 = 0 + + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + + os.environ['KERNEL_NAME_ID'] = str(0) + print("++++++++++++++++++ KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '59629' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + if args.device == 'npu': + ngpus_per_node = torch.npu.device_count() + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + if args.device == 'npu': + # main_worker(args.gpu, ngpus_per_node, args) + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + + print("[npu id:", args.gpu, "]", "++++++++++++++++ before set KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(gpu) + print("[npu id:", args.gpu, "]", "++++++++++++++++ KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[npu id:", args.gpu, "]", "Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, # init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + print("[npu id:", args.gpu, "]", args) + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + + # Data loading code + # traindir = os.path.join(args.data, 'train') + # valdir = os.path.join(args.data, 'val') + # normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + # std=[0.229, 0.224, 0.225]) + + # train_dataset = datasets.ImageFolder( + # traindir, + # transforms.Compose([ + # transforms.RandomResizedCrop(224), + # transforms.RandomHorizontalFlip(), + # transforms.ToTensor(), + # normalize, + # ])) + # + # if args.distributed: + # train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + # else: + # train_sampler = None + # + # train_loader = torch.utils.data.DataLoader( + # train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + # num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + train_loader, train_loader_len, train_sampler = get_pytorch_train_loader(args.data, + args.batch_size, + workers=args.workers, + distributed=args.distributed) + + # val_loader = torch.utils.data.DataLoader( + # datasets.ImageFolder(valdir, transforms.Compose([ + # transforms.Resize(256), + # transforms.CenterCrop(224), + # transforms.ToTensor(), + # normalize, + # ])), + # batch_size=args.batch_size, shuffle=True, + # num_workers=args.workers, pin_memory=True, drop_last=True) + + val_loader = get_pytorch_val_loader(args.data, args.batch_size, args.workers, distributed=False) + + # create model + print("[npu id:", args.gpu, "]", "=> creating model '{}'".format('mobilenetv2')) + # model = models.__dict__[args.arch]() + model = mobilenet_v2() + model = model.to(loc) + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})".format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + if args.evaluate: + validate(val_loader, model, criterion, args, ngpus_per_node) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + # adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node) + + if (epoch + 1) % args.eval_freq == 0 or epoch == args.epochs - 1: + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0 and epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + +def train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + train_loader_len, + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + loc = 'npu:{}'.format(args.gpu) + + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + # switch to train mode + model.train() + end = time.time() + if args.benchmark == 1: + optimizer.zero_grad() + + # steps_per_epoch = len(train_loader) + steps_per_epoch = train_loader_len + print('==========step per epoch======================', steps_per_epoch) + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + global_step = epoch * steps_per_epoch + i + lr = adjust_learning_rate(optimizer, global_step, steps_per_epoch, args) + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + # stream = torch.npu.current_stream() + # stream.synchronize() + + loss = criterion(output, target) + # stream = torch.npu.current_stream() + # stream.synchronize() + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0: + optimizer.zero_grad() + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + # stream = torch.npu.current_stream() + # stream.synchronize() + + if args.benchmark == 0: + optimizer.step() + elif args.benchmark == 1: + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + # stream = torch.npu.current_stream() + # stream.synchronize() + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '* FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, + value=' * FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + + +def validate(val_loader, model, criterion, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + loc = 'npu:{}'.format(args.gpu) + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + end = time.time() + for i, (images, target) in enumerate(val_loader): + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar' % (state['best_acc1'], state['epoch'])) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + if self.count == 0: + self.batchsize = n + + self.val = val + self.count += n + if self.count > (self.start_count_index * self.batchsize): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * self.batchsize) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[npu id:", os.environ['KERNEL_NAME_ID'], "]", '\t'.join(entries)) + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +# def adjust_learning_rate(optimizer, epoch, args): +# """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" +# lr = args.lr * (0.1 ** (epoch // 30)) +# for param_group in optimizer.param_groups: +# param_group['lr'] = lr + +def adjust_learning_rate(optimizer, global_step, steps_per_epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.98 ** (epoch / 2.5)) + lr = args.lr * (0.98 ** (global_step // int(steps_per_epoch * 2.5))) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +def fast_collate(batch): + imgs = [img[0] for img in batch] + targets = torch.tensor([target[1] for target in batch], dtype=torch.int64) + w = imgs[0].size[0] + h = imgs[0].size[1] + tensor = torch.zeros((len(imgs), 3, h, w), dtype=torch.uint8) + for i, img in enumerate(imgs): + nump_array = np.asarray(img, dtype=np.uint8) + if nump_array.ndim < 3: + nump_array = np.expand_dims(nump_array, axis=-1) + nump_array = np.rollaxis(nump_array, 2) + + tensor[i] += torch.from_numpy(nump_array) + + return tensor, targets + + +def get_pytorch_train_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + traindir = os.path.join(data_path, 'train') + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + ])) + + if distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + train_loader = dataloader_fn( + train_dataset, batch_size=batch_size, shuffle=(train_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, sampler=train_sampler, collate_fn=fast_collate, drop_last=True) + return train_loader, len(train_loader), train_sampler + + +def get_pytorch_val_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + valdir = os.path.join(data_path, 'val') + val_dataset = datasets.ImageFolder( + valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + ])) + + if distributed: + val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset) + else: + val_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + val_loader = dataloader_fn( + val_dataset, + sampler=val_sampler, + batch_size=batch_size, shuffle=(val_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, collate_fn=fast_collate) + + return val_loader + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main_anycard.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main_anycard.py new file mode 100644 index 0000000..05bc36d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/mobilenetv2_8p_main_anycard.py @@ -0,0 +1,663 @@ +# -*- coding: utf-8 -*- + +import argparse +import os +import random +import shutil +import time +import warnings + +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models + +from mobilenet import mobilenet_v2 +from apex import amp +from multi_epochs_dataloader import MultiEpochsDataLoader + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +BATCH_SIZE = 6144 +OPTIMIZER_BATCH_SIZE = 6144 +# model_names = sorted(name for name in models.__dict__ +# if name.islower() and not name.startswith("__") +# and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +# parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', +# choices=model_names, +# help='model architecture: ' + +# ' | '.join(model_names) + +# ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('--workspace', type=str, default='./', metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, help='npu or gpu') +parser.add_argument('--addr', default='10.136.181.115', type=str, help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=0, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') + +parser.add_argument('--device-list', default='0,1,2,3,4,5,6,7', type=str, help='device id list') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=64., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + +warnings.filterwarnings('ignore') +best_acc1 = 0 + + +def device_id_to_process_device_map(device_list): + devices = device_list.split(",") + devices = [int(x) for x in devices] + devices.sort() + + process_device_map = dict() + for process_id, device_id in enumerate(devices): + process_device_map[process_id] = device_id + + return process_device_map + + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + + os.environ['KERNEL_NAME_ID'] = str(0) + print("++++++++++++++++++ KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '59629' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + args.process_device_map = device_id_to_process_device_map(args.device_list) + + if args.device == 'npu': + # ngpus_per_node = torch.npu.device_count() + ngpus_per_node = len(args.process_device_map) + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + if args.device == 'npu': + # main_worker(args.gpu, ngpus_per_node, args) + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + # args.gpu = gpu + args.gpu = args.process_device_map[gpu] + + print("[npu id:", args.gpu, "]", "++++++++++++++++ before set KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(gpu) + print("[npu id:", args.gpu, "]", "++++++++++++++++ KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[npu id:", args.gpu, "]", "Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, # init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + print("[npu id:", args.gpu, "]", args) + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + + # Data loading code + # traindir = os.path.join(args.data, 'train') + # valdir = os.path.join(args.data, 'val') + # normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + # std=[0.229, 0.224, 0.225]) + + # train_dataset = datasets.ImageFolder( + # traindir, + # transforms.Compose([ + # transforms.RandomResizedCrop(224), + # transforms.RandomHorizontalFlip(), + # transforms.ToTensor(), + # normalize, + # ])) + # + # if args.distributed: + # train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + # else: + # train_sampler = None + # + # train_loader = torch.utils.data.DataLoader( + # train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + # num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + train_loader, train_loader_len, train_sampler = get_pytorch_train_loader(args.data, + args.batch_size, + workers=args.workers, + distributed=args.distributed) + + # val_loader = torch.utils.data.DataLoader( + # datasets.ImageFolder(valdir, transforms.Compose([ + # transforms.Resize(256), + # transforms.CenterCrop(224), + # transforms.ToTensor(), + # normalize, + # ])), + # batch_size=args.batch_size, shuffle=True, + # num_workers=args.workers, pin_memory=True, drop_last=True) + + val_loader = get_pytorch_val_loader(args.data, args.batch_size, args.workers, distributed=False) + + # create model + print("[npu id:", args.gpu, "]", "=> creating model '{}'".format('mobilenetv2')) + # model = models.__dict__[args.arch]() + model = mobilenet_v2() + model = model.to(loc) + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})".format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + if args.evaluate: + validate(val_loader, model, criterion, args, ngpus_per_node) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + # adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node) + + if (epoch + 1) % args.eval_freq == 0 or epoch == args.epochs - 1: + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0 and epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + +def train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + train_loader_len, + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + loc = 'npu:{}'.format(args.gpu) + + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + # switch to train mode + model.train() + end = time.time() + if args.benchmark == 1: + optimizer.zero_grad() + + # steps_per_epoch = len(train_loader) + steps_per_epoch = train_loader_len + print('==========step per epoch======================', steps_per_epoch) + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + global_step = epoch * steps_per_epoch + i + lr = adjust_learning_rate(optimizer, global_step, steps_per_epoch, args) + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + stream = torch.npu.current_stream() + stream.synchronize() + + loss = criterion(output, target) + stream = torch.npu.current_stream() + stream.synchronize() + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0: + optimizer.zero_grad() + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + stream = torch.npu.current_stream() + stream.synchronize() + + if args.benchmark == 0: + optimizer.step() + elif args.benchmark == 1: + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + stream = torch.npu.current_stream() + stream.synchronize() + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '* FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + + +def validate(val_loader, model, criterion, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + loc = 'npu:{}'.format(args.gpu) + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + end = time.time() + for i, (images, target) in enumerate(val_loader): + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar' % (state['best_acc1'], state['epoch'])) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + if self.count == 0: + self.batchsize = n + + self.val = val + self.count += n + if self.count > (self.start_count_index * self.batchsize): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * self.batchsize) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[npu id:", os.environ['KERNEL_NAME_ID'], "]", '\t'.join(entries)) + train_acc1 = str(entries).split("Acc@1")[1].strip().split(" ")[0] + train_acc5 = str(entries).split("Acc@5")[1].strip().split(" ")[0] + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP1, value=train_acc1) + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY_TOP5, value=train_acc5) + + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +# def adjust_learning_rate(optimizer, epoch, args): +# """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" +# lr = args.lr * (0.1 ** (epoch // 30)) +# for param_group in optimizer.param_groups: +# param_group['lr'] = lr + +# def adjust_learning_rate(optimizer, global_step, steps_per_epoch, args): +# """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" +# # lr = args.lr * (0.98 ** (epoch / 2.5)) +# lr = args.lr * (0.98 ** (global_step // int(steps_per_epoch * 2.5))) +# for param_group in optimizer.param_groups: +# param_group['lr'] = lr +# return lr + +def adjust_learning_rate(optimizer, global_step, steps_per_epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.98 ** (epoch / 2.5)) + lr = args.lr * (0.98 ** (global_step // int(steps_per_epoch * 2.5))) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +def fast_collate(batch): + imgs = [img[0] for img in batch] + targets = torch.tensor([target[1] for target in batch], dtype=torch.int64) + w = imgs[0].size[0] + h = imgs[0].size[1] + tensor = torch.zeros((len(imgs), 3, h, w), dtype=torch.uint8) + for i, img in enumerate(imgs): + nump_array = np.asarray(img, dtype=np.uint8) + if nump_array.ndim < 3: + nump_array = np.expand_dims(nump_array, axis=-1) + nump_array = np.rollaxis(nump_array, 2) + + tensor[i] += torch.from_numpy(nump_array) + + return tensor, targets + + +def get_pytorch_train_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + traindir = os.path.join(data_path, 'train') + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + ])) + + if distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + train_loader = dataloader_fn( + train_dataset, batch_size=batch_size, shuffle=(train_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, sampler=train_sampler, collate_fn=fast_collate, drop_last=True) + return train_loader, len(train_loader), train_sampler + + +def get_pytorch_val_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + valdir = os.path.join(data_path, 'val') + val_dataset = datasets.ImageFolder( + valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + ])) + + if distributed: + val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset) + else: + val_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + val_loader = dataloader_fn( + val_dataset, + sampler=val_sampler, + batch_size=batch_size, shuffle=(val_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, collate_fn=fast_collate) + + return val_loader + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/multi_epochs_dataloader.py b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/multi_epochs_dataloader.py new file mode 100644 index 0000000..28b6679 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/multi_epochs_dataloader.py @@ -0,0 +1,31 @@ +import torch + + +class MultiEpochsDataLoader(torch.utils.data.DataLoader): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._DataLoader__initialized = False + self.batch_sampler = _RepeatSampler(self.batch_sampler) + self._DataLoader__initialized = True + self.iterator = super().__iter__() + + def __len__(self): + return len(self.batch_sampler.sampler) + + def __iter__(self): + for _ in range(len(self)): + yield next(self.iterator) + + +class _RepeatSampler(object): + """ Sampler that repeats forever. + Args: + sampler (Sampler) + """ + + def __init__(self, sampler): + self.sampler = sampler + + def __iter__(self): + while True: + yield from iter(self.sampler) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/profiling.json b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/profiling.json new file mode 100644 index 0000000..d0d9b1f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/profiling.json @@ -0,0 +1,18 @@ +{ + "startCfg": + [ + { + "jobID": "123456789", + "deviceID": ["0"], + "features": + [ + { + "name": "task_trace" + }, + { + "name": "training_trace" + } + ] + } + ] +} diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume1p.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume1p.sh new file mode 100644 index 0000000..4a69466 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume1p.sh @@ -0,0 +1,19 @@ +source set_env_b023.sh + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export SLOG_PRINT_TO_STDOUT=0 +export TASK_QUEUE_ENABLE=0 +nohup taskset -c 1-40 python3.7 densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 0 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --print-freq 1 \ + --eval-freq 5\ + --batch-size 256 \ + --epoch 45 \ + --resume checkpoint.pth.tar \ + --data /home/dataset/imagenet > output_1p.log & diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume8p.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume8p.sh new file mode 100644 index 0000000..0fdb346 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/resume8p.sh @@ -0,0 +1,27 @@ +source set_env_b023.sh + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 4" + +export SLOG_PRINT_TO_STDOUT=0 +export TASK_QUEUE_ENABLE=0 +nohup python3.7 ./densenet121_8p_main.py \ + --addr='10.246.246.57' \ + --seed 49 \ + --workers 80 \ + --lr 0.8 \ + --print-freq 1 \ + --eval-freq 5\ + --arch densenet121 \ + --dist-url 'tcp://127.0.0.1:50000' \ + --dist-backend 'hccl' \ + --multiprocessing-distributed \ + --world-size 1 \ + --batch-size 2048 \ + --epochs 45 \ + --rank 0 \ + --amp \ + --benchmark 0 \ + --resume checkpoint.pth.tar \ + --data /train/imagenet > resume_8p.log & + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run1p.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run1p.sh new file mode 100644 index 0000000..761499c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run1p.sh @@ -0,0 +1,18 @@ +source set_env_b023.sh + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export SLOG_PRINT_TO_STDOUT=0 +export TASK_QUEUE_ENABLE=0 +nohup taskset -c 1-40 python3.7 densenet121_1p_main.py \ + --workers 40 \ + --arch densenet121 \ + --npu 0 \ + --lr 0.1 \ + --momentum 0.9 \ + --amp \ + --print-freq 1 \ + --eval-freq 5\ + --batch-size 256 \ + --epoch 90 \ + --data /opt/npu/dataset/imagenet > output_1p.log & diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run8p.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run8p.sh new file mode 100644 index 0000000..4c39128 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/run8p.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +source set_env_b023.sh + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 4" + +export SLOG_PRINT_TO_STDOUT=0 +export TASK_QUEUE_ENABLE=0 +nohup python3.7 ./mobilenetv2_8p_main.py \ + --addr='10.246.246.76' \ + --seed 49 \ + --workers 80 \ + --lr 0.24 \ + --print-freq 1 \ + --eval-freq 5\ + --dist-url 'tcp://127.0.0.1:50002' \ + --dist-backend 'hccl' \ + --multiprocessing-distributed \ + --world-size 1 \ + --batch-size 6144 \ + --epochs 600 \ + --rank 0 \ + --amp \ + --benchmark 0 \ + --data /opt/npu/dataset/imagenet > output_8p.log & + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b020.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b020.sh new file mode 100644 index 0000000..00614d4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b020.sh @@ -0,0 +1,17 @@ +############## toolkit situation ################ +#export ASCEND_HOME=/usr/local/Ascend +#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +############## nnae situation ################ +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/local/python3.7.5/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/hccl +export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + +# pip3.7 install --upgrade /usr/local/Ascend/nnae/latest/fwkacllib/lib64/topi-0.4.0-py3-none-any.whl +# pip3.7 install --upgrade /usr/local/Ascend/nnae/latest/fwkacllib/lib64/te-0.4.0-py3-none-any.whl + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b023.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b023.sh new file mode 100644 index 0000000..536616b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/code/8p/set_env_b023.sh @@ -0,0 +1,18 @@ +############## toolkit situation ################ +export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ +# export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +# export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ +# export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ +# export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +# export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/npu_set_env.sh new file mode 100644 index 0000000..55d3e6d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/npu_set_env.sh @@ -0,0 +1,12 @@ +# main env +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export PYTHONPATH=/usr/local/Ascend/atc/python/site-packages/te.egg:/usr/local/Ascend/atc/python/site-packages/topi.egg:/usr/local/Ascend/atc/python/site-packages/auto_tune.egg:/usr/local/Ascend/atc/python/site-packages/schedule_search.egg:/usr/local +export CUSTOM_OP_LIB_PATH=/usr/local/Ascend/ops/framework/built-in/tensorflow +export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +export PLUGIN_LOAD_PATH=/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libaicpu_plugin.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so:/usr/local/Ascend/fwkacllib/lib64/plugin/opskernel/librts_engine.so +export SLOG_PRINT_TO_STDOUT=1 + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/set_env_b023.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/set_env_b023.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/config/set_env_b023.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/run.sh new file mode 100644 index 0000000..fdb7438 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/run.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +source ${currentDir}/config/npu_set_env.sh + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + + +rm -rf /var/log/npu/slog/host-0/* +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir}" +# device 列表, 若无指定 device 或大于等于 8p 时根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + ln -snf ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/0/hw_mobilenet.log ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$this_ip" != x"$ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0.2/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0.2/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + ln -snf ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/${first_device_id}/hw_mobilenet.log ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ + #for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} $rank_id& + #let rank_id++ + #done +fi +wait diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/train.sh new file mode 100644 index 0000000..7d82a0d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/pytorch/scripts/train.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 + +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_mobilenet/training_job_${currtime}/ + + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") +export REMARK_LOG_FILE=hw_mobilenet.log +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + +source ${currentDir}/config/set_env_b023.sh + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + echo rank_id is $rank_id + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + echo device_id is $device_id + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + +if [ x"$6" == x"True" ];then + python3.7 ${currentDir}/code/8p/mobilenetv2_8p_main.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed 49 \ + --workers 128 \ + --lr 0.24 \ + --print-freq 1 \ + --eval-freq 5\ + --dist-url 'tcp://127.0.0.1:50002' \ + --dist-backend 'hccl' \ + --multiprocessing-distributed \ + --world-size 1 \ + --batch-size ${batch_size} \ + --epochs ${epoches} \ + --rank 0 \ + --amp \ + --benchmark 0 \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 +elif [ x"${rank_size}" == x"1" ];then + # 单卡 + python3.7 ${currentDir}/code/1p/main_apex.py \ + --workers 128 \ + --seed 123456 \ + --lr 0.03 \ + --amp \ + --opt-level 'O2' \ + --loss-scale-value 64 \ + --momentum 0.9 \ + --batch-size ${batch_size} \ + --weight-decay 1e-5 \ + --epoch ${epoches} \ + --print-freq 1 \ + --device ${device_single}\ + --eval-freq 1 \ + --summary-path './runs/mobilenetv2/npu_O2_ls64_c75b150_0909' \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + python3.7 ${currentDir}/code/8p/mobilenetv2_8p_main_anycard.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed 49 \ + --workers 128 \ + --lr ${lr} \ + --print-freq 1 \ + --loss-scale 64 \ + --eval-freq 1\ + --dist-url 'tcp://127.0.0.1:50002' \ + --dist-backend 'hccl' \ + --multiprocessing-distributed \ + --world-size 1 \ + --batch-size ${batch_size} \ + --epochs ${epoches} \ + --rank 0 \ + --amp \ + --device-list ${device_group_mutli} \ + --benchmark 0 \ + --data ${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 +fi + + + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 hw_mobilenet train success" + echo ":::ABK 1.0.0 hw_mobilenet train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 hw_mobilenet train success" >> ./hw_mobilenet.log +else + echo ":::ABK 1.0.0 hw_mobilenet train failed" + echo ":::ABK 1.0.0 hw_mobilenet train failed" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 hw_mobilenet train failed" >> ./hw_mobilenet.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 mobilenet train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 mobilenet train total time: ${hour}:${min}:${sec}" >> ./hw_mobilenet.log diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/README.md new file mode 100644 index 0000000..e75d8aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/README.md @@ -0,0 +1,47 @@ +# MobileNet_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/MobileNet.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: 数据集路径 + epoches: 跑多少个epoch + + # 训练(train) 或 评测(evaluate) + mode: train + batch_size: 256 + #仅在 mode 为 evaluate 时用到 + ckpt_path: /opt/0908/benchmark-benchmark_Alpha/train/result/tf_mobilenet/trainingJob_20200905171017/0/results/model.ckpt-123125 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b021 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + profiling_mode: false + profiling_options: training_trace + fp_point: L2Loss + bp_point: gradients/AddN_30 + aicpu_profiling_mode: false + +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/README.md new file mode 100644 index 0000000..743826e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/README.md @@ -0,0 +1,211 @@ +# MobileNetv2 for Tensorflow + +This repository provides a script and recipe to train the MobileNetv2 model to achieve state-of-the-art accuracy. + +## Table Of Contents + +* [Model overview](#model-overview) + * [Model Architecture](#model-architecture) + * [Default configuration](#default-configuration) +* [Data augmentation](#data-augmentation) +* [Setup](#setup) + * [Requirements](#requirements) +* [Quick start guide](#quick-start-guide) +* [Advanced](#advanced) + * [Command line arguments](#command-line-arguments) + * [Training process](#training-process) +* [Performance](#performance) + * [Results](#results) + * [Training accuracy results](#training-accuracy-results) + * [Training performance results](#training-performance-results) + + + + +## Model overview + +In this repository, we implement MobileNetv2 from paper [Sandler, Mark, et al. "Mobilenetv2: Inverted residuals and linear bottlenecks." CVPR 2018.](https://arxiv.org/abs/1801.04381) + +MobileNetv2 is a mobile architecture. It is mainly constructed based on depthwise separable convolutions, linear bottlenecks and inverted residuals. + +### Model architecture + +The model architecture can be found from the reference paper. + +### Default configuration + +The following sections introduce the default configurations and hyperparameters for MobileNetv2 model. + +#### Optimizer + +This model uses Momentum optimizer from Tensorflow with the following hyperparameters: + +- Momentum : 0.9 +- Learning rate (LR) : 0.8 +- LR schedule: cosine_annealing +- Warmup epoch: 5 +- Batch size : 256*8 +- Weight decay : 0.00004 +- Moving average decay: 0.9999 +- Label smoothing = 0.1 +- We train for: + - 300 epochs for a standard training process using ImageNet2012 + +#### Data augmentation + +This model uses the data augmentation from InceptionV2: + +- For training: + - Convert DataType and RandomResizeCrop + - RandomHorizontalFlip, prob=0.5 + - Subtract with 0.5 and multiply with 2.0 +- For inference: + - Convert DataType + - CenterCrop 87.5% of the original image and resize to (224, 224) + - Subtract with 0.5 and multiply with 2.0 + +For more details, we refer readers to read the corresponding source code in Slim. + +## Setup +The following section lists the requirements to start training the MobileNetv2 model. +### Requirements + +Tensorflow 1.15.0 + +## Quick Start Guide + +### 1. Clone the respository + +```shell +git clone xxx +cd ModelZoo_MobileNetv2_TF +``` + +### 2. Download and preprocess the dataset + +1. Download the ImageNet2012 dataset +2. Generate tfrecord files following [Tensorflow-Slim](https://github.com/tensorflow/models/tree/master/research/slim). +3. The train and validation tfrecord files are under the path/data directories. + +### 3. Train +- train on a single NPU + - **edit** *train_1p.sh* (see example below) + - bash run_1p.sh +- train on 8 NPUs + - **edit** *train_8p.sh* (see example below) + - bash run_8p.sh + +Examples: +- Case for single NPU + - In *train_1p.sh*, python scripts part should look like as follows. For more detailed command lines arguments, please refer to [Command line arguments](#command-line-arguments) + ```shell + python3.7 ${currentDir}/train.py \ + --dataset_dir=/opt/npu/slimImagenet \ + --max_train_steps=500 \ + --iterations_per_loop=50 \ + --model_name="mobilenet_v2" \ + --moving_average_decay=0.9999 \ + --label_smoothing=0.1 \ + --preprocessing_name="inception_v2" \ + --weight_decay='0.00004' \ + --batch_size=256 \ + --learning_rate_decay_type='cosine_annealing' \ + --learning_rate=0.4 \ + --optimizer='momentum' \ + --momentum='0.9' \ + --warmup_epochs=5 + ``` + - Run the program + ``` + bash run_1p.sh + ``` +- Case for 8 NPUs + - In *train_8p.sh*, python scripts part should look like as follows. + ```shell + python3.7 ${currentDir}/train.py \ + --dataset_dir=/opt/npu/slimImagenet \ + --max_epoch=300 \ + --model_name="mobilenet_v2" \ + --moving_average_decay=0.9999 \ + --label_smoothing=0.1 \ + --preprocessing_name="inception_v2" \ + --weight_decay='0.00004' \ + --batch_size=256 \ + --learning_rate_decay_type='cosine_annealing' \ + --learning_rate=0.8 \ + --optimizer='momentum' \ + --momentum='0.9' \ + --warmup_epochs=5 + ``` + - Run the program + ``` + bash run_8p.sh + ``` + +### 4. Test +- We evaluate results by using following commands: + ```shell + python3.7 eval_image_classifier_mobilenet.py --dataset_dir=/opt/npu/slimImagenet \ + --checkpoint_path=result/8p/0/results/model.ckpt-187500 + ``` + Remember to modify the dataset path and checkpoint path, then run the command. + + +## Advanced +### Commmand-line options + +We list those important parameters to train this network here. For more details of all the parameters, please read *train.py* and other related files. + +``` + --dataset_dir directory of dataset (default: /opt/npu/models/slimImagenet) + --max_epoch number of epochs to train the model (default: 200) + --max_train_steps max number of training steps (default: 500) + --iterations_per_loop number of steps to run in devices each iteration (default: None) + --model_name name of the model to train (default: mobilenet_v2_140) + --moving_average_decay the decay to use for the moving average (default: None) + --label_smoothing use label smooth in cross entropy (default: 0.1) + --preprocessing_name preprocessing method for training (default: inception_v2) + --weight_decay weight decay for regularization loss (default: 0) + --batch_size batch size per npu (default: 96) + --learning_rate_decay_type learning rate decay type (default: fixed) + --learning_rate initial learning rate (default: 0.1) + --optimizer the name of optimizer (default: sgd) + --momentum momentum value used in optimizer (default: 0.9) + --warmup_epochs warmup epochs for learning rate (default: 5) +``` + +### Training process + +All the results of the training will be stored in the directory `result`. + +## Performance + +### Result + +Our result were obtained by running the applicable training script. To achieve the same results, follow the steps in the Quick Start Guide. + +#### Training accuracy results + +| **epochs** | Top1 | +| :--------: | :------------: | +| 300 | 72.47% | + +#### Training performance results +| **NPUs** | train performance | +| :------: | :---------------: | +| 1 | 1400 img/s | + +| **NPUs** | train performance | +| :------: | :---------------: | +| 8 | 11000 img/s | + + + + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/dataloader/data_provider.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/dataloader/data_provider.py new file mode 100644 index 0000000..c0e0c99 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/dataloader/data_provider.py @@ -0,0 +1,240 @@ +# Copyright 2017 The TensorFlow Authors All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Functions to read, decode and pre-process input data for the Model. +""" +import collections +import sys +import tensorflow as tf + +from tensorflow.python.data.experimental.ops import threadpool + +# from tensorflow.contrib import slim + +InputEndpoints = collections.namedtuple( + 'InputEndpoints', ['images', 'images_orig', 'labels', 'labels_one_hot']) +ShuffleBatchConfig = collections.namedtuple('ShuffleBatchConfig', [ + 'num_batching_threads', 'queue_capacity', 'min_after_dequeue' +]) + +DEFAULT_SHUFFLE_CONFIG = ShuffleBatchConfig( + num_batching_threads=8, queue_capacity=3000, min_after_dequeue=1000) + + +def get_data_files(data_sources): + from tensorflow.python.platform import gfile + if isinstance(data_sources, (list, tuple)): + data_files = [] + for source in data_sources: + data_files += get_data_files(source) + else: + if '*' in data_sources or '?' in data_sources or '[' in data_sources: + data_files = gfile.Glob(data_sources) + else: + data_files = [data_sources] + if not data_files: + raise ValueError('No data files found in %s' % (data_sources,)) + return data_files + + +def preprocess_image(image, location, label_one_hot, height=224, width=224): + """Prepare one image for evaluation. + If height and width are specified it would output an image with that size by + applying resize_bilinear. + If central_fraction is specified it would cropt the central fraction of the + input image. + Args: + image: 3-D Tensor of image. If dtype is tf.float32 then the range should be + [0, 1], otherwise it would converted to tf.float32 assuming that the range + is [0, MAX], where MAX is largest positive representable number for + int(8/16/32) data type (see `tf.image.convert_image_dtype` for details) + height: integer + width: integer + central_fraction: Optional Float, fraction of the image to crop. + scope: Optional scope for name_scope. + Returns: + 3-D float Tensor of prepared image. + """ + + # if image.dtype != tf.float32: + image = tf.image.convert_image_dtype(image, dtype=tf.float32) + # Crop the central region of the image with an area containing 87.5% of + # the original image. + # if central_fraction: + # image = tf.image.central_crop(image, central_fraction=central_fraction) + + # if height and width: + # Resize the image to the specified height and width. + image = tf.expand_dims(image, 0) + image = tf.image.resize_bilinear(image, [height, width], align_corners=False) + image = tf.squeeze(image, [0]) + + # image = tf.cast(image, tf.float32) + # image = tf.multiply(image, 1/255.) + image = tf.subtract(image, 0.5) + image = tf.multiply(image, 2.0) + + return image, location, label_one_hot + + +def _int64_feature(value): + """Wrapper for inserting int64 features into Example proto.""" + if not isinstance(value, list): + value = [value] + return tf.train.Feature(int64_list=tf.train.Int64List(value=value)) + + +def parse_example_proto(example_serialized, num_classes, labels_offset, image_preprocessing_fn): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], tf.string, ''), + 'image/class/label': tf.FixedLenFeature([1], tf.int64, -1), + 'image/class/text': tf.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': tf.VarLenFeature(dtype=tf.float32) + } + with tf.compat.v1.name_scope('deserialize_image_record'): + obj = tf.io.parse_single_example(serialized=example_serialized, features=feature_map) + image = tf.image.decode_jpeg(obj['image/encoded'], channels=3, fancy_upscaling=False, + dct_method='INTEGER_FAST') + if image_preprocessing_fn: + image = image_preprocessing_fn(image, 224, 224) + else: + image = tf.image.resize(image, [224, 224]) + + label = tf.cast(obj['image/class/label'], tf.int32) + label = tf.squeeze(label) + label -= labels_offset + label = tf.one_hot(label, num_classes - labels_offset) + return image, label + + +def parse_example_decode(example_serialized): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], tf.string, ''), + 'image/class/label': tf.FixedLenFeature([1], tf.int64, -1), + 'image/class/text': tf.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': tf.VarLenFeature(dtype=tf.float32) + } + with tf.compat.v1.name_scope('deserialize_image_record'): + obj = tf.io.parse_single_example(serialized=example_serialized, features=feature_map) + image = tf.image.decode_jpeg(obj['image/encoded'], channels=3, fancy_upscaling=False, + dct_method='INTEGER_FAST') + + return image, obj['image/class/label'] + + +def parse_example(image, label, num_classes, labels_offset, image_preprocessing_fn): + with tf.compat.v1.name_scope('deserialize_image_record'): + if image_preprocessing_fn: + image = image_preprocessing_fn(image, 224, 224) + else: + image = tf.image.resize(image, [224, 224]) + + label = tf.cast(label, tf.int32) + label = tf.squeeze(label) + label -= labels_offset + label = tf.one_hot(label, num_classes - labels_offset) + return image, label + + +def parse_example1(example_serialized, image_preprocessing_fn1): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], tf.string, ''), + 'image/class/label': tf.FixedLenFeature([1], tf.int64, -1), + 'image/class/text': tf.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': tf.VarLenFeature(dtype=tf.float32) + } + with tf.compat.v1.name_scope('deserialize_image_record'): + obj = tf.io.parse_single_example(serialized=example_serialized, features=feature_map) + image = tf.image.decode_jpeg(obj['image/encoded'], channels=3, fancy_upscaling=False, + dct_method='INTEGER_FAST') + + image = image_preprocessing_fn1(image, 224, 224) + return image, obj['image/class/label'] + + +def parse_example2(image, label, num_classes, labels_offset, image_preprocessing_fn2): + with tf.compat.v1.name_scope('deserialize_image_record'): + image = image_preprocessing_fn2(image, 224, 224) + + label = tf.cast(label, tf.int32) + label = tf.squeeze(label) + label -= labels_offset + label = tf.one_hot(label, num_classes - labels_offset) + return image, label + + +def get_data(dataset, batch_size, num_classes, labels_offset, is_training, + preprocessing_name=None, use_grayscale=None, add_image_summaries=False): + return get_data_united(dataset, batch_size, num_classes, labels_offset, is_training, + preprocessing_name, use_grayscale, add_image_summaries) + + +def create_ds(data_sources, is_training): + data_files = get_data_files(data_sources) + ds = tf.data.Dataset.from_tensor_slices(data_files) + + if is_training: + ds = ds.shuffle(1000) + # add for eval + else: + ds = ds.take(50000) + + ##### change ##### + num_readers = 10 + ds = ds.interleave( + tf.data.TFRecordDataset, cycle_length=num_readers, block_length=1, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + counter = tf.data.Dataset.range(sys.maxsize) + ds = tf.data.Dataset.zip((ds, counter)) + ##### change ##### + + if is_training: + ds = ds.repeat() + + return ds + + +def get_data_united(dataset, batch_size, num_classes, labels_offset, is_training, + preprocessing_name=None, use_grayscale=None, add_image_summaries=False): + from preprocessing import preprocessing_factory + image_preprocessing_fn = preprocessing_factory.get_preprocessing( + name='inception_v2', + is_training=is_training, + use_grayscale=use_grayscale, + add_image_summaries=add_image_summaries + ) + + ds = create_ds(dataset.data_sources, is_training) + + ds = ds.map(lambda example, counter: parse_example_proto(example, num_classes, labels_offset, image_preprocessing_fn), num_parallel_calls=24) + + ds = ds.batch(batch_size, drop_remainder=True) + + ds = ds.prefetch(buffer_size=tf.contrib.data.AUTOTUNE) + + iterator = ds.make_initializable_iterator() + + ds = threadpool.override_threadpool(ds,threadpool.PrivateThreadPool(128, display_name='input_pipeline_thread_pool')) + + return iterator, ds diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/build_imagenet_data.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/build_imagenet_data.py new file mode 100644 index 0000000..572bcd3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/build_imagenet_data.py @@ -0,0 +1,705 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Converts ImageNet data to TFRecords file format with Example protos. + +The raw ImageNet data set is expected to reside in JPEG files located in the +following directory structure. + + data_dir/n01440764/ILSVRC2012_val_00000293.JPEG + data_dir/n01440764/ILSVRC2012_val_00000543.JPEG + ... + +where 'n01440764' is the unique synset label associated with +these images. + +The training data set consists of 1000 sub-directories (i.e. labels) +each containing 1200 JPEG images for a total of 1.2M JPEG images. + +The evaluation data set consists of 1000 sub-directories (i.e. labels) +each containing 50 JPEG images for a total of 50K JPEG images. + +This TensorFlow script converts the training and evaluation data into +a sharded data set consisting of 1024 and 128 TFRecord files, respectively. + + train_directory/train-00000-of-01024 + train_directory/train-00001-of-01024 + ... + train_directory/train-00127-of-01024 + +and + + validation_directory/validation-00000-of-00128 + validation_directory/validation-00001-of-00128 + ... + validation_directory/validation-00127-of-00128 + +Each validation TFRecord file contains ~390 records. Each training TFREcord +file contains ~1250 records. Each record within the TFRecord file is a +serialized Example proto. The Example proto contains the following fields: + + image/encoded: string containing JPEG encoded image in RGB colorspace + image/height: integer, image height in pixels + image/width: integer, image width in pixels + image/colorspace: string, specifying the colorspace, always 'RGB' + image/channels: integer, specifying the number of channels, always 3 + image/format: string, specifying the format, always'JPEG' + + image/filename: string containing the basename of the image file + e.g. 'n01440764_10026.JPEG' or 'ILSVRC2012_val_00000293.JPEG' + image/class/label: integer specifying the index in a classification layer. + The label ranges from [1, 1000] where 0 is not used. + image/class/synset: string specifying the unique ID of the label, + e.g. 'n01440764' + image/class/text: string specifying the human-readable version of the label + e.g. 'red fox, Vulpes vulpes' + + image/object/bbox/xmin: list of integers specifying the 0+ human annotated + bounding boxes + image/object/bbox/xmax: list of integers specifying the 0+ human annotated + bounding boxes + image/object/bbox/ymin: list of integers specifying the 0+ human annotated + bounding boxes + image/object/bbox/ymax: list of integers specifying the 0+ human annotated + bounding boxes + image/object/bbox/label: integer specifying the index in a classification + layer. The label ranges from [1, 1000] where 0 is not used. Note this is + always identical to the image label. + +Note that the length of xmin is identical to the length of xmax, ymin and ymax +for each example. + +Running this script using 16 threads may take around ~2.5 hours on a HP Z420. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from datetime import datetime +import os +import random +import sys +import threading + +import numpy as np +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf + + +tf.app.flags.DEFINE_string('train_directory', '/tmp/', + 'Training data directory') +tf.app.flags.DEFINE_string('validation_directory', '/tmp/', + 'Validation data directory') +tf.app.flags.DEFINE_string('output_directory', '/tmp/', + 'Output data directory') + +tf.app.flags.DEFINE_integer('train_shards', 1024, + 'Number of shards in training TFRecord files.') +tf.app.flags.DEFINE_integer('validation_shards', 128, + 'Number of shards in validation TFRecord files.') + +tf.app.flags.DEFINE_integer('num_threads', 8, + 'Number of threads to preprocess the images.') + +# The labels file contains a list of valid labels are held in this file. +# Assumes that the file contains entries as such: +# n01440764 +# n01443537 +# n01484850 +# where each line corresponds to a label expressed as a synset. We map +# each synset contained in the file to an integer (based on the alphabetical +# ordering). See below for details. +tf.app.flags.DEFINE_string('labels_file', + 'imagenet_lsvrc_2015_synsets.txt', + 'Labels file') + +# This file containing mapping from synset to human-readable label. +# Assumes each line of the file looks like: +# +# n02119247 black fox +# n02119359 silver fox +# n02119477 red fox, Vulpes fulva +# +# where each line corresponds to a unique mapping. Note that each line is +# formatted as \t. +tf.app.flags.DEFINE_string('imagenet_metadata_file', + 'imagenet_metadata.txt', + 'ImageNet metadata file') + +# This file is the output of process_bounding_box.py +# Assumes each line of the file looks like: +# +# n00007846_64193.JPEG,0.0060,0.2620,0.7545,0.9940 +# +# where each line corresponds to one bounding box annotation associated +# with an image. Each line can be parsed as: +# +# , , , , +# +# Note that there might exist mulitple bounding box annotations associated +# with an image file. +tf.app.flags.DEFINE_string('bounding_box_file', + './imagenet_2012_bounding_boxes.csv', + 'Bounding box file') + +FLAGS = tf.app.flags.FLAGS + + +def _int64_feature(value): + """Wrapper for inserting int64 features into Example proto.""" + if not isinstance(value, list): + value = [value] + return tf.train.Feature(int64_list=tf.train.Int64List(value=value)) + + +def _float_feature(value): + """Wrapper for inserting float features into Example proto.""" + if not isinstance(value, list): + value = [value] + return tf.train.Feature(float_list=tf.train.FloatList(value=value)) + + +def _bytes_feature(value): + """Wrapper for inserting bytes features into Example proto.""" + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) + + +def _convert_to_example(filename, image_buffer, label, synset, human, bbox, + height, width): + """Build an Example proto for an example. + + Args: + filename: string, path to an image file, e.g., '/path/to/example.JPG' + image_buffer: string, JPEG encoding of RGB image + label: integer, identifier for the ground truth for the network + synset: string, unique WordNet ID specifying the label, e.g., 'n02323233' + human: string, human-readable label, e.g., 'red fox, Vulpes vulpes' + bbox: list of bounding boxes; each box is a list of integers + specifying [xmin, ymin, xmax, ymax]. All boxes are assumed to belong to + the same label as the image label. + height: integer, image height in pixels + width: integer, image width in pixels + Returns: + Example proto + """ + xmin = [] + ymin = [] + xmax = [] + ymax = [] + for b in bbox: + assert len(b) == 4 + # pylint: disable=expression-not-assigned + [l.append(point) for l, point in zip([xmin, ymin, xmax, ymax], b)] + # pylint: enable=expression-not-assigned + + colorspace = 'RGB' + channels = 3 + image_format = 'JPEG' + + example = tf.train.Example(features=tf.train.Features(feature={ + 'image/height': _int64_feature(height), + 'image/width': _int64_feature(width), + 'image/colorspace': _bytes_feature(colorspace), + 'image/channels': _int64_feature(channels), + 'image/class/label': _int64_feature(label), + 'image/class/synset': _bytes_feature(synset), + 'image/class/text': _bytes_feature(human), + 'image/object/bbox/xmin': _float_feature(xmin), + 'image/object/bbox/xmax': _float_feature(xmax), + 'image/object/bbox/ymin': _float_feature(ymin), + 'image/object/bbox/ymax': _float_feature(ymax), + 'image/object/bbox/label': _int64_feature([label] * len(xmin)), + 'image/format': _bytes_feature(image_format), + 'image/filename': _bytes_feature(os.path.basename(filename)), + 'image/encoded': _bytes_feature(image_buffer)})) + return example + + +class ImageCoder(object): + """Helper class that provides TensorFlow image coding utilities.""" + + def __init__(self): + # Create a single Session to run all image coding calls. + self._sess = tf.Session() + + # Initializes function that converts PNG to JPEG data. + self._png_data = tf.placeholder(dtype=tf.string) + image = tf.image.decode_png(self._png_data, channels=3) + self._png_to_jpeg = tf.image.encode_jpeg(image, format='rgb', quality=100) + + # Initializes function that converts CMYK JPEG data to RGB JPEG data. + self._cmyk_data = tf.placeholder(dtype=tf.string) + image = tf.image.decode_jpeg(self._cmyk_data, channels=0) + self._cmyk_to_rgb = tf.image.encode_jpeg(image, format='rgb', quality=100) + + # Initializes function that decodes RGB JPEG data. + self._decode_jpeg_data = tf.placeholder(dtype=tf.string) + self._decode_jpeg = tf.image.decode_jpeg(self._decode_jpeg_data, channels=3) + + def png_to_jpeg(self, image_data): + return self._sess.run(self._png_to_jpeg, + feed_dict={self._png_data: image_data}) + + def cmyk_to_rgb(self, image_data): + return self._sess.run(self._cmyk_to_rgb, + feed_dict={self._cmyk_data: image_data}) + + def decode_jpeg(self, image_data): + image = self._sess.run(self._decode_jpeg, + feed_dict={self._decode_jpeg_data: image_data}) + assert len(image.shape) == 3 + assert image.shape[2] == 3 + return image + + +def _is_png(filename): + """Determine if a file contains a PNG format image. + + Args: + filename: string, path of the image file. + + Returns: + boolean indicating if the image is a PNG. + """ + # File list from: + # https://groups.google.com/forum/embed/?place=forum/torch7#!topic/torch7/fOSTXHIESSU + return 'n02105855_2933.JPEG' in filename + + +def _is_cmyk(filename): + """Determine if file contains a CMYK JPEG format image. + + Args: + filename: string, path of the image file. + + Returns: + boolean indicating if the image is a JPEG encoded with CMYK color space. + """ + # File list from: + # https://github.com/cytsai/ilsvrc-cmyk-image-list + blacklist = ['n01739381_1309.JPEG', 'n02077923_14822.JPEG', + 'n02447366_23489.JPEG', 'n02492035_15739.JPEG', + 'n02747177_10752.JPEG', 'n03018349_4028.JPEG', + 'n03062245_4620.JPEG', 'n03347037_9675.JPEG', + 'n03467068_12171.JPEG', 'n03529860_11437.JPEG', + 'n03544143_17228.JPEG', 'n03633091_5218.JPEG', + 'n03710637_5125.JPEG', 'n03961711_5286.JPEG', + 'n04033995_2932.JPEG', 'n04258138_17003.JPEG', + 'n04264628_27969.JPEG', 'n04336792_7448.JPEG', + 'n04371774_5854.JPEG', 'n04596742_4225.JPEG', + 'n07583066_647.JPEG', 'n13037406_4650.JPEG'] + return filename.split('/')[-1] in blacklist + + +def _process_image(filename, coder): + """Process a single image file. + + Args: + filename: string, path to an image file e.g., '/path/to/example.JPG'. + coder: instance of ImageCoder to provide TensorFlow image coding utils. + Returns: + image_buffer: string, JPEG encoding of RGB image. + height: integer, image height in pixels. + width: integer, image width in pixels. + """ + # Read the image file. + image_data = tf.gfile.GFile(filename, 'r').read() + + # Clean the dirty data. + if _is_png(filename): + # 1 image is a PNG. + print('Converting PNG to JPEG for %s' % filename) + image_data = coder.png_to_jpeg(image_data) + elif _is_cmyk(filename): + # 22 JPEG images are in CMYK colorspace. + print('Converting CMYK to RGB for %s' % filename) + image_data = coder.cmyk_to_rgb(image_data) + + # Decode the RGB JPEG. + image = coder.decode_jpeg(image_data) + + # Check that image converted to RGB + assert len(image.shape) == 3 + height = image.shape[0] + width = image.shape[1] + assert image.shape[2] == 3 + + return image_data, height, width + + +def _process_image_files_batch(coder, thread_index, ranges, name, filenames, + synsets, labels, humans, bboxes, num_shards): + """Processes and saves list of images as TFRecord in 1 thread. + + Args: + coder: instance of ImageCoder to provide TensorFlow image coding utils. + thread_index: integer, unique batch to run index is within [0, len(ranges)). + ranges: list of pairs of integers specifying ranges of each batches to + analyze in parallel. + name: string, unique identifier specifying the data set + filenames: list of strings; each string is a path to an image file + synsets: list of strings; each string is a unique WordNet ID + labels: list of integer; each integer identifies the ground truth + humans: list of strings; each string is a human-readable label + bboxes: list of bounding boxes for each image. Note that each entry in this + list might contain from 0+ entries corresponding to the number of bounding + box annotations for the image. + num_shards: integer number of shards for this data set. + """ + # Each thread produces N shards where N = int(num_shards / num_threads). + # For instance, if num_shards = 128, and the num_threads = 2, then the first + # thread would produce shards [0, 64). + num_threads = len(ranges) + assert not num_shards % num_threads + num_shards_per_batch = int(num_shards / num_threads) + + shard_ranges = np.linspace(ranges[thread_index][0], + ranges[thread_index][1], + num_shards_per_batch + 1).astype(int) + num_files_in_thread = ranges[thread_index][1] - ranges[thread_index][0] + + counter = 0 + for s in xrange(num_shards_per_batch): + # Generate a sharded version of the file name, e.g. 'train-00002-of-00010' + shard = thread_index * num_shards_per_batch + s + output_filename = '%s-%.5d-of-%.5d' % (name, shard, num_shards) + output_file = os.path.join(FLAGS.output_directory, output_filename) + writer = tf.python_io.TFRecordWriter(output_file) + + shard_counter = 0 + files_in_shard = np.arange(shard_ranges[s], shard_ranges[s + 1], dtype=int) + for i in files_in_shard: + filename = filenames[i] + label = labels[i] + synset = synsets[i] + human = humans[i] + bbox = bboxes[i] + + image_buffer, height, width = _process_image(filename, coder) + + example = _convert_to_example(filename, image_buffer, label, + synset, human, bbox, + height, width) + writer.write(example.SerializeToString()) + shard_counter += 1 + counter += 1 + + if not counter % 1000: + print('%s [thread %d]: Processed %d of %d images in thread batch.' % + (datetime.now(), thread_index, counter, num_files_in_thread)) + sys.stdout.flush() + + writer.close() + print('%s [thread %d]: Wrote %d images to %s' % + (datetime.now(), thread_index, shard_counter, output_file)) + sys.stdout.flush() + shard_counter = 0 + print('%s [thread %d]: Wrote %d images to %d shards.' % + (datetime.now(), thread_index, counter, num_files_in_thread)) + sys.stdout.flush() + + +def _process_image_files(name, filenames, synsets, labels, humans, + bboxes, num_shards): + """Process and save list of images as TFRecord of Example protos. + + Args: + name: string, unique identifier specifying the data set + filenames: list of strings; each string is a path to an image file + synsets: list of strings; each string is a unique WordNet ID + labels: list of integer; each integer identifies the ground truth + humans: list of strings; each string is a human-readable label + bboxes: list of bounding boxes for each image. Note that each entry in this + list might contain from 0+ entries corresponding to the number of bounding + box annotations for the image. + num_shards: integer number of shards for this data set. + """ + assert len(filenames) == len(synsets) + assert len(filenames) == len(labels) + assert len(filenames) == len(humans) + assert len(filenames) == len(bboxes) + + # Break all images into batches with a [ranges[i][0], ranges[i][1]]. + spacing = np.linspace(0, len(filenames), FLAGS.num_threads + 1).astype(np.int) + ranges = [] + threads = [] + for i in xrange(len(spacing) - 1): + ranges.append([spacing[i], spacing[i+1]]) + + # Launch a thread for each batch. + print('Launching %d threads for spacings: %s' % (FLAGS.num_threads, ranges)) + sys.stdout.flush() + + # Create a mechanism for monitoring when all threads are finished. + coord = tf.train.Coordinator() + + # Create a generic TensorFlow-based utility for converting all image codings. + coder = ImageCoder() + + threads = [] + for thread_index in xrange(len(ranges)): + args = (coder, thread_index, ranges, name, filenames, + synsets, labels, humans, bboxes, num_shards) + t = threading.Thread(target=_process_image_files_batch, args=args) + t.start() + threads.append(t) + + # Wait for all the threads to terminate. + coord.join(threads) + print('%s: Finished writing all %d images in data set.' % + (datetime.now(), len(filenames))) + sys.stdout.flush() + + +def _find_image_files(data_dir, labels_file): + """Build a list of all images files and labels in the data set. + + Args: + data_dir: string, path to the root directory of images. + + Assumes that the ImageNet data set resides in JPEG files located in + the following directory structure. + + data_dir/n01440764/ILSVRC2012_val_00000293.JPEG + data_dir/n01440764/ILSVRC2012_val_00000543.JPEG + + where 'n01440764' is the unique synset label associated with these images. + + labels_file: string, path to the labels file. + + The list of valid labels are held in this file. Assumes that the file + contains entries as such: + n01440764 + n01443537 + n01484850 + where each line corresponds to a label expressed as a synset. We map + each synset contained in the file to an integer (based on the alphabetical + ordering) starting with the integer 1 corresponding to the synset + contained in the first line. + + The reason we start the integer labels at 1 is to reserve label 0 as an + unused background class. + + Returns: + filenames: list of strings; each string is a path to an image file. + synsets: list of strings; each string is a unique WordNet ID. + labels: list of integer; each integer identifies the ground truth. + """ + print('Determining list of input files and labels from %s.' % data_dir) + challenge_synsets = [ + l.strip() for l in tf.gfile.GFile(labels_file, 'r').readlines() + ] + + labels = [] + filenames = [] + synsets = [] + + # Leave label index 0 empty as a background class. + label_index = 1 + + # Construct the list of JPEG files and labels. + for synset in challenge_synsets: + jpeg_file_path = '%s/%s/*.JPEG' % (data_dir, synset) + matching_files = tf.gfile.Glob(jpeg_file_path) + + labels.extend([label_index] * len(matching_files)) + synsets.extend([synset] * len(matching_files)) + filenames.extend(matching_files) + + if not label_index % 100: + print('Finished finding files in %d of %d classes.' % ( + label_index, len(challenge_synsets))) + label_index += 1 + + # Shuffle the ordering of all image files in order to guarantee + # random ordering of the images with respect to label in the + # saved TFRecord files. Make the randomization repeatable. + shuffled_index = range(len(filenames)) + random.seed(12345) + random.shuffle(shuffled_index) + + filenames = [filenames[i] for i in shuffled_index] + synsets = [synsets[i] for i in shuffled_index] + labels = [labels[i] for i in shuffled_index] + + print('Found %d JPEG files across %d labels inside %s.' % + (len(filenames), len(challenge_synsets), data_dir)) + return filenames, synsets, labels + + +def _find_human_readable_labels(synsets, synset_to_human): + """Build a list of human-readable labels. + + Args: + synsets: list of strings; each string is a unique WordNet ID. + synset_to_human: dict of synset to human labels, e.g., + 'n02119022' --> 'red fox, Vulpes vulpes' + + Returns: + List of human-readable strings corresponding to each synset. + """ + humans = [] + for s in synsets: + assert s in synset_to_human, ('Failed to find: %s' % s) + humans.append(synset_to_human[s]) + return humans + + +def _find_image_bounding_boxes(filenames, image_to_bboxes): + """Find the bounding boxes for a given image file. + + Args: + filenames: list of strings; each string is a path to an image file. + image_to_bboxes: dictionary mapping image file names to a list of + bounding boxes. This list contains 0+ bounding boxes. + Returns: + List of bounding boxes for each image. Note that each entry in this + list might contain from 0+ entries corresponding to the number of bounding + box annotations for the image. + """ + num_image_bbox = 0 + bboxes = [] + for f in filenames: + basename = os.path.basename(f) + if basename in image_to_bboxes: + bboxes.append(image_to_bboxes[basename]) + num_image_bbox += 1 + else: + bboxes.append([]) + print('Found %d images with bboxes out of %d images' % ( + num_image_bbox, len(filenames))) + return bboxes + + +def _process_dataset(name, directory, num_shards, synset_to_human, + image_to_bboxes): + """Process a complete data set and save it as a TFRecord. + + Args: + name: string, unique identifier specifying the data set. + directory: string, root path to the data set. + num_shards: integer number of shards for this data set. + synset_to_human: dict of synset to human labels, e.g., + 'n02119022' --> 'red fox, Vulpes vulpes' + image_to_bboxes: dictionary mapping image file names to a list of + bounding boxes. This list contains 0+ bounding boxes. + """ + filenames, synsets, labels = _find_image_files(directory, FLAGS.labels_file) + humans = _find_human_readable_labels(synsets, synset_to_human) + bboxes = _find_image_bounding_boxes(filenames, image_to_bboxes) + _process_image_files(name, filenames, synsets, labels, + humans, bboxes, num_shards) + + +def _build_synset_lookup(imagenet_metadata_file): + """Build lookup for synset to human-readable label. + + Args: + imagenet_metadata_file: string, path to file containing mapping from + synset to human-readable label. + + Assumes each line of the file looks like: + + n02119247 black fox + n02119359 silver fox + n02119477 red fox, Vulpes fulva + + where each line corresponds to a unique mapping. Note that each line is + formatted as \t. + + Returns: + Dictionary of synset to human labels, such as: + 'n02119022' --> 'red fox, Vulpes vulpes' + """ + lines = tf.gfile.GFile(imagenet_metadata_file, 'r').readlines() + synset_to_human = {} + for l in lines: + if l: + parts = l.strip().split('\t') + assert len(parts) == 2 + synset = parts[0] + human = parts[1] + synset_to_human[synset] = human + return synset_to_human + + +def _build_bounding_box_lookup(bounding_box_file): + """Build a lookup from image file to bounding boxes. + + Args: + bounding_box_file: string, path to file with bounding boxes annotations. + + Assumes each line of the file looks like: + + n00007846_64193.JPEG,0.0060,0.2620,0.7545,0.9940 + + where each line corresponds to one bounding box annotation associated + with an image. Each line can be parsed as: + + , , , , + + Note that there might exist mulitple bounding box annotations associated + with an image file. This file is the output of process_bounding_boxes.py. + + Returns: + Dictionary mapping image file names to a list of bounding boxes. This list + contains 0+ bounding boxes. + """ + lines = tf.gfile.GFile(bounding_box_file, 'r').readlines() + images_to_bboxes = {} + num_bbox = 0 + num_image = 0 + for l in lines: + if l: + parts = l.split(',') + assert len(parts) == 5, ('Failed to parse: %s' % l) + filename = parts[0] + xmin = float(parts[1]) + ymin = float(parts[2]) + xmax = float(parts[3]) + ymax = float(parts[4]) + box = [xmin, ymin, xmax, ymax] + + if filename not in images_to_bboxes: + images_to_bboxes[filename] = [] + num_image += 1 + images_to_bboxes[filename].append(box) + num_bbox += 1 + + print('Successfully read %d bounding boxes ' + 'across %d images.' % (num_bbox, num_image)) + return images_to_bboxes + + +def main(unused_argv): + assert not FLAGS.train_shards % FLAGS.num_threads, ( + 'Please make the FLAGS.num_threads commensurate with FLAGS.train_shards') + assert not FLAGS.validation_shards % FLAGS.num_threads, ( + 'Please make the FLAGS.num_threads commensurate with ' + 'FLAGS.validation_shards') + print('Saving results to %s' % FLAGS.output_directory) + + # Build a map from synset to human-readable label. + synset_to_human = _build_synset_lookup(FLAGS.imagenet_metadata_file) + image_to_bboxes = _build_bounding_box_lookup(FLAGS.bounding_box_file) + + # Run it! + _process_dataset('validation', FLAGS.validation_directory, + FLAGS.validation_shards, synset_to_human, image_to_bboxes) + _process_dataset('train', FLAGS.train_directory, FLAGS.train_shards, + synset_to_human, image_to_bboxes) + + +if __name__ == '__main__': + tf.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/cifar10.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/cifar10.py new file mode 100644 index 0000000..f0f5d61 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/cifar10.py @@ -0,0 +1,100 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides data for the Cifar10 dataset. + +The dataset scripts used to create the dataset can be found at: +tensorflow/models/research/slim/datasets/download_and_convert_cifar10.py +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from datasets import dataset_utils + +slim = contrib_slim + +_FILE_PATTERN = 'cifar10_%s.tfrecord' + +SPLITS_TO_SIZES = {'train': 50000, 'test': 10000} + +_NUM_CLASSES = 10 + +_ITEMS_TO_DESCRIPTIONS = { + 'image': 'A [32 x 32 x 3] color image.', + 'label': 'A single integer between 0 and 9', +} + + +def get_split(split_name, dataset_dir, file_pattern=None, reader=None): + """Gets a dataset tuple with instructions for reading cifar10. + + Args: + split_name: A train/test split name. + dataset_dir: The base directory of the dataset sources. + file_pattern: The file pattern to use when matching the dataset sources. + It is assumed that the pattern contains a '%s' string so that the split + name can be inserted. + reader: The TensorFlow reader type. + + Returns: + A `Dataset` namedtuple. + + Raises: + ValueError: if `split_name` is not a valid train/test split. + """ + if split_name not in SPLITS_TO_SIZES: + raise ValueError('split name %s was not recognized.' % split_name) + + if not file_pattern: + file_pattern = _FILE_PATTERN + file_pattern = os.path.join(dataset_dir, file_pattern % split_name) + + # Allowing None in the signature so that dataset_factory can use the default. + if not reader: + reader = tf.TFRecordReader + + keys_to_features = { + 'image/encoded': tf.FixedLenFeature((), tf.string, default_value=''), + 'image/format': tf.FixedLenFeature((), tf.string, default_value='png'), + 'image/class/label': tf.FixedLenFeature( + [], tf.int64, default_value=tf.zeros([], dtype=tf.int64)), + } + + items_to_handlers = { + 'image': slim.tfexample_decoder.Image(shape=[32, 32, 3]), + 'label': slim.tfexample_decoder.Tensor('image/class/label'), + } + + decoder = slim.tfexample_decoder.TFExampleDecoder( + keys_to_features, items_to_handlers) + + labels_to_names = None + if dataset_utils.has_labels(dataset_dir): + labels_to_names = dataset_utils.read_label_file(dataset_dir) + + return slim.dataset.Dataset( + data_sources=file_pattern, + reader=reader, + decoder=decoder, + num_samples=SPLITS_TO_SIZES[split_name], + items_to_descriptions=_ITEMS_TO_DESCRIPTIONS, + num_classes=_NUM_CLASSES, + labels_to_names=labels_to_names, + ) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_factory.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_factory.py new file mode 100644 index 0000000..2cfb3f8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_factory.py @@ -0,0 +1,59 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A factory-pattern class which returns classification image/label pairs.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from datasets import cifar10 +from datasets import flowers +from datasets import imagenet +from datasets import mnist +from datasets import visualwakewords + +datasets_map = { + 'cifar10': cifar10, + 'flowers': flowers, + 'imagenet': imagenet, + 'mnist': mnist, + 'visualwakewords': visualwakewords, +} + + +def get_dataset(name, split_name, dataset_dir, file_pattern=None, reader=None): + """Given a dataset name and a split_name returns a Dataset. + + Args: + name: String, the name of the dataset. + split_name: A train/test split name. + dataset_dir: The directory where the dataset files are stored. + file_pattern: The file pattern to use for matching the dataset source files. + reader: The subclass of tf.ReaderBase. If left as `None`, then the default + reader defined by each dataset is used. + + Returns: + A `Dataset` class. + + Raises: + ValueError: If the dataset `name` is unknown. + """ + if name not in datasets_map: + raise ValueError('Name of dataset unknown %s' % name) + return datasets_map[name].get_split( + split_name, + dataset_dir, + file_pattern, + reader) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_utils.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_utils.py new file mode 100644 index 0000000..47e27d1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/dataset_utils.py @@ -0,0 +1,240 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains utilities for downloading and converting datasets.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import tarfile +import zipfile + +from six.moves import urllib +import tensorflow as tf + +LABELS_FILENAME = 'labels.txt' + + +def int64_feature(values): + """Returns a TF-Feature of int64s. + + Args: + values: A scalar or list of values. + + Returns: + A TF-Feature. + """ + if not isinstance(values, (tuple, list)): + values = [values] + return tf.train.Feature(int64_list=tf.train.Int64List(value=values)) + + +def bytes_list_feature(values): + """Returns a TF-Feature of list of bytes. + + Args: + values: A string or list of strings. + + Returns: + A TF-Feature. + """ + return tf.train.Feature(bytes_list=tf.train.BytesList(value=values)) + + +def float_list_feature(values): + """Returns a TF-Feature of list of floats. + + Args: + values: A float or list of floats. + + Returns: + A TF-Feature. + """ + return tf.train.Feature(float_list=tf.train.FloatList(value=values)) + + +def bytes_feature(values): + """Returns a TF-Feature of bytes. + + Args: + values: A string. + + Returns: + A TF-Feature. + """ + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[values])) + + +def float_feature(values): + """Returns a TF-Feature of floats. + + Args: + values: A scalar of list of values. + + Returns: + A TF-Feature. + """ + if not isinstance(values, (tuple, list)): + values = [values] + return tf.train.Feature(float_list=tf.train.FloatList(value=values)) + + +def image_to_tfexample(image_data, image_format, height, width, class_id): + return tf.train.Example(features=tf.train.Features(feature={ + 'image/encoded': bytes_feature(image_data), + 'image/format': bytes_feature(image_format), + 'image/class/label': int64_feature(class_id), + 'image/height': int64_feature(height), + 'image/width': int64_feature(width), + })) + + +def download_url(url, dataset_dir): + """Downloads the tarball or zip file from url into filepath. + + Args: + url: The URL of a tarball or zip file. + dataset_dir: The directory where the temporary files are stored. + + Returns: + filepath: path where the file is downloaded. + """ + filename = url.split('/')[-1] + filepath = os.path.join(dataset_dir, filename) + + def _progress(count, block_size, total_size): + sys.stdout.write('\r>> Downloading %s %.1f%%' % ( + filename, float(count * block_size) / float(total_size) * 100.0)) + sys.stdout.flush() + + filepath, _ = urllib.request.urlretrieve(url, filepath, _progress) + print() + statinfo = os.stat(filepath) + print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') + return filepath + + +def download_and_uncompress_tarball(tarball_url, dataset_dir): + """Downloads the `tarball_url` and uncompresses it locally. + + Args: + tarball_url: The URL of a tarball file. + dataset_dir: The directory where the temporary files are stored. + """ + filepath = download_url(tarball_url, dataset_dir) + tarfile.open(filepath, 'r:gz').extractall(dataset_dir) + + +def download_and_uncompress_zipfile(zip_url, dataset_dir): + """Downloads the `zip_url` and uncompresses it locally. + + Args: + zip_url: The URL of a zip file. + dataset_dir: The directory where the temporary files are stored. + """ + filename = zip_url.split('/')[-1] + filepath = os.path.join(dataset_dir, filename) + + if tf.gfile.Exists(filepath): + print('File {filename} has been already downloaded at {filepath}. ' + 'Unzipping it....'.format(filename=filename, filepath=filepath)) + else: + filepath = download_url(zip_url, dataset_dir) + + with zipfile.ZipFile(filepath, 'r') as zip_file: + for member in zip_file.namelist(): + memberpath = os.path.join(dataset_dir, member) + # extract only if file doesn't exist + if not (os.path.exists(memberpath) or os.path.isfile(memberpath)): + zip_file.extract(member, dataset_dir) + + +def write_label_file(labels_to_class_names, + dataset_dir, + filename=LABELS_FILENAME): + """Writes a file with the list of class names. + + Args: + labels_to_class_names: A map of (integer) labels to class names. + dataset_dir: The directory in which the labels file should be written. + filename: The filename where the class names are written. + """ + labels_filename = os.path.join(dataset_dir, filename) + with tf.gfile.Open(labels_filename, 'w') as f: + for label in labels_to_class_names: + class_name = labels_to_class_names[label] + f.write('%d:%s\n' % (label, class_name)) + + +def has_labels(dataset_dir, filename=LABELS_FILENAME): + """Specifies whether or not the dataset directory contains a label map file. + + Args: + dataset_dir: The directory in which the labels file is found. + filename: The filename where the class names are written. + + Returns: + `True` if the labels file exists and `False` otherwise. + """ + return tf.gfile.Exists(os.path.join(dataset_dir, filename)) + + +def read_label_file(dataset_dir, filename=LABELS_FILENAME): + """Reads the labels file and returns a mapping from ID to class name. + + Args: + dataset_dir: The directory in which the labels file is found. + filename: The filename where the class names are written. + + Returns: + A map from a label (integer) to class name. + """ + labels_filename = os.path.join(dataset_dir, filename) + with tf.gfile.Open(labels_filename, 'rb') as f: + lines = f.read().decode() + lines = lines.split('\n') + lines = filter(None, lines) + + labels_to_class_names = {} + for line in lines: + index = line.index(':') + labels_to_class_names[int(line[:index])] = line[index+1:] + return labels_to_class_names + + +def open_sharded_output_tfrecords(exit_stack, base_path, num_shards): + """Opens all TFRecord shards for writing and adds them to an exit stack. + + Args: + exit_stack: A context2.ExitStack used to automatically closed the TFRecords + opened in this function. + base_path: The base path for all shards + num_shards: The number of shards + + Returns: + The list of opened TFRecords. Position k in the list corresponds to shard k. + """ + tf_record_output_filenames = [ + '{}-{:05d}-of-{:05d}'.format(base_path, idx, num_shards) + for idx in range(num_shards) + ] + + tfrecords = [ + exit_stack.enter_context(tf.python_io.TFRecordWriter(file_name)) + for file_name in tf_record_output_filenames + ] + + return tfrecords diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_cifar10.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_cifar10.py new file mode 100644 index 0000000..f23618e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_cifar10.py @@ -0,0 +1,198 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Downloads and converts cifar10 data to TFRecords of TF-Example protos. + +This module downloads the cifar10 data, uncompresses it, reads the files +that make up the cifar10 data and creates two TFRecord datasets: one for train +and one for test. Each TFRecord dataset is comprised of a set of TF-Example +protocol buffers, each of which contain a single image and label. + +The script should take several minutes to run. + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import tarfile + +import numpy as np +from six.moves import cPickle +from six.moves import urllib +import tensorflow as tf + +from datasets import dataset_utils + +# The URL where the CIFAR data can be downloaded. +_DATA_URL = 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz' + +# The number of training files. +_NUM_TRAIN_FILES = 5 + +# The height and width of each image. +_IMAGE_SIZE = 32 + +# The names of the classes. +_CLASS_NAMES = [ + 'airplane', + 'automobile', + 'bird', + 'cat', + 'deer', + 'dog', + 'frog', + 'horse', + 'ship', + 'truck', +] + + +def _add_to_tfrecord(filename, tfrecord_writer, offset=0): + """Loads data from the cifar10 pickle files and writes files to a TFRecord. + + Args: + filename: The filename of the cifar10 pickle file. + tfrecord_writer: The TFRecord writer to use for writing. + offset: An offset into the absolute number of images previously written. + + Returns: + The new offset. + """ + with tf.gfile.Open(filename, 'rb') as f: + if sys.version_info < (3,): + data = cPickle.load(f) + else: + data = cPickle.load(f, encoding='bytes') + + images = data[b'data'] + num_images = images.shape[0] + + images = images.reshape((num_images, 3, 32, 32)) + labels = data[b'labels'] + + with tf.Graph().as_default(): + image_placeholder = tf.placeholder(dtype=tf.uint8) + encoded_image = tf.image.encode_png(image_placeholder) + + with tf.Session('') as sess: + + for j in range(num_images): + sys.stdout.write('\r>> Reading file [%s] image %d/%d' % ( + filename, offset + j + 1, offset + num_images)) + sys.stdout.flush() + + image = np.squeeze(images[j]).transpose((1, 2, 0)) + label = labels[j] + + png_string = sess.run(encoded_image, + feed_dict={image_placeholder: image}) + + example = dataset_utils.image_to_tfexample( + png_string, b'png', _IMAGE_SIZE, _IMAGE_SIZE, label) + tfrecord_writer.write(example.SerializeToString()) + + return offset + num_images + + +def _get_output_filename(dataset_dir, split_name): + """Creates the output filename. + + Args: + dataset_dir: The dataset directory where the dataset is stored. + split_name: The name of the train/test split. + + Returns: + An absolute file path. + """ + return '%s/cifar10_%s.tfrecord' % (dataset_dir, split_name) + + +def _download_and_uncompress_dataset(dataset_dir): + """Downloads cifar10 and uncompresses it locally. + + Args: + dataset_dir: The directory where the temporary files are stored. + """ + filename = _DATA_URL.split('/')[-1] + filepath = os.path.join(dataset_dir, filename) + + if not os.path.exists(filepath): + def _progress(count, block_size, total_size): + sys.stdout.write('\r>> Downloading %s %.1f%%' % ( + filename, float(count * block_size) / float(total_size) * 100.0)) + sys.stdout.flush() + filepath, _ = urllib.request.urlretrieve(_DATA_URL, filepath, _progress) + print() + statinfo = os.stat(filepath) + print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') + tarfile.open(filepath, 'r:gz').extractall(dataset_dir) + + +def _clean_up_temporary_files(dataset_dir): + """Removes temporary files used to create the dataset. + + Args: + dataset_dir: The directory where the temporary files are stored. + """ + filename = _DATA_URL.split('/')[-1] + filepath = os.path.join(dataset_dir, filename) + tf.gfile.Remove(filepath) + + tmp_dir = os.path.join(dataset_dir, 'cifar-10-batches-py') + tf.gfile.DeleteRecursively(tmp_dir) + + +def run(dataset_dir): + """Runs the download and conversion operation. + + Args: + dataset_dir: The dataset directory where the dataset is stored. + """ + if not tf.gfile.Exists(dataset_dir): + tf.gfile.MakeDirs(dataset_dir) + + training_filename = _get_output_filename(dataset_dir, 'train') + testing_filename = _get_output_filename(dataset_dir, 'test') + + if tf.gfile.Exists(training_filename) and tf.gfile.Exists(testing_filename): + print('Dataset files already exist. Exiting without re-creating them.') + return + + dataset_utils.download_and_uncompress_tarball(_DATA_URL, dataset_dir) + + # First, process the training data: + with tf.python_io.TFRecordWriter(training_filename) as tfrecord_writer: + offset = 0 + for i in range(_NUM_TRAIN_FILES): + filename = os.path.join(dataset_dir, + 'cifar-10-batches-py', + 'data_batch_%d' % (i + 1)) # 1-indexed. + offset = _add_to_tfrecord(filename, tfrecord_writer, offset) + + # Next, process the testing data: + with tf.python_io.TFRecordWriter(testing_filename) as tfrecord_writer: + filename = os.path.join(dataset_dir, + 'cifar-10-batches-py', + 'test_batch') + _add_to_tfrecord(filename, tfrecord_writer) + + # Finally, write the labels file: + labels_to_class_names = dict(zip(range(len(_CLASS_NAMES)), _CLASS_NAMES)) + dataset_utils.write_label_file(labels_to_class_names, dataset_dir) + + _clean_up_temporary_files(dataset_dir) + print('\nFinished converting the Cifar10 dataset!') diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_flowers.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_flowers.py new file mode 100644 index 0000000..7976e38 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_flowers.py @@ -0,0 +1,211 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Downloads and converts Flowers data to TFRecords of TF-Example protos. + +This module downloads the Flowers data, uncompresses it, reads the files +that make up the Flowers data and creates two TFRecord datasets: one for train +and one for test. Each TFRecord dataset is comprised of a set of TF-Example +protocol buffers, each of which contain a single image and label. + +The script should take about a minute to run. + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import os +import random +import sys + +import tensorflow as tf + +from datasets import dataset_utils + +# The URL where the Flowers data can be downloaded. +_DATA_URL = 'http://download.tensorflow.org/example_images/flower_photos.tgz' + +# The number of images in the validation set. +_NUM_VALIDATION = 350 + +# Seed for repeatability. +_RANDOM_SEED = 0 + +# The number of shards per dataset split. +_NUM_SHARDS = 5 + + +class ImageReader(object): + """Helper class that provides TensorFlow image coding utilities.""" + + def __init__(self): + # Initializes function that decodes RGB JPEG data. + self._decode_jpeg_data = tf.placeholder(dtype=tf.string) + self._decode_jpeg = tf.image.decode_jpeg(self._decode_jpeg_data, channels=3) + + def read_image_dims(self, sess, image_data): + image = self.decode_jpeg(sess, image_data) + return image.shape[0], image.shape[1] + + def decode_jpeg(self, sess, image_data): + image = sess.run(self._decode_jpeg, + feed_dict={self._decode_jpeg_data: image_data}) + assert len(image.shape) == 3 + assert image.shape[2] == 3 + return image + + +def _get_filenames_and_classes(dataset_dir): + """Returns a list of filenames and inferred class names. + + Args: + dataset_dir: A directory containing a set of subdirectories representing + class names. Each subdirectory should contain PNG or JPG encoded images. + + Returns: + A list of image file paths, relative to `dataset_dir` and the list of + subdirectories, representing class names. + """ + flower_root = os.path.join(dataset_dir, 'flower_photos') + directories = [] + class_names = [] + for filename in os.listdir(flower_root): + path = os.path.join(flower_root, filename) + if os.path.isdir(path): + directories.append(path) + class_names.append(filename) + + photo_filenames = [] + for directory in directories: + for filename in os.listdir(directory): + path = os.path.join(directory, filename) + photo_filenames.append(path) + + return photo_filenames, sorted(class_names) + + +def _get_dataset_filename(dataset_dir, split_name, shard_id): + output_filename = 'flowers_%s_%05d-of-%05d.tfrecord' % ( + split_name, shard_id, _NUM_SHARDS) + return os.path.join(dataset_dir, output_filename) + + +def _convert_dataset(split_name, filenames, class_names_to_ids, dataset_dir): + """Converts the given filenames to a TFRecord dataset. + + Args: + split_name: The name of the dataset, either 'train' or 'validation'. + filenames: A list of absolute paths to png or jpg images. + class_names_to_ids: A dictionary from class names (strings) to ids + (integers). + dataset_dir: The directory where the converted datasets are stored. + """ + assert split_name in ['train', 'validation'] + + num_per_shard = int(math.ceil(len(filenames) / float(_NUM_SHARDS))) + + with tf.Graph().as_default(): + image_reader = ImageReader() + + with tf.Session('') as sess: + + for shard_id in range(_NUM_SHARDS): + output_filename = _get_dataset_filename( + dataset_dir, split_name, shard_id) + + with tf.python_io.TFRecordWriter(output_filename) as tfrecord_writer: + start_ndx = shard_id * num_per_shard + end_ndx = min((shard_id+1) * num_per_shard, len(filenames)) + for i in range(start_ndx, end_ndx): + sys.stdout.write('\r>> Converting image %d/%d shard %d' % ( + i+1, len(filenames), shard_id)) + sys.stdout.flush() + + # Read the filename: + image_data = tf.gfile.GFile(filenames[i], 'rb').read() + height, width = image_reader.read_image_dims(sess, image_data) + + class_name = os.path.basename(os.path.dirname(filenames[i])) + class_id = class_names_to_ids[class_name] + + example = dataset_utils.image_to_tfexample( + image_data, b'jpg', height, width, class_id) + tfrecord_writer.write(example.SerializeToString()) + + sys.stdout.write('\n') + sys.stdout.flush() + + +def _clean_up_temporary_files(dataset_dir): + """Removes temporary files used to create the dataset. + + Args: + dataset_dir: The directory where the temporary files are stored. + """ + filename = _DATA_URL.split('/')[-1] + filepath = os.path.join(dataset_dir, filename) + tf.gfile.Remove(filepath) + + tmp_dir = os.path.join(dataset_dir, 'flower_photos') + tf.gfile.DeleteRecursively(tmp_dir) + + +def _dataset_exists(dataset_dir): + for split_name in ['train', 'validation']: + for shard_id in range(_NUM_SHARDS): + output_filename = _get_dataset_filename( + dataset_dir, split_name, shard_id) + if not tf.gfile.Exists(output_filename): + return False + return True + + +def run(dataset_dir): + """Runs the download and conversion operation. + + Args: + dataset_dir: The dataset directory where the dataset is stored. + """ + if not tf.gfile.Exists(dataset_dir): + tf.gfile.MakeDirs(dataset_dir) + + if _dataset_exists(dataset_dir): + print('Dataset files already exist. Exiting without re-creating them.') + return + + dataset_utils.download_and_uncompress_tarball(_DATA_URL, dataset_dir) + photo_filenames, class_names = _get_filenames_and_classes(dataset_dir) + class_names_to_ids = dict(zip(class_names, range(len(class_names)))) + + # Divide into train and test: + random.seed(_RANDOM_SEED) + random.shuffle(photo_filenames) + training_filenames = photo_filenames[_NUM_VALIDATION:] + validation_filenames = photo_filenames[:_NUM_VALIDATION] + + # First, convert the training and validation sets. + _convert_dataset('train', training_filenames, class_names_to_ids, + dataset_dir) + _convert_dataset('validation', validation_filenames, class_names_to_ids, + dataset_dir) + + # Finally, write the labels file: + labels_to_class_names = dict(zip(range(len(class_names)), class_names)) + dataset_utils.write_label_file(labels_to_class_names, dataset_dir) + + _clean_up_temporary_files(dataset_dir) + print('\nFinished converting the Flowers dataset!') diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_imagenet.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_imagenet.sh new file mode 100644 index 0000000..b4b3866 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_imagenet.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Script to download and preprocess ImageNet Challenge 2012 +# training and validation data set. +# +# The final output of this script are sharded TFRecord files containing +# serialized Example protocol buffers. See build_imagenet_data.py for +# details of how the Example protocol buffers contain the ImageNet data. +# +# The final output of this script appears as such: +# +# data_dir/train-00000-of-01024 +# data_dir/train-00001-of-01024 +# ... +# data_dir/train-00127-of-01024 +# +# and +# +# data_dir/validation-00000-of-00128 +# data_dir/validation-00001-of-00128 +# ... +# data_dir/validation-00127-of-00128 +# +# Note that this script may take several hours to run to completion. The +# conversion of the ImageNet data to TFRecords alone takes 2-3 hours depending +# on the speed of your machine. Please be patient. +# +# **IMPORTANT** +# To download the raw images, the user must create an account with image-net.org +# and generate a username and access_key. The latter two are required for +# downloading the raw images. +# +# usage: +# cd research/slim +# bazel build :download_and_convert_imagenet +# ./bazel-bin/download_and_convert_imagenet.sh [data-dir] +set -e + +if [ -z "$1" ]; then + echo "usage download_and_convert_imagenet.sh [data dir]" + exit +fi + +# Create the output and temporary directories. +DATA_DIR="${1%/}" +SCRATCH_DIR="${DATA_DIR}/raw-data/" +mkdir -p "${DATA_DIR}" +mkdir -p "${SCRATCH_DIR}" +WORK_DIR="$0.runfiles/__main__" + +# Download the ImageNet data. +LABELS_FILE="${WORK_DIR}/datasets/imagenet_lsvrc_2015_synsets.txt" +DOWNLOAD_SCRIPT="${WORK_DIR}/datasets/download_imagenet.sh" +"${DOWNLOAD_SCRIPT}" "${SCRATCH_DIR}" "${LABELS_FILE}" + +# Note the locations of the train and validation data. +TRAIN_DIRECTORY="${SCRATCH_DIR}train/" +VALIDATION_DIRECTORY="${SCRATCH_DIR}validation/" + +# Preprocess the validation data by moving the images into the appropriate +# sub-directory based on the label (synset) of the image. +echo "Organizing the validation data into sub-directories." +PREPROCESS_VAL_SCRIPT="${WORK_DIR}/datasets/preprocess_imagenet_validation_data.py" +VAL_LABELS_FILE="${WORK_DIR}/datasets/imagenet_2012_validation_synset_labels.txt" + +"${PREPROCESS_VAL_SCRIPT}" "${VALIDATION_DIRECTORY}" "${VAL_LABELS_FILE}" + +# Convert the XML files for bounding box annotations into a single CSV. +echo "Extracting bounding box information from XML." +BOUNDING_BOX_SCRIPT="${WORK_DIR}/datasets/process_bounding_boxes.py" +BOUNDING_BOX_FILE="${SCRATCH_DIR}/imagenet_2012_bounding_boxes.csv" +BOUNDING_BOX_DIR="${SCRATCH_DIR}bounding_boxes/" + +"${BOUNDING_BOX_SCRIPT}" "${BOUNDING_BOX_DIR}" "${LABELS_FILE}" \ + | sort >"${BOUNDING_BOX_FILE}" +echo "Finished downloading and preprocessing the ImageNet data." + +# Build the TFRecords version of the ImageNet data. +BUILD_SCRIPT="${WORK_DIR}/build_imagenet_data" +OUTPUT_DIRECTORY="${DATA_DIR}" +IMAGENET_METADATA_FILE="${WORK_DIR}/datasets/imagenet_metadata.txt" + +"${BUILD_SCRIPT}" \ + --train_directory="${TRAIN_DIRECTORY}" \ + --validation_directory="${VALIDATION_DIRECTORY}" \ + --output_directory="${OUTPUT_DIRECTORY}" \ + --imagenet_metadata_file="${IMAGENET_METADATA_FILE}" \ + --labels_file="${LABELS_FILE}" \ + --bounding_box_file="${BOUNDING_BOX_FILE}" diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_mnist.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_mnist.py new file mode 100644 index 0000000..d6ae874 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_mnist.py @@ -0,0 +1,221 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Downloads and converts MNIST data to TFRecords of TF-Example protos. + +This module downloads the MNIST data, uncompresses it, reads the files +that make up the MNIST data and creates two TFRecord datasets: one for train +and one for test. Each TFRecord dataset is comprised of a set of TF-Example +protocol buffers, each of which contain a single image and label. + +The script should take about a minute to run. + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gzip +import os +import sys + +import numpy as np +from six.moves import urllib +import tensorflow as tf + +from datasets import dataset_utils + +# The URLs where the MNIST data can be downloaded. +_DATA_URL = 'http://yann.lecun.com/exdb/mnist/' +_TRAIN_DATA_FILENAME = 'train-images-idx3-ubyte.gz' +_TRAIN_LABELS_FILENAME = 'train-labels-idx1-ubyte.gz' +_TEST_DATA_FILENAME = 't10k-images-idx3-ubyte.gz' +_TEST_LABELS_FILENAME = 't10k-labels-idx1-ubyte.gz' + +_IMAGE_SIZE = 28 +_NUM_CHANNELS = 1 + +# The names of the classes. +_CLASS_NAMES = [ + 'zero', + 'one', + 'two', + 'three', + 'four', + 'five', + 'size', + 'seven', + 'eight', + 'nine', +] + + +def _extract_images(filename, num_images): + """Extract the images into a numpy array. + + Args: + filename: The path to an MNIST images file. + num_images: The number of images in the file. + + Returns: + A numpy array of shape [number_of_images, height, width, channels]. + """ + print('Extracting images from: ', filename) + with gzip.open(filename) as bytestream: + bytestream.read(16) + buf = bytestream.read( + _IMAGE_SIZE * _IMAGE_SIZE * num_images * _NUM_CHANNELS) + data = np.frombuffer(buf, dtype=np.uint8) + data = data.reshape(num_images, _IMAGE_SIZE, _IMAGE_SIZE, _NUM_CHANNELS) + return data + + +def _extract_labels(filename, num_labels): + """Extract the labels into a vector of int64 label IDs. + + Args: + filename: The path to an MNIST labels file. + num_labels: The number of labels in the file. + + Returns: + A numpy array of shape [number_of_labels] + """ + print('Extracting labels from: ', filename) + with gzip.open(filename) as bytestream: + bytestream.read(8) + buf = bytestream.read(1 * num_labels) + labels = np.frombuffer(buf, dtype=np.uint8).astype(np.int64) + return labels + + +def _add_to_tfrecord(data_filename, labels_filename, num_images, + tfrecord_writer): + """Loads data from the binary MNIST files and writes files to a TFRecord. + + Args: + data_filename: The filename of the MNIST images. + labels_filename: The filename of the MNIST labels. + num_images: The number of images in the dataset. + tfrecord_writer: The TFRecord writer to use for writing. + """ + images = _extract_images(data_filename, num_images) + labels = _extract_labels(labels_filename, num_images) + + shape = (_IMAGE_SIZE, _IMAGE_SIZE, _NUM_CHANNELS) + with tf.Graph().as_default(): + image = tf.placeholder(dtype=tf.uint8, shape=shape) + encoded_png = tf.image.encode_png(image) + + with tf.Session('') as sess: + for j in range(num_images): + sys.stdout.write('\r>> Converting image %d/%d' % (j + 1, num_images)) + sys.stdout.flush() + + png_string = sess.run(encoded_png, feed_dict={image: images[j]}) + + example = dataset_utils.image_to_tfexample( + png_string, 'png'.encode(), _IMAGE_SIZE, _IMAGE_SIZE, labels[j]) + tfrecord_writer.write(example.SerializeToString()) + + +def _get_output_filename(dataset_dir, split_name): + """Creates the output filename. + + Args: + dataset_dir: The directory where the temporary files are stored. + split_name: The name of the train/test split. + + Returns: + An absolute file path. + """ + return '%s/mnist_%s.tfrecord' % (dataset_dir, split_name) + + +def _download_dataset(dataset_dir): + """Downloads MNIST locally. + + Args: + dataset_dir: The directory where the temporary files are stored. + """ + for filename in [_TRAIN_DATA_FILENAME, + _TRAIN_LABELS_FILENAME, + _TEST_DATA_FILENAME, + _TEST_LABELS_FILENAME]: + filepath = os.path.join(dataset_dir, filename) + + if not os.path.exists(filepath): + print('Downloading file %s...' % filename) + def _progress(count, block_size, total_size): + sys.stdout.write('\r>> Downloading %.1f%%' % ( + float(count * block_size) / float(total_size) * 100.0)) + sys.stdout.flush() + filepath, _ = urllib.request.urlretrieve(_DATA_URL + filename, + filepath, + _progress) + print() + with tf.gfile.GFile(filepath) as f: + size = f.size() + print('Successfully downloaded', filename, size, 'bytes.') + + +def _clean_up_temporary_files(dataset_dir): + """Removes temporary files used to create the dataset. + + Args: + dataset_dir: The directory where the temporary files are stored. + """ + for filename in [_TRAIN_DATA_FILENAME, + _TRAIN_LABELS_FILENAME, + _TEST_DATA_FILENAME, + _TEST_LABELS_FILENAME]: + filepath = os.path.join(dataset_dir, filename) + tf.gfile.Remove(filepath) + + +def run(dataset_dir): + """Runs the download and conversion operation. + + Args: + dataset_dir: The dataset directory where the dataset is stored. + """ + if not tf.gfile.Exists(dataset_dir): + tf.gfile.MakeDirs(dataset_dir) + + training_filename = _get_output_filename(dataset_dir, 'train') + testing_filename = _get_output_filename(dataset_dir, 'test') + + if tf.gfile.Exists(training_filename) and tf.gfile.Exists(testing_filename): + print('Dataset files already exist. Exiting without re-creating them.') + return + + _download_dataset(dataset_dir) + + # First, process the training data: + with tf.python_io.TFRecordWriter(training_filename) as tfrecord_writer: + data_filename = os.path.join(dataset_dir, _TRAIN_DATA_FILENAME) + labels_filename = os.path.join(dataset_dir, _TRAIN_LABELS_FILENAME) + _add_to_tfrecord(data_filename, labels_filename, 60000, tfrecord_writer) + + # Next, process the testing data: + with tf.python_io.TFRecordWriter(testing_filename) as tfrecord_writer: + data_filename = os.path.join(dataset_dir, _TEST_DATA_FILENAME) + labels_filename = os.path.join(dataset_dir, _TEST_LABELS_FILENAME) + _add_to_tfrecord(data_filename, labels_filename, 10000, tfrecord_writer) + + # Finally, write the labels file: + labels_to_class_names = dict(zip(range(len(_CLASS_NAMES)), _CLASS_NAMES)) + dataset_utils.write_label_file(labels_to_class_names, dataset_dir) + + _clean_up_temporary_files(dataset_dir) + print('\nFinished converting the MNIST dataset!') diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords.py new file mode 100644 index 0000000..dc6aa69 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords.py @@ -0,0 +1,158 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Downloads and converts VisualWakewords data to TFRecords of TF-Example protos. + +This module downloads the COCO dataset, uncompresses it, derives the +VisualWakeWords dataset to create two TFRecord datasets: one for +train and one for test. Each TFRecord dataset is comprised of a set of +TF-Example protocol buffers, each of which contain a single image and label. + +The script should take several minutes to run. +Please note that this tool creates sharded output files. + +VisualWakeWords dataset is used to design tiny models classifying two classes, +such as person/not-person. The two steps to generate the VisualWakeWords +dataset from the COCO dataset are given below: + +1. Use COCO annotations to create VisualWakeWords annotations: + +Note: A bounding box is 'valid' if it has the foreground_class_of_interest +(e.g. person) and it's area is greater than 0.5% of the image area. + +The resulting annotations file has the following fields, where 'images' are +the same as COCO dataset. 'categories' only contains information about the +foreground_class_of_interest (e.g. person) and 'annotations' maps an image to +objects (a list of valid bounding boxes) and label (value is 1 if it has +atleast one valid bounding box, otherwise 0) + + images[{ + "id", "width", "height", "file_name", "flickr_url", "coco_url", + "license", "date_captured", + }] + + categories{ + "id": {"id", "name", "supercategory"} + } + + annotations{ + "image_id": {"objects":[{"area", "bbox" : [x,y,width,height]}], "label"} + } + +2. Use VisualWakeWords annotations to create TFRecords: + +The resulting TFRecord file contains the following features: +{ image/height, image/width, image/source_id, image/encoded, + image/class/label_text, image/class/label, + image/object/class/text, + image/object/bbox/ymin, image/object/bbox/xmin, image/object/bbox/ymax, + image/object/bbox/xmax, image/object/area + image/filename, image/format, image/key/sha256} +For classification models, you need the image/encoded and image/class/label. + +Example usage: +Run download_and_convert_data.py in the parent directory as follows: + + python download_and_convert_visualwakewords.py --logtostderr \ + --dataset_name=visualwakewords \ + --dataset_dir="${DATASET_DIR}" \ + --small_object_area_threshold=0.005 \ + --foreground_class_of_interest='person' + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tensorflow as tf +from datasets import download_and_convert_visualwakewords_lib + +tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + +tf.compat.v1.app.flags.DEFINE_string( + 'coco_dirname', 'coco_dataset', + 'A subdirectory in visualwakewords dataset directory' + 'containing the coco dataset') + +FLAGS = tf.compat.v1.app.flags.FLAGS + + +def run(dataset_dir, small_object_area_threshold, foreground_class_of_interest): + """Runs the download and conversion operation. + + Args: + dataset_dir: The dataset directory where the dataset is stored. + small_object_area_threshold: Threshold of fraction of image area below which + small objects are filtered + foreground_class_of_interest: Build a binary classifier based on the + presence or absence of this object in the image. + """ + # 1. Download the coco dataset into a subdirectory under the visualwakewords + # dataset directory + coco_dir = os.path.join(dataset_dir, FLAGS.coco_dirname) + + if not tf.gfile.IsDirectory(coco_dir): + tf.gfile.MakeDirs(coco_dir) + + download_and_convert_visualwakewords_lib.download_coco_dataset(coco_dir) + + # Path to COCO annotations + train_annotations_file = os.path.join(coco_dir, 'annotations', + 'instances_train2014.json') + val_annotations_file = os.path.join(coco_dir, 'annotations', + 'instances_val2014.json') + train_image_dir = os.path.join(coco_dir, 'train2014') + val_image_dir = os.path.join(coco_dir, 'val2014') + + # Path to VisualWakeWords annotations + visualwakewords_annotations_train = os.path.join( + dataset_dir, 'instances_visualwakewords_train2014.json') + visualwakewords_annotations_val = os.path.join( + dataset_dir, 'instances_visualwakewords_val2014.json') + visualwakewords_labels_filename = os.path.join(dataset_dir, 'labels.txt') + train_output_path = os.path.join(dataset_dir, 'train.record') + val_output_path = os.path.join(dataset_dir, 'val.record') + + # 2. Create a labels file + tf.logging.info('Creating a labels file...') + download_and_convert_visualwakewords_lib.create_labels_file( + foreground_class_of_interest, visualwakewords_labels_filename) + + # 3. Use COCO annotations to create VisualWakeWords annotations + tf.logging.info('Creating train VisualWakeWords annotations...') + download_and_convert_visualwakewords_lib.create_visual_wakeword_annotations( + train_annotations_file, visualwakewords_annotations_train, + small_object_area_threshold, foreground_class_of_interest) + tf.logging.info('Creating validation VisualWakeWords annotations...') + download_and_convert_visualwakewords_lib.create_visual_wakeword_annotations( + val_annotations_file, visualwakewords_annotations_val, + small_object_area_threshold, foreground_class_of_interest) + + # 4. Use VisualWakeWords annotations to create the TFRecords + tf.logging.info('Creating train TFRecords for VisualWakeWords dataset...') + download_and_convert_visualwakewords_lib.create_tf_record_for_visualwakewords_dataset( + visualwakewords_annotations_train, + train_image_dir, + train_output_path, + num_shards=100) + + tf.logging.info( + 'Creating validation TFRecords for VisualWakeWords dataset...') + download_and_convert_visualwakewords_lib.create_tf_record_for_visualwakewords_dataset( + visualwakewords_annotations_val, + val_image_dir, + val_output_path, + num_shards=10) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords_lib.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords_lib.py new file mode 100644 index 0000000..4c3d200 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_and_convert_visualwakewords_lib.py @@ -0,0 +1,286 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Helper functions to generate the Visual WakeWords dataset. + + It filters raw COCO annotations file to Visual WakeWords Dataset + annotations. The resulting annotations and COCO images are then converted + to TF records. + See download_and_convert_visualwakewords.py for the sample usage. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import hashlib +import io +import json +import os +import contextlib2 + +import PIL.Image + +import tensorflow as tf + +from datasets import dataset_utils + +tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + +tf.compat.v1.app.flags.DEFINE_string( + 'coco_train_url', + 'http://images.cocodataset.org/zips/train2014.zip', + 'Link to zip file containing coco training data') +tf.compat.v1.app.flags.DEFINE_string( + 'coco_validation_url', + 'http://images.cocodataset.org/zips/val2014.zip', + 'Link to zip file containing coco validation data') +tf.compat.v1.app.flags.DEFINE_string( + 'coco_annotations_url', + 'http://images.cocodataset.org/annotations/annotations_trainval2014.zip', + 'Link to zip file containing coco annotation data') + +FLAGS = tf.compat.v1.app.flags.FLAGS + + +def download_coco_dataset(dataset_dir): + """Download the coco dataset. + + Args: + dataset_dir: Path where coco dataset should be downloaded. + """ + dataset_utils.download_and_uncompress_zipfile(FLAGS.coco_train_url, + dataset_dir) + dataset_utils.download_and_uncompress_zipfile(FLAGS.coco_validation_url, + dataset_dir) + dataset_utils.download_and_uncompress_zipfile(FLAGS.coco_annotations_url, + dataset_dir) + + +def create_labels_file(foreground_class_of_interest, + visualwakewords_labels_file): + """Generate visualwakewords labels file. + + Args: + foreground_class_of_interest: category from COCO dataset that is filtered by + the visualwakewords dataset + visualwakewords_labels_file: output visualwakewords label file + """ + labels_to_class_names = {0: 'background', 1: foreground_class_of_interest} + with open(visualwakewords_labels_file, 'w') as fp: + for label in labels_to_class_names: + fp.write(str(label) + ':' + str(labels_to_class_names[label]) + '\n') + + +def create_visual_wakeword_annotations(annotations_file, + visualwakewords_annotations_file, + small_object_area_threshold, + foreground_class_of_interest): + """Generate visual wakewords annotations file. + + Loads COCO annotation json files to generate visualwakewords annotations file. + + Args: + annotations_file: JSON file containing COCO bounding box annotations + visualwakewords_annotations_file: path to output annotations file + small_object_area_threshold: threshold on fraction of image area below which + small object bounding boxes are filtered + foreground_class_of_interest: category from COCO dataset that is filtered by + the visual wakewords dataset + """ + # default object of interest is person + foreground_class_of_interest_id = 1 + with tf.gfile.GFile(annotations_file, 'r') as fid: + groundtruth_data = json.load(fid) + images = groundtruth_data['images'] + # Create category index + category_index = {} + for category in groundtruth_data['categories']: + if category['name'] == foreground_class_of_interest: + foreground_class_of_interest_id = category['id'] + category_index[category['id']] = category + # Create annotations index, a map of image_id to it's annotations + tf.logging.info('Building annotations index...') + annotations_index = collections.defaultdict( + lambda: collections.defaultdict(list)) + # structure is { "image_id": {"objects" : [list of the image annotations]}} + for annotation in groundtruth_data['annotations']: + annotations_index[annotation['image_id']]['objects'].append(annotation) + missing_annotation_count = len(images) - len(annotations_index) + tf.logging.info('%d images are missing annotations.', + missing_annotation_count) + # Create filtered annotations index + annotations_index_filtered = {} + for idx, image in enumerate(images): + if idx % 100 == 0: + tf.logging.info('On image %d of %d', idx, len(images)) + annotations = annotations_index[image['id']] + annotations_filtered = _filter_annotations( + annotations, image, small_object_area_threshold, + foreground_class_of_interest_id) + annotations_index_filtered[image['id']] = annotations_filtered + + with open(visualwakewords_annotations_file, 'w') as fp: + json.dump( + { + 'images': images, + 'annotations': annotations_index_filtered, + 'categories': category_index + }, fp) + + +def _filter_annotations(annotations, image, small_object_area_threshold, + foreground_class_of_interest_id): + """Filters COCO annotations to visual wakewords annotations. + + Args: + annotations: dicts with keys: { + u'objects': [{u'id', u'image_id', u'category_id', u'segmentation', + u'area', u'bbox' : [x,y,width,height], u'iscrowd'}] } Notice + that bounding box coordinates in the official COCO dataset + are given as [x, y, width, height] tuples using absolute + coordinates where x, y represent the top-left (0-indexed) + corner. + image: dict with keys: [u'license', u'file_name', u'coco_url', u'height', + u'width', u'date_captured', u'flickr_url', u'id'] + small_object_area_threshold: threshold on fraction of image area below which + small objects are filtered + foreground_class_of_interest_id: category of COCO dataset which visual + wakewords filters + + Returns: + annotations_filtered: dict with keys: { + u'objects': [{"area", "bbox" : [x,y,width,height]}], + u'label', + } + """ + objects = [] + image_area = image['height'] * image['width'] + for annotation in annotations['objects']: + normalized_object_area = annotation['area'] / image_area + category_id = int(annotation['category_id']) + # Filter valid bounding boxes + if category_id == foreground_class_of_interest_id and \ + normalized_object_area > small_object_area_threshold: + objects.append({ + u'area': annotation['area'], + u'bbox': annotation['bbox'], + }) + label = 1 if objects else 0 + return { + 'objects': objects, + 'label': label, + } + + +def create_tf_record_for_visualwakewords_dataset(annotations_file, image_dir, + output_path, num_shards): + """Loads Visual WakeWords annotations/images and converts to tf.Record format. + + Args: + annotations_file: JSON file containing bounding box annotations. + image_dir: Directory containing the image files. + output_path: Path to output tf.Record file. + num_shards: number of output file shards. + """ + with contextlib2.ExitStack() as tf_record_close_stack, \ + tf.gfile.GFile(annotations_file, 'r') as fid: + output_tfrecords = dataset_utils.open_sharded_output_tfrecords( + tf_record_close_stack, output_path, num_shards) + groundtruth_data = json.load(fid) + images = groundtruth_data['images'] + annotations_index = groundtruth_data['annotations'] + annotations_index = {int(k): v for k, v in annotations_index.iteritems()} + # convert 'unicode' key to 'int' key after we parse the json file + + for idx, image in enumerate(images): + if idx % 100 == 0: + tf.logging.info('On image %d of %d', idx, len(images)) + annotations = annotations_index[image['id']] + tf_example = _create_tf_example(image, annotations, image_dir) + shard_idx = idx % num_shards + output_tfrecords[shard_idx].write(tf_example.SerializeToString()) + + +def _create_tf_example(image, annotations, image_dir): + """Converts image and annotations to a tf.Example proto. + + Args: + image: dict with keys: [u'license', u'file_name', u'coco_url', u'height', + u'width', u'date_captured', u'flickr_url', u'id'] + annotations: dict with objects (a list of image annotations) and a label. + {u'objects':[{"area", "bbox" : [x,y,width,height}], u'label'}. Notice + that bounding box coordinates in the COCO dataset are given as[x, y, + width, height] tuples using absolute coordinates where x, y represent + the top-left (0-indexed) corner. This function also converts to the format + that can be used by the Tensorflow Object Detection API (which is [ymin, + xmin, ymax, xmax] with coordinates normalized relative to image size). + image_dir: directory containing the image files. + Returns: + tf_example: The converted tf.Example + + Raises: + ValueError: if the image pointed to by data['filename'] is not a valid JPEG + """ + image_height = image['height'] + image_width = image['width'] + filename = image['file_name'] + image_id = image['id'] + + full_path = os.path.join(image_dir, filename) + with tf.gfile.GFile(full_path, 'rb') as fid: + encoded_jpg = fid.read() + encoded_jpg_io = io.BytesIO(encoded_jpg) + image = PIL.Image.open(encoded_jpg_io) + key = hashlib.sha256(encoded_jpg).hexdigest() + + xmin, xmax, ymin, ymax, area = [], [], [], [], [] + for obj in annotations['objects']: + (x, y, width, height) = tuple(obj['bbox']) + xmin.append(float(x) / image_width) + xmax.append(float(x + width) / image_width) + ymin.append(float(y) / image_height) + ymax.append(float(y + height) / image_height) + area.append(obj['area']) + + feature_dict = { + 'image/height': + dataset_utils.int64_feature(image_height), + 'image/width': + dataset_utils.int64_feature(image_width), + 'image/filename': + dataset_utils.bytes_feature(filename.encode('utf8')), + 'image/source_id': + dataset_utils.bytes_feature(str(image_id).encode('utf8')), + 'image/key/sha256': + dataset_utils.bytes_feature(key.encode('utf8')), + 'image/encoded': + dataset_utils.bytes_feature(encoded_jpg), + 'image/format': + dataset_utils.bytes_feature('jpeg'.encode('utf8')), + 'image/class/label': + dataset_utils.int64_feature(annotations['label']), + 'image/object/bbox/xmin': + dataset_utils.float_list_feature(xmin), + 'image/object/bbox/xmax': + dataset_utils.float_list_feature(xmax), + 'image/object/bbox/ymin': + dataset_utils.float_list_feature(ymin), + 'image/object/bbox/ymax': + dataset_utils.float_list_feature(ymax), + 'image/object/area': + dataset_utils.float_list_feature(area), + } + example = tf.train.Example(features=tf.train.Features(feature=feature_dict)) + return example diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_imagenet.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_imagenet.sh new file mode 100644 index 0000000..c780e17 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/download_imagenet.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Script to download ImageNet Challenge 2012 training and validation data set. +# +# Downloads and decompresses raw images and bounding boxes. +# +# **IMPORTANT** +# To download the raw images, the user must create an account with image-net.org +# and generate a username and access_key. The latter two are required for +# downloading the raw images. +# +# usage: +# ./download_imagenet.sh [dirname] +set -e + +if [ "x$IMAGENET_ACCESS_KEY" == x -o "x$IMAGENET_USERNAME" == x ]; then + cat < ') + sys.exit(-1) + data_dir = sys.argv[1] + validation_labels_file = sys.argv[2] + + # Read in the 50000 synsets associated with the validation data set. + labels = [l.strip() for l in open(validation_labels_file).readlines()] + unique_labels = set(labels) + + # Make all sub-directories in the validation data dir. + for label in unique_labels: + labeled_data_dir = os.path.join(data_dir, label) + os.makedirs(labeled_data_dir) + + # Move all of the image to the appropriate sub-directory. + for i in xrange(len(labels)): + basename = 'ILSVRC2012_val_000%.5d.JPEG' % (i + 1) + original_filename = os.path.join(data_dir, basename) + if not os.path.exists(original_filename): + print('Failed to find: ', original_filename) + sys.exit(-1) + new_filename = os.path.join(data_dir, labels[i], basename) + os.rename(original_filename, new_filename) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/process_bounding_boxes.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/process_bounding_boxes.py new file mode 100644 index 0000000..78c899e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/process_bounding_boxes.py @@ -0,0 +1,253 @@ +#!/usr/bin/python +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Process the ImageNet Challenge bounding boxes for TensorFlow model training. + +This script is called as + +process_bounding_boxes.py [synsets-file] + +Where is a directory containing the downloaded and unpacked bounding box +data. If [synsets-file] is supplied, then only the bounding boxes whose +synstes are contained within this file are returned. Note that the +[synsets-file] file contains synset ids, one per line. + +The script dumps out a CSV text file in which each line contains an entry. + n00007846_64193.JPEG,0.0060,0.2620,0.7545,0.9940 + +The entry can be read as: + , , , , + +The bounding box for contains two points (xmin, ymin) and +(xmax, ymax) specifying the lower-left corner and upper-right corner of a +bounding box in *relative* coordinates. + +The user supplies a directory where the XML files reside. The directory +structure in the directory is assumed to look like this: + +/nXXXXXXXX/nXXXXXXXX_YYYY.xml + +Each XML file contains a bounding box annotation. The script: + + (1) Parses the XML file and extracts the filename, label and bounding box info. + + (2) The bounding box is specified in the XML files as integer (xmin, ymin) and + (xmax, ymax) *relative* to image size displayed to the human annotator. The + size of the image displayed to the human annotator is stored in the XML file + as integer (height, width). + + Note that the displayed size will differ from the actual size of the image + downloaded from image-net.org. To make the bounding box annotation useable, + we convert bounding box to floating point numbers relative to displayed + height and width of the image. + + Note that each XML file might contain N bounding box annotations. + + Note that the points are all clamped at a range of [0.0, 1.0] because some + human annotations extend outside the range of the supplied image. + + See details here: http://image-net.org/download-bboxes + +(3) By default, the script outputs all valid bounding boxes. If a + [synsets-file] is supplied, only the subset of bounding boxes associated + with those synsets are outputted. Importantly, one can supply a list of + synsets in the ImageNet Challenge and output the list of bounding boxes + associated with the training images of the ILSVRC. + + We use these bounding boxes to inform the random distortion of images + supplied to the network. + +If you run this script successfully, you will see the following output +to stderr: +> Finished processing 544546 XML files. +> Skipped 0 XML files not in ImageNet Challenge. +> Skipped 0 bounding boxes not in ImageNet Challenge. +> Wrote 615299 bounding boxes from 544546 annotated images. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import glob +import os.path +import sys +import xml.etree.ElementTree as ET +from six.moves import xrange # pylint: disable=redefined-builtin + + +class BoundingBox(object): + pass + + +def GetItem(name, root, index=0): + count = 0 + for item in root.iter(name): + if count == index: + return item.text + count += 1 + # Failed to find "index" occurrence of item. + return -1 + + +def GetInt(name, root, index=0): + return int(GetItem(name, root, index)) + + +def FindNumberBoundingBoxes(root): + index = 0 + while True: + if GetInt('xmin', root, index) == -1: + break + index += 1 + return index + + +def ProcessXMLAnnotation(xml_file): + """Process a single XML file containing a bounding box.""" + # pylint: disable=broad-except + try: + tree = ET.parse(xml_file) + except Exception: + print('Failed to parse: ' + xml_file, file=sys.stderr) + return None + # pylint: enable=broad-except + root = tree.getroot() + + num_boxes = FindNumberBoundingBoxes(root) + boxes = [] + + for index in xrange(num_boxes): + box = BoundingBox() + # Grab the 'index' annotation. + box.xmin = GetInt('xmin', root, index) + box.ymin = GetInt('ymin', root, index) + box.xmax = GetInt('xmax', root, index) + box.ymax = GetInt('ymax', root, index) + + box.width = GetInt('width', root) + box.height = GetInt('height', root) + box.filename = GetItem('filename', root) + '.JPEG' + box.label = GetItem('name', root) + + xmin = float(box.xmin) / float(box.width) + xmax = float(box.xmax) / float(box.width) + ymin = float(box.ymin) / float(box.height) + ymax = float(box.ymax) / float(box.height) + + # Some images contain bounding box annotations that + # extend outside of the supplied image. See, e.g. + # n03127925/n03127925_147.xml + # Additionally, for some bounding boxes, the min > max + # or the box is entirely outside of the image. + min_x = min(xmin, xmax) + max_x = max(xmin, xmax) + box.xmin_scaled = min(max(min_x, 0.0), 1.0) + box.xmax_scaled = min(max(max_x, 0.0), 1.0) + + min_y = min(ymin, ymax) + max_y = max(ymin, ymax) + box.ymin_scaled = min(max(min_y, 0.0), 1.0) + box.ymax_scaled = min(max(max_y, 0.0), 1.0) + + boxes.append(box) + + return boxes + +if __name__ == '__main__': + if len(sys.argv) < 2 or len(sys.argv) > 3: + print('Invalid usage\n' + 'usage: process_bounding_boxes.py [synsets-file]', + file=sys.stderr) + sys.exit(-1) + + xml_files = glob.glob(sys.argv[1] + '/*/*.xml') + print('Identified %d XML files in %s' % (len(xml_files), sys.argv[1]), + file=sys.stderr) + + if len(sys.argv) == 3: + labels = set([l.strip() for l in open(sys.argv[2]).readlines()]) + print('Identified %d synset IDs in %s' % (len(labels), sys.argv[2]), + file=sys.stderr) + else: + labels = None + + skipped_boxes = 0 + skipped_files = 0 + saved_boxes = 0 + saved_files = 0 + for file_index, one_file in enumerate(xml_files): + # Example: <...>/n06470073/n00141669_6790.xml + label = os.path.basename(os.path.dirname(one_file)) + + # Determine if the annotation is from an ImageNet Challenge label. + if labels is not None and label not in labels: + skipped_files += 1 + continue + + bboxes = ProcessXMLAnnotation(one_file) + assert bboxes is not None, 'No bounding boxes found in ' + one_file + + found_box = False + for bbox in bboxes: + if labels is not None: + if bbox.label != label: + # Note: There is a slight bug in the bounding box annotation data. + # Many of the dog labels have the human label 'Scottish_deerhound' + # instead of the synset ID 'n02092002' in the bbox.label field. As a + # simple hack to overcome this issue, we only exclude bbox labels + # *which are synset ID's* that do not match original synset label for + # the XML file. + if bbox.label in labels: + skipped_boxes += 1 + continue + + # Guard against improperly specified boxes. + if (bbox.xmin_scaled >= bbox.xmax_scaled or + bbox.ymin_scaled >= bbox.ymax_scaled): + skipped_boxes += 1 + continue + + # Note bbox.filename occasionally contains '%s' in the name. This is + # data set noise that is fixed by just using the basename of the XML file. + image_filename = os.path.splitext(os.path.basename(one_file))[0] + print('%s.JPEG,%.4f,%.4f,%.4f,%.4f' % + (image_filename, + bbox.xmin_scaled, bbox.ymin_scaled, + bbox.xmax_scaled, bbox.ymax_scaled)) + + saved_boxes += 1 + found_box = True + if found_box: + saved_files += 1 + else: + skipped_files += 1 + + if not file_index % 5000: + print('--> processed %d of %d XML files.' % + (file_index + 1, len(xml_files)), + file=sys.stderr) + print('--> skipped %d boxes and %d XML files.' % + (skipped_boxes, skipped_files), file=sys.stderr) + + print('Finished processing %d XML files.' % len(xml_files), file=sys.stderr) + print('Skipped %d XML files not in ImageNet Challenge.' % skipped_files, + file=sys.stderr) + print('Skipped %d bounding boxes not in ImageNet Challenge.' % skipped_boxes, + file=sys.stderr) + print('Wrote %d bounding boxes from %d annotated images.' % + (saved_boxes, saved_files), + file=sys.stderr) + print('Finished.', file=sys.stderr) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/visualwakewords.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/visualwakewords.py new file mode 100644 index 0000000..41d4e67 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/datasets/visualwakewords.py @@ -0,0 +1,129 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides data for Visual WakeWords Dataset with images+labels. + +Visual WakeWords Dataset derives from the COCO dataset to design tiny models +classifying two classes, such as person/not-person. The COCO annotations +are filtered to two classes: person and not-person (or another user-defined +category). Bounding boxes for small objects with area less than 5% of the image +area are filtered out. +See build_visualwakewords_data.py which generates the Visual WakeWords dataset +annotations from the raw COCO dataset and converts them to TFRecord. + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from datasets import dataset_utils + + +slim = contrib_slim + +_FILE_PATTERN = '%s.record-*' + +_SPLITS_TO_SIZES = { + 'train': 82783, + 'val': 40504, +} + + +_ITEMS_TO_DESCRIPTIONS = { + 'image': 'A color image of varying height and width.', + 'label': 'The label id of the image, an integer in {0, 1}', + 'object/bbox': 'A list of bounding boxes.', +} + +_NUM_CLASSES = 2 + +# labels file +LABELS_FILENAME = 'labels.txt' + + +def get_split(split_name, dataset_dir, file_pattern=None, reader=None): + """Gets a dataset tuple with instructions for reading ImageNet. + + Args: + split_name: A train/test split name. + dataset_dir: The base directory of the dataset sources. + file_pattern: The file pattern to use when matching the dataset sources. It + is assumed that the pattern contains a '%s' string so that the split name + can be inserted. + reader: The TensorFlow reader type. + + Returns: + A `Dataset` namedtuple. + + Raises: + ValueError: if `split_name` is not a valid train/test split. + """ + if split_name not in _SPLITS_TO_SIZES: + raise ValueError('split name %s was not recognized.' % split_name) + + if not file_pattern: + file_pattern = _FILE_PATTERN + file_pattern = os.path.join(dataset_dir, file_pattern % split_name) + + # Allowing None in the signature so that dataset_factory can use the default. + if reader is None: + reader = tf.TFRecordReader + + keys_to_features = { + 'image/encoded': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/format': + tf.FixedLenFeature((), tf.string, default_value='jpeg'), + 'image/class/label': + tf.FixedLenFeature([], dtype=tf.int64, default_value=-1), + 'image/object/bbox/xmin': + tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': + tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': + tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': + tf.VarLenFeature(dtype=tf.float32), + } + + items_to_handlers = { + 'image': + slim.tfexample_decoder.Image('image/encoded', 'image/format'), + 'label': + slim.tfexample_decoder.Tensor('image/class/label'), + 'object/bbox': + slim.tfexample_decoder.BoundingBox(['ymin', 'xmin', 'ymax', 'xmax'], + 'image/object/bbox/'), + } + + decoder = slim.tfexample_decoder.TFExampleDecoder(keys_to_features, + items_to_handlers) + + labels_to_names = None + labels_file = os.path.join(dataset_dir, LABELS_FILENAME) + if tf.gfile.Exists(labels_file): + labels_to_names = dataset_utils.read_label_file(dataset_dir) + + return slim.dataset.Dataset( + data_sources=file_pattern, + reader=reader, + decoder=decoder, + num_samples=_SPLITS_TO_SIZES[split_name], + items_to_descriptions=_ITEMS_TO_DESCRIPTIONS, + num_classes=_NUM_CLASSES, + labels_to_names=labels_to_names) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy.py new file mode 100644 index 0000000..3d8d5f8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy.py @@ -0,0 +1,677 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Deploy Slim models across multiple clones and replicas. + +# TODO(sguada) docstring paragraph by (a) motivating the need for the file and +# (b) defining clones. + +# TODO(sguada) describe the high-level components of model deployment. +# E.g. "each model deployment is composed of several parts: a DeploymentConfig, +# which captures A, B and C, an input_fn which loads data.. etc + +To easily train a model on multiple GPUs or across multiple machines this +module provides a set of helper functions: `create_clones`, +`optimize_clones` and `deploy`. + +Usage: + + g = tf.Graph() + + # Set up DeploymentConfig + config = model_deploy.DeploymentConfig(num_clones=2, clone_on_cpu=True) + + # Create the global step on the device storing the variables. + with tf.device(config.variables_device()): + global_step = slim.create_global_step() + + # Define the inputs + with tf.device(config.inputs_device()): + images, labels = LoadData(...) + inputs_queue = slim.data.prefetch_queue((images, labels)) + + # Define the optimizer. + with tf.device(config.optimizer_device()): + optimizer = tf.train.MomentumOptimizer(FLAGS.learning_rate, FLAGS.momentum) + + # Define the model including the loss. + def model_fn(inputs_queue): + images, labels = inputs_queue.dequeue() + predictions = CreateNetwork(images) + slim.losses.log_loss(predictions, labels) + + model_dp = model_deploy.deploy(config, model_fn, [inputs_queue], + optimizer=optimizer) + + # Run training. + slim.learning.train(model_dp.train_op, my_log_dir, + summary_op=model_dp.summary_op) + +The Clone namedtuple holds together the values associated with each call to +model_fn: + * outputs: The return values of the calls to `model_fn()`. + * scope: The scope used to create the clone. + * device: The device used to create the clone. + +DeployedModel namedtuple, holds together the values needed to train multiple +clones: + * train_op: An operation that run the optimizer training op and include + all the update ops created by `model_fn`. Present only if an optimizer + was specified. + * summary_op: An operation that run the summaries created by `model_fn` + and process_gradients. + * total_loss: A `Tensor` that contains the sum of all losses created by + `model_fn` plus the regularization losses. + * clones: List of `Clone` tuples returned by `create_clones()`. + +DeploymentConfig parameters: + * num_clones: Number of model clones to deploy in each replica. + * clone_on_cpu: True if clones should be placed on CPU. + * replica_id: Integer. Index of the replica for which the model is + deployed. Usually 0 for the chief replica. + * num_replicas: Number of replicas to use. + * num_ps_tasks: Number of tasks for the `ps` job. 0 to not use replicas. + * worker_job_name: A name for the worker job. + * ps_job_name: A name for the parameter server job. + +TODO(sguada): + - describe side effect to the graph. + - what happens to summaries and update_ops. + - which graph collections are altered. + - write a tutorial on how to use this. + - analyze the possibility of calling deploy more than once. + + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +__all__ = ['create_clones', + 'deploy', + 'optimize_clones', + 'DeployedModel', + 'DeploymentConfig', + 'Clone', + ] + +# Namedtuple used to represent a clone during deployment. +Clone = collections.namedtuple('Clone', + ['outputs', # Whatever model_fn() returned. + 'scope', # The scope used to create it. + 'device', # The device used to create. + ]) + +# Namedtuple used to represent a DeployedModel, returned by deploy(). +DeployedModel = collections.namedtuple('DeployedModel', + ['train_op', # The `train_op` + 'summary_op', # The `summary_op` + 'total_loss', # The loss `Tensor` + 'clones', # A list of `Clones` tuples. + ]) + +# Default parameters for DeploymentConfig +_deployment_params = {'num_clones': 1, + 'clone_on_cpu': False, + 'replica_id': 0, + 'num_replicas': 1, + 'num_ps_tasks': 0, + 'worker_job_name': 'worker', + 'ps_job_name': 'ps'} + + +def create_clones(config, model_fn, args=None, kwargs=None): + """Creates multiple clones according to config using a `model_fn`. + + The returned values of `model_fn(*args, **kwargs)` are collected along with + the scope and device used to created it in a namedtuple + `Clone(outputs, scope, device)` + + Note: it is assumed that any loss created by `model_fn` is collected at + the tf.GraphKeys.LOSSES collection. + + To recover the losses, summaries or update_ops created by the clone use: + ```python + losses = tf.get_collection(tf.GraphKeys.LOSSES, clone.scope) + summaries = tf.get_collection(tf.GraphKeys.SUMMARIES, clone.scope) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, clone.scope) + ``` + + The deployment options are specified by the config object and support + deploying one or several clones on different GPUs and one or several replicas + of such clones. + + The argument `model_fn` is called `config.num_clones` times to create the + model clones as `model_fn(*args, **kwargs)`. + + If `config` specifies deployment on multiple replicas then the default + tensorflow device is set appropriatly for each call to `model_fn` and for the + slim variable creation functions: model and global variables will be created + on the `ps` device, the clone operations will be on the `worker` device. + + Args: + config: A DeploymentConfig object. + model_fn: A callable. Called as `model_fn(*args, **kwargs)` + args: Optional list of arguments to pass to `model_fn`. + kwargs: Optional list of keyword arguments to pass to `model_fn`. + + Returns: + A list of namedtuples `Clone`. + """ + clones = [] + args = args or [] + kwargs = kwargs or {} + with slim.arg_scope([slim.model_variable, slim.variable], + device=config.variables_device()): + # Create clones. + for i in range(0, config.num_clones): + with tf.name_scope(config.clone_scope(i)) as clone_scope: + clone_device = config.clone_device(i) + with tf.device(clone_device): + with tf.variable_scope(tf.get_variable_scope(), + reuse=True if i > 0 else None): + outputs = model_fn(*args, **kwargs) + clones.append(Clone(outputs, clone_scope, clone_device)) + return clones + + +def _gather_clone_loss(clone, num_clones, regularization_losses): + """Gather the loss for a single clone. + + Args: + clone: A Clone namedtuple. + num_clones: The number of clones being deployed. + regularization_losses: Possibly empty list of regularization_losses + to add to the clone losses. + + Returns: + A tensor for the total loss for the clone. Can be None. + """ + # The return value. + sum_loss = None + # Individual components of the loss that will need summaries. + clone_loss = None + regularization_loss = None + # Compute and aggregate losses on the clone device. + with tf.device(clone.device): + all_losses = [] + clone_losses = tf.get_collection(tf.GraphKeys.LOSSES, clone.scope) + if clone_losses: + clone_loss = tf.add_n(clone_losses, name='clone_loss') + if num_clones > 1: + clone_loss = tf.div(clone_loss, 1.0 * num_clones, + name='scaled_clone_loss') + all_losses.append(clone_loss) + if regularization_losses: + regularization_loss = tf.add_n(regularization_losses, + name='regularization_loss') + all_losses.append(regularization_loss) + if all_losses: + sum_loss = tf.add_n(all_losses) + # Add the summaries out of the clone device block. + if clone_loss is not None: + tf.summary.scalar('/'.join(filter(None, + ['Losses', clone.scope, 'clone_loss'])), + clone_loss) + if regularization_loss is not None: + tf.summary.scalar('Losses/regularization_loss', regularization_loss) + return sum_loss + + +def _optimize_clone(optimizer, clone, num_clones, regularization_losses, + **kwargs): + """Compute losses and gradients for a single clone. + + Args: + optimizer: A tf.Optimizer object. + clone: A Clone namedtuple. + num_clones: The number of clones being deployed. + regularization_losses: Possibly empty list of regularization_losses + to add to the clone losses. + **kwargs: Dict of kwarg to pass to compute_gradients(). + + Returns: + A tuple (clone_loss, clone_grads_and_vars). + - clone_loss: A tensor for the total loss for the clone. Can be None. + - clone_grads_and_vars: List of (gradient, variable) for the clone. + Can be empty. + """ + sum_loss = _gather_clone_loss(clone, num_clones, regularization_losses) + clone_grad = None + if sum_loss is not None: + # with tf.device(clone.device): + # clone_grad = optimizer.compute_gradients(sum_loss, **kwargs) + clone_grad = optimizer.compute_gradients(sum_loss, **kwargs) + return sum_loss, clone_grad + + +def optimize_clones(clones, optimizer, + regularization_losses=None, + **kwargs): + """Compute clone losses and gradients for the given list of `Clones`. + + Note: The regularization_losses are added to the first clone losses. + + Args: + clones: List of `Clones` created by `create_clones()`. + optimizer: An `Optimizer` object. + regularization_losses: Optional list of regularization losses. If None it + will gather them from tf.GraphKeys.REGULARIZATION_LOSSES. Pass `[]` to + exclude them. + **kwargs: Optional list of keyword arguments to pass to `compute_gradients`. + + Returns: + A tuple (total_loss, grads_and_vars). + - total_loss: A Tensor containing the average of the clone losses including + the regularization loss. + - grads_and_vars: A List of tuples (gradient, variable) containing the sum + of the gradients for each variable. + + """ + grads_and_vars = [] + clones_losses = [] + num_clones = len(clones) + if regularization_losses is None: + regularization_losses = tf.get_collection( + tf.GraphKeys.REGULARIZATION_LOSSES) + for clone in clones: + with tf.name_scope(clone.scope): + clone_loss, clone_grad = _optimize_clone( + optimizer, clone, num_clones, regularization_losses, **kwargs) + if clone_loss is not None: + clones_losses.append(clone_loss) + grads_and_vars.append(clone_grad) + # Only use regularization_losses for the first clone + regularization_losses = None + # Compute the total_loss summing all the clones_losses. + total_loss = tf.add_n(clones_losses, name='total_loss') + # Sum the gradients across clones. + grads_and_vars = _sum_clones_gradients(grads_and_vars) + return total_loss, grads_and_vars + + +def deploy(config, + model_fn, + args=None, + kwargs=None, + optimizer=None, + summarize_gradients=False): + """Deploys a Slim-constructed model across multiple clones. + + The deployment options are specified by the config object and support + deploying one or several clones on different GPUs and one or several replicas + of such clones. + + The argument `model_fn` is called `config.num_clones` times to create the + model clones as `model_fn(*args, **kwargs)`. + + The optional argument `optimizer` is an `Optimizer` object. If not `None`, + the deployed model is configured for training with that optimizer. + + If `config` specifies deployment on multiple replicas then the default + tensorflow device is set appropriatly for each call to `model_fn` and for the + slim variable creation functions: model and global variables will be created + on the `ps` device, the clone operations will be on the `worker` device. + + Args: + config: A `DeploymentConfig` object. + model_fn: A callable. Called as `model_fn(*args, **kwargs)` + args: Optional list of arguments to pass to `model_fn`. + kwargs: Optional list of keyword arguments to pass to `model_fn`. + optimizer: Optional `Optimizer` object. If passed the model is deployed + for training with that optimizer. + summarize_gradients: Whether or not add summaries to the gradients. + + Returns: + A `DeployedModel` namedtuple. + + """ + # Gather initial summaries. + summaries = set(tf.get_collection(tf.GraphKeys.SUMMARIES)) + + # Create Clones. + clones = create_clones(config, model_fn, args, kwargs) + first_clone = clones[0] + + # Gather update_ops from the first clone. These contain, for example, + # the updates for the batch_norm variables created by model_fn. + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, first_clone.scope) + + train_op = None + total_loss = None + with tf.device(config.optimizer_device()): + if optimizer: + # Place the global step on the device storing the variables. + with tf.device(config.variables_device()): + global_step = slim.get_or_create_global_step() + + # Compute the gradients for the clones. + total_loss, clones_gradients = optimize_clones(clones, optimizer) + + if clones_gradients: + if summarize_gradients: + # Add summaries to the gradients. + summaries |= set(_add_gradients_summaries(clones_gradients)) + + # Create gradient updates. + grad_updates = optimizer.apply_gradients(clones_gradients, + global_step=global_step) + update_ops.append(grad_updates) + + update_op = tf.group(*update_ops) + with tf.control_dependencies([update_op]): + train_op = tf.identity(total_loss, name='train_op') + else: + clones_losses = [] + regularization_losses = tf.get_collection( + tf.GraphKeys.REGULARIZATION_LOSSES) + for clone in clones: + with tf.name_scope(clone.scope): + clone_loss = _gather_clone_loss(clone, len(clones), + regularization_losses) + if clone_loss is not None: + clones_losses.append(clone_loss) + # Only use regularization_losses for the first clone + regularization_losses = None + if clones_losses: + total_loss = tf.add_n(clones_losses, name='total_loss') + + # Add the summaries from the first clone. These contain the summaries + # created by model_fn and either optimize_clones() or _gather_clone_loss(). + summaries |= set(tf.get_collection(tf.GraphKeys.SUMMARIES, + first_clone.scope)) + + if total_loss is not None: + # Add total_loss to summary. + summaries.add(tf.summary.scalar('total_loss', total_loss)) + + if summaries: + # Merge all summaries together. + summary_op = tf.summary.merge(list(summaries), name='summary_op') + else: + summary_op = None + + return DeployedModel(train_op, summary_op, total_loss, clones) + + +def _sum_clones_gradients(clone_grads): + """Calculate the sum gradient for each shared variable across all clones. + + This function assumes that the clone_grads has been scaled appropriately by + 1 / num_clones. + + Args: + clone_grads: A List of List of tuples (gradient, variable), one list per + `Clone`. + + Returns: + List of tuples of (gradient, variable) where the gradient has been summed + across all clones. + """ + sum_grads = [] + for grad_and_vars in zip(*clone_grads): + # Note that each grad_and_vars looks like the following: + # ((grad_var0_clone0, var0), ... (grad_varN_cloneN, varN)) + grads = [] + var = grad_and_vars[0][1] + for g, v in grad_and_vars: + assert v == var + if g is not None: + grads.append(g) + if grads: + if len(grads) > 1: + sum_grad = tf.add_n(grads, name=var.op.name + '/sum_grads') + else: + sum_grad = grads[0] + sum_grads.append((sum_grad, var)) + return sum_grads + + +def _add_gradients_summaries(grads_and_vars): + """Add histogram summaries to gradients. + + Note: The summaries are also added to the SUMMARIES collection. + + Args: + grads_and_vars: A list of gradient to variable pairs (tuples). + + Returns: + The _list_ of the added summaries for grads_and_vars. + """ + summaries = [] + for grad, var in grads_and_vars: + if grad is not None: + if isinstance(grad, tf.IndexedSlices): + grad_values = grad.values + else: + grad_values = grad + summaries.append(tf.summary.histogram(var.op.name + ':gradient', + grad_values)) + summaries.append(tf.summary.histogram(var.op.name + ':gradient_norm', + tf.global_norm([grad_values]))) + else: + tf.logging.info('Var %s has no gradient', var.op.name) + return summaries + + +class DeploymentConfig(object): + """Configuration for deploying a model with `deploy()`. + + You can pass an instance of this class to `deploy()` to specify exactly + how to deploy the model to build. If you do not pass one, an instance built + from the default deployment_hparams will be used. + """ + + def __init__(self, + num_clones=1, + clone_on_cpu=False, + replica_id=0, + num_replicas=1, + num_ps_tasks=0, + worker_job_name='worker', + ps_job_name='ps'): + """Create a DeploymentConfig. + + The config describes how to deploy a model across multiple clones and + replicas. The model will be replicated `num_clones` times in each replica. + If `clone_on_cpu` is True, each clone will placed on CPU. + + If `num_replicas` is 1, the model is deployed via a single process. In that + case `worker_device`, `num_ps_tasks`, and `ps_device` are ignored. + + If `num_replicas` is greater than 1, then `worker_device` and `ps_device` + must specify TensorFlow devices for the `worker` and `ps` jobs and + `num_ps_tasks` must be positive. + + Args: + num_clones: Number of model clones to deploy in each replica. + clone_on_cpu: If True clones would be placed on CPU. + replica_id: Integer. Index of the replica for which the model is + deployed. Usually 0 for the chief replica. + num_replicas: Number of replicas to use. + num_ps_tasks: Number of tasks for the `ps` job. 0 to not use replicas. + worker_job_name: A name for the worker job. + ps_job_name: A name for the parameter server job. + + Raises: + ValueError: If the arguments are invalid. + """ + if num_replicas > 1: + if num_ps_tasks < 1: + raise ValueError('When using replicas num_ps_tasks must be positive') + if num_replicas > 1 or num_ps_tasks > 0: + if not worker_job_name: + raise ValueError('Must specify worker_job_name when using replicas') + if not ps_job_name: + raise ValueError('Must specify ps_job_name when using parameter server') + if replica_id >= num_replicas: + raise ValueError('replica_id must be less than num_replicas') + self._num_clones = num_clones + self._clone_on_cpu = clone_on_cpu + self._replica_id = replica_id + self._num_replicas = num_replicas + self._num_ps_tasks = num_ps_tasks + self._ps_device = '/job:' + ps_job_name if num_ps_tasks > 0 else '' + self._worker_device = '/job:' + worker_job_name if num_ps_tasks > 0 else '' + + @property + def num_clones(self): + return self._num_clones + + @property + def clone_on_cpu(self): + return self._clone_on_cpu + + @property + def replica_id(self): + return self._replica_id + + @property + def num_replicas(self): + return self._num_replicas + + @property + def num_ps_tasks(self): + return self._num_ps_tasks + + @property + def ps_device(self): + return self._ps_device + + @property + def worker_device(self): + return self._worker_device + + def caching_device(self): + """Returns the device to use for caching variables. + + Variables are cached on the worker CPU when using replicas. + + Returns: + A device string or None if the variables do not need to be cached. + """ + if self._num_ps_tasks > 0: + return lambda op: op.device + else: + return None + + def clone_device(self, clone_index): + """Device used to create the clone and all the ops inside the clone. + + Args: + clone_index: Int, representing the clone_index. + + Returns: + A value suitable for `tf.device()`. + + Raises: + ValueError: if `clone_index` is greater or equal to the number of clones". + """ + if clone_index >= self._num_clones: + raise ValueError('clone_index must be less than num_clones') + device = '' + if self._num_ps_tasks > 0: + device += self._worker_device + if self._clone_on_cpu: + device += '/device:CPU:0' + else: + device += '/device:GPU:%d' % clone_index + return device + + def clone_scope(self, clone_index): + """Name scope to create the clone. + + Args: + clone_index: Int, representing the clone_index. + + Returns: + A name_scope suitable for `tf.name_scope()`. + + Raises: + ValueError: if `clone_index` is greater or equal to the number of clones". + """ + if clone_index >= self._num_clones: + raise ValueError('clone_index must be less than num_clones') + scope = '' + if self._num_clones > 1: + scope = 'clone_%d' % clone_index + return scope + + def optimizer_device(self): + """Device to use with the optimizer. + + Returns: + A value suitable for `tf.device()`. + """ + if self._num_ps_tasks > 0 or self._num_clones > 0: + return self._worker_device + '/device:CPU:0' + else: + return '' + + def inputs_device(self): + """Device to use to build the inputs. + + Returns: + A value suitable for `tf.device()`. + """ + device = '' + if self._num_ps_tasks > 0: + device += self._worker_device + device += '/device:CPU:0' + return device + + def variables_device(self): + """Returns the device to use for variables created inside the clone. + + Returns: + A value suitable for `tf.device()`. + """ + device = '' + if self._num_ps_tasks > 0: + device += self._ps_device + device += '/device:CPU:0' + + class _PSDeviceChooser(object): + """Slim device chooser for variables when using PS.""" + + def __init__(self, device, tasks): + self._device = device + self._tasks = tasks + self._task = 0 + + def choose(self, op): + if op.device: + return op.device + node_def = op if isinstance(op, tf.NodeDef) else op.node_def + if node_def.op.startswith('Variable'): + t = self._task + self._task = (self._task + 1) % self._tasks + d = '%s/task:%d' % (self._device, t) + return d + else: + return op.device + + if not self._num_ps_tasks: + return device + else: + chooser = _PSDeviceChooser(device, self._num_ps_tasks) + return chooser.choose diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy_test.py new file mode 100644 index 0000000..6687958 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/deployment/model_deploy_test.py @@ -0,0 +1,574 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for model_deploy.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers +from tensorflow.contrib import slim as contrib_slim + +from deployment import model_deploy + +slim = contrib_slim + + +class DeploymentConfigTest(tf.test.TestCase): + + def testDefaults(self): + deploy_config = model_deploy.DeploymentConfig() + + self.assertEqual(slim.get_variables(), []) + self.assertEqual(deploy_config.caching_device(), None) + self.assertDeviceEqual(deploy_config.clone_device(0), 'GPU:0') + self.assertEqual(deploy_config.clone_scope(0), '') + self.assertDeviceEqual(deploy_config.optimizer_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.variables_device(), 'CPU:0') + + def testCPUonly(self): + deploy_config = model_deploy.DeploymentConfig(clone_on_cpu=True) + + self.assertEqual(deploy_config.caching_device(), None) + self.assertDeviceEqual(deploy_config.clone_device(0), 'CPU:0') + self.assertEqual(deploy_config.clone_scope(0), '') + self.assertDeviceEqual(deploy_config.optimizer_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.variables_device(), 'CPU:0') + + def testMultiGPU(self): + deploy_config = model_deploy.DeploymentConfig(num_clones=2) + + self.assertEqual(deploy_config.caching_device(), None) + self.assertDeviceEqual(deploy_config.clone_device(0), 'GPU:0') + self.assertDeviceEqual(deploy_config.clone_device(1), 'GPU:1') + self.assertEqual(deploy_config.clone_scope(0), 'clone_0') + self.assertEqual(deploy_config.clone_scope(1), 'clone_1') + self.assertDeviceEqual(deploy_config.optimizer_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), 'CPU:0') + self.assertDeviceEqual(deploy_config.variables_device(), 'CPU:0') + + def testPS(self): + deploy_config = model_deploy.DeploymentConfig(num_clones=1, num_ps_tasks=1) + + self.assertDeviceEqual(deploy_config.clone_device(0), + '/job:worker/device:GPU:0') + self.assertEqual(deploy_config.clone_scope(0), '') + self.assertDeviceEqual(deploy_config.optimizer_device(), + '/job:worker/device:CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), + '/job:worker/device:CPU:0') + with tf.device(deploy_config.variables_device()): + a = tf.Variable(0) + b = tf.Variable(0) + c = tf.no_op() + d = slim.variable('a', [], + caching_device=deploy_config.caching_device()) + self.assertDeviceEqual(a.device, '/job:ps/task:0/device:CPU:0') + self.assertDeviceEqual(a.device, a.value().device) + self.assertDeviceEqual(b.device, '/job:ps/task:0/device:CPU:0') + self.assertDeviceEqual(b.device, b.value().device) + self.assertDeviceEqual(c.device, '') + self.assertDeviceEqual(d.device, '/job:ps/task:0/device:CPU:0') + self.assertDeviceEqual(d.value().device, '') + + def testMultiGPUPS(self): + deploy_config = model_deploy.DeploymentConfig(num_clones=2, num_ps_tasks=1) + + self.assertEqual(deploy_config.caching_device()(tf.no_op()), '') + self.assertDeviceEqual(deploy_config.clone_device(0), + '/job:worker/device:GPU:0') + self.assertDeviceEqual(deploy_config.clone_device(1), + '/job:worker/device:GPU:1') + self.assertEqual(deploy_config.clone_scope(0), 'clone_0') + self.assertEqual(deploy_config.clone_scope(1), 'clone_1') + self.assertDeviceEqual(deploy_config.optimizer_device(), + '/job:worker/device:CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), + '/job:worker/device:CPU:0') + + def testReplicasPS(self): + deploy_config = model_deploy.DeploymentConfig(num_replicas=2, + num_ps_tasks=2) + + self.assertDeviceEqual(deploy_config.clone_device(0), + '/job:worker/device:GPU:0') + self.assertEqual(deploy_config.clone_scope(0), '') + self.assertDeviceEqual(deploy_config.optimizer_device(), + '/job:worker/device:CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), + '/job:worker/device:CPU:0') + + def testReplicasMultiGPUPS(self): + deploy_config = model_deploy.DeploymentConfig(num_replicas=2, + num_clones=2, + num_ps_tasks=2) + self.assertDeviceEqual(deploy_config.clone_device(0), + '/job:worker/device:GPU:0') + self.assertDeviceEqual(deploy_config.clone_device(1), + '/job:worker/device:GPU:1') + self.assertEqual(deploy_config.clone_scope(0), 'clone_0') + self.assertEqual(deploy_config.clone_scope(1), 'clone_1') + self.assertDeviceEqual(deploy_config.optimizer_device(), + '/job:worker/device:CPU:0') + self.assertDeviceEqual(deploy_config.inputs_device(), + '/job:worker/device:CPU:0') + + def testVariablesPS(self): + deploy_config = model_deploy.DeploymentConfig(num_ps_tasks=2) + + with tf.device(deploy_config.variables_device()): + a = tf.Variable(0) + b = tf.Variable(0) + c = tf.no_op() + d = slim.variable('a', [], + caching_device=deploy_config.caching_device()) + + self.assertDeviceEqual(a.device, '/job:ps/task:0/device:CPU:0') + self.assertDeviceEqual(a.device, a.value().device) + self.assertDeviceEqual(b.device, '/job:ps/task:1/device:CPU:0') + self.assertDeviceEqual(b.device, b.value().device) + self.assertDeviceEqual(c.device, '') + self.assertDeviceEqual(d.device, '/job:ps/task:0/device:CPU:0') + self.assertDeviceEqual(d.value().device, '') + + +def LogisticClassifier(inputs, labels, scope=None, reuse=None): + with tf.variable_scope(scope, 'LogisticClassifier', [inputs, labels], + reuse=reuse): + predictions = slim.fully_connected(inputs, 1, activation_fn=tf.sigmoid, + scope='fully_connected') + slim.losses.log_loss(predictions, labels) + return predictions + + +def BatchNormClassifier(inputs, labels, scope=None, reuse=None): + with tf.variable_scope(scope, 'BatchNormClassifier', [inputs, labels], + reuse=reuse): + inputs = slim.batch_norm(inputs, decay=0.1, fused=True) + predictions = slim.fully_connected(inputs, 1, + activation_fn=tf.sigmoid, + scope='fully_connected') + slim.losses.log_loss(predictions, labels) + return predictions + + +class CreatecloneTest(tf.test.TestCase): + + def setUp(self): + # Create an easy training set: + np.random.seed(0) + + self._inputs = np.zeros((16, 4)) + self._labels = np.random.randint(0, 2, size=(16, 1)).astype(np.float32) + self._logdir = self.get_temp_dir() + + for i in range(16): + j = int(2 * self._labels[i] + np.random.randint(0, 2)) + self._inputs[i, j] = 1 + + def testCreateLogisticClassifier(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = LogisticClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + clone = clones[0] + self.assertEqual(len(slim.get_variables()), 2) + for v in slim.get_variables(): + self.assertDeviceEqual(v.device, 'CPU:0') + self.assertDeviceEqual(v.value().device, 'CPU:0') + self.assertEqual(clone.outputs.op.name, + 'LogisticClassifier/fully_connected/Sigmoid') + self.assertEqual(clone.scope, '') + self.assertDeviceEqual(clone.device, 'GPU:0') + self.assertEqual(len(slim.losses.get_losses()), 1) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(update_ops, []) + + def testCreateSingleclone(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + clone = clones[0] + self.assertEqual(len(slim.get_variables()), 5) + for v in slim.get_variables(): + self.assertDeviceEqual(v.device, 'CPU:0') + self.assertDeviceEqual(v.value().device, 'CPU:0') + self.assertEqual(clone.outputs.op.name, + 'BatchNormClassifier/fully_connected/Sigmoid') + self.assertEqual(clone.scope, '') + self.assertDeviceEqual(clone.device, 'GPU:0') + self.assertEqual(len(slim.losses.get_losses()), 1) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), 2) + + def testCreateMulticlone(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + num_clones = 4 + deploy_config = model_deploy.DeploymentConfig(num_clones=num_clones) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(slim.get_variables()), 5) + for v in slim.get_variables(): + self.assertDeviceEqual(v.device, 'CPU:0') + self.assertDeviceEqual(v.value().device, 'CPU:0') + self.assertEqual(len(clones), num_clones) + for i, clone in enumerate(clones): + self.assertEqual( + clone.outputs.op.name, + 'clone_%d/BatchNormClassifier/fully_connected/Sigmoid' % i) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, clone.scope) + self.assertEqual(len(update_ops), 2) + self.assertEqual(clone.scope, 'clone_%d/' % i) + self.assertDeviceEqual(clone.device, 'GPU:%d' % i) + + def testCreateOnecloneWithPS(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1, + num_ps_tasks=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(clones), 1) + clone = clones[0] + self.assertEqual(clone.outputs.op.name, + 'BatchNormClassifier/fully_connected/Sigmoid') + self.assertDeviceEqual(clone.device, '/job:worker/device:GPU:0') + self.assertEqual(clone.scope, '') + self.assertEqual(len(slim.get_variables()), 5) + for v in slim.get_variables(): + self.assertDeviceEqual(v.device, '/job:ps/task:0/CPU:0') + self.assertDeviceEqual(v.device, v.value().device) + + def testCreateMulticloneWithPS(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=2, + num_ps_tasks=2) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(slim.get_variables()), 5) + for i, v in enumerate(slim.get_variables()): + t = i % 2 + self.assertDeviceEqual(v.device, '/job:ps/task:%d/device:CPU:0' % t) + self.assertDeviceEqual(v.device, v.value().device) + self.assertEqual(len(clones), 2) + for i, clone in enumerate(clones): + self.assertEqual( + clone.outputs.op.name, + 'clone_%d/BatchNormClassifier/fully_connected/Sigmoid' % i) + self.assertEqual(clone.scope, 'clone_%d/' % i) + self.assertDeviceEqual(clone.device, '/job:worker/device:GPU:%d' % i) + + +class OptimizeclonesTest(tf.test.TestCase): + + def setUp(self): + # Create an easy training set: + np.random.seed(0) + + self._inputs = np.zeros((16, 4)) + self._labels = np.random.randint(0, 2, size=(16, 1)).astype(np.float32) + self._logdir = self.get_temp_dir() + + for i in range(16): + j = int(2 * self._labels[i] + np.random.randint(0, 2)) + self._inputs[i, j] = 1 + + def testCreateLogisticClassifier(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = LogisticClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(slim.get_variables()), 2) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(update_ops, []) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + total_loss, grads_and_vars = model_deploy.optimize_clones(clones, + optimizer) + self.assertEqual(len(grads_and_vars), len(tf.trainable_variables())) + self.assertEqual(total_loss.op.name, 'total_loss') + for g, v in grads_and_vars: + self.assertDeviceEqual(g.device, 'GPU:0') + self.assertDeviceEqual(v.device, 'CPU:0') + + def testCreateSingleclone(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(slim.get_variables()), 5) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), 2) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + total_loss, grads_and_vars = model_deploy.optimize_clones(clones, + optimizer) + self.assertEqual(len(grads_and_vars), len(tf.trainable_variables())) + self.assertEqual(total_loss.op.name, 'total_loss') + for g, v in grads_and_vars: + self.assertDeviceEqual(g.device, 'GPU:0') + self.assertDeviceEqual(v.device, 'CPU:0') + + def testCreateMulticlone(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + clone_args = (tf_inputs, tf_labels) + num_clones = 4 + deploy_config = model_deploy.DeploymentConfig(num_clones=num_clones) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, clone_args) + self.assertEqual(len(slim.get_variables()), 5) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), num_clones * 2) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + total_loss, grads_and_vars = model_deploy.optimize_clones(clones, + optimizer) + self.assertEqual(len(grads_and_vars), len(tf.trainable_variables())) + self.assertEqual(total_loss.op.name, 'total_loss') + for g, v in grads_and_vars: + self.assertDeviceEqual(g.device, '') + self.assertDeviceEqual(v.device, 'CPU:0') + + def testCreateMulticloneCPU(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + model_args = (tf_inputs, tf_labels) + num_clones = 4 + deploy_config = model_deploy.DeploymentConfig(num_clones=num_clones, + clone_on_cpu=True) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, model_args) + self.assertEqual(len(slim.get_variables()), 5) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), num_clones * 2) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + total_loss, grads_and_vars = model_deploy.optimize_clones(clones, + optimizer) + self.assertEqual(len(grads_and_vars), len(tf.trainable_variables())) + self.assertEqual(total_loss.op.name, 'total_loss') + for g, v in grads_and_vars: + self.assertDeviceEqual(g.device, '') + self.assertDeviceEqual(v.device, 'CPU:0') + + def testCreateOnecloneWithPS(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + model_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=1, + num_ps_tasks=1) + + self.assertEqual(slim.get_variables(), []) + clones = model_deploy.create_clones(deploy_config, model_fn, model_args) + self.assertEqual(len(slim.get_variables()), 5) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), 2) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + total_loss, grads_and_vars = model_deploy.optimize_clones(clones, + optimizer) + self.assertEqual(len(grads_and_vars), len(tf.trainable_variables())) + self.assertEqual(total_loss.op.name, 'total_loss') + for g, v in grads_and_vars: + self.assertDeviceEqual(g.device, '/job:worker/device:GPU:0') + self.assertDeviceEqual(v.device, '/job:ps/task:0/CPU:0') + + +class DeployTest(tf.test.TestCase): + + def setUp(self): + # Create an easy training set: + np.random.seed(0) + + self._inputs = np.zeros((16, 4)) + self._labels = np.random.randint(0, 2, size=(16, 1)).astype(np.float32) + self._logdir = self.get_temp_dir() + + for i in range(16): + j = int(2 * self._labels[i] + np.random.randint(0, 2)) + self._inputs[i, j] = 1 + + def _addBesselsCorrection(self, sample_size, expected_var): + correction_factor = sample_size / (sample_size - 1) + expected_var *= correction_factor + return expected_var + + def testLocalTrainOp(self): + g = tf.Graph() + with g.as_default(): + tf.set_random_seed(0) + tf_inputs = tf.constant(self._inputs, dtype=tf.float32) + tf_labels = tf.constant(self._labels, dtype=tf.float32) + + model_fn = BatchNormClassifier + model_args = (tf_inputs, tf_labels) + deploy_config = model_deploy.DeploymentConfig(num_clones=2, + clone_on_cpu=True) + + optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) + + self.assertEqual(slim.get_variables(), []) + model = model_deploy.deploy(deploy_config, model_fn, model_args, + optimizer=optimizer) + + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + self.assertEqual(len(update_ops), 4) + self.assertEqual(len(model.clones), 2) + self.assertEqual(model.total_loss.op.name, 'total_loss') + self.assertEqual(model.summary_op.op.name, 'summary_op/summary_op') + self.assertEqual(model.train_op.op.name, 'train_op') + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + moving_mean = contrib_framework.get_variables_by_name('moving_mean')[0] + moving_variance = contrib_framework.get_variables_by_name( + 'moving_variance')[0] + initial_loss = sess.run(model.total_loss) + initial_mean, initial_variance = sess.run([moving_mean, + moving_variance]) + self.assertAllClose(initial_mean, [0.0, 0.0, 0.0, 0.0]) + self.assertAllClose(initial_variance, [1.0, 1.0, 1.0, 1.0]) + for _ in range(10): + sess.run(model.train_op) + final_loss = sess.run(model.total_loss) + self.assertLess(final_loss, initial_loss / 5.0) + + final_mean, final_variance = sess.run([moving_mean, + moving_variance]) + expected_mean = np.array([0.125, 0.25, 0.375, 0.25]) + expected_var = np.array([0.109375, 0.1875, 0.234375, 0.1875]) + expected_var = self._addBesselsCorrection(16, expected_var) + self.assertAllClose(final_mean, expected_mean) + self.assertAllClose(final_variance, expected_var) + + def testNoSummariesOnGPU(self): + with tf.Graph().as_default(): + deploy_config = model_deploy.DeploymentConfig(num_clones=2) + + # clone function creates a fully_connected layer with a regularizer loss. + def ModelFn(): + inputs = tf.constant(1.0, shape=(10, 20), dtype=tf.float32) + reg = contrib_layers.l2_regularizer(0.001) + contrib_layers.fully_connected(inputs, 30, weights_regularizer=reg) + + model = model_deploy.deploy( + deploy_config, ModelFn, + optimizer=tf.train.GradientDescentOptimizer(1.0)) + # The model summary op should have a few summary inputs and all of them + # should be on the CPU. + self.assertTrue(model.summary_op.op.inputs) + for inp in model.summary_op.op.inputs: + self.assertEqual('/device:CPU:0', inp.device) + + def testNoSummariesOnGPUForEvals(self): + with tf.Graph().as_default(): + deploy_config = model_deploy.DeploymentConfig(num_clones=2) + + # clone function creates a fully_connected layer with a regularizer loss. + def ModelFn(): + inputs = tf.constant(1.0, shape=(10, 20), dtype=tf.float32) + reg = contrib_layers.l2_regularizer(0.001) + contrib_layers.fully_connected(inputs, 30, weights_regularizer=reg) + + # No optimizer here, it's an eval. + model = model_deploy.deploy(deploy_config, ModelFn) + # The model summary op should have a few summary inputs and all of them + # should be on the CPU. + self.assertTrue(model.summary_op.op.inputs) + for inp in model.summary_op.op.inputs: + self.assertEqual('/device:CPU:0', inp.device) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/download_and_convert_data.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/download_and_convert_data.py new file mode 100644 index 0000000..e935780 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/download_and_convert_data.py @@ -0,0 +1,94 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Downloads and converts a particular dataset. + +Usage: +```shell + +$ python download_and_convert_data.py \ + --dataset_name=flowers \ + --dataset_dir=/tmp/flowers + +$ python download_and_convert_data.py \ + --dataset_name=cifar10 \ + --dataset_dir=/tmp/cifar10 + +$ python download_and_convert_data.py \ + --dataset_name=mnist \ + --dataset_dir=/tmp/mnist + +$ python download_and_convert_data.py \ + --dataset_name=visualwakewords \ + --dataset_dir=/tmp/visualwakewords + +``` +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from datasets import download_and_convert_cifar10 +from datasets import download_and_convert_flowers +from datasets import download_and_convert_mnist +from datasets import download_and_convert_visualwakewords + +FLAGS = tf.compat.v1.app.flags.FLAGS + +tf.compat.v1.app.flags.DEFINE_string( + 'dataset_name', + None, + 'The name of the dataset to convert, one of "flowers", "cifar10", "mnist", "visualwakewords"' + ) + +tf.compat.v1.app.flags.DEFINE_string( + 'dataset_dir', + None, + 'The directory where the output TFRecords and temporary files are saved.') + +tf.flags.DEFINE_float( + 'small_object_area_threshold', 0.005, + 'For --dataset_name=visualwakewords only. Threshold of fraction of image ' + 'area below which small objects are filtered') + +tf.flags.DEFINE_string( + 'foreground_class_of_interest', 'person', + 'For --dataset_name=visualwakewords only. Build a binary classifier based ' + 'on the presence or absence of this object in the image.') + + +def main(_): + if not FLAGS.dataset_name: + raise ValueError('You must supply the dataset name with --dataset_name') + if not FLAGS.dataset_dir: + raise ValueError('You must supply the dataset directory with --dataset_dir') + + if FLAGS.dataset_name == 'flowers': + download_and_convert_flowers.run(FLAGS.dataset_dir) + elif FLAGS.dataset_name == 'cifar10': + download_and_convert_cifar10.run(FLAGS.dataset_dir) + elif FLAGS.dataset_name == 'mnist': + download_and_convert_mnist.run(FLAGS.dataset_dir) + elif FLAGS.dataset_name == 'visualwakewords': + download_and_convert_visualwakewords.run( + FLAGS.dataset_dir, FLAGS.small_object_area_threshold, + FLAGS.foreground_class_of_interest) + else: + raise ValueError( + 'dataset_name [%s] was not recognized.' % FLAGS.dataset_name) + +if __name__ == '__main__': + tf.compat.v1.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/env.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/env.py new file mode 100644 index 0000000..6e5fa0e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/env.py @@ -0,0 +1,182 @@ +import tensorflow as tf +from time import gmtime, strftime +from tensorflow.contrib import slim as contrib_slim +from gpu_helper import get_custom_getter +import random +import numpy as np +import os + +np.random.seed(0) +random.seed(0) +tf.set_random_seed(0) + + +class Env: + def __init__(self, FLAGS): + self.FLAGS = FLAGS + + self.slim = contrib_slim + self.num_samples = 1281167 + + def _configure_optimizer(self, learning_rate): + """Configures the optimizer used for training. + + Args: + learning_rate: A scalar or `Tensor` learning rate. + + Returns: + An instance of an optimizer. + + Raises: + ValueError: if Initializer.FLAGS.optimizer is not recognized. + """ + if self.FLAGS.optimizer == 'adadelta': + optimizer = tf.train.AdadeltaOptimizer( + learning_rate, + rho=self.FLAGS.adadelta_rho, + epsilon=self.FLAGS.opt_epsilon) + elif self.FLAGS.optimizer == 'adagrad': + optimizer = tf.train.AdagradOptimizer( + learning_rate, + initial_accumulator_value=self.FLAGS.adagrad_initial_accumulator_value) + elif self.FLAGS.optimizer == 'adam': + optimizer = tf.train.AdamOptimizer( + learning_rate, + beta1=self.FLAGS.adam_beta1, + beta2=self.FLAGS.adam_beta2, + epsilon=self.FLAGS.opt_epsilon) + elif self.FLAGS.optimizer == 'ftrl': + optimizer = tf.train.FtrlOptimizer( + learning_rate, + learning_rate_power=self.FLAGS.ftrl_learning_rate_power, + initial_accumulator_value=self.FLAGS.ftrl_initial_accumulator_value, + l1_regularization_strength=self.FLAGS.ftrl_l1, + l2_regularization_strength=self.FLAGS.ftrl_l2) + elif self.FLAGS.optimizer == 'momentum': + optimizer = tf.train.MomentumOptimizer( + learning_rate, + momentum=self.FLAGS.momentum, + name='Momentum') + elif self.FLAGS.optimizer == 'rmsprop': + optimizer = tf.train.RMSPropOptimizer( + learning_rate, + decay=self.FLAGS.rmsprop_decay, + momentum=self.FLAGS.rmsprop_momentum, + epsilon=self.FLAGS.opt_epsilon) + elif self.FLAGS.optimizer == 'sgd': + optimizer = tf.train.GradientDescentOptimizer(learning_rate) + else: + raise ValueError('Optimizer [%s] was not recognized' % self.FLAGS.optimizer) + + return optimizer + + def create_logdir(self): + logdir = "results" + os.makedirs(logdir, exist_ok=True) + return logdir + + def calc_logits(self, network_fn, images): + logits, end_points = network_fn(images, reuse=tf.AUTO_REUSE) + return logits + + def calc_loss(self, logits_train, labels_train): + base_loss = self.slim.losses.softmax_cross_entropy( + logits_train, labels_train, label_smoothing=self.FLAGS.label_smoothing, weights=1.0) + + reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + total_loss = tf.add_n([base_loss] + reg_losses, name='total_loss') + + loss = tf.add_n([base_loss]) + loss = tf.identity(loss, name='loss') + + return loss, total_loss + + def calc_steps_per_epoch(self): + return self.num_samples // (self.FLAGS.batch_size * int(os.getenv('RANK_SIZE'))) + + def _configure_learning_rate(self, global_step): + steps_per_epoch = self.calc_steps_per_epoch() + decay_steps = int(steps_per_epoch * self.FLAGS.num_epochs_per_decay) + + if self.FLAGS.learning_rate_decay_type == 'exponential': + learning_rate = tf.train.exponential_decay( + self.FLAGS.learning_rate, + global_step, + decay_steps, + self.FLAGS.learning_rate_decay_factor, + staircase=True, + name='exponential_decay_learning_rate') + elif self.FLAGS.learning_rate_decay_type == 'fixed': + learning_rate = tf.constant(self.FLAGS.learning_rate, name='fixed_learning_rate') + elif self.FLAGS.learning_rate_decay_type == 'cosine_annealing': + current_step_epoch = global_step // steps_per_epoch * steps_per_epoch + learning_rate = tf.train.cosine_decay(self.FLAGS.learning_rate, current_step_epoch, + self.FLAGS.max_number_of_steps) + elif self.FLAGS.learning_rate_decay_type == 'polynomial': + learning_rate = tf.train.polynomial_decay( + self.FLAGS.learning_rate, global_step, + decay_steps, + self.FLAGS.end_learning_rate, + power=1.0, + cycle=False, + name='polynomial_decay_learning_rate') + else: + raise ValueError('learning_rate_decay_type [%s] was not recognized' % + self.FLAGS.learning_rate_decay_type) + + if self.FLAGS.warmup_epochs: + warmup_lr = ( + self.FLAGS.learning_rate * tf.cast(global_step, tf.float32) / + (steps_per_epoch * self.FLAGS.warmup_epochs)) + learning_rate = tf.minimum(warmup_lr, learning_rate) + + learning_rate = tf.identity(learning_rate, name='learning_rate') + # tf.Print(learning_rate, [learning_rate], '*****************') + return learning_rate + + def create_train_op(self, global_step, summaries, loss): + # Gather update_ops from the first clone. These contain, for example, + # the updates for the batch_norm variables created by network_fn. + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + + ################################# + # Configure the moving averages # + ################################# + if self.FLAGS.moving_average_decay: + moving_average_variables = self.slim.get_model_variables() + variable_averages = tf.train.ExponentialMovingAverage( + self.FLAGS.moving_average_decay, global_step) + else: + moving_average_variables, variable_averages = None, None + + ######################################### + # Configure the optimization procedure. # + ######################################### + learning_rate = self._configure_learning_rate(global_step) + summaries.add(tf.summary.scalar('learning_rate', learning_rate)) + + if self.FLAGS.moving_average_decay: + # Update ops executed locally by trainer. + update_ops.append(variable_averages.apply(moving_average_variables)) + + opt = self._configure_optimizer(learning_rate) + + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + from npu_bridge.estimator.npu.npu_loss_scale_optimizer import NPULossScaleOptimizer + from npu_bridge.estimator.npu.npu_loss_scale_manager import FixedLossScaleManager + from npu_bridge.estimator.npu.npu_loss_scale_manager import ExponentialUpdateLossScaleManager + loss_scale_manager = FixedLossScaleManager(loss_scale=4096) + # loss_scale_manager = ExponentialUpdateLossScaleManager(init_loss_scale=1024, incr_every_n_steps=1000, decr_every_n_nan_or_inf=2, decr_ratio=0.5) + if int(os.getenv('RANK_SIZE')) == 1: + opt = NPULossScaleOptimizer(opt, loss_scale_manager) + else: + opt = NPULossScaleOptimizer(opt, loss_scale_manager, is_distributed=True) + opt = NPUDistributedOptimizer(opt) + + update_op = tf.group(*update_ops) + with tf.control_dependencies([update_op]): + gate_gradients = (tf.train.Optimizer.GATE_NONE) + grads_and_vars = opt.compute_gradients(loss) + train_op = opt.apply_gradients(grads_and_vars, global_step=global_step) + + return train_op diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/estimator_impl.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/estimator_impl.py new file mode 100644 index 0000000..1d981ea --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/estimator_impl.py @@ -0,0 +1,133 @@ +import tensorflow as tf +from dataloader import data_provider +from datasets import dataset_factory +from nets import nets_factory +import os + + +class EstimatorImpl: + def __init__(self, env): + self.env = env + + def model_fn(self, features, labels, mode, params): + num_classes = 1001 + + summaries = set(tf.get_collection(tf.GraphKeys.SUMMARIES)) + + if mode == tf.estimator.ModeKeys.TRAIN: + network_fn = nets_factory.get_network_fn( + self.env.FLAGS.model_name, + num_classes=(num_classes - self.env.FLAGS.labels_offset), + weight_decay=self.env.FLAGS.weight_decay, + is_training=True) + + logits = self.env.calc_logits(network_fn, features) + loss, total_loss = self.env.calc_loss(logits, labels) + + # ### accuracy ### # + predictions = tf.argmax(logits, 1) + accuracy_ops = tf.metrics.accuracy(tf.argmax(labels, 1), predictions) + tf.identity(accuracy_ops[1], name='train_accuracy') + # ### accuracy ### # + + tf.identity(total_loss, 'train_loss') + + global_step = tf.train.get_or_create_global_step() + train_op = self.env.create_train_op(global_step, summaries, total_loss) + + estimator_spec = tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.TRAIN, loss=total_loss, train_op=train_op) + + elif mode == tf.estimator.ModeKeys.EVAL: + network_fn = nets_factory.get_network_fn( + self.env.FLAGS.model_name, + num_classes=(num_classes - self.env.FLAGS.labels_offset), + weight_decay=self.env.FLAGS.weight_decay, + is_training=False) + + logits = self.env.calc_logits(network_fn, features) + loss, total_loss = self.env.calc_loss(logits, labels) + predictions = tf.argmax(logits, 1) + accuracy_ops = tf.metrics.accuracy(tf.argmax(labels, 1), predictions) + tf.identity(accuracy_ops[1], name='eval_accuracy') + estimator_spec = tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.EVAL, + loss=total_loss, eval_metric_ops={'accuracy': accuracy_ops}) + + return estimator_spec + + def main(self): + logdir = self.env.create_logdir() + + from logger import LogSessionRunHook + + config = { + 'num_training_samples': self.env.num_samples, + # for 1p, just per loop print, for 8p, print each epoch + 'display_every': 1, + 'log_name': 'train_log.log', + 'log_dir': logdir, + 'global_batch_size': self.env.FLAGS.batch_size * int(os.getenv('RANK_SIZE')), + 'iterations_per_loop': self.env.FLAGS.iterations_per_loop if self.env.FLAGS.iterations_per_loop is not None else self.env.calc_steps_per_epoch() + } + + hooks = [LogSessionRunHook(config, warmup_steps=self.env.FLAGS.warmup_epochs * self.env.calc_steps_per_epoch())] + + ################################################################# + from npu_bridge.estimator.npu.npu_config import NPURunConfig + from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + + self.estimator_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True) + + self.estimator_config.gpu_options.allow_growth = True + + gpu_thread_count = 2 + os.environ['TF_GPU_THREAD_MODE'] = 'gpu_private' + os.environ['TF_GPU_THREAD_COUNT'] = str(gpu_thread_count) + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1' + + run_config = NPURunConfig( + hcom_parallel=True, + precision_mode="allow_mix_precision", + enable_data_pre_proc=True, + save_checkpoints_steps=self.env.calc_steps_per_epoch(), + session_config=self.estimator_config, + model_dir=logdir, + iterations_per_loop=config['iterations_per_loop'], + keep_checkpoint_max=5) + + classifier = NPUEstimator( + model_fn=self.model_fn, + config=run_config + ) + ################################################################### + + classifier.train( + input_fn=self.train_data, + max_steps=self.env.FLAGS.max_number_of_steps, + hooks=hooks, + ) + + def train_data(self): + dataset = dataset_factory.get_dataset(self.env.FLAGS.dataset_name, 'train', self.env.FLAGS.dataset_dir) + + preprocessing_name = self.env.FLAGS.preprocessing_name or self.env.FLAGS.model_name + _, ds = data_provider.get_data(dataset, self.env.FLAGS.batch_size, + dataset.num_classes, self.env.FLAGS.labels_offset, True, + preprocessing_name, self.env.FLAGS.use_grayscale) + + return ds + + def eval_data(self): + dataset = dataset_factory.get_dataset(self.env.FLAGS.dataset_name, 'validation', self.env.FLAGS.dataset_dir) + + preprocessing_name = self.env.FLAGS.preprocessing_name or self.env.FLAGS.model_name + _, ds = data_provider.get_data(dataset, self.env.FLAGS.batch_size, + dataset.num_classes, self.env.FLAGS.labels_offset, False, + preprocessing_name, self.env.FLAGS.use_grayscale) + + return ds diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier.py new file mode 100644 index 0000000..9a2b25b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier.py @@ -0,0 +1,174 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Generic evaluation script that evaluates a model using a given dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import tensorflow as tf +from tensorflow.contrib import quantize as contrib_quantize +from tensorflow.contrib import slim as contrib_slim +from benchmark_log import hwlog +from datasets import dataset_factory +from nets import nets_factory +import os +os.environ["CUDA_VISIBLE_DEVICES"] = '4' + +slim = contrib_slim + +tf.app.flags.DEFINE_integer( + 'batch_size', 100, 'The number of samples in each batch.') + +tf.app.flags.DEFINE_integer( + 'max_num_batches', None, + 'Max number of batches to evaluate by default use all.') + +tf.app.flags.DEFINE_string( + 'master', '', 'The address of the TensorFlow master to use.') + +ckpt_path = './results/0526023335_train_hvdTrue_mnmobilenet_v2_augmentedTrue_mixedpFalse_lr0.4_optmomentum_me200_lrdtcosine_annealing_nepd0.3125_lrdf0.98_b256_me_param' +# ckpt_path = './results/0523130615_train_hvdTrue_mnmobilenet_v2_augmentedTrue_mixedpFalse_lr0.4_optmomentum_me200_lrdtcosine_annealing_nepd0.3125_lrdf0.98_b256_me_param' +tf.app.flags.DEFINE_string( + 'checkpoint_path', ckpt_path, + 'The directory where the model was written to or an absolute path to a ' + 'checkpoint file.') + +tf.app.flags.DEFINE_string( + 'eval_dir', ckpt_path, 'Directory where the results are saved to.') + +tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') + +tf.app.flags.DEFINE_string( + 'dataset_name', 'imagenet', 'The name of the dataset to load.') + +tf.app.flags.DEFINE_string( + 'dataset_split_name', 'validation', 'The name of the train/test split.') + +tf.app.flags.DEFINE_string( + 'dataset_dir', '/data/Datasets/imagenet_TF', 'The directory where the dataset files are stored.') + +tf.app.flags.DEFINE_integer( + 'labels_offset', 0, + 'An offset for the labels in the dataset. This flag is primarily used to ' + 'evaluate the VGG and ResNet architectures which do not use a background ' + 'class for the ImageNet dataset.') + +tf.app.flags.DEFINE_string( + 'model_name', 'mobilenet_v2', 'The name of the architecture to evaluate.') + +tf.app.flags.DEFINE_string( + 'preprocessing_name', None, 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') + +tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + +tf.app.flags.DEFINE_integer( + 'eval_image_size', None, 'Eval image size') + +tf.app.flags.DEFINE_bool( + 'quantize', False, 'whether to use quantized graph or not.') + +tf.app.flags.DEFINE_bool('use_grayscale', False, + 'Whether to convert input images to grayscale.') + +FLAGS = tf.app.flags.FLAGS + + +def main(_): + if not FLAGS.dataset_dir: + raise ValueError('You must supply the dataset directory with --dataset_dir') + + tf.logging.set_verbosity(tf.logging.INFO) + with tf.Graph().as_default(): + tf_global_step = slim.get_or_create_global_step() + + ###################### + # Select the dataset # + ###################### + dataset = dataset_factory.get_dataset( + FLAGS.dataset_name, FLAGS.dataset_split_name, FLAGS.dataset_dir) + + #################### + # Select the model # + #################### + network_fn = nets_factory.get_network_fn( + FLAGS.model_name, + num_classes=(dataset.num_classes - FLAGS.labels_offset), + is_training=False) + + from dataloader import data_provider + preprocessing_name = FLAGS.preprocessing_name or FLAGS.model_name + iterator, _ = data_provider.get_data(dataset, FLAGS.batch_size, + dataset.num_classes, FLAGS.labels_offset, is_training=False, + preprocessing_name=preprocessing_name, + use_grayscale=FLAGS.use_grayscale, + hvd=None, enable_hvd=None) + images, labels = iterator.get_next() # label: [100, 1001] + images = tf.reshape(images, [FLAGS.batch_size, 224, 224, 3]) # (100, 224, 224, 3), float32 + labels = tf.argmax(labels, axis=1) # [100] + logits, _ = network_fn(images) + + if FLAGS.quantize: + contrib_quantize.create_eval_graph() + + predictions = tf.argmax(logits, 1) + labels = tf.squeeze(labels) + eval_accuracy, metric_update_op = tf.metrics.accuracy(labels, predictions) + + # tf.summary.scalar('top1_acc', top1_accu) + # summaries_op = tf.summary.merge_all() + + # TODO(sguada) use num_epochs=1 + if FLAGS.max_num_batches: + num_batches = FLAGS.max_num_batches + else: + # This ensures that we make a single pass over all of the data. + num_batches = math.ceil(dataset.num_samples / float(FLAGS.batch_size)) + if tf.gfile.IsDirectory(FLAGS.checkpoint_path): + checkpoint_path = tf.train.latest_checkpoint(FLAGS.checkpoint_path) + else: + checkpoint_path = FLAGS.checkpoint_path + + ##### evaluate ##### + tf.logging.info('Evaluating %s' % checkpoint_path) + saver = tf.train.Saver() + from time import gmtime, strftime + logdir = "results/%s" % strftime("%m%d%H%M%S_evel", gmtime()) + # summary_writer = tf.summary.FileWriter(logdir=logdir, graph=tf.get_default_graph()) + with tf.Session() as sess: + sess.run(iterator.initializer) + sess.run(tf.global_variables_initializer()) + sess.run(tf.local_variables_initializer()) + saver.restore(sess, f'{checkpoint_path}') + tf.train.write_graph(sess.graph, logdir, 'graph.pbtxt') + + for step in range(num_batches): + _metric_update_op = sess.run([metric_update_op]) + print(f'{step}, _metric_update_op: {_metric_update_op}') + + acc = sess.run([eval_accuracy]) + print(f'acc: {acc}') + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=f'{acc}') + + +if __name__ == '__main__': + tf.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier_mobilenet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier_mobilenet.py new file mode 100644 index 0000000..fc46e4a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/eval_image_classifier_mobilenet.py @@ -0,0 +1,181 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Generic evaluation script that evaluates a model using a given dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import tensorflow as tf +from tensorflow.contrib import quantize as contrib_quantize +from tensorflow.contrib import slim as contrib_slim + +from datasets import dataset_factory +from nets import nets_factory +from benchmark_log import hwlog +import os +os.environ["CUDA_VISIBLE_DEVICES"] = '4' + +slim = contrib_slim + +tf.app.flags.DEFINE_integer( + 'batch_size', 256, 'The number of samples in each batch.') + +tf.app.flags.DEFINE_integer( + 'max_num_batches', None, + 'Max number of batches to evaluate by default use all.') + +tf.app.flags.DEFINE_string( + 'master', '', 'The address of the TensorFlow master to use.') + +tf.app.flags.DEFINE_string( + 'checkpoint_path', 'ckpt_path', + 'The directory where the model was written to or an absolute path to a ' + 'checkpoint file.') + +tf.app.flags.DEFINE_string( + 'eval_dir', 'ckpt_path', 'Directory where the results are saved to.') + +tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') + +tf.app.flags.DEFINE_string( + 'dataset_name', 'imagenet', 'The name of the dataset to load.') + +tf.app.flags.DEFINE_string( + 'dataset_split_name', 'validation', 'The name of the train/test split.') + +tf.app.flags.DEFINE_string( + 'dataset_dir', '/opt/npu/slimImagenet', 'The directory where the dataset files are stored.') + +tf.app.flags.DEFINE_integer( + 'labels_offset', 0, + 'An offset for the labels in the dataset. This flag is primarily used to ' + 'evaluate the VGG and ResNet architectures which do not use a background ' + 'class for the ImageNet dataset.') + +tf.app.flags.DEFINE_string( + 'model_name', 'mobilenet_v2', 'The name of the architecture to evaluate.') + +tf.app.flags.DEFINE_string( + 'preprocessing_name', None, 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') + +tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + +tf.app.flags.DEFINE_integer( + 'eval_image_size', None, 'Eval image size') + +tf.app.flags.DEFINE_bool( + 'quantize', False, 'whether to use quantized graph or not.') + +tf.app.flags.DEFINE_bool('use_grayscale', False, + 'Whether to convert input images to grayscale.') + +FLAGS = tf.app.flags.FLAGS + + +def main(_): + if not FLAGS.dataset_dir: + raise ValueError('You must supply the dataset directory with --dataset_dir') + + tf.logging.set_verbosity(tf.logging.INFO) + with tf.Graph().as_default(): + tf_global_step = slim.get_or_create_global_step() + + ###################### + # Select the dataset # + ###################### + dataset = dataset_factory.get_dataset( + FLAGS.dataset_name, FLAGS.dataset_split_name, FLAGS.dataset_dir) + + #################### + # Select the model # + #################### + network_fn = nets_factory.get_network_fn( + FLAGS.model_name, + num_classes=(dataset.num_classes - FLAGS.labels_offset), + is_training=False) + + from dataloader import data_provider + preprocessing_name = FLAGS.preprocessing_name or FLAGS.model_name + + iterator, _ = data_provider.get_data(dataset, FLAGS.batch_size, + dataset.num_classes, FLAGS.labels_offset, is_training=False, + preprocessing_name=preprocessing_name, + use_grayscale=FLAGS.use_grayscale) + #tf.logging.info('iterator %s' % iterator) + images, labels = iterator.get_next() # label: [100, 1001] + images = tf.reshape(images, [FLAGS.batch_size, 224, 224, 3]) # (100, 224, 224, 3), float32 + labels = tf.argmax(labels, axis=1) # [100] + logits, _ = network_fn(images) + + if FLAGS.quantize: + contrib_quantize.create_eval_graph() + + predictions = tf.argmax(logits, 1) + labels = tf.squeeze(labels) + eval_accuracy, metric_update_op = tf.metrics.accuracy(labels, predictions) + #hwlog.remark_print(key=hwlog.EVAL_ACCURACY, value="".format(eval_accuracy)) + + # tf.summary.scalar('top1_acc', top1_accu) + # summaries_op = tf.summary.merge_all() + + # TODO(sguada) use num_epochs=1 + if FLAGS.max_num_batches: + num_batches = FLAGS.max_num_batches + else: + # This ensures that we make a single pass over all of the data. + num_batches = math.ceil(dataset.num_samples / float(FLAGS.batch_size)) - 1 + + if tf.gfile.IsDirectory(FLAGS.checkpoint_path): + checkpoint_path = tf.train.latest_checkpoint(FLAGS.checkpoint_path) + else: + checkpoint_path = FLAGS.checkpoint_path + # checkpoint_path = '/opt/npu/models/mobilenetv2_v0.1/ckpt/model.ckpt' + print(dataset.num_samples) + print(FLAGS.batch_size) + hwlog.remark_print(key=hwlog.GLOBAL_BATCH_SIZE, value=FLAGS.batch_size) + ##### evaluate ##### + tf.logging.info('Evaluating %s' % checkpoint_path) + saver = tf.train.Saver() + from time import gmtime, strftime + logdir = "ckpt/%s" % strftime("%m%d%H%M%S_evel", gmtime()) + # summary_writer = tf.summary.FileWriter(logdir=logdir, graph=tf.get_default_graph()) + with tf.Session() as sess: + sess.run(iterator.initializer) + sess.run(tf.global_variables_initializer()) + sess.run(tf.local_variables_initializer()) + saver.restore(sess, f'{checkpoint_path}') + # saver.restore(sess, 'result/8p/2/results/model.ckpt-3750') + tf.train.write_graph(sess.graph, logdir, 'graph.pbtxt') + + for step in range(num_batches): + _metric_update_op = sess.run([metric_update_op]) + print(f'{step}, _metric_update_op: {_metric_update_op}') + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=f'{step}') + hwlog.remark_print(key=hwlog.EVAL_ACCURACY, value=f'{_metric_update_op}') + acc = sess.run([eval_accuracy]) + print(f'acc: {acc}') + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=f'{acc}') + + +if __name__ == '__main__': + tf.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph.py new file mode 100644 index 0000000..ba5fb1d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph.py @@ -0,0 +1,164 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Saves out a GraphDef containing the architecture of the model. + +To use it, run something like this, with a model name defined by slim: + +bazel build tensorflow_models/research/slim:export_inference_graph +bazel-bin/tensorflow_models/research/slim/export_inference_graph \ +--model_name=inception_v3 --output_file=/tmp/inception_v3_inf_graph.pb + +If you then want to use the resulting model with your own or pretrained +checkpoints as part of a mobile model, you can run freeze_graph to get a graph +def with the variables inlined as constants using: + +bazel build tensorflow/python/tools:freeze_graph +bazel-bin/tensorflow/python/tools/freeze_graph \ +--input_graph=/tmp/inception_v3_inf_graph.pb \ +--input_checkpoint=/tmp/checkpoints/inception_v3.ckpt \ +--input_binary=true --output_graph=/tmp/frozen_inception_v3.pb \ +--output_node_names=InceptionV3/Predictions/Reshape_1 + +The output node names will vary depending on the model, but you can inspect and +estimate them using the summarize_graph tool: + +bazel build tensorflow/tools/graph_transforms:summarize_graph +bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \ +--in_graph=/tmp/inception_v3_inf_graph.pb + +To run the resulting graph in C++, you can look at the label_image sample code: + +bazel build tensorflow/examples/label_image:label_image +bazel-bin/tensorflow/examples/label_image/label_image \ +--image=${HOME}/Pictures/flowers.jpg \ +--input_layer=input \ +--output_layer=InceptionV3/Predictions/Reshape_1 \ +--graph=/tmp/frozen_inception_v3.pb \ +--labels=/tmp/imagenet_slim_labels.txt \ +--input_mean=0 \ +--input_std=255 + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import os + +import tensorflow as tf +from tensorflow.contrib import quantize as contrib_quantize +from tensorflow.contrib import slim as contrib_slim + +from tensorflow.python.platform import gfile +from datasets import dataset_factory +from nets import nets_factory + + +slim = contrib_slim + +tf.app.flags.DEFINE_string( + 'model_name', 'inception_v3', 'The name of the architecture to save.') + +tf.app.flags.DEFINE_boolean( + 'is_training', False, + 'Whether to save out a training-focused version of the model.') + +tf.app.flags.DEFINE_integer( + 'image_size', None, + 'The image size to use, otherwise use the model default_image_size.') + +tf.app.flags.DEFINE_integer( + 'batch_size', None, + 'Batch size for the exported model. Defaulted to "None" so batch size can ' + 'be specified at model runtime.') + +tf.app.flags.DEFINE_string('dataset_name', 'imagenet', + 'The name of the dataset to use with the model.') + +tf.app.flags.DEFINE_integer( + 'labels_offset', 0, + 'An offset for the labels in the dataset. This flag is primarily used to ' + 'evaluate the VGG and ResNet architectures which do not use a background ' + 'class for the ImageNet dataset.') + +tf.app.flags.DEFINE_string( + 'output_file', '', 'Where to save the resulting file to.') + +tf.app.flags.DEFINE_string( + 'dataset_dir', '', 'Directory to save intermediate dataset files to') + +tf.app.flags.DEFINE_bool( + 'quantize', False, 'whether to use quantized graph or not.') + +tf.app.flags.DEFINE_bool( + 'is_video_model', False, 'whether to use 5-D inputs for video model.') + +tf.app.flags.DEFINE_integer( + 'num_frames', None, + 'The number of frames to use. Only used if is_video_model is True.') + +tf.app.flags.DEFINE_bool('write_text_graphdef', False, + 'Whether to write a text version of graphdef.') + +tf.app.flags.DEFINE_bool('use_grayscale', False, + 'Whether to convert input images to grayscale.') + +FLAGS = tf.app.flags.FLAGS + + +def main(_): + if not FLAGS.output_file: + raise ValueError('You must supply the path to save to with --output_file') + if FLAGS.is_video_model and not FLAGS.num_frames: + raise ValueError( + 'Number of frames must be specified for video models with --num_frames') + tf.logging.set_verbosity(tf.logging.INFO) + with tf.Graph().as_default() as graph: + dataset = dataset_factory.get_dataset(FLAGS.dataset_name, 'train', + FLAGS.dataset_dir) + network_fn = nets_factory.get_network_fn( + FLAGS.model_name, + num_classes=(dataset.num_classes - FLAGS.labels_offset), + is_training=FLAGS.is_training) + image_size = FLAGS.image_size or network_fn.default_image_size + num_channels = 1 if FLAGS.use_grayscale else 3 + if FLAGS.is_video_model: + input_shape = [ + FLAGS.batch_size, FLAGS.num_frames, image_size, image_size, + num_channels + ] + else: + input_shape = [FLAGS.batch_size, image_size, image_size, num_channels] + placeholder = tf.placeholder(name='input', dtype=tf.float32, + shape=input_shape) + network_fn(placeholder) + + if FLAGS.quantize: + contrib_quantize.create_eval_graph() + + graph_def = graph.as_graph_def() + if FLAGS.write_text_graphdef: + tf.io.write_graph( + graph_def, + os.path.dirname(FLAGS.output_file), + os.path.basename(FLAGS.output_file), + as_text=True) + else: + with gfile.GFile(FLAGS.output_file, 'wb') as f: + f.write(graph_def.SerializeToString()) + + +if __name__ == '__main__': + tf.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph_test.py new file mode 100644 index 0000000..42474f2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/export_inference_graph_test.py @@ -0,0 +1,44 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for export_inference_graph.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + + +import tensorflow as tf + +from tensorflow.python.platform import gfile +import export_inference_graph + + +class ExportInferenceGraphTest(tf.test.TestCase): + + def testExportInferenceGraph(self): + tmpdir = self.get_temp_dir() + output_file = os.path.join(tmpdir, 'inception_v3.pb') + flags = tf.app.flags.FLAGS + flags.output_file = output_file + flags.model_name = 'inception_v3' + flags.dataset_dir = tmpdir + export_inference_graph.main(None) + self.assertTrue(gfile.Exists(output_file)) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/gpu_helper.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/gpu_helper.py new file mode 100644 index 0000000..5dfaa5b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/gpu_helper.py @@ -0,0 +1,44 @@ +import tensorflow as tf +import numpy as np + +def float32_variable_storage_getter(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + +def get_custom_getter(compute_type): + return float32_variable_storage_getter if compute_type == tf.float16 else None + + + +def float32_variable_storage_getter_1(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + dtype = tf.float16 + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + +def get_custom_getter_1(compute_type): + return float32_variable_storage_getter_1 if compute_type == tf.float16 else None + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/logger.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/logger.py new file mode 100644 index 0000000..b5c583e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/logger.py @@ -0,0 +1,86 @@ +from __future__ import print_function + +import datetime +import logging +import os +import sys +import time +from benchmark_log import hwlog +import numpy as np +import tensorflow as tf + + +class LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, config, warmup_steps=5): + self.global_batch_size = config['global_batch_size'] + self.iterations_per_loop = config['iterations_per_loop'] + self.warmup_steps = warmup_steps + self.iter_times = [] + self.num_records = config['num_training_samples'] + self.display_every = config['display_every'] + self.logger = get_logger(config['log_name'], config['log_dir']) + rank0log(self.logger, 'PY' + str(sys.version) + 'TF' + str(tf.__version__)) + + def after_create_session(self, session, coord): + rank0log(self.logger, 'Step Epoch Speed Loss FinLoss LR') + self.elapsed_secs = 0. + self.count = 0 + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=[tf.train.get_global_step(), 'loss:0', 'total_loss:0', 'learning_rate:0', + 'train_accuracy:0']) + + def after_run(self, run_context, run_values): + batch_time = time.time() - self.t0 + self.iter_times.append(batch_time) + self.elapsed_secs += batch_time + self.count += 1 + global_step, loss, total_loss, lr, train_accuracy = run_values.results + if global_step == 1 or global_step % self.display_every == 0: + dt = self.elapsed_secs / self.count + img_per_sec = self.global_batch_size * self.iterations_per_loop / dt + epoch = global_step * self.global_batch_size / self.num_records + self.logger.info(f'step:{global_step} epoch:{epoch} ips:{img_per_sec} ' + f'loss:{loss} total_loss:{total_loss} lr:{lr}, ' + f'train_accuracy:{train_accuracy}') + + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=f"{global_step}") + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=f"{epoch}") + hwlog.remark_print(key=hwlog.TRAIN_ACCURACY, value=f"{train_accuracy}") + hwlog.remark_print(key=hwlog.FPS, value=f"{img_per_sec}") + self.elapsed_secs = 0. + self.count = 0 + + def get_average_speed(self): + avg_time = np.mean(self.iter_times[self.warmup_steps:]) + speed = self.global_batch_size / avg_time + return speed + + +def rank0log(logger, *args, **kwargs): + if logger: + logger.info(''.join([str(x) for x in list(args)])) + else: + print(*args, **kwargs) + + +def get_logger(log_name, log_dir): + logger = logging.getLogger(log_name) + logger.setLevel(logging.INFO) # INFO, ERROR + if not os.path.isdir(log_dir): + try: + os.makedirs(log_dir) + except FileExistsError: + pass + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + formatter = logging.Formatter('%(message)s') + ch.setFormatter(formatter) + logger.addHandler(ch) + fh = logging.FileHandler(os.path.join(log_dir, log_name)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(formatter) + logger.addHandler(fh) + return logger diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet.py new file mode 100644 index 0000000..12c04d4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet.py @@ -0,0 +1,148 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains a model definition for AlexNet. + +This work was first described in: + ImageNet Classification with Deep Convolutional Neural Networks + Alex Krizhevsky, Ilya Sutskever and Geoffrey E. Hinton + +and later refined in: + One weird trick for parallelizing convolutional neural networks + Alex Krizhevsky, 2014 + +Here we provide the implementation proposed in "One weird trick" and not +"ImageNet Classification", as per the paper, the LRN layers have been removed. + +Usage: + with slim.arg_scope(alexnet.alexnet_v2_arg_scope()): + outputs, end_points = alexnet.alexnet_v2(inputs) + +@@alexnet_v2 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) + + +def alexnet_v2_arg_scope(weight_decay=0.0005): + with slim.arg_scope([slim.conv2d, slim.fully_connected], + activation_fn=tf.nn.relu, + biases_initializer=tf.compat.v1.constant_initializer(0.1), + weights_regularizer=slim.l2_regularizer(weight_decay)): + with slim.arg_scope([slim.conv2d], padding='SAME'): + with slim.arg_scope([slim.max_pool2d], padding='VALID') as arg_sc: + return arg_sc + + +def alexnet_v2(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.5, + spatial_squeeze=True, + scope='alexnet_v2', + global_pool=False): + """AlexNet version 2. + + Described in: http://arxiv.org/pdf/1404.5997v2.pdf + Parameters from: + github.com/akrizhevsky/cuda-convnet2/blob/master/layers/ + layers-imagenet-1gpu.cfg + + Note: All the fully_connected layers have been transformed to conv2d layers. + To use in classification mode, resize input to 224x224 or set + global_pool=True. To use in fully convolutional mode, set + spatial_squeeze to false. + The LRN layers have been removed and change the initializers from + random_normal_initializer to xavier_initializer. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: the number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer are returned instead. + is_training: whether or not the model is being trained. + dropout_keep_prob: the probability that activations are kept in the dropout + layers during training. + spatial_squeeze: whether or not should squeeze the spatial dimensions of the + logits. Useful to remove unnecessary dimensions for classification. + scope: Optional scope for the variables. + global_pool: Optional boolean flag. If True, the input to the classification + layer is avgpooled to size 1x1, for any input size. (This is not part + of the original AlexNet.) + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the non-dropped-out input to the logits layer (if num_classes is 0 + or None). + end_points: a dict of tensors with intermediate activations. + """ + with tf.compat.v1.variable_scope(scope, 'alexnet_v2', [inputs]) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + # Collect outputs for conv2d, fully_connected and max_pool2d. + with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.max_pool2d], + outputs_collections=[end_points_collection]): + net = slim.conv2d(inputs, 64, [11, 11], 4, padding='VALID', + scope='conv1') + net = slim.max_pool2d(net, [3, 3], 2, scope='pool1') + net = slim.conv2d(net, 192, [5, 5], scope='conv2') + net = slim.max_pool2d(net, [3, 3], 2, scope='pool2') + net = slim.conv2d(net, 384, [3, 3], scope='conv3') + net = slim.conv2d(net, 384, [3, 3], scope='conv4') + net = slim.conv2d(net, 256, [3, 3], scope='conv5') + net = slim.max_pool2d(net, [3, 3], 2, scope='pool5') + + # Use conv2d instead of fully_connected layers. + with slim.arg_scope( + [slim.conv2d], + weights_initializer=trunc_normal(0.005), + biases_initializer=tf.compat.v1.constant_initializer(0.1)): + net = slim.conv2d(net, 4096, [5, 5], padding='VALID', + scope='fc6') + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout6') + net = slim.conv2d(net, 4096, [1, 1], scope='fc7') + # Convert end_points_collection into a end_point dict. + end_points = slim.utils.convert_collection_to_dict( + end_points_collection) + if global_pool: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if num_classes: + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout7') + net = slim.conv2d( + net, + num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + biases_initializer=tf.compat.v1.zeros_initializer(), + scope='fc8') + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='fc8/squeezed') + end_points[sc.name + '/fc8'] = net + return net, end_points + + +alexnet_v2.default_image_size = 224 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet_test.py new file mode 100644 index 0000000..b6fcdf4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/alexnet_test.py @@ -0,0 +1,181 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.alexnet.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import alexnet + +slim = contrib_slim + + +class AlexnetV2Test(tf.test.TestCase): + + def testBuild(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = alexnet.alexnet_v2(inputs, num_classes) + self.assertEquals(logits.op.name, 'alexnet_v2/fc8/squeezed') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testFullyConvolutional(self): + batch_size = 1 + height, width = 300, 400 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = alexnet.alexnet_v2(inputs, num_classes, spatial_squeeze=False) + self.assertEquals(logits.op.name, 'alexnet_v2/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 4, 7, num_classes]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = alexnet.alexnet_v2(inputs, num_classes, spatial_squeeze=False, + global_pool=True) + self.assertEquals(logits.op.name, 'alexnet_v2/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 1, 1, num_classes]) + + def testEndPoints(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = alexnet.alexnet_v2(inputs, num_classes) + expected_names = ['alexnet_v2/conv1', + 'alexnet_v2/pool1', + 'alexnet_v2/conv2', + 'alexnet_v2/pool2', + 'alexnet_v2/conv3', + 'alexnet_v2/conv4', + 'alexnet_v2/conv5', + 'alexnet_v2/pool5', + 'alexnet_v2/fc6', + 'alexnet_v2/fc7', + 'alexnet_v2/fc8' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + + def testNoClasses(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = alexnet.alexnet_v2(inputs, num_classes) + expected_names = ['alexnet_v2/conv1', + 'alexnet_v2/pool1', + 'alexnet_v2/conv2', + 'alexnet_v2/pool2', + 'alexnet_v2/conv3', + 'alexnet_v2/conv4', + 'alexnet_v2/conv5', + 'alexnet_v2/pool5', + 'alexnet_v2/fc6', + 'alexnet_v2/fc7' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + self.assertTrue(net.op.name.startswith('alexnet_v2/fc7')) + self.assertListEqual(net.get_shape().as_list(), + [batch_size, 1, 1, 4096]) + + def testModelVariables(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + alexnet.alexnet_v2(inputs, num_classes) + expected_names = ['alexnet_v2/conv1/weights', + 'alexnet_v2/conv1/biases', + 'alexnet_v2/conv2/weights', + 'alexnet_v2/conv2/biases', + 'alexnet_v2/conv3/weights', + 'alexnet_v2/conv3/biases', + 'alexnet_v2/conv4/weights', + 'alexnet_v2/conv4/biases', + 'alexnet_v2/conv5/weights', + 'alexnet_v2/conv5/biases', + 'alexnet_v2/fc6/weights', + 'alexnet_v2/fc6/biases', + 'alexnet_v2/fc7/weights', + 'alexnet_v2/fc7/biases', + 'alexnet_v2/fc8/weights', + 'alexnet_v2/fc8/biases', + ] + model_variables = [v.op.name for v in slim.get_model_variables()] + self.assertSetEqual(set(model_variables), set(expected_names)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = alexnet.alexnet_v2(eval_inputs, is_training=False) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + predictions = tf.argmax(input=logits, axis=1) + self.assertListEqual(predictions.get_shape().as_list(), [batch_size]) + + def testTrainEvalWithReuse(self): + train_batch_size = 2 + eval_batch_size = 1 + train_height, train_width = 224, 224 + eval_height, eval_width = 300, 400 + num_classes = 1000 + with self.test_session(): + train_inputs = tf.random.uniform( + (train_batch_size, train_height, train_width, 3)) + logits, _ = alexnet.alexnet_v2(train_inputs) + self.assertListEqual(logits.get_shape().as_list(), + [train_batch_size, num_classes]) + tf.compat.v1.get_variable_scope().reuse_variables() + eval_inputs = tf.random.uniform( + (eval_batch_size, eval_height, eval_width, 3)) + logits, _ = alexnet.alexnet_v2(eval_inputs, is_training=False, + spatial_squeeze=False) + self.assertListEqual(logits.get_shape().as_list(), + [eval_batch_size, 4, 7, num_classes]) + logits = tf.reduce_mean(input_tensor=logits, axis=[1, 2]) + predictions = tf.argmax(input=logits, axis=1) + self.assertEquals(predictions.get_shape().as_list(), [eval_batch_size]) + + def testForward(self): + batch_size = 1 + height, width = 224, 224 + with self.test_session() as sess: + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = alexnet.alexnet_v2(inputs) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits) + self.assertTrue(output.any()) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cifarnet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cifarnet.py new file mode 100644 index 0000000..1dae82c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cifarnet.py @@ -0,0 +1,123 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains a variant of the CIFAR-10 model definition.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + stddev=stddev) + + +def cifarnet(images, num_classes=10, is_training=False, + dropout_keep_prob=0.5, + prediction_fn=slim.softmax, + scope='CifarNet'): + """Creates a variant of the CifarNet model. + + Note that since the output is a set of 'logits', the values fall in the + interval of (-infinity, infinity). Consequently, to convert the outputs to a + probability distribution over the characters, one will need to convert them + using the softmax function: + + logits = cifarnet.cifarnet(images, is_training=False) + probabilities = tf.nn.softmax(logits) + predictions = tf.argmax(logits, 1) + + Args: + images: A batch of `Tensors` of size [batch_size, height, width, channels]. + num_classes: the number of classes in the dataset. If 0 or None, the logits + layer is omitted and the input features to the logits layer are returned + instead. + is_training: specifies whether or not we're currently training the model. + This variable will determine the behaviour of the dropout layer. + dropout_keep_prob: the percentage of activation values that are retained. + prediction_fn: a function to get predictions out of logits. + scope: Optional variable_scope. + + Returns: + net: a 2D Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the input to the logits layer if num_classes + is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + """ + end_points = {} + + with tf.compat.v1.variable_scope(scope, 'CifarNet', [images]): + net = slim.conv2d(images, 64, [5, 5], scope='conv1') + end_points['conv1'] = net + net = slim.max_pool2d(net, [2, 2], 2, scope='pool1') + end_points['pool1'] = net + net = tf.nn.lrn(net, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, name='norm1') + net = slim.conv2d(net, 64, [5, 5], scope='conv2') + end_points['conv2'] = net + net = tf.nn.lrn(net, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, name='norm2') + net = slim.max_pool2d(net, [2, 2], 2, scope='pool2') + end_points['pool2'] = net + net = slim.flatten(net) + end_points['Flatten'] = net + net = slim.fully_connected(net, 384, scope='fc3') + end_points['fc3'] = net + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout3') + net = slim.fully_connected(net, 192, scope='fc4') + end_points['fc4'] = net + if not num_classes: + return net, end_points + logits = slim.fully_connected( + net, + num_classes, + biases_initializer=tf.compat.v1.zeros_initializer(), + weights_initializer=trunc_normal(1 / 192.0), + weights_regularizer=None, + activation_fn=None, + scope='logits') + + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + + return logits, end_points +cifarnet.default_image_size = 32 + + +def cifarnet_arg_scope(weight_decay=0.004): + """Defines the default cifarnet argument scope. + + Args: + weight_decay: The weight decay to use for regularizing the model. + + Returns: + An `arg_scope` to use for the inception v3 model. + """ + with slim.arg_scope( + [slim.conv2d], + weights_initializer=tf.compat.v1.truncated_normal_initializer( + stddev=5e-2), + activation_fn=tf.nn.relu): + with slim.arg_scope( + [slim.fully_connected], + biases_initializer=tf.compat.v1.constant_initializer(0.1), + weights_initializer=trunc_normal(0.04), + weights_regularizer=slim.l2_regularizer(weight_decay), + activation_fn=tf.nn.relu) as sc: + return sc diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan.py new file mode 100644 index 0000000..7c64237 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan.py @@ -0,0 +1,280 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines the CycleGAN generator and discriminator networks.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers +from tensorflow.contrib import util as contrib_util + +layers = contrib_layers + + +def cyclegan_arg_scope(instance_norm_center=True, + instance_norm_scale=True, + instance_norm_epsilon=0.001, + weights_init_stddev=0.02, + weight_decay=0.0): + """Returns a default argument scope for all generators and discriminators. + + Args: + instance_norm_center: Whether instance normalization applies centering. + instance_norm_scale: Whether instance normalization applies scaling. + instance_norm_epsilon: Small float added to the variance in the instance + normalization to avoid dividing by zero. + weights_init_stddev: Standard deviation of the random values to initialize + the convolution kernels with. + weight_decay: Magnitude of weight decay applied to all convolution kernel + variables of the generator. + + Returns: + An arg-scope. + """ + instance_norm_params = { + 'center': instance_norm_center, + 'scale': instance_norm_scale, + 'epsilon': instance_norm_epsilon, + } + + weights_regularizer = None + if weight_decay and weight_decay > 0.0: + weights_regularizer = layers.l2_regularizer(weight_decay) + + with contrib_framework.arg_scope( + [layers.conv2d], + normalizer_fn=layers.instance_norm, + normalizer_params=instance_norm_params, + weights_initializer=tf.compat.v1.random_normal_initializer( + 0, weights_init_stddev), + weights_regularizer=weights_regularizer) as sc: + return sc + + +def cyclegan_upsample(net, num_outputs, stride, method='conv2d_transpose', + pad_mode='REFLECT', align_corners=False): + """Upsamples the given inputs. + + Args: + net: A Tensor of size [batch_size, height, width, filters]. + num_outputs: The number of output filters. + stride: A list of 2 scalars or a 1x2 Tensor indicating the scale, + relative to the inputs, of the output dimensions. For example, if kernel + size is [2, 3], then the output height and width will be twice and three + times the input size. + method: The upsampling method: 'nn_upsample_conv', 'bilinear_upsample_conv', + or 'conv2d_transpose'. + pad_mode: mode for tf.pad, one of "CONSTANT", "REFLECT", or "SYMMETRIC". + align_corners: option for method, 'bilinear_upsample_conv'. If true, the + centers of the 4 corner pixels of the input and output tensors are + aligned, preserving the values at the corner pixels. + + Returns: + A Tensor which was upsampled using the specified method. + + Raises: + ValueError: if `method` is not recognized. + """ + with tf.compat.v1.variable_scope('upconv'): + net_shape = tf.shape(input=net) + height = net_shape[1] + width = net_shape[2] + + # Reflection pad by 1 in spatial dimensions (axes 1, 2 = h, w) to make a 3x3 + # 'valid' convolution produce an output with the same dimension as the + # input. + spatial_pad_1 = np.array([[0, 0], [1, 1], [1, 1], [0, 0]]) + + if method == 'nn_upsample_conv': + net = tf.image.resize( + net, [stride[0] * height, stride[1] * width], + method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + net = tf.pad(tensor=net, paddings=spatial_pad_1, mode=pad_mode) + net = layers.conv2d(net, num_outputs, kernel_size=[3, 3], padding='valid') + elif method == 'bilinear_upsample_conv': + net = tf.compat.v1.image.resize_bilinear( + net, [stride[0] * height, stride[1] * width], + align_corners=align_corners) + net = tf.pad(tensor=net, paddings=spatial_pad_1, mode=pad_mode) + net = layers.conv2d(net, num_outputs, kernel_size=[3, 3], padding='valid') + elif method == 'conv2d_transpose': + # This corrects 1 pixel offset for images with even width and height. + # conv2d is left aligned and conv2d_transpose is right aligned for even + # sized images (while doing 'SAME' padding). + # Note: This doesn't reflect actual model in paper. + net = layers.conv2d_transpose( + net, num_outputs, kernel_size=[3, 3], stride=stride, padding='valid') + net = net[:, 1:, 1:, :] + else: + raise ValueError('Unknown method: [%s]' % method) + + return net + + +def _dynamic_or_static_shape(tensor): + shape = tf.shape(input=tensor) + static_shape = contrib_util.constant_value(shape) + return static_shape if static_shape is not None else shape + + +def cyclegan_generator_resnet(images, + arg_scope_fn=cyclegan_arg_scope, + num_resnet_blocks=6, + num_filters=64, + upsample_fn=cyclegan_upsample, + kernel_size=3, + tanh_linear_slope=0.0, + is_training=False): + """Defines the cyclegan resnet network architecture. + + As closely as possible following + https://github.com/junyanz/CycleGAN/blob/master/models/architectures.lua#L232 + + FYI: This network requires input height and width to be divisible by 4 in + order to generate an output with shape equal to input shape. Assertions will + catch this if input dimensions are known at graph construction time, but + there's no protection if unknown at graph construction time (you'll see an + error). + + Args: + images: Input image tensor of shape [batch_size, h, w, 3]. + arg_scope_fn: Function to create the global arg_scope for the network. + num_resnet_blocks: Number of ResNet blocks in the middle of the generator. + num_filters: Number of filters of the first hidden layer. + upsample_fn: Upsampling function for the decoder part of the generator. + kernel_size: Size w or list/tuple [h, w] of the filter kernels for all inner + layers. + tanh_linear_slope: Slope of the linear function to add to the tanh over the + logits. + is_training: Whether the network is created in training mode or inference + only mode. Not actually needed, just for compliance with other generator + network functions. + + Returns: + A `Tensor` representing the model output and a dictionary of model end + points. + + Raises: + ValueError: If the input height or width is known at graph construction time + and not a multiple of 4. + """ + # Neither dropout nor batch norm -> dont need is_training + del is_training + + end_points = {} + + input_size = images.shape.as_list() + height, width = input_size[1], input_size[2] + if height and height % 4 != 0: + raise ValueError('The input height must be a multiple of 4.') + if width and width % 4 != 0: + raise ValueError('The input width must be a multiple of 4.') + num_outputs = input_size[3] + + if not isinstance(kernel_size, (list, tuple)): + kernel_size = [kernel_size, kernel_size] + + kernel_height = kernel_size[0] + kernel_width = kernel_size[1] + pad_top = (kernel_height - 1) // 2 + pad_bottom = kernel_height // 2 + pad_left = (kernel_width - 1) // 2 + pad_right = kernel_width // 2 + paddings = np.array( + [[0, 0], [pad_top, pad_bottom], [pad_left, pad_right], [0, 0]], + dtype=np.int32) + spatial_pad_3 = np.array([[0, 0], [3, 3], [3, 3], [0, 0]]) + + with contrib_framework.arg_scope(arg_scope_fn()): + + ########### + # Encoder # + ########### + with tf.compat.v1.variable_scope('input'): + # 7x7 input stage + net = tf.pad(tensor=images, paddings=spatial_pad_3, mode='REFLECT') + net = layers.conv2d(net, num_filters, kernel_size=[7, 7], padding='VALID') + end_points['encoder_0'] = net + + with tf.compat.v1.variable_scope('encoder'): + with contrib_framework.arg_scope([layers.conv2d], + kernel_size=kernel_size, + stride=2, + activation_fn=tf.nn.relu, + padding='VALID'): + + net = tf.pad(tensor=net, paddings=paddings, mode='REFLECT') + net = layers.conv2d(net, num_filters * 2) + end_points['encoder_1'] = net + net = tf.pad(tensor=net, paddings=paddings, mode='REFLECT') + net = layers.conv2d(net, num_filters * 4) + end_points['encoder_2'] = net + + ################### + # Residual Blocks # + ################### + with tf.compat.v1.variable_scope('residual_blocks'): + with contrib_framework.arg_scope([layers.conv2d], + kernel_size=kernel_size, + stride=1, + activation_fn=tf.nn.relu, + padding='VALID'): + for block_id in xrange(num_resnet_blocks): + with tf.compat.v1.variable_scope('block_{}'.format(block_id)): + res_net = tf.pad(tensor=net, paddings=paddings, mode='REFLECT') + res_net = layers.conv2d(res_net, num_filters * 4) + res_net = tf.pad(tensor=res_net, paddings=paddings, mode='REFLECT') + res_net = layers.conv2d(res_net, num_filters * 4, + activation_fn=None) + net += res_net + + end_points['resnet_block_%d' % block_id] = net + + ########### + # Decoder # + ########### + with tf.compat.v1.variable_scope('decoder'): + + with contrib_framework.arg_scope([layers.conv2d], + kernel_size=kernel_size, + stride=1, + activation_fn=tf.nn.relu): + + with tf.compat.v1.variable_scope('decoder1'): + net = upsample_fn(net, num_outputs=num_filters * 2, stride=[2, 2]) + end_points['decoder1'] = net + + with tf.compat.v1.variable_scope('decoder2'): + net = upsample_fn(net, num_outputs=num_filters, stride=[2, 2]) + end_points['decoder2'] = net + + with tf.compat.v1.variable_scope('output'): + net = tf.pad(tensor=net, paddings=spatial_pad_3, mode='REFLECT') + logits = layers.conv2d( + net, + num_outputs, [7, 7], + activation_fn=None, + normalizer_fn=None, + padding='valid') + logits = tf.reshape(logits, _dynamic_or_static_shape(images)) + + end_points['logits'] = logits + end_points['predictions'] = tf.tanh(logits) + logits * tanh_linear_slope + + return end_points['predictions'], end_points diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan_test.py new file mode 100644 index 0000000..96f0e24 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/cyclegan_test.py @@ -0,0 +1,110 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for tensorflow.contrib.slim.nets.cyclegan.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from nets import cyclegan + + +# TODO(joelshor): Add a test to check generator endpoints. +class CycleganTest(tf.test.TestCase): + + def test_generator_inference(self): + """Check one inference step.""" + img_batch = tf.zeros([2, 32, 32, 3]) + model_output, _ = cyclegan.cyclegan_generator_resnet(img_batch) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + sess.run(model_output) + + def _test_generator_graph_helper(self, shape): + """Check that generator can take small and non-square inputs.""" + output_imgs, _ = cyclegan.cyclegan_generator_resnet(tf.ones(shape)) + self.assertAllEqual(shape, output_imgs.shape.as_list()) + + def test_generator_graph_small(self): + self._test_generator_graph_helper([4, 32, 32, 3]) + + def test_generator_graph_medium(self): + self._test_generator_graph_helper([3, 128, 128, 3]) + + def test_generator_graph_nonsquare(self): + self._test_generator_graph_helper([2, 80, 400, 3]) + + def test_generator_unknown_batch_dim(self): + """Check that generator can take unknown batch dimension inputs.""" + img = tf.compat.v1.placeholder(tf.float32, shape=[None, 32, None, 3]) + output_imgs, _ = cyclegan.cyclegan_generator_resnet(img) + + self.assertAllEqual([None, 32, None, 3], output_imgs.shape.as_list()) + + def _input_and_output_same_shape_helper(self, kernel_size): + img_batch = tf.compat.v1.placeholder(tf.float32, shape=[None, 32, 32, 3]) + output_img_batch, _ = cyclegan.cyclegan_generator_resnet( + img_batch, kernel_size=kernel_size) + + self.assertAllEqual(img_batch.shape.as_list(), + output_img_batch.shape.as_list()) + + def input_and_output_same_shape_kernel3(self): + self._input_and_output_same_shape_helper(3) + + def input_and_output_same_shape_kernel4(self): + self._input_and_output_same_shape_helper(4) + + def input_and_output_same_shape_kernel5(self): + self._input_and_output_same_shape_helper(5) + + def input_and_output_same_shape_kernel6(self): + self._input_and_output_same_shape_helper(6) + + def _error_if_height_not_multiple_of_four_helper(self, height): + self.assertRaisesRegexp( + ValueError, 'The input height must be a multiple of 4.', + cyclegan.cyclegan_generator_resnet, + tf.compat.v1.placeholder(tf.float32, shape=[None, height, 32, 3])) + + def test_error_if_height_not_multiple_of_four_height29(self): + self._error_if_height_not_multiple_of_four_helper(29) + + def test_error_if_height_not_multiple_of_four_height30(self): + self._error_if_height_not_multiple_of_four_helper(30) + + def test_error_if_height_not_multiple_of_four_height31(self): + self._error_if_height_not_multiple_of_four_helper(31) + + def _error_if_width_not_multiple_of_four_helper(self, width): + self.assertRaisesRegexp( + ValueError, 'The input width must be a multiple of 4.', + cyclegan.cyclegan_generator_resnet, + tf.compat.v1.placeholder(tf.float32, shape=[None, 32, width, 3])) + + def test_error_if_width_not_multiple_of_four_width29(self): + self._error_if_width_not_multiple_of_four_helper(29) + + def test_error_if_width_not_multiple_of_four_width30(self): + self._error_if_width_not_multiple_of_four_helper(30) + + def test_error_if_width_not_multiple_of_four_width31(self): + self._error_if_width_not_multiple_of_four_helper(31) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan.py new file mode 100644 index 0000000..598b642 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan.py @@ -0,0 +1,205 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""DCGAN generator and discriminator from https://arxiv.org/abs/1511.06434.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from math import log + +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def _validate_image_inputs(inputs): + inputs.get_shape().assert_has_rank(4) + inputs.get_shape()[1:3].assert_is_fully_defined() + if inputs.get_shape()[1] != inputs.get_shape()[2]: + raise ValueError('Input tensor does not have equal width and height: ', + inputs.get_shape()[1:3]) + width = inputs.get_shape().as_list()[1] + if log(width, 2) != int(log(width, 2)): + raise ValueError('Input tensor `width` is not a power of 2: ', width) + + +# TODO(joelshor): Use fused batch norm by default. Investigate why some GAN +# setups need the gradient of gradient FusedBatchNormGrad. +def discriminator(inputs, + depth=64, + is_training=True, + reuse=None, + scope='Discriminator', + fused_batch_norm=False): + """Discriminator network for DCGAN. + + Construct discriminator network from inputs to the final endpoint. + + Args: + inputs: A tensor of size [batch_size, height, width, channels]. Must be + floating point. + depth: Number of channels in first convolution layer. + is_training: Whether the network is for training or not. + reuse: Whether or not the network variables should be reused. `scope` + must be given to be reused. + scope: Optional variable_scope. + fused_batch_norm: If `True`, use a faster, fused implementation of + batch norm. + + Returns: + logits: The pre-softmax activations, a tensor of size [batch_size, 1] + end_points: a dictionary from components of the network to their activation. + + Raises: + ValueError: If the input image shape is not 4-dimensional, if the spatial + dimensions aren't defined at graph construction time, if the spatial + dimensions aren't square, or if the spatial dimensions aren't a power of + two. + """ + + normalizer_fn = slim.batch_norm + normalizer_fn_args = { + 'is_training': is_training, + 'zero_debias_moving_mean': True, + 'fused': fused_batch_norm, + } + + _validate_image_inputs(inputs) + inp_shape = inputs.get_shape().as_list()[1] + + end_points = {} + with tf.compat.v1.variable_scope( + scope, values=[inputs], reuse=reuse) as scope: + with slim.arg_scope([normalizer_fn], **normalizer_fn_args): + with slim.arg_scope([slim.conv2d], + stride=2, + kernel_size=4, + activation_fn=tf.nn.leaky_relu): + net = inputs + for i in xrange(int(log(inp_shape, 2))): + scope = 'conv%i' % (i + 1) + current_depth = depth * 2**i + normalizer_fn_ = None if i == 0 else normalizer_fn + net = slim.conv2d( + net, current_depth, normalizer_fn=normalizer_fn_, scope=scope) + end_points[scope] = net + + logits = slim.conv2d(net, 1, kernel_size=1, stride=1, padding='VALID', + normalizer_fn=None, activation_fn=None) + logits = tf.reshape(logits, [-1, 1]) + end_points['logits'] = logits + + return logits, end_points + + +# TODO(joelshor): Use fused batch norm by default. Investigate why some GAN +# setups need the gradient of gradient FusedBatchNormGrad. +def generator(inputs, + depth=64, + final_size=32, + num_outputs=3, + is_training=True, + reuse=None, + scope='Generator', + fused_batch_norm=False): + """Generator network for DCGAN. + + Construct generator network from inputs to the final endpoint. + + Args: + inputs: A tensor with any size N. [batch_size, N] + depth: Number of channels in last deconvolution layer. + final_size: The shape of the final output. + num_outputs: Number of output features. For images, this is the number of + channels. + is_training: whether is training or not. + reuse: Whether or not the network has its variables should be reused. scope + must be given to be reused. + scope: Optional variable_scope. + fused_batch_norm: If `True`, use a faster, fused implementation of + batch norm. + + Returns: + logits: the pre-softmax activations, a tensor of size + [batch_size, 32, 32, channels] + end_points: a dictionary from components of the network to their activation. + + Raises: + ValueError: If `inputs` is not 2-dimensional. + ValueError: If `final_size` isn't a power of 2 or is less than 8. + """ + normalizer_fn = slim.batch_norm + normalizer_fn_args = { + 'is_training': is_training, + 'zero_debias_moving_mean': True, + 'fused': fused_batch_norm, + } + + inputs.get_shape().assert_has_rank(2) + if log(final_size, 2) != int(log(final_size, 2)): + raise ValueError('`final_size` (%i) must be a power of 2.' % final_size) + if final_size < 8: + raise ValueError('`final_size` (%i) must be greater than 8.' % final_size) + + end_points = {} + num_layers = int(log(final_size, 2)) - 1 + with tf.compat.v1.variable_scope( + scope, values=[inputs], reuse=reuse) as scope: + with slim.arg_scope([normalizer_fn], **normalizer_fn_args): + with slim.arg_scope([slim.conv2d_transpose], + normalizer_fn=normalizer_fn, + stride=2, + kernel_size=4): + net = tf.expand_dims(tf.expand_dims(inputs, 1), 1) + + # First upscaling is different because it takes the input vector. + current_depth = depth * 2 ** (num_layers - 1) + scope = 'deconv1' + net = slim.conv2d_transpose( + net, current_depth, stride=1, padding='VALID', scope=scope) + end_points[scope] = net + + for i in xrange(2, num_layers): + scope = 'deconv%i' % (i) + current_depth = depth * 2 ** (num_layers - i) + net = slim.conv2d_transpose(net, current_depth, scope=scope) + end_points[scope] = net + + # Last layer has different normalizer and activation. + scope = 'deconv%i' % (num_layers) + net = slim.conv2d_transpose( + net, depth, normalizer_fn=None, activation_fn=None, scope=scope) + end_points[scope] = net + + # Convert to proper channels. + scope = 'logits' + logits = slim.conv2d( + net, + num_outputs, + normalizer_fn=None, + activation_fn=None, + kernel_size=1, + stride=1, + padding='VALID', + scope=scope) + end_points[scope] = logits + + logits.get_shape().assert_has_rank(4) + logits.get_shape().assert_is_compatible_with( + [None, final_size, final_size, num_outputs]) + + return logits, end_points diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan_test.py new file mode 100644 index 0000000..53fd9fb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/dcgan_test.py @@ -0,0 +1,121 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for dcgan.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf + +from nets import dcgan + + +class DCGANTest(tf.test.TestCase): + + def test_generator_run(self): + tf.compat.v1.set_random_seed(1234) + noise = tf.random.normal([100, 64]) + image, _ = dcgan.generator(noise) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + image.eval() + + def test_generator_graph(self): + tf.compat.v1.set_random_seed(1234) + # Check graph construction for a number of image size/depths and batch + # sizes. + for i, batch_size in zip(xrange(3, 7), xrange(3, 8)): + tf.compat.v1.reset_default_graph() + final_size = 2 ** i + noise = tf.random.normal([batch_size, 64]) + image, end_points = dcgan.generator( + noise, + depth=32, + final_size=final_size) + + self.assertAllEqual([batch_size, final_size, final_size, 3], + image.shape.as_list()) + + expected_names = ['deconv%i' % j for j in xrange(1, i)] + ['logits'] + self.assertSetEqual(set(expected_names), set(end_points.keys())) + + # Check layer depths. + for j in range(1, i): + layer = end_points['deconv%i' % j] + self.assertEqual(32 * 2**(i-j-1), layer.get_shape().as_list()[-1]) + + def test_generator_invalid_input(self): + wrong_dim_input = tf.zeros([5, 32, 32]) + with self.assertRaises(ValueError): + dcgan.generator(wrong_dim_input) + + correct_input = tf.zeros([3, 2]) + with self.assertRaisesRegexp(ValueError, 'must be a power of 2'): + dcgan.generator(correct_input, final_size=30) + + with self.assertRaisesRegexp(ValueError, 'must be greater than 8'): + dcgan.generator(correct_input, final_size=4) + + def test_discriminator_run(self): + image = tf.random.uniform([5, 32, 32, 3], -1, 1) + output, _ = dcgan.discriminator(image) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output.eval() + + def test_discriminator_graph(self): + # Check graph construction for a number of image size/depths and batch + # sizes. + for i, batch_size in zip(xrange(1, 6), xrange(3, 8)): + tf.compat.v1.reset_default_graph() + img_w = 2 ** i + image = tf.random.uniform([batch_size, img_w, img_w, 3], -1, 1) + output, end_points = dcgan.discriminator( + image, + depth=32) + + self.assertAllEqual([batch_size, 1], output.get_shape().as_list()) + + expected_names = ['conv%i' % j for j in xrange(1, i+1)] + ['logits'] + self.assertSetEqual(set(expected_names), set(end_points.keys())) + + # Check layer depths. + for j in range(1, i+1): + layer = end_points['conv%i' % j] + self.assertEqual(32 * 2**(j-1), layer.get_shape().as_list()[-1]) + + def test_discriminator_invalid_input(self): + wrong_dim_img = tf.zeros([5, 32, 32]) + with self.assertRaises(ValueError): + dcgan.discriminator(wrong_dim_img) + + spatially_undefined_shape = tf.compat.v1.placeholder( + tf.float32, [5, 32, None, 3]) + with self.assertRaises(ValueError): + dcgan.discriminator(spatially_undefined_shape) + + not_square = tf.zeros([5, 32, 16, 3]) + with self.assertRaisesRegexp(ValueError, 'not have equal width and height'): + dcgan.discriminator(not_square) + + not_power_2 = tf.zeros([5, 30, 30, 3]) + with self.assertRaisesRegexp(ValueError, 'not a power of 2'): + dcgan.discriminator(not_power_2) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d.py new file mode 100644 index 0000000..28974ea --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d.py @@ -0,0 +1,181 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for Inflated 3D Inception V1 (I3D). + +The network architecture is proposed by: + Joao Carreira and Andrew Zisserman, + Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset. + https://arxiv.org/abs/1705.07750 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import i3d_utils +from nets import s3dg + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) +conv3d_spatiotemporal = i3d_utils.conv3d_spatiotemporal + + +def i3d_arg_scope(weight_decay=1e-7, + batch_norm_decay=0.999, + batch_norm_epsilon=0.001, + use_renorm=False, + separable_conv3d=False): + """Defines default arg_scope for I3D. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + use_renorm: Whether to use batch renormalization or not. + separable_conv3d: Whether to use separable 3d Convs. + + Returns: + sc: An arg_scope to use for the models. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + # Turns off fused batch norm. + 'fused': False, + 'renorm': use_renorm, + # collection containing the moving mean and moving variance. + 'variables_collections': { + 'beta': None, + 'gamma': None, + 'moving_mean': ['moving_vars'], + 'moving_variance': ['moving_vars'], + } + } + + with slim.arg_scope( + [slim.conv3d, conv3d_spatiotemporal], + weights_regularizer=slim.l2_regularizer(weight_decay), + activation_fn=tf.nn.relu, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params): + with slim.arg_scope( + [conv3d_spatiotemporal], separable=separable_conv3d) as sc: + return sc + + +def i3d_base(inputs, final_endpoint='Mixed_5c', + scope='InceptionV1'): + """Defines the I3D base architecture. + + Note that we use the names as defined in Inception V1 to facilitate checkpoint + conversion from an image-trained Inception V1 checkpoint to I3D checkpoint. + + Args: + inputs: A 5-D float tensor of size [batch_size, num_frames, height, width, + channels]. + final_endpoint: Specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', + 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', 'Mixed_5c'] + scope: Optional variable_scope. + + Returns: + A dictionary from components of the network to the corresponding activation. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values. + """ + + return s3dg.s3dg_base( + inputs, + first_temporal_kernel_size=7, + temporal_conv_startat='Conv2d_2c_3x3', + gating_startat=None, + final_endpoint=final_endpoint, + min_depth=16, + depth_multiplier=1.0, + data_format='NDHWC', + scope=scope) + + +def i3d(inputs, + num_classes=1000, + dropout_keep_prob=0.8, + is_training=True, + prediction_fn=slim.softmax, + spatial_squeeze=True, + reuse=None, + scope='InceptionV1'): + """Defines the I3D architecture. + + The default image size used to train this network is 224x224. + + Args: + inputs: A 5-D float tensor of size [batch_size, num_frames, height, width, + channels]. + num_classes: number of predicted classes. + dropout_keep_prob: the percentage of activation values that are retained. + is_training: whether is training or not. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape is [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + + Returns: + logits: the pre-softmax activations, a tensor of size + [batch_size, num_classes] + end_points: a dictionary from components of the network to the corresponding + activation. + """ + # Final pooling and prediction + with tf.compat.v1.variable_scope( + scope, 'InceptionV1', [inputs, num_classes], reuse=reuse) as scope: + with slim.arg_scope( + [slim.batch_norm, slim.dropout], is_training=is_training): + net, end_points = i3d_base(inputs, scope=scope) + with tf.compat.v1.variable_scope('Logits'): + kernel_size = i3d_utils.reduced_kernel_size_3d(net, [2, 7, 7]) + net = slim.avg_pool3d( + net, kernel_size, stride=1, scope='AvgPool_0a_7x7') + net = slim.dropout(net, dropout_keep_prob, scope='Dropout_0b') + logits = slim.conv3d( + net, + num_classes, [1, 1, 1], + activation_fn=None, + normalizer_fn=None, + scope='Conv2d_0c_1x1') + # Temporal average pooling. + logits = tf.reduce_mean(input_tensor=logits, axis=1) + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points + + +i3d.default_image_size = 224 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_test.py new file mode 100644 index 0000000..307233c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_test.py @@ -0,0 +1,149 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for networks.i3d.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from nets import i3d + + +class I3DTest(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + logits, end_points = i3d.i3d(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildBaseNetwork(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_6c, end_points = i3d.i3d_base(inputs) + self.assertTrue(mixed_6c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_6c.get_shape().as_list(), + [batch_size, 8, 7, 7, 1024]) + expected_endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', + 'Mixed_3c', 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', + 'Mixed_4d', 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', + 'Mixed_5b', 'Mixed_5c'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', + 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', + 'Mixed_5c'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + out_tensor, end_points = i3d.i3d_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV1/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points) + + def testBuildAndCheckAllEndPointsUptoMixed5c(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + _, end_points = i3d.i3d_base(inputs, + final_endpoint='Mixed_5c') + endpoints_shapes = {'Conv2d_1a_7x7': [5, 32, 112, 112, 64], + 'MaxPool_2a_3x3': [5, 32, 56, 56, 64], + 'Conv2d_2b_1x1': [5, 32, 56, 56, 64], + 'Conv2d_2c_3x3': [5, 32, 56, 56, 192], + 'MaxPool_3a_3x3': [5, 32, 28, 28, 192], + 'Mixed_3b': [5, 32, 28, 28, 256], + 'Mixed_3c': [5, 32, 28, 28, 480], + 'MaxPool_4a_3x3': [5, 16, 14, 14, 480], + 'Mixed_4b': [5, 16, 14, 14, 512], + 'Mixed_4c': [5, 16, 14, 14, 512], + 'Mixed_4d': [5, 16, 14, 14, 512], + 'Mixed_4e': [5, 16, 14, 14, 528], + 'Mixed_4f': [5, 16, 14, 14, 832], + 'MaxPool_5a_2x2': [5, 8, 7, 7, 832], + 'Mixed_5b': [5, 8, 7, 7, 832], + 'Mixed_5c': [5, 8, 7, 7, 1024]} + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.iteritems(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testHalfSizeImages(self): + batch_size = 5 + num_frames = 64 + height, width = 112, 112 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_5c, _ = i3d.i3d_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 8, 4, 4, 1024]) + + def testTenFrames(self): + batch_size = 5 + num_frames = 10 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_5c, _ = i3d.i3d_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 2, 7, 7, 1024]) + + def testEvaluation(self): + batch_size = 2 + num_frames = 64 + height, width = 224, 224 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + logits, _ = i3d.i3d(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_utils.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_utils.py new file mode 100644 index 0000000..05df301 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/i3d_utils.py @@ -0,0 +1,289 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utilities for building I3D network models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers + + +# Orignaly, add_arg_scope = slim.add_arg_scope and layers = slim, now switch to +# more update-to-date tf.contrib.* API. +add_arg_scope = contrib_framework.add_arg_scope +layers = contrib_layers + + +def center_initializer(): + """Centering Initializer for I3D. + + This initializer allows identity mapping for temporal convolution at the + initialization, which is critical for a desired convergence behavior + for training a seprable I3D model. + + The centering behavior of this initializer requires an odd-sized kernel, + typically set to 3. + + Returns: + A weight initializer op used in temporal convolutional layers. + + Raises: + ValueError: Input tensor data type has to be tf.float32. + ValueError: If input tensor is not a 5-D tensor. + ValueError: If input and output channel dimensions are different. + ValueError: If spatial kernel sizes are not 1. + ValueError: If temporal kernel size is even. + """ + + def _initializer(shape, dtype=tf.float32, partition_info=None): # pylint: disable=unused-argument + """Initializer op.""" + + if dtype != tf.float32 and dtype != tf.bfloat16: + raise ValueError( + 'Input tensor data type has to be tf.float32 or tf.bfloat16.') + if len(shape) != 5: + raise ValueError('Input tensor has to be 5-D.') + if shape[3] != shape[4]: + raise ValueError('Input and output channel dimensions must be the same.') + if shape[1] != 1 or shape[2] != 1: + raise ValueError('Spatial kernel sizes must be 1 (pointwise conv).') + if shape[0] % 2 == 0: + raise ValueError('Temporal kernel size has to be odd.') + + center_pos = int(shape[0] / 2) + init_mat = np.zeros( + [shape[0], shape[1], shape[2], shape[3], shape[4]], dtype=np.float32) + for i in range(0, shape[3]): + init_mat[center_pos, 0, 0, i, i] = 1.0 + + init_op = tf.constant(init_mat, dtype=dtype) + return init_op + + return _initializer + + +@add_arg_scope +def conv3d_spatiotemporal(inputs, + num_outputs, + kernel_size, + stride=1, + padding='SAME', + activation_fn=None, + normalizer_fn=None, + normalizer_params=None, + weights_regularizer=None, + separable=False, + data_format='NDHWC', + scope=''): + """A wrapper for conv3d to model spatiotemporal representations. + + This allows switching between original 3D convolution and separable 3D + convolutions for spatial and temporal features respectively. On Kinetics, + seprable 3D convolutions yields better classification performance. + + Args: + inputs: a 5-D tensor `[batch_size, depth, height, width, channels]`. + num_outputs: integer, the number of output filters. + kernel_size: a list of length 3 + `[kernel_depth, kernel_height, kernel_width]` of the filters. Can be an + int if all values are the same. + stride: a list of length 3 `[stride_depth, stride_height, stride_width]`. + Can be an int if all strides are the same. + padding: one of `VALID` or `SAME`. + activation_fn: activation function. + normalizer_fn: normalization function to use instead of `biases`. + normalizer_params: dictionary of normalization function parameters. + weights_regularizer: Optional regularizer for the weights. + separable: If `True`, use separable spatiotemporal convolutions. + data_format: An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". + The data format of the input and output data. With the default format + "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, + in_width, in_channels]. Alternatively, the format could be "NCDHW", the + data storage order is: + [batch, in_channels, in_depth, in_height, in_width]. + scope: scope for `variable_scope`. + + Returns: + A tensor representing the output of the (separable) conv3d operation. + + """ + assert len(kernel_size) == 3 + if separable and kernel_size[0] != 1: + spatial_kernel_size = [1, kernel_size[1], kernel_size[2]] + temporal_kernel_size = [kernel_size[0], 1, 1] + if isinstance(stride, list) and len(stride) == 3: + spatial_stride = [1, stride[1], stride[2]] + temporal_stride = [stride[0], 1, 1] + else: + spatial_stride = [1, stride, stride] + temporal_stride = [stride, 1, 1] + net = layers.conv3d( + inputs, + num_outputs, + spatial_kernel_size, + stride=spatial_stride, + padding=padding, + activation_fn=activation_fn, + normalizer_fn=normalizer_fn, + normalizer_params=normalizer_params, + weights_regularizer=weights_regularizer, + data_format=data_format, + scope=scope) + net = layers.conv3d( + net, + num_outputs, + temporal_kernel_size, + stride=temporal_stride, + padding=padding, + scope=scope + '/temporal', + activation_fn=activation_fn, + normalizer_fn=None, + data_format=data_format, + weights_initializer=center_initializer()) + return net + else: + return layers.conv3d( + inputs, + num_outputs, + kernel_size, + stride=stride, + padding=padding, + activation_fn=activation_fn, + normalizer_fn=normalizer_fn, + normalizer_params=normalizer_params, + weights_regularizer=weights_regularizer, + data_format=data_format, + scope=scope) + + +@add_arg_scope +def inception_block_v1_3d(inputs, + num_outputs_0_0a, + num_outputs_1_0a, + num_outputs_1_0b, + num_outputs_2_0a, + num_outputs_2_0b, + num_outputs_3_0b, + temporal_kernel_size=3, + self_gating_fn=None, + data_format='NDHWC', + scope=''): + """A 3D Inception v1 block. + + This allows use of separable 3D convolutions and self-gating, as + described in: + Saining Xie, Chen Sun, Jonathan Huang, Zhuowen Tu and Kevin Murphy, + Rethinking Spatiotemporal Feature Learning For Video Understanding. + https://arxiv.org/abs/1712.04851. + + Args: + inputs: a 5-D tensor `[batch_size, depth, height, width, channels]`. + num_outputs_0_0a: integer, the number of output filters for Branch 0, + operation Conv2d_0a_1x1. + num_outputs_1_0a: integer, the number of output filters for Branch 1, + operation Conv2d_0a_1x1. + num_outputs_1_0b: integer, the number of output filters for Branch 1, + operation Conv2d_0b_3x3. + num_outputs_2_0a: integer, the number of output filters for Branch 2, + operation Conv2d_0a_1x1. + num_outputs_2_0b: integer, the number of output filters for Branch 2, + operation Conv2d_0b_3x3. + num_outputs_3_0b: integer, the number of output filters for Branch 3, + operation Conv2d_0b_1x1. + temporal_kernel_size: integer, the size of the temporal convolutional + filters in the conv3d_spatiotemporal blocks. + self_gating_fn: function which optionally performs self-gating. + Must have two arguments, `inputs` and `scope`, and return one output + tensor the same size as `inputs`. If `None`, no self-gating is + applied. + data_format: An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". + The data format of the input and output data. With the default format + "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, + in_width, in_channels]. Alternatively, the format could be "NCDHW", the + data storage order is: + [batch, in_channels, in_depth, in_height, in_width]. + scope: scope for `variable_scope`. + + Returns: + A 5-D tensor `[batch_size, depth, height, width, out_channels]`, where + `out_channels = num_outputs_0_0a + num_outputs_1_0b + num_outputs_2_0b + + num_outputs_3_0b`. + + """ + use_gating = self_gating_fn is not None + + with tf.compat.v1.variable_scope(scope): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = layers.conv3d( + inputs, num_outputs_0_0a, [1, 1, 1], scope='Conv2d_0a_1x1') + if use_gating: + branch_0 = self_gating_fn(branch_0, scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = layers.conv3d( + inputs, num_outputs_1_0a, [1, 1, 1], scope='Conv2d_0a_1x1') + branch_1 = conv3d_spatiotemporal( + branch_1, num_outputs_1_0b, [temporal_kernel_size, 3, 3], + scope='Conv2d_0b_3x3') + if use_gating: + branch_1 = self_gating_fn(branch_1, scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = layers.conv3d( + inputs, num_outputs_2_0a, [1, 1, 1], scope='Conv2d_0a_1x1') + branch_2 = conv3d_spatiotemporal( + branch_2, num_outputs_2_0b, [temporal_kernel_size, 3, 3], + scope='Conv2d_0b_3x3') + if use_gating: + branch_2 = self_gating_fn(branch_2, scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = layers.max_pool3d(inputs, [3, 3, 3], scope='MaxPool_0a_3x3') + branch_3 = layers.conv3d( + branch_3, num_outputs_3_0b, [1, 1, 1], scope='Conv2d_0b_1x1') + if use_gating: + branch_3 = self_gating_fn(branch_3, scope='Conv2d_0b_1x1') + index_c = data_format.index('C') + assert 1 <= index_c <= 4, 'Cannot identify channel dimension.' + output = tf.concat([branch_0, branch_1, branch_2, branch_3], index_c) + return output + + +def reduced_kernel_size_3d(input_tensor, kernel_size): + """Define kernel size which is automatically reduced for small input. + + If the shape of the input images is unknown at graph construction time this + function assumes that the input images are large enough. + + Args: + input_tensor: input tensor of size + [batch_size, time, height, width, channels]. + kernel_size: desired kernel size of length 3, corresponding to time, + height and width. + + Returns: + a tensor with the kernel size. + """ + assert len(kernel_size) == 3 + shape = input_tensor.get_shape().as_list() + assert len(shape) == 5 + if None in shape[1:4]: + kernel_size_out = kernel_size + else: + kernel_size_out = [min(shape[1], kernel_size[0]), + min(shape[2], kernel_size[1]), + min(shape[3], kernel_size[2])] + return kernel_size_out diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception.py new file mode 100644 index 0000000..b69cd2a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception.py @@ -0,0 +1,37 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Brings all inception models under one namespace.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# pylint: disable=unused-import +from nets.inception_resnet_v2 import inception_resnet_v2 +from nets.inception_resnet_v2 import inception_resnet_v2_arg_scope +from nets.inception_resnet_v2 import inception_resnet_v2_base +from nets.inception_v1 import inception_v1 +from nets.inception_v1 import inception_v1_arg_scope +from nets.inception_v1 import inception_v1_base +from nets.inception_v2 import inception_v2 +from nets.inception_v2 import inception_v2_arg_scope +from nets.inception_v2 import inception_v2_base +from nets.inception_v3 import inception_v3 +from nets.inception_v3 import inception_v3_arg_scope +from nets.inception_v3 import inception_v3_base +from nets.inception_v4 import inception_v4 +from nets.inception_v4 import inception_v4_arg_scope +from nets.inception_v4 import inception_v4_base +# pylint: enable=unused-import diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2.py new file mode 100644 index 0000000..cff5895 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2.py @@ -0,0 +1,408 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition of the Inception Resnet V2 architecture. + +As described in http://arxiv.org/abs/1602.07261. + + Inception-v4, Inception-ResNet and the Impact of Residual Connections + on Learning + Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def block35(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): + """Builds the 35x35 resnet block.""" + with tf.compat.v1.variable_scope(scope, 'Block35', [net], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 32, 1, scope='Conv2d_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1_0 = slim.conv2d(net, 32, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1_0, 32, 3, scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + tower_conv2_0 = slim.conv2d(net, 32, 1, scope='Conv2d_0a_1x1') + tower_conv2_1 = slim.conv2d(tower_conv2_0, 48, 3, scope='Conv2d_0b_3x3') + tower_conv2_2 = slim.conv2d(tower_conv2_1, 64, 3, scope='Conv2d_0c_3x3') + mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_1, tower_conv2_2]) + up = slim.conv2d(mixed, net.get_shape()[3], 1, normalizer_fn=None, + activation_fn=None, scope='Conv2d_1x1') + scaled_up = up * scale + if activation_fn == tf.nn.relu6: + # Use clip_by_value to simulate bandpass activation. + scaled_up = tf.clip_by_value(scaled_up, -6.0, 6.0) + + net += scaled_up + if activation_fn: + net = activation_fn(net) + return net + + +def block17(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): + """Builds the 17x17 resnet block.""" + with tf.compat.v1.variable_scope(scope, 'Block17', [net], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 192, 1, scope='Conv2d_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1_0 = slim.conv2d(net, 128, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1_0, 160, [1, 7], + scope='Conv2d_0b_1x7') + tower_conv1_2 = slim.conv2d(tower_conv1_1, 192, [7, 1], + scope='Conv2d_0c_7x1') + mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2]) + up = slim.conv2d(mixed, net.get_shape()[3], 1, normalizer_fn=None, + activation_fn=None, scope='Conv2d_1x1') + + scaled_up = up * scale + if activation_fn == tf.nn.relu6: + # Use clip_by_value to simulate bandpass activation. + scaled_up = tf.clip_by_value(scaled_up, -6.0, 6.0) + + net += scaled_up + if activation_fn: + net = activation_fn(net) + return net + + +def block8(net, scale=1.0, activation_fn=tf.nn.relu, scope=None, reuse=None): + """Builds the 8x8 resnet block.""" + with tf.compat.v1.variable_scope(scope, 'Block8', [net], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 192, 1, scope='Conv2d_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1_0 = slim.conv2d(net, 192, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1_0, 224, [1, 3], + scope='Conv2d_0b_1x3') + tower_conv1_2 = slim.conv2d(tower_conv1_1, 256, [3, 1], + scope='Conv2d_0c_3x1') + mixed = tf.concat(axis=3, values=[tower_conv, tower_conv1_2]) + up = slim.conv2d(mixed, net.get_shape()[3], 1, normalizer_fn=None, + activation_fn=None, scope='Conv2d_1x1') + + scaled_up = up * scale + if activation_fn == tf.nn.relu6: + # Use clip_by_value to simulate bandpass activation. + scaled_up = tf.clip_by_value(scaled_up, -6.0, 6.0) + + net += scaled_up + if activation_fn: + net = activation_fn(net) + return net + + +def inception_resnet_v2_base(inputs, + final_endpoint='Conv2d_7b_1x1', + output_stride=16, + align_feature_maps=False, + scope=None, + activation_fn=tf.nn.relu): + """Inception model from http://arxiv.org/abs/1602.07261. + + Constructs an Inception Resnet v2 network from inputs to the given final + endpoint. This method can construct the network up to the final inception + block Conv2d_7b_1x1. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + final_endpoint: specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', 'MaxPool_5a_3x3', + 'Mixed_5b', 'Mixed_6a', 'PreAuxLogits', 'Mixed_7a', 'Conv2d_7b_1x1'] + output_stride: A scalar that specifies the requested ratio of input to + output spatial resolution. Only supports 8 and 16. + align_feature_maps: When true, changes all the VALID paddings in the network + to SAME padding so that the feature maps are aligned. + scope: Optional variable_scope. + activation_fn: Activation function for block scopes. + + Returns: + tensor_out: output tensor corresponding to the final_endpoint. + end_points: a set of activations for external use, for example summaries or + losses. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + or if the output_stride is not 8 or 16, or if the output_stride is 8 and + we request an end point after 'PreAuxLogits'. + """ + if output_stride != 8 and output_stride != 16: + raise ValueError('output_stride must be 8 or 16.') + + padding = 'SAME' if align_feature_maps else 'VALID' + + end_points = {} + + def add_and_check_final(name, net): + end_points[name] = net + return name == final_endpoint + + with tf.compat.v1.variable_scope(scope, 'InceptionResnetV2', [inputs]): + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='SAME'): + # 149 x 149 x 32 + net = slim.conv2d(inputs, 32, 3, stride=2, padding=padding, + scope='Conv2d_1a_3x3') + if add_and_check_final('Conv2d_1a_3x3', net): return net, end_points + + # 147 x 147 x 32 + net = slim.conv2d(net, 32, 3, padding=padding, + scope='Conv2d_2a_3x3') + if add_and_check_final('Conv2d_2a_3x3', net): return net, end_points + # 147 x 147 x 64 + net = slim.conv2d(net, 64, 3, scope='Conv2d_2b_3x3') + if add_and_check_final('Conv2d_2b_3x3', net): return net, end_points + # 73 x 73 x 64 + net = slim.max_pool2d(net, 3, stride=2, padding=padding, + scope='MaxPool_3a_3x3') + if add_and_check_final('MaxPool_3a_3x3', net): return net, end_points + # 73 x 73 x 80 + net = slim.conv2d(net, 80, 1, padding=padding, + scope='Conv2d_3b_1x1') + if add_and_check_final('Conv2d_3b_1x1', net): return net, end_points + # 71 x 71 x 192 + net = slim.conv2d(net, 192, 3, padding=padding, + scope='Conv2d_4a_3x3') + if add_and_check_final('Conv2d_4a_3x3', net): return net, end_points + # 35 x 35 x 192 + net = slim.max_pool2d(net, 3, stride=2, padding=padding, + scope='MaxPool_5a_3x3') + if add_and_check_final('MaxPool_5a_3x3', net): return net, end_points + + # 35 x 35 x 320 + with tf.compat.v1.variable_scope('Mixed_5b'): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 96, 1, scope='Conv2d_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1_0 = slim.conv2d(net, 48, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1_0, 64, 5, + scope='Conv2d_0b_5x5') + with tf.compat.v1.variable_scope('Branch_2'): + tower_conv2_0 = slim.conv2d(net, 64, 1, scope='Conv2d_0a_1x1') + tower_conv2_1 = slim.conv2d(tower_conv2_0, 96, 3, + scope='Conv2d_0b_3x3') + tower_conv2_2 = slim.conv2d(tower_conv2_1, 96, 3, + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + tower_pool = slim.avg_pool2d(net, 3, stride=1, padding='SAME', + scope='AvgPool_0a_3x3') + tower_pool_1 = slim.conv2d(tower_pool, 64, 1, + scope='Conv2d_0b_1x1') + net = tf.concat( + [tower_conv, tower_conv1_1, tower_conv2_2, tower_pool_1], 3) + + if add_and_check_final('Mixed_5b', net): return net, end_points + # TODO(alemi): Register intermediate endpoints + net = slim.repeat(net, 10, block35, scale=0.17, + activation_fn=activation_fn) + + # 17 x 17 x 1088 if output_stride == 8, + # 33 x 33 x 1088 if output_stride == 16 + use_atrous = output_stride == 8 + + with tf.compat.v1.variable_scope('Mixed_6a'): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 384, 3, stride=1 if use_atrous else 2, + padding=padding, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1_0 = slim.conv2d(net, 256, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1_0, 256, 3, + scope='Conv2d_0b_3x3') + tower_conv1_2 = slim.conv2d(tower_conv1_1, 384, 3, + stride=1 if use_atrous else 2, + padding=padding, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + tower_pool = slim.max_pool2d(net, 3, stride=1 if use_atrous else 2, + padding=padding, + scope='MaxPool_1a_3x3') + net = tf.concat([tower_conv, tower_conv1_2, tower_pool], 3) + + if add_and_check_final('Mixed_6a', net): return net, end_points + + # TODO(alemi): register intermediate endpoints + with slim.arg_scope([slim.conv2d], rate=2 if use_atrous else 1): + net = slim.repeat(net, 20, block17, scale=0.10, + activation_fn=activation_fn) + if add_and_check_final('PreAuxLogits', net): return net, end_points + + if output_stride == 8: + # TODO(gpapan): Properly support output_stride for the rest of the net. + raise ValueError('output_stride==8 is only supported up to the ' + 'PreAuxlogits end_point for now.') + + # 8 x 8 x 2080 + with tf.compat.v1.variable_scope('Mixed_7a'): + with tf.compat.v1.variable_scope('Branch_0'): + tower_conv = slim.conv2d(net, 256, 1, scope='Conv2d_0a_1x1') + tower_conv_1 = slim.conv2d(tower_conv, 384, 3, stride=2, + padding=padding, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + tower_conv1 = slim.conv2d(net, 256, 1, scope='Conv2d_0a_1x1') + tower_conv1_1 = slim.conv2d(tower_conv1, 288, 3, stride=2, + padding=padding, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + tower_conv2 = slim.conv2d(net, 256, 1, scope='Conv2d_0a_1x1') + tower_conv2_1 = slim.conv2d(tower_conv2, 288, 3, + scope='Conv2d_0b_3x3') + tower_conv2_2 = slim.conv2d(tower_conv2_1, 320, 3, stride=2, + padding=padding, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + tower_pool = slim.max_pool2d(net, 3, stride=2, + padding=padding, + scope='MaxPool_1a_3x3') + net = tf.concat( + [tower_conv_1, tower_conv1_1, tower_conv2_2, tower_pool], 3) + + if add_and_check_final('Mixed_7a', net): return net, end_points + + # TODO(alemi): register intermediate endpoints + net = slim.repeat(net, 9, block8, scale=0.20, activation_fn=activation_fn) + net = block8(net, activation_fn=None) + + # 8 x 8 x 1536 + net = slim.conv2d(net, 1536, 1, scope='Conv2d_7b_1x1') + if add_and_check_final('Conv2d_7b_1x1', net): return net, end_points + + raise ValueError('final_endpoint (%s) not recognized', final_endpoint) + + +def inception_resnet_v2(inputs, num_classes=1001, is_training=True, + dropout_keep_prob=0.8, + reuse=None, + scope='InceptionResnetV2', + create_aux_logits=True, + activation_fn=tf.nn.relu): + """Creates the Inception Resnet V2 model. + + Args: + inputs: a 4-D tensor of size [batch_size, height, width, 3]. + Dimension batch_size may be undefined. If create_aux_logits is false, + also height and width may be undefined. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + is_training: whether is training or not. + dropout_keep_prob: float, the fraction to keep before final layer. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + create_aux_logits: Whether to include the auxilliary logits. + activation_fn: Activation function for conv2d. + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the non-dropped-out input to the logits layer (if num_classes is 0 or + None). + end_points: the set of end_points from the inception model. + """ + end_points = {} + + with tf.compat.v1.variable_scope( + scope, 'InceptionResnetV2', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + + net, end_points = inception_resnet_v2_base(inputs, scope=scope, + activation_fn=activation_fn) + + if create_aux_logits and num_classes: + with tf.compat.v1.variable_scope('AuxLogits'): + aux = end_points['PreAuxLogits'] + aux = slim.avg_pool2d(aux, 5, stride=3, padding='VALID', + scope='Conv2d_1a_3x3') + aux = slim.conv2d(aux, 128, 1, scope='Conv2d_1b_1x1') + aux = slim.conv2d(aux, 768, aux.get_shape()[1:3], + padding='VALID', scope='Conv2d_2a_5x5') + aux = slim.flatten(aux) + aux = slim.fully_connected(aux, num_classes, activation_fn=None, + scope='Logits') + end_points['AuxLogits'] = aux + + with tf.compat.v1.variable_scope('Logits'): + # TODO(sguada,arnoegw): Consider adding a parameter global_pool which + # can be set to False to disable pooling here (as in resnet_*()). + kernel_size = net.get_shape()[1:3] + if kernel_size.is_fully_defined(): + net = slim.avg_pool2d(net, kernel_size, padding='VALID', + scope='AvgPool_1a_8x8') + else: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if not num_classes: + return net, end_points + net = slim.flatten(net) + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='Dropout') + end_points['PreLogitsFlatten'] = net + logits = slim.fully_connected(net, num_classes, activation_fn=None, + scope='Logits') + end_points['Logits'] = logits + end_points['Predictions'] = tf.nn.softmax(logits, name='Predictions') + + return logits, end_points +inception_resnet_v2.default_image_size = 299 + + +def inception_resnet_v2_arg_scope( + weight_decay=0.00004, + batch_norm_decay=0.9997, + batch_norm_epsilon=0.001, + activation_fn=tf.nn.relu, + batch_norm_updates_collections=tf.compat.v1.GraphKeys.UPDATE_OPS, + batch_norm_scale=False): + """Returns the scope with the default parameters for inception_resnet_v2. + + Args: + weight_decay: the weight decay for weights variables. + batch_norm_decay: decay for the moving average of batch_norm momentums. + batch_norm_epsilon: small float added to variance to avoid dividing by zero. + activation_fn: Activation function for conv2d. + batch_norm_updates_collections: Collection for the update ops for + batch norm. + batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the + activations in the batch normalization layer. + + Returns: + a arg_scope with the parameters needed for inception_resnet_v2. + """ + # Set weight_decay for weights in conv2d and fully_connected layers. + with slim.arg_scope([slim.conv2d, slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + biases_regularizer=slim.l2_regularizer(weight_decay)): + + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'updates_collections': batch_norm_updates_collections, + 'fused': None, # Use fused batch norm if possible. + 'scale': batch_norm_scale, + } + # Set activation_fn and parameters for batch_norm. + with slim.arg_scope([slim.conv2d], activation_fn=activation_fn, + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params) as scope: + return scope diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2_test.py new file mode 100644 index 0000000..348c44d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_resnet_v2_test.py @@ -0,0 +1,338 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.inception_resnet_v2.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception + + +class InceptionTest(tf.test.TestCase): + + def testBuildLogits(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, endpoints = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue('AuxLogits' in endpoints) + auxlogits = endpoints['AuxLogits'] + self.assertTrue( + auxlogits.op.name.startswith('InceptionResnetV2/AuxLogits')) + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildWithoutAuxLogits(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, endpoints = inception.inception_resnet_v2(inputs, num_classes, + create_aux_logits=False) + self.assertTrue('AuxLogits' not in endpoints) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildNoClasses(self): + batch_size = 5 + height, width = 299, 299 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, endpoints = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue('AuxLogits' not in endpoints) + self.assertTrue('Logits' not in endpoints) + self.assertTrue( + net.op.name.startswith('InceptionResnetV2/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 1536]) + + def testBuildEndPoints(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue('Logits' in end_points) + logits = end_points['Logits'] + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('AuxLogits' in end_points) + aux_logits = end_points['AuxLogits'] + self.assertListEqual(aux_logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_7b_1x1'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 8, 8, 1536]) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_resnet_v2_base(inputs) + self.assertTrue(net.op.name.startswith('InceptionResnetV2/Conv2d_7b_1x1')) + self.assertListEqual(net.get_shape().as_list(), + [batch_size, 8, 8, 1536]) + expected_endpoints = ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', + 'MaxPool_5a_3x3', 'Mixed_5b', 'Mixed_6a', + 'PreAuxLogits', 'Mixed_7a', 'Conv2d_7b_1x1'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + height, width = 299, 299 + endpoints = ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', + 'MaxPool_5a_3x3', 'Mixed_5b', 'Mixed_6a', + 'PreAuxLogits', 'Mixed_7a', 'Conv2d_7b_1x1'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = inception.inception_resnet_v2_base( + inputs, final_endpoint=endpoint) + if endpoint != 'PreAuxLogits': + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionResnetV2/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points.keys()) + + def testBuildAndCheckAllEndPointsUptoPreAuxLogits(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_resnet_v2_base( + inputs, final_endpoint='PreAuxLogits') + endpoints_shapes = {'Conv2d_1a_3x3': [5, 149, 149, 32], + 'Conv2d_2a_3x3': [5, 147, 147, 32], + 'Conv2d_2b_3x3': [5, 147, 147, 64], + 'MaxPool_3a_3x3': [5, 73, 73, 64], + 'Conv2d_3b_1x1': [5, 73, 73, 80], + 'Conv2d_4a_3x3': [5, 71, 71, 192], + 'MaxPool_5a_3x3': [5, 35, 35, 192], + 'Mixed_5b': [5, 35, 35, 320], + 'Mixed_6a': [5, 17, 17, 1088], + 'PreAuxLogits': [5, 17, 17, 1088] + } + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testBuildAndCheckAllEndPointsUptoPreAuxLogitsWithAlignedFeatureMaps(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_resnet_v2_base( + inputs, final_endpoint='PreAuxLogits', align_feature_maps=True) + endpoints_shapes = {'Conv2d_1a_3x3': [5, 150, 150, 32], + 'Conv2d_2a_3x3': [5, 150, 150, 32], + 'Conv2d_2b_3x3': [5, 150, 150, 64], + 'MaxPool_3a_3x3': [5, 75, 75, 64], + 'Conv2d_3b_1x1': [5, 75, 75, 80], + 'Conv2d_4a_3x3': [5, 75, 75, 192], + 'MaxPool_5a_3x3': [5, 38, 38, 192], + 'Mixed_5b': [5, 38, 38, 320], + 'Mixed_6a': [5, 19, 19, 1088], + 'PreAuxLogits': [5, 19, 19, 1088] + } + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testBuildAndCheckAllEndPointsUptoPreAuxLogitsWithOutputStrideEight(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_resnet_v2_base( + inputs, final_endpoint='PreAuxLogits', output_stride=8) + endpoints_shapes = {'Conv2d_1a_3x3': [5, 149, 149, 32], + 'Conv2d_2a_3x3': [5, 147, 147, 32], + 'Conv2d_2b_3x3': [5, 147, 147, 64], + 'MaxPool_3a_3x3': [5, 73, 73, 64], + 'Conv2d_3b_1x1': [5, 73, 73, 80], + 'Conv2d_4a_3x3': [5, 71, 71, 192], + 'MaxPool_5a_3x3': [5, 35, 35, 192], + 'Mixed_5b': [5, 35, 35, 320], + 'Mixed_6a': [5, 33, 33, 1088], + 'PreAuxLogits': [5, 33, 33, 1088] + } + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testVariablesSetDevice(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + # Force all Variables to reside on the device. + with tf.compat.v1.variable_scope('on_cpu'), tf.device('/cpu:0'): + inception.inception_resnet_v2(inputs, num_classes) + with tf.compat.v1.variable_scope('on_gpu'), tf.device('/gpu:0'): + inception.inception_resnet_v2(inputs, num_classes) + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_cpu'): + self.assertDeviceEqual(v.device, '/cpu:0') + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_gpu'): + self.assertDeviceEqual(v.device, '/gpu:0') + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 150, 150 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_7b_1x1'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 3, 3, 1536]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 330, 400 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_7b_1x1'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 8, 11, 1536]) + + def testGlobalPoolUnknownImageShape(self): + batch_size = 1 + height, width = 330, 400 + num_classes = 1000 + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder(tf.float32, (batch_size, None, None, 3)) + logits, end_points = inception.inception_resnet_v2( + inputs, num_classes, create_aux_logits=False) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_7b_1x1'] + images = tf.random.uniform((batch_size, height, width, 3)) + sess.run(tf.compat.v1.global_variables_initializer()) + logits_out, pre_pool_out = sess.run([logits, pre_pool], + {inputs: images.eval()}) + self.assertTupleEqual(logits_out.shape, (batch_size, num_classes)) + self.assertTupleEqual(pre_pool_out.shape, (batch_size, 8, 11, 1536)) + + def testUnknownBatchSize(self): + batch_size = 1 + height, width = 299, 299 + num_classes = 1000 + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = inception.inception_resnet_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionResnetV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 299, 299 + num_classes = 1000 + with self.test_session() as sess: + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = inception.inception_resnet_v2(eval_inputs, + num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 150, 150 + num_classes = 1000 + with self.test_session() as sess: + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + inception.inception_resnet_v2(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = inception.inception_resnet_v2(eval_inputs, + num_classes, + is_training=False, + reuse=True) + predictions = tf.argmax(input=logits, axis=1) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testNoBatchNormScaleByDefault(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with contrib_slim.arg_scope(inception.inception_resnet_v2_arg_scope()): + inception.inception_resnet_v2(inputs, num_classes, is_training=False) + + self.assertEqual(tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$'), []) + + def testBatchNormScale(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with contrib_slim.arg_scope( + inception.inception_resnet_v2_arg_scope(batch_norm_scale=True)): + inception.inception_resnet_v2(inputs, num_classes, is_training=False) + + gamma_names = set( + v.op.name + for v in tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$')) + self.assertGreater(len(gamma_names), 0) + for v in tf.compat.v1.global_variables('.*/BatchNorm/moving_mean:0$'): + self.assertIn(v.op.name[:-len('moving_mean')] + 'gamma', gamma_names) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_utils.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_utils.py new file mode 100644 index 0000000..493a684 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_utils.py @@ -0,0 +1,84 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains common code shared by all inception models. + +Usage of arg scope: + with slim.arg_scope(inception_arg_scope()): + logits, end_points = inception.inception_v3(images, num_classes, + is_training=is_training) + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def inception_arg_scope( + weight_decay=0.00004, + use_batch_norm=True, + batch_norm_decay=0.9997, + batch_norm_epsilon=0.001, + activation_fn=tf.nn.relu, + batch_norm_updates_collections=tf.compat.v1.GraphKeys.UPDATE_OPS, + batch_norm_scale=False): + """Defines the default arg scope for inception models. + + Args: + weight_decay: The weight decay to use for regularizing the model. + use_batch_norm: "If `True`, batch_norm is applied after each convolution. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + activation_fn: Activation function for conv2d. + batch_norm_updates_collections: Collection for the update ops for + batch norm. + batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the + activations in the batch normalization layer. + + Returns: + An `arg_scope` to use for the inception models. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + # collection containing update_ops. + 'updates_collections': batch_norm_updates_collections, + # use fused batch norm if possible. + 'fused': None, + 'scale': batch_norm_scale, + } + if use_batch_norm: + normalizer_fn = slim.batch_norm + normalizer_params = batch_norm_params + else: + normalizer_fn = None + normalizer_params = {} + # Set weight_decay for weights in Conv and FC layers. + with slim.arg_scope([slim.conv2d, slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay)): + with slim.arg_scope( + [slim.conv2d], + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=activation_fn, + normalizer_fn=normalizer_fn, + normalizer_params=normalizer_params) as sc: + return sc diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1.py new file mode 100644 index 0000000..b84104a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1.py @@ -0,0 +1,347 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for inception v1 classification network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception_utils + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) + + +def inception_v1_base(inputs, + final_endpoint='Mixed_5c', + include_root_block=True, + scope='InceptionV1'): + """Defines the Inception V1 base architecture. + + This architecture is defined in: + Going deeper with convolutions + Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, + Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich. + http://arxiv.org/pdf/1409.4842v1.pdf. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + final_endpoint: specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', + 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', 'Mixed_5c']. If + include_root_block is False, ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', + 'Conv2d_2b_1x1', 'Conv2d_2c_3x3', 'MaxPool_3a_3x3'] will not be available. + include_root_block: If True, include the convolution and max-pooling layers + before the inception modules. If False, excludes those layers. + scope: Optional variable_scope. + + Returns: + A dictionary from components of the network to the corresponding activation. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values. + """ + end_points = {} + with tf.compat.v1.variable_scope(scope, 'InceptionV1', [inputs]): + with slim.arg_scope( + [slim.conv2d, slim.fully_connected], + weights_initializer=trunc_normal(0.01)): + with slim.arg_scope([slim.conv2d, slim.max_pool2d], + stride=1, padding='SAME'): + net = inputs + if include_root_block: + end_point = 'Conv2d_1a_7x7' + net = slim.conv2d(inputs, 64, [7, 7], stride=2, scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + end_point = 'MaxPool_2a_3x3' + net = slim.max_pool2d(net, [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + end_point = 'Conv2d_2b_1x1' + net = slim.conv2d(net, 64, [1, 1], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + end_point = 'Conv2d_2c_3x3' + net = slim.conv2d(net, 192, [3, 3], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + end_point = 'MaxPool_3a_3x3' + net = slim.max_pool2d(net, [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + end_point = 'Mixed_3b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 64, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 96, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 128, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 16, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 32, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 32, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_3c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 128, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 128, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 192, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 32, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 96, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 64, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'MaxPool_4a_3x3' + net = slim.max_pool2d(net, [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_4b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 192, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 96, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 208, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 16, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 48, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 64, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_4c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 160, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 112, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 224, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 24, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 64, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 64, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_4d' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 128, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 128, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 256, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 24, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 64, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 64, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_4e' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 112, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 144, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 288, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 32, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 64, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 64, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_4f' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 256, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 160, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 320, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 32, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 128, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 128, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'MaxPool_5a_2x2' + net = slim.max_pool2d(net, [2, 2], stride=2, scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_5b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 256, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 160, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 320, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 32, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 128, [3, 3], scope='Conv2d_0a_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 128, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + + end_point = 'Mixed_5c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 384, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 192, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 384, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, 48, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 128, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 128, [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat( + axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if final_endpoint == end_point: return net, end_points + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def inception_v1(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.8, + prediction_fn=slim.softmax, + spatial_squeeze=True, + reuse=None, + scope='InceptionV1', + global_pool=False): + """Defines the Inception V1 architecture. + + This architecture is defined in: + + Going deeper with convolutions + Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, + Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, Andrew Rabinovich. + http://arxiv.org/pdf/1409.4842v1.pdf. + + The default image size used to train this network is 224x224. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + is_training: whether is training or not. + dropout_keep_prob: the percentage of activation values that are retained. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is of + shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + global_pool: Optional boolean flag to control the avgpooling before the + logits layer. If false or unset, pooling is done with a fixed window + that reduces default-sized inputs to 1x1, while larger inputs lead to + larger outputs. If true, any input size is pooled down to 1x1. + + Returns: + net: a Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the non-dropped-out input to the logits layer + if num_classes is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + """ + # Final pooling and prediction + with tf.compat.v1.variable_scope( + scope, 'InceptionV1', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + net, end_points = inception_v1_base(inputs, scope=scope) + with tf.compat.v1.variable_scope('Logits'): + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + else: + # Pooling with a fixed kernel size. + net = slim.avg_pool2d(net, [7, 7], stride=1, scope='AvgPool_0a_7x7') + end_points['AvgPool_0a_7x7'] = net + if not num_classes: + return net, end_points + net = slim.dropout(net, dropout_keep_prob, scope='Dropout_0b') + logits = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='Conv2d_0c_1x1') + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points +inception_v1.default_image_size = 224 + +inception_v1_arg_scope = inception_utils.inception_arg_scope diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1_test.py new file mode 100644 index 0000000..ce0fca4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v1_test.py @@ -0,0 +1,300 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for nets.inception_v1.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception + +slim = contrib_slim + + +class InceptionV1Test(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith( + 'InceptionV1/Logits/SpatialSqueeze')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_v1(inputs, num_classes) + self.assertTrue(net.op.name.startswith('InceptionV1/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 1024]) + self.assertFalse('Logits' in end_points) + self.assertFalse('Predictions' in end_points) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + mixed_6c, end_points = inception.inception_v1_base(inputs) + self.assertTrue(mixed_6c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_6c.get_shape().as_list(), + [batch_size, 7, 7, 1024]) + expected_endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', + 'Mixed_3c', 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', + 'Mixed_4d', 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', + 'Mixed_5b', 'Mixed_5c'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + height, width = 224, 224 + endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', + 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', + 'Mixed_5c'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = inception.inception_v1_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV1/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points.keys()) + + def testBuildAndCheckAllEndPointsUptoMixed5c(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v1_base(inputs, + final_endpoint='Mixed_5c') + endpoints_shapes = { + 'Conv2d_1a_7x7': [5, 112, 112, 64], + 'MaxPool_2a_3x3': [5, 56, 56, 64], + 'Conv2d_2b_1x1': [5, 56, 56, 64], + 'Conv2d_2c_3x3': [5, 56, 56, 192], + 'MaxPool_3a_3x3': [5, 28, 28, 192], + 'Mixed_3b': [5, 28, 28, 256], + 'Mixed_3c': [5, 28, 28, 480], + 'MaxPool_4a_3x3': [5, 14, 14, 480], + 'Mixed_4b': [5, 14, 14, 512], + 'Mixed_4c': [5, 14, 14, 512], + 'Mixed_4d': [5, 14, 14, 512], + 'Mixed_4e': [5, 14, 14, 528], + 'Mixed_4f': [5, 14, 14, 832], + 'MaxPool_5a_2x2': [5, 7, 7, 832], + 'Mixed_5b': [5, 7, 7, 832], + 'Mixed_5c': [5, 7, 7, 1024] + } + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testModelHasExpectedNumberOfParameters(self): + batch_size = 5 + height, width = 224, 224 + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope(inception.inception_v1_arg_scope()): + inception.inception_v1_base(inputs) + total_params, _ = slim.model_analyzer.analyze_vars( + slim.get_model_variables()) + self.assertAlmostEqual(5607184, total_params) + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 112, 112 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + mixed_5c, _ = inception.inception_v1_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 4, 4, 1024]) + + def testBuildBaseNetworkWithoutRootBlock(self): + batch_size = 5 + height, width = 28, 28 + channels = 192 + + inputs = tf.random.uniform((batch_size, height, width, channels)) + _, end_points = inception.inception_v1_base( + inputs, include_root_block=False) + endpoints_shapes = { + 'Mixed_3b': [5, 28, 28, 256], + 'Mixed_3c': [5, 28, 28, 480], + 'MaxPool_4a_3x3': [5, 14, 14, 480], + 'Mixed_4b': [5, 14, 14, 512], + 'Mixed_4c': [5, 14, 14, 512], + 'Mixed_4d': [5, 14, 14, 512], + 'Mixed_4e': [5, 14, 14, 528], + 'Mixed_4f': [5, 14, 14, 832], + 'MaxPool_5a_2x2': [5, 7, 7, 832], + 'Mixed_5b': [5, 7, 7, 832], + 'Mixed_5c': [5, 7, 7, 1024] + } + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_5c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 7, 7, 1024]) + + def testGlobalPoolUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 1 + height, width = 250, 300 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v1(inputs, num_classes, + global_pool=True) + self.assertTrue(logits.op.name.startswith('InceptionV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_5c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 8, 10, 1024]) + + def testUnknowBatchSize(self): + batch_size = 1 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = inception.inception_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = inception.inception_v1(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + inception.inception_v1(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = inception.inception_v1(eval_inputs, num_classes, reuse=True) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testLogitsNotSqueezed(self): + num_classes = 25 + images = tf.random.uniform([1, 224, 224, 3]) + logits, _ = inception.inception_v1(images, + num_classes=num_classes, + spatial_squeeze=False) + + with self.test_session() as sess: + tf.compat.v1.global_variables_initializer().run() + logits_out = sess.run(logits) + self.assertListEqual(list(logits_out.shape), [1, 1, 1, num_classes]) + + def testNoBatchNormScaleByDefault(self): + height, width = 224, 224 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope(inception.inception_v1_arg_scope()): + inception.inception_v1(inputs, num_classes, is_training=False) + + self.assertEqual(tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$'), []) + + def testBatchNormScale(self): + height, width = 224, 224 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope( + inception.inception_v1_arg_scope(batch_norm_scale=True)): + inception.inception_v1(inputs, num_classes, is_training=False) + + gamma_names = set( + v.op.name + for v in tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$')) + self.assertGreater(len(gamma_names), 0) + for v in tf.compat.v1.global_variables('.*/BatchNorm/moving_mean:0$'): + self.assertIn(v.op.name[:-len('moving_mean')] + 'gamma', gamma_names) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2.py new file mode 100644 index 0000000..859c901 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2.py @@ -0,0 +1,596 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for inception v2 classification network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception_utils + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) + + +def inception_v2_base(inputs, + final_endpoint='Mixed_5c', + min_depth=16, + depth_multiplier=1.0, + use_separable_conv=True, + data_format='NHWC', + include_root_block=True, + scope=None): + """Inception v2 (6a2). + + Constructs an Inception v2 network from inputs to the given final endpoint. + This method can construct the network up to the layer inception(5b) as + described in http://arxiv.org/abs/1502.03167. + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + final_endpoint: specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', 'Mixed_4a', + 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', 'Mixed_5a', 'Mixed_5b', + 'Mixed_5c']. If include_root_block is False, ['Conv2d_1a_7x7', + 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', 'Conv2d_2c_3x3', 'MaxPool_3a_3x3'] will + not be available. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + use_separable_conv: Use a separable convolution for the first layer + Conv2d_1a_7x7. If this is False, use a normal convolution instead. + data_format: Data format of the activations ('NHWC' or 'NCHW'). + include_root_block: If True, include the convolution and max-pooling layers + before the inception modules. If False, excludes those layers. + scope: Optional variable_scope. + + Returns: + tensor_out: output tensor corresponding to the final_endpoint. + end_points: a set of activations for external use, for example summaries or + losses. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + or depth_multiplier <= 0 + """ + + # end_points will collect relevant activations for external use, for example + # summaries or losses. + end_points = {} + + # Used to find thinned depths for each layer. + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + depth = lambda d: max(int(d * depth_multiplier), min_depth) + + if data_format != 'NHWC' and data_format != 'NCHW': + raise ValueError('data_format must be either NHWC or NCHW.') + if data_format == 'NCHW' and use_separable_conv: + raise ValueError( + 'separable convolution only supports NHWC layout. NCHW data format can' + ' only be used when use_separable_conv is False.' + ) + + concat_dim = 3 if data_format == 'NHWC' else 1 + with tf.compat.v1.variable_scope(scope, 'InceptionV2', [inputs]): + with slim.arg_scope( + [slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, + padding='SAME', + data_format=data_format): + + net = inputs + if include_root_block: + # Note that sizes in the comments below assume an input spatial size of + # 224x224, however, the inputs can be of any size greater 32x32. + + # 224 x 224 x 3 + end_point = 'Conv2d_1a_7x7' + + if use_separable_conv: + # depthwise_multiplier here is different from depth_multiplier. + # depthwise_multiplier determines the output channels of the initial + # depthwise conv (see docs for tf.nn.separable_conv2d), while + # depth_multiplier controls the # channels of the subsequent 1x1 + # convolution. Must have + # in_channels * depthwise_multipler <= out_channels + # so that the separable convolution is not overparameterized. + depthwise_multiplier = min(int(depth(64) / 3), 8) + net = slim.separable_conv2d( + inputs, + depth(64), [7, 7], + depth_multiplier=depthwise_multiplier, + stride=2, + padding='SAME', + weights_initializer=trunc_normal(1.0), + scope=end_point) + else: + # Use a normal convolution instead of a separable convolution. + net = slim.conv2d( + inputs, + depth(64), [7, 7], + stride=2, + weights_initializer=trunc_normal(1.0), + scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + # 112 x 112 x 64 + end_point = 'MaxPool_2a_3x3' + net = slim.max_pool2d(net, [3, 3], scope=end_point, stride=2) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + # 56 x 56 x 64 + end_point = 'Conv2d_2b_1x1' + net = slim.conv2d( + net, + depth(64), [1, 1], + scope=end_point, + weights_initializer=trunc_normal(0.1)) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + # 56 x 56 x 64 + end_point = 'Conv2d_2c_3x3' + net = slim.conv2d(net, depth(192), [3, 3], scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + # 56 x 56 x 192 + end_point = 'MaxPool_3a_3x3' + net = slim.max_pool2d(net, [3, 3], scope=end_point, stride=2) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + + # 28 x 28 x 192 + # Inception module. + end_point = 'Mixed_3b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(64), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(32), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 28 x 28 x 256 + end_point = 'Mixed_3c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(64), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 28 x 28 x 320 + end_point = 'Mixed_4a' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d( + net, depth(128), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_0 = slim.conv2d(branch_0, depth(160), [3, 3], stride=2, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d( + branch_1, depth(96), [3, 3], scope='Conv2d_0b_3x3') + branch_1 = slim.conv2d( + branch_1, depth(96), [3, 3], stride=2, scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d( + net, [3, 3], stride=2, scope='MaxPool_1a_3x3') + net = tf.concat(axis=concat_dim, values=[branch_0, branch_1, branch_2]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 14 x 14 x 576 + end_point = 'Mixed_4b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(224), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(64), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d( + branch_1, depth(96), [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(96), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(128), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(128), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(128), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 14 x 14 x 576 + end_point = 'Mixed_4c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(96), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(128), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(96), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(128), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(128), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(128), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 14 x 14 x 576 + end_point = 'Mixed_4d' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(160), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(128), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(160), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(128), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(160), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(160), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(96), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 14 x 14 x 576 + end_point = 'Mixed_4e' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(96), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(128), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(192), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(160), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(192), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(192), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(96), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 14 x 14 x 576 + end_point = 'Mixed_5a' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d( + net, depth(128), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_0 = slim.conv2d(branch_0, depth(192), [3, 3], stride=2, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(192), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(256), [3, 3], + scope='Conv2d_0b_3x3') + branch_1 = slim.conv2d(branch_1, depth(256), [3, 3], stride=2, + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d(net, [3, 3], stride=2, + scope='MaxPool_1a_3x3') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 7 x 7 x 1024 + end_point = 'Mixed_5b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(352), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(192), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(320), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(160), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(224), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(224), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(128), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 7 x 7 x 1024 + end_point = 'Mixed_5c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(352), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d( + net, depth(192), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(320), [3, 3], + scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d( + net, depth(192), [1, 1], + weights_initializer=trunc_normal(0.09), + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(224), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(224), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.max_pool2d(net, [3, 3], scope='MaxPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(128), [1, 1], + weights_initializer=trunc_normal(0.1), + scope='Conv2d_0b_1x1') + net = tf.concat( + axis=concat_dim, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def inception_v2(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.8, + min_depth=16, + depth_multiplier=1.0, + prediction_fn=slim.softmax, + spatial_squeeze=True, + reuse=None, + scope='InceptionV2', + global_pool=False): + """Inception v2 model for classification. + + Constructs an Inception v2 network for classification as described in + http://arxiv.org/abs/1502.03167. + + The default image size used to train this network is 224x224. + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + is_training: whether is training or not. + dropout_keep_prob: the percentage of activation values that are retained. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is of + shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + global_pool: Optional boolean flag to control the avgpooling before the + logits layer. If false or unset, pooling is done with a fixed window + that reduces default-sized inputs to 1x1, while larger inputs lead to + larger outputs. If true, any input size is pooled down to 1x1. + + Returns: + net: a Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the non-dropped-out input to the logits layer + if num_classes is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + or depth_multiplier <= 0 + """ + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + + # Final pooling and prediction + with tf.compat.v1.variable_scope( + scope, 'InceptionV2', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + net, end_points = inception_v2_base( + inputs, scope=scope, min_depth=min_depth, + depth_multiplier=depth_multiplier) + with tf.compat.v1.variable_scope('Logits'): + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + else: + # Pooling with a fixed kernel size. + kernel_size = _reduced_kernel_size_for_small_input(net, [7, 7]) + net = slim.avg_pool2d(net, kernel_size, padding='VALID', + scope='AvgPool_1a_{}x{}'.format(*kernel_size)) + end_points['AvgPool_1a'] = net + if not num_classes: + return net, end_points + # 1 x 1 x 1024 + net = slim.dropout(net, keep_prob=dropout_keep_prob, scope='Dropout_1b') + end_points['PreLogits'] = net + logits = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='Conv2d_1c_1x1') + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points +inception_v2.default_image_size = 224 + + +def _reduced_kernel_size_for_small_input(input_tensor, kernel_size): + """Define kernel size which is automatically reduced for small input. + + If the shape of the input images is unknown at graph construction time this + function assumes that the input images are is large enough. + + Args: + input_tensor: input tensor of size [batch_size, height, width, channels]. + kernel_size: desired kernel size of length 2: [kernel_height, kernel_width] + + Returns: + a tensor with the kernel size. + + TODO(jrru): Make this function work with unknown shapes. Theoretically, this + can be done with the code below. Problems are two-fold: (1) If the shape was + known, it will be lost. (2) inception.slim.ops._two_element_tuple cannot + handle tensors that define the kernel size. + shape = tf.shape(input_tensor) + return = tf.stack([tf.minimum(shape[1], kernel_size[0]), + tf.minimum(shape[2], kernel_size[1])]) + + """ + shape = input_tensor.get_shape().as_list() + if shape[1] is None or shape[2] is None: + kernel_size_out = kernel_size + else: + kernel_size_out = [min(shape[1], kernel_size[0]), + min(shape[2], kernel_size[1])] + return kernel_size_out + + +inception_v2_arg_scope = inception_utils.inception_arg_scope diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2_test.py new file mode 100644 index 0000000..089a64d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v2_test.py @@ -0,0 +1,412 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for nets.inception_v2.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception + +slim = contrib_slim + + +class InceptionV2Test(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith( + 'InceptionV2/Logits/SpatialSqueeze')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_v2(inputs, num_classes) + self.assertTrue(net.op.name.startswith('InceptionV2/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 1024]) + self.assertFalse('Logits' in end_points) + self.assertFalse('Predictions' in end_points) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + mixed_5c, end_points = inception.inception_v2_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV2/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 7, 7, 1024]) + expected_endpoints = ['Mixed_3b', 'Mixed_3c', 'Mixed_4a', 'Mixed_4b', + 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', 'Mixed_5a', + 'Mixed_5b', 'Mixed_5c', 'Conv2d_1a_7x7', + 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', 'Conv2d_2c_3x3', + 'MaxPool_3a_3x3'] + self.assertItemsEqual(list(end_points.keys()), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + height, width = 224, 224 + endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'Mixed_4a', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', + 'Mixed_5a', 'Mixed_5b', 'Mixed_5c'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = inception.inception_v2_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV2/' + endpoint)) + self.assertItemsEqual(endpoints[:index + 1], list(end_points.keys())) + + def testBuildAndCheckAllEndPointsUptoMixed5c(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v2_base(inputs, + final_endpoint='Mixed_5c') + endpoints_shapes = {'Mixed_3b': [batch_size, 28, 28, 256], + 'Mixed_3c': [batch_size, 28, 28, 320], + 'Mixed_4a': [batch_size, 14, 14, 576], + 'Mixed_4b': [batch_size, 14, 14, 576], + 'Mixed_4c': [batch_size, 14, 14, 576], + 'Mixed_4d': [batch_size, 14, 14, 576], + 'Mixed_4e': [batch_size, 14, 14, 576], + 'Mixed_5a': [batch_size, 7, 7, 1024], + 'Mixed_5b': [batch_size, 7, 7, 1024], + 'Mixed_5c': [batch_size, 7, 7, 1024], + 'Conv2d_1a_7x7': [batch_size, 112, 112, 64], + 'MaxPool_2a_3x3': [batch_size, 56, 56, 64], + 'Conv2d_2b_1x1': [batch_size, 56, 56, 64], + 'Conv2d_2c_3x3': [batch_size, 56, 56, 192], + 'MaxPool_3a_3x3': [batch_size, 28, 28, 192]} + self.assertItemsEqual( + list(endpoints_shapes.keys()), list(end_points.keys())) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testModelHasExpectedNumberOfParameters(self): + batch_size = 5 + height, width = 224, 224 + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope(inception.inception_v2_arg_scope()): + inception.inception_v2_base(inputs) + total_params, _ = slim.model_analyzer.analyze_vars( + slim.get_model_variables()) + self.assertAlmostEqual(10173112, total_params) + + def testBuildEndPointsWithDepthMultiplierLessThanOne(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v2(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv')] + + _, end_points_with_multiplier = inception.inception_v2( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=0.5) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(0.5 * original_depth, new_depth) + + def testBuildEndPointsWithDepthMultiplierGreaterThanOne(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v2(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv')] + + _, end_points_with_multiplier = inception.inception_v2( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=2.0) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(2.0 * original_depth, new_depth) + + def testRaiseValueErrorWithInvalidDepthMultiplier(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with self.assertRaises(ValueError): + _ = inception.inception_v2(inputs, num_classes, depth_multiplier=-0.1) + with self.assertRaises(ValueError): + _ = inception.inception_v2(inputs, num_classes, depth_multiplier=0.0) + + def testBuildEndPointsWithUseSeparableConvolutionFalse(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v2_base(inputs) + + endpoint_keys = [ + key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv') + ] + + _, end_points_with_replacement = inception.inception_v2_base( + inputs, use_separable_conv=False) + + # The endpoint shapes must be equal to the original shape even when the + # separable convolution is replaced with a normal convolution. + for key in endpoint_keys: + original_shape = end_points[key].get_shape().as_list() + self.assertTrue(key in end_points_with_replacement) + new_shape = end_points_with_replacement[key].get_shape().as_list() + self.assertListEqual(original_shape, new_shape) + + def testBuildEndPointsNCHWDataFormat(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v2_base(inputs) + + endpoint_keys = [ + key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv') + ] + + inputs_in_nchw = tf.random.uniform((batch_size, 3, height, width)) + _, end_points_with_replacement = inception.inception_v2_base( + inputs_in_nchw, use_separable_conv=False, data_format='NCHW') + + # With the 'NCHW' data format, all endpoint activations have a transposed + # shape from the original shape with the 'NHWC' layout. + for key in endpoint_keys: + transposed_original_shape = tf.transpose( + a=end_points[key], perm=[0, 3, 1, 2]).get_shape().as_list() + self.assertTrue(key in end_points_with_replacement) + new_shape = end_points_with_replacement[key].get_shape().as_list() + self.assertListEqual(transposed_original_shape, new_shape) + + def testBuildErrorsForDataFormats(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + + # 'NCWH' data format is not supported. + with self.assertRaises(ValueError): + _ = inception.inception_v2_base(inputs, data_format='NCWH') + + # 'NCHW' data format is not supported for separable convolution. + with self.assertRaises(ValueError): + _ = inception.inception_v2_base(inputs, data_format='NCHW') + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 112, 112 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_5c'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 4, 4, 1024]) + + def testBuildBaseNetworkWithoutRootBlock(self): + batch_size = 5 + height, width = 28, 28 + channels = 192 + + inputs = tf.random.uniform((batch_size, height, width, channels)) + _, end_points = inception.inception_v2_base( + inputs, include_root_block=False) + endpoints_shapes = { + 'Mixed_3b': [batch_size, 28, 28, 256], + 'Mixed_3c': [batch_size, 28, 28, 320], + 'Mixed_4a': [batch_size, 14, 14, 576], + 'Mixed_4b': [batch_size, 14, 14, 576], + 'Mixed_4c': [batch_size, 14, 14, 576], + 'Mixed_4d': [batch_size, 14, 14, 576], + 'Mixed_4e': [batch_size, 14, 14, 576], + 'Mixed_5a': [batch_size, 7, 7, 1024], + 'Mixed_5b': [batch_size, 7, 7, 1024], + 'Mixed_5c': [batch_size, 7, 7, 1024] + } + self.assertItemsEqual( + list(endpoints_shapes.keys()), list(end_points.keys())) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_5c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 7, 7, 1024]) + + def testGlobalPoolUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 1 + height, width = 250, 300 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v2(inputs, num_classes, + global_pool=True) + self.assertTrue(logits.op.name.startswith('InceptionV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_5c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 8, 10, 1024]) + + def testUnknowBatchSize(self): + batch_size = 1 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = inception.inception_v2(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV2/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = inception.inception_v2(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 150, 150 + num_classes = 1000 + + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + inception.inception_v2(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = inception.inception_v2(eval_inputs, num_classes, reuse=True) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testLogitsNotSqueezed(self): + num_classes = 25 + images = tf.random.uniform([1, 224, 224, 3]) + logits, _ = inception.inception_v2(images, + num_classes=num_classes, + spatial_squeeze=False) + + with self.test_session() as sess: + tf.compat.v1.global_variables_initializer().run() + logits_out = sess.run(logits) + self.assertListEqual(list(logits_out.shape), [1, 1, 1, num_classes]) + + def testNoBatchNormScaleByDefault(self): + height, width = 224, 224 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope(inception.inception_v2_arg_scope()): + inception.inception_v2(inputs, num_classes, is_training=False) + + self.assertEqual(tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$'), []) + + def testBatchNormScale(self): + height, width = 224, 224 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope( + inception.inception_v2_arg_scope(batch_norm_scale=True)): + inception.inception_v2(inputs, num_classes, is_training=False) + + gamma_names = set( + v.op.name + for v in tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$')) + self.assertGreater(len(gamma_names), 0) + for v in tf.compat.v1.global_variables('.*/BatchNorm/moving_mean:0$'): + self.assertIn(v.op.name[:-len('moving_mean')] + 'gamma', gamma_names) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3.py new file mode 100644 index 0000000..7c9fd7d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3.py @@ -0,0 +1,585 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for inception v3 classification network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception_utils + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) + + +def inception_v3_base(inputs, + final_endpoint='Mixed_7c', + min_depth=16, + depth_multiplier=1.0, + scope=None): + """Inception model from http://arxiv.org/abs/1512.00567. + + Constructs an Inception v3 network from inputs to the given final endpoint. + This method can construct the network up to the final inception block + Mixed_7c. + + Note that the names of the layers in the paper do not correspond to the names + of the endpoints registered by this function although they build the same + network. + + Here is a mapping from the old_names to the new names: + Old name | New name + ======================================= + conv0 | Conv2d_1a_3x3 + conv1 | Conv2d_2a_3x3 + conv2 | Conv2d_2b_3x3 + pool1 | MaxPool_3a_3x3 + conv3 | Conv2d_3b_1x1 + conv4 | Conv2d_4a_3x3 + pool2 | MaxPool_5a_3x3 + mixed_35x35x256a | Mixed_5b + mixed_35x35x288a | Mixed_5c + mixed_35x35x288b | Mixed_5d + mixed_17x17x768a | Mixed_6a + mixed_17x17x768b | Mixed_6b + mixed_17x17x768c | Mixed_6c + mixed_17x17x768d | Mixed_6d + mixed_17x17x768e | Mixed_6e + mixed_8x8x1280a | Mixed_7a + mixed_8x8x2048a | Mixed_7b + mixed_8x8x2048b | Mixed_7c + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + final_endpoint: specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', 'MaxPool_5a_3x3', + 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', + 'Mixed_6d', 'Mixed_6e', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c']. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + scope: Optional variable_scope. + + Returns: + tensor_out: output tensor corresponding to the final_endpoint. + end_points: a set of activations for external use, for example summaries or + losses. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + or depth_multiplier <= 0 + """ + # end_points will collect relevant activations for external use, for example + # summaries or losses. + end_points = {} + + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + depth = lambda d: max(int(d * depth_multiplier), min_depth) + + with tf.compat.v1.variable_scope(scope, 'InceptionV3', [inputs]): + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='VALID'): + # 299 x 299 x 3 + end_point = 'Conv2d_1a_3x3' + net = slim.conv2d(inputs, depth(32), [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 149 x 149 x 32 + end_point = 'Conv2d_2a_3x3' + net = slim.conv2d(net, depth(32), [3, 3], scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 147 x 147 x 32 + end_point = 'Conv2d_2b_3x3' + net = slim.conv2d(net, depth(64), [3, 3], padding='SAME', scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 147 x 147 x 64 + end_point = 'MaxPool_3a_3x3' + net = slim.max_pool2d(net, [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 73 x 73 x 64 + end_point = 'Conv2d_3b_1x1' + net = slim.conv2d(net, depth(80), [1, 1], scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 73 x 73 x 80. + end_point = 'Conv2d_4a_3x3' + net = slim.conv2d(net, depth(192), [3, 3], scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 71 x 71 x 192. + end_point = 'MaxPool_5a_3x3' + net = slim.max_pool2d(net, [3, 3], stride=2, scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # 35 x 35 x 192. + + # Inception blocks + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='SAME'): + # mixed: 35 x 35 x 256. + end_point = 'Mixed_5b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(48), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(64), [5, 5], + scope='Conv2d_0b_5x5') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(32), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_1: 35 x 35 x 288. + end_point = 'Mixed_5c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(48), [1, 1], scope='Conv2d_0b_1x1') + branch_1 = slim.conv2d(branch_1, depth(64), [5, 5], + scope='Conv_1_0c_5x5') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(64), [1, 1], + scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(64), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_2: 35 x 35 x 288. + end_point = 'Mixed_5d' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(48), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(64), [5, 5], + scope='Conv2d_0b_5x5') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, depth(96), [3, 3], + scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(64), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_3: 17 x 17 x 768. + end_point = 'Mixed_6a' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(384), [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(64), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(96), [3, 3], + scope='Conv2d_0b_3x3') + branch_1 = slim.conv2d(branch_1, depth(96), [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_1x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d(net, [3, 3], stride=2, padding='VALID', + scope='MaxPool_1a_3x3') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed4: 17 x 17 x 768. + end_point = 'Mixed_6b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(128), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(128), [1, 7], + scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, depth(192), [7, 1], + scope='Conv2d_0c_7x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(128), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(128), [7, 1], + scope='Conv2d_0b_7x1') + branch_2 = slim.conv2d(branch_2, depth(128), [1, 7], + scope='Conv2d_0c_1x7') + branch_2 = slim.conv2d(branch_2, depth(128), [7, 1], + scope='Conv2d_0d_7x1') + branch_2 = slim.conv2d(branch_2, depth(192), [1, 7], + scope='Conv2d_0e_1x7') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(192), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_5: 17 x 17 x 768. + end_point = 'Mixed_6c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(160), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(160), [1, 7], + scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, depth(192), [7, 1], + scope='Conv2d_0c_7x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(160), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(160), [7, 1], + scope='Conv2d_0b_7x1') + branch_2 = slim.conv2d(branch_2, depth(160), [1, 7], + scope='Conv2d_0c_1x7') + branch_2 = slim.conv2d(branch_2, depth(160), [7, 1], + scope='Conv2d_0d_7x1') + branch_2 = slim.conv2d(branch_2, depth(192), [1, 7], + scope='Conv2d_0e_1x7') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(192), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # mixed_6: 17 x 17 x 768. + end_point = 'Mixed_6d' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(160), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(160), [1, 7], + scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, depth(192), [7, 1], + scope='Conv2d_0c_7x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(160), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(160), [7, 1], + scope='Conv2d_0b_7x1') + branch_2 = slim.conv2d(branch_2, depth(160), [1, 7], + scope='Conv2d_0c_1x7') + branch_2 = slim.conv2d(branch_2, depth(160), [7, 1], + scope='Conv2d_0d_7x1') + branch_2 = slim.conv2d(branch_2, depth(192), [1, 7], + scope='Conv2d_0e_1x7') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(192), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_7: 17 x 17 x 768. + end_point = 'Mixed_6e' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(192), [1, 7], + scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, depth(192), [7, 1], + scope='Conv2d_0c_7x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, depth(192), [7, 1], + scope='Conv2d_0b_7x1') + branch_2 = slim.conv2d(branch_2, depth(192), [1, 7], + scope='Conv2d_0c_1x7') + branch_2 = slim.conv2d(branch_2, depth(192), [7, 1], + scope='Conv2d_0d_7x1') + branch_2 = slim.conv2d(branch_2, depth(192), [1, 7], + scope='Conv2d_0e_1x7') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, depth(192), [1, 1], + scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_8: 8 x 8 x 1280. + end_point = 'Mixed_7a' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + branch_0 = slim.conv2d(branch_0, depth(320), [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(192), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, depth(192), [1, 7], + scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, depth(192), [7, 1], + scope='Conv2d_0c_7x1') + branch_1 = slim.conv2d(branch_1, depth(192), [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d(net, [3, 3], stride=2, padding='VALID', + scope='MaxPool_1a_3x3') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + # mixed_9: 8 x 8 x 2048. + end_point = 'Mixed_7b' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(320), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(384), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = tf.concat(axis=3, values=[ + slim.conv2d(branch_1, depth(384), [1, 3], scope='Conv2d_0b_1x3'), + slim.conv2d(branch_1, depth(384), [3, 1], scope='Conv2d_0b_3x1')]) + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(448), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d( + branch_2, depth(384), [3, 3], scope='Conv2d_0b_3x3') + branch_2 = tf.concat(axis=3, values=[ + slim.conv2d(branch_2, depth(384), [1, 3], scope='Conv2d_0c_1x3'), + slim.conv2d(branch_2, depth(384), [3, 1], scope='Conv2d_0d_3x1')]) + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(192), [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + + # mixed_10: 8 x 8 x 2048. + end_point = 'Mixed_7c' + with tf.compat.v1.variable_scope(end_point): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, depth(320), [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, depth(384), [1, 1], scope='Conv2d_0a_1x1') + branch_1 = tf.concat(axis=3, values=[ + slim.conv2d(branch_1, depth(384), [1, 3], scope='Conv2d_0b_1x3'), + slim.conv2d(branch_1, depth(384), [3, 1], scope='Conv2d_0c_3x1')]) + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(net, depth(448), [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d( + branch_2, depth(384), [3, 3], scope='Conv2d_0b_3x3') + branch_2 = tf.concat(axis=3, values=[ + slim.conv2d(branch_2, depth(384), [1, 3], scope='Conv2d_0c_1x3'), + slim.conv2d(branch_2, depth(384), [3, 1], scope='Conv2d_0d_3x1')]) + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d( + branch_3, depth(192), [1, 1], scope='Conv2d_0b_1x1') + net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + end_points[end_point] = net + if end_point == final_endpoint: return net, end_points + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def inception_v3(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.8, + min_depth=16, + depth_multiplier=1.0, + prediction_fn=slim.softmax, + spatial_squeeze=True, + reuse=None, + create_aux_logits=True, + scope='InceptionV3', + global_pool=False): + """Inception model from http://arxiv.org/abs/1512.00567. + + "Rethinking the Inception Architecture for Computer Vision" + + Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, + Zbigniew Wojna. + + With the default arguments this method constructs the exact model defined in + the paper. However, one can experiment with variations of the inception_v3 + network by changing arguments dropout_keep_prob, min_depth and + depth_multiplier. + + The default image size used to train this network is 299x299. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + is_training: whether is training or not. + dropout_keep_prob: the percentage of activation values that are retained. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is of + shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + create_aux_logits: Whether to create the auxiliary logits. + scope: Optional variable_scope. + global_pool: Optional boolean flag to control the avgpooling before the + logits layer. If false or unset, pooling is done with a fixed window + that reduces default-sized inputs to 1x1, while larger inputs lead to + larger outputs. If true, any input size is pooled down to 1x1. + + Returns: + net: a Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the non-dropped-out input to the logits layer + if num_classes is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: if 'depth_multiplier' is less than or equal to zero. + """ + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + depth = lambda d: max(int(d * depth_multiplier), min_depth) + + with tf.compat.v1.variable_scope( + scope, 'InceptionV3', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + net, end_points = inception_v3_base( + inputs, scope=scope, min_depth=min_depth, + depth_multiplier=depth_multiplier) + + # Auxiliary Head logits + if create_aux_logits and num_classes: + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='SAME'): + aux_logits = end_points['Mixed_6e'] + with tf.compat.v1.variable_scope('AuxLogits'): + aux_logits = slim.avg_pool2d( + aux_logits, [5, 5], stride=3, padding='VALID', + scope='AvgPool_1a_5x5') + aux_logits = slim.conv2d(aux_logits, depth(128), [1, 1], + scope='Conv2d_1b_1x1') + + # Shape of feature map before the final layer. + kernel_size = _reduced_kernel_size_for_small_input( + aux_logits, [5, 5]) + aux_logits = slim.conv2d( + aux_logits, depth(768), kernel_size, + weights_initializer=trunc_normal(0.01), + padding='VALID', scope='Conv2d_2a_{}x{}'.format(*kernel_size)) + aux_logits = slim.conv2d( + aux_logits, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, weights_initializer=trunc_normal(0.001), + scope='Conv2d_2b_1x1') + if spatial_squeeze: + aux_logits = tf.squeeze(aux_logits, [1, 2], name='SpatialSqueeze') + end_points['AuxLogits'] = aux_logits + + # Final pooling and prediction + with tf.compat.v1.variable_scope('Logits'): + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='GlobalPool') + end_points['global_pool'] = net + else: + # Pooling with a fixed kernel size. + kernel_size = _reduced_kernel_size_for_small_input(net, [8, 8]) + net = slim.avg_pool2d(net, kernel_size, padding='VALID', + scope='AvgPool_1a_{}x{}'.format(*kernel_size)) + end_points['AvgPool_1a'] = net + if not num_classes: + return net, end_points + # 1 x 1 x 2048 + net = slim.dropout(net, keep_prob=dropout_keep_prob, scope='Dropout_1b') + end_points['PreLogits'] = net + # 2048 + logits = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='Conv2d_1c_1x1') + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + # 1000 + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points +inception_v3.default_image_size = 299 + + +def _reduced_kernel_size_for_small_input(input_tensor, kernel_size): + """Define kernel size which is automatically reduced for small input. + + If the shape of the input images is unknown at graph construction time this + function assumes that the input images are is large enough. + + Args: + input_tensor: input tensor of size [batch_size, height, width, channels]. + kernel_size: desired kernel size of length 2: [kernel_height, kernel_width] + + Returns: + a tensor with the kernel size. + + TODO(jrru): Make this function work with unknown shapes. Theoretically, this + can be done with the code below. Problems are two-fold: (1) If the shape was + known, it will be lost. (2) inception.slim.ops._two_element_tuple cannot + handle tensors that define the kernel size. + shape = tf.shape(input_tensor) + return = tf.stack([tf.minimum(shape[1], kernel_size[0]), + tf.minimum(shape[2], kernel_size[1])]) + + """ + shape = input_tensor.get_shape().as_list() + if shape[1] is None or shape[2] is None: + kernel_size_out = kernel_size + else: + kernel_size_out = [min(shape[1], kernel_size[0]), + min(shape[2], kernel_size[1])] + return kernel_size_out + + +inception_v3_arg_scope = inception_utils.inception_arg_scope diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3_test.py new file mode 100644 index 0000000..1bc2c13 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v3_test.py @@ -0,0 +1,350 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for nets.inception_v1.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception + +slim = contrib_slim + + +class InceptionV3Test(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v3(inputs, num_classes) + self.assertTrue(logits.op.name.startswith( + 'InceptionV3/Logits/SpatialSqueeze')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsNetwork(self): + batch_size = 5 + height, width = 299, 299 + num_classes = None + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_v3(inputs, num_classes) + self.assertTrue(net.op.name.startswith('InceptionV3/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 2048]) + self.assertFalse('Logits' in end_points) + self.assertFalse('Predictions' in end_points) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + final_endpoint, end_points = inception.inception_v3_base(inputs) + self.assertTrue(final_endpoint.op.name.startswith( + 'InceptionV3/Mixed_7c')) + self.assertListEqual(final_endpoint.get_shape().as_list(), + [batch_size, 8, 8, 2048]) + expected_endpoints = ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', + 'MaxPool_5a_3x3', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', + 'Mixed_6e', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + height, width = 299, 299 + endpoints = ['Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'MaxPool_3a_3x3', 'Conv2d_3b_1x1', 'Conv2d_4a_3x3', + 'MaxPool_5a_3x3', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', + 'Mixed_6e', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c'] + + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = inception.inception_v3_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV3/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points.keys()) + + def testBuildAndCheckAllEndPointsUptoMixed7c(self): + batch_size = 5 + height, width = 299, 299 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v3_base( + inputs, final_endpoint='Mixed_7c') + endpoints_shapes = {'Conv2d_1a_3x3': [batch_size, 149, 149, 32], + 'Conv2d_2a_3x3': [batch_size, 147, 147, 32], + 'Conv2d_2b_3x3': [batch_size, 147, 147, 64], + 'MaxPool_3a_3x3': [batch_size, 73, 73, 64], + 'Conv2d_3b_1x1': [batch_size, 73, 73, 80], + 'Conv2d_4a_3x3': [batch_size, 71, 71, 192], + 'MaxPool_5a_3x3': [batch_size, 35, 35, 192], + 'Mixed_5b': [batch_size, 35, 35, 256], + 'Mixed_5c': [batch_size, 35, 35, 288], + 'Mixed_5d': [batch_size, 35, 35, 288], + 'Mixed_6a': [batch_size, 17, 17, 768], + 'Mixed_6b': [batch_size, 17, 17, 768], + 'Mixed_6c': [batch_size, 17, 17, 768], + 'Mixed_6d': [batch_size, 17, 17, 768], + 'Mixed_6e': [batch_size, 17, 17, 768], + 'Mixed_7a': [batch_size, 8, 8, 1280], + 'Mixed_7b': [batch_size, 8, 8, 2048], + 'Mixed_7c': [batch_size, 8, 8, 2048]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testModelHasExpectedNumberOfParameters(self): + batch_size = 5 + height, width = 299, 299 + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope(inception.inception_v3_arg_scope()): + inception.inception_v3_base(inputs) + total_params, _ = slim.model_analyzer.analyze_vars( + slim.get_model_variables()) + self.assertAlmostEqual(21802784, total_params) + + def testBuildEndPoints(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v3(inputs, num_classes) + self.assertTrue('Logits' in end_points) + logits = end_points['Logits'] + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('AuxLogits' in end_points) + aux_logits = end_points['AuxLogits'] + self.assertListEqual(aux_logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Mixed_7c' in end_points) + pre_pool = end_points['Mixed_7c'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 8, 8, 2048]) + self.assertTrue('PreLogits' in end_points) + pre_logits = end_points['PreLogits'] + self.assertListEqual(pre_logits.get_shape().as_list(), + [batch_size, 1, 1, 2048]) + + def testBuildEndPointsWithDepthMultiplierLessThanOne(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v3(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv')] + + _, end_points_with_multiplier = inception.inception_v3( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=0.5) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(0.5 * original_depth, new_depth) + + def testBuildEndPointsWithDepthMultiplierGreaterThanOne(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v3(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv')] + + _, end_points_with_multiplier = inception.inception_v3( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=2.0) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(2.0 * original_depth, new_depth) + + def testRaiseValueErrorWithInvalidDepthMultiplier(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with self.assertRaises(ValueError): + _ = inception.inception_v3(inputs, num_classes, depth_multiplier=-0.1) + with self.assertRaises(ValueError): + _ = inception.inception_v3(inputs, num_classes, depth_multiplier=0.0) + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 150, 150 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v3(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV3/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7c'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 3, 3, 2048]) + + def testUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 2 + height, width = 299, 299 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v3(inputs, num_classes) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 8, 8, 2048]) + + def testGlobalPoolUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 1 + height, width = 330, 400 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = inception.inception_v3(inputs, num_classes, + global_pool=True) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7c'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 8, 11, 2048]) + + def testUnknowBatchSize(self): + batch_size = 1 + height, width = 299, 299 + num_classes = 1000 + + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = inception.inception_v3(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV3/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 299, 299 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = inception.inception_v3(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 150, 150 + num_classes = 1000 + + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + inception.inception_v3(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = inception.inception_v3(eval_inputs, num_classes, + is_training=False, reuse=True) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testLogitsNotSqueezed(self): + num_classes = 25 + images = tf.random.uniform([1, 299, 299, 3]) + logits, _ = inception.inception_v3(images, + num_classes=num_classes, + spatial_squeeze=False) + + with self.test_session() as sess: + tf.compat.v1.global_variables_initializer().run() + logits_out = sess.run(logits) + self.assertListEqual(list(logits_out.shape), [1, 1, 1, num_classes]) + + def testNoBatchNormScaleByDefault(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope(inception.inception_v3_arg_scope()): + inception.inception_v3(inputs, num_classes, is_training=False) + + self.assertEqual(tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$'), []) + + def testBatchNormScale(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with slim.arg_scope( + inception.inception_v3_arg_scope(batch_norm_scale=True)): + inception.inception_v3(inputs, num_classes, is_training=False) + + gamma_names = set( + v.op.name + for v in tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$')) + self.assertGreater(len(gamma_names), 0) + for v in tf.compat.v1.global_variables('.*/BatchNorm/moving_mean:0$'): + self.assertIn(v.op.name[:-len('moving_mean')] + 'gamma', gamma_names) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4.py new file mode 100644 index 0000000..7c6678c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4.py @@ -0,0 +1,347 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition of the Inception V4 architecture. + +As described in http://arxiv.org/abs/1602.07261. + + Inception-v4, Inception-ResNet and the Impact of Residual Connections + on Learning + Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception_utils + +slim = contrib_slim + + +def block_inception_a(inputs, scope=None, reuse=None): + """Builds Inception-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + with slim.arg_scope([slim.conv2d, slim.avg_pool2d, slim.max_pool2d], + stride=1, padding='SAME'): + with tf.compat.v1.variable_scope( + scope, 'BlockInceptionA', [inputs], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(inputs, 96, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(inputs, 64, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 96, [3, 3], scope='Conv2d_0b_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(inputs, 64, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 96, [3, 3], scope='Conv2d_0b_3x3') + branch_2 = slim.conv2d(branch_2, 96, [3, 3], scope='Conv2d_0c_3x3') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(inputs, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 96, [1, 1], scope='Conv2d_0b_1x1') + return tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + + +def block_reduction_a(inputs, scope=None, reuse=None): + """Builds Reduction-A block for Inception v4 network.""" + # By default use stride=1 and SAME padding + with slim.arg_scope([slim.conv2d, slim.avg_pool2d, slim.max_pool2d], + stride=1, padding='SAME'): + with tf.compat.v1.variable_scope( + scope, 'BlockReductionA', [inputs], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(inputs, 384, [3, 3], stride=2, padding='VALID', + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(inputs, 192, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 224, [3, 3], scope='Conv2d_0b_3x3') + branch_1 = slim.conv2d(branch_1, 256, [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d(inputs, [3, 3], stride=2, padding='VALID', + scope='MaxPool_1a_3x3') + return tf.concat(axis=3, values=[branch_0, branch_1, branch_2]) + + +def block_inception_b(inputs, scope=None, reuse=None): + """Builds Inception-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + with slim.arg_scope([slim.conv2d, slim.avg_pool2d, slim.max_pool2d], + stride=1, padding='SAME'): + with tf.compat.v1.variable_scope( + scope, 'BlockInceptionB', [inputs], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(inputs, 384, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(inputs, 192, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 224, [1, 7], scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, 256, [7, 1], scope='Conv2d_0c_7x1') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(inputs, 192, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 192, [7, 1], scope='Conv2d_0b_7x1') + branch_2 = slim.conv2d(branch_2, 224, [1, 7], scope='Conv2d_0c_1x7') + branch_2 = slim.conv2d(branch_2, 224, [7, 1], scope='Conv2d_0d_7x1') + branch_2 = slim.conv2d(branch_2, 256, [1, 7], scope='Conv2d_0e_1x7') + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(inputs, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 128, [1, 1], scope='Conv2d_0b_1x1') + return tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + + +def block_reduction_b(inputs, scope=None, reuse=None): + """Builds Reduction-B block for Inception v4 network.""" + # By default use stride=1 and SAME padding + with slim.arg_scope([slim.conv2d, slim.avg_pool2d, slim.max_pool2d], + stride=1, padding='SAME'): + with tf.compat.v1.variable_scope( + scope, 'BlockReductionB', [inputs], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(inputs, 192, [1, 1], scope='Conv2d_0a_1x1') + branch_0 = slim.conv2d(branch_0, 192, [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(inputs, 256, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 256, [1, 7], scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, 320, [7, 1], scope='Conv2d_0c_7x1') + branch_1 = slim.conv2d(branch_1, 320, [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.max_pool2d(inputs, [3, 3], stride=2, padding='VALID', + scope='MaxPool_1a_3x3') + return tf.concat(axis=3, values=[branch_0, branch_1, branch_2]) + + +def block_inception_c(inputs, scope=None, reuse=None): + """Builds Inception-C block for Inception v4 network.""" + # By default use stride=1 and SAME padding + with slim.arg_scope([slim.conv2d, slim.avg_pool2d, slim.max_pool2d], + stride=1, padding='SAME'): + with tf.compat.v1.variable_scope( + scope, 'BlockInceptionC', [inputs], reuse=reuse): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(inputs, 256, [1, 1], scope='Conv2d_0a_1x1') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(inputs, 384, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = tf.concat(axis=3, values=[ + slim.conv2d(branch_1, 256, [1, 3], scope='Conv2d_0b_1x3'), + slim.conv2d(branch_1, 256, [3, 1], scope='Conv2d_0c_3x1')]) + with tf.compat.v1.variable_scope('Branch_2'): + branch_2 = slim.conv2d(inputs, 384, [1, 1], scope='Conv2d_0a_1x1') + branch_2 = slim.conv2d(branch_2, 448, [3, 1], scope='Conv2d_0b_3x1') + branch_2 = slim.conv2d(branch_2, 512, [1, 3], scope='Conv2d_0c_1x3') + branch_2 = tf.concat(axis=3, values=[ + slim.conv2d(branch_2, 256, [1, 3], scope='Conv2d_0d_1x3'), + slim.conv2d(branch_2, 256, [3, 1], scope='Conv2d_0e_3x1')]) + with tf.compat.v1.variable_scope('Branch_3'): + branch_3 = slim.avg_pool2d(inputs, [3, 3], scope='AvgPool_0a_3x3') + branch_3 = slim.conv2d(branch_3, 256, [1, 1], scope='Conv2d_0b_1x1') + return tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3]) + + +def inception_v4_base(inputs, final_endpoint='Mixed_7d', scope=None): + """Creates the Inception V4 network up to the given final endpoint. + + Args: + inputs: a 4-D tensor of size [batch_size, height, width, 3]. + final_endpoint: specifies the endpoint to construct the network up to. + It can be one of [ 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', + 'Mixed_3a', 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', 'Mixed_6e', + 'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', 'Mixed_7b', 'Mixed_7c', + 'Mixed_7d'] + scope: Optional variable_scope. + + Returns: + logits: the logits outputs of the model. + end_points: the set of end_points from the inception model. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + """ + end_points = {} + + def add_and_check_final(name, net): + end_points[name] = net + return name == final_endpoint + + with tf.compat.v1.variable_scope(scope, 'InceptionV4', [inputs]): + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='SAME'): + # 299 x 299 x 3 + net = slim.conv2d(inputs, 32, [3, 3], stride=2, + padding='VALID', scope='Conv2d_1a_3x3') + if add_and_check_final('Conv2d_1a_3x3', net): return net, end_points + # 149 x 149 x 32 + net = slim.conv2d(net, 32, [3, 3], padding='VALID', + scope='Conv2d_2a_3x3') + if add_and_check_final('Conv2d_2a_3x3', net): return net, end_points + # 147 x 147 x 32 + net = slim.conv2d(net, 64, [3, 3], scope='Conv2d_2b_3x3') + if add_and_check_final('Conv2d_2b_3x3', net): return net, end_points + # 147 x 147 x 64 + with tf.compat.v1.variable_scope('Mixed_3a'): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.max_pool2d(net, [3, 3], stride=2, padding='VALID', + scope='MaxPool_0a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 96, [3, 3], stride=2, padding='VALID', + scope='Conv2d_0a_3x3') + net = tf.concat(axis=3, values=[branch_0, branch_1]) + if add_and_check_final('Mixed_3a', net): return net, end_points + + # 73 x 73 x 160 + with tf.compat.v1.variable_scope('Mixed_4a'): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 64, [1, 1], scope='Conv2d_0a_1x1') + branch_0 = slim.conv2d(branch_0, 96, [3, 3], padding='VALID', + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.conv2d(net, 64, [1, 1], scope='Conv2d_0a_1x1') + branch_1 = slim.conv2d(branch_1, 64, [1, 7], scope='Conv2d_0b_1x7') + branch_1 = slim.conv2d(branch_1, 64, [7, 1], scope='Conv2d_0c_7x1') + branch_1 = slim.conv2d(branch_1, 96, [3, 3], padding='VALID', + scope='Conv2d_1a_3x3') + net = tf.concat(axis=3, values=[branch_0, branch_1]) + if add_and_check_final('Mixed_4a', net): return net, end_points + + # 71 x 71 x 192 + with tf.compat.v1.variable_scope('Mixed_5a'): + with tf.compat.v1.variable_scope('Branch_0'): + branch_0 = slim.conv2d(net, 192, [3, 3], stride=2, padding='VALID', + scope='Conv2d_1a_3x3') + with tf.compat.v1.variable_scope('Branch_1'): + branch_1 = slim.max_pool2d(net, [3, 3], stride=2, padding='VALID', + scope='MaxPool_1a_3x3') + net = tf.concat(axis=3, values=[branch_0, branch_1]) + if add_and_check_final('Mixed_5a', net): return net, end_points + + # 35 x 35 x 384 + # 4 x Inception-A blocks + for idx in range(4): + block_scope = 'Mixed_5' + chr(ord('b') + idx) + net = block_inception_a(net, block_scope) + if add_and_check_final(block_scope, net): return net, end_points + + # 35 x 35 x 384 + # Reduction-A block + net = block_reduction_a(net, 'Mixed_6a') + if add_and_check_final('Mixed_6a', net): return net, end_points + + # 17 x 17 x 1024 + # 7 x Inception-B blocks + for idx in range(7): + block_scope = 'Mixed_6' + chr(ord('b') + idx) + net = block_inception_b(net, block_scope) + if add_and_check_final(block_scope, net): return net, end_points + + # 17 x 17 x 1024 + # Reduction-B block + net = block_reduction_b(net, 'Mixed_7a') + if add_and_check_final('Mixed_7a', net): return net, end_points + + # 8 x 8 x 1536 + # 3 x Inception-C blocks + for idx in range(3): + block_scope = 'Mixed_7' + chr(ord('b') + idx) + net = block_inception_c(net, block_scope) + if add_and_check_final(block_scope, net): return net, end_points + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def inception_v4(inputs, num_classes=1001, is_training=True, + dropout_keep_prob=0.8, + reuse=None, + scope='InceptionV4', + create_aux_logits=True): + """Creates the Inception V4 model. + + Args: + inputs: a 4-D tensor of size [batch_size, height, width, 3]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + is_training: whether is training or not. + dropout_keep_prob: float, the fraction to keep before final layer. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + create_aux_logits: Whether to include the auxiliary logits. + + Returns: + net: a Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the non-dropped input to the logits layer + if num_classes is 0 or None. + end_points: the set of end_points from the inception model. + """ + end_points = {} + with tf.compat.v1.variable_scope( + scope, 'InceptionV4', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + net, end_points = inception_v4_base(inputs, scope=scope) + + with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d], + stride=1, padding='SAME'): + # Auxiliary Head logits + if create_aux_logits and num_classes: + with tf.compat.v1.variable_scope('AuxLogits'): + # 17 x 17 x 1024 + aux_logits = end_points['Mixed_6h'] + aux_logits = slim.avg_pool2d(aux_logits, [5, 5], stride=3, + padding='VALID', + scope='AvgPool_1a_5x5') + aux_logits = slim.conv2d(aux_logits, 128, [1, 1], + scope='Conv2d_1b_1x1') + aux_logits = slim.conv2d(aux_logits, 768, + aux_logits.get_shape()[1:3], + padding='VALID', scope='Conv2d_2a') + aux_logits = slim.flatten(aux_logits) + aux_logits = slim.fully_connected(aux_logits, num_classes, + activation_fn=None, + scope='Aux_logits') + end_points['AuxLogits'] = aux_logits + + # Final pooling and prediction + # TODO(sguada,arnoegw): Consider adding a parameter global_pool which + # can be set to False to disable pooling here (as in resnet_*()). + with tf.compat.v1.variable_scope('Logits'): + # 8 x 8 x 1536 + kernel_size = net.get_shape()[1:3] + if kernel_size.is_fully_defined(): + net = slim.avg_pool2d(net, kernel_size, padding='VALID', + scope='AvgPool_1a') + else: + net = tf.reduce_mean( + input_tensor=net, + axis=[1, 2], + keepdims=True, + name='global_pool') + end_points['global_pool'] = net + if not num_classes: + return net, end_points + # 1 x 1 x 1536 + net = slim.dropout(net, dropout_keep_prob, scope='Dropout_1b') + net = slim.flatten(net, scope='PreLogitsFlatten') + end_points['PreLogitsFlatten'] = net + # 1536 + logits = slim.fully_connected(net, num_classes, activation_fn=None, + scope='Logits') + end_points['Logits'] = logits + end_points['Predictions'] = tf.nn.softmax(logits, name='Predictions') + return logits, end_points +inception_v4.default_image_size = 299 + + +inception_v4_arg_scope = inception_utils.inception_arg_scope diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4_test.py new file mode 100644 index 0000000..bc8df47 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/inception_v4_test.py @@ -0,0 +1,287 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.inception_v4.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import inception + + +class InceptionTest(tf.test.TestCase): + + def testBuildLogits(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v4(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertTrue(auxlogits.op.name.startswith('InceptionV4/AuxLogits')) + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue(predictions.op.name.startswith( + 'InceptionV4/Logits/Predictions')) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsNetwork(self): + batch_size = 5 + height, width = 299, 299 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_v4(inputs, num_classes) + self.assertTrue(net.op.name.startswith('InceptionV4/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 1536]) + self.assertFalse('Logits' in end_points) + self.assertFalse('Predictions' in end_points) + + def testBuildWithoutAuxLogits(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, endpoints = inception.inception_v4(inputs, num_classes, + create_aux_logits=False) + self.assertFalse('AuxLogits' in endpoints) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testAllEndPointsShapes(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = inception.inception_v4(inputs, num_classes) + endpoints_shapes = {'Conv2d_1a_3x3': [batch_size, 149, 149, 32], + 'Conv2d_2a_3x3': [batch_size, 147, 147, 32], + 'Conv2d_2b_3x3': [batch_size, 147, 147, 64], + 'Mixed_3a': [batch_size, 73, 73, 160], + 'Mixed_4a': [batch_size, 71, 71, 192], + 'Mixed_5a': [batch_size, 35, 35, 384], + # 4 x Inception-A blocks + 'Mixed_5b': [batch_size, 35, 35, 384], + 'Mixed_5c': [batch_size, 35, 35, 384], + 'Mixed_5d': [batch_size, 35, 35, 384], + 'Mixed_5e': [batch_size, 35, 35, 384], + # Reduction-A block + 'Mixed_6a': [batch_size, 17, 17, 1024], + # 7 x Inception-B blocks + 'Mixed_6b': [batch_size, 17, 17, 1024], + 'Mixed_6c': [batch_size, 17, 17, 1024], + 'Mixed_6d': [batch_size, 17, 17, 1024], + 'Mixed_6e': [batch_size, 17, 17, 1024], + 'Mixed_6f': [batch_size, 17, 17, 1024], + 'Mixed_6g': [batch_size, 17, 17, 1024], + 'Mixed_6h': [batch_size, 17, 17, 1024], + # Reduction-A block + 'Mixed_7a': [batch_size, 8, 8, 1536], + # 3 x Inception-C blocks + 'Mixed_7b': [batch_size, 8, 8, 1536], + 'Mixed_7c': [batch_size, 8, 8, 1536], + 'Mixed_7d': [batch_size, 8, 8, 1536], + # Logits and predictions + 'AuxLogits': [batch_size, num_classes], + 'global_pool': [batch_size, 1, 1, 1536], + 'PreLogitsFlatten': [batch_size, 1536], + 'Logits': [batch_size, num_classes], + 'Predictions': [batch_size, num_classes]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 299, 299 + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = inception.inception_v4_base(inputs) + self.assertTrue(net.op.name.startswith( + 'InceptionV4/Mixed_7d')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 8, 8, 1536]) + expected_endpoints = [ + 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', 'Mixed_3a', + 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', + 'Mixed_6e', 'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', + 'Mixed_7b', 'Mixed_7c', 'Mixed_7d'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + for name, op in end_points.items(): + self.assertTrue(op.name.startswith('InceptionV4/' + name)) + + def testBuildOnlyUpToFinalEndpoint(self): + batch_size = 5 + height, width = 299, 299 + all_endpoints = [ + 'Conv2d_1a_3x3', 'Conv2d_2a_3x3', 'Conv2d_2b_3x3', 'Mixed_3a', + 'Mixed_4a', 'Mixed_5a', 'Mixed_5b', 'Mixed_5c', 'Mixed_5d', + 'Mixed_5e', 'Mixed_6a', 'Mixed_6b', 'Mixed_6c', 'Mixed_6d', + 'Mixed_6e', 'Mixed_6f', 'Mixed_6g', 'Mixed_6h', 'Mixed_7a', + 'Mixed_7b', 'Mixed_7c', 'Mixed_7d'] + for index, endpoint in enumerate(all_endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = inception.inception_v4_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV4/' + endpoint)) + self.assertItemsEqual(all_endpoints[:index+1], end_points.keys()) + + def testVariablesSetDevice(self): + batch_size = 5 + height, width = 299, 299 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + # Force all Variables to reside on the device. + with tf.compat.v1.variable_scope('on_cpu'), tf.device('/cpu:0'): + inception.inception_v4(inputs, num_classes) + with tf.compat.v1.variable_scope('on_gpu'), tf.device('/gpu:0'): + inception.inception_v4(inputs, num_classes) + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_cpu'): + self.assertDeviceEqual(v.device, '/cpu:0') + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_gpu'): + self.assertDeviceEqual(v.device, '/gpu:0') + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 150, 150 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v4(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7d'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 3, 3, 1536]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 350, 400 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = inception.inception_v4(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7d'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 9, 11, 1536]) + + def testGlobalPoolUnknownImageShape(self): + batch_size = 1 + height, width = 350, 400 + num_classes = 1000 + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder(tf.float32, (batch_size, None, None, 3)) + logits, end_points = inception.inception_v4( + inputs, num_classes, create_aux_logits=False) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Mixed_7d'] + images = tf.random.uniform((batch_size, height, width, 3)) + sess.run(tf.compat.v1.global_variables_initializer()) + logits_out, pre_pool_out = sess.run([logits, pre_pool], + {inputs: images.eval()}) + self.assertTupleEqual(logits_out.shape, (batch_size, num_classes)) + self.assertTupleEqual(pre_pool_out.shape, (batch_size, 9, 11, 1536)) + + def testUnknownBatchSize(self): + batch_size = 1 + height, width = 299, 299 + num_classes = 1000 + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = inception.inception_v4(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV4/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 299, 299 + num_classes = 1000 + with self.test_session() as sess: + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = inception.inception_v4(eval_inputs, + num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 150, 150 + num_classes = 1000 + with self.test_session() as sess: + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + inception.inception_v4(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = inception.inception_v4(eval_inputs, + num_classes, + is_training=False, + reuse=True) + predictions = tf.argmax(input=logits, axis=1) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testNoBatchNormScaleByDefault(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with contrib_slim.arg_scope(inception.inception_v4_arg_scope()): + inception.inception_v4(inputs, num_classes, is_training=False) + + self.assertEqual(tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$'), []) + + def testBatchNormScale(self): + height, width = 299, 299 + num_classes = 1000 + inputs = tf.compat.v1.placeholder(tf.float32, (1, height, width, 3)) + with contrib_slim.arg_scope( + inception.inception_v4_arg_scope(batch_norm_scale=True)): + inception.inception_v4(inputs, num_classes, is_training=False) + + gamma_names = set( + v.op.name + for v in tf.compat.v1.global_variables('.*/BatchNorm/gamma:0$')) + self.assertGreater(len(gamma_names), 0) + for v in tf.compat.v1.global_variables('.*/BatchNorm/moving_mean:0$'): + self.assertIn(v.op.name[:-len('moving_mean')] + 'gamma', gamma_names) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/lenet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/lenet.py new file mode 100644 index 0000000..9f269d2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/lenet.py @@ -0,0 +1,98 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains a variant of the LeNet model definition.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def lenet(images, num_classes=10, is_training=False, + dropout_keep_prob=0.5, + prediction_fn=slim.softmax, + scope='LeNet'): + """Creates a variant of the LeNet model. + + Note that since the output is a set of 'logits', the values fall in the + interval of (-infinity, infinity). Consequently, to convert the outputs to a + probability distribution over the characters, one will need to convert them + using the softmax function: + + logits = lenet.lenet(images, is_training=False) + probabilities = tf.nn.softmax(logits) + predictions = tf.argmax(logits, 1) + + Args: + images: A batch of `Tensors` of size [batch_size, height, width, channels]. + num_classes: the number of classes in the dataset. If 0 or None, the logits + layer is omitted and the input features to the logits layer are returned + instead. + is_training: specifies whether or not we're currently training the model. + This variable will determine the behaviour of the dropout layer. + dropout_keep_prob: the percentage of activation values that are retained. + prediction_fn: a function to get predictions out of logits. + scope: Optional variable_scope. + + Returns: + net: a 2D Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the inon-dropped-out nput to the logits layer + if num_classes is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + """ + end_points = {} + + with tf.compat.v1.variable_scope(scope, 'LeNet', [images]): + net = end_points['conv1'] = slim.conv2d(images, 32, [5, 5], scope='conv1') + net = end_points['pool1'] = slim.max_pool2d(net, [2, 2], 2, scope='pool1') + net = end_points['conv2'] = slim.conv2d(net, 64, [5, 5], scope='conv2') + net = end_points['pool2'] = slim.max_pool2d(net, [2, 2], 2, scope='pool2') + net = slim.flatten(net) + end_points['Flatten'] = net + + net = end_points['fc3'] = slim.fully_connected(net, 1024, scope='fc3') + if not num_classes: + return net, end_points + net = end_points['dropout3'] = slim.dropout( + net, dropout_keep_prob, is_training=is_training, scope='dropout3') + logits = end_points['Logits'] = slim.fully_connected( + net, num_classes, activation_fn=None, scope='fc4') + + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + + return logits, end_points +lenet.default_image_size = 28 + + +def lenet_arg_scope(weight_decay=0.0): + """Defines the default lenet argument scope. + + Args: + weight_decay: The weight decay to use for regularizing the model. + + Returns: + An `arg_scope` to use for the inception v3 model. + """ + with slim.arg_scope( + [slim.conv2d, slim.fully_connected], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=tf.compat.v1.truncated_normal_initializer(stddev=0.1), + activation_fn=tf.nn.relu) as sc: + return sc diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/encodings.xml b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/misc.xml b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/misc.xml new file mode 100644 index 0000000..65531ca --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/mobilenet.iml b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/mobilenet.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/mobilenet.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/modules.xml b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/modules.xml new file mode 100644 index 0000000..bdad2db --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/README.md new file mode 100644 index 0000000..677ece7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/README.md @@ -0,0 +1,166 @@ +# MobileNet + +This folder contains building code for +[MobileNetV2](https://arxiv.org/abs/1801.04381) and +[MobilenetV3](https://arxiv.org/abs/1905.02244) networks. The architectural +definition for each model is located in [mobilenet_v2.py](mobilenet_v2.py) and +[mobilenet_v3.py](mobilenet_v3.py) respectively. + +For MobilenetV1 please refer to this [page](../mobilenet_v1.md) + +We have also introduced a family of MobileNets customized for the Edge TPU +accelerator found in +[Google Pixel4](https://blog.google/products/pixel/pixel-4/) devices. The +architectural definition for MobileNetEdgeTPU is located in +[mobilenet_v3.py](mobilenet_v3.py) + +## Performance + +### Mobilenet V3 latency + +This is the timing of [MobileNetV2] vs [MobileNetV3] using TF-Lite on the large +core of Pixel 1 phone. + +![Mobilenet V2 and V3 Latency for Pixel 1.png](g3doc/latency_pixel1.png) + +### MACs + +MACs, also sometimes known as MADDs - the number of multiply-accumulates needed +to compute an inference on a single image is a common metric to measure the +efficiency of the model. Full size Mobilenet V3 on image size 224 uses ~215 +Million MADDs (MMadds) while achieving accuracy 75.1%, while Mobilenet V2 uses +~300MMadds and achieving accuracy 72%. By comparison ResNet-50 uses +approximately 3500 MMAdds while achieving 76% accuracy. + +Below is the graph comparing Mobilenets and a few selected networks. The size of +each blob represents the number of parameters. Note for +[ShuffleNet](https://arxiv.org/abs/1707.01083) there are no published size +numbers. We estimate it to be comparable to MobileNetV2 numbers. + +![madds_top1_accuracy](g3doc/madds_top1_accuracy.png) + +### Mobilenet EdgeTPU latency + +The figure below shows the Pixel 4 Edge TPU latency of int8-quantized Mobilenet +EdgeTPU compared with MobilenetV2 and the minimalistic variants of MobilenetV3 +(see below). + +![Mobilenet Edge TPU latency for Pixel 4 Edge TPU.png](g3doc/edgetpu_latency.png) + +## Pretrained models + +### Mobilenet V3 Imagenet Checkpoints + +All mobilenet V3 checkpoints were trained with image resolution 224x224. All +phone latencies are in milliseconds, measured on large core. In addition to +large and small models this page also contains so-called minimalistic models, +these models have the same per-layer dimensions characteristic as MobilenetV3 +however, they don't utilize any of the advanced blocks (squeeze-and-excite +units, hard-swish, and 5x5 convolutions). While these models are less efficient +on CPU, we find that they are much more performant on GPU/DSP. + +| Imagenet Checkpoint | MACs (M) | Params (M) | Top1 | Pixel 1 | Pixel 2 | Pixel 3 | +| ------------------ | -------- | ---------- | ---- | ------- | ------- | ------- | +| [Large dm=1 (float)] | 217 | 5.4 | 75.2 | 51.2 | 61 | 44 | +| [Large dm=1 (8-bit)] | 217 | 5.4 | 73.9 | 44 | 42.5 | 32 | +| [Large dm=0.75 (float)] | 155 | 4.0 | 73.3 | 39.8 | 48 | 34 | +| [Small dm=1 (float)] | 66 | 2.9 | 67.5 | 15.8 | 19.4 | 14.4 | +| [Small dm=1 (8-bit)] | 66 | 2.9 | 64.9 | 15.5 | 15 | 10.7 | +| [Small dm=0.75 (float)] | 44 | 2.4 | 65.4 | 12.8 | 15.9 | 11.6 | + +#### Minimalistic checkpoints: + +| Imagenet Checkpoint | MACs (M) | Params (M) | Top1 | Pixel 1 | Pixel 2 | Pixel 3 | +| -------------- | -------- | ---------- | ---- | ------- | ------- | ------- | +| [Large minimalistic (float)] | 209 | 3.9 | 72.3 | 44.1 | 51 | 35 | +| [Large minimalistic (8-bit)][lm8] | 209 | 3.9 | 71.3 | 37 | 35 | 27 | +| [Small minimalistic (float)] | 65 | 2.0 | 61.9 | 12.2 | 15.1 | 11 | + +#### Edge TPU checkpoints: + +| Imagenet Checkpoint | MACs (M) | Params (M) | Top1 | Pixel 4 Edge TPU | Pixel 4 CPU | +| ----------------- | -------- | ---------- | ---- | ------- | ----------- | +| [MobilenetEdgeTPU dm=0.75 (8-bit)]| 624 | 2.9 | 73.5 | 3.1 | 13.8 | +| [MobilenetEdgeTPU dm=1 (8-bit)] | 990 | 4.0 | 75.6 | 3.6 | 20.6 | + + +Note: 8-bit quantized versions of the MobilenetEdgeTPU models were obtained +using Tensorflow Lite's +[post training quantization](https://www.tensorflow.org/lite/performance/post_training_quantization) +tool. + +[Small minimalistic (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-small-minimalistic_224_1.0_float.tgz +[Large minimalistic (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-large-minimalistic_224_1.0_float.tgz +[lm8]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-large-minimalistic_224_1.0_uint8.tgz +[Large dm=1 (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-large_224_1.0_float.tgz +[Small dm=1 (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-small_224_1.0_float.tgz +[Large dm=1 (8-bit)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-large_224_1.0_uint8.tgz +[Small dm=1 (8-bit)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-small_224_1.0_uint8.tgz +[Large dm=0.75 (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-large_224_0.75_float.tgz +[Small dm=0.75 (float)]: https://storage.googleapis.com/mobilenet_v3/checkpoints/v3-small_224_0.75_float.tgz +[MobilenetEdgeTPU dm=0.75 (8-bit)]: https://storage.cloud.google.com/mobilenet_edgetpu/checkpoints/mobilenet_edgetpu_224_0.75.tgz +[MobilenetEdgeTPU dm=1 (8-bit)]: https://storage.cloud.google.com/mobilenet_edgetpu/checkpoints/mobilenet_edgetpu_224_1.0.tgz + +### Mobilenet V2 Imagenet Checkpoints + +Classification Checkpoint | MACs (M) | Parameters (M) | Top 1 Accuracy | Top 5 Accuracy | Mobile CPU (ms) Pixel 1 +---------------------------------------------------------------------------------------------------------- | -------- | -------------- | -------------- | -------------- | ----------------------- +[mobilenet_v2_1.4_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.4_224.tgz) | 582 | 6.06 | 75.0 | 92.5 | 138.0 +[mobilenet_v2_1.3_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.3_224.tgz) | 509 | 5.34 | 74.4 | 92.1 | 123.0 +[mobilenet_v2_1.0_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_224.tgz) | 300 | 3.47 | 71.8 | 91.0 | 73.8 +[mobilenet_v2_1.0_192](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_192.tgz) | 221 | 3.47 | 70.7 | 90.1 | 55.1 +[mobilenet_v2_1.0_160](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_160.tgz) | 154 | 3.47 | 68.8 | 89.0 | 40.2 +[mobilenet_v2_1.0_128](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_128.tgz) | 99 | 3.47 | 65.3 | 86.9 | 27.6 +[mobilenet_v2_1.0_96](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_1.0_96.tgz) | 56 | 3.47 | 60.3 | 83.2 | 17.6 +[mobilenet_v2_0.75_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.75_224.tgz) | 209 | 2.61 | 69.8 | 89.6 | 55.8 +[mobilenet_v2_0.75_192](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.75_192.tgz) | 153 | 2.61 | 68.7 | 88.9 | 41.6 +[mobilenet_v2_0.75_160](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.75_160.tgz) | 107 | 2.61 | 66.4 | 87.3 | 30.4 +[mobilenet_v2_0.75_128](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.75_128.tgz) | 69 | 2.61 | 63.2 | 85.3 | 21.9 +[mobilenet_v2_0.75_96](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.75_96.tgz) | 39 | 2.61 | 58.8 | 81.6 | 14.2 +[mobilenet_v2_0.5_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.5_224.tgz) | 97 | 1.95 | 65.4 | 86.4 | 28.7 +[mobilenet_v2_0.5_192](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.5_192.tgz) | 71 | 1.95 | 63.9 | 85.4 | 21.1 +[mobilenet_v2_0.5_160](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.5_160.tgz) | 50 | 1.95 | 61.0 | 83.2 | 14.9 +[mobilenet_v2_0.5_128](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.5_128.tgz) | 32 | 1.95 | 57.7 | 80.8 | 9.9 +[mobilenet_v2_0.5_96](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.5_96.tgz) | 18 | 1.95 | 51.2 | 75.8 | 6.4 +[mobilenet_v2_0.35_224](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.35_224.tgz) | 59 | 1.66 | 60.3 | 82.9 | 19.7 +[mobilenet_v2_0.35_192](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.35_192.tgz) | 43 | 1.66 | 58.2 | 81.2 | 14.6 +[mobilenet_v2_0.35_160](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.35_160.tgz) | 30 | 1.66 | 55.7 | 79.1 | 10.5 +[mobilenet_v2_0.35_128](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.35_128.tgz) | 20 | 1.66 | 50.8 | 75.0 | 6.9 +[mobilenet_v2_0.35_96](https://storage.googleapis.com/mobilenet_v2/checkpoints/mobilenet_v2_0.35_96.tgz) | 11 | 1.66 | 45.5 | 70.4 | 4.5 + +## Training + +### V3 + +TODO: Add V3 hyperparameters + +### V2 + +The numbers above can be reproduced using slim's +[`train_image_classifier`](https://github.com/tensorflow/models/blob/master/research/slim/README.md#training-a-model-from-scratch). +Below is the set of parameters that achieves 72.0% for full size MobileNetV2, +after about 700K when trained on 8 GPU. If trained on a single GPU the full +convergence is after 5.5M steps. Also note that learning rate and +num_epochs_per_decay both need to be adjusted depending on how many GPUs are +being used due to slim's internal averaging. + +```bash +--model_name="mobilenet_v2" +--learning_rate=0.045 * NUM_GPUS #slim internally averages clones so we compensate +--preprocessing_name="inception_v2" +--label_smoothing=0.1 +--moving_average_decay=0.9999 +--batch_size= 96 +--num_clones = NUM_GPUS # you can use any number here between 1 and 8 depending on your hardware setup. +--learning_rate_decay_factor=0.98 +--num_epochs_per_decay = 2.5 / NUM_GPUS # train_image_classifier does per clone epochs +``` + +# Example + +See this [ipython notebook](mobilenet_example.ipynb) or open and run the network +directly in +[Colaboratory](https://colab.research.google.com/github/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_example.ipynb). + +[MobilenetV2]: https://arxiv.org/abs/1801.04381 +[MobilenetV3]: https://arxiv.org/abs/1905.02244 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/conv_blocks.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/conv_blocks.py new file mode 100644 index 0000000..85b0791 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/conv_blocks.py @@ -0,0 +1,475 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convolution blocks for mobilenet.""" +import contextlib +import functools + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def _fixed_padding(inputs, kernel_size, rate=1): + """Pads the input along the spatial dimensions independently of input size. + + Pads the input such that if it was used in a convolution with 'VALID' padding, + the output would have the same dimensions as if the unpadded input was used + in a convolution with 'SAME' padding. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + rate: An integer, rate for atrous convolution. + + Returns: + output: A tensor of size [batch, height_out, width_out, channels] with the + input, either intact (if kernel_size == 1) or padded (if kernel_size > 1). + """ + kernel_size_effective = [kernel_size[0] + (kernel_size[0] - 1) * (rate - 1), + kernel_size[0] + (kernel_size[0] - 1) * (rate - 1)] + pad_total = [kernel_size_effective[0] - 1, kernel_size_effective[1] - 1] + pad_beg = [pad_total[0] // 2, pad_total[1] // 2] + pad_end = [pad_total[0] - pad_beg[0], pad_total[1] - pad_beg[1]] + padded_inputs = tf.pad(inputs, [[0, 0], [pad_beg[0], pad_end[0]], + [pad_beg[1], pad_end[1]], [0, 0]]) + return padded_inputs + + +def _make_divisible(v, divisor, min_value=None): + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return new_v + + +def _split_divisible(num, num_ways, divisible_by=8): + """Evenly splits num, num_ways so each piece is a multiple of divisible_by.""" + assert num % divisible_by == 0 + assert num / num_ways >= divisible_by + # Note: want to round down, we adjust each split to match the total. + base = num // num_ways // divisible_by * divisible_by + result = [] + accumulated = 0 + for i in range(num_ways): + r = base + while accumulated + r < num * (i + 1) / num_ways: + r += divisible_by + result.append(r) + accumulated += r + assert accumulated == num + return result + + +@contextlib.contextmanager +def _v1_compatible_scope_naming(scope): + """v1 compatible scope naming.""" + if scope is None: # Create uniqified separable blocks. + with tf.compat.v1.variable_scope(None, default_name='separable') as s, \ + tf.compat.v1.name_scope(s.original_name_scope): + yield '' + else: + # We use scope_depthwise, scope_pointwise for compatibility with V1 ckpts. + # which provide numbered scopes. + scope += '_' + yield scope + + +@slim.add_arg_scope +def split_separable_conv2d(input_tensor, + num_outputs, + scope=None, + normalizer_fn=None, + stride=1, + rate=1, + endpoints=None, + use_explicit_padding=False): + """Separable mobilenet V1 style convolution. + + Depthwise convolution, with default non-linearity, + followed by 1x1 depthwise convolution. This is similar to + slim.separable_conv2d, but differs in tha it applies batch + normalization and non-linearity to depthwise. This matches + the basic building of Mobilenet Paper + (https://arxiv.org/abs/1704.04861) + + Args: + input_tensor: input + num_outputs: number of outputs + scope: optional name of the scope. Note if provided it will use + scope_depthwise for deptwhise, and scope_pointwise for pointwise. + normalizer_fn: which normalizer function to use for depthwise/pointwise + stride: stride + rate: output rate (also known as dilation rate) + endpoints: optional, if provided, will export additional tensors to it. + use_explicit_padding: Use 'VALID' padding for convolutions, but prepad + inputs so that the output dimensions are the same as if 'SAME' padding + were used. + + Returns: + output tesnor + """ + + with _v1_compatible_scope_naming(scope) as scope: + dw_scope = scope + 'depthwise' + endpoints = endpoints if endpoints is not None else {} + kernel_size = [3, 3] + padding = 'SAME' + if use_explicit_padding: + padding = 'VALID' + input_tensor = _fixed_padding(input_tensor, kernel_size, rate) + net = slim.separable_conv2d( + input_tensor, + None, + kernel_size, + depth_multiplier=1, + stride=stride, + rate=rate, + normalizer_fn=normalizer_fn, + padding=padding, + scope=dw_scope) + + endpoints[dw_scope] = net + + pw_scope = scope + 'pointwise' + net = slim.conv2d( + net, + num_outputs, [1, 1], + stride=1, + normalizer_fn=normalizer_fn, + scope=pw_scope) + endpoints[pw_scope] = net + return net + + +def expand_input_by_factor(n, divisible_by=8): + return lambda num_inputs, **_: _make_divisible(num_inputs * n, divisible_by) + + +def split_conv(input_tensor, + num_outputs, + num_ways, + scope, + divisible_by=8, + **kwargs): + """Creates a split convolution. + + Split convolution splits the input and output into + 'num_blocks' blocks of approximately the same size each, + and only connects $i$-th input to $i$ output. + + Args: + input_tensor: input tensor + num_outputs: number of output filters + num_ways: num blocks to split by. + scope: scope for all the operators. + divisible_by: make sure that every part is divisiable by this. + **kwargs: will be passed directly into conv2d operator + Returns: + tensor + """ + b = input_tensor.get_shape().as_list()[3] + + if num_ways == 1 or min(b // num_ways, + num_outputs // num_ways) < divisible_by: + # Don't do any splitting if we end up with less than 8 filters + # on either side. + return slim.conv2d(input_tensor, num_outputs, [1, 1], scope=scope, **kwargs) + + outs = [] + input_splits = _split_divisible(b, num_ways, divisible_by=divisible_by) + output_splits = _split_divisible( + num_outputs, num_ways, divisible_by=divisible_by) + inputs = tf.split(input_tensor, input_splits, axis=3, name='split_' + scope) + base = scope + for i, (input_tensor, out_size) in enumerate(zip(inputs, output_splits)): + scope = base + '_part_%d' % (i,) + n = slim.conv2d(input_tensor, out_size, [1, 1], scope=scope, **kwargs) + n = tf.identity(n, scope + '_output') + outs.append(n) + return tf.concat(outs, 3, name=scope + '_concat') + + +@slim.add_arg_scope +def expanded_conv(input_tensor, + num_outputs, + expansion_size=expand_input_by_factor(6), + stride=1, + rate=1, + kernel_size=(3, 3), + residual=True, + normalizer_fn=None, + split_projection=1, + split_expansion=1, + split_divisible_by=8, + expansion_transform=None, + depthwise_location='expansion', + depthwise_channel_multiplier=1, + endpoints=None, + use_explicit_padding=False, + padding='SAME', + inner_activation_fn=None, + depthwise_activation_fn=None, + project_activation_fn=tf.identity, + depthwise_fn=slim.separable_conv2d, + expansion_fn=split_conv, + projection_fn=split_conv, + scope=None): + """Depthwise Convolution Block with expansion. + + Builds a composite convolution that has the following structure + expansion (1x1) -> depthwise (kernel_size) -> projection (1x1) + + Args: + input_tensor: input + num_outputs: number of outputs in the final layer. + expansion_size: the size of expansion, could be a constant or a callable. + If latter it will be provided 'num_inputs' as an input. For forward + compatibility it should accept arbitrary keyword arguments. + Default will expand the input by factor of 6. + stride: depthwise stride + rate: depthwise rate + kernel_size: depthwise kernel + residual: whether to include residual connection between input + and output. + normalizer_fn: batchnorm or otherwise + split_projection: how many ways to split projection operator + (that is conv expansion->bottleneck) + split_expansion: how many ways to split expansion op + (that is conv bottleneck->expansion) ops will keep depth divisible + by this value. + split_divisible_by: make sure every split group is divisible by this number. + expansion_transform: Optional function that takes expansion + as a single input and returns output. + depthwise_location: where to put depthwise covnvolutions supported + values None, 'input', 'output', 'expansion' + depthwise_channel_multiplier: depthwise channel multiplier: + each input will replicated (with different filters) + that many times. So if input had c channels, + output will have c x depthwise_channel_multpilier. + endpoints: An optional dictionary into which intermediate endpoints are + placed. The keys "expansion_output", "depthwise_output", + "projection_output" and "expansion_transform" are always populated, even + if the corresponding functions are not invoked. + use_explicit_padding: Use 'VALID' padding for convolutions, but prepad + inputs so that the output dimensions are the same as if 'SAME' padding + were used. + padding: Padding type to use if `use_explicit_padding` is not set. + inner_activation_fn: activation function to use in all inner convolutions. + If none, will rely on slim default scopes. + depthwise_activation_fn: activation function to use for deptwhise only. + If not provided will rely on slim default scopes. If both + inner_activation_fn and depthwise_activation_fn are provided, + depthwise_activation_fn takes precedence over inner_activation_fn. + project_activation_fn: activation function for the project layer. + (note this layer is not affected by inner_activation_fn) + depthwise_fn: Depthwise convolution function. + expansion_fn: Expansion convolution function. If use custom function then + "split_expansion" and "split_divisible_by" will be ignored. + projection_fn: Projection convolution function. If use custom function then + "split_projection" and "split_divisible_by" will be ignored. + + scope: optional scope. + + Returns: + Tensor of depth num_outputs + + Raises: + TypeError: on inval + """ + conv_defaults = {} + dw_defaults = {} + if inner_activation_fn is not None: + conv_defaults['activation_fn'] = inner_activation_fn + dw_defaults['activation_fn'] = inner_activation_fn + if depthwise_activation_fn is not None: + dw_defaults['activation_fn'] = depthwise_activation_fn + # pylint: disable=g-backslash-continuation + with tf.compat.v1.variable_scope(scope, default_name='expanded_conv') as s, \ + tf.compat.v1.name_scope(s.original_name_scope), \ + slim.arg_scope((slim.conv2d,), **conv_defaults), \ + slim.arg_scope((slim.separable_conv2d,), **dw_defaults): + prev_depth = input_tensor.get_shape().as_list()[3] + if depthwise_location not in [None, 'input', 'output', 'expansion']: + raise TypeError('%r is unknown value for depthwise_location' % + depthwise_location) + if use_explicit_padding: + if padding != 'SAME': + raise TypeError('`use_explicit_padding` should only be used with ' + '"SAME" padding.') + padding = 'VALID' + depthwise_func = functools.partial( + depthwise_fn, + num_outputs=None, + kernel_size=kernel_size, + depth_multiplier=depthwise_channel_multiplier, + stride=stride, + rate=rate, + normalizer_fn=normalizer_fn, + padding=padding, + scope='depthwise') + # b1 -> b2 * r -> b2 + # i -> (o * r) (bottleneck) -> o + input_tensor = tf.identity(input_tensor, 'input') + net = input_tensor + + if depthwise_location == 'input': + if use_explicit_padding: + net = _fixed_padding(net, kernel_size, rate) + net = depthwise_func(net, activation_fn=None) + net = tf.identity(net, name='depthwise_output') + if endpoints is not None: + endpoints['depthwise_output'] = net + + if callable(expansion_size): + inner_size = expansion_size(num_inputs=prev_depth) + else: + inner_size = expansion_size + + if inner_size > net.shape[3]: + if expansion_fn == split_conv: + expansion_fn = functools.partial( + expansion_fn, + num_ways=split_expansion, + divisible_by=split_divisible_by, + stride=1) + net = expansion_fn( + net, + inner_size, + scope='expand', + normalizer_fn=normalizer_fn) + net = tf.identity(net, 'expansion_output') + if endpoints is not None: + endpoints['expansion_output'] = net + + if depthwise_location == 'expansion': + if use_explicit_padding: + net = _fixed_padding(net, kernel_size, rate) + net = depthwise_func(net) + net = tf.identity(net, name='depthwise_output') + if endpoints is not None: + endpoints['depthwise_output'] = net + + if expansion_transform: + net = expansion_transform(expansion_tensor=net, input_tensor=input_tensor) + # Note in contrast with expansion, we always have + # projection to produce the desired output size. + if projection_fn == split_conv: + projection_fn = functools.partial( + projection_fn, + num_ways=split_projection, + divisible_by=split_divisible_by, + stride=1) + net = projection_fn( + net, + num_outputs, + scope='project', + normalizer_fn=normalizer_fn, + activation_fn=project_activation_fn) + if endpoints is not None: + endpoints['projection_output'] = net + if depthwise_location == 'output': + if use_explicit_padding: + net = _fixed_padding(net, kernel_size, rate) + net = depthwise_func(net, activation_fn=None) + net = tf.identity(net, name='depthwise_output') + if endpoints is not None: + endpoints['depthwise_output'] = net + + if callable(residual): # custom residual + net = residual(input_tensor=input_tensor, output_tensor=net) + elif (residual and + # stride check enforces that we don't add residuals when spatial + # dimensions are None + stride == 1 and + # Depth matches + net.get_shape().as_list()[3] == + input_tensor.get_shape().as_list()[3]): + net += input_tensor + return tf.identity(net, name='output') + + +@slim.add_arg_scope +def squeeze_excite(input_tensor, + divisible_by=8, + squeeze_factor=3, + inner_activation_fn=tf.nn.relu, + gating_fn=tf.sigmoid, + squeeze_input_tensor=None, + pool=None): + """Squeeze excite block for Mobilenet V3. + + If the squeeze_input_tensor - or the input_tensor if squeeze_input_tensor is + None - contains variable dimensions (Nonetype in tensor shape), perform + average pooling (as the first step in the squeeze operation) by calling + reduce_mean across the H/W of the input tensor. + + Args: + input_tensor: input tensor to apply SE block to. + divisible_by: ensures all inner dimensions are divisible by this number. + squeeze_factor: the factor of squeezing in the inner fully connected layer + inner_activation_fn: non-linearity to be used in inner layer. + gating_fn: non-linearity to be used for final gating function + squeeze_input_tensor: custom tensor to use for computing gating activation. + If provided the result will be input_tensor * SE(squeeze_input_tensor) + instead of input_tensor * SE(input_tensor). + pool: if number is provided will average pool with that kernel size + to compute inner tensor, followed by bilinear upsampling. + + Returns: + Gated input_tensor. (e.g. X * SE(X)) + """ + with tf.compat.v1.variable_scope('squeeze_excite'): + if squeeze_input_tensor is None: + squeeze_input_tensor = input_tensor + input_size = input_tensor.shape.as_list()[1:3] + pool_height, pool_width = squeeze_input_tensor.shape.as_list()[1:3] + stride = 1 + if pool is not None and pool_height >= pool: + pool_height, pool_width, stride = pool, pool, pool + input_channels = squeeze_input_tensor.shape.as_list()[3] + output_channels = input_tensor.shape.as_list()[3] + squeeze_channels = _make_divisible( + input_channels / squeeze_factor, divisor=divisible_by) + + if pool is None: + pooled = tf.reduce_mean(squeeze_input_tensor, axis=[1, 2], keepdims=True) + else: + pooled = tf.nn.avg_pool( + squeeze_input_tensor, (1, pool_height, pool_width, 1), + strides=(1, stride, stride, 1), + padding='VALID') + squeeze = slim.conv2d( + pooled, + kernel_size=(1, 1), + num_outputs=squeeze_channels, + normalizer_fn=None, + activation_fn=inner_activation_fn) + excite_outputs = output_channels + excite = slim.conv2d(squeeze, num_outputs=excite_outputs, + kernel_size=[1, 1], + normalizer_fn=None, + activation_fn=gating_fn) + if pool is not None: + # Note: As of 03/20/2019 only BILINEAR (the default) with + # align_corners=True has gradients implemented in TPU. + excite = tf.image.resize_images( + excite, input_size, + align_corners=True) + result = input_tensor * excite + return result diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/edgetpu_latency.png b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/edgetpu_latency.png new file mode 100644 index 0000000..05ebc50 Binary files /dev/null and b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/edgetpu_latency.png differ diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/latency_pixel1.png b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/latency_pixel1.png new file mode 100644 index 0000000..4fda9cf Binary files /dev/null and b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/latency_pixel1.png differ diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/madds_top1_accuracy.png b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/madds_top1_accuracy.png new file mode 100644 index 0000000..a2f75bd Binary files /dev/null and b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/g3doc/madds_top1_accuracy.png differ diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet.py new file mode 100644 index 0000000..9cc37ab --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet.py @@ -0,0 +1,501 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Mobilenet Base Class.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import collections +import contextlib +import copy +import os + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +@slim.add_arg_scope +def apply_activation(x, name=None, activation_fn=None): + return activation_fn(x, name=name) if activation_fn else x + + +def _fixed_padding(inputs, kernel_size, rate=1): + """Pads the input along the spatial dimensions independently of input size. + + Pads the input such that if it was used in a convolution with 'VALID' padding, + the output would have the same dimensions as if the unpadded input was used + in a convolution with 'SAME' padding. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + rate: An integer, rate for atrous convolution. + + Returns: + output: A tensor of size [batch, height_out, width_out, channels] with the + input, either intact (if kernel_size == 1) or padded (if kernel_size > 1). + """ + kernel_size_effective = [kernel_size[0] + (kernel_size[0] - 1) * (rate - 1), + kernel_size[0] + (kernel_size[0] - 1) * (rate - 1)] + pad_total = [kernel_size_effective[0] - 1, kernel_size_effective[1] - 1] + pad_beg = [pad_total[0] // 2, pad_total[1] // 2] + pad_end = [pad_total[0] - pad_beg[0], pad_total[1] - pad_beg[1]] + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [pad_beg[0], pad_end[0]], [pad_beg[1], pad_end[1]], + [0, 0]]) + return padded_inputs + + +def _make_divisible(v, divisor, min_value=None): + if min_value is None: + min_value = divisor + new_v = max(min_value, int(v + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_v < 0.9 * v: + new_v += divisor + return int(new_v) + + +@contextlib.contextmanager +def _set_arg_scope_defaults(defaults): + """Sets arg scope defaults for all items present in defaults. + + Args: + defaults: dictionary/list of pairs, containing a mapping from + function to a dictionary of default args. + + Yields: + context manager where all defaults are set. + """ + if hasattr(defaults, 'items'): + items = list(defaults.items()) + else: + items = defaults + if not items: + yield + else: + func, default_arg = items[0] + with slim.arg_scope(func, **default_arg): + with _set_arg_scope_defaults(items[1:]): + yield + + +@slim.add_arg_scope +def depth_multiplier(output_params, + multiplier, + divisible_by=8, + min_depth=8, + **unused_kwargs): + if 'num_outputs' not in output_params: + return + d = output_params['num_outputs'] + output_params['num_outputs'] = _make_divisible(d * multiplier, divisible_by, + min_depth) + + +_Op = collections.namedtuple('Op', ['op', 'params', 'multiplier_func']) + + +def op(opfunc, multiplier_func=depth_multiplier, **params): + multiplier = params.pop('multiplier_transform', multiplier_func) + return _Op(opfunc, params=params, multiplier_func=multiplier) + + +class NoOpScope(object): + """No-op context manager.""" + + def __enter__(self): + return None + + def __exit__(self, exc_type, exc_value, traceback): + return False + + +def safe_arg_scope(funcs, **kwargs): + """Returns `slim.arg_scope` with all None arguments removed. + + Arguments: + funcs: Functions to pass to `arg_scope`. + **kwargs: Arguments to pass to `arg_scope`. + + Returns: + arg_scope or No-op context manager. + + Note: can be useful if None value should be interpreted as "do not overwrite + this parameter value". + """ + filtered_args = {name: value for name, value in kwargs.items() + if value is not None} + if filtered_args: + return slim.arg_scope(funcs, **filtered_args) + else: + return NoOpScope() + + +@slim.add_arg_scope +def mobilenet_base( # pylint: disable=invalid-name + inputs, + conv_defs, + multiplier=1.0, + final_endpoint=None, + output_stride=None, + use_explicit_padding=False, + scope=None, + is_training=False): + """Mobilenet base network. + + Constructs a network from inputs to the given final endpoint. By default + the network is constructed in inference mode. To create network + in training mode use: + + with slim.arg_scope(mobilenet.training_scope()): + logits, endpoints = mobilenet_base(...) + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + conv_defs: A list of op(...) layers specifying the net architecture. + multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + final_endpoint: The name of last layer, for early termination for + for V1-based networks: last layer is "layer_14", for V2: "layer_20" + output_stride: An integer that specifies the requested ratio of input to + output spatial resolution. If not None, then we invoke atrous convolution + if necessary to prevent the network from reducing the spatial resolution + of the activation maps. Allowed values are 1 or any even number, excluding + zero. Typical values are 8 (accurate fully convolutional mode), 16 + (fast fully convolutional mode), and 32 (classification mode). + + NOTE- output_stride relies on all consequent operators to support dilated + operators via "rate" parameter. This might require wrapping non-conv + operators to operate properly. + + use_explicit_padding: Use 'VALID' padding for convolutions, but prepad + inputs so that the output dimensions are the same as if 'SAME' padding + were used. + scope: optional variable scope. + is_training: How to setup batch_norm and other ops. Note: most of the time + this does not need be set directly. Use mobilenet.training_scope() to set + up training instead. This parameter is here for backward compatibility + only. It is safe to set it to the value matching + training_scope(is_training=...). It is also safe to explicitly set + it to False, even if there is outer training_scope set to to training. + (The network will be built in inference mode). If this is set to None, + no arg_scope is added for slim.batch_norm's is_training parameter. + + Returns: + tensor_out: output tensor. + end_points: a set of activations for external use, for example summaries or + losses. + + Raises: + ValueError: depth_multiplier <= 0, or the target output_stride is not + allowed. + """ + if multiplier <= 0: + raise ValueError('multiplier is not greater than zero.') + + # Set conv defs defaults and overrides. + conv_defs_defaults = conv_defs.get('defaults', {}) + conv_defs_overrides = conv_defs.get('overrides', {}) + if use_explicit_padding: + conv_defs_overrides = copy.deepcopy(conv_defs_overrides) + conv_defs_overrides[ + (slim.conv2d, slim.separable_conv2d)] = {'padding': 'VALID'} + + if output_stride is not None: + if output_stride == 0 or (output_stride > 1 and output_stride % 2): + raise ValueError('Output stride must be None, 1 or a multiple of 2.') + + # a) Set the tensorflow scope + # b) set padding to default: note we might consider removing this + # since it is also set by mobilenet_scope + # c) set all defaults + # d) set all extra overrides. + # pylint: disable=g-backslash-continuation + with _scope_all(scope, default_scope='Mobilenet'), \ + safe_arg_scope([slim.batch_norm], is_training=is_training), \ + _set_arg_scope_defaults(conv_defs_defaults), \ + _set_arg_scope_defaults(conv_defs_overrides): + # The current_stride variable keeps track of the output stride of the + # activations, i.e., the running product of convolution strides up to the + # current network layer. This allows us to invoke atrous convolution + # whenever applying the next convolution would result in the activations + # having output stride larger than the target output_stride. + current_stride = 1 + + # The atrous convolution rate parameter. + rate = 1 + + net = inputs + # Insert default parameters before the base scope which includes + # any custom overrides set in mobilenet. + end_points = {} + scopes = {} + for i, opdef in enumerate(conv_defs['spec']): + params = dict(opdef.params) + opdef.multiplier_func(params, multiplier) + stride = params.get('stride', 1) + if output_stride is not None and current_stride == output_stride: + # If we have reached the target output_stride, then we need to employ + # atrous convolution with stride=1 and multiply the atrous rate by the + # current unit's stride for use in subsequent layers. + layer_stride = 1 + layer_rate = rate + rate *= stride + else: + layer_stride = stride + layer_rate = 1 + current_stride *= stride + # Update params. + params['stride'] = layer_stride + # Only insert rate to params if rate > 1 and kernel size is not [1, 1]. + if layer_rate > 1: + if tuple(params.get('kernel_size', [])) != (1, 1): + # We will apply atrous rate in the following cases: + # 1) When kernel_size is not in params, the operation then uses + # default kernel size 3x3. + # 2) When kernel_size is in params, and if the kernel_size is not + # equal to (1, 1) (there is no need to apply atrous convolution to + # any 1x1 convolution). + params['rate'] = layer_rate + # Set padding + if use_explicit_padding: + if 'kernel_size' in params: + net = _fixed_padding(net, params['kernel_size'], layer_rate) + else: + params['use_explicit_padding'] = True + + end_point = 'layer_%d' % (i + 1) + try: + net = opdef.op(net, **params) + except Exception: + print('Failed to create op %i: %r params: %r' % (i, opdef, params)) + raise + end_points[end_point] = net + scope = os.path.dirname(net.name) + scopes[scope] = end_point + if final_endpoint is not None and end_point == final_endpoint: + break + + # Add all tensors that end with 'output' to + # endpoints + for t in net.graph.get_operations(): + scope = os.path.dirname(t.name) + bn = os.path.basename(t.name) + if scope in scopes and t.name.endswith('output'): + end_points[scopes[scope] + '/' + bn] = t.outputs[0] + return net, end_points + + +@contextlib.contextmanager +def _scope_all(scope, default_scope=None): + with tf.compat.v1.variable_scope(scope, default_name=default_scope) as s,\ + tf.compat.v1.name_scope(s.original_name_scope): + yield s + + +@slim.add_arg_scope +def mobilenet(inputs, + num_classes=1001, + prediction_fn=slim.softmax, + reuse=None, + scope='Mobilenet', + base_only=False, + **mobilenet_args): + """Mobilenet model for classification, supports both V1 and V2. + + Note: default mode is inference, use mobilenet.training_scope to create + training network. + + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + prediction_fn: a function to get predictions out of logits + (default softmax). + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + base_only: if True will only create the base of the network (no pooling + and no logits). + **mobilenet_args: passed to mobilenet_base verbatim. + - conv_defs: list of conv defs + - multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + - output_stride: will ensure that the last layer has at most total stride. + If the architecture calls for more stride than that provided + (e.g. output_stride=16, but the architecture has 5 stride=2 operators), + it will replace output_stride with fractional convolutions using Atrous + Convolutions. + + Returns: + logits: the pre-softmax activations, a tensor of size + [batch_size, num_classes] + end_points: a dictionary from components of the network to the corresponding + activation tensor. + + Raises: + ValueError: Input rank is invalid. + """ + is_training = mobilenet_args.get('is_training', False) + input_shape = inputs.get_shape().as_list() + if len(input_shape) != 4: + raise ValueError('Expected rank 4 input, was: %d' % len(input_shape)) + + with tf.compat.v1.variable_scope(scope, 'Mobilenet', reuse=reuse) as scope: + inputs = tf.identity(inputs, 'input') + net, end_points = mobilenet_base(inputs, scope=scope, **mobilenet_args) + if base_only: + return net, end_points + + net = tf.identity(net, name='embedding') + + with tf.compat.v1.variable_scope('Logits'): + net = global_pool(net) + end_points['global_pool'] = net + if not num_classes: + return net, end_points + # net = slim.dropout(net, scope='Dropout', is_training=is_training) + # 1 x 1 x num_classes + # Note: legacy scope name. + # logits = slim.conv2d( + # net, + # num_classes, [1, 1], + # activation_fn=None, + # normalizer_fn=None, + # biases_initializer=tf.compat.v1.zeros_initializer(), + # scope='Conv2d_1c_1x1') + + # logits = tf.squeeze(logits, [1, 2]) + + # use slim.fully_connected instead + net = tf.squeeze(net) + net = slim.dropout(net, keep_prob=0.8, scope='Dropout', is_training=is_training) + logits = slim.fully_connected( + net, + num_classes, + activation_fn=None, + normalizer_fn=None, + scope='FC' + ) + #logits = tf.expand_dims(logits, axis=[]) + + logits = tf.identity(logits, name='output') + end_points['Logits'] = logits + if prediction_fn: + end_points['Predictions'] = prediction_fn(logits, 'Predictions') + return logits, end_points + + +def global_pool(input_tensor, pool_op=tf.compat.v2.nn.avg_pool2d): + """Applies avg pool to produce 1x1 output. + + NOTE: This function is funcitonally equivalenet to reduce_mean, but it has + baked in average pool which has better support across hardware. + + Args: + input_tensor: input tensor + pool_op: pooling op (avg pool is default) + Returns: + a tensor batch_size x 1 x 1 x depth. + """ + shape = input_tensor.get_shape().as_list() + if shape[1] is None or shape[2] is None: + kernel_size = tf.convert_to_tensor(value=[ + 1, + tf.shape(input=input_tensor)[1], + tf.shape(input=input_tensor)[2], 1 + ]) + else: + kernel_size = [1, shape[1], shape[2], 1] + output = pool_op( + input_tensor, ksize=kernel_size, strides=[1, 1, 1, 1], padding='VALID') + # Recover output shape, for unknown shape. + output.set_shape([None, 1, 1, None]) + return output + + +def training_scope(is_training=True, + weight_decay=0.00004, + stddev=0.09, + dropout_keep_prob=0.8, + bn_decay=0.997): + """Defines Mobilenet training scope. + + Usage: + with tf.contrib.slim.arg_scope(mobilenet.training_scope()): + logits, endpoints = mobilenet_v2.mobilenet(input_tensor) + + # the network created will be trainble with dropout/batch norm + # initialized appropriately. + Args: + is_training: if set to False this will ensure that all customizations are + set to non-training mode. This might be helpful for code that is reused + across both training/evaluation, but most of the time training_scope with + value False is not needed. If this is set to None, the parameters is not + added to the batch_norm arg_scope. + + weight_decay: The weight decay to use for regularizing the model. + stddev: Standard deviation for initialization, if negative uses xavier. + dropout_keep_prob: dropout keep probability (not set if equals to None). + bn_decay: decay for the batch norm moving averages (not set if equals to + None). + + Returns: + An argument scope to use via arg_scope. + """ + # Note: do not introduce parameters that would change the inference + # model here (for example whether to use bias), modify conv_def instead. + batch_norm_params = { + 'decay': bn_decay, + 'is_training': is_training + } + #if stddev < 0: + # weight_intitializer = slim.initializers.xavier_initializer() + #else: + # weight_intitializer = tf.compat.v1.truncated_normal_initializer(stddev=stddev) + + # modified for NPU + weight_2d = tf.initializers.variance_scaling(scale=2., mode="fan_out", distribution="untruncated_normal") + weight_dw = tf.initializers.variance_scaling(scale=2., mode="fan_in", distribution="untruncated_normal") + weight_pw = tf.initializers.variance_scaling(scale=2., mode="fan_out", distribution="untruncated_normal") + weight_fc = tf.initializers.random_normal(stddev=0.01) + + # Set weight_decay for weights in Conv and FC layers. + with slim.arg_scope( + #[slim.conv2d, slim.fully_connected, slim.separable_conv2d], + [slim.conv2d], + #weights_initializer=weight_intitializer, + weights_initializer=weight_2d, + normalizer_fn=slim.batch_norm), \ + slim.arg_scope([slim.fully_connected], weights_initializer=weight_fc, normalizer_fn=slim.batch_norm), \ + slim.arg_scope([slim.separable_conv2d], weights_initializer=weight_dw, pointwise_initializer=weight_pw, normalizer_fn=slim.batch_norm), \ + slim.arg_scope([mobilenet_base, mobilenet], is_training=is_training),\ + safe_arg_scope([slim.batch_norm], **batch_norm_params), \ + safe_arg_scope([slim.dropout], is_training=is_training, + keep_prob=dropout_keep_prob), \ + slim.arg_scope([slim.conv2d], \ + weights_regularizer=slim.l2_regularizer(weight_decay)), \ + slim.arg_scope([slim.separable_conv2d], weights_regularizer=None) as s: + return s diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_example.ipynb b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_example.ipynb new file mode 100644 index 0000000..b0b3689 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_example.ipynb @@ -0,0 +1,445 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "toc", + "id": "aUVxY7xOGD1G" + }, + "source": [ + "\u003e[Prerequisites (downloading tensorflow_models and checkpoints)](#scrollTo=T_cETKXHDTXu)\n", + "\n", + "\u003e[Checkpoint based inference](#scrollTo=fxMe7_pkk_Vo)\n", + "\n", + "\u003e[Frozen inference](#scrollTo=PlwvpK3ElBk6)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "T_cETKXHDTXu" + }, + "source": [ + "# Prerequisites (downloading tensorflow_models and checkpoints)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "base_uri": "https://localhost:8080/", + "height": 125, + "output_extras": [ + {} + ] + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 31129, + "status": "ok", + "timestamp": 1521483961674, + "user": { + "displayName": "Mark Sandler", + "photoUrl": "//lh5.googleusercontent.com/-CjnV3zpGrlw/AAAAAAAAAAI/AAAAAAAABRU/dfjRy_tzX5M/s50-c-k-no/photo.jpg", + "userId": "108034853522252017283" + }, + "user_tz": 420 + }, + "id": "zo5GyseklSVH", + "outputId": "e12a8a80-c0d2-4ebc-9230-b170f11d236e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cloning into 'models'...\n", + "remote: Counting objects: 13504, done.\u001b[K\n", + "remote: Total 13504 (delta 2), reused 2 (delta 2), pack-reused 13501\u001b[K\n", + "Receiving objects: 100% (13504/13504), 422.07 MiB | 37.42 MiB/s, done.\n", + "Resolving deltas: 100% (7635/7635), done.\n", + "Checking out files: 100% (1946/1946), done.\n" + ] + } + ], + "source": [ + "!git clone https://github.com/tensorflow/models" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "cellView": "both", + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "base_uri": "https://localhost:8080/", + "height": 35, + "output_extras": [ + {} + ] + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 4504, + "status": "ok", + "timestamp": 1521493157017, + "user": { + "displayName": "Mark Sandler", + "photoUrl": "//lh5.googleusercontent.com/-CjnV3zpGrlw/AAAAAAAAAAI/AAAAAAAABRU/dfjRy_tzX5M/s50-c-k-no/photo.jpg", + "userId": "108034853522252017283" + }, + "user_tz": 420 + }, + "id": "obaW6O8bz3mA", + "outputId": "79b3fb23-caa7-4683-9575-ba7c2f55ebdb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully downloaded the checkpoint. It is available as mobilenet_v2_1.0_224.ckpt\n" + ] + } + ], + "source": [ + "from __future__ import print_function\n", + "from IPython import display \n", + "checkpoint_name = 'mobilenet_v2_1.0_224' #@param\n", + "url = 'https://storage.googleapis.com/mobilenet_v2/checkpoints/' + checkpoint_name + '.tgz'\n", + "print('Downloading from ', url)\n", + "!wget {url}\n", + "print('Unpacking')\n", + "!tar -xvf {checkpoint_name}.tgz\n", + "checkpoint = checkpoint_name + '.ckpt'\n", + "\n", + "display.clear_output()\n", + "print('Successfully downloaded checkpoint from ', url,\n", + " '. It is available as', checkpoint)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "base_uri": "https://localhost:8080/", + "height": 215, + "output_extras": [ + {} + ] + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 1486, + "status": "ok", + "timestamp": 1521485010457, + "user": { + "displayName": "Mark Sandler", + "photoUrl": "//lh5.googleusercontent.com/-CjnV3zpGrlw/AAAAAAAAAAI/AAAAAAAABRU/dfjRy_tzX5M/s50-c-k-no/photo.jpg", + "userId": "108034853522252017283" + }, + "user_tz": 420 + }, + "id": "qZDfLegf3hpw", + "outputId": "334ed084-b90e-4bd0-bd5e-125434a9a30f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2018-03-19 18:43:29-- https://upload.wikimedia.org/wikipedia/commons/f/fe/Giant_Panda_in_Beijing_Zoo_1.JPG\n", + "Resolving upload.wikimedia.org (upload.wikimedia.org)... 208.80.154.240, 2620:0:860:ed1a::2:b\n", + "Connecting to upload.wikimedia.org (upload.wikimedia.org)|208.80.154.240|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 116068 (113K) [image/jpeg]\n", + "Saving to: ‘panda.jpg’\n", + "\n", + "panda.jpg 100%[===================\u003e] 113.35K --.-KB/s in 0.03s \n", + "\n", + "2018-03-19 18:43:30 (3.18 MB/s) - ‘panda.jpg’ saved [116068/116068]\n", + "\n" + ] + } + ], + "source": [ + "!wget https://upload.wikimedia.org/wikipedia/commons/f/fe/Giant_Panda_in_Beijing_Zoo_1.JPG -O panda.jpg" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "id": "g0H2RDadndug" + }, + "outputs": [], + "source": [ + "# setup path\n", + "import sys\n", + "sys.path.append('/content/models/research/slim')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "fxMe7_pkk_Vo" + }, + "source": [ + "# Checkpoint based inference" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "id": "GrQemT66CxXt" + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from nets.mobilenet import mobilenet_v2\n", + "\n", + "tf.reset_default_graph()\n", + "\n", + "# For simplicity we just decode jpeg inside tensorflow.\n", + "# But one can provide any input obviously.\n", + "file_input = tf.placeholder(tf.string, ())\n", + "\n", + "image = tf.image.decode_jpeg(tf.read_file(file_input))\n", + "\n", + "images = tf.expand_dims(image, 0)\n", + "images = tf.cast(images, tf.float32) / 128. - 1\n", + "images.set_shape((None, None, None, 3))\n", + "images = tf.image.resize_images(images, (224, 224))\n", + "\n", + "# Note: arg_scope is optional for inference.\n", + "with tf.contrib.slim.arg_scope(mobilenet_v2.training_scope(is_training=False)):\n", + " logits, endpoints = mobilenet_v2.mobilenet(images)\n", + " \n", + "# Restore using exponential moving average since it produces (1.5-2%) higher \n", + "# accuracy\n", + "ema = tf.train.ExponentialMovingAverage(0.999)\n", + "vars = ema.variables_to_restore()\n", + "\n", + "saver = tf.train.Saver(vars) " + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "base_uri": "https://localhost:8080/", + "height": 666, + "output_extras": [ + {}, + {} + ] + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 1422, + "status": "ok", + "timestamp": 1521493723379, + "user": { + "displayName": "Mark Sandler", + "photoUrl": "//lh5.googleusercontent.com/-CjnV3zpGrlw/AAAAAAAAAAI/AAAAAAAABRU/dfjRy_tzX5M/s50-c-k-no/photo.jpg", + "userId": "108034853522252017283" + }, + "user_tz": 420 + }, + "id": "TJbLYo_FCxXy", + "outputId": "17a4fbaa-dec0-4997-b233-15ba69806083" + }, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4SjTRXhpZgAASUkqAAgAAAAKAA8BAgASAAAAhgAAABABAgAK\nAAAAmAAAABIBAwABAAAAAAAAABoBBQABAAAAogAAABsBBQABAAAAqgAAACgBAwABAAAAAgAAADEB\nAgALAAAAsgAAADIBAgAUAAAAvgAAABMCAwABAAAAAgAAAGmHBAABAAAA0gAAAIwDAABOSUtPTiBD\nT1JQT1JBVElPTgBOSUtPTiBEODAALAEAAAEAAAAsAQAAAQAAAFBpY2FzYSAzLjAAADIwMDc6MTE6\nMTggMTM6MTM6MDcAKACaggUAAQAAALgCAACdggUAAQAAAMACAAAiiAMAAQAAAAIAAAAniAMAAQAA\nAEAGAAAAkAcABAAAADAyMjEDkAIAFAAAAMgCAAAEkAIAFAAAANwCAAABkQcABAAAAAECAwACkQUA\nAQAAAPACAAAEkgoAAQAAAPgCAAAFkgUAAQAAAAADAAAHkgMAAQAAAAIAAAAIkgMAAQAAAAAAAAAJ\nkgMAAQAAAAAAAAAKkgUAAQAAAAgDAACGkgcALAAAABADAACQkgIAAwAAADEwAACRkgIAAwAAADEw\nAACSkgIAAwAAADEwAAAAoAcABAAAADAxMDABoAMAAQAAAP//AAACoAMAAQAAALgCAAADoAMAAQAA\nAGUCAAAFoAQAAQAAAG4DAAAXogMAAQAAAAIAAAAAowcAAQAAAAMAAAABowcAAQAAAAEAAAACowcA\nCAAAADwDAAABpAMAAQAAAAAAAAACpAMAAQAAAAAAAAADpAMAAQAAAAAAAAAEpAUAAQAAAEQDAAAF\npAMAAQAAAEUAAAAGpAMAAQAAAAAAAAAHpAMAAQAAAAIAAAAIpAMAAQAAAAAAAAAJpAMAAQAAAAAA\nAAAKpAMAAQAAAAAAAAAMpAMAAQAAAAAAAAAgpAIAIQAAAEwDAAAAAAAACgAAAIgTAABuAAAACgAA\nADIwMDc6MTE6MTggMTM6MTM6MDcAMjAwNzoxMToxOCAxMzoxMzowNwACAAAAAQAAAAAAAAAGAAAA\nMAAAAAoAAADMAQAACgAAAEFTQ0lJAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgAAIAAgECAAEBAAAAAQAAAGQzMzk2MmE2YzhmOWMwZTZmNDY5ZmQ5OWQ3NmE0ZTFhAAACAAEA\n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\nsvj4Ejqg8oXv9K9VEKf/2Q==\n", + "text/plain": [ + "\u003cIPython.core.display.Image object\u003e" + ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Restoring parameters from mobilenet_v2_1.0_224.ckpt\n", + "Top 1 prediction: 389 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca 0.90984344\n" + ] + } + ], + "source": [ + "from IPython import display\n", + "import pylab\n", + "from datasets import imagenet\n", + "import PIL\n", + "display.display(display.Image('panda.jpg'))\n", + "\n", + "with tf.Session() as sess:\n", + " saver.restore(sess, checkpoint)\n", + " x = endpoints['Predictions'].eval(feed_dict={file_input: 'panda.jpg'})\n", + "label_map = imagenet.create_readable_names_for_imagenet_labels() \n", + "print(\"Top 1 prediction: \", x.argmax(),label_map[x.argmax()], x.max())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PlwvpK3ElBk6" + }, + "source": [ + "# Frozen inference" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "id": "o0BIbQUUlVrf" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "img = np.array(PIL.Image.open('panda.jpg').resize((224, 224))).astype(np.float) / 128 - 1\n", + "gd = tf.GraphDef.FromString(open(checkpoint_name + '_frozen.pb', 'rb').read())\n", + "inp, predictions = tf.import_graph_def(gd, return_elements = ['input:0', 'MobilenetV2/Predictions/Reshape_1:0'])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + }, + "base_uri": "https://localhost:8080/", + "height": 35, + "output_extras": [ + {} + ] + }, + "colab_type": "code", + "executionInfo": { + "elapsed": 1350, + "status": "ok", + "timestamp": 1521493472822, + "user": { + "displayName": "Mark Sandler", + "photoUrl": "//lh5.googleusercontent.com/-CjnV3zpGrlw/AAAAAAAAAAI/AAAAAAAABRU/dfjRy_tzX5M/s50-c-k-no/photo.jpg", + "userId": "108034853522252017283" + }, + "user_tz": 420 + }, + "id": "qSU2h5NRlN7V", + "outputId": "4fb09105-b729-45c3-b5ef-83c8da30a215" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Top 1 Prediction: 389 giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca 0.9220208\n" + ] + } + ], + "source": [ + "with tf.Session(graph=inp.graph):\n", + " x = predictions.eval(feed_dict={inp: img.reshape(1, 224,224, 3)})\n", + "\n", + "label_map = imagenet.create_readable_names_for_imagenet_labels() \n", + "print(\"Top 1 Prediction: \", x.argmax(),label_map[x.argmax()], x.max())" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "id": "CU8dJF8kCo6X" + }, + "outputs": [], + "source": [ + "" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "T_cETKXHDTXu" + ], + "default_view": {}, + "name": "Mobilenet Example.ipynb", + "provenance": [ + { + "file_id": "1ylt6hB0JlXmWU9Bm6O1zGKVPgc2csZf5", + "timestamp": 1521507068201 + } + ], + "version": "0.3.2", + "views": {} + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2.py new file mode 100644 index 0000000..7a06fc2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2.py @@ -0,0 +1,249 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of Mobilenet V2. + +Architecture: https://arxiv.org/abs/1801.04381 + +The base model gives 72.2% accuracy on ImageNet, with 300MMadds, +3.4 M parameters. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import functools + +import tensorflow as tf +from tensorflow.contrib import layers as contrib_layers +from tensorflow.contrib import slim as contrib_slim + +from nets.mobilenet import conv_blocks as ops +from nets.mobilenet import mobilenet as lib + +slim = contrib_slim +op = lib.op + +expand_input = ops.expand_input_by_factor + +# pyformat: disable +# Architecture: https://arxiv.org/abs/1801.04381 +V2_DEF = dict( + defaults={ + # Note: these parameters of batch norm affect the architecture + # that's why they are here and not in training_scope. + (slim.batch_norm,): {'center': True, 'scale': True}, + (slim.conv2d, slim.fully_connected, slim.separable_conv2d): { + 'normalizer_fn': slim.batch_norm, 'activation_fn': tf.nn.relu6 + }, + (ops.expanded_conv,): { + 'expansion_size': expand_input(6), + 'split_expansion': 1, + 'normalizer_fn': slim.batch_norm, + 'residual': True + }, + (slim.conv2d, slim.separable_conv2d): {'padding': 'SAME'} + }, + spec=[ + op(slim.conv2d, stride=2, num_outputs=32, kernel_size=[3, 3]), + op(ops.expanded_conv, + expansion_size=expand_input(1, divisible_by=1), + num_outputs=16), + op(ops.expanded_conv, stride=2, num_outputs=24), + op(ops.expanded_conv, stride=1, num_outputs=24), + op(ops.expanded_conv, stride=2, num_outputs=32), + op(ops.expanded_conv, stride=1, num_outputs=32), + op(ops.expanded_conv, stride=1, num_outputs=32), + op(ops.expanded_conv, stride=2, num_outputs=64), + op(ops.expanded_conv, stride=1, num_outputs=64), + op(ops.expanded_conv, stride=1, num_outputs=64), + op(ops.expanded_conv, stride=1, num_outputs=64), + op(ops.expanded_conv, stride=1, num_outputs=96), + op(ops.expanded_conv, stride=1, num_outputs=96), + op(ops.expanded_conv, stride=1, num_outputs=96), + op(ops.expanded_conv, stride=2, num_outputs=160), + op(ops.expanded_conv, stride=1, num_outputs=160), + op(ops.expanded_conv, stride=1, num_outputs=160), + op(ops.expanded_conv, stride=1, num_outputs=320), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=1280) + ], +) +# pyformat: enable + +# Mobilenet v2 Definition with group normalization. +V2_DEF_GROUP_NORM = copy.deepcopy(V2_DEF) +V2_DEF_GROUP_NORM['defaults'] = { + (contrib_slim.conv2d, contrib_slim.fully_connected, + contrib_slim.separable_conv2d): { + 'normalizer_fn': contrib_layers.group_norm, # pylint: disable=C0330 + 'activation_fn': tf.nn.relu6, # pylint: disable=C0330 + }, # pylint: disable=C0330 + (ops.expanded_conv,): { + 'expansion_size': ops.expand_input_by_factor(6), + 'split_expansion': 1, + 'normalizer_fn': contrib_layers.group_norm, + 'residual': True + }, + (contrib_slim.conv2d, contrib_slim.separable_conv2d): { + 'padding': 'SAME' + } +} + + +@slim.add_arg_scope +def mobilenet(input_tensor, + num_classes=1001, + depth_multiplier=1.0, + scope='MobilenetV2', + conv_defs=None, + finegrain_classification_mode=False, + min_depth=None, + divisible_by=None, + activation_fn=None, + **kwargs): + """Creates mobilenet V2 network. + + Inference mode is created by default. To create training use training_scope + below. + + with tf.contrib.slim.arg_scope(mobilenet_v2.training_scope()): + logits, endpoints = mobilenet_v2.mobilenet(input_tensor) + + Args: + input_tensor: The input tensor + num_classes: number of classes + depth_multiplier: The multiplier applied to scale number of + channels in each layer. + scope: Scope of the operator + conv_defs: Allows to override default conv def. + finegrain_classification_mode: When set to True, the model + will keep the last layer large even for small multipliers. Following + https://arxiv.org/abs/1801.04381 + suggests that it improves performance for ImageNet-type of problems. + *Note* ignored if final_endpoint makes the builder exit earlier. + min_depth: If provided, will ensure that all layers will have that + many channels after application of depth multiplier. + divisible_by: If provided will ensure that all layers # channels + will be divisible by this number. + activation_fn: Activation function to use, defaults to tf.nn.relu6 if not + specified. + **kwargs: passed directly to mobilenet.mobilenet: + prediction_fn- what prediction function to use. + reuse-: whether to reuse variables (if reuse set to true, scope + must be given). + Returns: + logits/endpoints pair + + Raises: + ValueError: On invalid arguments + """ + if conv_defs is None: + conv_defs = V2_DEF + if 'multiplier' in kwargs: + raise ValueError('mobilenetv2 doesn\'t support generic ' + 'multiplier parameter use "depth_multiplier" instead.') + if finegrain_classification_mode: + conv_defs = copy.deepcopy(conv_defs) + if depth_multiplier < 1: + conv_defs['spec'][-1].params['num_outputs'] /= depth_multiplier + if activation_fn: + conv_defs = copy.deepcopy(conv_defs) + defaults = conv_defs['defaults'] + conv_defaults = ( + defaults[(slim.conv2d, slim.fully_connected, slim.separable_conv2d)]) + conv_defaults['activation_fn'] = activation_fn + + depth_args = {} + # NB: do not set depth_args unless they are provided to avoid overriding + # whatever default depth_multiplier might have thanks to arg_scope. + if min_depth is not None: + depth_args['min_depth'] = min_depth + if divisible_by is not None: + depth_args['divisible_by'] = divisible_by + + with slim.arg_scope((lib.depth_multiplier,), **depth_args): + return lib.mobilenet( + input_tensor, + num_classes=num_classes, + conv_defs=conv_defs, + scope=scope, + multiplier=depth_multiplier, + **kwargs) + +mobilenet.default_image_size = 224 + + +def wrapped_partial(func, *args, **kwargs): + partial_func = functools.partial(func, *args, **kwargs) + functools.update_wrapper(partial_func, func) + return partial_func + + +# Wrappers for mobilenet v2 with depth-multipliers. Be noticed that +# 'finegrain_classification_mode' is set to True, which means the embedding +# layer will not be shrinked when given a depth-multiplier < 1.0. +mobilenet_v2_140 = wrapped_partial(mobilenet, depth_multiplier=1.4) +mobilenet_v2_050 = wrapped_partial(mobilenet, depth_multiplier=0.50, + finegrain_classification_mode=True) +mobilenet_v2_035 = wrapped_partial(mobilenet, depth_multiplier=0.35, + finegrain_classification_mode=True) + + +@slim.add_arg_scope +def mobilenet_base(input_tensor, depth_multiplier=1.0, **kwargs): + """Creates base of the mobilenet (no pooling and no logits) .""" + return mobilenet(input_tensor, + depth_multiplier=depth_multiplier, + base_only=True, **kwargs) + + +@slim.add_arg_scope +def mobilenet_base_group_norm(input_tensor, depth_multiplier=1.0, **kwargs): + """Creates base of the mobilenet (no pooling and no logits) .""" + kwargs['conv_defs'] = V2_DEF_GROUP_NORM + kwargs['conv_defs']['defaults'].update({ + (contrib_layers.group_norm,): { + 'groups': kwargs.pop('groups', 8) + } + }) + return mobilenet( + input_tensor, depth_multiplier=depth_multiplier, base_only=True, **kwargs) + + +def training_scope(**kwargs): + """Defines MobilenetV2 training scope. + + Usage: + with tf.contrib.slim.arg_scope(mobilenet_v2.training_scope()): + logits, endpoints = mobilenet_v2.mobilenet(input_tensor) + + with slim. + + Args: + **kwargs: Passed to mobilenet.training_scope. The following parameters + are supported: + weight_decay- The weight decay to use for regularizing the model. + stddev- Standard deviation for initialization, if negative uses xavier. + dropout_keep_prob- dropout keep probability + bn_decay- decay for the batch norm moving averages. + + Returns: + An `arg_scope` to use for the mobilenet v2 model. + """ + return lib.training_scope(**kwargs) + + +__all__ = ['training_scope', 'mobilenet_base', 'mobilenet', 'V2_DEF'] diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2_test.py new file mode 100644 index 0000000..11ab0eb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v2_test.py @@ -0,0 +1,219 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for mobilenet_v2.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import copy +from six.moves import range +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim +from nets.mobilenet import conv_blocks as ops +from nets.mobilenet import mobilenet +from nets.mobilenet import mobilenet_v2 + + +slim = contrib_slim + + +def find_ops(optype): + """Find ops of a given type in graphdef or a graph. + + Args: + optype: operation type (e.g. Conv2D) + Returns: + List of operations. + """ + gd = tf.compat.v1.get_default_graph() + return [var for var in gd.get_operations() if var.type == optype] + + +class MobilenetV2Test(tf.test.TestCase): + + def setUp(self): + tf.compat.v1.reset_default_graph() + + def testCreation(self): + spec = dict(mobilenet_v2.V2_DEF) + _, ep = mobilenet.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=spec) + num_convs = len(find_ops('Conv2D')) + + # This is mostly a sanity test. No deep reason for these particular + # constants. + # + # All but first 2 and last one have two convolutions, and there is one + # extra conv that is not in the spec. (logits) + self.assertEqual(num_convs, len(spec['spec']) * 2 - 2) + # Check that depthwise are exposed. + for i in range(2, 17): + self.assertIn('layer_%d/depthwise_output' % i, ep) + + def testCreationNoClasses(self): + spec = copy.deepcopy(mobilenet_v2.V2_DEF) + net, ep = mobilenet.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=spec, + num_classes=None) + self.assertIs(net, ep['global_pool']) + + def testImageSizes(self): + for input_size, output_size in [(224, 7), (192, 6), (160, 5), + (128, 4), (96, 3)]: + tf.compat.v1.reset_default_graph() + _, ep = mobilenet_v2.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, input_size, input_size, 3))) + + self.assertEqual(ep['layer_18/output'].get_shape().as_list()[1:3], + [output_size] * 2) + + def testWithSplits(self): + spec = copy.deepcopy(mobilenet_v2.V2_DEF) + spec['overrides'] = { + (ops.expanded_conv,): dict(split_expansion=2), + } + _, _ = mobilenet.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=spec) + num_convs = len(find_ops('Conv2D')) + # All but 3 op has 3 conv operatore, the remainign 3 have one + # and there is one unaccounted. + self.assertEqual(num_convs, len(spec['spec']) * 3 - 5) + + def testWithOutputStride8(self): + out, _ = mobilenet.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + output_stride=8, + scope='MobilenetV2') + self.assertEqual(out.get_shape().as_list()[1:3], [28, 28]) + + def testDivisibleBy(self): + tf.compat.v1.reset_default_graph() + mobilenet_v2.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + divisible_by=16, + min_depth=32) + s = [op.outputs[0].get_shape().as_list()[-1] for op in find_ops('Conv2D')] + s = set(s) + self.assertSameElements([32, 64, 96, 160, 192, 320, 384, 576, 960, 1280, + 1001], s) + + def testDivisibleByWithArgScope(self): + tf.compat.v1.reset_default_graph() + # Verifies that depth_multiplier arg scope actually works + # if no default min_depth is provided. + with slim.arg_scope((mobilenet.depth_multiplier,), min_depth=32): + mobilenet_v2.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 2)), + conv_defs=mobilenet_v2.V2_DEF, + depth_multiplier=0.1) + s = [op.outputs[0].get_shape().as_list()[-1] for op in find_ops('Conv2D')] + s = set(s) + self.assertSameElements(s, [32, 192, 128, 1001]) + + def testFineGrained(self): + tf.compat.v1.reset_default_graph() + # Verifies that depth_multiplier arg scope actually works + # if no default min_depth is provided. + + mobilenet_v2.mobilenet( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 2)), + conv_defs=mobilenet_v2.V2_DEF, + depth_multiplier=0.01, + finegrain_classification_mode=True) + s = [op.outputs[0].get_shape().as_list()[-1] for op in find_ops('Conv2D')] + s = set(s) + # All convolutions will be 8->48, except for the last one. + self.assertSameElements(s, [8, 48, 1001, 1280]) + + def testMobilenetBase(self): + tf.compat.v1.reset_default_graph() + # Verifies that mobilenet_base returns pre-pooling layer. + with slim.arg_scope((mobilenet.depth_multiplier,), min_depth=32): + net, _ = mobilenet_v2.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + depth_multiplier=0.1) + self.assertEqual(net.get_shape().as_list(), [10, 7, 7, 128]) + + def testWithOutputStride16(self): + tf.compat.v1.reset_default_graph() + out, _ = mobilenet.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + output_stride=16) + self.assertEqual(out.get_shape().as_list()[1:3], [14, 14]) + + def testMultiplier(self): + op = mobilenet.op + new_def = copy.deepcopy(mobilenet_v2.V2_DEF) + + def inverse_multiplier(output_params, multiplier): + output_params['num_outputs'] = int( + output_params['num_outputs'] / multiplier) + + new_def['spec'][0] = op( + slim.conv2d, + kernel_size=(3, 3), + multiplier_func=inverse_multiplier, + num_outputs=16) + _ = mobilenet_v2.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=new_def, + depth_multiplier=0.1) + s = [op.outputs[0].get_shape().as_list()[-1] for op in find_ops('Conv2D')] + # Expect first layer to be 160 (16 / 0.1), and other layers + # their max(original size * 0.1, 8) + self.assertEqual([160, 8, 48, 8, 48], s[:5]) + + def testWithOutputStride8AndExplicitPadding(self): + tf.compat.v1.reset_default_graph() + out, _ = mobilenet.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + output_stride=8, + use_explicit_padding=True, + scope='MobilenetV2') + self.assertEqual(out.get_shape().as_list()[1:3], [28, 28]) + + def testWithOutputStride16AndExplicitPadding(self): + tf.compat.v1.reset_default_graph() + out, _ = mobilenet.mobilenet_base( + tf.compat.v1.placeholder(tf.float32, (10, 224, 224, 16)), + conv_defs=mobilenet_v2.V2_DEF, + output_stride=16, + use_explicit_padding=True) + self.assertEqual(out.get_shape().as_list()[1:3], [14, 14]) + + def testBatchNormScopeDoesNotHaveIsTrainingWhenItsSetToNone(self): + sc = mobilenet.training_scope(is_training=None) + self.assertNotIn('is_training', sc[slim.arg_scope_func_key( + slim.batch_norm)]) + + def testBatchNormScopeDoesHasIsTrainingWhenItsNotNone(self): + sc = mobilenet.training_scope(is_training=False) + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + sc = mobilenet.training_scope(is_training=True) + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + sc = mobilenet.training_scope() + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3.py new file mode 100644 index 0000000..36dbdaa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3.py @@ -0,0 +1,405 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Mobilenet V3 conv defs and helper functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import functools +import numpy as np + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets.mobilenet import conv_blocks as ops +from nets.mobilenet import mobilenet as lib + +slim = contrib_slim +op = lib.op +expand_input = ops.expand_input_by_factor + +# Squeeze Excite with all parameters filled-in, we use hard-sigmoid +# for gating function and relu for inner activation function. +squeeze_excite = functools.partial( + ops.squeeze_excite, squeeze_factor=4, + inner_activation_fn=tf.nn.relu, + gating_fn=lambda x: tf.nn.relu6(x+3)*0.16667) + +# Wrap squeeze excite op as expansion_transform that takes +# both expansion and input tensor. +_se4 = lambda expansion_tensor, input_tensor: squeeze_excite(expansion_tensor) + + +def hard_swish(x): + with tf.compat.v1.name_scope('hard_swish'): + return x * tf.nn.relu6(x + np.float32(3)) * np.float32(1. / 6.) + + +def reduce_to_1x1(input_tensor, default_size=7, **kwargs): + h, w = input_tensor.shape.as_list()[1:3] + if h is not None and w == h: + k = [h, h] + else: + k = [default_size, default_size] + return slim.avg_pool2d(input_tensor, kernel_size=k, **kwargs) + + +def mbv3_op(ef, n, k, s=1, act=tf.nn.relu, se=None, **kwargs): + """Defines a single Mobilenet V3 convolution block. + + Args: + ef: expansion factor + n: number of output channels + k: stride of depthwise + s: stride + act: activation function in inner layers + se: squeeze excite function. + **kwargs: passed to expanded_conv + + Returns: + An object (lib._Op) for inserting in conv_def, representing this operation. + """ + return op( + ops.expanded_conv, + expansion_size=expand_input(ef), + kernel_size=(k, k), + stride=s, + num_outputs=n, + inner_activation_fn=act, + expansion_transform=se, + **kwargs) + + +def mbv3_fused(ef, n, k, s=1, **kwargs): + """Defines a single Mobilenet V3 convolution block. + + Args: + ef: expansion factor + n: number of output channels + k: stride of depthwise + s: stride + **kwargs: will be passed to mbv3_op + + Returns: + An object (lib._Op) for inserting in conv_def, representing this operation. + """ + expansion_fn = functools.partial(slim.conv2d, kernel_size=k, stride=s) + return mbv3_op( + ef, + n, + k=1, + s=s, + depthwise_location=None, + expansion_fn=expansion_fn, + **kwargs) + + +mbv3_op_se = functools.partial(mbv3_op, se=_se4) + + +DEFAULTS = { + (ops.expanded_conv,): + dict( + normalizer_fn=slim.batch_norm, + residual=True), + (slim.conv2d, slim.fully_connected, slim.separable_conv2d): { + 'normalizer_fn': slim.batch_norm, + 'activation_fn': tf.nn.relu, + }, + (slim.batch_norm,): { + 'center': True, + 'scale': True + }, +} + +# Compatible checkpoint: http://mldash/5511169891790690458#scalars +V3_LARGE = dict( + defaults=dict(DEFAULTS), + spec=([ + # stage 1 + op(slim.conv2d, stride=2, num_outputs=16, kernel_size=(3, 3), + activation_fn=hard_swish), + mbv3_op(ef=1, n=16, k=3), + mbv3_op(ef=4, n=24, k=3, s=2), + mbv3_op(ef=3, n=24, k=3, s=1), + mbv3_op_se(ef=3, n=40, k=5, s=2), + mbv3_op_se(ef=3, n=40, k=5, s=1), + mbv3_op_se(ef=3, n=40, k=5, s=1), + mbv3_op(ef=6, n=80, k=3, s=2, act=hard_swish), + mbv3_op(ef=2.5, n=80, k=3, s=1, act=hard_swish), + mbv3_op(ef=184/80., n=80, k=3, s=1, act=hard_swish), + mbv3_op(ef=184/80., n=80, k=3, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=112, k=3, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=112, k=3, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=160, k=5, s=2, act=hard_swish), + mbv3_op_se(ef=6, n=160, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=160, k=5, s=1, act=hard_swish), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=960, + activation_fn=hard_swish), + op(reduce_to_1x1, default_size=7, stride=1, padding='VALID'), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=1280, + normalizer_fn=None, activation_fn=hard_swish) + ])) + +# 72.2% accuracy. +V3_LARGE_MINIMALISTIC = dict( + defaults=dict(DEFAULTS), + spec=([ + # stage 1 + op(slim.conv2d, stride=2, num_outputs=16, kernel_size=(3, 3)), + mbv3_op(ef=1, n=16, k=3), + mbv3_op(ef=4, n=24, k=3, s=2), + mbv3_op(ef=3, n=24, k=3, s=1), + mbv3_op(ef=3, n=40, k=3, s=2), + mbv3_op(ef=3, n=40, k=3, s=1), + mbv3_op(ef=3, n=40, k=3, s=1), + mbv3_op(ef=6, n=80, k=3, s=2), + mbv3_op(ef=2.5, n=80, k=3, s=1), + mbv3_op(ef=184 / 80., n=80, k=3, s=1), + mbv3_op(ef=184 / 80., n=80, k=3, s=1), + mbv3_op(ef=6, n=112, k=3, s=1), + mbv3_op(ef=6, n=112, k=3, s=1), + mbv3_op(ef=6, n=160, k=3, s=2), + mbv3_op(ef=6, n=160, k=3, s=1), + mbv3_op(ef=6, n=160, k=3, s=1), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=960), + op(reduce_to_1x1, default_size=7, stride=1, padding='VALID'), + op(slim.conv2d, + stride=1, + kernel_size=[1, 1], + num_outputs=1280, + normalizer_fn=None) + ])) + +# Compatible run: http://mldash/2023283040014348118#scalars +V3_SMALL = dict( + defaults=dict(DEFAULTS), + spec=([ + # stage 1 + op(slim.conv2d, stride=2, num_outputs=16, kernel_size=(3, 3), + activation_fn=hard_swish), + mbv3_op_se(ef=1, n=16, k=3, s=2), + mbv3_op(ef=72./16, n=24, k=3, s=2), + mbv3_op(ef=(88./24), n=24, k=3, s=1), + mbv3_op_se(ef=4, n=40, k=5, s=2, act=hard_swish), + mbv3_op_se(ef=6, n=40, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=40, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=3, n=48, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=3, n=48, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=96, k=5, s=2, act=hard_swish), + mbv3_op_se(ef=6, n=96, k=5, s=1, act=hard_swish), + mbv3_op_se(ef=6, n=96, k=5, s=1, act=hard_swish), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=576, + activation_fn=hard_swish), + op(reduce_to_1x1, default_size=7, stride=1, padding='VALID'), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=1024, + normalizer_fn=None, activation_fn=hard_swish) + ])) + +# 62% accuracy. +V3_SMALL_MINIMALISTIC = dict( + defaults=dict(DEFAULTS), + spec=([ + # stage 1 + op(slim.conv2d, stride=2, num_outputs=16, kernel_size=(3, 3)), + mbv3_op(ef=1, n=16, k=3, s=2), + mbv3_op(ef=72. / 16, n=24, k=3, s=2), + mbv3_op(ef=(88. / 24), n=24, k=3, s=1), + mbv3_op(ef=4, n=40, k=3, s=2), + mbv3_op(ef=6, n=40, k=3, s=1), + mbv3_op(ef=6, n=40, k=3, s=1), + mbv3_op(ef=3, n=48, k=3, s=1), + mbv3_op(ef=3, n=48, k=3, s=1), + mbv3_op(ef=6, n=96, k=3, s=2), + mbv3_op(ef=6, n=96, k=3, s=1), + mbv3_op(ef=6, n=96, k=3, s=1), + op(slim.conv2d, stride=1, kernel_size=[1, 1], num_outputs=576), + op(reduce_to_1x1, default_size=7, stride=1, padding='VALID'), + op(slim.conv2d, + stride=1, + kernel_size=[1, 1], + num_outputs=1024, + normalizer_fn=None) + ])) + + +# EdgeTPU friendly variant of MobilenetV3 that uses fused convolutions +# instead of depthwise in the early layers. +V3_EDGETPU = dict( + defaults=dict(DEFAULTS), + spec=[ + op(slim.conv2d, stride=2, num_outputs=32, kernel_size=(3, 3)), + mbv3_fused(k=3, s=1, ef=1, n=16), + mbv3_fused(k=3, s=2, ef=8, n=32), + mbv3_fused(k=3, s=1, ef=4, n=32), + mbv3_fused(k=3, s=1, ef=4, n=32), + mbv3_fused(k=3, s=1, ef=4, n=32), + mbv3_fused(k=3, s=2, ef=8, n=48), + mbv3_fused(k=3, s=1, ef=4, n=48), + mbv3_fused(k=3, s=1, ef=4, n=48), + mbv3_fused(k=3, s=1, ef=4, n=48), + mbv3_op(k=3, s=2, ef=8, n=96), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=3, s=1, ef=8, n=96, residual=False), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=3, s=1, ef=4, n=96), + mbv3_op(k=5, s=2, ef=8, n=160), + mbv3_op(k=5, s=1, ef=4, n=160), + mbv3_op(k=5, s=1, ef=4, n=160), + mbv3_op(k=5, s=1, ef=4, n=160), + mbv3_op(k=3, s=1, ef=8, n=192), + op(slim.conv2d, stride=1, num_outputs=1280, kernel_size=(1, 1)), + ]) + + +@slim.add_arg_scope +def mobilenet(input_tensor, + num_classes=1001, + depth_multiplier=1.0, + scope='MobilenetV3', + conv_defs=None, + finegrain_classification_mode=False, + **kwargs): + """Creates mobilenet V3 network. + + Inference mode is created by default. To create training use training_scope + below. + + with tf.contrib.slim.arg_scope(mobilenet_v3.training_scope()): + logits, endpoints = mobilenet_v3.mobilenet(input_tensor) + + Args: + input_tensor: The input tensor + num_classes: number of classes + depth_multiplier: The multiplier applied to scale number of + channels in each layer. + scope: Scope of the operator + conv_defs: Which version to create. Could be large/small or + any conv_def (see mobilenet_v3.py for examples). + finegrain_classification_mode: When set to True, the model + will keep the last layer large even for small multipliers. Following + https://arxiv.org/abs/1801.04381 + it improves performance for ImageNet-type of problems. + *Note* ignored if final_endpoint makes the builder exit earlier. + **kwargs: passed directly to mobilenet.mobilenet: + prediction_fn- what prediction function to use. + reuse-: whether to reuse variables (if reuse set to true, scope + must be given). + Returns: + logits/endpoints pair + + Raises: + ValueError: On invalid arguments + """ + if conv_defs is None: + conv_defs = V3_LARGE + if 'multiplier' in kwargs: + raise ValueError('mobilenetv2 doesn\'t support generic ' + 'multiplier parameter use "depth_multiplier" instead.') + if finegrain_classification_mode: + conv_defs = copy.deepcopy(conv_defs) + conv_defs['spec'][-1] = conv_defs['spec'][-1]._replace( + multiplier_func=lambda params, multiplier: params) + depth_args = {} + with slim.arg_scope((lib.depth_multiplier,), **depth_args): + return lib.mobilenet( + input_tensor, + num_classes=num_classes, + conv_defs=conv_defs, + scope=scope, + multiplier=depth_multiplier, + **kwargs) + +mobilenet.default_image_size = 224 +training_scope = lib.training_scope + + +@slim.add_arg_scope +def mobilenet_base(input_tensor, depth_multiplier=1.0, **kwargs): + """Creates base of the mobilenet (no pooling and no logits) .""" + return mobilenet( + input_tensor, depth_multiplier=depth_multiplier, base_only=True, **kwargs) + + +def wrapped_partial(func, new_defaults=None, + **kwargs): + """Partial function with new default parameters and updated docstring.""" + if not new_defaults: + new_defaults = {} + def func_wrapper(*f_args, **f_kwargs): + new_kwargs = dict(new_defaults) + new_kwargs.update(f_kwargs) + return func(*f_args, **new_kwargs) + functools.update_wrapper(func_wrapper, func) + partial_func = functools.partial(func_wrapper, **kwargs) + functools.update_wrapper(partial_func, func) + return partial_func + + +large = wrapped_partial(mobilenet, conv_defs=V3_LARGE) +small = wrapped_partial(mobilenet, conv_defs=V3_SMALL) +edge_tpu = wrapped_partial(mobilenet, + new_defaults={'scope': 'MobilenetEdgeTPU'}, + conv_defs=V3_EDGETPU) +edge_tpu_075 = wrapped_partial( + mobilenet, + new_defaults={'scope': 'MobilenetEdgeTPU'}, + conv_defs=V3_EDGETPU, + depth_multiplier=0.75, + finegrain_classification_mode=True) + +# Minimalistic model that does not have Squeeze Excite blocks, +# Hardswish, or 5x5 depthwise convolution. +# This makes the model very friendly for a wide range of hardware +large_minimalistic = wrapped_partial(mobilenet, conv_defs=V3_LARGE_MINIMALISTIC) +small_minimalistic = wrapped_partial(mobilenet, conv_defs=V3_SMALL_MINIMALISTIC) + + +def _reduce_consecutive_layers(conv_defs, start_id, end_id, multiplier=0.5): + """Reduce the outputs of consecutive layers with multiplier. + + Args: + conv_defs: Mobilenet conv_defs. + start_id: 0-based index of the starting conv_def to be reduced. + end_id: 0-based index of the last conv_def to be reduced. + multiplier: The multiplier by which to reduce the conv_defs. + + Returns: + Mobilenet conv_defs where the output sizes from layers [start_id, end_id], + inclusive, are reduced by multiplier. + + Raises: + ValueError if any layer to be reduced does not have the 'num_outputs' + attribute. + """ + defs = copy.deepcopy(conv_defs) + for d in defs['spec'][start_id:end_id+1]: + d.params.update({ + 'num_outputs': np.int(np.round(d.params['num_outputs'] * multiplier)) + }) + return defs + + +V3_LARGE_DETECTION = _reduce_consecutive_layers(V3_LARGE, 13, 16) +V3_SMALL_DETECTION = _reduce_consecutive_layers(V3_SMALL, 9, 12) + + +__all__ = ['training_scope', 'mobilenet', 'V3_LARGE', 'V3_SMALL', 'large', + 'small', 'V3_LARGE_DETECTION', 'V3_SMALL_DETECTION'] diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3_test.py new file mode 100644 index 0000000..45f1b10 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet/mobilenet_v3_test.py @@ -0,0 +1,82 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for google3.third_party.tensorflow_models.slim.nets.mobilenet.mobilenet_v3.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import absltest +import tensorflow as tf + +from nets.mobilenet import mobilenet_v3 + + +class MobilenetV3Test(absltest.TestCase): + + def setUp(self): + super(MobilenetV3Test, self).setUp() + tf.compat.v1.reset_default_graph() + + def testMobilenetV3Large(self): + logits, endpoints = mobilenet_v3.mobilenet( + tf.compat.v1.placeholder(tf.float32, (1, 224, 224, 3))) + self.assertEqual(endpoints['layer_19'].shape, [1, 1, 1, 1280]) + self.assertEqual(logits.shape, [1, 1001]) + + def testMobilenetV3Small(self): + _, endpoints = mobilenet_v3.mobilenet( + tf.compat.v1.placeholder(tf.float32, (1, 224, 224, 3)), + conv_defs=mobilenet_v3.V3_SMALL) + self.assertEqual(endpoints['layer_15'].shape, [1, 1, 1, 1024]) + + def testMobilenetEdgeTpu(self): + _, endpoints = mobilenet_v3.edge_tpu( + tf.compat.v1.placeholder(tf.float32, (1, 224, 224, 3))) + self.assertIn('Inference mode is created by default', + mobilenet_v3.edge_tpu.__doc__) + self.assertEqual(endpoints['layer_24'].shape, [1, 7, 7, 1280]) + self.assertStartsWith( + endpoints['layer_24'].name, 'MobilenetEdgeTPU') + + def testMobilenetEdgeTpuChangeScope(self): + _, endpoints = mobilenet_v3.edge_tpu( + tf.compat.v1.placeholder(tf.float32, (1, 224, 224, 3)), scope='Scope') + self.assertStartsWith( + endpoints['layer_24'].name, 'Scope') + + def testMobilenetV3BaseOnly(self): + result, endpoints = mobilenet_v3.mobilenet( + tf.compat.v1.placeholder(tf.float32, (1, 224, 224, 3)), + conv_defs=mobilenet_v3.V3_LARGE, + base_only=True, + final_endpoint='layer_17') + # Get the latest layer before average pool. + self.assertEqual(endpoints['layer_17'].shape, [1, 7, 7, 960]) + self.assertEqual(result, endpoints['layer_17']) + + def testMobilenetV3BaseOnly_VariableInput(self): + result, endpoints = mobilenet_v3.mobilenet( + tf.placeholder(tf.float32, (None, None, None, 3)), + conv_defs=mobilenet_v3.V3_LARGE, + base_only=True, + final_endpoint='layer_17') + # Get the latest layer before average pool. + self.assertEqual(endpoints['layer_17'].shape.as_list(), + [None, None, None, 960]) + self.assertEqual(result, endpoints['layer_17']) + +if __name__ == '__main__': + absltest.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.md b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.md new file mode 100644 index 0000000..ba4cc23 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.md @@ -0,0 +1,136 @@ +# MobilenetV2 and above +For MobilenetV2+ see this file [mobilenet/README.md](mobilenet/README.md) + +# MobileNetV1 + +[MobileNets](https://arxiv.org/abs/1704.04861) are small, low-latency, low-power models parameterized to meet the resource constraints of a variety of use cases. They can be built upon for classification, detection, embeddings and segmentation similar to how other popular large scale models, such as Inception, are used. MobileNets can be run efficiently on mobile devices with [TensorFlow Mobile](https://www.tensorflow.org/mobile/). + +MobileNets trade off between latency, size and accuracy while comparing favorably with popular models from the literature. + +![alt text](mobilenet_v1.png "MobileNet Graph") + +# Pre-trained Models + +Choose the right MobileNet model to fit your latency and size budget. The size of the network in memory and on disk is proportional to the number of parameters. The latency and power usage of the network scales with the number of Multiply-Accumulates (MACs) which measures the number of fused Multiplication and Addition operations. These MobileNet models have been trained on the +[ILSVRC-2012-CLS](http://www.image-net.org/challenges/LSVRC/2012/) +image classification dataset. Accuracies were computed by evaluating using a single image crop. + +Model | Million MACs | Million Parameters | Top-1 Accuracy| Top-5 Accuracy | +:----:|:------------:|:----------:|:-------:|:-------:| +[MobileNet_v1_1.0_224](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224.tgz)|569|4.24|70.9|89.9| +[MobileNet_v1_1.0_192](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_192.tgz)|418|4.24|70.0|89.2| +[MobileNet_v1_1.0_160](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_160.tgz)|291|4.24|68.0|87.7| +[MobileNet_v1_1.0_128](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_128.tgz)|186|4.24|65.2|85.8| +[MobileNet_v1_0.75_224](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_224.tgz)|317|2.59|68.4|88.2| +[MobileNet_v1_0.75_192](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_192.tgz)|233|2.59|67.2|87.3| +[MobileNet_v1_0.75_160](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_160.tgz)|162|2.59|65.3|86.0| +[MobileNet_v1_0.75_128](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_128.tgz)|104|2.59|62.1|83.9| +[MobileNet_v1_0.50_224](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_224.tgz)|150|1.34|63.3|84.9| +[MobileNet_v1_0.50_192](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_192.tgz)|110|1.34|61.7|83.6| +[MobileNet_v1_0.50_160](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_160.tgz)|77|1.34|59.1|81.9| +[MobileNet_v1_0.50_128](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_128.tgz)|49|1.34|56.3|79.4| +[MobileNet_v1_0.25_224](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_224.tgz)|41|0.47|49.8|74.2| +[MobileNet_v1_0.25_192](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_192.tgz)|34|0.47|47.7|72.3| +[MobileNet_v1_0.25_160](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_160.tgz)|21|0.47|45.5|70.3| +[MobileNet_v1_0.25_128](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_128.tgz)|14|0.47|41.5|66.3| +[MobileNet_v1_1.0_224_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tgz)|569|4.24|70.1|88.9| +[MobileNet_v1_1.0_192_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_192_quant.tgz)|418|4.24|69.2|88.3| +[MobileNet_v1_1.0_160_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_160_quant.tgz)|291|4.24|67.2|86.7| +[MobileNet_v1_1.0_128_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_128_quant.tgz)|186|4.24|63.4|84.2| +[MobileNet_v1_0.75_224_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_224_quant.tgz)|317|2.59|66.8|87.0| +[MobileNet_v1_0.75_192_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_192_quant.tgz)|233|2.59|66.1|86.4| +[MobileNet_v1_0.75_160_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_160_quant.tgz)|162|2.59|62.3|83.8| +[MobileNet_v1_0.75_128_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.75_128_quant.tgz)|104|2.59|55.8|78.8| +[MobileNet_v1_0.50_224_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_224_quant.tgz)|150|1.34|60.7|83.2| +[MobileNet_v1_0.50_192_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_192_quant.tgz)|110|1.34|60.0|82.2| +[MobileNet_v1_0.50_160_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_160_quant.tgz)|77|1.34|57.7|80.4| +[MobileNet_v1_0.50_128_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.5_128_quant.tgz)|49|1.34|54.5|77.7| +[MobileNet_v1_0.25_224_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_224_quant.tgz)|41|0.47|48.0|72.8| +[MobileNet_v1_0.25_192_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_192_quant.tgz)|34|0.47|46.0|71.2| +[MobileNet_v1_0.25_160_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_160_quant.tgz)|21|0.47|43.4|68.5| +[MobileNet_v1_0.25_128_quant](http://download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_0.25_128_quant.tgz)|14|0.47|39.5|64.4| + +Revisions to models: +* July 12, 2018: Update to TFLite models that fixes an accuracy issue resolved by making conversion support weights with narrow_range. We now report validation on the actual TensorFlow Lite model rather than the emulated quantization number of TensorFlow. +* August 2, 2018: Update to TFLite models that fixes an accuracy issue resolved by making sure the numerics of quantization match TF quantized training accurately. + +The linked model tar files contain the following: +* Trained model checkpoints +* Eval graph text protos (to be easily viewed) +* Frozen trained models +* Info file containing input and output information +* Converted [TensorFlow Lite](https://www.tensorflow.org/mobile/tflite/) flatbuffer model + +Note that quantized model GraphDefs are still float models, they just have FakeQuantization +operation embedded to simulate quantization. These are converted by [TensorFlow Lite](https://www.tensorflow.org/mobile/tflite/) +to be fully quantized. The final effect of quantization can be seen by comparing the frozen fake +quantized graph to the size of the TFLite flatbuffer, i.e. The TFLite flatbuffer is about 1/4 +the size. +For more information on the quantization techniques used here, see +[here](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/quantize). + +Here is an example of how to download the MobileNet_v1_1.0_224 checkpoint: + +```shell +$ CHECKPOINT_DIR=/tmp/checkpoints +$ mkdir ${CHECKPOINT_DIR} +$ wget http://download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz +$ tar -xvf mobilenet_v1_1.0_224.tgz +$ mv mobilenet_v1_1.0_224.ckpt.* ${CHECKPOINT_DIR} +``` + +# MobileNet V1 scripts + +This package contains scripts for training floating point and eight-bit fixed +point TensorFlow models. + +Quantization tools used are described in [contrib/quantize](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/quantize). + +Conversion to fully quantized models for mobile can be done through [TensorFlow Lite](https://www.tensorflow.org/mobile/tflite/). + +## Usage + +### Build for GPU + +``` +$ bazel build -c opt --config=cuda mobilenet_v1_{eval,train} +``` + +### Running + +#### Float Training and Eval + +Train: + +``` +$ ./bazel-bin/mobilenet_v1_train --dataset_dir "path/to/dataset" --checkpoint_dir "path/to/checkpoints" +``` + +Eval: + +``` +$ ./bazel-bin/mobilenet_v1_eval --dataset_dir "path/to/dataset" --checkpoint_dir "path/to/checkpoints" +``` + +#### Quantized Training and Eval + +Train from preexisting float checkpoint: + +``` +$ ./bazel-bin/mobilenet_v1_train --dataset_dir "path/to/dataset" --checkpoint_dir "path/to/checkpoints" \ + --quantize=True --fine_tune_checkpoint=float/checkpoint/path +``` + +Train from scratch: + +``` +$ ./bazel-bin/mobilenet_v1_train --dataset_dir "path/to/dataset" --checkpoint_dir "path/to/checkpoints" --quantize=True +``` + +Eval: + +``` +$ ./bazel-bin/mobilenet_v1_eval --dataset_dir "path/to/dataset" --checkpoint_dir "path/to/checkpoints" --quantize=True +``` + +The resulting float and quantized models can be run on-device via [TensorFlow Lite](https://www.tensorflow.org/mobile/tflite/). diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.py new file mode 100644 index 0000000..107c347 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1.py @@ -0,0 +1,482 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= +"""MobileNet v1. + +MobileNet is a general architecture and can be used for multiple use cases. +Depending on the use case, it can use different input layer size and different +head (for example: embeddings, localization and classification). + +As described in https://arxiv.org/abs/1704.04861. + + MobileNets: Efficient Convolutional Neural Networks for + Mobile Vision Applications + Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, + Tobias Weyand, Marco Andreetto, Hartwig Adam + +100% Mobilenet V1 (base) with input size 224x224: + +See mobilenet_v1() + +Layer params macs +-------------------------------------------------------------------------------- +MobilenetV1/Conv2d_0/Conv2D: 864 10,838,016 +MobilenetV1/Conv2d_1_depthwise/depthwise: 288 3,612,672 +MobilenetV1/Conv2d_1_pointwise/Conv2D: 2,048 25,690,112 +MobilenetV1/Conv2d_2_depthwise/depthwise: 576 1,806,336 +MobilenetV1/Conv2d_2_pointwise/Conv2D: 8,192 25,690,112 +MobilenetV1/Conv2d_3_depthwise/depthwise: 1,152 3,612,672 +MobilenetV1/Conv2d_3_pointwise/Conv2D: 16,384 51,380,224 +MobilenetV1/Conv2d_4_depthwise/depthwise: 1,152 903,168 +MobilenetV1/Conv2d_4_pointwise/Conv2D: 32,768 25,690,112 +MobilenetV1/Conv2d_5_depthwise/depthwise: 2,304 1,806,336 +MobilenetV1/Conv2d_5_pointwise/Conv2D: 65,536 51,380,224 +MobilenetV1/Conv2d_6_depthwise/depthwise: 2,304 451,584 +MobilenetV1/Conv2d_6_pointwise/Conv2D: 131,072 25,690,112 +MobilenetV1/Conv2d_7_depthwise/depthwise: 4,608 903,168 +MobilenetV1/Conv2d_7_pointwise/Conv2D: 262,144 51,380,224 +MobilenetV1/Conv2d_8_depthwise/depthwise: 4,608 903,168 +MobilenetV1/Conv2d_8_pointwise/Conv2D: 262,144 51,380,224 +MobilenetV1/Conv2d_9_depthwise/depthwise: 4,608 903,168 +MobilenetV1/Conv2d_9_pointwise/Conv2D: 262,144 51,380,224 +MobilenetV1/Conv2d_10_depthwise/depthwise: 4,608 903,168 +MobilenetV1/Conv2d_10_pointwise/Conv2D: 262,144 51,380,224 +MobilenetV1/Conv2d_11_depthwise/depthwise: 4,608 903,168 +MobilenetV1/Conv2d_11_pointwise/Conv2D: 262,144 51,380,224 +MobilenetV1/Conv2d_12_depthwise/depthwise: 4,608 225,792 +MobilenetV1/Conv2d_12_pointwise/Conv2D: 524,288 25,690,112 +MobilenetV1/Conv2d_13_depthwise/depthwise: 9,216 451,584 +MobilenetV1/Conv2d_13_pointwise/Conv2D: 1,048,576 51,380,224 +-------------------------------------------------------------------------------- +Total: 3,185,088 567,716,352 + + +75% Mobilenet V1 (base) with input size 128x128: + +See mobilenet_v1_075() + +Layer params macs +-------------------------------------------------------------------------------- +MobilenetV1/Conv2d_0/Conv2D: 648 2,654,208 +MobilenetV1/Conv2d_1_depthwise/depthwise: 216 884,736 +MobilenetV1/Conv2d_1_pointwise/Conv2D: 1,152 4,718,592 +MobilenetV1/Conv2d_2_depthwise/depthwise: 432 442,368 +MobilenetV1/Conv2d_2_pointwise/Conv2D: 4,608 4,718,592 +MobilenetV1/Conv2d_3_depthwise/depthwise: 864 884,736 +MobilenetV1/Conv2d_3_pointwise/Conv2D: 9,216 9,437,184 +MobilenetV1/Conv2d_4_depthwise/depthwise: 864 221,184 +MobilenetV1/Conv2d_4_pointwise/Conv2D: 18,432 4,718,592 +MobilenetV1/Conv2d_5_depthwise/depthwise: 1,728 442,368 +MobilenetV1/Conv2d_5_pointwise/Conv2D: 36,864 9,437,184 +MobilenetV1/Conv2d_6_depthwise/depthwise: 1,728 110,592 +MobilenetV1/Conv2d_6_pointwise/Conv2D: 73,728 4,718,592 +MobilenetV1/Conv2d_7_depthwise/depthwise: 3,456 221,184 +MobilenetV1/Conv2d_7_pointwise/Conv2D: 147,456 9,437,184 +MobilenetV1/Conv2d_8_depthwise/depthwise: 3,456 221,184 +MobilenetV1/Conv2d_8_pointwise/Conv2D: 147,456 9,437,184 +MobilenetV1/Conv2d_9_depthwise/depthwise: 3,456 221,184 +MobilenetV1/Conv2d_9_pointwise/Conv2D: 147,456 9,437,184 +MobilenetV1/Conv2d_10_depthwise/depthwise: 3,456 221,184 +MobilenetV1/Conv2d_10_pointwise/Conv2D: 147,456 9,437,184 +MobilenetV1/Conv2d_11_depthwise/depthwise: 3,456 221,184 +MobilenetV1/Conv2d_11_pointwise/Conv2D: 147,456 9,437,184 +MobilenetV1/Conv2d_12_depthwise/depthwise: 3,456 55,296 +MobilenetV1/Conv2d_12_pointwise/Conv2D: 294,912 4,718,592 +MobilenetV1/Conv2d_13_depthwise/depthwise: 6,912 110,592 +MobilenetV1/Conv2d_13_pointwise/Conv2D: 589,824 9,437,184 +-------------------------------------------------------------------------------- +Total: 1,800,144 106,002,432 + +""" + +# Tensorflow mandates these. +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from collections import namedtuple +import functools + +import tensorflow as tf +from tensorflow.contrib import layers as contrib_layers +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +# Conv and DepthSepConv namedtuple define layers of the MobileNet architecture +# Conv defines 3x3 convolution layers +# DepthSepConv defines 3x3 depthwise convolution followed by 1x1 convolution. +# stride is the stride of the convolution +# depth is the number of channels or filters in a layer +Conv = namedtuple('Conv', ['kernel', 'stride', 'depth']) +DepthSepConv = namedtuple('DepthSepConv', ['kernel', 'stride', 'depth']) + +# MOBILENETV1_CONV_DEFS specifies the MobileNet body +MOBILENETV1_CONV_DEFS = [ + Conv(kernel=[3, 3], stride=2, depth=32), + DepthSepConv(kernel=[3, 3], stride=1, depth=64), + DepthSepConv(kernel=[3, 3], stride=2, depth=128), + DepthSepConv(kernel=[3, 3], stride=1, depth=128), + DepthSepConv(kernel=[3, 3], stride=2, depth=256), + DepthSepConv(kernel=[3, 3], stride=1, depth=256), + DepthSepConv(kernel=[3, 3], stride=2, depth=512), + DepthSepConv(kernel=[3, 3], stride=1, depth=512), + DepthSepConv(kernel=[3, 3], stride=1, depth=512), + DepthSepConv(kernel=[3, 3], stride=1, depth=512), + DepthSepConv(kernel=[3, 3], stride=1, depth=512), + DepthSepConv(kernel=[3, 3], stride=1, depth=512), + DepthSepConv(kernel=[3, 3], stride=2, depth=1024), + DepthSepConv(kernel=[3, 3], stride=1, depth=1024) +] + + +def _fixed_padding(inputs, kernel_size, rate=1): + """Pads the input along the spatial dimensions independently of input size. + + Pads the input such that if it was used in a convolution with 'VALID' padding, + the output would have the same dimensions as if the unpadded input was used + in a convolution with 'SAME' padding. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + rate: An integer, rate for atrous convolution. + + Returns: + output: A tensor of size [batch, height_out, width_out, channels] with the + input, either intact (if kernel_size == 1) or padded (if kernel_size > 1). + """ + kernel_size_effective = [kernel_size[0] + (kernel_size[0] - 1) * (rate - 1), + kernel_size[0] + (kernel_size[0] - 1) * (rate - 1)] + pad_total = [kernel_size_effective[0] - 1, kernel_size_effective[1] - 1] + pad_beg = [pad_total[0] // 2, pad_total[1] // 2] + pad_end = [pad_total[0] - pad_beg[0], pad_total[1] - pad_beg[1]] + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [pad_beg[0], pad_end[0]], [pad_beg[1], pad_end[1]], + [0, 0]]) + return padded_inputs + + +def mobilenet_v1_base(inputs, + final_endpoint='Conv2d_13_pointwise', + min_depth=8, + depth_multiplier=1.0, + conv_defs=None, + output_stride=None, + use_explicit_padding=False, + scope=None): + """Mobilenet v1. + + Constructs a Mobilenet v1 network from inputs to the given final endpoint. + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + final_endpoint: specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_0', 'Conv2d_1_pointwise', 'Conv2d_2_pointwise', + 'Conv2d_3_pointwise', 'Conv2d_4_pointwise', 'Conv2d_5'_pointwise, + 'Conv2d_6_pointwise', 'Conv2d_7_pointwise', 'Conv2d_8_pointwise', + 'Conv2d_9_pointwise', 'Conv2d_10_pointwise', 'Conv2d_11_pointwise', + 'Conv2d_12_pointwise', 'Conv2d_13_pointwise']. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + conv_defs: A list of ConvDef namedtuples specifying the net architecture. + output_stride: An integer that specifies the requested ratio of input to + output spatial resolution. If not None, then we invoke atrous convolution + if necessary to prevent the network from reducing the spatial resolution + of the activation maps. Allowed values are 8 (accurate fully convolutional + mode), 16 (fast fully convolutional mode), 32 (classification mode). + use_explicit_padding: Use 'VALID' padding for convolutions, but prepad + inputs so that the output dimensions are the same as if 'SAME' padding + were used. + scope: Optional variable_scope. + + Returns: + tensor_out: output tensor corresponding to the final_endpoint. + end_points: a set of activations for external use, for example summaries or + losses. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, + or depth_multiplier <= 0, or the target output_stride is not + allowed. + """ + depth = lambda d: max(int(d * depth_multiplier), min_depth) + end_points = {} + + # Used to find thinned depths for each layer. + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + + if conv_defs is None: + conv_defs = MOBILENETV1_CONV_DEFS + + if output_stride is not None and output_stride not in [8, 16, 32]: + raise ValueError('Only allowed output_stride values are 8, 16, 32.') + + padding = 'SAME' + if use_explicit_padding: + padding = 'VALID' + with tf.compat.v1.variable_scope(scope, 'MobilenetV1', [inputs]): + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], padding=padding): + # The current_stride variable keeps track of the output stride of the + # activations, i.e., the running product of convolution strides up to the + # current network layer. This allows us to invoke atrous convolution + # whenever applying the next convolution would result in the activations + # having output stride larger than the target output_stride. + current_stride = 1 + + # The atrous convolution rate parameter. + rate = 1 + + net = inputs + for i, conv_def in enumerate(conv_defs): + end_point_base = 'Conv2d_%d' % i + + if output_stride is not None and current_stride == output_stride: + # If we have reached the target output_stride, then we need to employ + # atrous convolution with stride=1 and multiply the atrous rate by the + # current unit's stride for use in subsequent layers. + layer_stride = 1 + layer_rate = rate + rate *= conv_def.stride + else: + layer_stride = conv_def.stride + layer_rate = 1 + current_stride *= conv_def.stride + + if isinstance(conv_def, Conv): + end_point = end_point_base + if use_explicit_padding: + net = _fixed_padding(net, conv_def.kernel) + net = slim.conv2d(net, depth(conv_def.depth), conv_def.kernel, + stride=conv_def.stride, + scope=end_point) + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + + elif isinstance(conv_def, DepthSepConv): + end_point = end_point_base + '_depthwise' + + # By passing filters=None + # separable_conv2d produces only a depthwise convolution layer + if use_explicit_padding: + net = _fixed_padding(net, conv_def.kernel, layer_rate) + net = slim.separable_conv2d(net, None, conv_def.kernel, + depth_multiplier=1, + stride=layer_stride, + rate=layer_rate, + scope=end_point) + + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + + end_point = end_point_base + '_pointwise' + + net = slim.conv2d(net, depth(conv_def.depth), [1, 1], + stride=1, + scope=end_point) + + end_points[end_point] = net + if end_point == final_endpoint: + return net, end_points + else: + raise ValueError('Unknown convolution type %s for layer %d' + % (conv_def.ltype, i)) + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def mobilenet_v1(inputs, + num_classes=1000, + dropout_keep_prob=0.999, + is_training=True, + min_depth=8, + depth_multiplier=1.0, + conv_defs=None, + prediction_fn=contrib_layers.softmax, + spatial_squeeze=True, + reuse=None, + scope='MobilenetV1', + global_pool=False): + """Mobilenet v1 model for classification. + + Args: + inputs: a tensor of shape [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer + is omitted and the input features to the logits layer (before dropout) + are returned instead. + dropout_keep_prob: the percentage of activation values that are retained. + is_training: whether is training or not. + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + conv_defs: A list of ConvDef namedtuples specifying the net architecture. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape is [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + global_pool: Optional boolean flag to control the avgpooling before the + logits layer. If false or unset, pooling is done with a fixed window + that reduces default-sized inputs to 1x1, while larger inputs lead to + larger outputs. If true, any input size is pooled down to 1x1. + + Returns: + net: a 2D Tensor with the logits (pre-softmax activations) if num_classes + is a non-zero integer, or the non-dropped-out input to the logits layer + if num_classes is 0 or None. + end_points: a dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: Input rank is invalid. + """ + input_shape = inputs.get_shape().as_list() + if len(input_shape) != 4: + raise ValueError('Invalid input tensor rank, expected 4, was: %d' % + len(input_shape)) + + with tf.compat.v1.variable_scope( + scope, 'MobilenetV1', [inputs], reuse=reuse) as scope: + with slim.arg_scope([slim.batch_norm, slim.dropout], + is_training=is_training): + net, end_points = mobilenet_v1_base(inputs, scope=scope, + min_depth=min_depth, + depth_multiplier=depth_multiplier, + conv_defs=conv_defs) + with tf.compat.v1.variable_scope('Logits'): + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + else: + # Pooling with a fixed kernel size. + kernel_size = _reduced_kernel_size_for_small_input(net, [7, 7]) + net = slim.avg_pool2d(net, kernel_size, padding='VALID', + scope='AvgPool_1a') + end_points['AvgPool_1a'] = net + if not num_classes: + return net, end_points + # 1 x 1 x 1024 + net = slim.dropout(net, keep_prob=dropout_keep_prob, scope='Dropout_1b') + logits = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='Conv2d_1c_1x1') + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + end_points['Logits'] = logits + if prediction_fn: + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points + +mobilenet_v1.default_image_size = 224 + + +def wrapped_partial(func, *args, **kwargs): + partial_func = functools.partial(func, *args, **kwargs) + functools.update_wrapper(partial_func, func) + return partial_func + + +mobilenet_v1_075 = wrapped_partial(mobilenet_v1, depth_multiplier=0.75) +mobilenet_v1_050 = wrapped_partial(mobilenet_v1, depth_multiplier=0.50) +mobilenet_v1_025 = wrapped_partial(mobilenet_v1, depth_multiplier=0.25) + + +def _reduced_kernel_size_for_small_input(input_tensor, kernel_size): + """Define kernel size which is automatically reduced for small input. + + If the shape of the input images is unknown at graph construction time this + function assumes that the input images are large enough. + + Args: + input_tensor: input tensor of size [batch_size, height, width, channels]. + kernel_size: desired kernel size of length 2: [kernel_height, kernel_width] + + Returns: + a tensor with the kernel size. + """ + shape = input_tensor.get_shape().as_list() + if shape[1] is None or shape[2] is None: + kernel_size_out = kernel_size + else: + kernel_size_out = [min(shape[1], kernel_size[0]), + min(shape[2], kernel_size[1])] + return kernel_size_out + + +def mobilenet_v1_arg_scope( + is_training=True, + weight_decay=0.00004, + stddev=0.09, + regularize_depthwise=False, + batch_norm_decay=0.9997, + batch_norm_epsilon=0.001, + batch_norm_updates_collections=tf.compat.v1.GraphKeys.UPDATE_OPS, + normalizer_fn=slim.batch_norm): + """Defines the default MobilenetV1 arg scope. + + Args: + is_training: Whether or not we're training the model. If this is set to + None, the parameter is not added to the batch_norm arg_scope. + weight_decay: The weight decay to use for regularizing the model. + stddev: The standard deviation of the trunctated normal weight initializer. + regularize_depthwise: Whether or not apply regularization on depthwise. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + batch_norm_updates_collections: Collection for the update ops for + batch norm. + normalizer_fn: Normalization function to apply after convolution. + + Returns: + An `arg_scope` to use for the mobilenet v1 model. + """ + batch_norm_params = { + 'center': True, + 'scale': True, + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'updates_collections': batch_norm_updates_collections, + } + if is_training is not None: + batch_norm_params['is_training'] = is_training + + # Set weight_decay for weights in Conv and DepthSepConv layers. + weights_init = tf.compat.v1.truncated_normal_initializer(stddev=stddev) + regularizer = contrib_layers.l2_regularizer(weight_decay) + if regularize_depthwise: + depthwise_regularizer = regularizer + else: + depthwise_regularizer = None + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + weights_initializer=weights_init, + activation_fn=tf.nn.relu6, normalizer_fn=normalizer_fn): + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + with slim.arg_scope([slim.conv2d], weights_regularizer=regularizer): + with slim.arg_scope([slim.separable_conv2d], + weights_regularizer=depthwise_regularizer) as sc: + return sc diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_eval.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_eval.py new file mode 100644 index 0000000..c7bd590 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_eval.py @@ -0,0 +1,157 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Validate mobilenet_v1 with options for quantization.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import tensorflow as tf +from tensorflow.contrib import quantize as contrib_quantize +from tensorflow.contrib import slim as contrib_slim + +from datasets import dataset_factory +from nets import mobilenet_v1 +from preprocessing import preprocessing_factory + +slim = contrib_slim + +flags = tf.compat.v1.app.flags + +flags.DEFINE_string('master', '', 'Session master') +flags.DEFINE_integer('batch_size', 250, 'Batch size') +flags.DEFINE_integer('num_classes', 1001, 'Number of classes to distinguish') +flags.DEFINE_integer('num_examples', 50000, 'Number of examples to evaluate') +flags.DEFINE_integer('image_size', 224, 'Input image resolution') +flags.DEFINE_float('depth_multiplier', 1.0, 'Depth multiplier for mobilenet') +flags.DEFINE_bool('quantize', False, 'Quantize training') +flags.DEFINE_string('checkpoint_dir', '', 'The directory for checkpoints') +flags.DEFINE_string('eval_dir', '', 'Directory for writing eval event logs') +flags.DEFINE_string('dataset_dir', '', 'Location of dataset') + +FLAGS = flags.FLAGS + + +def imagenet_input(is_training): + """Data reader for imagenet. + + Reads in imagenet data and performs pre-processing on the images. + + Args: + is_training: bool specifying if train or validation dataset is needed. + Returns: + A batch of images and labels. + """ + if is_training: + dataset = dataset_factory.get_dataset('imagenet', 'train', + FLAGS.dataset_dir) + else: + dataset = dataset_factory.get_dataset('imagenet', 'validation', + FLAGS.dataset_dir) + + provider = slim.dataset_data_provider.DatasetDataProvider( + dataset, + shuffle=is_training, + common_queue_capacity=2 * FLAGS.batch_size, + common_queue_min=FLAGS.batch_size) + [image, label] = provider.get(['image', 'label']) + + image_preprocessing_fn = preprocessing_factory.get_preprocessing( + 'mobilenet_v1', is_training=is_training) + + image = image_preprocessing_fn(image, FLAGS.image_size, FLAGS.image_size) + + images, labels = tf.compat.v1.train.batch( + tensors=[image, label], + batch_size=FLAGS.batch_size, + num_threads=4, + capacity=5 * FLAGS.batch_size) + return images, labels + + +def metrics(logits, labels): + """Specify the metrics for eval. + + Args: + logits: Logits output from the graph. + labels: Ground truth labels for inputs. + + Returns: + Eval Op for the graph. + """ + labels = tf.squeeze(labels) + names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({ + 'Accuracy': + tf.compat.v1.metrics.accuracy( + tf.argmax(input=logits, axis=1), labels), + 'Recall_5': + tf.compat.v1.metrics.recall_at_k(labels, logits, 5), + }) + for name, value in names_to_values.iteritems(): + slim.summaries.add_scalar_summary( + value, name, prefix='eval', print_summary=True) + return names_to_updates.values() + + +def build_model(): + """Build the mobilenet_v1 model for evaluation. + + Returns: + g: graph with rewrites after insertion of quantization ops and batch norm + folding. + eval_ops: eval ops for inference. + variables_to_restore: List of variables to restore from checkpoint. + """ + g = tf.Graph() + with g.as_default(): + inputs, labels = imagenet_input(is_training=False) + + scope = mobilenet_v1.mobilenet_v1_arg_scope( + is_training=False, weight_decay=0.0) + with slim.arg_scope(scope): + logits, _ = mobilenet_v1.mobilenet_v1( + inputs, + is_training=False, + depth_multiplier=FLAGS.depth_multiplier, + num_classes=FLAGS.num_classes) + + if FLAGS.quantize: + contrib_quantize.create_eval_graph() + + eval_ops = metrics(logits, labels) + + return g, eval_ops + + +def eval_model(): + """Evaluates mobilenet_v1.""" + g, eval_ops = build_model() + with g.as_default(): + num_batches = math.ceil(FLAGS.num_examples / float(FLAGS.batch_size)) + slim.evaluation.evaluate_once( + FLAGS.master, + FLAGS.checkpoint_dir, + logdir=FLAGS.eval_dir, + num_evals=num_batches, + eval_op=eval_ops) + + +def main(unused_arg): + eval_model() + + +if __name__ == '__main__': + tf.compat.v1.app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_test.py new file mode 100644 index 0000000..3f8d9b2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_test.py @@ -0,0 +1,537 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= +"""Tests for MobileNet v1.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import mobilenet_v1 + +slim = contrib_slim + + +class MobilenetV1Test(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith( + 'MobilenetV1/Logits/SpatialSqueeze')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsNetwork(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + self.assertTrue(net.op.name.startswith('MobilenetV1/Logits/AvgPool')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1, 1, 1024]) + self.assertFalse('Logits' in end_points) + self.assertFalse('Predictions' in end_points) + + def testBuildBaseNetwork(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = mobilenet_v1.mobilenet_v1_base(inputs) + self.assertTrue(net.op.name.startswith('MobilenetV1/Conv2d_13')) + self.assertListEqual(net.get_shape().as_list(), + [batch_size, 7, 7, 1024]) + expected_endpoints = ['Conv2d_0', + 'Conv2d_1_depthwise', 'Conv2d_1_pointwise', + 'Conv2d_2_depthwise', 'Conv2d_2_pointwise', + 'Conv2d_3_depthwise', 'Conv2d_3_pointwise', + 'Conv2d_4_depthwise', 'Conv2d_4_pointwise', + 'Conv2d_5_depthwise', 'Conv2d_5_pointwise', + 'Conv2d_6_depthwise', 'Conv2d_6_pointwise', + 'Conv2d_7_depthwise', 'Conv2d_7_pointwise', + 'Conv2d_8_depthwise', 'Conv2d_8_pointwise', + 'Conv2d_9_depthwise', 'Conv2d_9_pointwise', + 'Conv2d_10_depthwise', 'Conv2d_10_pointwise', + 'Conv2d_11_depthwise', 'Conv2d_11_pointwise', + 'Conv2d_12_depthwise', 'Conv2d_12_pointwise', + 'Conv2d_13_depthwise', 'Conv2d_13_pointwise'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpoint(self): + batch_size = 5 + height, width = 224, 224 + endpoints = ['Conv2d_0', + 'Conv2d_1_depthwise', 'Conv2d_1_pointwise', + 'Conv2d_2_depthwise', 'Conv2d_2_pointwise', + 'Conv2d_3_depthwise', 'Conv2d_3_pointwise', + 'Conv2d_4_depthwise', 'Conv2d_4_pointwise', + 'Conv2d_5_depthwise', 'Conv2d_5_pointwise', + 'Conv2d_6_depthwise', 'Conv2d_6_pointwise', + 'Conv2d_7_depthwise', 'Conv2d_7_pointwise', + 'Conv2d_8_depthwise', 'Conv2d_8_pointwise', + 'Conv2d_9_depthwise', 'Conv2d_9_pointwise', + 'Conv2d_10_depthwise', 'Conv2d_10_pointwise', + 'Conv2d_11_depthwise', 'Conv2d_11_pointwise', + 'Conv2d_12_depthwise', 'Conv2d_12_pointwise', + 'Conv2d_13_depthwise', 'Conv2d_13_pointwise'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + out_tensor, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint=endpoint) + self.assertTrue(out_tensor.op.name.startswith( + 'MobilenetV1/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points.keys()) + + def testBuildCustomNetworkUsingConvDefs(self): + batch_size = 5 + height, width = 224, 224 + conv_defs = [ + mobilenet_v1.Conv(kernel=[3, 3], stride=2, depth=32), + mobilenet_v1.DepthSepConv(kernel=[3, 3], stride=1, depth=64), + mobilenet_v1.DepthSepConv(kernel=[3, 3], stride=2, depth=128), + mobilenet_v1.DepthSepConv(kernel=[3, 3], stride=1, depth=512) + ] + + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint='Conv2d_3_pointwise', conv_defs=conv_defs) + self.assertTrue(net.op.name.startswith('MobilenetV1/Conv2d_3')) + self.assertListEqual(net.get_shape().as_list(), + [batch_size, 56, 56, 512]) + expected_endpoints = ['Conv2d_0', + 'Conv2d_1_depthwise', 'Conv2d_1_pointwise', + 'Conv2d_2_depthwise', 'Conv2d_2_pointwise', + 'Conv2d_3_depthwise', 'Conv2d_3_pointwise'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildAndCheckAllEndPointsUptoConv2d_13(self): + batch_size = 5 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + normalizer_fn=slim.batch_norm): + _, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint='Conv2d_13_pointwise') + _, explicit_padding_end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint='Conv2d_13_pointwise', + use_explicit_padding=True) + endpoints_shapes = {'Conv2d_0': [batch_size, 112, 112, 32], + 'Conv2d_1_depthwise': [batch_size, 112, 112, 32], + 'Conv2d_1_pointwise': [batch_size, 112, 112, 64], + 'Conv2d_2_depthwise': [batch_size, 56, 56, 64], + 'Conv2d_2_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_3_depthwise': [batch_size, 56, 56, 128], + 'Conv2d_3_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_4_depthwise': [batch_size, 28, 28, 128], + 'Conv2d_4_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_5_depthwise': [batch_size, 28, 28, 256], + 'Conv2d_5_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_6_depthwise': [batch_size, 14, 14, 256], + 'Conv2d_6_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_7_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_7_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_8_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_8_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_9_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_9_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_10_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_10_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_11_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_11_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_12_depthwise': [batch_size, 7, 7, 512], + 'Conv2d_12_pointwise': [batch_size, 7, 7, 1024], + 'Conv2d_13_depthwise': [batch_size, 7, 7, 1024], + 'Conv2d_13_pointwise': [batch_size, 7, 7, 1024]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + self.assertItemsEqual(endpoints_shapes.keys(), + explicit_padding_end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in explicit_padding_end_points) + self.assertListEqual( + explicit_padding_end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testOutputStride16BuildAndCheckAllEndPointsUptoConv2d_13(self): + batch_size = 5 + height, width = 224, 224 + output_stride = 16 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + normalizer_fn=slim.batch_norm): + _, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, output_stride=output_stride, + final_endpoint='Conv2d_13_pointwise') + _, explicit_padding_end_points = mobilenet_v1.mobilenet_v1_base( + inputs, output_stride=output_stride, + final_endpoint='Conv2d_13_pointwise', use_explicit_padding=True) + endpoints_shapes = {'Conv2d_0': [batch_size, 112, 112, 32], + 'Conv2d_1_depthwise': [batch_size, 112, 112, 32], + 'Conv2d_1_pointwise': [batch_size, 112, 112, 64], + 'Conv2d_2_depthwise': [batch_size, 56, 56, 64], + 'Conv2d_2_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_3_depthwise': [batch_size, 56, 56, 128], + 'Conv2d_3_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_4_depthwise': [batch_size, 28, 28, 128], + 'Conv2d_4_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_5_depthwise': [batch_size, 28, 28, 256], + 'Conv2d_5_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_6_depthwise': [batch_size, 14, 14, 256], + 'Conv2d_6_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_7_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_7_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_8_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_8_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_9_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_9_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_10_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_10_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_11_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_11_pointwise': [batch_size, 14, 14, 512], + 'Conv2d_12_depthwise': [batch_size, 14, 14, 512], + 'Conv2d_12_pointwise': [batch_size, 14, 14, 1024], + 'Conv2d_13_depthwise': [batch_size, 14, 14, 1024], + 'Conv2d_13_pointwise': [batch_size, 14, 14, 1024]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + self.assertItemsEqual(endpoints_shapes.keys(), + explicit_padding_end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in explicit_padding_end_points) + self.assertListEqual( + explicit_padding_end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testOutputStride8BuildAndCheckAllEndPointsUptoConv2d_13(self): + batch_size = 5 + height, width = 224, 224 + output_stride = 8 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + normalizer_fn=slim.batch_norm): + _, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, output_stride=output_stride, + final_endpoint='Conv2d_13_pointwise') + _, explicit_padding_end_points = mobilenet_v1.mobilenet_v1_base( + inputs, output_stride=output_stride, + final_endpoint='Conv2d_13_pointwise', use_explicit_padding=True) + endpoints_shapes = {'Conv2d_0': [batch_size, 112, 112, 32], + 'Conv2d_1_depthwise': [batch_size, 112, 112, 32], + 'Conv2d_1_pointwise': [batch_size, 112, 112, 64], + 'Conv2d_2_depthwise': [batch_size, 56, 56, 64], + 'Conv2d_2_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_3_depthwise': [batch_size, 56, 56, 128], + 'Conv2d_3_pointwise': [batch_size, 56, 56, 128], + 'Conv2d_4_depthwise': [batch_size, 28, 28, 128], + 'Conv2d_4_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_5_depthwise': [batch_size, 28, 28, 256], + 'Conv2d_5_pointwise': [batch_size, 28, 28, 256], + 'Conv2d_6_depthwise': [batch_size, 28, 28, 256], + 'Conv2d_6_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_7_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_7_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_8_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_8_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_9_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_9_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_10_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_10_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_11_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_11_pointwise': [batch_size, 28, 28, 512], + 'Conv2d_12_depthwise': [batch_size, 28, 28, 512], + 'Conv2d_12_pointwise': [batch_size, 28, 28, 1024], + 'Conv2d_13_depthwise': [batch_size, 28, 28, 1024], + 'Conv2d_13_pointwise': [batch_size, 28, 28, 1024]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + self.assertItemsEqual(endpoints_shapes.keys(), + explicit_padding_end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in explicit_padding_end_points) + self.assertListEqual( + explicit_padding_end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testBuildAndCheckAllEndPointsApproximateFaceNet(self): + batch_size = 5 + height, width = 128, 128 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + normalizer_fn=slim.batch_norm): + _, end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint='Conv2d_13_pointwise', depth_multiplier=0.75) + _, explicit_padding_end_points = mobilenet_v1.mobilenet_v1_base( + inputs, final_endpoint='Conv2d_13_pointwise', depth_multiplier=0.75, + use_explicit_padding=True) + # For the Conv2d_0 layer FaceNet has depth=16 + endpoints_shapes = {'Conv2d_0': [batch_size, 64, 64, 24], + 'Conv2d_1_depthwise': [batch_size, 64, 64, 24], + 'Conv2d_1_pointwise': [batch_size, 64, 64, 48], + 'Conv2d_2_depthwise': [batch_size, 32, 32, 48], + 'Conv2d_2_pointwise': [batch_size, 32, 32, 96], + 'Conv2d_3_depthwise': [batch_size, 32, 32, 96], + 'Conv2d_3_pointwise': [batch_size, 32, 32, 96], + 'Conv2d_4_depthwise': [batch_size, 16, 16, 96], + 'Conv2d_4_pointwise': [batch_size, 16, 16, 192], + 'Conv2d_5_depthwise': [batch_size, 16, 16, 192], + 'Conv2d_5_pointwise': [batch_size, 16, 16, 192], + 'Conv2d_6_depthwise': [batch_size, 8, 8, 192], + 'Conv2d_6_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_7_depthwise': [batch_size, 8, 8, 384], + 'Conv2d_7_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_8_depthwise': [batch_size, 8, 8, 384], + 'Conv2d_8_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_9_depthwise': [batch_size, 8, 8, 384], + 'Conv2d_9_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_10_depthwise': [batch_size, 8, 8, 384], + 'Conv2d_10_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_11_depthwise': [batch_size, 8, 8, 384], + 'Conv2d_11_pointwise': [batch_size, 8, 8, 384], + 'Conv2d_12_depthwise': [batch_size, 4, 4, 384], + 'Conv2d_12_pointwise': [batch_size, 4, 4, 768], + 'Conv2d_13_depthwise': [batch_size, 4, 4, 768], + 'Conv2d_13_pointwise': [batch_size, 4, 4, 768]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + self.assertItemsEqual(endpoints_shapes.keys(), + explicit_padding_end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.items(): + self.assertTrue(endpoint_name in explicit_padding_end_points) + self.assertListEqual( + explicit_padding_end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testModelHasExpectedNumberOfParameters(self): + batch_size = 5 + height, width = 224, 224 + inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope([slim.conv2d, slim.separable_conv2d], + normalizer_fn=slim.batch_norm): + mobilenet_v1.mobilenet_v1_base(inputs) + total_params, _ = slim.model_analyzer.analyze_vars( + slim.get_model_variables()) + self.assertAlmostEqual(3217920, total_params) + + def testBuildEndPointsWithDepthMultiplierLessThanOne(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() if key.startswith('Conv')] + + _, end_points_with_multiplier = mobilenet_v1.mobilenet_v1( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=0.5) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(0.5 * original_depth, new_depth) + + def testBuildEndPointsWithDepthMultiplierGreaterThanOne(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + + endpoint_keys = [key for key in end_points.keys() + if key.startswith('Mixed') or key.startswith('Conv')] + + _, end_points_with_multiplier = mobilenet_v1.mobilenet_v1( + inputs, num_classes, scope='depth_multiplied_net', + depth_multiplier=2.0) + + for key in endpoint_keys: + original_depth = end_points[key].get_shape().as_list()[3] + new_depth = end_points_with_multiplier[key].get_shape().as_list()[3] + self.assertEqual(2.0 * original_depth, new_depth) + + def testRaiseValueErrorWithInvalidDepthMultiplier(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + with self.assertRaises(ValueError): + _ = mobilenet_v1.mobilenet_v1( + inputs, num_classes, depth_multiplier=-0.1) + with self.assertRaises(ValueError): + _ = mobilenet_v1.mobilenet_v1( + inputs, num_classes, depth_multiplier=0.0) + + def testHalfSizeImages(self): + batch_size = 5 + height, width = 112, 112 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_13_pointwise'] + self.assertListEqual(pre_pool.get_shape().as_list(), + [batch_size, 4, 4, 1024]) + + def testUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_13_pointwise'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 7, 7, 1024]) + + def testGlobalPoolUnknownImageShape(self): + tf.compat.v1.reset_default_graph() + batch_size = 1 + height, width = 250, 300 + num_classes = 1000 + input_np = np.random.uniform(0, 1, (batch_size, height, width, 3)) + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder( + tf.float32, shape=(batch_size, None, None, 3)) + logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes, + global_pool=True) + self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + pre_pool = end_points['Conv2d_13_pointwise'] + feed_dict = {inputs: input_np} + tf.compat.v1.global_variables_initializer().run() + pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict) + self.assertListEqual(list(pre_pool_out.shape), [batch_size, 8, 10, 1024]) + + def testUnknowBatchSize(self): + batch_size = 1 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + logits, _ = mobilenet_v1.mobilenet_v1(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = mobilenet_v1.mobilenet_v1(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testTrainEvalWithReuse(self): + train_batch_size = 5 + eval_batch_size = 2 + height, width = 150, 150 + num_classes = 1000 + + train_inputs = tf.random.uniform((train_batch_size, height, width, 3)) + mobilenet_v1.mobilenet_v1(train_inputs, num_classes) + eval_inputs = tf.random.uniform((eval_batch_size, height, width, 3)) + logits, _ = mobilenet_v1.mobilenet_v1(eval_inputs, num_classes, + reuse=True) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (eval_batch_size,)) + + def testLogitsNotSqueezed(self): + num_classes = 25 + images = tf.random.uniform([1, 224, 224, 3]) + logits, _ = mobilenet_v1.mobilenet_v1(images, + num_classes=num_classes, + spatial_squeeze=False) + + with self.test_session() as sess: + tf.compat.v1.global_variables_initializer().run() + logits_out = sess.run(logits) + self.assertListEqual(list(logits_out.shape), [1, 1, 1, num_classes]) + + def testBatchNormScopeDoesNotHaveIsTrainingWhenItsSetToNone(self): + sc = mobilenet_v1.mobilenet_v1_arg_scope(is_training=None) + self.assertNotIn('is_training', sc[slim.arg_scope_func_key( + slim.batch_norm)]) + + def testBatchNormScopeDoesHasIsTrainingWhenItsNotNone(self): + sc = mobilenet_v1.mobilenet_v1_arg_scope(is_training=True) + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + sc = mobilenet_v1.mobilenet_v1_arg_scope(is_training=False) + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + sc = mobilenet_v1.mobilenet_v1_arg_scope() + self.assertIn('is_training', sc[slim.arg_scope_func_key(slim.batch_norm)]) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_train.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_train.py new file mode 100644 index 0000000..1035ea3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/mobilenet_v1_train.py @@ -0,0 +1,214 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Build and train mobilenet_v1 with options for quantization.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import quantize as contrib_quantize +from tensorflow.contrib import slim as contrib_slim + +from datasets import dataset_factory +from nets import mobilenet_v1 +from preprocessing import preprocessing_factory + +slim = contrib_slim + +flags = tf.compat.v1.app.flags + +flags.DEFINE_string('master', '', 'Session master') +flags.DEFINE_integer('task', 0, 'Task') +flags.DEFINE_integer('ps_tasks', 0, 'Number of ps') +flags.DEFINE_integer('batch_size', 64, 'Batch size') +flags.DEFINE_integer('num_classes', 1001, 'Number of classes to distinguish') +flags.DEFINE_integer('number_of_steps', None, + 'Number of training steps to perform before stopping') +flags.DEFINE_integer('image_size', 224, 'Input image resolution') +flags.DEFINE_float('depth_multiplier', 1.0, 'Depth multiplier for mobilenet') +flags.DEFINE_bool('quantize', False, 'Quantize training') +flags.DEFINE_string('fine_tune_checkpoint', '', + 'Checkpoint from which to start finetuning.') +flags.DEFINE_string('checkpoint_dir', '', + 'Directory for writing training checkpoints and logs') +flags.DEFINE_string('dataset_dir', '', 'Location of dataset') +flags.DEFINE_integer('log_every_n_steps', 100, 'Number of steps per log') +flags.DEFINE_integer('save_summaries_secs', 100, + 'How often to save summaries, secs') +flags.DEFINE_integer('save_interval_secs', 100, + 'How often to save checkpoints, secs') + +FLAGS = flags.FLAGS + +_LEARNING_RATE_DECAY_FACTOR = 0.94 + + +def get_learning_rate(): + if FLAGS.fine_tune_checkpoint: + # If we are fine tuning a checkpoint we need to start at a lower learning + # rate since we are farther along on training. + return 1e-4 + else: + return 0.045 + + +def get_quant_delay(): + if FLAGS.fine_tune_checkpoint: + # We can start quantizing immediately if we are finetuning. + return 0 + else: + # We need to wait for the model to train a bit before we quantize if we are + # training from scratch. + return 250000 + + +def imagenet_input(is_training): + """Data reader for imagenet. + + Reads in imagenet data and performs pre-processing on the images. + + Args: + is_training: bool specifying if train or validation dataset is needed. + Returns: + A batch of images and labels. + """ + if is_training: + dataset = dataset_factory.get_dataset('imagenet', 'train', + FLAGS.dataset_dir) + else: + dataset = dataset_factory.get_dataset('imagenet', 'validation', + FLAGS.dataset_dir) + + provider = slim.dataset_data_provider.DatasetDataProvider( + dataset, + shuffle=is_training, + common_queue_capacity=2 * FLAGS.batch_size, + common_queue_min=FLAGS.batch_size) + [image, label] = provider.get(['image', 'label']) + + image_preprocessing_fn = preprocessing_factory.get_preprocessing( + 'mobilenet_v1', is_training=is_training) + + image = image_preprocessing_fn(image, FLAGS.image_size, FLAGS.image_size) + + images, labels = tf.compat.v1.train.batch([image, label], + batch_size=FLAGS.batch_size, + num_threads=4, + capacity=5 * FLAGS.batch_size) + labels = slim.one_hot_encoding(labels, FLAGS.num_classes) + return images, labels + + +def build_model(): + """Builds graph for model to train with rewrites for quantization. + + Returns: + g: Graph with fake quantization ops and batch norm folding suitable for + training quantized weights. + train_tensor: Train op for execution during training. + """ + g = tf.Graph() + with g.as_default(), tf.device( + tf.compat.v1.train.replica_device_setter(FLAGS.ps_tasks)): + inputs, labels = imagenet_input(is_training=True) + with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope(is_training=True)): + logits, _ = mobilenet_v1.mobilenet_v1( + inputs, + is_training=True, + depth_multiplier=FLAGS.depth_multiplier, + num_classes=FLAGS.num_classes) + + tf.compat.v1.losses.softmax_cross_entropy(labels, logits) + + # Call rewriter to produce graph with fake quant ops and folded batch norms + # quant_delay delays start of quantization till quant_delay steps, allowing + # for better model accuracy. + if FLAGS.quantize: + contrib_quantize.create_training_graph(quant_delay=get_quant_delay()) + + total_loss = tf.compat.v1.losses.get_total_loss(name='total_loss') + # Configure the learning rate using an exponential decay. + num_epochs_per_decay = 2.5 + imagenet_size = 1271167 + decay_steps = int(imagenet_size / FLAGS.batch_size * num_epochs_per_decay) + + learning_rate = tf.compat.v1.train.exponential_decay( + get_learning_rate(), + tf.compat.v1.train.get_or_create_global_step(), + decay_steps, + _LEARNING_RATE_DECAY_FACTOR, + staircase=True) + opt = tf.compat.v1.train.GradientDescentOptimizer(learning_rate) + + train_tensor = slim.learning.create_train_op( + total_loss, + optimizer=opt) + + slim.summaries.add_scalar_summary(total_loss, 'total_loss', 'losses') + slim.summaries.add_scalar_summary(learning_rate, 'learning_rate', 'training') + return g, train_tensor + + +def get_checkpoint_init_fn(): + """Returns the checkpoint init_fn if the checkpoint is provided.""" + if FLAGS.fine_tune_checkpoint: + variables_to_restore = slim.get_variables_to_restore() + global_step_reset = tf.compat.v1.assign( + tf.compat.v1.train.get_or_create_global_step(), 0) + # When restoring from a floating point model, the min/max values for + # quantized weights and activations are not present. + # We instruct slim to ignore variables that are missing during restoration + # by setting ignore_missing_vars=True + slim_init_fn = slim.assign_from_checkpoint_fn( + FLAGS.fine_tune_checkpoint, + variables_to_restore, + ignore_missing_vars=True) + + def init_fn(sess): + slim_init_fn(sess) + # If we are restoring from a floating point model, we need to initialize + # the global step to zero for the exponential decay to result in + # reasonable learning rates. + sess.run(global_step_reset) + return init_fn + else: + return None + + +def train_model(): + """Trains mobilenet_v1.""" + g, train_tensor = build_model() + with g.as_default(): + slim.learning.train( + train_tensor, + FLAGS.checkpoint_dir, + is_chief=(FLAGS.task == 0), + master=FLAGS.master, + log_every_n_steps=FLAGS.log_every_n_steps, + graph=g, + number_of_steps=FLAGS.number_of_steps, + save_summaries_secs=FLAGS.save_summaries_secs, + save_interval_secs=FLAGS.save_interval_secs, + init_fn=get_checkpoint_init_fn(), + global_step=tf.compat.v1.train.get_global_step()) + + +def main(unused_arg): + train_model() + + +if __name__ == '__main__': + tf.compat.v1.app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/README.md b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/README.md new file mode 100644 index 0000000..3955ad1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/README.md @@ -0,0 +1,64 @@ +# TensorFlow-Slim NASNet-A Implementation/Checkpoints +This directory contains the code for the NASNet-A model from the paper +[Learning Transferable Architectures for Scalable Image Recognition](https://arxiv.org/abs/1707.07012) by Zoph et al. +In nasnet.py there are three different configurations of NASNet-A that are implementented. One of the models is the NASNet-A built for CIFAR-10 and the +other two are variants of NASNet-A trained on ImageNet, which are listed below. + +# Pre-Trained Models +Two NASNet-A checkpoints are available that have been trained on the +[ILSVRC-2012-CLS](http://www.image-net.org/challenges/LSVRC/2012/) +image classification dataset. Accuracies were computed by evaluating using a single image crop. + +Model Checkpoint | Million MACs | Million Parameters | Top-1 Accuracy| Top-5 Accuracy | +:----:|:------------:|:----------:|:-------:|:-------:| +[NASNet-A_Mobile_224](https://storage.googleapis.com/download.tensorflow.org/models/nasnet-a_mobile_04_10_2017.tar.gz)|564|5.3|74.0|91.6| +[NASNet-A_Large_331](https://storage.googleapis.com/download.tensorflow.org/models/nasnet-a_large_04_10_2017.tar.gz)|23800|88.9|82.7|96.2| + + +Here is an example of how to download the NASNet-A_Mobile_224 checkpoint. The way to download the NASNet-A_Large_331 is the same. + +```shell +CHECKPOINT_DIR=/tmp/checkpoints +mkdir ${CHECKPOINT_DIR} +cd ${CHECKPOINT_DIR} +wget https://storage.googleapis.com/download.tensorflow.org/models/nasnet-a_mobile_04_10_2017.tar.gz +tar -xvf nasnet-a_mobile_04_10_2017.tar.gz +rm nasnet-a_mobile_04_10_2017.tar.gz +``` +More information on integrating NASNet Models into your project can be found at the [TF-Slim Image Classification Library](https://github.com/tensorflow/models/blob/master/research/slim/README.md). + +To get started running models on-device go to [TensorFlow Mobile](https://www.tensorflow.org/mobile/). + +## Sample Commands for using NASNet-A Mobile and Large Checkpoints for Inference +------- +Run eval with the NASNet-A mobile ImageNet model + +```shell +DATASET_DIR=/tmp/imagenet +EVAL_DIR=/tmp/tfmodel/eval +CHECKPOINT_DIR=/tmp/checkpoints/model.ckpt +python tensorflow_models/research/slim/eval_image_classifier \ +--checkpoint_path=${CHECKPOINT_DIR} \ +--eval_dir=${EVAL_DIR} \ +--dataset_dir=${DATASET_DIR} \ +--dataset_name=imagenet \ +--dataset_split_name=validation \ +--model_name=nasnet_mobile \ +--eval_image_size=224 +``` + +Run eval with the NASNet-A large ImageNet model + +```shell +DATASET_DIR=/tmp/imagenet +EVAL_DIR=/tmp/tfmodel/eval +CHECKPOINT_DIR=/tmp/checkpoints/model.ckpt +python tensorflow_models/research/slim/eval_image_classifier \ +--checkpoint_path=${CHECKPOINT_DIR} \ +--eval_dir=${EVAL_DIR} \ +--dataset_dir=${DATASET_DIR} \ +--dataset_name=imagenet \ +--dataset_split_name=validation \ +--model_name=nasnet_large \ +--eval_image_size=331 +``` diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet.py new file mode 100644 index 0000000..664fa30 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet.py @@ -0,0 +1,554 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for the NASNet classification networks. + +Paper: https://arxiv.org/abs/1707.07012 +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers +from tensorflow.contrib import slim as contrib_slim +from tensorflow.contrib import training as contrib_training + +from nets.nasnet import nasnet_utils + +arg_scope = contrib_framework.arg_scope +slim = contrib_slim + + +# Notes for training NASNet Cifar Model +# ------------------------------------- +# batch_size: 32 +# learning rate: 0.025 +# cosine (single period) learning rate decay +# auxiliary head loss weighting: 0.4 +# clip global norm of all gradients by 5 +def cifar_config(): + return contrib_training.HParams( + stem_multiplier=3.0, + drop_path_keep_prob=0.6, + num_cells=18, + use_aux_head=1, + num_conv_filters=32, + dense_dropout_keep_prob=1.0, + filter_scaling_rate=2.0, + num_reduction_layers=2, + data_format='NHWC', + skip_reduction_layer_input=0, + # 600 epochs with a batch size of 32 + # This is used for the drop path probabilities since it needs to increase + # the drop out probability over the course of training. + total_training_steps=937500, + use_bounded_activation=False, + ) + + +# Notes for training large NASNet model on ImageNet +# ------------------------------------- +# batch size (per replica): 16 +# learning rate: 0.015 * 100 +# learning rate decay factor: 0.97 +# num epochs per decay: 2.4 +# sync sgd with 100 replicas +# auxiliary head loss weighting: 0.4 +# label smoothing: 0.1 +# clip global norm of all gradients by 10 +def large_imagenet_config(): + return contrib_training.HParams( + stem_multiplier=3.0, + dense_dropout_keep_prob=0.5, + num_cells=18, + filter_scaling_rate=2.0, + num_conv_filters=168, + drop_path_keep_prob=0.7, + use_aux_head=1, + num_reduction_layers=2, + data_format='NHWC', + skip_reduction_layer_input=1, + total_training_steps=250000, + use_bounded_activation=False, + ) + + +# Notes for training the mobile NASNet ImageNet model +# ------------------------------------- +# batch size (per replica): 32 +# learning rate: 0.04 * 50 +# learning rate scaling factor: 0.97 +# num epochs per decay: 2.4 +# sync sgd with 50 replicas +# auxiliary head weighting: 0.4 +# label smoothing: 0.1 +# clip global norm of all gradients by 10 +def mobile_imagenet_config(): + return contrib_training.HParams( + stem_multiplier=1.0, + dense_dropout_keep_prob=0.5, + num_cells=12, + filter_scaling_rate=2.0, + drop_path_keep_prob=1.0, + num_conv_filters=44, + use_aux_head=1, + num_reduction_layers=2, + data_format='NHWC', + skip_reduction_layer_input=0, + total_training_steps=250000, + use_bounded_activation=False, + ) + + +def _update_hparams(hparams, is_training): + """Update hparams for given is_training option.""" + if not is_training: + hparams.set_hparam('drop_path_keep_prob', 1.0) + + +def nasnet_cifar_arg_scope(weight_decay=5e-4, + batch_norm_decay=0.9, + batch_norm_epsilon=1e-5): + """Defines the default arg scope for the NASNet-A Cifar model. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + + Returns: + An `arg_scope` to use for the NASNet Cifar Model. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + 'scale': True, + 'fused': True, + } + weights_regularizer = contrib_layers.l2_regularizer(weight_decay) + weights_initializer = contrib_layers.variance_scaling_initializer( + mode='FAN_OUT') + with arg_scope([slim.fully_connected, slim.conv2d, slim.separable_conv2d], + weights_regularizer=weights_regularizer, + weights_initializer=weights_initializer): + with arg_scope([slim.fully_connected], + activation_fn=None, scope='FC'): + with arg_scope([slim.conv2d, slim.separable_conv2d], + activation_fn=None, biases_initializer=None): + with arg_scope([slim.batch_norm], **batch_norm_params) as sc: + return sc + + +def nasnet_mobile_arg_scope(weight_decay=4e-5, + batch_norm_decay=0.9997, + batch_norm_epsilon=1e-3): + """Defines the default arg scope for the NASNet-A Mobile ImageNet model. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + + Returns: + An `arg_scope` to use for the NASNet Mobile Model. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + 'scale': True, + 'fused': True, + } + weights_regularizer = contrib_layers.l2_regularizer(weight_decay) + weights_initializer = contrib_layers.variance_scaling_initializer( + mode='FAN_OUT') + with arg_scope([slim.fully_connected, slim.conv2d, slim.separable_conv2d], + weights_regularizer=weights_regularizer, + weights_initializer=weights_initializer): + with arg_scope([slim.fully_connected], + activation_fn=None, scope='FC'): + with arg_scope([slim.conv2d, slim.separable_conv2d], + activation_fn=None, biases_initializer=None): + with arg_scope([slim.batch_norm], **batch_norm_params) as sc: + return sc + + +def nasnet_large_arg_scope(weight_decay=5e-5, + batch_norm_decay=0.9997, + batch_norm_epsilon=1e-3): + """Defines the default arg scope for the NASNet-A Large ImageNet model. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + + Returns: + An `arg_scope` to use for the NASNet Large Model. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + 'scale': True, + 'fused': True, + } + weights_regularizer = contrib_layers.l2_regularizer(weight_decay) + weights_initializer = contrib_layers.variance_scaling_initializer( + mode='FAN_OUT') + with arg_scope([slim.fully_connected, slim.conv2d, slim.separable_conv2d], + weights_regularizer=weights_regularizer, + weights_initializer=weights_initializer): + with arg_scope([slim.fully_connected], + activation_fn=None, scope='FC'): + with arg_scope([slim.conv2d, slim.separable_conv2d], + activation_fn=None, biases_initializer=None): + with arg_scope([slim.batch_norm], **batch_norm_params) as sc: + return sc + + +def _build_aux_head(net, end_points, num_classes, hparams, scope): + """Auxiliary head used for all models across all datasets.""" + activation_fn = tf.nn.relu6 if hparams.use_bounded_activation else tf.nn.relu + with tf.compat.v1.variable_scope(scope): + aux_logits = tf.identity(net) + with tf.compat.v1.variable_scope('aux_logits'): + aux_logits = slim.avg_pool2d( + aux_logits, [5, 5], stride=3, padding='VALID') + aux_logits = slim.conv2d(aux_logits, 128, [1, 1], scope='proj') + aux_logits = slim.batch_norm(aux_logits, scope='aux_bn0') + aux_logits = activation_fn(aux_logits) + # Shape of feature map before the final layer. + shape = aux_logits.shape + if hparams.data_format == 'NHWC': + shape = shape[1:3] + else: + shape = shape[2:4] + aux_logits = slim.conv2d(aux_logits, 768, shape, padding='VALID') + aux_logits = slim.batch_norm(aux_logits, scope='aux_bn1') + aux_logits = activation_fn(aux_logits) + aux_logits = contrib_layers.flatten(aux_logits) + aux_logits = slim.fully_connected(aux_logits, num_classes) + end_points['AuxLogits'] = aux_logits + + +def _imagenet_stem(inputs, hparams, stem_cell, current_step=None): + """Stem used for models trained on ImageNet.""" + num_stem_cells = 2 + + # 149 x 149 x 32 + num_stem_filters = int(32 * hparams.stem_multiplier) + net = slim.conv2d( + inputs, num_stem_filters, [3, 3], stride=2, scope='conv0', + padding='VALID') + net = slim.batch_norm(net, scope='conv0_bn') + + # Run the reduction cells + cell_outputs = [None, net] + filter_scaling = 1.0 / (hparams.filter_scaling_rate**num_stem_cells) + for cell_num in range(num_stem_cells): + net = stem_cell( + net, + scope='cell_stem_{}'.format(cell_num), + filter_scaling=filter_scaling, + stride=2, + prev_layer=cell_outputs[-2], + cell_num=cell_num, + current_step=current_step) + cell_outputs.append(net) + filter_scaling *= hparams.filter_scaling_rate + return net, cell_outputs + + +def _cifar_stem(inputs, hparams): + """Stem used for models trained on Cifar.""" + num_stem_filters = int(hparams.num_conv_filters * hparams.stem_multiplier) + net = slim.conv2d( + inputs, + num_stem_filters, + 3, + scope='l1_stem_3x3') + net = slim.batch_norm(net, scope='l1_stem_bn') + return net, [None, net] + + +def build_nasnet_cifar(images, num_classes, + is_training=True, + config=None, + current_step=None): + """Build NASNet model for the Cifar Dataset.""" + hparams = cifar_config() if config is None else copy.deepcopy(config) + _update_hparams(hparams, is_training) + + if tf.test.is_gpu_available() and hparams.data_format == 'NHWC': + tf.compat.v1.logging.info( + 'A GPU is available on the machine, consider using NCHW ' + 'data format for increased speed on GPU.') + + if hparams.data_format == 'NCHW': + images = tf.transpose(a=images, perm=[0, 3, 1, 2]) + + # Calculate the total number of cells in the network + # Add 2 for the reduction cells + total_num_cells = hparams.num_cells + 2 + + normal_cell = nasnet_utils.NasNetANormalCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + reduction_cell = nasnet_utils.NasNetAReductionCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + with arg_scope([slim.dropout, nasnet_utils.drop_path, slim.batch_norm], + is_training=is_training): + with arg_scope([slim.avg_pool2d, + slim.max_pool2d, + slim.conv2d, + slim.batch_norm, + slim.separable_conv2d, + nasnet_utils.factorized_reduction, + nasnet_utils.global_avg_pool, + nasnet_utils.get_channel_index, + nasnet_utils.get_channel_dim], + data_format=hparams.data_format): + return _build_nasnet_base(images, + normal_cell=normal_cell, + reduction_cell=reduction_cell, + num_classes=num_classes, + hparams=hparams, + is_training=is_training, + stem_type='cifar', + current_step=current_step) +build_nasnet_cifar.default_image_size = 32 + + +def build_nasnet_mobile(images, num_classes, + is_training=True, + final_endpoint=None, + config=None, + current_step=None): + """Build NASNet Mobile model for the ImageNet Dataset.""" + hparams = (mobile_imagenet_config() if config is None + else copy.deepcopy(config)) + _update_hparams(hparams, is_training) + + if tf.test.is_gpu_available() and hparams.data_format == 'NHWC': + tf.compat.v1.logging.info( + 'A GPU is available on the machine, consider using NCHW ' + 'data format for increased speed on GPU.') + + if hparams.data_format == 'NCHW': + images = tf.transpose(a=images, perm=[0, 3, 1, 2]) + + # Calculate the total number of cells in the network + # Add 2 for the reduction cells + total_num_cells = hparams.num_cells + 2 + # If ImageNet, then add an additional two for the stem cells + total_num_cells += 2 + + normal_cell = nasnet_utils.NasNetANormalCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + reduction_cell = nasnet_utils.NasNetAReductionCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + with arg_scope([slim.dropout, nasnet_utils.drop_path, slim.batch_norm], + is_training=is_training): + with arg_scope([slim.avg_pool2d, + slim.max_pool2d, + slim.conv2d, + slim.batch_norm, + slim.separable_conv2d, + nasnet_utils.factorized_reduction, + nasnet_utils.global_avg_pool, + nasnet_utils.get_channel_index, + nasnet_utils.get_channel_dim], + data_format=hparams.data_format): + return _build_nasnet_base(images, + normal_cell=normal_cell, + reduction_cell=reduction_cell, + num_classes=num_classes, + hparams=hparams, + is_training=is_training, + stem_type='imagenet', + final_endpoint=final_endpoint, + current_step=current_step) +build_nasnet_mobile.default_image_size = 224 + + +def build_nasnet_large(images, num_classes, + is_training=True, + final_endpoint=None, + config=None, + current_step=None): + """Build NASNet Large model for the ImageNet Dataset.""" + hparams = (large_imagenet_config() if config is None + else copy.deepcopy(config)) + _update_hparams(hparams, is_training) + + if tf.test.is_gpu_available() and hparams.data_format == 'NHWC': + tf.compat.v1.logging.info( + 'A GPU is available on the machine, consider using NCHW ' + 'data format for increased speed on GPU.') + + if hparams.data_format == 'NCHW': + images = tf.transpose(a=images, perm=[0, 3, 1, 2]) + + # Calculate the total number of cells in the network + # Add 2 for the reduction cells + total_num_cells = hparams.num_cells + 2 + # If ImageNet, then add an additional two for the stem cells + total_num_cells += 2 + + normal_cell = nasnet_utils.NasNetANormalCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + reduction_cell = nasnet_utils.NasNetAReductionCell( + hparams.num_conv_filters, hparams.drop_path_keep_prob, + total_num_cells, hparams.total_training_steps, + hparams.use_bounded_activation) + with arg_scope([slim.dropout, nasnet_utils.drop_path, slim.batch_norm], + is_training=is_training): + with arg_scope([slim.avg_pool2d, + slim.max_pool2d, + slim.conv2d, + slim.batch_norm, + slim.separable_conv2d, + nasnet_utils.factorized_reduction, + nasnet_utils.global_avg_pool, + nasnet_utils.get_channel_index, + nasnet_utils.get_channel_dim], + data_format=hparams.data_format): + return _build_nasnet_base(images, + normal_cell=normal_cell, + reduction_cell=reduction_cell, + num_classes=num_classes, + hparams=hparams, + is_training=is_training, + stem_type='imagenet', + final_endpoint=final_endpoint, + current_step=current_step) +build_nasnet_large.default_image_size = 331 + + +def _build_nasnet_base(images, + normal_cell, + reduction_cell, + num_classes, + hparams, + is_training, + stem_type, + final_endpoint=None, + current_step=None): + """Constructs a NASNet image model.""" + + end_points = {} + def add_and_check_endpoint(endpoint_name, net): + end_points[endpoint_name] = net + return final_endpoint and (endpoint_name == final_endpoint) + + # Find where to place the reduction cells or stride normal cells + reduction_indices = nasnet_utils.calc_reduction_layers( + hparams.num_cells, hparams.num_reduction_layers) + stem_cell = reduction_cell + + if stem_type == 'imagenet': + stem = lambda: _imagenet_stem(images, hparams, stem_cell) + elif stem_type == 'cifar': + stem = lambda: _cifar_stem(images, hparams) + else: + raise ValueError('Unknown stem_type: ', stem_type) + net, cell_outputs = stem() + if add_and_check_endpoint('Stem', net): return net, end_points + + # Setup for building in the auxiliary head. + aux_head_cell_idxes = [] + if len(reduction_indices) >= 2: + aux_head_cell_idxes.append(reduction_indices[1] - 1) + + # Run the cells + filter_scaling = 1.0 + # true_cell_num accounts for the stem cells + true_cell_num = 2 if stem_type == 'imagenet' else 0 + activation_fn = tf.nn.relu6 if hparams.use_bounded_activation else tf.nn.relu + for cell_num in range(hparams.num_cells): + stride = 1 + if hparams.skip_reduction_layer_input: + prev_layer = cell_outputs[-2] + if cell_num in reduction_indices: + filter_scaling *= hparams.filter_scaling_rate + net = reduction_cell( + net, + scope='reduction_cell_{}'.format(reduction_indices.index(cell_num)), + filter_scaling=filter_scaling, + stride=2, + prev_layer=cell_outputs[-2], + cell_num=true_cell_num, + current_step=current_step) + if add_and_check_endpoint( + 'Reduction_Cell_{}'.format(reduction_indices.index(cell_num)), net): + return net, end_points + true_cell_num += 1 + cell_outputs.append(net) + if not hparams.skip_reduction_layer_input: + prev_layer = cell_outputs[-2] + net = normal_cell( + net, + scope='cell_{}'.format(cell_num), + filter_scaling=filter_scaling, + stride=stride, + prev_layer=prev_layer, + cell_num=true_cell_num, + current_step=current_step) + + if add_and_check_endpoint('Cell_{}'.format(cell_num), net): + return net, end_points + true_cell_num += 1 + if (hparams.use_aux_head and cell_num in aux_head_cell_idxes and + num_classes and is_training): + aux_net = activation_fn(net) + _build_aux_head(aux_net, end_points, num_classes, hparams, + scope='aux_{}'.format(cell_num)) + cell_outputs.append(net) + + # Final softmax layer + with tf.compat.v1.variable_scope('final_layer'): + net = activation_fn(net) + net = nasnet_utils.global_avg_pool(net) + if add_and_check_endpoint('global_pool', net) or not num_classes: + return net, end_points + net = slim.dropout(net, hparams.dense_dropout_keep_prob, scope='dropout') + logits = slim.fully_connected(net, num_classes) + + if add_and_check_endpoint('Logits', logits): + return net, end_points + + predictions = tf.nn.softmax(logits, name='predictions') + if add_and_check_endpoint('Predictions', predictions): + return net, end_points + return logits, end_points diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_test.py new file mode 100644 index 0000000..deb347d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_test.py @@ -0,0 +1,413 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nasnet.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets.nasnet import nasnet + +slim = contrib_slim + + +class NASNetTest(tf.test.TestCase): + + def testBuildLogitsCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = 10 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + logits, end_points = nasnet.build_nasnet_cifar(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildLogitsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + logits, end_points = nasnet.build_nasnet_mobile(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildLogitsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_large_arg_scope()): + logits, end_points = nasnet.build_nasnet_large(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildPreLogitsCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + net, end_points = nasnet.build_nasnet_cifar(inputs, num_classes) + self.assertFalse('AuxLogits' in end_points) + self.assertFalse('Predictions' in end_points) + self.assertTrue(net.op.name.startswith('final_layer/Mean')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 768]) + + def testBuildPreLogitsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + net, end_points = nasnet.build_nasnet_mobile(inputs, num_classes) + self.assertFalse('AuxLogits' in end_points) + self.assertFalse('Predictions' in end_points) + self.assertTrue(net.op.name.startswith('final_layer/Mean')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1056]) + + def testBuildPreLogitsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_large_arg_scope()): + net, end_points = nasnet.build_nasnet_large(inputs, num_classes) + self.assertFalse('AuxLogits' in end_points) + self.assertFalse('Predictions' in end_points) + self.assertTrue(net.op.name.startswith('final_layer/Mean')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 4032]) + + def testAllEndPointsShapesCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = 10 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + _, end_points = nasnet.build_nasnet_cifar(inputs, num_classes) + endpoints_shapes = {'Stem': [batch_size, 32, 32, 96], + 'Cell_0': [batch_size, 32, 32, 192], + 'Cell_1': [batch_size, 32, 32, 192], + 'Cell_2': [batch_size, 32, 32, 192], + 'Cell_3': [batch_size, 32, 32, 192], + 'Cell_4': [batch_size, 32, 32, 192], + 'Cell_5': [batch_size, 32, 32, 192], + 'Cell_6': [batch_size, 16, 16, 384], + 'Cell_7': [batch_size, 16, 16, 384], + 'Cell_8': [batch_size, 16, 16, 384], + 'Cell_9': [batch_size, 16, 16, 384], + 'Cell_10': [batch_size, 16, 16, 384], + 'Cell_11': [batch_size, 16, 16, 384], + 'Cell_12': [batch_size, 8, 8, 768], + 'Cell_13': [batch_size, 8, 8, 768], + 'Cell_14': [batch_size, 8, 8, 768], + 'Cell_15': [batch_size, 8, 8, 768], + 'Cell_16': [batch_size, 8, 8, 768], + 'Cell_17': [batch_size, 8, 8, 768], + 'Reduction_Cell_0': [batch_size, 16, 16, 256], + 'Reduction_Cell_1': [batch_size, 8, 8, 512], + 'global_pool': [batch_size, 768], + # Logits and predictions + 'AuxLogits': [batch_size, num_classes], + 'Logits': [batch_size, num_classes], + 'Predictions': [batch_size, num_classes]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + tf.compat.v1.logging.info('Endpoint name: {}'.format(endpoint_name)) + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testNoAuxHeadCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = 10 + for use_aux_head in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.cifar_config() + config.set_hparam('use_aux_head', int(use_aux_head)) + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + _, end_points = nasnet.build_nasnet_cifar(inputs, num_classes, + config=config) + self.assertEqual('AuxLogits' in end_points, use_aux_head) + + def testAllEndPointsShapesMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + _, end_points = nasnet.build_nasnet_mobile(inputs, num_classes) + endpoints_shapes = {'Stem': [batch_size, 28, 28, 88], + 'Cell_0': [batch_size, 28, 28, 264], + 'Cell_1': [batch_size, 28, 28, 264], + 'Cell_2': [batch_size, 28, 28, 264], + 'Cell_3': [batch_size, 28, 28, 264], + 'Cell_4': [batch_size, 14, 14, 528], + 'Cell_5': [batch_size, 14, 14, 528], + 'Cell_6': [batch_size, 14, 14, 528], + 'Cell_7': [batch_size, 14, 14, 528], + 'Cell_8': [batch_size, 7, 7, 1056], + 'Cell_9': [batch_size, 7, 7, 1056], + 'Cell_10': [batch_size, 7, 7, 1056], + 'Cell_11': [batch_size, 7, 7, 1056], + 'Reduction_Cell_0': [batch_size, 14, 14, 352], + 'Reduction_Cell_1': [batch_size, 7, 7, 704], + 'global_pool': [batch_size, 1056], + # Logits and predictions + 'AuxLogits': [batch_size, num_classes], + 'Logits': [batch_size, num_classes], + 'Predictions': [batch_size, num_classes]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + tf.compat.v1.logging.info('Endpoint name: {}'.format(endpoint_name)) + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testNoAuxHeadMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + for use_aux_head in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.mobile_imagenet_config() + config.set_hparam('use_aux_head', int(use_aux_head)) + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + _, end_points = nasnet.build_nasnet_mobile(inputs, num_classes, + config=config) + self.assertEqual('AuxLogits' in end_points, use_aux_head) + + def testAllEndPointsShapesLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_large_arg_scope()): + _, end_points = nasnet.build_nasnet_large(inputs, num_classes) + endpoints_shapes = {'Stem': [batch_size, 42, 42, 336], + 'Cell_0': [batch_size, 42, 42, 1008], + 'Cell_1': [batch_size, 42, 42, 1008], + 'Cell_2': [batch_size, 42, 42, 1008], + 'Cell_3': [batch_size, 42, 42, 1008], + 'Cell_4': [batch_size, 42, 42, 1008], + 'Cell_5': [batch_size, 42, 42, 1008], + 'Cell_6': [batch_size, 21, 21, 2016], + 'Cell_7': [batch_size, 21, 21, 2016], + 'Cell_8': [batch_size, 21, 21, 2016], + 'Cell_9': [batch_size, 21, 21, 2016], + 'Cell_10': [batch_size, 21, 21, 2016], + 'Cell_11': [batch_size, 21, 21, 2016], + 'Cell_12': [batch_size, 11, 11, 4032], + 'Cell_13': [batch_size, 11, 11, 4032], + 'Cell_14': [batch_size, 11, 11, 4032], + 'Cell_15': [batch_size, 11, 11, 4032], + 'Cell_16': [batch_size, 11, 11, 4032], + 'Cell_17': [batch_size, 11, 11, 4032], + 'Reduction_Cell_0': [batch_size, 21, 21, 1344], + 'Reduction_Cell_1': [batch_size, 11, 11, 2688], + 'global_pool': [batch_size, 4032], + # Logits and predictions + 'AuxLogits': [batch_size, num_classes], + 'Logits': [batch_size, num_classes], + 'Predictions': [batch_size, num_classes]} + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + tf.compat.v1.logging.info('Endpoint name: {}'.format(endpoint_name)) + expected_shape = endpoints_shapes[endpoint_name] + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testNoAuxHeadLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + for use_aux_head in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.large_imagenet_config() + config.set_hparam('use_aux_head', int(use_aux_head)) + with slim.arg_scope(nasnet.nasnet_large_arg_scope()): + _, end_points = nasnet.build_nasnet_large(inputs, num_classes, + config=config) + self.assertEqual('AuxLogits' in end_points, use_aux_head) + + def testVariablesSetDeviceMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + # Force all Variables to reside on the device. + with tf.compat.v1.variable_scope('on_cpu'), tf.device('/cpu:0'): + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + nasnet.build_nasnet_mobile(inputs, num_classes) + with tf.compat.v1.variable_scope('on_gpu'), tf.device('/gpu:0'): + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + nasnet.build_nasnet_mobile(inputs, num_classes) + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_cpu'): + self.assertDeviceEqual(v.device, '/cpu:0') + for v in tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope='on_gpu'): + self.assertDeviceEqual(v.device, '/gpu:0') + + def testUnknownBatchSizeMobileModel(self): + batch_size = 1 + height, width = 224, 224 + num_classes = 1000 + with self.test_session() as sess: + inputs = tf.compat.v1.placeholder(tf.float32, (None, height, width, 3)) + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + logits, _ = nasnet.build_nasnet_mobile(inputs, num_classes) + self.assertListEqual(logits.get_shape().as_list(), + [None, num_classes]) + images = tf.random.uniform((batch_size, height, width, 3)) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEquals(output.shape, (batch_size, num_classes)) + + def testEvaluationMobileModel(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + with self.test_session() as sess: + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + logits, _ = nasnet.build_nasnet_mobile(eval_inputs, + num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + def testOverrideHParamsCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = 10 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.cifar_config() + config.set_hparam('data_format', 'NCHW') + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + _, end_points = nasnet.build_nasnet_cifar( + inputs, num_classes, config=config) + self.assertListEqual( + end_points['Stem'].shape.as_list(), [batch_size, 96, 32, 32]) + + def testOverrideHParamsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.mobile_imagenet_config() + config.set_hparam('data_format', 'NCHW') + with slim.arg_scope(nasnet.nasnet_mobile_arg_scope()): + _, end_points = nasnet.build_nasnet_mobile( + inputs, num_classes, config=config) + self.assertListEqual( + end_points['Stem'].shape.as_list(), [batch_size, 88, 28, 28]) + + def testOverrideHParamsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = nasnet.large_imagenet_config() + config.set_hparam('data_format', 'NCHW') + with slim.arg_scope(nasnet.nasnet_large_arg_scope()): + _, end_points = nasnet.build_nasnet_large( + inputs, num_classes, config=config) + self.assertListEqual( + end_points['Stem'].shape.as_list(), [batch_size, 336, 42, 42]) + + def testCurrentStepCifarModel(self): + batch_size = 5 + height, width = 32, 32 + num_classes = 10 + inputs = tf.random.uniform((batch_size, height, width, 3)) + global_step = tf.compat.v1.train.create_global_step() + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + logits, end_points = nasnet.build_nasnet_cifar(inputs, + num_classes, + current_step=global_step) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testUseBoundedAcitvationCifarModel(self): + batch_size = 1 + height, width = 32, 32 + num_classes = 10 + for use_bounded_activation in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + config = nasnet.cifar_config() + config.set_hparam('use_bounded_activation', use_bounded_activation) + with slim.arg_scope(nasnet.nasnet_cifar_arg_scope()): + _, _ = nasnet.build_nasnet_cifar( + inputs, num_classes, config=config) + for node in tf.compat.v1.get_default_graph().as_graph_def().node: + if node.op.startswith('Relu'): + self.assertEqual(node.op == 'Relu6', use_bounded_activation) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils.py new file mode 100644 index 0000000..1d68854 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils.py @@ -0,0 +1,534 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A custom module for some common operations used by NASNet. + +Functions exposed in this file: +- calc_reduction_layers +- get_channel_index +- get_channel_dim +- global_avg_pool +- factorized_reduction +- drop_path + +Classes exposed in this file: +- NasNetABaseCell +- NasNetANormalCell +- NasNetAReductionCell +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import slim as contrib_slim + +arg_scope = contrib_framework.arg_scope +slim = contrib_slim + +DATA_FORMAT_NCHW = 'NCHW' +DATA_FORMAT_NHWC = 'NHWC' +INVALID = 'null' +# The cap for tf.clip_by_value, it's hinted from the activation distribution +# that the majority of activation values are in the range [-6, 6]. +CLIP_BY_VALUE_CAP = 6 + + +def calc_reduction_layers(num_cells, num_reduction_layers): + """Figure out what layers should have reductions.""" + reduction_layers = [] + for pool_num in range(1, num_reduction_layers + 1): + layer_num = (float(pool_num) / (num_reduction_layers + 1)) * num_cells + layer_num = int(layer_num) + reduction_layers.append(layer_num) + return reduction_layers + + +@contrib_framework.add_arg_scope +def get_channel_index(data_format=INVALID): + assert data_format != INVALID + axis = 3 if data_format == 'NHWC' else 1 + return axis + + +@contrib_framework.add_arg_scope +def get_channel_dim(shape, data_format=INVALID): + assert data_format != INVALID + assert len(shape) == 4 + if data_format == 'NHWC': + return int(shape[3]) + elif data_format == 'NCHW': + return int(shape[1]) + else: + raise ValueError('Not a valid data_format', data_format) + + +@contrib_framework.add_arg_scope +def global_avg_pool(x, data_format=INVALID): + """Average pool away the height and width spatial dimensions of x.""" + assert data_format != INVALID + assert data_format in ['NHWC', 'NCHW'] + assert x.shape.ndims == 4 + if data_format == 'NHWC': + return tf.reduce_mean(input_tensor=x, axis=[1, 2]) + else: + return tf.reduce_mean(input_tensor=x, axis=[2, 3]) + + +@contrib_framework.add_arg_scope +def factorized_reduction(net, output_filters, stride, data_format=INVALID): + """Reduces the shape of net without information loss due to striding.""" + assert data_format != INVALID + if stride == 1: + net = slim.conv2d(net, output_filters, 1, scope='path_conv') + net = slim.batch_norm(net, scope='path_bn') + return net + if data_format == 'NHWC': + stride_spec = [1, stride, stride, 1] + else: + stride_spec = [1, 1, stride, stride] + + # Skip path 1 + path1 = tf.compat.v2.nn.avg_pool2d( + input=net, + ksize=[1, 1, 1, 1], + strides=stride_spec, + padding='VALID', + data_format=data_format) + path1 = slim.conv2d(path1, int(output_filters / 2), 1, scope='path1_conv') + + # Skip path 2 + # First pad with 0's on the right and bottom, then shift the filter to + # include those 0's that were added. + if data_format == 'NHWC': + pad_arr = [[0, 0], [0, 1], [0, 1], [0, 0]] + path2 = tf.pad(tensor=net, paddings=pad_arr)[:, 1:, 1:, :] + concat_axis = 3 + else: + pad_arr = [[0, 0], [0, 0], [0, 1], [0, 1]] + path2 = tf.pad(tensor=net, paddings=pad_arr)[:, :, 1:, 1:] + concat_axis = 1 + + path2 = tf.compat.v2.nn.avg_pool2d( + input=path2, + ksize=[1, 1, 1, 1], + strides=stride_spec, + padding='VALID', + data_format=data_format) + + # If odd number of filters, add an additional one to the second path. + final_filter_size = int(output_filters / 2) + int(output_filters % 2) + path2 = slim.conv2d(path2, final_filter_size, 1, scope='path2_conv') + + # Concat and apply BN + final_path = tf.concat(values=[path1, path2], axis=concat_axis) + final_path = slim.batch_norm(final_path, scope='final_path_bn') + return final_path + + +@contrib_framework.add_arg_scope +def drop_path(net, keep_prob, is_training=True): + """Drops out a whole example hiddenstate with the specified probability.""" + if is_training: + batch_size = tf.shape(input=net)[0] + noise_shape = [batch_size, 1, 1, 1] + random_tensor = keep_prob + random_tensor += tf.random.uniform(noise_shape, dtype=tf.float32) + binary_tensor = tf.cast(tf.floor(random_tensor), net.dtype) + keep_prob_inv = tf.cast(1.0 / keep_prob, net.dtype) + net = net * keep_prob_inv * binary_tensor + + return net + + +def _operation_to_filter_shape(operation): + splitted_operation = operation.split('x') + filter_shape = int(splitted_operation[0][-1]) + assert filter_shape == int( + splitted_operation[1][0]), 'Rectangular filters not supported.' + return filter_shape + + +def _operation_to_num_layers(operation): + splitted_operation = operation.split('_') + if 'x' in splitted_operation[-1]: + return 1 + return int(splitted_operation[-1]) + + +def _operation_to_info(operation): + """Takes in operation name and returns meta information. + + An example would be 'separable_3x3_4' -> (3, 4). + + Args: + operation: String that corresponds to convolution operation. + + Returns: + Tuple of (filter shape, num layers). + """ + num_layers = _operation_to_num_layers(operation) + filter_shape = _operation_to_filter_shape(operation) + return num_layers, filter_shape + + +def _stacked_separable_conv(net, stride, operation, filter_size, + use_bounded_activation): + """Takes in an operations and parses it to the correct sep operation.""" + num_layers, kernel_size = _operation_to_info(operation) + activation_fn = tf.nn.relu6 if use_bounded_activation else tf.nn.relu + for layer_num in range(num_layers - 1): + net = activation_fn(net) + net = slim.separable_conv2d( + net, + filter_size, + kernel_size, + depth_multiplier=1, + scope='separable_{0}x{0}_{1}'.format(kernel_size, layer_num + 1), + stride=stride) + net = slim.batch_norm( + net, scope='bn_sep_{0}x{0}_{1}'.format(kernel_size, layer_num + 1)) + stride = 1 + net = activation_fn(net) + net = slim.separable_conv2d( + net, + filter_size, + kernel_size, + depth_multiplier=1, + scope='separable_{0}x{0}_{1}'.format(kernel_size, num_layers), + stride=stride) + net = slim.batch_norm( + net, scope='bn_sep_{0}x{0}_{1}'.format(kernel_size, num_layers)) + return net + + +def _operation_to_pooling_type(operation): + """Takes in the operation string and returns the pooling type.""" + splitted_operation = operation.split('_') + return splitted_operation[0] + + +def _operation_to_pooling_shape(operation): + """Takes in the operation string and returns the pooling kernel shape.""" + splitted_operation = operation.split('_') + shape = splitted_operation[-1] + assert 'x' in shape + filter_height, filter_width = shape.split('x') + assert filter_height == filter_width + return int(filter_height) + + +def _operation_to_pooling_info(operation): + """Parses the pooling operation string to return its type and shape.""" + pooling_type = _operation_to_pooling_type(operation) + pooling_shape = _operation_to_pooling_shape(operation) + return pooling_type, pooling_shape + + +def _pooling(net, stride, operation, use_bounded_activation): + """Parses operation and performs the correct pooling operation on net.""" + padding = 'SAME' + pooling_type, pooling_shape = _operation_to_pooling_info(operation) + if use_bounded_activation: + net = tf.nn.relu6(net) + if pooling_type == 'avg': + net = slim.avg_pool2d(net, pooling_shape, stride=stride, padding=padding) + elif pooling_type == 'max': + net = slim.max_pool2d(net, pooling_shape, stride=stride, padding=padding) + else: + raise NotImplementedError('Unimplemented pooling type: ', pooling_type) + return net + + +class NasNetABaseCell(object): + """NASNet Cell class that is used as a 'layer' in image architectures. + + Args: + num_conv_filters: The number of filters for each convolution operation. + operations: List of operations that are performed in the NASNet Cell in + order. + used_hiddenstates: Binary array that signals if the hiddenstate was used + within the cell. This is used to determine what outputs of the cell + should be concatenated together. + hiddenstate_indices: Determines what hiddenstates should be combined + together with the specified operations to create the NASNet cell. + use_bounded_activation: Whether or not to use bounded activations. Bounded + activations better lend themselves to quantized inference. + """ + + def __init__(self, num_conv_filters, operations, used_hiddenstates, + hiddenstate_indices, drop_path_keep_prob, total_num_cells, + total_training_steps, use_bounded_activation=False): + self._num_conv_filters = num_conv_filters + self._operations = operations + self._used_hiddenstates = used_hiddenstates + self._hiddenstate_indices = hiddenstate_indices + self._drop_path_keep_prob = drop_path_keep_prob + self._total_num_cells = total_num_cells + self._total_training_steps = total_training_steps + self._use_bounded_activation = use_bounded_activation + + def _reduce_prev_layer(self, prev_layer, curr_layer): + """Matches dimension of prev_layer to the curr_layer.""" + # Set the prev layer to the current layer if it is none + if prev_layer is None: + return curr_layer + curr_num_filters = self._filter_size + prev_num_filters = get_channel_dim(prev_layer.shape) + curr_filter_shape = int(curr_layer.shape[2]) + prev_filter_shape = int(prev_layer.shape[2]) + activation_fn = tf.nn.relu6 if self._use_bounded_activation else tf.nn.relu + if curr_filter_shape != prev_filter_shape: + prev_layer = activation_fn(prev_layer) + prev_layer = factorized_reduction( + prev_layer, curr_num_filters, stride=2) + elif curr_num_filters != prev_num_filters: + prev_layer = activation_fn(prev_layer) + prev_layer = slim.conv2d( + prev_layer, curr_num_filters, 1, scope='prev_1x1') + prev_layer = slim.batch_norm(prev_layer, scope='prev_bn') + return prev_layer + + def _cell_base(self, net, prev_layer): + """Runs the beginning of the conv cell before the predicted ops are run.""" + num_filters = self._filter_size + + # Check to be sure prev layer stuff is setup correctly + prev_layer = self._reduce_prev_layer(prev_layer, net) + + net = tf.nn.relu6(net) if self._use_bounded_activation else tf.nn.relu(net) + net = slim.conv2d(net, num_filters, 1, scope='1x1') + net = slim.batch_norm(net, scope='beginning_bn') + # num_or_size_splits=1 + net = [net] + net.append(prev_layer) + return net + + def __call__(self, net, scope=None, filter_scaling=1, stride=1, + prev_layer=None, cell_num=-1, current_step=None): + """Runs the conv cell.""" + self._cell_num = cell_num + self._filter_scaling = filter_scaling + self._filter_size = int(self._num_conv_filters * filter_scaling) + + i = 0 + with tf.compat.v1.variable_scope(scope): + net = self._cell_base(net, prev_layer) + for iteration in range(5): + with tf.compat.v1.variable_scope('comb_iter_{}'.format(iteration)): + left_hiddenstate_idx, right_hiddenstate_idx = ( + self._hiddenstate_indices[i], + self._hiddenstate_indices[i + 1]) + original_input_left = left_hiddenstate_idx < 2 + original_input_right = right_hiddenstate_idx < 2 + h1 = net[left_hiddenstate_idx] + h2 = net[right_hiddenstate_idx] + + operation_left = self._operations[i] + operation_right = self._operations[i+1] + i += 2 + # Apply conv operations + with tf.compat.v1.variable_scope('left'): + h1 = self._apply_conv_operation(h1, operation_left, + stride, original_input_left, + current_step) + with tf.compat.v1.variable_scope('right'): + h2 = self._apply_conv_operation(h2, operation_right, + stride, original_input_right, + current_step) + + # Combine hidden states using 'add'. + with tf.compat.v1.variable_scope('combine'): + h = h1 + h2 + if self._use_bounded_activation: + h = tf.nn.relu6(h) + + # Add hiddenstate to the list of hiddenstates we can choose from + net.append(h) + + with tf.compat.v1.variable_scope('cell_output'): + net = self._combine_unused_states(net) + + return net + + def _apply_conv_operation(self, net, operation, + stride, is_from_original_input, current_step): + """Applies the predicted conv operation to net.""" + # Dont stride if this is not one of the original hiddenstates + if stride > 1 and not is_from_original_input: + stride = 1 + input_filters = get_channel_dim(net.shape) + filter_size = self._filter_size + if 'separable' in operation: + net = _stacked_separable_conv(net, stride, operation, filter_size, + self._use_bounded_activation) + if self._use_bounded_activation: + net = tf.clip_by_value(net, -CLIP_BY_VALUE_CAP, CLIP_BY_VALUE_CAP) + elif operation in ['none']: + if self._use_bounded_activation: + net = tf.nn.relu6(net) + # Check if a stride is needed, then use a strided 1x1 here + if stride > 1 or (input_filters != filter_size): + if not self._use_bounded_activation: + net = tf.nn.relu(net) + net = slim.conv2d(net, filter_size, 1, stride=stride, scope='1x1') + net = slim.batch_norm(net, scope='bn_1') + if self._use_bounded_activation: + net = tf.clip_by_value(net, -CLIP_BY_VALUE_CAP, CLIP_BY_VALUE_CAP) + elif 'pool' in operation: + net = _pooling(net, stride, operation, self._use_bounded_activation) + if input_filters != filter_size: + net = slim.conv2d(net, filter_size, 1, stride=1, scope='1x1') + net = slim.batch_norm(net, scope='bn_1') + if self._use_bounded_activation: + net = tf.clip_by_value(net, -CLIP_BY_VALUE_CAP, CLIP_BY_VALUE_CAP) + else: + raise ValueError('Unimplemented operation', operation) + + if operation != 'none': + net = self._apply_drop_path(net, current_step=current_step) + return net + + def _combine_unused_states(self, net): + """Concatenate the unused hidden states of the cell.""" + used_hiddenstates = self._used_hiddenstates + + final_height = int(net[-1].shape[2]) + final_num_filters = get_channel_dim(net[-1].shape) + assert len(used_hiddenstates) == len(net) + for idx, used_h in enumerate(used_hiddenstates): + curr_height = int(net[idx].shape[2]) + curr_num_filters = get_channel_dim(net[idx].shape) + + # Determine if a reduction should be applied to make the number of + # filters match. + should_reduce = final_num_filters != curr_num_filters + should_reduce = (final_height != curr_height) or should_reduce + should_reduce = should_reduce and not used_h + if should_reduce: + stride = 2 if final_height != curr_height else 1 + with tf.compat.v1.variable_scope('reduction_{}'.format(idx)): + net[idx] = factorized_reduction( + net[idx], final_num_filters, stride) + + states_to_combine = ( + [h for h, is_used in zip(net, used_hiddenstates) if not is_used]) + + # Return the concat of all the states + concat_axis = get_channel_index() + net = tf.concat(values=states_to_combine, axis=concat_axis) + return net + + @contrib_framework.add_arg_scope # No public API. For internal use only. + def _apply_drop_path(self, net, current_step=None, + use_summaries=False, drop_connect_version='v3'): + """Apply drop_path regularization. + + Args: + net: the Tensor that gets drop_path regularization applied. + current_step: a float32 Tensor with the current global_step value, + to be divided by hparams.total_training_steps. Usually None, which + defaults to tf.train.get_or_create_global_step() properly casted. + use_summaries: a Python boolean. If set to False, no summaries are output. + drop_connect_version: one of 'v1', 'v2', 'v3', controlling whether + the dropout rate is scaled by current_step (v1), layer (v2), or + both (v3, the default). + + Returns: + The dropped-out value of `net`. + """ + drop_path_keep_prob = self._drop_path_keep_prob + if drop_path_keep_prob < 1.0: + assert drop_connect_version in ['v1', 'v2', 'v3'] + if drop_connect_version in ['v2', 'v3']: + # Scale keep prob by layer number + assert self._cell_num != -1 + # The added 2 is for the reduction cells + num_cells = self._total_num_cells + layer_ratio = (self._cell_num + 1)/float(num_cells) + if use_summaries: + with tf.device('/cpu:0'): + tf.compat.v1.summary.scalar('layer_ratio', layer_ratio) + drop_path_keep_prob = 1 - layer_ratio * (1 - drop_path_keep_prob) + if drop_connect_version in ['v1', 'v3']: + # Decrease the keep probability over time + if current_step is None: + current_step = tf.compat.v1.train.get_or_create_global_step() + current_step = tf.cast(current_step, tf.float32) + drop_path_burn_in_steps = self._total_training_steps + current_ratio = current_step / drop_path_burn_in_steps + current_ratio = tf.minimum(1.0, current_ratio) + if use_summaries: + with tf.device('/cpu:0'): + tf.compat.v1.summary.scalar('current_ratio', current_ratio) + drop_path_keep_prob = (1 - current_ratio * (1 - drop_path_keep_prob)) + if use_summaries: + with tf.device('/cpu:0'): + tf.compat.v1.summary.scalar('drop_path_keep_prob', + drop_path_keep_prob) + net = drop_path(net, drop_path_keep_prob) + return net + + +class NasNetANormalCell(NasNetABaseCell): + """NASNetA Normal Cell.""" + + def __init__(self, num_conv_filters, drop_path_keep_prob, total_num_cells, + total_training_steps, use_bounded_activation=False): + operations = ['separable_5x5_2', + 'separable_3x3_2', + 'separable_5x5_2', + 'separable_3x3_2', + 'avg_pool_3x3', + 'none', + 'avg_pool_3x3', + 'avg_pool_3x3', + 'separable_3x3_2', + 'none'] + used_hiddenstates = [1, 0, 0, 0, 0, 0, 0] + hiddenstate_indices = [0, 1, 1, 1, 0, 1, 1, 1, 0, 0] + super(NasNetANormalCell, self).__init__(num_conv_filters, operations, + used_hiddenstates, + hiddenstate_indices, + drop_path_keep_prob, + total_num_cells, + total_training_steps, + use_bounded_activation) + + +class NasNetAReductionCell(NasNetABaseCell): + """NASNetA Reduction Cell.""" + + def __init__(self, num_conv_filters, drop_path_keep_prob, total_num_cells, + total_training_steps, use_bounded_activation=False): + operations = ['separable_5x5_2', + 'separable_7x7_2', + 'max_pool_3x3', + 'separable_7x7_2', + 'avg_pool_3x3', + 'separable_5x5_2', + 'none', + 'avg_pool_3x3', + 'separable_3x3_2', + 'max_pool_3x3'] + used_hiddenstates = [1, 1, 1, 0, 0, 0, 0] + hiddenstate_indices = [0, 1, 0, 1, 0, 1, 3, 2, 2, 0] + super(NasNetAReductionCell, self).__init__(num_conv_filters, operations, + used_hiddenstates, + hiddenstate_indices, + drop_path_keep_prob, + total_num_cells, + total_training_steps, + use_bounded_activation) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils_test.py new file mode 100644 index 0000000..d165418 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/nasnet_utils_test.py @@ -0,0 +1,62 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.nasnet.nasnet_utils.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from nets.nasnet import nasnet_utils + + +class NasnetUtilsTest(tf.test.TestCase): + + def testCalcReductionLayers(self): + num_cells = 18 + num_reduction_layers = 2 + reduction_layers = nasnet_utils.calc_reduction_layers( + num_cells, num_reduction_layers) + self.assertEqual(len(reduction_layers), 2) + self.assertEqual(reduction_layers[0], 6) + self.assertEqual(reduction_layers[1], 12) + + def testGetChannelIndex(self): + data_formats = ['NHWC', 'NCHW'] + for data_format in data_formats: + index = nasnet_utils.get_channel_index(data_format) + correct_index = 3 if data_format == 'NHWC' else 1 + self.assertEqual(index, correct_index) + + def testGetChannelDim(self): + data_formats = ['NHWC', 'NCHW'] + shape = [10, 20, 30, 40] + for data_format in data_formats: + dim = nasnet_utils.get_channel_dim(shape, data_format) + correct_dim = shape[3] if data_format == 'NHWC' else shape[1] + self.assertEqual(dim, correct_dim) + + def testGlobalAvgPool(self): + data_formats = ['NHWC', 'NCHW'] + inputs = tf.compat.v1.placeholder(tf.float32, (5, 10, 20, 10)) + for data_format in data_formats: + output = nasnet_utils.global_avg_pool( + inputs, data_format) + self.assertEqual(output.shape, [5, 10]) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet.py new file mode 100644 index 0000000..5e612e3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet.py @@ -0,0 +1,285 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for the PNASNet classification networks. + +Paper: https://arxiv.org/abs/1712.00559 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import slim as contrib_slim +from tensorflow.contrib import training as contrib_training + +from nets.nasnet import nasnet +from nets.nasnet import nasnet_utils + +arg_scope = contrib_framework.arg_scope +slim = contrib_slim + + +def large_imagenet_config(): + """Large ImageNet configuration based on PNASNet-5.""" + return contrib_training.HParams( + stem_multiplier=3.0, + dense_dropout_keep_prob=0.5, + num_cells=12, + filter_scaling_rate=2.0, + num_conv_filters=216, + drop_path_keep_prob=0.6, + use_aux_head=1, + num_reduction_layers=2, + data_format='NHWC', + skip_reduction_layer_input=1, + total_training_steps=250000, + use_bounded_activation=False, + ) + + +def mobile_imagenet_config(): + """Mobile ImageNet configuration based on PNASNet-5.""" + return contrib_training.HParams( + stem_multiplier=1.0, + dense_dropout_keep_prob=0.5, + num_cells=9, + filter_scaling_rate=2.0, + num_conv_filters=54, + drop_path_keep_prob=1.0, + use_aux_head=1, + num_reduction_layers=2, + data_format='NHWC', + skip_reduction_layer_input=1, + total_training_steps=250000, + use_bounded_activation=False, + ) + + +def pnasnet_large_arg_scope(weight_decay=4e-5, batch_norm_decay=0.9997, + batch_norm_epsilon=0.001): + """Default arg scope for the PNASNet Large ImageNet model.""" + return nasnet.nasnet_large_arg_scope( + weight_decay, batch_norm_decay, batch_norm_epsilon) + + +def pnasnet_mobile_arg_scope(weight_decay=4e-5, + batch_norm_decay=0.9997, + batch_norm_epsilon=0.001): + """Default arg scope for the PNASNet Mobile ImageNet model.""" + return nasnet.nasnet_mobile_arg_scope(weight_decay, batch_norm_decay, + batch_norm_epsilon) + + +def _build_pnasnet_base(images, + normal_cell, + num_classes, + hparams, + is_training, + final_endpoint=None): + """Constructs a PNASNet image model.""" + + end_points = {} + + def add_and_check_endpoint(endpoint_name, net): + end_points[endpoint_name] = net + return final_endpoint and (endpoint_name == final_endpoint) + + # Find where to place the reduction cells or stride normal cells + reduction_indices = nasnet_utils.calc_reduction_layers( + hparams.num_cells, hparams.num_reduction_layers) + + # pylint: disable=protected-access + stem = lambda: nasnet._imagenet_stem(images, hparams, normal_cell) + # pylint: enable=protected-access + net, cell_outputs = stem() + if add_and_check_endpoint('Stem', net): + return net, end_points + + # Setup for building in the auxiliary head. + aux_head_cell_idxes = [] + if len(reduction_indices) >= 2: + aux_head_cell_idxes.append(reduction_indices[1] - 1) + + # Run the cells + filter_scaling = 1.0 + # true_cell_num accounts for the stem cells + true_cell_num = 2 + activation_fn = tf.nn.relu6 if hparams.use_bounded_activation else tf.nn.relu + for cell_num in range(hparams.num_cells): + is_reduction = cell_num in reduction_indices + stride = 2 if is_reduction else 1 + if is_reduction: filter_scaling *= hparams.filter_scaling_rate + if hparams.skip_reduction_layer_input or not is_reduction: + prev_layer = cell_outputs[-2] + net = normal_cell( + net, + scope='cell_{}'.format(cell_num), + filter_scaling=filter_scaling, + stride=stride, + prev_layer=prev_layer, + cell_num=true_cell_num) + if add_and_check_endpoint('Cell_{}'.format(cell_num), net): + return net, end_points + true_cell_num += 1 + cell_outputs.append(net) + + if (hparams.use_aux_head and cell_num in aux_head_cell_idxes and + num_classes and is_training): + aux_net = activation_fn(net) + # pylint: disable=protected-access + nasnet._build_aux_head(aux_net, end_points, num_classes, hparams, + scope='aux_{}'.format(cell_num)) + # pylint: enable=protected-access + + # Final softmax layer + with tf.compat.v1.variable_scope('final_layer'): + net = activation_fn(net) + net = nasnet_utils.global_avg_pool(net) + if add_and_check_endpoint('global_pool', net) or not num_classes: + return net, end_points + net = slim.dropout(net, hparams.dense_dropout_keep_prob, scope='dropout') + logits = slim.fully_connected(net, num_classes) + + if add_and_check_endpoint('Logits', logits): + return net, end_points + + predictions = tf.nn.softmax(logits, name='predictions') + if add_and_check_endpoint('Predictions', predictions): + return net, end_points + return logits, end_points + + +def build_pnasnet_large(images, + num_classes, + is_training=True, + final_endpoint=None, + config=None): + """Build PNASNet Large model for the ImageNet Dataset.""" + hparams = copy.deepcopy(config) if config else large_imagenet_config() + # pylint: disable=protected-access + nasnet._update_hparams(hparams, is_training) + # pylint: enable=protected-access + + if tf.test.is_gpu_available() and hparams.data_format == 'NHWC': + tf.compat.v1.logging.info( + 'A GPU is available on the machine, consider using NCHW ' + 'data format for increased speed on GPU.') + + if hparams.data_format == 'NCHW': + images = tf.transpose(a=images, perm=[0, 3, 1, 2]) + + # Calculate the total number of cells in the network. + # There is no distinction between reduction and normal cells in PNAS so the + # total number of cells is equal to the number normal cells plus the number + # of stem cells (two by default). + total_num_cells = hparams.num_cells + 2 + + normal_cell = PNasNetNormalCell(hparams.num_conv_filters, + hparams.drop_path_keep_prob, total_num_cells, + hparams.total_training_steps, + hparams.use_bounded_activation) + with arg_scope( + [slim.dropout, nasnet_utils.drop_path, slim.batch_norm], + is_training=is_training): + with arg_scope([slim.avg_pool2d, slim.max_pool2d, slim.conv2d, + slim.batch_norm, slim.separable_conv2d, + nasnet_utils.factorized_reduction, + nasnet_utils.global_avg_pool, + nasnet_utils.get_channel_index, + nasnet_utils.get_channel_dim], + data_format=hparams.data_format): + return _build_pnasnet_base( + images, + normal_cell=normal_cell, + num_classes=num_classes, + hparams=hparams, + is_training=is_training, + final_endpoint=final_endpoint) +build_pnasnet_large.default_image_size = 331 + + +def build_pnasnet_mobile(images, + num_classes, + is_training=True, + final_endpoint=None, + config=None): + """Build PNASNet Mobile model for the ImageNet Dataset.""" + hparams = copy.deepcopy(config) if config else mobile_imagenet_config() + # pylint: disable=protected-access + nasnet._update_hparams(hparams, is_training) + # pylint: enable=protected-access + + if tf.test.is_gpu_available() and hparams.data_format == 'NHWC': + tf.compat.v1.logging.info( + 'A GPU is available on the machine, consider using NCHW ' + 'data format for increased speed on GPU.') + + if hparams.data_format == 'NCHW': + images = tf.transpose(a=images, perm=[0, 3, 1, 2]) + + # Calculate the total number of cells in the network. + # There is no distinction between reduction and normal cells in PNAS so the + # total number of cells is equal to the number normal cells plus the number + # of stem cells (two by default). + total_num_cells = hparams.num_cells + 2 + + normal_cell = PNasNetNormalCell(hparams.num_conv_filters, + hparams.drop_path_keep_prob, total_num_cells, + hparams.total_training_steps, + hparams.use_bounded_activation) + with arg_scope( + [slim.dropout, nasnet_utils.drop_path, slim.batch_norm], + is_training=is_training): + with arg_scope( + [ + slim.avg_pool2d, slim.max_pool2d, slim.conv2d, slim.batch_norm, + slim.separable_conv2d, nasnet_utils.factorized_reduction, + nasnet_utils.global_avg_pool, nasnet_utils.get_channel_index, + nasnet_utils.get_channel_dim + ], + data_format=hparams.data_format): + return _build_pnasnet_base( + images, + normal_cell=normal_cell, + num_classes=num_classes, + hparams=hparams, + is_training=is_training, + final_endpoint=final_endpoint) + + +build_pnasnet_mobile.default_image_size = 224 + + +class PNasNetNormalCell(nasnet_utils.NasNetABaseCell): + """PNASNet Normal Cell.""" + + def __init__(self, num_conv_filters, drop_path_keep_prob, total_num_cells, + total_training_steps, use_bounded_activation=False): + # Configuration for the PNASNet-5 model. + operations = [ + 'separable_5x5_2', 'max_pool_3x3', 'separable_7x7_2', 'max_pool_3x3', + 'separable_5x5_2', 'separable_3x3_2', 'separable_3x3_2', 'max_pool_3x3', + 'separable_3x3_2', 'none' + ] + used_hiddenstates = [1, 1, 0, 0, 0, 0, 0] + hiddenstate_indices = [1, 1, 0, 0, 0, 0, 4, 0, 1, 0] + + super(PNasNetNormalCell, self).__init__( + num_conv_filters, operations, used_hiddenstates, hiddenstate_indices, + drop_path_keep_prob, total_num_cells, total_training_steps, + use_bounded_activation) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet_test.py new file mode 100644 index 0000000..8e1df4d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nasnet/pnasnet_test.py @@ -0,0 +1,257 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.pnasnet.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets.nasnet import pnasnet + +slim = contrib_slim + + +class PNASNetTest(tf.test.TestCase): + + def testBuildLogitsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + logits, end_points = pnasnet.build_pnasnet_large(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildLogitsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + logits, end_points = pnasnet.build_pnasnet_mobile(inputs, num_classes) + auxlogits = end_points['AuxLogits'] + predictions = end_points['Predictions'] + self.assertListEqual(auxlogits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertListEqual(predictions.get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildNonExistingLayerLargeModel(self): + """Tests that the model is built correctly without unnecessary layers.""" + inputs = tf.random.uniform((5, 331, 331, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + pnasnet.build_pnasnet_large(inputs, 1000) + vars_names = [x.op.name for x in tf.compat.v1.trainable_variables()] + self.assertIn('cell_stem_0/1x1/weights', vars_names) + self.assertNotIn('cell_stem_1/comb_iter_0/right/1x1/weights', vars_names) + + def testBuildNonExistingLayerMobileModel(self): + """Tests that the model is built correctly without unnecessary layers.""" + inputs = tf.random.uniform((5, 224, 224, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + pnasnet.build_pnasnet_mobile(inputs, 1000) + vars_names = [x.op.name for x in tf.compat.v1.trainable_variables()] + self.assertIn('cell_stem_0/1x1/weights', vars_names) + self.assertNotIn('cell_stem_1/comb_iter_0/right/1x1/weights', vars_names) + + def testBuildPreLogitsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + net, end_points = pnasnet.build_pnasnet_large(inputs, num_classes) + self.assertFalse('AuxLogits' in end_points) + self.assertFalse('Predictions' in end_points) + self.assertTrue(net.op.name.startswith('final_layer/Mean')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 4320]) + + def testBuildPreLogitsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + net, end_points = pnasnet.build_pnasnet_mobile(inputs, num_classes) + self.assertFalse('AuxLogits' in end_points) + self.assertFalse('Predictions' in end_points) + self.assertTrue(net.op.name.startswith('final_layer/Mean')) + self.assertListEqual(net.get_shape().as_list(), [batch_size, 1080]) + + def testAllEndPointsShapesLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + _, end_points = pnasnet.build_pnasnet_large(inputs, num_classes) + + endpoints_shapes = {'Stem': [batch_size, 42, 42, 540], + 'Cell_0': [batch_size, 42, 42, 1080], + 'Cell_1': [batch_size, 42, 42, 1080], + 'Cell_2': [batch_size, 42, 42, 1080], + 'Cell_3': [batch_size, 42, 42, 1080], + 'Cell_4': [batch_size, 21, 21, 2160], + 'Cell_5': [batch_size, 21, 21, 2160], + 'Cell_6': [batch_size, 21, 21, 2160], + 'Cell_7': [batch_size, 21, 21, 2160], + 'Cell_8': [batch_size, 11, 11, 4320], + 'Cell_9': [batch_size, 11, 11, 4320], + 'Cell_10': [batch_size, 11, 11, 4320], + 'Cell_11': [batch_size, 11, 11, 4320], + 'global_pool': [batch_size, 4320], + # Logits and predictions + 'AuxLogits': [batch_size, 1000], + 'Predictions': [batch_size, 1000], + 'Logits': [batch_size, 1000], + } + self.assertEqual(len(end_points), 17) + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + tf.compat.v1.logging.info('Endpoint name: {}'.format(endpoint_name)) + expected_shape = endpoints_shapes[endpoint_name] + self.assertIn(endpoint_name, end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testAllEndPointsShapesMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + _, end_points = pnasnet.build_pnasnet_mobile(inputs, num_classes) + + endpoints_shapes = { + 'Stem': [batch_size, 28, 28, 135], + 'Cell_0': [batch_size, 28, 28, 270], + 'Cell_1': [batch_size, 28, 28, 270], + 'Cell_2': [batch_size, 28, 28, 270], + 'Cell_3': [batch_size, 14, 14, 540], + 'Cell_4': [batch_size, 14, 14, 540], + 'Cell_5': [batch_size, 14, 14, 540], + 'Cell_6': [batch_size, 7, 7, 1080], + 'Cell_7': [batch_size, 7, 7, 1080], + 'Cell_8': [batch_size, 7, 7, 1080], + 'global_pool': [batch_size, 1080], + # Logits and predictions + 'AuxLogits': [batch_size, num_classes], + 'Predictions': [batch_size, num_classes], + 'Logits': [batch_size, num_classes], + } + self.assertEqual(len(end_points), 14) + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name in endpoints_shapes: + tf.compat.v1.logging.info('Endpoint name: {}'.format(endpoint_name)) + expected_shape = endpoints_shapes[endpoint_name] + self.assertIn(endpoint_name, end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testNoAuxHeadLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + for use_aux_head in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = pnasnet.large_imagenet_config() + config.set_hparam('use_aux_head', int(use_aux_head)) + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + _, end_points = pnasnet.build_pnasnet_large(inputs, num_classes, + config=config) + self.assertEqual('AuxLogits' in end_points, use_aux_head) + + def testNoAuxHeadMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + for use_aux_head in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = pnasnet.mobile_imagenet_config() + config.set_hparam('use_aux_head', int(use_aux_head)) + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + _, end_points = pnasnet.build_pnasnet_mobile( + inputs, num_classes, config=config) + self.assertEqual('AuxLogits' in end_points, use_aux_head) + + def testOverrideHParamsLargeModel(self): + batch_size = 5 + height, width = 331, 331 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = pnasnet.large_imagenet_config() + config.set_hparam('data_format', 'NCHW') + with slim.arg_scope(pnasnet.pnasnet_large_arg_scope()): + _, end_points = pnasnet.build_pnasnet_large( + inputs, num_classes, config=config) + self.assertListEqual( + end_points['Stem'].shape.as_list(), [batch_size, 540, 42, 42]) + + def testOverrideHParamsMobileModel(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + inputs = tf.random.uniform((batch_size, height, width, 3)) + tf.compat.v1.train.create_global_step() + config = pnasnet.mobile_imagenet_config() + config.set_hparam('data_format', 'NCHW') + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + _, end_points = pnasnet.build_pnasnet_mobile( + inputs, num_classes, config=config) + self.assertListEqual(end_points['Stem'].shape.as_list(), + [batch_size, 135, 28, 28]) + + def testUseBoundedAcitvationMobileModel(self): + batch_size = 1 + height, width = 224, 224 + num_classes = 1000 + for use_bounded_activation in (True, False): + tf.compat.v1.reset_default_graph() + inputs = tf.random.uniform((batch_size, height, width, 3)) + config = pnasnet.mobile_imagenet_config() + config.set_hparam('use_bounded_activation', use_bounded_activation) + with slim.arg_scope(pnasnet.pnasnet_mobile_arg_scope()): + _, _ = pnasnet.build_pnasnet_mobile( + inputs, num_classes, config=config) + for node in tf.compat.v1.get_default_graph().as_graph_def().node: + if node.op.startswith('Relu'): + self.assertEqual(node.op == 'Relu6', use_bounded_activation) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory.py new file mode 100644 index 0000000..1c34f80 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory.py @@ -0,0 +1,172 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains a factory for building various models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import functools +from tensorflow.contrib import slim as contrib_slim + +from nets import alexnet +from nets import cifarnet +from nets import i3d +from nets import inception +from nets import lenet +from nets import mobilenet_v1 +from nets import overfeat +from nets import resnet_v1 +from nets import resnet_v2 +from nets import s3dg +from nets import vgg +from nets.mobilenet import mobilenet_v2 +from nets.mobilenet import mobilenet_v3 +from nets.nasnet import nasnet +from nets.nasnet import pnasnet + + +slim = contrib_slim + +networks_map = { + 'alexnet_v2': alexnet.alexnet_v2, + 'cifarnet': cifarnet.cifarnet, + 'overfeat': overfeat.overfeat, + 'vgg_a': vgg.vgg_a, + 'vgg_16': vgg.vgg_16, + 'vgg_19': vgg.vgg_19, + 'inception_v1': inception.inception_v1, + 'inception_v2': inception.inception_v2, + 'inception_v3': inception.inception_v3, + 'inception_v4': inception.inception_v4, + 'inception_resnet_v2': inception.inception_resnet_v2, + 'i3d': i3d.i3d, + 's3dg': s3dg.s3dg, + 'lenet': lenet.lenet, + 'resnet_v1_50': resnet_v1.resnet_v1_50, + 'resnet_v1_101': resnet_v1.resnet_v1_101, + 'resnet_v1_152': resnet_v1.resnet_v1_152, + 'resnet_v1_200': resnet_v1.resnet_v1_200, + 'resnet_v2_50': resnet_v2.resnet_v2_50, + 'resnet_v2_101': resnet_v2.resnet_v2_101, + 'resnet_v2_152': resnet_v2.resnet_v2_152, + 'resnet_v2_200': resnet_v2.resnet_v2_200, + 'mobilenet_v1': mobilenet_v1.mobilenet_v1, + 'mobilenet_v1_075': mobilenet_v1.mobilenet_v1_075, + 'mobilenet_v1_050': mobilenet_v1.mobilenet_v1_050, + 'mobilenet_v1_025': mobilenet_v1.mobilenet_v1_025, + 'mobilenet_v2': mobilenet_v2.mobilenet, + 'mobilenet_v2_140': mobilenet_v2.mobilenet_v2_140, + 'mobilenet_v2_035': mobilenet_v2.mobilenet_v2_035, + 'mobilenet_v3_small': mobilenet_v3.small, + 'mobilenet_v3_large': mobilenet_v3.large, + 'mobilenet_v3_small_minimalistic': mobilenet_v3.small_minimalistic, + 'mobilenet_v3_large_minimalistic': mobilenet_v3.large_minimalistic, + 'mobilenet_edgetpu': mobilenet_v3.edge_tpu, + 'mobilenet_edgetpu_075': mobilenet_v3.edge_tpu_075, + 'nasnet_cifar': nasnet.build_nasnet_cifar, + 'nasnet_mobile': nasnet.build_nasnet_mobile, + 'nasnet_large': nasnet.build_nasnet_large, + 'pnasnet_large': pnasnet.build_pnasnet_large, + 'pnasnet_mobile': pnasnet.build_pnasnet_mobile, +} + +arg_scopes_map = { + 'alexnet_v2': alexnet.alexnet_v2_arg_scope, + 'cifarnet': cifarnet.cifarnet_arg_scope, + 'overfeat': overfeat.overfeat_arg_scope, + 'vgg_a': vgg.vgg_arg_scope, + 'vgg_16': vgg.vgg_arg_scope, + 'vgg_19': vgg.vgg_arg_scope, + 'inception_v1': inception.inception_v3_arg_scope, + 'inception_v2': inception.inception_v3_arg_scope, + 'inception_v3': inception.inception_v3_arg_scope, + 'inception_v4': inception.inception_v4_arg_scope, + 'inception_resnet_v2': inception.inception_resnet_v2_arg_scope, + 'i3d': i3d.i3d_arg_scope, + 's3dg': s3dg.s3dg_arg_scope, + 'lenet': lenet.lenet_arg_scope, + 'resnet_v1_50': resnet_v1.resnet_arg_scope, + 'resnet_v1_101': resnet_v1.resnet_arg_scope, + 'resnet_v1_152': resnet_v1.resnet_arg_scope, + 'resnet_v1_200': resnet_v1.resnet_arg_scope, + 'resnet_v2_50': resnet_v2.resnet_arg_scope, + 'resnet_v2_101': resnet_v2.resnet_arg_scope, + 'resnet_v2_152': resnet_v2.resnet_arg_scope, + 'resnet_v2_200': resnet_v2.resnet_arg_scope, + 'mobilenet_v1': mobilenet_v1.mobilenet_v1_arg_scope, + 'mobilenet_v1_075': mobilenet_v1.mobilenet_v1_arg_scope, + 'mobilenet_v1_050': mobilenet_v1.mobilenet_v1_arg_scope, + 'mobilenet_v1_025': mobilenet_v1.mobilenet_v1_arg_scope, + 'mobilenet_v2': mobilenet_v2.training_scope, + 'mobilenet_v2_035': mobilenet_v2.training_scope, + 'mobilenet_v2_140': mobilenet_v2.training_scope, + 'mobilenet_v3_small': mobilenet_v3.training_scope, + 'mobilenet_v3_large': mobilenet_v3.training_scope, + 'mobilenet_v3_small_minimalistic': mobilenet_v3.training_scope, + 'mobilenet_v3_large_minimalistic': mobilenet_v3.training_scope, + 'mobilenet_edgetpu': mobilenet_v3.training_scope, + 'mobilenet_edgetpu_075': mobilenet_v3.training_scope, + 'nasnet_cifar': nasnet.nasnet_cifar_arg_scope, + 'nasnet_mobile': nasnet.nasnet_mobile_arg_scope, + 'nasnet_large': nasnet.nasnet_large_arg_scope, + 'pnasnet_large': pnasnet.pnasnet_large_arg_scope, + 'pnasnet_mobile': pnasnet.pnasnet_mobile_arg_scope, +} + + +def get_network_fn(name, num_classes, weight_decay=0.0, is_training=False): + """Returns a network_fn such as `logits, end_points = network_fn(images)`. + + Args: + name: The name of the network. + num_classes: The number of classes to use for classification. If 0 or None, + the logits layer is omitted and its input features are returned instead. + weight_decay: The l2 coefficient for the model weights. + is_training: `True` if the model is being used for training and `False` + otherwise. + + Returns: + network_fn: A function that applies the model to a batch of images. It has + the following signature: + net, end_points = network_fn(images) + The `images` input is a tensor of shape [batch_size, height, width, 3 or + 1] with height = width = network_fn.default_image_size. (The + permissibility and treatment of other sizes depends on the network_fn.) + The returned `end_points` are a dictionary of intermediate activations. + The returned `net` is the topmost layer, depending on `num_classes`: + If `num_classes` was a non-zero integer, `net` is a logits tensor + of shape [batch_size, num_classes]. + If `num_classes` was 0 or `None`, `net` is a tensor with the input + to the logits layer of shape [batch_size, 1, 1, num_features] or + [batch_size, num_features]. Dropout has not been applied to this + (even if the network's original classification does); it remains for + the caller to do this or not. + + Raises: + ValueError: If network `name` is not recognized. + """ + if name not in networks_map: + raise ValueError('Name of network unknown %s' % name) + func = networks_map[name] + @functools.wraps(func) + def network_fn(images, **kwargs): + arg_scope = arg_scopes_map[name](weight_decay=weight_decay) + with slim.arg_scope(arg_scope): + return func(images, num_classes=num_classes, is_training=is_training, + **kwargs) + if hasattr(func, 'default_image_size'): + network_fn.default_image_size = func.default_image_size + + return network_fn diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory_test.py new file mode 100644 index 0000000..3e16fc1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/nets_factory_test.py @@ -0,0 +1,78 @@ +# Copyright 2016 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for slim.inception.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +import tensorflow as tf + +from nets import nets_factory + + +class NetworksTest(tf.test.TestCase): + + def testGetNetworkFnFirstHalf(self): + batch_size = 5 + num_classes = 1000 + for net in list(nets_factory.networks_map.keys())[:10]: + with tf.Graph().as_default() as g, self.test_session(g): + net_fn = nets_factory.get_network_fn(net, num_classes=num_classes) + # Most networks use 224 as their default_image_size + image_size = getattr(net_fn, 'default_image_size', 224) + if net not in ['i3d', 's3dg']: + inputs = tf.random.uniform((batch_size, image_size, image_size, 3)) + logits, end_points = net_fn(inputs) + self.assertTrue(isinstance(logits, tf.Tensor)) + self.assertTrue(isinstance(end_points, dict)) + self.assertEqual(logits.get_shape().as_list()[0], batch_size) + self.assertEqual(logits.get_shape().as_list()[-1], num_classes) + + def testGetNetworkFnSecondHalf(self): + batch_size = 5 + num_classes = 1000 + for net in list(nets_factory.networks_map.keys())[10:]: + with tf.Graph().as_default() as g, self.test_session(g): + net_fn = nets_factory.get_network_fn(net, num_classes=num_classes) + # Most networks use 224 as their default_image_size + image_size = getattr(net_fn, 'default_image_size', 224) + if net not in ['i3d', 's3dg']: + inputs = tf.random.uniform((batch_size, image_size, image_size, 3)) + logits, end_points = net_fn(inputs) + self.assertTrue(isinstance(logits, tf.Tensor)) + self.assertTrue(isinstance(end_points, dict)) + self.assertEqual(logits.get_shape().as_list()[0], batch_size) + self.assertEqual(logits.get_shape().as_list()[-1], num_classes) + + def testGetNetworkFnVideoModels(self): + batch_size = 5 + num_classes = 400 + for net in ['i3d', 's3dg']: + with tf.Graph().as_default() as g, self.test_session(g): + net_fn = nets_factory.get_network_fn(net, num_classes=num_classes) + # Most networks use 224 as their default_image_size + image_size = getattr(net_fn, 'default_image_size', 224) // 2 + inputs = tf.random.uniform((batch_size, 10, image_size, image_size, 3)) + logits, end_points = net_fn(inputs) + self.assertTrue(isinstance(logits, tf.Tensor)) + self.assertTrue(isinstance(end_points, dict)) + self.assertEqual(logits.get_shape().as_list()[0], batch_size) + self.assertEqual(logits.get_shape().as_list()[-1], num_classes) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat.py new file mode 100644 index 0000000..8cd7096 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat.py @@ -0,0 +1,139 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the model definition for the OverFeat network. + +The definition for the network was obtained from: + OverFeat: Integrated Recognition, Localization and Detection using + Convolutional Networks + Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus and + Yann LeCun, 2014 + http://arxiv.org/abs/1312.6229 + +Usage: + with slim.arg_scope(overfeat.overfeat_arg_scope()): + outputs, end_points = overfeat.overfeat(inputs) + +@@overfeat +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) + + +def overfeat_arg_scope(weight_decay=0.0005): + with slim.arg_scope([slim.conv2d, slim.fully_connected], + activation_fn=tf.nn.relu, + weights_regularizer=slim.l2_regularizer(weight_decay), + biases_initializer=tf.compat.v1.zeros_initializer()): + with slim.arg_scope([slim.conv2d], padding='SAME'): + with slim.arg_scope([slim.max_pool2d], padding='VALID') as arg_sc: + return arg_sc + + +def overfeat(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.5, + spatial_squeeze=True, + scope='overfeat', + global_pool=False): + """Contains the model definition for the OverFeat network. + + The definition for the network was obtained from: + OverFeat: Integrated Recognition, Localization and Detection using + Convolutional Networks + Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus and + Yann LeCun, 2014 + http://arxiv.org/abs/1312.6229 + + Note: All the fully_connected layers have been transformed to conv2d layers. + To use in classification mode, resize input to 231x231. To use in fully + convolutional mode, set spatial_squeeze to false. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer is + omitted and the input features to the logits layer are returned instead. + is_training: whether or not the model is being trained. + dropout_keep_prob: the probability that activations are kept in the dropout + layers during training. + spatial_squeeze: whether or not should squeeze the spatial dimensions of the + outputs. Useful to remove unnecessary dimensions for classification. + scope: Optional scope for the variables. + global_pool: Optional boolean flag. If True, the input to the classification + layer is avgpooled to size 1x1, for any input size. (This is not part + of the original OverFeat.) + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the non-dropped-out input to the logits layer (if num_classes is 0 or + None). + end_points: a dict of tensors with intermediate activations. + """ + with tf.compat.v1.variable_scope(scope, 'overfeat', [inputs]) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + # Collect outputs for conv2d, fully_connected and max_pool2d + with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.max_pool2d], + outputs_collections=end_points_collection): + net = slim.conv2d(inputs, 64, [11, 11], 4, padding='VALID', + scope='conv1') + net = slim.max_pool2d(net, [2, 2], scope='pool1') + net = slim.conv2d(net, 256, [5, 5], padding='VALID', scope='conv2') + net = slim.max_pool2d(net, [2, 2], scope='pool2') + net = slim.conv2d(net, 512, [3, 3], scope='conv3') + net = slim.conv2d(net, 1024, [3, 3], scope='conv4') + net = slim.conv2d(net, 1024, [3, 3], scope='conv5') + net = slim.max_pool2d(net, [2, 2], scope='pool5') + + # Use conv2d instead of fully_connected layers. + with slim.arg_scope( + [slim.conv2d], + weights_initializer=trunc_normal(0.005), + biases_initializer=tf.compat.v1.constant_initializer(0.1)): + net = slim.conv2d(net, 3072, [6, 6], padding='VALID', scope='fc6') + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout6') + net = slim.conv2d(net, 4096, [1, 1], scope='fc7') + # Convert end_points_collection into a end_point dict. + end_points = slim.utils.convert_collection_to_dict( + end_points_collection) + if global_pool: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if num_classes: + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout7') + net = slim.conv2d( + net, + num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + biases_initializer=tf.compat.v1.zeros_initializer(), + scope='fc8') + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='fc8/squeezed') + end_points[sc.name + '/fc8'] = net + return net, end_points +overfeat.default_image_size = 231 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat_test.py new file mode 100644 index 0000000..894df8e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/overfeat_test.py @@ -0,0 +1,179 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.overfeat.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import overfeat + +slim = contrib_slim + + +class OverFeatTest(tf.test.TestCase): + + def testBuild(self): + batch_size = 5 + height, width = 231, 231 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = overfeat.overfeat(inputs, num_classes) + self.assertEquals(logits.op.name, 'overfeat/fc8/squeezed') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testFullyConvolutional(self): + batch_size = 1 + height, width = 281, 281 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = overfeat.overfeat(inputs, num_classes, spatial_squeeze=False) + self.assertEquals(logits.op.name, 'overfeat/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 2, 2, num_classes]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 281, 281 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = overfeat.overfeat(inputs, num_classes, spatial_squeeze=False, + global_pool=True) + self.assertEquals(logits.op.name, 'overfeat/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 1, 1, num_classes]) + + def testEndPoints(self): + batch_size = 5 + height, width = 231, 231 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = overfeat.overfeat(inputs, num_classes) + expected_names = ['overfeat/conv1', + 'overfeat/pool1', + 'overfeat/conv2', + 'overfeat/pool2', + 'overfeat/conv3', + 'overfeat/conv4', + 'overfeat/conv5', + 'overfeat/pool5', + 'overfeat/fc6', + 'overfeat/fc7', + 'overfeat/fc8' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + + def testNoClasses(self): + batch_size = 5 + height, width = 231, 231 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = overfeat.overfeat(inputs, num_classes) + expected_names = ['overfeat/conv1', + 'overfeat/pool1', + 'overfeat/conv2', + 'overfeat/pool2', + 'overfeat/conv3', + 'overfeat/conv4', + 'overfeat/conv5', + 'overfeat/pool5', + 'overfeat/fc6', + 'overfeat/fc7' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + self.assertTrue(net.op.name.startswith('overfeat/fc7')) + + def testModelVariables(self): + batch_size = 5 + height, width = 231, 231 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + overfeat.overfeat(inputs, num_classes) + expected_names = ['overfeat/conv1/weights', + 'overfeat/conv1/biases', + 'overfeat/conv2/weights', + 'overfeat/conv2/biases', + 'overfeat/conv3/weights', + 'overfeat/conv3/biases', + 'overfeat/conv4/weights', + 'overfeat/conv4/biases', + 'overfeat/conv5/weights', + 'overfeat/conv5/biases', + 'overfeat/fc6/weights', + 'overfeat/fc6/biases', + 'overfeat/fc7/weights', + 'overfeat/fc7/biases', + 'overfeat/fc8/weights', + 'overfeat/fc8/biases', + ] + model_variables = [v.op.name for v in slim.get_model_variables()] + self.assertSetEqual(set(model_variables), set(expected_names)) + + def testEvaluation(self): + batch_size = 2 + height, width = 231, 231 + num_classes = 1000 + with self.test_session(): + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = overfeat.overfeat(eval_inputs, is_training=False) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + predictions = tf.argmax(input=logits, axis=1) + self.assertListEqual(predictions.get_shape().as_list(), [batch_size]) + + def testTrainEvalWithReuse(self): + train_batch_size = 2 + eval_batch_size = 1 + train_height, train_width = 231, 231 + eval_height, eval_width = 281, 281 + num_classes = 1000 + with self.test_session(): + train_inputs = tf.random.uniform( + (train_batch_size, train_height, train_width, 3)) + logits, _ = overfeat.overfeat(train_inputs) + self.assertListEqual(logits.get_shape().as_list(), + [train_batch_size, num_classes]) + tf.compat.v1.get_variable_scope().reuse_variables() + eval_inputs = tf.random.uniform( + (eval_batch_size, eval_height, eval_width, 3)) + logits, _ = overfeat.overfeat(eval_inputs, is_training=False, + spatial_squeeze=False) + self.assertListEqual(logits.get_shape().as_list(), + [eval_batch_size, 2, 2, num_classes]) + logits = tf.reduce_mean(input_tensor=logits, axis=[1, 2]) + predictions = tf.argmax(input=logits, axis=1) + self.assertEquals(predictions.get_shape().as_list(), [eval_batch_size]) + + def testForward(self): + batch_size = 1 + height, width = 231, 231 + with self.test_session() as sess: + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = overfeat.overfeat(inputs) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits) + self.assertTrue(output.any()) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix.py new file mode 100644 index 0000000..b393d65 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix.py @@ -0,0 +1,297 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= +"""Implementation of the Image-to-Image Translation model. + +This network represents a port of the following work: + + Image-to-Image Translation with Conditional Adversarial Networks + Phillip Isola, Jun-Yan Zhu, Tinghui Zhou and Alexei A. Efros + Arxiv, 2017 + https://phillipi.github.io/pix2pix/ + +A reference implementation written in Lua can be found at: +https://github.com/phillipi/pix2pix/blob/master/models.lua +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import functools + +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers + +layers = contrib_layers + + +def pix2pix_arg_scope(): + """Returns a default argument scope for isola_net. + + Returns: + An arg scope. + """ + # These parameters come from the online port, which don't necessarily match + # those in the paper. + # TODO(nsilberman): confirm these values with Philip. + instance_norm_params = { + 'center': True, + 'scale': True, + 'epsilon': 0.00001, + } + + with contrib_framework.arg_scope( + [layers.conv2d, layers.conv2d_transpose], + normalizer_fn=layers.instance_norm, + normalizer_params=instance_norm_params, + weights_initializer=tf.compat.v1.random_normal_initializer(0, + 0.02)) as sc: + return sc + + +def upsample(net, num_outputs, kernel_size, method='nn_upsample_conv'): + """Upsamples the given inputs. + + Args: + net: A `Tensor` of size [batch_size, height, width, filters]. + num_outputs: The number of output filters. + kernel_size: A list of 2 scalars or a 1x2 `Tensor` indicating the scale, + relative to the inputs, of the output dimensions. For example, if kernel + size is [2, 3], then the output height and width will be twice and three + times the input size. + method: The upsampling method. + + Returns: + An `Tensor` which was upsampled using the specified method. + + Raises: + ValueError: if `method` is not recognized. + """ + net_shape = tf.shape(input=net) + height = net_shape[1] + width = net_shape[2] + + if method == 'nn_upsample_conv': + net = tf.image.resize( + net, [kernel_size[0] * height, kernel_size[1] * width], + method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + net = layers.conv2d(net, num_outputs, [4, 4], activation_fn=None) + elif method == 'conv2d_transpose': + net = layers.conv2d_transpose( + net, num_outputs, [4, 4], stride=kernel_size, activation_fn=None) + else: + raise ValueError('Unknown method: [%s]' % method) + + return net + + +class Block( + collections.namedtuple('Block', ['num_filters', 'decoder_keep_prob'])): + """Represents a single block of encoder and decoder processing. + + The Image-to-Image translation paper works a bit differently than the original + U-Net model. In particular, each block represents a single operation in the + encoder which is concatenated with the corresponding decoder representation. + A dropout layer follows the concatenation and convolution of the concatenated + features. + """ + pass + + +def _default_generator_blocks(): + """Returns the default generator block definitions. + + Returns: + A list of generator blocks. + """ + return [ + Block(64, 0.5), + Block(128, 0.5), + Block(256, 0.5), + Block(512, 0), + Block(512, 0), + Block(512, 0), + Block(512, 0), + ] + + +def pix2pix_generator(net, + num_outputs, + blocks=None, + upsample_method='nn_upsample_conv', + is_training=False): # pylint: disable=unused-argument + """Defines the network architecture. + + Args: + net: A `Tensor` of size [batch, height, width, channels]. Note that the + generator currently requires square inputs (e.g. height=width). + num_outputs: The number of (per-pixel) outputs. + blocks: A list of generator blocks or `None` to use the default generator + definition. + upsample_method: The method of upsampling images, one of 'nn_upsample_conv' + or 'conv2d_transpose' + is_training: Whether or not we're in training or testing mode. + + Returns: + A `Tensor` representing the model output and a dictionary of model end + points. + + Raises: + ValueError: if the input heights do not match their widths. + """ + end_points = {} + + blocks = blocks or _default_generator_blocks() + + input_size = net.get_shape().as_list() + + input_size[3] = num_outputs + + upsample_fn = functools.partial(upsample, method=upsample_method) + + encoder_activations = [] + + ########### + # Encoder # + ########### + with tf.compat.v1.variable_scope('encoder'): + with contrib_framework.arg_scope([layers.conv2d], + kernel_size=[4, 4], + stride=2, + activation_fn=tf.nn.leaky_relu): + + for block_id, block in enumerate(blocks): + # No normalizer for the first encoder layers as per 'Image-to-Image', + # Section 5.1.1 + if block_id == 0: + # First layer doesn't use normalizer_fn + net = layers.conv2d(net, block.num_filters, normalizer_fn=None) + elif block_id < len(blocks) - 1: + net = layers.conv2d(net, block.num_filters) + else: + # Last layer doesn't use activation_fn nor normalizer_fn + net = layers.conv2d( + net, block.num_filters, activation_fn=None, normalizer_fn=None) + + encoder_activations.append(net) + end_points['encoder%d' % block_id] = net + + ########### + # Decoder # + ########### + reversed_blocks = list(blocks) + reversed_blocks.reverse() + + with tf.compat.v1.variable_scope('decoder'): + # Dropout is used at both train and test time as per 'Image-to-Image', + # Section 2.1 (last paragraph). + with contrib_framework.arg_scope([layers.dropout], is_training=True): + + for block_id, block in enumerate(reversed_blocks): + if block_id > 0: + net = tf.concat([net, encoder_activations[-block_id - 1]], axis=3) + + # The Relu comes BEFORE the upsample op: + net = tf.nn.relu(net) + net = upsample_fn(net, block.num_filters, [2, 2]) + if block.decoder_keep_prob > 0: + net = layers.dropout(net, keep_prob=block.decoder_keep_prob) + end_points['decoder%d' % block_id] = net + + with tf.compat.v1.variable_scope('output'): + # Explicitly set the normalizer_fn to None to override any default value + # that may come from an arg_scope, such as pix2pix_arg_scope. + logits = layers.conv2d( + net, num_outputs, [4, 4], activation_fn=None, normalizer_fn=None) + logits = tf.reshape(logits, input_size) + + end_points['logits'] = logits + end_points['predictions'] = tf.tanh(logits) + + return logits, end_points + + +def pix2pix_discriminator(net, num_filters, padding=2, pad_mode='REFLECT', + activation_fn=tf.nn.leaky_relu, is_training=False): + """Creates the Image2Image Translation Discriminator. + + Args: + net: A `Tensor` of size [batch_size, height, width, channels] representing + the input. + num_filters: A list of the filters in the discriminator. The length of the + list determines the number of layers in the discriminator. + padding: Amount of reflection padding applied before each convolution. + pad_mode: mode for tf.pad, one of "CONSTANT", "REFLECT", or "SYMMETRIC". + activation_fn: activation fn for layers.conv2d. + is_training: Whether or not the model is training or testing. + + Returns: + A logits `Tensor` of size [batch_size, N, N, 1] where N is the number of + 'patches' we're attempting to discriminate and a dictionary of model end + points. + """ + del is_training + end_points = {} + + num_layers = len(num_filters) + + def padded(net, scope): + if padding: + with tf.compat.v1.variable_scope(scope): + spatial_pad = tf.constant( + [[0, 0], [padding, padding], [padding, padding], [0, 0]], + dtype=tf.int32) + return tf.pad(tensor=net, paddings=spatial_pad, mode=pad_mode) + else: + return net + + with contrib_framework.arg_scope([layers.conv2d], + kernel_size=[4, 4], + stride=2, + padding='valid', + activation_fn=activation_fn): + + # No normalization on the input layer. + net = layers.conv2d( + padded(net, 'conv0'), num_filters[0], normalizer_fn=None, scope='conv0') + + end_points['conv0'] = net + + for i in range(1, num_layers - 1): + net = layers.conv2d( + padded(net, 'conv%d' % i), num_filters[i], scope='conv%d' % i) + end_points['conv%d' % i] = net + + # Stride 1 on the last layer. + net = layers.conv2d( + padded(net, 'conv%d' % (num_layers - 1)), + num_filters[-1], + stride=1, + scope='conv%d' % (num_layers - 1)) + end_points['conv%d' % (num_layers - 1)] = net + + # 1-dim logits, stride 1, no activation, no normalization. + logits = layers.conv2d( + padded(net, 'conv%d' % num_layers), + 1, + stride=1, + activation_fn=None, + normalizer_fn=None, + scope='conv%d' % num_layers) + end_points['logits'] = logits + end_points['predictions'] = tf.sigmoid(logits) + return logits, end_points diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix_test.py new file mode 100644 index 0000000..d1bfa1b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/pix2pix_test.py @@ -0,0 +1,157 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================= +"""Tests for pix2pix.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from nets import pix2pix + + +class GeneratorTest(tf.test.TestCase): + + def _reduced_default_blocks(self): + """Returns the default blocks, scaled down to make test run faster.""" + return [pix2pix.Block(b.num_filters // 32, b.decoder_keep_prob) + for b in pix2pix._default_generator_blocks()] + + def test_output_size_nn_upsample_conv(self): + batch_size = 2 + height, width = 256, 256 + num_outputs = 4 + + images = tf.ones((batch_size, height, width, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + logits, _ = pix2pix.pix2pix_generator( + images, num_outputs, blocks=self._reduced_default_blocks(), + upsample_method='nn_upsample_conv') + + with self.test_session() as session: + session.run(tf.compat.v1.global_variables_initializer()) + np_outputs = session.run(logits) + self.assertListEqual([batch_size, height, width, num_outputs], + list(np_outputs.shape)) + + def test_output_size_conv2d_transpose(self): + batch_size = 2 + height, width = 256, 256 + num_outputs = 4 + + images = tf.ones((batch_size, height, width, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + logits, _ = pix2pix.pix2pix_generator( + images, num_outputs, blocks=self._reduced_default_blocks(), + upsample_method='conv2d_transpose') + + with self.test_session() as session: + session.run(tf.compat.v1.global_variables_initializer()) + np_outputs = session.run(logits) + self.assertListEqual([batch_size, height, width, num_outputs], + list(np_outputs.shape)) + + def test_block_number_dictates_number_of_layers(self): + batch_size = 2 + height, width = 256, 256 + num_outputs = 4 + + images = tf.ones((batch_size, height, width, 3)) + blocks = [ + pix2pix.Block(64, 0.5), + pix2pix.Block(128, 0), + ] + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + _, end_points = pix2pix.pix2pix_generator( + images, num_outputs, blocks) + + num_encoder_layers = 0 + num_decoder_layers = 0 + for end_point in end_points: + if end_point.startswith('encoder'): + num_encoder_layers += 1 + elif end_point.startswith('decoder'): + num_decoder_layers += 1 + + self.assertEqual(num_encoder_layers, len(blocks)) + self.assertEqual(num_decoder_layers, len(blocks)) + + +class DiscriminatorTest(tf.test.TestCase): + + def _layer_output_size(self, input_size, kernel_size=4, stride=2, pad=2): + return (input_size + pad * 2 - kernel_size) // stride + 1 + + def test_four_layers(self): + batch_size = 2 + input_size = 256 + + output_size = self._layer_output_size(input_size) + output_size = self._layer_output_size(output_size) + output_size = self._layer_output_size(output_size) + output_size = self._layer_output_size(output_size, stride=1) + output_size = self._layer_output_size(output_size, stride=1) + + images = tf.ones((batch_size, input_size, input_size, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + logits, end_points = pix2pix.pix2pix_discriminator( + images, num_filters=[64, 128, 256, 512]) + self.assertListEqual([batch_size, output_size, output_size, 1], + logits.shape.as_list()) + self.assertListEqual([batch_size, output_size, output_size, 1], + end_points['predictions'].shape.as_list()) + + def test_four_layers_no_padding(self): + batch_size = 2 + input_size = 256 + + output_size = self._layer_output_size(input_size, pad=0) + output_size = self._layer_output_size(output_size, pad=0) + output_size = self._layer_output_size(output_size, pad=0) + output_size = self._layer_output_size(output_size, stride=1, pad=0) + output_size = self._layer_output_size(output_size, stride=1, pad=0) + + images = tf.ones((batch_size, input_size, input_size, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + logits, end_points = pix2pix.pix2pix_discriminator( + images, num_filters=[64, 128, 256, 512], padding=0) + self.assertListEqual([batch_size, output_size, output_size, 1], + logits.shape.as_list()) + self.assertListEqual([batch_size, output_size, output_size, 1], + end_points['predictions'].shape.as_list()) + + def test_four_layers_wrog_paddig(self): + batch_size = 2 + input_size = 256 + + images = tf.ones((batch_size, input_size, input_size, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + with self.assertRaises(TypeError): + pix2pix.pix2pix_discriminator( + images, num_filters=[64, 128, 256, 512], padding=1.5) + + def test_four_layers_negative_padding(self): + batch_size = 2 + input_size = 256 + + images = tf.ones((batch_size, input_size, input_size, 3)) + with contrib_framework.arg_scope(pix2pix.pix2pix_arg_scope()): + with self.assertRaises(ValueError): + pix2pix.pix2pix_discriminator( + images, num_filters=[64, 128, 256, 512], padding=-1) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/post_training_quantization.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/post_training_quantization.py new file mode 100644 index 0000000..b2d6e3f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/post_training_quantization.py @@ -0,0 +1,181 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Export quantized tflite model from a trained checkpoint.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +from absl import app +from absl import flags +import tensorflow as tf +import tensorflow_datasets as tfds +from nets import nets_factory +from preprocessing import preprocessing_factory + +flags.DEFINE_string("model_name", None, + "The name of the architecture to quantize.") +flags.DEFINE_string("checkpoint_path", None, "Path to the training checkpoint.") +flags.DEFINE_string("dataset_name", "imagenet2012", + "Name of the dataset to use for quantization calibration.") +flags.DEFINE_string("dataset_dir", None, "Dataset location.") +flags.DEFINE_string( + "dataset_split", "train", + "The dataset split (train, validation etc.) to use for calibration.") +flags.DEFINE_string("output_tflite", None, "Path to output tflite file.") +flags.DEFINE_boolean( + "use_model_specific_preprocessing", False, + "When true, uses the preprocessing corresponding to the model as specified " + "in preprocessing factory.") +flags.DEFINE_boolean("enable_ema", True, + "Load exponential moving average version of variables.") +flags.DEFINE_integer( + "num_steps", 1000, + "Number of post-training quantization calibration steps to run.") +flags.DEFINE_integer("image_size", 224, "Size of the input image.") +flags.DEFINE_integer("num_classes", 1001, + "Number of output classes for the model.") + +FLAGS = flags.FLAGS + +# Mean and standard deviation used for normalizing the image tensor. +_MEAN_RGB = 127.5 +_STD_RGB = 127.5 + + +def _preprocess_for_quantization(image_data, image_size, crop_padding=32): + """Crops to center of image with padding then scales, normalizes image_size. + + Args: + image_data: A 3D Tensor representing the RGB image data. Image can be of + arbitrary height and width. + image_size: image height/width dimension. + crop_padding: the padding size to use when centering the crop. + + Returns: + A decoded and cropped image Tensor. Image is normalized to [-1,1]. + + """ + + shape = tf.shape(image_data) + image_height = shape[0] + image_width = shape[1] + + padded_center_crop_size = tf.cast( + (image_size * 1.0 / (image_size + crop_padding)) * + tf.cast(tf.minimum(image_height, image_width), tf.float32), tf.int32) + + offset_height = ((image_height - padded_center_crop_size) + 1) // 2 + offset_width = ((image_width - padded_center_crop_size) + 1) // 2 + + image = tf.image.crop_to_bounding_box( + image_data, + offset_height=offset_height, + offset_width=offset_width, + target_height=padded_center_crop_size, + target_width=padded_center_crop_size) + + image = tf.image.resize([image], [image_size, image_size], + method=tf.image.ResizeMethod.BICUBIC)[0] + image = tf.cast(image, tf.float32) + image -= tf.constant(_MEAN_RGB) + image /= tf.constant(_STD_RGB) + return image + + +def restore_model(sess, checkpoint_path, enable_ema=True): + """Restore variables from the checkpoint into the provided session. + + Args: + sess: A tensorflow session where the checkpoint will be loaded. + checkpoint_path: Path to the trained checkpoint. + enable_ema: (optional) Whether to load the exponential moving average (ema) + version of the tensorflow variables. Defaults to True. + """ + if enable_ema: + ema = tf.train.ExponentialMovingAverage(decay=0.0) + ema_vars = tf.trainable_variables() + tf.get_collection("moving_vars") + for v in tf.global_variables(): + if "moving_mean" in v.name or "moving_variance" in v.name: + ema_vars.append(v) + ema_vars = list(set(ema_vars)) + var_dict = ema.variables_to_restore(ema_vars) + else: + var_dict = None + + sess.run(tf.global_variables_initializer()) + saver = tf.train.Saver(var_dict, max_to_keep=1) + saver.restore(sess, checkpoint_path) + + +def _representative_dataset_gen(): + """Gets a python generator of numpy arrays for the given dataset.""" + image_size = FLAGS.image_size + dataset = tfds.builder(FLAGS.dataset_name, data_dir=FLAGS.dataset_dir) + dataset.download_and_prepare() + data = dataset.as_dataset()[FLAGS.dataset_split] + iterator = tf.compat.v1.data.make_one_shot_iterator(data) + if FLAGS.use_model_specific_preprocessing: + preprocess_fn = functools.partial( + preprocessing_factory.get_preprocessing(name=FLAGS.model_name), + output_height=image_size, + output_width=image_size) + else: + preprocess_fn = functools.partial( + _preprocess_for_quantization, image_size=image_size) + features = iterator.get_next() + image = features["image"] + image = preprocess_fn(image) + image = tf.reshape(image, [1, image_size, image_size, 3]) + for _ in range(FLAGS.num_steps): + yield [image.eval()] + + +def main(_): + with tf.Graph().as_default(), tf.Session() as sess: + network_fn = nets_factory.get_network_fn( + FLAGS.model_name, num_classes=FLAGS.num_classes, is_training=False) + image_size = FLAGS.image_size + images = tf.placeholder( + tf.float32, shape=(1, image_size, image_size, 3), name="images") + + logits, _ = network_fn(images) + + output_tensor = tf.nn.softmax(logits) + restore_model(sess, FLAGS.checkpoint_path, enable_ema=FLAGS.enable_ema) + + converter = tf.lite.TFLiteConverter.from_session(sess, [images], + [output_tensor]) + + converter.representative_dataset = tf.lite.RepresentativeDataset( + _representative_dataset_gen) + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.inference_input_type = tf.int8 + converter.inference_output_type = tf.int8 + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] + + tflite_buffer = converter.convert() + with tf.gfile.GFile(FLAGS.output_tflite, "wb") as output_tflite: + output_tflite.write(tflite_buffer) + print("tflite model written to %s" % FLAGS.output_tflite) + + +if __name__ == "__main__": + flags.mark_flag_as_required("model_name") + flags.mark_flag_as_required("checkpoint_path") + flags.mark_flag_as_required("dataset_dir") + flags.mark_flag_as_required("output_tflite") + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_utils.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_utils.py new file mode 100644 index 0000000..3230e28 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_utils.py @@ -0,0 +1,278 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains building blocks for various versions of Residual Networks. + +Residual networks (ResNets) were proposed in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015 + +More variants were introduced in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027, 2016 + +We can obtain different ResNet variants by changing the network depth, width, +and form of residual unit. This module implements the infrastructure for +building them. Concrete ResNet units and full ResNet networks are implemented in +the accompanying resnet_v1.py and resnet_v2.py modules. + +Compared to https://github.com/KaimingHe/deep-residual-networks, in the current +implementation we subsample the output activations in the last residual unit of +each block, instead of subsampling the input activations in the first residual +unit of each block. The two implementations give identical results but our +implementation is more memory efficient. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +class Block(collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])): + """A named tuple describing a ResNet block. + + Its parts are: + scope: The scope of the `Block`. + unit_fn: The ResNet unit function which takes as input a `Tensor` and + returns another `Tensor` with the output of the ResNet unit. + args: A list of length equal to the number of units in the `Block`. The list + contains one (depth, depth_bottleneck, stride) tuple for each unit in the + block to serve as argument to unit_fn. + """ + + +def subsample(inputs, factor, scope=None): + """Subsamples the input along the spatial dimensions. + + Args: + inputs: A `Tensor` of size [batch, height_in, width_in, channels]. + factor: The subsampling factor. + scope: Optional variable_scope. + + Returns: + output: A `Tensor` of size [batch, height_out, width_out, channels] with the + input, either intact (if factor == 1) or subsampled (if factor > 1). + """ + if factor == 1: + return inputs + else: + return slim.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) + + +def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None): + """Strided 2-D convolution with 'SAME' padding. + + When stride > 1, then we do explicit zero-padding, followed by conv2d with + 'VALID' padding. + + Note that + + net = conv2d_same(inputs, num_outputs, 3, stride=stride) + + is equivalent to + + net = slim.conv2d(inputs, num_outputs, 3, stride=1, padding='SAME') + net = subsample(net, factor=stride) + + whereas + + net = slim.conv2d(inputs, num_outputs, 3, stride=stride, padding='SAME') + + is different when the input's height or width is even, which is why we add the + current function. For more details, see ResnetUtilsTest.testConv2DSameEven(). + + Args: + inputs: A 4-D tensor of size [batch, height_in, width_in, channels]. + num_outputs: An integer, the number of output filters. + kernel_size: An int with the kernel_size of the filters. + stride: An integer, the output stride. + rate: An integer, rate for atrous convolution. + scope: Scope. + + Returns: + output: A 4-D tensor of size [batch, height_out, width_out, channels] with + the convolution output. + """ + if stride == 1: + return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, rate=rate, + padding='SAME', scope=scope) + else: + kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1) + pad_total = kernel_size_effective - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride, + rate=rate, padding='VALID', scope=scope) + + +@slim.add_arg_scope +def stack_blocks_dense(net, blocks, output_stride=None, + store_non_strided_activations=False, + outputs_collections=None): + """Stacks ResNet `Blocks` and controls output feature density. + + First, this function creates scopes for the ResNet in the form of + 'block_name/unit_1', 'block_name/unit_2', etc. + + Second, this function allows the user to explicitly control the ResNet + output_stride, which is the ratio of the input to output spatial resolution. + This is useful for dense prediction tasks such as semantic segmentation or + object detection. + + Most ResNets consist of 4 ResNet blocks and subsample the activations by a + factor of 2 when transitioning between consecutive ResNet blocks. This results + to a nominal ResNet output_stride equal to 8. If we set the output_stride to + half the nominal network stride (e.g., output_stride=4), then we compute + responses twice. + + Control of the output feature density is implemented by atrous convolution. + + Args: + net: A `Tensor` of size [batch, height, width, channels]. + blocks: A list of length equal to the number of ResNet `Blocks`. Each + element is a ResNet `Block` object describing the units in the `Block`. + output_stride: If `None`, then the output will be computed at the nominal + network stride. If output_stride is not `None`, it specifies the requested + ratio of input to output spatial resolution, which needs to be equal to + the product of unit strides from the start up to some level of the ResNet. + For example, if the ResNet employs units with strides 1, 2, 1, 3, 4, 1, + then valid values for the output_stride are 1, 2, 6, 24 or None (which + is equivalent to output_stride=24). + store_non_strided_activations: If True, we compute non-strided (undecimated) + activations at the last unit of each block and store them in the + `outputs_collections` before subsampling them. This gives us access to + higher resolution intermediate activations which are useful in some + dense prediction problems but increases 4x the computation and memory cost + at the last unit of each block. + outputs_collections: Collection to add the ResNet block outputs. + + Returns: + net: Output tensor with stride equal to the specified output_stride. + + Raises: + ValueError: If the target output_stride is not valid. + """ + # The current_stride variable keeps track of the effective stride of the + # activations. This allows us to invoke atrous convolution whenever applying + # the next residual unit would result in the activations having stride larger + # than the target output_stride. + current_stride = 1 + + # The atrous convolution rate parameter. + rate = 1 + + for block in blocks: + with tf.compat.v1.variable_scope(block.scope, 'block', [net]) as sc: + block_stride = 1 + for i, unit in enumerate(block.args): + if store_non_strided_activations and i == len(block.args) - 1: + # Move stride from the block's last unit to the end of the block. + block_stride = unit.get('stride', 1) + unit = dict(unit, stride=1) + + with tf.compat.v1.variable_scope('unit_%d' % (i + 1), values=[net]): + # If we have reached the target output_stride, then we need to employ + # atrous convolution with stride=1 and multiply the atrous rate by the + # current unit's stride for use in subsequent layers. + if output_stride is not None and current_stride == output_stride: + net = block.unit_fn(net, rate=rate, **dict(unit, stride=1)) + rate *= unit.get('stride', 1) + + else: + net = block.unit_fn(net, rate=1, **unit) + current_stride *= unit.get('stride', 1) + if output_stride is not None and current_stride > output_stride: + raise ValueError('The target output_stride cannot be reached.') + + # Collect activations at the block's end before performing subsampling. + net = slim.utils.collect_named_outputs(outputs_collections, sc.name, net) + + # Subsampling of the block's output activations. + if output_stride is not None and current_stride == output_stride: + rate *= block_stride + else: + net = subsample(net, block_stride) + current_stride *= block_stride + if output_stride is not None and current_stride > output_stride: + raise ValueError('The target output_stride cannot be reached.') + + if output_stride is not None and current_stride != output_stride: + raise ValueError('The target output_stride cannot be reached.') + + return net + + +def resnet_arg_scope( + weight_decay=0.0001, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True, + activation_fn=tf.nn.relu, + use_batch_norm=True, + batch_norm_updates_collections=tf.compat.v1.GraphKeys.UPDATE_OPS): + """Defines the default ResNet arg scope. + + TODO(gpapan): The batch-normalization related default values above are + appropriate for use in conjunction with the reference ResNet models + released at https://github.com/KaimingHe/deep-residual-networks. When + training ResNets from scratch, they might need to be tuned. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: The moving average decay when estimating layer activation + statistics in batch normalization. + batch_norm_epsilon: Small constant to prevent division by zero when + normalizing activations by their variance in batch normalization. + batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the + activations in the batch normalization layer. + activation_fn: The activation function which is used in ResNet. + use_batch_norm: Whether or not to use batch normalization. + batch_norm_updates_collections: Collection for the update ops for + batch norm. + + Returns: + An `arg_scope` to use for the resnet models. + """ + batch_norm_params = { + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': batch_norm_updates_collections, + 'fused': None, # Use fused batch norm if possible. + } + + with slim.arg_scope( + [slim.conv2d], + weights_regularizer=slim.l2_regularizer(weight_decay), + weights_initializer=slim.variance_scaling_initializer(), + activation_fn=activation_fn, + normalizer_fn=slim.batch_norm if use_batch_norm else None, + normalizer_params=batch_norm_params): + with slim.arg_scope([slim.batch_norm], **batch_norm_params): + # The following implies padding='SAME' for pool1, which makes feature + # alignment easier for dense prediction tasks. This is also used in + # https://github.com/facebook/fb.resnet.torch. However the accompanying + # code of 'Deep Residual Learning for Image Recognition' uses + # padding='VALID' for pool1. You can switch to that choice by setting + # slim.arg_scope([slim.max_pool2d], padding='VALID'). + with slim.arg_scope([slim.max_pool2d], padding='SAME') as arg_sc: + return arg_sc diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1.py new file mode 100644 index 0000000..8451f46 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1.py @@ -0,0 +1,406 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for the original form of Residual Networks. + +The 'v1' residual networks (ResNets) implemented in this module were proposed +by: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +Other variants were introduced in: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The networks defined in this module utilize the bottleneck building block of +[1] with projection shortcuts only for increasing depths. They employ batch +normalization *after* every weight layer. This is the architecture used by +MSRA in the Imagenet and MSCOCO 2016 competition models ResNet-101 and +ResNet-152. See [2; Fig. 1a] for a comparison between the current 'v1' +architecture and the alternative 'v2' architecture of [2] which uses batch +normalization *before* every weight layer in the so-called full pre-activation +units. + +Typical use: + + from tensorflow.contrib.slim.nets import resnet_v1 + +ResNet-101 for image classification into 1000 classes: + + # inputs has shape [batch, 224, 224, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope()): + net, end_points = resnet_v1.resnet_v1_101(inputs, 1000, is_training=False) + +ResNet-101 for semantic segmentation into 21 classes: + + # inputs has shape [batch, 513, 513, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope()): + net, end_points = resnet_v1.resnet_v1_101(inputs, + 21, + is_training=False, + global_pool=False, + output_stride=16) +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import resnet_utils + + +resnet_arg_scope = resnet_utils.resnet_arg_scope +slim = contrib_slim + + +class NoOpScope(object): + """No-op context manager.""" + + def __enter__(self): + return None + + def __exit__(self, exc_type, exc_value, traceback): + return False + + +@slim.add_arg_scope +def bottleneck(inputs, + depth, + depth_bottleneck, + stride, + rate=1, + outputs_collections=None, + scope=None, + use_bounded_activations=False): + """Bottleneck residual unit variant with BN after convolutions. + + This is the original residual unit proposed in [1]. See Fig. 1(a) of [2] for + its definition. Note that we use here the bottleneck variant which has an + extra bottleneck layer. + + When putting together two consecutive ResNet blocks that use this unit, one + should use stride = 2 in the last unit of the first block. + + Args: + inputs: A tensor of size [batch, height, width, channels]. + depth: The depth of the ResNet unit output. + depth_bottleneck: The depth of the bottleneck layers. + stride: The ResNet unit's stride. Determines the amount of downsampling of + the units output compared to its input. + rate: An integer, rate for atrous convolution. + outputs_collections: Collection to add the ResNet unit output. + scope: Optional variable_scope. + use_bounded_activations: Whether or not to use bounded activations. Bounded + activations better lend themselves to quantized inference. + + Returns: + The ResNet unit's output. + """ + with tf.compat.v1.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: + depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank=4) + if depth == depth_in: + shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') + else: + shortcut = slim.conv2d( + inputs, + depth, [1, 1], + stride=stride, + activation_fn=tf.nn.relu6 if use_bounded_activations else None, + scope='shortcut') + + residual = slim.conv2d(inputs, depth_bottleneck, [1, 1], stride=1, + scope='conv1') + residual = resnet_utils.conv2d_same(residual, depth_bottleneck, 3, stride, + rate=rate, scope='conv2') + residual = slim.conv2d(residual, depth, [1, 1], stride=1, + activation_fn=None, scope='conv3') + + if use_bounded_activations: + # Use clip_by_value to simulate bandpass activation. + residual = tf.clip_by_value(residual, -6.0, 6.0) + output = tf.nn.relu6(shortcut + residual) + else: + output = tf.nn.relu(shortcut + residual) + + return slim.utils.collect_named_outputs(outputs_collections, + sc.name, + output) + + +def resnet_v1(inputs, + blocks, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + include_root_block=True, + spatial_squeeze=True, + store_non_strided_activations=False, + reuse=None, + scope=None): + """Generator for v1 ResNet models. + + This function generates a family of ResNet v1 models. See the resnet_v1_*() + methods for specific model instantiations, obtained by selecting different + block instantiations that produce ResNets of various depths. + + Training for image classification on Imagenet is usually done with [224, 224] + inputs, resulting in [7, 7] feature maps at the output of the last ResNet + block for the ResNets defined in [1] that have nominal stride equal to 32. + However, for dense prediction tasks we advise that one uses inputs with + spatial dimensions that are multiples of 32 plus 1, e.g., [321, 321]. In + this case the feature maps at the ResNet output will have spatial shape + [(height - 1) / output_stride + 1, (width - 1) / output_stride + 1] + and corners exactly aligned with the input image corners, which greatly + facilitates alignment of the features to the image. Using as input [225, 225] + images results in [8, 8] feature maps at the output of the last ResNet block. + + For dense prediction tasks, the ResNet needs to run in fully-convolutional + (FCN) mode and global_pool needs to be set to False. The ResNets in [1, 2] all + have nominal stride equal to 32 and a good choice in FCN mode is to use + output_stride=16 in order to increase the density of the computed features at + small computational and memory overhead, cf. http://arxiv.org/abs/1606.00915. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + blocks: A list of length equal to the number of ResNet blocks. Each element + is a resnet_utils.Block object describing the units in the block. + num_classes: Number of predicted classes for classification tasks. + If 0 or None, we return the features before the logit layer. + is_training: whether batch_norm layers are in training mode. If this is set + to None, the callers can specify slim.batch_norm's is_training parameter + from an outer slim.arg_scope. + global_pool: If True, we perform global average pooling before computing the + logits. Set to True for image classification, False for dense prediction. + output_stride: If None, then the output will be computed at the nominal + network stride. If output_stride is not None, it specifies the requested + ratio of input to output spatial resolution. + include_root_block: If True, include the initial convolution followed by + max-pooling, if False excludes it. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + To use this parameter, the input images must be smaller than 300x300 + pixels, in which case the output logit layer does not contain spatial + information and can be removed. + store_non_strided_activations: If True, we compute non-strided (undecimated) + activations at the last unit of each block and store them in the + `outputs_collections` before subsampling them. This gives us access to + higher resolution intermediate activations which are useful in some + dense prediction problems but increases 4x the computation and memory cost + at the last unit of each block. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + + Returns: + net: A rank-4 tensor of size [batch, height_out, width_out, channels_out]. + If global_pool is False, then height_out and width_out are reduced by a + factor of output_stride compared to the respective height_in and width_in, + else both height_out and width_out equal one. If num_classes is 0 or None, + then net is the output of the last ResNet block, potentially after global + average pooling. If num_classes a non-zero integer, net contains the + pre-softmax activations. + end_points: A dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: If the target output_stride is not valid. + """ + with tf.compat.v1.variable_scope( + scope, 'resnet_v1', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + with slim.arg_scope([slim.conv2d, bottleneck, + resnet_utils.stack_blocks_dense], + outputs_collections=end_points_collection): + with (slim.arg_scope([slim.batch_norm], is_training=is_training) + if is_training is not None else NoOpScope()): + net = inputs + if include_root_block: + if output_stride is not None: + if output_stride % 4 != 0: + raise ValueError('The output_stride needs to be a multiple of 4.') + output_stride /= 4 + net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') + net = slim.max_pool2d(net, [3, 3], stride=2, scope='pool1') + net = resnet_utils.stack_blocks_dense(net, blocks, output_stride, + store_non_strided_activations) + # Convert end_points_collection into a dictionary of end_points. + end_points = slim.utils.convert_collection_to_dict( + end_points_collection) + + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], name='pool5', keepdims=True) + end_points['global_pool'] = net + if num_classes: + net = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='logits') + end_points[sc.name + '/logits'] = net + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='SpatialSqueeze') + end_points[sc.name + '/spatial_squeeze'] = net + end_points['predictions'] = slim.softmax(net, scope='predictions') + return net, end_points +resnet_v1.default_image_size = 224 + + +def resnet_v1_block(scope, base_depth, num_units, stride): + """Helper function for creating a resnet_v1 bottleneck block. + + Args: + scope: The scope of the block. + base_depth: The depth of the bottleneck layer for each unit. + num_units: The number of units in the block. + stride: The stride of the block, implemented as a stride in the last unit. + All other units have stride=1. + + Returns: + A resnet_v1 bottleneck block. + """ + return resnet_utils.Block(scope, bottleneck, [{ + 'depth': base_depth * 4, + 'depth_bottleneck': base_depth, + 'stride': 1 + }] * (num_units - 1) + [{ + 'depth': base_depth * 4, + 'depth_bottleneck': base_depth, + 'stride': stride + }]) + + +def resnet_v1_50(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + store_non_strided_activations=False, + min_base_depth=8, + depth_multiplier=1, + reuse=None, + scope='resnet_v1_50'): + """ResNet-50 model of [1]. See resnet_v1() for arg and return description.""" + depth_func = lambda d: max(int(d * depth_multiplier), min_base_depth) + blocks = [ + resnet_v1_block('block1', base_depth=depth_func(64), num_units=3, + stride=2), + resnet_v1_block('block2', base_depth=depth_func(128), num_units=4, + stride=2), + resnet_v1_block('block3', base_depth=depth_func(256), num_units=6, + stride=2), + resnet_v1_block('block4', base_depth=depth_func(512), num_units=3, + stride=1), + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + store_non_strided_activations=store_non_strided_activations, + reuse=reuse, scope=scope) +resnet_v1_50.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_101(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + store_non_strided_activations=False, + min_base_depth=8, + depth_multiplier=1, + reuse=None, + scope='resnet_v1_101'): + """ResNet-101 model of [1]. See resnet_v1() for arg and return description.""" + depth_func = lambda d: max(int(d * depth_multiplier), min_base_depth) + blocks = [ + resnet_v1_block('block1', base_depth=depth_func(64), num_units=3, + stride=2), + resnet_v1_block('block2', base_depth=depth_func(128), num_units=4, + stride=2), + resnet_v1_block('block3', base_depth=depth_func(256), num_units=23, + stride=2), + resnet_v1_block('block4', base_depth=depth_func(512), num_units=3, + stride=1), + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + store_non_strided_activations=store_non_strided_activations, + reuse=reuse, scope=scope) +resnet_v1_101.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_152(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + store_non_strided_activations=False, + spatial_squeeze=True, + min_base_depth=8, + depth_multiplier=1, + reuse=None, + scope='resnet_v1_152'): + """ResNet-152 model of [1]. See resnet_v1() for arg and return description.""" + depth_func = lambda d: max(int(d * depth_multiplier), min_base_depth) + blocks = [ + resnet_v1_block('block1', base_depth=depth_func(64), num_units=3, + stride=2), + resnet_v1_block('block2', base_depth=depth_func(128), num_units=8, + stride=2), + resnet_v1_block('block3', base_depth=depth_func(256), num_units=36, + stride=2), + resnet_v1_block('block4', base_depth=depth_func(512), num_units=3, + stride=1), + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + store_non_strided_activations=store_non_strided_activations, + reuse=reuse, scope=scope) +resnet_v1_152.default_image_size = resnet_v1.default_image_size + + +def resnet_v1_200(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + store_non_strided_activations=False, + spatial_squeeze=True, + min_base_depth=8, + depth_multiplier=1, + reuse=None, + scope='resnet_v1_200'): + """ResNet-200 model of [2]. See resnet_v1() for arg and return description.""" + depth_func = lambda d: max(int(d * depth_multiplier), min_base_depth) + blocks = [ + resnet_v1_block('block1', base_depth=depth_func(64), num_units=3, + stride=2), + resnet_v1_block('block2', base_depth=depth_func(128), num_units=24, + stride=2), + resnet_v1_block('block3', base_depth=depth_func(256), num_units=36, + stride=2), + resnet_v1_block('block4', base_depth=depth_func(512), num_units=3, + stride=1), + ] + return resnet_v1(inputs, blocks, num_classes, is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + store_non_strided_activations=store_non_strided_activations, + reuse=reuse, scope=scope) +resnet_v1_200.default_image_size = resnet_v1.default_image_size diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1_test.py new file mode 100644 index 0000000..fb70a5a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v1_test.py @@ -0,0 +1,630 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.resnet_v1.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import resnet_utils +from nets import resnet_v1 + +slim = contrib_slim + +tf.compat.v1.disable_resource_variables() + + +def create_test_input(batch_size, height, width, channels): + """Create test input tensor. + + Args: + batch_size: The number of images per batch or `None` if unknown. + height: The height of each image or `None` if unknown. + width: The width of each image or `None` if unknown. + channels: The number of channels per image or `None` if unknown. + + Returns: + Either a placeholder `Tensor` of dimension + [batch_size, height, width, channels] if any of the inputs are `None` or a + constant `Tensor` with the mesh grid values along the spatial dimensions. + """ + if None in [batch_size, height, width, channels]: + return tf.compat.v1.placeholder(tf.float32, + (batch_size, height, width, channels)) + else: + return tf.cast( + np.tile( + np.reshape( + np.reshape(np.arange(height), [height, 1]) + + np.reshape(np.arange(width), [1, width]), + [1, height, width, 1]), [batch_size, 1, 1, channels]), + dtype=tf.float32) + + +class ResnetUtilsTest(tf.test.TestCase): + + def testSubsampleThreeByThree(self): + x = tf.reshape(tf.cast(tf.range(9), dtype=tf.float32), [1, 3, 3, 1]) + x = resnet_utils.subsample(x, 2) + expected = tf.reshape(tf.constant([0, 2, 6, 8]), [1, 2, 2, 1]) + with self.test_session(): + self.assertAllClose(x.eval(), expected.eval()) + + def testSubsampleFourByFour(self): + x = tf.reshape(tf.cast(tf.range(16), dtype=tf.float32), [1, 4, 4, 1]) + x = resnet_utils.subsample(x, 2) + expected = tf.reshape(tf.constant([0, 2, 8, 10]), [1, 2, 2, 1]) + with self.test_session(): + self.assertAllClose(x.eval(), expected.eval()) + + def testConv2DSameEven(self): + n, n2 = 4, 2 + + # Input image. + x = create_test_input(1, n, n, 1) + + # Convolution kernel. + w = create_test_input(1, 3, 3, 1) + w = tf.reshape(w, [3, 3, 1, 1]) + + tf.compat.v1.get_variable('Conv/weights', initializer=w) + tf.compat.v1.get_variable('Conv/biases', initializer=tf.zeros([1])) + tf.compat.v1.get_variable_scope().reuse_variables() + + y1 = slim.conv2d(x, 1, [3, 3], stride=1, scope='Conv') + y1_expected = tf.cast([[14, 28, 43, 26], [28, 48, 66, 37], [43, 66, 84, 46], + [26, 37, 46, 22]], + dtype=tf.float32) + y1_expected = tf.reshape(y1_expected, [1, n, n, 1]) + + y2 = resnet_utils.subsample(y1, 2) + y2_expected = tf.cast([[14, 43], [43, 84]], dtype=tf.float32) + y2_expected = tf.reshape(y2_expected, [1, n2, n2, 1]) + + y3 = resnet_utils.conv2d_same(x, 1, 3, stride=2, scope='Conv') + y3_expected = y2_expected + + y4 = slim.conv2d(x, 1, [3, 3], stride=2, scope='Conv') + y4_expected = tf.cast([[48, 37], [37, 22]], dtype=tf.float32) + y4_expected = tf.reshape(y4_expected, [1, n2, n2, 1]) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(y1.eval(), y1_expected.eval()) + self.assertAllClose(y2.eval(), y2_expected.eval()) + self.assertAllClose(y3.eval(), y3_expected.eval()) + self.assertAllClose(y4.eval(), y4_expected.eval()) + + def testConv2DSameOdd(self): + n, n2 = 5, 3 + + # Input image. + x = create_test_input(1, n, n, 1) + + # Convolution kernel. + w = create_test_input(1, 3, 3, 1) + w = tf.reshape(w, [3, 3, 1, 1]) + + tf.compat.v1.get_variable('Conv/weights', initializer=w) + tf.compat.v1.get_variable('Conv/biases', initializer=tf.zeros([1])) + tf.compat.v1.get_variable_scope().reuse_variables() + + y1 = slim.conv2d(x, 1, [3, 3], stride=1, scope='Conv') + y1_expected = tf.cast( + [[14, 28, 43, 58, 34], [28, 48, 66, 84, 46], [43, 66, 84, 102, 55], + [58, 84, 102, 120, 64], [34, 46, 55, 64, 30]], + dtype=tf.float32) + y1_expected = tf.reshape(y1_expected, [1, n, n, 1]) + + y2 = resnet_utils.subsample(y1, 2) + y2_expected = tf.cast([[14, 43, 34], [43, 84, 55], [34, 55, 30]], + dtype=tf.float32) + y2_expected = tf.reshape(y2_expected, [1, n2, n2, 1]) + + y3 = resnet_utils.conv2d_same(x, 1, 3, stride=2, scope='Conv') + y3_expected = y2_expected + + y4 = slim.conv2d(x, 1, [3, 3], stride=2, scope='Conv') + y4_expected = y2_expected + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(y1.eval(), y1_expected.eval()) + self.assertAllClose(y2.eval(), y2_expected.eval()) + self.assertAllClose(y3.eval(), y3_expected.eval()) + self.assertAllClose(y4.eval(), y4_expected.eval()) + + def _resnet_plain(self, inputs, blocks, output_stride=None, scope=None): + """A plain ResNet without extra layers before or after the ResNet blocks.""" + with tf.compat.v1.variable_scope(scope, values=[inputs]): + with slim.arg_scope([slim.conv2d], outputs_collections='end_points'): + net = resnet_utils.stack_blocks_dense(inputs, blocks, output_stride) + end_points = slim.utils.convert_collection_to_dict('end_points') + return net, end_points + + def testEndPointsV1(self): + """Test the end points of a tiny v1 bottleneck network.""" + blocks = [ + resnet_v1.resnet_v1_block( + 'block1', base_depth=1, num_units=2, stride=2), + resnet_v1.resnet_v1_block( + 'block2', base_depth=2, num_units=2, stride=1), + ] + inputs = create_test_input(2, 32, 16, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_plain(inputs, blocks, scope='tiny') + expected = [ + 'tiny/block1/unit_1/bottleneck_v1/shortcut', + 'tiny/block1/unit_1/bottleneck_v1/conv1', + 'tiny/block1/unit_1/bottleneck_v1/conv2', + 'tiny/block1/unit_1/bottleneck_v1/conv3', + 'tiny/block1/unit_2/bottleneck_v1/conv1', + 'tiny/block1/unit_2/bottleneck_v1/conv2', + 'tiny/block1/unit_2/bottleneck_v1/conv3', + 'tiny/block2/unit_1/bottleneck_v1/shortcut', + 'tiny/block2/unit_1/bottleneck_v1/conv1', + 'tiny/block2/unit_1/bottleneck_v1/conv2', + 'tiny/block2/unit_1/bottleneck_v1/conv3', + 'tiny/block2/unit_2/bottleneck_v1/conv1', + 'tiny/block2/unit_2/bottleneck_v1/conv2', + 'tiny/block2/unit_2/bottleneck_v1/conv3'] + self.assertItemsEqual(expected, end_points.keys()) + + def _stack_blocks_nondense(self, net, blocks): + """A simplified ResNet Block stacker without output stride control.""" + for block in blocks: + with tf.compat.v1.variable_scope(block.scope, 'block', [net]): + for i, unit in enumerate(block.args): + with tf.compat.v1.variable_scope('unit_%d' % (i + 1), values=[net]): + net = block.unit_fn(net, rate=1, **unit) + return net + + def testAtrousValuesBottleneck(self): + """Verify the values of dense feature extraction by atrous convolution. + + Make sure that dense feature extraction by stack_blocks_dense() followed by + subsampling gives identical results to feature extraction at the nominal + network output stride using the simple self._stack_blocks_nondense() above. + """ + block = resnet_v1.resnet_v1_block + blocks = [ + block('block1', base_depth=1, num_units=2, stride=2), + block('block2', base_depth=2, num_units=2, stride=2), + block('block3', base_depth=4, num_units=2, stride=2), + block('block4', base_depth=8, num_units=2, stride=1), + ] + nominal_stride = 8 + + # Test both odd and even input dimensions. + height = 30 + width = 31 + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + with slim.arg_scope([slim.batch_norm], is_training=False): + for output_stride in [1, 2, 4, 8, None]: + with tf.Graph().as_default(): + with self.test_session() as sess: + tf.compat.v1.set_random_seed(0) + inputs = create_test_input(1, height, width, 3) + # Dense feature extraction followed by subsampling. + output = resnet_utils.stack_blocks_dense(inputs, + blocks, + output_stride) + if output_stride is None: + factor = 1 + else: + factor = nominal_stride // output_stride + + output = resnet_utils.subsample(output, factor) + # Make the two networks use the same weights. + tf.compat.v1.get_variable_scope().reuse_variables() + # Feature extraction at the nominal network rate. + expected = self._stack_blocks_nondense(inputs, blocks) + sess.run(tf.compat.v1.global_variables_initializer()) + output, expected = sess.run([output, expected]) + self.assertAllClose(output, expected, atol=1e-4, rtol=1e-4) + + def testStridingLastUnitVsSubsampleBlockEnd(self): + """Compares subsampling at the block's last unit or block's end. + + Makes sure that the final output is the same when we use a stride at the + last unit of a block vs. we subsample activations at the end of a block. + """ + block = resnet_v1.resnet_v1_block + + blocks = [ + block('block1', base_depth=1, num_units=2, stride=2), + block('block2', base_depth=2, num_units=2, stride=2), + block('block3', base_depth=4, num_units=2, stride=2), + block('block4', base_depth=8, num_units=2, stride=1), + ] + + # Test both odd and even input dimensions. + height = 30 + width = 31 + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + with slim.arg_scope([slim.batch_norm], is_training=False): + for output_stride in [1, 2, 4, 8, None]: + with tf.Graph().as_default(): + with self.test_session() as sess: + tf.compat.v1.set_random_seed(0) + inputs = create_test_input(1, height, width, 3) + + # Subsampling at the last unit of the block. + output = resnet_utils.stack_blocks_dense( + inputs, blocks, output_stride, + store_non_strided_activations=False, + outputs_collections='output') + output_end_points = slim.utils.convert_collection_to_dict( + 'output') + + # Make the two networks use the same weights. + tf.compat.v1.get_variable_scope().reuse_variables() + + # Subsample activations at the end of the blocks. + expected = resnet_utils.stack_blocks_dense( + inputs, blocks, output_stride, + store_non_strided_activations=True, + outputs_collections='expected') + expected_end_points = slim.utils.convert_collection_to_dict( + 'expected') + + sess.run(tf.compat.v1.global_variables_initializer()) + + # Make sure that the final output is the same. + output, expected = sess.run([output, expected]) + self.assertAllClose(output, expected, atol=1e-4, rtol=1e-4) + + # Make sure that intermediate block activations in + # output_end_points are subsampled versions of the corresponding + # ones in expected_end_points. + for i, block in enumerate(blocks[:-1:]): + output = output_end_points[block.scope] + expected = expected_end_points[block.scope] + atrous_activated = (output_stride is not None and + 2 ** i >= output_stride) + if not atrous_activated: + expected = resnet_utils.subsample(expected, 2) + output, expected = sess.run([output, expected]) + self.assertAllClose(output, expected, atol=1e-4, rtol=1e-4) + + +class ResnetCompleteNetworkTest(tf.test.TestCase): + """Tests with complete small ResNet v1 networks.""" + + def _resnet_small(self, + inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + include_root_block=True, + spatial_squeeze=True, + reuse=None, + scope='resnet_v1_small'): + """A shallow and thin ResNet v1 for faster tests.""" + block = resnet_v1.resnet_v1_block + blocks = [ + block('block1', base_depth=1, num_units=3, stride=2), + block('block2', base_depth=2, num_units=3, stride=2), + block('block3', base_depth=4, num_units=3, stride=2), + block('block4', base_depth=8, num_units=2, stride=1), + ] + return resnet_v1.resnet_v1(inputs, blocks, num_classes, + is_training=is_training, + global_pool=global_pool, + output_stride=output_stride, + include_root_block=include_root_block, + spatial_squeeze=spatial_squeeze, + reuse=reuse, + scope=scope) + + def testClassificationEndPoints(self): + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + logits, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + self.assertTrue(logits.op.name.startswith('resnet/logits')) + self.assertListEqual(logits.get_shape().as_list(), [2, 1, 1, num_classes]) + self.assertTrue('predictions' in end_points) + self.assertListEqual(end_points['predictions'].get_shape().as_list(), + [2, 1, 1, num_classes]) + self.assertTrue('global_pool' in end_points) + self.assertListEqual(end_points['global_pool'].get_shape().as_list(), + [2, 1, 1, 32]) + + def testClassificationEndPointsWithNoBatchNormArgscope(self): + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + logits, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + is_training=None, + scope='resnet') + self.assertTrue(logits.op.name.startswith('resnet/logits')) + self.assertListEqual(logits.get_shape().as_list(), [2, 1, 1, num_classes]) + self.assertTrue('predictions' in end_points) + self.assertListEqual(end_points['predictions'].get_shape().as_list(), + [2, 1, 1, num_classes]) + self.assertTrue('global_pool' in end_points) + self.assertListEqual(end_points['global_pool'].get_shape().as_list(), + [2, 1, 1, 32]) + + def testEndpointNames(self): + # Like ResnetUtilsTest.testEndPointsV1(), but for the public API. + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + scope='resnet') + expected = ['resnet/conv1'] + for block in range(1, 5): + for unit in range(1, 4 if block < 4 else 3): + for conv in range(1, 4): + expected.append('resnet/block%d/unit_%d/bottleneck_v1/conv%d' % + (block, unit, conv)) + expected.append('resnet/block%d/unit_%d/bottleneck_v1' % (block, unit)) + expected.append('resnet/block%d/unit_1/bottleneck_v1/shortcut' % block) + expected.append('resnet/block%d' % block) + expected.extend(['global_pool', 'resnet/logits', 'resnet/spatial_squeeze', + 'predictions']) + self.assertItemsEqual(end_points.keys(), expected) + + def testClassificationShapes(self): + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 28, 28, 4], + 'resnet/block2': [2, 14, 14, 8], + 'resnet/block3': [2, 7, 7, 16], + 'resnet/block4': [2, 7, 7, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + inputs = create_test_input(2, 321, 321, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 41, 41, 4], + 'resnet/block2': [2, 21, 21, 8], + 'resnet/block3': [2, 11, 11, 16], + 'resnet/block4': [2, 11, 11, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testRootlessFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + inputs = create_test_input(2, 128, 128, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + include_root_block=False, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 64, 64, 4], + 'resnet/block2': [2, 32, 32, 8], + 'resnet/block3': [2, 16, 16, 16], + 'resnet/block4': [2, 16, 16, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testAtrousFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + output_stride = 8 + inputs = create_test_input(2, 321, 321, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, + num_classes, + global_pool=global_pool, + output_stride=output_stride, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 41, 41, 4], + 'resnet/block2': [2, 41, 41, 8], + 'resnet/block3': [2, 41, 41, 16], + 'resnet/block4': [2, 41, 41, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testAtrousFullyConvolutionalValues(self): + """Verify dense feature extraction with atrous convolution.""" + nominal_stride = 32 + for output_stride in [4, 8, 16, 32, None]: + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + with tf.Graph().as_default(): + with self.test_session() as sess: + tf.compat.v1.set_random_seed(0) + inputs = create_test_input(2, 81, 81, 3) + # Dense feature extraction followed by subsampling. + output, _ = self._resnet_small(inputs, None, is_training=False, + global_pool=False, + output_stride=output_stride) + if output_stride is None: + factor = 1 + else: + factor = nominal_stride // output_stride + output = resnet_utils.subsample(output, factor) + # Make the two networks use the same weights. + tf.compat.v1.get_variable_scope().reuse_variables() + # Feature extraction at the nominal network rate. + expected, _ = self._resnet_small(inputs, None, is_training=False, + global_pool=False) + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(output.eval(), expected.eval(), + atol=1e-4, rtol=1e-4) + + def testUnknownBatchSize(self): + batch = 2 + height, width = 65, 65 + global_pool = True + num_classes = 10 + inputs = create_test_input(None, height, width, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + logits, _ = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + self.assertTrue(logits.op.name.startswith('resnet/logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, 1, 1, num_classes]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 1, 1, num_classes)) + + def testFullyConvolutionalUnknownHeightWidth(self): + batch = 2 + height, width = 65, 65 + global_pool = False + inputs = create_test_input(batch, None, None, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + output, _ = self._resnet_small(inputs, None, global_pool=global_pool) + self.assertListEqual(output.get_shape().as_list(), + [batch, None, None, 32]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(output, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 3, 3, 32)) + + def testAtrousFullyConvolutionalUnknownHeightWidth(self): + batch = 2 + height, width = 65, 65 + global_pool = False + output_stride = 8 + inputs = create_test_input(batch, None, None, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + output, _ = self._resnet_small(inputs, + None, + global_pool=global_pool, + output_stride=output_stride) + self.assertListEqual(output.get_shape().as_list(), + [batch, None, None, 32]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(output, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 9, 9, 32)) + + def testDepthMultiplier(self): + resnets = [ + resnet_v1.resnet_v1_50, resnet_v1.resnet_v1_101, + resnet_v1.resnet_v1_152, resnet_v1.resnet_v1_200 + ] + resnet_names = [ + 'resnet_v1_50', 'resnet_v1_101', 'resnet_v1_152', 'resnet_v1_200' + ] + for resnet, resnet_name in zip(resnets, resnet_names): + depth_multiplier = 0.25 + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + scope_base = resnet_name + '_base' + _, end_points_base = resnet( + inputs, + num_classes, + global_pool=global_pool, + min_base_depth=1, + scope=scope_base) + scope_test = resnet_name + '_test' + _, end_points_test = resnet( + inputs, + num_classes, + global_pool=global_pool, + min_base_depth=1, + depth_multiplier=depth_multiplier, + scope=scope_test) + for block in ['block1', 'block2', 'block3', 'block4']: + block_name_base = scope_base + '/' + block + block_name_test = scope_test + '/' + block + self.assertTrue(block_name_base in end_points_base) + self.assertTrue(block_name_test in end_points_test) + self.assertEqual( + len(end_points_base[block_name_base].get_shape().as_list()), 4) + self.assertEqual( + len(end_points_test[block_name_test].get_shape().as_list()), 4) + self.assertListEqual( + end_points_base[block_name_base].get_shape().as_list()[:3], + end_points_test[block_name_test].get_shape().as_list()[:3]) + self.assertEqual( + int(depth_multiplier * + end_points_base[block_name_base].get_shape().as_list()[3]), + end_points_test[block_name_test].get_shape().as_list()[3]) + + def testMinBaseDepth(self): + resnets = [ + resnet_v1.resnet_v1_50, resnet_v1.resnet_v1_101, + resnet_v1.resnet_v1_152, resnet_v1.resnet_v1_200 + ] + resnet_names = [ + 'resnet_v1_50', 'resnet_v1_101', 'resnet_v1_152', 'resnet_v1_200' + ] + for resnet, resnet_name in zip(resnets, resnet_names): + min_base_depth = 5 + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = resnet( + inputs, + num_classes, + global_pool=global_pool, + min_base_depth=min_base_depth, + depth_multiplier=0, + scope=resnet_name) + for block in ['block1', 'block2', 'block3', 'block4']: + block_name = resnet_name + '/' + block + self.assertTrue(block_name in end_points) + self.assertEqual( + len(end_points[block_name].get_shape().as_list()), 4) + # The output depth is 4 times base_depth. + depth_expected = min_base_depth * 4 + self.assertEqual( + end_points[block_name].get_shape().as_list()[3], depth_expected) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2.py new file mode 100644 index 0000000..b08af07 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2.py @@ -0,0 +1,340 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for the preactivation form of Residual Networks. + +Residual networks (ResNets) were originally proposed in: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +The full preactivation 'v2' ResNet variant implemented in this module was +introduced by: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The key difference of the full preactivation 'v2' variant compared to the +'v1' variant in [1] is the use of batch normalization before every weight layer. + +Typical use: + + from tensorflow.contrib.slim.nets import resnet_v2 + +ResNet-101 for image classification into 1000 classes: + + # inputs has shape [batch, 224, 224, 3] + with slim.arg_scope(resnet_v2.resnet_arg_scope()): + net, end_points = resnet_v2.resnet_v2_101(inputs, 1000, is_training=False) + +ResNet-101 for semantic segmentation into 21 classes: + + # inputs has shape [batch, 513, 513, 3] + with slim.arg_scope(resnet_v2.resnet_arg_scope()): + net, end_points = resnet_v2.resnet_v2_101(inputs, + 21, + is_training=False, + global_pool=False, + output_stride=16) +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import resnet_utils + +slim = contrib_slim +resnet_arg_scope = resnet_utils.resnet_arg_scope + + +@slim.add_arg_scope +def bottleneck(inputs, depth, depth_bottleneck, stride, rate=1, + outputs_collections=None, scope=None): + """Bottleneck residual unit variant with BN before convolutions. + + This is the full preactivation residual unit variant proposed in [2]. See + Fig. 1(b) of [2] for its definition. Note that we use here the bottleneck + variant which has an extra bottleneck layer. + + When putting together two consecutive ResNet blocks that use this unit, one + should use stride = 2 in the last unit of the first block. + + Args: + inputs: A tensor of size [batch, height, width, channels]. + depth: The depth of the ResNet unit output. + depth_bottleneck: The depth of the bottleneck layers. + stride: The ResNet unit's stride. Determines the amount of downsampling of + the units output compared to its input. + rate: An integer, rate for atrous convolution. + outputs_collections: Collection to add the ResNet unit output. + scope: Optional variable_scope. + + Returns: + The ResNet unit's output. + """ + with tf.compat.v1.variable_scope(scope, 'bottleneck_v2', [inputs]) as sc: + depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank=4) + preact = slim.batch_norm(inputs, activation_fn=tf.nn.relu, scope='preact') + if depth == depth_in: + shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') + else: + shortcut = slim.conv2d(preact, depth, [1, 1], stride=stride, + normalizer_fn=None, activation_fn=None, + scope='shortcut') + + residual = slim.conv2d(preact, depth_bottleneck, [1, 1], stride=1, + scope='conv1') + residual = resnet_utils.conv2d_same(residual, depth_bottleneck, 3, stride, + rate=rate, scope='conv2') + residual = slim.conv2d(residual, depth, [1, 1], stride=1, + normalizer_fn=None, activation_fn=None, + scope='conv3') + + output = shortcut + residual + + return slim.utils.collect_named_outputs(outputs_collections, + sc.name, + output) + + +def resnet_v2(inputs, + blocks, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + include_root_block=True, + spatial_squeeze=True, + reuse=None, + scope=None): + """Generator for v2 (preactivation) ResNet models. + + This function generates a family of ResNet v2 models. See the resnet_v2_*() + methods for specific model instantiations, obtained by selecting different + block instantiations that produce ResNets of various depths. + + Training for image classification on Imagenet is usually done with [224, 224] + inputs, resulting in [7, 7] feature maps at the output of the last ResNet + block for the ResNets defined in [1] that have nominal stride equal to 32. + However, for dense prediction tasks we advise that one uses inputs with + spatial dimensions that are multiples of 32 plus 1, e.g., [321, 321]. In + this case the feature maps at the ResNet output will have spatial shape + [(height - 1) / output_stride + 1, (width - 1) / output_stride + 1] + and corners exactly aligned with the input image corners, which greatly + facilitates alignment of the features to the image. Using as input [225, 225] + images results in [8, 8] feature maps at the output of the last ResNet block. + + For dense prediction tasks, the ResNet needs to run in fully-convolutional + (FCN) mode and global_pool needs to be set to False. The ResNets in [1, 2] all + have nominal stride equal to 32 and a good choice in FCN mode is to use + output_stride=16 in order to increase the density of the computed features at + small computational and memory overhead, cf. http://arxiv.org/abs/1606.00915. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + blocks: A list of length equal to the number of ResNet blocks. Each element + is a resnet_utils.Block object describing the units in the block. + num_classes: Number of predicted classes for classification tasks. + If 0 or None, we return the features before the logit layer. + is_training: whether batch_norm layers are in training mode. + global_pool: If True, we perform global average pooling before computing the + logits. Set to True for image classification, False for dense prediction. + output_stride: If None, then the output will be computed at the nominal + network stride. If output_stride is not None, it specifies the requested + ratio of input to output spatial resolution. + include_root_block: If True, include the initial convolution followed by + max-pooling, if False excludes it. If excluded, `inputs` should be the + results of an activation-less convolution. + spatial_squeeze: if True, logits is of shape [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + To use this parameter, the input images must be smaller than 300x300 + pixels, in which case the output logit layer does not contain spatial + information and can be removed. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + + + Returns: + net: A rank-4 tensor of size [batch, height_out, width_out, channels_out]. + If global_pool is False, then height_out and width_out are reduced by a + factor of output_stride compared to the respective height_in and width_in, + else both height_out and width_out equal one. If num_classes is 0 or None, + then net is the output of the last ResNet block, potentially after global + average pooling. If num_classes is a non-zero integer, net contains the + pre-softmax activations. + end_points: A dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: If the target output_stride is not valid. + """ + with tf.compat.v1.variable_scope( + scope, 'resnet_v2', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + with slim.arg_scope([slim.conv2d, bottleneck, + resnet_utils.stack_blocks_dense], + outputs_collections=end_points_collection): + with slim.arg_scope([slim.batch_norm], is_training=is_training): + net = inputs + if include_root_block: + if output_stride is not None: + if output_stride % 4 != 0: + raise ValueError('The output_stride needs to be a multiple of 4.') + output_stride /= 4 + # We do not include batch normalization or activation functions in + # conv1 because the first ResNet unit will perform these. Cf. + # Appendix of [2]. + with slim.arg_scope([slim.conv2d], + activation_fn=None, normalizer_fn=None): + net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') + net = slim.max_pool2d(net, [3, 3], stride=2, scope='pool1') + net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) + # This is needed because the pre-activation variant does not have batch + # normalization or activation functions in the residual unit output. See + # Appendix of [2]. + net = slim.batch_norm(net, activation_fn=tf.nn.relu, scope='postnorm') + # Convert end_points_collection into a dictionary of end_points. + end_points = slim.utils.convert_collection_to_dict( + end_points_collection) + + if global_pool: + # Global average pooling. + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], name='pool5', keepdims=True) + end_points['global_pool'] = net + if num_classes: + net = slim.conv2d(net, num_classes, [1, 1], activation_fn=None, + normalizer_fn=None, scope='logits') + end_points[sc.name + '/logits'] = net + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='SpatialSqueeze') + end_points[sc.name + '/spatial_squeeze'] = net + end_points['predictions'] = slim.softmax(net, scope='predictions') + return net, end_points +resnet_v2.default_image_size = 224 + + +def resnet_v2_block(scope, base_depth, num_units, stride): + """Helper function for creating a resnet_v2 bottleneck block. + + Args: + scope: The scope of the block. + base_depth: The depth of the bottleneck layer for each unit. + num_units: The number of units in the block. + stride: The stride of the block, implemented as a stride in the last unit. + All other units have stride=1. + + Returns: + A resnet_v2 bottleneck block. + """ + return resnet_utils.Block(scope, bottleneck, [{ + 'depth': base_depth * 4, + 'depth_bottleneck': base_depth, + 'stride': 1 + }] * (num_units - 1) + [{ + 'depth': base_depth * 4, + 'depth_bottleneck': base_depth, + 'stride': stride + }]) +resnet_v2.default_image_size = 224 + + +def resnet_v2_50(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + reuse=None, + scope='resnet_v2_50'): + """ResNet-50 model of [1]. See resnet_v2() for arg and return description.""" + blocks = [ + resnet_v2_block('block1', base_depth=64, num_units=3, stride=2), + resnet_v2_block('block2', base_depth=128, num_units=4, stride=2), + resnet_v2_block('block3', base_depth=256, num_units=6, stride=2), + resnet_v2_block('block4', base_depth=512, num_units=3, stride=1), + ] + return resnet_v2(inputs, blocks, num_classes, is_training=is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + reuse=reuse, scope=scope) +resnet_v2_50.default_image_size = resnet_v2.default_image_size + + +def resnet_v2_101(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + reuse=None, + scope='resnet_v2_101'): + """ResNet-101 model of [1]. See resnet_v2() for arg and return description.""" + blocks = [ + resnet_v2_block('block1', base_depth=64, num_units=3, stride=2), + resnet_v2_block('block2', base_depth=128, num_units=4, stride=2), + resnet_v2_block('block3', base_depth=256, num_units=23, stride=2), + resnet_v2_block('block4', base_depth=512, num_units=3, stride=1), + ] + return resnet_v2(inputs, blocks, num_classes, is_training=is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + reuse=reuse, scope=scope) +resnet_v2_101.default_image_size = resnet_v2.default_image_size + + +def resnet_v2_152(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + reuse=None, + scope='resnet_v2_152'): + """ResNet-152 model of [1]. See resnet_v2() for arg and return description.""" + blocks = [ + resnet_v2_block('block1', base_depth=64, num_units=3, stride=2), + resnet_v2_block('block2', base_depth=128, num_units=8, stride=2), + resnet_v2_block('block3', base_depth=256, num_units=36, stride=2), + resnet_v2_block('block4', base_depth=512, num_units=3, stride=1), + ] + return resnet_v2(inputs, blocks, num_classes, is_training=is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + reuse=reuse, scope=scope) +resnet_v2_152.default_image_size = resnet_v2.default_image_size + + +def resnet_v2_200(inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + spatial_squeeze=True, + reuse=None, + scope='resnet_v2_200'): + """ResNet-200 model of [2]. See resnet_v2() for arg and return description.""" + blocks = [ + resnet_v2_block('block1', base_depth=64, num_units=3, stride=2), + resnet_v2_block('block2', base_depth=128, num_units=24, stride=2), + resnet_v2_block('block3', base_depth=256, num_units=36, stride=2), + resnet_v2_block('block4', base_depth=512, num_units=3, stride=1), + ] + return resnet_v2(inputs, blocks, num_classes, is_training=is_training, + global_pool=global_pool, output_stride=output_stride, + include_root_block=True, spatial_squeeze=spatial_squeeze, + reuse=reuse, scope=scope) +resnet_v2_200.default_image_size = resnet_v2.default_image_size diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2_test.py new file mode 100644 index 0000000..5ca5227 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/resnet_v2_test.py @@ -0,0 +1,474 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.resnet_v2.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import resnet_utils +from nets import resnet_v2 + +slim = contrib_slim + +tf.compat.v1.disable_resource_variables() + + +def create_test_input(batch_size, height, width, channels): + """Create test input tensor. + + Args: + batch_size: The number of images per batch or `None` if unknown. + height: The height of each image or `None` if unknown. + width: The width of each image or `None` if unknown. + channels: The number of channels per image or `None` if unknown. + + Returns: + Either a placeholder `Tensor` of dimension + [batch_size, height, width, channels] if any of the inputs are `None` or a + constant `Tensor` with the mesh grid values along the spatial dimensions. + """ + if None in [batch_size, height, width, channels]: + return tf.compat.v1.placeholder(tf.float32, + (batch_size, height, width, channels)) + else: + return tf.cast( + np.tile( + np.reshape( + np.reshape(np.arange(height), [height, 1]) + + np.reshape(np.arange(width), [1, width]), + [1, height, width, 1]), [batch_size, 1, 1, channels]), + dtype=tf.float32) + + +class ResnetUtilsTest(tf.test.TestCase): + + def testSubsampleThreeByThree(self): + x = tf.reshape(tf.cast(tf.range(9), dtype=tf.float32), [1, 3, 3, 1]) + x = resnet_utils.subsample(x, 2) + expected = tf.reshape(tf.constant([0, 2, 6, 8]), [1, 2, 2, 1]) + with self.test_session(): + self.assertAllClose(x.eval(), expected.eval()) + + def testSubsampleFourByFour(self): + x = tf.reshape(tf.cast(tf.range(16), dtype=tf.float32), [1, 4, 4, 1]) + x = resnet_utils.subsample(x, 2) + expected = tf.reshape(tf.constant([0, 2, 8, 10]), [1, 2, 2, 1]) + with self.test_session(): + self.assertAllClose(x.eval(), expected.eval()) + + def testConv2DSameEven(self): + n, n2 = 4, 2 + + # Input image. + x = create_test_input(1, n, n, 1) + + # Convolution kernel. + w = create_test_input(1, 3, 3, 1) + w = tf.reshape(w, [3, 3, 1, 1]) + + tf.compat.v1.get_variable('Conv/weights', initializer=w) + tf.compat.v1.get_variable('Conv/biases', initializer=tf.zeros([1])) + tf.compat.v1.get_variable_scope().reuse_variables() + + y1 = slim.conv2d(x, 1, [3, 3], stride=1, scope='Conv') + y1_expected = tf.cast([[14, 28, 43, 26], [28, 48, 66, 37], [43, 66, 84, 46], + [26, 37, 46, 22]], + dtype=tf.float32) + y1_expected = tf.reshape(y1_expected, [1, n, n, 1]) + + y2 = resnet_utils.subsample(y1, 2) + y2_expected = tf.cast([[14, 43], [43, 84]], dtype=tf.float32) + y2_expected = tf.reshape(y2_expected, [1, n2, n2, 1]) + + y3 = resnet_utils.conv2d_same(x, 1, 3, stride=2, scope='Conv') + y3_expected = y2_expected + + y4 = slim.conv2d(x, 1, [3, 3], stride=2, scope='Conv') + y4_expected = tf.cast([[48, 37], [37, 22]], dtype=tf.float32) + y4_expected = tf.reshape(y4_expected, [1, n2, n2, 1]) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(y1.eval(), y1_expected.eval()) + self.assertAllClose(y2.eval(), y2_expected.eval()) + self.assertAllClose(y3.eval(), y3_expected.eval()) + self.assertAllClose(y4.eval(), y4_expected.eval()) + + def testConv2DSameOdd(self): + n, n2 = 5, 3 + + # Input image. + x = create_test_input(1, n, n, 1) + + # Convolution kernel. + w = create_test_input(1, 3, 3, 1) + w = tf.reshape(w, [3, 3, 1, 1]) + + tf.compat.v1.get_variable('Conv/weights', initializer=w) + tf.compat.v1.get_variable('Conv/biases', initializer=tf.zeros([1])) + tf.compat.v1.get_variable_scope().reuse_variables() + + y1 = slim.conv2d(x, 1, [3, 3], stride=1, scope='Conv') + y1_expected = tf.cast( + [[14, 28, 43, 58, 34], [28, 48, 66, 84, 46], [43, 66, 84, 102, 55], + [58, 84, 102, 120, 64], [34, 46, 55, 64, 30]], + dtype=tf.float32) + y1_expected = tf.reshape(y1_expected, [1, n, n, 1]) + + y2 = resnet_utils.subsample(y1, 2) + y2_expected = tf.cast([[14, 43, 34], [43, 84, 55], [34, 55, 30]], + dtype=tf.float32) + y2_expected = tf.reshape(y2_expected, [1, n2, n2, 1]) + + y3 = resnet_utils.conv2d_same(x, 1, 3, stride=2, scope='Conv') + y3_expected = y2_expected + + y4 = slim.conv2d(x, 1, [3, 3], stride=2, scope='Conv') + y4_expected = y2_expected + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(y1.eval(), y1_expected.eval()) + self.assertAllClose(y2.eval(), y2_expected.eval()) + self.assertAllClose(y3.eval(), y3_expected.eval()) + self.assertAllClose(y4.eval(), y4_expected.eval()) + + def _resnet_plain(self, inputs, blocks, output_stride=None, scope=None): + """A plain ResNet without extra layers before or after the ResNet blocks.""" + with tf.compat.v1.variable_scope(scope, values=[inputs]): + with slim.arg_scope([slim.conv2d], outputs_collections='end_points'): + net = resnet_utils.stack_blocks_dense(inputs, blocks, output_stride) + end_points = slim.utils.convert_collection_to_dict('end_points') + return net, end_points + + def testEndPointsV2(self): + """Test the end points of a tiny v2 bottleneck network.""" + blocks = [ + resnet_v2.resnet_v2_block( + 'block1', base_depth=1, num_units=2, stride=2), + resnet_v2.resnet_v2_block( + 'block2', base_depth=2, num_units=2, stride=1), + ] + inputs = create_test_input(2, 32, 16, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_plain(inputs, blocks, scope='tiny') + expected = [ + 'tiny/block1/unit_1/bottleneck_v2/shortcut', + 'tiny/block1/unit_1/bottleneck_v2/conv1', + 'tiny/block1/unit_1/bottleneck_v2/conv2', + 'tiny/block1/unit_1/bottleneck_v2/conv3', + 'tiny/block1/unit_2/bottleneck_v2/conv1', + 'tiny/block1/unit_2/bottleneck_v2/conv2', + 'tiny/block1/unit_2/bottleneck_v2/conv3', + 'tiny/block2/unit_1/bottleneck_v2/shortcut', + 'tiny/block2/unit_1/bottleneck_v2/conv1', + 'tiny/block2/unit_1/bottleneck_v2/conv2', + 'tiny/block2/unit_1/bottleneck_v2/conv3', + 'tiny/block2/unit_2/bottleneck_v2/conv1', + 'tiny/block2/unit_2/bottleneck_v2/conv2', + 'tiny/block2/unit_2/bottleneck_v2/conv3'] + self.assertItemsEqual(expected, end_points.keys()) + + def _stack_blocks_nondense(self, net, blocks): + """A simplified ResNet Block stacker without output stride control.""" + for block in blocks: + with tf.compat.v1.variable_scope(block.scope, 'block', [net]): + for i, unit in enumerate(block.args): + with tf.compat.v1.variable_scope('unit_%d' % (i + 1), values=[net]): + net = block.unit_fn(net, rate=1, **unit) + return net + + def testAtrousValuesBottleneck(self): + """Verify the values of dense feature extraction by atrous convolution. + + Make sure that dense feature extraction by stack_blocks_dense() followed by + subsampling gives identical results to feature extraction at the nominal + network output stride using the simple self._stack_blocks_nondense() above. + """ + block = resnet_v2.resnet_v2_block + blocks = [ + block('block1', base_depth=1, num_units=2, stride=2), + block('block2', base_depth=2, num_units=2, stride=2), + block('block3', base_depth=4, num_units=2, stride=2), + block('block4', base_depth=8, num_units=2, stride=1), + ] + nominal_stride = 8 + + # Test both odd and even input dimensions. + height = 30 + width = 31 + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + with slim.arg_scope([slim.batch_norm], is_training=False): + for output_stride in [1, 2, 4, 8, None]: + with tf.Graph().as_default(): + with self.test_session() as sess: + tf.compat.v1.set_random_seed(0) + inputs = create_test_input(1, height, width, 3) + # Dense feature extraction followed by subsampling. + output = resnet_utils.stack_blocks_dense(inputs, + blocks, + output_stride) + if output_stride is None: + factor = 1 + else: + factor = nominal_stride // output_stride + + output = resnet_utils.subsample(output, factor) + # Make the two networks use the same weights. + tf.compat.v1.get_variable_scope().reuse_variables() + # Feature extraction at the nominal network rate. + expected = self._stack_blocks_nondense(inputs, blocks) + sess.run(tf.compat.v1.global_variables_initializer()) + output, expected = sess.run([output, expected]) + self.assertAllClose(output, expected, atol=1e-4, rtol=1e-4) + + +class ResnetCompleteNetworkTest(tf.test.TestCase): + """Tests with complete small ResNet v2 networks.""" + + def _resnet_small(self, + inputs, + num_classes=None, + is_training=True, + global_pool=True, + output_stride=None, + include_root_block=True, + spatial_squeeze=True, + reuse=None, + scope='resnet_v2_small'): + """A shallow and thin ResNet v2 for faster tests.""" + block = resnet_v2.resnet_v2_block + blocks = [ + block('block1', base_depth=1, num_units=3, stride=2), + block('block2', base_depth=2, num_units=3, stride=2), + block('block3', base_depth=4, num_units=3, stride=2), + block('block4', base_depth=8, num_units=2, stride=1), + ] + return resnet_v2.resnet_v2(inputs, blocks, num_classes, + is_training=is_training, + global_pool=global_pool, + output_stride=output_stride, + include_root_block=include_root_block, + spatial_squeeze=spatial_squeeze, + reuse=reuse, + scope=scope) + + def testClassificationEndPoints(self): + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + logits, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + self.assertTrue(logits.op.name.startswith('resnet/logits')) + self.assertListEqual(logits.get_shape().as_list(), [2, 1, 1, num_classes]) + self.assertTrue('predictions' in end_points) + self.assertListEqual(end_points['predictions'].get_shape().as_list(), + [2, 1, 1, num_classes]) + self.assertTrue('global_pool' in end_points) + self.assertListEqual(end_points['global_pool'].get_shape().as_list(), + [2, 1, 1, 32]) + + def testEndpointNames(self): + # Like ResnetUtilsTest.testEndPointsV2(), but for the public API. + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + scope='resnet') + expected = ['resnet/conv1'] + for block in range(1, 5): + for unit in range(1, 4 if block < 4 else 3): + for conv in range(1, 4): + expected.append('resnet/block%d/unit_%d/bottleneck_v2/conv%d' % + (block, unit, conv)) + expected.append('resnet/block%d/unit_%d/bottleneck_v2' % (block, unit)) + expected.append('resnet/block%d/unit_1/bottleneck_v2/shortcut' % block) + expected.append('resnet/block%d' % block) + expected.extend(['global_pool', 'resnet/logits', 'resnet/spatial_squeeze', + 'predictions']) + self.assertItemsEqual(end_points.keys(), expected) + + def testClassificationShapes(self): + global_pool = True + num_classes = 10 + inputs = create_test_input(2, 224, 224, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 28, 28, 4], + 'resnet/block2': [2, 14, 14, 8], + 'resnet/block3': [2, 7, 7, 16], + 'resnet/block4': [2, 7, 7, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + inputs = create_test_input(2, 321, 321, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 41, 41, 4], + 'resnet/block2': [2, 21, 21, 8], + 'resnet/block3': [2, 11, 11, 16], + 'resnet/block4': [2, 11, 11, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testRootlessFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + inputs = create_test_input(2, 128, 128, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + include_root_block=False, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 64, 64, 4], + 'resnet/block2': [2, 32, 32, 8], + 'resnet/block3': [2, 16, 16, 16], + 'resnet/block4': [2, 16, 16, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testAtrousFullyConvolutionalEndpointShapes(self): + global_pool = False + num_classes = 10 + output_stride = 8 + inputs = create_test_input(2, 321, 321, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + _, end_points = self._resnet_small(inputs, + num_classes, + global_pool=global_pool, + output_stride=output_stride, + spatial_squeeze=False, + scope='resnet') + endpoint_to_shape = { + 'resnet/block1': [2, 41, 41, 4], + 'resnet/block2': [2, 41, 41, 8], + 'resnet/block3': [2, 41, 41, 16], + 'resnet/block4': [2, 41, 41, 32]} + for endpoint in endpoint_to_shape: + shape = endpoint_to_shape[endpoint] + self.assertListEqual(end_points[endpoint].get_shape().as_list(), shape) + + def testAtrousFullyConvolutionalValues(self): + """Verify dense feature extraction with atrous convolution.""" + nominal_stride = 32 + for output_stride in [4, 8, 16, 32, None]: + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + with tf.Graph().as_default(): + with self.test_session() as sess: + tf.compat.v1.set_random_seed(0) + inputs = create_test_input(2, 81, 81, 3) + # Dense feature extraction followed by subsampling. + output, _ = self._resnet_small(inputs, None, + is_training=False, + global_pool=False, + output_stride=output_stride) + if output_stride is None: + factor = 1 + else: + factor = nominal_stride // output_stride + output = resnet_utils.subsample(output, factor) + # Make the two networks use the same weights. + tf.compat.v1.get_variable_scope().reuse_variables() + # Feature extraction at the nominal network rate. + expected, _ = self._resnet_small(inputs, None, + is_training=False, + global_pool=False) + sess.run(tf.compat.v1.global_variables_initializer()) + self.assertAllClose(output.eval(), expected.eval(), + atol=1e-4, rtol=1e-4) + + def testUnknownBatchSize(self): + batch = 2 + height, width = 65, 65 + global_pool = True + num_classes = 10 + inputs = create_test_input(None, height, width, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + logits, _ = self._resnet_small(inputs, num_classes, + global_pool=global_pool, + spatial_squeeze=False, + scope='resnet') + self.assertTrue(logits.op.name.startswith('resnet/logits')) + self.assertListEqual(logits.get_shape().as_list(), + [None, 1, 1, num_classes]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 1, 1, num_classes)) + + def testFullyConvolutionalUnknownHeightWidth(self): + batch = 2 + height, width = 65, 65 + global_pool = False + inputs = create_test_input(batch, None, None, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + output, _ = self._resnet_small(inputs, None, + global_pool=global_pool) + self.assertListEqual(output.get_shape().as_list(), + [batch, None, None, 32]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(output, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 3, 3, 32)) + + def testAtrousFullyConvolutionalUnknownHeightWidth(self): + batch = 2 + height, width = 65, 65 + global_pool = False + output_stride = 8 + inputs = create_test_input(batch, None, None, 3) + with slim.arg_scope(resnet_utils.resnet_arg_scope()): + output, _ = self._resnet_small(inputs, + None, + global_pool=global_pool, + output_stride=output_stride) + self.assertListEqual(output.get_shape().as_list(), + [batch, None, None, 32]) + images = create_test_input(batch, height, width, 3) + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(output, {inputs: images.eval()}) + self.assertEqual(output.shape, (batch, 9, 9, 32)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg.py new file mode 100644 index 0000000..3f443ad --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg.py @@ -0,0 +1,603 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains the definition for Gated Separable 3D network (S3D-G). + +The network architecture is proposed by: + Saining Xie, Chen Sun, Jonathan Huang, Zhuowen Tu and Kevin Murphy, + Rethinking Spatiotemporal Feature Learning For Video Understanding. + https://arxiv.org/abs/1712.04851. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import framework as contrib_framework +from tensorflow.contrib import layers as contrib_layers + +from nets import i3d_utils + +# pylint: disable=g-long-lambda +trunc_normal = lambda stddev: tf.compat.v1.truncated_normal_initializer( + 0.0, stddev) +conv3d_spatiotemporal = i3d_utils.conv3d_spatiotemporal +inception_block_v1_3d = i3d_utils.inception_block_v1_3d + +# Orignaly, arg_scope = slim.arg_scope and layers = slim, now switch to more +# update-to-date tf.contrib.* API. +arg_scope = contrib_framework.arg_scope +layers = contrib_layers + + +def s3dg_arg_scope(weight_decay=1e-7, + batch_norm_decay=0.999, + batch_norm_epsilon=0.001): + """Defines default arg_scope for S3D-G. + + Args: + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: Decay for batch norm moving average. + batch_norm_epsilon: Small float added to variance to avoid dividing by zero + in batch norm. + + Returns: + sc: An arg_scope to use for the models. + """ + batch_norm_params = { + # Decay for the moving averages. + 'decay': batch_norm_decay, + # epsilon to prevent 0s in variance. + 'epsilon': batch_norm_epsilon, + # Turns off fused batch norm. + 'fused': False, + # collection containing the moving mean and moving variance. + 'variables_collections': { + 'beta': None, + 'gamma': None, + 'moving_mean': ['moving_vars'], + 'moving_variance': ['moving_vars'], + } + } + + with arg_scope( + [layers.conv3d, conv3d_spatiotemporal], + weights_regularizer=layers.l2_regularizer(weight_decay), + activation_fn=tf.nn.relu, + normalizer_fn=layers.batch_norm, + normalizer_params=batch_norm_params): + with arg_scope([conv3d_spatiotemporal], separable=True) as sc: + return sc + + +def self_gating(input_tensor, scope, data_format='NDHWC'): + """Feature gating as used in S3D-G. + + Transforms the input features by aggregating features from all + spatial and temporal locations, and applying gating conditioned + on the aggregated features. More details can be found at: + https://arxiv.org/abs/1712.04851 + + Args: + input_tensor: A 5-D float tensor of size [batch_size, num_frames, + height, width, channels]. + scope: scope for `variable_scope`. + data_format: An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". + The data format of the input and output data. With the default format + "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, + in_width, in_channels]. Alternatively, the format could be "NCDHW", the + data storage order is: + [batch, in_channels, in_depth, in_height, in_width]. + + Returns: + A tensor with the same shape as input_tensor. + """ + + index_c = data_format.index('C') + index_d = data_format.index('D') + index_h = data_format.index('H') + index_w = data_format.index('W') + input_shape = input_tensor.get_shape().as_list() + t = input_shape[index_d] + w = input_shape[index_w] + h = input_shape[index_h] + num_channels = input_shape[index_c] + + spatiotemporal_average = layers.avg_pool3d( + input_tensor, [t, w, h], + stride=1, + data_format=data_format, + scope=scope + '/self_gating/avg_pool3d') + + weights = layers.conv3d( + spatiotemporal_average, + num_channels, [1, 1, 1], + activation_fn=None, + normalizer_fn=None, + biases_initializer=None, + data_format=data_format, + weights_initializer=trunc_normal(0.01), + scope=scope + '/self_gating/transformer_W') + + tile_multiples = [1, t, w, h] + tile_multiples.insert(index_c, 1) + weights = tf.tile(weights, tile_multiples) + weights = tf.nn.sigmoid(weights) + + return tf.multiply(weights, input_tensor) + + +def s3dg_base(inputs, + first_temporal_kernel_size=3, + temporal_conv_startat='Conv2d_2c_3x3', + gating_startat='Conv2d_2c_3x3', + final_endpoint='Mixed_5c', + min_depth=16, + depth_multiplier=1.0, + data_format='NDHWC', + scope='InceptionV1'): + """Defines the I3D/S3DG base architecture. + + Note that we use the names as defined in Inception V1 to facilitate checkpoint + conversion from an image-trained Inception V1 checkpoint to I3D checkpoint. + + Args: + inputs: A 5-D float tensor of size [batch_size, num_frames, height, width, + channels]. + first_temporal_kernel_size: Specifies the temporal kernel size for the first + conv3d filter. A larger value slows down the model but provides little + accuracy improvement. The default is 7 in the original I3D and S3D-G but 3 + gives better performance. Must be set to one of 1, 3, 5 or 7. + temporal_conv_startat: Specifies the first conv block to use 3D or separable + 3D convs rather than 2D convs (implemented as [1, k, k] 3D conv). This is + used to construct the inverted pyramid models. 'Conv2d_2c_3x3' is the + first valid block to use separable 3D convs. If provided block name is + not present, all valid blocks will use separable 3D convs. Note that + 'Conv2d_1a_7x7' cannot be made into a separable 3D conv, but can be made + into a 2D or 3D conv using the `first_temporal_kernel_size` option. + gating_startat: Specifies the first conv block to use self gating. + 'Conv2d_2c_3x3' is the first valid block to use self gating. If provided + block name is not present, all valid blocks will use separable 3D convs. + final_endpoint: Specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', + 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', 'Mixed_5c'] + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + data_format: An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". + The data format of the input and output data. With the default format + "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, + in_width, in_channels]. Alternatively, the format could be "NCDHW", the + data storage order is: + [batch, in_channels, in_depth, in_height, in_width]. + scope: Optional variable_scope. + + Returns: + A dictionary from components of the network to the corresponding activation. + + Raises: + ValueError: if final_endpoint is not set to one of the predefined values, or + if depth_multiplier <= 0. + """ + + assert data_format in ['NDHWC', 'NCDHW'] + end_points = {} + t = 1 + # For inverted pyramid models, we start with gating switched off. + use_gating = False + self_gating_fn = None + def gating_fn(inputs, scope): + return self_gating(inputs, scope, data_format=data_format) + + if depth_multiplier <= 0: + raise ValueError('depth_multiplier is not greater than zero.') + depth = lambda d: max(int(d * depth_multiplier), min_depth) + + with tf.compat.v1.variable_scope(scope, 'InceptionV1', [inputs]): + with arg_scope([layers.conv3d], weights_initializer=trunc_normal(0.01)): + with arg_scope( + [layers.conv3d, layers.max_pool3d, conv3d_spatiotemporal], + stride=1, + data_format=data_format, + padding='SAME'): + # batch_size x 32 x 112 x 112 x 64 + end_point = 'Conv2d_1a_7x7' + if first_temporal_kernel_size not in [1, 3, 5, 7]: + raise ValueError( + 'first_temporal_kernel_size can only be 1, 3, 5 or 7.') + # Separable conv is slow when used at first conv layer. + net = conv3d_spatiotemporal( + inputs, + depth(64), [first_temporal_kernel_size, 7, 7], + stride=2, + separable=False, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + # batch_size x 32 x 56 x 56 x 64 + end_point = 'MaxPool_2a_3x3' + net = layers.max_pool3d( + net, [1, 3, 3], stride=[1, 2, 2], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + # batch_size x 32 x 56 x 56 x 64 + end_point = 'Conv2d_2b_1x1' + net = layers.conv3d(net, depth(64), [1, 1, 1], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + # batch_size x 32 x 56 x 56 x 192 + end_point = 'Conv2d_2c_3x3' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = conv3d_spatiotemporal(net, depth(192), [t, 3, 3], scope=end_point) + if use_gating: + net = self_gating(net, scope=end_point, data_format=data_format) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + # batch_size x 32 x 28 x 28 x 192 + end_point = 'MaxPool_3a_3x3' + net = layers.max_pool3d( + net, [1, 3, 3], stride=[1, 2, 2], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 32 x 28 x 28 x 256 + end_point = 'Mixed_3b' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(64), + num_outputs_1_0a=depth(96), + num_outputs_1_0b=depth(128), + num_outputs_2_0a=depth(16), + num_outputs_2_0b=depth(32), + num_outputs_3_0b=depth(32), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + end_point = 'Mixed_3c' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(128), + num_outputs_1_0a=depth(128), + num_outputs_1_0b=depth(192), + num_outputs_2_0a=depth(32), + num_outputs_2_0b=depth(96), + num_outputs_3_0b=depth(64), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + end_point = 'MaxPool_4a_3x3' + net = layers.max_pool3d( + net, [3, 3, 3], stride=[2, 2, 2], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 16 x 14 x 14 x 512 + end_point = 'Mixed_4b' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(192), + num_outputs_1_0a=depth(96), + num_outputs_1_0b=depth(208), + num_outputs_2_0a=depth(16), + num_outputs_2_0b=depth(48), + num_outputs_3_0b=depth(64), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 16 x 14 x 14 x 512 + end_point = 'Mixed_4c' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(160), + num_outputs_1_0a=depth(112), + num_outputs_1_0b=depth(224), + num_outputs_2_0a=depth(24), + num_outputs_2_0b=depth(64), + num_outputs_3_0b=depth(64), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 16 x 14 x 14 x 512 + end_point = 'Mixed_4d' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(128), + num_outputs_1_0a=depth(128), + num_outputs_1_0b=depth(256), + num_outputs_2_0a=depth(24), + num_outputs_2_0b=depth(64), + num_outputs_3_0b=depth(64), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 16 x 14 x 14 x 528 + end_point = 'Mixed_4e' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(112), + num_outputs_1_0a=depth(144), + num_outputs_1_0b=depth(288), + num_outputs_2_0a=depth(32), + num_outputs_2_0b=depth(64), + num_outputs_3_0b=depth(64), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 16 x 14 x 14 x 832 + end_point = 'Mixed_4f' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(256), + num_outputs_1_0a=depth(160), + num_outputs_1_0b=depth(320), + num_outputs_2_0a=depth(32), + num_outputs_2_0b=depth(128), + num_outputs_3_0b=depth(128), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + end_point = 'MaxPool_5a_2x2' + net = layers.max_pool3d( + net, [2, 2, 2], stride=[2, 2, 2], scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 8 x 7 x 7 x 832 + end_point = 'Mixed_5b' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(256), + num_outputs_1_0a=depth(160), + num_outputs_1_0b=depth(320), + num_outputs_2_0a=depth(32), + num_outputs_2_0b=depth(128), + num_outputs_3_0b=depth(128), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + + # batch_size x 8 x 7 x 7 x 1024 + end_point = 'Mixed_5c' + if temporal_conv_startat == end_point: + t = 3 + if gating_startat == end_point: + use_gating = True + self_gating_fn = gating_fn + net = inception_block_v1_3d( + net, + num_outputs_0_0a=depth(384), + num_outputs_1_0a=depth(192), + num_outputs_1_0b=depth(384), + num_outputs_2_0a=depth(48), + num_outputs_2_0b=depth(128), + num_outputs_3_0b=depth(128), + temporal_kernel_size=t, + self_gating_fn=self_gating_fn, + data_format=data_format, + scope=end_point) + end_points[end_point] = net + if final_endpoint == end_point: + return net, end_points + raise ValueError('Unknown final endpoint %s' % final_endpoint) + + +def s3dg(inputs, + num_classes=1000, + first_temporal_kernel_size=3, + temporal_conv_startat='Conv2d_2c_3x3', + gating_startat='Conv2d_2c_3x3', + final_endpoint='Mixed_5c', + min_depth=16, + depth_multiplier=1.0, + dropout_keep_prob=0.8, + is_training=True, + prediction_fn=layers.softmax, + spatial_squeeze=True, + reuse=None, + data_format='NDHWC', + scope='InceptionV1'): + """Defines the S3D-G architecture. + + The default image size used to train this network is 224x224. + + Args: + inputs: A 5-D float tensor of size [batch_size, num_frames, height, width, + channels]. + num_classes: number of predicted classes. + first_temporal_kernel_size: Specifies the temporal kernel size for the first + conv3d filter. A larger value slows down the model but provides little + accuracy improvement. Must be set to one of 1, 3, 5 or 7. + temporal_conv_startat: Specifies the first conv block to use separable 3D + convs rather than 2D convs (implemented as [1, k, k] 3D conv). This is + used to construct the inverted pyramid models. 'Conv2d_2c_3x3' is the + first valid block to use separable 3D convs. If provided block name is + not present, all valid blocks will use separable 3D convs. + gating_startat: Specifies the first conv block to use self gating. + 'Conv2d_2c_3x3' is the first valid block to use self gating. If provided + block name is not present, all valid blocks will use separable 3D convs. + final_endpoint: Specifies the endpoint to construct the network up to. It + can be one of ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', 'Mixed_4e', + 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', 'Mixed_5c'] + min_depth: Minimum depth value (number of channels) for all convolution ops. + Enforced when depth_multiplier < 1, and not an active constraint when + depth_multiplier >= 1. + depth_multiplier: Float multiplier for the depth (number of channels) + for all convolution ops. The value must be greater than zero. Typical + usage will be to set this value in (0, 1) to reduce the number of + parameters or computation cost of the model. + dropout_keep_prob: the percentage of activation values that are retained. + is_training: whether is training or not. + prediction_fn: a function to get predictions out of logits. + spatial_squeeze: if True, logits is of shape is [B, C], if false logits is + of shape [B, 1, 1, C], where B is batch_size and C is number of classes. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + data_format: An optional string from: "NDHWC", "NCDHW". Defaults to "NDHWC". + The data format of the input and output data. With the default format + "NDHWC", the data is stored in the order of: [batch, in_depth, in_height, + in_width, in_channels]. Alternatively, the format could be "NCDHW", the + data storage order is: + [batch, in_channels, in_depth, in_height, in_width]. + scope: Optional variable_scope. + + Returns: + logits: the pre-softmax activations, a tensor of size + [batch_size, num_classes] + end_points: a dictionary from components of the network to the corresponding + activation. + """ + assert data_format in ['NDHWC', 'NCDHW'] + # Final pooling and prediction + with tf.compat.v1.variable_scope( + scope, 'InceptionV1', [inputs, num_classes], reuse=reuse) as scope: + with arg_scope( + [layers.batch_norm, layers.dropout], is_training=is_training): + net, end_points = s3dg_base( + inputs, + first_temporal_kernel_size=first_temporal_kernel_size, + temporal_conv_startat=temporal_conv_startat, + gating_startat=gating_startat, + final_endpoint=final_endpoint, + min_depth=min_depth, + depth_multiplier=depth_multiplier, + data_format=data_format, + scope=scope) + with tf.compat.v1.variable_scope('Logits'): + if data_format.startswith('NC'): + net = tf.transpose(a=net, perm=[0, 2, 3, 4, 1]) + kernel_size = i3d_utils.reduced_kernel_size_3d(net, [2, 7, 7]) + net = layers.avg_pool3d( + net, + kernel_size, + stride=1, + data_format='NDHWC', + scope='AvgPool_0a_7x7') + net = layers.dropout(net, dropout_keep_prob, scope='Dropout_0b') + logits = layers.conv3d( + net, + num_classes, [1, 1, 1], + activation_fn=None, + normalizer_fn=None, + data_format='NDHWC', + scope='Conv2d_0c_1x1') + # Temporal average pooling. + logits = tf.reduce_mean(input_tensor=logits, axis=1) + if spatial_squeeze: + logits = tf.squeeze(logits, [1, 2], name='SpatialSqueeze') + + end_points['Logits'] = logits + end_points['Predictions'] = prediction_fn(logits, scope='Predictions') + return logits, end_points + + +s3dg.default_image_size = 224 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg_test.py new file mode 100644 index 0000000..c3dc57c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/s3dg_test.py @@ -0,0 +1,150 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for networks.s3dg.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from nets import s3dg + + +class S3DGTest(tf.test.TestCase): + + def testBuildClassificationNetwork(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + num_classes = 1000 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + logits, end_points = s3dg.s3dg(inputs, num_classes) + self.assertTrue(logits.op.name.startswith('InceptionV1/Logits')) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + self.assertTrue('Predictions' in end_points) + self.assertListEqual(end_points['Predictions'].get_shape().as_list(), + [batch_size, num_classes]) + + def testBuildBaseNetwork(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_6c, end_points = s3dg.s3dg_base(inputs) + self.assertTrue(mixed_6c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_6c.get_shape().as_list(), + [batch_size, 8, 7, 7, 1024]) + expected_endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', + 'Mixed_3c', 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', + 'Mixed_4d', 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', + 'Mixed_5b', 'Mixed_5c'] + self.assertItemsEqual(end_points.keys(), expected_endpoints) + + def testBuildOnlyUptoFinalEndpointNoGating(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + endpoints = ['Conv2d_1a_7x7', 'MaxPool_2a_3x3', 'Conv2d_2b_1x1', + 'Conv2d_2c_3x3', 'MaxPool_3a_3x3', 'Mixed_3b', 'Mixed_3c', + 'MaxPool_4a_3x3', 'Mixed_4b', 'Mixed_4c', 'Mixed_4d', + 'Mixed_4e', 'Mixed_4f', 'MaxPool_5a_2x2', 'Mixed_5b', + 'Mixed_5c'] + for index, endpoint in enumerate(endpoints): + with tf.Graph().as_default(): + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + out_tensor, end_points = s3dg.s3dg_base( + inputs, final_endpoint=endpoint, gating_startat=None) + print(endpoint, out_tensor.op.name) + self.assertTrue(out_tensor.op.name.startswith( + 'InceptionV1/' + endpoint)) + self.assertItemsEqual(endpoints[:index+1], end_points) + + def testBuildAndCheckAllEndPointsUptoMixed5c(self): + batch_size = 5 + num_frames = 64 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + _, end_points = s3dg.s3dg_base(inputs, + final_endpoint='Mixed_5c') + endpoints_shapes = {'Conv2d_1a_7x7': [5, 32, 112, 112, 64], + 'MaxPool_2a_3x3': [5, 32, 56, 56, 64], + 'Conv2d_2b_1x1': [5, 32, 56, 56, 64], + 'Conv2d_2c_3x3': [5, 32, 56, 56, 192], + 'MaxPool_3a_3x3': [5, 32, 28, 28, 192], + 'Mixed_3b': [5, 32, 28, 28, 256], + 'Mixed_3c': [5, 32, 28, 28, 480], + 'MaxPool_4a_3x3': [5, 16, 14, 14, 480], + 'Mixed_4b': [5, 16, 14, 14, 512], + 'Mixed_4c': [5, 16, 14, 14, 512], + 'Mixed_4d': [5, 16, 14, 14, 512], + 'Mixed_4e': [5, 16, 14, 14, 528], + 'Mixed_4f': [5, 16, 14, 14, 832], + 'MaxPool_5a_2x2': [5, 8, 7, 7, 832], + 'Mixed_5b': [5, 8, 7, 7, 832], + 'Mixed_5c': [5, 8, 7, 7, 1024]} + + self.assertItemsEqual(endpoints_shapes.keys(), end_points.keys()) + for endpoint_name, expected_shape in endpoints_shapes.iteritems(): + self.assertTrue(endpoint_name in end_points) + self.assertListEqual(end_points[endpoint_name].get_shape().as_list(), + expected_shape) + + def testHalfSizeImages(self): + batch_size = 5 + num_frames = 64 + height, width = 112, 112 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_5c, _ = s3dg.s3dg_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 8, 4, 4, 1024]) + + def testTenFrames(self): + batch_size = 5 + num_frames = 10 + height, width = 224, 224 + + inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + mixed_5c, _ = s3dg.s3dg_base(inputs) + self.assertTrue(mixed_5c.op.name.startswith('InceptionV1/Mixed_5c')) + self.assertListEqual(mixed_5c.get_shape().as_list(), + [batch_size, 2, 7, 7, 1024]) + + def testEvaluation(self): + batch_size = 2 + num_frames = 64 + height, width = 224, 224 + num_classes = 1000 + + eval_inputs = tf.random.uniform((batch_size, num_frames, height, width, 3)) + logits, _ = s3dg.s3dg(eval_inputs, num_classes, + is_training=False) + predictions = tf.argmax(input=logits, axis=1) + + with self.test_session() as sess: + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(predictions) + self.assertEquals(output.shape, (batch_size,)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg.py new file mode 100644 index 0000000..2f30a74 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg.py @@ -0,0 +1,317 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains model definitions for versions of the Oxford VGG network. + +These model definitions were introduced in the following technical report: + + Very Deep Convolutional Networks For Large-Scale Image Recognition + Karen Simonyan and Andrew Zisserman + arXiv technical report, 2015 + PDF: http://arxiv.org/pdf/1409.1556.pdf + ILSVRC 2014 Slides: http://www.robots.ox.ac.uk/~karen/pdf/ILSVRC_2014.pdf + CC-BY-4.0 + +More information can be obtained from the VGG website: +www.robots.ox.ac.uk/~vgg/research/very_deep/ + +Usage: + with slim.arg_scope(vgg.vgg_arg_scope()): + outputs, end_points = vgg.vgg_a(inputs) + + with slim.arg_scope(vgg.vgg_arg_scope()): + outputs, end_points = vgg.vgg_16(inputs) + +@@vgg_a +@@vgg_16 +@@vgg_19 +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def vgg_arg_scope(weight_decay=0.0005): + """Defines the VGG arg scope. + + Args: + weight_decay: The l2 regularization coefficient. + + Returns: + An arg_scope. + """ + with slim.arg_scope([slim.conv2d, slim.fully_connected], + activation_fn=tf.nn.relu, + weights_regularizer=slim.l2_regularizer(weight_decay), + biases_initializer=tf.compat.v1.zeros_initializer()): + with slim.arg_scope([slim.conv2d], padding='SAME') as arg_sc: + return arg_sc + + +def vgg_a(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.5, + spatial_squeeze=True, + reuse=None, + scope='vgg_a', + fc_conv_padding='VALID', + global_pool=False): + """Oxford Net VGG 11-Layers version A Example. + + Note: All the fully_connected layers have been transformed to conv2d layers. + To use in classification mode, resize input to 224x224. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer is + omitted and the input features to the logits layer are returned instead. + is_training: whether or not the model is being trained. + dropout_keep_prob: the probability that activations are kept in the dropout + layers during training. + spatial_squeeze: whether or not should squeeze the spatial dimensions of the + outputs. Useful to remove unnecessary dimensions for classification. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional scope for the variables. + fc_conv_padding: the type of padding to use for the fully connected layer + that is implemented as a convolutional layer. Use 'SAME' padding if you + are applying the network in a fully convolutional manner and want to + get a prediction map downsampled by a factor of 32 as an output. + Otherwise, the output prediction map will be (input / 32) - 6 in case of + 'VALID' padding. + global_pool: Optional boolean flag. If True, the input to the classification + layer is avgpooled to size 1x1, for any input size. (This is not part + of the original VGG architecture.) + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the input to the logits layer (if num_classes is 0 or None). + end_points: a dict of tensors with intermediate activations. + """ + with tf.compat.v1.variable_scope(scope, 'vgg_a', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + # Collect outputs for conv2d, fully_connected and max_pool2d. + with slim.arg_scope([slim.conv2d, slim.max_pool2d], + outputs_collections=end_points_collection): + net = slim.repeat(inputs, 1, slim.conv2d, 64, [3, 3], scope='conv1') + net = slim.max_pool2d(net, [2, 2], scope='pool1') + net = slim.repeat(net, 1, slim.conv2d, 128, [3, 3], scope='conv2') + net = slim.max_pool2d(net, [2, 2], scope='pool2') + net = slim.repeat(net, 2, slim.conv2d, 256, [3, 3], scope='conv3') + net = slim.max_pool2d(net, [2, 2], scope='pool3') + net = slim.repeat(net, 2, slim.conv2d, 512, [3, 3], scope='conv4') + net = slim.max_pool2d(net, [2, 2], scope='pool4') + net = slim.repeat(net, 2, slim.conv2d, 512, [3, 3], scope='conv5') + net = slim.max_pool2d(net, [2, 2], scope='pool5') + + # Use conv2d instead of fully_connected layers. + net = slim.conv2d(net, 4096, [7, 7], padding=fc_conv_padding, scope='fc6') + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout6') + net = slim.conv2d(net, 4096, [1, 1], scope='fc7') + # Convert end_points_collection into a end_point dict. + end_points = slim.utils.convert_collection_to_dict(end_points_collection) + if global_pool: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if num_classes: + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout7') + net = slim.conv2d(net, num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + scope='fc8') + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='fc8/squeezed') + end_points[sc.name + '/fc8'] = net + return net, end_points +vgg_a.default_image_size = 224 + + +def vgg_16(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.5, + spatial_squeeze=True, + reuse=None, + scope='vgg_16', + fc_conv_padding='VALID', + global_pool=False): + """Oxford Net VGG 16-Layers version D Example. + + Note: All the fully_connected layers have been transformed to conv2d layers. + To use in classification mode, resize input to 224x224. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer is + omitted and the input features to the logits layer are returned instead. + is_training: whether or not the model is being trained. + dropout_keep_prob: the probability that activations are kept in the dropout + layers during training. + spatial_squeeze: whether or not should squeeze the spatial dimensions of the + outputs. Useful to remove unnecessary dimensions for classification. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional scope for the variables. + fc_conv_padding: the type of padding to use for the fully connected layer + that is implemented as a convolutional layer. Use 'SAME' padding if you + are applying the network in a fully convolutional manner and want to + get a prediction map downsampled by a factor of 32 as an output. + Otherwise, the output prediction map will be (input / 32) - 6 in case of + 'VALID' padding. + global_pool: Optional boolean flag. If True, the input to the classification + layer is avgpooled to size 1x1, for any input size. (This is not part + of the original VGG architecture.) + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the input to the logits layer (if num_classes is 0 or None). + end_points: a dict of tensors with intermediate activations. + """ + with tf.compat.v1.variable_scope( + scope, 'vgg_16', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + # Collect outputs for conv2d, fully_connected and max_pool2d. + with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.max_pool2d], + outputs_collections=end_points_collection): + net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1') + net = slim.max_pool2d(net, [2, 2], scope='pool1') + net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2') + net = slim.max_pool2d(net, [2, 2], scope='pool2') + net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3') + net = slim.max_pool2d(net, [2, 2], scope='pool3') + net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4') + net = slim.max_pool2d(net, [2, 2], scope='pool4') + net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5') + net = slim.max_pool2d(net, [2, 2], scope='pool5') + + # Use conv2d instead of fully_connected layers. + net = slim.conv2d(net, 4096, [7, 7], padding=fc_conv_padding, scope='fc6') + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout6') + net = slim.conv2d(net, 4096, [1, 1], scope='fc7') + # Convert end_points_collection into a end_point dict. + end_points = slim.utils.convert_collection_to_dict(end_points_collection) + if global_pool: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if num_classes: + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout7') + net = slim.conv2d(net, num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + scope='fc8') + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='fc8/squeezed') + end_points[sc.name + '/fc8'] = net + return net, end_points +vgg_16.default_image_size = 224 + + +def vgg_19(inputs, + num_classes=1000, + is_training=True, + dropout_keep_prob=0.5, + spatial_squeeze=True, + reuse=None, + scope='vgg_19', + fc_conv_padding='VALID', + global_pool=False): + """Oxford Net VGG 19-Layers version E Example. + + Note: All the fully_connected layers have been transformed to conv2d layers. + To use in classification mode, resize input to 224x224. + + Args: + inputs: a tensor of size [batch_size, height, width, channels]. + num_classes: number of predicted classes. If 0 or None, the logits layer is + omitted and the input features to the logits layer are returned instead. + is_training: whether or not the model is being trained. + dropout_keep_prob: the probability that activations are kept in the dropout + layers during training. + spatial_squeeze: whether or not should squeeze the spatial dimensions of the + outputs. Useful to remove unnecessary dimensions for classification. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional scope for the variables. + fc_conv_padding: the type of padding to use for the fully connected layer + that is implemented as a convolutional layer. Use 'SAME' padding if you + are applying the network in a fully convolutional manner and want to + get a prediction map downsampled by a factor of 32 as an output. + Otherwise, the output prediction map will be (input / 32) - 6 in case of + 'VALID' padding. + global_pool: Optional boolean flag. If True, the input to the classification + layer is avgpooled to size 1x1, for any input size. (This is not part + of the original VGG architecture.) + + Returns: + net: the output of the logits layer (if num_classes is a non-zero integer), + or the non-dropped-out input to the logits layer (if num_classes is 0 or + None). + end_points: a dict of tensors with intermediate activations. + """ + with tf.compat.v1.variable_scope( + scope, 'vgg_19', [inputs], reuse=reuse) as sc: + end_points_collection = sc.original_name_scope + '_end_points' + # Collect outputs for conv2d, fully_connected and max_pool2d. + with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.max_pool2d], + outputs_collections=end_points_collection): + net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1') + net = slim.max_pool2d(net, [2, 2], scope='pool1') + net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2') + net = slim.max_pool2d(net, [2, 2], scope='pool2') + net = slim.repeat(net, 4, slim.conv2d, 256, [3, 3], scope='conv3') + net = slim.max_pool2d(net, [2, 2], scope='pool3') + net = slim.repeat(net, 4, slim.conv2d, 512, [3, 3], scope='conv4') + net = slim.max_pool2d(net, [2, 2], scope='pool4') + net = slim.repeat(net, 4, slim.conv2d, 512, [3, 3], scope='conv5') + net = slim.max_pool2d(net, [2, 2], scope='pool5') + + # Use conv2d instead of fully_connected layers. + net = slim.conv2d(net, 4096, [7, 7], padding=fc_conv_padding, scope='fc6') + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout6') + net = slim.conv2d(net, 4096, [1, 1], scope='fc7') + # Convert end_points_collection into a end_point dict. + end_points = slim.utils.convert_collection_to_dict(end_points_collection) + if global_pool: + net = tf.reduce_mean( + input_tensor=net, axis=[1, 2], keepdims=True, name='global_pool') + end_points['global_pool'] = net + if num_classes: + net = slim.dropout(net, dropout_keep_prob, is_training=is_training, + scope='dropout7') + net = slim.conv2d(net, num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + scope='fc8') + if spatial_squeeze: + net = tf.squeeze(net, [1, 2], name='fc8/squeezed') + end_points[sc.name + '/fc8'] = net + return net, end_points +vgg_19.default_image_size = 224 + +# Alias +vgg_d = vgg_16 +vgg_e = vgg_19 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg_test.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg_test.py new file mode 100644 index 0000000..988c3db --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/nets/vgg_test.py @@ -0,0 +1,584 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for slim.nets.vgg.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +from nets import vgg + +slim = contrib_slim + + +class VGGATest(tf.test.TestCase): + + def testBuild(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_a(inputs, num_classes) + self.assertEquals(logits.op.name, 'vgg_a/fc8/squeezed') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testFullyConvolutional(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_a(inputs, num_classes, spatial_squeeze=False) + self.assertEquals(logits.op.name, 'vgg_a/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 2, 2, num_classes]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_a(inputs, num_classes, spatial_squeeze=False, + global_pool=True) + self.assertEquals(logits.op.name, 'vgg_a/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 1, 1, num_classes]) + + def testEndPoints(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = vgg.vgg_a(inputs, num_classes) + expected_names = ['vgg_a/conv1/conv1_1', + 'vgg_a/pool1', + 'vgg_a/conv2/conv2_1', + 'vgg_a/pool2', + 'vgg_a/conv3/conv3_1', + 'vgg_a/conv3/conv3_2', + 'vgg_a/pool3', + 'vgg_a/conv4/conv4_1', + 'vgg_a/conv4/conv4_2', + 'vgg_a/pool4', + 'vgg_a/conv5/conv5_1', + 'vgg_a/conv5/conv5_2', + 'vgg_a/pool5', + 'vgg_a/fc6', + 'vgg_a/fc7', + 'vgg_a/fc8' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + + def testNoClasses(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = vgg.vgg_a(inputs, num_classes) + expected_names = ['vgg_a/conv1/conv1_1', + 'vgg_a/pool1', + 'vgg_a/conv2/conv2_1', + 'vgg_a/pool2', + 'vgg_a/conv3/conv3_1', + 'vgg_a/conv3/conv3_2', + 'vgg_a/pool3', + 'vgg_a/conv4/conv4_1', + 'vgg_a/conv4/conv4_2', + 'vgg_a/pool4', + 'vgg_a/conv5/conv5_1', + 'vgg_a/conv5/conv5_2', + 'vgg_a/pool5', + 'vgg_a/fc6', + 'vgg_a/fc7', + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + self.assertTrue(net.op.name.startswith('vgg_a/fc7')) + + def testModelVariables(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + vgg.vgg_a(inputs, num_classes) + expected_names = ['vgg_a/conv1/conv1_1/weights', + 'vgg_a/conv1/conv1_1/biases', + 'vgg_a/conv2/conv2_1/weights', + 'vgg_a/conv2/conv2_1/biases', + 'vgg_a/conv3/conv3_1/weights', + 'vgg_a/conv3/conv3_1/biases', + 'vgg_a/conv3/conv3_2/weights', + 'vgg_a/conv3/conv3_2/biases', + 'vgg_a/conv4/conv4_1/weights', + 'vgg_a/conv4/conv4_1/biases', + 'vgg_a/conv4/conv4_2/weights', + 'vgg_a/conv4/conv4_2/biases', + 'vgg_a/conv5/conv5_1/weights', + 'vgg_a/conv5/conv5_1/biases', + 'vgg_a/conv5/conv5_2/weights', + 'vgg_a/conv5/conv5_2/biases', + 'vgg_a/fc6/weights', + 'vgg_a/fc6/biases', + 'vgg_a/fc7/weights', + 'vgg_a/fc7/biases', + 'vgg_a/fc8/weights', + 'vgg_a/fc8/biases', + ] + model_variables = [v.op.name for v in slim.get_model_variables()] + self.assertSetEqual(set(model_variables), set(expected_names)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_a(eval_inputs, is_training=False) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + predictions = tf.argmax(input=logits, axis=1) + self.assertListEqual(predictions.get_shape().as_list(), [batch_size]) + + def testTrainEvalWithReuse(self): + train_batch_size = 2 + eval_batch_size = 1 + train_height, train_width = 224, 224 + eval_height, eval_width = 256, 256 + num_classes = 1000 + with self.test_session(): + train_inputs = tf.random.uniform( + (train_batch_size, train_height, train_width, 3)) + logits, _ = vgg.vgg_a(train_inputs) + self.assertListEqual(logits.get_shape().as_list(), + [train_batch_size, num_classes]) + tf.compat.v1.get_variable_scope().reuse_variables() + eval_inputs = tf.random.uniform( + (eval_batch_size, eval_height, eval_width, 3)) + logits, _ = vgg.vgg_a(eval_inputs, is_training=False, + spatial_squeeze=False) + self.assertListEqual(logits.get_shape().as_list(), + [eval_batch_size, 2, 2, num_classes]) + logits = tf.reduce_mean(input_tensor=logits, axis=[1, 2]) + predictions = tf.argmax(input=logits, axis=1) + self.assertEquals(predictions.get_shape().as_list(), [eval_batch_size]) + + def testForward(self): + batch_size = 1 + height, width = 224, 224 + with self.test_session() as sess: + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_a(inputs) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits) + self.assertTrue(output.any()) + + +class VGG16Test(tf.test.TestCase): + + def testBuild(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_16(inputs, num_classes) + self.assertEquals(logits.op.name, 'vgg_16/fc8/squeezed') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testFullyConvolutional(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_16(inputs, num_classes, spatial_squeeze=False) + self.assertEquals(logits.op.name, 'vgg_16/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 2, 2, num_classes]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_16(inputs, num_classes, spatial_squeeze=False, + global_pool=True) + self.assertEquals(logits.op.name, 'vgg_16/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 1, 1, num_classes]) + + def testEndPoints(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = vgg.vgg_16(inputs, num_classes) + expected_names = ['vgg_16/conv1/conv1_1', + 'vgg_16/conv1/conv1_2', + 'vgg_16/pool1', + 'vgg_16/conv2/conv2_1', + 'vgg_16/conv2/conv2_2', + 'vgg_16/pool2', + 'vgg_16/conv3/conv3_1', + 'vgg_16/conv3/conv3_2', + 'vgg_16/conv3/conv3_3', + 'vgg_16/pool3', + 'vgg_16/conv4/conv4_1', + 'vgg_16/conv4/conv4_2', + 'vgg_16/conv4/conv4_3', + 'vgg_16/pool4', + 'vgg_16/conv5/conv5_1', + 'vgg_16/conv5/conv5_2', + 'vgg_16/conv5/conv5_3', + 'vgg_16/pool5', + 'vgg_16/fc6', + 'vgg_16/fc7', + 'vgg_16/fc8' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + + def testNoClasses(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = vgg.vgg_16(inputs, num_classes) + expected_names = ['vgg_16/conv1/conv1_1', + 'vgg_16/conv1/conv1_2', + 'vgg_16/pool1', + 'vgg_16/conv2/conv2_1', + 'vgg_16/conv2/conv2_2', + 'vgg_16/pool2', + 'vgg_16/conv3/conv3_1', + 'vgg_16/conv3/conv3_2', + 'vgg_16/conv3/conv3_3', + 'vgg_16/pool3', + 'vgg_16/conv4/conv4_1', + 'vgg_16/conv4/conv4_2', + 'vgg_16/conv4/conv4_3', + 'vgg_16/pool4', + 'vgg_16/conv5/conv5_1', + 'vgg_16/conv5/conv5_2', + 'vgg_16/conv5/conv5_3', + 'vgg_16/pool5', + 'vgg_16/fc6', + 'vgg_16/fc7', + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + self.assertTrue(net.op.name.startswith('vgg_16/fc7')) + + def testModelVariables(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + vgg.vgg_16(inputs, num_classes) + expected_names = ['vgg_16/conv1/conv1_1/weights', + 'vgg_16/conv1/conv1_1/biases', + 'vgg_16/conv1/conv1_2/weights', + 'vgg_16/conv1/conv1_2/biases', + 'vgg_16/conv2/conv2_1/weights', + 'vgg_16/conv2/conv2_1/biases', + 'vgg_16/conv2/conv2_2/weights', + 'vgg_16/conv2/conv2_2/biases', + 'vgg_16/conv3/conv3_1/weights', + 'vgg_16/conv3/conv3_1/biases', + 'vgg_16/conv3/conv3_2/weights', + 'vgg_16/conv3/conv3_2/biases', + 'vgg_16/conv3/conv3_3/weights', + 'vgg_16/conv3/conv3_3/biases', + 'vgg_16/conv4/conv4_1/weights', + 'vgg_16/conv4/conv4_1/biases', + 'vgg_16/conv4/conv4_2/weights', + 'vgg_16/conv4/conv4_2/biases', + 'vgg_16/conv4/conv4_3/weights', + 'vgg_16/conv4/conv4_3/biases', + 'vgg_16/conv5/conv5_1/weights', + 'vgg_16/conv5/conv5_1/biases', + 'vgg_16/conv5/conv5_2/weights', + 'vgg_16/conv5/conv5_2/biases', + 'vgg_16/conv5/conv5_3/weights', + 'vgg_16/conv5/conv5_3/biases', + 'vgg_16/fc6/weights', + 'vgg_16/fc6/biases', + 'vgg_16/fc7/weights', + 'vgg_16/fc7/biases', + 'vgg_16/fc8/weights', + 'vgg_16/fc8/biases', + ] + model_variables = [v.op.name for v in slim.get_model_variables()] + self.assertSetEqual(set(model_variables), set(expected_names)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_16(eval_inputs, is_training=False) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + predictions = tf.argmax(input=logits, axis=1) + self.assertListEqual(predictions.get_shape().as_list(), [batch_size]) + + def testTrainEvalWithReuse(self): + train_batch_size = 2 + eval_batch_size = 1 + train_height, train_width = 224, 224 + eval_height, eval_width = 256, 256 + num_classes = 1000 + with self.test_session(): + train_inputs = tf.random.uniform( + (train_batch_size, train_height, train_width, 3)) + logits, _ = vgg.vgg_16(train_inputs) + self.assertListEqual(logits.get_shape().as_list(), + [train_batch_size, num_classes]) + tf.compat.v1.get_variable_scope().reuse_variables() + eval_inputs = tf.random.uniform( + (eval_batch_size, eval_height, eval_width, 3)) + logits, _ = vgg.vgg_16(eval_inputs, is_training=False, + spatial_squeeze=False) + self.assertListEqual(logits.get_shape().as_list(), + [eval_batch_size, 2, 2, num_classes]) + logits = tf.reduce_mean(input_tensor=logits, axis=[1, 2]) + predictions = tf.argmax(input=logits, axis=1) + self.assertEquals(predictions.get_shape().as_list(), [eval_batch_size]) + + def testForward(self): + batch_size = 1 + height, width = 224, 224 + with self.test_session() as sess: + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_16(inputs) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits) + self.assertTrue(output.any()) + + +class VGG19Test(tf.test.TestCase): + + def testBuild(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_19(inputs, num_classes) + self.assertEquals(logits.op.name, 'vgg_19/fc8/squeezed') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + + def testFullyConvolutional(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_19(inputs, num_classes, spatial_squeeze=False) + self.assertEquals(logits.op.name, 'vgg_19/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 2, 2, num_classes]) + + def testGlobalPool(self): + batch_size = 1 + height, width = 256, 256 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_19(inputs, num_classes, spatial_squeeze=False, + global_pool=True) + self.assertEquals(logits.op.name, 'vgg_19/fc8/BiasAdd') + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, 1, 1, num_classes]) + + def testEndPoints(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + _, end_points = vgg.vgg_19(inputs, num_classes) + expected_names = [ + 'vgg_19/conv1/conv1_1', + 'vgg_19/conv1/conv1_2', + 'vgg_19/pool1', + 'vgg_19/conv2/conv2_1', + 'vgg_19/conv2/conv2_2', + 'vgg_19/pool2', + 'vgg_19/conv3/conv3_1', + 'vgg_19/conv3/conv3_2', + 'vgg_19/conv3/conv3_3', + 'vgg_19/conv3/conv3_4', + 'vgg_19/pool3', + 'vgg_19/conv4/conv4_1', + 'vgg_19/conv4/conv4_2', + 'vgg_19/conv4/conv4_3', + 'vgg_19/conv4/conv4_4', + 'vgg_19/pool4', + 'vgg_19/conv5/conv5_1', + 'vgg_19/conv5/conv5_2', + 'vgg_19/conv5/conv5_3', + 'vgg_19/conv5/conv5_4', + 'vgg_19/pool5', + 'vgg_19/fc6', + 'vgg_19/fc7', + 'vgg_19/fc8' + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + + def testNoClasses(self): + batch_size = 5 + height, width = 224, 224 + num_classes = None + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + net, end_points = vgg.vgg_19(inputs, num_classes) + expected_names = [ + 'vgg_19/conv1/conv1_1', + 'vgg_19/conv1/conv1_2', + 'vgg_19/pool1', + 'vgg_19/conv2/conv2_1', + 'vgg_19/conv2/conv2_2', + 'vgg_19/pool2', + 'vgg_19/conv3/conv3_1', + 'vgg_19/conv3/conv3_2', + 'vgg_19/conv3/conv3_3', + 'vgg_19/conv3/conv3_4', + 'vgg_19/pool3', + 'vgg_19/conv4/conv4_1', + 'vgg_19/conv4/conv4_2', + 'vgg_19/conv4/conv4_3', + 'vgg_19/conv4/conv4_4', + 'vgg_19/pool4', + 'vgg_19/conv5/conv5_1', + 'vgg_19/conv5/conv5_2', + 'vgg_19/conv5/conv5_3', + 'vgg_19/conv5/conv5_4', + 'vgg_19/pool5', + 'vgg_19/fc6', + 'vgg_19/fc7', + ] + self.assertSetEqual(set(end_points.keys()), set(expected_names)) + self.assertTrue(net.op.name.startswith('vgg_19/fc7')) + + def testModelVariables(self): + batch_size = 5 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + inputs = tf.random.uniform((batch_size, height, width, 3)) + vgg.vgg_19(inputs, num_classes) + expected_names = [ + 'vgg_19/conv1/conv1_1/weights', + 'vgg_19/conv1/conv1_1/biases', + 'vgg_19/conv1/conv1_2/weights', + 'vgg_19/conv1/conv1_2/biases', + 'vgg_19/conv2/conv2_1/weights', + 'vgg_19/conv2/conv2_1/biases', + 'vgg_19/conv2/conv2_2/weights', + 'vgg_19/conv2/conv2_2/biases', + 'vgg_19/conv3/conv3_1/weights', + 'vgg_19/conv3/conv3_1/biases', + 'vgg_19/conv3/conv3_2/weights', + 'vgg_19/conv3/conv3_2/biases', + 'vgg_19/conv3/conv3_3/weights', + 'vgg_19/conv3/conv3_3/biases', + 'vgg_19/conv3/conv3_4/weights', + 'vgg_19/conv3/conv3_4/biases', + 'vgg_19/conv4/conv4_1/weights', + 'vgg_19/conv4/conv4_1/biases', + 'vgg_19/conv4/conv4_2/weights', + 'vgg_19/conv4/conv4_2/biases', + 'vgg_19/conv4/conv4_3/weights', + 'vgg_19/conv4/conv4_3/biases', + 'vgg_19/conv4/conv4_4/weights', + 'vgg_19/conv4/conv4_4/biases', + 'vgg_19/conv5/conv5_1/weights', + 'vgg_19/conv5/conv5_1/biases', + 'vgg_19/conv5/conv5_2/weights', + 'vgg_19/conv5/conv5_2/biases', + 'vgg_19/conv5/conv5_3/weights', + 'vgg_19/conv5/conv5_3/biases', + 'vgg_19/conv5/conv5_4/weights', + 'vgg_19/conv5/conv5_4/biases', + 'vgg_19/fc6/weights', + 'vgg_19/fc6/biases', + 'vgg_19/fc7/weights', + 'vgg_19/fc7/biases', + 'vgg_19/fc8/weights', + 'vgg_19/fc8/biases', + ] + model_variables = [v.op.name for v in slim.get_model_variables()] + self.assertSetEqual(set(model_variables), set(expected_names)) + + def testEvaluation(self): + batch_size = 2 + height, width = 224, 224 + num_classes = 1000 + with self.test_session(): + eval_inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_19(eval_inputs, is_training=False) + self.assertListEqual(logits.get_shape().as_list(), + [batch_size, num_classes]) + predictions = tf.argmax(input=logits, axis=1) + self.assertListEqual(predictions.get_shape().as_list(), [batch_size]) + + def testTrainEvalWithReuse(self): + train_batch_size = 2 + eval_batch_size = 1 + train_height, train_width = 224, 224 + eval_height, eval_width = 256, 256 + num_classes = 1000 + with self.test_session(): + train_inputs = tf.random.uniform( + (train_batch_size, train_height, train_width, 3)) + logits, _ = vgg.vgg_19(train_inputs) + self.assertListEqual(logits.get_shape().as_list(), + [train_batch_size, num_classes]) + tf.compat.v1.get_variable_scope().reuse_variables() + eval_inputs = tf.random.uniform( + (eval_batch_size, eval_height, eval_width, 3)) + logits, _ = vgg.vgg_19(eval_inputs, is_training=False, + spatial_squeeze=False) + self.assertListEqual(logits.get_shape().as_list(), + [eval_batch_size, 2, 2, num_classes]) + logits = tf.reduce_mean(input_tensor=logits, axis=[1, 2]) + predictions = tf.argmax(input=logits, axis=1) + self.assertEquals(predictions.get_shape().as_list(), [eval_batch_size]) + + def testForward(self): + batch_size = 1 + height, width = 224, 224 + with self.test_session() as sess: + inputs = tf.random.uniform((batch_size, height, width, 3)) + logits, _ = vgg.vgg_19(inputs) + sess.run(tf.compat.v1.global_variables_initializer()) + output = sess.run(logits) + self.assertTrue(output.any()) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/cifarnet_preprocessing.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/cifarnet_preprocessing.py new file mode 100644 index 0000000..2f66e77 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/cifarnet_preprocessing.py @@ -0,0 +1,150 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images in CIFAR-10. + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +_PADDING = 4 + +slim = contrib_slim + + +def preprocess_for_train(image, + output_height, + output_width, + padding=_PADDING, + add_image_summaries=True, + use_grayscale=False): + """Preprocesses the given image for training. + + Note that the actual resizing scale is sampled from + [`resize_size_min`, `resize_size_max`]. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + padding: The amound of padding before and after each dimension of the image. + add_image_summaries: Enable image summaries. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + if add_image_summaries: + tf.summary.image('image', tf.expand_dims(image, 0)) + + # Transform the image to floats. + image = tf.to_float(image) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + if padding > 0: + image = tf.pad(image, [[padding, padding], [padding, padding], [0, 0]]) + # Randomly crop a [height, width] section of the image. + distorted_image = tf.random_crop(image, + [output_height, output_width, 3]) + + # Randomly flip the image horizontally. + distorted_image = tf.image.random_flip_left_right(distorted_image) + + if add_image_summaries: + tf.summary.image('distorted_image', tf.expand_dims(distorted_image, 0)) + + # Because these operations are not commutative, consider randomizing + # the order their operation. + distorted_image = tf.image.random_brightness(distorted_image, + max_delta=63) + distorted_image = tf.image.random_contrast(distorted_image, + lower=0.2, upper=1.8) + # Subtract off the mean and divide by the variance of the pixels. + return tf.image.per_image_standardization(distorted_image) + + +def preprocess_for_eval(image, + output_height, + output_width, + add_image_summaries=True, + use_grayscale=False): + """Preprocesses the given image for evaluation. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + add_image_summaries: Enable image summaries. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + if add_image_summaries: + tf.summary.image('image', tf.expand_dims(image, 0)) + # Transform the image to floats. + image = tf.to_float(image) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + + # Resize and crop if needed. + resized_image = tf.image.resize_image_with_crop_or_pad(image, + output_width, + output_height) + if add_image_summaries: + tf.summary.image('resized_image', tf.expand_dims(resized_image, 0)) + + # Subtract off the mean and divide by the variance of the pixels. + return tf.image.per_image_standardization(resized_image) + + +def preprocess_image(image, + output_height, + output_width, + is_training=False, + add_image_summaries=True, + use_grayscale=False): + """Preprocesses the given image. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + add_image_summaries: Enable image summaries. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + if is_training: + return preprocess_for_train( + image, + output_height, + output_width, + add_image_summaries=add_image_summaries, + use_grayscale=use_grayscale) + else: + return preprocess_for_eval( + image, + output_height, + output_width, + add_image_summaries=add_image_summaries, + use_grayscale=use_grayscale) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/inception_preprocessing.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/inception_preprocessing.py new file mode 100644 index 0000000..1b58e66 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/inception_preprocessing.py @@ -0,0 +1,349 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images for the Inception networks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.ops import control_flow_ops + + +def apply_with_random_selector(x, func, num_cases): + """Computes func(x, sel), with sel sampled from [0...num_cases-1]. + + Args: + x: input Tensor. + func: Python function to apply. + num_cases: Python int32, number of cases to sample sel from. + + Returns: + The result of func(x, sel), where func receives the value of the + selector as a python integer, but sel is sampled dynamically. + """ + sel = tf.random_uniform([], maxval=num_cases, dtype=tf.int32) + # Pass the real x only to one of the func calls. + return control_flow_ops.merge([ + func(control_flow_ops.switch(x, tf.equal(sel, case))[1], case) + for case in range(num_cases)])[0] + + +def distort_color(image, color_ordering=0, fast_mode=True, scope=None): + """Distort the color of a Tensor image. + + Each color distortion is non-commutative and thus ordering of the color ops + matters. Ideally we would randomly permute the ordering of the color ops. + Rather then adding that level of complication, we select a distinct ordering + of color ops for each preprocessing thread. + + Args: + image: 3-D Tensor containing single image in [0, 1]. + color_ordering: Python int, a type of distortion (valid values: 0-3). + fast_mode: Avoids slower ops (random_hue and random_contrast) + scope: Optional scope for name_scope. + Returns: + 3-D Tensor color-distorted image on range [0, 1] + Raises: + ValueError: if color_ordering not in [0, 3] + """ + with tf.name_scope(scope, 'distort_color', [image]): + if fast_mode: + if color_ordering == 0: + image = tf.image.random_brightness(image, max_delta=32. / 255.) + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + else: + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + image = tf.image.random_brightness(image, max_delta=32. / 255.) + else: + if color_ordering == 0: + image = tf.image.random_brightness(image, max_delta=32. / 255.) + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + image = tf.image.random_hue(image, max_delta=0.2) + image = tf.image.random_contrast(image, lower=0.5, upper=1.5) + elif color_ordering == 1: + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + image = tf.image.random_brightness(image, max_delta=32. / 255.) + image = tf.image.random_contrast(image, lower=0.5, upper=1.5) + image = tf.image.random_hue(image, max_delta=0.2) + elif color_ordering == 2: + image = tf.image.random_contrast(image, lower=0.5, upper=1.5) + image = tf.image.random_hue(image, max_delta=0.2) + image = tf.image.random_brightness(image, max_delta=32. / 255.) + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + elif color_ordering == 3: + image = tf.image.random_hue(image, max_delta=0.2) + image = tf.image.random_saturation(image, lower=0.5, upper=1.5) + image = tf.image.random_contrast(image, lower=0.5, upper=1.5) + image = tf.image.random_brightness(image, max_delta=32. / 255.) + else: + raise ValueError('color_ordering must be in [0, 3]') + + # The random_* ops do not necessarily clamp. + return tf.clip_by_value(image, 0.0, 1.0) + + +def distorted_bounding_box_crop(image, + bbox, + min_object_covered=0.1, + aspect_ratio_range=(0.75, 1.33), + area_range=(0.05, 1.0), + max_attempts=100, + scope=None): + """Generates cropped_image using a one of the bboxes randomly distorted. + + See `tf.image.sample_distorted_bounding_box` for more documentation. + + Args: + image: 3-D Tensor of image (it will be converted to floats in [0, 1]). + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged + as [ymin, xmin, ymax, xmax]. If num_boxes is 0 then it would use the whole + image. + min_object_covered: An optional `float`. Defaults to `0.1`. The cropped + area of the image must contain at least this fraction of any bounding box + supplied. + aspect_ratio_range: An optional list of `floats`. The cropped area of the + image must have an aspect ratio = width / height within this range. + area_range: An optional list of `floats`. The cropped area of the image + must contain a fraction of the supplied image within in this range. + max_attempts: An optional `int`. Number of attempts at generating a cropped + region of the image of the specified constraints. After `max_attempts` + failures, return the entire image. + scope: Optional scope for name_scope. + Returns: + A tuple, a 3-D Tensor cropped_image and the distorted bbox + """ + with tf.name_scope(scope, 'distorted_bounding_box_crop', [image, bbox]): + # Each bounding box has shape [1, num_boxes, box coords] and + # the coordinates are ordered [ymin, xmin, ymax, xmax]. + + # A large fraction of image datasets contain a human-annotated bounding + # box delineating the region of the image containing the object of interest. + # We choose to create a new bounding box for the object which is a randomly + # distorted version of the human-annotated bounding box that obeys an + # allowed range of aspect ratios, sizes and overlap with the human-annotated + # bounding box. If no box is supplied, then we assume the bounding box is + # the entire image. + sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( + tf.shape(image), + bounding_boxes=bbox, + min_object_covered=min_object_covered, + aspect_ratio_range=aspect_ratio_range, + area_range=area_range, + max_attempts=max_attempts, + use_image_if_no_bounding_boxes=True) + bbox_begin, bbox_size, distort_bbox = sample_distorted_bounding_box + + # Crop the image to the specified bounding box. + cropped_image = tf.slice(image, bbox_begin, bbox_size) + return cropped_image, distort_bbox + + +def preprocess_for_train(image, height, width, bbox, fast_mode=True, scope=None, + add_image_summaries=True, random_crop=True, use_grayscale=False): + """Distort one image for training a network. + + Distorting images provides a useful technique for augmenting the data + set during training in order to make the network invariant to aspects + of the image that do not effect the label. + + Additionally it would create image_summaries to display the different + transformations applied to the image. + + Args: + image: 3-D Tensor of image. If dtype is tf.float32 then the range should be + [0, 1], otherwise it would converted to tf.float32 assuming that the range + is [0, MAX], where MAX is largest positive representable number for + int(8/16/32) data type (see `tf.image.convert_image_dtype` for details). + height: integer + width: integer + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged + as [ymin, xmin, ymax, xmax]. + fast_mode: Optional boolean, if True avoids slower transformations (i.e. + bi-cubic resizing, random_hue or random_contrast). + scope: Optional scope for name_scope. + add_image_summaries: Enable image summaries. + random_crop: Enable random cropping of images during preprocessing for + training. + use_grayscale: Whether to convert the image from RGB to grayscale. + Returns: + 3-D float Tensor of distorted image used for training with range [-1, 1]. + """ + with tf.name_scope(scope, 'distort_image', [image, height, width, bbox]): + if bbox is None: + bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4]) + if image.dtype != tf.float32: + image = tf.image.convert_image_dtype(image, dtype=tf.float32) + # Each bounding box has shape [1, num_boxes, box coords] and + # the coordinates are ordered [ymin, xmin, ymax, xmax]. + image_with_box = tf.image.draw_bounding_boxes(tf.expand_dims(image, 0), # xling --> (0.08, 1.0) + bbox) + if add_image_summaries: + tf.summary.image('image_with_bounding_boxes', image_with_box) + + if not random_crop: + distorted_image = image + else: + distorted_image, distorted_bbox = distorted_bounding_box_crop(image, bbox) + # Restore the shape since the dynamic slice based upon the bbox_size loses + # the third dimension. + distorted_image.set_shape([None, None, 3]) + image_with_distorted_box = tf.image.draw_bounding_boxes( + tf.expand_dims(image, 0), distorted_bbox) + if add_image_summaries: + tf.summary.image('images_with_distorted_bounding_box', + image_with_distorted_box) + + # This resizing operation may distort the images because the aspect + # ratio is not respected. We select a resize method in a round robin + # fashion based on the thread number. + # Note that ResizeMethod contains 4 enumerated resizing methods. + + # We select only 1 case for fast_mode bilinear. + num_resize_cases = 1 if fast_mode else 4 + distorted_image = apply_with_random_selector( + distorted_image, + lambda x, method: tf.image.resize_images(x, [height, width], method), + num_cases=num_resize_cases) + + if add_image_summaries: + tf.summary.image(('cropped_' if random_crop else '') + 'resized_image', + tf.expand_dims(distorted_image, 0)) + + # Randomly flip the image horizontally. + distorted_image = tf.image.random_flip_left_right(distorted_image) # xling -> 0.5? + + # Randomly distort the colors. There are 1 or 4 ways to do it. + num_distort_cases = 1 if fast_mode else 4 + distorted_image = apply_with_random_selector( + distorted_image, + lambda x, ordering: distort_color(x, ordering, fast_mode), # xling -> 0.4, 0.4, 0.4 + num_cases=num_distort_cases) + + if use_grayscale: + distorted_image = tf.image.rgb_to_grayscale(distorted_image) + + if add_image_summaries: + tf.summary.image('final_distorted_image', + tf.expand_dims(distorted_image, 0)) + + distorted_image = tf.subtract(distorted_image, 0.5) # xling: [485, 456, 406] + distorted_image = tf.multiply(distorted_image, 2.0) # xling: [229, 224, 225] + return distorted_image # xling: format? # xling: calling order? + + +def preprocess_for_eval(image, + height, # xling: 256 + width, # xling: 256 + central_fraction=0.875, + scope=None, + central_crop=True, + use_grayscale=False): + """Prepare one image for evaluation. + + If height and width are specified it would output an image with that size by + applying resize_bilinear. + + If central_fraction is specified it would crop the central fraction of the + input image. + + Args: + image: 3-D Tensor of image. If dtype is tf.float32 then the range should be + [0, 1], otherwise it would converted to tf.float32 assuming that the range + is [0, MAX], where MAX is largest positive representable number for + int(8/16/32) data type (see `tf.image.convert_image_dtype` for details). + height: integer + width: integer + central_fraction: Optional Float, fraction of the image to crop. + scope: Optional scope for name_scope. + central_crop: Enable central cropping of images during preprocessing for + evaluation. + use_grayscale: Whether to convert the image from RGB to grayscale. + Returns: + 3-D float Tensor of prepared image. + """ + with tf.name_scope(scope, 'eval_image', [image, height, width]): + if image.dtype != tf.float32: + image = tf.image.convert_image_dtype(image, dtype=tf.float32) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + # Crop the central region of the image with an area containing 87.5% of + # the original image. + if central_crop and central_fraction: + image = tf.image.central_crop(image, central_fraction=central_fraction) # xling: image_size? + + if height and width: + # Resize the image to the specified height and width. + image = tf.expand_dims(image, 0) + image = tf.image.resize_bilinear(image, [height, width], + align_corners=False) # xling: match calling order with ME + image = tf.squeeze(image, [0]) + image = tf.subtract(image, 0.5) # xling: + image = tf.multiply(image, 2.0) # xling: + return image + + +def preprocess_image(image, + height, + width, + is_training=False, + bbox=None, + fast_mode=True, + add_image_summaries=True, + crop_image=True, + use_grayscale=False): + """Pre-process one image for training or evaluation. + + Args: + image: 3-D Tensor [height, width, channels] with the image. If dtype is + tf.float32 then the range should be [0, 1], otherwise it would converted + to tf.float32 assuming that the range is [0, MAX], where MAX is largest + positive representable number for int(8/16/32) data type (see + `tf.image.convert_image_dtype` for details). + height: integer, image expected height. + width: integer, image expected width. + is_training: Boolean. If true it would transform an image for train, + otherwise it would transform it for evaluation. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + fast_mode: Optional boolean, if True avoids slower transformations. + add_image_summaries: Enable image summaries. + crop_image: Whether to enable cropping of images during preprocessing for + both training and evaluation. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + 3-D float Tensor containing an appropriately scaled image + + Raises: + ValueError: if user does not provide bounding box + """ + if is_training: + return preprocess_for_train(image, height, width, bbox, fast_mode, + add_image_summaries=add_image_summaries, random_crop=crop_image, + use_grayscale=use_grayscale) + else: + return preprocess_for_eval( + image, + height, + width, + central_crop=crop_image, + use_grayscale=use_grayscale) + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/lenet_preprocessing.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/lenet_preprocessing.py new file mode 100644 index 0000000..d5cdec9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/lenet_preprocessing.py @@ -0,0 +1,53 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities for preprocessing.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + + +def preprocess_image(image, + output_height, + output_width, + is_training, + use_grayscale=False): + """Preprocesses the given image. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + del is_training # Unused argument + image = tf.to_float(image) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + image = tf.image.resize_image_with_crop_or_pad( + image, output_width, output_height) + image = tf.subtract(image, 128.0) + image = tf.div(image, 128.0) + return image diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/preprocessing_factory.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/preprocessing_factory.py new file mode 100644 index 0000000..7d5b9d2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/preprocessing_factory.py @@ -0,0 +1,98 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains a factory for building various models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from tensorflow.contrib import slim as contrib_slim + +from preprocessing import cifarnet_preprocessing +from preprocessing import inception_preprocessing +from preprocessing import lenet_preprocessing +from preprocessing import vgg_preprocessing + +slim = contrib_slim + + +def get_preprocessing(name, is_training=False, use_grayscale=False, add_image_summaries=False): + """Returns preprocessing_fn(image, height, width, **kwargs). + + Args: + name: The name of the preprocessing function. + is_training: `True` if the model is being used for training and `False` + otherwise. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + preprocessing_fn: A function that preprocessing a single image (pre-batch). + It has the following signature: + image = preprocessing_fn(image, output_height, output_width, ...). + + Raises: + ValueError: If Preprocessing `name` is not recognized. + """ + preprocessing_fn_map = { + 'cifarnet': cifarnet_preprocessing, + 'inception': inception_preprocessing, + 'inception_v1': inception_preprocessing, + 'inception_v2': inception_preprocessing, + 'inception_v3': inception_preprocessing, + 'inception_v4': inception_preprocessing, + 'inception_resnet_v2': inception_preprocessing, + 'lenet': lenet_preprocessing, + 'mobilenet_v1': inception_preprocessing, + 'mobilenet_v2': inception_preprocessing, + 'mobilenet_v2_035': inception_preprocessing, + 'mobilenet_v3_small': inception_preprocessing, + 'mobilenet_v3_large': inception_preprocessing, + 'mobilenet_v3_small_minimalistic': inception_preprocessing, + 'mobilenet_v3_large_minimalistic': inception_preprocessing, + 'mobilenet_edgetpu': inception_preprocessing, + 'mobilenet_edgetpu_075': inception_preprocessing, + 'mobilenet_v2_140': inception_preprocessing, + 'nasnet_mobile': inception_preprocessing, + 'nasnet_large': inception_preprocessing, + 'pnasnet_mobile': inception_preprocessing, + 'pnasnet_large': inception_preprocessing, + 'resnet_v1_50': vgg_preprocessing, + 'resnet_v1_101': vgg_preprocessing, + 'resnet_v1_152': vgg_preprocessing, + 'resnet_v1_200': vgg_preprocessing, + 'resnet_v2_50': vgg_preprocessing, + 'resnet_v2_101': vgg_preprocessing, + 'resnet_v2_152': vgg_preprocessing, + 'resnet_v2_200': vgg_preprocessing, + 'vgg': vgg_preprocessing, + 'vgg_a': vgg_preprocessing, + 'vgg_16': vgg_preprocessing, + 'vgg_19': vgg_preprocessing, + } + + if name not in preprocessing_fn_map: + raise ValueError('Preprocessing name [%s] was not recognized' % name) + + def preprocessing_fn(image, output_height, output_width, **kwargs): + return preprocessing_fn_map[name].preprocess_image( + image, + output_height, + output_width, + is_training=is_training, + use_grayscale=use_grayscale, + add_image_summaries=add_image_summaries, + **kwargs) + + return preprocessing_fn + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/vgg_preprocessing.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/vgg_preprocessing.py new file mode 100644 index 0000000..ae1db14 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/preprocessing/vgg_preprocessing.py @@ -0,0 +1,383 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images. + +The preprocessing steps for VGG were introduced in the following technical +report: + + Very Deep Convolutional Networks For Large-Scale Image Recognition + Karen Simonyan and Andrew Zisserman + arXiv technical report, 2015 + PDF: http://arxiv.org/pdf/1409.1556.pdf + ILSVRC 2014 Slides: http://www.robots.ox.ac.uk/~karen/pdf/ILSVRC_2014.pdf + CC-BY-4.0 + +More information can be obtained from the VGG website: +www.robots.ox.ac.uk/~vgg/research/very_deep/ +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from tensorflow.contrib import slim as contrib_slim + +slim = contrib_slim + +_R_MEAN = 123.68 +_G_MEAN = 116.78 +_B_MEAN = 103.94 + +_RESIZE_SIDE_MIN = 256 +_RESIZE_SIDE_MAX = 512 + + +def _crop(image, offset_height, offset_width, crop_height, crop_width): + """Crops the given image using the provided offsets and sizes. + + Note that the method doesn't assume we know the input image size but it does + assume we know the input image rank. + + Args: + image: an image of shape [height, width, channels]. + offset_height: a scalar tensor indicating the height offset. + offset_width: a scalar tensor indicating the width offset. + crop_height: the height of the cropped image. + crop_width: the width of the cropped image. + + Returns: + the cropped (and resized) image. + + Raises: + InvalidArgumentError: if the rank is not 3 or if the image dimensions are + less than the crop size. + """ + original_shape = tf.shape(image) + + rank_assertion = tf.Assert( + tf.equal(tf.rank(image), 3), + ['Rank of image must be equal to 3.']) + with tf.control_dependencies([rank_assertion]): + cropped_shape = tf.stack([crop_height, crop_width, original_shape[2]]) + + size_assertion = tf.Assert( + tf.logical_and( + tf.greater_equal(original_shape[0], crop_height), + tf.greater_equal(original_shape[1], crop_width)), + ['Crop size greater than the image size.']) + + offsets = tf.to_int32(tf.stack([offset_height, offset_width, 0])) + + # Use tf.slice instead of crop_to_bounding box as it accepts tensors to + # define the crop size. + with tf.control_dependencies([size_assertion]): + image = tf.slice(image, offsets, cropped_shape) + return tf.reshape(image, cropped_shape) + + +def _random_crop(image_list, crop_height, crop_width): + """Crops the given list of images. + + The function applies the same crop to each image in the list. This can be + effectively applied when there are multiple image inputs of the same + dimension such as: + + image, depths, normals = _random_crop([image, depths, normals], 120, 150) + + Args: + image_list: a list of image tensors of the same dimension but possibly + varying channel. + crop_height: the new height. + crop_width: the new width. + + Returns: + the image_list with cropped images. + + Raises: + ValueError: if there are multiple image inputs provided with different size + or the images are smaller than the crop dimensions. + """ + if not image_list: + raise ValueError('Empty image_list.') + + # Compute the rank assertions. + rank_assertions = [] + for i in range(len(image_list)): + image_rank = tf.rank(image_list[i]) + rank_assert = tf.Assert( + tf.equal(image_rank, 3), + ['Wrong rank for tensor %s [expected] [actual]', + image_list[i].name, 3, image_rank]) + rank_assertions.append(rank_assert) + + with tf.control_dependencies([rank_assertions[0]]): + image_shape = tf.shape(image_list[0]) + image_height = image_shape[0] + image_width = image_shape[1] + crop_size_assert = tf.Assert( + tf.logical_and( + tf.greater_equal(image_height, crop_height), + tf.greater_equal(image_width, crop_width)), + ['Crop size greater than the image size.']) + + asserts = [rank_assertions[0], crop_size_assert] + + for i in range(1, len(image_list)): + image = image_list[i] + asserts.append(rank_assertions[i]) + with tf.control_dependencies([rank_assertions[i]]): + shape = tf.shape(image) + height = shape[0] + width = shape[1] + + height_assert = tf.Assert( + tf.equal(height, image_height), + ['Wrong height for tensor %s [expected][actual]', + image.name, height, image_height]) + width_assert = tf.Assert( + tf.equal(width, image_width), + ['Wrong width for tensor %s [expected][actual]', + image.name, width, image_width]) + asserts.extend([height_assert, width_assert]) + + # Create a random bounding box. + # + # Use tf.random_uniform and not numpy.random.rand as doing the former would + # generate random numbers at graph eval time, unlike the latter which + # generates random numbers at graph definition time. + with tf.control_dependencies(asserts): + max_offset_height = tf.reshape(image_height - crop_height + 1, []) + with tf.control_dependencies(asserts): + max_offset_width = tf.reshape(image_width - crop_width + 1, []) + offset_height = tf.random_uniform( + [], maxval=max_offset_height, dtype=tf.int32) + offset_width = tf.random_uniform( + [], maxval=max_offset_width, dtype=tf.int32) + + return [_crop(image, offset_height, offset_width, + crop_height, crop_width) for image in image_list] + + +def _central_crop(image_list, crop_height, crop_width): + """Performs central crops of the given image list. + + Args: + image_list: a list of image tensors of the same dimension but possibly + varying channel. + crop_height: the height of the image following the crop. + crop_width: the width of the image following the crop. + + Returns: + the list of cropped images. + """ + outputs = [] + for image in image_list: + image_height = tf.shape(image)[0] + image_width = tf.shape(image)[1] + + offset_height = (image_height - crop_height) / 2 + offset_width = (image_width - crop_width) / 2 + + outputs.append(_crop(image, offset_height, offset_width, + crop_height, crop_width)) + return outputs + + +def _mean_image_subtraction(image, means): + """Subtracts the given means from each image channel. + + For example: + means = [123.68, 116.779, 103.939] + image = _mean_image_subtraction(image, means) + + Note that the rank of `image` must be known. + + Args: + image: a tensor of size [height, width, C]. + means: a C-vector of values to subtract from each channel. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `means`. + """ + if image.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + num_channels = image.get_shape().as_list()[-1] + if len(means) != num_channels: + raise ValueError('len(means) must match the number of channels') + + channels = tf.split(axis=2, num_or_size_splits=num_channels, value=image) + for i in range(num_channels): + channels[i] -= means[i] + return tf.concat(axis=2, values=channels) + + +def _smallest_size_at_least(height, width, smallest_side): + """Computes new shape with the smallest side equal to `smallest_side`. + + Computes new shape with the smallest side equal to `smallest_side` while + preserving the original aspect ratio. + + Args: + height: an int32 scalar tensor indicating the current height. + width: an int32 scalar tensor indicating the current width. + smallest_side: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + new_height: an int32 scalar tensor indicating the new height. + new_width: and int32 scalar tensor indicating the new width. + """ + smallest_side = tf.convert_to_tensor(smallest_side, dtype=tf.int32) + + height = tf.to_float(height) + width = tf.to_float(width) + smallest_side = tf.to_float(smallest_side) + + scale = tf.cond(tf.greater(height, width), + lambda: smallest_side / width, + lambda: smallest_side / height) + new_height = tf.to_int32(tf.rint(height * scale)) + new_width = tf.to_int32(tf.rint(width * scale)) + return new_height, new_width + + +def _aspect_preserving_resize(image, smallest_side): + """Resize images preserving the original aspect ratio. + + Args: + image: A 3-D image `Tensor`. + smallest_side: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + resized_image: A 3-D tensor containing the resized image. + """ + smallest_side = tf.convert_to_tensor(smallest_side, dtype=tf.int32) + + shape = tf.shape(image) + height = shape[0] + width = shape[1] + new_height, new_width = _smallest_size_at_least(height, width, smallest_side) + image = tf.expand_dims(image, 0) + resized_image = tf.image.resize_bilinear(image, [new_height, new_width], + align_corners=False) + resized_image = tf.squeeze(resized_image) + resized_image.set_shape([None, None, 3]) + return resized_image + + +def preprocess_for_train(image, + output_height, + output_width, + resize_side_min=_RESIZE_SIDE_MIN, + resize_side_max=_RESIZE_SIDE_MAX, + use_grayscale=False): + """Preprocesses the given image for training. + + Note that the actual resizing scale is sampled from + [`resize_size_min`, `resize_size_max`]. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + resize_side_min: The lower bound for the smallest side of the image for + aspect-preserving resizing. + resize_side_max: The upper bound for the smallest side of the image for + aspect-preserving resizing. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + resize_side = tf.random_uniform( + [], minval=resize_side_min, maxval=resize_side_max+1, dtype=tf.int32) + + image = _aspect_preserving_resize(image, resize_side) + image = _random_crop([image], output_height, output_width)[0] + image.set_shape([output_height, output_width, 3]) + image = tf.to_float(image) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + image = tf.image.random_flip_left_right(image) + return _mean_image_subtraction(image, [_R_MEAN, _G_MEAN, _B_MEAN]) + + +def preprocess_for_eval(image, + output_height, + output_width, + resize_side, + use_grayscale=False): + """Preprocesses the given image for evaluation. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + resize_side: The smallest side of the image for aspect-preserving resizing. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + image = _aspect_preserving_resize(image, resize_side) + image = _central_crop([image], output_height, output_width)[0] + image.set_shape([output_height, output_width, 3]) + image = tf.to_float(image) + if use_grayscale: + image = tf.image.rgb_to_grayscale(image) + return _mean_image_subtraction(image, [_R_MEAN, _G_MEAN, _B_MEAN]) + + +def preprocess_image(image, + output_height, + output_width, + is_training=False, + resize_side_min=_RESIZE_SIDE_MIN, + resize_side_max=_RESIZE_SIDE_MAX, + use_grayscale=False): + """Preprocesses the given image. + + Args: + image: A `Tensor` representing an image of arbitrary size. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + resize_side_min: The lower bound for the smallest side of the image for + aspect-preserving resizing. If `is_training` is `False`, then this value + is used for rescaling. + resize_side_max: The upper bound for the smallest side of the image for + aspect-preserving resizing. If `is_training` is `False`, this value is + ignored. Otherwise, the resize side is sampled from + [resize_size_min, resize_size_max]. + use_grayscale: Whether to convert the image from RGB to grayscale. + + Returns: + A preprocessed image. + """ + if is_training: + return preprocess_for_train(image, output_height, output_width, + resize_side_min, resize_side_max, + use_grayscale) + else: + return preprocess_for_eval(image, output_height, output_width, + resize_side_min, use_grayscale) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/setup.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/setup.py new file mode 100644 index 0000000..3ec7ecd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/setup.py @@ -0,0 +1,27 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Setup script for slim.""" + +from setuptools import find_packages +from setuptools import setup + + +setup( + name='slim', + version='0.1', + include_package_data=True, + packages=find_packages(), + description='tf-slim', +) diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/train.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/train.py new file mode 100644 index 0000000..fa9e97e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/code/train.py @@ -0,0 +1,300 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Generic training script that trains a model using a given dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import datetime +import os +import ssl +import sys + +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../'))) +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../../utils/atlasboost'))) + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +import tensorflow as tf +from env import Env +from estimator_impl import EstimatorImpl + + +ssl._create_default_https_context = ssl._create_unverified_context + + +def parse_args(): + tf.app.flags.DEFINE_string('master', '', 'The address of the TensorFlow master to use.') + tf.app.flags.DEFINE_string('train_dir', './mobilenet_v2_result', + 'Directory where checkpoints and event logs are written to.') + tf.app.flags.DEFINE_string('msg', '', 'extra message for creating log folder') + tf.app.flags.DEFINE_string('gpu_ids', '0', 'the gpu to use') + + # cosine learning rate. [DECOUPLED WEIGHT DECAY REGULARIZATION] + tf.app.flags.DEFINE_string('checkpoint_path', '', '') + tf.app.flags.DEFINE_integer('max_epoch', '200', 'max epochs to train') + tf.app.flags.DEFINE_integer('max_train_steps', '500', 'max steps to train') + tf.app.flags.DEFINE_float('eta_min', '0.0', 'eta_min in cosine_annealing scheduler') + tf.app.flags.DEFINE_integer('T_max', '200', 'T-max in cosine_annealing scheduler') + tf.app.flags.DEFINE_integer('ckp_freq', '5000', 'Frequency (in steps) to save checkpoint') + tf.app.flags.DEFINE_integer('iterations_per_loop', None, 'Iterations per loop when running on Ascend') + + tf.app.flags.DEFINE_float('warmup_epochs', 5, + 'Linearly warmup learning rate from 0 to learning_rate over this many epochs.') + tf.app.flags.DEFINE_boolean('enable_summary', False, '') + + tf.app.flags.DEFINE_integer('num_clones', 1, + 'Number of model clones to deploy. Note For ' + 'historical reasons loss from all clones averaged ' + 'out and learning rate decay happen per clone ' + 'epochs') + + tf.app.flags.DEFINE_boolean('clone_on_cpu', False, + 'Use CPUs to deploy clones.') + + tf.app.flags.DEFINE_integer('worker_replicas', 1, 'Number of worker replicas.') + + tf.app.flags.DEFINE_integer( + 'num_ps_tasks', 0, + 'The number of parameter servers. If the value is 0, then the parameters ' + 'are handled locally by the worker.') + + tf.app.flags.DEFINE_integer( + 'num_readers', 4, + 'The number of parallel readers that read data from the dataset.') + + tf.app.flags.DEFINE_integer( + 'num_preprocessing_threads', 4, + 'The number of threads used to create the batches.') + + tf.app.flags.DEFINE_integer( + 'log_every_n_steps', 10, + 'The frequency with which logs are print.') + + tf.app.flags.DEFINE_integer( + 'save_summaries_secs', 60, + 'The frequency with which summaries are saved, in seconds.') + + tf.app.flags.DEFINE_integer( + 'save_interval_secs', 60, + 'The frequency with which the model is saved, in seconds.') + + tf.app.flags.DEFINE_integer( + 'task', 0, 'Task id of the replica running the training.') + + ###################### + # Optimization Flags # + ###################### + + tf.app.flags.DEFINE_float( + # 'weight_decay', 0.00004, 'The weight decay on the model weights.') + 'weight_decay', 0, 'The weight decay on the model weights.') + + tf.app.flags.DEFINE_string( + 'optimizer', 'sgd', + 'The name of the optimizer, one of "adadelta", "adagrad", "adam",' + '"ftrl", "momentum", "sgd" or "rmsprop".') + + tf.app.flags.DEFINE_float( + 'adadelta_rho', 0.95, + 'The decay rate for adadelta.') + + tf.app.flags.DEFINE_float( + 'adagrad_initial_accumulator_value', 0.1, + 'Starting value for the AdaGrad accumulators.') + + tf.app.flags.DEFINE_float( + 'adam_beta1', 0.9, + 'The exponential decay rate for the 1st moment estimates.') + + tf.app.flags.DEFINE_float( + 'adam_beta2', 0.999, + 'The exponential decay rate for the 2nd moment estimates.') + + tf.app.flags.DEFINE_float('opt_epsilon', 1.0, 'Epsilon term for the optimizer.') + + tf.app.flags.DEFINE_float('ftrl_learning_rate_power', -0.5, + 'The learning rate power.') + + tf.app.flags.DEFINE_float( + 'ftrl_initial_accumulator_value', 0.1, + 'Starting value for the FTRL accumulators.') + + tf.app.flags.DEFINE_float( + 'ftrl_l1', 0.0, 'The FTRL l1 regularization strength.') + + tf.app.flags.DEFINE_float( + 'ftrl_l2', 0.0, 'The FTRL l2 regularization strength.') + + tf.app.flags.DEFINE_float( + 'momentum', 0.9, + 'The momentum for the MomentumOptimizer and RMSPropOptimizer.') + + tf.app.flags.DEFINE_float('rmsprop_momentum', 0.9, 'Momentum.') + + tf.app.flags.DEFINE_float('rmsprop_decay', 0.9, 'Decay term for RMSProp.') + + tf.app.flags.DEFINE_integer( + 'quantize_delay', -1, + 'Number of steps to start quantized training. Set to -1 would disable ' + 'quantized training.') + + ####################### + # Learning Rate Flags # + ####################### + + tf.app.flags.DEFINE_string( + 'learning_rate_decay_type', + 'fixed', + 'Specifies how the learning rate is decayed. One of "fixed", "exponential",' + ' or "polynomial"') + + # tf.app.flags.DEFINE_float('learning_rate', 0.4, 'Initial learning rate.') + tf.app.flags.DEFINE_float('learning_rate', 0.1, 'Initial learning rate.') + + tf.app.flags.DEFINE_float( + 'end_learning_rate', 0.0001, + 'The minimal end learning rate used by a polynomial decay learning rate.') + + tf.app.flags.DEFINE_float( + 'label_smoothing', 0.1, 'The amount of label smoothing.') + + tf.app.flags.DEFINE_float( + 'learning_rate_decay_factor', 0.94, 'Learning rate decay factor.') + + tf.app.flags.DEFINE_float( + 'num_epochs_per_decay', 2.0, + 'Number of epochs after which learning rate decays. Note: this flag counts ' + 'epochs per clone but aggregates per sync replicas. So 1.0 means that ' + 'each clone will go over full epoch individually, but replicas will go ' + 'once across all replicas.') + + tf.app.flags.DEFINE_bool( + 'sync_replicas', False, + 'Whether or not to synchronize the replicas during training.') + + tf.app.flags.DEFINE_integer( + 'replicas_to_aggregate', 1, + 'The Number of gradients to collect before updating params.') + + tf.app.flags.DEFINE_float( + 'moving_average_decay', None, + 'The decay to use for the moving average.' + 'If left as None, then moving averages are not used.') + + ####################### + # Dataset Flags # + ####################### + + tf.app.flags.DEFINE_string( + 'dataset_name', 'imagenet', 'The name of the dataset to load.') + + tf.app.flags.DEFINE_string( + 'dataset_split_name', 'train', 'The name of the train/test split.') + + tf.app.flags.DEFINE_string( + 'dataset_dir', '/opt/npu/models/slimImagenet', 'The directory where the dataset files are stored.') + + tf.app.flags.DEFINE_integer( + 'labels_offset', 0, + 'An offset for the labels in the dataset. This flag is primarily used to ' + 'evaluate the VGG and ResNet architectures which do not use a background ' + 'class for the ImageNet dataset.') + + tf.app.flags.DEFINE_string( + 'model_name', 'mobilenet_v2_140', 'The name of the architecture to train.') + + tf.app.flags.DEFINE_string( + 'preprocessing_name', 'inception_v2', 'The name of the preprocessing to use. If left ' + 'as `None`, then the model_name flag is used.') + + tf.app.flags.DEFINE_integer( + 'batch_size', 96, 'The number of samples in each batch.') + + tf.app.flags.DEFINE_integer( + 'train_image_size', None, 'Train image size') + + tf.app.flags.DEFINE_integer('max_number_of_steps', 20000, + 'The maximum number of training steps.') + + tf.app.flags.DEFINE_bool('use_grayscale', False, + 'Whether to convert input images to grayscale.') + + ##################### + # Fine-Tuning Flags # + ##################### + # + # tf.app.flags.DEFINE_string( + # 'checkpoint_path', None, + # 'The path to a checkpoint from which to fine-tune.') + # + tf.app.flags.DEFINE_string( + 'checkpoint_exclude_scopes', None, + 'Comma-separated list of scopes of variables to exclude when restoring ' + 'from a checkpoint.') + + tf.app.flags.DEFINE_string( + 'trainable_scopes', None, + 'Comma-separated list of scopes to filter the set of variables to train.' + 'By default, None would train all the variables.') + + tf.app.flags.DEFINE_boolean( + 'ignore_missing_vars', False, + 'When restoring a checkpoint would ignore missing variables.') + + FLAGS = tf.app.flags.FLAGS + + return FLAGS + + +FLAGS = parse_args() + + +def main(_): + num_samples = 1281167 + + # import pdb;pdb.set_trace() + if int(os.getenv('RANK_SIZE')) == 1: + FLAGS.max_number_of_steps = FLAGS.max_train_steps + else: + FLAGS.max_number_of_steps = num_samples // (FLAGS.batch_size * int(os.getenv('RANK_SIZE'))) * FLAGS.max_epoch + + env = Env(FLAGS) + + estimator_impl = EstimatorImpl(env) + try: + estimator_impl.main() + except: + pass + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.128, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, "batchsize": 32} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + tf.app.run() diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/__init__.py b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..96ec094 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..7381628 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/config/npu_set_env.sh @@ -0,0 +1,30 @@ +# main env + +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# profiling env +export PROFILING_MODE={PROFILING_MODE} +export AICPU_PROFILING_MODE={AICPU_PROFILING_MODE} +export PROFILING_OPTIONS={PROFILING_OPTIONS} +export FP_POINT={FP_POINT} +export BP_POINT={BP_POINT} + + +# system env +ulimit -c unlimited + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/eval.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/eval.sh new file mode 100644 index 0000000..b900df6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/eval.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +yamlPath=$1 +toolsPath=$2 + + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +export REMARK_LOG_FILE=hw_mobilenet.log +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "common_config") + +cd ${ckpt_path%results*}/results +rm -rf ./hw_mobilenet.log +rm -rf ./eval.out + +python3.7 ${currentDir}/code/eval_image_classifier_mobilenet.py --dataset_dir=${data_url} \ + --checkpoint_path=${ckpt_path} > ./eval.out 2>&1 + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/run.sh new file mode 100644 index 0000000..0221abb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/run.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi + +if [ x"$mode" != x"evaluate" ];then + currtime=`date +%Y%m%d%H%M%S` + mkdir -p ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ + train_job_dir=${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +fi + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/0/hw_mobilenet.log ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ + + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +elif [ x"$mode" == x"train" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/${first_device_id}/hw_mobilenet.log ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ + rank_id=0 + for device_id in $device_group;do + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +else + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${ckpt_path%results*}/results &" + ln -snf ${ckpt_path%results*}/results/hw_mobilenet.log ${ckpt_path%results*}/.. + bash ${currentDir}/scripts/eval.sh ${yamlPath} ${toolsPath} + +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/train.sh new file mode 100644 index 0000000..69f69c9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/tensorflow/scripts/train.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 + +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_mobilenet/training_job_${currtime}/ + + + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") +export REMARK_LOG_FILE=hw_mobilenet.log +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +source ${currentDir}/config/npu_set_env.sh + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +if [ ${profiling_mode} == True ]; +then + export PROFILING_MODE=true +else + export PROFILING_MODE=false +fi + +if [ ${aicpu_profiling_mode} == True ]; +then + export AICPU_PROFILING_MODE=true +else + export AICPU_PROFILING_MODE=false +fi + +export PROFILING_OPTIONS=${profiling_options} +export FP_POINT=${fp_point} +export BP_POINT=${bp_point} + + + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +if [ x"${mode}" == x"evaluate" ];then + # 评测 + python3.7 ${currentDir}/code/eval_image_classifier_mobilenet.py \ + --checkpoint_path="${ckpt_path}" \ + --dataset_dir=${data_url} > ./train.log 2>&1 +else + # 根据单卡/多卡区分调用参数 + if [ x"$6" == x"True" ];then + export CLUSTER=True + python3.7 ${currentDir}/code/train.py \ + --dataset_dir=${data_url} \ + --max_epoch=${epoches} \ + --model_name="mobilenet_v2" \ + --moving_average_decay=0.9999 \ + --label_smoothing=0.1 \ + --preprocessing_name="inception_v2" \ + --weight_decay='0.00004' \ + --batch_size=${batch_size} \ + --learning_rate_decay_type='cosine_annealing' \ + --learning_rate=0.8 \ + --optimizer='momentum' \ + --momentum='0.9' \ + --warmup_epochs=5 > ${train_job_dir}/train_${device_id}.log 2>&1 + elif [ x"${rank_size}" == x"1" ];then + # 单卡 + python3.7 ${currentDir}/code/train.py \ + --dataset_dir=${data_url} \ + --max_train_steps=${max_steps} \ + --iterations_per_loop=50 \ + --model_name="mobilenet_v2" \ + --moving_average_decay=0.9999 \ + --label_smoothing=0.1 \ + --preprocessing_name="inception_v2" \ + --weight_decay='0.00004' \ + --batch_size=${batch_size} \ + --learning_rate_decay_type='cosine_annealing' \ + --learning_rate=0.4 \ + --optimizer='momentum' \ + --momentum='0.9' \ + --warmup_epochs=5 > ${train_job_dir}/train_${device_id}.log 2>&1 + elif [ ${rank_size} -le 8 ];then + # 多卡单机 + python3.7 ${currentDir}/code/train.py \ + --dataset_dir=${data_url} \ + --max_epoch=${epoches} \ + --model_name="mobilenet_v2" \ + --moving_average_decay=0.9999 \ + --label_smoothing=0.1 \ + --preprocessing_name="inception_v2" \ + --weight_decay='0.00004' \ + --batch_size=${batch_size} \ + --learning_rate_decay_type='cosine_annealing' \ + --learning_rate=0.8 \ + --optimizer='momentum' \ + --momentum='0.9' \ + --warmup_epochs=5 > ${train_job_dir}/train_${device_id}.log 2>&1 + fi +fi + +if [ $? -eq 0 ];then + echo ":::ABK 1.0.0 hw_mobilenet train success" + echo ":::ABK 1.0.0 hw_mobilenet train success" >> ${train_job_dir}/train_${device_id}.log 2 + echo ":::ABK 1.0.0 hw_mobilenet train success" >> ./hw_mobilenet.log +else + echo ":::ABK 1.0.0 hw_mobilenet train failed" + echo ":::ABK 1.0.0 hw_mobilenet train failed" >> ${train_job_dir}/train_${device_id}.log 2 + echo ":::ABK 1.0.0 hw_mobilenet train failed" >> ./hw_mobilenet.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 mobilenet train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 mobilenet train total time: ${hour}:${min}:${sec}" >> ./hw_mobilenet.log diff --git a/train/atlas_benchmark-master/image_classification/MobileNet/verify_dataset.sh b/train/atlas_benchmark-master/image_classification/MobileNet/verify_dataset.sh new file mode 100644 index 0000000..a9bf588 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/MobileNet/verify_dataset.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/README.md new file mode 100644 index 0000000..87e3965 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/README.md @@ -0,0 +1,37 @@ +# ResNet101_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/ResNet101.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + # 基本参数 + data_url: /home/imagenet_TF/ + # 1p/8p,epoches设为150 + epoches: 1 + epochs_between_evals: 1 + max_train_steps: 1000 + batch_size: 128 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/LICENSE b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/LICENSE new file mode 100644 index 0000000..d3da228 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/LICENSE @@ -0,0 +1,203 @@ +Copyright 2015 The TensorFlow Authors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015, The TensorFlow Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-GPU.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-GPU.md new file mode 100644 index 0000000..ead609e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-GPU.md @@ -0,0 +1,151 @@ +![Logo](https://storage.googleapis.com/model_garden_artifacts/TF_Model_Garden.png) + +# TensorFlow Official Models + +The TensorFlow official models are a collection of models +that use TensorFlow’s high-level APIs. +They are intended to be well-maintained, tested, and kept up to date +with the latest TensorFlow API. +They should also be reasonably optimized for fast performance while still +being easy to read. +These models are used as end-to-end tests, ensuring that the models run +with the same or improved speed and performance with each new TensorFlow build. + +## Model Implementations + +### Natural Language Processing + +| Model | Description | Reference | +| ----- | ----------- | --------- | +| [ALBERT](nlp/albert) | A Lite BERT for Self-supervised Learning of Language Representations | [arXiv:1909.11942](https://arxiv.org/abs/1909.11942) | +| [BERT](nlp/bert) | A powerful pre-trained language representation model: BERT (Bidirectional Encoder Representations from Transformers) | [arXiv:1810.04805](https://arxiv.org/abs/1810.04805) | +| [NHNet](nlp/nhnet) | A transformer-based multi-sequence to sequence model: Generating Representative Headlines for News Stories | [arXiv:2001.09386](https://arxiv.org/abs/2001.09386) | +| [Transformer](nlp/transformer) | A transformer model to translate the WMT English to German dataset | [arXiv:1706.03762](https://arxiv.org/abs/1706.03762) | +| [XLNet](nlp/xlnet) | XLNet: Generalized Autoregressive Pretraining for Language Understanding | [arXiv:1906.08237](https://arxiv.org/abs/1906.08237) | + +### Computer Vision + +| Model | Description | Reference | +| ----- | ----------- | --------- | +| [MNIST](vision/image_classification) | A basic model to classify digits from the MNIST dataset | [Link](http://yann.lecun.com/exdb/mnist/) | +| [ResNet](vision/image_classification) | A deep residual network for image recognition | [arXiv:1512.03385](https://arxiv.org/abs/1512.03385) | +| [RetinaNet](vision/detection) | A fast and powerful object detector | [arXiv:1708.02002](https://arxiv.org/abs/1708.02002) | +| [Mask R-CNN](vision/detection) | An object detection and instance segmentation model | [arXiv:1703.06870](https://arxiv.org/abs/1703.06870) | + +### Other models + +| Model | Description | Reference | +| ----- | ----------- | --------- | +| [NCF](recommendation) | Neural Collaborative Filtering model for recommendation tasks | [arXiv:1708.05031](https://arxiv.org/abs/1708.05031) | + +--- + +## How to get started with the Model Garden official models + +* The models in the master branch are developed using TensorFlow 2, +and they target the TensorFlow [nightly binaries](https://github.com/tensorflow/tensorflow#installation) +built from the +[master branch of TensorFlow](https://github.com/tensorflow/tensorflow/tree/master). +* The stable versions targeting releases of TensorFlow are available +as tagged branches or [downloadable releases](https://github.com/tensorflow/models/releases). +* Model repository version numbers match the target TensorFlow release, +such that +[release v2.1.0](https://github.com/tensorflow/models/releases/tag/v2.1.0) +are compatible with +[TensorFlow v2.1.0](https://github.com/tensorflow/tensorflow/releases/tag/v2.1.0). + +Please follow the below steps before running models in this repository. + +### Requirements + +* The latest TensorFlow Model Garden release and TensorFlow 2 + * If you are on a version of TensorFlow earlier than 2.1, please +upgrade your TensorFlow to [the latest TensorFlow 2](https://www.tensorflow.org/install/). + +```shell +pip3 install tf-nightly +``` + +### Installation + +#### Method 1: Install the TensorFlow Model Garden pip package + +**tf-models-nightly** is the nightly Model Garden package +created daily automatically. pip will install all models +and dependencies automatically. + +```shell +pip install tf-models-nightly +``` + +Please check out our [example](colab/bert.ipynb) +to learn how to use a PIP package. + +#### Method 2: Clone the source + +1. Clone the GitHub repository: + +```shell +git clone https://github.com/tensorflow/models.git +``` + +2. Add the top-level ***/models*** folder to the Python path. + +```shell +export PYTHONPATH=$PYTHONPATH:/path/to/models +``` + +If you are using a Colab notebook, please set the Python path with os.environ. + +```python +import os +os.environ['PYTHONPATH'] += ":/path/to/models" +``` + +3. Install other dependencies + +```shell +pip3 install --user -r official/requirements.txt +``` + +--- + +## More models to come! + +The team is actively developing new models. +In the near future, we will add: + +- State-of-the-art language understanding models: + More members in Transformer family +- Start-of-the-art image classification models: + EfficientNet, MnasNet and variants. +- A set of excellent objection detection models. + +If you would like to make any fixes or improvements to the models, please +[submit a pull request](https://github.com/tensorflow/models/compare). + +--- + +## Contributions + +Every model should follow our guidelines to uphold our objectives of readable, +usable, and maintainable code. + +### General Guidelines + +- Code should be well documented and tested. +- Runnable from a blank environment with ease. +- Trainable on: single GPU/CPU (baseline), multiple GPUs & TPUs +- Compatible with Python 3 (using [six](https://pythonhosted.org/six/) +when being compatible with Python 2 is necessary) +- Conform to + [Google Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md) + +### Implementation Guidelines + +These guidelines are to ensure consistent model implementations for +better readability and maintainability. + +- Use [common utility functions](utils) +- Export SavedModel at the end of the training. +- Consistent flags and flag-parsing library ([read more here](utils/flags/guidelines.md)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-TPU.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-TPU.md new file mode 100644 index 0000000..8a54f95 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README-TPU.md @@ -0,0 +1,25 @@ +# Offically Supported TensorFlow 2.1+ Models on Cloud TPU + +## Natural Language Processing + +* [bert](nlp/bert): A powerful pre-trained language representation model: + BERT, which stands for Bidirectional Encoder Representations from + Transformers. + [BERT FineTuning with Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/bert-2.x) provides step by step instructions on Cloud TPU training. You can look [Bert MNLI Tensorboard.dev metrics](https://tensorboard.dev/experiment/LijZ1IrERxKALQfr76gndA) for MNLI fine tuning task. +* [transformer](nlp/transformer): A transformer model to translate the WMT + English to German dataset. + [Training transformer on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/transformer-2.x) for step by step instructions on Cloud TPU training. + +## Computer Vision + +* [efficientnet](vision/image_classification): A family of convolutional + neural networks that scale by balancing network depth, width, and + resolution and can be used to classify ImageNet's dataset of 1000 classes. + See [Tensorboard.dev training metrics](https://tensorboard.dev/experiment/KnaWjrq5TXGfv0NW5m7rpg/#scalars). +* [mnist](vision/image_classification): A basic model to classify digits + from the MNIST dataset. See [Running MNIST on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/mnist-2.x) tutorial and [Tensorboard.dev metrics](https://tensorboard.dev/experiment/mIah5lppTASvrHqWrdr6NA). +* [mask-rcnn](vision/detection): An object detection and instance segmentation model. See [Tensorboard.dev training metrics](https://tensorboard.dev/experiment/LH7k0fMsRwqUAcE09o9kPA). +* [resnet](vision/image_classification): A deep residual network that can + be used to classify ImageNet's dataset of 1000 classes. + See [Training ResNet on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/resnet-2.x) tutorial and [Tensorboard.dev metrics](https://tensorboard.dev/experiment/CxlDK8YMRrSpYEGtBRpOhg). +* [retinanet](vision/detection): A fast and powerful object detector. See [Tensorboard.dev training metrics](https://tensorboard.dev/experiment/b8NRnWU3TqG6Rw0UxueU6Q). diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README.md new file mode 100644 index 0000000..8a5bd10 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/README.md @@ -0,0 +1,79 @@ +# ResNet in TensorFlow On NPU +--- + +# Classification Model +## Overview +1. This is an implementation of the ResNet101 model as described in the [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) paper. +2. Current implementation is based on the code from the TensorFlow Official implementation in the [tensorflow/models Repo](https://github.com/tensorflow/models). + +## Introduction +1. ResNet is a relatively good network for classification problems in the ImageNet competition. It introduces the concept of residual learning. It protects the integrity of information by adding direct connection channels, solves problems such as information loss, gradient disappearance, and gradient explosion. The network can also be trained. ResNet has different network layers, commonly used are 18-layer, 34-layer, 50-layer, 101-layer, 152-layer. +2. Ascend provides the V1.5 version of the 50-layer ResNet network this time. The difference between the V1.5 version of the ResNet network and the V1 version is that in the bottleneck module, the V1 version is set stride=2 in the first 1x1 convolutional layer, and V1.5 sets stride=2 in the 3x3 convolutional layer. + +## Dataset +We have used the [ImageNet](http://www.image-net.org/)dataset as an example here, you can use mnist or your own dataset to modify and adapt. +We use [build_imagenet_data](https://github.com/tensorflow/models/blob/1af55e018eebce03fb61bba9959a04672536107d/research/slim/datasets/build_imagenet_data.py) to build record for training. + +## Running Code +### Config the env paramater +check if path '/usr/local/HiAI' or ''/usr/local/Ascend' is existed or not. +modify '/usr/local/HiAI' to the actual path in scripts/run.sh + +### Train and evaluate model +[imagenet_main.py](official/r1/resnet/imagenet_main.py) is the Entry Python script. +[resnet_run_loop.py](official/r1/resnet/resnet_run_loop.py) is the Main Python script. + +### Check your rank_table +default rank_table setting in [configs](official/r1/resnet/configs) is usrd for X86. +if you use aach64, please modify board_id from "0x0000" --> + +To train and evaluate the model, issue the following command: +``` +# for single training +bash ./scripts/train_1p.sh +# for multi training +bash ./scripts/train_8p.sh +``` + +Default Args: +- Batch size: 128 +- Momentum: 0.9 +- LR scheduler: cosine +- Learning rate(LR): 0.064 +- loss scale: 512 +- Weight decay: 0.0001 +- Label smoothing: 0.1 +- train epoch: 90 + +There are other arguments about models and training process. Use the `--help` or `-h` flag to get a full list of possible arguments with detailed descriptions. + +### Train and evaluate result +- 1 NPU + - Train performance:109ms/step,1170images/sec. +- 8 NPU + - Train performance:109ms/step,9390images/sec. +- best result + - Accuracy(Top1): 79.03 + - Accuracy(Top5): 94.53 + +### More + +#### modify file +- The npu modify file list as follows: +- DaVinci npu platform adaptation code,including + 1.official/r1/resnet/imagenet_main.py + 2.official/r1/resnet/resnet_model.py + 3.official/r1/resnet/resnet_run_loop.py + 4.official/utils/flags/_base.py + +#### FileTree Intro +- Main Dir + - ./official/r1/resnet +- Single NPU Training Shell + - npu_train_1p_test.sh +- Multi NPU(8p) Training Shell + - npu_train_8p_test.sh +- Log Info + - STDOUT nohup.out + - Performance perf.log + \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader.py new file mode 100644 index 0000000..5946d96 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader.py @@ -0,0 +1,157 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Library to upload benchmark generated by BenchmarkLogger to remote repo. + +This library require google cloud bigquery lib as dependency, which can be +installed with: + > pip install --upgrade google-cloud-bigquery +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json + +from google.cloud import bigquery +from google.cloud import exceptions + +import tensorflow as tf + + +class BigQueryUploader(object): + """Upload the benchmark and metric info from JSON input to BigQuery. """ + + def __init__(self, gcp_project=None, credentials=None): + """Initialized BigQueryUploader with proper setting. + + Args: + gcp_project: string, the name of the GCP project that the log will be + uploaded to. The default project name will be detected from local + environment if no value is provided. + credentials: google.auth.credentials. The credential to access the + BigQuery service. The default service account credential will be + detected from local environment if no value is provided. Please use + google.oauth2.service_account.Credentials to load credential from local + file for the case that the test is run out side of GCP. + """ + self._bq_client = bigquery.Client( + project=gcp_project, credentials=credentials) + + def upload_benchmark_run_json( + self, dataset_name, table_name, run_id, run_json): + """Upload benchmark run information to Bigquery. + + Args: + dataset_name: string, the name of bigquery dataset where the data will be + uploaded. + table_name: string, the name of bigquery table under the dataset where + the data will be uploaded. + run_id: string, a unique ID that will be attached to the data, usually + this is a UUID4 format. + run_json: dict, the JSON data that contains the benchmark run info. + """ + run_json["model_id"] = run_id + self._upload_json(dataset_name, table_name, [run_json]) + + def upload_benchmark_metric_json( + self, dataset_name, table_name, run_id, metric_json_list): + """Upload metric information to Bigquery. + + Args: + dataset_name: string, the name of bigquery dataset where the data will be + uploaded. + table_name: string, the name of bigquery table under the dataset where + the metric data will be uploaded. This is different from the + benchmark_run table. + run_id: string, a unique ID that will be attached to the data, usually + this is a UUID4 format. This should be the same as the benchmark run_id. + metric_json_list: list, a list of JSON object that record the metric info. + """ + for m in metric_json_list: + m["run_id"] = run_id + self._upload_json(dataset_name, table_name, metric_json_list) + + def upload_benchmark_run_file( + self, dataset_name, table_name, run_id, run_json_file): + """Upload benchmark run information to Bigquery from input json file. + + Args: + dataset_name: string, the name of bigquery dataset where the data will be + uploaded. + table_name: string, the name of bigquery table under the dataset where + the data will be uploaded. + run_id: string, a unique ID that will be attached to the data, usually + this is a UUID4 format. + run_json_file: string, the file path that contains the run JSON data. + """ + with tf.io.gfile.GFile(run_json_file) as f: + benchmark_json = json.load(f) + self.upload_benchmark_run_json( + dataset_name, table_name, run_id, benchmark_json) + + def upload_metric_file( + self, dataset_name, table_name, run_id, metric_json_file): + """Upload metric information to Bigquery from input json file. + + Args: + dataset_name: string, the name of bigquery dataset where the data will be + uploaded. + table_name: string, the name of bigquery table under the dataset where + the metric data will be uploaded. This is different from the + benchmark_run table. + run_id: string, a unique ID that will be attached to the data, usually + this is a UUID4 format. This should be the same as the benchmark run_id. + metric_json_file: string, the file path that contains the metric JSON + data. + """ + with tf.io.gfile.GFile(metric_json_file) as f: + metrics = [] + for line in f: + metrics.append(json.loads(line.strip())) + self.upload_benchmark_metric_json( + dataset_name, table_name, run_id, metrics) + + def _upload_json(self, dataset_name, table_name, json_list): + # Find the unique table reference based on dataset and table name, so that + # the data can be inserted to it. + table_ref = self._bq_client.dataset(dataset_name).table(table_name) + errors = self._bq_client.insert_rows_json(table_ref, json_list) + if errors: + tf.logging.error( + "Failed to upload benchmark info to bigquery: {}".format(errors)) + + def insert_run_status(self, dataset_name, table_name, run_id, run_status): + """Insert the run status in to Bigquery run status table.""" + query = ("INSERT {ds}.{tb} " + "(run_id, status) " + "VALUES('{rid}', '{status}')").format( + ds=dataset_name, tb=table_name, rid=run_id, status=run_status) + try: + self._bq_client.query(query=query).result() + except exceptions.GoogleCloudError as e: + tf.logging.error("Failed to insert run status: %s", e) + + def update_run_status(self, dataset_name, table_name, run_id, run_status): + """Update the run status in in Bigquery run status table.""" + query = ("UPDATE {ds}.{tb} " + "SET status = '{status}' " + "WHERE run_id = '{rid}'").format( + ds=dataset_name, tb=table_name, status=run_status, rid=run_id) + try: + self._bq_client.query(query=query).result() + except exceptions.GoogleCloudError as e: + tf.logging.error("Failed to update run status: %s", e) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_main.py new file mode 100644 index 0000000..e015051 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_main.py @@ -0,0 +1,66 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Binary to upload benchmark generated by BenchmarkLogger to remote repo. + +This library require google cloud bigquery lib as dependency, which can be +installed with: + > pip install --upgrade google-cloud-bigquery +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import uuid + +from absl import app as absl_app +from absl import flags + +from official.benchmark import benchmark_uploader +from official.utils.flags import core as flags_core +from official.utils.logs import logger + +def main(_): + if not flags.FLAGS.benchmark_log_dir: + print("Usage: benchmark_uploader.py --benchmark_log_dir=/some/dir") + sys.exit(1) + + uploader = benchmark_uploader.BigQueryUploader( + gcp_project=flags.FLAGS.gcp_project) + run_id = str(uuid.uuid4()) + run_json_file = os.path.join( + flags.FLAGS.benchmark_log_dir, logger.BENCHMARK_RUN_LOG_FILE_NAME) + metric_json_file = os.path.join( + flags.FLAGS.benchmark_log_dir, logger.METRIC_LOG_FILE_NAME) + + uploader.upload_benchmark_run_file( + flags.FLAGS.bigquery_data_set, flags.FLAGS.bigquery_run_table, run_id, + run_json_file) + uploader.upload_metric_file( + flags.FLAGS.bigquery_data_set, flags.FLAGS.bigquery_metric_table, run_id, + metric_json_file) + # Assume the run finished successfully before user invoke the upload script. + uploader.insert_run_status( + flags.FLAGS.bigquery_data_set, flags.FLAGS.bigquery_run_status_table, + run_id, logger.RUN_STATUS_SUCCESS) + + +if __name__ == "__main__": + flags_core.define_benchmark() + flags.adopt_module_key_flags(flags_core) + absl_app.run(main=main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_test.py new file mode 100644 index 0000000..c0ab282 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_uploader_test.py @@ -0,0 +1,123 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for benchmark_uploader.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import tempfile +import unittest +from mock import MagicMock +from mock import patch + +import tensorflow as tf # pylint: disable=g-bad-import-order + +try: + from google.cloud import bigquery + from official.benchmark import benchmark_uploader +except ImportError: + bigquery = None + benchmark_uploader = None + + +@unittest.skipIf(bigquery is None, "Bigquery dependency is not installed.") +class BigQueryUploaderTest(tf.test.TestCase): + + @patch.object(bigquery, "Client") + def setUp(self, mock_bigquery): + self.mock_client = mock_bigquery.return_value + self.mock_dataset = MagicMock(name="dataset") + self.mock_table = MagicMock(name="table") + self.mock_client.dataset.return_value = self.mock_dataset + self.mock_dataset.table.return_value = self.mock_table + self.mock_client.insert_rows_json.return_value = [] + + self.benchmark_uploader = benchmark_uploader.BigQueryUploader() + self.benchmark_uploader._bq_client = self.mock_client + + self.log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + with open(os.path.join(self.log_dir, "metric.log"), "a") as f: + json.dump({"name": "accuracy", "value": 1.0}, f) + f.write("\n") + json.dump({"name": "loss", "value": 0.5}, f) + f.write("\n") + with open(os.path.join(self.log_dir, "run.log"), "w") as f: + json.dump({"model_name": "value"}, f) + + def tearDown(self): + tf.io.gfile.rmtree(self.get_temp_dir()) + + def test_upload_benchmark_run_json(self): + self.benchmark_uploader.upload_benchmark_run_json( + "dataset", "table", "run_id", {"model_name": "value"}) + + self.mock_client.insert_rows_json.assert_called_once_with( + self.mock_table, [{"model_name": "value", "model_id": "run_id"}]) + + def test_upload_benchmark_metric_json(self): + metric_json_list = [ + {"name": "accuracy", "value": 1.0}, + {"name": "loss", "value": 0.5} + ] + expected_params = [ + {"run_id": "run_id", "name": "accuracy", "value": 1.0}, + {"run_id": "run_id", "name": "loss", "value": 0.5} + ] + self.benchmark_uploader.upload_benchmark_metric_json( + "dataset", "table", "run_id", metric_json_list) + self.mock_client.insert_rows_json.assert_called_once_with( + self.mock_table, expected_params) + + def test_upload_benchmark_run_file(self): + self.benchmark_uploader.upload_benchmark_run_file( + "dataset", "table", "run_id", os.path.join(self.log_dir, "run.log")) + + self.mock_client.insert_rows_json.assert_called_once_with( + self.mock_table, [{"model_name": "value", "model_id": "run_id"}]) + + def test_upload_metric_file(self): + self.benchmark_uploader.upload_metric_file( + "dataset", "table", "run_id", + os.path.join(self.log_dir, "metric.log")) + expected_params = [ + {"run_id": "run_id", "name": "accuracy", "value": 1.0}, + {"run_id": "run_id", "name": "loss", "value": 0.5} + ] + self.mock_client.insert_rows_json.assert_called_once_with( + self.mock_table, expected_params) + + def test_insert_run_status(self): + self.benchmark_uploader.insert_run_status( + "dataset", "table", "run_id", "status") + expected_query = ("INSERT dataset.table " + "(run_id, status) " + "VALUES('run_id', 'status')") + self.mock_client.query.assert_called_once_with(query=expected_query) + + def test_update_run_status(self): + self.benchmark_uploader.update_run_status( + "dataset", "table", "run_id", "status") + expected_query = ("UPDATE dataset.table " + "SET status = 'status' " + "WHERE run_id = 'run_id'") + self.mock_client.query.assert_called_once_with(query=expected_query) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_wrappers.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_wrappers.py new file mode 100644 index 0000000..3d38b69 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/benchmark_wrappers.py @@ -0,0 +1,97 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utils to annotate and trace benchmarks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +from absl import logging +from absl.testing import flagsaver + +FLAGS = flags.FLAGS + +flags.DEFINE_multi_string( + 'benchmark_method_flags', None, + 'Optional list of runtime flags of the form key=value. Specify ' + 'multiple times to specify different flags. These will override the FLAGS ' + 'object directly after hardcoded settings in individual benchmark methods ' + 'before they call _run_and_report benchmark. Example if we set ' + '--benchmark_method_flags=train_steps=10 and a benchmark method hardcodes ' + 'FLAGS.train_steps=10000 and later calls _run_and_report_benchmark, ' + 'it\'ll only run for 10 steps. This is useful for ' + 'debugging/profiling workflows.') + + +def enable_runtime_flags(decorated_func): + """Sets attributes from --benchmark_method_flags for method execution. + + @enable_runtime_flags decorator temporarily adds flags passed in via + --benchmark_method_flags and runs the decorated function in that context. + + A user can set --benchmark_method_flags=train_steps=5 to run the benchmark + method in the snippet below with FLAGS.train_steps=5 for debugging (without + modifying the benchmark code). + + class ModelBenchmark(): + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + # run benchmark ... + # report benchmark results ... + + def benchmark_method(self): + FLAGS.train_steps = 1000 + ... + self._run_and_report_benchmark() + + Args: + decorated_func: The method that runs the benchmark after previous setup + execution that set some flags. + + Returns: + new_func: The same method which executes in a temporary context where flag + overrides from --benchmark_method_flags are active. + """ + + def runner(*args, **kwargs): + """Creates a temporary context to activate --benchmark_method_flags.""" + if FLAGS.benchmark_method_flags: + saved_flag_values = flagsaver.save_flag_values() + for key_value in FLAGS.benchmark_method_flags: + key, value = key_value.split('=', 1) + try: + numeric_float = float(value) + numeric_int = int(numeric_float) + if abs(numeric_int) == abs(numeric_float): + flag_value = numeric_int + else: + flag_value = numeric_float + except ValueError: + flag_value = value + logging.info('Setting --%s=%s', key, flag_value) + setattr(FLAGS, key, flag_value) + else: + saved_flag_values = None + try: + result = decorated_func(*args, **kwargs) + return result + finally: + if saved_flag_values: + flagsaver.restore_flag_values(saved_flag_values) + + return runner diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark.py new file mode 100644 index 0000000..79d9dd7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark.py @@ -0,0 +1,354 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes BERT benchmarks and accuracy tests.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import json +import math +import os +import time + +# pylint: disable=g-bad-import-order +from absl import flags +from absl.testing import flagsaver +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.benchmark import bert_benchmark_utils as benchmark_utils +from official.nlp.bert import configs +from official.nlp.bert import run_classifier +from official.utils.misc import distribution_utils +from official.benchmark import benchmark_wrappers + +# pylint: disable=line-too-long +PRETRAINED_CHECKPOINT_PATH = 'gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16/bert_model.ckpt' +CLASSIFIER_TRAIN_DATA_PATH = 'gs://tf-perfzero-data/bert/classification/mrpc_train.tf_record' +CLASSIFIER_EVAL_DATA_PATH = 'gs://tf-perfzero-data/bert/classification/mrpc_eval.tf_record' +CLASSIFIER_INPUT_META_DATA_PATH = 'gs://tf-perfzero-data/bert/classification/mrpc_meta_data' +MODEL_CONFIG_FILE_PATH = 'gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16/bert_config.json' +# pylint: enable=line-too-long + +TMP_DIR = os.getenv('TMPDIR') +FLAGS = flags.FLAGS + + +class BertClassifyBenchmarkBase(benchmark_utils.BertBenchmarkBase): + """Base class to hold methods common to test classes in the module.""" + + def __init__(self, output_dir=None, tpu=None): + super(BertClassifyBenchmarkBase, self).__init__(output_dir) + self.num_epochs = None + self.num_steps_per_epoch = None + self.tpu = tpu + FLAGS.steps_per_loop = 50 + + @flagsaver.flagsaver + def _run_bert_classifier(self, callbacks=None, use_ds=True): + """Starts BERT classification task.""" + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + input_meta_data = json.loads(reader.read().decode('utf-8')) + + bert_config = configs.BertConfig.from_json_file(FLAGS.bert_config_file) + epochs = self.num_epochs if self.num_epochs else FLAGS.num_train_epochs + if self.num_steps_per_epoch: + steps_per_epoch = self.num_steps_per_epoch + else: + train_data_size = input_meta_data['train_data_size'] + steps_per_epoch = int(train_data_size / FLAGS.train_batch_size) + warmup_steps = int(epochs * steps_per_epoch * 0.1) + eval_steps = int( + math.ceil(input_meta_data['eval_data_size'] / FLAGS.eval_batch_size)) + if self.tpu: + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy='tpu', tpu_address=self.tpu) + else: + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy='mirrored' if use_ds else 'off', + num_gpus=self.num_gpus) + + max_seq_length = input_meta_data['max_seq_length'] + train_input_fn = run_classifier.get_dataset_fn( + FLAGS.train_data_path, + max_seq_length, + FLAGS.train_batch_size, + is_training=True) + eval_input_fn = run_classifier.get_dataset_fn( + FLAGS.eval_data_path, + max_seq_length, + FLAGS.eval_batch_size, + is_training=False) + run_classifier.run_bert_classifier( + strategy, + bert_config, + input_meta_data, + FLAGS.model_dir, + epochs, + steps_per_epoch, + FLAGS.steps_per_loop, + eval_steps, + warmup_steps, + FLAGS.learning_rate, + FLAGS.init_checkpoint, + train_input_fn, + eval_input_fn, + custom_callbacks=callbacks) + + +class BertClassifyBenchmarkReal(BertClassifyBenchmarkBase): + """Short benchmark performance tests for BERT model. + + Tests BERT classification performance in different GPU, TPU configurations. + The naming convention of below test cases follow + `benchmark_(number of gpus)_gpu_(dataset type)` for GPUs and + `benchmark_(topology)_tpu_(dataset type)` for TPUs. + """ + + def __init__(self, output_dir=TMP_DIR, tpu=None, **kwargs): + super(BertClassifyBenchmarkReal, self).__init__( + output_dir=output_dir, tpu=tpu) + + self.train_data_path = CLASSIFIER_TRAIN_DATA_PATH + self.eval_data_path = CLASSIFIER_EVAL_DATA_PATH + self.bert_config_file = MODEL_CONFIG_FILE_PATH + self.input_meta_data_path = CLASSIFIER_INPUT_META_DATA_PATH + + # Since we only care about performance metrics, we limit + # the number of training steps and epochs to prevent unnecessarily + # long tests. + self.num_steps_per_epoch = 100 + self.num_epochs = 1 + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + training_summary_path, + min_accuracy=0, + max_accuracy=1, + use_ds=True): + """Starts BERT performance benchmark test.""" + start_time_sec = time.time() + self._run_bert_classifier(callbacks=[self.timer_callback], use_ds=use_ds) + wall_time_sec = time.time() - start_time_sec + + with tf.io.gfile.GFile(training_summary_path, 'rb') as reader: + summary = json.loads(reader.read().decode('utf-8')) + + # Since we do not load from any pretrained checkpoints, we ignore all + # accuracy metrics. + summary.pop('eval_metrics', None) + summary['start_time_sec'] = start_time_sec + + super(BertClassifyBenchmarkReal, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=min_accuracy, + max_accuracy=max_accuracy) + + def benchmark_1_gpu_mrpc(self): + """Test BERT model performance with 1 GPU.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_mrpc') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 4 + FLAGS.eval_batch_size = 4 + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + def benchmark_1_gpu_mrpc_xla(self): + """Test BERT model performance with 1 GPU.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_mrpc_xla') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 4 + FLAGS.eval_batch_size = 4 + FLAGS.enable_xla = True + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + def benchmark_1_gpu_mrpc_no_dist_strat(self): + """Test BERT model performance with 1 GPU, no distribution strategy.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_mrpc_no_dist_strat') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 4 + FLAGS.eval_batch_size = 4 + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path, use_ds=False) + + def benchmark_8_gpu_mrpc(self): + """Test BERT model performance with 8 GPUs.""" + + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_mrpc') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + def benchmark_1_gpu_amp_mrpc_no_dist_strat(self): + """Performance for 1 GPU no DS with automatic mixed precision.""" + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_amp_mrpc_no_dist_strat') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 4 + FLAGS.eval_batch_size = 4 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path, use_ds=False) + + def benchmark_8_gpu_amp_mrpc(self): + """Test BERT model performance with 8 GPUs with automatic mixed precision. + """ + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_amp_mrpc') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 32 + FLAGS.eval_batch_size = 32 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path, use_ds=False) + + def benchmark_2x2_tpu_mrpc(self): + """Test BERT model performance with 2x2 TPU.""" + + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_2x2_tpu_mrpc') + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.train_batch_size = 32 + FLAGS.eval_batch_size = 32 + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path, use_ds=False) + + +class BertClassifyAccuracy(BertClassifyBenchmarkBase): + """Short accuracy test for BERT model. + + Tests BERT classification task model accuracy. The naming + convention of below test cases follow + `benchmark_(number of gpus)_gpu_(dataset type)` format. + """ + + def __init__(self, output_dir=TMP_DIR, **kwargs): + self.train_data_path = CLASSIFIER_TRAIN_DATA_PATH + self.eval_data_path = CLASSIFIER_EVAL_DATA_PATH + self.bert_config_file = MODEL_CONFIG_FILE_PATH + self.input_meta_data_path = CLASSIFIER_INPUT_META_DATA_PATH + self.pretrained_checkpoint_path = PRETRAINED_CHECKPOINT_PATH + + super(BertClassifyAccuracy, self).__init__(output_dir=output_dir) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + training_summary_path, + min_accuracy=0.84, + max_accuracy=0.88): + """Starts BERT accuracy benchmark test.""" + + start_time_sec = time.time() + self._run_bert_classifier(callbacks=[self.timer_callback]) + wall_time_sec = time.time() - start_time_sec + + with tf.io.gfile.GFile(training_summary_path, 'rb') as reader: + summary = json.loads(reader.read().decode('utf-8')) + + super(BertClassifyAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=min_accuracy, + max_accuracy=max_accuracy) + + def _setup(self): + super(BertClassifyAccuracy, self)._setup() + FLAGS.train_data_path = self.train_data_path + FLAGS.eval_data_path = self.eval_data_path + FLAGS.input_meta_data_path = self.input_meta_data_path + FLAGS.bert_config_file = self.bert_config_file + FLAGS.init_checkpoint = self.pretrained_checkpoint_path + + def benchmark_8_gpu_mrpc(self): + """Run BERT model accuracy test with 8 GPUs. + + Due to comparatively small cardinality of MRPC dataset, training + accuracy metric has high variance between trainings. As so, we + set the wide range of allowed accuracy (84% to 88%). + """ + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_mrpc') + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + def benchmark_8_gpu_mrpc_xla(self): + """Run BERT model accuracy test with 8 GPUs with XLA.""" + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_mrpc_xla') + FLAGS.enable_xla = True + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark_utils.py new file mode 100644 index 0000000..11bdd7e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_benchmark_utils.py @@ -0,0 +1,126 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions or classes shared between BERT benchmarks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import time + +# pylint: disable=g-bad-import-order +import numpy as np +from absl import flags +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.utils.flags import core as flags_core +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark + +FLAGS = flags.FLAGS + + +class BenchmarkTimerCallback(tf.keras.callbacks.Callback): + """Callback that records time it takes to run each batch.""" + + def __init__(self, num_batches_to_skip=10): + super(BenchmarkTimerCallback, self).__init__() + self.batch_start_times = {} + self.batch_stop_times = {} + + def on_batch_begin(self, batch, logs=None): + self.batch_start_times[batch] = time.time() + + def on_batch_end(self, batch, logs=None): + # If there are multiple steps_per_loop, the end batch index will not be the + # same as the starting index. Use the last starting index instead. + if batch not in self.batch_start_times: + batch = max(self.batch_start_times.keys()) + + self.batch_stop_times[batch] = time.time() + + def get_examples_per_sec(self, batch_size, num_batches_to_skip=1): + batch_durations = [] + for batch in self.batch_start_times: + if batch in self.batch_stop_times and batch >= num_batches_to_skip: + batch_durations.append(self.batch_stop_times[batch] - + self.batch_start_times[batch]) + return batch_size / np.mean(batch_durations) + + def get_startup_time(self, program_start_time): + return self.batch_start_times[0] - program_start_time + + +class BertBenchmarkBase(PerfZeroBenchmark): + """Base class to hold methods common to test classes.""" + local_flags = None + + def __init__(self, output_dir=None): + super(BertBenchmarkBase, self).__init__(output_dir=output_dir) + self.num_gpus = 8 + self.timer_callback = None + + def _setup(self): + """Sets up and resets flags before each test.""" + super(BertBenchmarkBase, self)._setup() + self.timer_callback = BenchmarkTimerCallback() + + def _report_benchmark(self, stats, wall_time_sec, min_accuracy, max_accuracy): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from BERT models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + min_accuracy: Minimum classification accuracy constraint to verify + correctness of the model. + max_accuracy: Maximum classification accuracy constraint to verify + correctness of the model. + """ + metrics = [{ + 'name': 'training_loss', + 'value': stats['train_loss'], + }] + if self.timer_callback: + metrics.append({ + 'name': + 'exp_per_second', + 'value': + self.timer_callback.get_examples_per_sec(FLAGS.train_batch_size * + FLAGS.steps_per_loop) + }) + else: + metrics.append({ + 'name': 'exp_per_second', + 'value': 0.0, + }) + if self.timer_callback and 'start_time_sec' in stats: + metrics.append({ + 'name': 'startup_time', + 'value': self.timer_callback.get_startup_time(stats['start_time_sec']) + }) + + if 'eval_metrics' in stats: + metrics.append({ + 'name': 'eval_accuracy', + 'value': stats['eval_metrics'], + 'min_value': min_accuracy, + 'max_value': max_accuracy, + }) + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=stats['total_training_steps'], + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_squad_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_squad_benchmark.py new file mode 100644 index 0000000..d794316 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/bert_squad_benchmark.py @@ -0,0 +1,654 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes BERT SQuAD benchmarks and accuracy tests.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import time + +# pylint: disable=g-bad-import-order +from absl import flags +from absl import logging +from absl.testing import flagsaver +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.benchmark import bert_benchmark_utils as benchmark_utils +from official.nlp.bert import run_squad +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.benchmark import benchmark_wrappers + + +# pylint: disable=line-too-long +PRETRAINED_CHECKPOINT_PATH = 'gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16/bert_model.ckpt' +SQUAD_TRAIN_DATA_PATH = 'gs://tf-perfzero-data/bert/squad/squad_train.tf_record' +SQUAD_PREDICT_FILE = 'gs://tf-perfzero-data/bert/squad/dev-v1.1.json' +SQUAD_VOCAB_FILE = 'gs://tf-perfzero-data/bert/squad/vocab.txt' +SQUAD_MEDIUM_INPUT_META_DATA_PATH = 'gs://tf-perfzero-data/bert/squad/squad_medium_meta_data' +SQUAD_LONG_INPUT_META_DATA_PATH = 'gs://tf-perfzero-data/bert/squad/squad_long_meta_data' +SQUAD_FULL_INPUT_META_DATA_PATH = 'gs://tf-perfzero-data/bert/squad/squad_full_meta_data' +MODEL_CONFIG_FILE_PATH = 'gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16/bert_config.json' +# pylint: enable=line-too-long + +TMP_DIR = os.getenv('TMPDIR') +FLAGS = flags.FLAGS + + +class BertSquadBenchmarkBase(benchmark_utils.BertBenchmarkBase): + """Base class to hold methods common to test classes in the module.""" + + def __init__(self, output_dir=None, tpu=None): + super(BertSquadBenchmarkBase, self).__init__(output_dir=output_dir) + self.tpu = tpu + + def _read_training_summary_from_file(self): + """Reads the training summary from a file.""" + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + with tf.io.gfile.GFile(summary_path, 'rb') as reader: + return json.loads(reader.read().decode('utf-8')) + + def _read_input_meta_data_from_file(self): + """Reads the input metadata from a file.""" + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + return json.loads(reader.read().decode('utf-8')) + + def _get_distribution_strategy(self, ds_type='mirrored'): + """Gets the distribution strategy. + + Args: + ds_type: String, the distribution strategy type to be used. Can be + 'mirrored', 'multi_worker_mirrored', 'tpu' and 'off'. + + Returns: + A `tf.distribute.DistibutionStrategy` object. + """ + if self.tpu or ds_type == 'tpu': + return distribution_utils.get_distribution_strategy( + distribution_strategy='tpu', tpu_address=self.tpu) + elif ds_type == 'multi_worker_mirrored': + # Configures cluster spec for multi-worker distribution strategy. + _ = distribution_utils.configure_cluster(FLAGS.worker_hosts, + FLAGS.task_index) + return distribution_utils.get_distribution_strategy( + distribution_strategy=ds_type, + num_gpus=self.num_gpus, + all_reduce_alg=FLAGS.all_reduce_alg) + + def _init_gpu_and_data_threads(self): + """Set env variables before any TF calls.""" + if FLAGS.tf_gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=FLAGS.per_gpu_thread_count, + gpu_thread_mode=FLAGS.tf_gpu_thread_mode, + num_gpus=self.num_gpus, + datasets_num_private_threads=FLAGS.datasets_num_private_threads) + + @flagsaver.flagsaver + def _train_squad(self, run_eagerly=False, ds_type='mirrored'): + """Runs BERT SQuAD training. Uses mirrored strategy by default.""" + self._init_gpu_and_data_threads() + input_meta_data = self._read_input_meta_data_from_file() + strategy = self._get_distribution_strategy(ds_type) + + run_squad.train_squad( + strategy=strategy, + input_meta_data=input_meta_data, + run_eagerly=run_eagerly, + custom_callbacks=[self.timer_callback]) + + @flagsaver.flagsaver + def _evaluate_squad(self, ds_type='mirrored'): + """Runs BERT SQuAD evaluation. Uses mirrored strategy by default.""" + self._init_gpu_and_data_threads() + input_meta_data = self._read_input_meta_data_from_file() + strategy = self._get_distribution_strategy(ds_type) + + if input_meta_data.get('version_2_with_negative', False): + logging.error('In memory evaluation result for SQuAD v2 is not accurate') + eval_metrics = run_squad.eval_squad(strategy=strategy, + input_meta_data=input_meta_data) + # Use F1 score as reported evaluation metric. + self.eval_metrics = eval_metrics['final_f1'] + + +class BertSquadBenchmarkReal(BertSquadBenchmarkBase): + """Short benchmark performance tests for BERT SQuAD model. + + Tests BERT SQuAD performance in different GPU configurations. + The naming convention of below test cases follow + `benchmark_(number of gpus)_gpu` format for GPUs and + `benchmark_(topology)_tpu` format for TPUs. + """ + + def __init__(self, output_dir=TMP_DIR, tpu=None, **kwargs): + super(BertSquadBenchmarkReal, self).__init__(output_dir=output_dir, tpu=tpu) + + def _setup(self): + """Sets up the benchmark and SQuAD flags.""" + super(BertSquadBenchmarkReal, self)._setup() + FLAGS.train_data_path = SQUAD_TRAIN_DATA_PATH + FLAGS.predict_file = SQUAD_PREDICT_FILE + FLAGS.vocab_file = SQUAD_VOCAB_FILE + FLAGS.bert_config_file = MODEL_CONFIG_FILE_PATH + FLAGS.num_train_epochs = 1 + FLAGS.steps_per_loop = 100 + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + run_eagerly=False, + ds_type='mirrored'): + """Runs the benchmark and reports various metrics.""" + if FLAGS.train_batch_size <= 4 or run_eagerly: + FLAGS.input_meta_data_path = SQUAD_MEDIUM_INPUT_META_DATA_PATH + else: + FLAGS.input_meta_data_path = SQUAD_LONG_INPUT_META_DATA_PATH + start_time_sec = time.time() + self._train_squad(run_eagerly=run_eagerly, ds_type=ds_type) + wall_time_sec = time.time() - start_time_sec + + summary = self._read_training_summary_from_file() + summary['start_time_sec'] = start_time_sec + + super(BertSquadBenchmarkReal, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=0, + max_accuracy=1) + + def benchmark_1_gpu(self): + """Tests BERT SQuAD model performance with 1 GPU.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_squad') + FLAGS.train_batch_size = 4 + + self._run_and_report_benchmark() + + def benchmark_1_gpu_eager(self): + """Tests BERT SQuAD model performance with 1 GPU.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_squad_eager') + FLAGS.train_batch_size = 2 + + self._run_and_report_benchmark(run_eagerly=True) + + def benchmark_1_gpu_xla(self): + """Tests BERT SQuAD model performance with 1 GPU with XLA.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_xla_squad') + # XLA runs out of memory when running with batch size 4. + FLAGS.train_batch_size = 3 + FLAGS.enable_xla = True + + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat(self): + """Tests BERT SQuAD model performance with 1 GPU without DS.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat_squad') + FLAGS.train_batch_size = 4 + + self._run_and_report_benchmark(ds_type='off') + + def benchmark_1_gpu_eager_no_dist_strat(self): + """Tests BERT SQuAD model performance with 1 GPU with eager execution.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_eager_no_dist_strat_squad') + FLAGS.train_batch_size = 4 + + self._run_and_report_benchmark(ds_type='off', run_eagerly=True) + + def benchmark_2_gpu(self): + """Tests BERT SQuAD model performance with 2 GPUs.""" + + self._setup() + self.num_gpus = 2 + FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu_squad') + FLAGS.train_batch_size = 8 + + self._run_and_report_benchmark() + + def benchmark_4_gpu(self): + """Tests BERT SQuAD model performance with 4 GPUs.""" + + self._setup() + self.num_gpus = 4 + FLAGS.model_dir = self._get_model_dir('benchmark_4_gpu_squad') + FLAGS.train_batch_size = 16 + + self._run_and_report_benchmark() + + def benchmark_8_gpu(self): + """Tests BERT SQuAD model performance with 8 GPUs.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad') + FLAGS.train_batch_size = 24 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16_eager(self): + """Tests BERT SQuAD model performance with 1 GPU and FP16.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_squad_fp16_eager') + FLAGS.train_batch_size = 4 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark(run_eagerly=True) + + def benchmark_1_gpu_fp16(self): + """Tests BERT SQuAD model performance with 1 GPU and FP16.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_squad_fp16') + FLAGS.train_batch_size = 4 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark() + + def benchmark_1_gpu_xla_fp16(self): + """Tests BERT SQuAD model performance with 1 GPU with XLA and FP16.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_xla_squad_fp16') + FLAGS.train_batch_size = 4 + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark() + + def benchmark_2_gpu_fp16(self): + """Tests BERT SQuAD model performance with 2 GPUs and FP16.""" + + self._setup() + self.num_gpus = 2 + FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu_squad_fp16') + FLAGS.train_batch_size = 8 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark() + + def benchmark_4_gpu_fp16(self): + """Tests BERT SQuAD model performance with 4 GPUs and FP16.""" + + self._setup() + self.num_gpus = 4 + FLAGS.model_dir = self._get_model_dir('benchmark_4_gpu_squad_fp16') + FLAGS.train_batch_size = 16 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16(self): + """Tests BERT SQuAD model performance with 8 GPUs.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad_fp16') + FLAGS.train_batch_size = 32 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_8_gpu_xla_fp16(self): + """Tests BERT SQuAD model performance with 8 GPUs with XLA.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad_fp16') + FLAGS.train_batch_size = 32 + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + + self._run_and_report_benchmark() + + def benchmark_1_gpu_amp(self): + """Tests BERT SQuAD model performance with 1 GPU with automatic mixed precision.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_amp_squad') + FLAGS.train_batch_size = 4 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + + self._run_and_report_benchmark() + + def benchmark_4_gpu_amp(self): + """Tests BERT SQuAD model performance with 1 GPU with automatic mixed precision.""" + + self._setup() + self.num_gpus = 4 + FLAGS.model_dir = self._get_model_dir('benchmark_4_gpu_amp_squad') + FLAGS.train_batch_size = 16 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + + self._run_and_report_benchmark() + + def benchmark_8_gpu_amp(self): + """Tests BERT SQuAD model performance with 1 GPU with automatic mixed precision.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_amp_squad') + FLAGS.train_batch_size = 32 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_2x2_tpu(self): + """Tests BERT SQuAD model performance with 2x2 TPU.""" + + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_2x2_tpu') + FLAGS.train_batch_size = 48 + + self._run_and_report_benchmark() + + +class BertSquadAccuracy(BertSquadBenchmarkBase): + """Short accuracy test for BERT SQuAD model. + + Tests BERT SQuAD accuracy. The naming convention of below test cases follow + `benchmark_(number of gpus)_gpu` format for GPUs and + `benchmark_(topology)_tpu` format for TPUs. + """ + + def __init__(self, output_dir=None, tpu=None, **kwargs): + super(BertSquadAccuracy, self).__init__(output_dir=output_dir, tpu=tpu) + + def _setup(self): + """Sets up the benchmark and SQuAD flags.""" + super(BertSquadAccuracy, self)._setup() + FLAGS.train_data_path = SQUAD_TRAIN_DATA_PATH + FLAGS.predict_file = SQUAD_PREDICT_FILE + FLAGS.vocab_file = SQUAD_VOCAB_FILE + FLAGS.input_meta_data_path = SQUAD_FULL_INPUT_META_DATA_PATH + FLAGS.bert_config_file = MODEL_CONFIG_FILE_PATH + FLAGS.init_checkpoint = PRETRAINED_CHECKPOINT_PATH + FLAGS.num_train_epochs = 2 + FLAGS.steps_per_loop = 100 + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + run_eagerly=False, + ds_type='mirrored'): + """Runs the benchmark and reports various metrics.""" + start_time_sec = time.time() + self._train_squad(run_eagerly=run_eagerly, ds_type=ds_type) + self._evaluate_squad(ds_type=ds_type) + wall_time_sec = time.time() - start_time_sec + + summary = self._read_training_summary_from_file() + summary['eval_metrics'] = self.eval_metrics + summary['start_time_sec'] = start_time_sec + + super(BertSquadAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=0.900, + max_accuracy=0.920) + + def benchmark_1_gpu_eager(self): + """Tests BERT SQuAD model accuracy with 1 GPU with eager execution.""" + + self._setup() + self.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_squad_eager') + FLAGS.train_batch_size = 4 + + self._run_and_report_benchmark(ds_type='off', run_eagerly=True) + + def benchmark_8_gpu(self): + """Tests BERT SQuAD model accuracy with 8 GPUs.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad') + FLAGS.train_batch_size = 24 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16(self): + """Tests BERT SQuAD model accuracy with 8 GPUs and FP16.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad_fp16') + FLAGS.train_batch_size = 32 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 'dynamic' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_8_gpu_xla(self): + """Tests BERT SQuAD model accuracy with 8 GPUs.""" + + self._setup() + self.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squad_xla') + FLAGS.train_batch_size = 32 + FLAGS.enable_xla = True + FLAGS.tf_gpu_thread_mode = 'gpu_private' + + self._run_and_report_benchmark() + + def benchmark_2x2_tpu(self): + """Tests BERT SQuAD model accuracy with 2x2 TPU.""" + + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_2x2_tpu') + FLAGS.train_batch_size = 48 + + self._run_and_report_benchmark() + + +class BertSquadMultiWorkerAccuracy(BertSquadBenchmarkBase): + """BERT SQuAD distributed accuracy tests with multiple workers.""" + + def __init__(self, output_dir=None, tpu=None, **kwargs): + super(BertSquadMultiWorkerAccuracy, self).__init__( + output_dir=output_dir, tpu=tpu) + + def _setup(self): + """Sets up the benchmark and SQuAD flags.""" + super(BertSquadMultiWorkerAccuracy, self)._setup() + FLAGS.train_data_path = SQUAD_TRAIN_DATA_PATH + FLAGS.predict_file = SQUAD_PREDICT_FILE + FLAGS.vocab_file = SQUAD_VOCAB_FILE + FLAGS.input_meta_data_path = SQUAD_FULL_INPUT_META_DATA_PATH + FLAGS.bert_config_file = MODEL_CONFIG_FILE_PATH + FLAGS.init_checkpoint = PRETRAINED_CHECKPOINT_PATH + FLAGS.num_train_epochs = 2 + FLAGS.steps_per_loop = 100 + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + use_ds=True, + run_eagerly=False): + """Runs the benchmark and reports various metrics.""" + start_time_sec = time.time() + self._train_squad(run_eagerly=run_eagerly, + ds_type='multi_worker_mirrored') + self._evaluate_squad(ds_type='multi_worker_mirrored') + wall_time_sec = time.time() - start_time_sec + + summary = self._read_training_summary_from_file() + summary['eval_metrics'] = self.eval_metrics + + super(BertSquadMultiWorkerAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=0.900, + max_accuracy=0.920) + + def _benchmark_common(self, num_workers, all_reduce_alg): + """Common to all benchmarks in this class.""" + self._setup() + + num_gpus = 8 + FLAGS.num_gpus = num_gpus + FLAGS.dtype = 'fp16' + FLAGS.enable_xla = False + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_8_gpu_{}_worker_fp16_{}_tweaked'.format( + num_workers, all_reduce_alg)) + FLAGS.train_batch_size = 4 * num_gpus * num_workers + FLAGS.all_reduce_alg = all_reduce_alg + + self._run_and_report_benchmark() + + def benchmark_eager_8_gpu_2_workers_fp16_ring_tweaked(self): + """8 GPUs per worker, 2 workers, fp16, ring all-reduce.""" + self._benchmark_common(num_workers=2, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_2_workers_fp16_nccl_tweaked(self): + """8 GPUs per worker, 2 workers, fp16, nccl all-reduce.""" + self._benchmark_common(num_workers=2, all_reduce_alg='nccl') + + def benchmark_8_gpu_8_workers_fp16_ring_tweaked(self): + """8 GPUs per worker, 8 workers, fp16, ring all-reduce.""" + self._benchmark_common(num_workers=8, all_reduce_alg='ring') + + def benchmark_8_gpu_8_workers_fp16_nccl_tweaked(self): + """8 GPUs per worker, 8 workers, fp16, nccl all-reduce.""" + self._benchmark_common(num_workers=8, all_reduce_alg='nccl') + + +class BertSquadMultiWorkerBenchmark(BertSquadBenchmarkBase): + """BERT SQuAD distributed benchmark tests with multiple workers.""" + + def __init__(self, output_dir=TMP_DIR, tpu=None, **kwargs): + super(BertSquadMultiWorkerBenchmark, self).__init__( + output_dir=output_dir, tpu=tpu) + + def _setup(self): + """Sets up the benchmark and SQuAD flags.""" + super(BertSquadMultiWorkerBenchmark, self)._setup() + FLAGS.train_data_path = SQUAD_TRAIN_DATA_PATH + FLAGS.predict_file = SQUAD_PREDICT_FILE + FLAGS.vocab_file = SQUAD_VOCAB_FILE + FLAGS.input_meta_data_path = SQUAD_FULL_INPUT_META_DATA_PATH + FLAGS.bert_config_file = MODEL_CONFIG_FILE_PATH + FLAGS.num_train_epochs = 1 + FLAGS.steps_per_loop = 100 + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + use_ds=True, + run_eagerly=False): + """Runs the benchmark and reports various metrics.""" + if FLAGS.train_batch_size <= 4 * 8: + FLAGS.input_meta_data_path = SQUAD_LONG_INPUT_META_DATA_PATH + else: + FLAGS.input_meta_data_path = SQUAD_FULL_INPUT_META_DATA_PATH + start_time_sec = time.time() + self._train_squad(run_eagerly=run_eagerly, + ds_type='multi_worker_mirrored') + wall_time_sec = time.time() - start_time_sec + + summary = self._read_training_summary_from_file() + summary['start_time_sec'] = start_time_sec + + super(BertSquadMultiWorkerBenchmark, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=0, + max_accuracy=1) + + def _benchmark_common(self, num_workers, all_reduce_alg): + """Common to all benchmarks in this class.""" + self._setup() + + num_gpus = 8 + FLAGS.num_gpus = num_gpus + FLAGS.dtype = 'fp16' + FLAGS.enable_xla = False + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_8_gpu_{}_worker_fp16_{}_tweaked'.format( + num_workers, all_reduce_alg)) + FLAGS.train_batch_size = 4 * num_gpus * num_workers + FLAGS.all_reduce_alg = all_reduce_alg + + self._run_and_report_benchmark() + + def benchmark_8_gpu_1_worker_fp16_ring_tweaked(self): + """8 GPUs per worker, 1 worker, fp16, ring all-reduce.""" + self._benchmark_common(num_workers=1, all_reduce_alg='ring') + + def benchmark_8_gpu_1_worker_fp16_nccl_tweaked(self): + """8 GPUs per worker, 1 worker, fp16, nccl all-reduce.""" + self._benchmark_common(num_workers=1, all_reduce_alg='nccl') + + def benchmark_8_gpu_2_workers_fp16_ring_tweaked(self): + """8 GPUs per worker, 2 workers, fp16, ring all-reduce.""" + self._benchmark_common(num_workers=2, all_reduce_alg='ring') + + def benchmark_8_gpu_2_workers_fp16_nccl_tweaked(self): + """8 GPUs per worker, 2 workers, fp16, nccl all-reduce.""" + self._benchmark_common(num_workers=2, all_reduce_alg='nccl') + + def benchmark_8_gpu_8_workers_fp16_ring_tweaked(self): + """8 GPUs per worker, 8 workers, fp16, ring all-reduce.""" + self._benchmark_common(num_workers=8, all_reduce_alg='ring') + + def benchmark_8_gpu_8_workers_fp16_nccl_tweaked(self): + """8 GPUs per worker, 8 workers, fp16, nccl all-reduce.""" + self._benchmark_common(num_workers=8, all_reduce_alg='nccl') + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json new file mode 100644 index 0000000..cc571d4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json @@ -0,0 +1,56 @@ +[ + { + "description": "The ID of the benchmark run, where this metric should tie to.", + "mode": "REQUIRED", + "name": "run_id", + "type": "STRING" + }, + { + "description": "The name of the metric, which should be descriptive. E.g. training_loss, accuracy.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The unit of the metric. E.g. MB per sec.", + "mode": "NULLABLE", + "name": "unit", + "type": "STRING" + }, + { + "description": "The value of the metric.", + "mode": "NULLABLE", + "name": "value", + "type": "FLOAT" + }, + { + "description": "The timestamp when the metric is recorded.", + "mode": "REQUIRED", + "name": "timestamp", + "type": "TIMESTAMP" + }, + { + "description": "The global step when this metric is recorded.", + "mode": "NULLABLE", + "name": "global_step", + "type": "INTEGER" + }, + { + "description": "Free format metadata for the extra information about the metric.", + "mode": "REPEATED", + "name": "extras", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "name", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ] + } +] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json new file mode 100644 index 0000000..58e5ddc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json @@ -0,0 +1,368 @@ +[ + { + "description": "The UUID of the run for the benchmark.", + "mode": "REQUIRED", + "name": "model_id", + "type": "STRING" + }, + { + "description": "The name of the model, E.g ResNet50, LeNet-5 etc.", + "mode": "REQUIRED", + "name": "model_name", + "type": "STRING" + }, + { + "description": "The date when the test of the model is started", + "mode": "REQUIRED", + "name": "run_date", + "type": "TIMESTAMP" + }, + { + "description": "The unique name for a test by the combination of key parameters, eg batch size, num of GPU, etc. It is hardware independent.", + "mode": "NULLABLE", + "name": "test_id", + "type": "STRING" + }, + { + "description": "The tensorflow version information.", + "fields": [ + { + "description": "Version of the tensorflow. E.g. 1.7.0-rc0", + "mode": "REQUIRED", + "name": "version", + "type": "STRING" + }, + { + "description": "Git Hash of the tensorflow", + "mode": "NULLABLE", + "name": "git_hash", + "type": "STRING" + }, + { + "description": "The channel of the tensorflow binary, eg, nightly, RC, final, custom.", + "mode": "NULLABLE", + "name": "channel", + "type": "STRING" + }, + { + "description": "Identify anything special about the build, eg CUDA 10, NCCL, MKL, etc.", + "mode": "NULLABLE", + "name": "build_type", + "type": "STRING" + } + ], + "mode": "REQUIRED", + "name": "tensorflow_version", + "type": "RECORD" + }, + { + "description": "The arbitrary attribute of the model.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + }, + { + "description": "Environment variables when the benchmark run is executed.", + "fields": [ + { + "description": "The name of the variable.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the variable.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "environment_variable", + "type": "RECORD" + }, + { + "description": "TF Environment variables when the benchmark run is executed.", + "fields": [ + { + "description": "The name of the variable.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the variable.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "tensorflow_environment_variables", + "type": "RECORD" + }, + { + "description": "The list of parameters run with the model. It could contain hyperparameters or others.", + "fields": [ + { + "description": "The name of the parameter.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The string value of the parameter.", + "mode": "NULLABLE", + "name": "string_value", + "type": "STRING" + }, + { + "description": "The bool value of the parameter.", + "mode": "NULLABLE", + "name": "bool_value", + "type": "STRING" + }, + { + "description": "The int/long value of the parameter.", + "mode": "NULLABLE", + "name": "long_value", + "type": "INTEGER" + }, + { + "description": "The double/float value of parameter.", + "mode": "NULLABLE", + "name": "float_value", + "type": "FLOAT" + } + ], + "mode": "REPEATED", + "name": "run_parameters", + "type": "RECORD" + }, + { + "description": "The dataset that run with the benchmark.", + "mode": "NULLABLE", + "name": "dataset", + "type": "RECORD", + "fields": [ + { + "description": "The name of the dataset that the model is trained/validated with. E.g ImageNet, mnist.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The arbitrary attribute of the dataset.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + } + ] + }, + { + "description": "Used to differentiate from AWS, GCE or DGX-1 at a high level", + "mode": "NULLABLE", + "name": "test_environment", + "type": "STRING" + }, + { + "description": "The machine configuration of the benchmark run.", + "mode": "NULLABLE", + "name": "machine_config", + "type": "RECORD", + "fields": [ + { + "description": "The platform information of the benchmark run.", + "mode": "NULLABLE", + "name": "platform_info", + "type": "RECORD", + "fields": [ + { + "description": "Eg: 64bit.", + "mode": "NULLABLE", + "name": "bits", + "type": "STRING" + }, + { + "description": "Eg: ELF.", + "mode": "NULLABLE", + "name": "linkage", + "type": "STRING" + }, + { + "description": "Eg: i386.", + "mode": "NULLABLE", + "name": "machine", + "type": "STRING" + }, + { + "description": "Eg: 3.13.0-76-generic.", + "mode": "NULLABLE", + "name": "release", + "type": "STRING" + }, + { + "description": "Eg: Linux.", + "mode": "NULLABLE", + "name": "system", + "type": "STRING" + }, + { + "description": "Eg: #120-Ubuntu SMP Mon Jan 18 15:59:10 UTC 2016.", + "mode": "NULLABLE", + "name": "version", + "type": "STRING" + } + ] + }, + { + "description": "The CPU information of the benchmark run.", + "mode": "NULLABLE", + "name": "cpu_info", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "num_cores", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "num_cores_allowed", + "type": "INTEGER" + }, + { + "description" : "How fast are those CPUs.", + "mode": "NULLABLE", + "name": "mhz_per_cpu", + "type": "FLOAT" + }, + { + "description" : "Additional CPU info, Eg: Intel Ivybridge with HyperThreading (24 cores).", + "mode": "NULLABLE", + "name": "cpu_info", + "type": "STRING" + }, + { + "description" : "What kind of cpu scaling is enabled on the host. Eg performance, ondemand, conservative, mixed.", + "mode": "NULLABLE", + "name": "cpu_governor", + "type": "STRING" + }, + { + "description": "Cache size of the CPUs.", + "mode": "NULLABLE", + "name": "cache_size", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "level", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "size", + "type": "INTEGER" + } + ] + } + ] + }, + { + "mode": "NULLABLE", + "name": "gpu_info", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "count", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "model", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "cuda_version", + "type": "STRING" + } + ] + }, + { + "description": "The cloud instance inforation if the benchmark run is executed on cloud", + "mode": "NULLABLE", + "name": "cloud_info", + "type": "RECORD", + "fields": [ + { + "description": "The instance type, E.g. n1-standard-4.", + "mode": "NULLABLE", + "name": "instance_type", + "type": "STRING" + }, + { + "description": "The arbitrary attribute of the cloud info.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + } + ] + }, + { + "mode": "NULLABLE", + "name": "memory_total", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "memory_available", + "type": "STRING" + } + ] + } +] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json new file mode 100644 index 0000000..f7ac59e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json @@ -0,0 +1,14 @@ +[ + { + "description": "The UUID of the run for the benchmark.", + "mode": "REQUIRED", + "name": "run_id", + "type": "STRING" + }, + { + "description": "The status of the run for the benchmark. Eg, running, failed, success", + "mode": "REQUIRED", + "name": "status", + "type": "STRING" + } +] \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_benchmark.py new file mode 100644 index 0000000..770674a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_benchmark.py @@ -0,0 +1,98 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Keras benchmarks and accuracy tests.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark +from official.utils.flags import core as flags_core + + +class KerasBenchmark(PerfZeroBenchmark): + """Base benchmark class with methods to simplify testing.""" + + def __init__(self, + output_dir=None, + default_flags=None, + flag_methods=None, + tpu=None): + super(KerasBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + flag_methods=flag_methods, + tpu=tpu) + + def _report_benchmark(self, + stats, + wall_time_sec, + top_1_max=None, + top_1_min=None, + log_steps=None, + total_batch_size=None, + warmup=1, + start_time_sec=None): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from keras models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + top_1_max: highest passing level for top_1 accuracy. + top_1_min: lowest passing level for top_1 accuracy. + log_steps: How often the log was created for stats['step_timestamp_log']. + total_batch_size: Global batch-size. + warmup: number of entries in stats['step_timestamp_log'] to ignore. + start_time_sec: the start time of the program in seconds since epoch + """ + + metrics = [] + if 'accuracy_top_1' in stats: + metrics.append({'name': 'accuracy_top_1', + 'value': stats['accuracy_top_1'], + 'min_value': top_1_min, + 'max_value': top_1_max}) + metrics.append({'name': 'top_1_train_accuracy', + 'value': stats['training_accuracy_top_1']}) + + if (warmup and 'step_timestamp_log' in stats and + len(stats['step_timestamp_log']) > warmup): + # first entry in the time_log is start of step 1. The rest of the + # entries are the end of each step recorded + time_log = stats['step_timestamp_log'] + elapsed = time_log[-1].timestamp - time_log[warmup].timestamp + num_examples = ( + total_batch_size * log_steps * (len(time_log) - warmup - 1)) + examples_per_sec = num_examples / elapsed + metrics.append({'name': 'exp_per_second', + 'value': examples_per_sec}) + + if 'avg_exp_per_second' in stats: + metrics.append({'name': 'avg_exp_per_second', + 'value': stats['avg_exp_per_second']}) + + if start_time_sec and 'step_timestamp_log' in stats: + time_log = stats['step_timestamp_log'] + # time_log[0] is recorded at the beginning of the first step. + startup_time = time_log[0].timestamp - start_time_sec + metrics.append({'name': 'startup_time', 'value': startup_time}) + + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=-1, + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_cifar_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_cifar_benchmark.py new file mode 100644 index 0000000..694200f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_cifar_benchmark.py @@ -0,0 +1,402 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Keras benchmarks and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time +from absl import flags +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.benchmark import keras_benchmark +from official.benchmark import benchmark_wrappers +from official.benchmark.models import resnet_cifar_main + +MIN_TOP_1_ACCURACY = 0.929 +MAX_TOP_1_ACCURACY = 0.938 + +FLAGS = flags.FLAGS +CIFAR_DATA_DIR_NAME = 'cifar-10-batches-bin' + + +class Resnet56KerasAccuracy(keras_benchmark.KerasBenchmark): + """Accuracy tests for ResNet56 Keras CIFAR-10.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + + self.data_dir = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME) + flag_methods = [resnet_cifar_main.define_cifar_flags] + + super(Resnet56KerasAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def _setup(self): + super(Resnet56KerasAccuracy, self)._setup() + FLAGS.use_tensor_lr = False + + def benchmark_graph_1_gpu(self): + """Test keras based model with Keras fit and distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + FLAGS.dtype = 'fp32' + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Test keras based model with eager and distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + self._run_and_report_benchmark() + + def benchmark_cpu(self): + """Test keras based model on CPU.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_cpu') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_cpu_no_dist_strat(self): + """Test keras based model on CPU without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_cpu_no_dist_strat') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_cpu_no_dist_strat_run_eagerly(self): + """Test keras based model on CPU w/forced eager and no dist_strat.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_cpu_no_dist_strat_run_eagerly') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat(self): + """Test keras based model with eager and no dist strat.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly(self): + """Test keras based model w/forced eager and no dist_strat.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_graph_1_gpu_no_dist_strat(self): + """Test keras based model with Keras fit but not distribution strategies.""" + self._setup() + FLAGS.distribution_strategy = 'off' + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu_no_dist_strat') + FLAGS.dtype = 'fp32' + self._run_and_report_benchmark() + + def benchmark_2_gpu(self): + """Test keras based model with eager and distribution strategies.""" + self._setup() + FLAGS.num_gpus = 2 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + self._run_and_report_benchmark() + + def benchmark_graph_2_gpu(self): + """Test keras based model with Keras fit and distribution strategies.""" + self._setup() + FLAGS.num_gpus = 2 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 + FLAGS.train_epochs = 182 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu') + FLAGS.dtype = 'fp32' + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = resnet_cifar_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet56KerasAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=MIN_TOP_1_ACCURACY, + top_1_max=MAX_TOP_1_ACCURACY, + total_batch_size=FLAGS.batch_size, + log_steps=100) + + +class Resnet56KerasBenchmarkBase(keras_benchmark.KerasBenchmark): + """Short performance tests for ResNet56 via Keras and CIFAR-10.""" + + def __init__(self, output_dir=None, default_flags=None): + flag_methods = [resnet_cifar_main.define_cifar_flags] + + super(Resnet56KerasBenchmarkBase, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=default_flags) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = resnet_cifar_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet56KerasBenchmarkBase, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu(self): + """Test 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_xla(self): + """Test 1 gpu with xla enabled.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = False + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_xla') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_graph_1_gpu(self): + """Test 1 gpu graph.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.enable_eager = False + FLAGS.run_eagerly = False + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat(self): + """Test 1 gpu without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_graph_1_gpu_no_dist_strat(self): + """Test 1 gpu graph mode without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.enable_eager = False + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu_no_dist_strat') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly(self): + """Test 1 gpu without distribution strategy and forced eager.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 128 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_2_gpu(self): + """Test 2 gpu.""" + self._setup() + FLAGS.num_gpus = 2 + FLAGS.enable_eager = True + FLAGS.run_eagerly = False + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu') + FLAGS.batch_size = 128 * 2 # 2 GPUs + self._run_and_report_benchmark() + + def benchmark_graph_2_gpu(self): + """Test 2 gpu graph mode.""" + self._setup() + FLAGS.num_gpus = 2 + FLAGS.enable_eager = False + FLAGS.run_eagerly = False + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu') + FLAGS.batch_size = 128 * 2 # 2 GPUs + self._run_and_report_benchmark() + + def benchmark_cpu(self): + """Test cpu.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.enable_eager = True + FLAGS.model_dir = self._get_model_dir('benchmark_cpu') + FLAGS.batch_size = 128 + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_graph_cpu(self): + """Test cpu graph mode.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.enable_eager = False + FLAGS.model_dir = self._get_model_dir('benchmark_graph_cpu') + FLAGS.batch_size = 128 + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_cpu_no_dist_strat_run_eagerly(self): + """Test cpu without distribution strategy and forced eager.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.distribution_strategy = 'off' + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.model_dir = self._get_model_dir( + 'benchmark_cpu_no_dist_strat_run_eagerly') + FLAGS.batch_size = 128 + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_cpu_no_dist_strat(self): + """Test cpu without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_cpu_no_dist_strat') + FLAGS.batch_size = 128 + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + def benchmark_graph_cpu_no_dist_strat(self): + """Test cpu graph mode without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.enable_eager = False + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_graph_cpu_no_dist_strat') + FLAGS.batch_size = 128 + FLAGS.data_format = 'channels_last' + self._run_and_report_benchmark() + + +class Resnet56KerasBenchmarkSynth(Resnet56KerasBenchmarkBase): + """Synthetic benchmarks for ResNet56 and Keras.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + default_flags = {} + default_flags['skip_eval'] = True + default_flags['use_synthetic_data'] = True + default_flags['train_steps'] = 110 + default_flags['log_steps'] = 10 + default_flags['use_tensor_lr'] = False + + super(Resnet56KerasBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=default_flags) + + +class Resnet56KerasBenchmarkReal(Resnet56KerasBenchmarkBase): + """Real data benchmarks for ResNet56 and Keras.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + default_flags = {} + default_flags['skip_eval'] = True + default_flags['data_dir'] = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME) + default_flags['train_steps'] = 110 + default_flags['log_steps'] = 10 + default_flags['use_tensor_lr'] = False + + super(Resnet56KerasBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=default_flags) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_imagenet_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_imagenet_benchmark.py new file mode 100644 index 0000000..87b278d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/keras_imagenet_benchmark.py @@ -0,0 +1,1685 @@ +# Lint as: python3 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Keras benchmarks and accuracy tests.""" +# pylint: disable=line-too-long +from __future__ import print_function + +import json +import os +import time + +from typing import Any, MutableMapping, Optional + +from absl import flags +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.benchmark import benchmark_wrappers +from official.benchmark import keras_benchmark +from official.vision.image_classification import classifier_trainer +from official.vision.image_classification.resnet import resnet_imagenet_main + +MIN_TOP_1_ACCURACY = 0.76 +MAX_TOP_1_ACCURACY = 0.77 + +MOBILENET_V1_MIN_TOP_1_ACCURACY = 0.65 +MOBILENET_V1_MAX_TOP_1_ACCURACY = 0.68 + +# Range of top-1 accracies for model optimization techniques. +# Each item indicates (MIN_TOP_1_ACCURACY, MAX_TOP_1_ACCURACY). +MODEL_OPTIMIZATION_TOP_1_ACCURACY = { + 'RESNET50_FINETUNE_PRUNING': (0.76, 0.77), + 'MOBILENET_V1_FINETUNE_PRUNING': (0.67, 0.68), +} + +FLAGS = flags.FLAGS + + +def _get_classifier_parameters( + num_gpus: int = 0, + builder: str = 'records', + skip_eval: bool = False, + distribution_strategy: str = 'mirrored', + per_replica_batch_size: int = 128, + epochs: int = 90, + steps: int = 0, + epochs_between_evals: int = 1, + dtype: str = 'float32', + enable_xla: bool = False, + run_eagerly: bool = False, + gpu_thread_mode: Optional[str] = None, + dataset_num_private_threads: Optional[int] = None, + loss_scale: Optional[str] = None) -> MutableMapping[str, Any]: + """Gets classifier trainer's ResNet parameters.""" + return { + 'runtime': { + 'num_gpus': num_gpus, + 'distribution_strategy': distribution_strategy, + 'run_eagerly': run_eagerly, + 'enable_xla': enable_xla, + 'dataset_num_private_threads': dataset_num_private_threads, + 'gpu_thread_mode': gpu_thread_mode, + 'loss_scale': loss_scale, + }, + 'train_dataset': { + 'builder': builder, + 'use_per_replica_batch_size': True, + 'batch_size': per_replica_batch_size, + 'image_size': 224, + 'dtype': dtype, + }, + 'validation_dataset': { + 'builder': builder, + 'batch_size': per_replica_batch_size, + 'use_per_replica_batch_size': True, + 'image_size': 224, + 'dtype': dtype, + }, + 'train': { + 'epochs': epochs, + 'steps': steps, + 'callbacks': { + 'enable_tensorboard': False, + 'enable_checkpoint_and_export': False, + 'enable_time_history': True, + }, + }, + 'evaluation': { + 'epochs_between_evals': epochs_between_evals, + 'skip_eval': skip_eval, + }, + } + + +class Resnet50KerasAccuracy(keras_benchmark.KerasBenchmark): + """Benchmark accuracy tests for ResNet50 in Keras.""" + + def __init__(self, + output_dir: Optional[str] = None, + root_data_dir: Optional[str] = None, + **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + + flag_methods = [classifier_trainer.define_classifier_flags] + + self.data_dir = os.path.join(root_data_dir, 'imagenet') + super(Resnet50KerasAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark( + self, + experiment_name: str, + top_1_min: float = MIN_TOP_1_ACCURACY, + top_1_max: float = MAX_TOP_1_ACCURACY, + num_gpus: int = 0, + distribution_strategy: str = 'mirrored', + per_replica_batch_size: int = 128, + epochs: int = 90, + steps: int = 0, + epochs_between_evals: int = 1, + dtype: str = 'float32', + enable_xla: bool = False, + run_eagerly: bool = False, + gpu_thread_mode: Optional[str] = None, + dataset_num_private_threads: Optional[int] = None, + loss_scale: Optional[str] = None): + """Runs and reports the benchmark given the provided configuration.""" + FLAGS.model_type = 'resnet' + FLAGS.dataset = 'imagenet' + FLAGS.mode = 'train_and_eval' + FLAGS.data_dir = self.data_dir + FLAGS.model_dir = self._get_model_dir(experiment_name) + parameters = _get_classifier_parameters( + num_gpus=num_gpus, + distribution_strategy=distribution_strategy, + per_replica_batch_size=per_replica_batch_size, + epochs=epochs, + steps=steps, + epochs_between_evals=epochs_between_evals, + dtype=dtype, + enable_xla=enable_xla, + run_eagerly=run_eagerly, + gpu_thread_mode=gpu_thread_mode, + dataset_num_private_threads=dataset_num_private_threads, + loss_scale=loss_scale) + FLAGS.params_override = json.dumps(parameters) + total_batch_size = num_gpus * per_replica_batch_size + + start_time_sec = time.time() + stats = classifier_trainer.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet50KerasAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=top_1_min, + top_1_max=top_1_max, + total_batch_size=total_batch_size, + log_steps=100) + + def benchmark_8_gpu(self): + """Tests Keras model with eager, dist_strat and 8 GPUs.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu', + num_gpus=8, + per_replica_batch_size=128, + epochs=90, + epochs_between_evals=10, + dtype='float32') + + def benchmark_8_gpu_fp16(self): + """Tests Keras model with eager, dist_strat, 8 GPUs, and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu_fp16', + num_gpus=8, + per_replica_batch_size=256, + epochs=90, + epochs_between_evals=10, + dtype='float16') + + def benchmark_xla_8_gpu_fp16(self): + """Tests Keras model with XLA, eager, dist_strat, 8 GPUs and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16', + num_gpus=8, + per_replica_batch_size=256, + epochs=90, + epochs_between_evals=10, + dtype='float16', + enable_xla=True) + + def benchmark_xla_8_gpu_fp16_dynamic(self): + """Tests Keras model with XLA, eager, dist_strat, 8 GPUs, dynamic fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16_dynamic', + top_1_min=0.736, + num_gpus=8, + per_replica_batch_size=256, + epochs=90, + epochs_between_evals=10, + dtype='float16', + loss_scale='dynamic') + + def _get_model_dir(self, folder_name): + return os.path.join(self.output_dir, folder_name) + + +class MobilenetV1KerasAccuracy(keras_benchmark.KerasBenchmark): + """Benchmark accuracy tests for MobilenetV1 in Keras.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + + flag_methods = [resnet_imagenet_main.define_imagenet_keras_flags] + + self.data_dir = os.path.join(root_data_dir, 'imagenet') + super(MobilenetV1KerasAccuracy, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags={ + 'model': 'mobilenet', + 'optimizer': 'mobilenet_default', + 'initial_learning_rate_per_sample': 0.00039, + }) + + def benchmark_8_gpu(self): + """Test Keras model with eager, dist_strat and 8 GPUs.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + top_1_min=MOBILENET_V1_MIN_TOP_1_ACCURACY, + top_1_max=MOBILENET_V1_MAX_TOP_1_ACCURACY): + start_time_sec = time.time() + stats = resnet_imagenet_main.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(MobilenetV1KerasAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=top_1_min, + top_1_max=top_1_max, + total_batch_size=FLAGS.batch_size, + log_steps=100) + + def _get_model_dir(self, folder_name): + return os.path.join(self.output_dir, folder_name) + + +class Resnet50KerasClassifierBenchmarkBase(keras_benchmark.KerasBenchmark): + """Resnet50 (classifier_trainer) benchmarks.""" + + def __init__(self, output_dir=None, default_flags=None, + tpu=None, dataset_builder='records', train_epochs=1, + train_steps=110, data_dir=None): + flag_methods = [classifier_trainer.define_classifier_flags] + + self.dataset_builder = dataset_builder + self.train_epochs = train_epochs + self.train_steps = train_steps + self.data_dir = data_dir + + super(Resnet50KerasClassifierBenchmarkBase, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=default_flags, + tpu=tpu) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark( + self, + experiment_name: str, + skip_steps: Optional[int] = None, + top_1_min: float = MIN_TOP_1_ACCURACY, + top_1_max: float = MAX_TOP_1_ACCURACY, + num_gpus: int = 0, + distribution_strategy: str = 'mirrored', + per_replica_batch_size: int = 128, + epochs_between_evals: int = 1, + dtype: str = 'float32', + enable_xla: bool = False, + run_eagerly: bool = False, + gpu_thread_mode: Optional[str] = None, + dataset_num_private_threads: Optional[int] = None, + loss_scale: Optional[str] = None): + """Runs and reports the benchmark given the provided configuration.""" + FLAGS.model_type = 'resnet' + FLAGS.dataset = 'imagenet' + FLAGS.mode = 'train_and_eval' + FLAGS.data_dir = self.data_dir + FLAGS.model_dir = self._get_model_dir(experiment_name) + parameters = _get_classifier_parameters( + builder=self.dataset_builder, + skip_eval=True, + num_gpus=num_gpus, + distribution_strategy=distribution_strategy, + per_replica_batch_size=per_replica_batch_size, + epochs=self.train_epochs, + steps=self.train_steps, + epochs_between_evals=epochs_between_evals, + dtype=dtype, + enable_xla=enable_xla, + gpu_thread_mode=gpu_thread_mode, + dataset_num_private_threads=dataset_num_private_threads, + loss_scale=loss_scale) + FLAGS.params_override = json.dumps(parameters) + total_batch_size = num_gpus * per_replica_batch_size + + start_time_sec = time.time() + stats = classifier_trainer.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + # Number of logged step time entries that are excluded in performance + # report. We keep results from last 100 batches, or skip the steps based on + # input skip_steps. + warmup = (skip_steps or (self.train_steps - 100)) // FLAGS.log_steps + + super(Resnet50KerasClassifierBenchmarkBase, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=total_batch_size, + log_steps=FLAGS.log_steps, + warmup=warmup, + start_time_sec=start_time_sec) + + def benchmark_1_gpu_no_dist_strat(self): + """Tests Keras model with 1 GPU, no distribution strategy.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu_no_dist_strat', + num_gpus=1, + distribution_strategy='off', + per_replica_batch_size=128) + + def benchmark_1_gpu_no_dist_strat_run_eagerly(self): + """Tests Keras model with 1 GPU, no distribution strategy, run eagerly.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu_no_dist_strat_run_eagerly', + num_gpus=1, + run_eagerly=True, + distribution_strategy='off', + per_replica_batch_size=64) + + def benchmark_1_gpu_no_dist_strat_run_eagerly_fp16(self): + """Tests with 1 GPU, no distribution strategy, fp16, run eagerly.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu_no_dist_strat_run_eagerly_fp16', + num_gpus=1, + run_eagerly=True, + distribution_strategy='off', + dtype='float16', + per_replica_batch_size=128) + + def benchmark_1_gpu(self): + """Tests Keras model with 1 GPU.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu', + num_gpus=1, + distribution_strategy='one_device', + per_replica_batch_size=128) + + def benchmark_xla_1_gpu(self): + """Tests Keras model with XLA and 1 GPU.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_1_gpu', + num_gpus=1, + enable_xla=True, + distribution_strategy='one_device', + per_replica_batch_size=128) + + def benchmark_1_gpu_fp16(self): + """Tests Keras model with 1 GPU and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu_fp16', + num_gpus=1, + distribution_strategy='one_device', + dtype='float16', + per_replica_batch_size=256) + + def benchmark_1_gpu_fp16_dynamic(self): + """Tests Keras model with 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_1_gpu_fp16_dynamic', + num_gpus=1, + distribution_strategy='one_device', + dtype='float16', + per_replica_batch_size=256, + loss_scale='dynamic') + + def benchmark_xla_1_gpu_fp16(self): + """Tests Keras model with XLA, 1 GPU and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_1_gpu_fp16', + num_gpus=1, + enable_xla=True, + distribution_strategy='one_device', + dtype='float16', + per_replica_batch_size=256) + + def benchmark_xla_1_gpu_fp16_tweaked(self): + """Tests Keras model with XLA, 1 GPU, fp16, and manual config tuning.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_1_gpu_fp16_tweaked', + num_gpus=1, + enable_xla=True, + distribution_strategy='one_device', + dtype='float16', + per_replica_batch_size=256, + gpu_thread_mode='gpu_private') + + def benchmark_xla_1_gpu_fp16_dynamic(self): + """Tests Keras model with XLA, 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_1_gpu_fp16_dynamic', + num_gpus=1, + enable_xla=True, + distribution_strategy='one_device', + dtype='float16', + per_replica_batch_size=256, + loss_scale='dynamic') + + def benchmark_8_gpu(self): + """Tests Keras model with 8 GPUs.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu', + num_gpus=8, + distribution_strategy='mirrored', + per_replica_batch_size=128) + + def benchmark_8_gpu_tweaked(self): + """Tests Keras model with manual config tuning and 8 GPUs.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu_tweaked', + num_gpus=8, + distribution_strategy='mirrored', + per_replica_batch_size=128, + dataset_num_private_threads=14) + + def benchmark_xla_8_gpu(self): + """Tests Keras model with XLA and 8 GPUs.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=128) + + def benchmark_xla_8_gpu_tweaked(self): + """Tests Keras model with manual config tuning, 8 GPUs, and XLA.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_tweaked', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=128, + gpu_thread_mode='gpu_private', + dataset_num_private_threads=24) + + def benchmark_8_gpu_fp16(self): + """Tests Keras model with 8 GPUs and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu_fp16', + num_gpus=8, + dtype='float16', + distribution_strategy='mirrored', + per_replica_batch_size=256) + + def benchmark_8_gpu_fp16_tweaked(self): + """Tests Keras model with 8 GPUs, fp16, and manual config tuning.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu_fp16_tweaked', + num_gpus=8, + dtype='float16', + distribution_strategy='mirrored', + per_replica_batch_size=256, + gpu_thread_mode='gpu_private', + dataset_num_private_threads=40) + + def benchmark_8_gpu_fp16_dynamic_tweaked(self): + """Tests Keras model with 8 GPUs, fp16, dynamic loss scaling, and tuned.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_8_gpu_fp16_dynamic_tweaked', + num_gpus=8, + dtype='float16', + distribution_strategy='mirrored', + per_replica_batch_size=256, + loss_scale='dynamic', + gpu_thread_mode='gpu_private', + dataset_num_private_threads=40) + + def benchmark_xla_8_gpu_fp16(self): + """Tests Keras model with XLA, 8 GPUs and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16', + dtype='float16', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=256) + + def benchmark_xla_8_gpu_fp16_tweaked(self): + """Test Keras model with manual config tuning, XLA, 8 GPUs and fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16_tweaked', + dtype='float16', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=256, + gpu_thread_mode='gpu_private', + dataset_num_private_threads=48) + + def benchmark_xla_8_gpu_fp16_tweaked_delay_measure(self): + """Tests with manual config tuning, XLA, 8 GPUs and fp16. + + Delay performance measurement for stable performance on 96 vCPU platforms. + """ + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16_tweaked_delay_measure', + dtype='float16', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=256, + gpu_thread_mode='gpu_private', + dataset_num_private_threads=48, + steps=310) + + def benchmark_xla_8_gpu_fp16_dynamic_tweaked(self): + """Tests Keras model with config tuning, XLA, 8 GPUs and dynamic fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_xla_8_gpu_fp16_dynamic_tweaked', + dtype='float16', + num_gpus=8, + enable_xla=True, + distribution_strategy='mirrored', + per_replica_batch_size=256, + gpu_thread_mode='gpu_private', + loss_scale='dynamic', + dataset_num_private_threads=48) + + def benchmark_2x2_tpu_fp16(self): + """Test Keras model with 2x2 TPU, fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_2x2_tpu_fp16', + dtype='bfloat16', + distribution_strategy='tpu', + per_replica_batch_size=128) + + def benchmark_4x4_tpu_fp16(self): + """Test Keras model with 4x4 TPU, fp16.""" + self._setup() + self._run_and_report_benchmark( + experiment_name='benchmark_4x4_tpu_fp16', + dtype='bfloat16', + distribution_strategy='tpu', + per_replica_batch_size=128) + + def fill_report_object(self, stats): + super(Resnet50KerasClassifierBenchmarkBase, self).fill_report_object( + stats, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + +class Resnet50KerasBenchmarkBase(keras_benchmark.KerasBenchmark): + """Resnet50 benchmarks.""" + + def __init__(self, output_dir=None, default_flags=None, tpu=None): + flag_methods = [resnet_imagenet_main.define_imagenet_keras_flags] + + super(Resnet50KerasBenchmarkBase, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=default_flags, + tpu=tpu) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, skip_steps=None): + start_time_sec = time.time() + stats = resnet_imagenet_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + # Number of logged step time entries that are excluded in performance + # report. We keep results from last 100 batches, or skip the steps based on + # input skip_steps. + warmup = (skip_steps or (FLAGS.train_steps - 100)) // FLAGS.log_steps + + super(Resnet50KerasBenchmarkBase, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + warmup=warmup, + start_time_sec=start_time_sec) + + def benchmark_1_gpu_no_dist_strat(self): + """Test Keras model with 1 GPU, no distribution strategy.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly(self): + """Test Keras model with 1 GPU, no distribution strategy, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly') + FLAGS.batch_size = 64 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_tweaked(self): + """Test Keras model with 1 GPU, no distribution strategy, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.explicit_gpu_placement = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_tweaked') + FLAGS.batch_size = 64 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_fp16(self): + """Test with 1 GPU, no distribution strategy, fp16, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_fp16_tweaked(self): + """Test with 1 GPU, no distribution strategy, fp16, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.explicit_gpu_placement = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_fp16_tweaked') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Test Keras model with 1 GPU.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_amp(self): + """Test Keras model with 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_amp') + FLAGS.batch_size = 256 + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu(self): + """Test Keras model with XLA and 1 GPU.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_amp(self): + """Test Keras model with XLA and 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_amp') + FLAGS.batch_size = 256 + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16(self): + """Test Keras model with 1 GPU and fp16.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16_dynamic(self): + """Test Keras model with 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16_dynamic') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.loss_scale = 'dynamic' + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16(self): + """Test Keras model with XLA, 1 GPU and fp16.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16_tweaked(self): + """Test Keras model with XLA, 1 GPU, fp16, and manual config tuning.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16_tweaked') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16_dynamic(self): + """Test Keras model with XLA, 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16_dynamic') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.loss_scale = 'dynamic' + self._run_and_report_benchmark() + + def benchmark_8_gpu(self): + """Test Keras model with 8 GPUs.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + FLAGS.batch_size = 128 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_8_gpu_amp(self): + """Test Keras model with 8 GPUs with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_amp') + FLAGS.batch_size = 256 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_8_gpu_tweaked(self): + """Test Keras model with manual config tuning and 8 GPUs.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_tweaked') + FLAGS.batch_size = 128 * 8 # 8 GPUs + FLAGS.datasets_num_private_threads = 14 + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu(self): + """Test Keras model with XLA and 8 GPUs.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu') + FLAGS.batch_size = 128 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_amp(self): + """Test Keras model with XLA and 8 GPUs with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_amp') + FLAGS.batch_size = 256 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_tweaked(self): + """Test Keras model with manual config tuning, 8 GPUs, and XLA.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_tweaked') + FLAGS.batch_size = 128 * 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 24 + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16(self): + """Test Keras model with 8 GPUs and fp16.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16') + FLAGS.batch_size = 256 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16_tweaked(self): + """Test Keras model with 8 GPUs, fp16, and manual config tuning.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16_tweaked') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.dataset_num_private_threads = 40 + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16_dynamic_tweaked(self): + """Test Keras model with 8 GPUs, fp16, dynamic loss scaling, and tuned.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_8_gpu_fp16_dynamic_tweaked') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.loss_scale = 'dynamic' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.dataset_num_private_threads = 40 + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_fp16(self): + """Test Keras model with XLA, 8 GPUs and fp16.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_fp16') + FLAGS.batch_size = 256 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_fp16_tweaked(self): + """Test Keras model with manual config tuning, XLA, 8 GPUs and fp16.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_fp16_tweaked') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 48 + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_fp16_tweaked_delay_measure(self): + """Test with manual config tuning, XLA, 8 GPUs and fp16. + + Delay performance measurement for stable performance on 96 vCPU platforms. + """ + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_xla_8_gpu_fp16_tweaked_delay_measure') + FLAGS.batch_size = 256 * 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 48 + FLAGS.train_steps = 310 + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_fp16_dynamic_tweaked(self): + """Test Keras model with config tuning, XLA, 8 GPUs and dynamic fp16.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_xla_8_gpu_fp16_dynamic_tweaked') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.loss_scale = 'dynamic' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 48 + self._run_and_report_benchmark() + + def benchmark_2x2_tpu_fp16(self): + """Test Keras model with 2x2 TPU, fp16.""" + self._setup() + + FLAGS.dtype = 'bf16' + FLAGS.distribution_strategy = 'tpu' + FLAGS.model_dir = self._get_model_dir('benchmark_2x2_tpu_fp16') + FLAGS.batch_size = 1024 + self._run_and_report_benchmark() + + def benchmark_4x4_tpu_fp16(self): + """Test Keras model with 4x4 TPU, fp16.""" + self._setup() + + FLAGS.dtype = 'bf16' + FLAGS.distribution_strategy = 'tpu' + FLAGS.model_dir = self._get_model_dir('benchmark_4x4_tpu_fp16') + FLAGS.batch_size = 4096 + self._run_and_report_benchmark() + + def fill_report_object(self, stats): + super(Resnet50KerasBenchmarkBase, self).fill_report_object( + stats, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + +class Resnet50KerasBenchmarkSynth(Resnet50KerasClassifierBenchmarkBase): + """Resnet50 synthetic benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, tpu=None, **kwargs): + def_flags = {} + def_flags['log_steps'] = 10 + + super(Resnet50KerasBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags, tpu=tpu, + dataset_builder='synthetic', train_epochs=1, train_steps=110) + + +class Resnet50KerasBenchmarkReal(Resnet50KerasClassifierBenchmarkBase): + """Resnet50 real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, tpu=None, **kwargs): + data_dir = os.path.join(root_data_dir, 'imagenet') + def_flags = {} + def_flags['log_steps'] = 10 + + super(Resnet50KerasBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags, tpu=tpu, + dataset_builder='records', train_epochs=1, train_steps=110, + data_dir=data_dir) + + +class Resnet50KerasBenchmarkRemoteData(Resnet50KerasBenchmarkBase): + """Resnet50 real data (stored in remote storage) benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['skip_eval'] = True + def_flags['report_accuracy_metrics'] = False + def_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + # Defining multiple epochs overrides the train_steps setting in benchmarks. + def_flags['train_epochs'] = 2 + # Cache dataset so performance is stable after the first epoch. + def_flags['training_dataset_cache'] = True + def_flags['log_steps'] = 100 + # Note that for single GPU and pure eager tests which are less likely to be + # input bound and more stable, these tests will run for shorter time by + # overriding FLAGS.train_epochs, train_seteps, log_steps in benchmark + # methods, and skip_steps in _run_and_report_benchmark(). + + super(Resnet50KerasBenchmarkRemoteData, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + def _override_flags_to_run_test_shorter(self): + FLAGS.train_epochs = 1 + FLAGS.train_steps = 300 + FLAGS.log_steps = 10 + + def benchmark_1_gpu_no_dist_strat(self): + """Test Keras model with 1 GPU, no distribution strategy.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + FLAGS.batch_size = 128 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly(self): + """Test Keras model with 1 GPU, no distribution strategy, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly') + FLAGS.batch_size = 64 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_tweaked(self): + """Test Keras model with 1 GPU, no distribution strategy, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.explicit_gpu_placement = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_tweaked') + FLAGS.batch_size = 64 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_fp16(self): + """Test with 1 GPU, no distribution strategy, fp16, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 128 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_fp16_tweaked(self): + """Test with 1 GPU, no distribution strategy, fp16, run eagerly.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.run_eagerly = True + FLAGS.explicit_gpu_placement = True + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_no_dist_strat_run_eagerly_fp16_tweaked') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 128 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Test Keras model with 1 GPU.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + FLAGS.batch_size = 128 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_amp(self): + """Test Keras model with 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_amp') + FLAGS.batch_size = 256 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu(self): + """Test Keras model with XLA and 1 GPU.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu') + FLAGS.batch_size = 128 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_amp(self): + """Test Keras model with XLA and 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_amp') + FLAGS.batch_size = 256 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16(self): + """Test Keras model with 1 GPU and fp16.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16_dynamic(self): + """Test Keras model with 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16_dynamic') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.loss_scale = 'dynamic' + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16(self): + """Test Keras model with XLA, 1 GPU and fp16.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16_tweaked(self): + """Test Keras model with XLA, 1 GPU, fp16, and manual config tuning.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16_tweaked') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_fp16_dynamic(self): + """Test Keras model with XLA, 1 GPU, fp16, and dynamic loss scaling.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.enable_eager = True + FLAGS.enable_xla = True + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16_dynamic') + FLAGS.dtype = 'fp16' + FLAGS.batch_size = 256 + FLAGS.loss_scale = 'dynamic' + self._override_flags_to_run_test_shorter() + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + if FLAGS.num_gpus == 1 or FLAGS.run_eagerly: + # For single GPU and pure eager tests which are less likely to be input + # bound and more stable, run for shorter time and use the default + # skip_steps. + skip_steps = None + else: + # skip the first epoch for performance measurement. + skip_steps = 600 + super(Resnet50KerasBenchmarkRemoteData, + self)._run_and_report_benchmark(skip_steps=skip_steps) + + +class TrivialKerasBenchmarkReal(keras_benchmark.KerasBenchmark): + """Trivial model with real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + flag_methods = [resnet_imagenet_main.define_imagenet_keras_flags] + + def_flags = {} + def_flags['use_trivial_model'] = True + def_flags['skip_eval'] = True + def_flags['report_accuracy_metrics'] = False + def_flags['dtype'] = 'fp16' + def_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + def_flags['train_steps'] = 600 + def_flags['log_steps'] = 100 + def_flags['distribution_strategy'] = 'mirrored' + + super(TrivialKerasBenchmarkReal, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=def_flags) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = resnet_imagenet_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(TrivialKerasBenchmarkReal, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_8_gpu_warmup(self): + """Dummy test that runs over an epoch to warmup the machine.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.enable_eager = True + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_warmup') + FLAGS.batch_size = 256 * 8 + FLAGS.train_steps = 700 + self._run_and_report_benchmark() + + def fill_report_object(self, stats): + super(TrivialKerasBenchmarkReal, self).fill_report_object( + stats, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + +class Resnet50MultiWorkerKerasAccuracy(keras_benchmark.KerasBenchmark): + """Resnet50 distributed accuracy tests with multiple workers.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + flag_methods = [classifier_trainer.define_imagenet_keras_flags] + self.data_dir = os.path.join(root_data_dir, 'imagenet') + super(Resnet50MultiWorkerKerasAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def _benchmark_common(self, eager, num_workers, all_reduce_alg): + """Common to all benchmarks in this class.""" + self._setup() + + num_gpus = 8 + FLAGS.num_gpus = num_gpus + FLAGS.data_dir = self.data_dir + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = eager + FLAGS.enable_xla = False + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_{}_8_gpu_{}_worker_fp16_{}_tweaked'.format( + 'eager' if eager else 'graph', num_workers, all_reduce_alg)) + FLAGS.batch_size = 256 * num_gpus * num_workers + FLAGS.all_reduce_alg = all_reduce_alg + + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + top_1_min=MIN_TOP_1_ACCURACY, + top_1_max=MAX_TOP_1_ACCURACY): + start_time_sec = time.time() + stats = classifier_trainer.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet50MultiWorkerKerasAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=top_1_min, + top_1_max=top_1_max, + total_batch_size=FLAGS.batch_size, + log_steps=100) + + def _get_model_dir(self, folder_name): + return os.path.join(self.output_dir, folder_name) + + def benchmark_eager_8_gpu_2_workers_fp16_ring_tweaked(self): + """Eager, 8 GPUs per worker, 2 workers, fp16, ring all-reduce.""" + self._benchmark_common(eager=True, num_workers=2, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_2_workers_fp16_nccl_tweaked(self): + """Eager, 8 GPUs per worker, 2 workers, fp16, nccl all-reduce.""" + self._benchmark_common(eager=True, num_workers=2, all_reduce_alg='nccl') + + def benchmark_eager_8_gpu_8_workers_fp16_ring_tweaked(self): + """Eager, 8 GPUs per worker, 8 workers, fp16, ring all-reduce.""" + self._benchmark_common(eager=True, num_workers=8, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_8_workers_fp16_nccl_tweaked(self): + """Eager, 8 GPUs per worker, 8 workers, fp16, nccl all-reduce.""" + self._benchmark_common(eager=True, num_workers=8, all_reduce_alg='nccl') + + +class Resnet50MultiWorkerKerasBenchmark(Resnet50KerasBenchmarkBase): + """Resnet50 distributed benchmark tests with multiple workers.""" + + def __init__(self, output_dir=None, default_flags=None): + super(Resnet50MultiWorkerKerasBenchmark, self).__init__( + output_dir=output_dir, default_flags=default_flags) + + def _benchmark_common(self, eager, num_workers, all_reduce_alg): + """Common to all benchmarks in this class.""" + self._setup() + + num_gpus = 8 + FLAGS.num_gpus = num_gpus + FLAGS.dtype = 'fp16' + FLAGS.enable_eager = eager + FLAGS.enable_xla = False + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_{}_8_gpu_{}_worker_fp16_{}_tweaked'.format( + 'eager' if eager else 'graph', num_workers, all_reduce_alg)) + FLAGS.batch_size = 256 * num_gpus * num_workers + FLAGS.all_reduce_alg = all_reduce_alg + + self._run_and_report_benchmark() + + def benchmark_eager_8_gpu_1_worker_fp16_ring_tweaked(self): + """Eager, 8 GPUs per worker, 1 worker, fp16, ring all-reduce.""" + self._benchmark_common(eager=True, num_workers=1, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_1_worker_fp16_nccl_tweaked(self): + """Eager, 8 GPUs per worker, 1 worker, fp16, nccl all-reduce.""" + self._benchmark_common(eager=True, num_workers=1, all_reduce_alg='nccl') + + def benchmark_eager_8_gpu_2_workers_fp16_ring_tweaked(self): + """Eager, 8 GPUs per worker, 2 workers, fp16, ring all-reduce.""" + self._benchmark_common(eager=True, num_workers=2, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_2_workers_fp16_nccl_tweaked(self): + """Eager, 8 GPUs per worker, 2 workers, fp16, nccl all-reduce.""" + self._benchmark_common(eager=True, num_workers=2, all_reduce_alg='nccl') + + def benchmark_eager_8_gpu_8_workers_fp16_ring_tweaked(self): + """Eager, 8 GPUs per worker, 8 workers, fp16, ring all-reduce.""" + self._benchmark_common(eager=True, num_workers=8, all_reduce_alg='ring') + + def benchmark_eager_8_gpu_8_workers_fp16_nccl_tweaked(self): + """Eager, 8 GPUs per worker, 8 workers, fp16, nccl all-reduce.""" + self._benchmark_common(eager=True, num_workers=8, all_reduce_alg='nccl') + + +class Resnet50MultiWorkerKerasBenchmarkSynth(Resnet50MultiWorkerKerasBenchmark): + """Resnet50 multi-worker synthetic data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['skip_eval'] = True + def_flags['report_accuracy_metrics'] = False + def_flags['use_synthetic_data'] = True + def_flags['train_steps'] = 110 + def_flags['log_steps'] = 10 + + super(Resnet50MultiWorkerKerasBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50MultiWorkerKerasBenchmarkReal(Resnet50MultiWorkerKerasBenchmark): + """Resnet50 multi-worker real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['skip_eval'] = True + def_flags['report_accuracy_metrics'] = False + def_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + def_flags['train_steps'] = 110 + def_flags['log_steps'] = 10 + + super(Resnet50MultiWorkerKerasBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +# TODO(kimjaehong): It also should be also cover other metheods of model +# optimization techniques. In that time, this class will change to something +# like 'KerasModelOptimizationAccuracyBase'. +class KerasPruningAccuracyBase(keras_benchmark.KerasBenchmark): + """Benchmark accuracy tests for pruning method.""" + + def __init__(self, + output_dir=None, + root_data_dir=None, + default_flags=None, + **kwargs): + """A accuracy benchmark class for pruning method. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + default_flags: default flags + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + if default_flags is None: + default_flags = {} + default_flags['pruning_method'] = 'polynomial_decay' + default_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + + flag_methods = [resnet_imagenet_main.define_imagenet_keras_flags] + + super(KerasPruningAccuracyBase, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=default_flags, + **kwargs) + + def benchmark_8_gpu(self): + """Test Keras model with eager, dist_strat and 8 GPUs.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = 32 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + FLAGS.dtype = 'fp32' + FLAGS.enable_eager = True + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + top_1_min=MODEL_OPTIMIZATION_TOP_1_ACCURACY[ + 'RESNET50_FINETUNE_PRUNING'][0], + top_1_max=MODEL_OPTIMIZATION_TOP_1_ACCURACY[ + 'RESNET50_FINETUNE_PRUNING'][1]): + start_time_sec = time.time() + stats = resnet_imagenet_main.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(KerasPruningAccuracyBase, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=top_1_min, + top_1_max=top_1_max, + total_batch_size=FLAGS.batch_size, + log_steps=100) + + +class MobilenetV1KerasPruningAccuracy(KerasPruningAccuracyBase): + """Benchmark accuracy tests for MobilenetV1 with pruning method.""" + + def __init__(self, root_data_dir=None, **kwargs): + default_flags = { + 'model': 'mobilenet', + 'optimizer': 'mobilenet_default', + 'initial_learning_rate_per_sample': 0.00007, + 'pretrained_filepath': tf.train.latest_checkpoint( + os.path.join(root_data_dir, 'mobilenet_v1')), + 'pruning_begin_step': 0, + 'pruning_end_step': 100000, + 'pruning_initial_sparsity': 0.0, + 'pruning_final_sparsity': 0.5, + 'pruning_frequency': 100, + } + super(MobilenetV1KerasPruningAccuracy, self).__init__( + root_data_dir=root_data_dir, + default_flags=default_flags, + **kwargs) + + def _run_and_report_benchmark(self): + super(MobilenetV1KerasPruningAccuracy, self)._run_and_report_benchmark( + top_1_min=\ + MODEL_OPTIMIZATION_TOP_1_ACCURACY['MOBILENET_V1_FINETUNE_PRUNING'][0], + top_1_max=\ + MODEL_OPTIMIZATION_TOP_1_ACCURACY['MOBILENET_V1_FINETUNE_PRUNING'][1]) + + +class Resnet50KerasPruningAccuracy(KerasPruningAccuracyBase): + """Benchmark accuracy tests for resnet50 with pruning method.""" + + def __init__(self, root_data_dir=None, **kwargs): + default_flags = { + 'model': 'resnet50_v1.5', + 'optimizer': 'mobilenet_default', + 'initial_learning_rate_per_sample': 0.0000039, + 'pretrained_filepath': tf.train.latest_checkpoint( + os.path.join(root_data_dir, 'resnet50')), + 'pruning_begin_step': 0, + 'pruning_end_step': 50000, + 'pruning_initial_sparsity': 0.0, + 'pruning_final_sparsity': 0.5, + 'pruning_frequency': 100, + } + super(Resnet50KerasPruningAccuracy, self).__init__( + root_data_dir=root_data_dir, + default_flags=default_flags, + **kwargs) + + def _run_and_report_benchmark(self): + super(Resnet50KerasPruningAccuracy, self)._run_and_report_benchmark( + top_1_min=\ + MODEL_OPTIMIZATION_TOP_1_ACCURACY['RESNET50_FINETUNE_PRUNING'][0], + top_1_max=\ + MODEL_OPTIMIZATION_TOP_1_ACCURACY['RESNET50_FINETUNE_PRUNING'][1]) + + +class KerasPruningBenchmarkRealBase(Resnet50KerasBenchmarkBase): + """Pruning method benchmarks.""" + + def __init__(self, root_data_dir=None, default_flags=None, **kwargs): + if default_flags is None: + default_flags = {} + default_flags.update({ + 'skip_eval': True, + 'report_accuracy_metrics': False, + 'data_dir': os.path.join(root_data_dir, 'imagenet'), + 'train_steps': 110, + 'log_steps': 10, + 'pruning_method': 'polynomial_decay', + 'pruning_begin_step': 0, + 'pruning_end_step': 50000, + 'pruning_initial_sparsity': 0, + 'pruning_final_sparsity': 0.5, + 'pruning_frequency': 100, + }) + super(KerasPruningBenchmarkRealBase, self).__init__( + default_flags=default_flags, **kwargs) + + +class MobilenetV1KerasPruningBenchmarkReal(KerasPruningBenchmarkRealBase): + """Pruning method benchmarks for MobilenetV1.""" + + def __init__(self, **kwargs): + default_flags = { + 'model': 'mobilenet', + 'optimizer': 'mobilenet_default', + } + super(MobilenetV1KerasPruningBenchmarkReal, self).__init__( + default_flags=default_flags, **kwargs) + + +class Resnet50KerasPruningBenchmarkReal(KerasPruningBenchmarkRealBase): + """Pruning method benchmarks for resnet50.""" + + def __init__(self, **kwargs): + default_flags = { + 'model': 'resnet50_v1.5', + 'optimizer': 'mobilenet_default', + } + super(Resnet50KerasPruningBenchmarkReal, self).__init__( + default_flags=default_flags, **kwargs) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_main.py new file mode 100644 index 0000000..455d3a9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_main.py @@ -0,0 +1,287 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the Cifar-10 dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app +from absl import flags +from absl import logging +import numpy as np +import tensorflow as tf +from official.benchmark.models import resnet_cifar_model +from official.benchmark.models import synthetic_util +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.vision.image_classification.resnet import cifar_preprocessing +from official.vision.image_classification.resnet import common + + +LR_SCHEDULE = [ # (multiplier, epoch to start) tuples + (0.1, 91), (0.01, 136), (0.001, 182) +] + + +def learning_rate_schedule(current_epoch, + current_batch, + batches_per_epoch, + batch_size): + """Handles linear scaling rule and LR decay. + + Scale learning rate at epoch boundaries provided in LR_SCHEDULE by the + provided scaling factor. + + Args: + current_epoch: integer, current epoch indexed from 0. + current_batch: integer, current batch in the current epoch, indexed from 0. + batches_per_epoch: integer, number of steps in an epoch. + batch_size: integer, total batch sized. + + Returns: + Adjusted learning rate. + """ + del current_batch, batches_per_epoch # not used + initial_learning_rate = common.BASE_LEARNING_RATE * batch_size / 128 + learning_rate = initial_learning_rate + for mult, start_epoch in LR_SCHEDULE: + if current_epoch >= start_epoch: + learning_rate = initial_learning_rate * mult + else: + break + return learning_rate + + +class LearningRateBatchScheduler(tf.keras.callbacks.Callback): + """Callback to update learning rate on every batch (not epoch boundaries). + + N.B. Only support Keras optimizers, not TF optimizers. + + Attributes: + schedule: a function that takes an epoch index and a batch index as input + (both integer, indexed from 0) and returns a new learning rate as + output (float). + """ + + def __init__(self, schedule, batch_size, steps_per_epoch): + super(LearningRateBatchScheduler, self).__init__() + self.schedule = schedule + self.steps_per_epoch = steps_per_epoch + self.batch_size = batch_size + self.epochs = -1 + self.prev_lr = -1 + + def on_epoch_begin(self, epoch, logs=None): + if not hasattr(self.model.optimizer, 'learning_rate'): + raise ValueError('Optimizer must have a "learning_rate" attribute.') + self.epochs += 1 + + def on_batch_begin(self, batch, logs=None): + """Executes before step begins.""" + lr = self.schedule(self.epochs, + batch, + self.steps_per_epoch, + self.batch_size) + if not isinstance(lr, (float, np.float32, np.float64)): + raise ValueError('The output of the "schedule" function should be float.') + if lr != self.prev_lr: + self.model.optimizer.learning_rate = lr # lr should be a float here + self.prev_lr = lr + logging.debug( + 'Epoch %05d Batch %05d: LearningRateBatchScheduler ' + 'change learning rate to %s.', self.epochs, batch, lr) + + +def run(flags_obj): + """Run ResNet Cifar-10 training and eval loop using native Keras APIs. + + Args: + flags_obj: An object containing parsed flag values. + + Raises: + ValueError: If fp16 is passed as it is not currently supported. + + Returns: + Dictionary of training and eval stats. + """ + keras_utils.set_session_config( + enable_eager=flags_obj.enable_eager, + enable_xla=flags_obj.enable_xla) + + # Execute flag override logic for better model performance + if flags_obj.tf_gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=flags_obj.per_gpu_thread_count, + gpu_thread_mode=flags_obj.tf_gpu_thread_mode, + num_gpus=flags_obj.num_gpus, + datasets_num_private_threads=flags_obj.datasets_num_private_threads) + common.set_cudnn_batchnorm_mode() + + dtype = flags_core.get_tf_dtype(flags_obj) + if dtype == 'fp16': + raise ValueError('dtype fp16 is not supported in Keras. Use the default ' + 'value(fp32).') + + data_format = flags_obj.data_format + if data_format is None: + data_format = ('channels_first' if tf.config.list_physical_devices('GPU') + else 'channels_last') + tf.keras.backend.set_image_data_format(data_format) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus, + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs) + + if strategy: + # flags_obj.enable_get_next_as_optional controls whether enabling + # get_next_as_optional behavior in DistributedIterator. If true, last + # partial batch can be supported. + strategy.extended.experimental_enable_get_next_as_optional = ( + flags_obj.enable_get_next_as_optional + ) + + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + if flags_obj.use_synthetic_data: + synthetic_util.set_up_synthetic_data() + input_fn = common.get_synth_input_fn( + height=cifar_preprocessing.HEIGHT, + width=cifar_preprocessing.WIDTH, + num_channels=cifar_preprocessing.NUM_CHANNELS, + num_classes=cifar_preprocessing.NUM_CLASSES, + dtype=flags_core.get_tf_dtype(flags_obj), + drop_remainder=True) + else: + synthetic_util.undo_set_up_synthetic_data() + input_fn = cifar_preprocessing.input_fn + + train_input_dataset = input_fn( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=cifar_preprocessing.parse_record, + datasets_num_private_threads=flags_obj.datasets_num_private_threads, + dtype=dtype, + # Setting drop_remainder to avoid the partial batch logic in normalization + # layer, which triggers tf.where and leads to extra memory copy of input + # sizes between host and GPU. + drop_remainder=(not flags_obj.enable_get_next_as_optional)) + + eval_input_dataset = None + if not flags_obj.skip_eval: + eval_input_dataset = input_fn( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=cifar_preprocessing.parse_record) + + steps_per_epoch = ( + cifar_preprocessing.NUM_IMAGES['train'] // flags_obj.batch_size) + lr_schedule = 0.1 + if flags_obj.use_tensor_lr: + initial_learning_rate = common.BASE_LEARNING_RATE * flags_obj.batch_size / 128 + lr_schedule = tf.keras.optimizers.schedules.PiecewiseConstantDecay( + boundaries=list(p[1] * steps_per_epoch for p in LR_SCHEDULE), + values=[initial_learning_rate] + + list(p[0] * initial_learning_rate for p in LR_SCHEDULE)) + + with strategy_scope: + optimizer = common.get_optimizer(lr_schedule) + model = resnet_cifar_model.resnet56(classes=cifar_preprocessing.NUM_CLASSES) + model.compile( + loss='sparse_categorical_crossentropy', + optimizer=optimizer, + metrics=(['sparse_categorical_accuracy'] + if flags_obj.report_accuracy_metrics else None), + run_eagerly=flags_obj.run_eagerly) + + train_epochs = flags_obj.train_epochs + + callbacks = common.get_callbacks(steps_per_epoch) + + if not flags_obj.use_tensor_lr: + lr_callback = LearningRateBatchScheduler( + schedule=learning_rate_schedule, + batch_size=flags_obj.batch_size, + steps_per_epoch=steps_per_epoch) + callbacks.append(lr_callback) + + # if mutliple epochs, ignore the train_steps flag. + if train_epochs <= 1 and flags_obj.train_steps: + steps_per_epoch = min(flags_obj.train_steps, steps_per_epoch) + train_epochs = 1 + + num_eval_steps = (cifar_preprocessing.NUM_IMAGES['validation'] // + flags_obj.batch_size) + + validation_data = eval_input_dataset + if flags_obj.skip_eval: + if flags_obj.set_learning_phase_to_train: + # TODO(haoyuzhang): Understand slowdown of setting learning phase when + # not using distribution strategy. + tf.keras.backend.set_learning_phase(1) + num_eval_steps = None + validation_data = None + + if not strategy and flags_obj.explicit_gpu_placement: + # TODO(b/135607227): Add device scope automatically in Keras training loop + # when not using distribition strategy. + no_dist_strat_device = tf.device('/device:GPU:0') + no_dist_strat_device.__enter__() + + history = model.fit(train_input_dataset, + epochs=train_epochs, + steps_per_epoch=steps_per_epoch, + callbacks=callbacks, + validation_steps=num_eval_steps, + validation_data=validation_data, + validation_freq=flags_obj.epochs_between_evals, + verbose=2) + eval_output = None + if not flags_obj.skip_eval: + eval_output = model.evaluate(eval_input_dataset, + steps=num_eval_steps, + verbose=2) + + if not strategy and flags_obj.explicit_gpu_placement: + no_dist_strat_device.__exit__() + + stats = common.build_stats(history, eval_output, callbacks) + return stats + + +def define_cifar_flags(): + common.define_keras_flags(dynamic_loss_scale=False) + + flags_core.set_defaults(data_dir='/tmp/cifar10_data/cifar-10-batches-bin', + model_dir='/tmp/cifar10_model', + epochs_between_evals=10, + batch_size=128) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + return run(flags.FLAGS) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_cifar_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_model.py new file mode 100644 index 0000000..1b50738 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_model.py @@ -0,0 +1,262 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ResNet56 model for Keras adapted from tf.keras.applications.ResNet50. + +# Reference: +- [Deep Residual Learning for Image Recognition]( + https://arxiv.org/abs/1512.03385) +Adapted from code contributed by BigMoyan. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import tensorflow as tf +from tensorflow.python.keras import backend +from tensorflow.python.keras import initializers +from tensorflow.python.keras import layers +from tensorflow.python.keras import regularizers + + +BATCH_NORM_DECAY = 0.997 +BATCH_NORM_EPSILON = 1e-5 +L2_WEIGHT_DECAY = 2e-4 + + +def identity_building_block(input_tensor, + kernel_size, + filters, + stage, + block, + training=None): + """The identity block is the block that has no conv layer at shortcut. + + Arguments: + input_tensor: input tensor + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: current block label, used for generating layer names + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor for the block. + """ + filters1, filters2 = filters + if backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D(filters1, kernel_size, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2a')(input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2a')(x, training=training) + x = layers.Activation('relu')(x) + + x = layers.Conv2D(filters2, kernel_size, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2b')(x) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2b')(x, training=training) + + x = layers.add([x, input_tensor]) + x = layers.Activation('relu')(x) + return x + + +def conv_building_block(input_tensor, + kernel_size, + filters, + stage, + block, + strides=(2, 2), + training=None): + """A block that has a conv layer at shortcut. + + Arguments: + input_tensor: input tensor + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: current block label, used for generating layer names + strides: Strides for the first conv layer in the block. + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor for the block. + + Note that from stage 3, + the first conv layer at main path is with strides=(2, 2) + And the shortcut should have strides=(2, 2) as well + """ + filters1, filters2 = filters + if tf.keras.backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D(filters1, kernel_size, strides=strides, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2a')(input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2a')(x, training=training) + x = layers.Activation('relu')(x) + + x = layers.Conv2D(filters2, kernel_size, padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2b')(x) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2b')(x, training=training) + + shortcut = layers.Conv2D(filters2, (1, 1), strides=strides, use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '1')(input_tensor) + shortcut = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '1')(shortcut, training=training) + + x = layers.add([x, shortcut]) + x = layers.Activation('relu')(x) + return x + + +def resnet_block(input_tensor, + size, + kernel_size, + filters, + stage, + conv_strides=(2, 2), + training=None): + """A block which applies conv followed by multiple identity blocks. + + Arguments: + input_tensor: input tensor + size: integer, number of constituent conv/identity building blocks. + A conv block is applied once, followed by (size - 1) identity blocks. + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + conv_strides: Strides for the first conv layer in the block. + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor after applying conv and identity blocks. + """ + + x = conv_building_block(input_tensor, kernel_size, filters, stage=stage, + strides=conv_strides, block='block_0', + training=training) + for i in range(size - 1): + x = identity_building_block(x, kernel_size, filters, stage=stage, + block='block_%d' % (i + 1), training=training) + return x + + +def resnet(num_blocks, classes=10, training=None): + """Instantiates the ResNet architecture. + + Arguments: + num_blocks: integer, the number of conv/identity blocks in each block. + The ResNet contains 3 blocks with each block containing one conv block + followed by (layers_per_block - 1) number of idenity blocks. Each + conv/idenity block has 2 convolutional layers. With the input + convolutional layer and the pooling layer towards the end, this brings + the total size of the network to (6*num_blocks + 2) + classes: optional number of classes to classify images into + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + A Keras model instance. + """ + + input_shape = (32, 32, 3) + img_input = layers.Input(shape=input_shape) + + if backend.image_data_format() == 'channels_first': + x = layers.Lambda(lambda x: backend.permute_dimensions(x, (0, 3, 1, 2)), + name='transpose')(img_input) + bn_axis = 1 + else: # channel_last + x = img_input + bn_axis = 3 + + x = layers.ZeroPadding2D(padding=(1, 1), name='conv1_pad')(x) + x = layers.Conv2D(16, (3, 3), + strides=(1, 1), + padding='valid', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name='conv1')(x) + x = layers.BatchNormalization(axis=bn_axis, + momentum=BATCH_NORM_DECAY, + epsilon=BATCH_NORM_EPSILON, + name='bn_conv1',)(x, training=training) + x = layers.Activation('relu')(x) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[16, 16], + stage=2, conv_strides=(1, 1), training=training) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[32, 32], + stage=3, conv_strides=(2, 2), training=training) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[64, 64], + stage=4, conv_strides=(2, 2), training=training) + + rm_axes = [1, 2] if backend.image_data_format() == 'channels_last' else [2, 3] + x = layers.Lambda(lambda x: backend.mean(x, rm_axes), name='reduce_mean')(x) + x = layers.Dense(classes, + activation='softmax', + kernel_initializer=initializers.RandomNormal(stddev=0.01), + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + bias_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name='fc10')(x) + + inputs = img_input + # Create model. + model = tf.keras.models.Model(inputs, x, name='resnet56') + + return model + + +resnet20 = functools.partial(resnet, num_blocks=3) +resnet32 = functools.partial(resnet, num_blocks=5) +resnet56 = functools.partial(resnet, num_blocks=9) +resnet10 = functools.partial(resnet, num_blocks=110) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_test.py new file mode 100644 index 0000000..6dbb2fa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/resnet_cifar_test.py @@ -0,0 +1,187 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test the keras ResNet model with Cifar data.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tempfile + +import tensorflow as tf + +from tensorflow.python.eager import context +from tensorflow.python.platform import googletest +from official.benchmark.models import resnet_cifar_main +from official.utils.misc import keras_utils +from official.utils.testing import integration +from official.vision.image_classification.resnet import cifar_preprocessing + + +class KerasCifarTest(googletest.TestCase): + """Unit tests for Keras ResNet with Cifar.""" + + _extra_flags = [ + "-batch_size", "4", + "-train_steps", "1", + "-use_synthetic_data", "true" + ] + _tempdir = None + + def get_temp_dir(self): + if not self._tempdir: + self._tempdir = tempfile.mkdtemp(dir=googletest.GetTempDir()) + return self._tempdir + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(KerasCifarTest, cls).setUpClass() + resnet_cifar_main.define_cifar_flags() + + def setUp(self): + super(KerasCifarTest, self).setUp() + cifar_preprocessing.NUM_IMAGES["validation"] = 4 + + def tearDown(self): + super(KerasCifarTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + def test_end_to_end_no_dist_strat(self): + """Test Keras model with 1 GPU, no distribution strategy.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + extra_flags = [ + "-distribution_strategy", "off", + "-model_dir", "keras_cifar_no_dist_strat", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_no_dist_strat(self): + """Test Keras model in legacy graph mode with 1 GPU, no dist strat.""" + extra_flags = [ + "-enable_eager", "false", + "-distribution_strategy", "off", + "-model_dir", "keras_cifar_graph_no_dist_strat", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_1_gpu(self): + """Test Keras model with 1 GPU.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + if context.num_gpus() < 1: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(1, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "1", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_1_gpu", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_1_gpu(self): + """Test Keras model in legacy graph mode with 1 GPU.""" + if context.num_gpus() < 1: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(1, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "1", + "-noenable_eager", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_graph_1_gpu", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_2_gpu(self): + """Test Keras model with 2 GPUs.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + if context.num_gpus() < 2: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(2, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "2", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_2_gpu", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_2_gpu(self): + """Test Keras model in legacy graph mode with 2 GPUs.""" + if context.num_gpus() < 2: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(2, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "2", + "-enable_eager", "false", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_graph_2_gpu", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + +if __name__ == "__main__": + googletest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/README.md new file mode 100644 index 0000000..5395cc9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/README.md @@ -0,0 +1,31 @@ +# Shakespeare character LSTM model + +This is an implemention of a simple character LSTM used to generate text. + +## Instructions + +First download the source data: + +``` +wget https://storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt +``` + +Note that files other than shakepeare.txt can also be used to train the model to generater other text. + +Then train the model: + +```python +python3 shakespeare_main.py --training_data shakespeare.txt \ + --model_dir /tmp/shakespeare +``` + +This will place model checkpoints in `/tmp/shakespeare`, so that we can use them to make predictions. + +Then generate predictions: + +```python +python3 shakespeare_main.py --training_data shakespeare.txt \ + --model_dir /tmp/shakespeare --notrain --predict_context=ROMEO: +``` + +Change `--predict_context` and `--predict_length` to suit your needs. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/shakespeare_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/shakespeare_main.py new file mode 100644 index 0000000..fd490b7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/shakespeare/shakespeare_main.py @@ -0,0 +1,316 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a character LSTM model trained on Shakespeare.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import os + +# pylint: disable=wrong-import-order +from absl import app +from absl import flags +import numpy as np +import tensorflow as tf +# pylint: enable=wrong-import-order + +from official.utils.flags import core as flags_core +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + +EMBEDDING_DIM = 256 +RNN_UNITS = 1024 +SEQ_LENGTH = 100 +# Calculated by running batch_size=1 +BATCHES_PER_EPOCH = 11043 + + +def define_flags(): + """Define the flags for the Shakespeare character LSTM.""" + flags_core.define_base(data_dir=False, + clean=False, + train_epochs=True, + epochs_between_evals=False, + stop_threshold=False, + num_gpu=True, + hooks=False, + export_dir=False, + run_eagerly=True, + distribution_strategy=True) + + flags_core.define_performance(num_parallel_calls=False, + inter_op=False, + intra_op=False, + synthetic_data=False, + max_train_steps=False, + dtype=True, + loss_scale=True, + enable_xla=True) + + flags_core.set_defaults(train_epochs=43, + batch_size=64) + + flags.DEFINE_boolean(name='enable_eager', default=True, help='Enable eager?') + flags.DEFINE_boolean( + name='train', default=True, + help='If true trains the model.') + flags.DEFINE_string( + name='predict_context', default=None, + help='If set, makes a prediction with the given context.') + flags.DEFINE_integer( + name='predict_length', default=1000, + help='Length of the predicted text including the context.') + flags.DEFINE_integer(name='train_steps', default=None, + help='Overrides train_steps per epoch if not None.') + flags.DEFINE_integer( + name='log_steps', default=100, + help='For every log_steps, we log the timing information such as ' + 'examples per second.') + flags.DEFINE_string( + name='training_data', default=None, + help='Path to file containing the training data.') + flags.DEFINE_boolean(name='cudnn', default=True, help='Use CuDNN LSTM.') + + +def get_dataset(path_to_file, batch_size=None, seq_length=SEQ_LENGTH): + """Creates a dataset from a given text file. + + Args: + path_to_file: The path to the training data. + batch_size: Batch size to use. + seq_length: The length of the LSTM sequence. + + Returns: + A tuple, consisting of the Dataset and the class to character mapping + and character to class mapping. + """ + with tf.io.gfile.GFile(path_to_file, 'rb') as train_data: + text = train_data.read().decode(encoding='utf-8') + + # Create vocab + vocab = sorted(set(text)) + char2idx = {u: i for i, u in enumerate(vocab)} + idx2char = np.array(vocab) + + # Split text into sequence length + 1 chucks to create examples + text_as_int = np.array([char2idx[c] for c in text]) + char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int) + sequences = char_dataset.batch(seq_length+1, drop_remainder=True) + + def split_input_target(chunk): + input_text = chunk[:-1] + target_text = chunk[1:] + return input_text, tf.one_hot(target_text, len(vocab)) + dataset = sequences.map(split_input_target) + dataset = dataset.shuffle(10000).repeat() + dataset = dataset.batch(batch_size, drop_remainder=True) + + return dataset, idx2char, char2idx + + +def build_model(vocab_size, + embedding_dim=EMBEDDING_DIM, + rnn_units=RNN_UNITS, + batch_size=None, + stateful=False, + use_cudnn=True): + """Builds the Shakespeare model. + + Args: + vocab_size: The number of character classes in the input. + embedding_dim: The dimension of the embedding space for each class. + rnn_units: The number of RNN units in the layer. + batch_size: When predicting, the batch size of the predictions. + stateful: If true, the LSTM is stateful. + + Returns: + A Keras Model. + """ + assert keras_utils.is_v2_0() + LSTM = functools.partial(tf.keras.layers.LSTM, implementation=2) + + # By indirecting the activation through a lambda layer, the logic to dispatch + # to CuDNN in V2 doesn't trigger and we force the LSTM to run in non-CuDNN + # mode. + lstm_activation = ('tanh' if use_cudnn else + lambda x: tf.math.tanh(x)) + + batch_shape = [batch_size if stateful else None, None] + return tf.keras.Sequential([ + tf.keras.layers.Embedding(vocab_size, embedding_dim, + batch_input_shape=batch_shape), + LSTM(rnn_units, + activation=lstm_activation, + return_sequences=True, + stateful=stateful, + recurrent_initializer='glorot_uniform'), + tf.keras.layers.Dense(vocab_size), + tf.keras.layers.Softmax(dtype=tf.float32)]) + + +def train_model(flags_obj, dataset, vocab_size, strategy, checkpoint_dir=None): + """Trains a Shakespeare model. + + Args: + flags_obj: An object containing parsed flag values.s + dataset: the training data set. + vocab_size: the number of unique character classes. + strategy: distribution strategy to use. + checkpoint_dir: if not None, the directory in which to make checkpoints. + + Returns: + The training history and callbacks. + """ + if flags_obj.train_steps: + train_steps = flags_obj.train_steps + else: + train_steps = BATCHES_PER_EPOCH // flags_obj.batch_size + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + with strategy_scope: + model = build_model(vocab_size=vocab_size, batch_size=flags_obj.batch_size, + use_cudnn=flags_obj.cudnn) + + # When keras_use_ctl is False, Model.fit() automatically applies + # loss scaling so we don't need to create a LossScaleOptimizer. + model.compile( + optimizer=tf.keras.optimizers.Adam(), + loss=tf.keras.losses.CategoricalCrossentropy(), + metrics=[tf.keras.metrics.Recall(top_k=1, name='RecallAt1'), + tf.keras.metrics.Recall(top_k=5, name='RecallAt5')], + run_eagerly=flags_obj.run_eagerly) + + callbacks = [] + if checkpoint_dir: + checkpoint_prefix = os.path.join(checkpoint_dir, 'ckpt_{epoch}') + checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( + filepath=checkpoint_prefix, + save_weights_only=True) + callbacks.append(checkpoint_callback) + time_callback = keras_utils.TimeHistory(flags_obj.batch_size, + flags_obj.log_steps) + callbacks.append(time_callback) + history = model.fit(dataset, + epochs=flags_obj.train_epochs, + steps_per_epoch=train_steps, + callbacks=callbacks, + verbose=2) + return history, callbacks + + +def make_prediction(checkpoint_dir, length, context, idx2char, char2idx): + """Make predictions from a Shakespeare model. + + Args: + checkpoint_dir: the directory from which to load checkpoints + length: the total length of the generated text (including the context). + context: the initial text with which the LSTM is primed. + idx2char: the character class to character mapping. + char2idx: the character to character class mapping. + + Returns: + A generated string of text of the given length. + """ + prediction_model = build_model( + vocab_size=len(idx2char), batch_size=1, stateful=True) + prediction_model.load_weights(tf.train.latest_checkpoint(checkpoint_dir)) + prediction_model.build(tf.TensorShape([1, None])) + + input_eval = [char2idx[s] for s in context] + input_eval = tf.expand_dims(input_eval, 0) + + text_generated = [] + + prediction_model.reset_states() + for _ in range(length - len(context)): + predictions = prediction_model(input_eval) + predictions = tf.squeeze(predictions, 0) + + # We applied a softmax to the output of the model so that + # tf.keras.metrics.Recall would work. We need logits for + # tf.random.categorical, so we convert the probabilities back to log odds + predictions = tf.math.log(predictions / (1 - predictions)) + + random_output = tf.random.categorical(predictions, num_samples=1) + selected_id = random_output[-1, 0].numpy() + input_eval = tf.expand_dims([selected_id], 0) + text_generated.append(idx2char[selected_id]) + + return context + ''.join(text_generated) + + +def run(flags_obj): + """Run Shakespeare training and predict. + + Args: + flags_obj: An object containing parsed flag values. + + Returns: + Dictionary with status from the run. + """ + if not flags_obj.training_data: + raise ValueError( + 'Must set the path to a training data file. e.g download the following ' + 'https://storage.googleapis.com/download.tensorflow.org/data/' + 'shakespeare.txt') + + if flags_obj.dtype == 'fp16': + policy = tf.keras.mixed_precision.experimental.Policy( + 'mixed_float16', + loss_scale=flags_core.get_loss_scale(flags_obj, + default_for_fp16='dynamic')) + tf.keras.mixed_precision.experimental.set_policy(policy) + + keras_utils.set_session_config( + enable_eager=flags_obj.enable_eager, + enable_xla=flags_obj.enable_xla) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus) + + dataset, idx2char, char2idx = get_dataset(flags_obj.training_data, + batch_size=flags_obj.batch_size) + stats = {} + if flags_obj.train: + history, callbacks = train_model(flags_obj, dataset, + len(idx2char), strategy, + checkpoint_dir=flags_obj.model_dir) + + stats['history'] = history.history + stats['callbacks'] = callbacks + + if flags_obj.predict_context: + if not flags_obj.model_dir: + raise ValueError('Must set model_dir to get predictions.') + print(make_prediction(flags_obj.model_dir, + flags_obj.predict_length, + flags_obj.predict_context, + idx2char, + char2idx)) + + return stats + + +def main(_): + flags_obj = flags.FLAGS + run(flags_obj) + + +if __name__ == '__main__': + define_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/synthetic_util.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/synthetic_util.py new file mode 100644 index 0000000..c14d022 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/models/synthetic_util.py @@ -0,0 +1,129 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper functions to generate data directly on devices.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import random +import string + +from absl import logging +import tensorflow as tf + + +# The `SyntheticDataset` is a temporary solution for generating synthetic data +# directly on devices. It is only useful for Keras with Distribution +# Strategies. We will have better support in `tf.data` or Distribution Strategy +# later. +class SyntheticDataset(object): + """A dataset that generates synthetic data on each device.""" + + def __init__(self, dataset, split_by=1): + # dataset.take(1) doesn't have GPU kernel. + with tf.device('device:CPU:0'): + tensor = tf.data.experimental.get_single_element(dataset.take(1)) + flat_tensor = tf.nest.flatten(tensor) + variable_data = [] + initializers = [] + for t in flat_tensor: + rebatched_t = tf.split(t, num_or_size_splits=split_by, axis=0)[0] + assert rebatched_t.shape.is_fully_defined(), rebatched_t.shape + v = tf.compat.v1.get_local_variable(self._random_name(), + initializer=rebatched_t) + variable_data.append(v) + initializers.append(v.initializer) + input_data = tf.nest.pack_sequence_as(tensor, variable_data) + self._iterator = SyntheticIterator(input_data, initializers) + + def _random_name(self, size=10, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + + def __iter__(self): + return self._iterator + + def make_one_shot_iterator(self): + return self._iterator + + def make_initializable_iterator(self): + return self._iterator + + +class SyntheticIterator(object): + """A dataset that generates synthetic data on each device.""" + + def __init__(self, input_data, initializers): + self._input_data = input_data + self._initializers = initializers + + def get_next(self): + return self._input_data + + def next(self): + return self.__next__() + + def __next__(self): + try: + return self.get_next() + except tf.errors.OutOfRangeError: + raise StopIteration + + def initialize(self): + if tf.executing_eagerly(): + return tf.no_op() + else: + return self._initializers + + +def _monkey_patch_dataset_method(strategy): + """Monkey-patch `strategy`'s `make_dataset_iterator` method.""" + def make_dataset(self, dataset): + logging.info('Using pure synthetic data.') + with self.scope(): + if self.extended._global_batch_size: # pylint: disable=protected-access + return SyntheticDataset(dataset, self.num_replicas_in_sync) + else: + return SyntheticDataset(dataset) + + def make_iterator(self, dataset): + dist_dataset = make_dataset(self, dataset) + return iter(dist_dataset) + + strategy.orig_make_dataset_iterator = strategy.make_dataset_iterator + strategy.make_dataset_iterator = make_iterator + strategy.orig_distribute_dataset = strategy.experimental_distribute_dataset + strategy.experimental_distribute_dataset = make_dataset + + +def _undo_monkey_patch_dataset_method(strategy): + if hasattr(strategy, 'orig_make_dataset_iterator'): + strategy.make_dataset_iterator = strategy.orig_make_dataset_iterator + if hasattr(strategy, 'orig_distribute_dataset'): + strategy.make_dataset_iterator = strategy.orig_distribute_dataset + + +def set_up_synthetic_data(): + _monkey_patch_dataset_method(tf.distribute.OneDeviceStrategy) + _monkey_patch_dataset_method(tf.distribute.MirroredStrategy) + _monkey_patch_dataset_method( + tf.distribute.experimental.MultiWorkerMirroredStrategy) + + +def undo_set_up_synthetic_data(): + _undo_monkey_patch_dataset_method(tf.distribute.OneDeviceStrategy) + _undo_monkey_patch_dataset_method(tf.distribute.MirroredStrategy) + _undo_monkey_patch_dataset_method( + tf.distribute.experimental.MultiWorkerMirroredStrategy) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/ncf_keras_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/ncf_keras_benchmark.py new file mode 100644 index 0000000..d8c9f3f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/ncf_keras_benchmark.py @@ -0,0 +1,457 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Keras benchmarks and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +from absl import flags +from absl import logging +from absl.testing import flagsaver +import tensorflow as tf +from official.benchmark import benchmark_wrappers +from official.recommendation import ncf_common +from official.recommendation import ncf_keras_main +from official.utils.flags import core + +FLAGS = flags.FLAGS +NCF_DATA_DIR_NAME = 'movielens_data' +NCF_TF_DATA_1M_BATCH_DIR_NAME = 'gs://tf-perfzero-data/movielens_data/ncf_8gpu_1M_batch' + + +class NCFKerasBenchmarkBase(tf.test.Benchmark): + """Base class for NCF model benchmark.""" + local_flags = None + + def __init__(self, + output_dir=None, + default_flags=None, + **kwargs): + self.output_dir = output_dir + self.default_flags = default_flags or {} + # Run all benchmarks with ml_perf flag. + self.default_flags['ml_perf'] = True + + def _setup(self): + """Sets up and resets flags before each test.""" + logging.set_verbosity(logging.INFO) + if NCFKerasBenchmarkBase.local_flags is None: + ncf_common.define_ncf_flags() + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + core.set_defaults(**self.default_flags) + saved_flag_values = flagsaver.save_flag_values() + NCFKerasBenchmarkBase.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(NCFKerasBenchmarkBase.local_flags) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, hr_at_10_min=0, hr_at_10_max=0): + start_time_sec = time.time() + stats = ncf_keras_main.run_ncf(FLAGS) + wall_time_sec = time.time() - start_time_sec + + metrics = [] + metrics.append({'name': 'exp_per_second', + 'value': stats['avg_exp_per_second']}) + + if hr_at_10_min > 0: + metrics.append({'name': 'hr_at_10', + 'value': stats['eval_hit_rate'], + 'min_value': hr_at_10_min, + 'max_value': hr_at_10_max}) + + metrics.append({'name': 'train_loss', + 'value': stats['loss']}) + + self.report_benchmark(iters=-1, wall_time=wall_time_sec, metrics=metrics) + + +class NCFKerasAccuracy(NCFKerasBenchmarkBase): + """Benchmark NCF model using real data.""" + + def __init__(self, + output_dir=None, + root_data_dir=None, + default_flags=None, + **kwargs): + root_data_dir = root_data_dir if root_data_dir else '' + default_flags = {} + default_flags['dataset'] = 'ml-20m' + default_flags['num_gpus'] = 1 + default_flags['train_epochs'] = 10 + default_flags['clean'] = True + default_flags['batch_size'] = 99000 + default_flags['learning_rate'] = 0.00382059 + default_flags['beta1'] = 0.783529 + default_flags['beta2'] = 0.909003 + default_flags['epsilon'] = 1.45439e-07 + default_flags['layers'] = [256, 256, 128, 64] + default_flags['num_factors'] = 64 + default_flags['hr_threshold'] = 0.635 + default_flags['ml_perf'] = True + default_flags['use_synthetic_data'] = False + default_flags['data_dir'] = os.path.join(root_data_dir, NCF_DATA_DIR_NAME) + + super(NCFKerasAccuracy, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + **kwargs) + + def _run_and_report_benchmark_mlperf_like(self): + """Run test and report results. + + Note: MLPerf like tests are not tuned to hit a specific hr@10 value, but + we want it recorded. + """ + self._run_and_report_benchmark(hr_at_10_min=0.61) + + def _run_and_report_benchmark(self, hr_at_10_min=0.630, hr_at_10_max=0.645): + """Run test and report results. + + Note: Target is 0.635, but some runs are below that level. Until we have + multi-run tests, we have to accept a lower target. + + Args: + hr_at_10_min: Minimum acceptable hr@10 value. + hr_at_10_max: Maximum acceptable hr@10 value. + """ + super(NCFKerasAccuracy, self)._run_and_report_benchmark( + hr_at_10_min=hr_at_10_min, + hr_at_10_max=hr_at_10_max) + + def benchmark_1_gpu_early_stop(self): + self._setup() + FLAGS.early_stopping = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_early_stop(self): + self._setup() + FLAGS.distribution_strategy = 'off' + FLAGS.early_stopping = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_early_stop(self): + self._setup() + FLAGS.distribution_strategy = 'off' + FLAGS.early_stopping = True + FLAGS.run_eagerly = True + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_early_stop(self): + self._setup() + FLAGS.early_stopping = True + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_ctl_early_stop(self): + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.early_stopping = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_ctl_run_eagerly_early_stop(self): + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.early_stopping = True + FLAGS.run_eagerly = True + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_ctl_early_stop(self): + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.early_stopping = True + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_2_gpus_early_stop(self): + self._setup() + FLAGS.early_stopping = True + FLAGS.num_gpus = 2 + FLAGS.eval_batch_size = 160000 + self._run_and_report_benchmark() + + def benchmark_2_gpus_ctl_early_stop(self): + """NCF with custom training loop. Works only in TF 2.0.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.early_stopping = True + FLAGS.num_gpus = 2 + FLAGS.eval_batch_size = 160000 + self._run_and_report_benchmark() + +############################################# +# Tests below with mlperf in the test name are of two types: +# 1) 1 GPU tests are based on MLPerf 0.5 and the TensorFlow pulled submission. +# 2) 8 GPU tests are based on MLPerf 0.5 and use NVIDIA's hyper parameters. +# +# The purpose of both is to get a number to compare to existing results. To do +# this the number of epochs is held constant rather than a race to a given +# accuracy. The accuracy validation is done by the "early_stop" tests. +############################################# + + def benchmark_1_gpu_mlperf_like(self): + """1 GPU using keras fit/compile.""" + self._setup() + FLAGS.train_epochs = 7 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_no_dist_strat_mlperf_like(self): + """1 GPU using compile/fit without dist_strat.""" + self._setup() + FLAGS.train_epochs = 7 + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_no_dist_strat_run_eagerly_mlperf_like(self): + self._setup() + FLAGS.train_epochs = 7 + FLAGS.distribution_strategy = 'off' + FLAGS.run_eagerly = True + self._run_and_report_benchmark_mlperf_like() + + def benchmark_xla_1_gpu_mlperf_like(self): + """1 GPU using compile/fit with XLA.""" + self._setup() + FLAGS.train_epochs = 7 + FLAGS.enable_xla = True + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_ctl_mlperf_like(self): + """1 GPU using CTL.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.train_epochs = 7 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_ctl_fp16_mlperf_like(self): + """1 GPU using CTL and FP16.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_fp16_mlperf_like(self): + """1 GPU using FP16.""" + self._setup() + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_ctl_fp16_graph_rewrite_mlperf_like(self): + """1 GPU using CTL and FP16 graph rewrite.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_fp16_graph_rewrite_mlperf_like(self): + """1 GPU using FP16 graph rewrite.""" + self._setup() + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_1_gpu_ctl_run_eagerly_mlperf_like(self): + """1 GPU using CTL with eager and distribution strategy.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.run_eagerly = True + FLAGS.train_epochs = 7 + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_ctl_mlperf_like(self): + """1 GPU using CTL with XLA.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.enable_xla = True + FLAGS.train_epochs = 7 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_xla_1_gpu_fp16_mlperf_like(self): + """1 GPU using with XLA and FP16.""" + self._setup() + FLAGS.enable_xla = True + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_xla_1_gpu_ctl_fp16_mlperf_like(self): + """1 GPU using CTL with XLA and FP16.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.enable_xla = True + FLAGS.train_epochs = 7 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_mlperf_like(self): + """8 GPU using keras fit/compile.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 160000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_ctl_mlperf_like(self): + """8 GPU using CTL.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 160000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_tf_data_ctl_mlperf_like(self): + """8 GPU using CTL.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 1048000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + FLAGS.train_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "training_cycle_*/*") + FLAGS.eval_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "eval_data/*") + FLAGS.input_meta_data_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "meta_data.json") + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_tf_data_fp16_mlperf_like(self): + """8 GPU FP16""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 1048000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + FLAGS.train_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "training_cycle_*/*") + FLAGS.eval_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "eval_data/*") + FLAGS.input_meta_data_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "meta_data.json") + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_tf_data_ctl_fp16_mlperf_like(self): + """8 GPU FP16 using CTL""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 1048000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + FLAGS.dtype = 'fp16' + FLAGS.loss_scale = 8192 + FLAGS.train_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "training_cycle_*/*") + FLAGS.eval_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "eval_data/*") + FLAGS.input_meta_data_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, "meta_data.json") + self._run_and_report_benchmark_mlperf_like() + + def benchmark_8_gpu_tf_data_ctl_fp16_graph_rewrite_mlperf_like(self): + """8 GPU FP16 graph rewrite using CTL.""" + self._setup() + FLAGS.keras_use_ctl = True + FLAGS.num_gpus = 8 + FLAGS.train_epochs = 17 + FLAGS.batch_size = 1048576 + FLAGS.eval_batch_size = 1048000 + FLAGS.learning_rate = 0.0045 + FLAGS.beta1 = 0.25 + FLAGS.beta2 = 0.5 + FLAGS.epsilon = 1e-8 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.loss_scale = 8192 + FLAGS.train_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, + 'training_cycle_*/*') + FLAGS.eval_dataset_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, + 'eval_data/*') + FLAGS.input_meta_data_path = os.path.join(NCF_TF_DATA_1M_BATCH_DIR_NAME, + 'meta_data.json') + self._run_and_report_benchmark_mlperf_like() + + +class NCFKerasSynth(NCFKerasBenchmarkBase): + """Benchmark NCF model using synthetic data.""" + + def __init__(self, + output_dir=None, + default_flags=None, + **kwargs): + + default_flags = {} + default_flags['dataset'] = 'ml-20m' + default_flags['num_gpus'] = 1 + default_flags['train_epochs'] = 8 + default_flags['batch_size'] = 99000 + default_flags['eval_batch_size'] = 160000 + default_flags['learning_rate'] = 0.00382059 + default_flags['beta1'] = 0.783529 + default_flags['beta2'] = 0.909003 + default_flags['epsilon'] = 1.45439e-07 + default_flags['layers'] = [256, 256, 128, 64] + default_flags['num_factors'] = 64 + default_flags['hr_threshold'] = 0.635 + default_flags['use_synthetic_data'] = True + + super(NCFKerasSynth, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + **kwargs) + + def benchmark_1_gpu(self): + self._setup() + self._run_and_report_benchmark() + + def benchmark_2_gpus(self): + self._setup() + FLAGS.num_gpus = 2 + self._run_and_report_benchmark() + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/perfzero_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/perfzero_benchmark.py new file mode 100644 index 0000000..895f823 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/perfzero_benchmark.py @@ -0,0 +1,91 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utils for creating PerfZero benchmarks.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import flags +from absl import logging +from absl.testing import flagsaver +import tensorflow as tf + +FLAGS = flags.FLAGS + + +class PerfZeroBenchmark(tf.test.Benchmark): + """Common methods used in PerfZero Benchmarks. + + Handles the resetting of flags between tests, loading of default_flags, + overriding of defaults. PerfZero (OSS) runs each test in a separate + process reducing some need to reset the flags. + """ + local_flags = None + + def __init__(self, + output_dir=None, + default_flags=None, + flag_methods=None, + tpu=None): + """Initialize class. + + Args: + output_dir: Base directory to store all output for the test. + default_flags: Set of flags to pass to model. + flag_methods: Set of flag methods to run during setup. + tpu: (optional) TPU name to use in a TPU benchmark. + """ + if os.getenv('BENCHMARK_OUTPUT_DIR'): + self.output_dir = os.getenv('BENCHMARK_OUTPUT_DIR') + elif output_dir: + self.output_dir = output_dir + else: + self.output_dir = '/tmp' + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + + if os.getenv('BENCHMARK_TPU'): + resolved_tpu = os.getenv('BENCHMARK_TPU') + elif tpu: + resolved_tpu = tpu + else: + resolved_tpu = None + + if resolved_tpu: + # TPU models are expected to accept a --tpu=name flag. PerfZero creates + # the TPU at runtime and passes the TPU's name to this flag. + self.default_flags['tpu'] = resolved_tpu + + def _get_model_dir(self, folder_name): + """Returns directory to store info, e.g. saved model and event log.""" + return os.path.join(self.output_dir, folder_name) + + def _setup(self): + """Sets up and resets flags before each test.""" + logging.set_verbosity(logging.INFO) + if PerfZeroBenchmark.local_flags is None: + for flag_method in self.flag_methods: + flag_method() + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + # Overrides flag values with defaults for the class of tests. + for k, v in self.default_flags.items(): + setattr(FLAGS, k, v) + saved_flag_values = flagsaver.save_flag_values() + PerfZeroBenchmark.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(PerfZeroBenchmark.local_flags) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/resnet_ctl_imagenet_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/resnet_ctl_imagenet_benchmark.py new file mode 100644 index 0000000..c62bcb9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/resnet_ctl_imagenet_benchmark.py @@ -0,0 +1,412 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes CTL benchmarks and accuracy tests.""" +# pylint: disable=line-too-long,g-bad-import-order +from __future__ import print_function + +import os +import time + +from absl import flags +import tensorflow as tf + +from official.vision.image_classification.resnet import common +from official.vision.image_classification.resnet import resnet_ctl_imagenet_main +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark +from official.benchmark import benchmark_wrappers +from official.utils.flags import core as flags_core + +MIN_TOP_1_ACCURACY = 0.76 +MAX_TOP_1_ACCURACY = 0.77 + +FLAGS = flags.FLAGS + + +class CtlBenchmark(PerfZeroBenchmark): + """Base benchmark class with methods to simplify testing.""" + + def __init__(self, output_dir=None, default_flags=None, flag_methods=None): + self.output_dir = output_dir + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + super(CtlBenchmark, self).__init__( + output_dir=self.output_dir, + default_flags=self.default_flags, + flag_methods=self.flag_methods) + + def _report_benchmark(self, + stats, + wall_time_sec, + top_1_max=None, + top_1_min=None, + total_batch_size=None, + log_steps=None, + warmup=1, + start_time_sec=None): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from keras models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + top_1_max: highest passing level for top_1 accuracy. + top_1_min: lowest passing level for top_1 accuracy. + total_batch_size: Global batch-size. + log_steps: How often the log was created for stats['step_timestamp_log']. + warmup: number of entries in stats['step_timestamp_log'] to ignore. + start_time_sec: the start time of the program in seconds since epoch. + """ + + metrics = [] + if 'eval_acc' in stats: + metrics.append({ + 'name': 'accuracy_top_1', + 'value': stats['eval_acc'], + 'min_value': top_1_min, + 'max_value': top_1_max + }) + metrics.append({'name': 'eval_loss', 'value': stats['eval_loss']}) + + metrics.append({ + 'name': 'top_1_train_accuracy', + 'value': stats['train_acc'] + }) + metrics.append({'name': 'train_loss', 'value': stats['train_loss']}) + + if (warmup and 'step_timestamp_log' in stats and + len(stats['step_timestamp_log']) > warmup + 1): + # first entry in the time_log is start of step 0. The rest of the + # entries are the end of each step recorded + time_log = stats['step_timestamp_log'] + steps_elapsed = time_log[-1].batch_index - time_log[warmup].batch_index + time_elapsed = time_log[-1].timestamp - time_log[warmup].timestamp + examples_per_sec = total_batch_size * (steps_elapsed / time_elapsed) + metrics.append({'name': 'exp_per_second', 'value': examples_per_sec}) + + if 'avg_exp_per_second' in stats: + metrics.append({ + 'name': 'avg_exp_per_second', + 'value': stats['avg_exp_per_second'] + }) + + if start_time_sec and 'step_timestamp_log' in stats: + time_log = stats['step_timestamp_log'] + # time_log[0] is recorded at the beginning of the first step. + startup_time = time_log[0].timestamp - start_time_sec + metrics.append({'name': 'startup_time', 'value': startup_time}) + + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=-1, + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class Resnet50CtlAccuracy(CtlBenchmark): + """Benchmark accuracy tests for ResNet50 in CTL.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more named + arguments before updating the constructor. + """ + + flag_methods = [common.define_keras_flags] + + self.data_dir = os.path.join(root_data_dir, 'imagenet') + super(Resnet50CtlAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def benchmark_8_gpu(self): + """Test Keras model with eager, dist_strat and 8 GPUs.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + FLAGS.dtype = 'fp32' + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16(self): + """Test Keras model with eager, 8 GPUs with tf.keras mixed precision.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16') + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark() + + def benchmark_8_gpu_amp(self): + """Test Keras model with 8 GPUs and mixed precision via graph rewrite.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_amp') + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + self._run_and_report_benchmark() + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = resnet_ctl_imagenet_main.run(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet50CtlAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=MIN_TOP_1_ACCURACY, + top_1_max=MAX_TOP_1_ACCURACY, + total_batch_size=FLAGS.batch_size, + log_steps=100, + start_time_sec=start_time_sec) + + def _get_model_dir(self, folder_name): + return os.path.join(self.output_dir, folder_name) + + +class Resnet50CtlBenchmarkBase(CtlBenchmark): + """Resnet50 benchmarks.""" + + def __init__(self, output_dir=None, default_flags=None): + flag_methods = [common.define_keras_flags] + + super(Resnet50CtlBenchmarkBase, self).__init__( + output_dir=output_dir, + flag_methods=flag_methods, + default_flags=default_flags) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = resnet_ctl_imagenet_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + + # Number of logged step time entries that are excluded in performance + # report. We keep results from last 100 batches in this case. + warmup = (FLAGS.train_steps - 100) // FLAGS.log_steps + + super(Resnet50CtlBenchmarkBase, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + warmup=warmup, + start_time_sec=start_time_sec) + + def benchmark_1_gpu_no_dist_strat(self): + """Test Keras model with 1 GPU, no distribution strategy.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'off' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Test Keras model with 1 GPU.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16(self): + """Test Keras model with 1 GPU with tf.keras mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark() + + def benchmark_1_gpu_amp(self): + """Test Keras model with 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_amp') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_amp(self): + """Test Keras model with XLA and 1 GPU with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_amp') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_eager(self): + """Test Keras model with 1 GPU in pure eager mode.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_eager') + FLAGS.batch_size = 120 + FLAGS.use_tf_function = False + FLAGS.use_tf_while_loop = False + FLAGS.single_l2_loss_op = True + self._run_and_report_benchmark() + + def benchmark_1_gpu_fp16_eager(self): + """Test Keras model with 1 GPU with fp16 and pure eager mode.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'one_device' + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16_eager') + FLAGS.batch_size = 240 + FLAGS.dtype = 'fp16' + FLAGS.use_tf_function = False + FLAGS.use_tf_while_loop = False + FLAGS.single_l2_loss_op = True + self._run_and_report_benchmark() + + def benchmark_8_gpu(self): + """Test Keras model with 8 GPUs.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + FLAGS.batch_size = 128 * 8 # 8 GPUs + self._run_and_report_benchmark() + + def benchmark_8_gpu_fp16(self): + """Test Keras model with 8 GPUs with tf.keras mixed precision.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark() + + def benchmark_8_gpu_eager(self): + """Test Keras model with 8 GPUs, eager, fp32.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.use_tf_function = False + FLAGS.use_tf_while_loop = False + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_eager') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_8_gpu_eager_fp16(self): + """Test Keras model with 8 GPUs, eager, fp16.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.use_tf_function = False + FLAGS.use_tf_while_loop = False + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_eager_fp16') + FLAGS.batch_size = 128 + self._run_and_report_benchmark() + + def benchmark_8_gpu_amp(self): + """Test Keras model with 8 GPUs with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_amp') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_amp(self): + """Test Keras model with XLA and 8 GPUs with automatic mixed precision.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'mirrored' + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_amp') + FLAGS.batch_size = 256 * 8 # 8 GPUs + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def fill_report_object(self, stats): + super(Resnet50CtlBenchmarkBase, self).fill_report_object( + stats, total_batch_size=FLAGS.batch_size, log_steps=FLAGS.log_steps) + + +class Resnet50CtlBenchmarkSynth(Resnet50CtlBenchmarkBase): + """Resnet50 synthetic benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['skip_eval'] = True + def_flags['use_synthetic_data'] = True + def_flags['train_steps'] = 110 + def_flags['steps_per_loop'] = 20 + def_flags['log_steps'] = 10 + + super(Resnet50CtlBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50CtlBenchmarkReal(Resnet50CtlBenchmarkBase): + """Resnet50 real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['skip_eval'] = True + def_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + def_flags['train_steps'] = 110 + def_flags['steps_per_loop'] = 20 + def_flags['log_steps'] = 10 + + super(Resnet50CtlBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/retinanet_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/retinanet_benchmark.py new file mode 100644 index 0000000..43ef66a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/retinanet_benchmark.py @@ -0,0 +1,294 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes RetinaNet benchmarks and accuracy tests.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# pylint: disable=g-bad-import-order +import copy +import json +import os +import time + +from absl import flags +from absl import logging +from absl.testing import flagsaver +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.benchmark import bert_benchmark_utils as benchmark_utils +from official.utils.flags import core as flags_core +from official.benchmark import benchmark_wrappers +from official.vision.detection import main as detection + +TMP_DIR = os.getenv('TMPDIR') +FLAGS = flags.FLAGS + +# pylint: disable=line-too-long +COCO_TRAIN_DATA = 'gs://tf-perfzero-data/coco/train*' +COCO_EVAL_DATA = 'gs://tf-perfzero-data/coco/val*' +COCO_EVAL_JSON = 'gs://tf-perfzero-data/coco/instances_val2017.json' +RESNET_CHECKPOINT_PATH = 'gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07' +# pylint: enable=line-too-long + + +class DetectionBenchmarkBase(tf.test.Benchmark): + """Base class to hold methods common to test classes.""" + local_flags = None + + def __init__(self, output_dir=None): + self.num_gpus = 8 + + if not output_dir: + output_dir = '/tmp' + self.output_dir = output_dir + self.timer_callback = None + + def _get_model_dir(self, folder_name): + """Returns directory to store info, e.g. saved model and event log.""" + return os.path.join(self.output_dir, folder_name) + + def _setup(self): + """Sets up and resets flags before each test.""" + self.timer_callback = benchmark_utils.BenchmarkTimerCallback() + + if DetectionBenchmarkBase.local_flags is None: + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + saved_flag_values = flagsaver.save_flag_values() + DetectionBenchmarkBase.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(DetectionBenchmarkBase.local_flags) + + def _report_benchmark(self, + stats, + wall_time_sec, + min_ap, + max_ap, + train_batch_size=None): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from Detection models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + min_ap: Minimum detection AP constraint to verify correctness of the + model. + max_ap: Maximum detection AP accuracy constraint to verify correctness of + the model. + train_batch_size: Train batch size. It is needed for computing + exp_per_second. + """ + metrics = [{ + 'name': 'total_loss', + 'value': stats['total_loss'], + }] + if self.timer_callback: + metrics.append({ + 'name': 'exp_per_second', + 'value': self.timer_callback.get_examples_per_sec(train_batch_size) + }) + else: + metrics.append({ + 'name': 'exp_per_second', + 'value': 0.0, + }) + + if 'eval_metrics' in stats: + metrics.append({ + 'name': 'AP', + 'value': stats['AP'], + 'min_value': min_ap, + 'max_value': max_ap, + }) + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=stats['total_steps'], + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class RetinanetBenchmarkBase(DetectionBenchmarkBase): + """Base class to hold methods common to test classes in the module.""" + + def __init__(self, output_dir=None, **kwargs): + self.train_data_path = COCO_TRAIN_DATA + self.eval_data_path = COCO_EVAL_DATA + self.eval_json_path = COCO_EVAL_JSON + self.resnet_checkpoint_path = RESNET_CHECKPOINT_PATH + + super(RetinanetBenchmarkBase, self).__init__(output_dir=output_dir) + + def _run_detection_main(self): + """Starts detection job.""" + if self.timer_callback: + return detection.run(callbacks=[self.timer_callback]) + else: + return detection.run() + + +class RetinanetAccuracy(RetinanetBenchmarkBase): + """Accuracy test for RetinaNet model. + + Tests RetinaNet detection task model accuracy. The naming + convention of below test cases follow + `benchmark_(number of gpus)_gpu_(dataset type)` format. + """ + + def __init__(self, output_dir=TMP_DIR, **kwargs): + super(RetinanetAccuracy, self).__init__(output_dir=output_dir) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, min_ap=0.325, max_ap=0.35): + """Starts RetinaNet accuracy benchmark test.""" + + start_time_sec = time.time() + FLAGS.mode = 'train' + summary, _ = self._run_detection_main() + wall_time_sec = time.time() - start_time_sec + + FLAGS.mode = 'eval' + eval_metrics = self._run_detection_main() + summary.update(eval_metrics) + + summary['train_batch_size'] = self.params_override['train']['batch_size'] + summary['total_steps'] = self.params_override['train']['total_steps'] + super(RetinanetAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_ap=min_ap, + max_ap=max_ap, + train_batch_size=self.params_override['train']['batch_size']) + + def _setup(self): + super(RetinanetAccuracy, self)._setup() + FLAGS.strategy_type = 'mirrored' + FLAGS.model = 'retinanet' + + self.params_override = { + 'train': { + 'batch_size': 64, + 'iterations_per_loop': 100, + 'total_steps': 22500, + 'train_file_pattern': self.train_data_path, + 'checkpoint': { + 'path': self.resnet_checkpoint_path, + 'prefix': 'resnet50/' + }, + }, + 'eval': { + 'batch_size': 8, + 'eval_samples': 5000, + 'val_json_file': self.eval_json_path, + 'eval_file_pattern': self.eval_data_path, + }, + } + + @flagsaver.flagsaver + def benchmark_8_gpu_coco(self): + """Run RetinaNet model accuracy test with 8 GPUs.""" + self._setup() + params = copy.deepcopy(self.params_override) + FLAGS.params_override = json.dumps(params) + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_coco') + # Sets timer_callback to None as we do not use it now. + self.timer_callback = None + + self._run_and_report_benchmark() + + +class RetinanetBenchmarkReal(RetinanetAccuracy): + """Short benchmark performance tests for RetinaNet model. + + Tests RetinaNet performance in different GPU configurations. + The naming convention of below test cases follow + `benchmark_(number of gpus)_gpu` format. + """ + + def __init__(self, output_dir=TMP_DIR, **kwargs): + super(RetinanetBenchmarkReal, self).__init__(output_dir=output_dir) + + @flagsaver.flagsaver + def benchmark_8_gpu_coco(self): + """Run RetinaNet model accuracy test with 8 GPUs.""" + self.num_gpus = 8 + self._setup() + params = copy.deepcopy(self.params_override) + params['train']['total_steps'] = 1875 # One epoch. + # The iterations_per_loop must be one, otherwise the number of examples per + # second would be wrong. Currently only support calling callback per batch + # when each loop only runs on one batch, i.e. host loop for one step. The + # performance of this situation might be lower than the case of + # iterations_per_loop > 1. + # Related bug: b/135933080 + params['train']['iterations_per_loop'] = 1 + params['eval']['eval_samples'] = 8 + FLAGS.num_gpus = self.num_gpus + FLAGS.params_override = json.dumps(params) + FLAGS.model_dir = self._get_model_dir('real_benchmark_8_gpu_coco') + # Use negative value to avoid saving checkpoints. + FLAGS.save_checkpoint_freq = -1 + if self.timer_callback is None: + logging.error('Cannot measure performance without timer callback') + else: + self._run_and_report_benchmark() + + @flagsaver.flagsaver + def benchmark_1_gpu_coco(self): + """Run RetinaNet model accuracy test with 1 GPU.""" + self.num_gpus = 1 + self._setup() + params = copy.deepcopy(self.params_override) + params['train']['batch_size'] = 8 + params['train']['total_steps'] = 200 + params['train']['iterations_per_loop'] = 1 + params['eval']['eval_samples'] = 8 + FLAGS.num_gpus = self.num_gpus + FLAGS.params_override = json.dumps(params) + FLAGS.model_dir = self._get_model_dir('real_benchmark_1_gpu_coco') + FLAGS.strategy_type = 'one_device' + # Use negative value to avoid saving checkpoints. + FLAGS.save_checkpoint_freq = -1 + if self.timer_callback is None: + logging.error('Cannot measure performance without timer callback') + else: + self._run_and_report_benchmark() + + @flagsaver.flagsaver + def benchmark_xla_1_gpu_coco(self): + """Run RetinaNet model accuracy test with 1 GPU and XLA enabled.""" + self.num_gpus = 1 + self._setup() + params = copy.deepcopy(self.params_override) + params['train']['batch_size'] = 8 + params['train']['total_steps'] = 200 + params['train']['iterations_per_loop'] = 1 + params['eval']['eval_samples'] = 8 + FLAGS.num_gpus = self.num_gpus + FLAGS.params_override = json.dumps(params) + FLAGS.model_dir = self._get_model_dir('real_benchmark_1_gpu_coco') + FLAGS.strategy_type = 'one_device' + FLAGS.enable_xla = True + # Use negative value to avoid saving checkpoints. + FLAGS.save_checkpoint_freq = -1 + if self.timer_callback is None: + logging.error('Cannot measure performance without timer callback') + else: + self._run_and_report_benchmark() + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/shakespeare_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/shakespeare_benchmark.py new file mode 100644 index 0000000..ee42ffe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/shakespeare_benchmark.py @@ -0,0 +1,359 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Shakespeare (LSTM) benchmark and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +from absl import flags +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.benchmark.models.shakespeare import shakespeare_main +from official.utils.flags import core as flags_core +from official.utils.misc import keras_utils +from official.benchmark import benchmark_wrappers +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark + +SHAKESPEARE_TRAIN_DATA = 'shakespeare/shakespeare.txt' +TMP_DIR = os.getenv('TMPDIR') +FLAGS = flags.FLAGS + + +class ShakespeareBenchmarkBase(PerfZeroBenchmark): + """Base class for Shakespeare (LSTM) benchmark and accuracy tests.""" + + def __init__(self, output_dir=None, default_flags=None, root_data_dir=None): + super(ShakespeareBenchmarkBase, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + flag_methods=[shakespeare_main.define_flags]) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + top_1_train_min=0.91, + top_1_train_max=0.94, + warmup=1, + log_steps=100): + """Report benchmark results by writing to local protobuf file. + + Average epoch time is calculated by skipping the first epoch. This average + ignores time spent between epoch and is recorded by begin and end epoch. To + skip accuracy check set `top_1_train_min=None`. + + Args: + top_1_train_min: lowest passing value. + top_1_train_max: highest passing value. + warmup: number of entries in `timestamp_log` to ignore. + log_steps: How often the log was created for `timestamp_log`. + """ + total_batch_size = FLAGS.batch_size + metrics = [] + start_time_sec = time.time() + stats = shakespeare_main.run(FLAGS) + wall_time_sec = time.time() - start_time_sec + + if top_1_train_min: + metrics.append({'name': 'accuracy_top_1_train', + 'value': stats['history']['RecallAt1'][-1], + 'min_value': top_1_train_min, + 'max_value': top_1_train_max}) + + # Look for the time history callback which was used during keras.fit + for callback in stats['callbacks']: + if isinstance(callback, keras_utils.TimeHistory): + epoch_timings = callback.epoch_runtime_log + if len(epoch_timings) > 1: + average_time = sum(epoch_timings[1:]) / len(epoch_timings[1:]) + metrics.append({'name': 'avg_epoch_time', + 'value': average_time}) + + # First entry in timestamp_log is the start of step 1. The rest of the + # entries are the end of each step recorded. + time_log = callback.timestamp_log + elapsed = time_log[-1].timestamp - time_log[warmup].timestamp + num_examples = ( + total_batch_size * log_steps * (len(time_log) - warmup - 1)) + if elapsed > 0: + examples_per_sec = num_examples / elapsed + metrics.append({'name': 'exp_per_second', + 'value': examples_per_sec}) + + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark(iters=-1, wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class ShakespeareAccuracy(ShakespeareBenchmarkBase): + """Shakespeare accuracy tests. + + This is not an ideal test. The best we can use for the accuracy check is to + validate top_1 of the training set. At batch size 64 the top_1 training + stabilizes to ~0.92 around 40-45 epochs. + """ + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """Shakespeare accuracy tests. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + self.train_data = os.path.join(root_data_dir, SHAKESPEARE_TRAIN_DATA) + super(ShakespeareAccuracy, self).__init__( + output_dir=output_dir, root_data_dir=root_data_dir) + + def benchmark_cpu(self): + """Benchmark cpu.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + self._run_and_report_benchmark() + + def benchmark_cpu_no_ds_run_eagerly(self): + """Benchmark cpu without distribution strategies and run eagerly.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Benchmark 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_ds(self): + """Benchmark 1 gpu without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_ds_run_eagerly(self): + """Benchmark 1 gpu without distribution strategies and run eagerly.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu(self): + """Benchmark 1 gpu w/xla.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_8_gpu(self): + """Benchmark 8 gpu. + + This is test is for accuracy not scaling. The batch-size is not scaled to + the number of gpus. + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.training_data = self.train_data + FLAGS.batch_size = 64 + FLAGS.train_epochs = 43 + FLAGS.model_dir = '' + self._run_and_report_benchmark() + + +class ShakespeareKerasBenchmarkReal(ShakespeareBenchmarkBase): + """Benchmark accuracy tests.""" + + def __init__(self, output_dir=None, root_data_dir=TMP_DIR, **kwargs): + """Benchmark tests w/Keras. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + self.train_data = os.path.join(root_data_dir, SHAKESPEARE_TRAIN_DATA) + + def_flags = {} + def_flags['training_data'] = self.train_data + def_flags['model_dir'] = '' + def_flags['train_epochs'] = 4 + def_flags['log_steps'] = 50 + + super(ShakespeareKerasBenchmarkReal, self).__init__( + output_dir=output_dir, + root_data_dir=root_data_dir, + default_flags=def_flags) + + def benchmark_cpu(self): + """Benchmark cpu.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.batch_size = 64 + self._run_and_report_benchmark() + + def benchmark_cpu_no_ds_run_eagerly(self): + """Benchmark cpu without distribution strategy and run eagerly.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.batch_size = 64 + FLAGS.distribution_strategy = 'off' + FLAGS.run_eagerly = True + self._run_and_report_benchmark() + + def benchmark_cpu_no_ds(self): + """Benchmark cpu without distribution strategy.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.batch_size = 64 + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_cpu_no_ds_force_v2(self): + """Benchmark cpu no ds, and force v2.""" + self._setup() + FLAGS.num_gpus = 0 + FLAGS.batch_size = 64 + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_1_gpu(self): + """Benchmark 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_cudnn(self): + """Benchmark 1 gpu with CuDNN disabled.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + FLAGS.cudnn = False + FLAGS.enable_eager = keras_utils.is_v2_0() + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_ds(self): + """Benchmark 1 gpu without distribution strategies.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_1_gpu_no_ds_run_eagerly(self): + """Benchmark 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + FLAGS.run_eagerly = True + FLAGS.distribution_strategy = 'off' + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu(self): + """Benchmark 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_xla_1_gpu_no_cudnn(self): + """Benchmark 1 gpu w/xla and CuDNN disabled.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 + FLAGS.cudnn = False + FLAGS.enable_eager = keras_utils.is_v2_0() + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_8_gpu(self): + """Benchmark 8 gpu.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = 64 * 8 + FLAGS.log_steps = 10 + self._run_and_report_benchmark() + + def benchmark_8_gpu_no_cudnn(self): + """Benchmark 8 gpu with CuDNN disabled.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = 64 * 8 + FLAGS.log_steps = 10 + FLAGS.cudnn = False + FLAGS.enable_eager = keras_utils.is_v2_0() + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu(self): + """Benchmark 8 gpu w/xla.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = 64 * 8 + FLAGS.log_steps = 10 + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def benchmark_xla_8_gpu_no_cudnn(self): + """Benchmark 8 gpu w/xla and CuDNN disabled.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = 64 * 8 + FLAGS.log_steps = 10 + FLAGS.cudnn = False + FLAGS.enable_eager = keras_utils.is_v2_0() + FLAGS.enable_xla = True + self._run_and_report_benchmark() + + def _run_and_report_benchmark(self): + """Run and report benchmark.""" + super(ShakespeareKerasBenchmarkReal, self)._run_and_report_benchmark( + top_1_train_min=None, log_steps=FLAGS.log_steps) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/tfhub_memory_usage_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/tfhub_memory_usage_benchmark.py new file mode 100644 index 0000000..7f50ecf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/tfhub_memory_usage_benchmark.py @@ -0,0 +1,69 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a memory usage benchmark for a Tensorflow Hub model. + +Loads a SavedModel and records memory usage. +""" +import functools +import time + +from absl import flags +import tensorflow as tf +import tensorflow_hub as hub + +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark + +FLAGS = flags.FLAGS + + +class TfHubMemoryUsageBenchmark(PerfZeroBenchmark): + """A benchmark measuring memory usage for a given TF Hub SavedModel.""" + + def __init__(self, + hub_model_handle_list=None, + output_dir=None, + default_flags=None, + root_data_dir=None, + **kwargs): + super(TfHubMemoryUsageBenchmark, self).__init__( + output_dir=output_dir, default_flags=default_flags, **kwargs) + if hub_model_handle_list: + for hub_model_handle in hub_model_handle_list.split(';'): + # Converts a model handle of the form + # https://tfhub.dev/google/nnlm-en-dim128/1 to valid python method name + # like google_nnlm_en_dim128_1. + hub_model_method_name = hub_model_handle.replace( + 'https://tfhub.dev', + '').replace('/', '_').replace('-', '_').strip('_') + setattr( + self, 'benchmark_' + hub_model_method_name, + functools.partial(self.benchmark_memory_usage, hub_model_handle)) + + def benchmark_memory_usage( + self, hub_model_handle='https://tfhub.dev/google/nnlm-en-dim128/1'): + start_time_sec = time.time() + self.load_model(hub_model_handle) + wall_time_sec = time.time() - start_time_sec + + metrics = [] + self.report_benchmark(iters=-1, wall_time=wall_time_sec, metrics=metrics) + + def load_model(self, hub_model_handle): + """Loads a TF Hub module.""" + hub.load(hub_model_handle) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/transformer_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/transformer_benchmark.py new file mode 100644 index 0000000..0b3bc8a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/transformer_benchmark.py @@ -0,0 +1,681 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Transformer w/Keras benchmark and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +from absl import flags +import tensorflow as tf +from official.benchmark import benchmark_wrappers +from official.benchmark.perfzero_benchmark import PerfZeroBenchmark +from official.nlp.transformer import misc +from official.nlp.transformer import transformer_main as transformer_main +from official.utils.flags import core as flags_core + +TRANSFORMER_EN2DE_DATA_DIR_NAME = 'wmt32k-en2de-official' +EN2DE_2014_BLEU_DATA_DIR_NAME = 'newstest2014' +FLAGS = flags.FLAGS +TMP_DIR = os.getenv('TMPDIR') + + +class TransformerBenchmark(PerfZeroBenchmark): + """Methods common to executing transformer w/keras tests. + + Code under test for the Transformer Keras models report the same data and + require the same FLAG setup. + """ + + def __init__(self, output_dir=None, default_flags=None, root_data_dir=None, + flag_methods=None): + root_data_dir = root_data_dir if root_data_dir else '' + + self.train_data_dir = os.path.join(root_data_dir, + TRANSFORMER_EN2DE_DATA_DIR_NAME) + + self.vocab_file = os.path.join(root_data_dir, + TRANSFORMER_EN2DE_DATA_DIR_NAME, + 'vocab.ende.32768') + + self.bleu_source = os.path.join(root_data_dir, + EN2DE_2014_BLEU_DATA_DIR_NAME, + 'newstest2014.en') + + self.bleu_ref = os.path.join(root_data_dir, + EN2DE_2014_BLEU_DATA_DIR_NAME, + 'newstest2014.de') + + if default_flags is None: + default_flags = {} + default_flags['data_dir'] = self.train_data_dir + default_flags['vocab_file'] = self.vocab_file + + super(TransformerBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + flag_methods=flag_methods) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + bleu_max=None, + bleu_min=None, + log_steps=None, + total_batch_size=None, + warmup=1): + """Report benchmark results by writing to local protobuf file. + + Args: + bleu_max: highest passing level for bleu score. + bleu_min: lowest passing level for bleu score. + log_steps: How often the log was created for stats['step_timestamp_log']. + total_batch_size: Global batch-size. + warmup: number of entries in stats['step_timestamp_log'] to ignore. + """ + start_time_sec = time.time() + task = transformer_main.TransformerTask(FLAGS) + stats = task.train() + wall_time_sec = time.time() - start_time_sec + + metrics = [] + if 'bleu_uncased' in stats: + if 'bleu_uncased_history' in stats: + bleu_uncased_best = max(stats['bleu_uncased_history'], + key=lambda x: x[1]) + metrics.append({'name': 'bleu_uncased', + 'value': bleu_uncased_best[1], + 'min_value': bleu_min, + 'max_value': bleu_max}) + metrics.append({'name': 'bleu_best_score_iteration', + 'value': bleu_uncased_best[0]}) + metrics.append({'name': 'bleu_uncased_last', + 'value': stats['bleu_uncased']}) + else: + metrics.append({'name': 'bleu_uncased', + 'value': stats['bleu_uncased'], + 'min_value': bleu_min, + 'max_value': bleu_max}) + + if (warmup and 'step_timestamp_log' in stats and + len(stats['step_timestamp_log']) > warmup): + # first entry in the time_log is start of step 1. The rest of the + # entries are the end of each step recorded + time_log = stats['step_timestamp_log'] + elapsed = time_log[-1].timestamp - time_log[warmup].timestamp + num_examples = ( + total_batch_size * log_steps * (len(time_log) - warmup - 1)) + examples_per_sec = num_examples / elapsed + metrics.append({'name': 'exp_per_second', + 'value': examples_per_sec}) + + if 'avg_exp_per_second' in stats: + metrics.append({'name': 'avg_exp_per_second', + 'value': stats['avg_exp_per_second']}) + + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark(iters=-1, wall_time=wall_time_sec, metrics=metrics, + extras={'flags': flags_str}) + + +class TransformerBaseKerasAccuracy(TransformerBenchmark): + """Benchmark accuracy tests for Transformer Base model w/ Keras.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """Benchmark accuracy tests for Transformer Base model w/ Keras. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [misc.define_transformer_flags] + + super(TransformerBaseKerasAccuracy, self).__init__( + output_dir=output_dir, root_data_dir=root_data_dir, + flag_methods=flag_methods) + + def benchmark_1_gpu(self): + """Benchmark 1 gpu. + + The paper uses 8 GPUs and a much larger effective batch size, this is will + not converge to the 27.3 BLEU (uncased) SOTA. + """ + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'base' + FLAGS.batch_size = 2048 + FLAGS.train_steps = 1000 + FLAGS.steps_between_evals = 500 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + # These bleu scores are based on test runs after at this limited + # number of steps and batch size after verifying SOTA at 8xV100s. + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=25.3, + bleu_max=26) + + def benchmark_1_gpu_static_batch(self): + """Benchmark 1 gpu with static_batch. + + The paper uses 8 GPUs and a much larger effective batch size, this is will + not converge to the 27.3 BLEU (uncased) SOTA. + """ + self._setup() + FLAGS.num_gpus = 1 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'base' + FLAGS.batch_size = 4096 + FLAGS.train_steps = 100000 + FLAGS.steps_between_evals = 5000 + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_static_batch') + # These bleu scores are based on test runs after at this limited + # number of steps and batch size after verifying SOTA at 8xV100s. + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=25.3, + bleu_max=26) + + def benchmark_8_gpu(self): + """Benchmark 8 gpu. + + Should converge to 27.3 BLEU (uncased). This has not been confirmed yet. + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'base' + FLAGS.batch_size = 4096*8 + FLAGS.train_steps = 100000 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=27, + bleu_max=28) + + def benchmark_8_gpu_static_batch(self): + """Benchmark 8 gpu. + + Should converge to 27.3 BLEU (uncased). This has not been confirmed yet. + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'base' + FLAGS.batch_size = 4096*8 + FLAGS.train_steps = 100000 + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.steps_between_evals = 5000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_static_batch') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=27, + bleu_max=28) + + +class TransformerBigKerasAccuracy(TransformerBenchmark): + """Benchmark accuracy tests for Transformer Big model w/ Keras.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """Benchmark accuracy tests for Transformer Big model w/ Keras. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [misc.define_transformer_flags] + + super(TransformerBigKerasAccuracy, self).__init__( + output_dir=output_dir, root_data_dir=root_data_dir, + flag_methods=flag_methods) + + def benchmark_8_gpu(self): + """Benchmark 8 gpu. + + Over 6 runs with eval every 20K steps the average highest value was 28.195 + (bleu uncased). 28.424 was the highest and 27.96 the lowest. The values are + the highest value seen during a run and occurred at a median of iteration 9. + Iterations are not epochs, an iteration is a number of steps between evals. + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.train_steps = 20000 * 12 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=27.9, + bleu_max=29.2) + + def benchmark_8_gpu_static_batch(self): + """Benchmark 8 gpu. + + Should converge to 28.4 BLEU (uncased). This has not be verified yet." + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.train_steps = 20000 * 12 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_static_batch') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=28, + bleu_max=29.2) + + def benchmark_8_gpu_fp16(self): + """Benchmark 8 gpu with dynamic batch and fp16. + + Over 6 runs with eval every 20K steps the average highest value was 28.247 + (bleu uncased). 28.424 was the highest and 28.09 the lowest. The values are + the highest value seen during a run and occurred at a median of iteration + 11. While this could be interpreted as worse than FP32, if looking at the + first iteration at which 28 is passed FP16 performs equal and possibly + better. Although not part of the initial test runs, the highest value + recorded with the arguments below was 28.9 at iteration 12. Iterations are + not epochs, an iteration is a number of steps between evals. + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.train_steps = 20000 * 12 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=28, + bleu_max=29.2) + + def benchmark_8_gpu_fp16_amp(self): + """Benchmark 8 gpu with dynamic batch and fp16 with automatic mixed precision. + + Should converge to 28.4 BLEU (uncased). This has not be verified yet." + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.train_steps = 20000 * 12 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16_amp') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=28, + bleu_max=29) + + def benchmark_8_gpu_static_batch_fp16(self): + """Benchmark 8 gpu with static batch and fp16. + + Should converge to 28.4 BLEU (uncased). This has not be verified yet." + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.train_steps = 400000 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_static_batch_fp16') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=28, + bleu_max=29.2) + + def benchmark_xla_8_gpu_static_batch_fp16(self): + """Benchmark 8 gpu with static batch, XLA, and FP16. + + Should converge to 28.4 BLEU (uncased). This has not be verified yet." + """ + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.enable_xla = True + FLAGS.data_dir = self.train_data_dir + FLAGS.vocab_file = self.vocab_file + # Sets values directly to avoid validation check. + FLAGS['bleu_source'].value = self.bleu_source + FLAGS['bleu_ref'].value = self.bleu_ref + FLAGS.param_set = 'big' + FLAGS.batch_size = 3072*8 + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.train_steps = 400000 + FLAGS.steps_between_evals = 20000 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_xla_8_gpu_static_batch_fp16') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + bleu_min=28, + bleu_max=29.2) + + +class TransformerKerasBenchmark(TransformerBenchmark): + """Benchmarks for Transformer (Base and Big) using Keras.""" + + def __init__(self, output_dir=None, default_flags=None, + root_data_dir=None, batch_per_gpu=4096): + """Initialize. + + Args: + output_dir: Based directory for saving artifacts, e.g. checkpoints. + default_flags: default flags to use for all tests. + root_data_dir: root directory for data, e.g. training. + batch_per_gpu: batch size to use per gpu. + """ + flag_methods = [misc.define_transformer_flags] + self.batch_per_gpu = batch_per_gpu + + super(TransformerKerasBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + root_data_dir=root_data_dir, + flag_methods=flag_methods) + + def benchmark_1_gpu_no_dist_strat(self): + """Benchmark 1 gpu without distribution strategy.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'off' + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu_no_dist_strat_static_batch(self): + """Benchmark 1 gpu without distribution strategy with static batch.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'off' + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_ds_sb') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu(self): + """Benchmark 1 gpu.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu_fp16(self): + """Benchmark 1 gpu FP16.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_fp16') + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_1_gpu(self): + """Benchmark 1 gpu w/xla.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu') + FLAGS.enable_xla = True + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_1_gpu_fp16(self): + """Benchmark 1 gpu w/xla and FP16.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_fp16') + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu_static_batch(self): + """Benchmark 1 gpu with static batch.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_static_batch') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_1_gpu_static_batch(self): + """Benchmark 1 gpu with static batch w/xla.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir('benchmark_xla_1_gpu_static_batch') + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.enable_xla = True + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_1_gpu_static_batch_fp16(self): + """Benchmark 1 gpu with static batch FP16.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir( + 'benchmark_1_gpu_static_batch_fp16') + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_1_gpu_static_batch_fp16(self): + """Benchmark 1 gpu with static batch w/xla and FP16.""" + self._setup() + FLAGS.num_gpus = 1 + FLAGS.batch_size = self.batch_per_gpu + FLAGS.model_dir = self._get_model_dir( + 'benchmark_xla_1_gpu_static_batch_fp16') + FLAGS.static_batch = True + FLAGS.max_length = 64 + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_8_gpu(self): + """Benchmark 8 gpu.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_8_gpu_fp16(self): + """Benchmark 8 gpu FP16.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_fp16') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_8_gpu(self): + """Benchmark 8 gpu w/xla.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.enable_xla = True + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_8_gpu_fp16(self): + """Benchmark 8 gpu w/xla and FP16.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_fp16') + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_8_gpu_static_batch(self): + """Benchmark 8 gpu with static batch.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_static_batch') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_8_gpu_static_batch_fp16(self): + """Benchmark 8 gpu with static batch FP16.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.dtype = 'fp16' + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_8_gpu_static_batch_fp16') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_8_gpu_static_batch(self): + """Benchmark 8 gpu with static batch w/xla.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.enable_xla = True + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir('benchmark_xla_8_gpu_static_batch') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + def benchmark_xla_8_gpu_static_batch_fp16(self): + """Benchmark 8 gpu with static batch w/xla and FP16.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.enable_xla = True + FLAGS.dtype = 'fp16' + FLAGS.batch_size = self.batch_per_gpu * 8 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_xla_8_gpu_static_batch_fp16') + FLAGS.static_batch = True + FLAGS.max_length = 64 + self._run_and_report_benchmark(total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps) + + +class TransformerBaseKerasBenchmarkReal(TransformerKerasBenchmark): + """Transformer based version real data benchmark tests.""" + + def __init__(self, output_dir=TMP_DIR, root_data_dir=TMP_DIR, **kwargs): + def_flags = {} + def_flags['param_set'] = 'base' + def_flags['train_steps'] = 50 + def_flags['log_steps'] = 10 + + super(TransformerBaseKerasBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags, + root_data_dir=root_data_dir, batch_per_gpu=4096) + + +class TransformerBigKerasBenchmarkReal(TransformerKerasBenchmark): + """Transformer based version real data benchmark tests.""" + + def __init__(self, output_dir=TMP_DIR, root_data_dir=TMP_DIR, **kwargs): + def_flags = {} + def_flags['param_set'] = 'big' + def_flags['train_steps'] = 50 + def_flags['log_steps'] = 10 + + super(TransformerBigKerasBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags, + root_data_dir=root_data_dir, batch_per_gpu=3072) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/xlnet_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/xlnet_benchmark.py new file mode 100644 index 0000000..aff617e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/benchmark/xlnet_benchmark.py @@ -0,0 +1,216 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes XLNet benchmarks and accuracy tests.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import time + +# pylint: disable=g-bad-import-order +from absl import flags +from absl.testing import flagsaver +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.benchmark import bert_benchmark_utils as benchmark_utils +from official.nlp.xlnet import run_classifier +from official.nlp.xlnet import run_squad +from official.benchmark import benchmark_wrappers + + +# pylint: disable=line-too-long +PRETRAINED_CHECKPOINT_PATH = 'gs://cloud-tpu-checkpoints/xlnet/large/xlnet_model-1' +CLASSIFIER_TRAIN_DATA_PATH = 'gs://tf-perfzero-data/xlnet/imdb/spiece.model.len-512.train.tf_record' +CLASSIFIER_EVAL_DATA_PATH = 'gs://tf-perfzero-data/xlnet/imdb/spiece.model.len-512.dev.eval.tf_record' +SQUAD_DATA_PATH = 'gs://tf-perfzero-data/xlnet/squadv2_cased/' +# pylint: enable=line-too-long + +FLAGS = flags.FLAGS + + +class XLNetBenchmarkBase(benchmark_utils.BertBenchmarkBase): + """Base class to hold methods common to test classes in the module.""" + + def __init__(self, output_dir=None): + super(XLNetBenchmarkBase, self).__init__(output_dir) + self.num_epochs = None + self.num_steps_per_epoch = None + + @flagsaver.flagsaver + def _run_xlnet_classifier(self): + """Starts XLNet classification task.""" + run_classifier.main(unused_argv=None) + + @flagsaver.flagsaver + def _run_xlnet_squad(self): + """Starts XLNet classification task.""" + run_squad.main(unused_argv=None) + + +class XLNetClassifyAccuracy(XLNetBenchmarkBase): + """Short accuracy test for XLNet classifier model. + + Tests XLNet classification task model accuracy. The naming + convention of below test cases follow + `benchmark_(number of gpus)_gpu_(dataset type)` format. + """ + + def __init__(self, output_dir=None, **kwargs): + self.train_data_path = CLASSIFIER_TRAIN_DATA_PATH + self.eval_data_path = CLASSIFIER_EVAL_DATA_PATH + self.pretrained_checkpoint_path = PRETRAINED_CHECKPOINT_PATH + + super(XLNetClassifyAccuracy, self).__init__(output_dir=output_dir) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + training_summary_path, + min_accuracy=0.95, + max_accuracy=0.97): + """Starts XLNet accuracy benchmark test.""" + + start_time_sec = time.time() + self._run_xlnet_classifier() + wall_time_sec = time.time() - start_time_sec + + with tf.io.gfile.GFile(training_summary_path, 'rb') as reader: + summary = json.loads(reader.read().decode('utf-8')) + + super(XLNetClassifyAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=min_accuracy, + max_accuracy=max_accuracy) + + def _setup(self): + super(XLNetClassifyAccuracy, self)._setup() + FLAGS.test_data_size = 25024 + FLAGS.train_batch_size = 16 + FLAGS.seq_len = 512 + FLAGS.mem_len = 0 + FLAGS.n_layer = 24 + FLAGS.d_model = 1024 + FLAGS.d_embed = 1024 + FLAGS.n_head = 16 + FLAGS.d_head = 64 + FLAGS.d_inner = 4096 + FLAGS.untie_r = True + FLAGS.n_class = 2 + FLAGS.ff_activation = 'gelu' + FLAGS.strategy_type = 'mirror' + FLAGS.learning_rate = 2e-5 + FLAGS.train_steps = 4000 + FLAGS.warmup_steps = 500 + FLAGS.iterations = 200 + FLAGS.bi_data = False + FLAGS.init_checkpoint = self.pretrained_checkpoint_path + FLAGS.train_tfrecord_path = self.train_data_path + FLAGS.test_tfrecord_path = self.eval_data_path + + def benchmark_8_gpu_imdb(self): + """Run XLNet model accuracy test with 8 GPUs.""" + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_imdb') + # Sets timer_callback to None as we do not use it now. + self.timer_callback = None + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + +class XLNetSquadAccuracy(XLNetBenchmarkBase): + """Short accuracy test for XLNet squad model. + + Tests XLNet squad task model accuracy. The naming + convention of below test cases follow + `benchmark_(number of gpus)_gpu_(dataset type)` format. + """ + + def __init__(self, output_dir=None, **kwargs): + self.train_data_path = SQUAD_DATA_PATH + self.predict_file = os.path.join(SQUAD_DATA_PATH, "dev-v2.0.json") + self.test_data_path = os.path.join(SQUAD_DATA_PATH, "12048.eval.tf_record") + self.spiece_model_file = os.path.join(SQUAD_DATA_PATH, "spiece.cased.model") + self.pretrained_checkpoint_path = PRETRAINED_CHECKPOINT_PATH + + super(XLNetSquadAccuracy, self).__init__(output_dir=output_dir) + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self, + training_summary_path, + min_accuracy=87.0, + max_accuracy=89.0): + """Starts XLNet accuracy benchmark test.""" + + start_time_sec = time.time() + self._run_xlnet_squad() + wall_time_sec = time.time() - start_time_sec + + with tf.io.gfile.GFile(training_summary_path, 'rb') as reader: + summary = json.loads(reader.read().decode('utf-8')) + + super(XLNetSquadAccuracy, self)._report_benchmark( + stats=summary, + wall_time_sec=wall_time_sec, + min_accuracy=min_accuracy, + max_accuracy=max_accuracy) + + def _setup(self): + super(XLNetSquadAccuracy, self)._setup() + FLAGS.train_batch_size = 16 + FLAGS.seq_len = 512 + FLAGS.mem_len = 0 + FLAGS.n_layer = 24 + FLAGS.d_model = 1024 + FLAGS.d_embed = 1024 + FLAGS.n_head = 16 + FLAGS.d_head = 64 + FLAGS.d_inner = 4096 + FLAGS.untie_r = True + FLAGS.ff_activation = 'gelu' + FLAGS.strategy_type = 'mirror' + FLAGS.learning_rate = 3e-5 + FLAGS.train_steps = 8000 + FLAGS.warmup_steps = 1000 + FLAGS.iterations = 1000 + FLAGS.bi_data = False + FLAGS.init_checkpoint = self.pretrained_checkpoint_path + FLAGS.train_tfrecord_path = self.train_data_path + FLAGS.test_tfrecord_path = self.test_data_path + FLAGS.spiece_model_file = self.spiece_model_file + FLAGS.predict_file = self.predict_file + FLAGS.adam_epsilon=1e-6 + FLAGS.lr_layer_decay_rate=0.75 + + def benchmark_8_gpu_squadv2(self): + """Run XLNet model squad v2 accuracy test with 8 GPUs.""" + self._setup() + FLAGS.model_dir = self._get_model_dir('benchmark_8_gpu_squadv2') + FLAGS.predict_dir = FLAGS.model_dir + # Sets timer_callback to None as we do not use it now. + self.timer_callback = None + + summary_path = os.path.join(FLAGS.model_dir, + 'summaries/training_summary.txt') + self._run_and_report_benchmark(summary_path) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/colab/bert.ipynb b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/colab/bert.ipynb new file mode 100644 index 0000000..88c92dd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/colab/bert.ipynb @@ -0,0 +1,383 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "How-to Guide: Using a PIP package for fine-tuning a BERT model", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "5T_-iFRIqliG", + "colab_type": "text" + }, + "source": [ + "## How-to Guide: Using a PIP package for fine-tuning a BERT model\n", + "\n", + "Author: [Chen Chen](https://github.com/chenGitHuber)\n", + "\n", + "In this example, we will work through fine-tuning a BERT model using the tensorflow-models PIP package." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mY1vX5VAq4SS", + "colab_type": "text" + }, + "source": [ + "## License\n", + "\n", + "Copyright 2020 The TensorFlow Authors. All Rights Reserved.\n", + "\n", + "Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "you may not use this file except in compliance with the License.\n", + "You may obtain a copy of the License at\n", + "\n", + " http://www.apache.org/licenses/LICENSE-2.0\n", + "\n", + "Unless required by applicable law or agreed to in writing, software\n", + "distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "See the License for the specific language governing permissions and\n", + "limitations under the License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XV3k63bt0ihl", + "colab_type": "text" + }, + "source": [ + "## Learning objectives\n", + "\n", + "In this Colab notebook, you will learn how to fine-tune a BERT model using the TensorFlow Model Garden PIP package." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MHA-RWherfG4", + "colab_type": "text" + }, + "source": [ + "## Enable the GPU acceleration\n", + "Please enable GPU for better performance.\n", + "* Navigate to Edit 🡒 Notebook settings\n", + "* Select GPU from the \"Hardware Accelerator\" drop-down list\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "l2B4N5Djrs2l", + "colab_type": "text" + }, + "source": [ + "## Install the Model Garden PIP package\n", + "\n", + "Install the Model Garden PIP package (tf-models-nightly) and other necessary PIP packages." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VMYZDly6rx97", + "colab_type": "code", + "outputId": "146956ab-4568-4de6-c78e-cf25f115a5a8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "source": [ + "pip install tf-models-nightly" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting tf-models-nightly\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/bd/7c/1390d4e05d4d370e91d32dd9700d3a462dbc560c7f4e95a6477592b17def/tf_models_nightly-2.2.0.dev20200326-py2.py3-none-any.whl (710kB)\n", + "\u001b[K |████████████████████████████████| 716kB 2.8MB/s \n", + "\u001b[?25hRequirement already satisfied: scipy>=0.19.1 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.4.1)\n", + "Collecting opencv-python-headless\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/0b/23/5f10b30a48b218a4884bc84188c14381ac71288b210f6f8079a54f7a05e8/opencv_python_headless-4.2.0.32-cp36-cp36m-manylinux1_x86_64.whl (21.6MB)\n", + "\u001b[K |████████████████████████████████| 21.6MB 1.3MB/s \n", + "\u001b[?25hRequirement already satisfied: tensorflow-hub>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.7.0)\n", + "Requirement already satisfied: typing in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (3.6.6)\n", + "Collecting tensorflow-model-optimization>=0.2.1\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/8f/c4/4c3d011e432bd9c19f0323f7da7d3f783402615e4c3b5a98416c7da9cb05/tensorflow_model_optimization-0.2.1-py2.py3-none-any.whl (93kB)\n", + "\u001b[K |████████████████████████████████| 102kB 10.2MB/s \n", + "\u001b[?25hRequirement already satisfied: numpy>=1.15.4 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.18.2)\n", + "Requirement already satisfied: pandas>=0.22.0 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.25.3)\n", + "Requirement already satisfied: gin-config in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.3.0)\n", + "Requirement already satisfied: google-cloud-bigquery>=0.31.0 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.21.0)\n", + "Collecting mlperf-compliance==0.0.10\n", + " Downloading https://files.pythonhosted.org/packages/f4/08/f2febd8cbd5c9371f7dab311e90400d83238447ba7609b3bf0145b4cb2a2/mlperf_compliance-0.0.10-py3-none-any.whl\n", + "Requirement already satisfied: kaggle>=1.3.9 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.5.6)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.12.0)\n", + "Requirement already satisfied: google-api-python-client>=1.6.7 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (1.7.12)\n", + "Requirement already satisfied: tensorflow-addons in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.8.3)\n", + "Requirement already satisfied: psutil>=5.4.3 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (5.4.8)\n", + "Requirement already satisfied: tensorflow-datasets in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (2.1.0)\n", + "Collecting sentencepiece\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/74/f4/2d5214cbf13d06e7cb2c20d84115ca25b53ea76fa1f0ade0e3c9749de214/sentencepiece-0.1.85-cp36-cp36m-manylinux1_x86_64.whl (1.0MB)\n", + "\u001b[K |████████████████████████████████| 1.0MB 58.3MB/s \n", + "\u001b[?25hCollecting tf-nightly\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/39/1c/4408b4c4b0d8008a7de62162e35089d59d19cc7543cfd1b23a70121f3086/tf_nightly-2.2.0.dev20200325-cp36-cp36m-manylinux2010_x86_64.whl (516.1MB)\n", + "\u001b[K |████████████████████████████████| 516.1MB 21kB/s \n", + "\u001b[?25hCollecting py-cpuinfo>=3.3.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/42/60/63f28a5401da733043abe7053e7d9591491b4784c4f87c339bf51215aa0a/py-cpuinfo-5.0.0.tar.gz (82kB)\n", + "\u001b[K |████████████████████████████████| 92kB 13.7MB/s \n", + "\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (7.0.0)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (3.13)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (3.2.1)\n", + "Requirement already satisfied: dataclasses in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.7)\n", + "Requirement already satisfied: Cython in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (0.29.15)\n", + "Requirement already satisfied: oauth2client>=4.1.2 in /usr/local/lib/python3.6/dist-packages (from tf-models-nightly) (4.1.3)\n", + "Requirement already satisfied: protobuf>=3.4.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-hub>=0.6.0->tf-models-nightly) (3.10.0)\n", + "Collecting enum34~=1.1\n", + " Downloading https://files.pythonhosted.org/packages/63/f6/ccb1c83687756aeabbf3ca0f213508fcfb03883ff200d201b3a4c60cedcc/enum34-1.1.10-py3-none-any.whl\n", + "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22.0->tf-models-nightly) (2.8.1)\n", + "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22.0->tf-models-nightly) (2018.9)\n", + "Requirement already satisfied: google-resumable-media!=0.4.0,<0.5.0dev,>=0.3.1 in /usr/local/lib/python3.6/dist-packages (from google-cloud-bigquery>=0.31.0->tf-models-nightly) (0.4.1)\n", + "Requirement already satisfied: google-cloud-core<2.0dev,>=1.0.3 in /usr/local/lib/python3.6/dist-packages (from google-cloud-bigquery>=0.31.0->tf-models-nightly) (1.0.3)\n", + "Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from kaggle>=1.3.9->tf-models-nightly) (1.24.3)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.6/dist-packages (from kaggle>=1.3.9->tf-models-nightly) (2019.11.28)\n", + "Requirement already satisfied: python-slugify in /usr/local/lib/python3.6/dist-packages (from kaggle>=1.3.9->tf-models-nightly) (4.0.0)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from kaggle>=1.3.9->tf-models-nightly) (4.38.0)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from kaggle>=1.3.9->tf-models-nightly) (2.21.0)\n", + "Requirement already satisfied: google-auth-httplib2>=0.0.3 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.6.7->tf-models-nightly) (0.0.3)\n", + "Requirement already satisfied: httplib2<1dev,>=0.17.0 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.6.7->tf-models-nightly) (0.17.0)\n", + "Requirement already satisfied: uritemplate<4dev,>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.6.7->tf-models-nightly) (3.0.1)\n", + "Requirement already satisfied: google-auth>=1.4.1 in /usr/local/lib/python3.6/dist-packages (from google-api-python-client>=1.6.7->tf-models-nightly) (1.7.2)\n", + "Requirement already satisfied: typeguard in /usr/local/lib/python3.6/dist-packages (from tensorflow-addons->tf-models-nightly) (2.7.1)\n", + "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (0.16.0)\n", + "Requirement already satisfied: absl-py in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (0.9.0)\n", + "Requirement already satisfied: wrapt in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (1.12.1)\n", + "Requirement already satisfied: promise in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (2.3)\n", + "Requirement already satisfied: attrs>=18.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (19.3.0)\n", + "Requirement already satisfied: termcolor in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (1.1.0)\n", + "Requirement already satisfied: tensorflow-metadata in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (0.21.1)\n", + "Requirement already satisfied: dill in /usr/local/lib/python3.6/dist-packages (from tensorflow-datasets->tf-models-nightly) (0.3.1.1)\n", + "Requirement already satisfied: gast==0.3.3 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (0.3.3)\n", + "Requirement already satisfied: wheel>=0.26; python_version >= \"3\" in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (0.34.2)\n", + "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (1.27.2)\n", + "Collecting tb-nightly<2.3.0a0,>=2.2.0a0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/52/b6/aa559ea9edbc6129a64ff752dbf6567bcd62fba34566defca00fdff4345e/tb_nightly-2.2.0a20200324-py3-none-any.whl (2.8MB)\n", + "\u001b[K |████████████████████████████████| 2.8MB 51.9MB/s \n", + "\u001b[?25hRequirement already satisfied: h5py<2.11.0,>=2.10.0 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (2.10.0)\n", + "Collecting tf-estimator-nightly\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/bf/eb/0d6c06d1181cd9b52d7c82535073887d68d224f3dbeeb00adefd04762a9c/tf_estimator_nightly-2.3.0.dev2020032501-py2.py3-none-any.whl (455kB)\n", + "\u001b[K |████████████████████████████████| 460kB 53.5MB/s \n", + "\u001b[?25hRequirement already satisfied: google-pasta>=0.1.8 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (0.2.0)\n", + "Requirement already satisfied: astunparse==1.6.3 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (1.6.3)\n", + "Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (3.2.0)\n", + "Requirement already satisfied: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tf-nightly->tf-models-nightly) (1.1.0)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->tf-models-nightly) (2.4.6)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->tf-models-nightly) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->tf-models-nightly) (0.10.0)\n", + "Requirement already satisfied: pyasn1-modules>=0.0.5 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.1.2->tf-models-nightly) (0.2.8)\n", + "Requirement already satisfied: rsa>=3.1.4 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.1.2->tf-models-nightly) (4.0)\n", + "Requirement already satisfied: pyasn1>=0.1.7 in /usr/local/lib/python3.6/dist-packages (from oauth2client>=4.1.2->tf-models-nightly) (0.4.8)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from protobuf>=3.4.0->tensorflow-hub>=0.6.0->tf-models-nightly) (46.0.0)\n", + "Requirement already satisfied: google-api-core<2.0.0dev,>=1.14.0 in /usr/local/lib/python3.6/dist-packages (from google-cloud-core<2.0dev,>=1.0.3->google-cloud-bigquery>=0.31.0->tf-models-nightly) (1.16.0)\n", + "Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.6/dist-packages (from python-slugify->kaggle>=1.3.9->tf-models-nightly) (1.3)\n", + "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle>=1.3.9->tf-models-nightly) (2.8)\n", + "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->kaggle>=1.3.9->tf-models-nightly) (3.0.4)\n", + "Requirement already satisfied: cachetools<3.2,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from google-auth>=1.4.1->google-api-python-client>=1.6.7->tf-models-nightly) (3.1.1)\n", + "Requirement already satisfied: googleapis-common-protos in /usr/local/lib/python3.6/dist-packages (from tensorflow-metadata->tensorflow-datasets->tf-models-nightly) (1.51.0)\n", + "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<2.3.0a0,>=2.2.0a0->tf-nightly->tf-models-nightly) (3.2.1)\n", + "Collecting tensorboard-plugin-wit>=1.6.0\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/41/ec/3da49289b93963bd8b32d29ed108f1809436ff3d9cd4e29c90bac4a7292f/tensorboard_plugin_wit-1.6.0.post2-py3-none-any.whl (775kB)\n", + "\u001b[K |████████████████████████████████| 778kB 43.8MB/s \n", + "\u001b[?25hRequirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<2.3.0a0,>=2.2.0a0->tf-nightly->tf-models-nightly) (0.4.1)\n", + "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<2.3.0a0,>=2.2.0a0->tf-nightly->tf-models-nightly) (1.0.0)\n", + "Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from google-auth-oauthlib<0.5,>=0.4.1->tb-nightly<2.3.0a0,>=2.2.0a0->tf-nightly->tf-models-nightly) (1.3.0)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.6/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tb-nightly<2.3.0a0,>=2.2.0a0->tf-nightly->tf-models-nightly) (3.1.0)\n", + "Building wheels for collected packages: py-cpuinfo\n", + " Building wheel for py-cpuinfo (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for py-cpuinfo: filename=py_cpuinfo-5.0.0-cp36-none-any.whl size=18684 sha256=093853bc49757be8f9facd8d38eab95b3cc2de13514dafa221ad7898725491ff\n", + " Stored in directory: /root/.cache/pip/wheels/01/7e/a9/b982d0fea22b7e4ae5619de949570cde5ad55420cec16e86a5\n", + "Successfully built py-cpuinfo\n", + "Installing collected packages: opencv-python-headless, enum34, tensorflow-model-optimization, mlperf-compliance, sentencepiece, tensorboard-plugin-wit, tb-nightly, tf-estimator-nightly, tf-nightly, py-cpuinfo, tf-models-nightly\n", + "Successfully installed enum34-1.1.10 mlperf-compliance-0.0.10 opencv-python-headless-4.2.0.32 py-cpuinfo-5.0.0 sentencepiece-0.1.85 tb-nightly-2.2.0a20200324 tensorboard-plugin-wit-1.6.0.post2 tensorflow-model-optimization-0.2.1 tf-estimator-nightly-2.3.0.dev2020032501 tf-models-nightly-2.2.0.dev20200326 tf-nightly-2.2.0.dev20200325\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "application/vnd.colab-display-data+json": { + "pip_warning": { + "packages": [ + "enum" + ] + } + } + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w4oyRCTji-aa", + "colab_type": "text" + }, + "source": [ + "## BERT Fine-tuning\n", + "\n", + "The following code import necessary modules for fine-tuning a BERT model on a classification task.\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rV8MIX7g078-", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%tensorflow_version 2.x\n", + "import tensorflow as tf\n", + "\n", + "import json\n", + "import math\n", + "\n", + "from official.utils.misc import distribution_utils\n", + "from official.nlp import optimization\n", + "from official.nlp.bert import bert_models\n", + "from official.nlp.bert import configs as bert_configs\n", + "from official.nlp.bert import run_classifier\n", + "from official.modeling import activations\n", + "from official.nlp.modeling import networks\n", + "from official.nlp.modeling.models import bert_classifier" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DIuS8nYD08n3", + "colab_type": "text" + }, + "source": [ + "This section of code performs the following tasks:\n", + "* Load data for fine-tuning\n", + "* Fine-tune a BERT model\n", + "* Save the fine-tuned model to a TensorFlow SavedModel file\n", + "\n", + "Please check [create_finetuning_data.py](https://github.com/tensorflow/models/blob/master/official/nlp/data/create_finetuning_data.py) if you want to know how the train/eval data are created." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PAby1RTCi_1e", + "colab_type": "code", + "outputId": "e663e830-cc9b-4b5d-99db-4504fd66d5f3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 258 + } + }, + "source": [ + "\n", + "train_data_path = \"gs://cloud-tpu-checkpoints/bert/classification/mrpc_train.tf_record\"\n", + "eval_data_path = \"gs://cloud-tpu-checkpoints/bert/classification/mrpc_eval.tf_record\"\n", + "input_meta_path = \"gs://cloud-tpu-checkpoints/bert/classification/mrpc_meta_data\"\n", + "\n", + "bert_config_file = \"gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-12_H-768_A-12/bert_config.json\"\n", + "ckpt_path = 'gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-12_H-768_A-12/bert_model.ckpt'\n", + "\n", + "with tf.io.gfile.GFile(input_meta_path, 'rb') as reader:\n", + " input_meta_data = json.loads(reader.read().decode('utf-8'))\n", + "\n", + "max_seq_length = input_meta_data['max_seq_length']\n", + "num_classes = input_meta_data['num_labels']\n", + "batch_size = 32\n", + "eval_batch_size = 32\n", + "train_input_fn = run_classifier.get_dataset_fn(train_data_path, max_seq_length, batch_size, is_training=True)\n", + "eval_input_fn = run_classifier.get_dataset_fn(eval_data_path, max_seq_length, eval_batch_size, is_training=False)\n", + "\n", + "strategy = distribution_utils.get_distribution_strategy(\n", + " distribution_strategy='one_device', num_gpus=1)\n", + "\n", + "with strategy.scope():\n", + " training_dataset = train_input_fn()\n", + " evaluation_dataset = eval_input_fn()\n", + " bert_config = bert_configs.BertConfig.from_json_file(bert_config_file)\n", + " classifier_model, encoder = bert_models.classifier_model(\n", + " bert_config, num_classes, max_seq_length)\n", + "\n", + " checkpoint = tf.train.Checkpoint(model=encoder)\n", + " checkpoint.restore(ckpt_path).assert_consumed()\n", + "\n", + " epochs = 3\n", + " train_data_size = input_meta_data['train_data_size']\n", + " eval_data_size = input_meta_data['eval_data_size']\n", + " steps_per_epoch = int(train_data_size / batch_size)\n", + " warmup_steps = int(epochs * train_data_size * 0.1 / batch_size)\n", + " optimizer = optimization.create_optimizer(\n", + " 2e-5, num_train_steps=steps_per_epoch * epochs, num_warmup_steps=warmup_steps)\n", + "\n", + " def metric_fn():\n", + " return tf.keras.metrics.SparseCategoricalAccuracy(\n", + " 'test_accuracy', dtype=tf.float32)\n", + "\n", + " classifier_model.compile(optimizer=optimizer,\n", + " loss=run_classifier.get_loss_fn(num_classes=2),\n", + " metrics=[metric_fn()])\n", + " classifier_model.fit(\n", + " x=training_dataset,\n", + " validation_data=evaluation_dataset,\n", + " steps_per_epoch=steps_per_epoch,\n", + " epochs=epochs,\n", + " validation_steps=int(eval_data_size / eval_batch_size))\n", + "\n", + " classifier_model.save('/tmp/saved_model', include_optimizer=False, save_format='tf')" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "WARNING:tensorflow:BertClassifier inputs must come from `tf.keras.Input` (thus holding past layer metadata), they cannot be the output of a previous non-Input layer. Here, a tensor specified as input to \"bert_classifier\" was not an Input tensor, it was generated by layer input_mask.\n", + "Note that input tensors are instantiated via `tensor = tf.keras.Input(shape)`.\n", + "The tensor that caused the issue was: input_mask:0\n", + "WARNING:tensorflow:BertClassifier inputs must come from `tf.keras.Input` (thus holding past layer metadata), they cannot be the output of a previous non-Input layer. Here, a tensor specified as input to \"bert_classifier\" was not an Input tensor, it was generated by layer input_type_ids.\n", + "Note that input tensors are instantiated via `tensor = tf.keras.Input(shape)`.\n", + "The tensor that caused the issue was: input_type_ids:0\n", + "Epoch 1/3\n", + "114/114 [==============================] - 96s 840ms/step - loss: 0.5932 - test_accuracy: 0.6960 - val_loss: 0.5083 - val_test_accuracy: 0.7604\n", + "Epoch 2/3\n", + "114/114 [==============================] - 100s 878ms/step - loss: 0.4225 - test_accuracy: 0.8183 - val_loss: 0.4020 - val_test_accuracy: 0.8438\n", + "Epoch 3/3\n", + "114/114 [==============================] - 100s 880ms/step - loss: 0.2482 - test_accuracy: 0.9134 - val_loss: 0.4065 - val_test_accuracy: 0.8151\n", + "INFO:tensorflow:Assets written to: /tmp/saved_model/assets\n" + ], + "name": "stdout" + } + ] + } + ] +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/__init__.py new file mode 100644 index 0000000..2b558fe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Activations package definition.""" +from official.modeling.activations.gelu import gelu +from official.modeling.activations.swish import hard_swish +from official.modeling.activations.swish import identity +from official.modeling.activations.swish import simple_swish diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu.py new file mode 100644 index 0000000..c045bff --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu.py @@ -0,0 +1,40 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Gaussian error linear unit.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import tensorflow as tf + + +@tf.keras.utils.register_keras_serializable(package='Text') +def gelu(x): + """Gaussian Error Linear Unit. + + This is a smoother version of the RELU. + Original paper: https://arxiv.org/abs/1606.08415 + Args: + x: float Tensor to perform activation. + + Returns: + `x` with the GELU activation applied. + """ + cdf = 0.5 * (1.0 + tf.tanh( + (math.sqrt(2 / math.pi) * (x + 0.044715 * tf.pow(x, 3))))) + return x * cdf diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu_test.py new file mode 100644 index 0000000..dc3b95c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/gelu_test.py @@ -0,0 +1,38 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the Gaussian error linear unit.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations + + +@keras_parameterized.run_all_keras_modes +class GeluTest(keras_parameterized.TestCase): + + def test_gelu(self): + expected_data = [[0.14967535, 0., -0.10032465], + [-0.15880796, -0.04540223, 2.9963627]] + gelu_data = activations.gelu([[.25, 0, -.25], [-1, -2, 3]]) + self.assertAllClose(expected_data, gelu_data) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish.py new file mode 100644 index 0000000..1d79961 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish.py @@ -0,0 +1,75 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Customized Swish activation.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +@tf.keras.utils.register_keras_serializable(package='Text') +def simple_swish(features): + """Computes the Swish activation function. + + The tf.nn.swish operation uses a custom gradient to reduce memory usage. + Since saving custom gradients in SavedModel is currently not supported, and + one would not be able to use an exported TF-Hub module for fine-tuning, we + provide this wrapper that can allow to select whether to use the native + TensorFlow swish operation, or whether to use a customized operation that + has uses default TensorFlow gradient computation. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return features * tf.nn.sigmoid(features) + + +@tf.keras.utils.register_keras_serializable(package='Text') +def hard_swish(features): + """Computes a hard version of the swish function. + + This operation can be used to reduce computational cost and improve + quantization for edge devices. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return features * tf.nn.relu6(features + tf.constant(3.)) * (1. / 6.) + + +@tf.keras.utils.register_keras_serializable(package='Text') +def identity(features): + """Computes the identity function. + + Useful for helping in quantization. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return tf.identity(features) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish_test.py new file mode 100644 index 0000000..22042e9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/activations/swish_test.py @@ -0,0 +1,49 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the customized Swish activation.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations + + +@keras_parameterized.run_all_keras_modes +class CustomizedSwishTest(keras_parameterized.TestCase): + + def _hard_swish_np(self, x): + x = np.float32(x) + return x * np.clip(x + 3, 0, 6) / 6 + + def test_simple_swish(self): + features = [[.25, 0, -.25], [-1, -2, 3]] + customized_swish_data = activations.simple_swish(features) + swish_data = tf.nn.swish(features) + self.assertAllClose(customized_swish_data, swish_data) + + def test_hard_swish(self): + features = [[.25, 0, -.25], [-1, -2, 3]] + customized_swish_data = activations.hard_swish(features) + swish_data = self._hard_swish_np(features) + self.assertAllClose(customized_swish_data, swish_data) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config.py new file mode 100644 index 0000000..23a6790 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config.py @@ -0,0 +1,323 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Base configurations to standardize experiments.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import copy +import functools +from typing import Any, List, Mapping, Optional, Type + +import dataclasses +import tensorflow as tf +import yaml + +from official.modeling.hyperparams import params_dict + + +@dataclasses.dataclass +class Config(params_dict.ParamsDict): + """The base configuration class that supports YAML/JSON based overrides. + + * It recursively enforces a whitelist of basic types and container types, so + it avoids surprises with copy and reuse caused by unanticipated types. + * It converts dict to Config even within sequences, + e.g. for config = Config({'key': [([{'a': 42}],)]), + type(config.key[0][0][0]) is Config rather than dict. + """ + + # It's safe to add bytes and other immutable types here. + IMMUTABLE_TYPES = (str, int, float, bool, type(None)) + # It's safe to add set, frozenset and other collections here. + SEQUENCE_TYPES = (list, tuple) + + default_params: dataclasses.InitVar[Optional[Mapping[str, Any]]] = None + restrictions: dataclasses.InitVar[Optional[List[str]]] = None + + @classmethod + def _isvalidsequence(cls, v): + """Check if the input values are valid sequences. + + Args: + v: Input sequence. + + Returns: + True if the sequence is valid. Valid sequence includes the sequence + type in cls.SEQUENCE_TYPES and element type is in cls.IMMUTABLE_TYPES or + is dict or ParamsDict. + """ + if not isinstance(v, cls.SEQUENCE_TYPES): + return False + return (all(isinstance(e, cls.IMMUTABLE_TYPES) for e in v) or + all(isinstance(e, dict) for e in v) or + all(isinstance(e, params_dict.ParamsDict) for e in v)) + + @classmethod + def _import_config(cls, v, subconfig_type): + """Returns v with dicts converted to Configs, recursively.""" + if not issubclass(subconfig_type, params_dict.ParamsDict): + raise TypeError( + 'Subconfig_type should be subclass of ParamsDict, found {!r}'.format( + subconfig_type)) + if isinstance(v, cls.IMMUTABLE_TYPES): + return v + elif isinstance(v, cls.SEQUENCE_TYPES): + # Only support one layer of sequence. + if not cls._isvalidsequence(v): + raise TypeError( + 'Invalid sequence: only supports single level {!r} of {!r} or ' + 'dict or ParamsDict found: {!r}'.format(cls.SEQUENCE_TYPES, + cls.IMMUTABLE_TYPES, v)) + import_fn = functools.partial( + cls._import_config, subconfig_type=subconfig_type) + return type(v)(map(import_fn, v)) + elif isinstance(v, params_dict.ParamsDict): + # Deepcopy here is a temporary solution for preserving type in nested + # Config object. + return copy.deepcopy(v) + elif isinstance(v, dict): + return subconfig_type(v) + else: + raise TypeError('Unknown type: {!r}'.format(type(v))) + + @classmethod + def _export_config(cls, v): + """Returns v with Configs converted to dicts, recursively.""" + if isinstance(v, cls.IMMUTABLE_TYPES): + return v + elif isinstance(v, cls.SEQUENCE_TYPES): + return type(v)(map(cls._export_config, v)) + elif isinstance(v, params_dict.ParamsDict): + return v.as_dict() + elif isinstance(v, dict): + raise TypeError('dict value not supported in converting.') + else: + raise TypeError('Unknown type: {!r}'.format(type(v))) + + @classmethod + def _get_subconfig_type(cls, k) -> Type[params_dict.ParamsDict]: + """Get element type by the field name. + + Args: + k: the key/name of the field. + + Returns: + Config as default. If a type annotation is found for `k`, + 1) returns the type of the annotation if it is subtype of ParamsDict; + 2) returns the element type if the annotation of `k` is List[SubType] + or Tuple[SubType]. + """ + subconfig_type = Config + if k in cls.__annotations__: + # Directly Config subtype. + type_annotation = cls.__annotations__[k] + if (isinstance(type_annotation, type) and + issubclass(type_annotation, Config)): + subconfig_type = cls.__annotations__[k] + else: + # Check if the field is a sequence of subtypes. + field_type = getattr(type_annotation, '__origin__', type(None)) + if (isinstance(field_type, type) and + issubclass(field_type, cls.SEQUENCE_TYPES)): + element_type = getattr(type_annotation, '__args__', [type(None)])[0] + subconfig_type = ( + element_type if issubclass(element_type, params_dict.ParamsDict) + else subconfig_type) + return subconfig_type + + def __post_init__(self, default_params, restrictions, *args, **kwargs): + super().__init__(default_params=default_params, + restrictions=restrictions, + *args, + **kwargs) + + def _set(self, k, v): + """Overrides same method in ParamsDict. + + Also called by ParamsDict methods. + + Args: + k: key to set. + v: value. + + Raises: + RuntimeError + """ + subconfig_type = self._get_subconfig_type(k) + if isinstance(v, dict): + if k not in self.__dict__ or not self.__dict__[k]: + # If the key not exist or the value is None, a new Config-family object + # sould be created for the key. + self.__dict__[k] = subconfig_type(v) + else: + self.__dict__[k].override(v) + else: + self.__dict__[k] = self._import_config(v, subconfig_type) + + def __setattr__(self, k, v): + if k not in self.RESERVED_ATTR: + if getattr(self, '_locked', False): + raise ValueError('The Config has been locked. ' 'No change is allowed.') + self._set(k, v) + + def _override(self, override_dict, is_strict=True): + """Overrides same method in ParamsDict. + + Also called by ParamsDict methods. + + Args: + override_dict: dictionary to write to . + is_strict: If True, not allows to add new keys. + + Raises: + KeyError: overriding reserved keys or keys not exist (is_strict=True). + """ + for k, v in sorted(override_dict.items()): + if k in self.RESERVED_ATTR: + raise KeyError('The key {!r} is internally reserved. ' + 'Can not be overridden.'.format(k)) + if k not in self.__dict__: + if is_strict: + raise KeyError('The key {!r} does not exist in {!r}. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = False.'.format( + k, type(self))) + else: + self._set(k, v) + else: + if isinstance(v, dict) and self.__dict__[k]: + self.__dict__[k]._override(v, is_strict) # pylint: disable=protected-access + elif isinstance(v, params_dict.ParamsDict) and self.__dict__[k]: + self.__dict__[k]._override(v.as_dict(), is_strict) # pylint: disable=protected-access + else: + self._set(k, v) + + def as_dict(self): + """Returns a dict representation of params_dict.ParamsDict. + + For the nested params_dict.ParamsDict, a nested dict will be returned. + """ + return { + k: self._export_config(v) + for k, v in self.__dict__.items() + if k not in self.RESERVED_ATTR + } + + def replace(self, **kwargs): + """Like `override`, but returns a copy with the current config unchanged.""" + params = self.__class__(self) + params.override(kwargs, is_strict=True) + return params + + @classmethod + def from_yaml(cls, file_path: str): + # Note: This only works if the Config has all default values. + with tf.io.gfile.GFile(file_path, 'r') as f: + loaded = yaml.load(f) + config = cls() + config.override(loaded) + return config + + @classmethod + def from_json(cls, file_path: str): + """Wrapper for `from_yaml`.""" + return cls.from_yaml(file_path) + + @classmethod + def from_args(cls, *args, **kwargs): + """Builds a config from the given list of arguments.""" + attributes = list(cls.__annotations__.keys()) + default_params = {a: p for a, p in zip(attributes, args)} + default_params.update(kwargs) + return cls(default_params) + + +@dataclasses.dataclass +class RuntimeConfig(Config): + """High-level configurations for Runtime. + + These include parameters that are not directly related to the experiment, + e.g. directories, accelerator type, etc. + + Attributes: + distribution_strategy: e.g. 'mirrored', 'tpu', etc. + enable_xla: Whether or not to enable XLA. + per_gpu_thread_count: thread count per GPU. + gpu_thread_mode: Whether and how the GPU device uses its own threadpool. + dataset_num_private_threads: Number of threads for a private threadpool + created for all datasets computation. + tpu: The address of the TPU to use, if any. + num_gpus: The number of GPUs to use, if any. + worker_hosts: comma-separated list of worker ip:port pairs for running + multi-worker models with DistributionStrategy. + task_index: If multi-worker training, the task index of this worker. + all_reduce_alg: Defines the algorithm for performing all-reduce. + num_packs: Sets `num_packs` in the cross device ops used in + MirroredStrategy. For details, see tf.distribute.NcclAllReduce. + loss_scale: The type of loss scale. This is used when setting the mixed + precision policy. + run_eagerly: Whether or not to run the experiment eagerly. + + """ + distribution_strategy: str = 'mirrored' + enable_xla: bool = False + gpu_thread_mode: Optional[str] = None + dataset_num_private_threads: Optional[int] = None + per_gpu_thread_count: int = 0 + tpu: Optional[str] = None + num_gpus: int = 0 + worker_hosts: Optional[str] = None + task_index: int = -1 + all_reduce_alg: Optional[str] = None + num_packs: int = 1 + loss_scale: Optional[str] = None + run_eagerly: bool = False + + +@dataclasses.dataclass +class TensorboardConfig(Config): + """Configuration for Tensorboard. + + Attributes: + track_lr: Whether or not to track the learning rate in Tensorboard. Defaults + to True. + write_model_weights: Whether or not to write the model weights as + images in Tensorboard. Defaults to False. + + """ + track_lr: bool = True + write_model_weights: bool = False + + +@dataclasses.dataclass +class CallbacksConfig(Config): + """Configuration for Callbacks. + + Attributes: + enable_checkpoint_and_export: Whether or not to enable checkpoints as a + Callback. Defaults to True. + enable_tensorboard: Whether or not to enable Tensorboard as a Callback. + Defaults to True. + enable_time_history: Whether or not to enable TimeHistory Callbacks. + Defaults to True. + + """ + enable_checkpoint_and_export: bool = True + enable_tensorboard: bool = True + enable_time_history: bool = True diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config_test.py new file mode 100644 index 0000000..501f958 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/base_config_test.py @@ -0,0 +1,299 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import pprint +from typing import List, Tuple + +from absl.testing import parameterized +import dataclasses +import tensorflow as tf +from official.modeling.hyperparams import base_config + + +@dataclasses.dataclass +class DumpConfig1(base_config.Config): + a: int = 1 + b: str = 'text' + + +@dataclasses.dataclass +class DumpConfig2(base_config.Config): + c: int = 2 + d: str = 'text' + e: DumpConfig1 = DumpConfig1() + + +@dataclasses.dataclass +class DumpConfig3(DumpConfig2): + f: int = 2 + g: str = 'text' + h: List[DumpConfig1] = dataclasses.field( + default_factory=lambda: [DumpConfig1(), DumpConfig1()]) + g: Tuple[DumpConfig1, ...] = (DumpConfig1(),) + + +class BaseConfigTest(parameterized.TestCase, tf.test.TestCase): + + def assertHasSameTypes(self, c, d, msg=''): + """Checks if a Config has the same structure as a given dict. + + Args: + c: the Config object to be check. + d: the reference dict object. + msg: The error message to show when type mismatched. + """ + # Make sure d is not a Config. Assume d is either + # dictionary or primitive type and c is the Config or primitive types. + self.assertNotIsInstance(d, base_config.Config) + if isinstance(d, base_config.Config.IMMUTABLE_TYPES): + self.assertEqual(pprint.pformat(c), pprint.pformat(d), msg=msg) + elif isinstance(d, base_config.Config.SEQUENCE_TYPES): + self.assertEqual(type(c), type(d), msg=msg) + for i, v in enumerate(d): + self.assertHasSameTypes(c[i], v, msg='{}[{!r}]'.format(msg, i)) + elif isinstance(d, dict): + self.assertIsInstance(c, base_config.Config, msg=msg) + for k, v in sorted(d.items()): + self.assertHasSameTypes(getattr(c, k), v, msg='{}[{!r}]'.format(msg, k)) + else: + raise TypeError('Unknown type: %r' % type(d)) + + def assertImportExport(self, v): + config = base_config.Config({'key': v}) + back = config.as_dict()['key'] + self.assertEqual(pprint.pformat(back), pprint.pformat(v)) + self.assertHasSameTypes(config.key, v, msg='=%s v' % pprint.pformat(v)) + + def test_invalid_keys(self): + params = base_config.Config() + with self.assertRaises(AttributeError): + _ = params.a + + def test_nested_config_types(self): + config = DumpConfig3() + self.assertIsInstance(config.e, DumpConfig1) + self.assertIsInstance(config.h[0], DumpConfig1) + self.assertIsInstance(config.h[1], DumpConfig1) + self.assertIsInstance(config.g[0], DumpConfig1) + + config.override({'e': {'a': 2, 'b': 'new text'}}) + self.assertIsInstance(config.e, DumpConfig1) + self.assertEqual(config.e.a, 2) + self.assertEqual(config.e.b, 'new text') + + config.override({'h': [{'a': 3, 'b': 'new text 2'}]}) + self.assertIsInstance(config.h[0], DumpConfig1) + self.assertLen(config.h, 1) + self.assertEqual(config.h[0].a, 3) + self.assertEqual(config.h[0].b, 'new text 2') + + config.override({'g': [{'a': 4, 'b': 'new text 3'}]}) + self.assertIsInstance(config.g[0], DumpConfig1) + self.assertLen(config.g, 1) + self.assertEqual(config.g[0].a, 4) + self.assertEqual(config.g[0].b, 'new text 3') + + @parameterized.parameters( + ('_locked', "The key '_locked' is internally reserved."), + ('_restrictions', "The key '_restrictions' is internally reserved."), + ('aa', "The key 'aa' does not exist."), + ) + def test_key_error(self, key, msg): + params = base_config.Config() + with self.assertRaisesRegex(KeyError, msg): + params.override({key: True}) + + @parameterized.parameters( + ('str data',), + (123,), + (1.23,), + (None,), + (['str', 1, 2.3, None],), + (('str', 1, 2.3, None),), + ) + def test_import_export_immutable_types(self, v): + self.assertImportExport(v) + out = base_config.Config({'key': v}) + self.assertEqual(pprint.pformat(v), pprint.pformat(out.key)) + + def test_override_is_strict_true(self): + params = base_config.Config({ + 'a': 'aa', + 'b': 2, + 'c': { + 'c1': 'cc', + 'c2': 20 + } + }) + params.override({'a': 2, 'c': {'c1': 'ccc'}}, is_strict=True) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c1, 'ccc') + with self.assertRaises(KeyError): + params.override({'d': 'ddd'}, is_strict=True) + with self.assertRaises(KeyError): + params.override({'c': {'c3': 30}}, is_strict=True) + + config = base_config.Config({'key': [{'a': 42}]}) + config.override({'key': [{'b': 43}]}) + self.assertEqual(config.key[0].b, 43) + with self.assertRaisesRegex(AttributeError, 'The key `a` does not exist'): + _ = config.key[0].a + + @parameterized.parameters( + (lambda x: x, 'Unknown type'), + (object(), 'Unknown type'), + (set(), 'Unknown type'), + (frozenset(), 'Unknown type'), + ) + def test_import_unsupport_types(self, v, msg): + with self.assertRaisesRegex(TypeError, msg): + _ = base_config.Config({'key': v}) + + @parameterized.parameters( + ({ + 'a': [{ + 'b': 2, + }, { + 'c': 3, + }] + },), + ({ + 'c': [{ + 'f': 1.1, + }, { + 'h': [1, 2], + }] + },), + (({ + 'a': 'aa', + 'b': 2, + 'c': { + 'c1': 10, + 'c2': 20, + } + },),), + ) + def test_import_export_nested_structure(self, d): + self.assertImportExport(d) + + @parameterized.parameters( + ([{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }],), + (({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),), + ) + def test_import_export_nested_sequences(self, v): + self.assertImportExport(v) + + @parameterized.parameters( + ([([{}],)],), + ([['str', 1, 2.3, None]],), + ((('str', 1, 2.3, None),),), + ([ + ('str', 1, 2.3, None), + ],), + ([ + ('str', 1, 2.3, None), + ],), + ([[{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }]],), + ([[[{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }]]],), + ((({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),),), + (((({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),),),), + ([({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },)],), + (([{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }],),), + ) + def test_import_export_unsupport_sequence(self, v): + with self.assertRaisesRegex(TypeError, + 'Invalid sequence: only supports single level'): + _ = base_config.Config({'key': v}) + + def test_construct_subtype(self): + pass + + def test_import_config(self): + params = base_config.Config({'a': [{'b': 2}, {'c': {'d': 3}}]}) + self.assertLen(params.a, 2) + self.assertEqual(params.a[0].b, 2) + self.assertEqual(type(params.a[0]), base_config.Config) + self.assertEqual(pprint.pformat(params.a[0].b), '2') + self.assertEqual(type(params.a[1]), base_config.Config) + self.assertEqual(type(params.a[1].c), base_config.Config) + self.assertEqual(pprint.pformat(params.a[1].c.d), '3') + + def test_override(self): + params = base_config.Config({'a': [{'b': 2}, {'c': {'d': 3}}]}) + params.override({'a': [{'b': 4}, {'c': {'d': 5}}]}, is_strict=False) + self.assertEqual(type(params.a), list) + self.assertEqual(type(params.a[0]), base_config.Config) + self.assertEqual(pprint.pformat(params.a[0].b), '4') + self.assertEqual(type(params.a[1]), base_config.Config) + self.assertEqual(type(params.a[1].c), base_config.Config) + self.assertEqual(pprint.pformat(params.a[1].c.d), '5') + + @parameterized.parameters( + ([{}],), + (({},),), + ) + def test_config_vs_params_dict(self, v): + d = {'key': v} + self.assertEqual(type(base_config.Config(d).key[0]), base_config.Config) + self.assertEqual(type(base_config.params_dict.ParamsDict(d).key[0]), dict) + + def test_ppformat(self): + self.assertEqual( + pprint.pformat([ + 's', 1, 1.0, True, None, {}, [], (), { + (2,): (3, [4], { + 6: 7, + }), + 8: 9, + } + ]), + "['s', 1, 1.0, True, None, {}, [], (), {8: 9, (2,): (3, [4], {6: 7})}]") + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict.py new file mode 100644 index 0000000..9806a2b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict.py @@ -0,0 +1,410 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A parameter dictionary class which supports the nest structure.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import re + +import six +import tensorflow as tf +import yaml + +# regex pattern that matches on key-value pairs in a comma-separated +# key-value pair string. It splits each k-v pair on the = sign, and +# matches on values that are within single quotes, double quotes, single +# values (e.g. floats, ints, etc.), and a lists within brackets. +_PARAM_RE = re.compile(r""" + (?P[a-zA-Z][\w\.]*) # variable name: "var" or "x" + \s*=\s* + ((?P\'(.*?)\' # single quote + | + \"(.*?)\" # double quote + | + [^,\[]* # single value + | + \[[^\]]*\])) # list of values + ($|,\s*)""", re.VERBOSE) + + +class ParamsDict(object): + """A hyperparameter container class.""" + + RESERVED_ATTR = ['_locked', '_restrictions'] + + def __init__(self, default_params=None, restrictions=None): + """Instantiate a ParamsDict. + + Instantiate a ParamsDict given a set of default parameters and a list of + restrictions. Upon initialization, it validates itself by checking all the + defined restrictions, and raise error if it finds inconsistency. + + Args: + default_params: a Python dict or another ParamsDict object including the + default parameters to initialize. + restrictions: a list of strings, which define a list of restrictions to + ensure the consistency of different parameters internally. Each + restriction string is defined as a binary relation with a set of + operators, including {'==', '!=', '<', '<=', '>', '>='}. + """ + self._locked = False + self._restrictions = [] + if restrictions: + self._restrictions = restrictions + if default_params is None: + default_params = {} + self.override(default_params, is_strict=False) + self.validate() + + def _set(self, k, v): + if isinstance(v, dict): + self.__dict__[k] = ParamsDict(v) + else: + self.__dict__[k] = copy.deepcopy(v) + + def __setattr__(self, k, v): + """Sets the value of the existing key. + + Note that this does not allow directly defining a new key. Use the + `override` method with `is_strict=False` instead. + + Args: + k: the key string. + v: the value to be used to set the key `k`. + + Raises: + KeyError: if k is not defined in the ParamsDict. + """ + if k not in ParamsDict.RESERVED_ATTR: + if k not in self.__dict__.keys(): + raise KeyError('The key `%{}` does not exist. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = True.'.format(k)) + if self._locked: + raise ValueError('The ParamsDict has been locked. ' + 'No change is allowed.') + self._set(k, v) + + def __getattr__(self, k): + """Gets the value of the existing key. + + Args: + k: the key string. + + Returns: + the value of the key. + + Raises: + AttributeError: if k is not defined in the ParamsDict. + """ + if k not in self.__dict__.keys(): + raise AttributeError('The key `{}` does not exist. '.format(k)) + return self.__dict__[k] + + def __contains__(self, key): + """Implements the membership test operator.""" + return key in self.__dict__ + + def get(self, key, value=None): + """Accesses through built-in dictionary get method.""" + return self.__dict__.get(key, value) + + def override(self, override_params, is_strict=True): + """Override the ParamsDict with a set of given params. + + Args: + override_params: a dict or a ParamsDict specifying the parameters to + be overridden. + is_strict: a boolean specifying whether override is strict or not. If + True, keys in `override_params` must be present in the ParamsDict. + If False, keys in `override_params` can be different from what is + currently defined in the ParamsDict. In this case, the ParamsDict will + be extended to include the new keys. + """ + if self._locked: + raise ValueError('The ParamsDict has been locked. No change is allowed.') + if isinstance(override_params, ParamsDict): + override_params = override_params.as_dict() + self._override(override_params, is_strict) # pylint: disable=protected-access + + def _override(self, override_dict, is_strict=True): + """The implementation of `override`.""" + for k, v in six.iteritems(override_dict): + if k in ParamsDict.RESERVED_ATTR: + raise KeyError('The key `%{}` is internally reserved. ' + 'Can not be overridden.') + if k not in self.__dict__.keys(): + if is_strict: + raise KeyError('The key `{}` does not exist. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = False.'.format(k)) + else: + self._set(k, v) + else: + if isinstance(v, dict): + self.__dict__[k]._override(v, is_strict) # pylint: disable=protected-access + elif isinstance(v, ParamsDict): + self.__dict__[k]._override(v.as_dict(), is_strict) # pylint: disable=protected-access + else: + self.__dict__[k] = copy.deepcopy(v) + + def lock(self): + """Makes the ParamsDict immutable.""" + self._locked = True + + def as_dict(self): + """Returns a dict representation of ParamsDict. + + For the nested ParamsDict, a nested dict will be returned. + """ + params_dict = {} + for k, v in six.iteritems(self.__dict__): + if k not in ParamsDict.RESERVED_ATTR: + if isinstance(v, ParamsDict): + params_dict[k] = v.as_dict() + else: + params_dict[k] = copy.deepcopy(v) + return params_dict + + def validate(self): + """Validate the parameters consistency based on the restrictions. + + This method validates the internal consistency using the pre-defined list of + restrictions. A restriction is defined as a string which specfiies a binary + operation. The supported binary operations are {'==', '!=', '<', '<=', '>', + '>='}. Note that the meaning of these operators are consistent with the + underlying Python immplementation. Users should make sure the define + restrictions on their type make sense. + + For example, for a ParamsDict like the following + ``` + a: + a1: 1 + a2: 2 + b: + bb: + bb1: 10 + bb2: 20 + ccc: + a1: 1 + a3: 3 + ``` + one can define two restrictions like this + ['a.a1 == b.ccc.a1', 'a.a2 <= b.bb.bb2'] + + What it enforces are: + - a.a1 = 1 == b.ccc.a1 = 2 + - a.a2 = 2 <= b.bb.bb2 = 20 + + Raises: + KeyError: if any of the following happens + (1) any of parameters in any of restrictions is not defined in + ParamsDict, + (2) any inconsistency violating the restriction is found. + ValueError: if the restriction defined in the string is not supported. + """ + def _get_kv(dotted_string, params_dict): + tokenized_params = dotted_string.split('.') + v = params_dict + for t in tokenized_params: + v = v[t] + return tokenized_params[-1], v + + def _get_kvs(tokens, params_dict): + if len(tokens) != 2: + raise ValueError('Only support binary relation in restriction.') + stripped_tokens = [t.strip() for t in tokens] + left_k, left_v = _get_kv(stripped_tokens[0], params_dict) + right_k, right_v = _get_kv(stripped_tokens[1], params_dict) + return left_k, left_v, right_k, right_v + + params_dict = self.as_dict() + for restriction in self._restrictions: + if '==' in restriction: + tokens = restriction.split('==') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v != right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '!=' in restriction: + tokens = restriction.split('!=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v == right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '<' in restriction: + tokens = restriction.split('<') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v >= right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '<=' in restriction: + tokens = restriction.split('<=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v > right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '>' in restriction: + tokens = restriction.split('>') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v <= right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '>=' in restriction: + tokens = restriction.split('>=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v < right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + else: + raise ValueError('Unsupported relation in restriction.') + + +def read_yaml_to_params_dict(file_path): + """Reads a YAML file to a ParamsDict.""" + with tf.io.gfile.GFile(file_path, 'r') as f: + params_dict = yaml.load(f) + return ParamsDict(params_dict) + + +def save_params_dict_to_yaml(params, file_path): + """Saves the input ParamsDict to a YAML file.""" + with tf.io.gfile.GFile(file_path, 'w') as f: + + def _my_list_rep(dumper, data): + # u'tag:yaml.org,2002:seq' is the YAML internal tag for sequence. + return dumper.represent_sequence( + u'tag:yaml.org,2002:seq', data, flow_style=True) + yaml.add_representer(list, _my_list_rep) + yaml.dump(params.as_dict(), f, default_flow_style=False) + + +def nested_csv_str_to_json_str(csv_str): + """Converts a nested (using '.') comma-separated k=v string to a JSON string. + + Converts a comma-separated string of key/value pairs that supports + nesting of keys to a JSON string. Nesting is implemented using + '.' between levels for a given key. + + Spacing between commas and = is supported (e.g. there is no difference between + "a=1,b=2", "a = 1, b = 2", or "a=1, b=2") but there should be no spaces before + keys or after values (e.g. " a=1,b=2" and "a=1,b=2 " are not supported). + + Note that this will only support values supported by CSV, meaning + values such as nested lists (e.g. "a=[[1,2,3],[4,5,6]]") are not + supported. Strings are supported as well, e.g. "a='hello'". + + An example conversion would be: + + "a=1, b=2, c.a=2, c.b=3, d.a.a=5" + + to + + "{ a: 1, b : 2, c: {a : 2, b : 3}, d: {a: {a : 5}}}" + + Args: + csv_str: the comma separated string. + + Returns: + the converted JSON string. + + Raises: + ValueError: If csv_str is not in a comma separated string or + if the string is formatted incorrectly. + """ + if not csv_str: + return '' + + formatted_entries = [] + nested_map = collections.defaultdict(list) + pos = 0 + while pos < len(csv_str): + m = _PARAM_RE.match(csv_str, pos) + if not m: + raise ValueError('Malformed hyperparameter value while parsing ' + 'CSV string: %s' % csv_str[pos:]) + pos = m.end() + # Parse the values. + m_dict = m.groupdict() + name = m_dict['name'] + v = m_dict['val'] + + # If a GCS path (e.g. gs://...) is provided, wrap this in quotes + # as yaml.load would otherwise throw an exception + if re.match(r'(?=[^\"\'])(?=[gs://])', v): + v = '\'{}\''.format(v) + + name_nested = name.split('.') + if len(name_nested) > 1: + grouping = name_nested[0] + value = '.'.join(name_nested[1:]) + '=' + v + nested_map[grouping].append(value) + else: + formatted_entries.append('%s : %s' % (name, v)) + + for grouping, value in nested_map.items(): + value = ','.join(value) + value = nested_csv_str_to_json_str(value) + formatted_entries.append('%s : %s' % (grouping, value)) + return '{' + ', '.join(formatted_entries) + '}' + + +def override_params_dict(params, dict_or_string_or_yaml_file, is_strict): + """Override a given ParamsDict using a dict, JSON/YAML/CSV string or YAML file. + + The logic of the function is outlined below: + 1. Test that the input is a dict. If not, proceed to 2. + 2. Tests that the input is a string. If not, raise unknown ValueError + 2.1. Test if the string is in a CSV format. If so, parse. + If not, proceed to 2.2. + 2.2. Try loading the string as a YAML/JSON. If successful, parse to + dict and use it to override. If not, proceed to 2.3. + 2.3. Try using the string as a file path and load the YAML file. + + Args: + params: a ParamsDict object to be overridden. + dict_or_string_or_yaml_file: a Python dict, JSON/YAML/CSV string or + path to a YAML file specifying the parameters to be overridden. + is_strict: a boolean specifying whether override is strict or not. + + Returns: + params: the overridden ParamsDict object. + + Raises: + ValueError: if failed to override the parameters. + """ + if not dict_or_string_or_yaml_file: + return params + if isinstance(dict_or_string_or_yaml_file, dict): + params.override(dict_or_string_or_yaml_file, is_strict) + elif isinstance(dict_or_string_or_yaml_file, six.string_types): + try: + dict_or_string_or_yaml_file = ( + nested_csv_str_to_json_str(dict_or_string_or_yaml_file)) + except ValueError: + pass + params_dict = yaml.load(dict_or_string_or_yaml_file) + if isinstance(params_dict, dict): + params.override(params_dict, is_strict) + else: + with tf.io.gfile.GFile(dict_or_string_or_yaml_file) as f: + params.override(yaml.load(f), is_strict) + else: + raise ValueError('Unknown input type to parse.') + return params diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict_test.py new file mode 100644 index 0000000..3d53ea1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/hyperparams/params_dict_test.py @@ -0,0 +1,322 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for official.modeling.hyperparams.params_dict.py.""" + +import os + +import tensorflow as tf +import yaml + +from official.modeling.hyperparams import params_dict + + +class ParamsDictTest(tf.test.TestCase): + + def test_init_from_an_empty_dict(self): + params = params_dict.ParamsDict() + with self.assertRaises(AttributeError): + _ = params.a + + with self.assertRaises(KeyError): + params.a = 'aa' + + def test_init_from_a_dict(self): + params = params_dict.ParamsDict({'a': 'aa', 'b': 2}) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + + def test_init_from_a_param_dict(self): + params_init = params_dict.ParamsDict({'a': 'aa', 'b': 2}) + params = params_dict.ParamsDict(params_init) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + + def test_lock(self): + params = params_dict.ParamsDict({'a': 1, 'b': 2}) + params.lock() + with self.assertRaises(ValueError): + params.a = 10 + with self.assertRaises(ValueError): + params.override({'b': 20}) + + def test_setattr(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa', 'b': 2, 'c': None}, is_strict=False) + params.c = 'ccc' + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c, 'ccc') + + def test_getattr(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa', 'b': 2, 'c': None}, is_strict=False) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c, None) + + def test_contains(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa'}, is_strict=False) + self.assertIn('a', params) + self.assertNotIn('b', params) + + def test_get(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa'}, is_strict=False) + self.assertEqual(params.get('a'), 'aa') + self.assertEqual(params.get('b', 2), 2) + self.assertEqual(params.get('b'), None) + + def test_override_is_strict_true(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 'cc', 'c2': 20}}) + params.override({'a': 2, 'c': {'c1': 'ccc'}}, is_strict=True) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c1, 'ccc') + with self.assertRaises(KeyError): + params.override({'d': 'ddd'}, is_strict=True) + with self.assertRaises(KeyError): + params.override({'c': {'c3': 30}}, is_strict=True) + + def test_override_is_strict_false(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + params.override({'a': 2, 'c': {'c3': 3000}}, is_strict=False) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c3, 3000) + params.override({'d': 'ddd'}, is_strict=False) + self.assertEqual(params.d, 'ddd') + params.override({'c': {'c4': 4444}}, is_strict=False) + self.assertEqual(params.c.c4, 4444) + + def test_as_dict(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + params_d = params.as_dict() + self.assertEqual(params_d['a'], 'aa') + self.assertEqual(params_d['b'], 2) + self.assertEqual(params_d['c']['c1'], 10) + self.assertEqual(params_d['c']['c2'], 20) + + def test_validate(self): + # Raise error due to the unknown parameter. + with self.assertRaises(KeyError): + params = params_dict.ParamsDict( + {'a': 1, 'b': {'a': 11}}, ['a == c']) + + # OK to check equality of two nested dicts. + params = params_dict.ParamsDict( + {'a': 1, 'b': {'a': 10}, 'c': {'a': 10}}, ['b == c']) + + # Raise error due to inconsistency + with self.assertRaises(KeyError): + params = params_dict.ParamsDict( + {'a': 1, 'c': {'a': 10}}, ['a == c.a']) + + # Valid rule. + params = params_dict.ParamsDict( + {'a': 1, 'c': {'a': 1}}, ['a == c.a']) + + # Overridding violates the existing rule, raise error upon validate. + params.override({'a': 11}) + with self.assertRaises(KeyError): + params.validate() + + +class ParamsDictIOTest(tf.test.TestCase): + + def write_temp_file(self, filename, text): + temp_file = os.path.join(self.get_temp_dir(), filename) + with tf.io.gfile.GFile(temp_file, 'w') as writer: + writer.write(text) + return temp_file + + def test_save_params_dict_to_yaml(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + output_yaml_file = os.path.join(self.get_temp_dir(), 'params.yaml') + params_dict.save_params_dict_to_yaml(params, output_yaml_file) + + with tf.io.gfile.GFile(output_yaml_file, 'r') as f: + params_d = yaml.load(f) + self.assertEqual(params.a, params_d['a']) + self.assertEqual(params.b, params_d['b']) + self.assertEqual(params.c.c1, params_d['c']['c1']) + self.assertEqual(params.c.c2, params_d['c']['c2']) + + def test_read_yaml_to_params_dict(self): + input_yaml_file = self.write_temp_file( + 'params.yaml', r""" + a: 'aa' + b: 2 + c: + c1: 10 + c2: 20 + """) + params = params_dict.read_yaml_to_params_dict(input_yaml_file) + + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c.c1, 10) + self.assertEqual(params.c.c2, 20) + + def test_override_params_dict_using_dict(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_dict = {'b': 5.2, 'c': [30, 40]} + params = params_dict.override_params_dict( + params, override_dict, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_yaml_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_yaml_string = "'b': 5.2\n'c': [30, 40]" + params = params_dict.override_params_dict( + params, override_yaml_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_json_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': {'b1': 2, 'b2': [2, 3],}, + 'd': {'d1': {'d2': 'hello'}}, 'e': False}) + override_json_string = "{ b: { b2: [3, 4] }, d: { d1: { d2: 'hi' } } }" + params = params_dict.override_params_dict( + params, override_json_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(2, params.b.b1) + self.assertEqual([3, 4], params.b.b2) + self.assertEqual('hi', params.d.d1.d2) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_csv_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': {'b1': 2, 'b2': [2, 3],}, + 'd': {'d1': {'d2': 'hello'}}, 'e': False}) + override_csv_string = "b.b2=[3,4], d.d1.d2='hi, world', e=gs://test" + params = params_dict.override_params_dict( + params, override_csv_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(2, params.b.b1) + self.assertEqual([3, 4], params.b.b2) + self.assertEqual('hi, world', params.d.d1.d2) + self.assertEqual('gs://test', params.e) + + def test_override_params_dict_using_yaml_file(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_yaml_file = self.write_temp_file( + 'params.yaml', r""" + b: 5.2 + c: [30, 40] + """) + params = params_dict.override_params_dict( + params, override_yaml_file, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + +class IOTest(tf.test.TestCase): + + def test_basic_csv_str_to_json_str(self): + csv_str = 'a=1,b=2,c=3' + json_str = '{a : 1, b : 2, c : 3}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_basic_csv_str_load(self): + csv_str = 'a=1,b=2,c=3' + expected_output = {'a': 1, 'b': 2, 'c': 3} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_basic_nested_csv_str_to_json_str(self): + csv_str = 'a=1,b.b1=2' + json_str = '{a : 1, b : {b1 : 2}}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_basic_nested_csv_str_load(self): + csv_str = 'a=1,b.b1=2,c.c1=3' + expected_output = {'a': 1, 'b': {'b1': 2}, 'c': {'c1': 3}} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_complex_nested_csv_str_to_json_str(self): + csv_str = 'a.aa.aaa.aaaaa.a=1' + json_str = '{a : {aa : {aaa : {aaaaa : {a : 1}}}}}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_complex_nested_csv_str_load(self): + csv_str = 'a.aa.aaa.aaaaa.a=1,a.a=2' + expected_output = {'a': {'aa': {'aaa': {'aaaaa': {'a': 1}}}, 'a': 2}} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_csv_str_load_supported_datatypes(self): + csv_str = 'a=1,b=2.,c=[1,2,3],d=\'hello, there\',e=\"Hi.\"' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertEqual(converted_dict['a'], 1) + self.assertEqual(converted_dict['b'], 2.) + self.assertEqual(converted_dict['c'], [1, 2, 3]) + self.assertEqual(converted_dict['d'], 'hello, there') + self.assertEqual(converted_dict['e'], 'Hi.') + + def test_csv_str_load_unsupported_datatypes(self): + csv_str = 'a=[[1,2,3],[4,5,6]]' + self.assertRaises(ValueError, + params_dict.nested_csv_str_to_json_str, + csv_str) + + def test_csv_str_to_json_str_spacing(self): + csv_str1 = 'a=1,b=2,c=3' + csv_str2 = 'a = 1, b = 2, c = 3' + json_str = '{a : 1, b : 2, c : 3}' + converted_csv_str1 = params_dict.nested_csv_str_to_json_str(csv_str1) + converted_csv_str2 = params_dict.nested_csv_str_to_json_str(csv_str2) + self.assertEqual(converted_csv_str1, converted_csv_str2) + self.assertEqual(converted_csv_str1, json_str) + self.assertEqual(converted_csv_str2, json_str) + + def test_gcs_added_quotes(self): + csv_str = 'a=gs://abc, b=gs://def' + expected_output = '{a : \'gs://abc\', b : \'gs://def\'}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, expected_output) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/performance.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/performance.py new file mode 100644 index 0000000..4b264f5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/performance.py @@ -0,0 +1,56 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions and classes related to training performance.""" + +import tensorflow as tf + + +def configure_optimizer(optimizer, + use_float16=False, + use_graph_rewrite=False, + loss_scale="dynamic"): + """Configures optimizer object with performance options.""" + if use_float16: + # Wraps optimizer with a LossScaleOptimizer. This is done automatically + # in compile() with the "mixed_float16" policy, but since we do not call + # compile(), we must wrap the optimizer manually. + optimizer = ( + tf.keras.mixed_precision.experimental.LossScaleOptimizer( + optimizer, loss_scale=loss_scale)) + if use_graph_rewrite: + # Note: the model dtype must be 'float32', which will ensure + # tf.ckeras.mixed_precision and + # tf.train.experimental.enable_mixed_precision_graph_rewrite do not double + # up. + optimizer = tf.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer) + return optimizer + + +def set_mixed_precision_policy(dtype, loss_scale=None): + """Sets mix precision policy.""" + if dtype == tf.float16: + policy = tf.keras.mixed_precision.experimental.Policy( + 'mixed_float16', loss_scale=loss_scale) + tf.keras.mixed_precision.experimental.set_policy(policy) + elif dtype == tf.bfloat16: + policy = tf.keras.mixed_precision.experimental.Policy( + 'mixed_bfloat16') + tf.keras.mixed_precision.experimental.set_policy(policy) + elif dtype == tf.float32: + tf.keras.mixed_precision.experimental.set_policy('float32') + else: + raise ValueError("Unexpected dtype: %s" % dtype) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/tf_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/tf_utils.py new file mode 100644 index 0000000..34f8f66 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/tf_utils.py @@ -0,0 +1,175 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common TF utilities.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import six +import tensorflow as tf + +from tensorflow.python.util import deprecation +from official.modeling import activations + + +@deprecation.deprecated( + None, + "tf.keras.layers.Layer supports multiple positional args and kwargs as " + "input tensors. pack/unpack inputs to override __call__ is no longer " + "needed." +) +def pack_inputs(inputs): + """Pack a list of `inputs` tensors to a tuple. + + Args: + inputs: a list of tensors. + + Returns: + a tuple of tensors. if any input is None, replace it with a special constant + tensor. + """ + inputs = tf.nest.flatten(inputs) + outputs = [] + for x in inputs: + if x is None: + outputs.append(tf.constant(0, shape=[], dtype=tf.int32)) + else: + outputs.append(x) + return tuple(outputs) + + +@deprecation.deprecated( + None, + "tf.keras.layers.Layer supports multiple positional args and kwargs as " + "input tensors. pack/unpack inputs to override __call__ is no longer " + "needed." +) +def unpack_inputs(inputs): + """unpack a tuple of `inputs` tensors to a tuple. + + Args: + inputs: a list of tensors. + + Returns: + a tuple of tensors. if any input is a special constant tensor, replace it + with None. + """ + inputs = tf.nest.flatten(inputs) + outputs = [] + for x in inputs: + if is_special_none_tensor(x): + outputs.append(None) + else: + outputs.append(x) + x = tuple(outputs) + + # To trick the very pointless 'unbalanced-tuple-unpacking' pylint check + # from triggering. + if len(x) == 1: + return x[0] + return tuple(outputs) + + +def is_special_none_tensor(tensor): + """Checks if a tensor is a special None Tensor.""" + return tensor.shape.ndims == 0 and tensor.dtype == tf.int32 + + +# TODO(hongkuny): consider moving custom string-map lookup to keras api. +def get_activation(identifier): + """Maps a identifier to a Python function, e.g., "relu" => `tf.nn.relu`. + + It checks string first and if it is one of customized activation not in TF, + the corresponding activation will be returned. For non-customized activation + names and callable identifiers, always fallback to tf.keras.activations.get. + + Args: + identifier: String name of the activation function or callable. + + Returns: + A Python function corresponding to the activation function. + """ + if isinstance(identifier, six.string_types): + name_to_fn = { + "gelu": activations.gelu, + "simple_swish": activations.simple_swish, + "hard_swish": activations.hard_swish, + "identity": activations.identity, + } + identifier = str(identifier).lower() + if identifier in name_to_fn: + return tf.keras.activations.get(name_to_fn[identifier]) + return tf.keras.activations.get(identifier) + + +def get_shape_list(tensor, expected_rank=None, name=None): + """Returns a list of the shape of tensor, preferring static dimensions. + + Args: + tensor: A tf.Tensor object to find the shape of. + expected_rank: (optional) int. The expected rank of `tensor`. If this is + specified and the `tensor` has a different rank, and exception will be + thrown. + name: Optional name of the tensor for the error message. + + Returns: + A list of dimensions of the shape of tensor. All static dimensions will + be returned as python integers, and dynamic dimensions will be returned + as tf.Tensor scalars. + """ + if expected_rank is not None: + assert_rank(tensor, expected_rank, name) + + shape = tensor.shape.as_list() + + non_static_indexes = [] + for (index, dim) in enumerate(shape): + if dim is None: + non_static_indexes.append(index) + + if not non_static_indexes: + return shape + + dyn_shape = tf.shape(tensor) + for index in non_static_indexes: + shape[index] = dyn_shape[index] + return shape + + +def assert_rank(tensor, expected_rank, name=None): + """Raises an exception if the tensor rank is not of the expected rank. + + Args: + tensor: A tf.Tensor to check the rank of. + expected_rank: Python integer or list of integers, expected rank. + name: Optional name of the tensor for the error message. + + Raises: + ValueError: If the expected shape doesn't match the actual shape. + """ + expected_rank_dict = {} + if isinstance(expected_rank, six.integer_types): + expected_rank_dict[expected_rank] = True + else: + for x in expected_rank: + expected_rank_dict[x] = True + + actual_rank = tensor.shape.ndims + if actual_rank not in expected_rank_dict: + raise ValueError( + "For the tensor `%s`, the actual tensor rank `%d` (shape = %s) is not " + "equal to the expected tensor rank `%s`" % + (name, actual_rank, str(tensor.shape), str(expected_rank))) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/training/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/training/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/training/distributed_executor.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/training/distributed_executor.py new file mode 100644 index 0000000..e44178c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/modeling/training/distributed_executor.py @@ -0,0 +1,759 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Custom training loop for running TensorFlow 2.0 models.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os + +from absl import flags +from absl import logging + +import numpy as np +import tensorflow as tf + +# pylint: disable=unused-import,g-import-not-at-top,redefined-outer-name,reimported +from typing import Optional, Dict, List, Text, Callable, Union, Iterator, Any +from official.modeling.hyperparams import params_dict +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.utils import hyperparams_flags + +FLAGS = flags.FLAGS + +strategy_flags_dict = hyperparams_flags.strategy_flags_dict +hparam_flags_dict = hyperparams_flags.hparam_flags_dict + + +def _save_checkpoint(checkpoint, model_dir, checkpoint_prefix): + """Saves model to model_dir with provided checkpoint prefix.""" + + checkpoint_path = os.path.join(model_dir, checkpoint_prefix) + saved_path = checkpoint.save(checkpoint_path) + logging.info('Saving model as TF checkpoint: %s', saved_path) + + +def _steps_to_run(current_step, total_steps, steps_per_loop): + """Calculates steps to run on device.""" + if steps_per_loop <= 0: + raise ValueError('steps_per_loop should be positive integer.') + return min(total_steps - current_step, steps_per_loop) + + +def _no_metric(): + return None + + +class SummaryWriter(object): + """Simple SummaryWriter for writing dictionary of metrics. + + Attributes: + writer: The tf.SummaryWriter. + """ + + def __init__(self, model_dir: Text, name: Text): + """Inits SummaryWriter with paths. + + Arguments: + model_dir: the model folder path. + name: the summary subfolder name. + """ + self.writer = tf.summary.create_file_writer(os.path.join(model_dir, name)) + + def __call__(self, metrics: Union[Dict[Text, float], float], step: int): + """Write metrics to summary with the given writer. + + Args: + metrics: a dictionary of metrics values. Prefer dictionary. + step: integer. The training step. + """ + if not isinstance(metrics, dict): + # Support scalar metric without name. + logging.warning('Warning: summary writer prefer metrics as dictionary.') + metrics = {'metric': metrics} + + with self.writer.as_default(): + for k, v in metrics.items(): + tf.summary.scalar(k, v, step=step) + self.writer.flush() + + +class DistributedExecutor(object): + """Interface to train and eval models with tf.distribute.Strategy. + + Arguments: + strategy: an instance of tf.distribute.Strategy. + params: Model configuration needed to run distribution strategy. + model_fn: Keras model function. Signature: + (params: ParamsDict) -> tf.keras.models.Model. + loss_fn: loss function. Signature: + (y_true: Tensor, y_pred: Tensor) -> Tensor + metric_fn: metric function. Signature: () -> tf.keras.metrics.Metric. + is_multi_host: Set to True when using multi hosts for training, like multi + worker GPU or TPU pod (slice). Otherwise, False. + """ + + def __init__(self, + strategy, + params, + model_fn, + loss_fn, + is_multi_host=False): + + self._params = params + self._model_fn = model_fn + self._loss_fn = loss_fn + self._strategy = strategy + self._checkpoint_name = 'ctl_step_{step}.ckpt' + self._is_multi_host = is_multi_host + self.train_summary_writer = None + self.eval_summary_writer = None + self.global_train_step = None + + @property + def checkpoint_name(self): + """Returns default checkpoint name.""" + return self._checkpoint_name + + @checkpoint_name.setter + def checkpoint_name(self, name): + """Sets default summary writer for the current thread.""" + self._checkpoint_name = name + + def loss_fn(self): + return self._loss_fn() + + def model_fn(self, params): + return self._model_fn(params) + + def _save_config(self, model_dir): + """Save parameters to config files if model_dir is defined.""" + + logging.info('Save config to model_dir %s.', model_dir) + if model_dir: + if not tf.io.gfile.exists(model_dir): + tf.io.gfile.makedirs(model_dir) + self._params.lock() + params_dict.save_params_dict_to_yaml(self._params, + model_dir + '/params.yaml') + else: + logging.warning('model_dir is empty, so skip the save config.') + + def _get_input_iterator( + self, input_fn: Callable[..., tf.data.Dataset], + strategy: tf.distribute.Strategy) -> Optional[Iterator[Any]]: + """Returns distributed dataset iterator. + + Args: + input_fn: (params: dict) -> tf.data.Dataset. + strategy: an instance of tf.distribute.Strategy. + + Returns: + An iterator that yields input tensors. + """ + + if input_fn is None: + return None + # When training with multiple TPU workers, datasets needs to be cloned + # across workers. Since Dataset instance cannot be cloned in eager mode, + # we instead pass callable that returns a dataset. + if self._is_multi_host: + return iter( + strategy.experimental_distribute_datasets_from_function(input_fn)) + else: + input_data = input_fn() + return iter(strategy.experimental_distribute_dataset(input_data)) + + def _create_replicated_step(self, + strategy, + model, + loss_fn, + optimizer, + metric=None): + + def _replicated_step(inputs): + """Replicated training step.""" + inputs, labels = inputs + + with tf.GradientTape() as tape: + outputs = model(inputs, training=True) + prediction_loss = loss_fn(labels, outputs) + loss = tf.reduce_mean(prediction_loss) + loss = loss / strategy.num_replicas_in_sync + if isinstance(metric, tf.keras.metrics.Metric): + metric.update_state(labels, outputs) + else: + logging.error('train metric is not an instance of ' + 'tf.keras.metrics.Metric.') + + grads = tape.gradient(loss, model.trainable_variables) + optimizer.apply_gradients(zip(grads, model.trainable_variables)) + return loss + + return _replicated_step + + def _create_train_step(self, + strategy, + model, + loss_fn, + optimizer, + metric=None): + """Creates a distributed training step. + + Args: + strategy: an instance of tf.distribute.Strategy. + model: (Tensor, bool) -> Tensor. model function. + loss_fn: (y_true: Tensor, y_pred: Tensor) -> Tensor. + optimizer: tf.keras.optimizers.Optimizer. + iterator: an iterator that yields input tensors. + metric: tf.keras.metrics.Metric subclass. + + Returns: + The training step callable. + """ + _replicated_step = self._create_replicated_step(strategy, model, loss_fn, + optimizer, metric) + + @tf.function + def train_step(iterator, num_steps): + """Performs a distributed training step. + + Args: + iterator: an iterator that yields input tensors. + + Returns: + The loss tensor. + """ + if not isinstance(num_steps, tf.Tensor): + raise ValueError('steps should be an Tensor. Python object may cause ' + 'retracing.') + + per_replica_losses = strategy.run( + _replicated_step, args=(next(iterator),)) + for _ in tf.range(num_steps - 1): + per_replica_losses = strategy.run( + _replicated_step, args=(next(iterator),)) + + # For reporting, we returns the mean of losses. + losses = tf.nest.map_structure( + lambda x: strategy.reduce(tf.distribute.ReduceOp.MEAN, x, axis=None), + per_replica_losses) + return losses + + return train_step + + def _create_test_step(self, strategy, model, metric): + """Creates a distributed test step.""" + + @tf.function + def test_step(iterator): + """Calculates evaluation metrics on distributed devices.""" + if not metric: + logging.info('Skip test_step because metric is None (%s)', metric) + return None, None + if not isinstance(metric, tf.keras.metrics.Metric): + raise ValueError( + 'Metric must be an instance of tf.keras.metrics.Metric ' + 'for running in test_step. Actual {}'.format(metric)) + + def _test_step_fn(inputs): + """Replicated accuracy calculation.""" + inputs, labels = inputs + model_outputs = model(inputs, training=False) + metric.update_state(labels, model_outputs) + return labels, model_outputs + + return strategy.run(_test_step_fn, args=(next(iterator),)) + + return test_step + + def train(self, + train_input_fn: Callable[[params_dict.ParamsDict], tf.data.Dataset], + eval_input_fn: Callable[[params_dict.ParamsDict], + tf.data.Dataset] = None, + model_dir: Text = None, + total_steps: int = 1, + iterations_per_loop: int = 1, + train_metric_fn: Callable[[], Any] = None, + eval_metric_fn: Callable[[], Any] = None, + summary_writer_fn: Callable[[Text, Text], + SummaryWriter] = SummaryWriter, + init_checkpoint: Callable[[tf.keras.Model], Any] = None, + custom_callbacks: List[tf.keras.callbacks.Callback] = None, + save_config: bool = True): + """Runs distributed training. + + Args: + train_input_fn: (params: dict) -> tf.data.Dataset training data input + function. + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + model_dir: the folder path for model checkpoints. + total_steps: total training steps. + iterations_per_loop: train steps per loop. After each loop, this job will + update metrics like loss and save checkpoint. + train_metric_fn: metric_fn for evaluation in train_step. + eval_metric_fn: metric_fn for evaluation in test_step. + summary_writer_fn: function to create summary writer. + init_checkpoint: function to load checkpoint. + custom_callbacks: A list of Keras Callbacks objects to run during + training. More specifically, `on_batch_begin()`, `on_batch_end()`, + methods are invoked during training. + save_config: bool. Whether to save params to model_dir. + + Returns: + The training loss and eval metrics. + """ + assert train_input_fn is not None + if train_metric_fn and not callable(train_metric_fn): + raise ValueError('if `train_metric_fn` is specified, ' + 'train_metric_fn must be a callable.') + if eval_metric_fn and not callable(eval_metric_fn): + raise ValueError('if `eval_metric_fn` is specified, ' + 'eval_metric_fn must be a callable.') + train_metric_fn = train_metric_fn or _no_metric + eval_metric_fn = eval_metric_fn or _no_metric + + if custom_callbacks and iterations_per_loop != 1: + logging.warning( + 'It is sematically wrong to run callbacks when ' + 'iterations_per_loop is not one (%s)', iterations_per_loop) + + custom_callbacks = custom_callbacks or [] + + def _run_callbacks_on_batch_begin(batch): + """Runs custom callbacks at the start of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + if callback: + callback.on_batch_begin(batch) + + def _run_callbacks_on_batch_end(batch): + """Runs custom callbacks at the end of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + if callback: + callback.on_batch_end(batch) + + if save_config: + self._save_config(model_dir) + + if FLAGS.save_checkpoint_freq: + save_freq = FLAGS.save_checkpoint_freq + else: + save_freq = iterations_per_loop + + params = self._params + strategy = self._strategy + # To reduce unnecessary send/receive input pipeline operation, we place + # input pipeline ops in worker task. + train_iterator = self._get_input_iterator(train_input_fn, strategy) + train_loss = None + eval_metric_result = None + with strategy.scope(): + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model = self.model_fn(params.as_dict()) + if not hasattr(model, 'optimizer'): + raise ValueError('User should set optimizer attribute to model ' + 'inside `model_fn`.') + optimizer = model.optimizer + + # Training loop starts here. + checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer) + latest_checkpoint_file = tf.train.latest_checkpoint(model_dir) + initial_step = 0 + if latest_checkpoint_file: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint_file) + checkpoint.restore(latest_checkpoint_file) + initial_step = optimizer.iterations.numpy() + logging.info('Loading from checkpoint file completed. Init step %d', + initial_step) + elif init_checkpoint: + logging.info('Restoring from init checkpoint function') + init_checkpoint(model) + logging.info('Loading from init checkpoint file completed') + + current_step = optimizer.iterations.numpy() + checkpoint_name = self.checkpoint_name + + eval_metric = eval_metric_fn() + train_metric = train_metric_fn() + train_summary_writer = summary_writer_fn(model_dir, 'eval_train') + self.train_summary_writer = train_summary_writer.writer + + test_summary_writer = summary_writer_fn(model_dir, 'eval_test') + self.eval_summary_writer = test_summary_writer.writer + + # Use training summary writer in TimeHistory if it's in use + for cb in custom_callbacks: + if isinstance(cb, keras_utils.TimeHistory): + cb.summary_writer = self.train_summary_writer + + # Continue training loop. + train_step = self._create_train_step( + strategy=strategy, + model=model, + loss_fn=self.loss_fn(), + optimizer=optimizer, + metric=train_metric) + test_step = None + if eval_input_fn and eval_metric: + self.global_train_step = model.optimizer.iterations + test_step = self._create_test_step(strategy, model, metric=eval_metric) + + # Step-0 operations + _save_checkpoint( + checkpoint, model_dir, checkpoint_name.format(step=current_step)) + if test_step: + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation( + test_step, current_step, eval_metric, eval_iterator) + logging.info( + 'Step: %s evalation metric = %s.', current_step, eval_metric_result) + test_summary_writer( + metrics=eval_metric_result, step=optimizer.iterations) + eval_metric.reset_states() + + logging.info('Training started') + last_save_checkpoint_step = current_step + while current_step < total_steps: + + num_steps = _steps_to_run(current_step, total_steps, iterations_per_loop) + _run_callbacks_on_batch_begin(current_step) + train_loss = train_step(train_iterator, + tf.convert_to_tensor(num_steps, dtype=tf.int32)) + current_step += num_steps + + train_loss = tf.nest.map_structure(lambda x: x.numpy().astype(float), + train_loss) + + _run_callbacks_on_batch_end(current_step - 1) + if not isinstance(train_loss, dict): + train_loss = {'total_loss': train_loss} + if np.isnan(train_loss['total_loss']): + raise ValueError('total loss is NaN.') + + if train_metric: + train_metric_result = train_metric.result() + if isinstance(train_metric, tf.keras.metrics.Metric): + train_metric_result = tf.nest.map_structure( + lambda x: x.numpy().astype(float), train_metric_result) + if not isinstance(train_metric_result, dict): + train_metric_result = {'metric': train_metric_result} + train_metric_result.update(train_loss) + else: + train_metric_result = train_loss + if callable(optimizer.lr): + train_metric_result.update( + {'learning_rate': optimizer.lr(current_step).numpy()}) + else: + train_metric_result.update({'learning_rate': optimizer.lr.numpy()}) + logging.info('Train Step: %d/%d / loss = %s / training metric = %s', + current_step, total_steps, train_loss, + train_metric_result) + + train_summary_writer( + metrics=train_metric_result, step=optimizer.iterations) + + # Saves model checkpoints and run validation steps at every + # iterations_per_loop steps. + # To avoid repeated model saving, we do not save after the last + # step of training. + if save_freq > 0 and current_step < total_steps and ( + current_step - last_save_checkpoint_step) >= save_freq: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + last_save_checkpoint_step = current_step + + if test_step: + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Step: %s evalation metric = %s.', current_step, + eval_metric_result) + test_summary_writer( + metrics=eval_metric_result, step=optimizer.iterations) + + # Re-initialize evaluation metric, except the last step. + if eval_metric and current_step < total_steps: + eval_metric.reset_states() + if train_metric and current_step < total_steps: + train_metric.reset_states() + + # Reaches the end of training and saves the last checkpoint. + if last_save_checkpoint_step < total_steps: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + + if test_step: + logging.info('Running final evaluation after training is complete.') + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Final evaluation metric = %s.', eval_metric_result) + test_summary_writer( + metrics=eval_metric_result, step=optimizer.iterations) + + self.train_summary_writer.close() + self.eval_summary_writer.close() + + return train_loss, eval_metric_result + + def _run_evaluation(self, test_step, current_training_step, metric, + test_iterator): + """Runs validation steps and aggregate metrics.""" + if not test_iterator or not metric: + logging.warning( + 'Both test_iterator (%s) and metrics (%s) must not be None.', + test_iterator, metric) + return None + logging.info('Running evaluation after step: %s.', current_training_step) + while True: + try: + test_step(test_iterator) + except (StopIteration, tf.errors.OutOfRangeError): + break + + metric_result = metric.result() + if isinstance(metric, tf.keras.metrics.Metric): + metric_result = metric_result.numpy().astype(float) + logging.info('Step: [%d] Validation metric = %f', current_training_step, + metric_result) + return metric_result + + def evaluate_from_model_dir( + self, + model_dir: Text, + eval_input_fn: Callable[[params_dict.ParamsDict], tf.data.Dataset], + eval_metric_fn: Callable[[], Any], + total_steps: int = -1, + eval_timeout: int = None, + min_eval_interval: int = 180, + summary_writer_fn: Callable[[Text, Text], SummaryWriter] = SummaryWriter): + """Runs distributed evaluation on model folder. + + Args: + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + eval_metric_fn: metric_fn for evaluation in test_step. + model_dir: the folder for storing model checkpoints. + total_steps: total training steps. If the current step reaches the + total_steps, the evaluation loop will stop. + eval_timeout: The maximum number of seconds to wait between checkpoints. + If left as None, then the process will wait indefinitely. Used by + tf.train.checkpoints_iterator. + min_eval_interval: The minimum number of seconds between yielding + checkpoints. Used by tf.train.checkpoints_iterator. + summary_writer_fn: function to create summary writer. + + Returns: + Eval metrics dictionary of the last checkpoint. + """ + + if not model_dir: + raise ValueError('model_dir must be set.') + + def terminate_eval(): + tf.logging.info('Terminating eval after %d seconds of no checkpoints' % + eval_timeout) + return True + + summary_writer = summary_writer_fn(model_dir, 'eval') + self.eval_summary_writer = summary_writer.writer + + # Read checkpoints from the given model directory + # until `eval_timeout` seconds elapses. + for checkpoint_path in tf.train.checkpoints_iterator( + model_dir, + min_interval_secs=min_eval_interval, + timeout=eval_timeout, + timeout_fn=terminate_eval): + eval_metric_result, current_step = self.evaluate_checkpoint( + checkpoint_path=checkpoint_path, + eval_input_fn=eval_input_fn, + eval_metric_fn=eval_metric_fn, + summary_writer=summary_writer) + if total_steps > 0 and current_step >= total_steps: + logging.info('Evaluation finished after training step %d', current_step) + break + return eval_metric_result + + def evaluate_checkpoint(self, + checkpoint_path: Text, + eval_input_fn: Callable[[params_dict.ParamsDict], + tf.data.Dataset], + eval_metric_fn: Callable[[], Any], + summary_writer: SummaryWriter = None): + """Runs distributed evaluation on the one checkpoint. + + Args: + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + eval_metric_fn: metric_fn for evaluation in test_step. + checkpoint_path: the checkpoint to evaluate. + summary_writer_fn: function to create summary writer. + + Returns: + Eval metrics dictionary of the last checkpoint. + """ + if not callable(eval_metric_fn): + raise ValueError('if `eval_metric_fn` is specified, ' + 'eval_metric_fn must be a callable.') + + params = self._params + strategy = self._strategy + # To reduce unnecessary send/receive input pipeline operation, we place + # input pipeline ops in worker task. + with strategy.scope(): + + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model = self.model_fn(params.as_dict()) + checkpoint = tf.train.Checkpoint(model=model) + + eval_metric = eval_metric_fn() + assert eval_metric, 'eval_metric does not exist' + test_step = self._create_test_step(strategy, model, metric=eval_metric) + + logging.info('Starting to evaluate.') + if not checkpoint_path: + raise ValueError('checkpoint path is empty') + reader = tf.compat.v1.train.NewCheckpointReader(checkpoint_path) + current_step = reader.get_tensor( + 'optimizer/iter/.ATTRIBUTES/VARIABLE_VALUE') + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', checkpoint_path) + checkpoint.restore(checkpoint_path) + + self.global_train_step = model.optimizer.iterations + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Step: %s evalation metric = %s.', current_step, + eval_metric_result) + summary_writer(metrics=eval_metric_result, step=current_step) + eval_metric.reset_states() + + return eval_metric_result, current_step + + def predict(self): + return NotImplementedError('Unimplmented function.') + + +class ExecutorBuilder(object): + """Builder of DistributedExecutor. + + Example 1: Builds an executor with supported Strategy. + builder = ExecutorBuilder( + strategy_type='tpu', + strategy_config={'tpu': '/bns/xxx'}) + dist_executor = builder.build_executor( + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Example 2: Builds an executor with customized Strategy. + builder = ExecutorBuilder() + builder.strategy = + dist_executor = builder.build_executor( + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Example 3: Builds a customized executor with customized Strategy. + class MyDistributedExecutor(DistributedExecutor): + # implementation ... + + builder = ExecutorBuilder() + builder.strategy = + dist_executor = builder.build_executor( + class_ctor=MyDistributedExecutor, + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Args: + strategy_type: string. One of 'tpu', 'mirrored', 'multi_worker_mirrored'. If + None. User is responsible to set the strategy before calling + build_executor(...). + strategy_config: necessary config for constructing the proper Strategy. + Check strategy_flags_dict() for examples of the structure. + """ + + def __init__(self, strategy_type=None, strategy_config=None): + _ = distribution_utils.configure_cluster( + strategy_config.worker_hosts, strategy_config.task_index) + self._strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=strategy_type, + num_gpus=strategy_config.num_gpus, + all_reduce_alg=strategy_config.all_reduce_alg, + num_packs=strategy_config.num_packs, + tpu_address=strategy_config.tpu) + + @property + def strategy(self): + """Returns default checkpoint name.""" + return self._strategy + + @strategy.setter + def strategy(self, new_strategy): + """Sets default summary writer for the current thread.""" + self._strategy = new_strategy + + + def build_executor(self, + class_ctor=DistributedExecutor, + params=None, + model_fn=None, + loss_fn=None, + **kwargs): + """Creates an executor according to strategy type. + + See doc string of the DistributedExecutor.__init__ for more information of + the + input arguments. + + Args: + class_ctor: A constructor of executor (default: DistributedExecutor). + params: ParamsDict, all the model parameters and runtime parameters. + model_fn: Keras model function. + loss_fn: loss function. + **kwargs: other arguments to the executor constructor. + + Returns: + An instance of DistributedExecutor or its subclass. + """ + if self._strategy is None: + raise ValueError('`strategy` should not be None. You need to specify ' + '`strategy_type` in the builder contructor or directly ' + 'set the `strategy` property of the builder.') + return class_ctor( + strategy=self._strategy, + params=params, + model_fn=model_fn, + loss_fn=loss_fn, + **kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/README.md new file mode 100644 index 0000000..2c78b4e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/README.md @@ -0,0 +1,19 @@ +# TensorFlow Natural Language Processing Modelling Toolkit + +tensorflow/models/official/nlp provides a [modeling library](modeling) for constructing +NLP model achitectures, as well as TF2 reference implementations for +state-of-the-art models. + +The repository contains the following models, with implementations, pre-trained +model weights, usage scripts and conversion utilities: + +* [Albert](albert) +* [Bert](bert) +* [NHNet](nhnet) +* [XLNet](xlnet) +* [Transformer for translation](transformer) + +Addtional features: + +* Distributed trainable on both multi-GPU and TPU +* e2e training for custom models, including both pretraining and finetuning. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/README.md new file mode 100644 index 0000000..cfb726c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/README.md @@ -0,0 +1,332 @@ +# ALBERT (ALBERT: A Lite BERT for Self-supervised Learning of Language Representations) + +The academic paper which describes ALBERT in detail and provides full results on +a number of tasks can be found here: https://arxiv.org/abs/1909.11942. + +This repository contains TensorFlow 2.x implementation for ALBERT. + +## Contents + * [Contents](#contents) + * [Pre-trained Models](#pre-trained-models) + * [Restoring from Checkpoints](#restoring-from-checkpoints) + * [Set Up](#set-up) + * [Process Datasets](#process-datasets) + * [Fine-tuning with BERT](#fine-tuning-with-bert) + * [Cloud GPUs and TPUs](#cloud-gpus-and-tpus) + * [Sentence and Sentence-pair Classification Tasks](#sentence-and-sentence-pair-classification-tasks) + * [SQuAD 1.1](#squad-1.1) + + +## Pre-trained Models + +We released both checkpoints and tf.hub modules as the pretrained models for +fine-tuning. They are TF 2.x compatible and are converted from the ALBERT v2 +checkpoints released in TF 1.x official ALBERT repository +[google-research/albert](https://github.com/google-research/albert) +in order to keep consistent with ALBERT paper. + +Our current released checkpoints are exactly the same as TF 1.x official ALBERT +repository. + +### Access to Pretrained Checkpoints + +Pretrained checkpoints can be found in the following links: + +**Note: We implemented ALBERT using Keras functional-style networks in [nlp/modeling](../modeling). +ALBERT V2 models compatible with TF 2.x checkpoints are:** + +* **[`ALBERT V2 Base`](https://storage.googleapis.com/cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base.tar.gz)**: + 12-layer, 768-hidden, 12-heads, 12M parameters +* **[`ALBERT V2 Large`](https://storage.googleapis.com/cloud-tpu-checkpoints/albert/checkpoints/albert_v2_large.tar.gz)**: + 24-layer, 1024-hidden, 16-heads, 18M parameters +* **[`ALBERT V2 XLarge`](https://storage.googleapis.com/cloud-tpu-checkpoints/albert/checkpoints/albert_v2_xlarge.tar.gz)**: + 24-layer, 2048-hidden, 32-heads, 60M parameters +* **[`ALBERT V2 XXLarge`](https://storage.googleapis.com/cloud-tpu-checkpoints/albert/checkpoints/albert_v2_xxlarge.tar.gz)**: + 12-layer, 4096-hidden, 64-heads, 235M parameters + +We recommend to host checkpoints on Google Cloud storage buckets when you use +Cloud GPU/TPU. + +### Restoring from Checkpoints + +`tf.train.Checkpoint` is used to manage model checkpoints in TF 2. To restore +weights from provided pre-trained checkpoints, you can use the following code: + +```python +init_checkpoint='the pretrained model checkpoint path.' +model=tf.keras.Model() # Bert pre-trained model as feature extractor. +checkpoint = tf.train.Checkpoint(model=model) +checkpoint.restore(init_checkpoint) +``` + +Checkpoints featuring native serialized Keras models +(i.e. model.load()/load_weights()) will be available soon. + +### Access to Pretrained hub modules. + +Pretrained tf.hub modules in TF 2.x SavedModel format can be found in the +following links: + +* **[`ALBERT V2 Base`](https://tfhub.dev/tensorflow/albert_en_base/1)**: + 12-layer, 768-hidden, 12-heads, 12M parameters +* **[`ALBERT V2 Large`](https://tfhub.dev/tensorflow/albert_en_large/1)**: + 24-layer, 1024-hidden, 16-heads, 18M parameters +* **[`ALBERT V2 XLarge`](https://tfhub.dev/tensorflow/albert_en_xlarge/1)**: + 24-layer, 2048-hidden, 32-heads, 60M parameters +* **[`ALBERT V2 XXLarge`](https://tfhub.dev/tensorflow/albert_en_xxlarge/1)**: + 12-layer, 4096-hidden, 64-heads, 235M parameters + +## Set Up + +```shell +export PYTHONPATH="$PYTHONPATH:/path/to/models" +``` + +Install `tf-nightly` to get latest updates: + +```shell +pip install tf-nightly-gpu +``` + +With TPU, GPU support is not necessary. First, you need to create a `tf-nightly` +TPU with [ctpu tool](https://github.com/tensorflow/tpu/tree/master/tools/ctpu): + +```shell +ctpu up -name --tf-version=”nightly” +``` + +Second, you need to install TF 2 `tf-nightly` on your VM: + +```shell +pip install tf-nightly +``` + +Warning: More details TPU-specific set-up instructions and tutorial should come +along with official TF 2.x release for TPU. Note that this repo is not +officially supported by Google Cloud TPU team yet until TF 2.1 released. + +## Process Datasets + +### Pre-training + +Pre-train ALBERT using TF2.x will come soon. +For now, please use [ALBERT research repo](https://github.com/google-research/ALBERT) +to pretrain the model and convert the checkpoint to TF2.x compatible ones using +[tf2_albert_encoder_checkpoint_converter.py](tf2_albert_encoder_checkpoint_converter.py). + + + +### Fine-tuning + +To prepare the fine-tuning data for final model training, use the +[`../data/create_finetuning_data.py`](../data/create_finetuning_data.py) script. +Note that different from BERT models that use word piece tokenzer, +ALBERT models employ sentence piece tokenizer. So the FLAG tokenizer_impl has +to be set to 'sentence_piece'. +Resulting datasets in `tf_record` format and training meta data should be later +passed to training or evaluation scripts. The task-specific arguments are +described in following sections: + +* GLUE + +Users can download the +[GLUE data](https://gluebenchmark.com/tasks) by running +[this script](https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e) +and unpack it to some directory `$GLUE_DIR`. + +```shell +export GLUE_DIR=~/glue +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base + +export TASK_NAME=MNLI +export OUTPUT_DIR=gs://some_bucket/datasets +python ../data/create_finetuning_data.py \ + --input_data_dir=${GLUE_DIR}/${TASK_NAME}/ \ + --sp_model_file=${ALBERT_DIR}/30k-clean.model \ + --train_data_output_path=${OUTPUT_DIR}/${TASK_NAME}_train.tf_record \ + --eval_data_output_path=${OUTPUT_DIR}/${TASK_NAME}_eval.tf_record \ + --meta_data_file_path=${OUTPUT_DIR}/${TASK_NAME}_meta_data \ + --fine_tuning_task_type=classification --max_seq_length=128 \ + --classification_task_name=${TASK_NAME} \ + --tokenizer_impl=sentence_piece +``` + +* SQUAD + +The [SQuAD website](https://rajpurkar.github.io/SQuAD-explorer/) contains +detailed information about the SQuAD datasets and evaluation. + +The necessary files can be found here: + +* [train-v1.1.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json) +* [dev-v1.1.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json) +* [evaluate-v1.1.py](https://github.com/allenai/bi-att-flow/blob/master/squad/evaluate-v1.1.py) +* [train-v2.0.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json) +* [dev-v2.0.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json) +* [evaluate-v2.0.py](https://worksheets.codalab.org/rest/bundles/0x6b567e1cf2e041ec80d7098f031c5c9e/contents/blob/) + +```shell +export SQUAD_DIR=~/squad +export SQUAD_VERSION=v1.1 +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export OUTPUT_DIR=gs://some_bucket/datasets + +python ../data/create_finetuning_data.py \ + --squad_data_file=${SQUAD_DIR}/train-${SQUAD_VERSION}.json \ + --sp_model_file=${ALBERT_DIR}/30k-clean.model \ + --train_data_output_path=${OUTPUT_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --meta_data_file_path=${OUTPUT_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --fine_tuning_task_type=squad --max_seq_length=384 \ + --tokenizer_impl=sentence_piece +``` + +## Fine-tuning with ALBERT + +### Cloud GPUs and TPUs + +* Cloud Storage + +The unzipped pre-trained model files can also be found in the Google Cloud +Storage folder `gs://cloud-tpu-checkpoints/albert/checkpoints`. For example: + +```shell +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export MODEL_DIR=gs://some_bucket/my_output_dir +``` + +Currently, users are able to access to `tf-nightly` TPUs and the following TPU +script should run with `tf-nightly`. + +* GPU -> TPU + +Just add the following flags to `run_classifier.py` or `run_squad.py`: + +```shell + --distribution_strategy=tpu + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +### Sentence and Sentence-pair Classification Tasks + +This example code fine-tunes `albert_v2_base` on the Microsoft Research +Paraphrase Corpus (MRPC) corpus, which only contains 3,600 examples and can +fine-tune in a few minutes on most GPUs. + +We use the `albert_v2_base` as an example throughout the +workflow. + + +```shell +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export MODEL_DIR=gs://some_bucket/my_output_dir +export GLUE_DIR=gs://some_bucket/datasets +export TASK=MRPC + +python run_classifier.py \ + --mode='train_and_eval' \ + --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \ + --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \ + --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \ + --bert_config_file=${ALBERT_DIR}/albert_config.json \ + --init_checkpoint=${ALBERT_DIR}/bert_model.ckpt \ + --train_batch_size=4 \ + --eval_batch_size=4 \ + --steps_per_loop=1 \ + --learning_rate=2e-5 \ + --num_train_epochs=3 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=mirrored +``` + +Alternatively, instead of specifying `init_checkpoint`, you can specify +`hub_module_url` to employ a pretraind BERT hub module, e.g., +` --hub_module_url=https://tfhub.dev/tensorflow/albert_en_base/1`. + +To use TPU, you only need to switch distribution strategy type to `tpu` with TPU +information and use remote storage for model checkpoints. + +```shell +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export TPU_IP_ADDRESS='???' +export MODEL_DIR=gs://some_bucket/my_output_dir +export GLUE_DIR=gs://some_bucket/datasets + +python run_classifier.py \ + --mode='train_and_eval' \ + --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \ + --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \ + --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \ + --bert_config_file=$ALBERT_DIR/albert_config.json \ + --init_checkpoint=$ALBERT_DIR/bert_model.ckpt \ + --train_batch_size=32 \ + --eval_batch_size=32 \ + --learning_rate=2e-5 \ + --num_train_epochs=3 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=tpu \ + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +### SQuAD 1.1 + +The Stanford Question Answering Dataset (SQuAD) is a popular question answering +benchmark dataset. See more in [SQuAD website](https://rajpurkar.github.io/SQuAD-explorer/). + +We use the `albert_v2_base` as an example throughout the +workflow. + +```shell +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export SQUAD_DIR=gs://some_bucket/datasets +export MODEL_DIR=gs://some_bucket/my_output_dir +export SQUAD_VERSION=v1.1 + +python run_squad.py \ + --input_meta_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --train_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --predict_file=${SQUAD_DIR}/dev-v1.1.json \ + --sp_model_file=${ALBERT_DIR}/30k-clean.model \ + --bert_config_file=$ALBERT_DIR/albert_config.json \ + --init_checkpoint=$ALBERT_DIR/bert_model.ckpt \ + --train_batch_size=4 \ + --predict_batch_size=4 \ + --learning_rate=8e-5 \ + --num_train_epochs=2 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=mirrored +``` + +Similarily, you can replace `init_checkpoint` FLAGS with `hub_module_url` to +specify a hub module path. + +To use TPU, you need switch distribution strategy type to `tpu` with TPU +information. + +```shell +export ALBERT_DIR=gs://cloud-tpu-checkpoints/albert/checkpoints/albert_v2_base +export TPU_IP_ADDRESS='???' +export MODEL_DIR=gs://some_bucket/my_output_dir +export SQUAD_DIR=gs://some_bucket/datasets +export SQUAD_VERSION=v1.1 + +python run_squad.py \ + --input_meta_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --train_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --predict_file=${SQUAD_DIR}/dev-v1.1.json \ + --sp_model_file=${ALBERT_DIR}/30k-clean.model \ + --bert_config_file=$ALBERT_DIR/albert_config.json \ + --init_checkpoint=$ALBERT_DIR/bert_model.ckpt \ + --train_batch_size=32 \ + --learning_rate=8e-5 \ + --num_train_epochs=2 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=tpu \ + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +The dev set predictions will be saved into a file called predictions.json in the +model_dir: + +```shell +python $SQUAD_DIR/evaluate-v1.1.py $SQUAD_DIR/dev-v1.1.json ./squad/predictions.json +``` diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/configs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/configs.py new file mode 100644 index 0000000..010789d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/configs.py @@ -0,0 +1,61 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""The ALBERT configurations.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import six + +from official.nlp.bert import configs + + +class AlbertConfig(configs.BertConfig): + """Configuration for `ALBERT`.""" + + def __init__(self, + embedding_size, + num_hidden_groups=1, + inner_group_num=1, + **kwargs): + """Constructs AlbertConfig. + + Args: + embedding_size: Size of the factorized word embeddings. + num_hidden_groups: Number of group for the hidden layers, parameters in + the same group are shared. Note that this value and also the following + 'inner_group_num' has to be 1 for now, because all released ALBERT + models set them to 1. We may support arbitary valid values in future. + inner_group_num: Number of inner repetition of attention and ffn. + **kwargs: The remaining arguments are the same as above 'BertConfig'. + """ + super(AlbertConfig, self).__init__(**kwargs) + self.embedding_size = embedding_size + + # TODO(chendouble): 'inner_group_num' and 'num_hidden_groups' are always 1 + # in the released ALBERT. Support other values in AlbertTransformerEncoder + # if needed. + if inner_group_num != 1 or num_hidden_groups != 1: + raise ValueError("We only support 'inner_group_num' and " + "'num_hidden_groups' as 1.") + + @classmethod + def from_dict(cls, json_object): + """Constructs a `AlbertConfig` from a Python dictionary of parameters.""" + config = AlbertConfig(embedding_size=None, vocab_size=None) + for (key, value) in six.iteritems(json_object): + config.__dict__[key] = value + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub.py new file mode 100644 index 0000000..9a1af1a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub.py @@ -0,0 +1,88 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A script to export the ALBERT core model as a TF-Hub SavedModel.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import app +from absl import flags +import tensorflow as tf +from typing import Text + +from official.nlp.albert import configs +from official.nlp.bert import bert_models + +FLAGS = flags.FLAGS + +flags.DEFINE_string("albert_config_file", None, + "Albert configuration file to define core albert layers.") +flags.DEFINE_string("model_checkpoint_path", None, + "File path to TF model checkpoint.") +flags.DEFINE_string("export_path", None, "TF-Hub SavedModel destination path.") +flags.DEFINE_string( + "sp_model_file", None, + "The sentence piece model file that the ALBERT model was trained on.") + + +def create_albert_model( + albert_config: configs.AlbertConfig) -> tf.keras.Model: + """Creates an ALBERT keras core model from ALBERT configuration. + + Args: + albert_config: An `AlbertConfig` to create the core model. + + Returns: + A keras model. + """ + # Adds input layers just as placeholders. + input_word_ids = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_word_ids") + input_mask = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_mask") + input_type_ids = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_type_ids") + transformer_encoder = bert_models.get_transformer_encoder( + albert_config, sequence_length=None) + sequence_output, pooled_output = transformer_encoder( + [input_word_ids, input_mask, input_type_ids]) + # To keep consistent with legacy hub modules, the outputs are + # "pooled_output" and "sequence_output". + return tf.keras.Model( + inputs=[input_word_ids, input_mask, input_type_ids], + outputs=[pooled_output, sequence_output]), transformer_encoder + + +def export_albert_tfhub(albert_config: configs.AlbertConfig, + model_checkpoint_path: Text, hub_destination: Text, + sp_model_file: Text): + """Restores a tf.keras.Model and saves for TF-Hub.""" + core_model, encoder = create_albert_model(albert_config) + checkpoint = tf.train.Checkpoint(model=encoder) + checkpoint.restore(model_checkpoint_path).assert_consumed() + core_model.sp_model_file = tf.saved_model.Asset(sp_model_file) + core_model.save(hub_destination, include_optimizer=False, save_format="tf") + + +def main(_): + albert_config = configs.AlbertConfig.from_json_file( + FLAGS.albert_config_file) + export_albert_tfhub(albert_config, FLAGS.model_checkpoint_path, + FLAGS.export_path, FLAGS.sp_model_file) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub_test.py new file mode 100644 index 0000000..4973090 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/export_albert_tfhub_test.py @@ -0,0 +1,89 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests official.nlp.albert.export_albert_tfhub.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +import numpy as np + +import tensorflow as tf +import tensorflow_hub as hub + +from official.nlp.albert import configs +from official.nlp.albert import export_albert_tfhub + + +class ExportAlbertTfhubTest(tf.test.TestCase): + + def test_export_albert_tfhub(self): + # Exports a savedmodel for TF-Hub + albert_config = configs.AlbertConfig( + vocab_size=100, + embedding_size=8, + hidden_size=16, + intermediate_size=32, + max_position_embeddings=128, + num_attention_heads=2, + num_hidden_layers=1) + bert_model, encoder = export_albert_tfhub.create_albert_model(albert_config) + model_checkpoint_dir = os.path.join(self.get_temp_dir(), "checkpoint") + checkpoint = tf.train.Checkpoint(model=encoder) + checkpoint.save(os.path.join(model_checkpoint_dir, "test")) + model_checkpoint_path = tf.train.latest_checkpoint(model_checkpoint_dir) + + sp_model_file = os.path.join(self.get_temp_dir(), "sp_tokenizer.model") + with tf.io.gfile.GFile(sp_model_file, "w") as f: + f.write("dummy content") + + hub_destination = os.path.join(self.get_temp_dir(), "hub") + export_albert_tfhub.export_albert_tfhub( + albert_config, + model_checkpoint_path, + hub_destination, + sp_model_file=sp_model_file) + + # Restores a hub KerasLayer. + hub_layer = hub.KerasLayer(hub_destination, trainable=True) + + if hasattr(hub_layer, "resolved_object"): + with tf.io.gfile.GFile( + hub_layer.resolved_object.sp_model_file.asset_path.numpy()) as f: + self.assertEqual("dummy content", f.read()) + # Checks the hub KerasLayer. + for source_weight, hub_weight in zip(bert_model.trainable_weights, + hub_layer.trainable_weights): + self.assertAllClose(source_weight.numpy(), hub_weight.numpy()) + + dummy_ids = np.zeros((2, 10), dtype=np.int32) + hub_outputs = hub_layer([dummy_ids, dummy_ids, dummy_ids]) + source_outputs = bert_model([dummy_ids, dummy_ids, dummy_ids]) + + # The outputs of hub module are "pooled_output" and "sequence_output", + # while the outputs of encoder is in reversed order, i.e., + # "sequence_output" and "pooled_output". + encoder_outputs = reversed(encoder([dummy_ids, dummy_ids, dummy_ids])) + self.assertEqual(hub_outputs[0].shape, (2, 16)) + self.assertEqual(hub_outputs[1].shape, (2, 10, 16)) + for source_output, hub_output, encoder_output in zip( + source_outputs, hub_outputs, encoder_outputs): + self.assertAllClose(source_output.numpy(), hub_output.numpy()) + self.assertAllClose(source_output.numpy(), encoder_output.numpy()) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_classifier.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_classifier.py new file mode 100644 index 0000000..51a6d42 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_classifier.py @@ -0,0 +1,69 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ALBERT classification finetuning runner in tf2.x.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json + +from absl import app +from absl import flags +import tensorflow as tf + +from official.nlp.albert import configs as albert_configs +from official.nlp.bert import run_classifier as run_classifier_bert +from official.utils.misc import distribution_utils + +FLAGS = flags.FLAGS + + +def main(_): + # Users should always run this script under TF 2.x + + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + input_meta_data = json.loads(reader.read().decode('utf-8')) + + if not FLAGS.model_dir: + FLAGS.model_dir = '/tmp/bert20/' + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + tpu_address=FLAGS.tpu) + max_seq_length = input_meta_data['max_seq_length'] + train_input_fn = run_classifier_bert.get_dataset_fn( + FLAGS.train_data_path, + max_seq_length, + FLAGS.train_batch_size, + is_training=True) + eval_input_fn = run_classifier_bert.get_dataset_fn( + FLAGS.eval_data_path, + max_seq_length, + FLAGS.eval_batch_size, + is_training=False) + + albert_config = albert_configs.AlbertConfig.from_json_file( + FLAGS.bert_config_file) + run_classifier_bert.run_bert(strategy, input_meta_data, albert_config, + train_input_fn, eval_input_fn) + + +if __name__ == '__main__': + flags.mark_flag_as_required('bert_config_file') + flags.mark_flag_as_required('input_meta_data_path') + flags.mark_flag_as_required('model_dir') + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_squad.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_squad.py new file mode 100644 index 0000000..ed3c2da --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/run_squad.py @@ -0,0 +1,139 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Run ALBERT on SQuAD 1.1 and SQuAD 2.0 in TF 2.x.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import time + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.nlp.albert import configs as albert_configs +from official.nlp.bert import run_squad_helper +from official.nlp.bert import tokenization +from official.nlp.data import squad_lib_sp +from official.utils.misc import distribution_utils + +flags.DEFINE_string( + 'sp_model_file', None, + 'The path to the sentence piece model. Used by sentence piece tokenizer ' + 'employed by ALBERT.') + +# More flags can be found in run_squad_helper. +run_squad_helper.define_common_squad_flags() + +FLAGS = flags.FLAGS + + +def train_squad(strategy, + input_meta_data, + custom_callbacks=None, + run_eagerly=False): + """Runs bert squad training.""" + bert_config = albert_configs.AlbertConfig.from_json_file( + FLAGS.bert_config_file) + run_squad_helper.train_squad(strategy, input_meta_data, bert_config, + custom_callbacks, run_eagerly) + + +def predict_squad(strategy, input_meta_data): + """Makes predictions for the squad dataset.""" + bert_config = albert_configs.AlbertConfig.from_json_file( + FLAGS.bert_config_file) + tokenizer = tokenization.FullSentencePieceTokenizer( + sp_model_file=FLAGS.sp_model_file) + + run_squad_helper.predict_squad(strategy, input_meta_data, tokenizer, + bert_config, squad_lib_sp) + + +def eval_squad(strategy, input_meta_data): + """Evaluate on the squad dataset.""" + bert_config = albert_configs.AlbertConfig.from_json_file( + FLAGS.bert_config_file) + tokenizer = tokenization.FullSentencePieceTokenizer( + sp_model_file=FLAGS.sp_model_file) + + eval_metrics = run_squad_helper.eval_squad( + strategy, input_meta_data, tokenizer, bert_config, squad_lib_sp) + return eval_metrics + + +def export_squad(model_export_path, input_meta_data): + """Exports a trained model as a `SavedModel` for inference. + + Args: + model_export_path: a string specifying the path to the SavedModel directory. + input_meta_data: dictionary containing meta data about input and model. + + Raises: + Export path is not specified, got an empty string or None. + """ + bert_config = albert_configs.AlbertConfig.from_json_file( + FLAGS.bert_config_file) + run_squad_helper.export_squad(model_export_path, input_meta_data, bert_config) + + +def main(_): + # Users should always run this script under TF 2.x + + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + input_meta_data = json.loads(reader.read().decode('utf-8')) + + if FLAGS.mode == 'export_only': + export_squad(FLAGS.model_export_path, input_meta_data) + return + + # Configures cluster spec for multi-worker distribution strategy. + if FLAGS.num_gpus > 0: + _ = distribution_utils.configure_cluster(FLAGS.worker_hosts, + FLAGS.task_index) + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + all_reduce_alg=FLAGS.all_reduce_alg, + tpu_address=FLAGS.tpu) + + if 'train' in FLAGS.mode: + train_squad(strategy, input_meta_data, run_eagerly=FLAGS.run_eagerly) + if 'predict' in FLAGS.mode: + predict_squad(strategy, input_meta_data) + if 'eval' in FLAGS.mode: + eval_metrics = eval_squad(strategy, input_meta_data) + f1_score = eval_metrics['final_f1'] + logging.info('SQuAD eval F1-score: %f', f1_score) + summary_dir = os.path.join(FLAGS.model_dir, 'summaries', 'eval') + summary_writer = tf.summary.create_file_writer(summary_dir) + with summary_writer.as_default(): + # TODO(lehou): write to the correct step number. + tf.summary.scalar('F1-score', f1_score, step=0) + summary_writer.flush() + # Also write eval_metrics to json file. + squad_lib_sp.write_to_json_files( + eval_metrics, os.path.join(summary_dir, 'eval_metrics.json')) + time.sleep(60) + + +if __name__ == '__main__': + flags.mark_flag_as_required('bert_config_file') + flags.mark_flag_as_required('model_dir') + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/tf2_albert_encoder_checkpoint_converter.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/tf2_albert_encoder_checkpoint_converter.py new file mode 100644 index 0000000..682bed8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/albert/tf2_albert_encoder_checkpoint_converter.py @@ -0,0 +1,132 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A converter from a tf1 ALBERT encoder checkpoint to a tf2 encoder checkpoint. + +The conversion will yield an object-oriented checkpoint that can be used +to restore a AlbertTransformerEncoder object. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app +from absl import flags + +import tensorflow as tf +from official.modeling import activations +from official.nlp.albert import configs +from official.nlp.bert import tf1_checkpoint_converter_lib +from official.nlp.modeling import networks + +FLAGS = flags.FLAGS + +flags.DEFINE_string("albert_config_file", None, + "Albert configuration file to define core bert layers.") +flags.DEFINE_string( + "checkpoint_to_convert", None, + "Initial checkpoint from a pretrained BERT model core (that is, only the " + "BertModel, with no task heads.)") +flags.DEFINE_string("converted_checkpoint_path", None, + "Name for the created object-based V2 checkpoint.") + + +ALBERT_NAME_REPLACEMENTS = ( + ("bert/encoder/", ""), + ("bert/", ""), + ("embeddings/word_embeddings", "word_embeddings/embeddings"), + ("embeddings/position_embeddings", "position_embedding/embeddings"), + ("embeddings/token_type_embeddings", "type_embeddings/embeddings"), + ("embeddings/LayerNorm", "embeddings/layer_norm"), + ("embedding_hidden_mapping_in", "embedding_projection"), + ("group_0/inner_group_0/", ""), + ("attention_1/self", "self_attention"), + ("attention_1/output/dense", "self_attention_output"), + ("LayerNorm/", "self_attention_layer_norm/"), + ("ffn_1/intermediate/dense", "intermediate"), + ("ffn_1/intermediate/output/dense", "output"), + ("LayerNorm_1/", "output_layer_norm/"), + ("pooler/dense", "pooler_transform"), + ("cls/predictions/output_bias", "cls/predictions/output_bias/bias"), + ("cls/seq_relationship/output_bias", "predictions/transform/logits/bias"), + ("cls/seq_relationship/output_weights", + "predictions/transform/logits/kernel"), +) + + +def _create_albert_model(cfg): + """Creates a BERT keras core model from BERT configuration. + + Args: + cfg: A `BertConfig` to create the core model. + + Returns: + A keras model. + """ + albert_encoder = networks.AlbertTransformerEncoder( + vocab_size=cfg.vocab_size, + hidden_size=cfg.hidden_size, + embedding_width=cfg.embedding_size, + num_layers=cfg.num_hidden_layers, + num_attention_heads=cfg.num_attention_heads, + intermediate_size=cfg.intermediate_size, + activation=activations.gelu, + dropout_rate=cfg.hidden_dropout_prob, + attention_dropout_rate=cfg.attention_probs_dropout_prob, + sequence_length=cfg.max_position_embeddings, + type_vocab_size=cfg.type_vocab_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=cfg.initializer_range)) + return albert_encoder + + +def convert_checkpoint(bert_config, output_path, v1_checkpoint): + """Converts a V1 checkpoint into an OO V2 checkpoint.""" + output_dir, _ = os.path.split(output_path) + + # Create a temporary V1 name-converted checkpoint in the output directory. + temporary_checkpoint_dir = os.path.join(output_dir, "temp_v1") + temporary_checkpoint = os.path.join(temporary_checkpoint_dir, "ckpt") + tf1_checkpoint_converter_lib.convert( + checkpoint_from_path=v1_checkpoint, + checkpoint_to_path=temporary_checkpoint, + num_heads=bert_config.num_attention_heads, + name_replacements=ALBERT_NAME_REPLACEMENTS, + permutations=tf1_checkpoint_converter_lib.BERT_V2_PERMUTATIONS, + exclude_patterns=["adam", "Adam"]) + + # Create a V2 checkpoint from the temporary checkpoint. + model = _create_albert_model(bert_config) + tf1_checkpoint_converter_lib.create_v2_checkpoint(model, temporary_checkpoint, + output_path) + + # Clean up the temporary checkpoint, if it exists. + try: + tf.io.gfile.rmtree(temporary_checkpoint_dir) + except tf.errors.OpError: + # If it doesn't exist, we don't need to clean it up; continue. + pass + + +def main(_): + output_path = FLAGS.converted_checkpoint_path + v1_checkpoint = FLAGS.checkpoint_to_convert + albert_config = configs.AlbertConfig.from_json_file(FLAGS.albert_config_file) + convert_checkpoint(albert_config, output_path, v1_checkpoint) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/README.md new file mode 100644 index 0000000..c3c8297 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/README.md @@ -0,0 +1,350 @@ +# BERT (Bidirectional Encoder Representations from Transformers) + +The academic paper which describes BERT in detail and provides full results on a +number of tasks can be found here: https://arxiv.org/abs/1810.04805. + +This repository contains TensorFlow 2.x implementation for BERT. + +## Contents + * [Contents](#contents) + * [Pre-trained Models](#pre-trained-models) + * [Restoring from Checkpoints](#restoring-from-checkpoints) + * [Set Up](#set-up) + * [Process Datasets](#process-datasets) + * [Fine-tuning with BERT](#fine-tuning-with-bert) + * [Cloud GPUs and TPUs](#cloud-gpus-and-tpus) + * [Sentence and Sentence-pair Classification Tasks](#sentence-and-sentence-pair-classification-tasks) + * [SQuAD 1.1](#squad-1.1) + + +## Pre-trained Models + +We released both checkpoints and tf.hub modules as the pretrained models for +fine-tuning. They are TF 2.x compatible and are converted from the checkpoints +released in TF 1.x official BERT repository +[google-research/bert](https://github.com/google-research/bert) +in order to keep consistent with BERT paper. + + +### Access to Pretrained Checkpoints + +Pretrained checkpoints can be found in the following links: + +**Note: We have switched BERT implementation +to use Keras functional-style networks in [nlp/modeling](../modeling). +The new checkpoints are:** + +* **[`BERT-Large, Uncased (Whole Word Masking)`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/wwm_uncased_L-24_H-1024_A-16.tar.gz)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Large, Cased (Whole Word Masking)`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/wwm_cased_L-24_H-1024_A-16.tar.gz)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Base, Uncased`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/uncased_L-12_H-768_A-12.tar.gz)**: + 12-layer, 768-hidden, 12-heads, 110M parameters +* **[`BERT-Large, Uncased`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16.tar.gz)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Base, Cased`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/cased_L-12_H-768_A-12.tar.gz)**: + 12-layer, 768-hidden, 12-heads , 110M parameters +* **[`BERT-Large, Cased`](https://storage.googleapis.com/cloud-tpu-checkpoints/bert/keras_bert/cased_L-24_H-1024_A-16.tar.gz)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters + +We recommend to host checkpoints on Google Cloud storage buckets when you use +Cloud GPU/TPU. + +### Restoring from Checkpoints + +`tf.train.Checkpoint` is used to manage model checkpoints in TF 2. To restore +weights from provided pre-trained checkpoints, you can use the following code: + +```python +init_checkpoint='the pretrained model checkpoint path.' +model=tf.keras.Model() # Bert pre-trained model as feature extractor. +checkpoint = tf.train.Checkpoint(model=model) +checkpoint.restore(init_checkpoint) +``` + +Checkpoints featuring native serialized Keras models +(i.e. model.load()/load_weights()) will be available soon. + +### Access to Pretrained hub modules. + +Pretrained tf.hub modules in TF 2.x SavedModel format can be found in the +following links: + +* **[`BERT-Large, Uncased (Whole Word Masking)`](https://tfhub.dev/tensorflow/bert_en_wwm_uncased_L-24_H-1024_A-16/1)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Large, Cased (Whole Word Masking)`](https://tfhub.dev/tensorflow/bert_en_wwm_cased_L-24_H-1024_A-16/1)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Base, Uncased`](https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/1)**: + 12-layer, 768-hidden, 12-heads, 110M parameters +* **[`BERT-Large, Uncased`](https://tfhub.dev/tensorflow/bert_en_uncased_L-24_H-1024_A-16/1)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Base, Cased`](https://tfhub.dev/tensorflow/bert_en_cased_L-12_H-768_A-12/1)**: + 12-layer, 768-hidden, 12-heads , 110M parameters +* **[`BERT-Large, Cased`](https://tfhub.dev/tensorflow/bert_en_cased_L-24_H-1024_A-16/1)**: + 24-layer, 1024-hidden, 16-heads, 340M parameters +* **[`BERT-Base, Multilingual Cased`](https://tfhub.dev/tensorflow/bert_multi_cased_L-12_H-768_A-12/1)**: + 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters +* **[`BERT-Base, Chinese`](https://tfhub.dev/tensorflow/bert_zh_L-12_H-768_A-12/1)**: + Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, + 110M parameters + +## Set Up + +```shell +export PYTHONPATH="$PYTHONPATH:/path/to/models" +``` + +Install `tf-nightly` to get latest updates: + +```shell +pip install tf-nightly-gpu +``` + +With TPU, GPU support is not necessary. First, you need to create a `tf-nightly` +TPU with [ctpu tool](https://github.com/tensorflow/tpu/tree/master/tools/ctpu): + +```shell +ctpu up -name --tf-version=”nightly” +``` + +Second, you need to install TF 2 `tf-nightly` on your VM: + +```shell +pip install tf-nightly +``` + +Warning: More details TPU-specific set-up instructions and tutorial should come +along with official TF 2.x release for TPU. Note that this repo is not +officially supported by Google Cloud TPU team yet until TF 2.1 released. + +## Process Datasets + +### Pre-training + +There is no change to generate pre-training data. Please use the script +[`../data/create_pretraining_data.py`](../data/create_pretraining_data.py) +which is essentially branched from [BERT research repo](https://github.com/google-research/bert) +to get processed pre-training data and it adapts to TF2 symbols and python3 +compatibility. + + +### Fine-tuning + +To prepare the fine-tuning data for final model training, use the +[`../data/create_finetuning_data.py`](../data/create_finetuning_data.py) script. +Resulting datasets in `tf_record` format and training meta data should be later +passed to training or evaluation scripts. The task-specific arguments are +described in following sections: + +* GLUE + +Users can download the +[GLUE data](https://gluebenchmark.com/tasks) by running +[this script](https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e) +and unpack it to some directory `$GLUE_DIR`. + +```shell +export GLUE_DIR=~/glue +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 + +export TASK_NAME=MNLI +export OUTPUT_DIR=gs://some_bucket/datasets +python ../data/create_finetuning_data.py \ + --input_data_dir=${GLUE_DIR}/${TASK_NAME}/ \ + --vocab_file=${BERT_DIR}/vocab.txt \ + --train_data_output_path=${OUTPUT_DIR}/${TASK_NAME}_train.tf_record \ + --eval_data_output_path=${OUTPUT_DIR}/${TASK_NAME}_eval.tf_record \ + --meta_data_file_path=${OUTPUT_DIR}/${TASK_NAME}_meta_data \ + --fine_tuning_task_type=classification --max_seq_length=128 \ + --classification_task_name=${TASK_NAME} +``` + +* SQUAD + +The [SQuAD website](https://rajpurkar.github.io/SQuAD-explorer/) contains +detailed information about the SQuAD datasets and evaluation. + +The necessary files can be found here: + +* [train-v1.1.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json) +* [dev-v1.1.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json) +* [evaluate-v1.1.py](https://github.com/allenai/bi-att-flow/blob/master/squad/evaluate-v1.1.py) +* [train-v2.0.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json) +* [dev-v2.0.json](https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json) +* [evaluate-v2.0.py](https://worksheets.codalab.org/rest/bundles/0x6b567e1cf2e041ec80d7098f031c5c9e/contents/blob/) + +```shell +export SQUAD_DIR=~/squad +export SQUAD_VERSION=v1.1 +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export OUTPUT_DIR=gs://some_bucket/datasets + +python ../data/create_finetuning_data.py \ + --squad_data_file=${SQUAD_DIR}/train-${SQUAD_VERSION}.json \ + --vocab_file=${BERT_DIR}/vocab.txt \ + --train_data_output_path=${OUTPUT_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --meta_data_file_path=${OUTPUT_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --fine_tuning_task_type=squad --max_seq_length=384 +``` + +## Fine-tuning with BERT + +### Cloud GPUs and TPUs + +* Cloud Storage + +The unzipped pre-trained model files can also be found in the Google Cloud +Storage folder `gs://cloud-tpu-checkpoints/bert/keras_bert`. For example: + +```shell +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export MODEL_DIR=gs://some_bucket/my_output_dir +``` + +Currently, users are able to access to `tf-nightly` TPUs and the following TPU +script should run with `tf-nightly`. + +* GPU -> TPU + +Just add the following flags to `run_classifier.py` or `run_squad.py`: + +```shell + --distribution_strategy=tpu + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +### Sentence and Sentence-pair Classification Tasks + +This example code fine-tunes `BERT-Large` on the Microsoft Research Paraphrase +Corpus (MRPC) corpus, which only contains 3,600 examples and can fine-tune in a +few minutes on most GPUs. + +We use the `BERT-Large` (uncased_L-24_H-1024_A-16) as an example throughout the +workflow. +For GPU memory of 16GB or smaller, you may try to use `BERT-Base` +(uncased_L-12_H-768_A-12). + +```shell +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export MODEL_DIR=gs://some_bucket/my_output_dir +export GLUE_DIR=gs://some_bucket/datasets +export TASK=MRPC + +python run_classifier.py \ + --mode='train_and_eval' \ + --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \ + --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \ + --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \ + --bert_config_file=${BERT_DIR}/bert_config.json \ + --init_checkpoint=${BERT_DIR}/bert_model.ckpt \ + --train_batch_size=4 \ + --eval_batch_size=4 \ + --steps_per_loop=1 \ + --learning_rate=2e-5 \ + --num_train_epochs=3 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=mirrored +``` + +Alternatively, instead of specifying `init_checkpoint`, you can specify +`hub_module_url` to employ a pretraind BERT hub module, e.g., +` --hub_module_url=https://tfhub.dev/tensorflow/bert_en_uncased_L-24_H-1024_A-16/1`. + +To use TPU, you only need to switch distribution strategy type to `tpu` with TPU +information and use remote storage for model checkpoints. + +```shell +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export TPU_IP_ADDRESS='???' +export MODEL_DIR=gs://some_bucket/my_output_dir +export GLUE_DIR=gs://some_bucket/datasets +export TASK=MRPC + +python run_classifier.py \ + --mode='train_and_eval' \ + --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \ + --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \ + --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \ + --bert_config_file=${BERT_DIR}/bert_config.json \ + --init_checkpoint=${BERT_DIR}/bert_model.ckpt \ + --train_batch_size=32 \ + --eval_batch_size=32 \ + --steps_per_loop=1000 \ + --learning_rate=2e-5 \ + --num_train_epochs=3 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=tpu \ + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +Note that, we specify `steps_per_loop=1000` for TPU, because running a loop of +training steps inside a `tf.function` can significantly increase TPU utilization +and callbacks will not be called inside the loop. + +### SQuAD 1.1 + +The Stanford Question Answering Dataset (SQuAD) is a popular question answering +benchmark dataset. See more in [SQuAD website](https://rajpurkar.github.io/SQuAD-explorer/). + +We use the `BERT-Large` (uncased_L-24_H-1024_A-16) as an example throughout the +workflow. +For GPU memory of 16GB or smaller, you may try to use `BERT-Base` +(uncased_L-12_H-768_A-12). + +```shell +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export SQUAD_DIR=gs://some_bucket/datasets +export MODEL_DIR=gs://some_bucket/my_output_dir +export SQUAD_VERSION=v1.1 + +python run_squad.py \ + --input_meta_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --train_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --predict_file=${SQUAD_DIR}/dev-v1.1.json \ + --vocab_file=${BERT_DIR}/vocab.txt \ + --bert_config_file=${BERT_DIR}/bert_config.json \ + --init_checkpoint=${BERT_DIR}/bert_model.ckpt \ + --train_batch_size=4 \ + --predict_batch_size=4 \ + --learning_rate=8e-5 \ + --num_train_epochs=2 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=mirrored +``` + +Similarily, you can replace `init_checkpoint` FLAG with `hub_module_url` to +specify a hub module path. + +To use TPU, you need switch distribution strategy type to `tpu` with TPU +information. + +```shell +export BERT_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +export TPU_IP_ADDRESS='???' +export MODEL_DIR=gs://some_bucket/my_output_dir +export SQUAD_DIR=gs://some_bucket/datasets +export SQUAD_VERSION=v1.1 + +python run_squad.py \ + --input_meta_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_meta_data \ + --train_data_path=${SQUAD_DIR}/squad_${SQUAD_VERSION}_train.tf_record \ + --predict_file=${SQUAD_DIR}/dev-v1.1.json \ + --vocab_file=${BERT_DIR}/vocab.txt \ + --bert_config_file=${BERT_DIR}/bert_config.json \ + --init_checkpoint=${BERT_DIR}/bert_model.ckpt \ + --train_batch_size=32 \ + --learning_rate=8e-5 \ + --num_train_epochs=2 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=tpu \ + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` + +The dev set predictions will be saved into a file called predictions.json in the +model_dir: + +```shell +python $SQUAD_DIR/evaluate-v1.1.py $SQUAD_DIR/dev-v1.1.json ./squad/predictions.json +``` + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_cloud_tpu.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_cloud_tpu.md new file mode 100644 index 0000000..e5e6758 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_cloud_tpu.md @@ -0,0 +1,110 @@ +# BERT FineTuning with Cloud TPU: Sentence and Sentence-Pair Classification Tasks (TF 2.1) +This tutorial shows you how to train the Bidirectional Encoder Representations from Transformers (BERT) model on Cloud TPU. + + +## Set up Cloud Storage and Compute Engine VM +1. [Open a cloud shell window](https://console.cloud.google.com/?cloudshell=true&_ga=2.11844148.-1612541229.1552429951) +2. Create a variable for the project's name: +``` +export PROJECT_NAME=your-project_name +``` +3. Configure `gcloud` command-line tool to use the project where you want to create Cloud TPU. +``` +gcloud config set project ${PROJECT_NAME} +``` +4. Create a Cloud Storage bucket using the following command: +``` +gsutil mb -p ${PROJECT_NAME} -c standard -l europe-west4 -b on gs://your-bucket-name +``` +This Cloud Storage bucket stores the data you use to train your model and the training results. +5. Launch a Compute Engine VM and Cloud TPU using the ctpu up command. +``` +ctpu up --tpu-size=v3-8 \ + --machine-type=n1-standard-8 \ + --zone=europe-west4-a \ + --tf-version=2.1 [optional flags: --project, --name] +``` +6. The configuration you specified appears. Enter y to approve or n to cancel. +7. When the ctpu up command has finished executing, verify that your shell prompt has changed from username@project to username@tpuname. This change shows that you are now logged into your Compute Engine VM. +``` +gcloud compute ssh vm-name --zone=europe-west4-a +(vm)$ export TPU_NAME=vm-name +``` +As you continue these instructions, run each command that begins with `(vm)$` in your VM session window. + +## Prepare the Dataset +1. From your Compute Engine virtual machine (VM), install requirements.txt. +``` +(vm)$ cd /usr/share/models +(vm)$ sudo pip3 install -r official/requirements.txt +``` +2. Optional: download download_glue_data.py + +This tutorial uses the General Language Understanding Evaluation (GLUE) benchmark to evaluate and analyze the performance of the model. The GLUE data is provided for this tutorial at gs://cloud-tpu-checkpoints/bert/classification. + +## Define parameter values +Next, define several parameter values that are required when you train and evaluate your model: + +``` +(vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models" +(vm)$ export STORAGE_BUCKET=gs://your-bucket-name +(vm)$ export BERT_BASE_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16 +(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output +(vm)$ export GLUE_DIR=gs://cloud-tpu-checkpoints/bert/classification +(vm)$ export TASK=mnli +``` + +## Train the model +From your Compute Engine VM, run the following command. + +``` +(vm)$ python3 official/nlp/bert/run_classifier.py \ + --mode='train_and_eval' \ + --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \ + --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \ + --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \ + --bert_config_file=$BERT_BASE_DIR/bert_config.json \ + --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \ + --train_batch_size=32 \ + --eval_batch_size=32 \ + --learning_rate=2e-5 \ + --num_train_epochs=3 \ + --model_dir=${MODEL_DIR} \ + --distribution_strategy=tpu \ + --tpu=${TPU_NAME} +``` + +## Verify your results +The training takes approximately 1 hour on a v3-8 TPU. When script completes, you should see results similar to the following: +``` +Training Summary: +{'train_loss': 0.28142181038856506, +'last_train_metrics': 0.9467429518699646, +'eval_metrics': 0.8599063158035278, +'total_training_steps': 36813} +``` + +## Clean up +To avoid incurring charges to your GCP account for the resources used in this topic: +1. Disconnect from the Compute Engine VM: +``` +(vm)$ exit +``` +2. In your Cloud Shell, run ctpu delete with the --zone flag you used when you set up the Cloud TPU to delete your Compute Engine VM and your Cloud TPU: +``` +$ ctpu delete --zone=your-zone +``` +3. Run ctpu status specifying your zone to make sure you have no instances allocated to avoid unnecessary charges for TPU usage. The deletion might take several minutes. A response like the one below indicates there are no more allocated instances: +``` +$ ctpu status --zone=your-zone +``` +4. Run gsutil as shown, replacing your-bucket with the name of the Cloud Storage bucket you created for this tutorial: +``` +$ gsutil rm -r gs://your-bucket +``` + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_models.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_models.py new file mode 100644 index 0000000..04745fd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/bert_models.py @@ -0,0 +1,349 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""BERT models that are compatible with TF 2.0.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gin +import tensorflow as tf +import tensorflow_hub as hub + +from official.modeling import tf_utils +from official.nlp.albert import configs as albert_configs +from official.nlp.bert import configs +from official.nlp.modeling import losses +from official.nlp.modeling import models +from official.nlp.modeling import networks + + +class BertPretrainLossAndMetricLayer(tf.keras.layers.Layer): + """Returns layer that computes custom loss and metrics for pretraining.""" + + def __init__(self, vocab_size, **kwargs): + super(BertPretrainLossAndMetricLayer, self).__init__(**kwargs) + self._vocab_size = vocab_size + self.config = { + 'vocab_size': vocab_size, + } + + def _add_metrics(self, lm_output, lm_labels, lm_label_weights, + lm_example_loss, sentence_output, sentence_labels, + next_sentence_loss): + """Adds metrics.""" + masked_lm_accuracy = tf.keras.metrics.sparse_categorical_accuracy( + lm_labels, lm_output) + numerator = tf.reduce_sum(masked_lm_accuracy * lm_label_weights) + denominator = tf.reduce_sum(lm_label_weights) + 1e-5 + masked_lm_accuracy = numerator / denominator + self.add_metric( + masked_lm_accuracy, name='masked_lm_accuracy', aggregation='mean') + + self.add_metric(lm_example_loss, name='lm_example_loss', aggregation='mean') + + if sentence_labels is not None: + next_sentence_accuracy = tf.keras.metrics.sparse_categorical_accuracy( + sentence_labels, sentence_output) + self.add_metric( + next_sentence_accuracy, + name='next_sentence_accuracy', + aggregation='mean') + + if next_sentence_loss is not None: + self.add_metric( + next_sentence_loss, name='next_sentence_loss', aggregation='mean') + + def call(self, + lm_output, + sentence_output, + lm_label_ids, + lm_label_weights, + sentence_labels=None): + """Implements call() for the layer.""" + lm_label_weights = tf.cast(lm_label_weights, tf.float32) + lm_output = tf.cast(lm_output, tf.float32) + + mask_label_loss = losses.weighted_sparse_categorical_crossentropy_loss( + labels=lm_label_ids, predictions=lm_output, weights=lm_label_weights) + + if sentence_labels is not None: + sentence_output = tf.cast(sentence_output, tf.float32) + sentence_loss = losses.weighted_sparse_categorical_crossentropy_loss( + labels=sentence_labels, predictions=sentence_output) + loss = mask_label_loss + sentence_loss + else: + sentence_loss = None + loss = mask_label_loss + + batch_shape = tf.slice(tf.shape(lm_label_ids), [0], [1]) + # TODO(hongkuny): Avoids the hack and switches add_loss. + final_loss = tf.fill(batch_shape, loss) + + self._add_metrics(lm_output, lm_label_ids, lm_label_weights, + mask_label_loss, sentence_output, sentence_labels, + sentence_loss) + return final_loss + + +@gin.configurable +def get_transformer_encoder(bert_config, + sequence_length, + transformer_encoder_cls=None): + """Gets a 'TransformerEncoder' object. + + Args: + bert_config: A 'modeling.BertConfig' or 'modeling.AlbertConfig' object. + sequence_length: Maximum sequence length of the training data. + transformer_encoder_cls: A EncoderScaffold class. If it is None, uses the + default BERT encoder implementation. + + Returns: + A networks.TransformerEncoder object. + """ + if transformer_encoder_cls is not None: + # TODO(hongkuny): evaluate if it is better to put cfg definition in gin. + embedding_cfg = dict( + vocab_size=bert_config.vocab_size, + type_vocab_size=bert_config.type_vocab_size, + hidden_size=bert_config.hidden_size, + seq_length=sequence_length, + max_seq_length=bert_config.max_position_embeddings, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range), + dropout_rate=bert_config.hidden_dropout_prob, + ) + hidden_cfg = dict( + num_attention_heads=bert_config.num_attention_heads, + intermediate_size=bert_config.intermediate_size, + intermediate_activation=tf_utils.get_activation(bert_config.hidden_act), + dropout_rate=bert_config.hidden_dropout_prob, + attention_dropout_rate=bert_config.attention_probs_dropout_prob, + ) + kwargs = dict( + embedding_cfg=embedding_cfg, + hidden_cfg=hidden_cfg, + num_hidden_instances=bert_config.num_hidden_layers, + pooled_output_dim=bert_config.hidden_size, + ) + + # Relies on gin configuration to define the Transformer encoder arguments. + return transformer_encoder_cls(**kwargs) + + kwargs = dict( + vocab_size=bert_config.vocab_size, + hidden_size=bert_config.hidden_size, + num_layers=bert_config.num_hidden_layers, + num_attention_heads=bert_config.num_attention_heads, + intermediate_size=bert_config.intermediate_size, + activation=tf_utils.get_activation(bert_config.hidden_act), + dropout_rate=bert_config.hidden_dropout_prob, + attention_dropout_rate=bert_config.attention_probs_dropout_prob, + sequence_length=sequence_length, + max_sequence_length=bert_config.max_position_embeddings, + type_vocab_size=bert_config.type_vocab_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range)) + if isinstance(bert_config, albert_configs.AlbertConfig): + kwargs['embedding_width'] = bert_config.embedding_size + return networks.AlbertTransformerEncoder(**kwargs) + else: + assert isinstance(bert_config, configs.BertConfig) + return networks.TransformerEncoder(**kwargs) + + +def pretrain_model(bert_config, + seq_length, + max_predictions_per_seq, + initializer=None, + use_next_sentence_label=True): + """Returns model to be used for pre-training. + + Args: + bert_config: Configuration that defines the core BERT model. + seq_length: Maximum sequence length of the training data. + max_predictions_per_seq: Maximum number of tokens in sequence to mask out + and use for pretraining. + initializer: Initializer for weights in BertPretrainer. + use_next_sentence_label: Whether to use the next sentence label. + + Returns: + Pretraining model as well as core BERT submodel from which to save + weights after pretraining. + """ + input_word_ids = tf.keras.layers.Input( + shape=(seq_length,), name='input_word_ids', dtype=tf.int32) + input_mask = tf.keras.layers.Input( + shape=(seq_length,), name='input_mask', dtype=tf.int32) + input_type_ids = tf.keras.layers.Input( + shape=(seq_length,), name='input_type_ids', dtype=tf.int32) + masked_lm_positions = tf.keras.layers.Input( + shape=(max_predictions_per_seq,), + name='masked_lm_positions', + dtype=tf.int32) + masked_lm_ids = tf.keras.layers.Input( + shape=(max_predictions_per_seq,), name='masked_lm_ids', dtype=tf.int32) + masked_lm_weights = tf.keras.layers.Input( + shape=(max_predictions_per_seq,), + name='masked_lm_weights', + dtype=tf.int32) + + if use_next_sentence_label: + next_sentence_labels = tf.keras.layers.Input( + shape=(1,), name='next_sentence_labels', dtype=tf.int32) + else: + next_sentence_labels = None + + transformer_encoder = get_transformer_encoder(bert_config, seq_length) + if initializer is None: + initializer = tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range) + pretrainer_model = models.BertPretrainer( + network=transformer_encoder, + num_classes=2, # The next sentence prediction label has two classes. + num_token_predictions=max_predictions_per_seq, + initializer=initializer, + output='predictions') + + lm_output, sentence_output = pretrainer_model( + [input_word_ids, input_mask, input_type_ids, masked_lm_positions]) + + pretrain_loss_layer = BertPretrainLossAndMetricLayer( + vocab_size=bert_config.vocab_size) + output_loss = pretrain_loss_layer(lm_output, sentence_output, masked_lm_ids, + masked_lm_weights, next_sentence_labels) + inputs = { + 'input_word_ids': input_word_ids, + 'input_mask': input_mask, + 'input_type_ids': input_type_ids, + 'masked_lm_positions': masked_lm_positions, + 'masked_lm_ids': masked_lm_ids, + 'masked_lm_weights': masked_lm_weights, + } + if use_next_sentence_label: + inputs['next_sentence_labels'] = next_sentence_labels + + keras_model = tf.keras.Model(inputs=inputs, outputs=output_loss) + return keras_model, transformer_encoder + + +def squad_model(bert_config, + max_seq_length, + initializer=None, + hub_module_url=None, + hub_module_trainable=True): + """Returns BERT Squad model along with core BERT model to import weights. + + Args: + bert_config: BertConfig, the config defines the core Bert model. + max_seq_length: integer, the maximum input sequence length. + initializer: Initializer for the final dense layer in the span labeler. + Defaulted to TruncatedNormal initializer. + hub_module_url: TF-Hub path/url to Bert module. + hub_module_trainable: True to finetune layers in the hub module. + + Returns: + A tuple of (1) keras model that outputs start logits and end logits and + (2) the core BERT transformer encoder. + """ + if initializer is None: + initializer = tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range) + if not hub_module_url: + bert_encoder = get_transformer_encoder(bert_config, max_seq_length) + return models.BertSpanLabeler( + network=bert_encoder, initializer=initializer), bert_encoder + + input_word_ids = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_word_ids') + input_mask = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_mask') + input_type_ids = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_type_ids') + core_model = hub.KerasLayer(hub_module_url, trainable=hub_module_trainable) + pooled_output, sequence_output = core_model( + [input_word_ids, input_mask, input_type_ids]) + bert_encoder = tf.keras.Model( + inputs={ + 'input_word_ids': input_word_ids, + 'input_mask': input_mask, + 'input_type_ids': input_type_ids, + }, + outputs=[sequence_output, pooled_output], + name='core_model') + return models.BertSpanLabeler( + network=bert_encoder, initializer=initializer), bert_encoder + + +def classifier_model(bert_config, + num_labels, + max_seq_length, + final_layer_initializer=None, + hub_module_url=None, + hub_module_trainable=True): + """BERT classifier model in functional API style. + + Construct a Keras model for predicting `num_labels` outputs from an input with + maximum sequence length `max_seq_length`. + + Args: + bert_config: BertConfig or AlbertConfig, the config defines the core BERT or + ALBERT model. + num_labels: integer, the number of classes. + max_seq_length: integer, the maximum input sequence length. + final_layer_initializer: Initializer for final dense layer. Defaulted + TruncatedNormal initializer. + hub_module_url: TF-Hub path/url to Bert module. + hub_module_trainable: True to finetune layers in the hub module. + + Returns: + Combined prediction model (words, mask, type) -> (one-hot labels) + BERT sub-model (words, mask, type) -> (bert_outputs) + """ + if final_layer_initializer is not None: + initializer = final_layer_initializer + else: + initializer = tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range) + + if not hub_module_url: + bert_encoder = get_transformer_encoder(bert_config, max_seq_length) + return models.BertClassifier( + bert_encoder, + num_classes=num_labels, + dropout_rate=bert_config.hidden_dropout_prob, + initializer=initializer), bert_encoder + + input_word_ids = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_word_ids') + input_mask = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_mask') + input_type_ids = tf.keras.layers.Input( + shape=(max_seq_length,), dtype=tf.int32, name='input_type_ids') + bert_model = hub.KerasLayer(hub_module_url, trainable=hub_module_trainable) + pooled_output, _ = bert_model([input_word_ids, input_mask, input_type_ids]) + output = tf.keras.layers.Dropout(rate=bert_config.hidden_dropout_prob)( + pooled_output) + + output = tf.keras.layers.Dense( + num_labels, kernel_initializer=initializer, name='output')( + output) + return tf.keras.Model( + inputs={ + 'input_word_ids': input_word_ids, + 'input_mask': input_mask, + 'input_type_ids': input_type_ids + }, + outputs=output), bert_model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/common_flags.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/common_flags.py new file mode 100644 index 0000000..67fdade --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/common_flags.py @@ -0,0 +1,118 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defining common flags used across all BERT models/applications.""" + +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core + + +def define_gin_flags(): + """Define common gin configurable flags.""" + flags.DEFINE_multi_string('gin_file', None, + 'List of paths to the config files.') + flags.DEFINE_multi_string( + 'gin_param', None, 'Newline separated list of Gin parameter bindings.') + + +def define_common_bert_flags(): + """Define common flags for BERT tasks.""" + flags_core.define_base( + data_dir=False, + model_dir=True, + clean=False, + train_epochs=False, + epochs_between_evals=False, + stop_threshold=False, + batch_size=False, + num_gpu=True, + hooks=False, + export_dir=False, + distribution_strategy=True, + run_eagerly=True) + flags_core.define_distribution() + flags.DEFINE_string('bert_config_file', None, + 'Bert configuration file to define core bert layers.') + flags.DEFINE_string( + 'model_export_path', None, + 'Path to the directory, where trainined model will be ' + 'exported.') + flags.DEFINE_string('tpu', '', 'TPU address to connect to.') + flags.DEFINE_string( + 'init_checkpoint', None, + 'Initial checkpoint (usually from a pre-trained BERT model).') + flags.DEFINE_integer('num_train_epochs', 3, + 'Total number of training epochs to perform.') + flags.DEFINE_integer( + 'steps_per_loop', 1, + 'Number of steps per graph-mode loop. Only training step ' + 'happens inside the loop. Callbacks will not be called ' + 'inside.') + flags.DEFINE_float('learning_rate', 5e-5, + 'The initial learning rate for Adam.') + flags.DEFINE_float('end_lr', 0.0, + 'The end learning rate for learning rate decay.') + flags.DEFINE_string('optimizer_type', 'adamw', + 'The type of optimizer to use for training (adamw|lamb)') + flags.DEFINE_boolean( + 'scale_loss', False, + 'Whether to divide the loss by number of replica inside the per-replica ' + 'loss function.') + flags.DEFINE_boolean( + 'use_keras_compile_fit', False, + 'If True, uses Keras compile/fit() API for training logic. Otherwise ' + 'use custom training loop.') + flags.DEFINE_string( + 'hub_module_url', None, 'TF-Hub path/url to Bert module. ' + 'If specified, init_checkpoint flag should not be used.') + flags.DEFINE_bool('hub_module_trainable', True, + 'True to make keras layers in the hub module trainable.') + + flags_core.define_log_steps() + + # Adds flags for mixed precision and multi-worker training. + flags_core.define_performance( + num_parallel_calls=False, + inter_op=False, + intra_op=False, + synthetic_data=False, + max_train_steps=False, + dtype=True, + dynamic_loss_scale=True, + loss_scale=True, + all_reduce_alg=True, + num_packs=False, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + enable_xla=True, + fp16_implementation=True, + ) + + +def dtype(): + return flags_core.get_tf_dtype(flags.FLAGS) + + +def use_float16(): + return flags_core.get_tf_dtype(flags.FLAGS) == tf.float16 + + +def use_graph_rewrite(): + return flags.FLAGS.fp16_implementation == 'graph_rewrite' + + +def get_loss_scale(): + return flags_core.get_loss_scale(flags.FLAGS, default_for_fp16='dynamic') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/configs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/configs.py new file mode 100644 index 0000000..ae22cfb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/configs.py @@ -0,0 +1,105 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""The main BERT model and related functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import json +import six +import tensorflow as tf + + +class BertConfig(object): + """Configuration for `BertModel`.""" + + def __init__(self, + vocab_size, + hidden_size=768, + num_hidden_layers=12, + num_attention_heads=12, + intermediate_size=3072, + hidden_act="gelu", + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + max_position_embeddings=512, + type_vocab_size=16, + initializer_range=0.02, + backward_compatible=True): + """Constructs BertConfig. + + Args: + vocab_size: Vocabulary size of `inputs_ids` in `BertModel`. + hidden_size: Size of the encoder layers and the pooler layer. + num_hidden_layers: Number of hidden layers in the Transformer encoder. + num_attention_heads: Number of attention heads for each attention layer in + the Transformer encoder. + intermediate_size: The size of the "intermediate" (i.e., feed-forward) + layer in the Transformer encoder. + hidden_act: The non-linear activation function (function or string) in the + encoder and pooler. + hidden_dropout_prob: The dropout probability for all fully connected + layers in the embeddings, encoder, and pooler. + attention_probs_dropout_prob: The dropout ratio for the attention + probabilities. + max_position_embeddings: The maximum sequence length that this model might + ever be used with. Typically set this to something large just in case + (e.g., 512 or 1024 or 2048). + type_vocab_size: The vocabulary size of the `token_type_ids` passed into + `BertModel`. + initializer_range: The stdev of the truncated_normal_initializer for + initializing all weight matrices. + backward_compatible: Boolean, whether the variables shape are compatible + with checkpoints converted from TF 1.x BERT. + """ + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.hidden_act = hidden_act + self.intermediate_size = intermediate_size + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.type_vocab_size = type_vocab_size + self.initializer_range = initializer_range + self.backward_compatible = backward_compatible + + @classmethod + def from_dict(cls, json_object): + """Constructs a `BertConfig` from a Python dictionary of parameters.""" + config = BertConfig(vocab_size=None) + for (key, value) in six.iteritems(json_object): + config.__dict__[key] = value + return config + + @classmethod + def from_json_file(cls, json_file): + """Constructs a `BertConfig` from a json file of parameters.""" + with tf.io.gfile.GFile(json_file, "r") as reader: + text = reader.read() + return cls.from_dict(json.loads(text)) + + def to_dict(self): + """Serializes this instance to a Python dictionary.""" + output = copy.deepcopy(self.__dict__) + return output + + def to_json_string(self): + """Serializes this instance to a JSON string.""" + return json.dumps(self.to_dict(), indent=2, sort_keys=True) + "\n" + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub.py new file mode 100644 index 0000000..b718907 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub.py @@ -0,0 +1,86 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A script to export the BERT core model as a TF-Hub SavedModel.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import app +from absl import flags +import tensorflow as tf +from typing import Text +from official.nlp.bert import bert_models +from official.nlp.bert import configs + +FLAGS = flags.FLAGS + +flags.DEFINE_string("bert_config_file", None, + "Bert configuration file to define core bert layers.") +flags.DEFINE_string("model_checkpoint_path", None, + "File path to TF model checkpoint.") +flags.DEFINE_string("export_path", None, "TF-Hub SavedModel destination path.") +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + + +def create_bert_model(bert_config: configs.BertConfig) -> tf.keras.Model: + """Creates a BERT keras core model from BERT configuration. + + Args: + bert_config: A `BertConfig` to create the core model. + + Returns: + A keras model. + """ + # Adds input layers just as placeholders. + input_word_ids = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_word_ids") + input_mask = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_mask") + input_type_ids = tf.keras.layers.Input( + shape=(None,), dtype=tf.int32, name="input_type_ids") + transformer_encoder = bert_models.get_transformer_encoder( + bert_config, sequence_length=None) + sequence_output, pooled_output = transformer_encoder( + [input_word_ids, input_mask, input_type_ids]) + # To keep consistent with legacy hub modules, the outputs are + # "pooled_output" and "sequence_output". + return tf.keras.Model( + inputs=[input_word_ids, input_mask, input_type_ids], + outputs=[pooled_output, sequence_output]), transformer_encoder + + +def export_bert_tfhub(bert_config: configs.BertConfig, + model_checkpoint_path: Text, hub_destination: Text, + vocab_file: Text): + """Restores a tf.keras.Model and saves for TF-Hub.""" + core_model, encoder = create_bert_model(bert_config) + checkpoint = tf.train.Checkpoint(model=encoder) + checkpoint.restore(model_checkpoint_path).assert_consumed() + core_model.vocab_file = tf.saved_model.Asset(vocab_file) + core_model.do_lower_case = tf.Variable( + "uncased" in vocab_file, trainable=False) + core_model.save(hub_destination, include_optimizer=False, save_format="tf") + + +def main(_): + bert_config = configs.BertConfig.from_json_file(FLAGS.bert_config_file) + export_bert_tfhub(bert_config, FLAGS.model_checkpoint_path, FLAGS.export_path, + FLAGS.vocab_file) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub_test.py new file mode 100644 index 0000000..b2d6e8a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/export_tfhub_test.py @@ -0,0 +1,87 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests official.nlp.bert.export_tfhub.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +import numpy as np + +import tensorflow as tf +import tensorflow_hub as hub +from official.nlp.bert import configs +from official.nlp.bert import export_tfhub + + +class ExportTfhubTest(tf.test.TestCase): + + def test_export_tfhub(self): + # Exports a savedmodel for TF-Hub + bert_config = configs.BertConfig( + vocab_size=100, + hidden_size=16, + intermediate_size=32, + max_position_embeddings=128, + num_attention_heads=2, + num_hidden_layers=1) + bert_model, encoder = export_tfhub.create_bert_model(bert_config) + model_checkpoint_dir = os.path.join(self.get_temp_dir(), "checkpoint") + checkpoint = tf.train.Checkpoint(model=encoder) + checkpoint.save(os.path.join(model_checkpoint_dir, "test")) + model_checkpoint_path = tf.train.latest_checkpoint(model_checkpoint_dir) + + vocab_file = os.path.join(self.get_temp_dir(), "uncased_vocab.txt") + with tf.io.gfile.GFile(vocab_file, "w") as f: + f.write("dummy content") + + hub_destination = os.path.join(self.get_temp_dir(), "hub") + export_tfhub.export_bert_tfhub(bert_config, model_checkpoint_path, + hub_destination, vocab_file) + + # Restores a hub KerasLayer. + hub_layer = hub.KerasLayer(hub_destination, trainable=True) + + if hasattr(hub_layer, "resolved_object"): + # Checks meta attributes. + self.assertTrue(hub_layer.resolved_object.do_lower_case.numpy()) + with tf.io.gfile.GFile( + hub_layer.resolved_object.vocab_file.asset_path.numpy()) as f: + self.assertEqual("dummy content", f.read()) + # Checks the hub KerasLayer. + for source_weight, hub_weight in zip(bert_model.trainable_weights, + hub_layer.trainable_weights): + self.assertAllClose(source_weight.numpy(), hub_weight.numpy()) + + dummy_ids = np.zeros((2, 10), dtype=np.int32) + hub_outputs = hub_layer([dummy_ids, dummy_ids, dummy_ids]) + source_outputs = bert_model([dummy_ids, dummy_ids, dummy_ids]) + + # The outputs of hub module are "pooled_output" and "sequence_output", + # while the outputs of encoder is in reversed order, i.e., + # "sequence_output" and "pooled_output". + encoder_outputs = reversed(encoder([dummy_ids, dummy_ids, dummy_ids])) + self.assertEqual(hub_outputs[0].shape, (2, 16)) + self.assertEqual(hub_outputs[1].shape, (2, 10, 16)) + for source_output, hub_output, encoder_output in zip( + source_outputs, hub_outputs, encoder_outputs): + self.assertAllClose(source_output.numpy(), hub_output.numpy()) + self.assertAllClose(source_output.numpy(), encoder_output.numpy()) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/input_pipeline.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/input_pipeline.py new file mode 100644 index 0000000..f8efb92 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/input_pipeline.py @@ -0,0 +1,231 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""BERT model input pipelines.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +def decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.io.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.cast(t, tf.int32) + example[name] = t + + return example + + +def single_file_dataset(input_file, name_to_features): + """Creates a single-file dataset to be passed for BERT custom training.""" + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + d = tf.data.TFRecordDataset(input_file) + d = d.map(lambda record: decode_record(record, name_to_features)) + + # When `input_file` is a path to a single file or a list + # containing a single path, disable auto sharding so that + # same input file is sent to all workers. + if isinstance(input_file, str) or len(input_file) == 1: + options = tf.data.Options() + options.experimental_distribute.auto_shard_policy = ( + tf.data.experimental.AutoShardPolicy.OFF) + d = d.with_options(options) + return d + + +def create_pretrain_dataset(input_patterns, + seq_length, + max_predictions_per_seq, + batch_size, + is_training=True, + input_pipeline_context=None, + use_next_sentence_label=True): + """Creates input dataset from (tf)records files for pretraining.""" + name_to_features = { + 'input_ids': + tf.io.FixedLenFeature([seq_length], tf.int64), + 'input_mask': + tf.io.FixedLenFeature([seq_length], tf.int64), + 'segment_ids': + tf.io.FixedLenFeature([seq_length], tf.int64), + 'masked_lm_positions': + tf.io.FixedLenFeature([max_predictions_per_seq], tf.int64), + 'masked_lm_ids': + tf.io.FixedLenFeature([max_predictions_per_seq], tf.int64), + 'masked_lm_weights': + tf.io.FixedLenFeature([max_predictions_per_seq], tf.float32), + } + if use_next_sentence_label: + name_to_features['next_sentence_labels'] = tf.io.FixedLenFeature([1], + tf.int64) + + for input_pattern in input_patterns: + if not tf.io.gfile.glob(input_pattern): + raise ValueError('%s does not match any files.' % input_pattern) + + dataset = tf.data.Dataset.list_files(input_patterns, shuffle=is_training) + + if input_pipeline_context and input_pipeline_context.num_input_pipelines > 1: + dataset = dataset.shard(input_pipeline_context.num_input_pipelines, + input_pipeline_context.input_pipeline_id) + if is_training: + dataset = dataset.repeat() + + # We set shuffle buffer to exactly match total number of + # training files to ensure that training data is well shuffled. + input_files = [] + for input_pattern in input_patterns: + input_files.extend(tf.io.gfile.glob(input_pattern)) + dataset = dataset.shuffle(len(input_files)) + + # In parallel, create tf record dataset for each train files. + # cycle_length = 8 means that up to 8 files will be read and deserialized in + # parallel. You may want to increase this number if you have a large number of + # CPU cores. + dataset = dataset.interleave( + tf.data.TFRecordDataset, cycle_length=8, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + decode_fn = lambda record: decode_record(record, name_to_features) + dataset = dataset.map( + decode_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + + def _select_data_from_record(record): + """Filter out features to use for pretraining.""" + x = { + 'input_word_ids': record['input_ids'], + 'input_mask': record['input_mask'], + 'input_type_ids': record['segment_ids'], + 'masked_lm_positions': record['masked_lm_positions'], + 'masked_lm_ids': record['masked_lm_ids'], + 'masked_lm_weights': record['masked_lm_weights'], + } + if use_next_sentence_label: + x['next_sentence_labels'] = record['next_sentence_labels'] + + y = record['masked_lm_weights'] + + return (x, y) + + dataset = dataset.map( + _select_data_from_record, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + if is_training: + dataset = dataset.shuffle(100) + + dataset = dataset.batch(batch_size, drop_remainder=is_training) + dataset = dataset.prefetch(1024) + return dataset + + +def create_classifier_dataset(file_path, + seq_length, + batch_size, + is_training=True, + input_pipeline_context=None): + """Creates input dataset from (tf)records files for train/eval.""" + name_to_features = { + 'input_ids': tf.io.FixedLenFeature([seq_length], tf.int64), + 'input_mask': tf.io.FixedLenFeature([seq_length], tf.int64), + 'segment_ids': tf.io.FixedLenFeature([seq_length], tf.int64), + 'label_ids': tf.io.FixedLenFeature([], tf.int64), + 'is_real_example': tf.io.FixedLenFeature([], tf.int64), + } + dataset = single_file_dataset(file_path, name_to_features) + + # The dataset is always sharded by number of hosts. + # num_input_pipelines is the number of hosts rather than number of cores. + if input_pipeline_context and input_pipeline_context.num_input_pipelines > 1: + dataset = dataset.shard(input_pipeline_context.num_input_pipelines, + input_pipeline_context.input_pipeline_id) + + def _select_data_from_record(record): + x = { + 'input_word_ids': record['input_ids'], + 'input_mask': record['input_mask'], + 'input_type_ids': record['segment_ids'] + } + y = record['label_ids'] + return (x, y) + + dataset = dataset.map(_select_data_from_record) + + if is_training: + dataset = dataset.shuffle(100) + dataset = dataset.repeat() + + dataset = dataset.batch(batch_size, drop_remainder=is_training) + dataset = dataset.prefetch(1024) + return dataset + + +def create_squad_dataset(file_path, + seq_length, + batch_size, + is_training=True, + input_pipeline_context=None): + """Creates input dataset from (tf)records files for train/eval.""" + name_to_features = { + 'input_ids': tf.io.FixedLenFeature([seq_length], tf.int64), + 'input_mask': tf.io.FixedLenFeature([seq_length], tf.int64), + 'segment_ids': tf.io.FixedLenFeature([seq_length], tf.int64), + } + if is_training: + name_to_features['start_positions'] = tf.io.FixedLenFeature([], tf.int64) + name_to_features['end_positions'] = tf.io.FixedLenFeature([], tf.int64) + else: + name_to_features['unique_ids'] = tf.io.FixedLenFeature([], tf.int64) + + dataset = single_file_dataset(file_path, name_to_features) + + # The dataset is always sharded by number of hosts. + # num_input_pipelines is the number of hosts rather than number of cores. + if input_pipeline_context and input_pipeline_context.num_input_pipelines > 1: + dataset = dataset.shard(input_pipeline_context.num_input_pipelines, + input_pipeline_context.input_pipeline_id) + + def _select_data_from_record(record): + """Dispatches record to features and labels.""" + x, y = {}, {} + for name, tensor in record.items(): + if name in ('start_positions', 'end_positions'): + y[name] = tensor + elif name == 'input_ids': + x['input_word_ids'] = tensor + elif name == 'segment_ids': + x['input_type_ids'] = tensor + else: + x[name] = tensor + return (x, y) + + dataset = dataset.map(_select_data_from_record) + + if is_training: + dataset = dataset.shuffle(100) + dataset = dataset.repeat() + + dataset = dataset.batch(batch_size, drop_remainder=True) + dataset = dataset.prefetch(1024) + return dataset diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_saving_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_saving_utils.py new file mode 100644 index 0000000..e8e8fa8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_saving_utils.py @@ -0,0 +1,101 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utilities to save models.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os + +from absl import logging +import tensorflow as tf +import typing + + +def export_bert_model(model_export_path: typing.Text, + model: tf.keras.Model, + checkpoint_dir: typing.Optional[typing.Text] = None, + restore_model_using_load_weights: bool = False) -> None: + """Export BERT model for serving which does not include the optimizer. + + Arguments: + model_export_path: Path to which exported model will be saved. + model: Keras model object to export. + checkpoint_dir: Path from which model weights will be loaded, if + specified. + restore_model_using_load_weights: Whether to use checkpoint.restore() API + for custom checkpoint or to use model.load_weights() API. + There are 2 different ways to save checkpoints. One is using + tf.train.Checkpoint and another is using Keras model.save_weights(). + Custom training loop implementation uses tf.train.Checkpoint API + and Keras ModelCheckpoint callback internally uses model.save_weights() + API. Since these two API's cannot be used toghether, model loading logic + must be take into account how model checkpoint was saved. + + Raises: + ValueError when either model_export_path or model is not specified. + """ + if not model_export_path: + raise ValueError('model_export_path must be specified.') + if not isinstance(model, tf.keras.Model): + raise ValueError('model must be a tf.keras.Model object.') + + if checkpoint_dir: + # Keras compile/fit() was used to save checkpoint using + # model.save_weights(). + if restore_model_using_load_weights: + model_weight_path = os.path.join(checkpoint_dir, 'checkpoint') + assert tf.io.gfile.exists(model_weight_path) + model.load_weights(model_weight_path) + + # tf.train.Checkpoint API was used via custom training loop logic. + else: + checkpoint = tf.train.Checkpoint(model=model) + + # Restores the model from latest checkpoint. + latest_checkpoint_file = tf.train.latest_checkpoint(checkpoint_dir) + assert latest_checkpoint_file + logging.info('Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint_file) + checkpoint.restore( + latest_checkpoint_file).assert_existing_objects_matched() + + model.save(model_export_path, include_optimizer=False, save_format='tf') + + +class BertModelCheckpoint(tf.keras.callbacks.Callback): + """Keras callback that saves model at the end of every epoch.""" + + def __init__(self, checkpoint_dir, checkpoint): + """Initializes BertModelCheckpoint. + + Arguments: + checkpoint_dir: Directory of the to be saved checkpoint file. + checkpoint: tf.train.Checkpoint object. + """ + super(BertModelCheckpoint, self).__init__() + self.checkpoint_file_name = os.path.join( + checkpoint_dir, 'bert_training_checkpoint_step_{global_step}.ckpt') + assert isinstance(checkpoint, tf.train.Checkpoint) + self.checkpoint = checkpoint + + def on_epoch_end(self, epoch, logs=None): + global_step = tf.keras.backend.get_value(self.model.optimizer.iterations) + formatted_file_name = self.checkpoint_file_name.format( + global_step=global_step) + saved_path = self.checkpoint.save(formatted_file_name) + logging.info('Saving model TF checkpoint to : %s', saved_path) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils.py new file mode 100644 index 0000000..a8c4adb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils.py @@ -0,0 +1,491 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A light weight utilities to train NLP models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import tempfile + +from absl import logging +import tensorflow as tf +from official.staging.training import grad_utils +from official.utils.misc import distribution_utils + +_SUMMARY_TXT = 'training_summary.txt' +_MIN_SUMMARY_STEPS = 10 + + +def _should_export_checkpoint(strategy): + return (not strategy) or strategy.extended.should_checkpoint + + +def _should_export_summary(strategy): + return (not strategy) or strategy.extended.should_save_summary + + +def _save_checkpoint(strategy, checkpoint, model_dir, checkpoint_prefix): + """Saves model to with provided checkpoint prefix.""" + + if _should_export_checkpoint(strategy): + checkpoint_path = os.path.join(model_dir, checkpoint_prefix) + saved_path = checkpoint.save(checkpoint_path) + logging.info('Saving model as TF checkpoint: %s', saved_path) + else: + # In multi worker training we need every worker to save checkpoint, because + # variables can trigger synchronization on read and synchronization needs + # all workers to participate. To avoid workers overriding each other we save + # to a temporary directory on non-chief workers. + tmp_dir = tempfile.mkdtemp() + checkpoint.save(os.path.join(tmp_dir, 'ckpt')) + tf.io.gfile.rmtree(tmp_dir) + return + + +def _get_input_iterator(input_fn, strategy): + """Returns distributed dataset iterator.""" + # When training with TPU pods, datasets needs to be cloned across + # workers. Since Dataset instance cannot be cloned in eager mode, we instead + # pass callable that returns a dataset. + if not callable(input_fn): + raise ValueError('`input_fn` should be a closure that returns a dataset.') + iterator = iter( + strategy.experimental_distribute_datasets_from_function(input_fn)) + return iterator + + +def _float_metric_value(metric): + """Gets the value of a float-value keras metric.""" + return metric.result().numpy().astype(float) + + +def steps_to_run(current_step, steps_per_epoch, steps_per_loop): + """Calculates steps to run on device.""" + if steps_per_loop <= 0: + raise ValueError('steps_per_loop should be positive integer.') + if steps_per_loop == 1: + return steps_per_loop + remainder_in_epoch = current_step % steps_per_epoch + if remainder_in_epoch != 0: + return min(steps_per_epoch - remainder_in_epoch, steps_per_loop) + else: + return steps_per_loop + + +def write_txt_summary(training_summary, summary_dir): + """Writes a summary text file to record stats.""" + summary_path = os.path.join(summary_dir, _SUMMARY_TXT) + with tf.io.gfile.GFile(summary_path, 'wb') as f: + logging.info('Training Summary: \n%s', str(training_summary)) + f.write(json.dumps(training_summary, indent=4)) + + +def run_customized_training_loop( + # pylint: disable=invalid-name + _sentinel=None, + # pylint: enable=invalid-name + strategy=None, + model_fn=None, + loss_fn=None, + scale_loss=True, + model_dir=None, + train_input_fn=None, + steps_per_epoch=None, + steps_per_loop=1, + epochs=1, + eval_input_fn=None, + eval_steps=None, + metric_fn=None, + init_checkpoint=None, + custom_callbacks=None, + run_eagerly=False, + sub_model_export_name=None, + explicit_allreduce=False, + pre_allreduce_callbacks=None, + post_allreduce_callbacks=None): + """Run BERT pretrain model training using low-level API. + + Arguments: + _sentinel: Used to prevent positional parameters. Internal, do not use. + strategy: Distribution strategy on which to run low level training loop. + model_fn: Function that returns a tuple (model, sub_model). Caller of this + function should add optimizer to the `model` via calling + `model.compile()` API or manually setting `model.optimizer` attribute. + Second element of the returned tuple(sub_model) is an optional sub model + to be used for initial checkpoint -- if provided. + loss_fn: Function with signature func(labels, logits) and returns a loss + tensor. + scale_loss: Whether to divide the raw loss by number of replicas before + gradients calculation. + model_dir: Model directory used during training for restoring/saving model + weights. + train_input_fn: Function that returns a tf.data.Dataset used for training. + steps_per_epoch: Number of steps to run per epoch. At the end of each + epoch, model checkpoint will be saved and evaluation will be conducted + if evaluation dataset is provided. + steps_per_loop: Number of steps per graph-mode loop. In order to reduce + communication in eager context, training logs are printed every + steps_per_loop. + epochs: Number of epochs to train. + eval_input_fn: Function that returns evaluation dataset. If none, + evaluation is skipped. + eval_steps: Number of steps to run evaluation. Required if `eval_input_fn` + is not none. + metric_fn: A metrics function that returns a Keras Metric object to record + evaluation result using evaluation dataset or with training dataset + after every epoch. + init_checkpoint: Optional checkpoint to load to `sub_model` returned by + `model_fn`. + custom_callbacks: A list of Keras Callbacks objects to run during + training. More specifically, `on_batch_begin()`, `on_batch_end()`, + methods are invoked during training. + run_eagerly: Whether to run model training in pure eager execution. This + should be disable for TPUStrategy. + sub_model_export_name: If not None, will export `sub_model` returned by + `model_fn` into checkpoint files. The name of intermediate checkpoint + file is {sub_model_export_name}_step_{step}.ckpt and the last + checkpint's name is {sub_model_export_name}.ckpt; + if None, `sub_model` will not be exported as checkpoint. + explicit_allreduce: Whether to explicitly perform gradient allreduce, + instead of relying on implicit allreduce in optimizer.apply_gradients(). + default is False. For now, if training using FP16 mixed precision, + explicit allreduce will aggregate gradients in FP16 format. For TPU and + GPU training using FP32, explicit allreduce will aggregate gradients in + FP32 format. + pre_allreduce_callbacks: A list of callback functions that takes gradients + and model variables pairs as input, manipulate them, and returns a new + gradients and model variables paris. The callback functions will be + invoked in the list order and before gradients are allreduced. + With mixed precision training, the pre_allreduce_allbacks will be + applied on scaled_gradients. Default is no callbacks. + Only used when explicit_allreduce=True. + post_allreduce_callbacks: A list of callback functions that takes + gradients and model variables pairs as input, manipulate them, and + returns a new gradients and model variables paris. The callback + functions will be invoked in the list order and right before gradients + are applied to variables for updates. Default is no callbacks. Only used + when explicit_allreduce=True. + + Returns: + Trained model. + + Raises: + ValueError: (1) When model returned by `model_fn` does not have optimizer + attribute or when required parameters are set to none. (2) eval args are + not specified correctly. (3) metric_fn must be a callable if specified. + (4) sub_model_checkpoint_name is specified, but `sub_model` returned + by `model_fn` is None. + """ + + if _sentinel is not None: + raise ValueError('only call `run_customized_training_loop()` ' + 'with named arguments.') + + required_arguments = [ + strategy, model_fn, loss_fn, model_dir, steps_per_epoch, train_input_fn + ] + if [arg for arg in required_arguments if arg is None]: + raise ValueError('`strategy`, `model_fn`, `loss_fn`, `model_dir`, ' + '`steps_per_loop` and `steps_per_epoch` are required ' + 'parameters.') + if steps_per_loop > steps_per_epoch: + logging.error( + 'steps_per_loop: %d is specified to be greater than ' + ' steps_per_epoch: %d, we will use steps_per_epoch as' + ' steps_per_loop.', steps_per_loop, steps_per_epoch) + steps_per_loop = steps_per_epoch + assert tf.executing_eagerly() + + if run_eagerly: + if isinstance(strategy, tf.distribute.experimental.TPUStrategy): + raise ValueError( + 'TPUStrategy should not run eagerly as it heavily relies on graph' + ' optimization for the distributed system.') + + if eval_input_fn and (eval_steps is None or metric_fn is None): + raise ValueError( + '`eval_step` and `metric_fn` are required when `eval_input_fn ` ' + 'is not none.') + if metric_fn and not callable(metric_fn): + raise ValueError( + 'if `metric_fn` is specified, metric_fn must be a callable.') + + total_training_steps = steps_per_epoch * epochs + train_iterator = _get_input_iterator(train_input_fn, strategy) + + with distribution_utils.get_strategy_scope(strategy): + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model, sub_model = model_fn() + if not hasattr(model, 'optimizer'): + raise ValueError('User should set optimizer attribute to model ' + 'inside `model_fn`.') + if sub_model_export_name and sub_model is None: + raise ValueError('sub_model_export_name is specified as %s, but ' + 'sub_model is None.' % sub_model_export_name) + + optimizer = model.optimizer + + if init_checkpoint: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'initial checkpoint for core model.', init_checkpoint) + checkpoint = tf.train.Checkpoint(model=sub_model) + checkpoint.restore(init_checkpoint).assert_existing_objects_matched() + logging.info('Loading from checkpoint file completed') + + train_loss_metric = tf.keras.metrics.Mean( + 'training_loss', dtype=tf.float32) + eval_metrics = [metric_fn()] if metric_fn else [] + # If evaluation is required, make a copy of metric as it will be used by + # both train and evaluation. + train_metrics = [ + metric.__class__.from_config(metric.get_config()) + for metric in eval_metrics + ] + + # Create summary writers + if _should_export_summary(strategy): + summary_dir = os.path.join(model_dir, 'summaries') + else: + # In multi worker training we need every worker to write summary, because + # variables can trigger synchronization on read and synchronization needs + # all workers to participate. + summary_dir = tempfile.mkdtemp() + eval_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, 'eval')) + if steps_per_loop >= _MIN_SUMMARY_STEPS: + # Only writes summary when the stats are collected sufficiently over + # enough steps. + train_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, 'train')) + else: + train_summary_writer = None + + # Collects training variables. + training_vars = model.trainable_variables + + def _replicated_step(inputs): + """Replicated training step.""" + + inputs, labels = inputs + with tf.GradientTape() as tape: + model_outputs = model(inputs, training=True) + loss = loss_fn(labels, model_outputs) + # Raw loss is used for reporting in metrics/logs. + raw_loss = loss + if scale_loss: + # Scales down the loss for gradients to be invariant from replicas. + loss = loss / strategy.num_replicas_in_sync + + if explicit_allreduce: + grad_utils.minimize_using_explicit_allreduce(tape, optimizer, loss, + training_vars, + pre_allreduce_callbacks, + post_allreduce_callbacks) + else: + if isinstance(optimizer, + tf.keras.mixed_precision.experimental.LossScaleOptimizer): + with tape: + scaled_loss = optimizer.get_scaled_loss(loss) + scaled_grads = tape.gradient(scaled_loss, training_vars) + grads = optimizer.get_unscaled_gradients(scaled_grads) + else: + grads = tape.gradient(loss, training_vars) + optimizer.apply_gradients(zip(grads, training_vars)) + # For reporting, the metric takes the mean of losses. + train_loss_metric.update_state(raw_loss) + for metric in train_metrics: + metric.update_state(labels, model_outputs) + + @tf.function + def train_steps(iterator, steps): + """Performs distributed training steps in a loop. + + Args: + iterator: the distributed iterator of training datasets. + steps: an tf.int32 integer tensor to specify number of steps to run + inside host training loop. + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + if not isinstance(steps, tf.Tensor): + raise ValueError('steps should be an Tensor. Python object may cause ' + 'retracing.') + + for _ in tf.range(steps): + strategy.run(_replicated_step, args=(next(iterator),)) + + def train_single_step(iterator): + """Performs a distributed training step. + + Args: + iterator: the distributed iterator of training datasets. + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + strategy.run(_replicated_step, args=(next(iterator),)) + + def test_step(iterator): + """Calculates evaluation metrics on distributed devices.""" + + def _test_step_fn(inputs): + """Replicated accuracy calculation.""" + + inputs, labels = inputs + model_outputs = model(inputs, training=False) + for metric in eval_metrics: + metric.update_state(labels, model_outputs) + + strategy.run(_test_step_fn, args=(next(iterator),)) + + if not run_eagerly: + train_single_step = tf.function(train_single_step) + test_step = tf.function(test_step) + + def _run_evaluation(current_training_step, test_iterator): + """Runs validation steps and aggregate metrics.""" + for _ in range(eval_steps): + test_step(test_iterator) + + with eval_summary_writer.as_default(): + for metric in eval_metrics + model.metrics: + metric_value = _float_metric_value(metric) + logging.info('Step: [%d] Validation %s = %f', current_training_step, + metric.name, metric_value) + tf.summary.scalar( + metric.name, metric_value, step=current_training_step) + eval_summary_writer.flush() + + def _run_callbacks_on_batch_begin(batch): + """Runs custom callbacks at the start of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + callback.on_batch_begin(batch) + + def _run_callbacks_on_batch_end(batch, logs): + """Runs custom callbacks at the end of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + callback.on_batch_end(batch, logs) + + # Training loop starts here. + checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer) + sub_model_checkpoint = tf.train.Checkpoint( + model=sub_model) if sub_model_export_name else None + + latest_checkpoint_file = tf.train.latest_checkpoint(model_dir) + if latest_checkpoint_file: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint_file) + checkpoint.restore(latest_checkpoint_file) + logging.info('Loading from checkpoint file completed') + + current_step = optimizer.iterations.numpy() + checkpoint_name = 'ctl_step_{step}.ckpt' + + while current_step < total_training_steps: + # Training loss/metric are taking average over steps inside micro + # training loop. We reset the their values before each round. + train_loss_metric.reset_states() + for metric in train_metrics + model.metrics: + metric.reset_states() + + _run_callbacks_on_batch_begin(current_step) + # Runs several steps in the host while loop. + steps = steps_to_run(current_step, steps_per_epoch, steps_per_loop) + + if tf.config.list_physical_devices('GPU'): + # TODO(zongweiz): merge with train_steps once tf.while_loop + # GPU performance bugs are fixed. + for _ in range(steps): + train_single_step(train_iterator) + else: + # Converts steps to a Tensor to avoid tf.function retracing. + train_steps(train_iterator, + tf.convert_to_tensor(steps, dtype=tf.int32)) + train_loss = _float_metric_value(train_loss_metric) + current_step += steps + _run_callbacks_on_batch_end(current_step - 1, {'loss': train_loss}) + + # Updates training logging. + training_status = 'Train Step: %d/%d / loss = %s' % ( + current_step, total_training_steps, train_loss) + + if train_summary_writer: + with train_summary_writer.as_default(): + tf.summary.scalar( + train_loss_metric.name, train_loss, step=current_step) + for metric in train_metrics + model.metrics: + metric_value = _float_metric_value(metric) + training_status += ' %s = %f' % (metric.name, metric_value) + tf.summary.scalar(metric.name, metric_value, step=current_step) + train_summary_writer.flush() + logging.info(training_status) + + # Saves model checkpoints and run validation steps at every epoch end. + if current_step % steps_per_epoch == 0: + # To avoid repeated model saving, we do not save after the last + # step of training. + if current_step < total_training_steps: + _save_checkpoint(strategy, checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + if sub_model_export_name: + _save_checkpoint( + strategy, sub_model_checkpoint, model_dir, + '%s_step_%d.ckpt' % (sub_model_export_name, current_step)) + if eval_input_fn: + logging.info('Running evaluation after step: %s.', current_step) + _run_evaluation(current_step, + _get_input_iterator(eval_input_fn, strategy)) + # Re-initialize evaluation metric. + for metric in eval_metrics + model.metrics: + metric.reset_states() + + _save_checkpoint(strategy, checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + if sub_model_export_name: + _save_checkpoint(strategy, sub_model_checkpoint, model_dir, + '%s.ckpt' % sub_model_export_name) + + if eval_input_fn: + logging.info('Running final evaluation after training is complete.') + _run_evaluation(current_step, + _get_input_iterator(eval_input_fn, strategy)) + + training_summary = { + 'total_training_steps': total_training_steps, + 'train_loss': _float_metric_value(train_loss_metric), + } + if eval_metrics: + # TODO(hongkuny): Cleans up summary reporting in text. + training_summary['last_train_metrics'] = _float_metric_value( + train_metrics[0]) + training_summary['eval_metrics'] = _float_metric_value(eval_metrics[0]) + + write_txt_summary(training_summary, summary_dir) + + if not _should_export_summary(strategy): + tf.io.gfile.rmtree(summary_dir) + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils_test.py new file mode 100644 index 0000000..87ef7b6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/model_training_utils_test.py @@ -0,0 +1,236 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for official.modeling.training.model_training_utils.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import logging +from absl.testing import parameterized +from absl.testing.absltest import mock +import numpy as np +import tensorflow as tf + +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +from official.nlp.bert import model_training_utils + + +def eager_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.tpu_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.mirrored_strategy_with_gpu_and_cpu, + strategy_combinations.mirrored_strategy_with_two_gpus, + ], + mode='eager', + ) + + +def eager_gpu_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.mirrored_strategy_with_gpu_and_cpu, + strategy_combinations.mirrored_strategy_with_two_gpus, + ], + mode='eager', + ) + + +def create_fake_data_input_fn(batch_size, features_shape, num_classes): + """Creates a dummy input function with the given feature and label shapes. + + Args: + batch_size: integer. + features_shape: list[int]. Feature shape for an individual example. + num_classes: integer. Number of labels. + + Returns: + An input function that is usable in the executor. + """ + + def _dataset_fn(input_context=None): + """An input function for generating fake data.""" + local_batch_size = input_context.get_per_replica_batch_size(batch_size) + features = np.random.rand(64, *features_shape) + labels = np.random.randint(2, size=[64, num_classes]) + # Convert the inputs to a Dataset. + dataset = tf.data.Dataset.from_tensor_slices((features, labels)) + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + def _assign_dtype(features, labels): + features = tf.cast(features, tf.float32) + labels = tf.cast(labels, tf.float32) + return features, labels + + # Shuffle, repeat, and batch the examples. + dataset = dataset.map(_assign_dtype) + dataset = dataset.shuffle(64).repeat() + dataset = dataset.batch(local_batch_size, drop_remainder=True) + dataset = dataset.prefetch(buffer_size=64) + return dataset + + return _dataset_fn + + +def create_model_fn(input_shape, num_classes, use_float16=False): + + def _model_fn(): + """A one-layer softmax model suitable for testing.""" + input_layer = tf.keras.layers.Input(shape=input_shape) + x = tf.keras.layers.Dense(num_classes, activation='relu')(input_layer) + output_layer = tf.keras.layers.Dense(num_classes, activation='softmax')(x) + sub_model = tf.keras.models.Model(input_layer, x, name='sub_model') + model = tf.keras.models.Model(input_layer, output_layer, name='model') + model.add_metric( + tf.reduce_mean(input_layer), name='mean_input', aggregation='mean') + model.optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9) + if use_float16: + model.optimizer = ( + tf.keras.mixed_precision.experimental.LossScaleOptimizer( + model.optimizer, loss_scale='dynamic')) + return model, sub_model + + return _model_fn + + +def metric_fn(): + """Gets a tf.keras metric object.""" + return tf.keras.metrics.CategoricalAccuracy(name='accuracy', dtype=tf.float32) + + +def summaries_with_matching_keyword(keyword, summary_dir): + """Yields summary protos matching given keyword from event file.""" + event_paths = tf.io.gfile.glob(os.path.join(summary_dir, 'events*')) + for event in tf.compat.v1.train.summary_iterator(event_paths[-1]): + if event.summary is not None: + for value in event.summary.value: + if keyword in value.tag: + logging.error(event) + yield event.summary + + +def check_eventfile_for_keyword(keyword, summary_dir): + """Checks event files for the keyword.""" + return any(summaries_with_matching_keyword(keyword, summary_dir)) + + +class ModelTrainingUtilsTest(tf.test.TestCase, parameterized.TestCase): + + def setUp(self): + super(ModelTrainingUtilsTest, self).setUp() + self._model_fn = create_model_fn(input_shape=[128], num_classes=3) + + def run_training(self, strategy, model_dir, steps_per_loop, run_eagerly): + input_fn = create_fake_data_input_fn( + batch_size=8, features_shape=[128], num_classes=3) + model_training_utils.run_customized_training_loop( + strategy=strategy, + model_fn=self._model_fn, + loss_fn=tf.keras.losses.categorical_crossentropy, + model_dir=model_dir, + steps_per_epoch=20, + steps_per_loop=steps_per_loop, + epochs=2, + train_input_fn=input_fn, + eval_input_fn=input_fn, + eval_steps=10, + init_checkpoint=None, + metric_fn=metric_fn, + custom_callbacks=None, + run_eagerly=run_eagerly) + + @combinations.generate(eager_strategy_combinations()) + def test_train_eager_single_step(self, distribution): + model_dir = self.get_temp_dir() + if isinstance(distribution, tf.distribute.experimental.TPUStrategy): + with self.assertRaises(ValueError): + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + else: + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + + @combinations.generate(eager_gpu_strategy_combinations()) + def test_train_eager_mixed_precision(self, distribution): + model_dir = self.get_temp_dir() + policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16') + tf.keras.mixed_precision.experimental.set_policy(policy) + self._model_fn = create_model_fn( + input_shape=[128], num_classes=3, use_float16=True) + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + + @combinations.generate(eager_strategy_combinations()) + def test_train_check_artifacts(self, distribution): + model_dir = self.get_temp_dir() + self.run_training( + distribution, model_dir, steps_per_loop=10, run_eagerly=False) + + # Two checkpoints should be saved after two epochs. + self.assertNotEmpty(tf.io.gfile.glob(os.path.join(model_dir, 'ctl_step_*'))) + self.assertNotEmpty( + tf.io.gfile.glob( + os.path.join(model_dir, 'summaries/training_summary*'))) + + # Loss and accuracy values should be written into summaries. + self.assertTrue( + check_eventfile_for_keyword('loss', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('accuracy', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('mean_input', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('accuracy', + os.path.join(model_dir, 'summaries/eval'))) + self.assertTrue( + check_eventfile_for_keyword('mean_input', + os.path.join(model_dir, 'summaries/eval'))) + + @combinations.generate( + combinations.combine( + distribution=[ + strategy_combinations.one_device_strategy_gpu, + ], + mode='eager', + )) + def test_train_check_artifacts_non_chief(self, distribution): + # We shouldn't export artifacts on non-chief workers. Since there's no easy + # way to test with real MultiWorkerMirroredStrategy, we patch the strategy + # to make it as if it's MultiWorkerMirroredStrategy on non-chief workers. + extended = distribution.extended + with mock.patch.object(extended.__class__, 'should_checkpoint', + new_callable=mock.PropertyMock, return_value=False), \ + mock.patch.object(extended.__class__, 'should_save_summary', + new_callable=mock.PropertyMock, return_value=False): + model_dir = self.get_temp_dir() + self.run_training( + distribution, model_dir, steps_per_loop=10, run_eagerly=False) + self.assertEmpty(tf.io.gfile.listdir(model_dir)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_classifier.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_classifier.py new file mode 100644 index 0000000..d737deb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_classifier.py @@ -0,0 +1,432 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""BERT classification finetuning runner in TF 2.x.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import math +import os + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf +from official.modeling import performance +from official.nlp import optimization +from official.nlp.bert import bert_models +from official.nlp.bert import common_flags +from official.nlp.bert import configs as bert_configs +from official.nlp.bert import input_pipeline +from official.nlp.bert import model_saving_utils +from official.nlp.bert import model_training_utils +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + + +flags.DEFINE_enum( + 'mode', 'train_and_eval', ['train_and_eval', 'export_only'], + 'One of {"train_and_eval", "export_only"}. `train_and_eval`: ' + 'trains the model and evaluates in the meantime. ' + '`export_only`: will take the latest checkpoint inside ' + 'model_dir and export a `SavedModel`.') +flags.DEFINE_string('train_data_path', None, + 'Path to training data for BERT classifier.') +flags.DEFINE_string('eval_data_path', None, + 'Path to evaluation data for BERT classifier.') +# Model training specific flags. +flags.DEFINE_string( + 'input_meta_data_path', None, + 'Path to file that contains meta data about input ' + 'to be used for training and evaluation.') +flags.DEFINE_integer('train_batch_size', 32, 'Batch size for training.') +flags.DEFINE_integer('eval_batch_size', 32, 'Batch size for evaluation.') + +common_flags.define_common_bert_flags() + +FLAGS = flags.FLAGS + + +def get_loss_fn(num_classes): + """Gets the classification loss function.""" + + def classification_loss_fn(labels, logits): + """Classification loss.""" + labels = tf.squeeze(labels) + log_probs = tf.nn.log_softmax(logits, axis=-1) + one_hot_labels = tf.one_hot( + tf.cast(labels, dtype=tf.int32), depth=num_classes, dtype=tf.float32) + per_example_loss = -tf.reduce_sum( + tf.cast(one_hot_labels, dtype=tf.float32) * log_probs, axis=-1) + return tf.reduce_mean(per_example_loss) + + return classification_loss_fn + + +def get_dataset_fn(input_file_pattern, max_seq_length, global_batch_size, + is_training): + """Gets a closure to create a dataset.""" + + def _dataset_fn(ctx=None): + """Returns tf.data.Dataset for distributed BERT pretraining.""" + batch_size = ctx.get_per_replica_batch_size( + global_batch_size) if ctx else global_batch_size + dataset = input_pipeline.create_classifier_dataset( + input_file_pattern, + max_seq_length, + batch_size, + is_training=is_training, + input_pipeline_context=ctx) + return dataset + + return _dataset_fn + + +def run_bert_classifier(strategy, + bert_config, + input_meta_data, + model_dir, + epochs, + steps_per_epoch, + steps_per_loop, + eval_steps, + warmup_steps, + initial_lr, + init_checkpoint, + train_input_fn, + eval_input_fn, + custom_callbacks=None, + run_eagerly=False, + use_keras_compile_fit=False): + """Run BERT classifier training using low-level API.""" + max_seq_length = input_meta_data['max_seq_length'] + num_classes = input_meta_data['num_labels'] + + def _get_classifier_model(): + """Gets a classifier model.""" + classifier_model, core_model = ( + bert_models.classifier_model( + bert_config, + num_classes, + max_seq_length, + hub_module_url=FLAGS.hub_module_url, + hub_module_trainable=FLAGS.hub_module_trainable)) + optimizer = optimization.create_optimizer( + initial_lr, steps_per_epoch * epochs, warmup_steps, + FLAGS.end_lr, FLAGS.optimizer_type) + classifier_model.optimizer = performance.configure_optimizer( + optimizer, + use_float16=common_flags.use_float16(), + use_graph_rewrite=common_flags.use_graph_rewrite()) + return classifier_model, core_model + + loss_fn = get_loss_fn(num_classes) + + # Defines evaluation metrics function, which will create metrics in the + # correct device and strategy scope. + def metric_fn(): + return tf.keras.metrics.SparseCategoricalAccuracy( + 'test_accuracy', dtype=tf.float32) + + if use_keras_compile_fit: + # Start training using Keras compile/fit API. + logging.info('Training using TF 2.0 Keras compile/fit API with ' + 'distribution strategy.') + return run_keras_compile_fit( + model_dir, + strategy, + _get_classifier_model, + train_input_fn, + eval_input_fn, + loss_fn, + metric_fn, + init_checkpoint, + epochs, + steps_per_epoch, + steps_per_loop, + eval_steps, + custom_callbacks=custom_callbacks) + + # Use user-defined loop to start training. + logging.info('Training using customized training loop TF 2.0 with ' + 'distribution strategy.') + return model_training_utils.run_customized_training_loop( + strategy=strategy, + model_fn=_get_classifier_model, + loss_fn=loss_fn, + model_dir=model_dir, + steps_per_epoch=steps_per_epoch, + steps_per_loop=steps_per_loop, + epochs=epochs, + train_input_fn=train_input_fn, + eval_input_fn=eval_input_fn, + eval_steps=eval_steps, + init_checkpoint=init_checkpoint, + metric_fn=metric_fn, + custom_callbacks=custom_callbacks, + run_eagerly=run_eagerly) + + +def run_keras_compile_fit(model_dir, + strategy, + model_fn, + train_input_fn, + eval_input_fn, + loss_fn, + metric_fn, + init_checkpoint, + epochs, + steps_per_epoch, + steps_per_loop, + eval_steps, + custom_callbacks=None): + """Runs BERT classifier model using Keras compile/fit API.""" + + with strategy.scope(): + training_dataset = train_input_fn() + evaluation_dataset = eval_input_fn() + bert_model, sub_model = model_fn() + optimizer = bert_model.optimizer + + if init_checkpoint: + checkpoint = tf.train.Checkpoint(model=sub_model) + checkpoint.restore(init_checkpoint).assert_existing_objects_matched() + + bert_model.compile( + optimizer=optimizer, + loss=loss_fn, + metrics=[metric_fn()], + experimental_steps_per_execution=steps_per_loop) + + summary_dir = os.path.join(model_dir, 'summaries') + summary_callback = tf.keras.callbacks.TensorBoard(summary_dir) + checkpoint_path = os.path.join(model_dir, 'checkpoint') + checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( + checkpoint_path, save_weights_only=True) + + if custom_callbacks is not None: + custom_callbacks += [summary_callback, checkpoint_callback] + else: + custom_callbacks = [summary_callback, checkpoint_callback] + + bert_model.fit( + x=training_dataset, + validation_data=evaluation_dataset, + steps_per_epoch=steps_per_epoch, + epochs=epochs, + validation_steps=eval_steps, + callbacks=custom_callbacks) + + return bert_model + + +def get_predictions_and_labels(strategy, trained_model, eval_input_fn, + eval_steps): + """Obtains predictions of trained model on evaluation data. + + Note that list of labels is returned along with the predictions because the + order changes on distributing dataset over TPU pods. + + Args: + strategy: Distribution strategy. + trained_model: Trained model with preloaded weights. + eval_input_fn: Input function for evaluation data. + eval_steps: Number of evaluation steps. + + Returns: + predictions: List of predictions. + labels: List of gold labels corresponding to predictions. + """ + + @tf.function + def test_step(iterator): + """Computes predictions on distributed devices.""" + + def _test_step_fn(inputs): + """Replicated predictions.""" + inputs, labels = inputs + model_outputs = trained_model(inputs, training=False) + return model_outputs, labels + + outputs, labels = strategy.run( + _test_step_fn, args=(next(iterator),)) + # outputs: current batch logits as a tuple of shard logits + outputs = tf.nest.map_structure(strategy.experimental_local_results, + outputs) + labels = tf.nest.map_structure(strategy.experimental_local_results, labels) + return outputs, labels + + def _run_evaluation(test_iterator): + """Runs evaluation steps.""" + preds, golds = list(), list() + for _ in range(eval_steps): + logits, labels = test_step(test_iterator) + for cur_logits, cur_labels in zip(logits, labels): + preds.extend(tf.math.argmax(cur_logits, axis=1).numpy()) + golds.extend(cur_labels.numpy().tolist()) + return preds, golds + + test_iter = iter( + strategy.experimental_distribute_datasets_from_function(eval_input_fn)) + predictions, labels = _run_evaluation(test_iter) + + return predictions, labels + + +def export_classifier(model_export_path, input_meta_data, + restore_model_using_load_weights, bert_config, model_dir): + """Exports a trained model as a `SavedModel` for inference. + + Args: + model_export_path: a string specifying the path to the SavedModel directory. + input_meta_data: dictionary containing meta data about input and model. + restore_model_using_load_weights: Whether to use checkpoint.restore() API + for custom checkpoint or to use model.load_weights() API. There are 2 + different ways to save checkpoints. One is using tf.train.Checkpoint and + another is using Keras model.save_weights(). Custom training loop + implementation uses tf.train.Checkpoint API and Keras ModelCheckpoint + callback internally uses model.save_weights() API. Since these two API's + cannot be used together, model loading logic must be take into account how + model checkpoint was saved. + bert_config: Bert configuration file to define core bert layers. + model_dir: The directory where the model weights and training/evaluation + summaries are stored. + + Raises: + Export path is not specified, got an empty string or None. + """ + if not model_export_path: + raise ValueError('Export path is not specified: %s' % model_export_path) + if not model_dir: + raise ValueError('Export path is not specified: %s' % model_dir) + + # Export uses float32 for now, even if training uses mixed precision. + tf.keras.mixed_precision.experimental.set_policy('float32') + classifier_model = bert_models.classifier_model( + bert_config, input_meta_data['num_labels'], + input_meta_data['max_seq_length'])[0] + + model_saving_utils.export_bert_model( + model_export_path, + model=classifier_model, + checkpoint_dir=model_dir, + restore_model_using_load_weights=restore_model_using_load_weights) + + +def run_bert(strategy, + input_meta_data, + model_config, + train_input_fn=None, + eval_input_fn=None): + """Run BERT training.""" + if FLAGS.mode == 'export_only': + # As Keras ModelCheckpoint callback used with Keras compile/fit() API + # internally uses model.save_weights() to save checkpoints, we must + # use model.load_weights() when Keras compile/fit() is used. + export_classifier(FLAGS.model_export_path, input_meta_data, + FLAGS.use_keras_compile_fit, + model_config, FLAGS.model_dir) + return + + if FLAGS.mode != 'train_and_eval': + raise ValueError('Unsupported mode is specified: %s' % FLAGS.mode) + # Enables XLA in Session Config. Should not be set for TPU. + keras_utils.set_config_v2(FLAGS.enable_xla) + performance.set_mixed_precision_policy(common_flags.dtype()) + + epochs = FLAGS.num_train_epochs + train_data_size = input_meta_data['train_data_size'] + steps_per_epoch = int(train_data_size / FLAGS.train_batch_size) + warmup_steps = int(epochs * train_data_size * 0.1 / FLAGS.train_batch_size) + eval_steps = int( + math.ceil(input_meta_data['eval_data_size'] / FLAGS.eval_batch_size)) + + if not strategy: + raise ValueError('Distribution strategy has not been specified.') + + if FLAGS.log_steps: + custom_callbacks = [keras_utils.TimeHistory( + batch_size=FLAGS.train_batch_size, + log_steps=FLAGS.log_steps, + logdir=FLAGS.model_dir, + )] + else: + custom_callbacks = None + + trained_model = run_bert_classifier( + strategy, + model_config, + input_meta_data, + FLAGS.model_dir, + epochs, + steps_per_epoch, + FLAGS.steps_per_loop, + eval_steps, + warmup_steps, + FLAGS.learning_rate, + FLAGS.init_checkpoint, + train_input_fn, + eval_input_fn, + run_eagerly=FLAGS.run_eagerly, + use_keras_compile_fit=FLAGS.use_keras_compile_fit, + custom_callbacks=custom_callbacks) + + if FLAGS.model_export_path: + # As Keras ModelCheckpoint callback used with Keras compile/fit() API + # internally uses model.save_weights() to save checkpoints, we must + # use model.load_weights() when Keras compile/fit() is used. + model_saving_utils.export_bert_model( + FLAGS.model_export_path, + model=trained_model, + restore_model_using_load_weights=FLAGS.use_keras_compile_fit) + return trained_model + + +def main(_): + # Users should always run this script under TF 2.x + + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + input_meta_data = json.loads(reader.read().decode('utf-8')) + + if not FLAGS.model_dir: + FLAGS.model_dir = '/tmp/bert20/' + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + tpu_address=FLAGS.tpu) + max_seq_length = input_meta_data['max_seq_length'] + train_input_fn = get_dataset_fn( + FLAGS.train_data_path, + max_seq_length, + FLAGS.train_batch_size, + is_training=True) + eval_input_fn = get_dataset_fn( + FLAGS.eval_data_path, + max_seq_length, + FLAGS.eval_batch_size, + is_training=False) + + bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file) + run_bert(strategy, input_meta_data, bert_config, train_input_fn, + eval_input_fn) + + +if __name__ == '__main__': + flags.mark_flag_as_required('bert_config_file') + flags.mark_flag_as_required('input_meta_data_path') + flags.mark_flag_as_required('model_dir') + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_pretraining.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_pretraining.py new file mode 100644 index 0000000..25d412e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_pretraining.py @@ -0,0 +1,187 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Run masked LM/next sentence pre-training for BERT in TF 2.x.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app +from absl import flags +from absl import logging +import gin +import tensorflow as tf +from official.modeling import performance +from official.nlp import optimization +from official.nlp.bert import bert_models +from official.nlp.bert import common_flags +from official.nlp.bert import configs +from official.nlp.bert import input_pipeline +from official.nlp.bert import model_training_utils +from official.utils.misc import distribution_utils + + +flags.DEFINE_string('input_files', None, + 'File path to retrieve training data for pre-training.') +# Model training specific flags. +flags.DEFINE_integer( + 'max_seq_length', 128, + 'The maximum total input sequence length after WordPiece tokenization. ' + 'Sequences longer than this will be truncated, and sequences shorter ' + 'than this will be padded.') +flags.DEFINE_integer('max_predictions_per_seq', 20, + 'Maximum predictions per sequence_output.') +flags.DEFINE_integer('train_batch_size', 32, 'Total batch size for training.') +flags.DEFINE_integer('num_steps_per_epoch', 1000, + 'Total number of training steps to run per epoch.') +flags.DEFINE_float('warmup_steps', 10000, + 'Warmup steps for Adam weight decay optimizer.') +flags.DEFINE_bool('use_next_sentence_label', True, + 'Whether to use next sentence label to compute final loss.') + +common_flags.define_common_bert_flags() +common_flags.define_gin_flags() + +FLAGS = flags.FLAGS + + +def get_pretrain_dataset_fn(input_file_pattern, seq_length, + max_predictions_per_seq, global_batch_size, + use_next_sentence_label=True): + """Returns input dataset from input file string.""" + def _dataset_fn(ctx=None): + """Returns tf.data.Dataset for distributed BERT pretraining.""" + input_patterns = input_file_pattern.split(',') + batch_size = ctx.get_per_replica_batch_size(global_batch_size) + train_dataset = input_pipeline.create_pretrain_dataset( + input_patterns, + seq_length, + max_predictions_per_seq, + batch_size, + is_training=True, + input_pipeline_context=ctx, + use_next_sentence_label=use_next_sentence_label) + return train_dataset + + return _dataset_fn + + +def get_loss_fn(): + """Returns loss function for BERT pretraining.""" + + def _bert_pretrain_loss_fn(unused_labels, losses, **unused_args): + return tf.reduce_mean(losses) + + return _bert_pretrain_loss_fn + + +def run_customized_training(strategy, + bert_config, + max_seq_length, + max_predictions_per_seq, + model_dir, + steps_per_epoch, + steps_per_loop, + epochs, + initial_lr, + warmup_steps, + end_lr, + optimizer_type, + input_files, + train_batch_size, + use_next_sentence_label=True): + """Run BERT pretrain model training using low-level API.""" + + train_input_fn = get_pretrain_dataset_fn(input_files, max_seq_length, + max_predictions_per_seq, + train_batch_size, + use_next_sentence_label) + + def _get_pretrain_model(): + """Gets a pretraining model.""" + pretrain_model, core_model = bert_models.pretrain_model( + bert_config, max_seq_length, max_predictions_per_seq, + use_next_sentence_label=use_next_sentence_label) + optimizer = optimization.create_optimizer( + initial_lr, steps_per_epoch * epochs, warmup_steps, + end_lr, optimizer_type) + pretrain_model.optimizer = performance.configure_optimizer( + optimizer, + use_float16=common_flags.use_float16(), + use_graph_rewrite=common_flags.use_graph_rewrite()) + return pretrain_model, core_model + + trained_model = model_training_utils.run_customized_training_loop( + strategy=strategy, + model_fn=_get_pretrain_model, + loss_fn=get_loss_fn(), + scale_loss=FLAGS.scale_loss, + model_dir=model_dir, + train_input_fn=train_input_fn, + steps_per_epoch=steps_per_epoch, + steps_per_loop=steps_per_loop, + epochs=epochs, + sub_model_export_name='pretrained/bert_model') + + return trained_model + + +def run_bert_pretrain(strategy): + """Runs BERT pre-training.""" + + bert_config = configs.BertConfig.from_json_file(FLAGS.bert_config_file) + if not strategy: + raise ValueError('Distribution strategy is not specified.') + + # Runs customized training loop. + logging.info('Training using customized training loop TF 2.0 with distrubuted' + 'strategy.') + + performance.set_mixed_precision_policy(common_flags.dtype()) + + return run_customized_training( + strategy, + bert_config, + FLAGS.max_seq_length, + FLAGS.max_predictions_per_seq, + FLAGS.model_dir, + FLAGS.num_steps_per_epoch, + FLAGS.steps_per_loop, + FLAGS.num_train_epochs, + FLAGS.learning_rate, + FLAGS.warmup_steps, + FLAGS.end_lr, + FLAGS.optimizer_type, + FLAGS.input_files, + FLAGS.train_batch_size, + FLAGS.use_next_sentence_label) + + +def main(_): + # Users should always run this script under TF 2.x + gin.parse_config_files_and_bindings(FLAGS.gin_file, FLAGS.gin_param) + if not FLAGS.model_dir: + FLAGS.model_dir = '/tmp/bert20/' + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + tpu_address=FLAGS.tpu) + if strategy: + print('***** Number of cores used : ', strategy.num_replicas_in_sync) + + run_bert_pretrain(strategy) + + +if __name__ == '__main__': + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad.py new file mode 100644 index 0000000..2a5856e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad.py @@ -0,0 +1,149 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Run BERT on SQuAD 1.1 and SQuAD 2.0 in TF 2.x.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import time + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.nlp.bert import configs as bert_configs +from official.nlp.bert import run_squad_helper +from official.nlp.bert import tokenization +from official.nlp.data import squad_lib as squad_lib_wp +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + + +flags.DEFINE_string('vocab_file', None, + 'The vocabulary file that the BERT model was trained on.') + +# More flags can be found in run_squad_helper. +run_squad_helper.define_common_squad_flags() + +FLAGS = flags.FLAGS + + +def train_squad(strategy, + input_meta_data, + custom_callbacks=None, + run_eagerly=False, + init_checkpoint=None): + """Run bert squad training.""" + bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file) + init_checkpoint = init_checkpoint or FLAGS.init_checkpoint + run_squad_helper.train_squad(strategy, input_meta_data, bert_config, + custom_callbacks, run_eagerly, init_checkpoint) + + +def predict_squad(strategy, input_meta_data): + """Makes predictions for the squad dataset.""" + bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file) + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + run_squad_helper.predict_squad( + strategy, input_meta_data, tokenizer, bert_config, squad_lib_wp) + + +def eval_squad(strategy, input_meta_data): + """Evaluate on the squad dataset.""" + bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file) + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + eval_metrics = run_squad_helper.eval_squad( + strategy, input_meta_data, tokenizer, bert_config, squad_lib_wp) + return eval_metrics + + +def export_squad(model_export_path, input_meta_data): + """Exports a trained model as a `SavedModel` for inference. + + Args: + model_export_path: a string specifying the path to the SavedModel directory. + input_meta_data: dictionary containing meta data about input and model. + + Raises: + Export path is not specified, got an empty string or None. + """ + bert_config = bert_configs.BertConfig.from_json_file(FLAGS.bert_config_file) + run_squad_helper.export_squad(model_export_path, input_meta_data, bert_config) + + +def main(_): + # Users should always run this script under TF 2.x + + with tf.io.gfile.GFile(FLAGS.input_meta_data_path, 'rb') as reader: + input_meta_data = json.loads(reader.read().decode('utf-8')) + + if FLAGS.mode == 'export_only': + export_squad(FLAGS.model_export_path, input_meta_data) + return + + # Configures cluster spec for multi-worker distribution strategy. + if FLAGS.num_gpus > 0: + _ = distribution_utils.configure_cluster(FLAGS.worker_hosts, + FLAGS.task_index) + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + all_reduce_alg=FLAGS.all_reduce_alg, + tpu_address=FLAGS.tpu) + + if 'train' in FLAGS.mode: + if FLAGS.log_steps: + custom_callbacks = [keras_utils.TimeHistory( + batch_size=FLAGS.train_batch_size, + log_steps=FLAGS.log_steps, + logdir=FLAGS.model_dir, + )] + else: + custom_callbacks = None + + train_squad( + strategy, + input_meta_data, + custom_callbacks=custom_callbacks, + run_eagerly=FLAGS.run_eagerly, + ) + if 'predict' in FLAGS.mode: + predict_squad(strategy, input_meta_data) + if 'eval' in FLAGS.mode: + eval_metrics = eval_squad(strategy, input_meta_data) + f1_score = eval_metrics['final_f1'] + logging.info('SQuAD eval F1-score: %f', f1_score) + summary_dir = os.path.join(FLAGS.model_dir, 'summaries', 'eval') + summary_writer = tf.summary.create_file_writer(summary_dir) + with summary_writer.as_default(): + # TODO(lehou): write to the correct step number. + tf.summary.scalar('F1-score', f1_score, step=0) + summary_writer.flush() + # Also write eval_metrics to json file. + squad_lib_wp.write_to_json_files( + eval_metrics, os.path.join(summary_dir, 'eval_metrics.json')) + time.sleep(60) + + +if __name__ == '__main__': + flags.mark_flag_as_required('bert_config_file') + flags.mark_flag_as_required('model_dir') + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad_helper.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad_helper.py new file mode 100644 index 0000000..07c22ed --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/run_squad_helper.py @@ -0,0 +1,432 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Library for running BERT family models on SQuAD 1.1/2.0 in TF 2.x.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import json +import os +from absl import flags +from absl import logging +import tensorflow as tf +from official.modeling import performance +from official.nlp import optimization +from official.nlp.bert import bert_models +from official.nlp.bert import common_flags +from official.nlp.bert import input_pipeline +from official.nlp.bert import model_saving_utils +from official.nlp.bert import model_training_utils +from official.nlp.bert import squad_evaluate_v1_1 +from official.nlp.bert import squad_evaluate_v2_0 +from official.nlp.data import squad_lib_sp +from official.utils.misc import keras_utils + + +def define_common_squad_flags(): + """Defines common flags used by SQuAD tasks.""" + flags.DEFINE_enum( + 'mode', 'train_and_eval', + ['train_and_eval', 'train_and_predict', + 'train', 'eval', 'predict', 'export_only'], + 'One of {"train_and_eval", "train_and_predict", ' + '"train", "eval", "predict", "export_only"}. ' + '`train_and_eval`: train & predict to json files & compute eval metrics. ' + '`train_and_predict`: train & predict to json files. ' + '`train`: only trains the model. ' + '`eval`: predict answers from squad json file & compute eval metrics. ' + '`predict`: predict answers from the squad json file. ' + '`export_only`: will take the latest checkpoint inside ' + 'model_dir and export a `SavedModel`.') + flags.DEFINE_string('train_data_path', '', + 'Training data path with train tfrecords.') + flags.DEFINE_string( + 'input_meta_data_path', None, + 'Path to file that contains meta data about input ' + 'to be used for training and evaluation.') + # Model training specific flags. + flags.DEFINE_integer('train_batch_size', 32, 'Total batch size for training.') + # Predict processing related. + flags.DEFINE_string('predict_file', None, + 'Prediction data path with train tfrecords.') + flags.DEFINE_bool( + 'do_lower_case', True, + 'Whether to lower case the input text. Should be True for uncased ' + 'models and False for cased models.') + flags.DEFINE_float( + 'null_score_diff_threshold', 0.0, + 'If null_score - best_non_null is greater than the threshold, ' + 'predict null. This is only used for SQuAD v2.') + flags.DEFINE_bool( + 'verbose_logging', False, + 'If true, all of the warnings related to data processing will be ' + 'printed. A number of warnings are expected for a normal SQuAD ' + 'evaluation.') + flags.DEFINE_integer('predict_batch_size', 8, + 'Total batch size for prediction.') + flags.DEFINE_integer( + 'n_best_size', 20, + 'The total number of n-best predictions to generate in the ' + 'nbest_predictions.json output file.') + flags.DEFINE_integer( + 'max_answer_length', 30, + 'The maximum length of an answer that can be generated. This is needed ' + 'because the start and end predictions are not conditioned on one ' + 'another.') + + common_flags.define_common_bert_flags() + + +FLAGS = flags.FLAGS + + +def squad_loss_fn(start_positions, + end_positions, + start_logits, + end_logits): + """Returns sparse categorical crossentropy for start/end logits.""" + start_loss = tf.keras.losses.sparse_categorical_crossentropy( + start_positions, start_logits, from_logits=True) + end_loss = tf.keras.losses.sparse_categorical_crossentropy( + end_positions, end_logits, from_logits=True) + + total_loss = (tf.reduce_mean(start_loss) + tf.reduce_mean(end_loss)) / 2 + return total_loss + + +def get_loss_fn(): + """Gets a loss function for squad task.""" + + def _loss_fn(labels, model_outputs): + start_positions = labels['start_positions'] + end_positions = labels['end_positions'] + start_logits, end_logits = model_outputs + return squad_loss_fn( + start_positions, + end_positions, + start_logits, + end_logits) + + return _loss_fn + + +RawResult = collections.namedtuple('RawResult', + ['unique_id', 'start_logits', 'end_logits']) + + +def get_raw_results(predictions): + """Converts multi-replica predictions to RawResult.""" + for unique_ids, start_logits, end_logits in zip(predictions['unique_ids'], + predictions['start_logits'], + predictions['end_logits']): + for values in zip(unique_ids.numpy(), start_logits.numpy(), + end_logits.numpy()): + yield RawResult( + unique_id=values[0], + start_logits=values[1].tolist(), + end_logits=values[2].tolist()) + + +def get_dataset_fn(input_file_pattern, max_seq_length, global_batch_size, + is_training): + """Gets a closure to create a dataset..""" + + def _dataset_fn(ctx=None): + """Returns tf.data.Dataset for distributed BERT pretraining.""" + batch_size = ctx.get_per_replica_batch_size( + global_batch_size) if ctx else global_batch_size + dataset = input_pipeline.create_squad_dataset( + input_file_pattern, + max_seq_length, + batch_size, + is_training=is_training, + input_pipeline_context=ctx) + return dataset + + return _dataset_fn + + +def predict_squad_customized(strategy, + input_meta_data, + bert_config, + checkpoint_path, + predict_tfrecord_path, + num_steps): + """Make predictions using a Bert-based squad model.""" + predict_dataset_fn = get_dataset_fn( + predict_tfrecord_path, + input_meta_data['max_seq_length'], + FLAGS.predict_batch_size, + is_training=False) + predict_iterator = iter( + strategy.experimental_distribute_datasets_from_function( + predict_dataset_fn)) + + with strategy.scope(): + # Prediction always uses float32, even if training uses mixed precision. + tf.keras.mixed_precision.experimental.set_policy('float32') + squad_model, _ = bert_models.squad_model( + bert_config, + input_meta_data['max_seq_length'], + hub_module_url=FLAGS.hub_module_url) + + if checkpoint_path is None: + checkpoint_path = tf.train.latest_checkpoint(FLAGS.model_dir) + logging.info('Restoring checkpoints from %s', checkpoint_path) + checkpoint = tf.train.Checkpoint(model=squad_model) + checkpoint.restore(checkpoint_path).expect_partial() + + @tf.function + def predict_step(iterator): + """Predicts on distributed devices.""" + + def _replicated_step(inputs): + """Replicated prediction calculation.""" + x, _ = inputs + unique_ids = x.pop('unique_ids') + start_logits, end_logits = squad_model(x, training=False) + return dict( + unique_ids=unique_ids, + start_logits=start_logits, + end_logits=end_logits) + + outputs = strategy.run(_replicated_step, args=(next(iterator),)) + return tf.nest.map_structure(strategy.experimental_local_results, outputs) + + all_results = [] + for _ in range(num_steps): + predictions = predict_step(predict_iterator) + for result in get_raw_results(predictions): + all_results.append(result) + if len(all_results) % 100 == 0: + logging.info('Made predictions for %d records.', len(all_results)) + return all_results + + +def train_squad(strategy, + input_meta_data, + bert_config, + custom_callbacks=None, + run_eagerly=False, + init_checkpoint=None): + """Run bert squad training.""" + if strategy: + logging.info('Training using customized training loop with distribution' + ' strategy.') + # Enables XLA in Session Config. Should not be set for TPU. + keras_utils.set_config_v2(FLAGS.enable_xla) + performance.set_mixed_precision_policy(common_flags.dtype()) + + epochs = FLAGS.num_train_epochs + num_train_examples = input_meta_data['train_data_size'] + max_seq_length = input_meta_data['max_seq_length'] + steps_per_epoch = int(num_train_examples / FLAGS.train_batch_size) + warmup_steps = int(epochs * num_train_examples * 0.1 / FLAGS.train_batch_size) + train_input_fn = get_dataset_fn( + FLAGS.train_data_path, + max_seq_length, + FLAGS.train_batch_size, + is_training=True) + + def _get_squad_model(): + """Get Squad model and optimizer.""" + squad_model, core_model = bert_models.squad_model( + bert_config, + max_seq_length, + hub_module_url=FLAGS.hub_module_url, + hub_module_trainable=FLAGS.hub_module_trainable) + optimizer = optimization.create_optimizer(FLAGS.learning_rate, + steps_per_epoch * epochs, + warmup_steps, + FLAGS.end_lr, + FLAGS.optimizer_type) + + squad_model.optimizer = performance.configure_optimizer( + optimizer, + use_float16=common_flags.use_float16(), + use_graph_rewrite=common_flags.use_graph_rewrite()) + return squad_model, core_model + + # If explicit_allreduce = True, apply_gradients() no longer implicitly + # allreduce gradients, users manually allreduce gradient and pass the + # allreduced grads_and_vars to apply_gradients(). clip_by_global_norm will be + # applied to allreduced gradients. + def clip_by_global_norm_callback(grads_and_vars): + grads, variables = zip(*grads_and_vars) + (clipped_grads, _) = tf.clip_by_global_norm(grads, clip_norm=1.0) + return zip(clipped_grads, variables) + + model_training_utils.run_customized_training_loop( + strategy=strategy, + model_fn=_get_squad_model, + loss_fn=get_loss_fn(), + model_dir=FLAGS.model_dir, + steps_per_epoch=steps_per_epoch, + steps_per_loop=FLAGS.steps_per_loop, + epochs=epochs, + train_input_fn=train_input_fn, + init_checkpoint=init_checkpoint or FLAGS.init_checkpoint, + run_eagerly=run_eagerly, + custom_callbacks=custom_callbacks, + explicit_allreduce=False, + post_allreduce_callbacks=[clip_by_global_norm_callback]) + + +def prediction_output_squad( + strategy, input_meta_data, tokenizer, bert_config, squad_lib, checkpoint): + """Makes predictions for a squad dataset.""" + doc_stride = input_meta_data['doc_stride'] + max_query_length = input_meta_data['max_query_length'] + # Whether data should be in Ver 2.0 format. + version_2_with_negative = input_meta_data.get('version_2_with_negative', + False) + eval_examples = squad_lib.read_squad_examples( + input_file=FLAGS.predict_file, + is_training=False, + version_2_with_negative=version_2_with_negative) + + eval_writer = squad_lib.FeatureWriter( + filename=os.path.join(FLAGS.model_dir, 'eval.tf_record'), + is_training=False) + eval_features = [] + + def _append_feature(feature, is_padding): + if not is_padding: + eval_features.append(feature) + eval_writer.process_feature(feature) + + # TPU requires a fixed batch size for all batches, therefore the number + # of examples must be a multiple of the batch size, or else examples + # will get dropped. So we pad with fake examples which are ignored + # later on. + kwargs = dict( + examples=eval_examples, + tokenizer=tokenizer, + max_seq_length=input_meta_data['max_seq_length'], + doc_stride=doc_stride, + max_query_length=max_query_length, + is_training=False, + output_fn=_append_feature, + batch_size=FLAGS.predict_batch_size) + + # squad_lib_sp requires one more argument 'do_lower_case'. + if squad_lib == squad_lib_sp: + kwargs['do_lower_case'] = FLAGS.do_lower_case + dataset_size = squad_lib.convert_examples_to_features(**kwargs) + eval_writer.close() + + logging.info('***** Running predictions *****') + logging.info(' Num orig examples = %d', len(eval_examples)) + logging.info(' Num split examples = %d', len(eval_features)) + logging.info(' Batch size = %d', FLAGS.predict_batch_size) + + num_steps = int(dataset_size / FLAGS.predict_batch_size) + all_results = predict_squad_customized( + strategy, input_meta_data, bert_config, + checkpoint, eval_writer.filename, num_steps) + + all_predictions, all_nbest_json, scores_diff_json = ( + squad_lib.postprocess_output( + eval_examples, + eval_features, + all_results, + FLAGS.n_best_size, + FLAGS.max_answer_length, + FLAGS.do_lower_case, + version_2_with_negative=version_2_with_negative, + null_score_diff_threshold=FLAGS.null_score_diff_threshold, + verbose=FLAGS.verbose_logging)) + + return all_predictions, all_nbest_json, scores_diff_json + + +def dump_to_files(all_predictions, all_nbest_json, scores_diff_json, + squad_lib, version_2_with_negative): + """Save output to json files.""" + output_prediction_file = os.path.join(FLAGS.model_dir, 'predictions.json') + output_nbest_file = os.path.join(FLAGS.model_dir, 'nbest_predictions.json') + output_null_log_odds_file = os.path.join(FLAGS.model_dir, 'null_odds.json') + logging.info('Writing predictions to: %s', (output_prediction_file)) + logging.info('Writing nbest to: %s', (output_nbest_file)) + + squad_lib.write_to_json_files(all_predictions, output_prediction_file) + squad_lib.write_to_json_files(all_nbest_json, output_nbest_file) + if version_2_with_negative: + squad_lib.write_to_json_files(scores_diff_json, output_null_log_odds_file) + + +def predict_squad(strategy, + input_meta_data, + tokenizer, + bert_config, + squad_lib, + init_checkpoint=None): + """Get prediction results and evaluate them to hard drive.""" + if init_checkpoint is None: + init_checkpoint = tf.train.latest_checkpoint(FLAGS.model_dir) + all_predictions, all_nbest_json, scores_diff_json = prediction_output_squad( + strategy, input_meta_data, tokenizer, + bert_config, squad_lib, init_checkpoint) + dump_to_files(all_predictions, all_nbest_json, scores_diff_json, squad_lib, + input_meta_data.get('version_2_with_negative', False)) + + +def eval_squad(strategy, + input_meta_data, + tokenizer, + bert_config, + squad_lib, + init_checkpoint=None): + """Get prediction results and evaluate them against ground truth.""" + if init_checkpoint is None: + init_checkpoint = tf.train.latest_checkpoint(FLAGS.model_dir) + all_predictions, all_nbest_json, scores_diff_json = prediction_output_squad( + strategy, input_meta_data, tokenizer, + bert_config, squad_lib, init_checkpoint) + dump_to_files(all_predictions, all_nbest_json, scores_diff_json, squad_lib, + input_meta_data.get('version_2_with_negative', False)) + + with tf.io.gfile.GFile(FLAGS.predict_file, 'r') as reader: + dataset_json = json.load(reader) + pred_dataset = dataset_json['data'] + if input_meta_data.get('version_2_with_negative', False): + eval_metrics = squad_evaluate_v2_0.evaluate(pred_dataset, + all_predictions, + scores_diff_json) + else: + eval_metrics = squad_evaluate_v1_1.evaluate(pred_dataset, all_predictions) + return eval_metrics + + +def export_squad(model_export_path, input_meta_data, bert_config): + """Exports a trained model as a `SavedModel` for inference. + + Args: + model_export_path: a string specifying the path to the SavedModel directory. + input_meta_data: dictionary containing meta data about input and model. + bert_config: Bert configuration file to define core bert layers. + + Raises: + Export path is not specified, got an empty string or None. + """ + if not model_export_path: + raise ValueError('Export path is not specified: %s' % model_export_path) + # Export uses float32 for now, even if training uses mixed precision. + tf.keras.mixed_precision.experimental.set_policy('float32') + squad_model, _ = bert_models.squad_model(bert_config, + input_meta_data['max_seq_length']) + model_saving_utils.export_bert_model( + model_export_path, model=squad_model, checkpoint_dir=FLAGS.model_dir) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v1_1.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v1_1.py new file mode 100644 index 0000000..c7f4f4d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v1_1.py @@ -0,0 +1,108 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Evaluation of SQuAD predictions (version 1.1). + +The functions are copied from +https://worksheets.codalab.org/rest/bundles/0xbcd57bee090b421c982906709c8c27e1/contents/blob/. + +The SQuAD dataset is described in this paper: +SQuAD: 100,000+ Questions for Machine Comprehension of Text +Pranav Rajpurkar, Jian Zhang, Konstantin Lopyrev, Percy Liang +https://nlp.stanford.edu/pubs/rajpurkar2016squad.pdf +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import re +import string + +# pylint: disable=g-bad-import-order +from absl import logging +# pylint: enable=g-bad-import-order + + +def _normalize_answer(s): + """Lowers text and remove punctuation, articles and extra whitespace.""" + + def remove_articles(text): + return re.sub(r"\b(a|an|the)\b", " ", text) + + def white_space_fix(text): + return " ".join(text.split()) + + def remove_punc(text): + exclude = set(string.punctuation) + return "".join(ch for ch in text if ch not in exclude) + + def lower(text): + return text.lower() + + return white_space_fix(remove_articles(remove_punc(lower(s)))) + + +def _f1_score(prediction, ground_truth): + """Computes F1 score by comparing prediction to ground truth.""" + prediction_tokens = _normalize_answer(prediction).split() + ground_truth_tokens = _normalize_answer(ground_truth).split() + prediction_counter = collections.Counter(prediction_tokens) + ground_truth_counter = collections.Counter(ground_truth_tokens) + common = prediction_counter & ground_truth_counter + num_same = sum(common.values()) + if num_same == 0: + return 0 + precision = 1.0 * num_same / len(prediction_tokens) + recall = 1.0 * num_same / len(ground_truth_tokens) + f1 = (2 * precision * recall) / (precision + recall) + return f1 + + +def _exact_match_score(prediction, ground_truth): + """Checks if predicted answer exactly matches ground truth answer.""" + return _normalize_answer(prediction) == _normalize_answer(ground_truth) + + +def _metric_max_over_ground_truths(metric_fn, prediction, ground_truths): + """Computes the max over all metric scores.""" + scores_for_ground_truths = [] + for ground_truth in ground_truths: + score = metric_fn(prediction, ground_truth) + scores_for_ground_truths.append(score) + return max(scores_for_ground_truths) + + +def evaluate(dataset, predictions): + """Evaluates predictions for a dataset.""" + f1 = exact_match = total = 0 + for article in dataset: + for paragraph in article["paragraphs"]: + for qa in paragraph["qas"]: + total += 1 + if qa["id"] not in predictions: + message = "Unanswered question " + qa["id"] + " will receive score 0." + logging.error(message) + continue + ground_truths = [entry["text"] for entry in qa["answers"]] + prediction = predictions[qa["id"]] + exact_match += _metric_max_over_ground_truths(_exact_match_score, + prediction, ground_truths) + f1 += _metric_max_over_ground_truths(_f1_score, prediction, + ground_truths) + + exact_match = exact_match / total + f1 = f1 / total + + return {"exact_match": exact_match, "final_f1": f1} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v2_0.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v2_0.py new file mode 100644 index 0000000..54fb84e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/squad_evaluate_v2_0.py @@ -0,0 +1,252 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Evaluation script for SQuAD version 2.0. + +The functions are copied and modified from +https://raw.githubusercontent.com/white127/SQUAD-2.0-bidaf/master/evaluate-v2.0.py + +In addition to basic functionality, we also compute additional statistics and +plot precision-recall curves if an additional na_prob.json file is provided. +This file is expected to map question ID's to the model's predicted probability +that a question is unanswerable. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import re +import string + +from absl import logging + + +def _make_qid_to_has_ans(dataset): + qid_to_has_ans = {} + for article in dataset: + for p in article['paragraphs']: + for qa in p['qas']: + qid_to_has_ans[qa['id']] = bool(qa['answers']) + return qid_to_has_ans + + +def _normalize_answer(s): + """Lower text and remove punctuation, articles and extra whitespace.""" + def remove_articles(text): + regex = re.compile(r'\b(a|an|the)\b', re.UNICODE) + return re.sub(regex, ' ', text) + def white_space_fix(text): + return ' '.join(text.split()) + def remove_punc(text): + exclude = set(string.punctuation) + return ''.join(ch for ch in text if ch not in exclude) + def lower(text): + return text.lower() + return white_space_fix(remove_articles(remove_punc(lower(s)))) + + +def _get_tokens(s): + if not s: return [] + return _normalize_answer(s).split() + + +def _compute_exact(a_gold, a_pred): + return int(_normalize_answer(a_gold) == _normalize_answer(a_pred)) + + +def _compute_f1(a_gold, a_pred): + """Compute F1-score.""" + gold_toks = _get_tokens(a_gold) + pred_toks = _get_tokens(a_pred) + common = collections.Counter(gold_toks) & collections.Counter(pred_toks) + num_same = sum(common.values()) + if not gold_toks or not pred_toks: + # If either is no-answer, then F1 is 1 if they agree, 0 otherwise + return int(gold_toks == pred_toks) + if num_same == 0: + return 0 + precision = 1.0 * num_same / len(pred_toks) + recall = 1.0 * num_same / len(gold_toks) + f1 = (2 * precision * recall) / (precision + recall) + return f1 + + +def _get_raw_scores(dataset, predictions): + """Compute raw scores.""" + exact_scores = {} + f1_scores = {} + for article in dataset: + for p in article['paragraphs']: + for qa in p['qas']: + qid = qa['id'] + gold_answers = [a['text'] for a in qa['answers'] + if _normalize_answer(a['text'])] + if not gold_answers: + # For unanswerable questions, only correct answer is empty string + gold_answers = [''] + if qid not in predictions: + logging.error('Missing prediction for %s', qid) + continue + a_pred = predictions[qid] + # Take max over all gold answers + exact_scores[qid] = max(_compute_exact(a, a_pred) for a in gold_answers) + f1_scores[qid] = max(_compute_f1(a, a_pred) for a in gold_answers) + return exact_scores, f1_scores + + +def _apply_no_ans_threshold( + scores, na_probs, qid_to_has_ans, na_prob_thresh=1.0): + new_scores = {} + for qid, s in scores.items(): + pred_na = na_probs[qid] > na_prob_thresh + if pred_na: + new_scores[qid] = float(not qid_to_has_ans[qid]) + else: + new_scores[qid] = s + return new_scores + + +def _make_eval_dict(exact_scores, f1_scores, qid_list=None): + """Make evaluation result dictionary.""" + if not qid_list: + total = len(exact_scores) + return collections.OrderedDict([ + ('exact', 100.0 * sum(exact_scores.values()) / total), + ('f1', 100.0 * sum(f1_scores.values()) / total), + ('total', total), + ]) + else: + total = len(qid_list) + return collections.OrderedDict([ + ('exact', 100.0 * sum(exact_scores[k] for k in qid_list) / total), + ('f1', 100.0 * sum(f1_scores[k] for k in qid_list) / total), + ('total', total), + ]) + + +def _merge_eval(main_eval, new_eval, prefix): + for k in new_eval: + main_eval['%s_%s' % (prefix, k)] = new_eval[k] + + +def _make_precision_recall_eval(scores, na_probs, num_true_pos, qid_to_has_ans): + """Make evaluation dictionary containing average recision recall.""" + qid_list = sorted(na_probs, key=lambda k: na_probs[k]) + true_pos = 0.0 + cur_p = 1.0 + cur_r = 0.0 + precisions = [1.0] + recalls = [0.0] + avg_prec = 0.0 + for i, qid in enumerate(qid_list): + if qid_to_has_ans[qid]: + true_pos += scores[qid] + cur_p = true_pos / float(i+1) + cur_r = true_pos / float(num_true_pos) + if i == len(qid_list) - 1 or na_probs[qid] != na_probs[qid_list[i+1]]: + # i.e., if we can put a threshold after this point + avg_prec += cur_p * (cur_r - recalls[-1]) + precisions.append(cur_p) + recalls.append(cur_r) + return {'ap': 100.0 * avg_prec} + + +def _run_precision_recall_analysis( + main_eval, exact_raw, f1_raw, na_probs, qid_to_has_ans): + """Run precision recall analysis and return result dictionary.""" + num_true_pos = sum(1 for v in qid_to_has_ans.values() if v) + if num_true_pos == 0: + return + pr_exact = _make_precision_recall_eval( + exact_raw, na_probs, num_true_pos, qid_to_has_ans) + pr_f1 = _make_precision_recall_eval( + f1_raw, na_probs, num_true_pos, qid_to_has_ans) + oracle_scores = {k: float(v) for k, v in qid_to_has_ans.items()} + pr_oracle = _make_precision_recall_eval( + oracle_scores, na_probs, num_true_pos, qid_to_has_ans) + _merge_eval(main_eval, pr_exact, 'pr_exact') + _merge_eval(main_eval, pr_f1, 'pr_f1') + _merge_eval(main_eval, pr_oracle, 'pr_oracle') + + +def _find_best_thresh(predictions, scores, na_probs, qid_to_has_ans): + """Find the best threshold for no answer probability.""" + num_no_ans = sum(1 for k in qid_to_has_ans if not qid_to_has_ans[k]) + cur_score = num_no_ans + best_score = cur_score + best_thresh = 0.0 + qid_list = sorted(na_probs, key=lambda k: na_probs[k]) + for qid in qid_list: + if qid not in scores: continue + if qid_to_has_ans[qid]: + diff = scores[qid] + else: + if predictions[qid]: + diff = -1 + else: + diff = 0 + cur_score += diff + if cur_score > best_score: + best_score = cur_score + best_thresh = na_probs[qid] + return 100.0 * best_score / len(scores), best_thresh + + +def _find_all_best_thresh( + main_eval, predictions, exact_raw, f1_raw, na_probs, qid_to_has_ans): + best_exact, exact_thresh = _find_best_thresh( + predictions, exact_raw, na_probs, qid_to_has_ans) + best_f1, f1_thresh = _find_best_thresh( + predictions, f1_raw, na_probs, qid_to_has_ans) + main_eval['final_exact'] = best_exact + main_eval['final_exact_thresh'] = exact_thresh + main_eval['final_f1'] = best_f1 + main_eval['final_f1_thresh'] = f1_thresh + + +def evaluate(dataset, predictions, na_probs=None): + """Evaluate prediction results.""" + new_orig_data = [] + for article in dataset: + for p in article['paragraphs']: + for qa in p['qas']: + if qa['id'] in predictions: + new_para = {'qas': [qa]} + new_article = {'paragraphs': [new_para]} + new_orig_data.append(new_article) + dataset = new_orig_data + + if na_probs is None: + na_probs = {k: 0.0 for k in predictions} + qid_to_has_ans = _make_qid_to_has_ans(dataset) # maps qid to True/False + has_ans_qids = [k for k, v in qid_to_has_ans.items() if v] + no_ans_qids = [k for k, v in qid_to_has_ans.items() if not v] + exact_raw, f1_raw = _get_raw_scores(dataset, predictions) + exact_thresh = _apply_no_ans_threshold(exact_raw, na_probs, qid_to_has_ans) + f1_thresh = _apply_no_ans_threshold(f1_raw, na_probs, qid_to_has_ans) + out_eval = _make_eval_dict(exact_thresh, f1_thresh) + if has_ans_qids: + has_ans_eval = _make_eval_dict( + exact_thresh, f1_thresh, qid_list=has_ans_qids) + _merge_eval(out_eval, has_ans_eval, 'HasAns') + if no_ans_qids: + no_ans_eval = _make_eval_dict(exact_thresh, f1_thresh, qid_list=no_ans_qids) + _merge_eval(out_eval, no_ans_eval, 'NoAns') + + _find_all_best_thresh( + out_eval, predictions, exact_raw, f1_raw, na_probs, qid_to_has_ans) + _run_precision_recall_analysis( + out_eval, exact_raw, f1_raw, na_probs, qid_to_has_ans) + return out_eval diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf1_checkpoint_converter_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf1_checkpoint_converter_lib.py new file mode 100644 index 0000000..daec829 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf1_checkpoint_converter_lib.py @@ -0,0 +1,195 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Convert checkpoints created by Estimator (tf1) to be Keras compatible.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow.compat.v1 as tf # TF 1.x + +# Mapping between old <=> new names. The source pattern in original variable +# name will be replaced by destination pattern. +BERT_NAME_REPLACEMENTS = ( + ("bert", "bert_model"), + ("embeddings/word_embeddings", "word_embeddings/embeddings"), + ("embeddings/token_type_embeddings", + "embedding_postprocessor/type_embeddings"), + ("embeddings/position_embeddings", + "embedding_postprocessor/position_embeddings"), + ("embeddings/LayerNorm", "embedding_postprocessor/layer_norm"), + ("attention/self", "self_attention"), + ("attention/output/dense", "self_attention_output"), + ("attention/output/LayerNorm", "self_attention_layer_norm"), + ("intermediate/dense", "intermediate"), + ("output/dense", "output"), + ("output/LayerNorm", "output_layer_norm"), + ("pooler/dense", "pooler_transform"), +) + +BERT_V2_NAME_REPLACEMENTS = ( + ("bert/", ""), + ("encoder", "transformer"), + ("embeddings/word_embeddings", "word_embeddings/embeddings"), + ("embeddings/token_type_embeddings", "type_embeddings/embeddings"), + ("embeddings/position_embeddings", "position_embedding/embeddings"), + ("embeddings/LayerNorm", "embeddings/layer_norm"), + ("attention/self", "self_attention"), + ("attention/output/dense", "self_attention_output"), + ("attention/output/LayerNorm", "self_attention_layer_norm"), + ("intermediate/dense", "intermediate"), + ("output/dense", "output"), + ("output/LayerNorm", "output_layer_norm"), + ("pooler/dense", "pooler_transform"), + ("cls/predictions/output_bias", "cls/predictions/output_bias/bias"), + ("cls/seq_relationship/output_bias", "predictions/transform/logits/bias"), + ("cls/seq_relationship/output_weights", + "predictions/transform/logits/kernel"), +) + +BERT_PERMUTATIONS = () + +BERT_V2_PERMUTATIONS = (("cls/seq_relationship/output_weights", (1, 0)),) + + +def _bert_name_replacement(var_name, name_replacements): + """Gets the variable name replacement.""" + for src_pattern, tgt_pattern in name_replacements: + if src_pattern in var_name: + old_var_name = var_name + var_name = var_name.replace(src_pattern, tgt_pattern) + tf.logging.info("Converted: %s --> %s", old_var_name, var_name) + return var_name + + +def _has_exclude_patterns(name, exclude_patterns): + """Checks if a string contains substrings that match patterns to exclude.""" + for p in exclude_patterns: + if p in name: + return True + return False + + +def _get_permutation(name, permutations): + """Checks whether a variable requires transposition by pattern matching.""" + for src_pattern, permutation in permutations: + if src_pattern in name: + tf.logging.info("Permuted: %s --> %s", name, permutation) + return permutation + + return None + + +def _get_new_shape(name, shape, num_heads): + """Checks whether a variable requires reshape by pattern matching.""" + if "self_attention_output/kernel" in name: + return tuple([num_heads, shape[0] // num_heads, shape[1]]) + if "self_attention_output/bias" in name: + return shape + + patterns = [ + "self_attention/query", "self_attention/value", "self_attention/key" + ] + for pattern in patterns: + if pattern in name: + if "kernel" in name: + return tuple([shape[0], num_heads, shape[1] // num_heads]) + if "bias" in name: + return tuple([num_heads, shape[0] // num_heads]) + return None + + +def create_v2_checkpoint(model, src_checkpoint, output_path): + """Converts a name-based matched TF V1 checkpoint to TF V2 checkpoint.""" + # Uses streaming-restore in eager model to read V1 name-based checkpoints. + model.load_weights(src_checkpoint).assert_existing_objects_matched() + checkpoint = tf.train.Checkpoint(model=model) + checkpoint.save(output_path) + + +def convert(checkpoint_from_path, + checkpoint_to_path, + num_heads, + name_replacements, + permutations, + exclude_patterns=None): + """Migrates the names of variables within a checkpoint. + + Args: + checkpoint_from_path: Path to source checkpoint to be read in. + checkpoint_to_path: Path to checkpoint to be written out. + num_heads: The number of heads of the model. + name_replacements: A list of tuples of the form (match_str, replace_str) + describing variable names to adjust. + permutations: A list of tuples of the form (match_str, permutation) + describing permutations to apply to given variables. Note that match_str + should match the original variable name, not the replaced one. + exclude_patterns: A list of string patterns to exclude variables from + checkpoint conversion. + + Returns: + A dictionary that maps the new variable names to the Variable objects. + A dictionary that maps the old variable names to the new variable names. + """ + with tf.Graph().as_default(): + tf.logging.info("Reading checkpoint_from_path %s", checkpoint_from_path) + reader = tf.train.NewCheckpointReader(checkpoint_from_path) + name_shape_map = reader.get_variable_to_shape_map() + new_variable_map = {} + conversion_map = {} + for var_name in name_shape_map: + if exclude_patterns and _has_exclude_patterns(var_name, exclude_patterns): + continue + # Get the original tensor data. + tensor = reader.get_tensor(var_name) + + # Look up the new variable name, if any. + new_var_name = _bert_name_replacement(var_name, name_replacements) + + # See if we need to reshape the underlying tensor. + new_shape = None + if num_heads > 0: + new_shape = _get_new_shape(new_var_name, tensor.shape, num_heads) + if new_shape: + tf.logging.info("Veriable %s has a shape change from %s to %s", + + var_name, tensor.shape, new_shape) + tensor = np.reshape(tensor, new_shape) + + # See if we need to permute the underlying tensor. + permutation = _get_permutation(var_name, permutations) + if permutation: + tensor = np.transpose(tensor, permutation) + + # Create a new variable with the possibly-reshaped or transposed tensor. + var = tf.Variable(tensor, name=var_name) + + # Save the variable into the new variable map. + new_variable_map[new_var_name] = var + + # Keep a list of converter variables for sanity checking. + if new_var_name != var_name: + conversion_map[var_name] = new_var_name + + saver = tf.train.Saver(new_variable_map) + + with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + tf.logging.info("Writing checkpoint_to_path %s", checkpoint_to_path) + saver.save(sess, checkpoint_to_path) + + tf.logging.info("Summary:") + tf.logging.info(" Converted %d variable name(s).", len(new_variable_map)) + tf.logging.info(" Converted: %s", str(conversion_map)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf2_encoder_checkpoint_converter.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf2_encoder_checkpoint_converter.py new file mode 100644 index 0000000..203b238 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tf2_encoder_checkpoint_converter.py @@ -0,0 +1,108 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A converter from a V1 BERT encoder checkpoint to a V2 encoder checkpoint. + +The conversion will yield an object-oriented checkpoint that can be used +to restore a TransformerEncoder object. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app +from absl import flags + +import tensorflow as tf +from official.modeling import activations +from official.nlp.bert import configs +from official.nlp.bert import tf1_checkpoint_converter_lib +from official.nlp.modeling import networks + +FLAGS = flags.FLAGS + +flags.DEFINE_string("bert_config_file", None, + "Bert configuration file to define core bert layers.") +flags.DEFINE_string( + "checkpoint_to_convert", None, + "Initial checkpoint from a pretrained BERT model core (that is, only the " + "BertModel, with no task heads.)") +flags.DEFINE_string("converted_checkpoint_path", None, + "Name for the created object-based V2 checkpoint.") + + +def _create_bert_model(cfg): + """Creates a BERT keras core model from BERT configuration. + + Args: + cfg: A `BertConfig` to create the core model. + Returns: + A TransformerEncoder netowork. + """ + bert_encoder = networks.TransformerEncoder( + vocab_size=cfg.vocab_size, + hidden_size=cfg.hidden_size, + num_layers=cfg.num_hidden_layers, + num_attention_heads=cfg.num_attention_heads, + intermediate_size=cfg.intermediate_size, + activation=activations.gelu, + dropout_rate=cfg.hidden_dropout_prob, + attention_dropout_rate=cfg.attention_probs_dropout_prob, + sequence_length=cfg.max_position_embeddings, + type_vocab_size=cfg.type_vocab_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=cfg.initializer_range)) + + return bert_encoder + + +def convert_checkpoint(bert_config, output_path, v1_checkpoint): + """Converts a V1 checkpoint into an OO V2 checkpoint.""" + output_dir, _ = os.path.split(output_path) + + # Create a temporary V1 name-converted checkpoint in the output directory. + temporary_checkpoint_dir = os.path.join(output_dir, "temp_v1") + temporary_checkpoint = os.path.join(temporary_checkpoint_dir, "ckpt") + tf1_checkpoint_converter_lib.convert( + checkpoint_from_path=v1_checkpoint, + checkpoint_to_path=temporary_checkpoint, + num_heads=bert_config.num_attention_heads, + name_replacements=tf1_checkpoint_converter_lib.BERT_V2_NAME_REPLACEMENTS, + permutations=tf1_checkpoint_converter_lib.BERT_V2_PERMUTATIONS, + exclude_patterns=["adam", "Adam"]) + + # Create a V2 checkpoint from the temporary checkpoint. + model = _create_bert_model(bert_config) + tf1_checkpoint_converter_lib.create_v2_checkpoint(model, temporary_checkpoint, + output_path) + + # Clean up the temporary checkpoint, if it exists. + try: + tf.io.gfile.rmtree(temporary_checkpoint_dir) + except tf.errors.OpError: + # If it doesn't exist, we don't need to clean it up; continue. + pass + + +def main(_): + output_path = FLAGS.converted_checkpoint_path + v1_checkpoint = FLAGS.checkpoint_to_convert + bert_config = configs.BertConfig.from_json_file(FLAGS.bert_config_file) + convert_checkpoint(bert_config, output_path, v1_checkpoint) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization.py new file mode 100644 index 0000000..4c08efb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization.py @@ -0,0 +1,545 @@ +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tokenization classes implementation. + +The file is forked from: +https://github.com/google-research/bert/blob/master/tokenization.py. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import re +import unicodedata + +import six +import tensorflow as tf + +import sentencepiece as spm + +SPIECE_UNDERLINE = "▁" + + +def validate_case_matches_checkpoint(do_lower_case, init_checkpoint): + """Checks whether the casing config is consistent with the checkpoint name.""" + + # The casing has to be passed in by the user and there is no explicit check + # as to whether it matches the checkpoint. The casing information probably + # should have been stored in the bert_config.json file, but it's not, so + # we have to heuristically detect it to validate. + + if not init_checkpoint: + return + + m = re.match("^.*?([A-Za-z0-9_-]+)/bert_model.ckpt", init_checkpoint) + if m is None: + return + + model_name = m.group(1) + + lower_models = [ + "uncased_L-24_H-1024_A-16", "uncased_L-12_H-768_A-12", + "multilingual_L-12_H-768_A-12", "chinese_L-12_H-768_A-12" + ] + + cased_models = [ + "cased_L-12_H-768_A-12", "cased_L-24_H-1024_A-16", + "multi_cased_L-12_H-768_A-12" + ] + + is_bad_config = False + if model_name in lower_models and not do_lower_case: + is_bad_config = True + actual_flag = "False" + case_name = "lowercased" + opposite_flag = "True" + + if model_name in cased_models and do_lower_case: + is_bad_config = True + actual_flag = "True" + case_name = "cased" + opposite_flag = "False" + + if is_bad_config: + raise ValueError( + "You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. " + "However, `%s` seems to be a %s model, so you " + "should pass in `--do_lower_case=%s` so that the fine-tuning matches " + "how the model was pre-training. If this error is wrong, please " + "just comment out this check." % + (actual_flag, init_checkpoint, model_name, case_name, opposite_flag)) + + +def convert_to_unicode(text): + """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" + if six.PY3: + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + elif six.PY2: + if isinstance(text, str): + return text.decode("utf-8", "ignore") + elif isinstance(text, unicode): + return text + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + else: + raise ValueError("Not running on Python2 or Python 3?") + + +def printable_text(text): + """Returns text encoded in a way suitable for print or `tf.logging`.""" + + # These functions want `str` for both Python2 and Python3, but in one case + # it's a Unicode string and in the other it's a byte string. + if six.PY3: + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + elif six.PY2: + if isinstance(text, str): + return text + elif isinstance(text, unicode): + return text.encode("utf-8") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + else: + raise ValueError("Not running on Python2 or Python 3?") + + +def load_vocab(vocab_file): + """Loads a vocabulary file into a dictionary.""" + vocab = collections.OrderedDict() + index = 0 + with tf.io.gfile.GFile(vocab_file, "r") as reader: + while True: + token = convert_to_unicode(reader.readline()) + if not token: + break + token = token.strip() + vocab[token] = index + index += 1 + return vocab + + +def convert_by_vocab(vocab, items): + """Converts a sequence of [tokens|ids] using the vocab.""" + output = [] + for item in items: + output.append(vocab[item]) + return output + + +def convert_tokens_to_ids(vocab, tokens): + return convert_by_vocab(vocab, tokens) + + +def convert_ids_to_tokens(inv_vocab, ids): + return convert_by_vocab(inv_vocab, ids) + + +def whitespace_tokenize(text): + """Runs basic whitespace cleaning and splitting on a piece of text.""" + text = text.strip() + if not text: + return [] + tokens = text.split() + return tokens + + +class FullTokenizer(object): + """Runs end-to-end tokenziation.""" + + def __init__(self, vocab_file, do_lower_case=True, split_on_punc=True): + self.vocab = load_vocab(vocab_file) + self.inv_vocab = {v: k for k, v in self.vocab.items()} + self.basic_tokenizer = BasicTokenizer( + do_lower_case=do_lower_case, split_on_punc=split_on_punc) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + + return split_tokens + + def convert_tokens_to_ids(self, tokens): + return convert_by_vocab(self.vocab, tokens) + + def convert_ids_to_tokens(self, ids): + return convert_by_vocab(self.inv_vocab, ids) + + +class BasicTokenizer(object): + """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" + + def __init__(self, do_lower_case=True, split_on_punc=True): + """Constructs a BasicTokenizer. + + Args: + do_lower_case: Whether to lower case the input. + split_on_punc: Whether to apply split on punctuations. By default BERT + starts a new token for punctuations. This makes detokenization difficult + for tasks like seq2seq decoding. + """ + self.do_lower_case = do_lower_case + self.split_on_punc = split_on_punc + + def tokenize(self, text): + """Tokenizes a piece of text.""" + text = convert_to_unicode(text) + text = self._clean_text(text) + + # This was added on November 1st, 2018 for the multilingual and Chinese + # models. This is also applied to the English models now, but it doesn't + # matter since the English models were not trained on any Chinese data + # and generally don't have any Chinese data in them (there are Chinese + # characters in the vocabulary because Wikipedia does have some Chinese + # words in the English Wikipedia.). + text = self._tokenize_chinese_chars(text) + + orig_tokens = whitespace_tokenize(text) + split_tokens = [] + for token in orig_tokens: + if self.do_lower_case: + token = token.lower() + token = self._run_strip_accents(token) + if self.split_on_punc: + split_tokens.extend(self._run_split_on_punc(token)) + else: + split_tokens.append(token) + + output_tokens = whitespace_tokenize(" ".join(split_tokens)) + return output_tokens + + def _run_strip_accents(self, text): + """Strips accents from a piece of text.""" + text = unicodedata.normalize("NFD", text) + output = [] + for char in text: + cat = unicodedata.category(char) + if cat == "Mn": + continue + output.append(char) + return "".join(output) + + def _run_split_on_punc(self, text): + """Splits punctuation on a piece of text.""" + chars = list(text) + i = 0 + start_new_word = True + output = [] + while i < len(chars): + char = chars[i] + if _is_punctuation(char): + output.append([char]) + start_new_word = True + else: + if start_new_word: + output.append([]) + start_new_word = False + output[-1].append(char) + i += 1 + + return ["".join(x) for x in output] + + def _tokenize_chinese_chars(self, text): + """Adds whitespace around any CJK character.""" + output = [] + for char in text: + cp = ord(char) + if self._is_chinese_char(cp): + output.append(" ") + output.append(char) + output.append(" ") + else: + output.append(char) + return "".join(output) + + def _is_chinese_char(self, cp): + """Checks whether CP is the codepoint of a CJK character.""" + # This defines a "chinese character" as anything in the CJK Unicode block: + # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + # + # Note that the CJK Unicode block is NOT all Japanese and Korean characters, + # despite its name. The modern Korean Hangul alphabet is a different block, + # as is Japanese Hiragana and Katakana. Those alphabets are used to write + # space-separated words, so they are not treated specially and handled + # like the all of the other languages. + if ((cp >= 0x4E00 and cp <= 0x9FFF) or # + (cp >= 0x3400 and cp <= 0x4DBF) or # + (cp >= 0x20000 and cp <= 0x2A6DF) or # + (cp >= 0x2A700 and cp <= 0x2B73F) or # + (cp >= 0x2B740 and cp <= 0x2B81F) or # + (cp >= 0x2B820 and cp <= 0x2CEAF) or + (cp >= 0xF900 and cp <= 0xFAFF) or # + (cp >= 0x2F800 and cp <= 0x2FA1F)): # + return True + + return False + + def _clean_text(self, text): + """Performs invalid character removal and whitespace cleanup on text.""" + output = [] + for char in text: + cp = ord(char) + if cp == 0 or cp == 0xfffd or _is_control(char): + continue + if _is_whitespace(char): + output.append(" ") + else: + output.append(char) + return "".join(output) + + +class WordpieceTokenizer(object): + """Runs WordPiece tokenziation.""" + + def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=200): + self.vocab = vocab + self.unk_token = unk_token + self.max_input_chars_per_word = max_input_chars_per_word + + def tokenize(self, text): + """Tokenizes a piece of text into its word pieces. + + This uses a greedy longest-match-first algorithm to perform tokenization + using the given vocabulary. + + For example: + input = "unaffable" + output = ["un", "##aff", "##able"] + + Args: + text: A single token or whitespace separated tokens. This should have + already been passed through `BasicTokenizer. + + Returns: + A list of wordpiece tokens. + """ + + text = convert_to_unicode(text) + + output_tokens = [] + for token in whitespace_tokenize(text): + chars = list(token) + if len(chars) > self.max_input_chars_per_word: + output_tokens.append(self.unk_token) + continue + + is_bad = False + start = 0 + sub_tokens = [] + while start < len(chars): + end = len(chars) + cur_substr = None + while start < end: + substr = "".join(chars[start:end]) + if start > 0: + substr = "##" + substr + if substr in self.vocab: + cur_substr = substr + break + end -= 1 + if cur_substr is None: + is_bad = True + break + sub_tokens.append(cur_substr) + start = end + + if is_bad: + output_tokens.append(self.unk_token) + else: + output_tokens.extend(sub_tokens) + return output_tokens + + +def _is_whitespace(char): + """Checks whether `chars` is a whitespace character.""" + # \t, \n, and \r are technically control characters but we treat them + # as whitespace since they are generally considered as such. + if char == " " or char == "\t" or char == "\n" or char == "\r": + return True + cat = unicodedata.category(char) + if cat == "Zs": + return True + return False + + +def _is_control(char): + """Checks whether `chars` is a control character.""" + # These are technically control characters but we count them as whitespace + # characters. + if char == "\t" or char == "\n" or char == "\r": + return False + cat = unicodedata.category(char) + if cat in ("Cc", "Cf"): + return True + return False + + +def _is_punctuation(char): + """Checks whether `chars` is a punctuation character.""" + cp = ord(char) + # We treat all non-letter/number ASCII as punctuation. + # Characters such as "^", "$", and "`" are not in the Unicode + # Punctuation class but we treat them as punctuation anyways, for + # consistency. + if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or + (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + return True + cat = unicodedata.category(char) + if cat.startswith("P"): + return True + return False + + +def preprocess_text(inputs, remove_space=True, lower=False): + """Preprocesses data by removing extra space and normalize data. + + This method is used together with sentence piece tokenizer and is forked from: + https://github.com/google-research/google-research/blob/master/albert/tokenization.py + + Args: + inputs: The input text. + remove_space: Whether to remove the extra space. + lower: Whether to lowercase the text. + + Returns: + The preprocessed text. + + """ + outputs = inputs + if remove_space: + outputs = " ".join(inputs.strip().split()) + + if six.PY2 and isinstance(outputs, str): + try: + outputs = six.ensure_text(outputs, "utf-8") + except UnicodeDecodeError: + outputs = six.ensure_text(outputs, "latin-1") + + outputs = unicodedata.normalize("NFKD", outputs) + outputs = "".join([c for c in outputs if not unicodedata.combining(c)]) + if lower: + outputs = outputs.lower() + + return outputs + + +def encode_pieces(sp_model, text, sample=False): + """Segements text into pieces. + + This method is used together with sentence piece tokenizer and is forked from: + https://github.com/google-research/google-research/blob/master/albert/tokenization.py + + + Args: + sp_model: A spm.SentencePieceProcessor object. + text: The input text to be segemented. + sample: Whether to randomly sample a segmentation output or return a + deterministic one. + + Returns: + A list of token pieces. + """ + if six.PY2 and isinstance(text, six.text_type): + text = six.ensure_binary(text, "utf-8") + + if not sample: + pieces = sp_model.EncodeAsPieces(text) + else: + pieces = sp_model.SampleEncodeAsPieces(text, 64, 0.1) + new_pieces = [] + for piece in pieces: + piece = printable_text(piece) + if len(piece) > 1 and piece[-1] == "," and piece[-2].isdigit(): + cur_pieces = sp_model.EncodeAsPieces(piece[:-1].replace( + SPIECE_UNDERLINE, "")) + if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE: + if len(cur_pieces[0]) == 1: + cur_pieces = cur_pieces[1:] + else: + cur_pieces[0] = cur_pieces[0][1:] + cur_pieces.append(piece[-1]) + new_pieces.extend(cur_pieces) + else: + new_pieces.append(piece) + + return new_pieces + + +def encode_ids(sp_model, text, sample=False): + """Segments text and return token ids. + + This method is used together with sentence piece tokenizer and is forked from: + https://github.com/google-research/google-research/blob/master/albert/tokenization.py + + Args: + sp_model: A spm.SentencePieceProcessor object. + text: The input text to be segemented. + sample: Whether to randomly sample a segmentation output or return a + deterministic one. + + Returns: + A list of token ids. + """ + pieces = encode_pieces(sp_model, text, sample=sample) + ids = [sp_model.PieceToId(piece) for piece in pieces] + return ids + + +class FullSentencePieceTokenizer(object): + """Runs end-to-end sentence piece tokenization. + + The interface of this class is intended to keep the same as above + `FullTokenizer` class for easier usage. + """ + + def __init__(self, sp_model_file): + """Inits FullSentencePieceTokenizer. + + Args: + sp_model_file: The path to the sentence piece model file. + """ + self.sp_model = spm.SentencePieceProcessor() + self.sp_model.Load(sp_model_file) + self.vocab = { + self.sp_model.IdToPiece(i): i + for i in six.moves.range(self.sp_model.GetPieceSize()) + } + + def tokenize(self, text): + """Tokenizes text into pieces.""" + return encode_pieces(self.sp_model, text) + + def convert_tokens_to_ids(self, tokens): + """Converts a list of tokens to a list of ids.""" + return [self.sp_model.PieceToId(printable_text(token)) for token in tokens] + + def convert_ids_to_tokens(self, ids): + """Converts a list of ids ot a list of tokens.""" + return [self.sp_model.IdToPiece(id_) for id_ in ids] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization_test.py new file mode 100644 index 0000000..4a0503c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/bert/tokenization_test.py @@ -0,0 +1,160 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tempfile + +import six +import tensorflow as tf + +from official.nlp.bert import tokenization + + +class TokenizationTest(tf.test.TestCase): + """Tokenization test. + + The implementation is forked from + https://github.com/google-research/bert/blob/master/tokenization_test.py." + """ + + def test_full_tokenizer(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing", "," + ] + with tempfile.NamedTemporaryFile(delete=False) as vocab_writer: + if six.PY2: + vocab_writer.write("".join([x + "\n" for x in vocab_tokens])) + else: + vocab_writer.write("".join([x + "\n" for x in vocab_tokens + ]).encode("utf-8")) + + vocab_file = vocab_writer.name + + tokenizer = tokenization.FullTokenizer(vocab_file) + os.unlink(vocab_file) + + tokens = tokenizer.tokenize(u"UNwant\u00E9d,running") + self.assertAllEqual(tokens, ["un", "##want", "##ed", ",", "runn", "##ing"]) + + self.assertAllEqual( + tokenizer.convert_tokens_to_ids(tokens), [7, 4, 5, 10, 8, 9]) + + def test_chinese(self): + tokenizer = tokenization.BasicTokenizer() + + self.assertAllEqual( + tokenizer.tokenize(u"ah\u535A\u63A8zz"), + [u"ah", u"\u535A", u"\u63A8", u"zz"]) + + def test_basic_tokenizer_lower(self): + tokenizer = tokenization.BasicTokenizer(do_lower_case=True) + + self.assertAllEqual( + tokenizer.tokenize(u" \tHeLLo!how \n Are yoU? "), + ["hello", "!", "how", "are", "you", "?"]) + self.assertAllEqual(tokenizer.tokenize(u"H\u00E9llo"), ["hello"]) + + def test_basic_tokenizer_no_lower(self): + tokenizer = tokenization.BasicTokenizer(do_lower_case=False) + + self.assertAllEqual( + tokenizer.tokenize(u" \tHeLLo!how \n Are yoU? "), + ["HeLLo", "!", "how", "Are", "yoU", "?"]) + + def test_basic_tokenizer_no_split_on_punc(self): + tokenizer = tokenization.BasicTokenizer( + do_lower_case=True, split_on_punc=False) + + self.assertAllEqual( + tokenizer.tokenize(u" \tHeLLo!how \n Are yoU? "), + ["hello!how", "are", "you?"]) + + def test_wordpiece_tokenizer(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing", "##!", "!" + ] + + vocab = {} + for (i, token) in enumerate(vocab_tokens): + vocab[token] = i + tokenizer = tokenization.WordpieceTokenizer(vocab=vocab) + + self.assertAllEqual(tokenizer.tokenize(""), []) + + self.assertAllEqual( + tokenizer.tokenize("unwanted running"), + ["un", "##want", "##ed", "runn", "##ing"]) + + self.assertAllEqual( + tokenizer.tokenize("unwanted running !"), + ["un", "##want", "##ed", "runn", "##ing", "!"]) + + self.assertAllEqual( + tokenizer.tokenize("unwanted running!"), + ["un", "##want", "##ed", "runn", "##ing", "##!"]) + + self.assertAllEqual( + tokenizer.tokenize("unwantedX running"), ["[UNK]", "runn", "##ing"]) + + def test_convert_tokens_to_ids(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing" + ] + + vocab = {} + for (i, token) in enumerate(vocab_tokens): + vocab[token] = i + + self.assertAllEqual( + tokenization.convert_tokens_to_ids( + vocab, ["un", "##want", "##ed", "runn", "##ing"]), [7, 4, 5, 8, 9]) + + def test_is_whitespace(self): + self.assertTrue(tokenization._is_whitespace(u" ")) + self.assertTrue(tokenization._is_whitespace(u"\t")) + self.assertTrue(tokenization._is_whitespace(u"\r")) + self.assertTrue(tokenization._is_whitespace(u"\n")) + self.assertTrue(tokenization._is_whitespace(u"\u00A0")) + + self.assertFalse(tokenization._is_whitespace(u"A")) + self.assertFalse(tokenization._is_whitespace(u"-")) + + def test_is_control(self): + self.assertTrue(tokenization._is_control(u"\u0005")) + + self.assertFalse(tokenization._is_control(u"A")) + self.assertFalse(tokenization._is_control(u" ")) + self.assertFalse(tokenization._is_control(u"\t")) + self.assertFalse(tokenization._is_control(u"\r")) + self.assertFalse(tokenization._is_control(u"\U0001F4A9")) + + def test_is_punctuation(self): + self.assertTrue(tokenization._is_punctuation(u"-")) + self.assertTrue(tokenization._is_punctuation(u"$")) + self.assertTrue(tokenization._is_punctuation(u"`")) + self.assertTrue(tokenization._is_punctuation(u".")) + + self.assertFalse(tokenization._is_punctuation(u"A")) + self.assertFalse(tokenization._is_punctuation(u" ")) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/classifier_data_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/classifier_data_lib.py new file mode 100644 index 0000000..b143b5d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/classifier_data_lib.py @@ -0,0 +1,676 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""BERT library to process data for classification task.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import csv +import os + +from absl import logging +import tensorflow as tf +import tensorflow_datasets as tfds + +from official.nlp.bert import tokenization + + +class InputExample(object): + """A single training/test example for simple sequence classification.""" + + def __init__(self, guid, text_a, text_b=None, label=None): + """Constructs a InputExample. + + Args: + guid: Unique id for the example. + text_a: string. The untokenized text of the first sequence. For single + sequence tasks, only this sequence must be specified. + text_b: (Optional) string. The untokenized text of the second sequence. + Only must be specified for sequence pair tasks. + label: (Optional) string. The label of the example. This should be + specified for train and dev examples, but not for test examples. + """ + self.guid = guid + self.text_a = text_a + self.text_b = text_b + self.label = label + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + input_ids, + input_mask, + segment_ids, + label_id, + is_real_example=True): + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.label_id = label_id + self.is_real_example = is_real_example + + +class DataProcessor(object): + """Base class for data converters for sequence classification data sets.""" + + def __init__(self, process_text_fn=tokenization.convert_to_unicode): + self.process_text_fn = process_text_fn + + def get_train_examples(self, data_dir): + """Gets a collection of `InputExample`s for the train set.""" + raise NotImplementedError() + + def get_dev_examples(self, data_dir): + """Gets a collection of `InputExample`s for the dev set.""" + raise NotImplementedError() + + def get_test_examples(self, data_dir): + """Gets a collection of `InputExample`s for prediction.""" + raise NotImplementedError() + + def get_labels(self): + """Gets the list of labels for this data set.""" + raise NotImplementedError() + + @staticmethod + def get_processor_name(): + """Gets the string identifier of the processor.""" + raise NotImplementedError() + + @classmethod + def _read_tsv(cls, input_file, quotechar=None): + """Reads a tab separated value file.""" + with tf.io.gfile.GFile(input_file, "r") as f: + reader = csv.reader(f, delimiter="\t", quotechar=quotechar) + lines = [] + for line in reader: + lines.append(line) + return lines + + +class XnliProcessor(DataProcessor): + """Processor for the XNLI data set.""" + + def __init__(self, process_text_fn=tokenization.convert_to_unicode): + super(XnliProcessor, self).__init__(process_text_fn) + self.language = "zh" + + def get_train_examples(self, data_dir): + """See base class.""" + lines = self._read_tsv( + os.path.join(data_dir, "multinli", + "multinli.train.%s.tsv" % self.language)) + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "train-%d" % (i) + text_a = self.process_text_fn(line[0]) + text_b = self.process_text_fn(line[1]) + label = self.process_text_fn(line[2]) + if label == self.process_text_fn("contradictory"): + label = self.process_text_fn("contradiction") + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + def get_dev_examples(self, data_dir): + """See base class.""" + lines = self._read_tsv(os.path.join(data_dir, "xnli.dev.tsv")) + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "dev-%d" % (i) + language = self.process_text_fn(line[0]) + if language != self.process_text_fn(self.language): + continue + text_a = self.process_text_fn(line[6]) + text_b = self.process_text_fn(line[7]) + label = self.process_text_fn(line[1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + def get_labels(self): + """See base class.""" + return ["contradiction", "entailment", "neutral"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "XNLI" + + +class MnliProcessor(DataProcessor): + """Processor for the MultiNLI data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev_matched.tsv")), + "dev_matched") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test_matched.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["contradiction", "entailment", "neutral"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "MNLI" + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, self.process_text_fn(line[0])) + text_a = self.process_text_fn(line[8]) + text_b = self.process_text_fn(line[9]) + if set_type == "test": + label = "contradiction" + else: + label = self.process_text_fn(line[-1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class MrpcProcessor(DataProcessor): + """Processor for the MRPC data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "MRPC" + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, i) + text_a = self.process_text_fn(line[3]) + text_b = self.process_text_fn(line[4]) + if set_type == "test": + label = "0" + else: + label = self.process_text_fn(line[0]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class ColaProcessor(DataProcessor): + """Processor for the CoLA data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "COLA" + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + # Only the test set has a header + if set_type == "test" and i == 0: + continue + guid = "%s-%s" % (set_type, i) + if set_type == "test": + text_a = self.process_text_fn(line[1]) + label = "0" + else: + text_a = self.process_text_fn(line[3]) + label = self.process_text_fn(line[1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=None, label=label)) + return examples + + +class SstProcessor(DataProcessor): + """Processor for the SST-2 data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "SST-2" + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, i) + if set_type == "test": + text_a = tokenization.convert_to_unicode(line[1]) + label = "0" + else: + text_a = tokenization.convert_to_unicode(line[0]) + label = tokenization.convert_to_unicode(line[1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=None, label=label)) + return examples + + +class QnliProcessor(DataProcessor): + """Processor for the QNLI data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev_matched") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["entailment", "not_entailment"] + + @staticmethod + def get_processor_name(): + """See base class.""" + return "QNLI" + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, 1) + if set_type == "test": + text_a = tokenization.convert_to_unicode(line[1]) + text_b = tokenization.convert_to_unicode(line[2]) + label = "entailment" + else: + text_a = tokenization.convert_to_unicode(line[1]) + text_b = tokenization.convert_to_unicode(line[2]) + label = tokenization.convert_to_unicode(line[-1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class TfdsProcessor(DataProcessor): + """Processor for generic text classification TFDS data set. + + The TFDS parameters are expected to be provided in the tfds_params string, in + a comma-separated list of parameter assignments. + Examples: + tfds_params="dataset=scicite,text_key=string" + tfds_params="dataset=imdb_reviews,test_split=,dev_split=test" + tfds_params="dataset=glue/cola,text_key=sentence" + tfds_params="dataset=glue/sst2,text_key=sentence" + tfds_params="dataset=glue/qnli,text_key=question,text_b_key=sentence" + tfds_params="dataset=glue/mrpc,text_key=sentence1,text_b_key=sentence2" + Possible parameters (please refer to the documentation of Tensorflow Datasets + (TFDS) for the meaning of individual parameters): + dataset: Required dataset name (potentially with subset and version number). + data_dir: Optional TFDS source root directory. + train_split: Name of the train split (defaults to `train`). + dev_split: Name of the dev split (defaults to `validation`). + test_split: Name of the test split (defaults to `test`). + text_key: Key of the text_a feature (defaults to `text`). + text_b_key: Key of the second text feature if available. + label_key: Key of the label feature (defaults to `label`). + test_text_key: Key of the text feature to use in test set. + test_text_b_key: Key of the second text feature to use in test set. + test_label: String to be used as the label for all test examples. + """ + + def __init__(self, tfds_params, + process_text_fn=tokenization.convert_to_unicode): + super(TfdsProcessor, self).__init__(process_text_fn) + self._process_tfds_params_str(tfds_params) + self.dataset, info = tfds.load(self.dataset_name, data_dir=self.data_dir, + with_info=True) + self._labels = list(range(info.features[self.label_key].num_classes)) + + def _process_tfds_params_str(self, params_str): + """Extracts TFDS parameters from a comma-separated assignements string.""" + tuples = [x.split("=") for x in params_str.split(",")] + d = {k.strip(): v.strip() for k, v in tuples} + self.dataset_name = d["dataset"] # Required. + self.data_dir = d.get("data_dir", None) + self.train_split = d.get("train_split", "train") + self.dev_split = d.get("dev_split", "validation") + self.test_split = d.get("test_split", "test") + self.text_key = d.get("text_key", "text") + self.text_b_key = d.get("text_b_key", None) + self.label_key = d.get("label_key", "label") + self.test_text_key = d.get("test_text_key", self.text_key) + self.test_text_b_key = d.get("test_text_b_key", self.text_b_key) + self.test_label = d.get("test_label", "test_example") + + def get_train_examples(self, data_dir): + assert data_dir is None + return self._create_examples(self.train_split, "train") + + def get_dev_examples(self, data_dir): + assert data_dir is None + return self._create_examples(self.dev_split, "dev") + + def get_test_examples(self, data_dir): + assert data_dir is None + return self._create_examples(self.test_split, "test") + + def get_labels(self): + return self._labels + + def get_processor_name(self): + return "TFDS_" + self.dataset_name + + def _create_examples(self, split_name, set_type): + """Creates examples for the training and dev sets.""" + if split_name not in self.dataset: + raise ValueError("Split {} not available.".format(split_name)) + dataset = self.dataset[split_name].as_numpy_iterator() + examples = [] + text_b = None + for i, example in enumerate(dataset): + guid = "%s-%s" % (set_type, i) + if set_type == "test": + text_a = self.process_text_fn(example[self.test_text_key]) + if self.test_text_b_key: + text_b = self.process_text_fn(example[self.test_text_b_key]) + label = self.test_label + else: + text_a = self.process_text_fn(example[self.text_key]) + if self.text_b_key: + text_b = self.process_text_fn(example[self.text_b_key]) + label = int(example[self.label_key]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +def convert_single_example(ex_index, example, label_list, max_seq_length, + tokenizer): + """Converts a single `InputExample` into a single `InputFeatures`.""" + label_map = {} + for (i, label) in enumerate(label_list): + label_map[label] = i + + tokens_a = tokenizer.tokenize(example.text_a) + tokens_b = None + if example.text_b: + tokens_b = tokenizer.tokenize(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for [CLS], [SEP], [SEP] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3) + else: + # Account for [CLS] and [SEP] with "- 2" + if len(tokens_a) > max_seq_length - 2: + tokens_a = tokens_a[0:(max_seq_length - 2)] + + # The convention in BERT is: + # (a) For sequence pairs: + # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] + # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 + # (b) For single sequences: + # tokens: [CLS] the dog is hairy . [SEP] + # type_ids: 0 0 0 0 0 0 0 + # + # Where "type_ids" are used to indicate whether this is the first + # sequence or the second sequence. The embedding vectors for `type=0` and + # `type=1` were learned during pre-training and are added to the wordpiece + # embedding vector (and position vector). This is not *strictly* necessary + # since the [SEP] token unambiguously separates the sequences, but it makes + # it easier for the model to learn the concept of sequences. + # + # For classification tasks, the first vector (corresponding to [CLS]) is + # used as the "sentence vector". Note that this only makes sense because + # the entire model is fine-tuned. + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + tokens.append("[SEP]") + segment_ids.append(0) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + label_id = label_map[example.label] + if ex_index < 5: + logging.info("*** Example ***") + logging.info("guid: %s", (example.guid)) + logging.info("tokens: %s", + " ".join([tokenization.printable_text(x) for x in tokens])) + logging.info("input_ids: %s", " ".join([str(x) for x in input_ids])) + logging.info("input_mask: %s", " ".join([str(x) for x in input_mask])) + logging.info("segment_ids: %s", " ".join([str(x) for x in segment_ids])) + logging.info("label: %s (id = %d)", example.label, label_id) + + feature = InputFeatures( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + label_id=label_id, + is_real_example=True) + return feature + + +def file_based_convert_examples_to_features(examples, label_list, + max_seq_length, tokenizer, + output_file): + """Convert a set of `InputExample`s to a TFRecord file.""" + + tf.io.gfile.makedirs(os.path.dirname(output_file)) + writer = tf.io.TFRecordWriter(output_file) + + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + logging.info("Writing example %d of %d", ex_index, len(examples)) + + feature = convert_single_example(ex_index, example, label_list, + max_seq_length, tokenizer) + + def create_int_feature(values): + f = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return f + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + features["label_ids"] = create_int_feature([feature.label_id]) + features["is_real_example"] = create_int_feature( + [int(feature.is_real_example)]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writer.write(tf_example.SerializeToString()) + writer.close() + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + + +def generate_tf_record_from_data_file(processor, + data_dir, + tokenizer, + train_data_output_path=None, + eval_data_output_path=None, + max_seq_length=128): + """Generates and saves training data into a tf record file. + + Arguments: + processor: Input processor object to be used for generating data. Subclass + of `DataProcessor`. + data_dir: Directory that contains train/eval data to process. Data files + should be in from "dev.tsv", "test.tsv", or "train.tsv". + tokenizer: The tokenizer to be applied on the data. + train_data_output_path: Output to which processed tf record for training + will be saved. + eval_data_output_path: Output to which processed tf record for evaluation + will be saved. + max_seq_length: Maximum sequence length of the to be generated + training/eval data. + + Returns: + A dictionary containing input meta data. + """ + assert train_data_output_path or eval_data_output_path + + label_list = processor.get_labels() + assert train_data_output_path + train_input_data_examples = processor.get_train_examples(data_dir) + file_based_convert_examples_to_features(train_input_data_examples, label_list, + max_seq_length, tokenizer, + train_data_output_path) + num_training_data = len(train_input_data_examples) + + if eval_data_output_path: + eval_input_data_examples = processor.get_dev_examples(data_dir) + file_based_convert_examples_to_features(eval_input_data_examples, + label_list, max_seq_length, + tokenizer, eval_data_output_path) + + meta_data = { + "task_type": "bert_classification", + "processor_type": processor.get_processor_name(), + "num_labels": len(processor.get_labels()), + "train_data_size": num_training_data, + "max_seq_length": max_seq_length, + } + + if eval_data_output_path: + meta_data["eval_data_size"] = len(eval_input_data_examples) + + return meta_data diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_finetuning_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_finetuning_data.py new file mode 100644 index 0000000..92b8abe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_finetuning_data.py @@ -0,0 +1,203 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""BERT finetuning task dataset generator.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import json +import os + +from absl import app +from absl import flags +import tensorflow as tf +from official.nlp.bert import tokenization +from official.nlp.data import classifier_data_lib +# word-piece tokenizer based squad_lib +from official.nlp.data import squad_lib as squad_lib_wp +# sentence-piece tokenizer based squad_lib +from official.nlp.data import squad_lib_sp + +FLAGS = flags.FLAGS + +flags.DEFINE_enum( + "fine_tuning_task_type", "classification", ["classification", "squad"], + "The name of the BERT fine tuning task for which data " + "will be generated..") + +# BERT classification specific flags. +flags.DEFINE_string( + "input_data_dir", None, + "The input data dir. Should contain the .tsv files (or other data files) " + "for the task.") + +flags.DEFINE_enum("classification_task_name", "MNLI", + ["COLA", "MNLI", "MRPC", "QNLI", "SST-2", "XNLI"], + "The name of the task to train BERT classifier.") + +# BERT Squad task specific flags. +flags.DEFINE_string( + "squad_data_file", None, + "The input data file in for generating training data for BERT squad task.") + +flags.DEFINE_integer( + "doc_stride", 128, + "When splitting up a long document into chunks, how much stride to " + "take between chunks.") + +flags.DEFINE_integer( + "max_query_length", 64, + "The maximum number of tokens for the question. Questions longer than " + "this will be truncated to this length.") + +flags.DEFINE_bool( + "version_2_with_negative", False, + "If true, the SQuAD examples contain some that do not have an answer.") + +# Shared flags across BERT fine-tuning tasks. +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_string( + "train_data_output_path", None, + "The path in which generated training input data will be written as tf" + " records.") + +flags.DEFINE_string( + "eval_data_output_path", None, + "The path in which generated training input data will be written as tf" + " records.") + +flags.DEFINE_string("meta_data_file_path", None, + "The path in which input meta data will be written.") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_string("sp_model_file", "", + "The path to the model used by sentence piece tokenizer.") + +flags.DEFINE_enum( + "tokenizer_impl", "word_piece", ["word_piece", "sentence_piece"], + "Specifies the tokenizer implementation, i.e., whehter to use word_piece " + "or sentence_piece tokenizer. Canonical BERT uses word_piece tokenizer, " + "while ALBERT uses sentence_piece tokenizer.") + +flags.DEFINE_string("tfds_params", "", + "Comma-separated list of TFDS parameter assigments for " + "generic classfication data import (for more details " + "see the TfdsProcessor class documentation).") + + +def generate_classifier_dataset(): + """Generates classifier dataset and returns input meta data.""" + assert (FLAGS.input_data_dir and FLAGS.classification_task_name + or FLAGS.tfds_params) + + if FLAGS.tokenizer_impl == "word_piece": + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + processor_text_fn = tokenization.convert_to_unicode + else: + assert FLAGS.tokenizer_impl == "sentence_piece" + tokenizer = tokenization.FullSentencePieceTokenizer(FLAGS.sp_model_file) + processor_text_fn = functools.partial( + tokenization.preprocess_text, lower=FLAGS.do_lower_case) + + if FLAGS.tfds_params: + processor = classifier_data_lib.TfdsProcessor( + tfds_params=FLAGS.tfds_params, + process_text_fn=processor_text_fn) + return classifier_data_lib.generate_tf_record_from_data_file( + processor, + None, + tokenizer, + train_data_output_path=FLAGS.train_data_output_path, + eval_data_output_path=FLAGS.eval_data_output_path, + max_seq_length=FLAGS.max_seq_length) + else: + processors = { + "cola": classifier_data_lib.ColaProcessor, + "mnli": classifier_data_lib.MnliProcessor, + "mrpc": classifier_data_lib.MrpcProcessor, + "qnli": classifier_data_lib.QnliProcessor, + "sst-2": classifier_data_lib.SstProcessor, + "xnli": classifier_data_lib.XnliProcessor, + } + task_name = FLAGS.classification_task_name.lower() + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + processor = processors[task_name](processor_text_fn) + return classifier_data_lib.generate_tf_record_from_data_file( + processor, + FLAGS.input_data_dir, + tokenizer, + train_data_output_path=FLAGS.train_data_output_path, + eval_data_output_path=FLAGS.eval_data_output_path, + max_seq_length=FLAGS.max_seq_length) + + +def generate_squad_dataset(): + """Generates squad training dataset and returns input meta data.""" + assert FLAGS.squad_data_file + if FLAGS.tokenizer_impl == "word_piece": + return squad_lib_wp.generate_tf_record_from_json_file( + FLAGS.squad_data_file, FLAGS.vocab_file, FLAGS.train_data_output_path, + FLAGS.max_seq_length, FLAGS.do_lower_case, FLAGS.max_query_length, + FLAGS.doc_stride, FLAGS.version_2_with_negative) + else: + assert FLAGS.tokenizer_impl == "sentence_piece" + return squad_lib_sp.generate_tf_record_from_json_file( + FLAGS.squad_data_file, FLAGS.sp_model_file, + FLAGS.train_data_output_path, FLAGS.max_seq_length, FLAGS.do_lower_case, + FLAGS.max_query_length, FLAGS.doc_stride, FLAGS.version_2_with_negative) + + +def main(_): + if FLAGS.tokenizer_impl == "word_piece": + if not FLAGS.vocab_file: + raise ValueError( + "FLAG vocab_file for word-piece tokenizer is not specified.") + else: + assert FLAGS.tokenizer_impl == "sentence_piece" + if not FLAGS.sp_model_file: + raise ValueError( + "FLAG sp_model_file for sentence-piece tokenizer is not specified.") + + if FLAGS.fine_tuning_task_type == "classification": + input_meta_data = generate_classifier_dataset() + else: + input_meta_data = generate_squad_dataset() + + tf.io.gfile.makedirs(os.path.dirname(FLAGS.meta_data_file_path)) + with tf.io.gfile.GFile(FLAGS.meta_data_file_path, "w") as writer: + writer.write(json.dumps(input_meta_data, indent=4) + "\n") + + +if __name__ == "__main__": + flags.mark_flag_as_required("train_data_output_path") + flags.mark_flag_as_required("meta_data_file_path") + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_pretraining_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_pretraining_data.py new file mode 100644 index 0000000..79dac57 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/create_pretraining_data.py @@ -0,0 +1,486 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Create masked LM/next sentence masked_lm TF examples for BERT.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import random + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.nlp.bert import tokenization + +FLAGS = flags.FLAGS + +flags.DEFINE_string("input_file", None, + "Input raw text file (or comma-separated list of files).") + +flags.DEFINE_string( + "output_file", None, + "Output TF example file (or comma-separated list of files).") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_bool( + "do_whole_word_mask", False, + "Whether to use whole word masking rather than per-WordPiece masking.") + +flags.DEFINE_bool( + "gzip_compress", False, + "Whether to use `GZIP` compress option to get compressed TFRecord files.") + +flags.DEFINE_integer("max_seq_length", 128, "Maximum sequence length.") + +flags.DEFINE_integer("max_predictions_per_seq", 20, + "Maximum number of masked LM predictions per sequence.") + +flags.DEFINE_integer("random_seed", 12345, "Random seed for data generation.") + +flags.DEFINE_integer( + "dupe_factor", 10, + "Number of times to duplicate the input data (with different masks).") + +flags.DEFINE_float("masked_lm_prob", 0.15, "Masked LM probability.") + +flags.DEFINE_float( + "short_seq_prob", 0.1, + "Probability of creating sequences which are shorter than the " + "maximum length.") + + +class TrainingInstance(object): + """A single training instance (sentence pair).""" + + def __init__(self, tokens, segment_ids, masked_lm_positions, masked_lm_labels, + is_random_next): + self.tokens = tokens + self.segment_ids = segment_ids + self.is_random_next = is_random_next + self.masked_lm_positions = masked_lm_positions + self.masked_lm_labels = masked_lm_labels + + def __str__(self): + s = "" + s += "tokens: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.tokens])) + s += "segment_ids: %s\n" % (" ".join([str(x) for x in self.segment_ids])) + s += "is_random_next: %s\n" % self.is_random_next + s += "masked_lm_positions: %s\n" % (" ".join( + [str(x) for x in self.masked_lm_positions])) + s += "masked_lm_labels: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.masked_lm_labels])) + s += "\n" + return s + + def __repr__(self): + return self.__str__() + + +def write_instance_to_example_files(instances, tokenizer, max_seq_length, + max_predictions_per_seq, output_files, + gzip_compress): + """Create TF example files from `TrainingInstance`s.""" + writers = [] + for output_file in output_files: + writers.append( + tf.io.TFRecordWriter( + output_file, options="GZIP" if gzip_compress else "")) + + writer_index = 0 + + total_written = 0 + for (inst_index, instance) in enumerate(instances): + input_ids = tokenizer.convert_tokens_to_ids(instance.tokens) + input_mask = [1] * len(input_ids) + segment_ids = list(instance.segment_ids) + assert len(input_ids) <= max_seq_length + + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + masked_lm_positions = list(instance.masked_lm_positions) + masked_lm_ids = tokenizer.convert_tokens_to_ids(instance.masked_lm_labels) + masked_lm_weights = [1.0] * len(masked_lm_ids) + + while len(masked_lm_positions) < max_predictions_per_seq: + masked_lm_positions.append(0) + masked_lm_ids.append(0) + masked_lm_weights.append(0.0) + + next_sentence_label = 1 if instance.is_random_next else 0 + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(input_ids) + features["input_mask"] = create_int_feature(input_mask) + features["segment_ids"] = create_int_feature(segment_ids) + features["masked_lm_positions"] = create_int_feature(masked_lm_positions) + features["masked_lm_ids"] = create_int_feature(masked_lm_ids) + features["masked_lm_weights"] = create_float_feature(masked_lm_weights) + features["next_sentence_labels"] = create_int_feature([next_sentence_label]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + + writers[writer_index].write(tf_example.SerializeToString()) + writer_index = (writer_index + 1) % len(writers) + + total_written += 1 + + if inst_index < 20: + logging.info("*** Example ***") + logging.info("tokens: %s", " ".join( + [tokenization.printable_text(x) for x in instance.tokens])) + + for feature_name in features.keys(): + feature = features[feature_name] + values = [] + if feature.int64_list.value: + values = feature.int64_list.value + elif feature.float_list.value: + values = feature.float_list.value + logging.info("%s: %s", feature_name, " ".join([str(x) for x in values])) + + for writer in writers: + writer.close() + + logging.info("Wrote %d total instances", total_written) + + +def create_int_feature(values): + feature = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return feature + + +def create_float_feature(values): + feature = tf.train.Feature(float_list=tf.train.FloatList(value=list(values))) + return feature + + +def create_training_instances(input_files, + tokenizer, + max_seq_length, + dupe_factor, + short_seq_prob, + masked_lm_prob, + max_predictions_per_seq, + rng, + do_whole_word_mask=False): + """Create `TrainingInstance`s from raw text.""" + all_documents = [[]] + + # Input file format: + # (1) One sentence per line. These should ideally be actual sentences, not + # entire paragraphs or arbitrary spans of text. (Because we use the + # sentence boundaries for the "next sentence prediction" task). + # (2) Blank lines between documents. Document boundaries are needed so + # that the "next sentence prediction" task doesn't span between documents. + for input_file in input_files: + with tf.io.gfile.GFile(input_file, "rb") as reader: + while True: + line = tokenization.convert_to_unicode(reader.readline()) + if not line: + break + line = line.strip() + + # Empty lines are used as document delimiters + if not line: + all_documents.append([]) + tokens = tokenizer.tokenize(line) + if tokens: + all_documents[-1].append(tokens) + + # Remove empty documents + all_documents = [x for x in all_documents if x] + rng.shuffle(all_documents) + + vocab_words = list(tokenizer.vocab.keys()) + instances = [] + for _ in range(dupe_factor): + for document_index in range(len(all_documents)): + instances.extend( + create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng, + do_whole_word_mask)) + + rng.shuffle(instances) + return instances + + +def create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng, + do_whole_word_mask=False): + """Creates `TrainingInstance`s for a single document.""" + document = all_documents[document_index] + + # Account for [CLS], [SEP], [SEP] + max_num_tokens = max_seq_length - 3 + + # We *usually* want to fill up the entire sequence since we are padding + # to `max_seq_length` anyways, so short sequences are generally wasted + # computation. However, we *sometimes* + # (i.e., short_seq_prob == 0.1 == 10% of the time) want to use shorter + # sequences to minimize the mismatch between pre-training and fine-tuning. + # The `target_seq_length` is just a rough target however, whereas + # `max_seq_length` is a hard limit. + target_seq_length = max_num_tokens + if rng.random() < short_seq_prob: + target_seq_length = rng.randint(2, max_num_tokens) + + # We DON'T just concatenate all of the tokens from a document into a long + # sequence and choose an arbitrary split point because this would make the + # next sentence prediction task too easy. Instead, we split the input into + # segments "A" and "B" based on the actual "sentences" provided by the user + # input. + instances = [] + current_chunk = [] + current_length = 0 + i = 0 + while i < len(document): + segment = document[i] + current_chunk.append(segment) + current_length += len(segment) + if i == len(document) - 1 or current_length >= target_seq_length: + if current_chunk: + # `a_end` is how many segments from `current_chunk` go into the `A` + # (first) sentence. + a_end = 1 + if len(current_chunk) >= 2: + a_end = rng.randint(1, len(current_chunk) - 1) + + tokens_a = [] + for j in range(a_end): + tokens_a.extend(current_chunk[j]) + + tokens_b = [] + # Random next + is_random_next = False + if len(current_chunk) == 1 or rng.random() < 0.5: + is_random_next = True + target_b_length = target_seq_length - len(tokens_a) + + # This should rarely go for more than one iteration for large + # corpora. However, just to be careful, we try to make sure that + # the random document is not the same as the document + # we're processing. + for _ in range(10): + random_document_index = rng.randint(0, len(all_documents) - 1) + if random_document_index != document_index: + break + + random_document = all_documents[random_document_index] + random_start = rng.randint(0, len(random_document) - 1) + for j in range(random_start, len(random_document)): + tokens_b.extend(random_document[j]) + if len(tokens_b) >= target_b_length: + break + # We didn't actually use these segments so we "put them back" so + # they don't go to waste. + num_unused_segments = len(current_chunk) - a_end + i -= num_unused_segments + # Actual next + else: + is_random_next = False + for j in range(a_end, len(current_chunk)): + tokens_b.extend(current_chunk[j]) + truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng) + + assert len(tokens_a) >= 1 + assert len(tokens_b) >= 1 + + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + + tokens.append("[SEP]") + segment_ids.append(0) + + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + (tokens, masked_lm_positions, + masked_lm_labels) = create_masked_lm_predictions( + tokens, masked_lm_prob, max_predictions_per_seq, vocab_words, rng, + do_whole_word_mask) + instance = TrainingInstance( + tokens=tokens, + segment_ids=segment_ids, + is_random_next=is_random_next, + masked_lm_positions=masked_lm_positions, + masked_lm_labels=masked_lm_labels) + instances.append(instance) + current_chunk = [] + current_length = 0 + i += 1 + + return instances + + +MaskedLmInstance = collections.namedtuple("MaskedLmInstance", + ["index", "label"]) + + +def create_masked_lm_predictions(tokens, masked_lm_prob, + max_predictions_per_seq, vocab_words, rng, + do_whole_word_mask): + """Creates the predictions for the masked LM objective.""" + + cand_indexes = [] + for (i, token) in enumerate(tokens): + if token == "[CLS]" or token == "[SEP]": + continue + # Whole Word Masking means that if we mask all of the wordpieces + # corresponding to an original word. When a word has been split into + # WordPieces, the first token does not have any marker and any subsequence + # tokens are prefixed with ##. So whenever we see the ## token, we + # append it to the previous set of word indexes. + # + # Note that Whole Word Masking does *not* change the training code + # at all -- we still predict each WordPiece independently, softmaxed + # over the entire vocabulary. + if (do_whole_word_mask and len(cand_indexes) >= 1 and + token.startswith("##")): + cand_indexes[-1].append(i) + else: + cand_indexes.append([i]) + + rng.shuffle(cand_indexes) + + output_tokens = list(tokens) + + num_to_predict = min(max_predictions_per_seq, + max(1, int(round(len(tokens) * masked_lm_prob)))) + + masked_lms = [] + covered_indexes = set() + for index_set in cand_indexes: + if len(masked_lms) >= num_to_predict: + break + # If adding a whole-word mask would exceed the maximum number of + # predictions, then just skip this candidate. + if len(masked_lms) + len(index_set) > num_to_predict: + continue + is_any_index_covered = False + for index in index_set: + if index in covered_indexes: + is_any_index_covered = True + break + if is_any_index_covered: + continue + for index in index_set: + covered_indexes.add(index) + + masked_token = None + # 80% of the time, replace with [MASK] + if rng.random() < 0.8: + masked_token = "[MASK]" + else: + # 10% of the time, keep original + if rng.random() < 0.5: + masked_token = tokens[index] + # 10% of the time, replace with random word + else: + masked_token = vocab_words[rng.randint(0, len(vocab_words) - 1)] + + output_tokens[index] = masked_token + + masked_lms.append(MaskedLmInstance(index=index, label=tokens[index])) + assert len(masked_lms) <= num_to_predict + masked_lms = sorted(masked_lms, key=lambda x: x.index) + + masked_lm_positions = [] + masked_lm_labels = [] + for p in masked_lms: + masked_lm_positions.append(p.index) + masked_lm_labels.append(p.label) + + return (output_tokens, masked_lm_positions, masked_lm_labels) + + +def truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng): + """Truncates a pair of sequences to a maximum sequence length.""" + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_num_tokens: + break + + trunc_tokens = tokens_a if len(tokens_a) > len(tokens_b) else tokens_b + assert len(trunc_tokens) >= 1 + + # We want to sometimes truncate from the front and sometimes from the + # back to add more randomness and avoid biases. + if rng.random() < 0.5: + del trunc_tokens[0] + else: + trunc_tokens.pop() + + +def main(_): + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + input_files = [] + for input_pattern in FLAGS.input_file.split(","): + input_files.extend(tf.io.gfile.glob(input_pattern)) + + logging.info("*** Reading from input files ***") + for input_file in input_files: + logging.info(" %s", input_file) + + rng = random.Random(FLAGS.random_seed) + instances = create_training_instances( + input_files, tokenizer, FLAGS.max_seq_length, FLAGS.dupe_factor, + FLAGS.short_seq_prob, FLAGS.masked_lm_prob, FLAGS.max_predictions_per_seq, + rng, FLAGS.do_whole_word_mask) + + output_files = FLAGS.output_file.split(",") + logging.info("*** Writing to output files ***") + for output_file in output_files: + logging.info(" %s", output_file) + + write_instance_to_example_files(instances, tokenizer, FLAGS.max_seq_length, + FLAGS.max_predictions_per_seq, output_files, + FLAGS.gzip_compress) + + +if __name__ == "__main__": + flags.mark_flag_as_required("input_file") + flags.mark_flag_as_required("output_file") + flags.mark_flag_as_required("vocab_file") + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib.py new file mode 100644 index 0000000..54f75a6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib.py @@ -0,0 +1,880 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Library to process data for SQuAD 1.1 and SQuAD 2.0.""" + +# pylint: disable=g-bad-import-order +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import json +import math +import six + +from absl import logging +import tensorflow as tf + +from official.nlp.bert import tokenization + + +class SquadExample(object): + """A single training/test example for simple sequence classification. + + For examples without an answer, the start and end position are -1. + """ + + def __init__(self, + qas_id, + question_text, + doc_tokens, + orig_answer_text=None, + start_position=None, + end_position=None, + is_impossible=False): + self.qas_id = qas_id + self.question_text = question_text + self.doc_tokens = doc_tokens + self.orig_answer_text = orig_answer_text + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + def __str__(self): + return self.__repr__() + + def __repr__(self): + s = "" + s += "qas_id: %s" % (tokenization.printable_text(self.qas_id)) + s += ", question_text: %s" % ( + tokenization.printable_text(self.question_text)) + s += ", doc_tokens: [%s]" % (" ".join(self.doc_tokens)) + if self.start_position: + s += ", start_position: %d" % (self.start_position) + if self.start_position: + s += ", end_position: %d" % (self.end_position) + if self.start_position: + s += ", is_impossible: %r" % (self.is_impossible) + return s + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + unique_id, + example_index, + doc_span_index, + tokens, + token_to_orig_map, + token_is_max_context, + input_ids, + input_mask, + segment_ids, + start_position=None, + end_position=None, + is_impossible=None): + self.unique_id = unique_id + self.example_index = example_index + self.doc_span_index = doc_span_index + self.tokens = tokens + self.token_to_orig_map = token_to_orig_map + self.token_is_max_context = token_is_max_context + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + +class FeatureWriter(object): + """Writes InputFeature to TF example file.""" + + def __init__(self, filename, is_training): + self.filename = filename + self.is_training = is_training + self.num_features = 0 + self._writer = tf.io.TFRecordWriter(filename) + + def process_feature(self, feature): + """Write a InputFeature to the TFRecordWriter as a tf.train.Example.""" + self.num_features += 1 + + def create_int_feature(values): + feature = tf.train.Feature( + int64_list=tf.train.Int64List(value=list(values))) + return feature + + features = collections.OrderedDict() + features["unique_ids"] = create_int_feature([feature.unique_id]) + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + + if self.is_training: + features["start_positions"] = create_int_feature([feature.start_position]) + features["end_positions"] = create_int_feature([feature.end_position]) + impossible = 0 + if feature.is_impossible: + impossible = 1 + features["is_impossible"] = create_int_feature([impossible]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + self._writer.write(tf_example.SerializeToString()) + + def close(self): + self._writer.close() + + +def read_squad_examples(input_file, is_training, version_2_with_negative): + """Read a SQuAD json file into a list of SquadExample.""" + with tf.io.gfile.GFile(input_file, "r") as reader: + input_data = json.load(reader)["data"] + + def is_whitespace(c): + if c == " " or c == "\t" or c == "\r" or c == "\n" or ord(c) == 0x202F: + return True + return False + + examples = [] + for entry in input_data: + for paragraph in entry["paragraphs"]: + paragraph_text = paragraph["context"] + doc_tokens = [] + char_to_word_offset = [] + prev_is_whitespace = True + for c in paragraph_text: + if is_whitespace(c): + prev_is_whitespace = True + else: + if prev_is_whitespace: + doc_tokens.append(c) + else: + doc_tokens[-1] += c + prev_is_whitespace = False + char_to_word_offset.append(len(doc_tokens) - 1) + + for qa in paragraph["qas"]: + qas_id = qa["id"] + question_text = qa["question"] + start_position = None + end_position = None + orig_answer_text = None + is_impossible = False + if is_training: + + if version_2_with_negative: + is_impossible = qa["is_impossible"] + if (len(qa["answers"]) != 1) and (not is_impossible): + raise ValueError( + "For training, each question should have exactly 1 answer.") + if not is_impossible: + answer = qa["answers"][0] + orig_answer_text = answer["text"] + answer_offset = answer["answer_start"] + answer_length = len(orig_answer_text) + start_position = char_to_word_offset[answer_offset] + end_position = char_to_word_offset[answer_offset + answer_length - + 1] + # Only add answers where the text can be exactly recovered from the + # document. If this CAN'T happen it's likely due to weird Unicode + # stuff so we will just skip the example. + # + # Note that this means for training mode, every example is NOT + # guaranteed to be preserved. + actual_text = " ".join( + doc_tokens[start_position:(end_position + 1)]) + cleaned_answer_text = " ".join( + tokenization.whitespace_tokenize(orig_answer_text)) + if actual_text.find(cleaned_answer_text) == -1: + logging.warning("Could not find answer: '%s' vs. '%s'", + actual_text, cleaned_answer_text) + continue + else: + start_position = -1 + end_position = -1 + orig_answer_text = "" + + example = SquadExample( + qas_id=qas_id, + question_text=question_text, + doc_tokens=doc_tokens, + orig_answer_text=orig_answer_text, + start_position=start_position, + end_position=end_position, + is_impossible=is_impossible) + examples.append(example) + + return examples + + +def convert_examples_to_features(examples, + tokenizer, + max_seq_length, + doc_stride, + max_query_length, + is_training, + output_fn, + batch_size=None): + """Loads a data file into a list of `InputBatch`s.""" + + base_id = 1000000000 + unique_id = base_id + feature = None + for (example_index, example) in enumerate(examples): + query_tokens = tokenizer.tokenize(example.question_text) + + if len(query_tokens) > max_query_length: + query_tokens = query_tokens[0:max_query_length] + + tok_to_orig_index = [] + orig_to_tok_index = [] + all_doc_tokens = [] + for (i, token) in enumerate(example.doc_tokens): + orig_to_tok_index.append(len(all_doc_tokens)) + sub_tokens = tokenizer.tokenize(token) + for sub_token in sub_tokens: + tok_to_orig_index.append(i) + all_doc_tokens.append(sub_token) + + tok_start_position = None + tok_end_position = None + if is_training and example.is_impossible: + tok_start_position = -1 + tok_end_position = -1 + if is_training and not example.is_impossible: + tok_start_position = orig_to_tok_index[example.start_position] + if example.end_position < len(example.doc_tokens) - 1: + tok_end_position = orig_to_tok_index[example.end_position + 1] - 1 + else: + tok_end_position = len(all_doc_tokens) - 1 + (tok_start_position, tok_end_position) = _improve_answer_span( + all_doc_tokens, tok_start_position, tok_end_position, tokenizer, + example.orig_answer_text) + + # The -3 accounts for [CLS], [SEP] and [SEP] + max_tokens_for_doc = max_seq_length - len(query_tokens) - 3 + + # We can have documents that are longer than the maximum sequence length. + # To deal with this we do a sliding window approach, where we take chunks + # of the up to our max length with a stride of `doc_stride`. + _DocSpan = collections.namedtuple( # pylint: disable=invalid-name + "DocSpan", ["start", "length"]) + doc_spans = [] + start_offset = 0 + while start_offset < len(all_doc_tokens): + length = len(all_doc_tokens) - start_offset + if length > max_tokens_for_doc: + length = max_tokens_for_doc + doc_spans.append(_DocSpan(start=start_offset, length=length)) + if start_offset + length == len(all_doc_tokens): + break + start_offset += min(length, doc_stride) + + for (doc_span_index, doc_span) in enumerate(doc_spans): + tokens = [] + token_to_orig_map = {} + token_is_max_context = {} + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in query_tokens: + tokens.append(token) + segment_ids.append(0) + tokens.append("[SEP]") + segment_ids.append(0) + + for i in range(doc_span.length): + split_token_index = doc_span.start + i + token_to_orig_map[len(tokens)] = tok_to_orig_index[split_token_index] + + is_max_context = _check_is_max_context(doc_spans, doc_span_index, + split_token_index) + token_is_max_context[len(tokens)] = is_max_context + tokens.append(all_doc_tokens[split_token_index]) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + start_position = None + end_position = None + if is_training and not example.is_impossible: + # For training, if our document chunk does not contain an annotation + # we throw it out, since there is nothing to predict. + doc_start = doc_span.start + doc_end = doc_span.start + doc_span.length - 1 + out_of_span = False + if not (tok_start_position >= doc_start and + tok_end_position <= doc_end): + out_of_span = True + if out_of_span: + start_position = 0 + end_position = 0 + else: + doc_offset = len(query_tokens) + 2 + start_position = tok_start_position - doc_start + doc_offset + end_position = tok_end_position - doc_start + doc_offset + + if is_training and example.is_impossible: + start_position = 0 + end_position = 0 + + if example_index < 20: + logging.info("*** Example ***") + logging.info("unique_id: %s", (unique_id)) + logging.info("example_index: %s", (example_index)) + logging.info("doc_span_index: %s", (doc_span_index)) + logging.info("tokens: %s", + " ".join([tokenization.printable_text(x) for x in tokens])) + logging.info( + "token_to_orig_map: %s", " ".join([ + "%d:%d" % (x, y) for (x, y) in six.iteritems(token_to_orig_map) + ])) + logging.info( + "token_is_max_context: %s", " ".join([ + "%d:%s" % (x, y) + for (x, y) in six.iteritems(token_is_max_context) + ])) + logging.info("input_ids: %s", " ".join([str(x) for x in input_ids])) + logging.info("input_mask: %s", " ".join([str(x) for x in input_mask])) + logging.info("segment_ids: %s", " ".join([str(x) for x in segment_ids])) + if is_training and example.is_impossible: + logging.info("impossible example") + if is_training and not example.is_impossible: + answer_text = " ".join(tokens[start_position:(end_position + 1)]) + logging.info("start_position: %d", (start_position)) + logging.info("end_position: %d", (end_position)) + logging.info("answer: %s", tokenization.printable_text(answer_text)) + + feature = InputFeatures( + unique_id=unique_id, + example_index=example_index, + doc_span_index=doc_span_index, + tokens=tokens, + token_to_orig_map=token_to_orig_map, + token_is_max_context=token_is_max_context, + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + start_position=start_position, + end_position=end_position, + is_impossible=example.is_impossible) + + # Run callback + if is_training: + output_fn(feature) + else: + output_fn(feature, is_padding=False) + + unique_id += 1 + + if not is_training and feature: + assert batch_size + num_padding = 0 + num_examples = unique_id - base_id + if unique_id % batch_size != 0: + num_padding = batch_size - (num_examples % batch_size) + logging.info("Adding padding examples to make sure no partial batch.") + logging.info("Adds %d padding examples for inference.", num_padding) + dummy_feature = copy.deepcopy(feature) + for _ in range(num_padding): + dummy_feature.unique_id = unique_id + + # Run callback + output_fn(feature, is_padding=True) + unique_id += 1 + return unique_id - base_id + + +def _improve_answer_span(doc_tokens, input_start, input_end, tokenizer, + orig_answer_text): + """Returns tokenized answer spans that better match the annotated answer.""" + + # The SQuAD annotations are character based. We first project them to + # whitespace-tokenized words. But then after WordPiece tokenization, we can + # often find a "better match". For example: + # + # Question: What year was John Smith born? + # Context: The leader was John Smith (1895-1943). + # Answer: 1895 + # + # The original whitespace-tokenized answer will be "(1895-1943).". However + # after tokenization, our tokens will be "( 1895 - 1943 ) .". So we can match + # the exact answer, 1895. + # + # However, this is not always possible. Consider the following: + # + # Question: What country is the top exporter of electornics? + # Context: The Japanese electronics industry is the lagest in the world. + # Answer: Japan + # + # In this case, the annotator chose "Japan" as a character sub-span of + # the word "Japanese". Since our WordPiece tokenizer does not split + # "Japanese", we just use "Japanese" as the annotation. This is fairly rare + # in SQuAD, but does happen. + tok_answer_text = " ".join(tokenizer.tokenize(orig_answer_text)) + + for new_start in range(input_start, input_end + 1): + for new_end in range(input_end, new_start - 1, -1): + text_span = " ".join(doc_tokens[new_start:(new_end + 1)]) + if text_span == tok_answer_text: + return (new_start, new_end) + + return (input_start, input_end) + + +def _check_is_max_context(doc_spans, cur_span_index, position): + """Check if this is the 'max context' doc span for the token.""" + + # Because of the sliding window approach taken to scoring documents, a single + # token can appear in multiple documents. E.g. + # Doc: the man went to the store and bought a gallon of milk + # Span A: the man went to the + # Span B: to the store and bought + # Span C: and bought a gallon of + # ... + # + # Now the word 'bought' will have two scores from spans B and C. We only + # want to consider the score with "maximum context", which we define as + # the *minimum* of its left and right context (the *sum* of left and + # right context will always be the same, of course). + # + # In the example the maximum context for 'bought' would be span C since + # it has 1 left context and 3 right context, while span B has 4 left context + # and 0 right context. + best_score = None + best_span_index = None + for (span_index, doc_span) in enumerate(doc_spans): + end = doc_span.start + doc_span.length - 1 + if position < doc_span.start: + continue + if position > end: + continue + num_left_context = position - doc_span.start + num_right_context = end - position + score = min(num_left_context, num_right_context) + 0.01 * doc_span.length + if best_score is None or score > best_score: + best_score = score + best_span_index = span_index + + return cur_span_index == best_span_index + + +def write_predictions(all_examples, + all_features, + all_results, + n_best_size, + max_answer_length, + do_lower_case, + output_prediction_file, + output_nbest_file, + output_null_log_odds_file, + version_2_with_negative=False, + null_score_diff_threshold=0.0, + verbose=False): + """Write final predictions to the json file and log-odds of null if needed.""" + logging.info("Writing predictions to: %s", (output_prediction_file)) + logging.info("Writing nbest to: %s", (output_nbest_file)) + + all_predictions, all_nbest_json, scores_diff_json = ( + postprocess_output(all_examples=all_examples, + all_features=all_features, + all_results=all_results, + n_best_size=n_best_size, + max_answer_length=max_answer_length, + do_lower_case=do_lower_case, + version_2_with_negative=version_2_with_negative, + null_score_diff_threshold=null_score_diff_threshold, + verbose=verbose)) + + write_to_json_files(all_predictions, output_prediction_file) + write_to_json_files(all_nbest_json, output_nbest_file) + if version_2_with_negative: + write_to_json_files(scores_diff_json, output_null_log_odds_file) + + +def postprocess_output(all_examples, + all_features, + all_results, + n_best_size, + max_answer_length, + do_lower_case, + version_2_with_negative=False, + null_score_diff_threshold=0.0, + verbose=False): + """Postprocess model output, to form predicton results.""" + + example_index_to_features = collections.defaultdict(list) + for feature in all_features: + example_index_to_features[feature.example_index].append(feature) + unique_id_to_result = {} + for result in all_results: + unique_id_to_result[result.unique_id] = result + + _PrelimPrediction = collections.namedtuple( # pylint: disable=invalid-name + "PrelimPrediction", + ["feature_index", "start_index", "end_index", "start_logit", "end_logit"]) + + all_predictions = collections.OrderedDict() + all_nbest_json = collections.OrderedDict() + scores_diff_json = collections.OrderedDict() + + for (example_index, example) in enumerate(all_examples): + features = example_index_to_features[example_index] + + prelim_predictions = [] + # keep track of the minimum score of null start+end of position 0 + score_null = 1000000 # large and positive + min_null_feature_index = 0 # the paragraph slice with min mull score + null_start_logit = 0 # the start logit at the slice with min null score + null_end_logit = 0 # the end logit at the slice with min null score + for (feature_index, feature) in enumerate(features): + result = unique_id_to_result[feature.unique_id] + start_indexes = _get_best_indexes(result.start_logits, n_best_size) + end_indexes = _get_best_indexes(result.end_logits, n_best_size) + # if we could have irrelevant answers, get the min score of irrelevant + if version_2_with_negative: + feature_null_score = result.start_logits[0] + result.end_logits[0] + if feature_null_score < score_null: + score_null = feature_null_score + min_null_feature_index = feature_index + null_start_logit = result.start_logits[0] + null_end_logit = result.end_logits[0] + for start_index in start_indexes: + for end_index in end_indexes: + # We could hypothetically create invalid predictions, e.g., predict + # that the start of the span is in the question. We throw out all + # invalid predictions. + if start_index >= len(feature.tokens): + continue + if end_index >= len(feature.tokens): + continue + if start_index not in feature.token_to_orig_map: + continue + if end_index not in feature.token_to_orig_map: + continue + if not feature.token_is_max_context.get(start_index, False): + continue + if end_index < start_index: + continue + length = end_index - start_index + 1 + if length > max_answer_length: + continue + prelim_predictions.append( + _PrelimPrediction( + feature_index=feature_index, + start_index=start_index, + end_index=end_index, + start_logit=result.start_logits[start_index], + end_logit=result.end_logits[end_index])) + + if version_2_with_negative: + prelim_predictions.append( + _PrelimPrediction( + feature_index=min_null_feature_index, + start_index=0, + end_index=0, + start_logit=null_start_logit, + end_logit=null_end_logit)) + prelim_predictions = sorted( + prelim_predictions, + key=lambda x: (x.start_logit + x.end_logit), + reverse=True) + + _NbestPrediction = collections.namedtuple( # pylint: disable=invalid-name + "NbestPrediction", ["text", "start_logit", "end_logit"]) + + seen_predictions = {} + nbest = [] + for pred in prelim_predictions: + if len(nbest) >= n_best_size: + break + feature = features[pred.feature_index] + if pred.start_index > 0: # this is a non-null prediction + tok_tokens = feature.tokens[pred.start_index:(pred.end_index + 1)] + orig_doc_start = feature.token_to_orig_map[pred.start_index] + orig_doc_end = feature.token_to_orig_map[pred.end_index] + orig_tokens = example.doc_tokens[orig_doc_start:(orig_doc_end + 1)] + tok_text = " ".join(tok_tokens) + + # De-tokenize WordPieces that have been split off. + tok_text = tok_text.replace(" ##", "") + tok_text = tok_text.replace("##", "") + + # Clean whitespace + tok_text = tok_text.strip() + tok_text = " ".join(tok_text.split()) + orig_text = " ".join(orig_tokens) + + final_text = get_final_text( + tok_text, orig_text, do_lower_case, verbose=verbose) + if final_text in seen_predictions: + continue + + seen_predictions[final_text] = True + else: + final_text = "" + seen_predictions[final_text] = True + + nbest.append( + _NbestPrediction( + text=final_text, + start_logit=pred.start_logit, + end_logit=pred.end_logit)) + + # if we didn't inlude the empty option in the n-best, inlcude it + if version_2_with_negative: + if "" not in seen_predictions: + nbest.append( + _NbestPrediction( + text="", start_logit=null_start_logit, + end_logit=null_end_logit)) + # In very rare edge cases we could have no valid predictions. So we + # just create a nonce prediction in this case to avoid failure. + if not nbest: + nbest.append( + _NbestPrediction(text="empty", start_logit=0.0, end_logit=0.0)) + + assert len(nbest) >= 1 + + total_scores = [] + best_non_null_entry = None + for entry in nbest: + total_scores.append(entry.start_logit + entry.end_logit) + if not best_non_null_entry: + if entry.text: + best_non_null_entry = entry + + probs = _compute_softmax(total_scores) + + nbest_json = [] + for (i, entry) in enumerate(nbest): + output = collections.OrderedDict() + output["text"] = entry.text + output["probability"] = probs[i] + output["start_logit"] = entry.start_logit + output["end_logit"] = entry.end_logit + nbest_json.append(output) + + assert len(nbest_json) >= 1 + + if not version_2_with_negative: + all_predictions[example.qas_id] = nbest_json[0]["text"] + else: + # pytype: disable=attribute-error + # predict "" iff the null score - the score of best non-null > threshold + score_diff = score_null - best_non_null_entry.start_logit - ( + best_non_null_entry.end_logit) + scores_diff_json[example.qas_id] = score_diff + if score_diff > null_score_diff_threshold: + all_predictions[example.qas_id] = "" + else: + all_predictions[example.qas_id] = best_non_null_entry.text + # pytype: enable=attribute-error + + all_nbest_json[example.qas_id] = nbest_json + + return all_predictions, all_nbest_json, scores_diff_json + + +def write_to_json_files(json_records, json_file): + with tf.io.gfile.GFile(json_file, "w") as writer: + writer.write(json.dumps(json_records, indent=4) + "\n") + + +def get_final_text(pred_text, orig_text, do_lower_case, verbose=False): + """Project the tokenized prediction back to the original text.""" + + # When we created the data, we kept track of the alignment between original + # (whitespace tokenized) tokens and our WordPiece tokenized tokens. So + # now `orig_text` contains the span of our original text corresponding to the + # span that we predicted. + # + # However, `orig_text` may contain extra characters that we don't want in + # our prediction. + # + # For example, let's say: + # pred_text = steve smith + # orig_text = Steve Smith's + # + # We don't want to return `orig_text` because it contains the extra "'s". + # + # We don't want to return `pred_text` because it's already been normalized + # (the SQuAD eval script also does punctuation stripping/lower casing but + # our tokenizer does additional normalization like stripping accent + # characters). + # + # What we really want to return is "Steve Smith". + # + # Therefore, we have to apply a semi-complicated alignment heruistic between + # `pred_text` and `orig_text` to get a character-to-charcter alignment. This + # can fail in certain cases in which case we just return `orig_text`. + + def _strip_spaces(text): + ns_chars = [] + ns_to_s_map = collections.OrderedDict() + for (i, c) in enumerate(text): + if c == " ": + continue + ns_to_s_map[len(ns_chars)] = i + ns_chars.append(c) + ns_text = "".join(ns_chars) + return (ns_text, ns_to_s_map) + + # We first tokenize `orig_text`, strip whitespace from the result + # and `pred_text`, and check if they are the same length. If they are + # NOT the same length, the heuristic has failed. If they are the same + # length, we assume the characters are one-to-one aligned. + tokenizer = tokenization.BasicTokenizer(do_lower_case=do_lower_case) + + tok_text = " ".join(tokenizer.tokenize(orig_text)) + + start_position = tok_text.find(pred_text) + if start_position == -1: + if verbose: + logging.info("Unable to find text: '%s' in '%s'", pred_text, orig_text) + return orig_text + end_position = start_position + len(pred_text) - 1 + + (orig_ns_text, orig_ns_to_s_map) = _strip_spaces(orig_text) + (tok_ns_text, tok_ns_to_s_map) = _strip_spaces(tok_text) + + if len(orig_ns_text) != len(tok_ns_text): + if verbose: + logging.info("Length not equal after stripping spaces: '%s' vs '%s'", + orig_ns_text, tok_ns_text) + return orig_text + + # We then project the characters in `pred_text` back to `orig_text` using + # the character-to-character alignment. + tok_s_to_ns_map = {} + for (i, tok_index) in six.iteritems(tok_ns_to_s_map): + tok_s_to_ns_map[tok_index] = i + + orig_start_position = None + if start_position in tok_s_to_ns_map: + ns_start_position = tok_s_to_ns_map[start_position] + if ns_start_position in orig_ns_to_s_map: + orig_start_position = orig_ns_to_s_map[ns_start_position] + + if orig_start_position is None: + if verbose: + logging.info("Couldn't map start position") + return orig_text + + orig_end_position = None + if end_position in tok_s_to_ns_map: + ns_end_position = tok_s_to_ns_map[end_position] + if ns_end_position in orig_ns_to_s_map: + orig_end_position = orig_ns_to_s_map[ns_end_position] + + if orig_end_position is None: + if verbose: + logging.info("Couldn't map end position") + return orig_text + + output_text = orig_text[orig_start_position:(orig_end_position + 1)] + return output_text + + +def _get_best_indexes(logits, n_best_size): + """Get the n-best logits from a list.""" + index_and_score = sorted(enumerate(logits), key=lambda x: x[1], reverse=True) + + best_indexes = [] + for i in range(len(index_and_score)): # pylint: disable=consider-using-enumerate + if i >= n_best_size: + break + best_indexes.append(index_and_score[i][0]) + return best_indexes + + +def _compute_softmax(scores): + """Compute softmax probability over raw logits.""" + if not scores: + return [] + + max_score = None + for score in scores: + if max_score is None or score > max_score: + max_score = score + + exp_scores = [] + total_sum = 0.0 + for score in scores: + x = math.exp(score - max_score) + exp_scores.append(x) + total_sum += x + + probs = [] + for score in exp_scores: + probs.append(score / total_sum) + return probs + + +def generate_tf_record_from_json_file(input_file_path, + vocab_file_path, + output_path, + max_seq_length=384, + do_lower_case=True, + max_query_length=64, + doc_stride=128, + version_2_with_negative=False): + """Generates and saves training data into a tf record file.""" + train_examples = read_squad_examples( + input_file=input_file_path, + is_training=True, + version_2_with_negative=version_2_with_negative) + tokenizer = tokenization.FullTokenizer( + vocab_file=vocab_file_path, do_lower_case=do_lower_case) + train_writer = FeatureWriter(filename=output_path, is_training=True) + number_of_examples = convert_examples_to_features( + examples=train_examples, + tokenizer=tokenizer, + max_seq_length=max_seq_length, + doc_stride=doc_stride, + max_query_length=max_query_length, + is_training=True, + output_fn=train_writer.process_feature) + train_writer.close() + + meta_data = { + "task_type": "bert_squad", + "train_data_size": number_of_examples, + "max_seq_length": max_seq_length, + "max_query_length": max_query_length, + "doc_stride": doc_stride, + "version_2_with_negative": version_2_with_negative, + } + + return meta_data diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib_sp.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib_sp.py new file mode 100644 index 0000000..6caa6e1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/data/squad_lib_sp.py @@ -0,0 +1,890 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Run ALBERT on SQuAD 1.1 and SQuAD 2.0 using sentence piece tokenization. + +The file is forked from: + +https://github.com/google-research/ALBERT/blob/master/run_squad_sp.py +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import json +import math +from absl import logging +import numpy as np +import tensorflow as tf + +from official.nlp.bert import tokenization + + +class SquadExample(object): + """A single training/test example for simple sequence classification. + + For examples without an answer, the start and end position are -1. + """ + + def __init__(self, + qas_id, + question_text, + paragraph_text, + orig_answer_text=None, + start_position=None, + end_position=None, + is_impossible=False): + self.qas_id = qas_id + self.question_text = question_text + self.paragraph_text = paragraph_text + self.orig_answer_text = orig_answer_text + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + def __str__(self): + return self.__repr__() + + def __repr__(self): + s = "" + s += "qas_id: %s" % (tokenization.printable_text(self.qas_id)) + s += ", question_text: %s" % ( + tokenization.printable_text(self.question_text)) + s += ", paragraph_text: [%s]" % (" ".join(self.paragraph_text)) + if self.start_position: + s += ", start_position: %d" % (self.start_position) + if self.start_position: + s += ", end_position: %d" % (self.end_position) + if self.start_position: + s += ", is_impossible: %r" % (self.is_impossible) + return s + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + unique_id, + example_index, + doc_span_index, + tok_start_to_orig_index, + tok_end_to_orig_index, + token_is_max_context, + tokens, + input_ids, + input_mask, + segment_ids, + paragraph_len, + start_position=None, + end_position=None, + is_impossible=None): + self.unique_id = unique_id + self.example_index = example_index + self.doc_span_index = doc_span_index + self.tok_start_to_orig_index = tok_start_to_orig_index + self.tok_end_to_orig_index = tok_end_to_orig_index + self.token_is_max_context = token_is_max_context + self.tokens = tokens + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.paragraph_len = paragraph_len + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + +def read_squad_examples(input_file, is_training, version_2_with_negative): + """Read a SQuAD json file into a list of SquadExample.""" + del version_2_with_negative + with tf.io.gfile.GFile(input_file, "r") as reader: + input_data = json.load(reader)["data"] + + examples = [] + for entry in input_data: + for paragraph in entry["paragraphs"]: + paragraph_text = paragraph["context"] + + for qa in paragraph["qas"]: + qas_id = qa["id"] + question_text = qa["question"] + start_position = None + orig_answer_text = None + is_impossible = False + + if is_training: + is_impossible = qa.get("is_impossible", False) + if (len(qa["answers"]) != 1) and (not is_impossible): + raise ValueError( + "For training, each question should have exactly 1 answer.") + if not is_impossible: + answer = qa["answers"][0] + orig_answer_text = answer["text"] + start_position = answer["answer_start"] + else: + start_position = -1 + orig_answer_text = "" + + example = SquadExample( + qas_id=qas_id, + question_text=question_text, + paragraph_text=paragraph_text, + orig_answer_text=orig_answer_text, + start_position=start_position, + is_impossible=is_impossible) + examples.append(example) + + return examples + + +def _convert_index(index, pos, m=None, is_start=True): + """Converts index.""" + if index[pos] is not None: + return index[pos] + n = len(index) + rear = pos + while rear < n - 1 and index[rear] is None: + rear += 1 + front = pos + while front > 0 and index[front] is None: + front -= 1 + assert index[front] is not None or index[rear] is not None + if index[front] is None: + if index[rear] >= 1: + if is_start: + return 0 + else: + return index[rear] - 1 + return index[rear] + if index[rear] is None: + if m is not None and index[front] < m - 1: + if is_start: + return index[front] + 1 + else: + return m - 1 + return index[front] + if is_start: + if index[rear] > index[front] + 1: + return index[front] + 1 + else: + return index[rear] + else: + if index[rear] > index[front] + 1: + return index[rear] - 1 + else: + return index[front] + + +def convert_examples_to_features(examples, + tokenizer, + max_seq_length, + doc_stride, + max_query_length, + is_training, + output_fn, + do_lower_case, + batch_size=None): + """Loads a data file into a list of `InputBatch`s.""" + cnt_pos, cnt_neg = 0, 0 + base_id = 1000000000 + unique_id = base_id + max_n, max_m = 1024, 1024 + f = np.zeros((max_n, max_m), dtype=np.float32) + + for (example_index, example) in enumerate(examples): + + if example_index % 100 == 0: + logging.info("Converting %d/%d pos %d neg %d", example_index, + len(examples), cnt_pos, cnt_neg) + + query_tokens = tokenization.encode_ids( + tokenizer.sp_model, + tokenization.preprocess_text( + example.question_text, lower=do_lower_case)) + + if len(query_tokens) > max_query_length: + query_tokens = query_tokens[0:max_query_length] + + paragraph_text = example.paragraph_text + para_tokens = tokenization.encode_pieces( + tokenizer.sp_model, + tokenization.preprocess_text( + example.paragraph_text, lower=do_lower_case)) + + chartok_to_tok_index = [] + tok_start_to_chartok_index = [] + tok_end_to_chartok_index = [] + char_cnt = 0 + for i, token in enumerate(para_tokens): + new_token = token.replace(tokenization.SPIECE_UNDERLINE, " ") + chartok_to_tok_index.extend([i] * len(new_token)) + tok_start_to_chartok_index.append(char_cnt) + char_cnt += len(new_token) + tok_end_to_chartok_index.append(char_cnt - 1) + + tok_cat_text = "".join(para_tokens).replace(tokenization.SPIECE_UNDERLINE, + " ") + n, m = len(paragraph_text), len(tok_cat_text) + + if n > max_n or m > max_m: + max_n = max(n, max_n) + max_m = max(m, max_m) + f = np.zeros((max_n, max_m), dtype=np.float32) + + g = {} + # pylint: disable=cell-var-from-loop + def _lcs_match(max_dist, n=n, m=m): + """Longest-common-substring algorithm.""" + f.fill(0) + g.clear() + + ### longest common sub sequence + # f[i, j] = max(f[i - 1, j], f[i, j - 1], f[i - 1, j - 1] + match(i, j)) + for i in range(n): + + # unlike standard LCS, this is specifically optimized for the setting + # because the mismatch between sentence pieces and original text will + # be small + for j in range(i - max_dist, i + max_dist): + if j >= m or j < 0: + continue + + if i > 0: + g[(i, j)] = 0 + f[i, j] = f[i - 1, j] + + if j > 0 and f[i, j - 1] > f[i, j]: + g[(i, j)] = 1 + f[i, j] = f[i, j - 1] + + f_prev = f[i - 1, j - 1] if i > 0 and j > 0 else 0 + if (tokenization.preprocess_text( + paragraph_text[i], lower=do_lower_case, + remove_space=False) == tok_cat_text[j] and f_prev + 1 > f[i, j]): + g[(i, j)] = 2 + f[i, j] = f_prev + 1 + # pylint: enable=cell-var-from-loop + + max_dist = abs(n - m) + 5 + for _ in range(2): + _lcs_match(max_dist) + if f[n - 1, m - 1] > 0.8 * n: + break + max_dist *= 2 + + orig_to_chartok_index = [None] * n + chartok_to_orig_index = [None] * m + i, j = n - 1, m - 1 + while i >= 0 and j >= 0: + if (i, j) not in g: + break + if g[(i, j)] == 2: + orig_to_chartok_index[i] = j + chartok_to_orig_index[j] = i + i, j = i - 1, j - 1 + elif g[(i, j)] == 1: + j = j - 1 + else: + i = i - 1 + + if (all(v is None for v in orig_to_chartok_index) or + f[n - 1, m - 1] < 0.8 * n): + logging.info("MISMATCH DETECTED!") + continue + + tok_start_to_orig_index = [] + tok_end_to_orig_index = [] + for i in range(len(para_tokens)): + start_chartok_pos = tok_start_to_chartok_index[i] + end_chartok_pos = tok_end_to_chartok_index[i] + start_orig_pos = _convert_index( + chartok_to_orig_index, start_chartok_pos, n, is_start=True) + end_orig_pos = _convert_index( + chartok_to_orig_index, end_chartok_pos, n, is_start=False) + + tok_start_to_orig_index.append(start_orig_pos) + tok_end_to_orig_index.append(end_orig_pos) + + if not is_training: + tok_start_position = tok_end_position = None + + if is_training and example.is_impossible: + tok_start_position = 0 + tok_end_position = 0 + + if is_training and not example.is_impossible: + start_position = example.start_position + end_position = start_position + len(example.orig_answer_text) - 1 + + start_chartok_pos = _convert_index( + orig_to_chartok_index, start_position, is_start=True) + tok_start_position = chartok_to_tok_index[start_chartok_pos] + + end_chartok_pos = _convert_index( + orig_to_chartok_index, end_position, is_start=False) + tok_end_position = chartok_to_tok_index[end_chartok_pos] + assert tok_start_position <= tok_end_position + + def _piece_to_id(x): + return tokenizer.sp_model.PieceToId(x) + + all_doc_tokens = list(map(_piece_to_id, para_tokens)) + + # The -3 accounts for [CLS], [SEP] and [SEP] + max_tokens_for_doc = max_seq_length - len(query_tokens) - 3 + + # We can have documents that are longer than the maximum sequence length. + # To deal with this we do a sliding window approach, where we take chunks + # of the up to our max length with a stride of `doc_stride`. + _DocSpan = collections.namedtuple( # pylint: disable=invalid-name + "DocSpan", ["start", "length"]) + doc_spans = [] + start_offset = 0 + while start_offset < len(all_doc_tokens): + length = len(all_doc_tokens) - start_offset + if length > max_tokens_for_doc: + length = max_tokens_for_doc + doc_spans.append(_DocSpan(start=start_offset, length=length)) + if start_offset + length == len(all_doc_tokens): + break + start_offset += min(length, doc_stride) + + for (doc_span_index, doc_span) in enumerate(doc_spans): + tokens = [] + token_is_max_context = {} + segment_ids = [] + + cur_tok_start_to_orig_index = [] + cur_tok_end_to_orig_index = [] + + tokens.append(tokenizer.sp_model.PieceToId("[CLS]")) + segment_ids.append(0) + for token in query_tokens: + tokens.append(token) + segment_ids.append(0) + tokens.append(tokenizer.sp_model.PieceToId("[SEP]")) + segment_ids.append(0) + + for i in range(doc_span.length): + split_token_index = doc_span.start + i + + cur_tok_start_to_orig_index.append( + tok_start_to_orig_index[split_token_index]) + cur_tok_end_to_orig_index.append( + tok_end_to_orig_index[split_token_index]) + + is_max_context = _check_is_max_context(doc_spans, doc_span_index, + split_token_index) + token_is_max_context[len(tokens)] = is_max_context + tokens.append(all_doc_tokens[split_token_index]) + segment_ids.append(1) + tokens.append(tokenizer.sp_model.PieceToId("[SEP]")) + segment_ids.append(1) + + paragraph_len = len(tokens) + input_ids = tokens + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + span_is_impossible = example.is_impossible + start_position = None + end_position = None + if is_training and not span_is_impossible: + # For training, if our document chunk does not contain an annotation + # we throw it out, since there is nothing to predict. + doc_start = doc_span.start + doc_end = doc_span.start + doc_span.length - 1 + out_of_span = False + if not (tok_start_position >= doc_start and + tok_end_position <= doc_end): + out_of_span = True + if out_of_span: + # continue + start_position = 0 + end_position = 0 + span_is_impossible = True + else: + doc_offset = len(query_tokens) + 2 + start_position = tok_start_position - doc_start + doc_offset + end_position = tok_end_position - doc_start + doc_offset + + if is_training and span_is_impossible: + start_position = 0 + end_position = 0 + + if example_index < 20: + logging.info("*** Example ***") + logging.info("unique_id: %s", (unique_id)) + logging.info("example_index: %s", (example_index)) + logging.info("doc_span_index: %s", (doc_span_index)) + logging.info("tok_start_to_orig_index: %s", + " ".join([str(x) for x in cur_tok_start_to_orig_index])) + logging.info("tok_end_to_orig_index: %s", + " ".join([str(x) for x in cur_tok_end_to_orig_index])) + logging.info( + "token_is_max_context: %s", " ".join( + ["%d:%s" % (x, y) for (x, y) in token_is_max_context.items()])) + logging.info( + "input_pieces: %s", + " ".join([tokenizer.sp_model.IdToPiece(x) for x in tokens])) + logging.info("input_ids: %s", " ".join([str(x) for x in input_ids])) + logging.info("input_mask: %s", " ".join([str(x) for x in input_mask])) + logging.info("segment_ids: %s", " ".join([str(x) for x in segment_ids])) + + if is_training and span_is_impossible: + logging.info("impossible example span") + + if is_training and not span_is_impossible: + pieces = [ + tokenizer.sp_model.IdToPiece(token) + for token in tokens[start_position:(end_position + 1)] + ] + answer_text = tokenizer.sp_model.DecodePieces(pieces) + logging.info("start_position: %d", (start_position)) + logging.info("end_position: %d", (end_position)) + logging.info("answer: %s", (tokenization.printable_text(answer_text))) + + # With multi processing, the example_index is actually the index + # within the current process therefore we use example_index=None + # to avoid being used in the future. + # The current code does not use example_index of training data. + if is_training: + feat_example_index = None + else: + feat_example_index = example_index + + feature = InputFeatures( + unique_id=unique_id, + example_index=feat_example_index, + doc_span_index=doc_span_index, + tok_start_to_orig_index=cur_tok_start_to_orig_index, + tok_end_to_orig_index=cur_tok_end_to_orig_index, + token_is_max_context=token_is_max_context, + tokens=[tokenizer.sp_model.IdToPiece(x) for x in tokens], + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + paragraph_len=paragraph_len, + start_position=start_position, + end_position=end_position, + is_impossible=span_is_impossible) + + # Run callback + if is_training: + output_fn(feature) + else: + output_fn(feature, is_padding=False) + + unique_id += 1 + if span_is_impossible: + cnt_neg += 1 + else: + cnt_pos += 1 + + if not is_training and feature: + assert batch_size + num_padding = 0 + num_examples = unique_id - base_id + if unique_id % batch_size != 0: + num_padding = batch_size - (num_examples % batch_size) + dummy_feature = copy.deepcopy(feature) + for _ in range(num_padding): + dummy_feature.unique_id = unique_id + + # Run callback + output_fn(feature, is_padding=True) + unique_id += 1 + + logging.info("Total number of instances: %d = pos %d neg %d", + cnt_pos + cnt_neg, cnt_pos, cnt_neg) + return unique_id - base_id + + +def _check_is_max_context(doc_spans, cur_span_index, position): + """Check if this is the 'max context' doc span for the token.""" + + # Because of the sliding window approach taken to scoring documents, a single + # token can appear in multiple documents. E.g. + # Doc: the man went to the store and bought a gallon of milk + # Span A: the man went to the + # Span B: to the store and bought + # Span C: and bought a gallon of + # ... + # + # Now the word 'bought' will have two scores from spans B and C. We only + # want to consider the score with "maximum context", which we define as + # the *minimum* of its left and right context (the *sum* of left and + # right context will always be the same, of course). + # + # In the example the maximum context for 'bought' would be span C since + # it has 1 left context and 3 right context, while span B has 4 left context + # and 0 right context. + best_score = None + best_span_index = None + for (span_index, doc_span) in enumerate(doc_spans): + end = doc_span.start + doc_span.length - 1 + if position < doc_span.start: + continue + if position > end: + continue + num_left_context = position - doc_span.start + num_right_context = end - position + score = min(num_left_context, num_right_context) + 0.01 * doc_span.length + if best_score is None or score > best_score: + best_score = score + best_span_index = span_index + + return cur_span_index == best_span_index + + +def write_predictions(all_examples, + all_features, + all_results, + n_best_size, + max_answer_length, + do_lower_case, + output_prediction_file, + output_nbest_file, + output_null_log_odds_file, + version_2_with_negative=False, + null_score_diff_threshold=0.0, + verbose=False): + """Write final predictions to the json file and log-odds of null if needed.""" + logging.info("Writing predictions to: %s", (output_prediction_file)) + logging.info("Writing nbest to: %s", (output_nbest_file)) + + all_predictions, all_nbest_json, scores_diff_json = ( + postprocess_output(all_examples=all_examples, + all_features=all_features, + all_results=all_results, + n_best_size=n_best_size, + max_answer_length=max_answer_length, + do_lower_case=do_lower_case, + version_2_with_negative=version_2_with_negative, + null_score_diff_threshold=null_score_diff_threshold, + verbose=verbose)) + + write_to_json_files(all_predictions, output_prediction_file) + write_to_json_files(all_nbest_json, output_nbest_file) + if version_2_with_negative: + write_to_json_files(scores_diff_json, output_null_log_odds_file) + + +def postprocess_output(all_examples, + all_features, + all_results, + n_best_size, + max_answer_length, + do_lower_case, + version_2_with_negative=False, + null_score_diff_threshold=0.0, + verbose=False): + """Postprocess model output, to form predicton results.""" + + del do_lower_case, verbose + + example_index_to_features = collections.defaultdict(list) + for feature in all_features: + example_index_to_features[feature.example_index].append(feature) + + unique_id_to_result = {} + for result in all_results: + unique_id_to_result[result.unique_id] = result + + _PrelimPrediction = collections.namedtuple( # pylint: disable=invalid-name + "PrelimPrediction", + ["feature_index", "start_index", "end_index", "start_logit", "end_logit"]) + + all_predictions = collections.OrderedDict() + all_nbest_json = collections.OrderedDict() + scores_diff_json = collections.OrderedDict() + + for (example_index, example) in enumerate(all_examples): + features = example_index_to_features[example_index] + + prelim_predictions = [] + # keep track of the minimum score of null start+end of position 0 + score_null = 1000000 # large and positive + min_null_feature_index = 0 # the paragraph slice with min mull score + null_start_logit = 0 # the start logit at the slice with min null score + null_end_logit = 0 # the end logit at the slice with min null score + for (feature_index, feature) in enumerate(features): + result = unique_id_to_result[feature.unique_id] + start_indexes = _get_best_indexes(result.start_logits, n_best_size) + end_indexes = _get_best_indexes(result.end_logits, n_best_size) + # if we could have irrelevant answers, get the min score of irrelevant + if version_2_with_negative: + feature_null_score = result.start_logits[0] + result.end_logits[0] + if feature_null_score < score_null: + score_null = feature_null_score + min_null_feature_index = feature_index + null_start_logit = result.start_logits[0] + null_end_logit = result.end_logits[0] + for start_index in start_indexes: + for end_index in end_indexes: + doc_offset = feature.tokens.index("[SEP]") + 1 + # We could hypothetically create invalid predictions, e.g., predict + # that the start of the span is in the question. We throw out all + # invalid predictions. + if start_index - doc_offset >= len(feature.tok_start_to_orig_index): + continue + if end_index - doc_offset >= len(feature.tok_end_to_orig_index): + continue + # if start_index not in feature.tok_start_to_orig_index: + # continue + # if end_index not in feature.tok_end_to_orig_index: + # continue + if not feature.token_is_max_context.get(start_index, False): + continue + if end_index < start_index: + continue + length = end_index - start_index + 1 + if length > max_answer_length: + continue + prelim_predictions.append( + _PrelimPrediction( + feature_index=feature_index, + start_index=start_index - doc_offset, + end_index=end_index - doc_offset, + start_logit=result.start_logits[start_index], + end_logit=result.end_logits[end_index])) + + if version_2_with_negative: + prelim_predictions.append( + _PrelimPrediction( + feature_index=min_null_feature_index, + start_index=-1, + end_index=-1, + start_logit=null_start_logit, + end_logit=null_end_logit)) + prelim_predictions = sorted( + prelim_predictions, + key=lambda x: (x.start_logit + x.end_logit), + reverse=True) + + _NbestPrediction = collections.namedtuple( # pylint: disable=invalid-name + "NbestPrediction", ["text", "start_logit", "end_logit"]) + + seen_predictions = {} + nbest = [] + for pred in prelim_predictions: + if len(nbest) >= n_best_size: + break + feature = features[pred.feature_index] + if pred.start_index >= 0: # this is a non-null prediction + tok_start_to_orig_index = feature.tok_start_to_orig_index + tok_end_to_orig_index = feature.tok_end_to_orig_index + start_orig_pos = tok_start_to_orig_index[pred.start_index] + end_orig_pos = tok_end_to_orig_index[pred.end_index] + + paragraph_text = example.paragraph_text + final_text = paragraph_text[start_orig_pos:end_orig_pos + 1].strip() + if final_text in seen_predictions: + continue + + seen_predictions[final_text] = True + else: + final_text = "" + seen_predictions[final_text] = True + + nbest.append( + _NbestPrediction( + text=final_text, + start_logit=pred.start_logit, + end_logit=pred.end_logit)) + + # if we didn't inlude the empty option in the n-best, inlcude it + if version_2_with_negative: + if "" not in seen_predictions: + nbest.append( + _NbestPrediction( + text="", start_logit=null_start_logit, + end_logit=null_end_logit)) + # In very rare edge cases we could have no valid predictions. So we + # just create a nonce prediction in this case to avoid failure. + if not nbest: + nbest.append( + _NbestPrediction(text="empty", start_logit=0.0, end_logit=0.0)) + + assert len(nbest) >= 1 + + total_scores = [] + best_non_null_entry = None + for entry in nbest: + total_scores.append(entry.start_logit + entry.end_logit) + if not best_non_null_entry: + if entry.text: + best_non_null_entry = entry + + probs = _compute_softmax(total_scores) + + nbest_json = [] + for (i, entry) in enumerate(nbest): + output = collections.OrderedDict() + output["text"] = entry.text + output["probability"] = probs[i] + output["start_logit"] = entry.start_logit + output["end_logit"] = entry.end_logit + nbest_json.append(output) + + assert len(nbest_json) >= 1 + + if not version_2_with_negative: + all_predictions[example.qas_id] = nbest_json[0]["text"] + else: + assert best_non_null_entry is not None + # predict "" iff the null score - the score of best non-null > threshold + score_diff = score_null - best_non_null_entry.start_logit - ( + best_non_null_entry.end_logit) + scores_diff_json[example.qas_id] = score_diff + if score_diff > null_score_diff_threshold: + all_predictions[example.qas_id] = "" + else: + all_predictions[example.qas_id] = best_non_null_entry.text + + all_nbest_json[example.qas_id] = nbest_json + + return all_predictions, all_nbest_json, scores_diff_json + + +def write_to_json_files(json_records, json_file): + with tf.io.gfile.GFile(json_file, "w") as writer: + writer.write(json.dumps(json_records, indent=4) + "\n") + + +def _get_best_indexes(logits, n_best_size): + """Get the n-best logits from a list.""" + index_and_score = sorted(enumerate(logits), key=lambda x: x[1], reverse=True) + + best_indexes = [] + for i in range(len(index_and_score)): + if i >= n_best_size: + break + best_indexes.append(index_and_score[i][0]) + return best_indexes + + +def _compute_softmax(scores): + """Compute softmax probability over raw logits.""" + if not scores: + return [] + + max_score = None + for score in scores: + if max_score is None or score > max_score: + max_score = score + + exp_scores = [] + total_sum = 0.0 + for score in scores: + x = math.exp(score - max_score) + exp_scores.append(x) + total_sum += x + + probs = [] + for score in exp_scores: + probs.append(score / total_sum) + return probs + + +class FeatureWriter(object): + """Writes InputFeature to TF example file.""" + + def __init__(self, filename, is_training): + self.filename = filename + self.is_training = is_training + self.num_features = 0 + self._writer = tf.io.TFRecordWriter(filename) + + def process_feature(self, feature): + """Write a InputFeature to the TFRecordWriter as a tf.train.Example.""" + self.num_features += 1 + + def create_int_feature(values): + feature = tf.train.Feature( + int64_list=tf.train.Int64List(value=list(values))) + return feature + + features = collections.OrderedDict() + features["unique_ids"] = create_int_feature([feature.unique_id]) + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + + if self.is_training: + features["start_positions"] = create_int_feature([feature.start_position]) + features["end_positions"] = create_int_feature([feature.end_position]) + impossible = 0 + if feature.is_impossible: + impossible = 1 + features["is_impossible"] = create_int_feature([impossible]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + self._writer.write(tf_example.SerializeToString()) + + def close(self): + self._writer.close() + + +def generate_tf_record_from_json_file(input_file_path, + sp_model_file, + output_path, + max_seq_length=384, + do_lower_case=True, + max_query_length=64, + doc_stride=128, + version_2_with_negative=False): + """Generates and saves training data into a tf record file.""" + train_examples = read_squad_examples( + input_file=input_file_path, + is_training=True, + version_2_with_negative=version_2_with_negative) + tokenizer = tokenization.FullSentencePieceTokenizer( + sp_model_file=sp_model_file) + train_writer = FeatureWriter(filename=output_path, is_training=True) + number_of_examples = convert_examples_to_features( + examples=train_examples, + tokenizer=tokenizer, + max_seq_length=max_seq_length, + doc_stride=doc_stride, + max_query_length=max_query_length, + is_training=True, + output_fn=train_writer.process_feature, + do_lower_case=do_lower_case) + train_writer.close() + + meta_data = { + "task_type": "bert_squad", + "train_data_size": number_of_examples, + "max_seq_length": max_seq_length, + "max_query_length": max_query_length, + "doc_stride": doc_stride, + "version_2_with_negative": version_2_with_negative, + } + + return meta_data diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/README.md new file mode 100644 index 0000000..0e74b46 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/README.md @@ -0,0 +1,43 @@ +# NLP Modeling Library + +This libary provides a set of Keras primitives (Layers, Networks, and Models) +that can be assembled into transformer-based models. They are +flexible, validated, interoperable, and both TF1 and TF2 compatible. + +* [`layers`](layers) are the fundamental building blocks for NLP models. +They can be used to assemble new layers, networks, or models. + +* [`networks`](networks) are combinations of layers (and possibly other networks). They are sub-units of models that would not be trained alone. They +encapsulate common network structures like a classification head +or a transformer encoder into an easily handled object with a +standardized configuration. + +* [`models`](models) are combinations of layers and networks that would be trained. Pre-built canned models are provided as both convenience functions and canonical examples. + +* [`losses`](losses) contains common loss computation used in NLP tasks. + +Besides the pre-defined primitives, it also provides scaffold classes to allow +easy experimentation with noval achitectures, e.g., you don’t need to fork a whole Transformer object to try a different kind of attention primitive, for instance. + +* [`TransformerScaffold`](layers/transformer_scaffold.py) implements the +Transformer from ["Attention Is All You Need"] +(https://arxiv.org/abs/1706.03762), with a customizable attention layer +option. Users can pass a class to `attention_cls` and associated config to +`attention_cfg`, in which case the scaffold will instantiate the class with +the config, or pass a class instance to `attention_cls`. + +* [`EncoderScaffold`](networks/encoder_scaffold.py) implements the transformer +encoder from ["BERT: Pre-training of Deep Bidirectional Transformers for +Language Understanding"](https://arxiv.org/abs/1810.04805), with customizable +embedding subnetwork (which will replace the standard embedding logic) and/or a +custom hidden layer (which will replace the Transformer instantiation in the +encoder). + +BERT and ALBERT models in this repo are implemented using this library. Code examples can be found in the corresponding model folder. + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/README.md new file mode 100644 index 0000000..211b3ab --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/README.md @@ -0,0 +1,29 @@ +# Layers +Layers are the fundamental building blocks for NLP models. They can be used to +assemble new layers, networks, or models. + +* [DenseEinsum](dense_einsum.py) implements a feedforward network using tf.einsum. This layer contains the einsum op, the associated weight, and the +logic required to generate the einsum expression for the given initialization +parameters. + +* [MultiHeadAttention](attention.py) implements an optionally masked attention +between two tensors, from_tensor and to_tensor, as described in +["Attention Is All You Need"](https://arxiv.org/abs/1706.03762). +If `from_tensor` and `to_tensor` are the same, then this is self-attention. + +* [CachedAttention](attention.py) implements an attention layer with cache used +for auto-agressive decoding. + +* [Transformer](transformer.py) implements an optionally masked transformer as +described in ["Attention Is All You Need"](https://arxiv.org/abs/1706.03762). + +* [OnDeviceEmbedding](on_device_embedding.py) implements efficient embedding lookups designed for TPU-based models. + +* [PositionalEmbedding](position_embedding.py) creates a positional embedding + as described in ["BERT: Pre-training + of Deep Bidirectional Transformers for Language Understanding"] + (https://arxiv.org/abs/1810.04805). + +* [SelfAttentionMask](self_attention_mask.py) creates a 3D attention mask from a 2D tensor mask. + +* [MaskedSoftmax](masked_softmax.py) implements a softmax with an optional masking input. If no mask is provided to this layer, it performs a standard softmax; however, if a mask tensor is applied (which should be 1 in positions where the data should be allowed through, and 0 where the data should be masked), the output will have masked positions set to approximately zero. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/__init__.py new file mode 100644 index 0000000..2de8f6a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/__init__.py @@ -0,0 +1,23 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Layers package definition.""" +from official.nlp.modeling.layers.attention import * # pylint: disable=wildcard-import +from official.nlp.modeling.layers.dense_einsum import DenseEinsum +from official.nlp.modeling.layers.masked_softmax import MaskedSoftmax +from official.nlp.modeling.layers.on_device_embedding import OnDeviceEmbedding +from official.nlp.modeling.layers.position_embedding import PositionEmbedding +from official.nlp.modeling.layers.self_attention_mask import SelfAttentionMask +from official.nlp.modeling.layers.transformer import Transformer +from official.nlp.modeling.layers.transformer_scaffold import TransformerScaffold diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention.py new file mode 100644 index 0000000..aa01daa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention.py @@ -0,0 +1,264 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based attention layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import math +import tensorflow as tf + +from official.nlp.modeling.layers import dense_einsum +from official.nlp.modeling.layers import masked_softmax + + +@tf.keras.utils.register_keras_serializable(package="Text") +class MultiHeadAttention(tf.keras.layers.Layer): + """MultiHeadAttention layer. + + This is an implementation of multi-headed attention based on "Attention + is all you Need". If `from_tensor` and `to_tensor` are the same, then + this is self-attention. Each timestep in `from_tensor` attends to the + corresponding sequence in `to_tensor`, and returns a fixed-width vector. + + This function first projects `from_tensor` into a "query" tensor and + `to_tensor` into "key" and "value" tensors. These are (effectively) a list + of tensors of length `num_attention_heads`, where each tensor is of shape + [batch_size, seq_length, size_per_head]. + + Then, the query and key tensors are dot-producted and scaled. These are + softmaxed to obtain attention probabilities. The value tensors are then + interpolated by these probabilities, then concatenated back to a single + tensor and returned. + + Arguments: + num_heads: Number of attention heads. + head_size: Size of each attention head. + dropout: Dropout probability. + kernel_initializer: Initializer for dense layer kernels. + bias_initializer: Initializer for dense layer biases. + kernel_regularizer: Regularizer for dense layer kernels. + bias_regularizer: Regularizer for dense layer biases. + activity_regularizer: Regularizer for dense layer activity. + kernel_constraint: Constraint for dense layer kernels. + bias_constraint: Constraint for dense layer kernels. + """ + + def __init__(self, + num_heads, + head_size, + dropout_rate=0.0, + kernel_initializer="glorot_uniform", + bias_initializer="zeros", + kernel_regularizer=None, + bias_regularizer=None, + activity_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + **kwargs): + super(MultiHeadAttention, self).__init__(**kwargs) + self._num_heads = num_heads + self._head_size = head_size + self._dropout_rate = dropout_rate + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._kernel_constraint = tf.keras.constraints.get(kernel_constraint) + self._bias_constraint = tf.keras.constraints.get(bias_constraint) + + self._query_dense = dense_einsum.DenseEinsum( + output_shape=(self._num_heads, self._head_size), + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="query") + + self._key_dense = dense_einsum.DenseEinsum( + output_shape=(self._num_heads, self._head_size), + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="key") + + self._value_dense = dense_einsum.DenseEinsum( + output_shape=(self._num_heads, self._head_size), + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="value") + + self._masked_softmax = masked_softmax.MaskedSoftmax(mask_expansion_axes=[1]) + + self._dropout = tf.keras.layers.Dropout(rate=self._dropout_rate) + + def get_config(self): + config = { + "num_heads": + self._num_heads, + "head_size": + self._head_size, + "dropout_rate": + self._dropout_rate, + "kernel_initializer": + tf.keras.initializers.serialize(self._kernel_initializer), + "bias_initializer": + tf.keras.initializers.serialize(self._bias_initializer), + "kernel_regularizer": + tf.keras.regularizers.serialize(self._kernel_regularizer), + "bias_regularizer": + tf.keras.regularizers.serialize(self._bias_regularizer), + "activity_regularizer": + tf.keras.regularizers.serialize(self._activity_regularizer), + "kernel_constraint": + tf.keras.constraints.serialize(self._kernel_constraint), + "bias_constraint": + tf.keras.constraints.serialize(self._bias_constraint) + } + base_config = super(MultiHeadAttention, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def call(self, inputs): + from_tensor = inputs[0] + to_tensor = inputs[1] + attention_mask = inputs[2] if len(inputs) == 3 else None + + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # F = `from_tensor` sequence length + # T = `to_tensor` sequence length + # N = `num_attention_heads` + # H = `size_per_head` + # `query_tensor` = [B, F, N ,H] + query_tensor = self._query_dense(from_tensor) + + # `key_tensor` = [B, T, N, H] + key_tensor = self._key_dense(to_tensor) + + # `value_tensor` = [B, T, N, H] + value_tensor = self._value_dense(to_tensor) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + attention_scores = tf.einsum("BTNH,BFNH->BNFT", key_tensor, query_tensor) + attention_scores = tf.multiply(attention_scores, + 1.0 / math.sqrt(float(self._head_size))) + + # Normalize the attention scores to probabilities. + # `attention_probs` = [B, N, F, T] + attention_probs = self._masked_softmax([attention_scores, attention_mask]) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self._dropout(attention_probs) + + # `context_layer` = [B, F, N, H] + return tf.einsum("BNFT,BTNH->BFNH", attention_probs, value_tensor) + + +@tf.keras.utils.register_keras_serializable(package="Text") +class CachedAttention(MultiHeadAttention): + """Attention layer with cache used for auto-agressive decoding. + + Arguments: + num_heads: Number of attention heads. + head_size: Size of each attention head. + **kwargs: Other keyword arguments inherit from `Attention` class. + """ + + def __init__(self, num_heads, head_size, **kwargs): + super(CachedAttention, self).__init__(num_heads, head_size, **kwargs) + + def _update_cache(self, key_tensor, value_tensor, cache, decode_loop_step): + """Updates cache states and gets full-length key/value tensors.""" + # Combines cached keys and values with new keys and values. + if decode_loop_step is not None: + # TPU special case. + key_seq_dim = cache["key"].shape.as_list()[1] + indices = tf.reshape( + tf.one_hot(decode_loop_step, key_seq_dim, dtype=key_tensor.dtype), + [1, key_seq_dim, 1, 1]) + key_tensor = cache["key"] + key_tensor * indices + value_seq_dim = cache["value"].shape.as_list()[1] + indices = tf.reshape( + tf.one_hot(decode_loop_step, value_seq_dim, dtype=value_tensor.dtype), + [1, value_seq_dim, 1, 1]) + value_tensor = cache["value"] + value_tensor * indices + else: + key_tensor = tf.concat( + [tf.cast(cache["key"], key_tensor.dtype), key_tensor], axis=1) + value_tensor = tf.concat( + [tf.cast(cache["value"], value_tensor.dtype), value_tensor], axis=1) + + # Update cache + cache["key"] = key_tensor + cache["value"] = value_tensor + + return key_tensor, value_tensor + + def call(self, inputs, decode_loop_step=None): + from_tensor = inputs[0] + to_tensor = inputs[1] + attention_mask = inputs[2] if len(inputs) >= 3 else None + cache = inputs[3] if len(inputs) >= 4 else None + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # F = `from_tensor` sequence length + # T = `to_tensor` sequence length + # N = `num_attention_heads` + # H = `size_per_head` + # `query_tensor` = [B, F, N ,H] + query_tensor = self._query_dense(from_tensor) + + # `key_tensor` = [B, T, N, H] + key_tensor = self._key_dense(to_tensor) + + # `value_tensor` = [B, T, N, H] + value_tensor = self._value_dense(to_tensor) + + if cache: + key_tensor, value_tensor = self._update_cache(key_tensor, value_tensor, + cache, decode_loop_step) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + attention_scores = tf.einsum("BTNH,BFNH->BNFT", key_tensor, query_tensor) + attention_scores = tf.multiply(attention_scores, + 1.0 / math.sqrt(float(self._head_size))) + + # Normalize the attention scores to probabilities. + # `attention_probs` = [B, N, F, T] + attention_probs = self._masked_softmax([attention_scores, attention_mask]) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self._dropout(attention_probs) + + # `context_layer` = [B, F, N, H] + return tf.einsum("BNFT,BTNH->BFNH", attention_probs, value_tensor), cache diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention_test.py new file mode 100644 index 0000000..8c577bb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/attention_test.py @@ -0,0 +1,157 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the attention layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import attention + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class MultiHeadAttentionTest(keras_parameterized.TestCase): + + def test_non_masked_attention(self): + """Test that the attention layer can be created without a mask tensor.""" + test_layer = attention.MultiHeadAttention(num_heads=12, head_size=64) + # Create a 3-dimensional input (the first dimension is implicit). + from_tensor = tf.keras.Input(shape=(40, 80)) + to_tensor = tf.keras.Input(shape=(20, 80)) + output = test_layer([from_tensor, to_tensor]) + self.assertEqual(output.shape.as_list(), [None, 40, 12, 64]) + + def test_non_masked_self_attention(self): + """Test with one input (self-attenntion) and no mask tensor.""" + test_layer = attention.MultiHeadAttention(num_heads=12, head_size=64) + # Create a 3-dimensional input (the first dimension is implicit). + from_tensor = tf.keras.Input(shape=(40, 80)) + output = test_layer([from_tensor, from_tensor]) + self.assertEqual(output.shape.as_list(), [None, 40, 12, 64]) + + def test_masked_attention(self): + """Test with a mask tensor.""" + test_layer = attention.MultiHeadAttention(num_heads=2, head_size=2) + # Create a 3-dimensional input (the first dimension is implicit). + from_tensor = tf.keras.Input(shape=(4, 8)) + to_tensor = tf.keras.Input(shape=(2, 8)) + mask_tensor = tf.keras.Input(shape=(4, 2)) + output = test_layer([from_tensor, to_tensor, mask_tensor]) + + # Create a model containing the test layer. + model = tf.keras.Model([from_tensor, to_tensor, mask_tensor], output) + + # Generate data for the input (non-mask) tensors. + from_data = 10 * np.random.random_sample((3, 4, 8)) + to_data = 10 * np.random.random_sample((3, 2, 8)) + + # Invoke the data with a random set of mask data. This should mask at least + # one element. + mask_data = np.random.randint(2, size=(3, 4, 2)) + masked_output_data = model.predict([from_data, to_data, mask_data]) + + # Invoke the same data, but with a null mask (where no elements are masked). + null_mask_data = np.ones((3, 4, 2)) + unmasked_output_data = model.predict([from_data, to_data, null_mask_data]) + + # Because one data is masked and one is not, the outputs should not be the + # same. + self.assertNotAllClose(masked_output_data, unmasked_output_data) + + def test_initializer(self): + """Test with a specified initializer.""" + test_layer = attention.MultiHeadAttention( + num_heads=12, + head_size=64, + kernel_initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02)) + # Create a 3-dimensional input (the first dimension is implicit). + from_tensor = tf.keras.Input(shape=(40, 80)) + output = test_layer([from_tensor, from_tensor]) + self.assertEqual(output.shape.as_list(), [None, 40, 12, 64]) + + +def _create_cache(batch_size, init_decode_length, num_heads, head_size): + return { + "key": + tf.zeros([batch_size, init_decode_length, num_heads, head_size], + dtype=tf.float32), + "value": + tf.zeros([batch_size, init_decode_length, num_heads, head_size], + dtype=tf.float32) + } + + +@keras_parameterized.run_all_keras_modes +class CachedAttentionTest(keras_parameterized.TestCase): + + def test_masked_attention(self): + """Test with a mask tensor.""" + num_heads, head_size = 2, 2 + # Create a 3-dimensional input (the first dimension is implicit). + from_seq_length = 4 + batch_size = 3 + # GPU/CPU case. + init_decode_length = 0 + # Directly tests the keras layer. + cache = _create_cache(batch_size, init_decode_length, num_heads, head_size) + layer = attention.CachedAttention(num_heads=num_heads, head_size=head_size) + + # Generate data for the input (non-mask) tensors. + from_data = tf.zeros((batch_size, from_seq_length, 8), dtype=np.float32) + # Invoke the data with a random set of mask data. This should mask at least + # one element. + mask_data = np.random.randint( + 2, size=(batch_size, from_seq_length, from_seq_length)) + masked_output_data, cache = layer([from_data, from_data, mask_data, cache]) + self.assertEqual(masked_output_data.shape, (3, 4, 2, 2)) + self.assertEqual(cache["value"].shape, (3, 4, 2, 2)) + + # Tests inputs without cache. + masked_output_data, cache = layer([from_data, from_data, mask_data]) + self.assertEqual(masked_output_data.shape, (3, 4, 2, 2)) + self.assertIsNone(cache) + + def test_padded_decode(self): + """Test with a mask tensor.""" + num_heads, head_size = 2, 2 + from_seq_length = 4 + # TPU decoding should pre-allocate the entire sequence. + batch_size = 3 + init_decode_length = from_seq_length + + # Directly tests the keras layer. + cache = _create_cache(batch_size, init_decode_length, num_heads, head_size) + layer = attention.CachedAttention(num_heads=num_heads, head_size=head_size) + + # Generate data for the input (non-mask) tensors. + from_data = tf.zeros((batch_size, from_seq_length, 8), dtype=np.float32) + decode_loop_step = 2 + mask_data = np.random.randint( + 2, size=(batch_size, from_seq_length, from_seq_length), dtype=np.int32) + # Testing the invocation directly as Keras cannot consume inputs correctly. + masked_output_data, cache = layer([from_data, from_data, mask_data, cache], + decode_loop_step=decode_loop_step) + self.assertEqual(masked_output_data.shape, (3, 4, 2, 2)) + self.assertEqual(cache["value"].shape, (3, 4, 2, 2)) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum.py new file mode 100644 index 0000000..ba2383e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum.py @@ -0,0 +1,180 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based einsum layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +_CHR_IDX = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"] + + +@tf.keras.utils.register_keras_serializable(package="Text") +class DenseEinsum(tf.keras.layers.Layer): + """A densely connected layer that uses tf.einsum as the backing computation. + + This layer can perform einsum calculations of arbitrary dimensionality. + + Arguments: + output_shape: Positive integer or tuple, dimensionality of the output space. + num_summed_dimensions: The number of dimensions to sum over. Standard 2D + matmul should use 1, 3D matmul should use 2, and so forth. + activation: Activation function to use. If you don't specify anything, no + activation is applied + (ie. "linear" activation: `a(x) = x`). + use_bias: Boolean, whether the layer uses a bias vector. + kernel_initializer: Initializer for the `kernel` weights matrix. + bias_initializer: Initializer for the bias vector. + kernel_regularizer: Regularizer function applied to the `kernel` weights + matrix. + bias_regularizer: Regularizer function applied to the bias vector. + activity_regularizer: Regularizer function applied to the output of the + layer (its "activation").. + kernel_constraint: Constraint function applied to the `kernel` weights + matrix. + bias_constraint: Constraint function applied to the bias vector. + Input shape: + N-D tensor with shape: `(batch_size, ..., input_dim)`. The most common + situation would be a 2D input with shape `(batch_size, input_dim)`. + Output shape: + N-D tensor with shape: `(batch_size, ..., units)`. For instance, for a 2D + input with shape `(batch_size, input_dim)`, the output would have shape + `(batch_size, units)`. + """ + + def __init__(self, + output_shape, + num_summed_dimensions=1, + activation=None, + use_bias=True, + kernel_initializer="glorot_uniform", + bias_initializer="zeros", + kernel_regularizer=None, + bias_regularizer=None, + activity_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + **kwargs): + super(DenseEinsum, self).__init__(**kwargs) + self._output_shape = output_shape if isinstance( + output_shape, (list, tuple)) else (output_shape,) + self._activation = tf.keras.activations.get(activation) + self._use_bias = use_bias + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._kernel_constraint = tf.keras.constraints.get(kernel_constraint) + self._bias_constraint = tf.keras.constraints.get(bias_constraint) + self._num_summed_dimensions = num_summed_dimensions + self._einsum_string = None + + def _build_einsum_string(self, free_input_dims, bound_dims, output_dims): + input_str = "" + kernel_str = "" + output_str = "" + letter_offset = 0 + for i in range(free_input_dims): + char = _CHR_IDX[i + letter_offset] + input_str += char + output_str += char + + letter_offset += free_input_dims + for i in range(bound_dims): + char = _CHR_IDX[i + letter_offset] + input_str += char + kernel_str += char + + letter_offset += bound_dims + for i in range(output_dims): + char = _CHR_IDX[i + letter_offset] + kernel_str += char + output_str += char + + return input_str + "," + kernel_str + "->" + output_str + + def build(self, input_shape): + input_shape = tf.TensorShape(input_shape) + input_rank = input_shape.rank + free_input_dims = input_rank - self._num_summed_dimensions + output_dims = len(self._output_shape) + + self._einsum_string = self._build_einsum_string(free_input_dims, + self._num_summed_dimensions, + output_dims) + + # This is only saved for testing purposes. + self._kernel_shape = ( + input_shape[free_input_dims:].concatenate(self._output_shape)) + + self._kernel = self.add_weight( + "kernel", + shape=self._kernel_shape, + initializer=self._kernel_initializer, + regularizer=self._kernel_regularizer, + constraint=self._kernel_constraint, + dtype=self.dtype, + trainable=True) + if self._use_bias: + self._bias = self.add_weight( + "bias", + shape=self._output_shape, + initializer=self._bias_initializer, + regularizer=self._bias_regularizer, + constraint=self._bias_constraint, + dtype=self.dtype, + trainable=True) + else: + self._bias = None + super(DenseEinsum, self).build(input_shape) + + def get_config(self): + config = { + "output_shape": + self._output_shape, + "num_summed_dimensions": + self._num_summed_dimensions, + "activation": + tf.keras.activations.serialize(self._activation), + "use_bias": + self._use_bias, + "kernel_initializer": + tf.keras.initializers.serialize(self._kernel_initializer), + "bias_initializer": + tf.keras.initializers.serialize(self._bias_initializer), + "kernel_regularizer": + tf.keras.regularizers.serialize(self._kernel_regularizer), + "bias_regularizer": + tf.keras.regularizers.serialize(self._bias_regularizer), + "activity_regularizer": + tf.keras.regularizers.serialize(self._activity_regularizer), + "kernel_constraint": + tf.keras.constraints.serialize(self._kernel_constraint), + "bias_constraint": + tf.keras.constraints.serialize(self._bias_constraint) + } + base_config = super(DenseEinsum, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def call(self, inputs): + ret = tf.einsum(self._einsum_string, inputs, self._kernel) + if self._use_bias: + ret += self._bias + if self._activation is not None: + ret = self._activation(ret) + return ret diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum_test.py new file mode 100644 index 0000000..57a60fe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/dense_einsum_test.py @@ -0,0 +1,123 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based einsum layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import dense_einsum + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class DenseEinsumLayer(keras_parameterized.TestCase): + + def test_3D_einsum_with_two_bound_dimensions(self): + test_layer = dense_einsum.DenseEinsum( + output_shape=(64,), num_summed_dimensions=2) + # Create a 4-dimensional input (the first dimension is implicit). + input_tensor = tf.keras.Input(shape=(None, 40, 80)) + _ = test_layer(input_tensor) + self.assertEqual(test_layer._einsum_string, "abcd,cde->abe") + self.assertEqual(test_layer._kernel_shape, (40, 80, 64)) + + def test_3D_einsum_with_one_bound_dimensions(self): + test_layer = dense_einsum.DenseEinsum( + output_shape=(64, 32), num_summed_dimensions=1) + # Create a 3-dimensional input (the first dimension is implicit). + input_tensor = tf.keras.Input(shape=(None, 80)) + _ = test_layer(input_tensor) + self.assertEqual(test_layer._einsum_string, "abc,cde->abde") + self.assertEqual(test_layer._kernel_shape, (80, 64, 32)) + + def test_2D_einsum_with_one_bound_dimensions(self): + test_layer = dense_einsum.DenseEinsum( + output_shape=(64,), num_summed_dimensions=1) + # Create a 3-dimensional input (the first dimension is implicit). + input_tensor = tf.keras.Input(shape=(None, 80)) + _ = test_layer(input_tensor) + self.assertEqual(test_layer._einsum_string, "abc,cd->abd") + self.assertEqual(test_layer._kernel_shape, (80, 64)) + + def test_bias_term_can_be_disabled(self): + # A layer created using the bias should have two weights. + test_layer = dense_einsum.DenseEinsum( + output_shape=64, num_summed_dimensions=1, use_bias=True) + input_tensor = tf.keras.Input(shape=(None, 80)) + _ = test_layer(input_tensor) + self.assertEqual(2, len(test_layer.get_weights())) + + # A layer created without the bias should have only one weight. + test_layer = dense_einsum.DenseEinsum( + output_shape=64, num_summed_dimensions=1, use_bias=False) + input_tensor = tf.keras.Input(shape=(None, 80)) + _ = test_layer(input_tensor) + self.assertEqual(1, len(test_layer.get_weights())) + + def test_activation(self): + # Create a model that does not use an activation. + no_activation_layer = dense_einsum.DenseEinsum( + output_shape=64, num_summed_dimensions=1, activation=None) + input_tensor = tf.keras.Input(shape=(None, 80)) + output_tensor = no_activation_layer(input_tensor) + no_activation_model = tf.keras.Model(input_tensor, output_tensor) + + # Create a model that uses a softmax activation. + activation_layer = dense_einsum.DenseEinsum( + output_shape=64, num_summed_dimensions=1, activation="softmax") + input_tensor = tf.keras.Input(shape=(None, 80)) + output_tensor = activation_layer(input_tensor) + activation_model = tf.keras.Model(input_tensor, output_tensor) + + # Make sure the models' weights are identical. + activation_model.set_weights(no_activation_model.get_weights()) + + # Predict using each model on the same input data. The output should be + # different, since one is using a softmax - even though the models' weights + # are the same. + input_values = 10 * np.random.random_sample((10, 4, 80)) + non_activated_data = no_activation_model.predict(input_values) + activated_data = activation_model.predict(input_values) + self.assertNotAllClose(activated_data, non_activated_data) + + def test_non_iterable_output_shape(self): + test_layer = dense_einsum.DenseEinsum( + output_shape=64, num_summed_dimensions=1) + # Create a 3-dimensional input (the first dimension is implicit). + input_tensor = tf.keras.Input(shape=(None, 80)) + _ = test_layer(input_tensor) + self.assertEqual(test_layer._einsum_string, "abc,cd->abd") + self.assertEqual(test_layer._kernel_shape, (80, 64)) + + def test_with_explicit_initializer(self): + test_layer = dense_einsum.DenseEinsum( + output_shape=(64,), + num_summed_dimensions=2, + kernel_initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02)) + # Create a 4-dimensional input (the first dimension is implicit). + input_tensor = tf.keras.Input(shape=(None, 40, 80)) + _ = test_layer(input_tensor) + self.assertEqual(test_layer._einsum_string, "abcd,cde->abe") + self.assertEqual(test_layer._kernel_shape, (40, 80, 64)) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax.py new file mode 100644 index 0000000..f4a04e4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax.py @@ -0,0 +1,61 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based softmax layer with optional masking.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + + +@tf.keras.utils.register_keras_serializable(package='Text') +class MaskedSoftmax(tf.keras.layers.Layer): + """Performs a softmax with optional masking on a tensor. + + Arguments: + mask_expansion_axes: Any axes that should be padded on the mask tensor. + """ + + def __init__(self, mask_expansion_axes=None, **kwargs): + self._mask_expansion_axes = mask_expansion_axes + super(MaskedSoftmax, self).__init__(**kwargs) + + def call(self, inputs): + if isinstance(inputs, list) and len(inputs) == 2: + scores, mask = inputs + else: + scores, mask = (inputs, None) + + if mask is not None: + if self._mask_expansion_axes is not None: + mask = tf.expand_dims(mask, axis=self._mask_expansion_axes) + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and -10000.0 for masked positions. + adder = (1.0 - tf.cast(mask, scores.dtype)) * -10000.0 + + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. + scores += adder + + return tf.nn.softmax(scores) + + def get_config(self): + config = {'mask_expansion_axes': self._mask_expansion_axes} + base_config = super(MaskedSoftmax, self).get_config() + return dict(list(base_config.items()) + list(config.items())) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax_test.py new file mode 100644 index 0000000..148f60c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/masked_softmax_test.py @@ -0,0 +1,88 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based masked softmax layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import masked_softmax + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class MaskedSoftmaxLayerTest(keras_parameterized.TestCase): + + def test_non_masked_softmax(self): + test_layer = masked_softmax.MaskedSoftmax() + input_tensor = tf.keras.Input(shape=(4, 8)) + output = test_layer(input_tensor) + model = tf.keras.Model(input_tensor, output) + + input_data = 10 * np.random.random_sample((3, 4, 8)) + output_data = model.predict(input_data) + expected_data = tf.nn.softmax(input_data) + self.assertAllClose(expected_data, output_data) + + def test_masked_softmax(self): + test_layer = masked_softmax.MaskedSoftmax() + input_tensor = tf.keras.Input(shape=(4, 8)) + mask_tensor = tf.keras.Input(shape=(4, 8)) + output = test_layer([input_tensor, mask_tensor]) + model = tf.keras.Model([input_tensor, mask_tensor], output) + + input_data = 10 * np.random.random_sample((3, 4, 8)) + mask_data = np.random.randint(2, size=(3, 4, 8)) + + output_data = model.predict([input_data, mask_data]) + expected_zeros = np.greater(mask_data, 0) + is_zeros = np.greater(output_data, 0) + self.assertAllEqual(expected_zeros, is_zeros) + + def test_masked_softmax_with_none_mask(self): + test_layer = masked_softmax.MaskedSoftmax() + input_tensor = tf.keras.Input(shape=(4, 8)) + output = test_layer([input_tensor, None]) + model = tf.keras.Model(input_tensor, output) + + input_data = 10 * np.random.random_sample((3, 4, 8)) + output_data = model.predict(input_data) + expected_data = tf.nn.softmax(input_data) + self.assertAllClose(expected_data, output_data) + + def test_softmax_with_axes_expansion(self): + test_layer = masked_softmax.MaskedSoftmax(mask_expansion_axes=[1]) + input_tensor = tf.keras.Input(shape=(4, 8)) + mask_tensor = tf.keras.Input(shape=(8)) + output = test_layer([input_tensor, mask_tensor]) + model = tf.keras.Model([input_tensor, mask_tensor], output) + + input_data = 10 * np.random.random_sample((3, 4, 8)) + mask_data = np.random.randint(2, size=(3, 8)) + + output_data = model.predict([input_data, mask_data]) + expanded_mask = np.expand_dims(mask_data, axis=1) * np.ones_like(input_data) + expected_zeros = np.greater(expanded_mask, 0) + is_zeros = np.greater(output_data, 0) + self.assertAllEqual(expected_zeros, is_zeros) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding.py new file mode 100644 index 0000000..a3afad9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding.py @@ -0,0 +1,92 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based one-hot embedding layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.modeling import tf_utils + + +@tf.keras.utils.register_keras_serializable(package="Text") +class OnDeviceEmbedding(tf.keras.layers.Layer): + """Performs an embedding lookup suitable for accelerator devices. + + This layer uses either tf.gather or tf.one_hot to translate integer indices to + float embeddings. + + Arguments: + vocab_size: Number of elements in the vocabulary. + embedding_width: Output size of the embedding layer. + initializer: The initializer to use for the embedding weights. Defaults to + "glorot_uniform". + use_one_hot: Whether to use tf.one_hot over tf.gather for the embedding + lookup. Defaults to False (that is, using tf.gather). Setting this option + to True may improve performance, especially on small vocabulary sizes, + but will generally require more memory. + """ + + def __init__(self, + vocab_size, + embedding_width, + initializer="glorot_uniform", + use_one_hot=False, + **kwargs): + # We need to have a default dtype of float32, since the inputs (which Keras + # usually uses to infer the dtype) will always be int32. + if "dtype" not in kwargs: + kwargs["dtype"] = "float32" + + super(OnDeviceEmbedding, self).__init__(**kwargs) + self._vocab_size = vocab_size + self._embedding_width = embedding_width + self._initializer = initializer + self._use_one_hot = use_one_hot + + def get_config(self): + config = { + "vocab_size": self._vocab_size, + "embedding_width": self._embedding_width, + "initializer": self._initializer, + "use_one_hot": self._use_one_hot, + } + base_config = super(OnDeviceEmbedding, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def build(self, input_shape): + self.embeddings = self.add_weight( + "embeddings", + shape=[self._vocab_size, self._embedding_width], + initializer=self._initializer) + + super(OnDeviceEmbedding, self).build(input_shape) + + def call(self, inputs): + input_shape = tf_utils.get_shape_list(inputs, expected_rank=2) + input_shape.append(self._embedding_width) + flat_inputs = tf.reshape(inputs, [-1]) + if self._use_one_hot: + one_hot_data = tf.one_hot( + flat_inputs, depth=self._vocab_size, dtype=self._dtype) + embeddings = tf.matmul(one_hot_data, self.embeddings) + else: + embeddings = tf.gather(self.embeddings, flat_inputs) + embeddings = tf.reshape(embeddings, input_shape) + + return embeddings diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding_test.py new file mode 100644 index 0000000..e2346f9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/on_device_embedding_test.py @@ -0,0 +1,193 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based one-hot embedding layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import on_device_embedding + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class OnDeviceEmbeddingTest(keras_parameterized.TestCase): + + def test_layer_creation(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, embedding_width=embedding_width) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # The output should be the same as the input, save that it has an extra + # embedding_width dimension on the end. + expected_output_shape = [None, sequence_length, embedding_width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + self.assertEqual(output_tensor.dtype, tf.float32) + + def test_layer_creation_with_float16_dtype(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, embedding_width=embedding_width, dtype="float16") + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # The output should be the same as the input, save that it has an extra + # embedding_width dimension on the end. + expected_output_shape = [None, sequence_length, embedding_width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + self.assertEqual(output_tensor.dtype, tf.float16) + + def test_layer_invocation(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, embedding_width=embedding_width) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(input_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 3 + input_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + output = model.predict(input_data) + self.assertEqual(tf.float32, output.dtype) + + def test_layer_invocation_with_float16_dtype(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, embedding_width=embedding_width, dtype="float16") + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(input_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 3 + input_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + output = model.predict(input_data) + self.assertEqual(tf.float16, output.dtype) + + def test_one_hot_layer_creation(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=embedding_width, + use_one_hot=True) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # The output should be the same as the input, save that it has an extra + # embedding_width dimension on the end. + expected_output_shape = [None, sequence_length, embedding_width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + self.assertEqual(output_tensor.dtype, tf.float32) + + def test_one_hot_layer_creation_with_float16_dtype(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=embedding_width, + dtype="float16", + use_one_hot=True) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # The output should be the same as the input, save that it has an extra + # embedding_width dimension on the end. + expected_output_shape = [None, sequence_length, embedding_width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + self.assertEqual(output_tensor.dtype, tf.float16) + + def test_one_hot_layer_invocation(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=embedding_width, + use_one_hot=True) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(input_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 3 + input_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + output = model.predict(input_data) + self.assertEqual(tf.float32, output.dtype) + + def test_one_hot_layer_invocation_with_float16_dtype(self): + vocab_size = 31 + embedding_width = 27 + test_layer = on_device_embedding.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=embedding_width, + dtype="float16", + use_one_hot=True) + # Create a 2-dimensional input (the first dimension is implicit). + sequence_length = 23 + input_tensor = tf.keras.Input(shape=(sequence_length), dtype=tf.int32) + output_tensor = test_layer(input_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(input_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 3 + input_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + output = model.predict(input_data) + self.assertEqual(tf.float16, output.dtype) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding.py new file mode 100644 index 0000000..f49e491 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding.py @@ -0,0 +1,120 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based positional embedding layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.modeling import tf_utils + + +@tf.keras.utils.register_keras_serializable(package="Text") +class PositionEmbedding(tf.keras.layers.Layer): + """Creates a positional embedding. + + This layer creates a positional embedding as described in "BERT: Pre-training + of Deep Bidirectional Transformers for Language Understanding" + (https://arxiv.org/abs/1810.04805). + + This layer can be set up to either create a statically shaped slice or a + dynamically shaped slice. If `use_dynamic_slicing` is True, the input tensor + can have a dynamic 1st dimension, while if `use_dynamic_slicing` is False the + input size must be fixed. + + Arguments: + use_dynamic_slicing: Whether to use the dynamic slicing path. + max_sequence_length: The maximum size of the dynamic sequence. Only + applicable if `use_dynamic_slicing` is True. + initializer: The initializer to use for the embedding weights. Defaults to + "glorot_uniform". + """ + + def __init__(self, + initializer="glorot_uniform", + use_dynamic_slicing=False, + max_sequence_length=None, + **kwargs): + # We need to have a default dtype of float32, since the inputs (which Keras + # usually uses to infer the dtype) will always be int32. + if "dtype" not in kwargs: + kwargs["dtype"] = "float32" + + super(PositionEmbedding, self).__init__(**kwargs) + if use_dynamic_slicing and max_sequence_length is None: + raise ValueError( + "If `use_dynamic_slicing` is True, `max_sequence_length` must be set." + ) + self._max_sequence_length = max_sequence_length + self._initializer = tf.keras.initializers.get(initializer) + self._use_dynamic_slicing = use_dynamic_slicing + + def get_config(self): + config = { + "max_sequence_length": self._max_sequence_length, + "initializer": tf.keras.initializers.serialize(self._initializer), + "use_dynamic_slicing": self._use_dynamic_slicing, + } + base_config = super(PositionEmbedding, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def build(self, input_shape): + """Implements build() for the layer.""" + dimension_list = input_shape.as_list() + + if len(dimension_list) != 3: + raise ValueError("PositionEmbedding expects a 3-dimensional input tensor " + "of shape [batch, sequence, width]") + seq_length = dimension_list[1] + width = dimension_list[2] + + # If we are not using dynamic slicing, we must assume that the sequence + # length is fixed and max_sequence_length should not be specified. + if not self._use_dynamic_slicing: + if seq_length is None: + raise ValueError( + "PositionEmbedding must have `use_dynamic_slicing` set " + "to True (and max_sequence_length set) when the " + "sequence (1st) dimension of the input is None.") + if self._max_sequence_length is not None: + raise ValueError( + "When `use_dynamic_slicing` is False, max_sequence_length should " + "not be specified and we ought to use seq_length to get the " + "variable shape.") + + if self._max_sequence_length is not None: + weight_sequence_length = self._max_sequence_length + else: + weight_sequence_length = seq_length + + self._position_embeddings = self.add_weight( + "embeddings", + shape=[weight_sequence_length, width], + initializer=self._initializer) + + super(PositionEmbedding, self).build(input_shape) + + def call(self, inputs): + """Implements call() for the layer.""" + input_shape = tf_utils.get_shape_list(inputs, expected_rank=3) + if self._use_dynamic_slicing: + position_embeddings = self._position_embeddings[:input_shape[1], :] + else: + position_embeddings = self._position_embeddings + + return tf.broadcast_to(position_embeddings, input_shape) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding_test.py new file mode 100644 index 0000000..bc446c9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/position_embedding_test.py @@ -0,0 +1,103 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based positional embedding layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import position_embedding + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class PositionEmbeddingLayerTest(keras_parameterized.TestCase): + + def test_static_layer_output_shape(self): + test_layer = position_embedding.PositionEmbedding() + # Create a 3-dimensional input (the first dimension is implicit). + sequence_length = 21 + width = 30 + input_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(input_tensor) + + # When using static positional embedding shapes, the output is expected + # to be the same as the input shape in all dimensions save batch. + expected_output_shape = [None, sequence_length, width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + # The default output dtype for this layer should be tf.float32. + self.assertEqual(tf.float32, output_tensor.dtype) + + def test_float16_dtype(self): + test_layer = position_embedding.PositionEmbedding(dtype="float16") + # Create a 3-dimensional input (the first dimension is implicit). + sequence_length = 21 + width = 30 + input_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(input_tensor) + + # When using static positional embedding shapes, the output is expected + # to be the same as the input shape in all dimensions save batch. + expected_output_shape = [None, sequence_length, width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + # The default output dtype for this layer should be tf.float32. + self.assertEqual(tf.float16, output_tensor.dtype) + + def test_dynamic_layer_output_shape(self): + max_sequence_length = 40 + test_layer = position_embedding.PositionEmbedding( + use_dynamic_slicing=True, max_sequence_length=max_sequence_length) + # Create a 3-dimensional input (the first dimension is implicit). + width = 30 + input_tensor = tf.keras.Input(shape=(None, width)) + output_tensor = test_layer(input_tensor) + + # When using dynamic positional embedding shapes, the output is expected + # to be the same as the input shape in all dimensions - but may be None if + # the input shape is None there. + expected_output_shape = [None, None, width] + self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) + + def test_dynamic_layer_slicing(self): + max_sequence_length = 40 + test_layer = position_embedding.PositionEmbedding( + use_dynamic_slicing=True, max_sequence_length=max_sequence_length) + # Create a 3-dimensional input (the first dimension is implicit). + width = 30 + input_tensor = tf.keras.Input(shape=(None, width)) + output_tensor = test_layer(input_tensor) + + model = tf.keras.Model(input_tensor, output_tensor) + + # Create input data that is shorter than max_sequence_length, which should + # trigger a down-slice. + input_length = 17 + # Note: This test explicitly uses a batch size of 1. This is to get around + # Keras' restriction on Model invocations: inputs are expected to have the + # same batch cardinality as outputs. In practice, this layer should be used + # inside a model, where it can be projected when added to another tensor. + input_data = np.ones((1, input_length, width)) + output_data = model.predict(input_data) + + self.assertAllEqual([1, input_length, width], output_data.shape) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/self_attention_mask.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/self_attention_mask.py new file mode 100644 index 0000000..933b496 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/self_attention_mask.py @@ -0,0 +1,63 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras layer that creates a self-attention mask.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf +from official.modeling import tf_utils + + +@tf.keras.utils.register_keras_serializable(package='Text') +class SelfAttentionMask(tf.keras.layers.Layer): + """Create 3D attention mask from a 2D tensor mask. + + inputs[0]: from_tensor: 2D or 3D Tensor of shape + [batch_size, from_seq_length, ...]. + inputs[1]: to_mask: int32 Tensor of shape [batch_size, to_seq_length]. + + Returns: + float Tensor of shape [batch_size, from_seq_length, to_seq_length]. + """ + + def call(self, inputs): + from_tensor = inputs[0] + to_mask = inputs[1] + from_shape = tf_utils.get_shape_list(from_tensor, expected_rank=[2, 3]) + batch_size = from_shape[0] + from_seq_length = from_shape[1] + + to_shape = tf_utils.get_shape_list(to_mask, expected_rank=2) + to_seq_length = to_shape[1] + + to_mask = tf.cast( + tf.reshape(to_mask, [batch_size, 1, to_seq_length]), + dtype=from_tensor.dtype) + + # We don't assume that `from_tensor` is a mask (although it could be). We + # don't actually care if we attend *from* padding tokens (only *to* padding) + # tokens so we create a tensor of all ones. + # + # `broadcast_ones` = [batch_size, from_seq_length, 1] + broadcast_ones = tf.ones( + shape=[batch_size, from_seq_length, 1], dtype=from_tensor.dtype) + + # Here we broadcast along two dimensions to create the mask. + mask = broadcast_ones * to_mask + + return mask diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer.py new file mode 100644 index 0000000..9bd71e8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer.py @@ -0,0 +1,229 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based transformer block layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.modeling.layers import attention +from official.nlp.modeling.layers import dense_einsum +from official.nlp.modeling.layers.util import tf_function_if_eager + + +@tf.keras.utils.register_keras_serializable(package="Text") +class Transformer(tf.keras.layers.Layer): + """Transformer layer. + + This layer implements the Transformer from "Attention Is All You Need". + (https://arxiv.org/abs/1706.03762). + + Arguments: + num_attention_heads: Number of attention heads. + intermediate_size: Size of the intermediate layer. + intermediate_activation: Activation for the intermediate layer. + dropout_rate: Dropout probability for the post-attention and output dropout. + attention_dropout_rate: Dropout probability for within the attention layer. + kernel_initializer: Initializer for dense layer kernels. + bias_initializer: Initializer for dense layer biases. + kernel_regularizer: Regularizer for dense layer kernels. + bias_regularizer: Regularizer for dense layer biases. + activity_regularizer: Regularizer for dense layer activity. + kernel_constraint: Constraint for dense layer kernels. + bias_constraint: Constraint for dense layer kernels. + """ + + def __init__(self, + num_attention_heads, + intermediate_size, + intermediate_activation, + dropout_rate=0.0, + attention_dropout_rate=0.0, + kernel_initializer="glorot_uniform", + bias_initializer="zeros", + kernel_regularizer=None, + bias_regularizer=None, + activity_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + **kwargs): + super(Transformer, self).__init__(**kwargs) + + self._num_heads = num_attention_heads + self._intermediate_size = intermediate_size + self._intermediate_activation = intermediate_activation + self._attention_dropout_rate = attention_dropout_rate + self._dropout_rate = dropout_rate + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._kernel_constraint = tf.keras.constraints.get(kernel_constraint) + self._bias_constraint = tf.keras.constraints.get(bias_constraint) + + def build(self, input_shape): + input_tensor = input_shape[0] if len(input_shape) == 2 else input_shape + input_tensor_shape = tf.TensorShape(input_tensor) + if len(input_tensor_shape) != 3: + raise ValueError("TransformerLayer expects a three-dimensional input of " + "shape [batch, sequence, width].") + batch_size, sequence_length, hidden_size = input_tensor_shape + + if len(input_shape) == 2: + mask_tensor_shape = tf.TensorShape(input_shape[1]) + expected_mask_tensor_shape = tf.TensorShape( + [batch_size, sequence_length, sequence_length]) + if not expected_mask_tensor_shape.is_compatible_with(mask_tensor_shape): + raise ValueError("When passing a mask tensor to TransformerLayer, the " + "mask tensor must be of shape [batch, " + "sequence_length, sequence_length] (here %s). Got a " + "mask tensor of shape %s." % + (expected_mask_tensor_shape, mask_tensor_shape)) + if hidden_size % self._num_heads != 0: + raise ValueError( + "The input size (%d) is not a multiple of the number of attention " + "heads (%d)" % (hidden_size, self._num_heads)) + self._attention_head_size = int(hidden_size // self._num_heads) + + self._attention_layer = attention.MultiHeadAttention( + num_heads=self._num_heads, + head_size=self._attention_head_size, + dropout_rate=self._attention_dropout_rate, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="self_attention") + self._attention_output_dense = dense_einsum.DenseEinsum( + output_shape=hidden_size, + num_summed_dimensions=2, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="self_attention_output") + self._attention_dropout = tf.keras.layers.Dropout(rate=self._dropout_rate) + # Use float32 in layernorm for numeric stability. + # It is probably safe in mixed_float16, but we haven't validated this yet. + self._attention_layer_norm = ( + tf.keras.layers.LayerNormalization( + name="self_attention_layer_norm", + axis=-1, + epsilon=1e-12, + dtype=tf.float32)) + self._intermediate_dense = dense_einsum.DenseEinsum( + output_shape=self._intermediate_size, + activation=None, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="intermediate") + self._intermediate_activation_layer = tf.keras.layers.Activation( + self._intermediate_activation) + self._output_dense = dense_einsum.DenseEinsum( + output_shape=hidden_size, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="output") + self._output_dropout = tf.keras.layers.Dropout(rate=self._dropout_rate) + # Use float32 in layernorm for numeric stability. + self._output_layer_norm = tf.keras.layers.LayerNormalization( + name="output_layer_norm", axis=-1, epsilon=1e-12, dtype=tf.float32) + + super(Transformer, self).build(input_shape) + + def get_config(self): + config = { + "num_attention_heads": + self._num_heads, + "intermediate_size": + self._intermediate_size, + "intermediate_activation": + self._intermediate_activation, + "dropout_rate": + self._dropout_rate, + "attention_dropout_rate": + self._attention_dropout_rate, + "kernel_initializer": + tf.keras.initializers.serialize(self._kernel_initializer), + "bias_initializer": + tf.keras.initializers.serialize(self._bias_initializer), + "kernel_regularizer": + tf.keras.regularizers.serialize(self._kernel_regularizer), + "bias_regularizer": + tf.keras.regularizers.serialize(self._bias_regularizer), + "activity_regularizer": + tf.keras.regularizers.serialize(self._activity_regularizer), + "kernel_constraint": + tf.keras.constraints.serialize(self._kernel_constraint), + "bias_constraint": + tf.keras.constraints.serialize(self._bias_constraint) + } + base_config = super(Transformer, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def call(self, inputs): + if isinstance(inputs, (list, tuple)) and len(inputs) == 2: + input_tensor, attention_mask = inputs + else: + input_tensor, attention_mask = (inputs, None) + + attention_inputs = [input_tensor, input_tensor] + + if attention_mask is not None: + attention_inputs.append(attention_mask) + + attention_output = self._attention_layer(attention_inputs) + attention_output = self._attention_output_dense(attention_output) + attention_output = self._attention_dropout(attention_output) + attention_output = self._attention_layer_norm(input_tensor + + attention_output) + intermediate_output = self._intermediate_dense(attention_output) + intermediate_output = self._intermediate_activation_layer( + intermediate_output) + layer_output = self._output_dense(intermediate_output) + layer_output = self._output_dropout(layer_output) + # During mixed precision training, attention_output is from layer norm and + # is always fp32 for now. Cast layer_output to fp32 for the subsequent + # add. + layer_output = tf.cast(layer_output, tf.float32) + layer_output = self._output_layer_norm(layer_output + attention_output) + + return layer_output + + +class CompiledTransformer(Transformer): + + @tf_function_if_eager(experimental_compile=True) + def call(self, inputs): + return super(CompiledTransformer, self).call(inputs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold.py new file mode 100644 index 0000000..c45bd2d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold.py @@ -0,0 +1,238 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based transformer scaffold layer.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import gin +import tensorflow as tf + +from official.nlp.modeling.layers import attention +from official.nlp.modeling.layers import dense_einsum + + +@tf.keras.utils.register_keras_serializable(package="Text") +@gin.configurable +class TransformerScaffold(tf.keras.layers.Layer): + """Transformer scaffold layer. + + This layer implements the Transformer from "Attention Is All You Need". + (https://arxiv.org/abs/1706.03762), with a customizable attention layer + option. Users can pass a class to `attention_cls` and associated config to + `attention_cfg`, in which case the scaffold will instantiate the class with + the config, or pass a class instance to `attention_cls`. + + Arguments: + num_attention_heads: Number of attention heads. + intermediate_size: Size of the intermediate layer. + intermediate_activation: Activation for the intermediate layer. + attention_cls: A class to instantate, or a layer instance. + attention_cfg: The config with which to instantiate `attention_cls`. Ignored + if attention_cls is a layer instance. + dropout_rate: Dropout probability for the post-attention and output dropout. + attention_dropout_rate: Dropout probability for within the attention layer. + kernel_initializer: Initializer for dense layer kernels. + bias_initializer: Initializer for dense layer biases. + kernel_regularizer: Regularizer for dense layer kernels. + bias_regularizer: Regularizer for dense layer biases. + activity_regularizer: Regularizer for dense layer activity. + kernel_constraint: Constraint for dense layer kernels. + bias_constraint: Constraint for dense layer kernels. + """ + + def __init__(self, + num_attention_heads, + intermediate_size, + intermediate_activation, + attention_cls=attention.MultiHeadAttention, + attention_cfg=None, + dropout_rate=0.0, + attention_dropout_rate=0.0, + kernel_initializer="glorot_uniform", + bias_initializer="zeros", + kernel_regularizer=None, + bias_regularizer=None, + activity_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + **kwargs): + super(TransformerScaffold, self).__init__(**kwargs) + + self._attention_cfg = attention_cfg + self._attention_cls = attention_cls + self._num_heads = num_attention_heads + self._intermediate_size = intermediate_size + self._intermediate_activation = intermediate_activation + self._attention_dropout_rate = attention_dropout_rate + self._dropout_rate = dropout_rate + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._kernel_constraint = tf.keras.constraints.get(kernel_constraint) + self._bias_constraint = tf.keras.constraints.get(bias_constraint) + + def build(self, input_shape): + input_tensor = input_shape[0] if len(input_shape) == 2 else input_shape + input_tensor_shape = tf.TensorShape(input_tensor) + if len(input_tensor_shape) != 3: + raise ValueError( + "TransformerScaffold expects a three-dimensional input of " + "shape [batch, sequence, width].") + batch_size, sequence_length, hidden_size = input_tensor_shape + + if len(input_shape) == 2: + mask_tensor_shape = tf.TensorShape(input_shape[1]) + expected_mask_tensor_shape = tf.TensorShape( + [batch_size, sequence_length, sequence_length]) + if not expected_mask_tensor_shape.is_compatible_with(mask_tensor_shape): + raise ValueError("When passing a mask tensor to TransformerLayer, the " + "mask tensor must be of shape [batch, " + "sequence_length, sequence_length] (here %s). Got a " + "mask tensor of shape %s." % + (expected_mask_tensor_shape, mask_tensor_shape)) + if hidden_size % self._num_heads != 0: + raise ValueError( + "The input size (%d) is not a multiple of the number of attention " + "heads (%d)" % (hidden_size, self._num_heads)) + self._attention_head_size = int(hidden_size // self._num_heads) + + if isinstance(self._attention_cls, tf.keras.layers.Layer): + self._attention_layer = self._attention_cls + else: + if self._attention_cfg is None: + attention_cfg = { + "num_heads": self._num_heads, + "head_size": self._attention_head_size, + "dropout_rate": self._attention_dropout_rate, + "kernel_initializer": self._kernel_initializer, + "bias_initializer": self._bias_initializer, + "kernel_regularizer": self._kernel_regularizer, + "bias_regularizer": self._bias_regularizer, + "activity_regularizer": self._activity_regularizer, + "kernel_constraint": self._kernel_constraint, + "bias_constraint": self._bias_constraint, + "name": "self_attention" + } + else: + attention_cfg = self._attention_cfg + self._attention_layer = self._attention_cls(**attention_cfg) + + self._attention_output_dense = dense_einsum.DenseEinsum( + output_shape=hidden_size, + num_summed_dimensions=2, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="self_attention_output") + self._attention_dropout = tf.keras.layers.Dropout(rate=self._dropout_rate) + # Use float32 in layernorm for numeric stability. + # It is probably safe in mixed_float16, but we haven't validated this yet. + self._attention_layer_norm = ( + tf.keras.layers.LayerNormalization( + name="self_attention_layer_norm", axis=-1, epsilon=1e-12, + dtype=tf.float32)) + self._intermediate_dense = dense_einsum.DenseEinsum( + output_shape=self._intermediate_size, + activation=self._intermediate_activation, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="intermediate") + self._output_dense = dense_einsum.DenseEinsum( + output_shape=hidden_size, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + name="output") + self._output_dropout = tf.keras.layers.Dropout(rate=self._dropout_rate) + # Use float32 in layernorm for numeric stability. + self._output_layer_norm = tf.keras.layers.LayerNormalization( + name="output_layer_norm", axis=-1, epsilon=1e-12, dtype=tf.float32) + + super(TransformerScaffold, self).build(input_shape) + + def get_config(self): + config = { + "attention_cls": + self._attention_layer, + "num_attention_heads": + self._num_heads, + "intermediate_size": + self._intermediate_size, + "intermediate_activation": + self._intermediate_activation, + "dropout_rate": + self._dropout_rate, + "attention_dropout_rate": + self._attention_dropout_rate, + "kernel_initializer": + tf.keras.initializers.serialize(self._kernel_initializer), + "bias_initializer": + tf.keras.initializers.serialize(self._bias_initializer), + "kernel_regularizer": + tf.keras.regularizers.serialize(self._kernel_regularizer), + "bias_regularizer": + tf.keras.regularizers.serialize(self._bias_regularizer), + "activity_regularizer": + tf.keras.regularizers.serialize(self._activity_regularizer), + "kernel_constraint": + tf.keras.constraints.serialize(self._kernel_constraint), + "bias_constraint": + tf.keras.constraints.serialize(self._bias_constraint) + } + base_config = super(TransformerScaffold, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def call(self, inputs): + if isinstance(inputs, (list, tuple)) and len(inputs) == 2: + input_tensor, attention_mask = inputs + else: + input_tensor, attention_mask = (inputs, None) + + attention_inputs = [input_tensor, input_tensor] + + if attention_mask is not None: + attention_inputs.append(attention_mask) + + attention_output = self._attention_layer(attention_inputs) + attention_output = self._attention_output_dense(attention_output) + attention_output = self._attention_dropout(attention_output) + attention_output = self._attention_layer_norm(input_tensor + + attention_output) + intermediate_output = self._intermediate_dense(attention_output) + layer_output = self._output_dense(intermediate_output) + layer_output = self._output_dropout(layer_output) + # During mixed precision training, attention_output is from layer norm and + # is always fp32 for now. Cast layer_output to fp32 for the subsequent add. + layer_output = tf.cast(layer_output, tf.float32) + layer_output = self._output_layer_norm(layer_output + attention_output) + + return layer_output diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold_test.py new file mode 100644 index 0000000..243514e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_scaffold_test.py @@ -0,0 +1,350 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based transformer block layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import attention +from official.nlp.modeling.layers import transformer_scaffold + + +# Test class that wraps a standard attention layer. If this layer is called +# at any point, the list passed to the config object will be filled with a +# boolean 'True'. We register this class as a Keras serializable so we can +# test serialization below. +@tf.keras.utils.register_keras_serializable(package='TestOnly') +class ValidatedAttentionLayer(attention.MultiHeadAttention): + + def __init__(self, call_list, **kwargs): + super(ValidatedAttentionLayer, self).__init__(**kwargs) + self.list = call_list + + def call(self, inputs): + self.list.append(True) + return super(ValidatedAttentionLayer, self).call(inputs) + + def get_config(self): + config = super(ValidatedAttentionLayer, self).get_config() + config['call_list'] = [] + return config + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class TransformerLayerTest(keras_parameterized.TestCase): + + def tearDown(self): + super(TransformerLayerTest, self).tearDown() + tf.keras.mixed_precision.experimental.set_policy('float32') + + def test_layer_creation(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(data_tensor) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output_tensor.shape.as_list()) + + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_layer_creation_with_mask(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output_tensor.shape.as_list()) + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_layer_creation_with_incorrect_mask_fails(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length - 3)) + with self.assertRaisesRegex(ValueError, 'When passing a mask tensor.*'): + _ = test_layer([data_tensor, mask_tensor]) + + def test_layer_invocation(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(data_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(data_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, width)) + _ = model.predict(input_data) + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_layer_invocation_with_mask(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + + # Create a model from the test layer. + model = tf.keras.Model([data_tensor, mask_tensor], output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, width)) + # The attention mask should be of shape (batch, from_seq_len, to_seq_len), + # which here is (batch, sequence_length, sequence_length) + mask_data = np.random.randint( + 2, size=(batch_size, sequence_length, sequence_length)) + _ = model.predict([input_data, mask_data]) + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_layer_invocation_with_float16_dtype(self): + tf.keras.mixed_precision.experimental.set_policy('mixed_float16') + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + + # Create a model from the test layer. + model = tf.keras.Model([data_tensor, mask_tensor], output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = (10 * np.random.random_sample( + (batch_size, sequence_length, width))) + # The attention mask should be of shape (batch, from_seq_len, to_seq_len), + # which here is (batch, sequence_length, sequence_length) + mask_data = np.random.randint( + 2, size=(batch_size, sequence_length, sequence_length)) + _ = model.predict([input_data, mask_data]) + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_transform_with_initializer(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu', + kernel_initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02)) + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output = test_layer(data_tensor) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output.shape.as_list()) + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0]) + + def test_layer_restoration_from_config(self): + sequence_length = 21 + width = 80 + + call_list = [] + attention_layer_cfg = { + 'num_heads': 10, + 'head_size': 8, + 'call_list': call_list, + 'name': 'test_layer', + } + test_layer = transformer_scaffold.TransformerScaffold( + attention_cls=ValidatedAttentionLayer, + attention_cfg=attention_layer_cfg, + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + + # Create a model from the test layer. + model = tf.keras.Model([data_tensor, mask_tensor], output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, width)) + # The attention mask should be of shape (batch, from_seq_len, to_seq_len), + # which here is (batch, sequence_length, sequence_length) + mask_data = np.random.randint( + 2, size=(batch_size, sequence_length, sequence_length)) + pre_serialization_output = model.predict([input_data, mask_data]) + + # Serialize the model config. Pass the serialized data through json to + # ensure that we can serialize this layer to disk. + serialized_data = json.dumps(model.get_config()) + post_string_serialized_data = json.loads(serialized_data) + + # Create a new model from the old config, and copy the weights. These models + # should have identical outputs. + new_model = tf.keras.Model.from_config(post_string_serialized_data) + new_model.set_weights(model.get_weights()) + output = new_model.predict([input_data, mask_data]) + + self.assertAllClose(pre_serialization_output, output) + + # If the layer was configured correctly, it should have a list attribute + # (since it should have the custom class and config passed to it). + new_model.summary() + new_call_list = new_model.get_layer( + name='transformer_scaffold')._attention_layer.list + self.assertNotEmpty(new_call_list) + self.assertTrue(new_call_list[0], + "The passed layer class wasn't instantiated.") + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_test.py new file mode 100644 index 0000000..120504d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/transformer_test.py @@ -0,0 +1,192 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Keras-based transformer block layer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import parameterized +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.layers import transformer + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +@parameterized.parameters(transformer.Transformer, + transformer.CompiledTransformer) +class TransformerLayerTest(keras_parameterized.TestCase): + + def tearDown(self): + super(TransformerLayerTest, self).tearDown() + tf.keras.mixed_precision.experimental.set_policy('float32') + + def test_layer_creation(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(data_tensor) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output_tensor.shape.as_list()) + + def test_layer_creation_with_mask(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output_tensor.shape.as_list()) + + def test_layer_creation_with_incorrect_mask_fails(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length - 3)) + with self.assertRaisesRegex(ValueError, 'When passing a mask tensor.*'): + _ = test_layer([data_tensor, mask_tensor]) + + def test_layer_invocation(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output_tensor = test_layer(data_tensor) + + # Create a model from the test layer. + model = tf.keras.Model(data_tensor, output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, width)) + _ = model.predict(input_data) + + def test_layer_invocation_with_mask(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + + # Create a model from the test layer. + model = tf.keras.Model([data_tensor, mask_tensor], output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, width)) + # The attention mask should be of shape (batch, from_seq_len, to_seq_len), + # which here is (batch, sequence_length, sequence_length) + mask_data = np.random.randint( + 2, size=(batch_size, sequence_length, sequence_length)) + _ = model.predict([input_data, mask_data]) + + def test_layer_invocation_with_float16_dtype(self, transformer_cls): + tf.keras.mixed_precision.experimental.set_policy('mixed_float16') + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu') + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + # Create a 2-dimensional input (the first dimension is implicit). + mask_tensor = tf.keras.Input(shape=(sequence_length, sequence_length)) + output_tensor = test_layer([data_tensor, mask_tensor]) + + # Create a model from the test layer. + model = tf.keras.Model([data_tensor, mask_tensor], output_tensor) + + # Invoke the model on test data. We can't validate the output data itself + # (the NN is too complex) but this will rule out structural runtime errors. + batch_size = 6 + input_data = (10 * np.random.random_sample( + (batch_size, sequence_length, width))) + # The attention mask should be of shape (batch, from_seq_len, to_seq_len), + # which here is (batch, sequence_length, sequence_length) + mask_data = np.random.randint( + 2, size=(batch_size, sequence_length, sequence_length)) + _ = model.predict([input_data, mask_data]) + + def test_transform_with_initializer(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu', + kernel_initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02)) + sequence_length = 21 + width = 80 + # Create a 3-dimensional input (the first dimension is implicit). + data_tensor = tf.keras.Input(shape=(sequence_length, width)) + output = test_layer(data_tensor) + # The default output of a transformer layer should be the same as the input. + self.assertEqual(data_tensor.shape.as_list(), output.shape.as_list()) + + def test_dynamic_layer_sequence(self, transformer_cls): + test_layer = transformer_cls( + num_attention_heads=10, + intermediate_size=2048, + intermediate_activation='relu', + kernel_initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02)) + # Create a 3-dimensional input (the first dimension is implicit). + width = 30 + input_tensor = tf.keras.Input(shape=(None, width)) + output_tensor = test_layer(input_tensor) + model = tf.keras.Model(input_tensor, output_tensor) + + input_length = 17 + input_data = np.ones((1, input_length, width)) + output_data = model.predict(input_data) + + self.assertAllEqual([1, input_length, width], output_data.shape) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/util.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/util.py new file mode 100644 index 0000000..354f216 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/layers/util.py @@ -0,0 +1,51 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras-based transformer block layer.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import functools + +import tensorflow as tf + + +class TfFunctionIfEagerDecorator(object): + """Helper decorator function to optionally apply the @tf.function annotation.""" + + def __init__(self, **kwargs): + self.func_kwargs = kwargs + + def __call__(self, func): + + @functools.wraps(func) + def wrapped_func(*args): + # TODO(b/150147476, b/150024785): Fix tf.function in TF1 crash. + if not hasattr(tf.compat.v1, "executing_eagerly_outside_functions" + ) or tf.compat.v1.executing_eagerly_outside_functions(): + return tf.function(func=func, **self.func_kwargs)(*args) + return func(*args) + + # Cache the created function in self._call_impl. + if not hasattr(self, "_call_impl"): + self._call_impl = wrapped_func + return self._call_impl + + +def tf_function_if_eager(**kwargs): + """Applies the @tf.function decorator only if running in eager mode.""" + return TfFunctionIfEagerDecorator(**kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/README.md new file mode 100644 index 0000000..522150c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/README.md @@ -0,0 +1,9 @@ +# Losses + +Losses contains common loss computation used in NLP tasks. + +* `weighted_sparse_categorical_crossentropy_loss` computes per-batch sparse +categorical crossentropy loss. + +* `weighted_sparse_categorical_crossentropy_per_example_loss` computes +per-example sparse categorical crossentropy loss. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/__init__.py new file mode 100644 index 0000000..919bad3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Activations package definition. Subject to change.""" +from official.nlp.modeling.losses.weighted_sparse_categorical_crossentropy import loss as weighted_sparse_categorical_crossentropy_loss +from official.nlp.modeling.losses.weighted_sparse_categorical_crossentropy import per_example_loss as weighted_sparse_categorical_crossentropy_per_example_loss diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy.py new file mode 100644 index 0000000..b88d8e3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy.py @@ -0,0 +1,106 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Sparse categorical cross-entropy losses.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + + +def _adjust_labels(labels, predictions): + """Adjust the 'labels' tensor by squeezing it if needed.""" + labels = tf.cast(labels, tf.int32) + if len(predictions.shape) == len(labels.shape): + labels = tf.squeeze(labels, [-1]) + return labels, predictions + + +def _validate_rank(labels, predictions, weights): + if weights is not None and len(weights.shape) != len(labels.shape): + raise RuntimeError( + ("Weight and label tensors were not of the same rank. weights.shape " + "was %s, and labels.shape was %s.") % + (predictions.shape, labels.shape)) + if (len(predictions.shape) - 1) != len(labels.shape): + raise RuntimeError( + ("Weighted sparse categorical crossentropy expects `labels` to have a " + "rank of one less than `predictions`. labels.shape was %s, and " + "predictions.shape was %s.") % (labels.shape, predictions.shape)) + + +def per_example_loss(labels, predictions, weights=None): + """Calculate a per-example sparse categorical crossentropy loss. + + This loss function assumes that the predictions are post-softmax. + Args: + labels: The labels to evaluate against. Should be a set of integer indices + ranging from 0 to (vocab_size-1). + predictions: The network predictions. Should have softmax already applied. + weights: An optional weight array of the same shape as the 'labels' array. + If None, all examples will be used. + + Returns: + A tensor of shape predictions.shape[:-1] containing the per-example + loss. + """ + # When using these functions with the Keras core API, we will need to squeeze + # the labels tensor - Keras adds a spurious inner dimension. + labels, predictions = _adjust_labels(labels, predictions) + _validate_rank(labels, predictions, weights) + + labels_one_hot = tf.one_hot(labels, predictions.shape[-1]) + labels_one_hot = tf.cast(labels_one_hot, predictions.dtype) + per_example_loss_data = -tf.reduce_sum( + predictions * labels_one_hot, axis=[-1]) + if weights is not None: + weights = tf.cast(weights, per_example_loss_data.dtype) + per_example_loss_data = weights * per_example_loss_data + return per_example_loss_data + + +def loss(labels, predictions, weights=None): + """Calculate a per-batch sparse categorical crossentropy loss. + + This loss function assumes that the predictions are post-softmax. + Args: + labels: The labels to evaluate against. Should be a set of integer indices + ranging from 0 to (vocab_size-1). + predictions: The network predictions. Should have softmax already applied. + weights: An optional weight array of the same shape as the 'labels' array. + If None, all examples will be used. + + Returns: + A loss scalar. + + Raises: + RuntimeError if the passed tensors do not have the same rank. + """ + # When using these functions with the Keras core API, we will need to squeeze + # the labels tensor - Keras adds a spurious inner dimension. + labels, predictions = _adjust_labels(labels, predictions) + _validate_rank(labels, predictions, weights) + + per_example_loss_data = per_example_loss(labels, predictions, weights) + + if weights is None: + return tf.reduce_mean(per_example_loss_data) + else: + numerator = tf.reduce_sum(per_example_loss_data) + weights = tf.cast(weights, predictions.dtype) + denominator = tf.reduce_sum(weights) + 1e-5 + return numerator / denominator diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy_test.py new file mode 100644 index 0000000..deb4d12 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/losses/weighted_sparse_categorical_crossentropy_test.py @@ -0,0 +1,381 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for masked LM loss.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling import networks +from official.nlp.modeling.losses import weighted_sparse_categorical_crossentropy + + +@keras_parameterized.run_all_keras_modes +class ClassificationLossTest(keras_parameterized.TestCase): + + def create_lm_model(self, + vocab_size, + sequence_length, + hidden_size, + num_predictions, + output="predictions"): + # First, create a transformer stack that we can use to get the LM's + # vocabulary weight. + xformer_stack = networks.TransformerEncoder( + vocab_size=vocab_size, + num_layers=1, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_attention_heads=4, + ) + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + lm_outputs, _ = xformer_stack([word_ids, mask, type_ids]) + + # Create a maskedLM from the transformer stack. + test_network = networks.MaskedLM( + num_predictions=num_predictions, + input_width=lm_outputs.shape[-1], + source_network=xformer_stack, + output=output) + + # Create a model from the masked LM layer. + lm_input_tensor = tf.keras.Input(shape=(sequence_length, hidden_size)) + masked_lm_positions = tf.keras.Input( + shape=(num_predictions,), dtype=tf.int32) + output = test_network([lm_input_tensor, masked_lm_positions]) + return tf.keras.Model([lm_input_tensor, masked_lm_positions], output) + + def create_classification_model(self, input_width, num_classes): + test_object = networks.Classification( + input_width=input_width, num_classes=num_classes) + # Create a 2-dimensional input (the first dimension is implicit). + pooled_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(pooled_data) + return tf.keras.Model(pooled_data, output) + + def test_per_example_loss_3d_input(self): + """Test per-example loss with a 3-dimensional input, from a masked LM.""" + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + model = self.create_lm_model( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Get the output of the masked LM. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + output_data = model.predict([lm_input_data, masked_position_data]) + + # Calculate per-example loss. + labels = np.random.randint(vocab_size, size=(batch_size, num_predictions)) + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels) + + # Per-example loss data should have one value per prediction, and those + # values shouldn't be zero in this case (as we're using random data). + expected_shape = [batch_size, num_predictions] + self.assertEqual(expected_shape, per_example_loss_data.shape.as_list()) + self.assertNotAllClose( + tf.zeros_like(per_example_loss_data), per_example_loss_data) + + def test_per_example_loss_2d_input(self): + """Test per-example loss with a 2-d input, from a classifier.""" + input_width = 512 + num_classes = 10 + model = self.create_classification_model(input_width, num_classes) + + # Invoke the network as part of a Model. + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + output_data = model.predict(input_data) + + # Calculate per example loss. + labels = np.random.randint(num_classes, size=(batch_size)) + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels) + + # Per-example loss data should have one value per batch item, and those + # values shouldn't be zero in this case (as we're using random data). + self.assertEqual([batch_size], per_example_loss_data.shape.as_list()) + self.assertNotAllClose( + tf.zeros_like(per_example_loss_data), per_example_loss_data) + + def test_per_example_loss_weights_3d_input(self): + """Test weighted per-example loss with a 3-d input, from a masked LM.""" + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + model = self.create_lm_model( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Get the output of the masked LM. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + output_data = model.predict([lm_input_data, masked_position_data]) + + # Calculate per-example loss with weights. + labels = np.random.randint(vocab_size, size=(batch_size, num_predictions)) + weights = np.random.randint(2, size=(batch_size, num_predictions)) + + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels, weights=weights) + + # Weighted per-example loss data should be equivalent to multiplying the + # loss tensor by the weights tensor. + expected_weighted_loss = per_example_loss_data * weights + self.assertAllClose(expected_weighted_loss, per_example_loss_data) + + def test_per_example_loss_weights_2d_input(self): + """Test weighted per-example loss with a 2-d input, from a classifier.""" + input_width = 512 + num_classes = 10 + model = self.create_classification_model(input_width, num_classes) + + # Invoke the network as part of a Model. + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + output_data = model.predict(input_data) + + # Calculate per-example loss with weights. + labels = np.random.randint(num_classes, size=(batch_size)) + weights = np.random.randint(2, size=(batch_size)) + + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels, weights=weights) + + # Weighted per-example loss data should be equivalent to multiplying the + # loss tensor by the weights tensor. + expected_weighted_loss = per_example_loss_data * weights + self.assertAllClose(expected_weighted_loss, per_example_loss_data) + + def test_loss_3d_input(self): + """Test overall loss with a 3-dimensional input, from a masked LM.""" + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + model = self.create_lm_model( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Get the output of the masked LM. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + output_data = model.predict([lm_input_data, masked_position_data]) + + # Calculate loss. + labels = np.random.randint(vocab_size, size=(batch_size, num_predictions)) + weights = np.random.randint(2, size=(batch_size, num_predictions)) + per_example_loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=weights) + + # Total loss data should have one value, and that value shouldn't be zero + # in this case (as we're using random data). + expected_shape = [] # Scalar + self.assertEqual(expected_shape, per_example_loss_data.shape.as_list()) + self.assertNotAllClose( + tf.zeros_like(per_example_loss_data), per_example_loss_data) + + def test_loss_2d_input(self): + """Test overall loss with a 2-d input, from a classifier.""" + input_width = 512 + num_classes = 10 + model = self.create_classification_model(input_width, num_classes) + + # Invoke the network as part of a Model. + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + output_data = model.predict(input_data) + + # Calculate per example loss. + labels = np.random.randint(num_classes, size=(batch_size)) + loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels) + + # Loss data should have one value only, and that value shouldn't be zero in + # this case (as we're using random data). + self.assertNotAllClose(0, loss_data) + + def test_loss_weights_3d_input(self): + """Test masked loss with a 3-dimensional input, from a masked LM.""" + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + model = self.create_lm_model( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Get the output of the masked LM. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + output_data = model.predict([lm_input_data, masked_position_data]) + + # Calculate a fully masked weight tensor. This should give a loss of zero. + labels = np.random.randint(vocab_size, size=(batch_size, num_predictions)) + null_weights = np.zeros((batch_size, num_predictions)) + weighted_loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=null_weights) + + # Because the tensor is fully masked, the loss should be 0. + self.assertAllClose(0, weighted_loss_data) + + def test_loss_weights_2d_input(self): + """Test masked loss with a 2-d input, from a classifier.""" + input_width = 512 + num_classes = 10 + model = self.create_classification_model(input_width, num_classes) + + # Invoke the network as part of a Model. + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + output_data = model.predict(input_data) + + # Calculate a fully masked weight tensor. This should give a loss of zero. + labels = np.random.randint(num_classes, size=(batch_size)) + null_weights = np.zeros((batch_size)) + weighted_loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=null_weights) + + # Because the tensor is fully masked, the loss should be 0. + self.assertAllClose(0, weighted_loss_data) + + def test_mismatched_predictions_and_labels_ranks_squeezes(self): + """Test that the loss asserts when rank(predictions)-1 != rank(labels).""" + batch_size = 3 + output_data = np.random.random_sample((batch_size, 10)) + labels = np.random.randint(10, size=(batch_size, 1)) + + # All that this test tests is that the squeeze is successful. + _ = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels) + + def test_mismatched_weights_and_labels_ranks_fail(self): + """Test that the loss asserts when rank(predictions) != rank(labels).""" + batch_size = 3 + output_data = np.random.random_sample((batch_size, 10, 15)) + labels = np.random.randint(10, size=(batch_size, 10)) + weights = np.random.randint(2, size=(batch_size)) + + with self.assertRaisesRegex(RuntimeError, ".*of the same rank.*"): + _ = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels, weights=weights) + with self.assertRaisesRegex(RuntimeError, ".*of the same rank.*"): + _ = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=weights) + + def test_tf_tensor_inputs(self): + """Test that tf.Tensors can be used as inputs to the loss function.""" + batch_size = 3 + output_data = tf.convert_to_tensor( + np.random.random_sample((batch_size, 10, 15))) + labels = tf.convert_to_tensor(np.random.randint(10, size=(batch_size, 10))) + weights = tf.convert_to_tensor(np.random.randint(2, size=(batch_size, 10))) + + # We're not trying to validate numerical correctness, just ensure that + # we can in fact pass tensors to these functions without causing runtime + # errors from the shape checking code. + _ = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels, weights=weights) + _ = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=weights) + + def test_legacy_lm_loss_compatibility(self): + """Test to validate computational correctness during refactors.""" + # This is the empirical output of a masked LM with the following parameters: + # batch_size = 3 + # vocab_size = 5 + # sequence_length = 4 + # num_predictions = 2 + output_data = np.array( + [[[-2.5286622, -1.0963473, -1.4925185, -2.4451098, -1.2923571], + [-2.7117882, -1.1205841, -4.02187, -0.9966936, -1.5119683]], + [[-2.5379114, -0.82479054, -2.287932, -1.3747153, -2.053741], + [-2.5379114, -0.82479054, -2.287932, -1.3747153, -2.053741]], + [[-2.7760355, -1.8219438, -3.0924666, -1.0779881, -0.9407509], + [-2.7760355, -1.8219438, -3.0924666, -1.0779881, -0.9407509]]]) + labels = np.array([[4, 0], [2, 2], [2, 1]]) + + # Validate that per_example loss calculations are the same. + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels) + expected_per_example_loss_data = [[1.2923571, 2.7117882], + [2.287932, 2.287932], + [3.0924666, 1.8219438]] + self.assertAllClose(expected_per_example_loss_data, per_example_loss_data) + + # Validate that overall loss calculations are the same. + weights = np.array([[1, 0], [0, 0], [0, 0]]) + loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=weights) + expected_loss_data = 1.2923441 + self.assertAllClose(expected_loss_data, loss_data) + + def test_legacy_classification_loss_compatibility(self): + """Test to validate computational correctness during refactors.""" + # This is the empirical output of a classifier with the following params: + # batch_size = 2 + # num_classes = 3 + output_data = np.array([[-1.6094601e-03, -1.0966038e+01, -6.4434357e+00], + [-1.6975292e-03, -6.4009643e+00, -1.0226612e+01]]) + labels = np.array([2, 1]) + + # Validate that per_example loss calculations are the same. + per_example_loss_data = weighted_sparse_categorical_crossentropy.per_example_loss( + predictions=output_data, labels=labels) + expected_per_example_loss_data = [6.4434357, 6.4009643] + self.assertAllClose(expected_per_example_loss_data, per_example_loss_data) + + # Validate that overall loss calculations are the same. + weights = None + loss_data = weighted_sparse_categorical_crossentropy.loss( + predictions=output_data, labels=labels, weights=weights) + expected_loss_data = 6.4222 + self.assertAllClose(expected_loss_data, loss_data) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/README.md new file mode 100644 index 0000000..99c3307 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/README.md @@ -0,0 +1,17 @@ +# Models + +Models are combinations of layers and networks that would be trained. + +Several pre-built canned models are provided to train encoder networks. These +models are intended as both convenience functions and canonical examples. + +* [`BertClassifier`](bert_classifier.py) implements a simple classification +model containing a single classification head using the Classification network. + +* [`BertSpanLabeler`](bert_span_labeler.py) implementats a simple single-span +start-end predictor (that is, a model that predicts two values: a start token +index and an end token index), suitable for SQuAD-style tasks. + +* [`BertPretrainer`](bert_pretrainer.py) implements a masked LM and a +classification head using the Masked LM and Classification networks, +respectively. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/__init__.py new file mode 100644 index 0000000..dfcbc1d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/__init__.py @@ -0,0 +1,18 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Models package definition.""" +from official.nlp.modeling.models.bert_classifier import BertClassifier +from official.nlp.modeling.models.bert_pretrainer import BertPretrainer +from official.nlp.modeling.models.bert_span_labeler import BertSpanLabeler diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier.py new file mode 100644 index 0000000..de8158c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier.py @@ -0,0 +1,91 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Trainer network for BERT-style models.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.modeling import networks + + +@tf.keras.utils.register_keras_serializable(package='Text') +class BertClassifier(tf.keras.Model): + """Classifier model based on a BERT-style transformer-based encoder. + + This is an implementation of the network structure surrounding a transformer + encoder as described in "BERT: Pre-training of Deep Bidirectional Transformers + for Language Understanding" (https://arxiv.org/abs/1810.04805). + + The BertClassifier allows a user to pass in a transformer stack, and + instantiates a classification network based on the passed `num_classes` + argument. + + Arguments: + network: A transformer network. This network should output a sequence output + and a classification output. Furthermore, it should expose its embedding + table via a "get_embedding_table" method. + num_classes: Number of classes to predict from the classification network. + initializer: The initializer (if any) to use in the classification networks. + Defaults to a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + network, + num_classes, + initializer='glorot_uniform', + output='logits', + dropout_rate=0.1, + **kwargs): + self._self_setattr_tracking = False + self._config = { + 'network': network, + 'num_classes': num_classes, + 'initializer': initializer, + 'output': output, + } + + # We want to use the inputs of the passed network as the inputs to this + # Model. To do this, we need to keep a handle to the network inputs for use + # when we construct the Model object at the end of init. + inputs = network.inputs + + # Because we have a copy of inputs to create this Model object, we can + # invoke the Network object with its own input tensors to start the Model. + _, cls_output = network(inputs) + cls_output = tf.keras.layers.Dropout(rate=dropout_rate)(cls_output) + + self.classifier = networks.Classification( + input_width=cls_output.shape[-1], + num_classes=num_classes, + initializer=initializer, + output=output, + name='classification') + predictions = self.classifier(cls_output) + + super(BertClassifier, self).__init__( + inputs=inputs, outputs=predictions, **kwargs) + + def get_config(self): + return self._config + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier_test.py new file mode 100644 index 0000000..085c2f7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_classifier_test.py @@ -0,0 +1,105 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for BERT trainer network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling import networks +from official.nlp.modeling.models import bert_classifier + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class BertClassifierTest(keras_parameterized.TestCase): + + def test_bert_trainer(self): + """Validate that the Keras object can be created.""" + # Build a transformer network to use within the BERT trainer. + vocab_size = 100 + sequence_length = 512 + test_network = networks.TransformerEncoder( + vocab_size=vocab_size, num_layers=2, sequence_length=sequence_length) + + # Create a BERT trainer with the created network. + num_classes = 3 + bert_trainer_model = bert_classifier.BertClassifier( + test_network, + num_classes=num_classes) + + # Create a set of 2-dimensional inputs (the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + + # Invoke the trainer model on the inputs. This causes the layer to be built. + cls_outs = bert_trainer_model([word_ids, mask, type_ids]) + + # Validate that the outputs are of the expected shape. + expected_classification_shape = [None, num_classes] + self.assertAllEqual(expected_classification_shape, cls_outs.shape.as_list()) + + def test_bert_trainer_tensor_call(self): + """Validate that the Keras object can be invoked.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=2) + + # Create a BERT trainer with the created network. + bert_trainer_model = bert_classifier.BertClassifier( + test_network, num_classes=2) + + # Create a set of 2-dimensional data tensors to feed into the model. + word_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + mask = tf.constant([[1, 1], [1, 0]], dtype=tf.int32) + type_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + + # Invoke the trainer model on the tensors. In Eager mode, this does the + # actual calculation. (We can't validate the outputs, since the network is + # too complex: this simply ensures we're not hitting runtime errors.) + _ = bert_trainer_model([word_ids, mask, type_ids]) + + def test_serialize_deserialize(self): + """Validate that the BERT trainer can be serialized and deserialized.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=5) + + # Create a BERT trainer with the created network. (Note that all the args + # are different, so we can catch any serialization mismatches.) + bert_trainer_model = bert_classifier.BertClassifier( + test_network, num_classes=4, initializer='zeros', output='predictions') + + # Create another BERT trainer via serialization and deserialization. + config = bert_trainer_model.get_config() + new_bert_trainer_model = bert_classifier.BertClassifier.from_config(config) + + # Validate that the config can be forced to JSON. + _ = new_bert_trainer_model.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(bert_trainer_model.get_config(), + new_bert_trainer_model.get_config()) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer.py new file mode 100644 index 0000000..1db8609 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer.py @@ -0,0 +1,125 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Trainer network for BERT-style models.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import copy +import tensorflow as tf + +from official.nlp.modeling import networks + + +@tf.keras.utils.register_keras_serializable(package='Text') +class BertPretrainer(tf.keras.Model): + """BERT network training model. + + This is an implementation of the network structure surrounding a transformer + encoder as described in "BERT: Pre-training of Deep Bidirectional Transformers + for Language Understanding" (https://arxiv.org/abs/1810.04805). + + The BertPretrainer allows a user to pass in a transformer stack, and + instantiates the masked language model and classification networks that are + used to create the training objectives. + + Arguments: + network: A transformer network. This network should output a sequence output + and a classification output. Furthermore, it should expose its embedding + table via a "get_embedding_table" method. + num_classes: Number of classes to predict from the classification network. + num_token_predictions: Number of tokens to predict from the masked LM. + activation: The activation (if any) to use in the masked LM and + classification networks. If None, no activation will be used. + initializer: The initializer (if any) to use in the masked LM and + classification networks. Defaults to a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + network, + num_classes, + num_token_predictions, + activation=None, + initializer='glorot_uniform', + output='logits', + **kwargs): + self._self_setattr_tracking = False + self._config = { + 'network': network, + 'num_classes': num_classes, + 'num_token_predictions': num_token_predictions, + 'activation': activation, + 'initializer': initializer, + 'output': output, + } + + # We want to use the inputs of the passed network as the inputs to this + # Model. To do this, we need to keep a copy of the network inputs for use + # when we construct the Model object at the end of init. (We keep a copy + # because we'll be adding another tensor to the copy later.) + network_inputs = network.inputs + inputs = copy.copy(network_inputs) + + # Because we have a copy of inputs to create this Model object, we can + # invoke the Network object with its own input tensors to start the Model. + # Note that, because of how deferred construction happens, we can't use + # the copy of the list here - by the time the network is invoked, the list + # object contains the additional input added below. + sequence_output, cls_output = network(network_inputs) + + sequence_output_length = sequence_output.shape.as_list()[1] + if sequence_output_length < num_token_predictions: + raise ValueError( + "The passed network's output length is %s, which is less than the " + 'requested num_token_predictions %s.' % + (sequence_output_length, num_token_predictions)) + + masked_lm_positions = tf.keras.layers.Input( + shape=(num_token_predictions,), + name='masked_lm_positions', + dtype=tf.int32) + inputs.append(masked_lm_positions) + + self.masked_lm = networks.MaskedLM( + num_predictions=num_token_predictions, + input_width=sequence_output.shape[-1], + source_network=network, + activation=activation, + initializer=initializer, + output=output, + name='masked_lm') + lm_outputs = self.masked_lm([sequence_output, masked_lm_positions]) + + self.classification = networks.Classification( + input_width=cls_output.shape[-1], + num_classes=num_classes, + initializer=initializer, + output=output, + name='classification') + sentence_outputs = self.classification(cls_output) + + super(BertPretrainer, self).__init__( + inputs=inputs, outputs=[lm_outputs, sentence_outputs], **kwargs) + + def get_config(self): + return self._config + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer_test.py new file mode 100644 index 0000000..587c2b0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_pretrainer_test.py @@ -0,0 +1,111 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for BERT trainer network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling import networks +from official.nlp.modeling.models import bert_pretrainer + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class BertPretrainerTest(keras_parameterized.TestCase): + + def test_bert_trainer(self): + """Validate that the Keras object can be created.""" + # Build a transformer network to use within the BERT trainer. + vocab_size = 100 + sequence_length = 512 + test_network = networks.TransformerEncoder( + vocab_size=vocab_size, num_layers=2, sequence_length=sequence_length) + + # Create a BERT trainer with the created network. + num_classes = 3 + num_token_predictions = 2 + bert_trainer_model = bert_pretrainer.BertPretrainer( + test_network, + num_classes=num_classes, + num_token_predictions=num_token_predictions) + + # Create a set of 2-dimensional inputs (the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + lm_mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + + # Invoke the trainer model on the inputs. This causes the layer to be built. + lm_outs, cls_outs = bert_trainer_model([word_ids, mask, type_ids, lm_mask]) + + # Validate that the outputs are of the expected shape. + expected_lm_shape = [None, num_token_predictions, vocab_size] + expected_classification_shape = [None, num_classes] + self.assertAllEqual(expected_lm_shape, lm_outs.shape.as_list()) + self.assertAllEqual(expected_classification_shape, cls_outs.shape.as_list()) + + def test_bert_trainer_tensor_call(self): + """Validate that the Keras object can be invoked.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=2) + + # Create a BERT trainer with the created network. + bert_trainer_model = bert_pretrainer.BertPretrainer( + test_network, num_classes=2, num_token_predictions=2) + + # Create a set of 2-dimensional data tensors to feed into the model. + word_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + mask = tf.constant([[1, 1], [1, 0]], dtype=tf.int32) + type_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + lm_mask = tf.constant([[1, 1], [1, 0]], dtype=tf.int32) + + # Invoke the trainer model on the tensors. In Eager mode, this does the + # actual calculation. (We can't validate the outputs, since the network is + # too complex: this simply ensures we're not hitting runtime errors.) + _, _ = bert_trainer_model([word_ids, mask, type_ids, lm_mask]) + + def test_serialize_deserialize(self): + """Validate that the BERT trainer can be serialized and deserialized.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=5) + + # Create a BERT trainer with the created network. (Note that all the args + # are different, so we can catch any serialization mismatches.) + bert_trainer_model = bert_pretrainer.BertPretrainer( + test_network, num_classes=4, num_token_predictions=3) + + # Create another BERT trainer via serialization and deserialization. + config = bert_trainer_model.get_config() + new_bert_trainer_model = bert_pretrainer.BertPretrainer.from_config(config) + + # Validate that the config can be forced to JSON. + _ = new_bert_trainer_model.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(bert_trainer_model.get_config(), + new_bert_trainer_model.get_config()) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler.py new file mode 100644 index 0000000..9cc8d62 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler.py @@ -0,0 +1,97 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Trainer network for BERT-style models.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.modeling import networks + + +@tf.keras.utils.register_keras_serializable(package='Text') +class BertSpanLabeler(tf.keras.Model): + """Span labeler model based on a BERT-style transformer-based encoder. + + This is an implementation of the network structure surrounding a transformer + encoder as described in "BERT: Pre-training of Deep Bidirectional Transformers + for Language Understanding" (https://arxiv.org/abs/1810.04805). + + The BertSpanLabeler allows a user to pass in a transformer stack, and + instantiates a span labeling network based on a single dense layer. + + Arguments: + network: A transformer network. This network should output a sequence output + and a classification output. Furthermore, it should expose its embedding + table via a "get_embedding_table" method. + initializer: The initializer (if any) to use in the span labeling network. + Defaults to a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + network, + initializer='glorot_uniform', + output='logits', + **kwargs): + self._self_setattr_tracking = False + self._config = { + 'network': network, + 'initializer': initializer, + 'output': output, + } + # We want to use the inputs of the passed network as the inputs to this + # Model. To do this, we need to keep a handle to the network inputs for use + # when we construct the Model object at the end of init. + inputs = network.inputs + + # Because we have a copy of inputs to create this Model object, we can + # invoke the Network object with its own input tensors to start the Model. + sequence_output, _ = network(inputs) + + # This is an instance variable for ease of access to the underlying task + # network. + self.span_labeling = networks.SpanLabeling( + input_width=sequence_output.shape[-1], + initializer=initializer, + output=output, + name='span_labeling') + start_logits, end_logits = self.span_labeling(sequence_output) + + # Use identity layers wrapped in lambdas to explicitly name the output + # tensors. This allows us to use string-keyed dicts in Keras fit/predict/ + # evaluate calls. + start_logits = tf.keras.layers.Lambda( + tf.identity, name='start_positions')( + start_logits) + end_logits = tf.keras.layers.Lambda( + tf.identity, name='end_positions')( + end_logits) + + logits = [start_logits, end_logits] + + super(BertSpanLabeler, self).__init__( + inputs=inputs, outputs=logits, **kwargs) + + def get_config(self): + return self._config + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler_test.py new file mode 100644 index 0000000..d05e91b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/models/bert_span_labeler_test.py @@ -0,0 +1,124 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for BERT trainer network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling import networks +from official.nlp.modeling.models import bert_span_labeler + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class BertSpanLabelerTest(keras_parameterized.TestCase): + + def test_bert_trainer(self): + """Validate that the Keras object can be created.""" + # Build a transformer network to use within the BERT trainer. + vocab_size = 100 + sequence_length = 512 + test_network = networks.TransformerEncoder( + vocab_size=vocab_size, num_layers=2, sequence_length=sequence_length) + + # Create a BERT trainer with the created network. + bert_trainer_model = bert_span_labeler.BertSpanLabeler(test_network) + + # Create a set of 2-dimensional inputs (the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + + # Invoke the trainer model on the inputs. This causes the layer to be built. + cls_outs = bert_trainer_model([word_ids, mask, type_ids]) + + # Validate that there are 2 outputs are of the expected shape. + self.assertEqual(2, len(cls_outs)) + expected_shape = [None, sequence_length] + for out in cls_outs: + self.assertAllEqual(expected_shape, out.shape.as_list()) + + def test_bert_trainer_named_compilation(self): + """Validate compilation using explicit output names.""" + # Build a transformer network to use within the BERT trainer. + vocab_size = 100 + sequence_length = 512 + test_network = networks.TransformerEncoder( + vocab_size=vocab_size, num_layers=2, sequence_length=sequence_length) + + # Create a BERT trainer with the created network. + bert_trainer_model = bert_span_labeler.BertSpanLabeler(test_network) + + # Attempt to compile the model using a string-keyed dict of output names to + # loss functions. This will validate that the outputs are named as we + # expect. + bert_trainer_model.compile( + optimizer='sgd', + loss={ + 'start_positions': 'mse', + 'end_positions': 'mse' + }) + + def test_bert_trainer_tensor_call(self): + """Validate that the Keras object can be invoked.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=2) + + # Create a BERT trainer with the created network. + bert_trainer_model = bert_span_labeler.BertSpanLabeler(test_network) + + # Create a set of 2-dimensional data tensors to feed into the model. + word_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + mask = tf.constant([[1, 1], [1, 0]], dtype=tf.int32) + type_ids = tf.constant([[1, 1], [2, 2]], dtype=tf.int32) + + # Invoke the trainer model on the tensors. In Eager mode, this does the + # actual calculation. (We can't validate the outputs, since the network is + # too complex: this simply ensures we're not hitting runtime errors.) + _ = bert_trainer_model([word_ids, mask, type_ids]) + + def test_serialize_deserialize(self): + """Validate that the BERT trainer can be serialized and deserialized.""" + # Build a transformer network to use within the BERT trainer. (Here, we use + # a short sequence_length for convenience.) + test_network = networks.TransformerEncoder( + vocab_size=100, num_layers=2, sequence_length=5) + + # Create a BERT trainer with the created network. (Note that all the args + # are different, so we can catch any serialization mismatches.) + bert_trainer_model = bert_span_labeler.BertSpanLabeler(test_network) + + # Create another BERT trainer via serialization and deserialization. + config = bert_trainer_model.get_config() + new_bert_trainer_model = bert_span_labeler.BertSpanLabeler.from_config( + config) + + # Validate that the config can be forced to JSON. + _ = new_bert_trainer_model.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(bert_trainer_model.get_config(), + new_bert_trainer_model.get_config()) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/README.md new file mode 100644 index 0000000..be91b79 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/README.md @@ -0,0 +1,24 @@ +# Networks + +Networks are combinations of layers (and possibly other networks). They are sub-units of models that would not be trained alone. It +encapsulates common network structures like a classification head +or a transformer encoder into an easily handled object with a +standardized configuration. + +* [`TransformerEncoder`](transformer_encoder.py) implements a bi-directional +Transformer-based encoder as described in ["BERT: Pre-training of Deep +Bidirectional Transformers for Language Understanding"](https://arxiv.org/abs/1810.04805). It includes the embedding lookups, +transformer layers and pooling layer. + +* [`AlbertTransformerEncoder`](albert_transformer_encoder.py) implements a +Transformer-encoder described in the paper ["ALBERT: A Lite BERT for +Self-supervised Learning of Language Representations] +(https://arxiv.org/abs/1909.11942). Compared with [BERT](https://arxiv.org/abs/1810.04805), ALBERT refactorizes embedding parameters +into two smaller matrices and shares parameters across layers. + +* [`MaskedLM`](masked_lm.py) implements a masked language model for BERT pretraining. It assumes that the network being passed has a `get_embedding_table()` method. + +* [`Classification`](classification.py) contains a single hidden layer, and is intended for use as a classification head. + +* [`SpanLabeling`](span_labeling.py) implements a single-span labeler (that is, a prediction head that can predict one start and end index per batch item) based on a single dense hidden layer. It can be used in the SQuAD task. + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/__init__.py new file mode 100644 index 0000000..c4a22b5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/__init__.py @@ -0,0 +1,21 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Networks package definition.""" +from official.nlp.modeling.networks.albert_transformer_encoder import AlbertTransformerEncoder +from official.nlp.modeling.networks.classification import Classification +from official.nlp.modeling.networks.encoder_scaffold import EncoderScaffold +from official.nlp.modeling.networks.masked_lm import MaskedLM +from official.nlp.modeling.networks.span_labeling import SpanLabeling +from official.nlp.modeling.networks.transformer_encoder import TransformerEncoder diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder.py new file mode 100644 index 0000000..437f562 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder.py @@ -0,0 +1,191 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ALBERT (https://arxiv.org/abs/1810.04805) text encoder network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras.engine import network # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations +from official.nlp.modeling import layers + + +@tf.keras.utils.register_keras_serializable(package='Text') +class AlbertTransformerEncoder(network.Network): + """ALBERT (https://arxiv.org/abs/1810.04805) text encoder network. + + This network implements the encoder described in the paper "ALBERT: A Lite + BERT for Self-supervised Learning of Language Representations" + (https://arxiv.org/abs/1909.11942). + + Compared with BERT (https://arxiv.org/abs/1810.04805), ALBERT refactorizes + embedding parameters into two smaller matrices and shares parameters + across layers. + + The default values for this object are taken from the ALBERT-Base + implementation described in the paper. + + Arguments: + vocab_size: The size of the token vocabulary. + embedding_width: The width of the word embeddings. If the embedding width + is not equal to hidden size, embedding parameters will be factorized into + two matrices in the shape of ['vocab_size', 'embedding_width'] and + ['embedding_width', 'hidden_size'] ('embedding_width' is usually much + smaller than 'hidden_size'). + hidden_size: The size of the transformer hidden layers. + num_layers: The number of transformer layers. + num_attention_heads: The number of attention heads for each transformer. The + hidden size must be divisible by the number of attention heads. + sequence_length: The sequence length that this encoder expects. If None, the + sequence length is dynamic; if an integer, the encoder will require + sequences padded to this length. + max_sequence_length: The maximum sequence length that this encoder can + consume. If None, max_sequence_length uses the value from sequence length. + This determines the variable shape for positional embeddings. + type_vocab_size: The number of types that the 'type_ids' input can take. + intermediate_size: The intermediate size for the transformer layers. + activation: The activation to use for the transformer layers. + dropout_rate: The dropout rate to use for the transformer layers. + attention_dropout_rate: The dropout rate to use for the attention layers + within the transformer layers. + initializer: The initialzer to use for all weights in this encoder. + """ + + def __init__(self, + vocab_size, + embedding_width=128, + hidden_size=768, + num_layers=12, + num_attention_heads=12, + sequence_length=512, + max_sequence_length=None, + type_vocab_size=16, + intermediate_size=3072, + activation=activations.gelu, + dropout_rate=0.1, + attention_dropout_rate=0.1, + initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02), + **kwargs): + activation = tf.keras.activations.get(activation) + initializer = tf.keras.initializers.get(initializer) + + if not max_sequence_length: + max_sequence_length = sequence_length + self._self_setattr_tracking = False + self._config_dict = { + 'vocab_size': vocab_size, + 'embedding_width': embedding_width, + 'hidden_size': hidden_size, + 'num_layers': num_layers, + 'num_attention_heads': num_attention_heads, + 'sequence_length': sequence_length, + 'max_sequence_length': max_sequence_length, + 'type_vocab_size': type_vocab_size, + 'intermediate_size': intermediate_size, + 'activation': tf.keras.activations.serialize(activation), + 'dropout_rate': dropout_rate, + 'attention_dropout_rate': attention_dropout_rate, + 'initializer': tf.keras.initializers.serialize(initializer), + } + + word_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_word_ids') + mask = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_mask') + type_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_type_ids') + + self._embedding_layer = layers.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=embedding_width, + initializer=initializer, + name='word_embeddings') + word_embeddings = self._embedding_layer(word_ids) + + # Always uses dynamic slicing for simplicity. + self._position_embedding_layer = layers.PositionEmbedding( + initializer=initializer, + use_dynamic_slicing=True, + max_sequence_length=max_sequence_length) + position_embeddings = self._position_embedding_layer(word_embeddings) + + type_embeddings = ( + layers.OnDeviceEmbedding( + vocab_size=type_vocab_size, + embedding_width=embedding_width, + initializer=initializer, + use_one_hot=True, + name='type_embeddings')(type_ids)) + + embeddings = tf.keras.layers.Add()( + [word_embeddings, position_embeddings, type_embeddings]) + embeddings = ( + tf.keras.layers.LayerNormalization( + name='embeddings/layer_norm', + axis=-1, + epsilon=1e-12, + dtype=tf.float32)(embeddings)) + embeddings = ( + tf.keras.layers.Dropout(rate=dropout_rate)(embeddings)) + # We project the 'embedding' output to 'hidden_size' if it is not already + # 'hidden_size'. + if embedding_width != hidden_size: + embeddings = layers.DenseEinsum( + output_shape=hidden_size, + kernel_initializer=initializer, + name='embedding_projection')( + embeddings) + + data = embeddings + attention_mask = layers.SelfAttentionMask()([data, mask]) + shared_layer = layers.Transformer( + num_attention_heads=num_attention_heads, + intermediate_size=intermediate_size, + intermediate_activation=activation, + dropout_rate=dropout_rate, + attention_dropout_rate=attention_dropout_rate, + kernel_initializer=initializer, + name='transformer') + for _ in range(num_layers): + data = shared_layer([data, attention_mask]) + + first_token_tensor = ( + tf.keras.layers.Lambda(lambda x: tf.squeeze(x[:, 0:1, :], axis=1))(data) + ) + cls_output = tf.keras.layers.Dense( + units=hidden_size, + activation='tanh', + kernel_initializer=initializer, + name='pooler_transform')( + first_token_tensor) + + super(AlbertTransformerEncoder, self).__init__( + inputs=[word_ids, mask, type_ids], + outputs=[data, cls_output], + **kwargs) + + def get_embedding_table(self): + return self._embedding_layer.embeddings + + def get_config(self): + return self._config_dict + + @classmethod + def from_config(cls, config): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder_test.py new file mode 100644 index 0000000..44368e4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/albert_transformer_encoder_test.py @@ -0,0 +1,174 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for ALBERT transformer-based text encoder network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl.testing import parameterized +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.networks import albert_transformer_encoder + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class AlbertTransformerEncoderTest(keras_parameterized.TestCase): + + def tearDown(self): + super(AlbertTransformerEncoderTest, self).tearDown() + tf.keras.mixed_precision.experimental.set_policy("float32") + + @parameterized.named_parameters( + dict(testcase_name="default", expected_dtype=tf.float32), + dict( + testcase_name="with_float16_dtype", + expected_dtype=tf.float16), + ) + def test_network_creation(self, expected_dtype): + hidden_size = 32 + sequence_length = 21 + + kwargs = dict( + vocab_size=100, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3) + if expected_dtype == tf.float16: + tf.keras.mixed_precision.experimental.set_policy("mixed_float16") + + # Create a small TransformerEncoder for testing. + test_network = albert_transformer_encoder.AlbertTransformerEncoder(**kwargs) + + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # If float_dtype is set to float16, the data output is float32 (from a layer + # norm) and pool output should be float16. + self.assertEqual(tf.float32, data.dtype) + self.assertEqual(expected_dtype, pooled.dtype) + + # ALBERT has additonal 'embedding_hidden_mapping_in' weights and + # it shares transformer weights. + self.assertNotEmpty( + [x for x in test_network.weights if "embedding_projection/" in x.name]) + self.assertNotEmpty( + [x for x in test_network.weights if "transformer/" in x.name]) + self.assertEmpty( + [x for x in test_network.weights if "transformer/layer" in x.name]) + + def test_network_invocation(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + num_types = 7 + # Create a small TransformerEncoder for testing. + test_network = albert_transformer_encoder.AlbertTransformerEncoder( + vocab_size=vocab_size, + embedding_width=8, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3, + type_vocab_size=num_types) + self.assertTrue( + test_network._position_embedding_layer._use_dynamic_slicing) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + # Create a model based off of this network: + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + # Invoke the model. We can't validate the output data here (the model is too + # complex) but this will catch structural runtime errors. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + type_id_data = np.random.randint( + num_types, size=(batch_size, sequence_length)) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + # Creates a TransformerEncoder with max_sequence_length != sequence_length + max_sequence_length = 128 + test_network = albert_transformer_encoder.AlbertTransformerEncoder( + vocab_size=vocab_size, + embedding_width=8, + hidden_size=hidden_size, + sequence_length=sequence_length, + max_sequence_length=max_sequence_length, + num_attention_heads=2, + num_layers=3, + type_vocab_size=num_types) + self.assertTrue(test_network._position_embedding_layer._use_dynamic_slicing) + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + def test_serialize_deserialize(self): + tf.keras.mixed_precision.experimental.set_policy("mixed_float16") + # Create a network object that sets all of its config options. + kwargs = dict( + vocab_size=100, + embedding_width=8, + hidden_size=32, + num_layers=3, + num_attention_heads=2, + sequence_length=21, + max_sequence_length=21, + type_vocab_size=12, + intermediate_size=1223, + activation="relu", + dropout_rate=0.05, + attention_dropout_rate=0.22, + initializer="glorot_uniform") + network = albert_transformer_encoder.AlbertTransformerEncoder(**kwargs) + + expected_config = dict(kwargs) + expected_config["activation"] = tf.keras.activations.serialize( + tf.keras.activations.get(expected_config["activation"])) + expected_config["initializer"] = tf.keras.initializers.serialize( + tf.keras.initializers.get(expected_config["initializer"])) + self.assertEqual(network.get_config(), expected_config) + + # Create another network object from the first object's config. + new_network = ( + albert_transformer_encoder.AlbertTransformerEncoder.from_config( + network.get_config())) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(network.get_config(), new_network.get_config()) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification.py new file mode 100644 index 0000000..d3263e8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification.py @@ -0,0 +1,86 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Classification network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +# pylint: disable=g-direct-tensorflow-import +from tensorflow.python.keras.engine import network + + +@tf.keras.utils.register_keras_serializable(package='Text') +class Classification(network.Network): + """Classification network head for BERT modeling. + + This network implements a simple classifier head based on a dense layer. + + Arguments: + input_width: The innermost dimension of the input tensor to this network. + num_classes: The number of classes that this network should classify to. + activation: The activation, if any, for the dense layer in this network. + initializer: The intializer for the dense layer in this network. Defaults to + a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + input_width, + num_classes, + initializer='glorot_uniform', + output='logits', + **kwargs): + self._self_setattr_tracking = False + self._config_dict = { + 'input_width': input_width, + 'num_classes': num_classes, + 'initializer': initializer, + 'output': output, + } + + cls_output = tf.keras.layers.Input( + shape=(input_width,), name='cls_output', dtype=tf.float32) + + self.logits = tf.keras.layers.Dense( + num_classes, + activation=None, + kernel_initializer=initializer, + name='predictions/transform/logits')( + cls_output) + predictions = tf.keras.layers.Activation(tf.nn.log_softmax)(self.logits) + + if output == 'logits': + output_tensors = self.logits + elif output == 'predictions': + output_tensors = predictions + else: + raise ValueError( + ('Unknown `output` value "%s". `output` can be either "logits" or ' + '"predictions"') % output) + + super(Classification, self).__init__( + inputs=[cls_output], outputs=output_tensors, **kwargs) + + def get_config(self): + return self._config_dict + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification_test.py new file mode 100644 index 0000000..6f71074 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/classification_test.py @@ -0,0 +1,179 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for classification network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.networks import classification + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class ClassificationTest(keras_parameterized.TestCase): + + def test_network_creation(self): + """Validate that the Keras object can be created.""" + input_width = 512 + num_classes = 10 + test_object = classification.Classification( + input_width=input_width, num_classes=num_classes) + # Create a 2-dimensional input (the first dimension is implicit). + cls_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(cls_data) + + # Validate that the outputs are of the expected shape. + expected_output_shape = [None, num_classes] + self.assertEqual(expected_output_shape, output.shape.as_list()) + + def test_network_invocation(self): + """Validate that the Keras object can be invoked.""" + input_width = 512 + num_classes = 10 + test_object = classification.Classification( + input_width=input_width, num_classes=num_classes, output='predictions') + # Create a 2-dimensional input (the first dimension is implicit). + cls_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(cls_data) + + # Invoke the network as part of a Model. + model = tf.keras.Model(cls_data, output) + input_data = 10 * np.random.random_sample((3, input_width)) + _ = model.predict(input_data) + + def test_network_invocation_with_internal_logits(self): + """Validate that the logit outputs are correct.""" + input_width = 512 + num_classes = 10 + test_object = classification.Classification( + input_width=input_width, num_classes=num_classes, output='predictions') + + # Create a 2-dimensional input (the first dimension is implicit). + cls_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(cls_data) + model = tf.keras.Model(cls_data, output) + logits_model = tf.keras.Model(test_object.inputs, test_object.logits) + + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + outputs = model.predict(input_data) + logits = logits_model.predict(input_data) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, num_classes) + self.assertEqual(expected_output_shape, outputs.shape) + self.assertEqual(expected_output_shape, logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + calculated_softmax = softmax_model.predict(logits) + self.assertAllClose(outputs, calculated_softmax) + + def test_network_invocation_with_internal_and_external_logits(self): + """Validate that the logit outputs are correct.""" + input_width = 512 + num_classes = 10 + test_object = classification.Classification( + input_width=input_width, num_classes=num_classes, output='logits') + + # Create a 2-dimensional input (the first dimension is implicit). + cls_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(cls_data) + model = tf.keras.Model(cls_data, output) + logits_model = tf.keras.Model(test_object.inputs, test_object.logits) + + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + outputs = model.predict(input_data) + logits = logits_model.predict(input_data) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, num_classes) + self.assertEqual(expected_output_shape, outputs.shape) + self.assertEqual(expected_output_shape, logits.shape) + + self.assertAllClose(outputs, logits) + + def test_network_invocation_with_logit_output(self): + """Validate that the logit outputs are correct.""" + input_width = 512 + num_classes = 10 + test_object = classification.Classification( + input_width=input_width, num_classes=num_classes, output='predictions') + logit_object = classification.Classification( + input_width=input_width, num_classes=num_classes, output='logits') + logit_object.set_weights(test_object.get_weights()) + + # Create a 2-dimensional input (the first dimension is implicit). + cls_data = tf.keras.Input(shape=(input_width,), dtype=tf.float32) + output = test_object(cls_data) + logit_output = logit_object(cls_data) + + model = tf.keras.Model(cls_data, output) + logits_model = tf.keras.Model(cls_data, logit_output) + + batch_size = 3 + input_data = 10 * np.random.random_sample((batch_size, input_width)) + outputs = model.predict(input_data) + logits = logits_model.predict(input_data) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, num_classes) + self.assertEqual(expected_output_shape, outputs.shape) + self.assertEqual(expected_output_shape, logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + calculated_softmax = softmax_model.predict(logits) + self.assertAllClose(outputs, calculated_softmax) + + def test_serialize_deserialize(self): + # Create a network object that sets all of its config options. + network = classification.Classification( + input_width=128, + num_classes=10, + initializer='zeros', + output='predictions') + + # Create another network object from the first object's config. + new_network = classification.Classification.from_config( + network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(network.get_config(), new_network.get_config()) + + def test_unknown_output_type_fails(self): + with self.assertRaisesRegex(ValueError, 'Unknown `output` value "bad".*'): + _ = classification.Classification( + input_width=128, num_classes=10, output='bad') + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold.py new file mode 100644 index 0000000..12dd61e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold.py @@ -0,0 +1,245 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Transformer-based text encoder network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import inspect + +import gin +import tensorflow as tf + +from tensorflow.python.keras.engine import network # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling import layers + + +@tf.keras.utils.register_keras_serializable(package='Text') +@gin.configurable +class EncoderScaffold(network.Network): + """Bi-directional Transformer-based encoder network scaffold. + + This network allows users to flexibly implement an encoder similar to the one + described in "BERT: Pre-training of Deep Bidirectional Transformers for + Language Understanding" (https://arxiv.org/abs/1810.04805). + + In this network, users can choose to provide a custom embedding subnetwork + (which will replace the standard embedding logic) and/or a custom hidden layer + class (which will replace the Transformer instantiation in the encoder). For + each of these custom injection points, users can pass either a class or a + class instance. If a class is passed, that class will be instantiated using + the 'embedding_cfg' or 'hidden_cfg' argument, respectively; if an instance + is passed, that instance will be invoked. (In the case of hidden_cls, the + instance will be invoked 'num_hidden_instances' times. + + If the hidden_cls is not overridden, a default transformer layer will be + instantiated. + + Arguments: + pooled_output_dim: The dimension of pooled output. + pooler_layer_initializer: The initializer for the classification + layer. + embedding_cls: The class or instance to use to embed the input data. This + class or instance defines the inputs to this encoder. If embedding_cls is + not set, a default embedding network (from the original BERT paper) will + be created. + embedding_cfg: A dict of kwargs to pass to the embedding_cls, if it needs to + be instantiated. If embedding_cls is not set, a config dict must be + passed to 'embedding_cfg' with the following values: + "vocab_size": The size of the token vocabulary. + "type_vocab_size": The size of the type vocabulary. + "hidden_size": The hidden size for this encoder. + "max_seq_length": The maximum sequence length for this encoder. + "seq_length": The sequence length for this encoder. + "initializer": The initializer for the embedding portion of this encoder. + "dropout_rate": The dropout rate to apply before the encoding layers. + embedding_data: A reference to the embedding weights that will be used to + train the masked language model, if necessary. This is optional, and only + needed if (1) you are overriding embedding_cls and (2) are doing standard + pretraining. + num_hidden_instances: The number of times to instantiate and/or invoke the + hidden_cls. + hidden_cls: The class or instance to encode the input data. If hidden_cls is + not set, a KerasBERT transformer layer will be used as the encoder class. + hidden_cfg: A dict of kwargs to pass to the hidden_cls, if it needs to be + instantiated. If hidden_cls is not set, a config dict must be passed to + 'hidden_cfg' with the following values: + "num_attention_heads": The number of attention heads. The hidden size + must be divisible by num_attention_heads. + "intermediate_size": The intermediate size of the transformer. + "intermediate_activation": The activation to apply in the transfomer. + "dropout_rate": The overall dropout rate for the transformer layers. + "attention_dropout_rate": The dropout rate for the attention layers. + "kernel_initializer": The initializer for the transformer layers. + """ + + def __init__( + self, + pooled_output_dim, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + embedding_cls=None, + embedding_cfg=None, + embedding_data=None, + num_hidden_instances=1, + hidden_cls=layers.Transformer, + hidden_cfg=None, + **kwargs): + self._self_setattr_tracking = False + self._hidden_cls = hidden_cls + self._hidden_cfg = hidden_cfg + self._num_hidden_instances = num_hidden_instances + self._pooled_output_dim = pooled_output_dim + self._pooler_layer_initializer = pooler_layer_initializer + self._embedding_cls = embedding_cls + self._embedding_cfg = embedding_cfg + self._embedding_data = embedding_data + self._kwargs = kwargs + + if embedding_cls: + if inspect.isclass(embedding_cls): + self._embedding_network = embedding_cls(embedding_cfg) + else: + self._embedding_network = embedding_cls + inputs = self._embedding_network.inputs + embeddings, mask = self._embedding_network(inputs) + else: + self._embedding_network = None + word_ids = tf.keras.layers.Input( + shape=(embedding_cfg['seq_length'],), + dtype=tf.int32, + name='input_word_ids') + mask = tf.keras.layers.Input( + shape=(embedding_cfg['seq_length'],), + dtype=tf.int32, + name='input_mask') + type_ids = tf.keras.layers.Input( + shape=(embedding_cfg['seq_length'],), + dtype=tf.int32, + name='input_type_ids') + inputs = [word_ids, mask, type_ids] + + self._embedding_layer = layers.OnDeviceEmbedding( + vocab_size=embedding_cfg['vocab_size'], + embedding_width=embedding_cfg['hidden_size'], + initializer=embedding_cfg['initializer'], + name='word_embeddings') + + word_embeddings = self._embedding_layer(word_ids) + + # Always uses dynamic slicing for simplicity. + self._position_embedding_layer = layers.PositionEmbedding( + initializer=embedding_cfg['initializer'], + use_dynamic_slicing=True, + max_sequence_length=embedding_cfg['max_seq_length']) + position_embeddings = self._position_embedding_layer(word_embeddings) + + type_embeddings = ( + layers.OnDeviceEmbedding( + vocab_size=embedding_cfg['type_vocab_size'], + embedding_width=embedding_cfg['hidden_size'], + initializer=embedding_cfg['initializer'], + use_one_hot=True, + name='type_embeddings')(type_ids)) + + embeddings = tf.keras.layers.Add()( + [word_embeddings, position_embeddings, type_embeddings]) + embeddings = ( + tf.keras.layers.LayerNormalization( + name='embeddings/layer_norm', + axis=-1, + epsilon=1e-12, + dtype=tf.float32)(embeddings)) + embeddings = ( + tf.keras.layers.Dropout( + rate=embedding_cfg['dropout_rate'])(embeddings)) + + attention_mask = layers.SelfAttentionMask()([embeddings, mask]) + data = embeddings + + for _ in range(num_hidden_instances): + if inspect.isclass(hidden_cls): + layer = self._hidden_cls( + **hidden_cfg) if hidden_cfg else self._hidden_cls() + else: + layer = self._hidden_cls + data = layer([data, attention_mask]) + + first_token_tensor = ( + tf.keras.layers.Lambda(lambda x: tf.squeeze(x[:, 0:1, :], axis=1))(data) + ) + cls_output = tf.keras.layers.Dense( + units=pooled_output_dim, + activation='tanh', + kernel_initializer=pooler_layer_initializer, + name='cls_transform')( + first_token_tensor) + + super(EncoderScaffold, self).__init__( + inputs=inputs, outputs=[data, cls_output], **kwargs) + + def get_config(self): + config_dict = { + 'num_hidden_instances': + self._num_hidden_instances, + 'pooled_output_dim': + self._pooled_output_dim, + 'pooler_layer_initializer': + self._pooler_layer_initializer, + 'embedding_cls': + self._embedding_network, + 'embedding_cfg': + self._embedding_cfg, + 'hidden_cfg': + self._hidden_cfg, + } + if inspect.isclass(self._hidden_cls): + config_dict['hidden_cls_string'] = tf.keras.utils.get_registered_name( + self._hidden_cls) + else: + config_dict['hidden_cls'] = self._hidden_cls + + config_dict.update(self._kwargs) + return config_dict + + @classmethod + def from_config(cls, config, custom_objects=None): + if 'hidden_cls_string' in config: + config['hidden_cls'] = tf.keras.utils.get_registered_object( + config['hidden_cls_string'], custom_objects=custom_objects) + del config['hidden_cls_string'] + return cls(**config) + + def get_embedding_table(self): + if self._embedding_network is None: + # In this case, we don't have a custom embedding network and can return + # the standard embedding data. + return self._embedding_layer.embeddings + + if self._embedding_data is None: + raise RuntimeError(('The EncoderScaffold %s does not have a reference ' + 'to the embedding data. This is required when you ' + 'pass a custom embedding network to the scaffold. ' + 'It is also possible that you are trying to get ' + 'embedding data from an embedding scaffold with a ' + 'custom embedding network where the scaffold has ' + 'been serialized and deserialized. Unfortunately, ' + 'accessing custom embedding references after ' + 'serialization is not yet supported.') % self.name) + else: + return self._embedding_data diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold_test.py new file mode 100644 index 0000000..3042397 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/encoder_scaffold_test.py @@ -0,0 +1,629 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for transformer-based text encoder network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations +from official.nlp.modeling import layers +from official.nlp.modeling.networks import encoder_scaffold + + +# Test class that wraps a standard transformer layer. If this layer is called +# at any point, the list passed to the config object will be filled with a +# boolean 'True'. We register this class as a Keras serializable so we can +# test serialization below. +@tf.keras.utils.register_keras_serializable(package="TestOnly") +class ValidatedTransformerLayer(layers.Transformer): + + def __init__(self, call_list, **kwargs): + super(ValidatedTransformerLayer, self).__init__(**kwargs) + self.list = call_list + + def call(self, inputs): + self.list.append(True) + return super(ValidatedTransformerLayer, self).call(inputs) + + def get_config(self): + config = super(ValidatedTransformerLayer, self).get_config() + config["call_list"] = [] + return config + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class EncoderScaffoldLayerClassTest(keras_parameterized.TestCase): + + def tearDown(self): + super(EncoderScaffoldLayerClassTest, self).tearDown() + tf.keras.mixed_precision.experimental.set_policy("float32") + + def test_network_creation(self): + hidden_size = 32 + sequence_length = 21 + num_hidden_instances = 3 + embedding_cfg = { + "vocab_size": 100, + "type_vocab_size": 16, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + + call_list = [] + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + "call_list": + call_list + } + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=num_hidden_instances, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cls=ValidatedTransformerLayer, + hidden_cfg=hidden_cfg, + embedding_cfg=embedding_cfg) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # The default output dtype is float32. + self.assertAllEqual(tf.float32, data.dtype) + self.assertAllEqual(tf.float32, pooled.dtype) + + # If call_list[0] exists and is True, the passed layer class was + # instantiated from the given config properly. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_network_creation_with_float16_dtype(self): + tf.keras.mixed_precision.experimental.set_policy("mixed_float16") + hidden_size = 32 + sequence_length = 21 + embedding_cfg = { + "vocab_size": 100, + "type_vocab_size": 16, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cfg=embedding_cfg) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # If float_dtype is set to float16, the data output is float32 (from a layer + # norm) and pool output should be float16. + self.assertAllEqual(tf.float32, data.dtype) + self.assertAllEqual(tf.float16, pooled.dtype) + + def test_network_invocation(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + num_types = 7 + embedding_cfg = { + "vocab_size": vocab_size, + "type_vocab_size": num_types, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + print(hidden_cfg) + print(embedding_cfg) + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cfg=embedding_cfg) + + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + # Create a model based off of this network: + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + # Invoke the model. We can't validate the output data here (the model is too + # complex) but this will catch structural runtime errors. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + type_id_data = np.random.randint( + num_types, size=(batch_size, sequence_length)) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + # Creates a EncoderScaffold with max_sequence_length != sequence_length + num_types = 7 + embedding_cfg = { + "vocab_size": vocab_size, + "type_vocab_size": num_types, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length * 2, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cfg=embedding_cfg) + + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + def test_serialize_deserialize(self): + # Create a network object that sets all of its config options. + hidden_size = 32 + sequence_length = 21 + embedding_cfg = { + "vocab_size": 100, + "type_vocab_size": 16, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + # Create a small EncoderScaffold for testing. + network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cfg=embedding_cfg) + + # Create another network object from the first object's config. + new_network = encoder_scaffold.EncoderScaffold.from_config( + network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(network.get_config(), new_network.get_config()) + + +@keras_parameterized.run_all_keras_modes +class EncoderScaffoldEmbeddingNetworkTest(keras_parameterized.TestCase): + + def test_network_invocation(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + + # Build an embedding network to swap in for the default network. This one + # will have 2 inputs (mask and word_ids) instead of 3, and won't use + # positional embeddings. + + word_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name="input_word_ids") + mask = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name="input_mask") + embedding_layer = layers.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=hidden_size, + initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02), + name="word_embeddings") + word_embeddings = embedding_layer(word_ids) + network = tf.keras.Model([word_ids, mask], [word_embeddings, mask]) + + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cls=network, + embedding_data=embedding_layer.embeddings) + + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask]) + + # Create a model based off of this network: + model = tf.keras.Model([word_ids, mask], [data, pooled]) + + # Invoke the model. We can't validate the output data here (the model is too + # complex) but this will catch structural runtime errors. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + _ = model.predict([word_id_data, mask_data]) + + # Test that we can get the embedding data that we passed to the object. This + # is necessary to support standard language model training. + self.assertIs(embedding_layer.embeddings, + test_network.get_embedding_table()) + + def test_serialize_deserialize(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + + # Build an embedding network to swap in for the default network. This one + # will have 2 inputs (mask and word_ids) instead of 3, and won't use + # positional embeddings. + + word_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name="input_word_ids") + mask = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name="input_mask") + embedding_layer = layers.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=hidden_size, + initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02), + name="word_embeddings") + word_embeddings = embedding_layer(word_ids) + network = tf.keras.Model([word_ids, mask], [word_embeddings, mask]) + + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + } + + # Create a small EncoderScaffold for testing. + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cfg=hidden_cfg, + embedding_cls=network, + embedding_data=embedding_layer.embeddings) + + # Create another network object from the first object's config. + new_network = encoder_scaffold.EncoderScaffold.from_config( + test_network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(test_network.get_config(), new_network.get_config()) + + # Create a model based off of the old and new networks: + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + + data, pooled = new_network([word_ids, mask]) + new_model = tf.keras.Model([word_ids, mask], [data, pooled]) + + data, pooled = test_network([word_ids, mask]) + model = tf.keras.Model([word_ids, mask], [data, pooled]) + + # Copy the weights between models. + new_model.set_weights(model.get_weights()) + + # Invoke the models. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + data, cls = model.predict([word_id_data, mask_data]) + new_data, new_cls = new_model.predict([word_id_data, mask_data]) + + # The output should be equal. + self.assertAllEqual(data, new_data) + self.assertAllEqual(cls, new_cls) + + # We should not be able to get a reference to the embedding data. + with self.assertRaisesRegex(RuntimeError, ".*does not have a reference.*"): + new_network.get_embedding_table() + + +@keras_parameterized.run_all_keras_modes +class EncoderScaffoldHiddenInstanceTest(keras_parameterized.TestCase): + + def test_network_invocation(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + num_types = 7 + + embedding_cfg = { + "vocab_size": vocab_size, + "type_vocab_size": num_types, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + + call_list = [] + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + "call_list": + call_list + } + # Create a small EncoderScaffold for testing. This time, we pass an already- + # instantiated layer object. + + xformer = ValidatedTransformerLayer(**hidden_cfg) + + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cls=xformer, + embedding_cfg=embedding_cfg) + + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + # Create a model based off of this network: + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + # Invoke the model. We can't validate the output data here (the model is too + # complex) but this will catch structural runtime errors. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + type_id_data = np.random.randint( + num_types, size=(batch_size, sequence_length)) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + # If call_list[0] exists and is True, the passed layer class was + # called as part of the graph creation. + self.assertNotEmpty(call_list) + self.assertTrue(call_list[0], "The passed layer class wasn't instantiated.") + + def test_serialize_deserialize(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + num_types = 7 + + embedding_cfg = { + "vocab_size": vocab_size, + "type_vocab_size": num_types, + "hidden_size": hidden_size, + "seq_length": sequence_length, + "max_seq_length": sequence_length, + "initializer": tf.keras.initializers.TruncatedNormal(stddev=0.02), + "dropout_rate": 0.1, + } + + call_list = [] + hidden_cfg = { + "num_attention_heads": + 2, + "intermediate_size": + 3072, + "intermediate_activation": + activations.gelu, + "dropout_rate": + 0.1, + "attention_dropout_rate": + 0.1, + "kernel_initializer": + tf.keras.initializers.TruncatedNormal(stddev=0.02), + "call_list": + call_list + } + # Create a small EncoderScaffold for testing. This time, we pass an already- + # instantiated layer object. + + xformer = ValidatedTransformerLayer(**hidden_cfg) + + test_network = encoder_scaffold.EncoderScaffold( + num_hidden_instances=3, + pooled_output_dim=hidden_size, + pooler_layer_initializer=tf.keras.initializers.TruncatedNormal( + stddev=0.02), + hidden_cls=xformer, + embedding_cfg=embedding_cfg) + + # Create another network object from the first object's config. + new_network = encoder_scaffold.EncoderScaffold.from_config( + test_network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(test_network.get_config(), new_network.get_config()) + + # Create a model based off of the old and new networks: + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + + data, pooled = new_network([word_ids, mask, type_ids]) + new_model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + data, pooled = test_network([word_ids, mask, type_ids]) + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + # Copy the weights between models. + new_model.set_weights(model.get_weights()) + + # Invoke the models. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + type_id_data = np.random.randint( + num_types, size=(batch_size, sequence_length)) + data, cls = model.predict([word_id_data, mask_data, type_id_data]) + new_data, new_cls = new_model.predict( + [word_id_data, mask_data, type_id_data]) + + # The output should be equal. + self.assertAllEqual(data, new_data) + self.assertAllEqual(cls, new_cls) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm.py new file mode 100644 index 0000000..5843882 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm.py @@ -0,0 +1,186 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Masked language model network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras.engine import network # pylint: disable=g-direct-tensorflow-import +from official.modeling import tf_utils + + +@tf.keras.utils.register_keras_serializable(package='Text') +class MaskedLM(network.Network): + """Masked language model network head for BERT modeling. + + This network implements a masked language model based on the provided network. + It assumes that the network being passed has a "get_embedding_table()" method. + + Arguments: + input_width: The innermost dimension of the input tensor to this network. + num_predictions: The number of predictions to make per sequence. + source_network: The network with the embedding layer to use for the + embedding layer. + activation: The activation, if any, for the dense layer in this network. + initializer: The intializer for the dense layer in this network. Defaults to + a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + input_width, + num_predictions, + source_network, + activation=None, + initializer='glorot_uniform', + output='logits', + **kwargs): + + embedding_table = source_network.get_embedding_table() + vocab_size, hidden_size = embedding_table.shape + + sequence_data = tf.keras.layers.Input( + shape=(None, input_width), name='sequence_data', dtype=tf.float32) + masked_lm_positions = tf.keras.layers.Input( + shape=(num_predictions,), name='masked_lm_positions', dtype=tf.int32) + + masked_lm_input = tf.keras.layers.Lambda( + lambda x: self._gather_indexes(x[0], x[1]))( + [sequence_data, masked_lm_positions]) + lm_data = ( + tf.keras.layers.Dense( + hidden_size, + activation=activation, + kernel_initializer=initializer, + name='cls/predictions/transform/dense')(masked_lm_input)) + lm_data = tf.keras.layers.LayerNormalization( + axis=-1, epsilon=1e-12, name='cls/predictions/transform/LayerNorm')( + lm_data) + lm_data = tf.keras.layers.Lambda( + lambda x: tf.matmul(x, embedding_table, transpose_b=True))( + lm_data) + logits = Bias( + initializer=tf.keras.initializers.Zeros(), + name='cls/predictions/output_bias')( + lm_data) + + # We can't use the standard Keras reshape layer here, since it expects + # the input and output batch size to be the same. + reshape_layer = tf.keras.layers.Lambda( + lambda x: tf.reshape(x, [-1, num_predictions, vocab_size])) + + self.logits = reshape_layer(logits) + predictions = tf.keras.layers.Activation(tf.nn.log_softmax)(self.logits) + + if output == 'logits': + output_tensors = self.logits + elif output == 'predictions': + output_tensors = predictions + else: + raise ValueError( + ('Unknown `output` value "%s". `output` can be either "logits" or ' + '"predictions"') % output) + + super(MaskedLM, self).__init__( + inputs=[sequence_data, masked_lm_positions], + outputs=output_tensors, + **kwargs) + + def get_config(self): + raise NotImplementedError('MaskedLM cannot be directly serialized at this ' + 'time. Please use it only in Layers or ' + 'functionally subclassed Models/Networks.') + + def _gather_indexes(self, sequence_tensor, positions): + """Gathers the vectors at the specific positions. + + Args: + sequence_tensor: Sequence output of `BertModel` layer of shape + (`batch_size`, `seq_length`, num_hidden) where num_hidden is number of + hidden units of `BertModel` layer. + positions: Positions ids of tokens in sequence to mask for pretraining + of with dimension (batch_size, num_predictions) where + `num_predictions` is maximum number of tokens to mask out and predict + per each sequence. + + Returns: + Masked out sequence tensor of shape (batch_size * num_predictions, + num_hidden). + """ + sequence_shape = tf_utils.get_shape_list( + sequence_tensor, name='sequence_output_tensor') + batch_size, seq_length, width = sequence_shape + + flat_offsets = tf.reshape( + tf.range(0, batch_size, dtype=tf.int32) * seq_length, [-1, 1]) + flat_positions = tf.reshape(positions + flat_offsets, [-1]) + flat_sequence_tensor = tf.reshape(sequence_tensor, + [batch_size * seq_length, width]) + output_tensor = tf.gather(flat_sequence_tensor, flat_positions) + + return output_tensor + + +@tf.keras.utils.register_keras_serializable(package='Text') +# Temporary until we can create a Dense layer that ties the embedding. +class Bias(tf.keras.layers.Layer): + """Adds a bias term to an input.""" + + def __init__(self, + initializer='zeros', + regularizer=None, + constraint=None, + activation=None, + **kwargs): + super(Bias, self).__init__(**kwargs) + self._initializer = tf.keras.initializers.get(initializer) + self._regularizer = tf.keras.regularizers.get(regularizer) + self._constraint = tf.keras.constraints.get(constraint) + self._activation = tf.keras.activations.get(activation) + + def build(self, input_shape): + input_shape = tf.TensorShape(input_shape) + self._bias = self.add_weight( + 'bias', + shape=input_shape[1:], + initializer=self._initializer, + regularizer=self._regularizer, + constraint=self._constraint, + dtype=self._dtype, + trainable=True) + + super(Bias, self).build(input_shape) + + def get_config(self): + config = { + 'activation': tf.keras.activations.serialize(self._activation), + 'initializer': tf.keras.initializers.serialize(self._initializer), + 'regularizer': tf.keras.regularizers.serialize(self._regularizer), + 'constraint': tf.keras.constraints.serialize(self._constraint) + } + base_config = super(Bias, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + def call(self, inputs): + outputs = tf.nn.bias_add(inputs, self._bias) + if self._activation is not None: + return self._activation(outputs) # pylint: disable=not-callable + else: + return outputs diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm_test.py new file mode 100644 index 0000000..2b7b382 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/masked_lm_test.py @@ -0,0 +1,227 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for masked language model network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import + +from official.nlp.modeling.networks import masked_lm +from official.nlp.modeling.networks import transformer_encoder + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class MaskedLMTest(keras_parameterized.TestCase): + + def create_network(self, + vocab_size, + sequence_length, + hidden_size, + num_predictions, + output='predictions', + xformer_stack=None): + # First, create a transformer stack that we can use to get the LM's + # vocabulary weight. + if xformer_stack is None: + xformer_stack = transformer_encoder.TransformerEncoder( + vocab_size=vocab_size, + num_layers=1, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_attention_heads=4, + ) + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + lm_outputs, _ = xformer_stack([word_ids, mask, type_ids]) + + # Create a maskedLM from the transformer stack. + test_network = masked_lm.MaskedLM( + num_predictions=num_predictions, + input_width=lm_outputs.shape[-1], + source_network=xformer_stack, + output=output) + return test_network + + def test_network_creation(self): + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + test_network = self.create_network( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Make sure that the output tensor of the masked LM is the right shape. + lm_input_tensor = tf.keras.Input(shape=(sequence_length, hidden_size)) + masked_lm_positions = tf.keras.Input( + shape=(num_predictions,), dtype=tf.int32) + output = test_network([lm_input_tensor, masked_lm_positions]) + + expected_output_shape = [None, num_predictions, vocab_size] + self.assertEqual(expected_output_shape, output.shape.as_list()) + + def test_network_invocation_with_internal_logits(self): + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + test_network = self.create_network( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Create a model from the masked LM layer. + lm_input_tensor = tf.keras.Input(shape=(sequence_length, hidden_size)) + masked_lm_positions = tf.keras.Input( + shape=(num_predictions,), dtype=tf.int32) + output = test_network([lm_input_tensor, masked_lm_positions]) + model = tf.keras.Model([lm_input_tensor, masked_lm_positions], output) + logits_model = tf.keras.Model(test_network.inputs, test_network.logits) + + # Invoke the masked LM on some fake data to make sure there are no runtime + # errors in the code. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + outputs = model.predict([lm_input_data, masked_position_data]) + logits = logits_model.predict([lm_input_data, masked_position_data]) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, num_predictions, vocab_size) + self.assertEqual(expected_output_shape, outputs.shape) + self.assertEqual(expected_output_shape, logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + calculated_softmax = softmax_model.predict(logits) + self.assertAllClose(outputs, calculated_softmax) + + def test_network_invocation_with_external_logits(self): + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + xformer_stack = transformer_encoder.TransformerEncoder( + vocab_size=vocab_size, + num_layers=1, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_attention_heads=4, + ) + test_network = self.create_network( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions, + xformer_stack=xformer_stack, + output='predictions') + logit_network = self.create_network( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions, + xformer_stack=xformer_stack, + output='logits') + logit_network.set_weights(test_network.get_weights()) + + # Create a model from the masked LM layer. + lm_input_tensor = tf.keras.Input(shape=(sequence_length, hidden_size)) + masked_lm_positions = tf.keras.Input( + shape=(num_predictions,), dtype=tf.int32) + output = test_network([lm_input_tensor, masked_lm_positions]) + logit_output = logit_network([lm_input_tensor, masked_lm_positions]) + + model = tf.keras.Model([lm_input_tensor, masked_lm_positions], output) + logits_model = tf.keras.Model(([lm_input_tensor, masked_lm_positions]), + logit_output) + + # Invoke the masked LM on some fake data to make sure there are no runtime + # errors in the code. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + outputs = model.predict([lm_input_data, masked_position_data]) + logits = logits_model.predict([lm_input_data, masked_position_data]) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, num_predictions, vocab_size) + self.assertEqual(expected_output_shape, outputs.shape) + self.assertEqual(expected_output_shape, logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + calculated_softmax = softmax_model.predict(logits) + self.assertAllClose(outputs, calculated_softmax) + + def test_network_invocation(self): + vocab_size = 100 + sequence_length = 32 + hidden_size = 64 + num_predictions = 21 + test_network = self.create_network( + vocab_size=vocab_size, + sequence_length=sequence_length, + hidden_size=hidden_size, + num_predictions=num_predictions) + + # Create a model from the masked LM layer. + lm_input_tensor = tf.keras.Input(shape=(sequence_length, hidden_size)) + masked_lm_positions = tf.keras.Input( + shape=(num_predictions,), dtype=tf.int32) + output = test_network([lm_input_tensor, masked_lm_positions]) + model = tf.keras.Model([lm_input_tensor, masked_lm_positions], output) + + # Invoke the masked LM on some fake data to make sure there are no runtime + # errors in the code. + batch_size = 3 + lm_input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, hidden_size)) + masked_position_data = np.random.randint( + 2, size=(batch_size, num_predictions)) + _ = model.predict([lm_input_data, masked_position_data]) + + def test_unknown_output_type_fails(self): + with self.assertRaisesRegex(ValueError, 'Unknown `output` value "bad".*'): + _ = self.create_network( + vocab_size=8, + sequence_length=8, + hidden_size=8, + num_predictions=8, + output='bad') + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling.py new file mode 100644 index 0000000..e2fc400 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling.py @@ -0,0 +1,95 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Span labeling network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +# pylint: disable=g-direct-tensorflow-import +from tensorflow.python.keras.engine import network + + +@tf.keras.utils.register_keras_serializable(package='Text') +class SpanLabeling(network.Network): + """Span labeling network head for BERT modeling. + + This network implements a simple single-span labeler based on a dense layer. + + Arguments: + input_width: The innermost dimension of the input tensor to this network. + activation: The activation, if any, for the dense layer in this network. + initializer: The intializer for the dense layer in this network. Defaults to + a Glorot uniform initializer. + output: The output style for this network. Can be either 'logits' or + 'predictions'. + """ + + def __init__(self, + input_width, + activation=None, + initializer='glorot_uniform', + output='logits', + **kwargs): + self._self_setattr_tracking = False + self._config = { + 'input_width': input_width, + 'activation': activation, + 'initializer': initializer, + 'output': output, + } + + sequence_data = tf.keras.layers.Input( + shape=(None, input_width), name='sequence_data', dtype=tf.float32) + + intermediate_logits = tf.keras.layers.Dense( + 2, # This layer predicts start location and end location. + activation=activation, + kernel_initializer=initializer, + name='predictions/transform/logits')( + sequence_data) + self.start_logits, self.end_logits = ( + tf.keras.layers.Lambda(self._split_output_tensor)(intermediate_logits)) + + start_predictions = tf.keras.layers.Activation(tf.nn.log_softmax)( + self.start_logits) + end_predictions = tf.keras.layers.Activation(tf.nn.log_softmax)( + self.end_logits) + + if output == 'logits': + output_tensors = [self.start_logits, self.end_logits] + elif output == 'predictions': + output_tensors = [start_predictions, end_predictions] + else: + raise ValueError( + ('Unknown `output` value "%s". `output` can be either "logits" or ' + '"predictions"') % output) + + super(SpanLabeling, self).__init__( + inputs=[sequence_data], outputs=output_tensors, **kwargs) + + def _split_output_tensor(self, tensor): + transposed_tensor = tf.transpose(tensor, [2, 0, 1]) + return tf.unstack(transposed_tensor) + + def get_config(self): + return self._config + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling_test.py new file mode 100644 index 0000000..8533a77 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/span_labeling_test.py @@ -0,0 +1,174 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for span_labeling network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.networks import span_labeling + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class SpanLabelingTest(keras_parameterized.TestCase): + + def test_network_creation(self): + """Validate that the Keras object can be created.""" + sequence_length = 15 + input_width = 512 + test_network = span_labeling.SpanLabeling( + input_width=input_width, output='predictions') + # Create a 3-dimensional input (the first dimension is implicit). + sequence_data = tf.keras.Input( + shape=(sequence_length, input_width), dtype=tf.float32) + start_outputs, end_outputs = test_network(sequence_data) + + # Validate that the outputs are of the expected shape. + expected_output_shape = [None, sequence_length] + self.assertEqual(expected_output_shape, start_outputs.shape.as_list()) + self.assertEqual(expected_output_shape, end_outputs.shape.as_list()) + + def test_network_invocation(self): + """Validate that the Keras object can be invoked.""" + sequence_length = 15 + input_width = 512 + test_network = span_labeling.SpanLabeling(input_width=input_width) + + # Create a 3-dimensional input (the first dimension is implicit). + sequence_data = tf.keras.Input( + shape=(sequence_length, input_width), dtype=tf.float32) + outputs = test_network(sequence_data) + model = tf.keras.Model(sequence_data, outputs) + + # Invoke the network as part of a Model. + batch_size = 3 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, input_width)) + start_outputs, end_outputs = model.predict(input_data) + + # Validate that the outputs are of the expected shape. + expected_output_shape = (batch_size, sequence_length) + self.assertEqual(expected_output_shape, start_outputs.shape) + self.assertEqual(expected_output_shape, end_outputs.shape) + + def test_network_invocation_with_internal_logit_output(self): + """Validate that the logit outputs are correct.""" + sequence_length = 15 + input_width = 512 + test_network = span_labeling.SpanLabeling( + input_width=input_width, output='predictions') + # Create a 3-dimensional input (the first dimension is implicit). + sequence_data = tf.keras.Input( + shape=(sequence_length, input_width), dtype=tf.float32) + output = test_network(sequence_data) + model = tf.keras.Model(sequence_data, output) + logit_model = tf.keras.Model( + test_network.inputs, + [test_network.start_logits, test_network.end_logits]) + + batch_size = 3 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, input_width)) + start_outputs, end_outputs = model.predict(input_data) + start_logits, end_logits = logit_model.predict(input_data) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, sequence_length) + self.assertEqual(expected_output_shape, start_outputs.shape) + self.assertEqual(expected_output_shape, end_outputs.shape) + self.assertEqual(expected_output_shape, start_logits.shape) + self.assertEqual(expected_output_shape, end_logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + start_softmax = softmax_model.predict(start_logits) + self.assertAllClose(start_outputs, start_softmax) + end_softmax = softmax_model.predict(end_logits) + self.assertAllClose(end_outputs, end_softmax) + + def test_network_invocation_with_external_logit_output(self): + """Validate that the logit outputs are correct.""" + sequence_length = 15 + input_width = 512 + test_network = span_labeling.SpanLabeling( + input_width=input_width, output='predictions') + logit_network = span_labeling.SpanLabeling( + input_width=input_width, output='logits') + logit_network.set_weights(test_network.get_weights()) + + # Create a 3-dimensional input (the first dimension is implicit). + sequence_data = tf.keras.Input( + shape=(sequence_length, input_width), dtype=tf.float32) + output = test_network(sequence_data) + logit_output = logit_network(sequence_data) + model = tf.keras.Model(sequence_data, output) + logit_model = tf.keras.Model(sequence_data, logit_output) + + batch_size = 3 + input_data = 10 * np.random.random_sample( + (batch_size, sequence_length, input_width)) + start_outputs, end_outputs = model.predict(input_data) + start_logits, end_logits = logit_model.predict(input_data) + + # Ensure that the tensor shapes are correct. + expected_output_shape = (batch_size, sequence_length) + self.assertEqual(expected_output_shape, start_outputs.shape) + self.assertEqual(expected_output_shape, end_outputs.shape) + self.assertEqual(expected_output_shape, start_logits.shape) + self.assertEqual(expected_output_shape, end_logits.shape) + + # Ensure that the logits, when softmaxed, create the outputs. + input_tensor = tf.keras.Input(expected_output_shape[1:]) + output_tensor = tf.keras.layers.Activation(tf.nn.log_softmax)(input_tensor) + softmax_model = tf.keras.Model(input_tensor, output_tensor) + + start_softmax = softmax_model.predict(start_logits) + self.assertAllClose(start_outputs, start_softmax) + end_softmax = softmax_model.predict(end_logits) + self.assertAllClose(end_outputs, end_softmax) + + def test_serialize_deserialize(self): + # Create a network object that sets all of its config options. + network = span_labeling.SpanLabeling( + input_width=128, + activation='relu', + initializer='zeros', + output='predictions') + + # Create another network object from the first object's config. + new_network = span_labeling.SpanLabeling.from_config(network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(network.get_config(), new_network.get_config()) + + def test_unknown_output_type_fails(self): + with self.assertRaisesRegex(ValueError, 'Unknown `output` value "bad".*'): + _ = span_labeling.SpanLabeling(input_width=10, output='bad') + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder.py new file mode 100644 index 0000000..8b0bd40 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder.py @@ -0,0 +1,191 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Transformer-based text encoder network.""" +# pylint: disable=g-classes-have-attributes +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras.engine import network # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations +from official.nlp.modeling import layers + + +@tf.keras.utils.register_keras_serializable(package='Text') +class TransformerEncoder(network.Network): + """Bi-directional Transformer-based encoder network. + + This network implements a bi-directional Transformer-based encoder as + described in "BERT: Pre-training of Deep Bidirectional Transformers for + Language Understanding" (https://arxiv.org/abs/1810.04805). It includes the + embedding lookups and transformer layers, but not the masked language model + or classification task networks. + + The default values for this object are taken from the BERT-Base implementation + in "BERT: Pre-training of Deep Bidirectional Transformers for Language + Understanding". + + Arguments: + vocab_size: The size of the token vocabulary. + hidden_size: The size of the transformer hidden layers. + num_layers: The number of transformer layers. + num_attention_heads: The number of attention heads for each transformer. The + hidden size must be divisible by the number of attention heads. + sequence_length: The sequence length that this encoder expects. If None, the + sequence length is dynamic; if an integer, the encoder will require + sequences padded to this length. + max_sequence_length: The maximum sequence length that this encoder can + consume. If None, max_sequence_length uses the value from sequence length. + This determines the variable shape for positional embeddings. + type_vocab_size: The number of types that the 'type_ids' input can take. + intermediate_size: The intermediate size for the transformer layers. + activation: The activation to use for the transformer layers. + dropout_rate: The dropout rate to use for the transformer layers. + attention_dropout_rate: The dropout rate to use for the attention layers + within the transformer layers. + initializer: The initialzer to use for all weights in this encoder. + return_all_encoder_outputs: Whether to output sequence embedding outputs of + all encoder transformer layers. + """ + + def __init__(self, + vocab_size, + hidden_size=768, + num_layers=12, + num_attention_heads=12, + sequence_length=512, + max_sequence_length=None, + type_vocab_size=16, + intermediate_size=3072, + activation=activations.gelu, + dropout_rate=0.1, + attention_dropout_rate=0.1, + initializer=tf.keras.initializers.TruncatedNormal(stddev=0.02), + return_all_encoder_outputs=False, + **kwargs): + activation = tf.keras.activations.get(activation) + initializer = tf.keras.initializers.get(initializer) + + if not max_sequence_length: + max_sequence_length = sequence_length + self._self_setattr_tracking = False + self._config_dict = { + 'vocab_size': vocab_size, + 'hidden_size': hidden_size, + 'num_layers': num_layers, + 'num_attention_heads': num_attention_heads, + 'sequence_length': sequence_length, + 'max_sequence_length': max_sequence_length, + 'type_vocab_size': type_vocab_size, + 'intermediate_size': intermediate_size, + 'activation': tf.keras.activations.serialize(activation), + 'dropout_rate': dropout_rate, + 'attention_dropout_rate': attention_dropout_rate, + 'initializer': tf.keras.initializers.serialize(initializer), + 'return_all_encoder_outputs': return_all_encoder_outputs, + } + + word_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_word_ids') + mask = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_mask') + type_ids = tf.keras.layers.Input( + shape=(sequence_length,), dtype=tf.int32, name='input_type_ids') + + self._embedding_layer = layers.OnDeviceEmbedding( + vocab_size=vocab_size, + embedding_width=hidden_size, + initializer=initializer, + name='word_embeddings') + word_embeddings = self._embedding_layer(word_ids) + + # Always uses dynamic slicing for simplicity. + self._position_embedding_layer = layers.PositionEmbedding( + initializer=initializer, + use_dynamic_slicing=True, + max_sequence_length=max_sequence_length) + position_embeddings = self._position_embedding_layer(word_embeddings) + + type_embeddings = ( + layers.OnDeviceEmbedding( + vocab_size=type_vocab_size, + embedding_width=hidden_size, + initializer=initializer, + use_one_hot=True, + name='type_embeddings')(type_ids)) + + embeddings = tf.keras.layers.Add()( + [word_embeddings, position_embeddings, type_embeddings]) + embeddings = ( + tf.keras.layers.LayerNormalization( + name='embeddings/layer_norm', + axis=-1, + epsilon=1e-12, + dtype=tf.float32)(embeddings)) + embeddings = ( + tf.keras.layers.Dropout(rate=dropout_rate)(embeddings)) + + self._transformer_layers = [] + data = embeddings + attention_mask = layers.SelfAttentionMask()([data, mask]) + encoder_outputs = [] + for i in range(num_layers): + layer = layers.Transformer( + num_attention_heads=num_attention_heads, + intermediate_size=intermediate_size, + intermediate_activation=activation, + dropout_rate=dropout_rate, + attention_dropout_rate=attention_dropout_rate, + kernel_initializer=initializer, + name='transformer/layer_%d' % i) + self._transformer_layers.append(layer) + data = layer([data, attention_mask]) + encoder_outputs.append(data) + + first_token_tensor = ( + tf.keras.layers.Lambda(lambda x: tf.squeeze(x[:, 0:1, :], axis=1))( + encoder_outputs[-1])) + cls_output = tf.keras.layers.Dense( + units=hidden_size, + activation='tanh', + kernel_initializer=initializer, + name='pooler_transform')( + first_token_tensor) + + if return_all_encoder_outputs: + outputs = [encoder_outputs, cls_output] + else: + outputs = [encoder_outputs[-1], cls_output] + + super(TransformerEncoder, self).__init__( + inputs=[word_ids, mask, type_ids], outputs=outputs, **kwargs) + + def get_embedding_table(self): + return self._embedding_layer.embeddings + + def get_config(self): + return self._config_dict + + @property + def transformer_layers(self): + """List of Transformer layers in the encoder.""" + return self._transformer_layers + + @classmethod + def from_config(cls, config, custom_objects=None): + return cls(**config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder_test.py new file mode 100644 index 0000000..506ea1e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/modeling/networks/transformer_encoder_test.py @@ -0,0 +1,203 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for transformer-based text encoder network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.nlp.modeling.networks import transformer_encoder + + +# This decorator runs the test in V1, V2-Eager, and V2-Functional mode. It +# guarantees forward compatibility of this code for the V2 switchover. +@keras_parameterized.run_all_keras_modes +class TransformerEncoderTest(keras_parameterized.TestCase): + + def tearDown(self): + super(TransformerEncoderTest, self).tearDown() + tf.keras.mixed_precision.experimental.set_policy("float32") + + def test_network_creation(self): + hidden_size = 32 + sequence_length = 21 + # Create a small TransformerEncoder for testing. + test_network = transformer_encoder.TransformerEncoder( + vocab_size=100, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # The default output dtype is float32. + self.assertAllEqual(tf.float32, data.dtype) + self.assertAllEqual(tf.float32, pooled.dtype) + + def test_all_encoder_outputs_network_creation(self): + hidden_size = 32 + sequence_length = 21 + # Create a small TransformerEncoder for testing. + test_network = transformer_encoder.TransformerEncoder( + vocab_size=100, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3, + return_all_encoder_outputs=True) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + all_encoder_outputs, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertLen(all_encoder_outputs, 3) + for data in all_encoder_outputs: + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # The default output dtype is float32. + self.assertAllEqual(tf.float32, all_encoder_outputs[-1].dtype) + self.assertAllEqual(tf.float32, pooled.dtype) + + def test_network_creation_with_float16_dtype(self): + hidden_size = 32 + sequence_length = 21 + tf.keras.mixed_precision.experimental.set_policy("mixed_float16") + # Create a small TransformerEncoder for testing. + test_network = transformer_encoder.TransformerEncoder( + vocab_size=100, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + expected_data_shape = [None, sequence_length, hidden_size] + expected_pooled_shape = [None, hidden_size] + self.assertAllEqual(expected_data_shape, data.shape.as_list()) + self.assertAllEqual(expected_pooled_shape, pooled.shape.as_list()) + + # If float_dtype is set to float16, the data output is float32 (from a layer + # norm) and pool output should be float16. + self.assertAllEqual(tf.float32, data.dtype) + self.assertAllEqual(tf.float16, pooled.dtype) + + def test_network_invocation(self): + hidden_size = 32 + sequence_length = 21 + vocab_size = 57 + num_types = 7 + # Create a small TransformerEncoder for testing. + test_network = transformer_encoder.TransformerEncoder( + vocab_size=vocab_size, + hidden_size=hidden_size, + sequence_length=sequence_length, + num_attention_heads=2, + num_layers=3, + type_vocab_size=num_types) + self.assertTrue( + test_network._position_embedding_layer._use_dynamic_slicing) + # Create the inputs (note that the first dimension is implicit). + word_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + mask = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + type_ids = tf.keras.Input(shape=(sequence_length,), dtype=tf.int32) + data, pooled = test_network([word_ids, mask, type_ids]) + + # Create a model based off of this network: + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + + # Invoke the model. We can't validate the output data here (the model is too + # complex) but this will catch structural runtime errors. + batch_size = 3 + word_id_data = np.random.randint( + vocab_size, size=(batch_size, sequence_length)) + mask_data = np.random.randint(2, size=(batch_size, sequence_length)) + type_id_data = np.random.randint( + num_types, size=(batch_size, sequence_length)) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + # Creates a TransformerEncoder with max_sequence_length != sequence_length + max_sequence_length = 128 + test_network = transformer_encoder.TransformerEncoder( + vocab_size=vocab_size, + hidden_size=hidden_size, + sequence_length=sequence_length, + max_sequence_length=max_sequence_length, + num_attention_heads=2, + num_layers=3, + type_vocab_size=num_types) + self.assertTrue(test_network._position_embedding_layer._use_dynamic_slicing) + model = tf.keras.Model([word_ids, mask, type_ids], [data, pooled]) + _ = model.predict([word_id_data, mask_data, type_id_data]) + + def test_serialize_deserialize(self): + tf.keras.mixed_precision.experimental.set_policy("mixed_float16") + # Create a network object that sets all of its config options. + kwargs = dict( + vocab_size=100, + hidden_size=32, + num_layers=3, + num_attention_heads=2, + sequence_length=21, + max_sequence_length=21, + type_vocab_size=12, + intermediate_size=1223, + activation="relu", + dropout_rate=0.05, + attention_dropout_rate=0.22, + initializer="glorot_uniform", + return_all_encoder_outputs=False) + network = transformer_encoder.TransformerEncoder(**kwargs) + + expected_config = dict(kwargs) + expected_config["activation"] = tf.keras.activations.serialize( + tf.keras.activations.get(expected_config["activation"])) + expected_config["initializer"] = tf.keras.initializers.serialize( + tf.keras.initializers.get(expected_config["initializer"])) + self.assertEqual(network.get_config(), expected_config) + + # Create another network object from the first object's config. + new_network = transformer_encoder.TransformerEncoder.from_config( + network.get_config()) + + # Validate that the config can be forced to JSON. + _ = new_network.to_json() + + # If the serialization was successful, the new config should match the old. + self.assertAllEqual(network.get_config(), new_network.get_config()) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/README.md new file mode 100644 index 0000000..1664bd3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/README.md @@ -0,0 +1,167 @@ +# Multi-doc News Headline Generation Model: NHNet + +This repository contains TensorFlow 2.x implementation for NHNet [[1]](#1) as +well as instructions for producing the data we described in the paper. + +## Introduction + +NHNet is a multi-doc news headline generation model. It extends a standard +Transformer-based encoder-decoder model to multi-doc setting and relies on an +article-level attention layer to capture information common to most (if not all) +input news articles in a news cluster or story, and provide robustness against +potential outliers in the input due to clustering quality. + +Our academic paper [[1]](#1) which describes NHNet in detail can be found here: +https://arxiv.org/abs/2001.09386. + +## Dataset + +**Raw Data:** One can [download](https://github.com/google-research-datasets/NewSHead) +our multi-doc headline dataset which +contains 369,940 news stories and 932,571 unique URLs. We split these stories +into train (359,940 stories), validation (5,000 stories) and test set (5,000 +stories) by timestamp. + +More information, please checkout: +https://github.com/google-research-datasets/NewSHead + +### Crawling + +Unfortunately, we will not be able to release the pre-processed dataset that is +exactly used in the paper. Users need to crawl the URLs and the recommended +pre-processing is using an open-sourced library to download and parse the news +content including title and leading paragraphs. For ease of this process, we +provide a config of [news-please](https://github.com/fhamborg/news-please) that +will crawl and extract news articles on a local machine. + +First, install the `news-please` CLI (requires python 3.x) +```shell +$ pip3 install news-please +``` + +Next, run the crawler with our provided config and URL list + +```shell +# Sets to path of the downloaded data folder +$ DATA_FOLDER=/path/to/downloaded_dataset + +# Uses CLI interface to crawl +$ news-please -c $DATA_FOLDER/news_please +``` +By default, it will store crawled +articles under `/tmp/nhnet/`. To terminate the process press `CTRL+C`. + +The crawling may take some days (48 hours in our test) and it depends on the +network environment and #threads set in the config. As the crawling tool won't +stop automatically, it is not straightforward to check the progress. We suggest +to terminate the job if there are no new articles crawled in a short time period +(e.g., 10 minutes) by running +```shell +$ find /tmp/nhnet -type f | wc -l +``` +Please note that it is expected that some URLs are no longer available on the +web as time goes by. + +### Data Processing + +Given the crawled articles under `/tmp/nhnet/`, we would like to transform these +textual articles into a set of `TFRecord` files containing serialized +tensorflow.Example protocol buffers, with feature keys following the BERT +[[2]](#2) tradition but is extended for multiple text segments. We will later +use these processed TFRecords for training and evaluation. + +To do this, please first download a [BERT pretrained checkpoint](https://github.com/tensorflow/models/tree/master/official/nlp/bert#access-to-pretrained-checkpoints) +(`BERT-Base,Uncased` preferred for efficiency) and decompress the `tar.gz` file. +We need the vocabulary file and later use the checkpoint for NHNet +initialization. + +Next, we can run the following data preprocess script which may take a few hours + to read files and tokenize article content. + + +```shell +# Recall that we use DATA_FOLDER=/path/to/downloaded_dataset +$ python3 raw_data_preprocess.py \ + -crawled_articles=/tmp/nhnet \ + -vocab=/path/to/bert_checkpoint/vocab.txt \ + -do_lower_case=True \ + -len_title=15 \ + -len_passage=200 \ + -max_num_articles=5 \ + -data_folder=$DATA_FOLDER +``` + +This python script will export processed train/valid/eval files under +`$DATA_FOLDER/processed/`. + +## Training + +Please first install TensorFlow 2 and Tensorflow Model Garden following the +[requirments section](https://github.com/tensorflow/models/tree/master/official#requirements). + +### CPU/GPU +```shell +$ python3 trainer.py \ + --mode=train_and_eval \ + --vocab=/path/to/bert_checkpoint/vocab.txt \ + --init_checkpoint=/path/to/bert_checkpoint/bert_model.ckpt \ + --params_override='init_from_bert2bert=false' \ + --train_file_pattern=$DATA_FOLDER/processed/train.tfrecord* \ + --model_dir=/path/to/output/model \ + --len_title=15 \ + --len_passage=200 \ + --max_num_articles=5 \ + --model_type=nhnet \ + --train_batch_size=16 \ + --train_steps=10000 \ + --steps_per_loop=1 \ + --checkpoint_interval=100 +``` + +### TPU +```shell +$ python3 trainer.py \ + --mode=train_and_eval \ + --vocab=/path/to/bert_checkpoint/vocab.txt \ + --init_checkpoint=/path/to/bert_checkpoint/bert_model.ckpt \ + --params_override='init_from_bert2bert=false' \ + --train_file_pattern=$DATA_FOLDER/processed/train.tfrecord* \ + --model_dir=/path/to/output/model \ + --len_title=15 \ + --len_passage=200 \ + --max_num_articles=5 \ + --model_type=nhnet \ + --train_batch_size=1024 \ + --train_steps=10000 \ + --steps_per_loop=1000 \ + --checkpoint_interval=1000 \ + --distribution_strategy=tpu \ + --tpu=grpc://${TPU_IP_ADDRESS}:8470 +``` +In the paper, we train more than 10k steps with batch size set as 1024 with +TPU-v3-64. + +Note that, `trainer.py` also supports `train` mode and continuous `eval` mode. +For large scale TPU training, we recommend the have a process running the +`train` mode and another process running the continuous `eval` mode which can +runs on GPUs. +This is the setting we commonly used for large-scale experiments, because `eval` +will be non-blocking to the expensive training load. + +### Metrics +**Note: the metrics reported by `evaluation.py` are approximated on +word-piece level rather than the real string tokens. Some metrics like BLEU +scores can be off.** + +We will release a colab to evaluate results on string-level soon. + +## References + +[1] Xiaotao Gu, Yuning Mao, Jiawei Han, Jialu Liu, You Wu, Cong +Yu, Daniel Finnie, Hongkun Yu, Jiaqi Zhai and Nicholas Zukoski "Generating +Representative Headlines for News Stories": https://arxiv.org/abs/2001.09386. +World Wide Web Conf. (WWW’2020). + +[2] Jacob Devlin, Ming-Wei Chang, Kenton Lee and Kristina +Toutanova "BERT: Pre-training of Deep Bidirectional Transformers for Language +Understanding": https://arxiv.org/abs/1810.04805. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs.py new file mode 100644 index 0000000..41cfa61 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs.py @@ -0,0 +1,107 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common NHNet/Bert2Bert configuration.""" + +from typing import List, Text + +import dataclasses + +from official.modeling.hyperparams import base_config + + +@dataclasses.dataclass +class BERT2BERTConfig(base_config.Config): + """High-level configurations for BERT2BERT model. + + These include parameters that are not directly related to the experiment, + e.g. encoder, decoder, prediction, training, etc. + """ + vocab_size: int = 30522 + hidden_size: int = 768 + num_hidden_layers: int = 12 + num_attention_heads: int = 12 + intermediate_size: int = 3072 + hidden_act: str = "gelu" + hidden_dropout_prob: float = 0.1 + attention_probs_dropout_prob: float = 0.1 + max_position_embeddings: int = 512 + type_vocab_size: int = 2 + initializer_range: float = 0.02 + decoder_intermediate_size: int = 3072 + num_decoder_attn_heads: int = 12 + num_decoder_layers: int = 12 + + label_smoothing: float = 0.1 + learning_rate: float = 0.05 + learning_rate_warmup_steps: int = 20000 + optimizer: str = "Adam" + adam_beta1: float = 0.9 + adam_beta2: float = 0.997 + adam_epsilon: float = 1e-09 + + # predict params + beam_size: int = 5 + alpha: float = 0.6 + initializer_gain: float = 1.0 + use_cache: bool = True + + # input params + input_sharding: bool = False + input_data_not_padded: bool = False + pad_token_id: int = 0 + end_token_id: int = 102 + start_token_id: int = 101 + + +@dataclasses.dataclass +class NHNetConfig(BERT2BERTConfig): + """High-level configurations for NHNet model. + + These include parameters that are not directly related to the experiment, + e.g. encoder, decoder, prediction, training, etc. + """ + multi_channel_cross_attention: bool = True + passage_list: List[Text] = dataclasses.field( + default_factory=lambda: [chr(ord("b") + i) for i in range(5)]) + + # Initialization method. + # If init_from_bert2bert is false, we assume the checkpoint is from BERT + # pretraining and only encoder and self-attention variables are initialized. + init_from_bert2bert: bool = True + + +UNITTEST_CONFIG = { + "attention_probs_dropout_prob": 0.0, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.0, + "hidden_size": 16, + "initializer_range": 0.02, + "intermediate_size": 32, + "max_position_embeddings": 128, + "num_attention_heads": 2, + "num_hidden_layers": 1, + "type_vocab_size": 2, + "vocab_size": 30522, + "initializer_gain": 1.0, + "decoder_intermediate_size": 32, + "num_decoder_attn_heads": 2, + "num_decoder_layers": 1, + "use_cache": True, + "input_data_not_padded": False, + "pad_token_id": 0, + "end_token_id": 102, + "start_token_id": 101, +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs_test.py new file mode 100644 index 0000000..2b855ec --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/configs_test.py @@ -0,0 +1,121 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for configs.""" + +import tensorflow as tf +from official.nlp.nhnet import configs + +BERT2BERT_CONFIG = { + "vocab_size": 30522, + "hidden_size": 768, + "num_hidden_layers": 12, + "num_attention_heads": 12, + "intermediate_size": 3072, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "attention_probs_dropout_prob": 0.1, + "max_position_embeddings": 512, + "type_vocab_size": 2, + "initializer_range": 0.02, + + # model params + "decoder_intermediate_size": 3072, + "num_decoder_attn_heads": 12, + "num_decoder_layers": 12, + + # training params + "label_smoothing": 0.1, + "learning_rate": 0.05, + "learning_rate_warmup_steps": 20000, + "optimizer": "Adam", + "adam_beta1": 0.9, + "adam_beta2": 0.997, + "adam_epsilon": 1e-09, + + # predict params + "beam_size": 5, + "alpha": 0.6, + "initializer_gain": 1.0, + "use_cache": True, + + # input params + "input_sharding": False, + "input_data_not_padded": False, + "pad_token_id": 0, + "end_token_id": 102, + "start_token_id": 101, +} + +NHNET_CONFIG = { + "vocab_size": 30522, + "hidden_size": 768, + "num_hidden_layers": 12, + "num_attention_heads": 12, + "intermediate_size": 3072, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "attention_probs_dropout_prob": 0.1, + "max_position_embeddings": 512, + "type_vocab_size": 2, + "initializer_range": 0.02, + + # model params + "decoder_intermediate_size": 3072, + "num_decoder_attn_heads": 12, + "num_decoder_layers": 12, + "multi_channel_cross_attention": True, + + # training params + "label_smoothing": 0.1, + "learning_rate": 0.05, + "learning_rate_warmup_steps": 20000, + "optimizer": "Adam", + "adam_beta1": 0.9, + "adam_beta2": 0.997, + "adam_epsilon": 1e-09, + + # predict params + "beam_size": 5, + "alpha": 0.6, + "initializer_gain": 1.0, + "use_cache": True, + + # input params + "passage_list": ["b", "c", "d", "e", "f"], + "input_sharding": False, + "input_data_not_padded": False, + "pad_token_id": 0, + "end_token_id": 102, + "start_token_id": 101, + + "init_from_bert2bert": True, +} + + +class ConfigsTest(tf.test.TestCase): + + def test_configs(self): + cfg = configs.BERT2BERTConfig() + cfg.validate() + self.assertEqual(cfg.as_dict(), BERT2BERT_CONFIG) + + def test_nhnet_config(self): + cfg = configs.NHNetConfig() + cfg.validate() + self.assertEqual(cfg.as_dict(), NHNET_CONFIG) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder.py new file mode 100644 index 0000000..18960ed --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder.py @@ -0,0 +1,526 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Transformer decoder that mimics a BERT encoder, to load BERT checkpoints.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf +from official.modeling import tf_utils +from official.nlp.modeling import layers +from official.nlp.nhnet import multi_channel_attention +from official.nlp.transformer import model_utils as transformer_utils + + +class TransformerDecoderBlock(tf.keras.layers.Layer): + """Single transformer layer for decoder. + + It has three sub-layers: + (1) a multi-head self-attention mechanism. + (2) a encoder-decoder attention. + (3) a positionwise fully connected feed-forward network. + """ + + def __init__(self, + hidden_size=768, + num_attention_heads=12, + intermediate_size=3072, + intermediate_activation="gelu", + hidden_dropout_prob=0.0, + attention_probs_dropout_prob=0.0, + initializer_range=0.02, + multi_channel_cross_attention=False, + **kwargs): + super(TransformerDecoderBlock, self).__init__(**kwargs) + self.hidden_size = hidden_size + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.intermediate_activation = tf_utils.get_activation( + intermediate_activation) + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.multi_channel_cross_attention = multi_channel_cross_attention + self._kernel_initializer = tf.keras.initializers.TruncatedNormal( + stddev=initializer_range) + self._bias_initializer = tf.keras.initializers.get("zeros") + if self.multi_channel_cross_attention: + self._cross_attention_cls = multi_channel_attention.MultiChannelAttention + else: + self._cross_attention_cls = layers.MultiHeadAttention + + if self.hidden_size % self.num_attention_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (self.hidden_size, self.num_attention_heads)) + self.attention_head_size = int(self.hidden_size / self.num_attention_heads) + + def build(self, unused_input_shapes): + # Self attention. + self.self_attention = layers.CachedAttention( + num_heads=self.num_attention_heads, + head_size=self.attention_head_size, + dropout_rate=self.attention_probs_dropout_prob, + kernel_initializer=self._kernel_initializer, + name="self_attention") + self.self_attention_output_dense = layers.DenseEinsum( + output_shape=self.hidden_size, + num_summed_dimensions=2, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + name="self_attention_output") + self.self_attention_dropout = tf.keras.layers.Dropout( + rate=self.hidden_dropout_prob) + self.self_attention_layer_norm = ( + tf.keras.layers.LayerNormalization( + name="self_attention_layer_norm", axis=-1, epsilon=1e-12)) + # Encoder-decoder attention. + self.encdec_attention = self._cross_attention_cls( + num_heads=self.num_attention_heads, + head_size=self.attention_head_size, + dropout_rate=self.attention_probs_dropout_prob, + kernel_initializer=self._kernel_initializer, + name="attention/encdec") + self.encdec_attention_output_dense = layers.DenseEinsum( + output_shape=self.hidden_size, + num_summed_dimensions=2, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + name="attention/encdec_output") + self.encdec_attention_dropout = tf.keras.layers.Dropout( + rate=self.hidden_dropout_prob) + self.encdec_attention_layer_norm = ( + tf.keras.layers.LayerNormalization( + name="attention/encdec_output_layer_norm", axis=-1, epsilon=1e-12)) + + # Feed-forward projection. + self.intermediate_dense = layers.DenseEinsum( + output_shape=self.intermediate_size, + activation=None, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + name="intermediate") + self.intermediate_activation_layer = tf.keras.layers.Activation( + self.intermediate_activation) + self.output_dense = layers.DenseEinsum( + output_shape=self.hidden_size, + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + name="output") + self.output_dropout = tf.keras.layers.Dropout(rate=self.hidden_dropout_prob) + self.output_layer_norm = tf.keras.layers.LayerNormalization( + name="output_layer_norm", axis=-1, epsilon=1e-12) + super(TransformerDecoderBlock, self).build(unused_input_shapes) + + def common_layers_with_encoder(self): + """Gets layer objects that can make a Transformer encoder block.""" + return [ + self.self_attention, self.self_attention_output_dense, + self.self_attention_layer_norm, self.intermediate_dense, + self.output_dense, self.output_layer_norm + ] + + def call(self, inputs, cache=None, decode_loop_step=None): + if self.multi_channel_cross_attention: + if len(inputs) != 5: + raise ValueError( + "TransformerDecoderBlock must have 5 inputs, when it uses " + "multi_channel_cross_attention. But it got: %d" % len(inputs)) + elif len(inputs) != 4: + raise ValueError( + "TransformerDecoderBlock must have 4 inputs, but it got: %d" % + len(inputs)) + input_tensor, memory, attention_mask, self_attention_mask = inputs[:4] + if cache is None: + self_attention_inputs = [input_tensor, input_tensor, self_attention_mask] + else: + self_attention_inputs = [ + input_tensor, input_tensor, self_attention_mask, cache + ] + self_attention_output, cache = self.self_attention( + self_attention_inputs, decode_loop_step=decode_loop_step) + self_attention_output = self.self_attention_output_dense( + self_attention_output) + self_attention_output = self.self_attention_dropout(self_attention_output) + self_attention_output = self.self_attention_layer_norm( + input_tensor + self_attention_output) + + cross_attn_inputs = [self_attention_output, memory, attention_mask] + if self.multi_channel_cross_attention: + # Accesses the 5-th input tensor for the doc-attention probabilities. + cross_attn_inputs.append(inputs[-1]) + attention_output = self.encdec_attention(cross_attn_inputs) + attention_output = self.encdec_attention_output_dense(attention_output) + attention_output = self.encdec_attention_dropout(attention_output) + attention_output = self.encdec_attention_layer_norm(self_attention_output + + attention_output) + + intermediate_output = self.intermediate_dense(attention_output) + intermediate_output = self.intermediate_activation_layer( + intermediate_output) + layer_output = self.output_dense(intermediate_output) + layer_output = self.output_dropout(layer_output) + layer_output = self.output_layer_norm(layer_output + attention_output) + return layer_output, cache + + +class TransformerDecoder(tf.keras.layers.Layer): + """Transformer decoder stack.""" + + def __init__(self, + num_hidden_layers=12, + hidden_size=768, + num_attention_heads=12, + intermediate_size=3072, + intermediate_activation="gelu", + hidden_dropout_prob=0.0, + attention_probs_dropout_prob=0.0, + initializer_range=0.02, + attend_to_last_layer=True, + multi_channel_cross_attention=False, + **kwargs): + super(TransformerDecoder, self).__init__(**kwargs) + self.num_hidden_layers = num_hidden_layers + self.hidden_size = hidden_size + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.intermediate_activation = tf_utils.get_activation( + intermediate_activation) + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.initializer_range = initializer_range + self.attend_to_last_layer = attend_to_last_layer + self.multi_channel_cross_attention = multi_channel_cross_attention + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.layers = [] + for i in range(self.num_hidden_layers): + self.layers.append( + TransformerDecoderBlock( + hidden_size=self.hidden_size, + num_attention_heads=self.num_attention_heads, + intermediate_size=self.intermediate_size, + intermediate_activation=self.intermediate_activation, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + initializer_range=self.initializer_range, + multi_channel_cross_attention=self.multi_channel_cross_attention, + name=("layer_%d" % i))) + super(TransformerDecoder, self).build(unused_input_shapes) + + def call(self, inputs, cache=None, decode_loop_step=None): + """Return the output of the decoder layer stacks. + + Args: + inputs: A dictionary of inputs. `decoder_inputs` is a tf.int32 tensor for + input ids. `encoder_outputs` is a list of tensors with shape + [batch_size, input_length, hidden_size]. `self_attention_mask` is the + bias for decoder self-attention layer. [1, 1, target_length, + target_length]. `attention_mask` is the bias for encoder-decoder + attention layer, [batch_size, 1, 1, input_length]. + cache: A dictionary of cache tensors, including key & value attentions. + decode_loop_step: an integer to indicate the step inside a decoding loop. + + Returns: + Output of decoder layer stack. + float32 tensor with shape [batch_size, target_length, hidden_size] + """ + decoder_inputs = inputs["decoder_inputs"] + encoder_outputs = inputs["encoder_outputs"] + self_attention_mask = inputs["self_attention_mask"] + attention_mask = inputs["attention_mask"] + decoder_shape = tf_utils.get_shape_list(decoder_inputs, expected_rank=3) + batch_size = decoder_shape[0] + decoder_length = decoder_shape[1] + + def _to_bert_self_attention_mask(matrix): + """[1, 1, target_len, target_len] -> [bs, target_len, target_len].""" + matrix = tf.squeeze(matrix, axis=[1]) + matrix = tf.tile(matrix, [batch_size, 1, 1]) + return matrix + + def _to_bert_encdec_attention_mask(matrix): + """[bs, 1, 1, input_len] -> [bs, target_len, input_len].""" + if self.multi_channel_cross_attention: + matrix = tf.expand_dims(matrix, axis=2) + matrix = tf.tile(matrix, [1, 1, decoder_length, 1]) + else: + matrix = tf.squeeze(matrix, axis=[1]) + matrix = tf.tile(matrix, [1, decoder_length, 1]) + return matrix + + attention_mask = _to_bert_encdec_attention_mask(attention_mask) + self_attention_mask = _to_bert_self_attention_mask(self_attention_mask) + + output_tensor = decoder_inputs + for layer_idx in range(self.num_hidden_layers): + if self.attend_to_last_layer: + memory = encoder_outputs[-1] + else: + memory = encoder_outputs[layer_idx] + if self.multi_channel_cross_attention: + transformer_inputs = [ + output_tensor, memory, attention_mask, self_attention_mask, + inputs["doc_attention_probs"] + ] + else: + transformer_inputs = [ + output_tensor, memory, attention_mask, self_attention_mask + ] + # Gets the cache for decoding. + if cache is None: + output_tensor, _ = self.layers[layer_idx](transformer_inputs) + else: + cache_layer_idx = str(layer_idx) + output_tensor, cache[cache_layer_idx] = self.layers[layer_idx]( + transformer_inputs, + cache=cache[cache_layer_idx], + decode_loop_step=decode_loop_step) + return output_tensor, cache + + +def get_attention_bias(input_tensor, + bias_type, + padding_value=0, + max_length=None): + """A helper function to get various attention bias tensors.""" + if bias_type not in ("single_cross", "multi_cross", "decoder_self"): + raise ValueError("Invalid attention bias type: %s" % bias_type) + if bias_type == "single_cross": + length = tf_utils.get_shape_list(input_tensor, expected_rank=2)[1] + bias = transformer_utils.get_padding_bias( + input_tensor, padding_value=padding_value) + elif bias_type == "multi_cross": + length = tf_utils.get_shape_list(input_tensor, expected_rank=3)[2] + padding = transformer_utils.get_padding( + input_tensor, padding_value=padding_value) + bias = padding * -1e9 + else: + if max_length is not None: + length = max_length + else: + length = tf_utils.get_shape_list(input_tensor, expected_rank=2)[1] + bias = transformer_utils.get_decoder_self_attention_bias(length) + + return tf.where(bias < 0, tf.zeros_like(bias), tf.ones_like(bias)) + + +class AttentionBias(tf.keras.layers.Layer): + + def __init__(self, bias_type, **kwargs): + super(AttentionBias, self).__init__(**kwargs) + self.bias_type = bias_type + + def call(self, inputs): + return get_attention_bias(inputs, self.bias_type) + + +class EmbeddingPostprocessor(tf.keras.layers.Layer): + """Performs various post-processing on a word embedding tensor.""" + + def __init__(self, + use_type_embeddings=False, + token_type_vocab_size=None, + use_position_embeddings=True, + max_position_embeddings=512, + dropout_prob=0.0, + initializer_range=0.02, + initializer=None, + **kwargs): + super(EmbeddingPostprocessor, self).__init__(**kwargs) + self.use_type_embeddings = use_type_embeddings + self.token_type_vocab_size = token_type_vocab_size + self.use_position_embeddings = use_position_embeddings + self.max_position_embeddings = max_position_embeddings + self.dropout_prob = dropout_prob + self.initializer_range = initializer_range + + if not initializer: + self.initializer = tf.keras.initializers.TruncatedNormal( + stddev=initializer_range) + else: + self.initializer = initializer + + if self.use_type_embeddings and not self.token_type_vocab_size: + raise ValueError("If `use_type_embeddings` is True, then " + "`token_type_vocab_size` must be specified.") + + def build(self, input_shapes): + """Implements build() for the layer.""" + (word_embeddings_shape, _) = input_shapes + width = word_embeddings_shape.as_list()[-1] + self.type_embeddings = None + if self.use_type_embeddings: + self.type_embeddings = self.add_weight( + "type_embeddings", + shape=[self.token_type_vocab_size, width], + initializer=tf.keras.initializers.TruncatedNormal( + stddev=self.initializer_range), + dtype=self.dtype) + + self.position_embeddings = None + if self.use_position_embeddings: + self.position_embeddings = self.add_weight( + "position_embeddings", + shape=[self.max_position_embeddings, width], + initializer=tf.keras.initializers.TruncatedNormal( + stddev=self.initializer_range), + dtype=self.dtype) + + self.output_layer_norm = tf.keras.layers.LayerNormalization( + name="layer_norm", axis=-1, epsilon=1e-12, dtype=tf.float32) + self.output_dropout = tf.keras.layers.Dropout( + rate=self.dropout_prob, dtype=tf.float32) + super(EmbeddingPostprocessor, self).build(input_shapes) + + def __call__(self, word_embeddings, token_type_ids=None, **kwargs): + inputs = tf_utils.pack_inputs([word_embeddings, token_type_ids]) + return super(EmbeddingPostprocessor, self).__call__(inputs, **kwargs) + + def call(self, inputs): + """Implements call() for the layer.""" + unpacked_inputs = tf_utils.unpack_inputs(inputs) + word_embeddings = unpacked_inputs[0] + token_type_ids = unpacked_inputs[1] + input_shape = tf_utils.get_shape_list(word_embeddings, expected_rank=3) + batch_size = input_shape[0] + seq_length = input_shape[1] + width = input_shape[2] + + output = word_embeddings + if self.use_type_embeddings: + flat_token_type_ids = tf.reshape(token_type_ids, [-1]) + token_type_embeddings = tf.gather(self.type_embeddings, + flat_token_type_ids) + token_type_embeddings = tf.reshape(token_type_embeddings, + [batch_size, seq_length, width]) + output += token_type_embeddings + + if self.use_position_embeddings: + position_embeddings = tf.expand_dims( + tf.slice(self.position_embeddings, [0, 0], [seq_length, width]), + axis=0) + + output += position_embeddings + + output = self.output_layer_norm(output) + output = self.output_dropout(output) + + return output + + +class Decoder(tf.keras.layers.Layer): + """The decoder network which can reuse encoder embeddings for target.""" + + def __init__(self, config, embedding_lookup=None, **kwargs): + super(Decoder, self).__init__(**kwargs) + self.config = config + # Shares vocabulary embedding. + self.embedding_lookup = None + if embedding_lookup: + self.embedding_lookup = embedding_lookup + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + if self.embedding_lookup is None: + self.embedding_lookup = layers.OnDeviceEmbedding( + vocab_size=self.config.vocab_size, + embedding_width=self.config.hidden_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=self.config.initializer_range), + name="target_embeddings") + self.embedding_postprocessor = EmbeddingPostprocessor( + use_type_embeddings=False, + use_position_embeddings=True, + max_position_embeddings=self.config.max_position_embeddings, + dropout_prob=self.config.hidden_dropout_prob, + initializer=tf.keras.initializers.VarianceScaling( + scale=self.config.initializer_gain, + mode="fan_avg", + distribution="uniform"), + name="embedding_postprocessor") + # Decoder can use a different intermediate size. + self.multi_channel_cross_attention = self.config.get( + "multi_channel_cross_attention", False) + self.decoder = TransformerDecoder( + num_hidden_layers=self.config.num_decoder_layers, + hidden_size=self.config.hidden_size, + num_attention_heads=self.config.num_decoder_attn_heads, + intermediate_size=self.config.decoder_intermediate_size, + intermediate_activation=self.config.hidden_act, + hidden_dropout_prob=self.config.hidden_dropout_prob, + attention_probs_dropout_prob=self.config.attention_probs_dropout_prob, + initializer_range=self.config.initializer_range, + multi_channel_cross_attention=self.multi_channel_cross_attention, + name="decoder") + super(Decoder, self).build(unused_input_shapes) + + def _decoding_step_time_signal(self, target_embeds, decode_loop_step): + """Applies time signal (positional embeddings) for decoded embeddings.""" + # TODO(hongkuny): migrate to keras bert and design a module to handle this. + output = target_embeds + if self.embedding_postprocessor.use_position_embeddings: + position_embeddings = tf.gather( + self.embedding_postprocessor.position_embeddings, [decode_loop_step]) + # Broadcasts to all sequences inside a batch. + output += position_embeddings + + output = self.embedding_postprocessor.output_layer_norm(output) + output = self.embedding_postprocessor.output_dropout(output) + return output + + def call(self, + inputs, + cache=None, + decode_loop_step=None, + padded_decode=False): + """Implements call() for the layer. + + Args: + inputs: a list of input tensors. + cache: A dictionary of cache tensors, including key & value attentions. + Due to the limit of keras, we uses the side effect to update cache and + states of tensors will be mutated. + decode_loop_step: an integer to indicate the step inside a decoding loop. + padded_decode: a boolean indicates if the pass is for padded decoding. + + Returns: + Decoder output tensors. + """ + attention_bias = inputs["attention_bias"] + target_ids = inputs["target_ids"] + all_encoder_outputs = inputs["all_encoder_outputs"] + self_attention_bias = inputs["self_attention_bias"] + if not isinstance(all_encoder_outputs, list): + all_encoder_outputs = [all_encoder_outputs] + + target_embeds = self.embedding_lookup(target_ids) + if decode_loop_step is None: + target_embeds = self.embedding_postprocessor(target_embeds) + else: + target_embeds = self._decoding_step_time_signal(target_embeds, + decode_loop_step) + decoder_inputs = dict( + decoder_inputs=target_embeds, + encoder_outputs=all_encoder_outputs, + self_attention_mask=self_attention_bias, + attention_mask=attention_bias) + if self.multi_channel_cross_attention: + decoder_inputs["doc_attention_probs"] = inputs["doc_attention_probs"] + decode_outputs, cache = self.decoder( + decoder_inputs, cache, decode_loop_step if padded_decode else None) + return decode_outputs diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder_test.py new file mode 100644 index 0000000..1a58c7e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/decoder_test.py @@ -0,0 +1,182 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for nlp.nhnet.decoder.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +from official.nlp.modeling import layers +from official.nlp.nhnet import configs +from official.nlp.nhnet import decoder +from official.nlp.nhnet import utils + + +def _create_cache(batch_size, init_decode_length, num_heads, head_size): + return { + "key": + tf.zeros([batch_size, init_decode_length, num_heads, head_size], + dtype=tf.float32), + "value": + tf.zeros([batch_size, init_decode_length, num_heads, head_size], + dtype=tf.float32) + } + + +class DecoderTest(tf.test.TestCase): + + def setUp(self): + super(DecoderTest, self).setUp() + self._config = utils.get_test_params() + + def test_transformer_decoder(self): + decoder_block = decoder.TransformerDecoder( + num_hidden_layers=self._config.num_hidden_layers, + hidden_size=self._config.hidden_size, + num_attention_heads=self._config.num_attention_heads, + intermediate_size=self._config.intermediate_size, + intermediate_activation=self._config.hidden_act, + hidden_dropout_prob=self._config.hidden_dropout_prob, + attention_probs_dropout_prob=self._config.attention_probs_dropout_prob, + initializer_range=self._config.initializer_range) + decoder_block.build(None) + self.assertEqual(len(decoder_block.layers), self._config.num_hidden_layers) + + def test_decoder_block_with_cache(self): + decoder_block = decoder.TransformerDecoderBlock( + hidden_size=self._config.hidden_size, + num_attention_heads=self._config.num_attention_heads, + intermediate_size=self._config.intermediate_size, + intermediate_activation=self._config.hidden_act, + hidden_dropout_prob=self._config.hidden_dropout_prob, + attention_probs_dropout_prob=self._config.attention_probs_dropout_prob, + initializer_range=self._config.initializer_range) + # Forward path. + dummy_tensor = tf.zeros([2, 4, self._config.hidden_size], dtype=tf.float32) + dummy_mask = tf.zeros([2, 4, 4], dtype=tf.float32) + inputs = [dummy_tensor, dummy_tensor, dummy_mask, dummy_mask] + cache = _create_cache( + 2, 0, self._config.num_attention_heads, + self._config.hidden_size // self._config.num_attention_heads) + output, cache = decoder_block(inputs, cache) + self.assertEqual(output.shape, (2, 4, self._config.hidden_size)) + self.assertEqual(cache["value"].shape, (2, 4, 2, 8)) + + def test_bert_decoder(self): + seq_length = 10 + encoder_input_ids = tf.keras.layers.Input( + shape=(seq_length,), name="encoder_input_ids", dtype=tf.int32) + target_ids = tf.keras.layers.Input( + shape=(seq_length,), name="target_ids", dtype=tf.int32) + encoder_outputs = tf.keras.layers.Input( + shape=(seq_length, self._config.hidden_size), + name="all_encoder_outputs", + dtype=tf.float32) + embedding_lookup = layers.OnDeviceEmbedding( + vocab_size=self._config.vocab_size, + embedding_width=self._config.hidden_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=self._config.initializer_range), + name="word_embeddings") + cross_attention_bias = decoder.AttentionBias(bias_type="single_cross")( + encoder_input_ids) + self_attention_bias = decoder.AttentionBias(bias_type="decoder_self")( + target_ids) + inputs = dict( + attention_bias=cross_attention_bias, + self_attention_bias=self_attention_bias, + target_ids=target_ids, + all_encoder_outputs=encoder_outputs) + decoder_layer = decoder.Decoder(self._config, embedding_lookup) + outputs = decoder_layer(inputs) + model_inputs = dict( + encoder_input_ids=encoder_input_ids, + target_ids=target_ids, + all_encoder_outputs=encoder_outputs) + model = tf.keras.Model(inputs=model_inputs, outputs=outputs, name="test") + self.assertLen(decoder_layer.trainable_weights, 30) + # Forward path. + fake_inputs = { + "encoder_input_ids": np.zeros((2, 10), dtype=np.int32), + "target_ids": np.zeros((2, 10), dtype=np.int32), + "all_encoder_outputs": np.zeros((2, 10, 16), dtype=np.float32), + } + output_tensor = model(fake_inputs) + self.assertEqual(output_tensor.shape, (2, 10, 16)) + + def test_multi_doc_decoder(self): + self._config = utils.get_test_params(cls=configs.NHNetConfig) + seq_length = 10 + num_docs = 5 + encoder_input_ids = tf.keras.layers.Input( + shape=(num_docs, seq_length), name="encoder_input_ids", dtype=tf.int32) + target_ids = tf.keras.layers.Input( + shape=(seq_length,), name="target_ids", dtype=tf.int32) + encoder_outputs = tf.keras.layers.Input( + shape=(num_docs, seq_length, self._config.hidden_size), + name="all_encoder_outputs", + dtype=tf.float32) + embedding_lookup = layers.OnDeviceEmbedding( + vocab_size=self._config.vocab_size, + embedding_width=self._config.hidden_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=self._config.initializer_range), + name="word_embeddings") + doc_attention_probs = tf.keras.layers.Input( + shape=(self._config.num_decoder_attn_heads, seq_length, num_docs), + name="doc_attention_probs", + dtype=tf.float32) + cross_attention_bias = decoder.AttentionBias(bias_type="multi_cross")( + encoder_input_ids) + self_attention_bias = decoder.AttentionBias(bias_type="decoder_self")( + target_ids) + + inputs = dict( + attention_bias=cross_attention_bias, + self_attention_bias=self_attention_bias, + target_ids=target_ids, + all_encoder_outputs=encoder_outputs, + doc_attention_probs=doc_attention_probs) + + decoder_layer = decoder.Decoder(self._config, embedding_lookup) + outputs = decoder_layer(inputs) + model_inputs = dict( + encoder_input_ids=encoder_input_ids, + target_ids=target_ids, + all_encoder_outputs=encoder_outputs, + doc_attention_probs=doc_attention_probs) + model = tf.keras.Model(inputs=model_inputs, outputs=outputs, name="test") + self.assertLen(decoder_layer.trainable_weights, 30) + # Forward path. + fake_inputs = { + "encoder_input_ids": + np.zeros((2, num_docs, seq_length), dtype=np.int32), + "target_ids": + np.zeros((2, seq_length), dtype=np.int32), + "all_encoder_outputs": + np.zeros((2, num_docs, seq_length, 16), dtype=np.float32), + "doc_attention_probs": + np.zeros( + (2, self._config.num_decoder_attn_heads, seq_length, num_docs), + dtype=np.float32) + } + output_tensor = model(fake_inputs) + self.assertEqual(output_tensor.shape, (2, seq_length, 16)) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/evaluation.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/evaluation.py new file mode 100644 index 0000000..b9c94dc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/evaluation.py @@ -0,0 +1,185 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Evaluation for Bert2Bert.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os +from absl import logging +import numpy as np +import tensorflow as tf + +from official.nlp.nhnet import input_pipeline +from official.nlp.nhnet import models +from official.nlp.transformer import metrics as metrics_v2 +from official.nlp.transformer.utils import metrics + + +def rouge_l_fscore(logits, labels): + """ROUGE scores computation between labels and predictions. + + This is an approximate ROUGE scoring method since we do not glue word pieces + or decode the ids and tokenize the output. + + Args: + logits: tensor, model predictions + labels: tensor, gold output. + + Returns: + rouge_l_fscore: approx rouge-l f1 score. + """ + predictions = np.argmax(logits, axis=-1) + rouge_l_f_score = metrics.rouge_l_sentence_level(predictions, labels) + return rouge_l_f_score + + +def rouge_2_fscore(logits, labels): + """ROUGE-2 F1 score computation between labels and predictions. + + This is an approximate ROUGE scoring method since we do not glue word pieces + or decode the ids and tokenize the output. + + Args: + logits: tensor, model predictions + labels: tensor, gold output. + + Returns: + rouge2_fscore: approx rouge-2 f1 score. + """ + predictions = np.argmax(logits, axis=-1) + rouge_2_f_score = metrics.rouge_n(predictions, labels) + return rouge_2_f_score + + +def bleu_score(logits, labels): + """Approximate BLEU score computation between labels and predictions. + + An approximate BLEU scoring method since we do not glue word pieces or + decode the ids and tokenize the output. By default, we use ngram order of 4 + and use brevity penalty. Also, this does not have beam search. + + Args: + logits: Tensor of size [batch_size, length_logits, vocab_size] + labels: Tensor of size [batch-size, length_labels] + + Returns: + bleu: int, approx bleu score + """ + predictions = np.argmax(logits, axis=-1) + bleu = metrics.compute_bleu(labels, predictions) + return bleu + + +def continuous_eval(strategy, + params, + model_type, + eval_file_pattern=None, + batch_size=4, + eval_steps=None, + model_dir=None, + timeout=3000): + """Continuously evaluate checkpoints on testing data.""" + test_dataset = input_pipeline.get_input_dataset( + eval_file_pattern, + batch_size=batch_size, + params=params, + is_training=False, + strategy=strategy) + + with strategy.scope(): + model = models.create_model(model_type, params) + metric_layer = metrics_v2.MetricLayer(params.vocab_size) + eval_summary_writer = tf.summary.create_file_writer( + os.path.join(model_dir, "summaries/eval")) + global_step = tf.Variable( + 0, + trainable=False, + dtype=tf.int64, + aggregation=tf.VariableAggregation.ONLY_FIRST_REPLICA, + shape=[]) + model.global_step = global_step + + @tf.function + def test_step(inputs): + """Calculates evaluation metrics on distributed devices.""" + + def _test_step_fn(inputs): + """Replicated accuracy calculation.""" + targets = models.remove_sos_from_seq(inputs["target_ids"], + params.pad_token_id) + + # Using ground truth sequences as targets to calculate logits for accuracy + # and perplexity metrics. + logits, _, _ = model(inputs, training=False, mode="train") + metric_layer([logits, targets]) + + # Get logits from top beam search results for bleu and rouge metrics. + logits = model(inputs, training=False, mode="eval") + + return targets, logits + + outputs = strategy.run(_test_step_fn, args=(inputs,)) + + return tf.nest.map_structure(strategy.experimental_local_results, outputs) + + metrics_and_funcs = [ + (tf.keras.metrics.Mean("bleu", dtype=tf.float32), bleu_score), + (tf.keras.metrics.Mean("rouge_2_fscore", + dtype=tf.float32), rouge_2_fscore), + (tf.keras.metrics.Mean("rouge_l_fscore", + dtype=tf.float32), rouge_l_fscore), + ] + eval_results = {} + for latest_checkpoint in tf.train.checkpoints_iterator( + model_dir, timeout=timeout): + checkpoint = tf.train.Checkpoint(model=model) + checkpoint.restore(latest_checkpoint).expect_partial() + logging.info("Loaded checkpoint %s", latest_checkpoint) + + for i, inputs in enumerate(test_dataset): + if eval_steps and i >= eval_steps: + break + outputs = test_step(inputs) + for metric, func in metrics_and_funcs: + for targets, logits in zip(outputs[0], outputs[1]): + metric.update_state(func(logits.numpy(), targets.numpy())) + + with eval_summary_writer.as_default(): + step = model.global_step.numpy() + for metric, _ in metrics_and_funcs: + eval_results[metric.name] = metric.result().numpy().astype(float) + tf.summary.scalar( + metric.name, + eval_results[metric.name], + step=step) + for metric in metric_layer.metrics: + eval_results[metric.name] = metric.result().numpy().astype(float) + tf.summary.scalar( + metric.name, + eval_results[metric.name], + step=step) + logging.info("Step %d Metrics= %s", step, str(eval_results)) + eval_summary_writer.flush() + + # Resets metrics. + for metric, _ in metrics_and_funcs: + metric.reset_states() + for metric in metric_layer.metrics: + metric.reset_states() + return eval_results diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/input_pipeline.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/input_pipeline.py new file mode 100644 index 0000000..04f7890 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/input_pipeline.py @@ -0,0 +1,254 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Input pipelines.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + + +def decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.io.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.cast(t, tf.int32) + example[name] = t + + return example + + +def process_singledoc_dataset(dataset, batch_size, params): + """Parses and batches single-doc dataset.""" + name_to_features = { + "input_ids_a": tf.io.FixedLenFeature([params.len_title], tf.int64), + "input_ids_b": tf.io.FixedLenFeature([params.len_passage], tf.int64), + "input_mask_b": tf.io.FixedLenFeature([params.len_passage], tf.int64), + "segment_ids_b": tf.io.FixedLenFeature([params.len_passage], tf.int64), + } + decode_fn = lambda record: decode_record(record, name_to_features) + dataset = dataset.map( + decode_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + + def _select_data_from_record(record): + """Filter out features to use for pretraining.""" + return { + "input_ids": record["input_ids_b"], + "input_mask": record["input_mask_b"], + "segment_ids": record["segment_ids_b"], + "target_ids": record["input_ids_a"], + } + + dataset = dataset.map( + _select_data_from_record, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=True) + return dataset + + +def decode_sparse_record(record, name_to_features): + """Decodes a sparse record to a TensorFlow example.""" + example = tf.io.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.cast(t, tf.int32) + example[name] = tf.sparse.to_dense(t) + + return example + + +def _filter_max_length(example, max_title_length=256): + """Indicates whether the example's length is lower than the maximum length.""" + return tf.size(example["targets"]) <= max_title_length + + +def process_singledoc_transformer_dataset(dataset, batch_size, params): + """Parses, batches and pads single-doc dataset.""" + name_to_features = { + "inputs": tf.io.VarLenFeature(tf.int64), + "targets": tf.io.VarLenFeature(tf.int64), + } + decode_fn = lambda record: decode_sparse_record(record, name_to_features) + dataset = dataset.map( + decode_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + + def _select_data_from_record(record): + """Filter out features to use for pretraining.""" + input_ids = record["inputs"][:params.len_passage] + target_ids = record["targets"] + input_mask = tf.ones_like(input_ids) + segment_ids = tf.zeros_like(input_ids) + return { + "input_ids": input_ids, + "input_mask": input_mask, + "segment_ids": segment_ids, + "target_ids": target_ids, + } + + dataset = dataset.filter(lambda x: _filter_max_length(x, params.len_title)) + + dataset = dataset.map( + _select_data_from_record, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + dataset = dataset.padded_batch( + batch_size, { + "input_ids": [params.len_passage], + "input_mask": [params.len_passage], + "segment_ids": [params.len_passage], + "target_ids": [params.len_title], + }, + padding_values={ + "input_ids": params.pad_token_id, + "input_mask": 0, + "segment_ids": 0, + "target_ids": params.pad_token_id, + }, + drop_remainder=True) + + return dataset + + +def multidoc_parse_spec(params, training=True): + """Gets the mutli-doc tf.Example parsing spec.""" + len_p = params.len_passage + name_to_features = {} + feature_list = ["input_ids", "input_mask", "segment_ids"] + for idx in params.passage_list: + for feature in feature_list: + name_to_features["%s_%s" % (feature, idx)] = tf.io.FixedLenFeature( + [len_p], tf.int64) + if training: + # Cluster title. + name_to_features["input_ids_a"] = tf.io.FixedLenFeature([params.len_title], + tf.int64) + return name_to_features, feature_list + + +def process_multidoc_dataset(dataset, batch_size, params): + """Parses, organizes and batches multi-doc dataset.""" + name_to_features, feature_list = multidoc_parse_spec(params) + decode_fn = lambda record: decode_record(record, name_to_features) + dataset = dataset.map( + decode_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + + def _select_data_from_record(record): + """Filter out features to use for pretraining.""" + features = {"target_ids": record["input_ids_a"]} + for feature in feature_list: + tensors = [record["%s_%s" % (feature, i)] for i in params.passage_list] + features[feature] = tf.stack(tensors) + return features + + dataset = dataset.map( + _select_data_from_record, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=True) + return dataset + + +def create_dataset(file_paths, + batch_size, + params, + is_training=True, + input_pipeline_context=None): + """Creates input dataset from (tf)records files for pretraining.""" + dataset = tf.data.Dataset.list_files(file_paths, shuffle=is_training) + + if input_pipeline_context and input_pipeline_context.num_input_pipelines > 1: + if not is_training or params.input_sharding: + dataset = dataset.shard(input_pipeline_context.num_input_pipelines, + input_pipeline_context.input_pipeline_id) + + if is_training: + dataset = dataset.repeat() + # We set shuffle buffer to exactly match total number of + # training files to ensure that training data is well shuffled. + dataset = dataset.shuffle(len(file_paths)) + + # In parallel, create tf record dataset for each train files. + # cycle_length = 8 means that up to 8 files will be read and deserialized in + # parallel. You may want to increase this number if you have a large number of + # CPU cores. + dataset = dataset.interleave( + tf.data.TFRecordDataset, + cycle_length=8, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + if is_training: + dataset = dataset.shuffle(100) + + if params.get("multi_channel_cross_attention", value=False): + dataset = process_multidoc_dataset(dataset, batch_size, params) + else: + if not params.input_data_not_padded: + dataset = process_singledoc_dataset(dataset, batch_size, params) + else: + dataset = process_singledoc_transformer_dataset(dataset, batch_size, + params) + dataset = dataset.prefetch(1024) + return dataset + + +def get_input_dataset(input_file_pattern, + batch_size, + params, + is_training, + strategy=None): + """Returns input dataset from input file string.""" + + # When using TPU pods, we need to clone dataset across + # workers and need to pass in function that returns the dataset rather + # than passing dataset instance itself. + use_dataset_fn = isinstance(strategy, tf.distribute.experimental.TPUStrategy) + if use_dataset_fn: + if batch_size % strategy.num_replicas_in_sync != 0: + raise ValueError( + "Batch size must be divisible by number of replicas : {}".format( + strategy.num_replicas_in_sync)) + + # As auto rebatching is not supported in + # `experimental_distribute_datasets_from_function()` API, which is + # required when cloning dataset to multiple workers in eager mode, + # we use per-replica batch size. + batch_size = int(batch_size / strategy.num_replicas_in_sync) + + def _dataset_fn(ctx=None): + """Returns tf.data.Dataset for distributed BERT pretraining.""" + input_files = [] + for input_pattern in input_file_pattern.split(","): + input_files.extend(tf.io.gfile.glob(input_pattern)) + + return create_dataset( + input_files, + batch_size, + params, + is_training=is_training, + input_pipeline_context=ctx) + + if use_dataset_fn: + return strategy.experimental_distribute_datasets_from_function(_dataset_fn) + else: + return strategy.experimental_distribute_dataset(_dataset_fn()) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/models.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/models.py new file mode 100644 index 0000000..52b6c43 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/models.py @@ -0,0 +1,590 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""tf.keras Models for NHNet.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging +import gin +import tensorflow as tf +from typing import Optional, Text + +from official.modeling import tf_utils +from official.modeling.hyperparams import params_dict +from official.nlp.modeling import networks +from official.nlp.nhnet import configs +from official.nlp.nhnet import decoder +from official.nlp.nhnet import multi_channel_attention +from official.nlp.nhnet import utils +from official.nlp.transformer import beam_search + + +def embedding_linear(embedding_matrix, x): + """Uses embeddings as linear transformation weights.""" + with tf.name_scope("presoftmax_linear"): + batch_size = tf.shape(x)[0] + length = tf.shape(x)[1] + hidden_size = tf.shape(x)[2] + vocab_size = tf.shape(embedding_matrix)[0] + + x = tf.reshape(x, [-1, hidden_size]) + logits = tf.matmul(x, embedding_matrix, transpose_b=True) + + return tf.reshape(logits, [batch_size, length, vocab_size]) + + +def _add_sos_to_seq(seq, start_token_id): + """Add a start sequence token while keeping seq length.""" + batch_size = tf.shape(seq)[0] + seq_len = tf.shape(seq)[1] + sos_ids = tf.ones([batch_size], tf.int32) * start_token_id + targets = tf.concat([tf.expand_dims(sos_ids, axis=1), seq], axis=1) + targets = targets[:, :-1] + tf.assert_equal(tf.shape(targets), (batch_size, seq_len)) + return targets + + +def remove_sos_from_seq(seq, pad_token_id): + """Remove the start sequence token while keeping seq length.""" + batch_size, seq_len = tf_utils.get_shape_list(seq, expected_rank=2) + # remove + targets = seq[:, 1:] + # pad + pad_ids = tf.ones([batch_size], tf.int32) * pad_token_id + targets = tf.concat([targets, tf.expand_dims(pad_ids, axis=1)], axis=1) + tf.assert_equal(tf.shape(targets), (batch_size, seq_len)) + return targets + + +class Bert2Bert(tf.keras.Model): + """Bert2Bert encoder decoder model for training.""" + + def __init__(self, params, bert_layer, decoder_layer, name=None): + super(Bert2Bert, self).__init__(name=name) + self.params = params + if not bert_layer.built: + raise ValueError("bert_layer should be built.") + if not decoder_layer.built: + raise ValueError("decoder_layer should be built.") + self.bert_layer = bert_layer + self.decoder_layer = decoder_layer + + def get_config(self): + return {"params": self.params.as_dict()} + + def get_decode_logits(self, + decoder_inputs, + ids, + decoder_self_attention_bias, + step, + cache=None): + if cache: + if self.params.get("padded_decode", False): + bias_shape = decoder_self_attention_bias.shape.as_list() + self_attention_bias = tf.slice( + decoder_self_attention_bias, [0, 0, step, 0], + [bias_shape[0], bias_shape[1], 1, bias_shape[3]]) + else: + self_attention_bias = decoder_self_attention_bias[:, :, step:step + + 1, :step + 1] + # Sets decoder input to the last generated IDs. + decoder_input = ids[:, -1:] + else: + self_attention_bias = decoder_self_attention_bias[:, :, :step + 1, :step + + 1] + decoder_input = ids + decoder_inputs["target_ids"] = decoder_input + decoder_inputs["self_attention_bias"] = self_attention_bias + if cache: + decoder_outputs = self.decoder_layer( + decoder_inputs, + cache, + decode_loop_step=step, + padded_decode=self.params.get("padded_decode", False)) + else: + decoder_outputs = self.decoder_layer(decoder_inputs) + logits = embedding_linear(self.decoder_layer.embedding_lookup.embeddings, + decoder_outputs[:, -1:, :]) + logits = tf.squeeze(logits, axis=[1]) + return logits + + def _get_symbols_to_logits_fn(self, max_decode_length): + """Returns a decoding function that calculates logits of the next tokens.""" + # Max decode length should be smaller than the positional embedding max + # sequence length. + decoder_self_attention_bias = decoder.get_attention_bias( + input_tensor=None, + bias_type="decoder_self", + max_length=max_decode_length) + + def _symbols_to_logits_fn(ids, i, cache): + """Generate logits for next candidate IDs. + + Args: + ids: Current decoded sequences. int tensor with shape [batch_size * + beam_size, i + 1] + i: Loop index + cache: dictionary of values storing the encoder output, encoder-decoder + attention bias, and previous decoder attention values. + + Returns: + Tuple of + (logits with shape [batch_size * beam_size, vocab_size], + updated cache values) + """ + decoder_inputs = dict( + all_encoder_outputs=cache["all_encoder_outputs"], + attention_bias=cache["attention_bias"]) + logits = self.get_decode_logits( + decoder_inputs, + ids, + decoder_self_attention_bias, + step=i, + cache=cache if self.params.use_cache else None) + return logits, cache + + return _symbols_to_logits_fn + + def train_decode(self, decode_outputs): + logits = embedding_linear(self.decoder_layer.embedding_lookup.embeddings, + decode_outputs) + decode_output_ids = tf.cast(tf.argmax(logits, axis=-1), tf.int32) + output_log_probs = tf.nn.log_softmax(logits, axis=-1) + return logits, decode_output_ids, output_log_probs + + def predict_decode(self, start_token_ids, cache): + symbols_to_logits_fn = self._get_symbols_to_logits_fn(self.params.len_title) + # Use beam search to find the top beam_size sequences and scores. + decoded_ids, scores = beam_search.sequence_beam_search( + symbols_to_logits_fn=symbols_to_logits_fn, + initial_ids=start_token_ids, + initial_cache=cache, + vocab_size=self.params.vocab_size, + beam_size=self.params.beam_size, + alpha=self.params.alpha, + max_decode_length=self.params.len_title, + padded_decode=self.params.get("padded_decode", False), + eos_id=self.params.end_token_id) + return decoded_ids, scores + + def _get_logits_for_decode_ids(self, decoder_inputs, top_decoded_ids): + """Returns the log probabilities for ids.""" + target_ids = _add_sos_to_seq(top_decoded_ids, self.params.start_token_id) + decoder_inputs["self_attention_bias"] = decoder.get_attention_bias( + target_ids, bias_type="decoder_self") + decoder_inputs["target_ids"] = target_ids + decoder_outputs = self.decoder_layer(decoder_inputs) + logits = embedding_linear(self.decoder_layer.embedding_lookup.embeddings, + decoder_outputs) + return logits + + def _init_cache(self, batch_size): + num_heads = self.params.num_decoder_attn_heads + dim_per_head = self.params.hidden_size // num_heads + init_decode_length = ( + self.params.len_title if self.params.get("padded_decode", False) else 0) + cache = {} + for layer in range(self.params.num_decoder_layers): + cache[str(layer)] = { + "key": + tf.zeros( + [batch_size, init_decode_length, num_heads, dim_per_head], + dtype=tf.float32), + "value": + tf.zeros( + [batch_size, init_decode_length, num_heads, dim_per_head], + dtype=tf.float32) + } + return cache + + def call(self, inputs, mode="train"): + """Implements call(). + + Args: + inputs: a dictionary of tensors. + mode: string, an enum for mode, train/eval. + + Returns: + logits, decode_output_ids, output_log_probs for training. top_decoded_ids + for eval. + """ + input_ids = inputs["input_ids"] + input_mask = inputs["input_mask"] + segment_ids = inputs["segment_ids"] + all_encoder_outputs, _ = self.bert_layer( + [input_ids, input_mask, segment_ids]) + + if mode not in ("train", "eval", "predict"): + raise ValueError("Invalid call mode: %s" % mode) + encoder_decoder_attention_bias = decoder.get_attention_bias( + input_ids, + bias_type="single_cross", + padding_value=self.params.pad_token_id) + if mode == "train": + self_attention_bias = decoder.get_attention_bias( + inputs["target_ids"], bias_type="decoder_self") + decoder_inputs = dict( + attention_bias=encoder_decoder_attention_bias, + all_encoder_outputs=all_encoder_outputs, + target_ids=inputs["target_ids"], + self_attention_bias=self_attention_bias) + decoder_outputs = self.decoder_layer(decoder_inputs) + return self.train_decode(decoder_outputs) + + batch_size = tf.shape(input_ids)[0] + start_token_ids = tf.ones([batch_size], + tf.int32) * self.params.start_token_id + # Add encoder output and attention bias to the cache. + if self.params.use_cache: + cache = self._init_cache(batch_size) + else: + cache = {} + cache["all_encoder_outputs"] = all_encoder_outputs + cache["attention_bias"] = encoder_decoder_attention_bias + decoded_ids, scores = self.predict_decode(start_token_ids, cache) + if mode == "predict": + return decoded_ids[:, :self.params.beam_size, + 1:], scores[:, :self.params.beam_size] + + decoder_inputs = dict( + attention_bias=encoder_decoder_attention_bias, + all_encoder_outputs=all_encoder_outputs) + top_decoded_ids = decoded_ids[:, 0, 1:] + return self._get_logits_for_decode_ids(decoder_inputs, top_decoded_ids) + + +class NHNet(Bert2Bert): + """NHNet model which performs multi-doc decoding.""" + + def __init__(self, params, bert_layer, decoder_layer, name=None): + super(NHNet, self).__init__(params, bert_layer, decoder_layer, name=name) + self.doc_attention = multi_channel_attention.DocAttention( + num_heads=params.num_decoder_attn_heads, + head_size=params.hidden_size // params.num_decoder_attn_heads) + + def _expand_doc_attention_probs(self, doc_attention_probs, target_length): + """Expands doc attention probs to fit the decoding sequence length.""" + doc_attention_probs = tf.expand_dims( + doc_attention_probs, axis=[1]) # [B, 1, A] + doc_attention_probs = tf.expand_dims( + doc_attention_probs, axis=[2]) # [B, 1, 1, A] + return tf.tile(doc_attention_probs, + [1, self.params.num_decoder_attn_heads, target_length, 1]) + + def _get_symbols_to_logits_fn(self, max_decode_length): + """Returns a decoding function that calculates logits of the next tokens.""" + # Max decode length should be smaller than the positional embedding max + # sequence length. + decoder_self_attention_bias = decoder.get_attention_bias( + input_tensor=None, + bias_type="decoder_self", + max_length=max_decode_length) + + def _symbols_to_logits_fn(ids, i, cache): + """Generate logits for next candidate IDs.""" + if self.params.use_cache: + target_length = 1 + else: + target_length = i + 1 + decoder_inputs = dict( + doc_attention_probs=self._expand_doc_attention_probs( + cache["doc_attention_probs"], target_length), + all_encoder_outputs=cache["all_encoder_outputs"], + attention_bias=cache["attention_bias"]) + logits = self.get_decode_logits( + decoder_inputs, + ids, + decoder_self_attention_bias, + step=i, + cache=cache if self.params.use_cache else None) + return logits, cache + + return _symbols_to_logits_fn + + def call(self, inputs, mode="training"): + input_shape = tf_utils.get_shape_list(inputs["input_ids"], expected_rank=3) + batch_size, num_docs, len_passage = (input_shape[0], input_shape[1], + input_shape[2]) + input_ids = tf.reshape(inputs["input_ids"], [-1, len_passage]) + input_mask = tf.reshape(inputs["input_mask"], [-1, len_passage]) + segment_ids = tf.reshape(inputs["segment_ids"], [-1, len_passage]) + all_encoder_outputs, _ = self.bert_layer( + [input_ids, input_mask, segment_ids]) + encoder_outputs = tf.reshape( + all_encoder_outputs[-1], + [batch_size, num_docs, len_passage, self.params.hidden_size]) + doc_attention_mask = tf.reshape( + tf.cast( + tf.math.count_nonzero(input_mask, axis=1, dtype=tf.int32) > 2, + tf.int32), [batch_size, num_docs]) + + doc_attention_probs = self.doc_attention(encoder_outputs, + doc_attention_mask) + encoder_decoder_attention_bias = decoder.get_attention_bias( + inputs["input_ids"], + bias_type="multi_cross", + padding_value=self.params.pad_token_id) + + if mode == "train": + target_length = tf_utils.get_shape_list( + inputs["target_ids"], expected_rank=2)[1] + doc_attention_probs = self._expand_doc_attention_probs( + doc_attention_probs, target_length) + self_attention_bias = decoder.get_attention_bias( + inputs["target_ids"], bias_type="decoder_self") + decoder_inputs = dict( + attention_bias=encoder_decoder_attention_bias, + self_attention_bias=self_attention_bias, + target_ids=inputs["target_ids"], + all_encoder_outputs=encoder_outputs, + doc_attention_probs=doc_attention_probs) + decoder_outputs = self.decoder_layer(decoder_inputs) + return self.train_decode(decoder_outputs) + + # Adds encoder output and attention bias to the cache. + if self.params.use_cache: + cache = self._init_cache(batch_size) + else: + cache = {} + cache["all_encoder_outputs"] = [encoder_outputs] + cache["attention_bias"] = encoder_decoder_attention_bias + cache["doc_attention_probs"] = doc_attention_probs + + start_token_ids = tf.ones([batch_size], + tf.int32) * self.params.start_token_id + decoded_ids, scores = self.predict_decode(start_token_ids, cache) + if mode == "predict": + return decoded_ids[:, :self.params.beam_size, + 1:], scores[:, :self.params.beam_size] + + top_decoded_ids = decoded_ids[:, 0, 1:] + target_length = tf_utils.get_shape_list(top_decoded_ids)[-1] + decoder_inputs = dict( + attention_bias=encoder_decoder_attention_bias, + all_encoder_outputs=[encoder_outputs], + doc_attention_probs=self._expand_doc_attention_probs( + doc_attention_probs, target_length)) + return self._get_logits_for_decode_ids(decoder_inputs, top_decoded_ids) + + +def get_bert2bert_layers(params: configs.BERT2BERTConfig): + """Creates a Bert2Bert stem model and returns Bert encoder/decoder. + + We use funtional-style to create stem model because we need to make all layers + built to restore variables in a customized way. The layers are called with + placeholder inputs to make them fully built. + + Args: + params: ParamsDict. + + Returns: + two keras Layers, bert_model_layer and decoder_layer + """ + input_ids = tf.keras.layers.Input( + shape=(None,), name="input_ids", dtype=tf.int32) + input_mask = tf.keras.layers.Input( + shape=(None,), name="input_mask", dtype=tf.int32) + segment_ids = tf.keras.layers.Input( + shape=(None,), name="segment_ids", dtype=tf.int32) + target_ids = tf.keras.layers.Input( + shape=(None,), name="target_ids", dtype=tf.int32) + bert_config = utils.get_bert_config_from_params(params) + bert_model_layer = networks.TransformerEncoder( + vocab_size=bert_config.vocab_size, + hidden_size=bert_config.hidden_size, + num_layers=bert_config.num_hidden_layers, + num_attention_heads=bert_config.num_attention_heads, + intermediate_size=bert_config.intermediate_size, + activation=tf_utils.get_activation(bert_config.hidden_act), + dropout_rate=bert_config.hidden_dropout_prob, + attention_dropout_rate=bert_config.attention_probs_dropout_prob, + sequence_length=None, + max_sequence_length=bert_config.max_position_embeddings, + type_vocab_size=bert_config.type_vocab_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range), + return_all_encoder_outputs=True, + name="bert_encoder") + all_encoder_outputs, _ = bert_model_layer( + [input_ids, input_mask, segment_ids]) + # pylint: disable=protected-access + decoder_layer = decoder.Decoder(params, bert_model_layer._embedding_layer) + # pylint: enable=protected-access + cross_attention_bias = decoder.AttentionBias(bias_type="single_cross")( + input_ids) + self_attention_bias = decoder.AttentionBias(bias_type="decoder_self")( + target_ids) + decoder_inputs = dict( + attention_bias=cross_attention_bias, + self_attention_bias=self_attention_bias, + target_ids=target_ids, + all_encoder_outputs=all_encoder_outputs) + _ = decoder_layer(decoder_inputs) + + return bert_model_layer, decoder_layer + + +def get_nhnet_layers(params: configs.NHNetConfig): + """Creates a Mult-doc encoder/decoder. + + Args: + params: ParamsDict. + + Returns: + two keras Layers, bert_model_layer and decoder_layer + """ + input_ids = tf.keras.layers.Input( + shape=(None,), name="input_ids", dtype=tf.int32) + input_mask = tf.keras.layers.Input( + shape=(None,), name="input_mask", dtype=tf.int32) + segment_ids = tf.keras.layers.Input( + shape=(None,), name="segment_ids", dtype=tf.int32) + bert_config = utils.get_bert_config_from_params(params) + bert_model_layer = networks.TransformerEncoder( + vocab_size=bert_config.vocab_size, + hidden_size=bert_config.hidden_size, + num_layers=bert_config.num_hidden_layers, + num_attention_heads=bert_config.num_attention_heads, + intermediate_size=bert_config.intermediate_size, + activation=tf_utils.get_activation(bert_config.hidden_act), + dropout_rate=bert_config.hidden_dropout_prob, + attention_dropout_rate=bert_config.attention_probs_dropout_prob, + sequence_length=None, + max_sequence_length=bert_config.max_position_embeddings, + type_vocab_size=bert_config.type_vocab_size, + initializer=tf.keras.initializers.TruncatedNormal( + stddev=bert_config.initializer_range), + return_all_encoder_outputs=True, + name="bert_encoder") + bert_model_layer([input_ids, input_mask, segment_ids]) + + input_ids = tf.keras.layers.Input( + shape=(None, None), name="input_ids", dtype=tf.int32) + all_encoder_outputs = tf.keras.layers.Input((None, None, params.hidden_size), + dtype=tf.float32) + target_ids = tf.keras.layers.Input( + shape=(None,), name="target_ids", dtype=tf.int32) + doc_attention_probs = tf.keras.layers.Input( + (params.num_decoder_attn_heads, None, None), dtype=tf.float32) + # pylint: disable=protected-access + decoder_layer = decoder.Decoder(params, bert_model_layer._embedding_layer) + # pylint: enable=protected-access + cross_attention_bias = decoder.AttentionBias(bias_type="multi_cross")( + input_ids) + self_attention_bias = decoder.AttentionBias(bias_type="decoder_self")( + target_ids) + decoder_inputs = dict( + attention_bias=cross_attention_bias, + self_attention_bias=self_attention_bias, + target_ids=target_ids, + all_encoder_outputs=all_encoder_outputs, + doc_attention_probs=doc_attention_probs) + _ = decoder_layer(decoder_inputs) + + return bert_model_layer, decoder_layer + + +def create_transformer_model(params, + init_checkpoint: Optional[Text] = None + ) -> tf.keras.Model: + """A helper to create Transformer model.""" + bert_layer, decoder_layer = get_bert2bert_layers(params=params) + model = Bert2Bert( + params=params, + bert_layer=bert_layer, + decoder_layer=decoder_layer, + name="transformer") + + if init_checkpoint: + logging.info( + "Checkpoint file %s found and restoring from " + "initial checkpoint.", init_checkpoint) + ckpt = tf.train.Checkpoint(model=model) + ckpt.restore(init_checkpoint).expect_partial() + + return model + + +def create_bert2bert_model( + params: configs.BERT2BERTConfig, + cls=Bert2Bert, + init_checkpoint: Optional[Text] = None) -> tf.keras.Model: + """A helper to create Bert2Bert model.""" + bert_layer, decoder_layer = get_bert2bert_layers(params=params) + if init_checkpoint: + utils.initialize_bert2bert_from_pretrained_bert(bert_layer, decoder_layer, + init_checkpoint) + return cls( + params=params, + bert_layer=bert_layer, + decoder_layer=decoder_layer, + name="bert2bert") + + +def create_nhnet_model( + params: configs.NHNetConfig, + cls=NHNet, + init_checkpoint: Optional[Text] = None) -> tf.keras.Model: + """A helper to create NHNet model.""" + bert_layer, decoder_layer = get_nhnet_layers(params=params) + model = cls( + params=params, + bert_layer=bert_layer, + decoder_layer=decoder_layer, + name="nhnet") + if init_checkpoint: + logging.info( + "Checkpoint file %s found and restoring from " + "initial checkpoint.", init_checkpoint) + if params.init_from_bert2bert: + ckpt = tf.train.Checkpoint(model=model) + ckpt.restore(init_checkpoint).assert_existing_objects_matched() + else: + utils.initialize_bert2bert_from_pretrained_bert(bert_layer, decoder_layer, + init_checkpoint) + return model + + +@gin.configurable +def get_model_params(model: Optional[Text] = "bert2bert", + config_class=None) -> params_dict.ParamsDict: + """Helper function to convert config file to ParamsDict.""" + if model == "bert2bert": + return configs.BERT2BERTConfig() + elif model == "nhnet": + return configs.NHNetConfig() + elif config_class: + return config_class() + else: + raise KeyError("The model type is not defined: %s" % model) + + +@gin.configurable +def create_model(model_type: Text, + params, + init_checkpoint: Optional[Text] = None): + """A factory function to create different types of models.""" + if model_type == "bert2bert": + return create_bert2bert_model(params, init_checkpoint=init_checkpoint) + elif model_type == "nhnet": + return create_nhnet_model(params, init_checkpoint=init_checkpoint) + elif "transformer" in model_type: + return create_transformer_model( + params, init_checkpoint=init_checkpoint) + else: + raise KeyError("The model type is not defined: %s" % model_type) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention.py new file mode 100644 index 0000000..66b2a5e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention.py @@ -0,0 +1,153 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Multi-channel decoder.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import math + +import tensorflow as tf +from official.modeling import tf_utils +from official.nlp.modeling import layers + + +class DocAttention(tf.keras.layers.Layer): + """Documents Attention layer.""" + + def __init__(self, + num_heads, + head_size, + kernel_initializer="glorot_uniform", + bias_initializer="zeros", + kernel_regularizer=None, + bias_regularizer=None, + activity_regularizer=None, + kernel_constraint=None, + bias_constraint=None, + **kwargs): + super(DocAttention, self).__init__(**kwargs) + self._num_heads = num_heads + self._head_size = head_size + self._kernel_initializer = tf.keras.initializers.get(kernel_initializer) + self._bias_initializer = tf.keras.initializers.get(bias_initializer) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + self._kernel_constraint = tf.keras.constraints.get(kernel_constraint) + self._bias_constraint = tf.keras.constraints.get(bias_constraint) + + def build(self, unused_input_shapes): + self._query_dense = layers.DenseEinsum( + output_shape=(self._num_heads, self._head_size), + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + dtype=self.dtype, + name="encdocatt_query") + self._key_dense = layers.DenseEinsum( + output_shape=(self._num_heads, self._head_size), + kernel_initializer=self._kernel_initializer, + bias_initializer=self._bias_initializer, + kernel_regularizer=self._kernel_regularizer, + bias_regularizer=self._bias_regularizer, + activity_regularizer=self._activity_regularizer, + kernel_constraint=self._kernel_constraint, + bias_constraint=self._bias_constraint, + dtype=self.dtype, + name="encdocatt_key") + super(DocAttention, self).build(unused_input_shapes) + + def call(self, encoder_outputs, doc_attention_mask): + num_docs = tf_utils.get_shape_list(encoder_outputs, expected_rank=[4])[1] + cls_embeddings = encoder_outputs[:, :, 0, :] + key = self._key_dense(cls_embeddings) + query = self._query_dense(cls_embeddings) + doc_attention_mask = tf.cast(doc_attention_mask, tf.float32) + + key = tf.einsum("BANH,BA->BANH", key, doc_attention_mask) + query = tf.einsum("BANH,BA->BANH", query, doc_attention_mask) + attention_matrix = tf.einsum("BXNH,BYNH->BNXY", query, key) + mask = tf.ones([num_docs, num_docs]) + mask = tf.linalg.set_diag(mask, tf.zeros(num_docs)) + attention_matrix = tf.einsum("BNXY,XY->BNXY", attention_matrix, mask) + doc_attention_probs = tf.einsum("BNAY->BNA", attention_matrix) + doc_attention_probs = tf.einsum("BNA->BA", doc_attention_probs) + infadder = (1.0 - doc_attention_mask) * -100000.0 + return tf.nn.softmax(doc_attention_probs + infadder) + + +class MultiChannelAttention(layers.MultiHeadAttention): + """Multi-channel Attention layer.""" + + def __init__(self, num_heads, head_size, **kwargs): + super(MultiChannelAttention, self).__init__(num_heads, head_size, **kwargs) + self._masked_softmax = layers.MaskedSoftmax(mask_expansion_axes=[2]) + + def compute_output_shape(self, input_shape): + if len(input_shape) != 4: + raise ValueError("Layer %s must have 4 input tensors." % self.name) + from_tensor_shape = tf.TensorShape(input_shape[0]) + batch = from_tensor_shape[0] + from_tensor_length = from_tensor_shape[1] + return tf.TensorShape( + (batch, from_tensor_length, self._num_heads, self._head_size)) + + def call(self, inputs): + from_tensor = inputs[0] + to_tensor = inputs[1] + attention_mask = inputs[2] + doc_attention_probs = inputs[3] + + # Scalar dimensions referenced here: + # B = batch size (number of stories) + # A = num_docs (number of docs) + # F = `from_tensor` sequence length + # T = `to_tensor` sequence length + # N = `num_attention_heads` + # H = `size_per_head` + # `query_tensor` = [B, F, N ,H] + query_tensor = self._query_dense(from_tensor) + + # `key_tensor` = [B, A, T, N, H] + key_tensor = self._key_dense(to_tensor) + + # `value_tensor` = [B, A, T, N, H] + value_tensor = self._value_dense(to_tensor) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + attention_scores = tf.einsum("BATNH,BFNH->BANFT", key_tensor, query_tensor) + attention_scores = tf.multiply(attention_scores, + 1.0 / math.sqrt(float(self._head_size))) + + # Normalize the attention scores to probabilities. + # `attention_probs` = [B, A, N, F, T] + attention_probs = self._masked_softmax([attention_scores, attention_mask]) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = self._dropout(attention_probs) + + # `context_layer` = [B, F, N, H] + context_layer = tf.einsum("BANFT,BATNH->BAFNH", attention_probs, + value_tensor) + return tf.einsum("BNFA,BAFNH->BFNH", doc_attention_probs, context_layer) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention_test.py new file mode 100644 index 0000000..2a2e5d3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/multi_channel_attention_test.py @@ -0,0 +1,55 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for nlp.nhnet.multi_channel_attention.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from official.nlp.nhnet import multi_channel_attention + + +class MultiChannelAttentionTest(tf.test.TestCase): + + def test_doc_attention(self): + num_heads = 2 + doc_attention = multi_channel_attention.DocAttention(num_heads, head_size=8) + num_docs = 3 + inputs = np.zeros((2, num_docs, 10, 16), dtype=np.float32) + doc_mask = np.zeros((2, num_docs), dtype=np.float32) + outputs = doc_attention(inputs, doc_mask) + self.assertEqual(outputs.shape, (2, num_docs)) + + def test_multi_channel_attention(self): + num_heads = 2 + num_docs = 5 + attention_layer = multi_channel_attention.MultiChannelAttention( + num_heads, head_size=2) + + from_data = 10 * np.random.random_sample((3, 4, 8)) + to_data = 10 * np.random.random_sample((3, num_docs, 2, 8)) + mask_data = np.random.randint(2, size=(3, num_docs, 4, 2)) + doc_probs = np.random.randint( + 2, size=(3, num_heads, 4, num_docs)).astype(float) + outputs = attention_layer([from_data, to_data, mask_data, doc_probs]) + self.assertEqual(outputs.shape, (3, 4, num_heads, 2)) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/optimizer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/optimizer.py new file mode 100644 index 0000000..15c7e24 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/optimizer.py @@ -0,0 +1,82 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Optimizer and learning rate scheduler.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from official.modeling.hyperparams import params_dict + + +class LearningRateSchedule(tf.keras.optimizers.schedules.LearningRateSchedule): + """Learning rate schedule.""" + + def __init__(self, initial_learning_rate, hidden_size, warmup_steps): + """Initialize configuration of the learning rate schedule. + + Args: + initial_learning_rate: A float, the initial learning rate. + hidden_size: An integer, the model dimension in the hidden layers. + warmup_steps: An integer, the number of steps required for linear warmup. + """ + super(LearningRateSchedule, self).__init__() + self.initial_learning_rate = initial_learning_rate + self.hidden_size = hidden_size + self.warmup_steps = tf.cast(warmup_steps, tf.float32) + + def __call__(self, global_step): + """Calculate learning rate with linear warmup and rsqrt decay. + + Args: + global_step: An integer, the current global step used for learning rate + calculation. + + Returns: + A float, the learning rate needs to be used for current global step. + """ + with tf.name_scope('learning_rate_schedule'): + global_step = tf.cast(global_step, tf.float32) + learning_rate = self.initial_learning_rate + learning_rate *= (self.hidden_size**-0.5) + # Apply linear warmup + learning_rate *= tf.minimum(1.0, global_step / self.warmup_steps) + # Apply rsqrt decay + learning_rate /= tf.sqrt(tf.maximum(global_step, self.warmup_steps)) + return learning_rate + + def get_config(self): + """Get the configuration of the learning rate schedule.""" + return { + 'initial_learning_rate': self.initial_learning_rate, + 'hidden_size': self.hidden_size, + 'warmup_steps': self.warmup_steps, + } + + +def create_optimizer(params: params_dict.ParamsDict): + """Creates optimizer.""" + lr_schedule = LearningRateSchedule( + params.learning_rate, + params.hidden_size, + params.learning_rate_warmup_steps) + return tf.keras.optimizers.Adam( + learning_rate=lr_schedule, + beta_1=params.adam_beta1, + beta_2=params.adam_beta2, + epsilon=params.adam_epsilon) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_process.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_process.py new file mode 100644 index 0000000..9597043 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_process.py @@ -0,0 +1,91 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Processes crawled content from news URLs by generating tfrecords.""" + +import os +from absl import app +from absl import flags +from official.nlp.nhnet import raw_data_processor + +FLAGS = flags.FLAGS + +flags.DEFINE_string("crawled_articles", "/tmp/nhnet/", + "Folder path to the crawled articles using news-please.") +flags.DEFINE_string("vocab", None, "Filepath of the BERT vocabulary.") +flags.DEFINE_bool("do_lower_case", True, + "Whether the vocabulary is uncased or not.") +flags.DEFINE_integer("len_title", 15, + "Maximum number of tokens in story headline.") +flags.DEFINE_integer("len_passage", 200, + "Maximum number of tokens in article passage.") +flags.DEFINE_integer("max_num_articles", 5, + "Maximum number of articles in a story.") +flags.DEFINE_bool("include_article_title_in_passage", False, + "Whether to include article title in article passage.") +flags.DEFINE_string("data_folder", None, + "Folder path to the downloaded data folder (output).") +flags.DEFINE_integer("num_tfrecords_shards", 20, + "Number of shards for train/valid/test.") + + +def transform_as_tfrecords(data_processor, filename): + """Transforms story from json to tfrecord (sharded). + + Args: + data_processor: Instance of RawDataProcessor. + filename: 'train', 'valid', or 'test'. + """ + print("Transforming json to tfrecord for %s..." % filename) + story_filepath = os.path.join(FLAGS.data_folder, filename + ".json") + output_folder = os.path.join(FLAGS.data_folder, "processed") + os.makedirs(output_folder, exist_ok=True) + output_filepaths = [] + for i in range(FLAGS.num_tfrecords_shards): + output_filepaths.append( + os.path.join( + output_folder, "%s.tfrecord-%.5d-of-%.5d" % + (filename, i, FLAGS.num_tfrecords_shards))) + (total_num_examples, + generated_num_examples) = data_processor.generate_examples( + story_filepath, output_filepaths) + print("For %s, %d examples have been generated from %d stories in json." % + (filename, generated_num_examples, total_num_examples)) + + +def main(_): + if not FLAGS.data_folder: + raise ValueError("data_folder must be set as the downloaded folder path.") + if not FLAGS.vocab: + raise ValueError("vocab must be set as the filepath of BERT vocabulary.") + data_processor = raw_data_processor.RawDataProcessor( + vocab=FLAGS.vocab, + do_lower_case=FLAGS.do_lower_case, + len_title=FLAGS.len_title, + len_passage=FLAGS.len_passage, + max_num_articles=FLAGS.max_num_articles, + include_article_title_in_passage=FLAGS.include_article_title_in_passage, + include_text_snippet_in_example=True) + print("Loading crawled articles...") + num_articles = data_processor.read_crawled_articles(FLAGS.crawled_articles) + print("Total number of articles loaded: %d" % num_articles) + print() + transform_as_tfrecords(data_processor, "train") + transform_as_tfrecords(data_processor, "valid") + transform_as_tfrecords(data_processor, "test") + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_processor.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_processor.py new file mode 100644 index 0000000..0a30532 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/raw_data_processor.py @@ -0,0 +1,228 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Library for processing crawled content and generating tfrecords.""" + +import collections +import json +import multiprocessing +import os +import urllib.parse +import tensorflow as tf + +from official.nlp.bert import tokenization +from official.nlp.data import classifier_data_lib + + +class RawDataProcessor(object): + """Data converter for story examples.""" + + def __init__(self, + vocab: str, + do_lower_case: bool, + len_title: int = 15, + len_passage: int = 200, + max_num_articles: int = 5, + include_article_title_in_passage: bool = False, + include_text_snippet_in_example: bool = False): + """Constructs a RawDataProcessor. + + Args: + vocab: Filepath of the BERT vocabulary. + do_lower_case: Whether the vocabulary is uncased or not. + len_title: Maximum number of tokens in story headline. + len_passage: Maximum number of tokens in article passage. + max_num_articles: Maximum number of articles in a story. + include_article_title_in_passage: Whether to include article title in + article passage. + include_text_snippet_in_example: Whether to include text snippet + (headline and article content) in generated tensorflow Examples, for + debug usage. If include_article_title_in_passage=True, title and body + will be separated by [SEP]. + """ + self.articles = dict() + self.tokenizer = tokenization.FullTokenizer( + vocab, do_lower_case=do_lower_case, split_on_punc=False) + self.len_title = len_title + self.len_passage = len_passage + self.max_num_articles = max_num_articles + self.include_article_title_in_passage = include_article_title_in_passage + self.include_text_snippet_in_example = include_text_snippet_in_example + # ex_index=5 deactivates printing inside convert_single_example. + self.ex_index = 5 + # Parameters used in InputExample, not used in NHNet. + self.label = 0 + self.guid = 0 + self.num_generated_examples = 0 + + def read_crawled_articles(self, folder_path): + """Reads crawled articles under folder_path.""" + for path, _, files in os.walk(folder_path): + for name in files: + if not name.endswith(".json"): + continue + url, article = self._get_article_content_from_json( + os.path.join(path, name)) + if not article.text_a: + continue + self.articles[RawDataProcessor.normalize_url(url)] = article + if len(self.articles) % 5000 == 0: + print("Number of articles loaded: %d\r" % len(self.articles), end="") + print() + return len(self.articles) + + def generate_examples(self, input_file, output_files): + """Loads story from input json file and exports examples in output_files.""" + writers = [] + story_partition = [] + for output_file in output_files: + writers.append(tf.io.TFRecordWriter(output_file)) + story_partition.append(list()) + with tf.io.gfile.GFile(input_file, "r") as story_json_file: + stories = json.load(story_json_file) + writer_index = 0 + for story in stories: + articles = [] + for url in story["urls"]: + normalized_url = RawDataProcessor.normalize_url(url) + if normalized_url in self.articles: + articles.append(self.articles[normalized_url]) + if not articles: + continue + story_partition[writer_index].append((story["label"], articles)) + writer_index = (writer_index + 1) % len(writers) + lock = multiprocessing.Lock() + pool = multiprocessing.pool.ThreadPool(len(writers)) + data = [(story_partition[i], writers[i], lock) for i in range(len(writers))] + pool.map(self._write_story_partition, data) + return len(stories), self.num_generated_examples + + @classmethod + def normalize_url(cls, url): + """Normalize url for better matching.""" + url = urllib.parse.unquote( + urllib.parse.urlsplit(url)._replace(query=None).geturl()) + output, part = [], None + for part in url.split("//"): + if part == "http:" or part == "https:": + continue + else: + output.append(part) + return "//".join(output) + + def _get_article_content_from_json(self, file_path): + """Returns (url, InputExample) keeping content extracted from file_path.""" + with tf.io.gfile.GFile(file_path, "r") as article_json_file: + article = json.load(article_json_file) + if self.include_article_title_in_passage: + return article["url"], classifier_data_lib.InputExample( + guid=self.guid, + text_a=article["title"], + text_b=article["maintext"], + label=self.label) + else: + return article["url"], classifier_data_lib.InputExample( + guid=self.guid, text_a=article["maintext"], label=self.label) + + def _write_story_partition(self, data): + """Writes stories in a partition into file.""" + for (story_headline, articles) in data[0]: + story_example = tf.train.Example( + features=tf.train.Features( + feature=self._get_single_story_features(story_headline, + articles))) + data[1].write(story_example.SerializeToString()) + data[2].acquire() + try: + self.num_generated_examples += 1 + if self.num_generated_examples % 1000 == 0: + print( + "Number of stories written: %d\r" % self.num_generated_examples, + end="") + finally: + data[2].release() + + def _get_single_story_features(self, story_headline, articles): + """Converts a list of articles to a tensorflow Example.""" + def get_text_snippet(article): + if article.text_b: + return " [SEP] ".join([article.text_a, article.text_b]) + else: + return article.text_a + + story_features = collections.OrderedDict() + story_headline_feature = classifier_data_lib.convert_single_example( + ex_index=self.ex_index, + example=classifier_data_lib.InputExample( + guid=self.guid, text_a=story_headline, label=self.label), + label_list=[self.label], + max_seq_length=self.len_title, + tokenizer=self.tokenizer) + if self.include_text_snippet_in_example: + story_headline_feature.label_id = story_headline + self._add_feature_with_suffix( + feature=story_headline_feature, + suffix="a", + story_features=story_features) + for (article_index, article) in enumerate(articles): + if article_index == self.max_num_articles: + break + article_feature = classifier_data_lib.convert_single_example( + ex_index=self.ex_index, + example=article, + label_list=[self.label], + max_seq_length=self.len_passage, + tokenizer=self.tokenizer) + if self.include_text_snippet_in_example: + article_feature.label_id = get_text_snippet(article) + suffix = chr(ord("b") + article_index) + self._add_feature_with_suffix( + feature=article_feature, suffix=suffix, story_features=story_features) + + # Adds empty features as placeholder. + for article_index in range(len(articles), self.max_num_articles): + suffix = chr(ord("b") + article_index) + empty_article = classifier_data_lib.InputExample( + guid=self.guid, text_a="", label=self.label) + empty_feature = classifier_data_lib.convert_single_example( + ex_index=self.ex_index, + example=empty_article, + label_list=[self.label], + max_seq_length=self.len_passage, + tokenizer=self.tokenizer) + if self.include_text_snippet_in_example: + empty_feature.label_id = "" + self._add_feature_with_suffix( + feature=empty_feature, suffix=suffix, story_features=story_features) + return story_features + + def _add_feature_with_suffix(self, feature, suffix, story_features): + """Appends suffix to feature names and fills in the corresponding values.""" + + def _create_int_feature(values): + return tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + + def _create_string_feature(value): + return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])) + + story_features["input_ids_%c" % suffix] = _create_int_feature( + feature.input_ids) + story_features["input_mask_%c" % suffix] = _create_int_feature( + feature.input_mask) + story_features["segment_ids_%c" % suffix] = _create_int_feature( + feature.segment_ids) + if self.include_text_snippet_in_example: + story_features["text_snippet_%c" % suffix] = _create_string_feature( + bytes(feature.label_id.encode())) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.html b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.html new file mode 100644 index 0000000..0a8549c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.html @@ -0,0 +1,3 @@ + + +Page Title 0 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.json new file mode 100644 index 0000000..b730859 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_0.com/url_000.json @@ -0,0 +1,5 @@ +{ + "title": "title for 0", + "maintext": "text snippet for 0", + "url": "http://url_000.html" +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.html b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.html new file mode 100644 index 0000000..7c8bb8d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.html @@ -0,0 +1,3 @@ + + +Page Title 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.json new file mode 100644 index 0000000..dbc2322 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/crawled_articles/domain_1.com/url_001.json @@ -0,0 +1,5 @@ +{ + "title": "title for 1", + "maintext": "text snippet for 1", + "url": "url_001.html" +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/stories.json b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/stories.json new file mode 100644 index 0000000..0618f3d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/stories.json @@ -0,0 +1,29 @@ +[ + { + "urls": [ + "http://url_000.html", + "http://url_001.html" + ], + "label": "headline 0" + }, + { + "urls": [ + "http://url_000.html", + "http://url_001.html" + ], + "label": "headline 1" + }, + { + "urls": [ + "http://url_002.html", + "http://url_001.html" + ], + "label": "headline 2" + }, + { + "urls": [ + "http://url_003.html" + ], + "label": "headline 3" + } +] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/vocab.txt b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/vocab.txt new file mode 100644 index 0000000..dd708d7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/testdata/vocab.txt @@ -0,0 +1,23 @@ +[UNK] +[CLS] +[SEP] +[MASK] +0 +1 +this +is +a +title +snippet +for +url +main +text +http +www +html +: +// +. +_ +headline diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer.py new file mode 100644 index 0000000..e14c05e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer.py @@ -0,0 +1,238 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Run NHNet model training and eval.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app +from absl import flags +from absl import logging +from six.moves import zip +import tensorflow as tf +from official.modeling.hyperparams import params_dict +from official.nlp.nhnet import evaluation +from official.nlp.nhnet import input_pipeline +from official.nlp.nhnet import models +from official.nlp.nhnet import optimizer +from official.nlp.transformer import metrics as transformer_metrics +from official.utils.misc import distribution_utils + +FLAGS = flags.FLAGS + + +def define_flags(): + """Defines command line flags used by NHNet trainer.""" + ## Required parameters + flags.DEFINE_enum("mode", "train", ["train", "eval", "train_and_eval"], + "Execution mode.") + flags.DEFINE_string("train_file_pattern", "", "Train file pattern.") + flags.DEFINE_string("eval_file_pattern", "", "Eval file pattern.") + flags.DEFINE_string( + "model_dir", None, + "The output directory where the model checkpoints will be written.") + + # Model training specific flags. + flags.DEFINE_enum( + "distribution_strategy", "mirrored", ["tpu", "mirrored"], + "Distribution Strategy type to use for training. `tpu` uses TPUStrategy " + "for running on TPUs, `mirrored` uses GPUs with single host.") + flags.DEFINE_string("tpu", "", "TPU address to connect to.") + flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + flags.DEFINE_integer("train_steps", 100000, "Max train steps") + flags.DEFINE_integer("eval_steps", 32, "Number of eval steps per run.") + flags.DEFINE_integer("train_batch_size", 32, "Total batch size for training.") + flags.DEFINE_integer("eval_batch_size", 4, "Total batch size for evaluation.") + flags.DEFINE_integer( + "steps_per_loop", 1000, + "Number of steps per graph-mode loop. Only training step " + "happens inside the loop.") + flags.DEFINE_integer("checkpoint_interval", 2000, "Checkpointing interval.") + flags.DEFINE_integer("len_title", 15, "Title length.") + flags.DEFINE_integer("len_passage", 200, "Passage length.") + flags.DEFINE_integer("num_encoder_layers", 12, + "Number of hidden layers of encoder.") + flags.DEFINE_integer("num_decoder_layers", 12, + "Number of hidden layers of decoder.") + flags.DEFINE_string("model_type", "nhnet", + "Model type to choose a model configuration.") + flags.DEFINE_integer( + "num_nhnet_articles", 5, + "Maximum number of articles in NHNet, only used when model_type=nhnet") + flags.DEFINE_string( + "params_override", + default=None, + help=("a YAML/JSON string or a YAML file which specifies additional " + "overrides over the default parameters")) + + +# pylint: disable=protected-access + + +class Trainer(tf.keras.Model): + """A training only model.""" + + def __init__(self, model, params): + super(Trainer, self).__init__() + self.model = model + self.params = params + self._num_replicas_in_sync = tf.distribute.get_strategy( + ).num_replicas_in_sync + + def call(self, inputs, mode="train"): + return self.model(inputs, mode) + + def train_step(self, inputs): + """The logic for one training step.""" + with tf.GradientTape() as tape: + logits, _, _ = self(inputs, mode="train", training=True) + targets = models.remove_sos_from_seq(inputs["target_ids"], + self.params.pad_token_id) + loss = transformer_metrics.transformer_loss(logits, targets, + self.params.label_smoothing, + self.params.vocab_size) + # Scales the loss, which results in using the average loss across all + # of the replicas for backprop. + scaled_loss = loss / self._num_replicas_in_sync + + tvars = self.trainable_variables + grads = tape.gradient(scaled_loss, tvars) + self.optimizer.apply_gradients(list(zip(grads, tvars))) + return { + "training_loss": loss, + "learning_rate": self.optimizer._decayed_lr(var_dtype=tf.float32) + } + + +class SimpleCheckpoint(tf.keras.callbacks.Callback): + """Keras callback to save tf.train.Checkpoints.""" + + def __init__(self, checkpoint_manager): + super(SimpleCheckpoint, self).__init__() + self.checkpoint_manager = checkpoint_manager + + def on_epoch_end(self, epoch, logs=None): + step_counter = self.checkpoint_manager._step_counter.numpy() + self.checkpoint_manager.save(checkpoint_number=step_counter) + + +def train(params, strategy, dataset=None): + """Runs training.""" + + if not dataset: + dataset = input_pipeline.get_input_dataset( + FLAGS.train_file_pattern, + FLAGS.train_batch_size, + params, + is_training=True, + strategy=strategy) + + with strategy.scope(): + model = models.create_model( + FLAGS.model_type, params, init_checkpoint=FLAGS.init_checkpoint) + opt = optimizer.create_optimizer(params) + trainer = Trainer(model, params) + model.global_step = opt.iterations + + trainer.compile( + optimizer=opt, + experimental_steps_per_execution=FLAGS.steps_per_loop) + summary_dir = os.path.join(FLAGS.model_dir, "summaries") + summary_callback = tf.keras.callbacks.TensorBoard( + summary_dir, update_freq=max(100, FLAGS.steps_per_loop)) + checkpoint = tf.train.Checkpoint(model=model, optimizer=opt) + checkpoint_manager = tf.train.CheckpointManager( + checkpoint, + directory=FLAGS.model_dir, + max_to_keep=10, + step_counter=model.global_step, + checkpoint_interval=FLAGS.checkpoint_interval) + if checkpoint_manager.restore_or_initialize(): + logging.info("Training restored from the checkpoints in: %s", + FLAGS.model_dir) + checkpoint_callback = SimpleCheckpoint(checkpoint_manager) + + # Trains the model. + steps_per_epoch = min(FLAGS.train_steps, FLAGS.checkpoint_interval) + epochs = FLAGS.train_steps // steps_per_epoch + trainer.fit( + x=dataset, + steps_per_epoch=steps_per_epoch, + epochs=epochs, + callbacks=[summary_callback, checkpoint_callback], + verbose=2) + + +def run(): + """Runs NHNet using Keras APIs.""" + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, tpu_address=FLAGS.tpu) + if strategy: + logging.info("***** Number of cores used : %d", + strategy.num_replicas_in_sync) + + params = models.get_model_params(FLAGS.model_type) + params = params_dict.override_params_dict( + params, FLAGS.params_override, is_strict=True) + params.override( + { + "len_title": + FLAGS.len_title, + "len_passage": + FLAGS.len_passage, + "num_hidden_layers": + FLAGS.num_encoder_layers, + "num_decoder_layers": + FLAGS.num_decoder_layers, + "passage_list": + [chr(ord("b") + i) for i in range(FLAGS.num_nhnet_articles)], + }, + is_strict=False) + stats = {} + if "train" in FLAGS.mode: + train(params, strategy) + if "eval" in FLAGS.mode: + timeout = 0 if FLAGS.mode == "train_and_eval" else 3000 + # Uses padded decoding for TPU. Always uses cache. + padded_decode = isinstance(strategy, tf.distribute.experimental.TPUStrategy) + params.override({ + "padded_decode": padded_decode, + }, is_strict=False) + stats = evaluation.continuous_eval( + strategy, + params, + model_type=FLAGS.model_type, + eval_file_pattern=FLAGS.eval_file_pattern, + batch_size=FLAGS.eval_batch_size, + eval_steps=FLAGS.eval_steps, + model_dir=FLAGS.model_dir, + timeout=timeout) + return stats + + +def main(_): + stats = run() + if stats: + logging.info("Stats:\n%s", stats) + +if __name__ == "__main__": + define_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer_test.py new file mode 100644 index 0000000..36ba0f4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/trainer_test.py @@ -0,0 +1,100 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for official.nlp.nhnet.trainer.""" + +import os + +from absl import flags +from absl.testing import parameterized +import tensorflow as tf + +# pylint: disable=g-direct-tensorflow-import +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +# pylint: enable=g-direct-tensorflow-import +from official.nlp.nhnet import trainer +from official.nlp.nhnet import utils + +FLAGS = flags.FLAGS +trainer.define_flags() + + +def all_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.one_device_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.tpu_strategy, + ], + mode="eager", + ) + + +def get_trivial_data(config) -> tf.data.Dataset: + """Gets trivial data in the ImageNet size.""" + batch_size, num_docs = 2, len(config.passage_list), + len_passage = config.len_passage + len_title = config.len_title + def generate_data(_) -> tf.data.Dataset: + fake_ids = tf.zeros((num_docs, len_passage), dtype=tf.int32) + title = tf.zeros((len_title), dtype=tf.int32) + return dict( + input_ids=fake_ids, + input_mask=fake_ids, + segment_ids=fake_ids, + target_ids=title) + + dataset = tf.data.Dataset.range(1) + dataset = dataset.repeat() + dataset = dataset.map(generate_data, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.prefetch(buffer_size=1).batch(batch_size) + return dataset + + +class TrainerTest(tf.test.TestCase, parameterized.TestCase): + + def setUp(self): + super(TrainerTest, self).setUp() + self._config = utils.get_test_params() + self._config.override( + { + "vocab_size": 49911, + "max_position_embeddings": 200, + "len_title": 15, + "len_passage": 20, + "beam_size": 5, + "alpha": 0.6, + "learning_rate": 0.0, + "learning_rate_warmup_steps": 0, + "multi_channel_cross_attention": True, + "passage_list": ["a", "b"], + }, + is_strict=False) + + @combinations.generate(all_strategy_combinations()) + def test_train(self, distribution): + FLAGS.train_steps = 10 + FLAGS.checkpoint_interval = 5 + FLAGS.model_dir = self.get_temp_dir() + FLAGS.model_type = "nhnet" + trainer.train(self._config, distribution, get_trivial_data(self._config)) + self.assertLen( + tf.io.gfile.glob(os.path.join(FLAGS.model_dir, "ckpt*.index")), 2) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/utils.py new file mode 100644 index 0000000..fe055f3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/nhnet/utils.py @@ -0,0 +1,91 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility helpers for Bert2Bert.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging +import tensorflow as tf +from typing import Optional, Text +from official.modeling.hyperparams import params_dict +from official.nlp.bert import configs +from official.nlp.nhnet import configs as nhnet_configs + + +def get_bert_config_from_params( + params: params_dict.ParamsDict) -> configs.BertConfig: + """Converts a BertConfig to ParamsDict.""" + return configs.BertConfig.from_dict(params.as_dict()) + + +def get_test_params(cls=nhnet_configs.BERT2BERTConfig): + return cls.from_args(**nhnet_configs.UNITTEST_CONFIG) + + +# pylint: disable=protected-access +def encoder_common_layers(transformer_block): + return [ + transformer_block._attention_layer, + transformer_block._attention_output_dense, + transformer_block._attention_layer_norm, + transformer_block._intermediate_dense, transformer_block._output_dense, + transformer_block._output_layer_norm + ] +# pylint: enable=protected-access + + +def initialize_bert2bert_from_pretrained_bert( + bert_encoder: tf.keras.layers.Layer, + bert_decoder: tf.keras.layers.Layer, + init_checkpoint: Optional[Text] = None) -> None: + """Helper function to initialze Bert2Bert from Bert pretrained checkpoint.""" + ckpt = tf.train.Checkpoint(model=bert_encoder) + logging.info( + "Checkpoint file %s found and restoring from " + "initial checkpoint for core model.", init_checkpoint) + status = ckpt.restore(init_checkpoint) + + # Expects the bert model is a subset of checkpoint as pooling layer is + # not used. + status.assert_existing_objects_matched() + logging.info("Loading from checkpoint file completed.") + + # Saves a checkpoint with transformer layers. + encoder_layers = [] + for transformer_block in bert_encoder.transformer_layers: + encoder_layers.extend(encoder_common_layers(transformer_block)) + + # Restores from the checkpoint with encoder layers. + decoder_layers_to_initialize = [] + for decoder_block in bert_decoder.decoder.layers: + decoder_layers_to_initialize.extend( + decoder_block.common_layers_with_encoder()) + + if len(decoder_layers_to_initialize) != len(encoder_layers): + raise ValueError( + "Source encoder layers with %d objects does not match destination " + "decoder layers with %d objects." % + (len(decoder_layers_to_initialize), len(encoder_layers))) + + for dest_layer, source_layer in zip(decoder_layers_to_initialize, + encoder_layers): + try: + dest_layer.set_weights(source_layer.get_weights()) + except ValueError as e: + logging.error( + "dest_layer: %s failed to set weights from " + "source_layer: %s as %s", dest_layer.name, source_layer.name, str(e)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/optimization.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/optimization.py new file mode 100644 index 0000000..bdb0819 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/optimization.py @@ -0,0 +1,227 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions and classes related to optimization (weight updates).""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import re + +from absl import logging +import tensorflow as tf +import tensorflow_addons.optimizers as tfa_optimizers + + +class WarmUp(tf.keras.optimizers.schedules.LearningRateSchedule): + """Applies a warmup schedule on a given learning rate decay schedule.""" + + def __init__(self, + initial_learning_rate, + decay_schedule_fn, + warmup_steps, + power=1.0, + name=None): + super(WarmUp, self).__init__() + self.initial_learning_rate = initial_learning_rate + self.warmup_steps = warmup_steps + self.power = power + self.decay_schedule_fn = decay_schedule_fn + self.name = name + + def __call__(self, step): + with tf.name_scope(self.name or 'WarmUp') as name: + # Implements polynomial warmup. i.e., if global_step < warmup_steps, the + # learning rate will be `global_step/num_warmup_steps * init_lr`. + global_step_float = tf.cast(step, tf.float32) + warmup_steps_float = tf.cast(self.warmup_steps, tf.float32) + warmup_percent_done = global_step_float / warmup_steps_float + warmup_learning_rate = ( + self.initial_learning_rate * + tf.math.pow(warmup_percent_done, self.power)) + return tf.cond( + global_step_float < warmup_steps_float, + lambda: warmup_learning_rate, + lambda: self.decay_schedule_fn(step), + name=name) + + def get_config(self): + return { + 'initial_learning_rate': self.initial_learning_rate, + 'decay_schedule_fn': self.decay_schedule_fn, + 'warmup_steps': self.warmup_steps, + 'power': self.power, + 'name': self.name + } + + +def create_optimizer(init_lr, + num_train_steps, + num_warmup_steps, + end_lr=0.0, + optimizer_type='adamw'): + """Creates an optimizer with learning rate schedule.""" + # Implements linear decay of the learning rate. + lr_schedule = tf.keras.optimizers.schedules.PolynomialDecay( + initial_learning_rate=init_lr, + decay_steps=num_train_steps, + end_learning_rate=end_lr) + if num_warmup_steps: + lr_schedule = WarmUp( + initial_learning_rate=init_lr, + decay_schedule_fn=lr_schedule, + warmup_steps=num_warmup_steps) + + if optimizer_type == 'adamw': + logging.info('using Adamw optimizer') + optimizer = AdamWeightDecay( + learning_rate=lr_schedule, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=['layer_norm', 'bias']) + elif optimizer_type == 'lamb': + logging.info('using Lamb optimizer') + optimizer = tfa_optimizers.LAMB( + learning_rate=lr_schedule, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=['layer_norm', 'bias']) + else: + raise ValueError('Unsupported optimizer type: ', optimizer_type) + + return optimizer + + +class AdamWeightDecay(tf.keras.optimizers.Adam): + """Adam enables L2 weight decay and clip_by_global_norm on gradients. + + Just adding the square of the weights to the loss function is *not* the + correct way of using L2 regularization/weight decay with Adam, since that will + interact with the m and v parameters in strange ways. + + Instead we want ot decay the weights in a manner that doesn't interact with + the m/v parameters. This is equivalent to adding the square of the weights to + the loss with plain (non-momentum) SGD. + """ + + def __init__(self, + learning_rate=0.001, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-7, + amsgrad=False, + weight_decay_rate=0.0, + include_in_weight_decay=None, + exclude_from_weight_decay=None, + name='AdamWeightDecay', + **kwargs): + super(AdamWeightDecay, self).__init__(learning_rate, beta_1, beta_2, + epsilon, amsgrad, name, **kwargs) + self.weight_decay_rate = weight_decay_rate + self._include_in_weight_decay = include_in_weight_decay + self._exclude_from_weight_decay = exclude_from_weight_decay + + @classmethod + def from_config(cls, config): + """Creates an optimizer from its config with WarmUp custom object.""" + custom_objects = {'WarmUp': WarmUp} + return super(AdamWeightDecay, cls).from_config( + config, custom_objects=custom_objects) + + def _prepare_local(self, var_device, var_dtype, apply_state): + super(AdamWeightDecay, self)._prepare_local(var_device, var_dtype, + apply_state) + apply_state[(var_device, var_dtype)]['weight_decay_rate'] = tf.constant( + self.weight_decay_rate, name='adam_weight_decay_rate') + + def _decay_weights_op(self, var, learning_rate, apply_state): + do_decay = self._do_use_weight_decay(var.name) + if do_decay: + return var.assign_sub( + learning_rate * var * + apply_state[(var.device, var.dtype.base_dtype)]['weight_decay_rate'], + use_locking=self._use_locking) + return tf.no_op() + + def apply_gradients(self, + grads_and_vars, + name=None, + experimental_aggregate_gradients=True): + grads, tvars = list(zip(*grads_and_vars)) + if experimental_aggregate_gradients: + # when experimental_aggregate_gradients = False, apply_gradients() no + # longer implicitly allreduce gradients, users manually allreduce gradient + # and passed the allreduced grads_and_vars. For now, the + # clip_by_global_norm will be moved to before the explicit allreduce to + # keep the math the same as TF 1 and pre TF 2.2 implementation. + (grads, _) = tf.clip_by_global_norm(grads, clip_norm=1.0) + return super(AdamWeightDecay, self).apply_gradients( + zip(grads, tvars), + name=name, + experimental_aggregate_gradients=experimental_aggregate_gradients) + + def _get_lr(self, var_device, var_dtype, apply_state): + """Retrieves the learning rate with the given state.""" + if apply_state is None: + return self._decayed_lr_t[var_dtype], {} + + apply_state = apply_state or {} + coefficients = apply_state.get((var_device, var_dtype)) + if coefficients is None: + coefficients = self._fallback_apply_state(var_device, var_dtype) + apply_state[(var_device, var_dtype)] = coefficients + + return coefficients['lr_t'], dict(apply_state=apply_state) + + def _resource_apply_dense(self, grad, var, apply_state=None): + lr_t, kwargs = self._get_lr(var.device, var.dtype.base_dtype, apply_state) + decay = self._decay_weights_op(var, lr_t, apply_state) + with tf.control_dependencies([decay]): + return super(AdamWeightDecay, + self)._resource_apply_dense(grad, var, **kwargs) + + def _resource_apply_sparse(self, grad, var, indices, apply_state=None): + lr_t, kwargs = self._get_lr(var.device, var.dtype.base_dtype, apply_state) + decay = self._decay_weights_op(var, lr_t, apply_state) + with tf.control_dependencies([decay]): + return super(AdamWeightDecay, + self)._resource_apply_sparse(grad, var, indices, **kwargs) + + def get_config(self): + config = super(AdamWeightDecay, self).get_config() + config.update({ + 'weight_decay_rate': self.weight_decay_rate, + }) + return config + + def _do_use_weight_decay(self, param_name): + """Whether to use L2 weight decay for `param_name`.""" + if self.weight_decay_rate == 0: + return False + + if self._include_in_weight_decay: + for r in self._include_in_weight_decay: + if re.search(r, param_name) is not None: + return True + + if self._exclude_from_weight_decay: + for r in self._exclude_from_weight_decay: + if re.search(r, param_name) is not None: + return False + return True diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/README.md new file mode 100644 index 0000000..1215ed5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/README.md @@ -0,0 +1,218 @@ +# Transformer Translation Model +This is an implementation of the Transformer translation model as described in +the [Attention is All You Need](https://arxiv.org/abs/1706.03762) paper. The +implementation leverages tf.keras and makes sure it is compatible with TF 2.x. + +**Note: this transformer folder is subject to be integrated into official/nlp +folder. Due to its dependencies, we will finish the refactoring after the model +garden 2.1 release.** + +## Contents + * [Contents](#contents) + * [Walkthrough](#walkthrough) + * [Detailed instructions](#detailed-instructions) + * [Environment preparation](#environment-preparation) + * [Download and preprocess datasets](#download-and-preprocess-datasets) + * [Model training and evaluation](#model-training-and-evaluation) + * [Implementation overview](#implementation-overview) + * [Model Definition](#model-definition) + * [Model Trainer](#model-trainer) + * [Test dataset](#test-dataset) + +## Walkthrough + +Below are the commands for running the Transformer model. See the +[Detailed instructions](#detailed-instructions) for more details on running the +model. + +``` +# Ensure that PYTHONPATH is correctly defined as described in +# https://github.com/tensorflow/models/tree/master/official#requirements +export PYTHONPATH="$PYTHONPATH:/path/to/models" + +cd /path/to/models/official/nlp/transformer + +# Export variables +PARAM_SET=big +DATA_DIR=$HOME/transformer/data +MODEL_DIR=$HOME/transformer/model_$PARAM_SET +VOCAB_FILE=$DATA_DIR/vocab.ende.32768 + +# Download training/evaluation/test datasets +python3 data_download.py --data_dir=$DATA_DIR + +# Train the model for 100000 steps and evaluate every 5000 steps on a single GPU. +# Each train step, takes 4096 tokens as a batch budget with 64 as sequence +# maximal length. +python3 transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR \ + --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET \ + --train_steps=100000 --steps_between_evals=5000 \ + --batch_size=4096 --max_length=64 \ + --bleu_source=$DATA_DIR/newstest2014.en \ + --bleu_ref=$DATA_DIR/newstest2014.de \ + --num_gpus=1 \ + --enable_time_history=false + +# Run during training in a separate process to get continuous updates, +# or after training is complete. +tensorboard --logdir=$MODEL_DIR +``` + +## Detailed instructions + + +0. ### Environment preparation + + #### Add models repo to PYTHONPATH + Follow the instructions described in the [Requirements](https://github.com/tensorflow/models/tree/master/official#requirements) section to add the models folder to the python path. + + #### Export variables (optional) + + Export the following variables, or modify the values in each of the snippets below: + + ```shell + PARAM_SET=big + DATA_DIR=$HOME/transformer/data + MODEL_DIR=$HOME/transformer/model_$PARAM_SET + VOCAB_FILE=$DATA_DIR/vocab.ende.32768 + ``` + +1. ### Download and preprocess datasets + + [data_download.py](data_download.py) downloads and preprocesses the training and evaluation WMT datasets. After the data is downloaded and extracted, the training data is used to generate a vocabulary of subtokens. The evaluation and training strings are tokenized, and the resulting data is sharded, shuffled, and saved as TFRecords. + + 1.75GB of compressed data will be downloaded. In total, the raw files (compressed, extracted, and combined files) take up 8.4GB of disk space. The resulting TFRecord and vocabulary files are 722MB. The script takes around 40 minutes to run, with the bulk of the time spent downloading and ~15 minutes spent on preprocessing. + + Command to run: + ``` + python3 data_download.py --data_dir=$DATA_DIR + ``` + + Arguments: + * `--data_dir`: Path where the preprocessed TFRecord data, and vocab file will be saved. + * Use the `--help` or `-h` flag to get a full list of possible arguments. + +2. ### Model training and evaluation + + [transformer_main.py](transformer_main.py) creates a Transformer keras model, + and trains it uses keras model.fit(). + + Users need to adjust `batch_size` and `num_gpus` to get good performance + running multiple GPUs. + + **Note that:** + when using multiple GPUs or TPUs, this is the global batch size for all + devices. For example, if the batch size is `4096*4` and there are 4 devices, + each device will take 4096 tokens as a batch budget. + + Command to run: + ``` + python3 transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR \ + --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET + ``` + + Arguments: + * `--data_dir`: This should be set to the same directory given to the `data_download`'s `data_dir` argument. + * `--model_dir`: Directory to save Transformer model training checkpoints. + * `--vocab_file`: Path to subtoken vocabulary file. If data_download was used, you may find the file in `data_dir`. + * `--param_set`: Parameter set to use when creating and training the model. Options are `base` and `big` (default). + * `--enable_time_history`: Whether add TimeHistory call. If so, --log_steps must be specified. + * `--batch_size`: The number of tokens to consider in a batch. Combining with + `--max_length`, they decide how many sequences are used per batch. + * Use the `--help` or `-h` flag to get a full list of possible arguments. + + #### Using multiple GPUs + You can train these models on multiple GPUs using `tf.distribute.Strategy` API. + You can read more about them in this + [guide](https://www.tensorflow.org/guide/distribute_strategy). + + In this example, we have made it easier to use is with just a command line flag + `--num_gpus`. By default this flag is 1 if TensorFlow is compiled with CUDA, + and 0 otherwise. + + - --num_gpus=0: Uses tf.distribute.OneDeviceStrategy with CPU as the device. + - --num_gpus=1: Uses tf.distribute.OneDeviceStrategy with GPU as the device. + - --num_gpus=2+: Uses tf.distribute.MirroredStrategy to run synchronous + distributed training across the GPUs. + + #### Using Cloud TPUs + + You can train the Transformer model on Cloud TPUs using + `tf.distribute.TPUStrategy`. If you are not familiar with Cloud TPUs, it is + strongly recommended that you go through the + [quickstart](https://cloud.google.com/tpu/docs/quickstart) to learn how to + create a TPU and GCE VM. + + To run the Transformer model on a TPU, you must set + `--distribution_strategy=tpu`, `--tpu=$TPU_NAME`, and `--use_ctl=True` where + `$TPU_NAME` the name of your TPU in the Cloud Console. + + An example command to run Transformer on a v2-8 or v3-8 TPU would be: + + ```bash + python transformer_main.py \ + --tpu=$TPU_NAME \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --vocab_file=$DATA_DIR/vocab.ende.32768 \ + --bleu_source=$DATA_DIR/newstest2014.en \ + --bleu_ref=$DATA_DIR/newstest2014.end \ + --batch_size=6144 \ + --train_steps=2000 \ + --static_batch=true \ + --use_ctl=true \ + --param_set=big \ + --max_length=64 \ + --decode_batch_size=32 \ + --decode_max_length=97 \ + --padded_decode=true \ + --distribution_strategy=tpu + ``` + Note: `$MODEL_DIR` and `$DATA_DIR` must be GCS paths. + + #### Customizing training schedule + + By default, the model will train for 10 epochs, and evaluate after every epoch. The training schedule may be defined through the flags: + + * Training with steps: + * `--train_steps`: sets the total number of training steps to run. + * `--steps_between_evals`: Number of training steps to run between evaluations. + + #### Compute BLEU score during model evaluation + + Use these flags to compute the BLEU when the model evaluates: + + * `--bleu_source`: Path to file containing text to translate. + * `--bleu_ref`: Path to file containing the reference translation. + + When running `transformer_main.py`, use the flags: `--bleu_source=$DATA_DIR/newstest2014.en --bleu_ref=$DATA_DIR/newstest2014.de` + + #### Tensorboard + Training and evaluation metrics (loss, accuracy, approximate BLEU score, etc.) are logged, and can be displayed in the browser using Tensorboard. + ``` + tensorboard --logdir=$MODEL_DIR + ``` + The values are displayed at [localhost:6006](localhost:6006). + +## Implementation overview + +A brief look at each component in the code: + +### Model Definition +* [transformer.py](transformer.py): Defines a tf.keras.Model: `Transformer`. +* [embedding_layer.py](embedding_layer.py): Contains the layer that calculates the embeddings. The embedding weights are also used to calculate the pre-softmax probabilities from the decoder output. +* [attention_layer.py](attention_layer.py): Defines the multi-headed and self attention layers that are used in the encoder/decoder stacks. +* [ffn_layer.py](ffn_layer.py): Defines the feedforward network that is used in the encoder/decoder stacks. The network is composed of 2 fully connected layers. + +Other files: +* [beam_search.py](beam_search.py) contains the beam search implementation, which is used during model inference to find high scoring translations. + +### Model Trainer +[transformer_main.py](transformer_main.py) creates an `TransformerTask` to train and evaluate the model using tf.keras. + +### Test dataset +The [newstest2014 files](https://storage.googleapis.com/tf-perf-public/official_transformer/test_data/newstest2014.tgz) +are extracted from the [NMT Seq2Seq tutorial](https://google.github.io/seq2seq/nmt/#download-data). +The raw text files are converted from the SGM format of the +[WMT 2016](http://www.statmt.org/wmt16/translation-task.html) test sets. The +newstest2014 files are put into the `$DATA_DIR` when executing `data_download.py` diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/attention_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/attention_layer.py new file mode 100644 index 0000000..c798e9f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/attention_layer.py @@ -0,0 +1,159 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of multiheaded attention and self-attention layers.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from official.nlp.modeling import layers + + +class Attention(tf.keras.layers.Layer): + """Multi-headed attention layer.""" + + def __init__(self, hidden_size, num_heads, attention_dropout): + """Initialize Attention. + + Args: + hidden_size: int, output dim of hidden layer. + num_heads: int, number of heads to repeat the same attention structure. + attention_dropout: float, dropout rate inside attention for training. + """ + if hidden_size % num_heads: + raise ValueError( + "Hidden size ({}) must be divisible by the number of heads ({})." + .format(hidden_size, num_heads)) + + super(Attention, self).__init__() + self.hidden_size = hidden_size + self.num_heads = num_heads + self.attention_dropout = attention_dropout + + def build(self, input_shape): + """Builds the layer.""" + # Layers for linearly projecting the queries, keys, and values. + size_per_head = self.hidden_size // self.num_heads + self.query_dense_layer = layers.DenseEinsum( + output_shape=(self.num_heads, size_per_head), + kernel_initializer="glorot_uniform", + use_bias=False, + name="query") + self.key_dense_layer = layers.DenseEinsum( + output_shape=(self.num_heads, size_per_head), + kernel_initializer="glorot_uniform", + use_bias=False, + name="key") + self.value_dense_layer = layers.DenseEinsum( + output_shape=(self.num_heads, size_per_head), + kernel_initializer="glorot_uniform", + use_bias=False, + name="value") + self.output_dense_layer = layers.DenseEinsum( + output_shape=self.hidden_size, + num_summed_dimensions=2, + kernel_initializer="glorot_uniform", + use_bias=False, + name="output_transform") + super(Attention, self).build(input_shape) + + def get_config(self): + return { + "hidden_size": self.hidden_size, + "num_heads": self.num_heads, + "attention_dropout": self.attention_dropout, + } + + def call(self, query_input, source_input, bias, training, cache=None, + decode_loop_step=None): + """Apply attention mechanism to query_input and source_input. + + Args: + query_input: A tensor with shape [batch_size, length_query, hidden_size]. + source_input: A tensor with shape [batch_size, length_source, + hidden_size]. + bias: A tensor with shape [batch_size, 1, length_query, length_source], + the attention bias that will be added to the result of the dot product. + training: A bool, whether in training mode or not. + cache: (Used during prediction) A dictionary with tensors containing + results of previous attentions. The dictionary must have the items: + {"k": tensor with shape [batch_size, i, heads, dim_per_head], + "v": tensor with shape [batch_size, i, heads, dim_per_head]} + where i is the current decoded length for non-padded decode, or max + sequence length for padded decode. + decode_loop_step: An integer, step number of the decoding loop. Used only + for autoregressive inference on TPU. + + Returns: + Attention layer output with shape [batch_size, length_query, hidden_size] + """ + # Linearly project the query, key and value using different learned + # projections. Splitting heads is automatically done during the linear + # projections --> [batch_size, length, num_heads, dim_per_head]. + query = self.query_dense_layer(query_input) + key = self.key_dense_layer(source_input) + value = self.value_dense_layer(source_input) + + if cache is not None: + # Combine cached keys and values with new keys and values. + if decode_loop_step is not None: + cache_k_shape = cache["k"].shape.as_list() + indices = tf.reshape( + tf.one_hot(decode_loop_step, cache_k_shape[1], dtype=key.dtype), + [1, cache_k_shape[1], 1, 1]) + key = cache["k"] + key * indices + cache_v_shape = cache["v"].shape.as_list() + indices = tf.reshape( + tf.one_hot(decode_loop_step, cache_v_shape[1], dtype=value.dtype), + [1, cache_v_shape[1], 1, 1]) + value = cache["v"] + value * indices + else: + key = tf.concat([tf.cast(cache["k"], key.dtype), key], axis=1) + value = tf.concat([tf.cast(cache["v"], value.dtype), value], axis=1) + + # Update cache + cache["k"] = key + cache["v"] = value + + # Scale query to prevent the dot product between query and key from growing + # too large. + depth = (self.hidden_size // self.num_heads) + query *= depth ** -0.5 + + # Calculate dot product attention + logits = tf.einsum("BTNH,BFNH->BNFT", key, query) + logits += bias + # Note that softmax internally performs math operations using float32 + # for numeric stability. When training with float16, we keep the input + # and output in float16 for better performance. + weights = tf.nn.softmax(logits, name="attention_weights") + if training: + weights = tf.nn.dropout(weights, rate=self.attention_dropout) + attention_output = tf.einsum("BNFT,BTNH->BFNH", weights, value) + + # Run the outputs through another linear projection layer. Recombining heads + # is automatically done --> [batch_size, length, hidden_size] + attention_output = self.output_dense_layer(attention_output) + return attention_output + + +class SelfAttention(Attention): + """Multiheaded self-attention layer.""" + + def call(self, query_input, bias, training, cache=None, + decode_loop_step=None): + return super(SelfAttention, self).call( + query_input, query_input, bias, training, cache, decode_loop_step) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search.py new file mode 100644 index 0000000..fa1ae52 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search.py @@ -0,0 +1,138 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Beam search in TF v2.""" + +import tensorflow as tf + +from official.nlp.transformer import beam_search_v1 as v1 +from official.nlp.transformer import misc + +_StateKeys = v1._StateKeys # pylint: disable=protected-access + + +class SequenceBeamSearchV2(v1.SequenceBeamSearch): + """Implementation of beam search loop in v2.""" + + def search(self, initial_ids, initial_cache): + """Beam search for sequences with highest scores.""" + state, state_shapes = self._create_initial_state(initial_ids, initial_cache) + + finished_state = tf.nest.map_structure( + tf.stop_gradient, + tf.while_loop(self._continue_search, + self._search_step, + loop_vars=[state], + shape_invariants=[state_shapes], + parallel_iterations=1)) + finished_state = finished_state[0] + + alive_seq = finished_state[_StateKeys.ALIVE_SEQ] + alive_log_probs = finished_state[_StateKeys.ALIVE_LOG_PROBS] + finished_seq = finished_state[_StateKeys.FINISHED_SEQ] + finished_scores = finished_state[_StateKeys.FINISHED_SCORES] + finished_flags = finished_state[_StateKeys.FINISHED_FLAGS] + + # 2.0 changes tf.where behavior. Should make parameters broadcastable. + finished_cond = tf.reduce_any(finished_flags, 1, name="finished_cond") + seq_cond = _expand_to_same_rank(finished_cond, finished_seq) + score_cond = _expand_to_same_rank(finished_cond, finished_scores) + + # Account for corner case where there are no finished sequences for a + # particular batch item. In that case, return alive sequences for that batch + # item. + finished_seq = tf.compat.v2.where(seq_cond, finished_seq, alive_seq) + finished_scores = tf.compat.v2.where( + score_cond, finished_scores, alive_log_probs) + return finished_seq, finished_scores + + +def sequence_beam_search(symbols_to_logits_fn, + initial_ids, + initial_cache, + vocab_size, + beam_size, + alpha, + max_decode_length, + eos_id, + padded_decode=False, + dtype="float32"): + """Search for sequence of subtoken ids with the largest probability. + + Args: + symbols_to_logits_fn: A function that takes in ids, index, and cache as + arguments. The passed in arguments will have shape: + ids -> A tensor with shape [batch_size * beam_size, index]. + index -> A scalar. + cache -> A nested dictionary of tensors [batch_size * beam_size, ...]. + The function must return a tuple of logits and new cache: + logits -> A tensor with shape [batch * beam_size, vocab_size]. + new cache -> A nested dictionary with the same shape/structure as the + inputted cache. + initial_ids: An int32 tensor with shape [batch_size]. Starting ids for + each batch item. + initial_cache: A dictionary, containing starting decoder variables + information. + vocab_size: An integer, the size of tokens. + beam_size: An integer, the number of beams. + alpha: A float, defining the strength of length normalization. + max_decode_length: An integer, the maximum length to decoded a sequence. + eos_id: An integer, ID of eos token, used to determine when a sequence has + finished. + padded_decode: A bool, indicating if max_sequence_length padding is used + for beam search. + dtype: A tensorflow data type used for score computation. The default is + tf.float32. + + Returns: + Top decoded sequences [batch_size, beam_size, max_decode_length] + sequence scores [batch_size, beam_size] + """ + batch_size = ( + initial_ids.shape.as_list()[0] if padded_decode else + tf.shape(initial_ids)[0]) + if misc.is_v2(): + sbs = SequenceBeamSearchV2(symbols_to_logits_fn, vocab_size, batch_size, + beam_size, alpha, max_decode_length, eos_id, + padded_decode, dtype) + else: + sbs = v1.SequenceBeamSearch(symbols_to_logits_fn, vocab_size, batch_size, + beam_size, alpha, max_decode_length, eos_id, + padded_decode, dtype) + return sbs.search(initial_ids, initial_cache) + + +def _expand_to_same_rank(tensor, target): + """Expands a given tensor to target's rank to be broadcastable. + + Args: + tensor: input tensor to tile. Shape: [b, d1, ..., da] + target: target tensor. Shape: [b, d1, ..., da, ..., dn] + + Returns: + Tiled tensor of shape [b, d1, ..., da, 1, ..., 1] with same rank of target. + + Raises: + ValueError, if the shape rank of rank tensor/target is None. + """ + if tensor.shape.rank is None: + raise ValueError("Expect rank for tensor shape, but got None.") + if target.shape.rank is None: + raise ValueError("Expect rank for target shape, but got None.") + + with tf.name_scope("expand_rank"): + diff_rank = target.shape.rank - tensor.shape.rank + for _ in range(diff_rank): + tensor = tf.expand_dims(tensor, -1) + return tensor diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1.py new file mode 100644 index 0000000..8b143b1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1.py @@ -0,0 +1,675 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Beam search to find the translated sequence with the highest probability. + +Source implementation from Tensor2Tensor: +https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/beam_search.py +""" + +import numpy as np +import tensorflow.compat.v1 as tf +from tensorflow.python.util import nest + + +def inf(dtype): + """Returns a value close to infinity, but is still finite in `dtype`. + + This is useful to get a very large value that is still zero when multiplied by + zero. The floating-point "Inf" value is NaN when multiplied by zero. + + Args: + dtype: A dtype. The returned value will be finite when casted to this dtype. + + Returns: + A very large value. + """ + if dtype == "float32" or dtype == "bfloat16": + return 1e7 + elif dtype == "float16": + # Disable no-member lint error, as the linter thinks np.float16 does not + # exist for some reason. + return np.finfo(np.float16).max # pylint: disable=no-member + else: + raise AssertionError('Invalid dtype: %s' % dtype) + + +class _StateKeys(object): + """Keys to dictionary storing the state of the beam search loop.""" + + # Variable storing the loop index. + CUR_INDEX = "CUR_INDEX" + + # Top sequences that are alive for each batch item. Alive sequences are ones + # that have not generated an EOS token. Sequences that reach EOS are marked as + # finished and moved to the FINISHED_SEQ tensor. + # Has shape [batch_size, beam_size, CUR_INDEX + 1] + ALIVE_SEQ = "ALIVE_SEQ" + # Log probabilities of each alive sequence. Shape [batch_size, beam_size] + ALIVE_LOG_PROBS = "ALIVE_LOG_PROBS" + # Dictionary of cached values for each alive sequence. The cache stores + # the encoder output, attention bias, and the decoder attention output from + # the previous iteration. + ALIVE_CACHE = "ALIVE_CACHE" + + # Top finished sequences for each batch item. + # Has shape [batch_size, beam_size, CUR_INDEX + 1]. Sequences that are + # shorter than CUR_INDEX + 1 are padded with 0s. + FINISHED_SEQ = "FINISHED_SEQ" + # Scores for each finished sequence. Score = log probability / length norm + # Shape [batch_size, beam_size] + FINISHED_SCORES = "FINISHED_SCORES" + # Flags indicating which sequences in the finished sequences are finished. + # At the beginning, all of the sequences in FINISHED_SEQ are filler values. + # True -> finished sequence, False -> filler. Shape [batch_size, beam_size] + FINISHED_FLAGS = "FINISHED_FLAGS" + + +class SequenceBeamSearch(object): + """Implementation of beam search loop.""" + + def __init__(self, + symbols_to_logits_fn, + vocab_size, + batch_size, + beam_size, + alpha, + max_decode_length, + eos_id, + padded_decode, + dtype=tf.float32): + """Initialize sequence beam search. + + Args: + symbols_to_logits_fn: A function to provide logits, which is the + interface to the Transformer model. The passed in arguments are: + ids -> A tensor with shape [batch_size * beam_size, index]. + index -> A scalar. + cache -> A nested dictionary of tensors [batch_size * beam_size, ...]. + The function must return a tuple of logits and the updated cache: + logits -> A tensor with shape [batch * beam_size, vocab_size]. + updated cache -> A nested dictionary with the same structure as the + input cache. + vocab_size: An integer, the size of the vocabulary, used for topk + computation. + batch_size: An integer, the decode batch size. + beam_size: An integer, number of beams for beam search. + alpha: A float, defining the strength of length normalization. + max_decode_length: An integer, the maximum number of steps to decode + a sequence. + eos_id: An integer. ID of end of sentence token. + padded_decode: A bool, indicating if max_sequence_length padding is used + for beam search. + dtype: A tensorflow data type used for score computation. The default is + tf.float32. + """ + self.symbols_to_logits_fn = symbols_to_logits_fn + self.vocab_size = vocab_size + self.batch_size = batch_size + self.beam_size = beam_size + self.alpha = alpha + self.max_decode_length = max_decode_length + self.eos_id = eos_id + self.padded_decode = padded_decode + self.dtype = tf.as_dtype(dtype) + + def search(self, initial_ids, initial_cache): + """Beam search for sequences with highest scores.""" + state, state_shapes = self._create_initial_state(initial_ids, initial_cache) + + finished_state = tf.while_loop( + self._continue_search, self._search_step, loop_vars=[state], + shape_invariants=[state_shapes], parallel_iterations=1, back_prop=False) + finished_state = finished_state[0] + + alive_seq = finished_state[_StateKeys.ALIVE_SEQ] + alive_log_probs = finished_state[_StateKeys.ALIVE_LOG_PROBS] + finished_seq = finished_state[_StateKeys.FINISHED_SEQ] + finished_scores = finished_state[_StateKeys.FINISHED_SCORES] + finished_flags = finished_state[_StateKeys.FINISHED_FLAGS] + + # Account for corner case where there are no finished sequences for a + # particular batch item. In that case, return alive sequences for that batch + # item. + finished_seq = tf.where( + tf.reduce_any(finished_flags, 1), finished_seq, alive_seq) + finished_scores = tf.where( + tf.reduce_any(finished_flags, 1), finished_scores, alive_log_probs) + return finished_seq, finished_scores + + def _create_initial_state(self, initial_ids, initial_cache): + """Return initial state dictionary and its shape invariants. + + Args: + initial_ids: initial ids to pass into the symbols_to_logits_fn. + int tensor with shape [batch_size, 1] + initial_cache: dictionary storing values to be passed into the + symbols_to_logits_fn. + + Returns: + state and shape invariant dictionaries with keys from _StateKeys + """ + for key, value in initial_cache.items(): + for inner_value in nest.flatten(value): + if inner_value.dtype != self.dtype: + raise TypeError( + "initial_cache element for key '%s' has dtype %s that does not " + "match SequenceBeamSearch's dtype of %s. Value: %s" % + (key, value.dtype.name, self.dtype.name, inner_value)) + + # Current loop index (starts at 0) + cur_index = tf.constant(0) + + # Create alive sequence with shape [batch_size, beam_size, 1] + alive_seq = _expand_to_beam_size(initial_ids, self.beam_size) + alive_seq = tf.expand_dims(alive_seq, axis=2) + if self.padded_decode: + alive_seq = tf.tile(alive_seq, [1, 1, self.max_decode_length + 1]) + + # Create tensor for storing initial log probabilities. + # Assume initial_ids are prob 1.0 + initial_log_probs = tf.constant( + [[0.] + [-float("inf")] * (self.beam_size - 1)], dtype=self.dtype) + alive_log_probs = tf.tile(initial_log_probs, [self.batch_size, 1]) + + # Expand all values stored in the dictionary to the beam size, so that each + # beam has a separate cache. + alive_cache = nest.map_structure( + lambda t: _expand_to_beam_size(t, self.beam_size), initial_cache) + + # Initialize tensor storing finished sequences with filler values. + finished_seq = tf.zeros(tf.shape(alive_seq), tf.int32) + + # Set scores of the initial finished seqs to negative infinity. + finished_scores = tf.ones([self.batch_size, self.beam_size], + dtype=self.dtype) * -inf(self.dtype) + + # Initialize finished flags with all False values. + finished_flags = tf.zeros([self.batch_size, self.beam_size], tf.bool) + + # Create state dictionary + state = { + _StateKeys.CUR_INDEX: cur_index, + _StateKeys.ALIVE_SEQ: alive_seq, + _StateKeys.ALIVE_LOG_PROBS: alive_log_probs, + _StateKeys.ALIVE_CACHE: alive_cache, + _StateKeys.FINISHED_SEQ: finished_seq, + _StateKeys.FINISHED_SCORES: finished_scores, + _StateKeys.FINISHED_FLAGS: finished_flags + } + + # Create state invariants for each value in the state dictionary. Each + # dimension must be a constant or None. A None dimension means either: + # 1) the dimension's value is a tensor that remains the same but may + # depend on the input sequence to the model (e.g. batch size). + # 2) the dimension may have different values on different iterations. + if self.padded_decode: + state_shape_invariants = { + _StateKeys.CUR_INDEX: + tf.TensorShape([]), + _StateKeys.ALIVE_SEQ: + tf.TensorShape( + [self.batch_size, self.beam_size, + self.max_decode_length + 1]), + _StateKeys.ALIVE_LOG_PROBS: + tf.TensorShape([self.batch_size, self.beam_size]), + _StateKeys.ALIVE_CACHE: + nest.map_structure(_get_shape, alive_cache), + _StateKeys.FINISHED_SEQ: + tf.TensorShape( + [self.batch_size, self.beam_size, + self.max_decode_length + 1]), + _StateKeys.FINISHED_SCORES: + tf.TensorShape([self.batch_size, self.beam_size]), + _StateKeys.FINISHED_FLAGS: + tf.TensorShape([self.batch_size, self.beam_size]) + } + else: + state_shape_invariants = { + _StateKeys.CUR_INDEX: + tf.TensorShape([]), + _StateKeys.ALIVE_SEQ: + tf.TensorShape([None, self.beam_size, None]), + _StateKeys.ALIVE_LOG_PROBS: + tf.TensorShape([None, self.beam_size]), + _StateKeys.ALIVE_CACHE: + nest.map_structure(_get_shape_keep_last_dim, alive_cache), + _StateKeys.FINISHED_SEQ: + tf.TensorShape([None, self.beam_size, None]), + _StateKeys.FINISHED_SCORES: + tf.TensorShape([None, self.beam_size]), + _StateKeys.FINISHED_FLAGS: + tf.TensorShape([None, self.beam_size]) + } + + return state, state_shape_invariants + + def _continue_search(self, state): + """Return whether to continue the search loop. + + The loops should terminate when + 1) when decode length has been reached, or + 2) when the worst score in the finished sequences is better than the best + score in the alive sequences (i.e. the finished sequences are provably + unchanging) + + Args: + state: A dictionary with the current loop state. + + Returns: + Bool tensor with value True if loop should continue, False if loop should + terminate. + """ + i = state[_StateKeys.CUR_INDEX] + alive_log_probs = state[_StateKeys.ALIVE_LOG_PROBS] + finished_scores = state[_StateKeys.FINISHED_SCORES] + finished_flags = state[_StateKeys.FINISHED_FLAGS] + + not_at_max_decode_length = tf.less(i, self.max_decode_length) + + # Calculate largest length penalty (the larger penalty, the better score). + max_length_norm = _length_normalization(self.alpha, self.max_decode_length, + dtype=self.dtype) + # Get the best possible scores from alive sequences. + best_alive_scores = alive_log_probs[:, 0] / max_length_norm + + # Compute worst score in finished sequences for each batch element + finished_scores *= tf.cast(finished_flags, + self.dtype) # set filler scores to zero + lowest_finished_scores = tf.reduce_min(finished_scores, axis=1) + + # If there are no finished sequences in a batch element, then set the lowest + # finished score to -INF for that element. + finished_batches = tf.reduce_any(finished_flags, 1) + lowest_finished_scores += ((1.0 - + tf.cast(finished_batches, self.dtype)) * + -inf(self.dtype)) + + worst_finished_score_better_than_best_alive_score = tf.reduce_all( + tf.greater(lowest_finished_scores, best_alive_scores) + ) + + return tf.logical_and( + not_at_max_decode_length, + tf.logical_not(worst_finished_score_better_than_best_alive_score) + ) + + def _search_step(self, state): + """Beam search loop body. + + Grow alive sequences by a single ID. Sequences that have reached the EOS + token are marked as finished. The alive and finished sequences with the + highest log probabilities and scores are returned. + + A sequence's finished score is calculating by dividing the log probability + by the length normalization factor. Without length normalization, the + search is more likely to return shorter sequences. + + Args: + state: A dictionary with the current loop state. + + Returns: + new state dictionary. + """ + # Grow alive sequences by one token. + new_seq, new_log_probs, topk_ids, new_cache = self._grow_alive_seq(state) + new_finished_flags = tf.equal(topk_ids, self.eos_id) + # Collect top beam_size alive sequences + alive_state = self._get_new_alive_state(new_seq, new_log_probs, + new_finished_flags, new_cache) + + # Combine newly finished sequences with existing finished sequences, and + # collect the top k scoring sequences. + finished_state = self._get_new_finished_state(state, new_seq, new_log_probs, + new_finished_flags) + + # Increment loop index and create new state dictionary + new_state = {_StateKeys.CUR_INDEX: state[_StateKeys.CUR_INDEX] + 1} + new_state.update(alive_state) + new_state.update(finished_state) + return [new_state] + + def _grow_alive_seq(self, state): + """Grow alive sequences by one token, and collect top 2*beam_size sequences. + + 2*beam_size sequences are collected because some sequences may have reached + the EOS token. 2*beam_size ensures that at least beam_size sequences are + still alive. + + Args: + state: A dictionary with the current loop state. + Returns: + Tuple of + (Top 2*beam_size sequences [batch_size, 2 * beam_size, cur_index + 1], + Scores of returned sequences [batch_size, 2 * beam_size], + New alive cache, for each of the 2 * beam_size sequences) + """ + i = state[_StateKeys.CUR_INDEX] + alive_seq = state[_StateKeys.ALIVE_SEQ] + alive_log_probs = state[_StateKeys.ALIVE_LOG_PROBS] + alive_cache = state[_StateKeys.ALIVE_CACHE] + + beams_to_keep = 2 * self.beam_size + + # Get logits for the next candidate IDs for the alive sequences. Get the new + # cache values at the same time. + if self.padded_decode: + flat_ids = tf.reshape( + tf.slice(alive_seq, [0, 0, i], [self.batch_size, self.beam_size, 1]), + [self.batch_size * self.beam_size, -1]) + else: + flat_ids = _flatten_beam_dim(alive_seq) # [batch_size * beam_size] + flat_cache = nest.map_structure(_flatten_beam_dim, alive_cache) + + flat_logits, flat_cache = self.symbols_to_logits_fn(flat_ids, i, flat_cache) + + # Unflatten logits to shape [batch_size, beam_size, vocab_size] + logits = _unflatten_beam_dim(flat_logits, self.batch_size, self.beam_size) + new_cache = nest.map_structure( + lambda t: _unflatten_beam_dim(t, self.batch_size, self.beam_size), + flat_cache) + + # Convert logits to normalized log probs + candidate_log_probs = _log_prob_from_logits(logits) + + # Calculate new log probabilities if each of the alive sequences were + # extended # by the the candidate IDs. + # Shape [batch_size, beam_size, vocab_size] + log_probs = candidate_log_probs + tf.expand_dims(alive_log_probs, axis=2) + + # Each batch item has beam_size * vocab_size candidate sequences. For each + # batch item, get the k candidates with the highest log probabilities. + flat_log_probs = tf.reshape(log_probs, + [-1, self.beam_size * self.vocab_size]) + topk_log_probs, topk_indices = tf.nn.top_k(flat_log_probs, k=beams_to_keep) + + # Extract the alive sequences that generate the highest log probabilities + # after being extended. + topk_beam_indices = topk_indices // self.vocab_size + topk_seq, new_cache = _gather_beams( + [alive_seq, new_cache], topk_beam_indices, self.batch_size, + beams_to_keep) + + # Append the most probable IDs to the topk sequences + topk_ids = topk_indices % self.vocab_size + if self.padded_decode: + topk_seq = tf.transpose(topk_seq, perm=[2, 0, 1]) + # TODO(b/145533236, hongkuny): Reverts once TF fix the validation. + topk_seq = tf.tensor_scatter_nd_update(topk_seq, [[i + 1]], + tf.expand_dims(topk_ids, axis=0)) + topk_seq = tf.transpose(topk_seq, perm=[1, 2, 0]) + else: + topk_seq = tf.concat([topk_seq, tf.expand_dims(topk_ids, axis=2)], axis=2) + return topk_seq, topk_log_probs, topk_ids, new_cache + + def _get_new_alive_state(self, new_seq, new_log_probs, new_finished_flags, + new_cache): + """Gather the top k sequences that are still alive. + + Args: + new_seq: New sequences generated by growing the current alive sequences + int32 tensor with shape [batch_size, 2 * beam_size, cur_index + 1] + new_log_probs: Log probabilities of new sequences float32 tensor with + shape [batch_size, beam_size] + new_finished_flags: A boolean Tensor indicates which sequences are live + inside the beam. + new_cache: Dict of cached values for each sequence. + + Returns: + Dictionary with alive keys from _StateKeys: + {Top beam_size sequences that are still alive (don't end with eos_id) + Log probabilities of top alive sequences + Dict cache storing decoder states for top alive sequences} + """ + # To prevent finished sequences from being considered, set log probs to -inf + new_log_probs += tf.cast(new_finished_flags, self.dtype) * -inf(self.dtype) + + top_alive_seq, top_alive_log_probs, top_alive_cache = _gather_topk_beams( + [new_seq, new_log_probs, new_cache], new_log_probs, self.batch_size, + self.beam_size) + + return { + _StateKeys.ALIVE_SEQ: top_alive_seq, + _StateKeys.ALIVE_LOG_PROBS: top_alive_log_probs, + _StateKeys.ALIVE_CACHE: top_alive_cache + } + + def _get_new_finished_state(self, state, new_seq, new_log_probs, + new_finished_flags): + """Combine new and old finished sequences, and gather the top k sequences. + + Args: + state: A dictionary with the current loop state. + new_seq: New sequences generated by growing the current alive sequences + int32 tensor with shape [batch_size, beam_size, i + 1] + new_log_probs: Log probabilities of new sequences float32 tensor with + shape [batch_size, beam_size] + new_finished_flags: A boolean Tensor indicates which sequences are live + inside the beam. + + Returns: + Dictionary with finished keys from _StateKeys: + {Top beam_size finished sequences based on score, + Scores of finished sequences, + Finished flags of finished sequences} + """ + i = state[_StateKeys.CUR_INDEX] + finished_seq = state[_StateKeys.FINISHED_SEQ] + finished_scores = state[_StateKeys.FINISHED_SCORES] + finished_flags = state[_StateKeys.FINISHED_FLAGS] + + # First append a column of 0-ids to finished_seq to increment the length. + # New shape of finished_seq: [batch_size, beam_size, i + 1] + if not self.padded_decode: + finished_seq = tf.concat([ + finished_seq, + tf.zeros([self.batch_size, self.beam_size, 1], tf.int32) + ], + axis=2) + + # Calculate new seq scores from log probabilities. + length_norm = _length_normalization(self.alpha, i + 1, dtype=self.dtype) + new_scores = new_log_probs / length_norm + + # Set the scores of the still-alive seq in new_seq to large negative values. + new_scores += ((1. - tf.cast(new_finished_flags, self.dtype)) * + -inf(self.dtype)) + + # Combine sequences, scores, and flags. + finished_seq = tf.concat([finished_seq, new_seq], axis=1) + finished_scores = tf.concat([finished_scores, new_scores], axis=1) + finished_flags = tf.concat([finished_flags, new_finished_flags], axis=1) + + # Return the finished sequences with the best scores. + top_finished_seq, top_finished_scores, top_finished_flags = ( + _gather_topk_beams([finished_seq, finished_scores, finished_flags], + finished_scores, self.batch_size, self.beam_size)) + + return { + _StateKeys.FINISHED_SEQ: top_finished_seq, + _StateKeys.FINISHED_SCORES: top_finished_scores, + _StateKeys.FINISHED_FLAGS: top_finished_flags + } + + +def sequence_beam_search( + symbols_to_logits_fn, initial_ids, initial_cache, vocab_size, beam_size, + alpha, max_decode_length, eos_id, padded_decode=False): + """Search for sequence of subtoken ids with the largest probability. + + Args: + symbols_to_logits_fn: A function that takes in ids, index, and cache as + arguments. The passed in arguments will have shape: + ids -> A tensor with shape [batch_size * beam_size, index]. + index -> A scalar. + cache -> A nested dictionary of tensors [batch_size * beam_size, ...]. + The function must return a tuple of logits and new cache: + logits -> A tensor with shape [batch * beam_size, vocab_size]. + new cache -> A nested dictionary with the same shape/structure as the + inputted cache. + initial_ids: An int32 tensor with shape [batch_size]. Starting ids for + each batch item. + initial_cache: A dictionary, containing starting decoder variables + information. + vocab_size: An integer, the size of the vocabulary, used for topk + computation. + beam_size: An integer, the number of beams. + alpha: A float, defining the strength of length normalization. + max_decode_length: An integer, the maximum length to decoded a sequence. + eos_id: An integer, ID of eos token, used to determine when a sequence has + finished. + padded_decode: A bool, indicating if max_sequence_length padding is used + for beam search. + + Returns: + Top decoded sequences [batch_size, beam_size, max_decode_length] + sequence scores [batch_size, beam_size] + """ + batch_size = ( + initial_ids.shape.as_list()[0] if padded_decode else + tf.shape(initial_ids)[0]) + sbs = SequenceBeamSearch(symbols_to_logits_fn, vocab_size, batch_size, + beam_size, alpha, max_decode_length, eos_id, + padded_decode) + return sbs.search(initial_ids, initial_cache) + + +def _log_prob_from_logits(logits): + return logits - tf.reduce_logsumexp(logits, axis=2, keepdims=True) + + +def _length_normalization(alpha, length, dtype=tf.float32): + """Return length normalization factor.""" + return tf.pow(((5. + tf.cast(length, dtype)) / 6.), alpha) + + +def _expand_to_beam_size(tensor, beam_size): + """Tiles a given tensor by beam_size. + + Args: + tensor: tensor to tile [batch_size, ...] + beam_size: How much to tile the tensor by. + + Returns: + Tiled tensor [batch_size, beam_size, ...] + """ + tensor = tf.expand_dims(tensor, axis=1) + tile_dims = [1] * tensor.shape.ndims + tile_dims[1] = beam_size + + return tf.tile(tensor, tile_dims) + + +def _shape_list(tensor): + """Return a list of the tensor's shape, and ensure no None values in list.""" + # Get statically known shape (may contain None's for unknown dimensions) + shape = tensor.get_shape().as_list() + + # Ensure that the shape values are not None + dynamic_shape = tf.shape(tensor) + for i in range(len(shape)): # pylint: disable=consider-using-enumerate + if shape[i] is None: + shape[i] = dynamic_shape[i] + return shape + + +def _get_shape_keep_last_dim(tensor): + shape_list = _shape_list(tensor) + + # Only the last + for i in range(len(shape_list) - 1): + shape_list[i] = None + + if isinstance(shape_list[-1], tf.Tensor): + shape_list[-1] = None + return tf.TensorShape(shape_list) + + +def _get_shape(tensor): + """Return the shape of the input tensor.""" + return tf.TensorShape(_shape_list(tensor)) + + +def _flatten_beam_dim(tensor): + """Reshapes first two dimensions in to single dimension. + + Args: + tensor: Tensor to reshape of shape [A, B, ...] + + Returns: + Reshaped tensor of shape [A*B, ...] + """ + shape = _shape_list(tensor) + shape[0] *= shape[1] + shape.pop(1) # Remove beam dim + return tf.reshape(tensor, shape) + + +def _unflatten_beam_dim(tensor, batch_size, beam_size): + """Reshapes first dimension back to [batch_size, beam_size]. + + Args: + tensor: Tensor to reshape of shape [batch_size*beam_size, ...] + batch_size: Tensor, original batch size. + beam_size: int, original beam size. + + Returns: + Reshaped tensor of shape [batch_size, beam_size, ...] + """ + shape = _shape_list(tensor) + new_shape = [batch_size, beam_size] + shape[1:] + return tf.reshape(tensor, new_shape) + + +def _gather_beams(nested, beam_indices, batch_size, new_beam_size): + """Gather beams from nested structure of tensors. + + Each tensor in nested represents a batch of beams, where beam refers to a + single search state (beam search involves searching through multiple states + in parallel). + + This function is used to gather the top beams, specified by + beam_indices, from the nested tensors. + + Args: + nested: Nested structure (tensor, list, tuple or dict) containing tensors + with shape [batch_size, beam_size, ...]. + beam_indices: int32 tensor with shape [batch_size, new_beam_size]. Each + value in beam_indices must be between [0, beam_size), and are not + necessarily unique. + batch_size: int size of batch + new_beam_size: int number of beams to be pulled from the nested tensors. + + Returns: + Nested structure containing tensors with shape + [batch_size, new_beam_size, ...] + """ + # Computes the i'th coodinate that contains the batch index for gather_nd. + # Batch pos is a tensor like [[0,0,0,0,],[1,1,1,1],..]. + batch_pos = tf.range(batch_size * new_beam_size) // new_beam_size + batch_pos = tf.reshape(batch_pos, [batch_size, new_beam_size]) + + # Create coordinates to be passed to tf.gather_nd. Stacking creates a tensor + # with shape [batch_size, beam_size, 2], where the last dimension contains + # the (i, j) gathering coordinates. + coordinates = tf.stack([batch_pos, beam_indices], axis=2) + + return nest.map_structure( + lambda state: tf.gather_nd(state, coordinates), nested) + + +def _gather_topk_beams(nested, score_or_log_prob, batch_size, beam_size): + """Gather top beams from nested structure.""" + _, topk_indexes = tf.nn.top_k(score_or_log_prob, k=beam_size) + return _gather_beams(nested, topk_indexes, batch_size, beam_size) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1_test.py new file mode 100644 index 0000000..53cf921 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/beam_search_v1_test.py @@ -0,0 +1,101 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test beam search helper methods.""" + +import tensorflow.compat.v1 as tf + +from official.nlp.transformer import beam_search_v1 as beam_search + + +class BeamSearchHelperTests(tf.test.TestCase): + + def setUp(self): + super(BeamSearchHelperTests, self).setUp() + tf.compat.v1.disable_eager_execution() + + def test_expand_to_beam_size(self): + x = tf.ones([7, 4, 2, 5]) + x = beam_search._expand_to_beam_size(x, 3) + with self.session() as sess: + shape = sess.run(tf.shape(x)) + self.assertAllEqual([7, 3, 4, 2, 5], shape) + + def test_shape_list(self): + y = tf.compat.v1.placeholder(dtype=tf.int32, shape=[]) + x = tf.ones([7, y, 2, 5]) + shape = beam_search._shape_list(x) + self.assertIsInstance(shape[0], int) + self.assertIsInstance(shape[1], tf.Tensor) + self.assertIsInstance(shape[2], int) + self.assertIsInstance(shape[3], int) + + def test_get_shape_keep_last_dim(self): + y = tf.constant(4.0) + x = tf.ones([7, tf.cast(tf.sqrt(y), tf.int32), 2, 5]) + shape = beam_search._get_shape_keep_last_dim(x) + self.assertAllEqual([None, None, None, 5], + shape.as_list()) + + def test_flatten_beam_dim(self): + x = tf.ones([7, 4, 2, 5]) + x = beam_search._flatten_beam_dim(x) + with self.session() as sess: + shape = sess.run(tf.shape(x)) + self.assertAllEqual([28, 2, 5], shape) + + def test_unflatten_beam_dim(self): + x = tf.ones([28, 2, 5]) + x = beam_search._unflatten_beam_dim(x, 7, 4) + with self.session() as sess: + shape = sess.run(tf.shape(x)) + self.assertAllEqual([7, 4, 2, 5], shape) + + def test_gather_beams(self): + x = tf.reshape(tf.range(24), [2, 3, 4]) + # x looks like: [[[ 0 1 2 3] + # [ 4 5 6 7] + # [ 8 9 10 11]] + # + # [[12 13 14 15] + # [16 17 18 19] + # [20 21 22 23]]] + + y = beam_search._gather_beams(x, [[1, 2], [0, 2]], 2, 2) + with self.session() as sess: + y = sess.run(y) + + self.assertAllEqual([[[4, 5, 6, 7], + [8, 9, 10, 11]], + [[12, 13, 14, 15], + [20, 21, 22, 23]]], + y) + + def test_gather_topk_beams(self): + x = tf.reshape(tf.range(24), [2, 3, 4]) + x_scores = [[0, 1, 1], [1, 0, 1]] + + y = beam_search._gather_topk_beams(x, x_scores, 2, 2) + with self.session() as sess: + y = sess.run(y) + + self.assertAllEqual([[[4, 5, 6, 7], + [8, 9, 10, 11]], + [[12, 13, 14, 15], + [20, 21, 22, 23]]], + y) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu.py new file mode 100644 index 0000000..92d54c3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu.py @@ -0,0 +1,148 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Script to compute official BLEU score. + +Source: +https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/bleu_hook.py +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import re +import sys +import unicodedata + +from absl import app as absl_app +from absl import flags +import six +from six.moves import range +import tensorflow as tf + +from official.nlp.transformer.utils import metrics +from official.nlp.transformer.utils import tokenizer +from official.utils.flags import core as flags_core + + +class UnicodeRegex(object): + """Ad-hoc hack to recognize all punctuation and symbols.""" + + def __init__(self): + punctuation = self.property_chars("P") + self.nondigit_punct_re = re.compile(r"([^\d])([" + punctuation + r"])") + self.punct_nondigit_re = re.compile(r"([" + punctuation + r"])([^\d])") + self.symbol_re = re.compile("([" + self.property_chars("S") + "])") + + def property_chars(self, prefix): + return "".join( + six.unichr(x) + for x in range(sys.maxunicode) + if unicodedata.category(six.unichr(x)).startswith(prefix)) + + +uregex = UnicodeRegex() + + +def bleu_tokenize(string): + r"""Tokenize a string following the official BLEU implementation. + + See https://github.com/moses-smt/mosesdecoder/' + 'blob/master/scripts/generic/mteval-v14.pl#L954-L983 + In our case, the input string is expected to be just one line + and no HTML entities de-escaping is needed. + So we just tokenize on punctuation and symbols, + except when a punctuation is preceded and followed by a digit + (e.g. a comma/dot as a thousand/decimal separator). + + Note that a numer (e.g. a year) followed by a dot at the end of sentence + is NOT tokenized, + i.e. the dot stays with the number because `s/(\p{P})(\P{N})/ $1 $2/g` + does not match this case (unless we add a space after each sentence). + However, this error is already in the original mteval-v14.pl + and we want to be consistent with it. + + Args: + string: the input string + + Returns: + a list of tokens + """ + string = uregex.nondigit_punct_re.sub(r"\1 \2 ", string) + string = uregex.punct_nondigit_re.sub(r" \1 \2", string) + string = uregex.symbol_re.sub(r" \1 ", string) + return string.split() + + +def bleu_wrapper(ref_filename, hyp_filename, case_sensitive=False): + """Compute BLEU for two files (reference and hypothesis translation).""" + ref_lines = tokenizer.native_to_unicode( + tf.io.gfile.GFile(ref_filename).read()).strip().splitlines() + hyp_lines = tokenizer.native_to_unicode( + tf.io.gfile.GFile(hyp_filename).read()).strip().splitlines() + + if len(ref_lines) != len(hyp_lines): + raise ValueError( + "Reference and translation files have different number of " + "lines (%d VS %d). If training only a few steps (100-200), the " + "translation may be empty." % (len(ref_lines), len(hyp_lines))) + if not case_sensitive: + ref_lines = [x.lower() for x in ref_lines] + hyp_lines = [x.lower() for x in hyp_lines] + ref_tokens = [bleu_tokenize(x) for x in ref_lines] + hyp_tokens = [bleu_tokenize(x) for x in hyp_lines] + return metrics.compute_bleu(ref_tokens, hyp_tokens) * 100 + + +def main(unused_argv): + if FLAGS.bleu_variant in ("both", "uncased"): + score = bleu_wrapper(FLAGS.reference, FLAGS.translation, False) + tf.logging.info("Case-insensitive results: %f" % score) + + if FLAGS.bleu_variant in ("both", "cased"): + score = bleu_wrapper(FLAGS.reference, FLAGS.translation, True) + tf.logging.info("Case-sensitive results: %f" % score) + + +def define_compute_bleu_flags(): + """Add flags for computing BLEU score.""" + flags.DEFINE_string( + name="translation", + default=None, + help=flags_core.help_wrap("File containing translated text.")) + flags.mark_flag_as_required("translation") + + flags.DEFINE_string( + name="reference", + default=None, + help=flags_core.help_wrap("File containing reference translation.")) + flags.mark_flag_as_required("reference") + + flags.DEFINE_enum( + name="bleu_variant", + short_name="bv", + default="both", + enum_values=["both", "uncased", "cased"], + case_sensitive=False, + help=flags_core.help_wrap( + "Specify one or more BLEU variants to calculate. Variants: \"cased\"" + ", \"uncased\", or \"both\".")) + + +if __name__ == "__main__": + tf.logging.set_verbosity(tf.logging.INFO) + define_compute_bleu_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu_test.py new file mode 100644 index 0000000..6c578e3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/compute_bleu_test.py @@ -0,0 +1,64 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test functions in compute_blue.py.""" + +import tempfile + +import tensorflow as tf + +from official.nlp.transformer import compute_bleu + + +class ComputeBleuTest(tf.test.TestCase): + + def _create_temp_file(self, text): + temp_file = tempfile.NamedTemporaryFile(delete=False) + with tf.io.gfile.GFile(temp_file.name, "w") as w: + w.write(text) + return temp_file.name + + def test_bleu_same(self): + ref = self._create_temp_file("test 1 two 3\nmore tests!") + hyp = self._create_temp_file("test 1 two 3\nmore tests!") + + uncased_score = compute_bleu.bleu_wrapper(ref, hyp, False) + cased_score = compute_bleu.bleu_wrapper(ref, hyp, True) + self.assertEqual(100, uncased_score) + self.assertEqual(100, cased_score) + + def test_bleu_same_different_case(self): + ref = self._create_temp_file("Test 1 two 3\nmore tests!") + hyp = self._create_temp_file("test 1 two 3\nMore tests!") + uncased_score = compute_bleu.bleu_wrapper(ref, hyp, False) + cased_score = compute_bleu.bleu_wrapper(ref, hyp, True) + self.assertEqual(100, uncased_score) + self.assertLess(cased_score, 100) + + def test_bleu_different(self): + ref = self._create_temp_file("Testing\nmore tests!") + hyp = self._create_temp_file("Dog\nCat") + uncased_score = compute_bleu.bleu_wrapper(ref, hyp, False) + cased_score = compute_bleu.bleu_wrapper(ref, hyp, True) + self.assertLess(uncased_score, 100) + self.assertLess(cased_score, 100) + + def test_bleu_tokenize(self): + s = "Test0, 1 two, 3" + tokenized = compute_bleu.bleu_tokenize(s) + self.assertEqual(["Test0", ",", "1", "two", ",", "3"], tokenized) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_download.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_download.py new file mode 100644 index 0000000..54c5434 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_download.py @@ -0,0 +1,439 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Download and preprocess WMT17 ende training and evaluation datasets.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import random +import tarfile + +# pylint: disable=g-bad-import-order +from absl import app as absl_app +from absl import flags +from absl import logging +import six +from six.moves import range +from six.moves import urllib +from six.moves import zip +import tensorflow.compat.v1 as tf + +from official.nlp.transformer.utils import tokenizer +from official.utils.flags import core as flags_core +# pylint: enable=g-bad-import-order + +# Data sources for training/evaluating the transformer translation model. +# If any of the training sources are changed, then either: +# 1) use the flag `--search` to find the best min count or +# 2) update the _TRAIN_DATA_MIN_COUNT constant. +# min_count is the minimum number of times a token must appear in the data +# before it is added to the vocabulary. "Best min count" refers to the value +# that generates a vocabulary set that is closest in size to _TARGET_VOCAB_SIZE. +_TRAIN_DATA_SOURCES = [ + { + "url": "http://data.statmt.org/wmt17/translation-task/" + "training-parallel-nc-v12.tgz", + "input": "news-commentary-v12.de-en.en", + "target": "news-commentary-v12.de-en.de", + }, + { + "url": "http://www.statmt.org/wmt13/training-parallel-commoncrawl.tgz", + "input": "commoncrawl.de-en.en", + "target": "commoncrawl.de-en.de", + }, + { + "url": "http://www.statmt.org/wmt13/training-parallel-europarl-v7.tgz", + "input": "europarl-v7.de-en.en", + "target": "europarl-v7.de-en.de", + }, +] +# Use pre-defined minimum count to generate subtoken vocabulary. +_TRAIN_DATA_MIN_COUNT = 6 + +_EVAL_DATA_SOURCES = [ + { + "url": "http://data.statmt.org/wmt17/translation-task/dev.tgz", + "input": "newstest2013.en", + "target": "newstest2013.de", + } +] + +_TEST_DATA_SOURCES = [ + { + "url": ("https://storage.googleapis.com/tf-perf-public/" + "official_transformer/test_data/newstest2014.tgz"), + "input": "newstest2014.en", + "target": "newstest2014.de", + } +] + +# Vocabulary constants +_TARGET_VOCAB_SIZE = 32768 # Number of subtokens in the vocabulary list. +_TARGET_THRESHOLD = 327 # Accept vocabulary if size is within this threshold +VOCAB_FILE = "vocab.ende.%d" % _TARGET_VOCAB_SIZE + +# Strings to inclue in the generated files. +_PREFIX = "wmt32k" +_TRAIN_TAG = "train" +_EVAL_TAG = "dev" # Following WMT and Tensor2Tensor conventions, in which the +# evaluation datasets are tagged as "dev" for development. + +# Number of files to split train and evaluation data +_TRAIN_SHARDS = 100 +_EVAL_SHARDS = 1 + + +def find_file(path, filename, max_depth=5): + """Returns full filepath if the file is in path or a subdirectory.""" + for root, dirs, files in os.walk(path): + if filename in files: + return os.path.join(root, filename) + + # Don't search past max_depth + depth = root[len(path) + 1:].count(os.sep) + if depth > max_depth: + del dirs[:] # Clear dirs + return None + + +############################################################################### +# Download and extraction functions +############################################################################### +def get_raw_files(raw_dir, data_source): + """Return raw files from source. Downloads/extracts if needed. + + Args: + raw_dir: string directory to store raw files + data_source: dictionary with + {"url": url of compressed dataset containing input and target files + "input": file with data in input language + "target": file with data in target language} + + Returns: + dictionary with + {"inputs": list of files containing data in input language + "targets": list of files containing corresponding data in target language + } + """ + raw_files = { + "inputs": [], + "targets": [], + } # keys + for d in data_source: + input_file, target_file = download_and_extract( + raw_dir, d["url"], d["input"], d["target"]) + raw_files["inputs"].append(input_file) + raw_files["targets"].append(target_file) + return raw_files + + +def download_report_hook(count, block_size, total_size): + """Report hook for download progress. + + Args: + count: current block number + block_size: block size + total_size: total size + """ + percent = int(count * block_size * 100 / total_size) + print(six.ensure_str("\r%d%%" % percent) + " completed", end="\r") + + +def download_from_url(path, url): + """Download content from a url. + + Args: + path: string directory where file will be downloaded + url: string url + + Returns: + Full path to downloaded file + """ + filename = six.ensure_str(url).split("/")[-1] + found_file = find_file(path, filename, max_depth=0) + if found_file is None: + filename = os.path.join(path, filename) + logging.info("Downloading from %s to %s." % (url, filename)) + inprogress_filepath = six.ensure_str(filename) + ".incomplete" + inprogress_filepath, _ = urllib.request.urlretrieve( + url, inprogress_filepath, reporthook=download_report_hook) + # Print newline to clear the carriage return from the download progress. + print() + tf.gfile.Rename(inprogress_filepath, filename) + return filename + else: + logging.info("Already downloaded: %s (at %s)." % (url, found_file)) + return found_file + + +def download_and_extract(path, url, input_filename, target_filename): + """Extract files from downloaded compressed archive file. + + Args: + path: string directory where the files will be downloaded + url: url containing the compressed input and target files + input_filename: name of file containing data in source language + target_filename: name of file containing data in target language + + Returns: + Full paths to extracted input and target files. + + Raises: + OSError: if the the download/extraction fails. + """ + # Check if extracted files already exist in path + input_file = find_file(path, input_filename) + target_file = find_file(path, target_filename) + if input_file and target_file: + logging.info("Already downloaded and extracted %s." % url) + return input_file, target_file + + # Download archive file if it doesn't already exist. + compressed_file = download_from_url(path, url) + + # Extract compressed files + logging.info("Extracting %s." % compressed_file) + with tarfile.open(compressed_file, "r:gz") as corpus_tar: + corpus_tar.extractall(path) + + # Return file paths of the requested files. + input_file = find_file(path, input_filename) + target_file = find_file(path, target_filename) + + if input_file and target_file: + return input_file, target_file + + raise OSError("Download/extraction failed for url %s to path %s" % + (url, path)) + + +def txt_line_iterator(path): + """Iterate through lines of file.""" + with tf.io.gfile.GFile(path) as f: + for line in f: + yield line.strip() + + +def compile_files(raw_dir, raw_files, tag): + """Compile raw files into a single file for each language. + + Args: + raw_dir: Directory containing downloaded raw files. + raw_files: Dict containing filenames of input and target data. + {"inputs": list of files containing data in input language + "targets": list of files containing corresponding data in target language + } + tag: String to append to the compiled filename. + + Returns: + Full path of compiled input and target files. + """ + logging.info("Compiling files with tag %s." % tag) + filename = "%s-%s" % (_PREFIX, tag) + input_compiled_file = os.path.join(raw_dir, + six.ensure_str(filename) + ".lang1") + target_compiled_file = os.path.join(raw_dir, + six.ensure_str(filename) + ".lang2") + + with tf.io.gfile.GFile(input_compiled_file, mode="w") as input_writer: + with tf.io.gfile.GFile(target_compiled_file, mode="w") as target_writer: + for i in range(len(raw_files["inputs"])): + input_file = raw_files["inputs"][i] + target_file = raw_files["targets"][i] + + logging.info("Reading files %s and %s." % (input_file, target_file)) + write_file(input_writer, input_file) + write_file(target_writer, target_file) + return input_compiled_file, target_compiled_file + + +def write_file(writer, filename): + """Write all of lines from file using the writer.""" + for line in txt_line_iterator(filename): + writer.write(line) + writer.write("\n") + + +############################################################################### +# Data preprocessing +############################################################################### +def encode_and_save_files( + subtokenizer, data_dir, raw_files, tag, total_shards): + """Save data from files as encoded Examples in TFrecord format. + + Args: + subtokenizer: Subtokenizer object that will be used to encode the strings. + data_dir: The directory in which to write the examples + raw_files: A tuple of (input, target) data files. Each line in the input and + the corresponding line in target file will be saved in a tf.Example. + tag: String that will be added onto the file names. + total_shards: Number of files to divide the data into. + + Returns: + List of all files produced. + """ + # Create a file for each shard. + filepaths = [shard_filename(data_dir, tag, n + 1, total_shards) + for n in range(total_shards)] + + if all_exist(filepaths): + logging.info("Files with tag %s already exist." % tag) + return filepaths + + logging.info("Saving files with tag %s." % tag) + input_file = raw_files[0] + target_file = raw_files[1] + + # Write examples to each shard in round robin order. + tmp_filepaths = [six.ensure_str(fname) + ".incomplete" for fname in filepaths] + writers = [tf.python_io.TFRecordWriter(fname) for fname in tmp_filepaths] + counter, shard = 0, 0 + for counter, (input_line, target_line) in enumerate(zip( + txt_line_iterator(input_file), txt_line_iterator(target_file))): + if counter > 0 and counter % 100000 == 0: + logging.info("\tSaving case %d." % counter) + example = dict_to_example( + {"inputs": subtokenizer.encode(input_line, add_eos=True), + "targets": subtokenizer.encode(target_line, add_eos=True)}) + writers[shard].write(example.SerializeToString()) + shard = (shard + 1) % total_shards + for writer in writers: + writer.close() + + for tmp_name, final_name in zip(tmp_filepaths, filepaths): + tf.gfile.Rename(tmp_name, final_name) + + logging.info("Saved %d Examples", counter + 1) + return filepaths + + +def shard_filename(path, tag, shard_num, total_shards): + """Create filename for data shard.""" + return os.path.join( + path, "%s-%s-%.5d-of-%.5d" % (_PREFIX, tag, shard_num, total_shards)) + + +def shuffle_records(fname): + """Shuffle records in a single file.""" + logging.info("Shuffling records in file %s" % fname) + + # Rename file prior to shuffling + tmp_fname = six.ensure_str(fname) + ".unshuffled" + tf.gfile.Rename(fname, tmp_fname) + + reader = tf.io.tf_record_iterator(tmp_fname) + records = [] + for record in reader: + records.append(record) + if len(records) % 100000 == 0: + logging.info("\tRead: %d", len(records)) + + random.shuffle(records) + + # Write shuffled records to original file name + with tf.python_io.TFRecordWriter(fname) as w: + for count, record in enumerate(records): + w.write(record) + if count > 0 and count % 100000 == 0: + logging.info("\tWriting record: %d" % count) + + tf.gfile.Remove(tmp_fname) + + +def dict_to_example(dictionary): + """Converts a dictionary of string->int to a tf.Example.""" + features = {} + for k, v in six.iteritems(dictionary): + features[k] = tf.train.Feature(int64_list=tf.train.Int64List(value=v)) + return tf.train.Example(features=tf.train.Features(feature=features)) + + +def all_exist(filepaths): + """Returns true if all files in the list exist.""" + for fname in filepaths: + if not tf.gfile.Exists(fname): + return False + return True + + +def make_dir(path): + if not tf.gfile.Exists(path): + logging.info("Creating directory %s" % path) + tf.gfile.MakeDirs(path) + + +def main(unused_argv): + """Obtain training and evaluation data for the Transformer model.""" + make_dir(FLAGS.raw_dir) + make_dir(FLAGS.data_dir) + + # Download test_data + logging.info("Step 1/5: Downloading test data") + train_files = get_raw_files(FLAGS.data_dir, _TEST_DATA_SOURCES) + + # Get paths of download/extracted training and evaluation files. + logging.info("Step 2/5: Downloading data from source") + train_files = get_raw_files(FLAGS.raw_dir, _TRAIN_DATA_SOURCES) + eval_files = get_raw_files(FLAGS.raw_dir, _EVAL_DATA_SOURCES) + + # Create subtokenizer based on the training files. + logging.info("Step 3/5: Creating subtokenizer and building vocabulary") + train_files_flat = train_files["inputs"] + train_files["targets"] + vocab_file = os.path.join(FLAGS.data_dir, VOCAB_FILE) + subtokenizer = tokenizer.Subtokenizer.init_from_files( + vocab_file, train_files_flat, _TARGET_VOCAB_SIZE, _TARGET_THRESHOLD, + min_count=None if FLAGS.search else _TRAIN_DATA_MIN_COUNT) + + logging.info("Step 4/5: Compiling training and evaluation data") + compiled_train_files = compile_files(FLAGS.raw_dir, train_files, _TRAIN_TAG) + compiled_eval_files = compile_files(FLAGS.raw_dir, eval_files, _EVAL_TAG) + + # Tokenize and save data as Examples in the TFRecord format. + logging.info("Step 5/5: Preprocessing and saving data") + train_tfrecord_files = encode_and_save_files( + subtokenizer, FLAGS.data_dir, compiled_train_files, _TRAIN_TAG, + _TRAIN_SHARDS) + encode_and_save_files( + subtokenizer, FLAGS.data_dir, compiled_eval_files, _EVAL_TAG, + _EVAL_SHARDS) + + for fname in train_tfrecord_files: + shuffle_records(fname) + + +def define_data_download_flags(): + """Add flags specifying data download arguments.""" + flags.DEFINE_string( + name="data_dir", short_name="dd", default="/tmp/translate_ende", + help=flags_core.help_wrap( + "Directory for where the translate_ende_wmt32k dataset is saved.")) + flags.DEFINE_string( + name="raw_dir", short_name="rd", default="/tmp/translate_ende_raw", + help=flags_core.help_wrap( + "Path where the raw data will be downloaded and extracted.")) + flags.DEFINE_bool( + name="search", default=False, + help=flags_core.help_wrap( + "If set, use binary search to find the vocabulary set with size" + "closest to the target size (%d)." % _TARGET_VOCAB_SIZE)) + + +if __name__ == "__main__": + logging.set_verbosity(logging.INFO) + define_data_download_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_pipeline.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_pipeline.py new file mode 100644 index 0000000..a9a1621 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/data_pipeline.py @@ -0,0 +1,317 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Input pipeline for the transformer model to read, filter, and batch examples. + +Two things to note in the pipeline: + +1. Batching scheme + + The examples encoded in the TFRecord files contain data in the format: + {"inputs": [variable length array of integers], + "targets": [variable length array of integers]} + Where integers in the arrays refer to tokens in the English and German vocab + file (named `vocab.ende.32768`). + + Prior to batching, elements in the dataset are grouped by length (max between + "inputs" and "targets" length). Each group is then batched such that: + group_batch_size * length <= batch_size. + + Another way to view batch_size is the maximum number of tokens in each batch. + + Once batched, each element in the dataset will have the shape: + {"inputs": [group_batch_size, padded_input_length], + "targets": [group_batch_size, padded_target_length]} + Lengths are padded to the longest "inputs" or "targets" sequence in the batch + (padded_input_length and padded_target_length can be different). + + This batching scheme decreases the fraction of padding tokens per training + batch, thus improving the training speed significantly. + +2. Shuffling + + While training, the dataset is shuffled in two places in the code. The first + is the list of training files. Second, while reading records using + `parallel_interleave`, the `sloppy` argument is used to generate randomness + in the order of the examples. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import os + +from absl import logging +import tensorflow as tf + +from official.nlp.transformer import misc +from official.utils.misc import model_helpers + +# Buffer size for reading records from a TFRecord file. Each training file is +# 7.2 MB, so 8 MB allows an entire file to be kept in memory. +_READ_RECORD_BUFFER = 8 * 1000 * 1000 + +# Example grouping constants. Defines length boundaries for each group. +# These values are the defaults used in Tensor2Tensor. +_MIN_BOUNDARY = 8 +_BOUNDARY_SCALE = 1.1 + + +def _load_records(filename): + """Read file and return a dataset of tf.Examples.""" + return tf.data.TFRecordDataset(filename, buffer_size=_READ_RECORD_BUFFER) + + +def _parse_example(serialized_example): + """Return inputs and targets Tensors from a serialized tf.Example.""" + data_fields = { + "inputs": tf.io.VarLenFeature(tf.int64), + "targets": tf.io.VarLenFeature(tf.int64) + } + parsed = tf.io.parse_single_example(serialized_example, data_fields) + inputs = tf.sparse.to_dense(parsed["inputs"]) + targets = tf.sparse.to_dense(parsed["targets"]) + return inputs, targets + + +def _filter_max_length(example, max_length=256): + """Indicates whether the example's length is lower than the maximum length.""" + return tf.logical_and(tf.size(example[0]) <= max_length, + tf.size(example[1]) <= max_length) + + +def _get_example_length(example): + """Returns the maximum length between the example inputs and targets.""" + length = tf.maximum(tf.shape(example[0])[0], tf.shape(example[1])[0]) + return length + + +def _create_min_max_boundaries( + max_length, min_boundary=_MIN_BOUNDARY, boundary_scale=_BOUNDARY_SCALE): + """Create min and max boundary lists up to max_length. + + For example, when max_length=24, min_boundary=4 and boundary_scale=2, the + returned values will be: + buckets_min = [0, 4, 8, 16, 24] + buckets_max = [4, 8, 16, 24, 25] + + Args: + max_length: The maximum length of example in dataset. + min_boundary: Minimum length in boundary. + boundary_scale: Amount to scale consecutive boundaries in the list. + + Returns: + min and max boundary lists + + """ + # Create bucket boundaries list by scaling the previous boundary or adding 1 + # (to ensure increasing boundary sizes). + bucket_boundaries = [] + x = min_boundary + while x < max_length: + bucket_boundaries.append(x) + x = max(x + 1, int(x * boundary_scale)) + + # Create min and max boundary lists from the initial list. + buckets_min = [0] + bucket_boundaries + buckets_max = bucket_boundaries + [max_length + 1] + return buckets_min, buckets_max + + +def _batch_examples(dataset, batch_size, max_length): + """Group examples by similar lengths, and return batched dataset. + + Each batch of similar-length examples are padded to the same length, and may + have different number of elements in each batch, such that: + group_batch_size * padded_length <= batch_size. + + This decreases the number of padding tokens per batch, which improves the + training speed. + + Args: + dataset: Dataset of unbatched examples. + batch_size: Max number of tokens per batch of examples. + max_length: Max number of tokens in an example input or target sequence. + + Returns: + Dataset of batched examples with similar lengths. + """ + # Get min and max boundary lists for each example. These are used to calculate + # the `bucket_id`, which is the index at which: + # buckets_min[bucket_id] <= len(example) < buckets_max[bucket_id] + # Note that using both min and max lists improves the performance. + buckets_min, buckets_max = _create_min_max_boundaries(max_length) + + # Create list of batch sizes for each bucket_id, so that + # bucket_batch_size[bucket_id] * buckets_max[bucket_id] <= batch_size + bucket_batch_sizes = [batch_size // x for x in buckets_max] + # bucket_id will be a tensor, so convert this list to a tensor as well. + bucket_batch_sizes = tf.constant(bucket_batch_sizes, dtype=tf.int64) + + def example_to_bucket_id(example_input, example_target): + """Return int64 bucket id for this example, calculated based on length.""" + seq_length = _get_example_length((example_input, example_target)) + + # TODO(xunkai): investigate if removing code branching improves performance. + conditions_c = tf.logical_and( + tf.less_equal(buckets_min, seq_length), + tf.less(seq_length, buckets_max)) + bucket_id = tf.reduce_min(tf.where(conditions_c)) + return bucket_id + + def window_size_fn(bucket_id): + """Return number of examples to be grouped when given a bucket id.""" + return bucket_batch_sizes[bucket_id] + + def batching_fn(bucket_id, grouped_dataset): + """Batch and add padding to a dataset of elements with similar lengths.""" + bucket_batch_size = window_size_fn(bucket_id) + + # Batch the dataset and add padding so that all input sequences in the + # examples have the same length, and all target sequences have the same + # lengths as well. Resulting lengths of inputs and targets can differ. + return grouped_dataset.padded_batch(bucket_batch_size, ([None], [None])) + + return dataset.apply(tf.data.experimental.group_by_window( + key_func=example_to_bucket_id, + reduce_func=batching_fn, + window_size=None, + window_size_func=window_size_fn)) + + +def _read_and_batch_from_files( + file_pattern, batch_size, max_length, num_parallel_calls, shuffle, repeat, + static_batch=False, num_replicas=1, ctx=None): + """Create dataset where each item is a dict of "inputs" and "targets". + + Args: + file_pattern: String used to match the input TFRecord files. + batch_size: Maximum number of tokens per global batch of examples. + max_length: Maximum number of tokens per example + num_parallel_calls: Number of cpu cores for parallel input processing. + shuffle: If true, randomizes order of elements. + repeat: Number of times to repeat the dataset. If None, the dataset is + repeated forever. + static_batch: Whether the batches in the dataset should have static shapes. + If True, the input is batched so that every batch has the + shape [batch_size // max_length, max_length]. If False, the input is + grouped by length, and batched so that batches may have different + shapes [N, M], where: + N * M <= batch_size + M <= max_length + In general, this setting should be False. Dynamic shapes allow the inputs + to be grouped so that the number of padding tokens is minimized, and helps + model training. In cases where the input shape must be static + (e.g. running on TPU), this setting should be set to True. + num_replicas: Number of GPUs or other workers. We will generate global + batches, and each global batch is equally divisible by number of replicas. + Currently it is only effective when static_batch==True. TODO: make it + effective when static_batch=False. + ctx: Input context. + + Returns: + tf.data.Dataset object containing examples loaded from the files. + """ + dataset = tf.data.Dataset.list_files(file_pattern, shuffle=shuffle) + + if ctx and ctx.num_input_pipelines > 1: + logging.info("Shard %d of the dataset.", ctx.input_pipeline_id) + dataset = dataset.shard(ctx.num_input_pipelines, ctx.input_pipeline_id) + + # Read files and interleave results. When training, the order of the examples + # will be non-deterministic. + options = tf.data.Options() + options.experimental_deterministic = False + dataset = dataset.interleave( + _load_records, + cycle_length=num_parallel_calls, + num_parallel_calls=tf.data.experimental.AUTOTUNE).with_options(options) + + # Parse each tf.Example into a dictionary + # TODO: Look into prefetch_input_elements for performance optimization. + dataset = dataset.map(_parse_example, + num_parallel_calls=num_parallel_calls) + + # Remove examples where the input or target length exceeds the maximum length, + dataset = dataset.filter(lambda x, y: _filter_max_length((x, y), max_length)) + + if static_batch: + dataset = dataset.padded_batch( + # First calculate batch size (token number) per worker, then divide it + # into sentences, and finally expand to a global batch. It could prove + # the global batch divisble for distribution strategy. + int(batch_size // num_replicas // max_length * num_replicas), + ([max_length], [max_length]), drop_remainder=True) + else: + # Group and batch such that each batch has examples of similar length. + # TODO(xunkai): _batch_examples might need to do something special for + # num_replicas. + dataset = _batch_examples(dataset, batch_size, max_length) + + dataset = dataset.repeat(repeat) + + # Prefetch the next element to improve speed of input pipeline. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return dataset + + +def _generate_synthetic_data(params): + """Create synthetic data based on the parameter batch size.""" + batch = length = int(math.sqrt(params["batch_size"])) + dataset = model_helpers.generate_synthetic_data( + input_shape=tf.TensorShape([length]), + input_value=1, + input_dtype=tf.int64, + label_shape=tf.TensorShape([length]), + label_value=1, + label_dtype=tf.int64, + ) + return dataset.batch(batch, drop_remainder=True) + + +def train_input_fn(params, ctx=None): + """Load and return dataset of batched examples for use during training.""" + file_pattern = os.path.join(params["data_dir"] or "", "*train*") + if params["use_synthetic_data"]: + return _generate_synthetic_data(params) + return _read_and_batch_from_files( + file_pattern, params["batch_size"], params["max_length"], + params["num_parallel_calls"], shuffle=True, + repeat=params["repeat_dataset"], static_batch=params["static_batch"], + num_replicas=params["num_gpus"], ctx=ctx) + + +def eval_input_fn(params, ctx=None): + """Load and return dataset of batched examples for use during evaluation.""" + file_pattern = os.path.join(params["data_dir"] or "", "*dev*") + if params["use_synthetic_data"]: + return _generate_synthetic_data(params) + return _read_and_batch_from_files( + file_pattern, params["batch_size"], params["max_length"], + params["num_parallel_calls"], shuffle=False, repeat=1, + static_batch=params["static_batch"], num_replicas=params["num_gpus"], + ctx=ctx) + + +def map_data_for_transformer_fn(x, y): + """Maps data for training, and handles weried behaviors for different vers.""" + # Will transform input x and targets y into tuple(x, y) as new model inputs. + if misc.is_v2(): + # For TF v2, the 2nd parameter is omitted to make Keras training work. + return ((x, y),) + else: + # For TF v1, Keras requires a dummy placeholder as the 2nd parameter. + return ((x, y), tf.constant(0.0)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/embedding_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/embedding_layer.py new file mode 100644 index 0000000..6694e2b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/embedding_layer.py @@ -0,0 +1,103 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of embedding layer with shared weights.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +class EmbeddingSharedWeights(tf.keras.layers.Layer): + """Calculates input embeddings and pre-softmax linear with shared weights.""" + + def __init__(self, vocab_size, hidden_size): + """Specify characteristic parameters of embedding layer. + + Args: + vocab_size: Number of tokens in the embedding. (Typically ~32,000) + hidden_size: Dimensionality of the embedding. (Typically 512 or 1024) + """ + super(EmbeddingSharedWeights, self).__init__() + self.vocab_size = vocab_size + self.hidden_size = hidden_size + + def build(self, input_shape): + """Build embedding layer.""" + with tf.name_scope("embedding_and_softmax"): + # Create and initialize weights. The random normal initializer was chosen + # arbitrarily, and works well. + self.shared_weights = self.add_weight( + "weights", + shape=[self.vocab_size, self.hidden_size], + initializer=tf.random_normal_initializer( + mean=0., stddev=self.hidden_size**-0.5)) + super(EmbeddingSharedWeights, self).build(input_shape) + + def get_config(self): + return { + "vocab_size": self.vocab_size, + "hidden_size": self.hidden_size, + } + + def call(self, inputs, mode="embedding"): + """Get token embeddings of inputs. + + Args: + inputs: An int64 tensor with shape [batch_size, length] + mode: string, a valid value is one of "embedding" and "linear". + Returns: + outputs: (1) If mode == "embedding", output embedding tensor, float32 with + shape [batch_size, length, embedding_size]; (2) mode == "linear", output + linear tensor, float32 with shape [batch_size, length, vocab_size]. + Raises: + ValueError: if mode is not valid. + """ + if mode == "embedding": + return self._embedding(inputs) + elif mode == "linear": + return self._linear(inputs) + else: + raise ValueError("mode {} is not valid.".format(mode)) + + def _embedding(self, inputs): + """Applies embedding based on inputs tensor.""" + with tf.name_scope("embedding"): + # Create binary mask of size [batch_size, length] + embeddings = tf.gather(self.shared_weights, inputs) + mask = tf.cast(tf.not_equal(inputs, 0), embeddings.dtype) + embeddings *= tf.expand_dims(mask, -1) + # Scale embedding by the sqrt of the hidden size + embeddings *= self.hidden_size ** 0.5 + + return embeddings + + def _linear(self, inputs): + """Computes logits by running inputs through a linear layer. + + Args: + inputs: A float32 tensor with shape [batch_size, length, hidden_size] + Returns: + float32 tensor with shape [batch_size, length, vocab_size]. + """ + with tf.name_scope("presoftmax_linear"): + batch_size = tf.shape(inputs)[0] + length = tf.shape(inputs)[1] + + x = tf.reshape(inputs, [-1, self.hidden_size]) + logits = tf.matmul(x, self.shared_weights, transpose_b=True) + + return tf.reshape(logits, [batch_size, length, self.vocab_size]) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/ffn_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/ffn_layer.py new file mode 100644 index 0000000..a7785f2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/ffn_layer.py @@ -0,0 +1,77 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of fully connected network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +class FeedForwardNetwork(tf.keras.layers.Layer): + """Fully connected feedforward network.""" + + def __init__(self, hidden_size, filter_size, relu_dropout): + """Initialize FeedForwardNetwork. + + Args: + hidden_size: int, output dim of hidden layer. + filter_size: int, filter size for the inner (first) dense layer. + relu_dropout: float, dropout rate for training. + """ + super(FeedForwardNetwork, self).__init__() + self.hidden_size = hidden_size + self.filter_size = filter_size + self.relu_dropout = relu_dropout + + def build(self, input_shape): + self.filter_dense_layer = tf.keras.layers.Dense( + self.filter_size, + use_bias=True, + activation=tf.nn.relu, + name="filter_layer") + self.output_dense_layer = tf.keras.layers.Dense( + self.hidden_size, use_bias=True, name="output_layer") + super(FeedForwardNetwork, self).build(input_shape) + + def get_config(self): + return { + "hidden_size": self.hidden_size, + "filter_size": self.filter_size, + "relu_dropout": self.relu_dropout, + } + + def call(self, x, training): + """Return outputs of the feedforward network. + + Args: + x: tensor with shape [batch_size, length, hidden_size] + training: boolean, whether in training mode or not. + + Returns: + Output of the feedforward network. + tensor with shape [batch_size, length, hidden_size] + """ + # Retrieve dynamically known shapes + batch_size = tf.shape(x)[0] + length = tf.shape(x)[1] + + output = self.filter_dense_layer(x) + if training: + output = tf.nn.dropout(output, rate=self.relu_dropout) + output = self.output_dense_layer(output) + + return output diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/metrics.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/metrics.py new file mode 100644 index 0000000..4bd6bba --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/metrics.py @@ -0,0 +1,183 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions for calculating loss, accuracy, and other model metrics. + +Metrics: + - Padded loss, accuracy, and negative log perplexity. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/metrics.py + - BLEU approximation. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/bleu_hook.py + - ROUGE score. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/rouge.py +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools + +import tensorflow as tf + + +def _pad_tensors_to_same_length(x, y): + """Pad x and y so that the results have the same length (second dimension).""" + with tf.name_scope("pad_to_same_length"): + x_length = tf.shape(x)[1] + y_length = tf.shape(y)[1] + + max_length = tf.maximum(x_length, y_length) + + x = tf.pad(x, [[0, 0], [0, max_length - x_length], [0, 0]]) + y = tf.pad(y, [[0, 0], [0, max_length - y_length]]) + return x, y + + +def padded_cross_entropy_loss(logits, labels, smoothing, vocab_size): + """Calculate cross entropy loss while ignoring padding. + + Args: + logits: Tensor of size [batch_size, length_logits, vocab_size] + labels: Tensor of size [batch_size, length_labels] + smoothing: Label smoothing constant, used to determine the on and off values + vocab_size: int size of the vocabulary + + Returns: + Returns the cross entropy loss and weight tensors: float32 tensors with + shape [batch_size, max(length_logits, length_labels)] + """ + with tf.name_scope("loss"): + logits, labels = _pad_tensors_to_same_length(logits, labels) + + # Calculate smoothing cross entropy + with tf.name_scope("smoothing_cross_entropy"): + confidence = 1.0 - smoothing + low_confidence = (1.0 - confidence) / tf.cast(vocab_size - 1, tf.float32) + soft_targets = tf.one_hot( + tf.cast(labels, tf.int32), + depth=vocab_size, + on_value=confidence, + off_value=low_confidence) + xentropy = tf.nn.softmax_cross_entropy_with_logits( + logits=logits, labels=soft_targets) + + # Calculate the best (lowest) possible value of cross entropy, and + # subtract from the cross entropy loss. + normalizing_constant = -( + confidence * tf.math.log(confidence) + + tf.cast(vocab_size - 1, tf.float32) * low_confidence * + tf.math.log(low_confidence + 1e-20)) + xentropy -= normalizing_constant + + weights = tf.cast(tf.not_equal(labels, 0), tf.float32) + return xentropy * weights, weights + + +def padded_accuracy(logits, labels): + """Percentage of times that predictions matches labels on non-0s.""" + with tf.name_scope("padded_accuracy"): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.cast(tf.not_equal(labels, 0), tf.float32) + outputs = tf.cast(tf.argmax(logits, axis=-1), tf.int32) + padded_labels = tf.cast(labels, tf.int32) + return tf.cast(tf.equal(outputs, padded_labels), tf.float32), weights + + +def padded_accuracy_topk(logits, labels, k): + """Percentage of times that top-k predictions matches labels on non-0s.""" + with tf.name_scope("padded_accuracy_topk"): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.cast(tf.not_equal(labels, 0), tf.float32) + effective_k = tf.minimum(k, tf.shape(logits)[-1]) + _, outputs = tf.nn.top_k(logits, k=effective_k) + outputs = tf.cast(outputs, tf.int32) + padded_labels = tf.cast(labels, tf.int32) + padded_labels = tf.expand_dims(padded_labels, axis=-1) + padded_labels += tf.zeros_like(outputs) # Pad to same shape. + same = tf.cast(tf.equal(outputs, padded_labels), tf.float32) + same_topk = tf.reduce_sum(same, axis=-1) + return same_topk, weights + + +def padded_accuracy_top5(logits, labels): + return padded_accuracy_topk(logits, labels, 5) + + +def padded_sequence_accuracy(logits, labels): + """Percentage of times that predictions matches labels everywhere (non-0).""" + with tf.name_scope("padded_sequence_accuracy"): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.cast(tf.not_equal(labels, 0), tf.float32) + outputs = tf.cast(tf.argmax(logits, axis=-1), tf.int32) + padded_labels = tf.cast(labels, tf.int32) + not_correct = tf.cast(tf.not_equal(outputs, padded_labels), + tf.float32) * weights + axis = list(range(1, len(outputs.get_shape()))) + correct_seq = 1.0 - tf.minimum(1.0, tf.reduce_sum(not_correct, axis=axis)) + return correct_seq, tf.constant(1.0) + + +def padded_neg_log_perplexity(logits, labels, vocab_size): + """Average log-perplexity excluding padding 0s. No smoothing.""" + num, den = padded_cross_entropy_loss(logits, labels, 0, vocab_size) + return -num, den + + +class MetricLayer(tf.keras.layers.Layer): + """Custom a layer of metrics for Transformer model.""" + + def __init__(self, vocab_size): + super(MetricLayer, self).__init__() + self.vocab_size = vocab_size + self.metric_mean_fns = [] + + def build(self, input_shape): + """"Builds metric layer.""" + neg_log_perplexity = functools.partial( + padded_neg_log_perplexity, vocab_size=self.vocab_size) + self.metric_mean_fns = [ + (tf.keras.metrics.Mean("accuracy"), padded_accuracy), + (tf.keras.metrics.Mean("accuracy_top5"), padded_accuracy_top5), + (tf.keras.metrics.Mean("accuracy_per_sequence"), + padded_sequence_accuracy), + (tf.keras.metrics.Mean("neg_log_perplexity"), neg_log_perplexity), + ] + super(MetricLayer, self).build(input_shape) + + def get_config(self): + return {"vocab_size": self.vocab_size} + + def call(self, inputs): + logits, targets = inputs[0], inputs[1] + for mean, fn in self.metric_mean_fns: + m = mean(*fn(logits, targets)) + self.add_metric(m) + return logits + + +def transformer_loss(logits, labels, smoothing, vocab_size): + """Calculates total loss containing cross entropy with padding ignored. + + Args: + logits: Tensor of size [batch_size, length_logits, vocab_size] + labels: Tensor of size [batch_size, length_labels] + smoothing: Label smoothing constant, used to determine the on and off values + vocab_size: int size of the vocabulary + + Returns: + A scalar float tensor for loss. + """ + xentropy, weights = padded_cross_entropy_loss(logits, labels, smoothing, + vocab_size) + return tf.reduce_sum(xentropy) / tf.reduce_sum(weights) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/misc.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/misc.py new file mode 100644 index 0000000..3eb430f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/misc.py @@ -0,0 +1,296 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Misc for Transformer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# pylint: disable=g-bad-import-order +from absl import flags +import tensorflow as tf + +# TODO(tianlin) Import internal library. Remove this when some functions for +# different TF versions are fixed. +from tensorflow.python import tf2 as tf2_internal + +from official.nlp.transformer import model_params +from official.utils.flags import core as flags_core +from official.utils.misc import keras_utils + +FLAGS = flags.FLAGS + +PARAMS_MAP = { + 'tiny': model_params.TINY_PARAMS, + 'base': model_params.BASE_PARAMS, + 'big': model_params.BIG_PARAMS, +} + + +def is_v2(): + """Returns whether it is v2.""" + return tf2_internal.enabled() + + +def get_model_params(param_set, num_gpus): + """Gets predefined model params.""" + if num_gpus > 1: + if param_set == 'big': + return model_params.BIG_MULTI_GPU_PARAMS.copy() + elif param_set == 'base': + return model_params.BASE_MULTI_GPU_PARAMS.copy() + else: + raise ValueError('Not valid params: param_set={} num_gpus={}'.format( + param_set, num_gpus)) + + return PARAMS_MAP[param_set].copy() + + +def define_transformer_flags(): + """Add flags and flag validators for running transformer_main.""" + # Add common flags (data_dir, model_dir, etc.). + flags_core.define_base(num_gpu=True, distribution_strategy=True) + flags_core.define_performance( + num_parallel_calls=True, + inter_op=False, + intra_op=False, + synthetic_data=True, + max_train_steps=False, + dtype=True, + loss_scale=True, + all_reduce_alg=True, + num_packs=True, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + enable_xla=True, + fp16_implementation=True + ) + + # Additional performance flags + # TODO(b/76028325): Remove when generic layout optimizer is ready. + flags.DEFINE_boolean( + name='enable_grappler_layout_optimizer', + default=True, + help='Enable Grappler layout optimizer. Currently Grappler can ' + 'de-optimize fp16 graphs by forcing NCHW layout for all ' + 'convolutions and batch normalizations, and this flag allows to ' + 'disable it.' + ) + + flags_core.define_benchmark() + flags_core.define_device(tpu=True) + + flags.DEFINE_integer( + name='train_steps', short_name='ts', default=300000, + help=flags_core.help_wrap('The number of steps used to train.')) + flags.DEFINE_integer( + name='steps_between_evals', short_name='sbe', default=1000, + help=flags_core.help_wrap( + 'The Number of training steps to run between evaluations. This is ' + 'used if --train_steps is defined.')) + flags.DEFINE_boolean( + name='enable_time_history', default=True, + help='Whether to enable TimeHistory callback.') + flags.DEFINE_boolean( + name='enable_tensorboard', default=False, + help='Whether to enable Tensorboard callback.') + flags.DEFINE_boolean( + name='enable_metrics_in_training', default=False, + help='Whether to enable metrics during training.') + flags.DEFINE_string( + name='profile_steps', default=None, + help='Save profiling data to model dir at given range of steps. The ' + 'value must be a comma separated pair of positive integers, specifying ' + 'the first and last step to profile. For example, "--profile_steps=2,4" ' + 'triggers the profiler to process 3 steps, starting from the 2nd step. ' + 'Note that profiler has a non-trivial performance overhead, and the ' + 'output file can be gigantic if profiling many steps.') + # Set flags from the flags_core module as 'key flags' so they're listed when + # the '-h' flag is used. Without this line, the flags defined above are + # only shown in the full `--helpful` help text. + flags.adopt_module_key_flags(flags_core) + + # Add transformer-specific flags + flags.DEFINE_enum( + name='param_set', short_name='mp', default='big', + enum_values=PARAMS_MAP.keys(), + help=flags_core.help_wrap( + 'Parameter set to use when creating and training the model. The ' + 'parameters define the input shape (batch size and max length), ' + 'model configuration (size of embedding, # of hidden layers, etc.), ' + 'and various other settings. The big parameter set increases the ' + 'default batch size, embedding/hidden size, and filter size. For a ' + 'complete list of parameters, please see model/model_params.py.')) + + flags.DEFINE_bool( + name='static_batch', short_name='sb', default=False, + help=flags_core.help_wrap( + 'Whether the batches in the dataset should have static shapes. In ' + 'general, this setting should be False. Dynamic shapes allow the ' + 'inputs to be grouped so that the number of padding tokens is ' + 'minimized, and helps model training. In cases where the input shape ' + 'must be static (e.g. running on TPU), this setting will be ignored ' + 'and static batching will always be used.')) + flags.DEFINE_integer( + name='max_length', short_name='ml', default=256, + help=flags_core.help_wrap( + 'Max sentence length for Transformer. Default is 256. Note: Usually ' + 'it is more effective to use a smaller max length if static_batch is ' + 'enabled, e.g. 64.')) + + # Flags for training with steps (may be used for debugging) + flags.DEFINE_integer( + name='validation_steps', short_name='vs', default=64, + help=flags_core.help_wrap('The number of steps used in validation.')) + + # BLEU score computation + flags.DEFINE_string( + name='bleu_source', short_name='bls', default=None, + help=flags_core.help_wrap( + 'Path to source file containing text translate when calculating the ' + 'official BLEU score. Both --bleu_source and --bleu_ref must be set. ' + )) + flags.DEFINE_string( + name='bleu_ref', short_name='blr', default=None, + help=flags_core.help_wrap( + 'Path to source file containing text translate when calculating the ' + 'official BLEU score. Both --bleu_source and --bleu_ref must be set. ' + )) + flags.DEFINE_string( + name='vocab_file', short_name='vf', default=None, + help=flags_core.help_wrap( + 'Path to subtoken vocabulary file. If data_download.py was used to ' + 'download and encode the training data, look in the data_dir to find ' + 'the vocab file.')) + flags.DEFINE_string( + name='mode', default='train', + help=flags_core.help_wrap('mode: train, eval, or predict')) + flags.DEFINE_bool( + name='use_ctl', + default=False, + help=flags_core.help_wrap( + 'Whether the model runs with custom training loop.')) + flags.DEFINE_integer( + name='decode_batch_size', + default=32, + help=flags_core.help_wrap( + 'Global batch size used for Transformer autoregressive decoding on ' + 'TPU.')) + flags.DEFINE_integer( + name='decode_max_length', + default=97, + help=flags_core.help_wrap( + 'Max sequence length of the decode/eval data. This is used by ' + 'Transformer autoregressive decoding on TPU to have minimum ' + 'paddings.')) + flags.DEFINE_bool( + name='padded_decode', + default=False, + help=flags_core.help_wrap( + 'Whether the autoregressive decoding runs with input data padded to ' + 'the decode_max_length. For TPU/XLA-GPU runs, this flag has to be ' + 'set due the static shape requirement. Although CPU/GPU could also ' + 'use padded_decode, it has not been tested. In addition, this method ' + 'will introduce unnecessary overheads which grow quadratically with ' + 'the max sequence length.')) + flags.DEFINE_bool( + name='enable_checkpointing', + default=True, + help=flags_core.help_wrap( + 'Whether to do checkpointing during training. When running under ' + 'benchmark harness, we will avoid checkpointing.')) + + flags_core.set_defaults(data_dir='/tmp/translate_ende', + model_dir='/tmp/transformer_model', + batch_size=None) + + # pylint: disable=unused-variable + @flags.multi_flags_validator( + ['bleu_source', 'bleu_ref'], + message='Both or neither --bleu_source and --bleu_ref must be defined.') + def _check_bleu_files(flags_dict): + return (flags_dict['bleu_source'] is None) == ( + flags_dict['bleu_ref'] is None) + + @flags.multi_flags_validator( + ['bleu_source', 'bleu_ref', 'vocab_file'], + message='--vocab_file must be defined if --bleu_source and --bleu_ref ' + 'are defined.') + def _check_bleu_vocab_file(flags_dict): + if flags_dict['bleu_source'] and flags_dict['bleu_ref']: + return flags_dict['vocab_file'] is not None + return True + # pylint: enable=unused-variable + + +def get_callbacks(steps_per_epoch): + """Returns common callbacks.""" + callbacks = [] + if FLAGS.enable_time_history: + time_callback = keras_utils.TimeHistory( + FLAGS.batch_size, + FLAGS.log_steps, + FLAGS.model_dir if FLAGS.enable_tensorboard else None) + callbacks.append(time_callback) + + if FLAGS.enable_tensorboard: + tensorboard_callback = tf.keras.callbacks.TensorBoard( + log_dir=FLAGS.model_dir) + callbacks.append(tensorboard_callback) + + if FLAGS.profile_steps: + profiler_callback = keras_utils.get_profiler_callback( + FLAGS.model_dir, + FLAGS.profile_steps, + FLAGS.enable_tensorboard, + steps_per_epoch) + callbacks.append(profiler_callback) + + return callbacks + + +def build_stats(history, callbacks): + """Normalizes and returns dictionary of stats. + + Args: + history: Results of the training step. + callbacks: a list of callbacks which might include a time history callback + used during keras.fit. + + Returns: + Dictionary of normalized results. + """ + stats = {} + + if history and history.history: + train_hist = history.history + # Gets final loss from training. + stats['loss'] = float(train_hist['loss'][-1]) + + if not callbacks: + return stats + + # Look for the time history callback which was used during keras.fit + for callback in callbacks: + if isinstance(callback, keras_utils.TimeHistory): + timestamp_log = callback.timestamp_log + stats['step_timestamp_log'] = timestamp_log + stats['train_finish_time'] = callback.train_finish_time + if len(timestamp_log) > 1: + stats['avg_exp_per_second'] = ( + callback.batch_size * callback.log_steps * + (len(callback.timestamp_log)-1) / + (timestamp_log[-1].timestamp - timestamp_log[0].timestamp)) + return stats diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_params.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_params.py new file mode 100644 index 0000000..e978abe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_params.py @@ -0,0 +1,96 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines Transformer model parameters.""" + +from collections import defaultdict + + +BASE_PARAMS = defaultdict( + lambda: None, # Set default value to None. + + # Input params + default_batch_size=2048, # Maximum number of tokens per batch of examples. + default_batch_size_tpu=32768, + max_length=256, # Maximum number of tokens per example. + + # Model params + initializer_gain=1.0, # Used in trainable variable initialization. + vocab_size=33708, # Number of tokens defined in the vocabulary file. + hidden_size=512, # Model dimension in the hidden layers. + num_hidden_layers=6, # Number of layers in the encoder and decoder stacks. + num_heads=8, # Number of heads to use in multi-headed attention. + filter_size=2048, # Inner layer dimension in the feedforward network. + + # Dropout values (only used when training) + layer_postprocess_dropout=0.1, + attention_dropout=0.1, + relu_dropout=0.1, + + # Training params + label_smoothing=0.1, + learning_rate=2.0, + learning_rate_decay_rate=1.0, + learning_rate_warmup_steps=16000, + + # Optimizer params + optimizer_adam_beta1=0.9, + optimizer_adam_beta2=0.997, + optimizer_adam_epsilon=1e-09, + + # Default prediction params + extra_decode_length=50, + beam_size=4, + alpha=0.6, # used to calculate length normalization in beam search + + # TPU specific parameters + use_tpu=False, + static_batch=False, + allow_ffn_pad=True, +) + +BIG_PARAMS = BASE_PARAMS.copy() +BIG_PARAMS.update( + default_batch_size=4096, + + # default batch size is smaller than for BASE_PARAMS due to memory limits. + default_batch_size_tpu=16384, + + hidden_size=1024, + filter_size=4096, + num_heads=16, +) + +# Parameters for running the model in multi gpu. These should not change the +# params that modify the model shape (such as the hidden_size or num_heads). +BASE_MULTI_GPU_PARAMS = BASE_PARAMS.copy() +BASE_MULTI_GPU_PARAMS.update( + learning_rate_warmup_steps=8000 +) + +BIG_MULTI_GPU_PARAMS = BIG_PARAMS.copy() +BIG_MULTI_GPU_PARAMS.update( + layer_postprocess_dropout=0.3, + learning_rate_warmup_steps=8000 +) + +# Parameters for testing the model +TINY_PARAMS = BASE_PARAMS.copy() +TINY_PARAMS.update( + default_batch_size=1024, + default_batch_size_tpu=1024, + hidden_size=32, + num_heads=4, + filter_size=256, +) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils.py new file mode 100644 index 0000000..3f860f0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils.py @@ -0,0 +1,123 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Transformer model helper methods.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import numpy as np +import tensorflow as tf + +# Very low numbers to represent -infinity. We do not actually use -Inf, since we +# want to be able to multiply these values by zero to get zero. (-Inf * 0 = NaN) +_NEG_INF_FP32 = -1e9 +_NEG_INF_FP16 = np.finfo(np.float16).min + + +def get_position_encoding( + length, hidden_size, min_timescale=1.0, max_timescale=1.0e4): + """Return positional encoding. + + Calculates the position encoding as a mix of sine and cosine functions with + geometrically increasing wavelengths. + Defined and formulized in Attention is All You Need, section 3.5. + + Args: + length: Sequence length. + hidden_size: Size of the + min_timescale: Minimum scale that will be applied at each position + max_timescale: Maximum scale that will be applied at each position + + Returns: + Tensor with shape [length, hidden_size] + """ + # We compute the positional encoding in float32 even if the model uses + # float16, as many of the ops used, like log and exp, are numerically unstable + # in float16. + position = tf.cast(tf.range(length), tf.float32) + num_timescales = hidden_size // 2 + log_timescale_increment = ( + math.log(float(max_timescale) / float(min_timescale)) / + (tf.cast(num_timescales, tf.float32) - 1)) + inv_timescales = min_timescale * tf.exp( + tf.cast(tf.range(num_timescales), tf.float32) * -log_timescale_increment) + scaled_time = tf.expand_dims(position, 1) * tf.expand_dims(inv_timescales, 0) + signal = tf.concat([tf.sin(scaled_time), tf.cos(scaled_time)], axis=1) + return signal + + +def get_decoder_self_attention_bias(length, dtype=tf.float32): + """Calculate bias for decoder that maintains model's autoregressive property. + + Creates a tensor that masks out locations that correspond to illegal + connections, so prediction at position i cannot draw information from future + positions. + + Args: + length: int length of sequences in batch. + dtype: The dtype of the return value. + + Returns: + float tensor of shape [1, 1, length, length] + """ + neg_inf = _NEG_INF_FP16 if dtype == tf.float16 else _NEG_INF_FP32 + with tf.name_scope("decoder_self_attention_bias"): + valid_locs = tf.linalg.band_part(tf.ones([length, length], dtype=dtype), + -1, 0) + valid_locs = tf.reshape(valid_locs, [1, 1, length, length]) + decoder_bias = neg_inf * (1.0 - valid_locs) + return decoder_bias + + +def get_padding(x, padding_value=0, dtype=tf.float32): + """Return float tensor representing the padding values in x. + + Args: + x: int tensor with any shape + padding_value: int which represents padded values in input + dtype: The dtype of the return value. + + Returns: + float tensor with same shape as x containing values 0 or 1. + 0 -> non-padding, 1 -> padding + """ + with tf.name_scope("padding"): + return tf.cast(tf.equal(x, padding_value), dtype) + + +def get_padding_bias(x, padding_value=0, dtype=tf.float32): + """Calculate bias tensor from padding values in tensor. + + Bias tensor that is added to the pre-softmax multi-headed attention logits, + which has shape [batch_size, num_heads, length, length]. The tensor is zero at + non-padding locations, and -1e9 (negative infinity) at padding locations. + + Args: + x: int tensor with shape [batch_size, length] + padding_value: int which represents padded values in input + dtype: The dtype of the return value + + Returns: + Attention bias tensor of shape [batch_size, 1, 1, length]. + """ + with tf.name_scope("attention_bias"): + padding = get_padding(x, padding_value, dtype) + attention_bias = padding * _NEG_INF_FP32 + attention_bias = tf.expand_dims( + tf.expand_dims(attention_bias, axis=1), axis=1) + return attention_bias diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils_test.py new file mode 100644 index 0000000..a8c4a15 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/model_utils_test.py @@ -0,0 +1,62 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test Transformer model helper methods.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.transformer import model_utils + +NEG_INF = -1e9 + + +class ModelUtilsTest(tf.test.TestCase): + + def test_get_padding(self): + x = tf.constant([[1, 0, 0, 0, 2], [3, 4, 0, 0, 0], [0, 5, 6, 0, 7]]) + padding = model_utils.get_padding(x, padding_value=0) + + self.assertAllEqual([[0, 1, 1, 1, 0], [0, 0, 1, 1, 1], [1, 0, 0, 1, 0]], + padding) + + def test_get_padding_bias(self): + x = tf.constant([[1, 0, 0, 0, 2], [3, 4, 0, 0, 0], [0, 5, 6, 0, 7]]) + bias = model_utils.get_padding_bias(x) + bias_shape = tf.shape(bias) + flattened_bias = tf.reshape(bias, [3, 5]) + + self.assertAllEqual([[0, NEG_INF, NEG_INF, NEG_INF, 0], + [0, 0, NEG_INF, NEG_INF, NEG_INF], + [NEG_INF, 0, 0, NEG_INF, 0]], + flattened_bias) + self.assertAllEqual([3, 1, 1, 5], bias_shape) + + def test_get_decoder_self_attention_bias(self): + length = 5 + bias = model_utils.get_decoder_self_attention_bias(length) + + self.assertAllEqual([[[[0, NEG_INF, NEG_INF, NEG_INF, NEG_INF], + [0, 0, NEG_INF, NEG_INF, NEG_INF], + [0, 0, 0, NEG_INF, NEG_INF], + [0, 0, 0, 0, NEG_INF], + [0, 0, 0, 0, 0]]]], + bias) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/optimizer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/optimizer.py new file mode 100644 index 0000000..176b5eb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/optimizer.py @@ -0,0 +1,137 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Optimizer from addons and learning rate scheduler.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf +K = tf.keras.backend + + +class LearningRateSchedule(tf.keras.optimizers.schedules.LearningRateSchedule): + """Learning rate schedule.""" + + def __init__(self, initial_learning_rate, hidden_size, warmup_steps): + """Initialize configuration of the learning rate schedule. + + Args: + initial_learning_rate: A float, the initial learning rate. + hidden_size: An integer, the model dimension in the hidden layers. + warmup_steps: An integer, the number of steps required for linear warmup. + """ + super(LearningRateSchedule, self).__init__() + self.initial_learning_rate = initial_learning_rate + self.hidden_size = hidden_size + self.warmup_steps = tf.cast(warmup_steps, tf.float32) + + def __call__(self, global_step): + """Calculate learning rate with linear warmup and rsqrt decay. + + Args: + global_step: An integer, the current global step used for learning rate + calculation. + + Returns: + A float, the learning rate needs to be used for current global step. + """ + with tf.name_scope('learning_rate_schedule'): + global_step = tf.cast(global_step, tf.float32) + learning_rate = self.initial_learning_rate + learning_rate *= (self.hidden_size**-0.5) + # Apply linear warmup + learning_rate *= tf.minimum(1.0, global_step / self.warmup_steps) + # Apply rsqrt decay + learning_rate /= tf.sqrt(tf.maximum(global_step, self.warmup_steps)) + return learning_rate + + def get_config(self): + """Get the configuration of the learning rate schedule.""" + return { + 'initial_learning_rate': self.initial_learning_rate, + 'hidden_size': self.hidden_size, + 'warmup_steps': self.warmup_steps, + } + + +class LearningRateFn(object): + """Creates learning rate function.""" + + def __init__(self, learning_rate, hidden_size, warmup_steps): + self.learning_rate = learning_rate + self.hidden_size = hidden_size + self.warmup_steps = float(warmup_steps) + + def __call__(self, global_step): + """Calculate learning rate with linear warmup and rsqrt decay.""" + step = float(global_step) + learning_rate = self.learning_rate + learning_rate *= (self.hidden_size ** -0.5) + # Apply linear warmup + learning_rate *= np.minimum(1.0, step / self.warmup_steps) + # Apply rsqrt decay + learning_rate /= np.sqrt(np.maximum(step, self.warmup_steps)) + return learning_rate + + +class LearningRateScheduler(tf.keras.callbacks.Callback): + """Keras callback to schedule learning rate. + + TODO(tianlin): Refactor this scheduler and LearningRateBatchScheduler in + official/resnet/keras/keras_common.py. + """ + + def __init__(self, schedule, init_steps=None, verbose=False): + super(LearningRateScheduler, self).__init__() + self.schedule = schedule + self.verbose = verbose + if init_steps is None: + init_steps = 0.0 + self.steps = float(init_steps) # Total steps during training. + + def on_epoch_begin(self, epoch, logs=None): + if not hasattr(self.model.optimizer, 'lr'): + raise ValueError('Optimizer must have a "lr" attribute.') + if not hasattr(self.model.optimizer, 'iterations'): + raise ValueError('Optimizer must have a "iterations" attribute.') + + def on_train_batch_begin(self, batch, logs=None): + """Adjusts learning rate for each train batch.""" + if self.verbose > 0: + iterations = K.get_value(self.model.optimizer.iterations) + print('Original iteration %d' % iterations) + + self.steps += 1.0 + try: # new API + lr = float(K.get_value(self.model.optimizer.lr)) + lr = self.schedule(self.steps, lr) + except TypeError: # Support for old API for backward compatibility + lr = self.schedule(self.steps) + if not isinstance(lr, (float, np.float32, np.float64)): + raise ValueError('The output of the "schedule" function ' + 'should be float.') + K.set_value(self.model.optimizer.lr, lr) + K.set_value(self.model.optimizer.iterations, self.steps) + + if self.verbose > 0: + print('Batch %05d Step %05d: LearningRateScheduler setting learning ' + 'rate to %s.' % (batch + 1, self.steps, lr)) + + def on_epoch_end(self, epoch, logs=None): + logs = logs or {} + logs['lr'] = K.get_value(self.model.optimizer.lr) + logs['steps'] = self.steps diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer.py new file mode 100644 index 0000000..34d0d09 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer.py @@ -0,0 +1,566 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines the Transformer model in TF 2.0. + +Model paper: https://arxiv.org/pdf/1706.03762.pdf +Transformer model code source: https://github.com/tensorflow/tensor2tensor +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf +from official.nlp.transformer import attention_layer +from official.nlp.transformer import beam_search +from official.nlp.transformer import embedding_layer +from official.nlp.transformer import ffn_layer +from official.nlp.transformer import metrics +from official.nlp.transformer import model_utils +from official.nlp.transformer.utils.tokenizer import EOS_ID + + +# Disable the not-callable lint error, since it claims many objects are not +# callable when they actually are. +# pylint: disable=not-callable + + +def create_model(params, is_train): + """Creates transformer model.""" + with tf.name_scope("model"): + if is_train: + inputs = tf.keras.layers.Input((None,), dtype="int64", name="inputs") + targets = tf.keras.layers.Input((None,), dtype="int64", name="targets") + internal_model = Transformer(params, name="transformer_v2") + logits = internal_model([inputs, targets], training=is_train) + vocab_size = params["vocab_size"] + label_smoothing = params["label_smoothing"] + if params["enable_metrics_in_training"]: + logits = metrics.MetricLayer(vocab_size)([logits, targets]) + logits = tf.keras.layers.Lambda(lambda x: x, name="logits", + dtype=tf.float32)(logits) + model = tf.keras.Model([inputs, targets], logits) + # TODO(reedwm): Can we do this loss in float16 instead of float32? + loss = metrics.transformer_loss( + logits, targets, label_smoothing, vocab_size) + model.add_loss(loss) + return model + + else: + inputs = tf.keras.layers.Input((None,), dtype="int64", name="inputs") + internal_model = Transformer(params, name="transformer_v2") + ret = internal_model([inputs], training=is_train) + outputs, scores = ret["outputs"], ret["scores"] + return tf.keras.Model(inputs, [outputs, scores]) + + +class Transformer(tf.keras.Model): + """Transformer model with Keras. + + Implemented as described in: https://arxiv.org/pdf/1706.03762.pdf + + The Transformer model consists of an encoder and decoder. The input is an int + sequence (or a batch of sequences). The encoder produces a continuous + representation, and the decoder uses the encoder output to generate + probabilities for the output sequence. + """ + + def __init__(self, params, name=None): + """Initialize layers to build Transformer model. + + Args: + params: hyperparameter object defining layer sizes, dropout values, etc. + name: name of the model. + """ + super(Transformer, self).__init__(name=name) + self.params = params + self.embedding_softmax_layer = embedding_layer.EmbeddingSharedWeights( + params["vocab_size"], params["hidden_size"]) + self.encoder_stack = EncoderStack(params) + self.decoder_stack = DecoderStack(params) + + def get_config(self): + return { + "params": self.params, + } + + def call(self, inputs, training): + """Calculate target logits or inferred target sequences. + + Args: + inputs: input tensor list of size 1 or 2. + First item, inputs: int tensor with shape [batch_size, input_length]. + Second item (optional), targets: None or int tensor with shape + [batch_size, target_length]. + training: boolean, whether in training mode or not. + + Returns: + If targets is defined, then return logits for each word in the target + sequence. float tensor with shape [batch_size, target_length, vocab_size] + If target is none, then generate output sequence one token at a time. + returns a dictionary { + outputs: [batch_size, decoded length] + scores: [batch_size, float]} + Even when float16 is used, the output tensor(s) are always float32. + + Raises: + NotImplementedError: If try to use padded decode method on CPU/GPUs. + """ + if len(inputs) == 2: + inputs, targets = inputs[0], inputs[1] + else: + # Decoding path. + inputs, targets = inputs[0], None + if self.params["padded_decode"]: + if not self.params["num_replicas"]: + raise NotImplementedError( + "Padded decoding on CPU/GPUs is not supported.") + decode_batch_size = int(self.params["decode_batch_size"] / + self.params["num_replicas"]) + inputs.set_shape([ + decode_batch_size, self.params["decode_max_length"] + ]) + + # Variance scaling is used here because it seems to work in many problems. + # Other reasonable initializers may also work just as well. + with tf.name_scope("Transformer"): + # Calculate attention bias for encoder self-attention and decoder + # multi-headed attention layers. + attention_bias = model_utils.get_padding_bias(inputs) + + # Run the inputs through the encoder layer to map the symbol + # representations to continuous representations. + encoder_outputs = self.encode(inputs, attention_bias, training) + # Generate output sequence if targets is None, or return logits if target + # sequence is known. + if targets is None: + return self.predict(encoder_outputs, attention_bias, training) + else: + logits = self.decode(targets, encoder_outputs, attention_bias, training) + return logits + + def encode(self, inputs, attention_bias, training): + """Generate continuous representation for inputs. + + Args: + inputs: int tensor with shape [batch_size, input_length]. + attention_bias: float tensor with shape [batch_size, 1, 1, input_length]. + training: boolean, whether in training mode or not. + + Returns: + float tensor with shape [batch_size, input_length, hidden_size] + """ + with tf.name_scope("encode"): + # Prepare inputs to the layer stack by adding positional encodings and + # applying dropout. + embedded_inputs = self.embedding_softmax_layer(inputs) + embedded_inputs = tf.cast(embedded_inputs, self.params["dtype"]) + inputs_padding = model_utils.get_padding(inputs) + attention_bias = tf.cast(attention_bias, self.params["dtype"]) + + with tf.name_scope("add_pos_encoding"): + length = tf.shape(embedded_inputs)[1] + pos_encoding = model_utils.get_position_encoding( + length, self.params["hidden_size"]) + pos_encoding = tf.cast(pos_encoding, self.params["dtype"]) + encoder_inputs = embedded_inputs + pos_encoding + + if training: + encoder_inputs = tf.nn.dropout( + encoder_inputs, rate=self.params["layer_postprocess_dropout"]) + + return self.encoder_stack( + encoder_inputs, attention_bias, inputs_padding, training=training) + + def decode(self, targets, encoder_outputs, attention_bias, training): + """Generate logits for each value in the target sequence. + + Args: + targets: target values for the output sequence. int tensor with shape + [batch_size, target_length] + encoder_outputs: continuous representation of input sequence. float tensor + with shape [batch_size, input_length, hidden_size] + attention_bias: float tensor with shape [batch_size, 1, 1, input_length] + training: boolean, whether in training mode or not. + + Returns: + float32 tensor with shape [batch_size, target_length, vocab_size] + """ + with tf.name_scope("decode"): + # Prepare inputs to decoder layers by shifting targets, adding positional + # encoding and applying dropout. + decoder_inputs = self.embedding_softmax_layer(targets) + decoder_inputs = tf.cast(decoder_inputs, self.params["dtype"]) + attention_bias = tf.cast(attention_bias, self.params["dtype"]) + with tf.name_scope("shift_targets"): + # Shift targets to the right, and remove the last element + decoder_inputs = tf.pad(decoder_inputs, + [[0, 0], [1, 0], [0, 0]])[:, :-1, :] + with tf.name_scope("add_pos_encoding"): + length = tf.shape(decoder_inputs)[1] + pos_encoding = model_utils.get_position_encoding( + length, self.params["hidden_size"]) + pos_encoding = tf.cast(pos_encoding, self.params["dtype"]) + decoder_inputs += pos_encoding + if training: + decoder_inputs = tf.nn.dropout( + decoder_inputs, rate=self.params["layer_postprocess_dropout"]) + + # Run values + decoder_self_attention_bias = model_utils.get_decoder_self_attention_bias( + length, dtype=self.params["dtype"]) + outputs = self.decoder_stack( + decoder_inputs, + encoder_outputs, + decoder_self_attention_bias, + attention_bias, + training=training) + logits = self.embedding_softmax_layer(outputs, mode="linear") + logits = tf.cast(logits, tf.float32) + return logits + + def _get_symbols_to_logits_fn(self, max_decode_length, training): + """Returns a decoding function that calculates logits of the next tokens.""" + + timing_signal = model_utils.get_position_encoding( + max_decode_length + 1, self.params["hidden_size"]) + timing_signal = tf.cast(timing_signal, self.params["dtype"]) + decoder_self_attention_bias = model_utils.get_decoder_self_attention_bias( + max_decode_length, dtype=self.params["dtype"]) + + # TODO(b/139770046): Refactor code with better naming of i. + def symbols_to_logits_fn(ids, i, cache): + """Generate logits for next potential IDs. + + Args: + ids: Current decoded sequences. int tensor with shape [batch_size * + beam_size, i + 1]. + i: Loop index. + cache: dictionary of values storing the encoder output, encoder-decoder + attention bias, and previous decoder attention values. + + Returns: + Tuple of + (logits with shape [batch_size * beam_size, vocab_size], + updated cache values) + """ + # Set decoder input to the last generated IDs + decoder_input = ids[:, -1:] + + # Preprocess decoder input by getting embeddings and adding timing signal. + decoder_input = self.embedding_softmax_layer(decoder_input) + + if self.params["padded_decode"]: + timing_signal_shape = timing_signal.shape.as_list() + decoder_input += tf.slice(timing_signal, [i, 0], + [1, timing_signal_shape[1]]) + + bias_shape = decoder_self_attention_bias.shape.as_list() + self_attention_bias = tf.slice( + decoder_self_attention_bias, [0, 0, i, 0], + [bias_shape[0], bias_shape[1], 1, bias_shape[3]]) + else: + decoder_input += timing_signal[i:i + 1] + + self_attention_bias = decoder_self_attention_bias[:, :, i:i + 1, :i + 1] + + decoder_outputs = self.decoder_stack( + decoder_input, + cache.get("encoder_outputs"), + self_attention_bias, + cache.get("encoder_decoder_attention_bias"), + training=training, + cache=cache, + decode_loop_step=i if self.params["padded_decode"] else None) + logits = self.embedding_softmax_layer(decoder_outputs, mode="linear") + logits = tf.squeeze(logits, axis=[1]) + return logits, cache + + return symbols_to_logits_fn + + def predict(self, encoder_outputs, encoder_decoder_attention_bias, training): + """Return predicted sequence.""" + encoder_outputs = tf.cast(encoder_outputs, self.params["dtype"]) + if self.params["padded_decode"]: + batch_size = encoder_outputs.shape.as_list()[0] + input_length = encoder_outputs.shape.as_list()[1] + else: + batch_size = tf.shape(encoder_outputs)[0] + input_length = tf.shape(encoder_outputs)[1] + max_decode_length = input_length + self.params["extra_decode_length"] + encoder_decoder_attention_bias = tf.cast(encoder_decoder_attention_bias, + self.params["dtype"]) + + symbols_to_logits_fn = self._get_symbols_to_logits_fn( + max_decode_length, training) + + # Create initial set of IDs that will be passed into symbols_to_logits_fn. + initial_ids = tf.zeros([batch_size], dtype=tf.int32) + + # Create cache storing decoder attention values for each layer. + # pylint: disable=g-complex-comprehension + init_decode_length = ( + max_decode_length if self.params["padded_decode"] else 0) + num_heads = self.params["num_heads"] + dim_per_head = self.params["hidden_size"] // num_heads + cache = { + "layer_%d" % layer: { + "k": + tf.zeros([ + batch_size, init_decode_length, num_heads, dim_per_head + ], + dtype=self.params["dtype"]), + "v": + tf.zeros([ + batch_size, init_decode_length, num_heads, dim_per_head + ], + dtype=self.params["dtype"]) + } for layer in range(self.params["num_hidden_layers"]) + } + # pylint: enable=g-complex-comprehension + + # Add encoder output and attention bias to the cache. + cache["encoder_outputs"] = encoder_outputs + cache["encoder_decoder_attention_bias"] = encoder_decoder_attention_bias + + # Use beam search to find the top beam_size sequences and scores. + decoded_ids, scores = beam_search.sequence_beam_search( + symbols_to_logits_fn=symbols_to_logits_fn, + initial_ids=initial_ids, + initial_cache=cache, + vocab_size=self.params["vocab_size"], + beam_size=self.params["beam_size"], + alpha=self.params["alpha"], + max_decode_length=max_decode_length, + eos_id=EOS_ID, + padded_decode=self.params["padded_decode"], + dtype=self.params["dtype"]) + + # Get the top sequence for each batch element + top_decoded_ids = decoded_ids[:, 0, 1:] + top_scores = scores[:, 0] + + return {"outputs": top_decoded_ids, "scores": top_scores} + + +class PrePostProcessingWrapper(tf.keras.layers.Layer): + """Wrapper class that applies layer pre-processing and post-processing.""" + + def __init__(self, layer, params): + super(PrePostProcessingWrapper, self).__init__() + self.layer = layer + self.params = params + self.postprocess_dropout = params["layer_postprocess_dropout"] + + def build(self, input_shape): + # Create normalization layer + self.layer_norm = tf.keras.layers.LayerNormalization( + epsilon=1e-6, dtype="float32") + super(PrePostProcessingWrapper, self).build(input_shape) + + def get_config(self): + return { + "params": self.params, + } + + def call(self, x, *args, **kwargs): + """Calls wrapped layer with same parameters.""" + # Preprocessing: apply layer normalization + training = kwargs["training"] + + y = self.layer_norm(x) + + # Get layer output + y = self.layer(y, *args, **kwargs) + + # Postprocessing: apply dropout and residual connection + if training: + y = tf.nn.dropout(y, rate=self.postprocess_dropout) + return x + y + + +class EncoderStack(tf.keras.layers.Layer): + """Transformer encoder stack. + + The encoder stack is made up of N identical layers. Each layer is composed + of the sublayers: + 1. Self-attention layer + 2. Feedforward network (which is 2 fully-connected layers) + """ + + def __init__(self, params): + super(EncoderStack, self).__init__() + self.params = params + self.layers = [] + + def build(self, input_shape): + """Builds the encoder stack.""" + params = self.params + for _ in range(params["num_hidden_layers"]): + # Create sublayers for each layer. + self_attention_layer = attention_layer.SelfAttention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"]) + feed_forward_network = ffn_layer.FeedForwardNetwork( + params["hidden_size"], params["filter_size"], params["relu_dropout"]) + + self.layers.append([ + PrePostProcessingWrapper(self_attention_layer, params), + PrePostProcessingWrapper(feed_forward_network, params) + ]) + + # Create final layer normalization layer. + self.output_normalization = tf.keras.layers.LayerNormalization( + epsilon=1e-6, dtype="float32") + super(EncoderStack, self).build(input_shape) + + def get_config(self): + return { + "params": self.params, + } + + def call(self, encoder_inputs, attention_bias, inputs_padding, training): + """Return the output of the encoder layer stacks. + + Args: + encoder_inputs: tensor with shape [batch_size, input_length, hidden_size] + attention_bias: bias for the encoder self-attention layer. [batch_size, 1, + 1, input_length] + inputs_padding: tensor with shape [batch_size, input_length], inputs with + zero paddings. + training: boolean, whether in training mode or not. + + Returns: + Output of encoder layer stack. + float32 tensor with shape [batch_size, input_length, hidden_size] + """ + for n, layer in enumerate(self.layers): + # Run inputs through the sublayers. + self_attention_layer = layer[0] + feed_forward_network = layer[1] + + with tf.name_scope("layer_%d" % n): + with tf.name_scope("self_attention"): + encoder_inputs = self_attention_layer( + encoder_inputs, attention_bias, training=training) + with tf.name_scope("ffn"): + encoder_inputs = feed_forward_network( + encoder_inputs, training=training) + + return self.output_normalization(encoder_inputs) + + +class DecoderStack(tf.keras.layers.Layer): + """Transformer decoder stack. + + Like the encoder stack, the decoder stack is made up of N identical layers. + Each layer is composed of the sublayers: + 1. Self-attention layer + 2. Multi-headed attention layer combining encoder outputs with results from + the previous self-attention layer. + 3. Feedforward network (2 fully-connected layers) + """ + + def __init__(self, params): + super(DecoderStack, self).__init__() + self.params = params + self.layers = [] + + def build(self, input_shape): + """Builds the decoder stack.""" + params = self.params + for _ in range(params["num_hidden_layers"]): + self_attention_layer = attention_layer.SelfAttention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"]) + enc_dec_attention_layer = attention_layer.Attention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"]) + feed_forward_network = ffn_layer.FeedForwardNetwork( + params["hidden_size"], params["filter_size"], params["relu_dropout"]) + + self.layers.append([ + PrePostProcessingWrapper(self_attention_layer, params), + PrePostProcessingWrapper(enc_dec_attention_layer, params), + PrePostProcessingWrapper(feed_forward_network, params) + ]) + self.output_normalization = tf.keras.layers.LayerNormalization( + epsilon=1e-6, dtype="float32") + super(DecoderStack, self).build(input_shape) + + def get_config(self): + return { + "params": self.params, + } + + def call(self, + decoder_inputs, + encoder_outputs, + decoder_self_attention_bias, + attention_bias, + training, + cache=None, + decode_loop_step=None): + """Return the output of the decoder layer stacks. + + Args: + decoder_inputs: A tensor with shape + [batch_size, target_length, hidden_size]. + encoder_outputs: A tensor with shape + [batch_size, input_length, hidden_size] + decoder_self_attention_bias: A tensor with shape + [1, 1, target_len, target_length], the bias for decoder self-attention + layer. + attention_bias: A tensor with shape [batch_size, 1, 1, input_length], + the bias for encoder-decoder attention layer. + training: A bool, whether in training mode or not. + cache: (Used for fast decoding) A nested dictionary storing previous + decoder self-attention values. The items are: + {layer_n: {"k": A tensor with shape [batch_size, i, key_channels], + "v": A tensor with shape [batch_size, i, value_channels]}, + ...} + decode_loop_step: An integer, the step number of the decoding loop. Used + only for autoregressive inference on TPU. + + Returns: + Output of decoder layer stack. + float32 tensor with shape [batch_size, target_length, hidden_size] + """ + for n, layer in enumerate(self.layers): + self_attention_layer = layer[0] + enc_dec_attention_layer = layer[1] + feed_forward_network = layer[2] + + # Run inputs through the sublayers. + layer_name = "layer_%d" % n + layer_cache = cache[layer_name] if cache is not None else None + with tf.name_scope(layer_name): + with tf.name_scope("self_attention"): + decoder_inputs = self_attention_layer( + decoder_inputs, + decoder_self_attention_bias, + training=training, + cache=layer_cache, + decode_loop_step=decode_loop_step) + with tf.name_scope("encdec_attention"): + decoder_inputs = enc_dec_attention_layer( + decoder_inputs, + encoder_outputs, + attention_bias, + training=training) + with tf.name_scope("ffn"): + decoder_inputs = feed_forward_network( + decoder_inputs, training=training) + + return self.output_normalization(decoder_inputs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_layers_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_layers_test.py new file mode 100644 index 0000000..82d3725 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_layers_test.py @@ -0,0 +1,97 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for layers in Transformer.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.transformer import attention_layer +from official.nlp.transformer import embedding_layer +from official.nlp.transformer import ffn_layer +from official.nlp.transformer import metrics + + +class TransformerLayersTest(tf.test.TestCase): + + def test_attention_layer(self): + hidden_size = 64 + num_heads = 4 + dropout = 0.5 + dim_per_head = hidden_size // num_heads + layer = attention_layer.SelfAttention(hidden_size, num_heads, dropout) + self.assertDictEqual(layer.get_config(), { + "hidden_size": hidden_size, + "num_heads": num_heads, + "attention_dropout": dropout, + }) + length = 2 + x = tf.ones([1, length, hidden_size]) + bias = tf.ones([1]) + cache = { + "k": tf.zeros([1, 0, num_heads, dim_per_head]), + "v": tf.zeros([1, 0, num_heads, dim_per_head]), + } + y = layer(x, bias, training=True, cache=cache) + self.assertEqual(y.shape, (1, length, 64,)) + self.assertEqual(cache["k"].shape, (1, length, num_heads, dim_per_head,)) + self.assertEqual(cache["v"].shape, (1, length, num_heads, dim_per_head,)) + + def test_embedding_shared_weights(self): + vocab_size = 50 + hidden_size = 64 + length = 2 + layer = embedding_layer.EmbeddingSharedWeights(vocab_size, hidden_size) + self.assertDictEqual(layer.get_config(), { + "vocab_size": 50, + "hidden_size": 64, + }) + + idx = tf.ones([1, length], dtype="int32") + y = layer(idx) + self.assertEqual(y.shape, (1, length, hidden_size,)) + x = tf.ones([1, length, hidden_size]) + output = layer(x, "linear") + self.assertEqual(output.shape, (1, length, vocab_size,)) + + def test_feed_forward_network(self): + hidden_size = 64 + filter_size = 32 + relu_dropout = 0.5 + layer = ffn_layer.FeedForwardNetwork(hidden_size, filter_size, relu_dropout) + self.assertDictEqual(layer.get_config(), { + "hidden_size": hidden_size, + "filter_size": filter_size, + "relu_dropout": relu_dropout, + }) + length = 2 + x = tf.ones([1, length, hidden_size]) + y = layer(x, training=True) + self.assertEqual(y.shape, (1, length, hidden_size,)) + + def test_metric_layer(self): + vocab_size = 50 + logits = tf.keras.layers.Input((None, vocab_size), + dtype="float32", + name="logits") + targets = tf.keras.layers.Input((None,), dtype="int64", name="targets") + output_logits = metrics.MetricLayer(vocab_size)([logits, targets]) + self.assertEqual(output_logits.shape.as_list(), [None, None, vocab_size,]) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main.py new file mode 100644 index 0000000..f72cbe7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main.py @@ -0,0 +1,497 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Train and evaluate the Transformer model. + +See README for description of setting the training schedule and evaluating the +BLEU score. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tempfile + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.modeling import performance +from official.nlp.transformer import compute_bleu +from official.nlp.transformer import data_pipeline +from official.nlp.transformer import metrics +from official.nlp.transformer import misc +from official.nlp.transformer import optimizer +from official.nlp.transformer import transformer +from official.nlp.transformer import translate +from official.nlp.transformer.utils import tokenizer +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + +INF = int(1e9) +BLEU_DIR = "bleu" +_SINGLE_SAMPLE = 1 + + +def translate_and_compute_bleu(model, + params, + subtokenizer, + bleu_source, + bleu_ref, + distribution_strategy=None): + """Translate file and report the cased and uncased bleu scores. + + Args: + model: A Keras model, used to generate the translations. + params: A dictionary, containing the translation related parameters. + subtokenizer: A subtokenizer object, used for encoding and decoding source + and translated lines. + bleu_source: A file containing source sentences for translation. + bleu_ref: A file containing the reference for the translated sentences. + distribution_strategy: A platform distribution strategy, used for TPU based + translation. + + Returns: + uncased_score: A float, the case insensitive BLEU score. + cased_score: A float, the case sensitive BLEU score. + """ + # Create temporary file to store translation. + tmp = tempfile.NamedTemporaryFile(delete=False) + tmp_filename = tmp.name + + translate.translate_file( + model, + params, + subtokenizer, + bleu_source, + output_file=tmp_filename, + print_all_translations=False, + distribution_strategy=distribution_strategy) + + # Compute uncased and cased bleu scores. + uncased_score = compute_bleu.bleu_wrapper(bleu_ref, tmp_filename, False) + cased_score = compute_bleu.bleu_wrapper(bleu_ref, tmp_filename, True) + os.remove(tmp_filename) + return uncased_score, cased_score + + +def evaluate_and_log_bleu(model, + params, + bleu_source, + bleu_ref, + vocab_file, + distribution_strategy=None): + """Calculate and record the BLEU score. + + Args: + model: A Keras model, used to generate the translations. + params: A dictionary, containing the translation related parameters. + bleu_source: A file containing source sentences for translation. + bleu_ref: A file containing the reference for the translated sentences. + vocab_file: A file containing the vocabulary for translation. + distribution_strategy: A platform distribution strategy, used for TPU based + translation. + + Returns: + uncased_score: A float, the case insensitive BLEU score. + cased_score: A float, the case sensitive BLEU score. + """ + subtokenizer = tokenizer.Subtokenizer(vocab_file) + + uncased_score, cased_score = translate_and_compute_bleu( + model, params, subtokenizer, bleu_source, bleu_ref, distribution_strategy) + + logging.info("Bleu score (uncased): %s", uncased_score) + logging.info("Bleu score (cased): %s", cased_score) + return uncased_score, cased_score + + +class TransformerTask(object): + """Main entry of Transformer model.""" + + def __init__(self, flags_obj): + """Init function of TransformerMain. + + Args: + flags_obj: Object containing parsed flag values, i.e., FLAGS. + + Raises: + ValueError: if not using static batch for input data on TPU. + """ + self.flags_obj = flags_obj + self.predict_model = None + + # Add flag-defined parameters to params object + num_gpus = flags_core.get_num_gpus(flags_obj) + self.params = params = misc.get_model_params(flags_obj.param_set, num_gpus) + + params["num_gpus"] = num_gpus + params["use_ctl"] = flags_obj.use_ctl + params["data_dir"] = flags_obj.data_dir + params["model_dir"] = flags_obj.model_dir + params["static_batch"] = flags_obj.static_batch + params["max_length"] = flags_obj.max_length + params["decode_batch_size"] = flags_obj.decode_batch_size + params["decode_max_length"] = flags_obj.decode_max_length + params["padded_decode"] = flags_obj.padded_decode + params["num_parallel_calls"] = ( + flags_obj.num_parallel_calls or tf.data.experimental.AUTOTUNE) + + params["use_synthetic_data"] = flags_obj.use_synthetic_data + params["batch_size"] = flags_obj.batch_size or params["default_batch_size"] + params["repeat_dataset"] = None + params["dtype"] = flags_core.get_tf_dtype(flags_obj) + params["enable_tensorboard"] = flags_obj.enable_tensorboard + params["enable_metrics_in_training"] = flags_obj.enable_metrics_in_training + params["steps_between_evals"] = flags_obj.steps_between_evals + params["enable_checkpointing"] = flags_obj.enable_checkpointing + + self.distribution_strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=num_gpus, + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs, + tpu_address=flags_obj.tpu or "") + if self.use_tpu: + params["num_replicas"] = self.distribution_strategy.num_replicas_in_sync + if not params["static_batch"]: + raise ValueError("TPU requires static batch for input data.") + else: + logging.info("Running transformer with num_gpus = %d", num_gpus) + + if self.distribution_strategy: + logging.info("For training, using distribution strategy: %s", + self.distribution_strategy) + else: + logging.info("Not using any distribution strategy.") + + performance.set_mixed_precision_policy( + params["dtype"], + flags_core.get_loss_scale(flags_obj, default_for_fp16="dynamic")) + + @property + def use_tpu(self): + if self.distribution_strategy: + return isinstance(self.distribution_strategy, + tf.distribute.experimental.TPUStrategy) + return False + + def train(self): + """Trains the model.""" + params = self.params + flags_obj = self.flags_obj + # Sets config options. + keras_utils.set_session_config(enable_xla=flags_obj.enable_xla) + + _ensure_dir(flags_obj.model_dir) + with distribution_utils.get_strategy_scope(self.distribution_strategy): + model = transformer.create_model(params, is_train=True) + opt = self._create_optimizer() + + current_step = 0 + checkpoint = tf.train.Checkpoint(model=model, optimizer=opt) + latest_checkpoint = tf.train.latest_checkpoint(flags_obj.model_dir) + if latest_checkpoint: + checkpoint.restore(latest_checkpoint) + logging.info("Loaded checkpoint %s", latest_checkpoint) + current_step = opt.iterations.numpy() + + if params["use_ctl"]: + train_loss_metric = tf.keras.metrics.Mean( + "training_loss", dtype=tf.float32) + if params["enable_tensorboard"]: + summary_writer = tf.compat.v2.summary.create_file_writer( + flags_obj.model_dir) + else: + summary_writer = tf.compat.v2.summary.create_noop_writer() + train_metrics = [train_loss_metric] + if params["enable_metrics_in_training"]: + train_metrics = train_metrics + model.metrics + else: + model.compile(opt) + + model.summary() + + if self.use_tpu: + # Different from experimental_distribute_dataset, + # experimental_distribute_datasets_from_function requires + # per-replica/local batch size. + params["batch_size"] /= self.distribution_strategy.num_replicas_in_sync + train_ds = ( + self.distribution_strategy + .experimental_distribute_datasets_from_function( + lambda ctx: data_pipeline.train_input_fn(params, ctx))) + else: + train_ds = data_pipeline.train_input_fn(params) + map_data_fn = data_pipeline.map_data_for_transformer_fn + train_ds = train_ds.map( + map_data_fn, num_parallel_calls=params["num_parallel_calls"]) + if params["use_ctl"]: + train_ds_iterator = iter(train_ds) + + callbacks = self._create_callbacks(flags_obj.model_dir, 0, params) + + # Only TimeHistory callback is supported for CTL + if params["use_ctl"]: + callbacks = [cb for cb in callbacks + if isinstance(cb, keras_utils.TimeHistory)] + + # TODO(b/139418525): Refactor the custom training loop logic. + @tf.function + def train_steps(iterator, steps): + """Training steps function for TPU runs. + + Args: + iterator: The input iterator of the training dataset. + steps: An integer, the number of training steps. + + Returns: + A float, the loss value. + """ + + def _step_fn(inputs): + """Per-replica step function.""" + inputs, targets = inputs + with tf.GradientTape() as tape: + logits = model([inputs, targets], training=True) + loss = metrics.transformer_loss(logits, targets, + params["label_smoothing"], + params["vocab_size"]) + # Scales the loss, which results in using the average loss across all + # of the replicas for backprop. + scaled_loss = loss / self.distribution_strategy.num_replicas_in_sync + + # De-dupes variables due to keras tracking issues. + tvars = list({id(v): v for v in model.trainable_variables}.values()) + grads = tape.gradient(scaled_loss, tvars) + opt.apply_gradients(zip(grads, tvars)) + # For reporting, the metric takes the mean of losses. + train_loss_metric.update_state(loss) + + for _ in tf.range(steps): + train_loss_metric.reset_states() + self.distribution_strategy.run( + _step_fn, args=(next(iterator),)) + + cased_score, uncased_score = None, None + cased_score_history, uncased_score_history = [], [] + while current_step < flags_obj.train_steps: + remaining_steps = flags_obj.train_steps - current_step + train_steps_per_eval = ( + remaining_steps if remaining_steps < flags_obj.steps_between_evals + else flags_obj.steps_between_evals) + current_iteration = current_step // flags_obj.steps_between_evals + + logging.info( + "Start train iteration at global step:{}".format(current_step)) + history = None + if params["use_ctl"]: + if not self.use_tpu: + raise NotImplementedError( + "Custom training loop on GPUs is not implemented.") + + # Runs training steps. + with summary_writer.as_default(): + for cb in callbacks: + cb.on_epoch_begin(current_iteration) + cb.on_batch_begin(0) + + train_steps( + train_ds_iterator, + tf.convert_to_tensor(train_steps_per_eval, dtype=tf.int32)) + current_step += train_steps_per_eval + train_loss = train_loss_metric.result().numpy().astype(float) + logging.info("Train Step: %d/%d / loss = %s", current_step, + flags_obj.train_steps, train_loss) + + for cb in callbacks: + cb.on_batch_end(train_steps_per_eval - 1) + cb.on_epoch_end(current_iteration) + + if params["enable_tensorboard"]: + for metric_obj in train_metrics: + tf.compat.v2.summary.scalar(metric_obj.name, metric_obj.result(), + current_step) + summary_writer.flush() + + for cb in callbacks: + cb.on_train_end() + + if flags_obj.enable_checkpointing: + # avoid check-pointing when running for benchmarking. + checkpoint_name = checkpoint.save( + os.path.join(flags_obj.model_dir, + "ctl_step_{}.ckpt".format(current_step))) + logging.info("Saved checkpoint to %s", checkpoint_name) + else: + if self.use_tpu: + raise NotImplementedError( + "Keras model.fit on TPUs is not implemented.") + history = model.fit( + train_ds, + initial_epoch=current_iteration, + epochs=current_iteration + 1, + steps_per_epoch=train_steps_per_eval, + callbacks=callbacks, + # If TimeHistory is enabled, progress bar would be messy. Increase + # the verbose level to get rid of it. + verbose=(2 if flags_obj.enable_time_history else 1)) + current_step += train_steps_per_eval + logging.info("Train history: {}".format(history.history)) + + logging.info("End train iteration at global step:{}".format(current_step)) + + if (flags_obj.bleu_source and flags_obj.bleu_ref): + uncased_score, cased_score = self.eval() + cased_score_history.append([current_iteration + 1, cased_score]) + uncased_score_history.append([current_iteration + 1, uncased_score]) + + stats = ({ + "loss": train_loss + } if history is None else misc.build_stats(history, callbacks)) + if uncased_score and cased_score: + stats["bleu_uncased"] = uncased_score + stats["bleu_cased"] = cased_score + stats["bleu_uncased_history"] = uncased_score_history + stats["bleu_cased_history"] = cased_score_history + return stats + + def eval(self): + """Evaluates the model.""" + distribution_strategy = self.distribution_strategy if self.use_tpu else None + + # We only want to create the model under DS scope for TPU case. + # When 'distribution_strategy' is None, a no-op DummyContextManager will + # be used. + with distribution_utils.get_strategy_scope(distribution_strategy): + if not self.predict_model: + self.predict_model = transformer.create_model(self.params, False) + self._load_weights_if_possible( + self.predict_model, + tf.train.latest_checkpoint(self.flags_obj.model_dir)) + self.predict_model.summary() + return evaluate_and_log_bleu( + self.predict_model, self.params, self.flags_obj.bleu_source, + self.flags_obj.bleu_ref, self.flags_obj.vocab_file, + distribution_strategy) + + def predict(self): + """Predicts result from the model.""" + params = self.params + flags_obj = self.flags_obj + + with tf.name_scope("model"): + model = transformer.create_model(params, is_train=False) + self._load_weights_if_possible( + model, tf.train.latest_checkpoint(self.flags_obj.model_dir)) + model.summary() + subtokenizer = tokenizer.Subtokenizer(flags_obj.vocab_file) + + ds = data_pipeline.eval_input_fn(params) + ds = ds.map(lambda x, y: x).take(_SINGLE_SAMPLE) + ret = model.predict(ds) + val_outputs, _ = ret + length = len(val_outputs) + for i in range(length): + translate.translate_from_input(val_outputs[i], subtokenizer) + + def _create_callbacks(self, cur_log_dir, init_steps, params): + """Creates a list of callbacks.""" + sfunc = optimizer.LearningRateFn(params["learning_rate"], + params["hidden_size"], + params["learning_rate_warmup_steps"]) + scheduler_callback = optimizer.LearningRateScheduler(sfunc, init_steps) + callbacks = misc.get_callbacks(params["steps_between_evals"]) + callbacks.append(scheduler_callback) + if params["enable_checkpointing"]: + ckpt_full_path = os.path.join(cur_log_dir, "cp-{epoch:04d}.ckpt") + callbacks.append( + tf.keras.callbacks.ModelCheckpoint( + ckpt_full_path, save_weights_only=True)) + return callbacks + + def _load_weights_if_possible(self, model, init_weight_path=None): + """Loads model weights when it is provided.""" + if init_weight_path: + logging.info("Load weights: {}".format(init_weight_path)) + # TODO(b/139414977): Having the same variable restoring method for both + # TPU and GPU. + if self.use_tpu: + checkpoint = tf.train.Checkpoint( + model=model, optimizer=self._create_optimizer()) + checkpoint.restore(init_weight_path) + else: + model.load_weights(init_weight_path) + else: + logging.info("Weights not loaded from path:{}".format(init_weight_path)) + + def _create_optimizer(self): + """Creates optimizer.""" + params = self.params + lr_schedule = optimizer.LearningRateSchedule( + params["learning_rate"], params["hidden_size"], + params["learning_rate_warmup_steps"]) + opt = tf.keras.optimizers.Adam( + lr_schedule if self.use_tpu else params["learning_rate"], + params["optimizer_adam_beta1"], + params["optimizer_adam_beta2"], + epsilon=params["optimizer_adam_epsilon"]) + + opt = performance.configure_optimizer( + opt, + use_float16=params["dtype"] == tf.float16, + use_graph_rewrite=self.flags_obj.fp16_implementation == "graph_rewrite", + loss_scale=flags_core.get_loss_scale( + self.flags_obj, default_for_fp16="dynamic")) + + return opt + + +def _ensure_dir(log_dir): + """Makes log dir if not existed.""" + if not tf.io.gfile.exists(log_dir): + tf.io.gfile.makedirs(log_dir) + + +def main(_): + flags_obj = flags.FLAGS + with logger.benchmark_context(flags_obj): + task = TransformerTask(flags_obj) + + # Execute flag override logic for better model performance + if flags_obj.tf_gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=flags_obj.per_gpu_thread_count, + gpu_thread_mode=flags_obj.tf_gpu_thread_mode, + num_gpus=flags_obj.num_gpus, + datasets_num_private_threads=flags_obj.datasets_num_private_threads) + + if flags_obj.mode == "train": + task.train() + elif flags_obj.mode == "predict": + task.predict() + elif flags_obj.mode == "eval": + task.eval() + else: + raise ValueError("Invalid mode {}".format(flags_obj.mode)) + + +if __name__ == "__main__": + logging.set_verbosity(logging.INFO) + misc.define_transformer_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main_test.py new file mode 100644 index 0000000..2880217 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_main_test.py @@ -0,0 +1,190 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test Transformer model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import re +import sys +import unittest + +from absl import flags +from absl.testing import flagsaver +import tensorflow as tf +from tensorflow.python.eager import context # pylint: disable=ungrouped-imports +from official.nlp.transformer import misc +from official.nlp.transformer import transformer_main +from official.utils.misc import keras_utils + +FLAGS = flags.FLAGS +FIXED_TIMESTAMP = 'my_time_stamp' +WEIGHT_PATTERN = re.compile(r'weights-epoch-.+\.hdf5') + + +def _generate_file(filepath, lines): + with open(filepath, 'w') as f: + for l in lines: + f.write('{}\n'.format(l)) + + +class TransformerTaskTest(tf.test.TestCase): + local_flags = None + + def setUp(self): + temp_dir = self.get_temp_dir() + if TransformerTaskTest.local_flags is None: + misc.define_transformer_flags() + # Loads flags, array cannot be blank. + flags.FLAGS(['foo']) + TransformerTaskTest.local_flags = flagsaver.save_flag_values() + else: + flagsaver.restore_flag_values(TransformerTaskTest.local_flags) + FLAGS.model_dir = os.path.join(temp_dir, FIXED_TIMESTAMP) + FLAGS.param_set = 'tiny' + FLAGS.use_synthetic_data = True + FLAGS.steps_between_evals = 1 + FLAGS.train_steps = 2 + FLAGS.validation_steps = 1 + FLAGS.batch_size = 8 + FLAGS.num_gpus = 1 + FLAGS.distribution_strategy = 'off' + FLAGS.dtype = 'fp32' + self.model_dir = FLAGS.model_dir + self.temp_dir = temp_dir + self.vocab_file = os.path.join(temp_dir, 'vocab') + self.vocab_size = misc.get_model_params(FLAGS.param_set, 0)['vocab_size'] + self.bleu_source = os.path.join(temp_dir, 'bleu_source') + self.bleu_ref = os.path.join(temp_dir, 'bleu_ref') + self.orig_policy = ( + tf.compat.v2.keras.mixed_precision.experimental.global_policy()) + + def tearDown(self): + tf.compat.v2.keras.mixed_precision.experimental.set_policy(self.orig_policy) + + def _assert_exists(self, filepath): + self.assertTrue(os.path.exists(filepath)) + + def test_train_no_dist_strat(self): + if context.num_gpus() >= 2: + self.skipTest('No need to test 2+ GPUs without a distribution strategy.') + t = transformer_main.TransformerTask(FLAGS) + t.train() + + def test_train_static_batch(self): + if context.num_gpus() >= 2: + self.skipTest('No need to test 2+ GPUs without a distribution strategy.') + FLAGS.distribution_strategy = 'one_device' + if tf.test.is_built_with_cuda(): + FLAGS.num_gpus = 1 + else: + FLAGS.num_gpus = 0 + FLAGS.static_batch = True + t = transformer_main.TransformerTask(FLAGS) + t.train() + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_train_1_gpu_with_dist_strat(self): + FLAGS.distribution_strategy = 'one_device' + t = transformer_main.TransformerTask(FLAGS) + t.train() + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_train_fp16(self): + FLAGS.distribution_strategy = 'one_device' + FLAGS.dtype = 'fp16' + t = transformer_main.TransformerTask(FLAGS) + t.train() + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_train_2_gpu(self): + if context.num_gpus() < 2: + self.skipTest( + '{} GPUs are not available for this test. {} GPUs are available' + .format(2, context.num_gpus())) + FLAGS.distribution_strategy = 'mirrored' + FLAGS.num_gpus = 2 + FLAGS.param_set = 'base' + t = transformer_main.TransformerTask(FLAGS) + t.train() + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_train_2_gpu_fp16(self): + if context.num_gpus() < 2: + self.skipTest( + '{} GPUs are not available for this test. {} GPUs are available' + .format(2, context.num_gpus())) + FLAGS.distribution_strategy = 'mirrored' + FLAGS.num_gpus = 2 + FLAGS.param_set = 'base' + FLAGS.dtype = 'fp16' + t = transformer_main.TransformerTask(FLAGS) + t.train() + + def _prepare_files_and_flags(self, *extra_flags): + # Make log dir. + if not os.path.exists(self.temp_dir): + os.makedirs(self.temp_dir) + + # Fake vocab, bleu_source and bleu_ref. + tokens = [ + "''", "''", "'_'", "'a'", "'b'", "'c'", "'d'", "'a_'", "'b_'", + "'c_'", "'d_'" + ] + tokens += ["'{}'".format(i) for i in range(self.vocab_size - len(tokens))] + _generate_file(self.vocab_file, tokens) + _generate_file(self.bleu_source, ['a b', 'c d']) + _generate_file(self.bleu_ref, ['a b', 'd c']) + + # Update flags. + update_flags = [ + 'ignored_program_name', + '--vocab_file={}'.format(self.vocab_file), + '--bleu_source={}'.format(self.bleu_source), + '--bleu_ref={}'.format(self.bleu_ref), + ] + if extra_flags: + update_flags.extend(extra_flags) + FLAGS(update_flags) + + def test_predict(self): + if context.num_gpus() >= 2: + self.skipTest('No need to test 2+ GPUs without a distribution strategy.') + self._prepare_files_and_flags() + t = transformer_main.TransformerTask(FLAGS) + t.predict() + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_predict_fp16(self): + if context.num_gpus() >= 2: + self.skipTest('No need to test 2+ GPUs without a distribution strategy.') + self._prepare_files_and_flags('--dtype=fp16') + t = transformer_main.TransformerTask(FLAGS) + t.predict() + + def test_eval(self): + if context.num_gpus() >= 2: + self.skipTest('No need to test 2+ GPUs without a distribution strategy.') + if 'test_xla' in sys.argv[0]: + self.skipTest('TODO(xla): Make this test faster under XLA.') + self._prepare_files_and_flags() + t = transformer_main.TransformerTask(FLAGS) + t.eval() + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_test.py new file mode 100644 index 0000000..227b43d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/transformer_test.py @@ -0,0 +1,68 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test Transformer model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from official.nlp.transformer import model_params +from official.nlp.transformer import transformer + + +class TransformerV2Test(tf.test.TestCase): + + def setUp(self): + self.params = params = model_params.TINY_PARAMS + params["batch_size"] = params["default_batch_size"] = 16 + params["use_synthetic_data"] = True + params["hidden_size"] = 12 + params["num_hidden_layers"] = 2 + params["filter_size"] = 14 + params["num_heads"] = 2 + params["vocab_size"] = 41 + params["extra_decode_length"] = 2 + params["beam_size"] = 3 + params["dtype"] = tf.float32 + + def test_create_model_train(self): + model = transformer.create_model(self.params, True) + inputs, outputs = model.inputs, model.outputs + self.assertEqual(len(inputs), 2) + self.assertEqual(len(outputs), 1) + self.assertEqual(inputs[0].shape.as_list(), [None, None]) + self.assertEqual(inputs[0].dtype, tf.int64) + self.assertEqual(inputs[1].shape.as_list(), [None, None]) + self.assertEqual(inputs[1].dtype, tf.int64) + self.assertEqual(outputs[0].shape.as_list(), [None, None, 41]) + self.assertEqual(outputs[0].dtype, tf.float32) + + def test_create_model_not_train(self): + model = transformer.create_model(self.params, False) + inputs, outputs = model.inputs, model.outputs + self.assertEqual(len(inputs), 1) + self.assertEqual(len(outputs), 2) + self.assertEqual(inputs[0].shape.as_list(), [None, None]) + self.assertEqual(inputs[0].dtype, tf.int64) + self.assertEqual(outputs[0].shape.as_list(), [None, None]) + self.assertEqual(outputs[0].dtype, tf.int32) + self.assertEqual(outputs[1].shape.as_list(), [None]) + self.assertEqual(outputs[1].dtype, tf.float32) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/translate.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/translate.py new file mode 100644 index 0000000..1f92504 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/translate.py @@ -0,0 +1,199 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Translate text or files using trained transformer model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import logging +import numpy as np +import tensorflow as tf + +from official.nlp.transformer.utils import tokenizer + +_EXTRA_DECODE_LENGTH = 100 +_BEAM_SIZE = 4 +_ALPHA = 0.6 + + +def _get_sorted_inputs(filename): + """Read and sort lines from the file sorted by decreasing length. + + Args: + filename: String name of file to read inputs from. + Returns: + Sorted list of inputs, and dictionary mapping original index->sorted index + of each element. + """ + with tf.io.gfile.GFile(filename) as f: + records = f.read().split("\n") + inputs = [record.strip() for record in records] + if not inputs[-1]: + inputs.pop() + + input_lens = [(i, len(line.split())) for i, line in enumerate(inputs)] + sorted_input_lens = sorted(input_lens, key=lambda x: x[1], reverse=True) + + sorted_inputs = [None] * len(sorted_input_lens) + sorted_keys = [0] * len(sorted_input_lens) + for i, (index, _) in enumerate(sorted_input_lens): + sorted_inputs[i] = inputs[index] + sorted_keys[index] = i + return sorted_inputs, sorted_keys + + +def _encode_and_add_eos(line, subtokenizer): + """Encode line with subtokenizer, and add EOS id to the end.""" + return subtokenizer.encode(line) + [tokenizer.EOS_ID] + + +def _trim_and_decode(ids, subtokenizer): + """Trim EOS and PAD tokens from ids, and decode to return a string.""" + try: + index = list(ids).index(tokenizer.EOS_ID) + return subtokenizer.decode(ids[:index]) + except ValueError: # No EOS found in sequence + return subtokenizer.decode(ids) + + +def translate_file(model, + params, + subtokenizer, + input_file, + output_file=None, + print_all_translations=True, + distribution_strategy=None): + """Translate lines in file, and save to output file if specified. + + Args: + model: A Keras model, used to generate the translations. + params: A dictionary, containing the translation related parameters. + subtokenizer: A subtokenizer object, used for encoding and decoding source + and translated lines. + input_file: A file containing lines to translate. + output_file: A file that stores the generated translations. + print_all_translations: A bool. If true, all translations are printed to + stdout. + distribution_strategy: A distribution strategy, used to perform inference + directly with tf.function instead of Keras model.predict(). + + Raises: + ValueError: if output file is invalid. + """ + batch_size = params["decode_batch_size"] + + # Read and sort inputs by length. Keep dictionary (original index-->new index + # in sorted list) to write translations in the original order. + sorted_inputs, sorted_keys = _get_sorted_inputs(input_file) + total_samples = len(sorted_inputs) + num_decode_batches = (total_samples - 1) // batch_size + 1 + + def input_generator(): + """Yield encoded strings from sorted_inputs.""" + for i in range(num_decode_batches): + lines = [ + sorted_inputs[j + i * batch_size] + for j in range(batch_size) + if j + i * batch_size < total_samples + ] + lines = [_encode_and_add_eos(l, subtokenizer) for l in lines] + if distribution_strategy: + for j in range(batch_size - len(lines)): + lines.append([tokenizer.EOS_ID]) + batch = tf.keras.preprocessing.sequence.pad_sequences( + lines, + maxlen=params["decode_max_length"], + dtype="int32", + padding="post") + logging.info("Decoding batch %d out of %d.", i, num_decode_batches) + yield batch + + @tf.function + def predict_step(inputs): + """Decoding step function for TPU runs.""" + + def _step_fn(inputs): + """Per replica step function.""" + tag = inputs[0] + val_inputs = inputs[1] + val_outputs, _ = model([val_inputs], training=False) + return tag, val_outputs + + return distribution_strategy.run(_step_fn, args=(inputs,)) + + translations = [] + if distribution_strategy: + num_replicas = distribution_strategy.num_replicas_in_sync + local_batch_size = params["decode_batch_size"] // num_replicas + for i, text in enumerate(input_generator()): + if distribution_strategy: + text = np.reshape(text, [num_replicas, local_batch_size, -1]) + # Add tag to the input of each replica with the reordering logic after + # outputs, to ensure the output order matches the input order. + text = tf.constant(text) + + @tf.function + def text_as_per_replica(): + replica_context = tf.distribute.get_replica_context() + replica_id = replica_context.replica_id_in_sync_group + return replica_id, text[replica_id] + + text = distribution_strategy.run(text_as_per_replica) + outputs = distribution_strategy.experimental_local_results( + predict_step(text)) + tags, unordered_val_outputs = outputs[0] + tags = [tag.numpy() for tag in tags._values] + unordered_val_outputs = [ + val_output.numpy() for val_output in unordered_val_outputs._values] + # pylint: enable=protected-access + val_outputs = [None] * len(tags) + for k in range(len(tags)): + val_outputs[tags[k]] = unordered_val_outputs[k] + val_outputs = np.reshape(val_outputs, [params["decode_batch_size"], -1]) + else: + val_outputs, _ = model.predict(text) + + length = len(val_outputs) + for j in range(length): + if j + i * batch_size < total_samples: + translation = _trim_and_decode(val_outputs[j], subtokenizer) + translations.append(translation) + if print_all_translations: + logging.info("Translating:\n\tInput: %s\n\tOutput: %s", + sorted_inputs[j + i * batch_size], translation) + + # Write translations in the order they appeared in the original file. + if output_file is not None: + if tf.io.gfile.isdir(output_file): + raise ValueError("File output is a directory, will not save outputs to " + "file.") + logging.info("Writing to file %s", output_file) + with tf.compat.v1.gfile.Open(output_file, "w") as f: + for i in sorted_keys: + f.write("%s\n" % translations[i]) + + +def translate_from_text(model, subtokenizer, txt): + encoded_txt = _encode_and_add_eos(txt, subtokenizer) + result = model.predict(encoded_txt) + outputs = result["outputs"] + logging.info("Original: \"%s\"", txt) + translate_from_input(outputs, subtokenizer) + + +def translate_from_input(outputs, subtokenizer): + translation = _trim_and_decode(outputs, subtokenizer) + logging.info("Translation: \"%s\"", translation) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/metrics.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/metrics.py new file mode 100644 index 0000000..7900cf8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/metrics.py @@ -0,0 +1,490 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions for calculating loss, accuracy, and other model metrics. + +Metrics: + - Padded loss, accuracy, and negative log perplexity. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/metrics.py + - BLEU approximation. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/bleu_hook.py + - ROUGE score. Source: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/rouge.py +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import math + +import numpy as np +import six +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow.compat.v1 as tf + + +def _pad_tensors_to_same_length(x, y): + """Pad x and y so that the results have the same length (second dimension).""" + with tf.name_scope("pad_to_same_length"): + x_length = tf.shape(x)[1] + y_length = tf.shape(y)[1] + + max_length = tf.maximum(x_length, y_length) + + x = tf.pad(x, [[0, 0], [0, max_length - x_length], [0, 0]]) + y = tf.pad(y, [[0, 0], [0, max_length - y_length]]) + return x, y + + +def padded_cross_entropy_loss(logits, labels, smoothing, vocab_size): + """Calculate cross entropy loss while ignoring padding. + + Args: + logits: Tensor of size [batch_size, length_logits, vocab_size] + labels: Tensor of size [batch_size, length_labels] + smoothing: Label smoothing constant, used to determine the on and off values + vocab_size: int size of the vocabulary + Returns: + Returns the cross entropy loss and weight tensors: float32 tensors with + shape [batch_size, max(length_logits, length_labels)] + """ + with tf.name_scope("loss", values=[logits, labels]): + logits, labels = _pad_tensors_to_same_length(logits, labels) + + # Calculate smoothing cross entropy + with tf.name_scope("smoothing_cross_entropy", values=[logits, labels]): + confidence = 1.0 - smoothing + low_confidence = (1.0 - confidence) / tf.to_float(vocab_size - 1) + soft_targets = tf.one_hot( + tf.cast(labels, tf.int32), + depth=vocab_size, + on_value=confidence, + off_value=low_confidence) + xentropy = tf.nn.softmax_cross_entropy_with_logits_v2( + logits=logits, labels=soft_targets) + + # Calculate the best (lowest) possible value of cross entropy, and + # subtract from the cross entropy loss. + normalizing_constant = -( + confidence * tf.log(confidence) + tf.to_float(vocab_size - 1) * + low_confidence * tf.log(low_confidence + 1e-20)) + xentropy -= normalizing_constant + + weights = tf.to_float(tf.not_equal(labels, 0)) + return xentropy * weights, weights + + +def _convert_to_eval_metric(metric_fn): + """Wrap a metric fn that returns scores and weights as an eval metric fn. + + The input metric_fn returns values for the current batch. The wrapper + aggregates the return values collected over all of the batches evaluated. + + Args: + metric_fn: function that returns scores and weights for the current batch's + logits and predicted labels. + + Returns: + function that aggregates the scores and weights from metric_fn. + """ + def problem_metric_fn(*args): + """Returns an aggregation of the metric_fn's returned values.""" + (scores, weights) = metric_fn(*args) + + # The tf.metrics.mean function assures correct aggregation. + return tf.metrics.mean(scores, weights) + return problem_metric_fn + + +def get_eval_metrics(logits, labels, params): + """Return dictionary of model evaluation metrics.""" + metrics = { + "accuracy": _convert_to_eval_metric(padded_accuracy)(logits, labels), + "accuracy_top5": _convert_to_eval_metric(padded_accuracy_top5)( + logits, labels), + "accuracy_per_sequence": _convert_to_eval_metric( + padded_sequence_accuracy)(logits, labels), + "neg_log_perplexity": _convert_to_eval_metric(padded_neg_log_perplexity)( + logits, labels, params["vocab_size"]), + } + + if not params["use_tpu"]: + # TPU does not support tf.py_func + metrics.update({ + "approx_bleu_score": _convert_to_eval_metric( + bleu_score)(logits, labels), + "rouge_2_fscore": _convert_to_eval_metric( + rouge_2_fscore)(logits, labels), + "rouge_L_fscore": _convert_to_eval_metric( + rouge_l_fscore)(logits, labels), + }) + + # Prefix each of the metric names with "metrics/". This allows the metric + # graphs to display under the "metrics" category in TensorBoard. + metrics = {"metrics/%s" % k: v for k, v in six.iteritems(metrics)} + return metrics + + +def padded_accuracy(logits, labels): + """Percentage of times that predictions matches labels on non-0s.""" + with tf.variable_scope("padded_accuracy", values=[logits, labels]): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.to_float(tf.not_equal(labels, 0)) + outputs = tf.to_int32(tf.argmax(logits, axis=-1)) + padded_labels = tf.to_int32(labels) + return tf.to_float(tf.equal(outputs, padded_labels)), weights + + +def padded_accuracy_topk(logits, labels, k): + """Percentage of times that top-k predictions matches labels on non-0s.""" + with tf.variable_scope("padded_accuracy_topk", values=[logits, labels]): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.to_float(tf.not_equal(labels, 0)) + effective_k = tf.minimum(k, tf.shape(logits)[-1]) + _, outputs = tf.nn.top_k(logits, k=effective_k) + outputs = tf.to_int32(outputs) + padded_labels = tf.to_int32(labels) + padded_labels = tf.expand_dims(padded_labels, axis=-1) + padded_labels += tf.zeros_like(outputs) # Pad to same shape. + same = tf.to_float(tf.equal(outputs, padded_labels)) + same_topk = tf.reduce_sum(same, axis=-1) + return same_topk, weights + + +def padded_accuracy_top5(logits, labels): + return padded_accuracy_topk(logits, labels, 5) + + +def padded_sequence_accuracy(logits, labels): + """Percentage of times that predictions matches labels everywhere (non-0).""" + with tf.variable_scope("padded_sequence_accuracy", values=[logits, labels]): + logits, labels = _pad_tensors_to_same_length(logits, labels) + weights = tf.to_float(tf.not_equal(labels, 0)) + outputs = tf.to_int32(tf.argmax(logits, axis=-1)) + padded_labels = tf.to_int32(labels) + not_correct = tf.to_float(tf.not_equal(outputs, padded_labels)) * weights + axis = list(range(1, len(outputs.get_shape()))) + correct_seq = 1.0 - tf.minimum(1.0, tf.reduce_sum(not_correct, axis=axis)) + return correct_seq, tf.constant(1.0) + + +def padded_neg_log_perplexity(logits, labels, vocab_size): + """Average log-perplexity excluding padding 0s. No smoothing.""" + num, den = padded_cross_entropy_loss(logits, labels, 0, vocab_size) + return -num, den + + +def bleu_score(logits, labels): + """Approximate BLEU score computation between labels and predictions. + + An approximate BLEU scoring method since we do not glue word pieces or + decode the ids and tokenize the output. By default, we use ngram order of 4 + and use brevity penalty. Also, this does not have beam search. + + Args: + logits: Tensor of size [batch_size, length_logits, vocab_size] + labels: Tensor of size [batch-size, length_labels] + + Returns: + bleu: int, approx bleu score + """ + predictions = tf.to_int32(tf.argmax(logits, axis=-1)) + # TODO: Look into removing use of py_func + bleu = tf.py_func(compute_bleu, (labels, predictions), tf.float32) + return bleu, tf.constant(1.0) + + +def _get_ngrams_with_counter(segment, max_order): + """Extracts all n-grams up to a given maximum order from an input segment. + + Args: + segment: text segment from which n-grams will be extracted. + max_order: maximum length in tokens of the n-grams returned by this + methods. + + Returns: + The Counter containing all n-grams upto max_order in segment + with a count of how many times each n-gram occurred. + """ + ngram_counts = collections.Counter() + for order in xrange(1, max_order + 1): + for i in xrange(0, len(segment) - order + 1): + ngram = tuple(segment[i:i + order]) + ngram_counts[ngram] += 1 + return ngram_counts + + +def compute_bleu(reference_corpus, translation_corpus, max_order=4, + use_bp=True): + """Computes BLEU score of translated segments against one or more references. + + Args: + reference_corpus: list of references for each translation. Each + reference should be tokenized into a list of tokens. + translation_corpus: list of translations to score. Each translation + should be tokenized into a list of tokens. + max_order: Maximum n-gram order to use when computing BLEU score. + use_bp: boolean, whether to apply brevity penalty. + + Returns: + BLEU score. + """ + reference_length = 0 + translation_length = 0 + bp = 1.0 + geo_mean = 0 + + matches_by_order = [0] * max_order + possible_matches_by_order = [0] * max_order + precisions = [] + + for (references, translations) in zip(reference_corpus, translation_corpus): + reference_length += len(references) + translation_length += len(translations) + ref_ngram_counts = _get_ngrams_with_counter(references, max_order) + translation_ngram_counts = _get_ngrams_with_counter(translations, max_order) + + overlap = dict((ngram, + min(count, translation_ngram_counts[ngram])) + for ngram, count in ref_ngram_counts.items()) + + for ngram in overlap: + matches_by_order[len(ngram) - 1] += overlap[ngram] + for ngram in translation_ngram_counts: + possible_matches_by_order[len(ngram) - 1] += translation_ngram_counts[ + ngram] + + precisions = [0] * max_order + smooth = 1.0 + + for i in xrange(0, max_order): + if possible_matches_by_order[i] > 0: + precisions[i] = float(matches_by_order[i]) / possible_matches_by_order[i] + if matches_by_order[i] > 0: + precisions[i] = float(matches_by_order[i]) / possible_matches_by_order[ + i] + else: + smooth *= 2 + precisions[i] = 1.0 / (smooth * possible_matches_by_order[i]) + else: + precisions[i] = 0.0 + + if max(precisions) > 0: + p_log_sum = sum(math.log(p) for p in precisions if p) + geo_mean = math.exp(p_log_sum / max_order) + + if use_bp: + ratio = translation_length / reference_length + bp = math.exp(1 - 1. / ratio) if ratio < 1.0 else 1.0 + bleu = geo_mean * bp + return np.float32(bleu) + + +def rouge_2_fscore(logits, labels): + """ROUGE-2 F1 score computation between labels and predictions. + + This is an approximate ROUGE scoring method since we do not glue word pieces + or decode the ids and tokenize the output. + + Args: + logits: tensor, model predictions + labels: tensor, gold output. + + Returns: + rouge2_fscore: approx rouge-2 f1 score. + """ + predictions = tf.to_int32(tf.argmax(logits, axis=-1)) + # TODO: Look into removing use of py_func + rouge_2_f_score = tf.py_func(rouge_n, (predictions, labels), tf.float32) + return rouge_2_f_score, tf.constant(1.0) + + +def _get_ngrams(n, text): + """Calculates n-grams. + + Args: + n: which n-grams to calculate + text: An array of tokens + + Returns: + A set of n-grams + """ + ngram_set = set() + text_length = len(text) + max_index_ngram_start = text_length - n + for i in range(max_index_ngram_start + 1): + ngram_set.add(tuple(text[i:i + n])) + return ngram_set + + +def rouge_n(eval_sentences, ref_sentences, n=2): + """Computes ROUGE-N f1 score of two text collections of sentences. + + Source: https://www.microsoft.com/en-us/research/publication/ + rouge-a-package-for-automatic-evaluation-of-summaries/ + + Args: + eval_sentences: Predicted sentences. + ref_sentences: Sentences from the reference set + n: Size of ngram. Defaults to 2. + + Returns: + f1 score for ROUGE-N + """ + f1_scores = [] + for eval_sentence, ref_sentence in zip(eval_sentences, ref_sentences): + eval_ngrams = _get_ngrams(n, eval_sentence) + ref_ngrams = _get_ngrams(n, ref_sentence) + ref_count = len(ref_ngrams) + eval_count = len(eval_ngrams) + + # Count the overlapping ngrams between evaluated and reference + overlapping_ngrams = eval_ngrams.intersection(ref_ngrams) + overlapping_count = len(overlapping_ngrams) + + # Handle edge case. This isn't mathematically correct, but it's good enough + if eval_count == 0: + precision = 0.0 + else: + precision = float(overlapping_count) / eval_count + if ref_count == 0: + recall = 0.0 + else: + recall = float(overlapping_count) / ref_count + f1_scores.append(2.0 * ((precision * recall) / (precision + recall + 1e-8))) + + # return overlapping_count / reference_count + return np.mean(f1_scores, dtype=np.float32) + + +def rouge_l_fscore(predictions, labels): + """ROUGE scores computation between labels and predictions. + + This is an approximate ROUGE scoring method since we do not glue word pieces + or decode the ids and tokenize the output. + + Args: + predictions: tensor, model predictions + labels: tensor, gold output. + + Returns: + rouge_l_fscore: approx rouge-l f1 score. + """ + outputs = tf.to_int32(tf.argmax(predictions, axis=-1)) + rouge_l_f_score = tf.py_func(rouge_l_sentence_level, (outputs, labels), + tf.float32) + return rouge_l_f_score, tf.constant(1.0) + + +def rouge_l_sentence_level(eval_sentences, ref_sentences): + """Computes ROUGE-L (sentence level) of two collections of sentences. + + Source: https://www.microsoft.com/en-us/research/publication/ + rouge-a-package-for-automatic-evaluation-of-summaries/ + + Calculated according to: + R_lcs = LCS(X,Y)/m + P_lcs = LCS(X,Y)/n + F_lcs = ((1 + beta^2)*R_lcs*P_lcs) / (R_lcs + (beta^2) * P_lcs) + + where: + X = reference summary + Y = Candidate summary + m = length of reference summary + n = length of candidate summary + + Args: + eval_sentences: The sentences that have been picked by the summarizer + ref_sentences: The sentences from the reference set + + Returns: + A float: F_lcs + """ + + f1_scores = [] + for eval_sentence, ref_sentence in zip(eval_sentences, ref_sentences): + m = float(len(ref_sentence)) + n = float(len(eval_sentence)) + lcs = _len_lcs(eval_sentence, ref_sentence) + f1_scores.append(_f_lcs(lcs, m, n)) + return np.mean(f1_scores, dtype=np.float32) + + +def _len_lcs(x, y): + """Returns the length of the Longest Common Subsequence between two seqs. + + Source: http://www.algorithmist.com/index.php/Longest_Common_Subsequence + + Args: + x: sequence of words + y: sequence of words + + Returns + integer: Length of LCS between x and y + """ + table = _lcs(x, y) + n, m = len(x), len(y) + return table[n, m] + + +def _lcs(x, y): + """Computes the length of the LCS between two seqs. + + The implementation below uses a DP programming algorithm and runs + in O(nm) time where n = len(x) and m = len(y). + Source: http://www.algorithmist.com/index.php/Longest_Common_Subsequence + + Args: + x: collection of words + y: collection of words + + Returns: + Table of dictionary of coord and len lcs + """ + n, m = len(x), len(y) + table = dict() + for i in range(n + 1): + for j in range(m + 1): + if i == 0 or j == 0: + table[i, j] = 0 + elif x[i - 1] == y[j - 1]: + table[i, j] = table[i - 1, j - 1] + 1 + else: + table[i, j] = max(table[i - 1, j], table[i, j - 1]) + return table + + +def _f_lcs(llcs, m, n): + """Computes the LCS-based F-measure score. + + Source: http://research.microsoft.com/en-us/um/people/cyl/download/papers/ + rouge-working-note-v1.3.1.pdf + + Args: + llcs: Length of LCS + m: number of words in reference summary + n: number of words in candidate summary + + Returns: + Float. LCS-based F-measure score + """ + r_lcs = llcs / m + p_lcs = llcs / n + beta = p_lcs / (r_lcs + 1e-12) + num = (1 + (beta ** 2)) * r_lcs * p_lcs + denom = r_lcs + ((beta ** 2) * p_lcs) + f_lcs = num / (denom + 1e-12) + return f_lcs diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer.py new file mode 100644 index 0000000..3749dfe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer.py @@ -0,0 +1,660 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines Subtokenizer class to encode and decode strings.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import re +import sys +import unicodedata +from absl import logging + +import numpy as np +import six +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf + + +# pylint: disable=g-complex-comprehension +PAD = "" +PAD_ID = 0 +EOS = "" +EOS_ID = 1 +RESERVED_TOKENS = [PAD, EOS] + +# Set of characters that will be used in the function _escape_token() (see func +# docstring for more details). +# This set is added to the alphabet list to ensure that all escaped tokens can +# be encoded. +_ESCAPE_CHARS = set(u"\\_u;0123456789") +# Regex for the function _unescape_token(), the inverse of _escape_token(). +# This is used to find "\u", "\\", and "\###;" substrings in the token. +_UNESCAPE_REGEX = re.compile(r"\\u|\\\\|\\([0-9]+);") + +_UNDEFINED_UNICODE = u"\u3013" + + +def alphanumeric_char_set(): + return set( + six.unichr(i) + for i in xrange(sys.maxunicode) + if (unicodedata.category(six.unichr(i)).startswith("L") or + unicodedata.category(six.unichr(i)).startswith("N"))) + + +# Set contains all letter and number characters. +_ALPHANUMERIC_CHAR_SET = alphanumeric_char_set() + +# min_count is the minimum number of times a subtoken must appear in the data +# before before it is added to the vocabulary. The value is found using binary +# search to obtain the target vocabulary size. +_MIN_MIN_COUNT = 1 # min value to use when binary searching for min_count +_MAX_MIN_COUNT = 1000 # max value to use when binary searching for min_count + + +class Subtokenizer(object): + """Encodes and decodes strings to/from integer IDs.""" + + def __init__(self, vocab_file, reserved_tokens=None, master_char_set=None): + """Initializes class, creating a vocab file if data_files is provided.""" + logging.info("Initializing Subtokenizer from file %s.", vocab_file) + + if master_char_set is None: + master_char_set = _ALPHANUMERIC_CHAR_SET + + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + self.subtoken_list = _load_vocab_file(vocab_file, reserved_tokens) + self.alphabet = _generate_alphabet_dict(self.subtoken_list) + self.subtoken_to_id_dict = _list_to_index_dict(self.subtoken_list) + + self.max_subtoken_length = 0 + for subtoken in self.subtoken_list: + self.max_subtoken_length = max(self.max_subtoken_length, len(subtoken)) + + # Create cache to speed up subtokenization + self._cache_size = 2**20 + self._cache = [(None, None)] * self._cache_size + self._master_char_set = master_char_set + + @staticmethod + def init_from_files(vocab_file, + files, + target_vocab_size, + threshold, + min_count=None, + file_byte_limit=1e6, + reserved_tokens=None, + correct_strip=True, + master_char_set=None): + """Create subtoken vocabulary based on files, and save vocab to file. + + Args: + vocab_file: String name of vocab file to store subtoken vocabulary. + files: List of file paths that will be used to generate vocabulary. + target_vocab_size: target vocabulary size to generate. + threshold: int threshold of vocabulary size to accept. + min_count: int minimum count to use for generating the vocabulary. The min + count is the minimum number of times a subtoken should appear in the + files before it is added to the vocabulary. If set to none, this value + is found using binary search. + file_byte_limit: (Default 1e6) Maximum number of bytes of sample text that + will be drawn from the files. + reserved_tokens: List of string tokens that are guaranteed to be at the + beginning of the subtoken vocabulary list. + correct_strip: Whether to convert text to unicode before strip. + master_char_set: the char set. + + Returns: + Subtokenizer object + """ + if master_char_set is None: + master_char_set = _ALPHANUMERIC_CHAR_SET + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + if tf.io.gfile.exists(vocab_file): + logging.info("Vocab file already exists (%s)", vocab_file) + else: + logging.info("Begin steps to create subtoken vocabulary...") + token_counts = _count_tokens(files, file_byte_limit, correct_strip, + master_char_set) + alphabet = _generate_alphabet_dict(token_counts) + subtoken_list = _generate_subtokens_with_target_vocab_size( + token_counts, alphabet, target_vocab_size, threshold, min_count, + reserved_tokens) + logging.info("Generated vocabulary with %d subtokens.", + len(subtoken_list)) + _save_vocab_file(vocab_file, subtoken_list) + return Subtokenizer(vocab_file, master_char_set=master_char_set) + + def encode(self, raw_string, add_eos=False): + """Encodes a string into a list of int subtoken ids.""" + ret = [] + tokens = _split_string_to_tokens( + native_to_unicode(raw_string), self._master_char_set) + for token in tokens: + ret.extend(self._token_to_subtoken_ids(token)) + if add_eos: + assert EOS in self.subtoken_list, \ + "Can't append 'EOS' because it is not in list of known subtokens." + ret.append(EOS_ID) + return ret + + def _token_to_subtoken_ids(self, token): + """Encode a single token into a list of subtoken ids.""" + cache_location = hash(token) % self._cache_size + cache_key, cache_value = self._cache[cache_location] + if cache_key == token: + return cache_value + + ret = _split_token_to_subtokens( + _escape_token(token, self.alphabet), self.subtoken_to_id_dict, + self.max_subtoken_length) + ret = [self.subtoken_to_id_dict[subtoken_id] for subtoken_id in ret] + + self._cache[cache_location] = (token, ret) + return ret + + def decode(self, subtokens): + """Converts list of int subtokens ids into a string.""" + if isinstance(subtokens, np.ndarray): + # Note that list(subtokens) converts subtokens to a python list, but the + # items remain as np.int32. This converts both the array and its items. + subtokens = subtokens.tolist() + + if not subtokens: + return "" + + assert isinstance(subtokens, list) and isinstance(subtokens[0], int), ( + "Subtokens argument passed into decode() must be a list of integers.") + + return _unicode_to_native( + _join_tokens_to_string( + self._subtoken_ids_to_tokens(subtokens), self._master_char_set)) + + def _subtoken_ids_to_tokens(self, subtokens): + """Convert list of int subtoken ids to a list of string tokens.""" + escaped_tokens = "".join([ + self.subtoken_list[s] for s in subtokens if s < len(self.subtoken_list) + ]) + escaped_tokens = escaped_tokens.split("_") + + # All tokens in the vocabulary list have been escaped (see _escape_token()) + # so each token must be unescaped when decoding. + ret = [] + for token in escaped_tokens: + if token: + ret.append(_unescape_token(token)) + return ret + + +def _save_vocab_file(vocab_file, subtoken_list): + """Save subtokens to file.""" + with tf.io.gfile.GFile(vocab_file, mode="w") as f: + for subtoken in subtoken_list: + f.write("'%s'\n" % _unicode_to_native(subtoken)) + + +def _load_vocab_file(vocab_file, reserved_tokens=None): + """Load vocabulary while ensuring reserved tokens are at the top.""" + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + subtoken_list = [] + with tf.io.gfile.GFile(vocab_file, mode="r") as f: + for line in f: + subtoken = native_to_unicode(line.strip()) + subtoken = subtoken[1:-1] # Remove surrounding single-quotes + if subtoken in reserved_tokens: + continue + subtoken_list.append(native_to_unicode(subtoken)) + return reserved_tokens + subtoken_list + + +def native_to_unicode(s): + """Convert string to unicode (required in Python 2).""" + try: # Python 2 + return s if isinstance(s, unicode) else s.decode("utf-8") + except NameError: # Python 3 + return s + + +def _unicode_to_native(s): + """Convert string from unicode to native format (required in Python 2).""" + try: # Python 2 + return s.encode("utf-8") if isinstance(s, unicode) else s + except NameError: # Python 3 + return s + + +def _split_string_to_tokens(text, master_char_set): + """Splits text to a list of string tokens.""" + if not text: + return [] + ret = [] + token_start = 0 + # Classify each character in the input string + is_master = [c in master_char_set for c in text] + for pos in xrange(1, len(text)): + if is_master[pos] != is_master[pos - 1]: + token = text[token_start:pos] + if token != u" " or token_start == 0: + ret.append(token) + token_start = pos + final_token = text[token_start:] + ret.append(final_token) + return ret + + +def _join_tokens_to_string(tokens, master_char_set): + """Join a list of string tokens into a single string.""" + token_is_master = [t[0] in master_char_set for t in tokens] + ret = [] + for i, token in enumerate(tokens): + if i > 0 and token_is_master[i - 1] and token_is_master[i]: + ret.append(u" ") + ret.append(token) + return "".join(ret) + + +def _escape_token(token, alphabet): + r"""Replace characters that aren't in the alphabet and append "_" to token. + + Apply three transformations to the token: + 1. Replace underline character "_" with "\u", and backslash "\" with "\\". + 2. Replace characters outside of the alphabet with "\###;", where ### is the + character's Unicode code point. + 3. Appends "_" to mark the end of a token. + + Args: + token: unicode string to be escaped + alphabet: list of all known characters + + Returns: + escaped string + """ + token = token.replace(u"\\", u"\\\\").replace(u"_", u"\\u") + ret = [c if c in alphabet and c != u"\n" else r"\%d;" % ord(c) for c in token] + return u"".join(ret) + "_" + + +def _unescape_token(token): + r"""Replaces escaped characters in the token with their unescaped versions. + + Applies inverse transformations as _escape_token(): + 1. Replace "\u" with "_", and "\\" with "\". + 2. Replace "\###;" with the unicode character the ### refers to. + + Args: + token: escaped string + + Returns: + unescaped string + """ + + def match(m): + r"""Returns replacement string for matched object. + + Matched objects contain one of the strings that matches the regex pattern: + r"\\u|\\\\|\\([0-9]+);" + The strings can be '\u', '\\', or '\###;' (### is any digit number). + + m.group(0) refers to the entire matched string ('\u', '\\', or '\###;'). + m.group(1) refers to the first parenthesized subgroup ('###'). + + m.group(0) exists for all match objects, while m.group(1) exists only for + the string '\###;'. + + This function looks to see if m.group(1) exists. If it doesn't, then the + matched string must be '\u' or '\\' . In this case, the corresponding + replacement ('_' and '\') are returned. Note that in python, a single + backslash is written as '\\', and double backslash as '\\\\'. + + If m.goup(1) exists, then use the integer in m.group(1) to return a + unicode character. + + Args: + m: match object + + Returns: + String to replace matched object with. + """ + # Check if the matched strings are '\u' or '\\'. + if m.group(1) is None: + return u"_" if m.group(0) == u"\\u" else u"\\" + + # If m.group(1) exists, try and return unicode character. + try: + return six.unichr(int(m.group(1))) + except (ValueError, OverflowError) as _: + return _UNDEFINED_UNICODE + + # Use match function to replace escaped substrings in the token. + return _UNESCAPE_REGEX.sub(match, token) + + +def _count_tokens(files, + file_byte_limit=1e6, + correct_strip=True, + master_char_set=None): + """Return token counts of words in the files. + + Samples file_byte_limit bytes from each file, and counts the words that appear + in the samples. The samples are semi-evenly distributed across the file. + + Args: + files: List of filepaths + file_byte_limit: Max number of bytes that will be read from each file. + correct_strip: Whether to convert text to unicode before strip. This affects + vocabulary generation for PY2. Sets correct_strip to False in PY2 to + reproduce previous common public result. Sets correct_strip to True will + let PY2 and PY3 get a consistent vocabulary. + master_char_set: the char set. + + Returns: + Dictionary mapping tokens to the number of times they appear in the sampled + lines from the files. + """ + if master_char_set is None: + master_char_set = _ALPHANUMERIC_CHAR_SET + + token_counts = collections.defaultdict(int) + + for filepath in files: + with tf.io.gfile.GFile(filepath, mode="r") as reader: + file_byte_budget = file_byte_limit + counter = 0 + lines_to_skip = int(reader.size() / (file_byte_budget * 2)) + for line in reader: + if counter < lines_to_skip: + counter += 1 + else: + if file_byte_budget < 0: + break + if correct_strip: + line = native_to_unicode(line) + line = line.strip() + file_byte_budget -= len(line) + counter = 0 + + # Add words to token counts + for token in _split_string_to_tokens( + native_to_unicode(line), master_char_set): + token_counts[token] += 1 + return token_counts + + +def _list_to_index_dict(lst): + """Create dictionary mapping list items to their indices in the list.""" + return {item: n for n, item in enumerate(lst)} + + +def _split_token_to_subtokens(token, subtoken_dict, max_subtoken_length): + """Splits a token into subtokens defined in the subtoken dict.""" + ret = [] + start = 0 + token_len = len(token) + while start < token_len: + # Find the longest subtoken, so iterate backwards. + for end in xrange(min(token_len, start + max_subtoken_length), start, -1): + subtoken = token[start:end] + if subtoken in subtoken_dict: + ret.append(subtoken) + start = end + break + else: # Did not break + # If there is no possible encoding of the escaped token then one of the + # characters in the token is not in the alphabet. This should be + # impossible and would be indicative of a bug. + raise ValueError("Was unable to split token \"%s\" into subtokens." % + token) + return ret + + +def _generate_subtokens_with_target_vocab_size(token_counts, + alphabet, + target_size, + threshold, + min_count=None, + reserved_tokens=None): + """Generate subtoken vocabulary close to the target size.""" + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + if min_count is not None: + logging.info("Using min_count=%d to generate vocab with target size %d", + min_count, target_size) + return _generate_subtokens( + token_counts, alphabet, min_count, reserved_tokens=reserved_tokens) + + def bisect(min_val, max_val): + """Recursive function to binary search for subtoken vocabulary.""" + cur_count = (min_val + max_val) // 2 + logging.info("Binary search: trying min_count=%d (%d %d)", cur_count, + min_val, max_val) + subtoken_list = _generate_subtokens( + token_counts, alphabet, cur_count, reserved_tokens=reserved_tokens) + + val = len(subtoken_list) + logging.info("Binary search: min_count=%d resulted in %d tokens", cur_count, + val) + + within_threshold = abs(val - target_size) < threshold + if within_threshold or min_val >= max_val or cur_count < 2: + return subtoken_list + if val > target_size: + other_subtoken_list = bisect(cur_count + 1, max_val) + else: + other_subtoken_list = bisect(min_val, cur_count - 1) + + # Return vocabulary dictionary with the closest number of tokens. + other_val = len(other_subtoken_list) + if abs(other_val - target_size) < abs(val - target_size): + return other_subtoken_list + return subtoken_list + + logging.info("Finding best min_count to get target size of %d", target_size) + return bisect(_MIN_MIN_COUNT, _MAX_MIN_COUNT) + + +def _generate_alphabet_dict(iterable, reserved_tokens=None): + """Create set of characters that appear in any element in the iterable.""" + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + alphabet = {c for token in iterable for c in token} + alphabet |= {c for token in reserved_tokens for c in token} + alphabet |= _ESCAPE_CHARS # Add escape characters to alphabet set. + return alphabet + + +def _count_and_gen_subtokens(token_counts, alphabet, subtoken_dict, + max_subtoken_length): + """Count number of times subtokens appear, and generate new subtokens. + + Args: + token_counts: dict mapping tokens to the number of times they appear in the + original files. + alphabet: list of allowed characters. Used to escape the tokens, which + guarantees that all tokens can be split into subtokens. + subtoken_dict: dict mapping subtokens to ids. + max_subtoken_length: maximum length of subtoken in subtoken_dict. + + Returns: + A defaultdict mapping subtokens to the number of times they appear in the + tokens. The dict may contain new subtokens. + """ + subtoken_counts = collections.defaultdict(int) + for token, count in six.iteritems(token_counts): + token = _escape_token(token, alphabet) + subtokens = _split_token_to_subtokens(token, subtoken_dict, + max_subtoken_length) + + # Generate new subtokens by taking substrings from token. + start = 0 + for subtoken in subtokens: + for end in xrange(start + 1, len(token) + 1): + new_subtoken = token[start:end] + subtoken_counts[new_subtoken] += count + start += len(subtoken) + + return subtoken_counts + + +def _filter_and_bucket_subtokens(subtoken_counts, min_count): + """Return a bucketed list of subtokens that are filtered by count. + + Args: + subtoken_counts: defaultdict mapping subtokens to their counts + min_count: int count used to filter subtokens + + Returns: + List of subtoken sets, where subtokens in set i have the same length=i. + """ + # Create list of buckets, where subtokens in bucket i have length i. + subtoken_buckets = [] + for subtoken, count in six.iteritems(subtoken_counts): + if count < min_count: # Filter out subtokens that don't appear enough + continue + while len(subtoken_buckets) <= len(subtoken): + subtoken_buckets.append(set()) + subtoken_buckets[len(subtoken)].add(subtoken) + return subtoken_buckets + + +def _gen_new_subtoken_list(subtoken_counts, + min_count, + alphabet, + reserved_tokens=None): + """Generate candidate subtokens ordered by count, and new max subtoken length. + + Add subtokens to the candiate list in order of length (longest subtokens + first). When a subtoken is added, the counts of each of its prefixes are + decreased. Prefixes that don't appear much outside the subtoken are not added + to the candidate list. + + For example: + subtoken being added to candidate list: 'translate' + subtoken_counts: {'translate':10, 't':40, 'tr':16, 'tra':12, ...} + min_count: 5 + + When 'translate' is added, subtoken_counts is updated to: + {'translate':0, 't':30, 'tr':6, 'tra': 2, ...} + + The subtoken 'tra' will not be added to the candidate list, because it appears + twice (less than min_count) outside of 'translate'. + + Args: + subtoken_counts: defaultdict mapping str subtokens to int counts + min_count: int minumum count requirement for subtokens + alphabet: set of characters. Each character is added to the subtoken list to + guarantee that all tokens can be encoded. + reserved_tokens: list of tokens that will be added to the beginning of the + returned subtoken list. + + Returns: + List of candidate subtokens in decreasing count order, and maximum subtoken + length + """ + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + # Create a list of (count, subtoken) for each candidate subtoken. + subtoken_candidates = [] + + # Use bucketted list to iterate through subtokens in order of length. + # subtoken_buckets[i] = set(subtokens), where each subtoken has length i. + subtoken_buckets = _filter_and_bucket_subtokens(subtoken_counts, min_count) + max_subtoken_length = len(subtoken_buckets) - 1 + + # Go through the list in reverse order to consider longer subtokens first. + for subtoken_len in xrange(max_subtoken_length, 0, -1): + for subtoken in subtoken_buckets[subtoken_len]: + count = subtoken_counts[subtoken] + + # Possible if this subtoken is a prefix of another token. + if count < min_count: + continue + + # Ignore alphabet/reserved tokens, which will be added manually later. + if subtoken not in alphabet and subtoken not in reserved_tokens: + subtoken_candidates.append((count, subtoken)) + + # Decrement count of the subtoken's prefixes (if a longer subtoken is + # added, its prefixes lose priority to be added). + for end in xrange(1, subtoken_len): + subtoken_counts[subtoken[:end]] -= count + + # Add alphabet subtokens (guarantees that all strings are encodable). + subtoken_candidates.extend((subtoken_counts.get(a, 0), a) for a in alphabet) + + # Order subtoken candidates by decreasing count. + subtoken_list = [t for _, t in sorted(subtoken_candidates, reverse=True)] + + # Add reserved tokens to beginning of the list. + subtoken_list = reserved_tokens + subtoken_list + return subtoken_list, max_subtoken_length + + +def _generate_subtokens(token_counts, + alphabet, + min_count, + num_iterations=4, + reserved_tokens=None): + """Create a list of subtokens in decreasing order of frequency. + + Args: + token_counts: dict mapping str tokens -> int count + alphabet: set of characters + min_count: int minimum number of times a subtoken must appear before it is + added to the vocabulary. + num_iterations: int number of iterations to generate new tokens. + reserved_tokens: list of tokens that will be added to the beginning to the + returned subtoken list. + + Returns: + Sorted list of subtokens (most frequent first) + """ + if reserved_tokens is None: + reserved_tokens = RESERVED_TOKENS + + # Use alphabet set to create initial list of subtokens + subtoken_list = reserved_tokens + list(alphabet) + max_subtoken_length = 1 + + # On each iteration, segment all words using the subtokens defined in + # subtoken_dict, count how often the resulting subtokens appear, and update + # the dictionary with subtokens w/ high enough counts. + for i in xrange(num_iterations): + logging.info("\tGenerating subtokens: iteration %d", i) + # Generate new subtoken->id dictionary using the new subtoken list. + subtoken_dict = _list_to_index_dict(subtoken_list) + + # Create dict mapping subtoken->count, with additional subtokens created + # from substrings taken from the tokens. + subtoken_counts = _count_and_gen_subtokens(token_counts, alphabet, + subtoken_dict, + max_subtoken_length) + + # Generate new list of subtokens sorted by subtoken count. + subtoken_list, max_subtoken_length = _gen_new_subtoken_list( + subtoken_counts, min_count, alphabet, reserved_tokens) + + logging.info("\tVocab size: %d", len(subtoken_list)) + return subtoken_list diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer_test.py new file mode 100644 index 0000000..307398f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/transformer/utils/tokenizer_test.py @@ -0,0 +1,204 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test Subtokenizer and string helper methods.""" + +import collections +import tempfile + +import tensorflow as tf + +from official.nlp.transformer.utils import tokenizer + + +class SubtokenizerTest(tf.test.TestCase): + + def _init_subtokenizer(self, vocab_list): + temp_file = tempfile.NamedTemporaryFile(delete=False) + with tf.io.gfile.GFile(temp_file.name, "w") as w: + for subtoken in vocab_list: + w.write("'%s'" % subtoken) + w.write("\n") + return tokenizer.Subtokenizer(temp_file.name, reserved_tokens=[]) + + def test_encode(self): + vocab_list = ["123_", "test", "ing_"] + subtokenizer = self._init_subtokenizer(vocab_list) + s = "testing 123" + encoded_list = subtokenizer.encode(s) + self.assertEqual([1, 2, 0], encoded_list) + + def test_decode(self): + vocab_list = ["123_", "test", "ing_"] + subtokenizer = self._init_subtokenizer(vocab_list) + encoded_list = [1, 2, 0] # testing 123 + decoded_str = subtokenizer.decode(encoded_list) + self.assertEqual("testing 123", decoded_str) + + def test_subtoken_ids_to_tokens(self): + vocab_list = ["123_", "test", "ing_"] + subtokenizer = self._init_subtokenizer(vocab_list) + encoded_list = [1, 2, 0] # testing 123 + token_list = subtokenizer._subtoken_ids_to_tokens(encoded_list) + self.assertEqual([u"testing", u"123"], token_list) + + +class StringHelperTest(tf.test.TestCase): + + def test_split_string_to_tokens(self): + text = "test? testing 123." + + tokens = tokenizer._split_string_to_tokens(text, + tokenizer._ALPHANUMERIC_CHAR_SET) + self.assertEqual(["test", "? ", "testing", "123", "."], tokens) + + def test_join_tokens_to_string(self): + tokens = ["test", "? ", "testing", "123", "."] + + s = tokenizer._join_tokens_to_string(tokens, + tokenizer._ALPHANUMERIC_CHAR_SET) + self.assertEqual("test? testing 123.", s) + + def test_escape_token(self): + token = u"abc_\\4" + alphabet = set("abc_\\u;") + + escaped_token = tokenizer._escape_token(token, alphabet) + self.assertEqual("abc\\u\\\\\\52;_", escaped_token) + + def test_unescape_token(self): + escaped_token = u"Underline: \\u, Backslash: \\\\, Unicode: \\52;" + + unescaped_token = tokenizer._unescape_token(escaped_token) + self.assertEqual("Underline: _, Backslash: \\, Unicode: 4", unescaped_token) + + def test_list_to_index_dict(self): + lst = ["test", "strings"] + + d = tokenizer._list_to_index_dict(lst) + self.assertDictEqual({"test": 0, "strings": 1}, d) + + def test_split_token_to_subtokens(self): + token = "abc" + subtoken_dict = {"a": 0, "b": 1, "c": 2, "ab": 3} + max_subtoken_length = 2 + + subtokens = tokenizer._split_token_to_subtokens(token, subtoken_dict, + max_subtoken_length) + self.assertEqual(["ab", "c"], subtokens) + + def test_generate_alphabet_dict(self): + s = ["testing", "123"] + reserved_tokens = ["???"] + + alphabet = tokenizer._generate_alphabet_dict(s, reserved_tokens) + self.assertIn("?", alphabet) + self.assertIn("t", alphabet) + self.assertIn("e", alphabet) + self.assertIn("s", alphabet) + self.assertIn("i", alphabet) + self.assertIn("n", alphabet) + self.assertIn("g", alphabet) + self.assertIn("1", alphabet) + self.assertIn("2", alphabet) + self.assertIn("3", alphabet) + + def test_count_and_gen_subtokens(self): + token_counts = {"abc": 5} + alphabet = set("abc_") + subtoken_dict = {"a": 0, "b": 1, "c": 2, "_": 3} + max_subtoken_length = 2 + + subtoken_counts = tokenizer._count_and_gen_subtokens( + token_counts, alphabet, subtoken_dict, max_subtoken_length) + + self.assertIsInstance(subtoken_counts, collections.defaultdict) + self.assertDictEqual( + { + "a": 5, + "b": 5, + "c": 5, + "_": 5, + "ab": 5, + "bc": 5, + "c_": 5, + "abc": 5, + "bc_": 5, + "abc_": 5 + }, subtoken_counts) + + def test_filter_and_bucket_subtokens(self): + subtoken_counts = collections.defaultdict(int, { + "a": 2, + "b": 4, + "c": 1, + "ab": 6, + "ac": 3, + "abbc": 5 + }) + min_count = 3 + + subtoken_buckets = tokenizer._filter_and_bucket_subtokens( + subtoken_counts, min_count) + + self.assertEqual(len(subtoken_buckets[0]), 0) + self.assertEqual(set("b"), subtoken_buckets[1]) + self.assertEqual(set(["ab", "ac"]), subtoken_buckets[2]) + self.assertEqual(len(subtoken_buckets[3]), 0) + self.assertEqual(set(["abbc"]), subtoken_buckets[4]) + + def test_gen_new_subtoken_list(self): + subtoken_counts = collections.defaultdict(int, { + "translate": 10, + "t": 40, + "tr": 16, + "tra": 12 + }) + min_count = 5 + alphabet = set("translate") + reserved_tokens = ["reserved", "tokens"] + + subtoken_list, max_token_length = tokenizer._gen_new_subtoken_list( + subtoken_counts, min_count, alphabet, reserved_tokens) + + # Check that "tra" isn"t in the list (its count should be decremented to 2, + # so it should not be added to the canddiate list). + self.assertNotIn("tra", subtoken_list) + + self.assertIn("tr", subtoken_list) + self.assertIn("t", subtoken_list) + + self.assertEqual(len("translate"), max_token_length) + + def test_generate_subtokens(self): + token_counts = {"ab": 1, "bc": 3, "abc": 5} + alphabet = set("abc_") + min_count = 100 + num_iterations = 1 + reserved_tokens = ["reserved", "tokens"] + + vocab_list = tokenizer._generate_subtokens(token_counts, alphabet, + min_count, num_iterations, + reserved_tokens) + + # Check that reserved tokens are at the front of the list + self.assertEqual(vocab_list[:2], reserved_tokens) + + # Check that each character in alphabet is in the vocab list + for c in alphabet: + self.assertIn(c, vocab_list) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/README.md new file mode 100644 index 0000000..9675f01 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/README.md @@ -0,0 +1,16 @@ +# XLNet: Generalized Autoregressive Pretraining for Language Understanding + +The academic paper which describes XLNet in detail and provides full results on +a number of tasks can be found here: https://arxiv.org/abs/1906.08237. + +**Instructions and user guide will be added soon.** + +XLNet is a generalized autoregressive BERT-like pretraining language model that +enables learning bidirectional contexts by maximizing the expected likelihood +over all permutations of the factorization order. It can learn dependency beyond +a fixed length without disrupting temporal coherence by using segment-level +recurrence mechanism and relative positional encoding scheme introduced in +[Transformer-XL](https://arxiv.org/pdf/1901.02860.pdf). XLNet outperforms BERT +on 20 NLP benchmark tasks and achieves state-of-the-art results on 18 tasks +including question answering, natural language inference, sentiment analysis, +and document ranking. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/__init__.py @@ -0,0 +1 @@ + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/classifier_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/classifier_utils.py new file mode 100644 index 0000000..64363e3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/classifier_utils.py @@ -0,0 +1,162 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utilities for pre-processing classification data.""" +from absl import logging + +from official.nlp.xlnet import data_utils + +SEG_ID_A = 0 +SEG_ID_B = 1 + + +class PaddingInputExample(object): + """Fake example so the num input examples is a multiple of the batch size. + + When running eval/predict on the TPU, we need to pad the number of examples + to be a multiple of the batch size, because the TPU requires a fixed batch + size. The alternative is to drop the last batch, which is bad because it means + the entire output data won't be generated. + We use this class instead of `None` because treating `None` as padding + battches could cause silent errors. + """ + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + input_ids, + input_mask, + segment_ids, + label_id, + is_real_example=True): + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.label_id = label_id + self.is_real_example = is_real_example + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + + +def convert_single_example(example_index, example, label_list, max_seq_length, + tokenize_fn, use_bert_format): + """Converts a single `InputExample` into a single `InputFeatures`.""" + + if isinstance(example, PaddingInputExample): + return InputFeatures( + input_ids=[0] * max_seq_length, + input_mask=[1] * max_seq_length, + segment_ids=[0] * max_seq_length, + label_id=0, + is_real_example=False) + + if label_list is not None: + label_map = {} + for (i, label) in enumerate(label_list): + label_map[label] = i + + tokens_a = tokenize_fn(example.text_a) + tokens_b = None + if example.text_b: + tokens_b = tokenize_fn(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for two [SEP] & one [CLS] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3) + else: + # Account for one [SEP] & one [CLS] with "- 2" + if len(tokens_a) > max_seq_length - 2: + tokens_a = tokens_a[:max_seq_length - 2] + + tokens = [] + segment_ids = [] + for token in tokens_a: + tokens.append(token) + segment_ids.append(SEG_ID_A) + tokens.append(data_utils.SEP_ID) + segment_ids.append(SEG_ID_A) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + segment_ids.append(SEG_ID_B) + tokens.append(data_utils.SEP_ID) + segment_ids.append(SEG_ID_B) + + if use_bert_format: + tokens.insert(0, data_utils.CLS_ID) + segment_ids.insert(0, data_utils.SEG_ID_CLS) + else: + tokens.append(data_utils.CLS_ID) + segment_ids.append(data_utils.SEG_ID_CLS) + + input_ids = tokens + + # The mask has 0 for real tokens and 1 for padding tokens. Only real + # tokens are attended to. + input_mask = [0] * len(input_ids) + + # Zero-pad up to the sequence length. + if len(input_ids) < max_seq_length: + delta_len = max_seq_length - len(input_ids) + if use_bert_format: + input_ids = input_ids + [0] * delta_len + input_mask = input_mask + [1] * delta_len + segment_ids = segment_ids + [data_utils.SEG_ID_PAD] * delta_len + else: + input_ids = [0] * delta_len + input_ids + input_mask = [1] * delta_len + input_mask + segment_ids = [data_utils.SEG_ID_PAD] * delta_len + segment_ids + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + if label_list is not None: + label_id = label_map[example.label] + else: + label_id = example.label + if example_index < 5: + logging.info("*** Example ***") + logging.info("guid: %s", (example.guid)) + logging.info("input_ids: %s", " ".join([str(x) for x in input_ids])) + logging.info("input_mask: %s", " ".join([str(x) for x in input_mask])) + logging.info("segment_ids: %s", " ".join([str(x) for x in segment_ids])) + logging.info("label: %d (id = %d)", example.label, label_id) + + feature = InputFeatures( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + label_id=label_id) + return feature diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/common_flags.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/common_flags.py new file mode 100644 index 0000000..93d9499 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/common_flags.py @@ -0,0 +1,146 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common flags used in XLNet model.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import flags + +flags.DEFINE_string("master", default=None, help="master") +flags.DEFINE_string( + "tpu", + default=None, + help="The Cloud TPU to use for training. This should be " + "either the name used when creating the Cloud TPU, or a " + "url like grpc://ip.address.of.tpu:8470.") +flags.DEFINE_bool( + "use_tpu", default=True, help="Use TPUs rather than plain CPUs.") +flags.DEFINE_string("tpu_topology", "2x2", help="TPU topology.") +flags.DEFINE_integer( + "num_core_per_host", default=8, help="number of cores per host") + +flags.DEFINE_string("model_dir", default=None, help="Estimator model_dir.") +flags.DEFINE_string( + "init_checkpoint", + default=None, + help="Checkpoint path for initializing the model.") +flags.DEFINE_bool( + "init_from_transformerxl", + default=False, + help="Init from a transformerxl model checkpoint. Otherwise, init from the " + "entire model checkpoint.") + +# Optimization config +flags.DEFINE_float("learning_rate", default=1e-4, help="Maximum learning rate.") +flags.DEFINE_float("clip", default=1.0, help="Gradient clipping value.") +flags.DEFINE_float("weight_decay_rate", default=0.0, help="Weight decay rate.") + +# lr decay +flags.DEFINE_integer( + "warmup_steps", default=0, help="Number of steps for linear lr warmup.") +flags.DEFINE_float("adam_epsilon", default=1e-8, help="Adam epsilon.") +flags.DEFINE_float( + "lr_layer_decay_rate", + default=1.0, + help="Top layer: lr[L] = FLAGS.learning_rate." + "Lower layers: lr[l-1] = lr[l] * lr_layer_decay_rate.") +flags.DEFINE_float( + "min_lr_ratio", default=0.0, help="Minimum ratio learning rate.") + +# Training config +flags.DEFINE_integer( + "train_batch_size", + default=16, + help="Size of the train batch across all hosts.") +flags.DEFINE_integer( + "train_steps", default=100000, help="Total number of training steps.") +flags.DEFINE_integer( + "iterations", default=1000, help="Number of iterations per repeat loop.") + +# Data config +flags.DEFINE_integer( + "seq_len", default=0, help="Sequence length for pretraining.") +flags.DEFINE_integer( + "reuse_len", + default=0, + help="How many tokens to be reused in the next batch. " + "Could be half of `seq_len`.") +flags.DEFINE_bool("uncased", False, help="Use uncased inputs or not.") +flags.DEFINE_bool( + "bi_data", + default=False, + help="Use bidirectional data streams, " + "i.e., forward & backward.") +flags.DEFINE_integer("n_token", 32000, help="Vocab size") + +# Model config +flags.DEFINE_integer("mem_len", default=0, help="Number of steps to cache") +flags.DEFINE_bool("same_length", default=False, help="Same length attention") +flags.DEFINE_integer("clamp_len", default=-1, help="Clamp length") + +flags.DEFINE_integer("n_layer", default=6, help="Number of layers.") +flags.DEFINE_integer("d_model", default=32, help="Dimension of the model.") +flags.DEFINE_integer("d_embed", default=32, help="Dimension of the embeddings.") +flags.DEFINE_integer("n_head", default=4, help="Number of attention heads.") +flags.DEFINE_integer( + "d_head", default=8, help="Dimension of each attention head.") +flags.DEFINE_integer( + "d_inner", + default=32, + help="Dimension of inner hidden size in positionwise " + "feed-forward.") +flags.DEFINE_float("dropout", default=0.1, help="Dropout rate.") +flags.DEFINE_float("dropout_att", default=0.1, help="Attention dropout rate.") +flags.DEFINE_bool("untie_r", default=False, help="Untie r_w_bias and r_r_bias") +flags.DEFINE_string( + "ff_activation", + default="relu", + help="Activation type used in position-wise feed-forward.") +flags.DEFINE_string( + "strategy_type", + default="tpu", + help="Activation type used in position-wise feed-forward.") +flags.DEFINE_bool("use_bfloat16", False, help="Whether to use bfloat16.") + +# Parameter initialization +flags.DEFINE_enum( + "init_method", + default="normal", + enum_values=["normal", "uniform"], + help="Initialization method.") +flags.DEFINE_float( + "init_std", default=0.02, help="Initialization std when init is normal.") +flags.DEFINE_float( + "init_range", default=0.1, help="Initialization std when init is uniform.") + +flags.DEFINE_integer( + "test_data_size", default=12048, help="Number of test data samples.") +flags.DEFINE_string( + "train_tfrecord_path", + default=None, + help="Path to preprocessed training set tfrecord.") +flags.DEFINE_string( + "test_tfrecord_path", + default=None, + help="Path to preprocessed test set tfrecord.") +flags.DEFINE_integer( + "test_batch_size", + default=16, + help="Size of the test batch across all hosts.") +flags.DEFINE_integer( + "save_steps", default=1000, help="Number of steps for saving checkpoint.") +FLAGS = flags.FLAGS diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/data_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/data_utils.py new file mode 100644 index 0000000..91326e0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/data_utils.py @@ -0,0 +1,828 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utilities used for data preparation.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import collections +import json +import os +from absl import logging + +import numpy as np +import tensorflow as tf + + +special_symbols = { + "": 0, + "": 1, + "": 2, + "": 3, + "": 4, + "": 5, + "": 6, + "": 7, + "": 8, +} + +VOCAB_SIZE = 32000 +UNK_ID = special_symbols[""] +CLS_ID = special_symbols[""] +SEP_ID = special_symbols[""] +MASK_ID = special_symbols[""] +EOD_ID = special_symbols[""] +SEG_ID_P = 0 +SEG_ID_Q = 1 +SEG_ID_CLS = 2 +SEG_ID_PAD = 3 + + +OnlineMaskingConfig = collections.namedtuple("OnlineMaskingConfig", [ + "sample_strategy", "max_num_tokens", "min_num_tokens", "max_num_words", + "min_num_words"]) + + +def file_based_input_fn_builder(input_file, name_to_features, batch_size, + is_training): + """Creates an `input_fn` closure.""" + + logging.info("Input tfrecord file %s", input_file) + + def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.io.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.cast(t, tf.int32) + example[name] = t + + return example + + def input_fn(): + """Returns dataset for training/evaluation.""" + num_threads = 8 + if isinstance(input_file, str): + d = tf.data.TFRecordDataset(input_file) + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + if is_training: + d = d.shuffle(2048) + d = d.repeat() + else: + cycle_length = min(num_threads, len(input_file)) + d = tf.data.Dataset.from_tensor_slices(input_file) + # file level shuffle + d = d.shuffle(len(input_file)).repeat() + + d = d.apply( + tf.data.experimental.parallel_interleave( + tf.data.TFRecordDataset, + sloppy=is_training, + cycle_length=cycle_length)) + + if is_training: + # sample level shuffle + d = d.shuffle(buffer_size=2048) + + # TODO(b/138223458): Hard-code drop_remainder=True to get around the bug + # that under TPU strategy, setting drop_remainder=False in + # tf.data.Dataset.batch() while data_size can be divided by global + # batch_size will trigger dynamic_dimension related TPU compilation error. + d = d.apply( + tf.data.experimental.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + num_parallel_batches=num_threads, + drop_remainder=True)) + + # When `input_file` is a path to a single file or a list + # containing a single path, disable auto sharding so that + # same input file is sent to all workers. + if isinstance(input_file, str) or len(input_file) == 1: + options = tf.data.Options() + options.experimental_distribute.auto_shard_policy = ( + tf.data.experimental.AutoShardPolicy.OFF) + d = d.with_options(options) + + d = d.prefetch(tf.data.experimental.AUTOTUNE) + return d + + return input_fn + + +def create_classification_dataset(file_path, seq_length, batch_size, + is_training): + """Creates input dataset from (tf)records files for pretraining.""" + name_to_features = { + "input_ids": tf.io.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.io.FixedLenFeature([seq_length], tf.float32), + "segment_ids": tf.io.FixedLenFeature([seq_length], tf.int64), + "label_ids": tf.io.FixedLenFeature([], tf.int64), + "is_real_example": tf.io.FixedLenFeature([], tf.int64), + } + + input_fn = file_based_input_fn_builder(file_path, name_to_features, + batch_size, is_training) + dataset = input_fn() + return dataset + + +def create_squad_dataset(file_path, seq_length, batch_size, is_training): + """Creates input dataset from (tf)records files for pretraining.""" + name_to_features = { + "unique_ids": tf.io.FixedLenFeature([], tf.int64), + "input_ids": tf.io.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.io.FixedLenFeature([seq_length], tf.float32), + "segment_ids": tf.io.FixedLenFeature([seq_length], tf.int64), + "cls_index": tf.io.FixedLenFeature([], tf.int64), + "p_mask": tf.io.FixedLenFeature([seq_length], tf.float32) + } + + if is_training: + name_to_features["start_positions"] = tf.io.FixedLenFeature([], tf.int64) + name_to_features["end_positions"] = tf.io.FixedLenFeature([], tf.int64) + name_to_features["is_impossible"] = tf.io.FixedLenFeature([], tf.float32) + + input_fn = file_based_input_fn_builder(file_path, name_to_features, + batch_size, is_training) + dataset = input_fn() + return dataset + + +def get_input_iterator(input_fn, strategy): + """Returns distributed dataset iterator.""" + + # When training with TPU pods, datasets needs to be cloned across + # workers. Since Dataset instance cannot be cloned in eager mode, we instead + # pass callable that returns a dataset. + input_data = input_fn() + if callable(input_data): + iterator = iter( + strategy.experimental_distribute_datasets_from_function(input_data)) + else: + iterator = iter(strategy.experimental_distribute_dataset(input_data)) + return iterator + + +def get_classification_input_data(batch_size, seq_len, strategy, is_training, + file_path): + """Returns input dataset from input file string.""" + + # When using TPU pods, we need to clone dataset across + # workers and need to pass in function that returns the dataset rather + # than passing dataset instance itself. + use_dataset_fn = isinstance(strategy, tf.distribute.experimental.TPUStrategy) + if use_dataset_fn: + if batch_size % strategy.num_replicas_in_sync != 0: + raise ValueError( + "Batch size must be divisible by number of replicas : {}".format( + strategy.num_replicas_in_sync)) + + # As auto rebatching is not supported in + # `experimental_distribute_datasets_from_function()` API, which is + # required when cloning dataset to multiple workers in eager mode, + # we use per-replica batch size. + batch_size = int(batch_size / strategy.num_replicas_in_sync) + + def _dataset_fn(ctx=None): + del ctx + + train_dataset = create_classification_dataset( + file_path=file_path, + seq_length=seq_len, + batch_size=batch_size, + is_training=is_training) + return train_dataset + + return _dataset_fn if use_dataset_fn else _dataset_fn() + + +def get_squad_input_data(batch_size, seq_len, q_len, strategy, is_training, + file_path): + """Returns input dataset from input file string.""" + + # When using TPU pods, we need to clone dataset across + # workers and need to pass in function that returns the dataset rather + # than passing dataset instance itself. + use_dataset_fn = isinstance(strategy, tf.distribute.experimental.TPUStrategy) + if use_dataset_fn: + if batch_size % strategy.num_replicas_in_sync != 0: + raise ValueError( + "Batch size must be divisible by number of replicas : {}".format( + strategy.num_replicas_in_sync)) + + # As auto rebatching is not supported in + # `experimental_distribute_datasets_from_function()` API, which is + # required when cloning dataset to multiple workers in eager mode, + # we use per-replica batch size. + batch_size = int(batch_size / strategy.num_replicas_in_sync) + + if is_training: + input_glob = os.path.join( + file_path, + "spiece.model.*.slen-{}.qlen-{}.train.tf_record".format(seq_len, q_len)) + + global_input_paths = tf.io.gfile.glob(input_glob) + else: + global_input_paths = file_path + + def _dataset_fn(ctx=None): + del ctx + + train_dataset = create_squad_dataset( + file_path=global_input_paths, + seq_length=seq_len, + batch_size=batch_size, + is_training=is_training) + return train_dataset + + return _dataset_fn if use_dataset_fn else _dataset_fn() + + +def _idx_pair_to_mask(beg_indices, end_indices, inputs, tgt_len, num_predict): + """Turn beg and end indices into actual mask.""" + non_func_mask = tf.logical_and( + tf.not_equal(inputs, SEP_ID), + tf.not_equal(inputs, CLS_ID)) + all_indices = tf.where( + non_func_mask, + tf.range(tgt_len, dtype=tf.int64), + tf.constant(-1, shape=[tgt_len], dtype=tf.int64)) + candidate_matrix = tf.cast( + tf.logical_and( + all_indices[None, :] >= beg_indices[:, None], + all_indices[None, :] < end_indices[:, None]), + tf.float32) + cumsum_matrix = tf.reshape( + tf.cumsum(tf.reshape(candidate_matrix, [-1])), + [-1, tgt_len]) + masked_matrix = tf.cast(cumsum_matrix <= num_predict, tf.float32) + target_mask = tf.reduce_sum(candidate_matrix * masked_matrix, axis=0) + is_masked = tf.cast(target_mask, tf.bool) + + return is_masked, target_mask + + +def _word_span_mask(inputs, tgt_len, num_predict, min_num_words, + max_num_words, boundary): + """Sample whole word spans as prediction targets.""" + # Note: 1.2 is the token-to-word ratio + mask_alpha = tgt_len / num_predict / 1.2 + round_to_int = lambda x: tf.cast(tf.round(x), tf.int64) + + # Sample span lengths from a zipf distribution + span_len_seq = np.arange(min_num_words, max_num_words + 1) + probs = np.array([1.0 / (i + 1) for i in span_len_seq]) + probs /= np.sum(probs) + logits = tf.constant(np.log(probs), dtype=tf.float32) + + # Sample `num_predict` words here: note that this is over sampling + span_lens = tf.random.categorical( + logits=logits[None], + num_samples=num_predict, + dtype=tf.int64, + )[0] + min_num_words + + # Sample the ratio [0.0, 1.0) of left context lengths + span_lens_float = tf.cast(span_lens, tf.float32) + left_ratio = tf.random.uniform(shape=[num_predict], minval=0.0, maxval=1.0) + left_ctx_len = left_ratio * span_lens_float * (mask_alpha - 1) + + left_ctx_len = round_to_int(left_ctx_len) + right_offset = round_to_int(span_lens_float * mask_alpha) - left_ctx_len + + beg_indices = (tf.cumsum(left_ctx_len) + + tf.cumsum(right_offset, exclusive=True)) + end_indices = beg_indices + span_lens + + # Remove out of range indices + max_boundary_index = tf.cast(tf.shape(boundary)[0] - 1, tf.int64) + valid_idx_mask = end_indices < max_boundary_index + beg_indices = tf.boolean_mask(beg_indices, valid_idx_mask) + end_indices = tf.boolean_mask(end_indices, valid_idx_mask) + + beg_indices = tf.gather(boundary, beg_indices) + end_indices = tf.gather(boundary, end_indices) + + # Shuffle valid indices + num_valid = tf.cast(tf.shape(beg_indices)[0], tf.int64) + order = tf.random.shuffle(tf.range(num_valid, dtype=tf.int64)) + beg_indices = tf.gather(beg_indices, order) + end_indices = tf.gather(end_indices, order) + + return _idx_pair_to_mask(beg_indices, end_indices, inputs, tgt_len, + num_predict) + + +def _token_span_mask(inputs, tgt_len, num_predict, min_num_tokens, + max_num_tokens): + """Sample token spans as prediction targets.""" + mask_alpha = tgt_len / num_predict + round_to_int = lambda x: tf.cast(tf.round(x), tf.int64) + + # Sample span lengths from a zipf distribution + span_len_seq = np.arange(min_num_tokens, max_num_tokens + 1) + probs = np.array([1.0 / (i + 1) for i in span_len_seq]) + + probs /= np.sum(probs) + logits = tf.constant(np.log(probs), dtype=tf.float32) + span_lens = tf.random.categorical( + logits=logits[None], + num_samples=num_predict, + dtype=tf.int64, + )[0] + min_num_tokens + + # Sample the ratio [0.0, 1.0) of left context lengths + span_lens_float = tf.cast(span_lens, tf.float32) + left_ratio = tf.random.uniform(shape=[num_predict], minval=0.0, maxval=1.0) + left_ctx_len = left_ratio * span_lens_float * (mask_alpha - 1) + left_ctx_len = round_to_int(left_ctx_len) + + # Compute the offset from left start to the right end + right_offset = round_to_int(span_lens_float * mask_alpha) - left_ctx_len + + # Get the actual begin and end indices + beg_indices = (tf.cumsum(left_ctx_len) + + tf.cumsum(right_offset, exclusive=True)) + end_indices = beg_indices + span_lens + + # Remove out of range indices + valid_idx_mask = end_indices < tgt_len + beg_indices = tf.boolean_mask(beg_indices, valid_idx_mask) + end_indices = tf.boolean_mask(end_indices, valid_idx_mask) + + # Shuffle valid indices + num_valid = tf.cast(tf.shape(beg_indices)[0], tf.int64) + order = tf.random.shuffle(tf.range(num_valid, dtype=tf.int64)) + beg_indices = tf.gather(beg_indices, order) + end_indices = tf.gather(end_indices, order) + + return _idx_pair_to_mask(beg_indices, end_indices, inputs, tgt_len, + num_predict) + + +def _whole_word_mask(inputs, tgt_len, num_predict, boundary): + """Sample whole words as prediction targets.""" + pair_indices = tf.concat([boundary[:-1, None], boundary[1:, None]], axis=1) + cand_pair_indices = tf.random.shuffle(pair_indices)[:num_predict] + beg_indices = cand_pair_indices[:, 0] + end_indices = cand_pair_indices[:, 1] + + return _idx_pair_to_mask(beg_indices, end_indices, inputs, tgt_len, + num_predict) + + +def _single_token_mask(inputs, tgt_len, num_predict): + """Sample individual tokens as prediction targets.""" + all_indices = tf.range(tgt_len, dtype=tf.int64) + non_func_mask = tf.logical_and( + tf.not_equal(inputs, SEP_ID), + tf.not_equal(inputs, CLS_ID)) + non_func_indices = tf.boolean_mask(all_indices, non_func_mask) + + masked_pos = tf.random.shuffle(non_func_indices) + masked_pos = tf.sort(masked_pos[:num_predict]) + target_mask = tf.sparse_to_dense( + sparse_indices=masked_pos, + output_shape=[tgt_len], + sparse_values=1.0, + default_value=0.0) + + is_masked = tf.cast(target_mask, tf.bool) + + return is_masked, target_mask + + +def _online_sample_masks(inputs, tgt_len, num_predict, online_masking_config, + boundary=None): + """Sample target positions to predict.""" + logging.info("Online sample with strategy: `%s`.", + online_masking_config.sample_strategy) + if online_masking_config.sample_strategy == "single_token": + return _single_token_mask(inputs, tgt_len, num_predict) + elif online_masking_config.sample_strategy == "whole_word": + assert boundary is not None, "whole word sampling requires `boundary`" + return _whole_word_mask(inputs, tgt_len, num_predict, boundary) + elif online_masking_config.sample_strategy == "token_span": + return _token_span_mask(inputs, tgt_len, num_predict, + online_masking_config.min_num_tokens, + online_masking_config.max_num_tokens) + elif online_masking_config.sample_strategy == "word_span": + assert boundary is not None, "word span sampling requires `boundary`" + return _word_span_mask(inputs, tgt_len, num_predict, + online_masking_config.min_num_words, + online_masking_config.max_num_words, + boundary) + else: + raise NotImplementedError + + +def create_pretrain_dataset(file_names, + bsz_per_core, + seq_len, + reuse_len, + perm_size, + leak_ratio, + online_masking_config, + num_predict=None, + input_pipeline_context=None): + """Creates pretrain dataset.""" + + def parser(record): + """Function used to parse tfrecord.""" + + record_spec = { + "input": tf.io.FixedLenFeature([seq_len], tf.int64), + "seg_id": tf.io.FixedLenFeature([seq_len], tf.int64), + "label": tf.io.FixedLenFeature([1], tf.int64), + } + + if online_masking_config.sample_strategy in ["whole_word", "word_span"]: + logging.info("Add `boundary` spec for %s", + online_masking_config.sample_strategy) + record_spec["boundary"] = tf.io.VarLenFeature(tf.int64) + + # retrieve serialized example + example = tf.io.parse_single_example( + serialized=record, features=record_spec) + + inputs = example.pop("input") + if online_masking_config.sample_strategy in ["whole_word", "word_span"]: + boundary = tf.sparse.to_dense(example.pop("boundary")) + else: + boundary = None + is_masked, _ = _online_sample_masks( + inputs, seq_len, num_predict, online_masking_config, boundary=boundary) + + if reuse_len > 0: + ##### Use memory + # permutate the reuse and non-reuse parts separately + non_reuse_len = seq_len - reuse_len + assert reuse_len % perm_size == 0 and non_reuse_len % perm_size == 0 + + # Creates permutation mask and target mask for the first reuse_len tokens. + # The tokens in this part are reused from the last sequence. + perm_mask_0, target_mask_0, input_k_0, input_q_0 = _local_perm( + inputs[:reuse_len], is_masked[:reuse_len], perm_size, reuse_len, + leak_ratio) + + # Creates permutation mask and target mask for the rest of tokens in + # current example, which are concatentation of two new segments. + perm_mask_1, target_mask_1, input_k_1, input_q_1 = _local_perm( + inputs[reuse_len:], is_masked[reuse_len:], perm_size, non_reuse_len, + leak_ratio) + + perm_mask_0 = tf.concat( + [perm_mask_0, tf.ones([reuse_len, non_reuse_len])], axis=1) + perm_mask_1 = tf.concat( + [tf.zeros([non_reuse_len, reuse_len]), perm_mask_1], axis=1) + perm_mask = tf.concat([perm_mask_0, perm_mask_1], axis=0) + target_mask = tf.concat([target_mask_0, target_mask_1], axis=0) + input_k = tf.concat([input_k_0, input_k_1], axis=0) + input_q = tf.concat([input_q_0, input_q_1], axis=0) + else: + ##### Do not use memory + assert seq_len % perm_size == 0 + # permutate the entire sequence together + perm_mask, target_mask, input_k, input_q = _local_perm( + inputs, is_masked, perm_size, seq_len, leak_ratio) + + # reshape back to fixed shape + example["perm_mask"] = tf.reshape(perm_mask, [seq_len, seq_len]) + example["input_k"] = tf.reshape(input_k, [seq_len]) + example["input_q"] = tf.reshape(input_q, [seq_len]) + + # Directly use raw inputs as the target + target = inputs + + if num_predict is not None: + indices = tf.range(seq_len, dtype=tf.int64) + bool_target_mask = tf.cast(target_mask, tf.bool) + indices = tf.boolean_mask(indices, bool_target_mask) + + ##### extra padding due to CLS/SEP introduced after prepro + actual_num_predict = tf.shape(indices)[0] + pad_len = num_predict - actual_num_predict + + ##### target_mapping + target_mapping = tf.one_hot(indices, seq_len, dtype=tf.float32) + paddings = tf.zeros([pad_len, seq_len], dtype=target_mapping.dtype) + target_mapping = tf.concat([target_mapping, paddings], axis=0) + example["target_mapping"] = tf.reshape(target_mapping, + [num_predict, seq_len]) + + ##### target + target = tf.boolean_mask(target, bool_target_mask) + paddings = tf.zeros([pad_len], dtype=target.dtype) + target = tf.concat([target, paddings], axis=0) + example["target"] = tf.reshape(target, [num_predict]) + + ##### target mask + target_mask = tf.concat( + [tf.ones([actual_num_predict], dtype=tf.float32), + tf.zeros([pad_len], dtype=tf.float32)], + axis=0) + example["target_mask"] = tf.reshape(target_mask, [num_predict]) + else: + example["target"] = tf.reshape(target, [seq_len]) + example["target_mask"] = tf.reshape(target_mask, [seq_len]) + + for key in list(example.keys()): + val = example[key] + if tf.keras.backend.is_sparse(val): + val = tf.sparse.to_dense(val) + if val.dtype == tf.int64: + val = tf.cast(val, tf.int32) + + example[key] = val + + for k, v in example.items(): + logging.info("%s: %s", k, v) + + return example + + dataset = parse_files_to_dataset( + parser=parser, + file_paths=file_names, + bsz_per_core=bsz_per_core, + sequential=reuse_len > 0, + input_pipeline_context=input_pipeline_context) + + return dataset + + +def format_filename(prefix, suffix, bsz_per_host, seq_len, reuse_len=None, + uncased=False): + """Generates input file name pattern.""" + if reuse_len is not None and reuse_len > 0: + reuse_str = "reuse-{}.".format(reuse_len) + bsz_str = "hostbsz-{}.".format(bsz_per_host) + else: + reuse_str = "" + bsz_str = "" + + if not uncased: + case_str = "" + else: + case_str = "uncased." + + file_name = "{}.seq-{}.{}{}{}{}".format( + prefix, seq_len, reuse_str, bsz_str, case_str, suffix) + + return file_name + + +def get_pretrain_input_data(batch_size, + seq_len, + strategy, + file_path, + reuse_len, + perm_size, + leak_ratio, + num_predict, + uncased, + online_masking_config, + num_hosts=1): + """Returns input dataset from input file string.""" + + # When using TPU pods, we need to clone dataset across + # workers and need to pass in function that returns the dataset rather + # than passing dataset instance itself. + use_dataset_fn = isinstance(strategy, tf.distribute.experimental.TPUStrategy) + split = "train" + bsz_per_host = int(batch_size / num_hosts) + record_glob_base = format_filename( + prefix="meta.{}.pass-*".format(split), + suffix="json*", + bsz_per_host=bsz_per_host, + seq_len=seq_len, + reuse_len=reuse_len, + uncased=uncased) + + def _get_num_batch(info): + if "num_batch" in info: + return info["num_batch"] + elif "num_example" in info: + return info["num_example"] / bsz_per_host + else: + raise ValueError("Do not have sample info.") + + if use_dataset_fn: + if batch_size % strategy.num_replicas_in_sync != 0: + raise ValueError( + "Batch size must be divisible by number of replicas : {}".format( + strategy.num_replicas_in_sync)) + + # As auto rebatching is not supported in + # `experimental_distribute_datasets_from_function()` API, which is + # required when cloning dataset to multiple workers in eager mode, + # we use per-replica batch size. + batch_size = int(batch_size / strategy.num_replicas_in_sync) + + record_info = {"num_batch": 0, "filenames": []} + + tfrecord_dirs = file_path.split(",") + logging.info("Use the following tfrecord dirs: %s", tfrecord_dirs) + + for idx, record_dir in enumerate(tfrecord_dirs): + record_glob = os.path.join(record_dir, record_glob_base) + logging.info("[%d] Record glob: %s", idx, record_glob) + + record_paths = sorted(tf.io.gfile.glob(record_glob)) + logging.info("[%d] Num of record info path: %d", idx, len(record_paths)) + + cur_record_info = {"num_batch": 0, "filenames": []} + + for record_info_path in record_paths: + with tf.io.gfile.GFile(record_info_path, "r") as fp: + info = json.load(fp) + cur_record_info["num_batch"] += int(_get_num_batch(info)) + cur_record_info["filenames"] += info["filenames"] + + # overwrite directory for `cur_record_info` + new_filenames = [] + for filename in cur_record_info["filenames"]: + basename = os.path.basename(filename) + new_filename = os.path.join(record_dir, basename) + new_filenames.append(new_filename) + cur_record_info["filenames"] = new_filenames + + logging.info("[Dir %d] Number of chosen batches: %s", idx, + cur_record_info["num_batch"]) + logging.info("[Dir %d] Number of chosen files: %s", idx, + len(cur_record_info["filenames"])) + logging.info(cur_record_info["filenames"]) + + # add `cur_record_info` to global `record_info` + record_info["num_batch"] += cur_record_info["num_batch"] + record_info["filenames"] += cur_record_info["filenames"] + + logging.info("Total number of batches: %d", record_info["num_batch"]) + logging.info("Total number of files: %d", len(record_info["filenames"])) + logging.info(record_info["filenames"]) + + def _dataset_fn(ctx=None): + """Function that can create a pretrain dataset.""" + + train_dataset = create_pretrain_dataset( + file_names=record_info["filenames"], + bsz_per_core=batch_size, + seq_len=seq_len, + reuse_len=reuse_len, + perm_size=perm_size, + leak_ratio=leak_ratio, + online_masking_config=online_masking_config, + num_predict=num_predict, + input_pipeline_context=ctx) + return train_dataset + + return _dataset_fn if use_dataset_fn else _dataset_fn() + + +def parse_files_to_dataset(parser, + file_paths, + bsz_per_core, + sequential, + input_pipeline_context=None): + """Creates the dataset given file paths.""" + + dataset = tf.data.Dataset.from_tensor_slices(file_paths) + + # Note: we cannot perform sample-level shuffle here because this will violate + # the consecutive requirement of data stream. + + if input_pipeline_context and input_pipeline_context.num_input_pipelines > 1: + dataset = dataset.shard(input_pipeline_context.num_input_pipelines, + input_pipeline_context.input_pipeline_id) + # file-level shuffle + if len(file_paths) > 1: + dataset = dataset.shuffle(len(file_paths)) + + if sequential: + # Note: cannot perform sample-level shuffle here because this will violate + # the consecutive requirement of data stream. + dataset = tf.data.TFRecordDataset(dataset) + else: + # `cycle_length` is the number of parallel files that get read. + cycle_length = min(8, len(file_paths)) + logging.info("Interleave %d files", cycle_length) + + # `sloppy` mode means that the interleaving is not exact. This adds + # even more randomness to the training pipeline. + dataset = dataset.apply( + tf.data.experimental.parallel_interleave( + tf.data.TFRecordDataset, + sloppy=True, + cycle_length=cycle_length)) + buffer_size = 2048 + logging.info("Perform sample-level shuffle with size %d", buffer_size) + dataset = dataset.shuffle(buffer_size=buffer_size) + + # (zihang): since we are doing online preprocessing, the parsed result of + # the same input at each time will be different. Thus, cache processed data + # is not helpful. It will use a lot of memory and lead to contrainer OOM. + # So, change to cache non-parsed raw data instead. + dataset = dataset.cache().map(parser).repeat() + dataset = dataset.batch(bsz_per_core, drop_remainder=True) + dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE) + + return dataset + + +def _local_perm(inputs, is_masked, perm_size, seq_len, leak_ratio): + """Samples a permutation of the factorization order. + + Creates perm_mask and target_mask accordingly. + + Args: + inputs: int64 Tensor in shape [seq_len], input ids. + is_masked: bool Tensor in shape [seq_len]. True means being selected for + partial prediction. + perm_size: the length of longest permutation. Could be set to be reuse_len. + Should not be larger than reuse_len or there will be data leaks. + seq_len: int, sequence length. + leak_ratio: float, percent of masked tokens that are leaked. + + Returns: + perm_mask: float32 Tensor in shape [seq_len, seq_len] consisted of 0 and 1. + If perm_mask[i][j] == 1, it means the ith token (in original order) cannot + attend to the jth token + (in original order). This case will happen only when the ith token's + permutated position <= the jth token's permutated position, + and the jth token is masked or is func token. If perm_mask[i][j] == 0, it + means the ith token (in original order) can attend to the jth token + (in original order). Note that non-masked tokens can be attended by all + other tokens, which is different from the description in original paper. + target_mask: float32 Tensor in shape [seq_len] consisted of 0 and 1. If + target_mask[i] == 1, + the ith token needs to be predicted and mask will be used as input. This + token will count for loss. + If target_mask[i] == 0, token (or [SEP], [CLS]) will be used as input. This + token will not count for loss. + inputs_k: int64 Tensor in shape [seq_len], input ids. + inputs_q: float32 Tensor in shape [seq_len], the same as target_mask. + + """ + + # Generate permutation indices + index = tf.range(seq_len, dtype=tf.int64) + index = tf.transpose(tf.reshape(index, [-1, perm_size])) + index = tf.random.shuffle(index) + index = tf.reshape(tf.transpose(index), [-1]) + + # non-functional tokens + non_func_tokens = tf.logical_not(tf.logical_or( + tf.equal(inputs, SEP_ID), + tf.equal(inputs, CLS_ID))) + masked_tokens = tf.logical_and(is_masked, non_func_tokens) + non_masked_or_func_tokens = tf.logical_not(masked_tokens) + + smallest_index = -2 * tf.ones([seq_len], dtype=tf.int64) + + # Similar to BERT, randomly leak some masked tokens + if leak_ratio > 0: + leak_tokens = tf.logical_and( + masked_tokens, + tf.random.uniform([seq_len], maxval=1.0) < leak_ratio) + can_attend_self = tf.logical_or(non_masked_or_func_tokens, leak_tokens) + else: + can_attend_self = non_masked_or_func_tokens + to_index = tf.where(can_attend_self, smallest_index, index) + from_index = tf.where(can_attend_self, to_index + 1, to_index) + + # For masked tokens, can attend if i > j + # For context tokens, always can attend each other + can_attend = from_index[:, None] > to_index[None, :] + + # In modeling, 1 indicates cannot attend. Hence, reverse the value here. + perm_mask = 1.0 - tf.cast(can_attend, tf.float32) + + # Only masked tokens are included in the loss + target_mask = tf.cast(masked_tokens, tf.float32) + + # construct inputs_k + inputs_k = inputs + + # construct inputs_q + inputs_q = masked_tokens + + return perm_mask, target_mask, inputs_k, inputs_q diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/optimization.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/optimization.py new file mode 100644 index 0000000..0d90316 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/optimization.py @@ -0,0 +1,102 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions and classes related to optimization (weight updates).""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging +import tensorflow as tf +from official.nlp import optimization + + +class WarmUp(tf.keras.optimizers.schedules.LearningRateSchedule): + """Applys a warmup schedule on a given learning rate decay schedule.""" + + def __init__(self, + initial_learning_rate, + decay_schedule_fn, + warmup_steps, + power=1.0, + name=None): + super(WarmUp, self).__init__() + self.initial_learning_rate = initial_learning_rate + self.warmup_steps = warmup_steps + self.power = power + self.decay_schedule_fn = decay_schedule_fn + self.name = name + + def __call__(self, step): + with tf.name_scope(self.name or "WarmUp") as name: + # Implements polynomial warmup. i.e., if global_step < warmup_steps, the + # learning rate will be `global_step/num_warmup_steps * init_lr`. + global_step_float = tf.cast(step, tf.float32) + warmup_steps_float = tf.cast(self.warmup_steps, tf.float32) + warmup_percent_done = global_step_float / warmup_steps_float + warmup_learning_rate = ( + self.initial_learning_rate * + tf.math.pow(warmup_percent_done, self.power)) + return tf.cond( + global_step_float < warmup_steps_float, + lambda: warmup_learning_rate, + lambda: self.decay_schedule_fn(step - self.warmup_steps), + name=name) + + def get_config(self): + return { + "initial_learning_rate": self.initial_learning_rate, + "decay_schedule_fn": self.decay_schedule_fn, + "warmup_steps": self.warmup_steps, + "power": self.power, + "name": self.name + } + + +def create_optimizer(init_lr, + num_train_steps, + num_warmup_steps, + min_lr_ratio=0.0, + adam_epsilon=1e-8, + weight_decay_rate=0.0): + """Creates an optimizer with learning rate schedule.""" + # Implements linear decay of the learning rate. + learning_rate_fn = tf.keras.optimizers.schedules.PolynomialDecay( + initial_learning_rate=init_lr, + decay_steps=num_train_steps - num_warmup_steps, + end_learning_rate=init_lr * min_lr_ratio) + if num_warmup_steps: + learning_rate_fn = WarmUp( + initial_learning_rate=init_lr, + decay_schedule_fn=learning_rate_fn, + warmup_steps=num_warmup_steps) + if weight_decay_rate > 0.0: + logging.info( + "Using AdamWeightDecay with adam_epsilon=%.9f weight_decay_rate=%.3f", + adam_epsilon, weight_decay_rate) + optimizer = optimization.AdamWeightDecay( + learning_rate=learning_rate_fn, + weight_decay_rate=weight_decay_rate, + beta_1=0.9, + beta_2=0.999, + epsilon=adam_epsilon, + exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"], + include_in_weight_decay=["r_s_bias", "r_r_bias", "r_w_bias"]) + else: + logging.info("Using Adam with adam_epsilon=%.9f", (adam_epsilon)) + optimizer = tf.keras.optimizers.Adam( + learning_rate=learning_rate_fn, epsilon=adam_epsilon) + + return optimizer, learning_rate_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_classification_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_classification_data.py new file mode 100644 index 0000000..9b34ffe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_classification_data.py @@ -0,0 +1,457 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Script to pre-process classification data into tfrecords.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import csv +import os + +from absl import app +from absl import flags +from absl import logging +import numpy as np +import tensorflow as tf + +import sentencepiece as spm +from official.nlp.xlnet import classifier_utils +from official.nlp.xlnet import preprocess_utils + + +flags.DEFINE_bool( + "overwrite_data", + default=False, + help="If False, will use cached data if available.") +flags.DEFINE_string("output_dir", default="", help="Output dir for TF records.") +flags.DEFINE_string( + "spiece_model_file", default="", help="Sentence Piece model path.") +flags.DEFINE_string("data_dir", default="", help="Directory for input data.") + +# task specific +flags.DEFINE_string("eval_split", default="dev", help="could be dev or test") +flags.DEFINE_string("task_name", default=None, help="Task name") +flags.DEFINE_integer( + "eval_batch_size", default=64, help="batch size for evaluation") +flags.DEFINE_integer("max_seq_length", default=128, help="Max sequence length") +flags.DEFINE_integer( + "num_passes", + default=1, + help="Num passes for processing training data. " + "This is use to batch data without loss for TPUs.") +flags.DEFINE_bool("uncased", default=False, help="Use uncased.") +flags.DEFINE_bool( + "is_regression", default=False, help="Whether it's a regression task.") +flags.DEFINE_bool( + "use_bert_format", + default=False, + help="Whether to use BERT format to arrange input data.") + +FLAGS = flags.FLAGS + + +class InputExample(object): + """A single training/test example for simple sequence classification.""" + + def __init__(self, guid, text_a, text_b=None, label=None): + """Constructs a InputExample. + + Args: + guid: Unique id for the example. + text_a: string. The untokenized text of the first sequence. For single + sequence tasks, only this sequence must be specified. + text_b: (Optional) string. The untokenized text of the second sequence. + Only must be specified for sequence pair tasks. + label: (Optional) string. The label of the example. This should be + specified for train and dev examples, but not for test examples. + """ + self.guid = guid + self.text_a = text_a + self.text_b = text_b + self.label = label + + +class DataProcessor(object): + """Base class for data converters for sequence classification data sets.""" + + def get_train_examples(self, data_dir): + """Gets a collection of `InputExample`s for the train set.""" + raise NotImplementedError() + + def get_dev_examples(self, data_dir): + """Gets a collection of `InputExample`s for the dev set.""" + raise NotImplementedError() + + def get_test_examples(self, data_dir): + """Gets a collection of `InputExample`s for prediction.""" + raise NotImplementedError() + + def get_labels(self): + """Gets the list of labels for this data set.""" + raise NotImplementedError() + + @classmethod + def _read_tsv(cls, input_file, quotechar=None): + """Reads a tab separated value file.""" + with tf.io.gfile.GFile(input_file, "r") as f: + reader = csv.reader(f, delimiter="\t", quotechar=quotechar) + lines = [] + for line in reader: + # pylint: disable=g-explicit-length-test + if len(line) == 0: + continue + lines.append(line) + return lines + + +class GLUEProcessor(DataProcessor): + """GLUEProcessor.""" + + def __init__(self): + self.train_file = "train.tsv" + self.dev_file = "dev.tsv" + self.test_file = "test.tsv" + self.label_column = None + self.text_a_column = None + self.text_b_column = None + self.contains_header = True + self.test_text_a_column = None + self.test_text_b_column = None + self.test_contains_header = True + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, self.train_file)), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, self.dev_file)), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + if self.test_text_a_column is None: + self.test_text_a_column = self.text_a_column + if self.test_text_b_column is None: + self.test_text_b_column = self.text_b_column + + return self._create_examples( + self._read_tsv(os.path.join(data_dir, self.test_file)), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0 and self.contains_header and set_type != "test": + continue + if i == 0 and self.test_contains_header and set_type == "test": + continue + guid = "%s-%s" % (set_type, i) + + a_column = ( + self.text_a_column if set_type != "test" else self.test_text_a_column) + b_column = ( + self.text_b_column if set_type != "test" else self.test_text_b_column) + + # there are some incomplete lines in QNLI + if len(line) <= a_column: + logging.warning("Incomplete line, ignored.") + continue + text_a = line[a_column] + + if b_column is not None: + if len(line) <= b_column: + logging.warning("Incomplete line, ignored.") + continue + text_b = line[b_column] + else: + text_b = None + + if set_type == "test": + label = self.get_labels()[0] + else: + if len(line) <= self.label_column: + logging.warning("Incomplete line, ignored.") + continue + label = line[self.label_column] + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class Yelp5Processor(DataProcessor): + """Yelp5Processor.""" + + def get_train_examples(self, data_dir): + return self._create_examples(os.path.join(data_dir, "train.csv")) + + def get_dev_examples(self, data_dir): + return self._create_examples(os.path.join(data_dir, "test.csv")) + + def get_labels(self): + """See base class.""" + return ["1", "2", "3", "4", "5"] + + def _create_examples(self, input_file): + """Creates examples for the training and dev sets.""" + examples = [] + with tf.io.gfile.GFile(input_file) as f: + reader = csv.reader(f) + for i, line in enumerate(reader): + + label = line[0] + text_a = line[1].replace('""', '"').replace('\\"', '"') + examples.append( + InputExample(guid=str(i), text_a=text_a, text_b=None, label=label)) + return examples + + +class ImdbProcessor(DataProcessor): + """ImdbProcessor.""" + + def get_labels(self): + return ["neg", "pos"] + + def get_train_examples(self, data_dir): + return self._create_examples(os.path.join(data_dir, "train")) + + def get_dev_examples(self, data_dir): + return self._create_examples(os.path.join(data_dir, "test")) + + def _create_examples(self, data_dir): + """Creates examples.""" + examples = [] + for label in ["neg", "pos"]: + cur_dir = os.path.join(data_dir, label) + for filename in tf.io.gfile.listdir(cur_dir): + if not filename.endswith("txt"): + continue + + if len(examples) % 1000 == 0: + logging.info("Loading dev example %d", len(examples)) + + path = os.path.join(cur_dir, filename) + with tf.io.gfile.GFile(path) as f: + text = f.read().strip().replace("
", " ") + examples.append( + InputExample( + guid="unused_id", text_a=text, text_b=None, label=label)) + return examples + + +class MnliMatchedProcessor(GLUEProcessor): + """MnliMatchedProcessor.""" + + def __init__(self): + super(MnliMatchedProcessor, self).__init__() + self.dev_file = "dev_matched.tsv" + self.test_file = "test_matched.tsv" + self.label_column = -1 + self.text_a_column = 8 + self.text_b_column = 9 + + def get_labels(self): + return ["contradiction", "entailment", "neutral"] + + +class MnliMismatchedProcessor(MnliMatchedProcessor): + + def __init__(self): + super(MnliMismatchedProcessor, self).__init__() + self.dev_file = "dev_mismatched.tsv" + self.test_file = "test_mismatched.tsv" + + +class StsbProcessor(GLUEProcessor): + """StsbProcessor.""" + + def __init__(self): + super(StsbProcessor, self).__init__() + self.label_column = 9 + self.text_a_column = 7 + self.text_b_column = 8 + + def get_labels(self): + return [0.0] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0 and self.contains_header and set_type != "test": + continue + if i == 0 and self.test_contains_header and set_type == "test": + continue + guid = "%s-%s" % (set_type, i) + + a_column = ( + self.text_a_column if set_type != "test" else self.test_text_a_column) + b_column = ( + self.text_b_column if set_type != "test" else self.test_text_b_column) + + # there are some incomplete lines in QNLI + if len(line) <= a_column: + logging.warning("Incomplete line, ignored.") + continue + text_a = line[a_column] + + if b_column is not None: + if len(line) <= b_column: + logging.warning("Incomplete line, ignored.") + continue + text_b = line[b_column] + else: + text_b = None + + if set_type == "test": + label = self.get_labels()[0] + else: + if len(line) <= self.label_column: + logging.warning("Incomplete line, ignored.") + continue + label = float(line[self.label_column]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + + return examples + + +def file_based_convert_examples_to_features(examples, + label_list, + max_seq_length, + tokenize_fn, + output_file, + num_passes=1): + """Convert a set of `InputExample`s to a TFRecord file.""" + + # do not create duplicated records + if tf.io.gfile.exists(output_file) and not FLAGS.overwrite_data: + logging.info("Do not overwrite tfrecord %s exists.", output_file) + return + + logging.info("Create new tfrecord %s.", output_file) + + writer = tf.io.TFRecordWriter(output_file) + + examples *= num_passes + + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + logging.info("Writing example %d of %d", ex_index, len(examples)) + + feature = classifier_utils.convert_single_example(ex_index, example, + label_list, + max_seq_length, + tokenize_fn, + FLAGS.use_bert_format) + + def create_int_feature(values): + f = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return f + + def create_float_feature(values): + f = tf.train.Feature(float_list=tf.train.FloatList(value=list(values))) + return f + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_float_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + if label_list is not None: + features["label_ids"] = create_int_feature([feature.label_id]) + else: + features["label_ids"] = create_float_feature([float(feature.label_id)]) + features["is_real_example"] = create_int_feature( + [int(feature.is_real_example)]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writer.write(tf_example.SerializeToString()) + writer.close() + + +def main(_): + logging.set_verbosity(logging.INFO) + processors = { + "mnli_matched": MnliMatchedProcessor, + "mnli_mismatched": MnliMismatchedProcessor, + "sts-b": StsbProcessor, + "imdb": ImdbProcessor, + "yelp5": Yelp5Processor + } + + task_name = FLAGS.task_name.lower() + + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + processor = processors[task_name]() + label_list = processor.get_labels() if not FLAGS.is_regression else None + + sp = spm.SentencePieceProcessor() + sp.Load(FLAGS.spiece_model_file) + + def tokenize_fn(text): + text = preprocess_utils.preprocess_text(text, lower=FLAGS.uncased) + return preprocess_utils.encode_ids(sp, text) + + spm_basename = os.path.basename(FLAGS.spiece_model_file) + + train_file_base = "{}.len-{}.train.tf_record".format(spm_basename, + FLAGS.max_seq_length) + train_file = os.path.join(FLAGS.output_dir, train_file_base) + logging.info("Use tfrecord file %s", train_file) + + train_examples = processor.get_train_examples(FLAGS.data_dir) + np.random.shuffle(train_examples) + logging.info("Num of train samples: %d", len(train_examples)) + + file_based_convert_examples_to_features(train_examples, label_list, + FLAGS.max_seq_length, tokenize_fn, + train_file, FLAGS.num_passes) + if FLAGS.eval_split == "dev": + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + else: + eval_examples = processor.get_test_examples(FLAGS.data_dir) + + logging.info("Num of eval samples: %d", len(eval_examples)) + + # TPU requires a fixed batch size for all batches, therefore the number + # of examples must be a multiple of the batch size, or else examples + # will get dropped. So we pad with fake examples which are ignored + # later on. These do NOT count towards the metric (all tf.metrics + # support a per-instance weight, and these get a weight of 0.0). + # + # Modified in XL: We also adopt the same mechanism for GPUs. + while len(eval_examples) % FLAGS.eval_batch_size != 0: + eval_examples.append(classifier_utils.PaddingInputExample()) + + eval_file_base = "{}.len-{}.{}.eval.tf_record".format(spm_basename, + FLAGS.max_seq_length, + FLAGS.eval_split) + eval_file = os.path.join(FLAGS.output_dir, eval_file_base) + + file_based_convert_examples_to_features(eval_examples, label_list, + FLAGS.max_seq_length, tokenize_fn, + eval_file) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_pretrain_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_pretrain_data.py new file mode 100644 index 0000000..9bf5367 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_pretrain_data.py @@ -0,0 +1,998 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Script to pre-process pre-training data into tfrecords.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import random + +from absl import app +from absl import flags +import absl.logging as _logging # pylint: disable=unused-import + +import numpy as np + + +import tensorflow.google as tf +from official.nlp.xlnet import preprocess_utils +import sentencepiece as spm + + +special_symbols = { + "" : 0, + "" : 1, + "" : 2, + "" : 3, + "" : 4, + "" : 5, + "" : 6, + "" : 7, + "" : 8, +} + +VOCAB_SIZE = 32000 +UNK_ID = special_symbols[""] +CLS_ID = special_symbols[""] +SEP_ID = special_symbols[""] +MASK_ID = special_symbols[""] +EOD_ID = special_symbols[""] + + +def _int64_feature(values): + return tf.train.Feature(int64_list=tf.train.Int64List(value=values)) + + +def _float_feature(values): + return tf.train.Feature(float_list=tf.train.FloatList(value=values)) + + +def format_filename(prefix, bsz_per_host, seq_len, bi_data, suffix, + mask_alpha=5, mask_beta=1, reuse_len=None, uncased=False, + fixed_num_predict=None): + """docs.""" + if reuse_len is None: + reuse_len_str = "" + else: + reuse_len_str = "reuse-{}.".format(reuse_len) + if not uncased: + uncased_str = "" + else: + uncased_str = "uncased." + if bi_data: + bi_data_str = "bi" + else: + bi_data_str = "uni" + if fixed_num_predict is not None: + fnp_str = "fnp-{}.".format(fixed_num_predict) + else: + fnp_str = "" + + file_name = "{}.bsz-{}.seqlen-{}.{}{}{}.alpha-{}.beta-{}.{}{}".format( + prefix, bsz_per_host, seq_len, reuse_len_str, uncased_str, bi_data_str, + mask_alpha, mask_beta, fnp_str, suffix) + + return file_name + + +def _create_data(idx, input_paths): + # Load sentence-piece model + sp = spm.SentencePieceProcessor() + sp.Load(FLAGS.sp_path) + + input_shards = [] + total_line_cnt = 0 + for input_path in input_paths: + input_data, sent_ids = [], [] + sent_id, line_cnt = True, 0 + tf.logging.info("Processing %s", input_path) + for line in tf.gfile.Open(input_path): + if line_cnt % 100000 == 0: + tf.logging.info("Loading line %d", line_cnt) + line_cnt += 1 + + if not line.strip(): + if FLAGS.use_eod: + sent_id = not sent_id + cur_sent = [EOD_ID] + else: + continue + else: + if FLAGS.from_raw_text: + cur_sent = preprocess_utils.preprocess_text( + line.strip(), lower=FLAGS.uncased) + cur_sent = preprocess_utils.encode_ids(sp, cur_sent) + else: + cur_sent = list(map(int, line.strip().split())) + + input_data.extend(cur_sent) + sent_ids.extend([sent_id] * len(cur_sent)) + sent_id = not sent_id + + tf.logging.info("Finish with line %d", line_cnt) + if line_cnt == 0: + continue + + input_data = np.array(input_data, dtype=np.int64) + sent_ids = np.array(sent_ids, dtype=np.bool) + + total_line_cnt += line_cnt + input_shards.append((input_data, sent_ids)) + + tf.logging.info("[Task %d] Total number line: %d", idx, total_line_cnt) + + tfrecord_dir = os.path.join(FLAGS.save_dir, "tfrecords") + + filenames, num_batch = [], 0 + + # Randomly shuffle input shards (with a fixed but distinct random seed) + np.random.seed(100 * FLAGS.task + FLAGS.pass_id) + + perm_indices = np.random.permutation(len(input_shards)) + tf.logging.info("Using perm indices %s for pass %d", + perm_indices.tolist(), FLAGS.pass_id) + + input_data_list, sent_ids_list = [], [] + prev_sent_id = None + for perm_idx in perm_indices: + input_data, sent_ids = input_shards[perm_idx] + # make sure the `send_ids[0] == not prev_sent_id` + if prev_sent_id is not None and sent_ids[0] == prev_sent_id: + sent_ids = np.logical_not(sent_ids) + + # append to temporary list + input_data_list.append(input_data) + sent_ids_list.append(sent_ids) + + # update `prev_sent_id` + prev_sent_id = sent_ids[-1] + + input_data = np.concatenate(input_data_list) + sent_ids = np.concatenate(sent_ids_list) + + file_name, cur_num_batch = create_tfrecords( + save_dir=tfrecord_dir, + basename="{}-{}-{}".format(FLAGS.split, idx, FLAGS.pass_id), + data=[input_data, sent_ids], + bsz_per_host=FLAGS.bsz_per_host, + seq_len=FLAGS.seq_len, + bi_data=FLAGS.bi_data, + sp=sp, + ) + + filenames.append(file_name) + num_batch += cur_num_batch + + record_info = { + "filenames": filenames, + "num_batch": num_batch + } + + return record_info + + +def create_data(_): + # Validate FLAGS + assert FLAGS.bsz_per_host % FLAGS.num_core_per_host == 0 + if not FLAGS.use_tpu: + FLAGS.num_core_per_host = 1 # forced to be one + + # Make workdirs + if not tf.gfile.Exists(FLAGS.save_dir): + tf.gfile.MakeDirs(FLAGS.save_dir) + + tfrecord_dir = os.path.join(FLAGS.save_dir, "tfrecords") + if not tf.gfile.Exists(tfrecord_dir): + tf.gfile.MakeDirs(tfrecord_dir) + + # Create and dump corpus_info from task 0 + if FLAGS.task == 0 and FLAGS.pass_id == 0: + corpus_info = { + "vocab_size": VOCAB_SIZE, + "bsz_per_host": FLAGS.bsz_per_host, + "num_core_per_host": FLAGS.num_core_per_host, + "seq_len": FLAGS.seq_len, + "reuse_len": FLAGS.reuse_len, + "uncased": FLAGS.uncased, + "bi_data": FLAGS.bi_data, + "mask_alpha": FLAGS.mask_alpha, + "mask_beta": FLAGS.mask_beta, + "num_predict": FLAGS.num_predict, + "use_eod": FLAGS.use_eod, + "sp_path": FLAGS.sp_path, + "input_glob": FLAGS.input_glob, + } + corpus_info_path = os.path.join(FLAGS.save_dir, "corpus_info.json") + with tf.gfile.Open(corpus_info_path, "w") as fp: + json.dump(corpus_info, fp) + + # Interleavely split the work into FLAGS.num_task splits + file_paths = sorted(tf.gfile.Glob(FLAGS.input_glob)) + tf.logging.info("Use glob: %s", FLAGS.input_glob) + tf.logging.info("Find %d files: %s", len(file_paths), file_paths) + + task_file_paths = file_paths[FLAGS.task::FLAGS.num_task] + if not task_file_paths: + tf.logging.info("Exit: task %d has no file to process.", FLAGS.task) + return + + tf.logging.info("Task %d process %d files: %s", + FLAGS.task, len(task_file_paths), task_file_paths) + record_info = _create_data(FLAGS.task, task_file_paths) + + record_prefix = "record_info-{}-{}-{}".format( + FLAGS.split, FLAGS.task, FLAGS.pass_id) + record_name = format_filename( + prefix=record_prefix, + bsz_per_host=FLAGS.bsz_per_host, + seq_len=FLAGS.seq_len, + mask_alpha=FLAGS.mask_alpha, + mask_beta=FLAGS.mask_beta, + reuse_len=FLAGS.reuse_len, + bi_data=FLAGS.bi_data, + suffix="json", + uncased=FLAGS.uncased, + fixed_num_predict=FLAGS.num_predict) + record_info_path = os.path.join(tfrecord_dir, record_name) + + with tf.gfile.Open(record_info_path, "w") as fp: + json.dump(record_info, fp) + + +def batchify(data, bsz_per_host, sent_ids=None): + num_step = len(data) // bsz_per_host + data = data[:bsz_per_host * num_step] + data = data.reshape(bsz_per_host, num_step) + if sent_ids is not None: + sent_ids = sent_ids[:bsz_per_host * num_step] + sent_ids = sent_ids.reshape(bsz_per_host, num_step) + + if sent_ids is not None: + return data, sent_ids + return data + + +def _split_a_and_b(data, sent_ids, begin_idx, tot_len, extend_target=False): + """Split two segments from `data` starting from the index `begin_idx`.""" + + data_len = data.shape[0] + if begin_idx + tot_len >= data_len: + tf.logging.info("[_split_a_and_b] returns None: " + "begin_idx %d + tot_len %d >= data_len %d", + begin_idx, tot_len, data_len) + return None + + end_idx = begin_idx + 1 + cut_points = [] + while end_idx < data_len: + if sent_ids[end_idx] != sent_ids[end_idx - 1]: + if end_idx - begin_idx >= tot_len: break + cut_points.append(end_idx) + end_idx += 1 + + a_begin = begin_idx + if len(cut_points) == 0 or random.random() < 0.5: + label = 0 + if len(cut_points) == 0: + a_end = end_idx + else: + a_end = random.choice(cut_points) + + b_len = max(1, tot_len - (a_end - a_begin)) + # (zihangd): `data_len - 1` to account for extend_target + b_begin = random.randint(0, data_len - 1 - b_len) + b_end = b_begin + b_len + while b_begin > 0 and sent_ids[b_begin - 1] == sent_ids[b_begin]: + b_begin -= 1 + # (zihangd): `data_len - 1` to account for extend_target + while b_end < data_len - 1 and sent_ids[b_end - 1] == sent_ids[b_end]: + b_end += 1 + + new_begin = a_end + else: + label = 1 + a_end = random.choice(cut_points) + b_begin = a_end + b_end = end_idx + + new_begin = b_end + + while a_end - a_begin + b_end - b_begin > tot_len: + if a_end - a_begin > b_end - b_begin: + # delete the right side only for the LM objective + a_end -= 1 + else: + b_end -= 1 + + ret = [data[a_begin: a_end], data[b_begin: b_end], label, new_begin] + + if extend_target: + if a_end >= data_len or b_end >= data_len: + tf.logging.info("[_split_a_and_b] returns None: " + "a_end %d or b_end %d >= data_len %d", + a_end, b_end, data_len) + return None + a_target = data[a_begin + 1: a_end + 1] + b_target = data[b_begin: b_end + 1] + ret.extend([a_target, b_target]) + + return ret + + +def _is_start_piece(piece): + special_pieces = set(list('!"#$%&\"()*+,-./:;?@[\\]^_`{|}~')) + if (piece.startswith("▁") or piece.startswith("<") + or piece in special_pieces): + return True + else: + return False + + +def _sample_mask(sp, seg, reverse=False, max_gram=5, goal_num_predict=None): + """Sample `goal_num_predict` tokens for partial prediction. + About `mask_beta` tokens are chosen in a context of `mask_alpha` tokens.""" + + seg_len = len(seg) + mask = np.array([False] * seg_len, dtype=np.bool) + + num_predict = 0 + + ngrams = np.arange(1, max_gram + 1, dtype=np.int64) + pvals = 1. / np.arange(1, max_gram + 1) + pvals /= pvals.sum(keepdims=True) + + if reverse: + seg = np.flip(seg, 0) + + cur_len = 0 + while cur_len < seg_len: + if goal_num_predict is not None and num_predict >= goal_num_predict: break + + n = np.random.choice(ngrams, p=pvals) + if goal_num_predict is not None: + n = min(n, goal_num_predict - num_predict) + ctx_size = (n * FLAGS.mask_alpha) // FLAGS.mask_beta + l_ctx = np.random.choice(ctx_size) + r_ctx = ctx_size - l_ctx + + # Find the start position of a complete token + beg = cur_len + l_ctx + while beg < seg_len and not _is_start_piece(sp.IdToPiece(seg[beg].item())): + beg += 1 + if beg >= seg_len: + break + + # Find the end position of the n-gram (start pos of the n+1-th gram) + end = beg + 1 + cnt_ngram = 1 + while end < seg_len: + cnt_ngram += 1 + if cnt_ngram > n: + break + end += 1 + if end >= seg_len: + break + + # Update + mask[beg:end] = True + num_predict += end - beg + + cur_len = end + r_ctx + + while goal_num_predict is not None and num_predict < goal_num_predict: + i = np.random.randint(seg_len) + if not mask[i]: + mask[i] = True + num_predict += 1 + + if reverse: + mask = np.flip(mask, 0) + + return mask + + +def _sample_mask_ngram(sp, seg, reverse=False, max_gram=5, + goal_num_predict=None): + """Sample `goal_num_predict` tokens for partial prediction. + About `mask_beta` tokens are chosen in a context of `mask_alpha` tokens.""" + + seg_len = len(seg) + mask = np.array([False] * seg_len, dtype=np.bool) + + num_predict = 0 + + ngrams = np.arange(1, max_gram + 1, dtype=np.int64) + pvals = 1. / np.arange(1, max_gram + 1) + pvals /= pvals.sum(keepdims=True) + + if reverse: + seg = np.flip(seg, 0) + + cur_len = 0 + while cur_len < seg_len: + if goal_num_predict is not None and num_predict >= goal_num_predict: break + + n = np.random.choice(ngrams, p=pvals) + if goal_num_predict is not None: + n = min(n, goal_num_predict - num_predict) + ctx_size = (n * FLAGS.mask_alpha) // FLAGS.mask_beta + l_ctx = np.random.choice(ctx_size) + r_ctx = ctx_size - l_ctx + + # Find the start position of a complete token + beg = cur_len + l_ctx + while beg < seg_len and not _is_start_piece(sp.IdToPiece(seg[beg].item())): + beg += 1 + if beg >= seg_len: + break + + # Find the end position of the n-gram (start pos of the n+1-th gram) + end = beg + cnt_ngram = 0 + while end < seg_len: + if _is_start_piece(sp.IdToPiece(seg[end].item())): + cnt_ngram += 1 + if cnt_ngram > n: + break + + # select current piece + mask[end] = True + + # update the end pointer and increment num_predict + end += 1 + num_predict += 1 + + if goal_num_predict is not None and num_predict >= goal_num_predict: + break + + cur_len = end + r_ctx + + while goal_num_predict is not None and num_predict < goal_num_predict: + i = np.random.randint(seg_len) + if not mask[i]: + mask[i] = True + num_predict += 1 + + if reverse: + mask = np.flip(mask, 0) + + return mask + + +def create_tfrecords(save_dir, basename, data, bsz_per_host, seq_len, + bi_data, sp): + data, sent_ids = data[0], data[1] + + num_core = FLAGS.num_core_per_host + bsz_per_core = bsz_per_host // num_core + + if bi_data: + assert bsz_per_host % (2 * FLAGS.num_core_per_host) == 0 + fwd_data, fwd_sent_ids = batchify(data, bsz_per_host // 2, sent_ids) + + fwd_data = fwd_data.reshape(num_core, 1, bsz_per_core // 2, -1) + fwd_sent_ids = fwd_sent_ids.reshape(num_core, 1, bsz_per_core // 2, -1) + + bwd_data = fwd_data[:, :, :, ::-1] + bwd_sent_ids = fwd_sent_ids[:, :, :, ::-1] + + data = np.concatenate( + [fwd_data, bwd_data], 1).reshape(bsz_per_host, -1) + sent_ids = np.concatenate( + [fwd_sent_ids, bwd_sent_ids], 1).reshape(bsz_per_host, -1) + else: + data, sent_ids = batchify(data, bsz_per_host, sent_ids) + + tf.logging.info("Raw data shape %s.", data.shape) + + file_name = format_filename( + prefix=basename, + bsz_per_host=bsz_per_host, + seq_len=seq_len, + bi_data=bi_data, + suffix="tfrecords", + mask_alpha=FLAGS.mask_alpha, + mask_beta=FLAGS.mask_beta, + reuse_len=FLAGS.reuse_len, + uncased=FLAGS.uncased, + fixed_num_predict=FLAGS.num_predict + ) + save_path = os.path.join(save_dir, file_name) + record_writer = tf.python_io.TFRecordWriter(save_path) + tf.logging.info("Start writing %s.", save_path) + + num_batch = 0 + reuse_len = FLAGS.reuse_len + + # [sep] x 2 + [cls] + assert reuse_len < seq_len - 3 + + data_len = data.shape[1] + sep_array = np.array([SEP_ID], dtype=np.int64) + cls_array = np.array([CLS_ID], dtype=np.int64) + + i = 0 + while i + seq_len <= data_len: + if num_batch % 500 == 0: + tf.logging.info("Processing batch %d", num_batch) + + all_ok = True + features = [] + for idx in range(bsz_per_host): + inp = data[idx, i: i + reuse_len] + tgt = data[idx, i + 1: i + reuse_len + 1] + + results = _split_a_and_b( + data[idx], + sent_ids[idx], + begin_idx=i + reuse_len, + tot_len=seq_len - reuse_len - 3, + extend_target=True) + if results is None: + tf.logging.info("Break out with seq idx %d", i) + all_ok = False + break + + # unpack the results + (a_data, b_data, label, _, a_target, b_target) = tuple(results) + + # sample ngram spans to predict + reverse = bi_data and (idx // (bsz_per_core // 2)) % 2 == 1 + if FLAGS.num_predict is None: + num_predict_0 = num_predict_1 = None + else: + num_predict_1 = FLAGS.num_predict // 2 + num_predict_0 = FLAGS.num_predict - num_predict_1 + mask_0 = _sample_mask(sp, inp, reverse=reverse, + goal_num_predict=num_predict_0) + mask_1 = _sample_mask(sp, np.concatenate([a_data, sep_array, b_data, + sep_array, cls_array]), + reverse=reverse, goal_num_predict=num_predict_1) + + # concatenate data + cat_data = np.concatenate([inp, a_data, sep_array, b_data, + sep_array, cls_array]) + seg_id = ([0] * (reuse_len + a_data.shape[0]) + [0] + + [1] * b_data.shape[0] + [1] + [2]) + assert cat_data.shape[0] == seq_len + assert mask_0.shape[0] == seq_len // 2 + assert mask_1.shape[0] == seq_len // 2 + + # the last two CLS's are not used, just for padding purposes + tgt = np.concatenate([tgt, a_target, b_target, cls_array, cls_array]) + assert tgt.shape[0] == seq_len + + is_masked = np.concatenate([mask_0, mask_1], 0) + if FLAGS.num_predict is not None: + assert np.sum(is_masked) == FLAGS.num_predict + + feature = { + "input": _int64_feature(cat_data), + "is_masked": _int64_feature(is_masked), + "target": _int64_feature(tgt), + "seg_id": _int64_feature(seg_id), + "label": _int64_feature([label]), + } + features.append(feature) + + if all_ok: + assert len(features) == bsz_per_host + for feature in features: + example = tf.train.Example(features=tf.train.Features(feature=feature)) + record_writer.write(example.SerializeToString()) + num_batch += 1 + else: + break + + i += reuse_len + + record_writer.close() + tf.logging.info("Done writing %s. Num of batches: %d", save_path, num_batch) + + return save_path, num_batch + + +################ +# get_input_fn # +################ +def _convert_example(example, use_bfloat16): + """Cast int64 into int32 and float32 to bfloat16 if use_bfloat16.""" + for key in list(example.keys()): + val = example[key] + if tf.keras.backend.is_sparse(val): + val = tf.sparse.to_dense(val) + if val.dtype == tf.int64: + val = tf.cast(val, tf.int32) + if use_bfloat16 and val.dtype == tf.float32: + val = tf.cast(val, tf.bfloat16) + + example[key] = val + + +def parse_files_to_dataset(parser, file_names, split, num_batch, num_hosts, + host_id, num_core_per_host, bsz_per_core): + # list of file pathes + num_files = len(file_names) + num_files_per_host = num_files // num_hosts + my_start_file_id = host_id * num_files_per_host + my_end_file_id = (host_id + 1) * num_files_per_host + if host_id == num_hosts - 1: + my_end_file_id = num_files + file_paths = file_names[my_start_file_id: my_end_file_id] + tf.logging.info("Host %d handles %d files", host_id, len(file_paths)) + + assert split == "train" + dataset = tf.data.Dataset.from_tensor_slices(file_paths) + + # file-level shuffle + if len(file_paths) > 1: + dataset = dataset.shuffle(len(file_paths)) + + # Note: we cannot perform sample-level shuffle here because this will violate + # the consecutive requirement of data stream. + dataset = tf.data.TFRecordDataset(dataset) + + # Note: since we are doing online preprocessing, the parsed result of + # the same input at each time will be different. Thus, cache processed data + # is not helpful. It will use a lot of memory and lead to contrainer OOM. + # So, change to cache non-parsed raw data instead. + dataset = dataset.cache().map(parser).repeat() + dataset = dataset.batch(bsz_per_core, drop_remainder=True) + dataset = dataset.prefetch(num_core_per_host * bsz_per_core) + + return dataset + + +def _local_perm(inputs, targets, is_masked, perm_size, seq_len): + """ + Sample a permutation of the factorization order, and create an + attention mask accordingly. + + Args: + inputs: int64 Tensor in shape [seq_len], input ids. + targets: int64 Tensor in shape [seq_len], target ids. + is_masked: bool Tensor in shape [seq_len]. True means being selected + for partial prediction. + perm_size: the length of longest permutation. Could be set to be reuse_len. + Should not be larger than reuse_len or there will be data leaks. + seq_len: int, sequence length. + """ + + # Generate permutation indices + index = tf.range(seq_len, dtype=tf.int64) + index = tf.transpose(tf.reshape(index, [-1, perm_size])) + index = tf.random_shuffle(index) + index = tf.reshape(tf.transpose(index), [-1]) + + # `perm_mask` and `target_mask` + # non-functional tokens + non_func_tokens = tf.logical_not(tf.logical_or( + tf.equal(inputs, SEP_ID), + tf.equal(inputs, CLS_ID))) + + non_mask_tokens = tf.logical_and(tf.logical_not(is_masked), non_func_tokens) + masked_or_func_tokens = tf.logical_not(non_mask_tokens) + + # Set the permutation indices of non-masked (& non-funcional) tokens to the + # smallest index (-1): + # (1) they can be seen by all other positions + # (2) they cannot see masked positions, so there won"t be information leak + smallest_index = -tf.ones([seq_len], dtype=tf.int64) + rev_index = tf.where(non_mask_tokens, smallest_index, index) + + # Create `target_mask`: non-funcional and maksed tokens + # 1: use mask as input and have loss + # 0: use token (or [SEP], [CLS]) as input and do not have loss + target_tokens = tf.logical_and(masked_or_func_tokens, non_func_tokens) + target_mask = tf.cast(target_tokens, tf.float32) + + # Create `perm_mask` + # `target_tokens` cannot see themselves + self_rev_index = tf.where(target_tokens, rev_index, rev_index + 1) + + # 1: cannot attend if i <= j and j is not non-masked (masked_or_func_tokens) + # 0: can attend if i > j or j is non-masked + perm_mask = tf.logical_and( + self_rev_index[:, None] <= rev_index[None, :], + masked_or_func_tokens) + perm_mask = tf.cast(perm_mask, tf.float32) + + # new target: [next token] for LM and [curr token] (self) for PLM + new_targets = tf.concat([inputs[0: 1], targets[: -1]], + axis=0) + + # construct inputs_k + inputs_k = inputs + + # construct inputs_q + inputs_q = target_mask + + return perm_mask, new_targets, target_mask, inputs_k, inputs_q + + +def get_dataset(params, num_hosts, num_core_per_host, split, file_names, + num_batch, seq_len, reuse_len, perm_size, mask_alpha, + mask_beta, use_bfloat16=False, num_predict=None): + + bsz_per_core = params["batch_size"] + if num_hosts > 1: + host_id = params["context"].current_host + else: + host_id = 0 + + #### Function used to parse tfrecord + def parser(record): + """function used to parse tfrecord.""" + + record_spec = { + "input": tf.FixedLenFeature([seq_len], tf.int64), + "target": tf.FixedLenFeature([seq_len], tf.int64), + "seg_id": tf.FixedLenFeature([seq_len], tf.int64), + "label": tf.FixedLenFeature([1], tf.int64), + "is_masked": tf.FixedLenFeature([seq_len], tf.int64), + } + + # retrieve serialized example + example = tf.parse_single_example( + serialized=record, + features=record_spec) + + inputs = example.pop("input") + target = example.pop("target") + is_masked = tf.cast(example.pop("is_masked"), tf.bool) + + non_reuse_len = seq_len - reuse_len + assert perm_size <= reuse_len and perm_size <= non_reuse_len + + perm_mask_0, target_0, target_mask_0, input_k_0, input_q_0 = _local_perm( + inputs[:reuse_len], + target[:reuse_len], + is_masked[:reuse_len], + perm_size, + reuse_len) + + perm_mask_1, target_1, target_mask_1, input_k_1, input_q_1 = _local_perm( + inputs[reuse_len:], + target[reuse_len:], + is_masked[reuse_len:], + perm_size, + non_reuse_len) + + perm_mask_0 = tf.concat([perm_mask_0, tf.ones([reuse_len, non_reuse_len])], + axis=1) + perm_mask_1 = tf.concat([tf.zeros([non_reuse_len, reuse_len]), perm_mask_1], + axis=1) + perm_mask = tf.concat([perm_mask_0, perm_mask_1], axis=0) + target = tf.concat([target_0, target_1], axis=0) + target_mask = tf.concat([target_mask_0, target_mask_1], axis=0) + input_k = tf.concat([input_k_0, input_k_1], axis=0) + input_q = tf.concat([input_q_0, input_q_1], axis=0) + + if num_predict is not None: + indices = tf.range(seq_len, dtype=tf.int64) + bool_target_mask = tf.cast(target_mask, tf.bool) + indices = tf.boolean_mask(indices, bool_target_mask) + + ##### extra padding due to CLS/SEP introduced after prepro + actual_num_predict = tf.shape(indices)[0] + pad_len = num_predict - actual_num_predict + + ##### target_mapping + target_mapping = tf.one_hot(indices, seq_len, dtype=tf.float32) + paddings = tf.zeros([pad_len, seq_len], dtype=target_mapping.dtype) + target_mapping = tf.concat([target_mapping, paddings], axis=0) + example["target_mapping"] = tf.reshape(target_mapping, + [num_predict, seq_len]) + + ##### target + target = tf.boolean_mask(target, bool_target_mask) + paddings = tf.zeros([pad_len], dtype=target.dtype) + target = tf.concat([target, paddings], axis=0) + example["target"] = tf.reshape(target, [num_predict]) + + ##### target mask + target_mask = tf.concat( + [tf.ones([actual_num_predict], dtype=tf.float32), + tf.zeros([pad_len], dtype=tf.float32)], + axis=0) + example["target_mask"] = tf.reshape(target_mask, [num_predict]) + else: + example["target"] = tf.reshape(target, [seq_len]) + example["target_mask"] = tf.reshape(target_mask, [seq_len]) + + # reshape back to fixed shape + example["perm_mask"] = tf.reshape(perm_mask, [seq_len, seq_len]) + example["input_k"] = tf.reshape(input_k, [seq_len]) + example["input_q"] = tf.reshape(input_q, [seq_len]) + + _convert_example(example, use_bfloat16) + + for k, v in example.items(): + tf.logging.info("%s: %s", k, v) + + return example + + # Get dataset + dataset = parse_files_to_dataset( + parser=parser, + file_names=file_names, + split=split, + num_batch=num_batch, + num_hosts=num_hosts, + host_id=host_id, + num_core_per_host=num_core_per_host, + bsz_per_core=bsz_per_core) + + return dataset + + +def get_input_fn( + tfrecord_dir, + split, + bsz_per_host, + seq_len, + reuse_len, + bi_data, + num_hosts=1, + num_core_per_host=1, + perm_size=None, + mask_alpha=None, + mask_beta=None, + uncased=False, + num_passes=None, + use_bfloat16=False, + num_predict=None): + + # Merge all record infos into a single one + record_glob_base = format_filename( + prefix="record_info-{}-*".format(split), + bsz_per_host=bsz_per_host, + seq_len=seq_len, + bi_data=bi_data, + suffix="json", + mask_alpha=mask_alpha, + mask_beta=mask_beta, + reuse_len=reuse_len, + uncased=uncased, + fixed_num_predict=num_predict) + + record_info = {"num_batch": 0, "filenames": []} + + tfrecord_dirs = tfrecord_dir.split(",") + tf.logging.info("Use the following tfrecord dirs: %s", tfrecord_dirs) + + for idx, record_dir in enumerate(tfrecord_dirs): + record_glob = os.path.join(record_dir, record_glob_base) + tf.logging.info("[%d] Record glob: %s", idx, record_glob) + + record_paths = sorted(tf.gfile.Glob(record_glob)) + tf.logging.info("[%d] Num of record info path: %d", + idx, len(record_paths)) + + cur_record_info = {"num_batch": 0, "filenames": []} + + for record_info_path in record_paths: + if num_passes is not None: + record_info_name = os.path.basename(record_info_path) + fields = record_info_name.split(".")[0].split("-") + pass_id = int(fields[-1]) + if len(fields) == 5 and pass_id >= num_passes: + tf.logging.info("Skip pass %d: %s", pass_id, record_info_name) + continue + + with tf.gfile.Open(record_info_path, "r") as fp: + info = json.load(fp) + if num_passes is not None: + eff_num_passes = min(num_passes, len(info["filenames"])) + ratio = eff_num_passes / len(info["filenames"]) + cur_record_info["num_batch"] += int(info["num_batch"] * ratio) + cur_record_info["filenames"] += info["filenames"][:eff_num_passes] + else: + cur_record_info["num_batch"] += info["num_batch"] + cur_record_info["filenames"] += info["filenames"] + + # overwrite directory for `cur_record_info` + new_filenames = [] + for filename in cur_record_info["filenames"]: + basename = os.path.basename(filename) + new_filename = os.path.join(record_dir, basename) + new_filenames.append(new_filename) + cur_record_info["filenames"] = new_filenames + + tf.logging.info("[Dir %d] Number of chosen batches: %s", + idx, cur_record_info["num_batch"]) + tf.logging.info("[Dir %d] Number of chosen files: %s", + idx, len(cur_record_info["filenames"])) + tf.logging.info(cur_record_info["filenames"]) + + # add `cur_record_info` to global `record_info` + record_info["num_batch"] += cur_record_info["num_batch"] + record_info["filenames"] += cur_record_info["filenames"] + + tf.logging.info("Total number of batches: %d", + record_info["num_batch"]) + tf.logging.info("Total number of files: %d", + len(record_info["filenames"])) + tf.logging.info(record_info["filenames"]) + + def input_fn(params): + """docs.""" + assert params["batch_size"] * num_core_per_host == bsz_per_host + + dataset = get_dataset( + params=params, + num_hosts=num_hosts, + num_core_per_host=num_core_per_host, + split=split, + file_names=record_info["filenames"], + num_batch=record_info["num_batch"], + seq_len=seq_len, + reuse_len=reuse_len, + perm_size=perm_size, + mask_alpha=mask_alpha, + mask_beta=mask_beta, + use_bfloat16=use_bfloat16, + num_predict=num_predict) + + return dataset + + return input_fn, record_info + + +if __name__ == "__main__": + FLAGS = flags.FLAGS + flags.DEFINE_bool("use_tpu", True, help="whether to use TPUs") + flags.DEFINE_integer("bsz_per_host", 32, help="batch size per host.") + flags.DEFINE_integer("num_core_per_host", 8, help="num TPU cores per host.") + + flags.DEFINE_integer("seq_len", 512, + help="Sequence length.") + flags.DEFINE_integer("reuse_len", 256, + help="Number of token that can be reused as memory. " + "Could be half of `seq_len`.") + flags.DEFINE_bool("uncased", False, help="Use uncased inputs or not.") + flags.DEFINE_bool("bi_data", True, + help="whether to create bidirectional data") + flags.DEFINE_integer("mask_alpha", default=6, + help="How many tokens to form a group.") + flags.DEFINE_integer("mask_beta", default=1, + help="How many tokens to mask within each group.") + flags.DEFINE_bool("use_eod", True, + help="whether to append EOD at the end of a doc.") + flags.DEFINE_bool("from_raw_text", True, + help="Whether the input is raw text or encoded ids.") + flags.DEFINE_integer("num_predict", default=85, + help="Num of tokens to predict.") + + flags.DEFINE_string("input_glob", "data/example/*.txt", + help="Input file glob.") + flags.DEFINE_string("sp_path", "", help="Path to the sentence piece model.") + flags.DEFINE_string("save_dir", "proc_data/example", + help="Directory for saving the processed data.") + flags.DEFINE_enum("split", "train", ["train", "dev", "test"], + help="Save the data as which split.") + + flags.DEFINE_integer("pass_id", 0, help="ID of the current pass." + "Different passes sample different negative segment.") + flags.DEFINE_integer("num_task", 1, help="Number of total tasks.") + flags.DEFINE_integer("task", 0, help="The Task ID. This value is used when " + "using multiple workers to identify each worker.") + + tf.logging.set_verbosity(tf.logging.INFO) + app.run(create_data) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_squad_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_squad_data.py new file mode 100644 index 0000000..59c8944 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_squad_data.py @@ -0,0 +1,110 @@ +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Script to pre-process SQUAD data into tfrecords.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import random + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +import sentencepiece as spm +from official.nlp.xlnet import squad_utils + +flags.DEFINE_integer( + "num_proc", default=1, help="Number of preprocessing processes.") +flags.DEFINE_integer("proc_id", default=0, help="Process id for preprocessing.") + +# I/O paths +flags.DEFINE_string("output_dir", default="", help="Output dir for TF records.") +flags.DEFINE_string( + "spiece_model_file", default="", help="Sentence Piece model path.") +flags.DEFINE_string("train_file", default="", help="Path of train file.") +flags.DEFINE_string("predict_file", default="", help="Path of prediction file.") + +# Data preprocessing config +flags.DEFINE_integer("max_seq_length", default=512, help="Max sequence length") +flags.DEFINE_integer("max_query_length", default=64, help="Max query length") +flags.DEFINE_integer("doc_stride", default=128, help="Doc stride") +flags.DEFINE_bool("uncased", default=False, help="Use uncased data.") +flags.DEFINE_bool( + "create_train_data", default=True, help="Whether to create training data.") +flags.DEFINE_bool( + "create_eval_data", default=False, help="Whether to create eval data.") + +FLAGS = flags.FLAGS + + +def preprocess(): + """Preprocesses SQUAD data.""" + sp_model = spm.SentencePieceProcessor() + sp_model.Load(FLAGS.spiece_model_file) + spm_basename = os.path.basename(FLAGS.spiece_model_file) + if FLAGS.create_train_data: + train_rec_file = os.path.join( + FLAGS.output_dir, + "{}.{}.slen-{}.qlen-{}.train.tf_record".format(spm_basename, + FLAGS.proc_id, + FLAGS.max_seq_length, + FLAGS.max_query_length)) + + logging.info("Read examples from %s", FLAGS.train_file) + train_examples = squad_utils.read_squad_examples( + FLAGS.train_file, is_training=True) + train_examples = train_examples[FLAGS.proc_id::FLAGS.num_proc] + + # Pre-shuffle the input to avoid having to make a very large shuffle + # buffer in the `input_fn`. + random.shuffle(train_examples) + write_to_logging = "Write to " + train_rec_file + logging.info(write_to_logging) + train_writer = squad_utils.FeatureWriter( + filename=train_rec_file, is_training=True) + squad_utils.convert_examples_to_features( + examples=train_examples, + sp_model=sp_model, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=True, + output_fn=train_writer.process_feature, + uncased=FLAGS.uncased) + train_writer.close() + if FLAGS.create_eval_data: + eval_examples = squad_utils.read_squad_examples( + FLAGS.predict_file, is_training=False) + squad_utils.create_eval_data(spm_basename, sp_model, eval_examples, + FLAGS.max_seq_length, FLAGS.max_query_length, + FLAGS.doc_stride, FLAGS.uncased, + FLAGS.output_dir) + + +def main(_): + logging.set_verbosity(logging.INFO) + + if not tf.io.gfile.exists(FLAGS.output_dir): + tf.io.gfile.mkdir(FLAGS.output_dir) + + preprocess() + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_utils.py new file mode 100644 index 0000000..d0e8ae8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/preprocess_utils.py @@ -0,0 +1,125 @@ +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utilities for pre-processing.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import unicodedata + +import six + + +SPIECE_UNDERLINE = '▁' + + +def printable_text(text): + """Returns text encoded in a way suitable for print or `tf.logging`.""" + + # These functions want `str` for both Python2 and Python3, but in one case + # it's a Unicode string and in the other it's a byte string. + if six.PY3: + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode('utf-8', 'ignore') + else: + raise ValueError('Unsupported string type: %s' % (type(text))) + elif six.PY2: + if isinstance(text, str): + return text + elif isinstance(text, unicode): + return text.encode('utf-8') + else: + raise ValueError('Unsupported string type: %s' % (type(text))) + else: + raise ValueError('Not running on Python2 or Python 3?') + + +def print_(*args): + new_args = [] + for arg in args: + if isinstance(arg, list): + s = [printable_text(i) for i in arg] + s = ' '.join(s) + new_args.append(s) + else: + new_args.append(printable_text(arg)) + print(*new_args) + + +def preprocess_text(inputs, lower=False, remove_space=True, keep_accents=False): + """Preprocesses texts.""" + if remove_space: + outputs = ' '.join(inputs.strip().split()) + else: + outputs = inputs + + outputs = outputs.replace('``', '"').replace("''", '"') + + if six.PY2 and isinstance(outputs, str): + outputs = outputs.decode('utf-8') + + if not keep_accents: + outputs = unicodedata.normalize('NFKD', outputs) + outputs = ''.join([c for c in outputs if not unicodedata.combining(c)]) + if lower: + outputs = outputs.lower() + + return outputs + + +def encode_pieces(sp_model, text, return_unicode=True, sample=False): + """Encodes pieces.""" + # return_unicode is used only for py2 + + if six.PY2 and isinstance(text, unicode): + text = text.encode('utf-8') + + if not sample: + pieces = sp_model.EncodeAsPieces(text) + else: + pieces = sp_model.SampleEncodeAsPieces(text, 64, 0.1) + new_pieces = [] + for piece in pieces: + if len(piece) > 1 and piece[-1] == ',' and piece[-2].isdigit(): + cur_pieces = sp_model.EncodeAsPieces( + piece[:-1].replace(SPIECE_UNDERLINE, '')) + if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE: + if len(cur_pieces[0]) == 1: + cur_pieces = cur_pieces[1:] + else: + cur_pieces[0] = cur_pieces[0][1:] + cur_pieces.append(piece[-1]) + new_pieces.extend(cur_pieces) + else: + new_pieces.append(piece) + + # note(zhiliny): convert back to unicode for py2 + if six.PY2 and return_unicode: + ret_pieces = [] + for piece in new_pieces: + if isinstance(piece, str): + piece = piece.decode('utf-8') + ret_pieces.append(piece) + new_pieces = ret_pieces + + return new_pieces + + +def encode_ids(sp_model, text, sample=False): + pieces = encode_pieces(sp_model, text, return_unicode=False, sample=sample) + ids = [sp_model.PieceToId(piece) for piece in pieces] + return ids diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_classifier.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_classifier.py new file mode 100644 index 0000000..79a27f2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_classifier.py @@ -0,0 +1,196 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""XLNet classification finetuning runner in tf2.0.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import functools +from absl import app +from absl import flags +from absl import logging + +import numpy as np +import tensorflow as tf +# pylint: disable=unused-import +from official.nlp.xlnet import common_flags +from official.nlp.xlnet import data_utils +from official.nlp.xlnet import optimization +from official.nlp.xlnet import training_utils +from official.nlp.xlnet import xlnet_config +from official.nlp.xlnet import xlnet_modeling as modeling +from official.utils.misc import tpu_lib + +flags.DEFINE_integer("n_class", default=2, help="Number of classes.") +flags.DEFINE_string( + "summary_type", + default="last", + help="Method used to summarize a sequence into a vector.") + +FLAGS = flags.FLAGS + + +def get_classificationxlnet_model(model_config, + run_config, + n_class, + summary_type="last"): + model = modeling.ClassificationXLNetModel( + model_config, run_config, n_class, summary_type, name="model") + return model + + +def run_evaluation(strategy, + test_input_fn, + eval_steps, + model, + step, + eval_summary_writer=None): + """Run evaluation for classification task. + + Args: + strategy: distribution strategy. + test_input_fn: input function for evaluation data. + eval_steps: total number of evaluation steps. + model: keras model object. + step: current train step. + eval_summary_writer: summary writer used to record evaluation metrics. As + there are fake data samples in validation set, we use mask to get rid of + them when calculating the accuracy. For the reason that there will be + dynamic-shape tensor, we first collect logits, labels and masks from TPU + and calculate the accuracy via numpy locally. + + Returns: + A float metric, accuracy. + """ + + def _test_step_fn(inputs): + """Replicated validation step.""" + + inputs["mems"] = None + _, logits = model(inputs, training=False) + return logits, inputs["label_ids"], inputs["is_real_example"] + + @tf.function + def _run_evaluation(test_iterator): + """Runs validation steps.""" + logits, labels, masks = strategy.run( + _test_step_fn, args=(next(test_iterator),)) + return logits, labels, masks + + test_iterator = data_utils.get_input_iterator(test_input_fn, strategy) + correct = 0 + total = 0 + for _ in range(eval_steps): + logits, labels, masks = _run_evaluation(test_iterator) + logits = strategy.experimental_local_results(logits) + labels = strategy.experimental_local_results(labels) + masks = strategy.experimental_local_results(masks) + merged_logits = [] + merged_labels = [] + merged_masks = [] + + for i in range(strategy.num_replicas_in_sync): + merged_logits.append(logits[i].numpy()) + merged_labels.append(labels[i].numpy()) + merged_masks.append(masks[i].numpy()) + merged_logits = np.vstack(np.array(merged_logits)) + merged_labels = np.hstack(np.array(merged_labels)) + merged_masks = np.hstack(np.array(merged_masks)) + real_index = np.where(np.equal(merged_masks, 1)) + correct += np.sum( + np.equal( + np.argmax(merged_logits[real_index], axis=-1), + merged_labels[real_index])) + total += np.shape(real_index)[-1] + accuracy = float(correct) / float(total) + logging.info("Train step: %d / acc = %d/%d = %f", step, correct, total, + accuracy) + if eval_summary_writer: + with eval_summary_writer.as_default(): + tf.summary.scalar("eval_acc", float(correct) / float(total), step=step) + eval_summary_writer.flush() + return accuracy + + +def get_metric_fn(): + train_acc_metric = tf.keras.metrics.SparseCategoricalAccuracy( + "acc", dtype=tf.float32) + return train_acc_metric + + +def main(unused_argv): + del unused_argv + if FLAGS.strategy_type == "mirror": + strategy = tf.distribute.MirroredStrategy() + elif FLAGS.strategy_type == "tpu": + cluster_resolver = tpu_lib.tpu_initialize(FLAGS.tpu) + strategy = tf.distribute.experimental.TPUStrategy(cluster_resolver) + else: + raise ValueError("The distribution strategy type is not supported: %s" % + FLAGS.strategy_type) + if strategy: + logging.info("***** Number of cores used : %d", + strategy.num_replicas_in_sync) + train_input_fn = functools.partial(data_utils.get_classification_input_data, + FLAGS.train_batch_size, FLAGS.seq_len, + strategy, True, FLAGS.train_tfrecord_path) + test_input_fn = functools.partial(data_utils.get_classification_input_data, + FLAGS.test_batch_size, FLAGS.seq_len, + strategy, False, FLAGS.test_tfrecord_path) + + total_training_steps = FLAGS.train_steps + steps_per_loop = FLAGS.iterations + eval_steps = int(FLAGS.test_data_size / FLAGS.test_batch_size) + eval_fn = functools.partial(run_evaluation, strategy, test_input_fn, + eval_steps) + optimizer, learning_rate_fn = optimization.create_optimizer( + FLAGS.learning_rate, + total_training_steps, + FLAGS.warmup_steps, + adam_epsilon=FLAGS.adam_epsilon) + model_config = xlnet_config.XLNetConfig(FLAGS) + run_config = xlnet_config.create_run_config(True, False, FLAGS) + model_fn = functools.partial(get_classificationxlnet_model, model_config, + run_config, FLAGS.n_class, FLAGS.summary_type) + input_meta_data = {} + input_meta_data["d_model"] = FLAGS.d_model + input_meta_data["mem_len"] = FLAGS.mem_len + input_meta_data["batch_size_per_core"] = int(FLAGS.train_batch_size / + strategy.num_replicas_in_sync) + input_meta_data["n_layer"] = FLAGS.n_layer + input_meta_data["lr_layer_decay_rate"] = FLAGS.lr_layer_decay_rate + input_meta_data["n_class"] = FLAGS.n_class + + training_utils.train( + strategy=strategy, + model_fn=model_fn, + input_meta_data=input_meta_data, + eval_fn=eval_fn, + metric_fn=get_metric_fn, + train_input_fn=train_input_fn, + init_checkpoint=FLAGS.init_checkpoint, + init_from_transformerxl=FLAGS.init_from_transformerxl, + total_training_steps=total_training_steps, + steps_per_loop=steps_per_loop, + optimizer=optimizer, + learning_rate_fn=learning_rate_fn, + model_dir=FLAGS.model_dir, + save_steps=FLAGS.save_steps) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_pretrain.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_pretrain.py new file mode 100644 index 0000000..e136f4d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_pretrain.py @@ -0,0 +1,156 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""XLNet classification finetuning runner in tf2.0.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import functools +import os + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf +# pylint: disable=unused-import +from official.nlp.xlnet import common_flags +from official.nlp.xlnet import data_utils +from official.nlp.xlnet import optimization +from official.nlp.xlnet import training_utils +from official.nlp.xlnet import xlnet_config +from official.nlp.xlnet import xlnet_modeling as modeling +from official.utils.misc import tpu_lib + +flags.DEFINE_integer( + "num_predict", + default=None, + help="Number of tokens to predict in partial prediction.") + +# FLAGS for pretrain input preprocessing +flags.DEFINE_integer("perm_size", 0, help="Window size of permutation.") +flags.DEFINE_float("leak_ratio", default=0.1, + help="Percent of masked tokens that are leaked.") + +flags.DEFINE_enum("sample_strategy", default="token_span", + enum_values=["single_token", "whole_word", "token_span", + "word_span"], + help="Stragey used to sample prediction targets.") +flags.DEFINE_integer("max_num_tokens", default=5, + help="Maximum number of tokens to sample in a span." + "Effective when token_span strategy is used.") +flags.DEFINE_integer("min_num_tokens", default=1, + help="Minimum number of tokens to sample in a span." + "Effective when token_span strategy is used.") + +flags.DEFINE_integer("max_num_words", default=5, + help="Maximum number of whole words to sample in a span." + "Effective when word_span strategy is used.") +flags.DEFINE_integer("min_num_words", default=1, + help="Minimum number of whole words to sample in a span." + "Effective when word_span strategy is used.") +FLAGS = flags.FLAGS + + +def get_pretrainxlnet_model(model_config, run_config): + return modeling.PretrainingXLNetModel( + use_proj=True, + xlnet_config=model_config, + run_config=run_config, + name="model") + + +def main(unused_argv): + del unused_argv + num_hosts = 1 + if FLAGS.strategy_type == "mirror": + strategy = tf.distribute.MirroredStrategy() + elif FLAGS.strategy_type == "tpu": + cluster_resolver = tpu_lib.tpu_initialize(FLAGS.tpu) + strategy = tf.distribute.experimental.TPUStrategy(cluster_resolver) + topology = FLAGS.tpu_topology.split("x") + total_num_core = 2 * int(topology[0]) * int(topology[1]) + num_hosts = total_num_core // FLAGS.num_core_per_host + else: + raise ValueError("The distribution strategy type is not supported: %s" % + FLAGS.strategy_type) + if strategy: + logging.info("***** Number of cores used : %d", + strategy.num_replicas_in_sync) + logging.info("***** Number of hosts used : %d", num_hosts) + online_masking_config = data_utils.OnlineMaskingConfig( + sample_strategy=FLAGS.sample_strategy, + max_num_tokens=FLAGS.max_num_tokens, + min_num_tokens=FLAGS.min_num_tokens, + max_num_words=FLAGS.max_num_words, + min_num_words=FLAGS.min_num_words) + + train_input_fn = functools.partial( + data_utils.get_pretrain_input_data, FLAGS.train_batch_size, FLAGS.seq_len, + strategy, FLAGS.train_tfrecord_path, FLAGS.reuse_len, FLAGS.perm_size, + FLAGS.leak_ratio, FLAGS.num_predict, FLAGS.uncased, online_masking_config, + num_hosts) + + total_training_steps = FLAGS.train_steps + + steps_per_loop = FLAGS.iterations + + optimizer, learning_rate_fn = optimization.create_optimizer( + init_lr=FLAGS.learning_rate, + num_train_steps=total_training_steps, + num_warmup_steps=FLAGS.warmup_steps, + min_lr_ratio=FLAGS.min_lr_ratio, + adam_epsilon=FLAGS.adam_epsilon, + weight_decay_rate=FLAGS.weight_decay_rate) + + model_config = xlnet_config.XLNetConfig(FLAGS) + run_config = xlnet_config.create_run_config(True, False, FLAGS) + input_meta_data = {} + input_meta_data["d_model"] = FLAGS.d_model + input_meta_data["mem_len"] = FLAGS.mem_len + input_meta_data["batch_size_per_core"] = int(FLAGS.train_batch_size / + strategy.num_replicas_in_sync) + input_meta_data["n_layer"] = FLAGS.n_layer + input_meta_data["lr_layer_decay_rate"] = FLAGS.lr_layer_decay_rate + model_fn = functools.partial(get_pretrainxlnet_model, model_config, + run_config) + + model = training_utils.train( + strategy=strategy, + model_fn=model_fn, + input_meta_data=input_meta_data, + eval_fn=None, + metric_fn=None, + train_input_fn=train_input_fn, + init_checkpoint=FLAGS.init_checkpoint, + init_from_transformerxl=FLAGS.init_from_transformerxl, + total_training_steps=total_training_steps, + steps_per_loop=steps_per_loop, + optimizer=optimizer, + learning_rate_fn=learning_rate_fn, + model_dir=FLAGS.model_dir, + save_steps=FLAGS.save_steps) + + # Export transformer-xl model checkpoint to be used in finetuning. + checkpoint = tf.train.Checkpoint(transformer_xl=model.transformerxl_model) + saved_path = checkpoint.save( + os.path.join(FLAGS.model_dir, "pretrained/transformer_xl.ckpt")) + logging.info("Exporting the transformer-xl model as a new TF checkpoint: %s", + saved_path) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_squad.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_squad.py new file mode 100644 index 0000000..013893f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/run_squad.py @@ -0,0 +1,304 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""XLNet SQUAD finetuning runner in tf2.0.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import functools +import json +import os +import pickle + +from absl import app +from absl import flags +from absl import logging + +import tensorflow as tf +# pylint: disable=unused-import +import sentencepiece as spm +from official.nlp.xlnet import common_flags +from official.nlp.xlnet import data_utils +from official.nlp.xlnet import optimization +from official.nlp.xlnet import squad_utils +from official.nlp.xlnet import training_utils +from official.nlp.xlnet import xlnet_config +from official.nlp.xlnet import xlnet_modeling as modeling +from official.utils.misc import tpu_lib + +flags.DEFINE_string( + "test_feature_path", default=None, help="Path to feature of test set.") +flags.DEFINE_integer("query_len", default=64, help="Max query length.") +flags.DEFINE_integer("start_n_top", default=5, help="Beam size for span start.") +flags.DEFINE_integer("end_n_top", default=5, help="Beam size for span end.") +flags.DEFINE_string( + "predict_dir", default=None, help="Path to write predictions.") +flags.DEFINE_string( + "predict_file", default=None, help="Path to json file of test set.") +flags.DEFINE_integer( + "n_best_size", default=5, help="n best size for predictions.") +flags.DEFINE_integer("max_answer_length", default=64, help="Max answer length.") +# Data preprocessing config +flags.DEFINE_string( + "spiece_model_file", default=None, help="Sentence Piece model path.") +flags.DEFINE_integer("max_seq_length", default=512, help="Max sequence length.") +flags.DEFINE_integer("max_query_length", default=64, help="Max query length.") +flags.DEFINE_integer("doc_stride", default=128, help="Doc stride.") + +FLAGS = flags.FLAGS + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + unique_id, + example_index, + doc_span_index, + tok_start_to_orig_index, + tok_end_to_orig_index, + token_is_max_context, + input_ids, + input_mask, + p_mask, + segment_ids, + paragraph_len, + cls_index, + start_position=None, + end_position=None, + is_impossible=None): + self.unique_id = unique_id + self.example_index = example_index + self.doc_span_index = doc_span_index + self.tok_start_to_orig_index = tok_start_to_orig_index + self.tok_end_to_orig_index = tok_end_to_orig_index + self.token_is_max_context = token_is_max_context + self.input_ids = input_ids + self.input_mask = input_mask + self.p_mask = p_mask + self.segment_ids = segment_ids + self.paragraph_len = paragraph_len + self.cls_index = cls_index + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + +# pylint: disable=unused-argument +def run_evaluation(strategy, test_input_fn, eval_examples, eval_features, + original_data, eval_steps, input_meta_data, model, + current_step, eval_summary_writer): + """Run evaluation for SQUAD task. + + Args: + strategy: distribution strategy. + test_input_fn: input function for evaluation data. + eval_examples: tf.Examples of the evaluation set. + eval_features: Feature objects of the evaluation set. + original_data: The original json data for the evaluation set. + eval_steps: total number of evaluation steps. + input_meta_data: input meta data. + model: keras model object. + current_step: current training step. + eval_summary_writer: summary writer used to record evaluation metrics. + + Returns: + A float metric, F1 score. + """ + + def _test_step_fn(inputs): + """Replicated validation step.""" + + inputs["mems"] = None + res = model(inputs, training=False) + return res, inputs["unique_ids"] + + @tf.function + def _run_evaluation(test_iterator): + """Runs validation steps.""" + res, unique_ids = strategy.run( + _test_step_fn, args=(next(test_iterator),)) + return res, unique_ids + + test_iterator = data_utils.get_input_iterator(test_input_fn, strategy) + cur_results = [] + for _ in range(eval_steps): + results, unique_ids = _run_evaluation(test_iterator) + unique_ids = strategy.experimental_local_results(unique_ids) + + for result_key in results: + results[result_key] = ( + strategy.experimental_local_results(results[result_key])) + for core_i in range(strategy.num_replicas_in_sync): + bsz = int(input_meta_data["test_batch_size"] / + strategy.num_replicas_in_sync) + for j in range(bsz): + result = {} + for result_key in results: + result[result_key] = results[result_key][core_i].numpy()[j] + result["unique_ids"] = unique_ids[core_i].numpy()[j] + # We appended a fake example into dev set to make data size can be + # divided by test_batch_size. Ignores this fake example during + # evaluation. + if result["unique_ids"] == 1000012047: + continue + unique_id = int(result["unique_ids"]) + + start_top_log_probs = ([ + float(x) for x in result["start_top_log_probs"].flat + ]) + start_top_index = [int(x) for x in result["start_top_index"].flat] + end_top_log_probs = ([ + float(x) for x in result["end_top_log_probs"].flat + ]) + end_top_index = [int(x) for x in result["end_top_index"].flat] + + cls_logits = float(result["cls_logits"].flat[0]) + cur_results.append( + squad_utils.RawResult( + unique_id=unique_id, + start_top_log_probs=start_top_log_probs, + start_top_index=start_top_index, + end_top_log_probs=end_top_log_probs, + end_top_index=end_top_index, + cls_logits=cls_logits)) + if len(cur_results) % 1000 == 0: + logging.info("Processing example: %d", len(cur_results)) + + output_prediction_file = os.path.join(input_meta_data["predict_dir"], + "predictions.json") + output_nbest_file = os.path.join(input_meta_data["predict_dir"], + "nbest_predictions.json") + output_null_log_odds_file = os.path.join(input_meta_data["predict_dir"], + "null_odds.json") + + results = squad_utils.write_predictions( + eval_examples, eval_features, cur_results, input_meta_data["n_best_size"], + input_meta_data["max_answer_length"], output_prediction_file, + output_nbest_file, output_null_log_odds_file, original_data, + input_meta_data["start_n_top"], input_meta_data["end_n_top"]) + + # Log current results. + log_str = "Result | " + for key, val in results.items(): + log_str += "{} {} | ".format(key, val) + logging.info(log_str) + with eval_summary_writer.as_default(): + tf.summary.scalar("best_f1", results["best_f1"], step=current_step) + tf.summary.scalar("best_exact", results["best_exact"], step=current_step) + eval_summary_writer.flush() + return results["best_f1"] + + +def get_qaxlnet_model(model_config, run_config, start_n_top, end_n_top): + model = modeling.QAXLNetModel( + model_config, + run_config, + start_n_top=start_n_top, + end_n_top=end_n_top, + name="model") + return model + + +def main(unused_argv): + del unused_argv + if FLAGS.strategy_type == "mirror": + strategy = tf.distribute.MirroredStrategy() + elif FLAGS.strategy_type == "tpu": + cluster_resolver = tpu_lib.tpu_initialize(FLAGS.tpu) + strategy = tf.distribute.experimental.TPUStrategy(cluster_resolver) + else: + raise ValueError("The distribution strategy type is not supported: %s" % + FLAGS.strategy_type) + if strategy: + logging.info("***** Number of cores used : %d", + strategy.num_replicas_in_sync) + train_input_fn = functools.partial(data_utils.get_squad_input_data, + FLAGS.train_batch_size, FLAGS.seq_len, + FLAGS.query_len, strategy, True, + FLAGS.train_tfrecord_path) + + test_input_fn = functools.partial(data_utils.get_squad_input_data, + FLAGS.test_batch_size, FLAGS.seq_len, + FLAGS.query_len, strategy, False, + FLAGS.test_tfrecord_path) + + total_training_steps = FLAGS.train_steps + steps_per_loop = FLAGS.iterations + eval_steps = int(FLAGS.test_data_size / FLAGS.test_batch_size) + + optimizer, learning_rate_fn = optimization.create_optimizer( + FLAGS.learning_rate, + total_training_steps, + FLAGS.warmup_steps, + adam_epsilon=FLAGS.adam_epsilon) + model_config = xlnet_config.XLNetConfig(FLAGS) + run_config = xlnet_config.create_run_config(True, False, FLAGS) + input_meta_data = {} + input_meta_data["start_n_top"] = FLAGS.start_n_top + input_meta_data["end_n_top"] = FLAGS.end_n_top + input_meta_data["lr_layer_decay_rate"] = FLAGS.lr_layer_decay_rate + input_meta_data["predict_dir"] = FLAGS.predict_dir + input_meta_data["n_best_size"] = FLAGS.n_best_size + input_meta_data["max_answer_length"] = FLAGS.max_answer_length + input_meta_data["test_batch_size"] = FLAGS.test_batch_size + input_meta_data["batch_size_per_core"] = int(FLAGS.train_batch_size / + strategy.num_replicas_in_sync) + input_meta_data["mem_len"] = FLAGS.mem_len + model_fn = functools.partial(get_qaxlnet_model, model_config, run_config, + FLAGS.start_n_top, FLAGS.end_n_top) + eval_examples = squad_utils.read_squad_examples( + FLAGS.predict_file, is_training=False) + if FLAGS.test_feature_path: + logging.info("start reading pickle file...") + with tf.io.gfile.GFile(FLAGS.test_feature_path, "rb") as f: + eval_features = pickle.load(f) + logging.info("finishing reading pickle file...") + else: + sp_model = spm.SentencePieceProcessor() + sp_model.LoadFromSerializedProto( + tf.io.gfile.GFile(FLAGS.spiece_model_file, "rb").read()) + spm_basename = os.path.basename(FLAGS.spiece_model_file) + eval_features = squad_utils.create_eval_data( + spm_basename, sp_model, eval_examples, FLAGS.max_seq_length, + FLAGS.max_query_length, FLAGS.doc_stride, FLAGS.uncased) + + with tf.io.gfile.GFile(FLAGS.predict_file) as f: + original_data = json.load(f)["data"] + eval_fn = functools.partial(run_evaluation, strategy, test_input_fn, + eval_examples, eval_features, original_data, + eval_steps, input_meta_data) + + training_utils.train( + strategy=strategy, + model_fn=model_fn, + input_meta_data=input_meta_data, + eval_fn=eval_fn, + metric_fn=None, + train_input_fn=train_input_fn, + init_checkpoint=FLAGS.init_checkpoint, + init_from_transformerxl=FLAGS.init_from_transformerxl, + total_training_steps=total_training_steps, + steps_per_loop=steps_per_loop, + optimizer=optimizer, + learning_rate_fn=learning_rate_fn, + model_dir=FLAGS.model_dir, + save_steps=FLAGS.save_steps) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/squad_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/squad_utils.py new file mode 100644 index 0000000..efab6da --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/squad_utils.py @@ -0,0 +1,973 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# coding=utf-8 +"""Utilities used in SQUAD task.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import collections +import gc +import json +import math +import os +import pickle +import re +import string + +from absl import logging +import numpy as np +import six +import tensorflow as tf + +from official.nlp.xlnet import data_utils +from official.nlp.xlnet import preprocess_utils + +SPIECE_UNDERLINE = u"▁" + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + unique_id, + example_index, + doc_span_index, + tok_start_to_orig_index, + tok_end_to_orig_index, + token_is_max_context, + input_ids, + input_mask, + p_mask, + segment_ids, + paragraph_len, + cls_index, + start_position=None, + end_position=None, + is_impossible=None): + self.unique_id = unique_id + self.example_index = example_index + self.doc_span_index = doc_span_index + self.tok_start_to_orig_index = tok_start_to_orig_index + self.tok_end_to_orig_index = tok_end_to_orig_index + self.token_is_max_context = token_is_max_context + self.input_ids = input_ids + self.input_mask = input_mask + self.p_mask = p_mask + self.segment_ids = segment_ids + self.paragraph_len = paragraph_len + self.cls_index = cls_index + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + +def make_qid_to_has_ans(dataset): + qid_to_has_ans = {} + for article in dataset: + for p in article["paragraphs"]: + for qa in p["qas"]: + qid_to_has_ans[qa["id"]] = bool(qa["answers"]) + return qid_to_has_ans + + +def get_raw_scores(dataset, preds): + """Gets exact scores and f1 scores.""" + exact_scores = {} + f1_scores = {} + for article in dataset: + for p in article["paragraphs"]: + for qa in p["qas"]: + qid = qa["id"] + gold_answers = [ + a["text"] for a in qa["answers"] if normalize_answer(a["text"]) + ] + if not gold_answers: + # For unanswerable questions, only correct answer is empty string + gold_answers = [""] + if qid not in preds: + print("Missing prediction for %s" % qid) + continue + a_pred = preds[qid] + # Take max over all gold answers + exact_scores[qid] = max(compute_exact(a, a_pred) for a in gold_answers) + f1_scores[qid] = max(compute_f1(a, a_pred) for a in gold_answers) + return exact_scores, f1_scores + + +def normalize_answer(s): + """Lower text and remove punctuation, articles and extra whitespace.""" + + def remove_articles(text): + regex = re.compile(r"\b(a|an|the)\b", re.UNICODE) + return re.sub(regex, " ", text) + + def white_space_fix(text): + return " ".join(text.split()) + + def remove_punc(text): + exclude = set(string.punctuation) + return "".join(ch for ch in text if ch not in exclude) + + def lower(text): + return text.lower() + + return white_space_fix(remove_articles(remove_punc(lower(s)))) + + +def compute_exact(a_gold, a_pred): + return int(normalize_answer(a_gold) == normalize_answer(a_pred)) + + +def get_tokens(s): + if not s: + return [] + return normalize_answer(s).split() + + +def compute_f1(a_gold, a_pred): + """Computes f1 score.""" + gold_toks = get_tokens(a_gold) + pred_toks = get_tokens(a_pred) + common = collections.Counter(gold_toks) & collections.Counter(pred_toks) + num_same = sum(common.values()) + # pylint: disable=g-explicit-length-test + if len(gold_toks) == 0 or len(pred_toks) == 0: + # If either is no-answer, then F1 is 1 if they agree, 0 otherwise + return int(gold_toks == pred_toks) + if num_same == 0: + return 0 + precision = 1.0 * num_same / len(pred_toks) + recall = 1.0 * num_same / len(gold_toks) + f1 = (2 * precision * recall) / (precision + recall) + return f1 + + +def find_best_thresh(preds, scores, na_probs, qid_to_has_ans): + """Finds best threshold.""" + num_no_ans = sum(1 for k in qid_to_has_ans if not qid_to_has_ans[k]) + cur_score = num_no_ans + best_score = cur_score + best_thresh = 0.0 + qid_list = sorted(na_probs, key=lambda k: na_probs[k]) + for qid in qid_list: + if qid not in scores: + continue + if qid_to_has_ans[qid]: + diff = scores[qid] + else: + if preds[qid]: + diff = -1 + else: + diff = 0 + cur_score += diff + if cur_score > best_score: + best_score = cur_score + best_thresh = na_probs[qid] + + has_ans_score, has_ans_cnt = 0, 0 + for qid in qid_list: + if not qid_to_has_ans[qid]: + continue + has_ans_cnt += 1 + + if qid not in scores: + continue + has_ans_score += scores[qid] + + return 100.0 * best_score / len( + scores), best_thresh, 1.0 * has_ans_score / has_ans_cnt + + +def find_all_best_thresh(main_eval, preds, exact_raw, f1_raw, na_probs, + qid_to_has_ans): + """Finds all best threshold.""" + best_exact, exact_thresh, has_ans_exact = find_best_thresh( + preds, exact_raw, na_probs, qid_to_has_ans) + best_f1, f1_thresh, has_ans_f1 = find_best_thresh(preds, f1_raw, na_probs, + qid_to_has_ans) + main_eval["best_exact"] = best_exact + main_eval["best_exact_thresh"] = exact_thresh + main_eval["best_f1"] = best_f1 + main_eval["best_f1_thresh"] = f1_thresh + main_eval["has_ans_exact"] = has_ans_exact + main_eval["has_ans_f1"] = has_ans_f1 + + +_PrelimPrediction = collections.namedtuple( # pylint: disable=invalid-name + "PrelimPrediction", [ + "feature_index", "start_index", "end_index", "start_log_prob", + "end_log_prob" + ]) + +_NbestPrediction = collections.namedtuple( # pylint: disable=invalid-name + "NbestPrediction", ["text", "start_log_prob", "end_log_prob"]) +RawResult = collections.namedtuple("RawResult", [ + "unique_id", "start_top_log_probs", "start_top_index", "end_top_log_probs", + "end_top_index", "cls_logits" +]) + + +def _compute_softmax(scores): + """Computes softmax probability over raw logits.""" + if not scores: + return [] + + max_score = None + for score in scores: + if max_score is None or score > max_score: + max_score = score + + exp_scores = [] + total_sum = 0.0 + for score in scores: + x = math.exp(score - max_score) + exp_scores.append(x) + total_sum += x + + probs = [] + for score in exp_scores: + probs.append(score / total_sum) + return probs + + +class SquadExample(object): + """A single training/test example for simple sequence classification. + + For examples without an answer, the start and end position are -1. + """ + + def __init__(self, + qas_id, + question_text, + paragraph_text, + orig_answer_text=None, + start_position=None, + is_impossible=False): + self.qas_id = qas_id + self.question_text = question_text + self.paragraph_text = paragraph_text + self.orig_answer_text = orig_answer_text + self.start_position = start_position + self.is_impossible = is_impossible + + def __str__(self): + return self.__repr__() + + def __repr__(self): + s = "" + s += "qas_id: %s" % (preprocess_utils.printable_text(self.qas_id)) + s += ", question_text: %s" % ( + preprocess_utils.printable_text(self.question_text)) + s += ", paragraph_text: [%s]" % (" ".join(self.paragraph_text)) + if self.start_position: + s += ", start_position: %d" % (self.start_position) + if self.start_position: + s += ", is_impossible: %r" % (self.is_impossible) + return s + + +def write_predictions(all_examples, all_features, all_results, n_best_size, + max_answer_length, output_prediction_file, + output_nbest_file, output_null_log_odds_file, orig_data, + start_n_top, end_n_top): + """Writes final predictions to the json file and log-odds of null if needed.""" + logging.info("Writing predictions to: %s", (output_prediction_file)) + + example_index_to_features = collections.defaultdict(list) + for feature in all_features: + example_index_to_features[feature.example_index].append(feature) + + unique_id_to_result = {} + for result in all_results: + unique_id_to_result[result.unique_id] = result + + all_predictions = collections.OrderedDict() + all_nbest_json = collections.OrderedDict() + scores_diff_json = collections.OrderedDict() + + for (example_index, example) in enumerate(all_examples): + features = example_index_to_features[example_index] + + prelim_predictions = [] + # keep track of the minimum score of null start+end of position 0 + score_null = 1000000 # large and positive + + for (feature_index, feature) in enumerate(features): + result = unique_id_to_result[feature.unique_id] + + cur_null_score = result.cls_logits + + # if we could have irrelevant answers, get the min score of irrelevant + score_null = min(score_null, cur_null_score) + + for i in range(start_n_top): + for j in range(end_n_top): + start_log_prob = result.start_top_log_probs[i] + start_index = result.start_top_index[i] + + j_index = i * end_n_top + j + + end_log_prob = result.end_top_log_probs[j_index] + end_index = result.end_top_index[j_index] + + # We could hypothetically create invalid predictions, e.g., predict + # that the start of the span is in the question. We throw out all + # invalid predictions. + if start_index >= feature.paragraph_len - 1: + continue + if end_index >= feature.paragraph_len - 1: + continue + + if not feature.token_is_max_context.get(start_index, False): + continue + if end_index < start_index: + continue + length = end_index - start_index + 1 + if length > max_answer_length: + continue + + prelim_predictions.append( + _PrelimPrediction( + feature_index=feature_index, + start_index=start_index, + end_index=end_index, + start_log_prob=start_log_prob, + end_log_prob=end_log_prob)) + + prelim_predictions = sorted( + prelim_predictions, + key=lambda x: (x.start_log_prob + x.end_log_prob), + reverse=True) + + seen_predictions = {} + nbest = [] + for pred in prelim_predictions: + if len(nbest) >= n_best_size: + break + feature = features[pred.feature_index] + + tok_start_to_orig_index = feature.tok_start_to_orig_index + tok_end_to_orig_index = feature.tok_end_to_orig_index + start_orig_pos = tok_start_to_orig_index[pred.start_index] + end_orig_pos = tok_end_to_orig_index[pred.end_index] + + paragraph_text = example.paragraph_text + final_text = paragraph_text[start_orig_pos:end_orig_pos + 1].strip() + + if final_text in seen_predictions: + continue + + seen_predictions[final_text] = True + + nbest.append( + _NbestPrediction( + text=final_text, + start_log_prob=pred.start_log_prob, + end_log_prob=pred.end_log_prob)) + + # In very rare edge cases we could have no valid predictions. So we + # just create a nonce prediction in this case to avoid failure. + if not nbest: + nbest.append( + _NbestPrediction(text="", start_log_prob=-1e6, end_log_prob=-1e6)) + + total_scores = [] + best_non_null_entry = None + for entry in nbest: + total_scores.append(entry.start_log_prob + entry.end_log_prob) + if not best_non_null_entry: + best_non_null_entry = entry + + probs = _compute_softmax(total_scores) + + nbest_json = [] + for (i, entry) in enumerate(nbest): + output = collections.OrderedDict() + output["text"] = entry.text + output["probability"] = probs[i] + output["start_log_prob"] = entry.start_log_prob + output["end_log_prob"] = entry.end_log_prob + nbest_json.append(output) + + assert len(nbest_json) >= 1 + assert best_non_null_entry is not None + + score_diff = score_null + scores_diff_json[example.qas_id] = score_diff + + all_predictions[example.qas_id] = best_non_null_entry.text + + all_nbest_json[example.qas_id] = nbest_json + + with tf.io.gfile.GFile(output_prediction_file, "w") as writer: + writer.write(json.dumps(all_predictions, indent=4) + "\n") + + with tf.io.gfile.GFile(output_nbest_file, "w") as writer: + writer.write(json.dumps(all_nbest_json, indent=4) + "\n") + + with tf.io.gfile.GFile(output_null_log_odds_file, "w") as writer: + writer.write(json.dumps(scores_diff_json, indent=4) + "\n") + + qid_to_has_ans = make_qid_to_has_ans(orig_data) + exact_raw, f1_raw = get_raw_scores(orig_data, all_predictions) + out_eval = {} + + find_all_best_thresh(out_eval, all_predictions, exact_raw, f1_raw, + scores_diff_json, qid_to_has_ans) + + return out_eval + + +def read_squad_examples(input_file, is_training): + """Reads a SQuAD json file into a list of SquadExample.""" + with tf.io.gfile.GFile(input_file, "r") as reader: + input_data = json.load(reader)["data"] + + examples = [] + for entry in input_data: + for paragraph in entry["paragraphs"]: + paragraph_text = paragraph["context"] + + for qa in paragraph["qas"]: + qas_id = qa["id"] + question_text = qa["question"] + start_position = None + orig_answer_text = None + is_impossible = False + + if is_training: + is_impossible = qa["is_impossible"] + if (len(qa["answers"]) != 1) and (not is_impossible): + raise ValueError( + "For training, each question should have exactly 1 answer.") + if not is_impossible: + answer = qa["answers"][0] + orig_answer_text = answer["text"] + start_position = answer["answer_start"] + else: + start_position = -1 + orig_answer_text = "" + + example = SquadExample( + qas_id=qas_id, + question_text=question_text, + paragraph_text=paragraph_text, + orig_answer_text=orig_answer_text, + start_position=start_position, + is_impossible=is_impossible) + examples.append(example) + + return examples + + +# pylint: disable=invalid-name +def _convert_index(index, pos, M=None, is_start=True): + """Converts index.""" + if index[pos] is not None: + return index[pos] + N = len(index) + rear = pos + while rear < N - 1 and index[rear] is None: + rear += 1 + front = pos + while front > 0 and index[front] is None: + front -= 1 + assert index[front] is not None or index[rear] is not None + if index[front] is None: + if index[rear] >= 1: + if is_start: + return 0 + else: + return index[rear] - 1 + return index[rear] + if index[rear] is None: + if M is not None and index[front] < M - 1: + if is_start: + return index[front] + 1 + else: + return M - 1 + return index[front] + if is_start: + if index[rear] > index[front] + 1: + return index[front] + 1 + else: + return index[rear] + else: + if index[rear] > index[front] + 1: + return index[rear] - 1 + else: + return index[front] + + +def convert_examples_to_features(examples, sp_model, max_seq_length, doc_stride, + max_query_length, is_training, output_fn, + uncased): + """Loads a data file into a list of `InputBatch`s.""" + + cnt_pos, cnt_neg = 0, 0 + unique_id = 1000000000 + max_N, max_M = 1024, 1024 + f = np.zeros((max_N, max_M), dtype=np.float32) + + for (example_index, example) in enumerate(examples): + # pylint: disable=logging-format-interpolation + if example_index % 100 == 0: + logging.info("Converting {}/{} pos {} neg {}".format( + example_index, len(examples), cnt_pos, cnt_neg)) + + query_tokens = preprocess_utils.encode_ids( + sp_model, + preprocess_utils.preprocess_text(example.question_text, lower=uncased)) + + if len(query_tokens) > max_query_length: + query_tokens = query_tokens[0:max_query_length] + + paragraph_text = example.paragraph_text + para_tokens = preprocess_utils.encode_pieces( + sp_model, + preprocess_utils.preprocess_text(example.paragraph_text, lower=uncased)) + + chartok_to_tok_index = [] + tok_start_to_chartok_index = [] + tok_end_to_chartok_index = [] + char_cnt = 0 + for i, token in enumerate(para_tokens): + chartok_to_tok_index.extend([i] * len(token)) + tok_start_to_chartok_index.append(char_cnt) + char_cnt += len(token) + tok_end_to_chartok_index.append(char_cnt - 1) + + tok_cat_text = "".join(para_tokens).replace(SPIECE_UNDERLINE, " ") + N, M = len(paragraph_text), len(tok_cat_text) + + if N > max_N or M > max_M: + max_N = max(N, max_N) + max_M = max(M, max_M) + f = np.zeros((max_N, max_M), dtype=np.float32) + gc.collect() + + g = {} + + # pylint: disable=cell-var-from-loop + def _lcs_match(max_dist): + """LCS match.""" + f.fill(0) + g.clear() + + ### longest common sub sequence + # f[i, j] = max(f[i - 1, j], f[i, j - 1], f[i - 1, j - 1] + match(i, j)) + for i in range(N): + + # note(zhiliny): + # unlike standard LCS, this is specifically optimized for the setting + # because the mismatch between sentence pieces and original text will + # be small + for j in range(i - max_dist, i + max_dist): + if j >= M or j < 0: + continue + + if i > 0: + g[(i, j)] = 0 + f[i, j] = f[i - 1, j] + + if j > 0 and f[i, j - 1] > f[i, j]: + g[(i, j)] = 1 + f[i, j] = f[i, j - 1] + + f_prev = f[i - 1, j - 1] if i > 0 and j > 0 else 0 + if (preprocess_utils.preprocess_text( + paragraph_text[i], lower=uncased, + remove_space=False) == tok_cat_text[j] and f_prev + 1 > f[i, j]): + g[(i, j)] = 2 + f[i, j] = f_prev + 1 + + max_dist = abs(N - M) + 5 + for _ in range(2): + _lcs_match(max_dist) + if f[N - 1, M - 1] > 0.8 * N: + break + max_dist *= 2 + + orig_to_chartok_index = [None] * N + chartok_to_orig_index = [None] * M + i, j = N - 1, M - 1 + while i >= 0 and j >= 0: + if (i, j) not in g: + break + if g[(i, j)] == 2: + orig_to_chartok_index[i] = j + chartok_to_orig_index[j] = i + i, j = i - 1, j - 1 + elif g[(i, j)] == 1: + j = j - 1 + else: + i = i - 1 + + if all( + v is None for v in orig_to_chartok_index) or f[N - 1, M - 1] < 0.8 * N: + print("MISMATCH DETECTED!") + continue + + tok_start_to_orig_index = [] + tok_end_to_orig_index = [] + for i in range(len(para_tokens)): + start_chartok_pos = tok_start_to_chartok_index[i] + end_chartok_pos = tok_end_to_chartok_index[i] + start_orig_pos = _convert_index( + chartok_to_orig_index, start_chartok_pos, N, is_start=True) + end_orig_pos = _convert_index( + chartok_to_orig_index, end_chartok_pos, N, is_start=False) + + tok_start_to_orig_index.append(start_orig_pos) + tok_end_to_orig_index.append(end_orig_pos) + + if not is_training: + tok_start_position = tok_end_position = None + + if is_training and example.is_impossible: + tok_start_position = -1 + tok_end_position = -1 + + if is_training and not example.is_impossible: + start_position = example.start_position + end_position = start_position + len(example.orig_answer_text) - 1 + + start_chartok_pos = _convert_index( + orig_to_chartok_index, start_position, is_start=True) + tok_start_position = chartok_to_tok_index[start_chartok_pos] + + end_chartok_pos = _convert_index( + orig_to_chartok_index, end_position, is_start=False) + tok_end_position = chartok_to_tok_index[end_chartok_pos] + assert tok_start_position <= tok_end_position + + def _piece_to_id(x): + if six.PY2 and isinstance(x, unicode): + x = x.encode("utf-8") + return sp_model.PieceToId(x) + + all_doc_tokens = list(map(_piece_to_id, para_tokens)) + + # The -3 accounts for [CLS], [SEP] and [SEP] + max_tokens_for_doc = max_seq_length - len(query_tokens) - 3 + + # We can have documents that are longer than the maximum sequence length. + # To deal with this we do a sliding window approach, where we take chunks + # of the up to our max length with a stride of `doc_stride`. + _DocSpan = collections.namedtuple( # pylint: disable=invalid-name + "DocSpan", ["start", "length"]) + doc_spans = [] + start_offset = 0 + while start_offset < len(all_doc_tokens): + length = len(all_doc_tokens) - start_offset + if length > max_tokens_for_doc: + length = max_tokens_for_doc + doc_spans.append(_DocSpan(start=start_offset, length=length)) + if start_offset + length == len(all_doc_tokens): + break + start_offset += min(length, doc_stride) + + for (doc_span_index, doc_span) in enumerate(doc_spans): + tokens = [] + token_is_max_context = {} + segment_ids = [] + p_mask = [] + + cur_tok_start_to_orig_index = [] + cur_tok_end_to_orig_index = [] + + for i in range(doc_span.length): + split_token_index = doc_span.start + i + + cur_tok_start_to_orig_index.append( + tok_start_to_orig_index[split_token_index]) + cur_tok_end_to_orig_index.append( + tok_end_to_orig_index[split_token_index]) + + is_max_context = _check_is_max_context(doc_spans, doc_span_index, + split_token_index) + token_is_max_context[len(tokens)] = is_max_context + tokens.append(all_doc_tokens[split_token_index]) + segment_ids.append(data_utils.SEG_ID_P) + p_mask.append(0) + + paragraph_len = len(tokens) + + tokens.append(data_utils.SEP_ID) + segment_ids.append(data_utils.SEG_ID_P) + p_mask.append(1) + + # note(zhiliny): we put P before Q + # because during pretraining, B is always shorter than A + for token in query_tokens: + tokens.append(token) + segment_ids.append(data_utils.SEG_ID_Q) + p_mask.append(1) + tokens.append(data_utils.SEP_ID) + segment_ids.append(data_utils.SEG_ID_Q) + p_mask.append(1) + + cls_index = len(segment_ids) + tokens.append(data_utils.CLS_ID) + segment_ids.append(data_utils.SEG_ID_CLS) + p_mask.append(0) + + input_ids = tokens + + # The mask has 0 for real tokens and 1 for padding tokens. Only real + # tokens are attended to. + input_mask = [0] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(1) + segment_ids.append(data_utils.SEG_ID_PAD) + p_mask.append(1) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + assert len(p_mask) == max_seq_length + + span_is_impossible = example.is_impossible + start_position = None + end_position = None + if is_training and not span_is_impossible: + # For training, if our document chunk does not contain an annotation + # we throw it out, since there is nothing to predict. + doc_start = doc_span.start + doc_end = doc_span.start + doc_span.length - 1 + out_of_span = False + if not (tok_start_position >= doc_start and + tok_end_position <= doc_end): + out_of_span = True + if out_of_span: + # continue + start_position = 0 + end_position = 0 + span_is_impossible = True + else: + # note: we put P before Q, so doc_offset should be zero. + # doc_offset = len(query_tokens) + 2 + doc_offset = 0 + start_position = tok_start_position - doc_start + doc_offset + end_position = tok_end_position - doc_start + doc_offset + + if is_training and span_is_impossible: + start_position = cls_index + end_position = cls_index + + if example_index < 20: + logging.info("*** Example ***") + logging.info("unique_id: %s", unique_id) + logging.info("example_index: %s", example_index) + logging.info("doc_span_index: %s", doc_span_index) + logging.info("tok_start_to_orig_index: %s", + " ".join([str(x) for x in cur_tok_start_to_orig_index])) + logging.info("tok_end_to_orig_index: %s", + " ".join([str(x) for x in cur_tok_end_to_orig_index])) + logging.info( + "token_is_max_context: %s", " ".join([ + "%d:%s" % (x, y) + for (x, y) in six.iteritems(token_is_max_context) + ])) + logging.info("input_ids: %s", " ".join([str(x) for x in input_ids])) + logging.info("input_mask: %s", " ".join([str(x) for x in input_mask])) + logging.info("segment_ids: %s", " ".join([str(x) for x in segment_ids])) + + if is_training and span_is_impossible: + logging.info("impossible example span") + + if is_training and not span_is_impossible: + pieces = [ + sp_model.IdToPiece(token) + for token in tokens[start_position:(end_position + 1)] + ] + answer_text = sp_model.DecodePieces(pieces) + logging.info("start_position: %d", start_position) + logging.info("end_position: %d", end_position) + logging.info("answer: %s", + preprocess_utils.printable_text(answer_text)) + + # With multi processing, the example_index is actually the index + # within the current process therefore we use example_index=None to + # avoid being used in the future. # The current code does not use + # example_index of training data. + if is_training: + feat_example_index = None + else: + feat_example_index = example_index + + feature = InputFeatures( + unique_id=unique_id, + example_index=feat_example_index, + doc_span_index=doc_span_index, + tok_start_to_orig_index=cur_tok_start_to_orig_index, + tok_end_to_orig_index=cur_tok_end_to_orig_index, + token_is_max_context=token_is_max_context, + input_ids=input_ids, + input_mask=input_mask, + p_mask=p_mask, + segment_ids=segment_ids, + paragraph_len=paragraph_len, + cls_index=cls_index, + start_position=start_position, + end_position=end_position, + is_impossible=span_is_impossible) + + # Run callback + output_fn(feature) + + unique_id += 1 + if span_is_impossible: + cnt_neg += 1 + else: + cnt_pos += 1 + + logging.info("Total number of instances: %d = pos %d + neg %d", + cnt_pos + cnt_neg, cnt_pos, cnt_neg) + + +def _check_is_max_context(doc_spans, cur_span_index, position): + """Check if this is the "max context" doc span for the token.""" + + # Because of the sliding window approach taken to scoring documents, a single + # token can appear in multiple documents. E.g. + # Doc: the man went to the store and bought a gallon of milk + # Span A: the man went to the + # Span B: to the store and bought + # Span C: and bought a gallon of + # ... + # + # Now the word "bought" will have two scores from spans B and C. We only + # want to consider the score with "maximum context", which we define as + # the *minimum* of its left and right context (the *sum* of left and + # right context will always be the same, of course). + # + # In the example the maximum context for "bought" would be span C since + # it has 1 left context and 3 right context, while span B has 4 left context + # and 0 right context. + best_score = None + best_span_index = None + for (span_index, doc_span) in enumerate(doc_spans): + end = doc_span.start + doc_span.length - 1 + if position < doc_span.start: + continue + if position > end: + continue + num_left_context = position - doc_span.start + num_right_context = end - position + score = min(num_left_context, num_right_context) + 0.01 * doc_span.length + if best_score is None or score > best_score: + best_score = score + best_span_index = span_index + + return cur_span_index == best_span_index + + +class FeatureWriter(object): + """Writes InputFeature to TF example file.""" + + def __init__(self, filename, is_training): + self.filename = filename + self.is_training = is_training + self.num_features = 0 + self._writer = tf.io.TFRecordWriter(filename) + + def process_feature(self, feature): + """Write a InputFeature to the TFRecordWriter as a tf.train.Example.""" + self.num_features += 1 + + def create_int_feature(values): + feature = tf.train.Feature( + int64_list=tf.train.Int64List(value=list(values))) + return feature + + def create_float_feature(values): + f = tf.train.Feature(float_list=tf.train.FloatList(value=list(values))) + return f + + features = collections.OrderedDict() + features["unique_ids"] = create_int_feature([feature.unique_id]) + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_float_feature(feature.input_mask) + features["p_mask"] = create_float_feature(feature.p_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + + features["cls_index"] = create_int_feature([feature.cls_index]) + + if self.is_training: + features["start_positions"] = create_int_feature([feature.start_position]) + features["end_positions"] = create_int_feature([feature.end_position]) + impossible = 0 + if feature.is_impossible: + impossible = 1 + features["is_impossible"] = create_float_feature([impossible]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + self._writer.write(tf_example.SerializeToString()) + + def close(self): + self._writer.close() + + +def create_eval_data(spm_basename, + sp_model, + eval_examples, + max_seq_length, + max_query_length, + doc_stride, + uncased, + output_dir=None): + """Creates evaluation tfrecords.""" + eval_features = [] + eval_writer = None + if output_dir: + eval_rec_file = os.path.join( + output_dir, + "{}.slen-{}.qlen-{}.eval.tf_record".format(spm_basename, max_seq_length, + max_query_length)) + eval_feature_file = os.path.join( + output_dir, + "{}.slen-{}.qlen-{}.eval.features.pkl".format(spm_basename, + max_seq_length, + max_query_length)) + + eval_writer = FeatureWriter(filename=eval_rec_file, is_training=False) + + def append_feature(feature): + eval_features.append(feature) + if eval_writer: + eval_writer.process_feature(feature) + + convert_examples_to_features( + examples=eval_examples, + sp_model=sp_model, + max_seq_length=max_seq_length, + doc_stride=doc_stride, + max_query_length=max_query_length, + is_training=False, + output_fn=append_feature, + uncased=uncased) + + if eval_writer: + eval_writer.close() + with tf.io.gfile.GFile(eval_feature_file, "wb") as fout: + pickle.dump(eval_features, fout) + + return eval_features diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/training_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/training_utils.py new file mode 100644 index 0000000..293e463 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/training_utils.py @@ -0,0 +1,310 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""XLNet training utils.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os +import re + +from absl import logging + +# pytype: disable=attribute-error +# pylint: disable=g-bare-generic,unused-import +import tensorflow as tf +from typing import Any, Callable, Dict, Text, Optional + +from official.nlp.bert import model_training_utils +from official.nlp.xlnet import data_utils +from official.nlp.xlnet import xlnet_modeling as modeling + +_MIN_SUMMARY_STEPS = 10 + + +def _save_checkpoint(checkpoint, model_dir, checkpoint_prefix): + """Saves model to with provided checkpoint prefix.""" + + checkpoint_path = os.path.join(model_dir, checkpoint_prefix) + saved_path = checkpoint.save(checkpoint_path) + logging.info("Saving model as TF checkpoint: %s", saved_path) + return + + +def _float_metric_value(metric): + """Gets the value of a float-value keras metric.""" + return metric.result().numpy().astype(float) + + +def train( + strategy: tf.distribute.Strategy, + model_fn: Callable, + input_meta_data: Dict, + train_input_fn: Callable, + total_training_steps: int, + steps_per_loop: int, + optimizer: tf.keras.optimizers.Optimizer, + learning_rate_fn: tf.keras.optimizers.schedules.LearningRateSchedule, + eval_fn: Optional[Callable[[tf.keras.Model, int, tf.summary.SummaryWriter], + Any]] = None, + metric_fn: Optional[Callable[[], tf.keras.metrics.Metric]] = None, + init_checkpoint: Optional[Text] = None, + init_from_transformerxl: Optional[bool] = False, + model_dir: Optional[Text] = None, + save_steps: Optional[int] = None, + run_eagerly: Optional[bool] = False): + """Runs customized training. + + Args: + strategy: Distribution strategy on which to run low level training loop. + model_fn: The function returns a keras.Model. + input_meta_data: A dictionary of params: `mem_len`, `lr_layer_decay_rate`, + `n_layer`, `batch_size_per_core` and `d_model`. + train_input_fn: Function returns a tf.data.Dataset used for training. + total_training_steps: Number of steps to train in total. + steps_per_loop: Number of steps per graph-mode loop. In order to reduce + communication in eager context, training logs are printed every + steps_per_loop. + optimizer: The optimizer for model. + learning_rate_fn: the learning rate schedule. + eval_fn: A callback of evaluation function, that takes a keras.Model, + current step and evaluation summary writer. + metric_fn: A metrics function returns a Keras Metric object to record + evaluation result using evaluation dataset or with training dataset + after every epoch. + init_checkpoint: Optional checkpoint to load to `sub_model` returned by + `model_fn`. + init_from_transformerxl: Whether to load to `transformerxl_model` of + `model_fn`. + model_dir: The directory of model (checkpoints, summaries). + save_steps: The frequency to save checkpoints. Every save_steps, we save a + model checkpoint. Model checkpoint will be saved and evaluation will be + conducted if evaluation dataset is provided. + run_eagerly: Whether to run training eagerly. + + Returns: + Last training step logits if training happens, otherwise returns None. + Raises: + TypeError: if model directory is not specified. + """ + required_arguments = [ + train_input_fn, total_training_steps, steps_per_loop, optimizer, + learning_rate_fn, save_steps + ] + if [arg for arg in required_arguments if arg is None]: + raise ValueError("`train_input_fn`, `total_training_steps`, " + "`steps_per_loop`, `optimizer`, `save_steps` and " + "`learning_rate_fn` are required parameters.") + if not model_dir: + raise TypeError("Model directory must be specified.") + train_iterator = data_utils.get_input_iterator(train_input_fn, strategy) + if not tf.io.gfile.exists(model_dir): + tf.io.gfile.mkdir(model_dir) + # Create summary writers + summary_dir = os.path.join(model_dir, "summaries") + if not tf.io.gfile.exists(summary_dir): + tf.io.gfile.mkdir(summary_dir) + train_summary_writer = None + eval_summary_writer = None + if eval_fn: + eval_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, "eval")) + if steps_per_loop >= _MIN_SUMMARY_STEPS: + # Only writes summary when the stats are collected sufficiently over + # enough steps. + train_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, "train")) + + with strategy.scope(): + model = model_fn() + + if init_checkpoint: + logging.info("restore from %s", init_checkpoint) + if init_from_transformerxl: + checkpoint = tf.train.Checkpoint( + transformer_xl=model.transformerxl_model) + else: + checkpoint = tf.train.Checkpoint(model=model) + checkpoint.restore(init_checkpoint) + + model.optimizer = optimizer + + if not hasattr(model, "optimizer"): + raise ValueError("User should set optimizer attribute to model.") + + train_loss_metric = tf.keras.metrics.Mean("training_loss", dtype=tf.float32) + train_metric = None + if metric_fn: + train_metric = metric_fn() + + def _replicated_step(inputs, mem=None): + """Replicated training step.""" + + inputs["mems"] = mem + with tf.GradientTape() as tape: + mem, logits = model(inputs, training=True) + loss = model.losses + train_loss_metric.update_state(loss) + if train_metric: + train_metric.update_state(inputs["label_ids"], logits) + scaled_loss = loss[0] * 1.0 / float(strategy.num_replicas_in_sync) + + # Collects training variables. + tvars = model.trainable_variables + grads = tape.gradient(scaled_loss, tvars) + clipped, _ = tf.clip_by_global_norm(grads, clip_norm=1.0) + + if input_meta_data["lr_layer_decay_rate"] != 1.0: + n_layer = 0 + for i in range(len(clipped)): + m = re.search(r"model/transformer/layer_(\d+?)/", tvars[i].name) + if not m: + continue + n_layer = max(n_layer, int(m.group(1)) + 1) + + for i in range(len(clipped)): + for l in range(n_layer): + if "model/transformer/layer_{}/".format(l) in tvars[i].name: + abs_rate = input_meta_data["lr_layer_decay_rate"]**( + n_layer - 1 - l) + clipped[i] *= abs_rate + logging.info("Apply mult {:.4f} to layer-{} grad of {}".format( + abs_rate, l, tvars[i].name)) + break + + optimizer.apply_gradients(zip(clipped, tvars)) + if input_meta_data["mem_len"] > 0: + return mem + + def train_steps(iterator, steps): + """Performs distributed training steps in a loop. + + Args: + iterator: the distributed iterator of training datasets. + steps: an tf.int32 integer tensor to specify number of steps to run + inside host training loop. + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + + Returns: + logits: logits computed. + """ + if not isinstance(steps, tf.Tensor): + raise ValueError("steps should be an Tensor. Python object may cause " + "retracing.") + + def cache_fn(): + """Initializes memory tensor used in XLNet pretraining.""" + mems = [] + if input_meta_data["mem_len"] > 0: + for _ in range(input_meta_data["n_layer"]): + zeros = tf.zeros([ + input_meta_data["mem_len"], + input_meta_data["batch_size_per_core"], + input_meta_data["d_model"] + ], + dtype=tf.float32) + mems.append(zeros) + return mems + + if input_meta_data["mem_len"] > 0: + mem = strategy.run(cache_fn) + for _ in tf.range(steps): + mem = strategy.run( + _replicated_step, args=( + next(iterator), + mem, + )) + else: + for _ in tf.range(steps): + strategy.run(_replicated_step, args=(next(iterator),)) + + if not run_eagerly: + train_steps = tf.function(train_steps) + + logging.info("Start training...") + checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer) + latest_checkpoint_file = tf.train.latest_checkpoint(model_dir) + if latest_checkpoint_file: + logging.info("Checkpoint file %s found and restoring from checkpoint", + latest_checkpoint_file) + checkpoint.restore(latest_checkpoint_file) + logging.info("Loading from checkpoint file completed") + + current_step = optimizer.iterations.numpy() + checkpoint_name = "xlnet_step_{step}.ckpt" + + while current_step < total_training_steps: + train_loss_metric.reset_states() + if train_metric: + train_metric.reset_states() + + steps = model_training_utils.steps_to_run(current_step, save_steps, + steps_per_loop) + train_steps(train_iterator, tf.convert_to_tensor(steps, dtype=tf.int32)) + current_step += steps + train_loss = _float_metric_value(train_loss_metric) + log_stream = "Train step: %d/%d / lr = %.9f / loss = %.7f" % ( + current_step, total_training_steps, learning_rate_fn(current_step), + train_loss) + if train_metric: + log_stream += " / %s = %f" % (train_metric.name, + _float_metric_value(train_metric)) + logging.info(log_stream) + if train_summary_writer: + with train_summary_writer.as_default(): + tf.summary.scalar( + "learning_rate", + learning_rate_fn(current_step), + step=current_step) + tf.summary.scalar( + train_loss_metric.name, train_loss, step=current_step) + if train_metric: + tf.summary.scalar( + train_metric.name, + _float_metric_value(train_metric), + step=current_step) + train_summary_writer.flush() + if model_dir and current_step % save_steps == 0: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + + if eval_fn and current_step % save_steps == 0: + + logging.info("Running evaluation after step: %s.", current_step) + + eval_fn(model, current_step, eval_summary_writer) + if model_dir: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + if eval_fn: + logging.info("Running final evaluation after training is complete.") + eval_metric = eval_fn(model, current_step, eval_summary_writer) + + training_summary = { + "total_training_steps": total_training_steps, + "train_loss": _float_metric_value(train_loss_metric), + } + if train_metric: + training_summary["last_train_metrics"] = _float_metric_value(train_metric) + if eval_fn: + # eval_metric is supposed to be a float. + training_summary["eval_metrics"] = eval_metric + + model_training_utils.write_txt_summary(training_summary, summary_dir) + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_config.py new file mode 100644 index 0000000..7852ead --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_config.py @@ -0,0 +1,181 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions used in XLNet model.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import json +import os + +import tensorflow as tf + + +def create_run_config(is_training, is_finetune, flags): + """Helper function for creating RunConfig.""" + kwargs = dict( + is_training=is_training, + use_tpu=flags.use_tpu, + dropout=flags.dropout, + dropout_att=flags.dropout_att, + init_method=flags.init_method, + init_range=flags.init_range, + init_std=flags.init_std, + clamp_len=flags.clamp_len) + + if not is_finetune: + kwargs.update(dict( + mem_len=flags.mem_len, + reuse_len=flags.reuse_len, + bi_data=flags.bi_data, + clamp_len=flags.clamp_len, + same_length=flags.same_length)) + + return RunConfig(**kwargs) + + +# TODO(hongkuny): refactor XLNetConfig and RunConfig. +class XLNetConfig(object): + """Configs for XLNet model. + + XLNetConfig contains hyperparameters that are specific to a model checkpoint; + i.e., these hyperparameters should be the same between + pretraining and finetuning. + + The following hyperparameters are defined: + n_layer: int, the number of layers. + d_model: int, the hidden size. + n_head: int, the number of attention heads. + d_head: int, the dimension size of each attention head. + d_inner: int, the hidden size in feed-forward layers. + ff_activation: str, "relu" or "gelu". + untie_r: bool, whether to untie the biases in attention. + n_token: int, the vocab size. + """ + + def __init__(self, FLAGS=None, json_path=None, args_dict=None): + """Constructing an XLNetConfig. + + One of FLAGS or json_path should be provided. + + Args: + FLAGS: An FLAGS instance. + json_path: A path to a json config file. + args_dict: A dict for args. + """ + + assert FLAGS is not None or json_path is not None or args_dict is not None + + self.keys = ['n_layer', 'd_model', 'n_head', 'd_head', 'd_inner', + 'ff_activation', 'untie_r', 'n_token'] + + if FLAGS is not None: + self.init_from_flags(FLAGS) + + if json_path is not None: + self.init_from_json(json_path) + + if args_dict is not None: + self.init_from_dict(args_dict) + + def init_from_dict(self, args_dict): + """Constructs a `BertConfig` from a Python dictionary of parameters.""" + for key in self.keys: + setattr(self, key, args_dict[key]) + + def init_from_flags(self, flags): + for key in self.keys: + setattr(self, key, getattr(flags, key)) + + def init_from_json(self, json_path): + with tf.io.gfile.GFile(json_path) as f: + json_data = json.load(f) + self.init_from_dict(json_data) + + def to_json(self, json_path): + """Save XLNetConfig to a json file.""" + json_data = {} + for key in self.keys: + json_data[key] = getattr(self, key) + + json_dir = os.path.dirname(json_path) + if not tf.io.gfile.exists(json_dir): + tf.io.gfile.makedirs(json_dir) + with tf.io.gfile.GFile(json_path, 'w') as f: + json.dump(json_data, f, indent=4, sort_keys=True) + + +class RunConfig(object): + """Class of RunConfig. + + RunConfig contains hyperparameters that could be different + between pretraining and finetuning. + These hyperparameters can also be changed from run to run. + We store them separately from XLNetConfig for flexibility. + """ + + def __init__(self, + is_training, + use_tpu, + dropout, + dropout_att, + init_method='normal', + init_range=0.1, + init_std=0.02, + mem_len=None, + reuse_len=None, + bi_data=False, + clamp_len=-1, + same_length=False, + use_cls_mask=True): + """Initializes RunConfig. + + Args: + is_training: bool, whether in training mode. + use_tpu: bool, whether TPUs are used. + dropout: float, dropout rate. + dropout_att: float, dropout rate on attention probabilities. + init_method: str, the initialization scheme, either "normal" or "uniform". + init_range: float, initialize the parameters with a uniform distribution + in [-init_range, init_range]. Only effective when init="uniform". + init_std: float, initialize the parameters with a normal distribution + with mean 0 and stddev init_std. Only effective when init="normal". + mem_len: int, the number of tokens to cache. + reuse_len: int, the number of tokens in the currect batch to be cached + and reused in the future. + bi_data: bool, whether to use bidirectional input pipeline. + Usually set to True during pretraining and False during finetuning. + clamp_len: int, clamp all relative distances larger than clamp_len. + -1 means no clamping. + same_length: bool, whether to use the same attention length + for each token. + use_cls_mask: bool, whether to introduce cls mask. + """ + + self.init_method = init_method + self.init_range = init_range + self.init_std = init_std + self.is_training = is_training + self.dropout = dropout + self.dropout_att = dropout_att + self.use_tpu = use_tpu + self.mem_len = mem_len + self.reuse_len = reuse_len + self.bi_data = bi_data + self.clamp_len = clamp_len + self.same_length = same_length + self.use_cls_mask = use_cls_mask diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling.py new file mode 100644 index 0000000..3e16af8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling.py @@ -0,0 +1,1290 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Keras layers of XLNet model in TF 2.0.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import copy +import numpy as np + +import tensorflow as tf +from official.nlp.xlnet import data_utils + + +def gelu(x): + """Gaussian Error Linear Unit. + + This is a smoother version of the RELU. + Original paper: https://arxiv.org/abs/1606.08415 + Args: + x: float Tensor to perform activation. + + Returns: + `x` with the GELU activation applied. + """ + cdf = 0.5 * (1.0 + tf.tanh( + (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))) + return x * cdf + + +def rel_shift(x, klen=-1): + """Performs relative shift to form the relative attention score.""" + x_size = tf.shape(x) + + x = tf.reshape(x, [x_size[1], x_size[0], x_size[2], x_size[3]]) + x = tf.slice(x, [1, 0, 0, 0], [-1, -1, -1, -1]) + x = tf.reshape(x, [x_size[0], x_size[1] - 1, x_size[2], x_size[3]]) + x = tf.slice(x, [0, 0, 0, 0], [-1, klen, -1, -1]) + + return x + + +def _get_initializer(flags): + """Get variable intializer.""" + if flags.init_method == 'uniform': + initializer = tf.keras.initializers.RandomUniform( + minval=-flags.init_range, maxval=flags.init_range) + elif flags.init_method == 'normal': + initializer = tf.keras.initializers.RandomNormal(stddev=flags.init_std) + else: + raise ValueError('Initializer {} not supported'.format(flags.init_method)) + return initializer + + +def _create_mask(qlen, mlen, dtype=tf.float32, same_length=False): + """Creates attention mask when single-side context allowed only.""" + attn_mask = tf.ones([qlen, qlen], dtype=dtype) + mask_u = tf.linalg.band_part(attn_mask, 0, -1) + mask_dia = tf.linalg.band_part(attn_mask, 0, 0) + attn_mask_pad = tf.zeros([qlen, mlen], dtype=dtype) + ret = tf.concat([attn_mask_pad, mask_u - mask_dia], 1) + if same_length: + mask_l = tf.linalg.band_part(attn_mask, -1, 0) + ret = tf.concat([ret[:, :qlen] + mask_l - mask_dia, ret[:, qlen:]], 1) + + return ret + + +def _cache_mem(curr_out, prev_mem, mem_len, reuse_len=None): + """cache hidden states into memory.""" + + if mem_len is None or mem_len == 0: + return None + else: + if reuse_len is not None and reuse_len > 0: + curr_out = curr_out[:reuse_len] + + if prev_mem is None: + new_mem = curr_out[-mem_len:] + else: + new_mem = tf.concat([prev_mem, curr_out], 0)[-mem_len:] + + return tf.keras.backend.stop_gradient(new_mem) + + +def is_special_none_tensor(tensor): + """Checks if a tensor is a special None Tensor.""" + return tensor.shape.ndims == 0 and tensor.dtype == tf.int32 + + +class PositionalEmbedding(tf.keras.layers.Layer): + """Generates relative positional embeddings used in Transformer-XL and XLNet.""" + + def __init__(self, dim, **kwargs): + super(PositionalEmbedding, self).__init__(**kwargs) + self.dim = dim + + def build(self, unused_input_shapes): + """Constructs inversed frequency vector for positional embedding layer.""" + self.inv_freq = 1.0 / (10000.0**(tf.range(0, self.dim, 2.0) / self.dim)) + super(PositionalEmbedding, self).build(unused_input_shapes) + + def call(self, pos_seq, batch_size): + """Implements call() for the layer.""" + sinusoid_inp = tf.einsum('i,d->id', pos_seq, self.inv_freq) + pos_emb = tf.concat([tf.sin(sinusoid_inp), tf.cos(sinusoid_inp)], -1) + pos_emb = pos_emb[:, None, :] + + if batch_size is not None: + pos_emb = tf.tile(pos_emb, [1, batch_size, 1]) + + return pos_emb + + +class RelativeAttention(tf.keras.layers.Layer): + """Core calculations for relative attention.""" + + def __init__(self, dropout_att, scale): + super(RelativeAttention, self).__init__() + self.scale = scale + self.dropout_att = dropout_att + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + + self.attention_probs_dropout = tf.keras.layers.Dropout( + rate=self.dropout_att) + + super(RelativeAttention, self).build(unused_input_shapes) + + def call(self, q_head, k_head_h, v_head_h, k_head_r, seg_embed, seg_mat, + r_w_bias, r_r_bias, r_s_bias, attn_mask): + """Implements call() for the layer.""" + + # content based attention score + ac = tf.einsum('ibnd,jbnd->ijbn', q_head + r_w_bias, k_head_h) + + # position based attention score + bd = tf.einsum('ibnd,jbnd->ijbn', q_head + r_r_bias, k_head_r) + bd = rel_shift(bd, klen=tf.shape(ac)[1]) + + # segment-based attention score + if seg_mat is None: + ef = 0 + else: + ef = tf.einsum('ibnd,snd->isbn', q_head + r_s_bias, seg_embed) + tgt_shape = tf.shape(bd) + ef = tf.where( + tf.broadcast_to(tf.expand_dims(seg_mat, 3), tgt_shape), + tf.broadcast_to(ef[:, 1:, :, :], tgt_shape), + tf.broadcast_to(ef[:, :1, :, :], tgt_shape)) + + # merges attention scores and performs masking + attn_score = (ac + bd + ef) * self.scale + if attn_mask is not None: + attn_score = attn_score - 1e30 * attn_mask + + # attention probability + attn_prob = tf.nn.softmax(attn_score, 1) + attn_prob = self.attention_probs_dropout(attn_prob) + + # attention output + attn_vec = tf.einsum('ijbn,jbnd->ibnd', attn_prob, v_head_h) + + return attn_vec + + +class PositionwiseFF(tf.keras.layers.Layer): + """Positionwise feed-forward layer.""" + + def __init__(self, d_model, d_inner, dropout, kernel_initializer, + activation_type, **kwargs): + super(PositionwiseFF, self).__init__(**kwargs) + self.d_model = d_model + self.d_inner = d_inner + self.dropout = dropout + self.activation_type = activation_type + self.kernel_initializer = kernel_initializer + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + if self.activation_type == 'relu': + activation = tf.nn.relu + elif self.activation_type == 'gelu': + activation = gelu + else: + raise (ValueError('Unsupported activation type {}'.format( + self.activation_type))) + self.inner_projection_layer = ( + tf.keras.layers.Dense( + units=self.d_inner, + activation=activation, + kernel_initializer=self.kernel_initializer, + name='layer_1')) + self.output_projection_layer = ( + tf.keras.layers.Dense( + units=self.d_model, + kernel_initializer=self.kernel_initializer, + name='layer_2')) + self.output_dropout = tf.keras.layers.Dropout( + rate=self.dropout, name='drop_2') + self.output_layer_norm = ( + tf.keras.layers.LayerNormalization( + name='LayerNorm', axis=-1, epsilon=1e-12)) + super(PositionwiseFF, self).build(unused_input_shapes) + + def call(self, inp): + """Implements call() for the layer.""" + + output = self.inner_projection_layer(inp) + output = self.output_projection_layer(output) + output = self.output_dropout(output) + output = self.output_layer_norm(output + inp) + return output + + +class EmbeddingLookup(tf.keras.layers.Layer): + """Looks up words embeddings for id tensor.""" + + def __init__(self, n_token, d_embed, initializer, **kwargs): + super(EmbeddingLookup, self).__init__(**kwargs) + self.n_token = n_token + self.d_embed = d_embed + self.initializer = initializer + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.lookup_table = self.add_weight( + 'lookup_table', + shape=[self.n_token, self.d_embed], + initializer=self.initializer, + dtype=self.dtype) + + super(EmbeddingLookup, self).build(unused_input_shapes) + + def call(self, inputs): + return tf.nn.embedding_lookup(self.lookup_table, inputs) + + +class RelativeMultiheadAttention(tf.keras.layers.Layer): + """Multi-head attention with relative embedding.""" + + def __init__(self, d_model, n_head, d_head, dropout, dropout_att, + kernel_initializer, **kwargs): + super(RelativeMultiheadAttention, self).__init__(**kwargs) + self.d_model = d_model + self.n_head = n_head + self.d_head = d_head + self.dropout = dropout + self.dropout_att = dropout_att + self.initializer = kernel_initializer + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.scale = 1.0 / (self.d_head**0.5) + + self.output_layer_norm = tf.keras.layers.LayerNormalization( + name='LayerNorm', axis=-1, epsilon=1e-12) + + self.kh_projection_layer = self.add_weight( + 'k/kernel', + shape=[self.d_model, self.n_head, self.d_head], + initializer=self.initializer) + self.vh_projection_layer = self.add_weight( + 'v/kernel', + shape=[self.d_model, self.n_head, self.d_head], + initializer=self.initializer) + self.kr_projection_layer = self.add_weight( + 'r/kernel', + shape=[self.d_model, self.n_head, self.d_head], + initializer=self.initializer) + self.qh_projection_layer = self.add_weight( + 'q/kernel', + shape=[self.d_model, self.n_head, self.d_head], + initializer=self.initializer) + + self.relative_attention_layer = RelativeAttention( + dropout_att=self.dropout_att, scale=self.scale) + + self.proj_o = self.add_weight( + 'o/kernel', + shape=[self.d_model, self.n_head, self.d_head], + initializer=self.initializer) + + self.attention_dropout = tf.keras.layers.Dropout(rate=self.dropout) + + super(RelativeMultiheadAttention, self).build(unused_input_shapes) + + def call(self, h, g, r, r_w_bias, r_r_bias, seg_mat, r_s_bias, seg_embed, + attn_mask_h, attn_mask_g, mems, target_mapping): + """Implements call() for the layer.""" + + if mems is not None and mems.shape.ndims > 1: + cat = tf.concat([mems, h], 0) + else: + cat = h + + # content heads + q_head_h = tf.einsum('ibh,hnd->ibnd', h, self.qh_projection_layer) + k_head_h = tf.einsum('ibh,hnd->ibnd', cat, self.kh_projection_layer) + v_head_h = tf.einsum('ibh,hnd->ibnd', cat, self.vh_projection_layer) + + # positional heads + k_head_r = tf.einsum('ibh,hnd->ibnd', r, self.kr_projection_layer) + + # core attention ops + attn_vec_h = self.relative_attention_layer(q_head_h, k_head_h, v_head_h, + k_head_r, seg_embed, seg_mat, + r_w_bias, r_r_bias, r_s_bias, + attn_mask_h) + + # post processing + output_h = tf.einsum('ibnd,hnd->ibh', attn_vec_h, self.proj_o) + output_h = self.attention_dropout(output_h) + output_h = self.output_layer_norm(output_h + h) + + output_g = None + if g is not None: # enable two-stream attention + # g-stream + q_head_g = tf.einsum('ibh,hnd->ibnd', g, self.qh_projection_layer) + if target_mapping is not None: + q_head_g = tf.einsum('mbnd,mlb->lbnd', q_head_g, target_mapping) + attn_vec_g = self.relative_attention_layer(q_head_g, k_head_h, v_head_h, + k_head_r, seg_embed, seg_mat, + r_w_bias, r_r_bias, r_s_bias, + attn_mask_g) + attn_vec_g = tf.einsum('lbnd,mlb->mbnd', attn_vec_g, target_mapping) + + else: + attn_vec_g = self.relative_attention_layer(q_head_g, k_head_h, v_head_h, + k_head_r, seg_embed, seg_mat, + r_w_bias, r_r_bias, r_s_bias, + attn_mask_g) + + # post processing + output_g = tf.einsum('ibnd,hnd->ibh', attn_vec_g, self.proj_o) + output_g = self.attention_dropout(output_g) + output_g = self.output_layer_norm(output_g + g) + + return (output_h, output_g) + + +class TransformerXLModel(tf.keras.layers.Layer): + """Defines a Transformer-XL computation graph with additional support for XLNet.""" + + def __init__(self, + n_token, + n_layer, + d_model, + n_head, + d_head, + d_inner, + dropout, + dropout_att, + attn_type, + bi_data, + is_training, + initializer, + mem_len=None, + same_length=False, + clamp_len=-1, + untie_r=False, + use_tpu=True, + reuse_len=None, + ff_activation='relu', + use_cls_mask=False, + **kwargs): + """Initializes TransformerXLModel. + + Args: + n_token: int, the number of tokens in vocabulary. + n_layer: int, the number of layers. + d_model: int, the hidden size. + n_head: int, the number of attention heads. + d_head: int, the dimension size of each attention head. + d_inner: int, the hidden size in feed-forward layers. + dropout: float, dropout rate. + dropout_att: float, dropout rate on attention probabilities. + attn_type: str, "uni" or "bi". + bi_data: bool, whether to use bidirectional input pipeline. Usually set to + True during pretraining and False during finetuning. + is_training: bool, whether in training mode. + initializer: A tf initializer. + mem_len: int, the number of tokens to cache. + same_length: bool, whether to use the same attention length for each + token. + clamp_len: int, clamp all relative distances larger than clamp_len. -1 + means no clamping. + untie_r: bool, whether to untie the biases in attention. + use_tpu: bool, whether TPUs are used. + reuse_len: int, the number of tokens in the currect batch to be cached and + reused in the future. + ff_activation: str, "relu" or "gelu". + use_cls_mask: bool, whether to introduce cls mask. + **kwargs: Other parameters. + """ + + super(TransformerXLModel, self).__init__(**kwargs) + + self.n_token = n_token + self.initializer = initializer + self.attn_type = attn_type + self.n_layer = n_layer + self.d_model = d_model + self.n_head = n_head + self.d_head = d_head + self.d_inner = d_inner + self.ff_activation = ff_activation + self.untie_r = untie_r + self.use_tpu = use_tpu + self.dropout = dropout + self.dropout_att = dropout_att + + self.mem_len = mem_len + self.reuse_len = reuse_len + self.bi_data = bi_data + self.clamp_len = clamp_len + self.same_length = same_length + self.use_cls_mask = use_cls_mask + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.tf_float = tf.float32 + + self.embedding_lookup = EmbeddingLookup( + n_token=self.n_token, + d_embed=self.d_model, + initializer=self.initializer, + dtype=self.tf_float, + name='word_embedding') + + self.h_dropout = tf.keras.layers.Dropout(rate=self.dropout) + self.g_dropout = tf.keras.layers.Dropout(rate=self.dropout) + + if self.untie_r: + self.r_w_bias = ( + self.add_weight( + 'r_w_bias', + shape=[self.n_layer, self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + self.r_r_bias = ( + self.add_weight( + 'r_r_bias', + shape=[self.n_layer, self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + self.r_s_bias = ( + self.add_weight( + 'r_s_bias', + shape=[self.n_layer, self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + else: + self.r_w_bias = ( + self.add_weight( + 'r_w_bias', + shape=[self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + self.r_r_bias = ( + self.add_weight( + 'r_r_bias', + shape=[self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + self.r_s_bias = ( + self.add_weight( + 'r_s_bias', [self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer)) + + self.seg_embed = self.add_weight( + 'seg_embed', [self.n_layer, 2, self.n_head, self.d_head], + dtype=self.tf_float, + initializer=self.initializer) + + self.mask_emb = self.add_weight( + 'mask_emb/mask_emb', shape=[1, 1, self.d_model], dtype=self.tf_float) + + self.emb_dropout = tf.keras.layers.Dropout(rate=self.dropout) + self.fwd_position_embedding = PositionalEmbedding(self.d_model) + self.bwd_position_embedding = PositionalEmbedding(self.d_model) + + self.rel_multihead_layers = [] + self.h_positionwise_ffn_layers = [] + for i in range(self.n_layer): + self.rel_multihead_layers.append( + RelativeMultiheadAttention( + d_model=self.d_model, + dropout=self.dropout, + n_head=self.n_head, + d_head=self.d_head, + dropout_att=self.dropout_att, + kernel_initializer=self.initializer, + name='layer_%d/rel_attn' % (i))) + self.h_positionwise_ffn_layers.append( + PositionwiseFF( + d_model=self.d_model, + d_inner=self.d_inner, + dropout=self.dropout, + kernel_initializer=self.initializer, + activation_type=self.ff_activation, + name='layer_%d/ff' % (i))) + + self.output_dropout = tf.keras.layers.Dropout(rate=self.dropout) + + super(TransformerXLModel, self).build(unused_input_shapes) + + def __call__(self, + inp_k, + seg_id=None, + input_mask=None, + mems=None, + perm_mask=None, + target_mapping=None, + inp_q=None, + **kwargs): + # Uses dict to feed inputs into call() in order to keep mems as a python + # list. + inputs = { + 'inp_k': inp_k, + 'seg_id': seg_id, + 'input_mask': input_mask, + 'mems': mems, + 'perm_mask': perm_mask, + 'target_mapping': target_mapping, + 'inp_q': inp_q + } + return super(TransformerXLModel, self).__call__(inputs, **kwargs) + + def call(self, inputs): + """Implements call() for the layer.""" + inp_k = inputs['inp_k'] + seg_id = inputs['seg_id'] + input_mask = inputs['input_mask'] + mems = inputs['mems'] + perm_mask = inputs['perm_mask'] + target_mapping = inputs['target_mapping'] + inp_q = inputs['inp_q'] + + new_mems = [] + + bsz = tf.shape(inp_k)[1] + + qlen = inp_k.shape.as_list()[0] + + mlen = mems[0].shape.as_list()[0] if mems is not None else 0 + klen = mlen + qlen + + ##### Attention mask + # causal attention mask + if self.attn_type == 'uni': + attn_mask = _create_mask(qlen, mlen, self.tf_float, self.same_length) + # pylint: enable=protected-access + attn_mask = attn_mask[:, :, None, None] + elif self.attn_type == 'bi': + attn_mask = None + else: + raise ValueError('Unsupported attention type: {}'.format(self.attn_type)) + + # data mask: input mask & perm mask + if input_mask is not None and perm_mask is not None: + data_mask = input_mask[None] + perm_mask + + elif input_mask is not None and perm_mask is None: + data_mask = input_mask[None] + elif input_mask is None and perm_mask is not None: + data_mask = perm_mask + else: + data_mask = None + + if data_mask is not None: + # all mems can be attended to + mems_mask = tf.zeros([tf.shape(data_mask)[0], mlen, bsz], + dtype=self.tf_float) + data_mask = tf.concat([mems_mask, data_mask], 1) + if attn_mask is None: + attn_mask = data_mask[:, :, :, None] + else: + attn_mask += data_mask[:, :, :, None] + + if attn_mask is not None: + attn_mask = tf.cast(attn_mask > 0, dtype=self.tf_float) + + if attn_mask is not None: + non_tgt_mask = -tf.eye(qlen, dtype=self.tf_float) + non_tgt_mask = tf.concat( + [tf.zeros([qlen, mlen], dtype=self.tf_float), non_tgt_mask], axis=-1) + non_tgt_mask = tf.cast( + (attn_mask + non_tgt_mask[:, :, None, None]) > 0, dtype=self.tf_float) + else: + non_tgt_mask = None + + word_emb_k = self.embedding_lookup(inp_k) + + if inp_q is not None: + if target_mapping is not None: + word_emb_q = tf.tile(self.mask_emb, + [tf.shape(target_mapping)[0], bsz, 1]) + else: + inp_q_ext = inp_q[:, :, None] + word_emb_q = inp_q_ext * self.mask_emb + (1 - inp_q_ext) * word_emb_k + + output_h = self.h_dropout(word_emb_k) + output_g = None + if inp_q is not None: + output_g = self.g_dropout(word_emb_q) + + ##### Segment embedding + if seg_id is not None: + + # Convert `seg_id` to one-hot `seg_mat` + + mem_pad = tf.zeros([mlen, bsz], dtype=tf.int32) + + cat_id = tf.concat([mem_pad, seg_id], 0) + + if self.use_cls_mask: + # `1` indicates not in the same segment [qlen x klen x bsz] + # seg_id: [qlen x bsz] & cat_id: [klen x bsz] + cls_mat = tf.logical_or( + tf.equal(seg_id, tf.constant([data_utils.SEG_ID_CLS]))[:, None], + tf.equal(cat_id, tf.constant([data_utils.SEG_ID_CLS]))[None, :]) + seg_mat = tf.equal(seg_id[:, None], cat_id[None, :]) + seg_mat = tf.logical_or(cls_mat, seg_mat) + else: + seg_mat = tf.logical_not(tf.equal(seg_id[:, None], cat_id[None, :])) + else: + seg_mat = None + + dtype = self.tf_float + freq_seq = tf.range(0, self.d_model, 2.0) + if dtype is not None and dtype != tf.float32: + freq_seq = tf.cast(freq_seq, dtype=self.dtype) + + if self.attn_type == 'bi': + beg, end = klen, -qlen + elif self.attn_type == 'uni': + beg, end = klen, -1 + else: + raise ValueError('Unknown `attn_type` {}.'.format(self.attn_type)) + + if self.bi_data: + fwd_pos_seq = tf.range(beg, end, -1.0) + bwd_pos_seq = tf.range(-beg, -end, 1.0) + + if dtype is not None and dtype != tf.float32: + fwd_pos_seq = tf.cast(fwd_pos_seq, dtype=dtype) + bwd_pos_seq = tf.cast(bwd_pos_seq, dtype=dtype) + + if self.clamp_len > 0: + fwd_pos_seq = tf.clip_by_value(fwd_pos_seq, -self.clamp_len, + self.clamp_len) + bwd_pos_seq = tf.clip_by_value(bwd_pos_seq, -self.clamp_len, + self.clamp_len) + + if bsz is not None: + fwd_pos_emb = self.fwd_position_embedding(fwd_pos_seq, bsz // 2) + bwd_pos_emb = self.bwd_position_embedding(bwd_pos_seq, bsz // 2) + else: + fwd_pos_emb = self.fwd_position_embedding(fwd_pos_seq, None) + bwd_pos_emb = self.bwd_position_embedding(bwd_pos_seq, None) + + pos_emb = tf.concat([fwd_pos_emb, bwd_pos_emb], axis=1) + else: + fwd_pos_seq = tf.range(beg, end, -1.0) + if dtype is not None and dtype != tf.float32: + fwd_pos_seq = tf.cast(fwd_pos_seq, dtype=dtype) + if self.clamp_len > 0: + fwd_pos_seq = tf.clip_by_value(fwd_pos_seq, -self.clamp_len, + self.lamp_len) + + pos_emb = self.fwd_position_embedding(fwd_pos_seq, bsz) + + pos_emb = self.emb_dropout(pos_emb) + + if mems is None: + mems = [None] * self.n_layer + for i in range(self.n_layer): + # cache new mems + new_mems.append( + _cache_mem(output_h, mems[i], self.mem_len, self.reuse_len)) + # pylint: enable=protected-access + + # segment bias + if seg_id is None: + r_s_bias_i = None + seg_embed_i = None + else: + r_s_bias_i = self.r_s_bias if not self.untie_r else self.r_s_bias[i] + seg_embed_i = self.seg_embed[i] + + ffn_layer = self.h_positionwise_ffn_layers[i] + attention_layer = self.rel_multihead_layers[i] + output_h, output_g = attention_layer( + h=output_h, + g=output_g, + r=pos_emb, + r_w_bias=self.r_w_bias if not self.untie_r else self.r_w_bias[i], + r_r_bias=self.r_r_bias if not self.untie_r else self.r_r_bias[i], + seg_mat=seg_mat, + r_s_bias=r_s_bias_i, + seg_embed=seg_embed_i, + attn_mask_h=non_tgt_mask, + attn_mask_g=attn_mask, + mems=mems[i], + target_mapping=target_mapping) + output_h = ffn_layer(output_h) + if output_g is not None: + output_g = ffn_layer(output_g) + + if inp_q is not None: + output = output_g + else: + output = output_h + + return output, new_mems, None + + +class PretrainingXLNetModel(tf.keras.Model): + """XLNet keras model combined with pretraining LM loss layer. + + See the original paper: https://arxiv.org/pdf/1906.08237.pdf + + """ + + def __init__(self, use_proj, xlnet_config, run_config, **kwargs): + super(PretrainingXLNetModel, self).__init__(**kwargs) + self.run_config = run_config + self.initializer = _get_initializer(run_config) + self.xlnet_config = copy.deepcopy(xlnet_config) + + self.transformerxl_model = TransformerXLModel( + n_token=self.xlnet_config.n_token, + initializer=self.initializer, + attn_type='bi', + n_layer=self.xlnet_config.n_layer, + d_model=self.xlnet_config.d_model, + n_head=self.xlnet_config.n_head, + d_head=self.xlnet_config.d_head, + d_inner=self.xlnet_config.d_inner, + ff_activation=self.xlnet_config.ff_activation, + untie_r=self.xlnet_config.untie_r, + is_training=self.run_config.is_training, + use_tpu=self.run_config.use_tpu, + dropout=self.run_config.dropout, + dropout_att=self.run_config.dropout_att, + mem_len=self.run_config.mem_len, + reuse_len=self.run_config.reuse_len, + bi_data=self.run_config.bi_data, + clamp_len=self.run_config.clamp_len, + same_length=self.run_config.same_length, + use_cls_mask=self.run_config.use_cls_mask, + name='transformer') + self.lmloss_layer = LMLossLayer( + n_token=self.xlnet_config.n_token, + d_model=self.xlnet_config.d_model, + initializer=self.initializer, + tie_weight=True, + bi_data=self.run_config.bi_data, + use_tpu=self.run_config.use_tpu, + use_proj=use_proj, + name='lm_loss') + + def call(self, features): + """Implements call() for the layer.""" + + input_ids = tf.transpose(features['input_k'], [1, 0]) + inp_q = tf.transpose(features['input_q'], [1, 0]) + + seg_ids = tf.transpose(features['seg_id'], [1, 0]) + + perm_mask = tf.transpose(features['perm_mask'], [1, 2, 0]) + + target_mapping = tf.transpose(features['target_mapping'], [1, 2, 0]) + + # target for LM loss + target = tf.transpose(features['target'], [1, 0]) + + # target mask for LM loss + tgt_mask = tf.transpose(features['target_mask'], [1, 0]) + + mems = features.get('mems', None) + + transformerxl_output, self.new_mems, self.lookup_table = self.transformerxl_model( + input_ids, + seg_id=seg_ids, + input_mask=None, + mems=mems, + perm_mask=perm_mask, + target_mapping=target_mapping, + inp_q=inp_q) + lm_loss, _ = self.lmloss_layer( + hidden=transformerxl_output, + target=target, + lookup_table=self.transformerxl_model.embedding_lookup.lookup_table, + target_mask=tgt_mask) + self.add_loss(lm_loss) + return self.new_mems, transformerxl_output + + +class ClassificationXLNetModel(tf.keras.Model): + """XLNet keras model combined with classification loss layer. + + See the original paper: https://arxiv.org/pdf/1906.08237.pdf + + """ + + def __init__(self, xlnet_config, run_config, n_class, summary_type, **kwargs): + super(ClassificationXLNetModel, self).__init__(**kwargs) + self.run_config = run_config + self.initializer = _get_initializer(run_config) + self.xlnet_config = copy.deepcopy(xlnet_config) + + self.transformerxl_model = TransformerXLModel( + n_token=self.xlnet_config.n_token, + initializer=self.initializer, + attn_type='bi', + n_layer=self.xlnet_config.n_layer, + d_model=self.xlnet_config.d_model, + n_head=self.xlnet_config.n_head, + d_head=self.xlnet_config.d_head, + d_inner=self.xlnet_config.d_inner, + ff_activation=self.xlnet_config.ff_activation, + untie_r=self.xlnet_config.untie_r, + is_training=self.run_config.is_training, + use_tpu=self.run_config.use_tpu, + dropout=self.run_config.dropout, + dropout_att=self.run_config.dropout_att, + mem_len=self.run_config.mem_len, + reuse_len=self.run_config.reuse_len, + bi_data=self.run_config.bi_data, + clamp_len=self.run_config.clamp_len, + same_length=self.run_config.same_length, + name='transformer') + + self.summarization_layer = Summarization( + d_model=self.xlnet_config.d_model, + n_head=self.xlnet_config.n_head, + d_head=self.xlnet_config.d_head, + dropout=self.run_config.dropout, + dropout_att=self.run_config.dropout_att, + initializer=self.initializer, + use_proj=True, + summary_type=summary_type, + name='sequence_summary') + + self.cl_loss_layer = ClassificationLossLayer( + n_class=n_class, initializer=self.initializer, name='classification') + + def call(self, features): + """Implements call() for the layer.""" + bsz_per_core = tf.shape(features['input_ids'])[0] + + input_ids = tf.transpose(features['input_ids'], [1, 0]) + seg_ids = tf.transpose(features['segment_ids'], [1, 0]) + input_mask = tf.transpose(features['input_mask'], [1, 0]) + + label = tf.reshape(features['label_ids'], [bsz_per_core]) + + mems = features.get('mems', None) + + transformerxl_output, new_mems, self.lookup_table = ( + self.transformerxl_model(input_ids, seg_ids, input_mask, mems)) + + summary = self.summarization_layer(transformerxl_output) + per_example_loss, logits = self.cl_loss_layer(hidden=summary, labels=label) + self.add_loss(tf.keras.backend.mean(per_example_loss)) + return new_mems, logits + + +class LMLossLayer(tf.keras.layers.Layer): + """Layer computing cross entropy loss for language modeling.""" + + def __init__(self, + n_token, + d_model, + initializer, + tie_weight=False, + bi_data=True, + use_tpu=False, + use_proj=False, + **kwargs): + """Constructs LMLoss layer. + + Args: + n_token: Number of tokens in vocabulary. + d_model: The dimension of model hidden state. + initializer: Initializer used for parameters. + tie_weight: Whether to share weights between embedding lookup layer and + next-token prediction layer. + bi_data: Whether to use bidirectional input pipeline. Usually set to True + during pretraining and False during finetuning. + use_tpu: bool, whether to use TPU. + use_proj: bool, whether to add a projection layer before LM prediction. + **kwargs: Other parameters. + """ + super(LMLossLayer, self).__init__(**kwargs) + self.n_token = n_token + self.d_model = d_model + self.initializer = initializer + + self.tie_weight = tie_weight + self.bi_data = bi_data + self.use_tpu = use_tpu + self.use_proj = use_proj + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + if self.use_proj: + self.proj_layer = tf.keras.layers.Dense( + units=self.d_model, + kernel_initializer=self.initializer, + activation=gelu, + name='lm_projection/dense') + self.proj_layer_norm = tf.keras.layers.LayerNormalization( + axis=-1, epsilon=1e-12, name='lm_projection/LayerNorm') + if not self.tie_weight: + self.softmax_w = self.add_weight( + 'weight', + shape=[self.n_token, self.d_model], + initializer=self.initializer) + + self.softmax_b = self.add_weight( + 'bias', shape=[self.n_token], initializer=tf.zeros_initializer()) + + super(LMLossLayer, self).build(unused_input_shapes) + + def call(self, hidden, target, lookup_table, target_mask): + """Implements call() for the layer.""" + if self.use_proj: + hidden = self.proj_layer_norm(self.proj_layer(hidden)) + if self.tie_weight: + logits = tf.einsum('ibd,nd->ibn', hidden, lookup_table) + self.softmax_b + else: + logits = tf.einsum('ibd,nd->ibn', hidden, self.softmax_w) + self.softmax_b + + if self.use_tpu: + one_hot_target = tf.one_hot(target, self.n_token, dtype=logits.dtype) + loss = -tf.reduce_sum(tf.nn.log_softmax(logits) * one_hot_target, -1) + else: + loss = tf.nn.sparse_softmax_cross_entropy_with_logits( + labels=target, logits=logits) + + total_loss = tf.reduce_sum(loss * target_mask) / tf.reduce_sum(target_mask) + + return total_loss, logits + + +class Summarization(tf.keras.layers.Layer): + """The layer to pool the output from XLNet model into a vector.""" + + def __init__(self, + d_model, + n_head, + d_head, + dropout, + dropout_att, + initializer, + use_proj=True, + summary_type='last', + **kwargs): + """Constructs Summarization layer. + + Args: + d_model: int, the dimension of model hidden state. + n_head: int, the number of attention heads. + d_head: int, the dimension size of each attention head. + dropout: float, dropout rate. + dropout_att: float, dropout rate on attention probabilities. + initializer: Initializer used for parameters. + use_proj: bool, whether to use projection layer for summarization. + summary_type: Method used to summarize a sequence into a compact vector. + **kwargs: Other parameters. + """ + super(Summarization, self).__init__(**kwargs) + self.d_model = d_model + self.n_head = n_head + self.d_head = d_head + self.initializer = initializer + + self.dropout = dropout + self.dropout_att = dropout_att + self.use_proj = use_proj + self.summary_type = summary_type + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + if self.use_proj: + self.proj_layer = tf.keras.layers.Dense( + units=self.d_model, + kernel_initializer=self.initializer, + activation=tf.nn.tanh, + name='summary') + self.dropout_layer = tf.keras.layers.Dropout(rate=self.dropout) + + super(Summarization, self).build(unused_input_shapes) + + def call(self, inputs): + """Implements call() for the layer.""" + if self.summary_type == 'last': + summary = inputs[-1] + elif self.summary_type == 'first': + summary = inputs[0] + else: + raise ValueError('Invalid summary type provided: %s' % self.summary_type) + if self.use_proj: + summary = self.proj_layer(summary) + summary = self.dropout_layer(summary) + return summary + + +class ClassificationLossLayer(tf.keras.layers.Layer): + """Layer computing cross entropy loss for classification task.""" + + def __init__(self, n_class, initializer, **kwargs): + """Constructs Summarization layer. + + Args: + n_class: Number of tokens in vocabulary. + initializer: Initializer used for parameters. + **kwargs: Other parameters. + """ + super(ClassificationLossLayer, self).__init__(**kwargs) + + self.n_class = n_class + self.initializer = initializer + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.proj_layer = tf.keras.layers.Dense( + units=self.n_class, kernel_initializer=self.initializer, name='logit') + + super(ClassificationLossLayer, self).build(unused_input_shapes) + + def call(self, hidden, labels): + """Implements call() for the layer.""" + + logits = self.proj_layer(hidden) + one_hot_target = tf.one_hot(labels, self.n_class, dtype=hidden.dtype) # pytype: disable=attribute-error + loss = -tf.reduce_sum(tf.nn.log_softmax(logits) * one_hot_target, -1) + + return loss, logits + + +class QAXLNetModel(tf.keras.Model): + """XLNet keras model combined with question answering loss layer. + + See the original paper: https://arxiv.org/pdf/1906.08237.pdf + + """ + + def __init__(self, xlnet_config, run_config, start_n_top, end_n_top, + **kwargs): + super(QAXLNetModel, self).__init__(**kwargs) + self.run_config = run_config + self.initializer = _get_initializer(run_config) + self.xlnet_config = copy.deepcopy(xlnet_config) + + self.transformerxl_model = TransformerXLModel( + n_token=self.xlnet_config.n_token, + initializer=self.initializer, + attn_type='bi', + n_layer=self.xlnet_config.n_layer, + d_model=self.xlnet_config.d_model, + n_head=self.xlnet_config.n_head, + d_head=self.xlnet_config.d_head, + d_inner=self.xlnet_config.d_inner, + ff_activation=self.xlnet_config.ff_activation, + untie_r=self.xlnet_config.untie_r, + is_training=self.run_config.is_training, + use_tpu=self.run_config.use_tpu, + dropout=self.run_config.dropout, + dropout_att=self.run_config.dropout_att, + mem_len=self.run_config.mem_len, + reuse_len=self.run_config.reuse_len, + bi_data=self.run_config.bi_data, + clamp_len=self.run_config.clamp_len, + same_length=self.run_config.same_length, + name='transformer') + + self.qa_loss_layer = QALossLayer( + d_model=self.xlnet_config.d_model, + start_n_top=start_n_top, + end_n_top=end_n_top, + initializer=self.initializer, + dropout=self.run_config.dropout) + + def call(self, features, training=False): + """Implements call() for the layer.""" + + input_ids = tf.transpose(features['input_ids'], [1, 0]) + seg_ids = tf.transpose(features['segment_ids'], [1, 0]) + input_mask = tf.transpose(features['input_mask'], [1, 0]) + + cls_index = tf.reshape(features['cls_index'], [-1]) + p_mask = features['p_mask'] + + transformerxl_output, new_mems, self.lookup_table = ( + self.transformerxl_model(input_ids, seg_ids, input_mask)) + + if training: + loss, logits = self.qa_loss_layer( + hidden=transformerxl_output, + p_mask=p_mask, + cls_index=cls_index, + start_positions=features['start_positions'], + end_positions=features['end_positions'], + is_impossible=features['is_impossible']) + self.add_loss(loss) + return new_mems, logits + else: + results = self.qa_loss_layer( + hidden=transformerxl_output, p_mask=p_mask, cls_index=cls_index) + return results + + +class QALossLayer(tf.keras.layers.Layer): + """Layer computing position and regression loss for question answering task.""" + + def __init__(self, d_model, start_n_top, end_n_top, initializer, dropout, + **kwargs): + """Constructs Summarization layer. + + Args: + d_model: Int, the hidden size. + start_n_top: Beam size for span start. + end_n_top: Beam size for span end. + initializer: Initializer used for parameters. + dropout: float, dropout rate. + **kwargs: Other parameters. + """ + super(QALossLayer, self).__init__(**kwargs) + self.d_model = d_model + self.start_n_top = start_n_top + self.end_n_top = end_n_top + self.initializer = initializer + self.dropout = dropout + + def build(self, unused_input_shapes): + """Implements build() for the layer.""" + self.start_logits_proj_layer = tf.keras.layers.Dense( + units=1, kernel_initializer=self.initializer, name='start_logits/dense') + self.end_logits_proj_layer0 = tf.keras.layers.Dense( + units=self.d_model, + kernel_initializer=self.initializer, + activation=tf.nn.tanh, + name='end_logits/dense_0') + self.end_logits_proj_layer1 = tf.keras.layers.Dense( + units=1, kernel_initializer=self.initializer, name='end_logits/dense_1') + self.end_logits_layer_norm = tf.keras.layers.LayerNormalization( + axis=-1, epsilon=1e-12, name='end_logits/LayerNorm') + self.answer_class_proj_layer0 = tf.keras.layers.Dense( + units=self.d_model, + kernel_initializer=self.initializer, + activation=tf.nn.tanh, + name='answer_class/dense_0') + self.answer_class_proj_layer1 = tf.keras.layers.Dense( + units=1, + kernel_initializer=self.initializer, + use_bias=False, + name='answer_class/dense_1') + self.ans_feature_dropout = tf.keras.layers.Dropout(rate=self.dropout) + super(QALossLayer, self).build(unused_input_shapes) + + def __call__(self, hidden, p_mask, cls_index, **kwargs): + return super(QALossLayer, self).__call__( + (hidden, p_mask, cls_index, kwargs)) + + def call(self, inputs, training=False): + """Implements call() for the layer.""" + hidden, p_mask, cls_index, kwargs = inputs + return_dict = {} + seq_len = tf.shape(hidden)[0] + + start_logits = self.start_logits_proj_layer(hidden) + start_logits = tf.transpose(tf.squeeze(start_logits, -1), [1, 0]) + start_logits_masked = start_logits * (1 - p_mask) - 1e30 * p_mask + start_log_probs = tf.nn.log_softmax(start_logits_masked, -1) + if training: + start_positions = kwargs['start_positions'] + end_positions = kwargs['end_positions'] + is_impossible = kwargs['is_impossible'] + start_positions = tf.reshape(start_positions, [-1]) + start_index = tf.one_hot( + start_positions, depth=seq_len, axis=-1, dtype=tf.float32) + start_features = tf.einsum('lbh,bl->bh', hidden, start_index) + start_features = tf.tile(start_features[None], [seq_len, 1, 1]) + end_logits = self.end_logits_proj_layer0( + tf.concat([hidden, start_features], axis=-1)) + + end_logits = self.end_logits_layer_norm(end_logits) + + end_logits = self.end_logits_proj_layer1(end_logits) + end_logits = tf.transpose(tf.squeeze(end_logits, -1), [1, 0]) + end_logits_masked = end_logits * (1 - p_mask) - 1e30 * p_mask + end_log_probs = tf.nn.log_softmax(end_logits_masked, -1) + else: + # during inference, compute the end logits based on beam search + + start_top_log_probs, start_top_index = tf.nn.top_k( + start_log_probs, k=self.start_n_top) + start_index = tf.one_hot( + start_top_index, depth=seq_len, axis=-1, dtype=tf.float32) + start_features = tf.einsum('lbh,bkl->bkh', hidden, start_index) + end_input = tf.tile(hidden[:, :, None], [1, 1, self.start_n_top, 1]) + start_features = tf.tile(start_features[None], [seq_len, 1, 1, 1]) + end_input = tf.concat([end_input, start_features], axis=-1) + end_logits = self.end_logits_proj_layer0(end_input) + end_logits = tf.reshape(end_logits, [seq_len, -1, self.d_model]) + end_logits = self.end_logits_layer_norm(end_logits) + + end_logits = tf.reshape(end_logits, + [seq_len, -1, self.start_n_top, self.d_model]) + + end_logits = self.end_logits_proj_layer1(end_logits) + end_logits = tf.reshape(end_logits, [seq_len, -1, self.start_n_top]) + end_logits = tf.transpose(end_logits, [1, 2, 0]) + end_logits_masked = end_logits * ( + 1 - p_mask[:, None]) - 1e30 * p_mask[:, None] + end_log_probs = tf.nn.log_softmax(end_logits_masked, -1) + end_top_log_probs, end_top_index = tf.nn.top_k( + end_log_probs, k=self.end_n_top) + end_top_log_probs = tf.reshape(end_top_log_probs, + [-1, self.start_n_top * self.end_n_top]) + end_top_index = tf.reshape(end_top_index, + [-1, self.start_n_top * self.end_n_top]) + + if training: + return_dict['start_log_probs'] = start_log_probs + return_dict['end_log_probs'] = end_log_probs + else: + return_dict['start_top_log_probs'] = start_top_log_probs + return_dict['start_top_index'] = start_top_index + return_dict['end_top_log_probs'] = end_top_log_probs + return_dict['end_top_index'] = end_top_index + # an additional layer to predict answerability + + # get the representation of CLS + cls_index = tf.one_hot(cls_index, seq_len, axis=-1, dtype=tf.float32) + cls_feature = tf.einsum('lbh,bl->bh', hidden, cls_index) + + # get the representation of START + start_p = tf.nn.softmax(start_logits_masked, axis=-1, name='softmax_start') + start_feature = tf.einsum('lbh,bl->bh', hidden, start_p) + + ans_feature = tf.concat([start_feature, cls_feature], -1) + ans_feature = self.answer_class_proj_layer0(ans_feature) + ans_feature = self.ans_feature_dropout(ans_feature) + cls_logits = self.answer_class_proj_layer1(ans_feature) + cls_logits = tf.squeeze(cls_logits, -1) + return_dict['cls_logits'] = cls_logits + + if not training: + return return_dict + + def compute_loss(log_probs, positions): + one_hot_positions = tf.one_hot(positions, depth=seq_len, dtype=tf.float32) + + loss = -tf.reduce_sum(one_hot_positions * log_probs, axis=-1) + loss = tf.reduce_mean(loss) + return loss + + start_loss = compute_loss(start_log_probs, start_positions) + end_loss = compute_loss(end_log_probs, end_positions) + + total_loss = (start_loss + end_loss) * 0.5 + + is_impossible = tf.reshape(is_impossible, [-1]) + regression_loss = tf.nn.sigmoid_cross_entropy_with_logits( + labels=is_impossible, logits=cls_logits) + regression_loss = tf.reduce_mean(regression_loss) + + total_loss += regression_loss * 0.5 + return total_loss, cls_logits diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling_test.py new file mode 100644 index 0000000..dce887a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/nlp/xlnet/xlnet_modeling_test.py @@ -0,0 +1,52 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import logging +import numpy as np +import tensorflow as tf + +from official.nlp.xlnet import xlnet_modeling + + +class PositionalEmbeddingLayerTest(tf.test.TestCase): + + def test_positional_embedding(self): + """A low-dimensional example is tested. + + With len(pos_seq)=2 and d_model=4: + + pos_seq = [[1.], [0.]] + inv_freq = [1., 0.01] + pos_seq x inv_freq = [[1, 0.01], [0., 0.]] + pos_emb = [[sin(1.), sin(0.01), cos(1.), cos(0.01)], + [sin(0.), sin(0.), cos(0.), cos(0.)]] + = [[0.84147096, 0.00999983, 0.54030228, 0.99994999], + [0., 0., 1., 1.]] + """ + target = np.array([[[0.84147096, 0.00999983, 0.54030228, 0.99994999]], + [[0., 0., 1., 1.]]]) + d_model = 4 + pos_seq = tf.range(1, -1, -1.0) # [1., 0.] + pos_emb_layer = xlnet_modeling.PositionalEmbedding(d_model) + pos_emb = pos_emb_layer(pos_seq, batch_size=None).numpy().astype(float) + + logging.info(pos_emb) + self.assertAllClose(pos_emb, target) + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/pip_package/setup.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/pip_package/setup.py new file mode 100644 index 0000000..e708bc4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/pip_package/setup.py @@ -0,0 +1,89 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Sets up TensorFlow Official Models.""" +import datetime +import os +import sys + +from setuptools import find_packages +from setuptools import setup + +version = '2.2.0' + +project_name = 'tf-models-official' + +long_description = """The TensorFlow official models are a collection of +models that use TensorFlow's high-level APIs. +They are intended to be well-maintained, tested, and kept up to date with the +latest TensorFlow API. They should also be reasonably optimized for fast +performance while still being easy to read.""" + +if '--project_name' in sys.argv: + project_name_idx = sys.argv.index('--project_name') + project_name = sys.argv[project_name_idx + 1] + sys.argv.remove('--project_name') + sys.argv.pop(project_name_idx) + + +def _get_requirements(): + """Parses requirements.txt file.""" + install_requires_tmp = [] + dependency_links_tmp = [] + with open( + os.path.join(os.path.dirname(__file__), '../requirements.txt'), 'r') as f: + for line in f: + package_name = line.strip() + if package_name.startswith('-e '): + dependency_links_tmp.append(package_name[3:].strip()) + else: + install_requires_tmp.append(package_name) + return install_requires_tmp, dependency_links_tmp + +install_requires, dependency_links = _get_requirements() + +if project_name == 'tf-models-nightly': + version += '.dev' + datetime.datetime.now().strftime('%Y%m%d') + install_requires.append('tf-nightly') +else: + install_requires.append('tensorflow>=2.1.0') + +print('install_requires: ', install_requires) +print('dependency_links: ', dependency_links) + +setup( + name=project_name, + version=version, + description='TensorFlow Official Models', + long_description=long_description, + author='Google Inc.', + author_email='no-reply@google.com', + url='https://github.com/tensorflow/models', + license='Apache 2.0', + packages=find_packages(exclude=[ + 'research*', + 'tutorials*', + 'samples*', + 'official.r1*', + 'official.pip_package*', + 'official.benchmark*', + 'official.colab*', + ]), + exclude_package_data={ + '': ['*_test.py',], + }, + install_requires=install_requires, + dependency_links=dependency_links, + python_requires='>=3.6', +) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/README.md new file mode 100644 index 0000000..7251417 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/README.md @@ -0,0 +1,23 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# Legacy Models + +The **r1** folder contains legacy model implementations developed +using TensorFlow 1.x. + +**Note: We will remove this r1 folder from the master branch in June, 2020.** + +After removal, you will still be able to access legacy models +in the previous releases. +(e.g., [v2.1.0](https://github.com/tensorflow/models/releases/tag/v2.1.0)) + +| Model | Description | Reference | +| ----- | ----------- | --------- | +| [Gradient Boosted Trees](boosted_trees) | A gradient boosted trees model to classify higgs boson process from HIGGS dataset | [Link](https://en.wikipedia.org/wiki/Gradient_boosting) | +| [MNIST](mnist) | A basic model to classify digits from the MNIST dataset | [Link](http://yann.lecun.com/exdb/mnist/) | +| [NCF](ncf) | NCF Estimator implementation | [arXiv:1708.05031](https://arxiv.org/abs/1708.05031) | +| [ResNet](resnet) | A deep residual network for image recognition | [arXiv:1512.03385](https://arxiv.org/abs/1512.03385) | +| [Transformer](transformer) | A transformer model to translate the WMT English to German dataset | [arXiv:1706.03762](https://arxiv.org/abs/1706.03762) | +| [Wide & Deep Learning](wide_deep) | A model that combines a wide linear model and deep neural network for recommender systems | [arXiv:1606.07792](https://arxiv.org/abs/1606.07792) | diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/README.md new file mode 100644 index 0000000..56c40aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/README.md @@ -0,0 +1,117 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# Classifying Higgs boson processes in the HIGGS Data Set + +## Overview +The [HIGGS Data Set](https://archive.ics.uci.edu/ml/datasets/HIGGS) contains 11 million samples with 28 features, and is for the classification problem to distinguish between a signal process which produces Higgs bosons and a background process which does not. + +We use Gradient Boosted Trees algorithm to distinguish the two classes. + +--- + +The code sample uses the high level `tf.estimator.Estimator` and `tf.data.Dataset`. These APIs are great for fast iteration and quickly adapting models to your own datasets without major code overhauls. It allows you to move from single-worker training to distributed training, and makes it easy to export model binaries for prediction. Here, for further simplicity and faster execution, we use a utility function `tf.contrib.estimator.boosted_trees_classifier_train_in_memory`. This utility function is especially effective when the input is provided as in-memory data sets like numpy arrays. + +An input function for the `Estimator` typically uses `tf.data.Dataset` API, which can handle various data control like streaming, batching, transform and shuffling. However `boosted_trees_classifier_train_in_memory()` utility function requires that the entire data is provided as a single batch (i.e. without using `batch()` API). Thus in this practice, simply `Dataset.from_tensors()` is used to convert numpy arrays into structured tensors, and `Dataset.zip()` is used to put features and label together. +For further references of `Dataset`, [Read more here](https://www.tensorflow.org/guide/datasets). + +## Running the code +First make sure you've [added the models folder to your Python path](/official/#running-the-models); otherwise you may encounter an error like `ImportError: No module named official.boosted_trees`. + +### Setup +The [HIGGS Data Set](https://archive.ics.uci.edu/ml/datasets/HIGGS) that this sample uses for training is hosted by the [UC Irvine Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/). We have provided a script that downloads and cleans the necessary files. + +``` +python data_download.py +``` + +This will download a file and store the processed file under the directory designated by `--data_dir` (defaults to `/tmp/higgs_data/`). To change the target directory, set the `--data_dir` flag. The directory could be network storages that Tensorflow supports (like Google Cloud Storage, `gs:////`). +The file downloaded to the local temporary folder is about 2.8 GB, and the processed file is about 0.8 GB, so there should be enough storage to handle them. + + +### Training + +This example uses about 3 GB of RAM during training. +You can run the code locally as follows: + +``` +python train_higgs.py +``` + +The model is by default saved to `/tmp/higgs_model`, which can be changed using the `--model_dir` flag. +Note that the model_dir is cleaned up before every time training starts. + +Model parameters can be adjusted by flags, like `--n_trees`, `--max_depth`, `--learning_rate` and so on. Check out the code for details. + +The final accuracy will be around 74% and loss will be around 0.516 over the eval set, when trained with the default parameters. + +By default, the first 1 million examples among 11 millions are used for training, and the last 1 million examples are used for evaluation. +The training/evaluation data can be selected as index ranges by flags `--train_start`, `--train_count`, `--eval_start`, `--eval_count`, etc. + +### TensorBoard + +Run TensorBoard to inspect the details about the graph and training progression. + +``` +tensorboard --logdir=/tmp/higgs_model # set logdir as --model_dir set during training. +``` + +## Inference with SavedModel +You can export the model into Tensorflow [SavedModel](https://www.tensorflow.org/guide/saved_model) format by using the argument `--export_dir`: + +``` +python train_higgs.py --export_dir /tmp/higgs_boosted_trees_saved_model +``` + +After the model finishes training, use [`saved_model_cli`](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) to inspect and execute the SavedModel. + +Try the following commands to inspect the SavedModel: + +**Replace `${TIMESTAMP}` with the folder produced (e.g. 1524249124)** +``` +# List possible tag_sets. Only one metagraph is saved, so there will be one option. +saved_model_cli show --dir /tmp/higgs_boosted_trees_saved_model/${TIMESTAMP}/ + +# Show SignatureDefs for tag_set=serve. SignatureDefs define the outputs to show. +saved_model_cli show --dir /tmp/higgs_boosted_trees_saved_model/${TIMESTAMP}/ \ + --tag_set serve --all +``` + +### Inference +Let's use the model to predict the income group of two examples. +Note that this model exports SavedModel with the custom parsing module that accepts csv lines as features. (Each line is an example with 28 columns; be careful to not add a label column, unlike in the training data.) + +``` +saved_model_cli run --dir /tmp/boosted_trees_higgs_saved_model/${TIMESTAMP}/ \ + --tag_set serve --signature_def="predict" \ + --input_exprs='inputs=["0.869293,-0.635082,0.225690,0.327470,-0.689993,0.754202,-0.248573,-1.092064,0.0,1.374992,-0.653674,0.930349,1.107436,1.138904,-1.578198,-1.046985,0.0,0.657930,-0.010455,-0.045767,3.101961,1.353760,0.979563,0.978076,0.920005,0.721657,0.988751,0.876678", "1.595839,-0.607811,0.007075,1.818450,-0.111906,0.847550,-0.566437,1.581239,2.173076,0.755421,0.643110,1.426367,0.0,0.921661,-1.190432,-1.615589,0.0,0.651114,-0.654227,-1.274345,3.101961,0.823761,0.938191,0.971758,0.789176,0.430553,0.961357,0.957818"]' +``` + +This will print out the predicted classes and class probabilities. Something like: + +``` +Result for output key class_ids: +[[1] + [0]] +Result for output key classes: +[['1'] + ['0']] +Result for output key logistic: +[[0.6440273 ] + [0.10902369]] +Result for output key logits: +[[ 0.59288704] + [-2.1007526 ]] +Result for output key probabilities: +[[0.3559727 0.6440273] + [0.8909763 0.1090237]] +``` + +Please note that "predict" signature_def gives out different (more detailed) results than "classification" or "serving_default". + +## Additional Links + +If you are interested in distributed training, take a look at [Distributed TensorFlow](https://www.tensorflow.org/deploy/distributed). + +You can also [train models on Cloud ML Engine](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction), which provides [hyperparameter tuning](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#hyperparameter_tuning) to maximize your model's results and enables [deploying your model for prediction](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#deploy_a_model_to_support_prediction). diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/data_download.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/data_download.py new file mode 100644 index 0000000..1b6fc05 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/data_download.py @@ -0,0 +1,97 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Downloads the UCI HIGGS Dataset and prepares train data. + +The details on the dataset are in https://archive.ics.uci.edu/ml/datasets/HIGGS + +It takes a while as it needs to download 2.8 GB over the network, process, then +store it into the specified location as a compressed numpy file. + +Usage: +$ python data_download.py --data_dir=/tmp/higgs_data +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gzip +import os +import tempfile + +# pylint: disable=g-bad-import-order +import numpy as np +import pandas as pd +from six.moves import urllib +from absl import app as absl_app +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core + +URL_ROOT = "https://archive.ics.uci.edu/ml/machine-learning-databases/00280" +INPUT_FILE = "HIGGS.csv.gz" +NPZ_FILE = "HIGGS.csv.gz.npz" # numpy compressed file to contain "data" array. + + +def _download_higgs_data_and_save_npz(data_dir): + """Download higgs data and store as a numpy compressed file.""" + input_url = URL_ROOT + "/" + INPUT_FILE + np_filename = os.path.join(data_dir, NPZ_FILE) + if tf.gfile.Exists(np_filename): + raise ValueError("data_dir already has the processed data file: {}".format( + np_filename)) + if not tf.gfile.Exists(data_dir): + tf.gfile.MkDir(data_dir) + # 2.8 GB to download. + try: + tf.logging.info("Data downloading...") + temp_filename, _ = urllib.request.urlretrieve(input_url) + # Reading and parsing 11 million csv lines takes 2~3 minutes. + tf.logging.info("Data processing... taking multiple minutes...") + with gzip.open(temp_filename, "rb") as csv_file: + data = pd.read_csv( + csv_file, + dtype=np.float32, + names=["c%02d" % i for i in range(29)] # label + 28 features. + ).as_matrix() + finally: + tf.gfile.Remove(temp_filename) + + # Writing to temporary location then copy to the data_dir (0.8 GB). + f = tempfile.NamedTemporaryFile() + np.savez_compressed(f, data=data) + tf.gfile.Copy(f.name, np_filename) + tf.logging.info("Data saved to: {}".format(np_filename)) + + +def main(unused_argv): + if not tf.gfile.Exists(FLAGS.data_dir): + tf.gfile.MkDir(FLAGS.data_dir) + _download_higgs_data_and_save_npz(FLAGS.data_dir) + + +def define_data_download_flags(): + """Add flags specifying data download arguments.""" + flags.DEFINE_string( + name="data_dir", default="/tmp/higgs_data", + help=flags_core.help_wrap( + "Directory to download higgs dataset and store training/eval data.")) + + +if __name__ == "__main__": + tf.logging.set_verbosity(tf.logging.INFO) + define_data_download_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/train_higgs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/train_higgs.py new file mode 100644 index 0000000..d496a39 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/boosted_trees/train_higgs.py @@ -0,0 +1,297 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""A script that builds boosted trees over higgs data. + +If you haven't, please run data_download.py beforehand to prepare the data. + +For some more details on this example, please refer to README.md as well. + +Note that the model_dir is cleaned up before starting the training. + +Usage: +$ python train_higgs.py --n_trees=100 --max_depth=6 --learning_rate=0.1 \ + --model_dir=/tmp/higgs_model + +Note that BoostedTreesClassifier is available since Tensorflow 1.8.0. +So you need to install recent enough version of Tensorflow to use this example. + +The training data is by default the first million examples out of 11M examples, +and eval data is by default the last million examples. +They are controlled by --train_start, --train_count, --eval_start, --eval_count. +e.g. to train over the first 10 million examples instead of 1 million: +$ python train_higgs.py --n_trees=100 --max_depth=6 --learning_rate=0.1 \ + --model_dir=/tmp/higgs_model --train_count=10000000 + +Training history and metrics can be inspected using tensorboard. +Set --logdir as the --model_dir set by flag when training +(or the default /tmp/higgs_model). +$ tensorboard --logdir=/tmp/higgs_model +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +# pylint: disable=g-bad-import-order +import numpy as np +from absl import app as absl_app +from absl import flags +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.utils.flags import core as flags_core +from official.utils.flags._conventions import help_wrap +from official.utils.logs import logger + +NPZ_FILE = "HIGGS.csv.gz.npz" # numpy compressed file containing "data" array + + +def read_higgs_data(data_dir, train_start, train_count, eval_start, eval_count): + """Reads higgs data from csv and returns train and eval data. + + Args: + data_dir: A string, the directory of higgs dataset. + train_start: An integer, the start index of train examples within the data. + train_count: An integer, the number of train examples within the data. + eval_start: An integer, the start index of eval examples within the data. + eval_count: An integer, the number of eval examples within the data. + + Returns: + Numpy array of train data and eval data. + """ + npz_filename = os.path.join(data_dir, NPZ_FILE) + try: + # gfile allows numpy to read data from network data sources as well. + with tf.gfile.Open(npz_filename, "rb") as npz_file: + with np.load(npz_file) as npz: + data = npz["data"] + except tf.errors.NotFoundError as e: + raise RuntimeError( + "Error loading data; use data_download.py to prepare the data.\n{}: {}" + .format(type(e).__name__, e)) + return (data[train_start:train_start+train_count], + data[eval_start:eval_start+eval_count]) + + +# This showcases how to make input_fn when the input data is available in the +# form of numpy arrays. +def make_inputs_from_np_arrays(features_np, label_np): + """Makes and returns input_fn and feature_columns from numpy arrays. + + The generated input_fn will return tf.data.Dataset of feature dictionary and a + label, and feature_columns will consist of the list of + tf.feature_column.BucketizedColumn. + + Note, for in-memory training, tf.data.Dataset should contain the whole data + as a single tensor. Don't use batch. + + Args: + features_np: A numpy ndarray (shape=[batch_size, num_features]) for + float32 features. + label_np: A numpy ndarray (shape=[batch_size, 1]) for labels. + + Returns: + input_fn: A function returning a Dataset of feature dict and label. + feature_names: A list of feature names. + feature_column: A list of tf.feature_column.BucketizedColumn. + """ + num_features = features_np.shape[1] + features_np_list = np.split(features_np, num_features, axis=1) + # 1-based feature names. + feature_names = ["feature_%02d" % (i + 1) for i in range(num_features)] + + # Create source feature_columns and bucketized_columns. + def get_bucket_boundaries(feature): + """Returns bucket boundaries for feature by percentiles.""" + return np.unique(np.percentile(feature, range(0, 100))).tolist() + source_columns = [ + tf.feature_column.numeric_column( + feature_name, dtype=tf.float32, + # Although higgs data have no missing values, in general, default + # could be set as 0 or some reasonable value for missing values. + default_value=0.0) + for feature_name in feature_names + ] + bucketized_columns = [ + tf.feature_column.bucketized_column( + source_columns[i], + boundaries=get_bucket_boundaries(features_np_list[i])) + for i in range(num_features) + ] + + # Make an input_fn that extracts source features. + def input_fn(): + """Returns features as a dictionary of numpy arrays, and a label.""" + features = { + feature_name: tf.constant(features_np_list[i]) + for i, feature_name in enumerate(feature_names) + } + return tf.data.Dataset.zip((tf.data.Dataset.from_tensors(features), + tf.data.Dataset.from_tensors(label_np),)) + + return input_fn, feature_names, bucketized_columns + + +def make_eval_inputs_from_np_arrays(features_np, label_np): + """Makes eval input as streaming batches.""" + num_features = features_np.shape[1] + features_np_list = np.split(features_np, num_features, axis=1) + # 1-based feature names. + feature_names = ["feature_%02d" % (i + 1) for i in range(num_features)] + + def input_fn(): + features = { + feature_name: tf.constant(features_np_list[i]) + for i, feature_name in enumerate(feature_names) + } + return tf.data.Dataset.zip(( + tf.data.Dataset.from_tensor_slices(features), + tf.data.Dataset.from_tensor_slices(label_np),)).batch(1000) + + return input_fn + + +def _make_csv_serving_input_receiver_fn(column_names, column_defaults): + """Returns serving_input_receiver_fn for csv. + + The input arguments are relevant to `tf.decode_csv()`. + + Args: + column_names: a list of column names in the order within input csv. + column_defaults: a list of default values with the same size of + column_names. Each entity must be either a list of one scalar, or an + empty list to denote the corresponding column is required. + e.g. [[""], [2.5], []] indicates the third column is required while + the first column must be string and the second must be float/double. + + Returns: + a serving_input_receiver_fn that handles csv for serving. + """ + def serving_input_receiver_fn(): + csv = tf.placeholder(dtype=tf.string, shape=[None], name="csv") + features = dict(zip(column_names, tf.decode_csv(csv, column_defaults))) + receiver_tensors = {"inputs": csv} + return tf.estimator.export.ServingInputReceiver(features, receiver_tensors) + + return serving_input_receiver_fn + + +def train_boosted_trees(flags_obj): + """Train boosted_trees estimator on HIGGS data. + + Args: + flags_obj: An object containing parsed flag values. + """ + # Clean up the model directory if present. + if tf.gfile.Exists(flags_obj.model_dir): + tf.gfile.DeleteRecursively(flags_obj.model_dir) + tf.logging.info("## Data loading...") + train_data, eval_data = read_higgs_data( + flags_obj.data_dir, flags_obj.train_start, flags_obj.train_count, + flags_obj.eval_start, flags_obj.eval_count) + tf.logging.info("## Data loaded; train: {}{}, eval: {}{}".format( + train_data.dtype, train_data.shape, eval_data.dtype, eval_data.shape)) + # Data consists of one label column followed by 28 feature columns. + train_input_fn, feature_names, feature_columns = make_inputs_from_np_arrays( + features_np=train_data[:, 1:], label_np=train_data[:, 0:1]) + eval_input_fn = make_eval_inputs_from_np_arrays( + features_np=eval_data[:, 1:], label_np=eval_data[:, 0:1]) + tf.logging.info("## Features prepared. Training starts...") + + # Create benchmark logger to log info about the training and metric values + run_params = { + "train_start": flags_obj.train_start, + "train_count": flags_obj.train_count, + "eval_start": flags_obj.eval_start, + "eval_count": flags_obj.eval_count, + "n_trees": flags_obj.n_trees, + "max_depth": flags_obj.max_depth, + } + benchmark_logger = logger.config_benchmark_logger(flags_obj) + benchmark_logger.log_run_info( + model_name="boosted_trees", + dataset_name="higgs", + run_params=run_params, + test_id=flags_obj.benchmark_test_id) + + # Though BoostedTreesClassifier is under tf.estimator, faster in-memory + # training is yet provided as a contrib library. + from tensorflow.contrib import estimator as contrib_estimator # pylint: disable=g-import-not-at-top + classifier = contrib_estimator.boosted_trees_classifier_train_in_memory( + train_input_fn, + feature_columns, + model_dir=flags_obj.model_dir or None, + n_trees=flags_obj.n_trees, + max_depth=flags_obj.max_depth, + learning_rate=flags_obj.learning_rate) + + # Evaluation. + eval_results = classifier.evaluate(eval_input_fn) + # Benchmark the evaluation results + benchmark_logger.log_evaluation_result(eval_results) + + # Exporting the savedmodel with csv parsing. + if flags_obj.export_dir is not None: + classifier.export_savedmodel( + flags_obj.export_dir, + _make_csv_serving_input_receiver_fn( + column_names=feature_names, + # columns are all floats. + column_defaults=[[0.0]] * len(feature_names)), + strip_default_attrs=True) + + +def main(_): + train_boosted_trees(flags.FLAGS) + + +def define_train_higgs_flags(): + """Add tree related flags as well as training/eval configuration.""" + flags_core.define_base(clean=False, stop_threshold=False, batch_size=False, + num_gpu=False, export_dir=True) + flags_core.define_benchmark() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_integer( + name="train_start", default=0, + help=help_wrap("Start index of train examples within the data.")) + flags.DEFINE_integer( + name="train_count", default=1000000, + help=help_wrap("Number of train examples within the data.")) + flags.DEFINE_integer( + name="eval_start", default=10000000, + help=help_wrap("Start index of eval examples within the data.")) + flags.DEFINE_integer( + name="eval_count", default=1000000, + help=help_wrap("Number of eval examples within the data.")) + + flags.DEFINE_integer( + "n_trees", default=100, help=help_wrap("Number of trees to build.")) + flags.DEFINE_integer( + "max_depth", default=6, help=help_wrap("Maximum depths of each tree.")) + flags.DEFINE_float( + "learning_rate", default=0.1, + help=help_wrap("The learning rate.")) + + flags_core.set_defaults(data_dir="/tmp/higgs_data", + model_dir="/tmp/higgs_model") + + +if __name__ == "__main__": + # Training progress and eval results are shown as logging.INFO; so enables it. + tf.logging.set_verbosity(tf.logging.INFO) + define_train_higgs_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/README.md new file mode 100644 index 0000000..55f3523 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/README.md @@ -0,0 +1,91 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# MNIST in TensorFlow + +This directory builds a convolutional neural net to classify the [MNIST +dataset](http://yann.lecun.com/exdb/mnist/) using the +[tf.data](https://www.tensorflow.org/api_docs/python/tf/data), +[tf.estimator.Estimator](https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator), +and +[tf.layers](https://www.tensorflow.org/api_docs/python/tf/layers) +APIs. + + +## Setup + +To begin, you'll simply need the latest version of TensorFlow installed. +First make sure you've [added the models folder to your Python path]: + +```shell +export PYTHONPATH="$PYTHONPATH:/path/to/models" +``` + +Otherwise you may encounter an error like `ImportError: No module named official.mnist`. + +Then to train the model, run the following: + +``` +python mnist.py +``` + +The model will begin training and will automatically evaluate itself on the +validation data. + +Illustrative unit tests and benchmarks can be run with: + +``` +python mnist_test.py +python mnist_test.py --benchmarks=. +``` + +## Exporting the model + +You can export the model into Tensorflow [SavedModel](https://www.tensorflow.org/guide/saved_model) format by using the argument `--export_dir`: + +``` +python mnist.py --export_dir /tmp/mnist_saved_model +``` + +The SavedModel will be saved in a timestamped directory under `/tmp/mnist_saved_model/` (e.g. `/tmp/mnist_saved_model/1513630966/`). + +**Getting predictions with SavedModel** +Use [`saved_model_cli`](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) to inspect and execute the SavedModel. + +``` +saved_model_cli run --dir /tmp/mnist_saved_model/TIMESTAMP --tag_set serve --signature_def classify --inputs image=examples.npy +``` + +`examples.npy` contains the data from `example5.png` and `example3.png` in a numpy array, in that order. The array values are normalized to values between 0 and 1. + +The output should look similar to below: +``` +Result for output key classes: +[5 3] +Result for output key probabilities: +[[ 1.53558474e-07 1.95694142e-13 1.31193523e-09 5.47467265e-03 + 5.85711526e-22 9.94520664e-01 3.48423509e-06 2.65365645e-17 + 9.78631419e-07 3.15522470e-08] + [ 1.22413359e-04 5.87615965e-08 1.72251271e-06 9.39960718e-01 + 3.30306928e-11 2.87386645e-02 2.82353517e-02 8.21146413e-18 + 2.52568233e-03 4.15460236e-04]] +``` + +## Experimental: Eager Execution + +[Eager execution](https://research.googleblog.com/2017/10/eager-execution-imperative-define-by.html) +(an preview feature in TensorFlow 1.5) is an imperative interface to TensorFlow. +The exact same model defined in `mnist.py` can be trained without creating a +TensorFlow graph using: + +``` +python mnist_eager.py +``` + +## Experimental: TPU Acceleration + +`mnist.py` (and `mnist_eager.py`) demonstrate training a neural network to +classify digits on CPUs and GPUs. `mnist_tpu.py` can be used to train the +same model using TPUs for hardware acceleration. More information in +the [tensorflow/tpu](https://github.com/tensorflow/tpu) repository. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/dataset.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/dataset.py new file mode 100644 index 0000000..2bdd155 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/dataset.py @@ -0,0 +1,117 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""tf.data.Dataset interface to the MNIST dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gzip +import os +import shutil +import tempfile + +import numpy as np +from six.moves import urllib +import tensorflow as tf + + +def read32(bytestream): + """Read 4 bytes from bytestream as an unsigned 32-bit integer.""" + dt = np.dtype(np.uint32).newbyteorder('>') + return np.frombuffer(bytestream.read(4), dtype=dt)[0] + + +def check_image_file_header(filename): + """Validate that filename corresponds to images for the MNIST dataset.""" + with tf.io.gfile.GFile(filename, 'rb') as f: + magic = read32(f) + read32(f) # num_images, unused + rows = read32(f) + cols = read32(f) + if magic != 2051: + raise ValueError('Invalid magic number %d in MNIST file %s' % (magic, + f.name)) + if rows != 28 or cols != 28: + raise ValueError( + 'Invalid MNIST file %s: Expected 28x28 images, found %dx%d' % + (f.name, rows, cols)) + + +def check_labels_file_header(filename): + """Validate that filename corresponds to labels for the MNIST dataset.""" + with tf.io.gfile.GFile(filename, 'rb') as f: + magic = read32(f) + read32(f) # num_items, unused + if magic != 2049: + raise ValueError('Invalid magic number %d in MNIST file %s' % (magic, + f.name)) + + +def download(directory, filename): + """Download (and unzip) a file from the MNIST dataset if not already done.""" + filepath = os.path.join(directory, filename) + if tf.io.gfile.exists(filepath): + return filepath + if not tf.io.gfile.exists(directory): + tf.io.gfile.makedirs(directory) + # CVDF mirror of http://yann.lecun.com/exdb/mnist/ + url = 'https://storage.googleapis.com/cvdf-datasets/mnist/' + filename + '.gz' + _, zipped_filepath = tempfile.mkstemp(suffix='.gz') + print('Downloading %s to %s' % (url, zipped_filepath)) + urllib.request.urlretrieve(url, zipped_filepath) + with gzip.open(zipped_filepath, 'rb') as f_in, \ + tf.io.gfile.GFile(filepath, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + os.remove(zipped_filepath) + return filepath + + +def dataset(directory, images_file, labels_file): + """Download and parse MNIST dataset.""" + + images_file = download(directory, images_file) + labels_file = download(directory, labels_file) + + check_image_file_header(images_file) + check_labels_file_header(labels_file) + + def decode_image(image): + # Normalize from [0, 255] to [0.0, 1.0] + image = tf.io.decode_raw(image, tf.uint8) + image = tf.cast(image, tf.float32) + image = tf.reshape(image, [784]) + return image / 255.0 + + def decode_label(label): + label = tf.io.decode_raw(label, tf.uint8) # tf.string -> [tf.uint8] + label = tf.reshape(label, []) # label is a scalar + return tf.cast(label, tf.int32) + + images = tf.data.FixedLengthRecordDataset( + images_file, 28 * 28, header_bytes=16).map(decode_image) + labels = tf.data.FixedLengthRecordDataset( + labels_file, 1, header_bytes=8).map(decode_label) + return tf.data.Dataset.zip((images, labels)) + + +def train(directory): + """tf.data.Dataset object for MNIST training data.""" + return dataset(directory, 'train-images-idx3-ubyte', + 'train-labels-idx1-ubyte') + + +def test(directory): + """tf.data.Dataset object for MNIST test data.""" + return dataset(directory, 't10k-images-idx3-ubyte', 't10k-labels-idx1-ubyte') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist.py new file mode 100644 index 0000000..e1eeb2c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist.py @@ -0,0 +1,247 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Convolutional Neural Network Estimator for MNIST, built with tf.layers.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app as absl_app +from absl import flags +from absl import logging +from six.moves import range +import tensorflow as tf + +from official.r1.mnist import dataset +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers + + +LEARNING_RATE = 1e-4 + + +def create_model(data_format): + """Model to recognize digits in the MNIST dataset. + + Network structure is equivalent to: + https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/examples/tutorials/mnist/mnist_deep.py + + But uses the tf.keras API. + + Args: + data_format: Either 'channels_first' or 'channels_last'. 'channels_first' is + typically faster on GPUs while 'channels_last' is typically faster on + CPUs. See + https://www.tensorflow.org/performance/performance_guide#data_formats + + Returns: + A tf.keras.Model. + """ + if data_format == 'channels_first': + input_shape = [1, 28, 28] + else: + assert data_format == 'channels_last' + input_shape = [28, 28, 1] + + l = tf.keras.layers + max_pool = l.MaxPooling2D( + (2, 2), (2, 2), padding='same', data_format=data_format) + # The model consists of a sequential chain of layers, so tf.keras.Sequential + # (a subclass of tf.keras.Model) makes for a compact description. + return tf.keras.Sequential( + [ + l.Reshape( + target_shape=input_shape, + input_shape=(28 * 28,)), + l.Conv2D( + 32, + 5, + padding='same', + data_format=data_format, + activation=tf.nn.relu), + max_pool, + l.Conv2D( + 64, + 5, + padding='same', + data_format=data_format, + activation=tf.nn.relu), + max_pool, + l.Flatten(), + l.Dense(1024, activation=tf.nn.relu), + l.Dropout(0.4), + l.Dense(10) + ]) + + +def define_mnist_flags(): + """Defines flags for mnist.""" + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + num_gpu=True, hooks=True, export_dir=True, + distribution_strategy=True) + flags_core.define_performance(inter_op=True, intra_op=True, + num_parallel_calls=False, + all_reduce_alg=True) + flags_core.define_image() + flags.adopt_module_key_flags(flags_core) + flags_core.set_defaults(data_dir='/tmp/mnist_data', + model_dir='/tmp/mnist_model', + batch_size=100, + train_epochs=40) + + +def model_fn(features, labels, mode, params): + """The model_fn argument for creating an Estimator.""" + model = create_model(params['data_format']) + image = features + if isinstance(image, dict): + image = features['image'] + + if mode == tf.estimator.ModeKeys.PREDICT: + logits = model(image, training=False) + predictions = { + 'classes': tf.argmax(logits, axis=1), + 'probabilities': tf.nn.softmax(logits), + } + return tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.PREDICT, + predictions=predictions, + export_outputs={ + 'classify': tf.estimator.export.PredictOutput(predictions) + }) + if mode == tf.estimator.ModeKeys.TRAIN: + optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=LEARNING_RATE) + + logits = model(image, training=True) + loss = tf.compat.v1.losses.sparse_softmax_cross_entropy(labels=labels, + logits=logits) + accuracy = tf.compat.v1.metrics.accuracy( + labels=labels, predictions=tf.argmax(logits, axis=1)) + + # Name tensors to be logged with LoggingTensorHook. + tf.identity(LEARNING_RATE, 'learning_rate') + tf.identity(loss, 'cross_entropy') + tf.identity(accuracy[1], name='train_accuracy') + + # Save accuracy scalar to Tensorboard output. + tf.summary.scalar('train_accuracy', accuracy[1]) + + return tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.TRAIN, + loss=loss, + train_op=optimizer.minimize( + loss, + tf.compat.v1.train.get_or_create_global_step())) + if mode == tf.estimator.ModeKeys.EVAL: + logits = model(image, training=False) + loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) + return tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.EVAL, + loss=loss, + eval_metric_ops={ + 'accuracy': + tf.metrics.accuracy( + labels=labels, predictions=tf.argmax(logits, axis=1)), + }) + + +def run_mnist(flags_obj): + """Run MNIST training and eval loop. + + Args: + flags_obj: An object containing parsed flag values. + """ + model_helpers.apply_clean(flags_obj) + model_function = model_fn + + session_config = tf.compat.v1.ConfigProto( + inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads, + intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads, + allow_soft_placement=True) + + distribution_strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_core.get_num_gpus(flags_obj), + all_reduce_alg=flags_obj.all_reduce_alg) + + run_config = tf.estimator.RunConfig( + train_distribute=distribution_strategy, session_config=session_config) + + data_format = flags_obj.data_format + if data_format is None: + data_format = ('channels_first' if tf.config.list_physical_devices('GPU') + else 'channels_last') + mnist_classifier = tf.estimator.Estimator( + model_fn=model_function, + model_dir=flags_obj.model_dir, + config=run_config, + params={ + 'data_format': data_format, + }) + + # Set up training and evaluation input functions. + def train_input_fn(): + """Prepare data for training.""" + + # When choosing shuffle buffer sizes, larger sizes result in better + # randomness, while smaller sizes use less memory. MNIST is a small + # enough dataset that we can easily shuffle the full epoch. + ds = dataset.train(flags_obj.data_dir) + ds = ds.cache().shuffle(buffer_size=50000).batch(flags_obj.batch_size) + + # Iterate through the dataset a set number (`epochs_between_evals`) of times + # during each training session. + ds = ds.repeat(flags_obj.epochs_between_evals) + return ds + + def eval_input_fn(): + return dataset.test(flags_obj.data_dir).batch( + flags_obj.batch_size).make_one_shot_iterator().get_next() + + # Set up hook that outputs training logs every 100 steps. + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, model_dir=flags_obj.model_dir, + batch_size=flags_obj.batch_size) + + # Train and evaluate model. + for _ in range(flags_obj.train_epochs // flags_obj.epochs_between_evals): + mnist_classifier.train(input_fn=train_input_fn, hooks=train_hooks) + eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) + print('\nEvaluation results:\n\t%s\n' % eval_results) + + if model_helpers.past_stop_threshold(flags_obj.stop_threshold, + eval_results['accuracy']): + break + + # Export the model + if flags_obj.export_dir is not None: + image = tf.compat.v1.placeholder(tf.float32, [None, 28, 28]) + input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn({ + 'image': image, + }) + mnist_classifier.export_savedmodel(flags_obj.export_dir, input_fn, + strip_default_attrs=True) + + +def main(_): + run_mnist(flags.FLAGS) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_mnist_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager.py new file mode 100644 index 0000000..0a3a3b3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager.py @@ -0,0 +1,212 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""MNIST model training with TensorFlow eager execution. + +See: +https://research.googleblog.com/2017/10/eager-execution-imperative-define-by.html + +This program demonstrates training of the convolutional neural network model +defined in mnist.py with eager execution enabled. + +If you are not interested in eager execution, you should ignore this file. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +# pylint: disable=g-bad-import-order +from absl import app as absl_app +from absl import flags +import tensorflow as tf +from tensorflow.python import eager as tfe +# pylint: enable=g-bad-import-order + +from official.r1.mnist import dataset as mnist_dataset +from official.r1.mnist import mnist +from official.utils.flags import core as flags_core +from official.utils.misc import model_helpers + + +def loss(logits, labels): + return tf.reduce_mean( + tf.nn.sparse_softmax_cross_entropy_with_logits( + logits=logits, labels=labels)) + + +def compute_accuracy(logits, labels): + predictions = tf.argmax(logits, axis=1, output_type=tf.int64) + labels = tf.cast(labels, tf.int64) + batch_size = int(logits.shape[0]) + return tf.reduce_sum( + tf.cast(tf.equal(predictions, labels), dtype=tf.float32)) / batch_size + + +def train(model, optimizer, dataset, step_counter, log_interval=None): + """Trains model on `dataset` using `optimizer`.""" + from tensorflow.contrib import summary as contrib_summary # pylint: disable=g-import-not-at-top + + start = time.time() + for (batch, (images, labels)) in enumerate(dataset): + with contrib_summary.record_summaries_every_n_global_steps( + 10, global_step=step_counter): + # Record the operations used to compute the loss given the input, + # so that the gradient of the loss with respect to the variables + # can be computed. + with tf.GradientTape() as tape: + logits = model(images, training=True) + loss_value = loss(logits, labels) + contrib_summary.scalar('loss', loss_value) + contrib_summary.scalar('accuracy', + compute_accuracy(logits, labels)) + grads = tape.gradient(loss_value, model.variables) + optimizer.apply_gradients( + zip(grads, model.variables), global_step=step_counter) + if log_interval and batch % log_interval == 0: + rate = log_interval / (time.time() - start) + print('Step #%d\tLoss: %.6f (%d steps/sec)' % (batch, loss_value, rate)) + start = time.time() + + +def test(model, dataset): + """Perform an evaluation of `model` on the examples from `dataset`.""" + from tensorflow.contrib import summary as contrib_summary # pylint: disable=g-import-not-at-top + avg_loss = tf.keras.metrics.Mean('loss', dtype=tf.float32) + accuracy = tf.keras.metrics.Accuracy('accuracy', dtype=tf.float32) + + for (images, labels) in dataset: + logits = model(images, training=False) + avg_loss.update_state(loss(logits, labels)) + accuracy.update_state( + tf.argmax(logits, axis=1, output_type=tf.int64), + tf.cast(labels, tf.int64)) + print('Test set: Average loss: %.4f, Accuracy: %4f%%\n' % + (avg_loss.result(), 100 * accuracy.result())) + with contrib_summary.always_record_summaries(): + contrib_summary.scalar('loss', avg_loss.result()) + contrib_summary.scalar('accuracy', accuracy.result()) + + +def run_mnist_eager(flags_obj): + """Run MNIST training and eval loop in eager mode. + + Args: + flags_obj: An object containing parsed flag values. + """ + tf.enable_eager_execution() + model_helpers.apply_clean(flags.FLAGS) + + # Automatically determine device and data_format + (device, data_format) = ('/gpu:0', 'channels_first') + if flags_obj.no_gpu or not tf.test.is_gpu_available(): + (device, data_format) = ('/cpu:0', 'channels_last') + # If data_format is defined in FLAGS, overwrite automatically set value. + if flags_obj.data_format is not None: + data_format = flags_obj.data_format + print('Using device %s, and data format %s.' % (device, data_format)) + + # Load the datasets + train_ds = mnist_dataset.train(flags_obj.data_dir).shuffle(60000).batch( + flags_obj.batch_size) + test_ds = mnist_dataset.test(flags_obj.data_dir).batch( + flags_obj.batch_size) + + # Create the model and optimizer + model = mnist.create_model(data_format) + optimizer = tf.train.MomentumOptimizer(flags_obj.lr, flags_obj.momentum) + + # Create file writers for writing TensorBoard summaries. + if flags_obj.output_dir: + # Create directories to which summaries will be written + # tensorboard --logdir= + # can then be used to see the recorded summaries. + train_dir = os.path.join(flags_obj.output_dir, 'train') + test_dir = os.path.join(flags_obj.output_dir, 'eval') + tf.gfile.MakeDirs(flags_obj.output_dir) + else: + train_dir = None + test_dir = None + summary_writer = tf.compat.v2.summary.create_file_writer( + train_dir, flush_millis=10000) + test_summary_writer = tf.compat.v2.summary.create_file_writer( + test_dir, flush_millis=10000, name='test') + + # Create and restore checkpoint (if one exists on the path) + checkpoint_prefix = os.path.join(flags_obj.model_dir, 'ckpt') + step_counter = tf.train.get_or_create_global_step() + checkpoint = tf.train.Checkpoint( + model=model, optimizer=optimizer, step_counter=step_counter) + # Restore variables on creation if a checkpoint exists. + checkpoint.restore(tf.train.latest_checkpoint(flags_obj.model_dir)) + + # Train and evaluate for a set number of epochs. + with tf.device(device): + for _ in range(flags_obj.train_epochs): + start = time.time() + with summary_writer.as_default(): + train(model, optimizer, train_ds, step_counter, + flags_obj.log_interval) + end = time.time() + print('\nTrain time for epoch #%d (%d total steps): %f' % + (checkpoint.save_counter.numpy() + 1, + step_counter.numpy(), + end - start)) + with test_summary_writer.as_default(): + test(model, test_ds) + checkpoint.save(checkpoint_prefix) + + +def define_mnist_eager_flags(): + """Defined flags and defaults for MNIST in eager mode.""" + flags_core.define_base(clean=True, train_epochs=True, export_dir=True, + distribution_strategy=True) + flags_core.define_image() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_integer( + name='log_interval', short_name='li', default=10, + help=flags_core.help_wrap('batches between logging training status')) + + flags.DEFINE_string( + name='output_dir', short_name='od', default=None, + help=flags_core.help_wrap('Directory to write TensorBoard summaries')) + + flags.DEFINE_float(name='learning_rate', short_name='lr', default=0.01, + help=flags_core.help_wrap('Learning rate.')) + + flags.DEFINE_float(name='momentum', short_name='m', default=0.5, + help=flags_core.help_wrap('SGD momentum.')) + + flags.DEFINE_bool(name='no_gpu', short_name='nogpu', default=False, + help=flags_core.help_wrap( + 'disables GPU usage even if a GPU is available')) + + flags_core.set_defaults( + data_dir='/tmp/tensorflow/mnist/input_data', + model_dir='/tmp/tensorflow/mnist/checkpoints/', + batch_size=100, + train_epochs=10, + ) + + +def main(_): + run_mnist_eager(flags.FLAGS) + + +if __name__ == '__main__': + define_mnist_eager_flags() + absl_app.run(main=main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager_test.py new file mode 100644 index 0000000..2fe7e66 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_eager_test.py @@ -0,0 +1,95 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order +from tensorflow.python import eager as tfe # pylint: disable=g-bad-import-order + +from official.r1.mnist import mnist +from official.r1.mnist import mnist_eager +from official.utils.misc import keras_utils + + +def device(): + return '/device:GPU:0' if tfe.context.num_gpus() else '/device:CPU:0' + + +def data_format(): + return 'channels_first' if tfe.context.num_gpus() else 'channels_last' + + +def random_dataset(): + batch_size = 64 + images = tf.random_normal([batch_size, 784]) + labels = tf.random_uniform([batch_size], minval=0, maxval=10, dtype=tf.int32) + return tf.data.Dataset.from_tensors((images, labels)) + + +def train(defun=False): + model = mnist.create_model(data_format()) + if defun: + model.call = tf.function(model.call) + optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) + dataset = random_dataset() + with tf.device(device()): + mnist_eager.train(model, optimizer, dataset, + step_counter=tf.train.get_or_create_global_step()) + + +def evaluate(defun=False): + model = mnist.create_model(data_format()) + dataset = random_dataset() + if defun: + model.call = tf.function(model.call) + with tf.device(device()): + mnist_eager.test(model, dataset) + + +class MNISTTest(tf.test.TestCase): + """Run tests for MNIST eager loop. + + MNIST eager uses contrib and will not work with TF 2.0. All tests are + disabled if using TF 2.0. + """ + + def setUp(self): + if not keras_utils.is_v2_0(): + tf.compat.v1.enable_v2_behavior() + super(MNISTTest, self).setUp() + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_train(self): + train(defun=False) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_evaluate(self): + evaluate(defun=False) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_train_with_defun(self): + train(defun=True) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_evaluate_with_defun(self): + evaluate(defun=True) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_test.py new file mode 100644 index 0000000..207c0d0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_test.py @@ -0,0 +1,147 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import time +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order +from absl import logging +from official.r1.mnist import mnist +from official.utils.misc import keras_utils + +BATCH_SIZE = 100 + + +def dummy_input_fn(): + image = tf.random.uniform([BATCH_SIZE, 784]) + labels = tf.random.uniform([BATCH_SIZE, 1], maxval=9, dtype=tf.int32) + return image, labels + + +def make_estimator(): + data_format = 'channels_last' + if tf.test.is_built_with_cuda(): + data_format = 'channels_first' + return tf.estimator.Estimator( + model_fn=mnist.model_fn, params={ + 'data_format': data_format + }) + + +class Tests(tf.test.TestCase): + """Run tests for MNIST model. + + MNIST uses contrib and will not work with TF 2.0. All tests are disabled if + using TF 2.0. + """ + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_mnist(self): + classifier = make_estimator() + classifier.train(input_fn=dummy_input_fn, steps=2) + eval_results = classifier.evaluate(input_fn=dummy_input_fn, steps=1) + + loss = eval_results['loss'] + global_step = eval_results['global_step'] + accuracy = eval_results['accuracy'] + self.assertEqual(loss.shape, ()) + self.assertEqual(2, global_step) + self.assertEqual(accuracy.shape, ()) + + input_fn = lambda: tf.random.uniform([3, 784]) + predictions_generator = classifier.predict(input_fn) + for _ in range(3): + predictions = next(predictions_generator) + self.assertEqual(predictions['probabilities'].shape, (10,)) + self.assertEqual(predictions['classes'].shape, ()) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def mnist_model_fn_helper(self, mode, multi_gpu=False): + features, labels = dummy_input_fn() + image_count = features.shape[0] + spec = mnist.model_fn(features, labels, mode, { + 'data_format': 'channels_last', + 'multi_gpu': multi_gpu + }) + + if mode == tf.estimator.ModeKeys.PREDICT: + predictions = spec.predictions + self.assertAllEqual(predictions['probabilities'].shape, (image_count, 10)) + self.assertEqual(predictions['probabilities'].dtype, tf.float32) + self.assertAllEqual(predictions['classes'].shape, (image_count,)) + self.assertEqual(predictions['classes'].dtype, tf.int64) + + if mode != tf.estimator.ModeKeys.PREDICT: + loss = spec.loss + self.assertAllEqual(loss.shape, ()) + self.assertEqual(loss.dtype, tf.float32) + + if mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = spec.eval_metric_ops + self.assertAllEqual(eval_metric_ops['accuracy'][0].shape, ()) + self.assertAllEqual(eval_metric_ops['accuracy'][1].shape, ()) + self.assertEqual(eval_metric_ops['accuracy'][0].dtype, tf.float32) + self.assertEqual(eval_metric_ops['accuracy'][1].dtype, tf.float32) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_mnist_model_fn_train_mode(self): + self.mnist_model_fn_helper(tf.estimator.ModeKeys.TRAIN) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_mnist_model_fn_train_mode_multi_gpu(self): + self.mnist_model_fn_helper(tf.estimator.ModeKeys.TRAIN, multi_gpu=True) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_mnist_model_fn_eval_mode(self): + self.mnist_model_fn_helper(tf.estimator.ModeKeys.EVAL) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_mnist_model_fn_predict_mode(self): + self.mnist_model_fn_helper(tf.estimator.ModeKeys.PREDICT) + + +class Benchmarks(tf.test.Benchmark): + """Simple speed benchmarking for MNIST.""" + + def benchmark_train_step_time(self): + classifier = make_estimator() + # Run one step to warmup any use of the GPU. + classifier.train(input_fn=dummy_input_fn, steps=1) + + have_gpu = tf.test.is_gpu_available() + num_steps = 1000 if have_gpu else 100 + name = 'train_step_time_%s' % ('gpu' if have_gpu else 'cpu') + + start = time.time() + classifier.train(input_fn=dummy_input_fn, steps=num_steps) + end = time.time() + + wall_time = (end - start) / num_steps + self.report_benchmark( + iters=num_steps, + wall_time=wall_time, + name=name, + extras={ + 'examples_per_sec': BATCH_SIZE / wall_time + }) + + +if __name__ == '__main__': + logging.set_verbosity(logging.ERROR) + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_tpu.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_tpu.py new file mode 100644 index 0000000..4ca62ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/mnist/mnist_tpu.py @@ -0,0 +1,202 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""MNIST model training using TPUs. + +This program demonstrates training of the convolutional neural network model +defined in mnist.py on Google Cloud TPUs (https://cloud.google.com/tpu/). + +If you are not interested in TPUs, you should ignore this file. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys + +# pylint: disable=g-bad-import-order +from absl import app as absl_app # pylint: disable=unused-import +import tensorflow.compat.v1 as tf +# pylint: enable=g-bad-import-order + +# For open source environment, add grandparent directory for import +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(sys.path[0])))) + +from official.r1.mnist import dataset # pylint: disable=wrong-import-position +from official.r1.mnist import mnist # pylint: disable=wrong-import-position + +# Cloud TPU Cluster Resolver flags +tf.flags.DEFINE_string( + "tpu", default=None, + help="The Cloud TPU to use for training. This should be either the name " + "used when creating the Cloud TPU, or a grpc://ip.address.of.tpu:8470 " + "url.") +tf.flags.DEFINE_string( + "tpu_zone", default=None, + help="[Optional] GCE zone where the Cloud TPU is located in. If not " + "specified, we will attempt to automatically detect the GCE project from " + "metadata.") +tf.flags.DEFINE_string( + "gcp_project", default=None, + help="[Optional] Project name for the Cloud TPU-enabled project. If not " + "specified, we will attempt to automatically detect the GCE project from " + "metadata.") + +# Model specific parameters +tf.flags.DEFINE_string("data_dir", "", + "Path to directory containing the MNIST dataset") +tf.flags.DEFINE_string("model_dir", None, "Estimator model_dir") +tf.flags.DEFINE_integer("batch_size", 1024, + "Mini-batch size for the training. Note that this " + "is the global batch size and not the per-shard batch.") +tf.flags.DEFINE_integer("train_steps", 1000, "Total number of training steps.") +tf.flags.DEFINE_integer("eval_steps", 0, + "Total number of evaluation steps. If `0`, evaluation " + "after training is skipped.") +tf.flags.DEFINE_float("learning_rate", 0.05, "Learning rate.") + +tf.flags.DEFINE_bool("use_tpu", True, "Use TPUs rather than plain CPUs") +tf.flags.DEFINE_bool("enable_predict", True, "Do some predictions at the end") +tf.flags.DEFINE_integer("iterations", 50, + "Number of iterations per TPU training loop.") +tf.flags.DEFINE_integer("num_shards", 8, "Number of shards (TPU chips).") + +FLAGS = tf.flags.FLAGS + + +def metric_fn(labels, logits): + accuracy = tf.metrics.accuracy( + labels=labels, predictions=tf.argmax(logits, axis=1)) + return {"accuracy": accuracy} + + +def model_fn(features, labels, mode, params): + """model_fn constructs the ML model used to predict handwritten digits.""" + + del params + image = features + if isinstance(image, dict): + image = features["image"] + + model = mnist.create_model("channels_last") + + if mode == tf.estimator.ModeKeys.PREDICT: + logits = model(image, training=False) + predictions = { + 'class_ids': tf.argmax(logits, axis=1), + 'probabilities': tf.nn.softmax(logits), + } + return tf.estimator.tpu.TPUEstimatorSpec(mode, predictions=predictions) + + logits = model(image, training=(mode == tf.estimator.ModeKeys.TRAIN)) + loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) + + if mode == tf.estimator.ModeKeys.TRAIN: + learning_rate = tf.train.exponential_decay( + FLAGS.learning_rate, + tf.train.get_global_step(), + decay_steps=100000, + decay_rate=0.96) + optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) + if FLAGS.use_tpu: + optimizer = tf.tpu.CrossShardOptimizer(optimizer) + return tf.estimator.tpu.TPUEstimatorSpec( + mode=mode, + loss=loss, + train_op=optimizer.minimize(loss, tf.train.get_global_step())) + + if mode == tf.estimator.ModeKeys.EVAL: + return tf.estimator.tpu.TPUEstimatorSpec( + mode=mode, loss=loss, eval_metrics=(metric_fn, [labels, logits])) + + +def train_input_fn(params): + """train_input_fn defines the input pipeline used for training.""" + batch_size = params["batch_size"] + data_dir = params["data_dir"] + # Retrieves the batch size for the current shard. The # of shards is + # computed according to the input pipeline deployment. See + # `tf.estimator.tpu.RunConfig` for details. + ds = dataset.train(data_dir).cache().repeat().shuffle( + buffer_size=50000).batch(batch_size, drop_remainder=True) + return ds + + +def eval_input_fn(params): + batch_size = params["batch_size"] + data_dir = params["data_dir"] + ds = dataset.test(data_dir).batch(batch_size, drop_remainder=True) + return ds + + +def predict_input_fn(params): + batch_size = params["batch_size"] + data_dir = params["data_dir"] + # Take out top 10 samples from test data to make the predictions. + ds = dataset.test(data_dir).take(10).batch(batch_size) + return ds + + +def main(argv): + del argv # Unused. + tf.logging.set_verbosity(tf.logging.INFO) + + tpu_cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver( + FLAGS.tpu, + zone=FLAGS.tpu_zone, + project=FLAGS.gcp_project + ) + + run_config = tf.estimator.tpu.RunConfig( + cluster=tpu_cluster_resolver, + model_dir=FLAGS.model_dir, + session_config=tf.ConfigProto( + allow_soft_placement=True, log_device_placement=True), + tpu_config=tf.estimator.tpu.TPUConfig(FLAGS.iterations, FLAGS.num_shards), + ) + + estimator = tf.estimator.tpu.TPUEstimator( + model_fn=model_fn, + use_tpu=FLAGS.use_tpu, + train_batch_size=FLAGS.batch_size, + eval_batch_size=FLAGS.batch_size, + predict_batch_size=FLAGS.batch_size, + params={"data_dir": FLAGS.data_dir}, + config=run_config) + # TPUEstimator.train *requires* a max_steps argument. + estimator.train(input_fn=train_input_fn, max_steps=FLAGS.train_steps) + # TPUEstimator.evaluate *requires* a steps argument. + # Note that the number of examples used during evaluation is + # --eval_steps * --batch_size. + # So if you change --batch_size then change --eval_steps too. + if FLAGS.eval_steps: + estimator.evaluate(input_fn=eval_input_fn, steps=FLAGS.eval_steps) + + # Run prediction on top few samples of test data. + if FLAGS.enable_predict: + predictions = estimator.predict(input_fn=predict_input_fn) + + for pred_dict in predictions: + template = ('Prediction is "{}" ({:.1f}%).') + + class_id = pred_dict['class_ids'] + probability = pred_dict['probabilities'][class_id] + + print(template.format(class_id, 100 * probability)) + + +if __name__ == "__main__": + tf.disable_v2_behavior() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/README.md new file mode 100644 index 0000000..8156d39 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/README.md @@ -0,0 +1,7 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# NCF Estimator implementation + +NCF framework to train and evaluate the NeuMF model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/ncf_estimator_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/ncf_estimator_main.py new file mode 100644 index 0000000..76b9c5a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/ncf/ncf_estimator_main.py @@ -0,0 +1,189 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""NCF framework to train and evaluate the NeuMF model. + +The NeuMF model assembles both MF and MLP models under the NCF framework. Check +`neumf_model.py` for more details about the models. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import contextlib +import heapq +import json +import math +import multiprocessing +import os +import signal +import typing + +# pylint: disable=g-bad-import-order +import numpy as np +from absl import app as absl_app +from absl import flags +from absl import logging +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.recommendation import constants as rconst +from official.recommendation import data_pipeline +from official.recommendation import data_preprocessing +from official.recommendation import movielens +from official.recommendation import ncf_common +from official.recommendation import neumf_model +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.logs import mlperf_helper +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers + + +FLAGS = flags.FLAGS + + +def construct_estimator(model_dir, params): + """Construct either an Estimator for NCF. + + Args: + model_dir: The model directory for the estimator + params: The params dict for the estimator + + Returns: + An Estimator. + """ + distribution = ncf_common.get_v1_distribution_strategy(params) + run_config = tf.estimator.RunConfig(train_distribute=distribution, + eval_distribute=distribution) + model_fn = neumf_model.neumf_model_fn + estimator = tf.estimator.Estimator(model_fn=model_fn, model_dir=model_dir, + config=run_config, params=params) + return estimator + + +def log_and_get_hooks(eval_batch_size): + """Convenience function for hook and logger creation.""" + # Create hooks that log information about the training and metric values + train_hooks = hooks_helper.get_train_hooks( + FLAGS.hooks, + model_dir=FLAGS.model_dir, + batch_size=FLAGS.batch_size, # for ExamplesPerSecondHook + tensors_to_log={"cross_entropy": "cross_entropy"} + ) + run_params = { + "batch_size": FLAGS.batch_size, + "eval_batch_size": eval_batch_size, + "number_factors": FLAGS.num_factors, + "hr_threshold": FLAGS.hr_threshold, + "train_epochs": FLAGS.train_epochs, + } + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info( + model_name="recommendation", + dataset_name=FLAGS.dataset, + run_params=run_params, + test_id=FLAGS.benchmark_test_id) + + return benchmark_logger, train_hooks + + +def main(_): + with logger.benchmark_context(FLAGS), \ + mlperf_helper.LOGGER(FLAGS.output_ml_perf_compliance_logging): + mlperf_helper.set_ncf_root(os.path.split(os.path.abspath(__file__))[0]) + run_ncf(FLAGS) + + +def run_ncf(_): + """Run NCF training and eval loop.""" + params = ncf_common.parse_flags(FLAGS) + + num_users, num_items, num_train_steps, num_eval_steps, producer = ( + ncf_common.get_inputs(params)) + + params["num_users"], params["num_items"] = num_users, num_items + producer.start() + model_helpers.apply_clean(flags.FLAGS) + + estimator = construct_estimator(model_dir=FLAGS.model_dir, params=params) + + benchmark_logger, train_hooks = log_and_get_hooks(params["eval_batch_size"]) + total_training_cycle = FLAGS.train_epochs // FLAGS.epochs_between_evals + + target_reached = False + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.TRAIN_LOOP) + for cycle_index in range(total_training_cycle): + assert FLAGS.epochs_between_evals == 1 or not mlperf_helper.LOGGER.enabled + logging.info("Starting a training cycle: {}/{}".format( + cycle_index + 1, total_training_cycle)) + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.TRAIN_EPOCH, + value=cycle_index) + + train_input_fn = producer.make_input_fn(is_training=True) + estimator.train(input_fn=train_input_fn, hooks=train_hooks, + steps=num_train_steps) + + logging.info("Beginning evaluation.") + eval_input_fn = producer.make_input_fn(is_training=False) + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.EVAL_START, + value=cycle_index) + eval_results = estimator.evaluate(eval_input_fn, steps=num_eval_steps) + logging.info("Evaluation complete.") + + hr = float(eval_results[rconst.HR_KEY]) + ndcg = float(eval_results[rconst.NDCG_KEY]) + loss = float(eval_results["loss"]) + + mlperf_helper.ncf_print( + key=mlperf_helper.TAGS.EVAL_TARGET, + value={"epoch": cycle_index, "value": FLAGS.hr_threshold}) + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.EVAL_ACCURACY, + value={"epoch": cycle_index, "value": hr}) + mlperf_helper.ncf_print( + key=mlperf_helper.TAGS.EVAL_HP_NUM_NEG, + value={"epoch": cycle_index, "value": rconst.NUM_EVAL_NEGATIVES}) + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.EVAL_STOP, value=cycle_index) + + # Benchmark the evaluation results + benchmark_logger.log_evaluation_result(eval_results) + # Log the HR and NDCG results. + logging.info( + "Iteration {}: HR = {:.4f}, NDCG = {:.4f}, Loss = {:.4f}".format( + cycle_index + 1, hr, ndcg, loss)) + + # If some evaluation threshold is met + if model_helpers.past_stop_threshold(FLAGS.hr_threshold, hr): + target_reached = True + break + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.RUN_STOP, + value={"success": target_reached}) + producer.stop_loop() + producer.join() + + # Clear the session explicitly to avoid session delete error + tf.keras.backend.clear_session() + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.RUN_FINAL) + + +if __name__ == "__main__": + logging.set_verbosity(logging.INFO) + ncf_common.define_ncf_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/README.md new file mode 100644 index 0000000..7f70b50 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/README.md @@ -0,0 +1,156 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# ResNet in TensorFlow + +Deep residual networks, or ResNets for short, provided the breakthrough idea of +identity mappings in order to enable training of very deep convolutional neural +networks. This folder contains an implementation of ResNet for the ImageNet +dataset written in TensorFlow. + +See the following papers for more background: + +[1] [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + +[2] [Identity Mappings in Deep Residual Networks](https://arxiv.org/pdf/1603.05027.pdf) by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + +In code, v1 refers to the ResNet defined in [1] but where a stride 2 is used on +the 3x3 conv rather than the first 1x1 in the bottleneck. This change results +in higher and more stable accuracy with less epochs than the original v1 and has +shown to scale to higher batch sizes with minimal degradation in accuracy. +There is no originating paper. The first mention we are aware of was in the +torch version of [ResNetv1](https://github.com/facebook/fb.resnet.torch). Most +popular v1 implementations are this implementation which we call ResNetv1.5. + +In testing we found v1.5 requires ~12% more compute to train and has 6% reduced +throughput for inference compared to ResNetv1. CIFAR-10 ResNet does not use the +bottleneck and is thus the same for v1 as v1.5. + +v2 refers to [2]. The principle difference between the two versions is that v1 +applies batch normalization and activation after convolution, while v2 applies +batch normalization, then activation, and finally convolution. A schematic +comparison is presented in Figure 1 (left) of [2]. + +Please proceed according to which dataset you would like to train/evaluate on: + + +## CIFAR-10 + +### Setup + +You need to have the latest version of TensorFlow installed. +First, make sure [the models folder is in your Python path](/official/#running-the-models); otherwise you may encounter `ImportError: No module named official.resnet`. + +Then, download and extract the CIFAR-10 data from Alex's website, specifying the location with the `--data_dir` flag. Run the following: + +```bash +python cifar10_download_and_extract.py --data_dir +``` + +Then, to train the model: + +```bash +python cifar10_main.py --data_dir /cifar-10-batches-bin --model_dir +``` + +Use `--data_dir` to specify the location of the CIFAR-10 data used in the previous step. There are more flag options as described in `cifar10_main.py`. + +To export a `SavedModel` from the trained checkpoint: + +```bash +python cifar10_main.py --data_dir /cifar-10-batches-bin --model_dir --eval_only --export_dir +``` + +Note: The `` must be present. You might want to run `mkdir ` beforehand. + +The `SavedModel` can then be [loaded](https://www.tensorflow.org/guide/saved_model#loading_a_savedmodel_in_python) in order to use the ResNet for prediction. + + +## ImageNet + +### Setup +To begin, you will need to download the ImageNet dataset and convert it to +TFRecord format. The following [script](https://github.com/tensorflow/tpu/blob/master/tools/datasets/imagenet_to_gcs.py) +and [README](https://github.com/tensorflow/tpu/tree/master/tools/datasets#imagenet_to_gcspy) +provide a few options. + +Once your dataset is ready, you can begin training the model as follows: + +```bash +python imagenet_main.py --data_dir=/path/to/imagenet +``` + +The model will begin training and will automatically evaluate itself on the +validation data roughly once per epoch. + +Note that there are a number of other options you can specify, including +`--model_dir` to choose where to store the model and `--resnet_size` to choose +the model size (options include ResNet-18 through ResNet-200). See +[`resnet_run_loop.py`](resnet_run_loop.py) for the full list of options. + + +## Compute Devices +Training is accomplished using the DistributionStrategies API. (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/distribute/README.md) + +The appropriate distribution strategy is chosen based on the `--num_gpus` flag. +By default this flag is one if TensorFlow is compiled with CUDA, and zero +otherwise. + +num_gpus: ++ 0: Use OneDeviceStrategy and train on CPU. ++ 1: Use OneDeviceStrategy and train on GPU. ++ 2+: Use MirroredStrategy (data parallelism) to distribute a batch between devices. + +### Pre-trained model +You can download pre-trained versions of ResNet-50. Reported accuracies are top-1 single-crop accuracy for the ImageNet validation set. +Models are reported as both checkpoints produced by Estimator during training, and as SavedModels which are more portable. Checkpoints are fragile, +and these are not guaranteed to work with future versions of the code. Both ResNet v1 +and ResNet v2 have been trained in both fp16 and fp32 precision. (Here v1 refers to "v1.5". See the note above.) Furthermore, SavedModels +are generated to accept either tensor or JPG inputs, and with channels_first (NCHW) and channels_last (NHWC) convolutions. NCHW is generally +better for GPUs, while NHWC is generally better for CPUs. See the TensorFlow [performance guide](https://www.tensorflow.org/performance/performance_guide#data_formats) +for more details. + +ResNet-50 v2 (fp32, Accuracy 76.47%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v2_fp32_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v2 (fp16, Accuracy 76.56%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v2_fp16_20180928.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v1 (fp32, Accuracy 76.53%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v1_fp32_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v1 (fp16, Accuracy 76.18%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v1_fp16_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NHWC_jpg.tar.gz) + +### Transfer Learning +You can use a pretrained model to initialize a training process. In addition you are able to freeze all but the final fully connected layers to fine tune your model. Transfer Learning is useful when training on your own small datasets. For a brief look at transfer learning in the context of convolutional neural networks, we recommend reading these [short notes](http://cs231n.github.io/transfer-learning/). + + +To fine tune a pretrained resnet you must make three changes to your training procedure: + +1) Build the exact same model as previously except we change the number of labels in the final classification layer. + +2) Restore all weights from the pre-trained resnet except for the final classification layer; this will get randomly initialized instead. + +3) Freeze earlier layers of the network + +We can perform these three operations by specifying two flags: ```--pretrained_model_checkpoint_path``` and ```--fine_tune```. The first flag is a string that points to the path of a pre-trained resnet model. If this flag is specified, it will load all but the final classification layer. A key thing to note: if both ```--pretrained_model_checkpoint_path``` and a non empty ```model_dir``` directory are passed, the tensorflow estimator will load only the ```model_dir```. For more on this please see [WarmStartSettings](https://www.tensorflow.org/versions/master/api_docs/python/tf/estimator/WarmStartSettings) and [Estimators](https://www.tensorflow.org/guide/estimators). + +The second flag ```--fine_tune``` is a boolean that indicates whether earlier layers of the network should be frozen. You may set this flag to false if you wish to continue training a pre-trained model from a checkpoint. If you set this flag to true, you can train a new classification layer from scratch. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_download_and_extract.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_download_and_extract.py new file mode 100644 index 0000000..a44d042 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_download_and_extract.py @@ -0,0 +1,63 @@ +# Copyright 2015 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Downloads and extracts the binary version of the CIFAR-10 dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import os +import sys +import tarfile + +from six.moves import urllib +import tensorflow as tf + +DATA_URL = 'https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz' + +parser = argparse.ArgumentParser() + +parser.add_argument( + '--data_dir', type=str, default='/tmp/cifar10_data', + help='Directory to download data and extract the tarball') + + +def main(_): + """Download and extract the tarball from Alex's website.""" + if not os.path.exists(FLAGS.data_dir): + os.makedirs(FLAGS.data_dir) + + filename = DATA_URL.split('/')[-1] + filepath = os.path.join(FLAGS.data_dir, filename) + + if not os.path.exists(filepath): + def _progress(count, block_size, total_size): + sys.stdout.write('\r>> Downloading %s %.1f%%' % ( + filename, 100.0 * count * block_size / total_size)) + sys.stdout.flush() + + filepath, _ = urllib.request.urlretrieve(DATA_URL, filepath, _progress) + print() + statinfo = os.stat(filepath) + print('Successfully downloaded', filename, statinfo.st_size, 'bytes.') + + tarfile.open(filepath, 'r:gz').extractall(FLAGS.data_dir) + + +if __name__ == '__main__': + FLAGS, unparsed = parser.parse_known_args() + tf.compat.v1.app.run(argv=[sys.argv[0]] + unparsed) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_main.py new file mode 100644 index 0000000..63b2364 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_main.py @@ -0,0 +1,297 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the CIFAR-10 dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app as absl_app +from absl import flags +from absl import logging +from six.moves import range +import tensorflow as tf + +from official.r1.resnet import resnet_model +from official.r1.resnet import resnet_run_loop +from official.utils.flags import core as flags_core +from official.utils.logs import logger + +HEIGHT = 32 +WIDTH = 32 +NUM_CHANNELS = 3 +_DEFAULT_IMAGE_BYTES = HEIGHT * WIDTH * NUM_CHANNELS +# The record is the image plus a one-byte label +_RECORD_BYTES = _DEFAULT_IMAGE_BYTES + 1 +NUM_CLASSES = 10 +_NUM_DATA_FILES = 5 + +# TODO(tobyboyd): Change to best practice 45K(train)/5K(val)/10K(test) splits. +NUM_IMAGES = { + 'train': 50000, + 'validation': 10000, +} + +DATASET_NAME = 'CIFAR-10' + + +############################################################################### +# Data processing +############################################################################### +def get_filenames(is_training, data_dir): + """Returns a list of filenames.""" + assert tf.io.gfile.exists(data_dir), ( + 'Run cifar10_download_and_extract.py first to download and extract the ' + 'CIFAR-10 data.') + + if is_training: + return [ + os.path.join(data_dir, 'data_batch_%d.bin' % i) + for i in range(1, _NUM_DATA_FILES + 1) + ] + else: + return [os.path.join(data_dir, 'test_batch.bin')] + + +def parse_record(raw_record, is_training, dtype): + """Parse CIFAR-10 image and label from a raw record.""" + # Convert bytes to a vector of uint8 that is record_bytes long. + record_vector = tf.io.decode_raw(raw_record, tf.uint8) + + # The first byte represents the label, which we convert from uint8 to int32 + # and then to one-hot. + label = tf.cast(record_vector[0], tf.int32) + + # The remaining bytes after the label represent the image, which we reshape + # from [depth * height * width] to [depth, height, width]. + depth_major = tf.reshape(record_vector[1:_RECORD_BYTES], + [NUM_CHANNELS, HEIGHT, WIDTH]) + + # Convert from [depth, height, width] to [height, width, depth], and cast as + # float32. + image = tf.cast(tf.transpose(a=depth_major, perm=[1, 2, 0]), tf.float32) + + image = preprocess_image(image, is_training) + image = tf.cast(image, dtype) + + return image, label + + +def preprocess_image(image, is_training): + """Preprocess a single image of layout [height, width, depth].""" + if is_training: + # Resize the image to add four extra pixels on each side. + image = tf.image.resize_with_crop_or_pad( + image, HEIGHT + 8, WIDTH + 8) + + # Randomly crop a [HEIGHT, WIDTH] section of the image. + image = tf.image.random_crop(image, [HEIGHT, WIDTH, NUM_CHANNELS]) + + # Randomly flip the image horizontally. + image = tf.image.random_flip_left_right(image) + + # Subtract off the mean and divide by the variance of the pixels. + image = tf.image.per_image_standardization(image) + return image + + +def input_fn(is_training, + data_dir, + batch_size, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + parse_record_fn=parse_record, + input_context=None, + drop_remainder=False): + """Input function which provides batches for train or eval. + + Args: + is_training: A boolean denoting whether the input is for training. + data_dir: The directory containing the input data. + batch_size: The number of samples per batch. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features + datasets_num_private_threads: Number of private threads for tf.data. + parse_record_fn: Function to use for parsing the records. + input_context: A `tf.distribute.InputContext` object passed in by + `tf.distribute.Strategy`. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + + Returns: + A dataset that can be used for iteration. + """ + filenames = get_filenames(is_training, data_dir) + dataset = tf.data.FixedLengthRecordDataset(filenames, _RECORD_BYTES) + + if input_context: + logging.info( + 'Sharding the dataset: input_pipeline_id=%d num_input_pipelines=%d', + input_context.input_pipeline_id, input_context.num_input_pipelines) + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + return resnet_run_loop.process_record_dataset( + dataset=dataset, + is_training=is_training, + batch_size=batch_size, + shuffle_buffer=NUM_IMAGES['train'], + parse_record_fn=parse_record_fn, + num_epochs=num_epochs, + dtype=dtype, + datasets_num_private_threads=datasets_num_private_threads, + drop_remainder=drop_remainder + ) + + +def get_synth_input_fn(dtype): + return resnet_run_loop.get_synth_input_fn( + HEIGHT, WIDTH, NUM_CHANNELS, NUM_CLASSES, dtype=dtype) + + +############################################################################### +# Running the model +############################################################################### +class Cifar10Model(resnet_model.Model): + """Model class with appropriate defaults for CIFAR-10 data.""" + + def __init__(self, resnet_size, data_format=None, num_classes=NUM_CLASSES, + resnet_version=resnet_model.DEFAULT_VERSION, + dtype=resnet_model.DEFAULT_DTYPE): + """These are the parameters that work for CIFAR-10 data. + + Args: + resnet_size: The number of convolutional layers needed in the model. + data_format: Either 'channels_first' or 'channels_last', specifying which + data format to use when setting up the model. + num_classes: The number of output classes needed from the model. This + enables users to extend the same model to their own datasets. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + dtype: The TensorFlow dtype to use for calculations. + + Raises: + ValueError: if invalid resnet_size is chosen + """ + if resnet_size % 6 != 2: + raise ValueError('resnet_size must be 6n + 2:', resnet_size) + + num_blocks = (resnet_size - 2) // 6 + + super(Cifar10Model, self).__init__( + resnet_size=resnet_size, + bottleneck=False, + num_classes=num_classes, + num_filters=16, + kernel_size=3, + conv_stride=1, + first_pool_size=None, + first_pool_stride=None, + block_sizes=[num_blocks] * 3, + block_strides=[1, 2, 2], + resnet_version=resnet_version, + data_format=data_format, + dtype=dtype + ) + + +def cifar10_model_fn(features, labels, mode, params): + """Model function for CIFAR-10.""" + features = tf.reshape(features, [-1, HEIGHT, WIDTH, NUM_CHANNELS]) + # Learning rate schedule follows arXiv:1512.03385 for ResNet-56 and under. + learning_rate_fn = resnet_run_loop.learning_rate_with_decay( + batch_size=params['batch_size'] * params.get('num_workers', 1), + batch_denom=128, num_images=NUM_IMAGES['train'], + boundary_epochs=[91, 136, 182], decay_rates=[1, 0.1, 0.01, 0.001]) + + # Weight decay of 2e-4 diverges from 1e-4 decay used in the ResNet paper + # and seems more stable in testing. The difference was nominal for ResNet-56. + weight_decay = 2e-4 + + # Empirical testing showed that including batch_normalization variables + # in the calculation of regularized loss helped validation accuracy + # for the CIFAR-10 dataset, perhaps because the regularization prevents + # overfitting on the small data set. We therefore include all vars when + # regularizing and computing loss during training. + def loss_filter_fn(_): + return True + + return resnet_run_loop.resnet_model_fn( + features=features, + labels=labels, + mode=mode, + model_class=Cifar10Model, + resnet_size=params['resnet_size'], + weight_decay=weight_decay, + learning_rate_fn=learning_rate_fn, + momentum=0.9, + data_format=params['data_format'], + resnet_version=params['resnet_version'], + loss_scale=params['loss_scale'], + loss_filter_fn=loss_filter_fn, + dtype=params['dtype'], + fine_tune=params['fine_tune'] + ) + + +def define_cifar_flags(): + resnet_run_loop.define_resnet_flags() + flags.adopt_module_key_flags(resnet_run_loop) + flags_core.set_defaults(data_dir='/tmp/cifar10_data/cifar-10-batches-bin', + model_dir='/tmp/cifar10_model', + resnet_size='56', + train_epochs=182, + epochs_between_evals=10, + batch_size=128, + image_bytes_as_serving_input=False) + + +def run_cifar(flags_obj): + """Run ResNet CIFAR-10 training and eval loop. + + Args: + flags_obj: An object containing parsed flag values. + + Returns: + Dictionary of results. Including final accuracy. + """ + if flags_obj.image_bytes_as_serving_input: + logging.fatal( + '--image_bytes_as_serving_input cannot be set to True for CIFAR. ' + 'This flag is only applicable to ImageNet.') + return + + input_function = (flags_obj.use_synthetic_data and + get_synth_input_fn(flags_core.get_tf_dtype(flags_obj)) or + input_fn) + result = resnet_run_loop.resnet_main( + flags_obj, cifar10_model_fn, input_function, DATASET_NAME, + shape=[HEIGHT, WIDTH, NUM_CHANNELS]) + + return result + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + run_cifar(flags.FLAGS) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_cifar_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_test.py new file mode 100644 index 0000000..827cb0c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/cifar10_test.py @@ -0,0 +1,185 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from tempfile import mkstemp + +from absl import logging +import numpy as np +import tensorflow as tf + +from official.r1.resnet import cifar10_main +from official.utils.misc import keras_utils +from official.utils.testing import integration + +logging.set_verbosity(logging.ERROR) + +_BATCH_SIZE = 128 +_HEIGHT = 32 +_WIDTH = 32 +_NUM_CHANNELS = 3 + + +class BaseTest(tf.test.TestCase): + """Tests for the Cifar10 version of Resnet. + """ + + _num_validation_images = None + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BaseTest, cls).setUpClass() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + cifar10_main.define_cifar_flags() + + def setUp(self): + super(BaseTest, self).setUp() + self._num_validation_images = cifar10_main.NUM_IMAGES['validation'] + cifar10_main.NUM_IMAGES['validation'] = 4 + + def tearDown(self): + super(BaseTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + cifar10_main.NUM_IMAGES['validation'] = self._num_validation_images + + def test_dataset_input_fn(self): + fake_data = bytearray() + fake_data.append(7) + for i in range(_NUM_CHANNELS): + for _ in range(_HEIGHT * _WIDTH): + fake_data.append(i) + + _, filename = mkstemp(dir=self.get_temp_dir()) + data_file = open(filename, 'wb') + data_file.write(fake_data) + data_file.close() + + fake_dataset = tf.data.FixedLengthRecordDataset( + filename, cifar10_main._RECORD_BYTES) # pylint: disable=protected-access + fake_dataset = fake_dataset.map( + lambda val: cifar10_main.parse_record(val, False, tf.float32)) + image, label = tf.compat.v1.data.make_one_shot_iterator( + fake_dataset).get_next() + + self.assertAllEqual(label.shape, ()) + self.assertAllEqual(image.shape, (_HEIGHT, _WIDTH, _NUM_CHANNELS)) + + with self.session() as sess: + image, label = sess.run([image, label]) + + self.assertEqual(label, 7) + + for row in image: + for pixel in row: + self.assertAllClose(pixel, np.array([-1.225, 0., 1.225]), rtol=1e-3) + + def cifar10_model_fn_helper(self, mode, resnet_version, dtype): + input_fn = cifar10_main.get_synth_input_fn(dtype) + dataset = input_fn(True, '', _BATCH_SIZE) + iterator = tf.compat.v1.data.make_initializable_iterator(dataset) + features, labels = iterator.get_next() + spec = cifar10_main.cifar10_model_fn( + features, labels, mode, { + 'dtype': dtype, + 'resnet_size': 32, + 'data_format': 'channels_last', + 'batch_size': _BATCH_SIZE, + 'resnet_version': resnet_version, + 'loss_scale': 128 if dtype == tf.float16 else 1, + 'fine_tune': False, + }) + + predictions = spec.predictions + self.assertAllEqual(predictions['probabilities'].shape, + (_BATCH_SIZE, 10)) + self.assertEqual(predictions['probabilities'].dtype, tf.float32) + self.assertAllEqual(predictions['classes'].shape, (_BATCH_SIZE,)) + self.assertEqual(predictions['classes'].dtype, tf.int64) + + if mode != tf.estimator.ModeKeys.PREDICT: + loss = spec.loss + self.assertAllEqual(loss.shape, ()) + self.assertEqual(loss.dtype, tf.float32) + + if mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = spec.eval_metric_ops + self.assertAllEqual(eval_metric_ops['accuracy'][0].shape, ()) + self.assertAllEqual(eval_metric_ops['accuracy'][1].shape, ()) + self.assertEqual(eval_metric_ops['accuracy'][0].dtype, tf.float32) + self.assertEqual(eval_metric_ops['accuracy'][1].dtype, tf.float32) + + def test_cifar10_model_fn_train_mode_v1(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=1, + dtype=tf.float32) + + def test_cifar10_model_fn_trainmode__v2(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=2, + dtype=tf.float32) + + def test_cifar10_model_fn_eval_mode_v1(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=1, + dtype=tf.float32) + + def test_cifar10_model_fn_eval_mode_v2(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=2, + dtype=tf.float32) + + def test_cifar10_model_fn_predict_mode_v1(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.PREDICT, + resnet_version=1, dtype=tf.float32) + + def test_cifar10_model_fn_predict_mode_v2(self): + self.cifar10_model_fn_helper(tf.estimator.ModeKeys.PREDICT, + resnet_version=2, dtype=tf.float32) + + def _test_cifar10model_shape(self, resnet_version): + batch_size = 135 + num_classes = 246 + + model = cifar10_main.Cifar10Model(32, data_format='channels_last', + num_classes=num_classes, + resnet_version=resnet_version) + fake_input = tf.random.uniform([batch_size, _HEIGHT, _WIDTH, _NUM_CHANNELS]) + output = model(fake_input, training=True) + + self.assertAllEqual(output.shape, (batch_size, num_classes)) + + def test_cifar10model_shape_v1(self): + self._test_cifar10model_shape(resnet_version=1) + + def test_cifar10model_shape_v2(self): + self._test_cifar10model_shape(resnet_version=2) + + def test_cifar10_end_to_end_synthetic_v1(self): + integration.run_synthetic( + main=cifar10_main.run_cifar, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + def test_cifar10_end_to_end_synthetic_v2(self): + integration.run_synthetic( + main=cifar10_main.run_cifar, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/estimator_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/estimator_benchmark.py new file mode 100644 index 0000000..eef3ea4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/estimator_benchmark.py @@ -0,0 +1,500 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Estimator benchmarks and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +from absl import flags +from absl import logging +from absl.testing import flagsaver +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.r1.resnet import cifar10_main as cifar_main +from official.r1.resnet import imagenet_main +from official.utils.flags import core as flags_core +from official.utils.logs import hooks + +IMAGENET_DATA_DIR_NAME = 'imagenet' +CIFAR_DATA_DIR_NAME = 'cifar-10-batches-bin' +FLAGS = flags.FLAGS + + +class EstimatorBenchmark(tf.test.Benchmark): + """Base class to hold methods common to test classes in the module. + + Code under test for Estimator models (ResNet50 and 56) report mostly the + same data and require the same FLAG setup. + """ + + local_flags = None + + def __init__(self, output_dir=None, default_flags=None, flag_methods=None): + if not output_dir: + output_dir = '/tmp' + self.output_dir = output_dir + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + + def _get_model_dir(self, folder_name): + """Returns directory to store info, e.g. saved model and event log.""" + return os.path.join(self.output_dir, folder_name) + + def _setup(self): + """Sets up and resets flags before each test.""" + logging.set_verbosity(logging.INFO) + if EstimatorBenchmark.local_flags is None: + for flag_method in self.flag_methods: + flag_method() + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + # Overrides flag values with defaults for the class of tests. + for k, v in self.default_flags.items(): + setattr(FLAGS, k, v) + saved_flag_values = flagsaver.save_flag_values() + EstimatorBenchmark.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(EstimatorBenchmark.local_flags) + + def _report_benchmark(self, + stats, + wall_time_sec, + top_1_max=None, + top_1_min=None): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from estimator models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + top_1_max: highest passing level for top_1 accuracy. + top_1_min: lowest passing level for top_1 accuracy. + """ + + examples_per_sec_hook = None + for hook in stats['train_hooks']: + if isinstance(hook, hooks.ExamplesPerSecondHook): + examples_per_sec_hook = hook + break + + eval_results = stats['eval_results'] + metrics = [] + if 'accuracy' in eval_results: + metrics.append({'name': 'accuracy_top_1', + 'value': float(eval_results['accuracy']), + 'min_value': top_1_min, + 'max_value': top_1_max}) + if 'accuracy_top_5' in eval_results: + metrics.append({'name': 'accuracy_top_5', + 'value': float(eval_results['accuracy_top_5'])}) + + if examples_per_sec_hook: + exp_per_second_list = examples_per_sec_hook.current_examples_per_sec_list + # ExamplesPerSecondHook skips the first 10 steps. + exp_per_sec = sum(exp_per_second_list) / (len(exp_per_second_list)) + metrics.append({'name': 'exp_per_second', + 'value': exp_per_sec}) + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=eval_results.get('global_step', None), + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class Resnet50EstimatorAccuracy(EstimatorBenchmark): + """Benchmark accuracy tests for ResNet50 w/ Estimator.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """Benchmark accuracy tests for ResNet50 w/ Estimator. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [imagenet_main.define_imagenet_flags] + + self.data_dir = os.path.join(root_data_dir, IMAGENET_DATA_DIR_NAME) + super(Resnet50EstimatorAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def benchmark_graph_8_gpu(self): + """Test 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_8_gpu') + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu(self): + """Test FP16 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu') + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_8_gpu(self): + """Test FP16 graph rewrite 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_8_gpu') + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.run_imagenet(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + self._report_benchmark(stats, + wall_time_sec, + top_1_min=0.762, + top_1_max=0.766) + + +class Resnet50EstimatorBenchmarkBase(EstimatorBenchmark): + """Base class for benchmarks for ResNet50 using Estimator.""" + local_flags = None + + def __init__(self, output_dir=None, default_flags=None): + flag_methods = [imagenet_main.define_imagenet_flags] + + super(Resnet50EstimatorBenchmarkBase, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + flag_methods=flag_methods) + + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.run_imagenet(FLAGS) + wall_time_sec = time.time() - start_time_sec + print(stats) + # Remove values to skip triggering accuracy check. + stats['eval_results'].pop('accuracy', None) + stats['eval_results'].pop('accuracy_top_5', None) + + self._report_benchmark(stats, wall_time_sec) + + +class Resnet50EstimatorBenchmark(Resnet50EstimatorBenchmarkBase): + """Benchmarks for ResNet50 using Estimator with 1 worker.""" + + def __init__(self, output_dir=None, default_flags=None): + super(Resnet50EstimatorBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags) + + def benchmark_graph_fp16_1_gpu(self): + """Benchmarks graph fp16 1 gpu.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu') + FLAGS.batch_size = 128 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_1_gpu_tweaked(self): + """Benchmarks graph fp16 1 gpu tweaked.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu_tweaked') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_1_gpu_tweaked(self): + """Benchmarks graph fp16 graph rewrite 1 gpu tweaked.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_1_gpu_tweaked') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_1_gpu(self): + """Benchmarks graph 1 gpu.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + FLAGS.batch_size = 128 + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_8_gpu(self): + """Benchmarks graph 8 gpus.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_8_gpu') + FLAGS.batch_size = 128*8 + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu(self): + """Benchmarks graph fp16 8 gpus.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu_tweaked(self): + """Benchmarks graph fp16 8 gpus tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_8_gpu_tweaked(self): + """Benchmarks graph fp16 graph rewrite 8 gpus tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_8_gpu_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + +class Resnet50EstimatorBenchmarkSynth(Resnet50EstimatorBenchmark): + """Resnet50 synthetic benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['use_synthetic_data'] = True + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50EstimatorBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50EstimatorBenchmarkReal(Resnet50EstimatorBenchmark): + """Resnet50 real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['data_dir'] = os.path.join(root_data_dir, IMAGENET_DATA_DIR_NAME) + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50EstimatorBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50MultiWorkerEstimatorBenchmark(Resnet50EstimatorBenchmarkBase): + """Benchmarks for ResNet50 using Estimator with multiple workers.""" + + def __init__(self, output_dir=None, default_flags=None): + super(Resnet50MultiWorkerEstimatorBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags) + + def benchmark_graph_fp16_8_gpu_ring_tweaked(self): + """Benchmarks graph fp16 8 gpus with ring collective tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.all_reduce_alg = 'ring' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + folder_name='benchmark_graph_fp16_8_gpu_ring_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu_nccl_tweaked(self): + """Benchmarks graph fp16 8 gpus with nccl collective tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.all_reduce_alg = 'nccl' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + folder_name='benchmark_graph_fp16_8_gpu_nccl_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + +class Resnet50MultiWorkerEstimatorBenchmarkSynth( + Resnet50MultiWorkerEstimatorBenchmark): + """ResNet50, multi-worker, Estimator, synthetic data.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['use_synthetic_data'] = True + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50MultiWorkerEstimatorBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet56EstimatorAccuracy(EstimatorBenchmark): + """Accuracy tests for Estimator ResNet56.""" + + local_flags = None + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [cifar_main.define_cifar_flags] + + self.data_dir = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME) + super(Resnet56EstimatorAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def benchmark_graph_1_gpu(self): + """Test layers model with Estimator and distribution strategies.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_1_gpu(self): + """Test layers FP16 model with Estimator and distribution strategies.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp16' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_2_gpu(self): + """Test layers model with Estimator and dist_strat. 2 GPUs.""" + self._setup() + flags.FLAGS.num_gpus = 2 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_2_gpu(self): + """Test layers FP16 model with Estimator and dist_strat. 2 GPUs.""" + self._setup() + flags.FLAGS.num_gpus = 2 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_2_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp16' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def unit_test(self): + """A lightweight test that can finish quickly.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 1 + flags.FLAGS.model_dir = self._get_model_dir('unit_test') + flags.FLAGS.resnet_size = 8 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def _run_and_report_benchmark(self): + """Executes benchmark and reports result.""" + start_time_sec = time.time() + stats = cifar_main.run_cifar(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + self._report_benchmark(stats, + wall_time_sec, + top_1_min=0.926, + top_1_max=0.938) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/gpu_train.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/gpu_train.sh new file mode 100644 index 0000000..7fe2e53 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/gpu_train.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 + +nohup python imagenet_main.py \ +--resnet_size=101 \ +--batch_size=1024 \ +--num_gpus=8 \ +--dtype=fp32 \ +--train_epochs=90 \ +--epochs_between_evals=5 \ +--hooks=ExamplesPerSecondHook \ +--data_dir=/home/hiscv/dataset/imagenet_TF_record \ +--model_dir=./model_dir > train.log & diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_main.py new file mode 100644 index 0000000..c665f3f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_main.py @@ -0,0 +1,471 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the ImageNet dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import datetime +import numpy as np + +from absl import app as absl_app +from absl import flags +from absl import logging +from six.moves import range +import tensorflow as tf +import shutil +import random + +sys.path.append(os.path.dirname(os.path.realpath(__file__)) + '/../../../') +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../../../../../../../utils/atlasboost')) +flags.DEFINE_integer('device_count', 1, 'number of device') + +from official.r1.resnet import imagenet_preprocessing +from official.r1.resnet import resnet_model +from official.r1.resnet import resnet_run_loop +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +############## npu modify begin ############# +from npu_bridge.estimator import npu_ops +from hccl.manage.api import get_local_rank_id +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +from tensorflow.core.protobuf import rewriter_config_pb2 + +############## npu modify end ############### + +DEFAULT_IMAGE_SIZE = 224 +NUM_CHANNELS = 3 +NUM_CLASSES = 1001 + +NUM_IMAGES = { + 'train': 1281167, + 'validation': 50000, +} + +_NUM_TRAIN_FILES = 1024 +_SHUFFLE_BUFFER = 10000 + +DATASET_NAME = 'ImageNet' + + +############################################################################### +# Data processing +############################################################################### +def get_filenames(is_training, data_dir, test_mode=False): + """Return filenames for dataset.""" + if test_mode == True: + tf.compat.v1.logging.info('test mode, data_dir is : %s', data_dir) + return [ + os.path.join(data_dir, i) + for i in os.listdir(data_dir)] + elif is_training: + return [ + os.path.join(data_dir, 'train-%05d-of-01024' % i) + for i in range(_NUM_TRAIN_FILES)] + else: + return [ + os.path.join(data_dir, 'validation-%05d-of-00128' % i) + for i in range(128)] + + +def _parse_example_proto(example_serialized): + """Parses an Example proto containing a training example of an image. + + The output of the build_image_data.py image preprocessing script is a dataset + containing serialized Example protocol buffers. Each Example proto contains + the following fields (values are included as examples): + + image/height: 462 + image/width: 581 + image/colorspace: 'RGB' + image/channels: 3 + image/class/label: 615 + image/class/synset: 'n03623198' + image/class/text: 'knee pad' + image/object/bbox/xmin: 0.1 + image/object/bbox/xmax: 0.9 + image/object/bbox/ymin: 0.2 + image/object/bbox/ymax: 0.6 + image/object/bbox/label: 615 + image/format: 'JPEG' + image/filename: 'ILSVRC2012_val_00041207.JPEG' + image/encoded: + + Args: + example_serialized: scalar Tensor tf.string containing a serialized + Example protocol buffer. + + Returns: + image_buffer: Tensor tf.string containing the contents of a JPEG file. + label: Tensor tf.int32 containing the label. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + """ + # Dense features in Example proto. + feature_map = { + 'image/encoded': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.io.FixedLenFeature([], dtype=tf.int64, + default_value=-1), + 'image/class/text': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.io.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.io.parse_single_example(serialized=example_serialized, + features=feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(a=bbox, perm=[0, 2, 1]) + + return features['image/encoded'], label, bbox + + +def parse_record(raw_record, is_training, dtype): + """Parses a record containing a training example of an image. + + The input record is parsed into a label and image, and the image is passed + through preprocessing steps (cropping, flipping, and so on). + + Args: + raw_record: scalar Tensor tf.string containing a serialized + Example protocol buffer. + is_training: A boolean denoting whether the input is for training. + dtype: data type to use for images/features. + + Returns: + Tuple with processed image tensor and one-hot-encoded label tensor. + """ + image_buffer, label, bbox = _parse_example_proto(raw_record) + # add by wx933141 + # resnet_dedicated_log.logger1.info("namespace:%s,time_ms:%d, event_type:pre_process_event,root_dir:%s" % ()) + # resnet_dedicated_log.logger1.info("namespace:%s,time_ms:%d,event_type:init_start, root_dir:%s" % ()) + image = imagenet_preprocessing.preprocess_image( + image_buffer=image_buffer, + bbox=bbox, + output_height=DEFAULT_IMAGE_SIZE, + output_width=DEFAULT_IMAGE_SIZE, + num_channels=NUM_CHANNELS, + is_training=is_training) + image = tf.cast(image, dtype) + # resnet_dedicated_log.logger1.info("namespace:%s,time_ms:%d,event_type:init_stop, root_dir:%s" % (resnet_dedicated_log.work_num, resnet_dedicated_log.datatime, resnet_dedicated_log.root_dir)) + return image, label + + +def input_fn(is_training, + data_dir, + batch_size, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + parse_record_fn=parse_record, + input_context=None, + drop_remainder=False, + tf_data_experimental_slack=False, + + rank_size=None, + rank_id=None, + + test_mode=False, + + ): + """Input function which provides batches for train or eval. + + Args: + is_training: A boolean denoting whether the input is for training. + data_dir: The directory containing the input data. + batch_size: The number of samples per batch. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features + datasets_num_private_threads: Number of private threads for tf.data. + parse_record_fn: Function to use for parsing the records. + input_context: A `tf.distribute.InputContext` object passed in by + `tf.distribute.Strategy`. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + A dataset that can be used for iteration. + """ + filenames = get_filenames(is_training, data_dir, test_mode=test_mode) + dataset = tf.data.Dataset.from_tensor_slices(filenames) + + if input_context and not test_mode: + ############## npu modify begin ############# + dataset = dataset.shard(rank_size, rank_id) + ############## npu modify end ############### + + if is_training and not test_mode: + # Shuffle the input files + dataset = dataset.shuffle(buffer_size=_NUM_TRAIN_FILES) + + # Convert to individual records. + # cycle_length = 10 means that up to 10 files will be read and deserialized in + # parallel. You may want to increase this number if you have a large number of + # CPU cores. + dataset = dataset.interleave( + tf.data.TFRecordDataset, + cycle_length=10, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + return resnet_run_loop.process_record_dataset( + dataset=dataset, + is_training=is_training, + batch_size=batch_size, + shuffle_buffer=_SHUFFLE_BUFFER, + parse_record_fn=parse_record_fn, + num_epochs=num_epochs, + dtype=dtype, + datasets_num_private_threads=datasets_num_private_threads, + drop_remainder=drop_remainder, + tf_data_experimental_slack=tf_data_experimental_slack, + test_mode=test_mode, + ) + + +def get_synth_input_fn(dtype): + return resnet_run_loop.get_synth_input_fn( + DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE, NUM_CHANNELS, NUM_CLASSES, + dtype=dtype) + + +############################################################################### +# Running the model +############################################################################### +class ImagenetModel(resnet_model.Model): + """Model class with appropriate defaults for Imagenet data.""" + + def __init__(self, resnet_size, data_format=None, num_classes=NUM_CLASSES, + resnet_version=resnet_model.DEFAULT_VERSION, + dtype=resnet_model.DEFAULT_DTYPE): + """These are the parameters that work for Imagenet data. + + Args: + resnet_size: The number of convolutional layers needed in the model. + data_format: Either 'channels_first' or 'channels_last', specifying which + data format to use when setting up the model. + num_classes: The number of output classes needed from the model. This + enables users to extend the same model to their own datasets. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + dtype: The TensorFlow dtype to use for calculations. + """ + + # For bigger models, we want to use "bottleneck" layers + if resnet_size < 50: + bottleneck = False + else: + bottleneck = True + + super(ImagenetModel, self).__init__( + resnet_size=resnet_size, + bottleneck=bottleneck, + num_classes=num_classes, + num_filters=64, + kernel_size=7, + conv_stride=2, + first_pool_size=3, + first_pool_stride=2, + block_sizes=_get_block_sizes(resnet_size), + block_strides=[1, 2, 2, 2], + resnet_version=resnet_version, + data_format=data_format, + dtype=dtype + ) + + +def _get_block_sizes(resnet_size): + """Retrieve the size of each block_layer in the ResNet model. + + The number of block layers used for the Resnet model varies according + to the size of the model. This helper grabs the layer set we want, throwing + an error if a non-standard size has been selected. + + Args: + resnet_size: The number of convolutional layers needed in the model. + + Returns: + A list of block sizes to use in building the model. + + Raises: + KeyError: if invalid resnet_size is received. + """ + choices = { + 18: [2, 2, 2, 2], + 34: [3, 4, 6, 3], + 50: [3, 4, 6, 3], + 101: [3, 4, 23, 3], + 152: [3, 8, 36, 3], + 200: [3, 24, 36, 3] + } + + try: + return choices[resnet_size] + except KeyError: + err = ('Could not find layers for selected Resnet size.\n' + 'Size received: {}; sizes allowed: {}.'.format( + resnet_size, list(choices.keys()))) + raise ValueError(err) + + +def imagenet_model_fn(features, labels, mode, params): + """Our model_fn for ResNet to be used with our Estimator.""" + + # Warmup and higher lr may not be valid for fine tuning with small batches + # and smaller numbers of training images. + if params['fine_tune']: + warmup = False + base_lr = .1 + else: + warmup = True + base_lr = .128 + + ############## npu modify begin ############# + # For NPU lr setting + if params['base_lr'] != 0: + base_lr = params['base_lr'] + ############## npu modify end ############### + + learning_rate_fn = resnet_run_loop.learning_rate_with_decay( + batch_size=params['num_gpus'] * params['batch_size'], + batch_denom=256, num_images=NUM_IMAGES['train'], + boundary_epochs=[30, 60, 80, 90], decay_rates=[1, 0.1, 0.01, 0.001, 1e-4], + warmup=warmup, base_lr=base_lr, + cosine_lr=params['cosine_lr'], train_epochs=params['train_epochs'], + ) + + return resnet_run_loop.resnet_model_fn( + features=features, + labels=labels, + mode=mode, + model_class=ImagenetModel, + resnet_size=params['resnet_size'], + weight_decay=flags.FLAGS.weight_decay, + learning_rate_fn=learning_rate_fn, + momentum=0.9, + data_format=params['data_format'], + resnet_version=params['resnet_version'], + loss_scale=params['loss_scale'], + loss_filter_fn=None, + dtype=params['dtype'], + fine_tune=params['fine_tune'], + label_smoothing=flags.FLAGS.label_smoothing + ) + + +def define_imagenet_flags(): + resnet_run_loop.define_resnet_flags( + resnet_size_choices=['18', '34', '50', '101', '152', '200'], + dynamic_loss_scale=True, + fp16_implementation=True) + flags.adopt_module_key_flags(resnet_run_loop) + flags_core.set_defaults(train_epochs=90) + + +def run_imagenet(flags_obj): + """Run ResNet ImageNet training and eval loop. + + Args: + flags_obj: An object containing parsed flag values. + + Returns: + Dict of results of the run. Contains the keys `eval_results` and + `train_hooks`. `eval_results` contains accuracy (top_1) and + accuracy_top_5. `train_hooks` is a list the instances of hooks used during + training. + """ + if flags_obj.random_seed >= 0: + SEED = flags_obj.random_seed + else: + SEED = 0 + os.environ['PYTHONHASHSEED'] = str(SEED) + random.seed(SEED) + tf.compat.v1.set_random_seed(SEED) + np.random.seed(SEED) + tf.compat.v1.logging.info('setting random_seed: %d', SEED) + + if flags_obj.use_synthetic_data == True: + tf.compat.v1.logging.info('using synthetic data.') + input_function = get_synth_input_fn(flags_core.get_tf_dtype(flags_obj)) + else: + input_function = input_fn + result = resnet_run_loop.resnet_main( + flags_obj, imagenet_model_fn, input_function, DATASET_NAME, NUM_IMAGES, + shape=[DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE, NUM_CHANNELS]) + + return result + + + +def main(_): + ############## npu modify begin ############# + # Init NPU ,then can call HCCL Interface + init_sess, npu_init = resnet_run_loop.init_npu() + init_sess.run(npu_init) + ############## npu modify end ############### + + with logger.benchmark_context(flags.FLAGS): + flags.FLAGS.model_dir = os.getenv('MODEL_CKPT_PATH') + run_imagenet(flags.FLAGS) + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.128, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + cluster_device_id = None + logging.set_verbosity(logging.INFO) + define_imagenet_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py new file mode 100644 index 0000000..891b58a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py @@ -0,0 +1,262 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images. + +Training images are sampled using the provided bounding boxes, and subsequently +cropped to the sampled bounding box. Images are additionally flipped randomly, +then resized to the target output size (without aspect-ratio preservation). + +Images used during evaluation are resized (with aspect-ratio preservation) and +centrally cropped. + +All images undergo mean color subtraction. + +Note that these steps are colloquially referred to as "ResNet preprocessing," +and they differ from "VGG preprocessing," which does not use bounding boxes +and instead does an aspect-preserving resize followed by random crop during +training. (These both differ from "Inception preprocessing," which introduces +color distortion steps.) + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +_R_MEAN = 123.68 +_G_MEAN = 116.78 +_B_MEAN = 103.94 +_CHANNEL_MEANS = [_R_MEAN, _G_MEAN, _B_MEAN] + +# The lower bound for the smallest side of the image for aspect-preserving +# resizing. For example, if an image is 500 x 1000, it will be resized to +# _RESIZE_MIN x (_RESIZE_MIN * 2). +_RESIZE_MIN = 256 + + +def _decode_crop_and_flip(image_buffer, bbox, num_channels): + """Crops the given image to a random part of the image, and randomly flips. + + We use the fused decode_and_crop op, which performs better than the two ops + used separately in series, but note that this requires that the image be + passed in as an un-decoded string Tensor. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + num_channels: Integer depth of the image buffer for decoding. + + Returns: + 3-D tensor with cropped image. + + """ + # A large fraction of image datasets contain a human-annotated bounding box + # delineating the region of the image containing the object of interest. We + # choose to create a new bounding box for the object which is a randomly + # distorted version of the human-annotated bounding box that obeys an + # allowed range of aspect ratios, sizes and overlap with the human-annotated + # bounding box. If no box is supplied, then we assume the bounding box is + # the entire image. + sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( + tf.image.extract_jpeg_shape(image_buffer), + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=[0.75, 1.33], + area_range=[0.05, 1.0], + max_attempts=100, + use_image_if_no_bounding_boxes=True) + bbox_begin, bbox_size, _ = sample_distorted_bounding_box + + # Reassemble the bounding box in the format the crop op requires. + offset_y, offset_x, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_y, offset_x, target_height, target_width]) + + # Use the fused decode and crop op here, which is faster than each in series. + cropped = tf.image.decode_and_crop_jpeg( + image_buffer, crop_window, channels=num_channels) + + # Flip to add a little more random distortion in. + cropped = tf.image.random_flip_left_right(cropped) + return cropped + + +def _central_crop(image, crop_height, crop_width): + """Performs central crops of the given image list. + + Args: + image: a 3-D image tensor + crop_height: the height of the image following the crop. + crop_width: the width of the image following the crop. + + Returns: + 3-D tensor with cropped image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + amount_to_be_cropped_h = (height - crop_height) + crop_top = amount_to_be_cropped_h // 2 + amount_to_be_cropped_w = (width - crop_width) + crop_left = amount_to_be_cropped_w // 2 + return tf.slice( + image, [crop_top, crop_left, 0], [crop_height, crop_width, -1]) + + +def _mean_image_subtraction(image, means, num_channels): + """Subtracts the given means from each image channel. + + For example: + means = [123.68, 116.779, 103.939] + image = _mean_image_subtraction(image, means) + + Note that the rank of `image` must be known. + + Args: + image: a tensor of size [height, width, C]. + means: a C-vector of values to subtract from each channel. + num_channels: number of color channels in the image that will be distorted. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `means`. + """ + if image.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + + if len(means) != num_channels: + raise ValueError('len(means) must match the number of channels') + + # We have a 1-D tensor of means; convert to 3-D. + # Note(b/130245863): we explicitly call `broadcast` instead of simply + # expanding dimensions for better performance. + means = tf.broadcast_to(means, tf.shape(image)) + + return image - means + + +def _smallest_size_at_least(height, width, resize_min): + """Computes new shape with the smallest side equal to `smallest_side`. + + Computes new shape with the smallest side equal to `smallest_side` while + preserving the original aspect ratio. + + Args: + height: an int32 scalar tensor indicating the current height. + width: an int32 scalar tensor indicating the current width. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + new_height: an int32 scalar tensor indicating the new height. + new_width: an int32 scalar tensor indicating the new width. + """ + resize_min = tf.cast(resize_min, tf.float32) + + # Convert to floats to make subsequent calculations go smoothly. + height, width = tf.cast(height, tf.float32), tf.cast(width, tf.float32) + + smaller_dim = tf.minimum(height, width) + scale_ratio = resize_min / smaller_dim + + # Convert back to ints to make heights and widths that TF ops will accept. + new_height = tf.cast(height * scale_ratio, tf.int32) + new_width = tf.cast(width * scale_ratio, tf.int32) + + return new_height, new_width + + +def _aspect_preserving_resize(image, resize_min): + """Resize images preserving the original aspect ratio. + + Args: + image: A 3-D image `Tensor`. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + resized_image: A 3-D tensor containing the resized image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + new_height, new_width = _smallest_size_at_least(height, width, resize_min) + + return _resize_image(image, new_height, new_width) + + +def _resize_image(image, height, width): + """Simple wrapper around tf.resize_images. + + This is primarily to make sure we use the same `ResizeMethod` and other + details each time. + + Args: + image: A 3-D image `Tensor`. + height: The target height for the resized image. + width: The target width for the resized image. + + Returns: + resized_image: A 3-D tensor containing the resized image. The first two + dimensions have the shape [height, width]. + """ + return tf.compat.v1.image.resize( + image, [height, width], method=tf.image.ResizeMethod.BILINEAR, + align_corners=False) + + +def preprocess_image(image_buffer, bbox, output_height, output_width, + num_channels, is_training=False): + """Preprocesses the given image. + + Preprocessing includes decoding, cropping, and resizing for both training + and eval images. Training preprocessing, however, introduces some random + distortion of the image to improve accuracy. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + num_channels: Integer depth of the image buffer for decoding. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + + Returns: + A preprocessed image. + """ + if is_training: + # For training, we want to randomize some of the distortions. + image = _decode_crop_and_flip(image_buffer, bbox, num_channels) + image = _resize_image(image, output_height, output_width) + else: + # For validation, we want to decode, resize, then just crop the middle. + image = tf.image.decode_jpeg(image_buffer, channels=num_channels) + image = _aspect_preserving_resize(image, _RESIZE_MIN) + image = _central_crop(image, output_height, output_width) + + image.set_shape([output_height, output_width, num_channels]) + + return _mean_image_subtraction(image, _CHANNEL_MEANS, num_channels) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_test.py new file mode 100644 index 0000000..7d33ef0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/imagenet_test.py @@ -0,0 +1,327 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order +from absl import logging + +from official.r1.resnet import imagenet_main +from official.utils.misc import keras_utils +from official.utils.testing import integration + +logging.set_verbosity(logging.ERROR) + +_BATCH_SIZE = 32 +_LABEL_CLASSES = 1001 + + +class BaseTest(tf.test.TestCase): + + _num_validation_images = None + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BaseTest, cls).setUpClass() + imagenet_main.define_imagenet_flags() + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + self._num_validation_images = imagenet_main.NUM_IMAGES['validation'] + imagenet_main.NUM_IMAGES['validation'] = 4 + + def tearDown(self): + super(BaseTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + imagenet_main.NUM_IMAGES['validation'] = self._num_validation_images + + def _tensor_shapes_helper(self, resnet_size, resnet_version, dtype, with_gpu): + """Checks the tensor shapes after each phase of the ResNet model.""" + def reshape(shape): + """Returns the expected dimensions depending on if a GPU is being used.""" + + # If a GPU is used for the test, the shape is returned (already in NCHW + # form). When GPU is not used, the shape is converted to NHWC. + if with_gpu: + return shape + return shape[0], shape[2], shape[3], shape[1] + + graph = tf.Graph() + + with graph.as_default(), self.test_session( + graph=graph, use_gpu=with_gpu, force_gpu=with_gpu): + model = imagenet_main.ImagenetModel( + resnet_size=resnet_size, + data_format='channels_first' if with_gpu else 'channels_last', + resnet_version=resnet_version, + dtype=dtype + ) + inputs = tf.random.uniform([1, 224, 224, 3]) + output = model(inputs, training=True) + + initial_conv = graph.get_tensor_by_name('resnet_model/initial_conv:0') + max_pool = graph.get_tensor_by_name('resnet_model/initial_max_pool:0') + block_layer1 = graph.get_tensor_by_name('resnet_model/block_layer1:0') + block_layer2 = graph.get_tensor_by_name('resnet_model/block_layer2:0') + block_layer3 = graph.get_tensor_by_name('resnet_model/block_layer3:0') + block_layer4 = graph.get_tensor_by_name('resnet_model/block_layer4:0') + reduce_mean = graph.get_tensor_by_name('resnet_model/final_reduce_mean:0') + dense = graph.get_tensor_by_name('resnet_model/final_dense:0') + + self.assertAllEqual(initial_conv.shape, reshape((1, 64, 112, 112))) + self.assertAllEqual(max_pool.shape, reshape((1, 64, 56, 56))) + + # The number of channels after each block depends on whether we're + # using the building_block or the bottleneck_block. + if resnet_size < 50: + self.assertAllEqual(block_layer1.shape, reshape((1, 64, 56, 56))) + self.assertAllEqual(block_layer2.shape, reshape((1, 128, 28, 28))) + self.assertAllEqual(block_layer3.shape, reshape((1, 256, 14, 14))) + self.assertAllEqual(block_layer4.shape, reshape((1, 512, 7, 7))) + self.assertAllEqual(reduce_mean.shape, reshape((1, 512, 1, 1))) + else: + self.assertAllEqual(block_layer1.shape, reshape((1, 256, 56, 56))) + self.assertAllEqual(block_layer2.shape, reshape((1, 512, 28, 28))) + self.assertAllEqual(block_layer3.shape, reshape((1, 1024, 14, 14))) + self.assertAllEqual(block_layer4.shape, reshape((1, 2048, 7, 7))) + self.assertAllEqual(reduce_mean.shape, reshape((1, 2048, 1, 1))) + + self.assertAllEqual(dense.shape, (1, _LABEL_CLASSES)) + self.assertAllEqual(output.shape, (1, _LABEL_CLASSES)) + + def tensor_shapes_helper(self, resnet_size, resnet_version, with_gpu=False): + self._tensor_shapes_helper(resnet_size=resnet_size, + resnet_version=resnet_version, + dtype=tf.float32, with_gpu=with_gpu) + self._tensor_shapes_helper(resnet_size=resnet_size, + resnet_version=resnet_version, + dtype=tf.float16, with_gpu=with_gpu) + + def test_tensor_shapes_resnet_18_v1(self): + self.tensor_shapes_helper(18, resnet_version=1) + + def test_tensor_shapes_resnet_18_v2(self): + self.tensor_shapes_helper(18, resnet_version=2) + + def test_tensor_shapes_resnet_34_v1(self): + self.tensor_shapes_helper(34, resnet_version=1) + + def test_tensor_shapes_resnet_34_v2(self): + self.tensor_shapes_helper(34, resnet_version=2) + + def test_tensor_shapes_resnet_50_v1(self): + self.tensor_shapes_helper(50, resnet_version=1) + + def test_tensor_shapes_resnet_50_v2(self): + self.tensor_shapes_helper(50, resnet_version=2) + + def test_tensor_shapes_resnet_101_v1(self): + self.tensor_shapes_helper(101, resnet_version=1) + + def test_tensor_shapes_resnet_101_v2(self): + self.tensor_shapes_helper(101, resnet_version=2) + + def test_tensor_shapes_resnet_152_v1(self): + self.tensor_shapes_helper(152, resnet_version=1) + + def test_tensor_shapes_resnet_152_v2(self): + self.tensor_shapes_helper(152, resnet_version=2) + + def test_tensor_shapes_resnet_200_v1(self): + self.tensor_shapes_helper(200, resnet_version=1) + + def test_tensor_shapes_resnet_200_v2(self): + self.tensor_shapes_helper(200, resnet_version=2) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_18_with_gpu_v1(self): + self.tensor_shapes_helper(18, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_18_with_gpu_v2(self): + self.tensor_shapes_helper(18, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_34_with_gpu_v1(self): + self.tensor_shapes_helper(34, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_34_with_gpu_v2(self): + self.tensor_shapes_helper(34, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_50_with_gpu_v1(self): + self.tensor_shapes_helper(50, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_50_with_gpu_v2(self): + self.tensor_shapes_helper(50, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_101_with_gpu_v1(self): + self.tensor_shapes_helper(101, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_101_with_gpu_v2(self): + self.tensor_shapes_helper(101, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_152_with_gpu_v1(self): + self.tensor_shapes_helper(152, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_152_with_gpu_v2(self): + self.tensor_shapes_helper(152, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_200_with_gpu_v1(self): + self.tensor_shapes_helper(200, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_200_with_gpu_v2(self): + self.tensor_shapes_helper(200, resnet_version=2, with_gpu=True) + + def resnet_model_fn_helper(self, mode, resnet_version, dtype): + """Tests that the EstimatorSpec is given the appropriate arguments.""" + tf.compat.v1.train.create_global_step() + + input_fn = imagenet_main.get_synth_input_fn(dtype) + dataset = input_fn(True, '', _BATCH_SIZE) + iterator = tf.compat.v1.data.make_initializable_iterator(dataset) + features, labels = iterator.get_next() + spec = imagenet_main.imagenet_model_fn( + features, labels, mode, { + 'dtype': dtype, + 'resnet_size': 50, + 'data_format': 'channels_last', + 'batch_size': _BATCH_SIZE, + 'resnet_version': resnet_version, + 'loss_scale': 128 if dtype == tf.float16 else 1, + 'fine_tune': False, + }) + + predictions = spec.predictions + self.assertAllEqual(predictions['probabilities'].shape, + (_BATCH_SIZE, _LABEL_CLASSES)) + self.assertEqual(predictions['probabilities'].dtype, tf.float32) + self.assertAllEqual(predictions['classes'].shape, (_BATCH_SIZE,)) + self.assertEqual(predictions['classes'].dtype, tf.int64) + + if mode != tf.estimator.ModeKeys.PREDICT: + loss = spec.loss + self.assertAllEqual(loss.shape, ()) + self.assertEqual(loss.dtype, tf.float32) + + if mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = spec.eval_metric_ops + self.assertAllEqual(eval_metric_ops['accuracy'][0].shape, ()) + self.assertAllEqual(eval_metric_ops['accuracy'][1].shape, ()) + self.assertEqual(eval_metric_ops['accuracy'][0].dtype, tf.float32) + self.assertEqual(eval_metric_ops['accuracy'][1].dtype, tf.float32) + + def test_resnet_model_fn_train_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_train_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=2, + dtype=tf.float32) + + def test_resnet_model_fn_eval_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_eval_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=2, + dtype=tf.float32) + + def test_resnet_model_fn_predict_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.PREDICT, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_predict_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.PREDICT, resnet_version=2, + dtype=tf.float32) + + def _test_imagenetmodel_shape(self, resnet_version): + batch_size = 135 + num_classes = 246 + + model = imagenet_main.ImagenetModel( + 50, data_format='channels_last', num_classes=num_classes, + resnet_version=resnet_version) + + fake_input = tf.random.uniform([batch_size, 224, 224, 3]) + output = model(fake_input, training=True) + + self.assertAllEqual(output.shape, (batch_size, num_classes)) + + def test_imagenetmodel_shape_v1(self): + self._test_imagenetmodel_shape(resnet_version=1) + + def test_imagenetmodel_shape_v2(self): + self._test_imagenetmodel_shape(resnet_version=2) + + def test_imagenet_end_to_end_synthetic_v1(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v1_tiny(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '-resnet_size', '18', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2_tiny(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '-resnet_size', '18', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v1_huge(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '-resnet_size', '200', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2_huge(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '-resnet_size', '200', '--max_train_steps', '1'] + ) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_model.py new file mode 100644 index 0000000..611c880 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_model.py @@ -0,0 +1,552 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for Residual Networks. + +Residual networks ('v1' ResNets) were originally proposed in: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +The full preactivation 'v2' ResNet variant was introduced by: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The key difference of the full preactivation 'v2' variant compared to the +'v1' variant in [1] is the use of batch normalization before every weight layer +rather than after. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +_BATCH_NORM_DECAY = 0.997 +_BATCH_NORM_EPSILON = 1e-5 +DEFAULT_VERSION = 2 +DEFAULT_DTYPE = tf.float32 +CASTABLE_TYPES = (tf.float16,) +ALLOWED_TYPES = (DEFAULT_DTYPE,) + CASTABLE_TYPES + + +################################################################################ +# Convenience functions for building the ResNet model. +################################################################################ +def batch_norm(inputs, training, data_format): + """Performs a batch normalization using a standard set of parameters.""" + # We set fused=True for a significant performance boost. See + # https://www.tensorflow.org/performance/performance_guide#common_fused_ops + return tf.compat.v1.layers.batch_normalization( + inputs=inputs, axis=1 if data_format == 'channels_first' else 3, + momentum=_BATCH_NORM_DECAY, epsilon=_BATCH_NORM_EPSILON, center=True, + scale=True, training=training, fused=True) + + +def fixed_padding(inputs, kernel_size, data_format): + """Pads the input along the spatial dimensions independently of input size. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + Should be a positive integer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + A tensor with the same format as the input with the data either intact + (if kernel_size == 1) or padded (if kernel_size > 1). + """ + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + + if data_format == 'channels_first': + padded_inputs = tf.pad(tensor=inputs, + paddings=[[0, 0], [0, 0], [pad_beg, pad_end], + [pad_beg, pad_end]]) + else: + padded_inputs = tf.pad(tensor=inputs, + paddings=[[0, 0], [pad_beg, pad_end], + [pad_beg, pad_end], [0, 0]]) + return padded_inputs + + +def conv2d_fixed_padding(inputs, filters, kernel_size, strides, data_format): + """Strided 2-D convolution with explicit padding.""" + # The padding is consistent and is based only on `kernel_size`, not on the + # dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone). + if strides > 1: + inputs = fixed_padding(inputs, kernel_size, data_format) + + return tf.compat.v1.layers.conv2d( + inputs=inputs, filters=filters, kernel_size=kernel_size, strides=strides, + padding=('SAME' if strides == 1 else 'VALID'), use_bias=False, + kernel_initializer=tf.compat.v1.variance_scaling_initializer(), + data_format=data_format) + + +################################################################################ +# ResNet block definitions. +################################################################################ +def _building_block_v1(inputs, filters, training, projection_shortcut, strides, + data_format): + """A single block for ResNet v1, without a bottleneck. + + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + shortcut = batch_norm(inputs=shortcut, training=training, + data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _building_block_v2(inputs, filters, training, projection_shortcut, strides, + data_format): + """A single block for ResNet v2, without a bottleneck. + + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format) + + return inputs + shortcut + + +def _bottleneck_block_v1(inputs, filters, training, projection_shortcut, + strides, data_format): + """A single block for ResNet v1, with a bottleneck. + + Similar to _building_block_v1(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + shortcut = batch_norm(inputs=shortcut, training=training, + data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _bottleneck_block_v2(inputs, filters, training, projection_shortcut, + strides, data_format): + """A single block for ResNet v2, with a bottleneck. + + Similar to _building_block_v2(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Adapted to the ordering conventions of: + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format) + + return inputs + shortcut + + +def block_layer(inputs, filters, bottleneck, block_fn, blocks, strides, + training, name, data_format): + """Creates one layer of blocks for the ResNet model. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the first convolution of the layer. + bottleneck: Is the block created a bottleneck block. + block_fn: The block to use within the model, either `building_block` or + `bottleneck_block`. + blocks: The number of blocks contained in the layer. + strides: The stride to use for the first convolution of the layer. If + greater than 1, this layer will ultimately downsample the input. + training: Either True or False, whether we are currently training the + model. Needed for batch norm. + name: A string name for the tensor output of the block layer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block layer. + """ + + # Bottleneck blocks end with 4x the number of filters as they start with + filters_out = filters * 4 if bottleneck else filters + + def projection_shortcut(inputs): + return conv2d_fixed_padding( + inputs=inputs, filters=filters_out, kernel_size=1, strides=strides, + data_format=data_format) + + # Only the first block per block_layer uses projection_shortcut and strides + inputs = block_fn(inputs, filters, training, projection_shortcut, strides, + data_format) + + for _ in range(1, blocks): + inputs = block_fn(inputs, filters, training, None, 1, data_format) + + return tf.identity(inputs, name) + + +class Model(object): + """Base class for building the Resnet Model.""" + + def __init__(self, resnet_size, bottleneck, num_classes, num_filters, + kernel_size, + conv_stride, first_pool_size, first_pool_stride, + block_sizes, block_strides, + resnet_version=DEFAULT_VERSION, data_format=None, + dtype=DEFAULT_DTYPE): + """Creates a model for classifying an image. + + Args: + resnet_size: A single integer for the size of the ResNet model. + bottleneck: Use regular blocks or bottleneck blocks. + num_classes: The number of classes used as labels. + num_filters: The number of filters to use for the first block layer + of the model. This number is then doubled for each subsequent block + layer. + kernel_size: The kernel size to use for convolution. + conv_stride: stride size for the initial convolutional layer + first_pool_size: Pool size to be used for the first pooling layer. + If none, the first pooling layer is skipped. + first_pool_stride: stride size for the first pooling layer. Not used + if first_pool_size is None. + block_sizes: A list containing n values, where n is the number of sets of + block layers desired. Each value should be the number of blocks in the + i-th set. + block_strides: List of integers representing the desired stride size for + each of the sets of block layers. Should be same length as block_sizes. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + dtype: The TensorFlow dtype to use for calculations. If not specified + tf.float32 is used. + + Raises: + ValueError: if invalid version is selected. + """ + self.resnet_size = resnet_size + + if not data_format: + data_format = ( + 'channels_first' if tf.test.is_built_with_cuda() else 'channels_last') + + self.resnet_version = resnet_version + if resnet_version not in (1, 2): + raise ValueError( + 'Resnet version should be 1 or 2. See README for citations.') + + self.bottleneck = bottleneck + if bottleneck: + if resnet_version == 1: + self.block_fn = _bottleneck_block_v1 + else: + self.block_fn = _bottleneck_block_v2 + else: + if resnet_version == 1: + self.block_fn = _building_block_v1 + else: + self.block_fn = _building_block_v2 + + if dtype not in ALLOWED_TYPES: + raise ValueError('dtype must be one of: {}'.format(ALLOWED_TYPES)) + + self.data_format = data_format + self.num_classes = num_classes + self.num_filters = num_filters + self.kernel_size = kernel_size + self.conv_stride = conv_stride + self.first_pool_size = first_pool_size + self.first_pool_stride = first_pool_stride + self.block_sizes = block_sizes + self.block_strides = block_strides + self.dtype = dtype + self.pre_activation = resnet_version == 2 + + def _custom_dtype_getter(self, getter, name, shape=None, dtype=DEFAULT_DTYPE, + *args, **kwargs): + """Creates variables in fp32, then casts to fp16 if necessary. + + This function is a custom getter. A custom getter is a function with the + same signature as tf.get_variable, except it has an additional getter + parameter. Custom getters can be passed as the `custom_getter` parameter of + tf.variable_scope. Then, tf.get_variable will call the custom getter, + instead of directly getting a variable itself. This can be used to change + the types of variables that are retrieved with tf.get_variable. + The `getter` parameter is the underlying variable getter, that would have + been called if no custom getter was used. Custom getters typically get a + variable with `getter`, then modify it in some way. + + This custom getter will create an fp32 variable. If a low precision + (e.g. float16) variable was requested it will then cast the variable to the + requested dtype. The reason we do not directly create variables in low + precision dtypes is that applying small gradients to such variables may + cause the variable not to change. + + Args: + getter: The underlying variable getter, that has the same signature as + tf.get_variable and returns a variable. + name: The name of the variable to get. + shape: The shape of the variable to get. + dtype: The dtype of the variable to get. Note that if this is a low + precision dtype, the variable will be created as a tf.float32 variable, + then cast to the appropriate dtype + *args: Additional arguments to pass unmodified to getter. + **kwargs: Additional keyword arguments to pass unmodified to getter. + + Returns: + A variable which is cast to fp16 if necessary. + """ + + if dtype in CASTABLE_TYPES: + var = getter(name, shape, tf.float32, *args, **kwargs) + return tf.cast(var, dtype=dtype, name=name + '_cast') + else: + return getter(name, shape, dtype, *args, **kwargs) + + def _model_variable_scope(self): + """Returns a variable scope that the model should be created under. + + If self.dtype is a castable type, model variable will be created in fp32 + then cast to self.dtype before being used. + + Returns: + A variable scope for the model. + """ + + return tf.compat.v1.variable_scope('resnet_model', + custom_getter=self._custom_dtype_getter) + + def __call__(self, inputs, training): + """Add operations to classify a batch of input images. + + Args: + inputs: A Tensor representing a batch of input images. + training: A boolean. Set to True to add operations required only when + training the classifier. + + Returns: + A logits Tensor with shape [, self.num_classes]. + """ + + with self._model_variable_scope(): + if self.data_format == 'channels_first': + # Convert the inputs from channels_last (NHWC) to channels_first (NCHW). + # This provides a large performance boost on GPU. See + # https://www.tensorflow.org/performance/performance_guide#data_formats + inputs = tf.transpose(a=inputs, perm=[0, 3, 1, 2]) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=self.num_filters, kernel_size=self.kernel_size, + strides=self.conv_stride, data_format=self.data_format) + inputs = tf.identity(inputs, 'initial_conv') + + # We do not include batch normalization or activation functions in V2 + # for the initial conv1 because the first ResNet unit will perform these + # for both the shortcut and non-shortcut paths as part of the first + # block's projection. Cf. Appendix of [2]. + if self.resnet_version == 1: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + if self.first_pool_size: + ############## npu modify begin ############# + #max_pooling2d is replaced by max_pool_with_argmax for better performance + inputs,argmax = tf.compat.v1.nn.max_pool_with_argmax( + input=inputs, ksize=(1,self.first_pool_size,self.first_pool_size,1), + strides=(1,self.first_pool_stride,self.first_pool_stride,1), padding='SAME', + data_format='NCHW' if self.data_format == 'channels_first' else 'NHWC') + ############## npu modify end ############### + + inputs = tf.identity(inputs, 'initial_max_pool') + + for i, num_blocks in enumerate(self.block_sizes): + num_filters = self.num_filters * (2**i) + inputs = block_layer( + inputs=inputs, filters=num_filters, bottleneck=self.bottleneck, + block_fn=self.block_fn, blocks=num_blocks, + strides=self.block_strides[i], training=training, + name='block_layer{}'.format(i + 1), data_format=self.data_format) + + # Only apply the BN and ReLU for model that does pre_activation in each + # building/bottleneck block, eg resnet V2. + if self.pre_activation: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + # The current top layer has shape + # `batch_size x pool_size x pool_size x final_size`. + # ResNet does an Average Pooling layer over pool_size, + # but that is the same as doing a reduce_mean. We do a reduce_mean + # here because it performs better than AveragePooling2D. + axes = [2, 3] if self.data_format == 'channels_first' else [1, 2] + inputs = tf.reduce_mean(input_tensor=inputs, axis=axes, keepdims=True) + inputs = tf.identity(inputs, 'final_reduce_mean') + + inputs = tf.squeeze(inputs, axes) + inputs = tf.compat.v1.layers.dense(inputs=inputs, units=self.num_classes) + inputs = tf.identity(inputs, 'final_dense') + return inputs diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_run_loop.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_run_loop.py new file mode 100644 index 0000000..80d0b98 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/resnet_run_loop.py @@ -0,0 +1,989 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains utility and supporting functions for ResNet. + + This module contains ResNet code which does not directly build layers. This +includes dataset management, hyperparameter and optimizer code, and argument +parsing. Code for defining the ResNet layers can be found in resnet_model.py. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import math +import multiprocessing +import os +import sys +import time +import datetime +from absl import flags +from absl import logging +import tensorflow as tf + +############## npu modify begin ############# +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator import npu_ops +from npu_bridge.hccl import hccl_ops +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +from tensorflow.core.protobuf import rewriter_config_pb2 + +import numpy as np +import random +SEED=123 +os.environ['PYTHONHASHSEED'] = str(SEED) +random.seed(SEED) +np.random.seed(SEED) +tf.compat.v1.set_random_seed(SEED) +tf.compat.v1.logging.info('setting random_seed: %d', SEED) +from benchmark_log import hwlog +############## npu modify end ############### + +from official.r1.resnet import imagenet_preprocessing +from official.r1.resnet import resnet_model +from official.r1.utils import export +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers + +################################################################################ +# Functions for input processing. +################################################################################ +def process_record_dataset(dataset, + is_training, + batch_size, + shuffle_buffer, + parse_record_fn, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + drop_remainder=False, + tf_data_experimental_slack=False, + test_mode=False, + ): + """Given a Dataset with raw records, return an iterator over the records. + + Args: + dataset: A Dataset representing raw records + is_training: A boolean denoting whether the input is for training. + batch_size: The number of samples per batch. + shuffle_buffer: The buffer size to use when shuffling records. A larger + value results in better randomness, but smaller values reduce startup + time and use less memory. + parse_record_fn: A function that takes a raw record and returns the + corresponding (image, label) pair. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features. + datasets_num_private_threads: Number of threads for a private + threadpool created for all datasets computation. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + Dataset of (image, label) pairs ready for iteration. + """ + # Defines a specific size thread pool for tf.data operations. + if datasets_num_private_threads: + options = tf.data.Options() + options.experimental_threading.private_threadpool_size = ( + datasets_num_private_threads) + dataset = dataset.with_options(options) + tf.compat.v1.logging.info('datasets_num_private_threads: %s', + datasets_num_private_threads) + + # Disable intra-op parallelism to optimize for throughput instead of latency. + options = tf.data.Options() + options.experimental_threading.max_intra_op_parallelism = 1 + dataset = dataset.with_options(options) + + if test_mode == True: + is_training = False + + # Prefetches a batch at a time to smooth out the time taken to load input + # files for shuffling and processing. + dataset = dataset.prefetch(buffer_size=batch_size) + if is_training: + # Shuffles records before repeating to respect epoch boundaries. + dataset = dataset.shuffle(buffer_size=shuffle_buffer) + + # Repeats the dataset for the number of epochs to train. + dataset = dataset.repeat() + + # Parses the raw records into images and labels. + dataset = dataset.map( + lambda value: parse_record_fn(value, is_training, dtype), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) + + # Operations between the final prefetch and the get_next call to the iterator + # will happen synchronously during run time. We prefetch here again to + # background all of the above processing work and keep it out of the + # critical training path. Setting buffer_size to tf.data.experimental.AUTOTUNE + # allows DistributionStrategies to adjust how many batches to fetch based + # on how many devices are present. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + + if tf_data_experimental_slack: + options = tf.data.Options() + options.experimental_slack = True + dataset = dataset.with_options(options) + + return dataset + + +def get_synth_input_fn(height, width, num_channels, num_classes, + dtype=tf.float32): + """Returns an input function that returns a dataset with random data. + + This input_fn returns a data set that iterates over a set of random data and + bypasses all preprocessing, e.g. jpeg decode and copy. The host to device + copy is still included. This used to find the upper throughput bound when + tunning the full input pipeline. + + Args: + height: Integer height that will be used to create a fake image tensor. + width: Integer width that will be used to create a fake image tensor. + num_channels: Integer depth that will be used to create a fake image tensor. + num_classes: Number of classes that should be represented in the fake labels + tensor + dtype: Data type for features/images. + + Returns: + An input_fn that can be used in place of a real one to return a dataset + that can be used for iteration. + """ + # pylint: disable=unused-argument + def input_fn(is_training, data_dir, batch_size, *args, **kwargs): + """Returns dataset filled with random data.""" + # Synthetic input should be within [0, 255]. + inputs = tf.random.truncated_normal( + [batch_size] + [height, width, num_channels], + dtype=dtype, + mean=127, + stddev=60, + seed=123, + name='synthetic_inputs') + + labels = tf.random.uniform( + [batch_size], + minval=0, + maxval=num_classes - 1, + dtype=tf.int32, + seed=123, + name='synthetic_labels') + + data = tf.data.Dataset.from_tensors((inputs, labels)).repeat() + data = data.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return data + + return input_fn + + +def image_bytes_serving_input_fn(image_shape, dtype=tf.float32): + """Serving input fn for raw jpeg images.""" + + def _preprocess_image(image_bytes): + """Preprocess a single raw image.""" + # Bounding box around the whole image. + bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=dtype, shape=[1, 1, 4]) + height, width, num_channels = image_shape + image = imagenet_preprocessing.preprocess_image( + image_bytes, bbox, height, width, num_channels, is_training=False) + return image + + image_bytes_list = tf.compat.v1.placeholder( + shape=[None], dtype=tf.string, name='input_tensor') + images = tf.map_fn( + _preprocess_image, image_bytes_list, back_prop=False, dtype=dtype) + return tf.estimator.export.TensorServingInputReceiver( + images, {'image_bytes': image_bytes_list}) + + +def override_flags_and_set_envars_for_gpu_thread_pool(flags_obj): + """Override flags and set env_vars for performance. + + These settings exist to test the difference between using stock settings + and manual tuning. It also shows some of the ENV_VARS that can be tweaked to + squeeze a few extra examples per second. These settings are defaulted to the + current platform of interest, which changes over time. + + On systems with small numbers of cpu cores, e.g. under 8 logical cores, + setting up a gpu thread pool with `tf_gpu_thread_mode=gpu_private` may perform + poorly. + + Args: + flags_obj: Current flags, which will be adjusted possibly overriding + what has been set by the user on the command-line. + """ + cpu_count = multiprocessing.cpu_count() + tf.compat.v1.logging.info('Logical CPU cores: %s', cpu_count) + + # Sets up thread pool for each GPU for op scheduling. + per_gpu_thread_count = 1 + total_gpu_thread_count = per_gpu_thread_count * flags_obj.num_gpus + os.environ['TF_GPU_THREAD_MODE'] = flags_obj.tf_gpu_thread_mode + os.environ['TF_GPU_THREAD_COUNT'] = str(per_gpu_thread_count) + tf.compat.v1.logging.info('TF_GPU_THREAD_COUNT: %s', os.environ['TF_GPU_THREAD_COUNT']) + tf.compat.v1.logging.info('TF_GPU_THREAD_MODE: %s', os.environ['TF_GPU_THREAD_MODE']) + + # Reduces general thread pool by number of threads used for GPU pool. + main_thread_count = cpu_count - total_gpu_thread_count + flags_obj.inter_op_parallelism_threads = main_thread_count + + # Sets thread count for tf.data. Logical cores minus threads assign to the + # private GPU pool along with 2 thread per GPU for event monitoring and + # sending / receiving tensors. + num_monitoring_threads = 2 * flags_obj.num_gpus + flags_obj.datasets_num_private_threads = (cpu_count - total_gpu_thread_count + - num_monitoring_threads) + + +################################################################################ +# Functions for running training/eval/validation loops for the model. +################################################################################ +def learning_rate_with_decay( + batch_size, batch_denom, num_images, boundary_epochs, decay_rates, + base_lr=0.1, warmup=False, cosine_lr=False, train_epochs=90): + """Get a learning rate that decays step-wise as training progresses. + + Args: + batch_size: the number of examples processed in each training batch. + batch_denom: this value will be used to scale the base learning rate. + `0.1 * batch size` is divided by this number, such that when + batch_denom == batch_size, the initial learning rate will be 0.1. + num_images: total number of images that will be used for training. + boundary_epochs: list of ints representing the epochs at which we + decay the learning rate. + decay_rates: list of floats representing the decay rates to be used + for scaling the learning rate. It should have one more element + than `boundary_epochs`, and all elements should have the same type. + base_lr: Initial learning rate scaled based on batch_denom. + warmup: Run a 5 epoch warmup to the initial lr. + Returns: + Returns a function that takes a single argument - the number of batches + trained so far (global_step)- and returns the learning rate to be used + for training the next batch. + """ + + initial_learning_rate = base_lr * batch_size / batch_denom + batches_per_epoch = num_images / batch_size + + # Reduce the learning rate at certain epochs. + # CIFAR-10: divide by 10 at epoch 100, 150, and 200 + # ImageNet: divide by 10 at epoch 30, 60, 80, and 90 + boundaries = [int(batches_per_epoch * epoch) for epoch in boundary_epochs] + vals = [initial_learning_rate * decay for decay in decay_rates] + + tf.compat.v1.logging.info('base_lr: %.4f', float(base_lr)) + tf.compat.v1.logging.info('initial_learning_rate: %.4f', float(initial_learning_rate)) + tf.compat.v1.logging.info('batches_per_epoch: %d', int(batches_per_epoch)) + tf.compat.v1.logging.info('lr boundaries: %s', ','.join(str(i) for i in boundaries)) + tf.compat.v1.logging.info('lr vals: %s', ','.join(str(i) for i in vals)) + + tf.compat.v1.logging.info('warmup: %d', int(warmup)) + tf.compat.v1.logging.info('cosine_lr: %d', int(cosine_lr)) + tf.compat.v1.logging.info('train_epochs: %d', int(train_epochs)) + + def learning_rate_fn(global_step): + """Builds scaled learning rate function with 5 epoch warm up.""" + + ############## npu modify begin ############# + #Using int32 for better computing performance + global_step=tf.cast(global_step,tf.int32) + ############## npu modify end ############### + + ############## npu modify begin ############# + if cosine_lr: + total_steps = int(train_epochs * batches_per_epoch) + warmup_steps = int(batches_per_epoch * 5 * int(warmup)) + + tf.compat.v1.logging.info('total_steps: %d', int(total_steps)) + tf.compat.v1.logging.info('warmup_steps: %d', int(warmup_steps)) + + lr = tf.maximum( + tf.compat.v1.train.cosine_decay( + learning_rate=initial_learning_rate, + global_step=global_step - warmup_steps, + decay_steps=total_steps - warmup_steps, + ), + 0, + ) + ############## npu modify end ############### + else: + lr = tf.compat.v1.train.piecewise_constant(global_step, boundaries, vals) + + if warmup: + warmup_steps = int(batches_per_epoch * 5) + warmup_lr = ( + initial_learning_rate * tf.cast(global_step, tf.float32) / tf.cast( + warmup_steps, tf.float32)) + return tf.cond(pred=global_step < warmup_steps, + true_fn=lambda: warmup_lr, + false_fn=lambda: lr) + return lr + + def poly_rate_fn(global_step): + """Handles linear scaling rule, gradual warmup, and LR decay. + + The learning rate starts at 0, then it increases linearly per step. After + FLAGS.poly_warmup_epochs, we reach the base learning rate (scaled to account + for batch size). The learning rate is then decayed using a polynomial rate + decay schedule with power 2.0. + + Args: + global_step: the current global_step + + Returns: + returns the current learning rate + """ + + # Learning rate schedule for LARS polynomial schedule + if flags.FLAGS.batch_size < 8192: + plr = 5.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 16384: + plr = 10.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 32768: + plr = 25.0 + w_epochs = 5 + else: + plr = 32.0 + w_epochs = 14 + + w_steps = int(w_epochs * batches_per_epoch) + wrate = (plr * tf.cast(global_step, tf.float32) / tf.cast( + w_steps, tf.float32)) + + # TODO(pkanwar): use a flag to help calc num_epochs. + num_epochs = 90 + train_steps = batches_per_epoch * num_epochs + + min_step = tf.constant(1, dtype=tf.int64) + decay_steps = tf.maximum(min_step, tf.subtract(global_step, w_steps)) + poly_rate = tf.train.polynomial_decay( + plr, + decay_steps, + train_steps - w_steps + 1, + power=2.0) + return tf.where(global_step <= w_steps, wrate, poly_rate) + + # For LARS we have a new learning rate schedule + if flags.FLAGS.enable_lars: + return poly_rate_fn + + return learning_rate_fn + + +def per_replica_batch_size(batch_size, num_gpus): + """For multi-gpu, batch-size must be a multiple of the number of GPUs. + + + Note that distribution strategy handles this automatically when used with + Keras. For using with Estimator, we need to get per GPU batch. + + Args: + batch_size: Global batch size to be divided among devices. This should be + equal to num_gpus times the single-GPU batch_size for multi-gpu training. + num_gpus: How many GPUs are used with DistributionStrategies. + + Returns: + Batch size per device. + + Raises: + ValueError: if batch_size is not divisible by number of devices + """ + if num_gpus <= 1: + return batch_size + + remainder = batch_size % num_gpus + if remainder: + err = ('When running with multiple GPUs, batch size ' + 'must be a multiple of the number of available GPUs. Found {} ' + 'GPUs with a batch size of {}; try --batch_size={} instead.' + ).format(num_gpus, batch_size, batch_size - remainder) + raise ValueError(err) + return int(batch_size / num_gpus) + + +def resnet_model_fn(features, labels, mode, model_class, + resnet_size, weight_decay, learning_rate_fn, momentum, + data_format, resnet_version, loss_scale, + loss_filter_fn=None, dtype=resnet_model.DEFAULT_DTYPE, + fine_tune=False, label_smoothing=0.0): + """Shared functionality for different resnet model_fns. + + Initializes the ResnetModel representing the model layers + and uses that model to build the necessary EstimatorSpecs for + the `mode` in question. For training, this means building losses, + the optimizer, and the train op that get passed into the EstimatorSpec. + For evaluation and prediction, the EstimatorSpec is returned without + a train op, but with the necessary parameters for the given mode. + + Args: + features: tensor representing input images + labels: tensor representing class labels for all input images + mode: current estimator mode; should be one of + `tf.estimator.ModeKeys.TRAIN`, `EVALUATE`, `PREDICT` + model_class: a class representing a TensorFlow model that has a __call__ + function. We assume here that this is a subclass of ResnetModel. + resnet_size: A single integer for the size of the ResNet model. + weight_decay: weight decay loss rate used to regularize learned variables. + learning_rate_fn: function that returns the current learning rate given + the current global_step + momentum: momentum term used for optimization + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + resnet_version: Integer representing which version of the ResNet network to + use. See README for details. Valid values: [1, 2] + loss_scale: The factor to scale the loss for numerical stability. A detailed + summary is present in the arg parser help text. + loss_filter_fn: function that takes a string variable name and returns + True if the var should be included in loss calculation, and False + otherwise. If None, batch_normalization variables will be excluded + from the loss. + dtype: the TensorFlow dtype to use for calculations. + fine_tune: If True only train the dense layers(final layers). + label_smoothing: If greater than 0 then smooth the labels. + + Returns: + EstimatorSpec parameterized according to the input params and the + current mode. + """ + + # Generate a summary node for the images + tf.compat.v1.summary.image('images', features, max_outputs=6) + + ############## npu modify begin ############# + # Checks that features/images have same data type being used for calculations. + if features.dtype != dtype: + features=tf.cast(features,dtype) + ############## npu modify end ############### + + model = model_class(resnet_size, data_format, resnet_version=resnet_version, + dtype=dtype) + + logits = model(features, mode == tf.estimator.ModeKeys.TRAIN) + + # This acts as a no-op if the logits are already in fp32 (provided logits are + # not a SparseTensor). If dtype is is low precision, logits must be cast to + # fp32 for numerical stability. + logits = tf.cast(logits, tf.float32) + + predictions = { + 'classes': tf.argmax(input=logits, axis=1), + 'probabilities': tf.nn.softmax(logits, name='softmax_tensor') + } + + if mode == tf.estimator.ModeKeys.PREDICT: + # Return the predictions and the specification for serving a SavedModel + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + export_outputs={ + 'predict': tf.estimator.export.PredictOutput(predictions) + }) + + # Calculate loss, which includes softmax cross entropy and L2 regularization. + if label_smoothing != 0.0: + one_hot_labels = tf.one_hot(labels, 1001) + cross_entropy = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=one_hot_labels, + label_smoothing=label_smoothing) + else: + cross_entropy = tf.compat.v1.losses.sparse_softmax_cross_entropy( + logits=logits, labels=labels) + + # Create a tensor named cross_entropy for logging purposes. + tf.identity(cross_entropy, name='cross_entropy') + tf.compat.v1.summary.scalar('cross_entropy', cross_entropy) + + # If no loss_filter_fn is passed, assume we want the default behavior, + # which is that batch_normalization variables are excluded from loss. + def exclude_batch_norm(name): + return 'batch_normalization' not in name + loss_filter_fn = loss_filter_fn or exclude_batch_norm + + # Add weight decay to the loss. + l2_loss = weight_decay * tf.add_n( + # loss is computed using fp32 for numerical stability. + [ + tf.nn.l2_loss(tf.cast(v, tf.float32)) + for v in tf.compat.v1.trainable_variables() + if loss_filter_fn(v.name) + ]) + tf.compat.v1.summary.scalar('l2_loss', l2_loss) + loss = cross_entropy + l2_loss + + if mode == tf.estimator.ModeKeys.TRAIN: + global_step = tf.compat.v1.train.get_or_create_global_step() + + learning_rate = learning_rate_fn(global_step) + + # Create a tensor named learning_rate for logging purposes + tf.identity(learning_rate, name='learning_rate') + tf.compat.v1.summary.scalar('learning_rate', learning_rate) + + if flags.FLAGS.enable_lars: + from tensorflow.contrib import opt as contrib_opt # pylint: disable=g-import-not-at-top + optimizer = contrib_opt.LARSOptimizer( + learning_rate, + momentum=momentum, + weight_decay=weight_decay, + skip_list=['batch_normalization', 'bias']) + else: + optimizer = tf.compat.v1.train.MomentumOptimizer( + learning_rate=learning_rate, + momentum=momentum + ) + + ############## npu modify begin ############# + optimizer = NPUDistributedOptimizer(optimizer) + ############## npu modify end ############### + + fp16_implementation = getattr(flags.FLAGS, 'fp16_implementation', None) + if fp16_implementation == 'graph_rewrite': + optimizer = ( + tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer, loss_scale=loss_scale)) + + def _dense_grad_filter(gvs): + """Only apply gradient updates to the final layer. + + This function is used for fine tuning. + + Args: + gvs: list of tuples with gradients and variable info + Returns: + filtered gradients so that only the dense layer remains + """ + return [(g, v) for g, v in gvs if 'dense' in v.name] + + if loss_scale != 1 and fp16_implementation != 'graph_rewrite': + # When computing fp16 gradients, often intermediate tensor values are + # so small, they underflow to 0. To avoid this, we multiply the loss by + # loss_scale to make these tensor values loss_scale times bigger. + scaled_grad_vars = optimizer.compute_gradients(loss * loss_scale) + + if fine_tune: + scaled_grad_vars = _dense_grad_filter(scaled_grad_vars) + + # Once the gradient computation is complete we can scale the gradients + # back to the correct scale before passing them to the optimizer. + unscaled_grad_vars = [(grad / loss_scale, var) + for grad, var in scaled_grad_vars] + minimize_op = optimizer.apply_gradients(unscaled_grad_vars, global_step) + else: + grad_vars = optimizer.compute_gradients(loss) + if fine_tune: + grad_vars = _dense_grad_filter(grad_vars) + minimize_op = optimizer.apply_gradients(grad_vars, global_step) + + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + train_op = tf.group(minimize_op, update_ops) + else: + train_op = None + + ############## npu modify begin ############# + #Using float32 for better performance + accuracy = tf.compat.v1.metrics.accuracy(tf.cast(labels, tf.float32), predictions['classes']) + ############## npu modify end ############### + + accuracy_top_5 = tf.compat.v1.metrics.mean( + tf.nn.in_top_k(predictions=logits, targets=labels, k=5, name='top_5_op')) + + ############## npu modify begin ############# + #Using for 8P + rank_size = int(os.getenv('RANK_SIZE')) + newaccuracy = (hccl_ops.allreduce(accuracy[0], "sum") / rank_size, accuracy[1]) + newaccuracy_top_5 = (hccl_ops.allreduce(accuracy_top_5[0], "sum") / rank_size, accuracy_top_5[1]) + ############## npu modify begin ############# + + metrics = {'accuracy': newaccuracy, + 'accuracy_top_5': newaccuracy_top_5} + + # Create a tensor named train_accuracy for logging purposes + tf.identity(accuracy[1], name='train_accuracy') + tf.identity(accuracy_top_5[1], name='train_accuracy_top_5') + tf.compat.v1.summary.scalar('train_accuracy', accuracy[1]) + tf.compat.v1.summary.scalar('train_accuracy_top_5', accuracy_top_5[1]) + + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + loss=loss, + train_op=train_op, + eval_metric_ops=metrics) + +############## npu modify begin ############# +def init_npu(): + """Initialize npu manually. + Returns: + `init_sess` npu init session config. + `npu_init` npu init ops. + """ + npu_init = npu_ops.initialize_system() + config = tf.ConfigProto() + + #npu mix precision attribute set to true when using mix precision + config.graph_options.rewrite_options.remapping = rewriter_config_pb2.RewriterConfig.OFF + custom_op = config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision") + custom_op.parameter_map["use_off_line"].b = True + + init_sess = tf.Session(config=config) + return init_sess,npu_init +############## npu modify end ############### + + +def resnet_main( + flags_obj, model_function, input_function, dataset_name, num_images, shape=None): + """Shared main loop for ResNet Models. + + Args: + flags_obj: An object containing parsed flags. See define_resnet_flags() + for details. + model_function: the function that instantiates the Model and builds the + ops for train/eval. This will be passed directly into the estimator. + input_function: the function that processes the dataset and returns a + dataset that the estimator can train on. This will be wrapped with + all the relevant flags for running and passed to estimator. + dataset_name: the name of the dataset for training and evaluation. This is + used for logging purpose. + shape: list of ints representing the shape of the images used for training. + This is only used if flags_obj.export_dir is passed. + + Returns: + Dict of results of the run. Contains the keys `eval_results` and + `train_hooks`. `eval_results` contains accuracy (top_1) and accuracy_top_5. + `train_hooks` is a list the instances of hooks used during training. + """ + + model_helpers.apply_clean(flags.FLAGS) + + rank_size = get_rank_size() + rank_id = get_rank_id() + + # Ensures flag override logic is only executed if explicitly triggered. + if flags_obj.tf_gpu_thread_mode: + override_flags_and_set_envars_for_gpu_thread_pool(flags_obj) + + # Configures cluster spec for distribution strategy. + num_workers = distribution_utils.configure_cluster(flags_obj.worker_hosts, + flags_obj.task_index) + + # Creates session config. allow_soft_placement = True, is required for + # multi-GPU and is not harmful for other modes. + session_config = tf.compat.v1.ConfigProto( + inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads, + intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads, + allow_soft_placement=True) + + session_config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + + ############## npu modify begin ############# + # Creates a `NPURunConfig` that checkpoints every 115G00 steps + iterations_per_loop=flags_obj.iterations_per_loop + run_config = NPURunConfig( + model_dir=flags_obj.model_dir, + tf_random_seed=flags_obj.random_seed if flags_obj.random_seed>=0 else 0, + session_config=session_config, + keep_checkpoint_max=5, + save_checkpoints_steps=5000, + enable_data_pre_proc=True, + iterations_per_loop=iterations_per_loop, + log_step_count_steps=iterations_per_loop, + precision_mode='allow_mix_precision', + hcom_parallel=True + ) + ############## npu modify end ############### + + ############## npu modify begin ############# + # Creates a `NPUEstimator` instead of using tf.estimator.Estimator + classifier = NPUEstimator( + model_fn=model_function, model_dir=flags_obj.model_dir, config=run_config, + params={ + 'resnet_size': int(flags_obj.resnet_size), + 'data_format': flags_obj.data_format, + 'batch_size': flags_obj.batch_size, + 'resnet_version': int(flags_obj.resnet_version), + 'loss_scale': flags_core.get_loss_scale(flags_obj, + default_for_fp16=512), + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'fine_tune': flags_obj.fine_tune, + 'num_workers': num_workers, + 'num_gpus' : flags_core.get_num_gpus(flags_obj), + 'base_lr': flags_obj.base_lr, + 'cosine_lr': flags_obj.cosine_lr, + 'train_epochs': flags_obj.train_epochs, + }) + ############## npu modify end ############### + + run_params = { + 'batch_size': flags_obj.batch_size, + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'resnet_size': flags_obj.resnet_size, + 'resnet_version': flags_obj.resnet_version, + 'synthetic_data': flags_obj.use_synthetic_data, + 'train_epochs': flags_obj.train_epochs, + 'num_workers': num_workers, + } + if flags_obj.use_synthetic_data: + dataset_name = dataset_name + '-synthetic' + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info('resnet', dataset_name, run_params, + test_id=flags_obj.benchmark_test_id) + + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, + model_dir=flags_obj.model_dir, + batch_size=flags_obj.batch_size) + + def input_fn_train(num_epochs, input_context=None, rank_size=None, rank_id=None): + ############## npu modify begin ############# + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + # batch_size means single card batch instead of global batch size + return input_function( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=num_epochs, + dtype=tf.float16, + input_context=input_context, + drop_remainder=True, + rank_size=rank_size, + rank_id=rank_id, + test_mode=flags_obj.test_mode, + ) + + def input_fn_eval(): + # batch_size means single card batch instead of global batch size + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + return input_function( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=1, + dtype=tf.float16, + drop_remainder=True) + ############## npu modify end ############### + + train_epochs = (0 if flags_obj.eval_only or not flags_obj.train_epochs else + flags_obj.train_epochs) + + use_train_and_evaluate = flags_obj.use_train_and_evaluate or num_workers > 1 + if use_train_and_evaluate: + train_spec = tf.estimator.TrainSpec( + input_fn=lambda input_context=None: input_fn_train( + train_epochs, input_context=input_context, rank_size=rank_size, rank_id=rank_id), + hooks=train_hooks, + max_steps=flags_obj.max_train_steps) + eval_spec = tf.estimator.EvalSpec(input_fn=input_fn_eval) + tf.compat.v1.logging.info('Starting to train and evaluate.') + tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec) + # tf.estimator.train_and_evalute doesn't return anything in multi-worker + # case. + eval_results = {} + else: + if train_epochs == 0: + # If --eval_only is set, perform a single loop with zero train epochs. + schedule, n_loops = [0], 1 + else: + # Compute the number of times to loop while training. All but the last + # pass will train for `epochs_between_evals` epochs, while the last will + # train for the number needed to reach `training_epochs`. For instance if + # train_epochs = 25 and epochs_between_evals = 10 + # schedule will be set to [10, 10, 5]. That is to say, the loop will: + # Train for 10 epochs and then evaluate. + # Train for another 10 epochs and then evaluate. + # Train for a final 5 epochs (to reach 25 epochs) and then evaluate. + n_loops = math.ceil(train_epochs / flags_obj.epochs_between_evals) + schedule = [flags_obj.epochs_between_evals for _ in range(int(n_loops))] + schedule[-1] = train_epochs - sum(schedule[:-1]) # over counting. + + ############## npu modify begin ############# + tf.compat.v1.logging.info('schedule: %s', ','.join([str(i) for i in schedule])) + ############## npu modify end ############# + + for cycle_index, num_train_epochs in enumerate(schedule): + tf.compat.v1.logging.info('Starting cycle: %d/%d Num_train_epochs: %d', cycle_index, int(n_loops), int(num_train_epochs)) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=num_train_epochs) + if num_train_epochs: + # Since we are calling classifier.train immediately in each loop, the + # value of num_train_epochs in the lambda function will not be changed + # before it is used. So it is safe to ignore the pylint error here + # pylint: disable=cell-var-from-loop + ############## npu modify begin ############# + if flags_obj.max_train_steps is None: + classifier.train( + input_fn=lambda input_context=True: input_fn_train( + num_train_epochs, input_context=input_context, rank_size=rank_size, rank_id=rank_id), + hooks=train_hooks, + steps=(num_images['train']/flags_obj.batch_size/rank_size)*num_train_epochs // iterations_per_loop * iterations_per_loop ) # step control func.2 + else: + classifier.train( + input_fn=lambda input_context=True: input_fn_train( + num_train_epochs, input_context=input_context, rank_size=rank_size, rank_id=rank_id), + hooks=train_hooks, + max_steps=flags_obj.max_train_steps) + ############## npu modify end ############### + date_time_end = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + if cycle_index == len(schedule) - 1 and flags_obj.test_mode == False: + # flags_obj.max_train_steps is generally associated with testing and + # profiling. As a result it is frequently called with synthetic data, + # which will iterate forever. Passing steps=flags_obj.max_train_steps + # allows the eval (which is generally unimportant in those circumstances) + # to terminate. Note that eval will run for max_train_steps each loop, + # regardless of the global_step count. + tf.compat.v1.logging.info('Starting to evaluate.') + eval_results = classifier.evaluate(input_fn=input_fn_eval, + steps=num_images['validation']//flags_obj.batch_size) # step control func.1 + + benchmark_logger.log_evaluation_result(eval_results) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_results.get("accuracy"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_results.get("accuracy_top_5"))) + if model_helpers.past_stop_threshold( + flags_obj.stop_threshold, eval_results['accuracy']): + break + + if flags_obj.export_dir is not None: + # Exports a saved model for the given classifier. + export_dtype = flags_core.get_tf_dtype(flags_obj) + if flags_obj.image_bytes_as_serving_input: + input_receiver_fn = functools.partial( + image_bytes_serving_input_fn, shape, dtype=export_dtype) + else: + input_receiver_fn = export.build_tensor_serving_input_receiver_fn( + shape, batch_size=flags_obj.batch_size, dtype=export_dtype) + classifier.export_savedmodel(flags_obj.export_dir, input_receiver_fn, + strip_default_attrs=True) + + stats = {} + stats['eval_results'] = eval_results if flags_obj.test_mode == False else [] + stats['train_hooks'] = train_hooks + + return stats + + +def define_resnet_flags(resnet_size_choices=None, dynamic_loss_scale=False, + fp16_implementation=False): + """Add flags and validators for ResNet.""" + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + num_gpu=True, hooks=True, export_dir=True, + distribution_strategy=True) + flags_core.define_performance(num_parallel_calls=False, + inter_op=True, + intra_op=True, + synthetic_data=True, + dtype=True, + all_reduce_alg=True, + num_packs=True, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + dynamic_loss_scale=dynamic_loss_scale, + fp16_implementation=fp16_implementation, + loss_scale=True, + tf_data_experimental_slack=True, + max_train_steps=True) + flags_core.define_image() + flags_core.define_benchmark() + flags_core.define_distribution() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_enum( + name='resnet_version', short_name='rv', default='1', + enum_values=['1', '2'], + help=flags_core.help_wrap( + 'Version of ResNet. (1 or 2) See README.md for details.')) + flags.DEFINE_bool( + name='fine_tune', short_name='ft', default=False, + help=flags_core.help_wrap( + 'If True do not train any parameters except for the final layer.')) + flags.DEFINE_boolean( + name='eval_only', default=False, + help=flags_core.help_wrap('Skip training and only perform evaluation on ' + 'the latest checkpoint.')) + flags.DEFINE_boolean( + name='image_bytes_as_serving_input', default=False, + help=flags_core.help_wrap( + 'If True exports savedmodel with serving signature that accepts ' + 'JPEG image bytes instead of a fixed size [HxWxC] tensor that ' + 'represents the image. The former is easier to use for serving at ' + 'the expense of image resize/cropping being done as part of model ' + 'inference. Note, this flag only applies to ImageNet and cannot ' + 'be used for CIFAR.')) + flags.DEFINE_boolean( + name='use_train_and_evaluate', default=False, + help=flags_core.help_wrap( + 'If True, uses `tf.estimator.train_and_evaluate` for the training ' + 'and evaluation loop, instead of separate calls to `classifier.train ' + 'and `classifier.evaluate`, which is the default behavior.')) + flags.DEFINE_bool( + name='enable_lars', default=False, + help=flags_core.help_wrap( + 'Enable LARS optimizer for large batch training.')) + flags.DEFINE_float( + name='label_smoothing', default=0.0, + help=flags_core.help_wrap( + 'Label smoothing parameter used in the softmax_cross_entropy')) + flags.DEFINE_float( + name='weight_decay', default=1e-4, + help=flags_core.help_wrap( + 'Weight decay coefficiant for l2 regularization.')) + + ##############NPU modify####################### + flags.DEFINE_float( + name='base_lr', default=0.0, + help=flags_core.help_wrap( + 'base learning rate in training.')) + flags.DEFINE_bool( + name='cosine_lr', default=False, + help=flags_core.help_wrap( + 'Enable Cosine Learnin_rate for training.')) + flags.DEFINE_bool( + name='test_mode', default=False, + help=flags_core.help_wrap( + 'turn to test mode.')) + flags.DEFINE_integer( + name='iterations_per_loop', default=10, + help=flags_core.help_wrap( + 'setting iterations_per_loop, this config will affect performance.')) + flags.DEFINE_integer( + name='random_seed', default=-1, + help=flags_core.help_wrap( + 'setting global random_seed to make result stable.')) + ##############NPU modify end####################### + + choice_kwargs = dict( + name='resnet_size', short_name='rs', default='50', + help=flags_core.help_wrap('The size of the ResNet model to use.')) + + if resnet_size_choices is None: + flags.DEFINE_string(**choice_kwargs) + else: + flags.DEFINE_enum(enum_values=resnet_size_choices, **choice_kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/run_imagenet.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/run_imagenet.sh new file mode 100644 index 0000000..0d913a1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/run_imagenet.sh @@ -0,0 +1,27 @@ +export RANK_ID=$1 +export RANK_SIZE=$2 + +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json + +export JOB_ID=10087 +export FUSION_TENSOR_SIZE=1000000000 +#sleep 5 +python3 $3/imagenet_main.py \ +--resnet_size=101 \ +--batch_size=128 \ +--num_gpus=1 \ +--cosine_lr=True \ +--dtype=fp16 \ +--label_smoothing=0.1 \ +--loss_scale=512 \ +--train_epochs=3 \ +--epochs_between_evals=1 \ +--hooks=ExamplesPerSecondHook,loggingtensorhook,loggingmetrichook \ +--data_dir=/home/imagenet_TF \ +--model_dir=./model_dir + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/train_accuracy_rewrite.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/train_accuracy_rewrite.py new file mode 100644 index 0000000..40ca4a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/resnet/train_accuracy_rewrite.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2020/4/24 15:10 +# @Author : w00558981 +# @Site : +# @File : train_accuracy_rewrite.py + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from tensorflow.python.eager import context +from tensorflow.python.framework import dtypes,ops +from tensorflow.python.ops import array_ops,math_ops,state_ops,variable_scope,weights_broadcast_ops +from tensorflow.python.ops.metrics_impl import _remove_squeezable_dimensions,metric_variable,_aggregate_across_replicas + + +def accuracy(labels, + predictions, + weights=None, + metrics_collections=None, + updates_collections=None, + name=None): + """Calculates how often `predictions` matches `labels`. + + The `accuracy` function creates two local variables, `total` and + `count` that are used to compute the frequency with which `predictions` + matches `labels`. This frequency is ultimately returned as `accuracy`: an + idempotent operation that simply divides `total` by `count`. + + For estimation of the metric over a stream of data, the function creates an + `update_op` operation that updates these variables and returns the `accuracy`. + Internally, an `is_correct` operation computes a `Tensor` with elements 1.0 + where the corresponding elements of `predictions` and `labels` match and 0.0 + otherwise. Then `update_op` increments `total` with the reduced sum of the + product of `weights` and `is_correct`, and it increments `count` with the + reduced sum of `weights`. + + If `weights` is `None`, weights default to 1. Use weights of 0 to mask values. + + Args: + labels: The ground truth values, a `Tensor` whose shape matches + `predictions`. + predictions: The predicted values, a `Tensor` of any shape. + weights: Optional `Tensor` whose rank is either 0, or the same rank as + `labels`, and must be broadcastable to `labels` (i.e., all dimensions must + be either `1`, or the same as the corresponding `labels` dimension). + metrics_collections: An optional list of collections that `accuracy` should + be added to. + updates_collections: An optional list of collections that `update_op` should + be added to. + name: An optional variable_scope name. + + Returns: + accuracy: A `Tensor` representing the accuracy, the value of `total` divided + by `count`. + update_op: An operation that increments the `total` and `count` variables + appropriately and whose value matches `accuracy`. + + Raises: + ValueError: If `predictions` and `labels` have mismatched shapes, or if + `weights` is not `None` and its shape doesn't match `predictions`, or if + either `metrics_collections` or `updates_collections` are not a list or + tuple. + RuntimeError: If eager execution is enabled. + """ + if context.executing_eagerly(): + raise RuntimeError('tf.metrics.accuracy is not supported when eager ' + 'execution is enabled.') + + predictions, labels, weights = _remove_squeezable_dimensions( + predictions=predictions, labels=labels, weights=weights) + predictions.get_shape().assert_is_compatible_with(labels.get_shape()) + if labels.dtype != predictions.dtype: + predictions = math_ops.cast(predictions, labels.dtype) + is_correct = math_ops.cast( + math_ops.equal(predictions, labels), dtypes.float32) + return mean(is_correct, weights, metrics_collections, updates_collections, + name or 'accuracy') + + + +def mean(values, + weights=None, + metrics_collections=None, + updates_collections=None, + name=None): + """Computes the (weighted) mean of the given values. + + The `mean` function creates two local variables, `total` and `count` + that are used to compute the average of `values`. This average is ultimately + returned as `mean` which is an idempotent operation that simply divides + `total` by `count`. + + For estimation of the metric over a stream of data, the function creates an + `update_op` operation that updates these variables and returns the `mean`. + `update_op` increments `total` with the reduced sum of the product of `values` + and `weights`, and it increments `count` with the reduced sum of `weights`. + + If `weights` is `None`, weights default to 1. Use weights of 0 to mask values. + + Args: + values: A `Tensor` of arbitrary dimensions. + weights: Optional `Tensor` whose rank is either 0, or the same rank as + `values`, and must be broadcastable to `values` (i.e., all dimensions must + be either `1`, or the same as the corresponding `values` dimension). + metrics_collections: An optional list of collections that `mean` + should be added to. + updates_collections: An optional list of collections that `update_op` + should be added to. + name: An optional variable_scope name. + + Returns: + mean: A `Tensor` representing the current mean, the value of `total` divided + by `count`. + update_op: An operation that increments the `total` and `count` variables + appropriately and whose value matches `mean_value`. + + Raises: + ValueError: If `weights` is not `None` and its shape doesn't match `values`, + or if either `metrics_collections` or `updates_collections` are not a list + or tuple. + RuntimeError: If eager execution is enabled. + """ + if context.executing_eagerly(): + raise RuntimeError('tf.metrics.mean is not supported when eager execution ' + 'is enabled.') + + with variable_scope.variable_scope(name, 'mean', (values, weights)): + values = math_ops.cast(values, dtypes.float32) + + total = metric_variable([], dtypes.float32, name='total') + count = metric_variable([], dtypes.float32, name='count') + + if weights is None: + num_values = math_ops.cast(array_ops.size(values), dtypes.float32) + else: + values, _, weights = _remove_squeezable_dimensions( + predictions=values, labels=None, weights=weights) + weights = weights_broadcast_ops.broadcast_weights( + math_ops.cast(weights, dtypes.float32), values) + values = math_ops.multiply(values, weights) + num_values = math_ops.reduce_sum(weights) + + update_total_op = state_ops.assign_add(total, math_ops.reduce_sum(values)) + with ops.control_dependencies([values]): + update_count_op = state_ops.assign_add(count, num_values) + + def compute_mean(_, t, c): + return math_ops.div_no_nan(t, math_ops.maximum(c, 0), name='value') + + mean_t = _aggregate_across_replicas( + metrics_collections, compute_mean, total, count) + + #### modified to current value + update_op = math_ops.reduce_sum(values) + + if updates_collections: + ops.add_to_collections(updates_collections, update_op) + + return mean_t, update_op + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/README.md new file mode 100644 index 0000000..c680f8b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/README.md @@ -0,0 +1,380 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# Transformer Translation Model +This is an implementation of the Transformer translation model as described in the [Attention is All You Need](https://arxiv.org/abs/1706.03762) paper. Based on the code provided by the authors: [Transformer code](https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py) from [Tensor2Tensor](https://github.com/tensorflow/tensor2tensor). Also, check out the [tutorial](https://www.tensorflow.org/beta/tutorials/text/transformer) on Transformer in TF 2.0. + +**Please follow the [README](https://github.com/tensorflow/models/official/transformer/README.md), the new Keras-based TF 2 implementation, to walk through the new Transformer.** + +Transformer is a neural network architecture that solves sequence to sequence problems using attention mechanisms. Unlike traditional neural seq2seq models, Transformer does not involve recurrent connections. The attention mechanism learns dependencies between tokens in two sequences. Since attention weights apply to all tokens in the sequences, the Transformer model is able to easily capture long-distance dependencies. + +Transformer's overall structure follows the standard encoder-decoder pattern. The encoder uses self-attention to compute a representation of the input sequence. The decoder generates the output sequence one token at a time, taking the encoder output and previous decoder-outputted tokens as inputs. + +The model also applies embeddings on the input and output tokens, and adds a constant positional encoding. The positional encoding adds information about the position of each token. + +## Contents + * [Contents](#contents) + * [Walkthrough](#walkthrough) + * [Benchmarks](#benchmarks) + * [Training times](#training-times) + * [Evaluation results](#evaluation-results) + * [Detailed instructions](#detailed-instructions) + * [Environment preparation](#environment-preparation) + * [Download and preprocess datasets](#download-and-preprocess-datasets) + * [Model training and evaluation](#model-training-and-evaluation) + * [Translate using the model](#translate-using-the-model) + * [Compute official BLEU score](#compute-official-bleu-score) + * [TPU](#tpu) + * [Export trained model](#export-trained-model) + * [Example translation](#example-translation) + * [Implementation overview](#implementation-overview) + * [Model Definition](#model-definition) + * [Model Estimator](#model-estimator) + * [Other scripts](#other-scripts) + * [Test dataset](#test-dataset) + * [Term definitions](#term-definitions) + +## Walkthrough + +Below are the commands for running the Transformer model. See the +[Detailed instructions](#detailed-instructions) for more details on running the +model. + +``` +cd /path/to/models/official/transformer + +# Ensure that PYTHONPATH is correctly defined as described in +# https://github.com/tensorflow/models/tree/master/official#requirements +# export PYTHONPATH="$PYTHONPATH:/path/to/models" + +# Export variables +PARAM_SET=big +DATA_DIR=$HOME/transformer/data +MODEL_DIR=$HOME/transformer/model_$PARAM_SET +VOCAB_FILE=$DATA_DIR/vocab.ende.32768 + +# Download training/evaluation/test datasets +python data_download.py --data_dir=$DATA_DIR + +# Train the model for 10 epochs, and evaluate after every epoch. +python transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR \ + --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET \ + --bleu_source=$DATA_DIR/newstest2014.en --bleu_ref=$DATA_DIR/newstest2014.de + +# Run during training in a separate process to get continuous updates, +# or after training is complete. +tensorboard --logdir=$MODEL_DIR + +# Translate some text using the trained model +python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ + --param_set=$PARAM_SET --text="hello world" + +# Compute model's BLEU score using the newstest2014 dataset. +python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ + --param_set=$PARAM_SET --file=$DATA_DIR/newstest2014.en --file_out=translation.en +python compute_bleu.py --translation=translation.en --reference=$DATA_DIR/newstest2014.de +``` + +## Benchmarks +### Training times + +Currently, both big and base parameter sets run on a single GPU. The measurements below +are reported from running the model on a P100 GPU. + +Param Set | batches/sec | batches per epoch | time per epoch +--- | --- | --- | --- +base | 4.8 | 83244 | 4 hr +big | 1.1 | 41365 | 10 hr + +### Evaluation results +Below are the case-insensitive BLEU scores after 10 epochs. + +Param Set | Score +--- | --- | +base | 27.7 +big | 28.9 + + +## Detailed instructions + + +0. ### Environment preparation + + #### Add models repo to PYTHONPATH + Follow the instructions described in the [Requirements](https://github.com/tensorflow/models/tree/master/official#requirements) section to add the models folder to the python path. + + #### Export variables (optional) + + Export the following variables, or modify the values in each of the snippets below: + ``` + PARAM_SET=big + DATA_DIR=$HOME/transformer/data + MODEL_DIR=$HOME/transformer/model_$PARAM_SET + VOCAB_FILE=$DATA_DIR/vocab.ende.32768 + ``` + +1. ### Download and preprocess datasets + + [data_download.py](data_download.py) downloads and preprocesses the training and evaluation WMT datasets. After the data is downloaded and extracted, the training data is used to generate a vocabulary of subtokens. The evaluation and training strings are tokenized, and the resulting data is sharded, shuffled, and saved as TFRecords. + + 1.75GB of compressed data will be downloaded. In total, the raw files (compressed, extracted, and combined files) take up 8.4GB of disk space. The resulting TFRecord and vocabulary files are 722MB. The script takes around 40 minutes to run, with the bulk of the time spent downloading and ~15 minutes spent on preprocessing. + + Command to run: + ``` + python data_download.py --data_dir=$DATA_DIR + ``` + + Arguments: + * `--data_dir`: Path where the preprocessed TFRecord data, and vocab file will be saved. + * Use the `--help` or `-h` flag to get a full list of possible arguments. + +2. ### Model training and evaluation + + [transformer_main.py](transformer_main.py) creates a Transformer model, and trains it using Tensorflow Estimator. + + Command to run: + ``` + python transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR \ + --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET + ``` + + Arguments: + * `--data_dir`: This should be set to the same directory given to the `data_download`'s `data_dir` argument. + * `--model_dir`: Directory to save Transformer model training checkpoints. + * `--vocab_file`: Path to subtoken vocabulary file. If data_download was used, you may find the file in `data_dir`. + * `--param_set`: Parameter set to use when creating and training the model. Options are `base` and `big` (default). + * Use the `--help` or `-h` flag to get a full list of possible arguments. + + #### Customizing training schedule + + By default, the model will train for 10 epochs, and evaluate after every epoch. The training schedule may be defined through the flags: + * Training with epochs (default): + * `--train_epochs`: The total number of complete passes to make through the dataset + * `--epochs_between_evals`: The number of epochs to train between evaluations. + * Training with steps: + * `--train_steps`: sets the total number of training steps to run. + * `--steps_between_evals`: Number of training steps to run between evaluations. + + Only one of `train_epochs` or `train_steps` may be set. Since the default option is to evaluate the model after training for an epoch, it may take 4 or more hours between model evaluations. To get more frequent evaluations, use the flags `--train_steps=250000 --steps_between_evals=1000`. + + Note: At the beginning of each training session, the training dataset is reloaded and shuffled. Stopping the training before completing an epoch may result in worse model quality, due to the chance that some examples may be seen more than others. Therefore, it is recommended to use epochs when the model quality is important. + + #### Compute BLEU score during model evaluation + + Use these flags to compute the BLEU when the model evaluates: + * `--bleu_source`: Path to file containing text to translate. + * `--bleu_ref`: Path to file containing the reference translation. + * `--stop_threshold`: Train until the BLEU score reaches this lower bound. This setting overrides the `--train_steps` and `--train_epochs` flags. + + When running `transformer_main.py`, use the flags: `--bleu_source=$DATA_DIR/newstest2014.en --bleu_ref=$DATA_DIR/newstest2014.de` + + #### Tensorboard + Training and evaluation metrics (loss, accuracy, approximate BLEU score, etc.) are logged, and can be displayed in the browser using Tensorboard. + ``` + tensorboard --logdir=$MODEL_DIR + ``` + The values are displayed at [localhost:6006](localhost:6006). + +3. ### Translate using the model + [translate.py](translate.py) contains the script to use the trained model to translate input text or file. Each line in the file is translated separately. + + Command to run: + ``` + python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ + --param_set=$PARAM_SET --text="hello world" + ``` + + Arguments for initializing the Subtokenizer and trained model: + * `--model_dir` and `--param_set`: These parameters are used to rebuild the trained model + * `--vocab_file`: Path to subtoken vocabulary file. If data_download was used, you may find the file in `data_dir`. + + Arguments for specifying what to translate: + * `--text`: Text to translate + * `--file`: Path to file containing text to translate + * `--file_out`: If `--file` is set, then this file will store the input file's translations. + + To translate the newstest2014 data, run: + ``` + python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ + --param_set=$PARAM_SET --file=$DATA_DIR/newstest2014.en --file_out=translation.en + ``` + + Translating the file takes around 15 minutes on a GTX1080, or 5 minutes on a P100. + +4. ### Compute official BLEU score + Use [compute_bleu.py](compute_bleu.py) to compute the BLEU by comparing generated translations to the reference translation. + + Command to run: + ``` + python compute_bleu.py --translation=translation.en --reference=$DATA_DIR/newstest2014.de + ``` + + Arguments: + * `--translation`: Path to file containing generated translations. + * `--reference`: Path to file containing reference translations. + * Use the `--help` or `-h` flag to get a full list of possible arguments. + +5. ### TPU + TPU support for this version of Transformer is experimental. Currently it is present for + demonstration purposes only, but will be optimized in the coming weeks. + +## Export trained model +To export the model as a Tensorflow [SavedModel](https://www.tensorflow.org/guide/saved_model) format, use the argument `--export_dir` when running `transformer_main.py`. A folder will be created in the directory with the name as the timestamp (e.g. $EXPORT_DIR/1526427396). + +``` +EXPORT_DIR=$HOME/transformer/saved_model +python transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR \ + --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET --export_model=$EXPORT_DIR +``` + +To inspect the SavedModel, use saved_model_cli: +``` +SAVED_MODEL_DIR=$EXPORT_DIR/{TIMESTAMP} # replace {TIMESTAMP} with the name of the folder created +saved_model_cli show --dir=$SAVED_MODEL_DIR --all +``` + +### Example translation +Let's translate **"hello world!"**, **"goodbye world."**, and **"Would you like some pie?"**. + +The SignatureDef for "translate" is: + + signature_def['translate']: + The given SavedModel SignatureDef contains the following input(s): + inputs['input'] tensor_info: + dtype: DT_INT64 + shape: (-1, -1) + name: Placeholder:0 + The given SavedModel SignatureDef contains the following output(s): + outputs['outputs'] tensor_info: + dtype: DT_INT32 + shape: (-1, -1) + name: model/Transformer/strided_slice_19:0 + outputs['scores'] tensor_info: + dtype: DT_FLOAT + shape: (-1) + name: model/Transformer/strided_slice_20:0 + +Follow the steps below to use the translate signature def: + +1. #### Encode the inputs to integer arrays. + This can be done using `utils.tokenizer.Subtokenizer`, and the vocab file in the SavedModel assets (`$SAVED_MODEL_DIR/assets.extra/vocab.txt`). + + ``` + from official.transformer.utils.tokenizer import Subtokenizer + s = Subtokenizer(PATH_TO_VOCAB_FILE) + print(s.encode("hello world!", add_eos=True)) + ``` + + The encoded inputs are: + * `"hello world!" = [6170, 3731, 178, 207, 1]` + * `"goodbye world." = [15431, 13966, 36, 178, 3, 1]` + * `"Would you like some pie?" = [9092, 72, 155, 202, 19851, 102, 1]` + +2. #### Run `saved_model_cli` to obtain the predicted translations + The encoded inputs should be padded so that they are the same length. The padding token is `0`. + ``` + ENCODED_INPUTS="[[26228, 145, 178, 1, 0, 0, 0], \ + [15431, 13966, 36, 178, 3, 1, 0], \ + [9092, 72, 155, 202, 19851, 102, 1]]" + ``` + + Now, use the `run` command with `saved_model_cli` to get the outputs. + + ``` + saved_model_cli run --dir=$SAVED_MODEL_DIR --tag_set=serve --signature_def=translate \ + --input_expr="input=$ENCODED_INPUTS" + ``` + + The outputs will look similar to: + ``` + Result for output key outputs: + [[18744 145 297 1 0 0 0 0 0 0 0 0 + 0 0] + [ 5450 4642 21 11 297 3 1 0 0 0 0 0 + 0 0] + [25940 22 66 103 21713 31 102 1 0 0 0 0 + 0 0]] + Result for output key scores: + [-1.5493642 -1.4032784 -3.252089 ] + ``` + +3. #### Decode the outputs to strings. + Use the `Subtokenizer` and vocab file as described in step 1 to decode the output integer arrays. + ``` + from official.transformer.utils.tokenizer import Subtokenizer + s = Subtokenizer(PATH_TO_VOCAB_FILE) + print(s.decode([18744, 145, 297, 1])) + ``` + The decoded outputs from above are: + * `[18744, 145, 297, 1] = "Hallo Welt"` + * `[5450, 4642, 21, 11, 297, 3, 1] = "Abschied von der Welt."` + * `[25940, 22, 66, 103, 21713, 31, 102, 1] = "Möchten Sie einen Kuchen?"` + +## Implementation overview + +A brief look at each component in the code: + +### Model Definition +The [model](model) subdirectory contains the implementation of the Transformer model. The following files define the Transformer model and its layers: +* [transformer.py](model/transformer.py): Defines the transformer model and its encoder/decoder layer stacks. +* [embedding_layer.py](model/embedding_layer.py): Contains the layer that calculates the embeddings. The embedding weights are also used to calculate the pre-softmax probabilities from the decoder output. +* [attention_layer.py](model/attention_layer.py): Defines the multi-headed and self attention layers that are used in the encoder/decoder stacks. +* [ffn_layer.py](model/ffn_layer.py): Defines the feedforward network that is used in the encoder/decoder stacks. The network is composed of 2 fully connected layers. + +Other files: +* [beam_search.py](model/beam_search.py) contains the beam search implementation, which is used during model inference to find high scoring translations. +* [model_params.py](model/model_params.py) contains the parameters used for the big and base models. +* [model_utils.py](model/model_utils.py) defines some helper functions used in the model (calculating padding, bias, etc.). + + +### Model Estimator +[transformer_main.py](model/transformer.py) creates an `Estimator` to train and evaluate the model. + +Helper functions: +* [utils/dataset.py](utils/dataset.py): contains functions for creating a `dataset` that is passed to the `Estimator`. +* [utils/metrics.py](utils/metrics.py): defines metrics functions used by the `Estimator` to evaluate the + +### Other scripts + +Aside from the main file to train the Transformer model, we provide other scripts for using the model or downloading the data: + +#### Data download and preprocessing + +[data_download.py](data_download.py) downloads and extracts data, then uses `Subtokenizer` to tokenize strings into arrays of int IDs. The int arrays are converted to `tf.Examples` and saved in the `tf.RecordDataset` format. + + The data is downloaded from the Workshop of Machine Translation (WMT) [news translation task](http://www.statmt.org/wmt17/translation-task.html). The following datasets are used: + + * Europarl v7 + * Common Crawl corpus + * News Commentary v12 + + See the [download section](http://www.statmt.org/wmt17/translation-task.html#download) to explore the raw datasets. The parameters in this model are tuned to fit the English-German translation data, so the EN-DE texts are extracted from the downloaded compressed files. + +The text is transformed into arrays of integer IDs using the `Subtokenizer` defined in [`utils/tokenizer.py`](util/tokenizer.py). During initialization of the `Subtokenizer`, the raw training data is used to generate a vocabulary list containing common subtokens. + +The target vocabulary size of the WMT dataset is 32,768. The set of subtokens is found through binary search on the minimum number of times a subtoken appears in the data. The actual vocabulary size is 33,708, and is stored in a 324kB file. + +#### Translation +Translation is defined in [translate.py](translate.py). First, `Subtokenizer` tokenizes the input. The vocabulary file is the same used to tokenize the training/eval files. Next, beam search is used to find the combination of tokens that maximizes the probability outputted by the model decoder. The tokens are then converted back to strings with `Subtokenizer`. + +#### BLEU computation +[compute_bleu.py](compute_bleu.py): Implementation from [https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/bleu_hook.py](https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/utils/bleu_hook.py). + +### Test dataset +The [newstest2014 files](https://storage.googleapis.com/tf-perf-public/official_transformer/test_data/newstest2014.tgz) +are extracted from the [NMT Seq2Seq tutorial](https://google.github.io/seq2seq/nmt/#download-data). +The raw text files are converted from the SGM format of the +[WMT 2016](http://www.statmt.org/wmt16/translation-task.html) test sets. The +newstest2014 files are put into the `$DATA_DIR` when executing +`data_download.py` + +## Term definitions + +**Steps / Epochs**: +* Step: unit for processing a single batch of data +* Epoch: a complete run through the dataset + +Example: Consider a training a dataset with 100 examples that is divided into 20 batches with 5 examples per batch. A single training step trains the model on one batch. After 20 training steps, the model will have trained on every batch in the dataset, or one epoch. + +**Subtoken**: Words are referred to as tokens, and parts of words are referred to as 'subtokens'. For example, the word 'inclined' may be split into `['incline', 'd_']`. The '\_' indicates the end of the token. The subtoken vocabulary list is guaranteed to contain the alphabet (including numbers and special characters), so all words can be tokenized. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/attention_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/attention_layer.py new file mode 100644 index 0000000..e353793 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/attention_layer.py @@ -0,0 +1,148 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of multiheaded attention and self-attention layers.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v1 as tf + + +class Attention(tf.layers.Layer): + """Multi-headed attention layer.""" + + def __init__(self, hidden_size, num_heads, attention_dropout, train): + if hidden_size % num_heads != 0: + raise ValueError("Hidden size must be evenly divisible by the number of " + "heads.") + + super(Attention, self).__init__() + self.hidden_size = hidden_size + self.num_heads = num_heads + self.attention_dropout = attention_dropout + self.train = train + + # Layers for linearly projecting the queries, keys, and values. + self.q_dense_layer = tf.layers.Dense(hidden_size, use_bias=False, name="q") + self.k_dense_layer = tf.layers.Dense(hidden_size, use_bias=False, name="k") + self.v_dense_layer = tf.layers.Dense(hidden_size, use_bias=False, name="v") + + self.output_dense_layer = tf.layers.Dense(hidden_size, use_bias=False, + name="output_transform") + + def split_heads(self, x): + """Split x into different heads, and transpose the resulting value. + + The tensor is transposed to insure the inner dimensions hold the correct + values during the matrix multiplication. + + Args: + x: A tensor with shape [batch_size, length, hidden_size] + + Returns: + A tensor with shape [batch_size, num_heads, length, hidden_size/num_heads] + """ + with tf.name_scope("split_heads"): + batch_size = tf.shape(x)[0] + length = tf.shape(x)[1] + + # Calculate depth of last dimension after it has been split. + depth = (self.hidden_size // self.num_heads) + + # Split the last dimension + x = tf.reshape(x, [batch_size, length, self.num_heads, depth]) + + # Transpose the result + return tf.transpose(x, [0, 2, 1, 3]) + + def combine_heads(self, x): + """Combine tensor that has been split. + + Args: + x: A tensor [batch_size, num_heads, length, hidden_size/num_heads] + + Returns: + A tensor with shape [batch_size, length, hidden_size] + """ + with tf.name_scope("combine_heads"): + batch_size = tf.shape(x)[0] + length = tf.shape(x)[2] + x = tf.transpose(x, [0, 2, 1, 3]) # --> [batch, length, num_heads, depth] + return tf.reshape(x, [batch_size, length, self.hidden_size]) + + def call(self, x, y, bias, cache=None): + """Apply attention mechanism to x and y. + + Args: + x: a tensor with shape [batch_size, length_x, hidden_size] + y: a tensor with shape [batch_size, length_y, hidden_size] + bias: attention bias that will be added to the result of the dot product. + cache: (Used during prediction) dictionary with tensors containing results + of previous attentions. The dictionary must have the items: + {"k": tensor with shape [batch_size, i, key_channels], + "v": tensor with shape [batch_size, i, value_channels]} + where i is the current decoded length. + + Returns: + Attention layer output with shape [batch_size, length_x, hidden_size] + """ + # Linearly project the query (q), key (k) and value (v) using different + # learned projections. This is in preparation of splitting them into + # multiple heads. Multi-head attention uses multiple queries, keys, and + # values rather than regular attention (which uses a single q, k, v). + q = self.q_dense_layer(x) + k = self.k_dense_layer(y) + v = self.v_dense_layer(y) + + if cache is not None: + # Combine cached keys and values with new keys and values. + k = tf.concat([cache["k"], k], axis=1) + v = tf.concat([cache["v"], v], axis=1) + + # Update cache + cache["k"] = k + cache["v"] = v + + # Split q, k, v into heads. + q = self.split_heads(q) + k = self.split_heads(k) + v = self.split_heads(v) + + # Scale q to prevent the dot product between q and k from growing too large. + depth = (self.hidden_size // self.num_heads) + q *= depth ** -0.5 + + # Calculate dot product attention + logits = tf.matmul(q, k, transpose_b=True) + logits += bias + weights = tf.nn.softmax(logits, name="attention_weights") + if self.train: + weights = tf.nn.dropout(weights, 1.0 - self.attention_dropout) + attention_output = tf.matmul(weights, v) + + # Recombine heads --> [batch_size, length, hidden_size] + attention_output = self.combine_heads(attention_output) + + # Run the combined outputs through another linear projection layer. + attention_output = self.output_dense_layer(attention_output) + return attention_output + + +class SelfAttention(Attention): + """Multiheaded self-attention layer.""" + + def call(self, x, bias, cache=None): + return super(SelfAttention, self).call(x, x, bias, cache) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/dataset.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/dataset.py new file mode 100644 index 0000000..4798774 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/dataset.py @@ -0,0 +1,284 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Input pipeline for the transformer model to read, filter, and batch examples. + +Two things to note in the pipeline: + +1. Batching scheme + + The examples encoded in the TFRecord files contain data in the format: + {"inputs": [variable length array of integers], + "targets": [variable length array of integers]} + Where integers in the arrays refer to tokens in the English and German vocab + file (named `vocab.ende.32768`). + + Prior to batching, elements in the dataset are grouped by length (max between + "inputs" and "targets" length). Each group is then batched such that: + group_batch_size * length <= batch_size. + + Another way to view batch_size is the maximum number of tokens in each batch. + + Once batched, each element in the dataset will have the shape: + {"inputs": [group_batch_size, padded_input_length], + "targets": [group_batch_size, padded_target_length]} + Lengths are padded to the longest "inputs" or "targets" sequence in the batch + (padded_input_length and padded_target_length can be different). + + This batching scheme decreases the fraction of padding tokens per training + batch, thus improving the training speed significantly. + +2. Shuffling + + While training, the dataset is shuffled in two places in the code. The first + is the list of training files. Second, while reading records using + `parallel_interleave`, the `sloppy` argument is used to generate randomness + in the order of the examples. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import os + +import tensorflow.compat.v1 as tf + +from official.utils.misc import model_helpers + +# Buffer size for reading records from a TFRecord file. Each training file is +# 7.2 MB, so 8 MB allows an entire file to be kept in memory. +_READ_RECORD_BUFFER = 8 * 1000 * 1000 + +# Example grouping constants. Defines length boundaries for each group. +# These values are the defaults used in Tensor2Tensor. +_MIN_BOUNDARY = 8 +_BOUNDARY_SCALE = 1.1 + + +def _load_records(filename): + """Read file and return a dataset of tf.Examples.""" + return tf.data.TFRecordDataset(filename, buffer_size=_READ_RECORD_BUFFER) + + +def _parse_example(serialized_example): + """Return inputs and targets Tensors from a serialized tf.Example.""" + data_fields = { + "inputs": tf.VarLenFeature(tf.int64), + "targets": tf.VarLenFeature(tf.int64) + } + parsed = tf.parse_single_example(serialized_example, data_fields) + inputs = tf.sparse_tensor_to_dense(parsed["inputs"]) + targets = tf.sparse_tensor_to_dense(parsed["targets"]) + return inputs, targets + + +def _filter_max_length(example, max_length=256): + """Indicates whether the example's length is lower than the maximum length.""" + return tf.logical_and(tf.size(example[0]) <= max_length, + tf.size(example[1]) <= max_length) + + +def _get_example_length(example): + """Returns the maximum length between the example inputs and targets.""" + length = tf.maximum(tf.shape(example[0])[0], tf.shape(example[1])[0]) + return length + + +def _create_min_max_boundaries( + max_length, min_boundary=_MIN_BOUNDARY, boundary_scale=_BOUNDARY_SCALE): + """Create min and max boundary lists up to max_length. + + For example, when max_length=24, min_boundary=4 and boundary_scale=2, the + returned values will be: + buckets_min = [0, 4, 8, 16, 24] + buckets_max = [4, 8, 16, 24, 25] + + Args: + max_length: The maximum length of example in dataset. + min_boundary: Minimum length in boundary. + boundary_scale: Amount to scale consecutive boundaries in the list. + + Returns: + min and max boundary lists + + """ + # Create bucket boundaries list by scaling the previous boundary or adding 1 + # (to ensure increasing boundary sizes). + bucket_boundaries = [] + x = min_boundary + while x < max_length: + bucket_boundaries.append(x) + x = max(x + 1, int(x * boundary_scale)) + + # Create min and max boundary lists from the initial list. + buckets_min = [0] + bucket_boundaries + buckets_max = bucket_boundaries + [max_length + 1] + return buckets_min, buckets_max + + +def _batch_examples(dataset, batch_size, max_length): + """Group examples by similar lengths, and return batched dataset. + + Each batch of similar-length examples are padded to the same length, and may + have different number of elements in each batch, such that: + group_batch_size * padded_length <= batch_size. + + This decreases the number of padding tokens per batch, which improves the + training speed. + + Args: + dataset: Dataset of unbatched examples. + batch_size: Max number of tokens per batch of examples. + max_length: Max number of tokens in an example input or target sequence. + + Returns: + Dataset of batched examples with similar lengths. + """ + # Get min and max boundary lists for each example. These are used to calculate + # the `bucket_id`, which is the index at which: + # buckets_min[bucket_id] <= len(example) < buckets_max[bucket_id] + # Note that using both min and max lists improves the performance. + buckets_min, buckets_max = _create_min_max_boundaries(max_length) + + # Create list of batch sizes for each bucket_id, so that + # bucket_batch_size[bucket_id] * buckets_max[bucket_id] <= batch_size + bucket_batch_sizes = [batch_size // x for x in buckets_max] + # bucket_id will be a tensor, so convert this list to a tensor as well. + bucket_batch_sizes = tf.constant(bucket_batch_sizes, dtype=tf.int64) + + def example_to_bucket_id(example_input, example_target): + """Return int64 bucket id for this example, calculated based on length.""" + seq_length = _get_example_length((example_input, example_target)) + + # TODO: investigate whether removing code branching improves performance. + conditions_c = tf.logical_and( + tf.less_equal(buckets_min, seq_length), + tf.less(seq_length, buckets_max)) + bucket_id = tf.reduce_min(tf.where(conditions_c)) + return bucket_id + + def window_size_fn(bucket_id): + """Return number of examples to be grouped when given a bucket id.""" + return bucket_batch_sizes[bucket_id] + + def batching_fn(bucket_id, grouped_dataset): + """Batch and add padding to a dataset of elements with similar lengths.""" + bucket_batch_size = window_size_fn(bucket_id) + + # Batch the dataset and add padding so that all input sequences in the + # examples have the same length, and all target sequences have the same + # lengths as well. Resulting lengths of inputs and targets can differ. + return grouped_dataset.padded_batch(bucket_batch_size, ([None], [None])) + + return dataset.apply(tf.data.experimental.group_by_window( + key_func=example_to_bucket_id, + reduce_func=batching_fn, + window_size=None, + window_size_func=window_size_fn)) + + +def _read_and_batch_from_files( + file_pattern, batch_size, max_length, num_parallel_calls, shuffle, repeat, + static_batch=False): + """Create dataset where each item is a dict of "inputs" and "targets". + + Args: + file_pattern: String used to match the input TFRecord files. + batch_size: Maximum number of tokens per batch of examples + max_length: Maximum number of tokens per example + num_parallel_calls: Number of cpu cores for parallel input processing. + shuffle: If true, randomizes order of elements. + repeat: Number of times to repeat the dataset. If None, the dataset is + repeated forever. + static_batch: Whether the batches in the dataset should have static shapes. + If True, the input is batched so that every batch has the + shape [batch_size // max_length, max_length]. If False, the input is + grouped by length, and batched so that batches may have different + shapes [N, M], where: + N * M <= batch_size + M <= max_length + In general, this setting should be False. Dynamic shapes allow the inputs + to be grouped so that the number of padding tokens is minimized, and helps + model training. In cases where the input shape must be static + (e.g. running on TPU), this setting should be set to True. + + Returns: + tf.data.Dataset object containing examples loaded from the files. + """ + dataset = tf.data.Dataset.list_files(file_pattern, shuffle=shuffle) + + # Read files and interleave results. When training, the order of the examples + # will be non-deterministic. + dataset = dataset.apply( + tf.data.experimental.parallel_interleave( + _load_records, sloppy=shuffle, cycle_length=num_parallel_calls)) + + # Parse each tf.Example into a dictionary + # TODO: Look into prefetch_input_elements for performance optimization. + dataset = dataset.map(_parse_example, + num_parallel_calls=num_parallel_calls) + + # Remove examples where the input or target length exceeds the maximum length, + dataset = dataset.filter(lambda x, y: _filter_max_length((x, y), max_length)) + + if static_batch: + dataset = dataset.padded_batch( + batch_size // max_length, ([max_length], [max_length]), + drop_remainder=True) + else: + # Group and batch such that each batch has examples of similar length. + dataset = _batch_examples(dataset, batch_size, max_length) + + dataset = dataset.repeat(repeat) + + # Prefetch the next element to improve speed of input pipeline. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return dataset + + +def _generate_synthetic_data(params): + """Create synthetic data based on the parameter batch size.""" + batch = length = int(math.sqrt(params["batch_size"])) + return model_helpers.generate_synthetic_data( + input_shape=tf.TensorShape([batch, length]), + input_value=1, + input_dtype=tf.int32, + label_shape=tf.TensorShape([batch, length]), + label_value=1, + label_dtype=tf.int32, + ) + + +def train_input_fn(params): + """Load and return dataset of batched examples for use during training.""" + file_pattern = os.path.join(params["data_dir"] or "", "*train*") + if params["use_synthetic_data"]: + return _generate_synthetic_data(params) + return _read_and_batch_from_files( + file_pattern, params["batch_size"], params["max_length"], + params["num_parallel_calls"], shuffle=True, + repeat=params["repeat_dataset"], static_batch=params["static_batch"]) + + +def eval_input_fn(params): + """Load and return dataset of batched examples for use during evaluation.""" + file_pattern = os.path.join(params["data_dir"] or "", "*dev*") + if params["use_synthetic_data"]: + return _generate_synthetic_data(params) + return _read_and_batch_from_files( + file_pattern, params["batch_size"], params["max_length"], + params["num_parallel_calls"], shuffle=False, repeat=1, + static_batch=params["static_batch"]) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/embedding_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/embedding_layer.py new file mode 100644 index 0000000..3ebedea --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/embedding_layer.py @@ -0,0 +1,108 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of embedding layer with shared weights.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v1 as tf # pylint: disable=g-bad-import-order + +from official.r1.utils import tpu as tpu_utils + + +class EmbeddingSharedWeights(tf.layers.Layer): + """Calculates input embeddings and pre-softmax linear with shared weights.""" + + def __init__(self, vocab_size, hidden_size, method="gather"): + """Specify characteristic parameters of embedding layer. + + Args: + vocab_size: Number of tokens in the embedding. (Typically ~32,000) + hidden_size: Dimensionality of the embedding. (Typically 512 or 1024) + method: Strategy for performing embedding lookup. "gather" uses tf.gather + which performs well on CPUs and GPUs, but very poorly on TPUs. "matmul" + one-hot encodes the indicies and formulates the embedding as a sparse + matrix multiplication. The matmul formulation is wasteful as it does + extra work, however matrix multiplication is very fast on TPUs which + makes "matmul" considerably faster than "gather" on TPUs. + """ + super(EmbeddingSharedWeights, self).__init__() + self.vocab_size = vocab_size + self.hidden_size = hidden_size + if method not in ("gather", "matmul"): + raise ValueError("method {} must be 'gather' or 'matmul'".format(method)) + self.method = method + + def build(self, _): + with tf.variable_scope("embedding_and_softmax", reuse=tf.AUTO_REUSE): + # Create and initialize weights. The random normal initializer was chosen + # randomly, and works well. + self.shared_weights = tf.get_variable( + "weights", [self.vocab_size, self.hidden_size], + initializer=tf.random_normal_initializer( + 0., self.hidden_size ** -0.5)) + + self.built = True + + def call(self, x): + """Get token embeddings of x. + + Args: + x: An int64 tensor with shape [batch_size, length] + Returns: + embeddings: float32 tensor with shape [batch_size, length, embedding_size] + padding: float32 tensor with shape [batch_size, length] indicating the + locations of the padding tokens in x. + """ + with tf.name_scope("embedding"): + # Create binary mask of size [batch_size, length] + mask = tf.to_float(tf.not_equal(x, 0)) + + if self.method == "gather": + embeddings = tf.gather(self.shared_weights, x) + embeddings *= tf.expand_dims(mask, -1) + else: # matmul + embeddings = tpu_utils.embedding_matmul( + embedding_table=self.shared_weights, + values=tf.cast(x, dtype=tf.int32), + mask=mask + ) + # embedding_matmul already zeros out masked positions, so + # `embeddings *= tf.expand_dims(mask, -1)` is unnecessary. + + + # Scale embedding by the sqrt of the hidden size + embeddings *= self.hidden_size ** 0.5 + + return embeddings + + + def linear(self, x): + """Computes logits by running x through a linear layer. + + Args: + x: A float32 tensor with shape [batch_size, length, hidden_size] + Returns: + float32 tensor with shape [batch_size, length, vocab_size]. + """ + with tf.name_scope("presoftmax_linear"): + batch_size = tf.shape(x)[0] + length = tf.shape(x)[1] + + x = tf.reshape(x, [-1, self.hidden_size]) + logits = tf.matmul(x, self.shared_weights, transpose_b=True) + + return tf.reshape(logits, [batch_size, length, self.vocab_size]) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/ffn_layer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/ffn_layer.py new file mode 100644 index 0000000..fc47503 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/ffn_layer.py @@ -0,0 +1,89 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Implementation of fully connected network.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v1 as tf + + +class FeedFowardNetwork(tf.layers.Layer): + """Fully connected feedforward network.""" + + def __init__(self, hidden_size, filter_size, relu_dropout, train, allow_pad): + super(FeedFowardNetwork, self).__init__() + self.hidden_size = hidden_size + self.filter_size = filter_size + self.relu_dropout = relu_dropout + self.train = train + self.allow_pad = allow_pad + + self.filter_dense_layer = tf.layers.Dense( + filter_size, use_bias=True, activation=tf.nn.relu, name="filter_layer") + self.output_dense_layer = tf.layers.Dense( + hidden_size, use_bias=True, name="output_layer") + + def call(self, x, padding=None): + """Return outputs of the feedforward network. + + Args: + x: tensor with shape [batch_size, length, hidden_size] + padding: (optional) If set, the padding values are temporarily removed + from x (provided self.allow_pad is set). The padding values are placed + back in the output tensor in the same locations. + shape [batch_size, length] + + Returns: + Output of the feedforward network. + tensor with shape [batch_size, length, hidden_size] + """ + padding = None if not self.allow_pad else padding + + # Retrieve dynamically known shapes + batch_size = tf.shape(x)[0] + length = tf.shape(x)[1] + + if padding is not None: + with tf.name_scope("remove_padding"): + # Flatten padding to [batch_size*length] + pad_mask = tf.reshape(padding, [-1]) + + nonpad_ids = tf.to_int32(tf.where(pad_mask < 1e-9)) + + # Reshape x to [batch_size*length, hidden_size] to remove padding + x = tf.reshape(x, [-1, self.hidden_size]) + x = tf.gather_nd(x, indices=nonpad_ids) + + # Reshape x from 2 dimensions to 3 dimensions. + x.set_shape([None, self.hidden_size]) + x = tf.expand_dims(x, axis=0) + + output = self.filter_dense_layer(x) + if self.train: + output = tf.nn.dropout(output, 1.0 - self.relu_dropout) + output = self.output_dense_layer(output) + + if padding is not None: + with tf.name_scope("re_add_padding"): + output = tf.squeeze(output, axis=0) + output = tf.scatter_nd( + indices=nonpad_ids, + updates=output, + shape=[batch_size * length, self.hidden_size] + ) + output = tf.reshape(output, [batch_size, length, self.hidden_size]) + return output diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule.py new file mode 100644 index 0000000..60aedff --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule.py @@ -0,0 +1,130 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Abstract training on a step or epoch basis.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import tensorflow.compat.v1 as tf + + +_TRAIN, _EVAL = tf.estimator.ModeKeys.TRAIN, tf.estimator.ModeKeys.EVAL + + +NUM_EXAMPLES = { + tf.estimator.ModeKeys.TRAIN: 4572160, + # # Examples that are too long are filtered out, thus the total is less + # # than the total number of lines. + # 2399123 + # news-commentary-v12.de-en + # 1920209 + # commoncrawl.de-en + # 270769, # europarl-v7.de-en + tf.estimator.ModeKeys.EVAL: 3000, # newstest2013 +} + + +class Manager(object): + """Container for convenience functions to abstract step or epoch basis. + Transformer allows users to specify an epoch basis (generally recommended for + full training) or a number of steps basis (convenient since epochs are rather + large). TPUs furthermore require a step basis; however epochs are the norm in + the machine learning community and it is desirable to allow users to specify + epochs even when running with TPUS which requires behind the scenes + conversions. + This container simply groups what are largely mundane checks and conversions + rather than interspersing them throughout the run loop code. + """ + + def __init__(self, train_steps, steps_between_evals, train_epochs, + epochs_between_evals, default_train_epochs, batch_size, + max_length, use_tpu=False, num_tpu_shards=8): + if train_steps and train_epochs: + raise ValueError("Both train_steps or train_epochs were be defined.") + + # Determine training schedule based on flags. + if train_steps: + self.train_eval_iterations = train_steps // steps_between_evals + self._single_iteration_train_steps = steps_between_evals + self._single_iteration_train_epochs = None + else: + train_epochs = train_epochs or default_train_epochs + self.train_eval_iterations = train_epochs // epochs_between_evals + self._single_iteration_train_steps = None + self._single_iteration_train_epochs = epochs_between_evals + + self.max_length = max_length + self.batch_size = batch_size + self.use_tpu = use_tpu + self.num_tpu_shards = num_tpu_shards + + if self.use_tpu: + assert (self.batch_size // self.max_length) % self.num_tpu_shards == 0 + + @property + def single_iteration_train_steps(self): + if self._single_iteration_train_steps or not self.use_tpu: + return self._single_iteration_train_steps + + return self.epochs_to_steps( + num_epochs=self._single_iteration_train_epochs, mode=_TRAIN) + + @property + def single_iteration_eval_steps(self): + if not self.use_tpu: + return None + + return self.epochs_to_steps(num_epochs=1, mode=_EVAL) + + @property + def train_increment_str(self): + if self._single_iteration_train_steps: + return "{} steps.".format(self._single_iteration_train_steps) + + if not self.use_tpu: + return "{} epochs.".format(self._single_iteration_train_epochs) + + return "~{} epochs. ({} steps)".format( + self._single_iteration_train_epochs, + self.single_iteration_train_steps) + + @property + def repeat_dataset(self): + if (self._single_iteration_train_epochs is None and + self._single_iteration_train_steps > NUM_EXAMPLES[_TRAIN]): + return math.ceil(self._single_iteration_train_steps / + NUM_EXAMPLES[_TRAIN]) + return self._single_iteration_train_epochs + + def epochs_to_steps(self, num_epochs, mode): + """Converts a number of epochs to a number of training steps. + + TPU only: This function assumes that static_batch is True. + + TPU can not tolerate an OutOfRange error from a dataset. As a result the + number of examples to be processed must be known ahead of time. TPUs also + do not allow partial batches, so this function rounds down. + + Args: + num_epochs: An integer of the number of epochs to convert to steps. + mode: The estimator ModeKey of the computation + + Returns: + An integer of the number of equivalent steps rounded down. + """ + assert self.use_tpu, "epochs_to_steps should only be reached when using TPU" + total_num_tokens = NUM_EXAMPLES[mode] * self.max_length * num_epochs + return total_num_tokens // self.batch_size diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule_test.py new file mode 100644 index 0000000..29b4d5f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/schedule_test.py @@ -0,0 +1,84 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test Transformer's schedule manager.""" + +import tensorflow.compat.v1 as tf + +from official.r1.transformer import schedule + + +class ScheduleBaseTester(tf.test.TestCase): + def test_mutual_exclusivity(self): + with self.assertRaises(ValueError): + schedule.Manager( + train_steps=100, steps_between_evals=100, train_epochs=2, + epochs_between_evals=1, default_train_epochs=None, batch_size=2048, + max_length=256) + + def test_step_basis(self): + manager = schedule.Manager( + train_steps=1000, steps_between_evals=100, train_epochs=None, + epochs_between_evals=None, default_train_epochs=None, batch_size=2048, + max_length=256) + + self.assertEqual(manager.single_iteration_train_steps, 100) + + # Evaluation uses the full set + self.assertIsNone(manager.single_iteration_eval_steps) + + self.assertIsNone(manager.repeat_dataset) + + def test_epoch_basis(self): + manager = schedule.Manager( + train_steps=None, steps_between_evals=None, train_epochs=10, + epochs_between_evals=2, default_train_epochs=None, batch_size=2048, + max_length=256) + + # For non-TPU, estimator relies on dataset exhausion + self.assertIsNone(manager.single_iteration_train_steps) + self.assertIsNone(manager.single_iteration_eval_steps) + + self.assertEqual(manager.repeat_dataset, 2) + + def test_step_basis_tpu(self): + manager = schedule.Manager( + train_steps=1000, steps_between_evals=100, train_epochs=None, + epochs_between_evals=None, default_train_epochs=None, batch_size=2048, + max_length=256, use_tpu=True) + + self.assertEqual(manager.single_iteration_train_steps, 100) + # num_eval_examples / (batch_size / max_length) == 3000 / (2048 / 256) + self.assertEqual(manager.single_iteration_eval_steps, 375) + self.assertIsNone(manager.repeat_dataset) + + def test_epoch_basis_tpu(self): + manager = schedule.Manager( + train_steps=None, steps_between_evals=None, train_epochs=10, + epochs_between_evals=2, default_train_epochs=None, batch_size=2048, + max_length=256, use_tpu=True) + + self.assertEqual( + manager.single_iteration_train_steps, + schedule.NUM_EXAMPLES[tf.estimator.ModeKeys.TRAIN] * 2 // (2048 / 256) + ) + + # num_eval_examples / (batch_size / max_length) == 3000 / (2048 / 256) + self.assertEqual(manager.single_iteration_eval_steps, 375) + + self.assertEqual(manager.repeat_dataset, 2) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer.py new file mode 100644 index 0000000..708c3dd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer.py @@ -0,0 +1,417 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines the Transformer model, and its encoder and decoder stacks. + +Model paper: https://arxiv.org/pdf/1706.03762.pdf +Transformer model code source: https://github.com/tensorflow/tensor2tensor +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v1 as tf + +from official.nlp.transformer import beam_search_v1 as beam_search +from official.nlp.transformer import model_utils +from official.nlp.transformer.utils.tokenizer import EOS_ID +from official.r1.transformer import attention_layer +from official.r1.transformer import embedding_layer +from official.r1.transformer import ffn_layer + +_NEG_INF = -1e9 + + +class Transformer(object): + """Transformer model for sequence to sequence data. + + Implemented as described in: https://arxiv.org/pdf/1706.03762.pdf + + The Transformer model consists of an encoder and decoder. The input is an int + sequence (or a batch of sequences). The encoder produces a continous + representation, and the decoder uses the encoder output to generate + probabilities for the output sequence. + """ + + def __init__(self, params, train): + """Initialize layers to build Transformer model. + + Args: + params: hyperparameter object defining layer sizes, dropout values, etc. + train: boolean indicating whether the model is in training mode. Used to + determine if dropout layers should be added. + """ + self.train = train + self.params = params + + self.embedding_softmax_layer = embedding_layer.EmbeddingSharedWeights( + params["vocab_size"], params["hidden_size"], + method="matmul" if params["tpu"] else "gather") + self.encoder_stack = EncoderStack(params, train) + self.decoder_stack = DecoderStack(params, train) + + def __call__(self, inputs, targets=None): + """Calculate target logits or inferred target sequences. + + Args: + inputs: int tensor with shape [batch_size, input_length]. + targets: None or int tensor with shape [batch_size, target_length]. + + Returns: + If targets is defined, then return logits for each word in the target + sequence. float tensor with shape [batch_size, target_length, vocab_size] + If target is none, then generate output sequence one token at a time. + returns a dictionary { + output: [batch_size, decoded length] + score: [batch_size, float]} + """ + # Variance scaling is used here because it seems to work in many problems. + # Other reasonable initializers may also work just as well. + initializer = tf.variance_scaling_initializer( + self.params["initializer_gain"], mode="fan_avg", distribution="uniform") + with tf.variable_scope("Transformer", initializer=initializer): + # Calculate attention bias for encoder self-attention and decoder + # multi-headed attention layers. + attention_bias = model_utils.get_padding_bias(inputs) + + # Run the inputs through the encoder layer to map the symbol + # representations to continuous representations. + encoder_outputs = self.encode(inputs, attention_bias) + + # Generate output sequence if targets is None, or return logits if target + # sequence is known. + if targets is None: + return self.predict(encoder_outputs, attention_bias) + else: + logits = self.decode(targets, encoder_outputs, attention_bias) + return logits + + def encode(self, inputs, attention_bias): + """Generate continuous representation for inputs. + + Args: + inputs: int tensor with shape [batch_size, input_length]. + attention_bias: float tensor with shape [batch_size, 1, 1, input_length] + + Returns: + float tensor with shape [batch_size, input_length, hidden_size] + """ + with tf.name_scope("encode"): + # Prepare inputs to the layer stack by adding positional encodings and + # applying dropout. + embedded_inputs = self.embedding_softmax_layer(inputs) + inputs_padding = model_utils.get_padding(inputs) + + with tf.name_scope("add_pos_encoding"): + length = tf.shape(embedded_inputs)[1] + pos_encoding = model_utils.get_position_encoding( + length, self.params["hidden_size"]) + encoder_inputs = embedded_inputs + pos_encoding + + if self.train: + encoder_inputs = tf.nn.dropout( + encoder_inputs, 1 - self.params["layer_postprocess_dropout"]) + + return self.encoder_stack(encoder_inputs, attention_bias, inputs_padding) + + def decode(self, targets, encoder_outputs, attention_bias): + """Generate logits for each value in the target sequence. + + Args: + targets: target values for the output sequence. + int tensor with shape [batch_size, target_length] + encoder_outputs: continuous representation of input sequence. + float tensor with shape [batch_size, input_length, hidden_size] + attention_bias: float tensor with shape [batch_size, 1, 1, input_length] + + Returns: + float32 tensor with shape [batch_size, target_length, vocab_size] + """ + with tf.name_scope("decode"): + # Prepare inputs to decoder layers by shifting targets, adding positional + # encoding and applying dropout. + decoder_inputs = self.embedding_softmax_layer(targets) + with tf.name_scope("shift_targets"): + # Shift targets to the right, and remove the last element + decoder_inputs = tf.pad( + decoder_inputs, [[0, 0], [1, 0], [0, 0]])[:, :-1, :] + with tf.name_scope("add_pos_encoding"): + length = tf.shape(decoder_inputs)[1] + decoder_inputs += model_utils.get_position_encoding( + length, self.params["hidden_size"]) + if self.train: + decoder_inputs = tf.nn.dropout( + decoder_inputs, 1 - self.params["layer_postprocess_dropout"]) + + # Run values + decoder_self_attention_bias = model_utils.get_decoder_self_attention_bias( + length) + outputs = self.decoder_stack( + decoder_inputs, encoder_outputs, decoder_self_attention_bias, + attention_bias) + logits = self.embedding_softmax_layer.linear(outputs) + return logits + + def _get_symbols_to_logits_fn(self, max_decode_length): + """Returns a decoding function that calculates logits of the next tokens.""" + + timing_signal = model_utils.get_position_encoding( + max_decode_length + 1, self.params["hidden_size"]) + decoder_self_attention_bias = model_utils.get_decoder_self_attention_bias( + max_decode_length) + + def symbols_to_logits_fn(ids, i, cache): + """Generate logits for next potential IDs. + + Args: + ids: Current decoded sequences. + int tensor with shape [batch_size * beam_size, i + 1] + i: Loop index + cache: dictionary of values storing the encoder output, encoder-decoder + attention bias, and previous decoder attention values. + + Returns: + Tuple of + (logits with shape [batch_size * beam_size, vocab_size], + updated cache values) + """ + # Set decoder input to the last generated IDs + decoder_input = ids[:, -1:] + + # Preprocess decoder input by getting embeddings and adding timing signal. + decoder_input = self.embedding_softmax_layer(decoder_input) + decoder_input += timing_signal[i:i + 1] + + self_attention_bias = decoder_self_attention_bias[:, :, i:i + 1, :i + 1] + decoder_outputs = self.decoder_stack( + decoder_input, cache.get("encoder_outputs"), self_attention_bias, + cache.get("encoder_decoder_attention_bias"), cache) + logits = self.embedding_softmax_layer.linear(decoder_outputs) + logits = tf.squeeze(logits, axis=[1]) + return logits, cache + return symbols_to_logits_fn + + def predict(self, encoder_outputs, encoder_decoder_attention_bias): + """Return predicted sequence.""" + batch_size = tf.shape(encoder_outputs)[0] + input_length = tf.shape(encoder_outputs)[1] + max_decode_length = input_length + self.params["extra_decode_length"] + + symbols_to_logits_fn = self._get_symbols_to_logits_fn(max_decode_length) + + # Create initial set of IDs that will be passed into symbols_to_logits_fn. + initial_ids = tf.zeros([batch_size], dtype=tf.int32) + + # Create cache storing decoder attention values for each layer. + cache = { + "layer_%d" % layer: { + "k": tf.zeros([batch_size, 0, self.params["hidden_size"]]), + "v": tf.zeros([batch_size, 0, self.params["hidden_size"]]), + } for layer in range(self.params["num_hidden_layers"])} + + # Add encoder output and attention bias to the cache. + cache["encoder_outputs"] = encoder_outputs + cache["encoder_decoder_attention_bias"] = encoder_decoder_attention_bias + + # Use beam search to find the top beam_size sequences and scores. + decoded_ids, scores = beam_search.sequence_beam_search( + symbols_to_logits_fn=symbols_to_logits_fn, + initial_ids=initial_ids, + initial_cache=cache, + vocab_size=self.params["vocab_size"], + beam_size=self.params["beam_size"], + alpha=self.params["alpha"], + max_decode_length=max_decode_length, + eos_id=EOS_ID) + + # Get the top sequence for each batch element + top_decoded_ids = decoded_ids[:, 0, 1:] + top_scores = scores[:, 0] + + return {"outputs": top_decoded_ids, "scores": top_scores} + + +class LayerNormalization(tf.layers.Layer): + """Applies layer normalization.""" + + def __init__(self, hidden_size): + super(LayerNormalization, self).__init__() + self.hidden_size = hidden_size + + def build(self, _): + self.scale = tf.get_variable("layer_norm_scale", [self.hidden_size], + initializer=tf.ones_initializer()) + self.bias = tf.get_variable("layer_norm_bias", [self.hidden_size], + initializer=tf.zeros_initializer()) + self.built = True + + def call(self, x, epsilon=1e-6): + mean = tf.reduce_mean(x, axis=[-1], keepdims=True) + variance = tf.reduce_mean(tf.square(x - mean), axis=[-1], keepdims=True) + norm_x = (x - mean) * tf.rsqrt(variance + epsilon) + return norm_x * self.scale + self.bias + + +class PrePostProcessingWrapper(object): + """Wrapper class that applies layer pre-processing and post-processing.""" + + def __init__(self, layer, params, train): + self.layer = layer + self.postprocess_dropout = params["layer_postprocess_dropout"] + self.train = train + + # Create normalization layer + self.layer_norm = LayerNormalization(params["hidden_size"]) + + def __call__(self, x, *args, **kwargs): + # Preprocessing: apply layer normalization + y = self.layer_norm(x) + + # Get layer output + y = self.layer(y, *args, **kwargs) + + # Postprocessing: apply dropout and residual connection + if self.train: + y = tf.nn.dropout(y, 1 - self.postprocess_dropout) + return x + y + + +class EncoderStack(tf.layers.Layer): + """Transformer encoder stack. + + The encoder stack is made up of N identical layers. Each layer is composed + of the sublayers: + 1. Self-attention layer + 2. Feedforward network (which is 2 fully-connected layers) + """ + + def __init__(self, params, train): + super(EncoderStack, self).__init__() + self.layers = [] + for _ in range(params["num_hidden_layers"]): + # Create sublayers for each layer. + self_attention_layer = attention_layer.SelfAttention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"], train) + feed_forward_network = ffn_layer.FeedFowardNetwork( + params["hidden_size"], params["filter_size"], + params["relu_dropout"], train, params["allow_ffn_pad"]) + + self.layers.append([ + PrePostProcessingWrapper(self_attention_layer, params, train), + PrePostProcessingWrapper(feed_forward_network, params, train)]) + + # Create final layer normalization layer. + self.output_normalization = LayerNormalization(params["hidden_size"]) + + def call(self, encoder_inputs, attention_bias, inputs_padding): + """Return the output of the encoder layer stacks. + + Args: + encoder_inputs: tensor with shape [batch_size, input_length, hidden_size] + attention_bias: bias for the encoder self-attention layer. + [batch_size, 1, 1, input_length] + inputs_padding: P + + Returns: + Output of encoder layer stack. + float32 tensor with shape [batch_size, input_length, hidden_size] + """ + for n, layer in enumerate(self.layers): + # Run inputs through the sublayers. + self_attention_layer = layer[0] + feed_forward_network = layer[1] + + with tf.variable_scope("layer_%d" % n): + with tf.variable_scope("self_attention"): + encoder_inputs = self_attention_layer(encoder_inputs, attention_bias) + with tf.variable_scope("ffn"): + encoder_inputs = feed_forward_network(encoder_inputs, inputs_padding) + + return self.output_normalization(encoder_inputs) + + +class DecoderStack(tf.layers.Layer): + """Transformer decoder stack. + + Like the encoder stack, the decoder stack is made up of N identical layers. + Each layer is composed of the sublayers: + 1. Self-attention layer + 2. Multi-headed attention layer combining encoder outputs with results from + the previous self-attention layer. + 3. Feedforward network (2 fully-connected layers) + """ + + def __init__(self, params, train): + super(DecoderStack, self).__init__() + self.layers = [] + for _ in range(params["num_hidden_layers"]): + self_attention_layer = attention_layer.SelfAttention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"], train) + enc_dec_attention_layer = attention_layer.Attention( + params["hidden_size"], params["num_heads"], + params["attention_dropout"], train) + feed_forward_network = ffn_layer.FeedFowardNetwork( + params["hidden_size"], params["filter_size"], + params["relu_dropout"], train, params["allow_ffn_pad"]) + + self.layers.append([ + PrePostProcessingWrapper(self_attention_layer, params, train), + PrePostProcessingWrapper(enc_dec_attention_layer, params, train), + PrePostProcessingWrapper(feed_forward_network, params, train)]) + + self.output_normalization = LayerNormalization(params["hidden_size"]) + + def call(self, decoder_inputs, encoder_outputs, decoder_self_attention_bias, + attention_bias, cache=None): + """Return the output of the decoder layer stacks. + + Args: + decoder_inputs: tensor with shape [batch_size, target_length, hidden_size] + encoder_outputs: tensor with shape [batch_size, input_length, hidden_size] + decoder_self_attention_bias: bias for decoder self-attention layer. + [1, 1, target_len, target_length] + attention_bias: bias for encoder-decoder attention layer. + [batch_size, 1, 1, input_length] + cache: (Used for fast decoding) A nested dictionary storing previous + decoder self-attention values. The items are: + {layer_n: {"k": tensor with shape [batch_size, i, key_channels], + "v": tensor with shape [batch_size, i, value_channels]}, + ...} + + Returns: + Output of decoder layer stack. + float32 tensor with shape [batch_size, target_length, hidden_size] + """ + for n, layer in enumerate(self.layers): + self_attention_layer = layer[0] + enc_dec_attention_layer = layer[1] + feed_forward_network = layer[2] + + # Run inputs through the sublayers. + layer_name = "layer_%d" % n + layer_cache = cache[layer_name] if cache is not None else None + with tf.variable_scope(layer_name): + with tf.variable_scope("self_attention"): + decoder_inputs = self_attention_layer( + decoder_inputs, decoder_self_attention_bias, cache=layer_cache) + with tf.variable_scope("encdec_attention"): + decoder_inputs = enc_dec_attention_layer( + decoder_inputs, encoder_outputs, attention_bias) + with tf.variable_scope("ffn"): + decoder_inputs = feed_forward_network(decoder_inputs) + + return self.output_normalization(decoder_inputs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer_main.py new file mode 100644 index 0000000..f9ba2ca --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/transformer_main.py @@ -0,0 +1,710 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Train and evaluate the Transformer model. + +See README for description of setting the training schedule and evaluating the +BLEU score. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tempfile + +# pylint: disable=g-bad-import-order +from six.moves import xrange # pylint: disable=redefined-builtin +from absl import app as absl_app +from absl import flags +import tensorflow.compat.v1 as tf +# pylint: enable=g-bad-import-order + +from official.nlp.transformer import model_params +from official.r1.utils import export +from official.r1.utils import tpu as tpu_util +from official.r1.transformer import translate +from official.r1.transformer import transformer +from official.r1.transformer import dataset +from official.r1.transformer import schedule +from official.nlp.transformer import compute_bleu +from official.nlp.transformer.utils import metrics +from official.nlp.transformer.utils import tokenizer +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers + +PARAMS_MAP = { + "tiny": model_params.TINY_PARAMS, + "base": model_params.BASE_PARAMS, + "big": model_params.BIG_PARAMS, +} + + +DEFAULT_TRAIN_EPOCHS = 10 +INF = 1000000000 # 1e9 +BLEU_DIR = "bleu" + +# Dictionary containing tensors that are logged by the logging hooks. Each item +# maps a string to the tensor name. +TENSORS_TO_LOG = { + "learning_rate": "model/get_train_op/learning_rate/learning_rate", + "cross_entropy_loss": "model/cross_entropy"} + + +def model_fn(features, labels, mode, params): + """Defines how to train, evaluate and predict from the transformer model.""" + with tf.variable_scope("model"): + inputs, targets = features, labels + + # Create model and get output logits. + model = transformer.Transformer(params, mode == tf.estimator.ModeKeys.TRAIN) + + logits = model(inputs, targets) + + # When in prediction mode, the labels/targets is None. The model output + # is the prediction + if mode == tf.estimator.ModeKeys.PREDICT: + if params["use_tpu"]: + raise NotImplementedError("Prediction is not yet supported on TPUs.") + return tf.estimator.EstimatorSpec( + tf.estimator.ModeKeys.PREDICT, + predictions=logits, + export_outputs={ + "translate": tf.estimator.export.PredictOutput(logits) + }) + + # Explicitly set the shape of the logits for XLA (TPU). This is needed + # because the logits are passed back to the host VM CPU for metric + # evaluation, and the shape of [?, ?, vocab_size] is too vague. However + # it is known from Transformer that the first two dimensions of logits + # are the dimensions of targets. Note that the ambiguous shape of logits is + # not a problem when computing xentropy, because padded_cross_entropy_loss + # resolves the shape on the TPU. + logits.set_shape(targets.shape.as_list() + logits.shape.as_list()[2:]) + + # Calculate model loss. + # xentropy contains the cross entropy loss of every nonpadding token in the + # targets. + xentropy, weights = metrics.padded_cross_entropy_loss( + logits, targets, params["label_smoothing"], params["vocab_size"]) + loss = tf.reduce_sum(xentropy) / tf.reduce_sum(weights) + + # Save loss as named tensor that will be logged with the logging hook. + tf.identity(loss, "cross_entropy") + + if mode == tf.estimator.ModeKeys.EVAL: + if params["use_tpu"]: + # host call functions should only have tensors as arguments. + # This lambda pre-populates params so that metric_fn is + # TPUEstimator compliant. + metric_fn = lambda logits, labels: ( + metrics.get_eval_metrics(logits, labels, params=params)) + eval_metrics = (metric_fn, [logits, labels]) + return tf.estimator.tpu.TPUEstimatorSpec( + mode=mode, + loss=loss, + predictions={"predictions": logits}, + eval_metrics=eval_metrics) + return tf.estimator.EstimatorSpec( + mode=mode, loss=loss, predictions={"predictions": logits}, + eval_metric_ops=metrics.get_eval_metrics(logits, labels, params)) + else: + train_op, metric_dict = get_train_op_and_metrics(loss, params) + + # Epochs can be quite long. This gives some intermediate information + # in TensorBoard. + metric_dict["minibatch_loss"] = loss + if params["use_tpu"]: + return tf.estimator.tpu.TPUEstimatorSpec( + mode=mode, + loss=loss, + train_op=train_op, + host_call=tpu_util.construct_scalar_host_call( + metric_dict=metric_dict, + model_dir=params["model_dir"], + prefix="training/")) + record_scalars(metric_dict) + return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) + + +def record_scalars(metric_dict): + for key, value in metric_dict.items(): + tf.summary.scalar(name=key, tensor=value) + + +def get_learning_rate(learning_rate, hidden_size, learning_rate_warmup_steps): + """Calculate learning rate with linear warmup and rsqrt decay.""" + with tf.name_scope("learning_rate"): + warmup_steps = tf.to_float(learning_rate_warmup_steps) + step = tf.to_float(tf.train.get_or_create_global_step()) + + learning_rate *= (hidden_size ** -0.5) + # Apply linear warmup + learning_rate *= tf.minimum(1.0, step / warmup_steps) + # Apply rsqrt decay + learning_rate *= tf.rsqrt(tf.maximum(step, warmup_steps)) + + # Create a named tensor that will be logged using the logging hook. + # The full name includes variable and names scope. In this case, the name + # is model/get_train_op/learning_rate/learning_rate + tf.identity(learning_rate, "learning_rate") + + return learning_rate + + +def get_train_op_and_metrics(loss, params): + """Generate training op and metrics to save in TensorBoard.""" + with tf.variable_scope("get_train_op"): + learning_rate = get_learning_rate( + learning_rate=params["learning_rate"], + hidden_size=params["hidden_size"], + learning_rate_warmup_steps=params["learning_rate_warmup_steps"]) + + # Create optimizer. Use LazyAdamOptimizer from TF contrib, which is faster + # than the TF core Adam optimizer. + from tensorflow.contrib import opt as contrib_opt # pylint: disable=g-import-not-at-top + optimizer = contrib_opt.LazyAdamOptimizer( + learning_rate, + beta1=params["optimizer_adam_beta1"], + beta2=params["optimizer_adam_beta2"], + epsilon=params["optimizer_adam_epsilon"]) + + if params["use_tpu"] and params["tpu"] != tpu_util.LOCAL: + optimizer = tf.compat.v1.tpu.CrossShardOptimizer(optimizer) + + # Uses automatic mixed precision FP16 training if on GPU. + if params["dtype"] == "fp16": + optimizer = tf.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer) + + # Calculate and apply gradients using LazyAdamOptimizer. + global_step = tf.train.get_global_step() + tvars = tf.trainable_variables() + gradients = optimizer.compute_gradients( + loss, tvars, colocate_gradients_with_ops=True) + minimize_op = optimizer.apply_gradients( + gradients, global_step=global_step, name="train") + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + train_op = tf.group(minimize_op, update_ops) + + train_metrics = {"learning_rate": learning_rate} + + if not params["use_tpu"]: + # gradient norm is not included as a summary when running on TPU, as + # it can cause instability between the TPU and the host controller. + gradient_norm = tf.global_norm(list(zip(*gradients))[0]) + train_metrics["global_norm/gradient_norm"] = gradient_norm + + return train_op, train_metrics + + +def translate_and_compute_bleu(estimator, subtokenizer, bleu_source, bleu_ref): + """Translate file and report the cased and uncased bleu scores.""" + # Create temporary file to store translation. + tmp = tempfile.NamedTemporaryFile(delete=False) + tmp_filename = tmp.name + + translate.translate_file( + estimator, subtokenizer, bleu_source, output_file=tmp_filename, + print_all_translations=False) + + # Compute uncased and cased bleu scores. + uncased_score = compute_bleu.bleu_wrapper(bleu_ref, tmp_filename, False) + cased_score = compute_bleu.bleu_wrapper(bleu_ref, tmp_filename, True) + os.remove(tmp_filename) + return uncased_score, cased_score + + +def get_global_step(estimator): + """Return estimator's last checkpoint.""" + return int(estimator.latest_checkpoint().split("-")[-1]) + + +def evaluate_and_log_bleu(estimator, bleu_source, bleu_ref, vocab_file): + """Calculate and record the BLEU score.""" + subtokenizer = tokenizer.Subtokenizer(vocab_file) + + uncased_score, cased_score = translate_and_compute_bleu( + estimator, subtokenizer, bleu_source, bleu_ref) + + tf.logging.info("Bleu score (uncased): %f", uncased_score) + tf.logging.info("Bleu score (cased): %f", cased_score) + return uncased_score, cased_score + + +def _validate_file(filepath): + """Make sure that file exists.""" + if not tf.io.gfile.exists(filepath): + raise tf.errors.NotFoundError(None, None, "File %s not found." % filepath) + + +def run_loop( + estimator, schedule_manager, train_hooks=None, benchmark_logger=None, + bleu_source=None, bleu_ref=None, bleu_threshold=None, vocab_file=None): + """Train and evaluate model, and optionally compute model's BLEU score. + + **Step vs. Epoch vs. Iteration** + + Steps and epochs are canonical terms used in TensorFlow and general machine + learning. They are used to describe running a single process (train/eval): + - Step refers to running the process through a single or batch of examples. + - Epoch refers to running the process through an entire dataset. + + E.g. training a dataset with 100 examples. The dataset is + divided into 20 batches with 5 examples per batch. A single training step + trains the model on one batch. After 20 training steps, the model will have + trained on every batch in the dataset, or, in other words, one epoch. + + Meanwhile, iteration is used in this implementation to describe running + multiple processes (training and eval). + - A single iteration: + 1. trains the model for a specific number of steps or epochs. + 2. evaluates the model. + 3. (if source and ref files are provided) compute BLEU score. + + This function runs through multiple train+eval+bleu iterations. + + Args: + estimator: tf.Estimator containing model to train. + schedule_manager: A schedule.Manager object to guide the run loop. + train_hooks: List of hooks to pass to the estimator during training. + benchmark_logger: a BenchmarkLogger object that logs evaluation data + bleu_source: File containing text to be translated for BLEU calculation. + bleu_ref: File containing reference translations for BLEU calculation. + bleu_threshold: minimum BLEU score before training is stopped. + vocab_file: Path to vocab file that will be used to subtokenize bleu_source. + + Returns: + Dict of results of the run. Contains the keys `eval_results`, + `train_hooks`, `bleu_cased`, and `bleu_uncased`. `train_hooks` is a list the + instances of hooks used during training. + + Raises: + ValueError: if both or none of single_iteration_train_steps and + single_iteration_train_epochs were defined. + NotFoundError: if the vocab file or bleu files don't exist. + """ + if bleu_source: + _validate_file(bleu_source) + if bleu_ref: + _validate_file(bleu_ref) + if vocab_file: + _validate_file(vocab_file) + + evaluate_bleu = bleu_source is not None and bleu_ref is not None + if evaluate_bleu and schedule_manager.use_tpu: + raise ValueError("BLEU score can not be computed when training with a TPU, " + "as it requires estimator.predict which is not yet " + "supported.") + + # Print details of training schedule. + tf.logging.info("Training schedule:") + tf.logging.info( + "\t1. Train for {}".format(schedule_manager.train_increment_str)) + tf.logging.info("\t2. Evaluate model.") + if evaluate_bleu: + tf.logging.info("\t3. Compute BLEU score.") + if bleu_threshold is not None: + tf.logging.info("Repeat above steps until the BLEU score reaches %f" % + bleu_threshold) + if not evaluate_bleu or bleu_threshold is None: + tf.logging.info("Repeat above steps %d times." % + schedule_manager.train_eval_iterations) + + if evaluate_bleu: + # Create summary writer to log bleu score (values can be displayed in + # Tensorboard). + bleu_writer = tf.summary.FileWriter( + os.path.join(estimator.model_dir, BLEU_DIR)) + if bleu_threshold is not None: + # Change loop stopping condition if bleu_threshold is defined. + schedule_manager.train_eval_iterations = INF + + # Loop training/evaluation/bleu cycles + stats = {} + for i in xrange(schedule_manager.train_eval_iterations): + tf.logging.info("Starting iteration %d" % (i + 1)) + + # Train the model for single_iteration_train_steps or until the input fn + # runs out of examples (if single_iteration_train_steps is None). + estimator.train( + dataset.train_input_fn, + steps=schedule_manager.single_iteration_train_steps, + hooks=train_hooks) + + eval_results = None + eval_results = estimator.evaluate( + input_fn=dataset.eval_input_fn, + steps=schedule_manager.single_iteration_eval_steps) + + tf.logging.info("Evaluation results (iter %d/%d):" % + (i + 1, schedule_manager.train_eval_iterations)) + tf.logging.info(eval_results) + benchmark_logger.log_evaluation_result(eval_results) + + # The results from estimator.evaluate() are measured on an approximate + # translation, which utilize the target golden values provided. The actual + # bleu score must be computed using the estimator.predict() path, which + # outputs translations that are not based on golden values. The translations + # are compared to reference file to get the actual bleu score. + if evaluate_bleu: + uncased_score, cased_score = evaluate_and_log_bleu( + estimator, bleu_source, bleu_ref, vocab_file) + + stats["bleu_uncased"] = uncased_score + stats["bleu_cased"] = cased_score + + # Write actual bleu scores using summary writer and benchmark logger + global_step = get_global_step(estimator) + summary = tf.Summary(value=[ + tf.Summary.Value(tag="bleu/uncased", simple_value=uncased_score), + tf.Summary.Value(tag="bleu/cased", simple_value=cased_score), + ]) + bleu_writer.add_summary(summary, global_step) + bleu_writer.flush() + benchmark_logger.log_metric( + "bleu_uncased", uncased_score, global_step=global_step) + benchmark_logger.log_metric( + "bleu_cased", cased_score, global_step=global_step) + + # Stop training if bleu stopping threshold is met. + if model_helpers.past_stop_threshold(bleu_threshold, uncased_score): + bleu_writer.close() + break + + stats["eval_results"] = eval_results + stats["train_hooks"] = train_hooks + + return stats + + +def define_transformer_flags(): + """Add flags and flag validators for running transformer_main.""" + # Add common flags (data_dir, model_dir, train_epochs, etc.). + flags.DEFINE_integer( + name="max_length", short_name="ml", default=None, + help=flags_core.help_wrap("Max length.")) + + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + num_gpu=True, hooks=True, export_dir=True, + distribution_strategy=True) + flags_core.define_performance( + num_parallel_calls=True, + inter_op=False, + intra_op=False, + synthetic_data=True, + max_train_steps=False, + dtype=True, + all_reduce_alg=True + ) + flags_core.define_benchmark() + flags_core.define_device(tpu=True) + + # Set flags from the flags_core module as "key flags" so they're listed when + # the '-h' flag is used. Without this line, the flags defined above are + # only shown in the full `--helpful` help text. + flags.adopt_module_key_flags(flags_core) + + # Add transformer-specific flags + flags.DEFINE_enum( + name="param_set", short_name="mp", default="big", + enum_values=PARAMS_MAP.keys(), + help=flags_core.help_wrap( + "Parameter set to use when creating and training the model. The " + "parameters define the input shape (batch size and max length), " + "model configuration (size of embedding, # of hidden layers, etc.), " + "and various other settings. The big parameter set increases the " + "default batch size, embedding/hidden size, and filter size. For a " + "complete list of parameters, please see model/model_params.py.")) + + flags.DEFINE_bool( + name="static_batch", default=False, + help=flags_core.help_wrap( + "Whether the batches in the dataset should have static shapes. In " + "general, this setting should be False. Dynamic shapes allow the " + "inputs to be grouped so that the number of padding tokens is " + "minimized, and helps model training. In cases where the input shape " + "must be static (e.g. running on TPU), this setting will be ignored " + "and static batching will always be used.")) + + # Flags for training with steps (may be used for debugging) + flags.DEFINE_integer( + name="train_steps", short_name="ts", default=None, + help=flags_core.help_wrap("The number of steps used to train.")) + flags.DEFINE_integer( + name="steps_between_evals", short_name="sbe", default=1000, + help=flags_core.help_wrap( + "The Number of training steps to run between evaluations. This is " + "used if --train_steps is defined.")) + + # BLEU score computation + flags.DEFINE_string( + name="bleu_source", short_name="bls", default=None, + help=flags_core.help_wrap( + "Path to source file containing text translate when calculating the " + "official BLEU score. Both --bleu_source and --bleu_ref must be set. " + "Use the flag --stop_threshold to stop the script based on the " + "uncased BLEU score.")) + flags.DEFINE_string( + name="bleu_ref", short_name="blr", default=None, + help=flags_core.help_wrap( + "Path to source file containing text translate when calculating the " + "official BLEU score. Both --bleu_source and --bleu_ref must be set. " + "Use the flag --stop_threshold to stop the script based on the " + "uncased BLEU score.")) + flags.DEFINE_string( + name="vocab_file", short_name="vf", default=None, + help=flags_core.help_wrap( + "Path to subtoken vocabulary file. If data_download.py was used to " + "download and encode the training data, look in the data_dir to find " + "the vocab file.")) + + flags_core.set_defaults(data_dir="/tmp/translate_ende", + model_dir="/tmp/transformer_model", + batch_size=None, + train_epochs=None) + + @flags.multi_flags_validator( + ["train_epochs", "train_steps"], + message="Both --train_steps and --train_epochs were set. Only one may be " + "defined.") + def _check_train_limits(flag_dict): + return flag_dict["train_epochs"] is None or flag_dict["train_steps"] is None + + @flags.multi_flags_validator( + ["bleu_source", "bleu_ref"], + message="Both or neither --bleu_source and --bleu_ref must be defined.") + def _check_bleu_files(flags_dict): + return (flags_dict["bleu_source"] is None) == ( + flags_dict["bleu_ref"] is None) + + @flags.multi_flags_validator( + ["bleu_source", "bleu_ref", "vocab_file"], + message="--vocab_file must be defined if --bleu_source and --bleu_ref " + "are defined.") + def _check_bleu_vocab_file(flags_dict): + if flags_dict["bleu_source"] and flags_dict["bleu_ref"]: + return flags_dict["vocab_file"] is not None + return True + + @flags.multi_flags_validator( + ["export_dir", "vocab_file"], + message="--vocab_file must be defined if --export_dir is set.") + def _check_export_vocab_file(flags_dict): + if flags_dict["export_dir"]: + return flags_dict["vocab_file"] is not None + return True + + flags_core.require_cloud_storage(["data_dir", "model_dir", "export_dir"]) + + +def construct_estimator(flags_obj, params, schedule_manager): + """Construct an estimator from either Estimator or TPUEstimator. + + Args: + flags_obj: The FLAGS object parsed from command line. + params: A dict of run specific parameters. + schedule_manager: A schedule.Manager object containing the run schedule. + + Returns: + An estimator object to be used for training and eval. + """ + if not params["use_tpu"]: + distribution_strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_core.get_num_gpus(flags_obj), + all_reduce_alg=flags_obj.all_reduce_alg) + return tf.estimator.Estimator( + model_fn=model_fn, model_dir=flags_obj.model_dir, params=params, + config=tf.estimator.RunConfig(train_distribute=distribution_strategy)) + + tpu_cluster_resolver = tf.compat.v1.cluster_resolver.TPUClusterResolver( + tpu=flags_obj.tpu, + zone=flags_obj.tpu_zone, + project=flags_obj.tpu_gcp_project + ) + + tpu_config = tf.estimator.tpu.TPUConfig( + iterations_per_loop=schedule_manager.single_iteration_train_steps, + num_shards=flags_obj.num_tpu_shards) + + run_config = tf.estimator.tpu.RunConfig( + cluster=tpu_cluster_resolver, + model_dir=flags_obj.model_dir, + session_config=tf.ConfigProto( + allow_soft_placement=True, log_device_placement=True), + tpu_config=tpu_config) + + return tf.estimator.tpu.TPUEstimator( + model_fn=model_fn, + use_tpu=params["use_tpu"] and flags_obj.tpu != tpu_util.LOCAL, + train_batch_size=schedule_manager.batch_size, + eval_batch_size=schedule_manager.batch_size, + params={ + # TPUEstimator needs to populate batch_size itself due to sharding. + key: value for key, value in params.items() if key != "batch_size" + }, + config=run_config) + +def per_replica_batch_size(batch_size, num_gpus): + """For multi-gpu, batch-size must be a multiple of the number of GPUs. + + + Note that distribution strategy handles this automatically when used with + Keras. For using with Estimator, we need to get per GPU batch. + + Args: + batch_size: Global batch size to be divided among devices. This should be + equal to num_gpus times the single-GPU batch_size for multi-gpu training. + num_gpus: How many GPUs are used with DistributionStrategies. + + Returns: + Batch size per device. + + Raises: + ValueError: if batch_size is not divisible by number of devices + """ + if num_gpus <= 1: + return batch_size + + remainder = batch_size % num_gpus + if remainder: + err = ('When running with multiple GPUs, batch size ' + 'must be a multiple of the number of available GPUs. Found {} ' + 'GPUs with a batch size of {}; try --batch_size={} instead.' + ).format(num_gpus, batch_size, batch_size - remainder) + raise ValueError(err) + return int(batch_size / num_gpus) + + +def run_transformer(flags_obj): + """Create tf.Estimator to train and evaluate transformer model. + + Args: + flags_obj: Object containing parsed flag values. + + Returns: + Dict of results of the run. Contains the keys `eval_results`, + `train_hooks`, `bleu_cased`, and `bleu_uncased`. `train_hooks` is a list the + instances of hooks used during training. + """ + num_gpus = flags_core.get_num_gpus(flags_obj) + + # Add flag-defined parameters to params object + params = PARAMS_MAP[flags_obj.param_set] + if num_gpus > 1: + if flags_obj.param_set == "big": + params = model_params.BIG_MULTI_GPU_PARAMS + elif flags_obj.param_set == "base": + params = model_params.BASE_MULTI_GPU_PARAMS + + params["data_dir"] = flags_obj.data_dir + params["model_dir"] = flags_obj.model_dir + params["num_parallel_calls"] = flags_obj.num_parallel_calls + + params["tpu"] = flags_obj.tpu + params["use_tpu"] = bool(flags_obj.tpu) # was a tpu specified. + params["static_batch"] = flags_obj.static_batch or params["use_tpu"] + params["allow_ffn_pad"] = not params["use_tpu"] + + params["max_length"] = flags_obj.max_length or params["max_length"] + + params["use_synthetic_data"] = flags_obj.use_synthetic_data + + # Set batch size parameter, which depends on the availability of + # TPU and GPU, and distribution settings. + params["batch_size"] = (flags_obj.batch_size or ( + params["default_batch_size_tpu"] if params["use_tpu"] + else params["default_batch_size"])) + + total_batch_size = params["batch_size"] + if not params["use_tpu"]: + params["batch_size"] = per_replica_batch_size(params["batch_size"], + num_gpus) + + schedule_manager = schedule.Manager( + train_steps=flags_obj.train_steps, + steps_between_evals=flags_obj.steps_between_evals, + train_epochs=flags_obj.train_epochs, + epochs_between_evals=flags_obj.epochs_between_evals, + default_train_epochs=DEFAULT_TRAIN_EPOCHS, + batch_size=params["batch_size"], + max_length=params["max_length"], + use_tpu=params["use_tpu"], + num_tpu_shards=flags_obj.num_tpu_shards + ) + + params["repeat_dataset"] = schedule_manager.repeat_dataset + + model_helpers.apply_clean(flags.FLAGS) + + # Create hooks that log information about the training and metric values + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, + model_dir=flags_obj.model_dir, + tensors_to_log=TENSORS_TO_LOG, # used for logging hooks + batch_size=total_batch_size, # for ExamplesPerSecondHook + use_tpu=params["use_tpu"] # Not all hooks can run with TPUs + ) + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info( + model_name="transformer", + dataset_name="wmt_translate_ende", + run_params=params, + test_id=flags_obj.benchmark_test_id) + + # Train and evaluate transformer model + estimator = construct_estimator(flags_obj, params, schedule_manager) + stats = run_loop( + estimator=estimator, + # Training arguments + schedule_manager=schedule_manager, + train_hooks=train_hooks, + benchmark_logger=benchmark_logger, + # BLEU calculation arguments + bleu_source=flags_obj.bleu_source, + bleu_ref=flags_obj.bleu_ref, + bleu_threshold=flags_obj.stop_threshold, + vocab_file=flags_obj.vocab_file) + + if flags_obj.export_dir and not params["use_tpu"]: + serving_input_fn = export.build_tensor_serving_input_receiver_fn( + shape=[None], dtype=tf.int64, batch_size=None) + # Export saved model, and save the vocab file as an extra asset. The vocab + # file is saved to allow consistent input encoding and output decoding. + # (See the "Export trained model" section in the README for an example of + # how to use the vocab file.) + # Since the model itself does not use the vocab file, this file is saved as + # an extra asset rather than a core asset. + estimator.export_savedmodel( + flags_obj.export_dir, serving_input_fn, + assets_extra={"vocab.txt": flags_obj.vocab_file}, + strip_default_attrs=True) + return stats + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + run_transformer(flags.FLAGS) + + +if __name__ == "__main__": + tf.logging.set_verbosity(tf.logging.INFO) + define_transformer_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/translate.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/translate.py new file mode 100644 index 0000000..9912ee3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/transformer/translate.py @@ -0,0 +1,237 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Translate text or files using trained transformer model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +# pylint: disable=g-bad-import-order +from absl import app as absl_app +from absl import flags +import tensorflow.compat.v1 as tf +# pylint: enable=g-bad-import-order + +from official.nlp.transformer.utils import tokenizer +from official.utils.flags import core as flags_core + +_DECODE_BATCH_SIZE = 32 +_EXTRA_DECODE_LENGTH = 100 +_BEAM_SIZE = 4 +_ALPHA = 0.6 + + +def _get_sorted_inputs(filename): + """Read and sort lines from the file sorted by decreasing length. + + Args: + filename: String name of file to read inputs from. + Returns: + Sorted list of inputs, and dictionary mapping original index->sorted index + of each element. + """ + with tf.io.gfile.GFile(filename) as f: + records = f.read().split("\n") + inputs = [record.strip() for record in records] + if not inputs[-1]: + inputs.pop() + + input_lens = [(i, len(line.split())) for i, line in enumerate(inputs)] + sorted_input_lens = sorted(input_lens, key=lambda x: x[1], reverse=True) + + sorted_inputs = [None] * len(sorted_input_lens) + sorted_keys = [0] * len(sorted_input_lens) + for i, (index, _) in enumerate(sorted_input_lens): + sorted_inputs[i] = inputs[index] + sorted_keys[index] = i + + return sorted_inputs, sorted_keys + + +def _encode_and_add_eos(line, subtokenizer): + """Encode line with subtokenizer, and add EOS id to the end.""" + return subtokenizer.encode(line) + [tokenizer.EOS_ID] + + +def _trim_and_decode(ids, subtokenizer): + """Trim EOS and PAD tokens from ids, and decode to return a string.""" + try: + index = list(ids).index(tokenizer.EOS_ID) + return subtokenizer.decode(ids[:index]) + except ValueError: # No EOS found in sequence + return subtokenizer.decode(ids) + + +def translate_file( + estimator, subtokenizer, input_file, output_file=None, + print_all_translations=True): + """Translate lines in file, and save to output file if specified. + + Args: + estimator: tf.Estimator used to generate the translations. + subtokenizer: Subtokenizer object for encoding and decoding source and + translated lines. + input_file: file containing lines to translate + output_file: file that stores the generated translations. + print_all_translations: If true, all translations are printed to stdout. + + Raises: + ValueError: if output file is invalid. + """ + batch_size = _DECODE_BATCH_SIZE + + # Read and sort inputs by length. Keep dictionary (original index-->new index + # in sorted list) to write translations in the original order. + sorted_inputs, sorted_keys = _get_sorted_inputs(input_file) + num_decode_batches = (len(sorted_inputs) - 1) // batch_size + 1 + + def input_generator(): + """Yield encoded strings from sorted_inputs.""" + for i, line in enumerate(sorted_inputs): + if i % batch_size == 0: + batch_num = (i // batch_size) + 1 + + tf.logging.info("Decoding batch %d out of %d." % + (batch_num, num_decode_batches)) + yield _encode_and_add_eos(line, subtokenizer) + + def input_fn(): + """Created batched dataset of encoded inputs.""" + ds = tf.data.Dataset.from_generator( + input_generator, tf.int64, tf.TensorShape([None])) + ds = ds.padded_batch(batch_size, [None]) + return ds + + translations = [] + for i, prediction in enumerate(estimator.predict(input_fn)): + translation = _trim_and_decode(prediction["outputs"], subtokenizer) + translations.append(translation) + + if print_all_translations: + tf.logging.info("Translating:\n\tInput: %s\n\tOutput: %s" % + (sorted_inputs[i], translation)) + + # Write translations in the order they appeared in the original file. + if output_file is not None: + if tf.io.gfile.isdir(output_file): + raise ValueError("File output is a directory, will not save outputs to " + "file.") + tf.logging.info("Writing to file %s" % output_file) + with tf.io.gfile.GFile(output_file, "w") as f: + for i in sorted_keys: + f.write("%s\n" % translations[i]) + + +def translate_text(estimator, subtokenizer, txt): + """Translate a single string.""" + encoded_txt = _encode_and_add_eos(txt, subtokenizer) + + def input_fn(): + ds = tf.data.Dataset.from_tensors(encoded_txt) + ds = ds.batch(_DECODE_BATCH_SIZE) + return ds + + predictions = estimator.predict(input_fn) + translation = next(predictions)["outputs"] + translation = _trim_and_decode(translation, subtokenizer) + tf.logging.info("Translation of \"%s\": \"%s\"" % (txt, translation)) + + +def main(unused_argv): + from official.transformer import transformer_main + + tf.logging.set_verbosity(tf.logging.INFO) + + if FLAGS.text is None and FLAGS.file is None: + tf.logging.warn("Nothing to translate. Make sure to call this script using " + "flags --text or --file.") + return + + subtokenizer = tokenizer.Subtokenizer(FLAGS.vocab_file) + + # Set up estimator and params + params = transformer_main.PARAMS_MAP[FLAGS.param_set] + params["beam_size"] = _BEAM_SIZE + params["alpha"] = _ALPHA + params["extra_decode_length"] = _EXTRA_DECODE_LENGTH + params["batch_size"] = _DECODE_BATCH_SIZE + estimator = tf.estimator.Estimator( + model_fn=transformer_main.model_fn, model_dir=FLAGS.model_dir, + params=params) + + if FLAGS.text is not None: + tf.logging.info("Translating text: %s" % FLAGS.text) + translate_text(estimator, subtokenizer, FLAGS.text) + + if FLAGS.file is not None: + input_file = os.path.abspath(FLAGS.file) + tf.logging.info("Translating file: %s" % input_file) + if not tf.gfile.Exists(FLAGS.file): + raise ValueError("File does not exist: %s" % input_file) + + output_file = None + if FLAGS.file_out is not None: + output_file = os.path.abspath(FLAGS.file_out) + tf.logging.info("File output specified: %s" % output_file) + + translate_file(estimator, subtokenizer, input_file, output_file) + + +def define_translate_flags(): + """Define flags used for translation script.""" + # Model flags + flags.DEFINE_string( + name="model_dir", short_name="md", default="/tmp/transformer_model", + help=flags_core.help_wrap( + "Directory containing Transformer model checkpoints.")) + flags.DEFINE_enum( + name="param_set", short_name="mp", default="big", + enum_values=["base", "big"], + help=flags_core.help_wrap( + "Parameter set to use when creating and training the model. The " + "parameters define the input shape (batch size and max length), " + "model configuration (size of embedding, # of hidden layers, etc.), " + "and various other settings. The big parameter set increases the " + "default batch size, embedding/hidden size, and filter size. For a " + "complete list of parameters, please see model/model_params.py.")) + flags.DEFINE_string( + name="vocab_file", short_name="vf", default=None, + help=flags_core.help_wrap( + "Path to subtoken vocabulary file. If data_download.py was used to " + "download and encode the training data, look in the data_dir to find " + "the vocab file.")) + flags.mark_flag_as_required("vocab_file") + + flags.DEFINE_string( + name="text", default=None, + help=flags_core.help_wrap( + "Text to translate. Output will be printed to console.")) + flags.DEFINE_string( + name="file", default=None, + help=flags_core.help_wrap( + "File containing text to translate. Translation will be printed to " + "console and, if --file_out is provided, saved to an output file.")) + flags.DEFINE_string( + name="file_out", default=None, + help=flags_core.help_wrap( + "If --file flag is specified, save translation to this file.")) + + +if __name__ == "__main__": + define_translate_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io.py new file mode 100644 index 0000000..b7776fc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io.py @@ -0,0 +1,207 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convenience functions for managing dataset file buffers.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import multiprocessing +import multiprocessing.dummy +import os +import tempfile +import uuid + +from absl import logging +import numpy as np +import six +import tensorflow as tf +# pylint:disable=logging-format-interpolation + + +class _GarbageCollector(object): + """Deletes temporary buffer files at exit. + + Certain tasks (such as NCF Recommendation) require writing buffers to + temporary files. (Which may be local or distributed.) It is not generally safe + to delete these files during operation, but they should be cleaned up. This + class keeps track of temporary files created, and deletes them at exit. + """ + def __init__(self): + self.temp_buffers = [] + + def register(self, filepath): + self.temp_buffers.append(filepath) + + def purge(self): + try: + for i in self.temp_buffers: + if tf.io.gfile.exists(i): + tf.io.gfile.remove(i) + logging.info("Buffer file {} removed".format(i)) + except Exception as e: + logging.error("Failed to cleanup buffer files: {}".format(e)) + + +_GARBAGE_COLLECTOR = _GarbageCollector() +atexit.register(_GARBAGE_COLLECTOR.purge) + +_ROWS_PER_CORE = 50000 + + +def write_to_temp_buffer(dataframe, buffer_folder, columns): + if buffer_folder is None: + _, buffer_path = tempfile.mkstemp() + else: + tf.io.gfile.makedirs(buffer_folder) + buffer_path = os.path.join(buffer_folder, str(uuid.uuid4())) + _GARBAGE_COLLECTOR.register(buffer_path) + + return write_to_buffer(dataframe, buffer_path, columns) + + +def iter_shard_dataframe(df, rows_per_core=1000): + """Two way shard of a dataframe. + + This function evenly shards a dataframe so that it can be mapped efficiently. + It yields a list of dataframes with length equal to the number of CPU cores, + with each dataframe having rows_per_core rows. (Except for the last batch + which may have fewer rows in the dataframes.) Passing vectorized inputs to + a pool is more effecient than iterating through a dataframe in serial and + passing a list of inputs to the pool. + + Args: + df: Pandas dataframe to be sharded. + rows_per_core: Number of rows in each shard. + + Returns: + A list of dataframe shards. + """ + n = len(df) + num_cores = min([multiprocessing.cpu_count(), n]) + + num_blocks = int(np.ceil(n / num_cores / rows_per_core)) + max_batch_size = num_cores * rows_per_core + for i in range(num_blocks): + min_index = i * max_batch_size + max_index = min([(i + 1) * max_batch_size, n]) + df_shard = df[min_index:max_index] + n_shard = len(df_shard) + boundaries = np.linspace(0, n_shard, num_cores + 1, dtype=np.int64) + yield [df_shard[boundaries[j]:boundaries[j+1]] for j in range(num_cores)] + + +def _shard_dict_to_examples(shard_dict): + """Converts a dict of arrays into a list of example bytes.""" + n = [i for i in shard_dict.values()][0].shape[0] + feature_list = [{} for _ in range(n)] + for column, values in shard_dict.items(): + if len(values.shape) == 1: + values = np.reshape(values, values.shape + (1,)) + + if values.dtype.kind == "i": + feature_map = lambda x: tf.train.Feature( + int64_list=tf.train.Int64List(value=x)) + elif values.dtype.kind == "f": + feature_map = lambda x: tf.train.Feature( + float_list=tf.train.FloatList(value=x)) + else: + raise ValueError("Invalid dtype") + for i in range(n): + feature_list[i][column] = feature_map(values[i]) + examples = [ + tf.train.Example(features=tf.train.Features(feature=example_features)) + for example_features in feature_list + ] + + return [e.SerializeToString() for e in examples] + + +def _serialize_shards(df_shards, columns, pool, writer): + """Map sharded dataframes to bytes, and write them to a buffer. + + Args: + df_shards: A list of pandas dataframes. (Should be of similar size) + columns: The dataframe columns to be serialized. + pool: A pool to serialize in parallel. + writer: A TFRecordWriter to write the serialized shards. + """ + # Pandas does not store columns of arrays as nd arrays. stack remedies this. + map_inputs = [{c: np.stack(shard[c].values, axis=0) for c in columns} + for shard in df_shards] + + # Failure within pools is very irksome. Thus, it is better to thoroughly check + # inputs in the main process. + for inp in map_inputs: + # Check that all fields have the same number of rows. + assert len(set([v.shape[0] for v in inp.values()])) == 1 + for val in inp.values(): + assert hasattr(val, "dtype") + assert hasattr(val.dtype, "kind") + assert val.dtype.kind in ("i", "f") + assert len(val.shape) in (1, 2) + shard_bytes = pool.map(_shard_dict_to_examples, map_inputs) + for s in shard_bytes: + for example in s: + writer.write(example) + + +def write_to_buffer(dataframe, buffer_path, columns, expected_size=None): + """Write a dataframe to a binary file for a dataset to consume. + + Args: + dataframe: The pandas dataframe to be serialized. + buffer_path: The path where the serialized results will be written. + columns: The dataframe columns to be serialized. + expected_size: The size in bytes of the serialized results. This is used to + lazily construct the buffer. + + Returns: + The path of the buffer. + """ + if (tf.io.gfile.exists(buffer_path) and + tf.io.gfile.stat(buffer_path).length > 0): + actual_size = tf.io.gfile.stat(buffer_path).length + if expected_size == actual_size: + return buffer_path + logging.warning( + "Existing buffer {} has size {}. Expected size {}. Deleting and " + "rebuilding buffer.".format(buffer_path, actual_size, expected_size)) + tf.io.gfile.remove(buffer_path) + + if dataframe is None: + raise ValueError( + "dataframe was None but a valid existing buffer was not found.") + + tf.io.gfile.makedirs(os.path.split(buffer_path)[0]) + + logging.info("Constructing TFRecordDataset buffer: {}".format(buffer_path)) + + count = 0 + pool = multiprocessing.dummy.Pool(multiprocessing.cpu_count()) + try: + with tf.io.TFRecordWriter(buffer_path) as writer: + for df_shards in iter_shard_dataframe(df=dataframe, + rows_per_core=_ROWS_PER_CORE): + _serialize_shards(df_shards, columns, pool, writer) + count += sum([len(s) for s in df_shards]) + logging.info("{}/{} examples written.".format( + str(count).ljust(8), len(dataframe))) + finally: + pool.terminate() + + logging.info("Buffer write complete.") + return buffer_path diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io_test.py new file mode 100644 index 0000000..ba90d94 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/data/file_io_test.py @@ -0,0 +1,199 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for binary data file utilities.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import contextlib +import multiprocessing + +# pylint: disable=wrong-import-order +import numpy as np +import pandas as pd +import tensorflow as tf +# pylint: enable=wrong-import-order + +from official.r1.utils.data import file_io +from official.utils.misc import keras_utils + + +_RAW_ROW = "raw_row" +_DUMMY_COL = "column_0" +_DUMMY_VEC_COL = "column_1" +_DUMMY_VEC_LEN = 4 + +_ROWS_PER_CORE = 4 +_TEST_CASES = [ + # One batch of one + dict(row_count=1, cpu_count=1, expected=[ + [[0]] + ]), + + dict(row_count=10, cpu_count=1, expected=[ + [[0, 1, 2, 3]], [[4, 5, 6, 7]], [[8, 9]] + ]), + + dict(row_count=21, cpu_count=1, expected=[ + [[0, 1, 2, 3]], [[4, 5, 6, 7]], [[8, 9, 10, 11]], + [[12, 13, 14, 15]], [[16, 17, 18, 19]], [[20]] + ]), + + dict(row_count=1, cpu_count=4, expected=[ + [[0]] + ]), + + dict(row_count=10, cpu_count=4, expected=[ + [[0, 1], [2, 3, 4], [5, 6], [7, 8, 9]] + ]), + + dict(row_count=21, cpu_count=4, expected=[ + [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]], + [[16], [17], [18], [19, 20]] + ]), + + dict(row_count=10, cpu_count=8, expected=[ + [[0], [1], [2], [3, 4], [5], [6], [7], [8, 9]] + ]), + + dict(row_count=40, cpu_count=8, expected=[ + [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], + [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], + [28, 29, 30, 31]], + [[32], [33], [34], [35], [36], [37], [38], [39]] + ]), +] + +_FEATURE_MAP = { + _RAW_ROW: tf.io.FixedLenFeature([1], dtype=tf.int64), + _DUMMY_COL: tf.io.FixedLenFeature([1], dtype=tf.int64), + _DUMMY_VEC_COL: tf.io.FixedLenFeature([_DUMMY_VEC_LEN], dtype=tf.float32) +} + + +@contextlib.contextmanager +def fixed_core_count(cpu_count): + """Override CPU count. + + file_io.py uses the cpu_count function to scale to the size of the instance. + However, this is not desirable for testing because it can make the test flaky. + Instead, this context manager fixes the count for more robust testing. + + Args: + cpu_count: How many cores multiprocessing claims to have. + + Yields: + Nothing. (for context manager only) + """ + old_count_fn = multiprocessing.cpu_count + multiprocessing.cpu_count = lambda: cpu_count + yield + multiprocessing.cpu_count = old_count_fn + + +class BaseTest(tf.test.TestCase): + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def _test_sharding(self, row_count, cpu_count, expected): + df = pd.DataFrame({_DUMMY_COL: list(range(row_count))}) + with fixed_core_count(cpu_count): + shards = list(file_io.iter_shard_dataframe(df, _ROWS_PER_CORE)) + result = [[j[_DUMMY_COL].tolist() for j in i] for i in shards] + self.assertAllEqual(expected, result) + + def test_tiny_rows_low_core(self): + self._test_sharding(**_TEST_CASES[0]) + + def test_small_rows_low_core(self): + self._test_sharding(**_TEST_CASES[1]) + + def test_large_rows_low_core(self): + self._test_sharding(**_TEST_CASES[2]) + + def test_tiny_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[3]) + + def test_small_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[4]) + + def test_large_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[5]) + + def test_small_rows_large_core(self): + self._test_sharding(**_TEST_CASES[6]) + + def test_large_rows_large_core(self): + self._test_sharding(**_TEST_CASES[7]) + + def _serialize_deserialize(self, num_cores=1, num_rows=20): + np.random.seed(1) + df = pd.DataFrame({ + # Serialization order is only deterministic for num_cores=1. raw_row is + # used in validation after the deserialization. + _RAW_ROW: np.array(range(num_rows), dtype=np.int64), + _DUMMY_COL: np.random.randint(0, 35, size=(num_rows,)), + _DUMMY_VEC_COL: [ + np.array([np.random.random() for _ in range(_DUMMY_VEC_LEN)]) + for i in range(num_rows) # pylint: disable=unused-variable + ] + }) + + with fixed_core_count(num_cores): + buffer_path = file_io.write_to_temp_buffer( + df, self.get_temp_dir(), [_RAW_ROW, _DUMMY_COL, _DUMMY_VEC_COL]) + + with self.session(graph=tf.Graph()) as sess: + dataset = tf.data.TFRecordDataset(buffer_path) + dataset = dataset.batch(1).map( + lambda x: tf.io.parse_example(serialized=x, features=_FEATURE_MAP)) + + data_iter = tf.compat.v1.data.make_one_shot_iterator(dataset) + seen_rows = set() + for i in range(num_rows+5): + row = data_iter.get_next() + try: + row_id, val_0, val_1 = sess.run( + [row[_RAW_ROW], row[_DUMMY_COL], row[_DUMMY_VEC_COL]]) + row_id, val_0, val_1 = row_id[0][0], val_0[0][0], val_1[0] + assert row_id not in seen_rows + seen_rows.add(row_id) + + self.assertEqual(val_0, df[_DUMMY_COL][row_id]) + self.assertAllClose(val_1, df[_DUMMY_VEC_COL][row_id]) + + self.assertLess(i, num_rows, msg="Too many rows.") + except tf.errors.OutOfRangeError: + self.assertGreaterEqual(i, num_rows, msg="Too few rows.") + + file_io._GARBAGE_COLLECTOR.purge() + assert not tf.io.gfile.exists(buffer_path) + + def test_serialize_deserialize_0(self): + self._serialize_deserialize(num_cores=1) + + def test_serialize_deserialize_1(self): + self._serialize_deserialize(num_cores=2) + + def test_serialize_deserialize_2(self): + self._serialize_deserialize(num_cores=8) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export.py new file mode 100644 index 0000000..8061c28 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export.py @@ -0,0 +1,49 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convenience functions for exporting models as SavedModels or other types.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +def build_tensor_serving_input_receiver_fn(shape, dtype=tf.float32, + batch_size=1): + """Returns a input_receiver_fn that can be used during serving. + + This expects examples to come through as float tensors, and simply + wraps them as TensorServingInputReceivers. + + Arguably, this should live in tf.estimator.export. Testing here first. + + Args: + shape: list representing target size of a single example. + dtype: the expected datatype for the input example + batch_size: number of input tensors that will be passed for prediction + + Returns: + A function that itself returns a TensorServingInputReceiver. + """ + def serving_input_receiver_fn(): + # Prep a placeholder where the input example will be fed in + features = tf.compat.v1.placeholder( + dtype=dtype, shape=[batch_size] + shape, name='input_tensor') + + return tf.estimator.export.TensorServingInputReceiver( + features=features, receiver_tensors=features) + + return serving_input_receiver_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export_test.py new file mode 100644 index 0000000..3785edd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/export_test.py @@ -0,0 +1,63 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for exporting utils.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.r1.utils import export + + +class ExportUtilsTest(tf.test.TestCase): + """Tests for the ExportUtils.""" + + def test_build_tensor_serving_input_receiver_fn(self): + receiver_fn = export.build_tensor_serving_input_receiver_fn(shape=[4, 5]) + with tf.Graph().as_default(): + receiver = receiver_fn() + self.assertIsInstance( + receiver, tf.estimator.export.TensorServingInputReceiver) + + self.assertIsInstance(receiver.features, tf.Tensor) + self.assertEqual(receiver.features.shape, tf.TensorShape([1, 4, 5])) + self.assertEqual(receiver.features.dtype, tf.float32) + self.assertIsInstance(receiver.receiver_tensors, dict) + # Note that Python 3 can no longer index .values() directly; cast to list. + self.assertEqual(list(receiver.receiver_tensors.values())[0].shape, + tf.TensorShape([1, 4, 5])) + + def test_build_tensor_serving_input_receiver_fn_batch_dtype(self): + receiver_fn = export.build_tensor_serving_input_receiver_fn( + shape=[4, 5], dtype=tf.int8, batch_size=10) + + with tf.Graph().as_default(): + receiver = receiver_fn() + self.assertIsInstance( + receiver, tf.estimator.export.TensorServingInputReceiver) + + self.assertIsInstance(receiver.features, tf.Tensor) + self.assertEqual(receiver.features.shape, tf.TensorShape([10, 4, 5])) + self.assertEqual(receiver.features.dtype, tf.int8) + self.assertIsInstance(receiver.receiver_tensors, dict) + # Note that Python 3 can no longer index .values() directly; cast to list. + self.assertEqual(list(receiver.receiver_tensors.values())[0].shape, + tf.TensorShape([10, 4, 5])) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu.py new file mode 100644 index 0000000..737a794 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu.py @@ -0,0 +1,116 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions specific to running TensorFlow on TPUs.""" + +import tensorflow as tf + + +# "local" is a magic word in the TPU cluster resolver; it informs the resolver +# to use the local CPU as the compute device. This is useful for testing and +# debugging; the code flow is ostensibly identical, but without the need to +# actually have a TPU on the other end. +LOCAL = "local" + + +def construct_scalar_host_call(metric_dict, model_dir, prefix=""): + """Construct a host call to log scalars when training on TPU. + + Args: + metric_dict: A dict of the tensors to be logged. + model_dir: The location to write the summary. + prefix: The prefix (if any) to prepend to the metric names. + + Returns: + A tuple of (function, args_to_be_passed_to_said_function) + """ + # type: (dict, str) -> (function, list) + metric_names = list(metric_dict.keys()) + + def host_call_fn(global_step, *args): + """Training host call. Creates scalar summaries for training metrics. + + This function is executed on the CPU and should not directly reference + any Tensors in the rest of the `model_fn`. To pass Tensors from the + model to the `metric_fn`, provide as part of the `host_call`. See + https://www.tensorflow.org/api_docs/python/tf/contrib/tpu/TPUEstimatorSpec + for more information. + + Arguments should match the list of `Tensor` objects passed as the second + element in the tuple passed to `host_call`. + + Args: + global_step: `Tensor with shape `[batch]` for the global_step + *args: Remaining tensors to log. + + Returns: + List of summary ops to run on the CPU host. + """ + step = global_step[0] + with tf.compat.v1.summary.create_file_writer( + logdir=model_dir, filename_suffix=".host_call").as_default(): + with tf.compat.v1.summary.always_record_summaries(): + for i, name in enumerate(metric_names): + tf.compat.v1.summary.scalar(prefix + name, args[i][0], step=step) + + return tf.compat.v1.summary.all_summary_ops() + + # To log the current learning rate, and gradient norm for Tensorboard, the + # summary op needs to be run on the host CPU via host_call. host_call + # expects [batch_size, ...] Tensors, thus reshape to introduce a batch + # dimension. These Tensors are implicitly concatenated to + # [params['batch_size']]. + global_step_tensor = tf.reshape( + tf.compat.v1.train.get_or_create_global_step(), [1]) + other_tensors = [tf.reshape(metric_dict[key], [1]) for key in metric_names] + + return host_call_fn, [global_step_tensor] + other_tensors + + +def embedding_matmul(embedding_table, values, mask, name="embedding_matmul"): + """Performs embedding lookup via a matmul. + + The matrix to be multiplied by the embedding table Tensor is constructed + via an implementation of scatter based on broadcasting embedding indices + and performing an equality comparison against a broadcasted + range(num_embedding_table_rows). All masked positions will produce an + embedding vector of zeros. + + Args: + embedding_table: Tensor of embedding table. + Rank 2 (table_size x embedding dim) + values: Tensor of embedding indices. Rank 2 (batch x n_indices) + mask: Tensor of mask / weights. Rank 2 (batch x n_indices) + name: Optional name scope for created ops + + Returns: + Rank 3 tensor of embedding vectors. + """ + + with tf.name_scope(name): + n_embeddings = embedding_table.get_shape().as_list()[0] + batch_size, padded_size = values.shape.as_list() + + emb_idcs = tf.tile( + tf.reshape(values, (batch_size, padded_size, 1)), (1, 1, n_embeddings)) + emb_weights = tf.tile( + tf.reshape(mask, (batch_size, padded_size, 1)), (1, 1, n_embeddings)) + col_idcs = tf.tile( + tf.reshape(tf.range(n_embeddings), (1, 1, n_embeddings)), + (batch_size, padded_size, 1)) + one_hot = tf.where( + tf.equal(emb_idcs, col_idcs), emb_weights, + tf.zeros((batch_size, padded_size, n_embeddings))) + + return tf.tensordot(one_hot, embedding_table, 1) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu_test.py new file mode 100644 index 0000000..ba5b868 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/utils/tpu_test.py @@ -0,0 +1,108 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test TPU optimized matmul embedding.""" + +import numpy as np +import tensorflow as tf + +from official.r1.utils import tpu as tpu_utils + + +TEST_CASES = [ + dict(embedding_dim=256, vocab_size=1000, sequence_length=64, + batch_size=32, seed=54131), + dict(embedding_dim=8, vocab_size=15, sequence_length=12, + batch_size=256, seed=536413), + dict(embedding_dim=2048, vocab_size=512, sequence_length=50, + batch_size=8, seed=35124) +] + + +class TPUBaseTester(tf.test.TestCase): + def construct_embedding_and_values(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + np.random.seed(seed) + + embeddings = np.random.random(size=(vocab_size, embedding_dim)) + embedding_table = tf.convert_to_tensor(value=embeddings, dtype=tf.float32) + + tokens = np.random.randint(low=1, high=vocab_size-1, + size=(batch_size, sequence_length)) + for i in range(batch_size): + tokens[i, np.random.randint(low=0, high=sequence_length-1):] = 0 + values = tf.convert_to_tensor(value=tokens, dtype=tf.int32) + mask = tf.cast(tf.not_equal(values, 0), dtype=tf.float32) + return embedding_table, values, mask + + def _test_embedding(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + """Test that matmul embedding matches embedding lookup (gather).""" + + with self.test_session(): + embedding_table, values, mask = self.construct_embedding_and_values( + embedding_dim=embedding_dim, + vocab_size=vocab_size, + sequence_length=sequence_length, + batch_size=batch_size, + seed=seed + ) + + embedding = (tf.nn.embedding_lookup(params=embedding_table, ids=values) * + tf.expand_dims(mask, -1)) + + matmul_embedding = tpu_utils.embedding_matmul( + embedding_table=embedding_table, values=values, mask=mask) + + self.assertAllClose(embedding, matmul_embedding) + + def _test_masking(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + """Test that matmul embedding properly zeros masked positions.""" + with self.test_session(): + embedding_table, values, mask = self.construct_embedding_and_values( + embedding_dim=embedding_dim, + vocab_size=vocab_size, + sequence_length=sequence_length, + batch_size=batch_size, + seed=seed + ) + + matmul_embedding = tpu_utils.embedding_matmul( + embedding_table=embedding_table, values=values, mask=mask) + + self.assertAllClose(matmul_embedding, + matmul_embedding * tf.expand_dims(mask, -1)) + + def test_embedding_0(self): + self._test_embedding(**TEST_CASES[0]) + + def test_embedding_1(self): + self._test_embedding(**TEST_CASES[1]) + + def test_embedding_2(self): + self._test_embedding(**TEST_CASES[2]) + + def test_masking_0(self): + self._test_masking(**TEST_CASES[0]) + + def test_masking_1(self): + self._test_masking(**TEST_CASES[1]) + + def test_masking_2(self): + self._test_masking(**TEST_CASES[2]) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/README.md new file mode 100644 index 0000000..6598d89 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/README.md @@ -0,0 +1,102 @@ +![No Maintenance Intended](https://img.shields.io/badge/No%20Maintenance%20Intended-%E2%9C%95-red.svg) +![TensorFlow Requirement: 1.x](https://img.shields.io/badge/TensorFlow%20Requirement-1.x-brightgreen) +![TensorFlow 2 Not Supported](https://img.shields.io/badge/TensorFlow%202%20Not%20Supported-%E2%9C%95-red.svg) + +# Predicting Income with the Census Income Dataset + +The implementation is based on TensorFlow 1.x. + +## Overview +The [Census Income Data Set](https://archive.ics.uci.edu/ml/datasets/Census+Income) contains over 48,000 samples with attributes including age, occupation, education, and income (a binary label, either `>50K` or `<=50K`). The dataset is split into roughly 32,000 training and 16,000 testing samples. + +Here, we use the [wide and deep model](https://research.googleblog.com/2016/06/wide-deep-learning-better-together-with.html) to predict the income labels. The **wide model** is able to memorize interactions with data with a large number of features but not able to generalize these learned interactions on new data. The **deep model** generalizes well but is unable to learn exceptions within the data. The **wide and deep model** combines the two models and is able to generalize while learning exceptions. + +For the purposes of this example code, the Census Income Data Set was chosen to allow the model to train in a reasonable amount of time. You'll notice that the deep model performs almost as well as the wide and deep model on this dataset. The wide and deep model truly shines on larger data sets with high-cardinality features, where each feature has millions/billions of unique possible values (which is the specialty of the wide model). + +Finally, a key point. As a modeler and developer, think about how this dataset is used and the potential benefits and harm a model's predictions can cause. A model like this could reinforce societal biases and disparities. Is a feature relevant to the problem you want to solve, or will it introduce bias? For more information, read about [ML fairness](https://developers.google.com/machine-learning/fairness-overview/). + +--- + +The code sample in this directory uses the high level `tf.estimator.Estimator` API. This API is great for fast iteration and quickly adapting models to your own datasets without major code overhauls. It allows you to move from single-worker training to distributed training, and it makes it easy to export model binaries for prediction. + +The input function for the `Estimator` uses `tf.contrib.data.TextLineDataset`, which creates a `Dataset` object. The `Dataset` API makes it easy to apply transformations (map, batch, shuffle, etc.) to the data. [Read more here](https://www.tensorflow.org/guide/datasets). + +The `Estimator` and `Dataset` APIs are both highly encouraged for fast development and efficient training. + +## Running the code +First make sure you've [added the models folder to your Python path](/official/#running-the-models); otherwise you may encounter an error like `ImportError: No module named official.wide_deep`. + +### Setup +The [Census Income Data Set](https://archive.ics.uci.edu/ml/datasets/Census+Income) that this sample uses for training is hosted by the [UC Irvine Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/). We have provided a script that downloads and cleans the necessary files. + +``` +python census_dataset.py +``` + +This will download the files to `/tmp/census_data`. To change the directory, set the `--data_dir` flag. + +### Training +You can run the code locally as follows: + +``` +python census_main.py +``` + +The model is saved to `/tmp/census_model` by default, which can be changed using the `--model_dir` flag. + +To run the *wide* or *deep*-only models, set the `--model_type` flag to `wide` or `deep`. Other flags are configurable as well; see `census_main.py` for details. + +The final accuracy should be over 83% with any of the three model types. + +You can also experiment with `-inter` and `-intra` flag to explore inter/intra op parallelism for potential better performance as follows: + +``` +python census_main.py --inter= --intra= +``` +Please note the above optional inter/intra op does not affect model accuracy. These are TensorFlow framework configurations that only affect execution time. +For more details regarding the above inter/intra flags, please refer to [Optimizing_for_CPU](https://www.tensorflow.org/performance/performance_guide#optimizing_for_cpu) or [TensorFlow config.proto source code](https://github.com/tensorflow/tensorflow/blob/26b4dfa65d360f2793ad75083c797d57f8661b93/tensorflow/core/protobuf/config.proto#L165). + +### TensorBoard + +Run TensorBoard to inspect the details about the graph and training progression. + +``` +tensorboard --logdir=/tmp/census_model +``` + +## Inference with SavedModel +You can export the model into Tensorflow [SavedModel](https://www.tensorflow.org/guide/saved_model) format by using the argument `--export_dir`: + +``` +python census_main.py --export_dir /tmp/wide_deep_saved_model +``` + +After the model finishes training, use [`saved_model_cli`](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) to inspect and execute the SavedModel. + +Try the following commands to inspect the SavedModel: + +**Replace `${TIMESTAMP}` with the folder produced (e.g. 1524249124)** +``` +# List possible tag_sets. Only one metagraph is saved, so there will be one option. +saved_model_cli show --dir /tmp/wide_deep_saved_model/${TIMESTAMP}/ + +# Show SignatureDefs for tag_set=serve. SignatureDefs define the outputs to show. +saved_model_cli show --dir /tmp/wide_deep_saved_model/${TIMESTAMP}/ \ + --tag_set serve --all +``` + +### Inference +Let's use the model to predict the income group of two examples: +``` +saved_model_cli run --dir /tmp/wide_deep_saved_model/${TIMESTAMP}/ \ +--tag_set serve --signature_def="predict" \ +--input_examples='examples=[{"age":[46.], "education_num":[10.], "capital_gain":[7688.], "capital_loss":[0.], "hours_per_week":[38.]}, {"age":[24.], "education_num":[13.], "capital_gain":[0.], "capital_loss":[0.], "hours_per_week":[50.]}]' +``` + +This will print out the predicted classes and class probabilities. Class 0 is the <=50k group and 1 is the >50k group. + +## Additional Links + +If you are interested in distributed training, take a look at [Distributed TensorFlow](https://www.tensorflow.org/deploy/distributed). + +You can also [run this model on Cloud ML Engine](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction), which provides [hyperparameter tuning](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#hyperparameter_tuning) to maximize your model's results and enables [deploying your model for prediction](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#deploy_a_model_to_support_prediction). diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_dataset.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_dataset.py new file mode 100644 index 0000000..7aac80e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_dataset.py @@ -0,0 +1,205 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Download and clean the Census Income Dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys + +# pylint: disable=wrong-import-order +from absl import app as absl_app +from absl import flags +from six.moves import urllib +from six.moves import zip +import tensorflow as tf +# pylint: enable=wrong-import-order + +from official.utils.flags import core as flags_core + + +DATA_URL = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult' +TRAINING_FILE = 'adult.data' +TRAINING_URL = '%s/%s' % (DATA_URL, TRAINING_FILE) +EVAL_FILE = 'adult.test' +EVAL_URL = '%s/%s' % (DATA_URL, EVAL_FILE) + + +_CSV_COLUMNS = [ + 'age', 'workclass', 'fnlwgt', 'education', 'education_num', + 'marital_status', 'occupation', 'relationship', 'race', 'gender', + 'capital_gain', 'capital_loss', 'hours_per_week', 'native_country', + 'income_bracket' +] + +_CSV_COLUMN_DEFAULTS = [[0], [''], [0], [''], [0], [''], [''], [''], [''], [''], + [0], [0], [0], [''], ['']] + +_HASH_BUCKET_SIZE = 1000 + +_NUM_EXAMPLES = { + 'train': 32561, + 'validation': 16281, +} + + +def _download_and_clean_file(filename, url): + """Downloads data from url, and makes changes to match the CSV format.""" + temp_file, _ = urllib.request.urlretrieve(url) + with tf.gfile.Open(temp_file, 'r') as temp_eval_file: + with tf.gfile.Open(filename, 'w') as eval_file: + for line in temp_eval_file: + line = line.strip() + line = line.replace(', ', ',') + if not line or ',' not in line: + continue + if line[-1] == '.': + line = line[:-1] + line += '\n' + eval_file.write(line) + tf.gfile.Remove(temp_file) + + +def download(data_dir): + """Download census data if it is not already present.""" + tf.gfile.MakeDirs(data_dir) + + training_file_path = os.path.join(data_dir, TRAINING_FILE) + if not tf.gfile.Exists(training_file_path): + _download_and_clean_file(training_file_path, TRAINING_URL) + + eval_file_path = os.path.join(data_dir, EVAL_FILE) + if not tf.gfile.Exists(eval_file_path): + _download_and_clean_file(eval_file_path, EVAL_URL) + + +def build_model_columns(): + """Builds a set of wide and deep feature columns.""" + # Continuous variable columns + age = tf.feature_column.numeric_column('age') + education_num = tf.feature_column.numeric_column('education_num') + capital_gain = tf.feature_column.numeric_column('capital_gain') + capital_loss = tf.feature_column.numeric_column('capital_loss') + hours_per_week = tf.feature_column.numeric_column('hours_per_week') + + education = tf.feature_column.categorical_column_with_vocabulary_list( + 'education', [ + 'Bachelors', 'HS-grad', '11th', 'Masters', '9th', 'Some-college', + 'Assoc-acdm', 'Assoc-voc', '7th-8th', 'Doctorate', 'Prof-school', + '5th-6th', '10th', '1st-4th', 'Preschool', '12th']) + + marital_status = tf.feature_column.categorical_column_with_vocabulary_list( + 'marital_status', [ + 'Married-civ-spouse', 'Divorced', 'Married-spouse-absent', + 'Never-married', 'Separated', 'Married-AF-spouse', 'Widowed']) + + relationship = tf.feature_column.categorical_column_with_vocabulary_list( + 'relationship', [ + 'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried', + 'Other-relative']) + + workclass = tf.feature_column.categorical_column_with_vocabulary_list( + 'workclass', [ + 'Self-emp-not-inc', 'Private', 'State-gov', 'Federal-gov', + 'Local-gov', '?', 'Self-emp-inc', 'Without-pay', 'Never-worked']) + + # To show an example of hashing: + occupation = tf.feature_column.categorical_column_with_hash_bucket( + 'occupation', hash_bucket_size=_HASH_BUCKET_SIZE) + + # Transformations. + age_buckets = tf.feature_column.bucketized_column( + age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65]) + + # Wide columns and deep columns. + base_columns = [ + education, marital_status, relationship, workclass, occupation, + age_buckets, + ] + + crossed_columns = [ + tf.feature_column.crossed_column( + ['education', 'occupation'], hash_bucket_size=_HASH_BUCKET_SIZE), + tf.feature_column.crossed_column( + [age_buckets, 'education', 'occupation'], + hash_bucket_size=_HASH_BUCKET_SIZE), + ] + + wide_columns = base_columns + crossed_columns + + deep_columns = [ + age, + education_num, + capital_gain, + capital_loss, + hours_per_week, + tf.feature_column.indicator_column(workclass), + tf.feature_column.indicator_column(education), + tf.feature_column.indicator_column(marital_status), + tf.feature_column.indicator_column(relationship), + # To show an example of embedding + tf.feature_column.embedding_column(occupation, dimension=8), + ] + + return wide_columns, deep_columns + + +def input_fn(data_file, num_epochs, shuffle, batch_size): + """Generate an input function for the Estimator.""" + assert tf.gfile.Exists(data_file), ( + '%s not found. Please make sure you have run census_dataset.py and ' + 'set the --data_dir argument to the correct path.' % data_file) + + def parse_csv(value): + tf.logging.info('Parsing {}'.format(data_file)) + columns = tf.decode_csv(value, record_defaults=_CSV_COLUMN_DEFAULTS) + features = dict(list(zip(_CSV_COLUMNS, columns))) + labels = features.pop('income_bracket') + classes = tf.equal(labels, '>50K') # binary classification + return features, classes + + # Extract lines from input files using the Dataset API. + dataset = tf.data.TextLineDataset(data_file) + + if shuffle: + dataset = dataset.shuffle(buffer_size=_NUM_EXAMPLES['train']) + + dataset = dataset.map(parse_csv, num_parallel_calls=5) + + # We call repeat after shuffling, rather than before, to prevent separate + # epochs from blending together. + dataset = dataset.repeat(num_epochs) + dataset = dataset.batch(batch_size) + return dataset + + +def define_data_download_flags(): + """Add flags specifying data download arguments.""" + flags.DEFINE_string( + name="data_dir", default="/tmp/census_data/", + help=flags_core.help_wrap( + "Directory to download and extract data.")) + + +def main(_): + download(flags.FLAGS.data_dir) + + +if __name__ == '__main__': + tf.logging.set_verbosity(tf.logging.INFO) + define_data_download_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_main.py new file mode 100644 index 0000000..bcd9cd6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_main.py @@ -0,0 +1,116 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Train DNN on census income dataset.""" + +import os + +from absl import app as absl_app +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.r1.wide_deep import census_dataset +from official.r1.wide_deep import wide_deep_run_loop + + +def define_census_flags(): + wide_deep_run_loop.define_wide_deep_flags() + flags.adopt_module_key_flags(wide_deep_run_loop) + flags_core.set_defaults(data_dir='/tmp/census_data', + model_dir='/tmp/census_model', + train_epochs=40, + epochs_between_evals=2, + inter_op_parallelism_threads=0, + intra_op_parallelism_threads=0, + batch_size=40) + + +def build_estimator(model_dir, model_type, model_column_fn, inter_op, intra_op): + """Build an estimator appropriate for the given model type.""" + wide_columns, deep_columns = model_column_fn() + hidden_units = [100, 75, 50, 25] + + # Create a tf.estimator.RunConfig to ensure the model is run on CPU, which + # trains faster than GPU for this model. + run_config = tf.estimator.RunConfig().replace( + session_config=tf.ConfigProto(device_count={'GPU': 0}, + inter_op_parallelism_threads=inter_op, + intra_op_parallelism_threads=intra_op)) + + if model_type == 'wide': + return tf.estimator.LinearClassifier( + model_dir=model_dir, + feature_columns=wide_columns, + config=run_config) + elif model_type == 'deep': + return tf.estimator.DNNClassifier( + model_dir=model_dir, + feature_columns=deep_columns, + hidden_units=hidden_units, + config=run_config) + else: + return tf.estimator.DNNLinearCombinedClassifier( + model_dir=model_dir, + linear_feature_columns=wide_columns, + dnn_feature_columns=deep_columns, + dnn_hidden_units=hidden_units, + config=run_config) + + +def run_census(flags_obj): + """Construct all necessary functions and call run_loop. + + Args: + flags_obj: Object containing user specified flags. + """ + if flags_obj.download_if_missing: + census_dataset.download(flags_obj.data_dir) + + train_file = os.path.join(flags_obj.data_dir, census_dataset.TRAINING_FILE) + test_file = os.path.join(flags_obj.data_dir, census_dataset.EVAL_FILE) + + # Train and evaluate the model every `flags.epochs_between_evals` epochs. + def train_input_fn(): + return census_dataset.input_fn( + train_file, flags_obj.epochs_between_evals, True, flags_obj.batch_size) + + def eval_input_fn(): + return census_dataset.input_fn(test_file, 1, False, flags_obj.batch_size) + + tensors_to_log = { + 'average_loss': '{loss_prefix}head/truediv', + 'loss': '{loss_prefix}head/weighted_loss/Sum' + } + + wide_deep_run_loop.run_loop( + name="Census Income", train_input_fn=train_input_fn, + eval_input_fn=eval_input_fn, + model_column_fn=census_dataset.build_model_columns, + build_estimator_fn=build_estimator, + flags_obj=flags_obj, + tensors_to_log=tensors_to_log, + early_stop=True) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + run_census(flags.FLAGS) + + +if __name__ == '__main__': + tf.logging.set_verbosity(tf.logging.INFO) + define_census_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.csv b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.csv new file mode 100644 index 0000000..374397d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.csv @@ -0,0 +1,30 @@ +39,State-gov,77516,Bachelors,13,Never-married,Adm-clerical,Not-in-family,,,2174,0,40,,<=50K +50,Self-emp-not-inc,83311,Bachelors,13,Married-civ-spouse,Exec-managerial,Husband,,,0,0,13,,<=50K +38,Private,215646,HS-grad,9,Divorced,Handlers-cleaners,Not-in-family,,,0,0,40,,<=50K +53,Private,234721,11th,7,Married-civ-spouse,Handlers-cleaners,Husband,,,0,0,40,,<=50K +28,Private,338409,Bachelors,13,Married-civ-spouse,Prof-specialty,Wife,,,0,0,40,,<=50K +37,Private,284582,Masters,14,Married-civ-spouse,Exec-managerial,Wife,,,0,0,40,,<=50K +49,Private,160187,9th,5,Married-spouse-absent,Other-service,Not-in-family,,,0,0,16,,<=50K +52,Self-emp-not-inc,209642,HS-grad,9,Married-civ-spouse,Exec-managerial,Husband,,,0,0,45,,>50K +31,Private,45781,Masters,14,Never-married,Prof-specialty,Not-in-family,,,14084,0,50,,>50K +42,Private,159449,Bachelors,13,Married-civ-spouse,Exec-managerial,Husband,,,5178,0,40,,>50K +37,Private,280464,Some-college,10,Married-civ-spouse,Exec-managerial,Husband,,,0,0,80,,>50K +30,State-gov,141297,Bachelors,13,Married-civ-spouse,Prof-specialty,Husband,,,0,0,40,,>50K +23,Private,122272,Bachelors,13,Never-married,Adm-clerical,Own-child,,,0,0,30,,<=50K +32,Private,205019,Assoc-acdm,12,Never-married,Sales,Not-in-family,,,0,0,50,,<=50K +40,Private,121772,Assoc-voc,11,Married-civ-spouse,Craft-repair,Husband,,,0,0,40,,>50K +34,Private,245487,7th-8th,4,Married-civ-spouse,Transport-moving,Husband,,,0,0,45,,<=50K +25,Self-emp-not-inc,176756,HS-grad,9,Never-married,Farming-fishing,Own-child,,,0,0,35,,<=50K +32,Private,186824,HS-grad,9,Never-married,Machine-op-inspct,Unmarried,,,0,0,40,,<=50K +38,Private,28887,11th,7,Married-civ-spouse,Sales,Husband,,,0,0,50,,<=50K +43,Self-emp-not-inc,292175,Masters,14,Divorced,Exec-managerial,Unmarried,,,0,0,45,,>50K +40,Private,193524,Doctorate,16,Married-civ-spouse,Prof-specialty,Husband,,,0,0,60,,>50K +56,Local-gov,216851,Bachelors,13,Married-civ-spouse,Tech-support,Husband,,,0,0,40,,>50K +54,?,180211,Some-college,10,Married-civ-spouse,?,Husband,,,0,0,60,,>50K +22,State-gov,311512,Some-college,10,Married-civ-spouse,Other-service,Husband,,,0,0,15,,<=50K +31,Private,84154,Some-college,10,Married-civ-spouse,Sales,Husband,,,0,0,38,,>50K +57,Federal-gov,337895,Bachelors,13,Married-civ-spouse,Prof-specialty,Husband,,,0,0,40,,>50K +47,Private,51835,Prof-school,15,Married-civ-spouse,Prof-specialty,Wife,,,0,1902,60,,>50K +50,Federal-gov,251585,Bachelors,13,Divorced,Exec-managerial,Not-in-family,,,0,0,55,,>50K +25,Private,289980,HS-grad,9,Never-married,Handlers-cleaners,Not-in-family,,,0,0,35,,<=50K +42,Private,116632,Doctorate,16,Married-civ-spouse,Prof-specialty,Husband,,,0,0,45,,>50K diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.py new file mode 100644 index 0000000..8e1c865 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/census_test.py @@ -0,0 +1,169 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order +from absl import logging + +from official.utils.misc import keras_utils +from official.utils.testing import integration +from official.r1.wide_deep import census_dataset +from official.r1.wide_deep import census_main + +logging.set_verbosity(logging.ERROR) + +TEST_INPUT = ('18,Self-emp-not-inc,987,Bachelors,12,Married-civ-spouse,abc,' + 'Husband,zyx,wvu,34,56,78,tsr,<=50K') + +TEST_INPUT_VALUES = { + 'age': 18, + 'education_num': 12, + 'capital_gain': 34, + 'capital_loss': 56, + 'hours_per_week': 78, + 'education': 'Bachelors', + 'marital_status': 'Married-civ-spouse', + 'relationship': 'Husband', + 'workclass': 'Self-emp-not-inc', + 'occupation': 'abc', +} + +TEST_CSV = os.path.join(os.path.dirname(__file__), 'census_test.csv') + + +class BaseTest(tf.test.TestCase): + """Tests for Wide Deep model.""" + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BaseTest, cls).setUpClass() + census_main.define_census_flags() + + def setUp(self): + # Create temporary CSV file + self.temp_dir = self.get_temp_dir() + self.input_csv = os.path.join(self.temp_dir, 'test.csv') + with tf.io.gfile.GFile(self.input_csv, 'w') as temp_csv: + temp_csv.write(TEST_INPUT) + + with tf.io.gfile.GFile(TEST_CSV, 'r') as temp_csv: + test_csv_contents = temp_csv.read() + + # Used for end-to-end tests. + for fname in [census_dataset.TRAINING_FILE, census_dataset.EVAL_FILE]: + with tf.io.gfile.GFile( + os.path.join(self.temp_dir, fname), 'w') as test_csv: + test_csv.write(test_csv_contents) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_input_fn(self): + dataset = census_dataset.input_fn(self.input_csv, 1, False, 1) + features, labels = dataset.make_one_shot_iterator().get_next() + + with self.test_session() as sess: + features, labels = sess.run((features, labels)) + + # Compare the two features dictionaries. + for key in TEST_INPUT_VALUES: + self.assertTrue(key in features) + self.assertEqual(len(features[key]), 1) + feature_value = features[key][0] + + # Convert from bytes to string for Python 3. + if isinstance(feature_value, bytes): + feature_value = feature_value.decode() + + self.assertEqual(TEST_INPUT_VALUES[key], feature_value) + + self.assertFalse(labels) + + def build_and_test_estimator(self, model_type): + """Ensure that model trains and minimizes loss.""" + model = census_main.build_estimator( + self.temp_dir, model_type, + model_column_fn=census_dataset.build_model_columns, + inter_op=0, intra_op=0) + + # Train for 1 step to initialize model and evaluate initial loss + def get_input_fn(num_epochs, shuffle, batch_size): + def input_fn(): + return census_dataset.input_fn( + TEST_CSV, num_epochs=num_epochs, shuffle=shuffle, + batch_size=batch_size) + return input_fn + + model.train(input_fn=get_input_fn(1, True, 1), steps=1) + initial_results = model.evaluate(input_fn=get_input_fn(1, False, 1)) + + # Train for 100 epochs at batch size 3 and evaluate final loss + model.train(input_fn=get_input_fn(100, True, 3)) + final_results = model.evaluate(input_fn=get_input_fn(1, False, 1)) + + print('%s initial results:' % model_type, initial_results) + print('%s final results:' % model_type, final_results) + + # Ensure loss has decreased, while accuracy and both AUCs have increased. + self.assertLess(final_results['loss'], initial_results['loss']) + self.assertGreater(final_results['auc'], initial_results['auc']) + self.assertGreater(final_results['auc_precision_recall'], + initial_results['auc_precision_recall']) + self.assertGreater(final_results['accuracy'], initial_results['accuracy']) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_wide_deep_estimator_training(self): + self.build_and_test_estimator('wide_deep') + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_end_to_end_wide(self): + integration.run_synthetic( + main=census_main.main, tmp_root=self.get_temp_dir(), + extra_flags=[ + '--data_dir', self.get_temp_dir(), + '--model_type', 'wide', + '--download_if_missing=false' + ], + synth=False) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_end_to_end_deep(self): + integration.run_synthetic( + main=census_main.main, tmp_root=self.get_temp_dir(), + extra_flags=[ + '--data_dir', self.get_temp_dir(), + '--model_type', 'deep', + '--download_if_missing=false' + ], + synth=False) + + @unittest.skipIf(keras_utils.is_v2_0(), 'TF 1.0 only test.') + def test_end_to_end_wide_deep(self): + integration.run_synthetic( + main=census_main.main, tmp_root=self.get_temp_dir(), + extra_flags=[ + '--data_dir', self.get_temp_dir(), + '--model_type', 'wide_deep', + '--download_if_missing=false' + ], + synth=False) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_dataset.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_dataset.py new file mode 100644 index 0000000..311eb7f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_dataset.py @@ -0,0 +1,165 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Prepare MovieLens dataset for wide-deep.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import os + +# pylint: disable=wrong-import-order +from absl import app as absl_app +from absl import flags +import numpy as np +import tensorflow as tf +# pylint: enable=wrong-import-order + +from official.recommendation import movielens +from official.r1.utils.data import file_io +from official.utils.flags import core as flags_core + + +_BUFFER_SUBDIR = "wide_deep_buffer" +_FEATURE_MAP = { + movielens.USER_COLUMN: tf.compat.v1.FixedLenFeature([1], dtype=tf.int64), + movielens.ITEM_COLUMN: tf.compat.v1.FixedLenFeature([1], dtype=tf.int64), + movielens.TIMESTAMP_COLUMN: tf.compat.v1.FixedLenFeature([1], + dtype=tf.int64), + movielens.GENRE_COLUMN: tf.compat.v1.FixedLenFeature( + [movielens.N_GENRE], dtype=tf.int64), + movielens.RATING_COLUMN: tf.compat.v1.FixedLenFeature([1], + dtype=tf.float32), +} + +_BUFFER_SIZE = { + movielens.ML_1M: {"train": 107978119, "eval": 26994538}, + movielens.ML_20M: {"train": 2175203810, "eval": 543802008} +} + +_USER_EMBEDDING_DIM = 16 +_ITEM_EMBEDDING_DIM = 64 + +def build_model_columns(dataset): + """Builds a set of wide and deep feature columns.""" + user_id = tf.feature_column.categorical_column_with_vocabulary_list( + movielens.USER_COLUMN, range(1, movielens.NUM_USER_IDS[dataset])) + user_embedding = tf.feature_column.embedding_column( + user_id, _USER_EMBEDDING_DIM, max_norm=np.sqrt(_USER_EMBEDDING_DIM)) + + item_id = tf.feature_column.categorical_column_with_vocabulary_list( + movielens.ITEM_COLUMN, range(1, movielens.NUM_ITEM_IDS)) + item_embedding = tf.feature_column.embedding_column( + item_id, _ITEM_EMBEDDING_DIM, max_norm=np.sqrt(_ITEM_EMBEDDING_DIM)) + + time = tf.feature_column.numeric_column(movielens.TIMESTAMP_COLUMN) + genres = tf.feature_column.numeric_column( + movielens.GENRE_COLUMN, shape=(movielens.N_GENRE,), dtype=tf.uint8) + + deep_columns = [user_embedding, item_embedding, time, genres] + wide_columns = [] + + return wide_columns, deep_columns + + +def _deserialize(examples_serialized): + features = tf.parse_example(examples_serialized, _FEATURE_MAP) + return features, features[movielens.RATING_COLUMN] / movielens.MAX_RATING + + +def _buffer_path(data_dir, dataset, name): + return os.path.join(data_dir, _BUFFER_SUBDIR, + "{}_{}_buffer".format(dataset, name)) + + +def _df_to_input_fn(df, name, dataset, data_dir, batch_size, repeat, shuffle): + """Serialize a dataframe and write it to a buffer file.""" + buffer_path = _buffer_path(data_dir, dataset, name) + expected_size = _BUFFER_SIZE[dataset].get(name) + + file_io.write_to_buffer( + dataframe=df, buffer_path=buffer_path, + columns=list(_FEATURE_MAP.keys()), expected_size=expected_size) + + def input_fn(): + dataset = tf.data.TFRecordDataset(buffer_path) + # batch comes before map because map can deserialize multiple examples. + dataset = dataset.batch(batch_size) + dataset = dataset.map(_deserialize, num_parallel_calls=16) + if shuffle: + dataset = dataset.shuffle(shuffle) + + dataset = dataset.repeat(repeat) + return dataset.prefetch(1) + + return input_fn + + +def _check_buffers(data_dir, dataset): + train_path = os.path.join(data_dir, _BUFFER_SUBDIR, + "{}_{}_buffer".format(dataset, "train")) + eval_path = os.path.join(data_dir, _BUFFER_SUBDIR, + "{}_{}_buffer".format(dataset, "eval")) + + if not tf.gfile.Exists(train_path) or not tf.gfile.Exists(eval_path): + return False + + return all([ + tf.gfile.Stat(_buffer_path(data_dir, dataset, "train")).length == + _BUFFER_SIZE[dataset]["train"], + tf.gfile.Stat(_buffer_path(data_dir, dataset, "eval")).length == + _BUFFER_SIZE[dataset]["eval"], + ]) + + +def construct_input_fns(dataset, data_dir, batch_size=16, repeat=1): + """Construct train and test input functions, as well as the column fn.""" + if _check_buffers(data_dir, dataset): + train_df, eval_df = None, None + else: + df = movielens.csv_to_joint_dataframe(dataset=dataset, data_dir=data_dir) + df = movielens.integerize_genres(dataframe=df) + df = df.drop(columns=[movielens.TITLE_COLUMN]) + + train_df = df.sample(frac=0.8, random_state=0) + eval_df = df.drop(train_df.index) + + train_df = train_df.reset_index(drop=True) + eval_df = eval_df.reset_index(drop=True) + + train_input_fn = _df_to_input_fn( + df=train_df, name="train", dataset=dataset, data_dir=data_dir, + batch_size=batch_size, repeat=repeat, + shuffle=movielens.NUM_RATINGS[dataset]) + eval_input_fn = _df_to_input_fn( + df=eval_df, name="eval", dataset=dataset, data_dir=data_dir, + batch_size=batch_size, repeat=repeat, shuffle=None) + model_column_fn = functools.partial(build_model_columns, dataset=dataset) + + train_input_fn() + return train_input_fn, eval_input_fn, model_column_fn + + +def main(_): + movielens.download(dataset=flags.FLAGS.dataset, data_dir=flags.FLAGS.data_dir) + construct_input_fns(flags.FLAGS.dataset, flags.FLAGS.data_dir) + +if __name__ == "__main__": + tf.logging.set_verbosity(tf.logging.INFO) + movielens.define_data_download_flags() + flags.adopt_module_key_flags(movielens) + flags_core.set_defaults(dataset="ml-1m") + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_main.py new file mode 100644 index 0000000..39e98ce --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_main.py @@ -0,0 +1,115 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Train DNN on Kaggle movie dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app as absl_app +from absl import flags +import tensorflow as tf + +from official.recommendation import movielens +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.r1.wide_deep import movielens_dataset +from official.r1.wide_deep import wide_deep_run_loop + + +def define_movie_flags(): + """Define flags for movie dataset training.""" + wide_deep_run_loop.define_wide_deep_flags() + flags.DEFINE_enum( + name="dataset", default=movielens.ML_1M, + enum_values=movielens.DATASETS, case_sensitive=False, + help=flags_core.help_wrap("Dataset to be trained and evaluated.")) + flags.adopt_module_key_flags(wide_deep_run_loop) + flags_core.set_defaults(data_dir="/tmp/movielens-data/", + model_dir='/tmp/movie_model', + model_type="deep", + train_epochs=50, + epochs_between_evals=5, + inter_op_parallelism_threads=0, + intra_op_parallelism_threads=0, + batch_size=256) + + @flags.validator("stop_threshold", + message="stop_threshold not supported for movielens model") + def _no_stop(stop_threshold): + return stop_threshold is None + + +def build_estimator(model_dir, model_type, model_column_fn, inter_op, intra_op): + """Build an estimator appropriate for the given model type.""" + if model_type != "deep": + raise NotImplementedError("movie dataset only supports `deep` model_type") + _, deep_columns = model_column_fn() + hidden_units = [256, 256, 256, 128] + + run_config = tf.estimator.RunConfig().replace( + session_config=tf.ConfigProto(device_count={'GPU': 0}, + inter_op_parallelism_threads=inter_op, + intra_op_parallelism_threads=intra_op)) + return tf.estimator.DNNRegressor( + model_dir=model_dir, + feature_columns=deep_columns, + hidden_units=hidden_units, + optimizer=tf.compat.v1.train.AdamOptimizer(), + activation_fn=tf.nn.sigmoid, + dropout=0.3, + loss_reduction=tf.losses.Reduction.MEAN) + + +def run_movie(flags_obj): + """Construct all necessary functions and call run_loop. + + Args: + flags_obj: Object containing user specified flags. + """ + + if flags_obj.download_if_missing: + movielens.download(dataset=flags_obj.dataset, data_dir=flags_obj.data_dir) + + train_input_fn, eval_input_fn, model_column_fn = \ + movielens_dataset.construct_input_fns( + dataset=flags_obj.dataset, data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, repeat=flags_obj.epochs_between_evals) + + tensors_to_log = { + 'loss': '{loss_prefix}head/weighted_loss/value' + } + + wide_deep_run_loop.run_loop( + name="MovieLens", train_input_fn=train_input_fn, + eval_input_fn=eval_input_fn, + model_column_fn=model_column_fn, + build_estimator_fn=build_estimator, + flags_obj=flags_obj, + tensors_to_log=tensors_to_log, + early_stop=False) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + run_movie(flags.FLAGS) + + +if __name__ == '__main__': + tf.logging.set_verbosity(tf.logging.INFO) + define_movie_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_test.py new file mode 100644 index 0000000..5117f62 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/movielens_test.py @@ -0,0 +1,120 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import unittest + +import numpy as np +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.recommendation import movielens +from official.utils.misc import keras_utils +from official.utils.testing import integration +from official.r1.wide_deep import movielens_dataset +from official.r1.wide_deep import movielens_main +from absl import logging + +logging.set_verbosity(logging.ERROR) + + +TEST_INPUT_VALUES = { + "genres": np.array( + [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), + "user_id": [3], + "item_id": [4], +} + +TEST_ITEM_DATA = """item_id,titles,genres +1,Movie_1,Comedy|Romance +2,Movie_2,Adventure|Children's +3,Movie_3,Comedy|Drama +4,Movie_4,Comedy +5,Movie_5,Action|Crime|Thriller +6,Movie_6,Action +7,Movie_7,Action|Adventure|Thriller""" + +TEST_RATING_DATA = """user_id,item_id,rating,timestamp +1,2,5,978300760 +1,3,3,978302109 +1,6,3,978301968 +2,1,4,978300275 +2,7,5,978824291 +3,1,3,978302268 +3,4,5,978302039 +3,5,5,978300719 +""" + + +class BaseTest(tf.test.TestCase): + """Tests for Wide Deep model.""" + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BaseTest, cls).setUpClass() + movielens_main.define_movie_flags() + + def setUp(self): + # Create temporary CSV file + self.temp_dir = self.get_temp_dir() + tf.io.gfile.makedirs(os.path.join(self.temp_dir, movielens.ML_1M)) + + self.ratings_csv = os.path.join( + self.temp_dir, movielens.ML_1M, movielens.RATINGS_FILE) + self.item_csv = os.path.join( + self.temp_dir, movielens.ML_1M, movielens.MOVIES_FILE) + + with tf.io.gfile.GFile(self.ratings_csv, "w") as f: + f.write(TEST_RATING_DATA) + + with tf.io.gfile.GFile(self.item_csv, "w") as f: + f.write(TEST_ITEM_DATA) + + @unittest.skipIf(keras_utils.is_v2_0(), "TF 1.0 only test.") + def test_input_fn(self): + train_input_fn, _, _ = movielens_dataset.construct_input_fns( + dataset=movielens.ML_1M, data_dir=self.temp_dir, batch_size=8, repeat=1) + + dataset = train_input_fn() + features, labels = dataset.make_one_shot_iterator().get_next() + + with self.session() as sess: + features, labels = sess.run((features, labels)) + + # Compare the two features dictionaries. + for key in TEST_INPUT_VALUES: + self.assertTrue(key in features) + self.assertAllClose(TEST_INPUT_VALUES[key], features[key][0]) + + self.assertAllClose(labels[0], [1.0]) + + @unittest.skipIf(keras_utils.is_v2_0(), "TF 1.0 only test.") + def test_end_to_end_deep(self): + integration.run_synthetic( + main=movielens_main.main, tmp_root=self.temp_dir, + extra_flags=[ + "--data_dir", self.temp_dir, + "--download_if_missing=false", + "--train_epochs", "1", + "--epochs_between_evals", "1" + ], + synth=False) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/wide_deep_run_loop.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/wide_deep_run_loop.py new file mode 100644 index 0000000..a8e75e1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/r1/wide_deep/wide_deep_run_loop.py @@ -0,0 +1,133 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Core run logic for TensorFlow Wide & Deep Tutorial using tf.estimator API.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import shutil + +from absl import app as absl_app +from absl import flags +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.misc import model_helpers + + +LOSS_PREFIX = {'wide': 'linear/', 'deep': 'dnn/'} + + +def define_wide_deep_flags(): + """Add supervised learning flags, as well as wide-deep model type.""" + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + hooks=True, export_dir=True) + flags_core.define_benchmark() + flags_core.define_performance( + num_parallel_calls=False, inter_op=True, intra_op=True, + synthetic_data=False, max_train_steps=False, dtype=False, + all_reduce_alg=False) + + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_enum( + name="model_type", short_name="mt", default="wide_deep", + enum_values=['wide', 'deep', 'wide_deep'], + help="Select model topology.") + flags.DEFINE_boolean( + name="download_if_missing", default=True, help=flags_core.help_wrap( + "Download data to data_dir if it is not already present.")) + + +def export_model(model, model_type, export_dir, model_column_fn): + """Export to SavedModel format. + + Args: + model: Estimator object + model_type: string indicating model type. "wide", "deep" or "wide_deep" + export_dir: directory to export the model. + model_column_fn: Function to generate model feature columns. + """ + wide_columns, deep_columns = model_column_fn() + if model_type == 'wide': + columns = wide_columns + elif model_type == 'deep': + columns = deep_columns + else: + columns = wide_columns + deep_columns + feature_spec = tf.feature_column.make_parse_example_spec(columns) + example_input_fn = ( + tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)) + model.export_savedmodel(export_dir, example_input_fn, + strip_default_attrs=True) + + +def run_loop(name, train_input_fn, eval_input_fn, model_column_fn, + build_estimator_fn, flags_obj, tensors_to_log, early_stop=False): + """Define training loop.""" + model_helpers.apply_clean(flags.FLAGS) + model = build_estimator_fn( + model_dir=flags_obj.model_dir, model_type=flags_obj.model_type, + model_column_fn=model_column_fn, + inter_op=flags_obj.inter_op_parallelism_threads, + intra_op=flags_obj.intra_op_parallelism_threads) + + run_params = { + 'batch_size': flags_obj.batch_size, + 'train_epochs': flags_obj.train_epochs, + 'model_type': flags_obj.model_type, + } + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info('wide_deep', name, run_params, + test_id=flags_obj.benchmark_test_id) + + loss_prefix = LOSS_PREFIX.get(flags_obj.model_type, '') + tensors_to_log = {k: v.format(loss_prefix=loss_prefix) + for k, v in tensors_to_log.items()} + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, model_dir=flags_obj.model_dir, + batch_size=flags_obj.batch_size, tensors_to_log=tensors_to_log) + + # Train and evaluate the model every `flags.epochs_between_evals` epochs. + for n in range(flags_obj.train_epochs // flags_obj.epochs_between_evals): + model.train(input_fn=train_input_fn, hooks=train_hooks) + + results = model.evaluate(input_fn=eval_input_fn) + + # Display evaluation metrics + tf.logging.info('Results at epoch %d / %d', + (n + 1) * flags_obj.epochs_between_evals, + flags_obj.train_epochs) + tf.logging.info('-' * 60) + + for key in sorted(results): + tf.logging.info('%s: %s' % (key, results[key])) + + benchmark_logger.log_evaluation_result(results) + + if early_stop and model_helpers.past_stop_threshold( + flags_obj.stop_threshold, results['accuracy']): + break + + # Export the model + if flags_obj.export_dir is not None: + export_model(model, flags_obj.model_type, flags_obj.export_dir, + model_column_fn) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/README.md new file mode 100644 index 0000000..be916c9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/README.md @@ -0,0 +1,71 @@ +# Recommendation Model +## Overview +This is an implementation of the Neural Collaborative Filtering (NCF) framework with Neural Matrix Factorization (NeuMF) model as described in the [Neural Collaborative Filtering](https://arxiv.org/abs/1708.05031) paper. Current implementation is based on the code from the authors' [NCF code](https://github.com/hexiangnan/neural_collaborative_filtering) and the Stanford implementation in the [MLPerf Repo](https://github.com/mlperf/reference/tree/master/recommendation/pytorch). + +NCF is a general framework for collaborative filtering of recommendations in which a neural network architecture is used to model user-item interactions. Unlike traditional models, NCF does not resort to Matrix Factorization (MF) with an inner product on latent features of users and items. It replaces the inner product with a multi-layer perceptron that can learn an arbitrary function from data. + +Two instantiations of NCF are Generalized Matrix Factorization (GMF) and Multi-Layer Perceptron (MLP). GMF applies a linear kernel to model the latent feature interactions, and and MLP uses a nonlinear kernel to learn the interaction function from data. NeuMF is a fused model of GMF and MLP to better model the complex user-item interactions, and unifies the strengths of linearity of MF and non-linearity of MLP for modeling the user-item latent structures. NeuMF allows GMF and MLP to learn separate embeddings, and combines the two models by concatenating their last hidden layer. [neumf_model.py](neumf_model.py) defines the architecture details. + +Some abbreviations used the code base include: + - NCF: Neural Collaborative Filtering + - NeuMF: Neural Matrix Factorization + - GMF: Generalized Matrix Factorization + - MLP: Multi-Layer Perceptron + - HR: Hit Ratio (HR) + - NDCG: Normalized Discounted Cumulative Gain + - ml-1m: MovieLens 1 million dataset + - ml-20m: MovieLens 20 million dataset + +## Dataset +The [MovieLens datasets](http://files.grouplens.org/datasets/movielens/) are used for model training and evaluation. Specifically, we use two datasets: **ml-1m** (short for MovieLens 1 million) and **ml-20m** (short for MovieLens 20 million). + +### ml-1m +ml-1m dataset contains 1,000,209 anonymous ratings of approximately 3,706 movies made by 6,040 users who joined MovieLens in 2000. All ratings are contained in the file "ratings.dat" without header row, and are in the following format: +``` + UserID::MovieID::Rating::Timestamp +``` + - UserIDs range between 1 and 6040. + - MovieIDs range between 1 and 3952. + - Ratings are made on a 5-star scale (whole-star ratings only). + +### ml-20m +ml-20m dataset contains 20,000,263 ratings of 26,744 movies by 138493 users. All ratings are contained in the file "ratings.csv". Each line of this file after the header row represents one rating of one movie by one user, and has the following format: +``` +userId,movieId,rating,timestamp +``` + - The lines within this file are ordered first by userId, then, within user, by movieId. + - Ratings are made on a 5-star scale, with half-star increments (0.5 stars - 5.0 stars). + +In both datasets, the timestamp is represented in seconds since midnight Coordinated Universal Time (UTC) of January 1, 1970. Each user has at least 20 ratings. + +## Running Code + +### Download and preprocess dataset +To download the dataset, please install Pandas package first. Then issue the following command: +``` +python movielens.py +``` +Arguments: + * `--data_dir`: Directory where to download and save the preprocessed data. By default, it is `/tmp/movielens-data/`. + * `--dataset`: The dataset name to be downloaded and preprocessed. By default, it is `ml-1m`. + +Use the `--help` or `-h` flag to get a full list of possible arguments. + +Note the ml-20m dataset is large (the rating file is ~500 MB), and it may take several minutes (~2 mins) for data preprocessing. +Both the ml-1m and ml-20m datasets will be coerced into a common format when downloaded. + +### Train and evaluate model + +[ncf_keras_main.py](ncf_keras_main.py) is the Keras trainer that supports +features in TF 2.x. Users can train the model on both GPU and TPU. + +To train and evaluate the model, issue the following command: +``` +python ncf_keras_main.py +``` +Arguments: + * `--model_dir`: Directory to save model training checkpoints. By default, it is `/tmp/ncf/`. + * `--data_dir`: This should be set to the same directory given to the `data_download`'s `data_dir` argument. + * `--dataset`: The dataset name to be downloaded and preprocessed. By default, it is `ml-1m`. + +There are other arguments about models and training process. Refer to the [Flags package](https://abseil.io/docs/python/guides/flags) documentation or use the `--helpfull` flag to get a full list of possible arguments with detailed descriptions. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/constants.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/constants.py new file mode 100644 index 0000000..8e313bf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/constants.py @@ -0,0 +1,79 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Central location for NCF specific values.""" + +import sys + +import numpy as np + +from official.recommendation import movielens + +# ============================================================================== +# == Main Thread Data Processing =============================================== +# ============================================================================== + +# Keys for data shards +TRAIN_USER_KEY = "train_{}".format(movielens.USER_COLUMN) +TRAIN_ITEM_KEY = "train_{}".format(movielens.ITEM_COLUMN) +TRAIN_LABEL_KEY = "train_labels" +MASK_START_INDEX = "mask_start_index" +VALID_POINT_MASK = "valid_point_mask" +EVAL_USER_KEY = "eval_{}".format(movielens.USER_COLUMN) +EVAL_ITEM_KEY = "eval_{}".format(movielens.ITEM_COLUMN) + +USER_MAP = "user_map" +ITEM_MAP = "item_map" + +USER_DTYPE = np.int32 +ITEM_DTYPE = np.int32 + +# In both datasets, each user has at least 20 ratings. +MIN_NUM_RATINGS = 20 + +# The number of negative examples attached with a positive example +# when performing evaluation. +NUM_EVAL_NEGATIVES = 999 + +# keys for evaluation metrics +TOP_K = 10 # Top-k list for evaluation +HR_KEY = "HR" +NDCG_KEY = "NDCG" +DUPLICATE_MASK = "duplicate_mask" + +# Metric names +HR_METRIC_NAME = "HR_METRIC" +NDCG_METRIC_NAME = "NDCG_METRIC" + +# Trying to load a cache created in py2 when running in py3 will cause an +# error due to differences in unicode handling. +RAW_CACHE_FILE = "raw_data_cache_py{}.pickle".format(sys.version_info[0]) +CACHE_INVALIDATION_SEC = 3600 * 24 + +# ============================================================================== +# == Data Generation =========================================================== +# ============================================================================== +CYCLES_TO_BUFFER = 3 # The number of train cycles worth of data to "run ahead" + # of the main training loop. + +# Number of batches to run per epoch when using synthetic data. At high batch +# sizes, we run for more batches than with real data, which is good since +# running more batches reduces noise when measuring the average batches/second. +SYNTHETIC_BATCHES_PER_EPOCH = 2000 + +# Only used when StreamingFilesDataset is used. +NUM_FILE_SHARDS = 16 +TRAIN_FOLDER_TEMPLATE = "training_cycle_{}" +EVAL_FOLDER = "eval_data" +SHARD_TEMPLATE = "shard_{}.tfrecords" diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/create_ncf_data.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/create_ncf_data.py new file mode 100644 index 0000000..60267bc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/create_ncf_data.py @@ -0,0 +1,117 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Binary to generate training/evaluation dataset for NCF model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json + +# pylint: disable=g-bad-import-order +from absl import app +from absl import flags +import tensorflow.compat.v2 as tf +# pylint: enable=g-bad-import-order + +from official.recommendation import movielens +from official.recommendation import data_preprocessing + +flags.DEFINE_string( + "data_dir", None, + "The input data dir at which training and evaluation tf record files " + "will be saved.") +flags.DEFINE_string("meta_data_file_path", None, + "The path in which input meta data will be written.") +flags.DEFINE_enum("dataset", "ml-20m", ["ml-1m", "ml-20m"], + "Dataset to be trained/evaluated.") +flags.DEFINE_enum( + "constructor_type", "bisection", ["bisection", "materialized"], + "Strategy to use for generating false negatives. materialized has a " + "precompute that scales badly, but a faster per-epoch construction " + "time and can be faster on very large systems.") +flags.DEFINE_integer("num_train_epochs", 14, + "Total number of training epochs to generate.") +flags.DEFINE_integer( + "num_negative_samples", 4, + "Number of negative instances to pair with positive instance.") +flags.DEFINE_integer( + "train_prebatch_size", 99000, + "Batch size to be used for prebatching the dataset " + "for training.") +flags.DEFINE_integer( + "eval_prebatch_size", 99000, + "Batch size to be used for prebatching the dataset " + "for training.") + +FLAGS = flags.FLAGS + + +def prepare_raw_data(flag_obj): + """Downloads and prepares raw data for data generation.""" + movielens.download(flag_obj.dataset, flag_obj.data_dir) + + data_processing_params = { + "train_epochs": flag_obj.num_train_epochs, + "batch_size": flag_obj.train_prebatch_size, + "eval_batch_size": flag_obj.eval_prebatch_size, + "batches_per_step": 1, + "stream_files": True, + "num_neg": flag_obj.num_negative_samples, + } + + num_users, num_items, producer = data_preprocessing.instantiate_pipeline( + dataset=flag_obj.dataset, + data_dir=flag_obj.data_dir, + params=data_processing_params, + constructor_type=flag_obj.constructor_type, + epoch_dir=flag_obj.data_dir, + generate_data_offline=True) + + # pylint: disable=protected-access + input_metadata = { + "num_users": num_users, + "num_items": num_items, + "constructor_type": flag_obj.constructor_type, + "num_train_elements": producer._elements_in_epoch, + "num_eval_elements": producer._eval_elements_in_epoch, + "num_train_epochs": flag_obj.num_train_epochs, + "train_prebatch_size": flag_obj.train_prebatch_size, + "eval_prebatch_size": flag_obj.eval_prebatch_size, + "num_train_steps": producer.train_batches_per_epoch, + "num_eval_steps": producer.eval_batches_per_epoch, + } + # pylint: enable=protected-access + + return producer, input_metadata + + +def generate_data(): + """Creates NCF train/eval dataset and writes input metadata as a file.""" + producer, input_metadata = prepare_raw_data(FLAGS) + producer.run() + + with tf.io.gfile.GFile(FLAGS.meta_data_file_path, "w") as writer: + writer.write(json.dumps(input_metadata, indent=4) + "\n") + + +def main(_): + generate_data() + + +if __name__ == "__main__": + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("meta_data_file_path") + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_pipeline.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_pipeline.py new file mode 100644 index 0000000..1b4dd33 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_pipeline.py @@ -0,0 +1,959 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Asynchronous data producer for the NCF pipeline.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import functools +import os +import sys +import tempfile +import threading +import time +import timeit +import traceback +import typing + +import numpy as np +import six +from six.moves import queue +import tensorflow as tf +from absl import logging + +from official.recommendation import constants as rconst +from official.recommendation import movielens +from official.recommendation import popen_helper +from official.recommendation import stat_utils +from tensorflow.python.tpu.datasets import StreamingFilesDataset + + +SUMMARY_TEMPLATE = """General: +{spacer}Num users: {num_users} +{spacer}Num items: {num_items} + +Training: +{spacer}Positive count: {train_pos_ct} +{spacer}Batch size: {train_batch_size} {multiplier} +{spacer}Batch count per epoch: {train_batch_ct} + +Eval: +{spacer}Positive count: {eval_pos_ct} +{spacer}Batch size: {eval_batch_size} {multiplier} +{spacer}Batch count per epoch: {eval_batch_ct}""" + + +class DatasetManager(object): + """Helper class for handling TensorFlow specific data tasks. + + This class takes the (relatively) framework agnostic work done by the data + constructor classes and handles the TensorFlow specific portions (TFRecord + management, tf.Dataset creation, etc.). + """ + + def __init__(self, + is_training, + stream_files, + batches_per_epoch, + shard_root=None, + deterministic=False, + num_train_epochs=None): + # type: (bool, bool, int, typing.Optional[str], bool, int) -> None + """Constructs a `DatasetManager` instance. + Args: + is_training: Boolean of whether the data provided is training or + evaluation data. This determines whether to reuse the data + (if is_training=False) and the exact structure to use when storing and + yielding data. + stream_files: Boolean indicating whether data should be serialized and + written to file shards. + batches_per_epoch: The number of batches in a single epoch. + shard_root: The base directory to be used when stream_files=True. + deterministic: Forgo non-deterministic speedups. (i.e. sloppy=True) + num_train_epochs: Number of epochs to generate. If None, then each + call to `get_dataset()` increments the number of epochs requested. + """ + self._is_training = is_training + self._deterministic = deterministic + self._stream_files = stream_files + self._writers = [] + self._write_locks = [threading.RLock() for _ in + range(rconst.NUM_FILE_SHARDS)] if stream_files else [] + self._batches_per_epoch = batches_per_epoch + self._epochs_completed = 0 + self._epochs_requested = num_train_epochs if num_train_epochs else 0 + self._shard_root = shard_root + + self._result_queue = queue.Queue() + self._result_reuse = [] + + @property + def current_data_root(self): + subdir = (rconst.TRAIN_FOLDER_TEMPLATE.format(self._epochs_completed) + if self._is_training else rconst.EVAL_FOLDER) + return os.path.join(self._shard_root, subdir) + + def buffer_reached(self): + # Only applicable for training. + return (self._epochs_completed - self._epochs_requested >= + rconst.CYCLES_TO_BUFFER and self._is_training) + + @staticmethod + def serialize(data): + """Convert NumPy arrays into a TFRecords entry.""" + + def create_int_feature(values): + return tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + + feature_dict = { + k: create_int_feature(v.astype(np.int64)) for k, v in data.items() + } + + return tf.train.Example( + features=tf.train.Features(feature=feature_dict)).SerializeToString() + + @staticmethod + def deserialize(serialized_data, batch_size=None, is_training=True): + """Convert serialized TFRecords into tensors. + + Args: + serialized_data: A tensor containing serialized records. + batch_size: The data arrives pre-batched, so batch size is needed to + deserialize the data. + is_training: Boolean, whether data to deserialize to training data + or evaluation data. + """ + + def _get_feature_map(batch_size, is_training=True): + """Returns data format of the serialized tf record file.""" + + if is_training: + return { + movielens.USER_COLUMN: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64), + movielens.ITEM_COLUMN: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64), + rconst.VALID_POINT_MASK: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64), + "labels": + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64) + } + else: + return { + movielens.USER_COLUMN: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64), + movielens.ITEM_COLUMN: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64), + rconst.DUPLICATE_MASK: + tf.io.FixedLenFeature([batch_size, 1], dtype=tf.int64) + } + + features = tf.io.parse_single_example( + serialized_data, _get_feature_map(batch_size, is_training=is_training)) + users = tf.cast(features[movielens.USER_COLUMN], rconst.USER_DTYPE) + items = tf.cast(features[movielens.ITEM_COLUMN], rconst.ITEM_DTYPE) + + if is_training: + valid_point_mask = tf.cast(features[rconst.VALID_POINT_MASK], tf.bool) + fake_dup_mask = tf.zeros_like(users) + return { + movielens.USER_COLUMN: users, + movielens.ITEM_COLUMN: items, + rconst.VALID_POINT_MASK: valid_point_mask, + rconst.TRAIN_LABEL_KEY: + tf.reshape(tf.cast(features["labels"], tf.bool), + (batch_size, 1)), + rconst.DUPLICATE_MASK: fake_dup_mask + } + else: + labels = tf.cast(tf.zeros_like(users), tf.bool) + fake_valid_pt_mask = tf.cast(tf.zeros_like(users), tf.bool) + return { + movielens.USER_COLUMN: + users, + movielens.ITEM_COLUMN: + items, + rconst.DUPLICATE_MASK: + tf.cast(features[rconst.DUPLICATE_MASK], tf.bool), + rconst.VALID_POINT_MASK: + fake_valid_pt_mask, + rconst.TRAIN_LABEL_KEY: + labels + } + + def put(self, index, data): + # type: (int, dict) -> None + """Store data for later consumption. + + Because there are several paths for storing and yielding data (queues, + lists, files) the data producer simply provides the data in a standard + format at which point the dataset manager handles storing it in the correct + form. + + Args: + index: Used to select shards when writing to files. + data: A dict of the data to be stored. This method mutates data, and + therefore expects to be the only consumer. + """ + if self._is_training: + mask_start_index = data.pop(rconst.MASK_START_INDEX) + batch_size = data[movielens.ITEM_COLUMN].shape[0] + data[rconst.VALID_POINT_MASK] = np.expand_dims( + np.less(np.arange(batch_size), mask_start_index), -1) + + if self._stream_files: + example_bytes = self.serialize(data) + with self._write_locks[index % rconst.NUM_FILE_SHARDS]: + self._writers[index % rconst.NUM_FILE_SHARDS].write(example_bytes) + + else: + self._result_queue.put(( + data, data.pop("labels")) if self._is_training else data) + + def start_construction(self): + if self._stream_files: + tf.io.gfile.makedirs(self.current_data_root) + template = os.path.join(self.current_data_root, rconst.SHARD_TEMPLATE) + self._writers = [tf.io.TFRecordWriter(template.format(i)) + for i in range(rconst.NUM_FILE_SHARDS)] + + def end_construction(self): + if self._stream_files: + [writer.close() for writer in self._writers] + self._writers = [] + self._result_queue.put(self.current_data_root) + + self._epochs_completed += 1 + + def data_generator(self, epochs_between_evals): + """Yields examples during local training.""" + assert not self._stream_files + assert self._is_training or epochs_between_evals == 1 + + if self._is_training: + for _ in range(self._batches_per_epoch * epochs_between_evals): + yield self._result_queue.get(timeout=300) + + else: + if self._result_reuse: + assert len(self._result_reuse) == self._batches_per_epoch + + for i in self._result_reuse: + yield i + else: + # First epoch. + for _ in range(self._batches_per_epoch * epochs_between_evals): + result = self._result_queue.get(timeout=300) + self._result_reuse.append(result) + yield result + + def increment_request_epoch(self): + self._epochs_requested += 1 + + def get_dataset(self, batch_size, epochs_between_evals): + """Construct the dataset to be used for training and eval. + + For local training, data is provided through Dataset.from_generator. For + remote training (TPUs) the data is first serialized to files and then sent + to the TPU through a StreamingFilesDataset. + + Args: + batch_size: The per-replica batch size of the dataset. + epochs_between_evals: How many epochs worth of data to yield. + (Generator mode only.) + """ + self.increment_request_epoch() + if self._stream_files: + if epochs_between_evals > 1: + raise ValueError("epochs_between_evals > 1 not supported for file " + "based dataset.") + epoch_data_dir = self._result_queue.get(timeout=300) + if not self._is_training: + self._result_queue.put(epoch_data_dir) # Eval data is reused. + + file_pattern = os.path.join( + epoch_data_dir, rconst.SHARD_TEMPLATE.format("*")) + dataset = StreamingFilesDataset( + files=file_pattern, worker_job=popen_helper.worker_job(), + num_parallel_reads=rconst.NUM_FILE_SHARDS, num_epochs=1, + sloppy=not self._deterministic) + map_fn = functools.partial( + self.deserialize, + batch_size=batch_size, + is_training=self._is_training) + dataset = dataset.map(map_fn, num_parallel_calls=16) + + else: + types = {movielens.USER_COLUMN: rconst.USER_DTYPE, + movielens.ITEM_COLUMN: rconst.ITEM_DTYPE} + shapes = { + movielens.USER_COLUMN: tf.TensorShape([batch_size, 1]), + movielens.ITEM_COLUMN: tf.TensorShape([batch_size, 1]) + } + + if self._is_training: + types[rconst.VALID_POINT_MASK] = np.bool + shapes[rconst.VALID_POINT_MASK] = tf.TensorShape([batch_size, 1]) + + types = (types, np.bool) + shapes = (shapes, tf.TensorShape([batch_size, 1])) + + else: + types[rconst.DUPLICATE_MASK] = np.bool + shapes[rconst.DUPLICATE_MASK] = tf.TensorShape([batch_size, 1]) + + data_generator = functools.partial( + self.data_generator, epochs_between_evals=epochs_between_evals) + dataset = tf.data.Dataset.from_generator( + generator=data_generator, output_types=types, + output_shapes=shapes) + + return dataset.prefetch(16) + + def make_input_fn(self, batch_size): + """Create an input_fn which checks for batch size consistency.""" + + def input_fn(params): + """Returns batches for training.""" + + # Estimator passes batch_size during training and eval_batch_size during + # eval. + param_batch_size = (params["batch_size"] if self._is_training else + params.get("eval_batch_size") or params["batch_size"]) + if batch_size != param_batch_size: + raise ValueError("producer batch size ({}) differs from params batch " + "size ({})".format(batch_size, param_batch_size)) + + epochs_between_evals = (params.get("epochs_between_evals", 1) + if self._is_training else 1) + return self.get_dataset(batch_size=batch_size, + epochs_between_evals=epochs_between_evals) + + return input_fn + + +class BaseDataConstructor(threading.Thread): + """Data constructor base class. + + This class manages the control flow for constructing data. It is not meant + to be used directly, but instead subclasses should implement the following + two methods: + + self.construct_lookup_variables + self.lookup_negative_items + + """ + + def __init__( + self, + maximum_number_epochs, # type: int + num_users, # type: int + num_items, # type: int + user_map, # type: dict + item_map, # type: dict + train_pos_users, # type: np.ndarray + train_pos_items, # type: np.ndarray + train_batch_size, # type: int + batches_per_train_step, # type: int + num_train_negatives, # type: int + eval_pos_users, # type: np.ndarray + eval_pos_items, # type: np.ndarray + eval_batch_size, # type: int + batches_per_eval_step, # type: int + stream_files, # type: bool + deterministic=False, # type: bool + epoch_dir=None, # type: str + num_train_epochs=None, # type: int + create_data_offline=False # type: bool + ): + # General constants + self._maximum_number_epochs = maximum_number_epochs + self._num_users = num_users + self._num_items = num_items + self.user_map = user_map + self.item_map = item_map + self._train_pos_users = train_pos_users + self._train_pos_items = train_pos_items + self.train_batch_size = train_batch_size + self._num_train_negatives = num_train_negatives + self._batches_per_train_step = batches_per_train_step + self._eval_pos_users = eval_pos_users + self._eval_pos_items = eval_pos_items + self.eval_batch_size = eval_batch_size + self.num_train_epochs = num_train_epochs + self.create_data_offline = create_data_offline + + # Training + if self._train_pos_users.shape != self._train_pos_items.shape: + raise ValueError( + "User positives ({}) is different from item positives ({})".format( + self._train_pos_users.shape, self._train_pos_items.shape)) + + (self._train_pos_count,) = self._train_pos_users.shape + self._elements_in_epoch = (1 + num_train_negatives) * self._train_pos_count + self.train_batches_per_epoch = self._count_batches( + self._elements_in_epoch, train_batch_size, batches_per_train_step) + + # Evaluation + if eval_batch_size % (1 + rconst.NUM_EVAL_NEGATIVES): + raise ValueError("Eval batch size {} is not divisible by {}".format( + eval_batch_size, 1 + rconst.NUM_EVAL_NEGATIVES)) + self._eval_users_per_batch = int( + eval_batch_size // (1 + rconst.NUM_EVAL_NEGATIVES)) + self._eval_elements_in_epoch = num_users * (1 + rconst.NUM_EVAL_NEGATIVES) + self.eval_batches_per_epoch = self._count_batches( + self._eval_elements_in_epoch, eval_batch_size, batches_per_eval_step) + + # Intermediate artifacts + self._current_epoch_order = np.empty(shape=(0,)) + self._shuffle_iterator = None + + self._shuffle_with_forkpool = not stream_files + if stream_files: + self._shard_root = epoch_dir or tempfile.mkdtemp(prefix="ncf_") + if not create_data_offline: + atexit.register(tf.io.gfile.rmtree, self._shard_root) + else: + self._shard_root = None + + self._train_dataset = DatasetManager(True, stream_files, + self.train_batches_per_epoch, + self._shard_root, deterministic, + num_train_epochs) + self._eval_dataset = DatasetManager(False, stream_files, + self.eval_batches_per_epoch, + self._shard_root, deterministic, + num_train_epochs) + + # Threading details + super(BaseDataConstructor, self).__init__() + self.daemon = True + self._stop_loop = False + self._fatal_exception = None + self.deterministic = deterministic + + def __str__(self): + multiplier = ("(x{} devices)".format(self._batches_per_train_step) + if self._batches_per_train_step > 1 else "") + summary = SUMMARY_TEMPLATE.format( + spacer=" ", num_users=self._num_users, num_items=self._num_items, + train_pos_ct=self._train_pos_count, + train_batch_size=self.train_batch_size, + train_batch_ct=self.train_batches_per_epoch, + eval_pos_ct=self._num_users, eval_batch_size=self.eval_batch_size, + eval_batch_ct=self.eval_batches_per_epoch, multiplier=multiplier) + return super(BaseDataConstructor, self).__str__() + "\n" + summary + + @staticmethod + def _count_batches(example_count, batch_size, batches_per_step): + """Determine the number of batches, rounding up to fill all devices.""" + x = (example_count + batch_size - 1) // batch_size + return (x + batches_per_step - 1) // batches_per_step * batches_per_step + + def stop_loop(self): + self._stop_loop = True + + def construct_lookup_variables(self): + """Perform any one time pre-compute work.""" + raise NotImplementedError + + def lookup_negative_items(self, **kwargs): + """Randomly sample negative items for given users.""" + raise NotImplementedError + + def _run(self): + atexit.register(self.stop_loop) + self._start_shuffle_iterator() + self.construct_lookup_variables() + self._construct_training_epoch() + self._construct_eval_epoch() + for _ in range(self._maximum_number_epochs - 1): + self._construct_training_epoch() + self.stop_loop() + + def run(self): + try: + self._run() + except Exception as e: + # The Thread base class swallows stack traces, so unfortunately it is + # necessary to catch and re-raise to get debug output + traceback.print_exc() + self._fatal_exception = e + sys.stderr.flush() + raise + + def _start_shuffle_iterator(self): + if self._shuffle_with_forkpool: + pool = popen_helper.get_forkpool(3, closing=False) + else: + pool = popen_helper.get_threadpool(1, closing=False) + atexit.register(pool.close) + args = [(self._elements_in_epoch, stat_utils.random_int32()) + for _ in range(self._maximum_number_epochs)] + imap = pool.imap if self.deterministic else pool.imap_unordered + self._shuffle_iterator = imap(stat_utils.permutation, args) + + def _get_training_batch(self, i): + """Construct a single batch of training data. + + Args: + i: The index of the batch. This is used when stream_files=True to assign + data to file shards. + """ + batch_indices = self._current_epoch_order[i * self.train_batch_size: + (i + 1) * self.train_batch_size] + (mask_start_index,) = batch_indices.shape + + batch_ind_mod = np.mod(batch_indices, self._train_pos_count) + users = self._train_pos_users[batch_ind_mod] + + negative_indices = np.greater_equal(batch_indices, self._train_pos_count) + negative_users = users[negative_indices] + + negative_items = self.lookup_negative_items(negative_users=negative_users) + + items = self._train_pos_items[batch_ind_mod] + items[negative_indices] = negative_items + + labels = np.logical_not(negative_indices) + + # Pad last partial batch + pad_length = self.train_batch_size - mask_start_index + if pad_length: + # We pad with arange rather than zeros because the network will still + # compute logits for padded examples, and padding with zeros would create + # a very "hot" embedding key which can have performance implications. + user_pad = np.arange(pad_length, dtype=users.dtype) % self._num_users + item_pad = np.arange(pad_length, dtype=items.dtype) % self._num_items + label_pad = np.zeros(shape=(pad_length,), dtype=labels.dtype) + users = np.concatenate([users, user_pad]) + items = np.concatenate([items, item_pad]) + labels = np.concatenate([labels, label_pad]) + + self._train_dataset.put( + i, { + movielens.USER_COLUMN: + np.reshape(users, (self.train_batch_size, 1)), + movielens.ITEM_COLUMN: + np.reshape(items, (self.train_batch_size, 1)), + rconst.MASK_START_INDEX: + np.array(mask_start_index, dtype=np.int32), + "labels": + np.reshape(labels, (self.train_batch_size, 1)), + }) + + def _wait_to_construct_train_epoch(self): + count = 0 + while self._train_dataset.buffer_reached() and not self._stop_loop: + time.sleep(0.01) + count += 1 + if count >= 100 and np.log10(count) == np.round(np.log10(count)): + logging.info( + "Waited {} times for training data to be consumed".format(count)) + + def _construct_training_epoch(self): + """Loop to construct a batch of training data.""" + if not self.create_data_offline: + self._wait_to_construct_train_epoch() + + start_time = timeit.default_timer() + if self._stop_loop: + return + + self._train_dataset.start_construction() + map_args = list(range(self.train_batches_per_epoch)) + self._current_epoch_order = next(self._shuffle_iterator) + + get_pool = (popen_helper.get_fauxpool if self.deterministic else + popen_helper.get_threadpool) + with get_pool(6) as pool: + pool.map(self._get_training_batch, map_args) + self._train_dataset.end_construction() + + logging.info("Epoch construction complete. Time: {:.1f} seconds".format( + timeit.default_timer() - start_time)) + + @staticmethod + def _assemble_eval_batch(users, positive_items, negative_items, + users_per_batch): + """Construct duplicate_mask and structure data accordingly. + + The positive items should be last so that they lose ties. However, they + should not be masked out if the true eval positive happens to be + selected as a negative. So instead, the positive is placed in the first + position, and then switched with the last element after the duplicate + mask has been computed. + + Args: + users: An array of users in a batch. (should be identical along axis 1) + positive_items: An array (batch_size x 1) of positive item indices. + negative_items: An array of negative item indices. + users_per_batch: How many users should be in the batch. This is passed + as an argument so that ncf_test.py can use this method. + + Returns: + User, item, and duplicate_mask arrays. + """ + items = np.concatenate([positive_items, negative_items], axis=1) + + # We pad the users and items here so that the duplicate mask calculation + # will include padding. The metric function relies on all padded elements + # except the positive being marked as duplicate to mask out padded points. + if users.shape[0] < users_per_batch: + pad_rows = users_per_batch - users.shape[0] + padding = np.zeros(shape=(pad_rows, users.shape[1]), dtype=np.int32) + users = np.concatenate([users, padding.astype(users.dtype)], axis=0) + items = np.concatenate([items, padding.astype(items.dtype)], axis=0) + + duplicate_mask = stat_utils.mask_duplicates(items, axis=1).astype(np.bool) + + items[:, (0, -1)] = items[:, (-1, 0)] + duplicate_mask[:, (0, -1)] = duplicate_mask[:, (-1, 0)] + + assert users.shape == items.shape == duplicate_mask.shape + return users, items, duplicate_mask + + def _get_eval_batch(self, i): + """Construct a single batch of evaluation data. + + Args: + i: The index of the batch. + """ + low_index = i * self._eval_users_per_batch + high_index = (i + 1) * self._eval_users_per_batch + users = np.repeat(self._eval_pos_users[low_index:high_index, np.newaxis], + 1 + rconst.NUM_EVAL_NEGATIVES, axis=1) + positive_items = self._eval_pos_items[low_index:high_index, np.newaxis] + negative_items = (self.lookup_negative_items(negative_users=users[:, :-1]) + .reshape(-1, rconst.NUM_EVAL_NEGATIVES)) + + users, items, duplicate_mask = self._assemble_eval_batch( + users, positive_items, negative_items, self._eval_users_per_batch) + + self._eval_dataset.put( + i, { + movielens.USER_COLUMN: + np.reshape(users.flatten(), (self.eval_batch_size, 1)), + movielens.ITEM_COLUMN: + np.reshape(items.flatten(), (self.eval_batch_size, 1)), + rconst.DUPLICATE_MASK: + np.reshape(duplicate_mask.flatten(), (self.eval_batch_size, 1)), + }) + + def _construct_eval_epoch(self): + """Loop to construct data for evaluation.""" + if self._stop_loop: + return + + start_time = timeit.default_timer() + + self._eval_dataset.start_construction() + map_args = [i for i in range(self.eval_batches_per_epoch)] + + get_pool = (popen_helper.get_fauxpool if self.deterministic else + popen_helper.get_threadpool) + with get_pool(6) as pool: + pool.map(self._get_eval_batch, map_args) + self._eval_dataset.end_construction() + + logging.info("Eval construction complete. Time: {:.1f} seconds".format( + timeit.default_timer() - start_time)) + + def make_input_fn(self, is_training): + # It isn't feasible to provide a foolproof check, so this is designed to + # catch most failures rather than provide an exhaustive guard. + if self._fatal_exception is not None: + raise ValueError("Fatal exception in the data production loop: {}" + .format(self._fatal_exception)) + + return ( + self._train_dataset.make_input_fn(self.train_batch_size) if is_training + else self._eval_dataset.make_input_fn(self.eval_batch_size)) + + def increment_request_epoch(self): + self._train_dataset.increment_request_epoch() + + +class DummyConstructor(threading.Thread): + """Class for running with synthetic data.""" + + def __init__(self, *args, **kwargs): + super(DummyConstructor, self).__init__(*args, **kwargs) + self.train_batches_per_epoch = rconst.SYNTHETIC_BATCHES_PER_EPOCH + self.eval_batches_per_epoch = rconst.SYNTHETIC_BATCHES_PER_EPOCH + + def run(self): + pass + + def stop_loop(self): + pass + + def increment_request_epoch(self): + pass + + @staticmethod + def make_input_fn(is_training): + """Construct training input_fn that uses synthetic data.""" + + def input_fn(params): + """Returns dummy input batches for training.""" + + # Estimator passes batch_size during training and eval_batch_size during + # eval. + batch_size = (params["batch_size"] if is_training else + params.get("eval_batch_size") or params["batch_size"]) + num_users = params["num_users"] + num_items = params["num_items"] + + users = tf.random.uniform([batch_size, 1], + dtype=tf.int32, + minval=0, + maxval=num_users) + items = tf.random.uniform([batch_size, 1], + dtype=tf.int32, + minval=0, + maxval=num_items) + + if is_training: + valid_point_mask = tf.cast( + tf.random.uniform([batch_size, 1], + dtype=tf.int32, + minval=0, + maxval=2), tf.bool) + labels = tf.cast( + tf.random.uniform([batch_size, 1], + dtype=tf.int32, + minval=0, + maxval=2), tf.bool) + data = { + movielens.USER_COLUMN: users, + movielens.ITEM_COLUMN: items, + rconst.VALID_POINT_MASK: valid_point_mask, + }, labels + else: + dupe_mask = tf.cast( + tf.random.uniform([batch_size, 1], + dtype=tf.int32, + minval=0, + maxval=2), tf.bool) + data = { + movielens.USER_COLUMN: users, + movielens.ITEM_COLUMN: items, + rconst.DUPLICATE_MASK: dupe_mask, + } + + dataset = tf.data.Dataset.from_tensors(data).repeat( + rconst.SYNTHETIC_BATCHES_PER_EPOCH * params["batches_per_step"]) + dataset = dataset.prefetch(32) + return dataset + + return input_fn + + +class MaterializedDataConstructor(BaseDataConstructor): + """Materialize a table of negative examples for fast negative generation. + + This class creates a table (num_users x num_items) containing all of the + negative examples for each user. This table is conceptually ragged; that is to + say the items dimension will have a number of unused elements at the end equal + to the number of positive elements for a given user. For instance: + + num_users = 3 + num_items = 5 + positives = [[1, 3], [0], [1, 2, 3, 4]] + + will generate a negative table: + [ + [0 2 4 int32max int32max], + [1 2 3 4 int32max], + [0 int32max int32max int32max int32max], + ] + + and a vector of per-user negative counts, which in this case would be: + [3, 4, 1] + + When sampling negatives, integers are (nearly) uniformly selected from the + range [0, per_user_neg_count[user]) which gives a column_index, at which + point the negative can be selected as: + negative_table[user, column_index] + + This technique will not scale; however MovieLens is small enough that even + a pre-compute which is quadratic in problem size will still fit in memory. A + more scalable lookup method is in the works. + """ + def __init__(self, *args, **kwargs): + super(MaterializedDataConstructor, self).__init__(*args, **kwargs) + self._negative_table = None + self._per_user_neg_count = None + + def construct_lookup_variables(self): + # Materialize negatives for fast lookup sampling. + start_time = timeit.default_timer() + inner_bounds = np.argwhere(self._train_pos_users[1:] - + self._train_pos_users[:-1])[:, 0] + 1 + (upper_bound,) = self._train_pos_users.shape + index_bounds = [0] + inner_bounds.tolist() + [upper_bound] + self._negative_table = np.zeros(shape=(self._num_users, self._num_items), + dtype=rconst.ITEM_DTYPE) + + # Set the table to the max value to make sure the embedding lookup will fail + # if we go out of bounds, rather than just overloading item zero. + self._negative_table += np.iinfo(rconst.ITEM_DTYPE).max + assert self._num_items < np.iinfo(rconst.ITEM_DTYPE).max + + # Reuse arange during generation. np.delete will make a copy. + full_set = np.arange(self._num_items, dtype=rconst.ITEM_DTYPE) + + self._per_user_neg_count = np.zeros( + shape=(self._num_users,), dtype=np.int32) + + # Threading does not improve this loop. For some reason, the np.delete + # call does not parallelize well. Multiprocessing incurs too much + # serialization overhead to be worthwhile. + for i in range(self._num_users): + positives = self._train_pos_items[index_bounds[i]:index_bounds[i+1]] + negatives = np.delete(full_set, positives) + self._per_user_neg_count[i] = self._num_items - positives.shape[0] + self._negative_table[i, :self._per_user_neg_count[i]] = negatives + + logging.info("Negative sample table built. Time: {:.1f} seconds".format( + timeit.default_timer() - start_time)) + + def lookup_negative_items(self, negative_users, **kwargs): + negative_item_choice = stat_utils.very_slightly_biased_randint( + self._per_user_neg_count[negative_users]) + return self._negative_table[negative_users, negative_item_choice] + + +class BisectionDataConstructor(BaseDataConstructor): + """Use bisection to index within positive examples. + + This class tallies the number of negative items which appear before each + positive item for a user. This means that in order to select the ith negative + item for a user, it only needs to determine which two positive items bound + it at which point the item id for the ith negative is a simply algebraic + expression. + """ + def __init__(self, *args, **kwargs): + super(BisectionDataConstructor, self).__init__(*args, **kwargs) + self.index_bounds = None + self._sorted_train_pos_items = None + self._total_negatives = None + + def _index_segment(self, user): + lower, upper = self.index_bounds[user:user+2] + items = self._sorted_train_pos_items[lower:upper] + + negatives_since_last_positive = np.concatenate( + [items[0][np.newaxis], items[1:] - items[:-1] - 1]) + + return np.cumsum(negatives_since_last_positive) + + def construct_lookup_variables(self): + start_time = timeit.default_timer() + inner_bounds = np.argwhere(self._train_pos_users[1:] - + self._train_pos_users[:-1])[:, 0] + 1 + (upper_bound,) = self._train_pos_users.shape + self.index_bounds = np.array([0] + inner_bounds.tolist() + [upper_bound]) + + # Later logic will assume that the users are in sequential ascending order. + assert np.array_equal(self._train_pos_users[self.index_bounds[:-1]], + np.arange(self._num_users)) + + self._sorted_train_pos_items = self._train_pos_items.copy() + + for i in range(self._num_users): + lower, upper = self.index_bounds[i:i+2] + self._sorted_train_pos_items[lower:upper].sort() + + self._total_negatives = np.concatenate([ + self._index_segment(i) for i in range(self._num_users)]) + + logging.info("Negative total vector built. Time: {:.1f} seconds".format( + timeit.default_timer() - start_time)) + + def lookup_negative_items(self, negative_users, **kwargs): + output = np.zeros(shape=negative_users.shape, dtype=rconst.ITEM_DTYPE) - 1 + + left_index = self.index_bounds[negative_users] + right_index = self.index_bounds[negative_users + 1] - 1 + + num_positives = right_index - left_index + 1 + num_negatives = self._num_items - num_positives + neg_item_choice = stat_utils.very_slightly_biased_randint(num_negatives) + + # Shortcuts: + # For points where the negative is greater than or equal to the tally before + # the last positive point there is no need to bisect. Instead the item id + # corresponding to the negative item choice is simply: + # last_postive_index + 1 + (neg_choice - last_negative_tally) + # Similarly, if the selection is less than the tally at the first positive + # then the item_id is simply the selection. + # + # Because MovieLens organizes popular movies into low integers (which is + # preserved through the preprocessing), the first shortcut is very + # efficient, allowing ~60% of samples to bypass the bisection. For the same + # reason, the second shortcut is rarely triggered (<0.02%) and is therefore + # not worth implementing. + use_shortcut = neg_item_choice >= self._total_negatives[right_index] + output[use_shortcut] = ( + self._sorted_train_pos_items[right_index] + 1 + + (neg_item_choice - self._total_negatives[right_index]) + )[use_shortcut] + + if np.all(use_shortcut): + # The bisection code is ill-posed when there are no elements. + return output + + not_use_shortcut = np.logical_not(use_shortcut) + left_index = left_index[not_use_shortcut] + right_index = right_index[not_use_shortcut] + neg_item_choice = neg_item_choice[not_use_shortcut] + + num_loops = np.max( + np.ceil(np.log2(num_positives[not_use_shortcut])).astype(np.int32)) + + for i in range(num_loops): + mid_index = (left_index + right_index) // 2 + right_criteria = self._total_negatives[mid_index] > neg_item_choice + left_criteria = np.logical_not(right_criteria) + + right_index[right_criteria] = mid_index[right_criteria] + left_index[left_criteria] = mid_index[left_criteria] + + # Expected state after bisection pass: + # The right index is the smallest index whose tally is greater than the + # negative item choice index. + + assert np.all((right_index - left_index) <= 1) + + output[not_use_shortcut] = ( + self._sorted_train_pos_items[right_index] - + (self._total_negatives[right_index] - neg_item_choice) + ) + + assert np.all(output >= 0) + + return output + + +def get_constructor(name): + if name == "bisection": + return BisectionDataConstructor + if name == "materialized": + return MaterializedDataConstructor + raise ValueError("Unrecognized constructor: {}".format(name)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_preprocessing.py new file mode 100644 index 0000000..8dd9a9e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_preprocessing.py @@ -0,0 +1,243 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Preprocess dataset and construct any necessary artifacts.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import pickle +import time +import timeit +import typing + +# pylint: disable=wrong-import-order +import numpy as np +import pandas as pd +import tensorflow as tf +from absl import logging +# pylint: enable=wrong-import-order + +from official.recommendation import constants as rconst +from official.recommendation import data_pipeline +from official.recommendation import movielens +from official.utils.logs import mlperf_helper + + +DATASET_TO_NUM_USERS_AND_ITEMS = { + "ml-1m": (6040, 3706), + "ml-20m": (138493, 26744) +} + + +_EXPECTED_CACHE_KEYS = ( + rconst.TRAIN_USER_KEY, rconst.TRAIN_ITEM_KEY, rconst.EVAL_USER_KEY, + rconst.EVAL_ITEM_KEY, rconst.USER_MAP, rconst.ITEM_MAP) + + +def _filter_index_sort(raw_rating_path, cache_path): + # type: (str, str, bool) -> (dict, bool) + """Read in data CSV, and output structured data. + + This function reads in the raw CSV of positive items, and performs three + preprocessing transformations: + + 1) Filter out all users who have not rated at least a certain number + of items. (Typically 20 items) + + 2) Zero index the users and items such that the largest user_id is + `num_users - 1` and the largest item_id is `num_items - 1` + + 3) Sort the dataframe by user_id, with timestamp as a secondary sort key. + This allows the dataframe to be sliced by user in-place, and for the last + item to be selected simply by calling the `-1` index of a user's slice. + + While all of these transformations are performed by Pandas (and are therefore + single-threaded), they only take ~2 minutes, and the overhead to apply a + MapReduce pattern to parallel process the dataset adds significant complexity + for no computational gain. For a larger dataset parallelizing this + preprocessing could yield speedups. (Also, this preprocessing step is only + performed once for an entire run. + + Args: + raw_rating_path: The path to the CSV which contains the raw dataset. + cache_path: The path to the file where results of this function are saved. + + Returns: + A filtered, zero-index remapped, sorted dataframe, a dict mapping raw user + IDs to regularized user IDs, and a dict mapping raw item IDs to regularized + item IDs. + """ + valid_cache = tf.io.gfile.exists(cache_path) + if valid_cache: + with tf.io.gfile.GFile(cache_path, "rb") as f: + cached_data = pickle.load(f) + + # (nnigania)disabled this check as the dataset is not expected to change + # cache_age = time.time() - cached_data.get("create_time", 0) + # if cache_age > rconst.CACHE_INVALIDATION_SEC: + # valid_cache = False + + for key in _EXPECTED_CACHE_KEYS: + if key not in cached_data: + valid_cache = False + + if not valid_cache: + logging.info("Removing stale raw data cache file.") + tf.io.gfile.remove(cache_path) + + if valid_cache: + data = cached_data + else: + with tf.io.gfile.GFile(raw_rating_path) as f: + df = pd.read_csv(f) + + # Get the info of users who have more than 20 ratings on items + grouped = df.groupby(movielens.USER_COLUMN) + df = grouped.filter( + lambda x: len(x) >= rconst.MIN_NUM_RATINGS) # type: pd.DataFrame + + original_users = df[movielens.USER_COLUMN].unique() + original_items = df[movielens.ITEM_COLUMN].unique() + + # Map the ids of user and item to 0 based index for following processing + logging.info("Generating user_map and item_map...") + user_map = {user: index for index, user in enumerate(original_users)} + item_map = {item: index for index, item in enumerate(original_items)} + + df[movielens.USER_COLUMN] = df[movielens.USER_COLUMN].apply( + lambda user: user_map[user]) + df[movielens.ITEM_COLUMN] = df[movielens.ITEM_COLUMN].apply( + lambda item: item_map[item]) + + num_users = len(original_users) + num_items = len(original_items) + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.PREPROC_HP_NUM_EVAL, + value=rconst.NUM_EVAL_NEGATIVES) + + assert num_users <= np.iinfo(rconst.USER_DTYPE).max + assert num_items <= np.iinfo(rconst.ITEM_DTYPE).max + assert df[movielens.USER_COLUMN].max() == num_users - 1 + assert df[movielens.ITEM_COLUMN].max() == num_items - 1 + + # This sort is used to shard the dataframe by user, and later to select + # the last item for a user to be used in validation. + logging.info("Sorting by user, timestamp...") + + # This sort is equivalent to + # df.sort_values([movielens.USER_COLUMN, movielens.TIMESTAMP_COLUMN], + # inplace=True) + # except that the order of items with the same user and timestamp are + # sometimes different. For some reason, this sort results in a better + # hit-rate during evaluation, matching the performance of the MLPerf + # reference implementation. + df.sort_values(by=movielens.TIMESTAMP_COLUMN, inplace=True) + df.sort_values([movielens.USER_COLUMN, movielens.TIMESTAMP_COLUMN], + inplace=True, kind="mergesort") + + # The dataframe does not reconstruct indices in the sort or filter steps. + df = df.reset_index() + + grouped = df.groupby(movielens.USER_COLUMN, group_keys=False) + eval_df, train_df = grouped.tail(1), grouped.apply(lambda x: x.iloc[:-1]) + + data = { + rconst.TRAIN_USER_KEY: train_df[movielens.USER_COLUMN] + .values.astype(rconst.USER_DTYPE), + rconst.TRAIN_ITEM_KEY: train_df[movielens.ITEM_COLUMN] + .values.astype(rconst.ITEM_DTYPE), + rconst.EVAL_USER_KEY: eval_df[movielens.USER_COLUMN] + .values.astype(rconst.USER_DTYPE), + rconst.EVAL_ITEM_KEY: eval_df[movielens.ITEM_COLUMN] + .values.astype(rconst.ITEM_DTYPE), + rconst.USER_MAP: user_map, + rconst.ITEM_MAP: item_map, + "create_time": time.time(), + } + + logging.info("Writing raw data cache.") + with tf.io.gfile.GFile(cache_path, "wb") as f: + pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL) + + # TODO(robieta): MLPerf cache clear. + return data, valid_cache + + +def instantiate_pipeline(dataset, + data_dir, + params, + constructor_type=None, + deterministic=False, + epoch_dir=None, + generate_data_offline=False): + # type: (str, str, dict, typing.Optional[str], bool, typing.Optional[str], bool) -> (int, int, data_pipeline.BaseDataConstructor) + """Load and digest data CSV into a usable form. + + Args: + dataset: The name of the dataset to be used. + data_dir: The root directory of the dataset. + params: dict of parameters for the run. + constructor_type: The name of the constructor subclass that should be used + for the input pipeline. + deterministic: Tell the data constructor to produce deterministically. + epoch_dir: Directory in which to store the training epochs. + generate_data_offline: Boolean, whether current pipeline is done offline + or while training. + """ + logging.info("Beginning data preprocessing.") + + st = timeit.default_timer() + raw_rating_path = os.path.join(data_dir, dataset, movielens.RATINGS_FILE) + cache_path = os.path.join(data_dir, dataset, rconst.RAW_CACHE_FILE) + + raw_data, _ = _filter_index_sort(raw_rating_path, cache_path) + user_map, item_map = raw_data["user_map"], raw_data["item_map"] + num_users, num_items = DATASET_TO_NUM_USERS_AND_ITEMS[dataset] + + if num_users != len(user_map): + raise ValueError("Expected to find {} users, but found {}".format( + num_users, len(user_map))) + if num_items != len(item_map): + raise ValueError("Expected to find {} items, but found {}".format( + num_items, len(item_map))) + + producer = data_pipeline.get_constructor(constructor_type or "materialized")( + maximum_number_epochs=params["train_epochs"], + num_users=num_users, + num_items=num_items, + user_map=user_map, + item_map=item_map, + train_pos_users=raw_data[rconst.TRAIN_USER_KEY], + train_pos_items=raw_data[rconst.TRAIN_ITEM_KEY], + train_batch_size=params["batch_size"], + batches_per_train_step=params["batches_per_step"], + num_train_negatives=params["num_neg"], + eval_pos_users=raw_data[rconst.EVAL_USER_KEY], + eval_pos_items=raw_data[rconst.EVAL_ITEM_KEY], + eval_batch_size=params["eval_batch_size"], + batches_per_eval_step=params["batches_per_step"], + stream_files=params["stream_files"], + deterministic=deterministic, + epoch_dir=epoch_dir, + create_data_offline=generate_data_offline) + + run_time = timeit.default_timer() - st + logging.info("Data preprocessing complete. Time: {:.1f} sec." + .format(run_time)) + + print(producer) + return num_users, num_items, producer diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_test.py new file mode 100644 index 0000000..11cd4cf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/data_test.py @@ -0,0 +1,358 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test NCF data pipeline.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from collections import defaultdict +import hashlib +import os + +import mock +import numpy as np +import scipy.stats +import tensorflow as tf + +from official.recommendation import constants as rconst +from official.recommendation import data_preprocessing +from official.recommendation import movielens +from official.recommendation import popen_helper +from official.utils.misc import keras_utils + + +DATASET = "ml-test" +NUM_USERS = 1000 +NUM_ITEMS = 2000 +NUM_PTS = 50000 +BATCH_SIZE = 2048 +EVAL_BATCH_SIZE = 4000 +NUM_NEG = 4 + + +END_TO_END_TRAIN_MD5 = "b218738e915e825d03939c5e305a2698" +END_TO_END_EVAL_MD5 = "d753d0f3186831466d6e218163a9501e" +FRESH_RANDOMNESS_MD5 = "63d0dff73c0e5f1048fbdc8c65021e22" + + +def mock_download(*args, **kwargs): + return + + +# The forkpool used by data producers interacts badly with the threading +# used by TestCase. Without this patch tests will hang, and no amount +# of diligent closing and joining within the producer will prevent it. +@mock.patch.object(popen_helper, "get_forkpool", popen_helper.get_fauxpool) +class BaseTest(tf.test.TestCase): + + def setUp(self): + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + self.temp_data_dir = self.get_temp_dir() + ratings_folder = os.path.join(self.temp_data_dir, DATASET) + tf.io.gfile.makedirs(ratings_folder) + np.random.seed(0) + raw_user_ids = np.arange(NUM_USERS * 3) + np.random.shuffle(raw_user_ids) + raw_user_ids = raw_user_ids[:NUM_USERS] + + raw_item_ids = np.arange(NUM_ITEMS * 3) + np.random.shuffle(raw_item_ids) + raw_item_ids = raw_item_ids[:NUM_ITEMS] + + users = np.random.choice(raw_user_ids, NUM_PTS) + items = np.random.choice(raw_item_ids, NUM_PTS) + scores = np.random.randint(low=0, high=5, size=NUM_PTS) + times = np.random.randint(low=1000000000, high=1200000000, size=NUM_PTS) + + self.rating_file = os.path.join(ratings_folder, movielens.RATINGS_FILE) + self.seen_pairs = set() + self.holdout = {} + with tf.io.gfile.GFile(self.rating_file, "w") as f: + f.write("user_id,item_id,rating,timestamp\n") + for usr, itm, scr, ts in zip(users, items, scores, times): + pair = (usr, itm) + if pair in self.seen_pairs: + continue + self.seen_pairs.add(pair) + if usr not in self.holdout or (ts, itm) > self.holdout[usr]: + self.holdout[usr] = (ts, itm) + + f.write("{},{},{},{}\n".format(usr, itm, scr, ts)) + + movielens.download = mock_download + movielens.NUM_RATINGS[DATASET] = NUM_PTS + data_preprocessing.DATASET_TO_NUM_USERS_AND_ITEMS[DATASET] = (NUM_USERS, + NUM_ITEMS) + + def make_params(self, train_epochs=1): + return { + "train_epochs": train_epochs, + "batches_per_step": 1, + "use_seed": False, + "batch_size": BATCH_SIZE, + "eval_batch_size": EVAL_BATCH_SIZE, + "num_neg": NUM_NEG, + "match_mlperf": True, + "use_tpu": False, + "use_xla_for_gpu": False, + "stream_files": False, + } + + def test_preprocessing(self): + # For the most part the necessary checks are performed within + # _filter_index_sort() + + cache_path = os.path.join(self.temp_data_dir, "test_cache.pickle") + data, valid_cache = data_preprocessing._filter_index_sort( + self.rating_file, cache_path=cache_path) + + assert len(data[rconst.USER_MAP]) == NUM_USERS + assert len(data[rconst.ITEM_MAP]) == NUM_ITEMS + + def drain_dataset(self, dataset, g): + # type: (tf.data.Dataset, tf.Graph) -> list + with self.session(graph=g) as sess: + with g.as_default(): + batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() + output = [] + while True: + try: + output.append(sess.run(batch)) + except tf.errors.OutOfRangeError: + break + return output + + def _test_end_to_end(self, constructor_type): + params = self.make_params(train_epochs=1) + _, _, producer = data_preprocessing.instantiate_pipeline( + dataset=DATASET, data_dir=self.temp_data_dir, params=params, + constructor_type=constructor_type, deterministic=True) + + producer.start() + producer.join() + assert producer._fatal_exception is None + + user_inv_map = {v: k for k, v in producer.user_map.items()} + item_inv_map = {v: k for k, v in producer.item_map.items()} + + # ========================================================================== + # == Training Data ========================================================= + # ========================================================================== + g = tf.Graph() + with g.as_default(): + input_fn = producer.make_input_fn(is_training=True) + dataset = input_fn(params) + + first_epoch = self.drain_dataset(dataset=dataset, g=g) + + counts = defaultdict(int) + train_examples = { + True: set(), + False: set(), + } + + md5 = hashlib.md5() + for features, labels in first_epoch: + data_list = [ + features[movielens.USER_COLUMN].flatten(), + features[movielens.ITEM_COLUMN].flatten(), + features[rconst.VALID_POINT_MASK].flatten(), + labels.flatten() + ] + for i in data_list: + md5.update(i.tobytes()) + + for u, i, v, l in zip(*data_list): + if not v: + continue # ignore padding + + u_raw = user_inv_map[u] + i_raw = item_inv_map[i] + if ((u_raw, i_raw) in self.seen_pairs) != l: + # The evaluation item is not considered during false negative + # generation, so it will occasionally appear as a negative example + # during training. + assert not l + self.assertEqual(i_raw, self.holdout[u_raw][1]) + train_examples[l].add((u_raw, i_raw)) + counts[(u_raw, i_raw)] += 1 + + self.assertRegexpMatches(md5.hexdigest(), END_TO_END_TRAIN_MD5) + + num_positives_seen = len(train_examples[True]) + self.assertEqual(producer._train_pos_users.shape[0], num_positives_seen) + + # This check is more heuristic because negatives are sampled with + # replacement. It only checks that negative generation is reasonably random. + self.assertGreater( + len(train_examples[False]) / NUM_NEG / num_positives_seen, 0.9) + + # This checks that the samples produced are independent by checking the + # number of duplicate entries. If workers are not properly independent there + # will be lots of repeated pairs. + self.assertLess(np.mean(list(counts.values())), 1.1) + + # ========================================================================== + # == Eval Data ============================================================= + # ========================================================================== + with g.as_default(): + input_fn = producer.make_input_fn(is_training=False) + dataset = input_fn(params) + + eval_data = self.drain_dataset(dataset=dataset, g=g) + + current_user = None + md5 = hashlib.md5() + for features in eval_data: + data_list = [ + features[movielens.USER_COLUMN].flatten(), + features[movielens.ITEM_COLUMN].flatten(), + features[rconst.DUPLICATE_MASK].flatten() + ] + for i in data_list: + md5.update(i.tobytes()) + + for idx, (u, i, d) in enumerate(zip(*data_list)): + u_raw = user_inv_map[u] + i_raw = item_inv_map[i] + if current_user is None: + current_user = u + + # Ensure that users appear in blocks, as the evaluation logic expects + # this structure. + self.assertEqual(u, current_user) + + # The structure of evaluation data is 999 negative examples followed + # by the holdout positive. + if not (idx + 1) % (rconst.NUM_EVAL_NEGATIVES + 1): + # Check that the last element in each chunk is the holdout item. + self.assertEqual(i_raw, self.holdout[u_raw][1]) + current_user = None + + elif i_raw == self.holdout[u_raw][1]: + # Because the holdout item is not given to the negative generation + # process, it can appear as a negative. In that case, it should be + # masked out as a duplicate. (Since the true positive is placed at + # the end and would therefore lose the tie.) + assert d + + else: + # Otherwise check that the other 999 points for a user are selected + # from the negatives. + assert (u_raw, i_raw) not in self.seen_pairs + + self.assertRegexpMatches(md5.hexdigest(), END_TO_END_EVAL_MD5) + + def _test_fresh_randomness(self, constructor_type): + train_epochs = 5 + params = self.make_params(train_epochs=train_epochs) + _, _, producer = data_preprocessing.instantiate_pipeline( + dataset=DATASET, data_dir=self.temp_data_dir, params=params, + constructor_type=constructor_type, deterministic=True) + + producer.start() + + results = [] + g = tf.Graph() + with g.as_default(): + for _ in range(train_epochs): + input_fn = producer.make_input_fn(is_training=True) + dataset = input_fn(params) + results.extend(self.drain_dataset(dataset=dataset, g=g)) + + producer.join() + assert producer._fatal_exception is None + + positive_counts, negative_counts = defaultdict(int), defaultdict(int) + md5 = hashlib.md5() + for features, labels in results: + data_list = [ + features[movielens.USER_COLUMN].flatten(), + features[movielens.ITEM_COLUMN].flatten(), + features[rconst.VALID_POINT_MASK].flatten(), + labels.flatten() + ] + for i in data_list: + md5.update(i.tobytes()) + + for u, i, v, l in zip(*data_list): + if not v: + continue # ignore padding + + if l: + positive_counts[(u, i)] += 1 + else: + negative_counts[(u, i)] += 1 + + self.assertRegexpMatches(md5.hexdigest(), FRESH_RANDOMNESS_MD5) + + # The positive examples should appear exactly once each epoch + self.assertAllEqual(list(positive_counts.values()), + [train_epochs for _ in positive_counts]) + + # The threshold for the negatives is heuristic, but in general repeats are + # expected, but should not appear too frequently. + + pair_cardinality = NUM_USERS * NUM_ITEMS + neg_pair_cardinality = pair_cardinality - len(self.seen_pairs) + + # Approximation for the expectation number of times that a particular + # negative will appear in a given epoch. Implicit in this calculation is the + # treatment of all negative pairs as equally likely. Normally is not + # necessarily reasonable; however the generation in self.setUp() will + # approximate this behavior sufficiently for heuristic testing. + e_sample = len(self.seen_pairs) * NUM_NEG / neg_pair_cardinality + + # The frequency of occurance of a given negative pair should follow an + # approximately binomial distribution in the limit that the cardinality of + # the negative pair set >> number of samples per epoch. + approx_pdf = scipy.stats.binom.pmf(k=np.arange(train_epochs+1), + n=train_epochs, p=e_sample) + + # Tally the actual observed counts. + count_distribution = [0 for _ in range(train_epochs + 1)] + for i in negative_counts.values(): + i = min([i, train_epochs]) # round down tail for simplicity. + count_distribution[i] += 1 + count_distribution[0] = neg_pair_cardinality - sum(count_distribution[1:]) + + # Check that the frequency of negative pairs is approximately binomial. + for i in range(train_epochs + 1): + if approx_pdf[i] < 0.05: + continue # Variance will be high at the tails. + + observed_fraction = count_distribution[i] / neg_pair_cardinality + deviation = (2 * abs(observed_fraction - approx_pdf[i]) / + (observed_fraction + approx_pdf[i])) + + self.assertLess(deviation, 0.2) + + def test_end_to_end_materialized(self): + self._test_end_to_end("materialized") + + def test_end_to_end_bisection(self): + self._test_end_to_end("bisection") + + def test_fresh_randomness_materialized(self): + self._test_fresh_randomness("materialized") + + def test_fresh_randomness_bisection(self): + self._test_fresh_randomness("bisection") + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/movielens.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/movielens.py new file mode 100644 index 0000000..acfa8d8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/movielens.py @@ -0,0 +1,309 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Download and extract the MovieLens dataset from GroupLens website. + +Download the dataset, and perform basic preprocessing. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import tempfile +import zipfile + +# pylint: disable=g-bad-import-order +import numpy as np +import pandas as pd +import six +from six.moves import urllib # pylint: disable=redefined-builtin +from absl import app as absl_app +from absl import flags +from absl import logging +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.utils.flags import core as flags_core + + + +ML_1M = "ml-1m" +ML_20M = "ml-20m" +DATASETS = [ML_1M, ML_20M] + +RATINGS_FILE = "ratings.csv" +MOVIES_FILE = "movies.csv" + +# URL to download dataset +_DATA_URL = "http://files.grouplens.org/datasets/movielens/" + +GENRE_COLUMN = "genres" +ITEM_COLUMN = "item_id" # movies +RATING_COLUMN = "rating" +TIMESTAMP_COLUMN = "timestamp" +TITLE_COLUMN = "titles" +USER_COLUMN = "user_id" + +GENRES = [ + 'Action', 'Adventure', 'Animation', "Children", 'Comedy', 'Crime', + 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', "IMAX", 'Musical', + 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western' +] +N_GENRE = len(GENRES) + +RATING_COLUMNS = [USER_COLUMN, ITEM_COLUMN, RATING_COLUMN, TIMESTAMP_COLUMN] +MOVIE_COLUMNS = [ITEM_COLUMN, TITLE_COLUMN, GENRE_COLUMN] + +# Note: Users are indexed [1, k], not [0, k-1] +NUM_USER_IDS = { + ML_1M: 6040, + ML_20M: 138493, +} + +# Note: Movies are indexed [1, k], not [0, k-1] +# Both the 1m and 20m datasets use the same movie set. +NUM_ITEM_IDS = 3952 + +MAX_RATING = 5 + +NUM_RATINGS = { + ML_1M: 1000209, + ML_20M: 20000263 +} + + +def _download_and_clean(dataset, data_dir): + """Download MovieLens dataset in a standard format. + + This function downloads the specified MovieLens format and coerces it into a + standard format. The only difference between the ml-1m and ml-20m datasets + after this point (other than size, of course) is that the 1m dataset uses + whole number ratings while the 20m dataset allows half integer ratings. + """ + if dataset not in DATASETS: + raise ValueError("dataset {} is not in {{{}}}".format( + dataset, ",".join(DATASETS))) + + data_subdir = os.path.join(data_dir, dataset) + + expected_files = ["{}.zip".format(dataset), RATINGS_FILE, MOVIES_FILE] + + tf.io.gfile.makedirs(data_subdir) + if set(expected_files).intersection( + tf.io.gfile.listdir(data_subdir)) == set(expected_files): + logging.info("Dataset {} has already been downloaded".format(dataset)) + return + + url = "{}{}.zip".format(_DATA_URL, dataset) + + temp_dir = tempfile.mkdtemp() + try: + zip_path = os.path.join(temp_dir, "{}.zip".format(dataset)) + zip_path, _ = urllib.request.urlretrieve(url, zip_path) + statinfo = os.stat(zip_path) + # A new line to clear the carriage return from download progress + # logging.info is not applicable here + print() + logging.info( + "Successfully downloaded {} {} bytes".format( + zip_path, statinfo.st_size)) + + zipfile.ZipFile(zip_path, "r").extractall(temp_dir) + + if dataset == ML_1M: + _regularize_1m_dataset(temp_dir) + else: + _regularize_20m_dataset(temp_dir) + + for fname in tf.io.gfile.listdir(temp_dir): + if not tf.io.gfile.exists(os.path.join(data_subdir, fname)): + tf.io.gfile.copy(os.path.join(temp_dir, fname), + os.path.join(data_subdir, fname)) + else: + logging.info("Skipping copy of {}, as it already exists in the " + "destination folder.".format(fname)) + + finally: + tf.io.gfile.rmtree(temp_dir) + + +def _transform_csv(input_path, output_path, names, skip_first, separator=","): + """Transform csv to a regularized format. + + Args: + input_path: The path of the raw csv. + output_path: The path of the cleaned csv. + names: The csv column names. + skip_first: Boolean of whether to skip the first line of the raw csv. + separator: Character used to separate fields in the raw csv. + """ + if six.PY2: + names = [six.ensure_text(n, "utf-8") for n in names] + + with tf.io.gfile.GFile(output_path, "wb") as f_out, \ + tf.io.gfile.GFile(input_path, "rb") as f_in: + + # Write column names to the csv. + f_out.write(",".join(names).encode("utf-8")) + f_out.write(b"\n") + for i, line in enumerate(f_in): + if i == 0 and skip_first: + continue # ignore existing labels in the csv + + line = six.ensure_text(line, "utf-8", errors="ignore") + fields = line.split(separator) + if separator != ",": + fields = ['"{}"'.format(field) if "," in field else field + for field in fields] + f_out.write(",".join(fields).encode("utf-8")) + + +def _regularize_1m_dataset(temp_dir): + """ + ratings.dat + The file has no header row, and each line is in the following format: + UserID::MovieID::Rating::Timestamp + - UserIDs range from 1 and 6040 + - MovieIDs range from 1 and 3952 + - Ratings are made on a 5-star scale (whole-star ratings only) + - Timestamp is represented in seconds since midnight Coordinated Universal + Time (UTC) of January 1, 1970. + - Each user has at least 20 ratings + + movies.dat + Each line has the following format: + MovieID::Title::Genres + - MovieIDs range from 1 and 3952 + """ + working_dir = os.path.join(temp_dir, ML_1M) + + _transform_csv( + input_path=os.path.join(working_dir, "ratings.dat"), + output_path=os.path.join(temp_dir, RATINGS_FILE), + names=RATING_COLUMNS, skip_first=False, separator="::") + + _transform_csv( + input_path=os.path.join(working_dir, "movies.dat"), + output_path=os.path.join(temp_dir, MOVIES_FILE), + names=MOVIE_COLUMNS, skip_first=False, separator="::") + + tf.io.gfile.rmtree(working_dir) + + +def _regularize_20m_dataset(temp_dir): + """ + ratings.csv + Each line of this file after the header row represents one rating of one + movie by one user, and has the following format: + userId,movieId,rating,timestamp + - The lines within this file are ordered first by userId, then, within user, + by movieId. + - Ratings are made on a 5-star scale, with half-star increments + (0.5 stars - 5.0 stars). + - Timestamps represent seconds since midnight Coordinated Universal Time + (UTC) of January 1, 1970. + - All the users had rated at least 20 movies. + + movies.csv + Each line has the following format: + MovieID,Title,Genres + - MovieIDs range from 1 and 3952 + """ + working_dir = os.path.join(temp_dir, ML_20M) + + _transform_csv( + input_path=os.path.join(working_dir, "ratings.csv"), + output_path=os.path.join(temp_dir, RATINGS_FILE), + names=RATING_COLUMNS, skip_first=True, separator=",") + + _transform_csv( + input_path=os.path.join(working_dir, "movies.csv"), + output_path=os.path.join(temp_dir, MOVIES_FILE), + names=MOVIE_COLUMNS, skip_first=True, separator=",") + + tf.io.gfile.rmtree(working_dir) + + +def download(dataset, data_dir): + if dataset: + _download_and_clean(dataset, data_dir) + else: + _ = [_download_and_clean(d, data_dir) for d in DATASETS] + + +def ratings_csv_to_dataframe(data_dir, dataset): + with tf.io.gfile.GFile(os.path.join(data_dir, dataset, RATINGS_FILE)) as f: + return pd.read_csv(f, encoding="utf-8") + + +def csv_to_joint_dataframe(data_dir, dataset): + ratings = ratings_csv_to_dataframe(data_dir, dataset) + + with tf.io.gfile.GFile(os.path.join(data_dir, dataset, MOVIES_FILE)) as f: + movies = pd.read_csv(f, encoding="utf-8") + + df = ratings.merge(movies, on=ITEM_COLUMN) + df[RATING_COLUMN] = df[RATING_COLUMN].astype(np.float32) + + return df + + +def integerize_genres(dataframe): + """Replace genre string with a binary vector. + + Args: + dataframe: a pandas dataframe of movie data. + + Returns: + The transformed dataframe. + """ + def _map_fn(entry): + entry.replace("Children's", "Children") # naming difference. + movie_genres = entry.split("|") + output = np.zeros((len(GENRES),), dtype=np.int64) + for i, genre in enumerate(GENRES): + if genre in movie_genres: + output[i] = 1 + return output + + dataframe[GENRE_COLUMN] = dataframe[GENRE_COLUMN].apply(_map_fn) + + return dataframe + + +def define_data_download_flags(): + """Add flags specifying data download arguments.""" + flags.DEFINE_string( + name="data_dir", default="/tmp/movielens-data/", + help=flags_core.help_wrap( + "Directory to download and extract data.")) + + flags.DEFINE_enum( + name="dataset", default=None, + enum_values=DATASETS, case_sensitive=False, + help=flags_core.help_wrap("Dataset to be trained and evaluated.")) + + +def main(_): + """Download and extract the data from GroupLens website.""" + download(flags.FLAGS.dataset, flags.FLAGS.data_dir) + + +if __name__ == "__main__": + define_data_download_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_common.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_common.py new file mode 100644 index 0000000..0819a51 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_common.py @@ -0,0 +1,331 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common functionalities used by both Keras and Estimator implementations. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os + +# pylint: disable=g-bad-import-order +import numpy as np +from absl import flags +from absl import logging +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.recommendation import constants as rconst +from official.recommendation import data_pipeline +from official.recommendation import data_preprocessing +from official.recommendation import movielens +from official.utils.flags import core as flags_core +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + +FLAGS = flags.FLAGS + + +def get_inputs(params): + """Returns some parameters used by the model.""" + if FLAGS.download_if_missing and not FLAGS.use_synthetic_data: + movielens.download(FLAGS.dataset, FLAGS.data_dir) + + if FLAGS.seed is not None: + np.random.seed(FLAGS.seed) + + if FLAGS.use_synthetic_data: + producer = data_pipeline.DummyConstructor() + num_users, num_items = data_preprocessing.DATASET_TO_NUM_USERS_AND_ITEMS[ + FLAGS.dataset] + num_train_steps = rconst.SYNTHETIC_BATCHES_PER_EPOCH + num_eval_steps = rconst.SYNTHETIC_BATCHES_PER_EPOCH + else: + num_users, num_items, producer = data_preprocessing.instantiate_pipeline( + dataset=FLAGS.dataset, data_dir=FLAGS.data_dir, params=params, + constructor_type=FLAGS.constructor_type, + deterministic=FLAGS.seed is not None) + num_train_steps = producer.train_batches_per_epoch + num_eval_steps = producer.eval_batches_per_epoch + + return num_users, num_items, num_train_steps, num_eval_steps, producer + + +def parse_flags(flags_obj): + """Convenience function to turn flags into params.""" + num_gpus = flags_core.get_num_gpus(flags_obj) + + batch_size = flags_obj.batch_size + eval_batch_size = flags_obj.eval_batch_size or flags_obj.batch_size + + return { + "train_epochs": flags_obj.train_epochs, + "batches_per_step": 1, + "use_seed": flags_obj.seed is not None, + "batch_size": batch_size, + "eval_batch_size": eval_batch_size, + "learning_rate": flags_obj.learning_rate, + "mf_dim": flags_obj.num_factors, + "model_layers": [int(layer) for layer in flags_obj.layers], + "mf_regularization": flags_obj.mf_regularization, + "mlp_reg_layers": [float(reg) for reg in flags_obj.mlp_regularization], + "num_neg": flags_obj.num_neg, + "distribution_strategy": flags_obj.distribution_strategy, + "num_gpus": num_gpus, + "use_tpu": flags_obj.tpu is not None, + "tpu": flags_obj.tpu, + "tpu_zone": flags_obj.tpu_zone, + "tpu_gcp_project": flags_obj.tpu_gcp_project, + "beta1": flags_obj.beta1, + "beta2": flags_obj.beta2, + "epsilon": flags_obj.epsilon, + "match_mlperf": flags_obj.ml_perf, + "epochs_between_evals": FLAGS.epochs_between_evals, + "keras_use_ctl": flags_obj.keras_use_ctl, + "hr_threshold": flags_obj.hr_threshold, + "stream_files": flags_obj.tpu is not None, + "train_dataset_path": flags_obj.train_dataset_path, + "eval_dataset_path": flags_obj.eval_dataset_path, + "input_meta_data_path": flags_obj.input_meta_data_path, + } + + +def get_v1_distribution_strategy(params): + """Returns the distribution strategy to use.""" + if params["use_tpu"]: + # Some of the networking libraries are quite chatty. + for name in ["googleapiclient.discovery", "googleapiclient.discovery_cache", + "oauth2client.transport"]: + logging.getLogger(name).setLevel(logging.ERROR) + + tpu_cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver( + tpu=params["tpu"], + zone=params["tpu_zone"], + project=params["tpu_gcp_project"], + coordinator_name="coordinator" + ) + + logging.info("Issuing reset command to TPU to ensure a clean state.") + tf.Session.reset(tpu_cluster_resolver.get_master()) + + # Estimator looks at the master it connects to for MonitoredTrainingSession + # by reading the `TF_CONFIG` environment variable, and the coordinator + # is used by StreamingFilesDataset. + tf_config_env = { + "session_master": tpu_cluster_resolver.get_master(), + "eval_session_master": tpu_cluster_resolver.get_master(), + "coordinator": tpu_cluster_resolver.cluster_spec() + .as_dict()["coordinator"] + } + os.environ["TF_CONFIG"] = json.dumps(tf_config_env) + + distribution = tf.distribute.experimental.TPUStrategy( + tpu_cluster_resolver, steps_per_run=100) + + else: + distribution = distribution_utils.get_distribution_strategy( + num_gpus=params["num_gpus"]) + + return distribution + + +def define_ncf_flags(): + """Add flags for running ncf_main.""" + # Add common flags + flags_core.define_base(model_dir=True, clean=True, train_epochs=True, + epochs_between_evals=True, export_dir=False, + run_eagerly=True, stop_threshold=True, num_gpu=True, + hooks=True, distribution_strategy=True) + flags_core.define_performance( + synthetic_data=True, + dtype=True, + fp16_implementation=True, + loss_scale=True, + dynamic_loss_scale=True, + enable_xla=True, + ) + flags_core.define_device(tpu=True) + flags_core.define_benchmark() + + flags.adopt_module_key_flags(flags_core) + + flags_core.set_defaults( + model_dir="/tmp/ncf/", + data_dir="/tmp/movielens-data/", + train_epochs=2, + batch_size=99000, + hooks="ProfilerHook", + tpu=None + ) + + # Add ncf-specific flags + flags.DEFINE_enum( + name="dataset", default="ml-1m", + enum_values=["ml-1m", "ml-20m"], case_sensitive=False, + help=flags_core.help_wrap( + "Dataset to be trained and evaluated.")) + + flags.DEFINE_boolean( + name="download_if_missing", default=True, help=flags_core.help_wrap( + "Download data to data_dir if it is not already present.")) + + flags.DEFINE_integer( + name="eval_batch_size", default=None, help=flags_core.help_wrap( + "The batch size used for evaluation. This should generally be larger" + "than the training batch size as the lack of back propagation during" + "evaluation can allow for larger batch sizes to fit in memory. If not" + "specified, the training batch size (--batch_size) will be used.")) + + flags.DEFINE_integer( + name="num_factors", default=8, + help=flags_core.help_wrap("The Embedding size of MF model.")) + + # Set the default as a list of strings to be consistent with input arguments + flags.DEFINE_list( + name="layers", default=["64", "32", "16", "8"], + help=flags_core.help_wrap( + "The sizes of hidden layers for MLP. Example " + "to specify different sizes of MLP layers: --layers=32,16,8,4")) + + flags.DEFINE_float( + name="mf_regularization", default=0., + help=flags_core.help_wrap( + "The regularization factor for MF embeddings. The factor is used by " + "regularizer which allows to apply penalties on layer parameters or " + "layer activity during optimization.")) + + flags.DEFINE_list( + name="mlp_regularization", default=["0.", "0.", "0.", "0."], + help=flags_core.help_wrap( + "The regularization factor for each MLP layer. See mf_regularization " + "help for more info about regularization factor.")) + + flags.DEFINE_integer( + name="num_neg", default=4, + help=flags_core.help_wrap( + "The Number of negative instances to pair with a positive instance.")) + + flags.DEFINE_float( + name="learning_rate", default=0.001, + help=flags_core.help_wrap("The learning rate.")) + + flags.DEFINE_float( + name="beta1", default=0.9, + help=flags_core.help_wrap("beta1 hyperparameter for the Adam optimizer.")) + + flags.DEFINE_float( + name="beta2", default=0.999, + help=flags_core.help_wrap("beta2 hyperparameter for the Adam optimizer.")) + + flags.DEFINE_float( + name="epsilon", default=1e-8, + help=flags_core.help_wrap("epsilon hyperparameter for the Adam " + "optimizer.")) + + flags.DEFINE_float( + name="hr_threshold", default=1.0, + help=flags_core.help_wrap( + "If passed, training will stop when the evaluation metric HR is " + "greater than or equal to hr_threshold. For dataset ml-1m, the " + "desired hr_threshold is 0.68 which is the result from the paper; " + "For dataset ml-20m, the threshold can be set as 0.95 which is " + "achieved by MLPerf implementation.")) + + flags.DEFINE_enum( + name="constructor_type", default="bisection", + enum_values=["bisection", "materialized"], case_sensitive=False, + help=flags_core.help_wrap( + "Strategy to use for generating false negatives. materialized has a" + "precompute that scales badly, but a faster per-epoch construction" + "time and can be faster on very large systems.")) + + flags.DEFINE_string( + name="train_dataset_path", + default=None, + help=flags_core.help_wrap("Path to training data.")) + + flags.DEFINE_string( + name="eval_dataset_path", + default=None, + help=flags_core.help_wrap("Path to evaluation data.")) + + flags.DEFINE_string( + name="input_meta_data_path", + default=None, + help=flags_core.help_wrap("Path to input meta data file.")) + + flags.DEFINE_bool( + name="ml_perf", default=False, + help=flags_core.help_wrap( + "If set, changes the behavior of the model slightly to match the " + "MLPerf reference implementations here: \n" + "https://github.com/mlperf/reference/tree/master/recommendation/" + "pytorch\n" + "The two changes are:\n" + "1. When computing the HR and NDCG during evaluation, remove " + "duplicate user-item pairs before the computation. This results in " + "better HRs and NDCGs.\n" + "2. Use a different soring algorithm when sorting the input data, " + "which performs better due to the fact the sorting algorithms are " + "not stable.")) + + flags.DEFINE_bool( + name="output_ml_perf_compliance_logging", default=False, + help=flags_core.help_wrap( + "If set, output the MLPerf compliance logging. This is only useful " + "if one is running the model for MLPerf. See " + "https://github.com/mlperf/policies/blob/master/training_rules.adoc" + "#submission-compliance-logs for details. This uses sudo and so may " + "ask for your password, as root access is needed to clear the system " + "caches, which is required for MLPerf compliance." + ) + ) + + flags.DEFINE_integer( + name="seed", default=None, help=flags_core.help_wrap( + "This value will be used to seed both NumPy and TensorFlow.")) + + @flags.validator("eval_batch_size", "eval_batch_size must be at least {}" + .format(rconst.NUM_EVAL_NEGATIVES + 1)) + def eval_size_check(eval_batch_size): + return (eval_batch_size is None or + int(eval_batch_size) > rconst.NUM_EVAL_NEGATIVES) + + flags.DEFINE_bool( + name="early_stopping", + default=False, + help=flags_core.help_wrap( + "If True, we stop the training when it reaches hr_threshold")) + + flags.DEFINE_bool( + name="keras_use_ctl", + default=False, + help=flags_core.help_wrap( + "If True, we use a custom training loop for keras.")) + + +def convert_to_softmax_logits(logits): + """Convert the logits returned by the base model to softmax logits. + + Args: + logits: used to create softmax. + + Returns: + Softmax with the first column of zeros is equivalent to sigmoid. + """ + softmax_logits = tf.concat([logits * 0, logits], axis=1) + return softmax_logits diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_input_pipeline.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_input_pipeline.py new file mode 100644 index 0000000..09dbb14 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_input_pipeline.py @@ -0,0 +1,184 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""NCF model input pipeline.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools + +# pylint: disable=g-bad-import-order +import tensorflow.compat.v2 as tf +# pylint: enable=g-bad-import-order + +from official.recommendation import constants as rconst +from official.recommendation import movielens +from official.recommendation import data_pipeline + +NUM_SHARDS = 16 + + +def create_dataset_from_tf_record_files(input_file_pattern, + pre_batch_size, + batch_size, + is_training=True): + """Creates dataset from (tf)records files for training/evaluation.""" + + files = tf.data.Dataset.list_files(input_file_pattern, shuffle=is_training) + + def make_dataset(files_dataset, shard_index): + """Returns dataset for sharded tf record files.""" + if pre_batch_size != batch_size: + raise ValueError("Pre-batch ({}) size is not equal to batch " + "size ({})".format(pre_batch_size, batch_size)) + files_dataset = files_dataset.shard(NUM_SHARDS, shard_index) + dataset = files_dataset.interleave(tf.data.TFRecordDataset) + decode_fn = functools.partial( + data_pipeline.DatasetManager.deserialize, + batch_size=pre_batch_size, + is_training=is_training) + dataset = dataset.map( + decode_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + return dataset + + dataset = tf.data.Dataset.range(NUM_SHARDS) + map_fn = functools.partial(make_dataset, files) + dataset = dataset.interleave( + map_fn, + cycle_length=NUM_SHARDS, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE) + return dataset + + +def create_dataset_from_data_producer(producer, params): + """Return dataset online-generating data.""" + + def preprocess_train_input(features, labels): + """Pre-process the training data. + + This is needed because + - The label needs to be extended to be used in the loss fn + - We need the same inputs for training and eval so adding fake inputs + for DUPLICATE_MASK in training data. + + Args: + features: Dictionary of features for training. + labels: Training labels. + + Returns: + Processed training features. + """ + fake_dup_mask = tf.zeros_like(features[movielens.USER_COLUMN]) + features[rconst.DUPLICATE_MASK] = fake_dup_mask + features[rconst.TRAIN_LABEL_KEY] = labels + return features + + train_input_fn = producer.make_input_fn(is_training=True) + train_input_dataset = train_input_fn(params).map(preprocess_train_input) + + def preprocess_eval_input(features): + """Pre-process the eval data. + + This is needed because: + - The label needs to be extended to be used in the loss fn + - We need the same inputs for training and eval so adding fake inputs + for VALID_PT_MASK in eval data. + + Args: + features: Dictionary of features for evaluation. + + Returns: + Processed evaluation features. + """ + labels = tf.cast(tf.zeros_like(features[movielens.USER_COLUMN]), tf.bool) + fake_valid_pt_mask = tf.cast( + tf.zeros_like(features[movielens.USER_COLUMN]), tf.bool) + features[rconst.VALID_POINT_MASK] = fake_valid_pt_mask + features[rconst.TRAIN_LABEL_KEY] = labels + return features + + eval_input_fn = producer.make_input_fn(is_training=False) + eval_input_dataset = eval_input_fn(params).map(preprocess_eval_input) + + return train_input_dataset, eval_input_dataset + + +def create_ncf_input_data(params, + producer=None, + input_meta_data=None, + strategy=None): + """Creates NCF training/evaluation dataset. + + Args: + params: Dictionary containing parameters for train/evaluation data. + producer: Instance of BaseDataConstructor that generates data online. Must + not be None when params['train_dataset_path'] or + params['eval_dataset_path'] is not specified. + input_meta_data: A dictionary of input metadata to be used when reading data + from tf record files. Must be specified when params["train_input_dataset"] + is specified. + strategy: Distribution strategy used for distributed training. If specified, + used to assert that evaluation batch size is correctly a multiple of + total number of devices used. + + Returns: + (training dataset, evaluation dataset, train steps per epoch, + eval steps per epoch) + + Raises: + ValueError: If data is being generated online for when using TPU's. + """ + # NCF evaluation metric calculation logic assumes that evaluation data + # sample size are in multiples of (1 + number of negative samples in + # evaluation) for each device. As so, evaluation batch size must be a + # multiple of (number of replicas * (1 + number of negative samples)). + num_devices = strategy.num_replicas_in_sync if strategy else 1 + if (params["eval_batch_size"] % (num_devices * + (1 + rconst.NUM_EVAL_NEGATIVES))): + raise ValueError("Evaluation batch size must be divisible by {} " + "times {}".format(num_devices, + (1 + rconst.NUM_EVAL_NEGATIVES))) + + if params["train_dataset_path"]: + assert params["eval_dataset_path"] + + train_dataset = create_dataset_from_tf_record_files( + params["train_dataset_path"], + input_meta_data["train_prebatch_size"], + params["batch_size"], + is_training=True) + eval_dataset = create_dataset_from_tf_record_files( + params["eval_dataset_path"], + input_meta_data["eval_prebatch_size"], + params["eval_batch_size"], + is_training=False) + + num_train_steps = int(input_meta_data["num_train_steps"]) + num_eval_steps = int(input_meta_data["num_eval_steps"]) + else: + if params["use_tpu"]: + raise ValueError("TPU training does not support data producer yet. " + "Use pre-processed data.") + + assert producer + # Start retrieving data from producer. + train_dataset, eval_dataset = create_dataset_from_data_producer( + producer, params) + num_train_steps = producer.train_batches_per_epoch + num_eval_steps = producer.eval_batches_per_epoch + + return train_dataset, eval_dataset, num_train_steps, num_eval_steps diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_keras_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_keras_main.py new file mode 100644 index 0000000..a35bb9c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_keras_main.py @@ -0,0 +1,562 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""NCF framework to train and evaluate the NeuMF model. + +The NeuMF model assembles both MF and MLP models under the NCF framework. Check +`neumf_model.py` for more details about the models. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os + +# pylint: disable=g-bad-import-order +from absl import app +from absl import flags +from absl import logging +import tensorflow.compat.v2 as tf +# pylint: enable=g-bad-import-order + +from official.recommendation import constants as rconst +from official.recommendation import movielens +from official.recommendation import ncf_common +from official.recommendation import ncf_input_pipeline +from official.recommendation import neumf_model +from official.utils.logs import logger +from official.utils.logs import mlperf_helper +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.utils.misc import model_helpers +from official.utils.flags import core as flags_core + +FLAGS = flags.FLAGS + + +def metric_fn(logits, dup_mask, params): + dup_mask = tf.cast(dup_mask, tf.float32) + logits = tf.slice(logits, [0, 1], [-1, -1]) + in_top_k, _, metric_weights, _ = neumf_model.compute_top_k_and_ndcg( + logits, + dup_mask, + params["match_mlperf"]) + metric_weights = tf.cast(metric_weights, tf.float32) + return in_top_k, metric_weights + + +class MetricLayer(tf.keras.layers.Layer): + """Custom layer of metrics for NCF model.""" + + def __init__(self, params): + super(MetricLayer, self).__init__() + self.params = params + + def call(self, inputs, training=False): + logits, dup_mask = inputs + + if training: + hr_sum = 0.0 + hr_count = 0.0 + else: + metric, metric_weights = metric_fn(logits, dup_mask, self.params) + hr_sum = tf.reduce_sum(metric * metric_weights) + hr_count = tf.reduce_sum(metric_weights) + + self.add_metric(hr_sum, name="hr_sum", aggregation="mean") + self.add_metric(hr_count, name="hr_count", aggregation="mean") + return logits + + +class LossLayer(tf.keras.layers.Layer): + """Pass-through loss layer for NCF model.""" + + def __init__(self, loss_normalization_factor): + # The loss may overflow in float16, so we use float32 instead. + super(LossLayer, self).__init__(dtype="float32") + self.loss_normalization_factor = loss_normalization_factor + self.loss = tf.keras.losses.SparseCategoricalCrossentropy( + from_logits=True, reduction="sum") + + def call(self, inputs): + logits, labels, valid_pt_mask_input = inputs + loss = self.loss( + y_true=labels, y_pred=logits, sample_weight=valid_pt_mask_input) + loss = loss * (1.0 / self.loss_normalization_factor) + self.add_loss(loss) + return logits + + +class IncrementEpochCallback(tf.keras.callbacks.Callback): + """A callback to increase the requested epoch for the data producer. + + The reason why we need this is because we can only buffer a limited amount of + data. So we keep a moving window to represent the buffer. This is to move the + one of the window's boundaries for each epoch. + """ + + def __init__(self, producer): + self._producer = producer + + def on_epoch_begin(self, epoch, logs=None): + self._producer.increment_request_epoch() + + +class CustomEarlyStopping(tf.keras.callbacks.Callback): + """Stop training has reached a desired hit rate.""" + + def __init__(self, monitor, desired_value): + super(CustomEarlyStopping, self).__init__() + + self.monitor = monitor + self.desired = desired_value + self.stopped_epoch = 0 + + def on_epoch_end(self, epoch, logs=None): + current = self.get_monitor_value(logs) + if current and current >= self.desired: + self.stopped_epoch = epoch + self.model.stop_training = True + + def on_train_end(self, logs=None): + if self.stopped_epoch > 0: + print("Epoch %05d: early stopping" % (self.stopped_epoch + 1)) + + def get_monitor_value(self, logs): + logs = logs or {} + monitor_value = logs.get(self.monitor) + if monitor_value is None: + logging.warning("Early stopping conditioned on metric `%s` " + "which is not available. Available metrics are: %s", + self.monitor, ",".join(list(logs.keys()))) + return monitor_value + + +def _get_keras_model(params): + """Constructs and returns the model.""" + batch_size = params["batch_size"] + + user_input = tf.keras.layers.Input( + shape=(1,), name=movielens.USER_COLUMN, dtype=tf.int32) + + item_input = tf.keras.layers.Input( + shape=(1,), name=movielens.ITEM_COLUMN, dtype=tf.int32) + + valid_pt_mask_input = tf.keras.layers.Input( + shape=(1,), name=rconst.VALID_POINT_MASK, dtype=tf.bool) + + dup_mask_input = tf.keras.layers.Input( + shape=(1,), name=rconst.DUPLICATE_MASK, dtype=tf.int32) + + label_input = tf.keras.layers.Input( + shape=(1,), name=rconst.TRAIN_LABEL_KEY, dtype=tf.bool) + + base_model = neumf_model.construct_model(user_input, item_input, params) + + logits = base_model.output + + zeros = tf.keras.layers.Lambda( + lambda x: x * 0)(logits) + + softmax_logits = tf.keras.layers.concatenate( + [zeros, logits], + axis=-1) + + # Custom training loop calculates loss and metric as a part of + # training/evaluation step function. + if not params["keras_use_ctl"]: + softmax_logits = MetricLayer(params)([softmax_logits, dup_mask_input]) + # TODO(b/134744680): Use model.add_loss() instead once the API is well + # supported. + softmax_logits = LossLayer(batch_size)( + [softmax_logits, label_input, valid_pt_mask_input]) + + keras_model = tf.keras.Model( + inputs={ + movielens.USER_COLUMN: user_input, + movielens.ITEM_COLUMN: item_input, + rconst.VALID_POINT_MASK: valid_pt_mask_input, + rconst.DUPLICATE_MASK: dup_mask_input, + rconst.TRAIN_LABEL_KEY: label_input}, + outputs=softmax_logits) + + keras_model.summary() + return keras_model + + +def run_ncf(_): + """Run NCF training and eval with Keras.""" + + keras_utils.set_session_config(enable_xla=FLAGS.enable_xla) + + if FLAGS.seed is not None: + print("Setting tf seed") + tf.random.set_seed(FLAGS.seed) + + model_helpers.apply_clean(FLAGS) + + if FLAGS.dtype == "fp16" and FLAGS.fp16_implementation == "keras": + policy = tf.keras.mixed_precision.experimental.Policy( + "mixed_float16", + loss_scale=flags_core.get_loss_scale(FLAGS, default_for_fp16="dynamic")) + tf.keras.mixed_precision.experimental.set_policy(policy) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=FLAGS.distribution_strategy, + num_gpus=FLAGS.num_gpus, + tpu_address=FLAGS.tpu) + + params = ncf_common.parse_flags(FLAGS) + params["distribute_strategy"] = strategy + + if not keras_utils.is_v2_0() and strategy is not None: + logging.error("NCF Keras only works with distribution strategy in TF 2.0") + return + if (params["keras_use_ctl"] and ( + not keras_utils.is_v2_0() or strategy is None)): + logging.error( + "Custom training loop only works with tensorflow 2.0 and dist strat.") + return + if params["use_tpu"] and not params["keras_use_ctl"]: + logging.error("Custom training loop must be used when using TPUStrategy.") + return + + batch_size = params["batch_size"] + time_callback = keras_utils.TimeHistory(batch_size, FLAGS.log_steps) + callbacks = [time_callback] + + producer, input_meta_data = None, None + generate_input_online = params["train_dataset_path"] is None + + if generate_input_online: + # Start data producing thread. + num_users, num_items, _, _, producer = ncf_common.get_inputs(params) + producer.start() + per_epoch_callback = IncrementEpochCallback(producer) + callbacks.append(per_epoch_callback) + else: + assert params["eval_dataset_path"] and params["input_meta_data_path"] + with tf.io.gfile.GFile(params["input_meta_data_path"], "rb") as reader: + input_meta_data = json.loads(reader.read().decode("utf-8")) + num_users = input_meta_data["num_users"] + num_items = input_meta_data["num_items"] + + params["num_users"], params["num_items"] = num_users, num_items + + if FLAGS.early_stopping: + early_stopping_callback = CustomEarlyStopping( + "val_HR_METRIC", desired_value=FLAGS.hr_threshold) + callbacks.append(early_stopping_callback) + + (train_input_dataset, eval_input_dataset, + num_train_steps, num_eval_steps) = \ + (ncf_input_pipeline.create_ncf_input_data( + params, producer, input_meta_data, strategy)) + steps_per_epoch = None if generate_input_online else num_train_steps + + with distribution_utils.get_strategy_scope(strategy): + keras_model = _get_keras_model(params) + optimizer = tf.keras.optimizers.Adam( + learning_rate=params["learning_rate"], + beta_1=params["beta1"], + beta_2=params["beta2"], + epsilon=params["epsilon"]) + if FLAGS.fp16_implementation == "graph_rewrite": + optimizer = \ + tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer, + loss_scale=flags_core.get_loss_scale(FLAGS, + default_for_fp16="dynamic")) + elif FLAGS.dtype == "fp16" and params["keras_use_ctl"]: + # When keras_use_ctl is False, instead Model.fit() automatically applies + # loss scaling so we don't need to create a LossScaleOptimizer. + optimizer = tf.keras.mixed_precision.experimental.LossScaleOptimizer( + optimizer, + tf.keras.mixed_precision.experimental.global_policy().loss_scale) + + if params["keras_use_ctl"]: + train_loss, eval_results = run_ncf_custom_training( + params, + strategy, + keras_model, + optimizer, + callbacks, + train_input_dataset, + eval_input_dataset, + num_train_steps, + num_eval_steps, + generate_input_online=generate_input_online) + else: + keras_model.compile(optimizer=optimizer, run_eagerly=FLAGS.run_eagerly) + + if not FLAGS.ml_perf: + # Create Tensorboard summary and checkpoint callbacks. + summary_dir = os.path.join(FLAGS.model_dir, "summaries") + summary_callback = tf.keras.callbacks.TensorBoard(summary_dir) + checkpoint_path = os.path.join(FLAGS.model_dir, "checkpoint") + checkpoint_callback = tf.keras.callbacks.ModelCheckpoint( + checkpoint_path, save_weights_only=True) + + callbacks += [summary_callback, checkpoint_callback] + + history = keras_model.fit( + train_input_dataset, + epochs=FLAGS.train_epochs, + steps_per_epoch=steps_per_epoch, + callbacks=callbacks, + validation_data=eval_input_dataset, + validation_steps=num_eval_steps, + verbose=2) + + logging.info("Training done. Start evaluating") + + eval_loss_and_metrics = keras_model.evaluate( + eval_input_dataset, steps=num_eval_steps, verbose=2) + + logging.info("Keras evaluation is done.") + + # Keras evaluate() API returns scalar loss and metric values from + # evaluation as a list. Here, the returned list would contain + # [evaluation loss, hr sum, hr count]. + eval_hit_rate = eval_loss_and_metrics[1] / eval_loss_and_metrics[2] + + # Format evaluation result into [eval loss, eval hit accuracy]. + eval_results = [eval_loss_and_metrics[0], eval_hit_rate] + + if history and history.history: + train_history = history.history + train_loss = train_history["loss"][-1] + + stats = build_stats(train_loss, eval_results, time_callback) + return stats + + +def run_ncf_custom_training(params, + strategy, + keras_model, + optimizer, + callbacks, + train_input_dataset, + eval_input_dataset, + num_train_steps, + num_eval_steps, + generate_input_online=True): + """Runs custom training loop. + + Args: + params: Dictionary containing training parameters. + strategy: Distribution strategy to be used for distributed training. + keras_model: Model used for training. + optimizer: Optimizer used for training. + callbacks: Callbacks to be invoked between batches/epochs. + train_input_dataset: tf.data.Dataset used for training. + eval_input_dataset: tf.data.Dataset used for evaluation. + num_train_steps: Total number of steps to run for training. + num_eval_steps: Total number of steps to run for evaluation. + generate_input_online: Whether input data was generated by data producer. + When data is generated by data producer, then train dataset must be + re-initialized after every epoch. + + Returns: + A tuple of train loss and a list of training and evaluation results. + """ + loss_object = tf.keras.losses.SparseCategoricalCrossentropy( + reduction="sum", from_logits=True) + train_input_iterator = iter( + strategy.experimental_distribute_dataset(train_input_dataset)) + + def train_step(train_iterator): + """Called once per step to train the model.""" + + def step_fn(features): + """Computes loss and applied gradient per replica.""" + with tf.GradientTape() as tape: + softmax_logits = keras_model(features) + # The loss can overflow in float16, so we cast to float32. + softmax_logits = tf.cast(softmax_logits, "float32") + labels = features[rconst.TRAIN_LABEL_KEY] + loss = loss_object( + labels, + softmax_logits, + sample_weight=features[rconst.VALID_POINT_MASK]) + loss *= (1.0 / params["batch_size"]) + if FLAGS.dtype == "fp16": + loss = optimizer.get_scaled_loss(loss) + + grads = tape.gradient(loss, keras_model.trainable_variables) + if FLAGS.dtype == "fp16": + grads = optimizer.get_unscaled_gradients(grads) + # Converting gradients to dense form helps in perf on GPU for NCF + grads = neumf_model.sparse_to_dense_grads( + list(zip(grads, keras_model.trainable_variables))) + optimizer.apply_gradients(grads) + return loss + + per_replica_losses = strategy.run( + step_fn, args=(next(train_iterator),)) + mean_loss = strategy.reduce( + tf.distribute.ReduceOp.SUM, per_replica_losses, axis=None) + return mean_loss + + def eval_step(eval_iterator): + """Called once per eval step to compute eval metrics.""" + + def step_fn(features): + """Computes eval metrics per replica.""" + softmax_logits = keras_model(features) + in_top_k, metric_weights = metric_fn(softmax_logits, + features[rconst.DUPLICATE_MASK], + params) + hr_sum = tf.reduce_sum(in_top_k * metric_weights) + hr_count = tf.reduce_sum(metric_weights) + return hr_sum, hr_count + + per_replica_hr_sum, per_replica_hr_count = ( + strategy.run( + step_fn, args=(next(eval_iterator),))) + hr_sum = strategy.reduce( + tf.distribute.ReduceOp.SUM, per_replica_hr_sum, axis=None) + hr_count = strategy.reduce( + tf.distribute.ReduceOp.SUM, per_replica_hr_count, axis=None) + return hr_sum, hr_count + + if not FLAGS.run_eagerly: + train_step = tf.function(train_step) + eval_step = tf.function(eval_step) + + for callback in callbacks: + callback.on_train_begin() + + # Not writing tensorboard summaries if running in MLPerf. + if FLAGS.ml_perf: + eval_summary_writer, train_summary_writer = None, None + else: + summary_dir = os.path.join(FLAGS.model_dir, "summaries") + eval_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, "eval")) + train_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, "train")) + + train_loss = 0 + for epoch in range(FLAGS.train_epochs): + for cb in callbacks: + cb.on_epoch_begin(epoch) + + # As NCF dataset is sampled with randomness, not repeating + # data elements in each epoch has significant impact on + # convergence. As so, offline-generated TF record files + # contains all epoch worth of data. Thus we do not need + # to initialize dataset when reading from tf record files. + if generate_input_online: + train_input_iterator = iter( + strategy.experimental_distribute_dataset(train_input_dataset)) + + train_loss = 0 + for step in range(num_train_steps): + current_step = step + epoch * num_train_steps + for c in callbacks: + c.on_batch_begin(current_step) + + train_loss += train_step(train_input_iterator) + + # Write train loss once in every 1000 steps. + if train_summary_writer and step % 1000 == 0: + with train_summary_writer.as_default(): + tf.summary.scalar("training_loss", train_loss/(step + 1), + step=current_step) + + for c in callbacks: + c.on_batch_end(current_step) + + train_loss /= num_train_steps + logging.info("Done training epoch %s, epoch loss=%s.", epoch + 1, + train_loss) + + eval_input_iterator = iter( + strategy.experimental_distribute_dataset(eval_input_dataset)) + hr_sum = 0 + hr_count = 0 + for _ in range(num_eval_steps): + step_hr_sum, step_hr_count = eval_step(eval_input_iterator) + hr_sum += step_hr_sum + hr_count += step_hr_count + + logging.info("Done eval epoch %s, hit_rate=%s.", epoch + 1, + hr_sum / hr_count) + if eval_summary_writer: + with eval_summary_writer.as_default(): + tf.summary.scalar("hit_rate", hr_sum / hr_count, step=current_step) + + if (FLAGS.early_stopping and + float(hr_sum / hr_count) > params["hr_threshold"]): + break + + for c in callbacks: + c.on_train_end() + + # Saving the model at the end of training. + if not FLAGS.ml_perf: + checkpoint = tf.train.Checkpoint(model=keras_model, optimizer=optimizer) + checkpoint_path = os.path.join(FLAGS.model_dir, "ctl_checkpoint") + checkpoint.save(checkpoint_path) + logging.info("Saving model as TF checkpoint: %s", checkpoint_path) + + return train_loss, [None, hr_sum / hr_count] + + +def build_stats(loss, eval_result, time_callback): + """Normalizes and returns dictionary of stats. + + Args: + loss: The final loss at training time. + eval_result: Output of the eval step. Assumes first value is eval_loss and + second value is accuracy_top_1. + time_callback: Time tracking callback likely used during keras.fit. + + Returns: + Dictionary of normalized results. + """ + stats = {} + if loss: + stats["loss"] = loss + + if eval_result: + stats["eval_loss"] = eval_result[0] + stats["eval_hit_rate"] = eval_result[1] + + if time_callback: + timestamp_log = time_callback.timestamp_log + stats["step_timestamp_log"] = timestamp_log + stats["train_finish_time"] = time_callback.train_finish_time + if len(timestamp_log) > 1: + stats["avg_exp_per_second"] = ( + time_callback.batch_size * time_callback.log_steps * + (len(time_callback.timestamp_log)-1) / + (timestamp_log[-1].timestamp - timestamp_log[0].timestamp)) + + return stats + + +def main(_): + with logger.benchmark_context(FLAGS), \ + mlperf_helper.LOGGER(FLAGS.output_ml_perf_compliance_logging): + mlperf_helper.set_ncf_root(os.path.split(os.path.abspath(__file__))[0]) + run_ncf(FLAGS) + + +if __name__ == "__main__": + ncf_common.define_ncf_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_test.py new file mode 100644 index 0000000..03e0ee1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/ncf_test.py @@ -0,0 +1,255 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests NCF.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import unittest + +import numpy as np +import tensorflow as tf +from tensorflow.python.eager import context # pylint: disable=ungrouped-imports +from official.recommendation import constants as rconst +from official.recommendation import data_pipeline +from official.recommendation import ncf_common +from official.recommendation import ncf_keras_main +from official.recommendation import neumf_model +from official.utils.misc import keras_utils +from official.utils.testing import integration + + +NUM_TRAIN_NEG = 4 + + +class NcfTest(tf.test.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(NcfTest, cls).setUpClass() + ncf_common.define_ncf_flags() + + def setUp(self): + self.top_k_old = rconst.TOP_K + self.num_eval_negatives_old = rconst.NUM_EVAL_NEGATIVES + rconst.NUM_EVAL_NEGATIVES = 2 + + def tearDown(self): + rconst.NUM_EVAL_NEGATIVES = self.num_eval_negatives_old + rconst.TOP_K = self.top_k_old + + @unittest.skipIf(keras_utils.is_v2_0(), "TODO(b/136018594)") + def get_hit_rate_and_ndcg(self, predicted_scores_by_user, items_by_user, + top_k=rconst.TOP_K, match_mlperf=False): + rconst.TOP_K = top_k + rconst.NUM_EVAL_NEGATIVES = predicted_scores_by_user.shape[1] - 1 + batch_size = items_by_user.shape[0] + + users = np.repeat(np.arange(batch_size)[:, np.newaxis], + rconst.NUM_EVAL_NEGATIVES + 1, axis=1) + users, items, duplicate_mask = \ + data_pipeline.BaseDataConstructor._assemble_eval_batch( + users, items_by_user[:, -1:], items_by_user[:, :-1], batch_size) + + g = tf.Graph() + with g.as_default(): + logits = tf.convert_to_tensor( + predicted_scores_by_user.reshape((-1, 1)), tf.float32) + softmax_logits = tf.concat([tf.zeros(logits.shape, dtype=logits.dtype), + logits], axis=1) + duplicate_mask = tf.convert_to_tensor(duplicate_mask, tf.float32) + + metric_ops = neumf_model._get_estimator_spec_with_metrics( + logits=logits, softmax_logits=softmax_logits, + duplicate_mask=duplicate_mask, num_training_neg=NUM_TRAIN_NEG, + match_mlperf=match_mlperf).eval_metric_ops + + hr = metric_ops[rconst.HR_KEY] + ndcg = metric_ops[rconst.NDCG_KEY] + + init = [tf.compat.v1.global_variables_initializer(), + tf.compat.v1.local_variables_initializer()] + + with self.session(graph=g) as sess: + sess.run(init) + return sess.run([hr[1], ndcg[1]]) + + def test_hit_rate_and_ndcg(self): + # Test with no duplicate items + predictions = np.array([ + [2., 0., 1.], # In top 2 + [1., 0., 2.], # In top 1 + [2., 1., 0.], # In top 3 + [3., 4., 2.] # In top 3 + ]) + items = np.array([ + [2, 3, 1], + [3, 1, 2], + [2, 1, 3], + [1, 3, 2], + ]) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 1) + self.assertAlmostEqual(hr, 1 / 4) + self.assertAlmostEqual(ndcg, 1 / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 2) + self.assertAlmostEqual(hr, 2 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 3) + self.assertAlmostEqual(hr, 4 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3) + + 2 * math.log(2) / math.log(4)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 1, + match_mlperf=True) + self.assertAlmostEqual(hr, 1 / 4) + self.assertAlmostEqual(ndcg, 1 / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 2, + match_mlperf=True) + self.assertAlmostEqual(hr, 2 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 3, + match_mlperf=True) + self.assertAlmostEqual(hr, 4 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3) + + 2 * math.log(2) / math.log(4)) / 4) + + # Test with duplicate items. In the MLPerf case, we treat the duplicates as + # a single item. Otherwise, we treat the duplicates as separate items. + predictions = np.array([ + [2., 2., 3., 1.], # In top 4. MLPerf: In top 3 + [1., 0., 2., 3.], # In top 1. MLPerf: In top 1 + [2., 3., 2., 0.], # In top 4. MLPerf: In top 3 + [2., 4., 2., 3.] # In top 2. MLPerf: In top 2 + ]) + items = np.array([ + [2, 2, 3, 1], + [2, 3, 4, 1], + [2, 3, 2, 1], + [3, 2, 1, 4], + ]) + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 1) + self.assertAlmostEqual(hr, 1 / 4) + self.assertAlmostEqual(ndcg, 1 / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 2) + self.assertAlmostEqual(hr, 2 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 3) + self.assertAlmostEqual(hr, 2 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 4) + self.assertAlmostEqual(hr, 4 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3) + + 2 * math.log(2) / math.log(5)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 1, + match_mlperf=True) + self.assertAlmostEqual(hr, 1 / 4) + self.assertAlmostEqual(ndcg, 1 / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 2, + match_mlperf=True) + self.assertAlmostEqual(hr, 2 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 3, + match_mlperf=True) + self.assertAlmostEqual(hr, 4 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3) + + 2 * math.log(2) / math.log(4)) / 4) + + hr, ndcg = self.get_hit_rate_and_ndcg(predictions, items, 4, + match_mlperf=True) + self.assertAlmostEqual(hr, 4 / 4) + self.assertAlmostEqual(ndcg, (1 + math.log(2) / math.log(3) + + 2 * math.log(2) / math.log(4)) / 4) + + _BASE_END_TO_END_FLAGS = ['-batch_size', '1044', '-train_epochs', '1'] + + @unittest.mock.patch.object(rconst, "SYNTHETIC_BATCHES_PER_EPOCH", 100) + def test_end_to_end_keras_no_dist_strat(self): + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=self._BASE_END_TO_END_FLAGS + + ['-distribution_strategy', 'off']) + + @unittest.mock.patch.object(rconst, "SYNTHETIC_BATCHES_PER_EPOCH", 100) + @unittest.skipUnless(keras_utils.is_v2_0(), 'TF 2.0 only test.') + def test_end_to_end_keras_dist_strat(self): + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=self._BASE_END_TO_END_FLAGS + ['-num_gpus', '0']) + + @unittest.mock.patch.object(rconst, "SYNTHETIC_BATCHES_PER_EPOCH", 100) + @unittest.skipUnless(keras_utils.is_v2_0(), 'TF 2.0 only test.') + def test_end_to_end_keras_dist_strat_ctl(self): + flags = (self._BASE_END_TO_END_FLAGS + + ['-num_gpus', '0'] + + ['-keras_use_ctl', 'True']) + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=flags) + + @unittest.mock.patch.object(rconst, "SYNTHETIC_BATCHES_PER_EPOCH", 100) + @unittest.skipUnless(keras_utils.is_v2_0(), 'TF 2.0 only test.') + def test_end_to_end_keras_1_gpu_dist_strat_fp16(self): + if context.num_gpus() < 1: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(1, context.num_gpus())) + + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=self._BASE_END_TO_END_FLAGS + ['-num_gpus', '1', + '--dtype', 'fp16']) + + @unittest.mock.patch.object(rconst, "SYNTHETIC_BATCHES_PER_EPOCH", 100) + @unittest.skipUnless(keras_utils.is_v2_0(), 'TF 2.0 only test.') + def test_end_to_end_keras_1_gpu_dist_strat_ctl_fp16(self): + if context.num_gpus() < 1: + self.skipTest( + '{} GPUs are not available for this test. {} GPUs are available'. + format(1, context.num_gpus())) + + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=self._BASE_END_TO_END_FLAGS + ['-num_gpus', '1', + '--dtype', 'fp16', + '--keras_use_ctl']) + + @unittest.mock.patch.object(rconst, 'SYNTHETIC_BATCHES_PER_EPOCH', 100) + @unittest.skipUnless(keras_utils.is_v2_0(), 'TF 2.0 only test.') + def test_end_to_end_keras_2_gpu_fp16(self): + if context.num_gpus() < 2: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(2, context.num_gpus())) + + integration.run_synthetic( + ncf_keras_main.main, tmp_root=self.get_temp_dir(), + extra_flags=self._BASE_END_TO_END_FLAGS + ['-num_gpus', '2', + '--dtype', 'fp16']) + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/neumf_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/neumf_model.py new file mode 100644 index 0000000..7c561b2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/neumf_model.py @@ -0,0 +1,457 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Defines NeuMF model for NCF framework. + +Some abbreviations used in the code base: +NeuMF: Neural Matrix Factorization +NCF: Neural Collaborative Filtering +GMF: Generalized Matrix Factorization +MLP: Multi-Layer Perceptron + +GMF applies a linear kernel to model the latent feature interactions, and MLP +uses a nonlinear kernel to learn the interaction function from data. NeuMF model +is a fused model of GMF and MLP to better model the complex user-item +interactions, and unifies the strengths of linearity of MF and non-linearity of +MLP for modeling the user-item latent structures. + +In NeuMF model, it allows GMF and MLP to learn separate embeddings, and combine +the two models by concatenating their last hidden layer. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys + +from six.moves import xrange # pylint: disable=redefined-builtin +import tensorflow as tf + +from official.recommendation import constants as rconst +from official.recommendation import movielens +from official.recommendation import ncf_common +from official.recommendation import stat_utils +from official.utils.logs import mlperf_helper + + +def sparse_to_dense_grads(grads_and_vars): + """Convert sparse gradients to dense gradients. + + All sparse gradients, which are represented as instances of tf.IndexedSlices, + are converted to dense Tensors. Dense gradients, which are represents as + Tensors, are unchanged. + + The purpose of this conversion is that for small embeddings, which are used by + this model, applying dense gradients with the AdamOptimizer is faster than + applying sparse gradients. + + Args + grads_and_vars: A list of (gradient, variable) tuples. Each gradient can + be a Tensor or an IndexedSlices. Tensors are unchanged, and IndexedSlices + are converted to dense Tensors. + Returns: + The same list of (gradient, variable) as `grads_and_vars`, except each + IndexedSlices gradient is converted to a Tensor. + """ + + # Calling convert_to_tensor changes IndexedSlices into Tensors, and leaves + # Tensors unchanged. + return [(tf.convert_to_tensor(g), v) for g, v in grads_and_vars] + + +def neumf_model_fn(features, labels, mode, params): + """Model Function for NeuMF estimator.""" + if params.get("use_seed"): + tf.set_random_seed(stat_utils.random_int32()) + + users = features[movielens.USER_COLUMN] + items = features[movielens.ITEM_COLUMN] + + user_input = tf.keras.layers.Input(tensor=users) + item_input = tf.keras.layers.Input(tensor=items) + logits = construct_model(user_input, item_input, params).output + + # Softmax with the first column of zeros is equivalent to sigmoid. + softmax_logits = ncf_common.convert_to_softmax_logits(logits) + + if mode == tf.estimator.ModeKeys.EVAL: + duplicate_mask = tf.cast(features[rconst.DUPLICATE_MASK], tf.float32) + return _get_estimator_spec_with_metrics( + logits, + softmax_logits, + duplicate_mask, + params["num_neg"], + params["match_mlperf"], + use_tpu_spec=params["use_tpu"]) + + elif mode == tf.estimator.ModeKeys.TRAIN: + labels = tf.cast(labels, tf.int32) + valid_pt_mask = features[rconst.VALID_POINT_MASK] + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.OPT_NAME, value="adam") + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.OPT_LR, + value=params["learning_rate"]) + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.OPT_HP_ADAM_BETA1, + value=params["beta1"]) + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.OPT_HP_ADAM_BETA2, + value=params["beta2"]) + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.OPT_HP_ADAM_EPSILON, + value=params["epsilon"]) + + optimizer = tf.compat.v1.train.AdamOptimizer( + learning_rate=params["learning_rate"], + beta1=params["beta1"], + beta2=params["beta2"], + epsilon=params["epsilon"]) + if params["use_tpu"]: + optimizer = tf.compat.v1.tpu.CrossShardOptimizer(optimizer) + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.MODEL_HP_LOSS_FN, + value=mlperf_helper.TAGS.BCE) + + loss = tf.compat.v1.losses.sparse_softmax_cross_entropy( + labels=labels, + logits=softmax_logits, + weights=tf.cast(valid_pt_mask, tf.float32) + ) + + # This tensor is used by logging hooks. + tf.identity(loss, name="cross_entropy") + + global_step = tf.compat.v1.train.get_global_step() + tvars = tf.compat.v1.trainable_variables() + gradients = optimizer.compute_gradients( + loss, tvars, colocate_gradients_with_ops=True) + gradients = sparse_to_dense_grads(gradients) + minimize_op = optimizer.apply_gradients( + gradients, global_step=global_step, name="train") + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + train_op = tf.group(minimize_op, update_ops) + + return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) + + else: + raise NotImplementedError + + +def _strip_first_and_last_dimension(x, batch_size): + return tf.reshape(x[0, :], (batch_size,)) + + +def construct_model(user_input, item_input, params): + # type: (tf.Tensor, tf.Tensor, dict) -> tf.keras.Model + """Initialize NeuMF model. + + Args: + user_input: keras input layer for users + item_input: keras input layer for items + params: Dict of hyperparameters. + Raises: + ValueError: if the first model layer is not even. + Returns: + model: a keras Model for computing the logits + """ + num_users = params["num_users"] + num_items = params["num_items"] + + model_layers = params["model_layers"] + + mf_regularization = params["mf_regularization"] + mlp_reg_layers = params["mlp_reg_layers"] + + mf_dim = params["mf_dim"] + + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.MODEL_HP_MF_DIM, value=mf_dim) + mlperf_helper.ncf_print(key=mlperf_helper.TAGS.MODEL_HP_MLP_LAYER_SIZES, + value=model_layers) + + if model_layers[0] % 2 != 0: + raise ValueError("The first layer size should be multiple of 2!") + + # Initializer for embedding layers + embedding_initializer = "glorot_uniform" + + def mf_slice_fn(x): + x = tf.squeeze(x, [1]) + return x[:, :mf_dim] + + def mlp_slice_fn(x): + x = tf.squeeze(x, [1]) + return x[:, mf_dim:] + + # It turns out to be significantly more effecient to store the MF and MLP + # embedding portions in the same table, and then slice as needed. + embedding_user = tf.keras.layers.Embedding( + num_users, + mf_dim + model_layers[0] // 2, + embeddings_initializer=embedding_initializer, + embeddings_regularizer=tf.keras.regularizers.l2(mf_regularization), + input_length=1, + name="embedding_user")( + user_input) + + embedding_item = tf.keras.layers.Embedding( + num_items, + mf_dim + model_layers[0] // 2, + embeddings_initializer=embedding_initializer, + embeddings_regularizer=tf.keras.regularizers.l2(mf_regularization), + input_length=1, + name="embedding_item")( + item_input) + + # GMF part + mf_user_latent = tf.keras.layers.Lambda( + mf_slice_fn, name="embedding_user_mf")(embedding_user) + mf_item_latent = tf.keras.layers.Lambda( + mf_slice_fn, name="embedding_item_mf")(embedding_item) + + # MLP part + mlp_user_latent = tf.keras.layers.Lambda( + mlp_slice_fn, name="embedding_user_mlp")(embedding_user) + mlp_item_latent = tf.keras.layers.Lambda( + mlp_slice_fn, name="embedding_item_mlp")(embedding_item) + + # Element-wise multiply + mf_vector = tf.keras.layers.multiply([mf_user_latent, mf_item_latent]) + + # Concatenation of two latent features + mlp_vector = tf.keras.layers.concatenate([mlp_user_latent, mlp_item_latent]) + + num_layer = len(model_layers) # Number of layers in the MLP + for layer in xrange(1, num_layer): + model_layer = tf.keras.layers.Dense( + model_layers[layer], + kernel_regularizer=tf.keras.regularizers.l2(mlp_reg_layers[layer]), + activation="relu") + mlp_vector = model_layer(mlp_vector) + + # Concatenate GMF and MLP parts + predict_vector = tf.keras.layers.concatenate([mf_vector, mlp_vector]) + + # Final prediction layer + logits = tf.keras.layers.Dense( + 1, activation=None, kernel_initializer="lecun_uniform", + name=movielens.RATING_COLUMN)(predict_vector) + + # Print model topology. + model = tf.keras.models.Model([user_input, item_input], logits) + model.summary() + sys.stdout.flush() + + return model + + +def _get_estimator_spec_with_metrics(logits, # type: tf.Tensor + softmax_logits, # type: tf.Tensor + duplicate_mask, # type: tf.Tensor + num_training_neg, # type: int + match_mlperf=False, # type: bool + use_tpu_spec=False # type: bool + ): + """Returns a EstimatorSpec that includes the metrics.""" + cross_entropy, \ + metric_fn, \ + in_top_k, \ + ndcg, \ + metric_weights = compute_eval_loss_and_metrics_helper( + logits, + softmax_logits, + duplicate_mask, + num_training_neg, + match_mlperf) + + if use_tpu_spec: + return tf.estimator.tpu.TPUEstimatorSpec( + mode=tf.estimator.ModeKeys.EVAL, + loss=cross_entropy, + eval_metrics=(metric_fn, [in_top_k, ndcg, metric_weights])) + + return tf.estimator.EstimatorSpec( + mode=tf.estimator.ModeKeys.EVAL, + loss=cross_entropy, + eval_metric_ops=metric_fn(in_top_k, ndcg, metric_weights) + ) + + +def compute_eval_loss_and_metrics_helper( + logits, # type: tf.Tensor + softmax_logits, # type: tf.Tensor + duplicate_mask, # type: tf.Tensor + num_training_neg, # type: int + match_mlperf=False # type: bool +): + """Model evaluation with HR and NDCG metrics. + + The evaluation protocol is to rank the test interacted item (truth items) + among the randomly chosen 999 items that are not interacted by the user. + The performance of the ranked list is judged by Hit Ratio (HR) and Normalized + Discounted Cumulative Gain (NDCG). + + For evaluation, the ranked list is truncated at 10 for both metrics. As such, + the HR intuitively measures whether the test item is present on the top-10 + list, and the NDCG accounts for the position of the hit by assigning higher + scores to hits at top ranks. Both metrics are calculated for each test user, + and the average scores are reported. + + If `match_mlperf` is True, then the HR and NDCG computations are done in a + slightly unusual way to match the MLPerf reference implementation. + Specifically, if the evaluation negatives contain duplicate items, it will be + treated as if the item only appeared once. Effectively, for duplicate items in + a row, the predicted score for all but one of the items will be set to + -infinity + + For example, suppose we have that following inputs: + logits_by_user: [[ 2, 3, 3], + [ 5, 4, 4]] + + items_by_user: [[10, 20, 20], + [30, 40, 40]] + + # Note: items_by_user is not explicitly present. Instead the relevant \ + information is contained within `duplicate_mask` + + top_k: 2 + + Then with match_mlperf=True, the HR would be 2/2 = 1.0. With + match_mlperf=False, the HR would be 1/2 = 0.5. This is because each user has + predicted scores for only 2 unique items: 10 and 20 for the first user, and 30 + and 40 for the second. Therefore, with match_mlperf=True, it's guaranteed the + first item's score is in the top 2. With match_mlperf=False, this function + would compute the first user's first item is not in the top 2, because item 20 + has a higher score, and item 20 occurs twice. + + Args: + logits: A tensor containing the predicted logits for each user. The shape + of logits is (num_users_per_batch * (1 + NUM_EVAL_NEGATIVES),) Logits + for a user are grouped, and the last element of the group is the true + element. + + softmax_logits: The same tensor, but with zeros left-appended. + + duplicate_mask: A vector with the same shape as logits, with a value of 1 + if the item corresponding to the logit at that position has already + appeared for that user. + + num_training_neg: The number of negatives per positive during training. + + match_mlperf: Use the MLPerf reference convention for computing rank. + + Returns: + cross_entropy: the loss + metric_fn: the metrics function + in_top_k: hit rate metric + ndcg: ndcg metric + metric_weights: metric weights + """ + in_top_k, ndcg, metric_weights, logits_by_user = compute_top_k_and_ndcg( + logits, duplicate_mask, match_mlperf) + + # Examples are provided by the eval Dataset in a structured format, so eval + # labels can be reconstructed on the fly. + eval_labels = tf.reshape(shape=(-1,), tensor=tf.one_hot( + tf.zeros(shape=(logits_by_user.shape[0],), dtype=tf.int32) + + rconst.NUM_EVAL_NEGATIVES, logits_by_user.shape[1], dtype=tf.int32)) + + eval_labels_float = tf.cast(eval_labels, tf.float32) + + # During evaluation, the ratio of negatives to positives is much higher + # than during training. (Typically 999 to 1 vs. 4 to 1) By adjusting the + # weights for the negative examples we compute a loss which is consistent with + # the training data. (And provides apples-to-apples comparison) + negative_scale_factor = num_training_neg / rconst.NUM_EVAL_NEGATIVES + example_weights = ( + (eval_labels_float + (1 - eval_labels_float) * negative_scale_factor) * + (1 + rconst.NUM_EVAL_NEGATIVES) / (1 + num_training_neg)) + + # Tile metric weights back to logit dimensions + expanded_metric_weights = tf.reshape(tf.tile( + metric_weights[:, tf.newaxis], (1, rconst.NUM_EVAL_NEGATIVES + 1)), (-1,)) + + # ignore padded examples + example_weights *= tf.cast(expanded_metric_weights, tf.float32) + + cross_entropy = tf.compat.v1.losses.sparse_softmax_cross_entropy( + logits=softmax_logits, labels=eval_labels, weights=example_weights) + + def metric_fn(top_k_tensor, ndcg_tensor, weight_tensor): + return { + rconst.HR_KEY: tf.compat.v1.metrics.mean(top_k_tensor, + weights=weight_tensor, + name=rconst.HR_METRIC_NAME), + rconst.NDCG_KEY: tf.compat.v1.metrics.mean(ndcg_tensor, + weights=weight_tensor, + name=rconst.NDCG_METRIC_NAME) + } + + return cross_entropy, metric_fn, in_top_k, ndcg, metric_weights + + +def compute_top_k_and_ndcg(logits, # type: tf.Tensor + duplicate_mask, # type: tf.Tensor + match_mlperf=False # type: bool + ): + """Compute inputs of metric calculation. + + Args: + logits: A tensor containing the predicted logits for each user. The shape + of logits is (num_users_per_batch * (1 + NUM_EVAL_NEGATIVES),) Logits + for a user are grouped, and the first element of the group is the true + element. + duplicate_mask: A vector with the same shape as logits, with a value of 1 + if the item corresponding to the logit at that position has already + appeared for that user. + match_mlperf: Use the MLPerf reference convention for computing rank. + + Returns: + is_top_k, ndcg and weights, all of which has size (num_users_in_batch,), and + logits_by_user which has size + (num_users_in_batch, (rconst.NUM_EVAL_NEGATIVES + 1)). + """ + logits_by_user = tf.reshape(logits, (-1, rconst.NUM_EVAL_NEGATIVES + 1)) + duplicate_mask_by_user = tf.cast( + tf.reshape(duplicate_mask, (-1, rconst.NUM_EVAL_NEGATIVES + 1)), + logits_by_user.dtype) + + if match_mlperf: + # Set duplicate logits to the min value for that dtype. The MLPerf + # reference dedupes during evaluation. + logits_by_user *= (1 - duplicate_mask_by_user) + logits_by_user += duplicate_mask_by_user * logits_by_user.dtype.min + + # Determine the location of the first element in each row after the elements + # are sorted. + sort_indices = tf.argsort( + logits_by_user, axis=1, direction="DESCENDING") + + # Use matrix multiplication to extract the position of the true item from the + # tensor of sorted indices. This approach is chosen because both GPUs and TPUs + # perform matrix multiplications very quickly. This is similar to np.argwhere. + # However this is a special case because the target will only appear in + # sort_indices once. + one_hot_position = tf.cast(tf.equal(sort_indices, rconst.NUM_EVAL_NEGATIVES), + tf.int32) + sparse_positions = tf.multiply( + one_hot_position, tf.range(logits_by_user.shape[1])[tf.newaxis, :]) + position_vector = tf.reduce_sum(sparse_positions, axis=1) + + in_top_k = tf.cast(tf.less(position_vector, rconst.TOP_K), tf.float32) + ndcg = tf.math.log(2.) / tf.math.log( + tf.cast(position_vector, tf.float32) + 2) + ndcg *= in_top_k + + # If a row is a padded row, all but the first element will be a duplicate. + metric_weights = tf.not_equal(tf.reduce_sum(duplicate_mask_by_user, axis=1), + rconst.NUM_EVAL_NEGATIVES) + + return in_top_k, ndcg, metric_weights, logits_by_user diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/popen_helper.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/popen_helper.py new file mode 100644 index 0000000..dcdca4c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/popen_helper.py @@ -0,0 +1,64 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper file for running the async data generation process in OSS.""" + +import contextlib +import multiprocessing +import multiprocessing.pool + + +def get_forkpool(num_workers, init_worker=None, closing=True): + pool = multiprocessing.Pool(processes=num_workers, initializer=init_worker) + return contextlib.closing(pool) if closing else pool + + +def get_threadpool(num_workers, init_worker=None, closing=True): + pool = multiprocessing.pool.ThreadPool(processes=num_workers, + initializer=init_worker) + return contextlib.closing(pool) if closing else pool + + +class FauxPool(object): + """Mimic a pool using for loops. + + This class is used in place of proper pools when true determinism is desired + for testing or debugging. + """ + def __init__(self, *args, **kwargs): + pass + + def map(self, func, iterable, chunksize=None): + return [func(i) for i in iterable] + + def imap(self, func, iterable, chunksize=1): + for i in iterable: + yield func(i) + + def close(self): + pass + + def terminate(self): + pass + + def join(self): + pass + +def get_fauxpool(num_workers, init_worker=None, closing=True): + pool = FauxPool(processes=num_workers, initializer=init_worker) + return contextlib.closing(pool) if closing else pool + + +def worker_job(): + return "worker" diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/stat_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/stat_utils.py new file mode 100644 index 0000000..658a272 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/recommendation/stat_utils.py @@ -0,0 +1,92 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Statistics utility functions of NCF.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +import numpy as np + + +def random_int32(): + return np.random.randint(low=0, high=np.iinfo(np.int32).max, dtype=np.int32) + + +def permutation(args): + """Fork safe permutation function. + + This function can be called within a multiprocessing worker and give + appropriately random results. + + Args: + args: A size two tuple that will unpacked into the size of the permutation + and the random seed. This form is used because starmap is not universally + available. + + returns: + A NumPy array containing a random permutation. + """ + x, seed = args + + # If seed is None NumPy will seed randomly. + state = np.random.RandomState(seed=seed) # pylint: disable=no-member + output = np.arange(x, dtype=np.int32) + state.shuffle(output) + return output + + +def very_slightly_biased_randint(max_val_vector): + sample_dtype = np.uint64 + out_dtype = max_val_vector.dtype + samples = np.random.randint(low=0, high=np.iinfo(sample_dtype).max, + size=max_val_vector.shape, dtype=sample_dtype) + return np.mod(samples, max_val_vector.astype(sample_dtype)).astype(out_dtype) + + +def mask_duplicates(x, axis=1): # type: (np.ndarray, int) -> np.ndarray + """Identify duplicates from sampling with replacement. + + Args: + x: A 2D NumPy array of samples + axis: The axis along which to de-dupe. + + Returns: + A NumPy array with the same shape as x with one if an element appeared + previously along axis 1, else zero. + """ + if axis != 1: + raise NotImplementedError + + x_sort_ind = np.argsort(x, axis=1, kind="mergesort") + sorted_x = x[np.arange(x.shape[0])[:, np.newaxis], x_sort_ind] + + # compute the indices needed to map values back to their original position. + inv_x_sort_ind = np.argsort(x_sort_ind, axis=1, kind="mergesort") + + # Compute the difference of adjacent sorted elements. + diffs = sorted_x[:, :-1] - sorted_x[:, 1:] + + # We are only interested in whether an element is zero. Therefore left padding + # with ones to restore the original shape is sufficient. + diffs = np.concatenate( + [np.ones((diffs.shape[0], 1), dtype=diffs.dtype), diffs], axis=1) + + # Duplicate values will have a difference of zero. By definition the first + # element is never a duplicate. + return np.where(diffs[np.arange(x.shape[0])[:, np.newaxis], + inv_x_sort_ind], 0, 1) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/requirements.txt b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/requirements.txt new file mode 100644 index 0000000..4b0c214 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/requirements.txt @@ -0,0 +1,25 @@ +six +google-api-python-client>=1.6.7 +google-cloud-bigquery>=0.31.0 +kaggle>=1.3.9 +mlperf_compliance==0.0.10 +numpy>=1.15.4 +oauth2client>=4.1.2 +pandas>=0.22.0 +psutil>=5.4.3 +py-cpuinfo>=3.3.0 +scipy>=0.19.1 +tensorflow-hub>=0.6.0 +tensorflow-model-optimization>=0.2.1 +tensorflow-datasets +tensorflow-addons +dataclasses +gin-config +typing +sentencepiece +Cython +matplotlib +opencv-python-headless +pyyaml +Pillow +-e git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller.py new file mode 100644 index 0000000..a07be66 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller.py @@ -0,0 +1,337 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A light weight utilities to train TF2 models.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import time + +from absl import logging + +import tensorflow.compat.v2 as tf +from typing import Callable, Dict, Optional, Text + +from official.staging.training import utils + + +class Controller(object): + """Class that facilitates training and evaluation of models.""" + + def __init__( + self, + strategy: Optional[tf.distribute.Strategy] = None, + train_fn: Optional[Callable[[tf.Tensor], + Optional[Dict[Text, tf.Tensor]]]] = None, + eval_fn: Optional[Callable[[tf.Tensor], + Optional[Dict[Text, tf.Tensor]]]] = None, + global_step: Optional[tf.Variable] = None, + # Train related + train_steps: Optional[int] = None, + steps_per_loop: Optional[int] = None, + summary_dir: Optional[Text] = None, + checkpoint_manager: Optional[tf.train.CheckpointManager] = None, + # summary related + summary_interval: Optional[int] = None, + # Evaluation related + eval_summary_dir: Optional[Text] = None, + eval_steps: Optional[int] = None, + eval_interval: Optional[int] = None): + """Constructs a `Controller` instance. + + Args: + strategy: An instance of `tf.distribute.Strategy`. + train_fn: A callable defined as `def train_fn(num_steps)`, which + `num_steps` indicates the number of steps to run for each loop. + eval_fn: A callable defined as `def eval_fn(num_steps)`, which `num_steps` + indicates the number of steps for one evaluation. + global_step: An integer `tf.Variable` indicating the global training step + number. Usually this can be obtained from `iterations` property of the + model's optimizer (e.g. `self.optimizer.iterations`), or users can + create their own global step variable as well. If the users create their + own global step variable, it is recommended to create the `tf.Variable` + inside strategy scope, and with + `aggregation=tf.VariableAggregation.ONLY_FIRST_REPLICA`. + train_steps: The total (maximum) number of training steps to perform. + steps_per_loop: The number of steps to run in each "inner loop" of + training (passed to the `num_steps` parameter of `train_fn`). + summary_dir: The directory to restore and write checkpoints and summaries. + If None, it will be set to `checkpoint_manager.directory`. + checkpoint_manager: An instance of `tf.train.CheckpointManager`. + summary_interval: Step interval for training summaries. Note that this + argument only applies to the summaries outside the training loop. If the + value is None, then training summaries are not enabled. + eval_summary_dir: The directory to write eval summaries. If None, it will + be set to `summary_dir`. + eval_steps: Number of steps to run evaluation. + eval_interval: Step interval for evaluation. If None, will skip evaluation + in the middle of training. Note that evaluation only happens outside the + training loop, which the loop iteration is specify by `steps_per_loop` + parameter. + + Raises: + ValueError: If both `train_fn` and `eval_fn` are None. + ValueError: If `train_fn` is not None and `train_steps` is None. + ValueError: If `steps_per_loop` is None when `train_fn` is provided. + ValueError: If `steps_per_loop` is not a positive integer. + """ + if train_fn is None and eval_fn is None: + raise ValueError("`train_fn` and `eval_fn` should not both be None") + + # TODO(rxsang): Support training until exhaustion by passing + # `train_steps=-1`. Currently it cannot be supported with a host training + # loop because break statements are not supported with distributed dataset. + if train_fn is not None: + if train_steps is None: + raise ValueError("`train_steps` is required when `train_fn` is " + "provided.") + if steps_per_loop is None: + raise ValueError("`steps_per_loop` is required when `train_fn is " + "provided.") + if not isinstance(steps_per_loop, int) or steps_per_loop < 1: + raise ValueError("`steps_per_loop` should be a positive integer") + if summary_interval is not None and summary_interval <= 0: + raise ValueError("`summary_interval` should be larger than 0") + + self.strategy = strategy or tf.distribute.get_strategy() + + self.train_fn = train_fn + self.eval_fn = eval_fn + self.global_step = global_step + self.checkpoint_manager = checkpoint_manager + + if self.train_fn is not None: + self.train_steps = train_steps + self.steps_per_loop = steps_per_loop + if summary_dir: + self.summary_dir = summary_dir + elif checkpoint_manager: + self.summary_dir = checkpoint_manager.directory + else: + self.summary_dir = None + + self.summary_interval = summary_interval + if self.summary_dir and self.summary_interval: + summary_writer = tf.summary.create_file_writer(self.summary_dir) + else: + summary_writer = None + # TODO(rxsang): Consider pass SummaryManager directly into Controller for + # maximum customizability. + self.summary_manager = utils.SummaryManager( + summary_writer, + tf.summary.scalar, + global_step=self.global_step, + summary_interval=self.summary_interval) + + if self.eval_fn is not None: + eval_summary_dir = eval_summary_dir or self.summary_dir + eval_summary_writer = tf.summary.create_file_writer( + eval_summary_dir) if eval_summary_dir else None + self.eval_summary_manager = utils.SummaryManager( + eval_summary_writer, tf.summary.scalar, global_step=self.global_step) + + self.eval_steps = eval_steps + self.eval_interval = eval_interval + + # Creates and initializes the interval triggers. + self.eval_trigger = utils.IntervalTrigger(self.eval_interval, + self.global_step.numpy()) # pytype: disable=attribute-error + + if self.global_step: + tf.summary.experimental.set_step(self.global_step) + + # Restores the model if needed. + if self.checkpoint_manager is not None: + model_restored = self._restore_model() + if not model_restored and self.checkpoint_manager.checkpoint_interval: + # If the model is not restored from a checkpoint, save an initial + # checkpoint. + ckpt_path = self.checkpoint_manager.save( + checkpoint_number=self.global_step) + logging.info("Saved checkpoins in %s", ckpt_path) + + def _restore_model(self, checkpoint_path=None): + """Restore or initialize the model. + + Args: + checkpoint_path: An optional string indicates the checkpoint path to + restore. If None, will restore from `self.checkpoint_manager`. + + Returns: + True if the latest checkpoint is found or restored. Otherwise False. + """ + with self.strategy.scope(): + # Checkpoint restoring should be inside scope. b/139450638 + if checkpoint_path is not None: + self.checkpoint_manager.checkpoint.restore(checkpoint_path) + return True + return self.checkpoint_manager.restore_or_initialize() + + def _evaluate_once(self, current_step): + """Runs the evaluation once.""" + logging.info("Start evaluation at step: %s", current_step) + + with self.eval_summary_manager.summary_writer.as_default(): + eval_outputs = self.eval_fn(self.eval_steps) + + if eval_outputs: + eval_outputs = tf.nest.map_structure(lambda x: x.numpy(), eval_outputs) + + info = "step: {} evaluation metric: {}".format( + current_step, eval_outputs) + self._log_info(info) + + self.eval_summary_manager.write_summaries(eval_outputs) + self.eval_summary_manager.flush() + + def _maybe_save_checkpoints(self, current_step, force_trigger=False): + if self.checkpoint_manager and self.checkpoint_manager.checkpoint_interval: + ckpt_path = self.checkpoint_manager.save( + checkpoint_number=current_step, check_interval=not force_trigger) + if ckpt_path is not None: + logging.info("Saved checkpoins in %s", ckpt_path) + + def _maybe_evaluate(self, current_step, force_trigger=False): + if self.eval_trigger(current_step, force_trigger): + self._evaluate_once(current_step) + + def _log_info(self, message): + """Logs `message` to the `info` log, and also prints to stdout.""" + logging.info(message) + print(message) + + def train(self, evaluate=True): + """Runs the training, with optional evaluation. + + This handles evaluation, gathering summaries, and saving checkpoints. + + Args: + evaluate: A boolean indicates whether to perform evaluation during + training. + + Raises: + RuntimeError: If `global_step` is not updated correctly in `train_fn`. + """ + if self.train_fn is None: + raise ValueError("`self.train_fn` is required when calling `train` " + "method.") + if self.global_step is None: + raise ValueError("`self.global_step` is required when calling `train` " + "method.") + if evaluate and self.eval_fn is None: + raise ValueError("`self.eval_fn` is required when calling `train` method " + "with `evaluate=True`") + + step_timer = _StepTimer(self.global_step) + current_step = self.global_step.numpy() + logging.info("Train at step %s of %s", current_step, self.train_steps) + while current_step < self.train_steps: + # Calculates steps to run for the next train loop. + steps_per_loop = min(self.train_steps - current_step, self.steps_per_loop) + logging.info("Entering training loop with %s steps, at step %s of %s", + steps_per_loop, current_step, self.train_steps) + current_step += steps_per_loop + steps_per_loop = tf.convert_to_tensor(steps_per_loop, dtype=tf.int32) + + with self.summary_manager.summary_writer.as_default(): + train_outputs = self.train_fn(steps_per_loop) + + # Updates and verifies the current step after a training loop finishes. + if current_step != self.global_step.numpy(): + raise RuntimeError("`self.train_fn` is not updating `global_step` " + "correctly, expected: %s, actual: %s" % + (current_step, self.global_step.numpy())) + + # Print information like metrics and steps_per_second after a training + # loop. + if train_outputs: + train_outputs = tf.nest.map_structure( + lambda x: x.numpy(), train_outputs) + steps_per_second = step_timer.steps_per_second() + info = "step: {} steps_per_second: {:.2f} {}".format( + current_step, steps_per_second, train_outputs) + self._log_info(info) + + train_outputs = train_outputs or {} + train_outputs["steps_per_second"] = steps_per_second + self.summary_manager.write_summaries(train_outputs) + + self._maybe_save_checkpoints(current_step) + + if evaluate: + self._maybe_evaluate(current_step) + + self.summary_manager.write_summaries(train_outputs, always_write=True) + self.summary_manager.flush() + self._maybe_save_checkpoints(current_step, force_trigger=True) + if evaluate: + self._maybe_evaluate(current_step, force_trigger=True) + + def evaluate(self, continuous=False, timeout_fn=None): + """Runs the evaluation. + + Args: + continuous: If `True`, will continously monitor the checkpoint directory + to evaluate on the latest checkpoint. If `False`, will do the evaluation + once. + timeout_fn: Optional callable to call after a timeout. If the function + returns True, then it means that no new checkpoints will be generated + and the iterator will exit. + + Raises: + ValueError: If no checkpoint found in `self.checkpoint_manager.directory`. + """ + if self.eval_fn is None: + raise ValueError("`self.eval_fn` should not be None to call " + "`evaluate()` method.") + + if not continuous and timeout_fn is not None: + raise ValueError("`timeout_fn` can be only passed when `continuous` is " + "True") + + if continuous: + for checkpoint_path in tf.train.checkpoints_iterator( + self.checkpoint_manager.directory, timeout_fn=timeout_fn): + self._restore_model(checkpoint_path) + self._evaluate_once(self.global_step.numpy()) + return + + latest_checkpoint = self.checkpoint_manager.latest_checkpoint + if not latest_checkpoint: + raise ValueError("no checkpoint found in dir %s" % + self.checkpoint_manager.directory) + self._restore_model() + self._evaluate_once(self.global_step.numpy()) + + +class _StepTimer(object): + """Utility class for measuring steps/second.""" + + def __init__(self, step): + self.step = step + self.start() + + def start(self): + self.last_iteration = self.step.numpy() + self.last_time = time.time() + + def steps_per_second(self, restart=True): + value = ((self.step.numpy() - self.last_iteration) / + (time.time() - self.last_time)) + if restart: + self.start() + return value diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller_test.py new file mode 100644 index 0000000..eeaa191 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/controller_test.py @@ -0,0 +1,308 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for official.staging.training.controller.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl.testing import parameterized +import numpy as np +import tensorflow as tf + +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +from official.staging.training import controller +from official.staging.training import standard_runnable + + +def all_strategy_combinations(): + """Gets combinations of distribution strategies.""" + return combinations.combine( + strategy=[ + strategy_combinations.one_device_strategy, + strategy_combinations.tpu_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.mirrored_strategy_with_gpu_and_cpu, + ], + mode="eager", + ) + + +def create_model(): + x = tf.keras.layers.Input(shape=(3,), name="input") + y = tf.keras.layers.Dense(4, name="dense")(x) + model = tf.keras.Model(x, y) + return model + + +def summaries_with_matching_keyword(keyword, summary_dir): + """Yields summary protos matching given keyword from event file.""" + event_paths = tf.io.gfile.glob(os.path.join(summary_dir, "events*")) + for event in tf.compat.v1.train.summary_iterator(event_paths[-1]): + if event.summary is not None: + for value in event.summary.value: + if keyword in value.tag: + tf.compat.v1.logging.error(event) + yield event.summary + + +def check_eventfile_for_keyword(keyword, summary_dir): + """Checks event files for the keyword.""" + return any(summaries_with_matching_keyword(keyword, summary_dir)) + + +def dataset_fn(ctx): + del ctx + inputs = np.zeros((10, 3), dtype=np.float32) + targets = np.zeros((10, 4), dtype=np.float32) + dataset = tf.data.Dataset.from_tensor_slices((inputs, targets)) + dataset = dataset.repeat(100) + dataset = dataset.batch(10, drop_remainder=True) + return dataset + + +class TestRunnable(standard_runnable.StandardTrainable, + standard_runnable.StandardEvaluable): + """Implements the training and evaluation APIs for the test model.""" + + def __init__(self): + standard_runnable.StandardTrainable.__init__(self) + standard_runnable.StandardEvaluable.__init__(self) + self.strategy = tf.distribute.get_strategy() + self.model = create_model() + self.optimizer = tf.keras.optimizers.RMSprop() + self.global_step = self.optimizer.iterations + self.train_loss = tf.keras.metrics.Mean("train_loss", dtype=tf.float32) + self.eval_loss = tf.keras.metrics.Mean("eval_loss", dtype=tf.float32) + + def build_train_dataset(self): + return self.strategy.experimental_distribute_datasets_from_function( + dataset_fn) + + def train_step(self, iterator): + + def _replicated_step(inputs): + """Replicated training step.""" + inputs, targets = inputs + with tf.GradientTape() as tape: + outputs = self.model(inputs) + loss = tf.math.reduce_sum(outputs - targets) + grads = tape.gradient(loss, self.model.variables) + self.optimizer.apply_gradients(zip(grads, self.model.variables)) + self.train_loss.update_state(loss) + + self.strategy.run(_replicated_step, args=(next(iterator),)) + + def train_loop_end(self): + return { + "loss": self.train_loss.result(), + } + + def build_eval_dataset(self): + return self.strategy.experimental_distribute_datasets_from_function( + dataset_fn) + + def eval_begin(self): + self.eval_loss.reset_states() + + def eval_step(self, iterator): + + def _replicated_step(inputs): + """Replicated evaluation step.""" + inputs, targets = inputs + outputs = self.model(inputs) + loss = tf.math.reduce_sum(outputs - targets) + self.eval_loss.update_state(loss) + + self.strategy.run(_replicated_step, args=(next(iterator),)) + + def eval_end(self): + return { + "eval_loss": self.eval_loss.result(), + } + + +class ControllerTest(tf.test.TestCase, parameterized.TestCase): + + def setUp(self): + super(ControllerTest, self).setUp() + self.model_dir = self.get_temp_dir() + + def test_no_checkpoint(self): + test_runnable = TestRunnable() + # No checkpoint manager and no strategy. + test_controller = controller.Controller( + train_fn=test_runnable.train, + eval_fn=test_runnable.evaluate, + global_step=test_runnable.global_step, + train_steps=10, + steps_per_loop=2, + summary_dir=os.path.join(self.model_dir, "summaries/train"), + summary_interval=2, + eval_summary_dir=os.path.join(self.model_dir, "summaries/eval"), + eval_steps=2, + eval_interval=5) + test_controller.train(evaluate=True) + self.assertEqual(test_runnable.global_step.numpy(), 10) + # Loss and accuracy values should be written into summaries. + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/train"))) + self.assertTrue( + check_eventfile_for_keyword( + "loss", os.path.join(self.model_dir, "summaries/train"))) + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/eval"))) + self.assertTrue( + check_eventfile_for_keyword( + "eval_loss", os.path.join(self.model_dir, "summaries/eval"))) + # No checkpoint, so global step starts from 0. + test_runnable.global_step.assign(0) + test_controller.train(evaluate=True) + self.assertEqual(test_runnable.global_step.numpy(), 10) + + def test_no_checkpoint_and_summaries(self): + test_runnable = TestRunnable() + # No checkpoint + summary directories. + test_controller = controller.Controller( + train_fn=test_runnable.train, + eval_fn=test_runnable.evaluate, + global_step=test_runnable.global_step, + train_steps=10, + steps_per_loop=2, + eval_steps=2, + eval_interval=5) + test_controller.train(evaluate=True) + self.assertEqual(test_runnable.global_step.numpy(), 10) + + @combinations.generate(all_strategy_combinations()) + def test_train_and_evaluate(self, strategy): + with strategy.scope(): + test_runnable = TestRunnable() + + checkpoint = tf.train.Checkpoint( + model=test_runnable.model, optimizer=test_runnable.optimizer) + checkpoint_manager = tf.train.CheckpointManager( + checkpoint, + self.model_dir, + max_to_keep=None, + step_counter=test_runnable.global_step, + checkpoint_interval=10) + test_controller = controller.Controller( + strategy=strategy, + train_fn=test_runnable.train, + eval_fn=test_runnable.evaluate, + global_step=test_runnable.global_step, + train_steps=10, + steps_per_loop=2, + summary_dir=os.path.join(self.model_dir, "summaries/train"), + summary_interval=2, + checkpoint_manager=checkpoint_manager, + eval_summary_dir=os.path.join(self.model_dir, "summaries/eval"), + eval_steps=2, + eval_interval=5) + test_controller.train(evaluate=True) + + # Checkpoints are saved. + self.assertNotEmpty(tf.io.gfile.glob(os.path.join(self.model_dir, "ckpt*"))) + + # Loss and accuracy values should be written into summaries. + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/train"))) + self.assertTrue( + check_eventfile_for_keyword( + "loss", os.path.join(self.model_dir, "summaries/train"))) + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/eval"))) + self.assertTrue( + check_eventfile_for_keyword( + "eval_loss", os.path.join(self.model_dir, "summaries/eval"))) + + @combinations.generate(all_strategy_combinations()) + def test_train_only(self, strategy): + with strategy.scope(): + test_runnable = TestRunnable() + + checkpoint = tf.train.Checkpoint( + model=test_runnable.model, optimizer=test_runnable.optimizer) + checkpoint_manager = tf.train.CheckpointManager( + checkpoint, + self.model_dir, + max_to_keep=None, + step_counter=test_runnable.global_step, + checkpoint_interval=10) + test_controller = controller.Controller( + strategy=strategy, + train_fn=test_runnable.train, + global_step=test_runnable.global_step, + train_steps=10, + steps_per_loop=2, + summary_dir=os.path.join(self.model_dir, "summaries/train"), + summary_interval=2, + checkpoint_manager=checkpoint_manager, + eval_summary_dir=os.path.join(self.model_dir, "summaries/eval"), + ) + test_controller.train(evaluate=False) + + # Checkpoints are saved. + self.assertNotEmpty(tf.io.gfile.glob(os.path.join(self.model_dir, "ckpt*"))) + + # Only train summaries are written. + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/train"))) + self.assertTrue( + check_eventfile_for_keyword( + "loss", os.path.join(self.model_dir, "summaries/train"))) + self.assertFalse( + tf.io.gfile.exists(os.path.join(self.model_dir, "summaries/eval"))) + + @combinations.generate(all_strategy_combinations()) + def test_evaluate_only(self, strategy): + with strategy.scope(): + test_runnable = TestRunnable() + + checkpoint = tf.train.Checkpoint(model=test_runnable.model) + checkpoint.save(os.path.join(self.model_dir, "ckpt")) + + checkpoint_manager = tf.train.CheckpointManager( + checkpoint, + self.model_dir, + max_to_keep=None, + step_counter=test_runnable.global_step) + test_controller = controller.Controller( + strategy=strategy, + eval_fn=test_runnable.evaluate, + global_step=test_runnable.global_step, + checkpoint_manager=checkpoint_manager, + summary_dir=os.path.join(self.model_dir, "summaries/train"), + eval_summary_dir=os.path.join(self.model_dir, "summaries/eval"), + eval_steps=2, + eval_interval=5) + test_controller.evaluate() + + # Only eval summaries are written + self.assertFalse( + tf.io.gfile.exists(os.path.join(self.model_dir, "summaries/train"))) + self.assertNotEmpty( + tf.io.gfile.listdir(os.path.join(self.model_dir, "summaries/eval"))) + self.assertTrue( + check_eventfile_for_keyword( + "eval_loss", os.path.join(self.model_dir, "summaries/eval"))) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/grad_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/grad_utils.py new file mode 100644 index 0000000..efda2e7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/grad_utils.py @@ -0,0 +1,143 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Some gradient util functions to help users writing custom training loop.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging + +import tensorflow.compat.v2 as tf + + +def _filter_grads(grads_and_vars): + """Filter out iterable with grad equal to None.""" + grads_and_vars = tuple(grads_and_vars) + if not grads_and_vars: + return grads_and_vars + filtered = [] + vars_with_empty_grads = [] + for grad, var in grads_and_vars: + if grad is None: + vars_with_empty_grads.append(var) + else: + filtered.append((grad, var)) + filtered = tuple(filtered) + if not filtered: + raise ValueError("No gradients provided for any variable: %s." % + ([v.name for _, v in grads_and_vars],)) + if vars_with_empty_grads: + logging.warning( + ("Gradients do not exist for variables %s when minimizing the loss."), + ([v.name for v in vars_with_empty_grads])) + return filtered + + +def _filter_and_allreduce_gradients(grads_and_vars, + allreduce_precision="float32"): + """Filter None grads and then allreduce gradients in specified precision. + + This utils function is used when users intent to explicitly allreduce + gradients and customize gradients operations before and after allreduce. + The allreduced gradients are then passed to optimizer.apply_gradients( + experimental_aggregate_gradients=False). + + Arguments: + grads_and_vars: gradients and variables pairs. + allreduce_precision: Whether to allreduce gradients in float32 or float16. + + Returns: + pairs of allreduced non-None gradients and variables. + """ + filtered_grads_and_vars = _filter_grads(grads_and_vars) + (grads, variables) = zip(*filtered_grads_and_vars) + if allreduce_precision == "float16": + grads = [tf.cast(grad, "float16") for grad in grads] + allreduced_grads = tf.distribute.get_replica_context().all_reduce( + tf.distribute.ReduceOp.SUM, grads) + if allreduce_precision == "float16": + allreduced_grads = [tf.cast(grad, "float32") for grad in allreduced_grads] + return allreduced_grads, variables + + +def _run_callbacks(callbacks, grads_and_vars): + for callback in callbacks: + grads_and_vars = callback(grads_and_vars) + return grads_and_vars + + +def minimize_using_explicit_allreduce(tape, + optimizer, + loss, + trainable_variables, + pre_allreduce_callbacks=None, + post_allreduce_callbacks=None): + """Minimizes loss for one step by updating `trainable_variables`. + + Minimizes loss for one step by updating `trainable_variables`. + This explicitly performs gradient allreduce, instead of relying on implicit + allreduce in optimizer.apply_gradients(). If training using FP16 mixed + precision, explicit allreduce will aggregate gradients in FP16 format. + For TPU and GPU training using FP32, explicit allreduce will aggregate + gradients in FP32 format. + + Arguments: + tape: An instance of `tf.GradientTape`. + optimizer: An instance of `tf.keras.optimizers.Optimizer`. + loss: the loss tensor. + trainable_variables: A list of model Variables. + pre_allreduce_callbacks: A list of callback functions that takes gradients + and model variables pairs as input, manipulate them, and returns a new + gradients and model variables pairs. The callback functions will be + invoked in the list order and before gradients are allreduced. + With mixed precision training, the pre_allreduce_allbacks will be + applied on scaled_gradients. Default is no callbacks. + post_allreduce_callbacks: A list of callback functions that takes + gradients and model variables pairs as input, manipulate them, and + returns a new gradients and model variables paris. The callback + functions will be invoked in the list order and right before gradients + are applied to variables for updates. Default is no callbacks. + """ + if isinstance(optimizer, + tf.keras.mixed_precision.experimental.LossScaleOptimizer): + # FP16 GPU code path + with tape: + scaled_loss = optimizer.get_scaled_loss(loss) + scaled_grads = tape.gradient(scaled_loss, trainable_variables) + grads_and_vars = zip(scaled_grads, trainable_variables) + if pre_allreduce_callbacks: + grads_and_vars = _run_callbacks(pre_allreduce_callbacks, grads_and_vars) + (allreduced_scaled_grads, + filtered_training_vars) = _filter_and_allreduce_gradients( + grads_and_vars, allreduce_precision="float16") + allreduced_unscaled_grads = optimizer.get_unscaled_gradients( + allreduced_scaled_grads) + grads_and_vars = zip(allreduced_unscaled_grads, filtered_training_vars) + else: + # TPU or FP32 GPU code path + grads = tape.gradient(loss, trainable_variables) + grads_and_vars = zip(grads, trainable_variables) + if pre_allreduce_callbacks: + grads_and_vars = _run_callbacks(pre_allreduce_callbacks, grads_and_vars) + (allreduced_grads, + filtered_training_vars) = _filter_and_allreduce_gradients( + grads_and_vars, allreduce_precision="float32") + grads_and_vars = zip(allreduced_grads, filtered_training_vars) + if post_allreduce_callbacks: + grads_and_vars = _run_callbacks(post_allreduce_callbacks, grads_and_vars) + optimizer.apply_gradients( + grads_and_vars, experimental_aggregate_gradients=False) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/runnable.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/runnable.py new file mode 100644 index 0000000..1af6eca --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/runnable.py @@ -0,0 +1,79 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""An abstraction that users can easily handle their custom training loops.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import abc +import six +import tensorflow.compat.v2 as tf +from typing import Dict, Optional, Text + + +@six.add_metaclass(abc.ABCMeta) +class AbstractTrainable(tf.Module): + """An abstract class defining the APIs required for training.""" + + @abc.abstractmethod + def train(self, + num_steps: Optional[tf.Tensor]) -> Optional[Dict[Text, tf.Tensor]]: + """Implements model training with multiple steps. + + In training, it is common to break the total training steps into several + training loops, so users can do checkpointing, write summaries and run some + python callbacks. This is necessary for getting good performance in TPU + training, as the overhead for launching a multi worker tf.function may be + large in Eager mode. It is usually encouraged to create a host training loop + (e.g. using a `tf.range` wrapping `strategy.run` inside a + `tf.function`) in the TPU case. For the cases that don't require host + training loop to acheive peak performance, users can just implement a simple + python loop to drive each step. + + Args: + num_steps: A guideline for how many training steps to run. Note that it is + up to the model what constitutes a "step" (this may involve more than + one update to model parameters, e.g. if training a GAN). + + Returns: + The function may return a dictionary of `Tensors`, which will be + written to logs and as TensorBoard summaries. + """ + pass + + +@six.add_metaclass(abc.ABCMeta) +class AbstractEvaluable(tf.Module): + """An abstract class defining the APIs required for evaluation.""" + + @abc.abstractmethod + def evaluate( + self, num_steps: Optional[tf.Tensor]) -> Optional[Dict[Text, tf.Tensor]]: + """Implements model evaluation. + + Args: + num_steps: A guideline for how many evaluation steps to run. Note that it + is up to the model what constitutes a "step". Generally, it may be + desirable to support both a limited number of eval steps and iterating + over a full dataset (however many steps are required) when `num_steps` + is `None`. + + Returns: + The function may return a dictionary of `Tensors`, which will be + written to logs and as TensorBoard summaries. + """ + pass diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/standard_runnable.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/standard_runnable.py new file mode 100644 index 0000000..20dd66f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/standard_runnable.py @@ -0,0 +1,181 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""An abstraction that users can easily handle their custom training loops.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import abc +import six +import tensorflow.compat.v2 as tf +from typing import Dict, Optional, Text + +from official.staging.training import runnable +from official.staging.training import utils + + +@six.add_metaclass(abc.ABCMeta) +class StandardTrainable(runnable.AbstractTrainable): + """Implements the standard functionality of AbstractTrainable APIs.""" + + def __init__(self, use_tf_while_loop=True, use_tf_function=True): + if use_tf_while_loop and not use_tf_function: + raise ValueError("`use_tf_while_loop=True` and `use_tf_function=False` " + "is not supported") + self.use_tf_while_loop = use_tf_while_loop + self.use_tf_function = use_tf_function + self.train_dataset = None + self.train_iter = None + self.train_loop_fn = None + + @abc.abstractmethod + def build_train_dataset(self): + """Builds the training datasets. + + Returns: + A tf.nest-compatible structure of tf.data.Dataset or DistributedDataset. + """ + pass + + def train(self, + num_steps: Optional[tf.Tensor]) -> Optional[Dict[Text, tf.Tensor]]: + """See base class.""" + if self.train_dataset is None: + # Build train input dataset + self.train_dataset = self.build_train_dataset() + self.train_iter = tf.nest.map_structure(iter, self.train_dataset) + + if self.train_loop_fn is None: + train_fn = self.train_step + if self.use_tf_while_loop: + self.train_loop_fn = utils.create_tf_while_loop_fn(train_fn) + else: + if self.use_tf_function: + train_fn = tf.function(train_fn) + self.train_loop_fn = utils.create_loop_fn(train_fn) + + self.train_loop_begin() + self.train_loop_fn(self.train_iter, num_steps) + return self.train_loop_end() + + def train_loop_begin(self): + """Called once at the beginning of the training loop. + + This is a good place to reset metrics that accumulate values over multiple + steps of training. + """ + pass + + @abc.abstractmethod + def train_step(self, iterator): + """Implements one step of training. + + What a "step" consists of is up to the implementer. If using distribution + strategies, the call to this method should take place in the "cross-replica + context" for generality, to allow e.g. multiple iterator dequeues and calls + to `strategy.run`. + + Args: + iterator: A tf.nest-compatible structure of tf.data Iterator or + DistributedIterator. + """ + pass + + def train_loop_end(self) -> Optional[Dict[Text, tf.Tensor]]: + """Called at the end of the training loop. + + This is a good place to get metric results. The value returned from this + function will be returned as-is from the train() method. + + Returns: + The function may return a dictionary of `Tensors`, which will be + written to logs and as TensorBoard summaries. + """ + pass + + +@six.add_metaclass(abc.ABCMeta) +class StandardEvaluable(runnable.AbstractEvaluable): + """Implements the standard functionality of AbstractEvaluable APIs.""" + + def __init__(self, use_tf_function=True): + self.eval_use_tf_function = use_tf_function + self.eval_dataset = None + self.eval_loop_fn = None + + @abc.abstractmethod + def build_eval_dataset(self): + """Builds the evaluation datasets. + + Returns: + A tf.nest-compatible structure of tf.data.Dataset or DistributedDataset. + """ + pass + + def evaluate( + self, num_steps: Optional[tf.Tensor]) -> Optional[Dict[Text, tf.Tensor]]: + """See base class.""" + if self.eval_dataset is None: + # Build train input dataset + self.eval_dataset = self.build_eval_dataset() + + if self.eval_loop_fn is None: + eval_fn = self.eval_step + if self.eval_use_tf_function: + eval_fn = tf.function(eval_fn) + self.eval_loop_fn = utils.create_loop_fn(eval_fn) + + eval_iter = tf.nest.map_structure(iter, self.eval_dataset) + + self.eval_begin() + self.eval_loop_fn(eval_iter, num_steps) + return self.eval_end() + + def eval_begin(self): + """Called once at the beginning of the evaluation. + + This is a good place to reset metrics that accumulate values over the entire + evaluation. + """ + pass + + @abc.abstractmethod + def eval_step(self, iterator): + """Implements one step of evaluation. + + What a "step" consists of is up to the implementer. If using distribution + strategies, the call to this method should take place in the "cross-replica + context" for generality, to allow e.g. multiple iterator dequeues and calls + to `strategy.run`. + + Args: + iterator: A tf.nest-compatible structure of tf.data Iterator or + DistributedIterator. + """ + pass + + def eval_end(self) -> Optional[Dict[Text, tf.Tensor]]: + """Called at the end of the evaluation. + + This is a good place to get metric results. The value returned from this + function will be returned as-is from the evaluate() method. + + Returns: + The function may return a dictionary of `Tensors`, which will be + written to logs and as TensorBoard summaries. + """ + pass diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/utils.py new file mode 100644 index 0000000..33fa368 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/staging/training/utils.py @@ -0,0 +1,342 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Some layered modules/functions to help users writing custom training loop.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import abc +import inspect +import six + +import tensorflow.compat.v2 as tf + + +def create_loop_fn(step_fn): + """Creates a multiple steps function driven by the python while loop. + + Args: + step_fn: A function which takes `iterator` as input. + + Returns: + A callable defined as the `loop_fn` defination below. + """ + + def loop_fn(iterator, num_steps, state=None, reduce_fn=None): + """A loop function with multiple steps. + + Args: + iterator: A nested structure of tf.data `Iterator` or + `DistributedIterator`. + num_steps: The number of steps in the loop. If `num_steps==-1`, will + iterate until exausting the iterator. + state: An optional initial state before running the loop. + reduce_fn: a callable defined as `def reduce_fn(state, value)`, where + `value` is the outputs from `step_fn`. + + Returns: + The updated state. + """ + try: + step = 0 + # To make sure the OutOfRangeError exception can be handled well with + # async remote eager, we need to wrap the loop body in a `async_scope`. + with tf.experimental.async_scope(): + while (num_steps == -1 or step < num_steps): + outputs = step_fn(iterator) + if reduce_fn is not None: + state = reduce_fn(state, outputs) + step += 1 + return state + except (StopIteration, tf.errors.OutOfRangeError): + tf.experimental.async_clear_error() + return state + + return loop_fn + + +def create_tf_while_loop_fn(step_fn): + """Create a multiple steps function driven by tf.while_loop on the host. + + Args: + step_fn: A function which takes `iterator` as input. + + Returns: + A callable defined as the `loop_fn` defination below. + """ + + @tf.function + def loop_fn(iterator, num_steps): + """A loop function with multiple steps. + + Args: + iterator: A nested structure of tf.data `Iterator` or + `DistributedIterator`. + num_steps: The number of steps in the loop. Must be a tf.Tensor. + """ + if not isinstance(num_steps, tf.Tensor): + raise ValueError("`num_steps` should be an `tf.Tensor`. Python object " + "may cause retracing.") + + for _ in tf.range(num_steps): + step_fn(iterator) + + return loop_fn + + +def make_distributed_dataset(strategy, dataset_or_fn, *args, **kwargs): + """A helper function to create distributed dataset. + + Args: + strategy: An instance of `tf.distribute.Strategy`. + dataset_or_fn: A instance of `tf.data.Dataset` or a function which takes an + `tf.distribute.InputContext` as input and returns a `tf.data.Dataset`. If + it is a function, it could optionally have an argument named + `input_context` which is `tf.distribute.InputContext` argument type. + *args: The list of arguments to be passed to dataset_or_fn. + **kwargs: Any keyword arguments to be passed. + + Returns: + A distributed Dataset. + """ + if strategy is None: + strategy = tf.distribute.get_strategy() + + if isinstance(dataset_or_fn, tf.data.Dataset): + return strategy.experimental_distribute_dataset(dataset_or_fn) + + if not callable(dataset_or_fn): + raise ValueError("`dataset_or_fn` should be either callable or an instance " + "of `tf.data.Dataset`") + + def dataset_fn(ctx): + """Wrapped dataset function for creating distributed dataset..""" + + # If `dataset_or_fn` is a function and has `input_context` as argument + # names, pass `ctx` as the value of `input_context` when calling + # `dataset_or_fn`. Otherwise `ctx` will not be used when calling + # `dataset_or_fn`. + if six.PY3: + argspec = inspect.getfullargspec(dataset_or_fn) + else: + argspec = inspect.getargspec(dataset_or_fn) + args_names = argspec.args + + if "input_context" in args_names: + kwargs["input_context"] = ctx + ds = dataset_or_fn(*args, **kwargs) + return ds + + return strategy.experimental_distribute_datasets_from_function(dataset_fn) + + +class SummaryManager(object): + """A class manages writing summaries.""" + + def __init__(self, + summary_writer, + summary_fn, + global_step=None, + summary_interval=None): + """Construct a summary manager object. + + Args: + summary_writer: A `tf.summary.SummaryWriter` instance for writing + summaries. + summary_fn: A callable defined as `def summary_fn(name, tensor, + step=None)`, which describes the summary operation. + global_step: A `tf.Variable` instance for checking the current global step + value, in case users want to save summaries every N steps. + summary_interval: An integer, indicates the minimum step interval between + two summaries. + """ + if summary_writer is not None: + self._summary_writer = summary_writer + self._enabled = True + else: + self._summary_writer = tf.summary.create_noop_writer() + self._enabled = False + self._summary_fn = summary_fn + + if global_step is None: + self._global_step = tf.summary.experimental.get_step() + else: + self._global_step = global_step + + if summary_interval is not None: + if self._global_step is None: + raise ValueError("`summary_interval` is not None, but no `global_step` " + "can be obtained ") + self._last_summary_step = self._global_step.numpy() + self._summary_interval = summary_interval + + @property + def summary_interval(self): + return self._summary_interval + + @property + def summary_writer(self): + """Returns the underlying summary writer.""" + return self._summary_writer + + def flush(self): + """Flush the underlying summary writer.""" + if self._enabled: + tf.summary.flush(self._summary_writer) + + def write_summaries(self, items, always_write=True): + """Write a bulk of summaries. + + Args: + items: a dictionary of `Tensors` for writing summaries. + always_write: An optional boolean. If `True`, the manager will always + write summaries unless the summaries have been written for the same + step. Otherwise the manager will only write the summaries if the + interval between summaries are larger than `summary_interval`. + + Returns: + A boolean indicates whether the summaries are written or not. + """ + # TODO(rxsang): Support writing summaries with nested structure, so users + # can split the summaries into different directories for nicer visualization + # in Tensorboard, like train and eval metrics. + if not self._enabled: + return False + + if self._summary_interval is not None: + current_step = self._global_step.numpy() + if current_step == self._last_summary_step: + return False + if not always_write and current_step < (self._last_summary_step + + self._summary_interval): + return False + self._last_summary_step = current_step + + with self._summary_writer.as_default(): + for name, tensor in items.items(): + self._summary_fn(name, tensor, step=self._global_step) + return True + + +@six.add_metaclass(abc.ABCMeta) +class Trigger(object): + """An abstract class representing a "trigger" for some event.""" + + @abc.abstractmethod + def __call__(self, value: float, force_trigger=False): + """Maybe trigger the event based on the given value. + + Args: + value: the value for triggering. + force_trigger: Whether the trigger is forced triggered. + + Returns: + `True` if the trigger is triggered on the given `value`, and + `False` otherwise. + """ + + @abc.abstractmethod + def reset(self): + """Reset states in the trigger.""" + + +class IntervalTrigger(Trigger): + """Triggers on every fixed interval.""" + + def __init__(self, interval, start=0): + """Constructs the IntervalTrigger. + + Args: + interval: The triggering interval. + start: An initial value for the trigger. + """ + self._interval = interval + self._last_trigger_value = start + + def __call__(self, value, force_trigger=False): + """Maybe trigger the event based on the given value. + + Args: + value: the value for triggering. + force_trigger: If True, the trigger will be forced triggered unless the + last trigger value is equal to `value`. + + Returns: + `True` if the trigger is triggered on the given `value`, and + `False` otherwise. + """ + if force_trigger and value != self._last_trigger_value: + self._last_trigger_value = value + return True + + if self._interval and self._interval > 0: + if value >= self._last_trigger_value + self._interval: + self._last_trigger_value = value + return True + return False + + def reset(self): + """See base class.""" + self._last_trigger_value = 0 + + +class EpochHelper(object): + """A Helper class to handle epochs in Customized Training Loop.""" + + def __init__(self, epoch_steps, global_step): + """Constructs the EpochHelper. + + Args: + epoch_steps: An integer indicates how many steps in an epoch. + global_step: A `tf.Variable` instance indicates the current global step. + """ + self._epoch_steps = epoch_steps + self._global_step = global_step + self._current_epoch = None + self._epoch_start_step = None + self._in_epoch = False + + def epoch_begin(self): + """Returns whether a new epoch should begin.""" + if self._in_epoch: + return False + current_step = self._global_step.numpy() + self._epoch_start_step = current_step + self._current_epoch = current_step // self._epoch_steps + self._in_epoch = True + return True + + def epoch_end(self): + """Returns whether the current epoch should end.""" + if not self._in_epoch: + raise ValueError("`epoch_end` can only be called inside an epoch") + current_step = self._global_step.numpy() + epoch = current_step // self._epoch_steps + + if epoch > self._current_epoch: + self._in_epoch = False + return True + return False + + @property + def batch_index(self): + """Index of the next batch within the current epoch.""" + return self._global_step.numpy() - self._epoch_start_step + + @property + def current_epoch(self): + return self._current_epoch diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/README.md new file mode 100644 index 0000000..18160f7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/README.md @@ -0,0 +1,97 @@ +# Adding Abseil (absl) flags quickstart +## Defining a flag +absl flag definitions are similar to argparse, although they are defined on a global namespace. + +For instance defining a string flag looks like: +```$xslt +from absl import flags +flags.DEFINE_string( + name="my_flag", + default="a_sensible_default", + help="Here is what this flag does." +) +``` + +All three arguments are required, but default may be `None`. A common optional argument is +short_name for defining abreviations. Certain `DEFINE_*` methods will have other required arguments. +For instance `DEFINE_enum` requires the `enum_values` argument to be specified. + +## Key Flags +absl has the concept of a key flag. Any flag defined in `__main__` is considered a key flag by +default. Key flags are displayed in `--help`, others only appear in `--helpfull`. In order to +handle key flags that are defined outside the module in question, absl provides the +`flags.adopt_module_key_flags()` method. This adds the key flags of a different module to one's own +key flags. For example: +```$xslt +File: flag_source.py +--------------------------------------- + +from absl import flags +flags.DEFINE_string(name="my_flag", default="abc", help="a flag.") +``` + +```$xslt +File: my_module.py +--------------------------------------- + +from absl import app as absl_app +from absl import flags + +import flag_source + +flags.adopt_module_key_flags(flag_source) + +def main(_): + pass + +absl_app.run(main, [__file__, "-h"] +``` + +when `my_module.py` is run it will show the help text for `my_flag`. Because not all flags defined +in a file are equally important, `official/utils/flags/core.py` (generally imported as flags_core) +provides an abstraction for handling key flag declaration in an easy way through the +`register_key_flags_in_core()` function, which allows a module to make a single +`adopt_key_flags(flags_core)` call when using the util flag declaration functions. + +## Validators +Often the constraints on a flag are complicated. absl provides the validator decorator to allow +one to mark a function as a flag validation function. Suppose we want users to provide a flag +which is a palindrome. + +```$xslt +from absl import flags + +flags.DEFINE_string(name="pal_flag", short_name="pf", default="", help="Give me a palindrome") + +@flags.validator("pal_flag") +def _check_pal(provided_pal_flag): + return provided_pal_flag == provided_pal_flag[::-1] + +``` + +Validators take the form that returning True (truthy) passes, and all others +(False, None, exception) fail. + +## Testing +To test using absl, simply declare flags in the setupClass method of TensorFlow's TestCase. + +```$xslt +from absl import flags +import tensorflow as tf + +def define_flags(): + flags.DEFINE_string(name="test_flag", default="abc", help="an example flag") + + +class BaseTester(unittest.TestCase): + + @classmethod + def setUpClass(cls): + super(BaseTester, cls).setUpClass() + define_flags() + + def test_trivial(self): + flags_core.parse_flags([__file__, "test_flag", "def"]) + self.AssertEqual(flags.FLAGS.test_flag, "def") + +``` diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_base.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_base.py new file mode 100644 index 0000000..8d0f675 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_base.py @@ -0,0 +1,173 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags which will be nearly universal across models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +import tensorflow as tf + +from official.utils.flags._conventions import help_wrap +from official.utils.logs import hooks_helper + +############## npu modify begin ############# +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +############## npu modify end ############### + + +def define_base(data_dir=True, model_dir=True, clean=False, train_epochs=False, + epochs_between_evals=False, stop_threshold=False, + batch_size=True, num_gpu=False, hooks=False, export_dir=False, + distribution_strategy=False, run_eagerly=False): + """Register base flags. + + Args: + data_dir: Create a flag for specifying the input data directory. + model_dir: Create a flag for specifying the model file directory. + clean: Create a flag for removing the model_dir. + train_epochs: Create a flag to specify the number of training epochs. + epochs_between_evals: Create a flag to specify the frequency of testing. + stop_threshold: Create a flag to specify a threshold accuracy or other + eval metric which should trigger the end of training. + batch_size: Create a flag to specify the batch size. + num_gpu: Create a flag to specify the number of GPUs used. + hooks: Create a flag to specify hooks for logging. + export_dir: Create a flag to specify where a SavedModel should be exported. + distribution_strategy: Create a flag to specify which Distribution Strategy + to use. + run_eagerly: Create a flag to specify to run eagerly op by op. + Returns: + A list of flags for core.py to marks as key flags. + """ + key_flags = [] + + if data_dir: + flags.DEFINE_string( + name="data_dir", short_name="dd", default="/tmp", + help=help_wrap("The location of the input data.")) + key_flags.append("data_dir") + + if model_dir: + flags.DEFINE_string( + name="model_dir", short_name="md", default="/tmp", + help=help_wrap("The location of the model checkpoint files.")) + key_flags.append("model_dir") + + if clean: + flags.DEFINE_boolean( + name="clean", default=False, + help=help_wrap("If set, model_dir will be removed if it exists.")) + key_flags.append("clean") + + if train_epochs: + flags.DEFINE_integer( + name="train_epochs", short_name="te", default=1, + help=help_wrap("The number of epochs used to train.")) + key_flags.append("train_epochs") + + if epochs_between_evals: + flags.DEFINE_integer( + name="epochs_between_evals", short_name="ebe", default=1, + help=help_wrap("The number of training epochs to run between " + "evaluations.")) + key_flags.append("epochs_between_evals") + + if stop_threshold: + flags.DEFINE_float( + name="stop_threshold", short_name="st", + default=None, + help=help_wrap("If passed, training will stop at the earlier of " + "train_epochs and when the evaluation metric is " + "greater than or equal to stop_threshold.")) + + if batch_size: + flags.DEFINE_integer( + name="batch_size", short_name="bs", default=32, + help=help_wrap("Batch size for training and evaluation. When using " + "multiple gpus, this is the global batch size for " + "all devices. For example, if the batch size is 32 " + "and there are 4 GPUs, each GPU will get 8 examples on " + "each step.")) + key_flags.append("batch_size") + + if num_gpu: + flags.DEFINE_integer( + name="num_gpus", short_name="ng", + default=1, + help=help_wrap( + "How many GPUs to use at each worker with the " + "DistributionStrategies API. The default is 1.")) + + if run_eagerly: + flags.DEFINE_boolean( + name="run_eagerly", default=False, + help="Run the model op by op without building a model function.") + + if hooks: + # Construct a pretty summary of hooks. + hook_list_str = ( + u"\ufeff Hook:\n" + u"\n".join([u"\ufeff {}".format(key) for key + in hooks_helper.HOOKS])) + flags.DEFINE_list( + name="hooks", short_name="hk", default="LoggingTensorHook", + help=help_wrap( + u"A list of (case insensitive) strings to specify the names of " + u"training hooks.\n{}\n\ufeff Example: `--hooks ProfilerHook," + u"ExamplesPerSecondHook`\n See official.utils.logs.hooks_helper " + u"for details.".format(hook_list_str)) + ) + key_flags.append("hooks") + + if export_dir: + flags.DEFINE_string( + name="export_dir", short_name="ed", default=None, + help=help_wrap("If set, a SavedModel serialization of the model will " + "be exported to this directory at the end of training. " + "See the README for more details and relevant links.") + ) + key_flags.append("export_dir") + + if distribution_strategy: + flags.DEFINE_string( + name="distribution_strategy", short_name="ds", default="mirrored", + help=help_wrap("The Distribution Strategy to use for training. " + "Accepted values are 'off', 'one_device', " + "'mirrored', 'parameter_server', 'collective', " + "case insensitive. 'off' means not to use " + "Distribution Strategy; 'default' means to choose " + "from `MirroredStrategy` or `OneDeviceStrategy` " + "according to the number of GPUs.") + ) + + + return key_flags + +def get_num_gpus(flags_obj): + """get the num npus using hccl api""" + ############## npu modify begin ############# + return get_rank_size() + ############## npu modify end ############### + +# def get_num_gpus(flags_obj): +# """Treat num_gpus=-1 as 'use all'.""" +# if flags_obj.num_gpus != -1: +# return flags_obj.num_gpus + +# from tensorflow.python.client import device_lib # pylint: disable=g-import-not-at-top +# local_device_protos = device_lib.list_local_devices() +# return sum([1 for d in local_device_protos if d.device_type == "GPU"]) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_benchmark.py new file mode 100644 index 0000000..eddae80 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_benchmark.py @@ -0,0 +1,109 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags for benchmarking models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags + +from official.utils.flags._conventions import help_wrap + + +def define_log_steps(): + flags.DEFINE_integer( + name="log_steps", default=100, + help="Frequency with which to log timing information with TimeHistory.") + + return [] + + +def define_benchmark(benchmark_log_dir=True, bigquery_uploader=True): + """Register benchmarking flags. + + Args: + benchmark_log_dir: Create a flag to specify location for benchmark logging. + bigquery_uploader: Create flags for uploading results to BigQuery. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + flags.DEFINE_enum( + name="benchmark_logger_type", default="BaseBenchmarkLogger", + enum_values=["BaseBenchmarkLogger", "BenchmarkFileLogger", + "BenchmarkBigQueryLogger"], + help=help_wrap("The type of benchmark logger to use. Defaults to using " + "BaseBenchmarkLogger which logs to STDOUT. Different " + "loggers will require other flags to be able to work.")) + flags.DEFINE_string( + name="benchmark_test_id", short_name="bti", default=None, + help=help_wrap("The unique test ID of the benchmark run. It could be the " + "combination of key parameters. It is hardware " + "independent and could be used compare the performance " + "between different test runs. This flag is designed for " + "human consumption, and does not have any impact within " + "the system.")) + + define_log_steps() + + if benchmark_log_dir: + flags.DEFINE_string( + name="benchmark_log_dir", short_name="bld", default=None, + help=help_wrap("The location of the benchmark logging.") + ) + + if bigquery_uploader: + flags.DEFINE_string( + name="gcp_project", short_name="gp", default=None, + help=help_wrap( + "The GCP project name where the benchmark will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_data_set", short_name="bds", default="test_benchmark", + help=help_wrap( + "The Bigquery dataset name where the benchmark will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_run_table", short_name="brt", default="benchmark_run", + help=help_wrap("The Bigquery table name where the benchmark run " + "information will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_run_status_table", short_name="brst", + default="benchmark_run_status", + help=help_wrap("The Bigquery table name where the benchmark run " + "status information will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_metric_table", short_name="bmt", + default="benchmark_metric", + help=help_wrap("The Bigquery table name where the benchmark metric " + "information will be uploaded.")) + + @flags.multi_flags_validator( + ["benchmark_logger_type", "benchmark_log_dir"], + message="--benchmark_logger_type=BenchmarkFileLogger will require " + "--benchmark_log_dir being set") + def _check_benchmark_log_dir(flags_dict): + benchmark_logger_type = flags_dict["benchmark_logger_type"] + if benchmark_logger_type == "BenchmarkFileLogger": + return flags_dict["benchmark_log_dir"] + return True + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_conventions.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_conventions.py new file mode 100644 index 0000000..81ad21b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_conventions.py @@ -0,0 +1,54 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Central location for shared argparse convention definitions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +import codecs +import functools + +from absl import app as absl_app +from absl import flags + + +# This codifies help string conventions and makes it easy to update them if +# necessary. Currently the only major effect is that help bodies start on the +# line after flags are listed. All flag definitions should wrap the text bodies +# with help wrap when calling DEFINE_*. +_help_wrap = functools.partial(flags.text_wrap, length=80, indent="", + firstline_indent="\n") + + +# Pretty formatting causes issues when utf-8 is not installed on a system. +def _stdout_utf8(): + try: + codecs.lookup("utf-8") + except LookupError: + return False + return sys.stdout.encoding == "UTF-8" + + +if _stdout_utf8(): + help_wrap = _help_wrap +else: + def help_wrap(text, *args, **kwargs): + return _help_wrap(text, *args, **kwargs).replace(u"\ufeff", u"") + + +# Replace None with h to also allow -h +absl_app.HelpshortFlag.SHORT_NAME = "h" diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_device.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_device.py new file mode 100644 index 0000000..d8974fc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_device.py @@ -0,0 +1,85 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags for managing compute devices. Currently only contains TPU flags.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +from absl import logging + +from official.utils.flags._conventions import help_wrap + + +def require_cloud_storage(flag_names): + """Register a validator to check directory flags. + Args: + flag_names: An iterable of strings containing the names of flags to be + checked. + """ + msg = "TPU requires GCS path for {}".format(", ".join(flag_names)) + @flags.multi_flags_validator(["tpu"] + flag_names, message=msg) + def _path_check(flag_values): # pylint: disable=missing-docstring + if flag_values["tpu"] is None: + return True + + valid_flags = True + for key in flag_names: + if not flag_values[key].startswith("gs://"): + logging.error("%s must be a GCS path.", key) + valid_flags = False + + return valid_flags + + +def define_device(tpu=True): + """Register device specific flags. + Args: + tpu: Create flags to specify TPU operation. + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + if tpu: + flags.DEFINE_string( + name="tpu", default=None, + help=help_wrap( + "The Cloud TPU to use for training. This should be either the name " + "used when creating the Cloud TPU, or a " + "grpc://ip.address.of.tpu:8470 url. Passing `local` will use the" + "CPU of the local instance instead. (Good for debugging.)")) + key_flags.append("tpu") + + flags.DEFINE_string( + name="tpu_zone", default=None, + help=help_wrap( + "[Optional] GCE zone where the Cloud TPU is located in. If not " + "specified, we will attempt to automatically detect the GCE " + "project from metadata.")) + + flags.DEFINE_string( + name="tpu_gcp_project", default=None, + help=help_wrap( + "[Optional] Project name for the Cloud TPU-enabled project. If not " + "specified, we will attempt to automatically detect the GCE " + "project from metadata.")) + + flags.DEFINE_integer(name="num_tpu_shards", default=8, + help=help_wrap("Number of shards (TPU chips).")) + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_distribution.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_distribution.py new file mode 100644 index 0000000..ca331bf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_distribution.py @@ -0,0 +1,54 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags related to distributed execution.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +import tensorflow as tf + +from official.utils.flags._conventions import help_wrap + + +def define_distribution(worker_hosts=True, task_index=True): + """Register distributed execution flags. + + Args: + worker_hosts: Create a flag for specifying comma-separated list of workers. + task_index: Create a flag for specifying index of task. + + Returns: + A list of flags for core.py to marks as key flags. + """ + key_flags = [] + + if worker_hosts: + flags.DEFINE_string( + name='worker_hosts', default=None, + help=help_wrap( + 'Comma-separated list of worker ip:port pairs for running ' + 'multi-worker models with DistributionStrategy. The user would ' + 'start the program on each host with identical value for this ' + 'flag.')) + + if task_index: + flags.DEFINE_integer( + name='task_index', default=-1, + help=help_wrap('If multi-worker training, the task_index of this ' + 'worker.')) + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_misc.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_misc.py new file mode 100644 index 0000000..c6fa24b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_misc.py @@ -0,0 +1,50 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Misc flags.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags + +from official.utils.flags._conventions import help_wrap + + +def define_image(data_format=True): + """Register image specific flags. + + Args: + data_format: Create a flag to specify image axis convention. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + if data_format: + flags.DEFINE_enum( + name="data_format", short_name="df", default=None, + enum_values=["channels_first", "channels_last"], + help=help_wrap( + "A flag to override the data format used in the model. " + "channels_first provides a performance boost on GPU but is not " + "always compatible with CPU. If left unspecified, the data format " + "will be chosen automatically based on whether TensorFlow was " + "built for CPU or GPU.")) + key_flags.append("data_format") + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_performance.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_performance.py new file mode 100644 index 0000000..cc5840f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/_performance.py @@ -0,0 +1,289 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Register flags for optimizing performance.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import multiprocessing + +from absl import flags # pylint: disable=g-bad-import-order +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.flags._conventions import help_wrap + + +# Map string to TensorFlow dtype +DTYPE_MAP = { + "fp16": tf.float16, + "bf16": tf.bfloat16, + "fp32": tf.float32, +} + + +def get_tf_dtype(flags_obj): + if getattr(flags_obj, "fp16_implementation", None) == "graph_rewrite": + # If the graph_rewrite is used, we build the graph with fp32, and let the + # graph rewrite change ops to fp16. + return tf.float32 + return DTYPE_MAP[flags_obj.dtype] + + +def get_loss_scale(flags_obj, default_for_fp16): + dtype = get_tf_dtype(flags_obj) + if flags_obj.loss_scale == "dynamic": + return flags_obj.loss_scale + elif flags_obj.loss_scale is not None: + return float(flags_obj.loss_scale) + elif dtype == tf.float32 or dtype == tf.bfloat16: + return 1 # No loss scaling is needed for fp32 + else: + assert dtype == tf.float16 + return default_for_fp16 + + +def define_performance(num_parallel_calls=False, inter_op=False, intra_op=False, + synthetic_data=False, max_train_steps=False, dtype=False, + all_reduce_alg=False, num_packs=False, + tf_gpu_thread_mode=False, + datasets_num_private_threads=False, + datasets_num_parallel_batches=False, + dynamic_loss_scale=False, fp16_implementation=False, + loss_scale=False, + tf_data_experimental_slack=False, enable_xla=False, + training_dataset_cache=False): + """Register flags for specifying performance tuning arguments. + + Args: + num_parallel_calls: Create a flag to specify parallelism of data loading. + inter_op: Create a flag to allow specification of inter op threads. + intra_op: Create a flag to allow specification of intra op threads. + synthetic_data: Create a flag to allow the use of synthetic data. + max_train_steps: Create a flags to allow specification of maximum number + of training steps + dtype: Create flags for specifying dtype. + all_reduce_alg: If set forces a specific algorithm for multi-gpu. + num_packs: If set provides number of packs for MirroredStrategy's cross + device ops. + tf_gpu_thread_mode: gpu_private triggers us of private thread pool. + datasets_num_private_threads: Number of private threads for datasets. + datasets_num_parallel_batches: Determines how many batches to process in + parallel when using map and batch from tf.data. + dynamic_loss_scale: Allow the "loss_scale" flag to take on the value + "dynamic". Only valid if `dtype` is True. + fp16_implementation: Create fp16_implementation flag. + loss_scale: Controls the loss scaling, normally for mixed-precision + training. Can only be turned on if dtype is also True. + tf_data_experimental_slack: Determines whether to enable tf.data's + `experimental_slack` option. + enable_xla: Determines if XLA (auto clustering) is turned on. + training_dataset_cache: Whether to cache the training dataset on workers. + Typically used to improve training performance when training data is in + remote storage and can fit into worker memory. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + if num_parallel_calls: + flags.DEFINE_integer( + name="num_parallel_calls", short_name="npc", + default=multiprocessing.cpu_count(), + help=help_wrap("The number of records that are processed in parallel " + "during input processing. This can be optimized per " + "data set but for generally homogeneous data sets, " + "should be approximately the number of available CPU " + "cores. (default behavior)")) + + if inter_op: + flags.DEFINE_integer( + name="inter_op_parallelism_threads", short_name="inter", default=0, + help=help_wrap("Number of inter_op_parallelism_threads to use for CPU. " + "See TensorFlow config.proto for details.") + ) + + if intra_op: + flags.DEFINE_integer( + name="intra_op_parallelism_threads", short_name="intra", default=0, + help=help_wrap("Number of intra_op_parallelism_threads to use for CPU. " + "See TensorFlow config.proto for details.")) + + if synthetic_data: + flags.DEFINE_bool( + name="use_synthetic_data", short_name="synth", default=False, + help=help_wrap( + "If set, use fake data (zeroes) instead of a real dataset. " + "This mode is useful for performance debugging, as it removes " + "input processing steps, but will not learn anything.")) + + if max_train_steps: + flags.DEFINE_integer( + name="max_train_steps", short_name="mts", default=None, help=help_wrap( + "The model will stop training if the global_step reaches this " + "value. If not set, training will run until the specified number " + "of epochs have run as usual. It is generally recommended to set " + "--train_epochs=1 when using this flag." + )) + + if dtype: + flags.DEFINE_enum( + name="dtype", short_name="dt", default="fp32", + enum_values=DTYPE_MAP.keys(), + help=help_wrap("The TensorFlow datatype used for calculations. " + "Variables may be cast to a higher precision on a " + "case-by-case basis for numerical stability.")) + + loss_scale_help_text = ( + "The amount to scale the loss by when the model is run. {}. Before " + "gradients are computed, the loss is multiplied by the loss scale, " + "making all gradients loss_scale times larger. To adjust for this, " + "gradients are divided by the loss scale before being applied to " + "variables. This is mathematically equivalent to training without " + "a loss scale, but the loss scale helps avoid some intermediate " + "gradients from underflowing to zero. If not provided the default " + "for fp16 is 128 and 1 for all other dtypes.{}" + ) + if dynamic_loss_scale: + loss_scale_help_text = loss_scale_help_text.format( + "This can be an int/float or the string 'dynamic'", + " The string 'dynamic' can be used to dynamically determine the " + "optimal loss scale during training, but currently this " + "significantly slows down performance") + loss_scale_validation_msg = ("loss_scale should be a positive int/float " + "or the string 'dynamic'.") + else: + loss_scale_help_text = loss_scale_help_text.format( + "This must be an int/float", "") + loss_scale_validation_msg = "loss_scale should be a positive int/float." + if loss_scale: + flags.DEFINE_string( + name="loss_scale", short_name="ls", default=None, + help=help_wrap(loss_scale_help_text)) + + @flags.validator(flag_name="loss_scale", + message=loss_scale_validation_msg) + def _check_loss_scale(loss_scale): # pylint: disable=unused-variable + """Validator to check the loss scale flag is valid.""" + if loss_scale is None: + return True # null case is handled in get_loss_scale() + + if loss_scale == "dynamic" and dynamic_loss_scale: + return True + + try: + loss_scale = float(loss_scale) + except ValueError: + return False + + return loss_scale > 0 + + if fp16_implementation: + flags.DEFINE_enum( + name="fp16_implementation", default="keras", + enum_values=("keras', 'graph_rewrite"), + help=help_wrap( + "When --dtype=fp16, how fp16 should be implemented. This has no " + "impact on correctness. 'keras' uses the " + "tf.keras.mixed_precision API. 'graph_rewrite' uses the " + "tf.train.experimental.enable_mixed_precision_graph_rewrite " + "API.")) + + @flags.multi_flags_validator(["fp16_implementation", "dtype", + "loss_scale"]) + def _check_fp16_implementation(flags_dict): + """Validator to check fp16_implementation flag is valid.""" + if (flags_dict["fp16_implementation"] == "graph_rewrite" and + flags_dict["dtype"] != "fp16"): + raise flags.ValidationError("--fp16_implementation should not be " + "specified unless --dtype=fp16") + return True + + if all_reduce_alg: + flags.DEFINE_string( + name="all_reduce_alg", short_name="ara", default=None, + help=help_wrap("Defines the algorithm to use for performing all-reduce." + "When specified with MirroredStrategy for single " + "worker, this controls " + "tf.contrib.distribute.AllReduceCrossTowerOps. When " + "specified with MultiWorkerMirroredStrategy, this " + "controls " + "tf.distribute.experimental.CollectiveCommunication; " + "valid options are `ring` and `nccl`.")) + + if num_packs: + flags.DEFINE_integer( + name="num_packs", default=1, + help=help_wrap("Sets `num_packs` in the cross device ops used in " + "MirroredStrategy. For details, see " + "tf.distribute.NcclAllReduce.")) + + if tf_gpu_thread_mode: + flags.DEFINE_string( + name="tf_gpu_thread_mode", short_name="gt_mode", default=None, + help=help_wrap( + "Whether and how the GPU device uses its own threadpool.") + ) + + flags.DEFINE_integer( + name="per_gpu_thread_count", short_name="pgtc", default=0, + help=help_wrap( + "The number of threads to use for GPU. Only valid when " + "tf_gpu_thread_mode is not global.") + ) + + if datasets_num_private_threads: + flags.DEFINE_integer( + name="datasets_num_private_threads", + default=None, + help=help_wrap( + "Number of threads for a private threadpool created for all" + "datasets computation..") + ) + + if datasets_num_parallel_batches: + flags.DEFINE_integer( + name="datasets_num_parallel_batches", + default=None, + help=help_wrap( + "Determines how many batches to process in parallel when using " + "map and batch from tf.data.") + ) + + if training_dataset_cache: + flags.DEFINE_boolean( + name="training_dataset_cache", + default=False, + help=help_wrap( + "Determines whether to cache the training dataset on workers. " + "Typically used to improve training performance when training " + "data is in remote storage and can fit into worker memory.") + ) + + if tf_data_experimental_slack: + flags.DEFINE_boolean( + name="tf_data_experimental_slack", + default=False, + help=help_wrap( + "Whether to enable tf.data's `experimental_slack` option.") + ) + + if enable_xla: + flags.DEFINE_boolean( + name="enable_xla", default=False, + help="Whether to enable XLA auto jit compilation") + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/core.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/core.py new file mode 100644 index 0000000..fa36944 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/core.py @@ -0,0 +1,133 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Public interface for flag definition. + +See _example.py for detailed instructions on defining flags. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +from six.moves import shlex_quote + +from absl import app as absl_app +from absl import flags + +from official.utils.flags import _base +from official.utils.flags import _benchmark +from official.utils.flags import _conventions +from official.utils.flags import _device +from official.utils.flags import _distribution +from official.utils.flags import _misc +from official.utils.flags import _performance + + +def set_defaults(**kwargs): + for key, value in kwargs.items(): + flags.FLAGS.set_default(name=key, value=value) + + +def parse_flags(argv=None): + """Reset flags and reparse. Currently only used in testing.""" + flags.FLAGS.unparse_flags() + absl_app.parse_flags_with_usage(argv or sys.argv) + + +def register_key_flags_in_core(f): + """Defines a function in core.py, and registers its key flags. + + absl uses the location of a flags.declare_key_flag() to determine the context + in which a flag is key. By making all declares in core, this allows model + main functions to call flags.adopt_module_key_flags() on core and correctly + chain key flags. + + Args: + f: The function to be wrapped + + Returns: + The "core-defined" version of the input function. + """ + + def core_fn(*args, **kwargs): + key_flags = f(*args, **kwargs) + [flags.declare_key_flag(fl) for fl in key_flags] # pylint: disable=expression-not-assigned + return core_fn + + +define_base = register_key_flags_in_core(_base.define_base) +# We have define_base_eager for compatibility, since it used to be a separate +# function from define_base. +define_base_eager = define_base +define_log_steps = register_key_flags_in_core(_benchmark.define_log_steps) +define_benchmark = register_key_flags_in_core(_benchmark.define_benchmark) +define_device = register_key_flags_in_core(_device.define_device) +define_image = register_key_flags_in_core(_misc.define_image) +define_performance = register_key_flags_in_core(_performance.define_performance) +define_distribution = register_key_flags_in_core( + _distribution.define_distribution) + + +help_wrap = _conventions.help_wrap + + +get_num_gpus = _base.get_num_gpus +get_tf_dtype = _performance.get_tf_dtype +get_loss_scale = _performance.get_loss_scale +DTYPE_MAP = _performance.DTYPE_MAP +require_cloud_storage = _device.require_cloud_storage + +def _get_nondefault_flags_as_dict(): + """Returns the nondefault flags as a dict from flag name to value.""" + nondefault_flags = {} + for flag_name in flags.FLAGS: + flag_value = getattr(flags.FLAGS, flag_name) + if (flag_name != flags.FLAGS[flag_name].short_name and + flag_value != flags.FLAGS[flag_name].default): + nondefault_flags[flag_name] = flag_value + return nondefault_flags + + +def get_nondefault_flags_as_str(): + """Returns flags as a string that can be passed as command line arguments. + + E.g., returns: "--batch_size=256 --use_synthetic_data" for the following code + block: + + ``` + flags.FLAGS.batch_size = 256 + flags.FLAGS.use_synthetic_data = True + print(get_nondefault_flags_as_str()) + ``` + + Only flags with nondefault values are returned, as passing default flags as + command line arguments has no effect. + + Returns: + A string with the flags, that can be passed as command line arguments to a + program to use the flags. + """ + nondefault_flags = _get_nondefault_flags_as_dict() + flag_strings = [] + for name, value in sorted(nondefault_flags.items()): + if isinstance(value, bool): + flag_str = '--{}'.format(name) if value else '--no{}'.format(name) + elif isinstance(value, list): + flag_str = '--{}={}'.format(name, ','.join(value)) + else: + flag_str = '--{}={}'.format(name, value) + flag_strings.append(flag_str) + return ' '.join(shlex_quote(flag_str) for flag_str in flag_strings) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/flags_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/flags_test.py new file mode 100644 index 0000000..e11a164 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/flags_test.py @@ -0,0 +1,162 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import unittest + +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core # pylint: disable=g-bad-import-order + + +def define_flags(): + flags_core.define_base(clean=True, num_gpu=False, stop_threshold=True, + hooks=True, train_epochs=True, + epochs_between_evals=True) + flags_core.define_performance( + num_parallel_calls=True, inter_op=True, intra_op=True, + dynamic_loss_scale=True, loss_scale=True, synthetic_data=True, + dtype=True) + flags_core.define_image() + flags_core.define_benchmark() + + +class BaseTester(unittest.TestCase): + + @classmethod + def setUpClass(cls): + super(BaseTester, cls).setUpClass() + define_flags() + + def test_default_setting(self): + """Test to ensure fields exist and defaults can be set. + """ + + defaults = dict( + data_dir="dfgasf", + model_dir="dfsdkjgbs", + train_epochs=534, + epochs_between_evals=15, + batch_size=256, + hooks=["LoggingTensorHook"], + num_parallel_calls=18, + inter_op_parallelism_threads=5, + intra_op_parallelism_threads=10, + data_format="channels_first" + ) + + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + for key, value in defaults.items(): + assert flags.FLAGS.get_flag_value(name=key, default=None) == value + + def test_benchmark_setting(self): + defaults = dict( + hooks=["LoggingMetricHook"], + benchmark_log_dir="/tmp/12345", + gcp_project="project_abc", + ) + + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + for key, value in defaults.items(): + assert flags.FLAGS.get_flag_value(name=key, default=None) == value + + def test_booleans(self): + """Test to ensure boolean flags trigger as expected. + """ + + flags_core.parse_flags([__file__, "--use_synthetic_data"]) + + assert flags.FLAGS.use_synthetic_data + + def test_parse_dtype_info(self): + flags_core.parse_flags([__file__, "--dtype", "fp16"]) + self.assertEqual(flags_core.get_tf_dtype(flags.FLAGS), tf.float16) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 2) + + flags_core.parse_flags( + [__file__, "--dtype", "fp16", "--loss_scale", "5"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 5) + + flags_core.parse_flags( + [__file__, "--dtype", "fp16", "--loss_scale", "dynamic"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), "dynamic") + + flags_core.parse_flags([__file__, "--dtype", "fp32"]) + self.assertEqual(flags_core.get_tf_dtype(flags.FLAGS), tf.float32) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 1) + + flags_core.parse_flags([__file__, "--dtype", "fp32", "--loss_scale", "5"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 5) + + + with self.assertRaises(SystemExit): + flags_core.parse_flags([__file__, "--dtype", "int8"]) + + with self.assertRaises(SystemExit): + flags_core.parse_flags([__file__, "--dtype", "fp16", + "--loss_scale", "abc"]) + + def test_get_nondefault_flags_as_str(self): + defaults = dict( + clean=True, + data_dir="abc", + hooks=["LoggingTensorHook"], + stop_threshold=1.5, + use_synthetic_data=False + ) + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + expected_flags = "" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.clean = False + expected_flags += "--noclean" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.data_dir = "xyz" + expected_flags += " --data_dir=xyz" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.hooks = ["aaa", "bbb", "ccc"] + expected_flags += " --hooks=aaa,bbb,ccc" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.stop_threshold = 3. + expected_flags += " --stop_threshold=3.0" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.use_synthetic_data = True + expected_flags += " --use_synthetic_data" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + # Assert that explicit setting a flag to its default value does not cause it + # to appear in the string + flags.FLAGS.use_synthetic_data = False + expected_flags = expected_flags[:-len(" --use_synthetic_data")] + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + +if __name__ == "__main__": + unittest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/guidelines.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/guidelines.md new file mode 100644 index 0000000..db963aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/flags/guidelines.md @@ -0,0 +1,65 @@ +# Using flags in official models + +1. **All common flags must be incorporated in the models.** + + Common flags (i.e. batch_size, model_dir, etc.) are provided by various flag definition functions, + and channeled through `official.utils.flags.core`. For instance to define common supervised + learning parameters one could use the following code: + + ```$xslt + from absl import app as absl_app + from absl import flags + + from official.utils.flags import core as flags_core + + + def define_flags(): + flags_core.define_base() + flags.adopt_key_flags(flags_core) + + + def main(_): + flags_obj = flags.FLAGS + print(flags_obj) + + + if __name__ == "__main__" + absl_app.run(main) + ``` +2. **Validate flag values.** + + See the [Validators](#validators) section for implementation details. + + Validators in the official model repo should not access the file system, such as verifying + that files exist, due to the strict ordering requirements. + +3. **Flag values should not be mutated.** + + Instead of mutating flag values, use getter functions to return the desired values. An example + getter function is `get_tf_dtype` function below: + + ``` + # Map string to TensorFlow dtype + DTYPE_MAP = { + "fp16": tf.float16, + "fp32": tf.float32, + } + + def get_tf_dtype(flags_obj): + if getattr(flags_obj, "fp16_implementation", None) == "graph_rewrite": + # If the graph_rewrite is used, we build the graph with fp32, and let the + # graph rewrite change ops to fp16. + return tf.float32 + return DTYPE_MAP[flags_obj.dtype] + + + def main(_): + flags_obj = flags.FLAGS() + + # Do not mutate flags_obj + # if flags_obj.fp16_implementation == "graph_rewrite": + # flags_obj.dtype = "float32" # Don't do this + + print(get_tf_dtype(flags_obj)) + ... + ``` \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/hyperparams_flags.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/hyperparams_flags.py new file mode 100644 index 0000000..3f51b08 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/hyperparams_flags.py @@ -0,0 +1,120 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common flags for importing hyperparameters.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import flags +from official.utils.flags import core as flags_core + +FLAGS = flags.FLAGS + + +def define_common_hparams_flags(): + """Define the common flags across models.""" + + flags.DEFINE_string( + 'model_dir', + default=None, + help=('The directory where the model and training/evaluation summaries' + 'are stored.')) + + flags.DEFINE_integer( + 'train_batch_size', default=None, help='Batch size for training.') + + flags.DEFINE_integer( + 'eval_batch_size', default=None, help='Batch size for evaluation.') + + flags.DEFINE_string( + 'precision', + default=None, + help=('Precision to use; one of: {bfloat16, float32}')) + + flags.DEFINE_string( + 'config_file', + default=None, + help=('A YAML file which specifies overrides. Note that this file can be ' + 'used as an override template to override the default parameters ' + 'specified in Python. If the same parameter is specified in both ' + '`--config_file` and `--params_override`, the one in ' + '`--params_override` will be used finally.')) + + flags.DEFINE_string( + 'params_override', + default=None, + help=('a YAML/JSON string or a YAML file which specifies additional ' + 'overrides over the default parameters and those specified in ' + '`--config_file`. Note that this is supposed to be used only to ' + 'override the model parameters, but not the parameters like TPU ' + 'specific flags. One canonical use case of `--config_file` and ' + '`--params_override` is users first define a template config file ' + 'using `--config_file`, then use `--params_override` to adjust the ' + 'minimal set of tuning parameters, for example setting up different' + ' `train_batch_size`. ' + 'The final override order of parameters: default_model_params --> ' + 'params from config_file --> params in params_override.' + 'See also the help message of `--config_file`.')) + flags.DEFINE_integer('save_checkpoint_freq', None, + 'Number of steps to save checkpoint.') + + +def initialize_common_flags(): + """Define the common flags across models.""" + define_common_hparams_flags() + + flags_core.define_device(tpu=True) + flags_core.define_base( + num_gpu=True, model_dir=False, data_dir=False, batch_size=False) + flags_core.define_distribution(worker_hosts=True, task_index=True) + flags_core.define_performance(all_reduce_alg=True, num_packs=True) + + # Reset the default value of num_gpus to zero. + FLAGS.num_gpus = 0 + + flags.DEFINE_string( + 'strategy_type', 'mirrored', 'Type of distribute strategy.' + 'One of mirrored, tpu and multiworker.') + + +def strategy_flags_dict(): + """Returns TPU and/or GPU related flags in a dictionary.""" + return { + 'distribution_strategy': FLAGS.strategy_type, + # TPUStrategy related flags. + 'tpu': FLAGS.tpu, + # MultiWorkerMirroredStrategy related flags. + 'all_reduce_alg': FLAGS.all_reduce_alg, + 'worker_hosts': FLAGS.worker_hosts, + 'task_index': FLAGS.task_index, + # MirroredStrategy and OneDeviceStrategy + 'num_gpus': FLAGS.num_gpus, + 'num_packs': FLAGS.num_packs, + } + + +def hparam_flags_dict(): + """Returns model params related flags in a dictionary.""" + return { + 'data_dir': FLAGS.data_dir, + 'model_dir': FLAGS.model_dir, + 'train_batch_size': FLAGS.train_batch_size, + 'eval_batch_size': FLAGS.eval_batch_size, + 'precision': FLAGS.precision, + 'config_file': FLAGS.config_file, + 'params_override': FLAGS.params_override, + } diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib.py new file mode 100644 index 0000000..a2d9bd3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib.py @@ -0,0 +1,34 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Utilities that interact with cloud service. +""" + +import requests + +GCP_METADATA_URL = "http://metadata/computeMetadata/v1/instance/hostname" +GCP_METADATA_HEADER = {"Metadata-Flavor": "Google"} + + +def on_gcp(): + """Detect whether the current running environment is on GCP.""" + try: + # Timeout in 5 seconds, in case the test environment has connectivity issue. + # There is not default timeout, which means it might block forever. + response = requests.get( + GCP_METADATA_URL, headers=GCP_METADATA_HEADER, timeout=5) + return response.status_code == 200 + except requests.exceptions.RequestException: + return False diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib_test.py new file mode 100644 index 0000000..901576d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/cloud_lib_test.py @@ -0,0 +1,48 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for cloud_lib.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import mock +import requests + +from official.utils.logs import cloud_lib + + +class CloudLibTest(unittest.TestCase): + + @mock.patch("requests.get") + def test_on_gcp(self, mock_requests_get): + mock_response = mock.MagicMock() + mock_requests_get.return_value = mock_response + mock_response.status_code = 200 + + self.assertEqual(cloud_lib.on_gcp(), True) + + @mock.patch("requests.get") + def test_not_on_gcp(self, mock_requests_get): + mock_requests_get.side_effect = requests.exceptions.ConnectionError() + + self.assertEqual(cloud_lib.on_gcp(), False) + + +if __name__ == "__main__": + unittest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/guidelines.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/guidelines.md new file mode 100644 index 0000000..408c3cd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/guidelines.md @@ -0,0 +1,58 @@ +# Logging in official models + +This library adds logging functions that print or save tensor values. Official models should define all common hooks +(using hooks helper) and a benchmark logger. + +1. **Training Hooks** + + Hooks are a TensorFlow concept that define specific actions at certain points of the execution. We use them to obtain and log + tensor values during training. + + hooks_helper.py provides an easy way to create common hooks. The following hooks are currently defined: + * LoggingTensorHook: Logs tensor values + * ProfilerHook: Writes a timeline json that can be loaded into chrome://tracing. + * ExamplesPerSecondHook: Logs the number of examples processed per second. + * LoggingMetricHook: Similar to LoggingTensorHook, except that the tensors are logged in a format defined by our data + anaylsis pipeline. + + +2. **Benchmarks** + + The benchmark logger provides useful functions for logging environment information, and evaluation results. + The module also contains a context which is used to update the status of the run. + +Example usage: + +``` +from absl import app as absl_app + +from official.utils.logs import hooks_helper +from official.utils.logs import logger + +def model_main(flags_obj): + estimator = ... + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info(...) + + train_hooks = hooks_helper.get_train_hooks(...) + + for epoch in range(10): + estimator.train(..., hooks=train_hooks) + eval_results = estimator.evaluate(...) + + # Log a dictionary of metrics + benchmark_logger.log_evaluation_result(eval_results) + + # Log an individual metric + benchmark_logger.log_metric(...) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + model_main(flags.FLAGS) + +if __name__ == "__main__": + # define flags + absl_app.run(main) +``` diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks.py new file mode 100644 index 0000000..e0a0a37 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks.py @@ -0,0 +1,148 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Hook that counts examples per second every N steps or seconds.""" + + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from hccl.manage.api import get_rank_size + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import logger +from benchmark_log import hwlog +import datetime +import time +import os +import sys + + +class ExamplesPerSecondHook(tf.estimator.SessionRunHook): + """Hook to print out examples per second. + + Total time is tracked and then divided by the total number of steps + to get the average step time and then batch_size is used to determine + the running average of examples per second. The examples per second for the + most recent interval is also logged. + """ + + def __init__(self, + batch_size, + every_n_steps=None, + every_n_secs=None, + warm_steps=0, + metric_logger=None): + """Initializer for ExamplesPerSecondHook. + + Args: + batch_size: Total batch size across all workers used to calculate + examples/second from global time. + every_n_steps: Log stats every n steps. + every_n_secs: Log stats every n seconds. Exactly one of the + `every_n_steps` or `every_n_secs` should be set. + warm_steps: The number of steps to be skipped before logging and running + average calculation. warm_steps steps refers to global steps across all + workers, not on each worker + metric_logger: instance of `BenchmarkLogger`, the benchmark logger that + hook should use to write the log. If None, BaseBenchmarkLogger will + be used. + + Raises: + ValueError: if neither `every_n_steps` or `every_n_secs` is set, or + both are set. + """ + if (every_n_steps is None) == (every_n_secs is None): + raise ValueError("exactly one of every_n_steps" + " and every_n_secs should be provided.") + + self._logger = metric_logger or logger.BaseBenchmarkLogger() + + self._timer = tf.estimator.SecondOrStepTimer( + every_steps=every_n_steps, every_secs=every_n_secs) + + self._step_train_time = 0 + self._total_steps = 0 + self._batch_size = batch_size + self._warm_steps = warm_steps + # List of examples per second logged every_n_steps. + self.current_examples_per_sec_list = [] + + def begin(self): + """Called once before using the session to check global step.""" + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook begin") + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + "Global step should be created to use StepCounterHook.") + + def before_run(self, run_context): # pylint: disable=unused-argument + """Called before each call to run(). + + Args: + run_context: A SessionRunContext object. + + Returns: + A SessionRunArgs object or None if never triggered. + """ + self.t0 = time.time() + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook before") + return tf.estimator.SessionRunArgs(self._global_step_tensor) + + def after_run(self, run_context, run_values): # pylint: disable=unused-argument + """Called after each call to run(). + + Args: + run_context: A SessionRunContext object. + run_values: A SessionRunValues object. + """ + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook after_run") + global_step = run_values.results + + #if self._timer.should_trigger_for_step( + #global_step) and global_step > self._warm_steps: + elapsed_time, elapsed_steps = self._timer.update_last_triggered_step( + global_step) + batch_time = time.time() - self.t0 + ips = self._batch_size/batch_time #有问题,应该与FPS一个意思,ips还要乘以iterations_per_loop在乘以rank_size: ips=ips*iterations_per_loop*rank_size + if elapsed_time is not None: + self._step_train_time += elapsed_time + self._total_steps += elapsed_steps + + # average examples per second is based on the total (accumulative) + # training steps and training time so far + average_examples_per_sec = self._batch_size * ( + self._total_steps / self._step_train_time) + # current examples per second is based on the elapsed training steps + # and training time per batch + current_examples_per_sec = self._batch_size * get_rank_size() * ( + elapsed_steps / elapsed_time) + # Logs entries to be read from hook during or after run. + self.current_examples_per_sec_list.append(current_examples_per_sec) + self._logger.log_metric( + "average_examples_per_sec", average_examples_per_sec, + global_step=global_step) + + self._logger.log_metric( + "current_examples_per_sec", current_examples_per_sec, + global_step=global_step) + tf.compat.v1.logging.warning( + "steps: %s,elapsed_steps:%d,batch:%d,FPS:%f,ips:%f,batch_time:%f", int(self._total_steps), + int(elapsed_steps),int(self._batch_size),float(current_examples_per_sec),float(ips), + float(batch_time)) + hwlog.remark_print(key=hwlog.FPS, value=float(current_examples_per_sec)) + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_bak.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_bak.py new file mode 100644 index 0000000..64743b7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_bak.py @@ -0,0 +1,130 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Hook that counts examples per second every N steps or seconds.""" + + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import logger + + +class ExamplesPerSecondHook(tf.estimator.SessionRunHook): + """Hook to print out examples per second. + + Total time is tracked and then divided by the total number of steps + to get the average step time and then batch_size is used to determine + the running average of examples per second. The examples per second for the + most recent interval is also logged. + """ + + def __init__(self, + batch_size, + every_n_steps=None, + every_n_secs=None, + warm_steps=0, + metric_logger=None): + """Initializer for ExamplesPerSecondHook. + + Args: + batch_size: Total batch size across all workers used to calculate + examples/second from global time. + every_n_steps: Log stats every n steps. + every_n_secs: Log stats every n seconds. Exactly one of the + `every_n_steps` or `every_n_secs` should be set. + warm_steps: The number of steps to be skipped before logging and running + average calculation. warm_steps steps refers to global steps across all + workers, not on each worker + metric_logger: instance of `BenchmarkLogger`, the benchmark logger that + hook should use to write the log. If None, BaseBenchmarkLogger will + be used. + + Raises: + ValueError: if neither `every_n_steps` or `every_n_secs` is set, or + both are set. + """ + + if (every_n_steps is None) == (every_n_secs is None): + raise ValueError("exactly one of every_n_steps" + " and every_n_secs should be provided.") + + self._logger = metric_logger or logger.BaseBenchmarkLogger() + + self._timer = tf.estimator.SecondOrStepTimer( + every_steps=every_n_steps, every_secs=every_n_secs) + + self._step_train_time = 0 + self._total_steps = 0 + self._batch_size = batch_size + self._warm_steps = warm_steps + # List of examples per second logged every_n_steps. + self.current_examples_per_sec_list = [] + + def begin(self): + """Called once before using the session to check global step.""" + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + "Global step should be created to use StepCounterHook.") + + def before_run(self, run_context): # pylint: disable=unused-argument + """Called before each call to run(). + + Args: + run_context: A SessionRunContext object. + + Returns: + A SessionRunArgs object or None if never triggered. + """ + return tf.estimator.SessionRunArgs(self._global_step_tensor) + + def after_run(self, run_context, run_values): # pylint: disable=unused-argument + """Called after each call to run(). + + Args: + run_context: A SessionRunContext object. + run_values: A SessionRunValues object. + """ + global_step = run_values.results + + if self._timer.should_trigger_for_step( + global_step) and global_step > self._warm_steps: + elapsed_time, elapsed_steps = self._timer.update_last_triggered_step( + global_step) + if elapsed_time is not None: + self._step_train_time += elapsed_time + self._total_steps += elapsed_steps + + # average examples per second is based on the total (accumulative) + # training steps and training time so far + average_examples_per_sec = self._batch_size * ( + self._total_steps / self._step_train_time) + # current examples per second is based on the elapsed training steps + # and training time per batch + current_examples_per_sec = self._batch_size * ( + elapsed_steps / elapsed_time) + # Logs entries to be read from hook during or after run. + self.current_examples_per_sec_list.append(current_examples_per_sec) + self._logger.log_metric( + "average_examples_per_sec", average_examples_per_sec, + global_step=global_step) + + self._logger.log_metric( + "current_examples_per_sec", current_examples_per_sec, + global_step=global_step) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper.py new file mode 100644 index 0000000..aa0e100 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper.py @@ -0,0 +1,172 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Hooks helper to return a list of TensorFlow hooks for training by name. + +More hooks can be added to this set. To add a new hook, 1) add the new hook to +the registry in HOOKS, 2) add a corresponding function that parses out necessary +parameters. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks +from official.utils.logs import logger +from official.utils.logs import metric_hook + +_TENSORS_TO_LOG = dict((x, x) for x in ['learning_rate', + 'cross_entropy', + 'train_accuracy']) + + +def get_train_hooks(name_list, use_tpu=False, **kwargs): + """Factory for getting a list of TensorFlow hooks for training by name. + + Args: + name_list: a list of strings to name desired hook classes. Allowed: + LoggingTensorHook, ProfilerHook, ExamplesPerSecondHook, which are defined + as keys in HOOKS + use_tpu: Boolean of whether computation occurs on a TPU. This will disable + hooks altogether. + **kwargs: a dictionary of arguments to the hooks. + + Returns: + list of instantiated hooks, ready to be used in a classifier.train call. + + Raises: + ValueError: if an unrecognized name is passed. + """ + + if not name_list: + return [] + + if use_tpu: + tf.compat.v1.logging.warning('hooks_helper received name_list `{}`, but a ' + 'TPU is specified. No hooks will be used.' + .format(name_list)) + return [] + + train_hooks = [] + for name in name_list: + hook_name = HOOKS.get(name.strip().lower()) + if hook_name is None: + raise ValueError('Unrecognized training hook requested: {}'.format(name)) + else: + train_hooks.append(hook_name(**kwargs)) + + return train_hooks + + +def get_logging_tensor_hook(every_n_iter=100, tensors_to_log=None, **kwargs): # pylint: disable=unused-argument + """Function to get LoggingTensorHook. + + Args: + every_n_iter: `int`, print the values of `tensors` once every N local + steps taken on the current worker. + tensors_to_log: List of tensor names or dictionary mapping labels to tensor + names. If not set, log _TENSORS_TO_LOG by default. + **kwargs: a dictionary of arguments to LoggingTensorHook. + + Returns: + Returns a LoggingTensorHook with a standard set of tensors that will be + printed to stdout. + """ + if tensors_to_log is None: + tensors_to_log = _TENSORS_TO_LOG + + return tf.estimator.LoggingTensorHook( + tensors=tensors_to_log, + every_n_iter=every_n_iter) + + +def get_profiler_hook(model_dir, save_steps=1000, **kwargs): # pylint: disable=unused-argument + """Function to get ProfilerHook. + + Args: + model_dir: The directory to save the profile traces to. + save_steps: `int`, print profile traces every N steps. + **kwargs: a dictionary of arguments to ProfilerHook. + + Returns: + Returns a ProfilerHook that writes out timelines that can be loaded into + profiling tools like chrome://tracing. + """ + return tf.estimator.ProfilerHook(save_steps=save_steps, output_dir=model_dir) + + +def get_examples_per_second_hook(every_n_steps=100, + batch_size=128, + warm_steps=5, + **kwargs): # pylint: disable=unused-argument + """Function to get ExamplesPerSecondHook. + + Args: + every_n_steps: `int`, print current and average examples per second every + N steps. + batch_size: `int`, total batch size used to calculate examples/second from + global time. + warm_steps: skip this number of steps before logging and running average. + **kwargs: a dictionary of arguments to ExamplesPerSecondHook. + + Returns: + Returns a ProfilerHook that writes out timelines that can be loaded into + profiling tools like chrome://tracing. + """ + return hooks.ExamplesPerSecondHook( + batch_size=batch_size, every_n_steps=every_n_steps, + warm_steps=warm_steps, metric_logger=logger.get_benchmark_logger()) + + +def get_logging_metric_hook(tensors_to_log=None, + every_n_secs=60, + **kwargs): # pylint: disable=unused-argument + """Function to get LoggingMetricHook. + + Args: + tensors_to_log: List of tensor names or dictionary mapping labels to tensor + names. If not set, log _TENSORS_TO_LOG by default. + every_n_secs: `int`, the frequency for logging the metric. Default to every + 10 mins. + **kwargs: a dictionary of arguments. + + Returns: + Returns a LoggingMetricHook that saves tensor values in a JSON format. + """ + if tensors_to_log is None: + tensors_to_log = _TENSORS_TO_LOG + return metric_hook.LoggingMetricHook( + tensors=tensors_to_log, + metric_logger=logger.get_benchmark_logger(), + every_n_secs=every_n_secs) + + +def get_step_counter_hook(**kwargs): + """Function to get StepCounterHook.""" + del kwargs + return tf.estimator.StepCounterHook() + + +# A dictionary to map one hook name and its corresponding function +HOOKS = { + 'loggingtensorhook': get_logging_tensor_hook, + 'profilerhook': get_profiler_hook, + 'examplespersecondhook': get_examples_per_second_hook, + 'loggingmetrichook': get_logging_metric_hook, + 'stepcounterhook': get_step_counter_hook +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper_test.py new file mode 100644 index 0000000..693311b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_helper_test.py @@ -0,0 +1,73 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for hooks_helper.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks_helper +from official.utils.misc import keras_utils + + +class BaseTest(unittest.TestCase): + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def test_raise_in_non_list_names(self): + with self.assertRaises(ValueError): + hooks_helper.get_train_hooks( + 'LoggingTensorHook, ProfilerHook', model_dir="", batch_size=256) + + def test_raise_in_invalid_names(self): + invalid_names = ['StepCounterHook', 'StopAtStepHook'] + with self.assertRaises(ValueError): + hooks_helper.get_train_hooks(invalid_names, model_dir="", batch_size=256) + + def validate_train_hook_name(self, + test_hook_name, + expected_hook_name, + **kwargs): + returned_hook = hooks_helper.get_train_hooks( + [test_hook_name], model_dir="", **kwargs) + self.assertEqual(len(returned_hook), 1) + self.assertIsInstance(returned_hook[0], tf.estimator.SessionRunHook) + self.assertEqual(returned_hook[0].__class__.__name__.lower(), + expected_hook_name) + + def test_get_train_hooks_logging_tensor_hook(self): + self.validate_train_hook_name('LoggingTensorHook', 'loggingtensorhook') + + def test_get_train_hooks_profiler_hook(self): + self.validate_train_hook_name('ProfilerHook', 'profilerhook') + + def test_get_train_hooks_examples_per_second_hook(self): + self.validate_train_hook_name('ExamplesPerSecondHook', + 'examplespersecondhook') + + def test_get_logging_metric_hook(self): + test_hook_name = 'LoggingMetricHook' + self.validate_train_hook_name(test_hook_name, 'loggingmetrichook') + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_test.py new file mode 100644 index 0000000..adbc0a2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/hooks_test.py @@ -0,0 +1,159 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for hooks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import time + +from absl import logging +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks +from official.utils.testing import mock_lib + +logging.set_verbosity(logging.DEBUG) + + +class ExamplesPerSecondHookTest(tf.test.TestCase): + """Tests for the ExamplesPerSecondHook. + + In the test, we explicitly run global_step tensor after train_op in order to + keep the global_step value and the train_op (which increase the glboal_step + by 1) consistent. This is to correct the discrepancies in reported global_step + value when running on GPUs. + """ + + def setUp(self): + """Mock out logging calls to verify if correct info is being monitored.""" + self._logger = mock_lib.MockBenchmarkLogger() + + self.graph = tf.Graph() + with self.graph.as_default(): + tf.compat.v1.train.create_global_step() + self.train_op = tf.compat.v1.assign_add( + tf.compat.v1.train.get_global_step(), 1) + self.global_step = tf.compat.v1.train.get_global_step() + + def test_raise_in_both_secs_and_steps(self): + with self.assertRaises(ValueError): + hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=10, + every_n_secs=20, + metric_logger=self._logger) + + def test_raise_in_none_secs_and_steps(self): + with self.assertRaises(ValueError): + hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=None, + every_n_secs=None, + metric_logger=self._logger) + + def _validate_log_every_n_steps(self, every_n_steps, warm_steps): + hook = hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=every_n_steps, + warm_steps=warm_steps, + metric_logger=self._logger) + + with tf.compat.v1.train.MonitoredSession( + tf.compat.v1.train.ChiefSessionCreator(), [hook]) as mon_sess: + for _ in range(every_n_steps): + # Explicitly run global_step after train_op to get the accurate + # global_step value + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + + mon_sess.run(self.train_op) + global_step_val = mon_sess.run(self.global_step) + + if global_step_val > warm_steps: + self._assert_metrics() + else: + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + + # Add additional run to verify proper reset when called multiple times. + prev_log_len = len(self._logger.logged_metric) + mon_sess.run(self.train_op) + global_step_val = mon_sess.run(self.global_step) + + if every_n_steps == 1 and global_step_val > warm_steps: + # Each time, we log two additional metrics. Did exactly 2 get added? + self.assertEqual(len(self._logger.logged_metric), prev_log_len + 2) + else: + # No change in the size of the metric list. + self.assertEqual(len(self._logger.logged_metric), prev_log_len) + + def test_examples_per_sec_every_1_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(1, 0) + + def test_examples_per_sec_every_5_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(5, 0) + + def test_examples_per_sec_every_1_steps_with_warm_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(1, 10) + + def test_examples_per_sec_every_5_steps_with_warm_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(5, 10) + + def _validate_log_every_n_secs(self, every_n_secs): + hook = hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=None, + every_n_secs=every_n_secs, + metric_logger=self._logger) + + with tf.compat.v1.train.MonitoredSession( + tf.compat.v1.train.ChiefSessionCreator(), [hook]) as mon_sess: + # Explicitly run global_step after train_op to get the accurate + # global_step value + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + time.sleep(every_n_secs) + + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + self._assert_metrics() + + def test_examples_per_sec_every_1_secs(self): + with self.graph.as_default(): + self._validate_log_every_n_secs(1) + + def test_examples_per_sec_every_5_secs(self): + with self.graph.as_default(): + self._validate_log_every_n_secs(5) + + def _assert_metrics(self): + metrics = self._logger.logged_metric + self.assertEqual(metrics[-2]["name"], "average_examples_per_sec") + self.assertEqual(metrics[-1]["name"], "current_examples_per_sec") + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger.py new file mode 100644 index 0000000..398aa8a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger.py @@ -0,0 +1,423 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Logging utilities for benchmark. + +For collecting local environment metrics like CPU and memory, certain python +packages need be installed. See README for details. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import contextlib +import datetime +import json +import multiprocessing +import numbers +import os +import threading +import uuid + +from six.moves import _thread as thread +from absl import flags +import tensorflow as tf +from tensorflow.python.client import device_lib + +from official.utils.logs import cloud_lib + +METRIC_LOG_FILE_NAME = "metric.log" +BENCHMARK_RUN_LOG_FILE_NAME = "benchmark_run.log" +_DATE_TIME_FORMAT_PATTERN = "%Y-%m-%dT%H:%M:%S.%fZ" +GCP_TEST_ENV = "GCP" +RUN_STATUS_SUCCESS = "success" +RUN_STATUS_FAILURE = "failure" +RUN_STATUS_RUNNING = "running" + + +FLAGS = flags.FLAGS + +# Don't use it directly. Use get_benchmark_logger to access a logger. +_benchmark_logger = None +_logger_lock = threading.Lock() + + +def config_benchmark_logger(flag_obj=None): + """Config the global benchmark logger.""" + _logger_lock.acquire() + try: + global _benchmark_logger + if not flag_obj: + flag_obj = FLAGS + + if (not hasattr(flag_obj, "benchmark_logger_type") or + flag_obj.benchmark_logger_type == "BaseBenchmarkLogger"): + _benchmark_logger = BaseBenchmarkLogger() + elif flag_obj.benchmark_logger_type == "BenchmarkFileLogger": + _benchmark_logger = BenchmarkFileLogger(flag_obj.benchmark_log_dir) + elif flag_obj.benchmark_logger_type == "BenchmarkBigQueryLogger": + from official.benchmark import benchmark_uploader as bu # pylint: disable=g-import-not-at-top + bq_uploader = bu.BigQueryUploader(gcp_project=flag_obj.gcp_project) + _benchmark_logger = BenchmarkBigQueryLogger( + bigquery_uploader=bq_uploader, + bigquery_data_set=flag_obj.bigquery_data_set, + bigquery_run_table=flag_obj.bigquery_run_table, + bigquery_run_status_table=flag_obj.bigquery_run_status_table, + bigquery_metric_table=flag_obj.bigquery_metric_table, + run_id=str(uuid.uuid4())) + else: + raise ValueError("Unrecognized benchmark_logger_type: %s" + % flag_obj.benchmark_logger_type) + + finally: + _logger_lock.release() + return _benchmark_logger + + +def get_benchmark_logger(): + if not _benchmark_logger: + config_benchmark_logger() + return _benchmark_logger + + +@contextlib.contextmanager +def benchmark_context(flag_obj): + """Context of benchmark, which will update status of the run accordingly.""" + benchmark_logger = config_benchmark_logger(flag_obj) + try: + yield + benchmark_logger.on_finish(RUN_STATUS_SUCCESS) + except Exception: # pylint: disable=broad-except + # Catch all the exception, update the run status to be failure, and re-raise + benchmark_logger.on_finish(RUN_STATUS_FAILURE) + raise + + +class BaseBenchmarkLogger(object): + """Class to log the benchmark information to STDOUT.""" + + def log_evaluation_result(self, eval_results): + """Log the evaluation result. + + The evaluate result is a dictionary that contains metrics defined in + model_fn. It also contains a entry for global_step which contains the value + of the global step when evaluation was performed. + + Args: + eval_results: dict, the result of evaluate. + """ + if not isinstance(eval_results, dict): + tf.compat.v1.logging.warning( + "eval_results should be dictionary for logging. Got %s", + type(eval_results)) + return + global_step = eval_results[tf.compat.v1.GraphKeys.GLOBAL_STEP] + for key in sorted(eval_results): + if key != tf.compat.v1.GraphKeys.GLOBAL_STEP: + self.log_metric(key, eval_results[key], global_step=global_step) + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to local file. + + Currently the logging is done in a synchronized way. This should be updated + to log asynchronously. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + tf.compat.v1.logging.info("Benchmark metric: %s", metric) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + tf.compat.v1.logging.info( + "Benchmark run: %s", _gather_run_info(model_name, dataset_name, + run_params, test_id)) + + def on_finish(self, status): + pass + + +class BenchmarkFileLogger(BaseBenchmarkLogger): + """Class to log the benchmark information to local disk.""" + + def __init__(self, logging_dir): + super(BenchmarkFileLogger, self).__init__() + self._logging_dir = logging_dir + if not tf.io.gfile.isdir(self._logging_dir): + tf.io.gfile.makedirs(self._logging_dir) + self._metric_file_handler = tf.io.gfile.GFile( + os.path.join(self._logging_dir, METRIC_LOG_FILE_NAME), "a") + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to local file. + + Currently the logging is done in a synchronized way. This should be updated + to log asynchronously. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + try: + json.dump(metric, self._metric_file_handler) + self._metric_file_handler.write("\n") + self._metric_file_handler.flush() + except (TypeError, ValueError) as e: + tf.compat.v1.logging.warning( + "Failed to dump metric to log file: name %s, value %s, error %s", + name, value, e) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + """Collect most of the TF runtime information for the local env. + + The schema of the run info follows official/benchmark/datastore/schema. + + Args: + model_name: string, the name of the model. + dataset_name: string, the name of dataset for training and evaluation. + run_params: dict, the dictionary of parameters for the run, it could + include hyperparameters or other params that are important for the run. + test_id: string, the unique name of the test run by the combination of key + parameters, eg batch size, num of GPU. It is hardware independent. + """ + run_info = _gather_run_info(model_name, dataset_name, run_params, test_id) + + with tf.io.gfile.GFile(os.path.join( + self._logging_dir, BENCHMARK_RUN_LOG_FILE_NAME), "w") as f: + try: + json.dump(run_info, f) + f.write("\n") + except (TypeError, ValueError) as e: + tf.compat.v1.logging.warning( + "Failed to dump benchmark run info to log file: %s", e) + + def on_finish(self, status): + self._metric_file_handler.flush() + self._metric_file_handler.close() + + +class BenchmarkBigQueryLogger(BaseBenchmarkLogger): + """Class to log the benchmark information to BigQuery data store.""" + + def __init__(self, + bigquery_uploader, + bigquery_data_set, + bigquery_run_table, + bigquery_run_status_table, + bigquery_metric_table, + run_id): + super(BenchmarkBigQueryLogger, self).__init__() + self._bigquery_uploader = bigquery_uploader + self._bigquery_data_set = bigquery_data_set + self._bigquery_run_table = bigquery_run_table + self._bigquery_run_status_table = bigquery_run_status_table + self._bigquery_metric_table = bigquery_metric_table + self._run_id = run_id + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to bigquery. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + # Starting new thread for bigquery upload in case it might take long time + # and impact the benchmark and performance measurement. Starting a new + # thread might have potential performance impact for model that run on + # CPU. + thread.start_new_thread( + self._bigquery_uploader.upload_benchmark_metric_json, + (self._bigquery_data_set, + self._bigquery_metric_table, + self._run_id, + [metric])) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + """Collect most of the TF runtime information for the local env. + + The schema of the run info follows official/benchmark/datastore/schema. + + Args: + model_name: string, the name of the model. + dataset_name: string, the name of dataset for training and evaluation. + run_params: dict, the dictionary of parameters for the run, it could + include hyperparameters or other params that are important for the run. + test_id: string, the unique name of the test run by the combination of key + parameters, eg batch size, num of GPU. It is hardware independent. + """ + run_info = _gather_run_info(model_name, dataset_name, run_params, test_id) + # Starting new thread for bigquery upload in case it might take long time + # and impact the benchmark and performance measurement. Starting a new + # thread might have potential performance impact for model that run on CPU. + thread.start_new_thread( + self._bigquery_uploader.upload_benchmark_run_json, + (self._bigquery_data_set, + self._bigquery_run_table, + self._run_id, + run_info)) + thread.start_new_thread( + self._bigquery_uploader.insert_run_status, + (self._bigquery_data_set, + self._bigquery_run_status_table, + self._run_id, + RUN_STATUS_RUNNING)) + + def on_finish(self, status): + self._bigquery_uploader.update_run_status( + self._bigquery_data_set, + self._bigquery_run_status_table, + self._run_id, + status) + + +def _gather_run_info(model_name, dataset_name, run_params, test_id): + """Collect the benchmark run information for the local environment.""" + run_info = { + "model_name": model_name, + "dataset": {"name": dataset_name}, + "machine_config": {}, + "test_id": test_id, + "run_date": datetime.datetime.utcnow().strftime( + _DATE_TIME_FORMAT_PATTERN)} + _collect_tensorflow_info(run_info) + _collect_tensorflow_environment_variables(run_info) + _collect_run_params(run_info, run_params) + _collect_cpu_info(run_info) + _collect_memory_info(run_info) + _collect_test_environment(run_info) + return run_info + + +def _process_metric_to_json( + name, value, unit=None, global_step=None, extras=None): + """Validate the metric data and generate JSON for insert.""" + if not isinstance(value, numbers.Number): + tf.compat.v1.logging.warning( + "Metric value to log should be a number. Got %s", type(value)) + return None + + extras = _convert_to_json_dict(extras) + return { + "name": name, + "value": float(value), + "unit": unit, + "global_step": global_step, + "timestamp": datetime.datetime.utcnow().strftime( + _DATE_TIME_FORMAT_PATTERN), + "extras": extras} + + +def _collect_tensorflow_info(run_info): + run_info["tensorflow_version"] = { + "version": tf.version.VERSION, "git_hash": tf.version.GIT_VERSION} + + +def _collect_run_params(run_info, run_params): + """Log the parameter information for the benchmark run.""" + def process_param(name, value): + type_check = { + str: {"name": name, "string_value": value}, + int: {"name": name, "long_value": value}, + bool: {"name": name, "bool_value": str(value)}, + float: {"name": name, "float_value": value}, + } + return type_check.get(type(value), + {"name": name, "string_value": str(value)}) + if run_params: + run_info["run_parameters"] = [ + process_param(k, v) for k, v in sorted(run_params.items())] + + +def _collect_tensorflow_environment_variables(run_info): + run_info["tensorflow_environment_variables"] = [ + {"name": k, "value": v} + for k, v in sorted(os.environ.items()) if k.startswith("TF_")] + + +# The following code is mirrored from tensorflow/tools/test/system_info_lib +# which is not exposed for import. +def _collect_cpu_info(run_info): + """Collect the CPU information for the local environment.""" + cpu_info = {} + + cpu_info["num_cores"] = multiprocessing.cpu_count() + + try: + # Note: cpuinfo is not installed in the TensorFlow OSS tree. + # It is installable via pip. + import cpuinfo # pylint: disable=g-import-not-at-top + + info = cpuinfo.get_cpu_info() + cpu_info["cpu_info"] = info["brand"] + cpu_info["mhz_per_cpu"] = info["hz_advertised_raw"][0] / 1.0e6 + + run_info["machine_config"]["cpu_info"] = cpu_info + except ImportError: + tf.compat.v1.logging.warn( + "'cpuinfo' not imported. CPU info will not be logged.") + + +def _collect_memory_info(run_info): + try: + # Note: psutil is not installed in the TensorFlow OSS tree. + # It is installable via pip. + import psutil # pylint: disable=g-import-not-at-top + vmem = psutil.virtual_memory() + run_info["machine_config"]["memory_total"] = vmem.total + run_info["machine_config"]["memory_available"] = vmem.available + except ImportError: + tf.compat.v1.logging.warn( + "'psutil' not imported. Memory info will not be logged.") + + +def _collect_test_environment(run_info): + """Detect the local environment, eg GCE, AWS or DGX, etc.""" + if cloud_lib.on_gcp(): + run_info["test_environment"] = GCP_TEST_ENV + # TODO(scottzhu): Add more testing env detection for other platform + + +def _parse_gpu_model(physical_device_desc): + # Assume all the GPU connected are same model + for kv in physical_device_desc.split(","): + k, _, v = kv.partition(":") + if k.strip() == "name": + return v.strip() + return None + + +def _convert_to_json_dict(input_dict): + if input_dict: + return [{"name": k, "value": v} for k, v in sorted(input_dict.items())] + else: + return [] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger_test.py new file mode 100644 index 0000000..770ad24 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/logger_test.py @@ -0,0 +1,366 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for benchmark logger.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import tempfile +import time +import unittest + +import mock +from absl.testing import flagsaver +import tensorflow as tf # pylint: disable=g-bad-import-order +from absl import logging + +try: + from google.cloud import bigquery +except ImportError: + bigquery = None + +from official.utils.misc import keras_utils +from official.utils.flags import core as flags_core +from official.utils.logs import logger + + +class BenchmarkLoggerTest(tf.test.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BenchmarkLoggerTest, cls).setUpClass() + flags_core.define_benchmark() + + def test_get_default_benchmark_logger(self): + with flagsaver.flagsaver(benchmark_logger_type="foo"): + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BaseBenchmarkLogger) + + def test_config_base_benchmark_logger(self): + with flagsaver.flagsaver(benchmark_logger_type="BaseBenchmarkLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BaseBenchmarkLogger) + + def test_config_benchmark_file_logger(self): + # Set the benchmark_log_dir first since the benchmark_logger_type will need + # the value to be set when it does the validation. + with flagsaver.flagsaver(benchmark_log_dir="/tmp"): + with flagsaver.flagsaver(benchmark_logger_type="BenchmarkFileLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BenchmarkFileLogger) + + @unittest.skipIf(bigquery is None, "Bigquery dependency is not installed.") + @mock.patch.object(bigquery, "Client") + def test_config_benchmark_bigquery_logger(self, mock_bigquery_client): + with flagsaver.flagsaver(benchmark_logger_type="BenchmarkBigQueryLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BenchmarkBigQueryLogger) + + @mock.patch("official.utils.logs.logger.config_benchmark_logger") + def test_benchmark_context(self, mock_config_benchmark_logger): + mock_logger = mock.MagicMock() + mock_config_benchmark_logger.return_value = mock_logger + with logger.benchmark_context(None): + logging.info("start benchmarking") + mock_logger.on_finish.assert_called_once_with(logger.RUN_STATUS_SUCCESS) + + @mock.patch("official.utils.logs.logger.config_benchmark_logger") + def test_benchmark_context_failure(self, mock_config_benchmark_logger): + mock_logger = mock.MagicMock() + mock_config_benchmark_logger.return_value = mock_logger + with self.assertRaises(RuntimeError): + with logger.benchmark_context(None): + raise RuntimeError("training error") + mock_logger.on_finish.assert_called_once_with(logger.RUN_STATUS_FAILURE) + + +class BaseBenchmarkLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BaseBenchmarkLoggerTest, self).setUp() + self._actual_log = logging.info + self.logged_message = None + + def mock_log(*args, **kwargs): + self.logged_message = args + self._actual_log(*args, **kwargs) + + logging.info = mock_log + + def tearDown(self): + super(BaseBenchmarkLoggerTest, self).tearDown() + logging.info = self._actual_log + + def test_log_metric(self): + log = logger.BaseBenchmarkLogger() + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + + expected_log_prefix = "Benchmark metric:" + self.assertRegexpMatches(str(self.logged_message), expected_log_prefix) + + +class BenchmarkFileLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BenchmarkFileLoggerTest, self).setUp() + # Avoid pulling extra env vars from test environment which affects the test + # result, eg. Kokoro test has a TF_PKG env which affect the test case + # test_collect_tensorflow_environment_variables() + self.original_environ = dict(os.environ) + os.environ.clear() + + def tearDown(self): + super(BenchmarkFileLoggerTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + os.environ.clear() + os.environ.update(self.original_environ) + + def test_create_logging_dir(self): + non_exist_temp_dir = os.path.join(self.get_temp_dir(), "unknown_dir") + self.assertFalse(tf.io.gfile.isdir(non_exist_temp_dir)) + + logger.BenchmarkFileLogger(non_exist_temp_dir) + self.assertTrue(tf.io.gfile.isdir(non_exist_temp_dir)) + + def test_log_metric(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + metric = json.loads(f.readline()) + self.assertEqual(metric["name"], "accuracy") + self.assertEqual(metric["value"], 0.999) + self.assertEqual(metric["unit"], None) + self.assertEqual(metric["global_step"], 1e4) + self.assertEqual(metric["extras"], [{"name": "name", "value": "value"}]) + + def test_log_multiple_metrics(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + log.log_metric("loss", 0.02, global_step=1e4) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + accuracy = json.loads(f.readline()) + self.assertEqual(accuracy["name"], "accuracy") + self.assertEqual(accuracy["value"], 0.999) + self.assertEqual(accuracy["unit"], None) + self.assertEqual(accuracy["global_step"], 1e4) + self.assertEqual(accuracy["extras"], [{"name": "name", "value": "value"}]) + + loss = json.loads(f.readline()) + self.assertEqual(loss["name"], "loss") + self.assertEqual(loss["value"], 0.02) + self.assertEqual(loss["unit"], None) + self.assertEqual(loss["global_step"], 1e4) + self.assertEqual(loss["extras"], []) + + def test_log_non_number_value(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + const = tf.constant(1) + log.log_metric("accuracy", const) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertFalse(tf.io.gfile.exists(metric_log)) + + def test_log_evaluation_result(self): + eval_result = {"loss": 0.46237424, + "global_step": 207082, + "accuracy": 0.9285} + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_evaluation_result(eval_result) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + accuracy = json.loads(f.readline()) + self.assertEqual(accuracy["name"], "accuracy") + self.assertEqual(accuracy["value"], 0.9285) + self.assertEqual(accuracy["unit"], None) + self.assertEqual(accuracy["global_step"], 207082) + + loss = json.loads(f.readline()) + self.assertEqual(loss["name"], "loss") + self.assertEqual(loss["value"], 0.46237424) + self.assertEqual(loss["unit"], None) + self.assertEqual(loss["global_step"], 207082) + + def test_log_evaluation_result_with_invalid_type(self): + eval_result = "{'loss': 0.46237424, 'global_step': 207082}" + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_evaluation_result(eval_result) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertFalse(tf.io.gfile.exists(metric_log)) + + @mock.patch("official.utils.logs.logger._gather_run_info") + def test_log_run_info(self, mock_gather_run_info): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + run_info = {"model_name": "model_name", + "dataset": "dataset_name", + "run_info": "run_value"} + mock_gather_run_info.return_value = run_info + log.log_run_info("model_name", "dataset_name", {}) + + run_log = os.path.join(log_dir, "benchmark_run.log") + self.assertTrue(tf.io.gfile.exists(run_log)) + with tf.io.gfile.GFile(run_log) as f: + run_info = json.loads(f.readline()) + self.assertEqual(run_info["model_name"], "model_name") + self.assertEqual(run_info["dataset"], "dataset_name") + self.assertEqual(run_info["run_info"], "run_value") + + def test_collect_tensorflow_info(self): + run_info = {} + logger._collect_tensorflow_info(run_info) + self.assertNotEqual(run_info["tensorflow_version"], {}) + self.assertEqual(run_info["tensorflow_version"]["version"], + tf.version.VERSION) + self.assertEqual(run_info["tensorflow_version"]["git_hash"], + tf.version.GIT_VERSION) + + def test_collect_run_params(self): + run_info = {} + run_parameters = { + "batch_size": 32, + "synthetic_data": True, + "train_epochs": 100.00, + "dtype": "fp16", + "resnet_size": 50, + "random_tensor": tf.constant(2.0) + } + logger._collect_run_params(run_info, run_parameters) + self.assertEqual(len(run_info["run_parameters"]), 6) + self.assertEqual(run_info["run_parameters"][0], + {"name": "batch_size", "long_value": 32}) + self.assertEqual(run_info["run_parameters"][1], + {"name": "dtype", "string_value": "fp16"}) + v1_tensor = {"name": "random_tensor", "string_value": + "Tensor(\"Const:0\", shape=(), dtype=float32)"} + v2_tensor = {"name": "random_tensor", "string_value": + "tf.Tensor(2.0, shape=(), dtype=float32)"} + self.assertIn(run_info["run_parameters"][2], [v1_tensor, v2_tensor]) + + + self.assertEqual(run_info["run_parameters"][3], + {"name": "resnet_size", "long_value": 50}) + self.assertEqual(run_info["run_parameters"][4], + {"name": "synthetic_data", "bool_value": "True"}) + self.assertEqual(run_info["run_parameters"][5], + {"name": "train_epochs", "float_value": 100.00}) + + def test_collect_tensorflow_environment_variables(self): + os.environ["TF_ENABLE_WINOGRAD_NONFUSED"] = "1" + os.environ["TF_OTHER"] = "2" + os.environ["OTHER"] = "3" + + run_info = {} + logger._collect_tensorflow_environment_variables(run_info) + self.assertIsNotNone(run_info["tensorflow_environment_variables"]) + expected_tf_envs = [ + {"name": "TF_ENABLE_WINOGRAD_NONFUSED", "value": "1"}, + {"name": "TF_OTHER", "value": "2"}, + ] + self.assertEqual(run_info["tensorflow_environment_variables"], + expected_tf_envs) + + def test_collect_memory_info(self): + run_info = {"machine_config": {}} + logger._collect_memory_info(run_info) + self.assertIsNotNone(run_info["machine_config"]["memory_total"]) + self.assertIsNotNone(run_info["machine_config"]["memory_available"]) + + +@unittest.skipIf(bigquery is None, "Bigquery dependency is not installed.") +class BenchmarkBigQueryLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BenchmarkBigQueryLoggerTest, self).setUp() + # Avoid pulling extra env vars from test environment which affects the test + # result, eg. Kokoro test has a TF_PKG env which affect the test case + # test_collect_tensorflow_environment_variables() + self.original_environ = dict(os.environ) + os.environ.clear() + + self.mock_bq_uploader = mock.MagicMock() + self.logger = logger.BenchmarkBigQueryLogger( + self.mock_bq_uploader, "dataset", "run_table", "run_status_table", + "metric_table", "run_id") + + def tearDown(self): + super(BenchmarkBigQueryLoggerTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + os.environ.clear() + os.environ.update(self.original_environ) + + def test_log_metric(self): + self.logger.log_metric( + "accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + expected_metric_json = [{ + "name": "accuracy", + "value": 0.999, + "unit": None, + "global_step": 1e4, + "timestamp": mock.ANY, + "extras": [{"name": "name", "value": "value"}] + }] + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.upload_benchmark_metric_json.assert_called_once_with( + "dataset", "metric_table", "run_id", expected_metric_json) + + @mock.patch("official.utils.logs.logger._gather_run_info") + def test_log_run_info(self, mock_gather_run_info): + run_info = {"model_name": "model_name", + "dataset": "dataset_name", + "run_info": "run_value"} + mock_gather_run_info.return_value = run_info + self.logger.log_run_info("model_name", "dataset_name", {}) + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.upload_benchmark_run_json.assert_called_once_with( + "dataset", "run_table", "run_id", run_info) + self.mock_bq_uploader.insert_run_status.assert_called_once_with( + "dataset", "run_status_table", "run_id", "running") + + def test_on_finish(self): + self.logger.on_finish(logger.RUN_STATUS_SUCCESS) + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.update_run_status.assert_called_once_with( + "dataset", "run_status_table", "run_id", logger.RUN_STATUS_SUCCESS) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook.py new file mode 100644 index 0000000..f408e3e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook.py @@ -0,0 +1,97 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Session hook for logging benchmark metric.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + + +class LoggingMetricHook(tf.estimator.LoggingTensorHook): + """Hook to log benchmark metric information. + + This hook is very similar as tf.train.LoggingTensorHook, which logs given + tensors every N local steps, every N seconds, or at the end. The metric + information will be logged to given log_dir or via metric_logger in JSON + format, which can be consumed by data analysis pipeline later. + + Note that if `at_end` is True, `tensors` should not include any tensor + whose evaluation produces a side effect such as consuming additional inputs. + """ + + def __init__(self, tensors, metric_logger=None, + every_n_iter=None, every_n_secs=None, at_end=False): + """Initializer for LoggingMetricHook. + + Args: + tensors: `dict` that maps string-valued tags to tensors/tensor names, + or `iterable` of tensors/tensor names. + metric_logger: instance of `BenchmarkLogger`, the benchmark logger that + hook should use to write the log. + every_n_iter: `int`, print the values of `tensors` once every N local + steps taken on the current worker. + every_n_secs: `int` or `float`, print the values of `tensors` once every N + seconds. Exactly one of `every_n_iter` and `every_n_secs` should be + provided. + at_end: `bool` specifying whether to print the values of `tensors` at the + end of the run. + + Raises: + ValueError: + 1. `every_n_iter` is non-positive, or + 2. Exactly one of every_n_iter and every_n_secs should be provided. + 3. Exactly one of log_dir and metric_logger should be provided. + """ + super(LoggingMetricHook, self).__init__( + tensors=tensors, + every_n_iter=every_n_iter, + every_n_secs=every_n_secs, + at_end=at_end) + + if metric_logger is None: + raise ValueError("metric_logger should be provided.") + self._logger = metric_logger + + def begin(self): + super(LoggingMetricHook, self).begin() + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + "Global step should be created to use LoggingMetricHook.") + if self._global_step_tensor.name not in self._current_tensors: + self._current_tensors[self._global_step_tensor.name] = ( + self._global_step_tensor) + + def after_run(self, unused_run_context, run_values): + # should_trigger is a internal state that populated at before_run, and it is + # using self_timer to determine whether it should trigger. + if self._should_trigger: + self._log_metric(run_values.results) + + self._iter_count += 1 + + def end(self, session): + if self._log_at_end: + values = session.run(self._current_tensors) + self._log_metric(values) + + def _log_metric(self, tensor_values): + self._timer.update_last_triggered_step(self._iter_count) + global_step = tensor_values[self._global_step_tensor.name] + # self._tag_order is populated during the init of LoggingTensorHook + for tag in self._tag_order: + self._logger.log_metric(tag, tensor_values[tag], global_step=global_step) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook_test.py new file mode 100644 index 0000000..870ed6e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/metric_hook_test.py @@ -0,0 +1,217 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for metric_hook.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tempfile +import time + +import tensorflow as tf # pylint: disable=g-bad-import-order +from tensorflow.python.training import monitored_session # pylint: disable=g-bad-import-order + +from official.utils.logs import metric_hook +from official.utils.testing import mock_lib + + +class LoggingMetricHookTest(tf.test.TestCase): + """Tests for LoggingMetricHook.""" + + def setUp(self): + super(LoggingMetricHookTest, self).setUp() + + self._log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + self._logger = mock_lib.MockBenchmarkLogger() + + def tearDown(self): + super(LoggingMetricHookTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + def test_illegal_args(self): + with self.assertRaisesRegexp(ValueError, "nvalid every_n_iter"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=0) + with self.assertRaisesRegexp(ValueError, "nvalid every_n_iter"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=-10) + with self.assertRaisesRegexp(ValueError, "xactly one of"): + metric_hook.LoggingMetricHook( + tensors=["t"], every_n_iter=5, every_n_secs=5) + with self.assertRaisesRegexp(ValueError, "xactly one of"): + metric_hook.LoggingMetricHook(tensors=["t"]) + with self.assertRaisesRegexp(ValueError, "metric_logger"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=5) + + def test_print_at_end_only(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + t = tf.constant(42.0, name="foo") + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], at_end=True, metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + for _ in range(3): + mon_sess.run(train_op) + self.assertEqual(self._logger.logged_metric, []) + + hook.end(sess) + self.assertEqual(len(self._logger.logged_metric), 1) + metric = self._logger.logged_metric[0] + self.assertRegexpMatches(metric["name"], "foo") + self.assertEqual(metric["value"], 42.0) + self.assertEqual(metric["unit"], None) + self.assertEqual(metric["global_step"], 0) + + def test_global_step_not_found(self): + with tf.Graph().as_default(): + t = tf.constant(42.0, name="foo") + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], at_end=True, metric_logger=self._logger) + + with self.assertRaisesRegexp( + RuntimeError, "should be created to use LoggingMetricHook."): + hook.begin() + + def test_log_tensors(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + t1 = tf.constant(42.0, name="foo") + t2 = tf.constant(43.0, name="bar") + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t1, t2], at_end=True, metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + for _ in range(3): + mon_sess.run(train_op) + self.assertEqual(self._logger.logged_metric, []) + + hook.end(sess) + self.assertEqual(len(self._logger.logged_metric), 2) + metric1 = self._logger.logged_metric[0] + self.assertRegexpMatches(str(metric1["name"]), "foo") + self.assertEqual(metric1["value"], 42.0) + self.assertEqual(metric1["unit"], None) + self.assertEqual(metric1["global_step"], 0) + + metric2 = self._logger.logged_metric[1] + self.assertRegexpMatches(str(metric2["name"]), "bar") + self.assertEqual(metric2["value"], 43.0) + self.assertEqual(metric2["unit"], None) + self.assertEqual(metric2["global_step"], 0) + + def _validate_print_every_n_steps(self, sess, at_end): + t = tf.constant(42.0, name="foo") + + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], every_n_iter=10, at_end=at_end, + metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + for _ in range(3): + self._logger.logged_metric = [] + for _ in range(9): + mon_sess.run(train_op) + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + # Add additional run to verify proper reset when called multiple times. + self._logger.logged_metric = [] + mon_sess.run(train_op) + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + self._logger.logged_metric = [] + hook.end(sess) + if at_end: + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + else: + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + def test_print_every_n_steps(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_steps(sess, at_end=False) + # Verify proper reset. + self._validate_print_every_n_steps(sess, at_end=False) + + def test_print_every_n_steps_and_end(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_steps(sess, at_end=True) + # Verify proper reset. + self._validate_print_every_n_steps(sess, at_end=True) + + def _validate_print_every_n_secs(self, sess, at_end): + t = tf.constant(42.0, name="foo") + train_op = tf.constant(3) + + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], every_n_secs=1.0, at_end=at_end, + metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + # assertNotRegexpMatches is not supported by python 3.1 and later + self._logger.logged_metric = [] + mon_sess.run(train_op) + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + time.sleep(1.0) + + self._logger.logged_metric = [] + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + self._logger.logged_metric = [] + hook.end(sess) + if at_end: + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + else: + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + def test_print_every_n_secs(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_secs(sess, at_end=False) + # Verify proper reset. + self._validate_print_every_n_secs(sess, at_end=False) + + def test_print_every_n_secs_and_end(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_secs(sess, at_end=True) + # Verify proper reset. + self._validate_print_every_n_secs(sess, at_end=True) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/mlperf_helper.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/mlperf_helper.py new file mode 100644 index 0000000..f0b0374 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/logs/mlperf_helper.py @@ -0,0 +1,194 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Wrapper for the mlperf logging utils. + +MLPerf compliance logging is only desired under a limited set of circumstances. +This module is intended to keep users from needing to consider logging (or +install the module) unless they are performing mlperf runs. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from collections import namedtuple +import json +import os +import re +import subprocess +import sys +import typing + + + +import tensorflow as tf + +_MIN_VERSION = (0, 0, 10) +_STACK_OFFSET = 2 + +SUDO = "sudo" if os.geteuid() else "" + +# This indirection is used in docker. +DROP_CACHE_LOC = os.getenv("DROP_CACHE_LOC", "/proc/sys/vm/drop_caches") + +_NCF_PREFIX = "NCF_RAW_" + +# TODO(robieta): move line parsing to mlperf util +_PREFIX = r"(?:{})?:::MLPv([0-9]+).([0-9]+).([0-9]+)".format(_NCF_PREFIX) +_BENCHMARK = r"([a-zA-Z0-9_]+)" +_TIMESTAMP = r"([0-9]+\.[0-9]+)" +_CALLSITE = r"\((.+):([0-9]+)\)" +_TAG = r"([a-zA-Z0-9_]+)" +_VALUE = r"(.*)" + +ParsedLine = namedtuple("ParsedLine", ["version", "benchmark", "timestamp", + "callsite", "tag", "value"]) + +LINE_PATTERN = re.compile( + "^{prefix} {benchmark} {timestamp} {callsite} {tag}(: |$){value}?$".format( + prefix=_PREFIX, benchmark=_BENCHMARK, timestamp=_TIMESTAMP, + callsite=_CALLSITE, tag=_TAG, value=_VALUE)) + + +def parse_line(line): # type: (str) -> typing.Optional[ParsedLine] + match = LINE_PATTERN.match(line.strip()) + if not match: + return + + major, minor, micro, benchmark, timestamp = match.groups()[:5] + call_file, call_line, tag, _, value = match.groups()[5:] + + return ParsedLine(version=(int(major), int(minor), int(micro)), + benchmark=benchmark, timestamp=timestamp, + callsite=(call_file, call_line), tag=tag, value=value) + + +def unparse_line(parsed_line): # type: (ParsedLine) -> str + version_str = "{}.{}.{}".format(*parsed_line.version) + callsite_str = "({}:{})".format(*parsed_line.callsite) + value_str = ": {}".format(parsed_line.value) if parsed_line.value else "" + return ":::MLPv{} {} {} {} {} {}".format( + version_str, parsed_line.benchmark, parsed_line.timestamp, callsite_str, + parsed_line.tag, value_str) + + +def get_mlperf_log(): + """Shielded import of mlperf_log module.""" + try: + import mlperf_compliance + + def test_mlperf_log_pip_version(): + """Check that mlperf_compliance is up to date.""" + import pkg_resources + version = pkg_resources.get_distribution("mlperf_compliance") + version = tuple(int(i) for i in version.version.split(".")) + if version < _MIN_VERSION: + tf.compat.v1.logging.warning( + "mlperf_compliance is version {}, must be >= {}".format( + ".".join([str(i) for i in version]), + ".".join([str(i) for i in _MIN_VERSION]))) + raise ImportError + return mlperf_compliance.mlperf_log + + mlperf_log = test_mlperf_log_pip_version() + + except ImportError: + mlperf_log = None + + return mlperf_log + + +class Logger(object): + """MLPerf logger indirection class. + + This logger only logs for MLPerf runs, and prevents various errors associated + with not having the mlperf_compliance package installed. + """ + class Tags(object): + def __init__(self, mlperf_log): + self._enabled = False + self._mlperf_log = mlperf_log + + def __getattr__(self, item): + if self._mlperf_log is None or not self._enabled: + return + return getattr(self._mlperf_log, item) + + def __init__(self): + self._enabled = False + self._mlperf_log = get_mlperf_log() + self.tags = self.Tags(self._mlperf_log) + + def __call__(self, enable=False): + if enable and self._mlperf_log is None: + raise ImportError("MLPerf logging was requested, but mlperf_compliance " + "module could not be loaded.") + + self._enabled = enable + self.tags._enabled = enable + return self + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + self._enabled = False + self.tags._enabled = False + + @property + def log_file(self): + if self._mlperf_log is None: + return + return self._mlperf_log.LOG_FILE + + @property + def enabled(self): + return self._enabled + + def ncf_print(self, key, value=None, stack_offset=_STACK_OFFSET, + deferred=False, extra_print=False, prefix=_NCF_PREFIX): + if self._mlperf_log is None or not self.enabled: + return + self._mlperf_log.ncf_print(key=key, value=value, stack_offset=stack_offset, + deferred=deferred, extra_print=extra_print, + prefix=prefix) + + def set_ncf_root(self, path): + if self._mlperf_log is None: + return + self._mlperf_log.ROOT_DIR_NCF = path + + +LOGGER = Logger() +ncf_print, set_ncf_root = LOGGER.ncf_print, LOGGER.set_ncf_root +TAGS = LOGGER.tags + + +def clear_system_caches(): + if not LOGGER.enabled: + return + ret_code = subprocess.call( + ["sync && echo 3 | {} tee {}".format(SUDO, DROP_CACHE_LOC)], + shell=True) + + if ret_code: + raise ValueError("Failed to clear caches") + + +if __name__ == "__main__": + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + with LOGGER(True): + ncf_print(key=TAGS.RUN_START) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/callstack_sampler.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/callstack_sampler.py new file mode 100644 index 0000000..984f133 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/callstack_sampler.py @@ -0,0 +1,62 @@ +"""A simple Python callstack sampler.""" + +import contextlib +import datetime +import signal +import traceback + + +class CallstackSampler(object): + """A simple signal-based Python callstack sampler. + """ + + def __init__(self, interval=None): + self.stacks = [] + self.interval = 0.001 if interval is None else interval + + def _sample(self, signum, frame): + """Samples the current stack.""" + del signum + stack = traceback.extract_stack(frame) + formatted_stack = [] + formatted_stack.append(datetime.datetime.utcnow()) + for filename, lineno, function_name, text in stack: + formatted_frame = '{}:{}({})({})'.format(filename, lineno, function_name, + text) + formatted_stack.append(formatted_frame) + self.stacks.append(formatted_stack) + signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0) + + @contextlib.contextmanager + def profile(self): + signal.signal(signal.SIGVTALRM, self._sample) + signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0) + try: + yield + finally: + signal.setitimer(signal.ITIMER_VIRTUAL, 0) + + def save(self, fname): + with open(fname, 'w') as f: + for s in self.stacks: + for l in s: + f.write('%s\n' % l) + f.write('\n') + + +@contextlib.contextmanager +def callstack_sampling(filename, interval=None): + """Periodically samples the Python callstack. + + Args: + filename: the filename + interval: the sampling interval, in seconds. Defaults to 0.001. + + Yields: + nothing + """ + sampler = CallstackSampler(interval=interval) + with sampler.profile(): + yield + sampler.save(filename) + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils.py new file mode 100644 index 0000000..e4823a9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils.py @@ -0,0 +1,205 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper functions for running models in a distributed setting.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import random +import string + +from absl import logging +import tensorflow.compat.v2 as tf + +from official.utils.misc import tpu_lib + + +def _collective_communication(all_reduce_alg): + """Return a CollectiveCommunication based on all_reduce_alg. + + Args: + all_reduce_alg: a string specifying which collective communication to pick, + or None. + + Returns: + tf.distribute.experimental.CollectiveCommunication object + + Raises: + ValueError: if `all_reduce_alg` not in [None, "ring", "nccl"] + """ + collective_communication_options = { + None: tf.distribute.experimental.CollectiveCommunication.AUTO, + "ring": tf.distribute.experimental.CollectiveCommunication.RING, + "nccl": tf.distribute.experimental.CollectiveCommunication.NCCL + } + if all_reduce_alg not in collective_communication_options: + raise ValueError( + "When used with `multi_worker_mirrored`, valid values for " + "all_reduce_alg are [`ring`, `nccl`]. Supplied value: {}".format( + all_reduce_alg)) + return collective_communication_options[all_reduce_alg] + + +def _mirrored_cross_device_ops(all_reduce_alg, num_packs): + """Return a CrossDeviceOps based on all_reduce_alg and num_packs. + + Args: + all_reduce_alg: a string specifying which cross device op to pick, or None. + num_packs: an integer specifying number of packs for the cross device op. + + Returns: + tf.distribute.CrossDeviceOps object or None. + + Raises: + ValueError: if `all_reduce_alg` not in [None, "nccl", "hierarchical_copy"]. + """ + if all_reduce_alg is None: + return None + mirrored_all_reduce_options = { + "nccl": tf.distribute.NcclAllReduce, + "hierarchical_copy": tf.distribute.HierarchicalCopyAllReduce + } + if all_reduce_alg not in mirrored_all_reduce_options: + raise ValueError( + "When used with `mirrored`, valid values for all_reduce_alg are " + "[`nccl`, `hierarchical_copy`]. Supplied value: {}".format( + all_reduce_alg)) + cross_device_ops_class = mirrored_all_reduce_options[all_reduce_alg] + return cross_device_ops_class(num_packs=num_packs) + + +def get_distribution_strategy(distribution_strategy="mirrored", + num_gpus=0, + all_reduce_alg=None, + num_packs=1, + tpu_address=None): + """Return a DistributionStrategy for running the model. + + Args: + distribution_strategy: a string specifying which distribution strategy to + use. Accepted values are "off", "one_device", "mirrored", + "parameter_server", "multi_worker_mirrored", and "tpu" -- case insensitive. + "off" means not to use Distribution Strategy; "tpu" means to use + TPUStrategy using `tpu_address`. + num_gpus: Number of GPUs to run this model. + all_reduce_alg: Optional. Specifies which algorithm to use when performing + all-reduce. For `MirroredStrategy`, valid values are "nccl" and + "hierarchical_copy". For `MultiWorkerMirroredStrategy`, valid values are + "ring" and "nccl". If None, DistributionStrategy will choose based on + device topology. + num_packs: Optional. Sets the `num_packs` in `tf.distribute.NcclAllReduce` + or `tf.distribute.HierarchicalCopyAllReduce` for `MirroredStrategy`. + tpu_address: Optional. String that represents TPU to connect to. Must not + be None if `distribution_strategy` is set to `tpu`. + Returns: + tf.distribute.DistibutionStrategy object. + Raises: + ValueError: if `distribution_strategy` is "off" or "one_device" and + `num_gpus` is larger than 1; or `num_gpus` is negative or if + `distribution_strategy` is `tpu` but `tpu_address` is not specified. + """ + if num_gpus < 0: + raise ValueError("`num_gpus` can not be negative.") + + distribution_strategy = distribution_strategy.lower() + if distribution_strategy == "off": + if num_gpus > 1: + raise ValueError( + "When {} GPUs are specified, distribution_strategy " + "flag cannot be set to `off`.".format(num_gpus)) + return None + + if distribution_strategy == "tpu": + # When tpu_address is an empty string, we communicate with local TPUs. + cluster_resolver = tpu_lib.tpu_initialize(tpu_address) + return tf.distribute.experimental.TPUStrategy(cluster_resolver) + + if distribution_strategy == "multi_worker_mirrored": + return tf.distribute.experimental.MultiWorkerMirroredStrategy( + communication=_collective_communication(all_reduce_alg)) + + if distribution_strategy == "one_device": + if num_gpus == 0: + return tf.distribute.OneDeviceStrategy("device:CPU:0") + if num_gpus > 1: + raise ValueError("`OneDeviceStrategy` can not be used for more than " + "one device.") + return tf.distribute.OneDeviceStrategy("device:GPU:0") + + if distribution_strategy == "mirrored": + if num_gpus == 0: + devices = ["device:CPU:0"] + else: + devices = ["device:GPU:%d" % i for i in range(num_gpus)] + return tf.distribute.MirroredStrategy( + devices=devices, + cross_device_ops=_mirrored_cross_device_ops(all_reduce_alg, num_packs)) + + if distribution_strategy == "parameter_server": + return tf.distribute.experimental.ParameterServerStrategy() + + raise ValueError( + "Unrecognized Distribution Strategy: %r" % distribution_strategy) + + +def configure_cluster(worker_hosts=None, task_index=-1): + """Set multi-worker cluster spec in TF_CONFIG environment variable. + + Args: + worker_hosts: comma-separated list of worker ip:port pairs. + + Returns: + Number of workers in the cluster. + """ + tf_config = json.loads(os.environ.get("TF_CONFIG", "{}")) + if tf_config: + num_workers = (len(tf_config["cluster"].get("chief", [])) + + len(tf_config["cluster"].get("worker", []))) + elif worker_hosts: + workers = worker_hosts.split(",") + num_workers = len(workers) + if num_workers > 1 and task_index < 0: + raise ValueError("Must specify task_index when number of workers > 1") + task_index = 0 if num_workers == 1 else task_index + os.environ["TF_CONFIG"] = json.dumps({ + "cluster": { + "worker": workers + }, + "task": {"type": "worker", "index": task_index} + }) + else: + num_workers = 1 + return num_workers + + +def get_strategy_scope(strategy): + if strategy: + strategy_scope = strategy.scope() + else: + strategy_scope = DummyContextManager() + + return strategy_scope + + +class DummyContextManager(object): + + def __enter__(self): + pass + + def __exit__(self, *args): + pass diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils_test.py new file mode 100644 index 0000000..4fd7bff --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/distribution_utils_test.py @@ -0,0 +1,49 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +""" Tests for distribution util functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from official.utils.misc import distribution_utils + + +class GetDistributionStrategyTest(tf.test.TestCase): + """Tests for get_distribution_strategy.""" + def test_one_device_strategy_cpu(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=0) + self.assertEquals(ds.num_replicas_in_sync, 1) + self.assertEquals(len(ds.extended.worker_devices), 1) + self.assertIn('CPU', ds.extended.worker_devices[0]) + + def test_one_device_strategy_gpu(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=1) + self.assertEquals(ds.num_replicas_in_sync, 1) + self.assertEquals(len(ds.extended.worker_devices), 1) + self.assertIn('GPU', ds.extended.worker_devices[0]) + + def test_mirrored_strategy(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=5) + self.assertEquals(ds.num_replicas_in_sync, 5) + self.assertEquals(len(ds.extended.worker_devices), 5) + for device in ds.extended.worker_devices: + self.assertIn('GPU', device) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/keras_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/keras_utils.py new file mode 100644 index 0000000..cf18b9e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/keras_utils.py @@ -0,0 +1,262 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper functions for the Keras implementations of models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import multiprocessing +import os +import time + +from absl import logging +import tensorflow.compat.v2 as tf +from tensorflow.python import tf2 +from tensorflow.python.profiler import profiler_v2 as profiler + + +class BatchTimestamp(object): + """A structure to store batch time stamp.""" + + def __init__(self, batch_index, timestamp): + self.batch_index = batch_index + self.timestamp = timestamp + + def __repr__(self): + return "'BatchTimestamp'".format( + self.batch_index, self.timestamp) + + +class TimeHistory(tf.keras.callbacks.Callback): + """Callback for Keras models.""" + + def __init__(self, batch_size, log_steps, logdir=None): + """Callback for logging performance. + + Args: + batch_size: Total batch size. + log_steps: Interval of steps between logging of batch level stats. + logdir: Optional directory to write TensorBoard summaries. + """ + # TODO(wcromar): remove this parameter and rely on `logs` parameter of + # on_train_batch_end() + self.batch_size = batch_size + super(TimeHistory, self).__init__() + self.log_steps = log_steps + self.last_log_step = 0 + self.steps_before_epoch = 0 + self.steps_in_epoch = 0 + self.start_time = None + + if logdir: + self.summary_writer = tf.summary.create_file_writer(logdir) + else: + self.summary_writer = None + + # Logs start of step 1 then end of each step based on log_steps interval. + self.timestamp_log = [] + + # Records the time each epoch takes to run from start to finish of epoch. + self.epoch_runtime_log = [] + + @property + def global_steps(self): + """The current 1-indexed global step.""" + return self.steps_before_epoch + self.steps_in_epoch + + @property + def average_steps_per_second(self): + """The average training steps per second across all epochs.""" + return self.global_steps / sum(self.epoch_runtime_log) + + @property + def average_examples_per_second(self): + """The average number of training examples per second across all epochs.""" + return self.average_steps_per_second * self.batch_size + + def on_train_end(self, logs=None): + self.train_finish_time = time.time() + + if self.summary_writer: + self.summary_writer.flush() + + def on_epoch_begin(self, epoch, logs=None): + self.epoch_start = time.time() + + def on_batch_begin(self, batch, logs=None): + if not self.start_time: + self.start_time = time.time() + + # Record the timestamp of the first global step + if not self.timestamp_log: + self.timestamp_log.append(BatchTimestamp(self.global_steps, + self.start_time)) + + def on_batch_end(self, batch, logs=None): + """Records elapse time of the batch and calculates examples per second.""" + self.steps_in_epoch = batch + 1 + steps_since_last_log = self.global_steps - self.last_log_step + if steps_since_last_log >= self.log_steps: + now = time.time() + elapsed_time = now - self.start_time + steps_per_second = steps_since_last_log / elapsed_time + examples_per_second = steps_per_second * self.batch_size + + self.timestamp_log.append(BatchTimestamp(self.global_steps, now)) + logging.info( + 'TimeHistory: %.2f seconds, %.2f examples/second between steps %d ' + 'and %d', elapsed_time, examples_per_second, self.last_log_step, + self.global_steps) + + if self.summary_writer: + with self.summary_writer.as_default(): + tf.summary.scalar('global_step/sec', steps_per_second, + self.global_steps) + tf.summary.scalar('examples/sec', examples_per_second, + self.global_steps) + + self.last_log_step = self.global_steps + self.start_time = None + + def on_epoch_end(self, epoch, logs=None): + epoch_run_time = time.time() - self.epoch_start + self.epoch_runtime_log.append(epoch_run_time) + + self.steps_before_epoch += self.steps_in_epoch + self.steps_in_epoch = 0 + + +def get_profiler_callback(model_dir, profile_steps, enable_tensorboard, + steps_per_epoch): + """Validate profile_steps flag value and return profiler callback.""" + profile_steps_error_message = ( + 'profile_steps must be a comma separated pair of positive integers, ' + 'specifying the first and last steps to be profiled.' + ) + try: + profile_steps = [int(i) for i in profile_steps.split(',')] + except ValueError: + raise ValueError(profile_steps_error_message) + if len(profile_steps) != 2: + raise ValueError(profile_steps_error_message) + start_step, stop_step = profile_steps + if start_step < 0 or start_step > stop_step: + raise ValueError(profile_steps_error_message) + if enable_tensorboard: + logging.warning( + 'Both TensorBoard and profiler callbacks are used. Note that the ' + 'TensorBoard callback profiles the 2nd step (unless otherwise ' + 'specified). Please make sure the steps profiled by the two callbacks ' + 'do not overlap.') + return ProfilerCallback(model_dir, start_step, stop_step, steps_per_epoch) + + +class ProfilerCallback(tf.keras.callbacks.Callback): + """Save profiles in specified step range to log directory.""" + + def __init__(self, log_dir, start_step, stop_step, steps_per_epoch): + super(ProfilerCallback, self).__init__() + self.log_dir = log_dir + self.start_step = start_step + self.stop_step = stop_step + self.start_epoch = start_step // steps_per_epoch + self.stop_epoch = stop_step // steps_per_epoch + self.start_step_in_epoch = start_step % steps_per_epoch + self.stop_step_in_epoch = stop_step % steps_per_epoch + self.should_start = False + self.should_stop = False + + def on_epoch_begin(self, epoch, logs=None): + if epoch == self.start_epoch: + self.should_start = True + if epoch == self.stop_epoch: + self.should_stop = True + + def on_batch_begin(self, batch, logs=None): + if batch == self.start_step_in_epoch and self.should_start: + self.should_start = False + profiler.start(self.log_dir) + logging.info('Profiler started at Step %s', self.start_step) + + def on_batch_end(self, batch, logs=None): + if batch == self.stop_step_in_epoch and self.should_stop: + self.should_stop = False + profiler.stop() + logging.info('Profiler saved profiles for steps between %s and %s to %s', + self.start_step, self.stop_step, self.log_dir) + + +def set_session_config(enable_eager=False, + enable_xla=False): + """Sets the session config.""" + if is_v2_0(): + set_config_v2(enable_xla=enable_xla) + else: + config = get_config_proto_v1(enable_xla=enable_xla) + if enable_eager: + tf.compat.v1.enable_eager_execution(config=config) + else: + sess = tf.compat.v1.Session(config=config) + tf.compat.v1.keras.backend.set_session(sess) + + +def get_config_proto_v1(enable_xla=False): + """Return config proto according to flag settings, or None to use default.""" + config = None + if enable_xla: + config = tf.compat.v1.ConfigProto() + config.graph_options.optimizer_options.global_jit_level = ( + tf.OptimizerOptions.ON_2) + return config + + +def set_config_v2(enable_xla=False): + """Config eager context according to flag values using TF 2.0 API.""" + if enable_xla: + tf.config.optimizer.set_jit(True) + + +def is_v2_0(): + """Returns true if using tf 2.0.""" + return tf2.enabled() + + +def set_gpu_thread_mode_and_count(gpu_thread_mode, + datasets_num_private_threads, + num_gpus, per_gpu_thread_count): + """Set GPU thread mode and count, and adjust dataset threads count.""" + cpu_count = multiprocessing.cpu_count() + logging.info('Logical CPU cores: %s', cpu_count) + + # Allocate private thread pool for each GPU to schedule and launch kernels + per_gpu_thread_count = per_gpu_thread_count or 2 + os.environ['TF_GPU_THREAD_MODE'] = gpu_thread_mode + os.environ['TF_GPU_THREAD_COUNT'] = str(per_gpu_thread_count) + logging.info('TF_GPU_THREAD_COUNT: %s', + os.environ['TF_GPU_THREAD_COUNT']) + logging.info('TF_GPU_THREAD_MODE: %s', + os.environ['TF_GPU_THREAD_MODE']) + + # Limit data preprocessing threadpool to CPU cores minus number of total GPU + # private threads and memory copy threads. + total_gpu_thread_count = per_gpu_thread_count * num_gpus + num_runtime_threads = num_gpus + if not datasets_num_private_threads: + datasets_num_private_threads = min( + cpu_count - total_gpu_thread_count - num_runtime_threads, + num_gpus * 8) + logging.info('Set datasets_num_private_threads to %s', + datasets_num_private_threads) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers.py new file mode 100644 index 0000000..9a44e50 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers.py @@ -0,0 +1,95 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Miscellaneous functions that can be called by models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numbers + +from absl import logging +import tensorflow as tf + +from tensorflow.python.util import nest +# pylint:disable=logging-format-interpolation + + +def past_stop_threshold(stop_threshold, eval_metric): + """Return a boolean representing whether a model should be stopped. + + Args: + stop_threshold: float, the threshold above which a model should stop + training. + eval_metric: float, the current value of the relevant metric to check. + + Returns: + True if training should stop, False otherwise. + + Raises: + ValueError: if either stop_threshold or eval_metric is not a number + """ + if stop_threshold is None: + return False + + if not isinstance(stop_threshold, numbers.Number): + raise ValueError("Threshold for checking stop conditions must be a number.") + if not isinstance(eval_metric, numbers.Number): + raise ValueError("Eval metric being checked against stop conditions " + "must be a number.") + + if eval_metric >= stop_threshold: + logging.info("Stop threshold of {} was passed with metric value {}.".format( + stop_threshold, eval_metric)) + return True + + return False + + +def generate_synthetic_data( + input_shape, input_value=0, input_dtype=None, label_shape=None, + label_value=0, label_dtype=None): + """Create a repeating dataset with constant values. + + Args: + input_shape: a tf.TensorShape object or nested tf.TensorShapes. The shape of + the input data. + input_value: Value of each input element. + input_dtype: Input dtype. If None, will be inferred by the input value. + label_shape: a tf.TensorShape object or nested tf.TensorShapes. The shape of + the label data. + label_value: Value of each input element. + label_dtype: Input dtype. If None, will be inferred by the target value. + + Returns: + Dataset of tensors or tuples of tensors (if label_shape is set). + """ + # TODO(kathywu): Replace with SyntheticDataset once it is in contrib. + element = input_element = nest.map_structure( + lambda s: tf.constant(input_value, input_dtype, s), input_shape) + + if label_shape: + label_element = nest.map_structure( + lambda s: tf.constant(label_value, label_dtype, s), label_shape) + element = (input_element, label_element) + + return tf.data.Dataset.from_tensors(element).repeat() + + +def apply_clean(flags_obj): + if flags_obj.clean and tf.io.gfile.exists(flags_obj.model_dir): + logging.info("--clean flag set. Removing existing model dir:" + " {}".format(flags_obj.model_dir)) + tf.io.gfile.rmtree(flags_obj.model_dir) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers_test.py new file mode 100644 index 0000000..f34a594 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/model_helpers_test.py @@ -0,0 +1,127 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Model Helper functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.misc import keras_utils +from official.utils.misc import model_helpers + + +class PastStopThresholdTest(tf.test.TestCase): + """Tests for past_stop_threshold.""" + + def setUp(self): + super(PastStopThresholdTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def test_past_stop_threshold(self): + """Tests for normal operating conditions.""" + self.assertTrue(model_helpers.past_stop_threshold(0.54, 1)) + self.assertTrue(model_helpers.past_stop_threshold(54, 100)) + self.assertFalse(model_helpers.past_stop_threshold(0.54, 0.1)) + self.assertFalse(model_helpers.past_stop_threshold(-0.54, -1.5)) + self.assertTrue(model_helpers.past_stop_threshold(-0.54, 0)) + self.assertTrue(model_helpers.past_stop_threshold(0, 0)) + self.assertTrue(model_helpers.past_stop_threshold(0.54, 0.54)) + + def test_past_stop_threshold_none_false(self): + """Tests that check None returns false.""" + self.assertFalse(model_helpers.past_stop_threshold(None, -1.5)) + self.assertFalse(model_helpers.past_stop_threshold(None, None)) + self.assertFalse(model_helpers.past_stop_threshold(None, 1.5)) + # Zero should be okay, though. + self.assertTrue(model_helpers.past_stop_threshold(0, 1.5)) + + def test_past_stop_threshold_not_number(self): + """Tests for error conditions.""" + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", 1) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", tf.constant(5)) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", "another") + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(0, None) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(0.7, "str") + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(tf.constant(4), None) + + +class SyntheticDataTest(tf.test.TestCase): + """Tests for generate_synthetic_data.""" + + def test_generate_synethetic_data(self): + input_element, label_element = tf.compat.v1.data.make_one_shot_iterator( + model_helpers.generate_synthetic_data(input_shape=tf.TensorShape([5]), + input_value=123, + input_dtype=tf.float32, + label_shape=tf.TensorShape([]), + label_value=456, + label_dtype=tf.int32)).get_next() + + with self.session() as sess: + for n in range(5): + inp, lab = sess.run((input_element, label_element)) + self.assertAllClose(inp, [123., 123., 123., 123., 123.]) + self.assertEquals(lab, 456) + + def test_generate_only_input_data(self): + d = model_helpers.generate_synthetic_data( + input_shape=tf.TensorShape([4]), + input_value=43.5, + input_dtype=tf.float32) + + element = tf.compat.v1.data.make_one_shot_iterator(d).get_next() + self.assertFalse(isinstance(element, tuple)) + + with self.session() as sess: + inp = sess.run(element) + self.assertAllClose(inp, [43.5, 43.5, 43.5, 43.5]) + + def test_generate_nested_data(self): + d = model_helpers.generate_synthetic_data( + input_shape={'a': tf.TensorShape([2]), + 'b': {'c': tf.TensorShape([3]), 'd': tf.TensorShape([])}}, + input_value=1.1) + + element = tf.compat.v1.data.make_one_shot_iterator(d).get_next() + self.assertIn('a', element) + self.assertIn('b', element) + self.assertEquals(len(element['b']), 2) + self.assertIn('c', element['b']) + self.assertIn('d', element['b']) + self.assertNotIn('c', element) + + with self.session() as sess: + inp = sess.run(element) + self.assertAllClose(inp['a'], [1.1, 1.1]) + self.assertAllClose(inp['b']['c'], [1.1, 1.1, 1.1]) + self.assertAllClose(inp['b']['d'], 1.1) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/tpu_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/tpu_lib.py new file mode 100644 index 0000000..4d4cddb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/misc/tpu_lib.py @@ -0,0 +1,34 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Initializes TPU system for TF 2.0.""" + +import tensorflow as tf + + +def tpu_initialize(tpu_address): + """Initializes TPU for TF 2.0 training. + + Args: + tpu_address: string, bns address of master TPU worker. + + Returns: + A TPUClusterResolver. + """ + cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver( + tpu=tpu_address) + if tpu_address not in ('', 'local'): + tf.config.experimental_connect_to_cluster(cluster_resolver) + tf.tpu.experimental.initialize_tpu_system(cluster_resolver) + return cluster_resolver diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/integration.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/integration.py new file mode 100644 index 0000000..b4809a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/integration.py @@ -0,0 +1,71 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper code to run complete models from within python. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import shutil +import sys +import tempfile + +from absl import flags +from absl.testing import flagsaver + +from official.utils.flags import core as flags_core + + +@flagsaver.flagsaver +def run_synthetic(main, tmp_root, extra_flags=None, synth=True, train_epochs=1, + epochs_between_evals=1): + """Performs a minimal run of a model. + + This function is intended to test for syntax errors throughout a model. A + very limited run is performed using synthetic data. + + Args: + main: The primary function used to exercise a code path. Generally this + function is ".main(argv)". + tmp_root: Root path for the temp directory created by the test class. + extra_flags: Additional flags passed by the caller of this function. + synth: Use synthetic data. + train_epochs: Value of the --train_epochs flag. + epochs_between_evals: Value of the --epochs_between_evals flag. + """ + + extra_flags = [] if extra_flags is None else extra_flags + + model_dir = tempfile.mkdtemp(dir=tmp_root) + + args = [sys.argv[0], "--model_dir", model_dir] + extra_flags + + if synth: + args.append("--use_synthetic_data") + + if train_epochs is not None: + args.extend(["--train_epochs", str(train_epochs)]) + + if epochs_between_evals is not None: + args.extend(["--epochs_between_evals", str(epochs_between_evals)]) + + try: + flags_core.parse_flags(argv=args) + main(flags.FLAGS) + finally: + if os.path.exists(model_dir): + shutil.rmtree(model_dir) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/mock_lib.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/mock_lib.py new file mode 100644 index 0000000..ee4de3c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/mock_lib.py @@ -0,0 +1,36 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Mock objects and related functions for testing.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +class MockBenchmarkLogger(object): + """This is a mock logger that can be used in dependent tests.""" + + def __init__(self): + self.logged_metric = [] + + def log_metric(self, name, value, unit=None, global_step=None, + extras=None): + self.logged_metric.append({ + "name": name, + "value": float(value), + "unit": unit, + "global_step": global_step, + "extras": extras}) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/pylint.rcfile b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/pylint.rcfile new file mode 100644 index 0000000..b872802 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/pylint.rcfile @@ -0,0 +1,168 @@ +[MESSAGES CONTROL] +disable=R,W,bad-option-value,trailing-newlines,no-name-in-module + +[REPORTS] +# Tells whether to display a full report or only the messages +reports=no + +# Activate the evaluation score. +score=no + +[BASIC] + +# Regular expression matching correct argument names +argument-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct attribute names +attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct class names +class-rgx=^_?[A-Z][a-zA-Z0-9]*$ + +# Regular expression matching correct constant names +const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=10 + +# Regular expression matching correct function names +function-rgx=^(?:(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ + +# Good variable names which should always be accepted, separated by a comma +good-names=main,_ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct method names +method-rgx=^(?:(?P__[a-z0-9_]+__|next)|(?P_{0,2}[A-Z][a-zA-Z0-9]*)|(?P_{0,2}[a-z][a-z0-9_]*)|(setUp|tearDown))$ + +# Regular expression matching correct module names +module-rgx=^(_?[a-z][a-z0-9_]*)|__init__|PRESUBMIT|PRESUBMIT_unittest$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(__.*__|main|.*ArgParser) + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +variable-rgx=^[a-z][a-z0-9_]*$ + +[TYPECHECK] + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=absl, absl.*, official, official.*, tensorflow, tensorflow.*, LazyLoader, google, google.cloud.* + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + +# This is deprecated, because it is not used anymore. +#ignore-iface-methods= + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls,class_ + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of statements in function / method body +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=StandardError,Exception,BaseException + + +[FORMAT] + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=80 + +# Maximum number of lines in a module +max-module-lines=99999 + +# List of optional constructs for which whitespace checking is disabled +no-space-check= + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=yes + +# Allow URLs and comment type annotations to exceed the max line length as neither can be easily +# split across lines. +ignore-long-lines=^\s*(?:(# )??$|# type:) + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) + +# Tells whether we should check for unused import in __init__ files. +init-import=no diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/builds_common.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/builds_common.sh new file mode 100644 index 0000000..3cf08bb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/builds_common.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Common Bash functions used by build scripts + +COLOR_NC='\033[0m' +COLOR_BOLD='\033[1m' +COLOR_LIGHT_GRAY='\033[0;37m' +COLOR_GREEN='\033[0;32m' +COLOR_RED='\033[0;31m' + +die() { + # Print a message and exit with code 1. + # + # Usage: die + # e.g., die "Something bad happened." + + echo $@ + exit 1 +} + +num_cpus() { + # Get the number of CPUs + N_CPUS=$(grep -c ^processor /proc/cpuinfo) + if [[ -z ${N_CPUS} ]]; then + die "ERROR: Unable to determine the number of CPUs" + fi + + echo ${N_CPUS} +} + +# List files changed (i.e., added, or revised) from +# the common ancestor of HEAD and the latest master branch. +# Usage: get_changed_files_from_master_branch +get_changed_files_from_master_branch() { + ANCESTOR=$(git merge-base HEAD master origin/master) + git diff ${ANCESTOR} --diff-filter=d --name-only "$@" +} + +# List python files changed that still exist, +# i.e., not removed. +# Usage: get_py_files_to_check [--incremental] +get_py_files_to_check() { + if [[ "$1" == "--incremental" ]]; then + get_changed_files_from_master_branch -- '*.py' + elif [[ -z "$1" ]]; then + find official/ -name '*.py' + else + die "Found unsupported args: $@ for get_py_files_to_check." + fi +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh new file mode 100644 index 0000000..97d6bc2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Sanity check script that runs tests and lint under local environment. +# Make sure that tensorflow and pylint is installed. +# usage: models >: ./official/utils/testing/scripts/ci_sanity.sh do_pylint --incremental +set +x + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${SCRIPT_DIR}/builds_common.sh" +cd "$SCRIPT_DIR/../../../.." +MODEL_ROOT="$(pwd)" + +export PYTHONPATH="$PYTHONPATH:${MODEL_ROOT}" + +# Run pylint +do_pylint() { + # Usage: do_pylint [--incremental] + # + # Options: + # --incremental Performs check on only the python files changed in the + # last non-merge git commit. + + # Use this list to whitelist pylint errors + ERROR_WHITELIST="" + + echo "ERROR_WHITELIST=\"${ERROR_WHITELIST}\"" + + PYLINT_BIN="python3 -m pylint" + + PYTHON_SRC_FILES=$(get_py_files_to_check $1) + if [[ -z ${PYTHON_SRC_FILES} ]]; then + echo "do_pylint found no Python files to check. Returning." + return 0 + fi + + PYLINTRC_FILE="official/utils/testing/pylint.rcfile" + + if [[ ! -f "${PYLINTRC_FILE}" ]]; then + die "ERROR: Cannot find pylint rc file at ${PYLINTRC_FILE}" + fi + + NUM_SRC_FILES=$(echo ${PYTHON_SRC_FILES} | wc -w) + NUM_CPUS=$(num_cpus) + + echo "Running pylint on ${NUM_SRC_FILES} files with ${NUM_CPUS} "\ + "parallel jobs..." + echo "" + + PYLINT_START_TIME=$(date +'%s') + OUTPUT_FILE="$(mktemp)_pylint_output.log" + ERRORS_FILE="$(mktemp)_pylint_errors.log" + NONWL_ERRORS_FILE="$(mktemp)_pylint_nonwl_errors.log" + + rm -rf ${OUTPUT_FILE} + rm -rf ${ERRORS_FILE} + rm -rf ${NONWL_ERRORS_FILE} + touch ${NONWL_ERRORS_FILE} + + ${PYLINT_BIN} --rcfile="${PYLINTRC_FILE}" --output-format=parseable \ + --jobs=${NUM_CPUS} ${PYTHON_SRC_FILES} > ${OUTPUT_FILE} 2>&1 + PYLINT_END_TIME=$(date +'%s') + + echo "" + echo "pylint took $((PYLINT_END_TIME - PYLINT_START_TIME)) s" + echo "" + + # Report only what we care about + # Ref https://pylint.readthedocs.io/en/latest/technical_reference/features.html + # E: all errors + # W0311 bad-indentation + # W0312 mixed-indentation + # C0330 bad-continuation + # C0301 line-too-long + # C0326 bad-whitespace + # W0611 unused-import + # W0622 redefined-builtin + grep -E '(\[E|\[W0311|\[W0312|\[C0330|\[C0301|\[C0326|\[W0611|\[W0622)' ${OUTPUT_FILE} > ${ERRORS_FILE} + + N_ERRORS=0 + while read -r LINE; do + IS_WHITELISTED=0 + for WL_REGEX in ${ERROR_WHITELIST}; do + if echo ${LINE} | grep -q "${WL_REGEX}"; then + echo "Found a whitelisted error:" + echo " ${LINE}" + IS_WHITELISTED=1 + fi + done + + if [[ ${IS_WHITELISTED} == "0" ]]; then + echo "${LINE}" >> ${NONWL_ERRORS_FILE} + echo "" >> ${NONWL_ERRORS_FILE} + ((N_ERRORS++)) + fi + done <${ERRORS_FILE} + + echo "Raw lint output file: ${OUTPUT_FILE}" + + echo "" + if [[ ${N_ERRORS} != 0 ]]; then + echo "FAIL: Found ${N_ERRORS} non-whitelited pylint errors:" + cat "${NONWL_ERRORS_FILE}" + return 1 + else + echo "PASS: No non-whitelisted pylint errors were found." + return 0 + fi +} + +test_result=0 + +TESTS="$@" + +for t in "${TESTS}"; do + ${t} || test_result=$? +done + +exit "${test_result}" diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/presubmit.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/presubmit.sh new file mode 100644 index 0000000..954d96d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/utils/testing/scripts/presubmit.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Presubmit script that runs tests and lint under local environment. +# Make sure that tensorflow and pylint is installed. +# usage: models >: ./official/utils/testing/scripts/presubmit.sh +# usage: models >: ./official/utils/testing/scripts/presubmit.sh lint py2_test py3_test +set +x + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR/../../../.." +MODEL_ROOT="$(pwd)" + +export PYTHONPATH="$PYTHONPATH:${MODEL_ROOT}" + +py_test() { + local PY_BINARY="$1" + local exit_code=0 + + echo "===========Running Python test============" + + for test_file in `find official/ -name '*test.py' -print` + do + echo "####=======Testing ${test_file}=======####" + ${PY_BINARY} "${test_file}" + _exit_code=$? + if [[ $_exit_code != 0 ]]; then + exit_code=$_exit_code + echo "FAIL: ${test_file}" + fi + done + + return "${exit_code}" +} + +py2_test() { + local PY_BINARY=$(which python2) + py_test "$PY_BINARY" + return $? +} + +py3_test() { + local PY_BINARY=$(which python3) + py_test "$PY_BINARY" + return $? +} + +test_result=0 + +if [ "$#" -eq 0 ]; then + TESTS="lint py2_test py3_test" +else + TESTS="$@" +fi + +for t in "${TESTS}"; do + ${t} || test_result=$? +done + +exit "${test_result}" diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/README.md new file mode 100644 index 0000000..a28caba --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/README.md @@ -0,0 +1,244 @@ +# Object Detection Models on TensorFlow 2 + +**Note**: This repository is still under construction. +More features and instructions will be added soon. + +## Prerequsite +To get started, download the code from TensorFlow models GitHub repository or +use the pre-installed Google Cloud VM. + +```bash +git clone https://github.com/tensorflow/models.git +``` + +Next, make sure to use TensorFlow 2.1+ on Google Cloud. Also here are +a few package you need to install to get started: + +```bash +sudo apt-get install -y python-tk && \ +pip3 install -r ~/models/official/requirements.txt +``` + +## Train RetinaNet on TPU + +### Train a vanilla ResNet-50 based RetinaNet. + +```bash +TPU_NAME="" +MODEL_DIR="" +RESNET_CHECKPOINT="" +TRAIN_FILE_PATTERN="" +EVAL_FILE_PATTERN="" +VAL_JSON_FILE="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=tpu \ + --tpu="${TPU_NAME?}" \ + --model_dir="${MODEL_DIR?}" \ + --mode=train \ + --params_override="{ type: retinanet, train: { checkpoint: { path: ${RESNET_CHECKPOINT?}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN?} }, eval: { val_json_file: ${VAL_JSON_FILE?}, eval_file_pattern: ${EVAL_FILE_PATTERN?} } }" +``` + +### Train a custom RetinaNet using the config file. + +First, create a YAML config file, e.g. *my_retinanet.yaml*. This file specifies +the parameters to be overridden, which should at least include the following +fields. + +```YAML +# my_retinanet.yaml +type: 'retinanet' +train: + train_file_pattern: +eval: + eval_file_pattern: + val_json_file: +``` + +Once the YAML config file is created, you can launch the training using the +following command. + +```bash +TPU_NAME="" +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=tpu \ + --tpu="${TPU_NAME?}" \ + --model_dir="${MODEL_DIR?}" \ + --mode=train \ + --config_file="my_retinanet.yaml" +``` + +## Train RetinaNet on GPU + +Training on GPU is similar to that on TPU. The major change is the strategy +type (use "[mirrored](https://www.tensorflow.org/api_docs/python/tf/distribute/MirroredStrategy)" for multiple GPU and +"[one_device](https://www.tensorflow.org/api_docs/python/tf/distribute/OneDeviceStrategy)" for single GPU). + +Multi-GPUs example (assuming there are 8GPU connected to the host): + +```bash +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=mirrored \ + --num_gpus=8 \ + --model_dir="${MODEL_DIR?}" \ + --mode=train \ + --config_file="my_retinanet.yaml" +``` + +```bash +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=one_device \ + --num_gpus=1 \ + --model_dir="${MODEL_DIR?}" \ + --mode=train \ + --config_file="my_retinanet.yaml" +``` + +An example with inline configuration (YAML or JSON format): + +``` +python3 ~/models/official/vision/detection/main.py \ + --model_dir= \ + --strategy_type=one_device \ + --num_gpus=1 \ + --mode=train \ + --params_override="eval: + eval_file_pattern: + batch_size: 8 + val_json_file: +predict: + predict_batch_size: 8 +architecture: + use_bfloat16: False +retinanet_parser: + use_bfloat16: Flase +train: + total_steps: 1 + batch_size: 8 + train_file_pattern: +use_tpu: False +" +``` + +--- + +## Train Mask R-CNN on TPU + +### Train a vanilla ResNet-50 based Mask R-CNN. + +```bash +TPU_NAME="" +MODEL_DIR="" +RESNET_CHECKPOINT="" +TRAIN_FILE_PATTERN="" +EVAL_FILE_PATTERN="" +VAL_JSON_FILE="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=tpu \ + --tpu=${TPU_NAME} \ + --model_dir=${MODEL_DIR} \ + --mode=train \ + --model=mask_rcnn \ + --params_override="{train: { checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN} } }" +``` + +### Train a custom Mask R-CNN using the config file. + +First, create a YAML config file, e.g. *my_maskrcnn.yaml*. +This file specifies the parameters to be overridden, +which should at least include the following fields. + +```YAML +# my_maskrcnn.yaml +train: + train_file_pattern: +eval: + eval_file_pattern: + val_json_file: +``` + +Once the YAML config file is created, you can launch the training using the +following command. + +```bash +TPU_NAME="" +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=tpu \ + --tpu=${TPU_NAME} \ + --model_dir=${MODEL_DIR} \ + --mode=train \ + --model=mask_rcnn \ + --config_file="my_maskrcnn.yaml" +``` + +## Train Mask R-CNN on GPU + +Training on GPU is similar to that on TPU. The major change is the strategy type +(use +"[mirrored](https://www.tensorflow.org/api_docs/python/tf/distribute/MirroredStrategy)" +for multiple GPU and +"[one_device](https://www.tensorflow.org/api_docs/python/tf/distribute/OneDeviceStrategy)" +for single GPU). + +Multi-GPUs example (assuming there are 8GPU connected to the host): + +```bash +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=mirrored \ + --num_gpus=8 \ + --model_dir=${MODEL_DIR} \ + --mode=train \ + --model=mask_rcnn \ + --config_file="my_maskrcnn.yaml" +``` + +```bash +MODEL_DIR="" +python3 ~/models/official/vision/detection/main.py \ + --strategy_type=one_device \ + --num_gpus=1 \ + --model_dir=${MODEL_DIR} \ + --mode=train \ + --model=mask_rcnn \ + --config_file="my_maskrcnn.yaml" +``` + +An example with inline configuration (YAML or JSON format): + +``` +python3 ~/models/official/vision/detection/main.py \ + --model_dir= \ + --strategy_type=one_device \ + --num_gpus=1 \ + --mode=train \ + --model=mask_rcnn \ + --params_override="eval: + eval_file_pattern: + batch_size: 8 + val_json_file: +predict: + predict_batch_size: 8 +architecture: + use_bfloat16: False +maskrcnn_parser: + use_bfloat16: Flase +train: + total_steps: 1000 + batch_size: 8 + train_file_pattern: +use_tpu: False +" +``` + +Note: The JSON groundtruth file is useful for [COCO dataset](http://cocodataset.org/#home) and can be +downloaded from the [COCO website](http://cocodataset.org/#download). For custom dataset, it is unncessary because the groundtruth can be included in the TFRecord files. + +## References + +1. [Focal Loss for Dense Object Detection](https://arxiv.org/abs/1708.02002). + Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, and Piotr Dollár. IEEE + International Conference on Computer Vision (ICCV), 2017. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/base_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/base_config.py new file mode 100644 index 0000000..b23a7d5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/base_config.py @@ -0,0 +1,120 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Base config template.""" + +# pylint: disable=line-too-long + +# For ResNet, this freezes the variables of the first conv1 and conv2_x +# layers [1], which leads to higher training speed and slightly better testing +# accuracy. The intuition is that the low-level architecture (e.g., ResNet-50) +# is able to capture low-level features such as edges; therefore, it does not +# need to be fine-tuned for the detection task. +# Note that we need to trailing `/` to avoid the incorrect match. +# [1]: https://github.com/facebookresearch/Detectron/blob/master/detectron/core/config.py#L198 +RESNET_FROZEN_VAR_PREFIX = r'(resnet\d+)\/(conv2d(|_([1-9]|10))|batch_normalization(|_([1-9]|10)))\/' + +REGULARIZATION_VAR_REGEX = r'.*(kernel|weight):0$' + +BASE_CFG = { + 'model_dir': '', + 'use_tpu': True, + 'strategy_type': 'tpu', + 'isolate_session_state': False, + 'train': { + 'iterations_per_loop': 100, + 'batch_size': 64, + 'total_steps': 22500, + 'num_cores_per_replica': None, + 'input_partition_dims': None, + 'optimizer': { + 'type': 'momentum', + 'momentum': 0.9, + }, + 'learning_rate': { + 'type': 'step', + 'warmup_learning_rate': 0.0067, + 'warmup_steps': 500, + 'init_learning_rate': 0.08, + 'learning_rate_levels': [0.008, 0.0008], + 'learning_rate_steps': [15000, 20000], + 'total_steps': 22500, + }, + 'checkpoint': { + 'path': '', + 'prefix': '', + }, + 'frozen_variable_prefix': RESNET_FROZEN_VAR_PREFIX, + 'train_file_pattern': '', + 'train_dataset_type': 'tfrecord', + 'transpose_input': False, + 'regularization_variable_regex': REGULARIZATION_VAR_REGEX, + 'l2_weight_decay': 0.0001, + 'gradient_clip_norm': 0.0, + }, + 'eval': { + 'batch_size': 8, + 'eval_samples': 5000, + 'min_eval_interval': 180, + 'eval_timeout': None, + 'num_steps_per_eval': 1000, + 'type': 'box', + 'use_json_file': True, + 'val_json_file': '', + 'eval_file_pattern': '', + 'eval_dataset_type': 'tfrecord', + }, + 'predict': { + 'batch_size': 8, + }, + 'anchor': { + 'min_level': 3, + 'max_level': 7, + 'num_scales': 3, + 'aspect_ratios': [1.0, 2.0, 0.5], + 'anchor_size': 4.0, + }, + 'resnet': { + 'resnet_depth': 50, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + 'use_sync_bn': False, + }, + }, + 'fpn': { + 'min_level': 3, + 'max_level': 7, + 'fpn_feat_dims': 256, + 'use_separable_conv': False, + 'use_batch_norm': True, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + 'use_sync_bn': False, + }, + }, + 'postprocess': { + 'use_batched_nms': False, + 'max_total_size': 100, + 'nms_iou_threshold': 0.5, + 'score_threshold': 0.05, + 'pre_nms_num_boxes': 5000, + }, + 'enable_summary': False, +} + +# pylint: enable=line-too-long diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/factory.py new file mode 100644 index 0000000..186d89b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/factory.py @@ -0,0 +1,33 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Factory to provide model configs.""" + +from official.vision.detection.configs import maskrcnn_config +from official.vision.detection.configs import retinanet_config +from official.modeling.hyperparams import params_dict + + +def config_generator(model): + """Model function generator.""" + if model == 'retinanet': + default_config = retinanet_config.RETINANET_CFG + restrictions = retinanet_config.RETINANET_RESTRICTIONS + elif model == 'mask_rcnn': + default_config = maskrcnn_config.MASKRCNN_CFG + restrictions = maskrcnn_config.MASKRCNN_RESTRICTIONS + else: + raise ValueError('Model %s is not supported.' % model) + + return params_dict.ParamsDict(default_config, restrictions) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/maskrcnn_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/maskrcnn_config.py new file mode 100644 index 0000000..2f4f3f1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/maskrcnn_config.py @@ -0,0 +1,169 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Config template to train Mask R-CNN.""" + +from official.modeling.hyperparams import params_dict +from official.vision.detection.configs import base_config + + +# pylint: disable=line-too-long +MASKRCNN_CFG = params_dict.ParamsDict(base_config.BASE_CFG) +MASKRCNN_CFG.override({ + 'type': 'mask_rcnn', + 'eval': { + 'type': 'box_and_mask', + 'num_images_to_visualize': 0, + }, + 'architecture': { + 'parser': 'maskrcnn_parser', + 'backbone': 'resnet', + 'multilevel_features': 'fpn', + 'use_bfloat16': True, + 'include_mask': True, + }, + 'maskrcnn_parser': { + 'use_bfloat16': True, + 'output_size': [1024, 1024], + 'num_channels': 3, + 'rpn_match_threshold': 0.7, + 'rpn_unmatched_threshold': 0.3, + 'rpn_batch_size_per_im': 256, + 'rpn_fg_fraction': 0.5, + 'aug_rand_hflip': True, + 'aug_scale_min': 1.0, + 'aug_scale_max': 1.0, + 'skip_crowd_during_training': True, + 'max_num_instances': 100, + 'include_mask': True, + 'mask_crop_size': 112, + }, + 'anchor': { + 'min_level': 2, + 'max_level': 6, + 'num_scales': 1, + 'anchor_size': 8, + }, + 'fpn': { + 'min_level': 2, + 'max_level': 6, + }, + 'nasfpn': { + 'min_level': 2, + 'max_level': 6, + }, + # tunable_nasfpn:strip_begin + 'tunable_nasfpn_v1': { + 'min_level': 2, + 'max_level': 6, + }, + # tunable_nasfpn:strip_end + 'rpn_head': { + 'min_level': 2, + 'max_level': 6, + 'anchors_per_location': 3, + 'num_convs': 2, + 'num_filters': 256, + 'use_separable_conv': False, + 'use_batch_norm': False, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + 'use_sync_bn': False, + }, + }, + 'frcnn_head': { + # Note that `num_classes` is the total number of classes including + # one background classes whose index is 0. + 'num_classes': 91, + 'num_convs': 0, + 'num_filters': 256, + 'use_separable_conv': False, + 'num_fcs': 2, + 'fc_dims': 1024, + 'use_batch_norm': False, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + 'use_sync_bn': False, + }, + }, + 'mrcnn_head': { + 'num_classes': 91, + 'mask_target_size': 28, + 'num_convs': 4, + 'num_filters': 256, + 'use_separable_conv': False, + 'use_batch_norm': False, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + 'use_sync_bn': False, + }, + }, + 'rpn_score_loss': { + 'rpn_batch_size_per_im': 256, + }, + 'rpn_box_loss': { + 'huber_loss_delta': 1.0 / 9.0, + }, + 'frcnn_box_loss': { + 'huber_loss_delta': 1.0, + }, + 'roi_proposal': { + 'rpn_pre_nms_top_k': 2000, + 'rpn_post_nms_top_k': 1000, + 'rpn_nms_threshold': 0.7, + 'rpn_score_threshold': 0.0, + 'rpn_min_size_threshold': 0.0, + 'test_rpn_pre_nms_top_k': 1000, + 'test_rpn_post_nms_top_k': 1000, + 'test_rpn_nms_threshold': 0.7, + 'test_rpn_score_threshold': 0.0, + 'test_rpn_min_size_threshold': 0.0, + 'use_batched_nms': False, + }, + 'roi_sampling': { + 'num_samples_per_image': 512, + 'fg_fraction': 0.25, + 'fg_iou_thresh': 0.5, + 'bg_iou_thresh_hi': 0.5, + 'bg_iou_thresh_lo': 0.0, + 'mix_gt_boxes': True, + }, + 'mask_sampling': { + 'num_mask_samples_per_image': 128, # Typically = `num_samples_per_image` * `fg_fraction`. + 'mask_target_size': 28, + }, + 'postprocess': { + 'use_batched_nms': False, + 'max_total_size': 100, + 'nms_iou_threshold': 0.5, + 'score_threshold': 0.05, + 'pre_nms_num_boxes': 1000, + }, +}, is_strict=False) + + +MASKRCNN_RESTRICTIONS = [ + 'architecture.use_bfloat16 == maskrcnn_parser.use_bfloat16', + 'architecture.include_mask == maskrcnn_parser.include_mask', + 'anchor.min_level == rpn_head.min_level', + 'anchor.max_level == rpn_head.max_level', + 'mrcnn_head.mask_target_size == mask_sampling.mask_target_size', +] +# pylint: enable=line-too-long diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/retinanet_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/retinanet_config.py new file mode 100644 index 0000000..70ee4bb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/configs/retinanet_config.py @@ -0,0 +1,171 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Config template to train Retinanet.""" + +# pylint: disable=line-too-long + +# For ResNet-50, this freezes the variables of the first conv1 and conv2_x +# layers [1], which leads to higher training speed and slightly better testing +# accuracy. The intuition is that the low-level architecture (e.g., ResNet-50) +# is able to capture low-level features such as edges; therefore, it does not +# need to be fine-tuned for the detection task. +# Note that we need to trailing `/` to avoid the incorrect match. +# [1]: https://github.com/facebookresearch/Detectron/blob/master/detectron/core/config.py#L198 +RESNET_FROZEN_VAR_PREFIX = r'(resnet\d+)\/(conv2d(|_([1-9]|10))|batch_normalization(|_([1-9]|10)))\/' +REGULARIZATION_VAR_REGEX = r'.*(kernel|weight):0$' + +# pylint: disable=line-too-long +RETINANET_CFG = { + 'type': 'retinanet', + 'model_dir': '', + 'use_tpu': True, + 'strategy_type': 'tpu', + 'train': { + 'batch_size': 64, + 'iterations_per_loop': 500, + 'total_steps': 22500, + 'optimizer': { + 'type': 'momentum', + 'momentum': 0.9, + 'nesterov': True, # `False` is better for TPU v3-128. + }, + 'learning_rate': { + 'type': 'step', + 'warmup_learning_rate': 0.0067, + 'warmup_steps': 500, + 'init_learning_rate': 0.08, + 'learning_rate_levels': [0.008, 0.0008], + 'learning_rate_steps': [15000, 20000], + }, + 'checkpoint': { + 'path': '', + 'prefix': '', + }, + 'frozen_variable_prefix': RESNET_FROZEN_VAR_PREFIX, + 'train_file_pattern': '', + # TODO(b/142174042): Support transpose_input option. + 'transpose_input': False, + 'regularization_variable_regex': REGULARIZATION_VAR_REGEX, + 'l2_weight_decay': 0.0001, + 'input_sharding': False, + }, + 'eval': { + 'batch_size': 8, + 'min_eval_interval': 180, + 'eval_timeout': None, + 'eval_samples': 5000, + 'type': 'box', + 'val_json_file': '', + 'eval_file_pattern': '', + 'input_sharding': True, + # When visualizing images, set evaluation batch size to 40 to avoid + # potential OOM. + 'num_images_to_visualize': 0, + }, + 'predict': { + 'predict_batch_size': 8, + }, + 'architecture': { + 'parser': 'retinanet_parser', + 'backbone': 'resnet', + 'multilevel_features': 'fpn', + 'use_bfloat16': False, + }, + 'anchor': { + 'min_level': 3, + 'max_level': 7, + 'num_scales': 3, + 'aspect_ratios': [1.0, 2.0, 0.5], + 'anchor_size': 4.0, + }, + 'retinanet_parser': { + 'use_bfloat16': False, + 'output_size': [640, 640], + 'num_channels': 3, + 'match_threshold': 0.5, + 'unmatched_threshold': 0.5, + 'aug_rand_hflip': True, + 'aug_scale_min': 1.0, + 'aug_scale_max': 1.0, + 'use_autoaugment': False, + 'autoaugment_policy_name': 'v0', + 'skip_crowd_during_training': True, + 'max_num_instances': 100, + }, + 'resnet': { + 'resnet_depth': 50, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + }, + }, + 'fpn': { + 'min_level': 3, + 'max_level': 7, + 'fpn_feat_dims': 256, + 'use_separable_conv': False, + 'use_batch_norm': True, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + }, + }, + 'retinanet_head': { + 'min_level': 3, + 'max_level': 7, + # Note that `num_classes` is the total number of classes including + # one background classes whose index is 0. + 'num_classes': 91, + 'anchors_per_location': 9, + 'retinanet_head_num_convs': 4, + 'retinanet_head_num_filters': 256, + 'use_separable_conv': False, + 'batch_norm': { + 'batch_norm_momentum': 0.997, + 'batch_norm_epsilon': 1e-4, + 'batch_norm_trainable': True, + }, + }, + 'retinanet_loss': { + 'num_classes': 91, + 'focal_loss_alpha': 0.25, + 'focal_loss_gamma': 1.5, + 'huber_loss_delta': 0.1, + 'box_loss_weight': 50, + }, + 'postprocess': { + 'use_batched_nms': False, + 'min_level': 3, + 'max_level': 7, + 'max_total_size': 100, + 'nms_iou_threshold': 0.5, + 'score_threshold': 0.05, + 'pre_nms_num_boxes': 5000, + }, + 'enable_summary': False, +} + +RETINANET_RESTRICTIONS = [ + 'architecture.use_bfloat16 == retinanet_parser.use_bfloat16', + 'anchor.min_level == retinanet_head.min_level', + 'anchor.max_level == retinanet_head.max_level', + 'anchor.min_level == postprocess.min_level', + 'anchor.max_level == postprocess.max_level', + 'retinanet_head.num_classes == retinanet_loss.num_classes', +] + +# pylint: enable=line-too-long diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/anchor.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/anchor.py new file mode 100644 index 0000000..bb7fca8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/anchor.py @@ -0,0 +1,292 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Anchor box and labeler definition.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import tensorflow.compat.v2 as tf +from official.vision.detection.utils.object_detection import argmax_matcher +from official.vision.detection.utils.object_detection import balanced_positive_negative_sampler +from official.vision.detection.utils.object_detection import box_list +from official.vision.detection.utils.object_detection import faster_rcnn_box_coder +from official.vision.detection.utils.object_detection import region_similarity_calculator +from official.vision.detection.utils.object_detection import target_assigner + + +class Anchor(object): + """Anchor class for anchor-based object detectors.""" + + def __init__(self, + min_level, + max_level, + num_scales, + aspect_ratios, + anchor_size, + image_size): + """Constructs multiscale anchors. + + Args: + min_level: integer number of minimum level of the output feature pyramid. + max_level: integer number of maximum level of the output feature pyramid. + num_scales: integer number representing intermediate scales added + on each level. For instances, num_scales=2 adds one additional + intermediate anchor scales [2^0, 2^0.5] on each level. + aspect_ratios: list of float numbers representing the aspect raito anchors + added on each level. The number indicates the ratio of width to height. + For instances, aspect_ratios=[1.0, 2.0, 0.5] adds three anchors on each + scale level. + anchor_size: float number representing the scale of size of the base + anchor to the feature stride 2^level. + image_size: a list of integer numbers or Tensors representing + [height, width] of the input image size.The image_size should be divided + by the largest feature stride 2^max_level. + """ + self.min_level = min_level + self.max_level = max_level + self.num_scales = num_scales + self.aspect_ratios = aspect_ratios + self.anchor_size = anchor_size + self.image_size = image_size + self.boxes = self._generate_boxes() + + def _generate_boxes(self): + """Generates multiscale anchor boxes. + + Returns: + a Tensor of shape [N, 4], represneting anchor boxes of all levels + concatenated together. + """ + boxes_all = [] + for level in range(self.min_level, self.max_level + 1): + boxes_l = [] + for scale in range(self.num_scales): + for aspect_ratio in self.aspect_ratios: + stride = 2 ** level + intermidate_scale = 2 ** (scale / float(self.num_scales)) + base_anchor_size = self.anchor_size * stride * intermidate_scale + aspect_x = aspect_ratio ** 0.5 + aspect_y = aspect_ratio ** -0.5 + half_anchor_size_x = base_anchor_size * aspect_x / 2.0 + half_anchor_size_y = base_anchor_size * aspect_y / 2.0 + x = tf.range(stride / 2, self.image_size[1], stride) + y = tf.range(stride / 2, self.image_size[0], stride) + xv, yv = tf.meshgrid(x, y) + xv = tf.cast(tf.reshape(xv, [-1]), dtype=tf.float32) + yv = tf.cast(tf.reshape(yv, [-1]), dtype=tf.float32) + # Tensor shape Nx4. + boxes = tf.stack([yv - half_anchor_size_y, xv - half_anchor_size_x, + yv + half_anchor_size_y, xv + half_anchor_size_x], + axis=1) + boxes_l.append(boxes) + # Concat anchors on the same level to tensor shape NxAx4. + boxes_l = tf.stack(boxes_l, axis=1) + boxes_l = tf.reshape(boxes_l, [-1, 4]) + boxes_all.append(boxes_l) + return tf.concat(boxes_all, axis=0) + + def unpack_labels(self, labels): + """Unpacks an array of labels into multiscales labels.""" + unpacked_labels = collections.OrderedDict() + count = 0 + for level in range(self.min_level, self.max_level + 1): + feat_size_y = tf.cast(self.image_size[0] / 2 ** level, tf.int32) + feat_size_x = tf.cast(self.image_size[1] / 2 ** level, tf.int32) + steps = feat_size_y * feat_size_x * self.anchors_per_location + unpacked_labels[level] = tf.reshape( + labels[count:count + steps], [feat_size_y, feat_size_x, -1]) + count += steps + return unpacked_labels + + @property + def anchors_per_location(self): + return self.num_scales * len(self.aspect_ratios) + + @property + def multilevel_boxes(self): + return self.unpack_labels(self.boxes) + + +class AnchorLabeler(object): + """Labeler for dense object detector.""" + + def __init__(self, + anchor, + match_threshold=0.5, + unmatched_threshold=0.5): + """Constructs anchor labeler to assign labels to anchors. + + Args: + anchor: an instance of class Anchors. + match_threshold: a float number between 0 and 1 representing the + lower-bound threshold to assign positive labels for anchors. An anchor + with a score over the threshold is labeled positive. + unmatched_threshold: a float number between 0 and 1 representing the + upper-bound threshold to assign negative labels for anchors. An anchor + with a score below the threshold is labeled negative. + """ + similarity_calc = region_similarity_calculator.IouSimilarity() + matcher = argmax_matcher.ArgMaxMatcher( + match_threshold, + unmatched_threshold=unmatched_threshold, + negatives_lower_than_unmatched=True, + force_match_for_each_row=True) + box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder() + + self._target_assigner = target_assigner.TargetAssigner( + similarity_calc, matcher, box_coder) + self._anchor = anchor + self._match_threshold = match_threshold + self._unmatched_threshold = unmatched_threshold + + def label_anchors(self, gt_boxes, gt_labels): + """Labels anchors with ground truth inputs. + + Args: + gt_boxes: A float tensor with shape [N, 4] representing groundtruth boxes. + For each row, it stores [y0, x0, y1, x1] for four corners of a box. + gt_labels: A integer tensor with shape [N, 1] representing groundtruth + classes. + Returns: + cls_targets_dict: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, num_anchors_per_location]. The height_l and + width_l represent the dimension of class logits at l-th level. + box_targets_dict: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, num_anchors_per_location * 4]. The height_l + and width_l represent the dimension of bounding box regression output at + l-th level. + num_positives: scalar tensor storing number of positives in an image. + """ + gt_box_list = box_list.BoxList(gt_boxes) + anchor_box_list = box_list.BoxList(self._anchor.boxes) + + # The cls_weights, box_weights are not used. + cls_targets, _, box_targets, _, matches = self._target_assigner.assign( + anchor_box_list, gt_box_list, gt_labels) + + # Labels definition in matches.match_results: + # (1) match_results[i]>=0, meaning that column i is matched with row + # match_results[i]. + # (2) match_results[i]=-1, meaning that column i is not matched. + # (3) match_results[i]=-2, meaning that column i is ignored. + match_results = tf.expand_dims(matches.match_results, axis=1) + cls_targets = tf.cast(cls_targets, tf.int32) + cls_targets = tf.where( + tf.equal(match_results, -1), -tf.ones_like(cls_targets), cls_targets) + cls_targets = tf.where( + tf.equal(match_results, -2), -2 * tf.ones_like(cls_targets), + cls_targets) + + # Unpacks labels into multi-level representations. + cls_targets_dict = self._anchor.unpack_labels(cls_targets) + box_targets_dict = self._anchor.unpack_labels(box_targets) + num_positives = tf.reduce_sum( + input_tensor=tf.cast(tf.greater(matches.match_results, -1), tf.float32)) + + return cls_targets_dict, box_targets_dict, num_positives + + +class RpnAnchorLabeler(AnchorLabeler): + """Labeler for Region Proposal Network.""" + + def __init__(self, anchor, match_threshold=0.7, + unmatched_threshold=0.3, rpn_batch_size_per_im=256, + rpn_fg_fraction=0.5): + AnchorLabeler.__init__(self, anchor, match_threshold=0.7, + unmatched_threshold=0.3) + self._rpn_batch_size_per_im = rpn_batch_size_per_im + self._rpn_fg_fraction = rpn_fg_fraction + + def _get_rpn_samples(self, match_results): + """Computes anchor labels. + + This function performs subsampling for foreground (fg) and background (bg) + anchors. + Args: + match_results: A integer tensor with shape [N] representing the + matching results of anchors. (1) match_results[i]>=0, + meaning that column i is matched with row match_results[i]. + (2) match_results[i]=-1, meaning that column i is not matched. + (3) match_results[i]=-2, meaning that column i is ignored. + Returns: + score_targets: a integer tensor with the a shape of [N]. + (1) score_targets[i]=1, the anchor is a positive sample. + (2) score_targets[i]=0, negative. (3) score_targets[i]=-1, the anchor is + don't care (ignore). + """ + sampler = ( + balanced_positive_negative_sampler.BalancedPositiveNegativeSampler( + positive_fraction=self._rpn_fg_fraction, is_static=False)) + # indicator includes both positive and negative labels. + # labels includes only positives labels. + # positives = indicator & labels. + # negatives = indicator & !labels. + # ignore = !indicator. + indicator = tf.greater(match_results, -2) + labels = tf.greater(match_results, -1) + + samples = sampler.subsample( + indicator, self._rpn_batch_size_per_im, labels) + positive_labels = tf.where( + tf.logical_and(samples, labels), + tf.constant(2, dtype=tf.int32, shape=match_results.shape), + tf.constant(0, dtype=tf.int32, shape=match_results.shape)) + negative_labels = tf.where( + tf.logical_and(samples, tf.logical_not(labels)), + tf.constant(1, dtype=tf.int32, shape=match_results.shape), + tf.constant(0, dtype=tf.int32, shape=match_results.shape)) + ignore_labels = tf.fill(match_results.shape, -1) + + return (ignore_labels + positive_labels + negative_labels, + positive_labels, negative_labels) + + def label_anchors(self, gt_boxes, gt_labels): + """Labels anchors with ground truth inputs. + + Args: + gt_boxes: A float tensor with shape [N, 4] representing groundtruth boxes. + For each row, it stores [y0, x0, y1, x1] for four corners of a box. + gt_labels: A integer tensor with shape [N, 1] representing groundtruth + classes. + Returns: + score_targets_dict: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, num_anchors]. The height_l and width_l + represent the dimension of class logits at l-th level. + box_targets_dict: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, num_anchors * 4]. The height_l and + width_l represent the dimension of bounding box regression output at + l-th level. + """ + gt_box_list = box_list.BoxList(gt_boxes) + anchor_box_list = box_list.BoxList(self._anchor.boxes) + + # cls_targets, cls_weights, box_weights are not used. + _, _, box_targets, _, matches = self._target_assigner.assign( + anchor_box_list, gt_box_list, gt_labels) + + # score_targets contains the subsampled positive and negative anchors. + score_targets, _, _ = self._get_rpn_samples(matches.match_results) + + # Unpacks labels. + score_targets_dict = self._anchor.unpack_labels(score_targets) + box_targets_dict = self._anchor.unpack_labels(box_targets) + + return score_targets_dict, box_targets_dict diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/factory.py new file mode 100644 index 0000000..186bd85 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/factory.py @@ -0,0 +1,102 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Model architecture factory.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from official.vision.detection.dataloader import maskrcnn_parser +from official.vision.detection.dataloader import retinanet_parser +from official.vision.detection.dataloader import shapemask_parser + +def parser_generator(params, mode): + """Generator function for various dataset parser.""" + if params.architecture.parser == 'retinanet_parser': + anchor_params = params.anchor + parser_params = params.retinanet_parser + parser_fn = retinanet_parser.Parser( + output_size=parser_params.output_size, + min_level=anchor_params.min_level, + max_level=anchor_params.max_level, + num_scales=anchor_params.num_scales, + aspect_ratios=anchor_params.aspect_ratios, + anchor_size=anchor_params.anchor_size, + match_threshold=parser_params.match_threshold, + unmatched_threshold=parser_params.unmatched_threshold, + aug_rand_hflip=parser_params.aug_rand_hflip, + aug_scale_min=parser_params.aug_scale_min, + aug_scale_max=parser_params.aug_scale_max, + use_autoaugment=parser_params.use_autoaugment, + autoaugment_policy_name=parser_params.autoaugment_policy_name, + skip_crowd_during_training=parser_params.skip_crowd_during_training, + max_num_instances=parser_params.max_num_instances, + use_bfloat16=parser_params.use_bfloat16, + mode=mode) + elif params.architecture.parser == 'maskrcnn_parser': + anchor_params = params.anchor + parser_params = params.maskrcnn_parser + parser_fn = maskrcnn_parser.Parser( + output_size=parser_params.output_size, + min_level=anchor_params.min_level, + max_level=anchor_params.max_level, + num_scales=anchor_params.num_scales, + aspect_ratios=anchor_params.aspect_ratios, + anchor_size=anchor_params.anchor_size, + rpn_match_threshold=parser_params.rpn_match_threshold, + rpn_unmatched_threshold=parser_params.rpn_unmatched_threshold, + rpn_batch_size_per_im=parser_params.rpn_batch_size_per_im, + rpn_fg_fraction=parser_params.rpn_fg_fraction, + aug_rand_hflip=parser_params.aug_rand_hflip, + aug_scale_min=parser_params.aug_scale_min, + aug_scale_max=parser_params.aug_scale_max, + skip_crowd_during_training=parser_params.skip_crowd_during_training, + max_num_instances=parser_params.max_num_instances, + include_mask=parser_params.include_mask, + mask_crop_size=parser_params.mask_crop_size, + use_bfloat16=parser_params.use_bfloat16, + mode=mode) + elif params.architecture.parser == 'shapemask_parser': + anchor_params = params.anchor + parser_params = params.shapemask_parser + parser_fn = shapemask_parser.Parser( + output_size=parser_params.output_size, + min_level=anchor_params.min_level, + max_level=anchor_params.max_level, + num_scales=anchor_params.num_scales, + aspect_ratios=anchor_params.aspect_ratios, + anchor_size=anchor_params.anchor_size, + use_category=parser_params.use_category, + outer_box_scale=parser_params.outer_box_scale, + box_jitter_scale=parser_params.box_jitter_scale, + num_sampled_masks=parser_params.num_sampled_masks, + mask_crop_size=parser_params.mask_crop_size, + mask_min_level=parser_params.mask_min_level, + mask_max_level=parser_params.mask_max_level, + upsample_factor=parser_params.upsample_factor, + match_threshold=parser_params.match_threshold, + unmatched_threshold=parser_params.unmatched_threshold, + aug_rand_hflip=parser_params.aug_rand_hflip, + aug_scale_min=parser_params.aug_scale_min, + aug_scale_max=parser_params.aug_scale_max, + skip_crowd_during_training=parser_params.skip_crowd_during_training, + max_num_instances=parser_params.max_num_instances, + use_bfloat16=parser_params.use_bfloat16, + mask_train_class=parser_params.mask_train_class, + mode=mode) + else: + raise ValueError('Parser %s is not supported.' % params.architecture.parser) + + return parser_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/input_reader.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/input_reader.py new file mode 100644 index 0000000..dd24b7e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/input_reader.py @@ -0,0 +1,109 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Data loader and input processing.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from typing import Text, Optional +from official.modeling.hyperparams import params_dict +from official.vision.detection.dataloader import factory +from official.vision.detection.dataloader import mode_keys as ModeKeys + + +class InputFn(object): + """Input function that creates dataset from files.""" + + def __init__(self, + file_pattern: Text, + params: params_dict.ParamsDict, + mode: Text, + batch_size: int, + num_examples: Optional[int] = -1): + """Initialize. + + Args: + file_pattern: the file pattern for the data example (TFRecords). + params: the parameter object for constructing example parser and model. + mode: ModeKeys.TRAIN or ModeKeys.Eval + batch_size: the data batch size. + num_examples: If positive, only takes this number of examples and raise + tf.errors.OutOfRangeError after that. If non-positive, it will be + ignored. + """ + assert file_pattern is not None + assert mode is not None + assert batch_size is not None + self._file_pattern = file_pattern + self._mode = mode + self._is_training = (mode == ModeKeys.TRAIN) + self._batch_size = batch_size + self._num_examples = num_examples + self._parser_fn = factory.parser_generator(params, mode) + self._dataset_fn = tf.data.TFRecordDataset + + self._input_sharding = (not self._is_training) + try: + if self._is_training: + self._input_sharding = params.train.input_sharding + else: + self._input_sharding = params.eval.input_sharding + except AttributeError: + pass + + def __call__(self, ctx=None, batch_size: int = None): + """Provides tf.data.Dataset object. + + Args: + ctx: context object. + batch_size: expected batch size input data. + + Returns: + tf.data.Dataset object. + """ + if not batch_size: + batch_size = self._batch_size + assert batch_size is not None + dataset = tf.data.Dataset.list_files( + self._file_pattern, shuffle=self._is_training) + + if self._input_sharding and ctx and ctx.num_input_pipelines > 1: + dataset = dataset.shard(ctx.num_input_pipelines, ctx.input_pipeline_id) + dataset = dataset.cache() + + if self._is_training: + dataset = dataset.repeat() + + dataset = dataset.interleave( + map_func=lambda file_name: self._dataset_fn(file_name), cycle_length=32, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + if self._is_training: + # Large shuffle size is critical for 2vm input pipeline. Can use small + # value (e.g. 64) for 1vm. + dataset = dataset.shuffle(1000) + if self._num_examples > 0: + dataset = dataset.take(self._num_examples) + + # Parses the fetched records to input tensors for model function. + dataset = dataset.map( + self._parser_fn, num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=True) + dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE) + return dataset diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/maskrcnn_parser.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/maskrcnn_parser.py new file mode 100644 index 0000000..0f44619 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/maskrcnn_parser.py @@ -0,0 +1,385 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Data parser and processing for Mask R-CNN.""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.dataloader import anchor +from official.vision.detection.dataloader import mode_keys as ModeKeys +from official.vision.detection.dataloader import tf_example_decoder +from official.vision.detection.utils import box_utils +from official.vision.detection.utils import dataloader_utils +from official.vision.detection.utils import input_utils + + +class Parser(object): + """Parser to parse an image and its annotations into a dictionary of tensors.""" + + def __init__(self, + output_size, + min_level, + max_level, + num_scales, + aspect_ratios, + anchor_size, + rpn_match_threshold=0.7, + rpn_unmatched_threshold=0.3, + rpn_batch_size_per_im=256, + rpn_fg_fraction=0.5, + aug_rand_hflip=False, + aug_scale_min=1.0, + aug_scale_max=1.0, + skip_crowd_during_training=True, + max_num_instances=100, + include_mask=False, + mask_crop_size=112, + use_bfloat16=True, + mode=None): + """Initializes parameters for parsing annotations in the dataset. + + Args: + output_size: `Tensor` or `list` for [height, width] of output image. The + output_size should be divided by the largest feature stride 2^max_level. + min_level: `int` number of minimum level of the output feature pyramid. + max_level: `int` number of maximum level of the output feature pyramid. + num_scales: `int` number representing intermediate scales added + on each level. For instances, num_scales=2 adds one additional + intermediate anchor scales [2^0, 2^0.5] on each level. + aspect_ratios: `list` of float numbers representing the aspect raito + anchors added on each level. The number indicates the ratio of width to + height. For instances, aspect_ratios=[1.0, 2.0, 0.5] adds three anchors + on each scale level. + anchor_size: `float` number representing the scale of size of the base + anchor to the feature stride 2^level. + rpn_match_threshold: + rpn_unmatched_threshold: + rpn_batch_size_per_im: + rpn_fg_fraction: + aug_rand_hflip: `bool`, if True, augment training with random + horizontal flip. + aug_scale_min: `float`, the minimum scale applied to `output_size` for + data augmentation during training. + aug_scale_max: `float`, the maximum scale applied to `output_size` for + data augmentation during training. + skip_crowd_during_training: `bool`, if True, skip annotations labeled with + `is_crowd` equals to 1. + max_num_instances: `int` number of maximum number of instances in an + image. The groundtruth data will be padded to `max_num_instances`. + include_mask: a bool to indicate whether parse mask groundtruth. + mask_crop_size: the size which groundtruth mask is cropped to. + use_bfloat16: `bool`, if True, cast output image to tf.bfloat16. + mode: a ModeKeys. Specifies if this is training, evaluation, prediction + or prediction with groundtruths in the outputs. + """ + self._mode = mode + self._max_num_instances = max_num_instances + self._skip_crowd_during_training = skip_crowd_during_training + self._is_training = (mode == ModeKeys.TRAIN) + + self._example_decoder = tf_example_decoder.TfExampleDecoder( + include_mask=include_mask) + + # Anchor. + self._output_size = output_size + self._min_level = min_level + self._max_level = max_level + self._num_scales = num_scales + self._aspect_ratios = aspect_ratios + self._anchor_size = anchor_size + + # Target assigning. + self._rpn_match_threshold = rpn_match_threshold + self._rpn_unmatched_threshold = rpn_unmatched_threshold + self._rpn_batch_size_per_im = rpn_batch_size_per_im + self._rpn_fg_fraction = rpn_fg_fraction + + # Data augmentation. + self._aug_rand_hflip = aug_rand_hflip + self._aug_scale_min = aug_scale_min + self._aug_scale_max = aug_scale_max + + # Mask. + self._include_mask = include_mask + self._mask_crop_size = mask_crop_size + + # Device. + self._use_bfloat16 = use_bfloat16 + + # Data is parsed depending on the model Modekey. + if mode == ModeKeys.TRAIN: + self._parse_fn = self._parse_train_data + elif mode == ModeKeys.EVAL: + self._parse_fn = self._parse_eval_data + elif mode == ModeKeys.PREDICT or mode == ModeKeys.PREDICT_WITH_GT: + self._parse_fn = self._parse_predict_data + else: + raise ValueError('mode is not defined.') + + def __call__(self, value): + """Parses data to an image and associated training labels. + + Args: + value: a string tensor holding a serialized tf.Example proto. + + Returns: + image, labels: if mode == ModeKeys.TRAIN. see _parse_train_data. + {'images': image, 'labels': labels}: if mode == ModeKeys.PREDICT + or ModeKeys.PREDICT_WITH_GT. + """ + with tf.name_scope('parser'): + data = self._example_decoder.decode(value) + return self._parse_fn(data) + + def _parse_train_data(self, data): + """Parses data for training. + + Args: + data: the decoded tensor dictionary from TfExampleDecoder. + + Returns: + image: image tensor that is preproessed to have normalized value and + dimension [output_size[0], output_size[1], 3] + labels: a dictionary of tensors used for training. The following describes + {key: value} pairs in the dictionary. + image_info: a 2D `Tensor` that encodes the information of the image and + the applied preprocessing. It is in the format of + [[original_height, original_width], [scaled_height, scaled_width], + anchor_boxes: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, 4] representing anchor boxes at each level. + rpn_score_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location]. The height_l and + width_l represent the dimension of class logits at l-th level. + rpn_box_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location * 4]. The height_l and + width_l represent the dimension of bounding box regression output at + l-th level. + gt_boxes: Groundtruth bounding box annotations. The box is represented + in [y1, x1, y2, x2] format. The coordinates are w.r.t the scaled + image that is fed to the network. The tennsor is padded with -1 to + the fixed dimension [self._max_num_instances, 4]. + gt_classes: Groundtruth classes annotations. The tennsor is padded + with -1 to the fixed dimension [self._max_num_instances]. + gt_masks: groundtrugh masks cropped by the bounding box and + resized to a fixed size determined by mask_crop_size. + """ + classes = data['groundtruth_classes'] + boxes = data['groundtruth_boxes'] + if self._include_mask: + masks = data['groundtruth_instance_masks'] + + is_crowds = data['groundtruth_is_crowd'] + # Skips annotations with `is_crowd` = True. + if self._skip_crowd_during_training and self._is_training: + num_groundtrtuhs = tf.shape(classes)[0] + with tf.control_dependencies([num_groundtrtuhs, is_crowds]): + indices = tf.cond( + tf.greater(tf.size(is_crowds), 0), + lambda: tf.where(tf.logical_not(is_crowds))[:, 0], + lambda: tf.cast(tf.range(num_groundtrtuhs), tf.int64)) + classes = tf.gather(classes, indices) + boxes = tf.gather(boxes, indices) + if self._include_mask: + masks = tf.gather(masks, indices) + + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(image)[0:2] + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Flips image randomly during training. + if self._aug_rand_hflip: + if self._include_mask: + image, boxes, masks = input_utils.random_horizontal_flip( + image, boxes, masks) + else: + image, boxes = input_utils.random_horizontal_flip( + image, boxes) + + # Converts boxes from normalized coordinates to pixel coordinates. + # Now the coordinates of boxes are w.r.t. the original image. + boxes = box_utils.denormalize_boxes(boxes, image_shape) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + padded_size=input_utils.compute_padded_size( + self._output_size, 2 ** self._max_level), + aug_scale_min=self._aug_scale_min, + aug_scale_max=self._aug_scale_max) + image_height, image_width, _ = image.get_shape().as_list() + + # Resizes and crops boxes. + # Now the coordinates of boxes are w.r.t the scaled image. + image_scale = image_info[2, :] + offset = image_info[3, :] + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + classes = tf.gather(classes, indices) + if self._include_mask: + masks = tf.gather(masks, indices) + # Transfer boxes to the original image space and do normalization. + cropped_boxes = boxes + tf.tile(tf.expand_dims(offset, axis=0), [1, 2]) + cropped_boxes /= tf.tile(tf.expand_dims(image_scale, axis=0), [1, 2]) + cropped_boxes = box_utils.normalize_boxes(cropped_boxes, image_shape) + num_masks = tf.shape(masks)[0] + masks = tf.image.crop_and_resize( + tf.expand_dims(masks, axis=-1), + cropped_boxes, + box_indices=tf.range(num_masks, dtype=tf.int32), + crop_size=[self._mask_crop_size, self._mask_crop_size], + method='bilinear') + masks = tf.squeeze(masks, axis=-1) + + # Assigns anchor targets. + # Note that after the target assignment, box targets are absolute pixel + # offsets w.r.t. the scaled image. + input_anchor = anchor.Anchor( + self._min_level, + self._max_level, + self._num_scales, + self._aspect_ratios, + self._anchor_size, + (image_height, image_width)) + anchor_labeler = anchor.RpnAnchorLabeler( + input_anchor, + self._rpn_match_threshold, + self._rpn_unmatched_threshold, + self._rpn_batch_size_per_im, + self._rpn_fg_fraction) + rpn_score_targets, rpn_box_targets = anchor_labeler.label_anchors( + boxes, tf.cast(tf.expand_dims(classes, axis=-1), dtype=tf.float32)) + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + inputs = { + 'image': image, + 'image_info': image_info, + } + # Packs labels for model_fn outputs. + labels = { + 'anchor_boxes': input_anchor.multilevel_boxes, + 'image_info': image_info, + 'rpn_score_targets': rpn_score_targets, + 'rpn_box_targets': rpn_box_targets, + } + inputs['gt_boxes'] = input_utils.pad_to_fixed_size(boxes, + self._max_num_instances, + -1) + inputs['gt_classes'] = input_utils.pad_to_fixed_size( + classes, self._max_num_instances, -1) + if self._include_mask: + inputs['gt_masks'] = input_utils.pad_to_fixed_size( + masks, self._max_num_instances, -1) + + return inputs, labels + + def _parse_eval_data(self, data): + """Parses data for evaluation.""" + raise NotImplementedError('Not implemented!') + + def _parse_predict_data(self, data): + """Parses data for prediction. + + Args: + data: the decoded tensor dictionary from TfExampleDecoder. + + Returns: + A dictionary of {'images': image, 'labels': labels} where + image: image tensor that is preproessed to have normalized value and + dimension [output_size[0], output_size[1], 3] + labels: a dictionary of tensors used for training. The following + describes {key: value} pairs in the dictionary. + source_ids: Source image id. Default value -1 if the source id is + empty in the groundtruth annotation. + image_info: a 2D `Tensor` that encodes the information of the image + and the applied preprocessing. It is in the format of + [[original_height, original_width], [scaled_height, scaled_width], + anchor_boxes: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, 4] representing anchor boxes at each + level. + """ + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(image)[0:2] + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + padded_size=input_utils.compute_padded_size( + self._output_size, 2 ** self._max_level), + aug_scale_min=1.0, + aug_scale_max=1.0) + image_height, image_width, _ = image.get_shape().as_list() + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + # Compute Anchor boxes. + input_anchor = anchor.Anchor( + self._min_level, + self._max_level, + self._num_scales, + self._aspect_ratios, + self._anchor_size, + (image_height, image_width)) + + labels = { + 'image_info': image_info, + } + + if self._mode == ModeKeys.PREDICT_WITH_GT: + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes( + data['groundtruth_boxes'], image_shape) + groundtruths = { + 'source_id': data['source_id'], + 'height': data['height'], + 'width': data['width'], + 'num_detections': tf.shape(data['groundtruth_classes']), + 'boxes': boxes, + 'classes': data['groundtruth_classes'], + 'areas': data['groundtruth_area'], + 'is_crowds': tf.cast(data['groundtruth_is_crowd'], tf.int32), + } + groundtruths['source_id'] = dataloader_utils.process_source_id( + groundtruths['source_id']) + groundtruths = dataloader_utils.pad_groundtruths_to_fixed_size( + groundtruths, self._max_num_instances) + # TODO(yeqing): Remove the `groundtrtuh` layer key (no longer needed). + labels['groundtruths'] = groundtruths + inputs = { + 'image': image, + 'image_info': image_info, + } + + return inputs, labels diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/mode_keys.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/mode_keys.py new file mode 100644 index 0000000..020382b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/mode_keys.py @@ -0,0 +1,33 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Standard names for input dataloader modes. + +The following standard keys are defined: + +* `TRAIN`: training mode. +* `EVAL`: evaluation mode. +* `PREDICT`: prediction mode. +* `PREDICT_WITH_GT`: prediction mode with groundtruths in returned variables. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +TRAIN = 'train' +EVAL = 'eval' +PREDICT = 'predict' +PREDICT_WITH_GT = 'predict_with_gt' diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/retinanet_parser.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/retinanet_parser.py new file mode 100644 index 0000000..8f37bc9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/retinanet_parser.py @@ -0,0 +1,429 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Data parser and processing. + +Parse image and ground truths in a dataset to training targets and package them +into (image, labels) tuple for RetinaNet. + +T.-Y. Lin, P. Goyal, R. Girshick, K. He, and P. Dollar +Focal Loss for Dense Object Detection. arXiv:1708.02002 +""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.dataloader import anchor +from official.vision.detection.dataloader import mode_keys as ModeKeys +from official.vision.detection.dataloader import tf_example_decoder +from official.vision.detection.utils import autoaugment_utils +from official.vision.detection.utils import box_utils +from official.vision.detection.utils import input_utils + + +def process_source_id(source_id): + """Processes source_id to the right format.""" + if source_id.dtype == tf.string: + source_id = tf.cast(tf.strings.to_number(source_id), tf.int32) + with tf.control_dependencies([source_id]): + source_id = tf.cond( + pred=tf.equal(tf.size(input=source_id), 0), + true_fn=lambda: tf.cast(tf.constant(-1), tf.int32), + false_fn=lambda: tf.identity(source_id)) + return source_id + + +def pad_groundtruths_to_fixed_size(gt, n): + """Pads the first dimension of groundtruths labels to the fixed size.""" + gt['boxes'] = input_utils.pad_to_fixed_size(gt['boxes'], n, -1) + gt['is_crowds'] = input_utils.pad_to_fixed_size(gt['is_crowds'], n, 0) + gt['areas'] = input_utils.pad_to_fixed_size(gt['areas'], n, -1) + gt['classes'] = input_utils.pad_to_fixed_size(gt['classes'], n, -1) + return gt + + +class Parser(object): + """Parser to parse an image and its annotations into a dictionary of tensors.""" + + def __init__(self, + output_size, + min_level, + max_level, + num_scales, + aspect_ratios, + anchor_size, + match_threshold=0.5, + unmatched_threshold=0.5, + aug_rand_hflip=False, + aug_scale_min=1.0, + aug_scale_max=1.0, + use_autoaugment=False, + autoaugment_policy_name='v0', + skip_crowd_during_training=True, + max_num_instances=100, + use_bfloat16=True, + mode=None): + """Initializes parameters for parsing annotations in the dataset. + + Args: + output_size: `Tensor` or `list` for [height, width] of output image. The + output_size should be divided by the largest feature stride 2^max_level. + min_level: `int` number of minimum level of the output feature pyramid. + max_level: `int` number of maximum level of the output feature pyramid. + num_scales: `int` number representing intermediate scales added + on each level. For instances, num_scales=2 adds one additional + intermediate anchor scales [2^0, 2^0.5] on each level. + aspect_ratios: `list` of float numbers representing the aspect raito + anchors added on each level. The number indicates the ratio of width to + height. For instances, aspect_ratios=[1.0, 2.0, 0.5] adds three anchors + on each scale level. + anchor_size: `float` number representing the scale of size of the base + anchor to the feature stride 2^level. + match_threshold: `float` number between 0 and 1 representing the + lower-bound threshold to assign positive labels for anchors. An anchor + with a score over the threshold is labeled positive. + unmatched_threshold: `float` number between 0 and 1 representing the + upper-bound threshold to assign negative labels for anchors. An anchor + with a score below the threshold is labeled negative. + aug_rand_hflip: `bool`, if True, augment training with random + horizontal flip. + aug_scale_min: `float`, the minimum scale applied to `output_size` for + data augmentation during training. + aug_scale_max: `float`, the maximum scale applied to `output_size` for + data augmentation during training. + use_autoaugment: `bool`, if True, use the AutoAugment augmentation policy + during training. + autoaugment_policy_name: `string` that specifies the name of the + AutoAugment policy that will be used during training. + skip_crowd_during_training: `bool`, if True, skip annotations labeled with + `is_crowd` equals to 1. + max_num_instances: `int` number of maximum number of instances in an + image. The groundtruth data will be padded to `max_num_instances`. + use_bfloat16: `bool`, if True, cast output image to tf.bfloat16. + mode: a ModeKeys. Specifies if this is training, evaluation, prediction + or prediction with groundtruths in the outputs. + """ + self._mode = mode + self._max_num_instances = max_num_instances + self._skip_crowd_during_training = skip_crowd_during_training + self._is_training = (mode == ModeKeys.TRAIN) + + self._example_decoder = tf_example_decoder.TfExampleDecoder( + include_mask=False) + + # Anchor. + self._output_size = output_size + self._min_level = min_level + self._max_level = max_level + self._num_scales = num_scales + self._aspect_ratios = aspect_ratios + self._anchor_size = anchor_size + self._match_threshold = match_threshold + self._unmatched_threshold = unmatched_threshold + + # Data augmentation. + self._aug_rand_hflip = aug_rand_hflip + self._aug_scale_min = aug_scale_min + self._aug_scale_max = aug_scale_max + + # Data Augmentation with AutoAugment. + self._use_autoaugment = use_autoaugment + self._autoaugment_policy_name = autoaugment_policy_name + + # Device. + self._use_bfloat16 = use_bfloat16 + + # Data is parsed depending on the model Modekey. + if mode == ModeKeys.TRAIN: + self._parse_fn = self._parse_train_data + elif mode == ModeKeys.EVAL: + self._parse_fn = self._parse_eval_data + elif mode == ModeKeys.PREDICT or mode == ModeKeys.PREDICT_WITH_GT: + self._parse_fn = self._parse_predict_data + else: + raise ValueError('mode is not defined.') + + def __call__(self, value): + """Parses data to an image and associated training labels. + + Args: + value: a string tensor holding a serialized tf.Example proto. + + Returns: + image: image tensor that is preproessed to have normalized value and + dimension [output_size[0], output_size[1], 3] + labels: + cls_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location]. The height_l and + width_l represent the dimension of class logits at l-th level. + box_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location * 4]. The height_l and + width_l represent the dimension of bounding box regression output at + l-th level. + num_positives: number of positive anchors in the image. + anchor_boxes: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, 4] representing anchor boxes at each level. + image_info: a 2D `Tensor` that encodes the information of the image and + the applied preprocessing. It is in the format of + [[original_height, original_width], [scaled_height, scaled_width], + [y_scale, x_scale], [y_offset, x_offset]]. + groundtruths: + source_id: source image id. Default value -1 if the source id is empty + in the groundtruth annotation. + boxes: groundtruth bounding box annotations. The box is represented in + [y1, x1, y2, x2] format. The tennsor is padded with -1 to the fixed + dimension [self._max_num_instances, 4]. + classes: groundtruth classes annotations. The tennsor is padded with + -1 to the fixed dimension [self._max_num_instances]. + areas: groundtruth areas annotations. The tennsor is padded with -1 + to the fixed dimension [self._max_num_instances]. + is_crowds: groundtruth annotations to indicate if an annotation + represents a group of instances by value {0, 1}. The tennsor is + padded with 0 to the fixed dimension [self._max_num_instances]. + """ + with tf.name_scope('parser'): + data = self._example_decoder.decode(value) + return self._parse_fn(data) + + def _parse_train_data(self, data): + """Parses data for training and evaluation.""" + classes = data['groundtruth_classes'] + boxes = data['groundtruth_boxes'] + is_crowds = data['groundtruth_is_crowd'] + # Skips annotations with `is_crowd` = True. + if self._skip_crowd_during_training and self._is_training: + num_groundtrtuhs = tf.shape(input=classes)[0] + with tf.control_dependencies([num_groundtrtuhs, is_crowds]): + indices = tf.cond( + pred=tf.greater(tf.size(input=is_crowds), 0), + true_fn=lambda: tf.where(tf.logical_not(is_crowds))[:, 0], + false_fn=lambda: tf.cast(tf.range(num_groundtrtuhs), tf.int64)) + classes = tf.gather(classes, indices) + boxes = tf.gather(boxes, indices) + + # Gets original image and its size. + image = data['image'] + + # NOTE: The autoaugment method works best when used alongside the standard + # horizontal flipping of images along with size jittering and normalization. + if self._use_autoaugment: + image, boxes = autoaugment_utils.distort_image_with_autoaugment( + image, boxes, self._autoaugment_policy_name) + + image_shape = tf.shape(input=image)[0:2] + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Flips image randomly during training. + if self._aug_rand_hflip: + image, boxes = input_utils.random_horizontal_flip(image, boxes) + + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes(boxes, image_shape) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + padded_size=input_utils.compute_padded_size( + self._output_size, 2 ** self._max_level), + aug_scale_min=self._aug_scale_min, + aug_scale_max=self._aug_scale_max) + image_height, image_width, _ = image.get_shape().as_list() + + # Resizes and crops boxes. + image_scale = image_info[2, :] + offset = image_info[3, :] + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + classes = tf.gather(classes, indices) + + # Assigns anchors. + input_anchor = anchor.Anchor( + self._min_level, self._max_level, self._num_scales, + self._aspect_ratios, self._anchor_size, (image_height, image_width)) + anchor_labeler = anchor.AnchorLabeler( + input_anchor, self._match_threshold, self._unmatched_threshold) + (cls_targets, box_targets, num_positives) = anchor_labeler.label_anchors( + boxes, + tf.cast(tf.expand_dims(classes, axis=1), tf.float32)) + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + # Packs labels for model_fn outputs. + labels = { + 'cls_targets': cls_targets, + 'box_targets': box_targets, + 'anchor_boxes': input_anchor.multilevel_boxes, + 'num_positives': num_positives, + 'image_info': image_info, + } + return image, labels + + def _parse_eval_data(self, data): + """Parses data for training and evaluation.""" + groundtruths = {} + classes = data['groundtruth_classes'] + boxes = data['groundtruth_boxes'] + + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(input=image)[0:2] + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes(boxes, image_shape) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + padded_size=input_utils.compute_padded_size( + self._output_size, 2 ** self._max_level), + aug_scale_min=1.0, + aug_scale_max=1.0) + image_height, image_width, _ = image.get_shape().as_list() + + # Resizes and crops boxes. + image_scale = image_info[2, :] + offset = image_info[3, :] + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + classes = tf.gather(classes, indices) + + # Assigns anchors. + input_anchor = anchor.Anchor( + self._min_level, self._max_level, self._num_scales, + self._aspect_ratios, self._anchor_size, (image_height, image_width)) + anchor_labeler = anchor.AnchorLabeler( + input_anchor, self._match_threshold, self._unmatched_threshold) + (cls_targets, box_targets, num_positives) = anchor_labeler.label_anchors( + boxes, + tf.cast(tf.expand_dims(classes, axis=1), tf.float32)) + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + # Sets up groundtruth data for evaluation. + groundtruths = { + 'source_id': data['source_id'], + 'num_groundtrtuhs': tf.shape(data['groundtruth_classes']), + 'image_info': image_info, + 'boxes': box_utils.denormalize_boxes( + data['groundtruth_boxes'], image_shape), + 'classes': data['groundtruth_classes'], + 'areas': data['groundtruth_area'], + 'is_crowds': tf.cast(data['groundtruth_is_crowd'], tf.int32), + } + groundtruths['source_id'] = process_source_id(groundtruths['source_id']) + groundtruths = pad_groundtruths_to_fixed_size( + groundtruths, self._max_num_instances) + + # Packs labels for model_fn outputs. + labels = { + 'cls_targets': cls_targets, + 'box_targets': box_targets, + 'anchor_boxes': input_anchor.multilevel_boxes, + 'num_positives': num_positives, + 'image_info': image_info, + 'groundtruths': groundtruths, + } + return image, labels + + def _parse_predict_data(self, data): + """Parses data for prediction.""" + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(input=image)[0:2] + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + padded_size=input_utils.compute_padded_size( + self._output_size, 2 ** self._max_level), + aug_scale_min=1.0, + aug_scale_max=1.0) + image_height, image_width, _ = image.get_shape().as_list() + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + # Compute Anchor boxes. + input_anchor = anchor.Anchor( + self._min_level, self._max_level, self._num_scales, + self._aspect_ratios, self._anchor_size, (image_height, image_width)) + + labels = { + 'anchor_boxes': input_anchor.multilevel_boxes, + 'image_info': image_info, + } + # If mode is PREDICT_WITH_GT, returns groundtruths and training targets + # in labels. + if self._mode == ModeKeys.PREDICT_WITH_GT: + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes( + data['groundtruth_boxes'], image_shape) + groundtruths = { + 'source_id': data['source_id'], + 'num_detections': tf.shape(data['groundtruth_classes']), + 'boxes': boxes, + 'classes': data['groundtruth_classes'], + 'areas': data['groundtruth_area'], + 'is_crowds': tf.cast(data['groundtruth_is_crowd'], tf.int32), + } + groundtruths['source_id'] = process_source_id(groundtruths['source_id']) + groundtruths = pad_groundtruths_to_fixed_size( + groundtruths, self._max_num_instances) + labels['groundtruths'] = groundtruths + + # Computes training objective for evaluation loss. + classes = data['groundtruth_classes'] + + image_scale = image_info[2, :] + offset = image_info[3, :] + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + + # Assigns anchors. + anchor_labeler = anchor.AnchorLabeler( + input_anchor, self._match_threshold, self._unmatched_threshold) + (cls_targets, box_targets, num_positives) = anchor_labeler.label_anchors( + boxes, + tf.cast(tf.expand_dims(classes, axis=1), tf.float32)) + labels['cls_targets'] = cls_targets + labels['box_targets'] = box_targets + labels['num_positives'] = num_positives + return image, labels diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/shapemask_parser.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/shapemask_parser.py new file mode 100644 index 0000000..f9c1c24 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/shapemask_parser.py @@ -0,0 +1,478 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Data parser and processing. + +Parse image and ground truths in a dataset to training targets and package them +into (image, labels) tuple for ShapeMask. + +Weicheng Kuo, Anelia Angelova, Jitendra Malik, Tsung-Yi Lin +ShapeMask: Learning to Segment Novel Objects by Refining Shape Priors. +arXiv:1904.03239. +""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.dataloader import anchor +from official.vision.detection.dataloader import mode_keys as ModeKeys +from official.vision.detection.dataloader import tf_example_decoder +from official.vision.detection.utils import box_utils +from official.vision.detection.utils import class_utils +from official.vision.detection.utils import dataloader_utils +from official.vision.detection.utils import input_utils + + +class Parser(object): + """Parser to parse an image and its annotations into a dictionary of tensors.""" + + def __init__(self, + output_size, + min_level, + max_level, + num_scales, + aspect_ratios, + anchor_size, + use_category=True, + outer_box_scale=1.0, + box_jitter_scale=0.025, + num_sampled_masks=8, + mask_crop_size=32, + mask_min_level=3, + mask_max_level=5, + upsample_factor=4, + match_threshold=0.5, + unmatched_threshold=0.5, + aug_rand_hflip=False, + aug_scale_min=1.0, + aug_scale_max=1.0, + skip_crowd_during_training=True, + max_num_instances=100, + use_bfloat16=True, + mask_train_class='all', + mode=None): + """Initializes parameters for parsing annotations in the dataset. + + Args: + output_size: `Tensor` or `list` for [height, width] of output image. The + output_size should be divided by the largest feature stride 2^max_level. + min_level: `int` number of minimum level of the output feature pyramid. + max_level: `int` number of maximum level of the output feature pyramid. + num_scales: `int` number representing intermediate scales added + on each level. For instances, num_scales=2 adds one additional + intermediate anchor scales [2^0, 2^0.5] on each level. + aspect_ratios: `list` of float numbers representing the aspect raito + anchors added on each level. The number indicates the ratio of width to + height. For instances, aspect_ratios=[1.0, 2.0, 0.5] adds three anchors + on each scale level. + anchor_size: `float` number representing the scale of size of the base + anchor to the feature stride 2^level. + use_category: if `False`, treat all object in all classes in one + foreground category. + outer_box_scale: `float` number in a range of [1.0, inf) representing + the scale from object box to outer box. The mask branch predicts + instance mask enclosed in outer box. + box_jitter_scale: `float` number representing the noise magnitude to + jitter the training groundtruth boxes for mask branch. + num_sampled_masks: `int` number of sampled masks for training. + mask_crop_size: `list` for [height, width] of output training masks. + mask_min_level: `int` number indicating the minimum feature level to + obtain instance features. + mask_max_level: `int` number indicating the maximum feature level to + obtain instance features. + upsample_factor: `int` factor of upsampling the fine mask predictions. + match_threshold: `float` number between 0 and 1 representing the + lower-bound threshold to assign positive labels for anchors. An anchor + with a score over the threshold is labeled positive. + unmatched_threshold: `float` number between 0 and 1 representing the + upper-bound threshold to assign negative labels for anchors. An anchor + with a score below the threshold is labeled negative. + aug_rand_hflip: `bool`, if True, augment training with random + horizontal flip. + aug_scale_min: `float`, the minimum scale applied to `output_size` for + data augmentation during training. + aug_scale_max: `float`, the maximum scale applied to `output_size` for + data augmentation during training. + skip_crowd_during_training: `bool`, if True, skip annotations labeled with + `is_crowd` equals to 1. + max_num_instances: `int` number of maximum number of instances in an + image. The groundtruth data will be padded to `max_num_instances`. + use_bfloat16: `bool`, if True, cast output image to tf.bfloat16. + mask_train_class: a string of experiment mode: `all`, `voc` or `nonvoc`. + mode: a ModeKeys. Specifies if this is training, evaluation, prediction + or prediction with groundtruths in the outputs. + """ + self._mode = mode + self._mask_train_class = mask_train_class + self._max_num_instances = max_num_instances + self._skip_crowd_during_training = skip_crowd_during_training + self._is_training = (mode == ModeKeys.TRAIN) + + self._example_decoder = tf_example_decoder.TfExampleDecoder( + include_mask=True) + + # Anchor. + self._output_size = output_size + self._min_level = min_level + self._max_level = max_level + self._num_scales = num_scales + self._aspect_ratios = aspect_ratios + self._anchor_size = anchor_size + self._match_threshold = match_threshold + self._unmatched_threshold = unmatched_threshold + + # Data augmentation. + self._aug_rand_hflip = aug_rand_hflip + self._aug_scale_min = aug_scale_min + self._aug_scale_max = aug_scale_max + + # Device. + self._use_bfloat16 = use_bfloat16 + + # ShapeMask specific. + # Control of which category to use. + self._use_category = use_category + self._num_sampled_masks = num_sampled_masks + self._mask_crop_size = mask_crop_size + self._mask_min_level = mask_min_level + self._mask_max_level = mask_max_level + self._outer_box_scale = outer_box_scale + self._box_jitter_scale = box_jitter_scale + self._up_sample_factor = upsample_factor + + # Data is parsed depending on the model Modekey. + if mode == ModeKeys.TRAIN: + self._parse_fn = self._parse_train_data + elif mode == ModeKeys.EVAL: + self._parse_fn = self._parse_eval_data + elif mode == ModeKeys.PREDICT or mode == ModeKeys.PREDICT_WITH_GT: + self._parse_fn = self._parse_predict_data + else: + raise ValueError('mode is not defined.') + + def __call__(self, value): + """Parses data to an image and associated training labels. + + Args: + value: a string tensor holding a serialized tf.Example proto. + + Returns: + image: image tensor that is preproessed to have normalized value and + dimension [output_size[0], output_size[1], 3] + labels: + cls_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location]. The height_l and + width_l represent the dimension of class logits at l-th level. + box_targets: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, anchors_per_location * 4]. The height_l and + width_l represent the dimension of bounding box regression output at + l-th level. + num_positives: number of positive anchors in the image. + anchor_boxes: ordered dictionary with keys + [min_level, min_level+1, ..., max_level]. The values are tensor with + shape [height_l, width_l, 4] representing anchor boxes at each level. + image_scale: 2D float `Tensor` representing scale factors that apply + to [height, width] of input image. + mask_boxes: sampled boxes that tightly enclose the training masks. The + box is represented in [y1, x1, y2, x2] format. The tensor is sampled + to the fixed dimension [self._num_sampled_masks, 4]. + mask_outer_boxes: loose box that enclose sampled tight box. The + box is represented in [y1, x1, y2, x2] format. The tensor is sampled + to the fixed dimension [self._num_sampled_masks, 4]. + mask_targets: training binary mask targets. The tensor has shape + [self._num_sampled_masks, self._mask_crop_size, self._mask_crop_size]. + mask_classes: the class ids of sampled training masks. The tensor has + shape [self._num_sampled_masks]. + mask_is_valid: the binary tensor to indicate if the sampled masks are + valide. The sampled masks are invalid when no mask annotations are + included in the image. The tensor has shape [1]. + groundtruths: + source_id: source image id. Default value -1 if the source id is empty + in the groundtruth annotation. + boxes: groundtruth bounding box annotations. The box is represented in + [y1, x1, y2, x2] format. The tensor is padded with -1 to the fixed + dimension [self._max_num_instances, 4]. + classes: groundtruth classes annotations. The tensor is padded with + -1 to the fixed dimension [self._max_num_instances]. + areas: groundtruth areas annotations. The tensor is padded with -1 + to the fixed dimension [self._max_num_instances]. + is_crowds: groundtruth annotations to indicate if an annotation + represents a group of instances by value {0, 1}. The tensor is + padded with 0 to the fixed dimension [self._max_num_instances]. + """ + with tf.name_scope('parser'): + data = self._example_decoder.decode(value) + return self._parse_fn(data) + + def _parse_train_data(self, data): + """Parse data for ShapeMask training.""" + classes = data['groundtruth_classes'] + boxes = data['groundtruth_boxes'] + masks = data['groundtruth_instance_masks'] + is_crowds = data['groundtruth_is_crowd'] + # Skips annotations with `is_crowd` = True. + if self._skip_crowd_during_training and self._is_training: + num_groundtrtuhs = tf.shape(classes)[0] + with tf.control_dependencies([num_groundtrtuhs, is_crowds]): + indices = tf.cond( + tf.greater(tf.size(is_crowds), 0), + lambda: tf.where(tf.logical_not(is_crowds))[:, 0], + lambda: tf.cast(tf.range(num_groundtrtuhs), tf.int64)) + classes = tf.gather(classes, indices) + boxes = tf.gather(boxes, indices) + masks = tf.gather(masks, indices) + + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(image)[0:2] + + # If not using category, makes all categories with id = 0. + if not self._use_category: + classes = tf.cast(tf.greater(classes, 0), dtype=tf.float32) + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Flips image randomly during training. + if self._aug_rand_hflip: + image, boxes, masks = input_utils.random_horizontal_flip( + image, boxes, masks) + + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes(boxes, image_shape) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + self._output_size, + aug_scale_min=self._aug_scale_min, + aug_scale_max=self._aug_scale_max) + image_scale = image_info[2, :] + offset = image_info[3, :] + + # Resizes and crops boxes and masks. + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + classes = tf.gather(classes, indices) + masks = tf.gather(masks, indices) + + # Assigns anchors. + input_anchor = anchor.Anchor( + self._min_level, self._max_level, self._num_scales, + self._aspect_ratios, self._anchor_size, self._output_size) + anchor_labeler = anchor.AnchorLabeler( + input_anchor, self._match_threshold, self._unmatched_threshold) + (cls_targets, + box_targets, + num_positives) = anchor_labeler.label_anchors( + boxes, + tf.cast(tf.expand_dims(classes, axis=1), tf.float32)) + + # Sample groundtruth masks/boxes/classes for mask branch. + num_masks = tf.shape(masks)[0] + mask_shape = tf.shape(masks)[1:3] + + # Pad sampled boxes/masks/classes to a constant batch size. + padded_boxes = input_utils.pad_to_fixed_size(boxes, self._num_sampled_masks) + padded_classes = input_utils.pad_to_fixed_size( + classes, self._num_sampled_masks) + padded_masks = input_utils.pad_to_fixed_size(masks, self._num_sampled_masks) + + # Randomly sample groundtruth masks for mask branch training. For the image + # without groundtruth masks, it will sample the dummy padded tensors. + rand_indices = tf.random.shuffle( + tf.range(tf.maximum(num_masks, self._num_sampled_masks))) + rand_indices = tf.math.mod(rand_indices, tf.maximum(num_masks, 1)) + rand_indices = rand_indices[0:self._num_sampled_masks] + rand_indices = tf.reshape(rand_indices, [self._num_sampled_masks]) + + sampled_boxes = tf.gather(padded_boxes, rand_indices) + sampled_classes = tf.gather(padded_classes, rand_indices) + sampled_masks = tf.gather(padded_masks, rand_indices) + # Jitter the sampled boxes to mimic the noisy detections. + sampled_boxes = box_utils.jitter_boxes( + sampled_boxes, noise_scale=self._box_jitter_scale) + sampled_boxes = box_utils.clip_boxes(sampled_boxes, self._output_size) + # Compute mask targets in feature crop. A feature crop fully contains a + # sampled box. + mask_outer_boxes = box_utils.compute_outer_boxes( + sampled_boxes, tf.shape(image)[0:2], scale=self._outer_box_scale) + mask_outer_boxes = box_utils.clip_boxes(mask_outer_boxes, self._output_size) + # Compensate the offset of mask_outer_boxes to map it back to original image + # scale. + mask_outer_boxes_ori = mask_outer_boxes + mask_outer_boxes_ori += tf.tile(tf.expand_dims(offset, axis=0), [1, 2]) + mask_outer_boxes_ori /= tf.tile(tf.expand_dims(image_scale, axis=0), [1, 2]) + norm_mask_outer_boxes_ori = box_utils.normalize_boxes( + mask_outer_boxes_ori, mask_shape) + + # Set sampled_masks shape to [batch_size, height, width, 1]. + sampled_masks = tf.cast(tf.expand_dims(sampled_masks, axis=-1), tf.float32) + mask_targets = tf.image.crop_and_resize( + sampled_masks, + norm_mask_outer_boxes_ori, + box_indices=tf.range(self._num_sampled_masks), + crop_size=[self._mask_crop_size, self._mask_crop_size], + method='bilinear', + extrapolation_value=0, + name='train_mask_targets') + mask_targets = tf.where(tf.greater_equal(mask_targets, 0.5), + tf.ones_like(mask_targets), + tf.zeros_like(mask_targets)) + mask_targets = tf.squeeze(mask_targets, axis=-1) + if self._up_sample_factor > 1: + fine_mask_targets = tf.image.crop_and_resize( + sampled_masks, + norm_mask_outer_boxes_ori, + box_indices=tf.range(self._num_sampled_masks), + crop_size=[ + self._mask_crop_size * self._up_sample_factor, + self._mask_crop_size * self._up_sample_factor + ], + method='bilinear', + extrapolation_value=0, + name='train_mask_targets') + fine_mask_targets = tf.where( + tf.greater_equal(fine_mask_targets, 0.5), + tf.ones_like(fine_mask_targets), tf.zeros_like(fine_mask_targets)) + fine_mask_targets = tf.squeeze(fine_mask_targets, axis=-1) + else: + fine_mask_targets = mask_targets + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + valid_image = tf.cast(tf.not_equal(num_masks, 0), tf.int32) + if self._mask_train_class == 'all': + mask_is_valid = valid_image * tf.ones_like(sampled_classes, tf.int32) + else: + # Get the intersection of sampled classes with training splits. + mask_valid_classes = tf.cast( + tf.expand_dims( + class_utils.coco_split_class_ids(self._mask_train_class), 1), + sampled_classes.dtype) + match = tf.reduce_any( + tf.equal(tf.expand_dims(sampled_classes, 0), mask_valid_classes), 0) + mask_is_valid = valid_image * tf.cast(match, tf.int32) + + # Packs labels for model_fn outputs. + labels = { + 'cls_targets': cls_targets, + 'box_targets': box_targets, + 'anchor_boxes': input_anchor.multilevel_boxes, + 'num_positives': num_positives, + 'image_info': image_info, + # For ShapeMask. + 'mask_boxes': sampled_boxes, + 'mask_outer_boxes': mask_outer_boxes, + 'mask_targets': mask_targets, + 'fine_mask_targets': fine_mask_targets, + 'mask_classes': sampled_classes, + 'mask_is_valid': mask_is_valid, + } + return image, labels + + def _parse_predict_data(self, data): + """Parse data for ShapeMask training.""" + classes = data['groundtruth_classes'] + boxes = data['groundtruth_boxes'] + masks = data['groundtruth_instance_masks'] + + # Gets original image and its size. + image = data['image'] + image_shape = tf.shape(image)[0:2] + + # If not using category, makes all categories with id = 0. + if not self._use_category: + classes = tf.cast(tf.greater(classes, 0), dtype=tf.float32) + + # Normalizes image with mean and std pixel values. + image = input_utils.normalize_image(image) + + # Converts boxes from normalized coordinates to pixel coordinates. + boxes = box_utils.denormalize_boxes(boxes, image_shape) + + # Resizes and crops image. + image, image_info = input_utils.resize_and_crop_image( + image, + self._output_size, + self._output_size, + aug_scale_min=1.0, + aug_scale_max=1.0) + image_scale = image_info[2, :] + offset = image_info[3, :] + + # Resizes and crops boxes and masks. + boxes = input_utils.resize_and_crop_boxes( + boxes, image_scale, image_info[1, :], offset) + masks = input_utils.resize_and_crop_masks( + tf.expand_dims(masks, axis=-1), image_scale, self._output_size, offset) + + # Filters out ground truth boxes that are all zeros. + indices = box_utils.get_non_empty_box_indices(boxes) + boxes = tf.gather(boxes, indices) + classes = tf.gather(classes, indices) + + # Assigns anchors. + input_anchor = anchor.Anchor( + self._min_level, self._max_level, self._num_scales, + self._aspect_ratios, self._anchor_size, self._output_size) + anchor_labeler = anchor.AnchorLabeler( + input_anchor, self._match_threshold, self._unmatched_threshold) + + # If bfloat16 is used, casts input image to tf.bfloat16. + if self._use_bfloat16: + image = tf.cast(image, dtype=tf.bfloat16) + + labels = { + 'anchor_boxes': input_anchor.multilevel_boxes, + 'image_info': image_info, + } + if self._mode == ModeKeys.PREDICT_WITH_GT: + # Converts boxes from normalized coordinates to pixel coordinates. + groundtruths = { + 'source_id': data['source_id'], + 'num_detections': tf.shape(data['groundtruth_classes']), + 'boxes': box_utils.denormalize_boxes( + data['groundtruth_boxes'], image_shape), + 'classes': data['groundtruth_classes'], + # 'masks': tf.squeeze(masks, axis=-1), + 'areas': data['groundtruth_area'], + 'is_crowds': tf.cast(data['groundtruth_is_crowd'], tf.int32), + } + groundtruths['source_id'] = dataloader_utils.process_source_id( + groundtruths['source_id']) + groundtruths = dataloader_utils.pad_groundtruths_to_fixed_size( + groundtruths, self._max_num_instances) + # Computes training labels. + (cls_targets, + box_targets, + num_positives) = anchor_labeler.label_anchors( + boxes, + tf.cast(tf.expand_dims(classes, axis=1), tf.float32)) + # Packs labels for model_fn outputs. + labels.update({ + 'cls_targets': cls_targets, + 'box_targets': box_targets, + 'num_positives': num_positives, + 'groundtruths': groundtruths, + }) + return image, labels diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/tf_example_decoder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/tf_example_decoder.py new file mode 100644 index 0000000..a4b8124 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/dataloader/tf_example_decoder.py @@ -0,0 +1,156 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tensorflow Example proto decoder for object detection. + +A decoder to decode string tensors containing serialized tensorflow.Example +protos for object detection. +""" +import tensorflow.compat.v2 as tf + + +class TfExampleDecoder(object): + """Tensorflow Example proto decoder.""" + + def __init__(self, include_mask=False): + self._include_mask = include_mask + self._keys_to_features = { + 'image/encoded': + tf.io.FixedLenFeature((), tf.string), + 'image/source_id': + tf.io.FixedLenFeature((), tf.string), + 'image/height': + tf.io.FixedLenFeature((), tf.int64), + 'image/width': + tf.io.FixedLenFeature((), tf.int64), + 'image/object/bbox/xmin': + tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/xmax': + tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/ymin': + tf.io.VarLenFeature(tf.float32), + 'image/object/bbox/ymax': + tf.io.VarLenFeature(tf.float32), + 'image/object/class/label': + tf.io.VarLenFeature(tf.int64), + 'image/object/area': + tf.io.VarLenFeature(tf.float32), + 'image/object/is_crowd': + tf.io.VarLenFeature(tf.int64), + } + if include_mask: + self._keys_to_features.update({ + 'image/object/mask': + tf.io.VarLenFeature(tf.string), + }) + + def _decode_image(self, parsed_tensors): + """Decodes the image and set its static shape.""" + image = tf.io.decode_image(parsed_tensors['image/encoded'], channels=3) + image.set_shape([None, None, 3]) + return image + + def _decode_boxes(self, parsed_tensors): + """Concat box coordinates in the format of [ymin, xmin, ymax, xmax].""" + xmin = parsed_tensors['image/object/bbox/xmin'] + xmax = parsed_tensors['image/object/bbox/xmax'] + ymin = parsed_tensors['image/object/bbox/ymin'] + ymax = parsed_tensors['image/object/bbox/ymax'] + return tf.stack([ymin, xmin, ymax, xmax], axis=-1) + + def _decode_masks(self, parsed_tensors): + """Decode a set of PNG masks to the tf.float32 tensors.""" + def _decode_png_mask(png_bytes): + mask = tf.squeeze( + tf.io.decode_png(png_bytes, channels=1, dtype=tf.uint8), axis=-1) + mask = tf.cast(mask, dtype=tf.float32) + mask.set_shape([None, None]) + return mask + + height = parsed_tensors['image/height'] + width = parsed_tensors['image/width'] + masks = parsed_tensors['image/object/mask'] + return tf.cond( + pred=tf.greater(tf.size(input=masks), 0), + true_fn=lambda: tf.map_fn(_decode_png_mask, masks, dtype=tf.float32), + false_fn=lambda: tf.zeros([0, height, width], dtype=tf.float32)) + + def _decode_areas(self, parsed_tensors): + xmin = parsed_tensors['image/object/bbox/xmin'] + xmax = parsed_tensors['image/object/bbox/xmax'] + ymin = parsed_tensors['image/object/bbox/ymin'] + ymax = parsed_tensors['image/object/bbox/ymax'] + return tf.cond( + tf.greater(tf.shape(parsed_tensors['image/object/area'])[0], 0), + lambda: parsed_tensors['image/object/area'], + lambda: (xmax - xmin) * (ymax - ymin)) + + def decode(self, serialized_example): + """Decode the serialized example. + + Args: + serialized_example: a single serialized tf.Example string. + + Returns: + decoded_tensors: a dictionary of tensors with the following fields: + - image: a uint8 tensor of shape [None, None, 3]. + - source_id: a string scalar tensor. + - height: an integer scalar tensor. + - width: an integer scalar tensor. + - groundtruth_classes: a int64 tensor of shape [None]. + - groundtruth_is_crowd: a bool tensor of shape [None]. + - groundtruth_area: a float32 tensor of shape [None]. + - groundtruth_boxes: a float32 tensor of shape [None, 4]. + - groundtruth_instance_masks: a float32 tensor of shape + [None, None, None]. + - groundtruth_instance_masks_png: a string tensor of shape [None]. + """ + parsed_tensors = tf.io.parse_single_example( + serialized=serialized_example, features=self._keys_to_features) + for k in parsed_tensors: + if isinstance(parsed_tensors[k], tf.SparseTensor): + if parsed_tensors[k].dtype == tf.string: + parsed_tensors[k] = tf.sparse.to_dense( + parsed_tensors[k], default_value='') + else: + parsed_tensors[k] = tf.sparse.to_dense( + parsed_tensors[k], default_value=0) + + image = self._decode_image(parsed_tensors) + boxes = self._decode_boxes(parsed_tensors) + areas = self._decode_areas(parsed_tensors) + is_crowds = tf.cond( + tf.greater(tf.shape(parsed_tensors['image/object/is_crowd'])[0], 0), + lambda: tf.cast(parsed_tensors['image/object/is_crowd'], dtype=tf.bool), + lambda: tf.zeros_like(parsed_tensors['image/object/class/label'], dtype=tf.bool)) # pylint: disable=line-too-long + if self._include_mask: + masks = self._decode_masks(parsed_tensors) + + decoded_tensors = { + 'image': image, + 'source_id': parsed_tensors['image/source_id'], + 'height': parsed_tensors['image/height'], + 'width': parsed_tensors['image/width'], + 'groundtruth_classes': parsed_tensors['image/object/class/label'], + 'groundtruth_is_crowd': is_crowds, + 'groundtruth_area': areas, + 'groundtruth_boxes': boxes, + } + if self._include_mask: + decoded_tensors.update({ + 'groundtruth_instance_masks': masks, + 'groundtruth_instance_masks_png': parsed_tensors['image/object/mask'], + }) + return decoded_tensors diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_evaluator.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_evaluator.py new file mode 100644 index 0000000..6413faa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_evaluator.py @@ -0,0 +1,343 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""The COCO-style evaluator. + +The following snippet demonstrates the use of interfaces: + + evaluator = COCOEvaluator(...) + for _ in range(num_evals): + for _ in range(num_batches_per_eval): + predictions, groundtruth = predictor.predict(...) # pop a batch. + evaluator.update(predictions, groundtruths) # aggregate internal stats. + evaluator.evaluate() # finish one full eval. + +See also: https://github.com/cocodataset/cocoapi/ +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import tempfile +import numpy as np +from absl import logging +from pycocotools import cocoeval +import six +import tensorflow.compat.v2 as tf + +from official.vision.detection.evaluation import coco_utils +from official.vision.detection.utils import class_utils + + +class MetricWrapper(object): + # This is only a wrapper for COCO metric and works on for numpy array. So it + # doesn't inherit from tf.keras.layers.Layer or tf.keras.metrics.Metric. + + def __init__(self, evaluator): + self._evaluator = evaluator + + def update_state(self, y_true, y_pred): + labels = tf.nest.map_structure(lambda x: x.numpy(), y_true) + outputs = tf.nest.map_structure(lambda x: x.numpy(), y_pred) + groundtruths = {} + predictions = {} + for key, val in outputs.items(): + if isinstance(val, tuple): + val = np.concatenate(val) + predictions[key] = val + for key, val in labels.items(): + if isinstance(val, tuple): + val = np.concatenate(val) + groundtruths[key] = val + self._evaluator.update(predictions, groundtruths) + + def result(self): + return self._evaluator.evaluate() + + def reset_states(self): + return self._evaluator.reset() + + +class COCOEvaluator(object): + """COCO evaluation metric class.""" + + def __init__(self, annotation_file, include_mask, need_rescale_bboxes=True): + """Constructs COCO evaluation class. + + The class provides the interface to metrics_fn in TPUEstimator. The + _update_op() takes detections from each image and push them to + self.detections. The _evaluate() loads a JSON file in COCO annotation format + as the groundtruths and runs COCO evaluation. + + Args: + annotation_file: a JSON file that stores annotations of the eval dataset. + If `annotation_file` is None, groundtruth annotations will be loaded + from the dataloader. + include_mask: a boolean to indicate whether or not to include the mask + eval. + need_rescale_bboxes: If true bboxes in `predictions` will be rescaled back + to absolute values (`image_info` is needed in this case). + """ + if annotation_file: + if annotation_file.startswith('gs://'): + _, local_val_json = tempfile.mkstemp(suffix='.json') + tf.io.gfile.remove(local_val_json) + + tf.io.gfile.copy(annotation_file, local_val_json) + atexit.register(tf.io.gfile.remove, local_val_json) + else: + local_val_json = annotation_file + self._coco_gt = coco_utils.COCOWrapper( + eval_type=('mask' if include_mask else 'box'), + annotation_file=local_val_json) + self._annotation_file = annotation_file + self._include_mask = include_mask + self._metric_names = [ + 'AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'ARmax1', 'ARmax10', + 'ARmax100', 'ARs', 'ARm', 'ARl' + ] + self._required_prediction_fields = [ + 'source_id', 'num_detections', 'detection_classes', 'detection_scores', + 'detection_boxes' + ] + self._need_rescale_bboxes = need_rescale_bboxes + if self._need_rescale_bboxes: + self._required_prediction_fields.append('image_info') + self._required_groundtruth_fields = [ + 'source_id', 'height', 'width', 'classes', 'boxes' + ] + if self._include_mask: + mask_metric_names = ['mask_' + x for x in self._metric_names] + self._metric_names.extend(mask_metric_names) + self._required_prediction_fields.extend(['detection_masks']) + self._required_groundtruth_fields.extend(['masks']) + + self.reset() + + def reset(self): + """Resets internal states for a fresh run.""" + self._predictions = {} + if not self._annotation_file: + self._groundtruths = {} + + def evaluate(self): + """Evaluates with detections from all images with COCO API. + + Returns: + coco_metric: float numpy array with shape [24] representing the + coco-style evaluation metrics (box and mask). + """ + if not self._annotation_file: + logging.info('Thre is no annotation_file in COCOEvaluator.') + gt_dataset = coco_utils.convert_groundtruths_to_coco_dataset( + self._groundtruths) + coco_gt = coco_utils.COCOWrapper( + eval_type=('mask' if self._include_mask else 'box'), + gt_dataset=gt_dataset) + else: + logging.info('Using annotation file: %s', self._annotation_file) + coco_gt = self._coco_gt + coco_predictions = coco_utils.convert_predictions_to_coco_annotations( + self._predictions) + coco_dt = coco_gt.loadRes(predictions=coco_predictions) + image_ids = [ann['image_id'] for ann in coco_predictions] + + coco_eval = cocoeval.COCOeval(coco_gt, coco_dt, iouType='bbox') + coco_eval.params.imgIds = image_ids + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + coco_metrics = coco_eval.stats + + if self._include_mask: + mcoco_eval = cocoeval.COCOeval(coco_gt, coco_dt, iouType='segm') + mcoco_eval.params.imgIds = image_ids + mcoco_eval.evaluate() + mcoco_eval.accumulate() + mcoco_eval.summarize() + mask_coco_metrics = mcoco_eval.stats + + if self._include_mask: + metrics = np.hstack((coco_metrics, mask_coco_metrics)) + else: + metrics = coco_metrics + + # Cleans up the internal variables in order for a fresh eval next time. + self.reset() + + metrics_dict = {} + for i, name in enumerate(self._metric_names): + metrics_dict[name] = metrics[i].astype(np.float32) + return metrics_dict + + def _process_predictions(self, predictions): + image_scale = np.tile(predictions['image_info'][:, 2:3, :], (1, 1, 2)) + predictions['detection_boxes'] = ( + predictions['detection_boxes'].astype(np.float32)) + predictions['detection_boxes'] /= image_scale + if 'detection_outer_boxes' in predictions: + predictions['detection_outer_boxes'] = ( + predictions['detection_outer_boxes'].astype(np.float32)) + predictions['detection_outer_boxes'] /= image_scale + + def update(self, predictions, groundtruths=None): + """Update and aggregate detection results and groundtruth data. + + Args: + predictions: a dictionary of numpy arrays including the fields below. + See different parsers under `../dataloader` for more details. + Required fields: + - source_id: a numpy array of int or string of shape [batch_size]. + - image_info [if `need_rescale_bboxes` is True]: a numpy array of + float of shape [batch_size, 4, 2]. + - num_detections: a numpy array of + int of shape [batch_size]. + - detection_boxes: a numpy array of float of shape [batch_size, K, 4]. + - detection_classes: a numpy array of int of shape [batch_size, K]. + - detection_scores: a numpy array of float of shape [batch_size, K]. + Optional fields: + - detection_masks: a numpy array of float of shape + [batch_size, K, mask_height, mask_width]. + groundtruths: a dictionary of numpy arrays including the fields below. + See also different parsers under `../dataloader` for more details. + Required fields: + - source_id: a numpy array of int or string of shape [batch_size]. + - height: a numpy array of int of shape [batch_size]. + - width: a numpy array of int of shape [batch_size]. + - num_detections: a numpy array of int of shape [batch_size]. + - boxes: a numpy array of float of shape [batch_size, K, 4]. + - classes: a numpy array of int of shape [batch_size, K]. + Optional fields: + - is_crowds: a numpy array of int of shape [batch_size, K]. If the + field is absent, it is assumed that this instance is not crowd. + - areas: a numy array of float of shape [batch_size, K]. If the + field is absent, the area is calculated using either boxes or + masks depending on which one is available. + - masks: a numpy array of float of shape + [batch_size, K, mask_height, mask_width], + + Raises: + ValueError: if the required prediction or groundtruth fields are not + present in the incoming `predictions` or `groundtruths`. + """ + for k in self._required_prediction_fields: + if k not in predictions: + raise ValueError( + 'Missing the required key `{}` in predictions!'.format(k)) + if self._need_rescale_bboxes: + self._process_predictions(predictions) + for k, v in six.iteritems(predictions): + if k not in self._predictions: + self._predictions[k] = [v] + else: + self._predictions[k].append(v) + + if not self._annotation_file: + assert groundtruths + for k in self._required_groundtruth_fields: + if k not in groundtruths: + raise ValueError( + 'Missing the required key `{}` in groundtruths!'.format(k)) + for k, v in six.iteritems(groundtruths): + if k not in self._groundtruths: + self._groundtruths[k] = [v] + else: + self._groundtruths[k].append(v) + + +class ShapeMaskCOCOEvaluator(COCOEvaluator): + """COCO evaluation metric class for ShapeMask.""" + + def __init__(self, mask_eval_class, **kwargs): + """Constructs COCO evaluation class. + + The class provides the interface to metrics_fn in TPUEstimator. The + _update_op() takes detections from each image and push them to + self.detections. The _evaluate() loads a JSON file in COCO annotation format + as the groundtruths and runs COCO evaluation. + + Args: + mask_eval_class: the set of classes for mask evaluation. + **kwargs: other keyword arguments passed to the parent class initializer. + """ + super(ShapeMaskCOCOEvaluator, self).__init__(**kwargs) + self._mask_eval_class = mask_eval_class + self._eval_categories = class_utils.coco_split_class_ids(mask_eval_class) + if mask_eval_class != 'all': + self._metric_names = [ + x.replace('mask', 'novel_mask') for x in self._metric_names + ] + + def evaluate(self): + """Evaluates with detections from all images with COCO API. + + Returns: + coco_metric: float numpy array with shape [24] representing the + coco-style evaluation metrics (box and mask). + """ + if not self._annotation_file: + gt_dataset = coco_utils.convert_groundtruths_to_coco_dataset( + self._groundtruths) + coco_gt = coco_utils.COCOWrapper( + eval_type=('mask' if self._include_mask else 'box'), + gt_dataset=gt_dataset) + else: + coco_gt = self._coco_gt + coco_predictions = coco_utils.convert_predictions_to_coco_annotations( + self._predictions) + coco_dt = coco_gt.loadRes(predictions=coco_predictions) + image_ids = [ann['image_id'] for ann in coco_predictions] + + coco_eval = cocoeval.COCOeval(coco_gt, coco_dt, iouType='bbox') + coco_eval.params.imgIds = image_ids + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + coco_metrics = coco_eval.stats + + if self._include_mask: + mcoco_eval = cocoeval.COCOeval(coco_gt, coco_dt, iouType='segm') + mcoco_eval.params.imgIds = image_ids + mcoco_eval.evaluate() + mcoco_eval.accumulate() + mcoco_eval.summarize() + if self._mask_eval_class == 'all': + metrics = np.hstack((coco_metrics, mcoco_eval.stats)) + else: + mask_coco_metrics = mcoco_eval.category_stats + val_catg_idx = np.isin(mcoco_eval.params.catIds, + self._eval_categories) + # Gather the valid evaluation of the eval categories. + if np.any(val_catg_idx): + mean_val_metrics = [] + for mid in range(len(self._metric_names) // 2): + mean_val_metrics.append( + np.nanmean(mask_coco_metrics[mid][val_catg_idx])) + + mean_val_metrics = np.array(mean_val_metrics) + else: + mean_val_metrics = np.zeros(len(self._metric_names) // 2) + metrics = np.hstack((coco_metrics, mean_val_metrics)) + else: + metrics = coco_metrics + + # Cleans up the internal variables in order for a fresh eval next time. + self.reset() + + metrics_dict = {} + for i, name in enumerate(self._metric_names): + metrics_dict[name] = metrics[i].astype(np.float32) + return metrics_dict diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_utils.py new file mode 100644 index 0000000..7c63449 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/coco_utils.py @@ -0,0 +1,374 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Util functions related to pycocotools and COCO eval.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import json + +from absl import logging +import numpy as np +from PIL import Image +from pycocotools import coco +from pycocotools import mask as mask_api +import six +import tensorflow.compat.v2 as tf + +from official.vision.detection.dataloader import tf_example_decoder +from official.vision.detection.utils import box_utils +from official.vision.detection.utils import mask_utils + + +class COCOWrapper(coco.COCO): + """COCO wrapper class. + + This class wraps COCO API object, which provides the following additional + functionalities: + 1. Support string type image id. + 2. Support loading the groundtruth dataset using the external annotation + dictionary. + 3. Support loading the prediction results using the external annotation + dictionary. + """ + + def __init__(self, eval_type='box', annotation_file=None, gt_dataset=None): + """Instantiates a COCO-style API object. + + Args: + eval_type: either 'box' or 'mask'. + annotation_file: a JSON file that stores annotations of the eval dataset. + This is required if `gt_dataset` is not provided. + gt_dataset: the groundtruth eval datatset in COCO API format. + """ + if ((annotation_file and gt_dataset) or + ((not annotation_file) and (not gt_dataset))): + raise ValueError('One and only one of `annotation_file` and `gt_dataset` ' + 'needs to be specified.') + + if eval_type not in ['box', 'mask']: + raise ValueError('The `eval_type` can only be either `box` or `mask`.') + + coco.COCO.__init__(self, annotation_file=annotation_file) + self._eval_type = eval_type + if gt_dataset: + self.dataset = gt_dataset + self.createIndex() + + def loadRes(self, predictions): + """Loads result file and return a result api object. + + Args: + predictions: a list of dictionary each representing an annotation in COCO + format. The required fields are `image_id`, `category_id`, `score`, + `bbox`, `segmentation`. + + Returns: + res: result COCO api object. + + Raises: + ValueError: if the set of image id from predctions is not the subset of + the set of image id of the groundtruth dataset. + """ + res = coco.COCO() + res.dataset['images'] = copy.deepcopy(self.dataset['images']) + res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) + + image_ids = [ann['image_id'] for ann in predictions] + if set(image_ids) != (set(image_ids) & set(self.getImgIds())): + raise ValueError('Results do not correspond to the current dataset!') + for ann in predictions: + x1, x2, y1, y2 = [ann['bbox'][0], ann['bbox'][0] + ann['bbox'][2], + ann['bbox'][1], ann['bbox'][1] + ann['bbox'][3]] + if self._eval_type == 'box': + ann['area'] = ann['bbox'][2] * ann['bbox'][3] + ann['segmentation'] = [ + [x1, y1, x1, y2, x2, y2, x2, y1]] + elif self._eval_type == 'mask': + ann['area'] = mask_api.area(ann['segmentation']) + + res.dataset['annotations'] = copy.deepcopy(predictions) + res.createIndex() + return res + + +def convert_predictions_to_coco_annotations(predictions): + """Converts a batch of predictions to annotations in COCO format. + + Args: + predictions: a dictionary of lists of numpy arrays including the following + fields. K below denotes the maximum number of instances per image. + Required fields: + - source_id: a list of numpy arrays of int or string of shape + [batch_size]. + - num_detections: a list of numpy arrays of int of shape [batch_size]. + - detection_boxes: a list of numpy arrays of float of shape + [batch_size, K, 4], where coordinates are in the original image + space (not the scaled image space). + - detection_classes: a list of numpy arrays of int of shape + [batch_size, K]. + - detection_scores: a list of numpy arrays of float of shape + [batch_size, K]. + Optional fields: + - detection_masks: a list of numpy arrays of float of shape + [batch_size, K, mask_height, mask_width]. + + Returns: + coco_predictions: prediction in COCO annotation format. + """ + coco_predictions = [] + num_batches = len(predictions['source_id']) + batch_size = predictions['source_id'][0].shape[0] + max_num_detections = predictions['detection_classes'][0].shape[1] + use_outer_box = 'detection_outer_boxes' in predictions + for i in range(num_batches): + predictions['detection_boxes'][i] = box_utils.yxyx_to_xywh( + predictions['detection_boxes'][i]) + if use_outer_box: + predictions['detection_outer_boxes'][i] = box_utils.yxyx_to_xywh( + predictions['detection_outer_boxes'][i]) + mask_boxes = predictions['detection_outer_boxes'] + else: + mask_boxes = predictions['detection_boxes'] + + for j in range(batch_size): + if 'detection_masks' in predictions: + image_masks = mask_utils.paste_instance_masks( + predictions['detection_masks'][i][j], + mask_boxes[i][j], + int(predictions['image_info'][i][j, 0, 0]), + int(predictions['image_info'][i][j, 0, 1])) + binary_masks = (image_masks > 0.0).astype(np.uint8) + encoded_masks = [ + mask_api.encode(np.asfortranarray(binary_mask)) + for binary_mask in list(binary_masks)] + for k in range(max_num_detections): + ann = {} + ann['image_id'] = predictions['source_id'][i][j] + ann['category_id'] = predictions['detection_classes'][i][j, k] + ann['bbox'] = predictions['detection_boxes'][i][j, k] + ann['score'] = predictions['detection_scores'][i][j, k] + if 'detection_masks' in predictions: + ann['segmentation'] = encoded_masks[k] + coco_predictions.append(ann) + + for i, ann in enumerate(coco_predictions): + ann['id'] = i + 1 + + return coco_predictions + + +def convert_groundtruths_to_coco_dataset(groundtruths, label_map=None): + """Converts groundtruths to the dataset in COCO format. + + Args: + groundtruths: a dictionary of numpy arrays including the fields below. + Note that each element in the list represent the number for a single + example without batch dimension. K below denotes the actual number of + instances for each image. + Required fields: + - source_id: a list of numpy arrays of int or string of shape + [batch_size]. + - height: a list of numpy arrays of int of shape [batch_size]. + - width: a list of numpy arrays of int of shape [batch_size]. + - num_detections: a list of numpy arrays of int of shape [batch_size]. + - boxes: a list of numpy arrays of float of shape [batch_size, K, 4], + where coordinates are in the original image space (not the + normalized coordinates). + - classes: a list of numpy arrays of int of shape [batch_size, K]. + Optional fields: + - is_crowds: a list of numpy arrays of int of shape [batch_size, K]. If + th field is absent, it is assumed that this instance is not crowd. + - areas: a list of numy arrays of float of shape [batch_size, K]. If the + field is absent, the area is calculated using either boxes or + masks depending on which one is available. + - masks: a list of numpy arrays of string of shape [batch_size, K], + label_map: (optional) a dictionary that defines items from the category id + to the category name. If `None`, collect the category mappping from the + `groundtruths`. + + Returns: + coco_groundtruths: the groundtruth dataset in COCO format. + """ + source_ids = np.concatenate(groundtruths['source_id'], axis=0) + heights = np.concatenate(groundtruths['height'], axis=0) + widths = np.concatenate(groundtruths['width'], axis=0) + gt_images = [{'id': int(i), 'height': int(h), 'width': int(w)} for i, h, w + in zip(source_ids, heights, widths)] + + gt_annotations = [] + num_batches = len(groundtruths['source_id']) + batch_size = groundtruths['source_id'][0].shape[0] + for i in range(num_batches): + for j in range(batch_size): + num_instances = groundtruths['num_detections'][i][j] + for k in range(num_instances): + ann = {} + ann['image_id'] = int(groundtruths['source_id'][i][j]) + if 'is_crowds' in groundtruths: + ann['iscrowd'] = int(groundtruths['is_crowds'][i][j, k]) + else: + ann['iscrowd'] = 0 + ann['category_id'] = int(groundtruths['classes'][i][j, k]) + boxes = groundtruths['boxes'][i] + ann['bbox'] = [ + float(boxes[j, k, 1]), + float(boxes[j, k, 0]), + float(boxes[j, k, 3] - boxes[j, k, 1]), + float(boxes[j, k, 2] - boxes[j, k, 0])] + if 'areas' in groundtruths: + ann['area'] = float(groundtruths['areas'][i][j, k]) + else: + ann['area'] = float( + (boxes[j, k, 3] - boxes[j, k, 1]) * + (boxes[j, k, 2] - boxes[j, k, 0])) + if 'masks' in groundtruths: + mask = Image.open(six.StringIO(groundtruths['masks'][i][j, k])) + width, height = mask.size + np_mask = ( + np.array(mask.getdata()).reshape(height, width).astype(np.uint8)) + np_mask[np_mask > 0] = 255 + encoded_mask = mask_api.encode(np.asfortranarray(np_mask)) + ann['segmentation'] = encoded_mask + if 'areas' not in groundtruths: + ann['area'] = mask_api.area(encoded_mask) + gt_annotations.append(ann) + + for i, ann in enumerate(gt_annotations): + ann['id'] = i + 1 + + if label_map: + gt_categories = [{'id': i, 'name': label_map[i]} for i in label_map] + else: + category_ids = [gt['category_id'] for gt in gt_annotations] + gt_categories = [{'id': i} for i in set(category_ids)] + + gt_dataset = { + 'images': gt_images, + 'categories': gt_categories, + 'annotations': copy.deepcopy(gt_annotations), + } + return gt_dataset + + +class COCOGroundtruthGenerator(object): + """Generates the groundtruth annotations from a single example.""" + + def __init__(self, file_pattern, num_examples, include_mask): + self._file_pattern = file_pattern + self._num_examples = num_examples + self._include_mask = include_mask + self._dataset_fn = tf.data.TFRecordDataset + + def _parse_single_example(self, example): + """Parses a single serialized tf.Example proto. + + Args: + example: a serialized tf.Example proto string. + + Returns: + A dictionary of groundtruth with the following fields: + source_id: a scalar tensor of int64 representing the image source_id. + height: a scalar tensor of int64 representing the image height. + width: a scalar tensor of int64 representing the image width. + boxes: a float tensor of shape [K, 4], representing the groundtruth + boxes in absolute coordinates with respect to the original image size. + classes: a int64 tensor of shape [K], representing the class labels of + each instances. + is_crowds: a bool tensor of shape [K], indicating whether the instance + is crowd. + areas: a float tensor of shape [K], indicating the area of each + instance. + masks: a string tensor of shape [K], containing the bytes of the png + mask of each instance. + """ + decoder = tf_example_decoder.TfExampleDecoder( + include_mask=self._include_mask) + decoded_tensors = decoder.decode(example) + + image = decoded_tensors['image'] + image_size = tf.shape(image)[0:2] + boxes = box_utils.denormalize_boxes( + decoded_tensors['groundtruth_boxes'], image_size) + groundtruths = { + 'source_id': tf.string_to_number( + decoded_tensors['source_id'], out_type=tf.int64), + 'height': decoded_tensors['height'], + 'width': decoded_tensors['width'], + 'num_detections': tf.shape(decoded_tensors['groundtruth_classes'])[0], + 'boxes': boxes, + 'classes': decoded_tensors['groundtruth_classes'], + 'is_crowds': decoded_tensors['groundtruth_is_crowd'], + 'areas': decoded_tensors['groundtruth_area'], + } + if self._include_mask: + groundtruths.update({ + 'masks': decoded_tensors['groundtruth_instance_masks_png'], + }) + return groundtruths + + def _build_pipeline(self): + """Builds data pipeline to generate groundtruth annotations.""" + dataset = tf.data.Dataset.list_files(self._file_pattern, shuffle=False) + dataset = dataset.apply( + tf.data.experimental.parallel_interleave( + lambda filename: self._dataset_fn(filename).prefetch(1), + cycle_length=32, + sloppy=False)) + dataset = dataset.map(self._parse_single_example, num_parallel_calls=64) + dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(1, drop_remainder=False) + return dataset + + def __call__(self): + with tf.Graph().as_default(): + dataset = self._build_pipeline() + groundtruth = dataset.make_one_shot_iterator().get_next() + + with tf.Session() as sess: + for _ in range(self._num_examples): + groundtruth_result = sess.run(groundtruth) + yield groundtruth_result + + +def scan_and_generator_annotation_file(file_pattern, + num_samples, + include_mask, + annotation_file): + """Scans and generate the COCO-style annotation JSON file given a dataset.""" + groundtruth_generator = COCOGroundtruthGenerator( + file_pattern, num_samples, include_mask) + generate_annotation_file(groundtruth_generator, annotation_file) + + +def generate_annotation_file(groundtruth_generator, + annotation_file): + """Generates COCO-style annotation JSON file given a groundtruth generator.""" + groundtruths = {} + logging.info('Loading groundtruth annotations from dataset to memory...') + for groundtruth in groundtruth_generator(): + for k, v in six.iteritems(groundtruth): + if k not in groundtruths: + groundtruths[k] = [v] + else: + groundtruths[k].append(v) + gt_dataset = convert_groundtruths_to_coco_dataset(groundtruths) + + logging.info('Saving groundtruth annotations to the JSON file...') + with tf.io.gfile.GFile(annotation_file, 'w') as f: + f.write(json.dumps(gt_dataset)) + logging.info('Done saving the JSON file...') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/factory.py new file mode 100644 index 0000000..5894715 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/evaluation/factory.py @@ -0,0 +1,35 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Evaluator factory.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from official.vision.detection.evaluation import coco_evaluator + + +def evaluator_generator(params): + """Generator function for various evaluators.""" + if params.type == 'box': + evaluator = coco_evaluator.COCOEvaluator( + annotation_file=params.val_json_file, include_mask=False) + elif params.type == 'box_and_mask': + evaluator = coco_evaluator.COCOEvaluator( + annotation_file=params.val_json_file, include_mask=True) + else: + raise ValueError('Evaluator %s is not supported.' % params.type) + + return coco_evaluator.MetricWrapper(evaluator) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/detection_executor.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/detection_executor.py new file mode 100644 index 0000000..799a239 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/executor/detection_executor.py @@ -0,0 +1,160 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""An executor class for running model on TensorFlow 2.0.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging + +import tensorflow.compat.v2 as tf +from official.modeling.training import distributed_executor as executor +from official.vision.detection.utils.object_detection import visualization_utils + + +class DetectionDistributedExecutor(executor.DistributedExecutor): + """Detection specific customer training loop executor. + + Subclasses the DistributedExecutor and adds support for numpy based metrics. + """ + + def __init__(self, + predict_post_process_fn=None, + trainable_variables_filter=None, + **kwargs): + super(DetectionDistributedExecutor, self).__init__(**kwargs) + if predict_post_process_fn: + assert callable(predict_post_process_fn) + if trainable_variables_filter: + assert callable(trainable_variables_filter) + self._predict_post_process_fn = predict_post_process_fn + self._trainable_variables_filter = trainable_variables_filter + self.eval_steps = tf.Variable( + 0, + trainable=False, + dtype=tf.int32, + synchronization=tf.VariableSynchronization.ON_READ, + aggregation=tf.VariableAggregation.ONLY_FIRST_REPLICA, + shape=[]) + + def _create_replicated_step(self, + strategy, + model, + loss_fn, + optimizer, + metric=None): + trainable_variables = model.trainable_variables + if self._trainable_variables_filter: + trainable_variables = self._trainable_variables_filter( + trainable_variables) + logging.info('Filter trainable variables from %d to %d', + len(model.trainable_variables), len(trainable_variables)) + _update_state = lambda labels, outputs: None + if isinstance(metric, tf.keras.metrics.Metric): + _update_state = lambda labels, outputs: metric.update_state( + labels, outputs) + else: + logging.error('Detection: train metric is not an instance of ' + 'tf.keras.metrics.Metric.') + + def _replicated_step(inputs): + """Replicated training step.""" + inputs, labels = inputs + + with tf.GradientTape() as tape: + outputs = model(inputs, training=True) + all_losses = loss_fn(labels, outputs) + losses = {} + for k, v in all_losses.items(): + losses[k] = tf.reduce_mean(v) + per_replica_loss = losses['total_loss'] / strategy.num_replicas_in_sync + _update_state(labels, outputs) + + grads = tape.gradient(per_replica_loss, trainable_variables) + optimizer.apply_gradients(zip(grads, trainable_variables)) + return losses + + return _replicated_step + + def _create_test_step(self, strategy, model, metric): + """Creates a distributed test step.""" + + @tf.function + def test_step(iterator, eval_steps): + """Calculates evaluation metrics on distributed devices.""" + + def _test_step_fn(inputs, eval_steps): + """Replicated accuracy calculation.""" + inputs, labels = inputs + model_outputs = model(inputs, training=False) + if self._predict_post_process_fn: + labels, prediction_outputs = self._predict_post_process_fn( + labels, model_outputs) + num_remaining_visualizations = ( + self._params.eval.num_images_to_visualize - eval_steps) + # If there are remaining number of visualizations that needs to be + # done, add next batch outputs for visualization. + # + # TODO(hongjunchoi): Once dynamic slicing is supported on TPU, only + # write correct slice of outputs to summary file. + if num_remaining_visualizations > 0: + visualization_utils.visualize_images_with_bounding_boxes( + inputs, prediction_outputs['detection_boxes'], + self.global_train_step, self.eval_summary_writer) + + return labels, prediction_outputs + + labels, outputs = strategy.run( + _test_step_fn, args=( + next(iterator), + eval_steps, + )) + outputs = tf.nest.map_structure(strategy.experimental_local_results, + outputs) + labels = tf.nest.map_structure(strategy.experimental_local_results, + labels) + + eval_steps.assign_add(self._params.eval.batch_size) + return labels, outputs + + return test_step + + def _run_evaluation(self, test_step, current_training_step, metric, + test_iterator): + """Runs validation steps and aggregate metrics.""" + self.eval_steps.assign(0) + if not test_iterator or not metric: + logging.warning( + 'Both test_iterator (%s) and metrics (%s) must not be None.', + test_iterator, metric) + return None + logging.info('Running evaluation after step: %s.', current_training_step) + while True: + try: + labels, outputs = test_step(test_iterator, self.eval_steps) + if metric: + metric.update_state(labels, outputs) + except (StopIteration, tf.errors.OutOfRangeError): + break + + metric_result = metric.result() + if isinstance(metric, tf.keras.metrics.Metric): + metric_result = tf.nest.map_structure(lambda x: x.numpy().astype(float), + metric_result) + logging.info('Step: [%d] Validation metric = %s', current_training_step, + metric_result) + return metric_result diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/main.py new file mode 100644 index 0000000..8113471 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/main.py @@ -0,0 +1,255 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Main function to train various object detection models.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import app +from absl import flags +from absl import logging +import functools +import os +import pprint +import tensorflow.compat.v2 as tf + +from official.modeling.hyperparams import params_dict +from official.modeling.training import distributed_executor as executor +from official.utils import hyperparams_flags +from official.vision.detection.configs import factory as config_factory +from official.vision.detection.dataloader import input_reader +from official.vision.detection.dataloader import mode_keys as ModeKeys +from official.vision.detection.executor.detection_executor import DetectionDistributedExecutor +from official.vision.detection.modeling import factory as model_factory +from official.utils.flags import core as flags_core +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils + +hyperparams_flags.initialize_common_flags() +flags_core.define_log_steps() + +flags.DEFINE_bool( + 'enable_xla', + default=False, + help='Enable XLA for GPU') + +flags.DEFINE_string( + 'mode', + default='train', + help='Mode to run: `train`, `eval` or `train_and_eval`.') + +flags.DEFINE_string( + 'model', default='retinanet', + help='Model to run: `retinanet` or `mask_rcnn`.') + +flags.DEFINE_string('training_file_pattern', None, + 'Location of the train data.') + +flags.DEFINE_string('eval_file_pattern', None, 'Location of ther eval data') + +flags.DEFINE_string( + 'checkpoint_path', None, + 'The checkpoint path to eval. Only used in eval_once mode.') + +FLAGS = flags.FLAGS + + +def run_executor(params, + train_input_fn=None, + eval_input_fn=None, + callbacks=None, + strategy=None): + """Runs Retinanet model on distribution strategy defined by the user.""" + + if params.architecture.use_bfloat16: + policy = tf.compat.v2.keras.mixed_precision.experimental.Policy( + 'mixed_bfloat16') + tf.compat.v2.keras.mixed_precision.experimental.set_policy(policy) + + model_builder = model_factory.model_generator(params) + + if strategy is None: + strategy_config = params.strategy_config + distribution_utils.configure_cluster(strategy_config.worker_hosts, + strategy_config.task_index) + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=params.strategy_type, + num_gpus=strategy_config.num_gpus, + all_reduce_alg=strategy_config.all_reduce_alg, + num_packs=strategy_config.num_packs, + tpu_address=strategy_config.tpu) + + num_workers = int(strategy.num_replicas_in_sync + 7) // 8 + is_multi_host = (int(num_workers) >= 2) + + if FLAGS.mode == 'train': + + def _model_fn(params): + return model_builder.build_model(params, mode=ModeKeys.TRAIN) + + logging.info( + 'Train num_replicas_in_sync %d num_workers %d is_multi_host %s', + strategy.num_replicas_in_sync, num_workers, is_multi_host) + + dist_executor = DetectionDistributedExecutor( + strategy=strategy, + params=params, + model_fn=_model_fn, + loss_fn=model_builder.build_loss_fn, + is_multi_host=is_multi_host, + predict_post_process_fn=model_builder.post_processing, + trainable_variables_filter=model_builder + .make_filter_trainable_variables_fn()) + + if is_multi_host: + train_input_fn = functools.partial( + train_input_fn, + batch_size=params.train.batch_size // strategy.num_replicas_in_sync) + + return dist_executor.train( + train_input_fn=train_input_fn, + model_dir=params.model_dir, + iterations_per_loop=params.train.iterations_per_loop, + total_steps=params.train.total_steps, + init_checkpoint=model_builder.make_restore_checkpoint_fn(), + custom_callbacks=callbacks, + save_config=True) + + elif FLAGS.mode == 'eval' or FLAGS.mode == 'eval_once': + + def _model_fn(params): + return model_builder.build_model(params, mode=ModeKeys.PREDICT_WITH_GT) + + logging.info('Eval num_replicas_in_sync %d num_workers %d is_multi_host %s', + strategy.num_replicas_in_sync, num_workers, is_multi_host) + + if is_multi_host: + eval_input_fn = functools.partial( + eval_input_fn, + batch_size=params.eval.batch_size // strategy.num_replicas_in_sync) + + dist_executor = DetectionDistributedExecutor( + strategy=strategy, + params=params, + model_fn=_model_fn, + loss_fn=model_builder.build_loss_fn, + is_multi_host=is_multi_host, + predict_post_process_fn=model_builder.post_processing, + trainable_variables_filter=model_builder + .make_filter_trainable_variables_fn()) + + if FLAGS.mode == 'eval': + results = dist_executor.evaluate_from_model_dir( + model_dir=params.model_dir, + eval_input_fn=eval_input_fn, + eval_metric_fn=model_builder.eval_metrics, + eval_timeout=params.eval.eval_timeout, + min_eval_interval=params.eval.min_eval_interval, + total_steps=params.train.total_steps) + else: + # Run evaluation once for a single checkpoint. + if not FLAGS.checkpoint_path: + raise ValueError('FLAGS.checkpoint_path cannot be empty.') + checkpoint_path = FLAGS.checkpoint_path + if tf.io.gfile.isdir(checkpoint_path): + checkpoint_path = tf.train.latest_checkpoint(checkpoint_path) + summary_writer = executor.SummaryWriter(params.model_dir, 'eval') + results, _ = dist_executor.evaluate_checkpoint( + checkpoint_path=checkpoint_path, + eval_input_fn=eval_input_fn, + eval_metric_fn=model_builder.eval_metrics, + summary_writer=summary_writer) + for k, v in results.items(): + logging.info('Final eval metric %s: %f', k, v) + return results + else: + raise ValueError('Mode not found: %s.' % FLAGS.mode) + + +def run(callbacks=None): + keras_utils.set_session_config(enable_xla=FLAGS.enable_xla) + + params = config_factory.config_generator(FLAGS.model) + + params = params_dict.override_params_dict( + params, FLAGS.config_file, is_strict=True) + + params = params_dict.override_params_dict( + params, FLAGS.params_override, is_strict=True) + params.override( + { + 'strategy_type': FLAGS.strategy_type, + 'model_dir': FLAGS.model_dir, + 'strategy_config': executor.strategy_flags_dict(), + }, + is_strict=False) + params.validate() + params.lock() + pp = pprint.PrettyPrinter() + params_str = pp.pformat(params.as_dict()) + logging.info('Model Parameters: {}'.format(params_str)) + + train_input_fn = None + eval_input_fn = None + training_file_pattern = FLAGS.training_file_pattern or params.train.train_file_pattern + eval_file_pattern = FLAGS.eval_file_pattern or params.eval.eval_file_pattern + if not training_file_pattern and not eval_file_pattern: + raise ValueError('Must provide at least one of training_file_pattern and ' + 'eval_file_pattern.') + + if training_file_pattern: + # Use global batch size for single host. + train_input_fn = input_reader.InputFn( + file_pattern=training_file_pattern, + params=params, + mode=input_reader.ModeKeys.TRAIN, + batch_size=params.train.batch_size) + + if eval_file_pattern: + eval_input_fn = input_reader.InputFn( + file_pattern=eval_file_pattern, + params=params, + mode=input_reader.ModeKeys.PREDICT_WITH_GT, + batch_size=params.eval.batch_size, + num_examples=params.eval.eval_samples) + + if callbacks is None: + callbacks = [] + + if FLAGS.log_steps: + callbacks.append( + keras_utils.TimeHistory( + batch_size=params.train.batch_size, + log_steps=FLAGS.log_steps, + )) + + return run_executor( + params, + train_input_fn=train_input_fn, + eval_input_fn=eval_input_fn, + callbacks=callbacks) + + +def main(argv): + del argv # Unused. + + run() + + +if __name__ == '__main__': + tf.config.set_soft_device_placement(True) + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/factory.py new file mode 100644 index 0000000..71925af --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/factory.py @@ -0,0 +1,136 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Model architecture factory.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from official.vision.detection.modeling.architecture import fpn +from official.vision.detection.modeling.architecture import heads +from official.vision.detection.modeling.architecture import identity +from official.vision.detection.modeling.architecture import nn_ops +from official.vision.detection.modeling.architecture import resnet + + +def batch_norm_relu_generator(params): + + def _batch_norm_op(**kwargs): + return nn_ops.BatchNormRelu( + momentum=params.batch_norm_momentum, + epsilon=params.batch_norm_epsilon, + trainable=params.batch_norm_trainable, + **kwargs) + + return _batch_norm_op + + +def backbone_generator(params): + """Generator function for various backbone models.""" + if params.architecture.backbone == 'resnet': + resnet_params = params.resnet + backbone_fn = resnet.Resnet( + resnet_depth=resnet_params.resnet_depth, + batch_norm_relu=batch_norm_relu_generator(resnet_params.batch_norm)) + else: + raise ValueError('Backbone model %s is not supported.' % + params.architecture.backbone) + + return backbone_fn + + +def multilevel_features_generator(params): + """Generator function for various FPN models.""" + if params.architecture.multilevel_features == 'fpn': + fpn_params = params.fpn + fpn_fn = fpn.Fpn( + min_level=fpn_params.min_level, + max_level=fpn_params.max_level, + fpn_feat_dims=fpn_params.fpn_feat_dims, + use_separable_conv=fpn_params.use_separable_conv, + use_batch_norm=fpn_params.use_batch_norm, + batch_norm_relu=batch_norm_relu_generator(fpn_params.batch_norm)) + elif params.architecture.multilevel_features == 'identity': + fpn_fn = identity.Identity() + else: + raise ValueError('The multi-level feature model %s is not supported.' + % params.architecture.multilevel_features) + return fpn_fn + + +def retinanet_head_generator(params): + """Generator function for RetinaNet head architecture.""" + return heads.RetinanetHead( + params.min_level, + params.max_level, + params.num_classes, + params.anchors_per_location, + params.retinanet_head_num_convs, + params.retinanet_head_num_filters, + params.use_separable_conv, + batch_norm_relu=batch_norm_relu_generator(params.batch_norm)) + + +def rpn_head_generator(params): + """Generator function for RPN head architecture.""" + return heads.RpnHead(params.min_level, + params.max_level, + params.anchors_per_location, + params.num_convs, + params.num_filters, + params.use_separable_conv, + params.use_batch_norm, + batch_norm_relu=batch_norm_relu_generator( + params.batch_norm)) + + +def fast_rcnn_head_generator(params): + """Generator function for Fast R-CNN head architecture.""" + return heads.FastrcnnHead(params.num_classes, + params.num_convs, + params.num_filters, + params.use_separable_conv, + params.num_fcs, + params.fc_dims, + params.use_batch_norm, + batch_norm_relu=batch_norm_relu_generator( + params.batch_norm)) + + +def mask_rcnn_head_generator(params): + """Generator function for Mask R-CNN head architecture.""" + return heads.MaskrcnnHead(params.num_classes, + params.mask_target_size, + params.num_convs, + params.num_filters, + params.use_separable_conv, + params.use_batch_norm, + batch_norm_relu=batch_norm_relu_generator( + params.batch_norm)) + + +def shapeprior_head_generator(params): + """Generator function for Shapemask head architecture.""" + raise NotImplementedError('Unimplemented') + + +def coarsemask_head_generator(params): + """Generator function for Shapemask head architecture.""" + raise NotImplementedError('Unimplemented') + + +def finemask_head_generator(params): + """Generator function for Shapemask head architecture.""" + raise NotImplementedError('Unimplemented') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/fpn.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/fpn.py new file mode 100644 index 0000000..d74f541 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/fpn.py @@ -0,0 +1,143 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Feature Pyramid Networks. + +Feature Pyramid Networks were proposed in: +[1] Tsung-Yi Lin, Piotr Dollar, Ross Girshick, Kaiming He, Bharath Hariharan, + , and Serge Belongie + Feature Pyramid Networks for Object Detection. CVPR 2017. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools + +import tensorflow.compat.v2 as tf + +from tensorflow.python.keras import backend +from official.vision.detection.modeling.architecture import nn_ops +from official.vision.detection.ops import spatial_transform_ops + + +class Fpn(object): + """Feature pyramid networks.""" + + def __init__(self, + min_level=3, + max_level=7, + fpn_feat_dims=256, + use_separable_conv=False, + use_batch_norm=True, + batch_norm_relu=nn_ops.BatchNormRelu): + """FPN initialization function. + + Args: + min_level: `int` minimum level in FPN output feature maps. + max_level: `int` maximum level in FPN output feature maps. + fpn_feat_dims: `int` number of filters in FPN layers. + use_separable_conv: `bool`, if True use separable convolution for + convolution in FPN layers. + use_batch_norm: 'bool', indicating whether batchnorm layers are added. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._min_level = min_level + self._max_level = max_level + self._fpn_feat_dims = fpn_feat_dims + if use_separable_conv: + self._conv2d_op = functools.partial( + tf.keras.layers.SeparableConv2D, depth_multiplier=1) + else: + self._conv2d_op = tf.keras.layers.Conv2D + self._use_batch_norm = use_batch_norm + self._batch_norm_relu = batch_norm_relu + + self._batch_norm_relus = {} + self._lateral_conv2d_op = {} + self._post_hoc_conv2d_op = {} + self._coarse_conv2d_op = {} + for level in range(self._min_level, self._max_level + 1): + if self._use_batch_norm: + self._batch_norm_relus[level] = batch_norm_relu( + relu=False, name='p%d-bn' % level) + self._lateral_conv2d_op[level] = self._conv2d_op( + filters=self._fpn_feat_dims, + kernel_size=(1, 1), + padding='same', + name='l%d' % level) + self._post_hoc_conv2d_op[level] = self._conv2d_op( + filters=self._fpn_feat_dims, + strides=(1, 1), + kernel_size=(3, 3), + padding='same', + name='post_hoc_d%d' % level) + self._coarse_conv2d_op[level] = self._conv2d_op( + filters=self._fpn_feat_dims, + strides=(2, 2), + kernel_size=(3, 3), + padding='same', + name='p%d' % level) + + def __call__(self, multilevel_features, is_training=None): + """Returns the FPN features for a given multilevel features. + + Args: + multilevel_features: a `dict` containing `int` keys for continuous feature + levels, e.g., [2, 3, 4, 5]. The values are corresponding features with + shape [batch_size, height_l, width_l, num_filters]. + is_training: `bool` if True, the model is in training mode. + + Returns: + a `dict` containing `int` keys for continuous feature levels + [min_level, min_level + 1, ..., max_level]. The values are corresponding + FPN features with shape [batch_size, height_l, width_l, fpn_feat_dims]. + """ + input_levels = list(multilevel_features.keys()) + if min(input_levels) > self._min_level: + raise ValueError( + 'The minimum backbone level %d should be '%(min(input_levels)) + + 'less or equal to FPN minimum level %d.:'%(self._min_level)) + backbone_max_level = min(max(input_levels), self._max_level) + with backend.get_graph().as_default(), tf.name_scope('fpn'): + # Adds lateral connections. + feats_lateral = {} + for level in range(self._min_level, backbone_max_level + 1): + feats_lateral[level] = self._lateral_conv2d_op[level]( + multilevel_features[level]) + + # Adds top-down path. + feats = {backbone_max_level: feats_lateral[backbone_max_level]} + for level in range(backbone_max_level - 1, self._min_level - 1, -1): + feats[level] = spatial_transform_ops.nearest_upsampling( + feats[level + 1], 2) + feats_lateral[level] + + # Adds post-hoc 3x3 convolution kernel. + for level in range(self._min_level, backbone_max_level + 1): + feats[level] = self._post_hoc_conv2d_op[level](feats[level]) + + # Adds coarser FPN levels introduced for RetinaNet. + for level in range(backbone_max_level + 1, self._max_level + 1): + feats_in = feats[level - 1] + if level > backbone_max_level + 1: + feats_in = tf.nn.relu(feats_in) + feats[level] = self._coarse_conv2d_op[level](feats_in) + if self._use_batch_norm: + # Adds batch_norm layer. + for level in range(self._min_level, self._max_level + 1): + feats[level] = self._batch_norm_relus[level]( + feats[level], is_training=is_training) + return feats diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/heads.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/heads.py new file mode 100644 index 0000000..9b6fc67 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/heads.py @@ -0,0 +1,1108 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Classes to build various prediction heads in all supported models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import pickle + +from absl import logging +import numpy as np +import tensorflow.compat.v2 as tf +from tensorflow.python.keras import backend +from official.vision.detection.modeling.architecture import nn_ops +from official.vision.detection.ops import spatial_transform_ops + + +class RpnHead(tf.keras.layers.Layer): + """Region Proposal Network head.""" + + def __init__(self, + min_level, + max_level, + anchors_per_location, + num_convs=2, + num_filters=256, + use_separable_conv=False, + use_batch_norm=True, + batch_norm_relu=nn_ops.BatchNormRelu): + """Initialize params to build Region Proposal Network head. + + Args: + min_level: `int` number of minimum feature level. + max_level: `int` number of maximum feature level. + anchors_per_location: `int` number of number of anchors per pixel + location. + num_convs: `int` number that represents the number of the intermediate + conv layers before the prediction. + num_filters: `int` number that represents the number of filters of the + intermediate conv layers. + use_separable_conv: `bool`, indicating whether the separable conv layers + is used. + use_batch_norm: 'bool', indicating whether batchnorm layers are added. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._min_level = min_level + self._max_level = max_level + self._anchors_per_location = anchors_per_location + self._use_batch_norm = use_batch_norm + + if use_separable_conv: + self._conv2d_op = functools.partial( + tf.keras.layers.SeparableConv2D, + depth_multiplier=1, + bias_initializer=tf.zeros_initializer()) + else: + self._conv2d_op = functools.partial( + tf.keras.layers.Conv2D, + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01), + bias_initializer=tf.zeros_initializer()) + + self._rpn_conv = self._conv2d_op( + num_filters, + kernel_size=(3, 3), + strides=(1, 1), + activation=(None if self._use_batch_norm else tf.nn.relu), + padding='same', + name='rpn') + self._rpn_class_conv = self._conv2d_op( + anchors_per_location, + kernel_size=(1, 1), + strides=(1, 1), + padding='valid', + name='rpn-class') + self._rpn_box_conv = self._conv2d_op( + 4 * anchors_per_location, + kernel_size=(1, 1), + strides=(1, 1), + padding='valid', + name='rpn-box') + + self._batch_norm_relus = {} + if self._use_batch_norm: + for level in range(self._min_level, self._max_level + 1): + self._batch_norm_relus[level] = batch_norm_relu(name='rpn-l%d-bn' % + level) + + def _shared_rpn_heads(self, features, anchors_per_location, level, + is_training): + """Shared RPN heads.""" + features = self._rpn_conv(features) + if self._use_batch_norm: + # The batch normalization layers are not shared between levels. + features = self._batch_norm_relus[level]( + features, is_training=is_training) + # Proposal classification scores + scores = self._rpn_class_conv(features) + # Proposal bbox regression deltas + bboxes = self._rpn_box_conv(features) + + return scores, bboxes + + def __call__(self, features, is_training=None): + + scores_outputs = {} + box_outputs = {} + + with backend.get_graph().as_default(), tf.name_scope('rpn_head'): + for level in range(self._min_level, self._max_level + 1): + scores_output, box_output = self._shared_rpn_heads( + features[level], self._anchors_per_location, level, is_training) + scores_outputs[level] = scores_output + box_outputs[level] = box_output + return scores_outputs, box_outputs + + +class FastrcnnHead(tf.keras.layers.Layer): + """Fast R-CNN box head.""" + + def __init__(self, + num_classes, + num_convs=0, + num_filters=256, + use_separable_conv=False, + num_fcs=2, + fc_dims=1024, + use_batch_norm=True, + batch_norm_relu=nn_ops.BatchNormRelu): + """Initialize params to build Fast R-CNN box head. + + Args: + num_classes: a integer for the number of classes. + num_convs: `int` number that represents the number of the intermediate + conv layers before the FC layers. + num_filters: `int` number that represents the number of filters of the + intermediate conv layers. + use_separable_conv: `bool`, indicating whether the separable conv layers + is used. + num_fcs: `int` number that represents the number of FC layers before the + predictions. + fc_dims: `int` number that represents the number of dimension of the FC + layers. + use_batch_norm: 'bool', indicating whether batchnorm layers are added. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._num_classes = num_classes + + self._num_convs = num_convs + self._num_filters = num_filters + if use_separable_conv: + self._conv2d_op = functools.partial( + tf.keras.layers.SeparableConv2D, + depth_multiplier=1, + bias_initializer=tf.zeros_initializer()) + else: + self._conv2d_op = functools.partial( + tf.keras.layers.Conv2D, + kernel_initializer=tf.keras.initializers.VarianceScaling( + scale=2, mode='fan_out', distribution='untruncated_normal'), + bias_initializer=tf.zeros_initializer()) + + self._num_fcs = num_fcs + self._fc_dims = fc_dims + + self._use_batch_norm = use_batch_norm + self._batch_norm_relu = batch_norm_relu + + self._conv_ops = [] + self._conv_bn_ops = [] + for i in range(self._num_convs): + self._conv_ops.append( + self._conv2d_op( + self._num_filters, + kernel_size=(3, 3), + strides=(1, 1), + padding='same', + dilation_rate=(1, 1), + activation=(None if self._use_batch_norm else tf.nn.relu), + name='conv_{}'.format(i))) + if self._use_batch_norm: + self._conv_bn_ops.append(self._batch_norm_relu()) + + self._fc_ops = [] + self._fc_bn_ops = [] + for i in range(self._num_fcs): + self._fc_ops.append( + tf.keras.layers.Dense( + units=self._fc_dims, + activation=(None if self._use_batch_norm else tf.nn.relu), + name='fc{}'.format(i))) + if self._use_batch_norm: + self._fc_bn_ops.append(self._batch_norm_relu(fused=False)) + + self._class_predict = tf.keras.layers.Dense( + self._num_classes, + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01), + bias_initializer=tf.zeros_initializer(), + name='class-predict') + self._box_predict = tf.keras.layers.Dense( + self._num_classes * 4, + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.001), + bias_initializer=tf.zeros_initializer(), + name='box-predict') + + def __call__(self, roi_features, is_training=None): + """Box and class branches for the Mask-RCNN model. + + Args: + roi_features: A ROI feature tensor of shape + [batch_size, num_rois, height_l, width_l, num_filters]. + is_training: `boolean`, if True if model is in training mode. + + Returns: + class_outputs: a tensor with a shape of + [batch_size, num_rois, num_classes], representing the class predictions. + box_outputs: a tensor with a shape of + [batch_size, num_rois, num_classes * 4], representing the box + predictions. + """ + + with backend.get_graph().as_default(), tf.name_scope('fast_rcnn_head'): + # reshape inputs beofre FC. + _, num_rois, height, width, filters = roi_features.get_shape().as_list() + + net = tf.reshape(roi_features, [-1, height, width, filters]) + for i in range(self._num_convs): + net = self._conv_ops[i](net) + if self._use_batch_norm: + net = self._conv_bn_ops[i](net, is_training=is_training) + + filters = self._num_filters if self._num_convs > 0 else filters + net = tf.reshape(net, [-1, num_rois, height * width * filters]) + + for i in range(self._num_fcs): + net = self._fc_ops[i](net) + if self._use_batch_norm: + net = self._fc_bn_ops[i](net, is_training=is_training) + + class_outputs = self._class_predict(net) + box_outputs = self._box_predict(net) + return class_outputs, box_outputs + + +class MaskrcnnHead(tf.keras.layers.Layer): + """Mask R-CNN head.""" + + def __init__(self, + num_classes, + mask_target_size, + num_convs=4, + num_filters=256, + use_separable_conv=False, + use_batch_norm=True, + batch_norm_relu=nn_ops.BatchNormRelu): + """Initialize params to build Fast R-CNN head. + + Args: + num_classes: a integer for the number of classes. + mask_target_size: a integer that is the resolution of masks. + num_convs: `int` number that represents the number of the intermediate + conv layers before the prediction. + num_filters: `int` number that represents the number of filters of the + intermediate conv layers. + use_separable_conv: `bool`, indicating whether the separable conv layers + is used. + use_batch_norm: 'bool', indicating whether batchnorm layers are added. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._num_classes = num_classes + self._mask_target_size = mask_target_size + + self._num_convs = num_convs + self._num_filters = num_filters + if use_separable_conv: + self._conv2d_op = functools.partial( + tf.keras.layers.SeparableConv2D, + depth_multiplier=1, + bias_initializer=tf.zeros_initializer()) + else: + self._conv2d_op = functools.partial( + tf.keras.layers.Conv2D, + kernel_initializer=tf.keras.initializers.VarianceScaling( + scale=2, mode='fan_out', distribution='untruncated_normal'), + bias_initializer=tf.zeros_initializer()) + + self._use_batch_norm = use_batch_norm + self._batch_norm_relu = batch_norm_relu + self._conv2d_ops = [] + for i in range(self._num_convs): + self._conv2d_ops.append( + self._conv2d_op( + self._num_filters, + kernel_size=(3, 3), + strides=(1, 1), + padding='same', + dilation_rate=(1, 1), + activation=(None if self._use_batch_norm else tf.nn.relu), + name='mask-conv-l%d' % i)) + self._mask_conv_transpose = tf.keras.layers.Conv2DTranspose( + self._num_filters, + kernel_size=(2, 2), + strides=(2, 2), + padding='valid', + activation=(None if self._use_batch_norm else tf.nn.relu), + kernel_initializer=tf.keras.initializers.VarianceScaling( + scale=2, mode='fan_out', distribution='untruncated_normal'), + bias_initializer=tf.zeros_initializer(), + name='conv5-mask') + + def __call__(self, roi_features, class_indices, is_training=None): + """Mask branch for the Mask-RCNN model. + + Args: + roi_features: A ROI feature tensor of shape + [batch_size, num_rois, height_l, width_l, num_filters]. + class_indices: a Tensor of shape [batch_size, num_rois], indicating + which class the ROI is. + is_training: `boolean`, if True if model is in training mode. + + Returns: + mask_outputs: a tensor with a shape of + [batch_size, num_masks, mask_height, mask_width, num_classes], + representing the mask predictions. + fg_gather_indices: a tensor with a shape of [batch_size, num_masks, 2], + representing the fg mask targets. + Raises: + ValueError: If boxes is not a rank-3 tensor or the last dimension of + boxes is not 4. + """ + + with backend.get_graph().as_default(): + with tf.name_scope('mask_head'): + _, num_rois, height, width, filters = roi_features.get_shape().as_list() + net = tf.reshape(roi_features, [-1, height, width, filters]) + + for i in range(self._num_convs): + net = self._conv2d_ops[i](net) + if self._use_batch_norm: + net = self._batch_norm_relu()(net, is_training=is_training) + + net = self._mask_conv_transpose(net) + if self._use_batch_norm: + net = self._batch_norm_relu()(net, is_training=is_training) + + mask_outputs = self._conv2d_op( + self._num_classes, + kernel_size=(1, 1), + strides=(1, 1), + padding='valid', + name='mask_fcn_logits')( + net) + mask_outputs = tf.reshape(mask_outputs, [ + -1, num_rois, self._mask_target_size, self._mask_target_size, + self._num_classes + ]) + + with tf.name_scope('masks_post_processing'): + # TODO(pengchong): Figure out the way not to use the static inferred + # batch size. + batch_size, num_masks = class_indices.get_shape().as_list() + mask_outputs = tf.transpose(a=mask_outputs, perm=[0, 1, 4, 2, 3]) + # Contructs indices for gather. + batch_indices = tf.tile( + tf.expand_dims(tf.range(batch_size), axis=1), [1, num_masks]) + mask_indices = tf.tile( + tf.expand_dims(tf.range(num_masks), axis=0), [batch_size, 1]) + gather_indices = tf.stack( + [batch_indices, mask_indices, class_indices], axis=2) + mask_outputs = tf.gather_nd(mask_outputs, gather_indices) + return mask_outputs + + +class RetinanetHead(object): + """RetinaNet head.""" + + def __init__(self, + min_level, + max_level, + num_classes, + anchors_per_location, + num_convs=4, + num_filters=256, + use_separable_conv=False, + batch_norm_relu=nn_ops.BatchNormRelu): + """Initialize params to build RetinaNet head. + + Args: + min_level: `int` number of minimum feature level. + max_level: `int` number of maximum feature level. + num_classes: `int` number of classification categories. + anchors_per_location: `int` number of anchors per pixel location. + num_convs: `int` number of stacked convolution before the last prediction + layer. + num_filters: `int` number of filters used in the head architecture. + use_separable_conv: `bool` to indicate whether to use separable + convoluation. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._min_level = min_level + self._max_level = max_level + + self._num_classes = num_classes + self._anchors_per_location = anchors_per_location + + self._num_convs = num_convs + self._num_filters = num_filters + self._use_separable_conv = use_separable_conv + + with tf.name_scope('class_net') as scope_name: + self._class_name_scope = tf.name_scope(scope_name) + with tf.name_scope('box_net') as scope_name: + self._box_name_scope = tf.name_scope(scope_name) + self._build_class_net_layers(batch_norm_relu) + self._build_box_net_layers(batch_norm_relu) + + def _class_net_batch_norm_name(self, i, level): + return 'class-%d-%d' % (i, level) + + def _box_net_batch_norm_name(self, i, level): + return 'box-%d-%d' % (i, level) + + def _build_class_net_layers(self, batch_norm_relu): + """Build re-usable layers for class prediction network.""" + if self._use_separable_conv: + self._class_predict = tf.keras.layers.SeparableConv2D( + self._num_classes * self._anchors_per_location, + kernel_size=(3, 3), + bias_initializer=tf.constant_initializer(-np.log((1 - 0.01) / 0.01)), + padding='same', + name='class-predict') + else: + self._class_predict = tf.keras.layers.Conv2D( + self._num_classes * self._anchors_per_location, + kernel_size=(3, 3), + bias_initializer=tf.constant_initializer(-np.log((1 - 0.01) / 0.01)), + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=1e-5), + padding='same', + name='class-predict') + self._class_conv = [] + self._class_batch_norm_relu = {} + for i in range(self._num_convs): + if self._use_separable_conv: + self._class_conv.append( + tf.keras.layers.SeparableConv2D( + self._num_filters, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + activation=None, + padding='same', + name='class-' + str(i))) + else: + self._class_conv.append( + tf.keras.layers.Conv2D( + self._num_filters, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal( + stddev=0.01), + activation=None, + padding='same', + name='class-' + str(i))) + for level in range(self._min_level, self._max_level + 1): + name = self._class_net_batch_norm_name(i, level) + self._class_batch_norm_relu[name] = batch_norm_relu(name=name) + + def _build_box_net_layers(self, batch_norm_relu): + """Build re-usable layers for box prediction network.""" + if self._use_separable_conv: + self._box_predict = tf.keras.layers.SeparableConv2D( + 4 * self._anchors_per_location, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + padding='same', + name='box-predict') + else: + self._box_predict = tf.keras.layers.Conv2D( + 4 * self._anchors_per_location, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=1e-5), + padding='same', + name='box-predict') + self._box_conv = [] + self._box_batch_norm_relu = {} + for i in range(self._num_convs): + if self._use_separable_conv: + self._box_conv.append( + tf.keras.layers.SeparableConv2D( + self._num_filters, + kernel_size=(3, 3), + activation=None, + bias_initializer=tf.zeros_initializer(), + padding='same', + name='box-' + str(i))) + else: + self._box_conv.append( + tf.keras.layers.Conv2D( + self._num_filters, + kernel_size=(3, 3), + activation=None, + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal( + stddev=0.01), + padding='same', + name='box-' + str(i))) + for level in range(self._min_level, self._max_level + 1): + name = self._box_net_batch_norm_name(i, level) + self._box_batch_norm_relu[name] = batch_norm_relu(name=name) + + def __call__(self, fpn_features, is_training=None): + """Returns outputs of RetinaNet head.""" + class_outputs = {} + box_outputs = {} + with backend.get_graph().as_default(), tf.name_scope('retinanet'): + for level in range(self._min_level, self._max_level + 1): + features = fpn_features[level] + + class_outputs[level] = self.class_net( + features, level, is_training=is_training) + box_outputs[level] = self.box_net( + features, level, is_training=is_training) + return class_outputs, box_outputs + + def class_net(self, features, level, is_training): + """Class prediction network for RetinaNet.""" + with self._class_name_scope: + for i in range(self._num_convs): + features = self._class_conv[i](features) + # The convolution layers in the class net are shared among all levels, but + # each level has its batch normlization to capture the statistical + # difference among different levels. + name = self._class_net_batch_norm_name(i, level) + features = self._class_batch_norm_relu[name]( + features, is_training=is_training) + + classes = self._class_predict(features) + return classes + + def box_net(self, features, level, is_training=None): + """Box regression network for RetinaNet.""" + with self._box_name_scope: + for i in range(self._num_convs): + features = self._box_conv[i](features) + # The convolution layers in the box net are shared among all levels, but + # each level has its batch normlization to capture the statistical + # difference among different levels. + name = self._box_net_batch_norm_name(i, level) + features = self._box_batch_norm_relu[name]( + features, is_training=is_training) + + boxes = self._box_predict(features) + return boxes + + +# TODO(yeqing): Refactor this class when it is ready for var_scope reuse. +class ShapemaskPriorHead(object): + """ShapeMask Prior head.""" + + def __init__(self, + num_classes, + num_downsample_channels, + mask_crop_size, + use_category_for_mask, + num_of_instances, + min_mask_level, + max_mask_level, + num_clusters, + temperature, + shape_prior_path=None): + """Initialize params to build RetinaNet head. + + Args: + num_classes: Number of output classes. + num_downsample_channels: number of channels in mask branch. + mask_crop_size: feature crop size. + use_category_for_mask: use class information in mask branch. + num_of_instances: number of instances to sample in training time. + min_mask_level: minimum FPN level to crop mask feature from. + max_mask_level: maximum FPN level to crop mask feature from. + num_clusters: number of clusters to use in K-Means. + temperature: the temperature for shape prior learning. + shape_prior_path: the path to load shape priors. + """ + self._mask_num_classes = num_classes + self._num_downsample_channels = num_downsample_channels + self._mask_crop_size = mask_crop_size + self._use_category_for_mask = use_category_for_mask + self._num_of_instances = num_of_instances + self._min_mask_level = min_mask_level + self._max_mask_level = max_mask_level + self._num_clusters = num_clusters + self._temperature = temperature + self._shape_prior_path = shape_prior_path + + def __call__(self, + fpn_features, + boxes, + outer_boxes, + classes, + is_training=None): + """Generate the detection priors from the box detections and FPN features. + + This corresponds to the Fig. 4 of the ShapeMask paper at + https://arxiv.org/pdf/1904.03239.pdf + + Args: + fpn_features: a dictionary of FPN features. + boxes: a float tensor of shape [batch_size, num_instances, 4] + representing the tight gt boxes from dataloader/detection. + outer_boxes: a float tensor of shape [batch_size, num_instances, 4] + representing the loose gt boxes from dataloader/detection. + classes: a int Tensor of shape [batch_size, num_instances] + of instance classes. + is_training: training mode or not. + + Returns: + crop_features: a float Tensor of shape [batch_size * num_instances, + mask_crop_size, mask_crop_size, num_downsample_channels]. This is the + instance feature crop. + detection_priors: A float Tensor of shape [batch_size * num_instances, + mask_size, mask_size, 1]. + """ + with backend.get_graph().as_default(): + # loads class specific or agnostic shape priors + if self._shape_prior_path: + if self._use_category_for_mask: + fid = tf.io.gfile.GFile(self._shape_prior_path, 'rb') + # The encoding='bytes' options is for incompatibility between python2 + # and python3 pickle. + class_tups = pickle.load(fid, encoding='bytes') + max_class_id = class_tups[-1][0] + 1 + class_masks = np.zeros((max_class_id, self._num_clusters, + self._mask_crop_size, self._mask_crop_size), + dtype=np.float32) + for cls_id, _, cls_mask in class_tups: + assert cls_mask.shape == (self._num_clusters, + self._mask_crop_size**2) + class_masks[cls_id] = cls_mask.reshape(self._num_clusters, + self._mask_crop_size, + self._mask_crop_size) + + self.class_priors = tf.convert_to_tensor( + value=class_masks, dtype=tf.float32) + else: + npy_path = tf.io.gfile.GFile(self._shape_prior_path) + class_np_masks = np.load(npy_path) + assert class_np_masks.shape == ( + self._num_clusters, self._mask_crop_size, + self._mask_crop_size), 'Invalid priors!!!' + self.class_priors = tf.convert_to_tensor( + value=class_np_masks, dtype=tf.float32) + else: + self.class_priors = tf.zeros( + [self._num_clusters, self._mask_crop_size, self._mask_crop_size], + tf.float32) + + batch_size = boxes.get_shape()[0] + min_level_shape = fpn_features[self._min_mask_level].get_shape().as_list() + self._max_feature_size = min_level_shape[1] + detection_prior_levels = self._compute_box_levels(boxes) + level_outer_boxes = outer_boxes / tf.pow( + 2., tf.expand_dims(detection_prior_levels, -1)) + detection_prior_levels = tf.cast(detection_prior_levels, tf.int32) + uniform_priors = spatial_transform_ops.crop_mask_in_target_box( + tf.ones([ + batch_size, self._num_of_instances, self._mask_crop_size, + self._mask_crop_size + ], tf.float32), boxes, outer_boxes, self._mask_crop_size) + + # Prepare crop features. + multi_level_features = self._get_multilevel_features(fpn_features) + crop_features = spatial_transform_ops.single_level_feature_crop( + multi_level_features, level_outer_boxes, detection_prior_levels, + self._min_mask_level, self._mask_crop_size) + + # Predict and fuse shape priors. + shape_weights = self._classify_and_fuse_detection_priors( + uniform_priors, classes, crop_features) + fused_shape_priors = self._fuse_priors(shape_weights, classes) + fused_shape_priors = tf.reshape(fused_shape_priors, [ + batch_size, self._num_of_instances, self._mask_crop_size, + self._mask_crop_size + ]) + predicted_detection_priors = spatial_transform_ops.crop_mask_in_target_box( + fused_shape_priors, boxes, outer_boxes, self._mask_crop_size) + predicted_detection_priors = tf.reshape( + predicted_detection_priors, + [-1, self._mask_crop_size, self._mask_crop_size, 1]) + + return crop_features, predicted_detection_priors + + def _get_multilevel_features(self, fpn_features): + """Get multilevel features from FPN feature dictionary into one tensor. + + Args: + fpn_features: a dictionary of FPN features. + + Returns: + features: a float tensor of shape [batch_size, num_levels, + max_feature_size, max_feature_size, num_downsample_channels]. + """ + # TODO(yeqing): Recover reuse=tf.AUTO_REUSE logic. + with tf.name_scope('masknet'): + mask_feats = {} + # Reduce the feature dimension at each FPN level by convolution. + for feat_level in range(self._min_mask_level, self._max_mask_level + 1): + mask_feats[feat_level] = tf.keras.layers.Conv2D( + self._num_downsample_channels, + kernel_size=(1, 1), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01), + padding='same', + name='mask-downsample')( + fpn_features[feat_level]) + + # Concat features through padding to the max size. + features = [mask_feats[self._min_mask_level]] + for feat_level in range(self._min_mask_level + 1, + self._max_mask_level + 1): + features.append(tf.image.pad_to_bounding_box( + mask_feats[feat_level], 0, 0, + self._max_feature_size, self._max_feature_size)) + + features = tf.stack(features, axis=1) + + return features + + def _compute_box_levels(self, boxes): + """Compute the box FPN levels. + + Args: + boxes: a float tensor of shape [batch_size, num_instances, 4]. + + Returns: + levels: a int tensor of shape [batch_size, num_instances]. + """ + object_sizes = tf.stack([ + boxes[:, :, 2] - boxes[:, :, 0], + boxes[:, :, 3] - boxes[:, :, 1], + ], axis=2) + object_sizes = tf.reduce_max(input_tensor=object_sizes, axis=2) + ratios = object_sizes / self._mask_crop_size + levels = tf.math.ceil(tf.math.log(ratios) / tf.math.log(2.)) + levels = tf.maximum(tf.minimum(levels, self._max_mask_level), + self._min_mask_level) + return levels + + def _classify_and_fuse_detection_priors(self, uniform_priors, + detection_prior_classes, + crop_features): + """Classify the uniform prior by predicting the shape modes. + + Classify the object crop features into K modes of the clusters for each + category. + + Args: + uniform_priors: A float Tensor of shape [batch_size, num_instances, + mask_size, mask_size] representing the uniform detection priors. + detection_prior_classes: A int Tensor of shape [batch_size, num_instances] + of detection class ids. + crop_features: A float Tensor of shape [batch_size * num_instances, + mask_size, mask_size, num_channels]. + + Returns: + shape_weights: A float Tensor of shape + [batch_size * num_instances, num_clusters] representing the classifier + output probability over all possible shapes. + """ + location_detection_priors = tf.reshape( + uniform_priors, [-1, self._mask_crop_size, self._mask_crop_size, 1]) + # Generate image embedding to shape. + fused_shape_features = crop_features * location_detection_priors + + shape_embedding = tf.reduce_mean( + input_tensor=fused_shape_features, axis=(1, 2)) + if not self._use_category_for_mask: + # TODO(weicheng) use custom op for performance + shape_logits = tf.keras.layers.Dense( + self._num_clusters, + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01))( + shape_embedding) + shape_logits = tf.reshape(shape_logits, + [-1, self._num_clusters]) / self._temperature + shape_weights = tf.nn.softmax(shape_logits, name='shape_prior_weights') + else: + shape_logits = tf.keras.layers.Dense( + self._mask_num_classes * self._num_clusters, + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01))( + shape_embedding) + shape_logits = tf.reshape( + shape_logits, [-1, self._mask_num_classes, self._num_clusters]) + training_classes = tf.reshape(detection_prior_classes, [-1]) + class_idx = tf.stack( + [tf.range(tf.size(input=training_classes)), training_classes - 1], + axis=1) + shape_logits = tf.gather_nd(shape_logits, class_idx) / self._temperature + shape_weights = tf.nn.softmax(shape_logits, name='shape_prior_weights') + + return shape_weights + + def _fuse_priors(self, shape_weights, detection_prior_classes): + """Fuse shape priors by the predicted shape probability. + + Args: + shape_weights: A float Tensor of shape [batch_size * num_instances, + num_clusters] of predicted shape probability distribution. + detection_prior_classes: A int Tensor of shape [batch_size, num_instances] + of detection class ids. + + Returns: + detection_priors: A float Tensor of shape [batch_size * num_instances, + mask_size, mask_size, 1]. + """ + if self._use_category_for_mask: + object_class_priors = tf.gather( + self.class_priors, detection_prior_classes) + else: + num_batch_instances = shape_weights.get_shape()[0] + object_class_priors = tf.tile( + tf.expand_dims(self.class_priors, 0), + [num_batch_instances, 1, 1, 1]) + + vector_class_priors = tf.reshape( + object_class_priors, + [-1, self._num_clusters, + self._mask_crop_size * self._mask_crop_size]) + detection_priors = tf.matmul( + tf.expand_dims(shape_weights, 1), vector_class_priors)[:, 0, :] + detection_priors = tf.reshape( + detection_priors, [-1, self._mask_crop_size, self._mask_crop_size, 1]) + return detection_priors + + +class ShapemaskCoarsemaskHead(object): + """ShapemaskCoarsemaskHead head.""" + + def __init__(self, + num_classes, + num_downsample_channels, + mask_crop_size, + use_category_for_mask, + num_convs): + """Initialize params to build ShapeMask coarse and fine prediction head. + + Args: + num_classes: `int` number of mask classification categories. + num_downsample_channels: `int` number of filters at mask head. + mask_crop_size: feature crop size. + use_category_for_mask: use class information in mask branch. + num_convs: `int` number of stacked convolution before the last prediction + layer. + """ + self._mask_num_classes = num_classes + self._num_downsample_channels = num_downsample_channels + self._mask_crop_size = mask_crop_size + self._use_category_for_mask = use_category_for_mask + self._num_convs = num_convs + if not use_category_for_mask: + assert num_classes == 1 + + def __call__(self, + crop_features, + detection_priors, + inst_classes, + is_training=None): + """Generate instance masks from FPN features and detection priors. + + This corresponds to the Fig. 5-6 of the ShapeMask paper at + https://arxiv.org/pdf/1904.03239.pdf + + Args: + crop_features: a float Tensor of shape [batch_size * num_instances, + mask_crop_size, mask_crop_size, num_downsample_channels]. This is the + instance feature crop. + detection_priors: a float Tensor of shape [batch_size * num_instances, + mask_crop_size, mask_crop_size, 1]. This is the detection prior for + the instance. + inst_classes: a int Tensor of shape [batch_size, num_instances] + of instance classes. + is_training: a bool indicating whether in training mode. + + Returns: + mask_outputs: instance mask prediction as a float Tensor of shape + [batch_size * num_instances, mask_size, mask_size, num_classes]. + """ + # Embed the anchor map into some feature space for anchor conditioning. + detection_prior_features = tf.keras.layers.Conv2D( + self._num_downsample_channels, + kernel_size=(1, 1), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal( + mean=0., stddev=0.01), + padding='same', + name='anchor-conv')( + detection_priors) + + prior_conditioned_features = crop_features + detection_prior_features + coarse_output_features = self.coarsemask_decoder_net( + prior_conditioned_features, is_training) + + coarse_mask_classes = tf.keras.layers.Conv2D( + self._mask_num_classes, + kernel_size=(1, 1), + # Focal loss bias initialization to have foreground 0.01 probability. + bias_initializer=tf.constant_initializer(-np.log((1 - 0.01) / 0.01)), + kernel_initializer=tf.keras.initializers.RandomNormal( + mean=0, stddev=0.01), + padding='same', + name='class-predict')( + coarse_output_features) + + if self._use_category_for_mask: + inst_classes = tf.cast(tf.reshape(inst_classes, [-1]), tf.int32) + coarse_mask_classes_t = tf.transpose( + a=coarse_mask_classes, perm=(0, 3, 1, 2)) + # pylint: disable=g-long-lambda + coarse_mask_logits = tf.cond( + pred=tf.size(input=inst_classes) > 0, + true_fn=lambda: tf.gather_nd( + coarse_mask_classes_t, + tf.stack( + [tf.range(tf.size(input=inst_classes)), inst_classes - 1], + axis=1)), + false_fn=lambda: coarse_mask_classes_t[:, 0, :, :]) + # pylint: enable=g-long-lambda + coarse_mask_logits = tf.expand_dims(coarse_mask_logits, -1) + else: + coarse_mask_logits = coarse_mask_classes + + coarse_class_probs = tf.nn.sigmoid(coarse_mask_logits) + class_probs = tf.cast(coarse_class_probs, prior_conditioned_features.dtype) + + return coarse_mask_classes, class_probs, prior_conditioned_features + + def coarsemask_decoder_net(self, + images, + is_training=None, + batch_norm_relu=nn_ops.BatchNormRelu): + """Coarse mask decoder network architecture. + + Args: + images: A tensor of size [batch, height_in, width_in, channels_in]. + is_training: Whether batch_norm layers are in training mode. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + Returns: + images: A feature tensor of size [batch, output_size, output_size, + num_channels] + """ + for i in range(self._num_convs): + images = tf.keras.layers.Conv2D( + self._num_downsample_channels, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01), + activation=None, + padding='same', + name='coarse-class-%d' % i)( + images) + images = batch_norm_relu(name='coarse-class-%d-bn' % i)( + images, is_training=is_training) + + return images + + +class ShapemaskFinemaskHead(object): + """ShapemaskFinemaskHead head.""" + + def __init__(self, + num_classes, + num_downsample_channels, + mask_crop_size, + num_convs, + coarse_mask_thr, + gt_upsample_scale, + batch_norm_relu=nn_ops.BatchNormRelu): + """Initialize params to build ShapeMask coarse and fine prediction head. + + Args: + num_classes: `int` number of mask classification categories. + num_downsample_channels: `int` number of filters at mask head. + mask_crop_size: feature crop size. + num_convs: `int` number of stacked convolution before the last prediction + layer. + coarse_mask_thr: the threshold for suppressing noisy coarse prediction. + gt_upsample_scale: scale for upsampling groundtruths. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + """ + self._mask_num_classes = num_classes + self._num_downsample_channels = num_downsample_channels + self._mask_crop_size = mask_crop_size + self._num_convs = num_convs + self._coarse_mask_thr = coarse_mask_thr + self._gt_upsample_scale = gt_upsample_scale + + self._class_predict_conv = tf.keras.layers.Conv2D( + self._mask_num_classes, + kernel_size=(1, 1), + # Focal loss bias initialization to have foreground 0.01 probability. + bias_initializer=tf.constant_initializer(-np.log((1 - 0.01) / 0.01)), + kernel_initializer=tf.keras.initializers.RandomNormal( + mean=0, stddev=0.01), + padding='same', + name='affinity-class-predict') + self._upsample_conv = tf.keras.layers.Conv2DTranspose( + self._num_downsample_channels // 2, + (self._gt_upsample_scale, self._gt_upsample_scale), + (self._gt_upsample_scale, self._gt_upsample_scale)) + self._fine_class_conv = [] + self._fine_class_bn = [] + for i in range(self._num_convs): + self._fine_class_conv.append( + tf.keras.layers.Conv2D( + self._num_downsample_channels, + kernel_size=(3, 3), + bias_initializer=tf.zeros_initializer(), + kernel_initializer=tf.keras.initializers.RandomNormal( + stddev=0.01), + activation=None, + padding='same', + name='fine-class-%d' % i)) + self._fine_class_bn.append(batch_norm_relu(name='fine-class-%d-bn' % i)) + + def __call__(self, prior_conditioned_features, class_probs, is_training=None): + """Generate instance masks from FPN features and detection priors. + + This corresponds to the Fig. 5-6 of the ShapeMask paper at + https://arxiv.org/pdf/1904.03239.pdf + + Args: + prior_conditioned_features: a float Tensor of shape [batch_size * + num_instances, mask_crop_size, mask_crop_size, num_downsample_channels]. + This is the instance feature crop. + class_probs: a float Tensor of shape [batch_size * num_instances, + mask_crop_size, mask_crop_size, 1]. This is the class probability of + instance segmentation. + is_training: a bool indicating whether in training mode. + + Returns: + mask_outputs: instance mask prediction as a float Tensor of shape + [batch_size * num_instances, mask_size, mask_size, num_classes]. + """ + with backend.get_graph().as_default(), tf.name_scope('affinity-masknet'): + # Extract the foreground mean features + point_samp_prob_thr = 1. / (1. + tf.exp(-self._coarse_mask_thr)) + point_samp_prob_thr = tf.cast(point_samp_prob_thr, class_probs.dtype) + class_probs = tf.where( + tf.greater(class_probs, point_samp_prob_thr), class_probs, + tf.zeros_like(class_probs)) + weighted_features = class_probs * prior_conditioned_features + sum_class_vector = tf.reduce_sum( + input_tensor=class_probs, axis=(1, 2)) + tf.constant( + 1e-20, class_probs.dtype) + instance_embedding = tf.reduce_sum( + input_tensor=weighted_features, axis=(1, 2)) / sum_class_vector + + # Take the difference between crop features and mean instance features. + instance_features = prior_conditioned_features - tf.reshape( + instance_embedding, (-1, 1, 1, self._num_downsample_channels)) + + # Decoder to generate upsampled segmentation mask. + affinity_output_features = self.finemask_decoder_net( + instance_features, is_training) + + # Predict per-class instance masks. + affinity_mask_classes = self._class_predict_conv(affinity_output_features) + + return affinity_mask_classes + + def finemask_decoder_net(self, images, is_training=None): + """Fine mask decoder network architecture. + + Args: + images: A tensor of size [batch, height_in, width_in, channels_in]. + is_training: Whether batch_norm layers are in training mode. + + Returns: + images: A feature tensor of size [batch, output_size, output_size, + num_channels], where output size is self._gt_upsample_scale times + that of input. + """ + for i in range(self._num_convs): + images = self._fine_class_conv[i](images) + images = self._fine_class_bn[i](images, is_training=is_training) + + if self._gt_upsample_scale > 1: + images = self._upsample_conv(images) + + return images diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/identity.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/identity.py new file mode 100644 index 0000000..acc90c4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/identity.py @@ -0,0 +1,28 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Identity Fn that forwards the input features.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +class Identity(object): + """Identity function that forwards the input features.""" + + def __call__(self, features, is_training=False): + """Only forwards the input features.""" + return features + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/nn_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/nn_ops.py new file mode 100644 index 0000000..556d620 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/nn_ops.py @@ -0,0 +1,86 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Neural network operations commonly shared by the architectures.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import logging +import tensorflow.compat.v2 as tf +from tensorflow.python.keras import backend + + +class BatchNormRelu(tf.keras.layers.Layer): + """Combined Batch Normalization and ReLU layers.""" + + def __init__(self, + momentum=0.997, + epsilon=1e-4, + trainable=True, + relu=True, + init_zero=False, + fused=True, + name=None): + """A class to construct layers for a batch normalization followed by a ReLU. + + Args: + momentum: momentum for the moving average. + epsilon: small float added to variance to avoid dividing by zero. + trainable: `boolean`, if True also add variables to the graph collection + GraphKeys.TRAINABLE_VARIABLES. If False, freeze batch normalization + layer. + relu: `bool` if False, omits the ReLU operation. + init_zero: `bool` if True, initializes scale parameter of batch + normalization with 0. If False, initialize it with 1. + fused: `bool` fused option in batch normalziation. + name: `str` name for the operation. + """ + super(BatchNormRelu, self).__init__(trainable=trainable) + self._use_relu = relu + if init_zero: + gamma_initializer = tf.keras.initializers.Zeros() + else: + gamma_initializer = tf.keras.initializers.Ones() + self._batch_norm_op = tf.keras.layers.BatchNormalization( + momentum=momentum, + epsilon=epsilon, + center=True, + scale=True, + trainable=trainable, + fused=fused, + gamma_initializer=gamma_initializer, + name=name) + + def __call__(self, inputs, is_training=None): + """Builds layers for a batch normalization followed by a ReLU. + + Args: + inputs: `Tensor` of shape `[batch, channels, ...]`. + is_training: `boolean`, if True if model is in training mode. + + Returns: + A normalized `Tensor` with the same `data_format`. + """ + # We will need to keep training=None by default, so that it can be inherit + # from keras.Model.training + if is_training and self.trainable: + is_training = True + inputs = self._batch_norm_op(inputs, training=is_training) + + if self._use_relu: + inputs = tf.nn.relu(inputs) + return inputs + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/resnet.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/resnet.py new file mode 100644 index 0000000..ccd4c5c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/architecture/resnet.py @@ -0,0 +1,304 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for the post-activation form of Residual Networks. + +Residual networks (ResNets) were proposed in: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import logging +import tensorflow.compat.v2 as tf +from tensorflow.python.keras import backend +from official.vision.detection.modeling.architecture import nn_ops + +# TODO(b/140112644): Refactor the code with Keras style, i.e. build and call. +class Resnet(object): + """Class to build ResNet family model.""" + + def __init__(self, + resnet_depth, + batch_norm_relu=nn_ops.BatchNormRelu, + data_format='channels_last'): + """ResNet initialization function. + + Args: + resnet_depth: `int` depth of ResNet backbone model. + batch_norm_relu: an operation that includes a batch normalization layer + followed by a relu layer(optional). + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + """ + self._resnet_depth = resnet_depth + + self._batch_norm_relu = batch_norm_relu + + self._data_format = data_format + + model_params = { + 10: {'block': self.residual_block, 'layers': [1, 1, 1, 1]}, + 18: {'block': self.residual_block, 'layers': [2, 2, 2, 2]}, + 34: {'block': self.residual_block, 'layers': [3, 4, 6, 3]}, + 50: {'block': self.bottleneck_block, 'layers': [3, 4, 6, 3]}, + 101: {'block': self.bottleneck_block, 'layers': [3, 4, 23, 3]}, + 152: {'block': self.bottleneck_block, 'layers': [3, 8, 36, 3]}, + 200: {'block': self.bottleneck_block, 'layers': [3, 24, 36, 3]} + } + + if resnet_depth not in model_params: + valid_resnet_depths = ', '.join( + [str(depth) for depth in sorted(model_params.keys())]) + raise ValueError( + 'The resnet_depth should be in [%s]. Not a valid resnet_depth:'%( + valid_resnet_depths), self._resnet_depth) + params = model_params[resnet_depth] + self._resnet_fn = self.resnet_v1_generator( + params['block'], params['layers']) + + def __call__(self, inputs, is_training=None): + """Returns the ResNet model for a given size and number of output classes. + + Args: + inputs: a `Tesnor` with shape [batch_size, height, width, 3] representing + a batch of images. + is_training: `bool` if True, the model is in training mode. + + Returns: + a `dict` containing `int` keys for continuous feature levels [2, 3, 4, 5]. + The values are corresponding feature hierarchy in ResNet with shape + [batch_size, height_l, width_l, num_filters]. + """ + with backend.get_graph().as_default(): + with tf.name_scope('resnet%s' % self._resnet_depth): + return self._resnet_fn(inputs, is_training) + + def fixed_padding(self, inputs, kernel_size): + """Pads the input along the spatial dimensions independently of input size. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]` or + `[batch, height, width, channels]` depending on `data_format`. + kernel_size: `int` kernel size to be used for `conv2d` or max_pool2d` + operations. Should be a positive integer. + + Returns: + A padded `Tensor` of the same `data_format` with size either intact + (if `kernel_size == 1`) or padded (if `kernel_size > 1`). + """ + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + if self._data_format == 'channels_first': + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [0, 0], [pad_beg, pad_end], [pad_beg, pad_end]]) + else: + padded_inputs = tf.pad( + tensor=inputs, + paddings=[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + + return padded_inputs + + def conv2d_fixed_padding(self, inputs, filters, kernel_size, strides): + """Strided 2-D convolution with explicit padding. + + The padding is consistent and is based only on `kernel_size`, not on the + dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone). + + Args: + inputs: `Tensor` of size `[batch, channels, height_in, width_in]`. + filters: `int` number of filters in the convolution. + kernel_size: `int` size of the kernel to be used in the convolution. + strides: `int` strides of the convolution. + + Returns: + A `Tensor` of shape `[batch, filters, height_out, width_out]`. + """ + if strides > 1: + inputs = self.fixed_padding(inputs, kernel_size) + + return tf.keras.layers.Conv2D( + filters=filters, + kernel_size=kernel_size, + strides=strides, + padding=('SAME' if strides == 1 else 'VALID'), + use_bias=False, + kernel_initializer=tf.initializers.VarianceScaling(), + data_format=self._data_format)( + inputs=inputs) + + def residual_block(self, + inputs, + filters, + strides, + use_projection=False, + is_training=None): + """Standard building block for residual networks with BN after convolutions. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]`. + filters: `int` number of filters for the first two convolutions. Note that + the third and final convolution will use 4 times as many filters. + strides: `int` block stride. If greater than 1, this block will ultimately + downsample the input. + use_projection: `bool` for whether this block should use a projection + shortcut (versus the default identity shortcut). This is usually + `True` for the first block of a block group, which may change the + number of filters and the resolution. + is_training: `bool` if True, the model is in training mode. + Returns: + The output `Tensor` of the block. + """ + shortcut = inputs + if use_projection: + # Projection shortcut in first layer to match filters and strides + shortcut = self.conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=strides) + shortcut = self._batch_norm_relu(relu=False)( + shortcut, is_training=is_training) + + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides) + inputs = self._batch_norm_relu()(inputs, is_training=is_training) + + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1) + inputs = self._batch_norm_relu()( + inputs, relu=False, init_zero=True, is_training=is_training) + + return tf.nn.relu(inputs + shortcut) + + def bottleneck_block(self, + inputs, + filters, + strides, + use_projection=False, + is_training=None): + """Bottleneck block variant for residual networks with BN after convolutions. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]`. + filters: `int` number of filters for the first two convolutions. Note that + the third and final convolution will use 4 times as many filters. + strides: `int` block stride. If greater than 1, this block will ultimately + downsample the input. + use_projection: `bool` for whether this block should use a projection + shortcut (versus the default identity shortcut). This is usually + `True` for the first block of a block group, which may change the + number of filters and the resolution. + is_training: `bool` if True, the model is in training mode. + + Returns: + The output `Tensor` of the block. + """ + shortcut = inputs + if use_projection: + # Projection shortcut only in first block within a group. Bottleneck + # blocks end with 4 times the number of filters. + filters_out = 4 * filters + shortcut = self.conv2d_fixed_padding( + inputs=inputs, filters=filters_out, kernel_size=1, strides=strides) + shortcut = self._batch_norm_relu(relu=False)( + shortcut, is_training=is_training) + + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1) + inputs = self._batch_norm_relu()(inputs, is_training=is_training) + + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides) + inputs = self._batch_norm_relu()(inputs, is_training=is_training) + + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1) + inputs = self._batch_norm_relu( + relu=False, init_zero=True)( + inputs, is_training=is_training) + + return tf.nn.relu(inputs + shortcut) + + def block_group(self, inputs, filters, block_fn, blocks, strides, name, + is_training): + """Creates one group of blocks for the ResNet model. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]`. + filters: `int` number of filters for the first convolution of the layer. + block_fn: `function` for the block to use within the model + blocks: `int` number of blocks contained in the layer. + strides: `int` stride to use for the first convolution of the layer. If + greater than 1, this layer will downsample the input. + name: `str`name for the Tensor output of the block layer. + is_training: `bool` if True, the model is in training mode. + + Returns: + The output `Tensor` of the block layer. + """ + # Only the first block per block_group uses projection shortcut and strides. + inputs = block_fn(inputs, filters, strides, use_projection=True, + is_training=is_training) + + for _ in range(1, blocks): + inputs = block_fn(inputs, filters, 1, is_training=is_training) + + return tf.identity(inputs, name) + + def resnet_v1_generator(self, block_fn, layers): + """Generator for ResNet v1 models. + + Args: + block_fn: `function` for the block to use within the model. Either + `residual_block` or `bottleneck_block`. + layers: list of 4 `int`s denoting the number of blocks to include in each + of the 4 block groups. Each group consists of blocks that take inputs of + the same resolution. + + Returns: + Model `function` that takes in `inputs` and `is_training` and returns the + output `Tensor` of the ResNet model. + """ + + def model(inputs, is_training=None): + """Creation of the model graph.""" + inputs = self.conv2d_fixed_padding( + inputs=inputs, filters=64, kernel_size=7, strides=2) + inputs = tf.identity(inputs, 'initial_conv') + inputs = self._batch_norm_relu()(inputs, is_training=is_training) + + inputs = tf.keras.layers.MaxPool2D( + pool_size=3, strides=2, padding='SAME', + data_format=self._data_format)( + inputs) + inputs = tf.identity(inputs, 'initial_max_pool') + + c2 = self.block_group( + inputs=inputs, filters=64, block_fn=block_fn, blocks=layers[0], + strides=1, name='block_group1', is_training=is_training) + c3 = self.block_group( + inputs=c2, filters=128, block_fn=block_fn, blocks=layers[1], + strides=2, name='block_group2', is_training=is_training) + c4 = self.block_group( + inputs=c3, filters=256, block_fn=block_fn, blocks=layers[2], + strides=2, name='block_group3', is_training=is_training) + c5 = self.block_group( + inputs=c4, filters=512, block_fn=block_fn, blocks=layers[3], + strides=2, name='block_group4', is_training=is_training) + return {2: c2, 3: c3, 4: c4, 5: c5} + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/base_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/base_model.py new file mode 100644 index 0000000..65778a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/base_model.py @@ -0,0 +1,167 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Base Model definition.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import abc +import functools +import re +import tensorflow.compat.v2 as tf +from official.vision.detection.modeling import checkpoint_utils +from official.vision.detection.modeling import learning_rates + + +class OptimizerFactory(object): + """Class to generate optimizer function.""" + + def __init__(self, params): + """Creates optimized based on the specified flags.""" + if params.type == 'momentum': + nesterov = False + try: + nesterov = params.nesterov + except AttributeError: + pass + self._optimizer = functools.partial( + tf.keras.optimizers.SGD, + momentum=params.momentum, + nesterov=nesterov) + elif params.type == 'adam': + self._optimizer = tf.keras.optimizers.Adam + elif params.type == 'adadelta': + self._optimizer = tf.keras.optimizers.Adadelta + elif params.type == 'adagrad': + self._optimizer = tf.keras.optimizers.Adagrad + elif params.type == 'rmsprop': + self._optimizer = functools.partial( + tf.keras.optimizers.RMSprop, momentum=params.momentum) + else: + raise ValueError('Unsupported optimizer type %s.' % self._optimizer) + + def __call__(self, learning_rate): + return self._optimizer(learning_rate=learning_rate) + + +def _make_filter_trainable_variables_fn(frozen_variable_prefix): + """Creates a function for filtering trainable varialbes.""" + + def _filter_trainable_variables(variables): + """Filters trainable varialbes. + + Args: + variables: a list of tf.Variable to be filtered. + + Returns: + filtered_variables: a list of tf.Variable filtered out the frozen ones. + """ + # frozen_variable_prefix: a regex string specifing the prefix pattern of + # the frozen variables' names. + filtered_variables = [ + v for v in variables + if not re.match(frozen_variable_prefix, v.name) + ] + return filtered_variables + + return _filter_trainable_variables + + +class Model(object): + """Base class for model function.""" + + __metaclass__ = abc.ABCMeta + + def __init__(self, params): + self._use_bfloat16 = params.architecture.use_bfloat16 + + if params.architecture.use_bfloat16: + policy = tf.compat.v2.keras.mixed_precision.experimental.Policy( + 'mixed_bfloat16') + tf.compat.v2.keras.mixed_precision.experimental.set_policy(policy) + + # Optimization. + self._optimizer_fn = OptimizerFactory(params.train.optimizer) + self._learning_rate = learning_rates.learning_rate_generator( + params.train.learning_rate) + + self._frozen_variable_prefix = params.train.frozen_variable_prefix + self._regularization_var_regex = params.train.regularization_variable_regex + self._l2_weight_decay = params.train.l2_weight_decay + + # Checkpoint restoration. + self._checkpoint = params.train.checkpoint.as_dict() + + # Summary. + self._enable_summary = params.enable_summary + self._model_dir = params.model_dir + + @abc.abstractmethod + def build_outputs(self, inputs, mode): + """Build the graph of the forward path.""" + pass + + @abc.abstractmethod + def build_model(self, params, mode): + """Build the model object.""" + pass + + @abc.abstractmethod + def build_loss_fn(self): + """Build the model object.""" + pass + + def post_processing(self, labels, outputs): + """Post-processing function.""" + return labels, outputs + + def model_outputs(self, inputs, mode): + """Build the model outputs.""" + return self.build_outputs(inputs, mode) + + def build_optimizer(self): + """Returns train_op to optimize total loss.""" + # Sets up the optimizer. + return self._optimizer_fn(self._learning_rate) + + def make_filter_trainable_variables_fn(self): + """Creates a function for filtering trainable varialbes.""" + return _make_filter_trainable_variables_fn(self._frozen_variable_prefix) + + def weight_decay_loss(self, trainable_variables): + reg_variables = [ + v for v in trainable_variables + if self._regularization_var_regex is None + or re.match(self._regularization_var_regex, v.name) + ] + + return self._l2_weight_decay * tf.add_n( + [tf.nn.l2_loss(v) for v in reg_variables]) + + def make_restore_checkpoint_fn(self): + """Returns scaffold function to restore parameters from v1 checkpoint.""" + if 'skip_checkpoint_variables' in self._checkpoint: + skip_regex = self._checkpoint['skip_checkpoint_variables'] + else: + skip_regex = None + return checkpoint_utils.make_restore_checkpoint_fn( + self._checkpoint['path'], + prefix=self._checkpoint['prefix'], + skip_regex=skip_regex) + + def eval_metrics(self): + """Returns tuple of metric function and its inputs for evaluation.""" + raise NotImplementedError('Unimplemented eval_metrics') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/checkpoint_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/checkpoint_utils.py new file mode 100644 index 0000000..a4346e6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/checkpoint_utils.py @@ -0,0 +1,131 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Util functions for loading checkpoints. Especially for loading Tensorflow 1.x +checkpoint to Tensorflow 2.x (keras) model. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +import re +from absl import logging + +import tensorflow.compat.v2 as tf + + +def _build_assignment_map(keras_model, + prefix='', + skip_variables_regex=None, + var_to_shape_map=None): + """Compute an assignment mapping for loading older checkpoints into a Keras + model. Variable names are remapped from the original TPUEstimator model to + the new Keras name. + + Args: + keras_model: tf.keras.Model object to provide variables to assign. + prefix: prefix in the variable name to be remove for alignment with names in + the checkpoint. + skip_variables_regex: regular expression to math the names of variables that + do not need to be assign. + var_to_shape_map: variable name to shape mapping from the checkpoint. + + Returns: + The variable assignment map. + """ + assignment_map = {} + + + checkpoint_names = None + if var_to_shape_map: + checkpoint_names = list(filter( + lambda x: not x.endswith('Momentum') and not x.endswith( + 'global_step'), var_to_shape_map.keys())) + + for var in keras_model.variables: + var_name = var.name + + if skip_variables_regex and re.match(skip_variables_regex, var_name): + continue + # Trim the index of the variable. + if ':' in var_name: + var_name = var_name[:var_name.rindex(':')] + if var_name.startswith(prefix): + var_name = var_name[len(prefix):] + + if not var_to_shape_map: + assignment_map[var_name] = var + continue + + # Match name with variables in the checkpoint. + match_names = list(filter(lambda x: x.endswith(var_name), checkpoint_names)) + try: + if match_names: + assert len(match_names) == 1, 'more then on matches for {}: {}'.format( + var_name, match_names) + checkpoint_names.remove(match_names[0]) + assignment_map[match_names[0]] = var + else: + logging.info('Error not found var name: %s', var_name) + except Exception as e: + logging.info('Error removing the match_name: %s', match_names) + logging.info('Exception: %s', e) + raise + logging.info('Found variable in checkpoint: %d', len(assignment_map)) + return assignment_map + + +def _get_checkpoint_map(checkpoint_path): + reader = tf.train.load_checkpoint(checkpoint_path) + return reader.get_variable_to_shape_map() + + +def make_restore_checkpoint_fn(checkpoint_path, prefix='', skip_regex=None): + """Returns scaffold function to restore parameters from v1 checkpoint. + Args: + checkpoint_path: path of the checkpoint folder or file. + Example 1: '/path/to/model_dir/' + Example 2: '/path/to/model.ckpt-22500' + prefix: prefix in the variable name to be remove for alignment with names in + the checkpoint. + skip_regex: regular expression to math the names of variables that + do not need to be assign. + + Returns: + Callable[tf.kears.Model] -> void. Fn to load v1 checkpoint to keras model. + """ + + def _restore_checkpoint_fn(keras_model): + """Loads pretrained model through scaffold function.""" + if not checkpoint_path: + logging.info('checkpoint_path is empty') + return + var_prefix = prefix + if prefix and not prefix.endswith('/'): + var_prefix += '/' + var_to_shape_map = _get_checkpoint_map(checkpoint_path) + assert var_to_shape_map, 'var_to_shape_map should not be empty' + vars_to_load = _build_assignment_map( + keras_model, + prefix=var_prefix, + skip_variables_regex=skip_regex, + var_to_shape_map=var_to_shape_map) + if not vars_to_load: + raise ValueError('Variables to load is empty.') + tf.compat.v1.train.init_from_checkpoint(checkpoint_path, + vars_to_load) + + return _restore_checkpoint_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/factory.py new file mode 100644 index 0000000..bc7c33f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/factory.py @@ -0,0 +1,31 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Factory to build detection model.""" + + +from official.vision.detection.modeling import maskrcnn_model +from official.vision.detection.modeling import retinanet_model + + +def model_generator(params): + """Model function generator.""" + if params.type == 'retinanet': + model_fn = retinanet_model.RetinanetModel(params) + elif params.type == 'mask_rcnn': + model_fn = maskrcnn_model.MaskrcnnModel(params) + else: + raise ValueError('Model %s is not supported.'% params.type) + + return model_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/learning_rates.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/learning_rates.py new file mode 100644 index 0000000..99d5d7c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/learning_rates.py @@ -0,0 +1,96 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Learning rate schedule.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools + +import numpy as np +import tensorflow.compat.v2 as tf +from official.modeling.hyperparams import params_dict + + +class StepLearningRateWithLinearWarmup(tf.keras.optimizers.schedules.LearningRateSchedule): + """Class to generate learning rate tensor.""" + + def __init__(self, params): + """Creates the step learning rate tensor with linear warmup.""" + super(StepLearningRateWithLinearWarmup, self).__init__() + assert isinstance(params, (dict, params_dict.ParamsDict)) + if isinstance(params, dict): + params = params_dict.ParamsDict(params) + self._params = params + + def __call__(self, global_step): + warmup_lr = self._params.warmup_learning_rate + warmup_steps = self._params.warmup_steps + init_lr = self._params.init_learning_rate + lr_levels = self._params.learning_rate_levels + lr_steps = self._params.learning_rate_steps + linear_warmup = ( + warmup_lr + tf.cast(global_step, dtype=tf.float32) / warmup_steps * + (init_lr - warmup_lr)) + learning_rate = tf.where(global_step < warmup_steps, linear_warmup, init_lr) + + for next_learning_rate, start_step in zip(lr_levels, lr_steps): + learning_rate = tf.where(global_step >= start_step, next_learning_rate, + learning_rate) + return learning_rate + + def get_config(self): + return {'_params': self._params.as_dict()} + + +class CosineLearningRateWithLinearWarmup(tf.keras.optimizers.schedules.LearningRateSchedule): + """Class to generate learning rate tensor.""" + + def __init__(self, params): + """Creates the consine learning rate tensor with linear warmup.""" + super(CosineLearningRateWithLinearWarmup, self).__init__() + assert isinstance(params, (dict, params_dict.ParamsDict)) + if isinstance(params, dict): + params = params_dict.ParamsDict(params) + self._params = params + + def __call__(self, global_step): + global_step = tf.cast(global_step, dtype=tf.float32) + warmup_lr = self._params.warmup_learning_rate + warmup_steps = self._params.warmup_steps + init_lr = self._params.init_learning_rate + total_steps = self._params.total_steps + linear_warmup = ( + warmup_lr + global_step / warmup_steps * (init_lr - warmup_lr)) + cosine_learning_rate = ( + init_lr * (tf.cos(np.pi * (global_step - warmup_steps) / + (total_steps - warmup_steps)) + 1.0) / 2.0) + learning_rate = tf.where(global_step < warmup_steps, linear_warmup, + cosine_learning_rate) + return learning_rate + + def get_config(self): + return {'_params': self._params.as_dict()} + + +def learning_rate_generator(params): + """The learning rate function generator.""" + if params.type == 'step': + return StepLearningRateWithLinearWarmup(params) + elif params.type == 'cosine': + return CosineLearningRateWithLinearWarmup(params) + else: + raise ValueError('Unsupported learning rate type: {}.'.format(params.type)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/losses.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/losses.py new file mode 100644 index 0000000..7573349 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/losses.py @@ -0,0 +1,490 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Losses used for Mask-RCNN.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import logging +import tensorflow.compat.v2 as tf + + +def focal_loss(logits, targets, alpha, gamma, normalizer): + """Compute the focal loss between `logits` and the golden `target` values. + + Focal loss = -(1-pt)^gamma * log(pt) + where pt is the probability of being classified to the true class. + + Args: + logits: A float32 tensor of size + [batch, height_in, width_in, num_predictions]. + targets: A float32 tensor of size + [batch, height_in, width_in, num_predictions]. + alpha: A float32 scalar multiplying alpha to the loss from positive examples + and (1-alpha) to the loss from negative examples. + gamma: A float32 scalar modulating loss from hard and easy examples. + normalizer: A float32 scalar normalizes the total loss from all examples. + + Returns: + loss: A float32 Tensor of size [batch, height_in, width_in, num_predictions] + representing normalized loss on the prediction map. + """ + with tf.name_scope('focal_loss'): + positive_label_mask = tf.math.equal(targets, 1.0) + cross_entropy = ( + tf.nn.sigmoid_cross_entropy_with_logits(labels=targets, logits=logits)) + # Below are comments/derivations for computing modulator. + # For brevity, let x = logits, z = targets, r = gamma, and p_t = sigmod(x) + # for positive samples and 1 - sigmoid(x) for negative examples. + # + # The modulator, defined as (1 - P_t)^r, is a critical part in focal loss + # computation. For r > 0, it puts more weights on hard examples, and less + # weights on easier ones. However if it is directly computed as (1 - P_t)^r, + # its back-propagation is not stable when r < 1. The implementation here + # resolves the issue. + # + # For positive samples (labels being 1), + # (1 - p_t)^r + # = (1 - sigmoid(x))^r + # = (1 - (1 / (1 + exp(-x))))^r + # = (exp(-x) / (1 + exp(-x)))^r + # = exp(log((exp(-x) / (1 + exp(-x)))^r)) + # = exp(r * log(exp(-x)) - r * log(1 + exp(-x))) + # = exp(- r * x - r * log(1 + exp(-x))) + # + # For negative samples (labels being 0), + # (1 - p_t)^r + # = (sigmoid(x))^r + # = (1 / (1 + exp(-x)))^r + # = exp(log((1 / (1 + exp(-x)))^r)) + # = exp(-r * log(1 + exp(-x))) + # + # Therefore one unified form for positive (z = 1) and negative (z = 0) + # samples is: + # (1 - p_t)^r = exp(-r * z * x - r * log(1 + exp(-x))). + neg_logits = -1.0 * logits + modulator = tf.math.exp(gamma * targets * neg_logits - + gamma * tf.math.log1p(tf.math.exp(neg_logits))) + loss = modulator * cross_entropy + weighted_loss = tf.where(positive_label_mask, alpha * loss, + (1.0 - alpha) * loss) + weighted_loss /= normalizer + return weighted_loss + + +class RpnScoreLoss(object): + """Region Proposal Network score loss function.""" + + def __init__(self, params): + self._rpn_batch_size_per_im = params.rpn_batch_size_per_im + self._binary_crossentropy = tf.keras.losses.BinaryCrossentropy( + reduction=tf.keras.losses.Reduction.SUM, from_logits=True) + + def __call__(self, score_outputs, labels): + """Computes total RPN detection loss. + + Computes total RPN detection loss including box and score from all levels. + + Args: + score_outputs: an OrderDict with keys representing levels and values + representing scores in [batch_size, height, width, num_anchors]. + labels: the dictionary that returned from dataloader that includes + groundturth targets. + + Returns: + rpn_score_loss: a scalar tensor representing total score loss. + """ + with tf.name_scope('rpn_loss'): + levels = sorted(score_outputs.keys()) + + score_losses = [] + for level in levels: + score_losses.append( + self._rpn_score_loss( + score_outputs[level], + labels[level], + normalizer=tf.cast( + tf.shape(score_outputs[level])[0] * + self._rpn_batch_size_per_im, dtype=tf.float32))) + + # Sums per level losses to total loss. + return tf.math.add_n(score_losses) + + def _rpn_score_loss(self, score_outputs, score_targets, normalizer=1.0): + """Computes score loss.""" + # score_targets has three values: + # (1) score_targets[i]=1, the anchor is a positive sample. + # (2) score_targets[i]=0, negative. + # (3) score_targets[i]=-1, the anchor is don't care (ignore). + with tf.name_scope('rpn_score_loss'): + mask = tf.math.logical_or(tf.math.equal(score_targets, 1), + tf.math.equal(score_targets, 0)) + + score_targets = tf.math.maximum(score_targets, + tf.zeros_like(score_targets)) + + score_targets = tf.expand_dims(score_targets, axis=-1) + score_outputs = tf.expand_dims(score_outputs, axis=-1) + score_loss = self._binary_crossentropy( + score_targets, score_outputs, sample_weight=mask) + + score_loss /= normalizer + return score_loss + + +class RpnBoxLoss(object): + """Region Proposal Network box regression loss function.""" + + def __init__(self, params): + logging.info('RpnBoxLoss huber_loss_delta %s', params.huber_loss_delta) + # The delta is typically around the mean value of regression target. + # for instances, the regression targets of 512x512 input with 6 anchors on + # P2-P6 pyramid is about [0.1, 0.1, 0.2, 0.2]. + self._huber_loss = tf.keras.losses.Huber( + delta=params.huber_loss_delta, reduction=tf.keras.losses.Reduction.SUM) + + def __call__(self, box_outputs, labels): + """Computes total RPN detection loss. + + Computes total RPN detection loss including box and score from all levels. + + Args: + box_outputs: an OrderDict with keys representing levels and values + representing box regression targets in + [batch_size, height, width, num_anchors * 4]. + labels: the dictionary that returned from dataloader that includes + groundturth targets. + + Returns: + rpn_box_loss: a scalar tensor representing total box regression loss. + """ + with tf.name_scope('rpn_loss'): + levels = sorted(box_outputs.keys()) + + box_losses = [] + for level in levels: + box_losses.append(self._rpn_box_loss(box_outputs[level], labels[level])) + + # Sum per level losses to total loss. + return tf.add_n(box_losses) + + def _rpn_box_loss(self, box_outputs, box_targets, normalizer=1.0): + """Computes box regression loss.""" + with tf.name_scope('rpn_box_loss'): + mask = tf.cast(tf.not_equal(box_targets, 0.0), dtype=tf.float32) + box_targets = tf.expand_dims(box_targets, axis=-1) + box_outputs = tf.expand_dims(box_outputs, axis=-1) + box_loss = self._huber_loss(box_targets, box_outputs, sample_weight=mask) + # The loss is normalized by the sum of non-zero weights and additional + # normalizer provided by the function caller. Using + 0.01 here to avoid + # division by zero. + box_loss /= normalizer * (tf.reduce_sum(mask) + 0.01) + return box_loss + + +class FastrcnnClassLoss(object): + """Fast R-CNN classification loss function.""" + + def __init__(self): + self._categorical_crossentropy = tf.keras.losses.CategoricalCrossentropy( + reduction=tf.keras.losses.Reduction.SUM, from_logits=True) + + def __call__(self, class_outputs, class_targets): + """Computes the class loss (Fast-RCNN branch) of Mask-RCNN. + + This function implements the classification loss of the Fast-RCNN. + + The classification loss is softmax on all RoIs. + Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/modeling/fast_rcnn_heads.py # pylint: disable=line-too-long + + Args: + class_outputs: a float tensor representing the class prediction for each box + with a shape of [batch_size, num_boxes, num_classes]. + class_targets: a float tensor representing the class label for each box + with a shape of [batch_size, num_boxes]. + + Returns: + a scalar tensor representing total class loss. + """ + with tf.name_scope('fast_rcnn_loss'): + batch_size, num_boxes, num_classes = class_outputs.get_shape().as_list() + class_targets = tf.cast(class_targets, dtype=tf.int32) + class_targets_one_hot = tf.one_hot(class_targets, num_classes) + return self._fast_rcnn_class_loss(class_outputs, class_targets_one_hot, + normalizer=batch_size * num_boxes / 2.0) + + def _fast_rcnn_class_loss(self, class_outputs, class_targets_one_hot, + normalizer): + """Computes classification loss.""" + with tf.name_scope('fast_rcnn_class_loss'): + class_loss = self._categorical_crossentropy(class_targets_one_hot, + class_outputs) + + class_loss /= normalizer + return class_loss + + +class FastrcnnBoxLoss(object): + """Fast R-CNN box regression loss function.""" + + def __init__(self, params): + logging.info('FastrcnnBoxLoss huber_loss_delta %s', params.huber_loss_delta) + # The delta is typically around the mean value of regression target. + # for instances, the regression targets of 512x512 input with 6 anchors on + # P2-P6 pyramid is about [0.1, 0.1, 0.2, 0.2]. + self._huber_loss = tf.keras.losses.Huber( + delta=params.huber_loss_delta, reduction=tf.keras.losses.Reduction.SUM) + + def __call__(self, box_outputs, class_targets, box_targets): + """Computes the box loss (Fast-RCNN branch) of Mask-RCNN. + + This function implements the box regression loss of the Fast-RCNN. As the + `box_outputs` produces `num_classes` boxes for each RoI, the reference model + expands `box_targets` to match the shape of `box_outputs` and selects only + the target that the RoI has a maximum overlap. (Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/roi_data/fast_rcnn.py) # pylint: disable=line-too-long + Instead, this function selects the `box_outputs` by the `class_targets` so + that it doesn't expand `box_targets`. + + The box loss is smooth L1-loss on only positive samples of RoIs. + Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/modeling/fast_rcnn_heads.py # pylint: disable=line-too-long + + Args: + box_outputs: a float tensor representing the box prediction for each box + with a shape of [batch_size, num_boxes, num_classes * 4]. + class_targets: a float tensor representing the class label for each box + with a shape of [batch_size, num_boxes]. + box_targets: a float tensor representing the box label for each box + with a shape of [batch_size, num_boxes, 4]. + + Returns: + box_loss: a scalar tensor representing total box regression loss. + """ + with tf.name_scope('fast_rcnn_loss'): + class_targets = tf.cast(class_targets, dtype=tf.int32) + + # Selects the box from `box_outputs` based on `class_targets`, with which + # the box has the maximum overlap. + (batch_size, num_rois, + num_class_specific_boxes) = box_outputs.get_shape().as_list() + num_classes = num_class_specific_boxes // 4 + box_outputs = tf.reshape(box_outputs, + [batch_size, num_rois, num_classes, 4]) + + box_indices = tf.reshape( + class_targets + tf.tile( + tf.expand_dims( + tf.range(batch_size) * num_rois * num_classes, 1), + [1, num_rois]) + tf.tile( + tf.expand_dims(tf.range(num_rois) * num_classes, 0), + [batch_size, 1]), [-1]) + + box_outputs = tf.matmul( + tf.one_hot( + box_indices, + batch_size * num_rois * num_classes, + dtype=box_outputs.dtype), tf.reshape(box_outputs, [-1, 4])) + box_outputs = tf.reshape(box_outputs, [batch_size, -1, 4]) + + return self._fast_rcnn_box_loss(box_outputs, box_targets, class_targets) + + def _fast_rcnn_box_loss(self, box_outputs, box_targets, class_targets, + normalizer=1.0): + """Computes box regression loss.""" + with tf.name_scope('fast_rcnn_box_loss'): + mask = tf.tile(tf.expand_dims(tf.greater(class_targets, 0), axis=2), + [1, 1, 4]) + mask = tf.cast(mask, dtype=tf.float32) + box_targets = tf.expand_dims(box_targets, axis=-1) + box_outputs = tf.expand_dims(box_outputs, axis=-1) + box_loss = self._huber_loss(box_targets, box_outputs, sample_weight=mask) + # The loss is normalized by the number of ones in mask, + # additianal normalizer provided by the user and using 0.01 here to avoid + # division by 0. + box_loss /= normalizer * (tf.reduce_sum(mask) + 0.01) + return box_loss + + +class MaskrcnnLoss(object): + """Mask R-CNN instance segmentation mask loss function.""" + + def __init__(self): + self._binary_crossentropy = tf.keras.losses.BinaryCrossentropy( + reduction=tf.keras.losses.Reduction.SUM, from_logits=True) + + def __call__(self, mask_outputs, mask_targets, select_class_targets): + """Computes the mask loss of Mask-RCNN. + + This function implements the mask loss of Mask-RCNN. As the `mask_outputs` + produces `num_classes` masks for each RoI, the reference model expands + `mask_targets` to match the shape of `mask_outputs` and selects only the + target that the RoI has a maximum overlap. (Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/roi_data/mask_rcnn.py) # pylint: disable=line-too-long + Instead, this implementation selects the `mask_outputs` by the `class_targets` + so that it doesn't expand `mask_targets`. Note that the selection logic is + done in the post-processing of mask_rcnn_fn in mask_rcnn_architecture.py. + + Args: + mask_outputs: a float tensor representing the prediction for each mask, + with a shape of + [batch_size, num_masks, mask_height, mask_width]. + mask_targets: a float tensor representing the binary mask of ground truth + labels for each mask with a shape of + [batch_size, num_masks, mask_height, mask_width]. + select_class_targets: a tensor with a shape of [batch_size, num_masks], + representing the foreground mask targets. + + Returns: + mask_loss: a float tensor representing total mask loss. + """ + with tf.name_scope('mask_rcnn_loss'): + (batch_size, num_masks, mask_height, + mask_width) = mask_outputs.get_shape().as_list() + + weights = tf.tile( + tf.reshape(tf.greater(select_class_targets, 0), + [batch_size, num_masks, 1, 1]), + [1, 1, mask_height, mask_width]) + weights = tf.cast(weights, dtype=tf.float32) + + mask_targets = tf.expand_dims(mask_targets, axis=-1) + mask_outputs = tf.expand_dims(mask_outputs, axis=-1) + mask_loss = self._binary_crossentropy(mask_targets, mask_outputs, + sample_weight=weights) + + # The loss is normalized by the number of 1's in weights and + # + 0.01 is used to avoid division by zero. + return mask_loss / (tf.reduce_sum(weights) + 0.01) + + +class RetinanetClassLoss(object): + """RetinaNet class loss.""" + + def __init__(self, params): + self._num_classes = params.num_classes + self._focal_loss_alpha = params.focal_loss_alpha + self._focal_loss_gamma = params.focal_loss_gamma + + def __call__(self, cls_outputs, labels, num_positives): + """Computes total detection loss. + + Computes total detection loss including box and class loss from all levels. + + Args: + cls_outputs: an OrderDict with keys representing levels and values + representing logits in [batch_size, height, width, + num_anchors * num_classes]. + labels: the dictionary that returned from dataloader that includes + class groundturth targets. + num_positives: number of positive examples in the minibatch. + + Returns: + an integar tensor representing total class loss. + """ + # Sums all positives in a batch for normalization and avoids zero + # num_positives_sum, which would lead to inf loss during training + num_positives_sum = tf.reduce_sum(input_tensor=num_positives) + 1.0 + + cls_losses = [] + for level in cls_outputs.keys(): + cls_losses.append(self.class_loss( + cls_outputs[level], labels[level], num_positives_sum)) + # Sums per level losses to total loss. + return tf.add_n(cls_losses) + + def class_loss(self, cls_outputs, cls_targets, num_positives, + ignore_label=-2): + """Computes RetinaNet classification loss.""" + # Onehot encoding for classification labels. + cls_targets_one_hot = tf.one_hot(cls_targets, self._num_classes) + bs, height, width, _, _ = cls_targets_one_hot.get_shape().as_list() + cls_targets_one_hot = tf.reshape(cls_targets_one_hot, + [bs, height, width, -1]) + loss = focal_loss(cls_outputs, cls_targets_one_hot, + self._focal_loss_alpha, self._focal_loss_gamma, + num_positives) + + ignore_loss = tf.where( + tf.equal(cls_targets, ignore_label), + tf.zeros_like(cls_targets, dtype=tf.float32), + tf.ones_like(cls_targets, dtype=tf.float32), + ) + ignore_loss = tf.expand_dims(ignore_loss, -1) + ignore_loss = tf.tile(ignore_loss, [1, 1, 1, 1, self._num_classes]) + ignore_loss = tf.reshape(ignore_loss, tf.shape(input=loss)) + return tf.reduce_sum(input_tensor=ignore_loss * loss) + + +class RetinanetBoxLoss(object): + """RetinaNet box loss.""" + + def __init__(self, params): + self._huber_loss = tf.keras.losses.Huber( + delta=params.huber_loss_delta, reduction=tf.keras.losses.Reduction.SUM) + + def __call__(self, box_outputs, labels, num_positives): + """Computes box detection loss. + + Computes total detection loss including box and class loss from all levels. + + Args: + box_outputs: an OrderDict with keys representing levels and values + representing box regression targets in [batch_size, height, width, + num_anchors * 4]. + labels: the dictionary that returned from dataloader that includes + box groundturth targets. + num_positives: number of positive examples in the minibatch. + + Returns: + an integar tensor representing total box regression loss. + """ + # Sums all positives in a batch for normalization and avoids zero + # num_positives_sum, which would lead to inf loss during training + num_positives_sum = tf.reduce_sum(input_tensor=num_positives) + 1.0 + + box_losses = [] + for level in box_outputs.keys(): + # Onehot encoding for classification labels. + box_targets_l = labels[level] + box_losses.append( + self.box_loss(box_outputs[level], box_targets_l, num_positives_sum)) + # Sums per level losses to total loss. + return tf.add_n(box_losses) + + def box_loss(self, box_outputs, box_targets, num_positives): + """Computes RetinaNet box regression loss.""" + # The delta is typically around the mean value of regression target. + # for instances, the regression targets of 512x512 input with 6 anchors on + # P3-P7 pyramid is about [0.1, 0.1, 0.2, 0.2]. + normalizer = num_positives * 4.0 + mask = tf.cast(tf.not_equal(box_targets, 0.0), dtype=tf.float32) + box_targets = tf.expand_dims(box_targets, axis=-1) + box_outputs = tf.expand_dims(box_outputs, axis=-1) + box_loss = self._huber_loss(box_targets, box_outputs, sample_weight=mask) + box_loss /= normalizer + return box_loss + + +class ShapemaskMseLoss(object): + """ShapeMask mask Mean Squared Error loss function wrapper.""" + + def __init__(self): + raise NotImplementedError('Not Implemented.') + + +class ShapemaskLoss(object): + """ShapeMask mask loss function wrapper.""" + + def __init__(self): + raise NotImplementedError('Not Implemented.') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/maskrcnn_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/maskrcnn_model.py new file mode 100644 index 0000000..e196a31 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/maskrcnn_model.py @@ -0,0 +1,342 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Model defination for the Mask R-CNN Model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from tensorflow.python.keras import backend +from official.vision.detection.dataloader import anchor +from official.vision.detection.dataloader import mode_keys +from official.vision.detection.evaluation import factory as eval_factory +from official.vision.detection.modeling import base_model +from official.vision.detection.modeling import losses +from official.vision.detection.modeling.architecture import factory +from official.vision.detection.ops import postprocess_ops +from official.vision.detection.ops import roi_ops +from official.vision.detection.ops import sampling_ops +from official.vision.detection.ops import spatial_transform_ops +from official.vision.detection.utils import box_utils + + +class MaskrcnnModel(base_model.Model): + """Mask R-CNN model function.""" + + def __init__(self, params): + super(MaskrcnnModel, self).__init__(params) + + # For eval metrics. + self._params = params + self._keras_model = None + + self._include_mask = params.architecture.include_mask + + # Architecture generators. + self._backbone_fn = factory.backbone_generator(params) + self._fpn_fn = factory.multilevel_features_generator(params) + self._rpn_head_fn = factory.rpn_head_generator(params.rpn_head) + self._generate_rois_fn = roi_ops.ROIGenerator(params.roi_proposal) + self._sample_rois_fn = sampling_ops.ROISampler(params.roi_sampling) + self._sample_masks_fn = sampling_ops.MaskSampler(params.mask_sampling) + + self._frcnn_head_fn = factory.fast_rcnn_head_generator(params.frcnn_head) + if self._include_mask: + self._mrcnn_head_fn = factory.mask_rcnn_head_generator(params.mrcnn_head) + + # Loss function. + self._rpn_score_loss_fn = losses.RpnScoreLoss(params.rpn_score_loss) + self._rpn_box_loss_fn = losses.RpnBoxLoss(params.rpn_box_loss) + self._frcnn_class_loss_fn = losses.FastrcnnClassLoss() + self._frcnn_box_loss_fn = losses.FastrcnnBoxLoss(params.frcnn_box_loss) + if self._include_mask: + self._mask_loss_fn = losses.MaskrcnnLoss() + + self._generate_detections_fn = postprocess_ops.GenericDetectionGenerator( + params.postprocess) + + self._transpose_input = params.train.transpose_input + assert not self._transpose_input, 'Transpose input is not supportted.' + + def build_outputs(self, inputs, mode): + is_training = mode == mode_keys.TRAIN + model_outputs = {} + + image = inputs['image'] + _, image_height, image_width, _ = image.get_shape().as_list() + backbone_features = self._backbone_fn(image, is_training) + fpn_features = self._fpn_fn(backbone_features, is_training) + + rpn_score_outputs, rpn_box_outputs = self._rpn_head_fn( + fpn_features, is_training) + model_outputs.update({ + 'rpn_score_outputs': + tf.nest.map_structure(lambda x: tf.cast(x, tf.float32), + rpn_score_outputs), + 'rpn_box_outputs': + tf.nest.map_structure(lambda x: tf.cast(x, tf.float32), + rpn_box_outputs), + }) + input_anchor = anchor.Anchor(self._params.anchor.min_level, + self._params.anchor.max_level, + self._params.anchor.num_scales, + self._params.anchor.aspect_ratios, + self._params.anchor.anchor_size, + (image_height, image_width)) + rpn_rois, _ = self._generate_rois_fn(rpn_box_outputs, rpn_score_outputs, + input_anchor.multilevel_boxes, + inputs['image_info'][:, 1, :], + is_training) + if is_training: + rpn_rois = tf.stop_gradient(rpn_rois) + + # Sample proposals. + rpn_rois, matched_gt_boxes, matched_gt_classes, matched_gt_indices = ( + self._sample_rois_fn(rpn_rois, inputs['gt_boxes'], + inputs['gt_classes'])) + + # Create bounding box training targets. + box_targets = box_utils.encode_boxes( + matched_gt_boxes, rpn_rois, weights=[10.0, 10.0, 5.0, 5.0]) + # If the target is background, the box target is set to all 0s. + box_targets = tf.where( + tf.tile( + tf.expand_dims(tf.equal(matched_gt_classes, 0), axis=-1), + [1, 1, 4]), + tf.zeros_like(box_targets), + box_targets) + model_outputs.update({ + 'class_targets': matched_gt_classes, + 'box_targets': box_targets, + }) + + roi_features = spatial_transform_ops.multilevel_crop_and_resize( + fpn_features, rpn_rois, output_size=7) + + class_outputs, box_outputs = self._frcnn_head_fn(roi_features, is_training) + + model_outputs.update({ + 'class_outputs': + tf.nest.map_structure(lambda x: tf.cast(x, tf.float32), + class_outputs), + 'box_outputs': + tf.nest.map_structure(lambda x: tf.cast(x, tf.float32), + box_outputs), + }) + + # Add this output to train to make the checkpoint loadable in predict mode. + # If we skip it in train mode, the heads will be out-of-order and checkpoint + # loading will fail. + boxes, scores, classes, valid_detections = self._generate_detections_fn( + box_outputs, class_outputs, rpn_rois, inputs['image_info'][:, 1:2, :]) + model_outputs.update({ + 'num_detections': valid_detections, + 'detection_boxes': boxes, + 'detection_classes': classes, + 'detection_scores': scores, + }) + + if not self._include_mask: + return model_outputs + + if is_training: + rpn_rois, classes, mask_targets = self._sample_masks_fn( + rpn_rois, matched_gt_boxes, matched_gt_classes, matched_gt_indices, + inputs['gt_masks']) + mask_targets = tf.stop_gradient(mask_targets) + + classes = tf.cast(classes, dtype=tf.int32) + + model_outputs.update({ + 'mask_targets': mask_targets, + 'sampled_class_targets': classes, + }) + else: + rpn_rois = boxes + classes = tf.cast(classes, dtype=tf.int32) + + mask_roi_features = spatial_transform_ops.multilevel_crop_and_resize( + fpn_features, rpn_rois, output_size=14) + + mask_outputs = self._mrcnn_head_fn(mask_roi_features, classes, is_training) + + if is_training: + model_outputs.update({ + 'mask_outputs': + tf.nest.map_structure(lambda x: tf.cast(x, tf.float32), + mask_outputs), + }) + else: + model_outputs.update({ + 'detection_masks': tf.nn.sigmoid(mask_outputs) + }) + + return model_outputs + + def build_loss_fn(self): + if self._keras_model is None: + raise ValueError('build_loss_fn() must be called after build_model().') + + filter_fn = self.make_filter_trainable_variables_fn() + trainable_variables = filter_fn(self._keras_model.trainable_variables) + + def _total_loss_fn(labels, outputs): + rpn_score_loss = self._rpn_score_loss_fn(outputs['rpn_score_outputs'], + labels['rpn_score_targets']) + rpn_box_loss = self._rpn_box_loss_fn(outputs['rpn_box_outputs'], + labels['rpn_box_targets']) + + frcnn_class_loss = self._frcnn_class_loss_fn(outputs['class_outputs'], + outputs['class_targets']) + frcnn_box_loss = self._frcnn_box_loss_fn(outputs['box_outputs'], + outputs['class_targets'], + outputs['box_targets']) + + if self._include_mask: + mask_loss = self._mask_loss_fn(outputs['mask_outputs'], + outputs['mask_targets'], + outputs['sampled_class_targets']) + else: + mask_loss = 0.0 + + model_loss = ( + rpn_score_loss + rpn_box_loss + frcnn_class_loss + frcnn_box_loss + + mask_loss) + + l2_regularization_loss = self.weight_decay_loss(trainable_variables) + total_loss = model_loss + l2_regularization_loss + return { + 'total_loss': total_loss, + 'loss': total_loss, + 'fast_rcnn_class_loss': frcnn_class_loss, + 'fast_rcnn_box_loss': frcnn_box_loss, + 'mask_loss': mask_loss, + 'model_loss': model_loss, + 'l2_regularization_loss': l2_regularization_loss, + 'rpn_score_loss': rpn_score_loss, + 'rpn_box_loss': rpn_box_loss, + } + + return _total_loss_fn + + def build_input_layers(self, params, mode): + is_training = mode == mode_keys.TRAIN + input_shape = ( + params.maskrcnn_parser.output_size + + [params.maskrcnn_parser.num_channels]) + if is_training: + batch_size = params.train.batch_size + input_layer = { + 'image': + tf.keras.layers.Input( + shape=input_shape, + batch_size=batch_size, + name='image', + dtype=tf.bfloat16 if self._use_bfloat16 else tf.float32), + 'image_info': + tf.keras.layers.Input( + shape=[4, 2], + batch_size=batch_size, + name='image_info', + ), + 'gt_boxes': + tf.keras.layers.Input( + shape=[params.maskrcnn_parser.max_num_instances, 4], + batch_size=batch_size, + name='gt_boxes'), + 'gt_classes': + tf.keras.layers.Input( + shape=[params.maskrcnn_parser.max_num_instances], + batch_size=batch_size, + name='gt_classes', + dtype=tf.int64), + } + if self._include_mask: + input_layer['gt_masks'] = tf.keras.layers.Input( + shape=[ + params.maskrcnn_parser.max_num_instances, + params.maskrcnn_parser.mask_crop_size, + params.maskrcnn_parser.mask_crop_size + ], + batch_size=batch_size, + name='gt_masks') + else: + batch_size = params.eval.batch_size + input_layer = { + 'image': + tf.keras.layers.Input( + shape=input_shape, + batch_size=batch_size, + name='image', + dtype=tf.bfloat16 if self._use_bfloat16 else tf.float32), + 'image_info': + tf.keras.layers.Input( + shape=[4, 2], + batch_size=batch_size, + name='image_info', + ), + } + return input_layer + + def build_model(self, params, mode): + if self._keras_model is None: + input_layers = self.build_input_layers(self._params, mode) + with backend.get_graph().as_default(): + outputs = self.model_outputs(input_layers, mode) + + model = tf.keras.models.Model( + inputs=input_layers, outputs=outputs, name='maskrcnn') + assert model is not None, 'Fail to build tf.keras.Model.' + model.optimizer = self.build_optimizer() + self._keras_model = model + + return self._keras_model + + def post_processing(self, labels, outputs): + required_output_fields = ['class_outputs', 'box_outputs'] + for field in required_output_fields: + if field not in outputs: + raise ValueError('"%s" is missing in outputs, requried %s found %s' + %(field, required_output_fields, outputs.keys())) + predictions = { + 'image_info': labels['image_info'], + 'num_detections': outputs['num_detections'], + 'detection_boxes': outputs['detection_boxes'], + 'detection_classes': outputs['detection_classes'], + 'detection_scores': outputs['detection_scores'], + } + if self._include_mask: + predictions.update({ + 'detection_masks': outputs['detection_masks'], + }) + + if 'groundtruths' in labels: + predictions['source_id'] = labels['groundtruths']['source_id'] + predictions['gt_source_id'] = labels['groundtruths']['source_id'] + predictions['gt_height'] = labels['groundtruths']['height'] + predictions['gt_width'] = labels['groundtruths']['width'] + predictions['gt_image_info'] = labels['image_info'] + predictions['gt_num_detections'] = ( + labels['groundtruths']['num_detections']) + predictions['gt_boxes'] = labels['groundtruths']['boxes'] + predictions['gt_classes'] = labels['groundtruths']['classes'] + predictions['gt_areas'] = labels['groundtruths']['areas'] + predictions['gt_is_crowds'] = labels['groundtruths']['is_crowds'] + return labels, predictions + + def eval_metrics(self): + return eval_factory.evaluator_generator(self._params.eval) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/retinanet_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/retinanet_model.py new file mode 100644 index 0000000..cf58f23 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/modeling/retinanet_model.py @@ -0,0 +1,170 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Model defination for the RetinaNet Model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import numpy as np +from absl import logging +import tensorflow.compat.v2 as tf + +from tensorflow.python.keras import backend +from official.vision.detection.dataloader import mode_keys +from official.vision.detection.evaluation import factory as eval_factory +from official.vision.detection.modeling import base_model +from official.vision.detection.modeling import losses +from official.vision.detection.modeling.architecture import factory +from official.vision.detection.ops import postprocess_ops + + +class RetinanetModel(base_model.Model): + """RetinaNet model function.""" + + def __init__(self, params): + super(RetinanetModel, self).__init__(params) + + # For eval metrics. + self._params = params + + # Architecture generators. + self._backbone_fn = factory.backbone_generator(params) + self._fpn_fn = factory.multilevel_features_generator(params) + self._head_fn = factory.retinanet_head_generator(params.retinanet_head) + + # Loss function. + self._cls_loss_fn = losses.RetinanetClassLoss(params.retinanet_loss) + self._box_loss_fn = losses.RetinanetBoxLoss(params.retinanet_loss) + self._box_loss_weight = params.retinanet_loss.box_loss_weight + self._keras_model = None + + # Predict function. + self._generate_detections_fn = postprocess_ops.MultilevelDetectionGenerator( + params.postprocess) + + self._transpose_input = params.train.transpose_input + assert not self._transpose_input, 'Transpose input is not supportted.' + # Input layer. + input_shape = ( + params.retinanet_parser.output_size + + [params.retinanet_parser.num_channels]) + self._input_layer = tf.keras.layers.Input( + shape=input_shape, name='', + dtype=tf.bfloat16 if self._use_bfloat16 else tf.float32) + + def build_outputs(self, inputs, mode): + # If the input image is transposed (from NHWC to HWCN), we need to revert it + # back to the original shape before it's used in the computation. + if self._transpose_input: + inputs = tf.transpose(inputs, [3, 0, 1, 2]) + + backbone_features = self._backbone_fn( + inputs, is_training=(mode == mode_keys.TRAIN)) + fpn_features = self._fpn_fn( + backbone_features, is_training=(mode == mode_keys.TRAIN)) + cls_outputs, box_outputs = self._head_fn( + fpn_features, is_training=(mode == mode_keys.TRAIN)) + + if self._use_bfloat16: + levels = cls_outputs.keys() + for level in levels: + cls_outputs[level] = tf.cast(cls_outputs[level], tf.float32) + box_outputs[level] = tf.cast(box_outputs[level], tf.float32) + + model_outputs = { + 'cls_outputs': cls_outputs, + 'box_outputs': box_outputs, + } + return model_outputs + + def build_loss_fn(self): + if self._keras_model is None: + raise ValueError('build_loss_fn() must be called after build_model().') + + filter_fn = self.make_filter_trainable_variables_fn() + trainable_variables = filter_fn(self._keras_model.trainable_variables) + + def _total_loss_fn(labels, outputs): + cls_loss = self._cls_loss_fn(outputs['cls_outputs'], + labels['cls_targets'], + labels['num_positives']) + box_loss = self._box_loss_fn(outputs['box_outputs'], + labels['box_targets'], + labels['num_positives']) + model_loss = cls_loss + self._box_loss_weight * box_loss + l2_regularization_loss = self.weight_decay_loss(trainable_variables) + total_loss = model_loss + l2_regularization_loss + return { + 'total_loss': total_loss, + 'cls_loss': cls_loss, + 'box_loss': box_loss, + 'model_loss': model_loss, + 'l2_regularization_loss': l2_regularization_loss, + } + + return _total_loss_fn + + def build_model(self, params, mode=None): + if self._keras_model is None: + with backend.get_graph().as_default(): + outputs = self.model_outputs(self._input_layer, mode) + + model = tf.keras.models.Model( + inputs=self._input_layer, outputs=outputs, name='retinanet') + assert model is not None, 'Fail to build tf.keras.Model.' + model.optimizer = self.build_optimizer() + self._keras_model = model + + return self._keras_model + + def post_processing(self, labels, outputs): + # TODO(yeqing): Moves the output related part into build_outputs. + required_output_fields = ['cls_outputs', 'box_outputs'] + for field in required_output_fields: + if field not in outputs: + raise ValueError('"%s" is missing in outputs, requried %s found %s', + field, required_output_fields, outputs.keys()) + required_label_fields = ['image_info', 'groundtruths'] + for field in required_label_fields: + if field not in labels: + raise ValueError('"%s" is missing in outputs, requried %s found %s', + field, required_label_fields, labels.keys()) + boxes, scores, classes, valid_detections = self._generate_detections_fn( + outputs['box_outputs'], outputs['cls_outputs'], + labels['anchor_boxes'], labels['image_info'][:, 1:2, :]) + # Discards the old output tensors to save memory. The `cls_outputs` and + # `box_outputs` are pretty big and could potentiall lead to memory issue. + outputs = { + 'source_id': labels['groundtruths']['source_id'], + 'image_info': labels['image_info'], + 'num_detections': valid_detections, + 'detection_boxes': boxes, + 'detection_classes': classes, + 'detection_scores': scores, + } + + if 'groundtruths' in labels: + labels['source_id'] = labels['groundtruths']['source_id'] + labels['boxes'] = labels['groundtruths']['boxes'] + labels['classes'] = labels['groundtruths']['classes'] + labels['areas'] = labels['groundtruths']['areas'] + labels['is_crowds'] = labels['groundtruths']['is_crowds'] + + return labels, outputs + + def eval_metrics(self): + return eval_factory.evaluator_generator(self._params.eval) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/nms.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/nms.py new file mode 100644 index 0000000..c6efead --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/nms.py @@ -0,0 +1,205 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tensorflow implementation of non max suppression.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils import box_utils + + +NMS_TILE_SIZE = 512 + + +def _self_suppression(iou, _, iou_sum): + batch_size = tf.shape(iou)[0] + can_suppress_others = tf.cast( + tf.reshape(tf.reduce_max(iou, 1) <= 0.5, [batch_size, -1, 1]), iou.dtype) + iou_suppressed = tf.reshape( + tf.cast(tf.reduce_max(can_suppress_others * iou, 1) <= 0.5, iou.dtype), + [batch_size, -1, 1]) * iou + iou_sum_new = tf.reduce_sum(iou_suppressed, [1, 2]) + return [ + iou_suppressed, + tf.reduce_any(iou_sum - iou_sum_new > 0.5), iou_sum_new + ] + + +def _cross_suppression(boxes, box_slice, iou_threshold, inner_idx): + batch_size = tf.shape(boxes)[0] + new_slice = tf.slice(boxes, [0, inner_idx * NMS_TILE_SIZE, 0], + [batch_size, NMS_TILE_SIZE, 4]) + iou = box_utils.bbox_overlap(new_slice, box_slice) + ret_slice = tf.expand_dims( + tf.cast(tf.reduce_all(iou < iou_threshold, [1]), box_slice.dtype), + 2) * box_slice + return boxes, ret_slice, iou_threshold, inner_idx + 1 + + +def _suppression_loop_body(boxes, iou_threshold, output_size, idx): + """Process boxes in the range [idx*NMS_TILE_SIZE, (idx+1)*NMS_TILE_SIZE). + + Args: + boxes: a tensor with a shape of [batch_size, anchors, 4]. + iou_threshold: a float representing the threshold for deciding whether boxes + overlap too much with respect to IOU. + output_size: an int32 tensor of size [batch_size]. Representing the number + of selected boxes for each batch. + idx: an integer scalar representing induction variable. + + Returns: + boxes: updated boxes. + iou_threshold: pass down iou_threshold to the next iteration. + output_size: the updated output_size. + idx: the updated induction variable. + """ + num_tiles = tf.shape(boxes)[1] // NMS_TILE_SIZE + batch_size = tf.shape(boxes)[0] + + # Iterates over tiles that can possibly suppress the current tile. + box_slice = tf.slice(boxes, [0, idx * NMS_TILE_SIZE, 0], + [batch_size, NMS_TILE_SIZE, 4]) + _, box_slice, _, _ = tf.while_loop( + lambda _boxes, _box_slice, _threshold, inner_idx: inner_idx < idx, + _cross_suppression, [boxes, box_slice, iou_threshold, + tf.constant(0)]) + + # Iterates over the current tile to compute self-suppression. + iou = box_utils.bbox_overlap(box_slice, box_slice) + mask = tf.expand_dims( + tf.reshape(tf.range(NMS_TILE_SIZE), [1, -1]) > tf.reshape( + tf.range(NMS_TILE_SIZE), [-1, 1]), 0) + iou *= tf.cast(tf.logical_and(mask, iou >= iou_threshold), iou.dtype) + suppressed_iou, _, _ = tf.while_loop( + lambda _iou, loop_condition, _iou_sum: loop_condition, _self_suppression, + [iou, tf.constant(True), + tf.reduce_sum(iou, [1, 2])]) + suppressed_box = tf.reduce_sum(suppressed_iou, 1) > 0 + box_slice *= tf.expand_dims(1.0 - tf.cast(suppressed_box, box_slice.dtype), 2) + + # Uses box_slice to update the input boxes. + mask = tf.reshape( + tf.cast(tf.equal(tf.range(num_tiles), idx), boxes.dtype), [1, -1, 1, 1]) + boxes = tf.tile(tf.expand_dims( + box_slice, [1]), [1, num_tiles, 1, 1]) * mask + tf.reshape( + boxes, [batch_size, num_tiles, NMS_TILE_SIZE, 4]) * (1 - mask) + boxes = tf.reshape(boxes, [batch_size, -1, 4]) + + # Updates output_size. + output_size += tf.reduce_sum( + tf.cast(tf.reduce_any(box_slice > 0, [2]), tf.int32), [1]) + return boxes, iou_threshold, output_size, idx + 1 + + +def sorted_non_max_suppression_padded(scores, + boxes, + max_output_size, + iou_threshold): + """A wrapper that handles non-maximum suppression. + + Assumption: + * The boxes are sorted by scores unless the box is a dot (all coordinates + are zero). + * Boxes with higher scores can be used to suppress boxes with lower scores. + + The overal design of the algorithm is to handle boxes tile-by-tile: + + boxes = boxes.pad_to_multiply_of(tile_size) + num_tiles = len(boxes) // tile_size + output_boxes = [] + for i in range(num_tiles): + box_tile = boxes[i*tile_size : (i+1)*tile_size] + for j in range(i - 1): + suppressing_tile = boxes[j*tile_size : (j+1)*tile_size] + iou = bbox_overlap(box_tile, suppressing_tile) + # if the box is suppressed in iou, clear it to a dot + box_tile *= _update_boxes(iou) + # Iteratively handle the diagnal tile. + iou = _box_overlap(box_tile, box_tile) + iou_changed = True + while iou_changed: + # boxes that are not suppressed by anything else + suppressing_boxes = _get_suppressing_boxes(iou) + # boxes that are suppressed by suppressing_boxes + suppressed_boxes = _get_suppressed_boxes(iou, suppressing_boxes) + # clear iou to 0 for boxes that are suppressed, as they cannot be used + # to suppress other boxes any more + new_iou = _clear_iou(iou, suppressed_boxes) + iou_changed = (new_iou != iou) + iou = new_iou + # remaining boxes that can still suppress others, are selected boxes. + output_boxes.append(_get_suppressing_boxes(iou)) + if len(output_boxes) >= max_output_size: + break + + Args: + scores: a tensor with a shape of [batch_size, anchors]. + boxes: a tensor with a shape of [batch_size, anchors, 4]. + max_output_size: a scalar integer `Tensor` representing the maximum number + of boxes to be selected by non max suppression. + iou_threshold: a float representing the threshold for deciding whether boxes + overlap too much with respect to IOU. + + Returns: + nms_scores: a tensor with a shape of [batch_size, anchors]. It has same + dtype as input scores. + nms_proposals: a tensor with a shape of [batch_size, anchors, 4]. It has + same dtype as input boxes. + """ + batch_size = tf.shape(boxes)[0] + num_boxes = tf.shape(boxes)[1] + pad = tf.cast( + tf.math.ceil(tf.cast(num_boxes, tf.float32) / NMS_TILE_SIZE), + tf.int32) * NMS_TILE_SIZE - num_boxes + boxes = tf.pad(tf.cast(boxes, tf.float32), [[0, 0], [0, pad], [0, 0]]) + scores = tf.pad( + tf.cast(scores, tf.float32), [[0, 0], [0, pad]], constant_values=-1) + num_boxes += pad + + def _loop_cond(unused_boxes, unused_threshold, output_size, idx): + return tf.logical_and( + tf.reduce_min(output_size) < max_output_size, + idx < num_boxes // NMS_TILE_SIZE) + + selected_boxes, _, output_size, _ = tf.while_loop( + _loop_cond, _suppression_loop_body, [ + boxes, iou_threshold, + tf.zeros([batch_size], tf.int32), + tf.constant(0) + ]) + idx = num_boxes - tf.cast( + tf.nn.top_k( + tf.cast(tf.reduce_any(selected_boxes > 0, [2]), tf.int32) * + tf.expand_dims(tf.range(num_boxes, 0, -1), 0), max_output_size)[0], + tf.int32) + idx = tf.minimum(idx, num_boxes - 1) + idx = tf.reshape( + idx + tf.reshape(tf.range(batch_size) * num_boxes, [-1, 1]), [-1]) + boxes = tf.reshape( + tf.gather(tf.reshape(boxes, [-1, 4]), idx), + [batch_size, max_output_size, 4]) + boxes = boxes * tf.cast( + tf.reshape(tf.range(max_output_size), [1, -1, 1]) < tf.reshape( + output_size, [-1, 1, 1]), boxes.dtype) + scores = tf.reshape( + tf.gather(tf.reshape(scores, [-1, 1]), idx), + [batch_size, max_output_size]) + scores = scores * tf.cast( + tf.reshape(tf.range(max_output_size), [1, -1]) < tf.reshape( + output_size, [-1, 1]), scores.dtype) + return scores, boxes diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/postprocess_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/postprocess_ops.py new file mode 100644 index 0000000..209555e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/postprocess_ops.py @@ -0,0 +1,412 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Post-processing model outputs to generate detection.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import tensorflow.compat.v2 as tf + +from official.vision.detection.ops import nms +from official.vision.detection.utils import box_utils + + +def generate_detections_factory(params): + """Factory to select function to generate detection.""" + if params.use_batched_nms: + func = functools.partial( + _generate_detections_batched, + max_total_size=params.max_total_size, + nms_iou_threshold=params.nms_iou_threshold, + score_threshold=params.score_threshold) + else: + func = functools.partial( + _generate_detections, + max_total_size=params.max_total_size, + nms_iou_threshold=params.nms_iou_threshold, + score_threshold=params.score_threshold, + pre_nms_num_boxes=params.pre_nms_num_boxes) + return func + + +def _select_top_k_scores(scores_in, pre_nms_num_detections): + """Select top_k scores and indices for each class. + + Args: + scores_in: a Tensor with shape [batch_size, N, num_classes], which stacks + class logit outputs on all feature levels. The N is the number of total + anchors on all levels. The num_classes is the number of classes predicted + by the model. + pre_nms_num_detections: Number of candidates before NMS. + + Returns: + scores and indices: Tensors with shape [batch_size, pre_nms_num_detections, + num_classes]. + """ + batch_size, num_anchors, num_class = scores_in.get_shape().as_list() + scores_trans = tf.transpose(scores_in, perm=[0, 2, 1]) + scores_trans = tf.reshape(scores_trans, [-1, num_anchors]) + + top_k_scores, top_k_indices = tf.nn.top_k( + scores_trans, k=pre_nms_num_detections, sorted=True) + + top_k_scores = tf.reshape(top_k_scores, + [batch_size, num_class, pre_nms_num_detections]) + top_k_indices = tf.reshape(top_k_indices, + [batch_size, num_class, pre_nms_num_detections]) + + return tf.transpose(top_k_scores, + [0, 2, 1]), tf.transpose(top_k_indices, [0, 2, 1]) + + +def _generate_detections(boxes, + scores, + max_total_size=100, + nms_iou_threshold=0.3, + score_threshold=0.05, + pre_nms_num_boxes=5000): + """Generate the final detections given the model outputs. + + This uses classes unrolling with while loop based NMS, could be parralled + at batch dimension. + + Args: + boxes: a tensor with shape [batch_size, N, num_classes, 4] or [batch_size, + N, 1, 4], which box predictions on all feature levels. The N is the number + of total anchors on all levels. + scores: a tensor with shape [batch_size, N, num_classes], which stacks class + probability on all feature levels. The N is the number of total anchors on + all levels. The num_classes is the number of classes predicted by the + model. Note that the class_outputs here is the raw score. + max_total_size: a scalar representing maximum number of boxes retained over + all classes. + nms_iou_threshold: a float representing the threshold for deciding whether + boxes overlap too much with respect to IOU. + score_threshold: a float representing the threshold for deciding when to + remove boxes based on score. + pre_nms_num_boxes: an int number of top candidate detections per class + before NMS. + + Returns: + nms_boxes: `float` Tensor of shape [batch_size, max_total_size, 4] + representing top detected boxes in [y1, x1, y2, x2]. + nms_scores: `float` Tensor of shape [batch_size, max_total_size] + representing sorted confidence scores for detected boxes. The values are + between [0, 1]. + nms_classes: `int` Tensor of shape [batch_size, max_total_size] representing + classes for detected boxes. + valid_detections: `int` Tensor of shape [batch_size] only the top + `valid_detections` boxes are valid detections. + """ + with tf.name_scope('generate_detections'): + nmsed_boxes = [] + nmsed_classes = [] + nmsed_scores = [] + valid_detections = [] + batch_size, _, num_classes_for_box, _ = boxes.get_shape().as_list() + _, total_anchors, num_classes = scores.get_shape().as_list() + # Selects top pre_nms_num scores and indices before NMS. + scores, indices = _select_top_k_scores( + scores, min(total_anchors, pre_nms_num_boxes)) + for i in range(num_classes): + boxes_i = boxes[:, :, min(num_classes_for_box - 1, i), :] + scores_i = scores[:, :, i] + # Obtains pre_nms_num_boxes before running NMS. + boxes_i = tf.gather(boxes_i, indices[:, :, i], batch_dims=1, axis=1) + + # Filter out scores. + boxes_i, scores_i = box_utils.filter_boxes_by_scores( + boxes_i, scores_i, min_score_threshold=score_threshold) + + (nmsed_scores_i, nmsed_boxes_i) = nms.sorted_non_max_suppression_padded( + tf.cast(scores_i, tf.float32), + tf.cast(boxes_i, tf.float32), + max_total_size, + iou_threshold=nms_iou_threshold) + nmsed_classes_i = tf.fill([batch_size, max_total_size], i) + nmsed_boxes.append(nmsed_boxes_i) + nmsed_scores.append(nmsed_scores_i) + nmsed_classes.append(nmsed_classes_i) + nmsed_boxes = tf.concat(nmsed_boxes, axis=1) + nmsed_scores = tf.concat(nmsed_scores, axis=1) + nmsed_classes = tf.concat(nmsed_classes, axis=1) + nmsed_scores, indices = tf.nn.top_k( + nmsed_scores, k=max_total_size, sorted=True) + nmsed_boxes = tf.gather(nmsed_boxes, indices, batch_dims=1, axis=1) + nmsed_classes = tf.gather(nmsed_classes, indices, batch_dims=1) + valid_detections = tf.reduce_sum( + input_tensor=tf.cast(tf.greater(nmsed_scores, -1), tf.int32), axis=1) + return nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections + + +def _generate_detections_per_image(boxes, + scores, + max_total_size=100, + nms_iou_threshold=0.3, + score_threshold=0.05, + pre_nms_num_boxes=5000): + """Generate the final detections per image given the model outputs. + + Args: + boxes: a tensor with shape [N, num_classes, 4] or [N, 1, 4], which box + predictions on all feature levels. The N is the number of total anchors on + all levels. + scores: a tensor with shape [N, num_classes], which stacks class probability + on all feature levels. The N is the number of total anchors on all levels. + The num_classes is the number of classes predicted by the model. Note that + the class_outputs here is the raw score. + max_total_size: a scalar representing maximum number of boxes retained over + all classes. + nms_iou_threshold: a float representing the threshold for deciding whether + boxes overlap too much with respect to IOU. + score_threshold: a float representing the threshold for deciding when to + remove boxes based on score. + pre_nms_num_boxes: an int number of top candidate detections per class + before NMS. + + Returns: + nms_boxes: `float` Tensor of shape [max_total_size, 4] representing top + detected boxes in [y1, x1, y2, x2]. + nms_scores: `float` Tensor of shape [max_total_size] representing sorted + confidence scores for detected boxes. The values are between [0, 1]. + nms_classes: `int` Tensor of shape [max_total_size] representing classes for + detected boxes. + valid_detections: `int` Tensor of shape [1] only the top `valid_detections` + boxes are valid detections. + """ + nmsed_boxes = [] + nmsed_scores = [] + nmsed_classes = [] + num_classes_for_box = boxes.get_shape().as_list()[1] + num_classes = scores.get_shape().as_list()[1] + for i in range(num_classes): + boxes_i = boxes[:, min(num_classes_for_box - 1, i)] + scores_i = scores[:, i] + + # Obtains pre_nms_num_boxes before running NMS. + scores_i, indices = tf.nn.top_k( + scores_i, k=tf.minimum(tf.shape(input=scores_i)[-1], pre_nms_num_boxes)) + boxes_i = tf.gather(boxes_i, indices) + + (nmsed_indices_i, + nmsed_num_valid_i) = tf.image.non_max_suppression_padded( + tf.cast(boxes_i, tf.float32), + tf.cast(scores_i, tf.float32), + max_total_size, + iou_threshold=nms_iou_threshold, + score_threshold=score_threshold, + pad_to_max_output_size=True, + name='nms_detections_' + str(i)) + nmsed_boxes_i = tf.gather(boxes_i, nmsed_indices_i) + nmsed_scores_i = tf.gather(scores_i, nmsed_indices_i) + # Sets scores of invalid boxes to -1. + nmsed_scores_i = tf.where( + tf.less(tf.range(max_total_size), [nmsed_num_valid_i]), nmsed_scores_i, + -tf.ones_like(nmsed_scores_i)) + nmsed_classes_i = tf.fill([max_total_size], i) + nmsed_boxes.append(nmsed_boxes_i) + nmsed_scores.append(nmsed_scores_i) + nmsed_classes.append(nmsed_classes_i) + + # Concats results from all classes and sort them. + nmsed_boxes = tf.concat(nmsed_boxes, axis=0) + nmsed_scores = tf.concat(nmsed_scores, axis=0) + nmsed_classes = tf.concat(nmsed_classes, axis=0) + nmsed_scores, indices = tf.nn.top_k( + nmsed_scores, k=max_total_size, sorted=True) + nmsed_boxes = tf.gather(nmsed_boxes, indices) + nmsed_classes = tf.gather(nmsed_classes, indices) + valid_detections = tf.reduce_sum( + input_tensor=tf.cast(tf.greater(nmsed_scores, -1), tf.int32)) + return nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections + + +def _generate_detections_batched(boxes, + scores, + max_total_size, + nms_iou_threshold, + score_threshold): + """Generates detected boxes with scores and classes for one-stage detector. + + The function takes output of multi-level ConvNets and anchor boxes and + generates detected boxes. Note that this used batched nms, which is not + supported on TPU currently. + + Args: + boxes: a tensor with shape [batch_size, N, num_classes, 4] or + [batch_size, N, 1, 4], which box predictions on all feature levels. The N + is the number of total anchors on all levels. + scores: a tensor with shape [batch_size, N, num_classes], which + stacks class probability on all feature levels. The N is the number of + total anchors on all levels. The num_classes is the number of classes + predicted by the model. Note that the class_outputs here is the raw score. + max_total_size: a scalar representing maximum number of boxes retained over + all classes. + nms_iou_threshold: a float representing the threshold for deciding whether + boxes overlap too much with respect to IOU. + score_threshold: a float representing the threshold for deciding when to + remove boxes based on score. + Returns: + nms_boxes: `float` Tensor of shape [batch_size, max_total_size, 4] + representing top detected boxes in [y1, x1, y2, x2]. + nms_scores: `float` Tensor of shape [batch_size, max_total_size] + representing sorted confidence scores for detected boxes. The values are + between [0, 1]. + nms_classes: `int` Tensor of shape [batch_size, max_total_size] representing + classes for detected boxes. + valid_detections: `int` Tensor of shape [batch_size] only the top + `valid_detections` boxes are valid detections. + """ + with tf.name_scope('generate_detections'): + # TODO(tsungyi): Removes normalization/denomalization once the + # tf.image.combined_non_max_suppression is coordinate system agnostic. + # Normalizes maximum box cooridinates to 1. + normalizer = tf.reduce_max(boxes) + boxes /= normalizer + (nmsed_boxes, nmsed_scores, nmsed_classes, + valid_detections) = tf.image.combined_non_max_suppression( + boxes, + scores, + max_output_size_per_class=max_total_size, + max_total_size=max_total_size, + iou_threshold=nms_iou_threshold, + score_threshold=score_threshold, + pad_per_class=False,) + # De-normalizes box cooridinates. + nmsed_boxes *= normalizer + return nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections + + +class MultilevelDetectionGenerator(object): + """Generates detected boxes with scores and classes for one-stage detector.""" + + def __init__(self, params): + self._generate_detections = generate_detections_factory(params) + self._min_level = params.min_level + self._max_level = params.max_level + + def __call__(self, box_outputs, class_outputs, anchor_boxes, image_shape): + # Collects outputs from all levels into a list. + boxes = [] + scores = [] + for i in range(self._min_level, self._max_level + 1): + box_outputs_i_shape = tf.shape(box_outputs[i]) + batch_size = box_outputs_i_shape[0] + num_anchors_per_locations = box_outputs_i_shape[-1] // 4 + num_classes = tf.shape(class_outputs[i])[-1] // num_anchors_per_locations + + # Applies score transformation and remove the implicit background class. + scores_i = tf.sigmoid( + tf.reshape(class_outputs[i], [batch_size, -1, num_classes])) + scores_i = tf.slice(scores_i, [0, 0, 1], [-1, -1, -1]) + + # Box decoding. + # The anchor boxes are shared for all data in a batch. + # One stage detector only supports class agnostic box regression. + anchor_boxes_i = tf.reshape(anchor_boxes[i], [batch_size, -1, 4]) + box_outputs_i = tf.reshape(box_outputs[i], [batch_size, -1, 4]) + boxes_i = box_utils.decode_boxes(box_outputs_i, anchor_boxes_i) + + # Box clipping. + boxes_i = box_utils.clip_boxes(boxes_i, image_shape) + + boxes.append(boxes_i) + scores.append(scores_i) + boxes = tf.concat(boxes, axis=1) + scores = tf.concat(scores, axis=1) + + nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections = ( + self._generate_detections(tf.expand_dims(boxes, axis=2), scores)) + + # Adds 1 to offset the background class which has index 0. + nmsed_classes += 1 + return nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections + + +class GenericDetectionGenerator(object): + """Generates the final detected boxes with scores and classes.""" + + def __init__(self, params): + self._generate_detections = generate_detections_factory(params) + + def __call__(self, box_outputs, class_outputs, anchor_boxes, image_shape): + """Generate final detections. + + Args: + box_outputs: a tensor of shape of [batch_size, K, num_classes * 4] + representing the class-specific box coordinates relative to anchors. + class_outputs: a tensor of shape of [batch_size, K, num_classes] + representing the class logits before applying score activiation. + anchor_boxes: a tensor of shape of [batch_size, K, 4] representing the + corresponding anchor boxes w.r.t `box_outputs`. + image_shape: a tensor of shape of [batch_size, 2] storing the image height + and width w.r.t. the scaled image, i.e. the same image space as + `box_outputs` and `anchor_boxes`. + + Returns: + nms_boxes: `float` Tensor of shape [batch_size, max_total_size, 4] + representing top detected boxes in [y1, x1, y2, x2]. + nms_scores: `float` Tensor of shape [batch_size, max_total_size] + representing sorted confidence scores for detected boxes. The values are + between [0, 1]. + nms_classes: `int` Tensor of shape [batch_size, max_total_size] + representing classes for detected boxes. + valid_detections: `int` Tensor of shape [batch_size] only the top + `valid_detections` boxes are valid detections. + """ + class_outputs = tf.nn.softmax(class_outputs, axis=-1) + + # Removes the background class. + class_outputs_shape = tf.shape(class_outputs) + batch_size = class_outputs_shape[0] + num_locations = class_outputs_shape[1] + num_classes = class_outputs_shape[-1] + num_detections = num_locations * (num_classes - 1) + + class_outputs = tf.slice(class_outputs, [0, 0, 1], [-1, -1, -1]) + box_outputs = tf.reshape( + box_outputs, + tf.stack([batch_size, num_locations, num_classes, 4], axis=-1)) + box_outputs = tf.slice( + box_outputs, [0, 0, 1, 0], [-1, -1, -1, -1]) + anchor_boxes = tf.tile( + tf.expand_dims(anchor_boxes, axis=2), [1, 1, num_classes - 1, 1]) + box_outputs = tf.reshape( + box_outputs, + tf.stack([batch_size, num_detections, 4], axis=-1)) + anchor_boxes = tf.reshape( + anchor_boxes, + tf.stack([batch_size, num_detections, 4], axis=-1)) + + # Box decoding. + decoded_boxes = box_utils.decode_boxes( + box_outputs, anchor_boxes, weights=[10.0, 10.0, 5.0, 5.0]) + + # Box clipping + decoded_boxes = box_utils.clip_boxes(decoded_boxes, image_shape) + + decoded_boxes = tf.reshape( + decoded_boxes, + tf.stack([batch_size, num_locations, num_classes - 1, 4], axis=-1)) + + nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections = ( + self._generate_detections(decoded_boxes, class_outputs)) + + # Adds 1 to offset the background class which has index 0. + nmsed_classes += 1 + + return nmsed_boxes, nmsed_scores, nmsed_classes, valid_detections diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/roi_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/roi_ops.py new file mode 100644 index 0000000..2eab277 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/roi_ops.py @@ -0,0 +1,237 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ROI-related ops.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from official.vision.detection.ops import nms +from official.vision.detection.utils import box_utils + + +def multilevel_propose_rois(rpn_boxes, + rpn_scores, + anchor_boxes, + image_shape, + rpn_pre_nms_top_k=2000, + rpn_post_nms_top_k=1000, + rpn_nms_threshold=0.7, + rpn_score_threshold=0.0, + rpn_min_size_threshold=0.0, + decode_boxes=True, + clip_boxes=True, + use_batched_nms=False, + apply_sigmoid_to_score=True): + """Proposes RoIs given a group of candidates from different FPN levels. + + The following describes the steps: + 1. For each individual level: + a. Apply sigmoid transform if specified. + b. Decode boxes if specified. + c. Clip boxes if specified. + d. Filter small boxes and those fall outside image if specified. + e. Apply pre-NMS filtering including pre-NMS top k and score thresholding. + f. Apply NMS. + 2. Aggregate post-NMS boxes from each level. + 3. Apply an overall top k to generate the final selected RoIs. + + Args: + rpn_boxes: a dict with keys representing FPN levels and values representing + box tenors of shape [batch_size, feature_h, feature_w, num_anchors * 4]. + rpn_scores: a dict with keys representing FPN levels and values representing + logit tensors of shape [batch_size, feature_h, feature_w, num_anchors]. + anchor_boxes: a dict with keys representing FPN levels and values + representing anchor box tensors of shape + [batch_size, feature_h, feature_w, num_anchors * 4]. + image_shape: a tensor of shape [batch_size, 2] where the last dimension are + [height, width] of the scaled image. + rpn_pre_nms_top_k: an integer of top scoring RPN proposals *per level* to + keep before applying NMS. Default: 2000. + rpn_post_nms_top_k: an integer of top scoring RPN proposals *in total* to + keep after applying NMS. Default: 1000. + rpn_nms_threshold: a float between 0 and 1 representing the IoU threshold + used for NMS. If 0.0, no NMS is applied. Default: 0.7. + rpn_score_threshold: a float between 0 and 1 representing the minimal box + score to keep before applying NMS. This is often used as a pre-filtering + step for better performance. If 0, no filtering is applied. Default: 0. + rpn_min_size_threshold: a float representing the minimal box size in each + side (w.r.t. the scaled image) to keep before applying NMS. This is often + used as a pre-filtering step for better performance. If 0, no filtering is + applied. Default: 0. + decode_boxes: a boolean indicating whether `rpn_boxes` needs to be decoded + using `anchor_boxes`. If False, use `rpn_boxes` directly and ignore + `anchor_boxes`. Default: True. + clip_boxes: a boolean indicating whether boxes are first clipped to the + scaled image size before appliying NMS. If False, no clipping is applied + and `image_shape` is ignored. Default: True. + use_batched_nms: a boolean indicating whether NMS is applied in batch using + `tf.image.combined_non_max_suppression`. Currently only available in + CPU/GPU. Default: False. + apply_sigmoid_to_score: a boolean indicating whether apply sigmoid to + `rpn_scores` before applying NMS. Default: True. + + Returns: + selected_rois: a tensor of shape [batch_size, rpn_post_nms_top_k, 4], + representing the box coordinates of the selected proposals w.r.t. the + scaled image. + selected_roi_scores: a tensor of shape [batch_size, rpn_post_nms_top_k, 1], + representing the scores of the selected proposals. + """ + with tf.name_scope('multilevel_propose_rois'): + rois = [] + roi_scores = [] + image_shape = tf.expand_dims(image_shape, axis=1) + for level in sorted(rpn_scores.keys()): + with tf.name_scope('level_%d' % level): + _, feature_h, feature_w, num_anchors_per_location = ( + rpn_scores[level].get_shape().as_list()) + + num_boxes = feature_h * feature_w * num_anchors_per_location + this_level_scores = tf.reshape(rpn_scores[level], [-1, num_boxes]) + this_level_boxes = tf.reshape(rpn_boxes[level], [-1, num_boxes, 4]) + this_level_anchors = tf.cast( + tf.reshape(anchor_boxes[level], [-1, num_boxes, 4]), + dtype=this_level_scores.dtype) + + if apply_sigmoid_to_score: + this_level_scores = tf.sigmoid(this_level_scores) + + if decode_boxes: + this_level_boxes = box_utils.decode_boxes( + this_level_boxes, this_level_anchors) + if clip_boxes: + this_level_boxes = box_utils.clip_boxes( + this_level_boxes, image_shape) + + if rpn_min_size_threshold > 0.0: + this_level_boxes, this_level_scores = box_utils.filter_boxes( + this_level_boxes, + this_level_scores, + image_shape, + rpn_min_size_threshold) + + this_level_pre_nms_top_k = min(num_boxes, rpn_pre_nms_top_k) + this_level_post_nms_top_k = min(num_boxes, rpn_post_nms_top_k) + if rpn_nms_threshold > 0.0: + if use_batched_nms: + this_level_rois, this_level_roi_scores, _, _ = ( + tf.image.combined_non_max_suppression( + tf.expand_dims(this_level_boxes, axis=2), + tf.expand_dims(this_level_scores, axis=-1), + max_output_size_per_class=this_level_pre_nms_top_k, + max_total_size=this_level_post_nms_top_k, + iou_threshold=rpn_nms_threshold, + score_threshold=rpn_score_threshold, + pad_per_class=False, + clip_boxes=False)) + else: + if rpn_score_threshold > 0.0: + this_level_boxes, this_level_scores = ( + box_utils.filter_boxes_by_scores( + this_level_boxes, this_level_scores, rpn_score_threshold)) + this_level_boxes, this_level_scores = box_utils.top_k_boxes( + this_level_boxes, this_level_scores, k=this_level_pre_nms_top_k) + this_level_roi_scores, this_level_rois = ( + nms.sorted_non_max_suppression_padded( + this_level_scores, + this_level_boxes, + max_output_size=this_level_post_nms_top_k, + iou_threshold=rpn_nms_threshold)) + else: + this_level_rois, this_level_roi_scores = box_utils.top_k_boxes( + this_level_rois, + this_level_scores, + k=this_level_post_nms_top_k) + + rois.append(this_level_rois) + roi_scores.append(this_level_roi_scores) + + all_rois = tf.concat(rois, axis=1) + all_roi_scores = tf.concat(roi_scores, axis=1) + + with tf.name_scope('top_k_rois'): + _, num_valid_rois = all_roi_scores.get_shape().as_list() + overall_top_k = min(num_valid_rois, rpn_post_nms_top_k) + + selected_rois, selected_roi_scores = box_utils.top_k_boxes( + all_rois, all_roi_scores, k=overall_top_k) + + return selected_rois, selected_roi_scores + + +class ROIGenerator(object): + """Proposes RoIs for the second stage processing.""" + + def __init__(self, params): + self._rpn_pre_nms_top_k = params.rpn_pre_nms_top_k + self._rpn_post_nms_top_k = params.rpn_post_nms_top_k + self._rpn_nms_threshold = params.rpn_nms_threshold + self._rpn_score_threshold = params.rpn_score_threshold + self._rpn_min_size_threshold = params.rpn_min_size_threshold + self._test_rpn_pre_nms_top_k = params.test_rpn_pre_nms_top_k + self._test_rpn_post_nms_top_k = params.test_rpn_post_nms_top_k + self._test_rpn_nms_threshold = params.test_rpn_nms_threshold + self._test_rpn_score_threshold = params.test_rpn_score_threshold + self._test_rpn_min_size_threshold = params.test_rpn_min_size_threshold + self._use_batched_nms = params.use_batched_nms + + def __call__(self, boxes, scores, anchor_boxes, image_shape, is_training): + """Generates RoI proposals. + + Args: + boxes: a dict with keys representing FPN levels and values representing + box tenors of shape [batch_size, feature_h, feature_w, num_anchors * 4]. + scores: a dict with keys representing FPN levels and values representing + logit tensors of shape [batch_size, feature_h, feature_w, num_anchors]. + anchor_boxes: a dict with keys representing FPN levels and values + representing anchor box tensors of shape + [batch_size, feature_h, feature_w, num_anchors * 4]. + image_shape: a tensor of shape [batch_size, 2] where the last dimension + are [height, width] of the scaled image. + is_training: a bool indicating whether it is in training or inference + mode. + + Returns: + proposed_rois: a tensor of shape [batch_size, rpn_post_nms_top_k, 4], + representing the box coordinates of the proposed RoIs w.r.t. the + scaled image. + proposed_roi_scores: a tensor of shape + [batch_size, rpn_post_nms_top_k, 1], representing the scores of the + proposed RoIs. + + """ + proposed_rois, proposed_roi_scores = multilevel_propose_rois( + boxes, + scores, + anchor_boxes, + image_shape, + rpn_pre_nms_top_k=(self._rpn_pre_nms_top_k if is_training + else self._test_rpn_pre_nms_top_k), + rpn_post_nms_top_k=(self._rpn_post_nms_top_k if is_training + else self._test_rpn_post_nms_top_k), + rpn_nms_threshold=(self._rpn_nms_threshold if is_training + else self._test_rpn_nms_threshold), + rpn_score_threshold=(self._rpn_score_threshold if is_training + else self._test_rpn_score_threshold), + rpn_min_size_threshold=(self._rpn_min_size_threshold if is_training + else self._test_rpn_min_size_threshold), + decode_boxes=True, + clip_boxes=True, + use_batched_nms=self._use_batched_nms, + apply_sigmoid_to_score=True) + return proposed_rois, proposed_roi_scores diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/sampling_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/sampling_ops.py new file mode 100644 index 0000000..1777b9d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/sampling_ops.py @@ -0,0 +1,399 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Sampling related ops.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from official.vision.detection.ops import spatial_transform_ops +from official.vision.detection.utils import box_utils +from official.vision.detection.utils.object_detection import balanced_positive_negative_sampler + + +def box_matching(boxes, gt_boxes, gt_classes): + """Match boxes to groundtruth boxes. + + Given the proposal boxes and the groundtruth boxes and classes, perform the + groundtruth matching by taking the argmax of the IoU between boxes and + groundtruth boxes. + + Args: + boxes: a tensor of shape of [batch_size, N, 4] representing the box + coordiantes to be matched to groundtruth boxes. + gt_boxes: a tensor of shape of [batch_size, MAX_INSTANCES, 4] representing + the groundtruth box coordinates. It is padded with -1s to indicate the + invalid boxes. + gt_classes: [batch_size, MAX_INSTANCES] representing the groundtruth box + classes. It is padded with -1s to indicate the invalid classes. + + Returns: + matched_gt_boxes: a tensor of shape of [batch_size, N, 4], representing + the matched groundtruth box coordinates for each input box. If the box + does not overlap with any groundtruth boxes, the matched boxes of it + will be set to all 0s. + matched_gt_classes: a tensor of shape of [batch_size, N], representing + the matched groundtruth classes for each input box. If the box does not + overlap with any groundtruth boxes, the matched box classes of it will + be set to 0, which corresponds to the background class. + matched_gt_indices: a tensor of shape of [batch_size, N], representing + the indices of the matched groundtruth boxes in the original gt_boxes + tensor. If the box does not overlap with any groundtruth boxes, the + index of the matched groundtruth will be set to -1. + matched_iou: a tensor of shape of [batch_size, N], representing the IoU + between the box and its matched groundtruth box. The matched IoU is the + maximum IoU of the box and all the groundtruth boxes. + iou: a tensor of shape of [batch_size, N, K], representing the IoU matrix + between boxes and the groundtruth boxes. The IoU between a box and the + invalid groundtruth boxes whose coordinates are [-1, -1, -1, -1] is -1. + """ + # Compute IoU between boxes and gt_boxes. + # iou <- [batch_size, N, K] + iou = box_utils.bbox_overlap(boxes, gt_boxes) + + # max_iou <- [batch_size, N] + # 0.0 -> no match to gt, or -1.0 match to no gt + matched_iou = tf.reduce_max(iou, axis=-1) + + # background_box_mask <- bool, [batch_size, N] + background_box_mask = tf.less_equal(matched_iou, 0.0) + + argmax_iou_indices = tf.argmax(iou, axis=-1, output_type=tf.int32) + + argmax_iou_indices_shape = tf.shape(argmax_iou_indices) + batch_indices = ( + tf.expand_dims(tf.range(argmax_iou_indices_shape[0]), axis=-1) * + tf.ones([1, argmax_iou_indices_shape[-1]], dtype=tf.int32)) + gather_nd_indices = tf.stack([batch_indices, argmax_iou_indices], axis=-1) + + matched_gt_boxes = tf.gather_nd(gt_boxes, gather_nd_indices) + matched_gt_boxes = tf.where( + tf.tile(tf.expand_dims(background_box_mask, axis=-1), [1, 1, 4]), + tf.zeros_like(matched_gt_boxes, dtype=matched_gt_boxes.dtype), + matched_gt_boxes) + + matched_gt_classes = tf.gather_nd(gt_classes, gather_nd_indices) + matched_gt_classes = tf.where( + background_box_mask, + tf.zeros_like(matched_gt_classes), + matched_gt_classes) + + matched_gt_indices = tf.where( + background_box_mask, + -tf.ones_like(argmax_iou_indices), + argmax_iou_indices) + + return (matched_gt_boxes, matched_gt_classes, matched_gt_indices, + matched_iou, iou) + + +def assign_and_sample_proposals(proposed_boxes, + gt_boxes, + gt_classes, + num_samples_per_image=512, + mix_gt_boxes=True, + fg_fraction=0.25, + fg_iou_thresh=0.5, + bg_iou_thresh_hi=0.5, + bg_iou_thresh_lo=0.0): + """Assigns the proposals with groundtruth classes and performs subsmpling. + + Given `proposed_boxes`, `gt_boxes`, and `gt_classes`, the function uses the + following algorithm to generate the final `num_samples_per_image` RoIs. + 1. Calculates the IoU between each proposal box and each gt_boxes. + 2. Assigns each proposed box with a groundtruth class and box by choosing + the largest IoU overlap. + 3. Samples `num_samples_per_image` boxes from all proposed boxes, and + returns box_targets, class_targets, and RoIs. + + Args: + proposed_boxes: a tensor of shape of [batch_size, N, 4]. N is the number + of proposals before groundtruth assignment. The last dimension is the + box coordinates w.r.t. the scaled images in [ymin, xmin, ymax, xmax] + format. + gt_boxes: a tensor of shape of [batch_size, MAX_NUM_INSTANCES, 4]. + The coordinates of gt_boxes are in the pixel coordinates of the scaled + image. This tensor might have padding of values -1 indicating the invalid + box coordinates. + gt_classes: a tensor with a shape of [batch_size, MAX_NUM_INSTANCES]. This + tensor might have paddings with values of -1 indicating the invalid + classes. + num_samples_per_image: a integer represents RoI minibatch size per image. + mix_gt_boxes: a bool indicating whether to mix the groundtruth boxes before + sampling proposals. + fg_fraction: a float represents the target fraction of RoI minibatch that + is labeled foreground (i.e., class > 0). + fg_iou_thresh: a float represents the IoU overlap threshold for an RoI to be + considered foreground (if >= fg_iou_thresh). + bg_iou_thresh_hi: a float represents the IoU overlap threshold for an RoI to + be considered background (class = 0 if overlap in [LO, HI)). + bg_iou_thresh_lo: a float represents the IoU overlap threshold for an RoI to + be considered background (class = 0 if overlap in [LO, HI)). + + Returns: + sampled_rois: a tensor of shape of [batch_size, K, 4], representing the + coordinates of the sampled RoIs, where K is the number of the sampled + RoIs, i.e. K = num_samples_per_image. + sampled_gt_boxes: a tensor of shape of [batch_size, K, 4], storing the + box coordinates of the matched groundtruth boxes of the samples RoIs. + sampled_gt_classes: a tensor of shape of [batch_size, K], storing the + classes of the matched groundtruth boxes of the sampled RoIs. + sampled_gt_indices: a tensor of shape of [batch_size, K], storing the + indices of the sampled groudntruth boxes in the original `gt_boxes` + tensor, i.e. gt_boxes[sampled_gt_indices[:, i]] = sampled_gt_boxes[:, i]. + """ + + with tf.name_scope('sample_proposals'): + if mix_gt_boxes: + boxes = tf.concat([proposed_boxes, gt_boxes], axis=1) + else: + boxes = proposed_boxes + + (matched_gt_boxes, matched_gt_classes, matched_gt_indices, + matched_iou, _) = box_matching(boxes, gt_boxes, gt_classes) + + positive_match = tf.greater(matched_iou, fg_iou_thresh) + negative_match = tf.logical_and( + tf.greater_equal(matched_iou, bg_iou_thresh_lo), + tf.less(matched_iou, bg_iou_thresh_hi)) + ignored_match = tf.less(matched_iou, 0.0) + + # re-assign negatively matched boxes to the background class. + matched_gt_classes = tf.where( + negative_match, tf.zeros_like(matched_gt_classes), matched_gt_classes) + matched_gt_indices = tf.where( + negative_match, tf.zeros_like(matched_gt_indices), matched_gt_indices) + + sample_candidates = tf.logical_and( + tf.logical_or(positive_match, negative_match), + tf.logical_not(ignored_match)) + + sampler = ( + balanced_positive_negative_sampler.BalancedPositiveNegativeSampler( + positive_fraction=fg_fraction, is_static=True)) + + batch_size, _ = sample_candidates.get_shape().as_list() + sampled_indicators = [] + for i in range(batch_size): + sampled_indicator = sampler.subsample( + sample_candidates[i], num_samples_per_image, positive_match[i]) + sampled_indicators.append(sampled_indicator) + sampled_indicators = tf.stack(sampled_indicators) + _, sampled_indices = tf.nn.top_k( + tf.cast(sampled_indicators, dtype=tf.int32), + k=num_samples_per_image, + sorted=True) + + sampled_indices_shape = tf.shape(sampled_indices) + batch_indices = ( + tf.expand_dims(tf.range(sampled_indices_shape[0]), axis=-1) * + tf.ones([1, sampled_indices_shape[-1]], dtype=tf.int32)) + gather_nd_indices = tf.stack([batch_indices, sampled_indices], axis=-1) + + sampled_rois = tf.gather_nd(boxes, gather_nd_indices) + sampled_gt_boxes = tf.gather_nd(matched_gt_boxes, gather_nd_indices) + sampled_gt_classes = tf.gather_nd( + matched_gt_classes, gather_nd_indices) + sampled_gt_indices = tf.gather_nd( + matched_gt_indices, gather_nd_indices) + + return (sampled_rois, sampled_gt_boxes, sampled_gt_classes, + sampled_gt_indices) + + +def sample_and_crop_foreground_masks(candidate_rois, + candidate_gt_boxes, + candidate_gt_classes, + candidate_gt_indices, + gt_masks, + num_mask_samples_per_image=128, + mask_target_size=28): + """Samples and creates cropped foreground masks for training. + + Args: + candidate_rois: a tensor of shape of [batch_size, N, 4], where N is the + number of candidate RoIs to be considered for mask sampling. It includes + both positive and negative RoIs. The `num_mask_samples_per_image` positive + RoIs will be sampled to create mask training targets. + candidate_gt_boxes: a tensor of shape of [batch_size, N, 4], storing the + corresponding groundtruth boxes to the `candidate_rois`. + candidate_gt_classes: a tensor of shape of [batch_size, N], storing the + corresponding groundtruth classes to the `candidate_rois`. 0 in the tensor + corresponds to the background class, i.e. negative RoIs. + candidate_gt_indices: a tensor of shape [batch_size, N], storing the + corresponding groundtruth instance indices to the `candidate_gt_boxes`, + i.e. gt_boxes[candidate_gt_indices[:, i]] = candidate_gt_boxes[:, i] and + gt_boxes which is of shape [batch_size, MAX_INSTANCES, 4], M >= N, is the + superset of candidate_gt_boxes. + gt_masks: a tensor of [batch_size, MAX_INSTANCES, mask_height, mask_width] + containing all the groundtruth masks which sample masks are drawn from. + num_mask_samples_per_image: an integer which specifies the number of masks + to sample. + mask_target_size: an integer which specifies the final cropped mask size + after sampling. The output masks are resized w.r.t the sampled RoIs. + + Returns: + foreground_rois: a tensor of shape of [batch_size, K, 4] storing the RoI + that corresponds to the sampled foreground masks, where + K = num_mask_samples_per_image. + foreground_classes: a tensor of shape of [batch_size, K] storing the classes + corresponding to the sampled foreground masks. + cropoped_foreground_masks: a tensor of shape of + [batch_size, K, mask_target_size, mask_target_size] storing the cropped + foreground masks used for training. + """ + with tf.name_scope('sample_and_crop_foreground_masks'): + _, fg_instance_indices = tf.nn.top_k( + tf.cast(tf.greater(candidate_gt_classes, 0), dtype=tf.int32), + k=num_mask_samples_per_image) + + fg_instance_indices_shape = tf.shape(fg_instance_indices) + batch_indices = ( + tf.expand_dims(tf.range(fg_instance_indices_shape[0]), axis=-1) * + tf.ones([1, fg_instance_indices_shape[-1]], dtype=tf.int32)) + + gather_nd_instance_indices = tf.stack( + [batch_indices, fg_instance_indices], axis=-1) + foreground_rois = tf.gather_nd( + candidate_rois, gather_nd_instance_indices) + foreground_boxes = tf.gather_nd( + candidate_gt_boxes, gather_nd_instance_indices) + foreground_classes = tf.gather_nd( + candidate_gt_classes, gather_nd_instance_indices) + foreground_gt_indices = tf.gather_nd( + candidate_gt_indices, gather_nd_instance_indices) + + foreground_gt_indices_shape = tf.shape(foreground_gt_indices) + batch_indices = ( + tf.expand_dims(tf.range(foreground_gt_indices_shape[0]), axis=-1) * + tf.ones([1, foreground_gt_indices_shape[-1]], dtype=tf.int32)) + gather_nd_gt_indices = tf.stack( + [batch_indices, foreground_gt_indices], axis=-1) + foreground_masks = tf.gather_nd(gt_masks, gather_nd_gt_indices) + + cropped_foreground_masks = spatial_transform_ops.crop_mask_in_target_box( + foreground_masks, foreground_boxes, foreground_rois, mask_target_size, + sample_offset=0.5) + + return foreground_rois, foreground_classes, cropped_foreground_masks + + +class ROISampler(object): + """Samples RoIs and creates training targets.""" + + def __init__(self, params): + self._num_samples_per_image = params.num_samples_per_image + self._fg_fraction = params.fg_fraction + self._fg_iou_thresh = params.fg_iou_thresh + self._bg_iou_thresh_hi = params.bg_iou_thresh_hi + self._bg_iou_thresh_lo = params.bg_iou_thresh_lo + self._mix_gt_boxes = params.mix_gt_boxes + + def __call__(self, rois, gt_boxes, gt_classes): + """Sample and assign RoIs for training. + + Args: + rois: a tensor of shape of [batch_size, N, 4]. N is the number + of proposals before groundtruth assignment. The last dimension is the + box coordinates w.r.t. the scaled images in [ymin, xmin, ymax, xmax] + format. + gt_boxes: a tensor of shape of [batch_size, MAX_NUM_INSTANCES, 4]. + The coordinates of gt_boxes are in the pixel coordinates of the scaled + image. This tensor might have padding of values -1 indicating the + invalid box coordinates. + gt_classes: a tensor with a shape of [batch_size, MAX_NUM_INSTANCES]. This + tensor might have paddings with values of -1 indicating the invalid + classes. + + Returns: + sampled_rois: a tensor of shape of [batch_size, K, 4], representing the + coordinates of the sampled RoIs, where K is the number of the sampled + RoIs, i.e. K = num_samples_per_image. + sampled_gt_boxes: a tensor of shape of [batch_size, K, 4], storing the + box coordinates of the matched groundtruth boxes of the samples RoIs. + sampled_gt_classes: a tensor of shape of [batch_size, K], storing the + classes of the matched groundtruth boxes of the sampled RoIs. + """ + sampled_rois, sampled_gt_boxes, sampled_gt_classes, sampled_gt_indices = ( + assign_and_sample_proposals( + rois, + gt_boxes, + gt_classes, + num_samples_per_image=self._num_samples_per_image, + mix_gt_boxes=self._mix_gt_boxes, + fg_fraction=self._fg_fraction, + fg_iou_thresh=self._fg_iou_thresh, + bg_iou_thresh_hi=self._bg_iou_thresh_hi, + bg_iou_thresh_lo=self._bg_iou_thresh_lo)) + return (sampled_rois, sampled_gt_boxes, sampled_gt_classes, + sampled_gt_indices) + + +class MaskSampler(object): + """Samples and creates mask training targets.""" + + def __init__(self, params): + self._num_mask_samples_per_image = params.num_mask_samples_per_image + self._mask_target_size = params.mask_target_size + + def __call__(self, + candidate_rois, + candidate_gt_boxes, + candidate_gt_classes, + candidate_gt_indices, + gt_masks): + """Sample and create mask targets for training. + + Args: + candidate_rois: a tensor of shape of [batch_size, N, 4], where N is the + number of candidate RoIs to be considered for mask sampling. It includes + both positive and negative RoIs. The `num_mask_samples_per_image` + positive RoIs will be sampled to create mask training targets. + candidate_gt_boxes: a tensor of shape of [batch_size, N, 4], storing the + corresponding groundtruth boxes to the `candidate_rois`. + candidate_gt_classes: a tensor of shape of [batch_size, N], storing the + corresponding groundtruth classes to the `candidate_rois`. 0 in the + tensor corresponds to the background class, i.e. negative RoIs. + candidate_gt_indices: a tensor of shape [batch_size, N], storing the + corresponding groundtruth instance indices to the `candidate_gt_boxes`, + i.e. gt_boxes[candidate_gt_indices[:, i]] = candidate_gt_boxes[:, i], + where gt_boxes which is of shape [batch_size, MAX_INSTANCES, 4], M >= N, + is the superset of candidate_gt_boxes. + gt_masks: a tensor of [batch_size, MAX_INSTANCES, mask_height, mask_width] + containing all the groundtruth masks which sample masks are drawn from. + after sampling. The output masks are resized w.r.t the sampled RoIs. + + Returns: + foreground_rois: a tensor of shape of [batch_size, K, 4] storing the RoI + that corresponds to the sampled foreground masks, where + K = num_mask_samples_per_image. + foreground_classes: a tensor of shape of [batch_size, K] storing the + classes corresponding to the sampled foreground masks. + cropoped_foreground_masks: a tensor of shape of + [batch_size, K, mask_target_size, mask_target_size] storing the + cropped foreground masks used for training. + """ + foreground_rois, foreground_classes, cropped_foreground_masks = ( + sample_and_crop_foreground_masks( + candidate_rois, + candidate_gt_boxes, + candidate_gt_classes, + candidate_gt_indices, + gt_masks, + self._num_mask_samples_per_image, + self._mask_target_size)) + return foreground_rois, foreground_classes, cropped_foreground_masks diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/spatial_transform_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/spatial_transform_ops.py new file mode 100644 index 0000000..60ef494 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/ops/spatial_transform_ops.py @@ -0,0 +1,608 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions to performa spatial transformation for Tensor.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + + +_EPSILON = 1e-8 + + +def nearest_upsampling(data, scale): + """Nearest neighbor upsampling implementation. + + Args: + data: A tensor with a shape of [batch, height_in, width_in, channels]. + scale: An integer multiple to scale resolution of input data. + Returns: + data_up: A tensor with a shape of + [batch, height_in*scale, width_in*scale, channels]. Same dtype as input + data. + """ + with tf.name_scope('nearest_upsampling'): + bs, _, _, c = data.get_shape().as_list() + shape = tf.shape(input=data) + h = shape[1] + w = shape[2] + bs = -1 if bs is None else bs + # Uses reshape to quickly upsample the input. The nearest pixel is selected + # implicitly via broadcasting. + data = tf.reshape(data, [bs, h, 1, w, 1, c]) * tf.ones( + [1, 1, scale, 1, scale, 1], dtype=data.dtype) + return tf.reshape(data, [bs, h * scale, w * scale, c]) + + +def feature_bilinear_interpolation(features, kernel_y, kernel_x): + """Feature bilinear interpolation. + + The RoIAlign feature f can be computed by bilinear interpolation + of four neighboring feature points f0, f1, f2, and f3. + + f(y, x) = [hy, ly] * [[f00, f01], * [hx, lx]^T + [f10, f11]] + f(y, x) = (hy*hx)f00 + (hy*lx)f01 + (ly*hx)f10 + (lx*ly)f11 + f(y, x) = w00*f00 + w01*f01 + w10*f10 + w11*f11 + kernel_y = [hy, ly] + kernel_x = [hx, lx] + + Args: + features: The features are in shape of [batch_size, num_boxes, output_size * + 2, output_size * 2, num_filters]. + kernel_y: Tensor of size [batch_size, boxes, output_size, 2, 1]. + kernel_x: Tensor of size [batch_size, boxes, output_size, 2, 1]. + + Returns: + A 5-D tensor representing feature crop of shape + [batch_size, num_boxes, output_size, output_size, num_filters]. + + """ + (batch_size, num_boxes, output_size, _, + num_filters) = features.get_shape().as_list() + output_size = output_size // 2 + kernel_y = tf.reshape(kernel_y, [batch_size, num_boxes, output_size * 2, 1]) + kernel_x = tf.reshape(kernel_x, [batch_size, num_boxes, 1, output_size * 2]) + # Use implicit broadcast to generate the interpolation kernel. The + # multiplier `4` is for avg pooling. + interpolation_kernel = kernel_y * kernel_x * 4 + + # Interpolate the gathered features with computed interpolation kernels. + features *= tf.cast( + tf.expand_dims(interpolation_kernel, axis=-1), dtype=features.dtype) + features = tf.reshape( + features, + [batch_size * num_boxes, output_size * 2, output_size * 2, num_filters]) + features = tf.nn.avg_pool(features, [1, 2, 2, 1], [1, 2, 2, 1], 'VALID') + features = tf.reshape( + features, [batch_size, num_boxes, output_size, output_size, num_filters]) + return features + + +def compute_grid_positions(boxes, boundaries, output_size, sample_offset): + """Compute the grid position w.r.t. + + the corresponding feature map. + + Args: + boxes: a 3-D tensor of shape [batch_size, num_boxes, 4] encoding the + information of each box w.r.t. the corresponding feature map. + boxes[:, :, 0:2] are the grid position in (y, x) (float) of the top-left + corner of each box. boxes[:, :, 2:4] are the box sizes in (h, w) (float) + in terms of the number of pixels of the corresponding feature map size. + boundaries: a 3-D tensor of shape [batch_size, num_boxes, 2] representing + the boundary (in (y, x)) of the corresponding feature map for each box. + Any resampled grid points that go beyond the bounary will be clipped. + output_size: a scalar indicating the output crop size. + sample_offset: a float number in [0, 1] indicates the subpixel sample offset + from grid point. + + Returns: + kernel_y: Tensor of size [batch_size, boxes, output_size, 2, 1]. + kernel_x: Tensor of size [batch_size, boxes, output_size, 2, 1]. + box_grid_y0y1: Tensor of size [batch_size, boxes, output_size, 2] + box_grid_x0x1: Tensor of size [batch_size, boxes, output_size, 2] + """ + batch_size, num_boxes, _ = boxes.get_shape().as_list() + box_grid_x = [] + box_grid_y = [] + for i in range(output_size): + box_grid_x.append(boxes[:, :, 1] + + (i + sample_offset) * boxes[:, :, 3] / output_size) + box_grid_y.append(boxes[:, :, 0] + + (i + sample_offset) * boxes[:, :, 2] / output_size) + box_grid_x = tf.stack(box_grid_x, axis=2) + box_grid_y = tf.stack(box_grid_y, axis=2) + + box_grid_y0 = tf.floor(box_grid_y) + box_grid_x0 = tf.floor(box_grid_x) + box_grid_x0 = tf.maximum(0., box_grid_x0) + box_grid_y0 = tf.maximum(0., box_grid_y0) + + box_grid_x0 = tf.minimum(box_grid_x0, tf.expand_dims(boundaries[:, :, 1], -1)) + box_grid_x1 = tf.minimum(box_grid_x0 + 1, + tf.expand_dims(boundaries[:, :, 1], -1)) + box_grid_y0 = tf.minimum(box_grid_y0, tf.expand_dims(boundaries[:, :, 0], -1)) + box_grid_y1 = tf.minimum(box_grid_y0 + 1, + tf.expand_dims(boundaries[:, :, 0], -1)) + + box_gridx0x1 = tf.stack([box_grid_x0, box_grid_x1], axis=-1) + box_gridy0y1 = tf.stack([box_grid_y0, box_grid_y1], axis=-1) + + # The RoIAlign feature f can be computed by bilinear interpolation of four + # neighboring feature points f0, f1, f2, and f3. + # f(y, x) = [hy, ly] * [[f00, f01], * [hx, lx]^T + # [f10, f11]] + # f(y, x) = (hy*hx)f00 + (hy*lx)f01 + (ly*hx)f10 + (lx*ly)f11 + # f(y, x) = w00*f00 + w01*f01 + w10*f10 + w11*f11 + ly = box_grid_y - box_grid_y0 + lx = box_grid_x - box_grid_x0 + hy = 1.0 - ly + hx = 1.0 - lx + kernel_y = tf.reshape( + tf.stack([hy, ly], axis=3), [batch_size, num_boxes, output_size, 2, 1]) + kernel_x = tf.reshape( + tf.stack([hx, lx], axis=3), [batch_size, num_boxes, output_size, 2, 1]) + return kernel_y, kernel_x, box_gridy0y1, box_gridx0x1 + + +def get_grid_one_hot(box_gridy0y1, box_gridx0x1, feature_height, feature_width): + """Get grid_one_hot from indices and feature_size.""" + (batch_size, num_boxes, output_size, _) = box_gridx0x1.get_shape().as_list() + y_indices = tf.cast( + tf.reshape(box_gridy0y1, [batch_size, num_boxes, output_size, 2]), + dtype=tf.int32) + x_indices = tf.cast( + tf.reshape(box_gridx0x1, [batch_size, num_boxes, output_size, 2]), + dtype=tf.int32) + + # shape is [batch_size, num_boxes, output_size, 2, height] + grid_y_one_hot = tf.one_hot(tf.cast(y_indices, tf.int32), feature_height) + # shape is [batch_size, num_boxes, output_size, 2, width] + grid_x_one_hot = tf.one_hot(tf.cast(x_indices, tf.int32), feature_width) + + return grid_y_one_hot, grid_x_one_hot + + +def selective_crop_and_resize(features, + boxes, + box_levels, + boundaries, + output_size=7, + sample_offset=0.5, + use_einsum_gather=False): + """Crop and resize boxes on a set of feature maps. + + Given multiple features maps indexed by different levels, and a set of boxes + where each box is mapped to a certain level, it selectively crops and resizes + boxes from the corresponding feature maps to generate the box features. + + We follow the ROIAlign technique (see https://arxiv.org/pdf/1703.06870.pdf, + figure 3 for reference). Specifically, for each feature map, we select an + (output_size, output_size) set of pixels corresponding to the box location, + and then use bilinear interpolation to select the feature value for each + pixel. + + For performance, we perform the gather and interpolation on all layers as a + single operation. In this op the multi-level features are first stacked and + gathered into [2*output_size, 2*output_size] feature points. Then bilinear + interpolation is performed on the gathered feature points to generate + [output_size, output_size] RoIAlign feature map. + + Here is the step-by-step algorithm: + 1. The multi-level features are gathered into a + [batch_size, num_boxes, output_size*2, output_size*2, num_filters] + Tensor. The Tensor contains four neighboring feature points for each + vertice in the output grid. + 2. Compute the interpolation kernel of shape + [batch_size, num_boxes, output_size*2, output_size*2]. The last 2 axis + can be seen as stacking 2x2 interpolation kernels for all vertices in the + output grid. + 3. Element-wise multiply the gathered features and interpolation kernel. + Then apply 2x2 average pooling to reduce spatial dimension to + output_size. + + Args: + features: a 5-D tensor of shape [batch_size, num_levels, max_height, + max_width, num_filters] where cropping and resizing are based. + boxes: a 3-D tensor of shape [batch_size, num_boxes, 4] encoding the + information of each box w.r.t. the corresponding feature map. + boxes[:, :, 0:2] are the grid position in (y, x) (float) of the top-left + corner of each box. boxes[:, :, 2:4] are the box sizes in (h, w) (float) + in terms of the number of pixels of the corresponding feature map size. + box_levels: a 3-D tensor of shape [batch_size, num_boxes, 1] representing + the 0-based corresponding feature level index of each box. + boundaries: a 3-D tensor of shape [batch_size, num_boxes, 2] representing + the boundary (in (y, x)) of the corresponding feature map for each box. + Any resampled grid points that go beyond the bounary will be clipped. + output_size: a scalar indicating the output crop size. + sample_offset: a float number in [0, 1] indicates the subpixel sample offset + from grid point. + use_einsum_gather: use einsum to replace gather or not. Replacing einsum + with gather can improve performance when feature size is not large, einsum + is friendly with model partition as well. Gather's performance is better + when feature size is very large and there are multiple box levels. + + Returns: + features_per_box: a 5-D tensor of shape + [batch_size, num_boxes, output_size, output_size, num_filters] + representing the cropped features. + """ + (batch_size, num_levels, max_feature_height, max_feature_width, + num_filters) = features.get_shape().as_list() + _, num_boxes, _ = boxes.get_shape().as_list() + + kernel_y, kernel_x, box_gridy0y1, box_gridx0x1 = compute_grid_positions( + boxes, boundaries, output_size, sample_offset) + x_indices = tf.cast( + tf.reshape(box_gridx0x1, [batch_size, num_boxes, output_size * 2]), + dtype=tf.int32) + y_indices = tf.cast( + tf.reshape(box_gridy0y1, [batch_size, num_boxes, output_size * 2]), + dtype=tf.int32) + + if use_einsum_gather: + # Blinear interpolation is done during the last two gathers: + # f(y, x) = [hy, ly] * [[f00, f01], * [hx, lx]^T + # [f10, f11]] + # [[f00, f01], + # [f10, f11]] = tf.einsum(tf.einsum(features, y_one_hot), x_one_hot) + # where [hy, ly] and [hx, lx] are the bilinear interpolation kernel. + + # shape is [batch_size, boxes, output_size, 2, 1] + grid_y_one_hot, grid_x_one_hot = get_grid_one_hot(box_gridy0y1, + box_gridx0x1, + max_feature_height, + max_feature_width) + + # shape is [batch_size, num_boxes, output_size, height] + grid_y_weight = tf.reduce_sum( + tf.multiply(grid_y_one_hot, kernel_y), axis=-2) + # shape is [batch_size, num_boxes, output_size, width] + grid_x_weight = tf.reduce_sum( + tf.multiply(grid_x_one_hot, kernel_x), axis=-2) + + # Gather for y_axis. + # shape is [batch_size, num_boxes, output_size, width, features] + features_per_box = tf.einsum('bmhwf,bmoh->bmowf', features, + tf.cast(grid_y_weight, features.dtype)) + # Gather for x_axis. + # shape is [batch_size, num_boxes, output_size, output_size, features] + features_per_box = tf.einsum('bmhwf,bmow->bmhof', features_per_box, + tf.cast(grid_x_weight, features.dtype)) + else: + height_dim_offset = max_feature_width + level_dim_offset = max_feature_height * height_dim_offset + batch_dim_offset = num_levels * level_dim_offset + + batch_size_offset = tf.tile( + tf.reshape( + tf.range(batch_size) * batch_dim_offset, [batch_size, 1, 1, 1]), + [1, num_boxes, output_size * 2, output_size * 2]) + box_levels_offset = tf.tile( + tf.reshape(box_levels * level_dim_offset, + [batch_size, num_boxes, 1, 1]), + [1, 1, output_size * 2, output_size * 2]) + y_indices_offset = tf.tile( + tf.reshape(y_indices * height_dim_offset, + [batch_size, num_boxes, output_size * 2, 1]), + [1, 1, 1, output_size * 2]) + x_indices_offset = tf.tile( + tf.reshape(x_indices, [batch_size, num_boxes, 1, output_size * 2]), + [1, 1, output_size * 2, 1]) + + indices = tf.reshape( + batch_size_offset + box_levels_offset + y_indices_offset + + x_indices_offset, [-1]) + + features = tf.reshape(features, [-1, num_filters]) + # TODO(wangtao): replace tf.gather with tf.gather_nd and try to get similar + # performance. + features_per_box = tf.reshape( + tf.gather(features, indices), + [batch_size, num_boxes, output_size * 2, output_size * 2, num_filters]) + features_per_box = feature_bilinear_interpolation(features_per_box, + kernel_y, kernel_x) + + return features_per_box + + +def multilevel_crop_and_resize(features, boxes, output_size=7): + """Crop and resize on multilevel feature pyramid. + + Generate the (output_size, output_size) set of pixels for each input box + by first locating the box into the correct feature level, and then cropping + and resizing it using the correspoding feature map of that level. + + Args: + features: A dictionary with key as pyramid level and value as features. The + features are in shape of [batch_size, height_l, width_l, num_filters]. + boxes: A 3-D Tensor of shape [batch_size, num_boxes, 4]. Each row represents + a box with [y1, x1, y2, x2] in un-normalized coordinates. + output_size: A scalar to indicate the output crop size. + + Returns: + A 5-D tensor representing feature crop of shape + [batch_size, num_boxes, output_size, output_size, num_filters]. + """ + + with tf.name_scope('multilevel_crop_and_resize'): + levels = list(features.keys()) + min_level = min(levels) + max_level = max(levels) + batch_size, max_feature_height, max_feature_width, num_filters = ( + features[min_level].get_shape().as_list()) + _, num_boxes, _ = boxes.get_shape().as_list() + + # Stack feature pyramid into a features_all of shape + # [batch_size, levels, height, width, num_filters]. + features_all = [] + feature_heights = [] + feature_widths = [] + for level in range(min_level, max_level + 1): + shape = features[level].get_shape().as_list() + feature_heights.append(shape[1]) + feature_widths.append(shape[2]) + # Concat tensor of [batch_size, height_l * width_l, num_filters] for each + # levels. + features_all.append( + tf.reshape(features[level], [batch_size, -1, num_filters])) + features_r2 = tf.reshape(tf.concat(features_all, 1), [-1, num_filters]) + + # Calculate height_l * width_l for each level. + level_dim_sizes = [ + feature_widths[i] * feature_heights[i] + for i in range(len(feature_widths)) + ] + # level_dim_offsets is accumulated sum of level_dim_size. + level_dim_offsets = [0] + for i in range(len(feature_widths) - 1): + level_dim_offsets.append(level_dim_offsets[i] + level_dim_sizes[i]) + batch_dim_size = level_dim_offsets[-1] + level_dim_sizes[-1] + level_dim_offsets = tf.constant(level_dim_offsets, tf.int32) + height_dim_sizes = tf.constant(feature_widths, tf.int32) + + # Assigns boxes to the right level. + box_width = boxes[:, :, 3] - boxes[:, :, 1] + box_height = boxes[:, :, 2] - boxes[:, :, 0] + areas_sqrt = tf.sqrt(box_height * box_width) + levels = tf.cast( + tf.math.floordiv( + tf.math.log(tf.divide(areas_sqrt, 224.0)), tf.math.log(2.0)) + + 4.0, + dtype=tf.int32) + # Maps levels between [min_level, max_level]. + levels = tf.minimum(max_level, tf.maximum(levels, min_level)) + + # Projects box location and sizes to corresponding feature levels. + scale_to_level = tf.cast( + tf.pow(tf.constant(2.0), tf.cast(levels, tf.float32)), + dtype=boxes.dtype) + boxes /= tf.expand_dims(scale_to_level, axis=2) + box_width /= scale_to_level + box_height /= scale_to_level + boxes = tf.concat([boxes[:, :, 0:2], + tf.expand_dims(box_height, -1), + tf.expand_dims(box_width, -1)], axis=-1) + + # Maps levels to [0, max_level-min_level]. + levels -= min_level + level_strides = tf.pow([[2.0]], tf.cast(levels, tf.float32)) + boundary = tf.cast( + tf.concat([ + tf.expand_dims( + [[tf.cast(max_feature_height, tf.float32)]] / level_strides - 1, + axis=-1), + tf.expand_dims( + [[tf.cast(max_feature_width, tf.float32)]] / level_strides - 1, + axis=-1), + ], + axis=-1), boxes.dtype) + + # Compute grid positions. + kernel_y, kernel_x, box_gridy0y1, box_gridx0x1 = compute_grid_positions( + boxes, boundary, output_size, sample_offset=0.5) + + x_indices = tf.cast( + tf.reshape(box_gridx0x1, [batch_size, num_boxes, output_size * 2]), + dtype=tf.int32) + y_indices = tf.cast( + tf.reshape(box_gridy0y1, [batch_size, num_boxes, output_size * 2]), + dtype=tf.int32) + + batch_size_offset = tf.tile( + tf.reshape( + tf.range(batch_size) * batch_dim_size, [batch_size, 1, 1, 1]), + [1, num_boxes, output_size * 2, output_size * 2]) + # Get level offset for each box. Each box belongs to one level. + levels_offset = tf.tile( + tf.reshape( + tf.gather(level_dim_offsets, levels), + [batch_size, num_boxes, 1, 1]), + [1, 1, output_size * 2, output_size * 2]) + y_indices_offset = tf.tile( + tf.reshape( + y_indices * tf.expand_dims(tf.gather(height_dim_sizes, levels), -1), + [batch_size, num_boxes, output_size * 2, 1]), + [1, 1, 1, output_size * 2]) + x_indices_offset = tf.tile( + tf.reshape(x_indices, [batch_size, num_boxes, 1, output_size * 2]), + [1, 1, output_size * 2, 1]) + indices = tf.reshape( + batch_size_offset + levels_offset + y_indices_offset + x_indices_offset, + [-1]) + + # TODO(wangtao): replace tf.gather with tf.gather_nd and try to get similar + # performance. + features_per_box = tf.reshape( + tf.gather(features_r2, indices), + [batch_size, num_boxes, output_size * 2, output_size * 2, num_filters]) + + # Bilinear interpolation. + features_per_box = feature_bilinear_interpolation(features_per_box, + kernel_y, kernel_x) + return features_per_box + + +def single_level_feature_crop(features, level_boxes, detection_prior_levels, + min_mask_level, mask_crop_size): + """Crop the FPN features at the appropriate levels for each detection. + + + Args: + features: a float tensor of shape [batch_size, num_levels, + max_feature_size, max_feature_size, num_downsample_channels]. + level_boxes: a float Tensor of the level boxes to crop from. + [batch_size, num_instances, 4]. + detection_prior_levels: an int Tensor of instance assigned level of shape + [batch_size, num_instances]. + min_mask_level: minimum FPN level to crop mask feature from. + mask_crop_size: an int of mask crop size. + + Returns: + crop_features: a float Tensor of shape [batch_size * num_instances, + mask_crop_size, mask_crop_size, num_downsample_channels]. This is the + instance feature crop. + """ + (batch_size, num_levels, max_feature_size, + _, num_downsample_channels) = features.get_shape().as_list() + _, num_of_instances, _ = level_boxes.get_shape().as_list() + level_boxes = tf.cast(level_boxes, tf.int32) + assert num_of_instances == detection_prior_levels.get_shape().as_list()[1] + + x_start_indices = level_boxes[:, :, 1] + y_start_indices = level_boxes[:, :, 0] + # generate the full indices (not just the starting index) + x_idx_list = [] + y_idx_list = [] + for i in range(mask_crop_size): + x_idx_list.append(x_start_indices + i) + y_idx_list.append(y_start_indices + i) + + x_indices = tf.stack(x_idx_list, axis=2) + y_indices = tf.stack(y_idx_list, axis=2) + levels = detection_prior_levels - min_mask_level + height_dim_size = max_feature_size + level_dim_size = max_feature_size * height_dim_size + batch_dim_size = num_levels * level_dim_size + # TODO(weicheng) change this to gather_nd for better readability. + indices = tf.reshape( + tf.tile( + tf.reshape( + tf.range(batch_size) * batch_dim_size, + [batch_size, 1, 1, 1]), + [1, num_of_instances, + mask_crop_size, mask_crop_size]) + + tf.tile( + tf.reshape(levels * level_dim_size, + [batch_size, num_of_instances, 1, 1]), + [1, 1, mask_crop_size, mask_crop_size]) + + tf.tile( + tf.reshape(y_indices * height_dim_size, + [batch_size, num_of_instances, + mask_crop_size, 1]), + [1, 1, 1, mask_crop_size]) + + tf.tile( + tf.reshape(x_indices, + [batch_size, num_of_instances, + 1, mask_crop_size]), + [1, 1, mask_crop_size, 1]), [-1]) + + features_r2 = tf.reshape(features, + [-1, num_downsample_channels]) + crop_features = tf.reshape( + tf.gather(features_r2, indices), + [batch_size * num_of_instances, + mask_crop_size, mask_crop_size, + num_downsample_channels]) + + return crop_features + + +def crop_mask_in_target_box(masks, + boxes, + target_boxes, + output_size, + sample_offset=0, + use_einsum=True): + """Crop masks in target boxes. + + Args: + masks: A tensor with a shape of [batch_size, num_masks, height, width]. + boxes: a float tensor representing box cooridnates that tightly enclose + masks with a shape of [batch_size, num_masks, 4] in un-normalized + coordinates. A box is represented by [ymin, xmin, ymax, xmax]. + target_boxes: a float tensor representing target box cooridnates for + masks with a shape of [batch_size, num_masks, 4] in un-normalized + coordinates. A box is represented by [ymin, xmin, ymax, xmax]. + output_size: A scalar to indicate the output crop size. It currently only + supports to output a square shape outputs. + sample_offset: a float number in [0, 1] indicates the subpixel sample offset + from grid point. + use_einsum: Use einsum to replace gather in selective_crop_and_resize. + + Returns: + A 4-D tensor representing feature crop of shape + [batch_size, num_boxes, output_size, output_size]. + """ + with tf.name_scope('crop_mask_in_target_box'): + batch_size, num_masks, height, width = masks.get_shape().as_list() + masks = tf.reshape(masks, [batch_size*num_masks, height, width, 1]) + # Pad zeros on the boundary of masks. + masks = tf.image.pad_to_bounding_box(masks, 2, 2, height + 4, width + 4) + masks = tf.reshape(masks, [batch_size, num_masks, height+4, width+4, 1]) + + # Projects target box locations and sizes to corresponding cropped + # mask coordinates. + gt_y_min, gt_x_min, gt_y_max, gt_x_max = tf.split( + value=boxes, num_or_size_splits=4, axis=2) + bb_y_min, bb_x_min, bb_y_max, bb_x_max = tf.split( + value=target_boxes, num_or_size_splits=4, axis=2) + y_transform = (bb_y_min - gt_y_min) * height / ( + gt_y_max - gt_y_min + _EPSILON) + 2 + x_transform = (bb_x_min - gt_x_min) * height / ( + gt_x_max - gt_x_min + _EPSILON) + 2 + h_transform = (bb_y_max - bb_y_min) * width / ( + gt_y_max - gt_y_min + _EPSILON) + w_transform = (bb_x_max - bb_x_min) * width / ( + gt_x_max - gt_x_min + _EPSILON) + + boundaries = tf.concat([ + tf.cast( + tf.ones_like(y_transform) * ((height + 4) - 1), dtype=tf.float32), + tf.cast( + tf.ones_like(x_transform) * ((width + 4) - 1), dtype=tf.float32) + ], + axis=-1) + + # Reshape tensors to have the right shape for selective_crop_and_resize. + trasnformed_boxes = tf.concat( + [y_transform, x_transform, h_transform, w_transform], -1) + levels = tf.tile(tf.reshape(tf.range(num_masks), [1, num_masks]), + [batch_size, 1]) + + cropped_masks = selective_crop_and_resize( + masks, + trasnformed_boxes, + levels, + boundaries, + output_size, + sample_offset=sample_offset, + use_einsum_gather=use_einsum) + cropped_masks = tf.squeeze(cropped_masks, axis=-1) + + return cropped_masks diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/autoaugment_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/autoaugment_utils.py new file mode 100644 index 0000000..d16c9fa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/autoaugment_utils.py @@ -0,0 +1,25 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""AutoAugment util file.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + + +def distort_image_with_autoaugment(image, bboxes, augmentation_name): + raise NotImplementedError("Not TF 2.0 ready.") diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/box_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/box_utils.py new file mode 100644 index 0000000..cd31b39 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/box_utils.py @@ -0,0 +1,551 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions for bounding box processing.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import numpy as np +import tensorflow.compat.v2 as tf + +EPSILON = 1e-8 +BBOX_XFORM_CLIP = np.log(1000. / 16.) + + +def visualize_images_with_bounding_boxes(images, box_outputs, step, + summary_writer): + """Records subset of evaluation images with bounding boxes.""" + image_shape = tf.shape(images[0]) + image_height = tf.cast(image_shape[0], tf.float32) + image_width = tf.cast(image_shape[1], tf.float32) + normalized_boxes = normalize_boxes(box_outputs, [image_height, image_width]) + + bounding_box_color = tf.constant([[1.0, 1.0, 0.0, 1.0]]) + image_summary = tf.image.draw_bounding_boxes(images, normalized_boxes, + bounding_box_color) + with summary_writer.as_default(): + tf.summary.image('bounding_box_summary', image_summary, step=step) + summary_writer.flush() + + +def yxyx_to_xywh(boxes): + """Converts boxes from ymin, xmin, ymax, xmax to xmin, ymin, width, height. + + Args: + boxes: a numpy array whose last dimension is 4 representing the coordinates + of boxes in ymin, xmin, ymax, xmax order. + + Returns: + boxes: a numpy array whose shape is the same as `boxes` in new format. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[-1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + boxes_ymin = boxes[..., 0] + boxes_xmin = boxes[..., 1] + boxes_width = boxes[..., 3] - boxes[..., 1] + boxes_height = boxes[..., 2] - boxes[..., 0] + new_boxes = np.stack([boxes_xmin, boxes_ymin, boxes_width, boxes_height], + axis=-1) + + return new_boxes + + +def jitter_boxes(boxes, noise_scale=0.025): + """Jitter the box coordinates by some noise distribution. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates of + boxes in ymin, xmin, ymax, xmax order. + noise_scale: a python float which specifies the magnitude of noise. The rule + of thumb is to set this between (0, 0.1]. The default value is found to + mimic the noisy detections best empirically. + + Returns: + jittered_boxes: a tensor whose shape is the same as `boxes` representing + the jittered boxes. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[-1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('jitter_boxes'): + bbox_jitters = tf.random.normal(boxes.get_shape(), stddev=noise_scale) + ymin = boxes[..., 0:1] + xmin = boxes[..., 1:2] + ymax = boxes[..., 2:3] + xmax = boxes[..., 3:4] + width = xmax - xmin + height = ymax - ymin + new_center_x = (xmin + xmax) / 2.0 + bbox_jitters[..., 0:1] * width + new_center_y = (ymin + ymax) / 2.0 + bbox_jitters[..., 1:2] * height + new_width = width * tf.math.exp(bbox_jitters[..., 2:3]) + new_height = height * tf.math.exp(bbox_jitters[..., 3:4]) + jittered_boxes = tf.concat([ + new_center_y - new_height * 0.5, new_center_x - new_width * 0.5, + new_center_y + new_height * 0.5, new_center_x + new_width * 0.5 + ], + axis=-1) + + return jittered_boxes + + +def normalize_boxes(boxes, image_shape): + """Converts boxes to the normalized coordinates. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates + of boxes in ymin, xmin, ymax, xmax order. + image_shape: a list of two integers, a two-element vector or a tensor such + that all but the last dimensions are `broadcastable` to `boxes`. The last + dimension is 2, which represents [height, width]. + + Returns: + normalized_boxes: a tensor whose shape is the same as `boxes` representing + the normalized boxes. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[-1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('normalize_boxes'): + if isinstance(image_shape, list) or isinstance(image_shape, tuple): + height, width = image_shape + else: + image_shape = tf.cast(image_shape, dtype=boxes.dtype) + height = image_shape[..., 0:1] + width = image_shape[..., 1:2] + + ymin = boxes[..., 0:1] / height + xmin = boxes[..., 1:2] / width + ymax = boxes[..., 2:3] / height + xmax = boxes[..., 3:4] / width + + normalized_boxes = tf.concat([ymin, xmin, ymax, xmax], axis=-1) + return normalized_boxes + + +def denormalize_boxes(boxes, image_shape): + """Converts boxes normalized by [height, width] to pixel coordinates. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates + of boxes in ymin, xmin, ymax, xmax order. + image_shape: a list of two integers, a two-element vector or a tensor such + that all but the last dimensions are `broadcastable` to `boxes`. The last + dimension is 2, which represents [height, width]. + + Returns: + denormalized_boxes: a tensor whose shape is the same as `boxes` representing + the denormalized boxes. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + with tf.name_scope('denormalize_boxes'): + if isinstance(image_shape, list) or isinstance(image_shape, tuple): + height, width = image_shape + else: + image_shape = tf.cast(image_shape, dtype=boxes.dtype) + height, width = tf.split(image_shape, 2, axis=-1) + + ymin, xmin, ymax, xmax = tf.split(boxes, 4, axis=-1) + ymin = ymin * height + xmin = xmin * width + ymax = ymax * height + xmax = xmax * width + + denormalized_boxes = tf.concat([ymin, xmin, ymax, xmax], axis=-1) + return denormalized_boxes + + +def clip_boxes(boxes, image_shape): + """Clips boxes to image boundaries. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates + of boxes in ymin, xmin, ymax, xmax order. + image_shape: a list of two integers, a two-element vector or a tensor such + that all but the last dimensions are `broadcastable` to `boxes`. The last + dimension is 2, which represents [height, width]. + + Returns: + clipped_boxes: a tensor whose shape is the same as `boxes` representing the + clipped boxes. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[-1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('clip_boxes'): + if isinstance(image_shape, list) or isinstance(image_shape, tuple): + height, width = image_shape + max_length = [height - 1.0, width - 1.0, height - 1.0, width - 1.0] + else: + image_shape = tf.cast(image_shape, dtype=boxes.dtype) + height, width = tf.unstack(image_shape, axis=-1) + max_length = tf.stack( + [height - 1.0, width - 1.0, height - 1.0, width - 1.0], axis=-1) + + clipped_boxes = tf.math.maximum(tf.math.minimum(boxes, max_length), 0.0) + return clipped_boxes + + +def compute_outer_boxes(boxes, image_shape, scale=1.0): + """Compute outer box encloses an object with a margin. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates of + boxes in ymin, xmin, ymax, xmax order. + image_shape: a list of two integers, a two-element vector or a tensor such + that all but the last dimensions are `broadcastable` to `boxes`. The last + dimension is 2, which represents [height, width]. + scale: a float number specifying the scale of output outer boxes to input + `boxes`. + + Returns: + outer_boxes: a tensor whose shape is the same as `boxes` representing the + outer boxes. + """ + if scale < 1.0: + raise ValueError( + 'scale is {}, but outer box scale must be greater than 1.0.'.format( + scale)) + centers_y = (boxes[..., 0] + boxes[..., 2]) / 2.0 + centers_x = (boxes[..., 1] + boxes[..., 3]) / 2.0 + box_height = (boxes[..., 2] - boxes[..., 0]) * scale + box_width = (boxes[..., 3] - boxes[..., 1]) * scale + outer_boxes = tf.stack([ + centers_y - box_height / 2.0, centers_x - box_width / 2.0, + centers_y + box_height / 2.0, centers_x + box_width / 2.0 + ], + axis=1) + outer_boxes = clip_boxes(outer_boxes, image_shape) + return outer_boxes + + +def encode_boxes(boxes, anchors, weights=None): + """Encode boxes to targets. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates + of boxes in ymin, xmin, ymax, xmax order. + anchors: a tensor whose shape is the same as, or `broadcastable` to `boxes`, + representing the coordinates of anchors in ymin, xmin, ymax, xmax order. + weights: None or a list of four float numbers used to scale coordinates. + + Returns: + encoded_boxes: a tensor whose shape is the same as `boxes` representing the + encoded box targets. + + Raises: + ValueError: If the last dimension of boxes is not 4. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[-1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('encode_boxes'): + boxes = tf.cast(boxes, dtype=anchors.dtype) + ymin = boxes[..., 0:1] + xmin = boxes[..., 1:2] + ymax = boxes[..., 2:3] + xmax = boxes[..., 3:4] + box_h = ymax - ymin + 1.0 + box_w = xmax - xmin + 1.0 + box_yc = ymin + 0.5 * box_h + box_xc = xmin + 0.5 * box_w + + anchor_ymin = anchors[..., 0:1] + anchor_xmin = anchors[..., 1:2] + anchor_ymax = anchors[..., 2:3] + anchor_xmax = anchors[..., 3:4] + anchor_h = anchor_ymax - anchor_ymin + 1.0 + anchor_w = anchor_xmax - anchor_xmin + 1.0 + anchor_yc = anchor_ymin + 0.5 * anchor_h + anchor_xc = anchor_xmin + 0.5 * anchor_w + + encoded_dy = (box_yc - anchor_yc) / anchor_h + encoded_dx = (box_xc - anchor_xc) / anchor_w + encoded_dh = tf.math.log(box_h / anchor_h) + encoded_dw = tf.math.log(box_w / anchor_w) + if weights: + encoded_dy *= weights[0] + encoded_dx *= weights[1] + encoded_dh *= weights[2] + encoded_dw *= weights[3] + + encoded_boxes = tf.concat( + [encoded_dy, encoded_dx, encoded_dh, encoded_dw], + axis=-1) + return encoded_boxes + + +def decode_boxes(encoded_boxes, anchors, weights=None): + """Decode boxes. + + Args: + encoded_boxes: a tensor whose last dimension is 4 representing the + coordinates of encoded boxes in ymin, xmin, ymax, xmax order. + anchors: a tensor whose shape is the same as, or `broadcastable` to `boxes`, + representing the coordinates of anchors in ymin, xmin, ymax, xmax order. + weights: None or a list of four float numbers used to scale coordinates. + + Returns: + encoded_boxes: a tensor whose shape is the same as `boxes` representing the + decoded box targets. + """ + if encoded_boxes.shape[-1] != 4: + raise ValueError('encoded_boxes.shape[-1] is {:d}, but must be 4.'.format( + encoded_boxes.shape[-1])) + + with tf.name_scope('decode_boxes'): + encoded_boxes = tf.cast(encoded_boxes, dtype=anchors.dtype) + dy = encoded_boxes[..., 0:1] + dx = encoded_boxes[..., 1:2] + dh = encoded_boxes[..., 2:3] + dw = encoded_boxes[..., 3:4] + if weights: + dy /= weights[0] + dx /= weights[1] + dh /= weights[2] + dw /= weights[3] + dh = tf.math.minimum(dh, BBOX_XFORM_CLIP) + dw = tf.math.minimum(dw, BBOX_XFORM_CLIP) + + anchor_ymin = anchors[..., 0:1] + anchor_xmin = anchors[..., 1:2] + anchor_ymax = anchors[..., 2:3] + anchor_xmax = anchors[..., 3:4] + anchor_h = anchor_ymax - anchor_ymin + 1.0 + anchor_w = anchor_xmax - anchor_xmin + 1.0 + anchor_yc = anchor_ymin + 0.5 * anchor_h + anchor_xc = anchor_xmin + 0.5 * anchor_w + + decoded_boxes_yc = dy * anchor_h + anchor_yc + decoded_boxes_xc = dx * anchor_w + anchor_xc + decoded_boxes_h = tf.math.exp(dh) * anchor_h + decoded_boxes_w = tf.math.exp(dw) * anchor_w + + decoded_boxes_ymin = decoded_boxes_yc - 0.5 * decoded_boxes_h + decoded_boxes_xmin = decoded_boxes_xc - 0.5 * decoded_boxes_w + decoded_boxes_ymax = decoded_boxes_ymin + decoded_boxes_h - 1.0 + decoded_boxes_xmax = decoded_boxes_xmin + decoded_boxes_w - 1.0 + + decoded_boxes = tf.concat( + [decoded_boxes_ymin, decoded_boxes_xmin, + decoded_boxes_ymax, decoded_boxes_xmax], + axis=-1) + return decoded_boxes + + +def filter_boxes(boxes, scores, image_shape, min_size_threshold): + """Filter and remove boxes that are too small or fall outside the image. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates of + boxes in ymin, xmin, ymax, xmax order. + scores: a tensor whose shape is the same as tf.shape(boxes)[:-1] + representing the original scores of the boxes. + image_shape: a tensor whose shape is the same as, or `broadcastable` to + `boxes` except the last dimension, which is 2, representing [height, + width] of the scaled image. + min_size_threshold: a float representing the minimal box size in each side + (w.r.t. the scaled image). Boxes whose sides are smaller than it will be + filtered out. + + Returns: + filtered_boxes: a tensor whose shape is the same as `boxes` but with + the position of the filtered boxes are filled with 0. + filtered_scores: a tensor whose shape is the same as 'scores' but with + the positinon of the filtered boxes filled with 0. + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('filter_boxes'): + if isinstance(image_shape, list) or isinstance(image_shape, tuple): + height, width = image_shape + else: + image_shape = tf.cast(image_shape, dtype=boxes.dtype) + height = image_shape[..., 0] + width = image_shape[..., 1] + + ymin = boxes[..., 0] + xmin = boxes[..., 1] + ymax = boxes[..., 2] + xmax = boxes[..., 3] + + h = ymax - ymin + 1.0 + w = xmax - xmin + 1.0 + yc = ymin + 0.5 * h + xc = xmin + 0.5 * w + + min_size = tf.cast( + tf.math.maximum(min_size_threshold, 1.0), dtype=boxes.dtype) + + filtered_size_mask = tf.math.logical_and( + tf.math.greater(h, min_size), tf.math.greater(w, min_size)) + filtered_center_mask = tf.logical_and( + tf.math.logical_and(tf.math.greater(yc, 0.0), tf.math.less(yc, height)), + tf.math.logical_and(tf.math.greater(xc, 0.0), tf.math.less(xc, width))) + filtered_mask = tf.math.logical_and(filtered_size_mask, + filtered_center_mask) + + filtered_scores = tf.where(filtered_mask, scores, tf.zeros_like(scores)) + filtered_boxes = tf.cast( + tf.expand_dims(filtered_mask, axis=-1), dtype=boxes.dtype) * boxes + + return filtered_boxes, filtered_scores + + +def filter_boxes_by_scores(boxes, scores, min_score_threshold): + """Filter and remove boxes whose scores are smaller than the threshold. + + Args: + boxes: a tensor whose last dimension is 4 representing the coordinates of + boxes in ymin, xmin, ymax, xmax order. + scores: a tensor whose shape is the same as tf.shape(boxes)[:-1] + representing the original scores of the boxes. + min_score_threshold: a float representing the minimal box score threshold. + Boxes whose score are smaller than it will be filtered out. + + Returns: + filtered_boxes: a tensor whose shape is the same as `boxes` but with + the position of the filtered boxes are filled with -1. + filtered_scores: a tensor whose shape is the same as 'scores' but with + the + """ + if boxes.shape[-1] != 4: + raise ValueError('boxes.shape[1] is {:d}, but must be 4.'.format( + boxes.shape[-1])) + + with tf.name_scope('filter_boxes_by_scores'): + filtered_mask = tf.math.greater(scores, min_score_threshold) + filtered_scores = tf.where(filtered_mask, scores, -tf.ones_like(scores)) + filtered_boxes = tf.cast( + tf.expand_dims(filtered_mask, axis=-1), dtype=boxes.dtype) * boxes + + return filtered_boxes, filtered_scores + + +def top_k_boxes(boxes, scores, k): + """Sort and select top k boxes according to the scores. + + Args: + boxes: a tensor of shape [batch_size, N, 4] representing the coordiante of + the boxes. N is the number of boxes per image. + scores: a tensor of shsape [batch_size, N] representing the socre of the + boxes. + k: an integer or a tensor indicating the top k number. + + Returns: + selected_boxes: a tensor of shape [batch_size, k, 4] representing the + selected top k box coordinates. + selected_scores: a tensor of shape [batch_size, k] representing the selected + top k box scores. + """ + with tf.name_scope('top_k_boxes'): + selected_scores, top_k_indices = tf.nn.top_k(scores, k=k, sorted=True) + + batch_size, _ = scores.get_shape().as_list() + if batch_size == 1: + selected_boxes = tf.squeeze( + tf.gather(boxes, top_k_indices, axis=1), axis=1) + else: + top_k_indices_shape = tf.shape(top_k_indices) + batch_indices = ( + tf.expand_dims(tf.range(top_k_indices_shape[0]), axis=-1) * + tf.ones([1, top_k_indices_shape[-1]], dtype=tf.int32)) + gather_nd_indices = tf.stack([batch_indices, top_k_indices], axis=-1) + selected_boxes = tf.gather_nd(boxes, gather_nd_indices) + + return selected_boxes, selected_scores + + +def bbox_overlap(boxes, gt_boxes): + """Calculates the overlap between proposal and ground truth boxes. + + Some `gt_boxes` may have been padded. The returned `iou` tensor for these + boxes will be -1. + + Args: + boxes: a tensor with a shape of [batch_size, N, 4]. N is the number of + proposals before groundtruth assignment (e.g., rpn_post_nms_topn). The + last dimension is the pixel coordinates in [ymin, xmin, ymax, xmax] form. + gt_boxes: a tensor with a shape of [batch_size, MAX_NUM_INSTANCES, 4]. This + tensor might have paddings with a negative value. + + Returns: + iou: a tensor with as a shape of [batch_size, N, MAX_NUM_INSTANCES]. + """ + with tf.name_scope('bbox_overlap'): + bb_y_min, bb_x_min, bb_y_max, bb_x_max = tf.split( + value=boxes, num_or_size_splits=4, axis=2) + gt_y_min, gt_x_min, gt_y_max, gt_x_max = tf.split( + value=gt_boxes, num_or_size_splits=4, axis=2) + + # Calculates the intersection area. + i_xmin = tf.math.maximum(bb_x_min, tf.transpose(gt_x_min, [0, 2, 1])) + i_xmax = tf.math.minimum(bb_x_max, tf.transpose(gt_x_max, [0, 2, 1])) + i_ymin = tf.math.maximum(bb_y_min, tf.transpose(gt_y_min, [0, 2, 1])) + i_ymax = tf.math.minimum(bb_y_max, tf.transpose(gt_y_max, [0, 2, 1])) + i_area = tf.math.maximum((i_xmax - i_xmin), 0) * tf.math.maximum( + (i_ymax - i_ymin), 0) + + # Calculates the union area. + bb_area = (bb_y_max - bb_y_min) * (bb_x_max - bb_x_min) + gt_area = (gt_y_max - gt_y_min) * (gt_x_max - gt_x_min) + # Adds a small epsilon to avoid divide-by-zero. + u_area = bb_area + tf.transpose(gt_area, [0, 2, 1]) - i_area + 1e-8 + + # Calculates IoU. + iou = i_area / u_area + + # Fills -1 for IoU entries between the padded ground truth boxes. + gt_invalid_mask = tf.less( + tf.reduce_max(gt_boxes, axis=-1, keepdims=True), 0.0) + padding_mask = tf.logical_or( + tf.zeros_like(bb_x_min, dtype=tf.bool), + tf.transpose(gt_invalid_mask, [0, 2, 1])) + iou = tf.where(padding_mask, -tf.ones_like(iou), iou) + + return iou + + +def get_non_empty_box_indices(boxes): + """Get indices for non-empty boxes.""" + # Selects indices if box height or width is 0. + height = boxes[:, 2] - boxes[:, 0] + width = boxes[:, 3] - boxes[:, 1] + indices = tf.where(tf.logical_and(tf.greater(height, 0), + tf.greater(width, 0))) + return indices[:, 0] diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/class_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/class_utils.py new file mode 100644 index 0000000..cce9cf9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/class_utils.py @@ -0,0 +1,44 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions for handling dataset object categories.""" + + +def coco_split_class_ids(split_name): + """Return the COCO class split ids based on split name and training mode. + + Args: + split_name: The name of dataset split. + + Returns: + class_ids: a python list of integer. + """ + if split_name == 'all': + return [] + + elif split_name == 'voc': + return [ + 1, 2, 3, 4, 5, 6, 7, 9, 16, 17, 18, 19, 20, 21, 44, 62, 63, 64, 67, 72 + ] + + elif split_name == 'nonvoc': + return [ + 8, 10, 11, 13, 14, 15, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 65, 70, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, + 85, 86, 87, 88, 89, 90 + ] + + else: + raise ValueError('Invalid split name {}!!!'.format(split_name)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/dataloader_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/dataloader_utils.py new file mode 100644 index 0000000..59b45d6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/dataloader_utils.py @@ -0,0 +1,40 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions for dataloader.""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils import input_utils + + +def process_source_id(source_id): + """Processes source_id to the right format.""" + if source_id.dtype == tf.string: + source_id = tf.cast(tf.strings.to_number(source_id), tf.int64) + with tf.control_dependencies([source_id]): + source_id = tf.cond( + pred=tf.equal(tf.size(input=source_id), 0), + true_fn=lambda: tf.cast(tf.constant(-1), tf.int64), + false_fn=lambda: tf.identity(source_id)) + return source_id + + +def pad_groundtruths_to_fixed_size(gt, n): + """Pads the first dimension of groundtruths labels to the fixed size.""" + gt['boxes'] = input_utils.pad_to_fixed_size(gt['boxes'], n, -1) + gt['is_crowds'] = input_utils.pad_to_fixed_size(gt['is_crowds'], n, 0) + gt['areas'] = input_utils.pad_to_fixed_size(gt['areas'], n, -1) + gt['classes'] = input_utils.pad_to_fixed_size(gt['classes'], n, -1) + return gt diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/input_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/input_utils.py new file mode 100644 index 0000000..3233f62 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/input_utils.py @@ -0,0 +1,366 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions for input processing.""" + +import math +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils import box_utils +from official.vision.detection.utils.object_detection import preprocessor + + +def pad_to_fixed_size(input_tensor, size, constant_values=0): + """Pads data to a fixed length at the first dimension. + + Args: + input_tensor: `Tensor` with any dimension. + size: `int` number for the first dimension of output Tensor. + constant_values: `int` value assigned to the paddings. + + Returns: + `Tensor` with the first dimension padded to `size`. + """ + input_shape = input_tensor.get_shape().as_list() + padding_shape = [] + + # Computes the padding length on the first dimension. + padding_length = size - tf.shape(input=input_tensor)[0] + assert_length = tf.Assert( + tf.greater_equal(padding_length, 0), [padding_length]) + with tf.control_dependencies([assert_length]): + padding_shape.append(padding_length) + + # Copies shapes of the rest of input shape dimensions. + for i in range(1, len(input_shape)): + padding_shape.append(tf.shape(input=input_tensor)[i]) + + # Pads input tensor to the fixed first dimension. + paddings = tf.cast(constant_values * tf.ones(padding_shape), + input_tensor.dtype) + padded_tensor = tf.concat([input_tensor, paddings], axis=0) + output_shape = input_shape + output_shape[0] = size + padded_tensor.set_shape(output_shape) + return padded_tensor + + +def normalize_image(image, + offset=(0.485, 0.456, 0.406), + scale=(0.229, 0.224, 0.225)): + """Normalizes the image to zero mean and unit variance.""" + image = tf.image.convert_image_dtype(image, dtype=tf.float32) + offset = tf.constant(offset) + offset = tf.expand_dims(offset, axis=0) + offset = tf.expand_dims(offset, axis=0) + image -= offset + + scale = tf.constant(scale) + scale = tf.expand_dims(scale, axis=0) + scale = tf.expand_dims(scale, axis=0) + image /= scale + return image + + +def compute_padded_size(desired_size, stride): + """Compute the padded size given the desired size and the stride. + + The padded size will be the smallest rectangle, such that each dimension is + the smallest multiple of the stride which is larger than the desired + dimension. For example, if desired_size = (100, 200) and stride = 32, + the output padded_size = (128, 224). + + Args: + desired_size: a `Tensor` or `int` list/tuple of two elements representing + [height, width] of the target output image size. + stride: an integer, the stride of the backbone network. + + Returns: + padded_size: a `Tensor` or `int` list/tuple of two elements representing + [height, width] of the padded output image size. + """ + if isinstance(desired_size, list) or isinstance(desired_size, tuple): + padded_size = [int(math.ceil(d * 1.0 / stride) * stride) + for d in desired_size] + else: + padded_size = tf.cast( + tf.math.ceil( + tf.cast(desired_size, dtype=tf.float32) / stride) * stride, + tf.int32) + return padded_size + + +def resize_and_crop_image(image, + desired_size, + padded_size, + aug_scale_min=1.0, + aug_scale_max=1.0, + seed=1, + method=tf.image.ResizeMethod.BILINEAR): + """Resizes the input image to output size. + + Resize and pad images given the desired output size of the image and + stride size. + + Here are the preprocessing steps. + 1. For a given image, keep its aspect ratio and rescale the image to make it + the largest rectangle to be bounded by the rectangle specified by the + `desired_size`. + 2. Pad the rescaled image to the padded_size. + + Args: + image: a `Tensor` of shape [height, width, 3] representing an image. + desired_size: a `Tensor` or `int` list/tuple of two elements representing + [height, width] of the desired actual output image size. + padded_size: a `Tensor` or `int` list/tuple of two elements representing + [height, width] of the padded output image size. Padding will be applied + after scaling the image to the desired_size. + aug_scale_min: a `float` with range between [0, 1.0] representing minimum + random scale applied to desired_size for training scale jittering. + aug_scale_max: a `float` with range between [1.0, inf] representing maximum + random scale applied to desired_size for training scale jittering. + seed: seed for random scale jittering. + method: function to resize input image to scaled image. + + Returns: + output_image: `Tensor` of shape [height, width, 3] where [height, width] + equals to `output_size`. + image_info: a 2D `Tensor` that encodes the information of the image and the + applied preprocessing. It is in the format of + [[original_height, original_width], [desired_height, desired_width], + [y_scale, x_scale], [y_offset, x_offset]], where [desired_height, + desireed_width] is the actual scaled image size, and [y_scale, x_scale] is + the scaling factory, which is the ratio of + scaled dimension / original dimension. + """ + with tf.name_scope('resize_and_crop_image'): + image_size = tf.cast(tf.shape(input=image)[0:2], tf.float32) + + random_jittering = (aug_scale_min != 1.0 or aug_scale_max != 1.0) + + if random_jittering: + random_scale = tf.random.uniform([], + aug_scale_min, + aug_scale_max, + seed=seed) + scaled_size = tf.round(random_scale * desired_size) + else: + scaled_size = desired_size + + scale = tf.minimum( + scaled_size[0] / image_size[0], scaled_size[1] / image_size[1]) + scaled_size = tf.round(image_size * scale) + + # Computes 2D image_scale. + image_scale = scaled_size / image_size + + # Selects non-zero random offset (x, y) if scaled image is larger than + # desired_size. + if random_jittering: + max_offset = scaled_size - desired_size + max_offset = tf.where(tf.less(max_offset, 0), + tf.zeros_like(max_offset), + max_offset) + offset = max_offset * tf.random.uniform([ + 2, + ], 0, 1, seed=seed) + offset = tf.cast(offset, tf.int32) + else: + offset = tf.zeros((2,), tf.int32) + + scaled_image = tf.image.resize( + image, tf.cast(scaled_size, tf.int32), method=method) + + if random_jittering: + scaled_image = scaled_image[offset[0]:offset[0] + desired_size[0], + offset[1]:offset[1] + desired_size[1], :] + + output_image = tf.image.pad_to_bounding_box(scaled_image, 0, 0, + padded_size[0], padded_size[1]) + + image_info = tf.stack([ + image_size, + tf.cast(desired_size, dtype=tf.float32), + image_scale, + tf.cast(offset, tf.float32)]) + return output_image, image_info + + +def resize_and_crop_image_v2(image, + short_side, + long_side, + padded_size, + aug_scale_min=1.0, + aug_scale_max=1.0, + seed=1, + method=tf.image.ResizeMethod.BILINEAR): + """Resizes the input image to output size (Faster R-CNN style). + + Resize and pad images given the specified short / long side length and the + stride size. + + Here are the preprocessing steps. + 1. For a given image, keep its aspect ratio and first try to rescale the short + side of the original image to `short_side`. + 2. If the scaled image after 1 has a long side that exceeds `long_side`, keep + the aspect ratio and rescal the long side of the image to `long_side`. + 2. Pad the rescaled image to the padded_size. + + Args: + image: a `Tensor` of shape [height, width, 3] representing an image. + short_side: a scalar `Tensor` or `int` representing the desired short side + to be rescaled to. + long_side: a scalar `Tensor` or `int` representing the desired long side to + be rescaled to. + padded_size: a `Tensor` or `int` list/tuple of two elements representing + [height, width] of the padded output image size. Padding will be applied + after scaling the image to the desired_size. + aug_scale_min: a `float` with range between [0, 1.0] representing minimum + random scale applied to desired_size for training scale jittering. + aug_scale_max: a `float` with range between [1.0, inf] representing maximum + random scale applied to desired_size for training scale jittering. + seed: seed for random scale jittering. + method: function to resize input image to scaled image. + + Returns: + output_image: `Tensor` of shape [height, width, 3] where [height, width] + equals to `output_size`. + image_info: a 2D `Tensor` that encodes the information of the image and the + applied preprocessing. It is in the format of + [[original_height, original_width], [desired_height, desired_width], + [y_scale, x_scale], [y_offset, x_offset]], where [desired_height, + desired_width] is the actual scaled image size, and [y_scale, x_scale] is + the scaling factor, which is the ratio of + scaled dimension / original dimension. + """ + with tf.name_scope('resize_and_crop_image_v2'): + image_size = tf.cast(tf.shape(image)[0:2], tf.float32) + + scale_using_short_side = ( + short_side / tf.math.minimum(image_size[0], image_size[1])) + scale_using_long_side = ( + long_side / tf.math.maximum(image_size[0], image_size[1])) + + scaled_size = tf.math.round(image_size * scale_using_short_side) + scaled_size = tf.where( + tf.math.greater( + tf.math.maximum(scaled_size[0], scaled_size[1]), long_side), + tf.math.round(image_size * scale_using_long_side), scaled_size) + desired_size = scaled_size + + random_jittering = (aug_scale_min != 1.0 or aug_scale_max != 1.0) + + if random_jittering: + random_scale = tf.random.uniform([], + aug_scale_min, + aug_scale_max, + seed=seed) + scaled_size = tf.math.round(random_scale * scaled_size) + + # Computes 2D image_scale. + image_scale = scaled_size / image_size + + # Selects non-zero random offset (x, y) if scaled image is larger than + # desired_size. + if random_jittering: + max_offset = scaled_size - desired_size + max_offset = tf.where( + tf.math.less(max_offset, 0), tf.zeros_like(max_offset), max_offset) + offset = max_offset * tf.random.uniform([ + 2, + ], 0, 1, seed=seed) + offset = tf.cast(offset, tf.int32) + else: + offset = tf.zeros((2,), tf.int32) + + scaled_image = tf.image.resize( + image, tf.cast(scaled_size, tf.int32), method=method) + + if random_jittering: + scaled_image = scaled_image[ + offset[0]:offset[0] + desired_size[0], + offset[1]:offset[1] + desired_size[1], :] + + output_image = tf.image.pad_to_bounding_box( + scaled_image, 0, 0, padded_size[0], padded_size[1]) + + image_info = tf.stack([ + image_size, + tf.cast(desired_size, dtype=tf.float32), + image_scale, + tf.cast(offset, tf.float32)]) + return output_image, image_info + + +def resize_and_crop_boxes(boxes, + image_scale, + output_size, + offset): + """Resizes boxes to output size with scale and offset. + + Args: + boxes: `Tensor` of shape [N, 4] representing ground truth boxes. + image_scale: 2D float `Tensor` representing scale factors that apply to + [height, width] of input image. + output_size: 2D `Tensor` or `int` representing [height, width] of target + output image size. + offset: 2D `Tensor` representing top-left corner [y0, x0] to crop scaled + boxes. + + Returns: + boxes: `Tensor` of shape [N, 4] representing the scaled boxes. + """ + # Adjusts box coordinates based on image_scale and offset. + boxes *= tf.tile(tf.expand_dims(image_scale, axis=0), [1, 2]) + boxes -= tf.tile(tf.expand_dims(offset, axis=0), [1, 2]) + # Clips the boxes. + boxes = box_utils.clip_boxes(boxes, output_size) + return boxes + + +def resize_and_crop_masks(masks, + image_scale, + output_size, + offset): + """Resizes boxes to output size with scale and offset. + + Args: + masks: `Tensor` of shape [N, H, W, 1] representing ground truth masks. + image_scale: 2D float `Tensor` representing scale factors that apply to + [height, width] of input image. + output_size: 2D `Tensor` or `int` representing [height, width] of target + output image size. + offset: 2D `Tensor` representing top-left corner [y0, x0] to crop scaled + boxes. + + Returns: + masks: `Tensor` of shape [N, H, W, 1] representing the scaled masks. + """ + mask_size = tf.shape(input=masks)[1:3] + scaled_size = tf.cast(image_scale * tf.cast(mask_size, image_scale.dtype), + tf.int32) + scaled_masks = tf.image.resize( + masks, scaled_size, method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + offset = tf.cast(offset, tf.int32) + scaled_masks = scaled_masks[:, offset[0]:offset[0] + output_size[0], + offset[1]:offset[1] + output_size[1], :] + + output_masks = tf.image.pad_to_bounding_box(scaled_masks, 0, 0, + output_size[0], output_size[1]) + return output_masks + + +def random_horizontal_flip(image, boxes=None, masks=None): + """Randomly flips input image and bounding boxes.""" + return preprocessor.random_horizontal_flip(image, boxes, masks) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/mask_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/mask_utils.py new file mode 100644 index 0000000..637d048 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/mask_utils.py @@ -0,0 +1,192 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utility functions for segmentations.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import numpy as np +import cv2 + + +def paste_instance_masks(masks, + detected_boxes, + image_height, + image_width): + """Paste instance masks to generate the image segmentation results. + + Args: + masks: a numpy array of shape [N, mask_height, mask_width] representing the + instance masks w.r.t. the `detected_boxes`. + detected_boxes: a numpy array of shape [N, 4] representing the reference + bounding boxes. + image_height: an integer representing the height of the image. + image_width: an integer representing the width of the image. + + Returns: + segms: a numpy array of shape [N, image_height, image_width] representing + the instance masks *pasted* on the image canvas. + """ + + def expand_boxes(boxes, scale): + """Expands an array of boxes by a given scale.""" + # Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/utils/boxes.py#L227 # pylint: disable=line-too-long + # The `boxes` in the reference implementation is in [x1, y1, x2, y2] form, + # whereas `boxes` here is in [x1, y1, w, h] form + w_half = boxes[:, 2] * .5 + h_half = boxes[:, 3] * .5 + x_c = boxes[:, 0] + w_half + y_c = boxes[:, 1] + h_half + + w_half *= scale + h_half *= scale + + boxes_exp = np.zeros(boxes.shape) + boxes_exp[:, 0] = x_c - w_half + boxes_exp[:, 2] = x_c + w_half + boxes_exp[:, 1] = y_c - h_half + boxes_exp[:, 3] = y_c + h_half + + return boxes_exp + + # Reference: https://github.com/facebookresearch/Detectron/blob/master/detectron/core/test.py#L812 # pylint: disable=line-too-long + # To work around an issue with cv2.resize (it seems to automatically pad + # with repeated border values), we manually zero-pad the masks by 1 pixel + # prior to resizing back to the original image resolution. This prevents + # "top hat" artifacts. We therefore need to expand the reference boxes by an + # appropriate factor. + _, mask_height, mask_width = masks.shape + scale = max((mask_width + 2.0) / mask_width, + (mask_height + 2.0) / mask_height) + + ref_boxes = expand_boxes(detected_boxes, scale) + ref_boxes = ref_boxes.astype(np.int32) + padded_mask = np.zeros((mask_height + 2, mask_width + 2), dtype=np.float32) + segms = [] + for mask_ind, mask in enumerate(masks): + im_mask = np.zeros((image_height, image_width), dtype=np.uint8) + # Process mask inside bounding boxes. + padded_mask[1:-1, 1:-1] = mask[:, :] + + ref_box = ref_boxes[mask_ind, :] + w = ref_box[2] - ref_box[0] + 1 + h = ref_box[3] - ref_box[1] + 1 + w = np.maximum(w, 1) + h = np.maximum(h, 1) + + mask = cv2.resize(padded_mask, (w, h)) + mask = np.array(mask > 0.5, dtype=np.uint8) + + x_0 = min(max(ref_box[0], 0), image_width) + x_1 = min(max(ref_box[2] + 1, 0), image_width) + y_0 = min(max(ref_box[1], 0), image_height) + y_1 = min(max(ref_box[3] + 1, 0), image_height) + + im_mask[y_0:y_1, x_0:x_1] = mask[ + (y_0 - ref_box[1]):(y_1 - ref_box[1]), + (x_0 - ref_box[0]):(x_1 - ref_box[0]) + ] + segms.append(im_mask) + + segms = np.array(segms) + assert masks.shape[0] == segms.shape[0] + return segms + + +def paste_instance_masks_v2(masks, + detected_boxes, + image_height, + image_width): + """Paste instance masks to generate the image segmentation (v2). + + Args: + masks: a numpy array of shape [N, mask_height, mask_width] representing the + instance masks w.r.t. the `detected_boxes`. + detected_boxes: a numpy array of shape [N, 4] representing the reference + bounding boxes. + image_height: an integer representing the height of the image. + image_width: an integer representing the width of the image. + + Returns: + segms: a numpy array of shape [N, image_height, image_width] representing + the instance masks *pasted* on the image canvas. + """ + _, mask_height, mask_width = masks.shape + + segms = [] + for i, mask in enumerate(masks): + box = detected_boxes[i, :] + xmin = box[0] + ymin = box[1] + xmax = xmin + box[2] + ymax = ymin + box[3] + + # Sample points of the cropped mask w.r.t. the image grid. + # Note that these coordinates may fall beyond the image. + # Pixel clipping will happen after warping. + xmin_int = int(math.floor(xmin)) + xmax_int = int(math.ceil(xmax)) + ymin_int = int(math.floor(ymin)) + ymax_int = int(math.ceil(ymax)) + + alpha = box[2] / (1.0 * mask_width) + beta = box[3] / (1.0 * mask_height) + # pylint: disable=invalid-name + # Transformation from mask pixel indices to image coordinate. + M_mask_to_image = np.array( + [[alpha, 0, xmin], + [0, beta, ymin], + [0, 0, 1]], + dtype=np.float32) + # Transformation from image to cropped mask coordinate. + M_image_to_crop = np.array( + [[1, 0, -xmin_int], + [0, 1, -ymin_int], + [0, 0, 1]], + dtype=np.float32) + M = np.dot(M_image_to_crop, M_mask_to_image) + # Compensate the half pixel offset that OpenCV has in the + # warpPerspective implementation: the top-left pixel is sampled + # at (0,0), but we want it to be at (0.5, 0.5). + M = np.dot( + np.dot( + np.array([[1, 0, -0.5], + [0, 1, -0.5], + [0, 0, 1]], np.float32), + M), + np.array([[1, 0, 0.5], + [0, 1, 0.5], + [0, 0, 1]], np.float32)) + # pylint: enable=invalid-name + cropped_mask = cv2.warpPerspective( + mask.astype(np.float32), M, + (xmax_int - xmin_int, ymax_int - ymin_int)) + cropped_mask = np.array(cropped_mask > 0.5, dtype=np.uint8) + + img_mask = np.zeros((image_height, image_width)) + x0 = max(min(xmin_int, image_width), 0) + x1 = max(min(xmax_int, image_width), 0) + y0 = max(min(ymin_int, image_height), 0) + y1 = max(min(ymax_int, image_height), 0) + img_mask[y0:y1, x0:x1] = cropped_mask[ + (y0 - ymin_int):(y1 - ymin_int), + (x0 - xmin_int):(x1 - xmin_int)] + + segms.append(img_mask) + + segms = np.array(segms) + return segms + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/__init__.py new file mode 100644 index 0000000..85c94f4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/argmax_matcher.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/argmax_matcher.py new file mode 100644 index 0000000..b433eb4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/argmax_matcher.py @@ -0,0 +1,201 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Argmax matcher implementation. + +This class takes a similarity matrix and matches columns to rows based on the +maximum value per column. One can specify matched_thresholds and +to prevent columns from matching to rows (generally resulting in a negative +training example) and unmatched_theshold to ignore the match (generally +resulting in neither a positive or negative training example). + +This matcher is used in Fast(er)-RCNN. + +Note: matchers are used in TargetAssigners. There is a create_target_assigner +factory function for popular implementations. +""" +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import matcher +from official.vision.detection.utils.object_detection import shape_utils + + +class ArgMaxMatcher(matcher.Matcher): + """Matcher based on highest value. + + This class computes matches from a similarity matrix. Each column is matched + to a single row. + + To support object detection target assignment this class enables setting both + matched_threshold (upper threshold) and unmatched_threshold (lower thresholds) + defining three categories of similarity which define whether examples are + positive, negative, or ignored: + (1) similarity >= matched_threshold: Highest similarity. Matched/Positive! + (2) matched_threshold > similarity >= unmatched_threshold: Medium similarity. + Depending on negatives_lower_than_unmatched, this is either + Unmatched/Negative OR Ignore. + (3) unmatched_threshold > similarity: Lowest similarity. Depending on flag + negatives_lower_than_unmatched, either Unmatched/Negative OR Ignore. + For ignored matches this class sets the values in the Match object to -2. + """ + + def __init__(self, + matched_threshold, + unmatched_threshold=None, + negatives_lower_than_unmatched=True, + force_match_for_each_row=False): + """Construct ArgMaxMatcher. + + Args: + matched_threshold: Threshold for positive matches. Positive if + sim >= matched_threshold, where sim is the maximum value of the + similarity matrix for a given column. Set to None for no threshold. + unmatched_threshold: Threshold for negative matches. Negative if + sim < unmatched_threshold. Defaults to matched_threshold + when set to None. + negatives_lower_than_unmatched: Boolean which defaults to True. If True + then negative matches are the ones below the unmatched_threshold, + whereas ignored matches are in between the matched and umatched + threshold. If False, then negative matches are in between the matched + and unmatched threshold, and everything lower than unmatched is ignored. + force_match_for_each_row: If True, ensures that each row is matched to + at least one column (which is not guaranteed otherwise if the + matched_threshold is high). Defaults to False. See + argmax_matcher_test.testMatcherForceMatch() for an example. + + Raises: + ValueError: if unmatched_threshold is set but matched_threshold is not set + or if unmatched_threshold > matched_threshold. + """ + if (matched_threshold is None) and (unmatched_threshold is not None): + raise ValueError('Need to also define matched_threshold when' + 'unmatched_threshold is defined') + self._matched_threshold = matched_threshold + if unmatched_threshold is None: + self._unmatched_threshold = matched_threshold + else: + if unmatched_threshold > matched_threshold: + raise ValueError('unmatched_threshold needs to be smaller or equal' + 'to matched_threshold') + self._unmatched_threshold = unmatched_threshold + if not negatives_lower_than_unmatched: + if self._unmatched_threshold == self._matched_threshold: + raise ValueError('When negatives are in between matched and ' + 'unmatched thresholds, these cannot be of equal ' + 'value. matched: %s, unmatched: %s', + self._matched_threshold, self._unmatched_threshold) + self._force_match_for_each_row = force_match_for_each_row + self._negatives_lower_than_unmatched = negatives_lower_than_unmatched + + def _match(self, similarity_matrix): + """Tries to match each column of the similarity matrix to a row. + + Args: + similarity_matrix: tensor of shape [N, M] representing any similarity + metric. + + Returns: + Match object with corresponding matches for each of M columns. + """ + + def _match_when_rows_are_empty(): + """Performs matching when the rows of similarity matrix are empty. + + When the rows are empty, all detections are false positives. So we return + a tensor of -1's to indicate that the columns do not match to any rows. + + Returns: + matches: int32 tensor indicating the row each column matches to. + """ + similarity_matrix_shape = shape_utils.combined_static_and_dynamic_shape( + similarity_matrix) + return -1 * tf.ones([similarity_matrix_shape[1]], dtype=tf.int32) + + def _match_when_rows_are_non_empty(): + """Performs matching when the rows of similarity matrix are non empty. + + Returns: + matches: int32 tensor indicating the row each column matches to. + """ + # Matches for each column + matches = tf.argmax(input=similarity_matrix, axis=0, output_type=tf.int32) + + # Deal with matched and unmatched threshold + if self._matched_threshold is not None: + # Get logical indices of ignored and unmatched columns as tf.int64 + matched_vals = tf.reduce_max(input_tensor=similarity_matrix, axis=0) + below_unmatched_threshold = tf.greater(self._unmatched_threshold, + matched_vals) + between_thresholds = tf.logical_and( + tf.greater_equal(matched_vals, self._unmatched_threshold), + tf.greater(self._matched_threshold, matched_vals)) + + if self._negatives_lower_than_unmatched: + matches = self._set_values_using_indicator(matches, + below_unmatched_threshold, + -1) + matches = self._set_values_using_indicator(matches, + between_thresholds, + -2) + else: + matches = self._set_values_using_indicator(matches, + below_unmatched_threshold, + -2) + matches = self._set_values_using_indicator(matches, + between_thresholds, + -1) + + if self._force_match_for_each_row: + similarity_matrix_shape = shape_utils.combined_static_and_dynamic_shape( + similarity_matrix) + force_match_column_ids = tf.argmax( + input=similarity_matrix, axis=1, output_type=tf.int32) + force_match_column_indicators = tf.one_hot( + force_match_column_ids, depth=similarity_matrix_shape[1]) + force_match_row_ids = tf.argmax( + input=force_match_column_indicators, axis=0, output_type=tf.int32) + force_match_column_mask = tf.cast( + tf.reduce_max(input_tensor=force_match_column_indicators, axis=0), + tf.bool) + final_matches = tf.where(force_match_column_mask, force_match_row_ids, + matches) + return final_matches + else: + return matches + + if similarity_matrix.shape.is_fully_defined(): + if similarity_matrix.shape.dims[0].value == 0: + return _match_when_rows_are_empty() + else: + return _match_when_rows_are_non_empty() + else: + return tf.cond( + pred=tf.greater(tf.shape(input=similarity_matrix)[0], 0), + true_fn=_match_when_rows_are_non_empty, + false_fn=_match_when_rows_are_empty) + + def _set_values_using_indicator(self, x, indicator, val): + """Set the indicated fields of x to val. + + Args: + x: tensor. + indicator: boolean with same shape as x. + val: scalar with value to set. + + Returns: + modified tensor. + """ + indicator = tf.cast(indicator, x.dtype) + return tf.add(tf.multiply(x, 1 - indicator), val * indicator) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/balanced_positive_negative_sampler.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/balanced_positive_negative_sampler.py new file mode 100644 index 0000000..fec123e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/balanced_positive_negative_sampler.py @@ -0,0 +1,274 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Class to subsample minibatches by balancing positives and negatives. + +Subsamples minibatches based on a pre-specified positive fraction in range +[0,1]. The class presumes there are many more negatives than positive examples: +if the desired batch_size cannot be achieved with the pre-specified positive +fraction, it fills the rest with negative examples. If this is not sufficient +for obtaining the desired batch_size, it returns fewer examples. + +The main function to call is Subsample(self, indicator, labels). For convenience +one can also call SubsampleWeights(self, weights, labels) which is defined in +the minibatch_sampler base class. + +When is_static is True, it implements a method that guarantees static shapes. +It also ensures the length of output of the subsample is always batch_size, even +when number of examples set to True in indicator is less than batch_size. + +This is originally implemented in TensorFlow Object Detection API. +""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import minibatch_sampler +from official.vision.detection.utils.object_detection import ops + + +class BalancedPositiveNegativeSampler(minibatch_sampler.MinibatchSampler): + """Subsamples minibatches to a desired balance of positives and negatives.""" + + def __init__(self, positive_fraction=0.5, is_static=False): + """Constructs a minibatch sampler. + + Args: + positive_fraction: desired fraction of positive examples (scalar in [0,1]) + in the batch. + is_static: If True, uses an implementation with static shape guarantees. + + Raises: + ValueError: if positive_fraction < 0, or positive_fraction > 1 + """ + if positive_fraction < 0 or positive_fraction > 1: + raise ValueError('positive_fraction should be in range [0,1]. ' + 'Received: %s.' % positive_fraction) + self._positive_fraction = positive_fraction + self._is_static = is_static + + def _get_num_pos_neg_samples(self, sorted_indices_tensor, sample_size): + """Counts the number of positives and negatives numbers to be sampled. + + Args: + sorted_indices_tensor: A sorted int32 tensor of shape [N] which contains + the signed indices of the examples where the sign is based on the label + value. The examples that cannot be sampled are set to 0. It samples + atmost sample_size*positive_fraction positive examples and remaining + from negative examples. + sample_size: Size of subsamples. + + Returns: + A tuple containing the number of positive and negative labels in the + subsample. + """ + input_length = tf.shape(input=sorted_indices_tensor)[0] + valid_positive_index = tf.greater(sorted_indices_tensor, + tf.zeros(input_length, tf.int32)) + num_sampled_pos = tf.reduce_sum( + input_tensor=tf.cast(valid_positive_index, tf.int32)) + max_num_positive_samples = tf.constant( + int(sample_size * self._positive_fraction), tf.int32) + num_positive_samples = tf.minimum(max_num_positive_samples, num_sampled_pos) + num_negative_samples = tf.constant(sample_size, + tf.int32) - num_positive_samples + + return num_positive_samples, num_negative_samples + + def _get_values_from_start_and_end(self, input_tensor, num_start_samples, + num_end_samples, total_num_samples): + """slices num_start_samples and last num_end_samples from input_tensor. + + Args: + input_tensor: An int32 tensor of shape [N] to be sliced. + num_start_samples: Number of examples to be sliced from the beginning + of the input tensor. + num_end_samples: Number of examples to be sliced from the end of the + input tensor. + total_num_samples: Sum of is num_start_samples and num_end_samples. This + should be a scalar. + + Returns: + A tensor containing the first num_start_samples and last num_end_samples + from input_tensor. + + """ + input_length = tf.shape(input=input_tensor)[0] + start_positions = tf.less(tf.range(input_length), num_start_samples) + end_positions = tf.greater_equal( + tf.range(input_length), input_length - num_end_samples) + selected_positions = tf.logical_or(start_positions, end_positions) + selected_positions = tf.cast(selected_positions, tf.float32) + indexed_positions = tf.multiply(tf.cumsum(selected_positions), + selected_positions) + one_hot_selector = tf.one_hot(tf.cast(indexed_positions, tf.int32) - 1, + total_num_samples, + dtype=tf.float32) + return tf.cast(tf.tensordot(tf.cast(input_tensor, tf.float32), + one_hot_selector, axes=[0, 0]), tf.int32) + + def _static_subsample(self, indicator, batch_size, labels): + """Returns subsampled minibatch. + + Args: + indicator: boolean tensor of shape [N] whose True entries can be sampled. + N should be a complie time constant. + batch_size: desired batch size. This scalar cannot be None. + labels: boolean tensor of shape [N] denoting positive(=True) and negative + (=False) examples. N should be a complie time constant. + + Returns: + sampled_idx_indicator: boolean tensor of shape [N], True for entries which + are sampled. It ensures the length of output of the subsample is always + batch_size, even when number of examples set to True in indicator is + less than batch_size. + + Raises: + ValueError: if labels and indicator are not 1D boolean tensors. + """ + # Check if indicator and labels have a static size. + if not indicator.shape.is_fully_defined(): + raise ValueError('indicator must be static in shape when is_static is' + 'True') + if not labels.shape.is_fully_defined(): + raise ValueError('labels must be static in shape when is_static is' + 'True') + if not isinstance(batch_size, int): + raise ValueError('batch_size has to be an integer when is_static is' + 'True.') + + input_length = tf.shape(input=indicator)[0] + + # Set the number of examples set True in indicator to be at least + # batch_size. + num_true_sampled = tf.reduce_sum( + input_tensor=tf.cast(indicator, tf.float32)) + additional_false_sample = tf.less_equal( + tf.cumsum(tf.cast(tf.logical_not(indicator), tf.float32)), + batch_size - num_true_sampled) + indicator = tf.logical_or(indicator, additional_false_sample) + + # Shuffle indicator and label. Need to store the permutation to restore the + # order post sampling. + permutation = tf.random.shuffle(tf.range(input_length)) + indicator = ops.matmul_gather_on_zeroth_axis( + tf.cast(indicator, tf.float32), permutation) + labels = ops.matmul_gather_on_zeroth_axis( + tf.cast(labels, tf.float32), permutation) + + # index (starting from 1) when indicator is True, 0 when False + indicator_idx = tf.where( + tf.cast(indicator, tf.bool), tf.range(1, input_length + 1), + tf.zeros(input_length, tf.int32)) + + # Replace -1 for negative, +1 for positive labels + signed_label = tf.where( + tf.cast(labels, tf.bool), tf.ones(input_length, tf.int32), + tf.scalar_mul(-1, tf.ones(input_length, tf.int32))) + # negative of index for negative label, positive index for positive label, + # 0 when indicator is False. + signed_indicator_idx = tf.multiply(indicator_idx, signed_label) + sorted_signed_indicator_idx = tf.nn.top_k( + signed_indicator_idx, input_length, sorted=True).values + + [num_positive_samples, + num_negative_samples] = self._get_num_pos_neg_samples( + sorted_signed_indicator_idx, batch_size) + + sampled_idx = self._get_values_from_start_and_end( + sorted_signed_indicator_idx, num_positive_samples, + num_negative_samples, batch_size) + + # Shift the indices to start from 0 and remove any samples that are set as + # False. + sampled_idx = tf.abs(sampled_idx) - tf.ones(batch_size, tf.int32) + sampled_idx = tf.multiply( + tf.cast(tf.greater_equal(sampled_idx, tf.constant(0)), tf.int32), + sampled_idx) + + sampled_idx_indicator = tf.cast( + tf.reduce_sum( + input_tensor=tf.one_hot(sampled_idx, depth=input_length), axis=0), + tf.bool) + + # project back the order based on stored permutations + reprojections = tf.one_hot(permutation, depth=input_length, + dtype=tf.float32) + return tf.cast(tf.tensordot( + tf.cast(sampled_idx_indicator, tf.float32), + reprojections, axes=[0, 0]), tf.bool) + + def subsample(self, indicator, batch_size, labels, scope=None): + """Returns subsampled minibatch. + + Args: + indicator: boolean tensor of shape [N] whose True entries can be sampled. + batch_size: desired batch size. If None, keeps all positive samples and + randomly selects negative samples so that the positive sample fraction + matches self._positive_fraction. It cannot be None is is_static is True. + labels: boolean tensor of shape [N] denoting positive(=True) and negative + (=False) examples. + scope: name scope. + + Returns: + sampled_idx_indicator: boolean tensor of shape [N], True for entries which + are sampled. + + Raises: + ValueError: if labels and indicator are not 1D boolean tensors. + """ + if len(indicator.get_shape().as_list()) != 1: + raise ValueError('indicator must be 1 dimensional, got a tensor of ' + 'shape %s' % indicator.get_shape()) + if len(labels.get_shape().as_list()) != 1: + raise ValueError('labels must be 1 dimensional, got a tensor of ' + 'shape %s' % labels.get_shape()) + if labels.dtype != tf.bool: + raise ValueError('labels should be of type bool. Received: %s' % + labels.dtype) + if indicator.dtype != tf.bool: + raise ValueError('indicator should be of type bool. Received: %s' % + indicator.dtype) + scope = scope or 'BalancedPositiveNegativeSampler' + with tf.name_scope(scope): + if self._is_static: + return self._static_subsample(indicator, batch_size, labels) + + else: + # Only sample from indicated samples + negative_idx = tf.logical_not(labels) + positive_idx = tf.logical_and(labels, indicator) + negative_idx = tf.logical_and(negative_idx, indicator) + + # Sample positive and negative samples separately + if batch_size is None: + max_num_pos = tf.reduce_sum( + input_tensor=tf.cast(positive_idx, dtype=tf.int32)) + else: + max_num_pos = int(self._positive_fraction * batch_size) + sampled_pos_idx = self.subsample_indicator(positive_idx, max_num_pos) + num_sampled_pos = tf.reduce_sum( + input_tensor=tf.cast(sampled_pos_idx, tf.int32)) + if batch_size is None: + negative_positive_ratio = ( + 1 - self._positive_fraction) / self._positive_fraction + max_num_neg = tf.cast( + negative_positive_ratio * + tf.cast(num_sampled_pos, dtype=tf.float32), + dtype=tf.int32) + else: + max_num_neg = batch_size - num_sampled_pos + sampled_neg_idx = self.subsample_indicator(negative_idx, max_num_neg) + + return tf.logical_or(sampled_pos_idx, sampled_neg_idx) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_coder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_coder.py new file mode 100644 index 0000000..1b89bb8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_coder.py @@ -0,0 +1,151 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Base box coder. + +Box coders convert between coordinate frames, namely image-centric +(with (0,0) on the top left of image) and anchor-centric (with (0,0) being +defined by a specific anchor). + +Users of a BoxCoder can call two methods: + encode: which encodes a box with respect to a given anchor + (or rather, a tensor of boxes wrt a corresponding tensor of anchors) and + decode: which inverts this encoding with a decode operation. +In both cases, the arguments are assumed to be in 1-1 correspondence already; +it is not the job of a BoxCoder to perform matching. +""" +from abc import ABCMeta +from abc import abstractmethod +from abc import abstractproperty + +import tensorflow.compat.v2 as tf + + +# Box coder types. +FASTER_RCNN = 'faster_rcnn' +KEYPOINT = 'keypoint' +MEAN_STDDEV = 'mean_stddev' +SQUARE = 'square' + + +class BoxCoder(object): + """Abstract base class for box coder.""" + __metaclass__ = ABCMeta + + @abstractproperty + def code_size(self): + """Return the size of each code. + + This number is a constant and should agree with the output of the `encode` + op (e.g. if rel_codes is the output of self.encode(...), then it should have + shape [N, code_size()]). This abstractproperty should be overridden by + implementations. + + Returns: + an integer constant + """ + pass + + def encode(self, boxes, anchors): + """Encode a box list relative to an anchor collection. + + Args: + boxes: BoxList holding N boxes to be encoded + anchors: BoxList of N anchors + + Returns: + a tensor representing N relative-encoded boxes + """ + with tf.name_scope('Encode'): + return self._encode(boxes, anchors) + + def decode(self, rel_codes, anchors): + """Decode boxes that are encoded relative to an anchor collection. + + Args: + rel_codes: a tensor representing N relative-encoded boxes + anchors: BoxList of anchors + + Returns: + boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., + with corners y_min, x_min, y_max, x_max) + """ + with tf.name_scope('Decode'): + return self._decode(rel_codes, anchors) + + @abstractmethod + def _encode(self, boxes, anchors): + """Method to be overriden by implementations. + + Args: + boxes: BoxList holding N boxes to be encoded + anchors: BoxList of N anchors + + Returns: + a tensor representing N relative-encoded boxes + """ + pass + + @abstractmethod + def _decode(self, rel_codes, anchors): + """Method to be overriden by implementations. + + Args: + rel_codes: a tensor representing N relative-encoded boxes + anchors: BoxList of anchors + + Returns: + boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., + with corners y_min, x_min, y_max, x_max) + """ + pass + + +def batch_decode(encoded_boxes, box_coder, anchors): + """Decode a batch of encoded boxes. + + This op takes a batch of encoded bounding boxes and transforms + them to a batch of bounding boxes specified by their corners in + the order of [y_min, x_min, y_max, x_max]. + + Args: + encoded_boxes: a float32 tensor of shape [batch_size, num_anchors, + code_size] representing the location of the objects. + box_coder: a BoxCoder object. + anchors: a BoxList of anchors used to encode `encoded_boxes`. + + Returns: + decoded_boxes: a float32 tensor of shape [batch_size, num_anchors, + coder_size] representing the corners of the objects in the order + of [y_min, x_min, y_max, x_max]. + + Raises: + ValueError: if batch sizes of the inputs are inconsistent, or if + the number of anchors inferred from encoded_boxes and anchors are + inconsistent. + """ + encoded_boxes.get_shape().assert_has_rank(3) + if encoded_boxes.get_shape()[1].value != anchors.num_boxes_static(): + raise ValueError('The number of anchors inferred from encoded_boxes' + ' and anchors are inconsistent: shape[1] of encoded_boxes' + ' %s should be equal to the number of anchors: %s.' % + (encoded_boxes.get_shape()[1].value, + anchors.num_boxes_static())) + + decoded_boxes = tf.stack([ + box_coder.decode(boxes, anchors).get() + for boxes in tf.unstack(encoded_boxes) + ]) + return decoded_boxes diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list.py new file mode 100644 index 0000000..7c4da99 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list.py @@ -0,0 +1,211 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Bounding Box List definition. + +BoxList represents a list of bounding boxes as tensorflow +tensors, where each bounding box is represented as a row of 4 numbers, +[y_min, x_min, y_max, x_max]. It is assumed that all bounding boxes +within a given list correspond to a single image. See also +box_list_ops.py for common box related operations (such as area, iou, etc). + +Optionally, users can add additional related fields (such as weights). +We assume the following things to be true about fields: +* they correspond to boxes in the box_list along the 0th dimension +* they have inferrable rank at graph construction time +* all dimensions except for possibly the 0th can be inferred + (i.e., not None) at graph construction time. + +Some other notes: + * Following tensorflow conventions, we use height, width ordering, + and correspondingly, y,x (or ymin, xmin, ymax, xmax) ordering + * Tensors are always provided as (flat) [N, 4] tensors. +""" + +import tensorflow.compat.v2 as tf + + +class BoxList(object): + """Box collection.""" + + def __init__(self, boxes): + """Constructs box collection. + + Args: + boxes: a tensor of shape [N, 4] representing box corners + + Raises: + ValueError: if invalid dimensions for bbox data or if bbox data is not in + float32 format. + """ + if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: + raise ValueError('Invalid dimensions for box data.') + if boxes.dtype != tf.float32: + raise ValueError('Invalid tensor type: should be tf.float32') + self.data = {'boxes': boxes} + + def num_boxes(self): + """Returns number of boxes held in collection. + + Returns: + a tensor representing the number of boxes held in the collection. + """ + return tf.shape(input=self.data['boxes'])[0] + + def num_boxes_static(self): + """Returns number of boxes held in collection. + + This number is inferred at graph construction time rather than run-time. + + Returns: + Number of boxes held in collection (integer) or None if this is not + inferrable at graph construction time. + """ + return self.data['boxes'].get_shape().dims[0].value + + def get_all_fields(self): + """Returns all fields.""" + return self.data.keys() + + def get_extra_fields(self): + """Returns all non-box fields (i.e., everything not named 'boxes').""" + return [k for k in self.data.keys() if k != 'boxes'] + + def add_field(self, field, field_data): + """Add field to box list. + + This method can be used to add related box data such as + weights/labels, etc. + + Args: + field: a string key to access the data via `get` + field_data: a tensor containing the data to store in the BoxList + """ + self.data[field] = field_data + + def has_field(self, field): + return field in self.data + + def get(self): + """Convenience function for accessing box coordinates. + + Returns: + a tensor with shape [N, 4] representing box coordinates. + """ + return self.get_field('boxes') + + def set(self, boxes): + """Convenience function for setting box coordinates. + + Args: + boxes: a tensor of shape [N, 4] representing box corners + + Raises: + ValueError: if invalid dimensions for bbox data + """ + if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: + raise ValueError('Invalid dimensions for box data.') + self.data['boxes'] = boxes + + def get_field(self, field): + """Accesses a box collection and associated fields. + + This function returns specified field with object; if no field is specified, + it returns the box coordinates. + + Args: + field: this optional string parameter can be used to specify + a related field to be accessed. + + Returns: + a tensor representing the box collection or an associated field. + + Raises: + ValueError: if invalid field + """ + if not self.has_field(field): + raise ValueError('field ' + str(field) + ' does not exist') + return self.data[field] + + def set_field(self, field, value): + """Sets the value of a field. + + Updates the field of a box_list with a given value. + + Args: + field: (string) name of the field to set value. + value: the value to assign to the field. + + Raises: + ValueError: if the box_list does not have specified field. + """ + if not self.has_field(field): + raise ValueError('field %s does not exist' % field) + self.data[field] = value + + def get_center_coordinates_and_sizes(self, scope=None): + """Computes the center coordinates, height and width of the boxes. + + Args: + scope: name scope of the function. + + Returns: + a list of 4 1-D tensors [ycenter, xcenter, height, width]. + """ + if not scope: + scope = 'get_center_coordinates_and_sizes' + with tf.name_scope(scope): + box_corners = self.get() + ymin, xmin, ymax, xmax = tf.unstack(tf.transpose(a=box_corners)) + width = xmax - xmin + height = ymax - ymin + ycenter = ymin + height / 2. + xcenter = xmin + width / 2. + return [ycenter, xcenter, height, width] + + def transpose_coordinates(self, scope=None): + """Transpose the coordinate representation in a boxlist. + + Args: + scope: name scope of the function. + """ + if not scope: + scope = 'transpose_coordinates' + with tf.name_scope(scope): + y_min, x_min, y_max, x_max = tf.split( + value=self.get(), num_or_size_splits=4, axis=1) + self.set(tf.concat([x_min, y_min, x_max, y_max], 1)) + + def as_tensor_dict(self, fields=None): + """Retrieves specified fields as a dictionary of tensors. + + Args: + fields: (optional) list of fields to return in the dictionary. + If None (default), all fields are returned. + + Returns: + tensor_dict: A dictionary of tensors specified by fields. + + Raises: + ValueError: if specified field is not contained in boxlist. + """ + tensor_dict = {} + if fields is None: + fields = self.get_all_fields() + for field in fields: + if not self.has_field(field): + raise ValueError('boxlist must contain all specified fields') + tensor_dict[field] = self.get_field(field) + return tensor_dict diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list_ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list_ops.py new file mode 100644 index 0000000..2299f2b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/box_list_ops.py @@ -0,0 +1,1079 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Bounding Box List operations. + +Example box operations that are supported: + * areas: compute bounding box areas + * iou: pairwise intersection-over-union scores + * sq_dist: pairwise distances between bounding boxes + +Whenever box_list_ops functions output a BoxList, the fields of the incoming +BoxList are retained unless documented otherwise. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from six.moves import range +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import box_list +from official.vision.detection.utils.object_detection import ops + + +class SortOrder(object): + """Enum class for sort order. + + Attributes: + ascend: ascend order. + descend: descend order. + """ + ascend = 1 + descend = 2 + + +def area(boxlist, scope=None): + """Computes area of boxes. + + Args: + boxlist: BoxList holding N boxes + scope: name scope. + + Returns: + a tensor with shape [N] representing box areas. + """ + with tf.name_scope(scope, 'Area'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + return tf.squeeze((y_max - y_min) * (x_max - x_min), [1]) + + +def height_width(boxlist, scope=None): + """Computes height and width of boxes in boxlist. + + Args: + boxlist: BoxList holding N boxes + scope: name scope. + + Returns: + Height: A tensor with shape [N] representing box heights. + Width: A tensor with shape [N] representing box widths. + """ + with tf.name_scope(scope, 'HeightWidth'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + return tf.squeeze(y_max - y_min, [1]), tf.squeeze(x_max - x_min, [1]) + + +def scale(boxlist, y_scale, x_scale, scope=None): + """scale box coordinates in x and y dimensions. + + Args: + boxlist: BoxList holding N boxes + y_scale: (float) scalar tensor + x_scale: (float) scalar tensor + scope: name scope. + + Returns: + boxlist: BoxList holding N boxes + """ + with tf.name_scope(scope, 'Scale'): + y_scale = tf.cast(y_scale, tf.float32) + x_scale = tf.cast(x_scale, tf.float32) + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + y_min = y_scale * y_min + y_max = y_scale * y_max + x_min = x_scale * x_min + x_max = x_scale * x_max + scaled_boxlist = box_list.BoxList( + tf.concat([y_min, x_min, y_max, x_max], 1)) + return _copy_extra_fields(scaled_boxlist, boxlist) + + +def clip_to_window(boxlist, window, filter_nonoverlapping=True, scope=None): + """Clip bounding boxes to a window. + + This op clips any input bounding boxes (represented by bounding box + corners) to a window, optionally filtering out boxes that do not + overlap at all with the window. + + Args: + boxlist: BoxList holding M_in boxes + window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] + window to which the op should clip boxes. + filter_nonoverlapping: whether to filter out boxes that do not overlap at + all with the window. + scope: name scope. + + Returns: + a BoxList holding M_out boxes where M_out <= M_in + """ + with tf.name_scope(scope, 'ClipToWindow'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) + y_min_clipped = tf.maximum(tf.minimum(y_min, win_y_max), win_y_min) + y_max_clipped = tf.maximum(tf.minimum(y_max, win_y_max), win_y_min) + x_min_clipped = tf.maximum(tf.minimum(x_min, win_x_max), win_x_min) + x_max_clipped = tf.maximum(tf.minimum(x_max, win_x_max), win_x_min) + clipped = box_list.BoxList( + tf.concat([y_min_clipped, x_min_clipped, y_max_clipped, x_max_clipped], + 1)) + clipped = _copy_extra_fields(clipped, boxlist) + if filter_nonoverlapping: + areas = area(clipped) + nonzero_area_indices = tf.cast( + tf.reshape(tf.where(tf.greater(areas, 0.0)), [-1]), tf.int32) + clipped = gather(clipped, nonzero_area_indices) + return clipped + + +def prune_outside_window(boxlist, window, scope=None): + """Prunes bounding boxes that fall outside a given window. + + This function prunes bounding boxes that even partially fall outside the given + window. See also clip_to_window which only prunes bounding boxes that fall + completely outside the window, and clips any bounding boxes that partially + overflow. + + Args: + boxlist: a BoxList holding M_in boxes. + window: a float tensor of shape [4] representing [ymin, xmin, ymax, xmax] + of the window + scope: name scope. + + Returns: + pruned_corners: a tensor with shape [M_out, 4] where M_out <= M_in + valid_indices: a tensor with shape [M_out] indexing the valid bounding boxes + in the input tensor. + """ + with tf.name_scope(scope, 'PruneOutsideWindow'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) + coordinate_violations = tf.concat([ + tf.less(y_min, win_y_min), tf.less(x_min, win_x_min), + tf.greater(y_max, win_y_max), tf.greater(x_max, win_x_max) + ], 1) + valid_indices = tf.reshape( + tf.where(tf.logical_not(tf.reduce_any(coordinate_violations, 1))), [-1]) + return gather(boxlist, valid_indices), valid_indices + + +def prune_completely_outside_window(boxlist, window, scope=None): + """Prunes bounding boxes that fall completely outside of the given window. + + The function clip_to_window prunes bounding boxes that fall + completely outside the window, but also clips any bounding boxes that + partially overflow. This function does not clip partially overflowing boxes. + + Args: + boxlist: a BoxList holding M_in boxes. + window: a float tensor of shape [4] representing [ymin, xmin, ymax, xmax] + of the window + scope: name scope. + + Returns: + pruned_boxlist: a new BoxList with all bounding boxes partially or fully in + the window. + valid_indices: a tensor with shape [M_out] indexing the valid bounding boxes + in the input tensor. + """ + with tf.name_scope(scope, 'PruneCompleteleyOutsideWindow'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) + coordinate_violations = tf.concat([ + tf.greater_equal(y_min, win_y_max), tf.greater_equal(x_min, win_x_max), + tf.less_equal(y_max, win_y_min), tf.less_equal(x_max, win_x_min) + ], 1) + valid_indices = tf.reshape( + tf.where(tf.logical_not(tf.reduce_any(coordinate_violations, 1))), [-1]) + return gather(boxlist, valid_indices), valid_indices + + +def intersection(boxlist1, boxlist2, scope=None): + """Compute pairwise intersection areas between boxes. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise intersections + """ + with tf.name_scope(scope, 'Intersection'): + y_min1, x_min1, y_max1, x_max1 = tf.split( + value=boxlist1.get(), num_or_size_splits=4, axis=1) + y_min2, x_min2, y_max2, x_max2 = tf.split( + value=boxlist2.get(), num_or_size_splits=4, axis=1) + all_pairs_min_ymax = tf.minimum(y_max1, tf.transpose(y_max2)) + all_pairs_max_ymin = tf.maximum(y_min1, tf.transpose(y_min2)) + intersect_heights = tf.maximum(0.0, all_pairs_min_ymax - all_pairs_max_ymin) + all_pairs_min_xmax = tf.minimum(x_max1, tf.transpose(x_max2)) + all_pairs_max_xmin = tf.maximum(x_min1, tf.transpose(x_min2)) + intersect_widths = tf.maximum(0.0, all_pairs_min_xmax - all_pairs_max_xmin) + return intersect_heights * intersect_widths + + +def matched_intersection(boxlist1, boxlist2, scope=None): + """Compute intersection areas between corresponding boxes in two boxlists. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding N boxes + scope: name scope. + + Returns: + a tensor with shape [N] representing pairwise intersections + """ + with tf.name_scope(scope, 'MatchedIntersection'): + y_min1, x_min1, y_max1, x_max1 = tf.split( + value=boxlist1.get(), num_or_size_splits=4, axis=1) + y_min2, x_min2, y_max2, x_max2 = tf.split( + value=boxlist2.get(), num_or_size_splits=4, axis=1) + min_ymax = tf.minimum(y_max1, y_max2) + max_ymin = tf.maximum(y_min1, y_min2) + intersect_heights = tf.maximum(0.0, min_ymax - max_ymin) + min_xmax = tf.minimum(x_max1, x_max2) + max_xmin = tf.maximum(x_min1, x_min2) + intersect_widths = tf.maximum(0.0, min_xmax - max_xmin) + return tf.reshape(intersect_heights * intersect_widths, [-1]) + + +def iou(boxlist1, boxlist2, scope=None): + """Computes pairwise intersection-over-union between box collections. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise iou scores. + """ + with tf.name_scope(scope, 'IOU'): + intersections = intersection(boxlist1, boxlist2) + areas1 = area(boxlist1) + areas2 = area(boxlist2) + unions = ( + tf.expand_dims(areas1, 1) + tf.expand_dims(areas2, 0) - intersections) + return tf.where( + tf.equal(intersections, 0.0), + tf.zeros_like(intersections), tf.truediv(intersections, unions)) + + +def matched_iou(boxlist1, boxlist2, scope=None): + """Compute intersection-over-union between corresponding boxes in boxlists. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding N boxes + scope: name scope. + + Returns: + a tensor with shape [N] representing pairwise iou scores. + """ + with tf.name_scope(scope, 'MatchedIOU'): + intersections = matched_intersection(boxlist1, boxlist2) + areas1 = area(boxlist1) + areas2 = area(boxlist2) + unions = areas1 + areas2 - intersections + return tf.where( + tf.equal(intersections, 0.0), + tf.zeros_like(intersections), tf.truediv(intersections, unions)) + + +def ioa(boxlist1, boxlist2, scope=None): + """Computes pairwise intersection-over-area between box collections. + + intersection-over-area (IOA) between two boxes box1 and box2 is defined as + their intersection area over box2's area. Note that ioa is not symmetric, + that is, ioa(box1, box2) != ioa(box2, box1). + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise ioa scores. + """ + with tf.name_scope(scope, 'IOA'): + intersections = intersection(boxlist1, boxlist2) + areas = tf.expand_dims(area(boxlist2), 0) + return tf.truediv(intersections, areas) + + +def prune_non_overlapping_boxes( + boxlist1, boxlist2, min_overlap=0.0, scope=None): + """Prunes the boxes in boxlist1 that overlap less than thresh with boxlist2. + + For each box in boxlist1, we want its IOA to be more than minoverlap with + at least one of the boxes in boxlist2. If it does not, we remove it. + + Args: + boxlist1: BoxList holding N boxes. + boxlist2: BoxList holding M boxes. + min_overlap: Minimum required overlap between boxes, to count them as + overlapping. + scope: name scope. + + Returns: + new_boxlist1: A pruned boxlist with size [N', 4]. + keep_inds: A tensor with shape [N'] indexing kept bounding boxes in the + first input BoxList `boxlist1`. + """ + with tf.name_scope(scope, 'PruneNonOverlappingBoxes'): + ioa_ = ioa(boxlist2, boxlist1) # [M, N] tensor + ioa_ = tf.reduce_max(ioa_, reduction_indices=[0]) # [N] tensor + keep_bool = tf.greater_equal(ioa_, tf.constant(min_overlap)) + keep_inds = tf.squeeze(tf.where(keep_bool), axis=[1]) + new_boxlist1 = gather(boxlist1, keep_inds) + return new_boxlist1, keep_inds + + +def prune_small_boxes(boxlist, min_side, scope=None): + """Prunes small boxes in the boxlist which have a side smaller than min_side. + + Args: + boxlist: BoxList holding N boxes. + min_side: Minimum width AND height of box to survive pruning. + scope: name scope. + + Returns: + A pruned boxlist. + """ + with tf.name_scope(scope, 'PruneSmallBoxes'): + height, width = height_width(boxlist) + is_valid = tf.logical_and(tf.greater_equal(width, min_side), + tf.greater_equal(height, min_side)) + return gather(boxlist, tf.reshape(tf.where(is_valid), [-1])) + + +def change_coordinate_frame(boxlist, window, scope=None): + """Change coordinate frame of the boxlist to be relative to window's frame. + + Given a window of the form [ymin, xmin, ymax, xmax], + changes bounding box coordinates from boxlist to be relative to this window + (e.g., the min corner maps to (0,0) and the max corner maps to (1,1)). + + An example use case is data augmentation: where we are given groundtruth + boxes (boxlist) and would like to randomly crop the image to some + window (window). In this case we need to change the coordinate frame of + each groundtruth box to be relative to this new window. + + Args: + boxlist: A BoxList object holding N boxes. + window: A rank 1 tensor [4]. + scope: name scope. + + Returns: + Returns a BoxList object with N boxes. + """ + with tf.name_scope(scope, 'ChangeCoordinateFrame'): + win_height = window[2] - window[0] + win_width = window[3] - window[1] + boxlist_new = scale(box_list.BoxList( + boxlist.get() - [window[0], window[1], window[0], window[1]]), + 1.0 / win_height, 1.0 / win_width) + boxlist_new = _copy_extra_fields(boxlist_new, boxlist) + return boxlist_new + + +def sq_dist(boxlist1, boxlist2, scope=None): + """Computes the pairwise squared distances between box corners. + + This op treats each box as if it were a point in a 4d Euclidean space and + computes pairwise squared distances. + + Mathematically, we are given two matrices of box coordinates X and Y, + where X(i,:) is the i'th row of X, containing the 4 numbers defining the + corners of the i'th box in boxlist1. Similarly Y(j,:) corresponds to + boxlist2. We compute + Z(i,j) = ||X(i,:) - Y(j,:)||^2 + = ||X(i,:)||^2 + ||Y(j,:)||^2 - 2 X(i,:)' * Y(j,:), + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise distances + """ + with tf.name_scope(scope, 'SqDist'): + sqnorm1 = tf.reduce_sum(tf.square(boxlist1.get()), 1, keep_dims=True) + sqnorm2 = tf.reduce_sum(tf.square(boxlist2.get()), 1, keep_dims=True) + innerprod = tf.matmul(boxlist1.get(), boxlist2.get(), + transpose_a=False, transpose_b=True) + return sqnorm1 + tf.transpose(sqnorm2) - 2.0 * innerprod + + +def boolean_mask(boxlist, indicator, fields=None, scope=None, + use_static_shapes=False, indicator_sum=None): + """Select boxes from BoxList according to indicator and return new BoxList. + + `boolean_mask` returns the subset of boxes that are marked as "True" by the + indicator tensor. By default, `boolean_mask` returns boxes corresponding to + the input index list, as well as all additional fields stored in the boxlist + (indexing into the first dimension). However one can optionally only draw + from a subset of fields. + + Args: + boxlist: BoxList holding N boxes + indicator: a rank-1 boolean tensor + fields: (optional) list of fields to also gather from. If None (default), + all fields are gathered from. Pass an empty fields list to only gather + the box coordinates. + scope: name scope. + use_static_shapes: Whether to use an implementation with static shape + gurantees. + indicator_sum: An integer containing the sum of `indicator` vector. Only + required if `use_static_shape` is True. + + Returns: + subboxlist: a BoxList corresponding to the subset of the input BoxList + specified by indicator + Raises: + ValueError: if `indicator` is not a rank-1 boolean tensor. + """ + with tf.name_scope(scope, 'BooleanMask'): + if indicator.shape.ndims != 1: + raise ValueError('indicator should have rank 1') + if indicator.dtype != tf.bool: + raise ValueError('indicator should be a boolean tensor') + if use_static_shapes: + if not (indicator_sum and isinstance(indicator_sum, int)): + raise ValueError('`indicator_sum` must be a of type int') + selected_positions = tf.cast(indicator, dtype=tf.float32) + indexed_positions = tf.cast( + tf.multiply( + tf.cumsum(selected_positions), selected_positions), + dtype=tf.int32) + one_hot_selector = tf.one_hot( + indexed_positions - 1, indicator_sum, dtype=tf.float32) + sampled_indices = tf.cast( + tf.tensordot( + tf.cast(tf.range(tf.shape(indicator)[0]), dtype=tf.float32), + one_hot_selector, + axes=[0, 0]), + dtype=tf.int32) + return gather(boxlist, sampled_indices, use_static_shapes=True) + else: + subboxlist = box_list.BoxList(tf.boolean_mask(boxlist.get(), indicator)) + if fields is None: + fields = boxlist.get_extra_fields() + for field in fields: + if not boxlist.has_field(field): + raise ValueError('boxlist must contain all specified fields') + subfieldlist = tf.boolean_mask(boxlist.get_field(field), indicator) + subboxlist.add_field(field, subfieldlist) + return subboxlist + + +def gather(boxlist, indices, fields=None, scope=None, use_static_shapes=False): + """Gather boxes from BoxList according to indices and return new BoxList. + + By default, `gather` returns boxes corresponding to the input index list, as + well as all additional fields stored in the boxlist (indexing into the + first dimension). However one can optionally only gather from a + subset of fields. + + Args: + boxlist: BoxList holding N boxes + indices: a rank-1 tensor of type int32 / int64 + fields: (optional) list of fields to also gather from. If None (default), + all fields are gathered from. Pass an empty fields list to only gather + the box coordinates. + scope: name scope. + use_static_shapes: Whether to use an implementation with static shape + gurantees. + + Returns: + subboxlist: a BoxList corresponding to the subset of the input BoxList + specified by indices + Raises: + ValueError: if specified field is not contained in boxlist or if the + indices are not of type int32 + """ + with tf.name_scope(scope, 'Gather'): + if len(indices.shape.as_list()) != 1: + raise ValueError('indices should have rank 1') + if indices.dtype != tf.int32 and indices.dtype != tf.int64: + raise ValueError('indices should be an int32 / int64 tensor') + gather_op = tf.gather + if use_static_shapes: + gather_op = ops.matmul_gather_on_zeroth_axis + subboxlist = box_list.BoxList(gather_op(boxlist.get(), indices)) + if fields is None: + fields = boxlist.get_extra_fields() + fields += ['boxes'] + for field in fields: + if not boxlist.has_field(field): + raise ValueError('boxlist must contain all specified fields') + subfieldlist = gather_op(boxlist.get_field(field), indices) + subboxlist.add_field(field, subfieldlist) + return subboxlist + + +def concatenate(boxlists, fields=None, scope=None): + """Concatenate list of BoxLists. + + This op concatenates a list of input BoxLists into a larger BoxList. It also + handles concatenation of BoxList fields as long as the field tensor shapes + are equal except for the first dimension. + + Args: + boxlists: list of BoxList objects + fields: optional list of fields to also concatenate. By default, all + fields from the first BoxList in the list are included in the + concatenation. + scope: name scope. + + Returns: + a BoxList with number of boxes equal to + sum([boxlist.num_boxes() for boxlist in BoxList]) + Raises: + ValueError: if boxlists is invalid (i.e., is not a list, is empty, or + contains non BoxList objects), or if requested fields are not contained in + all boxlists + """ + with tf.name_scope(scope, 'Concatenate'): + if not isinstance(boxlists, list): + raise ValueError('boxlists should be a list') + if not boxlists: + raise ValueError('boxlists should have nonzero length') + for boxlist in boxlists: + if not isinstance(boxlist, box_list.BoxList): + raise ValueError('all elements of boxlists should be BoxList objects') + concatenated = box_list.BoxList( + tf.concat([boxlist.get() for boxlist in boxlists], 0)) + if fields is None: + fields = boxlists[0].get_extra_fields() + for field in fields: + first_field_shape = boxlists[0].get_field(field).get_shape().as_list() + first_field_shape[0] = -1 + if None in first_field_shape: + raise ValueError('field %s must have fully defined shape except for the' + ' 0th dimension.' % field) + for boxlist in boxlists: + if not boxlist.has_field(field): + raise ValueError('boxlist must contain all requested fields') + field_shape = boxlist.get_field(field).get_shape().as_list() + field_shape[0] = -1 + if field_shape != first_field_shape: + raise ValueError('field %s must have same shape for all boxlists ' + 'except for the 0th dimension.' % field) + concatenated_field = tf.concat( + [boxlist.get_field(field) for boxlist in boxlists], 0) + concatenated.add_field(field, concatenated_field) + return concatenated + + +def sort_by_field(boxlist, field, order=SortOrder.descend, scope=None): + """Sort boxes and associated fields according to a scalar field. + + A common use case is reordering the boxes according to descending scores. + + Args: + boxlist: BoxList holding N boxes. + field: A BoxList field for sorting and reordering the BoxList. + order: (Optional) descend or ascend. Default is descend. + scope: name scope. + + Returns: + sorted_boxlist: A sorted BoxList with the field in the specified order. + + Raises: + ValueError: if specified field does not exist + ValueError: if the order is not either descend or ascend + """ + with tf.name_scope(scope, 'SortByField'): + if order != SortOrder.descend and order != SortOrder.ascend: + raise ValueError('Invalid sort order') + + field_to_sort = boxlist.get_field(field) + if len(field_to_sort.shape.as_list()) != 1: + raise ValueError('Field should have rank 1') + + num_boxes = boxlist.num_boxes() + num_entries = tf.size(field_to_sort) + length_assert = tf.Assert( + tf.equal(num_boxes, num_entries), + ['Incorrect field size: actual vs expected.', num_entries, num_boxes]) + + with tf.control_dependencies([length_assert]): + _, sorted_indices = tf.nn.top_k(field_to_sort, num_boxes, sorted=True) + + if order == SortOrder.ascend: + sorted_indices = tf.reverse_v2(sorted_indices, [0]) + + return gather(boxlist, sorted_indices) + + +def visualize_boxes_in_image(image, boxlist, normalized=False, scope=None): + """Overlay bounding box list on image. + + Currently this visualization plots a 1 pixel thick red bounding box on top + of the image. Note that tf.image.draw_bounding_boxes essentially is + 1 indexed. + + Args: + image: an image tensor with shape [height, width, 3] + boxlist: a BoxList + normalized: (boolean) specify whether corners are to be interpreted + as absolute coordinates in image space or normalized with respect to the + image size. + scope: name scope. + + Returns: + image_and_boxes: an image tensor with shape [height, width, 3] + """ + with tf.name_scope(scope, 'VisualizeBoxesInImage'): + if not normalized: + height, width, _ = tf.unstack(tf.shape(image)) + boxlist = scale(boxlist, + 1.0 / tf.cast(height, tf.float32), + 1.0 / tf.cast(width, tf.float32)) + corners = tf.expand_dims(boxlist.get(), 0) + image = tf.expand_dims(image, 0) + return tf.squeeze(tf.image.draw_bounding_boxes(image, corners), [0]) + + +def filter_field_value_equals(boxlist, field, value, scope=None): + """Filter to keep only boxes with field entries equal to the given value. + + Args: + boxlist: BoxList holding N boxes. + field: field name for filtering. + value: scalar value. + scope: name scope. + + Returns: + a BoxList holding M boxes where M <= N + + Raises: + ValueError: if boxlist not a BoxList object or if it does not have + the specified field. + """ + with tf.name_scope(scope, 'FilterFieldValueEquals'): + if not isinstance(boxlist, box_list.BoxList): + raise ValueError('boxlist must be a BoxList') + if not boxlist.has_field(field): + raise ValueError('boxlist must contain the specified field') + filter_field = boxlist.get_field(field) + gather_index = tf.reshape(tf.where(tf.equal(filter_field, value)), [-1]) + return gather(boxlist, gather_index) + + +def filter_greater_than(boxlist, thresh, scope=None): + """Filter to keep only boxes with score exceeding a given threshold. + + This op keeps the collection of boxes whose corresponding scores are + greater than the input threshold. + + TODO(jonathanhuang): Change function name to filter_scores_greater_than + + Args: + boxlist: BoxList holding N boxes. Must contain a 'scores' field + representing detection scores. + thresh: scalar threshold + scope: name scope. + + Returns: + a BoxList holding M boxes where M <= N + + Raises: + ValueError: if boxlist not a BoxList object or if it does not + have a scores field + """ + with tf.name_scope(scope, 'FilterGreaterThan'): + if not isinstance(boxlist, box_list.BoxList): + raise ValueError('boxlist must be a BoxList') + if not boxlist.has_field('scores'): + raise ValueError('input boxlist must have \'scores\' field') + scores = boxlist.get_field('scores') + if len(scores.shape.as_list()) > 2: + raise ValueError('Scores should have rank 1 or 2') + if len(scores.shape.as_list()) == 2 and scores.shape.as_list()[1] != 1: + raise ValueError('Scores should have rank 1 or have shape ' + 'consistent with [None, 1]') + high_score_indices = tf.cast(tf.reshape( + tf.where(tf.greater(scores, thresh)), + [-1]), tf.int32) + return gather(boxlist, high_score_indices) + + +def non_max_suppression(boxlist, thresh, max_output_size, scope=None): + """Non maximum suppression. + + This op greedily selects a subset of detection bounding boxes, pruning + away boxes that have high IOU (intersection over union) overlap (> thresh) + with already selected boxes. Note that this only works for a single class --- + to apply NMS to multi-class predictions, use MultiClassNonMaxSuppression. + + Args: + boxlist: BoxList holding N boxes. Must contain a 'scores' field + representing detection scores. + thresh: scalar threshold + max_output_size: maximum number of retained boxes + scope: name scope. + + Returns: + a BoxList holding M boxes where M <= max_output_size + Raises: + ValueError: if thresh is not in [0, 1] + """ + with tf.name_scope(scope, 'NonMaxSuppression'): + if not 0 <= thresh <= 1.0: + raise ValueError('thresh must be between 0 and 1') + if not isinstance(boxlist, box_list.BoxList): + raise ValueError('boxlist must be a BoxList') + if not boxlist.has_field('scores'): + raise ValueError('input boxlist must have \'scores\' field') + selected_indices = tf.image.non_max_suppression( + boxlist.get(), boxlist.get_field('scores'), + max_output_size, iou_threshold=thresh) + return gather(boxlist, selected_indices) + + +def _copy_extra_fields(boxlist_to_copy_to, boxlist_to_copy_from): + """Copies the extra fields of boxlist_to_copy_from to boxlist_to_copy_to. + + Args: + boxlist_to_copy_to: BoxList to which extra fields are copied. + boxlist_to_copy_from: BoxList from which fields are copied. + + Returns: + boxlist_to_copy_to with extra fields. + """ + for field in boxlist_to_copy_from.get_extra_fields(): + boxlist_to_copy_to.add_field(field, boxlist_to_copy_from.get_field(field)) + return boxlist_to_copy_to + + +def to_normalized_coordinates(boxlist, height, width, + check_range=True, scope=None): + """Converts absolute box coordinates to normalized coordinates in [0, 1]. + + Usually one uses the dynamic shape of the image or conv-layer tensor: + boxlist = box_list_ops.to_normalized_coordinates(boxlist, + tf.shape(images)[1], + tf.shape(images)[2]), + + This function raises an assertion failed error at graph execution time when + the maximum coordinate is smaller than 1.01 (which means that coordinates are + already normalized). The value 1.01 is to deal with small rounding errors. + + Args: + boxlist: BoxList with coordinates in terms of pixel-locations. + height: Maximum value for height of absolute box coordinates. + width: Maximum value for width of absolute box coordinates. + check_range: If True, checks if the coordinates are normalized or not. + scope: name scope. + + Returns: + boxlist with normalized coordinates in [0, 1]. + """ + with tf.name_scope(scope, 'ToNormalizedCoordinates'): + height = tf.cast(height, tf.float32) + width = tf.cast(width, tf.float32) + + if check_range: + max_val = tf.reduce_max(boxlist.get()) + max_assert = tf.Assert(tf.greater(max_val, 1.01), + ['max value is lower than 1.01: ', max_val]) + with tf.control_dependencies([max_assert]): + width = tf.identity(width) + + return scale(boxlist, 1 / height, 1 / width) + + +def to_absolute_coordinates(boxlist, + height, + width, + check_range=True, + maximum_normalized_coordinate=1.1, + scope=None): + """Converts normalized box coordinates to absolute pixel coordinates. + + This function raises an assertion failed error when the maximum box coordinate + value is larger than maximum_normalized_coordinate (in which case coordinates + are already absolute). + + Args: + boxlist: BoxList with coordinates in range [0, 1]. + height: Maximum value for height of absolute box coordinates. + width: Maximum value for width of absolute box coordinates. + check_range: If True, checks if the coordinates are normalized or not. + maximum_normalized_coordinate: Maximum coordinate value to be considered + as normalized, default to 1.1. + scope: name scope. + + Returns: + boxlist with absolute coordinates in terms of the image size. + + """ + with tf.name_scope(scope, 'ToAbsoluteCoordinates'): + height = tf.cast(height, tf.float32) + width = tf.cast(width, tf.float32) + + # Ensure range of input boxes is correct. + if check_range: + box_maximum = tf.reduce_max(boxlist.get()) + max_assert = tf.Assert( + tf.greater_equal(maximum_normalized_coordinate, box_maximum), + ['maximum box coordinate value is larger ' + 'than %f: ' % maximum_normalized_coordinate, box_maximum]) + with tf.control_dependencies([max_assert]): + width = tf.identity(width) + + return scale(boxlist, height, width) + + +def refine_boxes_multi_class(pool_boxes, + num_classes, + nms_iou_thresh, + nms_max_detections, + voting_iou_thresh=0.5): + """Refines a pool of boxes using non max suppression and box voting. + + Box refinement is done independently for each class. + + Args: + pool_boxes: (BoxList) A collection of boxes to be refined. pool_boxes must + have a rank 1 'scores' field and a rank 1 'classes' field. + num_classes: (int scalar) Number of classes. + nms_iou_thresh: (float scalar) iou threshold for non max suppression (NMS). + nms_max_detections: (int scalar) maximum output size for NMS. + voting_iou_thresh: (float scalar) iou threshold for box voting. + + Returns: + BoxList of refined boxes. + + Raises: + ValueError: if + a) nms_iou_thresh or voting_iou_thresh is not in [0, 1]. + b) pool_boxes is not a BoxList. + c) pool_boxes does not have a scores and classes field. + """ + if not 0.0 <= nms_iou_thresh <= 1.0: + raise ValueError('nms_iou_thresh must be between 0 and 1') + if not 0.0 <= voting_iou_thresh <= 1.0: + raise ValueError('voting_iou_thresh must be between 0 and 1') + if not isinstance(pool_boxes, box_list.BoxList): + raise ValueError('pool_boxes must be a BoxList') + if not pool_boxes.has_field('scores'): + raise ValueError('pool_boxes must have a \'scores\' field') + if not pool_boxes.has_field('classes'): + raise ValueError('pool_boxes must have a \'classes\' field') + + refined_boxes = [] + for i in range(num_classes): + boxes_class = filter_field_value_equals(pool_boxes, 'classes', i) + refined_boxes_class = refine_boxes(boxes_class, nms_iou_thresh, + nms_max_detections, voting_iou_thresh) + refined_boxes.append(refined_boxes_class) + return sort_by_field(concatenate(refined_boxes), 'scores') + + +def refine_boxes(pool_boxes, + nms_iou_thresh, + nms_max_detections, + voting_iou_thresh=0.5): + """Refines a pool of boxes using non max suppression and box voting. + + Args: + pool_boxes: (BoxList) A collection of boxes to be refined. pool_boxes must + have a rank 1 'scores' field. + nms_iou_thresh: (float scalar) iou threshold for non max suppression (NMS). + nms_max_detections: (int scalar) maximum output size for NMS. + voting_iou_thresh: (float scalar) iou threshold for box voting. + + Returns: + BoxList of refined boxes. + + Raises: + ValueError: if + a) nms_iou_thresh or voting_iou_thresh is not in [0, 1]. + b) pool_boxes is not a BoxList. + c) pool_boxes does not have a scores field. + """ + if not 0.0 <= nms_iou_thresh <= 1.0: + raise ValueError('nms_iou_thresh must be between 0 and 1') + if not 0.0 <= voting_iou_thresh <= 1.0: + raise ValueError('voting_iou_thresh must be between 0 and 1') + if not isinstance(pool_boxes, box_list.BoxList): + raise ValueError('pool_boxes must be a BoxList') + if not pool_boxes.has_field('scores'): + raise ValueError('pool_boxes must have a \'scores\' field') + + nms_boxes = non_max_suppression( + pool_boxes, nms_iou_thresh, nms_max_detections) + return box_voting(nms_boxes, pool_boxes, voting_iou_thresh) + + +def box_voting(selected_boxes, pool_boxes, iou_thresh=0.5): + """Performs box voting as described in S. Gidaris and N. Komodakis, ICCV 2015. + + Performs box voting as described in 'Object detection via a multi-region & + semantic segmentation-aware CNN model', Gidaris and Komodakis, ICCV 2015. For + each box 'B' in selected_boxes, we find the set 'S' of boxes in pool_boxes + with iou overlap >= iou_thresh. The location of B is set to the weighted + average location of boxes in S (scores are used for weighting). And the score + of B is set to the average score of boxes in S. + + Args: + selected_boxes: BoxList containing a subset of boxes in pool_boxes. These + boxes are usually selected from pool_boxes using non max suppression. + pool_boxes: BoxList containing a set of (possibly redundant) boxes. + iou_thresh: (float scalar) iou threshold for matching boxes in + selected_boxes and pool_boxes. + + Returns: + BoxList containing averaged locations and scores for each box in + selected_boxes. + + Raises: + ValueError: if + a) selected_boxes or pool_boxes is not a BoxList. + b) if iou_thresh is not in [0, 1]. + c) pool_boxes does not have a scores field. + """ + if not 0.0 <= iou_thresh <= 1.0: + raise ValueError('iou_thresh must be between 0 and 1') + if not isinstance(selected_boxes, box_list.BoxList): + raise ValueError('selected_boxes must be a BoxList') + if not isinstance(pool_boxes, box_list.BoxList): + raise ValueError('pool_boxes must be a BoxList') + if not pool_boxes.has_field('scores'): + raise ValueError('pool_boxes must have a \'scores\' field') + + iou_ = iou(selected_boxes, pool_boxes) + match_indicator = tf.cast(tf.greater(iou_, iou_thresh), dtype=tf.float32) + num_matches = tf.reduce_sum(match_indicator, 1) + # TODO(kbanoop): Handle the case where some boxes in selected_boxes do not + # match to any boxes in pool_boxes. For such boxes without any matches, we + # should return the original boxes without voting. + match_assert = tf.Assert( + tf.reduce_all(tf.greater(num_matches, 0)), + ['Each box in selected_boxes must match with at least one box ' + 'in pool_boxes.']) + + scores = tf.expand_dims(pool_boxes.get_field('scores'), 1) + scores_assert = tf.Assert( + tf.reduce_all(tf.greater_equal(scores, 0)), + ['Scores must be non negative.']) + + with tf.control_dependencies([scores_assert, match_assert]): + sum_scores = tf.matmul(match_indicator, scores) + averaged_scores = tf.reshape(sum_scores, [-1]) / num_matches + + box_locations = tf.matmul(match_indicator, + pool_boxes.get() * scores) / sum_scores + averaged_boxes = box_list.BoxList(box_locations) + _copy_extra_fields(averaged_boxes, selected_boxes) + averaged_boxes.add_field('scores', averaged_scores) + return averaged_boxes + + +def get_minimal_coverage_box(boxlist, + default_box=None, + scope=None): + """Creates a single bounding box which covers all boxes in the boxlist. + + Args: + boxlist: A Boxlist. + default_box: A [1, 4] float32 tensor. If no boxes are present in `boxlist`, + this default box will be returned. If None, will use a default box of + [[0., 0., 1., 1.]]. + scope: Name scope. + + Returns: + A [1, 4] float32 tensor with a bounding box that tightly covers all the + boxes in the box list. If the boxlist does not contain any boxes, the + default box is returned. + """ + with tf.name_scope(scope, 'CreateCoverageBox'): + num_boxes = boxlist.num_boxes() + + def coverage_box(bboxes): + y_min, x_min, y_max, x_max = tf.split( + value=bboxes, num_or_size_splits=4, axis=1) + y_min_coverage = tf.reduce_min(y_min, axis=0) + x_min_coverage = tf.reduce_min(x_min, axis=0) + y_max_coverage = tf.reduce_max(y_max, axis=0) + x_max_coverage = tf.reduce_max(x_max, axis=0) + return tf.stack( + [y_min_coverage, x_min_coverage, y_max_coverage, x_max_coverage], + axis=1) + + default_box = default_box or tf.constant([[0., 0., 1., 1.]]) + return tf.cond( + tf.greater_equal(num_boxes, 1), + true_fn=lambda: coverage_box(boxlist.get()), + false_fn=lambda: default_box) + + +def sample_boxes_by_jittering(boxlist, + num_boxes_to_sample, + stddev=0.1, + scope=None): + """Samples num_boxes_to_sample boxes by jittering around boxlist boxes. + + It is possible that this function might generate boxes with size 0. The larger + the stddev, this is more probable. For a small stddev of 0.1 this probability + is very small. + + Args: + boxlist: A boxlist containing N boxes in normalized coordinates. + num_boxes_to_sample: A positive integer containing the number of boxes to + sample. + stddev: Standard deviation. This is used to draw random offsets for the + box corners from a normal distribution. The offset is multiplied by the + box size so will be larger in terms of pixels for larger boxes. + scope: Name scope. + + Returns: + sampled_boxlist: A boxlist containing num_boxes_to_sample boxes in + normalized coordinates. + """ + with tf.name_scope(scope, 'SampleBoxesByJittering'): + num_boxes = boxlist.num_boxes() + box_indices = tf.random_uniform( + [num_boxes_to_sample], + minval=0, + maxval=num_boxes, + dtype=tf.int32) + sampled_boxes = tf.gather(boxlist.get(), box_indices) + sampled_boxes_height = sampled_boxes[:, 2] - sampled_boxes[:, 0] + sampled_boxes_width = sampled_boxes[:, 3] - sampled_boxes[:, 1] + rand_miny_gaussian = tf.random_normal([num_boxes_to_sample], stddev=stddev) + rand_minx_gaussian = tf.random_normal([num_boxes_to_sample], stddev=stddev) + rand_maxy_gaussian = tf.random_normal([num_boxes_to_sample], stddev=stddev) + rand_maxx_gaussian = tf.random_normal([num_boxes_to_sample], stddev=stddev) + miny = rand_miny_gaussian * sampled_boxes_height + sampled_boxes[:, 0] + minx = rand_minx_gaussian * sampled_boxes_width + sampled_boxes[:, 1] + maxy = rand_maxy_gaussian * sampled_boxes_height + sampled_boxes[:, 2] + maxx = rand_maxx_gaussian * sampled_boxes_width + sampled_boxes[:, 3] + maxy = tf.maximum(miny, maxy) + maxx = tf.maximum(minx, maxx) + sampled_boxes = tf.stack([miny, minx, maxy, maxx], axis=1) + sampled_boxes = tf.maximum(tf.minimum(sampled_boxes, 1.0), 0.0) + return box_list.BoxList(sampled_boxes) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/faster_rcnn_box_coder.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/faster_rcnn_box_coder.py new file mode 100644 index 0000000..2472f57 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/faster_rcnn_box_coder.py @@ -0,0 +1,118 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Faster RCNN box coder. + +Faster RCNN box coder follows the coding schema described below: + ty = (y - ya) / ha + tx = (x - xa) / wa + th = log(h / ha) + tw = log(w / wa) + where x, y, w, h denote the box's center coordinates, width and height + respectively. Similarly, xa, ya, wa, ha denote the anchor's center + coordinates, width and height. tx, ty, tw and th denote the anchor-encoded + center, width and height respectively. + + See http://arxiv.org/abs/1506.01497 for details. +""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import box_coder +from official.vision.detection.utils.object_detection import box_list + +EPSILON = 1e-8 + + +class FasterRcnnBoxCoder(box_coder.BoxCoder): + """Faster RCNN box coder.""" + + def __init__(self, scale_factors=None): + """Constructor for FasterRcnnBoxCoder. + + Args: + scale_factors: List of 4 positive scalars to scale ty, tx, th and tw. + If set to None, does not perform scaling. For Faster RCNN, + the open-source implementation recommends using [10.0, 10.0, 5.0, 5.0]. + """ + if scale_factors: + assert len(scale_factors) == 4 + for scalar in scale_factors: + assert scalar > 0 + self._scale_factors = scale_factors + + @property + def code_size(self): + return 4 + + def _encode(self, boxes, anchors): + """Encode a box collection with respect to anchor collection. + + Args: + boxes: BoxList holding N boxes to be encoded. + anchors: BoxList of anchors. + + Returns: + a tensor representing N anchor-encoded boxes of the format + [ty, tx, th, tw]. + """ + # Convert anchors to the center coordinate representation. + ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() + ycenter, xcenter, h, w = boxes.get_center_coordinates_and_sizes() + # Avoid NaN in division and log below. + ha += EPSILON + wa += EPSILON + h += EPSILON + w += EPSILON + + tx = (xcenter - xcenter_a) / wa + ty = (ycenter - ycenter_a) / ha + tw = tf.math.log(w / wa) + th = tf.math.log(h / ha) + # Scales location targets as used in paper for joint training. + if self._scale_factors: + ty *= self._scale_factors[0] + tx *= self._scale_factors[1] + th *= self._scale_factors[2] + tw *= self._scale_factors[3] + return tf.transpose(a=tf.stack([ty, tx, th, tw])) + + def _decode(self, rel_codes, anchors): + """Decode relative codes to boxes. + + Args: + rel_codes: a tensor representing N anchor-encoded boxes. + anchors: BoxList of anchors. + + Returns: + boxes: BoxList holding N bounding boxes. + """ + ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() + + ty, tx, th, tw = tf.unstack(tf.transpose(a=rel_codes)) + if self._scale_factors: + ty /= self._scale_factors[0] + tx /= self._scale_factors[1] + th /= self._scale_factors[2] + tw /= self._scale_factors[3] + w = tf.exp(tw) * wa + h = tf.exp(th) * ha + ycenter = ty * ha + ycenter_a + xcenter = tx * wa + xcenter_a + ymin = ycenter - h / 2. + xmin = xcenter - w / 2. + ymax = ycenter + h / 2. + xmax = xcenter + w / 2. + return box_list.BoxList(tf.transpose(a=tf.stack([ymin, xmin, ymax, xmax]))) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/matcher.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/matcher.py new file mode 100644 index 0000000..9effb71 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/matcher.py @@ -0,0 +1,243 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Matcher interface and Match class. + +This module defines the Matcher interface and the Match object. The job of the +matcher is to match row and column indices based on the similarity matrix and +other optional parameters. Each column is matched to at most one row. There +are three possibilities for the matching: + +1) match: A column matches a row. +2) no_match: A column does not match any row. +3) ignore: A column that is neither 'match' nor no_match. + +The ignore case is regularly encountered in object detection: when an anchor has +a relatively small overlap with a ground-truth box, one neither wants to +consider this box a positive example (match) nor a negative example (no match). + +The Match class is used to store the match results and it provides simple apis +to query the results. +""" +from abc import ABCMeta +from abc import abstractmethod + +import tensorflow.compat.v2 as tf + + +class Match(object): + """Class to store results from the matcher. + + This class is used to store the results from the matcher. It provides + convenient methods to query the matching results. + """ + + def __init__(self, match_results): + """Constructs a Match object. + + Args: + match_results: Integer tensor of shape [N] with (1) match_results[i]>=0, + meaning that column i is matched with row match_results[i]. + (2) match_results[i]=-1, meaning that column i is not matched. + (3) match_results[i]=-2, meaning that column i is ignored. + + Raises: + ValueError: if match_results does not have rank 1 or is not an + integer int32 scalar tensor + """ + if match_results.shape.ndims != 1: + raise ValueError('match_results should have rank 1') + if match_results.dtype != tf.int32: + raise ValueError('match_results should be an int32 or int64 scalar ' + 'tensor') + self._match_results = match_results + + @property + def match_results(self): + """The accessor for match results. + + Returns: + the tensor which encodes the match results. + """ + return self._match_results + + def matched_column_indices(self): + """Returns column indices that match to some row. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.greater(self._match_results, -1))) + + def matched_column_indicator(self): + """Returns column indices that are matched. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return tf.greater_equal(self._match_results, 0) + + def num_matched_columns(self): + """Returns number (int32 scalar tensor) of matched columns.""" + return tf.size(input=self.matched_column_indices()) + + def unmatched_column_indices(self): + """Returns column indices that do not match any row. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.equal(self._match_results, -1))) + + def unmatched_column_indicator(self): + """Returns column indices that are unmatched. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return tf.equal(self._match_results, -1) + + def num_unmatched_columns(self): + """Returns number (int32 scalar tensor) of unmatched columns.""" + return tf.size(input=self.unmatched_column_indices()) + + def ignored_column_indices(self): + """Returns column indices that are ignored (neither Matched nor Unmatched). + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(self.ignored_column_indicator())) + + def ignored_column_indicator(self): + """Returns boolean column indicator where True means the colum is ignored. + + Returns: + column_indicator: boolean vector which is True for all ignored column + indices. + """ + return tf.equal(self._match_results, -2) + + def num_ignored_columns(self): + """Returns number (int32 scalar tensor) of matched columns.""" + return tf.size(input=self.ignored_column_indices()) + + def unmatched_or_ignored_column_indices(self): + """Returns column indices that are unmatched or ignored. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.greater(0, self._match_results))) + + def matched_row_indices(self): + """Returns row indices that match some column. + + The indices returned by this op are ordered so as to be in correspondence + with the output of matched_column_indicator(). For example if + self.matched_column_indicator() is [0,2], and self.matched_row_indices() is + [7, 3], then we know that column 0 was matched to row 7 and column 2 was + matched to row 3. + + Returns: + row_indices: int32 tensor of shape [K] with row indices. + """ + return self._reshape_and_cast( + tf.gather(self._match_results, self.matched_column_indices())) + + def _reshape_and_cast(self, t): + return tf.cast(tf.reshape(t, [-1]), tf.int32) + + def gather_based_on_match(self, input_tensor, unmatched_value, + ignored_value): + """Gathers elements from `input_tensor` based on match results. + + For columns that are matched to a row, gathered_tensor[col] is set to + input_tensor[match_results[col]]. For columns that are unmatched, + gathered_tensor[col] is set to unmatched_value. Finally, for columns that + are ignored gathered_tensor[col] is set to ignored_value. + + Note that the input_tensor.shape[1:] must match with unmatched_value.shape + and ignored_value.shape + + Args: + input_tensor: Tensor to gather values from. + unmatched_value: Constant tensor value for unmatched columns. + ignored_value: Constant tensor value for ignored columns. + + Returns: + gathered_tensor: A tensor containing values gathered from input_tensor. + The shape of the gathered tensor is [match_results.shape[0]] + + input_tensor.shape[1:]. + """ + input_tensor = tf.concat([tf.stack([ignored_value, unmatched_value]), + input_tensor], axis=0) + gather_indices = tf.maximum(self.match_results + 2, 0) + gathered_tensor = tf.gather(input_tensor, gather_indices) + return gathered_tensor + + +class Matcher(object): + """Abstract base class for matcher. + """ + __metaclass__ = ABCMeta + + def match(self, similarity_matrix, scope=None, **params): + """Computes matches among row and column indices and returns the result. + + Computes matches among the row and column indices based on the similarity + matrix and optional arguments. + + Args: + similarity_matrix: Float tensor of shape [N, M] with pairwise similarity + where higher value means more similar. + scope: Op scope name. Defaults to 'Match' if None. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + A Match object with the results of matching. + """ + if not scope: + scope = 'Match' + with tf.name_scope(scope) as scope: + return Match(self._match(similarity_matrix, **params)) + + @abstractmethod + def _match(self, similarity_matrix, **params): + """Method to be overridden by implementations. + + Args: + similarity_matrix: Float tensor of shape [N, M] with pairwise similarity + where higher value means more similar. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + match_results: Integer tensor of shape [M]: match_results[i]>=0 means + that column i is matched to row match_results[i], match_results[i]=-1 + means that the column is not matched. match_results[i]=-2 means that + the column is ignored (usually this happens when there is a very weak + match which one neither wants as positive nor negative example). + """ + pass diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/minibatch_sampler.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/minibatch_sampler.py new file mode 100644 index 0000000..1e92801 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/minibatch_sampler.py @@ -0,0 +1,93 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Base minibatch sampler module. + +The job of the minibatch_sampler is to subsample a minibatch based on some +criterion. + +The main function call is: + subsample(indicator, batch_size, **params). +Indicator is a 1d boolean tensor where True denotes which examples can be +sampled. It returns a boolean indicator where True denotes an example has been +sampled.. + +Subclasses should implement the Subsample function and can make use of the +@staticmethod SubsampleIndicator. + +This is originally implemented in TensorFlow Object Detection API. +""" + +from abc import ABCMeta +from abc import abstractmethod + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import ops + + +class MinibatchSampler(object): + """Abstract base class for subsampling minibatches.""" + __metaclass__ = ABCMeta + + def __init__(self): + """Constructs a minibatch sampler.""" + pass + + @abstractmethod + def subsample(self, indicator, batch_size, **params): + """Returns subsample of entries in indicator. + + Args: + indicator: boolean tensor of shape [N] whose True entries can be sampled. + batch_size: desired batch size. + **params: additional keyword arguments for specific implementations of + the MinibatchSampler. + + Returns: + sample_indicator: boolean tensor of shape [N] whose True entries have been + sampled. If sum(indicator) >= batch_size, sum(is_sampled) = batch_size + """ + pass + + @staticmethod + def subsample_indicator(indicator, num_samples): + """Subsample indicator vector. + + Given a boolean indicator vector with M elements set to `True`, the function + assigns all but `num_samples` of these previously `True` elements to + `False`. If `num_samples` is greater than M, the original indicator vector + is returned. + + Args: + indicator: a 1-dimensional boolean tensor indicating which elements + are allowed to be sampled and which are not. + num_samples: int32 scalar tensor + + Returns: + a boolean tensor with the same shape as input (indicator) tensor + """ + indices = tf.where(indicator) + indices = tf.random.shuffle(indices) + indices = tf.reshape(indices, [-1]) + + num_samples = tf.minimum(tf.size(input=indices), num_samples) + selected_indices = tf.slice(indices, [0], tf.reshape(num_samples, [1])) + + selected_indicator = ops.indices_to_dense_vector( + selected_indices, + tf.shape(input=indicator)[0]) + + return tf.equal(selected_indicator, 1) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/ops.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/ops.py new file mode 100644 index 0000000..683d856 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/ops.py @@ -0,0 +1,82 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""A module for helper tensorflow ops. + +This is originally implemented in TensorFlow Object Detection API. +""" + +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import shape_utils + + +def indices_to_dense_vector(indices, + size, + indices_value=1., + default_value=0, + dtype=tf.float32): + """Creates dense vector with indices set to specific value and rest to zeros. + + This function exists because it is unclear if it is safe to use + tf.sparse_to_dense(indices, [size], 1, validate_indices=False) + with indices which are not ordered. + This function accepts a dynamic size (e.g. tf.shape(tensor)[0]) + + Args: + indices: 1d Tensor with integer indices which are to be set to + indices_values. + size: scalar with size (integer) of output Tensor. + indices_value: values of elements specified by indices in the output vector + default_value: values of other elements in the output vector. + dtype: data type. + + Returns: + dense 1D Tensor of shape [size] with indices set to indices_values and the + rest set to default_value. + """ + size = tf.cast(size, dtype=tf.int32) + zeros = tf.ones([size], dtype=dtype) * default_value + values = tf.ones_like(indices, dtype=dtype) * indices_value + + return tf.dynamic_stitch( + [tf.range(size), tf.cast(indices, dtype=tf.int32)], [zeros, values]) + + +def matmul_gather_on_zeroth_axis(params, indices, scope=None): + """Matrix multiplication based implementation of tf.gather on zeroth axis. + + TODO(rathodv, jonathanhuang): enable sparse matmul option. + + Args: + params: A float32 Tensor. The tensor from which to gather values. + Must be at least rank 1. + indices: A Tensor. Must be one of the following types: int32, int64. + Must be in range [0, params.shape[0]) + scope: A name for the operation (optional). + + Returns: + A Tensor. Has the same type as params. Values from params gathered + from indices given by indices, with shape indices.shape + params.shape[1:]. + """ + scope = scope or 'MatMulGather' + with tf.name_scope(scope): + params_shape = shape_utils.combined_static_and_dynamic_shape(params) + indices_shape = shape_utils.combined_static_and_dynamic_shape(indices) + params2d = tf.reshape(params, [params_shape[0], -1]) + indicator_matrix = tf.one_hot(indices, params_shape[0]) + gathered_result_flattened = tf.matmul(indicator_matrix, params2d) + return tf.reshape(gathered_result_flattened, + tf.stack(indices_shape + params_shape[1:])) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/preprocessor.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/preprocessor.py new file mode 100644 index 0000000..a37f391 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/preprocessor.py @@ -0,0 +1,525 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Preprocess images and bounding boxes for detection. + +We perform two sets of operations in preprocessing stage: +(a) operations that are applied to both training and testing data, +(b) operations that are applied only to training data for the purpose of + data augmentation. + +A preprocessing function receives a set of inputs, +e.g. an image and bounding boxes, +performs an operation on them, and returns them. +Some examples are: randomly cropping the image, randomly mirroring the image, + randomly changing the brightness, contrast, hue and + randomly jittering the bounding boxes. + +The image is a rank 4 tensor: [1, height, width, channels] with +dtype=tf.float32. The groundtruth_boxes is a rank 2 tensor: [N, 4] where +in each row there is a box with [ymin xmin ymax xmax]. +Boxes are in normalized coordinates meaning +their coordinate values range in [0, 1] + +Important Note: In tensor_dict, images is a rank 4 tensor, but preprocessing +functions receive a rank 3 tensor for processing the image. Thus, inside the +preprocess function we squeeze the image to become a rank 3 tensor and then +we pass it to the functions. At the end of the preprocess we expand the image +back to rank 4. +""" + +import tensorflow.compat.v2 as tf + +import numpy as np + +from official.vision.detection.utils.object_detection import box_list + + +def _flip_boxes_left_right(boxes): + """Left-right flip the boxes. + + Args: + boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + Each row is in the form of [ymin, xmin, ymax, xmax]. + + Returns: + Flipped boxes. + """ + ymin, xmin, ymax, xmax = tf.split(value=boxes, num_or_size_splits=4, axis=1) + flipped_xmin = tf.subtract(1.0, xmax) + flipped_xmax = tf.subtract(1.0, xmin) + flipped_boxes = tf.concat([ymin, flipped_xmin, ymax, flipped_xmax], 1) + return flipped_boxes + + +def _flip_masks_left_right(masks): + """Left-right flip masks. + + Args: + masks: rank 3 float32 tensor with shape + [num_instances, height, width] representing instance masks. + + Returns: + flipped masks: rank 3 float32 tensor with shape + [num_instances, height, width] representing instance masks. + """ + return masks[:, :, ::-1] + + +def keypoint_flip_horizontal(keypoints, flip_point, flip_permutation, + scope=None): + """Flips the keypoints horizontally around the flip_point. + + This operation flips the x coordinate for each keypoint around the flip_point + and also permutes the keypoints in a manner specified by flip_permutation. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + flip_point: (float) scalar tensor representing the x coordinate to flip the + keypoints around. + flip_permutation: rank 1 int32 tensor containing the keypoint flip + permutation. This specifies the mapping from original keypoint indices + to the flipped keypoint indices. This is used primarily for keypoints + that are not reflection invariant. E.g. Suppose there are 3 keypoints + representing ['head', 'right_eye', 'left_eye'], then a logical choice for + flip_permutation might be [0, 2, 1] since we want to swap the 'left_eye' + and 'right_eye' after a horizontal flip. + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + if not scope: + scope = 'FlipHorizontal' + with tf.name_scope(scope): + keypoints = tf.transpose(a=keypoints, perm=[1, 0, 2]) + keypoints = tf.gather(keypoints, flip_permutation) + v, u = tf.split(value=keypoints, num_or_size_splits=2, axis=2) + u = flip_point * 2.0 - u + new_keypoints = tf.concat([v, u], 2) + new_keypoints = tf.transpose(a=new_keypoints, perm=[1, 0, 2]) + return new_keypoints + + +def keypoint_change_coordinate_frame(keypoints, window, scope=None): + """Changes coordinate frame of the keypoints to be relative to window's frame. + + Given a window of the form [y_min, x_min, y_max, x_max], changes keypoint + coordinates from keypoints of shape [num_instances, num_keypoints, 2] + to be relative to this window. + + An example use case is data augmentation: where we are given groundtruth + keypoints and would like to randomly crop the image to some window. In this + case we need to change the coordinate frame of each groundtruth keypoint to be + relative to this new window. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] + window we should change the coordinate frame to. + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + if not scope: + scope = 'ChangeCoordinateFrame' + with tf.name_scope(scope): + win_height = window[2] - window[0] + win_width = window[3] - window[1] + new_keypoints = box_list_ops.scale(keypoints - [window[0], window[1]], + 1.0 / win_height, 1.0 / win_width) + return new_keypoints + + +def keypoint_prune_outside_window(keypoints, window, scope=None): + """Prunes keypoints that fall outside a given window. + + This function replaces keypoints that fall outside the given window with nan. + See also clip_to_window which clips any keypoints that fall outside the given + window. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + window: a tensor of shape [4] representing the [y_min, x_min, y_max, x_max] + window outside of which the op should prune the keypoints. + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + if not scope: + scope = 'PruneOutsideWindow' + with tf.name_scope(scope): + y, x = tf.split(value=keypoints, num_or_size_splits=2, axis=2) + win_y_min, win_x_min, win_y_max, win_x_max = tf.unstack(window) + + valid_indices = tf.logical_and( + tf.logical_and(y >= win_y_min, y <= win_y_max), + tf.logical_and(x >= win_x_min, x <= win_x_max)) + + new_y = tf.where(valid_indices, y, np.nan * tf.ones_like(y)) + new_x = tf.where(valid_indices, x, np.nan * tf.ones_like(x)) + new_keypoints = tf.concat([new_y, new_x], 2) + + return new_keypoints + + +def random_horizontal_flip(image, + boxes=None, + masks=None, + keypoints=None, + keypoint_flip_permutation=None, + seed=None): + """Randomly flips the image and detections horizontally. + + The probability of flipping the image is 50%. + + Args: + image: rank 3 float32 tensor with shape [height, width, channels]. + boxes: (optional) rank 2 float32 tensor with shape [N, 4] + containing the bounding boxes. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + Each row is in the form of [ymin, xmin, ymax, xmax]. + masks: (optional) rank 3 float32 tensor with shape + [num_instances, height, width] containing instance masks. The masks + are of the same height, width as the input `image`. + keypoints: (optional) rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2]. The keypoints are in y-x + normalized coordinates. + keypoint_flip_permutation: rank 1 int32 tensor containing the keypoint flip + permutation. + seed: random seed + + Returns: + image: image which is the same shape as input image. + + If boxes, masks, keypoints, and keypoint_flip_permutation are not None, + the function also returns the following tensors. + + boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + masks: rank 3 float32 tensor with shape [num_instances, height, width] + containing instance masks. + keypoints: rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2] + + Raises: + ValueError: if keypoints are provided but keypoint_flip_permutation is not. + """ + + def _flip_image(image): + # flip image + image_flipped = tf.image.flip_left_right(image) + return image_flipped + + if keypoints is not None and keypoint_flip_permutation is None: + raise ValueError( + 'keypoints are provided but keypoints_flip_permutation is not provided') + + with tf.name_scope('RandomHorizontalFlip'): + result = [] + # random variable defining whether to do flip or not + do_a_flip_random = tf.greater(tf.random.uniform([], seed=seed), 0.5) + + # flip image + image = tf.cond( + pred=do_a_flip_random, + true_fn=lambda: _flip_image(image), + false_fn=lambda: image) + result.append(image) + + # flip boxes + if boxes is not None: + boxes = tf.cond( + pred=do_a_flip_random, + true_fn=lambda: _flip_boxes_left_right(boxes), + false_fn=lambda: boxes) + result.append(boxes) + + # flip masks + if masks is not None: + masks = tf.cond( + pred=do_a_flip_random, + true_fn=lambda: _flip_masks_left_right(masks), + false_fn=lambda: masks) + result.append(masks) + + # flip keypoints + if keypoints is not None and keypoint_flip_permutation is not None: + permutation = keypoint_flip_permutation + keypoints = tf.cond( + pred=do_a_flip_random, + true_fn=lambda: keypoint_flip_horizontal(keypoints, 0.5, permutation), + false_fn=lambda: keypoints) + result.append(keypoints) + + return tuple(result) + + +def _compute_new_static_size(image, min_dimension, max_dimension): + """Compute new static shape for resize_to_range method.""" + image_shape = image.get_shape().as_list() + orig_height = image_shape[0] + orig_width = image_shape[1] + num_channels = image_shape[2] + orig_min_dim = min(orig_height, orig_width) + # Calculates the larger of the possible sizes + large_scale_factor = min_dimension / float(orig_min_dim) + # Scaling orig_(height|width) by large_scale_factor will make the smaller + # dimension equal to min_dimension, save for floating point rounding errors. + # For reasonably-sized images, taking the nearest integer will reliably + # eliminate this error. + large_height = int(round(orig_height * large_scale_factor)) + large_width = int(round(orig_width * large_scale_factor)) + large_size = [large_height, large_width] + if max_dimension: + # Calculates the smaller of the possible sizes, use that if the larger + # is too big. + orig_max_dim = max(orig_height, orig_width) + small_scale_factor = max_dimension / float(orig_max_dim) + # Scaling orig_(height|width) by small_scale_factor will make the larger + # dimension equal to max_dimension, save for floating point rounding + # errors. For reasonably-sized images, taking the nearest integer will + # reliably eliminate this error. + small_height = int(round(orig_height * small_scale_factor)) + small_width = int(round(orig_width * small_scale_factor)) + small_size = [small_height, small_width] + new_size = large_size + if max(large_size) > max_dimension: + new_size = small_size + else: + new_size = large_size + return tf.constant(new_size + [num_channels]) + + +def _compute_new_dynamic_size(image, min_dimension, max_dimension): + """Compute new dynamic shape for resize_to_range method.""" + image_shape = tf.shape(input=image) + orig_height = tf.cast(image_shape[0], dtype=tf.float32) + orig_width = tf.cast(image_shape[1], dtype=tf.float32) + num_channels = image_shape[2] + orig_min_dim = tf.minimum(orig_height, orig_width) + # Calculates the larger of the possible sizes + min_dimension = tf.constant(min_dimension, dtype=tf.float32) + large_scale_factor = min_dimension / orig_min_dim + # Scaling orig_(height|width) by large_scale_factor will make the smaller + # dimension equal to min_dimension, save for floating point rounding errors. + # For reasonably-sized images, taking the nearest integer will reliably + # eliminate this error. + large_height = tf.cast( + tf.round(orig_height * large_scale_factor), dtype=tf.int32) + large_width = tf.cast( + tf.round(orig_width * large_scale_factor), dtype=tf.int32) + large_size = tf.stack([large_height, large_width]) + if max_dimension: + # Calculates the smaller of the possible sizes, use that if the larger + # is too big. + orig_max_dim = tf.maximum(orig_height, orig_width) + max_dimension = tf.constant(max_dimension, dtype=tf.float32) + small_scale_factor = max_dimension / orig_max_dim + # Scaling orig_(height|width) by small_scale_factor will make the larger + # dimension equal to max_dimension, save for floating point rounding + # errors. For reasonably-sized images, taking the nearest integer will + # reliably eliminate this error. + small_height = tf.cast( + tf.round(orig_height * small_scale_factor), dtype=tf.int32) + small_width = tf.cast( + tf.round(orig_width * small_scale_factor), dtype=tf.int32) + small_size = tf.stack([small_height, small_width]) + new_size = tf.cond( + pred=tf.cast(tf.reduce_max(input_tensor=large_size), dtype=tf.float32) > + max_dimension, + true_fn=lambda: small_size, + false_fn=lambda: large_size) + else: + new_size = large_size + return tf.stack(tf.unstack(new_size) + [num_channels]) + + +def resize_to_range(image, + masks=None, + min_dimension=None, + max_dimension=None, + method=tf.image.ResizeMethod.BILINEAR, + align_corners=False, + pad_to_max_dimension=False): + """Resizes an image so its dimensions are within the provided value. + + The output size can be described by two cases: + 1. If the image can be rescaled so its minimum dimension is equal to the + provided value without the other dimension exceeding max_dimension, + then do so. + 2. Otherwise, resize so the largest dimension is equal to max_dimension. + + Args: + image: A 3D tensor of shape [height, width, channels] + masks: (optional) rank 3 float32 tensor with shape + [num_instances, height, width] containing instance masks. + min_dimension: (optional) (scalar) desired size of the smaller image + dimension. + max_dimension: (optional) (scalar) maximum allowed size + of the larger image dimension. + method: (optional) interpolation method used in resizing. Defaults to + BILINEAR. + align_corners: bool. If true, exactly align all 4 corners of the input + and output. Defaults to False. + pad_to_max_dimension: Whether to resize the image and pad it with zeros + so the resulting image is of the spatial size + [max_dimension, max_dimension]. If masks are included they are padded + similarly. + + Returns: + Note that the position of the resized_image_shape changes based on whether + masks are present. + resized_image: A 3D tensor of shape [new_height, new_width, channels], + where the image has been resized (with bilinear interpolation) so that + min(new_height, new_width) == min_dimension or + max(new_height, new_width) == max_dimension. + resized_masks: If masks is not None, also outputs masks. A 3D tensor of + shape [num_instances, new_height, new_width]. + resized_image_shape: A 1D tensor of shape [3] containing shape of the + resized image. + + Raises: + ValueError: if the image is not a 3D tensor. + """ + if len(image.get_shape()) != 3: + raise ValueError('Image should be 3D tensor') + + with tf.name_scope('ResizeToRange'): + if image.get_shape().is_fully_defined(): + new_size = _compute_new_static_size(image, min_dimension, max_dimension) + else: + new_size = _compute_new_dynamic_size(image, min_dimension, max_dimension) + new_image = tf.image.resize(image, new_size[:-1], method=method) + + if pad_to_max_dimension: + new_image = tf.image.pad_to_bounding_box( + new_image, 0, 0, max_dimension, max_dimension) + + result = [new_image] + if masks is not None: + new_masks = tf.expand_dims(masks, 3) + new_masks = tf.image.resize( + new_masks, + new_size[:-1], + method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + new_masks = tf.squeeze(new_masks, 3) + if pad_to_max_dimension: + new_masks = tf.image.pad_to_bounding_box( + new_masks, 0, 0, max_dimension, max_dimension) + result.append(new_masks) + + result.append(new_size) + return result + + +def _copy_extra_fields(boxlist_to_copy_to, boxlist_to_copy_from): + """Copies the extra fields of boxlist_to_copy_from to boxlist_to_copy_to. + + Args: + boxlist_to_copy_to: BoxList to which extra fields are copied. + boxlist_to_copy_from: BoxList from which fields are copied. + + Returns: + boxlist_to_copy_to with extra fields. + """ + for field in boxlist_to_copy_from.get_extra_fields(): + boxlist_to_copy_to.add_field(field, boxlist_to_copy_from.get_field(field)) + return boxlist_to_copy_to + + +def box_list_scale(boxlist, y_scale, x_scale, scope=None): + """scale box coordinates in x and y dimensions. + + Args: + boxlist: BoxList holding N boxes + y_scale: (float) scalar tensor + x_scale: (float) scalar tensor + scope: name scope. + + Returns: + boxlist: BoxList holding N boxes + """ + if not scope: + scope = 'Scale' + with tf.name_scope(scope): + y_scale = tf.cast(y_scale, tf.float32) + x_scale = tf.cast(x_scale, tf.float32) + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + y_min = y_scale * y_min + y_max = y_scale * y_max + x_min = x_scale * x_min + x_max = x_scale * x_max + scaled_boxlist = box_list.BoxList( + tf.concat([y_min, x_min, y_max, x_max], 1)) + return _copy_extra_fields(scaled_boxlist, boxlist) + + +def keypoint_scale(keypoints, y_scale, x_scale, scope=None): + """Scales keypoint coordinates in x and y dimensions. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + y_scale: (float) scalar tensor + x_scale: (float) scalar tensor + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + if not scope: + scope = 'Scale' + with tf.name_scope(scope): + y_scale = tf.cast(y_scale, tf.float32) + x_scale = tf.cast(x_scale, tf.float32) + new_keypoints = keypoints * [[[y_scale, x_scale]]] + return new_keypoints + + +def scale_boxes_to_pixel_coordinates(image, boxes, keypoints=None): + """Scales boxes from normalized to pixel coordinates. + + Args: + image: A 3D float32 tensor of shape [height, width, channels]. + boxes: A 2D float32 tensor of shape [num_boxes, 4] containing the bounding + boxes in normalized coordinates. Each row is of the form + [ymin, xmin, ymax, xmax]. + keypoints: (optional) rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2]. The keypoints are in y-x normalized + coordinates. + + Returns: + image: unchanged input image. + scaled_boxes: a 2D float32 tensor of shape [num_boxes, 4] containing the + bounding boxes in pixel coordinates. + scaled_keypoints: a 3D float32 tensor with shape + [num_instances, num_keypoints, 2] containing the keypoints in pixel + coordinates. + """ + boxlist = box_list.BoxList(boxes) + image_height = tf.shape(input=image)[0] + image_width = tf.shape(input=image)[1] + scaled_boxes = box_list_scale(boxlist, image_height, image_width).get() + result = [image, scaled_boxes] + if keypoints is not None: + scaled_keypoints = keypoint_scale(keypoints, image_height, image_width) + result.append(scaled_keypoints) + return tuple(result) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/region_similarity_calculator.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/region_similarity_calculator.py new file mode 100644 index 0000000..f5f1d69 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/region_similarity_calculator.py @@ -0,0 +1,143 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Region Similarity Calculators for BoxLists. + +Region Similarity Calculators compare a pairwise measure of similarity +between the boxes in two BoxLists. +""" +from abc import ABCMeta +from abc import abstractmethod + +import tensorflow.compat.v2 as tf + + +def area(boxlist, scope=None): + """Computes area of boxes. + + Args: + boxlist: BoxList holding N boxes + scope: name scope. + + Returns: + a tensor with shape [N] representing box areas. + """ + if not scope: + scope = 'Area' + with tf.name_scope(scope): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + return tf.squeeze((y_max - y_min) * (x_max - x_min), [1]) + + +def intersection(boxlist1, boxlist2, scope=None): + """Compute pairwise intersection areas between boxes. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise intersections + """ + if not scope: + scope = 'Intersection' + with tf.name_scope(scope): + y_min1, x_min1, y_max1, x_max1 = tf.split( + value=boxlist1.get(), num_or_size_splits=4, axis=1) + y_min2, x_min2, y_max2, x_max2 = tf.split( + value=boxlist2.get(), num_or_size_splits=4, axis=1) + all_pairs_min_ymax = tf.minimum(y_max1, tf.transpose(a=y_max2)) + all_pairs_max_ymin = tf.maximum(y_min1, tf.transpose(a=y_min2)) + intersect_heights = tf.maximum(0.0, all_pairs_min_ymax - all_pairs_max_ymin) + all_pairs_min_xmax = tf.minimum(x_max1, tf.transpose(a=x_max2)) + all_pairs_max_xmin = tf.maximum(x_min1, tf.transpose(a=x_min2)) + intersect_widths = tf.maximum(0.0, all_pairs_min_xmax - all_pairs_max_xmin) + return intersect_heights * intersect_widths + + +def iou(boxlist1, boxlist2, scope=None): + """Computes pairwise intersection-over-union between box collections. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise iou scores. + """ + if not scope: + scope = 'IOU' + with tf.name_scope(scope): + intersections = intersection(boxlist1, boxlist2) + areas1 = area(boxlist1) + areas2 = area(boxlist2) + unions = ( + tf.expand_dims(areas1, 1) + tf.expand_dims(areas2, 0) - intersections) + return tf.where( + tf.equal(intersections, 0.0), tf.zeros_like(intersections), + tf.truediv(intersections, unions)) + + +class RegionSimilarityCalculator(object): + """Abstract base class for region similarity calculator.""" + __metaclass__ = ABCMeta + + def compare(self, boxlist1, boxlist2, scope=None): + """Computes matrix of pairwise similarity between BoxLists. + + This op (to be overriden) computes a measure of pairwise similarity between + the boxes in the given BoxLists. Higher values indicate more similarity. + + Note that this method simply measures similarity and does not explicitly + perform a matching. + + Args: + boxlist1: BoxList holding N boxes. + boxlist2: BoxList holding M boxes. + scope: Op scope name. Defaults to 'Compare' if None. + + Returns: + a (float32) tensor of shape [N, M] with pairwise similarity score. + """ + if not scope: + scope = 'Compare' + with tf.name_scope(scope) as scope: + return self._compare(boxlist1, boxlist2) + + @abstractmethod + def _compare(self, boxlist1, boxlist2): + pass + + +class IouSimilarity(RegionSimilarityCalculator): + """Class to compute similarity based on Intersection over Union (IOU) metric. + + This class computes pairwise similarity between two BoxLists based on IOU. + """ + + def _compare(self, boxlist1, boxlist2): + """Compute pairwise IOU similarity between the two BoxLists. + + Args: + boxlist1: BoxList holding N boxes. + boxlist2: BoxList holding M boxes. + + Returns: + A tensor with shape [N, M] representing pairwise iou scores. + """ + return iou(boxlist1, boxlist2) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/shape_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/shape_utils.py new file mode 100644 index 0000000..bff3bf2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/shape_utils.py @@ -0,0 +1,112 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Utils used to manipulate tensor shapes.""" + +import tensorflow.compat.v2 as tf + + +def assert_shape_equal(shape_a, shape_b): + """Asserts that shape_a and shape_b are equal. + + If the shapes are static, raises a ValueError when the shapes + mismatch. + + If the shapes are dynamic, raises a tf InvalidArgumentError when the shapes + mismatch. + + Args: + shape_a: a list containing shape of the first tensor. + shape_b: a list containing shape of the second tensor. + + Returns: + Either a tf.no_op() when shapes are all static and a tf.assert_equal() op + when the shapes are dynamic. + + Raises: + ValueError: When shapes are both static and unequal. + """ + if (all(isinstance(dim, int) for dim in shape_a) and + all(isinstance(dim, int) for dim in shape_b)): + if shape_a != shape_b: + raise ValueError('Unequal shapes {}, {}'.format(shape_a, shape_b)) + else: return tf.no_op() + else: + return tf.assert_equal(shape_a, shape_b) + + +def combined_static_and_dynamic_shape(tensor): + """Returns a list containing static and dynamic values for the dimensions. + + Returns a list of static and dynamic values for shape dimensions. This is + useful to preserve static shapes when available in reshape operation. + + Args: + tensor: A tensor of any type. + + Returns: + A list of size tensor.shape.ndims containing integers or a scalar tensor. + """ + static_tensor_shape = tensor.shape.as_list() + dynamic_tensor_shape = tf.shape(input=tensor) + combined_shape = [] + for index, dim in enumerate(static_tensor_shape): + if dim is not None: + combined_shape.append(dim) + else: + combined_shape.append(dynamic_tensor_shape[index]) + return combined_shape + + +def pad_or_clip_nd(tensor, output_shape): + """Pad or Clip given tensor to the output shape. + + Args: + tensor: Input tensor to pad or clip. + output_shape: A list of integers / scalar tensors (or None for dynamic dim) + representing the size to pad or clip each dimension of the input tensor. + + Returns: + Input tensor padded and clipped to the output shape. + """ + tensor_shape = tf.shape(input=tensor) + clip_size = [ + tf.where(tensor_shape[i] - shape > 0, shape, -1) + if shape is not None else -1 for i, shape in enumerate(output_shape) + ] + clipped_tensor = tf.slice( + tensor, + begin=tf.zeros(len(clip_size), dtype=tf.int32), + size=clip_size) + + # Pad tensor if the shape of clipped tensor is smaller than the expected + # shape. + clipped_tensor_shape = tf.shape(input=clipped_tensor) + trailing_paddings = [ + shape - clipped_tensor_shape[i] if shape is not None else 0 + for i, shape in enumerate(output_shape) + ] + paddings = tf.stack( + [ + tf.zeros(len(trailing_paddings), dtype=tf.int32), + trailing_paddings + ], + axis=1) + padded_tensor = tf.pad(tensor=clipped_tensor, paddings=paddings) + output_static_shape = [ + dim if not isinstance(dim, tf.Tensor) else None for dim in output_shape + ] + padded_tensor.set_shape(output_static_shape) + return padded_tensor diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/target_assigner.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/target_assigner.py new file mode 100644 index 0000000..b9e20a7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/target_assigner.py @@ -0,0 +1,314 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Base target assigner module. + +The job of a TargetAssigner is, for a given set of anchors (bounding boxes) and +groundtruth detections (bounding boxes), to assign classification and regression +targets to each anchor as well as weights to each anchor (specifying, e.g., +which anchors should not contribute to training loss). + +It assigns classification/regression targets by performing the following steps: +1) Computing pairwise similarity between anchors and groundtruth boxes using a + provided RegionSimilarity Calculator +2) Computing a matching based on the similarity matrix using a provided Matcher +3) Assigning regression targets based on the matching and a provided BoxCoder +4) Assigning classification targets based on the matching and groundtruth labels + +Note that TargetAssigners only operate on detections from a single +image at a time, so any logic for applying a TargetAssigner to multiple +images must be handled externally. +""" +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils.object_detection import box_list +from official.vision.detection.utils.object_detection import shape_utils + + +KEYPOINTS_FIELD_NAME = 'keypoints' + + +class TargetAssigner(object): + """Target assigner to compute classification and regression targets.""" + + def __init__(self, similarity_calc, matcher, box_coder, + negative_class_weight=1.0, unmatched_cls_target=None): + """Construct Object Detection Target Assigner. + + Args: + similarity_calc: a RegionSimilarityCalculator + matcher: Matcher used to match groundtruth to anchors. + box_coder: BoxCoder used to encode matching groundtruth boxes with + respect to anchors. + negative_class_weight: classification weight to be associated to negative + anchors (default: 1.0). The weight must be in [0., 1.]. + unmatched_cls_target: a float32 tensor with shape [d_1, d_2, ..., d_k] + which is consistent with the classification target for each + anchor (and can be empty for scalar targets). This shape must thus be + compatible with the groundtruth labels that are passed to the "assign" + function (which have shape [num_gt_boxes, d_1, d_2, ..., d_k]). + If set to None, unmatched_cls_target is set to be [0] for each anchor. + + Raises: + ValueError: if similarity_calc is not a RegionSimilarityCalculator or + if matcher is not a Matcher or if box_coder is not a BoxCoder + """ + self._similarity_calc = similarity_calc + self._matcher = matcher + self._box_coder = box_coder + self._negative_class_weight = negative_class_weight + if unmatched_cls_target is None: + self._unmatched_cls_target = tf.constant([0], tf.float32) + else: + self._unmatched_cls_target = unmatched_cls_target + + @property + def box_coder(self): + return self._box_coder + + def assign(self, anchors, groundtruth_boxes, groundtruth_labels=None, + groundtruth_weights=None, **params): + """Assign classification and regression targets to each anchor. + + For a given set of anchors and groundtruth detections, match anchors + to groundtruth_boxes and assign classification and regression targets to + each anchor as well as weights based on the resulting match (specifying, + e.g., which anchors should not contribute to training loss). + + Anchors that are not matched to anything are given a classification target + of self._unmatched_cls_target which can be specified via the constructor. + + Args: + anchors: a BoxList representing N anchors + groundtruth_boxes: a BoxList representing M groundtruth boxes + groundtruth_labels: a tensor of shape [M, d_1, ... d_k] + with labels for each of the ground_truth boxes. The subshape + [d_1, ... d_k] can be empty (corresponding to scalar inputs). When set + to None, groundtruth_labels assumes a binary problem where all + ground_truth boxes get a positive label (of 1). + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. The weights + must be in [0., 1.]. If None, all weights are set to 1. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + cls_targets: a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], + where the subshape [d_1, ..., d_k] is compatible with groundtruth_labels + which has shape [num_gt_boxes, d_1, d_2, ... d_k]. + cls_weights: a float32 tensor with shape [num_anchors] + reg_targets: a float32 tensor with shape [num_anchors, box_code_dimension] + reg_weights: a float32 tensor with shape [num_anchors] + match: a matcher.Match object encoding the match between anchors and + groundtruth boxes, with rows corresponding to groundtruth boxes + and columns corresponding to anchors. + + Raises: + ValueError: if anchors or groundtruth_boxes are not of type + box_list.BoxList + """ + if not isinstance(anchors, box_list.BoxList): + raise ValueError('anchors must be an BoxList') + if not isinstance(groundtruth_boxes, box_list.BoxList): + raise ValueError('groundtruth_boxes must be an BoxList') + + if groundtruth_labels is None: + groundtruth_labels = tf.ones(tf.expand_dims(groundtruth_boxes.num_boxes(), + 0)) + groundtruth_labels = tf.expand_dims(groundtruth_labels, -1) + unmatched_shape_assert = shape_utils.assert_shape_equal( + shape_utils.combined_static_and_dynamic_shape(groundtruth_labels)[1:], + shape_utils.combined_static_and_dynamic_shape( + self._unmatched_cls_target)) + labels_and_box_shapes_assert = shape_utils.assert_shape_equal( + shape_utils.combined_static_and_dynamic_shape( + groundtruth_labels)[:1], + shape_utils.combined_static_and_dynamic_shape( + groundtruth_boxes.get())[:1]) + + if groundtruth_weights is None: + num_gt_boxes = groundtruth_boxes.num_boxes_static() + if not num_gt_boxes: + num_gt_boxes = groundtruth_boxes.num_boxes() + groundtruth_weights = tf.ones([num_gt_boxes], dtype=tf.float32) + with tf.control_dependencies( + [unmatched_shape_assert, labels_and_box_shapes_assert]): + match_quality_matrix = self._similarity_calc.compare(groundtruth_boxes, + anchors) + match = self._matcher.match(match_quality_matrix, **params) + reg_targets = self._create_regression_targets(anchors, + groundtruth_boxes, + match) + cls_targets = self._create_classification_targets(groundtruth_labels, + match) + reg_weights = self._create_regression_weights(match, groundtruth_weights) + cls_weights = self._create_classification_weights(match, + groundtruth_weights) + + num_anchors = anchors.num_boxes_static() + if num_anchors is not None: + reg_targets = self._reset_target_shape(reg_targets, num_anchors) + cls_targets = self._reset_target_shape(cls_targets, num_anchors) + reg_weights = self._reset_target_shape(reg_weights, num_anchors) + cls_weights = self._reset_target_shape(cls_weights, num_anchors) + + return cls_targets, cls_weights, reg_targets, reg_weights, match + + def _reset_target_shape(self, target, num_anchors): + """Sets the static shape of the target. + + Args: + target: the target tensor. Its first dimension will be overwritten. + num_anchors: the number of anchors, which is used to override the target's + first dimension. + + Returns: + A tensor with the shape info filled in. + """ + target_shape = target.get_shape().as_list() + target_shape[0] = num_anchors + target.set_shape(target_shape) + return target + + def _create_regression_targets(self, anchors, groundtruth_boxes, match): + """Returns a regression target for each anchor. + + Args: + anchors: a BoxList representing N anchors + groundtruth_boxes: a BoxList representing M groundtruth_boxes + match: a matcher.Match object + + Returns: + reg_targets: a float32 tensor with shape [N, box_code_dimension] + """ + matched_gt_boxes = match.gather_based_on_match( + groundtruth_boxes.get(), + unmatched_value=tf.zeros(4), + ignored_value=tf.zeros(4)) + matched_gt_boxlist = box_list.BoxList(matched_gt_boxes) + if groundtruth_boxes.has_field(KEYPOINTS_FIELD_NAME): + groundtruth_keypoints = groundtruth_boxes.get_field(KEYPOINTS_FIELD_NAME) + matched_keypoints = match.gather_based_on_match( + groundtruth_keypoints, + unmatched_value=tf.zeros(groundtruth_keypoints.get_shape()[1:]), + ignored_value=tf.zeros(groundtruth_keypoints.get_shape()[1:])) + matched_gt_boxlist.add_field(KEYPOINTS_FIELD_NAME, matched_keypoints) + matched_reg_targets = self._box_coder.encode(matched_gt_boxlist, anchors) + match_results_shape = shape_utils.combined_static_and_dynamic_shape( + match.match_results) + + # Zero out the unmatched and ignored regression targets. + unmatched_ignored_reg_targets = tf.tile( + self._default_regression_target(), [match_results_shape[0], 1]) + matched_anchors_mask = match.matched_column_indicator() + # To broadcast matched_anchors_mask to the same shape as + # matched_reg_targets. + matched_anchors_mask = tf.tile( + tf.expand_dims(matched_anchors_mask, 1), + [1, tf.shape(matched_reg_targets)[1]]) + reg_targets = tf.where(matched_anchors_mask, matched_reg_targets, + unmatched_ignored_reg_targets) + return reg_targets + + def _default_regression_target(self): + """Returns the default target for anchors to regress to. + + Default regression targets are set to zero (though in + this implementation what these targets are set to should + not matter as the regression weight of any box set to + regress to the default target is zero). + + Returns: + default_target: a float32 tensor with shape [1, box_code_dimension] + """ + return tf.constant([self._box_coder.code_size*[0]], tf.float32) + + def _create_classification_targets(self, groundtruth_labels, match): + """Create classification targets for each anchor. + + Assign a classification target of for each anchor to the matching + groundtruth label that is provided by match. Anchors that are not matched + to anything are given the target self._unmatched_cls_target + + Args: + groundtruth_labels: a tensor of shape [num_gt_boxes, d_1, ... d_k] + with labels for each of the ground_truth boxes. The subshape + [d_1, ... d_k] can be empty (corresponding to scalar labels). + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + + Returns: + a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], where the + subshape [d_1, ..., d_k] is compatible with groundtruth_labels which has + shape [num_gt_boxes, d_1, d_2, ... d_k]. + """ + return match.gather_based_on_match( + groundtruth_labels, + unmatched_value=self._unmatched_cls_target, + ignored_value=self._unmatched_cls_target) + + def _create_regression_weights(self, match, groundtruth_weights): + """Set regression weight for each anchor. + + Only positive anchors are set to contribute to the regression loss, so this + method returns a weight of 1 for every positive anchor and 0 for every + negative anchor. + + Args: + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. + + Returns: + a float32 tensor with shape [num_anchors] representing regression weights. + """ + return match.gather_based_on_match( + groundtruth_weights, ignored_value=0., unmatched_value=0.) + + def _create_classification_weights(self, + match, + groundtruth_weights): + """Create classification weights for each anchor. + + Positive (matched) anchors are associated with a weight of + positive_class_weight and negative (unmatched) anchors are associated with + a weight of negative_class_weight. When anchors are ignored, weights are set + to zero. By default, both positive/negative weights are set to 1.0, + but they can be adjusted to handle class imbalance (which is almost always + the case in object detection). + + Args: + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. + + Returns: + a float32 tensor with shape [num_anchors] representing classification + weights. + """ + return match.gather_based_on_match( + groundtruth_weights, + ignored_value=0., + unmatched_value=self._negative_class_weight) + + def get_box_coder(self): + """Get BoxCoder of this TargetAssigner. + + Returns: + BoxCoder object. + """ + return self._box_coder diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/visualization_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/visualization_utils.py new file mode 100644 index 0000000..6f7b8ad --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/detection/utils/object_detection/visualization_utils.py @@ -0,0 +1,733 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""A set of functions that are used for visualization. + +These functions often receive an image, perform some visualization on the image. +The functions do not return a value, instead they modify the image itself. + +""" +import collections +import functools +from absl import logging +# Set headless-friendly backend. +import matplotlib; matplotlib.use('Agg') # pylint: disable=multiple-statements +import matplotlib.pyplot as plt # pylint: disable=g-import-not-at-top +import numpy as np +import PIL.Image as Image +import PIL.ImageColor as ImageColor +import PIL.ImageDraw as ImageDraw +import PIL.ImageFont as ImageFont +import six +import tensorflow.compat.v2 as tf + +from official.vision.detection.utils import box_utils +from official.vision.detection.utils.object_detection import shape_utils + + +_TITLE_LEFT_MARGIN = 10 +_TITLE_TOP_MARGIN = 10 +STANDARD_COLORS = [ + 'AliceBlue', 'Chartreuse', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque', + 'BlanchedAlmond', 'BlueViolet', 'BurlyWood', 'CadetBlue', 'AntiqueWhite', + 'Chocolate', 'Coral', 'CornflowerBlue', 'Cornsilk', 'Crimson', 'Cyan', + 'DarkCyan', 'DarkGoldenRod', 'DarkGrey', 'DarkKhaki', 'DarkOrange', + 'DarkOrchid', 'DarkSalmon', 'DarkSeaGreen', 'DarkTurquoise', 'DarkViolet', + 'DeepPink', 'DeepSkyBlue', 'DodgerBlue', 'FireBrick', 'FloralWhite', + 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite', 'Gold', 'GoldenRod', + 'Salmon', 'Tan', 'HoneyDew', 'HotPink', 'IndianRed', 'Ivory', 'Khaki', + 'Lavender', 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', + 'LightCoral', 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGrey', + 'LightGreen', 'LightPink', 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', + 'LightSlateGray', 'LightSlateGrey', 'LightSteelBlue', 'LightYellow', 'Lime', + 'LimeGreen', 'Linen', 'Magenta', 'MediumAquaMarine', 'MediumOrchid', + 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue', 'MediumSpringGreen', + 'MediumTurquoise', 'MediumVioletRed', 'MintCream', 'MistyRose', 'Moccasin', + 'NavajoWhite', 'OldLace', 'Olive', 'OliveDrab', 'Orange', 'OrangeRed', + 'Orchid', 'PaleGoldenRod', 'PaleGreen', 'PaleTurquoise', 'PaleVioletRed', + 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum', 'PowderBlue', 'Purple', + 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Green', 'SandyBrown', + 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue', + 'SlateGray', 'SlateGrey', 'Snow', 'SpringGreen', 'SteelBlue', 'GreenYellow', + 'Teal', 'Thistle', 'Tomato', 'Turquoise', 'Violet', 'Wheat', 'White', + 'WhiteSmoke', 'Yellow', 'YellowGreen' +] + + +def save_image_array_as_png(image, output_path): + """Saves an image (represented as a numpy array) to PNG. + + Args: + image: a numpy array with shape [height, width, 3]. + output_path: path to which image should be written. + """ + image_pil = Image.fromarray(np.uint8(image)).convert('RGB') + with tf.io.gfile.GFile(output_path, 'w') as fid: + image_pil.save(fid, 'PNG') + + +def encode_image_array_as_png_str(image): + """Encodes a numpy array into a PNG string. + + Args: + image: a numpy array with shape [height, width, 3]. + + Returns: + PNG encoded image string. + """ + image_pil = Image.fromarray(np.uint8(image)) + output = six.BytesIO() + image_pil.save(output, format='PNG') + png_string = output.getvalue() + output.close() + return png_string + + +def visualize_images_with_bounding_boxes(images, box_outputs, step, + summary_writer): + """Records subset of evaluation images with bounding boxes.""" + if not isinstance(images, list): + logging.warning('visualize_images_with_bounding_boxes expects list of ' + 'images but received type: %s and value: %s', + type(images), images) + return + + image_shape = tf.shape(images[0]) + image_height = tf.cast(image_shape[0], tf.float32) + image_width = tf.cast(image_shape[1], tf.float32) + normalized_boxes = box_utils.normalize_boxes(box_outputs, + [image_height, image_width]) + + bounding_box_color = tf.constant([[1.0, 1.0, 0.0, 1.0]]) + image_summary = tf.image.draw_bounding_boxes( + tf.cast(images, tf.float32), normalized_boxes, bounding_box_color) + with summary_writer.as_default(): + tf.summary.image('bounding_box_summary', image_summary, step=step) + summary_writer.flush() + + +def draw_bounding_box_on_image_array(image, + ymin, + xmin, + ymax, + xmax, + color='red', + thickness=4, + display_str_list=(), + use_normalized_coordinates=True): + """Adds a bounding box to an image (numpy array). + + Bounding box coordinates can be specified in either absolute (pixel) or + normalized coordinates by setting the use_normalized_coordinates argument. + + Args: + image: a numpy array with shape [height, width, 3]. + ymin: ymin of bounding box. + xmin: xmin of bounding box. + ymax: ymax of bounding box. + xmax: xmax of bounding box. + color: color to draw bounding box. Default is red. + thickness: line thickness. Default value is 4. + display_str_list: list of strings to display in box + (each to be shown on its own line). + use_normalized_coordinates: If True (default), treat coordinates + ymin, xmin, ymax, xmax as relative to the image. Otherwise treat + coordinates as absolute. + """ + image_pil = Image.fromarray(np.uint8(image)).convert('RGB') + draw_bounding_box_on_image(image_pil, ymin, xmin, ymax, xmax, color, + thickness, display_str_list, + use_normalized_coordinates) + np.copyto(image, np.array(image_pil)) + + +def draw_bounding_box_on_image(image, + ymin, + xmin, + ymax, + xmax, + color='red', + thickness=4, + display_str_list=(), + use_normalized_coordinates=True): + """Adds a bounding box to an image. + + Bounding box coordinates can be specified in either absolute (pixel) or + normalized coordinates by setting the use_normalized_coordinates argument. + + Each string in display_str_list is displayed on a separate line above the + bounding box in black text on a rectangle filled with the input 'color'. + If the top of the bounding box extends to the edge of the image, the strings + are displayed below the bounding box. + + Args: + image: a PIL.Image object. + ymin: ymin of bounding box. + xmin: xmin of bounding box. + ymax: ymax of bounding box. + xmax: xmax of bounding box. + color: color to draw bounding box. Default is red. + thickness: line thickness. Default value is 4. + display_str_list: list of strings to display in box + (each to be shown on its own line). + use_normalized_coordinates: If True (default), treat coordinates + ymin, xmin, ymax, xmax as relative to the image. Otherwise treat + coordinates as absolute. + """ + draw = ImageDraw.Draw(image) + im_width, im_height = image.size + if use_normalized_coordinates: + (left, right, top, bottom) = (xmin * im_width, xmax * im_width, + ymin * im_height, ymax * im_height) + else: + (left, right, top, bottom) = (xmin, xmax, ymin, ymax) + draw.line([(left, top), (left, bottom), (right, bottom), + (right, top), (left, top)], width=thickness, fill=color) + try: + font = ImageFont.truetype('arial.ttf', 24) + except IOError: + font = ImageFont.load_default() + + # If the total height of the display strings added to the top of the bounding + # box exceeds the top of the image, stack the strings below the bounding box + # instead of above. + display_str_heights = [font.getsize(ds)[1] for ds in display_str_list] + # Each display_str has a top and bottom margin of 0.05x. + total_display_str_height = (1 + 2 * 0.05) * sum(display_str_heights) + + if top > total_display_str_height: + text_bottom = top + else: + text_bottom = bottom + total_display_str_height + # Reverse list and print from bottom to top. + for display_str in display_str_list[::-1]: + text_width, text_height = font.getsize(display_str) + margin = np.ceil(0.05 * text_height) + draw.rectangle( + [(left, text_bottom - text_height - 2 * margin), (left + text_width, + text_bottom)], + fill=color) + draw.text( + (left + margin, text_bottom - text_height - margin), + display_str, + fill='black', + font=font) + text_bottom -= text_height - 2 * margin + + +def draw_bounding_boxes_on_image_array(image, + boxes, + color='red', + thickness=4, + display_str_list_list=()): + """Draws bounding boxes on image (numpy array). + + Args: + image: a numpy array object. + boxes: a 2 dimensional numpy array of [N, 4]: (ymin, xmin, ymax, xmax). + The coordinates are in normalized format between [0, 1]. + color: color to draw bounding box. Default is red. + thickness: line thickness. Default value is 4. + display_str_list_list: list of list of strings. + a list of strings for each bounding box. + The reason to pass a list of strings for a + bounding box is that it might contain + multiple labels. + + Raises: + ValueError: if boxes is not a [N, 4] array + """ + image_pil = Image.fromarray(image) + draw_bounding_boxes_on_image(image_pil, boxes, color, thickness, + display_str_list_list) + np.copyto(image, np.array(image_pil)) + + +def draw_bounding_boxes_on_image(image, + boxes, + color='red', + thickness=4, + display_str_list_list=()): + """Draws bounding boxes on image. + + Args: + image: a PIL.Image object. + boxes: a 2 dimensional numpy array of [N, 4]: (ymin, xmin, ymax, xmax). + The coordinates are in normalized format between [0, 1]. + color: color to draw bounding box. Default is red. + thickness: line thickness. Default value is 4. + display_str_list_list: list of list of strings. + a list of strings for each bounding box. + The reason to pass a list of strings for a + bounding box is that it might contain + multiple labels. + + Raises: + ValueError: if boxes is not a [N, 4] array + """ + boxes_shape = boxes.shape + if not boxes_shape: + return + if len(boxes_shape) != 2 or boxes_shape[1] != 4: + raise ValueError('Input must be of size [N, 4]') + for i in range(boxes_shape[0]): + display_str_list = () + if display_str_list_list: + display_str_list = display_str_list_list[i] + draw_bounding_box_on_image(image, boxes[i, 0], boxes[i, 1], boxes[i, 2], + boxes[i, 3], color, thickness, display_str_list) + + +def _visualize_boxes(image, boxes, classes, scores, category_index, **kwargs): + return visualize_boxes_and_labels_on_image_array( + image, boxes, classes, scores, category_index=category_index, **kwargs) + + +def _visualize_boxes_and_masks(image, boxes, classes, scores, masks, + category_index, **kwargs): + return visualize_boxes_and_labels_on_image_array( + image, + boxes, + classes, + scores, + category_index=category_index, + instance_masks=masks, + **kwargs) + + +def _visualize_boxes_and_keypoints(image, boxes, classes, scores, keypoints, + category_index, **kwargs): + return visualize_boxes_and_labels_on_image_array( + image, + boxes, + classes, + scores, + category_index=category_index, + keypoints=keypoints, + **kwargs) + + +def _visualize_boxes_and_masks_and_keypoints( + image, boxes, classes, scores, masks, keypoints, category_index, **kwargs): + return visualize_boxes_and_labels_on_image_array( + image, + boxes, + classes, + scores, + category_index=category_index, + instance_masks=masks, + keypoints=keypoints, + **kwargs) + + +def _resize_original_image(image, image_shape): + image = tf.expand_dims(image, 0) + image = tf.image.resize( + image, image_shape, method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + return tf.cast(tf.squeeze(image, 0), tf.uint8) + + +def draw_bounding_boxes_on_image_tensors(images, + boxes, + classes, + scores, + category_index, + original_image_spatial_shape=None, + true_image_shape=None, + instance_masks=None, + keypoints=None, + max_boxes_to_draw=20, + min_score_thresh=0.2, + use_normalized_coordinates=True): + """Draws bounding boxes, masks, and keypoints on batch of image tensors. + + Args: + images: A 4D uint8 image tensor of shape [N, H, W, C]. If C > 3, additional + channels will be ignored. If C = 1, then we convert the images to RGB + images. + boxes: [N, max_detections, 4] float32 tensor of detection boxes. + classes: [N, max_detections] int tensor of detection classes. Note that + classes are 1-indexed. + scores: [N, max_detections] float32 tensor of detection scores. + category_index: a dict that maps integer ids to category dicts. e.g. + {1: {1: 'dog'}, 2: {2: 'cat'}, ...} + original_image_spatial_shape: [N, 2] tensor containing the spatial size of + the original image. + true_image_shape: [N, 3] tensor containing the spatial size of unpadded + original_image. + instance_masks: A 4D uint8 tensor of shape [N, max_detection, H, W] with + instance masks. + keypoints: A 4D float32 tensor of shape [N, max_detection, num_keypoints, 2] + with keypoints. + max_boxes_to_draw: Maximum number of boxes to draw on an image. Default 20. + min_score_thresh: Minimum score threshold for visualization. Default 0.2. + use_normalized_coordinates: Whether to assume boxes and kepoints are in + normalized coordinates (as opposed to absolute coordiantes). + Default is True. + + Returns: + 4D image tensor of type uint8, with boxes drawn on top. + """ + # Additional channels are being ignored. + if images.shape[3] > 3: + images = images[:, :, :, 0:3] + elif images.shape[3] == 1: + images = tf.image.grayscale_to_rgb(images) + visualization_keyword_args = { + 'use_normalized_coordinates': use_normalized_coordinates, + 'max_boxes_to_draw': max_boxes_to_draw, + 'min_score_thresh': min_score_thresh, + 'agnostic_mode': False, + 'line_thickness': 4 + } + if true_image_shape is None: + true_shapes = tf.constant(-1, shape=[images.shape.as_list()[0], 3]) + else: + true_shapes = true_image_shape + if original_image_spatial_shape is None: + original_shapes = tf.constant(-1, shape=[images.shape.as_list()[0], 2]) + else: + original_shapes = original_image_spatial_shape + + if instance_masks is not None and keypoints is None: + visualize_boxes_fn = functools.partial( + _visualize_boxes_and_masks, + category_index=category_index, + **visualization_keyword_args) + elems = [ + true_shapes, original_shapes, images, boxes, classes, scores, + instance_masks + ] + elif instance_masks is None and keypoints is not None: + visualize_boxes_fn = functools.partial( + _visualize_boxes_and_keypoints, + category_index=category_index, + **visualization_keyword_args) + elems = [ + true_shapes, original_shapes, images, boxes, classes, scores, keypoints + ] + elif instance_masks is not None and keypoints is not None: + visualize_boxes_fn = functools.partial( + _visualize_boxes_and_masks_and_keypoints, + category_index=category_index, + **visualization_keyword_args) + elems = [ + true_shapes, original_shapes, images, boxes, classes, scores, + instance_masks, keypoints + ] + else: + visualize_boxes_fn = functools.partial( + _visualize_boxes, + category_index=category_index, + **visualization_keyword_args) + elems = [ + true_shapes, original_shapes, images, boxes, classes, scores + ] + + def draw_boxes(image_and_detections): + """Draws boxes on image.""" + true_shape = image_and_detections[0] + original_shape = image_and_detections[1] + if true_image_shape is not None: + image = shape_utils.pad_or_clip_nd( + image_and_detections[2], [true_shape[0], true_shape[1], 3]) + if original_image_spatial_shape is not None: + image_and_detections[2] = _resize_original_image(image, original_shape) + + image_with_boxes = tf.compat.v1.py_func(visualize_boxes_fn, + image_and_detections[2:], tf.uint8) + return image_with_boxes + + images = tf.map_fn(draw_boxes, elems, dtype=tf.uint8, back_prop=False) + return images + + +def draw_keypoints_on_image_array(image, + keypoints, + color='red', + radius=2, + use_normalized_coordinates=True): + """Draws keypoints on an image (numpy array). + + Args: + image: a numpy array with shape [height, width, 3]. + keypoints: a numpy array with shape [num_keypoints, 2]. + color: color to draw the keypoints with. Default is red. + radius: keypoint radius. Default value is 2. + use_normalized_coordinates: if True (default), treat keypoint values as + relative to the image. Otherwise treat them as absolute. + """ + image_pil = Image.fromarray(np.uint8(image)).convert('RGB') + draw_keypoints_on_image(image_pil, keypoints, color, radius, + use_normalized_coordinates) + np.copyto(image, np.array(image_pil)) + + +def draw_keypoints_on_image(image, + keypoints, + color='red', + radius=2, + use_normalized_coordinates=True): + """Draws keypoints on an image. + + Args: + image: a PIL.Image object. + keypoints: a numpy array with shape [num_keypoints, 2]. + color: color to draw the keypoints with. Default is red. + radius: keypoint radius. Default value is 2. + use_normalized_coordinates: if True (default), treat keypoint values as + relative to the image. Otherwise treat them as absolute. + """ + draw = ImageDraw.Draw(image) + im_width, im_height = image.size + keypoints_x = [k[1] for k in keypoints] + keypoints_y = [k[0] for k in keypoints] + if use_normalized_coordinates: + keypoints_x = tuple([im_width * x for x in keypoints_x]) + keypoints_y = tuple([im_height * y for y in keypoints_y]) + for keypoint_x, keypoint_y in zip(keypoints_x, keypoints_y): + draw.ellipse([(keypoint_x - radius, keypoint_y - radius), + (keypoint_x + radius, keypoint_y + radius)], + outline=color, fill=color) + + +def draw_mask_on_image_array(image, mask, color='red', alpha=0.4): + """Draws mask on an image. + + Args: + image: uint8 numpy array with shape (img_height, img_height, 3) + mask: a uint8 numpy array of shape (img_height, img_height) with + values between either 0 or 1. + color: color to draw the keypoints with. Default is red. + alpha: transparency value between 0 and 1. (default: 0.4) + + Raises: + ValueError: On incorrect data type for image or masks. + """ + if image.dtype != np.uint8: + raise ValueError('`image` not of type np.uint8') + if mask.dtype != np.uint8: + raise ValueError('`mask` not of type np.uint8') + if np.any(np.logical_and(mask != 1, mask != 0)): + raise ValueError('`mask` elements should be in [0, 1]') + if image.shape[:2] != mask.shape: + raise ValueError('The image has spatial dimensions %s but the mask has ' + 'dimensions %s' % (image.shape[:2], mask.shape)) + rgb = ImageColor.getrgb(color) + pil_image = Image.fromarray(image) + + solid_color = np.expand_dims( + np.ones_like(mask), axis=2) * np.reshape(list(rgb), [1, 1, 3]) + pil_solid_color = Image.fromarray(np.uint8(solid_color)).convert('RGBA') + pil_mask = Image.fromarray(np.uint8(255.0*alpha*mask)).convert('L') + pil_image = Image.composite(pil_solid_color, pil_image, pil_mask) + np.copyto(image, np.array(pil_image.convert('RGB'))) + + +def visualize_boxes_and_labels_on_image_array( + image, + boxes, + classes, + scores, + category_index, + instance_masks=None, + instance_boundaries=None, + keypoints=None, + use_normalized_coordinates=False, + max_boxes_to_draw=20, + min_score_thresh=.5, + agnostic_mode=False, + line_thickness=4, + groundtruth_box_visualization_color='black', + skip_scores=False, + skip_labels=False): + """Overlay labeled boxes on an image with formatted scores and label names. + + This function groups boxes that correspond to the same location + and creates a display string for each detection and overlays these + on the image. Note that this function modifies the image in place, and returns + that same image. + + Args: + image: uint8 numpy array with shape (img_height, img_width, 3) + boxes: a numpy array of shape [N, 4] + classes: a numpy array of shape [N]. Note that class indices are 1-based, + and match the keys in the label map. + scores: a numpy array of shape [N] or None. If scores=None, then + this function assumes that the boxes to be plotted are groundtruth + boxes and plot all boxes as black with no classes or scores. + category_index: a dict containing category dictionaries (each holding + category index `id` and category name `name`) keyed by category indices. + instance_masks: a numpy array of shape [N, image_height, image_width] with + values ranging between 0 and 1, can be None. + instance_boundaries: a numpy array of shape [N, image_height, image_width] + with values ranging between 0 and 1, can be None. + keypoints: a numpy array of shape [N, num_keypoints, 2], can + be None + use_normalized_coordinates: whether boxes is to be interpreted as + normalized coordinates or not. + max_boxes_to_draw: maximum number of boxes to visualize. If None, draw + all boxes. + min_score_thresh: minimum score threshold for a box to be visualized + agnostic_mode: boolean (default: False) controlling whether to evaluate in + class-agnostic mode or not. This mode will display scores but ignore + classes. + line_thickness: integer (default: 4) controlling line width of the boxes. + groundtruth_box_visualization_color: box color for visualizing groundtruth + boxes + skip_scores: whether to skip score when drawing a single detection + skip_labels: whether to skip label when drawing a single detection + + Returns: + uint8 numpy array with shape (img_height, img_width, 3) with overlaid boxes. + """ + # Create a display string (and color) for every box location, group any boxes + # that correspond to the same location. + box_to_display_str_map = collections.defaultdict(list) + box_to_color_map = collections.defaultdict(str) + box_to_instance_masks_map = {} + box_to_instance_boundaries_map = {} + box_to_keypoints_map = collections.defaultdict(list) + if not max_boxes_to_draw: + max_boxes_to_draw = boxes.shape[0] + for i in range(min(max_boxes_to_draw, boxes.shape[0])): + if scores is None or scores[i] > min_score_thresh: + box = tuple(boxes[i].tolist()) + if instance_masks is not None: + box_to_instance_masks_map[box] = instance_masks[i] + if instance_boundaries is not None: + box_to_instance_boundaries_map[box] = instance_boundaries[i] + if keypoints is not None: + box_to_keypoints_map[box].extend(keypoints[i]) + if scores is None: + box_to_color_map[box] = groundtruth_box_visualization_color + else: + display_str = '' + if not skip_labels: + if not agnostic_mode: + if classes[i] in category_index.keys(): + class_name = category_index[classes[i]]['name'] + else: + class_name = 'N/A' + display_str = str(class_name) + if not skip_scores: + if not display_str: + display_str = '{}%'.format(int(100*scores[i])) + else: + display_str = '{}: {}%'.format(display_str, int(100*scores[i])) + box_to_display_str_map[box].append(display_str) + if agnostic_mode: + box_to_color_map[box] = 'DarkOrange' + else: + box_to_color_map[box] = STANDARD_COLORS[ + classes[i] % len(STANDARD_COLORS)] + + # Draw all boxes onto image. + for box, color in box_to_color_map.items(): + ymin, xmin, ymax, xmax = box + if instance_masks is not None: + draw_mask_on_image_array( + image, + box_to_instance_masks_map[box], + color=color + ) + if instance_boundaries is not None: + draw_mask_on_image_array( + image, + box_to_instance_boundaries_map[box], + color='red', + alpha=1.0 + ) + draw_bounding_box_on_image_array( + image, + ymin, + xmin, + ymax, + xmax, + color=color, + thickness=line_thickness, + display_str_list=box_to_display_str_map[box], + use_normalized_coordinates=use_normalized_coordinates) + if keypoints is not None: + draw_keypoints_on_image_array( + image, + box_to_keypoints_map[box], + color=color, + radius=line_thickness / 2, + use_normalized_coordinates=use_normalized_coordinates) + + return image + + +def add_cdf_image_summary(values, name): + """Adds a tf.summary.image for a CDF plot of the values. + + Normalizes `values` such that they sum to 1, plots the cumulative distribution + function and creates a tf image summary. + + Args: + values: a 1-D float32 tensor containing the values. + name: name for the image summary. + """ + def cdf_plot(values): + """Numpy function to plot CDF.""" + normalized_values = values / np.sum(values) + sorted_values = np.sort(normalized_values) + cumulative_values = np.cumsum(sorted_values) + fraction_of_examples = (np.arange(cumulative_values.size, dtype=np.float32) + / cumulative_values.size) + fig = plt.figure(frameon=False) + ax = fig.add_subplot('111') + ax.plot(fraction_of_examples, cumulative_values) + ax.set_ylabel('cumulative normalized values') + ax.set_xlabel('fraction of examples') + fig.canvas.draw() + width, height = fig.get_size_inches() * fig.get_dpi() + image = np.fromstring(fig.canvas.tostring_rgb(), dtype='uint8').reshape( + 1, int(height), int(width), 3) + return image + + cdf_plot = tf.compat.v1.py_func(cdf_plot, [values], tf.uint8) + tf.compat.v1.summary.image(name, cdf_plot) + + +def add_hist_image_summary(values, bins, name): + """Adds a tf.summary.image for a histogram plot of the values. + + Plots the histogram of values and creates a tf image summary. + + Args: + values: a 1-D float32 tensor containing the values. + bins: bin edges which will be directly passed to np.histogram. + name: name for the image summary. + """ + + def hist_plot(values, bins): + """Numpy function to plot hist.""" + fig = plt.figure(frameon=False) + ax = fig.add_subplot('111') + y, x = np.histogram(values, bins=bins) + ax.plot(x[:-1], y) + ax.set_ylabel('count') + ax.set_xlabel('value') + fig.canvas.draw() + width, height = fig.get_size_inches() * fig.get_dpi() + image = np.fromstring( + fig.canvas.tostring_rgb(), dtype='uint8').reshape( + 1, int(height), int(width), 3) + return image + + hist_plot = tf.compat.v1.py_func(hist_plot, [values, bins], tf.uint8) + tf.compat.v1.summary.image(name, hist_plot) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/README.md new file mode 100644 index 0000000..c16fdc0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/README.md @@ -0,0 +1,164 @@ +# Image Classification + +This folder contains TF 2.0 model examples for image classification: + +* [MNIST](#mnist) +* [Classifier Trainer](#classifier-trainer), a framework that uses the Keras +compile/fit methods for image classification models, including: + * ResNet + * EfficientNet[^1] + +[^1]: Currently a work in progress. We cannot match "AutoAugment (AA)" in [the original version](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet). +For more information about other types of models, please refer to this +[README file](../../README.md). + +## Before you begin +Please make sure that you have the latest version of TensorFlow +installed and +[add the models folder to your Python path](/official/#running-the-models). + +### ImageNet preparation + +#### Using TFDS +`classifier_trainer.py` supports ImageNet with +[TensorFlow Datasets (TFDS)](https://www.tensorflow.org/datasets/overview). + +Please see the following [example snippet](https://github.com/tensorflow/datasets/blob/master/tensorflow_datasets/scripts/download_and_prepare.py) +for more information on how to use TFDS to download and prepare datasets, and +specifically the [TFDS ImageNet readme](https://github.com/tensorflow/datasets/blob/master/docs/catalog/imagenet2012.md) +for manual download instructions. + +#### Legacy TFRecords +Download the ImageNet dataset and convert it to TFRecord format. +The following [script](https://github.com/tensorflow/tpu/blob/master/tools/datasets/imagenet_to_gcs.py) +and [README](https://github.com/tensorflow/tpu/tree/master/tools/datasets#imagenet_to_gcspy) +provide a few options. + +Note that the legacy ResNet runners, e.g. [resnet/resnet_ctl_imagenet_main.py](resnet/resnet_ctl_imagenet_main.py) +require TFRecords whereas `classifier_trainer.py` can use both by setting the +builder to 'records' or 'tfds' in the configurations. + +### Running on Cloud TPUs + +Note: These models will **not** work with TPUs on Colab. + +You can train image classification models on Cloud TPUs using +[tf.distribute.experimental.TPUStrategy](https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/TPUStrategy?version=nightly). +If you are not familiar with Cloud TPUs, it is strongly recommended that you go +through the +[quickstart](https://cloud.google.com/tpu/docs/quickstart) to learn how to +create a TPU and GCE VM. + +### Running on multiple GPU hosts + +You can also train these models on multiple hosts, each with GPUs, using +[tf.distribute.experimental.MultiWorkerMirroredStrategy](https://www.tensorflow.org/api_docs/python/tf/distribute/experimental/MultiWorkerMirroredStrategy). + +The easiest way to run multi-host benchmarks is to set the +[`TF_CONFIG`](https://www.tensorflow.org/guide/distributed_training#TF_CONFIG) +appropriately at each host. e.g., to run using `MultiWorkerMirroredStrategy` on +2 hosts, the `cluster` in `TF_CONFIG` should have 2 `host:port` entries, and +host `i` should have the `task` in `TF_CONFIG` set to `{"type": "worker", +"index": i}`. `MultiWorkerMirroredStrategy` will automatically use all the +available GPUs at each host. + +## MNIST + +To download the data and run the MNIST sample model locally for the first time, +run one of the following command: + +```bash +python3 mnist_main.py \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --train_epochs=10 \ + --distribution_strategy=one_device \ + --num_gpus=$NUM_GPUS \ + --download +``` + +To train the model on a Cloud TPU, run the following command: + +```bash +python3 mnist_main.py \ + --tpu=$TPU_NAME \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --train_epochs=10 \ + --distribution_strategy=tpu \ + --download +``` + +Note: the `--download` flag is only required the first time you run the model. + + +## Classifier Trainer +The classifier trainer is a unified framework for running image classification +models using Keras's compile/fit methods. Experiments should be provided in the +form of YAML files, some examples are included within the configs/examples +folder. Please see [configs/examples](./configs/examples) for more example +configurations. + +The provided configuration files use a per replica batch size and is scaled +by the number of devices. For instance, if `batch size` = 64, then for 1 GPU +the global batch size would be 64 * 1 = 64. For 8 GPUs, the global batch size +would be 64 * 8 = 512. Similarly, for a v3-8 TPU, the global batch size would +be 64 * 8 = 512, and for a v3-32, the global batch size is 64 * 32 = 2048. + +### ResNet50 + +#### On GPU: +```bash +python3 classifier_trainer.py \ + --mode=train_and_eval \ + --model_type=resnet \ + --dataset=imagenet \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --config_file=configs/examples/resnet/imagenet/gpu.yaml \ + --params_override='runtime.num_gpus=$NUM_GPUS' +``` + +#### On TPU: +```bash +python3 classifier_trainer.py \ + --mode=train_and_eval \ + --model_type=resnet \ + --dataset=imagenet \ + --tpu=$TPU_NAME \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --config_file=configs/examples/resnet/imagenet/tpu.yaml +``` + +### EfficientNet +**Note: EfficientNet development is a work in progress.** +#### On GPU: +```bash +python3 classifier_trainer.py \ + --mode=train_and_eval \ + --model_type=efficientnet \ + --dataset=imagenet \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml \ + --params_override='runtime.num_gpus=$NUM_GPUS' +``` + + +#### On TPU: +```bash +python3 classifier_trainer.py \ + --mode=train_and_eval \ + --model_type=efficientnet \ + --dataset=imagenet \ + --tpu=$TPU_NAME \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml +``` + +Note that the number of GPU devices can be overridden in the command line using +`--params_overrides`. The TPU does not need this override as the device is fixed +by providing the TPU address or name with the `--tpu` flag. + diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment.py new file mode 100644 index 0000000..3771821 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment.py @@ -0,0 +1,999 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""AutoAugment and RandAugment policies for enhanced image preprocessing. + +AutoAugment Reference: https://arxiv.org/abs/1805.09501 +RandAugment Reference: https://arxiv.org/abs/1909.13719 +""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import math +import tensorflow as tf +from typing import Any, Dict, List, Optional, Text, Tuple + +from tensorflow.python.keras.layers.preprocessing import image_preprocessing as image_ops + +# This signifies the max integer that the controller RNN could predict for the +# augmentation scheme. +_MAX_LEVEL = 10. + + +def to_4d(image: tf.Tensor) -> tf.Tensor: + """Converts an input Tensor to 4 dimensions. + + 4D image => [N, H, W, C] or [N, C, H, W] + 3D image => [1, H, W, C] or [1, C, H, W] + 2D image => [1, H, W, 1] + + Args: + image: The 2/3/4D input tensor. + + Returns: + A 4D image tensor. + + Raises: + `TypeError` if `image` is not a 2/3/4D tensor. + + """ + shape = tf.shape(image) + original_rank = tf.rank(image) + left_pad = tf.cast(tf.less_equal(original_rank, 3), dtype=tf.int32) + right_pad = tf.cast(tf.equal(original_rank, 2), dtype=tf.int32) + new_shape = tf.concat( + [ + tf.ones(shape=left_pad, dtype=tf.int32), + shape, + tf.ones(shape=right_pad, dtype=tf.int32), + ], + axis=0, + ) + return tf.reshape(image, new_shape) + + +def from_4d(image: tf.Tensor, ndims: tf.Tensor) -> tf.Tensor: + """Converts a 4D image back to `ndims` rank.""" + shape = tf.shape(image) + begin = tf.cast(tf.less_equal(ndims, 3), dtype=tf.int32) + end = 4 - tf.cast(tf.equal(ndims, 2), dtype=tf.int32) + new_shape = shape[begin:end] + return tf.reshape(image, new_shape) + + +def _convert_translation_to_transform(translations: tf.Tensor) -> tf.Tensor: + """Converts translations to a projective transform. + + The translation matrix looks like this: + [[1 0 -dx] + [0 1 -dy] + [0 0 1]] + + Args: + translations: The 2-element list representing [dx, dy], or a matrix of + 2-element lists representing [dx dy] to translate for each image. The + shape must be static. + + Returns: + The transformation matrix of shape (num_images, 8). + + Raises: + `TypeError` if + - the shape of `translations` is not known or + - the shape of `translations` is not rank 1 or 2. + + """ + translations = tf.convert_to_tensor(translations, dtype=tf.float32) + if translations.get_shape().ndims is None: + raise TypeError('translations rank must be statically known') + elif len(translations.get_shape()) == 1: + translations = translations[None] + elif len(translations.get_shape()) != 2: + raise TypeError('translations should have rank 1 or 2.') + num_translations = tf.shape(translations)[0] + + return tf.concat( + values=[ + tf.ones((num_translations, 1), tf.dtypes.float32), + tf.zeros((num_translations, 1), tf.dtypes.float32), + -translations[:, 0, None], + tf.zeros((num_translations, 1), tf.dtypes.float32), + tf.ones((num_translations, 1), tf.dtypes.float32), + -translations[:, 1, None], + tf.zeros((num_translations, 2), tf.dtypes.float32), + ], + axis=1, + ) + + +def _convert_angles_to_transform( + angles: tf.Tensor, + image_width: tf.Tensor, + image_height: tf.Tensor) -> tf.Tensor: + """Converts an angle or angles to a projective transform. + + Args: + angles: A scalar to rotate all images, or a vector to rotate a batch of + images. This must be a scalar. + image_width: The width of the image(s) to be transformed. + image_height: The height of the image(s) to be transformed. + + Returns: + A tensor of shape (num_images, 8). + + Raises: + `TypeError` if `angles` is not rank 0 or 1. + + """ + angles = tf.convert_to_tensor(angles, dtype=tf.float32) + if len(angles.get_shape()) == 0: # pylint:disable=g-explicit-length-test + angles = angles[None] + elif len(angles.get_shape()) != 1: + raise TypeError('Angles should have a rank 0 or 1.') + x_offset = ((image_width - 1) - + (tf.math.cos(angles) * (image_width - 1) - tf.math.sin(angles) * + (image_height - 1))) / 2.0 + y_offset = ((image_height - 1) - + (tf.math.sin(angles) * (image_width - 1) + tf.math.cos(angles) * + (image_height - 1))) / 2.0 + num_angles = tf.shape(angles)[0] + return tf.concat( + values=[ + tf.math.cos(angles)[:, None], + -tf.math.sin(angles)[:, None], + x_offset[:, None], + tf.math.sin(angles)[:, None], + tf.math.cos(angles)[:, None], + y_offset[:, None], + tf.zeros((num_angles, 2), tf.dtypes.float32), + ], + axis=1, + ) + + +def transform(image: tf.Tensor, transforms) -> tf.Tensor: + """Prepares input data for `image_ops.transform`.""" + original_ndims = tf.rank(image) + transforms = tf.convert_to_tensor(transforms, dtype=tf.float32) + if len(tf.shape(transforms)) == 1: + transforms = transforms[None] + image = to_4d(image) + image = image_ops.transform( + images=image, + transforms=transforms, + interpolation='nearest') + return from_4d(image, original_ndims) + + +def translate(image: tf.Tensor, translations) -> tf.Tensor: + """Translates image(s) by provided vectors. + + Args: + image: An image Tensor of type uint8. + translations: A vector or matrix representing [dx dy]. + + Returns: + The translated version of the image. + + """ + transforms = _convert_translation_to_transform(translations) + return transform(image, transforms=transforms) + + +def rotate(image: tf.Tensor, degrees: float) -> tf.Tensor: + """Rotates the image by degrees either clockwise or counterclockwise. + + Args: + image: An image Tensor of type uint8. + degrees: Float, a scalar angle in degrees to rotate all images by. If + degrees is positive the image will be rotated clockwise otherwise it will + be rotated counterclockwise. + + Returns: + The rotated version of image. + + """ + # Convert from degrees to radians. + degrees_to_radians = math.pi / 180.0 + radians = tf.cast(degrees * degrees_to_radians, tf.float32) + + original_ndims = tf.rank(image) + image = to_4d(image) + + image_height = tf.cast(tf.shape(image)[1], tf.float32) + image_width = tf.cast(tf.shape(image)[2], tf.float32) + transforms = _convert_angles_to_transform(angles=radians, + image_width=image_width, + image_height=image_height) + # In practice, we should randomize the rotation degrees by flipping + # it negatively half the time, but that's done on 'degrees' outside + # of the function. + image = transform(image, transforms=transforms) + return from_4d(image, original_ndims) + + +def blend(image1: tf.Tensor, image2: tf.Tensor, factor: float) -> tf.Tensor: + """Blend image1 and image2 using 'factor'. + + Factor can be above 0.0. A value of 0.0 means only image1 is used. + A value of 1.0 means only image2 is used. A value between 0.0 and + 1.0 means we linearly interpolate the pixel values between the two + images. A value greater than 1.0 "extrapolates" the difference + between the two pixel values, and we clip the results to values + between 0 and 255. + + Args: + image1: An image Tensor of type uint8. + image2: An image Tensor of type uint8. + factor: A floating point value above 0.0. + + Returns: + A blended image Tensor of type uint8. + """ + if factor == 0.0: + return tf.convert_to_tensor(image1) + if factor == 1.0: + return tf.convert_to_tensor(image2) + + image1 = tf.cast(image1, tf.float32) + image2 = tf.cast(image2, tf.float32) + + difference = image2 - image1 + scaled = factor * difference + + # Do addition in float. + temp = tf.cast(image1, tf.float32) + scaled + + # Interpolate + if factor > 0.0 and factor < 1.0: + # Interpolation means we always stay within 0 and 255. + return tf.cast(temp, tf.uint8) + + # Extrapolate: + # + # We need to clip and then cast. + return tf.cast(tf.clip_by_value(temp, 0.0, 255.0), tf.uint8) + + +def cutout(image: tf.Tensor, pad_size: int, replace: int = 0) -> tf.Tensor: + """Apply cutout (https://arxiv.org/abs/1708.04552) to image. + + This operation applies a (2*pad_size x 2*pad_size) mask of zeros to + a random location within `img`. The pixel values filled in will be of the + value `replace`. The located where the mask will be applied is randomly + chosen uniformly over the whole image. + + Args: + image: An image Tensor of type uint8. + pad_size: Specifies how big the zero mask that will be generated is that + is applied to the image. The mask will be of size + (2*pad_size x 2*pad_size). + replace: What pixel value to fill in the image in the area that has + the cutout mask applied to it. + + Returns: + An image Tensor that is of type uint8. + """ + image_height = tf.shape(image)[0] + image_width = tf.shape(image)[1] + + # Sample the center location in the image where the zero mask will be applied. + cutout_center_height = tf.random.uniform( + shape=[], minval=0, maxval=image_height, + dtype=tf.int32) + + cutout_center_width = tf.random.uniform( + shape=[], minval=0, maxval=image_width, + dtype=tf.int32) + + lower_pad = tf.maximum(0, cutout_center_height - pad_size) + upper_pad = tf.maximum(0, image_height - cutout_center_height - pad_size) + left_pad = tf.maximum(0, cutout_center_width - pad_size) + right_pad = tf.maximum(0, image_width - cutout_center_width - pad_size) + + cutout_shape = [image_height - (lower_pad + upper_pad), + image_width - (left_pad + right_pad)] + padding_dims = [[lower_pad, upper_pad], [left_pad, right_pad]] + mask = tf.pad( + tf.zeros(cutout_shape, dtype=image.dtype), + padding_dims, constant_values=1) + mask = tf.expand_dims(mask, -1) + mask = tf.tile(mask, [1, 1, 3]) + image = tf.where( + tf.equal(mask, 0), + tf.ones_like(image, dtype=image.dtype) * replace, + image) + return image + + +def solarize(image: tf.Tensor, threshold: int = 128) -> tf.Tensor: + # For each pixel in the image, select the pixel + # if the value is less than the threshold. + # Otherwise, subtract 255 from the pixel. + return tf.where(image < threshold, image, 255 - image) + + +def solarize_add(image: tf.Tensor, + addition: int = 0, + threshold: int = 128) -> tf.Tensor: + # For each pixel in the image less than threshold + # we add 'addition' amount to it and then clip the + # pixel value to be between 0 and 255. The value + # of 'addition' is between -128 and 128. + added_image = tf.cast(image, tf.int64) + addition + added_image = tf.cast(tf.clip_by_value(added_image, 0, 255), tf.uint8) + return tf.where(image < threshold, added_image, image) + + +def color(image: tf.Tensor, factor: float) -> tf.Tensor: + """Equivalent of PIL Color.""" + degenerate = tf.image.grayscale_to_rgb(tf.image.rgb_to_grayscale(image)) + return blend(degenerate, image, factor) + + +def contrast(image: tf.Tensor, factor: float) -> tf.Tensor: + """Equivalent of PIL Contrast.""" + degenerate = tf.image.rgb_to_grayscale(image) + # Cast before calling tf.histogram. + degenerate = tf.cast(degenerate, tf.int32) + + # Compute the grayscale histogram, then compute the mean pixel value, + # and create a constant image size of that value. Use that as the + # blending degenerate target of the original image. + hist = tf.histogram_fixed_width(degenerate, [0, 255], nbins=256) + mean = tf.reduce_sum(tf.cast(hist, tf.float32)) / 256.0 + degenerate = tf.ones_like(degenerate, dtype=tf.float32) * mean + degenerate = tf.clip_by_value(degenerate, 0.0, 255.0) + degenerate = tf.image.grayscale_to_rgb(tf.cast(degenerate, tf.uint8)) + return blend(degenerate, image, factor) + + +def brightness(image: tf.Tensor, factor: float) -> tf.Tensor: + """Equivalent of PIL Brightness.""" + degenerate = tf.zeros_like(image) + return blend(degenerate, image, factor) + + +def posterize(image: tf.Tensor, bits: int) -> tf.Tensor: + """Equivalent of PIL Posterize.""" + shift = 8 - bits + return tf.bitwise.left_shift(tf.bitwise.right_shift(image, shift), shift) + + +def wrapped_rotate(image: tf.Tensor, degrees: float, replace: int) -> tf.Tensor: + """Applies rotation with wrap/unwrap.""" + image = rotate(wrap(image), degrees=degrees) + return unwrap(image, replace) + + +def translate_x(image: tf.Tensor, pixels: int, replace: int) -> tf.Tensor: + """Equivalent of PIL Translate in X dimension.""" + image = translate(wrap(image), [-pixels, 0]) + return unwrap(image, replace) + + +def translate_y(image: tf.Tensor, pixels: int, replace: int) -> tf.Tensor: + """Equivalent of PIL Translate in Y dimension.""" + image = translate(wrap(image), [0, -pixels]) + return unwrap(image, replace) + + +def shear_x(image: tf.Tensor, level: float, replace: int) -> tf.Tensor: + """Equivalent of PIL Shearing in X dimension.""" + # Shear parallel to x axis is a projective transform + # with a matrix form of: + # [1 level + # 0 1]. + image = transform(image=wrap(image), + transforms=[1., level, 0., 0., 1., 0., 0., 0.]) + return unwrap(image, replace) + + +def shear_y(image: tf.Tensor, level: float, replace: int) -> tf.Tensor: + """Equivalent of PIL Shearing in Y dimension.""" + # Shear parallel to y axis is a projective transform + # with a matrix form of: + # [1 0 + # level 1]. + image = transform(image=wrap(image), + transforms=[1., 0., 0., level, 1., 0., 0., 0.]) + return unwrap(image, replace) + + +def autocontrast(image: tf.Tensor) -> tf.Tensor: + """Implements Autocontrast function from PIL using TF ops. + + Args: + image: A 3D uint8 tensor. + + Returns: + The image after it has had autocontrast applied to it and will be of type + uint8. + """ + + def scale_channel(image: tf.Tensor) -> tf.Tensor: + """Scale the 2D image using the autocontrast rule.""" + # A possibly cheaper version can be done using cumsum/unique_with_counts + # over the histogram values, rather than iterating over the entire image. + # to compute mins and maxes. + lo = tf.cast(tf.reduce_min(image), tf.float32) + hi = tf.cast(tf.reduce_max(image), tf.float32) + + # Scale the image, making the lowest value 0 and the highest value 255. + def scale_values(im): + scale = 255.0 / (hi - lo) + offset = -lo * scale + im = tf.cast(im, tf.float32) * scale + offset + im = tf.clip_by_value(im, 0.0, 255.0) + return tf.cast(im, tf.uint8) + + result = tf.cond(hi > lo, lambda: scale_values(image), lambda: image) + return result + + # Assumes RGB for now. Scales each channel independently + # and then stacks the result. + s1 = scale_channel(image[:, :, 0]) + s2 = scale_channel(image[:, :, 1]) + s3 = scale_channel(image[:, :, 2]) + image = tf.stack([s1, s2, s3], 2) + return image + + +def sharpness(image: tf.Tensor, factor: float) -> tf.Tensor: + """Implements Sharpness function from PIL using TF ops.""" + orig_image = image + image = tf.cast(image, tf.float32) + # Make image 4D for conv operation. + image = tf.expand_dims(image, 0) + # SMOOTH PIL Kernel. + kernel = tf.constant( + [[1, 1, 1], [1, 5, 1], [1, 1, 1]], dtype=tf.float32, + shape=[3, 3, 1, 1]) / 13. + # Tile across channel dimension. + kernel = tf.tile(kernel, [1, 1, 3, 1]) + strides = [1, 1, 1, 1] + degenerate = tf.nn.depthwise_conv2d( + image, kernel, strides, padding='VALID', dilations=[1, 1]) + degenerate = tf.clip_by_value(degenerate, 0.0, 255.0) + degenerate = tf.squeeze(tf.cast(degenerate, tf.uint8), [0]) + + # For the borders of the resulting image, fill in the values of the + # original image. + mask = tf.ones_like(degenerate) + padded_mask = tf.pad(mask, [[1, 1], [1, 1], [0, 0]]) + padded_degenerate = tf.pad(degenerate, [[1, 1], [1, 1], [0, 0]]) + result = tf.where(tf.equal(padded_mask, 1), padded_degenerate, orig_image) + + # Blend the final result. + return blend(result, orig_image, factor) + + +def equalize(image: tf.Tensor) -> tf.Tensor: + """Implements Equalize function from PIL using TF ops.""" + def scale_channel(im, c): + """Scale the data in the channel to implement equalize.""" + im = tf.cast(im[:, :, c], tf.int32) + # Compute the histogram of the image channel. + histo = tf.histogram_fixed_width(im, [0, 255], nbins=256) + + # For the purposes of computing the step, filter out the nonzeros. + nonzero = tf.where(tf.not_equal(histo, 0)) + nonzero_histo = tf.reshape(tf.gather(histo, nonzero), [-1]) + step = (tf.reduce_sum(nonzero_histo) - nonzero_histo[-1]) // 255 + + def build_lut(histo, step): + # Compute the cumulative sum, shifting by step // 2 + # and then normalization by step. + lut = (tf.cumsum(histo) + (step // 2)) // step + # Shift lut, prepending with 0. + lut = tf.concat([[0], lut[:-1]], 0) + # Clip the counts to be in range. This is done + # in the C code for image.point. + return tf.clip_by_value(lut, 0, 255) + + # If step is zero, return the original image. Otherwise, build + # lut from the full histogram and step and then index from it. + result = tf.cond(tf.equal(step, 0), + lambda: im, + lambda: tf.gather(build_lut(histo, step), im)) + + return tf.cast(result, tf.uint8) + + # Assumes RGB for now. Scales each channel independently + # and then stacks the result. + s1 = scale_channel(image, 0) + s2 = scale_channel(image, 1) + s3 = scale_channel(image, 2) + image = tf.stack([s1, s2, s3], 2) + return image + + +def invert(image: tf.Tensor) -> tf.Tensor: + """Inverts the image pixels.""" + image = tf.convert_to_tensor(image) + return 255 - image + + +def wrap(image: tf.Tensor) -> tf.Tensor: + """Returns 'image' with an extra channel set to all 1s.""" + shape = tf.shape(image) + extended_channel = tf.ones([shape[0], shape[1], 1], image.dtype) + extended = tf.concat([image, extended_channel], axis=2) + return extended + + +def unwrap(image: tf.Tensor, replace: int) -> tf.Tensor: + """Unwraps an image produced by wrap. + + Where there is a 0 in the last channel for every spatial position, + the rest of the three channels in that spatial dimension are grayed + (set to 128). Operations like translate and shear on a wrapped + Tensor will leave 0s in empty locations. Some transformations look + at the intensity of values to do preprocessing, and we want these + empty pixels to assume the 'average' value, rather than pure black. + + + Args: + image: A 3D Image Tensor with 4 channels. + replace: A one or three value 1D tensor to fill empty pixels. + + Returns: + image: A 3D image Tensor with 3 channels. + """ + image_shape = tf.shape(image) + # Flatten the spatial dimensions. + flattened_image = tf.reshape(image, [-1, image_shape[2]]) + + # Find all pixels where the last channel is zero. + alpha_channel = tf.expand_dims(flattened_image[:, 3], axis=-1) + + replace = tf.concat([replace, tf.ones([1], image.dtype)], 0) + + # Where they are zero, fill them in with 'replace'. + flattened_image = tf.where( + tf.equal(alpha_channel, 0), + tf.ones_like(flattened_image, dtype=image.dtype) * replace, + flattened_image) + + image = tf.reshape(flattened_image, image_shape) + image = tf.slice(image, [0, 0, 0], [image_shape[0], image_shape[1], 3]) + return image + + +def _randomly_negate_tensor(tensor): + """With 50% prob turn the tensor negative.""" + should_flip = tf.cast(tf.floor(tf.random.uniform([]) + 0.5), tf.bool) + final_tensor = tf.cond(should_flip, lambda: tensor, lambda: -tensor) + return final_tensor + + +def _rotate_level_to_arg(level: float): + level = (level/_MAX_LEVEL) * 30. + level = _randomly_negate_tensor(level) + return (level,) + + +def _shrink_level_to_arg(level: float): + """Converts level to ratio by which we shrink the image content.""" + if level == 0: + return (1.0,) # if level is zero, do not shrink the image + # Maximum shrinking ratio is 2.9. + level = 2. / (_MAX_LEVEL / level) + 0.9 + return (level,) + + +def _enhance_level_to_arg(level: float): + return ((level/_MAX_LEVEL) * 1.8 + 0.1,) + + +def _shear_level_to_arg(level: float): + level = (level/_MAX_LEVEL) * 0.3 + # Flip level to negative with 50% chance. + level = _randomly_negate_tensor(level) + return (level,) + + +def _translate_level_to_arg(level: float, translate_const: float): + level = (level/_MAX_LEVEL) * float(translate_const) + # Flip level to negative with 50% chance. + level = _randomly_negate_tensor(level) + return (level,) + + +def _mult_to_arg(level: float, multiplier: float = 1.): + return (int((level / _MAX_LEVEL) * multiplier),) + + +def _apply_func_with_prob(func: Any, + image: tf.Tensor, + args: Any, + prob: float): + """Apply `func` to image w/ `args` as input with probability `prob`.""" + assert isinstance(args, tuple) + + # Apply the function with probability `prob`. + should_apply_op = tf.cast( + tf.floor(tf.random.uniform([], dtype=tf.float32) + prob), tf.bool) + augmented_image = tf.cond( + should_apply_op, + lambda: func(image, *args), + lambda: image) + return augmented_image + + +def select_and_apply_random_policy(policies: Any, image: tf.Tensor): + """Select a random policy from `policies` and apply it to `image`.""" + policy_to_select = tf.random.uniform([], maxval=len(policies), dtype=tf.int32) + # Note that using tf.case instead of tf.conds would result in significantly + # larger graphs and would even break export for some larger policies. + for (i, policy) in enumerate(policies): + image = tf.cond( + tf.equal(i, policy_to_select), + lambda selected_policy=policy: selected_policy(image), + lambda: image) + return image + + +NAME_TO_FUNC = { + 'AutoContrast': autocontrast, + 'Equalize': equalize, + 'Invert': invert, + 'Rotate': wrapped_rotate, + 'Posterize': posterize, + 'Solarize': solarize, + 'SolarizeAdd': solarize_add, + 'Color': color, + 'Contrast': contrast, + 'Brightness': brightness, + 'Sharpness': sharpness, + 'ShearX': shear_x, + 'ShearY': shear_y, + 'TranslateX': translate_x, + 'TranslateY': translate_y, + 'Cutout': cutout, +} + +# Functions that have a 'replace' parameter +REPLACE_FUNCS = frozenset({ + 'Rotate', + 'TranslateX', + 'ShearX', + 'ShearY', + 'TranslateY', + 'Cutout', +}) + + +def level_to_arg(cutout_const: float, translate_const: float): + """Creates a dict mapping image operation names to their arguments.""" + + no_arg = lambda level: () + posterize_arg = lambda level: _mult_to_arg(level, 4) + solarize_arg = lambda level: _mult_to_arg(level, 256) + solarize_add_arg = lambda level: _mult_to_arg(level, 110) + cutout_arg = lambda level: _mult_to_arg(level, cutout_const) + translate_arg = lambda level: _translate_level_to_arg(level, translate_const) + + args = { + 'AutoContrast': no_arg, + 'Equalize': no_arg, + 'Invert': no_arg, + 'Rotate': _rotate_level_to_arg, + 'Posterize': posterize_arg, + 'Solarize': solarize_arg, + 'SolarizeAdd': solarize_add_arg, + 'Color': _enhance_level_to_arg, + 'Contrast': _enhance_level_to_arg, + 'Brightness': _enhance_level_to_arg, + 'Sharpness': _enhance_level_to_arg, + 'ShearX': _shear_level_to_arg, + 'ShearY': _shear_level_to_arg, + 'Cutout': cutout_arg, + 'TranslateX': translate_arg, + 'TranslateY': translate_arg, + } + return args + + +def _parse_policy_info(name: Text, + prob: float, + level: float, + replace_value: List[int], + cutout_const: float, + translate_const: float) -> Tuple[Any, float, Any]: + """Return the function that corresponds to `name` and update `level` param.""" + func = NAME_TO_FUNC[name] + args = level_to_arg(cutout_const, translate_const)[name](level) + + if name in REPLACE_FUNCS: + # Add in replace arg if it is required for the function that is called. + args = tuple(list(args) + [replace_value]) + + return func, prob, args + + +class ImageAugment(object): + """Image augmentation class for applying image distortions.""" + + def distort(self, image: tf.Tensor) -> tf.Tensor: + """Given an image tensor, returns a distorted image with the same shape. + + Args: + image: `Tensor` of shape [height, width, 3] representing an image. + + Returns: + The augmented version of `image`. + """ + raise NotImplementedError() + + +class AutoAugment(ImageAugment): + """Applies the AutoAugment policy to images. + + AutoAugment is from the paper: https://arxiv.org/abs/1805.09501. + """ + + def __init__(self, + augmentation_name: Text = 'v0', + policies: Optional[Dict[Text, Any]] = None, + cutout_const: float = 100, + translate_const: float = 250): + """Applies the AutoAugment policy to images. + + Args: + augmentation_name: The name of the AutoAugment policy to use. The + available options are `v0` and `test`. `v0` is the policy used for all + of the results in the paper and was found to achieve the best results on + the COCO dataset. `v1`, `v2` and `v3` are additional good policies found + on the COCO dataset that have slight variation in what operations were + used during the search procedure along with how many operations are + applied in parallel to a single image (2 vs 3). + policies: list of lists of tuples in the form `(func, prob, level)`, + `func` is a string name of the augmentation function, `prob` is the + probability of applying the `func` operation, `level` is the input + argument for `func`. + cutout_const: multiplier for applying cutout. + translate_const: multiplier for applying translation. + """ + super(AutoAugment, self).__init__() + + if policies is None: + self.available_policies = { + 'v0': self.policy_v0(), + 'test': self.policy_test(), + 'simple': self.policy_simple(), + } + + if augmentation_name not in self.available_policies: + raise ValueError( + 'Invalid augmentation_name: {}'.format(augmentation_name)) + + self.augmentation_name = augmentation_name + self.policies = self.available_policies[augmentation_name] + self.cutout_const = float(cutout_const) + self.translate_const = float(translate_const) + + def distort(self, image: tf.Tensor) -> tf.Tensor: + """Applies the AutoAugment policy to `image`. + + AutoAugment is from the paper: https://arxiv.org/abs/1805.09501. + + Args: + image: `Tensor` of shape [height, width, 3] representing an image. + + Returns: + A version of image that now has data augmentation applied to it based on + the `policies` pass into the function. + """ + input_image_type = image.dtype + + if input_image_type != tf.uint8: + image = tf.clip_by_value(image, 0.0, 255.0) + image = tf.cast(image, dtype=tf.uint8) + + replace_value = [128] * 3 + + # func is the string name of the augmentation function, prob is the + # probability of applying the operation and level is the parameter + # associated with the tf op. + + # tf_policies are functions that take in an image and return an augmented + # image. + tf_policies = [] + for policy in self.policies: + tf_policy = [] + # Link string name to the correct python function and make sure the + # correct argument is passed into that function. + for policy_info in policy: + policy_info = list(policy_info) + [ + replace_value, self.cutout_const, self.translate_const + ] + tf_policy.append(_parse_policy_info(*policy_info)) + # Now build the tf policy that will apply the augmentation procedue + # on image. + def make_final_policy(tf_policy_): + + def final_policy(image_): + for func, prob, args in tf_policy_: + image_ = _apply_func_with_prob(func, image_, args, prob) + return image_ + + return final_policy + + tf_policies.append(make_final_policy(tf_policy)) + + image = select_and_apply_random_policy(tf_policies, image) + image = tf.cast(image, dtype=input_image_type) + return image + + @staticmethod + def policy_v0(): + """Autoaugment policy that was used in AutoAugment Paper. + + Each tuple is an augmentation operation of the form + (operation, probability, magnitude). Each element in policy is a + sub-policy that will be applied sequentially on the image. + + Returns: + the policy. + """ + + # TODO(dankondratyuk): tensorflow_addons defines custom ops, which + # for some reason are not included when building/linking + # This results in the error, "Op type not registered + # 'Addons>ImageProjectiveTransformV2' in binary" when running on borg TPUs + policy = [ + [('Equalize', 0.8, 1), ('ShearY', 0.8, 4)], + [('Color', 0.4, 9), ('Equalize', 0.6, 3)], + [('Color', 0.4, 1), ('Rotate', 0.6, 8)], + [('Solarize', 0.8, 3), ('Equalize', 0.4, 7)], + [('Solarize', 0.4, 2), ('Solarize', 0.6, 2)], + [('Color', 0.2, 0), ('Equalize', 0.8, 8)], + [('Equalize', 0.4, 8), ('SolarizeAdd', 0.8, 3)], + [('ShearX', 0.2, 9), ('Rotate', 0.6, 8)], + [('Color', 0.6, 1), ('Equalize', 1.0, 2)], + [('Invert', 0.4, 9), ('Rotate', 0.6, 0)], + [('Equalize', 1.0, 9), ('ShearY', 0.6, 3)], + [('Color', 0.4, 7), ('Equalize', 0.6, 0)], + [('Posterize', 0.4, 6), ('AutoContrast', 0.4, 7)], + [('Solarize', 0.6, 8), ('Color', 0.6, 9)], + [('Solarize', 0.2, 4), ('Rotate', 0.8, 9)], + [('Rotate', 1.0, 7), ('TranslateY', 0.8, 9)], + [('ShearX', 0.0, 0), ('Solarize', 0.8, 4)], + [('ShearY', 0.8, 0), ('Color', 0.6, 4)], + [('Color', 1.0, 0), ('Rotate', 0.6, 2)], + [('Equalize', 0.8, 4), ('Equalize', 0.0, 8)], + [('Equalize', 1.0, 4), ('AutoContrast', 0.6, 2)], + [('ShearY', 0.4, 7), ('SolarizeAdd', 0.6, 7)], + [('Posterize', 0.8, 2), ('Solarize', 0.6, 10)], + [('Solarize', 0.6, 8), ('Equalize', 0.6, 1)], + [('Color', 0.8, 6), ('Rotate', 0.4, 5)], + ] + return policy + + @staticmethod + def policy_simple(): + """Same as `policy_v0`, except with custom ops removed.""" + + policy = [ + [('Color', 0.4, 9), ('Equalize', 0.6, 3)], + [('Solarize', 0.8, 3), ('Equalize', 0.4, 7)], + [('Solarize', 0.4, 2), ('Solarize', 0.6, 2)], + [('Color', 0.2, 0), ('Equalize', 0.8, 8)], + [('Equalize', 0.4, 8), ('SolarizeAdd', 0.8, 3)], + [('Color', 0.6, 1), ('Equalize', 1.0, 2)], + [('Color', 0.4, 7), ('Equalize', 0.6, 0)], + [('Posterize', 0.4, 6), ('AutoContrast', 0.4, 7)], + [('Solarize', 0.6, 8), ('Color', 0.6, 9)], + [('Equalize', 0.8, 4), ('Equalize', 0.0, 8)], + [('Equalize', 1.0, 4), ('AutoContrast', 0.6, 2)], + [('Posterize', 0.8, 2), ('Solarize', 0.6, 10)], + [('Solarize', 0.6, 8), ('Equalize', 0.6, 1)], + ] + return policy + + @staticmethod + def policy_test(): + """Autoaugment test policy for debugging.""" + policy = [ + [('TranslateX', 1.0, 4), ('Equalize', 1.0, 10)], + ] + return policy + + +class RandAugment(ImageAugment): + """Applies the RandAugment policy to images. + + RandAugment is from the paper https://arxiv.org/abs/1909.13719, + """ + + def __init__(self, + num_layers: int = 2, + magnitude: float = 10., + cutout_const: float = 40., + translate_const: float = 100.): + """Applies the RandAugment policy to images. + + Args: + num_layers: Integer, the number of augmentation transformations to apply + sequentially to an image. Represented as (N) in the paper. Usually best + values will be in the range [1, 3]. + magnitude: Integer, shared magnitude across all augmentation operations. + Represented as (M) in the paper. Usually best values are in the range + [5, 10]. + cutout_const: multiplier for applying cutout. + translate_const: multiplier for applying translation. + """ + super(RandAugment, self).__init__() + + self.num_layers = num_layers + self.magnitude = float(magnitude) + self.cutout_const = float(cutout_const) + self.translate_const = float(translate_const) + self.available_ops = [ + 'AutoContrast', 'Equalize', 'Invert', 'Rotate', 'Posterize', 'Solarize', + 'Color', 'Contrast', 'Brightness', 'Sharpness', 'ShearX', 'ShearY', + 'TranslateX', 'TranslateY', 'Cutout', 'SolarizeAdd' + ] + + def distort(self, image: tf.Tensor) -> tf.Tensor: + """Applies the RandAugment policy to `image`. + + Args: + image: `Tensor` of shape [height, width, 3] representing an image. + + Returns: + The augmented version of `image`. + """ + input_image_type = image.dtype + + if input_image_type != tf.uint8: + image = tf.clip_by_value(image, 0.0, 255.0) + image = tf.cast(image, dtype=tf.uint8) + + replace_value = [128] * 3 + min_prob, max_prob = 0.2, 0.8 + + for _ in range(self.num_layers): + op_to_select = tf.random.uniform( + [], maxval=len(self.available_ops) + 1, dtype=tf.int32) + + branch_fns = [] + for (i, op_name) in enumerate(self.available_ops): + prob = tf.random.uniform([], + minval=min_prob, + maxval=max_prob, + dtype=tf.float32) + func, _, args = _parse_policy_info(op_name, + prob, + self.magnitude, + replace_value, + self.cutout_const, + self.translate_const) + branch_fns.append(( + i, + # pylint:disable=g-long-lambda + lambda selected_func=func, selected_args=args: selected_func( + image, *selected_args))) + # pylint:enable=g-long-lambda + + image = tf.switch_case(branch_index=op_to_select, + branch_fns=branch_fns, + default=lambda: tf.identity(image)) + + image = tf.cast(image, dtype=input_image_type) + return image diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment_test.py new file mode 100644 index 0000000..76bdb2b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/augment_test.py @@ -0,0 +1,143 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for autoaugment.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl.testing import parameterized + +import tensorflow as tf + +from official.vision.image_classification import augment + + +def get_dtype_test_cases(): + return [ + ('uint8', tf.uint8), + ('int32', tf.int32), + ('float16', tf.float16), + ('float32', tf.float32), + ] + + +@parameterized.named_parameters(get_dtype_test_cases()) +class TransformsTest(parameterized.TestCase, tf.test.TestCase): + """Basic tests for fundamental transformations.""" + + def test_to_from_4d(self, dtype): + for shape in [(10, 10), (10, 10, 10), (10, 10, 10, 10)]: + original_ndims = len(shape) + image = tf.zeros(shape, dtype=dtype) + image_4d = augment.to_4d(image) + self.assertEqual(4, tf.rank(image_4d)) + self.assertAllEqual(image, augment.from_4d(image_4d, original_ndims)) + + def test_transform(self, dtype): + image = tf.constant([[1, 2], [3, 4]], dtype=dtype) + self.assertAllEqual(augment.transform(image, transforms=[1]*8), + [[4, 4], [4, 4]]) + + def test_translate(self, dtype): + image = tf.constant( + [[1, 0, 1, 0], + [0, 1, 0, 1], + [1, 0, 1, 0], + [0, 1, 0, 1]], + dtype=dtype) + translations = [-1, -1] + translated = augment.translate(image=image, + translations=translations) + expected = [ + [1, 0, 1, 1], + [0, 1, 0, 0], + [1, 0, 1, 1], + [1, 0, 1, 1]] + self.assertAllEqual(translated, expected) + + def test_translate_shapes(self, dtype): + translation = [0, 0] + for shape in [(3, 3), (5, 5), (224, 224, 3)]: + image = tf.zeros(shape, dtype=dtype) + self.assertAllEqual(image, augment.translate(image, translation)) + + def test_translate_invalid_translation(self, dtype): + image = tf.zeros((1, 1), dtype=dtype) + invalid_translation = [[[1, 1]]] + with self.assertRaisesRegex(TypeError, 'rank 1 or 2'): + _ = augment.translate(image, invalid_translation) + + def test_rotate(self, dtype): + image = tf.reshape(tf.cast(tf.range(9), dtype), (3, 3)) + rotation = 90. + transformed = augment.rotate(image=image, degrees=rotation) + expected = [[2, 5, 8], + [1, 4, 7], + [0, 3, 6]] + self.assertAllEqual(transformed, expected) + + def test_rotate_shapes(self, dtype): + degrees = 0. + for shape in [(3, 3), (5, 5), (224, 224, 3)]: + image = tf.zeros(shape, dtype=dtype) + self.assertAllEqual(image, augment.rotate(image, degrees)) + + +class AutoaugmentTest(tf.test.TestCase): + + def test_autoaugment(self): + """Smoke test to be sure there are no syntax errors.""" + image = tf.zeros((224, 224, 3), dtype=tf.uint8) + + augmenter = augment.AutoAugment() + aug_image = augmenter.distort(image) + + self.assertEqual((224, 224, 3), aug_image.shape) + + def test_randaug(self): + """Smoke test to be sure there are no syntax errors.""" + image = tf.zeros((224, 224, 3), dtype=tf.uint8) + + augmenter = augment.RandAugment() + aug_image = augmenter.distort(image) + + self.assertEqual((224, 224, 3), aug_image.shape) + + def test_all_policy_ops(self): + """Smoke test to be sure all augmentation functions can execute.""" + + prob = 1 + magnitude = 10 + replace_value = [128] * 3 + cutout_const = 100 + translate_const = 250 + + image = tf.ones((224, 224, 3), dtype=tf.uint8) + + for op_name in augment.NAME_TO_FUNC: + func, _, args = augment._parse_policy_info(op_name, + prob, + magnitude, + replace_value, + cutout_const, + translate_const) + image = func(image, *args) + + self.assertEqual((224, 224, 3), image.shape) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/callbacks.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/callbacks.py new file mode 100644 index 0000000..985d0c6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/callbacks.py @@ -0,0 +1,258 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common modules for callbacks.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os +from typing import Any, List, MutableMapping, Text +from absl import logging +import tensorflow as tf + +from official.utils.misc import keras_utils +from official.vision.image_classification import optimizer_factory + + +def get_callbacks(model_checkpoint: bool = True, + include_tensorboard: bool = True, + time_history: bool = True, + track_lr: bool = True, + write_model_weights: bool = True, + apply_moving_average: bool = False, + initial_step: int = 0, + batch_size: int = 0, + log_steps: int = 0, + model_dir: str = None) -> List[tf.keras.callbacks.Callback]: + """Get all callbacks.""" + model_dir = model_dir or '' + callbacks = [] + if model_checkpoint: + ckpt_full_path = os.path.join(model_dir, 'model.ckpt-{epoch:04d}') + callbacks.append(tf.keras.callbacks.ModelCheckpoint( + ckpt_full_path, save_weights_only=True, verbose=1)) + if include_tensorboard: + callbacks.append( + CustomTensorBoard( + log_dir=model_dir, + track_lr=track_lr, + initial_step=initial_step, + write_images=write_model_weights)) + if time_history: + callbacks.append( + keras_utils.TimeHistory( + batch_size, + log_steps, + logdir=model_dir if include_tensorboard else None)) + if apply_moving_average: + # Save moving average model to a different file so that + # we can resume training from a checkpoint + ckpt_full_path = os.path.join( + model_dir, 'average', 'model.ckpt-{epoch:04d}') + callbacks.append(AverageModelCheckpoint( + update_weights=False, + filepath=ckpt_full_path, + save_weights_only=True, + verbose=1)) + callbacks.append(MovingAverageCallback()) + return callbacks + + +def get_scalar_from_tensor(t: tf.Tensor) -> int: + """Utility function to convert a Tensor to a scalar.""" + t = tf.keras.backend.get_value(t) + if callable(t): + return t() + else: + return t + + +class CustomTensorBoard(tf.keras.callbacks.TensorBoard): + """A customized TensorBoard callback that tracks additional datapoints. + + Metrics tracked: + - Global learning rate + + Attributes: + log_dir: the path of the directory where to save the log files to be parsed + by TensorBoard. + track_lr: `bool`, whether or not to track the global learning rate. + initial_step: the initial step, used for preemption recovery. + **kwargs: Additional arguments for backwards compatibility. Possible key is + `period`. + """ + + # TODO(b/146499062): track params, flops, log lr, l2 loss, + # classification loss + + def __init__(self, + log_dir: str, + track_lr: bool = False, + initial_step: int = 0, + **kwargs): + super(CustomTensorBoard, self).__init__(log_dir=log_dir, **kwargs) + self.step = initial_step + self._track_lr = track_lr + + def on_batch_begin(self, + epoch: int, + logs: MutableMapping[str, Any] = None) -> None: + self.step += 1 + if logs is None: + logs = {} + logs.update(self._calculate_metrics()) + super(CustomTensorBoard, self).on_batch_begin(epoch, logs) + + def on_epoch_begin(self, + epoch: int, + logs: MutableMapping[str, Any] = None) -> None: + if logs is None: + logs = {} + metrics = self._calculate_metrics() + logs.update(metrics) + for k, v in metrics.items(): + logging.info('Current %s: %f', k, v) + super(CustomTensorBoard, self).on_epoch_begin(epoch, logs) + + def on_epoch_end(self, + epoch: int, + logs: MutableMapping[str, Any] = None) -> None: + if logs is None: + logs = {} + metrics = self._calculate_metrics() + logs.update(metrics) + super(CustomTensorBoard, self).on_epoch_end(epoch, logs) + + def _calculate_metrics(self) -> MutableMapping[str, Any]: + logs = {} + # TODO(b/149030439): disable LR reporting. + # if self._track_lr: + # logs['learning_rate'] = self._calculate_lr() + return logs + + def _calculate_lr(self) -> int: + """Calculates the learning rate given the current step.""" + return get_scalar_from_tensor( + self._get_base_optimizer()._decayed_lr(var_dtype=tf.float32)) # pylint:disable=protected-access + + def _get_base_optimizer(self) -> tf.keras.optimizers.Optimizer: + """Get the base optimizer used by the current model.""" + + optimizer = self.model.optimizer + + # The optimizer might be wrapped by another class, so unwrap it + while hasattr(optimizer, '_optimizer'): + optimizer = optimizer._optimizer # pylint:disable=protected-access + + return optimizer + + +class MovingAverageCallback(tf.keras.callbacks.Callback): + """A Callback to be used with a `MovingAverage` optimizer. + + Applies moving average weights to the model during validation time to test + and predict on the averaged weights rather than the current model weights. + Once training is complete, the model weights will be overwritten with the + averaged weights (by default). + + Attributes: + overwrite_weights_on_train_end: Whether to overwrite the current model + weights with the averaged weights from the moving average optimizer. + **kwargs: Any additional callback arguments. + """ + + def __init__(self, + overwrite_weights_on_train_end: bool = False, + **kwargs): + super(MovingAverageCallback, self).__init__(**kwargs) + self.overwrite_weights_on_train_end = overwrite_weights_on_train_end + + def set_model(self, model: tf.keras.Model): + super(MovingAverageCallback, self).set_model(model) + assert isinstance(self.model.optimizer, + optimizer_factory.MovingAverage) + self.model.optimizer.shadow_copy(self.model) + + def on_test_begin(self, logs: MutableMapping[Text, Any] = None): + self.model.optimizer.swap_weights() + + def on_test_end(self, logs: MutableMapping[Text, Any] = None): + self.model.optimizer.swap_weights() + + def on_train_end(self, logs: MutableMapping[Text, Any] = None): + if self.overwrite_weights_on_train_end: + self.model.optimizer.assign_average_vars(self.model.variables) + + +class AverageModelCheckpoint(tf.keras.callbacks.ModelCheckpoint): + """Saves and, optionally, assigns the averaged weights. + + Taken from tfa.callbacks.AverageModelCheckpoint. + + Attributes: + update_weights: If True, assign the moving average weights + to the model, and save them. If False, keep the old + non-averaged weights, but the saved model uses the + average weights. + See `tf.keras.callbacks.ModelCheckpoint` for the other args. + """ + + def __init__( + self, + update_weights: bool, + filepath: str, + monitor: str = 'val_loss', + verbose: int = 0, + save_best_only: bool = False, + save_weights_only: bool = False, + mode: str = 'auto', + save_freq: str = 'epoch', + **kwargs): + self.update_weights = update_weights + super().__init__( + filepath, + monitor, + verbose, + save_best_only, + save_weights_only, + mode, + save_freq, + **kwargs) + + def set_model(self, model): + if not isinstance(model.optimizer, optimizer_factory.MovingAverage): + raise TypeError( + 'AverageModelCheckpoint is only used when training' + 'with MovingAverage') + return super().set_model(model) + + def _save_model(self, epoch, logs): + assert isinstance(self.model.optimizer, optimizer_factory.MovingAverage) + + if self.update_weights: + self.model.optimizer.assign_average_vars(self.model.variables) + return super()._save_model(epoch, logs) + else: + # Note: `model.get_weights()` gives us the weights (non-ref) + # whereas `model.variables` returns references to the variables. + non_avg_weights = self.model.get_weights() + self.model.optimizer.assign_average_vars(self.model.variables) + # result is currently None, since `super._save_model` doesn't + # return anything, but this may change in the future. + result = super()._save_model(epoch, logs) + self.model.set_weights(non_avg_weights) + return result diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer.py new file mode 100644 index 0000000..c3805a7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer.py @@ -0,0 +1,458 @@ +# Lint as: python3 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs an Image Classification model.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +import pprint +from typing import Any, Tuple, Text, Optional, Mapping + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.modeling import performance +from official.modeling.hyperparams import params_dict +from official.utils import hyperparams_flags +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.vision.image_classification import callbacks as custom_callbacks +from official.vision.image_classification import dataset_factory +from official.vision.image_classification import optimizer_factory +from official.vision.image_classification.configs import base_configs +from official.vision.image_classification.configs import configs +from official.vision.image_classification.efficientnet import efficientnet_model +from official.vision.image_classification.resnet import common +from official.vision.image_classification.resnet import resnet_model + + +def get_models() -> Mapping[str, tf.keras.Model]: + """Returns the mapping from model type name to Keras model.""" + return { + 'efficientnet': efficientnet_model.EfficientNet.from_name, + 'resnet': resnet_model.resnet50, + } + + +def get_dtype_map() -> Mapping[str, tf.dtypes.DType]: + """Returns the mapping from dtype string representations to TF dtypes.""" + return { + 'float32': tf.float32, + 'bfloat16': tf.bfloat16, + 'float16': tf.float16, + 'fp32': tf.float32, + 'bf16': tf.bfloat16, + } + + +def _get_metrics(one_hot: bool) -> Mapping[Text, Any]: + """Get a dict of available metrics to track.""" + if one_hot: + return { + # (name, metric_fn) + 'acc': tf.keras.metrics.CategoricalAccuracy(name='accuracy'), + 'accuracy': tf.keras.metrics.CategoricalAccuracy(name='accuracy'), + 'top_1': tf.keras.metrics.CategoricalAccuracy(name='accuracy'), + 'top_5': tf.keras.metrics.TopKCategoricalAccuracy( + k=5, + name='top_5_accuracy'), + } + else: + return { + # (name, metric_fn) + 'acc': tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'), + 'accuracy': tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'), + 'top_1': tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'), + 'top_5': tf.keras.metrics.SparseTopKCategoricalAccuracy( + k=5, + name='top_5_accuracy'), + } + + +def get_image_size_from_model( + params: base_configs.ExperimentConfig) -> Optional[int]: + """If the given model has a preferred image size, return it.""" + if params.model_name == 'efficientnet': + efficientnet_name = params.model.model_params.model_name + if efficientnet_name in efficientnet_model.MODEL_CONFIGS: + return efficientnet_model.MODEL_CONFIGS[efficientnet_name].resolution + return None + + +def _get_dataset_builders(params: base_configs.ExperimentConfig, + strategy: tf.distribute.Strategy, + one_hot: bool + ) -> Tuple[Any, Any, Any]: + """Create and return train, validation, and test dataset builders.""" + if one_hot: + logging.warning('label_smoothing > 0, so datasets will be one hot encoded.') + else: + logging.warning('label_smoothing not applied, so datasets will not be one ' + 'hot encoded.') + + num_devices = strategy.num_replicas_in_sync if strategy else 1 + + image_size = get_image_size_from_model(params) + + dataset_configs = [ + params.train_dataset, params.validation_dataset + ] + builders = [] + + for config in dataset_configs: + if config is not None and config.has_data: + builder = dataset_factory.DatasetBuilder( + config, + image_size=image_size or config.image_size, + num_devices=num_devices, + one_hot=one_hot) + else: + builder = None + builders.append(builder) + + return builders + + +def get_loss_scale(params: base_configs.ExperimentConfig, + fp16_default: float = 128.) -> float: + """Returns the loss scale for initializations.""" + loss_scale = params.runtime.loss_scale + if loss_scale == 'dynamic': + return loss_scale + elif loss_scale is not None: + return float(loss_scale) + elif (params.train_dataset.dtype == 'float32' or + params.train_dataset.dtype == 'bfloat16'): + return 1. + else: + assert params.train_dataset.dtype == 'float16' + return fp16_default + + +def _get_params_from_flags(flags_obj: flags.FlagValues): + """Get ParamsDict from flags.""" + model = flags_obj.model_type.lower() + dataset = flags_obj.dataset.lower() + params = configs.get_config(model=model, dataset=dataset) + + flags_overrides = { + 'model_dir': flags_obj.model_dir, + 'mode': flags_obj.mode, + 'model': { + 'name': model, + }, + 'runtime': { + 'run_eagerly': flags_obj.run_eagerly, + 'tpu': flags_obj.tpu, + }, + 'train_dataset': { + 'data_dir': flags_obj.data_dir, + }, + 'validation_dataset': { + 'data_dir': flags_obj.data_dir, + }, + 'train': { + 'time_history': { + 'log_steps': flags_obj.log_steps, + }, + }, + } + + overriding_configs = (flags_obj.config_file, + flags_obj.params_override, + flags_overrides) + + pp = pprint.PrettyPrinter() + + logging.info('Base params: %s', pp.pformat(params.as_dict())) + + for param in overriding_configs: + logging.info('Overriding params: %s', param) + # Set is_strict to false because we can have dynamic dict parameters. + params = params_dict.override_params_dict(params, param, is_strict=False) + + params.validate() + params.lock() + + logging.info('Final model parameters: %s', pp.pformat(params.as_dict())) + return params + + +def resume_from_checkpoint(model: tf.keras.Model, + model_dir: str, + train_steps: int) -> int: + """Resumes from the latest checkpoint, if possible. + + Loads the model weights and optimizer settings from a checkpoint. + This function should be used in case of preemption recovery. + + Args: + model: The model whose weights should be restored. + model_dir: The directory where model weights were saved. + train_steps: The number of steps to train. + + Returns: + The epoch of the latest checkpoint, or 0 if not restoring. + + """ + logging.info('Load from checkpoint is enabled.') + latest_checkpoint = tf.train.latest_checkpoint(model_dir) + logging.info('latest_checkpoint: %s', latest_checkpoint) + if not latest_checkpoint: + logging.info('No checkpoint detected.') + return 0 + + logging.info('Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint) + model.load_weights(latest_checkpoint) + initial_epoch = model.optimizer.iterations // train_steps + logging.info('Completed loading from checkpoint.') + logging.info('Resuming from epoch %d', initial_epoch) + return int(initial_epoch) + + +def initialize(params: base_configs.ExperimentConfig, + dataset_builder: dataset_factory.DatasetBuilder): + """Initializes backend related initializations.""" + keras_utils.set_session_config( + enable_xla=params.runtime.enable_xla) + if params.runtime.gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=params.runtime.per_gpu_thread_count, + gpu_thread_mode=params.runtime.gpu_thread_mode, + num_gpus=params.runtime.num_gpus, + datasets_num_private_threads=params.runtime.dataset_num_private_threads) + + performance.set_mixed_precision_policy(dataset_builder.dtype, + get_loss_scale(params)) + if tf.config.list_physical_devices('GPU'): + data_format = 'channels_first' + else: + data_format = 'channels_last' + tf.keras.backend.set_image_data_format(data_format) + distribution_utils.configure_cluster( + params.runtime.worker_hosts, + params.runtime.task_index) + if params.runtime.run_eagerly: + # Enable eager execution to allow step-by-step debugging + tf.config.experimental_run_functions_eagerly(True) + + +def define_classifier_flags(): + """Defines common flags for image classification.""" + hyperparams_flags.initialize_common_flags() + flags.DEFINE_string( + 'data_dir', + default=None, + help='The location of the input data.') + flags.DEFINE_string( + 'mode', + default=None, + help='Mode to run: `train`, `eval`, `train_and_eval` or `export`.') + flags.DEFINE_bool( + 'run_eagerly', + default=None, + help='Use eager execution and disable autograph for debugging.') + flags.DEFINE_string( + 'model_type', + default=None, + help='The type of the model, e.g. EfficientNet, etc.') + flags.DEFINE_string( + 'dataset', + default=None, + help='The name of the dataset, e.g. ImageNet, etc.') + flags.DEFINE_integer( + 'log_steps', + default=100, + help='The interval of steps between logging of batch level stats.') + + +def serialize_config(params: base_configs.ExperimentConfig, + model_dir: str): + """Serializes and saves the experiment config.""" + params_save_path = os.path.join(model_dir, 'params.yaml') + logging.info('Saving experiment configuration to %s', params_save_path) + tf.io.gfile.makedirs(model_dir) + params_dict.save_params_dict_to_yaml(params, params_save_path) + + +def train_and_eval( + params: base_configs.ExperimentConfig, + strategy_override: tf.distribute.Strategy) -> Mapping[str, Any]: + """Runs the train and eval path using compile/fit.""" + logging.info('Running train and eval.') + + # Note: for TPUs, strategy and scope should be created before the dataset + strategy = strategy_override or distribution_utils.get_distribution_strategy( + distribution_strategy=params.runtime.distribution_strategy, + all_reduce_alg=params.runtime.all_reduce_alg, + num_gpus=params.runtime.num_gpus, + tpu_address=params.runtime.tpu) + + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + logging.info('Detected %d devices.', + strategy.num_replicas_in_sync if strategy else 1) + + label_smoothing = params.model.loss.label_smoothing + one_hot = label_smoothing and label_smoothing > 0 + + builders = _get_dataset_builders(params, strategy, one_hot) + datasets = [builder.build() if builder else None for builder in builders] + + # Unpack datasets and builders based on train/val/test splits + train_builder, validation_builder = builders # pylint: disable=unbalanced-tuple-unpacking + train_dataset, validation_dataset = datasets + + train_epochs = params.train.epochs + train_steps = params.train.steps or train_builder.num_steps + validation_steps = params.evaluation.steps or validation_builder.num_steps + + initialize(params, train_builder) + + logging.info('Global batch size: %d', train_builder.global_batch_size) + + with strategy_scope: + model_params = params.model.model_params.as_dict() + model = get_models()[params.model.name](**model_params) + learning_rate = optimizer_factory.build_learning_rate( + params=params.model.learning_rate, + batch_size=train_builder.global_batch_size, + train_steps=train_steps) + optimizer = optimizer_factory.build_optimizer( + optimizer_name=params.model.optimizer.name, + base_learning_rate=learning_rate, + params=params.model.optimizer.as_dict()) + + metrics_map = _get_metrics(one_hot) + metrics = [metrics_map[metric] for metric in params.train.metrics] + + if one_hot: + loss_obj = tf.keras.losses.CategoricalCrossentropy( + label_smoothing=params.model.loss.label_smoothing) + else: + loss_obj = tf.keras.losses.SparseCategoricalCrossentropy() + model.compile(optimizer=optimizer, + loss=loss_obj, + metrics=metrics) + + initial_epoch = 0 + if params.train.resume_checkpoint: + initial_epoch = resume_from_checkpoint(model=model, + model_dir=params.model_dir, + train_steps=train_steps) + + callbacks = custom_callbacks.get_callbacks( + model_checkpoint=params.train.callbacks.enable_checkpoint_and_export, + include_tensorboard=params.train.callbacks.enable_tensorboard, + time_history=params.train.callbacks.enable_time_history, + track_lr=params.train.tensorboard.track_lr, + write_model_weights=params.train.tensorboard.write_model_weights, + initial_step=initial_epoch * train_steps, + batch_size=train_builder.global_batch_size, + log_steps=params.train.time_history.log_steps, + model_dir=params.model_dir) + + serialize_config(params=params, model_dir=params.model_dir) + + if params.evaluation.skip_eval: + validation_kwargs = {} + else: + validation_kwargs = { + 'validation_data': validation_dataset, + 'validation_steps': validation_steps, + 'validation_freq': params.evaluation.epochs_between_evals, + } + + history = model.fit( + train_dataset, + epochs=train_epochs, + steps_per_epoch=train_steps, + initial_epoch=initial_epoch, + callbacks=callbacks, + **validation_kwargs, + experimental_steps_per_execution=params.train.steps_per_loop, + verbose=2) + + validation_output = None + if not params.evaluation.skip_eval: + validation_output = model.evaluate( + validation_dataset, steps=validation_steps, verbose=2) + + # TODO(dankondratyuk): eval and save final test accuracy + stats = common.build_stats(history, + validation_output, + callbacks) + return stats + + +def export(params: base_configs.ExperimentConfig): + """Runs the model export functionality.""" + logging.info('Exporting model.') + model_params = params.model.model_params.as_dict() + model = get_models()[params.model.name](**model_params) + checkpoint = params.export.checkpoint + if checkpoint is None: + logging.info('No export checkpoint was provided. Using the latest ' + 'checkpoint from model_dir.') + checkpoint = tf.train.latest_checkpoint(params.model_dir) + + model.load_weights(checkpoint) + model.save(params.export.destination) + + +def run(flags_obj: flags.FlagValues, + strategy_override: tf.distribute.Strategy = None) -> Mapping[str, Any]: + """Runs Image Classification model using native Keras APIs. + + Args: + flags_obj: An object containing parsed flag values. + strategy_override: A `tf.distribute.Strategy` object to use for model. + + Returns: + Dictionary of training/eval stats + """ + params = _get_params_from_flags(flags_obj) + if params.mode == 'train_and_eval': + return train_and_eval(params, strategy_override) + elif params.mode == 'export_only': + export(params) + else: + raise ValueError('{} is not a valid mode.'.format(params.mode)) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + stats = run(flags.FLAGS) + if stats: + logging.info('Run stats:\n%s', stats) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_classifier_flags() + flags.mark_flag_as_required('data_dir') + flags.mark_flag_as_required('mode') + flags.mark_flag_as_required('model_type') + flags.mark_flag_as_required('dataset') + + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer_test.py new file mode 100644 index 0000000..0c0f464 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/classifier_trainer_test.py @@ -0,0 +1,386 @@ +# Lint as: python3 +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Unit tests for the classifier trainer models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import copy +import functools +import json + +import os +import sys + +from typing import Any, Callable, Iterable, Mapping, MutableMapping, Optional, Tuple + +from absl import flags +from absl.testing import parameterized +import tensorflow as tf + +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +from official.utils.flags import core as flags_core +from official.vision.image_classification import classifier_trainer +from official.vision.image_classification import dataset_factory +from official.vision.image_classification import test_utils +from official.vision.image_classification.configs import base_configs + +classifier_trainer.define_classifier_flags() + + +def distribution_strategy_combinations() -> Iterable[Tuple[Any, ...]]: + """Returns the combinations of end-to-end tests to run.""" + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.tpu_strategy, + strategy_combinations.one_device_strategy_gpu, + ], + model=[ + 'efficientnet', + 'resnet', + ], + mode='eager', + dataset=[ + 'imagenet', + ], + ) + + +def get_params_override(params_override: Mapping[str, Any]) -> str: + """Converts params_override dict to string command.""" + return '--params_override=' + json.dumps(params_override) + + +def basic_params_override(dtype: str = 'float32') -> MutableMapping[str, Any]: + """Returns a basic parameter configuration for testing.""" + return { + 'train_dataset': { + 'builder': 'synthetic', + 'use_per_replica_batch_size': True, + 'batch_size': 1, + 'image_size': 224, + 'dtype': dtype, + }, + 'validation_dataset': { + 'builder': 'synthetic', + 'batch_size': 1, + 'use_per_replica_batch_size': True, + 'image_size': 224, + 'dtype': dtype, + }, + 'train': { + 'steps': 1, + 'epochs': 1, + 'callbacks': { + 'enable_checkpoint_and_export': True, + 'enable_tensorboard': False, + }, + }, + 'evaluation': { + 'steps': 1, + }, + } + + +def get_trivial_model(num_classes: int) -> tf.keras.Model: + """Creates and compiles trivial model for ImageNet dataset.""" + model = test_utils.trivial_model(num_classes=num_classes) + lr = 0.01 + optimizer = tf.keras.optimizers.SGD(learning_rate=lr) + loss_obj = tf.keras.losses.SparseCategoricalCrossentropy() + model.compile(optimizer=optimizer, + loss=loss_obj, + run_eagerly=True) + return model + + +def get_trivial_data() -> tf.data.Dataset: + """Gets trivial data in the ImageNet size.""" + def generate_data(_) -> tf.data.Dataset: + image = tf.zeros(shape=(224, 224, 3), dtype=tf.float32) + label = tf.zeros([1], dtype=tf.int32) + return image, label + + dataset = tf.data.Dataset.range(1) + dataset = dataset.repeat() + dataset = dataset.map(generate_data, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.prefetch(buffer_size=1).batch(1) + return dataset + + +def run_end_to_end(main: Callable[[Any], None], + extra_flags: Optional[Iterable[str]] = None, + model_dir: Optional[str] = None): + """Runs the classifier trainer end-to-end.""" + extra_flags = [] if extra_flags is None else extra_flags + args = [sys.argv[0], '--model_dir', model_dir] + extra_flags + flags_core.parse_flags(argv=args) + main(flags.FLAGS) + + +class ClassifierTest(tf.test.TestCase, parameterized.TestCase): + """Unit tests for Keras models.""" + _tempdir = None + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(ClassifierTest, cls).setUpClass() + + def tearDown(self): + super(ClassifierTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + @combinations.generate(distribution_strategy_combinations()) + def test_end_to_end_train_and_eval(self, distribution, model, dataset): + """Test train_and_eval and export for Keras classifier models.""" + # Some parameters are not defined as flags (e.g. cannot run + # classifier_train.py --batch_size=...) by design, so use + # "--params_override=..." instead + model_dir = self.get_temp_dir() + base_flags = [ + '--data_dir=not_used', + '--model_type=' + model, + '--dataset=' + dataset, + ] + train_and_eval_flags = base_flags + [ + get_params_override(basic_params_override()), + '--mode=train_and_eval', + ] + + run = functools.partial(classifier_trainer.run, + strategy_override=distribution) + run_end_to_end(main=run, + extra_flags=train_and_eval_flags, + model_dir=model_dir) + + @combinations.generate( + combinations.combine( + distribution=[ + strategy_combinations.one_device_strategy_gpu, + ], + model=[ + 'efficientnet', + 'resnet', + ], + mode='eager', + dataset='imagenet', + dtype='float16', + )) + def test_gpu_train(self, distribution, model, dataset, dtype): + """Test train_and_eval and export for Keras classifier models.""" + # Some parameters are not defined as flags (e.g. cannot run + # classifier_train.py --batch_size=...) by design, so use + # "--params_override=..." instead + model_dir = self.get_temp_dir() + base_flags = [ + '--data_dir=not_used', + '--model_type=' + model, + '--dataset=' + dataset, + ] + train_and_eval_flags = base_flags + [ + get_params_override(basic_params_override(dtype)), + '--mode=train_and_eval', + ] + + export_params = basic_params_override() + export_path = os.path.join(model_dir, 'export') + export_params['export'] = {} + export_params['export']['destination'] = export_path + export_flags = base_flags + [ + '--mode=export_only', + get_params_override(export_params) + ] + + run = functools.partial(classifier_trainer.run, + strategy_override=distribution) + run_end_to_end(main=run, + extra_flags=train_and_eval_flags, + model_dir=model_dir) + run_end_to_end(main=run, + extra_flags=export_flags, + model_dir=model_dir) + self.assertTrue(os.path.exists(export_path)) + + @combinations.generate( + combinations.combine( + distribution=[ + strategy_combinations.tpu_strategy, + ], + model=[ + 'efficientnet', + 'resnet', + ], + mode='eager', + dataset='imagenet', + dtype='bfloat16', + )) + def test_tpu_train(self, distribution, model, dataset, dtype): + """Test train_and_eval and export for Keras classifier models.""" + # Some parameters are not defined as flags (e.g. cannot run + # classifier_train.py --batch_size=...) by design, so use + # "--params_override=..." instead + model_dir = self.get_temp_dir() + base_flags = [ + '--data_dir=not_used', + '--model_type=' + model, + '--dataset=' + dataset, + ] + train_and_eval_flags = base_flags + [ + get_params_override(basic_params_override(dtype)), + '--mode=train_and_eval', + ] + + run = functools.partial(classifier_trainer.run, + strategy_override=distribution) + run_end_to_end(main=run, + extra_flags=train_and_eval_flags, + model_dir=model_dir) + + @combinations.generate(distribution_strategy_combinations()) + def test_end_to_end_invalid_mode(self, distribution, model, dataset): + """Test the Keras EfficientNet model with `strategy`.""" + model_dir = self.get_temp_dir() + extra_flags = [ + '--data_dir=not_used', + '--mode=invalid_mode', + '--model_type=' + model, + '--dataset=' + dataset, + get_params_override(basic_params_override()), + ] + + run = functools.partial(classifier_trainer.run, + strategy_override=distribution) + with self.assertRaises(ValueError): + run_end_to_end(main=run, extra_flags=extra_flags, model_dir=model_dir) + + +class UtilTests(parameterized.TestCase, tf.test.TestCase): + """Tests for individual utility functions within classifier_trainer.py.""" + + @parameterized.named_parameters( + ('efficientnet-b0', 'efficientnet', 'efficientnet-b0', 224), + ('efficientnet-b1', 'efficientnet', 'efficientnet-b1', 240), + ('efficientnet-b2', 'efficientnet', 'efficientnet-b2', 260), + ('efficientnet-b3', 'efficientnet', 'efficientnet-b3', 300), + ('efficientnet-b4', 'efficientnet', 'efficientnet-b4', 380), + ('efficientnet-b5', 'efficientnet', 'efficientnet-b5', 456), + ('efficientnet-b6', 'efficientnet', 'efficientnet-b6', 528), + ('efficientnet-b7', 'efficientnet', 'efficientnet-b7', 600), + ('resnet', 'resnet', '', None), + ) + def test_get_model_size(self, model, model_name, expected): + config = base_configs.ExperimentConfig( + model_name=model, + model=base_configs.ModelConfig( + model_params={ + 'model_name': model_name, + }, + ) + ) + size = classifier_trainer.get_image_size_from_model(config) + self.assertEqual(size, expected) + + @parameterized.named_parameters( + ('dynamic', 'dynamic', None, 'dynamic'), + ('scalar', 128., None, 128.), + ('float32', None, 'float32', 1), + ('float16', None, 'float16', 128), + ) + def test_get_loss_scale(self, loss_scale, dtype, expected): + config = base_configs.ExperimentConfig( + runtime=base_configs.RuntimeConfig( + loss_scale=loss_scale), + train_dataset=dataset_factory.DatasetConfig(dtype=dtype)) + ls = classifier_trainer.get_loss_scale(config, fp16_default=128) + self.assertEqual(ls, expected) + + @parameterized.named_parameters( + ('float16', 'float16'), + ('bfloat16', 'bfloat16') + ) + def test_initialize(self, dtype): + config = base_configs.ExperimentConfig( + runtime=base_configs.RuntimeConfig( + run_eagerly=False, + enable_xla=False, + per_gpu_thread_count=1, + gpu_thread_mode='gpu_private', + num_gpus=1, + dataset_num_private_threads=1, + ), + train_dataset=dataset_factory.DatasetConfig(dtype=dtype), + model=base_configs.ModelConfig(), + ) + + class EmptyClass: + pass + fake_ds_builder = EmptyClass() + fake_ds_builder.dtype = dtype + fake_ds_builder.config = EmptyClass() + classifier_trainer.initialize(config, fake_ds_builder) + + def test_resume_from_checkpoint(self): + """Tests functionality for resuming from checkpoint.""" + # Set the keras policy + policy = tf.keras.mixed_precision.experimental.Policy('mixed_bfloat16') + tf.keras.mixed_precision.experimental.set_policy(policy) + + # Get the model, datasets, and compile it. + model = get_trivial_model(10) + + # Create the checkpoint + model_dir = self.get_temp_dir() + train_epochs = 1 + train_steps = 10 + ds = get_trivial_data() + callbacks = [ + tf.keras.callbacks.ModelCheckpoint( + os.path.join(model_dir, 'model.ckpt-{epoch:04d}'), + save_weights_only=True) + ] + model.fit( + ds, + callbacks=callbacks, + epochs=train_epochs, + steps_per_epoch=train_steps) + + # Test load from checkpoint + clean_model = get_trivial_model(10) + weights_before_load = copy.deepcopy(clean_model.get_weights()) + initial_epoch = classifier_trainer.resume_from_checkpoint( + model=clean_model, + model_dir=model_dir, + train_steps=train_steps) + self.assertEqual(initial_epoch, 1) + self.assertNotAllClose(weights_before_load, clean_model.get_weights()) + + tf.io.gfile.rmtree(model_dir) + + def test_serialize_config(self): + """Tests functionality for serializing data.""" + config = base_configs.ExperimentConfig() + model_dir = self.get_temp_dir() + classifier_trainer.serialize_config(params=config, model_dir=model_dir) + saved_params_path = os.path.join(model_dir, 'params.yaml') + self.assertTrue(os.path.exists(saved_params_path)) + tf.io.gfile.rmtree(model_dir) + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/__init__.py new file mode 100644 index 0000000..931c2ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/base_configs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/base_configs.py new file mode 100644 index 0000000..8065f03 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/base_configs.py @@ -0,0 +1,239 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Definitions for high level configuration groups..""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +from typing import Any, List, Mapping, Optional + +import dataclasses + +from official.modeling.hyperparams import base_config + + +CallbacksConfig = base_config.CallbacksConfig +TensorboardConfig = base_config.TensorboardConfig +RuntimeConfig = base_config.RuntimeConfig + + +@dataclasses.dataclass +class ExportConfig(base_config.Config): + """Configuration for exports. + + Attributes: + checkpoint: the path to the checkpoint to export. + destination: the path to where the checkpoint should be exported. + + """ + checkpoint: str = None + destination: str = None + + +@dataclasses.dataclass +class MetricsConfig(base_config.Config): + """Configuration for Metrics. + + Attributes: + accuracy: Whether or not to track accuracy as a Callback. Defaults to None. + top_5: Whether or not to track top_5_accuracy as a Callback. Defaults to + None. + + """ + accuracy: bool = None + top_5: bool = None + + +@dataclasses.dataclass +class TimeHistoryConfig(base_config.Config): + """Configuration for the TimeHistory callback. + + Attributes: + log_steps: Interval of steps between logging of batch level stats. + + """ + log_steps: int = None + + +@dataclasses.dataclass +class TrainConfig(base_config.Config): + """Configuration for training. + + Attributes: + resume_checkpoint: Whether or not to enable load checkpoint loading. + Defaults to None. + epochs: The number of training epochs to run. Defaults to None. + steps: The number of steps to run per epoch. If None, then this will be + inferred based on the number of images and batch size. Defaults to None. + callbacks: An instance of CallbacksConfig. + metrics: An instance of MetricsConfig. + tensorboard: An instance of TensorboardConfig. + steps_per_loop: The number of batches to run during each `tf.function` + call during training, which can increase training speed. + + """ + resume_checkpoint: bool = None + epochs: int = None + steps: int = None + callbacks: CallbacksConfig = CallbacksConfig() + metrics: MetricsConfig = None + tensorboard: TensorboardConfig = TensorboardConfig() + time_history: TimeHistoryConfig = TimeHistoryConfig() + steps_per_loop: int = None + + +@dataclasses.dataclass +class EvalConfig(base_config.Config): + """Configuration for evaluation. + + Attributes: + epochs_between_evals: The number of train epochs to run between evaluations. + Defaults to None. + steps: The number of eval steps to run during evaluation. If None, this will + be inferred based on the number of images and batch size. Defaults to + None. + skip_eval: Whether or not to skip evaluation. + + """ + epochs_between_evals: int = None + steps: int = None + skip_eval: bool = False + + +@dataclasses.dataclass +class LossConfig(base_config.Config): + """Configuration for Loss. + + Attributes: + name: The name of the loss. Defaults to None. + label_smoothing: Whether or not to apply label smoothing to the loss. This + only applies to 'categorical_cross_entropy'. + + """ + name: str = None + label_smoothing: float = None + + +@dataclasses.dataclass +class OptimizerConfig(base_config.Config): + """Configuration for Optimizers. + + Attributes: + name: The name of the optimizer. Defaults to None. + decay: Decay or rho, discounting factor for gradient. Defaults to None. + epsilon: Small value used to avoid 0 denominator. Defaults to None. + momentum: Plain momentum constant. Defaults to None. + nesterov: Whether or not to apply Nesterov momentum. Defaults to None. + moving_average_decay: The amount of decay to apply. If 0 or None, then + exponential moving average is not used. Defaults to None. + lookahead: Whether or not to apply the lookahead optimizer. Defaults to + None. + beta_1: The exponential decay rate for the 1st moment estimates. Used in + the Adam optimizers. Defaults to None. + beta_2: The exponential decay rate for the 2nd moment estimates. Used in + the Adam optimizers. Defaults to None. + epsilon: Small value used to avoid 0 denominator. Defaults to 1e-7. + + """ + name: str = None + decay: float = None + epsilon: float = None + momentum: float = None + nesterov: bool = None + moving_average_decay: Optional[float] = None + lookahead: Optional[bool] = None + beta_1: float = None + beta_2: float = None + epsilon: float = None + + +@dataclasses.dataclass +class LearningRateConfig(base_config.Config): + """Configuration for learning rates. + + Attributes: + name: The name of the learning rate. Defaults to None. + initial_lr: The initial learning rate. Defaults to None. + decay_epochs: The number of decay epochs. Defaults to None. + decay_rate: The rate of decay. Defaults to None. + warmup_epochs: The number of warmup epochs. Defaults to None. + batch_lr_multiplier: The multiplier to apply to the base learning rate, + if necessary. Defaults to None. + examples_per_epoch: the number of examples in a single epoch. + Defaults to None. + boundaries: boundaries used in piecewise constant decay with warmup. + multipliers: multipliers used in piecewise constant decay with warmup. + scale_by_batch_size: Scale the learning rate by a fraction of the batch + size. Set to 0 for no scaling (default). + staircase: Apply exponential decay at discrete values instead of continuous. + + """ + name: str = None + initial_lr: float = None + decay_epochs: float = None + decay_rate: float = None + warmup_epochs: int = None + examples_per_epoch: int = None + boundaries: List[int] = None + multipliers: List[float] = None + scale_by_batch_size: float = 0. + staircase: bool = None + + +@dataclasses.dataclass +class ModelConfig(base_config.Config): + """Configuration for Models. + + Attributes: + name: The name of the model. Defaults to None. + model_params: The parameters used to create the model. Defaults to None. + num_classes: The number of classes in the model. Defaults to None. + loss: A `LossConfig` instance. Defaults to None. + optimizer: An `OptimizerConfig` instance. Defaults to None. + + """ + name: str = None + model_params: Mapping[str, Any] = None + num_classes: int = None + loss: LossConfig = None + optimizer: OptimizerConfig = None + + +@dataclasses.dataclass +class ExperimentConfig(base_config.Config): + """Base configuration for an image classification experiment. + + Attributes: + model_dir: The directory to use when running an experiment. + mode: e.g. 'train_and_eval', 'export' + runtime: A `RuntimeConfig` instance. + train: A `TrainConfig` instance. + evaluation: An `EvalConfig` instance. + model: A `ModelConfig` instance. + export: An `ExportConfig` instance. + + """ + model_dir: str = None + model_name: str = None + mode: str = None + runtime: RuntimeConfig = None + train_dataset: Any = None + validation_dataset: Any = None + train: TrainConfig = None + evaluation: EvalConfig = None + model: ModelConfig = None + export: ExportConfig = None diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/configs.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/configs.py new file mode 100644 index 0000000..f87d992 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/configs.py @@ -0,0 +1,118 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Configuration utils for image classification experiments.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import dataclasses + +from official.vision.image_classification import dataset_factory +from official.vision.image_classification.configs import base_configs +from official.vision.image_classification.efficientnet import efficientnet_config +from official.vision.image_classification.resnet import resnet_config + + +@dataclasses.dataclass +class EfficientNetImageNetConfig(base_configs.ExperimentConfig): + """Base configuration to train efficientnet-b0 on ImageNet. + + Attributes: + export: An `ExportConfig` instance + runtime: A `RuntimeConfig` instance. + dataset: A `DatasetConfig` instance. + train: A `TrainConfig` instance. + evaluation: An `EvalConfig` instance. + model: A `ModelConfig` instance. + + """ + export: base_configs.ExportConfig = base_configs.ExportConfig() + runtime: base_configs.RuntimeConfig = base_configs.RuntimeConfig() + train_dataset: dataset_factory.DatasetConfig = \ + dataset_factory.ImageNetConfig(split='train') + validation_dataset: dataset_factory.DatasetConfig = \ + dataset_factory.ImageNetConfig(split='validation') + train: base_configs.TrainConfig = base_configs.TrainConfig( + resume_checkpoint=True, + epochs=500, + steps=None, + callbacks=base_configs.CallbacksConfig(enable_checkpoint_and_export=True, + enable_tensorboard=True), + metrics=['accuracy', 'top_5'], + time_history=base_configs.TimeHistoryConfig(log_steps=100), + tensorboard=base_configs.TensorboardConfig(track_lr=True, + write_model_weights=False), + steps_per_loop=1) + evaluation: base_configs.EvalConfig = base_configs.EvalConfig( + epochs_between_evals=1, + steps=None) + model: base_configs.ModelConfig = \ + efficientnet_config.EfficientNetModelConfig() + + +@dataclasses.dataclass +class ResNetImagenetConfig(base_configs.ExperimentConfig): + """Base configuration to train resnet-50 on ImageNet.""" + export: base_configs.ExportConfig = base_configs.ExportConfig() + runtime: base_configs.RuntimeConfig = base_configs.RuntimeConfig() + train_dataset: dataset_factory.DatasetConfig = \ + dataset_factory.ImageNetConfig(split='train', + one_hot=False, + mean_subtract=True, + standardize=True) + validation_dataset: dataset_factory.DatasetConfig = \ + dataset_factory.ImageNetConfig(split='validation', + one_hot=False, + mean_subtract=True, + standardize=True) + train: base_configs.TrainConfig = base_configs.TrainConfig( + resume_checkpoint=True, + epochs=90, + steps=None, + callbacks=base_configs.CallbacksConfig(enable_checkpoint_and_export=True, + enable_tensorboard=True), + metrics=['accuracy', 'top_5'], + time_history=base_configs.TimeHistoryConfig(log_steps=100), + tensorboard=base_configs.TensorboardConfig(track_lr=True, + write_model_weights=False), + steps_per_loop=1) + evaluation: base_configs.EvalConfig = base_configs.EvalConfig( + epochs_between_evals=1, + steps=None) + model: base_configs.ModelConfig = resnet_config.ResNetModelConfig() + + +def get_config(model: str, dataset: str) -> base_configs.ExperimentConfig: + """Given model and dataset names, return the ExperimentConfig.""" + dataset_model_config_map = { + 'imagenet': { + 'efficientnet': EfficientNetImageNetConfig(), + 'resnet': ResNetImagenetConfig(), + } + } + try: + return dataset_model_config_map[dataset][model] + except KeyError: + if dataset not in dataset_model_config_map: + raise KeyError('Invalid dataset received. Received: {}. Supported ' + 'datasets include: {}'.format( + dataset, + ', '.join(dataset_model_config_map.keys()))) + raise KeyError('Invalid model received. Received: {}. Supported models for' + '{} include: {}'.format( + model, + dataset, + ', '.join(dataset_model_config_map[dataset].keys()))) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml new file mode 100644 index 0000000..ebe6488 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-gpu.yaml @@ -0,0 +1,53 @@ +# Training configuration for EfficientNet-b0 trained on ImageNet on GPUs. +# Takes ~32 minutes per epoch for 8 V100s. +# Reaches ~76.1% within 350 epochs. +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'mirrored' + num_gpus: 1 +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'train' + num_classes: 1000 + num_examples: 1281167 + batch_size: 32 + use_per_replica_batch_size: True + dtype: 'float32' + augmenter: + name: 'autoaugment' +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'validation' + num_classes: 1000 + num_examples: 50000 + batch_size: 32 + use_per_replica_batch_size: True + dtype: 'float32' +model: + model_params: + model_name: 'efficientnet-b0' + overrides: + num_classes: 1000 + batch_norm: 'default' + dtype: 'float32' + optimizer: + name: 'rmsprop' + momentum: 0.9 + decay: 0.9 + moving_average_decay: 0.0 + lookahead: false + learning_rate: + name: 'exponential' + loss: + label_smoothing: 0.1 +train: + resume_checkpoint: True + epochs: 500 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml new file mode 100644 index 0000000..0f17558 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml @@ -0,0 +1,52 @@ +# Training configuration for EfficientNet-b0 trained on ImageNet on TPUs. +# Takes ~2 minutes, 50 seconds per epoch for v3-32. +# Reaches ~76.1% within 350 epochs. +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'tpu' +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'train' + num_classes: 1000 + num_examples: 1281167 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'bfloat16' + augmenter: + name: 'autoaugment' +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'validation' + num_classes: 1000 + num_examples: 50000 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'bfloat16' +model: + model_params: + model_name: 'efficientnet-b0' + overrides: + num_classes: 1000 + batch_norm: 'tpu' + dtype: 'bfloat16' + optimizer: + name: 'rmsprop' + momentum: 0.9 + decay: 0.9 + moving_average_decay: 0.0 + lookahead: false + learning_rate: + name: 'exponential' + loss: + label_smoothing: 0.1 +train: + resume_checkpoint: True + epochs: 500 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-gpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-gpu.yaml new file mode 100644 index 0000000..1692bca --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-gpu.yaml @@ -0,0 +1,46 @@ +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'mirrored' + num_gpus: 1 +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'train' + num_classes: 1000 + num_examples: 1281167 + batch_size: 32 + dtype: 'float32' +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'validation' + num_classes: 1000 + num_examples: 50000 + batch_size: 32 + dtype: 'float32' +model: + model_params: + model_name: 'efficientnet-b1' + overrides: + num_classes: 1000 + batch_norm: 'default' + dtype: 'float32' + optimizer: + name: 'rmsprop' + momentum: 0.9 + decay: 0.9 + moving_average_decay: 0.0 + lookahead: false + learning_rate: + name: 'exponential' + loss: + label_smoothing: 0.1 +train: + resume_checkpoint: True + epochs: 500 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-tpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-tpu.yaml new file mode 100644 index 0000000..4ae6827 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/efficientnet/imagenet/efficientnet-b1-tpu.yaml @@ -0,0 +1,51 @@ +# Training configuration for EfficientNet-b1 trained on ImageNet on TPUs. +# Takes ~3 minutes, 15 seconds per epoch for v3-32. +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'tpu' +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'train' + num_classes: 1000 + num_examples: 1281167 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'bfloat16' + augmenter: + name: 'autoaugment' +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'records' + split: 'validation' + num_classes: 1000 + num_examples: 50000 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'bfloat16' +model: + model_params: + model_name: 'efficientnet-b1' + overrides: + num_classes: 1000 + batch_norm: 'tpu' + dtype: 'bfloat16' + optimizer: + name: 'rmsprop' + momentum: 0.9 + decay: 0.9 + moving_average_decay: 0.0 + lookahead: false + learning_rate: + name: 'exponential' + loss: + label_smoothing: 0.1 +train: + resume_checkpoint: True + epochs: 500 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/gpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/gpu.yaml new file mode 100644 index 0000000..e2c340e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/gpu.yaml @@ -0,0 +1,52 @@ +# Training configuration for ResNet trained on ImageNet on GPUs. +# Reaches > 76.1% within 90 epochs. +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'mirrored' + num_gpus: 1 +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'tfds' + split: 'train' + image_size: 224 + num_classes: 1000 + num_examples: 1281167 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'float32' + mean_subtract: True + standardize: True +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'tfds' + split: 'validation' + image_size: 224 + num_classes: 1000 + num_examples: 50000 + batch_size: 128 + use_per_replica_batch_size: True + dtype: 'float32' + mean_subtract: True + standardize: True +model: + model_name: 'resnet' + model_params: + rescale_inputs: False + optimizer: + name: 'momentum' + momentum: 0.9 + decay: 0.9 + epsilon: 0.001 + learning_rate: + name: 'piecewise_constant_with_warmup' + loss: + label_smoothing: 0.1 +train: + resume_checkpoint: True + epochs: 90 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/tpu.yaml b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/tpu.yaml new file mode 100644 index 0000000..b6fb342 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/configs/examples/resnet/imagenet/tpu.yaml @@ -0,0 +1,58 @@ +# Training configuration for ResNet trained on ImageNet on TPUs. +# Takes ~4 minutes, 30 seconds seconds per epoch for a v3-32. +# Reaches > 76.1% within 90 epochs. +# Note: This configuration uses a scaled per-replica batch size based on the number of devices. +runtime: + model_dir: null + mode: 'train_and_eval' + distribution_strategy: 'tpu' +train_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'tfds' + split: 'train' + one_hot: False + image_size: 224 + num_classes: 1000 + num_examples: 1281167 + batch_size: 128 + use_per_replica_batch_size: True + mean_subtract: True + standardize: True + dtype: 'bfloat16' +validation_dataset: + name: 'imagenet2012' + data_dir: null + builder: 'tfds' + split: 'validation' + one_hot: False + image_size: 224 + num_classes: 1000 + num_examples: 50000 + batch_size: 128 + use_per_replica_batch_size: True + mean_subtract: True + standardize: True + dtype: 'bfloat16' +model: + model_name: 'resnet' + model_params: + rescale_inputs: False + optimizer: + name: 'momentum' + momentum: 0.9 + decay: 0.9 + epsilon: 0.001 + moving_average_decay: 0. + lookahead: false + learning_rate: + name: 'piecewise_constant_with_warmup' + loss: + label_smoothing: 0.1 +train: + callbacks: + enable_checkpoint_and_export: True + resume_checkpoint: True + epochs: 90 +evaluation: + epochs_between_evals: 1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/dataset_factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/dataset_factory.py new file mode 100644 index 0000000..5626980 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/dataset_factory.py @@ -0,0 +1,497 @@ +# Lint as: python3 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Dataset utilities for vision tasks using TFDS and tf.data.Dataset.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os +from typing import Any, List, Optional, Tuple, Mapping, Union +from absl import logging +from dataclasses import dataclass +import tensorflow as tf +import tensorflow_datasets as tfds + +from official.modeling.hyperparams import base_config +from official.vision.image_classification import augment +from official.vision.image_classification import preprocessing + + +AUGMENTERS = { + 'autoaugment': augment.AutoAugment, + 'randaugment': augment.RandAugment, +} + + +@dataclass +class AugmentConfig(base_config.Config): + """Configuration for image augmenters. + + Attributes: + name: The name of the image augmentation to use. Possible options are + None (default), 'autoaugment', or 'randaugment'. + params: Any paramaters used to initialize the augmenter. + """ + name: Optional[str] = None + params: Optional[Mapping[str, Any]] = None + + def build(self) -> augment.ImageAugment: + """Build the augmenter using this config.""" + params = self.params or {} + augmenter = AUGMENTERS.get(self.name, None) + return augmenter(**params) if augmenter is not None else None + + +@dataclass +class DatasetConfig(base_config.Config): + """The base configuration for building datasets. + + Attributes: + name: The name of the Dataset. Usually should correspond to a TFDS dataset. + data_dir: The path where the dataset files are stored, if available. + filenames: Optional list of strings representing the TFRecord names. + builder: The builder type used to load the dataset. Value should be one of + 'tfds' (load using TFDS), 'records' (load from TFRecords), or 'synthetic' + (generate dummy synthetic data without reading from files). + split: The split of the dataset. Usually 'train', 'validation', or 'test'. + image_size: The size of the image in the dataset. This assumes that + `width` == `height`. Set to 'infer' to infer the image size from TFDS + info. This requires `name` to be a registered dataset in TFDS. + num_classes: The number of classes given by the dataset. Set to 'infer' + to infer the image size from TFDS info. This requires `name` to be a + registered dataset in TFDS. + num_channels: The number of channels given by the dataset. Set to 'infer' + to infer the image size from TFDS info. This requires `name` to be a + registered dataset in TFDS. + num_examples: The number of examples given by the dataset. Set to 'infer' + to infer the image size from TFDS info. This requires `name` to be a + registered dataset in TFDS. + batch_size: The base batch size for the dataset. + use_per_replica_batch_size: Whether to scale the batch size based on + available resources. If set to `True`, the dataset builder will return + batch_size multiplied by `num_devices`, the number of device replicas + (e.g., the number of GPUs or TPU cores). + num_devices: The number of replica devices to use. This should be set by + `strategy.num_replicas_in_sync` when using a distribution strategy. + dtype: The desired dtype of the dataset. This will be set during + preprocessing. + one_hot: Whether to apply one hot encoding. Set to `True` to be able to use + label smoothing. + augmenter: The augmenter config to use. No augmentation is used by default. + download: Whether to download data using TFDS. + shuffle_buffer_size: The buffer size used for shuffling training data. + file_shuffle_buffer_size: The buffer size used for shuffling raw training + files. + skip_decoding: Whether to skip image decoding when loading from TFDS. + deterministic_train: Whether the examples in the training set should output + in a deterministic order. + use_slack: whether to introduce slack in the last prefetch. This may reduce + CPU contention at the start of a training step. + cache: whether to cache to dataset examples. Can be used to avoid re-reading + from disk on the second epoch. Requires significant memory overhead. + mean_subtract: whether or not to apply mean subtraction to the dataset. + standardize: whether or not to apply standardization to the dataset. + """ + name: Optional[str] = None + data_dir: Optional[str] = None + filenames: Optional[List[str]] = None + builder: str = 'tfds' + split: str = 'train' + image_size: Union[int, str] = 'infer' + num_classes: Union[int, str] = 'infer' + num_channels: Union[int, str] = 'infer' + num_examples: Union[int, str] = 'infer' + batch_size: int = 128 + use_per_replica_batch_size: bool = False + num_devices: int = 1 + dtype: str = 'float32' + one_hot: bool = True + augmenter: AugmentConfig = AugmentConfig() + download: bool = False + shuffle_buffer_size: int = 10000 + file_shuffle_buffer_size: int = 1024 + skip_decoding: bool = True + deterministic_train: bool = False + use_slack: bool = True + cache: bool = False + mean_subtract: bool = False + standardize: bool = False + + @property + def has_data(self): + """Whether this dataset is has any data associated with it.""" + return self.name or self.data_dir or self.filenames + + +@dataclass +class ImageNetConfig(DatasetConfig): + """The base ImageNet dataset config.""" + name: str = 'imagenet2012' + # Note: for large datasets like ImageNet, using records is faster than tfds + builder: str = 'records' + image_size: int = 224 + batch_size: int = 128 + + +@dataclass +class Cifar10Config(DatasetConfig): + """The base CIFAR-10 dataset config.""" + name: str = 'cifar10' + image_size: int = 224 + batch_size: int = 128 + download: bool = True + cache: bool = True + + +class DatasetBuilder: + """An object for building datasets. + + Allows building various pipelines fetching examples, preprocessing, etc. + Maintains additional state information calculated from the dataset, i.e., + training set split, batch size, and number of steps (batches). + """ + + def __init__(self, config: DatasetConfig, **overrides: Any): + """Initialize the builder from the config.""" + self.config = config.replace(**overrides) + self.builder_info = None + + if self.config.augmenter is not None: + logging.info('Using augmentation: %s', self.config.augmenter.name) + self.augmenter = self.config.augmenter.build() + else: + self.augmenter = None + + @property + def is_training(self) -> bool: + """Whether this is the training set.""" + return self.config.split == 'train' + + @property + def batch_size(self) -> int: + """The batch size, multiplied by the number of replicas (if configured).""" + if self.config.use_per_replica_batch_size: + return self.global_batch_size + else: + return self.config.batch_size + + @property + def global_batch_size(self): + """The global batch size across all replicas.""" + return self.config.batch_size * self.config.num_devices + + @property + def num_steps(self) -> int: + """The number of steps (batches) to exhaust this dataset.""" + # Always divide by the global batch size to get the correct # of steps + return self.num_examples // self.global_batch_size + + @property + def dtype(self) -> tf.dtypes.DType: + """Converts the config's dtype string to a tf dtype. + + Returns: + A mapping from string representation of a dtype to the `tf.dtypes.DType`. + + Raises: + ValueError if the config's dtype is not supported. + + """ + dtype_map = { + 'float32': tf.float32, + 'bfloat16': tf.bfloat16, + 'float16': tf.float16, + 'fp32': tf.float32, + 'bf16': tf.bfloat16, + } + try: + return dtype_map[self.config.dtype] + except: + raise ValueError('Invalid DType provided. Supported types: {}'.format( + dtype_map.keys())) + + @property + def image_size(self) -> int: + """The size of each image (can be inferred from the dataset).""" + + if self.config.image_size == 'infer': + return self.info.features['image'].shape[0] + else: + return int(self.config.image_size) + + @property + def num_channels(self) -> int: + """The number of image channels (can be inferred from the dataset).""" + if self.config.num_channels == 'infer': + return self.info.features['image'].shape[-1] + else: + return int(self.config.num_channels) + + @property + def num_examples(self) -> int: + """The number of examples (can be inferred from the dataset).""" + if self.config.num_examples == 'infer': + return self.info.splits[self.config.split].num_examples + else: + return int(self.config.num_examples) + + @property + def num_classes(self) -> int: + """The number of classes (can be inferred from the dataset).""" + if self.config.num_classes == 'infer': + return self.info.features['label'].num_classes + else: + return int(self.config.num_classes) + + @property + def info(self) -> tfds.core.DatasetInfo: + """The TFDS dataset info, if available.""" + if self.builder_info is None: + self.builder_info = tfds.builder(self.config.name).info + return self.builder_info + + def build(self, input_context: tf.distribute.InputContext = None + ) -> tf.data.Dataset: + """Construct a dataset end-to-end and return it. + + Args: + input_context: An optional context provided by `tf.distribute` for + cross-replica training. This isn't necessary if using Keras + compile/fit. + + Returns: + A TensorFlow dataset outputting batched images and labels. + """ + + builders = { + 'tfds': self.load_tfds, + 'records': self.load_records, + 'synthetic': self.load_synthetic, + } + + builder = builders.get(self.config.builder, None) + + if builder is None: + raise ValueError('Unknown builder type {}'.format(self.config.builder)) + + dataset = builder() + dataset = self.pipeline(dataset, input_context) + + return dataset + + def load_tfds(self) -> tf.data.Dataset: + """Return a dataset loading files from TFDS.""" + + logging.info('Using TFDS to load data.') + + builder = tfds.builder(self.config.name, + data_dir=self.config.data_dir) + + if self.config.download: + builder.download_and_prepare() + + decoders = {} + + if self.config.skip_decoding: + decoders['image'] = tfds.decode.SkipDecoding() + + read_config = tfds.ReadConfig( + interleave_parallel_reads=64, + interleave_block_length=1) + + dataset = builder.as_dataset( + split=self.config.split, + as_supervised=True, + shuffle_files=True, + decoders=decoders, + read_config=read_config) + + return dataset + + def load_records(self) -> tf.data.Dataset: + """Return a dataset loading files with TFRecords.""" + logging.info('Using TFRecords to load data.') + + if self.config.filenames is None: + if self.config.data_dir is None: + raise ValueError('Dataset must specify a path for the data files.') + + file_pattern = os.path.join(self.config.data_dir, + '{}*'.format(self.config.split)) + dataset = tf.data.Dataset.list_files(file_pattern, shuffle=True) + else: + dataset = tf.data.Dataset.from_tensor_slices(self.config.filenames) + if self.is_training: + # Shuffle the input files. + dataset.shuffle(buffer_size=self.config.file_shuffle_buffer_size) + + return dataset + + def load_synthetic(self) -> tf.data.Dataset: + """Return a dataset generating dummy synthetic data.""" + logging.info('Generating a synthetic dataset.') + + def generate_data(_): + image = tf.zeros([self.image_size, self.image_size, self.num_channels], + dtype=self.dtype) + label = tf.zeros([1], dtype=tf.int32) + return image, label + + dataset = tf.data.Dataset.range(1) + dataset = dataset.repeat() + dataset = dataset.map(generate_data, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + return dataset + + def pipeline(self, + dataset: tf.data.Dataset, + input_context: tf.distribute.InputContext = None + ) -> tf.data.Dataset: + """Build a pipeline fetching, shuffling, and preprocessing the dataset. + + Args: + dataset: A `tf.data.Dataset` that loads raw files. + input_context: An optional context provided by `tf.distribute` for + cross-replica training. This isn't necessary if using Keras + compile/fit. + + Returns: + A TensorFlow dataset outputting batched images and labels. + """ + if input_context and input_context.num_input_pipelines > 1: + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + if self.is_training and not self.config.cache: + dataset = dataset.repeat() + + if self.config.builder == 'records': + # Read the data from disk in parallel + buffer_size = 8 * 1024 * 1024 # Use 8 MiB per file + dataset = dataset.interleave( + lambda name: tf.data.TFRecordDataset(name, buffer_size=buffer_size), + cycle_length=16, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + dataset = dataset.prefetch(self.global_batch_size) + + if self.config.cache: + dataset = dataset.cache() + + if self.is_training: + dataset = dataset.shuffle(self.config.shuffle_buffer_size) + dataset = dataset.repeat() + + # Parse, pre-process, and batch the data in parallel + if self.config.builder == 'records': + preprocess = self.parse_record + else: + preprocess = self.preprocess + dataset = dataset.map(preprocess, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + dataset = dataset.batch(self.batch_size, drop_remainder=self.is_training) + + # Note: we could do image normalization here, but we defer it to the model + # which can perform it much faster on a GPU/TPU + # TODO(dankondratyuk): if we fix prefetching, we can do it here + + if self.is_training and self.config.deterministic_train is not None: + options = tf.data.Options() + options.experimental_deterministic = self.config.deterministic_train + options.experimental_slack = self.config.use_slack + options.experimental_optimization.parallel_batch = True + options.experimental_optimization.map_fusion = True + options.experimental_optimization.map_vectorization.enabled = True + options.experimental_optimization.map_parallelization = True + dataset = dataset.with_options(options) + + # Prefetch overlaps in-feed with training + # Note: autotune here is not recommended, as this can lead to memory leaks. + # Instead, use a constant prefetch size like the the number of devices. + dataset = dataset.prefetch(self.config.num_devices) + + return dataset + + def parse_record(self, record: tf.Tensor) -> Tuple[tf.Tensor, tf.Tensor]: + """Parse an ImageNet record from a serialized string Tensor.""" + keys_to_features = { + 'image/encoded': + tf.io.FixedLenFeature((), tf.string, ''), + 'image/format': + tf.io.FixedLenFeature((), tf.string, 'jpeg'), + 'image/class/label': + tf.io.FixedLenFeature([], tf.int64, -1), + 'image/class/text': + tf.io.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': + tf.io.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': + tf.io.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': + tf.io.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': + tf.io.VarLenFeature(dtype=tf.float32), + 'image/object/class/label': + tf.io.VarLenFeature(dtype=tf.int64), + } + + parsed = tf.io.parse_single_example(record, keys_to_features) + + label = tf.reshape(parsed['image/class/label'], shape=[1]) + label = tf.cast(label, dtype=tf.int32) + + # Subtract one so that labels are in [0, 1000) + label -= 1 + + image_bytes = tf.reshape(parsed['image/encoded'], shape=[]) + image, label = self.preprocess(image_bytes, label) + + return image, label + + def preprocess(self, image: tf.Tensor, label: tf.Tensor + ) -> Tuple[tf.Tensor, tf.Tensor]: + """Apply image preprocessing and augmentation to the image and label.""" + if self.is_training: + image = preprocessing.preprocess_for_train( + image, + image_size=self.image_size, + mean_subtract=self.config.mean_subtract, + standardize=self.config.standardize, + dtype=self.dtype, + augmenter=self.augmenter) + else: + image = preprocessing.preprocess_for_eval( + image, + image_size=self.image_size, + num_channels=self.num_channels, + mean_subtract=self.config.mean_subtract, + standardize=self.config.standardize, + dtype=self.dtype) + + label = tf.cast(label, tf.int32) + if self.config.one_hot: + label = tf.one_hot(label, self.num_classes) + label = tf.reshape(label, [self.num_classes]) + + return image, label + + @classmethod + def from_params(cls, *args, **kwargs): + """Construct a dataset builder from a default config and any overrides.""" + config = DatasetConfig.from_args(*args, **kwargs) + return cls(config) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/common_modules.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/common_modules.py new file mode 100644 index 0000000..9c9c209 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/common_modules.py @@ -0,0 +1,117 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common modeling utilities.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import numpy as np +import tensorflow as tf +import tensorflow.compat.v1 as tf1 +from typing import Text, Optional + +from tensorflow.python.tpu import tpu_function + + +@tf.keras.utils.register_keras_serializable(package='Vision') +class TpuBatchNormalization(tf.keras.layers.BatchNormalization): + """Cross replica batch normalization.""" + + def __init__(self, fused: Optional[bool] = False, **kwargs): + if fused in (True, None): + raise ValueError('TpuBatchNormalization does not support fused=True.') + super(TpuBatchNormalization, self).__init__(fused=fused, **kwargs) + + def _cross_replica_average(self, t: tf.Tensor, num_shards_per_group: int): + """Calculates the average value of input tensor across TPU replicas.""" + num_shards = tpu_function.get_tpu_context().number_of_shards + group_assignment = None + if num_shards_per_group > 1: + if num_shards % num_shards_per_group != 0: + raise ValueError( + 'num_shards: %d mod shards_per_group: %d, should be 0' % + (num_shards, num_shards_per_group)) + num_groups = num_shards // num_shards_per_group + group_assignment = [[ + x for x in range(num_shards) if x // num_shards_per_group == y + ] for y in range(num_groups)] + return tf1.tpu.cross_replica_sum(t, group_assignment) / tf.cast( + num_shards_per_group, t.dtype) + + def _moments(self, inputs: tf.Tensor, reduction_axes: int, keep_dims: int): + """Compute the mean and variance: it overrides the original _moments.""" + shard_mean, shard_variance = super(TpuBatchNormalization, self)._moments( + inputs, reduction_axes, keep_dims=keep_dims) + + num_shards = tpu_function.get_tpu_context().number_of_shards or 1 + if num_shards <= 8: # Skip cross_replica for 2x2 or smaller slices. + num_shards_per_group = 1 + else: + num_shards_per_group = max(8, num_shards // 8) + if num_shards_per_group > 1: + # Compute variance using: Var[X]= E[X^2] - E[X]^2. + shard_square_of_mean = tf.math.square(shard_mean) + shard_mean_of_square = shard_variance + shard_square_of_mean + group_mean = self._cross_replica_average(shard_mean, num_shards_per_group) + group_mean_of_square = self._cross_replica_average( + shard_mean_of_square, num_shards_per_group) + group_variance = group_mean_of_square - tf.math.square(group_mean) + return (group_mean, group_variance) + else: + return (shard_mean, shard_variance) + + +def get_batch_norm(batch_norm_type: Text) -> tf.keras.layers.BatchNormalization: + """A helper to create a batch normalization getter. + + Args: + batch_norm_type: The type of batch normalization layer implementation. `tpu` + will use `TpuBatchNormalization`. + + Returns: + An instance of `tf.keras.layers.BatchNormalization`. + """ + if batch_norm_type == 'tpu': + return TpuBatchNormalization + + return tf.keras.layers.BatchNormalization + + +def count_params(model, trainable_only=True): + """Returns the count of all model parameters, or just trainable ones.""" + if not trainable_only: + return model.count_params() + else: + return int(np.sum([tf.keras.backend.count_params(p) + for p in model.trainable_weights])) + + +def load_weights(model: tf.keras.Model, + model_weights_path: Text, + weights_format: Text = 'saved_model'): + """Load model weights from the given file path. + + Args: + model: the model to load weights into + model_weights_path: the path of the model weights + weights_format: the model weights format. One of 'saved_model', 'h5', + or 'checkpoint'. + """ + if weights_format == 'saved_model': + loaded_model = tf.keras.models.load_model(model_weights_path) + model.set_weights(loaded_model.get_weights()) + else: + model.load_weights(model_weights_path) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_config.py new file mode 100644 index 0000000..e2ec0cb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_config.py @@ -0,0 +1,76 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Configuration definitions for EfficientNet losses, learning rates, and optimizers.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from typing import Any, Mapping + +import dataclasses + +from official.vision.image_classification.configs import base_configs + + +@dataclasses.dataclass +class EfficientNetModelConfig(base_configs.ModelConfig): + """Configuration for the EfficientNet model. + + This configuration will default to settings used for training efficientnet-b0 + on a v3-8 TPU on ImageNet. + + Attributes: + name: The name of the model. Defaults to 'EfficientNet'. + num_classes: The number of classes in the model. + model_params: A dictionary that represents the parameters of the + EfficientNet model. These will be passed in to the "from_name" function. + loss: The configuration for loss. Defaults to a categorical cross entropy + implementation. + optimizer: The configuration for optimizations. Defaults to an RMSProp + configuration. + learning_rate: The configuration for learning rate. Defaults to an + exponential configuration. + + """ + name: str = 'EfficientNet' + num_classes: int = 1000 + model_params: Mapping[str, Any] = dataclasses.field(default_factory=lambda: { + 'model_name': 'efficientnet-b0', + 'model_weights_path': '', + 'weights_format': 'saved_model', + 'overrides': { + 'batch_norm': 'default', + 'rescale_input': True, + 'num_classes': 1000, + } + }) + loss: base_configs.LossConfig = base_configs.LossConfig( + name='categorical_crossentropy', + label_smoothing=0.1) + optimizer: base_configs.OptimizerConfig = base_configs.OptimizerConfig( + name='rmsprop', + decay=0.9, + epsilon=0.001, + momentum=0.9, + moving_average_decay=None) + learning_rate: base_configs.LearningRateConfig = base_configs.LearningRateConfig( # pylint: disable=line-too-long + name='exponential', + initial_lr=0.008, + decay_epochs=2.4, + decay_rate=0.97, + warmup_epochs=5, + scale_by_batch_size=1. / 128., + staircase=True) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_model.py new file mode 100644 index 0000000..955b5ff --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/efficientnet/efficientnet_model.py @@ -0,0 +1,504 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for EfficientNet model. + +[1] Mingxing Tan, Quoc V. Le + EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. + ICML'19, https://arxiv.org/abs/1905.11946 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import os +from typing import Any, Dict, Optional, Text, Tuple + +from absl import logging +from dataclasses import dataclass +import tensorflow as tf + +from official.modeling import tf_utils +from official.modeling.hyperparams import base_config +from official.vision.image_classification import preprocessing +from official.vision.image_classification.efficientnet import common_modules + + +@dataclass +class BlockConfig(base_config.Config): + """Config for a single MB Conv Block.""" + input_filters: int = 0 + output_filters: int = 0 + kernel_size: int = 3 + num_repeat: int = 1 + expand_ratio: int = 1 + strides: Tuple[int, int] = (1, 1) + se_ratio: Optional[float] = None + id_skip: bool = True + fused_conv: bool = False + conv_type: str = 'depthwise' + + +@dataclass +class ModelConfig(base_config.Config): + """Default Config for Efficientnet-B0.""" + width_coefficient: float = 1.0 + depth_coefficient: float = 1.0 + resolution: int = 224 + dropout_rate: float = 0.2 + blocks: Tuple[BlockConfig, ...] = ( + # (input_filters, output_filters, kernel_size, num_repeat, + # expand_ratio, strides, se_ratio) + # pylint: disable=bad-whitespace + BlockConfig.from_args(32, 16, 3, 1, 1, (1, 1), 0.25), + BlockConfig.from_args(16, 24, 3, 2, 6, (2, 2), 0.25), + BlockConfig.from_args(24, 40, 5, 2, 6, (2, 2), 0.25), + BlockConfig.from_args(40, 80, 3, 3, 6, (2, 2), 0.25), + BlockConfig.from_args(80, 112, 5, 3, 6, (1, 1), 0.25), + BlockConfig.from_args(112, 192, 5, 4, 6, (2, 2), 0.25), + BlockConfig.from_args(192, 320, 3, 1, 6, (1, 1), 0.25), + # pylint: enable=bad-whitespace + ) + stem_base_filters: int = 32 + top_base_filters: int = 1280 + activation: str = 'simple_swish' + batch_norm: str = 'default' + bn_momentum: float = 0.99 + bn_epsilon: float = 1e-3 + # While the original implementation used a weight decay of 1e-5, + # tf.nn.l2_loss divides it by 2, so we halve this to compensate in Keras + weight_decay: float = 5e-6 + drop_connect_rate: float = 0.2 + depth_divisor: int = 8 + min_depth: Optional[int] = None + use_se: bool = True + input_channels: int = 3 + num_classes: int = 1000 + model_name: str = 'efficientnet' + rescale_input: bool = True + data_format: str = 'channels_last' + dtype: str = 'float32' + + +MODEL_CONFIGS = { + # (width, depth, resolution, dropout) + 'efficientnet-b0': ModelConfig.from_args(1.0, 1.0, 224, 0.2), + 'efficientnet-b1': ModelConfig.from_args(1.0, 1.1, 240, 0.2), + 'efficientnet-b2': ModelConfig.from_args(1.1, 1.2, 260, 0.3), + 'efficientnet-b3': ModelConfig.from_args(1.2, 1.4, 300, 0.3), + 'efficientnet-b4': ModelConfig.from_args(1.4, 1.8, 380, 0.4), + 'efficientnet-b5': ModelConfig.from_args(1.6, 2.2, 456, 0.4), + 'efficientnet-b6': ModelConfig.from_args(1.8, 2.6, 528, 0.5), + 'efficientnet-b7': ModelConfig.from_args(2.0, 3.1, 600, 0.5), + 'efficientnet-b8': ModelConfig.from_args(2.2, 3.6, 672, 0.5), + 'efficientnet-l2': ModelConfig.from_args(4.3, 5.3, 800, 0.5), +} + +CONV_KERNEL_INITIALIZER = { + 'class_name': 'VarianceScaling', + 'config': { + 'scale': 2.0, + 'mode': 'fan_out', + # Note: this is a truncated normal distribution + 'distribution': 'normal' + } +} + +DENSE_KERNEL_INITIALIZER = { + 'class_name': 'VarianceScaling', + 'config': { + 'scale': 1 / 3.0, + 'mode': 'fan_out', + 'distribution': 'uniform' + } +} + + +def round_filters(filters: int, + config: ModelConfig) -> int: + """Round number of filters based on width coefficient.""" + width_coefficient = config.width_coefficient + min_depth = config.min_depth + divisor = config.depth_divisor + orig_filters = filters + + if not width_coefficient: + return filters + + filters *= width_coefficient + min_depth = min_depth or divisor + new_filters = max(min_depth, int(filters + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than 10%. + if new_filters < 0.9 * filters: + new_filters += divisor + logging.info('round_filter input=%s output=%s', orig_filters, new_filters) + return int(new_filters) + + +def round_repeats(repeats: int, depth_coefficient: float) -> int: + """Round number of repeats based on depth coefficient.""" + return int(math.ceil(depth_coefficient * repeats)) + + +def conv2d_block(inputs: tf.Tensor, + conv_filters: Optional[int], + config: ModelConfig, + kernel_size: Any = (1, 1), + strides: Any = (1, 1), + use_batch_norm: bool = True, + use_bias: bool = False, + activation: Any = None, + depthwise: bool = False, + name: Text = None): + """A conv2d followed by batch norm and an activation.""" + batch_norm = common_modules.get_batch_norm(config.batch_norm) + bn_momentum = config.bn_momentum + bn_epsilon = config.bn_epsilon + data_format = tf.keras.backend.image_data_format() + weight_decay = config.weight_decay + + name = name or '' + + # Collect args based on what kind of conv2d block is desired + init_kwargs = { + 'kernel_size': kernel_size, + 'strides': strides, + 'use_bias': use_bias, + 'padding': 'same', + 'name': name + '_conv2d', + 'kernel_regularizer': tf.keras.regularizers.l2(weight_decay), + 'bias_regularizer': tf.keras.regularizers.l2(weight_decay), + } + + if depthwise: + conv2d = tf.keras.layers.DepthwiseConv2D + init_kwargs.update({'depthwise_initializer': CONV_KERNEL_INITIALIZER}) + else: + conv2d = tf.keras.layers.Conv2D + init_kwargs.update({'filters': conv_filters, + 'kernel_initializer': CONV_KERNEL_INITIALIZER}) + + x = conv2d(**init_kwargs)(inputs) + + if use_batch_norm: + bn_axis = 1 if data_format == 'channels_first' else -1 + x = batch_norm(axis=bn_axis, + momentum=bn_momentum, + epsilon=bn_epsilon, + name=name + '_bn')(x) + + if activation is not None: + x = tf.keras.layers.Activation(activation, + name=name + '_activation')(x) + return x + + +def mb_conv_block(inputs: tf.Tensor, + block: BlockConfig, + config: ModelConfig, + prefix: Text = None): + """Mobile Inverted Residual Bottleneck. + + Args: + inputs: the Keras input to the block + block: BlockConfig, arguments to create a Block + config: ModelConfig, a set of model parameters + prefix: prefix for naming all layers + + Returns: + the output of the block + """ + use_se = config.use_se + activation = tf_utils.get_activation(config.activation) + drop_connect_rate = config.drop_connect_rate + data_format = tf.keras.backend.image_data_format() + use_depthwise = block.conv_type != 'no_depthwise' + prefix = prefix or '' + + filters = block.input_filters * block.expand_ratio + + x = inputs + + if block.fused_conv: + # If we use fused mbconv, skip expansion and use regular conv. + x = conv2d_block(x, + filters, + config, + kernel_size=block.kernel_size, + strides=block.strides, + activation=activation, + name=prefix + 'fused') + else: + if block.expand_ratio != 1: + # Expansion phase + kernel_size = (1, 1) if use_depthwise else (3, 3) + x = conv2d_block(x, + filters, + config, + kernel_size=kernel_size, + activation=activation, + name=prefix + 'expand') + + # Depthwise Convolution + if use_depthwise: + x = conv2d_block(x, + conv_filters=None, + config=config, + kernel_size=block.kernel_size, + strides=block.strides, + activation=activation, + depthwise=True, + name=prefix + 'depthwise') + + # Squeeze and Excitation phase + if use_se: + assert block.se_ratio is not None + assert 0 < block.se_ratio <= 1 + num_reduced_filters = max(1, int( + block.input_filters * block.se_ratio + )) + + if data_format == 'channels_first': + se_shape = (filters, 1, 1) + else: + se_shape = (1, 1, filters) + + se = tf.keras.layers.GlobalAveragePooling2D(name=prefix + 'se_squeeze')(x) + se = tf.keras.layers.Reshape(se_shape, name=prefix + 'se_reshape')(se) + + se = conv2d_block(se, + num_reduced_filters, + config, + use_bias=True, + use_batch_norm=False, + activation=activation, + name=prefix + 'se_reduce') + se = conv2d_block(se, + filters, + config, + use_bias=True, + use_batch_norm=False, + activation='sigmoid', + name=prefix + 'se_expand') + x = tf.keras.layers.multiply([x, se], name=prefix + 'se_excite') + + # Output phase + x = conv2d_block(x, + block.output_filters, + config, + activation=None, + name=prefix + 'project') + + # Add identity so that quantization-aware training can insert quantization + # ops correctly. + x = tf.keras.layers.Activation(tf_utils.get_activation('identity'), + name=prefix + 'id')(x) + + if (block.id_skip + and all(s == 1 for s in block.strides) + and block.input_filters == block.output_filters): + if drop_connect_rate and drop_connect_rate > 0: + # Apply dropconnect + # The only difference between dropout and dropconnect in TF is scaling by + # drop_connect_rate during training. See: + # https://github.com/keras-team/keras/pull/9898#issuecomment-380577612 + x = tf.keras.layers.Dropout(drop_connect_rate, + noise_shape=(None, 1, 1, 1), + name=prefix + 'drop')(x) + + x = tf.keras.layers.add([x, inputs], name=prefix + 'add') + + return x + + +def efficientnet(image_input: tf.keras.layers.Input, + config: ModelConfig): + """Creates an EfficientNet graph given the model parameters. + + This function is wrapped by the `EfficientNet` class to make a tf.keras.Model. + + Args: + image_input: the input batch of images + config: the model config + + Returns: + the output of efficientnet + """ + depth_coefficient = config.depth_coefficient + blocks = config.blocks + stem_base_filters = config.stem_base_filters + top_base_filters = config.top_base_filters + activation = tf_utils.get_activation(config.activation) + dropout_rate = config.dropout_rate + drop_connect_rate = config.drop_connect_rate + num_classes = config.num_classes + input_channels = config.input_channels + rescale_input = config.rescale_input + data_format = tf.keras.backend.image_data_format() + dtype = config.dtype + weight_decay = config.weight_decay + + x = image_input + if data_format == 'channels_first': + # Happens on GPU/TPU if available. + x = tf.keras.layers.Permute((3, 1, 2))(x) + if rescale_input: + x = preprocessing.normalize_images(x, + num_channels=input_channels, + dtype=dtype, + data_format=data_format) + + # Build stem + x = conv2d_block(x, + round_filters(stem_base_filters, config), + config, + kernel_size=[3, 3], + strides=[2, 2], + activation=activation, + name='stem') + + # Build blocks + num_blocks_total = sum(block.num_repeat for block in blocks) + block_num = 0 + + for stack_idx, block in enumerate(blocks): + assert block.num_repeat > 0 + # Update block input and output filters based on depth multiplier + block = block.replace( + input_filters=round_filters(block.input_filters, config), + output_filters=round_filters(block.output_filters, config), + num_repeat=round_repeats(block.num_repeat, depth_coefficient)) + + # The first block needs to take care of stride and filter size increase + drop_rate = drop_connect_rate * float(block_num) / num_blocks_total + config = config.replace(drop_connect_rate=drop_rate) + block_prefix = 'stack_{}/block_0/'.format(stack_idx) + x = mb_conv_block(x, block, config, block_prefix) + block_num += 1 + if block.num_repeat > 1: + block = block.replace( + input_filters=block.output_filters, + strides=[1, 1] + ) + + for block_idx in range(block.num_repeat - 1): + drop_rate = drop_connect_rate * float(block_num) / num_blocks_total + config = config.replace(drop_connect_rate=drop_rate) + block_prefix = 'stack_{}/block_{}/'.format(stack_idx, block_idx + 1) + x = mb_conv_block(x, block, config, prefix=block_prefix) + block_num += 1 + + # Build top + x = conv2d_block(x, + round_filters(top_base_filters, config), + config, + activation=activation, + name='top') + + # Build classifier + x = tf.keras.layers.GlobalAveragePooling2D(name='top_pool')(x) + if dropout_rate and dropout_rate > 0: + x = tf.keras.layers.Dropout(dropout_rate, name='top_dropout')(x) + x = tf.keras.layers.Dense( + num_classes, + kernel_initializer=DENSE_KERNEL_INITIALIZER, + kernel_regularizer=tf.keras.regularizers.l2(weight_decay), + bias_regularizer=tf.keras.regularizers.l2(weight_decay), + name='logits')(x) + x = tf.keras.layers.Activation('softmax', name='probs')(x) + + return x + + +@tf.keras.utils.register_keras_serializable(package='Vision') +class EfficientNet(tf.keras.Model): + """Wrapper class for an EfficientNet Keras model. + + Contains helper methods to build, manage, and save metadata about the model. + """ + + def __init__(self, + config: ModelConfig = None, + overrides: Dict[Text, Any] = None): + """Create an EfficientNet model. + + Args: + config: (optional) the main model parameters to create the model + overrides: (optional) a dict containing keys that can override + config + """ + overrides = overrides or {} + config = config or ModelConfig() + + self.config = config.replace(**overrides) + + input_channels = self.config.input_channels + model_name = self.config.model_name + input_shape = (None, None, input_channels) # Should handle any size image + image_input = tf.keras.layers.Input(shape=input_shape) + + output = efficientnet(image_input, self.config) + + # Cast to float32 in case we have a different model dtype + output = tf.cast(output, tf.float32) + + logging.info('Building model %s with params %s', + model_name, + self.config) + + super(EfficientNet, self).__init__( + inputs=image_input, outputs=output, name=model_name) + + @classmethod + def from_name(cls, + model_name: Text, + model_weights_path: Text = None, + weights_format: Text = 'saved_model', + overrides: Dict[Text, Any] = None): + """Construct an EfficientNet model from a predefined model name. + + E.g., `EfficientNet.from_name('efficientnet-b0')`. + + Args: + model_name: the predefined model name + model_weights_path: the path to the weights (h5 file or saved model dir) + weights_format: the model weights format. One of 'saved_model', 'h5', + or 'checkpoint'. + overrides: (optional) a dict containing keys that can override config + + Returns: + A constructed EfficientNet instance. + """ + model_configs = dict(MODEL_CONFIGS) + overrides = dict(overrides) if overrides else {} + + # One can define their own custom models if necessary + model_configs.update(overrides.pop('model_config', {})) + + if model_name not in model_configs: + raise ValueError('Unknown model name {}'.format(model_name)) + + config = model_configs[model_name] + + model = cls(config=config, overrides=overrides) + + if model_weights_path: + common_modules.load_weights(model, + model_weights_path, + weights_format=weights_format) + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate.py new file mode 100644 index 0000000..262b4aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate.py @@ -0,0 +1,120 @@ +# Lint as: python3 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Learning rate utilities for vision tasks.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from typing import Any, List, Mapping + +import tensorflow as tf + +BASE_LEARNING_RATE = 0.1 + + +class WarmupDecaySchedule(tf.keras.optimizers.schedules.LearningRateSchedule): + """A wrapper for LearningRateSchedule that includes warmup steps.""" + + def __init__( + self, + lr_schedule: tf.keras.optimizers.schedules.LearningRateSchedule, + warmup_steps: int): + """Add warmup decay to a learning rate schedule. + + Args: + lr_schedule: base learning rate scheduler + warmup_steps: number of warmup steps + + """ + super(WarmupDecaySchedule, self).__init__() + self._lr_schedule = lr_schedule + self._warmup_steps = warmup_steps + + def __call__(self, step: int): + lr = self._lr_schedule(step) + if self._warmup_steps: + initial_learning_rate = tf.convert_to_tensor( + self._lr_schedule.initial_learning_rate, name="initial_learning_rate") + dtype = initial_learning_rate.dtype + global_step_recomp = tf.cast(step, dtype) + warmup_steps = tf.cast(self._warmup_steps, dtype) + warmup_lr = initial_learning_rate * global_step_recomp / warmup_steps + lr = tf.cond(global_step_recomp < warmup_steps, + lambda: warmup_lr, + lambda: lr) + return lr + + def get_config(self) -> Mapping[str, Any]: + config = self._lr_schedule.get_config() + config.update({ + "warmup_steps": self._warmup_steps, + }) + return config + + +# TODO(b/149030439) - refactor this with +# tf.keras.optimizers.schedules.PiecewiseConstantDecay + WarmupDecaySchedule. +class PiecewiseConstantDecayWithWarmup( + tf.keras.optimizers.schedules.LearningRateSchedule): + """Piecewise constant decay with warmup schedule.""" + + def __init__(self, + batch_size: int, + epoch_size: int, + warmup_epochs: int, + boundaries: List[int], + multipliers: List[float]): + """Piecewise constant decay with warmup. + + Args: + batch_size: The training batch size used in the experiment. + epoch_size: The size of an epoch, or the number of examples in an epoch. + warmup_epochs: The number of warmup epochs to apply. + boundaries: The list of floats with strictly increasing entries. + multipliers: The list of multipliers/learning rates to use for the + piecewise portion. The length must be 1 less than that of boundaries. + + """ + super(PiecewiseConstantDecayWithWarmup, self).__init__() + if len(boundaries) != len(multipliers) - 1: + raise ValueError("The length of boundaries must be 1 less than the " + "length of multipliers") + + base_lr_batch_size = 256 + steps_per_epoch = epoch_size // batch_size + + self._rescaled_lr = BASE_LEARNING_RATE * batch_size / base_lr_batch_size + self._step_boundaries = [float(steps_per_epoch) * x for x in boundaries] + self._lr_values = [self._rescaled_lr * m for m in multipliers] + self._warmup_steps = warmup_epochs * steps_per_epoch + + def __call__(self, step: int): + """Compute learning rate at given step.""" + def warmup_lr(): + return self._rescaled_lr * ( + step / tf.cast(self._warmup_steps, tf.float32)) + def piecewise_lr(): + return tf.compat.v1.train.piecewise_constant( + tf.cast(step, tf.float32), self._step_boundaries, self._lr_values) + return tf.cond(step < self._warmup_steps, warmup_lr, piecewise_lr) + + def get_config(self) -> Mapping[str, Any]: + return { + "rescaled_lr": self._rescaled_lr, + "step_boundaries": self._step_boundaries, + "lr_values": self._lr_values, + "warmup_steps": self._warmup_steps, + } diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate_test.py new file mode 100644 index 0000000..8241151 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/learning_rate_test.py @@ -0,0 +1,89 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for learning_rate.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from official.vision.image_classification import learning_rate + + +class LearningRateTests(tf.test.TestCase): + + def test_warmup_decay(self): + """Basic computational test for warmup decay.""" + initial_lr = 0.01 + decay_steps = 100 + decay_rate = 0.01 + warmup_steps = 10 + + base_lr = tf.keras.optimizers.schedules.ExponentialDecay( + initial_learning_rate=initial_lr, + decay_steps=decay_steps, + decay_rate=decay_rate) + lr = learning_rate.WarmupDecaySchedule( + lr_schedule=base_lr, + warmup_steps=warmup_steps) + + for step in range(warmup_steps - 1): + config = lr.get_config() + self.assertEqual(config['warmup_steps'], warmup_steps) + self.assertAllClose(self.evaluate(lr(step)), + step / warmup_steps * initial_lr) + + def test_piecewise_constant_decay_with_warmup(self): + """Basic computational test for piecewise constant decay with warmup.""" + boundaries = [1, 2, 3] + warmup_epochs = boundaries[0] + learning_rate_multipliers = [1.0, 0.1, 0.001] + expected_keys = [ + 'rescaled_lr', 'step_boundaries', 'lr_values', 'warmup_steps', + ] + + expected_lrs = [0.0, 0.1, 0.1] + + lr = learning_rate.PiecewiseConstantDecayWithWarmup( + batch_size=256, + epoch_size=256, + warmup_epochs=warmup_epochs, + boundaries=boundaries[1:], + multipliers=learning_rate_multipliers) + + step = 0 + + config = lr.get_config() + self.assertAllInSet(list(config.keys()), expected_keys) + + for boundary, expected_lr in zip(boundaries, expected_lrs): + for _ in range(step, boundary): + self.assertAllClose(self.evaluate(lr(step)), expected_lr) + step += 1 + + def test_piecewise_constant_decay_invalid_boundaries(self): + with self.assertRaisesRegex(ValueError, + 'The length of boundaries must be 1 less '): + learning_rate.PiecewiseConstantDecayWithWarmup( + batch_size=256, + epoch_size=256, + warmup_epochs=1, + boundaries=[1, 2], + multipliers=[1, 2]) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_main.py new file mode 100644 index 0000000..1470c02 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_main.py @@ -0,0 +1,171 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a simple model on the MNIST dataset.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf +import tensorflow_datasets as tfds + +from official.utils.flags import core as flags_core +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers +from official.vision.image_classification.resnet import common + +FLAGS = flags.FLAGS + + +def build_model(): + """Constructs the ML model used to predict handwritten digits.""" + + image = tf.keras.layers.Input(shape=(28, 28, 1)) + + y = tf.keras.layers.Conv2D(filters=32, + kernel_size=5, + padding='same', + activation='relu')(image) + y = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), + strides=(2, 2), + padding='same')(y) + y = tf.keras.layers.Conv2D(filters=32, + kernel_size=5, + padding='same', + activation='relu')(y) + y = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), + strides=(2, 2), + padding='same')(y) + y = tf.keras.layers.Flatten()(y) + y = tf.keras.layers.Dense(1024, activation='relu')(y) + y = tf.keras.layers.Dropout(0.4)(y) + + probs = tf.keras.layers.Dense(10, activation='softmax')(y) + + model = tf.keras.models.Model(image, probs, name='mnist') + + return model + + +@tfds.decode.make_decoder(output_dtype=tf.float32) +def decode_image(example, feature): + """Convert image to float32 and normalize from [0, 255] to [0.0, 1.0].""" + return tf.cast(feature.decode_example(example), dtype=tf.float32) / 255 + + +def run(flags_obj, datasets_override=None, strategy_override=None): + """Run MNIST model training and eval loop using native Keras APIs. + + Args: + flags_obj: An object containing parsed flag values. + datasets_override: A pair of `tf.data.Dataset` objects to train the model, + representing the train and test sets. + strategy_override: A `tf.distribute.Strategy` object to use for model. + + Returns: + Dictionary of training and eval stats. + """ + strategy = strategy_override or distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus, + tpu_address=flags_obj.tpu) + + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + mnist = tfds.builder('mnist', data_dir=flags_obj.data_dir) + if flags_obj.download: + mnist.download_and_prepare() + + mnist_train, mnist_test = datasets_override or mnist.as_dataset( + split=['train', 'test'], + decoders={'image': decode_image()}, # pylint: disable=no-value-for-parameter + as_supervised=True) + train_input_dataset = mnist_train.cache().repeat().shuffle( + buffer_size=50000).batch(flags_obj.batch_size) + eval_input_dataset = mnist_test.cache().repeat().batch(flags_obj.batch_size) + + with strategy_scope: + lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay( + 0.05, decay_steps=100000, decay_rate=0.96) + optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule) + + model = build_model() + model.compile( + optimizer=optimizer, + loss='sparse_categorical_crossentropy', + metrics=['sparse_categorical_accuracy']) + + num_train_examples = mnist.info.splits['train'].num_examples + train_steps = num_train_examples // flags_obj.batch_size + train_epochs = flags_obj.train_epochs + + ckpt_full_path = os.path.join(flags_obj.model_dir, 'model.ckpt-{epoch:04d}') + callbacks = [ + tf.keras.callbacks.ModelCheckpoint( + ckpt_full_path, save_weights_only=True), + tf.keras.callbacks.TensorBoard(log_dir=flags_obj.model_dir), + ] + + num_eval_examples = mnist.info.splits['test'].num_examples + num_eval_steps = num_eval_examples // flags_obj.batch_size + + history = model.fit( + train_input_dataset, + epochs=train_epochs, + steps_per_epoch=train_steps, + callbacks=callbacks, + validation_steps=num_eval_steps, + validation_data=eval_input_dataset, + validation_freq=flags_obj.epochs_between_evals) + + export_path = os.path.join(flags_obj.model_dir, 'saved_model') + model.save(export_path, include_optimizer=False) + + eval_output = model.evaluate( + eval_input_dataset, steps=num_eval_steps, verbose=2) + + stats = common.build_stats(history, eval_output, callbacks) + return stats + + +def define_mnist_flags(): + """Define command line flags for MNIST model.""" + flags_core.define_base( + clean=True, + num_gpu=True, + train_epochs=True, + epochs_between_evals=True, + distribution_strategy=True) + flags_core.define_device() + flags_core.define_distribution() + flags.DEFINE_bool('download', False, + 'Whether to download data to `--data_dir`.') + FLAGS.set_default('batch_size', 1024) + + +def main(_): + model_helpers.apply_clean(FLAGS) + stats = run(flags.FLAGS) + logging.info('Run stats:\n%s', stats) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_mnist_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_test.py new file mode 100644 index 0000000..a9c233d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/mnist_test.py @@ -0,0 +1,90 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test the Keras MNIST model on GPU.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools + +from absl.testing import parameterized +import tensorflow as tf + +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +from official.utils.misc import keras_utils +from official.utils.testing import integration +from official.vision.image_classification import mnist_main + + +def eager_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.tpu_strategy, + strategy_combinations.one_device_strategy_gpu, + ], + mode="eager", + ) + + +class KerasMnistTest(tf.test.TestCase, parameterized.TestCase): + """Unit tests for sample Keras MNIST model.""" + _tempdir = None + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(KerasMnistTest, cls).setUpClass() + mnist_main.define_mnist_flags() + + def tearDown(self): + super(KerasMnistTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + @combinations.generate(eager_strategy_combinations()) + def test_end_to_end(self, distribution): + """Test Keras MNIST model with `strategy`.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + extra_flags = [ + "-train_epochs", "1", + # Let TFDS find the metadata folder automatically + "--data_dir=" + ] + + dummy_data = ( + tf.ones(shape=(10, 28, 28, 1), dtype=tf.int32), + tf.range(10), + ) + datasets = ( + tf.data.Dataset.from_tensor_slices(dummy_data), + tf.data.Dataset.from_tensor_slices(dummy_data), + ) + + run = functools.partial(mnist_main.run, + datasets_override=datasets, + strategy_override=distribution) + + integration.run_synthetic( + main=run, + synth=False, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory.py new file mode 100644 index 0000000..4320583 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory.py @@ -0,0 +1,383 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Optimizer factory for vision tasks.""" +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import logging +import tensorflow as tf +import tensorflow_addons as tfa + +from typing import Any, Dict, Text, List +from official.vision.image_classification import learning_rate +from official.vision.image_classification.configs import base_configs + +# pylint: disable=protected-access + + +class MovingAverage(tf.keras.optimizers.Optimizer): + """Optimizer that computes a moving average of the variables. + + Empirically it has been found that using the moving average of the trained + parameters of a deep network is better than using its trained parameters + directly. This optimizer allows you to compute this moving average and swap + the variables at save time so that any code outside of the training loop + will use by default the average values instead of the original ones. + + Example of usage for training: + ```python + opt = tf.keras.optimizers.SGD(learning_rate) + opt = MovingAverage(opt) + + opt.shadow_copy(model) + ``` + + At test time, swap the shadow variables to evaluate on the averaged weights: + ```python + opt.swap_weights() + # Test eval the model here + opt.swap_weights() + ``` + """ + + def __init__(self, + optimizer: tf.keras.optimizers.Optimizer, + average_decay: float = 0.99, + start_step: int = 0, + dynamic_decay: bool = True, + name: Text = 'moving_average', + **kwargs): + """Construct a new MovingAverage optimizer. + + Args: + optimizer: `tf.keras.optimizers.Optimizer` that will be + used to compute and apply gradients. + average_decay: float. Decay to use to maintain the moving averages + of trained variables. + start_step: int. What step to start the moving average. + dynamic_decay: bool. Whether to change the decay based on the number + of optimizer updates. Decay will start at 0.1 and gradually increase + up to `average_decay` after each optimizer update. This behavior is + similar to `tf.train.ExponentialMovingAverage` in TF 1.x. + name: Optional name for the operations created when applying + gradients. Defaults to "moving_average". + **kwargs: keyword arguments. Allowed to be {`clipnorm`, + `clipvalue`, `lr`, `decay`}. + """ + super(MovingAverage, self).__init__(name, **kwargs) + self._optimizer = optimizer + self._average_decay = average_decay + self._start_step = tf.constant(start_step, tf.float32) + self._dynamic_decay = dynamic_decay + + def shadow_copy(self, model: tf.keras.Model): + """Creates shadow variables for the given model weights.""" + for var in model.weights: + self.add_slot(var, 'average', initializer='zeros') + self._average_weights = [ + self.get_slot(var, 'average') for var in model.weights + ] + self._model_weights = model.weights + + @property + def has_shadow_copy(self): + """Whether this optimizer has created shadow variables.""" + return self._model_weights is not None + + def _create_slots(self, var_list): + self._optimizer._create_slots(var_list=var_list) # pylint: disable=protected-access + + def apply_gradients(self, grads_and_vars, name: Text = None): + result = self._optimizer.apply_gradients(grads_and_vars, name) + self.update_average(self._optimizer.iterations) + return result + + @tf.function + def update_average(self, step: tf.Tensor): + step = tf.cast(step, tf.float32) + if step < self._start_step: + decay = tf.constant(0., tf.float32) + elif self._dynamic_decay: + decay = step - self._start_step + decay = tf.minimum(self._average_decay, (1. + decay) / (10. + decay)) + else: + decay = self._average_decay + + def _apply_moving(v_moving, v_normal): + diff = v_moving - v_normal + v_moving.assign_sub(tf.cast(1. - decay, v_moving.dtype) * diff) + return v_moving + + def _update(strategy, v_moving_and_v_normal): + for v_moving, v_normal in v_moving_and_v_normal: + strategy.extended.update(v_moving, _apply_moving, args=(v_normal,)) + + ctx = tf.distribute.get_replica_context() + return ctx.merge_call(_update, args=(zip(self._average_weights, + self._model_weights),)) + + def swap_weights(self): + """Swap the average and moving weights. + + This is a convenience method to allow one to evaluate the averaged weights + at test time. Loads the weights stored in `self._average` into the model, + keeping a copy of the original model weights. Swapping twice will return + the original weights. + """ + if tf.distribute.in_cross_replica_context(): + strategy = tf.distribute.get_strategy() + strategy.run(self._swap_weights, args=()) + else: + raise ValueError('Swapping weights must occur under a ' + 'tf.distribute.Strategy') + + @tf.function + def _swap_weights(self): + def fn_0(a, b): + a.assign_add(b) + return a + def fn_1(b, a): + b.assign(a - b) + return b + def fn_2(a, b): + a.assign_sub(b) + return a + + def swap(strategy, a_and_b): + """Swap `a` and `b` and mirror to all devices.""" + for a, b in a_and_b: + strategy.extended.update(a, fn_0, args=(b,)) # a = a + b + strategy.extended.update(b, fn_1, args=(a,)) # b = a - b + strategy.extended.update(a, fn_2, args=(b,)) # a = a - b + + ctx = tf.distribute.get_replica_context() + return ctx.merge_call( + swap, args=(zip(self._average_weights, self._model_weights),)) + + def assign_average_vars(self, var_list: List[tf.Variable]): + """Assign variables in var_list with their respective averages. + + Args: + var_list: List of model variables to be assigned to their average. + Returns: + assign_op: The op corresponding to the assignment operation of + variables to their average. + """ + assign_op = tf.group([ + var.assign(self.get_slot(var, 'average')) for var in var_list + if var.trainable + ]) + return assign_op + + def _create_hypers(self): + self._optimizer._create_hypers() # pylint: disable=protected-access + + def _prepare(self, var_list): + return self._optimizer._prepare(var_list=var_list) # pylint: disable=protected-access + + @property + def iterations(self): + return self._optimizer.iterations + + @iterations.setter + def iterations(self, variable): + self._optimizer.iterations = variable + + @property + def weights(self): + # return self._weights + self._optimizer.weights + return self._optimizer.weights + + @property + def lr(self): + return self._optimizer._get_hyper('learning_rate') + + @lr.setter + def lr(self, lr): + self._optimizer._set_hyper('learning_rate', lr) + + @property + def learning_rate(self): + return self._optimizer._get_hyper('learning_rate') + + @learning_rate.setter + def learning_rate(self, learning_rate): # pylint: disable=redefined-outer-name + self._optimizer._set_hyper('learning_rate', learning_rate) + + def _resource_apply_dense(self, grad, var): + return self._optimizer._resource_apply_dense(grad, var) + + def _resource_apply_sparse(self, grad, var, indices): + return self._optimizer._resource_apply_sparse(grad, var, indices) + + def _resource_apply_sparse_duplicate_indices(self, grad, var, indices): + return self._optimizer._resource_apply_sparse_duplicate_indices( + grad, var, indices) + + def get_config(self): + config = { + 'optimizer': tf.keras.optimizers.serialize(self._optimizer), + 'average_decay': self._average_decay, + 'start_step': self._start_step, + 'dynamic_decay': self._dynamic_decay, + } + base_config = super(MovingAverage, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + @classmethod + def from_config(cls, config, custom_objects=None): + optimizer = tf.keras.optimizers.deserialize( + config.pop('optimizer'), + custom_objects=custom_objects, + ) + return cls(optimizer, **config) + + +def build_optimizer( + optimizer_name: Text, + base_learning_rate: tf.keras.optimizers.schedules.LearningRateSchedule, + params: Dict[Text, Any]): + """Build the optimizer based on name. + + Args: + optimizer_name: String representation of the optimizer name. Examples: + sgd, momentum, rmsprop. + base_learning_rate: `tf.keras.optimizers.schedules.LearningRateSchedule` + base learning rate. + params: String -> Any dictionary representing the optimizer params. + This should contain optimizer specific parameters such as + `base_learning_rate`, `decay`, etc. + + Returns: + A tf.keras.Optimizer. + + Raises: + ValueError if the provided optimizer_name is not supported. + + """ + optimizer_name = optimizer_name.lower() + logging.info('Building %s optimizer with params %s', optimizer_name, params) + + if optimizer_name == 'sgd': + logging.info('Using SGD optimizer') + nesterov = params.get('nesterov', False) + optimizer = tf.keras.optimizers.SGD(learning_rate=base_learning_rate, + nesterov=nesterov) + elif optimizer_name == 'momentum': + logging.info('Using momentum optimizer') + nesterov = params.get('nesterov', False) + optimizer = tf.keras.optimizers.SGD(learning_rate=base_learning_rate, + momentum=params['momentum'], + nesterov=nesterov) + elif optimizer_name == 'rmsprop': + logging.info('Using RMSProp') + rho = params.get('decay', None) or params.get('rho', 0.9) + momentum = params.get('momentum', 0.9) + epsilon = params.get('epsilon', 1e-07) + optimizer = tf.keras.optimizers.RMSprop(learning_rate=base_learning_rate, + rho=rho, + momentum=momentum, + epsilon=epsilon) + elif optimizer_name == 'adam': + logging.info('Using Adam') + beta_1 = params.get('beta_1', 0.9) + beta_2 = params.get('beta_2', 0.999) + epsilon = params.get('epsilon', 1e-07) + optimizer = tf.keras.optimizers.Adam(learning_rate=base_learning_rate, + beta_1=beta_1, + beta_2=beta_2, + epsilon=epsilon) + elif optimizer_name == 'adamw': + logging.info('Using AdamW') + weight_decay = params.get('weight_decay', 0.01) + beta_1 = params.get('beta_1', 0.9) + beta_2 = params.get('beta_2', 0.999) + epsilon = params.get('epsilon', 1e-07) + optimizer = tfa.optimizers.AdamW(weight_decay=weight_decay, + learning_rate=base_learning_rate, + beta_1=beta_1, + beta_2=beta_2, + epsilon=epsilon) + else: + raise ValueError('Unknown optimizer %s' % optimizer_name) + + if params.get('lookahead', None): + logging.info('Using lookahead optimizer.') + optimizer = tfa.optimizers.Lookahead(optimizer) + + # Moving average should be applied last, as it's applied at test time + moving_average_decay = params.get('moving_average_decay', 0.) + if moving_average_decay is not None and moving_average_decay > 0.: + logging.info('Including moving average decay.') + optimizer = MovingAverage( + optimizer, + average_decay=moving_average_decay) + return optimizer + + +def build_learning_rate(params: base_configs.LearningRateConfig, + batch_size: int = None, + train_steps: int = None): + """Build the learning rate given the provided configuration.""" + decay_type = params.name + base_lr = params.initial_lr + decay_rate = params.decay_rate + if params.decay_epochs is not None: + decay_steps = params.decay_epochs * train_steps + else: + decay_steps = 0 + if params.warmup_epochs is not None: + warmup_steps = params.warmup_epochs * train_steps + else: + warmup_steps = 0 + + lr_multiplier = params.scale_by_batch_size + + if lr_multiplier and lr_multiplier > 0: + # Scale the learning rate based on the batch size and a multiplier + base_lr *= lr_multiplier * batch_size + logging.info('Scaling the learning rate based on the batch size ' + 'multiplier. New base_lr: %f', base_lr) + + if decay_type == 'exponential': + logging.info('Using exponential learning rate with: ' + 'initial_learning_rate: %f, decay_steps: %d, ' + 'decay_rate: %f', base_lr, decay_steps, decay_rate) + lr = tf.keras.optimizers.schedules.ExponentialDecay( + initial_learning_rate=base_lr, + decay_steps=decay_steps, + decay_rate=decay_rate, + staircase=params.staircase) + elif decay_type == 'piecewise_constant_with_warmup': + logging.info('Using Piecewise constant decay with warmup. ' + 'Parameters: batch_size: %d, epoch_size: %d, ' + 'warmup_epochs: %d, boundaries: %s, multipliers: %s', + batch_size, params.examples_per_epoch, + params.warmup_epochs, params.boundaries, + params.multipliers) + lr = learning_rate.PiecewiseConstantDecayWithWarmup( + batch_size=batch_size, + epoch_size=params.examples_per_epoch, + warmup_epochs=params.warmup_epochs, + boundaries=params.boundaries, + multipliers=params.multipliers) + if warmup_steps > 0: + if decay_type != 'piecewise_constant_with_warmup': + logging.info('Applying %d warmup steps to the learning rate', + warmup_steps) + lr = learning_rate.WarmupDecaySchedule(lr, warmup_steps) + return lr diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory_test.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory_test.py new file mode 100644 index 0000000..da16155 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/optimizer_factory_test.py @@ -0,0 +1,114 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for optimizer_factory.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf + +from absl.testing import parameterized +from official.vision.image_classification import optimizer_factory +from official.vision.image_classification.configs import base_configs + + +class OptimizerFactoryTest(tf.test.TestCase, parameterized.TestCase): + + @parameterized.named_parameters( + ('sgd', 'sgd', 0., False), + ('momentum', 'momentum', 0., False), + ('rmsprop', 'rmsprop', 0., False), + ('adam', 'adam', 0., False), + ('adamw', 'adamw', 0., False), + ('momentum_lookahead', 'momentum', 0., True), + ('sgd_ema', 'sgd', 0.999, False), + ('momentum_ema', 'momentum', 0.999, False), + ('rmsprop_ema', 'rmsprop', 0.999, False)) + def test_optimizer(self, optimizer_name, moving_average_decay, lookahead): + """Smoke test to be sure no syntax errors.""" + params = { + 'learning_rate': 0.001, + 'rho': 0.09, + 'momentum': 0., + 'epsilon': 1e-07, + 'moving_average_decay': moving_average_decay, + 'lookahead': lookahead, + } + optimizer = optimizer_factory.build_optimizer( + optimizer_name=optimizer_name, + base_learning_rate=params['learning_rate'], + params=params) + self.assertTrue(issubclass(type(optimizer), tf.keras.optimizers.Optimizer)) + + def test_unknown_optimizer(self): + with self.assertRaises(ValueError): + optimizer_factory.build_optimizer( + optimizer_name='this_optimizer_does_not_exist', + base_learning_rate=None, + params=None) + + def test_learning_rate_without_decay_or_warmups(self): + params = base_configs.LearningRateConfig( + name='exponential', + initial_lr=0.01, + decay_rate=0.01, + decay_epochs=None, + warmup_epochs=None, + scale_by_batch_size=0.01, + examples_per_epoch=1, + boundaries=[0], + multipliers=[0, 1]) + batch_size = 1 + train_steps = 1 + + lr = optimizer_factory.build_learning_rate( + params=params, + batch_size=batch_size, + train_steps=train_steps) + self.assertTrue( + issubclass( + type(lr), tf.keras.optimizers.schedules.LearningRateSchedule)) + + @parameterized.named_parameters( + ('exponential', 'exponential'), + ('piecewise_constant_with_warmup', 'piecewise_constant_with_warmup')) + def test_learning_rate_with_decay_and_warmup(self, lr_decay_type): + """Basic smoke test for syntax.""" + params = base_configs.LearningRateConfig( + name=lr_decay_type, + initial_lr=0.01, + decay_rate=0.01, + decay_epochs=1, + warmup_epochs=1, + scale_by_batch_size=0.01, + examples_per_epoch=1, + boundaries=[0], + multipliers=[0, 1]) + batch_size = 1 + train_steps = 1 + + lr = optimizer_factory.build_learning_rate( + params=params, + batch_size=batch_size, + train_steps=train_steps) + self.assertTrue( + issubclass( + type(lr), tf.keras.optimizers.schedules.LearningRateSchedule)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/preprocessing.py new file mode 100644 index 0000000..3f20191 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/preprocessing.py @@ -0,0 +1,391 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Preprocessing functions for images.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import tensorflow as tf +from typing import List, Optional, Text, Tuple + +from official.vision.image_classification import augment + + +# Calculated from the ImageNet training set +MEAN_RGB = (0.485 * 255, 0.456 * 255, 0.406 * 255) +STDDEV_RGB = (0.229 * 255, 0.224 * 255, 0.225 * 255) + +IMAGE_SIZE = 224 +CROP_PADDING = 32 + + +def mean_image_subtraction( + image_bytes: tf.Tensor, + means: Tuple[float, ...], + num_channels: int = 3, + dtype: tf.dtypes.DType = tf.float32, +) -> tf.Tensor: + """Subtracts the given means from each image channel. + + For example: + means = [123.68, 116.779, 103.939] + image_bytes = mean_image_subtraction(image_bytes, means) + + Note that the rank of `image` must be known. + + Args: + image_bytes: a tensor of size [height, width, C]. + means: a C-vector of values to subtract from each channel. + num_channels: number of color channels in the image that will be distorted. + dtype: the dtype to convert the images to. Set to `None` to skip conversion. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `means`. + """ + if image_bytes.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + + if len(means) != num_channels: + raise ValueError('len(means) must match the number of channels') + + # We have a 1-D tensor of means; convert to 3-D. + # Note(b/130245863): we explicitly call `broadcast` instead of simply + # expanding dimensions for better performance. + means = tf.broadcast_to(means, tf.shape(image_bytes)) + if dtype is not None: + means = tf.cast(means, dtype=dtype) + + return image_bytes - means + + +def standardize_image( + image_bytes: tf.Tensor, + stddev: Tuple[float, ...], + num_channels: int = 3, + dtype: tf.dtypes.DType = tf.float32, +) -> tf.Tensor: + """Divides the given stddev from each image channel. + + For example: + stddev = [123.68, 116.779, 103.939] + image_bytes = standardize_image(image_bytes, stddev) + + Note that the rank of `image` must be known. + + Args: + image_bytes: a tensor of size [height, width, C]. + stddev: a C-vector of values to divide from each channel. + num_channels: number of color channels in the image that will be distorted. + dtype: the dtype to convert the images to. Set to `None` to skip conversion. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `stddev`. + """ + if image_bytes.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + + if len(stddev) != num_channels: + raise ValueError('len(stddev) must match the number of channels') + + # We have a 1-D tensor of stddev; convert to 3-D. + # Note(b/130245863): we explicitly call `broadcast` instead of simply + # expanding dimensions for better performance. + stddev = tf.broadcast_to(stddev, tf.shape(image_bytes)) + if dtype is not None: + stddev = tf.cast(stddev, dtype=dtype) + + return image_bytes / stddev + + +def normalize_images(features: tf.Tensor, + mean_rgb: Tuple[float, ...] = MEAN_RGB, + stddev_rgb: Tuple[float, ...] = STDDEV_RGB, + num_channels: int = 3, + dtype: tf.dtypes.DType = tf.float32, + data_format: Text = 'channels_last') -> tf.Tensor: + """Normalizes the input image channels with the given mean and stddev. + + Args: + features: `Tensor` representing decoded images in float format. + mean_rgb: the mean of the channels to subtract. + stddev_rgb: the stddev of the channels to divide. + num_channels: the number of channels in the input image tensor. + dtype: the dtype to convert the images to. Set to `None` to skip conversion. + data_format: the format of the input image tensor + ['channels_first', 'channels_last']. + + Returns: + A normalized image `Tensor`. + """ + # TODO(allencwang) - figure out how to use mean_image_subtraction and + # standardize_image on batches of images and replace the following. + if data_format == 'channels_first': + stats_shape = [num_channels, 1, 1] + else: + stats_shape = [1, 1, num_channels] + + if dtype is not None: + features = tf.image.convert_image_dtype(features, dtype=dtype) + + if mean_rgb is not None: + mean_rgb = tf.constant(mean_rgb, + shape=stats_shape, + dtype=features.dtype) + mean_rgb = tf.broadcast_to(mean_rgb, tf.shape(features)) + features = features - mean_rgb + + if stddev_rgb is not None: + stddev_rgb = tf.constant(stddev_rgb, + shape=stats_shape, + dtype=features.dtype) + stddev_rgb = tf.broadcast_to(stddev_rgb, tf.shape(features)) + features = features / stddev_rgb + + return features + + +def decode_and_center_crop(image_bytes: tf.Tensor, + image_size: int = IMAGE_SIZE, + crop_padding: int = CROP_PADDING) -> tf.Tensor: + """Crops to center of image with padding then scales image_size. + + Args: + image_bytes: `Tensor` representing an image binary of arbitrary size. + image_size: image height/width dimension. + crop_padding: the padding size to use when centering the crop. + + Returns: + A decoded and cropped image `Tensor`. + """ + decoded = image_bytes.dtype != tf.string + shape = (tf.shape(image_bytes) if decoded + else tf.image.extract_jpeg_shape(image_bytes)) + image_height = shape[0] + image_width = shape[1] + + padded_center_crop_size = tf.cast( + ((image_size / (image_size + crop_padding)) * + tf.cast(tf.minimum(image_height, image_width), tf.float32)), + tf.int32) + + offset_height = ((image_height - padded_center_crop_size) + 1) // 2 + offset_width = ((image_width - padded_center_crop_size) + 1) // 2 + crop_window = tf.stack([offset_height, offset_width, + padded_center_crop_size, padded_center_crop_size]) + if decoded: + image = tf.image.crop_to_bounding_box( + image_bytes, + offset_height=offset_height, + offset_width=offset_width, + target_height=padded_center_crop_size, + target_width=padded_center_crop_size) + else: + image = tf.image.decode_and_crop_jpeg(image_bytes, crop_window, channels=3) + + image = resize_image(image_bytes=image, + height=image_size, + width=image_size) + + return image + + +def decode_crop_and_flip(image_bytes: tf.Tensor) -> tf.Tensor: + """Crops an image to a random part of the image, then randomly flips. + + Args: + image_bytes: `Tensor` representing an image binary of arbitrary size. + + Returns: + A decoded and cropped image `Tensor`. + + """ + decoded = image_bytes.dtype != tf.string + bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4]) + shape = (tf.shape(image_bytes) if decoded + else tf.image.extract_jpeg_shape(image_bytes)) + sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( + shape, + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=[0.75, 1.33], + area_range=[0.05, 1.0], + max_attempts=100, + use_image_if_no_bounding_boxes=True) + bbox_begin, bbox_size, _ = sample_distorted_bounding_box + + # Reassemble the bounding box in the format the crop op requires. + offset_height, offset_width, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_height, offset_width, + target_height, target_width]) + if decoded: + cropped = tf.image.crop_to_bounding_box( + image_bytes, + offset_height=offset_height, + offset_width=offset_width, + target_height=target_height, + target_width=target_width) + else: + cropped = tf.image.decode_and_crop_jpeg(image_bytes, + crop_window, + channels=3) + + # Flip to add a little more random distortion in. + cropped = tf.image.random_flip_left_right(cropped) + return cropped + + +def resize_image(image_bytes: tf.Tensor, + height: int = IMAGE_SIZE, + width: int = IMAGE_SIZE) -> tf.Tensor: + """Resizes an image to a given height and width. + + Args: + image_bytes: `Tensor` representing an image binary of arbitrary size. + height: image height dimension. + width: image width dimension. + + Returns: + A tensor containing the resized image. + + """ + return tf.compat.v1.image.resize( + image_bytes, [height, width], method=tf.image.ResizeMethod.BILINEAR, + align_corners=False) + + +def preprocess_for_eval( + image_bytes: tf.Tensor, + image_size: int = IMAGE_SIZE, + num_channels: int = 3, + mean_subtract: bool = False, + standardize: bool = False, + dtype: tf.dtypes.DType = tf.float32 +) -> tf.Tensor: + """Preprocesses the given image for evaluation. + + Args: + image_bytes: `Tensor` representing an image binary of arbitrary size. + image_size: image height/width dimension. + num_channels: number of image input channels. + mean_subtract: whether or not to apply mean subtraction. + standardize: whether or not to apply standardization. + dtype: the dtype to convert the images to. Set to `None` to skip conversion. + + Returns: + A preprocessed and normalized image `Tensor`. + """ + images = decode_and_center_crop(image_bytes, image_size) + images = tf.reshape(images, [image_size, image_size, num_channels]) + + if mean_subtract: + images = mean_image_subtraction(image_bytes=images, means=MEAN_RGB) + if standardize: + images = standardize_image(image_bytes=images, stddev=STDDEV_RGB) + if dtype is not None: + images = tf.image.convert_image_dtype(images, dtype=dtype) + + return images + + +def load_eval_image(filename: Text, image_size: int = IMAGE_SIZE) -> tf.Tensor: + """Reads an image from the filesystem and applies image preprocessing. + + Args: + filename: a filename path of an image. + image_size: image height/width dimension. + + Returns: + A preprocessed and normalized image `Tensor`. + """ + image_bytes = tf.io.read_file(filename) + image = preprocess_for_eval(image_bytes, image_size) + + return image + + +def build_eval_dataset(filenames: List[Text], + labels: List[int] = None, + image_size: int = IMAGE_SIZE, + batch_size: int = 1) -> tf.Tensor: + """Builds a tf.data.Dataset from a list of filenames and labels. + + Args: + filenames: a list of filename paths of images. + labels: a list of labels corresponding to each image. + image_size: image height/width dimension. + batch_size: the batch size used by the dataset + + Returns: + A preprocessed and normalized image `Tensor`. + """ + if labels is None: + labels = [0] * len(filenames) + + filenames = tf.constant(filenames) + labels = tf.constant(labels) + dataset = tf.data.Dataset.from_tensor_slices((filenames, labels)) + + dataset = dataset.map( + lambda filename, label: (load_eval_image(filename, image_size), label)) + dataset = dataset.batch(batch_size) + + return dataset + + +def preprocess_for_train(image_bytes: tf.Tensor, + image_size: int = IMAGE_SIZE, + augmenter: Optional[augment.ImageAugment] = None, + mean_subtract: bool = False, + standardize: bool = False, + dtype: tf.dtypes.DType = tf.float32) -> tf.Tensor: + """Preprocesses the given image for training. + + Args: + image_bytes: `Tensor` representing an image binary of + arbitrary size of dtype tf.uint8. + image_size: image height/width dimension. + augmenter: the image augmenter to apply. + mean_subtract: whether or not to apply mean subtraction. + standardize: whether or not to apply standardization. + dtype: the dtype to convert the images to. Set to `None` to skip conversion. + + Returns: + A preprocessed and normalized image `Tensor`. + """ + images = decode_crop_and_flip(image_bytes=image_bytes) + images = resize_image(images, height=image_size, width=image_size) + if mean_subtract: + images = mean_image_subtraction(image_bytes=images, means=MEAN_RGB) + if standardize: + images = standardize_image(image_bytes=images, stddev=STDDEV_RGB) + if augmenter is not None: + images = augmenter.distort(images) + if dtype is not None: + images = tf.image.convert_image_dtype(images, dtype) + + return images diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/README.md b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/README.md new file mode 100644 index 0000000..d5923a8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/README.md @@ -0,0 +1,129 @@ +This folder contains a compile/fit and +[custom training loop (CTL)](#resnet-custom-training-loop) implementation for +ResNet50. + +## Before you begin +Please refer to the [README](../README.md) in the parent directory for +information on setup and preparing the data. + +## ResNet (custom training loop) + +Similar to the [estimator implementation](../../../r1/resnet), the Keras +implementation has code for the ImageNet dataset. The ImageNet +version uses a ResNet50 model implemented in +[`resnet_model.py`](./resnet_model.py). + + +### Pretrained Models + +* [ResNet50 Checkpoints](https://storage.googleapis.com/cloud-tpu-checkpoints/resnet/resnet50.tar.gz) + +* ResNet50 TFHub: [feature vector](https://tfhub.dev/tensorflow/resnet_50/feature_vector/1) +and [classification](https://tfhub.dev/tensorflow/resnet_50/classification/1) + +```bash +python3 resnet_imagenet_main.py +``` + +Again, if you did not download the data to the default directory, specify the +location with the `--data_dir` flag: + +```bash +python3 resnet_imagenet_main.py --data_dir=/path/to/imagenet +``` + +There are more flag options you can specify. Here are some examples: + +- `--use_synthetic_data`: when set to true, synthetic data, rather than real +data, are used; +- `--batch_size`: the batch size used for the model; +- `--model_dir`: the directory to save the model checkpoint; +- `--train_epochs`: number of epoches to run for training the model; +- `--train_steps`: number of steps to run for training the model. We now only +support a number that is smaller than the number of batches in an epoch. +- `--skip_eval`: when set to true, evaluation as well as validation during +training is skipped + +For example, this is a typical command line to run with ImageNet data with +batch size 128 per GPU: + +```bash +python3 -m resnet_imagenet_main.py \ + --model_dir=/tmp/model_dir/something \ + --num_gpus=2 \ + --batch_size=128 \ + --train_epochs=90 \ + --train_steps=10 \ + --use_synthetic_data=false +``` + +See [`common.py`](common.py) for full list of options. + +### Using multiple GPUs + +You can train these models on multiple GPUs using `tf.distribute.Strategy` API. +You can read more about them in this +[guide](https://www.tensorflow.org/guide/distribute_strategy). + +In this example, we have made it easier to use is with just a command line flag +`--num_gpus`. By default this flag is 1 if TensorFlow is compiled with CUDA, +and 0 otherwise. + +- --num_gpus=0: Uses tf.distribute.OneDeviceStrategy with CPU as the device. +- --num_gpus=1: Uses tf.distribute.OneDeviceStrategy with GPU as the device. +- --num_gpus=2+: Uses tf.distribute.MirroredStrategy to run synchronous +distributed training across the GPUs. + +If you wish to run without `tf.distribute.Strategy`, you can do so by setting +`--distribution_strategy=off`. + +### Running on multiple GPU hosts + +You can also train these models on multiple hosts, each with GPUs, using +`tf.distribute.Strategy`. + +The easiest way to run multi-host benchmarks is to set the +[`TF_CONFIG`](https://www.tensorflow.org/guide/distributed_training#TF_CONFIG) +appropriately at each host. e.g., to run using `MultiWorkerMirroredStrategy` on +2 hosts, the `cluster` in `TF_CONFIG` should have 2 `host:port` entries, and +host `i` should have the `task` in `TF_CONFIG` set to `{"type": "worker", +"index": i}`. `MultiWorkerMirroredStrategy` will automatically use all the +available GPUs at each host. + +### Running on Cloud TPUs + +Note: This model will **not** work with TPUs on Colab. + +You can train the ResNet CTL model on Cloud TPUs using +`tf.distribute.TPUStrategy`. If you are not familiar with Cloud TPUs, it is +strongly recommended that you go through the +[quickstart](https://cloud.google.com/tpu/docs/quickstart) to learn how to +create a TPU and GCE VM. + +To run ResNet model on a TPU, you must set `--distribution_strategy=tpu` and +`--tpu=$TPU_NAME`, where `$TPU_NAME` the name of your TPU in the Cloud Console. +From a GCE VM, you can run the following command to train ResNet for one epoch +on a v2-8 or v3-8 TPU by setting `TRAIN_EPOCHS` to 1: + +```bash +python3 resnet_ctl_imagenet_main.py \ + --tpu=$TPU_NAME \ + --model_dir=$MODEL_DIR \ + --data_dir=$DATA_DIR \ + --batch_size=1024 \ + --steps_per_loop=500 \ + --train_epochs=$TRAIN_EPOCHS \ + --use_synthetic_data=false \ + --dtype=fp32 \ + --enable_eager=true \ + --enable_tensorboard=true \ + --distribution_strategy=tpu \ + --log_steps=50 \ + --single_l2_loss_op=true \ + --use_tf_function=true +``` + +To train the ResNet to convergence, run it for 90 epochs by setting +`TRAIN_EPOCHS` to 90. + +Note: `$MODEL_DIR` and `$DATA_DIR` must be GCS paths. diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/cifar_preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/cifar_preprocessing.py new file mode 100644 index 0000000..18d7fe6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/cifar_preprocessing.py @@ -0,0 +1,159 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to Cifar-10 dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +from absl import logging +import tensorflow as tf + +from official.vision.image_classification.resnet import imagenet_preprocessing + +HEIGHT = 32 +WIDTH = 32 +NUM_CHANNELS = 3 +_DEFAULT_IMAGE_BYTES = HEIGHT * WIDTH * NUM_CHANNELS +# The record is the image plus a one-byte label +_RECORD_BYTES = _DEFAULT_IMAGE_BYTES + 1 + +# TODO(tobyboyd): Change to best practice 45K(train)/5K(val)/10K(test) splits. +NUM_IMAGES = { + 'train': 50000, + 'validation': 10000, +} +_NUM_DATA_FILES = 5 +NUM_CLASSES = 10 + + +def parse_record(raw_record, is_training, dtype): + """Parses a record containing a training example of an image. + + The input record is parsed into a label and image, and the image is passed + through preprocessing steps (cropping, flipping, and so on). + + This method converts the label to one hot to fit the loss function. + + Args: + raw_record: scalar Tensor tf.string containing a serialized + Example protocol buffer. + is_training: A boolean denoting whether the input is for training. + dtype: Data type to use for input images. + + Returns: + Tuple with processed image tensor and one-hot-encoded label tensor. + """ + # Convert bytes to a vector of uint8 that is record_bytes long. + record_vector = tf.io.decode_raw(raw_record, tf.uint8) + + # The first byte represents the label, which we convert from uint8 to int32 + # and then to one-hot. + label = tf.cast(record_vector[0], tf.int32) + + # The remaining bytes after the label represent the image, which we reshape + # from [depth * height * width] to [depth, height, width]. + depth_major = tf.reshape(record_vector[1:_RECORD_BYTES], + [NUM_CHANNELS, HEIGHT, WIDTH]) + + # Convert from [depth, height, width] to [height, width, depth], and cast as + # float32. + image = tf.cast(tf.transpose(a=depth_major, perm=[1, 2, 0]), tf.float32) + + image = preprocess_image(image, is_training) + image = tf.cast(image, dtype) + + return image, label + + +def preprocess_image(image, is_training): + """Preprocess a single image of layout [height, width, depth].""" + if is_training: + # Resize the image to add four extra pixels on each side. + image = tf.image.resize_with_crop_or_pad( + image, HEIGHT + 8, WIDTH + 8) + + # Randomly crop a [HEIGHT, WIDTH] section of the image. + image = tf.image.random_crop(image, [HEIGHT, WIDTH, NUM_CHANNELS]) + + # Randomly flip the image horizontally. + image = tf.image.random_flip_left_right(image) + + # Subtract off the mean and divide by the variance of the pixels. + image = tf.image.per_image_standardization(image) + return image + + +def get_filenames(is_training, data_dir): + """Returns a list of filenames.""" + assert tf.io.gfile.exists(data_dir), ( + 'Run cifar10_download_and_extract.py first to download and extract the ' + 'CIFAR-10 data.') + + if is_training: + return [ + os.path.join(data_dir, 'data_batch_%d.bin' % i) + for i in range(1, _NUM_DATA_FILES + 1) + ] + else: + return [os.path.join(data_dir, 'test_batch.bin')] + + +def input_fn(is_training, + data_dir, + batch_size, + dtype=tf.float32, + datasets_num_private_threads=None, + parse_record_fn=parse_record, + input_context=None, + drop_remainder=False): + """Input function which provides batches for train or eval. + + Args: + is_training: A boolean denoting whether the input is for training. + data_dir: The directory containing the input data. + batch_size: The number of samples per batch. + dtype: Data type to use for images/features + datasets_num_private_threads: Number of private threads for tf.data. + parse_record_fn: Function to use for parsing the records. + input_context: A `tf.distribute.InputContext` object passed in by + `tf.distribute.Strategy`. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + + Returns: + A dataset that can be used for iteration. + """ + filenames = get_filenames(is_training, data_dir) + dataset = tf.data.FixedLengthRecordDataset(filenames, _RECORD_BYTES) + + if input_context: + logging.info( + 'Sharding the dataset: input_pipeline_id=%d num_input_pipelines=%d', + input_context.input_pipeline_id, input_context.num_input_pipelines) + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + return imagenet_preprocessing.process_record_dataset( + dataset=dataset, + is_training=is_training, + batch_size=batch_size, + shuffle_buffer=NUM_IMAGES['train'], + parse_record_fn=parse_record_fn, + dtype=dtype, + datasets_num_private_threads=datasets_num_private_threads, + drop_remainder=drop_remainder + ) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/common.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/common.py new file mode 100644 index 0000000..5aae778 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/common.py @@ -0,0 +1,398 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common util functions and classes used by both keras cifar and imagenet.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import flags +import tensorflow as tf + +from tensorflow.python.keras.optimizer_v2 import gradient_descent as gradient_descent_v2 +import tensorflow_model_optimization as tfmot +from official.utils.flags import core as flags_core +from official.utils.misc import keras_utils + +FLAGS = flags.FLAGS +BASE_LEARNING_RATE = 0.1 # This matches Jing's version. +TRAIN_TOP_1 = 'training_accuracy_top_1' +LR_SCHEDULE = [ # (multiplier, epoch to start) tuples + (1.0, 5), (0.1, 30), (0.01, 60), (0.001, 80) +] + + +class PiecewiseConstantDecayWithWarmup( + tf.keras.optimizers.schedules.LearningRateSchedule): + """Piecewise constant decay with warmup schedule.""" + + def __init__(self, batch_size, epoch_size, warmup_epochs, boundaries, + multipliers, compute_lr_on_cpu=True, name=None): + super(PiecewiseConstantDecayWithWarmup, self).__init__() + if len(boundaries) != len(multipliers) - 1: + raise ValueError('The length of boundaries must be 1 less than the ' + 'length of multipliers') + + base_lr_batch_size = 256 + steps_per_epoch = epoch_size // batch_size + + self.rescaled_lr = BASE_LEARNING_RATE * batch_size / base_lr_batch_size + self.step_boundaries = [float(steps_per_epoch) * x for x in boundaries] + self.lr_values = [self.rescaled_lr * m for m in multipliers] + self.warmup_steps = warmup_epochs * steps_per_epoch + self.compute_lr_on_cpu = compute_lr_on_cpu + self.name = name + + self.learning_rate_ops_cache = {} + + def __call__(self, step): + if tf.executing_eagerly(): + return self._get_learning_rate(step) + + # In an eager function or graph, the current implementation of optimizer + # repeatedly call and thus create ops for the learning rate schedule. To + # avoid this, we cache the ops if not executing eagerly. + graph = tf.compat.v1.get_default_graph() + if graph not in self.learning_rate_ops_cache: + if self.compute_lr_on_cpu: + with tf.device('/device:CPU:0'): + self.learning_rate_ops_cache[graph] = self._get_learning_rate(step) + else: + self.learning_rate_ops_cache[graph] = self._get_learning_rate(step) + return self.learning_rate_ops_cache[graph] + + def _get_learning_rate(self, step): + """Compute learning rate at given step.""" + with tf.compat.v1.name_scope(self.name, 'PiecewiseConstantDecayWithWarmup', + [self.rescaled_lr, self.step_boundaries, + self.lr_values, self.warmup_steps, + self.compute_lr_on_cpu]): + def warmup_lr(step): + return self.rescaled_lr * ( + tf.cast(step, tf.float32) / tf.cast(self.warmup_steps, tf.float32)) + def piecewise_lr(step): + return tf.compat.v1.train.piecewise_constant( + step, self.step_boundaries, self.lr_values) + return tf.cond(step < self.warmup_steps, + lambda: warmup_lr(step), + lambda: piecewise_lr(step)) + + def get_config(self): + return { + 'rescaled_lr': self.rescaled_lr, + 'step_boundaries': self.step_boundaries, + 'lr_values': self.lr_values, + 'warmup_steps': self.warmup_steps, + 'compute_lr_on_cpu': self.compute_lr_on_cpu, + 'name': self.name + } + + +def get_optimizer(learning_rate=0.1): + """Returns optimizer to use.""" + # The learning_rate is overwritten at the beginning of each step by callback. + return gradient_descent_v2.SGD(learning_rate=learning_rate, momentum=0.9) + + +def get_callbacks( + steps_per_epoch, + pruning_method=None, + enable_checkpoint_and_export=False, + model_dir=None): + """Returns common callbacks.""" + time_callback = keras_utils.TimeHistory( + FLAGS.batch_size, + FLAGS.log_steps, + logdir=FLAGS.model_dir if FLAGS.enable_tensorboard else None) + callbacks = [time_callback] + + if FLAGS.enable_tensorboard: + tensorboard_callback = tf.keras.callbacks.TensorBoard( + log_dir=FLAGS.model_dir) + callbacks.append(tensorboard_callback) + + if FLAGS.profile_steps: + profiler_callback = keras_utils.get_profiler_callback( + FLAGS.model_dir, + FLAGS.profile_steps, + FLAGS.enable_tensorboard, + steps_per_epoch) + callbacks.append(profiler_callback) + + is_pruning_enabled = pruning_method is not None + if is_pruning_enabled: + callbacks.append(tfmot.sparsity.keras.UpdatePruningStep()) + if model_dir is not None: + callbacks.append(tfmot.sparsity.keras.PruningSummaries( + log_dir=model_dir, profile_batch=0)) + + if enable_checkpoint_and_export: + if model_dir is not None: + ckpt_full_path = os.path.join(model_dir, 'model.ckpt-{epoch:04d}') + callbacks.append( + tf.keras.callbacks.ModelCheckpoint(ckpt_full_path, + save_weights_only=True)) + return callbacks + + +def build_stats(history, eval_output, callbacks): + """Normalizes and returns dictionary of stats. + + Args: + history: Results of the training step. Supports both categorical_accuracy + and sparse_categorical_accuracy. + eval_output: Output of the eval step. Assumes first value is eval_loss and + second value is accuracy_top_1. + callbacks: a list of callbacks which might include a time history callback + used during keras.fit. + + Returns: + Dictionary of normalized results. + """ + stats = {} + if eval_output: + stats['accuracy_top_1'] = float(eval_output[1]) + stats['eval_loss'] = float(eval_output[0]) + if history and history.history: + train_hist = history.history + # Gets final loss from training. + stats['loss'] = float(train_hist['loss'][-1]) + # Gets top_1 training accuracy. + if 'categorical_accuracy' in train_hist: + stats[TRAIN_TOP_1] = float(train_hist['categorical_accuracy'][-1]) + elif 'sparse_categorical_accuracy' in train_hist: + stats[TRAIN_TOP_1] = float(train_hist['sparse_categorical_accuracy'][-1]) + elif 'accuracy' in train_hist: + stats[TRAIN_TOP_1] = float(train_hist['accuracy'][-1]) + + if not callbacks: + return stats + + # Look for the time history callback which was used during keras.fit + for callback in callbacks: + if isinstance(callback, keras_utils.TimeHistory): + timestamp_log = callback.timestamp_log + stats['step_timestamp_log'] = timestamp_log + stats['train_finish_time'] = callback.train_finish_time + if callback.epoch_runtime_log: + stats['avg_exp_per_second'] = callback.average_examples_per_second + + return stats + + +def define_keras_flags( + dynamic_loss_scale=True, + model=False, + optimizer=False, + pretrained_filepath=False): + """Define flags for Keras models.""" + flags_core.define_base(clean=True, num_gpu=True, run_eagerly=True, + train_epochs=True, epochs_between_evals=True, + distribution_strategy=True) + flags_core.define_performance(num_parallel_calls=False, + synthetic_data=True, + dtype=True, + all_reduce_alg=True, + num_packs=True, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + dynamic_loss_scale=dynamic_loss_scale, + loss_scale=True, + fp16_implementation=True, + tf_data_experimental_slack=True, + enable_xla=True, + training_dataset_cache=True) + flags_core.define_image() + flags_core.define_benchmark() + flags_core.define_distribution() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_boolean(name='enable_eager', default=False, help='Enable eager?') + flags.DEFINE_boolean(name='skip_eval', default=False, help='Skip evaluation?') + # TODO(b/135607288): Remove this flag once we understand the root cause of + # slowdown when setting the learning phase in Keras backend. + flags.DEFINE_boolean( + name='set_learning_phase_to_train', default=True, + help='If skip eval, also set Keras learning phase to 1 (training).') + flags.DEFINE_boolean( + name='explicit_gpu_placement', default=False, + help='If not using distribution strategy, explicitly set device scope ' + 'for the Keras training loop.') + flags.DEFINE_boolean(name='use_trivial_model', default=False, + help='Whether to use a trivial Keras model.') + flags.DEFINE_boolean(name='report_accuracy_metrics', default=True, + help='Report metrics during training and evaluation.') + flags.DEFINE_boolean(name='use_tensor_lr', default=True, + help='Use learning rate tensor instead of a callback.') + flags.DEFINE_boolean( + name='enable_tensorboard', default=False, + help='Whether to enable Tensorboard callback.') + flags.DEFINE_integer( + name='train_steps', default=None, + help='The number of steps to run for training. If it is larger than ' + '# batches per epoch, then use # batches per epoch. This flag will be ' + 'ignored if train_epochs is set to be larger than 1. ') + flags.DEFINE_string( + name='profile_steps', default=None, + help='Save profiling data to model dir at given range of global steps. The ' + 'value must be a comma separated pair of positive integers, specifying ' + 'the first and last step to profile. For example, "--profile_steps=2,4" ' + 'triggers the profiler to process 3 steps, starting from the 2nd step. ' + 'Note that profiler has a non-trivial performance overhead, and the ' + 'output file can be gigantic if profiling many steps.') + flags.DEFINE_boolean( + name='batchnorm_spatial_persistent', default=True, + help='Enable the spacial persistent mode for CuDNN batch norm kernel.') + flags.DEFINE_boolean( + name='enable_get_next_as_optional', default=False, + help='Enable get_next_as_optional behavior in DistributedIterator.') + flags.DEFINE_boolean( + name='enable_checkpoint_and_export', default=False, + help='Whether to enable a checkpoint callback and export the savedmodel.') + flags.DEFINE_string( + name='tpu', default='', help='TPU address to connect to.') + flags.DEFINE_integer( + name='steps_per_loop', + default=500, + help='Number of steps per training loop. Only training step happens ' + 'inside the loop. Callbacks will not be called inside. Will be capped at ' + 'steps per epoch.') + flags.DEFINE_boolean( + name='use_tf_while_loop', + default=True, + help='Whether to build a tf.while_loop inside the training loop on the ' + 'host. Setting it to True is critical to have peak performance on ' + 'TPU.') + + if model: + flags.DEFINE_string('model', 'resnet50_v1.5', + 'Name of model preset. (mobilenet, resnet50_v1.5)') + if optimizer: + flags.DEFINE_string('optimizer', 'resnet50_default', + 'Name of optimizer preset. ' + '(mobilenet_default, resnet50_default)') + # TODO(kimjaehong): Replace as general hyper-params not only for mobilenet. + flags.DEFINE_float('initial_learning_rate_per_sample', 0.00007, + 'Initial value of learning rate per sample for ' + 'mobilenet_default.') + flags.DEFINE_float('lr_decay_factor', 0.94, + 'Learning rate decay factor for mobilenet_default.') + flags.DEFINE_float('num_epochs_per_decay', 2.5, + 'Number of epochs per decay for mobilenet_default.') + if pretrained_filepath: + flags.DEFINE_string('pretrained_filepath', '', + 'Pretrained file path.') + + +def get_synth_data(height, width, num_channels, num_classes, dtype): + """Creates a set of synthetic random data. + + Args: + height: Integer height that will be used to create a fake image tensor. + width: Integer width that will be used to create a fake image tensor. + num_channels: Integer depth that will be used to create a fake image tensor. + num_classes: Number of classes that should be represented in the fake labels + tensor + dtype: Data type for features/images. + + Returns: + A tuple of tensors representing the inputs and labels. + + """ + # Synthetic input should be within [0, 255]. + inputs = tf.random.truncated_normal([height, width, num_channels], + dtype=dtype, + mean=127, + stddev=60, + name='synthetic_inputs') + labels = tf.random.uniform([1], + minval=0, + maxval=num_classes - 1, + dtype=tf.int32, + name='synthetic_labels') + return inputs, labels + + +def define_pruning_flags(): + """Define flags for pruning methods.""" + flags.DEFINE_string('pruning_method', None, + 'Pruning method.' + 'None (no pruning) or polynomial_decay.') + flags.DEFINE_float('pruning_initial_sparsity', 0.0, + 'Initial sparsity for pruning.') + flags.DEFINE_float('pruning_final_sparsity', 0.5, + 'Final sparsity for pruning.') + flags.DEFINE_integer('pruning_begin_step', 0, + 'Begin step for pruning.') + flags.DEFINE_integer('pruning_end_step', 100000, + 'End step for pruning.') + flags.DEFINE_integer('pruning_frequency', 100, + 'Frequency for pruning.') + + +def get_synth_input_fn(height, width, num_channels, num_classes, + dtype=tf.float32, drop_remainder=True): + """Returns an input function that returns a dataset with random data. + + This input_fn returns a data set that iterates over a set of random data and + bypasses all preprocessing, e.g. jpeg decode and copy. The host to device + copy is still included. This used to find the upper throughput bound when + tuning the full input pipeline. + + Args: + height: Integer height that will be used to create a fake image tensor. + width: Integer width that will be used to create a fake image tensor. + num_channels: Integer depth that will be used to create a fake image tensor. + num_classes: Number of classes that should be represented in the fake labels + tensor + dtype: Data type for features/images. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + + Returns: + An input_fn that can be used in place of a real one to return a dataset + that can be used for iteration. + """ + # pylint: disable=unused-argument + def input_fn(is_training, data_dir, batch_size, *args, **kwargs): + """Returns dataset filled with random data.""" + inputs, labels = get_synth_data(height=height, + width=width, + num_channels=num_channels, + num_classes=num_classes, + dtype=dtype) + # Cast to float32 for Keras model. + labels = tf.cast(labels, dtype=tf.float32) + data = tf.data.Dataset.from_tensors((inputs, labels)).repeat() + + # `drop_remainder` will make dataset produce outputs with known shapes. + data = data.batch(batch_size, drop_remainder=drop_remainder) + data = data.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return data + + return input_fn + + +def set_cudnn_batchnorm_mode(): + """Set CuDNN batchnorm mode for better performance. + + Note: Spatial Persistent mode may lead to accuracy losses for certain + models. + """ + if FLAGS.batchnorm_spatial_persistent: + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + else: + os.environ.pop('TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT', None) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/imagenet_preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/imagenet_preprocessing.py new file mode 100644 index 0000000..f1490c2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/imagenet_preprocessing.py @@ -0,0 +1,561 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images. + +Training images are sampled using the provided bounding boxes, and subsequently +cropped to the sampled bounding box. Images are additionally flipped randomly, +then resized to the target output size (without aspect-ratio preservation). + +Images used during evaluation are resized (with aspect-ratio preservation) and +centrally cropped. + +All images undergo mean color subtraction. + +Note that these steps are colloquially referred to as "ResNet preprocessing," +and they differ from "VGG preprocessing," which does not use bounding boxes +and instead does an aspect-preserving resize followed by random crop during +training. (These both differ from "Inception preprocessing," which introduces +color distortion steps.) + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +from absl import logging +import tensorflow as tf + +DEFAULT_IMAGE_SIZE = 224 +NUM_CHANNELS = 3 +NUM_CLASSES = 1001 + +NUM_IMAGES = { + 'train': 1281167, + 'validation': 50000, +} + +_NUM_TRAIN_FILES = 1024 +_SHUFFLE_BUFFER = 10000 + +_R_MEAN = 123.68 +_G_MEAN = 116.78 +_B_MEAN = 103.94 +CHANNEL_MEANS = [_R_MEAN, _G_MEAN, _B_MEAN] + +# The lower bound for the smallest side of the image for aspect-preserving +# resizing. For example, if an image is 500 x 1000, it will be resized to +# _RESIZE_MIN x (_RESIZE_MIN * 2). +_RESIZE_MIN = 256 + + +def process_record_dataset(dataset, + is_training, + batch_size, + shuffle_buffer, + parse_record_fn, + dtype=tf.float32, + datasets_num_private_threads=None, + drop_remainder=False, + tf_data_experimental_slack=False): + """Given a Dataset with raw records, return an iterator over the records. + + Args: + dataset: A Dataset representing raw records + is_training: A boolean denoting whether the input is for training. + batch_size: The number of samples per batch. + shuffle_buffer: The buffer size to use when shuffling records. A larger + value results in better randomness, but smaller values reduce startup + time and use less memory. + parse_record_fn: A function that takes a raw record and returns the + corresponding (image, label) pair. + dtype: Data type to use for images/features. + datasets_num_private_threads: Number of threads for a private + threadpool created for all datasets computation. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + Dataset of (image, label) pairs ready for iteration. + """ + # Defines a specific size thread pool for tf.data operations. + if datasets_num_private_threads: + options = tf.data.Options() + options.experimental_threading.private_threadpool_size = ( + datasets_num_private_threads) + dataset = dataset.with_options(options) + logging.info( + 'datasets_num_private_threads: %s', datasets_num_private_threads) + + if is_training: + # Shuffles records before repeating to respect epoch boundaries. + dataset = dataset.shuffle(buffer_size=shuffle_buffer) + # Repeats the dataset for the number of epochs to train. + dataset = dataset.repeat() + + # Parses the raw records into images and labels. + dataset = dataset.map( + lambda value: parse_record_fn(value, is_training, dtype), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) + + # Operations between the final prefetch and the get_next call to the iterator + # will happen synchronously during run time. We prefetch here again to + # background all of the above processing work and keep it out of the + # critical training path. Setting buffer_size to tf.data.experimental.AUTOTUNE + # allows DistributionStrategies to adjust how many batches to fetch based + # on how many devices are present. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + + options = tf.data.Options() + options.experimental_slack = tf_data_experimental_slack + dataset = dataset.with_options(options) + + return dataset + + +def get_filenames(is_training, data_dir): + """Return filenames for dataset.""" + if is_training: + return [ + os.path.join(data_dir, 'train-%05d-of-01024' % i) + for i in range(_NUM_TRAIN_FILES)] + else: + return [ + os.path.join(data_dir, 'validation-%05d-of-00128' % i) + for i in range(128)] + + +def parse_example_proto(example_serialized): + """Parses an Example proto containing a training example of an image. + + The output of the build_image_data.py image preprocessing script is a dataset + containing serialized Example protocol buffers. Each Example proto contains + the following fields (values are included as examples): + + image/height: 462 + image/width: 581 + image/colorspace: 'RGB' + image/channels: 3 + image/class/label: 615 + image/class/synset: 'n03623198' + image/class/text: 'knee pad' + image/object/bbox/xmin: 0.1 + image/object/bbox/xmax: 0.9 + image/object/bbox/ymin: 0.2 + image/object/bbox/ymax: 0.6 + image/object/bbox/label: 615 + image/format: 'JPEG' + image/filename: 'ILSVRC2012_val_00041207.JPEG' + image/encoded: + + Args: + example_serialized: scalar Tensor tf.string containing a serialized + Example protocol buffer. + + Returns: + image_buffer: Tensor tf.string containing the contents of a JPEG file. + label: Tensor tf.int32 containing the label. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + """ + # Dense features in Example proto. + feature_map = { + 'image/encoded': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.io.FixedLenFeature([], dtype=tf.int64, + default_value=-1), + 'image/class/text': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.io.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in [ + 'image/object/bbox/xmin', 'image/object/bbox/ymin', + 'image/object/bbox/xmax', 'image/object/bbox/ymax']}) + + features = tf.io.parse_single_example(serialized=example_serialized, + features=feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(a=bbox, perm=[0, 2, 1]) + + return features['image/encoded'], label, bbox + + +def parse_record(raw_record, is_training, dtype): + """Parses a record containing a training example of an image. + + The input record is parsed into a label and image, and the image is passed + through preprocessing steps (cropping, flipping, and so on). + + Args: + raw_record: scalar Tensor tf.string containing a serialized + Example protocol buffer. + is_training: A boolean denoting whether the input is for training. + dtype: data type to use for images/features. + + Returns: + Tuple with processed image tensor in a channel-last format and + one-hot-encoded label tensor. + """ + image_buffer, label, bbox = parse_example_proto(raw_record) + + image = preprocess_image( + image_buffer=image_buffer, + bbox=bbox, + output_height=DEFAULT_IMAGE_SIZE, + output_width=DEFAULT_IMAGE_SIZE, + num_channels=NUM_CHANNELS, + is_training=is_training) + image = tf.cast(image, dtype) + + # Subtract one so that labels are in [0, 1000), and cast to float32 for + # Keras model. + label = tf.cast(tf.cast(tf.reshape(label, shape=[1]), dtype=tf.int32) - 1, + dtype=tf.float32) + return image, label + + +def get_parse_record_fn(use_keras_image_data_format=False): + """Get a function for parsing the records, accounting for image format. + + This is useful by handling different types of Keras models. For instance, + the current resnet_model.resnet50 input format is always channel-last, + whereas the keras_applications mobilenet input format depends on + tf.keras.backend.image_data_format(). We should set + use_keras_image_data_format=False for the former and True for the latter. + + Args: + use_keras_image_data_format: A boolean denoting whether data format is keras + backend image data format. If False, the image format is channel-last. If + True, the image format matches tf.keras.backend.image_data_format(). + + Returns: + Function to use for parsing the records. + """ + def parse_record_fn(raw_record, is_training, dtype): + image, label = parse_record(raw_record, is_training, dtype) + if use_keras_image_data_format: + if tf.keras.backend.image_data_format() == 'channels_first': + image = tf.transpose(image, perm=[2, 0, 1]) + return image, label + return parse_record_fn + + +def input_fn(is_training, + data_dir, + batch_size, + dtype=tf.float32, + datasets_num_private_threads=None, + parse_record_fn=parse_record, + input_context=None, + drop_remainder=False, + tf_data_experimental_slack=False, + training_dataset_cache=False, + filenames=None): + """Input function which provides batches for train or eval. + + Args: + is_training: A boolean denoting whether the input is for training. + data_dir: The directory containing the input data. + batch_size: The number of samples per batch. + dtype: Data type to use for images/features + datasets_num_private_threads: Number of private threads for tf.data. + parse_record_fn: Function to use for parsing the records. + input_context: A `tf.distribute.InputContext` object passed in by + `tf.distribute.Strategy`. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + training_dataset_cache: Whether to cache the training dataset on workers. + Typically used to improve training performance when training data is in + remote storage and can fit into worker memory. + filenames: Optional field for providing the file names of the TFRecords. + + Returns: + A dataset that can be used for iteration. + """ + if filenames is None: + filenames = get_filenames(is_training, data_dir) + dataset = tf.data.Dataset.from_tensor_slices(filenames) + + if input_context: + logging.info( + 'Sharding the dataset: input_pipeline_id=%d num_input_pipelines=%d', + input_context.input_pipeline_id, input_context.num_input_pipelines) + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + if is_training: + # Shuffle the input files + dataset = dataset.shuffle(buffer_size=_NUM_TRAIN_FILES) + + # Convert to individual records. + # cycle_length = 10 means that up to 10 files will be read and deserialized in + # parallel. You may want to increase this number if you have a large number of + # CPU cores. + dataset = dataset.interleave( + tf.data.TFRecordDataset, + cycle_length=10, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + if is_training and training_dataset_cache: + # Improve training performance when training data is in remote storage and + # can fit into worker memory. + dataset = dataset.cache() + + return process_record_dataset( + dataset=dataset, + is_training=is_training, + batch_size=batch_size, + shuffle_buffer=_SHUFFLE_BUFFER, + parse_record_fn=parse_record_fn, + dtype=dtype, + datasets_num_private_threads=datasets_num_private_threads, + drop_remainder=drop_remainder, + tf_data_experimental_slack=tf_data_experimental_slack, + ) + + +def _decode_crop_and_flip(image_buffer, bbox, num_channels): + """Crops the given image to a random part of the image, and randomly flips. + + We use the fused decode_and_crop op, which performs better than the two ops + used separately in series, but note that this requires that the image be + passed in as an un-decoded string Tensor. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + num_channels: Integer depth of the image buffer for decoding. + + Returns: + 3-D tensor with cropped image. + + """ + # A large fraction of image datasets contain a human-annotated bounding box + # delineating the region of the image containing the object of interest. We + # choose to create a new bounding box for the object which is a randomly + # distorted version of the human-annotated bounding box that obeys an + # allowed range of aspect ratios, sizes and overlap with the human-annotated + # bounding box. If no box is supplied, then we assume the bounding box is + # the entire image. + sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( + tf.image.extract_jpeg_shape(image_buffer), + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=[0.75, 1.33], + area_range=[0.05, 1.0], + max_attempts=100, + use_image_if_no_bounding_boxes=True) + bbox_begin, bbox_size, _ = sample_distorted_bounding_box + + # Reassemble the bounding box in the format the crop op requires. + offset_y, offset_x, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_y, offset_x, target_height, target_width]) + + # Use the fused decode and crop op here, which is faster than each in series. + cropped = tf.image.decode_and_crop_jpeg( + image_buffer, crop_window, channels=num_channels) + + # Flip to add a little more random distortion in. + cropped = tf.image.random_flip_left_right(cropped) + return cropped + + +def _central_crop(image, crop_height, crop_width): + """Performs central crops of the given image list. + + Args: + image: a 3-D image tensor + crop_height: the height of the image following the crop. + crop_width: the width of the image following the crop. + + Returns: + 3-D tensor with cropped image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + amount_to_be_cropped_h = (height - crop_height) + crop_top = amount_to_be_cropped_h // 2 + amount_to_be_cropped_w = (width - crop_width) + crop_left = amount_to_be_cropped_w // 2 + return tf.slice( + image, [crop_top, crop_left, 0], [crop_height, crop_width, -1]) + + +def _mean_image_subtraction(image, means, num_channels): + """Subtracts the given means from each image channel. + + For example: + means = [123.68, 116.779, 103.939] + image = _mean_image_subtraction(image, means) + + Note that the rank of `image` must be known. + + Args: + image: a tensor of size [height, width, C]. + means: a C-vector of values to subtract from each channel. + num_channels: number of color channels in the image that will be distorted. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `means`. + """ + if image.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + + if len(means) != num_channels: + raise ValueError('len(means) must match the number of channels') + + # We have a 1-D tensor of means; convert to 3-D. + # Note(b/130245863): we explicitly call `broadcast` instead of simply + # expanding dimensions for better performance. + means = tf.broadcast_to(means, tf.shape(image)) + + return image - means + + +def _smallest_size_at_least(height, width, resize_min): + """Computes new shape with the smallest side equal to `smallest_side`. + + Computes new shape with the smallest side equal to `smallest_side` while + preserving the original aspect ratio. + + Args: + height: an int32 scalar tensor indicating the current height. + width: an int32 scalar tensor indicating the current width. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + new_height: an int32 scalar tensor indicating the new height. + new_width: an int32 scalar tensor indicating the new width. + """ + resize_min = tf.cast(resize_min, tf.float32) + + # Convert to floats to make subsequent calculations go smoothly. + height, width = tf.cast(height, tf.float32), tf.cast(width, tf.float32) + + smaller_dim = tf.minimum(height, width) + scale_ratio = resize_min / smaller_dim + + # Convert back to ints to make heights and widths that TF ops will accept. + new_height = tf.cast(height * scale_ratio, tf.int32) + new_width = tf.cast(width * scale_ratio, tf.int32) + + return new_height, new_width + + +def _aspect_preserving_resize(image, resize_min): + """Resize images preserving the original aspect ratio. + + Args: + image: A 3-D image `Tensor`. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + resized_image: A 3-D tensor containing the resized image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + new_height, new_width = _smallest_size_at_least(height, width, resize_min) + + return _resize_image(image, new_height, new_width) + + +def _resize_image(image, height, width): + """Simple wrapper around tf.resize_images. + + This is primarily to make sure we use the same `ResizeMethod` and other + details each time. + + Args: + image: A 3-D image `Tensor`. + height: The target height for the resized image. + width: The target width for the resized image. + + Returns: + resized_image: A 3-D tensor containing the resized image. The first two + dimensions have the shape [height, width]. + """ + return tf.compat.v1.image.resize( + image, [height, width], method=tf.image.ResizeMethod.BILINEAR, + align_corners=False) + + +def preprocess_image(image_buffer, bbox, output_height, output_width, + num_channels, is_training=False): + """Preprocesses the given image. + + Preprocessing includes decoding, cropping, and resizing for both training + and eval images. Training preprocessing, however, introduces some random + distortion of the image to improve accuracy. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + num_channels: Integer depth of the image buffer for decoding. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + + Returns: + A preprocessed image. + """ + if is_training: + # For training, we want to randomize some of the distortions. + image = _decode_crop_and_flip(image_buffer, bbox, num_channels) + image = _resize_image(image, output_height, output_width) + else: + # For validation, we want to decode, resize, then just crop the middle. + image = tf.image.decode_jpeg(image_buffer, channels=num_channels) + image = _aspect_preserving_resize(image, _RESIZE_MIN) + image = _central_crop(image, output_height, output_width) + + image.set_shape([output_height, output_width, num_channels]) + + return _mean_image_subtraction(image, CHANNEL_MEANS, num_channels) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_config.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_config.py new file mode 100644 index 0000000..d94e65a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_config.py @@ -0,0 +1,61 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Configuration definitions for ResNet losses, learning rates, and optimizers.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from typing import Any, Mapping + +import dataclasses + +from official.vision.image_classification.configs import base_configs + + +_RESNET_LR_SCHEDULE = [ # (multiplier, epoch to start) tuples + (1.0, 5), (0.1, 30), (0.01, 60), (0.001, 80) +] +_RESNET_LR_BOUNDARIES = list(p[1] for p in _RESNET_LR_SCHEDULE[1:]) +_RESNET_LR_MULTIPLIERS = list(p[0] for p in _RESNET_LR_SCHEDULE) +_RESNET_LR_WARMUP_EPOCHS = _RESNET_LR_SCHEDULE[0][1] + + +@dataclasses.dataclass +class ResNetModelConfig(base_configs.ModelConfig): + """Configuration for the ResNet model.""" + name: str = 'ResNet' + num_classes: int = 1000 + model_params: Mapping[str, Any] = dataclasses.field(default_factory=lambda: { + 'num_classes': 1000, + 'batch_size': None, + 'use_l2_regularizer': True, + 'rescale_inputs': False, + }) + loss: base_configs.LossConfig = base_configs.LossConfig( + name='sparse_categorical_crossentropy') + optimizer: base_configs.OptimizerConfig = base_configs.OptimizerConfig( + name='momentum', + decay=0.9, + epsilon=0.001, + momentum=0.9, + moving_average_decay=None) + learning_rate: base_configs.LearningRateConfig = ( + base_configs.LearningRateConfig( + name='piecewise_constant_with_warmup', + examples_per_epoch=1281167, + warmup_epochs=_RESNET_LR_WARMUP_EPOCHS, + boundaries=_RESNET_LR_BOUNDARIES, + multipliers=_RESNET_LR_MULTIPLIERS)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_ctl_imagenet_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_ctl_imagenet_main.py new file mode 100644 index 0000000..b337252 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_ctl_imagenet_main.py @@ -0,0 +1,192 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the ImageNet dataset using custom training loops.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +from official.modeling import performance +from official.staging.training import controller +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.utils.misc import model_helpers +from official.vision.image_classification.resnet import common +from official.vision.image_classification.resnet import imagenet_preprocessing +from official.vision.image_classification.resnet import resnet_runnable + +flags.DEFINE_boolean(name='use_tf_function', default=True, + help='Wrap the train and test step inside a ' + 'tf.function.') +flags.DEFINE_boolean(name='single_l2_loss_op', default=False, + help='Calculate L2_loss on concatenated weights, ' + 'instead of using Keras per-layer L2 loss.') + + +def build_stats(runnable, time_callback): + """Normalizes and returns dictionary of stats. + + Args: + runnable: The module containing all the training and evaluation metrics. + time_callback: Time tracking callback instance. + + Returns: + Dictionary of normalized results. + """ + stats = {} + + if not runnable.flags_obj.skip_eval: + stats['eval_loss'] = runnable.test_loss.result().numpy() + stats['eval_acc'] = runnable.test_accuracy.result().numpy() + + stats['train_loss'] = runnable.train_loss.result().numpy() + stats['train_acc'] = runnable.train_accuracy.result().numpy() + + if time_callback: + timestamp_log = time_callback.timestamp_log + stats['step_timestamp_log'] = timestamp_log + stats['train_finish_time'] = time_callback.train_finish_time + if time_callback.epoch_runtime_log: + stats['avg_exp_per_second'] = time_callback.average_examples_per_second + + return stats + + +def get_num_train_iterations(flags_obj): + """Returns the number of training steps, train and test epochs.""" + train_steps = ( + imagenet_preprocessing.NUM_IMAGES['train'] // flags_obj.batch_size) + train_epochs = flags_obj.train_epochs + + if flags_obj.train_steps: + train_steps = min(flags_obj.train_steps, train_steps) + train_epochs = 1 + + eval_steps = ( + imagenet_preprocessing.NUM_IMAGES['validation'] // flags_obj.batch_size) + + return train_steps, train_epochs, eval_steps + + +def _steps_to_run(steps_in_current_epoch, steps_per_epoch, steps_per_loop): + """Calculates steps to run on device.""" + if steps_per_loop <= 0: + raise ValueError('steps_per_loop should be positive integer.') + if steps_per_loop == 1: + return steps_per_loop + return min(steps_per_loop, steps_per_epoch - steps_in_current_epoch) + + +def run(flags_obj): + """Run ResNet ImageNet training and eval loop using custom training loops. + + Args: + flags_obj: An object containing parsed flag values. + + Raises: + ValueError: If fp16 is passed as it is not currently supported. + + Returns: + Dictionary of training and eval stats. + """ + keras_utils.set_session_config( + enable_eager=flags_obj.enable_eager, + enable_xla=flags_obj.enable_xla) + performance.set_mixed_precision_policy(flags_core.get_tf_dtype(flags_obj)) + + # This only affects GPU. + common.set_cudnn_batchnorm_mode() + + # TODO(anj-s): Set data_format without using Keras. + data_format = flags_obj.data_format + if data_format is None: + data_format = ('channels_first' if tf.config.list_physical_devices('GPU') + else 'channels_last') + tf.keras.backend.set_image_data_format(data_format) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus, + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs, + tpu_address=flags_obj.tpu) + + per_epoch_steps, train_epochs, eval_steps = get_num_train_iterations( + flags_obj) + steps_per_loop = min(flags_obj.steps_per_loop, per_epoch_steps) + + logging.info( + 'Training %d epochs, each epoch has %d steps, ' + 'total steps: %d; Eval %d steps', train_epochs, per_epoch_steps, + train_epochs * per_epoch_steps, eval_steps) + + time_callback = keras_utils.TimeHistory( + flags_obj.batch_size, + flags_obj.log_steps, + logdir=flags_obj.model_dir if flags_obj.enable_tensorboard else None) + with distribution_utils.get_strategy_scope(strategy): + runnable = resnet_runnable.ResnetRunnable(flags_obj, time_callback, + per_epoch_steps) + + eval_interval = flags_obj.epochs_between_evals * per_epoch_steps + checkpoint_interval = ( + per_epoch_steps if flags_obj.enable_checkpoint_and_export else None) + summary_interval = per_epoch_steps if flags_obj.enable_tensorboard else None + + checkpoint_manager = tf.train.CheckpointManager( + runnable.checkpoint, + directory=flags_obj.model_dir, + max_to_keep=10, + step_counter=runnable.global_step, + checkpoint_interval=checkpoint_interval) + + resnet_controller = controller.Controller( + strategy, + runnable.train, + runnable.evaluate, + global_step=runnable.global_step, + steps_per_loop=steps_per_loop, + train_steps=per_epoch_steps * train_epochs, + checkpoint_manager=checkpoint_manager, + summary_interval=summary_interval, + eval_steps=eval_steps, + eval_interval=eval_interval) + + time_callback.on_train_begin() + resnet_controller.train(evaluate=not flags_obj.skip_eval) + time_callback.on_train_end() + + stats = build_stats(runnable, time_callback) + return stats + + +def main(_): + model_helpers.apply_clean(flags.FLAGS) + with logger.benchmark_context(flags.FLAGS): + stats = run(flags.FLAGS) + logging.info('Run stats:\n%s', stats) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + common.define_keras_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_imagenet_main.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_imagenet_main.py new file mode 100644 index 0000000..dd4f40c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_imagenet_main.py @@ -0,0 +1,305 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the ImageNet dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import app +from absl import flags +from absl import logging +import tensorflow as tf + +import tensorflow_model_optimization as tfmot +from official.modeling import performance +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.utils.misc import model_helpers +from official.vision.image_classification import test_utils +from official.vision.image_classification.resnet import common +from official.vision.image_classification.resnet import imagenet_preprocessing +from official.vision.image_classification.resnet import resnet_model + + +def run(flags_obj): + """Run ResNet ImageNet training and eval loop using native Keras APIs. + + Args: + flags_obj: An object containing parsed flag values. + + Raises: + ValueError: If fp16 is passed as it is not currently supported. + NotImplementedError: If some features are not currently supported. + + Returns: + Dictionary of training and eval stats. + """ + keras_utils.set_session_config( + enable_eager=flags_obj.enable_eager, + enable_xla=flags_obj.enable_xla) + + # Execute flag override logic for better model performance + if flags_obj.tf_gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=flags_obj.per_gpu_thread_count, + gpu_thread_mode=flags_obj.tf_gpu_thread_mode, + num_gpus=flags_obj.num_gpus, + datasets_num_private_threads=flags_obj.datasets_num_private_threads) + common.set_cudnn_batchnorm_mode() + + dtype = flags_core.get_tf_dtype(flags_obj) + performance.set_mixed_precision_policy( + flags_core.get_tf_dtype(flags_obj), + flags_core.get_loss_scale(flags_obj, default_for_fp16=128)) + + data_format = flags_obj.data_format + if data_format is None: + data_format = ('channels_first' if tf.config.list_physical_devices('GPU') + else 'channels_last') + tf.keras.backend.set_image_data_format(data_format) + + # Configures cluster spec for distribution strategy. + _ = distribution_utils.configure_cluster(flags_obj.worker_hosts, + flags_obj.task_index) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus, + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs, + tpu_address=flags_obj.tpu) + + if strategy: + # flags_obj.enable_get_next_as_optional controls whether enabling + # get_next_as_optional behavior in DistributedIterator. If true, last + # partial batch can be supported. + strategy.extended.experimental_enable_get_next_as_optional = ( + flags_obj.enable_get_next_as_optional + ) + + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + # pylint: disable=protected-access + if flags_obj.use_synthetic_data: + input_fn = common.get_synth_input_fn( + height=imagenet_preprocessing.DEFAULT_IMAGE_SIZE, + width=imagenet_preprocessing.DEFAULT_IMAGE_SIZE, + num_channels=imagenet_preprocessing.NUM_CHANNELS, + num_classes=imagenet_preprocessing.NUM_CLASSES, + dtype=dtype, + drop_remainder=True) + else: + input_fn = imagenet_preprocessing.input_fn + + # When `enable_xla` is True, we always drop the remainder of the batches + # in the dataset, as XLA-GPU doesn't support dynamic shapes. + drop_remainder = flags_obj.enable_xla + + # Current resnet_model.resnet50 input format is always channel-last. + # We use keras_application mobilenet model which input format is depends on + # the keras beckend image data format. + # This use_keras_image_data_format flags indicates whether image preprocessor + # output format should be same as the keras backend image data format or just + # channel-last format. + use_keras_image_data_format = (flags_obj.model == 'mobilenet') + train_input_dataset = input_fn( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=imagenet_preprocessing.get_parse_record_fn( + use_keras_image_data_format=use_keras_image_data_format), + datasets_num_private_threads=flags_obj.datasets_num_private_threads, + dtype=dtype, + drop_remainder=drop_remainder, + tf_data_experimental_slack=flags_obj.tf_data_experimental_slack, + training_dataset_cache=flags_obj.training_dataset_cache, + ) + + eval_input_dataset = None + if not flags_obj.skip_eval: + eval_input_dataset = input_fn( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=imagenet_preprocessing.get_parse_record_fn( + use_keras_image_data_format=use_keras_image_data_format), + dtype=dtype, + drop_remainder=drop_remainder) + + lr_schedule = common.PiecewiseConstantDecayWithWarmup( + batch_size=flags_obj.batch_size, + epoch_size=imagenet_preprocessing.NUM_IMAGES['train'], + warmup_epochs=common.LR_SCHEDULE[0][1], + boundaries=list(p[1] for p in common.LR_SCHEDULE[1:]), + multipliers=list(p[0] for p in common.LR_SCHEDULE), + compute_lr_on_cpu=True) + steps_per_epoch = ( + imagenet_preprocessing.NUM_IMAGES['train'] // flags_obj.batch_size) + + with strategy_scope: + if flags_obj.optimizer == 'resnet50_default': + optimizer = common.get_optimizer(lr_schedule) + elif flags_obj.optimizer == 'mobilenet_default': + initial_learning_rate = \ + flags_obj.initial_learning_rate_per_sample * flags_obj.batch_size + optimizer = tf.keras.optimizers.SGD( + learning_rate=tf.keras.optimizers.schedules.ExponentialDecay( + initial_learning_rate, + decay_steps=steps_per_epoch * flags_obj.num_epochs_per_decay, + decay_rate=flags_obj.lr_decay_factor, + staircase=True), + momentum=0.9) + if flags_obj.fp16_implementation == 'graph_rewrite': + # Note: when flags_obj.fp16_implementation == "graph_rewrite", dtype as + # determined by flags_core.get_tf_dtype(flags_obj) would be 'float32' + # which will ensure tf.compat.v2.keras.mixed_precision and + # tf.train.experimental.enable_mixed_precision_graph_rewrite do not double + # up. + optimizer = tf.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer) + + # TODO(hongkuny): Remove trivial model usage and move it to benchmark. + if flags_obj.use_trivial_model: + model = test_utils.trivial_model(imagenet_preprocessing.NUM_CLASSES) + elif flags_obj.model == 'resnet50_v1.5': + model = resnet_model.resnet50( + num_classes=imagenet_preprocessing.NUM_CLASSES) + elif flags_obj.model == 'mobilenet': + # TODO(kimjaehong): Remove layers attribute when minimum TF version + # support 2.0 layers by default. + model = tf.keras.applications.mobilenet.MobileNet( + weights=None, + classes=imagenet_preprocessing.NUM_CLASSES, + layers=tf.keras.layers) + if flags_obj.pretrained_filepath: + model.load_weights(flags_obj.pretrained_filepath) + + if flags_obj.pruning_method == 'polynomial_decay': + if dtype != tf.float32: + raise NotImplementedError( + 'Pruning is currently only supported on dtype=tf.float32.') + pruning_params = { + 'pruning_schedule': + tfmot.sparsity.keras.PolynomialDecay( + initial_sparsity=flags_obj.pruning_initial_sparsity, + final_sparsity=flags_obj.pruning_final_sparsity, + begin_step=flags_obj.pruning_begin_step, + end_step=flags_obj.pruning_end_step, + frequency=flags_obj.pruning_frequency), + } + model = tfmot.sparsity.keras.prune_low_magnitude(model, **pruning_params) + elif flags_obj.pruning_method: + raise NotImplementedError( + 'Only polynomial_decay is currently supported.') + + model.compile( + loss='sparse_categorical_crossentropy', + optimizer=optimizer, + metrics=(['sparse_categorical_accuracy'] + if flags_obj.report_accuracy_metrics else None), + run_eagerly=flags_obj.run_eagerly) + + train_epochs = flags_obj.train_epochs + + callbacks = common.get_callbacks( + steps_per_epoch=steps_per_epoch, + pruning_method=flags_obj.pruning_method, + enable_checkpoint_and_export=flags_obj.enable_checkpoint_and_export, + model_dir=flags_obj.model_dir) + + # if mutliple epochs, ignore the train_steps flag. + if train_epochs <= 1 and flags_obj.train_steps: + steps_per_epoch = min(flags_obj.train_steps, steps_per_epoch) + train_epochs = 1 + + num_eval_steps = ( + imagenet_preprocessing.NUM_IMAGES['validation'] // flags_obj.batch_size) + + validation_data = eval_input_dataset + if flags_obj.skip_eval: + # Only build the training graph. This reduces memory usage introduced by + # control flow ops in layers that have different implementations for + # training and inference (e.g., batch norm). + if flags_obj.set_learning_phase_to_train: + # TODO(haoyuzhang): Understand slowdown of setting learning phase when + # not using distribution strategy. + tf.keras.backend.set_learning_phase(1) + num_eval_steps = None + validation_data = None + + if not strategy and flags_obj.explicit_gpu_placement: + # TODO(b/135607227): Add device scope automatically in Keras training loop + # when not using distribition strategy. + no_dist_strat_device = tf.device('/device:GPU:0') + no_dist_strat_device.__enter__() + + history = model.fit(train_input_dataset, + epochs=train_epochs, + steps_per_epoch=steps_per_epoch, + callbacks=callbacks, + validation_steps=num_eval_steps, + validation_data=validation_data, + validation_freq=flags_obj.epochs_between_evals, + verbose=2) + + eval_output = None + if not flags_obj.skip_eval: + eval_output = model.evaluate(eval_input_dataset, + steps=num_eval_steps, + verbose=2) + + if flags_obj.pruning_method: + model = tfmot.sparsity.keras.strip_pruning(model) + if flags_obj.enable_checkpoint_and_export: + if dtype == tf.bfloat16: + logging.warning('Keras model.save does not support bfloat16 dtype.') + else: + # Keras model.save assumes a float32 input designature. + export_path = os.path.join(flags_obj.model_dir, 'saved_model') + model.save(export_path, include_optimizer=False) + + if not strategy and flags_obj.explicit_gpu_placement: + no_dist_strat_device.__exit__() + + stats = common.build_stats(history, eval_output, callbacks) + return stats + + +def define_imagenet_keras_flags(): + common.define_keras_flags( + model=True, + optimizer=True, + pretrained_filepath=True) + common.define_pruning_flags() + flags_core.set_defaults() + flags.adopt_module_key_flags(common) + + +def main(_): + model_helpers.apply_clean(flags.FLAGS) + with logger.benchmark_context(flags.FLAGS): + stats = run(flags.FLAGS) + logging.info('Run stats:\n%s', stats) + + +if __name__ == '__main__': + logging.set_verbosity(logging.INFO) + define_imagenet_keras_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_model.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_model.py new file mode 100644 index 0000000..10f1233 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_model.py @@ -0,0 +1,329 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ResNet50 model for Keras. + +Adapted from tf.keras.applications.resnet50.ResNet50(). +This is ResNet model version 1.5. + +Related papers/blogs: +- https://arxiv.org/abs/1512.03385 +- https://arxiv.org/pdf/1603.05027v2.pdf +- http://torch.ch/blog/2016/02/04/resnets.html + +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import backend +from tensorflow.python.keras import initializers +from tensorflow.python.keras import models +from tensorflow.python.keras import regularizers +from official.vision.image_classification.resnet import imagenet_preprocessing + +layers = tf.keras.layers + + +def _gen_l2_regularizer(use_l2_regularizer=True, l2_weight_decay=1e-4): + return regularizers.l2(l2_weight_decay) if use_l2_regularizer else None + + +def identity_block(input_tensor, + kernel_size, + filters, + stage, + block, + use_l2_regularizer=True, + batch_norm_decay=0.9, + batch_norm_epsilon=1e-5): + """The identity block is the block that has no conv layer at shortcut. + + Args: + input_tensor: input tensor + kernel_size: default 3, the kernel size of middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: 'a','b'..., current block label, used for generating layer names + use_l2_regularizer: whether to use L2 regularizer on Conv layer. + batch_norm_decay: Moment of batch norm layers. + batch_norm_epsilon: Epsilon of batch borm layers. + + Returns: + Output tensor for the block. + """ + filters1, filters2, filters3 = filters + if backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D( + filters1, (1, 1), + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2a')( + input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2a')( + x) + x = layers.Activation('relu')(x) + + x = layers.Conv2D( + filters2, + kernel_size, + padding='same', + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2b')( + x) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2b')( + x) + x = layers.Activation('relu')(x) + + x = layers.Conv2D( + filters3, (1, 1), + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2c')( + x) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2c')( + x) + + x = layers.add([x, input_tensor]) + x = layers.Activation('relu')(x) + return x + + +def conv_block(input_tensor, + kernel_size, + filters, + stage, + block, + strides=(2, 2), + use_l2_regularizer=True, + batch_norm_decay=0.9, + batch_norm_epsilon=1e-5): + """A block that has a conv layer at shortcut. + + Note that from stage 3, + the second conv layer at main path is with strides=(2, 2) + And the shortcut should have strides=(2, 2) as well + + Args: + input_tensor: input tensor + kernel_size: default 3, the kernel size of middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: 'a','b'..., current block label, used for generating layer names + strides: Strides for the second conv layer in the block. + use_l2_regularizer: whether to use L2 regularizer on Conv layer. + batch_norm_decay: Moment of batch norm layers. + batch_norm_epsilon: Epsilon of batch borm layers. + + Returns: + Output tensor for the block. + """ + filters1, filters2, filters3 = filters + if backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D( + filters1, (1, 1), + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2a')( + input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2a')( + x) + x = layers.Activation('relu')(x) + + x = layers.Conv2D( + filters2, + kernel_size, + strides=strides, + padding='same', + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2b')( + x) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2b')( + x) + x = layers.Activation('relu')(x) + + x = layers.Conv2D( + filters3, (1, 1), + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '2c')( + x) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '2c')( + x) + + shortcut = layers.Conv2D( + filters3, (1, 1), + strides=strides, + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name=conv_name_base + '1')( + input_tensor) + shortcut = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name=bn_name_base + '1')( + shortcut) + + x = layers.add([x, shortcut]) + x = layers.Activation('relu')(x) + return x + + +def resnet50(num_classes, + batch_size=None, + use_l2_regularizer=True, + rescale_inputs=False, + batch_norm_decay=0.9, + batch_norm_epsilon=1e-5): + """Instantiates the ResNet50 architecture. + + Args: + num_classes: `int` number of classes for image classification. + batch_size: Size of the batches for each step. + use_l2_regularizer: whether to use L2 regularizer on Conv/Dense layer. + rescale_inputs: whether to rescale inputs from 0 to 1. + batch_norm_decay: Moment of batch norm layers. + batch_norm_epsilon: Epsilon of batch borm layers. + + Returns: + A Keras model instance. + """ + input_shape = (224, 224, 3) + img_input = layers.Input(shape=input_shape, batch_size=batch_size) + if rescale_inputs: + # Hub image modules expect inputs in the range [0, 1]. This rescales these + # inputs to the range expected by the trained model. + x = layers.Lambda( + lambda x: x * 255.0 - backend.constant( + imagenet_preprocessing.CHANNEL_MEANS, + shape=[1, 1, 3], + dtype=x.dtype), + name='rescale')( + img_input) + else: + x = img_input + + if backend.image_data_format() == 'channels_first': + x = layers.Permute((3, 1, 2))(x) + bn_axis = 1 + else: # channels_last + bn_axis = 3 + + block_config = dict( + use_l2_regularizer=use_l2_regularizer, + batch_norm_decay=batch_norm_decay, + batch_norm_epsilon=batch_norm_epsilon) + x = layers.ZeroPadding2D(padding=(3, 3), name='conv1_pad')(x) + x = layers.Conv2D( + 64, (7, 7), + strides=(2, 2), + padding='valid', + use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name='conv1')( + x) + x = layers.BatchNormalization( + axis=bn_axis, + momentum=batch_norm_decay, + epsilon=batch_norm_epsilon, + name='bn_conv1')( + x) + x = layers.Activation('relu')(x) + x = layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same')(x) + + x = conv_block( + x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1), **block_config) + x = identity_block(x, 3, [64, 64, 256], stage=2, block='b', **block_config) + x = identity_block(x, 3, [64, 64, 256], stage=2, block='c', **block_config) + + x = conv_block(x, 3, [128, 128, 512], stage=3, block='a', **block_config) + x = identity_block(x, 3, [128, 128, 512], stage=3, block='b', **block_config) + x = identity_block(x, 3, [128, 128, 512], stage=3, block='c', **block_config) + x = identity_block(x, 3, [128, 128, 512], stage=3, block='d', **block_config) + + x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a', **block_config) + x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b', **block_config) + x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c', **block_config) + x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d', **block_config) + x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e', **block_config) + x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f', **block_config) + + x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a', **block_config) + x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b', **block_config) + x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c', **block_config) + + x = layers.GlobalAveragePooling2D()(x) + x = layers.Dense( + num_classes, + kernel_initializer=initializers.RandomNormal(stddev=0.01), + kernel_regularizer=_gen_l2_regularizer(use_l2_regularizer), + bias_regularizer=_gen_l2_regularizer(use_l2_regularizer), + name='fc1000')( + x) + + # A softmax that is followed by the model loss must be done cannot be done + # in float16 due to numeric issues. So we pass dtype=float32. + x = layers.Activation('softmax', dtype='float32')(x) + + # Create model. + return models.Model(img_input, x, name='resnet50') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_runnable.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_runnable.py new file mode 100644 index 0000000..fd9816f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/resnet_runnable.py @@ -0,0 +1,222 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the ImageNet dataset using custom training loops.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from official.modeling import performance +from official.staging.training import grad_utils +from official.staging.training import standard_runnable +from official.staging.training import utils +from official.utils.flags import core as flags_core +from official.vision.image_classification.resnet import common +from official.vision.image_classification.resnet import imagenet_preprocessing +from official.vision.image_classification.resnet import resnet_model + + +class ResnetRunnable(standard_runnable.StandardTrainable, + standard_runnable.StandardEvaluable): + """Implements the training and evaluation APIs for Resnet model.""" + + def __init__(self, flags_obj, time_callback, epoch_steps): + standard_runnable.StandardTrainable.__init__(self, + flags_obj.use_tf_while_loop, + flags_obj.use_tf_function) + standard_runnable.StandardEvaluable.__init__(self, + flags_obj.use_tf_function) + + self.strategy = tf.distribute.get_strategy() + self.flags_obj = flags_obj + self.dtype = flags_core.get_tf_dtype(flags_obj) + self.time_callback = time_callback + + # Input pipeline related + batch_size = flags_obj.batch_size + if batch_size % self.strategy.num_replicas_in_sync != 0: + raise ValueError( + 'Batch size must be divisible by number of replicas : {}'.format( + self.strategy.num_replicas_in_sync)) + + # As auto rebatching is not supported in + # `experimental_distribute_datasets_from_function()` API, which is + # required when cloning dataset to multiple workers in eager mode, + # we use per-replica batch size. + self.batch_size = int(batch_size / self.strategy.num_replicas_in_sync) + + if self.flags_obj.use_synthetic_data: + self.input_fn = common.get_synth_input_fn( + height=imagenet_preprocessing.DEFAULT_IMAGE_SIZE, + width=imagenet_preprocessing.DEFAULT_IMAGE_SIZE, + num_channels=imagenet_preprocessing.NUM_CHANNELS, + num_classes=imagenet_preprocessing.NUM_CLASSES, + dtype=self.dtype, + drop_remainder=True) + else: + self.input_fn = imagenet_preprocessing.input_fn + + self.model = resnet_model.resnet50( + num_classes=imagenet_preprocessing.NUM_CLASSES, + batch_size=flags_obj.batch_size, + use_l2_regularizer=not flags_obj.single_l2_loss_op) + + lr_schedule = common.PiecewiseConstantDecayWithWarmup( + batch_size=flags_obj.batch_size, + epoch_size=imagenet_preprocessing.NUM_IMAGES['train'], + warmup_epochs=common.LR_SCHEDULE[0][1], + boundaries=list(p[1] for p in common.LR_SCHEDULE[1:]), + multipliers=list(p[0] for p in common.LR_SCHEDULE), + compute_lr_on_cpu=True) + self.optimizer = common.get_optimizer(lr_schedule) + # Make sure iterations variable is created inside scope. + self.global_step = self.optimizer.iterations + + use_graph_rewrite = flags_obj.fp16_implementation == 'graph_rewrite' + if use_graph_rewrite and not flags_obj.use_tf_function: + raise ValueError('--fp16_implementation=graph_rewrite requires ' + '--use_tf_function to be true') + self.optimizer = performance.configure_optimizer( + self.optimizer, + use_float16=self.dtype == tf.float16, + use_graph_rewrite=use_graph_rewrite, + loss_scale=flags_core.get_loss_scale(flags_obj, default_for_fp16=128)) + + self.train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32) + self.train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy( + 'train_accuracy', dtype=tf.float32) + self.test_loss = tf.keras.metrics.Mean('test_loss', dtype=tf.float32) + self.test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy( + 'test_accuracy', dtype=tf.float32) + + self.checkpoint = tf.train.Checkpoint( + model=self.model, optimizer=self.optimizer) + + # Handling epochs. + self.epoch_steps = epoch_steps + self.epoch_helper = utils.EpochHelper(epoch_steps, self.global_step) + + def build_train_dataset(self): + """See base class.""" + return utils.make_distributed_dataset( + self.strategy, + self.input_fn, + is_training=True, + data_dir=self.flags_obj.data_dir, + batch_size=self.batch_size, + parse_record_fn=imagenet_preprocessing.parse_record, + datasets_num_private_threads=self.flags_obj + .datasets_num_private_threads, + dtype=self.dtype, + drop_remainder=True) + + def build_eval_dataset(self): + """See base class.""" + return utils.make_distributed_dataset( + self.strategy, + self.input_fn, + is_training=False, + data_dir=self.flags_obj.data_dir, + batch_size=self.batch_size, + parse_record_fn=imagenet_preprocessing.parse_record, + dtype=self.dtype) + + def train_loop_begin(self): + """See base class.""" + # Reset all metrics + self.train_loss.reset_states() + self.train_accuracy.reset_states() + + self._epoch_begin() + self.time_callback.on_batch_begin(self.epoch_helper.batch_index) + + def train_step(self, iterator): + """See base class.""" + + def step_fn(inputs): + """Function to run on the device.""" + images, labels = inputs + with tf.GradientTape() as tape: + logits = self.model(images, training=True) + + prediction_loss = tf.keras.losses.sparse_categorical_crossentropy( + labels, logits) + loss = tf.reduce_sum(prediction_loss) * (1.0 / + self.flags_obj.batch_size) + num_replicas = self.strategy.num_replicas_in_sync + l2_weight_decay = 1e-4 + if self.flags_obj.single_l2_loss_op: + l2_loss = l2_weight_decay * 2 * tf.add_n([ + tf.nn.l2_loss(v) + for v in self.model.trainable_variables + if 'bn' not in v.name + ]) + + loss += (l2_loss / num_replicas) + else: + loss += (tf.reduce_sum(self.model.losses) / num_replicas) + + grad_utils.minimize_using_explicit_allreduce( + tape, self.optimizer, loss, self.model.trainable_variables) + self.train_loss.update_state(loss) + self.train_accuracy.update_state(labels, logits) + + self.strategy.run(step_fn, args=(next(iterator),)) + + def train_loop_end(self): + """See base class.""" + metrics = { + 'train_loss': self.train_loss.result(), + 'train_accuracy': self.train_accuracy.result(), + } + self.time_callback.on_batch_end(self.epoch_helper.batch_index - 1) + self._epoch_end() + return metrics + + def eval_begin(self): + """See base class.""" + self.test_loss.reset_states() + self.test_accuracy.reset_states() + + def eval_step(self, iterator): + """See base class.""" + + def step_fn(inputs): + """Function to run on the device.""" + images, labels = inputs + logits = self.model(images, training=False) + loss = tf.keras.losses.sparse_categorical_crossentropy(labels, logits) + loss = tf.reduce_sum(loss) * (1.0 / self.flags_obj.batch_size) + self.test_loss.update_state(loss) + self.test_accuracy.update_state(labels, logits) + + self.strategy.run(step_fn, args=(next(iterator),)) + + def eval_end(self): + """See base class.""" + return { + 'test_loss': self.test_loss.result(), + 'test_accuracy': self.test_accuracy.result() + } + + def _epoch_begin(self): + if self.epoch_helper.epoch_begin(): + self.time_callback.on_epoch_begin(self.epoch_helper.current_epoch) + + def _epoch_end(self): + if self.epoch_helper.epoch_end(): + self.time_callback.on_epoch_end(self.epoch_helper.current_epoch) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/tfhub_export.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/tfhub_export.py new file mode 100644 index 0000000..db00173 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/resnet/tfhub_export.py @@ -0,0 +1,67 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A script to export TF-Hub SavedModel.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import os + +from absl import app +from absl import flags + +import tensorflow as tf + +from official.vision.image_classification.resnet import imagenet_preprocessing +from official.vision.image_classification.resnet import resnet_model + +FLAGS = flags.FLAGS + +flags.DEFINE_string("model_path", None, + "File path to TF model checkpoint or H5 file.") +flags.DEFINE_string("export_path", None, + "TF-Hub SavedModel destination path to export.") + + +def export_tfhub(model_path, hub_destination): + """Restores a tf.keras.Model and saves for TF-Hub.""" + model = resnet_model.resnet50( + num_classes=imagenet_preprocessing.NUM_CLASSES, rescale_inputs=True) + model.load_weights(model_path) + model.save( + os.path.join(hub_destination, "classification"), include_optimizer=False) + + # Extracts a sub-model to use pooling feature vector as model output. + image_input = model.get_layer(index=0).get_output_at(0) + feature_vector_output = model.get_layer(name="reduce_mean").get_output_at(0) + hub_model = tf.keras.Model(image_input, feature_vector_output) + + # Exports a SavedModel. + hub_model.save( + os.path.join(hub_destination, "feature-vector"), include_optimizer=False) + + +def main(argv): + if len(argv) > 1: + raise app.UsageError("Too many command-line arguments.") + + tf.enable_v2_behavior() + export_tfhub(FLAGS.model_path, FLAGS.export_path) + + +if __name__ == "__main__": + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/test_utils.py b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/test_utils.py new file mode 100644 index 0000000..a6dc91d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/code/official/vision/image_classification/test_utils.py @@ -0,0 +1,38 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test utilities for image classification tasks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from tensorflow.python.keras import backend +from tensorflow.python.keras import layers +from tensorflow.python.keras import models + + +def trivial_model(num_classes): + """Trivial model for ImageNet dataset.""" + + input_shape = (224, 224, 3) + img_input = layers.Input(shape=input_shape) + + x = layers.Lambda(lambda x: backend.reshape(x, [-1, 224 * 224 * 3]), + name='reshape')(img_input) + x = layers.Dense(1, name='fc1')(x) + x = layers.Dense(num_classes, name='fc1000')(x) + x = layers.Activation('softmax', dtype='float32')(x) + + return models.Model(img_input, x, name='trivial') diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..4619007 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/config/npu_set_env.sh @@ -0,0 +1,41 @@ +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +#export RANK_SIZE={RANK_SIZE} +#export RANK_INDEX={RANK_INDEX} +#export RANK_ID={RANK_ID} + +# profiling env + +export PROFILING_MODE=false +export PROFILING_OPTIONS=training_trace +export FP_POINT=resnet34/conv2d/Conv2Dresnet34/batch_normalization/FusedBatchNormV3_Reduce +export BP_POINT=Momentum/update_resnet34/conv2d/kernel/ApplyMomentum +export AICPU_PROFILING_MODE=false + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/run.sh new file mode 100644 index 0000000..f3d48eb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/run.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) +# 配置环境变量并调用 train 方法 +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_resnet101/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_resnet101/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export SLOG_PRINT_TO_STDOUT=0 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_resnet101.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_resnet101.log ${train_job_dir} + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +fi +wait + + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/train.sh new file mode 100644 index 0000000..e02a29c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet101/tensorflow/scripts/train.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +export REMARK_LOG_FILE=hw_resnet101.log + +mkdir -p ${currentDir%train*}/train/result/tf_resnet101/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_resnet101/training_job_${currtime}/ + + +source ${currentDir}/config/npu_set_env.sh + +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +#atlasboost_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +code_dir_path=${currentDir}/code +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path}:${code_dir_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# user env +export YAML_PATH=$3 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999002 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +export MODEL_CKPT_PATH=${train_job_dir}/${device_id}/ckpt${device_id} + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 根据单卡/多卡区分调用参数 + +if [ x"$6" == x"True" ];then + export CLUSTER=True + echo "run cluster" + python3.7 ${currentDir}/code/official/r1/resnet/imagenet_main.py \ + --device_count=${rank_size} \ + --resnet_size=101 \ + --batch_size=${batch_size} \ + --num_gpus=1 \ + --max_train_steps=${max_train_steps} \ + --cosine_lr=True \ + --dtype=fp16 \ + --label_smoothing=0.1 \ + --loss_scale=512 \ + --train_epochs=${epoches} \ + --epochs_between_evals=${epochs_between_evals} \ + --hooks=ExamplesPerSecondHook,loggingtensorhook,loggingmetrichook \ + --data_dir=${data_url} \ + --model_dir=${MODEL_CKPT_PATH} > ${train_job_dir}/train_${device_id}.log 2>&1 +else + python3.7 ${currentDir}/code/official/r1/resnet/imagenet_main.py \ + --device_count=${rank_size} \ + --resnet_size=101 \ + --batch_size=${batch_size} \ + --num_gpus=1 \ + --max_train_steps=${max_train_steps} \ + --cosine_lr=True \ + --dtype=fp16 \ + --label_smoothing=0.1 \ + --loss_scale=512 \ + --train_epochs=${epoches} \ + --epochs_between_evals=${epochs_between_evals} \ + --hooks=ExamplesPerSecondHook,loggingtensorhook,loggingmetrichook \ + --data_dir=${data_url} \ + --model_dir=${MODEL_CKPT_PATH} > ${train_job_dir}/train_${device_id}.log 2>&1 +fi + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 resnet101 train success" + echo ":::ABK 1.0.0 resnet101 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet101 train success" >> ${train_job_dir}/${device_id}/hw_resnet101.log +else + echo ":::ABK 1.0.0 resnet101 train failed" + echo ":::ABK 1.0.0 resnet101 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet101 train failed" >> ${train_job_dir}/${device_id}/hw_resnet101.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 resnet101 train total time ${hour}:${min}:${sec}" +echo ":::ABK 1.0.0 resnet101 train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnet101.log diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/README.md new file mode 100644 index 0000000..b821fd2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/README.md @@ -0,0 +1,480 @@ +# Contents + +- [ResNet Description](#resnet-description) +- [Model Architecture](#model-architecture) +- [Dataset](#dataset) +- [Features](#features) + - [Mixed Precision](#mixed-precision) +- [Environment Requirements](#environment-requirements) +- [Quick Start](#quick-start) +- [Script Description](#script-description) + - [Script and Sample Code](#script-and-sample-code) + - [Script Parameters](#script-parameters) + - [Training Process](#training-process) + - [Evaluation Process](#evaluation-process) +- [Model Description](#model-description) + - [Performance](#performance) + - [Evaluation Performance](#evaluation-performance) +- [Description of Random Situation](#description-of-random-situation) +- [ModelZoo Homepage](#modelzoo-homepage) + + +# [ResNet Description](#contents) +## Description +ResNet (residual neural network) was proposed by Kaiming He and other four Chinese of Microsoft Research Institute. Through the use of ResNet unit, it successfully trained 152 layers of neural network, and won the championship in ilsvrc2015. The error rate on top 5 was 3.57%, and the parameter quantity was lower than vggnet, so the effect was very outstanding. Traditional convolution network or full connection network will have more or less information loss. At the same time, it will lead to the disappearance or explosion of gradient, which leads to the failure of deep network training. ResNet solves this problem to a certain extent. By passing the input information to the output, the integrity of the information is protected. The whole network only needs to learn the part of the difference between input and output, which simplifies the learning objectives and difficulties.The structure of ResNet can accelerate the training of neural network very quickly, and the accuracy of the model is also greatly improved. At the same time, ResNet is very popular, even can be directly used in the concept net network. + +These are examples of training ResNet50/ResNet101/SE-ResNet50 with CIFAR-10/ImageNet2012 dataset in MindSpore.ResNet50 and ResNet101 can reference [paper 1](https://arxiv.org/pdf/1512.03385.pdf) below, and SE-ResNet50 is a variant of ResNet50 which reference [paper 2](https://arxiv.org/abs/1709.01507) and [paper 3](https://arxiv.org/abs/1812.01187) below, Training SE-ResNet50 for just 24 epochs using 8 Ascend 910, we can reach top-1 accuracy of 75.9%.(Training ResNet101 with dataset CIFAR-10 and SE-ResNet50 with CIFAR-10 is not supported yet.) + +## Paper +1.[paper](https://arxiv.org/pdf/1512.03385.pdf):Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. "Deep Residual Learning for Image Recognition" + +2.[paper](https://arxiv.org/abs/1709.01507):Jie Hu, Li Shen, Samuel Albanie, Gang Sun, Enhua Wu. "Squeeze-and-Excitation Networks" + +3.[paper](https://arxiv.org/abs/1812.01187):Tong He, Zhi Zhang, Hang Zhang, Zhongyue Zhang, Junyuan Xie, Mu Li. "Bag of Tricks for Image Classification with Convolutional Neural Networks" + +# [Model Architecture](#contents) + +The overall network architecture of ResNet is show below: +[Link](https://arxiv.org/pdf/1512.03385.pdf) + +# [Dataset](#contents) + +Dataset used: [CIFAR-10]() +- Dataset size:60,000 32*32 colorful images in 10 classes + - Train:50,000 images + - Test: 10,000 images +- Data format:binary files + - Note:Data will be processed in dataset.py +- Download the dataset, the directory structure is as follows: + +``` +├─cifar-10-batches-bin +│ +└─cifar-10-verify-bin +``` + +Dataset used: [ImageNet2012](http://www.image-net.org/) + +- Dataset size 224*224 colorful images in 1000 classes + - Train:1,281,167 images + - Test: 50,000 images +- Data format:jpeg + - Note:Data will be processed in dataset.py +- Download the dataset, the directory structure is as follows: + + ``` +└─dataset + ├─ilsvrc # train dataset + └─validation_preprocess # evaluate dataset +``` + +# [Features](#contents) + +## Mixed Precision + +The [mixed precision](https://www.mindspore.cn/tutorial/training/en/master/advanced_use/enable_mixed_precision.html) training method accelerates the deep learning neural network training process by using both the single-precision and half-precision data types, and maintains the network precision achieved by the single-precision training at the same time. Mixed precision training can accelerate the computation process, reduce memory usage, and enable a larger model or batch size to be trained on specific hardware. +For FP16 operators, if the input data type is FP32, the backend of MindSpore will automatically handle it with reduced precision. Users could check the reduced-precision operators by enabling INFO log and then searching ‘reduce precision’. + +# [Environment Requirements](#contents) + +- Hardware(Ascend/GPU) + - Prepare hardware environment with Ascend or GPU processor. If you want to try Ascend , please send the [application form](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx) to ascend@huawei.com. Once approved, you can get the resources. +- Framework + - [MindSpore](https://www.mindspore.cn/install/en) +- For more information, please check the resources below: + - [MindSpore Tutorials](https://www.mindspore.cn/tutorial/training/en/master/index.html) + - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/en/master/index.html) + + + +# [Quick Start](#contents) + +After installing MindSpore via the official website, you can start training and evaluation as follows: + +- Runing on Ascend +``` +# distributed training +Usage: sh run_distribute_train.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [RANK_TABLE_FILE] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# standalone training +Usage: sh run_standalone_train.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [DATASET_PATH] +[PRETRAINED_CKPT_PATH](optional) + +# run evaluation example +Usage: sh run_eval.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] +``` + +- Runing on GPU +``` +# distributed training example +sh run_distribute_train_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# standalone training example +sh run_standalone_train_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# infer example +sh run_eval_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] +``` + +# [Script Description](#contents) + +## [Script and Sample Code](#contents) + +```shell +. +└──resnet + ├── README.md + ├── script + ├── run_distribute_train.sh # launch ascend distributed training(8 pcs) + ├── run_parameter_server_train.sh # launch ascend parameter server training(8 pcs) + ├── run_eval.sh # launch ascend evaluation + ├── run_standalone_train.sh # launch ascend standalone training(1 pcs) + ├── run_distribute_train_gpu.sh # launch gpu distributed training(8 pcs) + ├── run_parameter_server_train_gpu.sh # launch gpu parameter server training(8 pcs) + ├── run_eval_gpu.sh # launch gpu evaluation + └── run_standalone_train_gpu.sh # launch gpu standalone training(1 pcs) + ├── src + ├── config.py # parameter configuration + ├── dataset.py # data preprocessing + ├── crossentropy.py # loss definition for ImageNet2012 dataset + ├── lr_generator.py # generate learning rate for each step + └── resnet.py # resnet backbone, including resnet50 and resnet101 and se-resnet50 + ├── eval.py # eval net + └── train.py # train net +``` + +## [Script Parameters](#contents) + +Parameters for both training and evaluation can be set in config.py. + +- Config for ResNet50, CIFAR-10 dataset + +``` +"class_num": 10, # dataset class num +"batch_size": 32, # batch size of input tensor +"loss_scale": 1024, # loss scale +"momentum": 0.9, # momentum +"weight_decay": 1e-4, # weight decay +"epoch_size": 90, # only valid for taining, which is always 1 for inference +"pretrain_epoch_size": 0, # epoch size that model has been trained before loading pretrained checkpoint, actual training epoch size is equal to epoch_size minus pretrain_epoch_size +"save_checkpoint": True, # whether save checkpoint or not +"save_checkpoint_epochs": 5, # the epoch interval between two checkpoints. By default, the last checkpoint will be saved after the last step +"keep_checkpoint_max": 10, # only keep the last keep_checkpoint_max checkpoint +"save_checkpoint_path": "./", # path to save checkpoint +"warmup_epochs": 5, # number of warmup epoch +"lr_decay_mode": "poly" # decay mode can be selected in steps, ploy and default +"lr_init": 0.01, # initial learning rate +"lr_end": 0.00001, # final learning rate +"lr_max": 0.1, # maximum learning rate +``` + +- Config for ResNet50, ImageNet2012 dataset + +``` +"class_num": 1001, # dataset class number +"batch_size": 32, # batch size of input tensor +"loss_scale": 1024, # loss scale +"momentum": 0.9, # momentum optimizer +"weight_decay": 1e-4, # weight decay +"epoch_size": 90, # only valid for taining, which is always 1 for inference +"pretrain_epoch_size": 0, # epoch size that model has been trained before loading pretrained checkpoint, actual training epoch size is equal to epoch_size minus pretrain_epoch_size +"save_checkpoint": True, # whether save checkpoint or not +"save_checkpoint_epochs": 5, # the epoch interval between two checkpoints. By default, the last checkpoint will be saved after the last epoch +"keep_checkpoint_max": 10, # only keep the last keep_checkpoint_max checkpoint +"save_checkpoint_path": "./", # path to save checkpoint relative to the executed path +"warmup_epochs": 0, # number of warmup epoch +"lr_decay_mode": "Linear", # decay mode for generating learning rate +"label_smooth": True, # label smooth +"label_smooth_factor": 0.1, # label smooth factor +"lr_init": 0, # initial learning rate +"lr_max": 0.1, # maximum learning rate +"lr_end": 0.0, # minimum learning rate +``` + +- Config for ResNet101, ImageNet2012 dataset + +``` +"class_num": 1001, # dataset class number +"batch_size": 32, # batch size of input tensor +"loss_scale": 1024, # loss scale +"momentum": 0.9, # momentum optimizer +"weight_decay": 1e-4, # weight decay +"epoch_size": 120, # epoch size for training +"pretrain_epoch_size": 0, # epoch size that model has been trained before loading pretrained checkpoint, actual training epoch size is equal to epoch_size minus pretrain_epoch_size +"save_checkpoint": True, # whether save checkpoint or not +"save_checkpoint_epochs": 5, # the epoch interval between two checkpoints. By default, the last checkpoint will be saved after the last epoch +"keep_checkpoint_max": 10, # only keep the last keep_checkpoint_max checkpoint +"save_checkpoint_path": "./", # path to save checkpoint relative to the executed path +"warmup_epochs": 0, # number of warmup epoch +"lr_decay_mode": "cosine" # decay mode for generating learning rate +"label_smooth": 1, # label_smooth +"label_smooth_factor": 0.1, # label_smooth_factor +"lr": 0.1 # base learning rate +``` + +- Config for SE-ResNet50, ImageNet2012 dataset + +``` +"class_num": 1001, # dataset class number +"batch_size": 32, # batch size of input tensor +"loss_scale": 1024, # loss scale +"momentum": 0.9, # momentum optimizer +"weight_decay": 1e-4, # weight decay +"epoch_size": 28 , # epoch size for creating learning rate +"train_epoch_size": 24 # actual train epoch size +"pretrain_epoch_size": 0, # epoch size that model has been trained before loading pretrained checkpoint, actual training epoch size is equal to epoch_size minus pretrain_epoch_size +"save_checkpoint": True, # whether save checkpoint or not +"save_checkpoint_epochs": 4, # the epoch interval between two checkpoints. By default, the last checkpoint will be saved after the last epoch +"keep_checkpoint_max": 10, # only keep the last keep_checkpoint_max checkpoint +"save_checkpoint_path": "./", # path to save checkpoint relative to the executed path +"warmup_epochs": 3, # number of warmup epoch +"lr_decay_mode": "cosine" # decay mode for generating learning rate +"label_smooth": True, # label_smooth +"label_smooth_factor": 0.1, # label_smooth_factor +"lr_init": 0.0, # initial learning rate +"lr_max": 0.3, # maximum learning rate +"lr_end": 0.0001, # end learning rate +``` + +## [Training Process](#contents) + +### Usage +#### Running on Ascend +``` +# distributed training +Usage: sh run_distribute_train.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [RANK_TABLE_FILE] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# standalone training +Usage: sh run_standalone_train.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [DATASET_PATH] +[PRETRAINED_CKPT_PATH](optional) + +# run evaluation example +Usage: sh run_eval.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] + +``` +For distributed training, a hccl configuration file with JSON format needs to be created in advance. + +Please follow the instructions in the link [hccn_tools](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools). + +Training result will be stored in the example path, whose folder name begins with "train" or "train_parallel". Under this, you can find checkpoint file together with result like the followings in log. + +#### Running on GPU + +``` +# distributed training example +sh run_distribute_train_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# standalone training example +sh run_standalone_train_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) + +# infer example +sh run_eval_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] +``` + +#### Running parameter server mode training + +- Parameter server training Ascend example + +``` +sh run_parameter_server_train.sh [resnet50|resnet101] [cifar10|imagenet2012] [RANK_TABLE_FILE] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) +``` + +- Parameter server training GPU example +``` +sh run_parameter_server_train_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [PRETRAINED_CKPT_PATH](optional) +``` + +### Result + +- Training ResNet50 with CIFAR-10 dataset + +``` +# distribute training result(8 pcs) +epoch: 1 step: 195, loss is 1.9601055 +epoch: 2 step: 195, loss is 1.8555021 +epoch: 3 step: 195, loss is 1.6707983 +epoch: 4 step: 195, loss is 1.8162166 +epoch: 5 step: 195, loss is 1.393667 +... +``` + +- Training ResNet50 with ImageNet2012 dataset + +``` +# distribute training result(8 pcs) +epoch: 1 step: 5004, loss is 4.8995576 +epoch: 2 step: 5004, loss is 3.9235563 +epoch: 3 step: 5004, loss is 3.833077 +epoch: 4 step: 5004, loss is 3.2795618 +epoch: 5 step: 5004, loss is 3.1978393 +... +``` + +- Training ResNet101 with ImageNet2012 dataset + +``` +# distribute training result(8p) +epoch: 1 step: 5004, loss is 4.805483 +epoch: 2 step: 5004, loss is 3.2121816 +epoch: 3 step: 5004, loss is 3.429647 +epoch: 4 step: 5004, loss is 3.3667371 +epoch: 5 step: 5004, loss is 3.1718972 +... +epoch: 67 step: 5004, loss is 2.2768745 +epoch: 68 step: 5004, loss is 1.7223864 +epoch: 69 step: 5004, loss is 2.0665488 +epoch: 70 step: 5004, loss is 1.8717369 +... +``` +- Training SE-ResNet50 with ImageNet2012 dataset + +``` +# distribute training result(8 pcs) +epoch: 1 step: 5004, loss is 5.1779146 +epoch: 2 step: 5004, loss is 4.139395 +epoch: 3 step: 5004, loss is 3.9240637 +epoch: 4 step: 5004, loss is 3.5011306 +epoch: 5 step: 5004, loss is 3.3501816 +... +``` + +## [Evaluation Process](#contents) + +### Usage + +#### Running on Ascend +``` +# evaluation +Usage: sh run_eval.sh [resnet50|resnet101|se-resnet50] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] +``` + +``` +# evaluation example +sh run_eval.sh resnet50 cifar10 ~/cifar10-10-verify-bin ~/resnet50_cifar10/train_parallel0/resnet-90_195.ckpt +``` + +> checkpoint can be produced in training process. + +#### Running on GPU +``` +sh run_eval_gpu.sh [resnet50|resnet101] [cifar10|imagenet2012] [DATASET_PATH] [CHECKPOINT_PATH] +``` + +### Result + +Evaluation result will be stored in the example path, whose folder name is "eval". Under this, you can find result like the followings in log. + +- Evaluating ResNet50 with CIFAR-10 dataset + +``` +result: {'acc': 0.91446314102564111} ckpt=~/resnet50_cifar10/train_parallel0/resnet-90_195.ckpt +``` + +- Evaluating ResNet50 with ImageNet2012 dataset + +``` +result: {'acc': 0.7671054737516005} ckpt=train_parallel0/resnet-90_5004.ckpt +``` + +- Evaluating ResNet101 with ImageNet2012 dataset + +``` +result: {'top_5_accuracy': 0.9429417413572343, 'top_1_accuracy': 0.7853513124199744} ckpt=train_parallel0/resnet-120_5004.ckpt +``` + +- Evaluating SE-ResNet50 with ImageNet2012 dataset + +``` +result: {'top_5_accuracy': 0.9342589628681178, 'top_1_accuracy': 0.768065781049936} ckpt=train_parallel0/resnet-24_5004.ckpt + +``` + +# [Model Description](#contents) +## [Performance](#contents) + +### Evaluation Performance + +#### ResNet50 on CIFAR-10 +| Parameters | Ascend 910 | GPU | +| -------------------------- | -------------------------------------- |---------------------------------- | +| Model Version | ResNet50-v1.5 |ResNet50-v1.5| +| Resource | Ascend 910,CPU 2.60GHz 56cores,Memory 314G | GPU(Tesla V100 SXM2),CPU 2.1GHz 24cores,Memory 128G +| uploaded Date | 04/01/2020 (month/day/year) | 08/01/2020 (month/day/year) +| MindSpore Version | 0.1.0-alpha |0.6.0-alpha | +| Dataset | CIFAR-10 | CIFAR-10 +| Training Parameters | epoch=90, steps per epoch=195, batch_size = 32 |epoch=90, steps per epoch=195, batch_size = 32 | +| Optimizer | Momentum |Momentum| +| Loss Function | Softmax Cross Entropy |Softmax Cross Entropy | +| outputs | probability | probability | +| Loss | 0.000356 | 0.000716 | +| Speed | 18.4ms/step(8pcs) |69ms/step(8pcs)| +| Total time | 6 mins | 20.2 mins| +| Parameters (M) | 25.5 | 25.5 | +| Checkpoint for Fine tuning | 179.7M (.ckpt file) |179.7M (.ckpt file)| +| Scripts | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | + +#### ResNet50 on ImageNet2012 +| Parameters | Ascend 910 | GPU | +| -------------------------- | -------------------------------------- |---------------------------------- | +| Model Version | ResNet50-v1.5 |ResNet50-v1.5| +| Resource | Ascend 910,CPU 2.60GHz 56cores,Memory 314G | GPU(Tesla V100 SXM2),CPU 2.1GHz 24cores,Memory 128G +| uploaded Date | 04/01/2020 (month/day/year) ; | 08/01/2020 (month/day/year) +| MindSpore Version | 0.1.0-alpha |0.6.0-alpha | +| Dataset | ImageNet2012 | ImageNet2012| +| Training Parameters | epoch=90, steps per epoch=5004, batch_size = 32 |epoch=90, steps per epoch=5004, batch_size = 32 | +| Optimizer | Momentum |Momentum| +| Loss Function | Softmax Cross Entropy |Softmax Cross Entropy | +| outputs | probability | probability | +| Loss | 1.8464266 | 1.9023 | +| Speed | 18.4ms/step(8pcs) |67.1ms/step(8pcs)| +| Total time | 139 mins | 500 mins| +| Parameters (M) | 25.5 | 25.5 | +| Checkpoint for Fine tuning | 197M (.ckpt file) |197M (.ckpt file) | +| Scripts | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | + +#### ResNet101 on ImageNet2012 +| Parameters | Ascend 910 | GPU | +| -------------------------- | -------------------------------------- |---------------------------------- | +| Model Version | ResNet101 |ResNet101| +| Resource | Ascend 910,CPU 2.60GHz 56cores,Memory 314G | GPU(Tesla V100 SXM2),CPU 2.1GHz 24cores,Memory 128G +| uploaded Date | 04/01/2020 (month/day/year) | 08/01/2020 (month/day/year) +| MindSpore Version | 0.1.0-alpha |0.6.0-alpha | +| Dataset | ImageNet2012 | ImageNet2012| +| Training Parameters | epoch=120, steps per epoch=5004, batch_size = 32 |epoch=120, steps per epoch=5004, batch_size = 32 | +| Optimizer | Momentum |Momentum| +| Loss Function | Softmax Cross Entropy |Softmax Cross Entropy | +| outputs | probability | probability | +| Loss | 1.6453942 | 1.7023412 | +| Speed | 30.3ms/step(8pcs) |108.6ms/step(8pcs)| +| Total time | 301 mins | 1100 mins| +| Parameters (M) | 44.6 | 44.6 | +| Checkpoint for Fine tuning | 343M (.ckpt file) |343M (.ckpt file) | +| Scripts | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | + +#### SE-ResNet50 on ImageNet2012 + +| Parameters | Ascend 910 +| -------------------------- | ------------------------------------------------------------------------ | +| Model Version | SE-ResNet50 | +| Resource | Ascend 910,CPU 2.60GHz 56cores,Memory 314G | +| uploaded Date | 08/16/2020 (month/day/year) ; | +| MindSpore Version | 0.7.0-alpha | +| Dataset | ImageNet2012 | +| Training Parameters | epoch=24, steps per epoch=5004, batch_size = 32 | +| Optimizer | Momentum | +| Loss Function | Softmax Cross Entropy | +| outputs | probability | +| Loss | 1.754404 | +| Speed | 24.6ms/step(8pcs) | +| Total time | 49.3 mins | +| Parameters (M) | 25.5 | +| Checkpoint for Fine tuning | 215.9M (.ckpt file) | +| Scripts | [Link](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/resnet) | + +# [Description of Random Situation](#contents) + +In dataset.py, we set the seed inside “create_dataset" function. We also use random seed in train.py. + + +# [ModelZoo Homepage](#contents) + Please check the official [homepage](https://gitee.com/mindspore/mindspore/tree/master/model_zoo). \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/eval.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/eval.py new file mode 100644 index 0000000..3928ea3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/eval.py @@ -0,0 +1,89 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""train resnet.""" +import os +import argparse +from mindspore import context +from mindspore.common import set_seed +from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits +from mindspore.train.model import Model +from mindspore.train.serialization import load_checkpoint, load_param_into_net +from src.CrossEntropySmooth import CrossEntropySmooth + +parser = argparse.ArgumentParser(description='Image classification') +parser.add_argument('--net', type=str, default=None, help='Resnet Model, either resnet50 or resnet101') +parser.add_argument('--dataset', type=str, default=None, help='Dataset, either cifar10 or imagenet2012') + +parser.add_argument('--checkpoint_path', type=str, default=None, help='Checkpoint file path') +parser.add_argument('--dataset_path', type=str, default=None, help='Dataset path') +parser.add_argument('--device_target', type=str, default='Ascend', help='Device target') +args_opt = parser.parse_args() + +set_seed(1) + +if args_opt.net == "resnet50": + from src.resnet import resnet50 as resnet + if args_opt.dataset == "cifar10": + from src.config import config1 as config + from src.dataset import create_dataset1 as create_dataset + else: + from src.config import config2 as config + from src.dataset import create_dataset2 as create_dataset +elif args_opt.net == "resnet101": + from src.resnet import resnet101 as resnet + from src.config import config3 as config + from src.dataset import create_dataset3 as create_dataset +else: + from src.resnet import se_resnet50 as resnet + from src.config import config4 as config + from src.dataset import create_dataset4 as create_dataset + +if __name__ == '__main__': + target = args_opt.device_target + + # init context + context.set_context(mode=context.GRAPH_MODE, device_target=target, save_graphs=False) + if target != "GPU": + device_id = int(os.getenv('DEVICE_ID')) + context.set_context(device_id=device_id) + + # create dataset + dataset = create_dataset(dataset_path=args_opt.dataset_path, do_train=False, batch_size=config.batch_size, + target=target) + step_size = dataset.get_dataset_size() + + # define net + net = resnet(class_num=config.class_num) + + # load checkpoint + param_dict = load_checkpoint(args_opt.checkpoint_path) + load_param_into_net(net, param_dict) + net.set_train(False) + + # define loss, model + if args_opt.dataset == "imagenet2012": + if not config.use_label_smooth: + config.label_smooth_factor = 0.0 + loss = CrossEntropySmooth(sparse=True, reduction='mean', + smooth_factor=config.label_smooth_factor, num_classes=config.class_num) + else: + loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') + + # define model + model = Model(net, loss_fn=loss, metrics={'top_1_accuracy', 'top_5_accuracy'}) + + # eval model + res = model.eval(dataset) + print("result:", res, "ckpt=", args_opt.checkpoint_path) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/mindspore_hub_conf.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/mindspore_hub_conf.py new file mode 100644 index 0000000..e9ffe87 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/mindspore_hub_conf.py @@ -0,0 +1,25 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""hub config.""" +from src.resnet import resnet50, resnet101, se_resnet50 + +def create_network(name, *args, **kwargs): + if name == 'resnet50': + return resnet50(*args, **kwargs) + if name == 'resnet101': + return resnet101(*args, **kwargs) + if name == 'se_resnet50': + return se_resnet50(*args, **kwargs) + raise NotImplementedError(f"{name} is not implemented in the repo") diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/CrossEntropySmooth.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/CrossEntropySmooth.py new file mode 100644 index 0000000..bf38c6e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/CrossEntropySmooth.py @@ -0,0 +1,38 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""define loss function for network""" +import mindspore.nn as nn +from mindspore import Tensor +from mindspore.common import dtype as mstype +from mindspore.nn.loss.loss import _Loss +from mindspore.ops import functional as F +from mindspore.ops import operations as P + + +class CrossEntropySmooth(_Loss): + """CrossEntropy""" + def __init__(self, sparse=True, reduction='mean', smooth_factor=0., num_classes=1000): + super(CrossEntropySmooth, self).__init__() + self.onehot = P.OneHot() + self.sparse = sparse + self.on_value = Tensor(1.0 - smooth_factor, mstype.float32) + self.off_value = Tensor(1.0 * smooth_factor / (num_classes - 1), mstype.float32) + self.ce = nn.SoftmaxCrossEntropyWithLogits(reduction=reduction) + + def construct(self, logit, label): + if self.sparse: + label = self.onehot(label, F.shape(logit)[1], self.on_value, self.off_value) + loss = self.ce(logit, label) + return loss diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/config.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/config.py new file mode 100644 index 0000000..83e2fc4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/config.py @@ -0,0 +1,106 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +""" +network config setting, will be used in train.py and eval.py +""" +from easydict import EasyDict as ed + + +# config for resnet50, imagenet2012 +config2 = ed({ + 'class_num': 1001, + 'batch_size': 256, + 'loss_scale': 1024, + 'momentum': 0.9, + 'weight_decay': 1e-4, + 'epoch_size': 5, + 'pretrain_epoch_size': 0, + 'save_checkpoint': True, + 'save_checkpoint_epochs': 5, + 'keep_checkpoint_max': 10, + 'save_checkpoint_path': './', + 'warmup_epochs': 0, + 'lr_decay_mode': 'linear', + 'use_label_smooth': True, + 'label_smooth_factor': 0.1, + 'lr_init': 0, + 'lr_max': 0.8, + 'lr_end': 0.0 +}) + + +# config for resent50, cifar10 +config1 = ed({ + 'class_num': 10, + 'batch_size': 32, + 'loss_scale': 1024, + 'momentum': 0.9, + 'weight_decay': 1e-4, + 'epoch_size': 90, + 'pretrain_epoch_size': 0, + 'save_checkpoint': True, + 'save_checkpoint_epochs': 5, + 'keep_checkpoint_max': 10, + 'save_checkpoint_path': './', + 'warmup_epochs': 5, + 'lr_decay_mode': 'poly', + 'lr_init': 0.01, + 'lr_end': 0.00001, + 'lr_max': 0.1 +}) + + +# config for resent101, imagenet2012 +config3 = ed({ + 'class_num': 1001, + 'batch_size': 32, + 'loss_scale': 1024, + 'momentum': 0.9, + 'weight_decay': 1e-4, + 'epoch_size': 120, + 'pretrain_epoch_size': 0, + 'save_checkpoint': True, + 'save_checkpoint_epochs': 5, + 'keep_checkpoint_max': 10, + 'save_checkpoint_path': './', + 'warmup_epochs': 0, + 'lr_decay_mode': 'cosine', + 'use_label_smooth': True, + 'label_smooth_factor': 0.1, + 'lr': 0.1 +}) + +# config for se-resnet50, imagenet2012 +config4 = ed({ + 'class_num': 1001, + 'batch_size': 32, + 'loss_scale': 1024, + 'momentum': 0.9, + 'weight_decay': 1e-4, + 'epoch_size': 28, + 'train_epoch_size': 24, + 'pretrain_epoch_size': 0, + 'save_checkpoint': True, + 'save_checkpoint_epochs': 4, + 'keep_checkpoint_max': 10, + 'save_checkpoint_path': './', + 'warmup_epochs': 3, + 'lr_decay_mode': 'cosine', + 'use_label_smooth': True, + 'label_smooth_factor': 0.1, + 'lr_init': 0.0, + 'lr_max': 0.3, + 'lr_end': 0.0001 +}) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/dataset.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/dataset.py new file mode 100644 index 0000000..cfc503a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/dataset.py @@ -0,0 +1,263 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +""" +create train or eval dataset. +""" +import os +import mindspore.common.dtype as mstype +import mindspore.dataset.engine as de +import mindspore.dataset.vision.c_transforms as C +import mindspore.dataset.transforms.c_transforms as C2 +from mindspore.communication.management import init, get_rank, get_group_size + + +def create_dataset1(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend"): + """ + create a train or evaluate cifar10 dataset for resnet50 + Args: + dataset_path(string): the path of dataset. + do_train(bool): whether dataset is used for train or eval. + repeat_num(int): the repeat times of dataset. Default: 1 + batch_size(int): the batch size of dataset. Default: 32 + target(str): the device target. Default: Ascend + + Returns: + dataset + """ + if target == "Ascend": + device_num, rank_id = _get_rank_info() + else: + init() + rank_id = get_rank() + device_num = get_group_size() + + if device_num == 1: + ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True) + else: + ds = de.Cifar10Dataset(dataset_path, num_parallel_workers=8, shuffle=True, + num_shards=device_num, shard_id=rank_id) + + # define map operations + trans = [] + if do_train: + trans += [ + C.RandomCrop((32, 32), (4, 4, 4, 4)), + C.RandomHorizontalFlip(prob=0.5) + ] + + trans += [ + C.Resize((224, 224)), + C.Rescale(1.0 / 255.0, 0.0), + C.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010]), + C.HWC2CHW() + ] + + type_cast_op = C2.TypeCast(mstype.int32) + + ds = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8) + ds = ds.map(operations=trans, input_columns="image", num_parallel_workers=8) + + # apply batch operations + ds = ds.batch(batch_size, drop_remainder=True) + # apply dataset repeat operation + ds = ds.repeat(repeat_num) + + return ds + + +def create_dataset2(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend"): + """ + create a train or eval imagenet2012 dataset for resnet50 + + Args: + dataset_path(string): the path of dataset. + do_train(bool): whether dataset is used for train or eval. + repeat_num(int): the repeat times of dataset. Default: 1 + batch_size(int): the batch size of dataset. Default: 32 + target(str): the device target. Default: Ascend + + Returns: + dataset + """ + if target == "Ascend": + device_num, rank_id = _get_rank_info() + else: + init() + rank_id = get_rank() + device_num = get_group_size() + + if device_num == 1: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True) + else: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True, + num_shards=device_num, shard_id=rank_id) + + image_size = 224 + mean = [0.485 * 255, 0.456 * 255, 0.406 * 255] + std = [0.229 * 255, 0.224 * 255, 0.225 * 255] + + # define map operations + if do_train: + trans = [ + C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), + C.RandomHorizontalFlip(prob=0.5), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + else: + trans = [ + C.Decode(), + C.Resize(256), + C.CenterCrop(image_size), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + + type_cast_op = C2.TypeCast(mstype.int32) + + ds = ds.map(operations=trans, input_columns="image", num_parallel_workers=8) + ds = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8) + + # apply batch operations + ds = ds.batch(batch_size, drop_remainder=True) + + # apply dataset repeat operation + ds = ds.repeat(repeat_num) + + return ds + + +def create_dataset3(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend"): + """ + create a train or eval imagenet2012 dataset for resnet101 + Args: + dataset_path(string): the path of dataset. + do_train(bool): whether dataset is used for train or eval. + repeat_num(int): the repeat times of dataset. Default: 1 + batch_size(int): the batch size of dataset. Default: 32 + + Returns: + dataset + """ + device_num, rank_id = _get_rank_info() + + if device_num == 1: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True) + else: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True, + num_shards=device_num, shard_id=rank_id) + image_size = 224 + mean = [0.475 * 255, 0.451 * 255, 0.392 * 255] + std = [0.275 * 255, 0.267 * 255, 0.278 * 255] + + # define map operations + if do_train: + trans = [ + C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), + C.RandomHorizontalFlip(rank_id / (rank_id + 1)), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + else: + trans = [ + C.Decode(), + C.Resize(256), + C.CenterCrop(image_size), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + + type_cast_op = C2.TypeCast(mstype.int32) + + ds = ds.map(operations=trans, input_columns="image", num_parallel_workers=8) + ds = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8) + + # apply batch operations + ds = ds.batch(batch_size, drop_remainder=True) + # apply dataset repeat operation + ds = ds.repeat(repeat_num) + + return ds + + +def create_dataset4(dataset_path, do_train, repeat_num=1, batch_size=32, target="Ascend"): + """ + create a train or eval imagenet2012 dataset for se-resnet50 + + Args: + dataset_path(string): the path of dataset. + do_train(bool): whether dataset is used for train or eval. + repeat_num(int): the repeat times of dataset. Default: 1 + batch_size(int): the batch size of dataset. Default: 32 + target(str): the device target. Default: Ascend + + Returns: + dataset + """ + if target == "Ascend": + device_num, rank_id = _get_rank_info() + if device_num == 1: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=12, shuffle=True) + else: + ds = de.ImageFolderDataset(dataset_path, num_parallel_workers=12, shuffle=True, + num_shards=device_num, shard_id=rank_id) + image_size = 224 + mean = [123.68, 116.78, 103.94] + std = [1.0, 1.0, 1.0] + + # define map operations + if do_train: + trans = [ + C.RandomCropDecodeResize(image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)), + C.RandomHorizontalFlip(prob=0.5), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + else: + trans = [ + C.Decode(), + C.Resize(292), + C.CenterCrop(256), + C.Normalize(mean=mean, std=std), + C.HWC2CHW() + ] + + type_cast_op = C2.TypeCast(mstype.int32) + ds = ds.map(operations=trans, input_columns="image", num_parallel_workers=12) + ds = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=12) + + # apply batch operations + ds = ds.batch(batch_size, drop_remainder=True) + + # apply dataset repeat operation + ds = ds.repeat(repeat_num) + + return ds + + +def _get_rank_info(): + """ + get rank size and rank id + """ + rank_size = int(os.environ.get("RANK_SIZE", 1)) + + if rank_size > 1: + rank_size = get_group_size() + rank_id = get_rank() + else: + rank_size = 1 + rank_id = 0 + + return rank_size, rank_id diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/lr_generator.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/lr_generator.py new file mode 100644 index 0000000..ed9e81a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/lr_generator.py @@ -0,0 +1,205 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""learning rate generator""" +import math +import numpy as np + + +def _generate_steps_lr(lr_init, lr_max, total_steps, warmup_steps): + """ + Applies three steps decay to generate learning rate array. + + Args: + lr_init(float): init learning rate. + lr_max(float): max learning rate. + total_steps(int): all steps in training. + warmup_steps(int): all steps in warmup epochs. + + Returns: + np.array, learning rate array. + """ + decay_epoch_index = [0.3 * total_steps, 0.6 * total_steps, 0.8 * total_steps] + lr_each_step = [] + for i in range(total_steps): + if i < warmup_steps: + lr = lr_init + (lr_max - lr_init) * i / warmup_steps + else: + if i < decay_epoch_index[0]: + lr = lr_max + elif i < decay_epoch_index[1]: + lr = lr_max * 0.1 + elif i < decay_epoch_index[2]: + lr = lr_max * 0.01 + else: + lr = lr_max * 0.001 + lr_each_step.append(lr) + return lr_each_step + + +def _generate_poly_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps): + """ + Applies polynomial decay to generate learning rate array. + + Args: + lr_init(float): init learning rate. + lr_end(float): end learning rate + lr_max(float): max learning rate. + total_steps(int): all steps in training. + warmup_steps(int): all steps in warmup epochs. + + Returns: + np.array, learning rate array. + """ + lr_each_step = [] + if warmup_steps != 0: + inc_each_step = (float(lr_max) - float(lr_init)) / float(warmup_steps) + else: + inc_each_step = 0 + for i in range(total_steps): + if i < warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + else: + base = (1.0 - (float(i) - float(warmup_steps)) / (float(total_steps) - float(warmup_steps))) + lr = float(lr_max) * base * base + if lr < 0.0: + lr = 0.0 + lr_each_step.append(lr) + return lr_each_step + + +def _generate_cosine_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps): + """ + Applies cosine decay to generate learning rate array. + + Args: + lr_init(float): init learning rate. + lr_end(float): end learning rate + lr_max(float): max learning rate. + total_steps(int): all steps in training. + warmup_steps(int): all steps in warmup epochs. + + Returns: + np.array, learning rate array. + """ + decay_steps = total_steps - warmup_steps + lr_each_step = [] + for i in range(total_steps): + if i < warmup_steps: + lr_inc = (float(lr_max) - float(lr_init)) / float(warmup_steps) + lr = float(lr_init) + lr_inc * (i + 1) + else: + cosine_decay = 0.5 * (1 + math.cos(math.pi * (i-warmup_steps) / decay_steps)) + lr = (lr_max-lr_end)*cosine_decay + lr_end + lr_each_step.append(lr) + return lr_each_step + + +def _generate_liner_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps): + """ + Applies liner decay to generate learning rate array. + + Args: + lr_init(float): init learning rate. + lr_end(float): end learning rate + lr_max(float): max learning rate. + total_steps(int): all steps in training. + warmup_steps(int): all steps in warmup epochs. + + Returns: + np.array, learning rate array. + """ + lr_each_step = [] + for i in range(total_steps): + if i < warmup_steps: + lr = lr_init + (lr_max - lr_init) * i / warmup_steps + else: + lr = lr_max - (lr_max - lr_end) * (i - warmup_steps) / (total_steps - warmup_steps) + lr_each_step.append(lr) + return lr_each_step + + + +def get_lr(lr_init, lr_end, lr_max, warmup_epochs, total_epochs, steps_per_epoch, lr_decay_mode): + """ + generate learning rate array + + Args: + lr_init(float): init learning rate + lr_end(float): end learning rate + lr_max(float): max learning rate + warmup_epochs(int): number of warmup epochs + total_epochs(int): total epoch of training + steps_per_epoch(int): steps of one epoch + lr_decay_mode(string): learning rate decay mode, including steps, poly, cosine or liner(default) + + Returns: + np.array, learning rate array + """ + lr_each_step = [] + total_steps = steps_per_epoch * total_epochs + warmup_steps = steps_per_epoch * warmup_epochs + + if lr_decay_mode == 'steps': + lr_each_step = _generate_steps_lr(lr_init, lr_max, total_steps, warmup_steps) + elif lr_decay_mode == 'poly': + lr_each_step = _generate_poly_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps) + elif lr_decay_mode == 'cosine': + lr_each_step = _generate_cosine_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps) + else: + lr_each_step = _generate_liner_lr(lr_init, lr_end, lr_max, total_steps, warmup_steps) + + lr_each_step = np.array(lr_each_step).astype(np.float32) + return lr_each_step + + +def linear_warmup_lr(current_step, warmup_steps, base_lr, init_lr): + lr_inc = (float(base_lr) - float(init_lr)) / float(warmup_steps) + lr = float(init_lr) + lr_inc * current_step + return lr + + +def warmup_cosine_annealing_lr(lr, steps_per_epoch, warmup_epochs, max_epoch=120, global_step=0): + """ + generate learning rate array with cosine + + Args: + lr(float): base learning rate + steps_per_epoch(int): steps size of one epoch + warmup_epochs(int): number of warmup epochs + max_epoch(int): total epochs of training + global_step(int): the current start index of lr array + Returns: + np.array, learning rate array + """ + base_lr = lr + warmup_init_lr = 0 + total_steps = int(max_epoch * steps_per_epoch) + warmup_steps = int(warmup_epochs * steps_per_epoch) + decay_steps = total_steps - warmup_steps + + lr_each_step = [] + for i in range(total_steps): + if i < warmup_steps: + lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr) + else: + linear_decay = (total_steps - i) / decay_steps + cosine_decay = 0.5 * (1 + math.cos(math.pi * 2 * 0.47 * i / decay_steps)) + decayed = linear_decay * cosine_decay + 0.00001 + lr = base_lr * decayed + lr_each_step.append(lr) + + lr_each_step = np.array(lr_each_step).astype(np.float32) + learning_rate = lr_each_step[global_step:] + return learning_rate diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/resnet.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/resnet.py new file mode 100644 index 0000000..73ef4b5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/src/resnet.py @@ -0,0 +1,393 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""ResNet.""" +import numpy as np +import mindspore.nn as nn +import mindspore.common.dtype as mstype +from mindspore.ops import operations as P +from mindspore.ops import functional as F +from mindspore.common.tensor import Tensor +from scipy.stats import truncnorm + +def _conv_variance_scaling_initializer(in_channel, out_channel, kernel_size): + fan_in = in_channel * kernel_size * kernel_size + scale = 1.0 + scale /= max(1., fan_in) + stddev = (scale ** 0.5) / .87962566103423978 + mu, sigma = 0, stddev + weight = truncnorm(-2, 2, loc=mu, scale=sigma).rvs(out_channel * in_channel * kernel_size * kernel_size) + weight = np.reshape(weight, (out_channel, in_channel, kernel_size, kernel_size)) + return Tensor(weight, dtype=mstype.float32) + +def _weight_variable(shape, factor=0.01): + init_value = np.random.randn(*shape).astype(np.float32) * factor + return Tensor(init_value) + + +def _conv3x3(in_channel, out_channel, stride=1, use_se=False): + if use_se: + weight = _conv_variance_scaling_initializer(in_channel, out_channel, kernel_size=3) + else: + weight_shape = (out_channel, in_channel, 3, 3) + weight = _weight_variable(weight_shape) + return nn.Conv2d(in_channel, out_channel, + kernel_size=3, stride=stride, padding=0, pad_mode='same', weight_init=weight) + + +def _conv1x1(in_channel, out_channel, stride=1, use_se=False): + if use_se: + weight = _conv_variance_scaling_initializer(in_channel, out_channel, kernel_size=1) + else: + weight_shape = (out_channel, in_channel, 1, 1) + weight = _weight_variable(weight_shape) + return nn.Conv2d(in_channel, out_channel, + kernel_size=1, stride=stride, padding=0, pad_mode='same', weight_init=weight) + + +def _conv7x7(in_channel, out_channel, stride=1, use_se=False): + if use_se: + weight = _conv_variance_scaling_initializer(in_channel, out_channel, kernel_size=7) + else: + weight_shape = (out_channel, in_channel, 7, 7) + weight = _weight_variable(weight_shape) + return nn.Conv2d(in_channel, out_channel, + kernel_size=7, stride=stride, padding=0, pad_mode='same', weight_init=weight) + + +def _bn(channel): + return nn.BatchNorm2d(channel, eps=1e-4, momentum=0.9, + gamma_init=1, beta_init=0, moving_mean_init=0, moving_var_init=1) + + +def _bn_last(channel): + return nn.BatchNorm2d(channel, eps=1e-4, momentum=0.9, + gamma_init=0, beta_init=0, moving_mean_init=0, moving_var_init=1) + + +def _fc(in_channel, out_channel, use_se=False): + if use_se: + weight = np.random.normal(loc=0, scale=0.01, size=out_channel*in_channel) + weight = Tensor(np.reshape(weight, (out_channel, in_channel)), dtype=mstype.float32) + else: + weight_shape = (out_channel, in_channel) + weight = _weight_variable(weight_shape) + return nn.Dense(in_channel, out_channel, has_bias=True, weight_init=weight, bias_init=0) + + +class ResidualBlock(nn.Cell): + """ + ResNet V1 residual block definition. + + Args: + in_channel (int): Input channel. + out_channel (int): Output channel. + stride (int): Stride size for the first convolutional layer. Default: 1. + use_se (bool): enable SE-ResNet50 net. Default: False. + se_block(bool): use se block in SE-ResNet50 net. Default: False. + + Returns: + Tensor, output tensor. + + Examples: + >>> ResidualBlock(3, 256, stride=2) + """ + expansion = 4 + + def __init__(self, + in_channel, + out_channel, + stride=1, + use_se=False, se_block=False): + super(ResidualBlock, self).__init__() + self.stride = stride + self.use_se = use_se + self.se_block = se_block + channel = out_channel // self.expansion + self.conv1 = _conv1x1(in_channel, channel, stride=1, use_se=self.use_se) + self.bn1 = _bn(channel) + if self.use_se and self.stride != 1: + self.e2 = nn.SequentialCell([_conv3x3(channel, channel, stride=1, use_se=True), _bn(channel), + nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2, pad_mode='same')]) + else: + self.conv2 = _conv3x3(channel, channel, stride=stride, use_se=self.use_se) + self.bn2 = _bn(channel) + + self.conv3 = _conv1x1(channel, out_channel, stride=1, use_se=self.use_se) + self.bn3 = _bn_last(out_channel) + if self.se_block: + self.se_global_pool = P.ReduceMean(keep_dims=False) + self.se_dense_0 = _fc(out_channel, int(out_channel/4), use_se=self.use_se) + self.se_dense_1 = _fc(int(out_channel/4), out_channel, use_se=self.use_se) + self.se_sigmoid = nn.Sigmoid() + self.se_mul = P.Mul() + self.relu = nn.ReLU() + + self.down_sample = False + + if stride != 1 or in_channel != out_channel: + self.down_sample = True + self.down_sample_layer = None + + if self.down_sample: + if self.use_se: + if stride == 1: + self.down_sample_layer = nn.SequentialCell([_conv1x1(in_channel, out_channel, + stride, use_se=self.use_se), _bn(out_channel)]) + else: + self.down_sample_layer = nn.SequentialCell([nn.MaxPool2d(kernel_size=2, stride=2, pad_mode='same'), + _conv1x1(in_channel, out_channel, 1, + use_se=self.use_se), _bn(out_channel)]) + else: + self.down_sample_layer = nn.SequentialCell([_conv1x1(in_channel, out_channel, stride, + use_se=self.use_se), _bn(out_channel)]) + self.add = P.TensorAdd() + + def construct(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + if self.use_se and self.stride != 1: + out = self.e2(out) + else: + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + out = self.conv3(out) + out = self.bn3(out) + if self.se_block: + out_se = out + out = self.se_global_pool(out, (2, 3)) + out = self.se_dense_0(out) + out = self.relu(out) + out = self.se_dense_1(out) + out = self.se_sigmoid(out) + out = F.reshape(out, F.shape(out) + (1, 1)) + out = self.se_mul(out, out_se) + + if self.down_sample: + identity = self.down_sample_layer(identity) + + out = self.add(out, identity) + out = self.relu(out) + + return out + + +class ResNet(nn.Cell): + """ + ResNet architecture. + + Args: + block (Cell): Block for network. + layer_nums (list): Numbers of block in different layers. + in_channels (list): Input channel in each layer. + out_channels (list): Output channel in each layer. + strides (list): Stride size in each layer. + num_classes (int): The number of classes that the training images are belonging to. + use_se (bool): enable SE-ResNet50 net. Default: False. + se_block(bool): use se block in SE-ResNet50 net in layer 3 and layer 4. Default: False. + Returns: + Tensor, output tensor. + + Examples: + >>> ResNet(ResidualBlock, + >>> [3, 4, 6, 3], + >>> [64, 256, 512, 1024], + >>> [256, 512, 1024, 2048], + >>> [1, 2, 2, 2], + >>> 10) + """ + + def __init__(self, + block, + layer_nums, + in_channels, + out_channels, + strides, + num_classes, + use_se=False): + super(ResNet, self).__init__() + + if not len(layer_nums) == len(in_channels) == len(out_channels) == 4: + raise ValueError("the length of layer_num, in_channels, out_channels list must be 4!") + self.use_se = use_se + self.se_block = False + if self.use_se: + self.se_block = True + + if self.use_se: + self.conv1_0 = _conv3x3(3, 32, stride=2, use_se=self.use_se) + self.bn1_0 = _bn(32) + self.conv1_1 = _conv3x3(32, 32, stride=1, use_se=self.use_se) + self.bn1_1 = _bn(32) + self.conv1_2 = _conv3x3(32, 64, stride=1, use_se=self.use_se) + else: + self.conv1 = _conv7x7(3, 64, stride=2) + self.bn1 = _bn(64) + self.relu = P.ReLU() + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, pad_mode="same") + self.layer1 = self._make_layer(block, + layer_nums[0], + in_channel=in_channels[0], + out_channel=out_channels[0], + stride=strides[0], + use_se=self.use_se) + self.layer2 = self._make_layer(block, + layer_nums[1], + in_channel=in_channels[1], + out_channel=out_channels[1], + stride=strides[1], + use_se=self.use_se) + self.layer3 = self._make_layer(block, + layer_nums[2], + in_channel=in_channels[2], + out_channel=out_channels[2], + stride=strides[2], + use_se=self.use_se, + se_block=self.se_block) + self.layer4 = self._make_layer(block, + layer_nums[3], + in_channel=in_channels[3], + out_channel=out_channels[3], + stride=strides[3], + use_se=self.use_se, + se_block=self.se_block) + + self.mean = P.ReduceMean(keep_dims=True) + self.flatten = nn.Flatten() + self.end_point = _fc(out_channels[3], num_classes, use_se=self.use_se) + + def _make_layer(self, block, layer_num, in_channel, out_channel, stride, use_se=False, se_block=False): + """ + Make stage network of ResNet. + + Args: + block (Cell): Resnet block. + layer_num (int): Layer number. + in_channel (int): Input channel. + out_channel (int): Output channel. + stride (int): Stride size for the first convolutional layer. + se_block(bool): use se block in SE-ResNet50 net. Default: False. + Returns: + SequentialCell, the output layer. + + Examples: + >>> _make_layer(ResidualBlock, 3, 128, 256, 2) + """ + layers = [] + + resnet_block = block(in_channel, out_channel, stride=stride, use_se=use_se) + layers.append(resnet_block) + if se_block: + for _ in range(1, layer_num - 1): + resnet_block = block(out_channel, out_channel, stride=1, use_se=use_se) + layers.append(resnet_block) + resnet_block = block(out_channel, out_channel, stride=1, use_se=use_se, se_block=se_block) + layers.append(resnet_block) + else: + for _ in range(1, layer_num): + resnet_block = block(out_channel, out_channel, stride=1, use_se=use_se) + layers.append(resnet_block) + return nn.SequentialCell(layers) + + def construct(self, x): + if self.use_se: + x = self.conv1_0(x) + x = self.bn1_0(x) + x = self.relu(x) + x = self.conv1_1(x) + x = self.bn1_1(x) + x = self.relu(x) + x = self.conv1_2(x) + else: + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + c1 = self.maxpool(x) + + c2 = self.layer1(c1) + c3 = self.layer2(c2) + c4 = self.layer3(c3) + c5 = self.layer4(c4) + + out = self.mean(c5, (2, 3)) + out = self.flatten(out) + out = self.end_point(out) + + return out + + +def resnet50(class_num=10): + """ + Get ResNet50 neural network. + + Args: + class_num (int): Class number. + + Returns: + Cell, cell instance of ResNet50 neural network. + + Examples: + >>> net = resnet50(10) + """ + return ResNet(ResidualBlock, + [3, 4, 6, 3], + [64, 256, 512, 1024], + [256, 512, 1024, 2048], + [1, 2, 2, 2], + class_num) + +def se_resnet50(class_num=1001): + """ + Get SE-ResNet50 neural network. + + Args: + class_num (int): Class number. + + Returns: + Cell, cell instance of SE-ResNet50 neural network. + + Examples: + >>> net = se-resnet50(1001) + """ + return ResNet(ResidualBlock, + [3, 4, 6, 3], + [64, 256, 512, 1024], + [256, 512, 1024, 2048], + [1, 2, 2, 2], + class_num, + use_se=True) + +def resnet101(class_num=1001): + """ + Get ResNet101 neural network. + + Args: + class_num (int): Class number. + + Returns: + Cell, cell instance of ResNet101 neural network. + + Examples: + >>> net = resnet101(1001) + """ + return ResNet(ResidualBlock, + [3, 4, 23, 3], + [64, 256, 512, 1024], + [256, 512, 1024, 2048], + [1, 2, 2, 2], + class_num) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/train.py b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/train.py new file mode 100644 index 0000000..3c29241 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/code/train.py @@ -0,0 +1,191 @@ +# Copyright 2020 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================ +"""train resnet.""" +import os +import argparse +import ast +from mindspore import context +from mindspore import Tensor +from mindspore.nn.optim.momentum import Momentum +from mindspore.train.model import Model +from mindspore.context import ParallelMode +from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor +from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits +from mindspore.train.loss_scale_manager import FixedLossScaleManager +from mindspore.train.serialization import load_checkpoint, load_param_into_net +from mindspore.communication.management import init, get_rank, get_group_size +from mindspore.common import set_seed +import mindspore.nn as nn +import mindspore.common.initializer as weight_init +from src.lr_generator import get_lr, warmup_cosine_annealing_lr +from src.CrossEntropySmooth import CrossEntropySmooth + +parser = argparse.ArgumentParser(description='Image classification') +parser.add_argument('--net', type=str, default=None, help='Resnet Model, either resnet50 or resnet101') +parser.add_argument('--dataset', type=str, default=None, help='Dataset, either cifar10 or imagenet2012') +parser.add_argument('--run_distribute', type=ast.literal_eval, default=False, help='Run distribute') +parser.add_argument('--device_num', type=int, default=1, help='Device num.') + +parser.add_argument('--dataset_path', type=str, default=None, help='Dataset path') +parser.add_argument('--device_target', type=str, default='Ascend', help='Device target') +parser.add_argument('--pre_trained', type=str, default=None, help='Pretrained checkpoint path') +parser.add_argument('--parameter_server', type=ast.literal_eval, default=False, help='Run parameter server train') +args_opt = parser.parse_args() + +set_seed(1) + +if args_opt.net == "resnet50": + from src.resnet import resnet50 as resnet + if args_opt.dataset == "cifar10": + from src.config import config1 as config + from src.dataset import create_dataset1 as create_dataset + else: + from src.config import config2 as config + from src.dataset import create_dataset2 as create_dataset +elif args_opt.net == "resnet101": + from src.resnet import resnet101 as resnet + from src.config import config3 as config + from src.dataset import create_dataset3 as create_dataset +else: + from src.resnet import se_resnet50 as resnet + from src.config import config4 as config + from src.dataset import create_dataset4 as create_dataset + + +if __name__ == '__main__': + target = args_opt.device_target + ckpt_save_dir = config.save_checkpoint_path + + # init context + context.set_context(mode=context.GRAPH_MODE, device_target=target, save_graphs=False) + if args_opt.parameter_server: + context.set_ps_context(enable_ps=True) + if args_opt.run_distribute: + if target == "Ascend": + device_id = int(os.getenv('DEVICE_ID')) + context.set_context(device_id=device_id, enable_auto_mixed_precision=True) + context.set_auto_parallel_context(device_num=args_opt.device_num, parallel_mode=ParallelMode.DATA_PARALLEL, + gradients_mean=True) + if args_opt.net == "resnet50" or args_opt.net == "se-resnet50": + context.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) + else: + context.set_auto_parallel_context(all_reduce_fusion_config=[180, 313]) + init() + # GPU target + else: + init() + context.set_auto_parallel_context(device_num=get_group_size(), parallel_mode=ParallelMode.DATA_PARALLEL, + gradients_mean=True) + if args_opt.net == "resnet50": + context.set_auto_parallel_context(all_reduce_fusion_config=[85, 160]) + ckpt_save_dir = config.save_checkpoint_path + "ckpt_" + str(get_rank()) + "/" + + # create dataset + dataset = create_dataset(dataset_path=args_opt.dataset_path, do_train=True, repeat_num=1, + batch_size=config.batch_size, target=target) + step_size = dataset.get_dataset_size() + + # define net + net = resnet(class_num=config.class_num) + if args_opt.parameter_server: + net.set_param_ps() + + # init weight + if args_opt.pre_trained: + param_dict = load_checkpoint(args_opt.pre_trained) + load_param_into_net(net, param_dict) + else: + for _, cell in net.cells_and_names(): + if isinstance(cell, nn.Conv2d): + cell.weight.set_data(weight_init.initializer(weight_init.XavierUniform(), + cell.weight.shape, + cell.weight.dtype)) + if isinstance(cell, nn.Dense): + cell.weight.set_data(weight_init.initializer(weight_init.TruncatedNormal(), + cell.weight.shape, + cell.weight.dtype)) + + # init lr + if args_opt.net == "resnet50" or args_opt.net == "se-resnet50": + lr = get_lr(lr_init=config.lr_init, lr_end=config.lr_end, lr_max=config.lr_max, + warmup_epochs=config.warmup_epochs, total_epochs=config.epoch_size, steps_per_epoch=step_size, + lr_decay_mode=config.lr_decay_mode) + else: + lr = warmup_cosine_annealing_lr(config.lr, step_size, config.warmup_epochs, config.epoch_size, + config.pretrain_epoch_size * step_size) + lr = Tensor(lr) + + # define opt + decayed_params = [] + no_decayed_params = [] + for param in net.trainable_params(): + if 'beta' not in param.name and 'gamma' not in param.name and 'bias' not in param.name: + decayed_params.append(param) + else: + no_decayed_params.append(param) + + group_params = [{'params': decayed_params, 'weight_decay': config.weight_decay}, + {'params': no_decayed_params}, + {'order_params': net.trainable_params()}] + opt = Momentum(group_params, lr, config.momentum, loss_scale=config.loss_scale) + # define loss, model + if target == "Ascend": + if args_opt.dataset == "imagenet2012": + if not config.use_label_smooth: + config.label_smooth_factor = 0.0 + loss = CrossEntropySmooth(sparse=True, reduction="mean", + smooth_factor=config.label_smooth_factor, num_classes=config.class_num) + else: + loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') + loss_scale = FixedLossScaleManager(config.loss_scale, drop_overflow_update=False) + model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale, metrics={'acc'}, + amp_level="O2", keep_batchnorm_fp32=False) + else: + # GPU target + if args_opt.dataset == "imagenet2012": + if not config.use_label_smooth: + config.label_smooth_factor = 0.0 + loss = CrossEntropySmooth(sparse=True, reduction="mean", + smooth_factor=config.label_smooth_factor, num_classes=config.class_num) + else: + loss = SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean") + + if (args_opt.net == "resnet101" or args_opt.net == "resnet50") and not args_opt.parameter_server: + opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), lr, config.momentum, config.weight_decay, + config.loss_scale) + loss_scale = FixedLossScaleManager(config.loss_scale, drop_overflow_update=False) + # Mixed precision + model = Model(net, loss_fn=loss, optimizer=opt, loss_scale_manager=loss_scale, metrics={'acc'}, + amp_level="O2", keep_batchnorm_fp32=True) + else: + ## fp32 training + opt = Momentum(filter(lambda x: x.requires_grad, net.get_parameters()), lr, config.momentum, config.weight_decay) + model = Model(net, loss_fn=loss, optimizer=opt, metrics={'acc'}) + + # define callbacks + time_cb = TimeMonitor(data_size=step_size) + loss_cb = LossMonitor() + cb = [time_cb, loss_cb] + if config.save_checkpoint: + config_ck = CheckpointConfig(save_checkpoint_steps=config.save_checkpoint_epochs * step_size, + keep_checkpoint_max=config.keep_checkpoint_max) + ckpt_cb = ModelCheckpoint(prefix="resnet", directory=ckpt_save_dir, config=config_ck) + cb += [ckpt_cb] + + # train model + if args_opt.net == "se-resnet50": + config.epoch_size = config.train_epoch_size + model.train(config.epoch_size - config.pretrain_epoch_size, dataset, callbacks=cb, + dataset_sink_mode=(not args_opt.parameter_server)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/config/npu_set_env.sh new file mode 100644 index 0000000..55d68ec --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/config/npu_set_env.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +rm -rf /var/log/npu/slog/host-0/* +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp + export TBE_IMPL_PATH=/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export TBE_IMPL_PATH=TBE_IMPL_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core +fi + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/eval.sh b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/eval.sh new file mode 100644 index 0000000..c18780c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/eval.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +yamlPath=$1 +toolsPath=$2 +currtime=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +train_job_dir=${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime} +mkdir -p ${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime}/ + +source ${currentDir}/config/npu_set_env.sh + +export REMARK_LOG_FILE=hw_resnet50.log +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "mindspore_config") + +device_id=${eval_device_id} +export DEVICE_NUM=1 +export DEVICE_ID=${device_id} +export RANK_SIZE=${DEVICE_NUM} +export RANK_ID=${device_id} + + + +python3.7 ${currentDir}/code/eval.py \ + --net=resnet50 \ + --dataset=imagenet2012 \ + --dataset_path=${data_url} \ + --checkpoint_path=${checkpoint_path} > ${train_job_dir}/eval.out 2>&1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/run.sh new file mode 100644 index 0000000..e3a661d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/run.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 +MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) +# 配置环境变量并调用 train 方法 +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export SLOG_PRINT_TO_STDOUT=0 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "mindspore_config") + + + +data_url_new=`echo ${data_url//\//\\\\/}` + +jsonFilePath=${currentDir}/code/src/config.py +echo "start to modify inner config file" +#echo "jsonfilepath is "${jsonFilePath} + +sed -i "0,/epoch_size.*$/s//epoch_size\': ${epoches},/" ${jsonFilePath} +sed -i "0,/batch_size.*$/s//batch_size\': ${batch_size},/" ${jsonFilePath} +sed -i "0,/save_checkpoint_epochs.*$/s//save_checkpoint_epochs\': ${save_checkpoint_epochs},/" ${jsonFilePath} +sed -i "0,/loss_scale.*$/s//loss_scale\': ${loss_scale},/" ${jsonFilePath} +sed -i 's/\r//g' ${jsonFilePath} +if [ $? -eq 0 ] ; +then + echo "modify inner config file success" +else + echo "modify inner config file fail" + exit +fi + + + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_resnet50.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +elif [ x"$mode" == x"train" ];then + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_resnet50.log ${train_job_dir} + for device_id in $device_group;do + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +else + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${ckpt_path%results*}/results &" + ln -snf ${train_job_dir}/${first_device_id}/hw_resnet50.log ${train_job_dir} + bash ${currentDir}/scripts/eval.sh ${yamlPath} ${toolsPath} $currtime + +fi +wait + + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/train.sh new file mode 100644 index 0000000..d01bc85 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/mindspore/scripts/train.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +export REMARK_LOG_FILE=hw_resnet50.log + +# ${mainDir%train*}/train/result/tensorflow/Bert/TrainingJob-${currtime} # +mkdir -p ${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/ms_resnet50/training_job_${currtime}/ + +source ${currentDir}/config/npu_set_env.sh + +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +#atlasboost_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +code_dir_path=${currentDir}/code +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path}:${code_dir_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "mindspore_config") + +# user env +export YAML_PATH=$3 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export MODEL_CKPT_PATH=${train_job_dir}/${device_id}/ckpt${device_id} +export SERVER_ID=0 + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + + +# 根据单卡/多卡区分调用参数 + + +if [ x"$6" == x"True" ];then + export CLUSTER=True + echo "run cluster" + --net=resnet50 \ + --dataset=imagenet2012 \ + --run_distribute=${run_distribute} \ + --pre_trained=${pre_trained} \ + --dataset_path=${data_url} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + if [ ${rank_size} -eq 1 ]; then + run_distribute=False + device_num=1 + else + run_distribute=True + device_num=${rank_size} + fi + export DEVICE_NUM=${device_num} + if [ x"${pre_trained}" == x"None" ];then + python3.7 ${currentDir}/code/train.py \ + --net=resnet50 \ + --dataset=imagenet2012 \ + --run_distribute=${run_distribute} \ + --device_num=${device_num} \ + --dataset_path=${data_url} > ${train_job_dir}/train_${device_id}.log 2>&1 + + else + python3.7 ${currentDir}/code/train.py \ + --net=resnet50 \ + --dataset=${data_url} \ + --run_distribute=${run_distribute} \ + --device_num=${device_num} \ + --pre_trained=${pre_trained} \ + --dataset_path=${data_url} > ${train_job_dir}/train_${device_id}.log 2>&1 + fi +fi + + +if [ $? -eq 0 ] ; +then + echo ":::ABK 1.0.0 resnet50 train success" + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/${device_id}/hw_resnet50.log +else + echo ":::ABK 1.0.0 resnet50 train failed" + echo ":::ABK 1.0.0 resnet50 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50 train failed" >> ${train_job_dir}/${device_id}/hw_resnet50.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnet50.log + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/README.md new file mode 100644 index 0000000..89e6fc1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/README.md @@ -0,0 +1,26 @@ +# ResNet50_pytorch训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/ResNet50.yaml中修改相应配置, 配置项含义: + +``` + pytorch_config: + data_url: 数据集路径 + batch_size: 跑1p时batch_size为512;跑8p时batch_size为4096 + epoches: 跑多少个epoch + mode: train_and_evaluate、evaluate两种模式 + ckpt_path: /home/train/result/pt_resnet50/training_job_20200916042624/7/checkpoint_npu7model_best.pth.tar + docker_image: docker 镜像名称:版本号 + lr: 默认参数1p 0.2,8p 2.048 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/__init__.py new file mode 100644 index 0000000..9fbfb7e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the BSD 3-Clause License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://opensource.org/licenses/BSD-3-Clause +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#from . import logger +#from . import dataloaders +#from . import training +#from . import utils +#from . import mixup +#from . import resnet +#from . import smoothing diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/dataloaders.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/dataloaders.py new file mode 100644 index 0000000..43bc5b5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/dataloaders.py @@ -0,0 +1,369 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION +# Copyright (c) 2017- Facebook, Inc +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import os +import torch +import numpy as np +import torchvision.datasets as datasets +import torchvision.transforms as transforms +from PIL import Image + +DATA_BACKEND_CHOICES = ['pytorch', 'syntetic'] +# try: +# from nvidia.dali.plugin.pytorch import DALIClassificationIterator +# from nvidia.dali.pipeline import Pipeline +# import nvidia.dali.ops as ops +# import nvidia.dali.types as types +# DATA_BACKEND_CHOICES.append('dali-gpu') +# DATA_BACKEND_CHOICES.append('dali-cpu') +# except ImportError: +# print("Please install DALI from https://www.github.com/NVIDIA/DALI to run this example.") + + +def load_jpeg_from_file(path, cuda=True, fp16=False): + img_transforms = transforms.Compose( + [transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()] + ) + + img = img_transforms(Image.open(path)) + with torch.no_grad(): + # mean and std are not multiplied by 255 as they are in training script + # torch dataloader reads data into bytes whereas loading directly + # through PIL creates a tensor with floats in [0,1] range + mean = torch.tensor([0.485, 0.456, 0.406]).view(1, 3, 1, 1) + std = torch.tensor([0.229, 0.224, 0.225]).view(1, 3, 1, 1) + + if cuda: + mean = mean.cuda() + std = std.cuda() + img = img.cuda() + if fp16: + mean = mean.half() + std = std.half() + img = img.half() + else: + img = img.float() + + input = img.unsqueeze(0).sub_(mean).div_(std) + + return input + + +# class HybridTrainPipe(Pipeline): +# def __init__(self, batch_size, num_threads, device_id, data_dir, crop, dali_cpu=False): +# super(HybridTrainPipe, self).__init__(batch_size, num_threads, device_id, seed = 12 + device_id) +# if torch.distributed.is_initialized(): +# rank = torch.distributed.get_rank() +# world_size = torch.distributed.get_world_size() +# else: +# rank = 0 +# world_size = 1 + +# self.input = ops.FileReader( +# file_root = data_dir, +# shard_id = rank, +# num_shards = world_size, +# random_shuffle = True) + +# if dali_cpu: +# dali_device = "cpu" +# self.decode = ops.ImageDecoder(device=dali_device, output_type=types.RGB) +# else: +# dali_device = "gpu" +# # This padding sets the size of the internal nvJPEG buffers to be able to handle all images from full-sized ImageNet +# # without additional reallocations +# self.decode = ops.ImageDecoder(device="mixed", output_type=types.RGB, device_memory_padding=211025920, host_memory_padding=140544512) + +# self.res = ops.RandomResizedCrop( +# device=dali_device, +# size=[crop, crop], +# interp_type=types.INTERP_LINEAR, +# random_aspect_ratio=[0.75, 4./3.], +# random_area=[0.08, 1.0], +# num_attempts=100) + +# self.cmnp = ops.CropMirrorNormalize(device = "gpu", +# output_dtype = types.FLOAT, +# output_layout = types.NCHW, +# crop = (crop, crop), +# image_type = types.RGB, +# mean = [0.485 * 255,0.456 * 255,0.406 * 255], +# std = [0.229 * 255,0.224 * 255,0.225 * 255]) +# self.coin = ops.CoinFlip(probability = 0.5) + +# def define_graph(self): +# rng = self.coin() +# self.jpegs, self.labels = self.input(name = "Reader") +# images = self.decode(self.jpegs) +# images = self.res(images) +# output = self.cmnp(images.gpu(), mirror = rng) +# return [output, self.labels] + + +# class HybridValPipe(Pipeline): +# def __init__(self, batch_size, num_threads, device_id, data_dir, crop, size): +# super(HybridValPipe, self).__init__(batch_size, num_threads, device_id, seed = 12 + device_id) +# if torch.distributed.is_initialized(): +# rank = torch.distributed.get_rank() +# world_size = torch.distributed.get_world_size() +# else: +# rank = 0 +# world_size = 1 + +# self.input = ops.FileReader( +# file_root = data_dir, +# shard_id = rank, +# num_shards = world_size, +# random_shuffle = False) + +# self.decode = ops.ImageDecoder(device = "mixed", output_type = types.RGB) +# self.res = ops.Resize(device = "gpu", resize_shorter = size) +# self.cmnp = ops.CropMirrorNormalize(device = "gpu", +# output_dtype = types.FLOAT, +# output_layout = types.NCHW, +# crop = (crop, crop), +# image_type = types.RGB, +# mean = [0.485 * 255,0.456 * 255,0.406 * 255], +# std = [0.229 * 255,0.224 * 255,0.225 * 255]) + +# def define_graph(self): +# self.jpegs, self.labels = self.input(name = "Reader") +# images = self.decode(self.jpegs) +# images = self.res(images) +# output = self.cmnp(images) +# return [output, self.labels] + + +class DALIWrapper(object): + def gen_wrapper(dalipipeline, num_classes, one_hot): + for data in dalipipeline: + input = data[0]["data"] + target = torch.reshape(data[0]["label"], [-1]).cuda().long() + if one_hot: + target = expand(num_classes, torch.float, target) + yield input, target + dalipipeline.reset() + + def __init__(self, dalipipeline, num_classes, one_hot): + self.dalipipeline = dalipipeline + self.num_classes = num_classes + self.one_hot = one_hot + + def __iter__(self): + return DALIWrapper.gen_wrapper(self.dalipipeline, self.num_classes, self.one_hot) + +def get_dali_train_loader(dali_cpu=False): + # def gdtl(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + # if torch.distributed.is_initialized(): + # rank = torch.distributed.get_rank() + # world_size = torch.distributed.get_world_size() + # else: + # rank = 0 + # world_size = 1 + + # traindir = os.path.join(data_path, 'train') + + # pipe = HybridTrainPipe(batch_size=batch_size, num_threads=workers, + # device_id = rank % torch.cuda.device_count(), + # data_dir = traindir, crop = 224, dali_cpu=dali_cpu) + + # pipe.build() + # train_loader = DALIClassificationIterator(pipe, size = int(pipe.epoch_size("Reader") / world_size)) + + # return DALIWrapper(train_loader, num_classes, one_hot), int(pipe.epoch_size("Reader") / (world_size * batch_size)) + + # return gdtl + def gdtl(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + return False + return gdvl + +def get_dali_val_loader(): + # def gdvl(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + # if torch.distributed.is_initialized(): + # rank = torch.distributed.get_rank() + # world_size = torch.distributed.get_world_size() + # else: + # rank = 0 + # world_size = 1 + + # valdir = os.path.join(data_path, 'val') + + # pipe = HybridValPipe(batch_size=batch_size, num_threads=workers, + # device_id = rank % torch.cuda.device_count(), + # data_dir = valdir, + # crop = 224, size = 256) + + # pipe.build() + # val_loader = DALIClassificationIterator(pipe, size = int(pipe.epoch_size("Reader") / world_size)) + + # return DALIWrapper(val_loader, num_classes, one_hot), int(pipe.epoch_size("Reader") / (world_size * batch_size)) + # return gdvl + def gdvl(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + return False + return gdvl + +def fast_collate(batch): + imgs = [img[0] for img in batch] + targets = torch.tensor([target[1] for target in batch], dtype=torch.int64) + w = imgs[0].size[0] + h = imgs[0].size[1] + tensor = torch.zeros( (len(imgs), 3, h, w), dtype=torch.uint8 ) + for i, img in enumerate(imgs): + nump_array = np.asarray(img, dtype=np.uint8) + tens = torch.from_numpy(nump_array) + if(nump_array.ndim < 3): + nump_array = np.expand_dims(nump_array, axis=-1) + nump_array = np.rollaxis(nump_array, 2) + + tensor[i] += torch.from_numpy(nump_array) + + return tensor, targets + + +def expand(num_classes, dtype, tensor): + e = torch.zeros(tensor.size(0), num_classes, dtype=dtype, device=torch.device('cuda')) + e = e.scatter(1, tensor.unsqueeze(1), 1.0) + return e + +class PrefetchedWrapper(object): + def prefetched_loader(loader, num_classes, fp16, one_hot): + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).cuda().view(1,3,1,1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).cuda().view(1,3,1,1) + if fp16: + mean = mean.half() + std = std.half() + + stream = torch.cuda.Stream() + first = True + + for next_input, next_target in loader: + with torch.cuda.stream(stream): + next_input = next_input.cuda(non_blocking=True) + next_target = next_target.cuda(non_blocking=True) + if fp16: + next_input = next_input.half() + if one_hot: + next_target = expand(num_classes, torch.half, next_target) + else: + next_input = next_input.float() + if one_hot: + next_target = expand(num_classes, torch.float, next_target) + + next_input = next_input.sub_(mean).div_(std) + + if not first: + yield input, target + else: + first = False + + torch.cuda.current_stream().wait_stream(stream) + input = next_input + target = next_target + + yield input, target + + def __init__(self, dataloader, num_classes, fp16, one_hot): + self.dataloader = dataloader + self.fp16 = fp16 + self.epoch = 0 + self.one_hot = one_hot + self.num_classes = num_classes + + def __iter__(self): + if (self.dataloader.sampler is not None and + isinstance(self.dataloader.sampler, + torch.utils.data.distributed.DistributedSampler)): + + self.dataloader.sampler.set_epoch(self.epoch) + self.epoch += 1 + return PrefetchedWrapper.prefetched_loader(self.dataloader, self.num_classes, self.fp16, self.one_hot) + +def get_pytorch_train_loader(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + traindir = os.path.join(data_path, 'train') + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + ])) + + if torch.distributed.is_initialized(): + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=batch_size, shuffle=(train_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, sampler=train_sampler, collate_fn=fast_collate, drop_last=True) + + return PrefetchedWrapper(train_loader, num_classes, fp16, one_hot), len(train_loader) + +def get_pytorch_val_loader(data_path, batch_size, num_classes, one_hot, workers=5, _worker_init_fn=None, fp16=False): + valdir = os.path.join(data_path, 'val') + val_dataset = datasets.ImageFolder( + valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + ])) + + if torch.distributed.is_initialized(): + val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset) + else: + val_sampler = None + + val_loader = torch.utils.data.DataLoader( + val_dataset, + sampler=val_sampler, + batch_size=batch_size, shuffle=False, + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, + collate_fn=fast_collate) + + return PrefetchedWrapper(val_loader, num_classes, fp16, one_hot), len(val_loader) + +class SynteticDataLoader(object): + def __init__(self, fp16, batch_size, num_classes, num_channels, height, width, one_hot): + input_data = torch.empty(batch_size, num_channels, height, width).cuda().normal_(0, 1.0) + if one_hot: + input_target = torch.empty(batch_size, num_classes).cuda() + input_target[:, 0] = 1.0 + else: + input_target = torch.randint(0, num_classes, (batch_size,)) + input_target=input_target.cuda() + if fp16: + input_data = input_data.half() + + self.input_data = input_data + self.input_target = input_target + + def __iter__(self): + while True: + yield self.input_data, self.input_target + +def get_syntetic_loader(data_path, batch_size, num_classes, one_hot, workers=None, _worker_init_fn=None, fp16=False): + return SynteticDataLoader(fp16, batch_size, 1000, 3, 224, 224, one_hot), -1 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/logger.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/logger.py new file mode 100644 index 0000000..e92f2bc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/logger.py @@ -0,0 +1,310 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION +# Copyright (c) 2017- Facebook, Inc +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +from collections import OrderedDict +import dllogger +import numpy as np + + +def format_step(step): + if isinstance(step, str): + return step + s = "" + if len(step) > 0: + s += "Epoch: {} ".format(step[0]) + if len(step) > 1: + s += "Iteration: {} ".format(step[1]) + if len(step) > 2: + s += "Validation Iteration: {} ".format(step[2]) + if len(step) == 0: + s = "Summary:" + return s + + +PERF_METER = lambda: Meter(AverageMeter(), AverageMeter(), AverageMeter()) +LOSS_METER = lambda: Meter(AverageMeter(), AverageMeter(), MinMeter()) +ACC_METER = lambda: Meter(AverageMeter(), AverageMeter(), MaxMeter()) +LR_METER = lambda: Meter(LastMeter(), LastMeter(), LastMeter()) + +LAT_100 = lambda: Meter(QuantileMeter(1), QuantileMeter(1), QuantileMeter(1)) +LAT_99 = lambda: Meter(QuantileMeter(0.99), QuantileMeter(0.99), QuantileMeter(0.99)) +LAT_95 = lambda: Meter(QuantileMeter(0.95), QuantileMeter(0.95), QuantileMeter(0.95)) + +class Meter(object): + def __init__(self, iteration_aggregator, epoch_aggregator, run_aggregator): + self.run_aggregator = run_aggregator + self.epoch_aggregator = epoch_aggregator + self.iteration_aggregator = iteration_aggregator + + def record(self, val, n=1): + self.iteration_aggregator.record(val, n=n) + + def get_iteration(self): + v, n = self.iteration_aggregator.get_val() + return v + + def reset_iteration(self): + v, n = self.iteration_aggregator.get_data() + self.iteration_aggregator.reset() + if v is not None: + self.epoch_aggregator.record(v, n=n) + + def get_epoch(self): + v, n = self.epoch_aggregator.get_val() + return v + + def reset_epoch(self): + v, n = self.epoch_aggregator.get_data() + self.epoch_aggregator.reset() + if v is not None: + self.run_aggregator.record(v, n=n) + + def get_run(self): + v, n = self.run_aggregator.get_val() + return v + + def reset_run(self): + self.run_aggregator.reset() + + +class QuantileMeter(object): + def __init__(self, q): + self.q = q + self.reset() + + def reset(self): + self.vals = [] + self.n = 0 + + def record(self, val, n=1): + if isinstance(val, list): + self.vals += val + self.n += len(val) + else: + self.vals += [val] * n + self.n += n + + def get_val(self): + if not self.vals: + return None, self.n + return np.quantile(self.vals, self.q, interpolation='nearest'), self.n + + def get_data(self): + return self.vals, self.n + + +class MaxMeter(object): + def __init__(self): + self.reset() + + def reset(self): + self.max = None + self.n = 0 + + def record(self, val, n=1): + if self.max is None: + self.max = val + else: + self.max = max(self.max, val) + self.n = n + + def get_val(self): + return self.max, self.n + + def get_data(self): + return self.max, self.n + + +class MinMeter(object): + def __init__(self): + self.reset() + + def reset(self): + self.min = None + self.n = 0 + + def record(self, val, n=1): + if self.min is None: + self.min = val + else: + self.min = max(self.min, val) + self.n = n + + def get_val(self): + return self.min, self.n + + def get_data(self): + return self.min, self.n + + +class LastMeter(object): + def __init__(self): + self.reset() + + def reset(self): + self.last = None + self.n = 0 + + def record(self, val, n=1): + self.last = val + self.n = n + + def get_val(self): + return self.last, self.n + + def get_data(self): + return self.last, self.n + + +class AverageMeter(object): + def __init__(self): + self.reset() + + def reset(self): + self.n = 0 + self.val = 0 + + def record(self, val, n=1): + self.n += n + self.val += val * n + + def get_val(self): + if self.n == 0: + return None, 0 + return self.val / self.n, self.n + + def get_data(self): + if self.n == 0: + return None, 0 + return self.val / self.n, self.n + + +class Logger(object): + def __init__(self, print_interval, backends, verbose=False): + self.epoch = -1 + self.iteration = -1 + self.val_iteration = -1 + self.metrics = OrderedDict() + self.backends = backends + self.print_interval = print_interval + self.verbose = verbose + dllogger.init(backends) + + def log_parameter(self, data, verbosity=0): + dllogger.log(step="PARAMETER", data=data, verbosity=verbosity) + + def register_metric(self, metric_name, meter, verbosity=0, metadata={}): + if self.verbose: + print("Registering metric: {}".format(metric_name)) + self.metrics[metric_name] = {'meter': meter, 'level': verbosity} + dllogger.metadata(metric_name, metadata) + + def log_metric(self, metric_name, val, n=1): + self.metrics[metric_name]['meter'].record(val, n=n) + + def start_iteration(self, val=False): + if val: + self.val_iteration += 1 + else: + self.iteration += 1 + + def end_iteration(self, val=False): + it = self.val_iteration if val else self.iteration + if (it % self.print_interval == 0): + metrics = { + n: m + for n, m in self.metrics.items() if n.startswith('val') == val + } + step = (self.epoch, + self.iteration) if not val else (self.epoch, + self.iteration, + self.val_iteration) + + verbositys = {m['level'] for _, m in metrics.items()} + for ll in verbositys: + llm = {n: m for n, m in metrics.items() if m['level'] == ll} + + dllogger.log(step=step, + data={ + n: m['meter'].get_iteration() + for n, m in llm.items() + }, + verbosity=ll) + + for n, m in metrics.items(): + m['meter'].reset_iteration() + + dllogger.flush() + + def start_epoch(self): + self.epoch += 1 + self.iteration = 0 + self.val_iteration = 0 + + for n, m in self.metrics.items(): + m['meter'].reset_epoch() + + def end_epoch(self): + for n, m in self.metrics.items(): + m['meter'].reset_iteration() + + verbositys = {m['level'] for _, m in self.metrics.items()} + for ll in verbositys: + llm = {n: m for n, m in self.metrics.items() if m['level'] == ll} + dllogger.log(step=(self.epoch, ), + data={n: m['meter'].get_epoch() + for n, m in llm.items()}) + + def end(self): + for n, m in self.metrics.items(): + m['meter'].reset_epoch() + + verbositys = {m['level'] for _, m in self.metrics.items()} + for ll in verbositys: + llm = {n: m for n, m in self.metrics.items() if m['level'] == ll} + dllogger.log(step=tuple(), + data={n: m['meter'].get_run() + for n, m in llm.items()}) + + for n, m in self.metrics.items(): + m['meter'].reset_epoch() + + dllogger.flush() + + def iteration_generator_wrapper(self, gen, val=False): + for g in gen: + self.start_iteration(val=val) + yield g + self.end_iteration(val=val) + + def epoch_generator_wrapper(self, gen): + for g in gen: + self.start_epoch() + yield g + self.end_epoch() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/mixup.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/mixup.py new file mode 100644 index 0000000..e946dc9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/mixup.py @@ -0,0 +1,67 @@ +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the BSD 3-Clause License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://opensource.org/licenses/BSD-3-Clause +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn as nn +import numpy as np + + +def mixup(alpha, num_classes, data, target): + with torch.no_grad(): + bs = data.size(0) + c = np.random.beta(alpha, alpha) + + perm = torch.randperm(bs).cuda() + + md = c * data + (1-c) * data[perm, :] + mt = c * target + (1-c) * target[perm, :] + return md, mt + + +class MixUpWrapper(object): + def __init__(self, alpha, num_classes, dataloader): + self.alpha = alpha + self.dataloader = dataloader + self.num_classes = num_classes + + def mixup_loader(self, loader): + for input, target in loader: + i, t = mixup(self.alpha, self.num_classes, input, target) + yield i, t + + def __iter__(self): + return self.mixup_loader(self.dataloader) + + +class NLLMultiLabelSmooth(nn.Module): + def __init__(self, smoothing = 0.0): + super(NLLMultiLabelSmooth, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + + def forward(self, x, target): + if self.training: + x = x.float() + target = target.float() + logprobs = torch.nn.functional.log_softmax(x, dim = -1) + + nll_loss = -logprobs * target + nll_loss = nll_loss.sum(-1) + + smooth_loss = -logprobs.mean(dim=-1) + + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + + return loss.mean() + else: + return torch.nn.functional.cross_entropy(x, target) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/resnet.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/resnet.py new file mode 100644 index 0000000..b8c40d9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/resnet.py @@ -0,0 +1,370 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION +# Copyright (c) 2017- Facebook, Inc +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import math +import torch +import torch.nn as nn +import numpy as np + +__all__ = ['ResNet', 'build_resnet', 'resnet_versions', 'resnet_configs'] + +# ResNetBuilder {{{ + +class ResNetBuilder(object): + def __init__(self, version, config): + self.conv3x3_cardinality = 1 if 'cardinality' not in version.keys() else version['cardinality'] + self.config = config + + def conv(self, kernel_size, in_planes, out_planes, groups=1, stride=1): + conv = nn.Conv2d( + in_planes, out_planes, + kernel_size=kernel_size, groups=groups, + stride=stride, padding=int((kernel_size - 1)/2), + bias=False) + + if self.config['nonlinearity'] == 'relu': + # torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu') + # Copy + # 用论文 “Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification” - He, K. et al. (2015) 中提及的正态分布初始化输入 Tensor。初始化后的张量中的值采样 ) 且 + # %20%5Ctimes%20%5Ctext%7Bfan%5C_in%7D%7D%7D%0D%0A%0D%0A) + # 也被称作 He initialization。 + # 参数: + # tensor – n 维 torch.Tensor + # a – 该层后面一层的整流函数中负的斜率 (默认为 0,此时为 Relu) + # mode – 'fan_in' (default) 或者 'fan_out'。使用fan_in保持weights的方差在前向传播中不变;使用fan_out保持weights的方差在反向传播中不变。 + # nonlinearity – 非线性函数 (nn.functional 中的名字),推荐只使用 'relu' 或 'leaky_relu' (default)。 + # 例子 + # >>> w = torch.empty(3, 5) + # >>> nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu') + nn.init.kaiming_normal_(conv.weight, + mode=self.config['conv_init'], + nonlinearity=self.config['nonlinearity']) + + + + + return conv + + def conv3x3(self, in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + c = self.conv(3, in_planes, out_planes, groups=self.conv3x3_cardinality, stride=stride) + return c + + def conv1x1(self, in_planes, out_planes, stride=1): + """1x1 convolution with padding""" + c = self.conv(1, in_planes, out_planes, stride=stride) + return c + + def conv7x7(self, in_planes, out_planes, stride=1): + """7x7 convolution with padding""" + c = self.conv(7, in_planes, out_planes, stride=stride) + return c + + def conv5x5(self, in_planes, out_planes, stride=1): + """5x5 convolution with padding""" + c = self.conv(5, in_planes, out_planes, stride=stride) + return c + + def batchnorm(self, planes, last_bn=False): + bn = nn.BatchNorm2d(planes) + gamma_init_val = 0 if last_bn and self.config['last_bn_0_init'] else 1 + nn.init.constant_(bn.weight, gamma_init_val) + nn.init.constant_(bn.bias, 0) + + return bn + + def activation(self): + return self.config['activation']() + +# ResNetBuilder }}} + +# BasicBlock {{{ +class BasicBlock(nn.Module): + def __init__(self, builder, inplanes, planes, expansion, stride=1, downsample=None): + super(BasicBlock, self).__init__() + self.conv1 = builder.conv3x3(inplanes, planes, stride) + self.bn1 = builder.batchnorm(planes) + self.relu = builder.activation() + self.conv2 = builder.conv3x3(planes, planes*expansion) + self.bn2 = builder.batchnorm(planes*expansion, last_bn=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + residual = x + + out = self.conv1(x) + if self.bn1 is not None: + out = self.bn1(out) + + out = self.relu(out) + + out = self.conv2(out) + + if self.bn2 is not None: + out = self.bn2(out) + + if self.downsample is not None: + residual = self.downsample(x) + + out += residual + out = self.relu(out) + + return out +# BasicBlock }}} + +# SqueezeAndExcitation {{{ +class SqueezeAndExcitation(nn.Module): + def __init__(self, planes, squeeze): + super(SqueezeAndExcitation, self).__init__() + self.squeeze = nn.Linear(planes, squeeze) + self.expand = nn.Linear(squeeze, planes) + self.relu = nn.ReLU(inplace=True) + self.sigmoid = nn.Sigmoid() + + def forward(self, x): + out = torch.mean(x.view(x.size(0), x.size(1), -1), 2) + out = self.squeeze(out) + out = self.relu(out) + out = self.expand(out) + out = self.sigmoid(out) + out = out.unsqueeze(2).unsqueeze(3) + + return out + +# }}} + +# Bottleneck {{{ +class Bottleneck(nn.Module): + def __init__(self, builder, inplanes, planes, expansion, stride=1, se=False, se_squeeze=16, downsample=None): + super(Bottleneck, self).__init__() + self.conv1 = builder.conv1x1(inplanes, planes) + self.bn1 = builder.batchnorm(planes) + self.conv2 = builder.conv3x3(planes, planes, stride=stride) + self.bn2 = builder.batchnorm(planes) + self.conv3 = builder.conv1x1(planes, planes * expansion) + self.bn3 = builder.batchnorm(planes * expansion, last_bn=True) + self.relu = builder.activation() + self.downsample = downsample + self.stride = stride + self.squeeze = SqueezeAndExcitation(planes*expansion, se_squeeze) if se else None + + def forward(self, x): + residual = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + residual = self.downsample(x) + + if self.squeeze is None: + out += residual + else: + out = torch.addcmul(residual, 1.0, out, self.squeeze(out)) + + out = self.relu(out) + + return out + +def SEBottleneck(builder, inplanes, planes, expansion, stride=1, downsample=None): + return Bottleneck(builder, inplanes, planes, expansion, stride=stride, se=True, se_squeeze=16, downsample=downsample) +# Bottleneck }}} + +# ResNet {{{ +class ResNet(nn.Module): + def __init__(self, builder, block, expansion, layers, widths, num_classes=1000): + self.inplanes = 64 + super(ResNet, self).__init__() + self.conv1 = builder.conv7x7(3, 64, stride=2) + self.bn1 = builder.batchnorm(64) + self.relu = builder.activation() + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(builder, block, expansion, widths[0], layers[0]) + self.layer2 = self._make_layer(builder, block, expansion, widths[1], layers[1], stride=2) + self.layer3 = self._make_layer(builder, block, expansion, widths[2], layers[2], stride=2) + self.layer4 = self._make_layer(builder, block, expansion, widths[3], layers[3], stride=2) + self.avgpool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Linear(widths[3] * expansion, num_classes) + + def _make_layer(self, builder, block, expansion, planes, blocks, stride=1): + downsample = None + if stride != 1 or self.inplanes != planes * expansion: + dconv = builder.conv1x1(self.inplanes, planes * expansion, + stride=stride) + dbn = builder.batchnorm(planes * expansion) + if dbn is not None: + downsample = nn.Sequential(dconv, dbn) + else: + downsample = dconv + + layers = [] + layers.append(block(builder, self.inplanes, planes, expansion, stride=stride, downsample=downsample)) + self.inplanes = planes * expansion + for i in range(1, blocks): + layers.append(block(builder, self.inplanes, planes, expansion)) + + return nn.Sequential(*layers) + + def forward(self, x): + x = self.conv1(x) + if self.bn1 is not None: + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + x = self.layer4(x) + + x = self.avgpool(x) + x = x.view(x.size(0), -1) + x = self.fc(x) + + return x +# ResNet }}} + +resnet_configs = { + 'classic' : { + 'conv' : nn.Conv2d, + 'conv_init' : 'fan_out', + 'nonlinearity' : 'relu', + 'last_bn_0_init' : False, + 'activation' : lambda: nn.ReLU(inplace=True), + }, + 'fanin' : { + 'conv' : nn.Conv2d, + 'conv_init' : 'fan_in', + 'nonlinearity' : 'relu', + 'last_bn_0_init' : False, + 'activation' : lambda: nn.ReLU(inplace=True), + }, + 'grp-fanin' : { + 'conv' : nn.Conv2d, + 'conv_init' : 'fan_in', + 'nonlinearity' : 'relu', + 'last_bn_0_init' : False, + 'activation' : lambda: nn.ReLU(inplace=True), + }, + 'grp-fanout' : { + 'conv' : nn.Conv2d, + 'conv_init' : 'fan_out', + 'nonlinearity' : 'relu', + 'last_bn_0_init' : False, + 'activation' : lambda: nn.ReLU(inplace=True), + }, + } + +resnet_versions = { + 'resnet18' : { + 'net' : ResNet, + 'block' : BasicBlock, + 'layers' : [2, 2, 2, 2], + 'widths' : [64, 128, 256, 512], + 'expansion' : 1, + 'num_classes' : 1000, + }, + 'resnet34' : { + 'net' : ResNet, + 'block' : BasicBlock, + 'layers' : [3, 4, 6, 3], + 'widths' : [64, 128, 256, 512], + 'expansion' : 1, + 'num_classes' : 1000, + }, + 'resnet50' : { + 'net' : ResNet, + 'block' : Bottleneck, + 'layers' : [3, 4, 6, 3], + 'widths' : [64, 128, 256, 512], + 'expansion' : 4, + 'num_classes' : 1000, + }, + 'resnet101' : { + 'net' : ResNet, + 'block' : Bottleneck, + 'layers' : [3, 4, 23, 3], + 'widths' : [64, 128, 256, 512], + 'expansion' : 4, + 'num_classes' : 1000, + }, + 'resnet152' : { + 'net' : ResNet, + 'block' : Bottleneck, + 'layers' : [3, 8, 36, 3], + 'widths' : [64, 128, 256, 512], + 'expansion' : 4, + 'num_classes' : 1000, + }, + 'resnext101-32x4d' : { + 'net' : ResNet, + 'block' : Bottleneck, + 'cardinality' : 32, + 'layers' : [3, 4, 23, 3], + 'widths' : [128, 256, 512, 1024], + 'expansion' : 2, + 'num_classes' : 1000, + }, + 'se-resnext101-32x4d' : { + 'net' : ResNet, + 'block' : SEBottleneck, + 'cardinality' : 32, + 'layers' : [3, 4, 23, 3], + 'widths' : [128, 256, 512, 1024], + 'expansion' : 2, + 'num_classes' : 1000, + }, + } + + +def build_resnet(version, config, verbose=True): + version = resnet_versions[version] + config = resnet_configs[config] + + builder = ResNetBuilder(version, config) + if verbose: + print("Version: {}".format(version)) + print("Config: {}".format(config)) + model = version['net'](builder, + version['block'], + version['expansion'], + version['layers'], + version['widths'], + version['num_classes']) + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing.py new file mode 100644 index 0000000..0d34a34 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing.py @@ -0,0 +1,91 @@ +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the BSD 3-Clause License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://opensource.org/licenses/BSD-3-Clause +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn as nn + + +class CrossEntropy(nn.CrossEntropyLoss): + def __init__(self, smooth_factor=0., num_classes=1000): + super(CrossEntropy, self).__init__() + self.on_value = 1.0 - smooth_factor + self.off_value = 1.0 * smooth_factor / (num_classes - 1) + + def forward(self, input, target): + one_hot_label = torch.npu_one_hot(target, -1, input.size(1), self.on_value, self.off_value) + one_hot_label = one_hot_label.to(torch.float16) + loss = torch.npu_softmax_cross_entropy_with_logits(input.to(torch.float16), one_hot_label) + + loss = torch.mean(loss, [0], keepdim=False, dtype=torch.float32) + return loss + +class LabelSmoothingNpu(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.0): + """ + Constructor for the LabelSmoothing module. + + :param smoothing: label smoothing factor + """ + super(LabelSmoothingNpu, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + + self.epsilon = 0.1 + self.num_classes = 1000 + + def forward(self, x, target): + CALCULATE_DEVICE = x.device + logprobs = torch.nn.functional.log_softmax(x, dim=-1).to("cpu") + + targets = torch.zeros_like(logprobs).scatter_(1, target.unsqueeze(1), 1) + targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes + loss = (-targets * logprobs).mean(0).sum() + + # nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + # nll_loss = nll_loss.squeeze(1) + # smooth_loss = -logprobs.mean(dim=-1) + # loss = self.confidence * nll_loss + self.smoothing * smooth_loss + return loss.to(CALCULATE_DEVICE) + + +class LabelSmoothingGpu(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.0): + """ + Constructor for the LabelSmoothing module. + + :param smoothing: label smoothing factor + """ + super(LabelSmoothingGpu, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + # print("----------------------LabelSooothing.__init__") + # def __call__(self,x,target): + # print("----------------------LabelSooothing.__call__") + # return self.forward(self,x,target) + + def forward(self, x, target): + logprobs = torch.nn.functional.log_softmax(x, dim=-1) + + nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + nll_loss = nll_loss.squeeze(1) + smooth_loss = -logprobs.mean(dim=-1) + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + #print("================",type(x),x.size()) + #print("------------------",type(target),target.size(),target) + return loss.mean() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing_tocpu.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing_tocpu.py new file mode 100644 index 0000000..cbd8772 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/smoothing_tocpu.py @@ -0,0 +1,51 @@ +# Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the BSD 3-Clause License (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://opensource.org/licenses/BSD-3-Clause +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import torch +import torch.nn as nn + +class LabelSmoothing(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.0): + """ + Constructor for the LabelSmoothing module. + + :param smoothing: label smoothing factor + """ + super(LabelSmoothing, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + # print("----------------------LabelSooothing.__init__") + # def __call__(self,x,target): + # print("----------------------LabelSooothing.__call__") + # return self.forward(self,x,target) + + def forward(self, x, target): + device_x = x.device + device_target = target.device + x = x.to("cpu") + target = target.to("cpu") + logprobs = torch.nn.functional.log_softmax(x, dim=-1) + + nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + nll_loss = nll_loss.squeeze(1) + smooth_loss = -logprobs.mean(dim=-1) + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + #print("================",type(x),x.size()) + #print("------------------",type(target),target.size(),target) + + x = x.to(device_x) + target = target.to(device_target) + return loss.mean() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/training.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/training.py new file mode 100644 index 0000000..905d973 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/training.py @@ -0,0 +1,534 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION +# Copyright (c) 2017- Facebook, Inc +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import os +import time +import numpy as np +import torch +import torch.nn as nn +from torch.autograd import Variable +from . import logger as log +from . import resnet as nvmodels +from . import utils +import dllogger +try: + #from apex.parallel import DistributedDataParallel as DDP #可以采用pytorch torch.distributed + from apex.fp16_utils import * + from apex import amp +except ImportError: + raise ImportError( + "Please install apex from https://www.github.com/nvidia/apex to run this example." + ) + +ACC_METADATA = {'unit': '%','format': ':.2f'} +IPS_METADATA = {'unit': 'img/s', 'format': ':.2f'} +TIME_METADATA = {'unit': 's', 'format': ':.5f'} +LOSS_METADATA = {'format': ':.5f'} + + +class ModelAndLoss(nn.Module): + def __init__(self, + arch, + loss, + pretrained_weights=None, + cuda=True, + fp16=False): + super(ModelAndLoss, self).__init__() + self.arch = arch + + print("=> creating model '{}'".format(arch)) + model = nvmodels.build_resnet(arch[0], arch[1]) + if pretrained_weights is not None: + print("=> using pre-trained model from a file '{}'".format(arch)) + model.load_state_dict(pretrained_weights) + + if cuda: + model = model.cuda() + if fp16: + model = network_to_half(model) + + # define loss function (criterion) and optimizer + criterion = loss() + + if cuda: + criterion = criterion.cuda() + + self.model = model + self.loss = criterion + + def forward(self, data, target): + output = self.model(data) + loss = self.loss(output, target) + + return loss, output + + def distributed(self): + #self.model = DDP(self.model) + return + + def load_model_state(self, state): + if not state is None: + self.model.load_state_dict(state) + + +def get_optimizer(parameters, + fp16, + lr, + momentum, + weight_decay, + nesterov=False, + state=None, + static_loss_scale=1., + dynamic_loss_scale=False, + bn_weight_decay=False): + + if bn_weight_decay: + print(" ! Weight decay applied to BN parameters ") + optimizer = torch.optim.SGD([v for n, v in parameters], + lr, + momentum=momentum, + weight_decay=weight_decay, + nesterov=nesterov) + else: + print(" ! Weight decay NOT applied to BN parameters ") + bn_params = [v for n, v in parameters if 'bn' in n] + rest_params = [v for n, v in parameters if not 'bn' in n] + print(len(bn_params)) + print(len(rest_params)) + optimizer = torch.optim.SGD([{ + 'params': bn_params, + 'weight_decay': 0 + }, { + 'params': rest_params, + 'weight_decay': weight_decay + }], + lr, + momentum=momentum, + weight_decay=weight_decay, + nesterov=nesterov) + if fp16: + optimizer = FP16_Optimizer(optimizer, + static_loss_scale=static_loss_scale, + dynamic_loss_scale=dynamic_loss_scale, + verbose=False) + + if not state is None: + optimizer.load_state_dict(state) + + return optimizer + + +def lr_policy(lr_fn, logger=None): + if logger is not None: + logger.register_metric('lr', + log.LR_METER(), + verbosity=dllogger.Verbosity.VERBOSE) + + def _alr(optimizer, iteration, epoch): + lr = lr_fn(iteration, epoch) + + if logger is not None: + logger.log_metric('lr', lr) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + return _alr + + +def lr_step_policy(base_lr, steps, decay_factor, warmup_length, logger=None): + def _lr_fn(iteration, epoch): + if epoch < warmup_length: + lr = base_lr * (epoch + 1) / warmup_length + else: + lr = base_lr + for s in steps: + if epoch >= s: + lr *= decay_factor + return lr + + return lr_policy(_lr_fn, logger=logger) + + +def lr_linear_policy(base_lr, warmup_length, epochs, logger=None): + def _lr_fn(iteration, epoch): + if epoch < warmup_length: + lr = base_lr * (epoch + 1) / warmup_length + else: + e = epoch - warmup_length + es = epochs - warmup_length + lr = base_lr * (1 - (e / es)) + return lr + + return lr_policy(_lr_fn, logger=logger) + + +def lr_cosine_policy(base_lr, warmup_length, epochs, logger=None): + def _lr_fn(iteration, epoch): + if epoch < warmup_length: + lr = base_lr * (epoch + 1) / warmup_length + else: + e = epoch - warmup_length + es = epochs - warmup_length + lr = 0.5 * (1 + np.cos(np.pi * e / es)) * base_lr + return lr + + return lr_policy(_lr_fn, logger=logger) + + +def lr_exponential_policy(base_lr, + warmup_length, + epochs, + final_multiplier=0.001, + logger=None): + es = epochs - warmup_length + epoch_decay = np.power(2, np.log2(final_multiplier) / es) + + def _lr_fn(iteration, epoch): + if epoch < warmup_length: + lr = base_lr * (epoch + 1) / warmup_length + else: + e = epoch - warmup_length + lr = base_lr * (epoch_decay**e) + return lr + + return lr_policy(_lr_fn, logger=logger) + + +def get_train_step(model_and_loss, + optimizer, + fp16, + use_amp=False, + batch_size_multiplier=1): + def _step(input, target, optimizer_step=True): + input_var = Variable(input) + target_var = Variable(target) + loss, output = model_and_loss(input_var, target_var) + if torch.distributed.is_initialized(): + print('utils.reduce_tensor(loss.data)') + reduced_loss = utils.reduce_tensor(loss.data) + else: + reduced_loss = loss.data + + if fp16: + optimizer.backward(loss) + elif use_amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + if optimizer_step: + opt = optimizer.optimizer if isinstance( + optimizer, FP16_Optimizer) else optimizer + for param_group in opt.param_groups: + for param in param_group['params']: + param.grad /= batch_size_multiplier + + optimizer.step() + optimizer.zero_grad() + + torch.cuda.synchronize() + + return reduced_loss + + return _step + + +def train(train_loader, + model_and_loss, + optimizer, + lr_scheduler, + fp16, + logger, + epoch, + use_amp=False, + prof=-1, + batch_size_multiplier=1, + register_metrics=True): + + if register_metrics and logger is not None: + logger.register_metric('train.loss', + log.LOSS_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=LOSS_METADATA) + logger.register_metric('train.compute_ips', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=IPS_METADATA) + logger.register_metric('train.total_ips', + log.PERF_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=IPS_METADATA) + logger.register_metric('train.data_time', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + logger.register_metric('train.compute_time', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + + step = get_train_step(model_and_loss, + optimizer, + fp16, + use_amp=use_amp, + batch_size_multiplier=batch_size_multiplier) + + model_and_loss.train() + end = time.time() + + optimizer.zero_grad() + + data_iter = enumerate(train_loader) + if logger is not None: + data_iter = logger.iteration_generator_wrapper(data_iter) + if prof > 0: + data_iter = utils.first_n(prof, data_iter) + + for i, (input, target) in data_iter: + bs = input.size(0) + lr_scheduler(optimizer, i, epoch) + data_time = time.time() - end + + optimizer_step = ((i + 1) % batch_size_multiplier) == 0 + loss = step(input, target, optimizer_step=optimizer_step) + + it_time = time.time() - end + + if logger is not None: + logger.log_metric('train.loss', to_python_float(loss), bs) + logger.log_metric('train.compute_ips', + calc_ips(bs, it_time - data_time)) + logger.log_metric('train.total_ips', calc_ips(bs, it_time)) + logger.log_metric('train.data_time', data_time) + logger.log_metric('train.compute_time', it_time - data_time) + + end = time.time() + + +def get_val_step(model_and_loss): + def _step(input, target): + input_var = Variable(input) + target_var = Variable(target) + + with torch.no_grad(): + loss, output = model_and_loss(input_var, target_var) + + prec1, prec5 = utils.accuracy(output.data, target, topk=(1, 5)) + + if torch.distributed.is_initialized(): + reduced_loss = utils.reduce_tensor(loss.data) + prec1 = utils.reduce_tensor(prec1) + prec5 = utils.reduce_tensor(prec5) + else: + reduced_loss = loss.data + + torch.cuda.synchronize() + + return reduced_loss, prec1, prec5 + + return _step + + +def validate(val_loader, + model_and_loss, + fp16, + logger, + epoch, + prof=-1, + register_metrics=True): + if register_metrics and logger is not None: + logger.register_metric('val.top1', + log.ACC_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=ACC_METADATA) + logger.register_metric('val.top5', + log.ACC_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=ACC_METADATA) + logger.register_metric('val.loss', + log.LOSS_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=LOSS_METADATA) + logger.register_metric('val.compute_ips', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=IPS_METADATA) + logger.register_metric('val.total_ips', + log.PERF_METER(), + verbosity=dllogger.Verbosity.DEFAULT, + metadata=IPS_METADATA) + logger.register_metric('val.data_time', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + logger.register_metric('val.compute_latency', + log.PERF_METER(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + logger.register_metric('val.compute_latency_at100', + log.LAT_100(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + logger.register_metric('val.compute_latency_at99', + log.LAT_99(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + logger.register_metric('val.compute_latency_at95', + log.LAT_95(), + verbosity=dllogger.Verbosity.VERBOSE, + metadata=TIME_METADATA) + + + step = get_val_step(model_and_loss) + + top1 = log.AverageMeter() + # switch to evaluate mode + model_and_loss.eval() + + end = time.time() + + data_iter = enumerate(val_loader) + if not logger is None: + data_iter = logger.iteration_generator_wrapper(data_iter, val=True) + if prof > 0: + data_iter = utils.first_n(prof, data_iter) + + for i, (input, target) in data_iter: + bs = input.size(0) + data_time = time.time() - end + + loss, prec1, prec5 = step(input, target) + + it_time = time.time() - end + + top1.record(to_python_float(prec1), bs) + if logger is not None: + logger.log_metric('val.top1', to_python_float(prec1), bs) + logger.log_metric('val.top5', to_python_float(prec5), bs) + logger.log_metric('val.loss', to_python_float(loss), bs) + logger.log_metric('val.compute_ips', + calc_ips(bs, it_time - data_time)) + logger.log_metric('val.total_ips', calc_ips(bs, it_time)) + logger.log_metric('val.data_time', data_time) + logger.log_metric('val.compute_latency', it_time - data_time) + logger.log_metric('val.compute_latency_at95', it_time - data_time) + logger.log_metric('val.compute_latency_at99', it_time - data_time) + logger.log_metric('val.compute_latency_at100', it_time - data_time) + + end = time.time() + + return top1.get_val() + + +# Train loop {{{ +def calc_ips(batch_size, time): + world_size = torch.distributed.get_world_size( + ) if torch.distributed.is_initialized() else 1 + tbs = world_size * batch_size + return tbs / time + + +def train_loop(model_and_loss, + optimizer, + lr_scheduler, + train_loader, + val_loader, + epochs, + fp16, + logger, + should_backup_checkpoint, + use_amp=False, + batch_size_multiplier=1, + best_prec1=0, + start_epoch=0, + prof=-1, + skip_training=False, + skip_validation=False, + save_checkpoints=True, + checkpoint_dir='./'): + + prec1 = -1 + + epoch_iter = range(start_epoch, epochs) + for epoch in epoch_iter: + if logger is not None: + logger.start_epoch() + if not skip_training: + train(train_loader, + model_and_loss, + optimizer, + lr_scheduler, + fp16, + logger, + epoch, + use_amp=use_amp, + prof=prof, + register_metrics=epoch == start_epoch, + batch_size_multiplier=batch_size_multiplier) + + if not skip_validation: + prec1, nimg = validate(val_loader, + model_and_loss, + fp16, + logger, + epoch, + prof=prof, + register_metrics=epoch == start_epoch) + if logger is not None: + logger.end_epoch() + + if save_checkpoints and (not torch.distributed.is_initialized() + or torch.distributed.get_rank() == 0): + if not skip_validation: + is_best = logger.metrics['val.top1']['meter'].get_epoch() > best_prec1 + best_prec1 = max(logger.metrics['val.top1']['meter'].get_epoch(), + best_prec1) + else: + is_best = False + best_prec1 = 0 + + if should_backup_checkpoint(epoch): + backup_filename = 'checkpoint-{}.pth.tar'.format(epoch + 1) + else: + backup_filename = None + utils.save_checkpoint( + { + 'epoch': epoch + 1, + 'arch': model_and_loss.arch, + 'state_dict': model_and_loss.model.state_dict(), + 'best_prec1': best_prec1, + 'optimizer': optimizer.state_dict(), + }, + is_best, + checkpoint_dir=checkpoint_dir, + backup_filename=backup_filename) + + +# }}} diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/utils.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/utils.py new file mode 100644 index 0000000..a6825a6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/image_classification/utils.py @@ -0,0 +1,106 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION +# Copyright (c) 2017- Facebook, Inc +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import os +import numpy as np +import torch +import shutil +import torch.distributed as dist + + +def should_backup_checkpoint(args): + def _sbc(epoch): + return args.gather_checkpoints and (epoch < 10 or epoch % 10 == 0) + + return _sbc + + +def save_checkpoint(state, + is_best, + filename='checkpoint.pth.tar', + checkpoint_dir='./', + backup_filename=None): + if (not torch.distributed.is_initialized() + ) or torch.distributed.get_rank() == 0: + filename = os.path.join(checkpoint_dir, filename) + print("SAVING {}".format(filename)) + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, + os.path.join(checkpoint_dir, 'model_best.pth.tar')) + if backup_filename is not None: + shutil.copyfile(filename, + os.path.join(checkpoint_dir, backup_filename)) + + +def timed_generator(gen): + start = time.time() + for g in gen: + end = time.time() + t = end - start + yield g, t + start = time.time() + + +def timed_function(f): + def _timed_function(*args, **kwargs): + start = time.time() + ret = f(*args, **kwargs) + return ret, time.time() - start + + return _timed_function + + +def accuracy(output, target, topk=(1, )): + """Computes the precision@k for the specified values of k""" + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +def reduce_tensor(tensor): + rt = tensor.clone() + dist.all_reduce(rt, op=dist.ReduceOp.SUM) + rt /= torch.distributed.get_world_size( + ) if torch.distributed.is_initialized() else 1 + return rt + + +def first_n(n, generator): + for i, d in zip(range(n), generator): + yield d diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/main-apex-d76-npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/main-apex-d76-npu.py new file mode 100644 index 0000000..427011a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/DistributedResnet50/main-apex-d76-npu.py @@ -0,0 +1,1121 @@ +# coding: utf8 + +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models + +from apex import amp +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +######################################################################### +#NV 代码移植 +######################################################################### +import image_classification.resnet as nvmodels +from image_classification.smoothing import LabelSmoothingGpu +from image_classification.smoothing import CrossEntropy +from image_classification.mixup import NLLMultiLabelSmooth, MixUpWrapper + +# import image_classification.resnet as models +import image_classification.logger as log + +# from image_classification.smoothing import LabelSmoothing +# from image_classification.mixup import NLLMultiLabelSmooth, MixUpWrapper +# from image_classification.dataloaders import * +from image_classification.training import * +# from image_classification.utils import * +######################################################################### + +''' +####################################### +多P命令参考: +--------------------------------------- +GPU 多P命令参考 +--------------------------------------- +python ./main-apex.py -p 1 -a resnet50 --dist-url 'tcp://127.0.0.1:50000' --dist-backend 'hccl' --multiprocessing-distributed --world-size 1 --batch_size=256 --rank 0 --seed 49 --device 'npu' --gpu=$i useruserdataimagenet .logtest.txt +python ori-resnet50-main-apex.py --addr='10.136.181.51' -j64 -p 1 -a resnet50 --dist-url 'tcp127.0.0.150000' --dist-backend 'hccl' --multiprocessing-distributed --world-size 1 --batch-size=2048 --rank 0 --gpu=$i --seed 49 --device 'npu' /opt/npu/imagenet > ${logfile} & +python ./main-apex-d76.py -p 1 -a resnet50 --dist-url 'tcp://127.0.0.1:50000' --dist-backend 'nccl' --multiprocessing-distributed --world-size 1 -b 2048 --epochs 90 --rank 0 /user/user/data/imagenet > log-nv-parameter-bs2048-epoch90-ampo2-benchmark0-20200722-0932.txt +--------------------------------------- +NPU多P命令参考 +--------------------------------------- +python ./main-apex-d76-npu.py --addr='10.136.181.51' -j256 --lr 2.048 --warmup 8 --label-smoothing 0.1 --mom 0.875 --wd 3.0517578125e-05 --static-loss-scale 128 -p 1 -a resnet50 --dist-url 'tcp://127.0.0.1:50000' --dist-backend 'hccl' --multiprocessing-distributed --world-size 1 -b 4096 --epochs 90 --rank 0 --benchmark 0 --device 'npu' /data/imagenet > 8p-bs4096.txt + +####################################### +单P命令参考: +--------------------------------------- +GPU 单P命令参考 +--------------------------------------- + +--------------------------------------- +NPU 单P命令参考 +--------------------------------------- +python ../../../test_py/precision/d76/main-apex-d76-npu.py -p 1 -a resnet50 --benchmark 1 -b 512 --seed 49 --device 'npu' --checkpoint-freq 10 --checkpoint-nameprefix 'checkpoint-npu-1p-benchmark1-bs512' --gpu 5 /data/imagenet > ./log-npu-nv-pytorch-1p-parameter-benchmark1-bs512-epoch90-ampo2-20200723-1912.txt +python ../../../test_py/precision/d76/main-apex-d76-npu.py -p 1 -a resnet50 --benchmark 0 -b 512 --seed 49 --device 'npu' --checkpoint-freq 10 --checkpoint-nameprefix 'checkpoint-npu-1p-benchmark0-bs512' --gpu 4 /data/imagenet > ./log-npu-nv-pytorch-1p-parameter-benchmark0-bs512-epoch90-ampo2-20200723-1912.txt +####################################### +''' + + +BATCH_SIZE = 512 +OPTIMIZER_BATCH_SIZE=2048 +LOG_STEP = 10 + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') + + +############################################################################### +#参数调节 +############################################################################### +#============================================================ +# DeepLearningExamples-master\PyTorch\Classification\ConvNets\resnet50v1.5\training\AMP\DGX1_RN50_AMP_90E.sh +#命令参数 +#============================================================ +# python ./multiproc.py --nproc_per_node 8 +# ./main.py /imagenet +# --data-backend dali-cpu +# --raport-file raport.json +# -j5 +# -p 100 +# (✔)--lr 2.048 +# --optimizer-batch-size 2048 +# (✔)--warmup 8 +# --arch resnet50 +# (卍)-c fanin ---------------------------('--model-config') +# (✔)--label-smoothing 0.1 +# (✔)--lr-schedule cosine +# (✔)--mom 0.875 ------------------------(标准动量优化算法) +# (✔)--wd 3.0517578125e-05 +# (D)--bn_weight_decay,default:false +# (D)--nesterov,default:false +# --workspace ${1:-./} +# -b 2048,8P +# (✔)--amp +# (卍)--static-loss-scale 128 +# --epochs 90 +#============================================================ + +######################################## +#'--lr', '--learning-rate', +######################################## +#---------------------------------------- +# NV set +#---------------------------------------- +#待补充 +#---------------------------------------- +# Pytorch set +#---------------------------------------- +# def adjust_learning_rate(optimizer, epoch, args): +# """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" +# lr = args.lr * (0.1 ** (epoch // 30)) +# for param_group in optimizer.param_groups: +# param_group['lr'] = lr +#---------------------------------------- +parser.add_argument('--lr', '--learning-rate', + #default=0.1, #pytorch + default=2.048, #nvidia + type=float, + metavar='LR', help='initial learning rate', dest='lr') + +parser.add_argument('--momentum', + #default=0.9, #pytorch + default=0.875, #nvidia + type=float, metavar='M', + help='momentum') #标准动量优化算法 +parser.add_argument('--wd', '--weight-decay', + #default=1e-4, #pytorch + default=3.0517578125e-05, #nvidia + type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') + +# parser.add_argument('--momentum', +# default=0.9, +# type=float, +# metavar='M', +# help='momentum') +# parser.add_argument('--weight-decay', +# '--wd', +# default=1e-4, +# type=float, +# metavar='W', +# help='weight decay (default: 1e-4)') +############################################################### +#nv cmd parameter +############################################################### + +model_configs = nvmodels.resnet_configs.keys() +parser.add_argument('--model-config', + '-c', + metavar='CONF', + default='classic', + choices=model_configs, + help='model configs: ' + ' | '.join(model_configs) + + '(default: classic)') + + + # parser.add_argument('--lr', + # '--learning-rate', + # default=0.1, + # type=float, + # metavar='LR', + # help='initial learning rate') + +#----------------------------------------------------- +# https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate +# torch.optim.lr_scheduler.LambdaLr +# torch.optim.lr_scheduler.StepLR +# torch.optim.lr_scheduler.MultiStepLR +# torch.optim.lr_scheduler.ExponentialLR +# torch.optim.lr_sheduler.CosineAnneaingLR +# torch.optim.lr_scheduler.ReduceLROnPlateau +#----------------------------------------------------- +parser.add_argument('--lr-schedule', + default='cosine', + type=str, + metavar='SCHEDULE', + choices=['step', 'linear', 'cosine'], + help='Type of LR schedule: {}, {}, {}'.format( + 'step', 'linear', 'cosine')) +parser.add_argument('--warmup', + default=8, + type=int, + metavar='E', + help='number of warmup epochs') + +parser.add_argument('--label-smoothing', + default=0.0, + type=float, + metavar='S', + help='label smoothing') +#------------------------------------ +#数据增广方式 +#------------------------------------ +parser.add_argument('--mixup', + default=0.0, + type=float, + metavar='ALPHA', + help='mixup alpha') + + +parser.add_argument( + '--bn-weight-decay', + action='store_true', + help= + 'use weight_decay on batch normalization learnable parameters, (default: false)' +) + +parser.add_argument( + '--static-loss-scale', + type=float, + default=128, + help= + 'Static loss scale, positive power of 2 values can improve fp16 convergence.' +) +parser.add_argument( + '--dynamic-loss-scale', + action='store_true', + help='Use dynamic loss scaling. If supplied, this argument supersedes ' + + '--static-loss-scale.') + +parser.add_argument('--nesterov', + action='store_true', + help='use nesterov momentum, (default: false)') +parser.add_argument('--amp', + action='store_true', + help='Run model AMP (automatic mixed precision) mode.') +parser.add_argument('--fp16', + action='store_true', + help='Run model fp16 mode.') +parser.add_argument( + '--workspace', + type=str, + default='./', + metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('--raport-file', + default='experiment_raport.json', + type=str, + help='file in which to store JSON experiment raport') +############################################################### + +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') + +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, + help='npu or gpu') +parser.add_argument('--device_num', default=-1, type=int, + help='device num') +parser.add_argument('--addr', default='10.136.181.115', type=str, + help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, + help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=10, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') +best_acc1 = 0 + +#-c,--model-config fanin +###################################################################### +#PyTorch\Classification\ConvNets\main-org.py:352 +# model_and_loss = ModelAndLoss((args.arch, args.model_config), +# loss, +# pretrained_weights=pretrained_weights, +# cuda=True, +# fp16=args.fp16) +###################################################################### + # + # + # # # + # # # + # +###################################################################### +#image_classification\training.py -----> ModelAndLoss.__init__ +#model = models.build_resnet(arch[0], arch[1]) +###################################################################### + # + # + # # # + # # # + # +###################################################################### +# image_classification\resnet.py:build_resnet +# def build_resnet(version, config, verbose=True): +# version = resnet_versions[version] +# config = resnet_configs[config] + +# builder = ResNetBuilder(version, config) +# if verbose: +# print("Version: {}".format(version)) +# print("Config: {}".format(config)) +# model = version['net'](builder, +# version['block'], +# version['expansion'], +# version['layers'], +# version['widths'], +# version['num_classes']) +# return model +###################################################################### +# fanin +# 'resnet50' : { +# 'net' : ResNet, +# 'block' : Bottleneck, +# 'layers' : [3, 4, 6, 3], +# 'widths' : [64, 128, 256, 512], +# 'expansion' : 4, +# 'num_classes' : 1000, +# }, +def nvidia_model_config(args): + model = ResNet(builder, # builder, + Bottleneck, # version['block'], + 4, # version['expansion'], + [3, 4, 6, 3], # version['layers'], + [64, 128, 256, 512], # version['widths'], + 1000) # version['num_classes']) + return model + +def nvidia_logger_init(args): + #if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0: + if False: + logger = log.Logger(args.print_freq, [ + dllogger.StdOutBackend(dllogger.Verbosity.DEFAULT, + step_format=log.format_step), + dllogger.JSONStreamBackend( + dllogger.Verbosity.VERBOSE, + os.path.join(args.workspace, args.raport_file)) + ]) + + else: + logger = log.Logger(args.print_freq, []) + logger.log_parameter(args.__dict__, verbosity=dllogger.Verbosity.DEFAULT) + args.logger = logger +#--label-smoothing 0.1 命令参数中用到,需调测 +def nvidia_mixup_and_label_smoothing_getlossfunction(args): + #PyTorch\Classification\ConvNets\main-org.py:346 获取loss接口 + loss = nn.CrossEntropyLoss + if args.mixup > 0.0: #mixup命令参数中未用到,暂不调测 + loss = lambda: NLLMultiLabelSmooth(args.label_smoothing) + elif args.label_smoothing > 0.0: #--label-smoothing 0.1 命令参数中用到,需调测 + if args.device == 'npu': + loss = lambda: CrossEntropy(args.label_smoothing) + if args.device == 'gpu': + loss = lambda: LabelSmoothingGpu(args.label_smoothing) + #criterion = loss() + + if args.gpu is not None: + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + criterion = loss().to(loc) + else: + criterion = loss().cuda(args.gpu) + print("nvidia_mixup_and_label_smoothing_getlossfunction return") + return criterion + # model_and_loss = ModelAndLoss((args.arch, args.model_config), + # loss, + # pretrained_weights=pretrained_weights, + # cuda=True, + # fp16=args.fp16) + # #============================================================ + + +#mixup命令参数中未用到,暂不调测 +def nvidia_mixup_get_train_loader_iter(args): + #PyTorch\Classification\ConvNets\main-org.py:378 获取训练loader + #mixup命令参数中未用到,暂不调测 + # train_loader, train_loader_len = get_train_loader(args.data, + # args.batch_size, + # 1000, + # args.mixup > 0.0, + # workers=args.workers, + # fp16=args.fp16) + if args.mixup != 0.0: #mixup命令参数中未用到,暂不调测 + train_loader = MixUpWrapper(args.mixup, 1000, train_loader) + + #PyTorch\Classification\ConvNets\main-org.py:403 + # optimizer = get_optimizer(list(model_and_loss.model.named_parameters()), + # args.fp16, + # args.lr, + # args.momentum, + # args.weight_decay, + # nesterov=args.nesterov, + # bn_weight_decay=args.bn_weight_decay, + # state=optimizer_state, + # static_loss_scale=args.static_loss_scale, + # dynamic_loss_scale=args.dynamic_loss_scale) + +#input: +# --warmup 8 +# --lr-schedule cosine +#output: +# +# +def nvidia_lr_policy(args): + #PyTorch\Classification\ConvNets\main-org.py:414 + logger=args.logger + if args.lr_schedule == 'step': + lr_policy = lr_step_policy(args.lr, [30, 60, 80], + 0.1, + args.warmup, + logger=logger) + elif args.lr_schedule == 'cosine': + lr_policy = lr_cosine_policy(args.lr, + args.warmup, + args.epochs, + logger=logger) + elif args.lr_schedule == 'linear': + lr_policy = lr_linear_policy(args.lr, + args.warmup, + args.epochs, + logger=logger) + return lr_policy + # criterion = lr_policy + # return criterion + +def seed_everything(seed): + random.seed(seed) + os.environ['PYTHONHASHSEED'] = str(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + cudnn.deterministic = True + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + #print("+++++++++++++++++++++++++++ before set KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + os.environ['KERNEL_NAME_ID'] = str(0) + + print("+++++++++++++++++++++++++++KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '29501' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + if args.device_num != -1: + ngpus_per_node = args.device_num + elif args.device == 'npu': + ngpus_per_node = torch.npu.device_count() + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + if args.device == 'npu': + main_worker(args.gpu, ngpus_per_node, args) + #mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + + print("[gpu id:",args.gpu,"]","+++++++++++++++++++++++++++ before set KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(gpu) + print("[gpu id:",args.gpu,"]","+++++++++++++++++++++++++++KERNEL_NAME_ID:",os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[gpu id:",args.gpu,"]","Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank# * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, #init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + # create model + if args.pretrained: + print("[gpu id:",args.gpu,"]","=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("[gpu id:",args.gpu,"]","=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + + print("[gpu id:",args.gpu,"]","===============main_worker()=================") + print("[gpu id:",args.gpu,"]",args) + print("[gpu id:",args.gpu,"]","===============main_worker()=================") + nvidia_logger_init(args) + #lr_scheduler = 0 + if args.distributed: + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.gpu is not None: + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + model = model.to(loc) + else: + torch.cuda.set_device(args.gpu) + model.cuda(args.gpu) + + + # When using a single GPU per process and per + # DistributedDataParallel, we need to divide the batch size + # ourselves based on the total number of GPUs we have + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + + #model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + else: + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + model = model.to(loc) + else: + model.cuda() + # DistributedDataParallel will divide and allocate batch_size to all + # available GPUs if device_ids are not set + print("[gpu id:",args.gpu,"]","============================test args.gpu is not None else==========================") + #model = torch.nn.parallel.DistributedDataParallel(model) + elif args.gpu is not None: + print("[gpu id:",args.gpu,"]","============================test elif args.gpu is not None:==========================") + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(args.gpu) + model = model.to(loc) + else: + torch.cuda.set_device(args.gpu) + model = model.cuda(args.gpu) + + else: + # DataParallel will divide and allocate batch_size to all available GPUs + print("[gpu id:",args.gpu,"]","============================test 1==========================") + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + print("[gpu id:",args.gpu,"]","============================test 2==========================") + #model.features = torch.nn.DataParallel(model.features) + #model.cuda() + else: + print("[gpu id:",args.gpu,"]","============================test 3==========================") + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + #model = torch.nn.DataParallel(model).to(loc) + else: + #model = torch.nn.DataParallel(model).cuda() + print("before : model = torch.nn.DataParallel(model).cuda()") + + # optimizer = torch.optim.SGD(model.parameters(), args.lr, + # momentum=args.momentum, + # weight_decay=args.weight_decay) + model_state = None + optimizer_state = None + optimizer = get_optimizer(list(model.named_parameters()), + args.fp16, + args.lr, + args.momentum, + args.weight_decay, + nesterov=args.nesterov, + bn_weight_decay=args.bn_weight_decay, + state=optimizer_state, + static_loss_scale=args.static_loss_scale, + dynamic_loss_scale=args.dynamic_loss_scale) + lr_scheduler = nvidia_lr_policy(args) + ############################### + #混合精度 + #model, optimizer = amp.initialize(model, optimizer, opt_level="O1",loss_scale = 2.0,verbosity=1) + model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale = 1024,verbosity=1) + #model, optimizer = amp.initialize(model, optimizer, opt_level="O1",verbosity=1) + ############################### + + if args.distributed: + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.gpu is not None: + # if args.device == 'npu': + # loc = 'npu:{}'.format(args.gpu) + # torch.npu.set_device(loc) + # model = model.to(loc) + # else: + # torch.cuda.set_device(args.gpu) + # model.cuda(args.gpu) + + + # When using a single GPU per process and per + # DistributedDataParallel, we need to divide the batch size + # ourselves based on the total number of GPUs we have + # args.batch_size = int(args.batch_size / ngpus_per_node) + # args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + #model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + else: + # if args.device == 'npu': + # loc = 'npu:{}'.format(args.gpu) + # model = model.to(loc) + # else: + # model.cuda() + # DistributedDataParallel will divide and allocate batch_size to all + # available GPUs if device_ids are not set + print("[gpu id:",args.gpu,"]","============================test args.gpu is not None else==========================") + model = torch.nn.parallel.DistributedDataParallel(model) + elif args.gpu is not None: + print("[gpu id:",args.gpu,"]","============================test elif args.gpu is not None:==========================") + # if args.device == 'npu': + # loc = 'npu:{}'.format(args.gpu) + # torch.npu.set_device(args.gpu) + # model = model.to(loc) + # else: + # torch.cuda.set_device(args.gpu) + # model = model.cuda(args.gpu) + + else: + # DataParallel will divide and allocate batch_size to all available GPUs + print("[gpu id:",args.gpu,"]","============================test 1==========================") + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + print("[gpu id:",args.gpu,"]","============================test 2==========================") + model.features = torch.nn.DataParallel(model.features) + model.cuda() + else: + print("[gpu id:",args.gpu,"]","============================test 3==========================") + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + model = torch.nn.DataParallel(model).to(loc) + else: + model = torch.nn.DataParallel(model).cuda() + + # define loss function (criterion) and optimizer + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + criterion = nn.CrossEntropyLoss().to(loc) + else: + criterion = nn.CrossEntropyLoss().cuda(args.gpu) + criterion = nvidia_mixup_and_label_smoothing_getlossfunction(args)#需增加设备类型参数(npu/gpu) + print("criterion = nvidia_mixup_and_label_smoothing_getlossfunction(args)") + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("[gpu id:",args.gpu,"]","=> loading checkpoint '{}'".format(args.resume)) + if args.gpu is None: + checkpoint = torch.load(args.resume) + else: + # Map model to be loaded to specified single gpu. + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + else: + loc = 'cuda:{}'.format(args.gpu) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + if args.gpu is not None: + # best_acc1 may be from a checkpoint from a different GPU + best_acc1 = best_acc1.to(args.gpu) + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + print("[gpu id:",args.gpu,"]","=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("[gpu id:",args.gpu,"]","=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=False, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=False, drop_last=True) + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + #if not args.multiprocessing_distributed or (args.multiprocessing_distributed + # and args.rank % ngpus_per_node == 0): + # pstxtpath = 'echo "=================================" >> "./ps/ps-before-epoch-0-`date \"+%Y%m%d-%H%M%S\"`.txt"' + # os.system(pstxtpath) + # pstxtpath = 'ps -aux |grep python >> "./ps/ps-before-epoch-0-`date \"+%Y%m%d-%H%M%S\"`.txt"' + # os.system(pstxtpath) + # print(pstxtpath) + # pstxtpath = 'echo "=================================" >> "./ps/ps-before-epoch-0-`date \"+%Y%m%d-%H%M%S\"`.txt"' + # os.system(pstxtpath) + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + #adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + #train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node, + acc1 = train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node, + lr_scheduler) + #if not args.multiprocessing_distributed or (args.multiprocessing_distributed + # and args.rank % ngpus_per_node == 0): + #os.system(' ps -aux |grep python > "ps-`date \"+%Y%m%d-%H%M%S\"`.txt"') + # pstxtpath = ' ps -aux |grep python >> "./ps/ps-epoch-'+str(epoch)+'-`date \"+%Y%m%d-%H%M%S\"`.txt"' + # os.system(pstxtpath) + # pstxtpath = ' echo "==============================" >> "./ps/ps-epoch-'+str(epoch)+'-`date \"+%Y%m%d-%H%M%S\"`.txt"' + # os.system(pstxtpath) + #break + + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args,ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if args.device == 'gpu': + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer' : optimizer.state_dict(), + }, is_best) + elif args.device == 'npu': + #保存恢复点 + if (not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0 and epoch == args.epochs - 1) ): + #单P情况,每个epoch均保存checkpoint文件 + #多P情况,仅最后一个epoch,保存rank 0的checkpoint文件 + + filename = args.checkpoint_nameprefix + ".pth.tar" + + #print("=================begin save checkpoint======================") + #modeltmp = model + #modeltmp = modeltmp.to("cpu") + modeltmp = model.cpu() + #保留最后一个epoch的checkpoint,防止异常退出 + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': modeltmp.state_dict(), + #'state_dict': model, + 'best_acc1': best_acc1.to("cpu"), + #'optimizer' : optimizer.state_dict(), + }, is_best.to("cpu"),filename=filename) + + if (epoch == (args.epochs - 1)) or ((args.checkpoint_freq > 0) and (((epoch+1) % args.checkpoint_freq) == 0)): + #保留每个freq的checkpoint,共epochs/freq个checkpoint文件 + #最后一个epoch保存独立的checkpoint文件 + #每隔freq个epoch保存一个checkpoint文件 + filename=args.checkpoint_nameprefix + "-epoch"+str(epoch) + ".pth.tar" + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': modeltmp.state_dict(), + #'state_dict': model, + 'best_acc1': best_acc1.to("cpu"), + #'optimizer' : optimizer.state_dict(), + }, is_best.to("cpu"),filename=filename) + + + loc = 'npu:{}'.format(args.gpu) + modeltmp.to(loc) + #print("=================end save checkpoint======================") + + +def train(train_loader, model, criterion, optimizer, epoch, args,ngpus_per_node, + lr_scheduler): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':6.4f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + + end = time.time() + + if args.benchmark == 1 : + optimizer.zero_grad() + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + lr_scheduler(optimizer, i, epoch) + + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32).to(loc, non_blocking=False) + images = images.to(loc, non_blocking=False) + else: + images = images.cuda(args.gpu, non_blocking=False) + target = target.cuda(args.gpu, non_blocking=False) + + # compute output + output = model(images) + + #if not args.multiprocessing_distributed or (args.multiprocessing_distributed + # and args.rank % ngpus_per_node == 0): + # print("before:loss = criterion(output, target)") + + loss = criterion(output, target) + + #if not args.multiprocessing_distributed or (args.multiprocessing_distributed + # and args.rank % ngpus_per_node == 0): + # print("behind:loss = criterion(output, target)") + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0 : + optimizer.zero_grad() + + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + + if args.benchmark == 0 : + optimizer.step() + elif args.benchmark == 1 : + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + #print("==================exec step & zero_grad===================") + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + + # torch.npu.synchronize() + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:",args.gpu,"]", "batch_size:", ngpus_per_node*args.batch_size, 'Time: {:.3f}'.format(batch_time.avg), '* FPS@all {:.3f}'.format( + ngpus_per_node*args.batch_size/batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + return top1.avg + + +def validate(val_loader, model, criterion, args,ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':6.4f') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + if args.gpu is not None: + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + images = images.to(loc) + else: + images = images.cuda(args.gpu, non_blocking=True) + if args.device == 'npu': + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32).to(loc, non_blocking=True) + else: + target = target.cuda(args.gpu, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + target = target.to(torch.int32).to(loc, non_blocking=True) + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[gpu id:",args.gpu,"]",'[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best.pth.tar') + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = 10 + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.count += n + if self.count > (self.start_count_index * n): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * n) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[gpu id:",os.environ['KERNEL_NAME_ID'],"]",'\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/pytorch-resnet50-apex.py b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/pytorch-resnet50-apex.py new file mode 100644 index 0000000..c0d376c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/code/pytorch-resnet50-apex.py @@ -0,0 +1,609 @@ +import argparse +import os +import random +import shutil +import time +import warnings +import math +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import torchvision.models as models +import torch.npu + +from apex import amp +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +''' +python3.7 pytorch-resnet50-apex.py --data /opt/npu/dataset/imagenet --npu 7 -j64 -b512 --lr 0.2 --warmup 5 --epochs 90 --label-smoothing 0.1 --optimizer-batch-size 1024 > batch1024-lr0.2-wd.txt & +''' +BATCH_SIZE = 512 +EPOCHS_SIZE = 100 +TRAIN_STEP = 8000 +LOG_STEP = 1 + +CALCULATE_DEVICE = "npu:7" +PRINT_DEVICE = "cpu" +SOURCE_DIR = "/data/imagenet" + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default=SOURCE_DIR, + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 8)') +parser.add_argument('--epochs', default=EPOCHS_SIZE, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--npu', default=None, type=int, + help='NPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('--warmup', + default=0, + type=int, + metavar='E', + help='number of warmup epochs') +parser.add_argument('--label-smoothing', + default=0.0, + type=float, + metavar='S', + help='label smoothing') +parser.add_argument('--optimizer-batch-size', + default=-1, + type=int, + metavar='N', + help= + 'size of a total batch size, for simulating bigger batches using gradient accumulation') + +parser.add_argument( + '--static-loss-scale', + type=float, + default=1, + help= + 'Static loss scale, positive power of 2 values can improve fp16 convergence.') + +best_acc1 = 0 + + +def main(): + args = parser.parse_args() + if args.npu is None: + args.npu = 0 + global CALCULATE_DEVICE + CALCULATE_DEVICE = "npu:{}".format(args.npu) + torch.npu.set_device(CALCULATE_DEVICE) + print("use ", CALCULATE_DEVICE) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + + if args.gpu is not None: + print("Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch](zero_init_residual=True) + for layer in model.modules(): + if isinstance(layer, nn.Linear): + torch.nn.init.kaiming_normal_(layer.weight, a=math.sqrt(5), ) + if args.distributed: + # For multiprocessing distributed, DistributedDataParallel constructor + # should always set the single device scope, otherwise, + # DistributedDataParallel will use all available devices. + if args.gpu is not None: + torch.cuda.set_device(args.gpu) + model.cuda(args.gpu) + # When using a single GPU per process and per + # DistributedDataParallel, we need to divide the batch size + # ourselves based on the total number of GPUs we have + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + else: + model.cuda() + # DistributedDataParallel will divide and allocate batch_size to all + # available GPUs if device_ids are not set + model = torch.nn.parallel.DistributedDataParallel(model) + elif args.gpu is not None: + torch.cuda.set_device(args.gpu) + model = model.cuda(args.gpu) + else: + # DataParallel will divide and allocate batch_size to all available GPUs + if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + model.features = torch.nn.DataParallel(model.features) + model.cuda() + else: + #model = torch.nn.DataParallel(model).cuda() + model = model.to(CALCULATE_DEVICE) + + lr_policy = lr_cosine_policy(args.lr, + args.warmup, + args.epochs) + + + # define loss function (criterion) and optimizer + #criterion = nn.CrossEntropyLoss().cuda(args.gpu) + loss = nn.CrossEntropyLoss + if args.label_smoothing > 0.0: + loss = lambda: LabelSmoothing(args.label_smoothing) + criterion = loss().to(CALCULATE_DEVICE) + optimizer = torch.optim.SGD([ + {'params': [param for name, param in model.named_parameters() if name[-4:] == 'bias'], 'weight_decay': 0.0}, + {'params': [param for name, param in model.named_parameters() if name[-4:] != 'bias'], 'weight_decay': args.weight_decay}], + args.lr, + momentum=args.momentum) + + model, optimizer = amp.initialize(model, optimizer, opt_level="O2", loss_scale=1024, verbosity=1) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + if args.npu is not None: + checkpoint = torch.load(args.resume) + elif args.gpu is None: + checkpoint = torch.load(args.resume) + else: + # Map model to be loaded to specified single gpu. + loc = 'cuda:{}'.format(args.gpu) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + if args.npu is not None: + best_acc1 = best_acc1.to("npu:{}".format(args.npu)) + elif args.gpu is not None: + # best_acc1 may be from a checkpoint from a different GPU + best_acc1 = best_acc1.to(args.gpu) + model.load_state_dict(checkpoint['state_dict']) + #optimizer.load_state_dict(checkpoint['optimizer']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=True) + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + #adjust_learning_rate(optimizer, epoch, args) + lr_policy(optimizer, 0, epoch) + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch, args) + + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + file_name = "checkpoint_npu{}".format(args.npu) + modeltmp = model.cpu() + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': modeltmp.state_dict(), + # 'state_dict': model, + 'best_acc1': best_acc1.to("cpu"), + # 'optimizer' : optimizer.state_dict(), + }, is_best.to("cpu"), file_name) + modeltmp.to(CALCULATE_DEVICE) + +def train(train_loader, model, criterion, optimizer, epoch, args): + if args.optimizer_batch_size < 0: + batch_size_multiplier = 1 + else: + tbs = 1 * args.batch_size + if args.optimizer_batch_size % tbs != 0: + print( + "Warning: simulated batch size {} is not divisible by actual batch size {}" + .format(args.optimizer_batch_size, tbs)) + batch_size_multiplier = int(args.optimizer_batch_size / tbs) + print("BSM: {}".format(batch_size_multiplier)) + + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + optimizer.zero_grad() + end = time.time() + for i, (images, target) in enumerate(train_loader): + #with torch.autograd.profiler.profile() as prof: + # measure data loading time + data_time.update(time.time() - end) + + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + #target = target.cuda(args.gpu, non_blocking=True) + #if 'npu' in CALCULATE_DEVICE: + # target = target.to(torch.int32) + images = images.to(CALCULATE_DEVICE, non_blocking=True) + if args.label_smoothing == 0.0: + target = target.to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) + # compute output + output = model(images) + loss = criterion(output, target) + + if args.label_smoothing > 0.0: + target = target.to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + + #loss.backward() + ############################### + with amp.scale_loss(loss, optimizer) as scaled_loss: + #print("middle") + scaled_loss.backward() + optimizer_step = ((i + 1) % batch_size_multiplier) == 0 + if optimizer_step: + if batch_size_multiplier != 1: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= batch_size_multiplier + optimizer.step() + optimizer.zero_grad() + + if i % LOG_STEP == 0: + progress.display(i) + #print(prof.key_averages().table(sort_by="self_cpu_time_total")) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + if i == TRAIN_STEP: + break + + +def validate(val_loader, model, criterion, args): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + #with torch.autograd.profiler.profile() as prof: + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + #target = target.cuda(args.gpu, non_blocking=True) + #if 'npu' in CALCULATE_DEVICE: + # target = target.to(torch.int32) + images = images.to(CALCULATE_DEVICE, non_blocking=True) + if args.label_smoothing == 0.0: + target = target.to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + if args.label_smoothing > 0.0: + target = target.to(torch.int32).to(CALCULATE_DEVICE, non_blocking=True) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % LOG_STEP == 0: + progress.display(i) + #print(prof.key_averages().table(sort_by="self_cpu_time_total")) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint'): + filename2 = filename + ".pth.tar" + torch.save(state, filename2) + if is_best: + shutil.copyfile(filename2, filename+'model_best.pth.tar') + + +class AverageMeter(object): + """Computes and stores the average and current value""" + def __init__(self, name, fmt=':f'): + self.name = name + self.fmt = fmt + self.reset() + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + current_run_time=str(entries).split("Time")[1].split("Data")[0].strip().split(" ")[0] + args = parser.parse_args() + batch_size = args.batch_size + if "Epoch" in self.prefix: + if float(current_run_time) > 0: + FPS = int(batch_size)/float(current_run_time) + hwlog.remark_print(key=hwlog.FPS, value=float(FPS)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + +class LabelSmoothing(nn.Module): + """ + NLL loss with label smoothing. + """ + def __init__(self, smoothing=0.0): + """ + Constructor for the LabelSmoothing module. + + :param smoothing: label smoothing factor + """ + super(LabelSmoothing, self).__init__() + self.confidence = 1.0 - smoothing + self.smoothing = smoothing + + def forward(self, x, target): + logprobs = torch.nn.functional.log_softmax(x, dim=-1).to("cpu") + nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1)) + nll_loss = nll_loss.squeeze(1) + smooth_loss = -logprobs.mean(dim=-1) + loss = self.confidence * nll_loss + self.smoothing * smooth_loss + return loss.mean().to(CALCULATE_DEVICE) + +def lr_policy(lr_fn, logger=None): + if logger is not None: + logger.register_metric('lr', + log.LR_METER(), + verbosity=dllogger.Verbosity.VERBOSE) + + def _alr(optimizer, iteration, epoch): + lr = lr_fn(iteration, epoch) + + if logger is not None: + logger.log_metric('lr', lr) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + return _alr + +def lr_cosine_policy(base_lr, warmup_length, epochs, logger=None): + def _lr_fn(iteration, epoch): + if epoch < warmup_length: + lr = base_lr * (epoch + 1) / warmup_length + else: + e = epoch - warmup_length + es = epochs - warmup_length + lr = 0.5 * (1 + np.cos(np.pi * e / es)) * base_lr + return lr + + return lr_policy(_lr_fn, logger=logger) + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 1024} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/config/npu_set_env.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/config/npu_set_env.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/run.sh new file mode 100644 index 0000000..dc72992 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/run.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 + +# ${rank_size} ${yamlPath} ${currentDir} + + +if [ -f /.dockerenv ];then + CLUSTER=$4 +MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) +# 配置环境变量并调用 train 方法 +currtime=`date +%Y%m%d%H%M%S` +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_resnet50/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/pt_resnet50/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir}" +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export SLOG_PRINT_TO_STDOUT=0 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + + + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${rank_size}" == x"8" ]; then + export WHICH_OP=GEOP + export NEW_GE_FE_ID=1 + export GE_AICPU_FLAG=1 +fi +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_resnet50.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_resnet50.log ${train_job_dir} + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +fi +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} " + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/train.sh new file mode 100644 index 0000000..acf621d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/pytorch/scripts/train.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +export REMARK_LOG_FILE=hw_resnet50.log + +mkdir -p ${currentDir%train*}/train/result/pt_resnet50/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_resnet50/training_job_${currtime}/ + + +source ${currentDir}/config/npu_set_env.sh + + +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +#atlasboost_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +code_dir_path=${currentDir}/code +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path}:${code_dir_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +# user env +export YAML_PATH=$3 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +#export HCCL_RANK_TABLE_PATH=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export MODEL_CKPT_PATH=${train_job_dir}/${device_id}/ckpt${device_id} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + +if [ x"${mode}" == x"evaluate" ];then + eval_data_url="--data=${data_url} --evaluate --resume=${ckpt_path}" +else + eval_data_url="--data=${data_url}" +fi +if [ x"${rank_size}" == x"1" ];then + python3.7 ${currentDir}/code/pytorch-resnet50-apex.py \ + ${eval_data_url} \ + --workers=64 \ + --epochs=${epoches} \ + --batch-size=${batch_size} \ + --learning-rate=${lr} \ + --warmup=5 \ + --label-smoothing=0.1 \ + --optimizer-batch-size=1024 \ + --npu=${device_id} > ${train_job_dir}/train_1p.log 2>&1 + +else + export KERNEL_NAME_ID=${device_id} + rank_id=$6 + python3.7 ${currentDir}/code/DistributedResnet50/main-apex-d76-npu.py \ + --data=${data_url} \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed=49 \ + --workers=184 \ + --learning-rate=${lr} \ + --warmup=8 \ + --label-smoothing=0.1 \ + --mom=0.875 \ + --weight-decay=3.0517578125e-05 \ + --static-loss-scale=128 \ + --print-freq=1 \ + --dist-url='tcp://127.0.0.1:50000' \ + --dist-backend='hccl' \ + --multiprocessing-distributed \ + --world-size=1 \ + --rank=${rank_id} \ + --gpu=${device_id} \ + --benchmark=0 \ + --device='npu' \ + --epochs=${epoches} \ + --device_num=${rank_size} \ + --batch-size=${batch_size} > ${train_job_dir}/train_${rank_size}p.log 2>&1 +fi + +if [ $? -eq 0 ] ; +then + echo ":::ABK 1.0.0 resnet50 train success" + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/${device_id}/hw_resnet50.log +else + echo ":::ABK 1.0.0 resnet50 train failed" + echo ":::ABK 1.0.0 resnet50 train failed" >>${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 resnet50 train failed" >> ${train_job_dir}/${device_id}/hw_resnet50.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnet50.log + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/README.md new file mode 100644 index 0000000..c495b88 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/README.md @@ -0,0 +1,38 @@ +# ResNet50_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/ResNet50.yaml中修改相应配置, 配置项含义: + +``` + tensorflow_config: + data_url: 数据集路径 + batch_size: 32 + # 1p/8p, epoches设为90 + epoches: 1 + max_train_steps: 1000 + epochs_between_evals: 1 + iterations_per_loop: 100 + save_checkpoints_steps: 115200 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/Dockerfile b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/Dockerfile new file mode 100644 index 0000000..db01c07 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/Dockerfile @@ -0,0 +1,36 @@ +FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 + + +WORKDIR /research + +RUN apt-get update + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + build-essential \ + git \ + python \ + python-pip + + +ENV HOME /research +ENV PYENV_ROOT $HOME/.pyenv +ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH + + +RUN apt-get install -y python-setuptools + +RUN apt-get install -y python-pip python3-pip virtualenv htop +RUN pip3 install --upgrade numpy scipy sklearn tf-nightly-gpu + + +# Mount data into the docker +ADD . /research/resnet + + +WORKDIR /research/resnet +RUN pip3 install -r official/requirements.txt + + +ENTRYPOINT ["/bin/bash"] + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/cloud_docker_init.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/cloud_docker_init.sh new file mode 100644 index 0000000..3981b51 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/cloud_docker_init.sh @@ -0,0 +1,47 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +DEVICE_LIST=$@ + +export exec_type={MODE} + +prog_exit() +{ + if [ x"${exec_type}" = xdocker ]; + then + # stop slogd progress + bash /usr/local/Ascend/driver/tools/docker_stop_post_sys.sh + fi +} + +# register prog_exit +trap "prog_exit" SIGTERM + +if [ x"${exec_type}" = xdocker ]; +then + #set env + . ${currentDir}/npu_set_env.sh + + # start slogd progress + mkdir -p /var/log/npu/slog/slogd + /usr/local/Ascend/driver/tools/docker/slogd & + + # start main.sh + ${currentDir}/main.sh ${DEVICE_LIST} & + + # wait slogd stop + flag=1 + while [ $flag -ne 0 ]; + do + sleep 5; + flag=`ps -ef | grep train.sh | grep -v grep | wc -l` + ps -ef >> ${currentDir}/ps.log + echo "" >> ${currentDir}/ps.log + done +else + # start main.sh + su - HwHiAiUser -c ". ${currentDir}/npu_set_env.sh;${currentDir}/main.sh ${DEVICE_LIST}" & + wait +fi + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/hccl_sample.json b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/hccl_sample.json new file mode 100644 index 0000000..4f0474d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/hccl_sample.json @@ -0,0 +1,13 @@ +{ +"group_count": "1", +"group_list": [ +{ + "group_name": "worker", + "device_count": "{device_count}", + "instance_count": "{instance_count}", + "instance_list": [{instance_list}] +} +], +"status": "completed" +} + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/main_sample.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/main_sample.sh new file mode 100644 index 0000000..a43856f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/main_sample.sh @@ -0,0 +1,18 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +device_group=$@ +device_num=$# + +touch ${currentDir}/main.log + +for device_phy_id in ${device_group} +do + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train.sh ${device_phy_id} & " >> ${currentDir}/main.log + ${currentDir}/train.sh ${device_phy_id} & +done + +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train.sh exit " >> ${currentDir}/main.log diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/npu_set_env.sh new file mode 100644 index 0000000..1935bb0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/npu_set_env.sh @@ -0,0 +1,28 @@ +# main env +export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/opp/op_impl/built-in/ai_core/tbe:/code +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export DDK_VERSION_FLAG=1.60.T17.B830 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +export RANK_SIZE={RANK_SIZE} +export RANK_INDEX={RANK_INDEX} +export RANK_ID={RANK_ID} + +# profiling env +export PROFILING_MODE={PROFILING_MODE} +export AICPU_PROFILING_MODE={AICPU_PROFILING_MODE} +export PROFILING_OPTIONS={PROFILING_OPTIONS} +export FP_POINT={FP_POINT} +export BP_POINT={BP_POINT} + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/train_sample.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/train_sample.sh new file mode 100644 index 0000000..b4ee768 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/bin/train_sample.sh @@ -0,0 +1,33 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +PWD=${currentDir} + +device_id=$1 +if [ x"${device_id}" = x ] ; +then + echo "turing train fail" >> ${currentDir}/train_${device_id}.log + exit +else + export DEVICE_ID=${device_id} +fi + +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +env > ${currentDir}/env_${device_id}.log + +#mkdir exec path +mkdir -p ${currentDir}/${device_id} +rm -rf ${currentDir}/${device_id}/* +cd ${currentDir}/${device_id} + +#start exec +python3.7 {RUN_ALGORITHM_CMD} {CHECKPOINT_DIR} > ${currentDir}/train_${device_id}.log 2>&1 +if [ $? -eq 0 ] ; +then + echo "turing train success" >> ${currentDir}/train_${device_id}.log +else + echo "turing train fail" >> ${currentDir}/train_${device_id}.log +fi diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/LICENSE b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/LICENSE new file mode 100644 index 0000000..d3da228 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/LICENSE @@ -0,0 +1,203 @@ +Copyright 2015 The TensorFlow Authors. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015, The TensorFlow Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README-TPU.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README-TPU.md new file mode 100644 index 0000000..5d888b9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README-TPU.md @@ -0,0 +1,20 @@ +# Offically Supported TensorFlow 2.1 Models on Cloud TPU + +## Natural Language Processing + +* [bert](nlp/bert): A powerful pre-trained language representation model: + BERT, which stands for Bidirectional Encoder Representations from + Transformers. + [BERT FineTuning with Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/bert-2.x) provides step by step instructions on Cloud TPU training. You can look [Bert MNLI Tensorboard.dev metrics](https://tensorboard.dev/experiment/mIah5lppTASvrHqWrdr6NA) for MNLI fine tuning task. +* [transformer](nlp/transformer): A transformer model to translate the WMT + English to German dataset. + [Training transformer on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/transformer-2.x) for step by step instructions on Cloud TPU training. + +## Computer Vision + +* [mnist](vision/image_classification): A basic model to classify digits + from the MNIST dataset. See [Running MNIST on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/mnist-2.x) tutorial and [Tensorboard.dev metrics](https://tensorboard.dev/experiment/mIah5lppTASvrHqWrdr6NA). +* [resnet](vision/image_classification): A deep residual network that can + be used to classify ImageNet's dataset of 1000 classes. + See [Training ResNet on Cloud TPU](https://cloud.google.com/tpu/docs/tutorials/resnet-2.x) tutorial and [Tensorboard.dev metrics](https://tensorboard.dev/experiment/CxlDK8YMRrSpYEGtBRpOhg). +* [retinanet](vision/detection): A fast and powerful object detector. See [Tensorboard.dev training metrics](https://tensorboard.dev/experiment/b8NRnWU3TqG6Rw0UxueU6Q). diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README.md new file mode 100644 index 0000000..359b9d9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/README.md @@ -0,0 +1,149 @@ +# TensorFlow Official Models + +The TensorFlow official models are a collection of models that use +TensorFlow's high-level APIs. They are intended to be well-maintained, tested, +and kept up to date with the latest TensorFlow API. They should also be +reasonably optimized for fast performance while still being easy to read. + +These models are used as end-to-end tests, ensuring that the models run with the +same or improved speed and performance with each new TensorFlow build. + +## Tensorflow releases + +The master branch of the models are **in development** with TensorFlow 2.x, and +they target the +[nightly binaries](https://github.com/tensorflow/tensorflow#installation) built +from the +[master branch of TensorFlow](https://github.com/tensorflow/tensorflow/tree/master). +You may start from installing with pip: + +```shell +pip3 install tf-nightly +``` + +**Stable versions** of the official models targeting releases of TensorFlow are +available as tagged branches or +[downloadable releases](https://github.com/tensorflow/models/releases). Model +repository version numbers match the target TensorFlow release, such that +[release v2.1.0](https://github.com/tensorflow/models/releases/tag/v2.1.0) are +compatible with +[TensorFlow v2.1.0](https://github.com/tensorflow/tensorflow/releases/tag/v2.1.0). + +If you are on a version of TensorFlow earlier than 1.4, please +[update your installation](https://www.tensorflow.org/install/). + +## Requirements + +Please follow the below steps before running models in this repo: + +1. TensorFlow + [nightly binaries](https://github.com/tensorflow/tensorflow#installation) + +2. If users would like to clone this repo but do not care about change history, +please consider: + + ```shell + export repo_version="master" + git clone -b ${repo_version} https://github.com/tensorflow/models.git --depth=1 + ``` + +3. Add the top-level ***/models*** folder to the Python path with the command: + + ```shell + export PYTHONPATH=$PYTHONPATH:/path/to/models + ``` + + Using Colab: + + ```python + import os + os.environ['PYTHONPATH'] += ":/path/to/models" + ``` + +4. Install dependencies: + + ```shell + pip3 install --user -r official/requirements.txt + ``` + + +To make Official Models easier to use, we are planning to create a pip +installable Official Models package. This is being tracked in +[#917](https://github.com/tensorflow/models/issues/917). + +## Available models + +**NOTE: For Officially Supported TPU models please check [README-TPU](README-TPU.md).** + +**NOTE:** Please make sure to follow the steps in the +[Requirements](#requirements) section. + +### Natural Language Processing + +* [bert](nlp/bert): A powerful pre-trained language representation model: + BERT, which stands for Bidirectional Encoder Representations from + Transformers. +* [transformer](nlp/transformer): A transformer model to translate the WMT English + to German dataset. +* [xlnet](nlp/xlnet): XLNet: Generalized Autoregressive Pretraining for + Language Understanding. + +### Computer Vision + +* [mnist](vision/image_classification): A basic model to classify digits from + the MNIST dataset. +* [resnet](vision/image_classification): A deep residual network that can be + used to classify both CIFAR-10 and ImageNet's dataset of 1000 classes. +* [retinanet](vision/detection): A fast and powerful object detector. + +### Others + +* [ncf](recommendation): Neural Collaborative Filtering model for + recommendation tasks. + +Models that will not update to TensorFlow 2.x stay inside R1 directory: + +* [boosted_trees](r1/boosted_trees): A Gradient Boosted Trees model to + classify higgs boson process from HIGGS Data Set. +* [wide_deep](r1/wide_deep): A model that combines a wide model and deep + network to classify census income data. + +## More models to come! + +We are in the progress to revamp official model garden with TensorFlow 2.0 and +Keras. In the near future, we will bring: + +* State-of-the-art language understanding models: XLNet, GPT2, and more + members in Transformer family. +* Start-of-the-art image classification models: EfficientNet, MnasNet and + variants. +* A set of excellent objection detection models. + +If you would like to make any fixes or improvements to the models, please +[submit a pull request](https://github.com/tensorflow/models/compare). + +## New Models + +The team is actively working to add new models to the repository. Every model +should follow the following guidelines, to uphold the our objectives of +readable, usable, and maintainable code. + +**General guidelines** + +* Code should be well documented and tested. +* Runnable from a blank environment with relative ease. +* Trainable on: single GPU/CPU (baseline), multiple GPUs, TPU +* Compatible with Python 3 (using [six](https://pythonhosted.org/six/) when + being compatible with Python 2 is necessary) +* Conform to [Google Python Style Guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md) + +**Implementation guidelines** + +These guidelines exist so the model implementations are consistent for better +readability and maintainability. + +* Use [common utility functions](utils) +* Export SavedModel at the end of training. +* Consistent flags and flag-parsing library + ([read more here](utils/flags/guidelines.md)) +* Produce benchmarks and logs ([read more here](utils/logs/guidelines.md)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json new file mode 100644 index 0000000..cc571d4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_metric.json @@ -0,0 +1,56 @@ +[ + { + "description": "The ID of the benchmark run, where this metric should tie to.", + "mode": "REQUIRED", + "name": "run_id", + "type": "STRING" + }, + { + "description": "The name of the metric, which should be descriptive. E.g. training_loss, accuracy.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The unit of the metric. E.g. MB per sec.", + "mode": "NULLABLE", + "name": "unit", + "type": "STRING" + }, + { + "description": "The value of the metric.", + "mode": "NULLABLE", + "name": "value", + "type": "FLOAT" + }, + { + "description": "The timestamp when the metric is recorded.", + "mode": "REQUIRED", + "name": "timestamp", + "type": "TIMESTAMP" + }, + { + "description": "The global step when this metric is recorded.", + "mode": "NULLABLE", + "name": "global_step", + "type": "INTEGER" + }, + { + "description": "Free format metadata for the extra information about the metric.", + "mode": "REPEATED", + "name": "extras", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "name", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ] + } +] diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json new file mode 100644 index 0000000..58e5ddc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run.json @@ -0,0 +1,368 @@ +[ + { + "description": "The UUID of the run for the benchmark.", + "mode": "REQUIRED", + "name": "model_id", + "type": "STRING" + }, + { + "description": "The name of the model, E.g ResNet50, LeNet-5 etc.", + "mode": "REQUIRED", + "name": "model_name", + "type": "STRING" + }, + { + "description": "The date when the test of the model is started", + "mode": "REQUIRED", + "name": "run_date", + "type": "TIMESTAMP" + }, + { + "description": "The unique name for a test by the combination of key parameters, eg batch size, num of GPU, etc. It is hardware independent.", + "mode": "NULLABLE", + "name": "test_id", + "type": "STRING" + }, + { + "description": "The tensorflow version information.", + "fields": [ + { + "description": "Version of the tensorflow. E.g. 1.7.0-rc0", + "mode": "REQUIRED", + "name": "version", + "type": "STRING" + }, + { + "description": "Git Hash of the tensorflow", + "mode": "NULLABLE", + "name": "git_hash", + "type": "STRING" + }, + { + "description": "The channel of the tensorflow binary, eg, nightly, RC, final, custom.", + "mode": "NULLABLE", + "name": "channel", + "type": "STRING" + }, + { + "description": "Identify anything special about the build, eg CUDA 10, NCCL, MKL, etc.", + "mode": "NULLABLE", + "name": "build_type", + "type": "STRING" + } + ], + "mode": "REQUIRED", + "name": "tensorflow_version", + "type": "RECORD" + }, + { + "description": "The arbitrary attribute of the model.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + }, + { + "description": "Environment variables when the benchmark run is executed.", + "fields": [ + { + "description": "The name of the variable.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the variable.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "environment_variable", + "type": "RECORD" + }, + { + "description": "TF Environment variables when the benchmark run is executed.", + "fields": [ + { + "description": "The name of the variable.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the variable.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "tensorflow_environment_variables", + "type": "RECORD" + }, + { + "description": "The list of parameters run with the model. It could contain hyperparameters or others.", + "fields": [ + { + "description": "The name of the parameter.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The string value of the parameter.", + "mode": "NULLABLE", + "name": "string_value", + "type": "STRING" + }, + { + "description": "The bool value of the parameter.", + "mode": "NULLABLE", + "name": "bool_value", + "type": "STRING" + }, + { + "description": "The int/long value of the parameter.", + "mode": "NULLABLE", + "name": "long_value", + "type": "INTEGER" + }, + { + "description": "The double/float value of parameter.", + "mode": "NULLABLE", + "name": "float_value", + "type": "FLOAT" + } + ], + "mode": "REPEATED", + "name": "run_parameters", + "type": "RECORD" + }, + { + "description": "The dataset that run with the benchmark.", + "mode": "NULLABLE", + "name": "dataset", + "type": "RECORD", + "fields": [ + { + "description": "The name of the dataset that the model is trained/validated with. E.g ImageNet, mnist.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The arbitrary attribute of the dataset.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + } + ] + }, + { + "description": "Used to differentiate from AWS, GCE or DGX-1 at a high level", + "mode": "NULLABLE", + "name": "test_environment", + "type": "STRING" + }, + { + "description": "The machine configuration of the benchmark run.", + "mode": "NULLABLE", + "name": "machine_config", + "type": "RECORD", + "fields": [ + { + "description": "The platform information of the benchmark run.", + "mode": "NULLABLE", + "name": "platform_info", + "type": "RECORD", + "fields": [ + { + "description": "Eg: 64bit.", + "mode": "NULLABLE", + "name": "bits", + "type": "STRING" + }, + { + "description": "Eg: ELF.", + "mode": "NULLABLE", + "name": "linkage", + "type": "STRING" + }, + { + "description": "Eg: i386.", + "mode": "NULLABLE", + "name": "machine", + "type": "STRING" + }, + { + "description": "Eg: 3.13.0-76-generic.", + "mode": "NULLABLE", + "name": "release", + "type": "STRING" + }, + { + "description": "Eg: Linux.", + "mode": "NULLABLE", + "name": "system", + "type": "STRING" + }, + { + "description": "Eg: #120-Ubuntu SMP Mon Jan 18 15:59:10 UTC 2016.", + "mode": "NULLABLE", + "name": "version", + "type": "STRING" + } + ] + }, + { + "description": "The CPU information of the benchmark run.", + "mode": "NULLABLE", + "name": "cpu_info", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "num_cores", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "num_cores_allowed", + "type": "INTEGER" + }, + { + "description" : "How fast are those CPUs.", + "mode": "NULLABLE", + "name": "mhz_per_cpu", + "type": "FLOAT" + }, + { + "description" : "Additional CPU info, Eg: Intel Ivybridge with HyperThreading (24 cores).", + "mode": "NULLABLE", + "name": "cpu_info", + "type": "STRING" + }, + { + "description" : "What kind of cpu scaling is enabled on the host. Eg performance, ondemand, conservative, mixed.", + "mode": "NULLABLE", + "name": "cpu_governor", + "type": "STRING" + }, + { + "description": "Cache size of the CPUs.", + "mode": "NULLABLE", + "name": "cache_size", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "level", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "size", + "type": "INTEGER" + } + ] + } + ] + }, + { + "mode": "NULLABLE", + "name": "gpu_info", + "type": "RECORD", + "fields": [ + { + "mode": "NULLABLE", + "name": "count", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "model", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "cuda_version", + "type": "STRING" + } + ] + }, + { + "description": "The cloud instance inforation if the benchmark run is executed on cloud", + "mode": "NULLABLE", + "name": "cloud_info", + "type": "RECORD", + "fields": [ + { + "description": "The instance type, E.g. n1-standard-4.", + "mode": "NULLABLE", + "name": "instance_type", + "type": "STRING" + }, + { + "description": "The arbitrary attribute of the cloud info.", + "fields": [ + { + "description": "The name of the attribute.", + "mode": "REQUIRED", + "name": "name", + "type": "STRING" + }, + { + "description": "The value of the attribute.", + "mode": "NULLABLE", + "name": "value", + "type": "STRING" + } + ], + "mode": "REPEATED", + "name": "attribute", + "type": "RECORD" + } + ] + }, + { + "mode": "NULLABLE", + "name": "memory_total", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "memory_available", + "type": "STRING" + } + ] + } +] diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json new file mode 100644 index 0000000..f7ac59e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/datastore/schema/benchmark_run_status.json @@ -0,0 +1,14 @@ +[ + { + "description": "The UUID of the run for the benchmark.", + "mode": "REQUIRED", + "name": "run_id", + "type": "STRING" + }, + { + "description": "The status of the run for the benchmark. Eg, running, failed, success", + "mode": "REQUIRED", + "name": "status", + "type": "STRING" + } +] \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_main.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_main.py new file mode 100644 index 0000000..e2d69b5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_main.py @@ -0,0 +1,285 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the Cifar-10 dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app +from absl import flags +import numpy as np +import tensorflow as tf +from official.benchmark.models import resnet_cifar_model +from official.utils.flags import core as flags_core +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import keras_utils +from official.vision.image_classification.resnet import cifar_preprocessing +from official.vision.image_classification.resnet import common + + +LR_SCHEDULE = [ # (multiplier, epoch to start) tuples + (0.1, 91), (0.01, 136), (0.001, 182) +] + + +def learning_rate_schedule(current_epoch, + current_batch, + batches_per_epoch, + batch_size): + """Handles linear scaling rule and LR decay. + + Scale learning rate at epoch boundaries provided in LR_SCHEDULE by the + provided scaling factor. + + Args: + current_epoch: integer, current epoch indexed from 0. + current_batch: integer, current batch in the current epoch, indexed from 0. + batches_per_epoch: integer, number of steps in an epoch. + batch_size: integer, total batch sized. + + Returns: + Adjusted learning rate. + """ + del current_batch, batches_per_epoch # not used + initial_learning_rate = common.BASE_LEARNING_RATE * batch_size / 128 + learning_rate = initial_learning_rate + for mult, start_epoch in LR_SCHEDULE: + if current_epoch >= start_epoch: + learning_rate = initial_learning_rate * mult + else: + break + return learning_rate + + +class LearningRateBatchScheduler(tf.keras.callbacks.Callback): + """Callback to update learning rate on every batch (not epoch boundaries). + + N.B. Only support Keras optimizers, not TF optimizers. + + Attributes: + schedule: a function that takes an epoch index and a batch index as input + (both integer, indexed from 0) and returns a new learning rate as + output (float). + """ + + def __init__(self, schedule, batch_size, steps_per_epoch): + super(LearningRateBatchScheduler, self).__init__() + self.schedule = schedule + self.steps_per_epoch = steps_per_epoch + self.batch_size = batch_size + self.epochs = -1 + self.prev_lr = -1 + + def on_epoch_begin(self, epoch, logs=None): + if not hasattr(self.model.optimizer, 'learning_rate'): + raise ValueError('Optimizer must have a "learning_rate" attribute.') + self.epochs += 1 + + def on_batch_begin(self, batch, logs=None): + """Executes before step begins.""" + lr = self.schedule(self.epochs, + batch, + self.steps_per_epoch, + self.batch_size) + if not isinstance(lr, (float, np.float32, np.float64)): + raise ValueError('The output of the "schedule" function should be float.') + if lr != self.prev_lr: + self.model.optimizer.learning_rate = lr # lr should be a float here + self.prev_lr = lr + tf.compat.v1.logging.debug( + 'Epoch %05d Batch %05d: LearningRateBatchScheduler ' + 'change learning rate to %s.', self.epochs, batch, lr) + + +def run(flags_obj): + """Run ResNet Cifar-10 training and eval loop using native Keras APIs. + + Args: + flags_obj: An object containing parsed flag values. + + Raises: + ValueError: If fp16 is passed as it is not currently supported. + + Returns: + Dictionary of training and eval stats. + """ + keras_utils.set_session_config( + enable_eager=flags_obj.enable_eager, + enable_xla=flags_obj.enable_xla) + + # Execute flag override logic for better model performance + if flags_obj.tf_gpu_thread_mode: + keras_utils.set_gpu_thread_mode_and_count( + per_gpu_thread_count=flags_obj.per_gpu_thread_count, + gpu_thread_mode=flags_obj.tf_gpu_thread_mode, + num_gpus=flags_obj.num_gpus, + datasets_num_private_threads=flags_obj.datasets_num_private_threads) + common.set_cudnn_batchnorm_mode() + + dtype = flags_core.get_tf_dtype(flags_obj) + if dtype == 'fp16': + raise ValueError('dtype fp16 is not supported in Keras. Use the default ' + 'value(fp32).') + + data_format = flags_obj.data_format + if data_format is None: + data_format = ('channels_first' + if tf.test.is_built_with_cuda() else 'channels_last') + tf.keras.backend.set_image_data_format(data_format) + + strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_obj.num_gpus, + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs) + + if strategy: + # flags_obj.enable_get_next_as_optional controls whether enabling + # get_next_as_optional behavior in DistributedIterator. If true, last + # partial batch can be supported. + strategy.extended.experimental_enable_get_next_as_optional = ( + flags_obj.enable_get_next_as_optional + ) + + strategy_scope = distribution_utils.get_strategy_scope(strategy) + + if flags_obj.use_synthetic_data: + distribution_utils.set_up_synthetic_data() + input_fn = common.get_synth_input_fn( + height=cifar_preprocessing.HEIGHT, + width=cifar_preprocessing.WIDTH, + num_channels=cifar_preprocessing.NUM_CHANNELS, + num_classes=cifar_preprocessing.NUM_CLASSES, + dtype=flags_core.get_tf_dtype(flags_obj), + drop_remainder=True) + else: + distribution_utils.undo_set_up_synthetic_data() + input_fn = cifar_preprocessing.input_fn + + train_input_dataset = input_fn( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=cifar_preprocessing.parse_record, + datasets_num_private_threads=flags_obj.datasets_num_private_threads, + dtype=dtype, + # Setting drop_remainder to avoid the partial batch logic in normalization + # layer, which triggers tf.where and leads to extra memory copy of input + # sizes between host and GPU. + drop_remainder=(not flags_obj.enable_get_next_as_optional)) + + eval_input_dataset = None + if not flags_obj.skip_eval: + eval_input_dataset = input_fn( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + parse_record_fn=cifar_preprocessing.parse_record) + + steps_per_epoch = ( + cifar_preprocessing.NUM_IMAGES['train'] // flags_obj.batch_size) + lr_schedule = 0.1 + if flags_obj.use_tensor_lr: + initial_learning_rate = common.BASE_LEARNING_RATE * flags_obj.batch_size / 128 + lr_schedule = tf.keras.optimizers.schedules.PiecewiseConstantDecay( + boundaries=list(p[1] * steps_per_epoch for p in LR_SCHEDULE), + values=[initial_learning_rate] + + list(p[0] * initial_learning_rate for p in LR_SCHEDULE)) + + with strategy_scope: + optimizer = common.get_optimizer(lr_schedule) + model = resnet_cifar_model.resnet56(classes=cifar_preprocessing.NUM_CLASSES) + model.compile( + loss='sparse_categorical_crossentropy', + optimizer=optimizer, + metrics=(['sparse_categorical_accuracy'] + if flags_obj.report_accuracy_metrics else None), + run_eagerly=flags_obj.run_eagerly) + + train_epochs = flags_obj.train_epochs + + callbacks = common.get_callbacks(steps_per_epoch) + + if not flags_obj.use_tensor_lr: + lr_callback = LearningRateBatchScheduler( + schedule=learning_rate_schedule, + batch_size=flags_obj.batch_size, + steps_per_epoch=steps_per_epoch) + callbacks.append(lr_callback) + + # if mutliple epochs, ignore the train_steps flag. + if train_epochs <= 1 and flags_obj.train_steps: + steps_per_epoch = min(flags_obj.train_steps, steps_per_epoch) + train_epochs = 1 + + num_eval_steps = (cifar_preprocessing.NUM_IMAGES['validation'] // + flags_obj.batch_size) + + validation_data = eval_input_dataset + if flags_obj.skip_eval: + if flags_obj.set_learning_phase_to_train: + # TODO(haoyuzhang): Understand slowdown of setting learning phase when + # not using distribution strategy. + tf.keras.backend.set_learning_phase(1) + num_eval_steps = None + validation_data = None + + if not strategy and flags_obj.explicit_gpu_placement: + # TODO(b/135607227): Add device scope automatically in Keras training loop + # when not using distribition strategy. + no_dist_strat_device = tf.device('/device:GPU:0') + no_dist_strat_device.__enter__() + + history = model.fit(train_input_dataset, + epochs=train_epochs, + steps_per_epoch=steps_per_epoch, + callbacks=callbacks, + validation_steps=num_eval_steps, + validation_data=validation_data, + validation_freq=flags_obj.epochs_between_evals, + verbose=2) + eval_output = None + if not flags_obj.skip_eval: + eval_output = model.evaluate(eval_input_dataset, + steps=num_eval_steps, + verbose=2) + + if not strategy and flags_obj.explicit_gpu_placement: + no_dist_strat_device.__exit__() + + stats = common.build_stats(history, eval_output, callbacks) + return stats + + +def define_cifar_flags(): + common.define_keras_flags(dynamic_loss_scale=False) + + flags_core.set_defaults(data_dir='/tmp/cifar10_data/cifar-10-batches-bin', + model_dir='/tmp/cifar10_model', + epochs_between_evals=10, + batch_size=128) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + return run(flags.FLAGS) + + +if __name__ == '__main__': + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + define_cifar_flags() + app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_model.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_model.py new file mode 100644 index 0000000..1b50738 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_model.py @@ -0,0 +1,262 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""ResNet56 model for Keras adapted from tf.keras.applications.ResNet50. + +# Reference: +- [Deep Residual Learning for Image Recognition]( + https://arxiv.org/abs/1512.03385) +Adapted from code contributed by BigMoyan. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import tensorflow as tf +from tensorflow.python.keras import backend +from tensorflow.python.keras import initializers +from tensorflow.python.keras import layers +from tensorflow.python.keras import regularizers + + +BATCH_NORM_DECAY = 0.997 +BATCH_NORM_EPSILON = 1e-5 +L2_WEIGHT_DECAY = 2e-4 + + +def identity_building_block(input_tensor, + kernel_size, + filters, + stage, + block, + training=None): + """The identity block is the block that has no conv layer at shortcut. + + Arguments: + input_tensor: input tensor + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: current block label, used for generating layer names + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor for the block. + """ + filters1, filters2 = filters + if backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D(filters1, kernel_size, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2a')(input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2a')(x, training=training) + x = layers.Activation('relu')(x) + + x = layers.Conv2D(filters2, kernel_size, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2b')(x) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2b')(x, training=training) + + x = layers.add([x, input_tensor]) + x = layers.Activation('relu')(x) + return x + + +def conv_building_block(input_tensor, + kernel_size, + filters, + stage, + block, + strides=(2, 2), + training=None): + """A block that has a conv layer at shortcut. + + Arguments: + input_tensor: input tensor + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + block: current block label, used for generating layer names + strides: Strides for the first conv layer in the block. + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor for the block. + + Note that from stage 3, + the first conv layer at main path is with strides=(2, 2) + And the shortcut should have strides=(2, 2) as well + """ + filters1, filters2 = filters + if tf.keras.backend.image_data_format() == 'channels_last': + bn_axis = 3 + else: + bn_axis = 1 + conv_name_base = 'res' + str(stage) + block + '_branch' + bn_name_base = 'bn' + str(stage) + block + '_branch' + + x = layers.Conv2D(filters1, kernel_size, strides=strides, + padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2a')(input_tensor) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2a')(x, training=training) + x = layers.Activation('relu')(x) + + x = layers.Conv2D(filters2, kernel_size, padding='same', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '2b')(x) + x = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '2b')(x, training=training) + + shortcut = layers.Conv2D(filters2, (1, 1), strides=strides, use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name=conv_name_base + '1')(input_tensor) + shortcut = layers.BatchNormalization( + axis=bn_axis, momentum=BATCH_NORM_DECAY, epsilon=BATCH_NORM_EPSILON, + name=bn_name_base + '1')(shortcut, training=training) + + x = layers.add([x, shortcut]) + x = layers.Activation('relu')(x) + return x + + +def resnet_block(input_tensor, + size, + kernel_size, + filters, + stage, + conv_strides=(2, 2), + training=None): + """A block which applies conv followed by multiple identity blocks. + + Arguments: + input_tensor: input tensor + size: integer, number of constituent conv/identity building blocks. + A conv block is applied once, followed by (size - 1) identity blocks. + kernel_size: default 3, the kernel size of + middle conv layer at main path + filters: list of integers, the filters of 3 conv layer at main path + stage: integer, current stage label, used for generating layer names + conv_strides: Strides for the first conv layer in the block. + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + Output tensor after applying conv and identity blocks. + """ + + x = conv_building_block(input_tensor, kernel_size, filters, stage=stage, + strides=conv_strides, block='block_0', + training=training) + for i in range(size - 1): + x = identity_building_block(x, kernel_size, filters, stage=stage, + block='block_%d' % (i + 1), training=training) + return x + + +def resnet(num_blocks, classes=10, training=None): + """Instantiates the ResNet architecture. + + Arguments: + num_blocks: integer, the number of conv/identity blocks in each block. + The ResNet contains 3 blocks with each block containing one conv block + followed by (layers_per_block - 1) number of idenity blocks. Each + conv/idenity block has 2 convolutional layers. With the input + convolutional layer and the pooling layer towards the end, this brings + the total size of the network to (6*num_blocks + 2) + classes: optional number of classes to classify images into + training: Only used if training keras model with Estimator. In other + scenarios it is handled automatically. + + Returns: + A Keras model instance. + """ + + input_shape = (32, 32, 3) + img_input = layers.Input(shape=input_shape) + + if backend.image_data_format() == 'channels_first': + x = layers.Lambda(lambda x: backend.permute_dimensions(x, (0, 3, 1, 2)), + name='transpose')(img_input) + bn_axis = 1 + else: # channel_last + x = img_input + bn_axis = 3 + + x = layers.ZeroPadding2D(padding=(1, 1), name='conv1_pad')(x) + x = layers.Conv2D(16, (3, 3), + strides=(1, 1), + padding='valid', use_bias=False, + kernel_initializer='he_normal', + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name='conv1')(x) + x = layers.BatchNormalization(axis=bn_axis, + momentum=BATCH_NORM_DECAY, + epsilon=BATCH_NORM_EPSILON, + name='bn_conv1',)(x, training=training) + x = layers.Activation('relu')(x) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[16, 16], + stage=2, conv_strides=(1, 1), training=training) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[32, 32], + stage=3, conv_strides=(2, 2), training=training) + + x = resnet_block(x, size=num_blocks, kernel_size=3, filters=[64, 64], + stage=4, conv_strides=(2, 2), training=training) + + rm_axes = [1, 2] if backend.image_data_format() == 'channels_last' else [2, 3] + x = layers.Lambda(lambda x: backend.mean(x, rm_axes), name='reduce_mean')(x) + x = layers.Dense(classes, + activation='softmax', + kernel_initializer=initializers.RandomNormal(stddev=0.01), + kernel_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + bias_regularizer=regularizers.l2(L2_WEIGHT_DECAY), + name='fc10')(x) + + inputs = img_input + # Create model. + model = tf.keras.models.Model(inputs, x, name='resnet56') + + return model + + +resnet20 = functools.partial(resnet, num_blocks=3) +resnet32 = functools.partial(resnet, num_blocks=5) +resnet56 = functools.partial(resnet, num_blocks=9) +resnet10 = functools.partial(resnet, num_blocks=110) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_test.py new file mode 100644 index 0000000..6dbb2fa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/models/resnet_cifar_test.py @@ -0,0 +1,187 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test the keras ResNet model with Cifar data.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tempfile + +import tensorflow as tf + +from tensorflow.python.eager import context +from tensorflow.python.platform import googletest +from official.benchmark.models import resnet_cifar_main +from official.utils.misc import keras_utils +from official.utils.testing import integration +from official.vision.image_classification.resnet import cifar_preprocessing + + +class KerasCifarTest(googletest.TestCase): + """Unit tests for Keras ResNet with Cifar.""" + + _extra_flags = [ + "-batch_size", "4", + "-train_steps", "1", + "-use_synthetic_data", "true" + ] + _tempdir = None + + def get_temp_dir(self): + if not self._tempdir: + self._tempdir = tempfile.mkdtemp(dir=googletest.GetTempDir()) + return self._tempdir + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(KerasCifarTest, cls).setUpClass() + resnet_cifar_main.define_cifar_flags() + + def setUp(self): + super(KerasCifarTest, self).setUp() + cifar_preprocessing.NUM_IMAGES["validation"] = 4 + + def tearDown(self): + super(KerasCifarTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + def test_end_to_end_no_dist_strat(self): + """Test Keras model with 1 GPU, no distribution strategy.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + extra_flags = [ + "-distribution_strategy", "off", + "-model_dir", "keras_cifar_no_dist_strat", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_no_dist_strat(self): + """Test Keras model in legacy graph mode with 1 GPU, no dist strat.""" + extra_flags = [ + "-enable_eager", "false", + "-distribution_strategy", "off", + "-model_dir", "keras_cifar_graph_no_dist_strat", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_1_gpu(self): + """Test Keras model with 1 GPU.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + if context.num_gpus() < 1: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(1, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "1", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_1_gpu", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_1_gpu(self): + """Test Keras model in legacy graph mode with 1 GPU.""" + if context.num_gpus() < 1: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(1, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "1", + "-noenable_eager", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_graph_1_gpu", + "-data_format", "channels_last", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_2_gpu(self): + """Test Keras model with 2 GPUs.""" + config = keras_utils.get_config_proto_v1() + tf.compat.v1.enable_eager_execution(config=config) + + if context.num_gpus() < 2: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(2, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "2", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_2_gpu", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + def test_end_to_end_graph_2_gpu(self): + """Test Keras model in legacy graph mode with 2 GPUs.""" + if context.num_gpus() < 2: + self.skipTest( + "{} GPUs are not available for this test. {} GPUs are available". + format(2, context.num_gpus())) + + extra_flags = [ + "-num_gpus", "2", + "-enable_eager", "false", + "-distribution_strategy", "mirrored", + "-model_dir", "keras_cifar_graph_2_gpu", + ] + extra_flags = extra_flags + self._extra_flags + + integration.run_synthetic( + main=resnet_cifar_main.run, + tmp_root=self.get_temp_dir(), + extra_flags=extra_flags + ) + + +if __name__ == "__main__": + googletest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/resnet_tf_r1_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/resnet_tf_r1_benchmark.py new file mode 100644 index 0000000..124b755 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/benchmark/resnet_tf_r1_benchmark.py @@ -0,0 +1,259 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes CTL benchmarks and accuracy tests.""" +from __future__ import print_function + +import os +import sys +import time +# import pydevd_pycharm +# pydevd_pycharm.settrace('90.253.17.223', port=8008, stdoutToServer=True, stderrToServer=True, suspend=False) +# pylint: disable=g-bad-import-order +from absl import flags +import tensorflow as tf + +#sys.path.append(r"/home/wx933135/0708/ResNet50/tensorflow/code") + +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../../utils/atlasboost')) + +from official.r1.resnet import imagenet_main +from official.utils.testing.perfzero_benchmark import PerfZeroBenchmark +from official.utils.testing import benchmark_wrappers +from official.utils.flags import core as flags_core +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +MIN_TOP_1_ACCURACY = 0.76 +MAX_TOP_1_ACCURACY = 0.77 + +flags.DEFINE_integer('iterations_per_loop', 1000,'iterations per loop') +flags.DEFINE_integer('save_checkpoints_steps', 115200,'save checkpoints steps') +FLAGS = flags.FLAGS +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../config')) + + +class CtlBenchmark(PerfZeroBenchmark): + """Base benchmark class with methods to simplify testing.""" + + def __init__(self, output_dir=None, default_flags=None, flag_methods=None): + self.output_dir = output_dir + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + super(CtlBenchmark, self).__init__( + output_dir=self.output_dir, + default_flags=self.default_flags, + flag_methods=self.flag_methods) + + def _report_benchmark(self, + stats, + wall_time_sec, + top_1_max=None, + top_1_min=None, + total_batch_size=None, + log_steps=None, + warmup=1): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from keras models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + top_1_max: highest passing level for top_1 accuracy. + top_1_min: lowest passing level for top_1 accuracy. + total_batch_size: Global batch-size. + log_steps: How often the log was created for stats['step_timestamp_log']. + warmup: number of entries in stats['step_timestamp_log'] to ignore. + """ + + metrics = [] + if 'eval_acc' in stats: + metrics.append({ + 'name': 'accuracy_top_1', + 'value': stats['eval_acc'], + 'min_value': top_1_min, + 'max_value': top_1_max + }) + metrics.append({'name': 'eval_loss', 'value': stats['eval_loss']}) + + metrics.append({ + 'name': 'top_1_train_accuracy', + 'value': stats['train_acc'] + }) + metrics.append({'name': 'train_loss', 'value': stats['train_loss']}) + + if (warmup and 'step_timestamp_log' in stats and + len(stats['step_timestamp_log']) > warmup + 1): + # first entry in the time_log is start of step 0. The rest of the + # entries are the end of each step recorded + time_log = stats['step_timestamp_log'] + steps_elapsed = time_log[-1].batch_index - time_log[warmup].batch_index + time_elapsed = time_log[-1].timestamp - time_log[warmup].timestamp + examples_per_sec = total_batch_size * (steps_elapsed / time_elapsed) + metrics.append({'name': 'exp_per_second', 'value': examples_per_sec}) + + if 'avg_exp_per_second' in stats: + metrics.append({ + 'name': 'avg_exp_per_second', + 'value': stats['avg_exp_per_second'] + }) + print("start flags_core.get_nondefault_flags_as_str") + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=-1, + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class Resnet50CtlAccuracy(CtlBenchmark): + """Benchmark accuracy tests for ResNet50 in CTL.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more named + arguments before updating the constructor. + """ + + # flag_methods = [common.define_keras_flags] + + self.data_dir = os.path.join(root_data_dir, 'imagenet') + super(Resnet50CtlAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flags) + + + # @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.main(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + super(Resnet50CtlAccuracy, self)._report_benchmark( + stats, + wall_time_sec, + top_1_min=MIN_TOP_1_ACCURACY, + top_1_max=MAX_TOP_1_ACCURACY, + total_batch_size=FLAGS.batch_size, + log_steps=100) + + def _get_model_dir(self, folder_name): + return os.path.join(self.output_dir, folder_name) + + +class Resnet50CtlBenchmarkBase(CtlBenchmark): + """Resnet50 benchmarks.""" + + def __init__(self, output_dir=None, default_flags=None): + + super(Resnet50CtlBenchmarkBase, self).__init__( + output_dir=output_dir, + flag_methods=flags, + default_flags=default_flags) + + # @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.benchmark_main() + wall_time_sec = time.time() - start_time_sec + + # Number of logged step time entries that are excluded in performance + # report. We keep results from last 100 batches in this case. + warmup = (FLAGS.train_steps - 100) // FLAGS.log_steps + + super(Resnet50CtlBenchmarkBase, self)._report_benchmark( + stats, + wall_time_sec, + total_batch_size=FLAGS.batch_size, + log_steps=FLAGS.log_steps, + warmup=warmup) + + + def benchmark_1_npu_fp16(self, config_dict, cluster_device_id): + """Test v1 model with 1 NPU with tf mixed precision.""" + print("start benchmark_1_npu_fp16") + FLAGS.resnet_size = 50 + FLAGS.resnet_version = 1 + # FLAGS.max_train_steps = 1000 # this is not global step , only the step per epoch. default is according to train images + FLAGS.max_train_steps = config_dict.get('max_train_steps') + FLAGS.hooks = ['examplespersecondhook'] + #FLAGS.data_dir = '/home/w00563133/data/resnet/imagenet_TF' + FLAGS.data_dir = config_dict.get('data_dir') + FLAGS.model_dir = os.getenv('MODEL_CKPT_PATH') + FLAGS.train_epochs = config_dict.get('train_epochs') + FLAGS.batch_size = config_dict.get('batch_size') + # FLAGS.epochs_between_evals = 1 + FLAGS.epochs_between_evals = config_dict.get('epochs_between_evals') + FLAGS.iterations_per_loop = config_dict.get('iterations_per_loop') + FLAGS.save_checkpoints_steps = config_dict.get('save_checkpoints_steps') + FLAGS.stop_threshold = MIN_TOP_1_ACCURACY + self._run_and_report_benchmark() + + +class Resnet50CtlBenchmarkReal(Resnet50CtlBenchmarkBase): + """Resnet50 real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + # def_flags['skip_eval'] = True + # def_flags['data_dir'] = os.path.join(root_data_dir, 'imagenet') + # def_flags['train_steps'] = 110 + # def_flags['steps_per_loop'] = 20 + # def_flags['log_steps'] = 10 + + super(Resnet50CtlBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.128, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + cluster_device_id = None + rank_count = sys.argv[1] + if rank_count == "1": + from resnet_config_1p_npu import resnet50_config + elif rank_count == "2": + from resnet_config_2p_npu import resnet50_config + elif rank_count == "4": + from resnet_config_4p_npu import resnet50_config + elif rank_count == "16": + from resnet_config_16p_npu import resnet50_config + elif rank_count == "32": + from resnet_config_32p_npu import resnet50_config + else: + from resnet_config_8p_npu import resnet50_config + config_dict = resnet50_config() + print("config dict info is {}".format(config_dict)) + imagenet_main.benchmark_pre() + test=Resnet50CtlBenchmarkReal("./result","./result") + test.benchmark_1_npu_fp16(config_dict, cluster_device_id) + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/__init__.py new file mode 100644 index 0000000..2b558fe --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Activations package definition.""" +from official.modeling.activations.gelu import gelu +from official.modeling.activations.swish import hard_swish +from official.modeling.activations.swish import identity +from official.modeling.activations.swish import simple_swish diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu.py new file mode 100644 index 0000000..c045bff --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu.py @@ -0,0 +1,40 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Gaussian error linear unit.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import tensorflow as tf + + +@tf.keras.utils.register_keras_serializable(package='Text') +def gelu(x): + """Gaussian Error Linear Unit. + + This is a smoother version of the RELU. + Original paper: https://arxiv.org/abs/1606.08415 + Args: + x: float Tensor to perform activation. + + Returns: + `x` with the GELU activation applied. + """ + cdf = 0.5 * (1.0 + tf.tanh( + (math.sqrt(2 / math.pi) * (x + 0.044715 * tf.pow(x, 3))))) + return x * cdf diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu_test.py new file mode 100644 index 0000000..dc3b95c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/gelu_test.py @@ -0,0 +1,38 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the Gaussian error linear unit.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations + + +@keras_parameterized.run_all_keras_modes +class GeluTest(keras_parameterized.TestCase): + + def test_gelu(self): + expected_data = [[0.14967535, 0., -0.10032465], + [-0.15880796, -0.04540223, 2.9963627]] + gelu_data = activations.gelu([[.25, 0, -.25], [-1, -2, 3]]) + self.assertAllClose(expected_data, gelu_data) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish.py new file mode 100644 index 0000000..1d79961 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish.py @@ -0,0 +1,75 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Customized Swish activation.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +@tf.keras.utils.register_keras_serializable(package='Text') +def simple_swish(features): + """Computes the Swish activation function. + + The tf.nn.swish operation uses a custom gradient to reduce memory usage. + Since saving custom gradients in SavedModel is currently not supported, and + one would not be able to use an exported TF-Hub module for fine-tuning, we + provide this wrapper that can allow to select whether to use the native + TensorFlow swish operation, or whether to use a customized operation that + has uses default TensorFlow gradient computation. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return features * tf.nn.sigmoid(features) + + +@tf.keras.utils.register_keras_serializable(package='Text') +def hard_swish(features): + """Computes a hard version of the swish function. + + This operation can be used to reduce computational cost and improve + quantization for edge devices. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return features * tf.nn.relu6(features + tf.constant(3.)) * (1. / 6.) + + +@tf.keras.utils.register_keras_serializable(package='Text') +def identity(features): + """Computes the identity function. + + Useful for helping in quantization. + + Args: + features: A `Tensor` representing preactivation values. + + Returns: + The activation value. + """ + features = tf.convert_to_tensor(features) + return tf.identity(features) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish_test.py new file mode 100644 index 0000000..22042e9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/activations/swish_test.py @@ -0,0 +1,49 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for the customized Swish activation.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numpy as np +import tensorflow as tf + +from tensorflow.python.keras import keras_parameterized # pylint: disable=g-direct-tensorflow-import +from official.modeling import activations + + +@keras_parameterized.run_all_keras_modes +class CustomizedSwishTest(keras_parameterized.TestCase): + + def _hard_swish_np(self, x): + x = np.float32(x) + return x * np.clip(x + 3, 0, 6) / 6 + + def test_simple_swish(self): + features = [[.25, 0, -.25], [-1, -2, 3]] + customized_swish_data = activations.simple_swish(features) + swish_data = tf.nn.swish(features) + self.assertAllClose(customized_swish_data, swish_data) + + def test_hard_swish(self): + features = [[.25, 0, -.25], [-1, -2, 3]] + customized_swish_data = activations.hard_swish(features) + swish_data = self._hard_swish_np(features) + self.assertAllClose(customized_swish_data, swish_data) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config.py new file mode 100644 index 0000000..582900c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config.py @@ -0,0 +1,318 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Base configurations to standardize experiments.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import copy +import functools +from typing import Any, List, Mapping, Optional, Type + +import dataclasses +import tensorflow as tf +import yaml + +from official.modeling.hyperparams import params_dict + + +@dataclasses.dataclass +class Config(params_dict.ParamsDict): + """The base configuration class that supports YAML/JSON based overrides. + + * It recursively enforces a whitelist of basic types and container types, so + it avoids surprises with copy and reuse caused by unanticipated types. + * It converts dict to Config even within sequences, + e.g. for config = Config({'key': [([{'a': 42}],)]), + type(config.key[0][0][0]) is Config rather than dict. + """ + + # It's safe to add bytes and other immutable types here. + IMMUTABLE_TYPES = (str, int, float, bool, type(None)) + # It's safe to add set, frozenset and other collections here. + SEQUENCE_TYPES = (list, tuple) + + default_params: dataclasses.InitVar[Optional[Mapping[str, Any]]] = None + restrictions: dataclasses.InitVar[Optional[List[str]]] = None + + @classmethod + def _isvalidsequence(cls, v): + """Check if the input values are valid sequences. + + Args: + v: Input sequence. + + Returns: + True if the sequence is valid. Valid sequence includes the sequence + type in cls.SEQUENCE_TYPES and element type is in cls.IMMUTABLE_TYPES or + is dict or ParamsDict. + """ + if not isinstance(v, cls.SEQUENCE_TYPES): + return False + return (all(isinstance(e, cls.IMMUTABLE_TYPES) for e in v) or + all(isinstance(e, dict) for e in v) or + all(isinstance(e, params_dict.ParamsDict) for e in v)) + + @classmethod + def _import_config(cls, v, subconfig_type): + """Returns v with dicts converted to Configs, recursively.""" + if not issubclass(subconfig_type, params_dict.ParamsDict): + raise TypeError( + 'Subconfig_type should be subclass of ParamsDict, found {!r}'.format( + subconfig_type)) + if isinstance(v, cls.IMMUTABLE_TYPES): + return v + elif isinstance(v, cls.SEQUENCE_TYPES): + # Only support one layer of sequence. + if not cls._isvalidsequence(v): + raise TypeError( + 'Invalid sequence: only supports single level {!r} of {!r} or ' + 'dict or ParamsDict found: {!r}'.format(cls.SEQUENCE_TYPES, + cls.IMMUTABLE_TYPES, v)) + import_fn = functools.partial( + cls._import_config, subconfig_type=subconfig_type) + return type(v)(map(import_fn, v)) + elif isinstance(v, params_dict.ParamsDict): + # Deepcopy here is a temporary solution for preserving type in nested + # Config object. + return copy.deepcopy(v) + elif isinstance(v, dict): + return subconfig_type(v) + else: + raise TypeError('Unknown type: {!r}'.format(type(v))) + + @classmethod + def _export_config(cls, v): + """Returns v with Configs converted to dicts, recursively.""" + if isinstance(v, cls.IMMUTABLE_TYPES): + return v + elif isinstance(v, cls.SEQUENCE_TYPES): + return type(v)(map(cls._export_config, v)) + elif isinstance(v, params_dict.ParamsDict): + return v.as_dict() + elif isinstance(v, dict): + raise TypeError('dict value not supported in converting.') + else: + raise TypeError('Unknown type: {!r}'.format(type(v))) + + @classmethod + def _get_subconfig_type(cls, k) -> Type[params_dict.ParamsDict]: + """Get element type by the field name. + + Args: + k: the key/name of the field. + + Returns: + Config as default. If a type annotation is found for `k`, + 1) returns the type of the annotation if it is subtype of ParamsDict; + 2) returns the element type if the annotation of `k` is List[SubType] + or Tuple[SubType]. + """ + subconfig_type = Config + if k in cls.__annotations__: + # Directly Config subtype. + type_annotation = cls.__annotations__[k] + if (isinstance(type_annotation, type) and + issubclass(type_annotation, Config)): + subconfig_type = cls.__annotations__[k] + else: + # Check if the field is a sequence of subtypes. + field_type = getattr(type_annotation, '__origin__', type(None)) + if (isinstance(field_type, type) and + issubclass(field_type, cls.SEQUENCE_TYPES)): + element_type = getattr(type_annotation, '__args__', [type(None)])[0] + subconfig_type = ( + element_type if issubclass(element_type, params_dict.ParamsDict) + else subconfig_type) + return subconfig_type + + def __post_init__(self, default_params, restrictions, *args, **kwargs): + super().__init__(default_params=default_params, + restrictions=restrictions, + *args, + **kwargs) + + def _set(self, k, v): + """Overrides same method in ParamsDict. + + Also called by ParamsDict methods. + + Args: + k: key to set. + v: value. + + Raises: + RuntimeError + """ + subconfig_type = self._get_subconfig_type(k) + if isinstance(v, dict): + if k not in self.__dict__ or not self.__dict__[k]: + # If the key not exist or the value is None, a new Config-family object + # sould be created for the key. + self.__dict__[k] = subconfig_type(v) + else: + self.__dict__[k].override(v) + else: + self.__dict__[k] = self._import_config(v, subconfig_type) + + def __setattr__(self, k, v): + if k not in self.RESERVED_ATTR: + if getattr(self, '_locked', False): + raise ValueError('The Config has been locked. ' 'No change is allowed.') + self._set(k, v) + + def _override(self, override_dict, is_strict=True): + """Overrides same method in ParamsDict. + + Also called by ParamsDict methods. + + Args: + override_dict: dictionary to write to . + is_strict: If True, not allows to add new keys. + + Raises: + KeyError: overriding reserved keys or keys not exist (is_strict=True). + """ + for k, v in sorted(override_dict.items()): + if k in self.RESERVED_ATTR: + raise KeyError('The key {!r} is internally reserved. ' + 'Can not be overridden.'.format(k)) + if k not in self.__dict__: + if is_strict: + raise KeyError('The key {!r} does not exist in {!r}. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = False.'.format( + k, type(self))) + else: + self._set(k, v) + else: + if isinstance(v, dict) and self.__dict__[k]: + self.__dict__[k]._override(v, is_strict) # pylint: disable=protected-access + elif isinstance(v, params_dict.ParamsDict) and self.__dict__[k]: + self.__dict__[k]._override(v.as_dict(), is_strict) # pylint: disable=protected-access + else: + self._set(k, v) + + def as_dict(self): + """Returns a dict representation of params_dict.ParamsDict. + + For the nested params_dict.ParamsDict, a nested dict will be returned. + """ + return { + k: self._export_config(v) + for k, v in self.__dict__.items() + if k not in self.RESERVED_ATTR + } + + def replace(self, **kwargs): + """Like `override`, but returns a copy with the current config unchanged.""" + params = self.__class__(self) + params.override(kwargs, is_strict=True) + return params + + @classmethod + def from_yaml(cls, file_path: str): + # Note: This only works if the Config has all default values. + with tf.io.gfile.GFile(file_path, 'r') as f: + loaded = yaml.load(f) + config = cls() + config.override(loaded) + return config + + @classmethod + def from_json(cls, file_path: str): + """Wrapper for `from_yaml`.""" + return cls.from_yaml(file_path) + + @classmethod + def from_args(cls, *args, **kwargs): + """Builds a config from the given list of arguments.""" + attributes = list(cls.__annotations__.keys()) + default_params = {a: p for a, p in zip(attributes, args)} + default_params.update(kwargs) + return cls(default_params) + + +@dataclasses.dataclass +class RuntimeConfig(Config): + """High-level configurations for Runtime. + + These include parameters that are not directly related to the experiment, + e.g. directories, accelerator type, etc. + + Attributes: + distribution_strategy: e.g. 'mirrored', 'tpu', etc. + enable_eager: Whether or not to enable eager mode. + enable_xla: Whether or not to enable XLA. + per_gpu_thread_count: thread count per GPU. + gpu_threads_enabled: Whether or not GPU threads are enabled. + gpu_thread_mode: Whether and how the GPU device uses its own threadpool. + dataset_num_private_threads: Number of threads for a private threadpool + created for all datasets computation. + tpu: The address of the TPU to use, if any. + num_gpus: The number of GPUs to use, if any. + worker_hosts: comma-separated list of worker ip:port pairs for running + multi-worker models with DistributionStrategy. + task_index: If multi-worker training, the task index of this worker. + all_reduce_alg: Defines the algorithm for performing all-reduce. + num_packs: Sets `num_packs` in the cross device ops used in + MirroredStrategy. For details, see tf.distribute.NcclAllReduce. + """ + distribution_strategy: str = 'mirrored' + enable_eager: bool = False + enable_xla: bool = False + gpu_threads_enabled: bool = False + gpu_thread_mode: Optional[str] = None + dataset_num_private_threads: Optional[int] = None + per_gpu_thread_count: int = 0 + tpu: Optional[str] = None + num_gpus: int = 0 + worker_hosts: Optional[str] = None + task_index: int = -1 + all_reduce_alg: Optional[str] = None + num_packs: int = 1 + + +@dataclasses.dataclass +class TensorboardConfig(Config): + """Configuration for Tensorboard. + + Attributes: + track_lr: Whether or not to track the learning rate in Tensorboard. Defaults + to True. + write_model_weights: Whether or not to write the model weights as + images in Tensorboard. Defaults to False. + + """ + track_lr: bool = True + write_model_weights: bool = False + + +@dataclasses.dataclass +class CallbacksConfig(Config): + """Configuration for Callbacks. + + Attributes: + enable_checkpoint_and_export: Whether or not to enable checkpoints as a + Callback. Defaults to True. + enable_tensorboard: Whether or not to enable Tensorboard as a Callback. + Defaults to True. + + """ + enable_checkpoint_and_export: bool = True + enable_tensorboard: bool = True diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config_test.py new file mode 100644 index 0000000..501f958 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/base_config_test.py @@ -0,0 +1,299 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import pprint +from typing import List, Tuple + +from absl.testing import parameterized +import dataclasses +import tensorflow as tf +from official.modeling.hyperparams import base_config + + +@dataclasses.dataclass +class DumpConfig1(base_config.Config): + a: int = 1 + b: str = 'text' + + +@dataclasses.dataclass +class DumpConfig2(base_config.Config): + c: int = 2 + d: str = 'text' + e: DumpConfig1 = DumpConfig1() + + +@dataclasses.dataclass +class DumpConfig3(DumpConfig2): + f: int = 2 + g: str = 'text' + h: List[DumpConfig1] = dataclasses.field( + default_factory=lambda: [DumpConfig1(), DumpConfig1()]) + g: Tuple[DumpConfig1, ...] = (DumpConfig1(),) + + +class BaseConfigTest(parameterized.TestCase, tf.test.TestCase): + + def assertHasSameTypes(self, c, d, msg=''): + """Checks if a Config has the same structure as a given dict. + + Args: + c: the Config object to be check. + d: the reference dict object. + msg: The error message to show when type mismatched. + """ + # Make sure d is not a Config. Assume d is either + # dictionary or primitive type and c is the Config or primitive types. + self.assertNotIsInstance(d, base_config.Config) + if isinstance(d, base_config.Config.IMMUTABLE_TYPES): + self.assertEqual(pprint.pformat(c), pprint.pformat(d), msg=msg) + elif isinstance(d, base_config.Config.SEQUENCE_TYPES): + self.assertEqual(type(c), type(d), msg=msg) + for i, v in enumerate(d): + self.assertHasSameTypes(c[i], v, msg='{}[{!r}]'.format(msg, i)) + elif isinstance(d, dict): + self.assertIsInstance(c, base_config.Config, msg=msg) + for k, v in sorted(d.items()): + self.assertHasSameTypes(getattr(c, k), v, msg='{}[{!r}]'.format(msg, k)) + else: + raise TypeError('Unknown type: %r' % type(d)) + + def assertImportExport(self, v): + config = base_config.Config({'key': v}) + back = config.as_dict()['key'] + self.assertEqual(pprint.pformat(back), pprint.pformat(v)) + self.assertHasSameTypes(config.key, v, msg='=%s v' % pprint.pformat(v)) + + def test_invalid_keys(self): + params = base_config.Config() + with self.assertRaises(AttributeError): + _ = params.a + + def test_nested_config_types(self): + config = DumpConfig3() + self.assertIsInstance(config.e, DumpConfig1) + self.assertIsInstance(config.h[0], DumpConfig1) + self.assertIsInstance(config.h[1], DumpConfig1) + self.assertIsInstance(config.g[0], DumpConfig1) + + config.override({'e': {'a': 2, 'b': 'new text'}}) + self.assertIsInstance(config.e, DumpConfig1) + self.assertEqual(config.e.a, 2) + self.assertEqual(config.e.b, 'new text') + + config.override({'h': [{'a': 3, 'b': 'new text 2'}]}) + self.assertIsInstance(config.h[0], DumpConfig1) + self.assertLen(config.h, 1) + self.assertEqual(config.h[0].a, 3) + self.assertEqual(config.h[0].b, 'new text 2') + + config.override({'g': [{'a': 4, 'b': 'new text 3'}]}) + self.assertIsInstance(config.g[0], DumpConfig1) + self.assertLen(config.g, 1) + self.assertEqual(config.g[0].a, 4) + self.assertEqual(config.g[0].b, 'new text 3') + + @parameterized.parameters( + ('_locked', "The key '_locked' is internally reserved."), + ('_restrictions', "The key '_restrictions' is internally reserved."), + ('aa', "The key 'aa' does not exist."), + ) + def test_key_error(self, key, msg): + params = base_config.Config() + with self.assertRaisesRegex(KeyError, msg): + params.override({key: True}) + + @parameterized.parameters( + ('str data',), + (123,), + (1.23,), + (None,), + (['str', 1, 2.3, None],), + (('str', 1, 2.3, None),), + ) + def test_import_export_immutable_types(self, v): + self.assertImportExport(v) + out = base_config.Config({'key': v}) + self.assertEqual(pprint.pformat(v), pprint.pformat(out.key)) + + def test_override_is_strict_true(self): + params = base_config.Config({ + 'a': 'aa', + 'b': 2, + 'c': { + 'c1': 'cc', + 'c2': 20 + } + }) + params.override({'a': 2, 'c': {'c1': 'ccc'}}, is_strict=True) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c1, 'ccc') + with self.assertRaises(KeyError): + params.override({'d': 'ddd'}, is_strict=True) + with self.assertRaises(KeyError): + params.override({'c': {'c3': 30}}, is_strict=True) + + config = base_config.Config({'key': [{'a': 42}]}) + config.override({'key': [{'b': 43}]}) + self.assertEqual(config.key[0].b, 43) + with self.assertRaisesRegex(AttributeError, 'The key `a` does not exist'): + _ = config.key[0].a + + @parameterized.parameters( + (lambda x: x, 'Unknown type'), + (object(), 'Unknown type'), + (set(), 'Unknown type'), + (frozenset(), 'Unknown type'), + ) + def test_import_unsupport_types(self, v, msg): + with self.assertRaisesRegex(TypeError, msg): + _ = base_config.Config({'key': v}) + + @parameterized.parameters( + ({ + 'a': [{ + 'b': 2, + }, { + 'c': 3, + }] + },), + ({ + 'c': [{ + 'f': 1.1, + }, { + 'h': [1, 2], + }] + },), + (({ + 'a': 'aa', + 'b': 2, + 'c': { + 'c1': 10, + 'c2': 20, + } + },),), + ) + def test_import_export_nested_structure(self, d): + self.assertImportExport(d) + + @parameterized.parameters( + ([{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }],), + (({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),), + ) + def test_import_export_nested_sequences(self, v): + self.assertImportExport(v) + + @parameterized.parameters( + ([([{}],)],), + ([['str', 1, 2.3, None]],), + ((('str', 1, 2.3, None),),), + ([ + ('str', 1, 2.3, None), + ],), + ([ + ('str', 1, 2.3, None), + ],), + ([[{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }]],), + ([[[{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }]]],), + ((({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),),), + (((({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },),),),), + ([({ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + },)],), + (([{ + 'a': 42, + 'b': 'hello', + 'c': 1.2 + }],),), + ) + def test_import_export_unsupport_sequence(self, v): + with self.assertRaisesRegex(TypeError, + 'Invalid sequence: only supports single level'): + _ = base_config.Config({'key': v}) + + def test_construct_subtype(self): + pass + + def test_import_config(self): + params = base_config.Config({'a': [{'b': 2}, {'c': {'d': 3}}]}) + self.assertLen(params.a, 2) + self.assertEqual(params.a[0].b, 2) + self.assertEqual(type(params.a[0]), base_config.Config) + self.assertEqual(pprint.pformat(params.a[0].b), '2') + self.assertEqual(type(params.a[1]), base_config.Config) + self.assertEqual(type(params.a[1].c), base_config.Config) + self.assertEqual(pprint.pformat(params.a[1].c.d), '3') + + def test_override(self): + params = base_config.Config({'a': [{'b': 2}, {'c': {'d': 3}}]}) + params.override({'a': [{'b': 4}, {'c': {'d': 5}}]}, is_strict=False) + self.assertEqual(type(params.a), list) + self.assertEqual(type(params.a[0]), base_config.Config) + self.assertEqual(pprint.pformat(params.a[0].b), '4') + self.assertEqual(type(params.a[1]), base_config.Config) + self.assertEqual(type(params.a[1].c), base_config.Config) + self.assertEqual(pprint.pformat(params.a[1].c.d), '5') + + @parameterized.parameters( + ([{}],), + (({},),), + ) + def test_config_vs_params_dict(self, v): + d = {'key': v} + self.assertEqual(type(base_config.Config(d).key[0]), base_config.Config) + self.assertEqual(type(base_config.params_dict.ParamsDict(d).key[0]), dict) + + def test_ppformat(self): + self.assertEqual( + pprint.pformat([ + 's', 1, 1.0, True, None, {}, [], (), { + (2,): (3, [4], { + 6: 7, + }), + 8: 9, + } + ]), + "['s', 1, 1.0, True, None, {}, [], (), {8: 9, (2,): (3, [4], {6: 7})}]") + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict.py new file mode 100644 index 0000000..9806a2b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict.py @@ -0,0 +1,410 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A parameter dictionary class which supports the nest structure.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import re + +import six +import tensorflow as tf +import yaml + +# regex pattern that matches on key-value pairs in a comma-separated +# key-value pair string. It splits each k-v pair on the = sign, and +# matches on values that are within single quotes, double quotes, single +# values (e.g. floats, ints, etc.), and a lists within brackets. +_PARAM_RE = re.compile(r""" + (?P[a-zA-Z][\w\.]*) # variable name: "var" or "x" + \s*=\s* + ((?P\'(.*?)\' # single quote + | + \"(.*?)\" # double quote + | + [^,\[]* # single value + | + \[[^\]]*\])) # list of values + ($|,\s*)""", re.VERBOSE) + + +class ParamsDict(object): + """A hyperparameter container class.""" + + RESERVED_ATTR = ['_locked', '_restrictions'] + + def __init__(self, default_params=None, restrictions=None): + """Instantiate a ParamsDict. + + Instantiate a ParamsDict given a set of default parameters and a list of + restrictions. Upon initialization, it validates itself by checking all the + defined restrictions, and raise error if it finds inconsistency. + + Args: + default_params: a Python dict or another ParamsDict object including the + default parameters to initialize. + restrictions: a list of strings, which define a list of restrictions to + ensure the consistency of different parameters internally. Each + restriction string is defined as a binary relation with a set of + operators, including {'==', '!=', '<', '<=', '>', '>='}. + """ + self._locked = False + self._restrictions = [] + if restrictions: + self._restrictions = restrictions + if default_params is None: + default_params = {} + self.override(default_params, is_strict=False) + self.validate() + + def _set(self, k, v): + if isinstance(v, dict): + self.__dict__[k] = ParamsDict(v) + else: + self.__dict__[k] = copy.deepcopy(v) + + def __setattr__(self, k, v): + """Sets the value of the existing key. + + Note that this does not allow directly defining a new key. Use the + `override` method with `is_strict=False` instead. + + Args: + k: the key string. + v: the value to be used to set the key `k`. + + Raises: + KeyError: if k is not defined in the ParamsDict. + """ + if k not in ParamsDict.RESERVED_ATTR: + if k not in self.__dict__.keys(): + raise KeyError('The key `%{}` does not exist. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = True.'.format(k)) + if self._locked: + raise ValueError('The ParamsDict has been locked. ' + 'No change is allowed.') + self._set(k, v) + + def __getattr__(self, k): + """Gets the value of the existing key. + + Args: + k: the key string. + + Returns: + the value of the key. + + Raises: + AttributeError: if k is not defined in the ParamsDict. + """ + if k not in self.__dict__.keys(): + raise AttributeError('The key `{}` does not exist. '.format(k)) + return self.__dict__[k] + + def __contains__(self, key): + """Implements the membership test operator.""" + return key in self.__dict__ + + def get(self, key, value=None): + """Accesses through built-in dictionary get method.""" + return self.__dict__.get(key, value) + + def override(self, override_params, is_strict=True): + """Override the ParamsDict with a set of given params. + + Args: + override_params: a dict or a ParamsDict specifying the parameters to + be overridden. + is_strict: a boolean specifying whether override is strict or not. If + True, keys in `override_params` must be present in the ParamsDict. + If False, keys in `override_params` can be different from what is + currently defined in the ParamsDict. In this case, the ParamsDict will + be extended to include the new keys. + """ + if self._locked: + raise ValueError('The ParamsDict has been locked. No change is allowed.') + if isinstance(override_params, ParamsDict): + override_params = override_params.as_dict() + self._override(override_params, is_strict) # pylint: disable=protected-access + + def _override(self, override_dict, is_strict=True): + """The implementation of `override`.""" + for k, v in six.iteritems(override_dict): + if k in ParamsDict.RESERVED_ATTR: + raise KeyError('The key `%{}` is internally reserved. ' + 'Can not be overridden.') + if k not in self.__dict__.keys(): + if is_strict: + raise KeyError('The key `{}` does not exist. ' + 'To extend the existing keys, use ' + '`override` with `is_strict` = False.'.format(k)) + else: + self._set(k, v) + else: + if isinstance(v, dict): + self.__dict__[k]._override(v, is_strict) # pylint: disable=protected-access + elif isinstance(v, ParamsDict): + self.__dict__[k]._override(v.as_dict(), is_strict) # pylint: disable=protected-access + else: + self.__dict__[k] = copy.deepcopy(v) + + def lock(self): + """Makes the ParamsDict immutable.""" + self._locked = True + + def as_dict(self): + """Returns a dict representation of ParamsDict. + + For the nested ParamsDict, a nested dict will be returned. + """ + params_dict = {} + for k, v in six.iteritems(self.__dict__): + if k not in ParamsDict.RESERVED_ATTR: + if isinstance(v, ParamsDict): + params_dict[k] = v.as_dict() + else: + params_dict[k] = copy.deepcopy(v) + return params_dict + + def validate(self): + """Validate the parameters consistency based on the restrictions. + + This method validates the internal consistency using the pre-defined list of + restrictions. A restriction is defined as a string which specfiies a binary + operation. The supported binary operations are {'==', '!=', '<', '<=', '>', + '>='}. Note that the meaning of these operators are consistent with the + underlying Python immplementation. Users should make sure the define + restrictions on their type make sense. + + For example, for a ParamsDict like the following + ``` + a: + a1: 1 + a2: 2 + b: + bb: + bb1: 10 + bb2: 20 + ccc: + a1: 1 + a3: 3 + ``` + one can define two restrictions like this + ['a.a1 == b.ccc.a1', 'a.a2 <= b.bb.bb2'] + + What it enforces are: + - a.a1 = 1 == b.ccc.a1 = 2 + - a.a2 = 2 <= b.bb.bb2 = 20 + + Raises: + KeyError: if any of the following happens + (1) any of parameters in any of restrictions is not defined in + ParamsDict, + (2) any inconsistency violating the restriction is found. + ValueError: if the restriction defined in the string is not supported. + """ + def _get_kv(dotted_string, params_dict): + tokenized_params = dotted_string.split('.') + v = params_dict + for t in tokenized_params: + v = v[t] + return tokenized_params[-1], v + + def _get_kvs(tokens, params_dict): + if len(tokens) != 2: + raise ValueError('Only support binary relation in restriction.') + stripped_tokens = [t.strip() for t in tokens] + left_k, left_v = _get_kv(stripped_tokens[0], params_dict) + right_k, right_v = _get_kv(stripped_tokens[1], params_dict) + return left_k, left_v, right_k, right_v + + params_dict = self.as_dict() + for restriction in self._restrictions: + if '==' in restriction: + tokens = restriction.split('==') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v != right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '!=' in restriction: + tokens = restriction.split('!=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v == right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '<' in restriction: + tokens = restriction.split('<') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v >= right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '<=' in restriction: + tokens = restriction.split('<=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v > right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '>' in restriction: + tokens = restriction.split('>') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v <= right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + elif '>=' in restriction: + tokens = restriction.split('>=') + _, left_v, _, right_v = _get_kvs(tokens, params_dict) + if left_v < right_v: + raise KeyError('Found inconsistncy between key `{}` and key `{}`.' + .format(tokens[0], tokens[1])) + else: + raise ValueError('Unsupported relation in restriction.') + + +def read_yaml_to_params_dict(file_path): + """Reads a YAML file to a ParamsDict.""" + with tf.io.gfile.GFile(file_path, 'r') as f: + params_dict = yaml.load(f) + return ParamsDict(params_dict) + + +def save_params_dict_to_yaml(params, file_path): + """Saves the input ParamsDict to a YAML file.""" + with tf.io.gfile.GFile(file_path, 'w') as f: + + def _my_list_rep(dumper, data): + # u'tag:yaml.org,2002:seq' is the YAML internal tag for sequence. + return dumper.represent_sequence( + u'tag:yaml.org,2002:seq', data, flow_style=True) + yaml.add_representer(list, _my_list_rep) + yaml.dump(params.as_dict(), f, default_flow_style=False) + + +def nested_csv_str_to_json_str(csv_str): + """Converts a nested (using '.') comma-separated k=v string to a JSON string. + + Converts a comma-separated string of key/value pairs that supports + nesting of keys to a JSON string. Nesting is implemented using + '.' between levels for a given key. + + Spacing between commas and = is supported (e.g. there is no difference between + "a=1,b=2", "a = 1, b = 2", or "a=1, b=2") but there should be no spaces before + keys or after values (e.g. " a=1,b=2" and "a=1,b=2 " are not supported). + + Note that this will only support values supported by CSV, meaning + values such as nested lists (e.g. "a=[[1,2,3],[4,5,6]]") are not + supported. Strings are supported as well, e.g. "a='hello'". + + An example conversion would be: + + "a=1, b=2, c.a=2, c.b=3, d.a.a=5" + + to + + "{ a: 1, b : 2, c: {a : 2, b : 3}, d: {a: {a : 5}}}" + + Args: + csv_str: the comma separated string. + + Returns: + the converted JSON string. + + Raises: + ValueError: If csv_str is not in a comma separated string or + if the string is formatted incorrectly. + """ + if not csv_str: + return '' + + formatted_entries = [] + nested_map = collections.defaultdict(list) + pos = 0 + while pos < len(csv_str): + m = _PARAM_RE.match(csv_str, pos) + if not m: + raise ValueError('Malformed hyperparameter value while parsing ' + 'CSV string: %s' % csv_str[pos:]) + pos = m.end() + # Parse the values. + m_dict = m.groupdict() + name = m_dict['name'] + v = m_dict['val'] + + # If a GCS path (e.g. gs://...) is provided, wrap this in quotes + # as yaml.load would otherwise throw an exception + if re.match(r'(?=[^\"\'])(?=[gs://])', v): + v = '\'{}\''.format(v) + + name_nested = name.split('.') + if len(name_nested) > 1: + grouping = name_nested[0] + value = '.'.join(name_nested[1:]) + '=' + v + nested_map[grouping].append(value) + else: + formatted_entries.append('%s : %s' % (name, v)) + + for grouping, value in nested_map.items(): + value = ','.join(value) + value = nested_csv_str_to_json_str(value) + formatted_entries.append('%s : %s' % (grouping, value)) + return '{' + ', '.join(formatted_entries) + '}' + + +def override_params_dict(params, dict_or_string_or_yaml_file, is_strict): + """Override a given ParamsDict using a dict, JSON/YAML/CSV string or YAML file. + + The logic of the function is outlined below: + 1. Test that the input is a dict. If not, proceed to 2. + 2. Tests that the input is a string. If not, raise unknown ValueError + 2.1. Test if the string is in a CSV format. If so, parse. + If not, proceed to 2.2. + 2.2. Try loading the string as a YAML/JSON. If successful, parse to + dict and use it to override. If not, proceed to 2.3. + 2.3. Try using the string as a file path and load the YAML file. + + Args: + params: a ParamsDict object to be overridden. + dict_or_string_or_yaml_file: a Python dict, JSON/YAML/CSV string or + path to a YAML file specifying the parameters to be overridden. + is_strict: a boolean specifying whether override is strict or not. + + Returns: + params: the overridden ParamsDict object. + + Raises: + ValueError: if failed to override the parameters. + """ + if not dict_or_string_or_yaml_file: + return params + if isinstance(dict_or_string_or_yaml_file, dict): + params.override(dict_or_string_or_yaml_file, is_strict) + elif isinstance(dict_or_string_or_yaml_file, six.string_types): + try: + dict_or_string_or_yaml_file = ( + nested_csv_str_to_json_str(dict_or_string_or_yaml_file)) + except ValueError: + pass + params_dict = yaml.load(dict_or_string_or_yaml_file) + if isinstance(params_dict, dict): + params.override(params_dict, is_strict) + else: + with tf.io.gfile.GFile(dict_or_string_or_yaml_file) as f: + params.override(yaml.load(f), is_strict) + else: + raise ValueError('Unknown input type to parse.') + return params diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict_test.py new file mode 100644 index 0000000..3d53ea1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/hyperparams/params_dict_test.py @@ -0,0 +1,322 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for official.modeling.hyperparams.params_dict.py.""" + +import os + +import tensorflow as tf +import yaml + +from official.modeling.hyperparams import params_dict + + +class ParamsDictTest(tf.test.TestCase): + + def test_init_from_an_empty_dict(self): + params = params_dict.ParamsDict() + with self.assertRaises(AttributeError): + _ = params.a + + with self.assertRaises(KeyError): + params.a = 'aa' + + def test_init_from_a_dict(self): + params = params_dict.ParamsDict({'a': 'aa', 'b': 2}) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + + def test_init_from_a_param_dict(self): + params_init = params_dict.ParamsDict({'a': 'aa', 'b': 2}) + params = params_dict.ParamsDict(params_init) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + + def test_lock(self): + params = params_dict.ParamsDict({'a': 1, 'b': 2}) + params.lock() + with self.assertRaises(ValueError): + params.a = 10 + with self.assertRaises(ValueError): + params.override({'b': 20}) + + def test_setattr(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa', 'b': 2, 'c': None}, is_strict=False) + params.c = 'ccc' + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c, 'ccc') + + def test_getattr(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa', 'b': 2, 'c': None}, is_strict=False) + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c, None) + + def test_contains(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa'}, is_strict=False) + self.assertIn('a', params) + self.assertNotIn('b', params) + + def test_get(self): + params = params_dict.ParamsDict() + params.override( + {'a': 'aa'}, is_strict=False) + self.assertEqual(params.get('a'), 'aa') + self.assertEqual(params.get('b', 2), 2) + self.assertEqual(params.get('b'), None) + + def test_override_is_strict_true(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 'cc', 'c2': 20}}) + params.override({'a': 2, 'c': {'c1': 'ccc'}}, is_strict=True) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c1, 'ccc') + with self.assertRaises(KeyError): + params.override({'d': 'ddd'}, is_strict=True) + with self.assertRaises(KeyError): + params.override({'c': {'c3': 30}}, is_strict=True) + + def test_override_is_strict_false(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + params.override({'a': 2, 'c': {'c3': 3000}}, is_strict=False) + self.assertEqual(params.a, 2) + self.assertEqual(params.c.c3, 3000) + params.override({'d': 'ddd'}, is_strict=False) + self.assertEqual(params.d, 'ddd') + params.override({'c': {'c4': 4444}}, is_strict=False) + self.assertEqual(params.c.c4, 4444) + + def test_as_dict(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + params_d = params.as_dict() + self.assertEqual(params_d['a'], 'aa') + self.assertEqual(params_d['b'], 2) + self.assertEqual(params_d['c']['c1'], 10) + self.assertEqual(params_d['c']['c2'], 20) + + def test_validate(self): + # Raise error due to the unknown parameter. + with self.assertRaises(KeyError): + params = params_dict.ParamsDict( + {'a': 1, 'b': {'a': 11}}, ['a == c']) + + # OK to check equality of two nested dicts. + params = params_dict.ParamsDict( + {'a': 1, 'b': {'a': 10}, 'c': {'a': 10}}, ['b == c']) + + # Raise error due to inconsistency + with self.assertRaises(KeyError): + params = params_dict.ParamsDict( + {'a': 1, 'c': {'a': 10}}, ['a == c.a']) + + # Valid rule. + params = params_dict.ParamsDict( + {'a': 1, 'c': {'a': 1}}, ['a == c.a']) + + # Overridding violates the existing rule, raise error upon validate. + params.override({'a': 11}) + with self.assertRaises(KeyError): + params.validate() + + +class ParamsDictIOTest(tf.test.TestCase): + + def write_temp_file(self, filename, text): + temp_file = os.path.join(self.get_temp_dir(), filename) + with tf.io.gfile.GFile(temp_file, 'w') as writer: + writer.write(text) + return temp_file + + def test_save_params_dict_to_yaml(self): + params = params_dict.ParamsDict( + {'a': 'aa', 'b': 2, 'c': {'c1': 10, 'c2': 20}}) + output_yaml_file = os.path.join(self.get_temp_dir(), 'params.yaml') + params_dict.save_params_dict_to_yaml(params, output_yaml_file) + + with tf.io.gfile.GFile(output_yaml_file, 'r') as f: + params_d = yaml.load(f) + self.assertEqual(params.a, params_d['a']) + self.assertEqual(params.b, params_d['b']) + self.assertEqual(params.c.c1, params_d['c']['c1']) + self.assertEqual(params.c.c2, params_d['c']['c2']) + + def test_read_yaml_to_params_dict(self): + input_yaml_file = self.write_temp_file( + 'params.yaml', r""" + a: 'aa' + b: 2 + c: + c1: 10 + c2: 20 + """) + params = params_dict.read_yaml_to_params_dict(input_yaml_file) + + self.assertEqual(params.a, 'aa') + self.assertEqual(params.b, 2) + self.assertEqual(params.c.c1, 10) + self.assertEqual(params.c.c2, 20) + + def test_override_params_dict_using_dict(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_dict = {'b': 5.2, 'c': [30, 40]} + params = params_dict.override_params_dict( + params, override_dict, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_yaml_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_yaml_string = "'b': 5.2\n'c': [30, 40]" + params = params_dict.override_params_dict( + params, override_yaml_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_json_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': {'b1': 2, 'b2': [2, 3],}, + 'd': {'d1': {'d2': 'hello'}}, 'e': False}) + override_json_string = "{ b: { b2: [3, 4] }, d: { d1: { d2: 'hi' } } }" + params = params_dict.override_params_dict( + params, override_json_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(2, params.b.b1) + self.assertEqual([3, 4], params.b.b2) + self.assertEqual('hi', params.d.d1.d2) + self.assertEqual(False, params.e) + + def test_override_params_dict_using_csv_string(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': {'b1': 2, 'b2': [2, 3],}, + 'd': {'d1': {'d2': 'hello'}}, 'e': False}) + override_csv_string = "b.b2=[3,4], d.d1.d2='hi, world', e=gs://test" + params = params_dict.override_params_dict( + params, override_csv_string, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(2, params.b.b1) + self.assertEqual([3, 4], params.b.b2) + self.assertEqual('hi, world', params.d.d1.d2) + self.assertEqual('gs://test', params.e) + + def test_override_params_dict_using_yaml_file(self): + params = params_dict.ParamsDict({ + 'a': 1, 'b': 2.5, 'c': [3, 4], 'd': 'hello', 'e': False}) + override_yaml_file = self.write_temp_file( + 'params.yaml', r""" + b: 5.2 + c: [30, 40] + """) + params = params_dict.override_params_dict( + params, override_yaml_file, is_strict=True) + self.assertEqual(1, params.a) + self.assertEqual(5.2, params.b) + self.assertEqual([30, 40], params.c) + self.assertEqual('hello', params.d) + self.assertEqual(False, params.e) + + +class IOTest(tf.test.TestCase): + + def test_basic_csv_str_to_json_str(self): + csv_str = 'a=1,b=2,c=3' + json_str = '{a : 1, b : 2, c : 3}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_basic_csv_str_load(self): + csv_str = 'a=1,b=2,c=3' + expected_output = {'a': 1, 'b': 2, 'c': 3} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_basic_nested_csv_str_to_json_str(self): + csv_str = 'a=1,b.b1=2' + json_str = '{a : 1, b : {b1 : 2}}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_basic_nested_csv_str_load(self): + csv_str = 'a=1,b.b1=2,c.c1=3' + expected_output = {'a': 1, 'b': {'b1': 2}, 'c': {'c1': 3}} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_complex_nested_csv_str_to_json_str(self): + csv_str = 'a.aa.aaa.aaaaa.a=1' + json_str = '{a : {aa : {aaa : {aaaaa : {a : 1}}}}}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, json_str) + + def test_complex_nested_csv_str_load(self): + csv_str = 'a.aa.aaa.aaaaa.a=1,a.a=2' + expected_output = {'a': {'aa': {'aaa': {'aaaaa': {'a': 1}}}, 'a': 2}} + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertDictEqual(converted_dict, expected_output) + + def test_csv_str_load_supported_datatypes(self): + csv_str = 'a=1,b=2.,c=[1,2,3],d=\'hello, there\',e=\"Hi.\"' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + converted_dict = yaml.load(converted_csv_str) + self.assertEqual(converted_dict['a'], 1) + self.assertEqual(converted_dict['b'], 2.) + self.assertEqual(converted_dict['c'], [1, 2, 3]) + self.assertEqual(converted_dict['d'], 'hello, there') + self.assertEqual(converted_dict['e'], 'Hi.') + + def test_csv_str_load_unsupported_datatypes(self): + csv_str = 'a=[[1,2,3],[4,5,6]]' + self.assertRaises(ValueError, + params_dict.nested_csv_str_to_json_str, + csv_str) + + def test_csv_str_to_json_str_spacing(self): + csv_str1 = 'a=1,b=2,c=3' + csv_str2 = 'a = 1, b = 2, c = 3' + json_str = '{a : 1, b : 2, c : 3}' + converted_csv_str1 = params_dict.nested_csv_str_to_json_str(csv_str1) + converted_csv_str2 = params_dict.nested_csv_str_to_json_str(csv_str2) + self.assertEqual(converted_csv_str1, converted_csv_str2) + self.assertEqual(converted_csv_str1, json_str) + self.assertEqual(converted_csv_str2, json_str) + + def test_gcs_added_quotes(self): + csv_str = 'a=gs://abc, b=gs://def' + expected_output = '{a : \'gs://abc\', b : \'gs://def\'}' + converted_csv_str = params_dict.nested_csv_str_to_json_str(csv_str) + self.assertEqual(converted_csv_str, expected_output) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils.py new file mode 100644 index 0000000..2f66d1c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils.py @@ -0,0 +1,491 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""A light weight utilities to train NLP models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import tempfile + +from absl import logging +import tensorflow as tf +from official.staging.training import grad_utils +from official.utils.misc import distribution_utils + +_SUMMARY_TXT = 'training_summary.txt' +_MIN_SUMMARY_STEPS = 10 + + +def _should_export_checkpoint(strategy): + return (not strategy) or strategy.extended.should_checkpoint + + +def _should_export_summary(strategy): + return (not strategy) or strategy.extended.should_save_summary + + +def _save_checkpoint(strategy, checkpoint, model_dir, checkpoint_prefix): + """Saves model to with provided checkpoint prefix.""" + + if _should_export_checkpoint(strategy): + checkpoint_path = os.path.join(model_dir, checkpoint_prefix) + saved_path = checkpoint.save(checkpoint_path) + logging.info('Saving model as TF checkpoint: %s', saved_path) + else: + # In multi worker training we need every worker to save checkpoint, because + # variables can trigger synchronization on read and synchronization needs + # all workers to participate. To avoid workers overriding each other we save + # to a temporary directory on non-chief workers. + tmp_dir = tempfile.mkdtemp() + checkpoint.save(os.path.join(tmp_dir, 'ckpt')) + tf.io.gfile.rmtree(tmp_dir) + return + + +def _get_input_iterator(input_fn, strategy): + """Returns distributed dataset iterator.""" + # When training with TPU pods, datasets needs to be cloned across + # workers. Since Dataset instance cannot be cloned in eager mode, we instead + # pass callable that returns a dataset. + if not callable(input_fn): + raise ValueError('`input_fn` should be a closure that returns a dataset.') + iterator = iter( + strategy.experimental_distribute_datasets_from_function(input_fn)) + return iterator + + +def _float_metric_value(metric): + """Gets the value of a float-value keras metric.""" + return metric.result().numpy().astype(float) + + +def steps_to_run(current_step, steps_per_epoch, steps_per_loop): + """Calculates steps to run on device.""" + if steps_per_loop <= 0: + raise ValueError('steps_per_loop should be positive integer.') + if steps_per_loop == 1: + return steps_per_loop + remainder_in_epoch = current_step % steps_per_epoch + if remainder_in_epoch != 0: + return min(steps_per_epoch - remainder_in_epoch, steps_per_loop) + else: + return steps_per_loop + + +def write_txt_summary(training_summary, summary_dir): + """Writes a summary text file to record stats.""" + summary_path = os.path.join(summary_dir, _SUMMARY_TXT) + with tf.io.gfile.GFile(summary_path, 'wb') as f: + logging.info('Training Summary: \n%s', str(training_summary)) + f.write(json.dumps(training_summary, indent=4)) + + +def run_customized_training_loop( + # pylint: disable=invalid-name + _sentinel=None, + # pylint: enable=invalid-name + strategy=None, + model_fn=None, + loss_fn=None, + scale_loss=True, + model_dir=None, + train_input_fn=None, + steps_per_epoch=None, + steps_per_loop=1, + epochs=1, + eval_input_fn=None, + eval_steps=None, + metric_fn=None, + init_checkpoint=None, + custom_callbacks=None, + run_eagerly=False, + sub_model_export_name=None, + explicit_allreduce=False, + pre_allreduce_callbacks=None, + post_allreduce_callbacks=None): + """Run BERT pretrain model training using low-level API. + + Arguments: + _sentinel: Used to prevent positional parameters. Internal, do not use. + strategy: Distribution strategy on which to run low level training loop. + model_fn: Function that returns a tuple (model, sub_model). Caller of this + function should add optimizer to the `model` via calling + `model.compile()` API or manually setting `model.optimizer` attribute. + Second element of the returned tuple(sub_model) is an optional sub model + to be used for initial checkpoint -- if provided. + loss_fn: Function with signature func(labels, logits) and returns a loss + tensor. + scale_loss: Whether to divide the raw loss by number of replicas before + gradients calculation. + model_dir: Model directory used during training for restoring/saving model + weights. + train_input_fn: Function that returns a tf.data.Dataset used for training. + steps_per_epoch: Number of steps to run per epoch. At the end of each + epoch, model checkpoint will be saved and evaluation will be conducted + if evaluation dataset is provided. + steps_per_loop: Number of steps per graph-mode loop. In order to reduce + communication in eager context, training logs are printed every + steps_per_loop. + epochs: Number of epochs to train. + eval_input_fn: Function that returns evaluation dataset. If none, + evaluation is skipped. + eval_steps: Number of steps to run evaluation. Required if `eval_input_fn` + is not none. + metric_fn: A metrics function that returns a Keras Metric object to record + evaluation result using evaluation dataset or with training dataset + after every epoch. + init_checkpoint: Optional checkpoint to load to `sub_model` returned by + `model_fn`. + custom_callbacks: A list of Keras Callbacks objects to run during + training. More specifically, `on_batch_begin()`, `on_batch_end()`, + methods are invoked during training. + run_eagerly: Whether to run model training in pure eager execution. This + should be disable for TPUStrategy. + sub_model_export_name: If not None, will export `sub_model` returned by + `model_fn` into checkpoint files. The name of intermediate checkpoint + file is {sub_model_export_name}_step_{step}.ckpt and the last + checkpint's name is {sub_model_export_name}.ckpt; + if None, `sub_model` will not be exported as checkpoint. + explicit_allreduce: Whether to explicitly perform gradient allreduce, + instead of relying on implicit allreduce in optimizer.apply_gradients(). + default is False. For now, if training using FP16 mixed precision, + explicit allreduce will aggregate gradients in FP16 format. For TPU and + GPU training using FP32, explicit allreduce will aggregate gradients in + FP32 format. + pre_allreduce_callbacks: A list of callback functions that takes gradients + and model variables pairs as input, manipulate them, and returns a new + gradients and model variables paris. The callback functions will be + invoked in the list order and before gradients are allreduced. + With mixed precision training, the pre_allreduce_allbacks will be + applied on scaled_gradients. Default is no callbacks. + Only used when explicit_allreduce=True. + post_allreduce_callbacks: A list of callback functions that takes + gradients and model variables pairs as input, manipulate them, and + returns a new gradients and model variables paris. The callback + functions will be invoked in the list order and right before gradients + are applied to variables for updates. Default is no callbacks. Only used + when explicit_allreduce=True. + + Returns: + Trained model. + + Raises: + ValueError: (1) When model returned by `model_fn` does not have optimizer + attribute or when required parameters are set to none. (2) eval args are + not specified correctly. (3) metric_fn must be a callable if specified. + (4) sub_model_checkpoint_name is specified, but `sub_model` returned + by `model_fn` is None. + """ + + if _sentinel is not None: + raise ValueError('only call `run_customized_training_loop()` ' + 'with named arguments.') + + required_arguments = [ + strategy, model_fn, loss_fn, model_dir, steps_per_epoch, train_input_fn + ] + if [arg for arg in required_arguments if arg is None]: + raise ValueError('`strategy`, `model_fn`, `loss_fn`, `model_dir`, ' + '`steps_per_loop` and `steps_per_epoch` are required ' + 'parameters.') + if steps_per_loop > steps_per_epoch: + logging.error( + 'steps_per_loop: %d is specified to be greater than ' + ' steps_per_epoch: %d, we will use steps_per_epoch as' + ' steps_per_loop.', steps_per_loop, steps_per_epoch) + steps_per_loop = steps_per_epoch + assert tf.executing_eagerly() + + if run_eagerly: + if isinstance(strategy, tf.distribute.experimental.TPUStrategy): + raise ValueError( + 'TPUStrategy should not run eagerly as it heavily relies on graph' + ' optimization for the distributed system.') + + if eval_input_fn and (eval_steps is None or metric_fn is None): + raise ValueError( + '`eval_step` and `metric_fn` are required when `eval_input_fn ` ' + 'is not none.') + if metric_fn and not callable(metric_fn): + raise ValueError( + 'if `metric_fn` is specified, metric_fn must be a callable.') + + total_training_steps = steps_per_epoch * epochs + train_iterator = _get_input_iterator(train_input_fn, strategy) + + with distribution_utils.get_strategy_scope(strategy): + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model, sub_model = model_fn() + if not hasattr(model, 'optimizer'): + raise ValueError('User should set optimizer attribute to model ' + 'inside `model_fn`.') + if sub_model_export_name and sub_model is None: + raise ValueError('sub_model_export_name is specified as %s, but ' + 'sub_model is None.' % sub_model_export_name) + + optimizer = model.optimizer + + if init_checkpoint: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'initial checkpoint for core model.', init_checkpoint) + checkpoint = tf.train.Checkpoint(model=sub_model) + checkpoint.restore(init_checkpoint).assert_existing_objects_matched() + logging.info('Loading from checkpoint file completed') + + train_loss_metric = tf.keras.metrics.Mean( + 'training_loss', dtype=tf.float32) + eval_metrics = [metric_fn()] if metric_fn else [] + # If evaluation is required, make a copy of metric as it will be used by + # both train and evaluation. + train_metrics = [ + metric.__class__.from_config(metric.get_config()) + for metric in eval_metrics + ] + + # Create summary writers + if _should_export_summary(strategy): + summary_dir = os.path.join(model_dir, 'summaries') + else: + # In multi worker training we need every worker to write summary, because + # variables can trigger synchronization on read and synchronization needs + # all workers to participate. + summary_dir = tempfile.mkdtemp() + eval_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, 'eval')) + if steps_per_loop >= _MIN_SUMMARY_STEPS: + # Only writes summary when the stats are collected sufficiently over + # enough steps. + train_summary_writer = tf.summary.create_file_writer( + os.path.join(summary_dir, 'train')) + else: + train_summary_writer = None + + # Collects training variables. + training_vars = model.trainable_variables + + def _replicated_step(inputs): + """Replicated training step.""" + + inputs, labels = inputs + with tf.GradientTape() as tape: + model_outputs = model(inputs, training=True) + loss = loss_fn(labels, model_outputs) + # Raw loss is used for reporting in metrics/logs. + raw_loss = loss + if scale_loss: + # Scales down the loss for gradients to be invariant from replicas. + loss = loss / strategy.num_replicas_in_sync + + if explicit_allreduce: + grad_utils.minimize_using_explicit_allreduce(tape, optimizer, loss, + training_vars, + pre_allreduce_callbacks, + post_allreduce_callbacks) + else: + if isinstance(optimizer, + tf.keras.mixed_precision.experimental.LossScaleOptimizer): + with tape: + scaled_loss = optimizer.get_scaled_loss(loss) + scaled_grads = tape.gradient(scaled_loss, training_vars) + grads = optimizer.get_unscaled_gradients(scaled_grads) + else: + grads = tape.gradient(loss, training_vars) + optimizer.apply_gradients(zip(grads, training_vars)) + # For reporting, the metric takes the mean of losses. + train_loss_metric.update_state(raw_loss) + for metric in train_metrics: + metric.update_state(labels, model_outputs) + + @tf.function + def train_steps(iterator, steps): + """Performs distributed training steps in a loop. + + Args: + iterator: the distributed iterator of training datasets. + steps: an tf.int32 integer tensor to specify number of steps to run + inside host training loop. + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + if not isinstance(steps, tf.Tensor): + raise ValueError('steps should be an Tensor. Python object may cause ' + 'retracing.') + + for _ in tf.range(steps): + strategy.run(_replicated_step, args=(next(iterator),)) + + def train_single_step(iterator): + """Performs a distributed training step. + + Args: + iterator: the distributed iterator of training datasets. + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + strategy.run(_replicated_step, args=(next(iterator),)) + + def test_step(iterator): + """Calculates evaluation metrics on distributed devices.""" + + def _test_step_fn(inputs): + """Replicated accuracy calculation.""" + + inputs, labels = inputs + model_outputs = model(inputs, training=False) + for metric in eval_metrics: + metric.update_state(labels, model_outputs) + + strategy.run(_test_step_fn, args=(next(iterator),)) + + if not run_eagerly: + train_single_step = tf.function(train_single_step) + test_step = tf.function(test_step) + + def _run_evaluation(current_training_step, test_iterator): + """Runs validation steps and aggregate metrics.""" + for _ in range(eval_steps): + test_step(test_iterator) + + with eval_summary_writer.as_default(): + for metric in eval_metrics + model.metrics: + metric_value = _float_metric_value(metric) + logging.info('Step: [%d] Validation %s = %f', current_training_step, + metric.name, metric_value) + tf.summary.scalar( + metric.name, metric_value, step=current_training_step) + eval_summary_writer.flush() + + def _run_callbacks_on_batch_begin(batch): + """Runs custom callbacks at the start of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + callback.on_batch_begin(batch) + + def _run_callbacks_on_batch_end(batch, logs): + """Runs custom callbacks at the end of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + callback.on_batch_end(batch, logs) + + # Training loop starts here. + checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer) + sub_model_checkpoint = tf.train.Checkpoint( + model=sub_model) if sub_model_export_name else None + + latest_checkpoint_file = tf.train.latest_checkpoint(model_dir) + if latest_checkpoint_file: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint_file) + checkpoint.restore(latest_checkpoint_file) + logging.info('Loading from checkpoint file completed') + + current_step = optimizer.iterations.numpy() + checkpoint_name = 'ctl_step_{step}.ckpt' + + while current_step < total_training_steps: + # Training loss/metric are taking average over steps inside micro + # training loop. We reset the their values before each round. + train_loss_metric.reset_states() + for metric in train_metrics + model.metrics: + metric.reset_states() + + _run_callbacks_on_batch_begin(current_step) + # Runs several steps in the host while loop. + steps = steps_to_run(current_step, steps_per_epoch, steps_per_loop) + + if tf.test.is_built_with_cuda(): + # TODO(zongweiz): merge with train_steps once tf.while_loop + # GPU performance bugs are fixed. + for _ in range(steps): + train_single_step(train_iterator) + else: + # Converts steps to a Tensor to avoid tf.function retracing. + train_steps(train_iterator, + tf.convert_to_tensor(steps, dtype=tf.int32)) + train_loss = _float_metric_value(train_loss_metric) + current_step += steps + _run_callbacks_on_batch_end(current_step - 1, {'loss': train_loss}) + + # Updates training logging. + training_status = 'Train Step: %d/%d / loss = %s' % ( + current_step, total_training_steps, train_loss) + + if train_summary_writer: + with train_summary_writer.as_default(): + tf.summary.scalar( + train_loss_metric.name, train_loss, step=current_step) + for metric in train_metrics + model.metrics: + metric_value = _float_metric_value(metric) + training_status += ' %s = %f' % (metric.name, metric_value) + tf.summary.scalar(metric.name, metric_value, step=current_step) + train_summary_writer.flush() + logging.info(training_status) + + # Saves model checkpoints and run validation steps at every epoch end. + if current_step % steps_per_epoch == 0: + # To avoid repeated model saving, we do not save after the last + # step of training. + if current_step < total_training_steps: + _save_checkpoint(strategy, checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + if sub_model_export_name: + _save_checkpoint( + strategy, sub_model_checkpoint, model_dir, + '%s_step_%d.ckpt' % (sub_model_export_name, current_step)) + if eval_input_fn: + logging.info('Running evaluation after step: %s.', current_step) + _run_evaluation(current_step, + _get_input_iterator(eval_input_fn, strategy)) + # Re-initialize evaluation metric. + for metric in eval_metrics + model.metrics: + metric.reset_states() + + _save_checkpoint(strategy, checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + if sub_model_export_name: + _save_checkpoint(strategy, sub_model_checkpoint, model_dir, + '%s.ckpt' % sub_model_export_name) + + if eval_input_fn: + logging.info('Running final evaluation after training is complete.') + _run_evaluation(current_step, + _get_input_iterator(eval_input_fn, strategy)) + + training_summary = { + 'total_training_steps': total_training_steps, + 'train_loss': _float_metric_value(train_loss_metric), + } + if eval_metrics: + # TODO(hongkuny): Cleans up summary reporting in text. + training_summary['last_train_metrics'] = _float_metric_value( + train_metrics[0]) + training_summary['eval_metrics'] = _float_metric_value(eval_metrics[0]) + + write_txt_summary(training_summary, summary_dir) + + if not _should_export_summary(strategy): + tf.io.gfile.rmtree(summary_dir) + + return model diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils_test.py new file mode 100644 index 0000000..647d6b9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/model_training_utils_test.py @@ -0,0 +1,235 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for official.modeling.training.model_training_utils.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl.testing import parameterized +from absl.testing.absltest import mock +import numpy as np +import tensorflow as tf + +from tensorflow.python.distribute import combinations +from tensorflow.python.distribute import strategy_combinations +from official.modeling import model_training_utils + + +def eager_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.tpu_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.mirrored_strategy_with_gpu_and_cpu, + strategy_combinations.mirrored_strategy_with_two_gpus, + ], + mode='eager', + ) + + +def eager_gpu_strategy_combinations(): + return combinations.combine( + distribution=[ + strategy_combinations.default_strategy, + strategy_combinations.one_device_strategy_gpu, + strategy_combinations.mirrored_strategy_with_gpu_and_cpu, + strategy_combinations.mirrored_strategy_with_two_gpus, + ], + mode='eager', + ) + + +def create_fake_data_input_fn(batch_size, features_shape, num_classes): + """Creates a dummy input function with the given feature and label shapes. + + Args: + batch_size: integer. + features_shape: list[int]. Feature shape for an individual example. + num_classes: integer. Number of labels. + + Returns: + An input function that is usable in the executor. + """ + + def _dataset_fn(input_context=None): + """An input function for generating fake data.""" + local_batch_size = input_context.get_per_replica_batch_size(batch_size) + features = np.random.rand(64, *features_shape) + labels = np.random.randint(2, size=[64, num_classes]) + # Convert the inputs to a Dataset. + dataset = tf.data.Dataset.from_tensor_slices((features, labels)) + dataset = dataset.shard(input_context.num_input_pipelines, + input_context.input_pipeline_id) + + def _assign_dtype(features, labels): + features = tf.cast(features, tf.float32) + labels = tf.cast(labels, tf.float32) + return features, labels + + # Shuffle, repeat, and batch the examples. + dataset = dataset.map(_assign_dtype) + dataset = dataset.shuffle(64).repeat() + dataset = dataset.batch(local_batch_size, drop_remainder=True) + dataset = dataset.prefetch(buffer_size=64) + return dataset + + return _dataset_fn + + +def create_model_fn(input_shape, num_classes, use_float16=False): + + def _model_fn(): + """A one-layer softmax model suitable for testing.""" + input_layer = tf.keras.layers.Input(shape=input_shape) + x = tf.keras.layers.Dense(num_classes, activation='relu')(input_layer) + output_layer = tf.keras.layers.Dense(num_classes, activation='softmax')(x) + sub_model = tf.keras.models.Model(input_layer, x, name='sub_model') + model = tf.keras.models.Model(input_layer, output_layer, name='model') + model.add_metric( + tf.reduce_mean(input_layer), name='mean_input', aggregation='mean') + model.optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9) + if use_float16: + model.optimizer = ( + tf.keras.mixed_precision.experimental.LossScaleOptimizer( + model.optimizer, loss_scale='dynamic')) + return model, sub_model + + return _model_fn + + +def metric_fn(): + """Gets a tf.keras metric object.""" + return tf.keras.metrics.CategoricalAccuracy(name='accuracy', dtype=tf.float32) + + +def summaries_with_matching_keyword(keyword, summary_dir): + """Yields summary protos matching given keyword from event file.""" + event_paths = tf.io.gfile.glob(os.path.join(summary_dir, 'events*')) + for event in tf.compat.v1.train.summary_iterator(event_paths[-1]): + if event.summary is not None: + for value in event.summary.value: + if keyword in value.tag: + tf.compat.v1.logging.error(event) + yield event.summary + + +def check_eventfile_for_keyword(keyword, summary_dir): + """Checks event files for the keyword.""" + return any(summaries_with_matching_keyword(keyword, summary_dir)) + + +class ModelTrainingUtilsTest(tf.test.TestCase, parameterized.TestCase): + + def setUp(self): + super(ModelTrainingUtilsTest, self).setUp() + self._model_fn = create_model_fn(input_shape=[128], num_classes=3) + + def run_training(self, strategy, model_dir, steps_per_loop, run_eagerly): + input_fn = create_fake_data_input_fn( + batch_size=8, features_shape=[128], num_classes=3) + model_training_utils.run_customized_training_loop( + strategy=strategy, + model_fn=self._model_fn, + loss_fn=tf.keras.losses.categorical_crossentropy, + model_dir=model_dir, + steps_per_epoch=20, + steps_per_loop=steps_per_loop, + epochs=2, + train_input_fn=input_fn, + eval_input_fn=input_fn, + eval_steps=10, + init_checkpoint=None, + metric_fn=metric_fn, + custom_callbacks=None, + run_eagerly=run_eagerly) + + @combinations.generate(eager_strategy_combinations()) + def test_train_eager_single_step(self, distribution): + model_dir = self.get_temp_dir() + if isinstance(distribution, tf.distribute.experimental.TPUStrategy): + with self.assertRaises(ValueError): + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + else: + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + + @combinations.generate(eager_gpu_strategy_combinations()) + def test_train_eager_mixed_precision(self, distribution): + model_dir = self.get_temp_dir() + policy = tf.keras.mixed_precision.experimental.Policy('mixed_float16') + tf.keras.mixed_precision.experimental.set_policy(policy) + self._model_fn = create_model_fn( + input_shape=[128], num_classes=3, use_float16=True) + self.run_training( + distribution, model_dir, steps_per_loop=1, run_eagerly=True) + + @combinations.generate(eager_strategy_combinations()) + def test_train_check_artifacts(self, distribution): + model_dir = self.get_temp_dir() + self.run_training( + distribution, model_dir, steps_per_loop=10, run_eagerly=False) + + # Two checkpoints should be saved after two epochs. + self.assertNotEmpty(tf.io.gfile.glob(os.path.join(model_dir, 'ctl_step_*'))) + self.assertNotEmpty( + tf.io.gfile.glob( + os.path.join(model_dir, 'summaries/training_summary*'))) + + # Loss and accuracy values should be written into summaries. + self.assertTrue( + check_eventfile_for_keyword('loss', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('accuracy', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('mean_input', + os.path.join(model_dir, 'summaries/train'))) + self.assertTrue( + check_eventfile_for_keyword('accuracy', + os.path.join(model_dir, 'summaries/eval'))) + self.assertTrue( + check_eventfile_for_keyword('mean_input', + os.path.join(model_dir, 'summaries/eval'))) + + @combinations.generate( + combinations.combine( + distribution=[ + strategy_combinations.one_device_strategy_gpu, + ], + mode='eager', + )) + def test_train_check_artifacts_non_chief(self, distribution): + # We shouldn't export artifacts on non-chief workers. Since there's no easy + # way to test with real MultiWorkerMirroredStrategy, we patch the strategy + # to make it as if it's MultiWorkerMirroredStrategy on non-chief workers. + extended = distribution.extended + with mock.patch.object(extended.__class__, 'should_checkpoint', + new_callable=mock.PropertyMock, return_value=False), \ + mock.patch.object(extended.__class__, 'should_save_summary', + new_callable=mock.PropertyMock, return_value=False): + model_dir = self.get_temp_dir() + self.run_training( + distribution, model_dir, steps_per_loop=10, run_eagerly=False) + self.assertEmpty(tf.io.gfile.listdir(model_dir)) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/performance.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/performance.py new file mode 100644 index 0000000..4b264f5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/performance.py @@ -0,0 +1,56 @@ +# Lint as: python3 +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions and classes related to training performance.""" + +import tensorflow as tf + + +def configure_optimizer(optimizer, + use_float16=False, + use_graph_rewrite=False, + loss_scale="dynamic"): + """Configures optimizer object with performance options.""" + if use_float16: + # Wraps optimizer with a LossScaleOptimizer. This is done automatically + # in compile() with the "mixed_float16" policy, but since we do not call + # compile(), we must wrap the optimizer manually. + optimizer = ( + tf.keras.mixed_precision.experimental.LossScaleOptimizer( + optimizer, loss_scale=loss_scale)) + if use_graph_rewrite: + # Note: the model dtype must be 'float32', which will ensure + # tf.ckeras.mixed_precision and + # tf.train.experimental.enable_mixed_precision_graph_rewrite do not double + # up. + optimizer = tf.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer) + return optimizer + + +def set_mixed_precision_policy(dtype, loss_scale=None): + """Sets mix precision policy.""" + if dtype == tf.float16: + policy = tf.keras.mixed_precision.experimental.Policy( + 'mixed_float16', loss_scale=loss_scale) + tf.keras.mixed_precision.experimental.set_policy(policy) + elif dtype == tf.bfloat16: + policy = tf.keras.mixed_precision.experimental.Policy( + 'mixed_bfloat16') + tf.keras.mixed_precision.experimental.set_policy(policy) + elif dtype == tf.float32: + tf.keras.mixed_precision.experimental.set_policy('float32') + else: + raise ValueError("Unexpected dtype: %s" % dtype) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/tf_utils.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/tf_utils.py new file mode 100644 index 0000000..34f8f66 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/tf_utils.py @@ -0,0 +1,175 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common TF utilities.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import six +import tensorflow as tf + +from tensorflow.python.util import deprecation +from official.modeling import activations + + +@deprecation.deprecated( + None, + "tf.keras.layers.Layer supports multiple positional args and kwargs as " + "input tensors. pack/unpack inputs to override __call__ is no longer " + "needed." +) +def pack_inputs(inputs): + """Pack a list of `inputs` tensors to a tuple. + + Args: + inputs: a list of tensors. + + Returns: + a tuple of tensors. if any input is None, replace it with a special constant + tensor. + """ + inputs = tf.nest.flatten(inputs) + outputs = [] + for x in inputs: + if x is None: + outputs.append(tf.constant(0, shape=[], dtype=tf.int32)) + else: + outputs.append(x) + return tuple(outputs) + + +@deprecation.deprecated( + None, + "tf.keras.layers.Layer supports multiple positional args and kwargs as " + "input tensors. pack/unpack inputs to override __call__ is no longer " + "needed." +) +def unpack_inputs(inputs): + """unpack a tuple of `inputs` tensors to a tuple. + + Args: + inputs: a list of tensors. + + Returns: + a tuple of tensors. if any input is a special constant tensor, replace it + with None. + """ + inputs = tf.nest.flatten(inputs) + outputs = [] + for x in inputs: + if is_special_none_tensor(x): + outputs.append(None) + else: + outputs.append(x) + x = tuple(outputs) + + # To trick the very pointless 'unbalanced-tuple-unpacking' pylint check + # from triggering. + if len(x) == 1: + return x[0] + return tuple(outputs) + + +def is_special_none_tensor(tensor): + """Checks if a tensor is a special None Tensor.""" + return tensor.shape.ndims == 0 and tensor.dtype == tf.int32 + + +# TODO(hongkuny): consider moving custom string-map lookup to keras api. +def get_activation(identifier): + """Maps a identifier to a Python function, e.g., "relu" => `tf.nn.relu`. + + It checks string first and if it is one of customized activation not in TF, + the corresponding activation will be returned. For non-customized activation + names and callable identifiers, always fallback to tf.keras.activations.get. + + Args: + identifier: String name of the activation function or callable. + + Returns: + A Python function corresponding to the activation function. + """ + if isinstance(identifier, six.string_types): + name_to_fn = { + "gelu": activations.gelu, + "simple_swish": activations.simple_swish, + "hard_swish": activations.hard_swish, + "identity": activations.identity, + } + identifier = str(identifier).lower() + if identifier in name_to_fn: + return tf.keras.activations.get(name_to_fn[identifier]) + return tf.keras.activations.get(identifier) + + +def get_shape_list(tensor, expected_rank=None, name=None): + """Returns a list of the shape of tensor, preferring static dimensions. + + Args: + tensor: A tf.Tensor object to find the shape of. + expected_rank: (optional) int. The expected rank of `tensor`. If this is + specified and the `tensor` has a different rank, and exception will be + thrown. + name: Optional name of the tensor for the error message. + + Returns: + A list of dimensions of the shape of tensor. All static dimensions will + be returned as python integers, and dynamic dimensions will be returned + as tf.Tensor scalars. + """ + if expected_rank is not None: + assert_rank(tensor, expected_rank, name) + + shape = tensor.shape.as_list() + + non_static_indexes = [] + for (index, dim) in enumerate(shape): + if dim is None: + non_static_indexes.append(index) + + if not non_static_indexes: + return shape + + dyn_shape = tf.shape(tensor) + for index in non_static_indexes: + shape[index] = dyn_shape[index] + return shape + + +def assert_rank(tensor, expected_rank, name=None): + """Raises an exception if the tensor rank is not of the expected rank. + + Args: + tensor: A tf.Tensor to check the rank of. + expected_rank: Python integer or list of integers, expected rank. + name: Optional name of the tensor for the error message. + + Raises: + ValueError: If the expected shape doesn't match the actual shape. + """ + expected_rank_dict = {} + if isinstance(expected_rank, six.integer_types): + expected_rank_dict[expected_rank] = True + else: + for x in expected_rank: + expected_rank_dict[x] = True + + actual_rank = tensor.shape.ndims + if actual_rank not in expected_rank_dict: + raise ValueError( + "For the tensor `%s`, the actual tensor rank `%d` (shape = %s) is not " + "equal to the expected tensor rank `%s`" % + (name, actual_rank, str(tensor.shape), str(expected_rank))) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/training/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/training/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/training/distributed_executor.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/training/distributed_executor.py new file mode 100644 index 0000000..1906294 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/modeling/training/distributed_executor.py @@ -0,0 +1,735 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Custom training loop for running TensorFlow 2.0 models.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +import json +import os + +from absl import flags +from absl import logging + +import numpy as np +import tensorflow as tf + +# pylint: disable=unused-import,g-import-not-at-top,redefined-outer-name,reimported +from typing import Optional, Dict, List, Text, Callable, Union, Iterator, Any +from official.modeling.hyperparams import params_dict +from official.utils.misc import distribution_utils +from official.utils import hyperparams_flags + +FLAGS = flags.FLAGS + +strategy_flags_dict = hyperparams_flags.strategy_flags_dict +hparam_flags_dict = hyperparams_flags.hparam_flags_dict + + +def _save_checkpoint(checkpoint, model_dir, checkpoint_prefix): + """Saves model to model_dir with provided checkpoint prefix.""" + + checkpoint_path = os.path.join(model_dir, checkpoint_prefix) + saved_path = checkpoint.save(checkpoint_path) + logging.info('Saving model as TF checkpoint: %s', saved_path) + + +def _steps_to_run(current_step, total_steps, steps_per_loop): + """Calculates steps to run on device.""" + if steps_per_loop <= 0: + raise ValueError('steps_per_loop should be positive integer.') + return min(total_steps - current_step, steps_per_loop) + + +def _no_metric(): + return None + + +class SummaryWriter(object): + """Simple SummaryWriter for writing dictionary of metrics. + + Attributes: + writer: The tf.SummaryWriter. + """ + + def __init__(self, model_dir: Text, name: Text): + """Inits SummaryWriter with paths. + + Arguments: + model_dir: the model folder path. + name: the summary subfolder name. + """ + self.writer = tf.summary.create_file_writer(os.path.join(model_dir, name)) + + def __call__(self, metrics: Union[Dict[Text, float], float], step: int): + """Write metrics to summary with the given writer. + + Args: + metrics: a dictionary of metrics values. Prefer dictionary. + step: integer. The training step. + """ + if not isinstance(metrics, dict): + # Support scalar metric without name. + logging.warning('Warning: summary writer prefer metrics as dictionary.') + metrics = {'metric': metrics} + + with self.writer.as_default(): + for k, v in metrics.items(): + tf.summary.scalar(k, v, step=step) + self.writer.flush() + + +class DistributedExecutor(object): + """Interface to train and eval models with tf.distribute.Strategy. + + Arguments: + strategy: an instance of tf.distribute.Strategy. + params: Model configuration needed to run distribution strategy. + model_fn: Keras model function. Signature: + (params: ParamsDict) -> tf.keras.models.Model. + loss_fn: loss function. Signature: + (y_true: Tensor, y_pred: Tensor) -> Tensor + metric_fn: metric function. Signature: () -> tf.keras.metrics.Metric. + is_multi_host: Set to True when using multi hosts for training, like multi + worker GPU or TPU pod (slice). Otherwise, False. + """ + + def __init__(self, + strategy, + params, + model_fn, + loss_fn, + is_multi_host=False): + + self._params = params + self._model_fn = model_fn + self._loss_fn = loss_fn + self._strategy = strategy + self._checkpoint_name = 'ctl_step_{step}.ckpt' + self._is_multi_host = is_multi_host + self.train_summary_writer = None + self.eval_summary_writer = None + self.global_train_step = None + + @property + def checkpoint_name(self): + """Returns default checkpoint name.""" + return self._checkpoint_name + + @checkpoint_name.setter + def checkpoint_name(self, name): + """Sets default summary writer for the current thread.""" + self._checkpoint_name = name + + def loss_fn(self): + return self._loss_fn() + + def model_fn(self, params): + return self._model_fn(params) + + def _save_config(self, model_dir): + """Save parameters to config files if model_dir is defined.""" + + logging.info('Save config to model_dir %s.', model_dir) + if model_dir: + if not tf.io.gfile.exists(model_dir): + tf.io.gfile.makedirs(model_dir) + self._params.lock() + params_dict.save_params_dict_to_yaml(self._params, + model_dir + '/params.yaml') + else: + logging.warning('model_dir is empty, so skip the save config.') + + def _get_input_iterator( + self, input_fn: Callable[..., tf.data.Dataset], + strategy: tf.distribute.Strategy) -> Optional[Iterator[Any]]: + """Returns distributed dataset iterator. + + Args: + input_fn: (params: dict) -> tf.data.Dataset. + strategy: an instance of tf.distribute.Strategy. + + Returns: + An iterator that yields input tensors. + """ + + if input_fn is None: + return None + # When training with multiple TPU workers, datasets needs to be cloned + # across workers. Since Dataset instance cannot be cloned in eager mode, + # we instead pass callable that returns a dataset. + if self._is_multi_host: + return iter( + strategy.experimental_distribute_datasets_from_function(input_fn)) + else: + input_data = input_fn() + return iter(strategy.experimental_distribute_dataset(input_data)) + + def _create_replicated_step(self, + strategy, + model, + loss_fn, + optimizer, + metric=None): + + def _replicated_step(inputs): + """Replicated training step.""" + inputs, labels = inputs + + with tf.GradientTape() as tape: + outputs = model(inputs, training=True) + prediction_loss = loss_fn(labels, outputs) + loss = tf.reduce_mean(prediction_loss) + loss = loss / strategy.num_replicas_in_sync + if isinstance(metric, tf.keras.metrics.Metric): + metric.update_state(labels, outputs) + else: + logging.error('train metric is not an instance of ' + 'tf.keras.metrics.Metric.') + + grads = tape.gradient(loss, model.trainable_variables) + optimizer.apply_gradients(zip(grads, model.trainable_variables)) + return loss + + return _replicated_step + + def _create_train_step(self, + strategy, + model, + loss_fn, + optimizer, + metric=None): + """Creates a distributed training step. + + Args: + strategy: an instance of tf.distribute.Strategy. + model: (Tensor, bool) -> Tensor. model function. + loss_fn: (y_true: Tensor, y_pred: Tensor) -> Tensor. + optimizer: tf.keras.optimizers.Optimizer. + iterator: an iterator that yields input tensors. + metric: tf.keras.metrics.Metric subclass. + + Returns: + The training step callable. + """ + _replicated_step = self._create_replicated_step(strategy, model, loss_fn, + optimizer, metric) + + @tf.function + def train_step(iterator, num_steps): + """Performs a distributed training step. + + Args: + iterator: an iterator that yields input tensors. + + Returns: + The loss tensor. + """ + if not isinstance(num_steps, tf.Tensor): + raise ValueError('steps should be an Tensor. Python object may cause ' + 'retracing.') + + per_replica_losses = strategy.run( + _replicated_step, args=(next(iterator),)) + for _ in tf.range(num_steps - 1): + per_replica_losses = strategy.run( + _replicated_step, args=(next(iterator),)) + + # For reporting, we returns the mean of losses. + losses = tf.nest.map_structure( + lambda x: strategy.reduce(tf.distribute.ReduceOp.MEAN, x, axis=None), + per_replica_losses) + return losses + + return train_step + + def _create_test_step(self, strategy, model, metric): + """Creates a distributed test step.""" + + @tf.function + def test_step(iterator): + """Calculates evaluation metrics on distributed devices.""" + if not metric: + logging.info('Skip test_step because metric is None (%s)', metric) + return None, None + if not isinstance(metric, tf.keras.metrics.Metric): + raise ValueError( + 'Metric must be an instance of tf.keras.metrics.Metric ' + 'for running in test_step. Actual {}'.format(metric)) + + def _test_step_fn(inputs): + """Replicated accuracy calculation.""" + inputs, labels = inputs + model_outputs = model(inputs, training=False) + metric.update_state(labels, model_outputs) + return labels, model_outputs + + return strategy.run(_test_step_fn, args=(next(iterator),)) + + return test_step + + def train(self, + train_input_fn: Callable[[params_dict.ParamsDict], tf.data.Dataset], + eval_input_fn: Callable[[params_dict.ParamsDict], + tf.data.Dataset] = None, + model_dir: Text = None, + total_steps: int = 1, + iterations_per_loop: int = 1, + train_metric_fn: Callable[[], Any] = None, + eval_metric_fn: Callable[[], Any] = None, + summary_writer_fn: Callable[[Text, Text], + SummaryWriter] = SummaryWriter, + init_checkpoint: Callable[[tf.keras.Model], Any] = None, + custom_callbacks: List[tf.keras.callbacks.Callback] = None, + save_config: bool = True): + """Runs distributed training. + + Args: + train_input_fn: (params: dict) -> tf.data.Dataset training data input + function. + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + model_dir: the folder path for model checkpoints. + total_steps: total training steps. + iterations_per_loop: train steps per loop. After each loop, this job will + update metrics like loss and save checkpoint. + train_metric_fn: metric_fn for evaluation in train_step. + eval_metric_fn: metric_fn for evaluation in test_step. + summary_writer_fn: function to create summary writer. + init_checkpoint: function to load checkpoint. + custom_callbacks: A list of Keras Callbacks objects to run during + training. More specifically, `on_batch_begin()`, `on_batch_end()`, + methods are invoked during training. + save_config: bool. Whether to save params to model_dir. + + Returns: + The training loss and eval metrics. + """ + assert train_input_fn is not None + if train_metric_fn and not callable(train_metric_fn): + raise ValueError('if `train_metric_fn` is specified, ' + 'train_metric_fn must be a callable.') + if eval_metric_fn and not callable(eval_metric_fn): + raise ValueError('if `eval_metric_fn` is specified, ' + 'eval_metric_fn must be a callable.') + train_metric_fn = train_metric_fn or _no_metric + eval_metric_fn = eval_metric_fn or _no_metric + + if custom_callbacks and iterations_per_loop != 1: + logging.error( + 'It is sematically wrong to run callbacks when ' + 'iterations_per_loop is not one (%s)', iterations_per_loop) + + def _run_callbacks_on_batch_begin(batch): + """Runs custom callbacks at the start of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + if callback: + callback.on_batch_begin(batch) + + def _run_callbacks_on_batch_end(batch): + """Runs custom callbacks at the end of every step.""" + if not custom_callbacks: + return + for callback in custom_callbacks: + if callback: + callback.on_batch_end(batch) + + if save_config: + self._save_config(model_dir) + + if FLAGS.save_checkpoint_freq: + save_freq = FLAGS.save_checkpoint_freq + else: + save_freq = iterations_per_loop + + params = self._params + strategy = self._strategy + # To reduce unnecessary send/receive input pipeline operation, we place + # input pipeline ops in worker task. + train_iterator = self._get_input_iterator(train_input_fn, strategy) + train_loss = None + eval_metric_result = None + with strategy.scope(): + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model = self.model_fn(params.as_dict()) + if not hasattr(model, 'optimizer'): + raise ValueError('User should set optimizer attribute to model ' + 'inside `model_fn`.') + optimizer = model.optimizer + + # Training loop starts here. + checkpoint = tf.train.Checkpoint(model=model, optimizer=optimizer) + latest_checkpoint_file = tf.train.latest_checkpoint(model_dir) + initial_step = 0 + if latest_checkpoint_file: + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', latest_checkpoint_file) + checkpoint.restore(latest_checkpoint_file) + initial_step = optimizer.iterations.numpy() + logging.info('Loading from checkpoint file completed. Init step %d', + initial_step) + elif init_checkpoint: + logging.info('Restoring from init checkpoint function') + init_checkpoint(model) + logging.info('Loading from init checkpoint file completed') + + current_step = optimizer.iterations.numpy() + checkpoint_name = self.checkpoint_name + + eval_metric = eval_metric_fn() + train_metric = train_metric_fn() + train_summary_writer = summary_writer_fn(model_dir, 'eval_train') + self.train_summary_writer = train_summary_writer.writer + + test_summary_writer = summary_writer_fn(model_dir, 'eval_test') + self.eval_summary_writer = test_summary_writer.writer + + # Continue training loop. + train_step = self._create_train_step( + strategy=strategy, + model=model, + loss_fn=self.loss_fn(), + optimizer=optimizer, + metric=train_metric) + test_step = None + if eval_input_fn and eval_metric: + self.global_train_step = model.optimizer.iterations + test_step = self._create_test_step(strategy, model, metric=eval_metric) + + logging.info('Training started') + last_save_checkpoint_step = current_step + while current_step < total_steps: + + num_steps = _steps_to_run(current_step, total_steps, iterations_per_loop) + _run_callbacks_on_batch_begin(current_step) + train_loss = train_step(train_iterator, + tf.convert_to_tensor(num_steps, dtype=tf.int32)) + _run_callbacks_on_batch_end(current_step) + current_step += num_steps + + train_loss = tf.nest.map_structure(lambda x: x.numpy().astype(float), + train_loss) + if not isinstance(train_loss, dict): + train_loss = {'total_loss': train_loss} + if np.isnan(train_loss['total_loss']): + raise ValueError('total loss is NaN.') + + if train_metric: + train_metric_result = train_metric.result() + if isinstance(train_metric, tf.keras.metrics.Metric): + train_metric_result = tf.nest.map_structure( + lambda x: x.numpy().astype(float), train_metric_result) + if not isinstance(train_metric_result, dict): + train_metric_result = {'metric': train_metric_result} + train_metric_result.update(train_loss) + else: + train_metric_result = train_loss + if callable(optimizer.lr): + train_metric_result.update( + {'learning_rate': optimizer.lr(current_step).numpy()}) + else: + train_metric_result.update({'learning_rate': optimizer.lr.numpy()}) + logging.info('Train Step: %d/%d / loss = %s / training metric = %s', + current_step, total_steps, train_loss, + train_metric_result) + + train_summary_writer( + metrics=train_metric_result, step=optimizer.iterations) + + # Saves model checkpoints and run validation steps at every + # iterations_per_loop steps. + # To avoid repeated model saving, we do not save after the last + # step of training. + if save_freq > 0 and current_step < total_steps and ( + current_step - last_save_checkpoint_step) >= save_freq: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + last_save_checkpoint_step = current_step + + if test_step: + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Step: %s evalation metric = %s.', current_step, + eval_metric_result) + test_summary_writer( + metrics=eval_metric_result, step=optimizer.iterations) + + # Re-initialize evaluation metric, except the last step. + if eval_metric and current_step < total_steps: + eval_metric.reset_states() + if train_metric and current_step < total_steps: + train_metric.reset_states() + + # Reaches the end of training and saves the last checkpoint. + if last_save_checkpoint_step < total_steps: + _save_checkpoint(checkpoint, model_dir, + checkpoint_name.format(step=current_step)) + + if test_step: + logging.info('Running final evaluation after training is complete.') + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Final evaluation metric = %s.', eval_metric_result) + test_summary_writer( + metrics=eval_metric_result, step=optimizer.iterations) + + return train_loss, eval_metric_result + + def _run_evaluation(self, test_step, current_training_step, metric, + test_iterator): + """Runs validation steps and aggregate metrics.""" + if not test_iterator or not metric: + logging.warning( + 'Both test_iterator (%s) and metrics (%s) must not be None.', + test_iterator, metric) + return None + logging.info('Running evaluation after step: %s.', current_training_step) + while True: + try: + test_step(test_iterator) + except (StopIteration, tf.errors.OutOfRangeError): + break + + metric_result = metric.result() + if isinstance(metric, tf.keras.metrics.Metric): + metric_result = metric_result.numpy().astype(float) + logging.info('Step: [%d] Validation metric = %f', current_training_step, + metric_result) + return metric_result + + def evaluate_from_model_dir( + self, + model_dir: Text, + eval_input_fn: Callable[[params_dict.ParamsDict], tf.data.Dataset], + eval_metric_fn: Callable[[], Any], + total_steps: int = -1, + eval_timeout: int = None, + min_eval_interval: int = 180, + summary_writer_fn: Callable[[Text, Text], SummaryWriter] = SummaryWriter): + """Runs distributed evaluation on model folder. + + Args: + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + eval_metric_fn: metric_fn for evaluation in test_step. + model_dir: the folder for storing model checkpoints. + total_steps: total training steps. If the current step reaches the + total_steps, the evaluation loop will stop. + eval_timeout: The maximum number of seconds to wait between checkpoints. + If left as None, then the process will wait indefinitely. Used by + tf.train.checkpoints_iterator. + min_eval_interval: The minimum number of seconds between yielding + checkpoints. Used by tf.train.checkpoints_iterator. + summary_writer_fn: function to create summary writer. + + Returns: + Eval metrics dictionary of the last checkpoint. + """ + + if not model_dir: + raise ValueError('model_dir must be set.') + + def terminate_eval(): + tf.logging.info('Terminating eval after %d seconds of no checkpoints' % + eval_timeout) + return True + + summary_writer = summary_writer_fn(model_dir, 'eval') + self.eval_summary_writer = summary_writer.writer + + # Read checkpoints from the given model directory + # until `eval_timeout` seconds elapses. + for checkpoint_path in tf.train.checkpoints_iterator( + model_dir, + min_interval_secs=min_eval_interval, + timeout=eval_timeout, + timeout_fn=terminate_eval): + eval_metric_result, current_step = self.evaluate_checkpoint( + checkpoint_path=checkpoint_path, + eval_input_fn=eval_input_fn, + eval_metric_fn=eval_metric_fn, + summary_writer=summary_writer) + if total_steps > 0 and current_step >= total_steps: + logging.info('Evaluation finished after training step %d', current_step) + break + return eval_metric_result + + def evaluate_checkpoint(self, + checkpoint_path: Text, + eval_input_fn: Callable[[params_dict.ParamsDict], + tf.data.Dataset], + eval_metric_fn: Callable[[], Any], + summary_writer: SummaryWriter = None): + """Runs distributed evaluation on the one checkpoint. + + Args: + eval_input_fn: (Optional) same type as train_input_fn. If not None, will + trigger evaluting metric on eval data. If None, will not run eval step. + eval_metric_fn: metric_fn for evaluation in test_step. + checkpoint_path: the checkpoint to evaluate. + summary_writer_fn: function to create summary writer. + + Returns: + Eval metrics dictionary of the last checkpoint. + """ + if not callable(eval_metric_fn): + raise ValueError('if `eval_metric_fn` is specified, ' + 'eval_metric_fn must be a callable.') + + params = self._params + strategy = self._strategy + # To reduce unnecessary send/receive input pipeline operation, we place + # input pipeline ops in worker task. + with strategy.scope(): + + # To correctly place the model weights on accelerators, + # model and optimizer should be created in scope. + model = self.model_fn(params.as_dict()) + checkpoint = tf.train.Checkpoint(model=model) + + eval_metric = eval_metric_fn() + assert eval_metric, 'eval_metric does not exist' + test_step = self._create_test_step(strategy, model, metric=eval_metric) + + logging.info('Starting to evaluate.') + if not checkpoint_path: + raise ValueError('checkpoint path is empty') + reader = tf.compat.v1.train.NewCheckpointReader(checkpoint_path) + current_step = reader.get_tensor( + 'optimizer/iter/.ATTRIBUTES/VARIABLE_VALUE') + logging.info( + 'Checkpoint file %s found and restoring from ' + 'checkpoint', checkpoint_path) + checkpoint.restore(checkpoint_path) + + self.global_train_step = model.optimizer.iterations + eval_iterator = self._get_input_iterator(eval_input_fn, strategy) + eval_metric_result = self._run_evaluation(test_step, current_step, + eval_metric, eval_iterator) + logging.info('Step: %s evalation metric = %s.', current_step, + eval_metric_result) + summary_writer(metrics=eval_metric_result, step=current_step) + eval_metric.reset_states() + + return eval_metric_result, current_step + + def predict(self): + return NotImplementedError('Unimplmented function.') + + +class ExecutorBuilder(object): + """Builder of DistributedExecutor. + + Example 1: Builds an executor with supported Strategy. + builder = ExecutorBuilder( + strategy_type='tpu', + strategy_config={'tpu': '/bns/xxx'}) + dist_executor = builder.build_executor( + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Example 2: Builds an executor with customized Strategy. + builder = ExecutorBuilder() + builder.strategy = + dist_executor = builder.build_executor( + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Example 3: Builds a customized executor with customized Strategy. + class MyDistributedExecutor(DistributedExecutor): + # implementation ... + + builder = ExecutorBuilder() + builder.strategy = + dist_executor = builder.build_executor( + class_ctor=MyDistributedExecutor, + params=params, + model_fn=my_model_fn, + loss_fn=my_loss_fn, + metric_fn=my_metric_fn) + + Args: + strategy_type: string. One of 'tpu', 'mirrored', 'multi_worker_mirrored'. If + None. User is responsible to set the strategy before calling + build_executor(...). + strategy_config: necessary config for constructing the proper Strategy. + Check strategy_flags_dict() for examples of the structure. + """ + + def __init__(self, strategy_type=None, strategy_config=None): + _ = distribution_utils.configure_cluster( + strategy_config.worker_hosts, strategy_config.task_index) + self._strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=strategy_type, + num_gpus=strategy_config.num_gpus, + all_reduce_alg=strategy_config.all_reduce_alg, + num_packs=strategy_config.num_packs, + tpu_address=strategy_config.tpu) + + @property + def strategy(self): + """Returns default checkpoint name.""" + return self._strategy + + @strategy.setter + def strategy(self, new_strategy): + """Sets default summary writer for the current thread.""" + self._strategy = new_strategy + + + def build_executor(self, + class_ctor=DistributedExecutor, + params=None, + model_fn=None, + loss_fn=None, + **kwargs): + """Creates an executor according to strategy type. + + See doc string of the DistributedExecutor.__init__ for more information of + the + input arguments. + + Args: + class_ctor: A constructor of executor (default: DistributedExecutor). + params: ParamsDict, all the model parameters and runtime parameters. + model_fn: Keras model function. + loss_fn: loss function. + **kwargs: other arguments to the executor constructor. + + Returns: + An instance of DistributedExecutor or its subclass. + """ + if self._strategy is None: + raise ValueError('`strategy` should not be None. You need to specify ' + '`strategy_type` in the builder contructor or directly ' + 'set the `strategy` property of the builder.') + return class_ctor( + strategy=self._strategy, + params=params, + model_fn=model_fn, + loss_fn=loss_fn, + **kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/pip_package/setup.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/pip_package/setup.py new file mode 100644 index 0000000..bfd95a1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/pip_package/setup.py @@ -0,0 +1,88 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Sets up TensorFlow Official Models.""" +import datetime +import os +import sys + +from setuptools import find_packages +from setuptools import setup + +version = '2.2.0' + +project_name = 'tf-models-official' + +long_description = """The TensorFlow official models are a collection of +models that use TensorFlow's high-level APIs. +They are intended to be well-maintained, tested, and kept up to date with the +latest TensorFlow API. They should also be reasonably optimized for fast +performance while still being easy to read.""" + +if '--project_name' in sys.argv: + project_name_idx = sys.argv.index('--project_name') + project_name = sys.argv[project_name_idx + 1] + sys.argv.remove('--project_name') + sys.argv.pop(project_name_idx) + + +def _get_requirements(): + """Parses requirements.txt file.""" + install_requires_tmp = [] + dependency_links_tmp = [] + with open( + os.path.join(os.path.dirname(__file__), '../requirements.txt'), 'r') as f: + for line in f: + package_name = line.strip() + if package_name.startswith('-e '): + dependency_links_tmp.append(package_name[3:].strip()) + else: + install_requires_tmp.append(package_name) + return install_requires_tmp, dependency_links_tmp + +install_requires, dependency_links = _get_requirements() + +if project_name == 'tf-models-nightly': + version += '.dev' + datetime.datetime.now().strftime('%Y%m%d') + install_requires.append('tf-nightly') +else: + install_requires.append('tensorflow>=2.1.0') + +print('install_requires: ', install_requires) +print('dependency_links: ', dependency_links) + +setup( + name=project_name, + version=version, + description='TensorFlow Official Models', + long_description=long_description, + author='Google Inc.', + author_email='no-reply@google.com', + url='https://github.com/tensorflow/models', + license='Apache 2.0', + packages=find_packages(exclude=[ + 'research*', + 'tutorials*', + 'samples*', + 'official.r1*', + 'official.pip_package*', + 'official.benchmark*', + ]), + exclude_package_data={ + '': ['*_test.py',], + }, + install_requires=install_requires, + dependency_links=dependency_links, + python_requires='>=3.6', +) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/README.md new file mode 100644 index 0000000..203b295 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/README.md @@ -0,0 +1,23 @@ +# Legacy Models Collection + +The R1 folder contains legacy model implmentation and models that will not +update to TensorFlow 2.x. They do not have solid performance tracking. + +**Note: models will be removed from the master branch by 2020/06.** + +After removal, you can still access to these legacy models in the previous +released tags, e.g. [v2.1.0](https://github.com/tensorflow/models/releases/tag/v2.1.0). + + +## Legacy model implmentation + +Transformer and MNIST implementation uses pure TF 1.x TF-Estimator. +Users should follow the corresponding TF 2.x implmentation inside the +official model garden. + +## Models that will not update to TensorFlow 2.x + +* [boosted_trees](boosted_trees): A Gradient Boosted Trees model to + classify higgs boson process from HIGGS Data Set. +* [wide_deep](wide_deep): A model that combines a wide model and deep + network to classify census income data. diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/README.md new file mode 100644 index 0000000..d8c8fcc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/README.md @@ -0,0 +1,112 @@ +# Classifying Higgs boson processes in the HIGGS Data Set +## Overview +The [HIGGS Data Set](https://archive.ics.uci.edu/ml/datasets/HIGGS) contains 11 million samples with 28 features, and is for the classification problem to distinguish between a signal process which produces Higgs bosons and a background process which does not. + +We use Gradient Boosted Trees algorithm to distinguish the two classes. + +--- + +The code sample uses the high level `tf.estimator.Estimator` and `tf.data.Dataset`. These APIs are great for fast iteration and quickly adapting models to your own datasets without major code overhauls. It allows you to move from single-worker training to distributed training, and makes it easy to export model binaries for prediction. Here, for further simplicity and faster execution, we use a utility function `tf.contrib.estimator.boosted_trees_classifier_train_in_memory`. This utility function is especially effective when the input is provided as in-memory data sets like numpy arrays. + +An input function for the `Estimator` typically uses `tf.data.Dataset` API, which can handle various data control like streaming, batching, transform and shuffling. However `boosted_trees_classifier_train_in_memory()` utility function requires that the entire data is provided as a single batch (i.e. without using `batch()` API). Thus in this practice, simply `Dataset.from_tensors()` is used to convert numpy arrays into structured tensors, and `Dataset.zip()` is used to put features and label together. +For further references of `Dataset`, [Read more here](https://www.tensorflow.org/guide/datasets). + +## Running the code +First make sure you've [added the models folder to your Python path](/official/#running-the-models); otherwise you may encounter an error like `ImportError: No module named official.boosted_trees`. + +### Setup +The [HIGGS Data Set](https://archive.ics.uci.edu/ml/datasets/HIGGS) that this sample uses for training is hosted by the [UC Irvine Machine Learning Repository](https://archive.ics.uci.edu/ml/datasets/). We have provided a script that downloads and cleans the necessary files. + +``` +python data_download.py +``` + +This will download a file and store the processed file under the directory designated by `--data_dir` (defaults to `/tmp/higgs_data/`). To change the target directory, set the `--data_dir` flag. The directory could be network storages that Tensorflow supports (like Google Cloud Storage, `gs:////`). +The file downloaded to the local temporary folder is about 2.8 GB, and the processed file is about 0.8 GB, so there should be enough storage to handle them. + + +### Training + +This example uses about 3 GB of RAM during training. +You can run the code locally as follows: + +``` +python train_higgs.py +``` + +The model is by default saved to `/tmp/higgs_model`, which can be changed using the `--model_dir` flag. +Note that the model_dir is cleaned up before every time training starts. + +Model parameters can be adjusted by flags, like `--n_trees`, `--max_depth`, `--learning_rate` and so on. Check out the code for details. + +The final accuracy will be around 74% and loss will be around 0.516 over the eval set, when trained with the default parameters. + +By default, the first 1 million examples among 11 millions are used for training, and the last 1 million examples are used for evaluation. +The training/evaluation data can be selected as index ranges by flags `--train_start`, `--train_count`, `--eval_start`, `--eval_count`, etc. + +### TensorBoard + +Run TensorBoard to inspect the details about the graph and training progression. + +``` +tensorboard --logdir=/tmp/higgs_model # set logdir as --model_dir set during training. +``` + +## Inference with SavedModel +You can export the model into Tensorflow [SavedModel](https://www.tensorflow.org/guide/saved_model) format by using the argument `--export_dir`: + +``` +python train_higgs.py --export_dir /tmp/higgs_boosted_trees_saved_model +``` + +After the model finishes training, use [`saved_model_cli`](https://www.tensorflow.org/guide/saved_model#cli_to_inspect_and_execute_savedmodel) to inspect and execute the SavedModel. + +Try the following commands to inspect the SavedModel: + +**Replace `${TIMESTAMP}` with the folder produced (e.g. 1524249124)** +``` +# List possible tag_sets. Only one metagraph is saved, so there will be one option. +saved_model_cli show --dir /tmp/higgs_boosted_trees_saved_model/${TIMESTAMP}/ + +# Show SignatureDefs for tag_set=serve. SignatureDefs define the outputs to show. +saved_model_cli show --dir /tmp/higgs_boosted_trees_saved_model/${TIMESTAMP}/ \ + --tag_set serve --all +``` + +### Inference +Let's use the model to predict the income group of two examples. +Note that this model exports SavedModel with the custom parsing module that accepts csv lines as features. (Each line is an example with 28 columns; be careful to not add a label column, unlike in the training data.) + +``` +saved_model_cli run --dir /tmp/boosted_trees_higgs_saved_model/${TIMESTAMP}/ \ + --tag_set serve --signature_def="predict" \ + --input_exprs='inputs=["0.869293,-0.635082,0.225690,0.327470,-0.689993,0.754202,-0.248573,-1.092064,0.0,1.374992,-0.653674,0.930349,1.107436,1.138904,-1.578198,-1.046985,0.0,0.657930,-0.010455,-0.045767,3.101961,1.353760,0.979563,0.978076,0.920005,0.721657,0.988751,0.876678", "1.595839,-0.607811,0.007075,1.818450,-0.111906,0.847550,-0.566437,1.581239,2.173076,0.755421,0.643110,1.426367,0.0,0.921661,-1.190432,-1.615589,0.0,0.651114,-0.654227,-1.274345,3.101961,0.823761,0.938191,0.971758,0.789176,0.430553,0.961357,0.957818"]' +``` + +This will print out the predicted classes and class probabilities. Something like: + +``` +Result for output key class_ids: +[[1] + [0]] +Result for output key classes: +[['1'] + ['0']] +Result for output key logistic: +[[0.6440273 ] + [0.10902369]] +Result for output key logits: +[[ 0.59288704] + [-2.1007526 ]] +Result for output key probabilities: +[[0.3559727 0.6440273] + [0.8909763 0.1090237]] +``` + +Please note that "predict" signature_def gives out different (more detailed) results than "classification" or "serving_default". + +## Additional Links + +If you are interested in distributed training, take a look at [Distributed TensorFlow](https://www.tensorflow.org/deploy/distributed). + +You can also [train models on Cloud ML Engine](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction), which provides [hyperparameter tuning](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#hyperparameter_tuning) to maximize your model's results and enables [deploying your model for prediction](https://cloud.google.com/ml-engine/docs/getting-started-training-prediction#deploy_a_model_to_support_prediction). diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/data_download.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/data_download.py new file mode 100644 index 0000000..1b6fc05 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/data_download.py @@ -0,0 +1,97 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Downloads the UCI HIGGS Dataset and prepares train data. + +The details on the dataset are in https://archive.ics.uci.edu/ml/datasets/HIGGS + +It takes a while as it needs to download 2.8 GB over the network, process, then +store it into the specified location as a compressed numpy file. + +Usage: +$ python data_download.py --data_dir=/tmp/higgs_data +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import gzip +import os +import tempfile + +# pylint: disable=g-bad-import-order +import numpy as np +import pandas as pd +from six.moves import urllib +from absl import app as absl_app +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core + +URL_ROOT = "https://archive.ics.uci.edu/ml/machine-learning-databases/00280" +INPUT_FILE = "HIGGS.csv.gz" +NPZ_FILE = "HIGGS.csv.gz.npz" # numpy compressed file to contain "data" array. + + +def _download_higgs_data_and_save_npz(data_dir): + """Download higgs data and store as a numpy compressed file.""" + input_url = URL_ROOT + "/" + INPUT_FILE + np_filename = os.path.join(data_dir, NPZ_FILE) + if tf.gfile.Exists(np_filename): + raise ValueError("data_dir already has the processed data file: {}".format( + np_filename)) + if not tf.gfile.Exists(data_dir): + tf.gfile.MkDir(data_dir) + # 2.8 GB to download. + try: + tf.logging.info("Data downloading...") + temp_filename, _ = urllib.request.urlretrieve(input_url) + # Reading and parsing 11 million csv lines takes 2~3 minutes. + tf.logging.info("Data processing... taking multiple minutes...") + with gzip.open(temp_filename, "rb") as csv_file: + data = pd.read_csv( + csv_file, + dtype=np.float32, + names=["c%02d" % i for i in range(29)] # label + 28 features. + ).as_matrix() + finally: + tf.gfile.Remove(temp_filename) + + # Writing to temporary location then copy to the data_dir (0.8 GB). + f = tempfile.NamedTemporaryFile() + np.savez_compressed(f, data=data) + tf.gfile.Copy(f.name, np_filename) + tf.logging.info("Data saved to: {}".format(np_filename)) + + +def main(unused_argv): + if not tf.gfile.Exists(FLAGS.data_dir): + tf.gfile.MkDir(FLAGS.data_dir) + _download_higgs_data_and_save_npz(FLAGS.data_dir) + + +def define_data_download_flags(): + """Add flags specifying data download arguments.""" + flags.DEFINE_string( + name="data_dir", default="/tmp/higgs_data", + help=flags_core.help_wrap( + "Directory to download higgs dataset and store training/eval data.")) + + +if __name__ == "__main__": + tf.logging.set_verbosity(tf.logging.INFO) + define_data_download_flags() + FLAGS = flags.FLAGS + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/train_higgs.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/train_higgs.py new file mode 100644 index 0000000..d496a39 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/boosted_trees/train_higgs.py @@ -0,0 +1,297 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""A script that builds boosted trees over higgs data. + +If you haven't, please run data_download.py beforehand to prepare the data. + +For some more details on this example, please refer to README.md as well. + +Note that the model_dir is cleaned up before starting the training. + +Usage: +$ python train_higgs.py --n_trees=100 --max_depth=6 --learning_rate=0.1 \ + --model_dir=/tmp/higgs_model + +Note that BoostedTreesClassifier is available since Tensorflow 1.8.0. +So you need to install recent enough version of Tensorflow to use this example. + +The training data is by default the first million examples out of 11M examples, +and eval data is by default the last million examples. +They are controlled by --train_start, --train_count, --eval_start, --eval_count. +e.g. to train over the first 10 million examples instead of 1 million: +$ python train_higgs.py --n_trees=100 --max_depth=6 --learning_rate=0.1 \ + --model_dir=/tmp/higgs_model --train_count=10000000 + +Training history and metrics can be inspected using tensorboard. +Set --logdir as the --model_dir set by flag when training +(or the default /tmp/higgs_model). +$ tensorboard --logdir=/tmp/higgs_model +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +# pylint: disable=g-bad-import-order +import numpy as np +from absl import app as absl_app +from absl import flags +import tensorflow as tf +# pylint: enable=g-bad-import-order + +from official.utils.flags import core as flags_core +from official.utils.flags._conventions import help_wrap +from official.utils.logs import logger + +NPZ_FILE = "HIGGS.csv.gz.npz" # numpy compressed file containing "data" array + + +def read_higgs_data(data_dir, train_start, train_count, eval_start, eval_count): + """Reads higgs data from csv and returns train and eval data. + + Args: + data_dir: A string, the directory of higgs dataset. + train_start: An integer, the start index of train examples within the data. + train_count: An integer, the number of train examples within the data. + eval_start: An integer, the start index of eval examples within the data. + eval_count: An integer, the number of eval examples within the data. + + Returns: + Numpy array of train data and eval data. + """ + npz_filename = os.path.join(data_dir, NPZ_FILE) + try: + # gfile allows numpy to read data from network data sources as well. + with tf.gfile.Open(npz_filename, "rb") as npz_file: + with np.load(npz_file) as npz: + data = npz["data"] + except tf.errors.NotFoundError as e: + raise RuntimeError( + "Error loading data; use data_download.py to prepare the data.\n{}: {}" + .format(type(e).__name__, e)) + return (data[train_start:train_start+train_count], + data[eval_start:eval_start+eval_count]) + + +# This showcases how to make input_fn when the input data is available in the +# form of numpy arrays. +def make_inputs_from_np_arrays(features_np, label_np): + """Makes and returns input_fn and feature_columns from numpy arrays. + + The generated input_fn will return tf.data.Dataset of feature dictionary and a + label, and feature_columns will consist of the list of + tf.feature_column.BucketizedColumn. + + Note, for in-memory training, tf.data.Dataset should contain the whole data + as a single tensor. Don't use batch. + + Args: + features_np: A numpy ndarray (shape=[batch_size, num_features]) for + float32 features. + label_np: A numpy ndarray (shape=[batch_size, 1]) for labels. + + Returns: + input_fn: A function returning a Dataset of feature dict and label. + feature_names: A list of feature names. + feature_column: A list of tf.feature_column.BucketizedColumn. + """ + num_features = features_np.shape[1] + features_np_list = np.split(features_np, num_features, axis=1) + # 1-based feature names. + feature_names = ["feature_%02d" % (i + 1) for i in range(num_features)] + + # Create source feature_columns and bucketized_columns. + def get_bucket_boundaries(feature): + """Returns bucket boundaries for feature by percentiles.""" + return np.unique(np.percentile(feature, range(0, 100))).tolist() + source_columns = [ + tf.feature_column.numeric_column( + feature_name, dtype=tf.float32, + # Although higgs data have no missing values, in general, default + # could be set as 0 or some reasonable value for missing values. + default_value=0.0) + for feature_name in feature_names + ] + bucketized_columns = [ + tf.feature_column.bucketized_column( + source_columns[i], + boundaries=get_bucket_boundaries(features_np_list[i])) + for i in range(num_features) + ] + + # Make an input_fn that extracts source features. + def input_fn(): + """Returns features as a dictionary of numpy arrays, and a label.""" + features = { + feature_name: tf.constant(features_np_list[i]) + for i, feature_name in enumerate(feature_names) + } + return tf.data.Dataset.zip((tf.data.Dataset.from_tensors(features), + tf.data.Dataset.from_tensors(label_np),)) + + return input_fn, feature_names, bucketized_columns + + +def make_eval_inputs_from_np_arrays(features_np, label_np): + """Makes eval input as streaming batches.""" + num_features = features_np.shape[1] + features_np_list = np.split(features_np, num_features, axis=1) + # 1-based feature names. + feature_names = ["feature_%02d" % (i + 1) for i in range(num_features)] + + def input_fn(): + features = { + feature_name: tf.constant(features_np_list[i]) + for i, feature_name in enumerate(feature_names) + } + return tf.data.Dataset.zip(( + tf.data.Dataset.from_tensor_slices(features), + tf.data.Dataset.from_tensor_slices(label_np),)).batch(1000) + + return input_fn + + +def _make_csv_serving_input_receiver_fn(column_names, column_defaults): + """Returns serving_input_receiver_fn for csv. + + The input arguments are relevant to `tf.decode_csv()`. + + Args: + column_names: a list of column names in the order within input csv. + column_defaults: a list of default values with the same size of + column_names. Each entity must be either a list of one scalar, or an + empty list to denote the corresponding column is required. + e.g. [[""], [2.5], []] indicates the third column is required while + the first column must be string and the second must be float/double. + + Returns: + a serving_input_receiver_fn that handles csv for serving. + """ + def serving_input_receiver_fn(): + csv = tf.placeholder(dtype=tf.string, shape=[None], name="csv") + features = dict(zip(column_names, tf.decode_csv(csv, column_defaults))) + receiver_tensors = {"inputs": csv} + return tf.estimator.export.ServingInputReceiver(features, receiver_tensors) + + return serving_input_receiver_fn + + +def train_boosted_trees(flags_obj): + """Train boosted_trees estimator on HIGGS data. + + Args: + flags_obj: An object containing parsed flag values. + """ + # Clean up the model directory if present. + if tf.gfile.Exists(flags_obj.model_dir): + tf.gfile.DeleteRecursively(flags_obj.model_dir) + tf.logging.info("## Data loading...") + train_data, eval_data = read_higgs_data( + flags_obj.data_dir, flags_obj.train_start, flags_obj.train_count, + flags_obj.eval_start, flags_obj.eval_count) + tf.logging.info("## Data loaded; train: {}{}, eval: {}{}".format( + train_data.dtype, train_data.shape, eval_data.dtype, eval_data.shape)) + # Data consists of one label column followed by 28 feature columns. + train_input_fn, feature_names, feature_columns = make_inputs_from_np_arrays( + features_np=train_data[:, 1:], label_np=train_data[:, 0:1]) + eval_input_fn = make_eval_inputs_from_np_arrays( + features_np=eval_data[:, 1:], label_np=eval_data[:, 0:1]) + tf.logging.info("## Features prepared. Training starts...") + + # Create benchmark logger to log info about the training and metric values + run_params = { + "train_start": flags_obj.train_start, + "train_count": flags_obj.train_count, + "eval_start": flags_obj.eval_start, + "eval_count": flags_obj.eval_count, + "n_trees": flags_obj.n_trees, + "max_depth": flags_obj.max_depth, + } + benchmark_logger = logger.config_benchmark_logger(flags_obj) + benchmark_logger.log_run_info( + model_name="boosted_trees", + dataset_name="higgs", + run_params=run_params, + test_id=flags_obj.benchmark_test_id) + + # Though BoostedTreesClassifier is under tf.estimator, faster in-memory + # training is yet provided as a contrib library. + from tensorflow.contrib import estimator as contrib_estimator # pylint: disable=g-import-not-at-top + classifier = contrib_estimator.boosted_trees_classifier_train_in_memory( + train_input_fn, + feature_columns, + model_dir=flags_obj.model_dir or None, + n_trees=flags_obj.n_trees, + max_depth=flags_obj.max_depth, + learning_rate=flags_obj.learning_rate) + + # Evaluation. + eval_results = classifier.evaluate(eval_input_fn) + # Benchmark the evaluation results + benchmark_logger.log_evaluation_result(eval_results) + + # Exporting the savedmodel with csv parsing. + if flags_obj.export_dir is not None: + classifier.export_savedmodel( + flags_obj.export_dir, + _make_csv_serving_input_receiver_fn( + column_names=feature_names, + # columns are all floats. + column_defaults=[[0.0]] * len(feature_names)), + strip_default_attrs=True) + + +def main(_): + train_boosted_trees(flags.FLAGS) + + +def define_train_higgs_flags(): + """Add tree related flags as well as training/eval configuration.""" + flags_core.define_base(clean=False, stop_threshold=False, batch_size=False, + num_gpu=False, export_dir=True) + flags_core.define_benchmark() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_integer( + name="train_start", default=0, + help=help_wrap("Start index of train examples within the data.")) + flags.DEFINE_integer( + name="train_count", default=1000000, + help=help_wrap("Number of train examples within the data.")) + flags.DEFINE_integer( + name="eval_start", default=10000000, + help=help_wrap("Start index of eval examples within the data.")) + flags.DEFINE_integer( + name="eval_count", default=1000000, + help=help_wrap("Number of eval examples within the data.")) + + flags.DEFINE_integer( + "n_trees", default=100, help=help_wrap("Number of trees to build.")) + flags.DEFINE_integer( + "max_depth", default=6, help=help_wrap("Maximum depths of each tree.")) + flags.DEFINE_float( + "learning_rate", default=0.1, + help=help_wrap("The learning rate.")) + + flags_core.set_defaults(data_dir="/tmp/higgs_data", + model_dir="/tmp/higgs_model") + + +if __name__ == "__main__": + # Training progress and eval results are shown as logging.INFO; so enables it. + tf.logging.set_verbosity(tf.logging.INFO) + define_train_higgs_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/README.md new file mode 100644 index 0000000..890f42f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/README.md @@ -0,0 +1,152 @@ +# ResNet in TensorFlow + +Deep residual networks, or ResNets for short, provided the breakthrough idea of +identity mappings in order to enable training of very deep convolutional neural +networks. This folder contains an implementation of ResNet for the ImageNet +dataset written in TensorFlow. + +See the following papers for more background: + +[1] [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf) by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + +[2] [Identity Mappings in Deep Residual Networks](https://arxiv.org/pdf/1603.05027.pdf) by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + +In code, v1 refers to the ResNet defined in [1] but where a stride 2 is used on +the 3x3 conv rather than the first 1x1 in the bottleneck. This change results +in higher and more stable accuracy with less epochs than the original v1 and has +shown to scale to higher batch sizes with minimal degradation in accuracy. +There is no originating paper. The first mention we are aware of was in the +torch version of [ResNetv1](https://github.com/facebook/fb.resnet.torch). Most +popular v1 implementations are this implementation which we call ResNetv1.5. + +In testing we found v1.5 requires ~12% more compute to train and has 6% reduced +throughput for inference compared to ResNetv1. CIFAR-10 ResNet does not use the +bottleneck and is thus the same for v1 as v1.5. + +v2 refers to [2]. The principle difference between the two versions is that v1 +applies batch normalization and activation after convolution, while v2 applies +batch normalization, then activation, and finally convolution. A schematic +comparison is presented in Figure 1 (left) of [2]. + +Please proceed according to which dataset you would like to train/evaluate on: + + +## CIFAR-10 + +### Setup + +You need to have the latest version of TensorFlow installed. +First, make sure [the models folder is in your Python path](/official/#running-the-models); otherwise you may encounter `ImportError: No module named official.resnet`. + +Then, download and extract the CIFAR-10 data from Alex's website, specifying the location with the `--data_dir` flag. Run the following: + +```bash +python cifar10_download_and_extract.py --data_dir +``` + +Then, to train the model: + +```bash +python cifar10_main.py --data_dir /cifar-10-batches-bin --model_dir +``` + +Use `--data_dir` to specify the location of the CIFAR-10 data used in the previous step. There are more flag options as described in `cifar10_main.py`. + +To export a `SavedModel` from the trained checkpoint: + +```bash +python cifar10_main.py --data_dir /cifar-10-batches-bin --model_dir --eval_only --export_dir +``` + +Note: The `` must be present. You might want to run `mkdir ` beforehand. + +The `SavedModel` can then be [loaded](https://www.tensorflow.org/guide/saved_model#loading_a_savedmodel_in_python) in order to use the ResNet for prediction. + + +## ImageNet + +### Setup +To begin, you will need to download the ImageNet dataset and convert it to +TFRecord format. The following [script](https://github.com/tensorflow/tpu/blob/master/tools/datasets/imagenet_to_gcs.py) +and [README](https://github.com/tensorflow/tpu/tree/master/tools/datasets#imagenet_to_gcspy) +provide a few options. + +Once your dataset is ready, you can begin training the model as follows: + +```bash +python imagenet_main.py --data_dir=/path/to/imagenet +``` + +The model will begin training and will automatically evaluate itself on the +validation data roughly once per epoch. + +Note that there are a number of other options you can specify, including +`--model_dir` to choose where to store the model and `--resnet_size` to choose +the model size (options include ResNet-18 through ResNet-200). See +[`resnet_run_loop.py`](resnet_run_loop.py) for the full list of options. + + +## Compute Devices +Training is accomplished using the DistributionStrategies API. (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/distribute/README.md) + +The appropriate distribution strategy is chosen based on the `--num_gpus` flag. +By default this flag is one if TensorFlow is compiled with CUDA, and zero +otherwise. + +num_gpus: ++ 0: Use OneDeviceStrategy and train on CPU. ++ 1: Use OneDeviceStrategy and train on GPU. ++ 2+: Use MirroredStrategy (data parallelism) to distribute a batch between devices. + +### Pre-trained model +You can download pre-trained versions of ResNet-50. Reported accuracies are top-1 single-crop accuracy for the ImageNet validation set. +Models are reported as both checkpoints produced by Estimator during training, and as SavedModels which are more portable. Checkpoints are fragile, +and these are not guaranteed to work with future versions of the code. Both ResNet v1 +and ResNet v2 have been trained in both fp16 and fp32 precision. (Here v1 refers to "v1.5". See the note above.) Furthermore, SavedModels +are generated to accept either tensor or JPG inputs, and with channels_first (NCHW) and channels_last (NHWC) convolutions. NCHW is generally +better for GPUs, while NHWC is generally better for CPUs. See the TensorFlow [performance guide](https://www.tensorflow.org/performance/performance_guide#data_formats) +for more details. + +ResNet-50 v2 (fp32, Accuracy 76.47%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v2_fp32_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v2 (fp16, Accuracy 76.56%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v2_fp16_20180928.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp16_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v1 (fp32, Accuracy 76.53%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v1_fp32_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp32_savedmodel_NHWC_jpg.tar.gz) + +ResNet-50 v1 (fp16, Accuracy 76.18%): +* [Checkpoint](http://download.tensorflow.org/models/official/20181001_resnet/checkpoints/resnet_imagenet_v1_fp16_20181001.tar.gz) +* SavedModel [(NCHW)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NCHW.tar.gz), +[(NCHW, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NCHW_jpg.tar.gz), +[(NHWC)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NHWC.tar.gz), +[(NHWC, JPG)](http://download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v1_fp16_savedmodel_NHWC_jpg.tar.gz) + +### Transfer Learning +You can use a pretrained model to initialize a training process. In addition you are able to freeze all but the final fully connected layers to fine tune your model. Transfer Learning is useful when training on your own small datasets. For a brief look at transfer learning in the context of convolutional neural networks, we recommend reading these [short notes](http://cs231n.github.io/transfer-learning/). + + +To fine tune a pretrained resnet you must make three changes to your training procedure: + +1) Build the exact same model as previously except we change the number of labels in the final classification layer. + +2) Restore all weights from the pre-trained resnet except for the final classification layer; this will get randomly initialized instead. + +3) Freeze earlier layers of the network + +We can perform these three operations by specifying two flags: ```--pretrained_model_checkpoint_path``` and ```--fine_tune```. The first flag is a string that points to the path of a pre-trained resnet model. If this flag is specified, it will load all but the final classification layer. A key thing to note: if both ```--pretrained_model_checkpoint_path``` and a non empty ```model_dir``` directory are passed, the tensorflow estimator will load only the ```model_dir```. For more on this please see [WarmStartSettings](https://www.tensorflow.org/versions/master/api_docs/python/tf/estimator/WarmStartSettings) and [Estimators](https://www.tensorflow.org/guide/estimators). + +The second flag ```--fine_tune``` is a boolean that indicates whether earlier layers of the network should be frozen. You may set this flag to false if you wish to continue training a pre-trained model from a checkpoint. If you set this flag to true, you can train a new classification layer from scratch. diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/estimator_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/estimator_benchmark.py new file mode 100644 index 0000000..18056fa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/estimator_benchmark.py @@ -0,0 +1,499 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Executes Estimator benchmarks and accuracy tests.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time + +from absl import flags +from absl.testing import flagsaver +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.r1.resnet import cifar10_main as cifar_main +from official.r1.resnet import imagenet_main +from official.utils.flags import core as flags_core +from official.utils.logs import hooks + +IMAGENET_DATA_DIR_NAME = 'imagenet' +CIFAR_DATA_DIR_NAME = 'cifar-10-batches-bin' +FLAGS = flags.FLAGS + + +class EstimatorBenchmark(tf.test.Benchmark): + """Base class to hold methods common to test classes in the module. + + Code under test for Estimator models (ResNet50 and 56) report mostly the + same data and require the same FLAG setup. + """ + + local_flags = None + + def __init__(self, output_dir=None, default_flags=None, flag_methods=None): + if not output_dir: + output_dir = '/tmp' + self.output_dir = output_dir + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + + def _get_model_dir(self, folder_name): + """Returns directory to store info, e.g. saved model and event log.""" + return os.path.join(self.output_dir, folder_name) + + def _setup(self): + """Sets up and resets flags before each test.""" + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + if EstimatorBenchmark.local_flags is None: + for flag_method in self.flag_methods: + flag_method() + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + # Overrides flag values with defaults for the class of tests. + for k, v in self.default_flags.items(): + setattr(FLAGS, k, v) + saved_flag_values = flagsaver.save_flag_values() + EstimatorBenchmark.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(EstimatorBenchmark.local_flags) + + def _report_benchmark(self, + stats, + wall_time_sec, + top_1_max=None, + top_1_min=None): + """Report benchmark results by writing to local protobuf file. + + Args: + stats: dict returned from estimator models with known entries. + wall_time_sec: the during of the benchmark execution in seconds + top_1_max: highest passing level for top_1 accuracy. + top_1_min: lowest passing level for top_1 accuracy. + """ + + examples_per_sec_hook = None + for hook in stats['train_hooks']: + if isinstance(hook, hooks.ExamplesPerSecondHook): + examples_per_sec_hook = hook + break + + eval_results = stats['eval_results'] + metrics = [] + if 'accuracy' in eval_results: + metrics.append({'name': 'accuracy_top_1', + 'value': float(eval_results['accuracy']), + 'min_value': top_1_min, + 'max_value': top_1_max}) + if 'accuracy_top_5' in eval_results: + metrics.append({'name': 'accuracy_top_5', + 'value': float(eval_results['accuracy_top_5'])}) + + if examples_per_sec_hook: + exp_per_second_list = examples_per_sec_hook.current_examples_per_sec_list + # ExamplesPerSecondHook skips the first 10 steps. + exp_per_sec = sum(exp_per_second_list) / (len(exp_per_second_list)) + metrics.append({'name': 'exp_per_second', + 'value': exp_per_sec}) + flags_str = flags_core.get_nondefault_flags_as_str() + self.report_benchmark( + iters=eval_results.get('global_step', None), + wall_time=wall_time_sec, + metrics=metrics, + extras={'flags': flags_str}) + + +class Resnet50EstimatorAccuracy(EstimatorBenchmark): + """Benchmark accuracy tests for ResNet50 w/ Estimator.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """Benchmark accuracy tests for ResNet50 w/ Estimator. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [imagenet_main.define_imagenet_flags] + + self.data_dir = os.path.join(root_data_dir, IMAGENET_DATA_DIR_NAME) + super(Resnet50EstimatorAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def benchmark_graph_8_gpu(self): + """Test 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 128 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_8_gpu') + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu(self): + """Test FP16 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu') + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_8_gpu(self): + """Test FP16 graph rewrite 8 GPUs graph mode.""" + self._setup() + FLAGS.num_gpus = 8 + FLAGS.data_dir = self.data_dir + FLAGS.batch_size = 256 * 8 + FLAGS.train_epochs = 90 + FLAGS.epochs_between_evals = 10 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_8_gpu') + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.run_imagenet(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + self._report_benchmark(stats, + wall_time_sec, + top_1_min=0.762, + top_1_max=0.766) + + +class Resnet50EstimatorBenchmarkBase(EstimatorBenchmark): + """Base class for benchmarks for ResNet50 using Estimator.""" + local_flags = None + + def __init__(self, output_dir=None, default_flags=None): + flag_methods = [imagenet_main.define_imagenet_flags] + + super(Resnet50EstimatorBenchmarkBase, self).__init__( + output_dir=output_dir, + default_flags=default_flags, + flag_methods=flag_methods) + + def _run_and_report_benchmark(self): + start_time_sec = time.time() + stats = imagenet_main.run_imagenet(FLAGS) + wall_time_sec = time.time() - start_time_sec + print(stats) + # Remove values to skip triggering accuracy check. + stats['eval_results'].pop('accuracy', None) + stats['eval_results'].pop('accuracy_top_5', None) + + self._report_benchmark(stats, wall_time_sec) + + +class Resnet50EstimatorBenchmark(Resnet50EstimatorBenchmarkBase): + """Benchmarks for ResNet50 using Estimator with 1 worker.""" + + def __init__(self, output_dir=None, default_flags=None): + super(Resnet50EstimatorBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags) + + def benchmark_graph_fp16_1_gpu(self): + """Benchmarks graph fp16 1 gpu.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu') + FLAGS.batch_size = 128 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_1_gpu_tweaked(self): + """Benchmarks graph fp16 1 gpu tweaked.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu_tweaked') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_1_gpu_tweaked(self): + """Benchmarks graph fp16 graph rewrite 1 gpu tweaked.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_1_gpu_tweaked') + FLAGS.batch_size = 256 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_1_gpu(self): + """Benchmarks graph 1 gpu.""" + self._setup() + + FLAGS.num_gpus = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + FLAGS.batch_size = 128 + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_8_gpu(self): + """Benchmarks graph 8 gpus.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_8_gpu') + FLAGS.batch_size = 128*8 + FLAGS.dtype = 'fp32' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu(self): + """Benchmarks graph fp16 8 gpus.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu_tweaked(self): + """Benchmarks graph fp16 8 gpus tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_8_gpu_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_graph_rewrite_8_gpu_tweaked(self): + """Benchmarks graph fp16 graph rewrite 8 gpus tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.model_dir = self._get_model_dir( + 'benchmark_graph_fp16_graph_rewrite_8_gpu_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.fp16_implementation = 'graph_rewrite' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + +class Resnet50EstimatorBenchmarkSynth(Resnet50EstimatorBenchmark): + """Resnet50 synthetic benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['use_synthetic_data'] = True + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50EstimatorBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50EstimatorBenchmarkReal(Resnet50EstimatorBenchmark): + """Resnet50 real data benchmark tests.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['data_dir'] = os.path.join(root_data_dir, IMAGENET_DATA_DIR_NAME) + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50EstimatorBenchmarkReal, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet50MultiWorkerEstimatorBenchmark(Resnet50EstimatorBenchmarkBase): + """Benchmarks for ResNet50 using Estimator with multiple workers.""" + + def __init__(self, output_dir=None, default_flags=None): + super(Resnet50MultiWorkerEstimatorBenchmark, self).__init__( + output_dir=output_dir, + default_flags=default_flags) + + def benchmark_graph_fp16_8_gpu_ring_tweaked(self): + """Benchmarks graph fp16 8 gpus with ring collective tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.all_reduce_alg = 'ring' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + folder_name='benchmark_graph_fp16_8_gpu_ring_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_8_gpu_nccl_tweaked(self): + """Benchmarks graph fp16 8 gpus with nccl collective tweaked.""" + self._setup() + + FLAGS.num_gpus = 8 + FLAGS.distribution_strategy = 'multi_worker_mirrored' + FLAGS.all_reduce_alg = 'nccl' + FLAGS.tf_gpu_thread_mode = 'gpu_private' + FLAGS.intra_op_parallelism_threads = 1 + FLAGS.datasets_num_private_threads = 32 + FLAGS.model_dir = self._get_model_dir( + folder_name='benchmark_graph_fp16_8_gpu_nccl_tweaked') + FLAGS.batch_size = 256*8 + FLAGS.dtype = 'fp16' + FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + +class Resnet50MultiWorkerEstimatorBenchmarkSynth( + Resnet50MultiWorkerEstimatorBenchmark): + """ResNet50, multi-worker, Estimator, synthetic data.""" + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + def_flags = {} + def_flags['use_synthetic_data'] = True + def_flags['max_train_steps'] = 110 + def_flags['train_epochs'] = 1 + + super(Resnet50MultiWorkerEstimatorBenchmarkSynth, self).__init__( + output_dir=output_dir, default_flags=def_flags) + + +class Resnet56EstimatorAccuracy(EstimatorBenchmark): + """Accuracy tests for Estimator ResNet56.""" + + local_flags = None + + def __init__(self, output_dir=None, root_data_dir=None, **kwargs): + """A benchmark class. + + Args: + output_dir: directory where to output e.g. log files + root_data_dir: directory under which to look for dataset + **kwargs: arbitrary named arguments. This is needed to make the + constructor forward compatible in case PerfZero provides more + named arguments before updating the constructor. + """ + flag_methods = [cifar_main.define_cifar_flags] + + self.data_dir = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME) + super(Resnet56EstimatorAccuracy, self).__init__( + output_dir=output_dir, flag_methods=flag_methods) + + def benchmark_graph_1_gpu(self): + """Test layers model with Estimator and distribution strategies.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_1_gpu(self): + """Test layers FP16 model with Estimator and distribution strategies.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_1_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp16' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_2_gpu(self): + """Test layers model with Estimator and dist_strat. 2 GPUs.""" + self._setup() + flags.FLAGS.num_gpus = 2 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def benchmark_graph_fp16_2_gpu(self): + """Test layers FP16 model with Estimator and dist_strat. 2 GPUs.""" + self._setup() + flags.FLAGS.num_gpus = 2 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 182 + flags.FLAGS.model_dir = self._get_model_dir('benchmark_graph_fp16_2_gpu') + flags.FLAGS.resnet_size = 56 + flags.FLAGS.dtype = 'fp16' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def unit_test(self): + """A lightweight test that can finish quickly.""" + self._setup() + flags.FLAGS.num_gpus = 1 + flags.FLAGS.data_dir = self.data_dir + flags.FLAGS.batch_size = 128 + flags.FLAGS.train_epochs = 1 + flags.FLAGS.model_dir = self._get_model_dir('unit_test') + flags.FLAGS.resnet_size = 8 + flags.FLAGS.dtype = 'fp32' + flags.FLAGS.hooks = ['ExamplesPerSecondHook'] + self._run_and_report_benchmark() + + def _run_and_report_benchmark(self): + """Executes benchmark and reports result.""" + start_time_sec = time.time() + stats = cifar_main.run_cifar(flags.FLAGS) + wall_time_sec = time.time() - start_time_sec + + self._report_benchmark(stats, + wall_time_sec, + top_1_min=0.926, + top_1_max=0.938) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_main.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_main.py new file mode 100644 index 0000000..1c4fef1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_main.py @@ -0,0 +1,433 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Runs a ResNet model on the ImageNet dataset.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import sys +import datetime + +import time + +sys.path.append(os.path.dirname(os.path.realpath(__file__)) + '/../../../') + +# import pydevd_pycharm +# pydevd_pycharm.settrace('10.174.181.209', port=8008, stdoutToServer=True, stderrToServer=True) + + +from absl import app as absl_app +from absl import flags +from six.moves import range +import tensorflow as tf + +from official.r1.resnet import imagenet_preprocessing +from official.r1.resnet import resnet_model +from official.r1.resnet import resnet_run_loop +from official.utils.flags import core as flags_core +from official.utils.logs import logger +import logging +############## npu modify begin ############# +from npu_bridge.estimator import npu_ops +from hccl.manage.api import get_local_rank_id +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +from tensorflow.core.protobuf import rewriter_config_pb2 +tf.compat.v1.logging.set_verbosity(tf.logging.INFO) +############## npu modify end ############### + +DEFAULT_IMAGE_SIZE = 224 +NUM_CHANNELS = 3 +NUM_CLASSES = 1001 + +NUM_IMAGES = { + 'train': 1281167, + 'validation': 50000, +} + +_NUM_TRAIN_FILES = 1024 +_SHUFFLE_BUFFER = 10000 + +DATASET_NAME = 'ImageNet' +#log_file1 = 'result/logger_resnet50.log' +#log_file1 = os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../result/logger_resnet50.log') + + +############################################################################### +# Data processing +############################################################################### +def get_filenames(is_training, data_dir): + """Return filenames for dataset.""" + if is_training: + return [ + os.path.join(data_dir, 'train-%05d-of-01024' % i) + for i in range(_NUM_TRAIN_FILES)] + else: + return [ + os.path.join(data_dir, 'validation-%05d-of-00128' % i) + for i in range(128)] + + +def _parse_example_proto(example_serialized): + """Parses an Example proto containing a training example of an image. + + The output of the build_image_data.py image preprocessing script is a dataset + containing serialized Example protocol buffers. Each Example proto contains + the following fields (values are included as examples): + + image/height: 462 + image/width: 581 + image/colorspace: 'RGB' + image/channels: 3 + image/class/label: 615 + image/class/synset: 'n03623198' + image/class/text: 'knee pad' + image/object/bbox/xmin: 0.1 + image/object/bbox/xmax: 0.9 + image/object/bbox/ymin: 0.2 + image/object/bbox/ymax: 0.6 + image/object/bbox/label: 615 + image/format: 'JPEG' + image/filename: 'ILSVRC2012_val_00041207.JPEG' + image/encoded: + + Args: + example_serialized: scalar Tensor tf.string containing a serialized + Example protocol buffer. + + Returns: + image_buffer: Tensor tf.string containing the contents of a JPEG file. + label: Tensor tf.int32 containing the label. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + """ + # Dense features in Example proto. + feature_map = { + 'image/encoded': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.io.FixedLenFeature([], dtype=tf.int64, + default_value=-1), + 'image/class/text': tf.io.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.io.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.io.parse_single_example(serialized=example_serialized, + features=feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(a=bbox, perm=[0, 2, 1]) + + return features['image/encoded'], label, bbox + + +def parse_record(raw_record, is_training, dtype): + """Parses a record containing a training example of an image. + + The input record is parsed into a label and image, and the image is passed + through preprocessing steps (cropping, flipping, and so on). + + Args: + raw_record: scalar Tensor tf.string containing a serialized + Example protocol buffer. + is_training: A boolean denoting whether the input is for training. + dtype: data type to use for images/features. + + Returns: + Tuple with processed image tensor and one-hot-encoded label tensor. + """ + image_buffer, label, bbox = _parse_example_proto(raw_record) + #work_num, root_dir, datatime, resnet_logger = hwlog.env(log_file1) + # add 预处理 + #resnet_logger.info("namespace:%s,time_ts:%s, event_type:pre_process_event" % (work_num, date_time)) + #resnet_logger.info("namespace:%s,time_ts:%s,event_type:init_start" % (work_num, date_time)) + image = imagenet_preprocessing.preprocess_image( + image_buffer=image_buffer, + bbox=bbox, + output_height=DEFAULT_IMAGE_SIZE, + output_width=DEFAULT_IMAGE_SIZE, + num_channels=NUM_CHANNELS, + is_training=is_training) + # resnet_logger.info("namespace:%s,time_ts:%d,event_type:init_end, root_dir:%s" % (work_num, datatime, root_dir)) + image = tf.cast(image, dtype) + + return image, label + + +def input_fn(is_training, + data_dir, + batch_size, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + parse_record_fn=parse_record, + input_context=None, + drop_remainder=False, + tf_data_experimental_slack=False): + """Input function which provides batches for train or eval. + + Args: + is_training: A boolean denoting whether the input is for training. + data_dir: The directory containing the input data. + batch_size: The number of samples per batch. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features + datasets_num_private_threads: Number of private threads for tf.data. + parse_record_fn: Function to use for parsing the records. + input_context: A `tf.distribute.InputContext` object passed in by + `tf.distribute.Strategy`. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + A dataset that can be used for iteration. + """ + filenames = get_filenames(is_training, data_dir) + dataset = tf.data.Dataset.from_tensor_slices(filenames) + + if input_context: + ############## npu modify begin ############# + dataset = dataset.shard(get_rank_size(), + get_rank_id()) + ############## npu modify end ############### + + if is_training: + # Shuffle the input files + dataset = dataset.shuffle(buffer_size=_NUM_TRAIN_FILES) + + # Convert to individual records. + # cycle_length = 10 means that up to 10 files will be read and deserialized in + # parallel. You may want to increase this number if you have a large number of + # CPU cores. + dataset = dataset.interleave( + tf.data.TFRecordDataset, + cycle_length=10, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + return resnet_run_loop.process_record_dataset( + dataset=dataset, + is_training=is_training, + batch_size=batch_size, + shuffle_buffer=_SHUFFLE_BUFFER, + parse_record_fn=parse_record_fn, + num_epochs=num_epochs, + dtype=dtype, + datasets_num_private_threads=datasets_num_private_threads, + drop_remainder=drop_remainder, + tf_data_experimental_slack=tf_data_experimental_slack, + ) + + +def get_synth_input_fn(dtype): + return resnet_run_loop.get_synth_input_fn( + DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE, NUM_CHANNELS, NUM_CLASSES, + dtype=dtype) + + +############################################################################### +# Running the model +############################################################################### +class ImagenetModel(resnet_model.Model): + """Model class with appropriate defaults for Imagenet data.""" + + def __init__(self, resnet_size, data_format=None, num_classes=NUM_CLASSES, + resnet_version=resnet_model.DEFAULT_VERSION, + dtype=resnet_model.DEFAULT_DTYPE): + """These are the parameters that work for Imagenet data. + + Args: + resnet_size: The number of convolutional layers needed in the model. + data_format: Either 'channels_first' or 'channels_last', specifying which + data format to use when setting up the model. + num_classes: The number of output classes needed from the model. This + enables users to extend the same model to their own datasets. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + dtype: The TensorFlow dtype to use for calculations. + """ + + # For bigger models, we want to use "bottleneck" layers + if resnet_size < 50: + bottleneck = False + else: + bottleneck = True + + super(ImagenetModel, self).__init__( + resnet_size=resnet_size, + bottleneck=bottleneck, + num_classes=num_classes, + num_filters=64, + kernel_size=7, + conv_stride=2, + first_pool_size=3, + first_pool_stride=2, + block_sizes=_get_block_sizes(resnet_size), + block_strides=[1, 2, 2, 2], + resnet_version=resnet_version, + data_format=data_format, + dtype=dtype + ) + + +def _get_block_sizes(resnet_size): + """Retrieve the size of each block_layer in the ResNet model. + + The number of block layers used for the Resnet model varies according + to the size of the model. This helper grabs the layer set we want, throwing + an error if a non-standard size has been selected. + + Args: + resnet_size: The number of convolutional layers needed in the model. + + Returns: + A list of block sizes to use in building the model. + + Raises: + KeyError: if invalid resnet_size is received. + """ + choices = { + 18: [2, 2, 2, 2], + 34: [3, 4, 6, 3], + 50: [3, 4, 6, 3], + 101: [3, 4, 23, 3], + 152: [3, 8, 36, 3], + 200: [3, 24, 36, 3] + } + + try: + return choices[resnet_size] + except KeyError: + err = ('Could not find layers for selected Resnet size.\n' + 'Size received: {}; sizes allowed: {}.'.format( + resnet_size, list(choices.keys()))) + raise ValueError(err) + + +def imagenet_model_fn(features, labels, mode, params): + """Our model_fn for ResNet to be used with our Estimator.""" + + # Warmup and higher lr may not be valid for fine tuning with small batches + # and smaller numbers of training images. + if params['fine_tune']: + warmup = False + base_lr = .1 + else: + warmup = True + base_lr = .128 + + learning_rate_fn = resnet_run_loop.learning_rate_with_decay( + batch_size=params['num_gpus']*params['batch_size'], + batch_denom=256, num_images=NUM_IMAGES['train'], + boundary_epochs=[30, 60, 80, 90], decay_rates=[1, 0.1, 0.01, 0.001, 1e-4], + warmup=warmup, base_lr=base_lr) + + return resnet_run_loop.resnet_model_fn( + features=features, + labels=labels, + mode=mode, + model_class=ImagenetModel, + resnet_size=params['resnet_size'], + weight_decay=flags.FLAGS.weight_decay, + learning_rate_fn=learning_rate_fn, + momentum=0.9, + data_format=params['data_format'], + resnet_version=params['resnet_version'], + loss_scale=params['loss_scale'], + loss_filter_fn=None, + dtype=params['dtype'], + fine_tune=params['fine_tune'], + label_smoothing=flags.FLAGS.label_smoothing + ) + + +def define_imagenet_flags(): + resnet_run_loop.define_resnet_flags( + resnet_size_choices=['18', '34', '50', '101', '152', '200'], + dynamic_loss_scale=True, + fp16_implementation=True) + flags.adopt_module_key_flags(resnet_run_loop) + flags_core.set_defaults(train_epochs=90) + + #Loss scale is defautt used because Davinci core supports mixed precision naturally + flags_core.set_defaults(loss_scale='512') + +def run_imagenet(flags_obj): + """Run ResNet ImageNet training and eval loop. + + Args: + flags_obj: An object containing parsed flag values. + + Returns: + Dict of results of the run. Contains the keys `eval_results` and + `train_hooks`. `eval_results` contains accuracy (top_1) and + accuracy_top_5. `train_hooks` is a list the instances of hooks used during + training. + """ + input_function = (flags_obj.use_synthetic_data and + get_synth_input_fn(flags_core.get_tf_dtype(flags_obj)) or + input_fn) + + result = resnet_run_loop.resnet_main( + flags_obj, imagenet_model_fn, input_function, DATASET_NAME,NUM_IMAGES, + shape=[DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE, NUM_CHANNELS],) + + return result +def main(flags_obj): + ############## npu modify begin ############# + # Init NPU ,then can call HCCL Interface + init_sess,npu_init=resnet_run_loop.init_npu() + + init_sess.run(npu_init) + # i=1 + # while(1): + # i+=1 + ############## npu modify end ############### + + with logger.benchmark_context(flags.FLAGS): + run_imagenet(flags.FLAGS) + +def benchmark_main(): + absl_app.run(main) + +def benchmark_pre(): + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + define_imagenet_flags() + +if __name__ == '__main__': + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + define_imagenet_flags() + absl_app.run(main) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py new file mode 100644 index 0000000..891b58a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_preprocessing.py @@ -0,0 +1,262 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Provides utilities to preprocess images. + +Training images are sampled using the provided bounding boxes, and subsequently +cropped to the sampled bounding box. Images are additionally flipped randomly, +then resized to the target output size (without aspect-ratio preservation). + +Images used during evaluation are resized (with aspect-ratio preservation) and +centrally cropped. + +All images undergo mean color subtraction. + +Note that these steps are colloquially referred to as "ResNet preprocessing," +and they differ from "VGG preprocessing," which does not use bounding boxes +and instead does an aspect-preserving resize followed by random crop during +training. (These both differ from "Inception preprocessing," which introduces +color distortion steps.) + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +_R_MEAN = 123.68 +_G_MEAN = 116.78 +_B_MEAN = 103.94 +_CHANNEL_MEANS = [_R_MEAN, _G_MEAN, _B_MEAN] + +# The lower bound for the smallest side of the image for aspect-preserving +# resizing. For example, if an image is 500 x 1000, it will be resized to +# _RESIZE_MIN x (_RESIZE_MIN * 2). +_RESIZE_MIN = 256 + + +def _decode_crop_and_flip(image_buffer, bbox, num_channels): + """Crops the given image to a random part of the image, and randomly flips. + + We use the fused decode_and_crop op, which performs better than the two ops + used separately in series, but note that this requires that the image be + passed in as an un-decoded string Tensor. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + num_channels: Integer depth of the image buffer for decoding. + + Returns: + 3-D tensor with cropped image. + + """ + # A large fraction of image datasets contain a human-annotated bounding box + # delineating the region of the image containing the object of interest. We + # choose to create a new bounding box for the object which is a randomly + # distorted version of the human-annotated bounding box that obeys an + # allowed range of aspect ratios, sizes and overlap with the human-annotated + # bounding box. If no box is supplied, then we assume the bounding box is + # the entire image. + sample_distorted_bounding_box = tf.image.sample_distorted_bounding_box( + tf.image.extract_jpeg_shape(image_buffer), + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=[0.75, 1.33], + area_range=[0.05, 1.0], + max_attempts=100, + use_image_if_no_bounding_boxes=True) + bbox_begin, bbox_size, _ = sample_distorted_bounding_box + + # Reassemble the bounding box in the format the crop op requires. + offset_y, offset_x, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_y, offset_x, target_height, target_width]) + + # Use the fused decode and crop op here, which is faster than each in series. + cropped = tf.image.decode_and_crop_jpeg( + image_buffer, crop_window, channels=num_channels) + + # Flip to add a little more random distortion in. + cropped = tf.image.random_flip_left_right(cropped) + return cropped + + +def _central_crop(image, crop_height, crop_width): + """Performs central crops of the given image list. + + Args: + image: a 3-D image tensor + crop_height: the height of the image following the crop. + crop_width: the width of the image following the crop. + + Returns: + 3-D tensor with cropped image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + amount_to_be_cropped_h = (height - crop_height) + crop_top = amount_to_be_cropped_h // 2 + amount_to_be_cropped_w = (width - crop_width) + crop_left = amount_to_be_cropped_w // 2 + return tf.slice( + image, [crop_top, crop_left, 0], [crop_height, crop_width, -1]) + + +def _mean_image_subtraction(image, means, num_channels): + """Subtracts the given means from each image channel. + + For example: + means = [123.68, 116.779, 103.939] + image = _mean_image_subtraction(image, means) + + Note that the rank of `image` must be known. + + Args: + image: a tensor of size [height, width, C]. + means: a C-vector of values to subtract from each channel. + num_channels: number of color channels in the image that will be distorted. + + Returns: + the centered image. + + Raises: + ValueError: If the rank of `image` is unknown, if `image` has a rank other + than three or if the number of channels in `image` doesn't match the + number of values in `means`. + """ + if image.get_shape().ndims != 3: + raise ValueError('Input must be of size [height, width, C>0]') + + if len(means) != num_channels: + raise ValueError('len(means) must match the number of channels') + + # We have a 1-D tensor of means; convert to 3-D. + # Note(b/130245863): we explicitly call `broadcast` instead of simply + # expanding dimensions for better performance. + means = tf.broadcast_to(means, tf.shape(image)) + + return image - means + + +def _smallest_size_at_least(height, width, resize_min): + """Computes new shape with the smallest side equal to `smallest_side`. + + Computes new shape with the smallest side equal to `smallest_side` while + preserving the original aspect ratio. + + Args: + height: an int32 scalar tensor indicating the current height. + width: an int32 scalar tensor indicating the current width. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + new_height: an int32 scalar tensor indicating the new height. + new_width: an int32 scalar tensor indicating the new width. + """ + resize_min = tf.cast(resize_min, tf.float32) + + # Convert to floats to make subsequent calculations go smoothly. + height, width = tf.cast(height, tf.float32), tf.cast(width, tf.float32) + + smaller_dim = tf.minimum(height, width) + scale_ratio = resize_min / smaller_dim + + # Convert back to ints to make heights and widths that TF ops will accept. + new_height = tf.cast(height * scale_ratio, tf.int32) + new_width = tf.cast(width * scale_ratio, tf.int32) + + return new_height, new_width + + +def _aspect_preserving_resize(image, resize_min): + """Resize images preserving the original aspect ratio. + + Args: + image: A 3-D image `Tensor`. + resize_min: A python integer or scalar `Tensor` indicating the size of + the smallest side after resize. + + Returns: + resized_image: A 3-D tensor containing the resized image. + """ + shape = tf.shape(input=image) + height, width = shape[0], shape[1] + + new_height, new_width = _smallest_size_at_least(height, width, resize_min) + + return _resize_image(image, new_height, new_width) + + +def _resize_image(image, height, width): + """Simple wrapper around tf.resize_images. + + This is primarily to make sure we use the same `ResizeMethod` and other + details each time. + + Args: + image: A 3-D image `Tensor`. + height: The target height for the resized image. + width: The target width for the resized image. + + Returns: + resized_image: A 3-D tensor containing the resized image. The first two + dimensions have the shape [height, width]. + """ + return tf.compat.v1.image.resize( + image, [height, width], method=tf.image.ResizeMethod.BILINEAR, + align_corners=False) + + +def preprocess_image(image_buffer, bbox, output_height, output_width, + num_channels, is_training=False): + """Preprocesses the given image. + + Preprocessing includes decoding, cropping, and resizing for both training + and eval images. Training preprocessing, however, introduces some random + distortion of the image to improve accuracy. + + Args: + image_buffer: scalar string Tensor representing the raw JPEG image buffer. + bbox: 3-D float Tensor of bounding boxes arranged [1, num_boxes, coords] + where each coordinate is [0, 1) and the coordinates are arranged as + [ymin, xmin, ymax, xmax]. + output_height: The height of the image after preprocessing. + output_width: The width of the image after preprocessing. + num_channels: Integer depth of the image buffer for decoding. + is_training: `True` if we're preprocessing the image for training and + `False` otherwise. + + Returns: + A preprocessed image. + """ + if is_training: + # For training, we want to randomize some of the distortions. + image = _decode_crop_and_flip(image_buffer, bbox, num_channels) + image = _resize_image(image, output_height, output_width) + else: + # For validation, we want to decode, resize, then just crop the middle. + image = tf.image.decode_jpeg(image_buffer, channels=num_channels) + image = _aspect_preserving_resize(image, _RESIZE_MIN) + image = _central_crop(image, output_height, output_width) + + image.set_shape([output_height, output_width, num_channels]) + + return _mean_image_subtraction(image, _CHANNEL_MEANS, num_channels) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_test.py new file mode 100644 index 0000000..5a7ddcd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/imagenet_test.py @@ -0,0 +1,326 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.r1.resnet import imagenet_main +from official.utils.misc import keras_utils +from official.utils.testing import integration + +tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) + +_BATCH_SIZE = 32 +_LABEL_CLASSES = 1001 + + +class BaseTest(tf.test.TestCase): + + _num_validation_images = None + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BaseTest, cls).setUpClass() + imagenet_main.define_imagenet_flags() + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + self._num_validation_images = imagenet_main.NUM_IMAGES['validation'] + imagenet_main.NUM_IMAGES['validation'] = 4 + + def tearDown(self): + super(BaseTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + imagenet_main.NUM_IMAGES['validation'] = self._num_validation_images + + def _tensor_shapes_helper(self, resnet_size, resnet_version, dtype, with_gpu): + """Checks the tensor shapes after each phase of the ResNet model.""" + def reshape(shape): + """Returns the expected dimensions depending on if a GPU is being used.""" + + # If a GPU is used for the test, the shape is returned (already in NCHW + # form). When GPU is not used, the shape is converted to NHWC. + if with_gpu: + return shape + return shape[0], shape[2], shape[3], shape[1] + + graph = tf.Graph() + + with graph.as_default(), self.test_session( + graph=graph, use_gpu=with_gpu, force_gpu=with_gpu): + model = imagenet_main.ImagenetModel( + resnet_size=resnet_size, + data_format='channels_first' if with_gpu else 'channels_last', + resnet_version=resnet_version, + dtype=dtype + ) + inputs = tf.random.uniform([1, 224, 224, 3]) + output = model(inputs, training=True) + + initial_conv = graph.get_tensor_by_name('resnet_model/initial_conv:0') + max_pool = graph.get_tensor_by_name('resnet_model/initial_max_pool:0') + block_layer1 = graph.get_tensor_by_name('resnet_model/block_layer1:0') + block_layer2 = graph.get_tensor_by_name('resnet_model/block_layer2:0') + block_layer3 = graph.get_tensor_by_name('resnet_model/block_layer3:0') + block_layer4 = graph.get_tensor_by_name('resnet_model/block_layer4:0') + reduce_mean = graph.get_tensor_by_name('resnet_model/final_reduce_mean:0') + dense = graph.get_tensor_by_name('resnet_model/final_dense:0') + + self.assertAllEqual(initial_conv.shape, reshape((1, 64, 112, 112))) + self.assertAllEqual(max_pool.shape, reshape((1, 64, 56, 56))) + + # The number of channels after each block depends on whether we're + # using the building_block or the bottleneck_block. + if resnet_size < 50: + self.assertAllEqual(block_layer1.shape, reshape((1, 64, 56, 56))) + self.assertAllEqual(block_layer2.shape, reshape((1, 128, 28, 28))) + self.assertAllEqual(block_layer3.shape, reshape((1, 256, 14, 14))) + self.assertAllEqual(block_layer4.shape, reshape((1, 512, 7, 7))) + self.assertAllEqual(reduce_mean.shape, reshape((1, 512, 1, 1))) + else: + self.assertAllEqual(block_layer1.shape, reshape((1, 256, 56, 56))) + self.assertAllEqual(block_layer2.shape, reshape((1, 512, 28, 28))) + self.assertAllEqual(block_layer3.shape, reshape((1, 1024, 14, 14))) + self.assertAllEqual(block_layer4.shape, reshape((1, 2048, 7, 7))) + self.assertAllEqual(reduce_mean.shape, reshape((1, 2048, 1, 1))) + + self.assertAllEqual(dense.shape, (1, _LABEL_CLASSES)) + self.assertAllEqual(output.shape, (1, _LABEL_CLASSES)) + + def tensor_shapes_helper(self, resnet_size, resnet_version, with_gpu=False): + self._tensor_shapes_helper(resnet_size=resnet_size, + resnet_version=resnet_version, + dtype=tf.float32, with_gpu=with_gpu) + self._tensor_shapes_helper(resnet_size=resnet_size, + resnet_version=resnet_version, + dtype=tf.float16, with_gpu=with_gpu) + + def test_tensor_shapes_resnet_18_v1(self): + self.tensor_shapes_helper(18, resnet_version=1) + + def test_tensor_shapes_resnet_18_v2(self): + self.tensor_shapes_helper(18, resnet_version=2) + + def test_tensor_shapes_resnet_34_v1(self): + self.tensor_shapes_helper(34, resnet_version=1) + + def test_tensor_shapes_resnet_34_v2(self): + self.tensor_shapes_helper(34, resnet_version=2) + + def test_tensor_shapes_resnet_50_v1(self): + self.tensor_shapes_helper(50, resnet_version=1) + + def test_tensor_shapes_resnet_50_v2(self): + self.tensor_shapes_helper(50, resnet_version=2) + + def test_tensor_shapes_resnet_101_v1(self): + self.tensor_shapes_helper(101, resnet_version=1) + + def test_tensor_shapes_resnet_101_v2(self): + self.tensor_shapes_helper(101, resnet_version=2) + + def test_tensor_shapes_resnet_152_v1(self): + self.tensor_shapes_helper(152, resnet_version=1) + + def test_tensor_shapes_resnet_152_v2(self): + self.tensor_shapes_helper(152, resnet_version=2) + + def test_tensor_shapes_resnet_200_v1(self): + self.tensor_shapes_helper(200, resnet_version=1) + + def test_tensor_shapes_resnet_200_v2(self): + self.tensor_shapes_helper(200, resnet_version=2) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_18_with_gpu_v1(self): + self.tensor_shapes_helper(18, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_18_with_gpu_v2(self): + self.tensor_shapes_helper(18, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_34_with_gpu_v1(self): + self.tensor_shapes_helper(34, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_34_with_gpu_v2(self): + self.tensor_shapes_helper(34, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_50_with_gpu_v1(self): + self.tensor_shapes_helper(50, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_50_with_gpu_v2(self): + self.tensor_shapes_helper(50, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_101_with_gpu_v1(self): + self.tensor_shapes_helper(101, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_101_with_gpu_v2(self): + self.tensor_shapes_helper(101, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_152_with_gpu_v1(self): + self.tensor_shapes_helper(152, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_152_with_gpu_v2(self): + self.tensor_shapes_helper(152, resnet_version=2, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_200_with_gpu_v1(self): + self.tensor_shapes_helper(200, resnet_version=1, with_gpu=True) + + @unittest.skipUnless(tf.test.is_built_with_cuda(), 'requires GPU') + def test_tensor_shapes_resnet_200_with_gpu_v2(self): + self.tensor_shapes_helper(200, resnet_version=2, with_gpu=True) + + def resnet_model_fn_helper(self, mode, resnet_version, dtype): + """Tests that the EstimatorSpec is given the appropriate arguments.""" + tf.compat.v1.train.create_global_step() + + input_fn = imagenet_main.get_synth_input_fn(dtype) + dataset = input_fn(True, '', _BATCH_SIZE) + iterator = tf.compat.v1.data.make_initializable_iterator(dataset) + features, labels = iterator.get_next() + spec = imagenet_main.imagenet_model_fn( + features, labels, mode, { + 'dtype': dtype, + 'resnet_size': 50, + 'data_format': 'channels_last', + 'batch_size': _BATCH_SIZE, + 'resnet_version': resnet_version, + 'loss_scale': 128 if dtype == tf.float16 else 1, + 'fine_tune': False, + }) + + predictions = spec.predictions + self.assertAllEqual(predictions['probabilities'].shape, + (_BATCH_SIZE, _LABEL_CLASSES)) + self.assertEqual(predictions['probabilities'].dtype, tf.float32) + self.assertAllEqual(predictions['classes'].shape, (_BATCH_SIZE,)) + self.assertEqual(predictions['classes'].dtype, tf.int64) + + if mode != tf.estimator.ModeKeys.PREDICT: + loss = spec.loss + self.assertAllEqual(loss.shape, ()) + self.assertEqual(loss.dtype, tf.float32) + + if mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = spec.eval_metric_ops + self.assertAllEqual(eval_metric_ops['accuracy'][0].shape, ()) + self.assertAllEqual(eval_metric_ops['accuracy'][1].shape, ()) + self.assertEqual(eval_metric_ops['accuracy'][0].dtype, tf.float32) + self.assertEqual(eval_metric_ops['accuracy'][1].dtype, tf.float32) + + def test_resnet_model_fn_train_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_train_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.TRAIN, resnet_version=2, + dtype=tf.float32) + + def test_resnet_model_fn_eval_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_eval_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.EVAL, resnet_version=2, + dtype=tf.float32) + + def test_resnet_model_fn_predict_mode_v1(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.PREDICT, resnet_version=1, + dtype=tf.float32) + + def test_resnet_model_fn_predict_mode_v2(self): + self.resnet_model_fn_helper(tf.estimator.ModeKeys.PREDICT, resnet_version=2, + dtype=tf.float32) + + def _test_imagenetmodel_shape(self, resnet_version): + batch_size = 135 + num_classes = 246 + + model = imagenet_main.ImagenetModel( + 50, data_format='channels_last', num_classes=num_classes, + resnet_version=resnet_version) + + fake_input = tf.random.uniform([batch_size, 224, 224, 3]) + output = model(fake_input, training=True) + + self.assertAllEqual(output.shape, (batch_size, num_classes)) + + def test_imagenetmodel_shape_v1(self): + self._test_imagenetmodel_shape(resnet_version=1) + + def test_imagenetmodel_shape_v2(self): + self._test_imagenetmodel_shape(resnet_version=2) + + def test_imagenet_end_to_end_synthetic_v1(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v1_tiny(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '-resnet_size', '18', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2_tiny(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '-resnet_size', '18', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v1_huge(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '1', '-batch_size', '4', + '-resnet_size', '200', '--max_train_steps', '1'] + ) + + def test_imagenet_end_to_end_synthetic_v2_huge(self): + integration.run_synthetic( + main=imagenet_main.run_imagenet, tmp_root=self.get_temp_dir(), + extra_flags=['-resnet_version', '2', '-batch_size', '4', + '-resnet_size', '200', '--max_train_steps', '1'] + ) + + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_model.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_model.py new file mode 100644 index 0000000..611c880 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_model.py @@ -0,0 +1,552 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for Residual Networks. + +Residual networks ('v1' ResNets) were originally proposed in: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +The full preactivation 'v2' ResNet variant was introduced by: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The key difference of the full preactivation 'v2' variant compared to the +'v1' variant in [1] is the use of batch normalization before every weight layer +rather than after. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +_BATCH_NORM_DECAY = 0.997 +_BATCH_NORM_EPSILON = 1e-5 +DEFAULT_VERSION = 2 +DEFAULT_DTYPE = tf.float32 +CASTABLE_TYPES = (tf.float16,) +ALLOWED_TYPES = (DEFAULT_DTYPE,) + CASTABLE_TYPES + + +################################################################################ +# Convenience functions for building the ResNet model. +################################################################################ +def batch_norm(inputs, training, data_format): + """Performs a batch normalization using a standard set of parameters.""" + # We set fused=True for a significant performance boost. See + # https://www.tensorflow.org/performance/performance_guide#common_fused_ops + return tf.compat.v1.layers.batch_normalization( + inputs=inputs, axis=1 if data_format == 'channels_first' else 3, + momentum=_BATCH_NORM_DECAY, epsilon=_BATCH_NORM_EPSILON, center=True, + scale=True, training=training, fused=True) + + +def fixed_padding(inputs, kernel_size, data_format): + """Pads the input along the spatial dimensions independently of input size. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + kernel_size: The kernel to be used in the conv2d or max_pool2d operation. + Should be a positive integer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + A tensor with the same format as the input with the data either intact + (if kernel_size == 1) or padded (if kernel_size > 1). + """ + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + + if data_format == 'channels_first': + padded_inputs = tf.pad(tensor=inputs, + paddings=[[0, 0], [0, 0], [pad_beg, pad_end], + [pad_beg, pad_end]]) + else: + padded_inputs = tf.pad(tensor=inputs, + paddings=[[0, 0], [pad_beg, pad_end], + [pad_beg, pad_end], [0, 0]]) + return padded_inputs + + +def conv2d_fixed_padding(inputs, filters, kernel_size, strides, data_format): + """Strided 2-D convolution with explicit padding.""" + # The padding is consistent and is based only on `kernel_size`, not on the + # dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone). + if strides > 1: + inputs = fixed_padding(inputs, kernel_size, data_format) + + return tf.compat.v1.layers.conv2d( + inputs=inputs, filters=filters, kernel_size=kernel_size, strides=strides, + padding=('SAME' if strides == 1 else 'VALID'), use_bias=False, + kernel_initializer=tf.compat.v1.variance_scaling_initializer(), + data_format=data_format) + + +################################################################################ +# ResNet block definitions. +################################################################################ +def _building_block_v1(inputs, filters, training, projection_shortcut, strides, + data_format): + """A single block for ResNet v1, without a bottleneck. + + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + shortcut = batch_norm(inputs=shortcut, training=training, + data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _building_block_v2(inputs, filters, training, projection_shortcut, strides, + data_format): + """A single block for ResNet v2, without a bottleneck. + + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=1, + data_format=data_format) + + return inputs + shortcut + + +def _bottleneck_block_v1(inputs, filters, training, projection_shortcut, + strides, data_format): + """A single block for ResNet v1, with a bottleneck. + + Similar to _building_block_v1(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + shortcut = batch_norm(inputs=shortcut, training=training, + data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format) + inputs = batch_norm(inputs, training, data_format) + inputs += shortcut + inputs = tf.nn.relu(inputs) + + return inputs + + +def _bottleneck_block_v2(inputs, filters, training, projection_shortcut, + strides, data_format): + """A single block for ResNet v2, with a bottleneck. + + Similar to _building_block_v2(), except using the "bottleneck" blocks + described in: + Convolution then batch normalization then ReLU as described by: + Deep Residual Learning for Image Recognition + https://arxiv.org/pdf/1512.03385.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Dec 2015. + + Adapted to the ordering conventions of: + Batch normalization then ReLu then convolution as described by: + Identity Mappings in Deep Residual Networks + https://arxiv.org/pdf/1603.05027.pdf + by Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun, Jul 2016. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the convolutions. + training: A Boolean for whether the model is in training or inference + mode. Needed for batch normalization. + projection_shortcut: The function to use for projection shortcuts + (typically a 1x1 convolution when downsampling the input). + strides: The block's stride. If greater than 1, this block will ultimately + downsample the input. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block; shape should match inputs. + """ + shortcut = inputs + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + + # The projection shortcut should come after the first batch norm and ReLU + # since it performs a 1x1 convolution. + if projection_shortcut is not None: + shortcut = projection_shortcut(inputs) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=1, strides=1, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=filters, kernel_size=3, strides=strides, + data_format=data_format) + + inputs = batch_norm(inputs, training, data_format) + inputs = tf.nn.relu(inputs) + inputs = conv2d_fixed_padding( + inputs=inputs, filters=4 * filters, kernel_size=1, strides=1, + data_format=data_format) + + return inputs + shortcut + + +def block_layer(inputs, filters, bottleneck, block_fn, blocks, strides, + training, name, data_format): + """Creates one layer of blocks for the ResNet model. + + Args: + inputs: A tensor of size [batch, channels, height_in, width_in] or + [batch, height_in, width_in, channels] depending on data_format. + filters: The number of filters for the first convolution of the layer. + bottleneck: Is the block created a bottleneck block. + block_fn: The block to use within the model, either `building_block` or + `bottleneck_block`. + blocks: The number of blocks contained in the layer. + strides: The stride to use for the first convolution of the layer. If + greater than 1, this layer will ultimately downsample the input. + training: Either True or False, whether we are currently training the + model. Needed for batch norm. + name: A string name for the tensor output of the block layer. + data_format: The input format ('channels_last' or 'channels_first'). + + Returns: + The output tensor of the block layer. + """ + + # Bottleneck blocks end with 4x the number of filters as they start with + filters_out = filters * 4 if bottleneck else filters + + def projection_shortcut(inputs): + return conv2d_fixed_padding( + inputs=inputs, filters=filters_out, kernel_size=1, strides=strides, + data_format=data_format) + + # Only the first block per block_layer uses projection_shortcut and strides + inputs = block_fn(inputs, filters, training, projection_shortcut, strides, + data_format) + + for _ in range(1, blocks): + inputs = block_fn(inputs, filters, training, None, 1, data_format) + + return tf.identity(inputs, name) + + +class Model(object): + """Base class for building the Resnet Model.""" + + def __init__(self, resnet_size, bottleneck, num_classes, num_filters, + kernel_size, + conv_stride, first_pool_size, first_pool_stride, + block_sizes, block_strides, + resnet_version=DEFAULT_VERSION, data_format=None, + dtype=DEFAULT_DTYPE): + """Creates a model for classifying an image. + + Args: + resnet_size: A single integer for the size of the ResNet model. + bottleneck: Use regular blocks or bottleneck blocks. + num_classes: The number of classes used as labels. + num_filters: The number of filters to use for the first block layer + of the model. This number is then doubled for each subsequent block + layer. + kernel_size: The kernel size to use for convolution. + conv_stride: stride size for the initial convolutional layer + first_pool_size: Pool size to be used for the first pooling layer. + If none, the first pooling layer is skipped. + first_pool_stride: stride size for the first pooling layer. Not used + if first_pool_size is None. + block_sizes: A list containing n values, where n is the number of sets of + block layers desired. Each value should be the number of blocks in the + i-th set. + block_strides: List of integers representing the desired stride size for + each of the sets of block layers. Should be same length as block_sizes. + resnet_version: Integer representing which version of the ResNet network + to use. See README for details. Valid values: [1, 2] + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + dtype: The TensorFlow dtype to use for calculations. If not specified + tf.float32 is used. + + Raises: + ValueError: if invalid version is selected. + """ + self.resnet_size = resnet_size + + if not data_format: + data_format = ( + 'channels_first' if tf.test.is_built_with_cuda() else 'channels_last') + + self.resnet_version = resnet_version + if resnet_version not in (1, 2): + raise ValueError( + 'Resnet version should be 1 or 2. See README for citations.') + + self.bottleneck = bottleneck + if bottleneck: + if resnet_version == 1: + self.block_fn = _bottleneck_block_v1 + else: + self.block_fn = _bottleneck_block_v2 + else: + if resnet_version == 1: + self.block_fn = _building_block_v1 + else: + self.block_fn = _building_block_v2 + + if dtype not in ALLOWED_TYPES: + raise ValueError('dtype must be one of: {}'.format(ALLOWED_TYPES)) + + self.data_format = data_format + self.num_classes = num_classes + self.num_filters = num_filters + self.kernel_size = kernel_size + self.conv_stride = conv_stride + self.first_pool_size = first_pool_size + self.first_pool_stride = first_pool_stride + self.block_sizes = block_sizes + self.block_strides = block_strides + self.dtype = dtype + self.pre_activation = resnet_version == 2 + + def _custom_dtype_getter(self, getter, name, shape=None, dtype=DEFAULT_DTYPE, + *args, **kwargs): + """Creates variables in fp32, then casts to fp16 if necessary. + + This function is a custom getter. A custom getter is a function with the + same signature as tf.get_variable, except it has an additional getter + parameter. Custom getters can be passed as the `custom_getter` parameter of + tf.variable_scope. Then, tf.get_variable will call the custom getter, + instead of directly getting a variable itself. This can be used to change + the types of variables that are retrieved with tf.get_variable. + The `getter` parameter is the underlying variable getter, that would have + been called if no custom getter was used. Custom getters typically get a + variable with `getter`, then modify it in some way. + + This custom getter will create an fp32 variable. If a low precision + (e.g. float16) variable was requested it will then cast the variable to the + requested dtype. The reason we do not directly create variables in low + precision dtypes is that applying small gradients to such variables may + cause the variable not to change. + + Args: + getter: The underlying variable getter, that has the same signature as + tf.get_variable and returns a variable. + name: The name of the variable to get. + shape: The shape of the variable to get. + dtype: The dtype of the variable to get. Note that if this is a low + precision dtype, the variable will be created as a tf.float32 variable, + then cast to the appropriate dtype + *args: Additional arguments to pass unmodified to getter. + **kwargs: Additional keyword arguments to pass unmodified to getter. + + Returns: + A variable which is cast to fp16 if necessary. + """ + + if dtype in CASTABLE_TYPES: + var = getter(name, shape, tf.float32, *args, **kwargs) + return tf.cast(var, dtype=dtype, name=name + '_cast') + else: + return getter(name, shape, dtype, *args, **kwargs) + + def _model_variable_scope(self): + """Returns a variable scope that the model should be created under. + + If self.dtype is a castable type, model variable will be created in fp32 + then cast to self.dtype before being used. + + Returns: + A variable scope for the model. + """ + + return tf.compat.v1.variable_scope('resnet_model', + custom_getter=self._custom_dtype_getter) + + def __call__(self, inputs, training): + """Add operations to classify a batch of input images. + + Args: + inputs: A Tensor representing a batch of input images. + training: A boolean. Set to True to add operations required only when + training the classifier. + + Returns: + A logits Tensor with shape [, self.num_classes]. + """ + + with self._model_variable_scope(): + if self.data_format == 'channels_first': + # Convert the inputs from channels_last (NHWC) to channels_first (NCHW). + # This provides a large performance boost on GPU. See + # https://www.tensorflow.org/performance/performance_guide#data_formats + inputs = tf.transpose(a=inputs, perm=[0, 3, 1, 2]) + + inputs = conv2d_fixed_padding( + inputs=inputs, filters=self.num_filters, kernel_size=self.kernel_size, + strides=self.conv_stride, data_format=self.data_format) + inputs = tf.identity(inputs, 'initial_conv') + + # We do not include batch normalization or activation functions in V2 + # for the initial conv1 because the first ResNet unit will perform these + # for both the shortcut and non-shortcut paths as part of the first + # block's projection. Cf. Appendix of [2]. + if self.resnet_version == 1: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + if self.first_pool_size: + ############## npu modify begin ############# + #max_pooling2d is replaced by max_pool_with_argmax for better performance + inputs,argmax = tf.compat.v1.nn.max_pool_with_argmax( + input=inputs, ksize=(1,self.first_pool_size,self.first_pool_size,1), + strides=(1,self.first_pool_stride,self.first_pool_stride,1), padding='SAME', + data_format='NCHW' if self.data_format == 'channels_first' else 'NHWC') + ############## npu modify end ############### + + inputs = tf.identity(inputs, 'initial_max_pool') + + for i, num_blocks in enumerate(self.block_sizes): + num_filters = self.num_filters * (2**i) + inputs = block_layer( + inputs=inputs, filters=num_filters, bottleneck=self.bottleneck, + block_fn=self.block_fn, blocks=num_blocks, + strides=self.block_strides[i], training=training, + name='block_layer{}'.format(i + 1), data_format=self.data_format) + + # Only apply the BN and ReLU for model that does pre_activation in each + # building/bottleneck block, eg resnet V2. + if self.pre_activation: + inputs = batch_norm(inputs, training, self.data_format) + inputs = tf.nn.relu(inputs) + + # The current top layer has shape + # `batch_size x pool_size x pool_size x final_size`. + # ResNet does an Average Pooling layer over pool_size, + # but that is the same as doing a reduce_mean. We do a reduce_mean + # here because it performs better than AveragePooling2D. + axes = [2, 3] if self.data_format == 'channels_first' else [1, 2] + inputs = tf.reduce_mean(input_tensor=inputs, axis=axes, keepdims=True) + inputs = tf.identity(inputs, 'final_reduce_mean') + + inputs = tf.squeeze(inputs, axes) + inputs = tf.compat.v1.layers.dense(inputs=inputs, units=self.num_classes) + inputs = tf.identity(inputs, 'final_dense') + return inputs diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop.py new file mode 100644 index 0000000..9af2a34 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop.py @@ -0,0 +1,979 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains utility and supporting functions for ResNet. + + This module contains ResNet code which does not directly build layers. This +includes dataset management, hyperparameter and optimizer code, and argument +parsing. Code for defining the ResNet layers can be found in resnet_model.py. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import math +import multiprocessing +import os +import datetime + +import time +from absl import flags +import tensorflow as tf + +import logging +import sys + + +############## npu modify begin ############# +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator import npu_ops +from npu_bridge.hccl import hccl_ops +from hccl.manage.api import get_local_rank_id +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +from tensorflow.core.protobuf import rewriter_config_pb2 +############## npu modify end ############### + +from official.r1.resnet import imagenet_preprocessing +from official.r1.resnet import resnet_model +from official.r1.utils import export +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers +from benchmark_log import hwlog + + +################################################################################ +# Functions for input processing. +################################################################################ +def process_record_dataset(dataset, + is_training, + batch_size, + shuffle_buffer, + parse_record_fn, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + drop_remainder=False, + tf_data_experimental_slack=False): + """Given a Dataset with raw records, return an iterator over the records. + + Args: + dataset: A Dataset representing raw records + is_training: A boolean denoting whether the input is for training. + batch_size: The number of samples per batch. + shuffle_buffer: The buffer size to use when shuffling records. A larger + value results in better randomness, but smaller values reduce startup + time and use less memory. + parse_record_fn: A function that takes a raw record and returns the + corresponding (image, label) pair. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features. + datasets_num_private_threads: Number of threads for a private + threadpool created for all datasets computation. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + Dataset of (image, label) pairs ready for iteration. + """ + # Defines a specific size thread pool for tf.data operations. + if datasets_num_private_threads: + options = tf.data.Options() + options.experimental_threading.private_threadpool_size = ( + datasets_num_private_threads) + dataset = dataset.with_options(options) + tf.compat.v1.logging.info('datasets_num_private_threads: %s', + datasets_num_private_threads) + + # Disable intra-op parallelism to optimize for throughput instead of latency. + options = tf.data.Options() + options.experimental_threading.max_intra_op_parallelism = 1 + dataset = dataset.with_options(options) + + # Prefetches a batch at a time to smooth out the time taken to load input + # files for shuffling and processing. + dataset = dataset.prefetch(buffer_size=batch_size) + if is_training: + # Shuffles records before repeating to respect epoch boundaries. + dataset = dataset.shuffle(buffer_size=shuffle_buffer) + + # Repeats the dataset for the number of epochs to train. + #dataset = dataset.repeat(num_epochs) + dataset = dataset.repeat() + # Parses the raw records into images and labels. + dataset = dataset.map( + lambda value: parse_record_fn(value, is_training, dtype), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) + + # Operations between the final prefetch and the get_next call to the iterator + # will happen synchronously during run time. We prefetch here again to + # background all of the above processing work and keep it out of the + # critical training path. Setting buffer_size to tf.data.experimental.AUTOTUNE + # allows DistributionStrategies to adjust how many batches to fetch based + # on how many devices are present. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + + if tf_data_experimental_slack: + options = tf.data.Options() + options.experimental_slack = True + dataset = dataset.with_options(options) + + return dataset + + +def get_synth_input_fn(height, width, num_channels, num_classes, + dtype=tf.float32): + """Returns an input function that returns a dataset with random data. + + This input_fn returns a data set that iterates over a set of random data and + bypasses all preprocessing, e.g. jpeg decode and copy. The host to device + copy is still included. This used to find the upper throughput bound when + tunning the full input pipeline. + + Args: + height: Integer height that will be used to create a fake image tensor. + width: Integer width that will be used to create a fake image tensor. + num_channels: Integer depth that will be used to create a fake image tensor. + num_classes: Number of classes that should be represented in the fake labels + tensor + dtype: Data type for features/images. + + Returns: + An input_fn that can be used in place of a real one to return a dataset + that can be used for iteration. + """ + # pylint: disable=unused-argument + def input_fn(is_training, data_dir, batch_size, *args, **kwargs): + """Returns dataset filled with random data.""" + # Synthetic input should be within [0, 255]. + inputs = tf.random.truncated_normal( + [batch_size] + [height, width, num_channels], + dtype=dtype, + mean=127, + stddev=60, + name='synthetic_inputs') + + labels = tf.random.uniform( + [batch_size], + minval=0, + maxval=num_classes - 1, + dtype=tf.int32, + name='synthetic_labels') + data = tf.data.Dataset.from_tensors((inputs, labels)).repeat() + data = data.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return data + + return input_fn + + +def image_bytes_serving_input_fn(image_shape, dtype=tf.float32): + """Serving input fn for raw jpeg images.""" + + def _preprocess_image(image_bytes): + """Preprocess a single raw image.""" + # Bounding box around the whole image. + bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=dtype, shape=[1, 1, 4]) + height, width, num_channels = image_shape + image = imagenet_preprocessing.preprocess_image( + image_bytes, bbox, height, width, num_channels, is_training=False) + return image + + image_bytes_list = tf.compat.v1.placeholder( + shape=[None], dtype=tf.string, name='input_tensor') + images = tf.map_fn( + _preprocess_image, image_bytes_list, back_prop=False, dtype=dtype) + return tf.estimator.export.TensorServingInputReceiver( + images, {'image_bytes': image_bytes_list}) + + +def override_flags_and_set_envars_for_gpu_thread_pool(flags_obj): + """Override flags and set env_vars for performance. + + These settings exist to test the difference between using stock settings + and manual tuning. It also shows some of the ENV_VARS that can be tweaked to + squeeze a few extra examples per second. These settings are defaulted to the + current platform of interest, which changes over time. + + On systems with small numbers of cpu cores, e.g. under 8 logical cores, + setting up a gpu thread pool with `tf_gpu_thread_mode=gpu_private` may perform + poorly. + + Args: + flags_obj: Current flags, which will be adjusted possibly overriding + what has been set by the user on the command-line. + """ + cpu_count = multiprocessing.cpu_count() + tf.compat.v1.logging.info('Logical CPU cores: %s', cpu_count) + + # Sets up thread pool for each GPU for op scheduling. + per_gpu_thread_count = 1 + total_gpu_thread_count = per_gpu_thread_count * flags_obj.num_gpus + os.environ['TF_GPU_THREAD_MODE'] = flags_obj.tf_gpu_thread_mode + os.environ['TF_GPU_THREAD_COUNT'] = str(per_gpu_thread_count) + tf.compat.v1.logging.info('TF_GPU_THREAD_COUNT: %s', + os.environ['TF_GPU_THREAD_COUNT']) + tf.compat.v1.logging.info('TF_GPU_THREAD_MODE: %s', + os.environ['TF_GPU_THREAD_MODE']) + + # Reduces general thread pool by number of threads used for GPU pool. + main_thread_count = cpu_count - total_gpu_thread_count + flags_obj.inter_op_parallelism_threads = main_thread_count + + # Sets thread count for tf.data. Logical cores minus threads assign to the + # private GPU pool along with 2 thread per GPU for event monitoring and + # sending / receiving tensors. + num_monitoring_threads = 2 * flags_obj.num_gpus + flags_obj.datasets_num_private_threads = (cpu_count - total_gpu_thread_count + - num_monitoring_threads) + + +################################################################################ +# Functions for running training/eval/validation loops for the model. +################################################################################ +def learning_rate_with_decay( + batch_size, batch_denom, num_images, boundary_epochs, decay_rates, + base_lr=0.1, warmup=False): + """Get a learning rate that decays step-wise as training progresses. + + Args: + batch_size: the number of examples processed in each training batch. + batch_denom: this value will be used to scale the base learning rate. + `0.1 * batch size` is divided by this number, such that when + batch_denom == batch_size, the initial learning rate will be 0.1. + num_images: total number of images that will be used for training. + boundary_epochs: list of ints representing the epochs at which we + decay the learning rate. + decay_rates: list of floats representing the decay rates to be used + for scaling the learning rate. It should have one more element + than `boundary_epochs`, and all elements should have the same type. + base_lr: Initial learning rate scaled based on batch_denom. + warmup: Run a 5 epoch warmup to the initial lr. + Returns: + Returns a function that takes a single argument - the number of batches + trained so far (global_step)- and returns the learning rate to be used + for training the next batch. + """ + initial_learning_rate = base_lr * batch_size / batch_denom + batches_per_epoch = num_images / batch_size + + # Reduce the learning rate at certain epochs. + # CIFAR-10: divide by 10 at epoch 100, 150, and 200 + # ImageNet: divide by 10 at epoch 30, 60, 80, and 90 + boundaries = [int(batches_per_epoch * epoch) for epoch in boundary_epochs] + vals = [initial_learning_rate * decay for decay in decay_rates] + + def learning_rate_fn(global_step): + """Builds scaled learning rate function with 5 epoch warm up.""" + + ############## npu modify begin ############# + #Using int32 for better computing performance + global_step=tf.cast(global_step,tf.int32) + ############## npu modify end ############### + + lr = tf.compat.v1.train.piecewise_constant(global_step, boundaries, vals) + if warmup: + warmup_steps = int(batches_per_epoch * 5) + warmup_lr = ( + initial_learning_rate * tf.cast(global_step, tf.float32) / tf.cast( + warmup_steps, tf.float32)) + return tf.cond(pred=global_step < warmup_steps, + true_fn=lambda: warmup_lr, + false_fn=lambda: lr) + return lr + + def poly_rate_fn(global_step): + """Handles linear scaling rule, gradual warmup, and LR decay. + + The learning rate starts at 0, then it increases linearly per step. After + FLAGS.poly_warmup_epochs, we reach the base learning rate (scaled to account + for batch size). The learning rate is then decayed using a polynomial rate + decay schedule with power 2.0. + + Args: + global_step: the current global_step + + Returns: + returns the current learning rate + """ + + # Learning rate schedule for LARS polynomial schedule + if flags.FLAGS.batch_size < 8192: + plr = 5.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 16384: + plr = 10.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 32768: + plr = 25.0 + w_epochs = 5 + else: + plr = 32.0 + w_epochs = 14 + + w_steps = int(w_epochs * batches_per_epoch) + wrate = (plr * tf.cast(global_step, tf.float32) / tf.cast( + w_steps, tf.float32)) + + # TODO(pkanwar): use a flag to help calc num_epochs. + num_epochs = 90 + train_steps = batches_per_epoch * num_epochs + + min_step = tf.constant(1, dtype=tf.int64) + decay_steps = tf.maximum(min_step, tf.subtract(global_step, w_steps)) + poly_rate = tf.train.polynomial_decay( + plr, + decay_steps, + train_steps - w_steps + 1, + power=2.0) + return tf.where(global_step <= w_steps, wrate, poly_rate) + + # For LARS we have a new learning rate schedule + if flags.FLAGS.enable_lars: + return poly_rate_fn + + return learning_rate_fn + + +def resnet_model_fn(features, labels, mode, model_class, + resnet_size, weight_decay, learning_rate_fn, momentum, + data_format, resnet_version, loss_scale, + loss_filter_fn=None, dtype=resnet_model.DEFAULT_DTYPE, + fine_tune=False, label_smoothing=0.0): + """Shared functionality for different resnet model_fns. + + Initializes the ResnetModel representing the model layers + and uses that model to build the necessary EstimatorSpecs for + the `mode` in question. For training, this means building losses, + the optimizer, and the train op that get passed into the EstimatorSpec. + For evaluation and prediction, the EstimatorSpec is returned without + a train op, but with the necessary parameters for the given mode. + + Args: + features: tensor representing input images + labels: tensor representing class labels for all input images + mode: current estimator mode; should be one of + `tf.estimator.ModeKeys.TRAIN`, `EVALUATE`, `PREDICT` + model_class: a class representing a TensorFlow model that has a __call__ + function. We assume here that this is a subclass of ResnetModel. + resnet_size: A single integer for the size of the ResNet model. + weight_decay: weight decay loss rate used to regularize learned variables. + learning_rate_fn: function that returns the current learning rate given + the current global_step + momentum: momentum term used for optimization + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + resnet_version: Integer representing which version of the ResNet network to + use. See README for details. Valid values: [1, 2] + loss_scale: The factor to scale the loss for numerical stability. A detailed + summary is present in the arg parser help text. + loss_filter_fn: function that takes a string variable name and returns + True if the var should be included in loss calculation, and False + otherwise. If None, batch_normalization variables will be excluded + from the loss. + dtype: the TensorFlow dtype to use for calculations. + fine_tune: If True only train the dense layers(final layers). + label_smoothing: If greater than 0 then smooth the labels. + + Returns: + EstimatorSpec parameterized according to the input params and the + current mode. + """ + + # Generate a summary node for the images + tf.compat.v1.summary.image('images', features, max_outputs=6) + + ############## npu modify begin ############# + # Checks that features/images have same data type being used for calculations. + if features.dtype != dtype: + features=tf.cast(features,dtype) + ############## npu modify end ############### + + model = model_class(resnet_size, data_format, resnet_version=resnet_version, + dtype=dtype) + + logits = model(features, mode == tf.estimator.ModeKeys.TRAIN) + + # This acts as a no-op if the logits are already in fp32 (provided logits are + # not a SparseTensor). If dtype is is low precision, logits must be cast to + # fp32 for numerical stability. + logits = tf.cast(logits, tf.float32) + + predictions = { + 'classes': tf.argmax(input=logits, axis=1), + 'probabilities': tf.nn.softmax(logits, name='softmax_tensor') + } + + if mode == tf.estimator.ModeKeys.PREDICT: + # Return the predictions and the specification for serving a SavedModel + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + export_outputs={ + 'predict': tf.estimator.export.PredictOutput(predictions) + }) + + # Calculate loss, which includes softmax cross entropy and L2 regularization. + if label_smoothing != 0.0: + one_hot_labels = tf.one_hot(labels, 1001) + cross_entropy = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=one_hot_labels, + label_smoothing=label_smoothing) + else: + cross_entropy = tf.compat.v1.losses.sparse_softmax_cross_entropy( + logits=logits, labels=labels) + + # Create a tensor named cross_entropy for logging purposes. + tf.identity(cross_entropy, name='cross_entropy') + tf.compat.v1.summary.scalar('cross_entropy', cross_entropy) + + # If no loss_filter_fn is passed, assume we want the default behavior, + # which is that batch_normalization variables are excluded from loss. + def exclude_batch_norm(name): + return 'batch_normalization' not in name + loss_filter_fn = loss_filter_fn or exclude_batch_norm + + # Add weight decay to the loss. + l2_loss = weight_decay * tf.add_n( + # loss is computed using fp32 for numerical stability. + [ + tf.nn.l2_loss(tf.cast(v, tf.float32)) + for v in tf.compat.v1.trainable_variables() + if loss_filter_fn(v.name) + ]) + tf.compat.v1.summary.scalar('l2_loss', l2_loss) + loss = cross_entropy + l2_loss + + if mode == tf.estimator.ModeKeys.TRAIN: + global_step = tf.compat.v1.train.get_or_create_global_step() + + learning_rate = learning_rate_fn(global_step) + + # Create a tensor named learning_rate for logging purposes + tf.identity(learning_rate, name='learning_rate') + tf.compat.v1.summary.scalar('learning_rate', learning_rate) + + if flags.FLAGS.enable_lars: + from tensorflow.contrib import opt as contrib_opt # pylint: disable=g-import-not-at-top + optimizer = contrib_opt.LARSOptimizer( + learning_rate, + momentum=momentum, + weight_decay=weight_decay, + skip_list=['batch_normalization', 'bias']) + else: + optimizer = tf.compat.v1.train.MomentumOptimizer( + learning_rate=learning_rate, + momentum=momentum + ) + + ############## npu modify begin ############# + optimizer = NPUDistributedOptimizer(optimizer) + ############## npu modify end ############### + + fp16_implementation = getattr(flags.FLAGS, 'fp16_implementation', None) + if fp16_implementation == 'graph_rewrite': + optimizer = ( + tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer, loss_scale=loss_scale)) + + def _dense_grad_filter(gvs): + """Only apply gradient updates to the final layer. + + This function is used for fine tuning. + + Args: + gvs: list of tuples with gradients and variable info + Returns: + filtered gradients so that only the dense layer remains + """ + return [(g, v) for g, v in gvs if 'dense' in v.name] + #loss_scale = 512 + if loss_scale != 1 and fp16_implementation != 'graph_rewrite': + # When computing fp16 gradients, often intermediate tensor values are + # so small, they underflow to 0. To avoid this, we multiply the loss by + # loss_scale to make these tensor values loss_scale times bigger. + scaled_grad_vars = optimizer.compute_gradients(loss * loss_scale) + print(">>>>>>>>>>>>>>>>>>>") + print(loss_scale) + print("<<<<<<<<<<<<<<<<<<") + if fine_tune: + scaled_grad_vars = _dense_grad_filter(scaled_grad_vars) + + # Once the gradient computation is complete we can scale the gradients + # back to the correct scale before passing them to the optimizer. + unscaled_grad_vars = [(grad / loss_scale, var) + for grad, var in scaled_grad_vars] + minimize_op = optimizer.apply_gradients(unscaled_grad_vars, global_step) + else: + grad_vars = optimizer.compute_gradients(loss) + if fine_tune: + grad_vars = _dense_grad_filter(grad_vars) + minimize_op = optimizer.apply_gradients(grad_vars, global_step) + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + train_op = tf.group(minimize_op, update_ops) + else: + train_op = None + + ############## npu modify begin ############# + #Using float32 for better performance + accuracy = tf.compat.v1.metrics.accuracy(tf.cast(labels,tf.float32), predictions['classes']) + ############## npu modify end ############### + + accuracy_top_5 = tf.compat.v1.metrics.mean( + tf.nn.in_top_k(predictions=logits, targets=labels, k=5, name='top_5_op')) + + ############## npu modify begin ############# + #Using for 8P + rank_size = int(os.getenv('RANK_SIZE')) + newaccuracy = (hccl_ops.allreduce(accuracy[0], "sum") / rank_size, accuracy[1]) + newaccuracy_top_5 = (hccl_ops.allreduce(accuracy_top_5[0], "sum") / rank_size, accuracy_top_5[1]) + ############## npu modify begin ############# + + metrics = {'accuracy': newaccuracy, + 'accuracy_top_5': newaccuracy_top_5} + + # Create a tensor named train_accuracy for logging purposes + tf.identity(accuracy[1], name='train_accuracy') + tf.identity(accuracy_top_5[1], name='train_accuracy_top_5') + tf.compat.v1.summary.scalar('train_accuracy', accuracy[1]) + tf.compat.v1.summary.scalar('train_accuracy_top_5', accuracy_top_5[1]) + + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + loss=loss, + train_op=train_op, + eval_metric_ops=metrics) + +############## npu modify begin ############# +def init_npu(): + """Initialize npu manually. + Returns: + `init_sess` npu init session config. + `npu_init` npu init ops. + """ + npu_init = npu_ops.initialize_system() + config = tf.ConfigProto() + + #npu mix precision attribute set to true when using mix precision + config.graph_options.rewrite_options.remapping = rewriter_config_pb2.RewriterConfig.OFF + custom_op = config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + #custom_op.parameter_map["precision_mode"].b = True + custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision") + custom_op.parameter_map["use_off_line"].b = True + + init_sess = tf.Session(config=config) + print("this is init sess config ------------- ",config) + print("this is npu_init ------------- ", npu_init) + # i=1 + # while(1): + # i+=1 + return init_sess,npu_init +############## npu modify end ############### + +def resnet_main( + flags_obj, model_function, input_function, dataset_name, num_images, shape=None): + """Shared main loop for ResNet Models. + + Args: + flags_obj: An object containing parsed flags. See define_resnet_flags() + for details. + model_function: the function that instantiates the Model and builds the + ops for train/eval. This will be passed directly into the estimator. + input_function: the function that processes the dataset and returns a + dataset that the estimator can train on. This will be wrapped with + all the relevant flags for running and passed to estimator. + dataset_name: the name of the dataset for training and evaluation. This is + used for logging purpose. + shape: list of ints representing the shape of the images used for training. + This is only used if flags_obj.export_dir is passed. + + Returns: + Dict of results of the run. Contains the keys `eval_results` and + `train_hooks`. `eval_results` contains accuracy (top_1) and accuracy_top_5. + `train_hooks` is a list the instances of hooks used during training. + """ + # Set other logger configurations + # work_num="work " + str(os.environ.get("DEVICE_INDEX")) + # hwlog.config( + # default_namespace=work_num, + # default_stack_offset=1, + # default_clear_line=False, + # root_dir=os.path.normpath( + # os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", ".."))) + + # global logger1 + # logger1 = get_logger('rizhi', log_file1) + + # print("work_num is ", work_num) + # exit() + model_helpers.apply_clean(flags.FLAGS) + + # Ensures flag override logic is only executed if explicitly triggered. + if flags_obj.tf_gpu_thread_mode: + override_flags_and_set_envars_for_gpu_thread_pool(flags_obj) + + # Configures cluster spec for distribution strategy. + num_workers = distribution_utils.configure_cluster(flags_obj.worker_hosts, + flags_obj.task_index) + + # Creates session config. allow_soft_placement = True, is required for + # multi-GPU and is not harmful for other modes. + session_config = tf.compat.v1.ConfigProto( + inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads, + intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads, + allow_soft_placement=True) + + distribution_strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_core.get_num_gpus(flags_obj), + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs) + + ############## npu modify begin ############# + # Creates a `NPURunConfig` that checkpoints every 115200 steps + run_config = NPURunConfig( + model_dir=flags_obj.model_dir, + session_config=session_config, + keep_checkpoint_max=5, + save_summary_steps=0, + #save_checkpoints_steps=115200, + save_checkpoints_steps=flags_obj.save_checkpoints_steps, + enable_data_pre_proc=True, + #iterations_per_loop=100, + iterations_per_loop=flags_obj.iterations_per_loop, + #enable_auto_mix_precision=True, + precision_mode='allow_mix_precision', + hcom_parallel=True + ) + ############## npu modify end ############### + + # Initializes model with all but the dense layer from pretrained ResNet. + if flags_obj.pretrained_model_checkpoint_path is not None: + warm_start_settings = tf.estimator.WarmStartSettings( + flags_obj.pretrained_model_checkpoint_path, + vars_to_warm_start='^(?!.*dense)') + else: + warm_start_settings = None + + ############## npu modify begin ############# + # Creates a `NPUEstimator` instead of using tf.estimator.Estimator + classifier = NPUEstimator( + model_fn=model_function, model_dir=flags_obj.model_dir, config=run_config, + params={ + 'resnet_size': int(flags_obj.resnet_size), + 'data_format': flags_obj.data_format, + 'batch_size': flags_obj.batch_size, + 'resnet_version': int(flags_obj.resnet_version), + 'loss_scale': flags_core.get_loss_scale(flags_obj, + default_for_fp16=128), + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'fine_tune': flags_obj.fine_tune, + 'num_workers': num_workers, + 'num_gpus' : flags_core.get_num_gpus(flags_obj), + }) + ############## npu modify end ############### + + run_params = { + 'batch_size': flags_obj.batch_size, + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'resnet_size': flags_obj.resnet_size, + 'resnet_version': flags_obj.resnet_version, + 'synthetic_data': flags_obj.use_synthetic_data, + 'train_epochs': flags_obj.train_epochs, + 'num_workers': num_workers, + } + if flags_obj.use_synthetic_data: + dataset_name = dataset_name + '-synthetic' + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info('resnet', dataset_name, run_params, + test_id=flags_obj.benchmark_test_id) + + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, + model_dir=flags_obj.model_dir, + batch_size=flags_obj.batch_size) + + def input_fn_train(num_epochs, input_context=None): + ############## npu modify begin ############# + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + # batch_size means single card batch instead of global batch size + return input_function( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=num_epochs, + dtype=tf.float16, + input_context=input_context, + drop_remainder=True) + + def input_fn_eval(): + # batch_size means single card batch instead of global batch size + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + return input_function( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=1, + dtype=tf.float16, + input_context=True, + drop_remainder=True) + ############## npu modify end ############### + + train_epochs = (0 if flags_obj.eval_only or not flags_obj.train_epochs else + flags_obj.train_epochs) + + use_train_and_evaluate = flags_obj.use_train_and_evaluate or num_workers > 1 + + ############## npu_kai modify end ############### + # init_sess, npu_init = init_npu() + # npu_shutdown = npu_ops.shutdown_system() + ############## npu_kai modify end ############### + + if use_train_and_evaluate: + train_spec = tf.estimator.TrainSpec( + input_fn=lambda input_context=None: input_fn_train( + train_epochs, input_context=input_context), + hooks=train_hooks, + max_steps=flags_obj.max_train_steps) + eval_spec = tf.estimator.EvalSpec(input_fn=input_fn_eval) + tf.compat.v1.logging.info('Starting to train and evaluate.') + tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec) + # tf.estimator.train_and_evalute doesn't return anything in multi-worker + # case. + eval_results = {} + else: + if train_epochs == 0: + # If --eval_only is set, perform a single loop with zero train epochs. + schedule, n_loops = [0], 1 + else: + # Compute the number of times to loop while training. All but the last + # pass will train for `epochs_between_evals` epochs, while the last will + # train for the number needed to reach `training_epochs`. For instance if + # train_epochs = 25 and epochs_between_evals = 10 + # schedule will be set to [10, 10, 5]. That is to say, the loop will: + # Train for 10 epochs and then evaluate. + # Train for another 10 epochs and then evaluate. + # Train for a final 5 epochs (to reach 25 epochs) and then evaluate. + n_loops = math.ceil(train_epochs / flags_obj.epochs_between_evals) + schedule = [flags_obj.epochs_between_evals for _ in range(int(n_loops))] + schedule[-1] = train_epochs - sum(schedule[:-1]) # over counting. + + current_max_steps = 0 + ############## npu modify begin ############# + #if flags_obj.max_train_steps is None: + # flags_obj.max_train_steps = (num_images['train']/flags_obj.batch_size)/flags_core.get_num_gpus(flags_obj) + # max_eval_steps = num_images['validation']/flags_obj.batch_size + # else: + # max_eval_steps = flags_obj.max_train_steps + # for cycle_index, num_train_epochs in enumerate(schedule): + # print(cycle_index) + # print(num_train_epochs) + ############## npu modify end ############# + for cycle_index, num_train_epochs in enumerate(schedule): + tf.compat.v1.logging.info('Starting cycle: %d/%d', cycle_index, + int(n_loops)) + ############## npu modify begin ############# + if flags_obj.max_train_steps is None: + current_max_steps += ( + num_images['train'] / flags_obj.batch_size) * num_train_epochs / flags_core.get_num_gpus( + flags_obj) + else: + current_max_steps += flags_obj.max_train_steps + ############## npu modify end ############# + + # add zwx5326390训练开始 + # hwlogger.event(key=hwlog.constants.GLOBAL_BATCH_SIZE, value=flags_obj.batch_size) + #work_num, root_dir, datatime, resnet_logger = hwlog.env(log_file1) + #date_time = hwlog.get_time() + #resnet_logger.info("namespace: %s,time_ts: %s, global_batch_size: %d, num_train_epochs: %d" %(\ + #work_num, date_time, flags_obj.batch_size, num_train_epochs)) + #remark_logger.info("ABK time_ts: %s, current_epoch: %d, batch_size: %d, file: %s, lineno: %s" % (date_time, + # num_train_epochs, flags_obj.batch_size,file_name, sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=num_train_epochs) + + if num_train_epochs: + # Since we are calling classifier.train immediately in each loop, the + # value of num_train_epochs in the lambda function will not be changed + # before it is used. So it is safe to ignore the pylint error here + # pylint: disable=cell-var-from-loop + # hwlogger.start(key=hwlog.constants.EPOCH_START) + + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([86,160]) + classifier.train( + input_fn=lambda input_context=True: input_fn_train( + num_train_epochs, input_context=input_context), + hooks=train_hooks, + max_steps=current_max_steps) + + # hwlogger.end(key=hwlog.constants.EPOCH_STOP) + ############## npu modify begin ############# + # npu resorce will be destoryed When the training is over + # Reinitialize is needed if using hccl interface before next process + init_sess,npu_init=init_npu() + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + init_sess.run(npu_init) + ############## npu modify end ############### + + # flags_obj.max_train_steps is generally associated with testing and + # profiling. As a result it is frequently called with synthetic data, + # which will iterate forever. Passing steps=flags_obj.max_train_steps + # allows the eval (which is generally unimportant in those circumstances) + # to terminate. Note that eval will run for max_train_steps each loop, + # regardless of the global_step count. + tf.compat.v1.logging.info('Starting to evaluate.') + eval_results = classifier.evaluate(input_fn=input_fn_eval, + steps=num_images['validation']/flags_obj.batch_size) + benchmark_logger.log_evaluation_result(eval_results) + + #date_time = hwlog.get_time() + #remark_logger.info("ABK time_ts: %s, accuracy: %f, accuracy_top_5: %f, file: %s, lineno: %s" % (date_time, + # float(eval_results.get("accuracy")),float(eval_results.get("accuracy_top_5")), file_name,sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_results.get("accuracy"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_results.get("accuracy_top_5"))) + if model_helpers.past_stop_threshold( + flags_obj.stop_threshold, eval_results['accuracy']): + break + + ############## npu modify begin ############# + # npu resorce will be destoryed when evaluate finish + # Reinitialize is needed before using hccl interface + if cycle_index < n_loops-1: + init_sess,npu_init=init_npu() + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + #from hccl.split.api import set_split_strategy_by_idx + # set_split_strategy_by_idx([86,160]) + init_sess.run(npu_init) + ############## npu modify end ############### + + if flags_obj.export_dir is not None: + # Exports a saved model for the given classifier. + export_dtype = flags_core.get_tf_dtype(flags_obj) + if flags_obj.image_bytes_as_serving_input: + input_receiver_fn = functools.partial( + image_bytes_serving_input_fn, shape, dtype=export_dtype) + else: + input_receiver_fn = export.build_tensor_serving_input_receiver_fn( + shape, batch_size=flags_obj.batch_size, dtype=export_dtype) + classifier.export_savedmodel(flags_obj.export_dir, input_receiver_fn, + strip_default_attrs=True) + + ############## npu modify begin ############# + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + ############## npu modify end ############### + + stats = {} + stats['eval_results'] = eval_results + stats['train_hooks'] = train_hooks + + return stats + + +def define_resnet_flags(resnet_size_choices=None, dynamic_loss_scale=False, + fp16_implementation=False): + """Add flags and validators for ResNet.""" + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + num_gpu=True, hooks=True, export_dir=True, + distribution_strategy=True) + flags_core.define_performance(num_parallel_calls=False, + inter_op=True, + intra_op=True, + synthetic_data=True, + dtype=True, + all_reduce_alg=True, + num_packs=True, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + dynamic_loss_scale=dynamic_loss_scale, + fp16_implementation=fp16_implementation, + loss_scale=True, + tf_data_experimental_slack=True, + max_train_steps=True) + flags_core.define_image() + flags_core.define_benchmark() + flags_core.define_distribution() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_enum( + name='resnet_version', short_name='rv', default='1', + enum_values=['1', '2'], + help=flags_core.help_wrap( + 'Version of ResNet. (1 or 2) See README.md for details.')) + flags.DEFINE_bool( + name='fine_tune', short_name='ft', default=False, + help=flags_core.help_wrap( + 'If True do not train any parameters except for the final layer.')) + flags.DEFINE_string( + name='pretrained_model_checkpoint_path', short_name='pmcp', default=None, + help=flags_core.help_wrap( + 'If not None initialize all the network except the final layer with ' + 'these values')) + flags.DEFINE_boolean( + name='eval_only', default=False, + help=flags_core.help_wrap('Skip training and only perform evaluation on ' + 'the latest checkpoint.')) + flags.DEFINE_boolean( + name='image_bytes_as_serving_input', default=False, + help=flags_core.help_wrap( + 'If True exports savedmodel with serving signature that accepts ' + 'JPEG image bytes instead of a fixed size [HxWxC] tensor that ' + 'represents the image. The former is easier to use for serving at ' + 'the expense of image resize/cropping being done as part of model ' + 'inference. Note, this flag only applies to ImageNet and cannot ' + 'be used for CIFAR.')) + flags.DEFINE_boolean( + name='use_train_and_evaluate', default=False, + help=flags_core.help_wrap( + 'If True, uses `tf.estimator.train_and_evaluate` for the training ' + 'and evaluation loop, instead of separate calls to `classifier.train ' + 'and `classifier.evaluate`, which is the default behavior.')) + flags.DEFINE_bool( + name='enable_lars', default=False, + help=flags_core.help_wrap( + 'Enable LARS optimizer for large batch training.')) + flags.DEFINE_float( + name='label_smoothing', default=0.0, + help=flags_core.help_wrap( + 'Label smoothing parameter used in the softmax_cross_entropy')) + flags.DEFINE_float( + name='weight_decay', default=1e-4, + help=flags_core.help_wrap( + 'Weight decay coefficiant for l2 regularization.')) + + choice_kwargs = dict( + name='resnet_size', short_name='rs', default='50', + help=flags_core.help_wrap('The size of the ResNet model to use.')) + + if resnet_size_choices is None: + flags.DEFINE_string(**choice_kwargs) + else: + flags.DEFINE_enum(enum_values=resnet_size_choices, **choice_kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop_orgin.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop_orgin.py new file mode 100644 index 0000000..9cc46a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/resnet_run_loop_orgin.py @@ -0,0 +1,901 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains utility and supporting functions for ResNet. + + This module contains ResNet code which does not directly build layers. This +includes dataset management, hyperparameter and optimizer code, and argument +parsing. Code for defining the ResNet layers can be found in resnet_model.py. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import functools +import math +import multiprocessing +import os + +from absl import flags +import tensorflow as tf + +############## npu modify begin ############# +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator import npu_ops +from hccl.manage.api import get_local_rank_id +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +from tensorflow.core.protobuf import rewriter_config_pb2 +############## npu modify end ############### + +from official.r1.resnet import imagenet_preprocessing +from official.r1.resnet import resnet_model +from official.r1.utils import export +from official.utils.flags import core as flags_core +from official.utils.logs import hooks_helper +from official.utils.logs import logger +from official.utils.misc import distribution_utils +from official.utils.misc import model_helpers + + +################################################################################ +# Functions for input processing. +################################################################################ +def process_record_dataset(dataset, + is_training, + batch_size, + shuffle_buffer, + parse_record_fn, + num_epochs=1, + dtype=tf.float32, + datasets_num_private_threads=None, + drop_remainder=False, + tf_data_experimental_slack=False): + """Given a Dataset with raw records, return an iterator over the records. + + Args: + dataset: A Dataset representing raw records + is_training: A boolean denoting whether the input is for training. + batch_size: The number of samples per batch. + shuffle_buffer: The buffer size to use when shuffling records. A larger + value results in better randomness, but smaller values reduce startup + time and use less memory. + parse_record_fn: A function that takes a raw record and returns the + corresponding (image, label) pair. + num_epochs: The number of epochs to repeat the dataset. + dtype: Data type to use for images/features. + datasets_num_private_threads: Number of threads for a private + threadpool created for all datasets computation. + drop_remainder: A boolean indicates whether to drop the remainder of the + batches. If True, the batch dimension will be static. + tf_data_experimental_slack: Whether to enable tf.data's + `experimental_slack` option. + + Returns: + Dataset of (image, label) pairs ready for iteration. + """ + # Defines a specific size thread pool for tf.data operations. + if datasets_num_private_threads: + options = tf.data.Options() + options.experimental_threading.private_threadpool_size = ( + datasets_num_private_threads) + dataset = dataset.with_options(options) + tf.compat.v1.logging.info('datasets_num_private_threads: %s', + datasets_num_private_threads) + + # Disable intra-op parallelism to optimize for throughput instead of latency. + options = tf.data.Options() + options.experimental_threading.max_intra_op_parallelism = 1 + dataset = dataset.with_options(options) + + # Prefetches a batch at a time to smooth out the time taken to load input + # files for shuffling and processing. + dataset = dataset.prefetch(buffer_size=batch_size) + if is_training: + # Shuffles records before repeating to respect epoch boundaries. + dataset = dataset.shuffle(buffer_size=shuffle_buffer) + + # Repeats the dataset for the number of epochs to train. + #dataset = dataset.repeat(num_epochs) + dataset = dataset.repeat() + # Parses the raw records into images and labels. + dataset = dataset.map( + lambda value: parse_record_fn(value, is_training, dtype), + num_parallel_calls=tf.data.experimental.AUTOTUNE) + dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) + + # Operations between the final prefetch and the get_next call to the iterator + # will happen synchronously during run time. We prefetch here again to + # background all of the above processing work and keep it out of the + # critical training path. Setting buffer_size to tf.data.experimental.AUTOTUNE + # allows DistributionStrategies to adjust how many batches to fetch based + # on how many devices are present. + dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + + if tf_data_experimental_slack: + options = tf.data.Options() + options.experimental_slack = True + dataset = dataset.with_options(options) + + return dataset + + +def get_synth_input_fn(height, width, num_channels, num_classes, + dtype=tf.float32): + """Returns an input function that returns a dataset with random data. + + This input_fn returns a data set that iterates over a set of random data and + bypasses all preprocessing, e.g. jpeg decode and copy. The host to device + copy is still included. This used to find the upper throughput bound when + tunning the full input pipeline. + + Args: + height: Integer height that will be used to create a fake image tensor. + width: Integer width that will be used to create a fake image tensor. + num_channels: Integer depth that will be used to create a fake image tensor. + num_classes: Number of classes that should be represented in the fake labels + tensor + dtype: Data type for features/images. + + Returns: + An input_fn that can be used in place of a real one to return a dataset + that can be used for iteration. + """ + # pylint: disable=unused-argument + def input_fn(is_training, data_dir, batch_size, *args, **kwargs): + """Returns dataset filled with random data.""" + # Synthetic input should be within [0, 255]. + inputs = tf.random.truncated_normal( + [batch_size] + [height, width, num_channels], + dtype=dtype, + mean=127, + stddev=60, + name='synthetic_inputs') + + labels = tf.random.uniform( + [batch_size], + minval=0, + maxval=num_classes - 1, + dtype=tf.int32, + name='synthetic_labels') + data = tf.data.Dataset.from_tensors((inputs, labels)).repeat() + data = data.prefetch(buffer_size=tf.data.experimental.AUTOTUNE) + return data + + return input_fn + + +def image_bytes_serving_input_fn(image_shape, dtype=tf.float32): + """Serving input fn for raw jpeg images.""" + + def _preprocess_image(image_bytes): + """Preprocess a single raw image.""" + # Bounding box around the whole image. + bbox = tf.constant([0.0, 0.0, 1.0, 1.0], dtype=dtype, shape=[1, 1, 4]) + height, width, num_channels = image_shape + image = imagenet_preprocessing.preprocess_image( + image_bytes, bbox, height, width, num_channels, is_training=False) + return image + + image_bytes_list = tf.compat.v1.placeholder( + shape=[None], dtype=tf.string, name='input_tensor') + images = tf.map_fn( + _preprocess_image, image_bytes_list, back_prop=False, dtype=dtype) + return tf.estimator.export.TensorServingInputReceiver( + images, {'image_bytes': image_bytes_list}) + + +def override_flags_and_set_envars_for_gpu_thread_pool(flags_obj): + """Override flags and set env_vars for performance. + + These settings exist to test the difference between using stock settings + and manual tuning. It also shows some of the ENV_VARS that can be tweaked to + squeeze a few extra examples per second. These settings are defaulted to the + current platform of interest, which changes over time. + + On systems with small numbers of cpu cores, e.g. under 8 logical cores, + setting up a gpu thread pool with `tf_gpu_thread_mode=gpu_private` may perform + poorly. + + Args: + flags_obj: Current flags, which will be adjusted possibly overriding + what has been set by the user on the command-line. + """ + cpu_count = multiprocessing.cpu_count() + tf.compat.v1.logging.info('Logical CPU cores: %s', cpu_count) + + # Sets up thread pool for each GPU for op scheduling. + per_gpu_thread_count = 1 + total_gpu_thread_count = per_gpu_thread_count * flags_obj.num_gpus + os.environ['TF_GPU_THREAD_MODE'] = flags_obj.tf_gpu_thread_mode + os.environ['TF_GPU_THREAD_COUNT'] = str(per_gpu_thread_count) + tf.compat.v1.logging.info('TF_GPU_THREAD_COUNT: %s', + os.environ['TF_GPU_THREAD_COUNT']) + tf.compat.v1.logging.info('TF_GPU_THREAD_MODE: %s', + os.environ['TF_GPU_THREAD_MODE']) + + # Reduces general thread pool by number of threads used for GPU pool. + main_thread_count = cpu_count - total_gpu_thread_count + flags_obj.inter_op_parallelism_threads = main_thread_count + + # Sets thread count for tf.data. Logical cores minus threads assign to the + # private GPU pool along with 2 thread per GPU for event monitoring and + # sending / receiving tensors. + num_monitoring_threads = 2 * flags_obj.num_gpus + flags_obj.datasets_num_private_threads = (cpu_count - total_gpu_thread_count + - num_monitoring_threads) + + +################################################################################ +# Functions for running training/eval/validation loops for the model. +################################################################################ +def learning_rate_with_decay( + batch_size, batch_denom, num_images, boundary_epochs, decay_rates, + base_lr=0.1, warmup=False): + """Get a learning rate that decays step-wise as training progresses. + + Args: + batch_size: the number of examples processed in each training batch. + batch_denom: this value will be used to scale the base learning rate. + `0.1 * batch size` is divided by this number, such that when + batch_denom == batch_size, the initial learning rate will be 0.1. + num_images: total number of images that will be used for training. + boundary_epochs: list of ints representing the epochs at which we + decay the learning rate. + decay_rates: list of floats representing the decay rates to be used + for scaling the learning rate. It should have one more element + than `boundary_epochs`, and all elements should have the same type. + base_lr: Initial learning rate scaled based on batch_denom. + warmup: Run a 5 epoch warmup to the initial lr. + Returns: + Returns a function that takes a single argument - the number of batches + trained so far (global_step)- and returns the learning rate to be used + for training the next batch. + """ + initial_learning_rate = base_lr * batch_size / batch_denom + batches_per_epoch = num_images / batch_size + + # Reduce the learning rate at certain epochs. + # CIFAR-10: divide by 10 at epoch 100, 150, and 200 + # ImageNet: divide by 10 at epoch 30, 60, 80, and 90 + boundaries = [int(batches_per_epoch * epoch) for epoch in boundary_epochs] + vals = [initial_learning_rate * decay for decay in decay_rates] + + def learning_rate_fn(global_step): + """Builds scaled learning rate function with 5 epoch warm up.""" + + ############## npu modify begin ############# + #Using int32 for better computing performance + global_step=tf.cast(global_step,tf.int32) + ############## npu modify end ############### + + lr = tf.compat.v1.train.piecewise_constant(global_step, boundaries, vals) + if warmup: + warmup_steps = int(batches_per_epoch * 5) + warmup_lr = ( + initial_learning_rate * tf.cast(global_step, tf.float32) / tf.cast( + warmup_steps, tf.float32)) + return tf.cond(pred=global_step < warmup_steps, + true_fn=lambda: warmup_lr, + false_fn=lambda: lr) + return lr + + def poly_rate_fn(global_step): + """Handles linear scaling rule, gradual warmup, and LR decay. + + The learning rate starts at 0, then it increases linearly per step. After + FLAGS.poly_warmup_epochs, we reach the base learning rate (scaled to account + for batch size). The learning rate is then decayed using a polynomial rate + decay schedule with power 2.0. + + Args: + global_step: the current global_step + + Returns: + returns the current learning rate + """ + + # Learning rate schedule for LARS polynomial schedule + if flags.FLAGS.batch_size < 8192: + plr = 5.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 16384: + plr = 10.0 + w_epochs = 5 + elif flags.FLAGS.batch_size < 32768: + plr = 25.0 + w_epochs = 5 + else: + plr = 32.0 + w_epochs = 14 + + w_steps = int(w_epochs * batches_per_epoch) + wrate = (plr * tf.cast(global_step, tf.float32) / tf.cast( + w_steps, tf.float32)) + + # TODO(pkanwar): use a flag to help calc num_epochs. + num_epochs = 90 + train_steps = batches_per_epoch * num_epochs + + min_step = tf.constant(1, dtype=tf.int64) + decay_steps = tf.maximum(min_step, tf.subtract(global_step, w_steps)) + poly_rate = tf.train.polynomial_decay( + plr, + decay_steps, + train_steps - w_steps + 1, + power=2.0) + return tf.where(global_step <= w_steps, wrate, poly_rate) + + # For LARS we have a new learning rate schedule + if flags.FLAGS.enable_lars: + return poly_rate_fn + + return learning_rate_fn + + +def resnet_model_fn(features, labels, mode, model_class, + resnet_size, weight_decay, learning_rate_fn, momentum, + data_format, resnet_version, loss_scale, + loss_filter_fn=None, dtype=resnet_model.DEFAULT_DTYPE, + fine_tune=False, label_smoothing=0.0): + """Shared functionality for different resnet model_fns. + + Initializes the ResnetModel representing the model layers + and uses that model to build the necessary EstimatorSpecs for + the `mode` in question. For training, this means building losses, + the optimizer, and the train op that get passed into the EstimatorSpec. + For evaluation and prediction, the EstimatorSpec is returned without + a train op, but with the necessary parameters for the given mode. + + Args: + features: tensor representing input images + labels: tensor representing class labels for all input images + mode: current estimator mode; should be one of + `tf.estimator.ModeKeys.TRAIN`, `EVALUATE`, `PREDICT` + model_class: a class representing a TensorFlow model that has a __call__ + function. We assume here that this is a subclass of ResnetModel. + resnet_size: A single integer for the size of the ResNet model. + weight_decay: weight decay loss rate used to regularize learned variables. + learning_rate_fn: function that returns the current learning rate given + the current global_step + momentum: momentum term used for optimization + data_format: Input format ('channels_last', 'channels_first', or None). + If set to None, the format is dependent on whether a GPU is available. + resnet_version: Integer representing which version of the ResNet network to + use. See README for details. Valid values: [1, 2] + loss_scale: The factor to scale the loss for numerical stability. A detailed + summary is present in the arg parser help text. + loss_filter_fn: function that takes a string variable name and returns + True if the var should be included in loss calculation, and False + otherwise. If None, batch_normalization variables will be excluded + from the loss. + dtype: the TensorFlow dtype to use for calculations. + fine_tune: If True only train the dense layers(final layers). + label_smoothing: If greater than 0 then smooth the labels. + + Returns: + EstimatorSpec parameterized according to the input params and the + current mode. + """ + + # Generate a summary node for the images + tf.compat.v1.summary.image('images', features, max_outputs=6) + + ############## npu modify begin ############# + # Checks that features/images have same data type being used for calculations. + if features.dtype != dtype: + features=tf.cast(features,dtype) + ############## npu modify end ############### + + model = model_class(resnet_size, data_format, resnet_version=resnet_version, + dtype=dtype) + + logits = model(features, mode == tf.estimator.ModeKeys.TRAIN) + + # This acts as a no-op if the logits are already in fp32 (provided logits are + # not a SparseTensor). If dtype is is low precision, logits must be cast to + # fp32 for numerical stability. + logits = tf.cast(logits, tf.float32) + + predictions = { + 'classes': tf.argmax(input=logits, axis=1), + 'probabilities': tf.nn.softmax(logits, name='softmax_tensor') + } + + if mode == tf.estimator.ModeKeys.PREDICT: + # Return the predictions and the specification for serving a SavedModel + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + export_outputs={ + 'predict': tf.estimator.export.PredictOutput(predictions) + }) + + # Calculate loss, which includes softmax cross entropy and L2 regularization. + if label_smoothing != 0.0: + one_hot_labels = tf.one_hot(labels, 1001) + cross_entropy = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=one_hot_labels, + label_smoothing=label_smoothing) + else: + cross_entropy = tf.compat.v1.losses.sparse_softmax_cross_entropy( + logits=logits, labels=labels) + + # Create a tensor named cross_entropy for logging purposes. + tf.identity(cross_entropy, name='cross_entropy') + tf.compat.v1.summary.scalar('cross_entropy', cross_entropy) + + # If no loss_filter_fn is passed, assume we want the default behavior, + # which is that batch_normalization variables are excluded from loss. + def exclude_batch_norm(name): + return 'batch_normalization' not in name + loss_filter_fn = loss_filter_fn or exclude_batch_norm + + # Add weight decay to the loss. + l2_loss = weight_decay * tf.add_n( + # loss is computed using fp32 for numerical stability. + [ + tf.nn.l2_loss(tf.cast(v, tf.float32)) + for v in tf.compat.v1.trainable_variables() + if loss_filter_fn(v.name) + ]) + tf.compat.v1.summary.scalar('l2_loss', l2_loss) + loss = cross_entropy + l2_loss + + if mode == tf.estimator.ModeKeys.TRAIN: + global_step = tf.compat.v1.train.get_or_create_global_step() + + learning_rate = learning_rate_fn(global_step) + + # Create a tensor named learning_rate for logging purposes + tf.identity(learning_rate, name='learning_rate') + tf.compat.v1.summary.scalar('learning_rate', learning_rate) + + if flags.FLAGS.enable_lars: + from tensorflow.contrib import opt as contrib_opt # pylint: disable=g-import-not-at-top + optimizer = contrib_opt.LARSOptimizer( + learning_rate, + momentum=momentum, + weight_decay=weight_decay, + skip_list=['batch_normalization', 'bias']) + else: + optimizer = tf.compat.v1.train.MomentumOptimizer( + learning_rate=learning_rate, + momentum=momentum + ) + + ############## npu modify begin ############# + optimizer = NPUDistributedOptimizer(optimizer) + ############## npu modify end ############### + + fp16_implementation = getattr(flags.FLAGS, 'fp16_implementation', None) + if fp16_implementation == 'graph_rewrite': + optimizer = ( + tf.compat.v1.train.experimental.enable_mixed_precision_graph_rewrite( + optimizer, loss_scale=loss_scale)) + + def _dense_grad_filter(gvs): + """Only apply gradient updates to the final layer. + + This function is used for fine tuning. + + Args: + gvs: list of tuples with gradients and variable info + Returns: + filtered gradients so that only the dense layer remains + """ + return [(g, v) for g, v in gvs if 'dense' in v.name] + + # if loss_scale != 1 and fp16_implementation != 'graph_rewrite': + # When computing fp16 gradients, often intermediate tensor values are + # so small, they underflow to 0. To avoid this, we multiply the loss by + # loss_scale to make these tensor values loss_scale times bigger. + loss_scale = 512 + scaled_grad_vars = optimizer.compute_gradients(loss * loss_scale) + + if fine_tune: + scaled_grad_vars = _dense_grad_filter(scaled_grad_vars) + + # Once the gradient computation is complete we can scale the gradients + # back to the correct scale before passing them to the optimizer. + unscaled_grad_vars = [(grad / loss_scale, var) + for grad, var in scaled_grad_vars] + minimize_op = optimizer.apply_gradients(unscaled_grad_vars, global_step) + #else: + # grad_vars = optimizer.compute_gradients(loss) + # if fine_tune: + # grad_vars = _dense_grad_filter(grad_vars) + # minimize_op = optimizer.apply_gradients(grad_vars, global_step) + + update_ops = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.UPDATE_OPS) + train_op = tf.group(minimize_op, update_ops) + else: + train_op = None + + ############## npu modify begin ############# + #Using float32 for better performance + accuracy = tf.compat.v1.metrics.accuracy(tf.cast(labels,tf.float32), predictions['classes']) + ############## npu modify end ############### + + accuracy_top_5 = tf.compat.v1.metrics.mean( + tf.nn.in_top_k(predictions=logits, targets=labels, k=5, name='top_5_op')) + metrics = {'accuracy': accuracy, + 'accuracy_top_5': accuracy_top_5} + + # Create a tensor named train_accuracy for logging purposes + tf.identity(accuracy[1], name='train_accuracy') + tf.identity(accuracy_top_5[1], name='train_accuracy_top_5') + tf.compat.v1.summary.scalar('train_accuracy', accuracy[1]) + tf.compat.v1.summary.scalar('train_accuracy_top_5', accuracy_top_5[1]) + + return tf.estimator.EstimatorSpec( + mode=mode, + predictions=predictions, + loss=loss, + train_op=train_op, + eval_metric_ops=metrics) + +############## npu modify begin ############# +def init_npu(): + """Initialize npu manually. + Returns: + `init_sess` npu init session config. + `npu_init` npu init ops. + """ + npu_init = npu_ops.initialize_system() + config = tf.ConfigProto() + + #npu mix precision attribute set to true when using mix precision + config.graph_options.rewrite_options.remapping = rewriter_config_pb2.RewriterConfig.OFF + custom_op = config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + #custom_op.parameter_map["precision_mode"].b = True + custom_op.parameter_map["precision_mode"].s = tf.compat.as_bytes("allow_mix_precision") + custom_op.parameter_map["use_off_line"].b = True + + init_sess = tf.Session(config=config) + return init_sess,npu_init +############## npu modify end ############### + +def resnet_main( + flags_obj, model_function, input_function, dataset_name, num_images, shape=None): + """Shared main loop for ResNet Models. + + Args: + flags_obj: An object containing parsed flags. See define_resnet_flags() + for details. + model_function: the function that instantiates the Model and builds the + ops for train/eval. This will be passed directly into the estimator. + input_function: the function that processes the dataset and returns a + dataset that the estimator can train on. This will be wrapped with + all the relevant flags for running and passed to estimator. + dataset_name: the name of the dataset for training and evaluation. This is + used for logging purpose. + shape: list of ints representing the shape of the images used for training. + This is only used if flags_obj.export_dir is passed. + + Returns: + Dict of results of the run. Contains the keys `eval_results` and + `train_hooks`. `eval_results` contains accuracy (top_1) and accuracy_top_5. + `train_hooks` is a list the instances of hooks used during training. + """ + + model_helpers.apply_clean(flags.FLAGS) + + # Ensures flag override logic is only executed if explicitly triggered. + if flags_obj.tf_gpu_thread_mode: + override_flags_and_set_envars_for_gpu_thread_pool(flags_obj) + + # Configures cluster spec for distribution strategy. + num_workers = distribution_utils.configure_cluster(flags_obj.worker_hosts, + flags_obj.task_index) + + # Creates session config. allow_soft_placement = True, is required for + # multi-GPU and is not harmful for other modes. + session_config = tf.compat.v1.ConfigProto( + inter_op_parallelism_threads=flags_obj.inter_op_parallelism_threads, + intra_op_parallelism_threads=flags_obj.intra_op_parallelism_threads, + allow_soft_placement=True) + + distribution_strategy = distribution_utils.get_distribution_strategy( + distribution_strategy=flags_obj.distribution_strategy, + num_gpus=flags_core.get_num_gpus(flags_obj), + all_reduce_alg=flags_obj.all_reduce_alg, + num_packs=flags_obj.num_packs) + + ############## npu modify begin ############# + # Creates a `NPURunConfig` that checkpoints every 115200 steps + run_config = NPURunConfig( + model_dir=flags_obj.model_dir, + session_config=session_config, + keep_checkpoint_max=5, + save_checkpoints_steps=115200, + enable_data_pre_proc=True, + iterations_per_loop=100, + #enable_auto_mix_precision=True, + precision_mode='allow_mix_precision', + hcom_parallel=True + ) + ############## npu modify end ############### + + # Initializes model with all but the dense layer from pretrained ResNet. + if flags_obj.pretrained_model_checkpoint_path is not None: + warm_start_settings = tf.estimator.WarmStartSettings( + flags_obj.pretrained_model_checkpoint_path, + vars_to_warm_start='^(?!.*dense)') + else: + warm_start_settings = None + + ############## npu modify begin ############# + # Creates a `NPUEstimator` instead of using tf.estimator.Estimator + classifier = NPUEstimator( + model_fn=model_function, model_dir=flags_obj.model_dir, config=run_config, + params={ + 'resnet_size': int(flags_obj.resnet_size), + 'data_format': flags_obj.data_format, + 'batch_size': flags_obj.batch_size, + 'resnet_version': int(flags_obj.resnet_version), + 'loss_scale': flags_core.get_loss_scale(flags_obj, + default_for_fp16=128), + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'fine_tune': flags_obj.fine_tune, + 'num_workers': num_workers, + 'num_gpus' : flags_core.get_num_gpus(flags_obj), + }) + ############## npu modify end ############### + + run_params = { + 'batch_size': flags_obj.batch_size, + 'dtype': flags_core.get_tf_dtype(flags_obj), + 'resnet_size': flags_obj.resnet_size, + 'resnet_version': flags_obj.resnet_version, + 'synthetic_data': flags_obj.use_synthetic_data, + 'train_epochs': flags_obj.train_epochs, + 'num_workers': num_workers, + } + if flags_obj.use_synthetic_data: + dataset_name = dataset_name + '-synthetic' + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info('resnet', dataset_name, run_params, + test_id=flags_obj.benchmark_test_id) + + train_hooks = hooks_helper.get_train_hooks( + flags_obj.hooks, + model_dir=flags_obj.model_dir, + batch_size=flags_obj.batch_size) + + def input_fn_train(num_epochs, input_context=None): + ############## npu modify begin ############# + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + # batch_size means single card batch instead of global batch size + return input_function( + is_training=True, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=num_epochs, + dtype=tf.float16, + input_context=input_context, + drop_remainder=True) + + def input_fn_eval(): + # batch_size means single card batch instead of global batch size + # Using dtype=tf.float16 for higher data transmission performance + # drop_remainder currently only support true + return input_function( + is_training=False, + data_dir=flags_obj.data_dir, + batch_size=flags_obj.batch_size, + num_epochs=1, + dtype=tf.float16, + drop_remainder=True) + ############## npu modify end ############### + + train_epochs = (0 if flags_obj.eval_only or not flags_obj.train_epochs else + flags_obj.train_epochs) + + use_train_and_evaluate = flags_obj.use_train_and_evaluate or num_workers > 1 + if use_train_and_evaluate: + train_spec = tf.estimator.TrainSpec( + input_fn=lambda input_context=None: input_fn_train( + train_epochs, input_context=input_context), + hooks=train_hooks, + max_steps=flags_obj.max_train_steps) + eval_spec = tf.estimator.EvalSpec(input_fn=input_fn_eval) + tf.compat.v1.logging.info('Starting to train and evaluate.') + tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec) + # tf.estimator.train_and_evalute doesn't return anything in multi-worker + # case. + eval_results = {} + else: + if train_epochs == 0: + # If --eval_only is set, perform a single loop with zero train epochs. + schedule, n_loops = [0], 1 + else: + # Compute the number of times to loop while training. All but the last + # pass will train for `epochs_between_evals` epochs, while the last will + # train for the number needed to reach `training_epochs`. For instance if + # train_epochs = 25 and epochs_between_evals = 10 + # schedule will be set to [10, 10, 5]. That is to say, the loop will: + # Train for 10 epochs and then evaluate. + # Train for another 10 epochs and then evaluate. + # Train for a final 5 epochs (to reach 25 epochs) and then evaluate. + n_loops = math.ceil(train_epochs / flags_obj.epochs_between_evals) + schedule = [flags_obj.epochs_between_evals for _ in range(int(n_loops))] + schedule[-1] = train_epochs - sum(schedule[:-1]) # over counting. + + ############## npu modify begin ############# + if flags_obj.max_train_steps is None: + flags_obj.max_train_steps = (num_images['train']/flags_obj.batch_size)/flags_core.get_num_gpus(flags_obj) + max_eval_steps = num_images['validation']/flags_obj.batch_size + else: + max_eval_steps = flags_obj.max_train_steps + ############## npu modify end ############# + for cycle_index, num_train_epochs in enumerate(schedule): + tf.compat.v1.logging.info('Starting cycle: %d/%d', cycle_index, + int(n_loops)) + + if num_train_epochs: + # Since we are calling classifier.train immediately in each loop, the + # value of num_train_epochs in the lambda function will not be changed + # before it is used. So it is safe to ignore the pylint error here + # pylint: disable=cell-var-from-loop + classifier.train( + input_fn=lambda input_context=True: input_fn_train( + num_train_epochs, input_context=input_context), + hooks=train_hooks, + max_steps=flags_obj.max_train_steps*(cycle_index+1)) + + ############## npu modify begin ############# + # npu resorce will be destoryed When the training is over + # Reinitialize is needed if using hccl interface before next process + init_sess,npu_init=init_npu() + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + init_sess.run(npu_init) + ############## npu modify end ############### + + # flags_obj.max_train_steps is generally associated with testing and + # profiling. As a result it is frequently called with synthetic data, + # which will iterate forever. Passing steps=flags_obj.max_train_steps + # allows the eval (which is generally unimportant in those circumstances) + # to terminate. Note that eval will run for max_train_steps each loop, + # regardless of the global_step count. + tf.compat.v1.logging.info('Starting to evaluate.') + eval_results = classifier.evaluate(input_fn=input_fn_eval, + steps=max_eval_steps) + benchmark_logger.log_evaluation_result(eval_results) + + + if model_helpers.past_stop_threshold( + flags_obj.stop_threshold, eval_results['accuracy']): + break + + ############## npu modify begin ############# + # npu resorce will be destoryed when evaluate finish + # Reinitialize is needed before using hccl interface + init_sess,npu_init=init_npu() + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + init_sess.run(npu_init) + ############## npu modify end ############### + + if flags_obj.export_dir is not None: + # Exports a saved model for the given classifier. + export_dtype = flags_core.get_tf_dtype(flags_obj) + if flags_obj.image_bytes_as_serving_input: + input_receiver_fn = functools.partial( + image_bytes_serving_input_fn, shape, dtype=export_dtype) + else: + input_receiver_fn = export.build_tensor_serving_input_receiver_fn( + shape, batch_size=flags_obj.batch_size, dtype=export_dtype) + classifier.export_savedmodel(flags_obj.export_dir, input_receiver_fn, + strip_default_attrs=True) + + ############## npu modify begin ############# + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + ############## npu modify end ############### + + stats = {} + stats['eval_results'] = eval_results + stats['train_hooks'] = train_hooks + + return stats + + +def define_resnet_flags(resnet_size_choices=None, dynamic_loss_scale=False, + fp16_implementation=False): + """Add flags and validators for ResNet.""" + flags_core.define_base(clean=True, train_epochs=True, + epochs_between_evals=True, stop_threshold=True, + num_gpu=True, hooks=True, export_dir=True, + distribution_strategy=True) + flags_core.define_performance(num_parallel_calls=False, + inter_op=True, + intra_op=True, + synthetic_data=True, + dtype=True, + all_reduce_alg=True, + num_packs=True, + tf_gpu_thread_mode=True, + datasets_num_private_threads=True, + dynamic_loss_scale=dynamic_loss_scale, + fp16_implementation=fp16_implementation, + loss_scale=True, + tf_data_experimental_slack=True, + max_train_steps=True) + flags_core.define_image() + flags_core.define_benchmark() + flags_core.define_distribution() + flags.adopt_module_key_flags(flags_core) + + flags.DEFINE_enum( + name='resnet_version', short_name='rv', default='1', + enum_values=['1', '2'], + help=flags_core.help_wrap( + 'Version of ResNet. (1 or 2) See README.md for details.')) + flags.DEFINE_bool( + name='fine_tune', short_name='ft', default=False, + help=flags_core.help_wrap( + 'If True do not train any parameters except for the final layer.')) + flags.DEFINE_string( + name='pretrained_model_checkpoint_path', short_name='pmcp', default=None, + help=flags_core.help_wrap( + 'If not None initialize all the network except the final layer with ' + 'these values')) + flags.DEFINE_boolean( + name='eval_only', default=False, + help=flags_core.help_wrap('Skip training and only perform evaluation on ' + 'the latest checkpoint.')) + flags.DEFINE_boolean( + name='image_bytes_as_serving_input', default=False, + help=flags_core.help_wrap( + 'If True exports savedmodel with serving signature that accepts ' + 'JPEG image bytes instead of a fixed size [HxWxC] tensor that ' + 'represents the image. The former is easier to use for serving at ' + 'the expense of image resize/cropping being done as part of model ' + 'inference. Note, this flag only applies to ImageNet and cannot ' + 'be used for CIFAR.')) + flags.DEFINE_boolean( + name='use_train_and_evaluate', default=False, + help=flags_core.help_wrap( + 'If True, uses `tf.estimator.train_and_evaluate` for the training ' + 'and evaluation loop, instead of separate calls to `classifier.train ' + 'and `classifier.evaluate`, which is the default behavior.')) + flags.DEFINE_bool( + name='enable_lars', default=False, + help=flags_core.help_wrap( + 'Enable LARS optimizer for large batch training.')) + flags.DEFINE_float( + name='label_smoothing', default=0.0, + help=flags_core.help_wrap( + 'Label smoothing parameter used in the softmax_cross_entropy')) + flags.DEFINE_float( + name='weight_decay', default=1e-4, + help=flags_core.help_wrap( + 'Weight decay coefficiant for l2 regularization.')) + + choice_kwargs = dict( + name='resnet_size', short_name='rs', default='50', + help=flags_core.help_wrap('The size of the ResNet model to use.')) + + if resnet_size_choices is None: + flags.DEFINE_string(**choice_kwargs) + else: + flags.DEFINE_enum(enum_values=resnet_size_choices, **choice_kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/slog b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/slog new file mode 100644 index 0000000..d5694e9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/resnet/slog @@ -0,0 +1,581 @@ +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:20.962.831 [tdt/device/../common/src/log.cpp:158][TSDaemon] begin to send heartbeat to appmon,[tdt/device/src/tsd/tsdaemon.cpp:1580:SendHeartBeatToAppMon]8462 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:20.963.000 [tdt/device/../common/src/log.cpp:149][TsdEVENT] send heartbeat to appmon success,[tdt/device/src/tsd/tsdaemon.cpp:1587:SendHeartBeatToAppMon]8462 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.682 [tdt/device/../common/src/log.cpp:158][HdcSever] drv accept an session,[tdt/device/../common/src/hdc_server.cpp:330:AcceptHdcSession]8454 Msg: running ok +[INFO] HDC(8380,tsdaemon):2020-05-12-11:05:22.243.730 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:1609][drvHdcSetSessionReference:1609] >>> session 55, pid 8380 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.752 [tdt/device/../common/src/log.cpp:158][HdcSever] drvHdcSetSessionReference success,[tdt/device/../common/src/hdc_server.cpp:342:AcceptHdcSession]8454 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.772 [tdt/device/../common/src/log.cpp:158][HdcSever] drv accept an session and drvHdcSetSessionReference success, sessionId=1,[tdt/device/../common/src/hdc_server.cpp:351:AcceptHdcSession]8454 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.788 [tdt/device/../common/src/log.cpp:158][HdcSever] accept an session sessionId=1, open recv thread,[tdt/device/../common/src/hdc_server.cpp:279:Accept]8454 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.823 [tdt/device/../common/src/log.cpp:158]HdcServer::AcceptConnection Start,[tdt/device/../common/src/hdc_server.cpp:310:AcceptHdcSession]8454 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.854 [tdt/device/../common/src/log.cpp:158]HdcServer::RecvData thread = 281470605762992,[tdt/device/../common/src/hdc_server.cpp:154:RecvData]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.945 [tdt/device/../common/src/log.cpp:158]tsdaemon get process sign successfully, procpid:40927 signSize:48,[tdt/device/src/tsd/tsdaemon.cpp:901:FmkToTsdMsg]30221 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.963 [tdt/device/../common/src/log.cpp:149][TsdEVENT]FmkToTsdMsg dev[0] msg[6] sessionId[1] realDev[0] fmkSignPid[40927] profilingMode[0] rankSize[1],[tdt/device/src/tsd/tsdaemon.cpp:905:FmkToTsdMsg]30221 +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:22.243.982 [tdt/device/../common/src/log.cpp:149][TsdEVENT]From FMK Start >>>>>>>>>> TSD dev[0] sessionId[1] realDev[0] fmkPid[40927] rankSize[1],[tdt/device/src/tsd/tsdaemon.cpp:853:FmkToTsdMsgProc]30221 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.000 [tdt/device/../common/src/log.cpp:158][TSDaemon] isAllLastRcvThreadClean_ value:0,[tdt/device/src/tsd/tsdaemon.cpp:819:CleanAllLastRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.013 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] JoinAllPPCRcvThreads() enter [threadSize=1]!,[tdt/device/src/tsd/ppc_server.cpp:96:JoinAllPPCRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.039 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] JoinAllPPCRcvThreads() [ppc tid=281470588977584] [threadSize=1] [freeThreadSize=1].,[tdt/device/src/tsd/ppc_server.cpp:105:JoinAllPPCRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.056 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] JoinAllPPCRcvThreads() [free tid=281470588977584].,[tdt/device/src/tsd/ppc_server.cpp:111:JoinAllPPCRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.071 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] JoinAllPPCRcvThreads() Find free tid and joinable.,[tdt/device/src/tsd/ppc_server.cpp:114:JoinAllPPCRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.086 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] JoinAllPPCRcvThreads() exit [threadSize=0] [freeThreadSize=0].,[tdt/device/src/tsd/ppc_server.cpp:129:JoinAllPPCRcvThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.101 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvHdcThreads() enter [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:333:CleanTsdRcvHdcThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.120 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvHdcThreads() [tid=281470597370288] [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:341:CleanTsdRcvHdcThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.139 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvHdcThreads() [tid=281470572192176] [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:341:CleanTsdRcvHdcThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.152 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvHdcThreads() exit [threadSize=0]!,[tdt/device/src/tsd/tsdaemon.cpp:346:CleanTsdRcvHdcThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.167 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvPPCThreads() enter [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:356:CleanTsdRcvPPCThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.181 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvPPCThreads() [tid=281470580584880] [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:364:CleanTsdRcvPPCThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.197 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvPPCThreads() [tid=281470563799472] [threadSize=2]!,[tdt/device/src/tsd/tsdaemon.cpp:364:CleanTsdRcvPPCThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.241 [tdt/device/../common/src/log.cpp:158][TSDaemon] CleanTsdRcvPPCThreads() exit [threadSize=0]!,[tdt/device/src/tsd/tsdaemon.cpp:369:CleanTsdRcvPPCThreads]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.259 [tdt/device/../common/src/log.cpp:158][TSDaemon] StartSubProcess deviceId: 0, fmkPid: 40927, sessionId: 1, state: 0,[tdt/device/src/tsd/tsdaemon.cpp:630:StartSubProcess]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.273 [tdt/device/../common/src/log.cpp:158][TSDaemon] StartSubProcess rankSize: 1,,[tdt/device/src/tsd/tsdaemon.cpp:635:StartSubProcess]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.285 [tdt/device/../common/src/log.cpp:158][TSDaemon] Process HCCP is abandoned to start, the rank size is 1,[tdt/device/src/tsd/tsdaemon.cpp:651:StartSubProcess]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.337 [tdt/device/../common/src/log.cpp:158][TSDaemon] start delete file, direct is /home/HwHiAiUser/hdcd/device0/,[tdt/device/src/tsd/tsdaemon.cpp:1878:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.367 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is .,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.382 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is ..,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.398 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is etc,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.412 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is upgrade,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.457 [tdt/device/../common/src/log.cpp:158][TSDaemon] ExecuteStart() [tid=281470563799472]!,[tdt/device/src/tsd/tsdaemon.cpp:477:ExecuteStart]30222 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.244.477 [tdt/device/../common/src/log.cpp:158][TSDaemon] check pathName[/var/aicpu_scheduler], pathLen[20] procName[aicpu_scheduler], len[15], MAX_LEN[256] ,[tdt/device/src/tsd/tsdaemon.cpp:1514:CheckProcessInputParam]30222 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:22.245.278 [tdt/device/../common/src/log.cpp:149][TsdEVENT]#### Start TSD->SubProcess[PROC] Start Msg Device[0] Proc[aicpu_scheduler] fmkPid[40927] fatherPid[8380] subPid[30223] #### profilingMode is[0],[tdt/device/src/tsd/tsdaemon.cpp:498:ExecuteStart]30222 +[OPLOG] TDT(8380,tsdaemon):2020-05-12-11:05:22.245.328 [tdt/device/../common/src/log.cpp:151][tdt/device/src/tsd/tsdaemon.cpp:499:ExecuteStart]30222 alloc resource {devOS:[30223]} for {dev:0} +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.245.390 [tdt/device/../common/src/log.cpp:158][TSDaemon] SetTsdToFmkMsg:deviceId[0], sessionId[1], subProcPid[30223],[tdt/device/src/tsd/tsdaemon.cpp:774:SetTsdToFmkMsg]30222 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.279.681 [hardware/dev_plat/../dev_plat/devhdc/hdc_cfg_parse.c:190][CfgFileOpen:190] >>> /etc/hdcBasic.cfg not exist +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.279.712 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:554][hdcInit:554] >>> HDC pcie init,use default segment(524288) +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.279.765 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:539][hdcPcieInit:539] >>> after init hdc segment 524224, socket segment 0 +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.279.780 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:574][hdcInit:574] >>> HDC init success. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.281.768 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.646658] [hdcdrv] [hdcdrv_config 2288] pid 30223 use segment 524224. +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.284.329 [tdt/device/../common/src/log.cpp:143]Register data type failed: hiaiSerializeFunc is existed,[tdt/common/common_inc/data_type_reg.h:192:Register]30223 Msg: func has already existed +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.284.723 [aicpu/aicpu_device/aicpu_schedule/compute_process/main.cc:185][AICPUFW] [main 185] Compute process(cloud) compile time is 02:13:48 Apr 26 2020 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.284.751 [aicpu/aicpu_device/aicpu_schedule/compute_process/main.cc:168][AICPUFW] [ParseArgs 168] Parse args success. deviceId=0, pid=40927, pidSign=e9b203cc443d80564c8c88a0d111cb95145fae36b00d1ec1, profilingMode=0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.284.960 [hardware/dev_plat/../dev_core/devdrv/devdrv_container.c:193][devdrv] [devdrv_do_container 193] para.num(4). +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.284.983 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:83][AICPUFW] [Start 83] Aicpu_scheduler will start, hostpid=40927, deviceId=0, hostDeviceId = 0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.284.999 [hardware/dev_plat/aicpufw/aicpufw_api.c:125][AICPUFW] [drvDevBindPid 125] drvDevBindPid enter: chip_id = 0, hostpid=40927, mode=0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.285.015 [hardware/dev_plat/aicpufw/aicpufw_dev.c:348][AICPUFW] [aicpufw_dev_bind_pid 348] chip0 aicpu bind pid (40927). +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.285.805 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.651711] [devdrv] [devdrv_manager_container_init_devlist_ns 1139] num(0), dev(0) +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.285.825 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.651716] [devdrv] [devdrv_manager_container_init_devlist_ns 1139] num(1), dev(1) +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.285.836 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.651719] [devdrv] [devdrv_manager_container_init_devlist_ns 1139] num(2), dev(2) +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.285.846 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.651722] [devdrv] [devdrv_manager_container_init_devlist_ns 1139] num(3), dev(3) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.370.966 [hardware/dev_plat/aicpufw/aicpufw_dev.c:76][AICPUFW] [aicpufw_dev_open 76] chip_id:0 is opened success, fd=18. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.371.155 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:283][AICPUFW] [InitFd 283] InitFd begin, deviceId=0. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:22.371.186 [datapreprocess/src/task_queue.cc:58][DP_PREPROCESS] [I] [datapreprocess/src/task_queue.cc:58] Begin create task queue eventfd. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:22.371.209 [datapreprocess/src/task_queue.cc:70][DP_PREPROCESS] [I] [datapreprocess/src/task_queue.cc:70] End create task queue eventfd 19. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:22.371.224 [datapreprocess/src/task_queue.cc:58][DP_PREPROCESS] [I] [datapreprocess/src/task_queue.cc:58] Begin create task queue eventfd. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:22.371.241 [datapreprocess/src/task_queue.cc:70][DP_PREPROCESS] [I] [datapreprocess/src/task_queue.cc:70] End create task queue eventfd 20. +[TRACE] DP(30223,aicpu_scheduler):2020-05-12-11:05:22.371.256 [status:START] [datapreprocess/src/task_queue.cc:262]DP_PREPROCESS module has been initialized +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.371.275 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:315][AICPUFW] [InitFd 315] InitFd end, deviceId=0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.371.288 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:100][AICPUFW] [Start 100] Begin start aicpu work task, deviceId=0, hostpid=40927. +[INFO] DEVMM(30223,aicpu_scheduler):2020-05-12-11:05:22.371.300 [hardware/dev_plat/../dev_plat/devmm/agentmm/agentmm_svm.c:137][drvMemInitSvmDevice 137] init svm start pid=40927. +[INFO] DEVMM(30223,aicpu_scheduler):2020-05-12-11:05:22.372.570 [hardware/dev_plat/../dev_plat/devmm/agentmm/agentmm_svm.c:120][devmm_init_svm_device 120] init svm (hpid:40927) succ. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.593 [hardware/dev_plat/aicpufw/aicpufw_api.c:89][AICPUFW] [drvCreateAicpuWorkTasks 89] drvCreateAicpuWorkTasks enter: chip_id = 0, pid=40927, mode=0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.610 [hardware/dev_plat/aicpufw/aicpufw_api.c:103][AICPUFW] [drvCreateAicpuWorkTasks 103] chip[0] start load kernel serve, pid=40927. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.739 [hardware/dev_plat/aicpufw/aicpufw_dev.c:226][AICPUFW] [aicpufw_dev_register_pid 226] chip0 register pid (40927). +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.839 [hardware/dev_plat/../dev_core/devdrv/devdrv_manager.c:838][devdrv] [drvGetCpuInfo 838] Dev[1] cpu info:1 14 1 4 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.875 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65531) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.891 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65515) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.902 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65530) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.914 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65514) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.923 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65529) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.935 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65513) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.943 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65528) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.955 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65512) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.964 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65527) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.976 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65511) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.985 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65526) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.372.998 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65510) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.007 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65525) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.019 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65509) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.029 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65524) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.041 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65508) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.050 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65523) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.061 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65507) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.070 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65522) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.081 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65506) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.090 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65521) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.101 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65505) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.110 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65520) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.122 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65504) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.130 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65519) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.142 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65503) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.150 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(65518) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.162 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(65502) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.170 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(0) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.182 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(0) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.191 [hardware/dev_plat/aicpufw/aicpufw_dev.c:209][AICPUFW] [aicpufw_dev_get_info 209] _ts_irq(0) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.202 [hardware/dev_plat/aicpufw/aicpufw_dev.c:210][AICPUFW] [aicpufw_dev_get_info 210] _cpu_irq(0) +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.215 [hardware/dev_plat/aicpufw/aicpufw_dev.c:142][AICPUFW] [aicpufw_dev_mmap 142] mmap opened fd=18. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.227 [hardware/dev_plat/aicpufw/aicpufw_dev.c:152][AICPUFW] [aicpufw_dev_mmap 152] start mmap, fd=18, offset: 4096, size: 258048. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.255 [hardware/dev_plat/aicpufw/aicpufw_dev.c:155][AICPUFW] [aicpufw_dev_mmap 155] finish mmap, fd=18, offset: 4096, size: 258048, addr: 0x0xfffefe877000. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.270 [hardware/dev_plat/aicpufw/aicpufw_thread.c:121][AICPUFW] [aicpufw_thread_data_init 121] chip[0] ts[0] finish mmap sram_offset[4096] sram_size[258048], ret[0] +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.287 [hardware/dev_plat/aicpufw/aicpufw_dev.c:142][AICPUFW] [aicpufw_dev_mmap 142] mmap opened fd=18. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.297 [hardware/dev_plat/aicpufw/aicpufw_dev.c:152][AICPUFW] [aicpufw_dev_mmap 152] start mmap, fd=18, offset: 262144, size: 1048576. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.323 [hardware/dev_plat/aicpufw/aicpufw_dev.c:155][AICPUFW] [aicpufw_dev_mmap 155] finish mmap, fd=18, offset: 262144, size: 1048576, addr: 0x0xfffefe777000. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.338 [hardware/dev_plat/aicpufw/aicpufw_thread.c:142][AICPUFW] [aicpufw_thread_data_init 142] chip[0] chip_info.chip_id is 0x6528. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.354 [hardware/dev_plat/aicpufw/aicpufw_dev.c:142][AICPUFW] [aicpufw_dev_mmap 142] mmap opened fd=18. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.368 [hardware/dev_plat/aicpufw/aicpufw_dev.c:152][AICPUFW] [aicpufw_dev_mmap 152] start mmap, fd=18, offset: 1310720, size: 4096. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.385 [hardware/dev_plat/aicpufw/aicpufw_dev.c:155][AICPUFW] [aicpufw_dev_mmap 155] finish mmap, fd=18, offset: 1310720, size: 4096, addr: 0x0xfffeffffa000. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.400 [hardware/dev_plat/aicpufw/aicpufw_thread.c:165][AICPUFW] [aicpufw_thread_data_init 165] finish mmap chip[0] ts[0] sram[0x0xfffefe877000] +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.420 [hardware/dev_plat/aicpufw/aicpufw_thread.c:710][AICPUFW] [aicpufw_thread_create 710] chip0 aicpu num: 14, first_aicpu: 2. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.441 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=0 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.454 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:0, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.852 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:0, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.872 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[0] id 281470656012688 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.874 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.737826] [aicpufw-drv] [aicpufw_init_dfx 467] there are 2 processes open,current tgid: 30223 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.881 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=0 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.892 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=1 begin +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.896 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.739661] [aicpufw-drv] [aicpufw_drv_add_match_info_check 1240] register pid(40927) ts_index(0) monitor_is_running(1). +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.900 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:1, ts_ind:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.910 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.739665] [aicpufw-drv] [aicpufw_drv_add_match_info 1282] register pid(40927) ts_index(0) monitor_is_running(1). +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.921 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.739680] [aicpufw-drv] [aicpufw_drv_get_moniter_info 1583] aicpufw event happened. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.930 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.739733] [devdrv] [devdrv_manager_get_cpu_info 1927] aicpu_num=14, ccpu_num=1 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.941 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740140] [aicpufw-drv] [aicpufw_drv_mmap 1123] mmap_sram,ts_index=0, offset=4096, ts_size=4096. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.940 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:1, ret:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.950 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740143] [aicpufw-drv] [aicpufw_drv_mmap_sram 974] sram status mem: virt_addr = 0xfffefe877000, tgid = 30223, size = 258048,offset = 4096, numa node = 0, ts = 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.952 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[1] id 281470647619984 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.962 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=1 end ret=0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.964 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740150] [aicpufw-drv] [aicpufw_drv_mmap_sram 995] finish sram status mem: virt_addr = 0xfffefe877000, tgid = 30223, size = 258048,offset = 4096, numa node = 0, ts = 0, ret = 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.973 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=2 begin +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.976 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740210] [aicpufw-drv] [aicpufw_drv_mmap 1127] mmap_gicd,ts_index=0, offset=262144, ts_size=4096, sram_size=258048. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.373.983 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:2, ts_ind:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.988 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740212] [aicpufw-drv] [aicpufw_drv_mmap_gicd 926] gicd status mem: virt_addr = 0xfffefe777000, tgid = 30223, size = 1048576,offset = 262144, numa node = 0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.373.999 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740278] [aicpufw-drv] [aicpufw_drv_mmap 1132] mmap_gicr,ts_index=0, offset=1310720, ts_size=4096, sram_size=258048, gicd_size=1048576. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.374.008 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.740280] [aicpufw-drv] [aicpufw_drv_mmap_gicr 892] ts gicr mem: virt_addr = 0xfffeffffa000, tgid = 30223, size = 4096,offset = 1310720, numa node = 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.011 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:2, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.023 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[2] id 281470639227280 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.033 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=2 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.042 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=3 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.051 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:3, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.079 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:3, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.090 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[3] id 281470630834576 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.099 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=3 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.109 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=4 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.118 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:4, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.154 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:4, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.168 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[4] id 281470622441872 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.178 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=4 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.190 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=5 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.199 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:5, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.230 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:5, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.243 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[5] id 281470614049168 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.253 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=5 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.265 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=6 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.275 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:6, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.307 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:6, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.321 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[6] id 281470605656464 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.330 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=6 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.342 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=7 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.351 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:7, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.381 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:7, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.395 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[7] id 281470597263760 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.404 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=7 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.415 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=8 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.425 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:8, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.455 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:8, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.469 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[8] id 281470588871056 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.478 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=8 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.490 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=9 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.499 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:9, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.528 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:9, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.541 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[9] id 281470580478352 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.550 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=9 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.561 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=10 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.571 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:10, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.599 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:10, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.612 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[10] id 281470572085648 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.621 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=10 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.633 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=11 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.642 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:11, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.676 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:11, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.690 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[11] id 281470563692944 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.699 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=11 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.711 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=12 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.720 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:12, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.748 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:12, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.762 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[12] id 281470555300240 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.771 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=12 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.783 [hardware/dev_plat/aicpufw/aicpufw_thread.c:720][AICPUFW] [aicpufw_thread_create 720] pthread_create for aicpu_index=13 begin +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.792 [hardware/dev_plat/aicpufw/aicpufw_thread.c:656][AICPUFW] [aicpufw_thread_create_one 656] thread_create_one chip_id:0, aicpu_index:13, ts_ind:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.820 [hardware/dev_plat/aicpufw/aicpufw_thread.c:682][AICPUFW] [aicpufw_thread_create_one 682] thread_create_one aicpu_index:13, ret:0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.833 [hardware/dev_plat/aicpufw/aicpufw_thread.c:689][AICPUFW] [aicpufw_thread_create_one 689] thread[13] id 281470546907536 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.842 [hardware/dev_plat/aicpufw/aicpufw_thread.c:722][AICPUFW] [aicpufw_thread_create 722] pthread_create for aicpu_index=13 end ret=0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.854 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.864 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.876 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.885 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.897 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.907 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.918 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.928 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.940 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.949 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.961 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.970 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.982 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.374.992 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.003 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.012 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.024 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.033 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.045 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.054 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.065 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.075 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.086 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.095 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.107 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.117 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.129 [hardware/dev_plat/aicpufw/aicpufw_thread.c:731][AICPUFW] [aicpufw_thread_create 731] sem_post start chip_id=0, ts_ind=0, aicpu_index13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.138 [hardware/dev_plat/aicpufw/aicpufw_thread.c:733][AICPUFW] [aicpufw_thread_create 733] sem_post end chip_id=0, ts_ind=0, aicpu_index13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.150 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.217 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 5] begin, tid: 30230. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.329 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 6] begin, tid: 30231. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.366 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 7, chip 0, ts 0, aicpu_index 5, thread id 30230 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.411 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.443 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 3] begin, tid: 30228. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.503 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 8] begin, tid: 30233. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.550 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 9] begin, tid: 30234. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.602 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 4] begin, tid: 30229. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.634 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 8, chip 0, ts 0, aicpu_index 6, thread id 30231 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.673 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.690 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.706 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.721 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.741 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.762 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.776 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.799 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 11, chip 0, ts 0, aicpu_index 9, thread id 30234 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.824 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.841 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.855 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.870 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.900 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 0] begin, tid: 30225. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.375.963 [hardware/dev_plat/../dev_core/devdrv/devdrv_aicpu.c:449][devdrv] [devdrv_load_kernel_serve_thread 449] thread for load kernel start. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.027 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[11] begin, tid: 30236. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.081 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[12] begin, tid: 30237. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.127 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 7] begin, tid: 30232. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.179 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[13] begin, tid: 30238. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.204 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 5, chip 0, ts 0, aicpu_index 3, thread id 30228 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.231 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.247 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.259 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.273 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.291 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 6, chip 0, ts 0, aicpu_index 4, thread id 30229 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.316 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.332 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.346 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.362 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.391 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 15, chip 0, ts 0, aicpu_index 13, thread id 30238 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.431 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.447 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.462 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.477 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.500 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 2, chip 0, ts 0, aicpu_index 0, thread id 30225 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.528 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.545 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.559 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.578 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.604 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[10] begin, tid: 30235. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.657 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 2] begin, tid: 30227. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.706 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:181][AICPUFW] [EventThreadTask 181] Aicpu device[0]:thread[ 1] begin, tid: 30226. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.731 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 13, chip 0, ts 0, aicpu_index 11, thread id 30236 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.760 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 3, chip 0, ts 0, aicpu_index 1, thread id 30226 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.785 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.801 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.815 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.830 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.851 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 4, chip 0, ts 0, aicpu_index 2, thread id 30227 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.878 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.894 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.908 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.925 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.945 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index0 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.963 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.978 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index1 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.376.993 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.008 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index2 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.023 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.039 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index3 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.054 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.070 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index4 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.085 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.099 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index5 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.114 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.130 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index6 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.145 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.168 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 9, chip 0, ts 0, aicpu_index 7, thread id 30232 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.195 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.211 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.225 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.242 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.261 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 10, chip 0, ts 0, aicpu_index 8, thread id 30233 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.284 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.300 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.315 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.330 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.351 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 12, chip 0, ts 0, aicpu_index 10, thread id 30235 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.377 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.393 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.407 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.422 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.441 [hardware/dev_plat/aicpufw/aicpufw_thread.c:475][AICPUFW] [aicpufw_thread_set_affinity 475] thread_set_affinity, bind_cpu_index 14, chip 0, ts 0, aicpu_index 12, thread id 30237 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.465 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.481 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.496 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.510 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.527 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index7 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.543 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.558 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index8 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.572 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.587 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index9 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.602 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.618 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index10 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.633 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.652 [hardware/dev_plat/aicpufw/aicpufw_thread.c:536][AICPUFW] [aicpufw_thread_callback 536] sem_wait start, chip_id: 0, ts_ind: 0, aicpu index: 11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.668 [hardware/dev_plat/aicpufw/aicpufw_thread.c:538][AICPUFW] [aicpufw_thread_callback 538] sem_wait end, chip_id: 0, ts_ind: 0, aicpu index: 11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.692 [hardware/dev_plat/aicpufw/aicpufw_thread.c:546][AICPUFW] [aicpufw_thread_callback 546] sem_post start, chip_id: 0, ts_ind: 0, aicpu index: 11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.703 [hardware/dev_plat/aicpufw/aicpufw_thread.c:548][AICPUFW] [aicpufw_thread_callback 548] sem_post end, chip_id: 0, ts_ind: 0, aicpu index: 11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.713 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index11 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.725 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.734 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index12 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.742 [hardware/dev_plat/aicpufw/aicpufw_thread.c:737][AICPUFW] [aicpufw_thread_create 737] sem_wait start chip_id=0, ts_ind=0, aicpu_index13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.749 [hardware/dev_plat/aicpufw/aicpufw_thread.c:739][AICPUFW] [aicpufw_thread_create 739] sem_wait end chip_id=0, ts_ind=0, aicpu_index13 +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.761 [hardware/dev_plat/aicpufw/aicpufw_timer.c:133][AICPUFW] [aicpufw_timer_init 133] aicpufw_timer_init end, AICPU_TASK_TIMEOUT=30. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.377.775 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.743120] [devdrv] [devdrv_manager_get_kernel_lib_process 198] begin to get kernel lib, device pid: 30223. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.377.790 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.743123] [devdrv] [devdrv_manager_get_kernel_lib_process 211] host_pid: 40927. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.377.799 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.743131] [devdrv] [devdrv_manager_get_kernel_lib_process 247] begin to wait, host pid: 40927, device pid: 30223. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.833 [hardware/dev_plat/aicpufw/aicpufw_supervisor_thread.c:173][AICPUFW] [aicpufw_sup_thread_proc 173] supervisor thread begin, current tid:30239 thread +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.854 [hardware/dev_plat/aicpufw/aicpufw_thread.c:797][AICPUFW] [aicpufw_thread_init 797] chip_id 0 thread init end. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.866 [hardware/dev_plat/aicpufw/aicpufw_api.c:77][AICPUFW] [aicpufw_create_work_tasks 77] drvCreateAicpuWorkTasks exit: chip_id = 0, pid=40927, mode=0. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.377.892 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:233][AICPUFW] [StartTdtServer 233] Start tdt server, deviceId=0. +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.377.932 [tdt/device/../common/src/log.cpp:158]BindCpu init and bindCoreList size is 1,[tdt/device/src/hdc/bind_cpu.cpp:38:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.034 [tdt/device/../common/src/log.cpp:158]BindCpu cpu core num = 64,[tdt/device/src/hdc/bind_cpu.cpp:40:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.051 [tdt/device/../common/src/log.cpp:158]BindCoreList member is 1,[tdt/device/src/hdc/bind_cpu.cpp:42:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.075 [tdt/device/../common/src/log.cpp:158]Begin to Init tdtserver [devicID_=0] and [newInputDeviceId=0],[tdt/device/src/hdc/tdt_server_impl.cpp:664:Init]30223 Msg: running ok +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.110 [tdt/device/../common/src/log.cpp:143]{"Start":"TDT_RECV"},[tdt/device/../common/src/statistic.cpp:113:PeriodStatisticManager]30223 Msg: warnging +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.128 [tdt/device/../common/src/log.cpp:143]{"Start":"DP_ENQUEUE"},[tdt/device/../common/src/statistic.cpp:114:PeriodStatisticManager]30223 Msg: warnging +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.147 [tdt/device/../common/src/log.cpp:143]{"Start":"RECV_ENLARGE"},[tdt/device/../common/src/statistic.cpp:115:PeriodStatisticManager]30223 Msg: warnging +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.167 [tdt/device/../common/src/log.cpp:143]{"Start":"RECV_REDUCE"},[tdt/device/../common/src/statistic.cpp:116:PeriodStatisticManager]30223 Msg: warnging +[WARNING] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.185 [tdt/device/../common/src/log.cpp:143]{"Start":"RELEASE_DATA"},[tdt/device/../common/src/statistic.cpp:117:PeriodStatisticManager]30223 Msg: warnging +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.285 [tdt/device/../common/src/log.cpp:158]HdcServer::Init Start,[tdt/device/../common/src/hdc_server.cpp:104:Init]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.378.335 [hardware/dev_plat/../dev_plat/devhdc/hdc_server.c:287][drvHdcServerCreate:287] >>> create server (listen device: 0) success +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.356 [tdt/device/../common/src/log.cpp:158]HdcCommon::InitMsgSize Start,[tdt/device/../common/src/hdc_common.cpp:28:InitMsgSize]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.374 [tdt/device/../common/src/log.cpp:158]msgMaxSize_ = 524224, msgShortHeadDataMaxSize_ = 524212 msgLongHeadDataMaxSize_ = 524200,[tdt/device/../common/src/hdc_common.cpp:42:InitMsgSize]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.410 [tdt/device/../common/src/log.cpp:158]hdcserver in tdtserver is already initialed,[tdt/device/src/hdc/tdt_server_impl.cpp:652:InitDirectly]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.428 [tdt/device/../common/src/log.cpp:158]Begin to init device's hdc channel of tdt.,[tdt/device/src/hdc/tdt_server.cpp:32:TDTServerInit]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.448 [tdt/device/../common/src/log.cpp:158]begin tdt device init, [deviceId=0],[tdt/device/src/hdc/tdt_device_impl.cpp:65:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.466 [tdt/device/../common/src/log.cpp:158]TuningDataTransfer is initialized with deviceID:0,[tdt/device/src/hdc/tuning_data_transfer.cpp:71:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.640 [tdt/device/../common/src/log.cpp:158]HdcCommon::InitMsgSize Start,[tdt/device/../common/src/hdc_common.cpp:28:InitMsgSize]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.657 [tdt/device/../common/src/log.cpp:158]msgMaxSize_ = 524224, msgShortHeadDataMaxSize_ = 524212 msgLongHeadDataMaxSize_ = 524200,[tdt/device/../common/src/hdc_common.cpp:42:InitMsgSize]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.673 [tdt/device/../common/src/log.cpp:158]capacity.maxSegment: 524224,[tdt/device/../common/src/hdc_client.cpp:152:Init]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.690 [tdt/device/../common/src/log.cpp:158]HdcClient::CreateHdcSession Start,[tdt/device/../common/src/hdc_client.cpp:284:CreateHdcSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.809 [tdt/device/../common/src/log.cpp:158]HdcServer::Accept thread = 281470521594256,[tdt/device/../common/src/hdc_server.cpp:259:Accept]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.878 [tdt/device/../common/src/log.cpp:158][HdcClient] deviceId: 0 connect session,[tdt/device/../common/src/hdc_client.cpp:306:CreateHdcSession]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.378.908 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:1609][drvHdcSetSessionReference:1609] >>> session 56, pid 30223 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.926 [tdt/device/../common/src/log.cpp:158][HdcClient] drvHdcSetSessionReference success,[tdt/device/../common/src/hdc_client.cpp:317:CreateHdcSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.378.945 [tdt/device/../common/src/log.cpp:158][HdcClient] deviceId: 0 connect session and drvHdcSetSessionReference success, sessionId=1,[tdt/device/../common/src/hdc_client.cpp:327:CreateHdcSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.006 [tdt/device/../common/src/log.cpp:158][HdcClient] SendPidMsg sessionId=1, tdt_main_pid=30223,[tdt/device/../common/src/hdc_client.cpp:346:sendPidMsg]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.073 [tdt/device/../common/src/log.cpp:158]TuningDataTransfer tdt client wait for send data begin,[tdt/device/src/hdc/tuning_data_transfer.cpp:173:CreateSingleSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.101 [tdt/device/../common/src/log.cpp:158]BindCPUCore Start,[tdt/device/src/hdc/bind_cpu.cpp:58:BindCPUCore]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.213 [tdt/device/../common/src/log.cpp:158]BindCpu thread=281470521594256 CPU_ISSET successfully on processor[1],[tdt/device/src/hdc/bind_cpu.cpp:103:BindCPUCore]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.239 [tdt/device/../common/src/log.cpp:158]Thread[281470521594256] bindCpu setaffinity successfully,[tdt/device/src/hdc/bind_cpu.cpp:109:BindCPUCore]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.282 [tdt/device/../common/src/log.cpp:158]Free Tdt thread ID = 281470529986960,[tdt/device/src/hdc/tdt_server_impl.cpp:555:FreeTdtMemoryThread]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.304 [tdt/device/../common/src/log.cpp:158]BindCPUCore Start,[tdt/device/src/hdc/bind_cpu.cpp:58:BindCPUCore]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.359 [tdt/device/../common/src/log.cpp:158]TimerFunc thread = 281470538379664,[tdt/device/../common/src/statistic.cpp:140:TimerFunc]30240 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.377 [tdt/device/../common/src/log.cpp:158]HdcServer::AcceptConnection Start,[tdt/device/../common/src/hdc_server.cpp:310:AcceptHdcSession]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.403 [tdt/device/../common/src/log.cpp:158]BindCpu thread=281470529986960 CPU_ISSET successfully on processor[1],[tdt/device/src/hdc/bind_cpu.cpp:103:BindCPUCore]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.421 [tdt/device/../common/src/log.cpp:158]BindCPUCore Start,[tdt/device/src/hdc/bind_cpu.cpp:58:BindCPUCore]30240 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.476 [tdt/device/../common/src/log.cpp:158]BindCPUCore Start,[tdt/device/src/hdc/bind_cpu.cpp:58:BindCPUCore]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.496 [tdt/device/../common/src/log.cpp:158]Thread[281470529986960] bindCpu setaffinity successfully,[tdt/device/src/hdc/bind_cpu.cpp:109:BindCPUCore]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.516 [tdt/device/../common/src/log.cpp:158][deviceId=0] Free Tdt thread is success to bind cpu core,[tdt/device/src/hdc/tdt_server_impl.cpp:559:FreeTdtMemoryThread]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.534 [tdt/device/../common/src/log.cpp:158]BindCpu thread=281470538379664 CPU_ISSET successfully on processor[1],[tdt/device/src/hdc/bind_cpu.cpp:103:BindCPUCore]30240 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.550 [tdt/device/../common/src/log.cpp:158]Thread[281470538379664] bindCpu setaffinity successfully,[tdt/device/src/hdc/bind_cpu.cpp:109:BindCPUCore]30240 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.576 [tdt/device/../common/src/log.cpp:158]BindCpu thread=281470513033616 CPU_ISSET successfully on processor[1],[tdt/device/src/hdc/bind_cpu.cpp:103:BindCPUCore]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.591 [tdt/device/../common/src/log.cpp:158]Thread[281470513033616] bindCpu setaffinity successfully,[tdt/device/src/hdc/bind_cpu.cpp:109:BindCPUCore]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.637 [tdt/device/../common/src/log.cpp:158]TuningDataTransfer find channel OK, sessionID: 1,[tdt/device/src/hdc/tuning_data_transfer.cpp:126:SetSendFlagBySessionID]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.664 [tdt/device/../common/src/log.cpp:158]TuningDataTransfer tdt client wait for send data end,[tdt/device/src/hdc/tuning_data_transfer.cpp:178:CreateSingleSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.688 [tdt/device/../common/src/log.cpp:158]Begin to start send thread.,[tdt/device/src/hdc/tdt_device_impl.cpp:179:StartSendThread]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.732 [tdt/device/../common/src/log.cpp:158]Success start send thread.,[tdt/device/src/hdc/tdt_device_impl.cpp:181:StartSendThread]30223 Msg: running ok +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.379.746 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:265][AICPUFW] [StartTdtServer 265] TDT server init success. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.379.758 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:135][AICPUFW] [Start 135] Aicpu_scheduler has started, deviceId=0, hostpid=40927. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:22.379.771 [aicpu/aicpu_device/aicpu_schedule/compute_process/main.cc:206][AICPUFW] [main 206] Compute process start success. +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.793 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] TsdWaitForShutdownProc() deviceId: 0 waitType:1(0:HCCP,1:COMPUTE) is running,[tdt/device/src/tsd/ppc_client.cpp:220:TsdWaitForShutdownProc]30223 Msg: running ok +[EVENT] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.810 [tdt/device/../common/src/log.cpp:149][PPCCLIEVENT] TsdWaitForShutdown!,[tdt/device/src/tsd/ppc_client.cpp:225:TsdWaitForShutdownProc]30223 +[EVENT] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.826 [tdt/device/../common/src/log.cpp:149][PPCCLIEVENT] TsdWaitForShutdown Start Rsp device[0] procType:1(0:HCCP,1:COMPUTE), subProcPid[30223] ,[tdt/device/src/tsd/ppc_client.cpp:244:TsdWaitForShutdownProc]30223 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.846 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] GetPpcSession() will Create session use serverId: 19280,[tdt/device/src/tsd/ppc_client.cpp:110:GetPpcSession]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:22.379.899 [hardware/dev_plat/../dev_plat/devhdc/hdc_ppc.c:129][drvPpcSessionConnect:129] >>> Ppc connect session 26, pid 30223 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.917 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] [serverId=19280] GetPpcSession() receive thread has been started,[tdt/device/src/tsd/ppc_client.cpp:118:GetPpcSession]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.379.935 [tdt/device/../common/src/log.cpp:158]PpcInterface::SendMsg,size=10, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:39:SendMsg]30223 Msg: running ok +[INFO] HDC(8380,tsdaemon):2020-05-12-11:05:22.379.941 [hardware/dev_plat/../dev_plat/devhdc/hdc_ppc.c:268][drvPpcSessionAccept:268] >>> Ppc Accept Session 16, Server fd 12, pid 8380 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.380.006 [tdt/device/../common/src/log.cpp:158]tdt device begin to send to host.,[tdt/device/src/hdc/tdt_device_impl.cpp:275:TdtDeviceSendImpl]30244 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:22.380.025 [tdt/device/../common/src/log.cpp:158]begin to check queueDataSize_.,[tdt/device/src/hdc/tdt_device_impl.cpp:286:TdtDeviceSendImpl]30244 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.091 [tdt/device/../common/src/log.cpp:158]PpcInterface::RecvMsg, size=10, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:122:RecvMsg]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.114 [tdt/device/../common/src/log.cpp:158][PpcServer] SetPpcSession, deviceId:0, subProcPid:30223,[tdt/device/src/tsd/ppc_server.cpp:338:SetPpcSession]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.139 [tdt/device/../common/src/log.cpp:158][TSDaemon]PPCSerToTsdMsg deviceId[0], subProcPid[30223]msgType[0](0:START RSP,2:SHUTDOWN,1:SHUTDOWN RSP,3:SOCKET CLOSE), procType[1](0:HCCP,1:COMPUTE) state[6],[tdt/device/src/tsd/tsdaemon.cpp:1441:PPCSerToTsdMsg]30245 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.160 [tdt/device/../common/src/log.cpp:149][TsdEVENT] #### PPCSer->TSD RspMsg device[0] Start Rsp procType[1] ####,[tdt/device/src/tsd/tsdaemon.cpp:1406:PPCSerToTsdProc]30245 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.205 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] ##### [threadName:ppc_srv_recv_0] RecvData [ret=16846848] Save [notifyDeviceId:0] [notifyProcType:1]####,[tdt/device/src/tsd/ppc_server.cpp:242:RecvData]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.256 [tdt/device/../common/src/log.cpp:158][TSDaemon] StartRspProc() [dev=0][subProcPid=30223][procType=1(0:HCCP,1:COMPUTE)][tid=281470572192176]!,[tdt/device/src/tsd/tsdaemon.cpp:1190:StartRspProc]30246 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.276 [tdt/device/../common/src/log.cpp:158][TSDaemon] StartRspProc curState is: 6,[tdt/device/src/tsd/tsdaemon.cpp:1193:StartRspProc]30246 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.295 [tdt/device/../common/src/log.cpp:158][TSDaemon] GetTsdToFmkMsg deviceId[0] subProcPid[30223],[tdt/device/src/tsd/tsdaemon.cpp:959:GetTsdToFmkMsg]30246 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.314 [tdt/device/../common/src/log.cpp:158][TSDaemon] tsdToFmkSessionIdMap size = 1,[tdt/device/src/tsd/tsdaemon.cpp:964:GetTsdToFmkMsg]30246 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.331 [tdt/device/../common/src/log.cpp:158][TSDaemon] tsdToFmkSessionIdMap [deviceId] size = 1,[tdt/device/src/tsd/tsdaemon.cpp:967:GetTsdToFmkMsg]30246 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.349 [tdt/device/../common/src/log.cpp:158][TSDaemon] SendRspMsgToFmk deviceId: 0, subProcPid: 30223, sessionID: 1,[tdt/device/src/tsd/tsdaemon.cpp:1016:SendRspMsgToFmk]30246 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.364 [tdt/device/../common/src/log.cpp:149][TsdEVENT] #### Start Rsp TSD->FMK device[0] sessionID[1] realDeviceId[0]####,[tdt/device/src/tsd/tsdaemon.cpp:1018:SendRspMsgToFmk]30246 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:22.380.402 [tdt/device/../common/src/log.cpp:158][TSDaemon] StartRspProc subRunState is: 3,[tdt/device/src/tsd/tsdaemon.cpp:1173:TsdWaitRspProcForStar]30246 Msg: running ok +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:22.381.752 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48430.745228] [hdcdrv] [hdcdrv_server_create 2330] dev_id 0 service_type service_TDT server create +[EVENT] TDT(30223,aicpu_scheduler):2020-05-12-11:05:23.379.610 [tdt/device/../common/src/log.cpp:149],[tdt/common/common_inc/queue_manager.h:683:ShowSizeForEveryChannel]30240 +[EVENT] TDT(30223,aicpu_scheduler):2020-05-12-11:05:23.379.656 [tdt/device/../common/src/log.cpp:149]"DeviceSendPool: " "DeviceRecvPool: " "HostRecvPool: " "DeviceCtrlPool: {SendPool: 0, FreePool: 0}, {RecvPool: 0, FreePool: 0}",[tdt/device/../common/src/memory_pool.cpp:707:GetDevicePoolStatus]30240 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:23.379.673 [tdt/device/../common/src/log.cpp:158]DeviceRecNormalData: Device receive normal message number:0,[tdt/device/../common/src/memory_pool.cpp:709:GetDevicePoolStatus]30240 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.322 [tdt/device/../common/src/log.cpp:158]tsdaemon get process sign successfully, procpid:0 signSize:0,[tdt/device/src/tsd/tsdaemon.cpp:901:FmkToTsdMsg]30221 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.360 [tdt/device/../common/src/log.cpp:149][TsdEVENT]FmkToTsdMsg dev[0] msg[7] sessionId[1] realDev[0] fmkSignPid[0] profilingMode[0] rankSize[1],[tdt/device/src/tsd/tsdaemon.cpp:905:FmkToTsdMsg]30221 +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.375 [tdt/device/../common/src/log.cpp:149][TsdEVENT]From FMK Close <<<<<<<<<<< TSDdev[0] sessionId[1] realDev[0] fmkPid[0],[tdt/device/src/tsd/tsdaemon.cpp:861:FmkToTsdMsgProc]30221 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.397 [tdt/device/../common/src/log.cpp:158][TSDaemon] Begin closeSubProcess deviceId:0, sessionId:1, cpProcPid:30223, hccpProcPid:0, subProcState:3,[tdt/device/src/tsd/tsdaemon.cpp:729:CloseSubProcess]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.414 [tdt/device/../common/src/log.cpp:158][TSDaemon] SetTsdToFmkMsg:deviceId[0], sessionId[1], subProcPid[30223],[tdt/device/src/tsd/tsdaemon.cpp:774:SetTsdToFmkMsg]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.429 [tdt/device/../common/src/log.cpp:158][TSDaemon] Process HCCP is abandoned to close, the rank size is 1,[tdt/device/src/tsd/tsdaemon.cpp:747:CloseSubProcess]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.473 [tdt/device/../common/src/log.cpp:158][TSDaemon] start delete file, direct is /home/HwHiAiUser/hdcd/device0/,[tdt/device/src/tsd/tsdaemon.cpp:1878:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.509 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is .,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.524 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is ..,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.541 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is etc,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.560 [tdt/device/../common/src/log.cpp:158][TSDaemon] start scan file, ent name is upgrade,[tdt/device/src/tsd/tsdaemon.cpp:1887:DeleteFileByPath]30221 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.624 [tdt/device/../common/src/log.cpp:158][PpcServer] GetPpcSession, deviceId:0, subProcPid:30223,[tdt/device/src/tsd/ppc_server.cpp:324:GetPpcSession]30255 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.648 [tdt/device/../common/src/log.cpp:158]PpcInterface::SendMsg,size=12, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:39:SendMsg]30255 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.686 [tdt/device/../common/src/log.cpp:158][TSDaemon] Begin ExecuteClose deviceId:0, subProcPid:30223,[tdt/device/src/tsd/tsdaemon.cpp:703:ExecuteClose]30255 Msg: running ok +[OPLOG] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.704 [tdt/device/../common/src/log.cpp:151][tdt/device/src/tsd/tsdaemon.cpp:705:ExecuteClose]30255 free resource {devOS:[30223]} for {dev:0} +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.731 [tdt/device/../common/src/log.cpp:149][TsdEVENT] #### Send TSD->SubProcess[PPCSer] Close Msg Device[0] proType[1] [tid=281470597370288]####,[tdt/device/src/tsd/tsdaemon.cpp:709:ExecuteClose]30255 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.728 [tdt/device/../common/src/log.cpp:158]PpcInterface::RecvMsg, size=12, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:122:RecvMsg]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.755 [tdt/device/../common/src/log.cpp:158]PpcClient::RecvMsgProc, size=12, subpid=30223,[tdt/device/src/tsd/ppc_client.cpp:150:RecvMsgProc]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.773 [tdt/device/../common/src/log.cpp:158]PpcClient::RecvMsgProc, subpid1=30223, subpid2=30223,[tdt/device/src/tsd/ppc_client.cpp:160:RecvMsgProc]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.789 [tdt/device/../common/src/log.cpp:158]PpcInterface::SendMsg,size=12, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:39:SendMsg]30223 Msg: running ok +[EVENT] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.816 [tdt/device/../common/src/log.cpp:149][PPCCLIEVENT] #### PPCClient->TSD Close Rsp send OK device[0] procType:1 ####,[tdt/device/src/tsd/ppc_client.cpp:166:RecvMsgProc]30223 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.832 [tdt/device/../common/src/log.cpp:158][PPCClient]Process Exit DevId:0 procType:1(0:HCCP,1:COMPUTE),[tdt/device/src/tsd/ppc_client.cpp:200:RecvData]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.063.848 [tdt/device/../common/src/log.cpp:158]TsdWaitForShutdown exit,[tdt/device/src/tsd/ppc_client.cpp:274:TsdWaitForShutdown]30223 Msg: running ok +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:24.063.861 [aicpu/aicpu_device/aicpu_schedule/compute_process/main.cc:214][AICPUFW] [main 214] Tsd wait for shut down success. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:24.063.872 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:272][AICPUFW] [StopTdtServer 272] Stop tdt server, deviceId=0. +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.063.987 [tdt/device/../common/src/log.cpp:158]PpcInterface::RecvMsg, size=12, subpid=30223,[tdt/device/src/tsd/ppc_interface.cpp:122:RecvMsg]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.025 [tdt/device/../common/src/log.cpp:158][PpcServer] SetPpcSession, deviceId:0, subProcPid:30223,[tdt/device/src/tsd/ppc_server.cpp:338:SetPpcSession]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.057 [tdt/device/../common/src/log.cpp:158][TSDaemon]PPCSerToTsdMsg deviceId[0], subProcPid[30223]msgType[1](0:START RSP,2:SHUTDOWN,1:SHUTDOWN RSP,3:SOCKET CLOSE), procType[1](0:HCCP,1:COMPUTE) state[6],[tdt/device/src/tsd/tsdaemon.cpp:1441:PPCSerToTsdMsg]30245 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.078 [tdt/device/../common/src/log.cpp:149][TsdEVENT] #### PPCSer->TSD RspMsg device[0] Close Rsp procType[1] ####,[tdt/device/src/tsd/tsdaemon.cpp:1415:PPCSerToTsdProc]30245 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.195 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] ##### [threadName:ppc_srv_recv_0] RecvData [ret=16846848] Save [notifyDeviceId:0] [notifyProcType:1]####,[tdt/device/src/tsd/ppc_server.cpp:242:RecvData]30245 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.227 [tdt/device/../common/src/log.cpp:158]tdtserver is destroying, [devicID_=0],[tdt/device/src/hdc/tdt_server_impl.cpp:709:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.248 [tdt/device/../common/src/log.cpp:158]Stop QueueManager success,[tdt/device/src/hdc/tdt_server_impl.cpp:716:Destroy]30223 Msg: running ok +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:24.064.263 [datapreprocess/src/dp_interface.cc:288][DP_PREPROCESS] [I] [datapreprocess/src/dp_interface.cc:288] Release blocked TDT threads. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:24.064.280 [datapreprocess/src/dp_interface.cc:406][DP_PREPROCESS] [I] [datapreprocess/src/dp_interface.cc:406] Begin write queue blocking eventfd of source(). +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:24.064.294 [datapreprocess/src/dp_interface.cc:409][DP_PREPROCESS] [I] [datapreprocess/src/dp_interface.cc:409] Got empty source name, start write all blocking eventfd. +[INFO] DP(30223,aicpu_scheduler):2020-05-12-11:05:24.064.305 [datapreprocess/src/dp_interface.cc:291][DP_PREPROCESS] [I] [datapreprocess/src/dp_interface.cc:291] All TDT threads mark info memory have released. +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.320 [tdt/device/../common/src/log.cpp:158]DataPreprocess exited,[tdt/device/src/hdc/tdt_server_impl.cpp:720:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.338 [tdt/device/../common/src/log.cpp:158]Enqueue Thread exited,[tdt/device/src/hdc/tdt_server_impl.cpp:722:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.368 [tdt/device/../common/src/log.cpp:158][deviceId=0] Free Tdt thread is exist,total free number = 0,enqueue number is = 0,[tdt/device/src/hdc/tdt_server_impl.cpp:570:FreeTdtMemoryThread]30241 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.412 [tdt/device/../common/src/log.cpp:158]Free Thread exited,[tdt/device/src/hdc/tdt_server_impl.cpp:725:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.064.428 [tdt/device/../common/src/log.cpp:158]enter HdcServer::Destroy() function,[tdt/device/../common/src/hdc_server.cpp:582:Destroy]30223 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.462 [tdt/device/../common/src/log.cpp:158][TSDaemon] CloseRspProc() [dev=0][subPid=30223][procType=1(0:HCCP,1:COMPUTE)][tid=281470588977584]!,[tdt/device/src/tsd/tsdaemon.cpp:1267:CloseRspProc]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.485 [tdt/device/../common/src/log.cpp:158][TSDaemon] CloseRspProc curState is: 6,[tdt/device/src/tsd/tsdaemon.cpp:1271:CloseRspProc]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.508 [tdt/device/../common/src/log.cpp:158][TSDaemon] GetTsdToFmkMsg deviceId[0] subProcPid[30223],[tdt/device/src/tsd/tsdaemon.cpp:959:GetTsdToFmkMsg]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.527 [tdt/device/../common/src/log.cpp:158][TSDaemon] tsdToFmkSessionIdMap size = 1,[tdt/device/src/tsd/tsdaemon.cpp:964:GetTsdToFmkMsg]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.544 [tdt/device/../common/src/log.cpp:158][TSDaemon] tsdToFmkSessionIdMap [deviceId] size = 1,[tdt/device/src/tsd/tsdaemon.cpp:967:GetTsdToFmkMsg]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.568 [tdt/device/../common/src/log.cpp:158][TSDaemon] subProcessPid is 30223 on device[0], procType[1](0:HCCP PROC,1:COMPUTE PROC),[tdt/device/src/tsd/tsdaemon.cpp:1085:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.064.588 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.074.535 [hardware/dev_plat/../dev_plat/devhdc/hdc_server.c:367][drvHdcServerDestroy:367] >>> destroy server success, deviceId 0, serviceType 10 +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.074.556 [hardware/dev_plat/../dev_plat/devhdc/hdc_server.c:236][drvHdcPcieSessionAccept:236] >>> device:0 server 10 is destroyed, ret:18 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.575 [tdt/device/../common/src/log.cpp:158]drv accept exception, because acceptSwitch has been set false, ret=18,[tdt/device/../common/src/hdc_server.cpp:324:AcceptHdcSession]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.592 [tdt/device/../common/src/log.cpp:158]acceptSwitch has been set false,[tdt/device/../common/src/hdc_server.cpp:269:Accept]30242 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.634 [tdt/device/../common/src/log.cpp:158][HdcServer] SessionIdPidMsg enter into ClearSessionIdPid,[tdt/device/../common/src/hdc_server.cpp:495:ClearSessionIdPid]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.658 [tdt/device/../common/src/log.cpp:158]Begin StopMemoryPool,[tdt/device/../common/src/memory_pool.cpp:3389:StopMemoryPool]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.685 [tdt/device/../common/src/log.cpp:158]DestroyMemoryPool, memoryEnd = 2,[tdt/device/../common/src/memory_pool.cpp:1323:DestroyMemoryPool]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.703 [tdt/device/../common/src/log.cpp:158]FreeMemoryByMap, memoryEnd = 2, memoryType = 1, devId_ = 0,[tdt/device/../common/src/memory_pool.cpp:1131:FreeMemoryByMap]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.721 [tdt/device/../common/src/log.cpp:158]FreeMemoryByMap, memoryEnd = 2, memoryType = 1, devId_ = 0,[tdt/device/../common/src/memory_pool.cpp:1131:FreeMemoryByMap]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.743 [tdt/device/../common/src/log.cpp:158]hdcServer_ destroyed,[tdt/device/src/hdc/tdt_server_impl.cpp:735:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.759 [tdt/device/../common/src/log.cpp:158]Begin to destroy device's hdc channel of tdt.,[tdt/device/src/hdc/tdt_server.cpp:48:TDTServerStop]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.774 [tdt/device/../common/src/log.cpp:158]begin to destroy.,[tdt/device/src/hdc/tdt_device_impl.cpp:367:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.793 [tdt/device/../common/src/log.cpp:158]Stop QueueManager success,[tdt/device/src/hdc/tdt_device_impl.cpp:381:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.808 [tdt/device/../common/src/log.cpp:158]Begin to stop send thread.,[tdt/device/src/hdc/tdt_device_impl.cpp:192:StopSendThread]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.866 [tdt/device/../common/src/log.cpp:158]Success stop send thread.,[tdt/device/src/hdc/tdt_device_impl.cpp:196:StopSendThread]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.885 [tdt/device/../common/src/log.cpp:158]TuningDataTransfer destory hdc client,[tdt/device/src/hdc/tuning_data_transfer.cpp:456:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.900 [tdt/device/../common/src/log.cpp:158]enter HdcClient::Destroy() function,[tdt/device/../common/src/hdc_client.cpp:468:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.917 [tdt/device/../common/src/log.cpp:158]begin drvHdcSessionClose,[tdt/device/../common/src/hdc_client.cpp:415:ClearAllSession]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.074.930 [hardware/dev_plat/../dev_plat/devhdc/hdc_client.c:413][drvHdcClientSessionClose:413] >>> destroy client session(sock: 56) +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.960 [tdt/device/../common/src/log.cpp:158]end drvHdcSessionClose,[tdt/device/../common/src/hdc_client.cpp:420:ClearAllSession]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.074.976 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:1300][drvHdcRecvMsgLen:1300] >>> the session 56 local or remote was closed +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.074.996 [tdt/device/../common/src/log.cpp:158]begin HdcClient::JoinAllRecvThread,[tdt/device/../common/src/hdc_client.cpp:383:JoinAllRecvThread]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.016 [tdt/device/../common/src/log.cpp:158]drvHdcRecv() return 25,[tdt/device/../common/src/hdc_common.cpp:494:RecvHdcDefaultMsg]30243 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.075.018 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.038 [tdt/device/../common/src/log.cpp:158]Receive() return 17903651, which means : hdc service or client socket closed,[tdt/device/../common/src/hdc_common.cpp:438:RecvMsg]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.057 [tdt/device/../common/src/log.cpp:158][deviceId=0][sessionId=1] recv runswitch has been set false,[tdt/device/../common/src/hdc_client.cpp:175:RecvData]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.072 [tdt/device/../common/src/log.cpp:158][deviceId=0] the recv data pthread exit,[tdt/device/../common/src/hdc_client.cpp:190:RecvData]30243 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.138 [tdt/device/../common/src/log.cpp:158]end HdcClient::JoinAllRecvThread,[tdt/device/../common/src/hdc_client.cpp:392:JoinAllRecvThread]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.156 [tdt/device/../common/src/log.cpp:158]begin drvHdcClientDestroy,[tdt/device/../common/src/hdc_client.cpp:450:DestroyClient]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.236 [tdt/device/../common/src/log.cpp:158]end drvHdcClientDestroy,[tdt/device/../common/src/hdc_client.cpp:455:DestroyClient]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.252 [tdt/device/../common/src/log.cpp:158]begin HdcClient::ClearClientPtr,[tdt/device/../common/src/hdc_client.cpp:432:ClearClientPtr]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.269 [tdt/device/../common/src/log.cpp:158]end HdcClient::ClearClientPtr,[tdt/device/../common/src/hdc_client.cpp:440:ClearClientPtr]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.284 [tdt/device/../common/src/log.cpp:158]begin HdcClient::ClearAll,[tdt/device/../common/src/hdc_client.cpp:401:ClearAll]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.299 [tdt/device/../common/src/log.cpp:158]end HdcClient::ClearAll,[tdt/device/../common/src/hdc_client.cpp:404:ClearAll]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.314 [tdt/device/../common/src/log.cpp:158]end HdcClient::Destroy() function,[tdt/device/../common/src/hdc_client.cpp:476:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.330 [tdt/device/../common/src/log.cpp:158]success destroy.,[tdt/device/src/hdc/tdt_device_impl.cpp:388:Destroy]30223 Msg: running ok +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:24.075.343 [aicpu/aicpu_device/aicpu_schedule/compute_process/compute_process.cc:277][AICPUFW] [StopTdtServer 277] TDT server stop success. +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:24.075.355 [hardware/dev_plat/aicpufw/aicpufw_dev.c:94][AICPUFW] [aicpufw_dev_close 94] chip_id:0 will be closed, fd=18. +[TRACE] DP(30223,aicpu_scheduler):2020-05-12-11:05:24.075.373 [status:STOP] [datapreprocess/src/task_queue.cc:292]DP_PREPROCESS module has been closed +[INFO] DRV(30223,aicpu_scheduler):2020-05-12-11:05:24.075.389 [aicpu/aicpu_device/aicpu_schedule/compute_process/main.cc:219][AICPUFW] [main 219] Compute process stopped. +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.408 [tdt/device/../common/src/log.cpp:158]PpcClient::~PpcClient() destructor function called,[tdt/device/src/tsd/ppc_client.cpp:23:~PpcClient]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.422 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] Destroy() enter,[tdt/device/src/tsd/ppc_client.cpp:44:Destroy]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.075.437 [hardware/dev_plat/../dev_plat/devhdc/hdc_ppc.c:151][drvPpcSessionDestroy:151] >>> Ppc Destroy session 26, pid 30223 +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.473 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] Destroy() call drvPpcSessionDestroy func return [drvRet:0],[tdt/device/src/tsd/ppc_client.cpp:54:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.490 [tdt/device/../common/src/log.cpp:158][TSDPPCCLI] Destroy() exit,[tdt/device/src/tsd/ppc_client.cpp:73:Destroy]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.508 [tdt/device/../common/src/log.cpp:158]TdtDeviceImpl::~TdtDeviceImpl() destructor function called.,[tdt/device/src/hdc/tdt_device_impl.cpp:54:~TdtDeviceImpl]30223 Msg: running ok +[INFO] TDT(30223,aicpu_scheduler):2020-05-12-11:05:24.075.532 [tdt/device/../common/src/log.cpp:158]TdtServerImpl::~TdtServerImpl() destructor function called,[tdt/device/src/hdc/tdt_server_impl.cpp:71:~TdtServerImpl]30223 Msg: running ok +[INFO] HDC(30223,aicpu_scheduler):2020-05-12-11:05:24.076.267 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:2002][drv_hdc_exit:2002] >>> HDC uninit success +[INFO] HDC(8380,tsdaemon):2020-05-12-11:05:24.077.353 [hardware/dev_plat/../dev_plat/devhdc/hdc_core.c:626][hdcSocketRecvPeek:626] >>> client connection closed: Success(errno: 0)(sock: 16) +[WARNING] TDT(8380,tsdaemon):2020-05-12-11:05:24.077.393 [tdt/device/../common/src/log.cpp:143][TSDPPCIF] drvPpcRecv fail 25,[tdt/device/src/tsd/ppc_interface.cpp:92:RecvMsg]30245 Msg: warnging +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.077.412 [tdt/device/../common/src/log.cpp:149][TSDPPCSER] 0 SOCKET_CLOSED notify dev[0] procType[1] ret=[17379389]?[17379389]TSD to clean,[tdt/device/src/tsd/ppc_server.cpp:199:RecvData]30245 +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.077.429 [tdt/device/../common/src/log.cpp:149][TSDPPCSER] 1 SOCKET_CLOSED notify dev[0] procType[1] ret[17379389] TSD to clean,[tdt/device/src/tsd/ppc_server.cpp:204:RecvData]30245 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.077.804 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.441417] [hdcdrv] [hdcdrv_server_destroy 2415] dev_id 0 service_type service_TDT server destroy +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.077.829 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.441427] [hdcdrv] [hdcdrv_accept 2470] dev_id 0 service_type service_TDT accept wait dev 0 quit, dev status 1, listen status 0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.077.841 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.441858] [hdcdrv] [hdcdrv_recv_peek 2899] dev 0 session 56 local or remote close, local_close_state closed_by_user, remote_close_state closed_by_user,local_session_fd 56, remote_session_fd 227. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.077.850 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.444353] [devdrv] [devdrv_manager_get_kernel_lib_process 251] wait_event_interruptible return: -512. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.077.860 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.444495] [devmm] [devmm_notifier_release_private 1225] device wait ts exit hostpid(40927) exit(0). +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.085.102 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.095.180 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.105.257 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.115.334 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.125.408 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.133.771 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.496591] [devmm] [devmm_notifier_release_private 1231] ts exited,device hostpid(40927) begin recover resource. +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.137.750 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.147.847 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.157.927 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.168.004 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.178.083 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.188.161 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.198.238 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.208.316 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.218.391 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.228.469 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.238.544 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.248.619 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.258.697 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.268.776 [tdt/device/../common/src/log.cpp:158]The current kill result is [0],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] DRV(8314,aicpufw_monitor):2020-05-12-11:05:24.275.875 [hardware/dev_plat/aicpufw/aicpufw_thread.c:931][AICPUFW] [aicpufw_monitor_recycle_so 931] recycle so pid_dir=/home/HwHiAiUser/tmp/30223/. +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.856 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642610] [aicpufw-drv] [aicpufw_drv_release_debug 650] 0 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.878 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642614] [aicpufw-drv] [aicpufw_drv_release_debug 650] 1 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.889 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642616] [aicpufw-drv] [aicpufw_drv_release_debug 650] 2 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.899 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642618] [aicpufw-drv] [aicpufw_drv_release_debug 650] 3 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.915 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642620] [aicpufw-drv] [aicpufw_drv_release_debug 650] 4 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.924 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642622] [aicpufw-drv] [aicpufw_drv_release_debug 650] 5 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.933 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642624] [aicpufw-drv] [aicpufw_drv_release_debug 650] 6 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.942 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642627] [aicpufw-drv] [aicpufw_drv_release_debug 650] 7 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.950 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642628] [aicpufw-drv] [aicpufw_drv_release_debug 650] 8 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.959 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642630] [aicpufw-drv] [aicpufw_drv_release_debug 650] 9 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.967 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642632] [aicpufw-drv] [aicpufw_drv_release_debug 650] 10 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.975 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642634] [aicpufw-drv] [aicpufw_drv_release_debug 650] 11 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.984 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642636] [aicpufw-drv] [aicpufw_drv_release_debug 650] 12 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.277.994 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642638] [aicpufw-drv] [aicpufw_drv_release_debug 650] 13 :rev_int_cnt 0 rev_int_ok 0, rev_int_invalid 0,send_to_int_cnt 0 wait_satisfied 0 wait_event_time 0 rev_int_pending 0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.278.003 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642641] [aicpufw-drv] [aicpufw_drv_delete_context 568] delete match-pid(40927). dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.278.011 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642642] [aicpufw-drv] [aicpufw_drv_release 690] processes(1),process pid(30223) released.current tgid: 30223 numa node:0. dev_id:0 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.278.019 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.642657] [aicpufw-drv] [aicpufw_drv_get_moniter_info 1583] aicpufw event happened. dev_id:0 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.860 [tdt/device/../common/src/log.cpp:158]The current kill result is [-1],[tdt/device/src/tsd/tsdaemon.cpp:1090:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.880 [tdt/device/../common/src/log.cpp:158][TSDaemon] Computer Process stop success.,[tdt/device/src/tsd/tsdaemon.cpp:1096:CheckSubProcessExitByType]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.892 [tdt/device/../common/src/log.cpp:158][TSDaemon] SubProcesses exit success on device[0], tryTimes is 21,[tdt/device/src/tsd/tsdaemon.cpp:1098:CheckSubProcessExitByType]30256 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.908 [tdt/device/../common/src/log.cpp:149][TsdEVENT] #### Close Rsp TSD->FMK device[0] sessionID[1] realDeviceId[0]####,[tdt/device/src/tsd/tsdaemon.cpp:1023:SendRspMsgToFmk]30256 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.950 [tdt/device/../common/src/log.cpp:158][TSDaemon] CloseRspProc subRunState is: 0,[tdt/device/src/tsd/tsdaemon.cpp:1248:TsdWaitRspProcForClose]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.278.966 [tdt/device/../common/src/log.cpp:158][TSDaemon] EraseTsdToFmkMsg:deviceId[0], subProcPid[30223],[tdt/device/src/tsd/tsdaemon.cpp:789:EraseTsdToFmkMsg]30256 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.027 [tdt/device/../common/src/log.cpp:158][TSDaemon]###### PPCSerToTsdAbnormalMsg deviceId[0] msgType[3](0:START RSP,1:SHUTDOWN,2:SHUTDOWN RSP,3:SOCKET CLOSE), procType[1](0:HCCP,1:COMPUTE), state[0],[tdt/device/src/tsd/tsdaemon.cpp:1471:PPCSerToTsdAbnormalMsg]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.057 [tdt/device/../common/src/log.cpp:158][TSDaemon] Begin to ClearPPCThreadCleanFlag,[tdt/device/src/tsd/tsdaemon.cpp:1473:PPCSerToTsdAbnormalMsg]30245 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.081 [tdt/device/../common/src/log.cpp:149][TSDPPCSER] 2 SOCKET_CLOSED notify dev[0] procType[1] ret[17379389] TSD to clean,[tdt/device/src/tsd/ppc_server.cpp:211:RecvData]30245 +[INFO] HDC(8380,tsdaemon):2020-05-12-11:05:24.279.117 [hardware/dev_plat/../dev_plat/devhdc/hdc_ppc.c:304][drvPpcSessionClose:304] >>> Ppc Close session fd 16, pid 8380 session 0xfffee0000d30 +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.139 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] CloseSomeSession enter [sessionSize:1],[tdt/device/src/tsd/ppc_server.cpp:80:RemoveFromPpcSessionList]30245 Msg: running ok +[INFO] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.157 [tdt/device/../common/src/log.cpp:158][TSDPPCSER] CloseSomeSession exit [sessionSize:0],[tdt/device/src/tsd/ppc_server.cpp:85:RemoveFromPpcSessionList]30245 Msg: running ok +[EVENT] TDT(8380,tsdaemon):2020-05-12-11:05:24.279.190 [tdt/device/../common/src/log.cpp:149][TSDPPCSER] [threadName:ppc_srv_recv_0] RecvData [ret=17379389] [tid=281470580584880]thread exit,[tdt/device/src/tsd/ppc_server.cpp:218:RecvData]30245 +[INFO] KERNEL(8189,sklogd):2020-05-12-11:05:24.609.779 [toolchain/log/slog/sklog/device/../src/klogd.c:249][48432.973818] [devmm] [devmm_chan_close_device_h2d 1124] device process exited, hostpid=40927, devpid=30223, devid=0. diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io.py new file mode 100644 index 0000000..0f7f3b9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io.py @@ -0,0 +1,207 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convenience functions for managing dataset file buffers.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import multiprocessing +import multiprocessing.dummy +import os +import tempfile +import uuid + +import numpy as np +import six + +import tensorflow as tf + + +class _GarbageCollector(object): + """Deletes temporary buffer files at exit. + + Certain tasks (such as NCF Recommendation) require writing buffers to + temporary files. (Which may be local or distributed.) It is not generally safe + to delete these files during operation, but they should be cleaned up. This + class keeps track of temporary files created, and deletes them at exit. + """ + def __init__(self): + self.temp_buffers = [] + + def register(self, filepath): + self.temp_buffers.append(filepath) + + def purge(self): + try: + for i in self.temp_buffers: + if tf.io.gfile.exists(i): + tf.io.gfile.remove(i) + tf.compat.v1.logging.info("Buffer file {} removed".format(i)) + except Exception as e: + tf.compat.v1.logging.error("Failed to cleanup buffer files: {}".format(e)) + + +_GARBAGE_COLLECTOR = _GarbageCollector() +atexit.register(_GARBAGE_COLLECTOR.purge) + +_ROWS_PER_CORE = 50000 + + +def write_to_temp_buffer(dataframe, buffer_folder, columns): + if buffer_folder is None: + _, buffer_path = tempfile.mkstemp() + else: + tf.io.gfile.makedirs(buffer_folder) + buffer_path = os.path.join(buffer_folder, str(uuid.uuid4())) + _GARBAGE_COLLECTOR.register(buffer_path) + + return write_to_buffer(dataframe, buffer_path, columns) + + +def iter_shard_dataframe(df, rows_per_core=1000): + """Two way shard of a dataframe. + + This function evenly shards a dataframe so that it can be mapped efficiently. + It yields a list of dataframes with length equal to the number of CPU cores, + with each dataframe having rows_per_core rows. (Except for the last batch + which may have fewer rows in the dataframes.) Passing vectorized inputs to + a pool is more effecient than iterating through a dataframe in serial and + passing a list of inputs to the pool. + + Args: + df: Pandas dataframe to be sharded. + rows_per_core: Number of rows in each shard. + + Returns: + A list of dataframe shards. + """ + n = len(df) + num_cores = min([multiprocessing.cpu_count(), n]) + + num_blocks = int(np.ceil(n / num_cores / rows_per_core)) + max_batch_size = num_cores * rows_per_core + for i in range(num_blocks): + min_index = i * max_batch_size + max_index = min([(i + 1) * max_batch_size, n]) + df_shard = df[min_index:max_index] + n_shard = len(df_shard) + boundaries = np.linspace(0, n_shard, num_cores + 1, dtype=np.int64) + yield [df_shard[boundaries[j]:boundaries[j+1]] for j in range(num_cores)] + + +def _shard_dict_to_examples(shard_dict): + """Converts a dict of arrays into a list of example bytes.""" + n = [i for i in shard_dict.values()][0].shape[0] + feature_list = [{} for _ in range(n)] + for column, values in shard_dict.items(): + if len(values.shape) == 1: + values = np.reshape(values, values.shape + (1,)) + + if values.dtype.kind == "i": + feature_map = lambda x: tf.train.Feature( + int64_list=tf.train.Int64List(value=x)) + elif values.dtype.kind == "f": + feature_map = lambda x: tf.train.Feature( + float_list=tf.train.FloatList(value=x)) + else: + raise ValueError("Invalid dtype") + for i in range(n): + feature_list[i][column] = feature_map(values[i]) + examples = [ + tf.train.Example(features=tf.train.Features(feature=example_features)) + for example_features in feature_list + ] + + return [e.SerializeToString() for e in examples] + + +def _serialize_shards(df_shards, columns, pool, writer): + """Map sharded dataframes to bytes, and write them to a buffer. + + Args: + df_shards: A list of pandas dataframes. (Should be of similar size) + columns: The dataframe columns to be serialized. + pool: A pool to serialize in parallel. + writer: A TFRecordWriter to write the serialized shards. + """ + # Pandas does not store columns of arrays as nd arrays. stack remedies this. + map_inputs = [{c: np.stack(shard[c].values, axis=0) for c in columns} + for shard in df_shards] + + # Failure within pools is very irksome. Thus, it is better to thoroughly check + # inputs in the main process. + for inp in map_inputs: + # Check that all fields have the same number of rows. + assert len(set([v.shape[0] for v in inp.values()])) == 1 + for val in inp.values(): + assert hasattr(val, "dtype") + assert hasattr(val.dtype, "kind") + assert val.dtype.kind in ("i", "f") + assert len(val.shape) in (1, 2) + shard_bytes = pool.map(_shard_dict_to_examples, map_inputs) + for s in shard_bytes: + for example in s: + writer.write(example) + + +def write_to_buffer(dataframe, buffer_path, columns, expected_size=None): + """Write a dataframe to a binary file for a dataset to consume. + + Args: + dataframe: The pandas dataframe to be serialized. + buffer_path: The path where the serialized results will be written. + columns: The dataframe columns to be serialized. + expected_size: The size in bytes of the serialized results. This is used to + lazily construct the buffer. + + Returns: + The path of the buffer. + """ + if (tf.io.gfile.exists(buffer_path) and + tf.io.gfile.stat(buffer_path).length > 0): + actual_size = tf.io.gfile.stat(buffer_path).length + if expected_size == actual_size: + return buffer_path + tf.compat.v1.logging.warning( + "Existing buffer {} has size {}. Expected size {}. Deleting and " + "rebuilding buffer.".format(buffer_path, actual_size, expected_size)) + tf.io.gfile.remove(buffer_path) + + if dataframe is None: + raise ValueError( + "dataframe was None but a valid existing buffer was not found.") + + tf.io.gfile.makedirs(os.path.split(buffer_path)[0]) + + tf.compat.v1.logging.info("Constructing TFRecordDataset buffer: {}" + .format(buffer_path)) + + count = 0 + pool = multiprocessing.dummy.Pool(multiprocessing.cpu_count()) + try: + with tf.io.TFRecordWriter(buffer_path) as writer: + for df_shards in iter_shard_dataframe(df=dataframe, + rows_per_core=_ROWS_PER_CORE): + _serialize_shards(df_shards, columns, pool, writer) + count += sum([len(s) for s in df_shards]) + tf.compat.v1.logging.info("{}/{} examples written." + .format(str(count).ljust(8), len(dataframe))) + finally: + pool.terminate() + + tf.compat.v1.logging.info("Buffer write complete.") + return buffer_path diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io_test.py new file mode 100644 index 0000000..ba90d94 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/data/file_io_test.py @@ -0,0 +1,199 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for binary data file utilities.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import contextlib +import multiprocessing + +# pylint: disable=wrong-import-order +import numpy as np +import pandas as pd +import tensorflow as tf +# pylint: enable=wrong-import-order + +from official.r1.utils.data import file_io +from official.utils.misc import keras_utils + + +_RAW_ROW = "raw_row" +_DUMMY_COL = "column_0" +_DUMMY_VEC_COL = "column_1" +_DUMMY_VEC_LEN = 4 + +_ROWS_PER_CORE = 4 +_TEST_CASES = [ + # One batch of one + dict(row_count=1, cpu_count=1, expected=[ + [[0]] + ]), + + dict(row_count=10, cpu_count=1, expected=[ + [[0, 1, 2, 3]], [[4, 5, 6, 7]], [[8, 9]] + ]), + + dict(row_count=21, cpu_count=1, expected=[ + [[0, 1, 2, 3]], [[4, 5, 6, 7]], [[8, 9, 10, 11]], + [[12, 13, 14, 15]], [[16, 17, 18, 19]], [[20]] + ]), + + dict(row_count=1, cpu_count=4, expected=[ + [[0]] + ]), + + dict(row_count=10, cpu_count=4, expected=[ + [[0, 1], [2, 3, 4], [5, 6], [7, 8, 9]] + ]), + + dict(row_count=21, cpu_count=4, expected=[ + [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]], + [[16], [17], [18], [19, 20]] + ]), + + dict(row_count=10, cpu_count=8, expected=[ + [[0], [1], [2], [3, 4], [5], [6], [7], [8, 9]] + ]), + + dict(row_count=40, cpu_count=8, expected=[ + [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], + [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], + [28, 29, 30, 31]], + [[32], [33], [34], [35], [36], [37], [38], [39]] + ]), +] + +_FEATURE_MAP = { + _RAW_ROW: tf.io.FixedLenFeature([1], dtype=tf.int64), + _DUMMY_COL: tf.io.FixedLenFeature([1], dtype=tf.int64), + _DUMMY_VEC_COL: tf.io.FixedLenFeature([_DUMMY_VEC_LEN], dtype=tf.float32) +} + + +@contextlib.contextmanager +def fixed_core_count(cpu_count): + """Override CPU count. + + file_io.py uses the cpu_count function to scale to the size of the instance. + However, this is not desirable for testing because it can make the test flaky. + Instead, this context manager fixes the count for more robust testing. + + Args: + cpu_count: How many cores multiprocessing claims to have. + + Yields: + Nothing. (for context manager only) + """ + old_count_fn = multiprocessing.cpu_count + multiprocessing.cpu_count = lambda: cpu_count + yield + multiprocessing.cpu_count = old_count_fn + + +class BaseTest(tf.test.TestCase): + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def _test_sharding(self, row_count, cpu_count, expected): + df = pd.DataFrame({_DUMMY_COL: list(range(row_count))}) + with fixed_core_count(cpu_count): + shards = list(file_io.iter_shard_dataframe(df, _ROWS_PER_CORE)) + result = [[j[_DUMMY_COL].tolist() for j in i] for i in shards] + self.assertAllEqual(expected, result) + + def test_tiny_rows_low_core(self): + self._test_sharding(**_TEST_CASES[0]) + + def test_small_rows_low_core(self): + self._test_sharding(**_TEST_CASES[1]) + + def test_large_rows_low_core(self): + self._test_sharding(**_TEST_CASES[2]) + + def test_tiny_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[3]) + + def test_small_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[4]) + + def test_large_rows_medium_core(self): + self._test_sharding(**_TEST_CASES[5]) + + def test_small_rows_large_core(self): + self._test_sharding(**_TEST_CASES[6]) + + def test_large_rows_large_core(self): + self._test_sharding(**_TEST_CASES[7]) + + def _serialize_deserialize(self, num_cores=1, num_rows=20): + np.random.seed(1) + df = pd.DataFrame({ + # Serialization order is only deterministic for num_cores=1. raw_row is + # used in validation after the deserialization. + _RAW_ROW: np.array(range(num_rows), dtype=np.int64), + _DUMMY_COL: np.random.randint(0, 35, size=(num_rows,)), + _DUMMY_VEC_COL: [ + np.array([np.random.random() for _ in range(_DUMMY_VEC_LEN)]) + for i in range(num_rows) # pylint: disable=unused-variable + ] + }) + + with fixed_core_count(num_cores): + buffer_path = file_io.write_to_temp_buffer( + df, self.get_temp_dir(), [_RAW_ROW, _DUMMY_COL, _DUMMY_VEC_COL]) + + with self.session(graph=tf.Graph()) as sess: + dataset = tf.data.TFRecordDataset(buffer_path) + dataset = dataset.batch(1).map( + lambda x: tf.io.parse_example(serialized=x, features=_FEATURE_MAP)) + + data_iter = tf.compat.v1.data.make_one_shot_iterator(dataset) + seen_rows = set() + for i in range(num_rows+5): + row = data_iter.get_next() + try: + row_id, val_0, val_1 = sess.run( + [row[_RAW_ROW], row[_DUMMY_COL], row[_DUMMY_VEC_COL]]) + row_id, val_0, val_1 = row_id[0][0], val_0[0][0], val_1[0] + assert row_id not in seen_rows + seen_rows.add(row_id) + + self.assertEqual(val_0, df[_DUMMY_COL][row_id]) + self.assertAllClose(val_1, df[_DUMMY_VEC_COL][row_id]) + + self.assertLess(i, num_rows, msg="Too many rows.") + except tf.errors.OutOfRangeError: + self.assertGreaterEqual(i, num_rows, msg="Too few rows.") + + file_io._GARBAGE_COLLECTOR.purge() + assert not tf.io.gfile.exists(buffer_path) + + def test_serialize_deserialize_0(self): + self._serialize_deserialize(num_cores=1) + + def test_serialize_deserialize_1(self): + self._serialize_deserialize(num_cores=2) + + def test_serialize_deserialize_2(self): + self._serialize_deserialize(num_cores=8) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export.py new file mode 100644 index 0000000..8061c28 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export.py @@ -0,0 +1,49 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convenience functions for exporting models as SavedModels or other types.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + + +def build_tensor_serving_input_receiver_fn(shape, dtype=tf.float32, + batch_size=1): + """Returns a input_receiver_fn that can be used during serving. + + This expects examples to come through as float tensors, and simply + wraps them as TensorServingInputReceivers. + + Arguably, this should live in tf.estimator.export. Testing here first. + + Args: + shape: list representing target size of a single example. + dtype: the expected datatype for the input example + batch_size: number of input tensors that will be passed for prediction + + Returns: + A function that itself returns a TensorServingInputReceiver. + """ + def serving_input_receiver_fn(): + # Prep a placeholder where the input example will be fed in + features = tf.compat.v1.placeholder( + dtype=dtype, shape=[batch_size] + shape, name='input_tensor') + + return tf.estimator.export.TensorServingInputReceiver( + features=features, receiver_tensors=features) + + return serving_input_receiver_fn diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export_test.py new file mode 100644 index 0000000..3785edd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/export_test.py @@ -0,0 +1,63 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for exporting utils.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.r1.utils import export + + +class ExportUtilsTest(tf.test.TestCase): + """Tests for the ExportUtils.""" + + def test_build_tensor_serving_input_receiver_fn(self): + receiver_fn = export.build_tensor_serving_input_receiver_fn(shape=[4, 5]) + with tf.Graph().as_default(): + receiver = receiver_fn() + self.assertIsInstance( + receiver, tf.estimator.export.TensorServingInputReceiver) + + self.assertIsInstance(receiver.features, tf.Tensor) + self.assertEqual(receiver.features.shape, tf.TensorShape([1, 4, 5])) + self.assertEqual(receiver.features.dtype, tf.float32) + self.assertIsInstance(receiver.receiver_tensors, dict) + # Note that Python 3 can no longer index .values() directly; cast to list. + self.assertEqual(list(receiver.receiver_tensors.values())[0].shape, + tf.TensorShape([1, 4, 5])) + + def test_build_tensor_serving_input_receiver_fn_batch_dtype(self): + receiver_fn = export.build_tensor_serving_input_receiver_fn( + shape=[4, 5], dtype=tf.int8, batch_size=10) + + with tf.Graph().as_default(): + receiver = receiver_fn() + self.assertIsInstance( + receiver, tf.estimator.export.TensorServingInputReceiver) + + self.assertIsInstance(receiver.features, tf.Tensor) + self.assertEqual(receiver.features.shape, tf.TensorShape([10, 4, 5])) + self.assertEqual(receiver.features.dtype, tf.int8) + self.assertIsInstance(receiver.receiver_tensors, dict) + # Note that Python 3 can no longer index .values() directly; cast to list. + self.assertEqual(list(receiver.receiver_tensors.values())[0].shape, + tf.TensorShape([10, 4, 5])) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu.py new file mode 100644 index 0000000..737a794 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu.py @@ -0,0 +1,116 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Functions specific to running TensorFlow on TPUs.""" + +import tensorflow as tf + + +# "local" is a magic word in the TPU cluster resolver; it informs the resolver +# to use the local CPU as the compute device. This is useful for testing and +# debugging; the code flow is ostensibly identical, but without the need to +# actually have a TPU on the other end. +LOCAL = "local" + + +def construct_scalar_host_call(metric_dict, model_dir, prefix=""): + """Construct a host call to log scalars when training on TPU. + + Args: + metric_dict: A dict of the tensors to be logged. + model_dir: The location to write the summary. + prefix: The prefix (if any) to prepend to the metric names. + + Returns: + A tuple of (function, args_to_be_passed_to_said_function) + """ + # type: (dict, str) -> (function, list) + metric_names = list(metric_dict.keys()) + + def host_call_fn(global_step, *args): + """Training host call. Creates scalar summaries for training metrics. + + This function is executed on the CPU and should not directly reference + any Tensors in the rest of the `model_fn`. To pass Tensors from the + model to the `metric_fn`, provide as part of the `host_call`. See + https://www.tensorflow.org/api_docs/python/tf/contrib/tpu/TPUEstimatorSpec + for more information. + + Arguments should match the list of `Tensor` objects passed as the second + element in the tuple passed to `host_call`. + + Args: + global_step: `Tensor with shape `[batch]` for the global_step + *args: Remaining tensors to log. + + Returns: + List of summary ops to run on the CPU host. + """ + step = global_step[0] + with tf.compat.v1.summary.create_file_writer( + logdir=model_dir, filename_suffix=".host_call").as_default(): + with tf.compat.v1.summary.always_record_summaries(): + for i, name in enumerate(metric_names): + tf.compat.v1.summary.scalar(prefix + name, args[i][0], step=step) + + return tf.compat.v1.summary.all_summary_ops() + + # To log the current learning rate, and gradient norm for Tensorboard, the + # summary op needs to be run on the host CPU via host_call. host_call + # expects [batch_size, ...] Tensors, thus reshape to introduce a batch + # dimension. These Tensors are implicitly concatenated to + # [params['batch_size']]. + global_step_tensor = tf.reshape( + tf.compat.v1.train.get_or_create_global_step(), [1]) + other_tensors = [tf.reshape(metric_dict[key], [1]) for key in metric_names] + + return host_call_fn, [global_step_tensor] + other_tensors + + +def embedding_matmul(embedding_table, values, mask, name="embedding_matmul"): + """Performs embedding lookup via a matmul. + + The matrix to be multiplied by the embedding table Tensor is constructed + via an implementation of scatter based on broadcasting embedding indices + and performing an equality comparison against a broadcasted + range(num_embedding_table_rows). All masked positions will produce an + embedding vector of zeros. + + Args: + embedding_table: Tensor of embedding table. + Rank 2 (table_size x embedding dim) + values: Tensor of embedding indices. Rank 2 (batch x n_indices) + mask: Tensor of mask / weights. Rank 2 (batch x n_indices) + name: Optional name scope for created ops + + Returns: + Rank 3 tensor of embedding vectors. + """ + + with tf.name_scope(name): + n_embeddings = embedding_table.get_shape().as_list()[0] + batch_size, padded_size = values.shape.as_list() + + emb_idcs = tf.tile( + tf.reshape(values, (batch_size, padded_size, 1)), (1, 1, n_embeddings)) + emb_weights = tf.tile( + tf.reshape(mask, (batch_size, padded_size, 1)), (1, 1, n_embeddings)) + col_idcs = tf.tile( + tf.reshape(tf.range(n_embeddings), (1, 1, n_embeddings)), + (batch_size, padded_size, 1)) + one_hot = tf.where( + tf.equal(emb_idcs, col_idcs), emb_weights, + tf.zeros((batch_size, padded_size, n_embeddings))) + + return tf.tensordot(one_hot, embedding_table, 1) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu_test.py new file mode 100644 index 0000000..ba5b868 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/r1/utils/tpu_test.py @@ -0,0 +1,108 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Test TPU optimized matmul embedding.""" + +import numpy as np +import tensorflow as tf + +from official.r1.utils import tpu as tpu_utils + + +TEST_CASES = [ + dict(embedding_dim=256, vocab_size=1000, sequence_length=64, + batch_size=32, seed=54131), + dict(embedding_dim=8, vocab_size=15, sequence_length=12, + batch_size=256, seed=536413), + dict(embedding_dim=2048, vocab_size=512, sequence_length=50, + batch_size=8, seed=35124) +] + + +class TPUBaseTester(tf.test.TestCase): + def construct_embedding_and_values(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + np.random.seed(seed) + + embeddings = np.random.random(size=(vocab_size, embedding_dim)) + embedding_table = tf.convert_to_tensor(value=embeddings, dtype=tf.float32) + + tokens = np.random.randint(low=1, high=vocab_size-1, + size=(batch_size, sequence_length)) + for i in range(batch_size): + tokens[i, np.random.randint(low=0, high=sequence_length-1):] = 0 + values = tf.convert_to_tensor(value=tokens, dtype=tf.int32) + mask = tf.cast(tf.not_equal(values, 0), dtype=tf.float32) + return embedding_table, values, mask + + def _test_embedding(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + """Test that matmul embedding matches embedding lookup (gather).""" + + with self.test_session(): + embedding_table, values, mask = self.construct_embedding_and_values( + embedding_dim=embedding_dim, + vocab_size=vocab_size, + sequence_length=sequence_length, + batch_size=batch_size, + seed=seed + ) + + embedding = (tf.nn.embedding_lookup(params=embedding_table, ids=values) * + tf.expand_dims(mask, -1)) + + matmul_embedding = tpu_utils.embedding_matmul( + embedding_table=embedding_table, values=values, mask=mask) + + self.assertAllClose(embedding, matmul_embedding) + + def _test_masking(self, embedding_dim, vocab_size, + sequence_length, batch_size, seed): + """Test that matmul embedding properly zeros masked positions.""" + with self.test_session(): + embedding_table, values, mask = self.construct_embedding_and_values( + embedding_dim=embedding_dim, + vocab_size=vocab_size, + sequence_length=sequence_length, + batch_size=batch_size, + seed=seed + ) + + matmul_embedding = tpu_utils.embedding_matmul( + embedding_table=embedding_table, values=values, mask=mask) + + self.assertAllClose(matmul_embedding, + matmul_embedding * tf.expand_dims(mask, -1)) + + def test_embedding_0(self): + self._test_embedding(**TEST_CASES[0]) + + def test_embedding_1(self): + self._test_embedding(**TEST_CASES[1]) + + def test_embedding_2(self): + self._test_embedding(**TEST_CASES[2]) + + def test_masking_0(self): + self._test_masking(**TEST_CASES[0]) + + def test_masking_1(self): + self._test_masking(**TEST_CASES[1]) + + def test_masking_2(self): + self._test_masking(**TEST_CASES[2]) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/requirements.txt b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/requirements.txt new file mode 100644 index 0000000..3e30f54 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/requirements.txt @@ -0,0 +1,24 @@ +six +google-api-python-client>=1.6.7 +google-cloud-bigquery>=0.31.0 +kaggle>=1.3.9 +mlperf_compliance==0.0.10 +numpy>=1.15.4 +oauth2client>=4.1.2 +pandas>=0.22.0 +psutil>=5.4.3 +py-cpuinfo>=3.3.0 +scipy>=0.19.1 +tensorflow-hub>=0.6.0 +tensorflow-model-optimization>=0.2.1 +tensorflow_datasets +dataclasses +gin-config +typing +sentencepiece +Cython +matplotlib +opencv-python-headless +pyyaml +Pillow +-e git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/README.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/README.md new file mode 100644 index 0000000..18160f7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/README.md @@ -0,0 +1,97 @@ +# Adding Abseil (absl) flags quickstart +## Defining a flag +absl flag definitions are similar to argparse, although they are defined on a global namespace. + +For instance defining a string flag looks like: +```$xslt +from absl import flags +flags.DEFINE_string( + name="my_flag", + default="a_sensible_default", + help="Here is what this flag does." +) +``` + +All three arguments are required, but default may be `None`. A common optional argument is +short_name for defining abreviations. Certain `DEFINE_*` methods will have other required arguments. +For instance `DEFINE_enum` requires the `enum_values` argument to be specified. + +## Key Flags +absl has the concept of a key flag. Any flag defined in `__main__` is considered a key flag by +default. Key flags are displayed in `--help`, others only appear in `--helpfull`. In order to +handle key flags that are defined outside the module in question, absl provides the +`flags.adopt_module_key_flags()` method. This adds the key flags of a different module to one's own +key flags. For example: +```$xslt +File: flag_source.py +--------------------------------------- + +from absl import flags +flags.DEFINE_string(name="my_flag", default="abc", help="a flag.") +``` + +```$xslt +File: my_module.py +--------------------------------------- + +from absl import app as absl_app +from absl import flags + +import flag_source + +flags.adopt_module_key_flags(flag_source) + +def main(_): + pass + +absl_app.run(main, [__file__, "-h"] +``` + +when `my_module.py` is run it will show the help text for `my_flag`. Because not all flags defined +in a file are equally important, `official/utils/flags/core.py` (generally imported as flags_core) +provides an abstraction for handling key flag declaration in an easy way through the +`register_key_flags_in_core()` function, which allows a module to make a single +`adopt_key_flags(flags_core)` call when using the util flag declaration functions. + +## Validators +Often the constraints on a flag are complicated. absl provides the validator decorator to allow +one to mark a function as a flag validation function. Suppose we want users to provide a flag +which is a palindrome. + +```$xslt +from absl import flags + +flags.DEFINE_string(name="pal_flag", short_name="pf", default="", help="Give me a palindrome") + +@flags.validator("pal_flag") +def _check_pal(provided_pal_flag): + return provided_pal_flag == provided_pal_flag[::-1] + +``` + +Validators take the form that returning True (truthy) passes, and all others +(False, None, exception) fail. + +## Testing +To test using absl, simply declare flags in the setupClass method of TensorFlow's TestCase. + +```$xslt +from absl import flags +import tensorflow as tf + +def define_flags(): + flags.DEFINE_string(name="test_flag", default="abc", help="an example flag") + + +class BaseTester(unittest.TestCase): + + @classmethod + def setUpClass(cls): + super(BaseTester, cls).setUpClass() + define_flags() + + def test_trivial(self): + flags_core.parse_flags([__file__, "test_flag", "def"]) + self.AssertEqual(flags.FLAGS.test_flag, "def") + +``` diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_base.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_base.py new file mode 100644 index 0000000..fe1eeed --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_base.py @@ -0,0 +1,163 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags which will be nearly universal across models.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +import tensorflow as tf + +from official.utils.flags._conventions import help_wrap +from official.utils.logs import hooks_helper + +############## npu modify begin ############# +from hccl.manage.api import get_rank_size +from hccl.manage.api import get_rank_id +############## npu modify end ############### + +def define_base(data_dir=True, model_dir=True, clean=False, train_epochs=False, + epochs_between_evals=False, stop_threshold=False, + batch_size=True, num_gpu=False, hooks=False, export_dir=False, + distribution_strategy=False, run_eagerly=False): + """Register base flags. + + Args: + data_dir: Create a flag for specifying the input data directory. + model_dir: Create a flag for specifying the model file directory. + clean: Create a flag for removing the model_dir. + train_epochs: Create a flag to specify the number of training epochs. + epochs_between_evals: Create a flag to specify the frequency of testing. + stop_threshold: Create a flag to specify a threshold accuracy or other + eval metric which should trigger the end of training. + batch_size: Create a flag to specify the batch size. + num_gpu: Create a flag to specify the number of GPUs used. + hooks: Create a flag to specify hooks for logging. + export_dir: Create a flag to specify where a SavedModel should be exported. + distribution_strategy: Create a flag to specify which Distribution Strategy + to use. + run_eagerly: Create a flag to specify to run eagerly op by op. + Returns: + A list of flags for core.py to marks as key flags. + """ + key_flags = [] + + if data_dir: + flags.DEFINE_string( + name="data_dir", short_name="dd", default="/tmp", + help=help_wrap("The location of the input data.")) + key_flags.append("data_dir") + + if model_dir: + flags.DEFINE_string( + name="model_dir", short_name="md", default="/tmp", + help=help_wrap("The location of the model checkpoint files.")) + key_flags.append("model_dir") + + if clean: + flags.DEFINE_boolean( + name="clean", default=False, + help=help_wrap("If set, model_dir will be removed if it exists.")) + key_flags.append("clean") + + if train_epochs: + flags.DEFINE_integer( + name="train_epochs", short_name="te", default=1, + help=help_wrap("The number of epochs used to train.")) + key_flags.append("train_epochs") + + if epochs_between_evals: + flags.DEFINE_integer( + name="epochs_between_evals", short_name="ebe", default=1, + help=help_wrap("The number of training epochs to run between " + "evaluations.")) + key_flags.append("epochs_between_evals") + + if stop_threshold: + flags.DEFINE_float( + name="stop_threshold", short_name="st", + default=None, + help=help_wrap("If passed, training will stop at the earlier of " + "train_epochs and when the evaluation metric is " + "greater than or equal to stop_threshold.")) + + if batch_size: + flags.DEFINE_integer( + name="batch_size", short_name="bs", default=32, + help=help_wrap("Batch size for training and evaluation. When using " + "multiple gpus, this is the global batch size for " + "all devices. For example, if the batch size is 32 " + "and there are 4 GPUs, each GPU will get 8 examples on " + "each step.")) + key_flags.append("batch_size") + + if num_gpu: + flags.DEFINE_integer( + name="num_gpus", short_name="ng", + default=1, + help=help_wrap( + "How many GPUs to use at each worker with the " + "DistributionStrategies API. The default is 1.")) + + if run_eagerly: + flags.DEFINE_boolean( + name="run_eagerly", default=False, + help="Run the model op by op without building a model function.") + + if hooks: + # Construct a pretty summary of hooks. + hook_list_str = ( + u"\ufeff Hook:\n" + u"\n".join([u"\ufeff {}".format(key) for key + in hooks_helper.HOOKS])) + flags.DEFINE_list( + name="hooks", short_name="hk", default="LoggingTensorHook", + help=help_wrap( + u"A list of (case insensitive) strings to specify the names of " + u"training hooks.\n{}\n\ufeff Example: `--hooks ProfilerHook," + u"ExamplesPerSecondHook`\n See official.utils.logs.hooks_helper " + u"for details.".format(hook_list_str)) + ) + key_flags.append("hooks") + + if export_dir: + flags.DEFINE_string( + name="export_dir", short_name="ed", default=None, + help=help_wrap("If set, a SavedModel serialization of the model will " + "be exported to this directory at the end of training. " + "See the README for more details and relevant links.") + ) + key_flags.append("export_dir") + + if distribution_strategy: + flags.DEFINE_string( + name="distribution_strategy", short_name="ds", default="mirrored", + help=help_wrap("The Distribution Strategy to use for training. " + "Accepted values are 'off', 'one_device', " + "'mirrored', 'parameter_server', 'collective', " + "case insensitive. 'off' means not to use " + "Distribution Strategy; 'default' means to choose " + "from `MirroredStrategy` or `OneDeviceStrategy` " + "according to the number of GPUs.") + ) + + + return key_flags + + +def get_num_gpus(flags_obj): + """get the num npus using hccl api""" + ############## npu modify begin ############# + return get_rank_size() + ############## npu modify end ############### \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_benchmark.py new file mode 100644 index 0000000..eddae80 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_benchmark.py @@ -0,0 +1,109 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags for benchmarking models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags + +from official.utils.flags._conventions import help_wrap + + +def define_log_steps(): + flags.DEFINE_integer( + name="log_steps", default=100, + help="Frequency with which to log timing information with TimeHistory.") + + return [] + + +def define_benchmark(benchmark_log_dir=True, bigquery_uploader=True): + """Register benchmarking flags. + + Args: + benchmark_log_dir: Create a flag to specify location for benchmark logging. + bigquery_uploader: Create flags for uploading results to BigQuery. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + flags.DEFINE_enum( + name="benchmark_logger_type", default="BaseBenchmarkLogger", + enum_values=["BaseBenchmarkLogger", "BenchmarkFileLogger", + "BenchmarkBigQueryLogger"], + help=help_wrap("The type of benchmark logger to use. Defaults to using " + "BaseBenchmarkLogger which logs to STDOUT. Different " + "loggers will require other flags to be able to work.")) + flags.DEFINE_string( + name="benchmark_test_id", short_name="bti", default=None, + help=help_wrap("The unique test ID of the benchmark run. It could be the " + "combination of key parameters. It is hardware " + "independent and could be used compare the performance " + "between different test runs. This flag is designed for " + "human consumption, and does not have any impact within " + "the system.")) + + define_log_steps() + + if benchmark_log_dir: + flags.DEFINE_string( + name="benchmark_log_dir", short_name="bld", default=None, + help=help_wrap("The location of the benchmark logging.") + ) + + if bigquery_uploader: + flags.DEFINE_string( + name="gcp_project", short_name="gp", default=None, + help=help_wrap( + "The GCP project name where the benchmark will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_data_set", short_name="bds", default="test_benchmark", + help=help_wrap( + "The Bigquery dataset name where the benchmark will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_run_table", short_name="brt", default="benchmark_run", + help=help_wrap("The Bigquery table name where the benchmark run " + "information will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_run_status_table", short_name="brst", + default="benchmark_run_status", + help=help_wrap("The Bigquery table name where the benchmark run " + "status information will be uploaded.")) + + flags.DEFINE_string( + name="bigquery_metric_table", short_name="bmt", + default="benchmark_metric", + help=help_wrap("The Bigquery table name where the benchmark metric " + "information will be uploaded.")) + + @flags.multi_flags_validator( + ["benchmark_logger_type", "benchmark_log_dir"], + message="--benchmark_logger_type=BenchmarkFileLogger will require " + "--benchmark_log_dir being set") + def _check_benchmark_log_dir(flags_dict): + benchmark_logger_type = flags_dict["benchmark_logger_type"] + if benchmark_logger_type == "BenchmarkFileLogger": + return flags_dict["benchmark_log_dir"] + return True + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_conventions.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_conventions.py new file mode 100644 index 0000000..81ad21b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_conventions.py @@ -0,0 +1,54 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Central location for shared argparse convention definitions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +import codecs +import functools + +from absl import app as absl_app +from absl import flags + + +# This codifies help string conventions and makes it easy to update them if +# necessary. Currently the only major effect is that help bodies start on the +# line after flags are listed. All flag definitions should wrap the text bodies +# with help wrap when calling DEFINE_*. +_help_wrap = functools.partial(flags.text_wrap, length=80, indent="", + firstline_indent="\n") + + +# Pretty formatting causes issues when utf-8 is not installed on a system. +def _stdout_utf8(): + try: + codecs.lookup("utf-8") + except LookupError: + return False + return sys.stdout.encoding == "UTF-8" + + +if _stdout_utf8(): + help_wrap = _help_wrap +else: + def help_wrap(text, *args, **kwargs): + return _help_wrap(text, *args, **kwargs).replace(u"\ufeff", u"") + + +# Replace None with h to also allow -h +absl_app.HelpshortFlag.SHORT_NAME = "h" diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_device.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_device.py new file mode 100644 index 0000000..edaf2f9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_device.py @@ -0,0 +1,85 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags for managing compute devices. Currently only contains TPU flags.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +import tensorflow as tf + +from official.utils.flags._conventions import help_wrap + + +def require_cloud_storage(flag_names): + """Register a validator to check directory flags. + Args: + flag_names: An iterable of strings containing the names of flags to be + checked. + """ + msg = "TPU requires GCS path for {}".format(", ".join(flag_names)) + @flags.multi_flags_validator(["tpu"] + flag_names, message=msg) + def _path_check(flag_values): # pylint: disable=missing-docstring + if flag_values["tpu"] is None: + return True + + valid_flags = True + for key in flag_names: + if not flag_values[key].startswith("gs://"): + tf.compat.v1.logging.error("{} must be a GCS path.".format(key)) + valid_flags = False + + return valid_flags + + +def define_device(tpu=True): + """Register device specific flags. + Args: + tpu: Create flags to specify TPU operation. + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + if tpu: + flags.DEFINE_string( + name="tpu", default=None, + help=help_wrap( + "The Cloud TPU to use for training. This should be either the name " + "used when creating the Cloud TPU, or a " + "grpc://ip.address.of.tpu:8470 url. Passing `local` will use the" + "CPU of the local instance instead. (Good for debugging.)")) + key_flags.append("tpu") + + flags.DEFINE_string( + name="tpu_zone", default=None, + help=help_wrap( + "[Optional] GCE zone where the Cloud TPU is located in. If not " + "specified, we will attempt to automatically detect the GCE " + "project from metadata.")) + + flags.DEFINE_string( + name="tpu_gcp_project", default=None, + help=help_wrap( + "[Optional] Project name for the Cloud TPU-enabled project. If not " + "specified, we will attempt to automatically detect the GCE " + "project from metadata.")) + + flags.DEFINE_integer(name="num_tpu_shards", default=8, + help=help_wrap("Number of shards (TPU chips).")) + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_distribution.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_distribution.py new file mode 100644 index 0000000..ca331bf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_distribution.py @@ -0,0 +1,54 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Flags related to distributed execution.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +import tensorflow as tf + +from official.utils.flags._conventions import help_wrap + + +def define_distribution(worker_hosts=True, task_index=True): + """Register distributed execution flags. + + Args: + worker_hosts: Create a flag for specifying comma-separated list of workers. + task_index: Create a flag for specifying index of task. + + Returns: + A list of flags for core.py to marks as key flags. + """ + key_flags = [] + + if worker_hosts: + flags.DEFINE_string( + name='worker_hosts', default=None, + help=help_wrap( + 'Comma-separated list of worker ip:port pairs for running ' + 'multi-worker models with DistributionStrategy. The user would ' + 'start the program on each host with identical value for this ' + 'flag.')) + + if task_index: + flags.DEFINE_integer( + name='task_index', default=-1, + help=help_wrap('If multi-worker training, the task_index of this ' + 'worker.')) + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_misc.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_misc.py new file mode 100644 index 0000000..c6fa24b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_misc.py @@ -0,0 +1,50 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Misc flags.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags + +from official.utils.flags._conventions import help_wrap + + +def define_image(data_format=True): + """Register image specific flags. + + Args: + data_format: Create a flag to specify image axis convention. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + + if data_format: + flags.DEFINE_enum( + name="data_format", short_name="df", default=None, + enum_values=["channels_first", "channels_last"], + help=help_wrap( + "A flag to override the data format used in the model. " + "channels_first provides a performance boost on GPU but is not " + "always compatible with CPU. If left unspecified, the data format " + "will be chosen automatically based on whether TensorFlow was " + "built for CPU or GPU.")) + key_flags.append("data_format") + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_performance.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_performance.py new file mode 100644 index 0000000..cc5840f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/_performance.py @@ -0,0 +1,289 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Register flags for optimizing performance.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import multiprocessing + +from absl import flags # pylint: disable=g-bad-import-order +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.flags._conventions import help_wrap + + +# Map string to TensorFlow dtype +DTYPE_MAP = { + "fp16": tf.float16, + "bf16": tf.bfloat16, + "fp32": tf.float32, +} + + +def get_tf_dtype(flags_obj): + if getattr(flags_obj, "fp16_implementation", None) == "graph_rewrite": + # If the graph_rewrite is used, we build the graph with fp32, and let the + # graph rewrite change ops to fp16. + return tf.float32 + return DTYPE_MAP[flags_obj.dtype] + + +def get_loss_scale(flags_obj, default_for_fp16): + dtype = get_tf_dtype(flags_obj) + if flags_obj.loss_scale == "dynamic": + return flags_obj.loss_scale + elif flags_obj.loss_scale is not None: + return float(flags_obj.loss_scale) + elif dtype == tf.float32 or dtype == tf.bfloat16: + return 1 # No loss scaling is needed for fp32 + else: + assert dtype == tf.float16 + return default_for_fp16 + + +def define_performance(num_parallel_calls=False, inter_op=False, intra_op=False, + synthetic_data=False, max_train_steps=False, dtype=False, + all_reduce_alg=False, num_packs=False, + tf_gpu_thread_mode=False, + datasets_num_private_threads=False, + datasets_num_parallel_batches=False, + dynamic_loss_scale=False, fp16_implementation=False, + loss_scale=False, + tf_data_experimental_slack=False, enable_xla=False, + training_dataset_cache=False): + """Register flags for specifying performance tuning arguments. + + Args: + num_parallel_calls: Create a flag to specify parallelism of data loading. + inter_op: Create a flag to allow specification of inter op threads. + intra_op: Create a flag to allow specification of intra op threads. + synthetic_data: Create a flag to allow the use of synthetic data. + max_train_steps: Create a flags to allow specification of maximum number + of training steps + dtype: Create flags for specifying dtype. + all_reduce_alg: If set forces a specific algorithm for multi-gpu. + num_packs: If set provides number of packs for MirroredStrategy's cross + device ops. + tf_gpu_thread_mode: gpu_private triggers us of private thread pool. + datasets_num_private_threads: Number of private threads for datasets. + datasets_num_parallel_batches: Determines how many batches to process in + parallel when using map and batch from tf.data. + dynamic_loss_scale: Allow the "loss_scale" flag to take on the value + "dynamic". Only valid if `dtype` is True. + fp16_implementation: Create fp16_implementation flag. + loss_scale: Controls the loss scaling, normally for mixed-precision + training. Can only be turned on if dtype is also True. + tf_data_experimental_slack: Determines whether to enable tf.data's + `experimental_slack` option. + enable_xla: Determines if XLA (auto clustering) is turned on. + training_dataset_cache: Whether to cache the training dataset on workers. + Typically used to improve training performance when training data is in + remote storage and can fit into worker memory. + + Returns: + A list of flags for core.py to marks as key flags. + """ + + key_flags = [] + if num_parallel_calls: + flags.DEFINE_integer( + name="num_parallel_calls", short_name="npc", + default=multiprocessing.cpu_count(), + help=help_wrap("The number of records that are processed in parallel " + "during input processing. This can be optimized per " + "data set but for generally homogeneous data sets, " + "should be approximately the number of available CPU " + "cores. (default behavior)")) + + if inter_op: + flags.DEFINE_integer( + name="inter_op_parallelism_threads", short_name="inter", default=0, + help=help_wrap("Number of inter_op_parallelism_threads to use for CPU. " + "See TensorFlow config.proto for details.") + ) + + if intra_op: + flags.DEFINE_integer( + name="intra_op_parallelism_threads", short_name="intra", default=0, + help=help_wrap("Number of intra_op_parallelism_threads to use for CPU. " + "See TensorFlow config.proto for details.")) + + if synthetic_data: + flags.DEFINE_bool( + name="use_synthetic_data", short_name="synth", default=False, + help=help_wrap( + "If set, use fake data (zeroes) instead of a real dataset. " + "This mode is useful for performance debugging, as it removes " + "input processing steps, but will not learn anything.")) + + if max_train_steps: + flags.DEFINE_integer( + name="max_train_steps", short_name="mts", default=None, help=help_wrap( + "The model will stop training if the global_step reaches this " + "value. If not set, training will run until the specified number " + "of epochs have run as usual. It is generally recommended to set " + "--train_epochs=1 when using this flag." + )) + + if dtype: + flags.DEFINE_enum( + name="dtype", short_name="dt", default="fp32", + enum_values=DTYPE_MAP.keys(), + help=help_wrap("The TensorFlow datatype used for calculations. " + "Variables may be cast to a higher precision on a " + "case-by-case basis for numerical stability.")) + + loss_scale_help_text = ( + "The amount to scale the loss by when the model is run. {}. Before " + "gradients are computed, the loss is multiplied by the loss scale, " + "making all gradients loss_scale times larger. To adjust for this, " + "gradients are divided by the loss scale before being applied to " + "variables. This is mathematically equivalent to training without " + "a loss scale, but the loss scale helps avoid some intermediate " + "gradients from underflowing to zero. If not provided the default " + "for fp16 is 128 and 1 for all other dtypes.{}" + ) + if dynamic_loss_scale: + loss_scale_help_text = loss_scale_help_text.format( + "This can be an int/float or the string 'dynamic'", + " The string 'dynamic' can be used to dynamically determine the " + "optimal loss scale during training, but currently this " + "significantly slows down performance") + loss_scale_validation_msg = ("loss_scale should be a positive int/float " + "or the string 'dynamic'.") + else: + loss_scale_help_text = loss_scale_help_text.format( + "This must be an int/float", "") + loss_scale_validation_msg = "loss_scale should be a positive int/float." + if loss_scale: + flags.DEFINE_string( + name="loss_scale", short_name="ls", default=None, + help=help_wrap(loss_scale_help_text)) + + @flags.validator(flag_name="loss_scale", + message=loss_scale_validation_msg) + def _check_loss_scale(loss_scale): # pylint: disable=unused-variable + """Validator to check the loss scale flag is valid.""" + if loss_scale is None: + return True # null case is handled in get_loss_scale() + + if loss_scale == "dynamic" and dynamic_loss_scale: + return True + + try: + loss_scale = float(loss_scale) + except ValueError: + return False + + return loss_scale > 0 + + if fp16_implementation: + flags.DEFINE_enum( + name="fp16_implementation", default="keras", + enum_values=("keras', 'graph_rewrite"), + help=help_wrap( + "When --dtype=fp16, how fp16 should be implemented. This has no " + "impact on correctness. 'keras' uses the " + "tf.keras.mixed_precision API. 'graph_rewrite' uses the " + "tf.train.experimental.enable_mixed_precision_graph_rewrite " + "API.")) + + @flags.multi_flags_validator(["fp16_implementation", "dtype", + "loss_scale"]) + def _check_fp16_implementation(flags_dict): + """Validator to check fp16_implementation flag is valid.""" + if (flags_dict["fp16_implementation"] == "graph_rewrite" and + flags_dict["dtype"] != "fp16"): + raise flags.ValidationError("--fp16_implementation should not be " + "specified unless --dtype=fp16") + return True + + if all_reduce_alg: + flags.DEFINE_string( + name="all_reduce_alg", short_name="ara", default=None, + help=help_wrap("Defines the algorithm to use for performing all-reduce." + "When specified with MirroredStrategy for single " + "worker, this controls " + "tf.contrib.distribute.AllReduceCrossTowerOps. When " + "specified with MultiWorkerMirroredStrategy, this " + "controls " + "tf.distribute.experimental.CollectiveCommunication; " + "valid options are `ring` and `nccl`.")) + + if num_packs: + flags.DEFINE_integer( + name="num_packs", default=1, + help=help_wrap("Sets `num_packs` in the cross device ops used in " + "MirroredStrategy. For details, see " + "tf.distribute.NcclAllReduce.")) + + if tf_gpu_thread_mode: + flags.DEFINE_string( + name="tf_gpu_thread_mode", short_name="gt_mode", default=None, + help=help_wrap( + "Whether and how the GPU device uses its own threadpool.") + ) + + flags.DEFINE_integer( + name="per_gpu_thread_count", short_name="pgtc", default=0, + help=help_wrap( + "The number of threads to use for GPU. Only valid when " + "tf_gpu_thread_mode is not global.") + ) + + if datasets_num_private_threads: + flags.DEFINE_integer( + name="datasets_num_private_threads", + default=None, + help=help_wrap( + "Number of threads for a private threadpool created for all" + "datasets computation..") + ) + + if datasets_num_parallel_batches: + flags.DEFINE_integer( + name="datasets_num_parallel_batches", + default=None, + help=help_wrap( + "Determines how many batches to process in parallel when using " + "map and batch from tf.data.") + ) + + if training_dataset_cache: + flags.DEFINE_boolean( + name="training_dataset_cache", + default=False, + help=help_wrap( + "Determines whether to cache the training dataset on workers. " + "Typically used to improve training performance when training " + "data is in remote storage and can fit into worker memory.") + ) + + if tf_data_experimental_slack: + flags.DEFINE_boolean( + name="tf_data_experimental_slack", + default=False, + help=help_wrap( + "Whether to enable tf.data's `experimental_slack` option.") + ) + + if enable_xla: + flags.DEFINE_boolean( + name="enable_xla", default=False, + help="Whether to enable XLA auto jit compilation") + + return key_flags diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/core.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/core.py new file mode 100644 index 0000000..fa36944 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/core.py @@ -0,0 +1,133 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Public interface for flag definition. + +See _example.py for detailed instructions on defining flags. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import sys +from six.moves import shlex_quote + +from absl import app as absl_app +from absl import flags + +from official.utils.flags import _base +from official.utils.flags import _benchmark +from official.utils.flags import _conventions +from official.utils.flags import _device +from official.utils.flags import _distribution +from official.utils.flags import _misc +from official.utils.flags import _performance + + +def set_defaults(**kwargs): + for key, value in kwargs.items(): + flags.FLAGS.set_default(name=key, value=value) + + +def parse_flags(argv=None): + """Reset flags and reparse. Currently only used in testing.""" + flags.FLAGS.unparse_flags() + absl_app.parse_flags_with_usage(argv or sys.argv) + + +def register_key_flags_in_core(f): + """Defines a function in core.py, and registers its key flags. + + absl uses the location of a flags.declare_key_flag() to determine the context + in which a flag is key. By making all declares in core, this allows model + main functions to call flags.adopt_module_key_flags() on core and correctly + chain key flags. + + Args: + f: The function to be wrapped + + Returns: + The "core-defined" version of the input function. + """ + + def core_fn(*args, **kwargs): + key_flags = f(*args, **kwargs) + [flags.declare_key_flag(fl) for fl in key_flags] # pylint: disable=expression-not-assigned + return core_fn + + +define_base = register_key_flags_in_core(_base.define_base) +# We have define_base_eager for compatibility, since it used to be a separate +# function from define_base. +define_base_eager = define_base +define_log_steps = register_key_flags_in_core(_benchmark.define_log_steps) +define_benchmark = register_key_flags_in_core(_benchmark.define_benchmark) +define_device = register_key_flags_in_core(_device.define_device) +define_image = register_key_flags_in_core(_misc.define_image) +define_performance = register_key_flags_in_core(_performance.define_performance) +define_distribution = register_key_flags_in_core( + _distribution.define_distribution) + + +help_wrap = _conventions.help_wrap + + +get_num_gpus = _base.get_num_gpus +get_tf_dtype = _performance.get_tf_dtype +get_loss_scale = _performance.get_loss_scale +DTYPE_MAP = _performance.DTYPE_MAP +require_cloud_storage = _device.require_cloud_storage + +def _get_nondefault_flags_as_dict(): + """Returns the nondefault flags as a dict from flag name to value.""" + nondefault_flags = {} + for flag_name in flags.FLAGS: + flag_value = getattr(flags.FLAGS, flag_name) + if (flag_name != flags.FLAGS[flag_name].short_name and + flag_value != flags.FLAGS[flag_name].default): + nondefault_flags[flag_name] = flag_value + return nondefault_flags + + +def get_nondefault_flags_as_str(): + """Returns flags as a string that can be passed as command line arguments. + + E.g., returns: "--batch_size=256 --use_synthetic_data" for the following code + block: + + ``` + flags.FLAGS.batch_size = 256 + flags.FLAGS.use_synthetic_data = True + print(get_nondefault_flags_as_str()) + ``` + + Only flags with nondefault values are returned, as passing default flags as + command line arguments has no effect. + + Returns: + A string with the flags, that can be passed as command line arguments to a + program to use the flags. + """ + nondefault_flags = _get_nondefault_flags_as_dict() + flag_strings = [] + for name, value in sorted(nondefault_flags.items()): + if isinstance(value, bool): + flag_str = '--{}'.format(name) if value else '--no{}'.format(name) + elif isinstance(value, list): + flag_str = '--{}={}'.format(name, ','.join(value)) + else: + flag_str = '--{}={}'.format(name, value) + flag_strings.append(flag_str) + return ' '.join(shlex_quote(flag_str) for flag_str in flag_strings) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/flags_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/flags_test.py new file mode 100644 index 0000000..e11a164 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/flags_test.py @@ -0,0 +1,162 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +import unittest + +from absl import flags +import tensorflow as tf + +from official.utils.flags import core as flags_core # pylint: disable=g-bad-import-order + + +def define_flags(): + flags_core.define_base(clean=True, num_gpu=False, stop_threshold=True, + hooks=True, train_epochs=True, + epochs_between_evals=True) + flags_core.define_performance( + num_parallel_calls=True, inter_op=True, intra_op=True, + dynamic_loss_scale=True, loss_scale=True, synthetic_data=True, + dtype=True) + flags_core.define_image() + flags_core.define_benchmark() + + +class BaseTester(unittest.TestCase): + + @classmethod + def setUpClass(cls): + super(BaseTester, cls).setUpClass() + define_flags() + + def test_default_setting(self): + """Test to ensure fields exist and defaults can be set. + """ + + defaults = dict( + data_dir="dfgasf", + model_dir="dfsdkjgbs", + train_epochs=534, + epochs_between_evals=15, + batch_size=256, + hooks=["LoggingTensorHook"], + num_parallel_calls=18, + inter_op_parallelism_threads=5, + intra_op_parallelism_threads=10, + data_format="channels_first" + ) + + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + for key, value in defaults.items(): + assert flags.FLAGS.get_flag_value(name=key, default=None) == value + + def test_benchmark_setting(self): + defaults = dict( + hooks=["LoggingMetricHook"], + benchmark_log_dir="/tmp/12345", + gcp_project="project_abc", + ) + + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + for key, value in defaults.items(): + assert flags.FLAGS.get_flag_value(name=key, default=None) == value + + def test_booleans(self): + """Test to ensure boolean flags trigger as expected. + """ + + flags_core.parse_flags([__file__, "--use_synthetic_data"]) + + assert flags.FLAGS.use_synthetic_data + + def test_parse_dtype_info(self): + flags_core.parse_flags([__file__, "--dtype", "fp16"]) + self.assertEqual(flags_core.get_tf_dtype(flags.FLAGS), tf.float16) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 2) + + flags_core.parse_flags( + [__file__, "--dtype", "fp16", "--loss_scale", "5"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 5) + + flags_core.parse_flags( + [__file__, "--dtype", "fp16", "--loss_scale", "dynamic"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), "dynamic") + + flags_core.parse_flags([__file__, "--dtype", "fp32"]) + self.assertEqual(flags_core.get_tf_dtype(flags.FLAGS), tf.float32) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 1) + + flags_core.parse_flags([__file__, "--dtype", "fp32", "--loss_scale", "5"]) + self.assertEqual(flags_core.get_loss_scale(flags.FLAGS, + default_for_fp16=2), 5) + + + with self.assertRaises(SystemExit): + flags_core.parse_flags([__file__, "--dtype", "int8"]) + + with self.assertRaises(SystemExit): + flags_core.parse_flags([__file__, "--dtype", "fp16", + "--loss_scale", "abc"]) + + def test_get_nondefault_flags_as_str(self): + defaults = dict( + clean=True, + data_dir="abc", + hooks=["LoggingTensorHook"], + stop_threshold=1.5, + use_synthetic_data=False + ) + flags_core.set_defaults(**defaults) + flags_core.parse_flags() + + expected_flags = "" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.clean = False + expected_flags += "--noclean" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.data_dir = "xyz" + expected_flags += " --data_dir=xyz" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.hooks = ["aaa", "bbb", "ccc"] + expected_flags += " --hooks=aaa,bbb,ccc" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.stop_threshold = 3. + expected_flags += " --stop_threshold=3.0" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + flags.FLAGS.use_synthetic_data = True + expected_flags += " --use_synthetic_data" + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + # Assert that explicit setting a flag to its default value does not cause it + # to appear in the string + flags.FLAGS.use_synthetic_data = False + expected_flags = expected_flags[:-len(" --use_synthetic_data")] + self.assertEqual(flags_core.get_nondefault_flags_as_str(), expected_flags) + + +if __name__ == "__main__": + unittest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/guidelines.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/guidelines.md new file mode 100644 index 0000000..db963aa --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/flags/guidelines.md @@ -0,0 +1,65 @@ +# Using flags in official models + +1. **All common flags must be incorporated in the models.** + + Common flags (i.e. batch_size, model_dir, etc.) are provided by various flag definition functions, + and channeled through `official.utils.flags.core`. For instance to define common supervised + learning parameters one could use the following code: + + ```$xslt + from absl import app as absl_app + from absl import flags + + from official.utils.flags import core as flags_core + + + def define_flags(): + flags_core.define_base() + flags.adopt_key_flags(flags_core) + + + def main(_): + flags_obj = flags.FLAGS + print(flags_obj) + + + if __name__ == "__main__" + absl_app.run(main) + ``` +2. **Validate flag values.** + + See the [Validators](#validators) section for implementation details. + + Validators in the official model repo should not access the file system, such as verifying + that files exist, due to the strict ordering requirements. + +3. **Flag values should not be mutated.** + + Instead of mutating flag values, use getter functions to return the desired values. An example + getter function is `get_tf_dtype` function below: + + ``` + # Map string to TensorFlow dtype + DTYPE_MAP = { + "fp16": tf.float16, + "fp32": tf.float32, + } + + def get_tf_dtype(flags_obj): + if getattr(flags_obj, "fp16_implementation", None) == "graph_rewrite": + # If the graph_rewrite is used, we build the graph with fp32, and let the + # graph rewrite change ops to fp16. + return tf.float32 + return DTYPE_MAP[flags_obj.dtype] + + + def main(_): + flags_obj = flags.FLAGS() + + # Do not mutate flags_obj + # if flags_obj.fp16_implementation == "graph_rewrite": + # flags_obj.dtype = "float32" # Don't do this + + print(get_tf_dtype(flags_obj)) + ... + ``` \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/hyperparams_flags.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/hyperparams_flags.py new file mode 100644 index 0000000..961d615 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/hyperparams_flags.py @@ -0,0 +1,119 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Common flags for importing hyperparameters.""" + +from __future__ import absolute_import +from __future__ import division +# from __future__ import google_type_annotations +from __future__ import print_function + +from absl import flags +from official.utils.flags import core as flags_core + +FLAGS = flags.FLAGS + + +def define_common_hparams_flags(): + """Define the common flags across models.""" + + flags.DEFINE_string( + 'model_dir', + default=None, + help=('The directory where the model and training/evaluation summaries' + 'are stored.')) + + flags.DEFINE_integer( + 'train_batch_size', default=None, help='Batch size for training.') + + flags.DEFINE_integer( + 'eval_batch_size', default=None, help='Batch size for evaluation.') + + flags.DEFINE_string( + 'precision', + default=None, + help=('Precision to use; one of: {bfloat16, float32}')) + + flags.DEFINE_string( + 'config_file', + default=None, + help=('A YAML file which specifies overrides. Note that this file can be ' + 'used as an override template to override the default parameters ' + 'specified in Python. If the same parameter is specified in both ' + '`--config_file` and `--params_override`, the one in ' + '`--params_override` will be used finally.')) + + flags.DEFINE_string( + 'params_override', + default=None, + help=('a YAML/JSON string or a YAML file which specifies additional ' + 'overrides over the default parameters and those specified in ' + '`--config_file`. Note that this is supposed to be used only to ' + 'override the model parameters, but not the parameters like TPU ' + 'specific flags. One canonical use case of `--config_file` and ' + '`--params_override` is users first define a template config file ' + 'using `--config_file`, then use `--params_override` to adjust the ' + 'minimal set of tuning parameters, for example setting up different' + ' `train_batch_size`. ' + 'The final override order of parameters: default_model_params --> ' + 'params from config_file --> params in params_override.' + 'See also the help message of `--config_file`.')) + flags.DEFINE_integer('save_checkpoint_freq', None, + 'Number of steps to save checkpoint.') + + +def initialize_common_flags(): + """Define the common flags across models.""" + define_common_hparams_flags() + + flags_core.define_device(tpu=True) + flags_core.define_base( + num_gpu=True, model_dir=False, data_dir=False, batch_size=False) + flags_core.define_distribution(worker_hosts=True, task_index=True) + flags_core.define_performance(all_reduce_alg=True, num_packs=True) + + # Reset the default value of num_gpus to zero. + FLAGS.num_gpus = 0 + + flags.DEFINE_string( + 'strategy_type', 'mirrored', 'Type of distribute strategy.' + 'One of mirrored, tpu and multiworker.') + + +def strategy_flags_dict(): + """Returns TPU and/or GPU related flags in a dictionary.""" + return { + # TPUStrategy related flags. + 'tpu': FLAGS.tpu, + # MultiWorkerMirroredStrategy related flags. + 'all_reduce_alg': FLAGS.all_reduce_alg, + 'worker_hosts': FLAGS.worker_hosts, + 'task_index': FLAGS.task_index, + # MirroredStrategy and OneDeviceStrategy + 'num_gpus': FLAGS.num_gpus, + 'num_packs': FLAGS.num_packs, + } + + +def hparam_flags_dict(): + """Returns model params related flags in a dictionary.""" + return { + 'data_dir': FLAGS.data_dir, + 'model_dir': FLAGS.model_dir, + 'train_batch_size': FLAGS.train_batch_size, + 'eval_batch_size': FLAGS.eval_batch_size, + 'precision': FLAGS.precision, + 'config_file': FLAGS.config_file, + 'params_override': FLAGS.params_override, + } diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib.py new file mode 100644 index 0000000..a2d9bd3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib.py @@ -0,0 +1,34 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Utilities that interact with cloud service. +""" + +import requests + +GCP_METADATA_URL = "http://metadata/computeMetadata/v1/instance/hostname" +GCP_METADATA_HEADER = {"Metadata-Flavor": "Google"} + + +def on_gcp(): + """Detect whether the current running environment is on GCP.""" + try: + # Timeout in 5 seconds, in case the test environment has connectivity issue. + # There is not default timeout, which means it might block forever. + response = requests.get( + GCP_METADATA_URL, headers=GCP_METADATA_HEADER, timeout=5) + return response.status_code == 200 + except requests.exceptions.RequestException: + return False diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib_test.py new file mode 100644 index 0000000..901576d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/cloud_lib_test.py @@ -0,0 +1,48 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for cloud_lib.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import mock +import requests + +from official.utils.logs import cloud_lib + + +class CloudLibTest(unittest.TestCase): + + @mock.patch("requests.get") + def test_on_gcp(self, mock_requests_get): + mock_response = mock.MagicMock() + mock_requests_get.return_value = mock_response + mock_response.status_code = 200 + + self.assertEqual(cloud_lib.on_gcp(), True) + + @mock.patch("requests.get") + def test_not_on_gcp(self, mock_requests_get): + mock_requests_get.side_effect = requests.exceptions.ConnectionError() + + self.assertEqual(cloud_lib.on_gcp(), False) + + +if __name__ == "__main__": + unittest.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/guidelines.md b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/guidelines.md new file mode 100644 index 0000000..408c3cd --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/guidelines.md @@ -0,0 +1,58 @@ +# Logging in official models + +This library adds logging functions that print or save tensor values. Official models should define all common hooks +(using hooks helper) and a benchmark logger. + +1. **Training Hooks** + + Hooks are a TensorFlow concept that define specific actions at certain points of the execution. We use them to obtain and log + tensor values during training. + + hooks_helper.py provides an easy way to create common hooks. The following hooks are currently defined: + * LoggingTensorHook: Logs tensor values + * ProfilerHook: Writes a timeline json that can be loaded into chrome://tracing. + * ExamplesPerSecondHook: Logs the number of examples processed per second. + * LoggingMetricHook: Similar to LoggingTensorHook, except that the tensors are logged in a format defined by our data + anaylsis pipeline. + + +2. **Benchmarks** + + The benchmark logger provides useful functions for logging environment information, and evaluation results. + The module also contains a context which is used to update the status of the run. + +Example usage: + +``` +from absl import app as absl_app + +from official.utils.logs import hooks_helper +from official.utils.logs import logger + +def model_main(flags_obj): + estimator = ... + + benchmark_logger = logger.get_benchmark_logger() + benchmark_logger.log_run_info(...) + + train_hooks = hooks_helper.get_train_hooks(...) + + for epoch in range(10): + estimator.train(..., hooks=train_hooks) + eval_results = estimator.evaluate(...) + + # Log a dictionary of metrics + benchmark_logger.log_evaluation_result(eval_results) + + # Log an individual metric + benchmark_logger.log_metric(...) + + +def main(_): + with logger.benchmark_context(flags.FLAGS): + model_main(flags.FLAGS) + +if __name__ == "__main__": + # define flags + absl_app.run(main) +``` diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks.py new file mode 100644 index 0000000..652ebf2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks.py @@ -0,0 +1,146 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Hook that counts examples per second every N steps or seconds.""" + + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from hccl.manage.api import get_rank_size +import tensorflow as tf # pylint: disable=g-bad-import-order +from official.utils.logs import logger +from benchmark_log import hwlog +import time +import sys + + +class ExamplesPerSecondHook(tf.estimator.SessionRunHook): + """Hook to print out examples per second. + + Total time is tracked and then divided by the total number of steps + to get the average step time and then batch_size is used to determine + the running average of examples per second. The examples per second for the + most recent interval is also logged. + """ + + def __init__(self, + batch_size, + every_n_steps=None, + every_n_secs=None, + warm_steps=0, + metric_logger=None): + """Initializer for ExamplesPerSecondHook. + + Args: + batch_size: Total batch size across all workers used to calculate + examples/second from global time. + every_n_steps: Log stats every n steps. + every_n_secs: Log stats every n seconds. Exactly one of the + `every_n_steps` or `every_n_secs` should be set. + warm_steps: The number of steps to be skipped before logging and running + average calculation. warm_steps steps refers to global steps across all + workers, not on each worker + metric_logger: instance of `BenchmarkLogger`, the benchmark logger that + hook should use to write the log. If None, BaseBenchmarkLogger will + be used. + + Raises: + ValueError: if neither `every_n_steps` or `every_n_secs` is set, or + both are set. + """ + if (every_n_steps is None) == (every_n_secs is None): + raise ValueError("exactly one of every_n_steps" + " and every_n_secs should be provided.") + + self._logger = metric_logger or logger.BaseBenchmarkLogger() + + self._timer = tf.estimator.SecondOrStepTimer( + every_steps=every_n_steps, every_secs=every_n_secs) + + self._step_train_time = 0 + self._total_steps = 0 + self._batch_size = batch_size + self._warm_steps = warm_steps + # List of examples per second logged every_n_steps. + self.current_examples_per_sec_list = [] + + def begin(self): + """Called once before using the session to check global step.""" + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook begin") + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + "Global step should be created to use StepCounterHook.") + + def before_run(self, run_context): # pylint: disable=unused-argument + """Called before each call to run(). + + Args: + run_context: A SessionRunContext object. + + Returns: + A SessionRunArgs object or None if never triggered. + """ + self.t0 = time.time() + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook before") + return tf.estimator.SessionRunArgs(self._global_step_tensor) + + def after_run(self, run_context, run_values): # pylint: disable=unused-argument + """Called after each call to run(). + + Args: + run_context: A SessionRunContext object. + run_values: A SessionRunValues object. + """ + tf.compat.v1.logging.warning("##########ExamplesPerSecondHook after_run") + global_step = run_values.results + + #if self._timer.should_trigger_for_step( + #global_step) and global_step > self._warm_steps: + elapsed_time, elapsed_steps = self._timer.update_last_triggered_step( + global_step) + batch_time = time.time() - self.t0 + ips = self._batch_size/batch_time + if elapsed_time is not None: + self._step_train_time += elapsed_time + self._total_steps += elapsed_steps + + # average examples per second is based on the total (accumulative) + # training steps and training time so far + average_examples_per_sec = self._batch_size * ( + self._total_steps / self._step_train_time) + # current examples per second is based on the elapsed training steps + # and training time per batch + current_examples_per_sec = self._batch_size * get_rank_size() * ( + elapsed_steps / elapsed_time) + # Logs entries to be read from hook during or after run. + self.current_examples_per_sec_list.append(current_examples_per_sec) + self._logger.log_metric( + "average_examples_per_sec", average_examples_per_sec, + global_step=global_step) + + self._logger.log_metric( + "current_examples_per_sec", current_examples_per_sec, + global_step=global_step) + tf.compat.v1.logging.warning( + "steps: %s,elapsed_steps:%d,batch:%d,FPS:%f,ips:%f,batch_time:%f", int(self._total_steps), + int(elapsed_steps),int(self._batch_size),float(current_examples_per_sec),float(ips), + float(batch_time)) + # get FPS info, add by wx933135 + #date_time = hwlog.get_time() + #remark_logger.info("ABK time_ts: %s, fps: %f, steps: %s, file: %s, lineno: %s" % (date_time, + # float(current_examples_per_sec), int(self._total_steps), file_name, sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.FPS, value=float(current_examples_per_sec)) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper.py new file mode 100644 index 0000000..50a380d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper.py @@ -0,0 +1,172 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Hooks helper to return a list of TensorFlow hooks for training by name. + +More hooks can be added to this set. To add a new hook, 1) add the new hook to +the registry in HOOKS, 2) add a corresponding function that parses out necessary +parameters. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks +from official.utils.logs import logger +from official.utils.logs import metric_hook + +_TENSORS_TO_LOG = dict((x, x) for x in ['learning_rate', + 'cross_entropy', + 'train_accuracy']) + + +def get_train_hooks(name_list, use_tpu=False, **kwargs): + """Factory for getting a list of TensorFlow hooks for training by name. + + Args: + name_list: a list of strings to name desired hook classes. Allowed: + LoggingTensorHook, ProfilerHook, ExamplesPerSecondHook, which are defined + as keys in HOOKS + use_tpu: Boolean of whether computation occurs on a TPU. This will disable + hooks altogether. + **kwargs: a dictionary of arguments to the hooks. + + Returns: + list of instantiated hooks, ready to be used in a classifier.train call. + + Raises: + ValueError: if an unrecognized name is passed. + """ + + if not name_list: + return [] + + if use_tpu: + tf.compat.v1.logging.warning('hooks_helper received name_list `{}`, but a ' + 'TPU is specified. No hooks will be used.' + .format(name_list)) + return [] + + train_hooks = [] + for name in name_list: + hook_name = HOOKS.get(name.strip().lower()) + if hook_name is None: + raise ValueError('Unrecognized training hook requested: {}'.format(name)) + else: + train_hooks.append(hook_name(**kwargs)) + + return train_hooks + + +def get_logging_tensor_hook(every_n_iter=100, tensors_to_log=None, **kwargs): # pylint: disable=unused-argument + """Function to get LoggingTensorHook. + + Args: + every_n_iter: `int`, print the values of `tensors` once every N local + steps taken on the current worker. + tensors_to_log: List of tensor names or dictionary mapping labels to tensor + names. If not set, log _TENSORS_TO_LOG by default. + **kwargs: a dictionary of arguments to LoggingTensorHook. + + Returns: + Returns a LoggingTensorHook with a standard set of tensors that will be + printed to stdout. + """ + if tensors_to_log is None: + tensors_to_log = _TENSORS_TO_LOG + + return tf.estimator.LoggingTensorHook( + tensors=tensors_to_log, + every_n_iter=every_n_iter) + + +def get_profiler_hook(model_dir, save_steps=1000, **kwargs): # pylint: disable=unused-argument + """Function to get ProfilerHook. + + Args: + model_dir: The directory to save the profile traces to. + save_steps: `int`, print profile traces every N steps. + **kwargs: a dictionary of arguments to ProfilerHook. + + Returns: + Returns a ProfilerHook that writes out timelines that can be loaded into + profiling tools like chrome://tracing. + """ + return tf.estimator.ProfilerHook(save_steps=save_steps, output_dir=model_dir) + + +def get_examples_per_second_hook(every_n_steps=100, + batch_size=128, + warm_steps=5, + **kwargs): # pylint: disable=unused-argument + """Function to get ExamplesPerSecondHook. + + Args: + every_n_steps: `int`, print current and average examples per second every + N steps. + batch_size: `int`, total batch size used to calculate examples/second from + global time. + warm_steps: skip this number of steps before logging and running average. + **kwargs: a dictionary of arguments to ExamplesPerSecondHook. + + Returns: + Returns a ProfilerHook that writes out timelines that can be loaded into + profiling tools like chrome://tracing. + """ + return hooks.ExamplesPerSecondHook( + batch_size=batch_size, every_n_steps=every_n_steps, + warm_steps=warm_steps, metric_logger=logger.get_benchmark_logger()) + + +def get_logging_metric_hook(tensors_to_log=None, + every_n_secs=600, + **kwargs): # pylint: disable=unused-argument + """Function to get LoggingMetricHook. + + Args: + tensors_to_log: List of tensor names or dictionary mapping labels to tensor + names. If not set, log _TENSORS_TO_LOG by default. + every_n_secs: `int`, the frequency for logging the metric. Default to every + 10 mins. + **kwargs: a dictionary of arguments. + + Returns: + Returns a LoggingMetricHook that saves tensor values in a JSON format. + """ + if tensors_to_log is None: + tensors_to_log = _TENSORS_TO_LOG + return metric_hook.LoggingMetricHook( + tensors=tensors_to_log, + metric_logger=logger.get_benchmark_logger(), + every_n_secs=every_n_secs) + + +def get_step_counter_hook(**kwargs): + """Function to get StepCounterHook.""" + del kwargs + return tf.estimator.StepCounterHook() + + +# A dictionary to map one hook name and its corresponding function +HOOKS = { + 'loggingtensorhook': get_logging_tensor_hook, + 'profilerhook': get_profiler_hook, + 'examplespersecondhook': get_examples_per_second_hook, + 'loggingmetrichook': get_logging_metric_hook, + 'stepcounterhook': get_step_counter_hook +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper_test.py new file mode 100644 index 0000000..693311b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_helper_test.py @@ -0,0 +1,73 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for hooks_helper.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks_helper +from official.utils.misc import keras_utils + + +class BaseTest(unittest.TestCase): + + def setUp(self): + super(BaseTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def test_raise_in_non_list_names(self): + with self.assertRaises(ValueError): + hooks_helper.get_train_hooks( + 'LoggingTensorHook, ProfilerHook', model_dir="", batch_size=256) + + def test_raise_in_invalid_names(self): + invalid_names = ['StepCounterHook', 'StopAtStepHook'] + with self.assertRaises(ValueError): + hooks_helper.get_train_hooks(invalid_names, model_dir="", batch_size=256) + + def validate_train_hook_name(self, + test_hook_name, + expected_hook_name, + **kwargs): + returned_hook = hooks_helper.get_train_hooks( + [test_hook_name], model_dir="", **kwargs) + self.assertEqual(len(returned_hook), 1) + self.assertIsInstance(returned_hook[0], tf.estimator.SessionRunHook) + self.assertEqual(returned_hook[0].__class__.__name__.lower(), + expected_hook_name) + + def test_get_train_hooks_logging_tensor_hook(self): + self.validate_train_hook_name('LoggingTensorHook', 'loggingtensorhook') + + def test_get_train_hooks_profiler_hook(self): + self.validate_train_hook_name('ProfilerHook', 'profilerhook') + + def test_get_train_hooks_examples_per_second_hook(self): + self.validate_train_hook_name('ExamplesPerSecondHook', + 'examplespersecondhook') + + def test_get_logging_metric_hook(self): + test_hook_name = 'LoggingMetricHook' + self.validate_train_hook_name(test_hook_name, 'loggingmetrichook') + +if __name__ == '__main__': + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_test.py new file mode 100644 index 0000000..7069779 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/hooks_test.py @@ -0,0 +1,158 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for hooks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import time + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.logs import hooks +from official.utils.testing import mock_lib + +tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.DEBUG) + + +class ExamplesPerSecondHookTest(tf.test.TestCase): + """Tests for the ExamplesPerSecondHook. + + In the test, we explicitly run global_step tensor after train_op in order to + keep the global_step value and the train_op (which increase the glboal_step + by 1) consistent. This is to correct the discrepancies in reported global_step + value when running on GPUs. + """ + + def setUp(self): + """Mock out logging calls to verify if correct info is being monitored.""" + self._logger = mock_lib.MockBenchmarkLogger() + + self.graph = tf.Graph() + with self.graph.as_default(): + tf.compat.v1.train.create_global_step() + self.train_op = tf.compat.v1.assign_add( + tf.compat.v1.train.get_global_step(), 1) + self.global_step = tf.compat.v1.train.get_global_step() + + def test_raise_in_both_secs_and_steps(self): + with self.assertRaises(ValueError): + hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=10, + every_n_secs=20, + metric_logger=self._logger) + + def test_raise_in_none_secs_and_steps(self): + with self.assertRaises(ValueError): + hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=None, + every_n_secs=None, + metric_logger=self._logger) + + def _validate_log_every_n_steps(self, every_n_steps, warm_steps): + hook = hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=every_n_steps, + warm_steps=warm_steps, + metric_logger=self._logger) + + with tf.compat.v1.train.MonitoredSession( + tf.compat.v1.train.ChiefSessionCreator(), [hook]) as mon_sess: + for _ in range(every_n_steps): + # Explicitly run global_step after train_op to get the accurate + # global_step value + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + + mon_sess.run(self.train_op) + global_step_val = mon_sess.run(self.global_step) + + if global_step_val > warm_steps: + self._assert_metrics() + else: + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + + # Add additional run to verify proper reset when called multiple times. + prev_log_len = len(self._logger.logged_metric) + mon_sess.run(self.train_op) + global_step_val = mon_sess.run(self.global_step) + + if every_n_steps == 1 and global_step_val > warm_steps: + # Each time, we log two additional metrics. Did exactly 2 get added? + self.assertEqual(len(self._logger.logged_metric), prev_log_len + 2) + else: + # No change in the size of the metric list. + self.assertEqual(len(self._logger.logged_metric), prev_log_len) + + def test_examples_per_sec_every_1_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(1, 0) + + def test_examples_per_sec_every_5_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(5, 0) + + def test_examples_per_sec_every_1_steps_with_warm_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(1, 10) + + def test_examples_per_sec_every_5_steps_with_warm_steps(self): + with self.graph.as_default(): + self._validate_log_every_n_steps(5, 10) + + def _validate_log_every_n_secs(self, every_n_secs): + hook = hooks.ExamplesPerSecondHook( + batch_size=256, + every_n_steps=None, + every_n_secs=every_n_secs, + metric_logger=self._logger) + + with tf.compat.v1.train.MonitoredSession( + tf.compat.v1.train.ChiefSessionCreator(), [hook]) as mon_sess: + # Explicitly run global_step after train_op to get the accurate + # global_step value + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + # Nothing should be in the list yet + self.assertFalse(self._logger.logged_metric) + time.sleep(every_n_secs) + + mon_sess.run(self.train_op) + mon_sess.run(self.global_step) + self._assert_metrics() + + def test_examples_per_sec_every_1_secs(self): + with self.graph.as_default(): + self._validate_log_every_n_secs(1) + + def test_examples_per_sec_every_5_secs(self): + with self.graph.as_default(): + self._validate_log_every_n_secs(5) + + def _assert_metrics(self): + metrics = self._logger.logged_metric + self.assertEqual(metrics[-2]["name"], "average_examples_per_sec") + self.assertEqual(metrics[-1]["name"], "current_examples_per_sec") + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger.py new file mode 100644 index 0000000..398aa8a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger.py @@ -0,0 +1,423 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Logging utilities for benchmark. + +For collecting local environment metrics like CPU and memory, certain python +packages need be installed. See README for details. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import contextlib +import datetime +import json +import multiprocessing +import numbers +import os +import threading +import uuid + +from six.moves import _thread as thread +from absl import flags +import tensorflow as tf +from tensorflow.python.client import device_lib + +from official.utils.logs import cloud_lib + +METRIC_LOG_FILE_NAME = "metric.log" +BENCHMARK_RUN_LOG_FILE_NAME = "benchmark_run.log" +_DATE_TIME_FORMAT_PATTERN = "%Y-%m-%dT%H:%M:%S.%fZ" +GCP_TEST_ENV = "GCP" +RUN_STATUS_SUCCESS = "success" +RUN_STATUS_FAILURE = "failure" +RUN_STATUS_RUNNING = "running" + + +FLAGS = flags.FLAGS + +# Don't use it directly. Use get_benchmark_logger to access a logger. +_benchmark_logger = None +_logger_lock = threading.Lock() + + +def config_benchmark_logger(flag_obj=None): + """Config the global benchmark logger.""" + _logger_lock.acquire() + try: + global _benchmark_logger + if not flag_obj: + flag_obj = FLAGS + + if (not hasattr(flag_obj, "benchmark_logger_type") or + flag_obj.benchmark_logger_type == "BaseBenchmarkLogger"): + _benchmark_logger = BaseBenchmarkLogger() + elif flag_obj.benchmark_logger_type == "BenchmarkFileLogger": + _benchmark_logger = BenchmarkFileLogger(flag_obj.benchmark_log_dir) + elif flag_obj.benchmark_logger_type == "BenchmarkBigQueryLogger": + from official.benchmark import benchmark_uploader as bu # pylint: disable=g-import-not-at-top + bq_uploader = bu.BigQueryUploader(gcp_project=flag_obj.gcp_project) + _benchmark_logger = BenchmarkBigQueryLogger( + bigquery_uploader=bq_uploader, + bigquery_data_set=flag_obj.bigquery_data_set, + bigquery_run_table=flag_obj.bigquery_run_table, + bigquery_run_status_table=flag_obj.bigquery_run_status_table, + bigquery_metric_table=flag_obj.bigquery_metric_table, + run_id=str(uuid.uuid4())) + else: + raise ValueError("Unrecognized benchmark_logger_type: %s" + % flag_obj.benchmark_logger_type) + + finally: + _logger_lock.release() + return _benchmark_logger + + +def get_benchmark_logger(): + if not _benchmark_logger: + config_benchmark_logger() + return _benchmark_logger + + +@contextlib.contextmanager +def benchmark_context(flag_obj): + """Context of benchmark, which will update status of the run accordingly.""" + benchmark_logger = config_benchmark_logger(flag_obj) + try: + yield + benchmark_logger.on_finish(RUN_STATUS_SUCCESS) + except Exception: # pylint: disable=broad-except + # Catch all the exception, update the run status to be failure, and re-raise + benchmark_logger.on_finish(RUN_STATUS_FAILURE) + raise + + +class BaseBenchmarkLogger(object): + """Class to log the benchmark information to STDOUT.""" + + def log_evaluation_result(self, eval_results): + """Log the evaluation result. + + The evaluate result is a dictionary that contains metrics defined in + model_fn. It also contains a entry for global_step which contains the value + of the global step when evaluation was performed. + + Args: + eval_results: dict, the result of evaluate. + """ + if not isinstance(eval_results, dict): + tf.compat.v1.logging.warning( + "eval_results should be dictionary for logging. Got %s", + type(eval_results)) + return + global_step = eval_results[tf.compat.v1.GraphKeys.GLOBAL_STEP] + for key in sorted(eval_results): + if key != tf.compat.v1.GraphKeys.GLOBAL_STEP: + self.log_metric(key, eval_results[key], global_step=global_step) + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to local file. + + Currently the logging is done in a synchronized way. This should be updated + to log asynchronously. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + tf.compat.v1.logging.info("Benchmark metric: %s", metric) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + tf.compat.v1.logging.info( + "Benchmark run: %s", _gather_run_info(model_name, dataset_name, + run_params, test_id)) + + def on_finish(self, status): + pass + + +class BenchmarkFileLogger(BaseBenchmarkLogger): + """Class to log the benchmark information to local disk.""" + + def __init__(self, logging_dir): + super(BenchmarkFileLogger, self).__init__() + self._logging_dir = logging_dir + if not tf.io.gfile.isdir(self._logging_dir): + tf.io.gfile.makedirs(self._logging_dir) + self._metric_file_handler = tf.io.gfile.GFile( + os.path.join(self._logging_dir, METRIC_LOG_FILE_NAME), "a") + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to local file. + + Currently the logging is done in a synchronized way. This should be updated + to log asynchronously. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + try: + json.dump(metric, self._metric_file_handler) + self._metric_file_handler.write("\n") + self._metric_file_handler.flush() + except (TypeError, ValueError) as e: + tf.compat.v1.logging.warning( + "Failed to dump metric to log file: name %s, value %s, error %s", + name, value, e) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + """Collect most of the TF runtime information for the local env. + + The schema of the run info follows official/benchmark/datastore/schema. + + Args: + model_name: string, the name of the model. + dataset_name: string, the name of dataset for training and evaluation. + run_params: dict, the dictionary of parameters for the run, it could + include hyperparameters or other params that are important for the run. + test_id: string, the unique name of the test run by the combination of key + parameters, eg batch size, num of GPU. It is hardware independent. + """ + run_info = _gather_run_info(model_name, dataset_name, run_params, test_id) + + with tf.io.gfile.GFile(os.path.join( + self._logging_dir, BENCHMARK_RUN_LOG_FILE_NAME), "w") as f: + try: + json.dump(run_info, f) + f.write("\n") + except (TypeError, ValueError) as e: + tf.compat.v1.logging.warning( + "Failed to dump benchmark run info to log file: %s", e) + + def on_finish(self, status): + self._metric_file_handler.flush() + self._metric_file_handler.close() + + +class BenchmarkBigQueryLogger(BaseBenchmarkLogger): + """Class to log the benchmark information to BigQuery data store.""" + + def __init__(self, + bigquery_uploader, + bigquery_data_set, + bigquery_run_table, + bigquery_run_status_table, + bigquery_metric_table, + run_id): + super(BenchmarkBigQueryLogger, self).__init__() + self._bigquery_uploader = bigquery_uploader + self._bigquery_data_set = bigquery_data_set + self._bigquery_run_table = bigquery_run_table + self._bigquery_run_status_table = bigquery_run_status_table + self._bigquery_metric_table = bigquery_metric_table + self._run_id = run_id + + def log_metric(self, name, value, unit=None, global_step=None, extras=None): + """Log the benchmark metric information to bigquery. + + Args: + name: string, the name of the metric to log. + value: number, the value of the metric. The value will not be logged if it + is not a number type. + unit: string, the unit of the metric, E.g "image per second". + global_step: int, the global_step when the metric is logged. + extras: map of string:string, the extra information about the metric. + """ + metric = _process_metric_to_json(name, value, unit, global_step, extras) + if metric: + # Starting new thread for bigquery upload in case it might take long time + # and impact the benchmark and performance measurement. Starting a new + # thread might have potential performance impact for model that run on + # CPU. + thread.start_new_thread( + self._bigquery_uploader.upload_benchmark_metric_json, + (self._bigquery_data_set, + self._bigquery_metric_table, + self._run_id, + [metric])) + + def log_run_info(self, model_name, dataset_name, run_params, test_id=None): + """Collect most of the TF runtime information for the local env. + + The schema of the run info follows official/benchmark/datastore/schema. + + Args: + model_name: string, the name of the model. + dataset_name: string, the name of dataset for training and evaluation. + run_params: dict, the dictionary of parameters for the run, it could + include hyperparameters or other params that are important for the run. + test_id: string, the unique name of the test run by the combination of key + parameters, eg batch size, num of GPU. It is hardware independent. + """ + run_info = _gather_run_info(model_name, dataset_name, run_params, test_id) + # Starting new thread for bigquery upload in case it might take long time + # and impact the benchmark and performance measurement. Starting a new + # thread might have potential performance impact for model that run on CPU. + thread.start_new_thread( + self._bigquery_uploader.upload_benchmark_run_json, + (self._bigquery_data_set, + self._bigquery_run_table, + self._run_id, + run_info)) + thread.start_new_thread( + self._bigquery_uploader.insert_run_status, + (self._bigquery_data_set, + self._bigquery_run_status_table, + self._run_id, + RUN_STATUS_RUNNING)) + + def on_finish(self, status): + self._bigquery_uploader.update_run_status( + self._bigquery_data_set, + self._bigquery_run_status_table, + self._run_id, + status) + + +def _gather_run_info(model_name, dataset_name, run_params, test_id): + """Collect the benchmark run information for the local environment.""" + run_info = { + "model_name": model_name, + "dataset": {"name": dataset_name}, + "machine_config": {}, + "test_id": test_id, + "run_date": datetime.datetime.utcnow().strftime( + _DATE_TIME_FORMAT_PATTERN)} + _collect_tensorflow_info(run_info) + _collect_tensorflow_environment_variables(run_info) + _collect_run_params(run_info, run_params) + _collect_cpu_info(run_info) + _collect_memory_info(run_info) + _collect_test_environment(run_info) + return run_info + + +def _process_metric_to_json( + name, value, unit=None, global_step=None, extras=None): + """Validate the metric data and generate JSON for insert.""" + if not isinstance(value, numbers.Number): + tf.compat.v1.logging.warning( + "Metric value to log should be a number. Got %s", type(value)) + return None + + extras = _convert_to_json_dict(extras) + return { + "name": name, + "value": float(value), + "unit": unit, + "global_step": global_step, + "timestamp": datetime.datetime.utcnow().strftime( + _DATE_TIME_FORMAT_PATTERN), + "extras": extras} + + +def _collect_tensorflow_info(run_info): + run_info["tensorflow_version"] = { + "version": tf.version.VERSION, "git_hash": tf.version.GIT_VERSION} + + +def _collect_run_params(run_info, run_params): + """Log the parameter information for the benchmark run.""" + def process_param(name, value): + type_check = { + str: {"name": name, "string_value": value}, + int: {"name": name, "long_value": value}, + bool: {"name": name, "bool_value": str(value)}, + float: {"name": name, "float_value": value}, + } + return type_check.get(type(value), + {"name": name, "string_value": str(value)}) + if run_params: + run_info["run_parameters"] = [ + process_param(k, v) for k, v in sorted(run_params.items())] + + +def _collect_tensorflow_environment_variables(run_info): + run_info["tensorflow_environment_variables"] = [ + {"name": k, "value": v} + for k, v in sorted(os.environ.items()) if k.startswith("TF_")] + + +# The following code is mirrored from tensorflow/tools/test/system_info_lib +# which is not exposed for import. +def _collect_cpu_info(run_info): + """Collect the CPU information for the local environment.""" + cpu_info = {} + + cpu_info["num_cores"] = multiprocessing.cpu_count() + + try: + # Note: cpuinfo is not installed in the TensorFlow OSS tree. + # It is installable via pip. + import cpuinfo # pylint: disable=g-import-not-at-top + + info = cpuinfo.get_cpu_info() + cpu_info["cpu_info"] = info["brand"] + cpu_info["mhz_per_cpu"] = info["hz_advertised_raw"][0] / 1.0e6 + + run_info["machine_config"]["cpu_info"] = cpu_info + except ImportError: + tf.compat.v1.logging.warn( + "'cpuinfo' not imported. CPU info will not be logged.") + + +def _collect_memory_info(run_info): + try: + # Note: psutil is not installed in the TensorFlow OSS tree. + # It is installable via pip. + import psutil # pylint: disable=g-import-not-at-top + vmem = psutil.virtual_memory() + run_info["machine_config"]["memory_total"] = vmem.total + run_info["machine_config"]["memory_available"] = vmem.available + except ImportError: + tf.compat.v1.logging.warn( + "'psutil' not imported. Memory info will not be logged.") + + +def _collect_test_environment(run_info): + """Detect the local environment, eg GCE, AWS or DGX, etc.""" + if cloud_lib.on_gcp(): + run_info["test_environment"] = GCP_TEST_ENV + # TODO(scottzhu): Add more testing env detection for other platform + + +def _parse_gpu_model(physical_device_desc): + # Assume all the GPU connected are same model + for kv in physical_device_desc.split(","): + k, _, v = kv.partition(":") + if k.strip() == "name": + return v.strip() + return None + + +def _convert_to_json_dict(input_dict): + if input_dict: + return [{"name": k, "value": v} for k, v in sorted(input_dict.items())] + else: + return [] diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger_test.py new file mode 100644 index 0000000..520db5f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/logger_test.py @@ -0,0 +1,365 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tests for benchmark logger.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import tempfile +import time +import unittest + +import mock +from absl.testing import flagsaver +import tensorflow as tf # pylint: disable=g-bad-import-order + +try: + from google.cloud import bigquery +except ImportError: + bigquery = None + +from official.utils.misc import keras_utils +from official.utils.flags import core as flags_core +from official.utils.logs import logger + + +class BenchmarkLoggerTest(tf.test.TestCase): + + @classmethod + def setUpClass(cls): # pylint: disable=invalid-name + super(BenchmarkLoggerTest, cls).setUpClass() + flags_core.define_benchmark() + + def test_get_default_benchmark_logger(self): + with flagsaver.flagsaver(benchmark_logger_type="foo"): + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BaseBenchmarkLogger) + + def test_config_base_benchmark_logger(self): + with flagsaver.flagsaver(benchmark_logger_type="BaseBenchmarkLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BaseBenchmarkLogger) + + def test_config_benchmark_file_logger(self): + # Set the benchmark_log_dir first since the benchmark_logger_type will need + # the value to be set when it does the validation. + with flagsaver.flagsaver(benchmark_log_dir="/tmp"): + with flagsaver.flagsaver(benchmark_logger_type="BenchmarkFileLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BenchmarkFileLogger) + + @unittest.skipIf(bigquery is None, "Bigquery dependency is not installed.") + @mock.patch.object(bigquery, "Client") + def test_config_benchmark_bigquery_logger(self, mock_bigquery_client): + with flagsaver.flagsaver(benchmark_logger_type="BenchmarkBigQueryLogger"): + logger.config_benchmark_logger() + self.assertIsInstance(logger.get_benchmark_logger(), + logger.BenchmarkBigQueryLogger) + + @mock.patch("official.utils.logs.logger.config_benchmark_logger") + def test_benchmark_context(self, mock_config_benchmark_logger): + mock_logger = mock.MagicMock() + mock_config_benchmark_logger.return_value = mock_logger + with logger.benchmark_context(None): + tf.compat.v1.logging.info("start benchmarking") + mock_logger.on_finish.assert_called_once_with(logger.RUN_STATUS_SUCCESS) + + @mock.patch("official.utils.logs.logger.config_benchmark_logger") + def test_benchmark_context_failure(self, mock_config_benchmark_logger): + mock_logger = mock.MagicMock() + mock_config_benchmark_logger.return_value = mock_logger + with self.assertRaises(RuntimeError): + with logger.benchmark_context(None): + raise RuntimeError("training error") + mock_logger.on_finish.assert_called_once_with(logger.RUN_STATUS_FAILURE) + + +class BaseBenchmarkLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BaseBenchmarkLoggerTest, self).setUp() + self._actual_log = tf.compat.v1.logging.info + self.logged_message = None + + def mock_log(*args, **kwargs): + self.logged_message = args + self._actual_log(*args, **kwargs) + + tf.compat.v1.logging.info = mock_log + + def tearDown(self): + super(BaseBenchmarkLoggerTest, self).tearDown() + tf.compat.v1.logging.info = self._actual_log + + def test_log_metric(self): + log = logger.BaseBenchmarkLogger() + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + + expected_log_prefix = "Benchmark metric:" + self.assertRegexpMatches(str(self.logged_message), expected_log_prefix) + + +class BenchmarkFileLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BenchmarkFileLoggerTest, self).setUp() + # Avoid pulling extra env vars from test environment which affects the test + # result, eg. Kokoro test has a TF_PKG env which affect the test case + # test_collect_tensorflow_environment_variables() + self.original_environ = dict(os.environ) + os.environ.clear() + + def tearDown(self): + super(BenchmarkFileLoggerTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + os.environ.clear() + os.environ.update(self.original_environ) + + def test_create_logging_dir(self): + non_exist_temp_dir = os.path.join(self.get_temp_dir(), "unknown_dir") + self.assertFalse(tf.io.gfile.isdir(non_exist_temp_dir)) + + logger.BenchmarkFileLogger(non_exist_temp_dir) + self.assertTrue(tf.io.gfile.isdir(non_exist_temp_dir)) + + def test_log_metric(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + metric = json.loads(f.readline()) + self.assertEqual(metric["name"], "accuracy") + self.assertEqual(metric["value"], 0.999) + self.assertEqual(metric["unit"], None) + self.assertEqual(metric["global_step"], 1e4) + self.assertEqual(metric["extras"], [{"name": "name", "value": "value"}]) + + def test_log_multiple_metrics(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + log.log_metric("loss", 0.02, global_step=1e4) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + accuracy = json.loads(f.readline()) + self.assertEqual(accuracy["name"], "accuracy") + self.assertEqual(accuracy["value"], 0.999) + self.assertEqual(accuracy["unit"], None) + self.assertEqual(accuracy["global_step"], 1e4) + self.assertEqual(accuracy["extras"], [{"name": "name", "value": "value"}]) + + loss = json.loads(f.readline()) + self.assertEqual(loss["name"], "loss") + self.assertEqual(loss["value"], 0.02) + self.assertEqual(loss["unit"], None) + self.assertEqual(loss["global_step"], 1e4) + self.assertEqual(loss["extras"], []) + + def test_log_non_number_value(self): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + const = tf.constant(1) + log.log_metric("accuracy", const) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertFalse(tf.io.gfile.exists(metric_log)) + + def test_log_evaluation_result(self): + eval_result = {"loss": 0.46237424, + "global_step": 207082, + "accuracy": 0.9285} + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_evaluation_result(eval_result) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertTrue(tf.io.gfile.exists(metric_log)) + with tf.io.gfile.GFile(metric_log) as f: + accuracy = json.loads(f.readline()) + self.assertEqual(accuracy["name"], "accuracy") + self.assertEqual(accuracy["value"], 0.9285) + self.assertEqual(accuracy["unit"], None) + self.assertEqual(accuracy["global_step"], 207082) + + loss = json.loads(f.readline()) + self.assertEqual(loss["name"], "loss") + self.assertEqual(loss["value"], 0.46237424) + self.assertEqual(loss["unit"], None) + self.assertEqual(loss["global_step"], 207082) + + def test_log_evaluation_result_with_invalid_type(self): + eval_result = "{'loss': 0.46237424, 'global_step': 207082}" + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + log.log_evaluation_result(eval_result) + + metric_log = os.path.join(log_dir, "metric.log") + self.assertFalse(tf.io.gfile.exists(metric_log)) + + @mock.patch("official.utils.logs.logger._gather_run_info") + def test_log_run_info(self, mock_gather_run_info): + log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + log = logger.BenchmarkFileLogger(log_dir) + run_info = {"model_name": "model_name", + "dataset": "dataset_name", + "run_info": "run_value"} + mock_gather_run_info.return_value = run_info + log.log_run_info("model_name", "dataset_name", {}) + + run_log = os.path.join(log_dir, "benchmark_run.log") + self.assertTrue(tf.io.gfile.exists(run_log)) + with tf.io.gfile.GFile(run_log) as f: + run_info = json.loads(f.readline()) + self.assertEqual(run_info["model_name"], "model_name") + self.assertEqual(run_info["dataset"], "dataset_name") + self.assertEqual(run_info["run_info"], "run_value") + + def test_collect_tensorflow_info(self): + run_info = {} + logger._collect_tensorflow_info(run_info) + self.assertNotEqual(run_info["tensorflow_version"], {}) + self.assertEqual(run_info["tensorflow_version"]["version"], + tf.version.VERSION) + self.assertEqual(run_info["tensorflow_version"]["git_hash"], + tf.version.GIT_VERSION) + + def test_collect_run_params(self): + run_info = {} + run_parameters = { + "batch_size": 32, + "synthetic_data": True, + "train_epochs": 100.00, + "dtype": "fp16", + "resnet_size": 50, + "random_tensor": tf.constant(2.0) + } + logger._collect_run_params(run_info, run_parameters) + self.assertEqual(len(run_info["run_parameters"]), 6) + self.assertEqual(run_info["run_parameters"][0], + {"name": "batch_size", "long_value": 32}) + self.assertEqual(run_info["run_parameters"][1], + {"name": "dtype", "string_value": "fp16"}) + v1_tensor = {"name": "random_tensor", "string_value": + "Tensor(\"Const:0\", shape=(), dtype=float32)"} + v2_tensor = {"name": "random_tensor", "string_value": + "tf.Tensor(2.0, shape=(), dtype=float32)"} + self.assertIn(run_info["run_parameters"][2], [v1_tensor, v2_tensor]) + + + self.assertEqual(run_info["run_parameters"][3], + {"name": "resnet_size", "long_value": 50}) + self.assertEqual(run_info["run_parameters"][4], + {"name": "synthetic_data", "bool_value": "True"}) + self.assertEqual(run_info["run_parameters"][5], + {"name": "train_epochs", "float_value": 100.00}) + + def test_collect_tensorflow_environment_variables(self): + os.environ["TF_ENABLE_WINOGRAD_NONFUSED"] = "1" + os.environ["TF_OTHER"] = "2" + os.environ["OTHER"] = "3" + + run_info = {} + logger._collect_tensorflow_environment_variables(run_info) + self.assertIsNotNone(run_info["tensorflow_environment_variables"]) + expected_tf_envs = [ + {"name": "TF_ENABLE_WINOGRAD_NONFUSED", "value": "1"}, + {"name": "TF_OTHER", "value": "2"}, + ] + self.assertEqual(run_info["tensorflow_environment_variables"], + expected_tf_envs) + + def test_collect_memory_info(self): + run_info = {"machine_config": {}} + logger._collect_memory_info(run_info) + self.assertIsNotNone(run_info["machine_config"]["memory_total"]) + self.assertIsNotNone(run_info["machine_config"]["memory_available"]) + + +@unittest.skipIf(bigquery is None, "Bigquery dependency is not installed.") +class BenchmarkBigQueryLoggerTest(tf.test.TestCase): + + def setUp(self): + super(BenchmarkBigQueryLoggerTest, self).setUp() + # Avoid pulling extra env vars from test environment which affects the test + # result, eg. Kokoro test has a TF_PKG env which affect the test case + # test_collect_tensorflow_environment_variables() + self.original_environ = dict(os.environ) + os.environ.clear() + + self.mock_bq_uploader = mock.MagicMock() + self.logger = logger.BenchmarkBigQueryLogger( + self.mock_bq_uploader, "dataset", "run_table", "run_status_table", + "metric_table", "run_id") + + def tearDown(self): + super(BenchmarkBigQueryLoggerTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + os.environ.clear() + os.environ.update(self.original_environ) + + def test_log_metric(self): + self.logger.log_metric( + "accuracy", 0.999, global_step=1e4, extras={"name": "value"}) + expected_metric_json = [{ + "name": "accuracy", + "value": 0.999, + "unit": None, + "global_step": 1e4, + "timestamp": mock.ANY, + "extras": [{"name": "name", "value": "value"}] + }] + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.upload_benchmark_metric_json.assert_called_once_with( + "dataset", "metric_table", "run_id", expected_metric_json) + + @mock.patch("official.utils.logs.logger._gather_run_info") + def test_log_run_info(self, mock_gather_run_info): + run_info = {"model_name": "model_name", + "dataset": "dataset_name", + "run_info": "run_value"} + mock_gather_run_info.return_value = run_info + self.logger.log_run_info("model_name", "dataset_name", {}) + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.upload_benchmark_run_json.assert_called_once_with( + "dataset", "run_table", "run_id", run_info) + self.mock_bq_uploader.insert_run_status.assert_called_once_with( + "dataset", "run_status_table", "run_id", "running") + + def test_on_finish(self): + self.logger.on_finish(logger.RUN_STATUS_SUCCESS) + # log_metric will call upload_benchmark_metric_json in a separate thread. + # Give it some grace period for the new thread before assert. + time.sleep(1) + self.mock_bq_uploader.update_run_status.assert_called_once_with( + "dataset", "run_status_table", "run_id", logger.RUN_STATUS_SUCCESS) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook.py new file mode 100644 index 0000000..f408e3e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook.py @@ -0,0 +1,97 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Session hook for logging benchmark metric.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + + +class LoggingMetricHook(tf.estimator.LoggingTensorHook): + """Hook to log benchmark metric information. + + This hook is very similar as tf.train.LoggingTensorHook, which logs given + tensors every N local steps, every N seconds, or at the end. The metric + information will be logged to given log_dir or via metric_logger in JSON + format, which can be consumed by data analysis pipeline later. + + Note that if `at_end` is True, `tensors` should not include any tensor + whose evaluation produces a side effect such as consuming additional inputs. + """ + + def __init__(self, tensors, metric_logger=None, + every_n_iter=None, every_n_secs=None, at_end=False): + """Initializer for LoggingMetricHook. + + Args: + tensors: `dict` that maps string-valued tags to tensors/tensor names, + or `iterable` of tensors/tensor names. + metric_logger: instance of `BenchmarkLogger`, the benchmark logger that + hook should use to write the log. + every_n_iter: `int`, print the values of `tensors` once every N local + steps taken on the current worker. + every_n_secs: `int` or `float`, print the values of `tensors` once every N + seconds. Exactly one of `every_n_iter` and `every_n_secs` should be + provided. + at_end: `bool` specifying whether to print the values of `tensors` at the + end of the run. + + Raises: + ValueError: + 1. `every_n_iter` is non-positive, or + 2. Exactly one of every_n_iter and every_n_secs should be provided. + 3. Exactly one of log_dir and metric_logger should be provided. + """ + super(LoggingMetricHook, self).__init__( + tensors=tensors, + every_n_iter=every_n_iter, + every_n_secs=every_n_secs, + at_end=at_end) + + if metric_logger is None: + raise ValueError("metric_logger should be provided.") + self._logger = metric_logger + + def begin(self): + super(LoggingMetricHook, self).begin() + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + "Global step should be created to use LoggingMetricHook.") + if self._global_step_tensor.name not in self._current_tensors: + self._current_tensors[self._global_step_tensor.name] = ( + self._global_step_tensor) + + def after_run(self, unused_run_context, run_values): + # should_trigger is a internal state that populated at before_run, and it is + # using self_timer to determine whether it should trigger. + if self._should_trigger: + self._log_metric(run_values.results) + + self._iter_count += 1 + + def end(self, session): + if self._log_at_end: + values = session.run(self._current_tensors) + self._log_metric(values) + + def _log_metric(self, tensor_values): + self._timer.update_last_triggered_step(self._iter_count) + global_step = tensor_values[self._global_step_tensor.name] + # self._tag_order is populated during the init of LoggingTensorHook + for tag in self._tag_order: + self._logger.log_metric(tag, tensor_values[tag], global_step=global_step) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook_test.py new file mode 100644 index 0000000..870ed6e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/metric_hook_test.py @@ -0,0 +1,217 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for metric_hook.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tempfile +import time + +import tensorflow as tf # pylint: disable=g-bad-import-order +from tensorflow.python.training import monitored_session # pylint: disable=g-bad-import-order + +from official.utils.logs import metric_hook +from official.utils.testing import mock_lib + + +class LoggingMetricHookTest(tf.test.TestCase): + """Tests for LoggingMetricHook.""" + + def setUp(self): + super(LoggingMetricHookTest, self).setUp() + + self._log_dir = tempfile.mkdtemp(dir=self.get_temp_dir()) + self._logger = mock_lib.MockBenchmarkLogger() + + def tearDown(self): + super(LoggingMetricHookTest, self).tearDown() + tf.io.gfile.rmtree(self.get_temp_dir()) + + def test_illegal_args(self): + with self.assertRaisesRegexp(ValueError, "nvalid every_n_iter"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=0) + with self.assertRaisesRegexp(ValueError, "nvalid every_n_iter"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=-10) + with self.assertRaisesRegexp(ValueError, "xactly one of"): + metric_hook.LoggingMetricHook( + tensors=["t"], every_n_iter=5, every_n_secs=5) + with self.assertRaisesRegexp(ValueError, "xactly one of"): + metric_hook.LoggingMetricHook(tensors=["t"]) + with self.assertRaisesRegexp(ValueError, "metric_logger"): + metric_hook.LoggingMetricHook(tensors=["t"], every_n_iter=5) + + def test_print_at_end_only(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + t = tf.constant(42.0, name="foo") + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], at_end=True, metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + for _ in range(3): + mon_sess.run(train_op) + self.assertEqual(self._logger.logged_metric, []) + + hook.end(sess) + self.assertEqual(len(self._logger.logged_metric), 1) + metric = self._logger.logged_metric[0] + self.assertRegexpMatches(metric["name"], "foo") + self.assertEqual(metric["value"], 42.0) + self.assertEqual(metric["unit"], None) + self.assertEqual(metric["global_step"], 0) + + def test_global_step_not_found(self): + with tf.Graph().as_default(): + t = tf.constant(42.0, name="foo") + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], at_end=True, metric_logger=self._logger) + + with self.assertRaisesRegexp( + RuntimeError, "should be created to use LoggingMetricHook."): + hook.begin() + + def test_log_tensors(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + t1 = tf.constant(42.0, name="foo") + t2 = tf.constant(43.0, name="bar") + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t1, t2], at_end=True, metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + for _ in range(3): + mon_sess.run(train_op) + self.assertEqual(self._logger.logged_metric, []) + + hook.end(sess) + self.assertEqual(len(self._logger.logged_metric), 2) + metric1 = self._logger.logged_metric[0] + self.assertRegexpMatches(str(metric1["name"]), "foo") + self.assertEqual(metric1["value"], 42.0) + self.assertEqual(metric1["unit"], None) + self.assertEqual(metric1["global_step"], 0) + + metric2 = self._logger.logged_metric[1] + self.assertRegexpMatches(str(metric2["name"]), "bar") + self.assertEqual(metric2["value"], 43.0) + self.assertEqual(metric2["unit"], None) + self.assertEqual(metric2["global_step"], 0) + + def _validate_print_every_n_steps(self, sess, at_end): + t = tf.constant(42.0, name="foo") + + train_op = tf.constant(3) + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], every_n_iter=10, at_end=at_end, + metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + for _ in range(3): + self._logger.logged_metric = [] + for _ in range(9): + mon_sess.run(train_op) + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + # Add additional run to verify proper reset when called multiple times. + self._logger.logged_metric = [] + mon_sess.run(train_op) + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + self._logger.logged_metric = [] + hook.end(sess) + if at_end: + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + else: + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + def test_print_every_n_steps(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_steps(sess, at_end=False) + # Verify proper reset. + self._validate_print_every_n_steps(sess, at_end=False) + + def test_print_every_n_steps_and_end(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_steps(sess, at_end=True) + # Verify proper reset. + self._validate_print_every_n_steps(sess, at_end=True) + + def _validate_print_every_n_secs(self, sess, at_end): + t = tf.constant(42.0, name="foo") + train_op = tf.constant(3) + + hook = metric_hook.LoggingMetricHook( + tensors=[t.name], every_n_secs=1.0, at_end=at_end, + metric_logger=self._logger) + hook.begin() + mon_sess = monitored_session._HookedSession(sess, [hook]) # pylint: disable=protected-access + sess.run(tf.compat.v1.global_variables_initializer()) + + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + # assertNotRegexpMatches is not supported by python 3.1 and later + self._logger.logged_metric = [] + mon_sess.run(train_op) + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + time.sleep(1.0) + + self._logger.logged_metric = [] + mon_sess.run(train_op) + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + + self._logger.logged_metric = [] + hook.end(sess) + if at_end: + self.assertRegexpMatches(str(self._logger.logged_metric), t.name) + else: + # assertNotRegexpMatches is not supported by python 3.1 and later + self.assertEqual(str(self._logger.logged_metric).find(t.name), -1) + + def test_print_every_n_secs(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_secs(sess, at_end=False) + # Verify proper reset. + self._validate_print_every_n_secs(sess, at_end=False) + + def test_print_every_n_secs_and_end(self): + with tf.Graph().as_default(), tf.compat.v1.Session() as sess: + tf.compat.v1.train.get_or_create_global_step() + self._validate_print_every_n_secs(sess, at_end=True) + # Verify proper reset. + self._validate_print_every_n_secs(sess, at_end=True) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/mlperf_helper.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/mlperf_helper.py new file mode 100644 index 0000000..c9c0434 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/logs/mlperf_helper.py @@ -0,0 +1,192 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Wrapper for the mlperf logging utils. + +MLPerf compliance logging is only desired under a limited set of circumstances. +This module is intended to keep users from needing to consider logging (or +install the module) unless they are performing mlperf runs. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from collections import namedtuple +import json +import os +import re +import subprocess +import sys +import typing + +import tensorflow as tf + +_MIN_VERSION = (0, 0, 10) +_STACK_OFFSET = 2 + +SUDO = "sudo" if os.geteuid() else "" + +# This indirection is used in docker. +DROP_CACHE_LOC = os.getenv("DROP_CACHE_LOC", "/proc/sys/vm/drop_caches") + +_NCF_PREFIX = "NCF_RAW_" + +# TODO(robieta): move line parsing to mlperf util +_PREFIX = r"(?:{})?:::MLPv([0-9]+).([0-9]+).([0-9]+)".format(_NCF_PREFIX) +_BENCHMARK = r"([a-zA-Z0-9_]+)" +_TIMESTAMP = r"([0-9]+\.[0-9]+)" +_CALLSITE = r"\((.+):([0-9]+)\)" +_TAG = r"([a-zA-Z0-9_]+)" +_VALUE = r"(.*)" + +ParsedLine = namedtuple("ParsedLine", ["version", "benchmark", "timestamp", + "callsite", "tag", "value"]) + +LINE_PATTERN = re.compile( + "^{prefix} {benchmark} {timestamp} {callsite} {tag}(: |$){value}?$".format( + prefix=_PREFIX, benchmark=_BENCHMARK, timestamp=_TIMESTAMP, + callsite=_CALLSITE, tag=_TAG, value=_VALUE)) + + +def parse_line(line): # type: (str) -> typing.Optional[ParsedLine] + match = LINE_PATTERN.match(line.strip()) + if not match: + return + + major, minor, micro, benchmark, timestamp = match.groups()[:5] + call_file, call_line, tag, _, value = match.groups()[5:] + + return ParsedLine(version=(int(major), int(minor), int(micro)), + benchmark=benchmark, timestamp=timestamp, + callsite=(call_file, call_line), tag=tag, value=value) + + +def unparse_line(parsed_line): # type: (ParsedLine) -> str + version_str = "{}.{}.{}".format(*parsed_line.version) + callsite_str = "({}:{})".format(*parsed_line.callsite) + value_str = ": {}".format(parsed_line.value) if parsed_line.value else "" + return ":::MLPv{} {} {} {} {} {}".format( + version_str, parsed_line.benchmark, parsed_line.timestamp, callsite_str, + parsed_line.tag, value_str) + + +def get_mlperf_log(): + """Shielded import of mlperf_log module.""" + try: + import mlperf_compliance + + def test_mlperf_log_pip_version(): + """Check that mlperf_compliance is up to date.""" + import pkg_resources + version = pkg_resources.get_distribution("mlperf_compliance") + version = tuple(int(i) for i in version.version.split(".")) + if version < _MIN_VERSION: + tf.compat.v1.logging.warning( + "mlperf_compliance is version {}, must be >= {}".format( + ".".join([str(i) for i in version]), + ".".join([str(i) for i in _MIN_VERSION]))) + raise ImportError + return mlperf_compliance.mlperf_log + + mlperf_log = test_mlperf_log_pip_version() + + except ImportError: + mlperf_log = None + + return mlperf_log + + +class Logger(object): + """MLPerf logger indirection class. + + This logger only logs for MLPerf runs, and prevents various errors associated + with not having the mlperf_compliance package installed. + """ + class Tags(object): + def __init__(self, mlperf_log): + self._enabled = False + self._mlperf_log = mlperf_log + + def __getattr__(self, item): + if self._mlperf_log is None or not self._enabled: + return + return getattr(self._mlperf_log, item) + + def __init__(self): + self._enabled = False + self._mlperf_log = get_mlperf_log() + self.tags = self.Tags(self._mlperf_log) + + def __call__(self, enable=False): + if enable and self._mlperf_log is None: + raise ImportError("MLPerf logging was requested, but mlperf_compliance " + "module could not be loaded.") + + self._enabled = enable + self.tags._enabled = enable + return self + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + self._enabled = False + self.tags._enabled = False + + @property + def log_file(self): + if self._mlperf_log is None: + return + return self._mlperf_log.LOG_FILE + + @property + def enabled(self): + return self._enabled + + def ncf_print(self, key, value=None, stack_offset=_STACK_OFFSET, + deferred=False, extra_print=False, prefix=_NCF_PREFIX): + if self._mlperf_log is None or not self.enabled: + return + self._mlperf_log.ncf_print(key=key, value=value, stack_offset=stack_offset, + deferred=deferred, extra_print=extra_print, + prefix=prefix) + + def set_ncf_root(self, path): + if self._mlperf_log is None: + return + self._mlperf_log.ROOT_DIR_NCF = path + + +LOGGER = Logger() +ncf_print, set_ncf_root = LOGGER.ncf_print, LOGGER.set_ncf_root +TAGS = LOGGER.tags + + +def clear_system_caches(): + if not LOGGER.enabled: + return + ret_code = subprocess.call( + ["sync && echo 3 | {} tee {}".format(SUDO, DROP_CACHE_LOC)], + shell=True) + + if ret_code: + raise ValueError("Failed to clear caches") + + +if __name__ == "__main__": + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + with LOGGER(True): + ncf_print(key=TAGS.RUN_START) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/callstack_sampler.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/callstack_sampler.py new file mode 100644 index 0000000..984f133 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/callstack_sampler.py @@ -0,0 +1,62 @@ +"""A simple Python callstack sampler.""" + +import contextlib +import datetime +import signal +import traceback + + +class CallstackSampler(object): + """A simple signal-based Python callstack sampler. + """ + + def __init__(self, interval=None): + self.stacks = [] + self.interval = 0.001 if interval is None else interval + + def _sample(self, signum, frame): + """Samples the current stack.""" + del signum + stack = traceback.extract_stack(frame) + formatted_stack = [] + formatted_stack.append(datetime.datetime.utcnow()) + for filename, lineno, function_name, text in stack: + formatted_frame = '{}:{}({})({})'.format(filename, lineno, function_name, + text) + formatted_stack.append(formatted_frame) + self.stacks.append(formatted_stack) + signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0) + + @contextlib.contextmanager + def profile(self): + signal.signal(signal.SIGVTALRM, self._sample) + signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0) + try: + yield + finally: + signal.setitimer(signal.ITIMER_VIRTUAL, 0) + + def save(self, fname): + with open(fname, 'w') as f: + for s in self.stacks: + for l in s: + f.write('%s\n' % l) + f.write('\n') + + +@contextlib.contextmanager +def callstack_sampling(filename, interval=None): + """Periodically samples the Python callstack. + + Args: + filename: the filename + interval: the sampling interval, in seconds. Defaults to 0.001. + + Yields: + nothing + """ + sampler = CallstackSampler(interval=interval) + with sampler.profile(): + yield + sampler.save(filename) + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils.py new file mode 100644 index 0000000..fd5c742 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils.py @@ -0,0 +1,338 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper functions for running models in a distributed setting.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import os +import random +import string +import tensorflow.compat.v2 as tf + +from official.utils.misc import tpu_lib + + +def _collective_communication(all_reduce_alg): + """Return a CollectiveCommunication based on all_reduce_alg. + + Args: + all_reduce_alg: a string specifying which collective communication to pick, + or None. + + Returns: + tf.distribute.experimental.CollectiveCommunication object + + Raises: + ValueError: if `all_reduce_alg` not in [None, 'ring', 'nccl'] + """ + collective_communication_options = { + None: tf.distribute.experimental.CollectiveCommunication.AUTO, + "ring": tf.distribute.experimental.CollectiveCommunication.RING, + "nccl": tf.distribute.experimental.CollectiveCommunication.NCCL + } + if all_reduce_alg not in collective_communication_options: + raise ValueError( + "When used with `multi_worker_mirrored`, valid values for " + "all_reduce_alg are ['ring', 'nccl']. Supplied value: {}".format( + all_reduce_alg)) + return collective_communication_options[all_reduce_alg] + + +def _mirrored_cross_device_ops(all_reduce_alg, num_packs): + """Return a CrossDeviceOps based on all_reduce_alg and num_packs. + + Args: + all_reduce_alg: a string specifying which cross device op to pick, or None. + num_packs: an integer specifying number of packs for the cross device op. + + Returns: + tf.distribute.CrossDeviceOps object or None. + + Raises: + ValueError: if `all_reduce_alg` not in [None, 'nccl', 'hierarchical_copy']. + """ + if all_reduce_alg is None: + return None + mirrored_all_reduce_options = { + "nccl": tf.distribute.NcclAllReduce, + "hierarchical_copy": tf.distribute.HierarchicalCopyAllReduce + } + if all_reduce_alg not in mirrored_all_reduce_options: + raise ValueError( + "When used with `mirrored`, valid values for all_reduce_alg are " + "['nccl', 'hierarchical_copy']. Supplied value: {}".format( + all_reduce_alg)) + cross_device_ops_class = mirrored_all_reduce_options[all_reduce_alg] + return cross_device_ops_class(num_packs=num_packs) + + +def get_distribution_strategy(distribution_strategy="mirrored", + num_gpus=0, + all_reduce_alg=None, + num_packs=1, + tpu_address=None): + """Return a DistributionStrategy for running the model. + + Args: + distribution_strategy: a string specifying which distribution strategy to + use. Accepted values are 'off', 'one_device', 'mirrored', + 'parameter_server', 'multi_worker_mirrored', and 'tpu' -- case insensitive. + 'off' means not to use Distribution Strategy; 'tpu' means to use + TPUStrategy using `tpu_address`. + num_gpus: Number of GPUs to run this model. + all_reduce_alg: Optional. Specifies which algorithm to use when performing + all-reduce. For `MirroredStrategy`, valid values are "nccl" and + "hierarchical_copy". For `MultiWorkerMirroredStrategy`, valid values are + "ring" and "nccl". If None, DistributionStrategy will choose based on + device topology. + num_packs: Optional. Sets the `num_packs` in `tf.distribute.NcclAllReduce` + or `tf.distribute.HierarchicalCopyAllReduce` for `MirroredStrategy`. + tpu_address: Optional. String that represents TPU to connect to. Must not + be None if `distribution_strategy` is set to `tpu`. + Returns: + tf.distribute.DistibutionStrategy object. + Raises: + ValueError: if `distribution_strategy` is 'off' or 'one_device' and + `num_gpus` is larger than 1; or `num_gpus` is negative or if + `distribution_strategy` is `tpu` but `tpu_address` is not specified. + """ + if num_gpus < 0: + raise ValueError("`num_gpus` can not be negative.") + + distribution_strategy = distribution_strategy.lower() + if distribution_strategy == "off": + if num_gpus > 1: + raise ValueError( + "When {} GPUs are specified, distribution_strategy " + "flag cannot be set to 'off'.".format(num_gpus)) + return None + + if distribution_strategy == "tpu": + # When tpu_address is an empty string, we communicate with local TPUs. + cluster_resolver = tpu_lib.tpu_initialize(tpu_address) + return tf.distribute.experimental.TPUStrategy(cluster_resolver) + + if distribution_strategy == "multi_worker_mirrored": + return tf.distribute.experimental.MultiWorkerMirroredStrategy( + communication=_collective_communication(all_reduce_alg)) + + if distribution_strategy == "one_device": + if num_gpus == 0: + return tf.distribute.OneDeviceStrategy("device:CPU:0") + if num_gpus > 1: + raise ValueError("`OneDeviceStrategy` can not be used for more than " + "one device.") + return tf.distribute.OneDeviceStrategy("device:GPU:0") + + if distribution_strategy == "mirrored": + if num_gpus == 0: + devices = ["device:CPU:0"] + else: + devices = ["device:GPU:%d" % i for i in range(num_gpus)] + return tf.distribute.MirroredStrategy( + devices=devices, + cross_device_ops=_mirrored_cross_device_ops(all_reduce_alg, num_packs)) + + if distribution_strategy == "parameter_server": + return tf.distribute.experimental.ParameterServerStrategy() + + raise ValueError( + "Unrecognized Distribution Strategy: %r" % distribution_strategy) + + +def per_replica_batch_size(batch_size, num_gpus): + """For multi-gpu, batch-size must be a multiple of the number of GPUs. + + + Note that distribution strategy handles this automatically when used with + Keras. For using with Estimator, we need to get per GPU batch. + + Args: + batch_size: Global batch size to be divided among devices. This should be + equal to num_gpus times the single-GPU batch_size for multi-gpu training. + num_gpus: How many GPUs are used with DistributionStrategies. + + Returns: + Batch size per device. + + Raises: + ValueError: if batch_size is not divisible by number of devices + """ + if num_gpus <= 1: + return batch_size + + remainder = batch_size % num_gpus + if remainder: + err = ('When running with multiple GPUs, batch size ' + 'must be a multiple of the number of available GPUs. Found {} ' + 'GPUs with a batch size of {}; try --batch_size={} instead.' + ).format(num_gpus, batch_size, batch_size - remainder) + raise ValueError(err) + return int(batch_size / num_gpus) + + +# The `SyntheticDataset` is a temporary solution for generating synthetic data +# directly on devices. It is only useful for Keras with Distribution +# Strategies. We will have better support in `tf.data` or Distribution Strategy +# later. +class SyntheticDataset(object): + """A dataset that generates synthetic data on each device.""" + + def __init__(self, dataset, split_by=1): + # dataset.take(1) doesn't have GPU kernel. + with tf.device('device:CPU:0'): + tensor = tf.data.experimental.get_single_element(dataset.take(1)) + flat_tensor = tf.nest.flatten(tensor) + variable_data = [] + initializers = [] + for t in flat_tensor: + rebatched_t = tf.split(t, num_or_size_splits=split_by, axis=0)[0] + assert rebatched_t.shape.is_fully_defined(), rebatched_t.shape + v = tf.compat.v1.get_local_variable(self._random_name(), + initializer=rebatched_t) + variable_data.append(v) + initializers.append(v.initializer) + input_data = tf.nest.pack_sequence_as(tensor, variable_data) + self._iterator = SyntheticIterator(input_data, initializers) + + def _random_name(self, size=10, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + + def __iter__(self): + return self._iterator + + def make_one_shot_iterator(self): + return self._iterator + + def make_initializable_iterator(self): + return self._iterator + + +class SyntheticIterator(object): + """A dataset that generates synthetic data on each device.""" + + def __init__(self, input_data, initializers): + self._input_data = input_data + self._initializers = initializers + + def get_next(self): + return self._input_data + + def next(self): + return self.__next__() + + def __next__(self): + try: + return self.get_next() + except tf.errors.OutOfRangeError: + raise StopIteration + + def initialize(self): + if tf.executing_eagerly(): + return tf.no_op() + else: + return self._initializers + + +def _monkey_patch_dataset_method(strategy): + """Monkey-patch `strategy`'s `make_dataset_iterator` method.""" + def make_dataset(self, dataset): + tf.compat.v1.logging.info('Using pure synthetic data.') + with self.scope(): + if self.extended._global_batch_size: # pylint: disable=protected-access + return SyntheticDataset(dataset, self.num_replicas_in_sync) + else: + return SyntheticDataset(dataset) + + def make_iterator(self, dataset): + dist_dataset = make_dataset(self, dataset) + return iter(dist_dataset) + + strategy.orig_make_dataset_iterator = strategy.make_dataset_iterator + strategy.make_dataset_iterator = make_iterator + strategy.orig_distribute_dataset = strategy.experimental_distribute_dataset + strategy.experimental_distribute_dataset = make_dataset + + +def _undo_monkey_patch_dataset_method(strategy): + if hasattr(strategy, 'orig_make_dataset_iterator'): + strategy.make_dataset_iterator = strategy.orig_make_dataset_iterator + if hasattr(strategy, 'orig_distribute_dataset'): + strategy.make_dataset_iterator = strategy.orig_distribute_dataset + + +def set_up_synthetic_data(): + _monkey_patch_dataset_method(tf.distribute.OneDeviceStrategy) + _monkey_patch_dataset_method(tf.distribute.MirroredStrategy) + _monkey_patch_dataset_method( + tf.distribute.experimental.MultiWorkerMirroredStrategy) + + +def undo_set_up_synthetic_data(): + _undo_monkey_patch_dataset_method(tf.distribute.OneDeviceStrategy) + _undo_monkey_patch_dataset_method(tf.distribute.MirroredStrategy) + _undo_monkey_patch_dataset_method( + tf.distribute.experimental.MultiWorkerMirroredStrategy) + + +def configure_cluster(worker_hosts=None, task_index=-1): + """Set multi-worker cluster spec in TF_CONFIG environment variable. + + Args: + worker_hosts: comma-separated list of worker ip:port pairs. + + Returns: + Number of workers in the cluster. + """ + tf_config = json.loads(os.environ.get('TF_CONFIG', '{}')) + if tf_config: + num_workers = (len(tf_config['cluster'].get('chief', [])) + + len(tf_config['cluster'].get('worker', []))) + elif worker_hosts: + workers = worker_hosts.split(',') + num_workers = len(workers) + if num_workers > 1 and task_index < 0: + raise ValueError('Must specify task_index when number of workers > 1') + task_index = 0 if num_workers == 1 else task_index + os.environ['TF_CONFIG'] = json.dumps({ + 'cluster': { + 'worker': workers + }, + 'task': {'type': 'worker', 'index': task_index} + }) + else: + num_workers = 1 + return num_workers + + +def get_strategy_scope(strategy): + if strategy: + strategy_scope = strategy.scope() + else: + strategy_scope = DummyContextManager() + + return strategy_scope + + +class DummyContextManager(object): + + def __enter__(self): + pass + + def __exit__(self, *args): + pass diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils_test.py new file mode 100644 index 0000000..856c3b3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/distribution_utils_test.py @@ -0,0 +1,65 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +""" Tests for distribution util functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow.compat.v2 as tf + +from official.utils.misc import distribution_utils + + +class GetDistributionStrategyTest(tf.test.TestCase): + """Tests for get_distribution_strategy.""" + def test_one_device_strategy_cpu(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=0) + self.assertEquals(ds.num_replicas_in_sync, 1) + self.assertEquals(len(ds.extended.worker_devices), 1) + self.assertIn('CPU', ds.extended.worker_devices[0]) + + def test_one_device_strategy_gpu(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=1) + self.assertEquals(ds.num_replicas_in_sync, 1) + self.assertEquals(len(ds.extended.worker_devices), 1) + self.assertIn('GPU', ds.extended.worker_devices[0]) + + def test_mirrored_strategy(self): + ds = distribution_utils.get_distribution_strategy(num_gpus=5) + self.assertEquals(ds.num_replicas_in_sync, 5) + self.assertEquals(len(ds.extended.worker_devices), 5) + for device in ds.extended.worker_devices: + self.assertIn('GPU', device) + + +class PerReplicaBatchSizeTest(tf.test.TestCase): + """Tests for per_replica_batch_size.""" + + def test_batch_size(self): + self.assertEquals( + distribution_utils.per_replica_batch_size(147, num_gpus=0), 147) + self.assertEquals( + distribution_utils.per_replica_batch_size(147, num_gpus=1), 147) + self.assertEquals( + distribution_utils.per_replica_batch_size(147, num_gpus=7), 21) + + def test_batch_size_with_remainder(self): + with self.assertRaises(ValueError): + distribution_utils.per_replica_batch_size(147, num_gpus=5) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/keras_utils.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/keras_utils.py new file mode 100644 index 0000000..fd014f1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/keras_utils.py @@ -0,0 +1,262 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper functions for the Keras implementations of models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import multiprocessing +import os +import time + +from absl import logging +import tensorflow.compat.v2 as tf +from tensorflow.python import tf2 +from tensorflow.python.profiler import profiler as profiler + + +class BatchTimestamp(object): + """A structure to store batch time stamp.""" + + def __init__(self, batch_index, timestamp): + self.batch_index = batch_index + self.timestamp = timestamp + + def __repr__(self): + return "'BatchTimestamp'".format( + self.batch_index, self.timestamp) + + +class TimeHistory(tf.keras.callbacks.Callback): + """Callback for Keras models.""" + + def __init__(self, batch_size, log_steps, logdir=None): + """Callback for logging performance. + + Args: + batch_size: Total batch size. + log_steps: Interval of steps between logging of batch level stats. + logdir: Optional directory to write TensorBoard summaries. + """ + # TODO(wcromar): remove this parameter and rely on `logs` parameter of + # on_train_batch_end() + self.batch_size = batch_size + super(TimeHistory, self).__init__() + self.log_steps = log_steps + self.last_log_step = 0 + self.steps_before_epoch = 0 + self.steps_in_epoch = 0 + self.start_time = None + + if logdir: + self.summary_writer = tf.summary.create_file_writer(logdir) + else: + self.summary_writer = None + + # Logs start of step 1 then end of each step based on log_steps interval. + self.timestamp_log = [] + + # Records the time each epoch takes to run from start to finish of epoch. + self.epoch_runtime_log = [] + + @property + def global_steps(self): + """The current 1-indexed global step.""" + return self.steps_before_epoch + self.steps_in_epoch + + @property + def average_steps_per_second(self): + """The average training steps per second across all epochs.""" + return self.global_steps / sum(self.epoch_runtime_log) + + @property + def average_examples_per_second(self): + """The average number of training examples per second across all epochs.""" + return self.average_steps_per_second * self.batch_size + + def on_train_end(self, logs=None): + self.train_finish_time = time.time() + + if self.summary_writer: + self.summary_writer.flush() + + def on_epoch_begin(self, epoch, logs=None): + self.epoch_start = time.time() + + def on_batch_begin(self, batch, logs=None): + if not self.start_time: + self.start_time = time.time() + + # Record the timestamp of the first global step + if not self.timestamp_log: + self.timestamp_log.append(BatchTimestamp(self.global_steps, + self.start_time)) + + def on_batch_end(self, batch, logs=None): + """Records elapse time of the batch and calculates examples per second.""" + self.steps_in_epoch = batch + 1 + steps_since_last_log = self.global_steps - self.last_log_step + if steps_since_last_log >= self.log_steps: + now = time.time() + elapsed_time = now - self.start_time + steps_per_second = steps_since_last_log / elapsed_time + examples_per_second = steps_per_second * self.batch_size + + self.timestamp_log.append(BatchTimestamp(self.global_steps, now)) + logging.info( + 'TimeHistory: %.2f seconds, %.2f examples/second between steps %d ' + 'and %d', elapsed_time, examples_per_second, self.last_log_step, + self.global_steps) + + if self.summary_writer: + with self.summary_writer.as_default(): + tf.summary.scalar('global_step/sec', steps_per_second, + self.global_steps) + tf.summary.scalar('examples/sec', examples_per_second, + self.global_steps) + + self.last_log_step = self.global_steps + self.start_time = None + + def on_epoch_end(self, epoch, logs=None): + epoch_run_time = time.time() - self.epoch_start + self.epoch_runtime_log.append(epoch_run_time) + + self.steps_before_epoch += self.steps_in_epoch + self.steps_in_epoch = 0 + + +def get_profiler_callback(model_dir, profile_steps, enable_tensorboard, + steps_per_epoch): + """Validate profile_steps flag value and return profiler callback.""" + profile_steps_error_message = ( + 'profile_steps must be a comma separated pair of positive integers, ' + 'specifying the first and last steps to be profiled.' + ) + try: + profile_steps = [int(i) for i in profile_steps.split(',')] + except ValueError: + raise ValueError(profile_steps_error_message) + if len(profile_steps) != 2: + raise ValueError(profile_steps_error_message) + start_step, stop_step = profile_steps + if start_step < 0 or start_step > stop_step: + raise ValueError(profile_steps_error_message) + if enable_tensorboard: + logging.warning( + 'Both TensorBoard and profiler callbacks are used. Note that the ' + 'TensorBoard callback profiles the 2nd step (unless otherwise ' + 'specified). Please make sure the steps profiled by the two callbacks ' + 'do not overlap.') + return ProfilerCallback(model_dir, start_step, stop_step, steps_per_epoch) + + +class ProfilerCallback(tf.keras.callbacks.Callback): + """Save profiles in specified step range to log directory.""" + + def __init__(self, log_dir, start_step, stop_step, steps_per_epoch): + super(ProfilerCallback, self).__init__() + self.log_dir = log_dir + self.start_step = start_step + self.stop_step = stop_step + self.start_epoch = start_step // steps_per_epoch + self.stop_epoch = stop_step // steps_per_epoch + self.start_step_in_epoch = start_step % steps_per_epoch + self.stop_step_in_epoch = stop_step % steps_per_epoch + self.should_start = False + self.should_stop = False + + def on_epoch_begin(self, epoch, logs=None): + if epoch == self.start_epoch: + self.should_start = True + if epoch == self.stop_epoch: + self.should_stop = True + + def on_batch_begin(self, batch, logs=None): + if batch == self.start_step_in_epoch and self.should_start: + self.should_start = False + profiler.start(self.log_dir) + logging.info('Profiler started at Step %s', self.start_step) + + def on_batch_end(self, batch, logs=None): + if batch == self.stop_step_in_epoch and self.should_stop: + self.should_stop = False + profiler.stop() + logging.info('Profiler saved profiles for steps between %s and %s to %s', + self.start_step, self.stop_step, self.log_dir) + + +def set_session_config(enable_eager=False, + enable_xla=False): + """Sets the session config.""" + if is_v2_0(): + set_config_v2(enable_xla=enable_xla) + else: + config = get_config_proto_v1(enable_xla=enable_xla) + if enable_eager: + tf.compat.v1.enable_eager_execution(config=config) + else: + sess = tf.compat.v1.Session(config=config) + tf.compat.v1.keras.backend.set_session(sess) + + +def get_config_proto_v1(enable_xla=False): + """Return config proto according to flag settings, or None to use default.""" + config = None + if enable_xla: + config = tf.compat.v1.ConfigProto() + config.graph_options.optimizer_options.global_jit_level = ( + tf.OptimizerOptions.ON_2) + return config + + +def set_config_v2(enable_xla=False): + """Config eager context according to flag values using TF 2.0 API.""" + if enable_xla: + tf.config.optimizer.set_jit(True) + + +def is_v2_0(): + """Returns true if using tf 2.0.""" + return tf2.enabled() + + +def set_gpu_thread_mode_and_count(gpu_thread_mode, + datasets_num_private_threads, + num_gpus, per_gpu_thread_count): + """Set GPU thread mode and count, and adjust dataset threads count.""" + cpu_count = multiprocessing.cpu_count() + logging.info('Logical CPU cores: %s', cpu_count) + + # Allocate private thread pool for each GPU to schedule and launch kernels + per_gpu_thread_count = per_gpu_thread_count or 2 + os.environ['TF_GPU_THREAD_MODE'] = gpu_thread_mode + os.environ['TF_GPU_THREAD_COUNT'] = str(per_gpu_thread_count) + logging.info('TF_GPU_THREAD_COUNT: %s', + os.environ['TF_GPU_THREAD_COUNT']) + logging.info('TF_GPU_THREAD_MODE: %s', + os.environ['TF_GPU_THREAD_MODE']) + + # Limit data preprocessing threadpool to CPU cores minus number of total GPU + # private threads and memory copy threads. + total_gpu_thread_count = per_gpu_thread_count * num_gpus + num_runtime_threads = num_gpus + if not datasets_num_private_threads: + datasets_num_private_threads = min( + cpu_count - total_gpu_thread_count - num_runtime_threads, + num_gpus * 8) + logging.info('Set datasets_num_private_threads to %s', + datasets_num_private_threads) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers.py new file mode 100644 index 0000000..c112bac --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers.py @@ -0,0 +1,93 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Miscellaneous functions that can be called by models.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import numbers + +import tensorflow as tf +from tensorflow.python.util import nest + + +def past_stop_threshold(stop_threshold, eval_metric): + """Return a boolean representing whether a model should be stopped. + + Args: + stop_threshold: float, the threshold above which a model should stop + training. + eval_metric: float, the current value of the relevant metric to check. + + Returns: + True if training should stop, False otherwise. + + Raises: + ValueError: if either stop_threshold or eval_metric is not a number + """ + if stop_threshold is None: + return False + + if not isinstance(stop_threshold, numbers.Number): + raise ValueError("Threshold for checking stop conditions must be a number.") + if not isinstance(eval_metric, numbers.Number): + raise ValueError("Eval metric being checked against stop conditions " + "must be a number.") + + if eval_metric >= stop_threshold: + tf.compat.v1.logging.info( + "Stop threshold of {} was passed with metric value {}.".format( + stop_threshold, eval_metric)) + return True + + return False + + +def generate_synthetic_data( + input_shape, input_value=0, input_dtype=None, label_shape=None, + label_value=0, label_dtype=None): + """Create a repeating dataset with constant values. + + Args: + input_shape: a tf.TensorShape object or nested tf.TensorShapes. The shape of + the input data. + input_value: Value of each input element. + input_dtype: Input dtype. If None, will be inferred by the input value. + label_shape: a tf.TensorShape object or nested tf.TensorShapes. The shape of + the label data. + label_value: Value of each input element. + label_dtype: Input dtype. If None, will be inferred by the target value. + + Returns: + Dataset of tensors or tuples of tensors (if label_shape is set). + """ + # TODO(kathywu): Replace with SyntheticDataset once it is in contrib. + element = input_element = nest.map_structure( + lambda s: tf.constant(input_value, input_dtype, s), input_shape) + + if label_shape: + label_element = nest.map_structure( + lambda s: tf.constant(label_value, label_dtype, s), label_shape) + element = (input_element, label_element) + + return tf.data.Dataset.from_tensors(element).repeat() + + +def apply_clean(flags_obj): + if flags_obj.clean and tf.io.gfile.exists(flags_obj.model_dir): + tf.compat.v1.logging.info("--clean flag set. Removing existing model dir:" + " {}".format(flags_obj.model_dir)) + tf.io.gfile.rmtree(flags_obj.model_dir) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers_test.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers_test.py new file mode 100644 index 0000000..f34a594 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/model_helpers_test.py @@ -0,0 +1,127 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for Model Helper functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf # pylint: disable=g-bad-import-order + +from official.utils.misc import keras_utils +from official.utils.misc import model_helpers + + +class PastStopThresholdTest(tf.test.TestCase): + """Tests for past_stop_threshold.""" + + def setUp(self): + super(PastStopThresholdTest, self).setUp() + if keras_utils.is_v2_0: + tf.compat.v1.disable_eager_execution() + + def test_past_stop_threshold(self): + """Tests for normal operating conditions.""" + self.assertTrue(model_helpers.past_stop_threshold(0.54, 1)) + self.assertTrue(model_helpers.past_stop_threshold(54, 100)) + self.assertFalse(model_helpers.past_stop_threshold(0.54, 0.1)) + self.assertFalse(model_helpers.past_stop_threshold(-0.54, -1.5)) + self.assertTrue(model_helpers.past_stop_threshold(-0.54, 0)) + self.assertTrue(model_helpers.past_stop_threshold(0, 0)) + self.assertTrue(model_helpers.past_stop_threshold(0.54, 0.54)) + + def test_past_stop_threshold_none_false(self): + """Tests that check None returns false.""" + self.assertFalse(model_helpers.past_stop_threshold(None, -1.5)) + self.assertFalse(model_helpers.past_stop_threshold(None, None)) + self.assertFalse(model_helpers.past_stop_threshold(None, 1.5)) + # Zero should be okay, though. + self.assertTrue(model_helpers.past_stop_threshold(0, 1.5)) + + def test_past_stop_threshold_not_number(self): + """Tests for error conditions.""" + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", 1) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", tf.constant(5)) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold("str", "another") + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(0, None) + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(0.7, "str") + + with self.assertRaises(ValueError): + model_helpers.past_stop_threshold(tf.constant(4), None) + + +class SyntheticDataTest(tf.test.TestCase): + """Tests for generate_synthetic_data.""" + + def test_generate_synethetic_data(self): + input_element, label_element = tf.compat.v1.data.make_one_shot_iterator( + model_helpers.generate_synthetic_data(input_shape=tf.TensorShape([5]), + input_value=123, + input_dtype=tf.float32, + label_shape=tf.TensorShape([]), + label_value=456, + label_dtype=tf.int32)).get_next() + + with self.session() as sess: + for n in range(5): + inp, lab = sess.run((input_element, label_element)) + self.assertAllClose(inp, [123., 123., 123., 123., 123.]) + self.assertEquals(lab, 456) + + def test_generate_only_input_data(self): + d = model_helpers.generate_synthetic_data( + input_shape=tf.TensorShape([4]), + input_value=43.5, + input_dtype=tf.float32) + + element = tf.compat.v1.data.make_one_shot_iterator(d).get_next() + self.assertFalse(isinstance(element, tuple)) + + with self.session() as sess: + inp = sess.run(element) + self.assertAllClose(inp, [43.5, 43.5, 43.5, 43.5]) + + def test_generate_nested_data(self): + d = model_helpers.generate_synthetic_data( + input_shape={'a': tf.TensorShape([2]), + 'b': {'c': tf.TensorShape([3]), 'd': tf.TensorShape([])}}, + input_value=1.1) + + element = tf.compat.v1.data.make_one_shot_iterator(d).get_next() + self.assertIn('a', element) + self.assertIn('b', element) + self.assertEquals(len(element['b']), 2) + self.assertIn('c', element['b']) + self.assertIn('d', element['b']) + self.assertNotIn('c', element) + + with self.session() as sess: + inp = sess.run(element) + self.assertAllClose(inp['a'], [1.1, 1.1]) + self.assertAllClose(inp['b']['c'], [1.1, 1.1, 1.1]) + self.assertAllClose(inp['b']['d'], 1.1) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/tpu_lib.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/tpu_lib.py new file mode 100644 index 0000000..4d4cddb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/misc/tpu_lib.py @@ -0,0 +1,34 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Initializes TPU system for TF 2.0.""" + +import tensorflow as tf + + +def tpu_initialize(tpu_address): + """Initializes TPU for TF 2.0 training. + + Args: + tpu_address: string, bns address of master TPU worker. + + Returns: + A TPUClusterResolver. + """ + cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver( + tpu=tpu_address) + if tpu_address not in ('', 'local'): + tf.config.experimental_connect_to_cluster(cluster_resolver) + tf.tpu.experimental.initialize_tpu_system(cluster_resolver) + return cluster_resolver diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/__init__.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/benchmark_wrappers.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/benchmark_wrappers.py new file mode 100644 index 0000000..a1c5327 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/benchmark_wrappers.py @@ -0,0 +1,83 @@ +# Lint as: python3 +"""Utils to annotate and trace benchmarks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import flags +from absl import logging +from absl.testing import flagsaver + +FLAGS = flags.FLAGS + +flags.DEFINE_multi_string( + 'benchmark_method_flags', None, + 'Optional list of runtime flags of the form key=value. Specify ' + 'multiple times to specify different flags. These will override the FLAGS ' + 'object directly after hardcoded settings in individual benchmark methods ' + 'before they call _run_and_report benchmark. Example if we set ' + '--benchmark_method_flags=train_steps=10 and a benchmark method hardcodes ' + 'FLAGS.train_steps=10000 and later calls _run_and_report_benchmark, ' + 'it\'ll only run for 10 steps. This is useful for ' + 'debugging/profiling workflows.') + + +def enable_runtime_flags(decorated_func): + """Sets attributes from --benchmark_method_flags for method execution. + + @enable_runtime_flags decorator temporarily adds flags passed in via + --benchmark_method_flags and runs the decorated function in that context. + + A user can set --benchmark_method_flags=train_steps=5 to run the benchmark + method in the snippet below with FLAGS.train_steps=5 for debugging (without + modifying the benchmark code). + + class ModelBenchmark(): + + @benchmark_wrappers.enable_runtime_flags + def _run_and_report_benchmark(self): + # run benchmark ... + # report benchmark results ... + + def benchmark_method(self): + FLAGS.train_steps = 1000 + ... + self._run_and_report_benchmark() + + Args: + decorated_func: The method that runs the benchmark after previous setup + execution that set some flags. + + Returns: + new_func: The same method which executes in a temporary context where flag + overrides from --benchmark_method_flags are active. + """ + + def runner(*args, **kwargs): + """Creates a temporary context to activate --benchmark_method_flags.""" + if FLAGS.benchmark_method_flags: + saved_flag_values = flagsaver.save_flag_values() + for key_value in FLAGS.benchmark_method_flags: + key, value = key_value.split('=', 1) + try: + numeric_float = float(value) + numeric_int = int(numeric_float) + if abs(numeric_int) == abs(numeric_float): + flag_value = numeric_int + else: + flag_value = numeric_float + except ValueError: + flag_value = value + logging.info('Setting --%s=%s', key, flag_value) + setattr(FLAGS, key, flag_value) + else: + saved_flag_values = None + try: + result = decorated_func(*args, **kwargs) + return result + finally: + if saved_flag_values: + flagsaver.restore_flag_values(saved_flag_values) + + return runner diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/integration.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/integration.py new file mode 100644 index 0000000..b4809a4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/integration.py @@ -0,0 +1,71 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Helper code to run complete models from within python. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import shutil +import sys +import tempfile + +from absl import flags +from absl.testing import flagsaver + +from official.utils.flags import core as flags_core + + +@flagsaver.flagsaver +def run_synthetic(main, tmp_root, extra_flags=None, synth=True, train_epochs=1, + epochs_between_evals=1): + """Performs a minimal run of a model. + + This function is intended to test for syntax errors throughout a model. A + very limited run is performed using synthetic data. + + Args: + main: The primary function used to exercise a code path. Generally this + function is ".main(argv)". + tmp_root: Root path for the temp directory created by the test class. + extra_flags: Additional flags passed by the caller of this function. + synth: Use synthetic data. + train_epochs: Value of the --train_epochs flag. + epochs_between_evals: Value of the --epochs_between_evals flag. + """ + + extra_flags = [] if extra_flags is None else extra_flags + + model_dir = tempfile.mkdtemp(dir=tmp_root) + + args = [sys.argv[0], "--model_dir", model_dir] + extra_flags + + if synth: + args.append("--use_synthetic_data") + + if train_epochs is not None: + args.extend(["--train_epochs", str(train_epochs)]) + + if epochs_between_evals is not None: + args.extend(["--epochs_between_evals", str(epochs_between_evals)]) + + try: + flags_core.parse_flags(argv=args) + main(flags.FLAGS) + finally: + if os.path.exists(model_dir): + shutil.rmtree(model_dir) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/mock_lib.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/mock_lib.py new file mode 100644 index 0000000..ee4de3c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/mock_lib.py @@ -0,0 +1,36 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Mock objects and related functions for testing.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + + +class MockBenchmarkLogger(object): + """This is a mock logger that can be used in dependent tests.""" + + def __init__(self): + self.logged_metric = [] + + def log_metric(self, name, value, unit=None, global_step=None, + extras=None): + self.logged_metric.append({ + "name": name, + "value": float(value), + "unit": unit, + "global_step": global_step, + "extras": extras}) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/perfzero_benchmark.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/perfzero_benchmark.py new file mode 100644 index 0000000..af4a912 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/perfzero_benchmark.py @@ -0,0 +1,90 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Utils for creating PerfZero benchmarks.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os + +from absl import flags +from absl.testing import flagsaver +import tensorflow as tf # pylint: disable=g-bad-import-order + +FLAGS = flags.FLAGS + + +class PerfZeroBenchmark(tf.test.Benchmark): + """Common methods used in PerfZero Benchmarks. + + Handles the resetting of flags between tests, loading of default_flags, + overriding of defaults. PerfZero (OSS) runs each test in a separate + process reducing some need to reset the flags. + """ + local_flags = None + + def __init__(self, + output_dir=None, + default_flags=None, + flag_methods=None, + tpu=None): + """Initialize class. + + Args: + output_dir: Base directory to store all output for the test. + default_flags: Set of flags to pass to model. + flag_methods: Set of flag methods to run during setup. + tpu: (optional) TPU name to use in a TPU benchmark. + """ + if os.getenv('BENCHMARK_OUTPUT_DIR'): + self.output_dir = os.getenv('BENCHMARK_OUTPUT_DIR') + elif output_dir: + self.output_dir = output_dir + else: + self.output_dir = '/tmp' + self.default_flags = default_flags or {} + self.flag_methods = flag_methods or {} + + if os.getenv('BENCHMARK_TPU'): + resolved_tpu = os.getenv('BENCHMARK_TPU') + elif tpu: + resolved_tpu = tpu + else: + resolved_tpu = None + + if resolved_tpu: + # TPU models are expected to accept a --tpu=name flag. PerfZero creates + # the TPU at runtime and passes the TPU's name to this flag. + self.default_flags['tpu'] = resolved_tpu + + def _get_model_dir(self, folder_name): + """Returns directory to store info, e.g. saved model and event log.""" + return os.path.join(self.output_dir, folder_name) + + def _setup(self): + """Sets up and resets flags before each test.""" + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) + if PerfZeroBenchmark.local_flags is None: + for flag_method in self.flag_methods: + flag_method() + # Loads flags to get defaults to then override. List cannot be empty. + flags.FLAGS(['foo']) + # Overrides flag values with defaults for the class of tests. + for k, v in self.default_flags.items(): + setattr(FLAGS, k, v) + saved_flag_values = flagsaver.save_flag_values() + PerfZeroBenchmark.local_flags = saved_flag_values + else: + flagsaver.restore_flag_values(PerfZeroBenchmark.local_flags) diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/pylint.rcfile b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/pylint.rcfile new file mode 100644 index 0000000..b872802 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/pylint.rcfile @@ -0,0 +1,168 @@ +[MESSAGES CONTROL] +disable=R,W,bad-option-value,trailing-newlines,no-name-in-module + +[REPORTS] +# Tells whether to display a full report or only the messages +reports=no + +# Activate the evaluation score. +score=no + +[BASIC] + +# Regular expression matching correct argument names +argument-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct attribute names +attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Regular expression matching correct class names +class-rgx=^_?[A-Z][a-zA-Z0-9]*$ + +# Regular expression matching correct constant names +const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=10 + +# Regular expression matching correct function names +function-rgx=^(?:(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ + +# Good variable names which should always be accepted, separated by a comma +good-names=main,_ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=^[a-z][a-z0-9_]*$ + +# Regular expression matching correct method names +method-rgx=^(?:(?P__[a-z0-9_]+__|next)|(?P_{0,2}[A-Z][a-zA-Z0-9]*)|(?P_{0,2}[a-z][a-z0-9_]*)|(setUp|tearDown))$ + +# Regular expression matching correct module names +module-rgx=^(_?[a-z][a-z0-9_]*)|__init__|PRESUBMIT|PRESUBMIT_unittest$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=(__.*__|main|.*ArgParser) + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +variable-rgx=^[a-z][a-z0-9_]*$ + +[TYPECHECK] + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules=absl, absl.*, official, official.*, tensorflow, tensorflow.*, LazyLoader, google, google.cloud.* + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + +# This is deprecated, because it is not used anymore. +#ignore-iface-methods= + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls,class_ + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of statements in function / method body +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=StandardError,Exception,BaseException + + +[FORMAT] + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=80 + +# Maximum number of lines in a module +max-module-lines=99999 + +# List of optional constructs for which whitespace checking is disabled +no-space-check= + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=yes + +# Allow URLs and comment type annotations to exceed the max line length as neither can be easily +# split across lines. +ignore-long-lines=^\s*(?:(# )??$|# type:) + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) + +# Tells whether we should check for unused import in __init__ files. +init-import=no diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/builds_common.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/builds_common.sh new file mode 100644 index 0000000..3cf08bb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/builds_common.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Common Bash functions used by build scripts + +COLOR_NC='\033[0m' +COLOR_BOLD='\033[1m' +COLOR_LIGHT_GRAY='\033[0;37m' +COLOR_GREEN='\033[0;32m' +COLOR_RED='\033[0;31m' + +die() { + # Print a message and exit with code 1. + # + # Usage: die + # e.g., die "Something bad happened." + + echo $@ + exit 1 +} + +num_cpus() { + # Get the number of CPUs + N_CPUS=$(grep -c ^processor /proc/cpuinfo) + if [[ -z ${N_CPUS} ]]; then + die "ERROR: Unable to determine the number of CPUs" + fi + + echo ${N_CPUS} +} + +# List files changed (i.e., added, or revised) from +# the common ancestor of HEAD and the latest master branch. +# Usage: get_changed_files_from_master_branch +get_changed_files_from_master_branch() { + ANCESTOR=$(git merge-base HEAD master origin/master) + git diff ${ANCESTOR} --diff-filter=d --name-only "$@" +} + +# List python files changed that still exist, +# i.e., not removed. +# Usage: get_py_files_to_check [--incremental] +get_py_files_to_check() { + if [[ "$1" == "--incremental" ]]; then + get_changed_files_from_master_branch -- '*.py' + elif [[ -z "$1" ]]; then + find official/ -name '*.py' + else + die "Found unsupported args: $@ for get_py_files_to_check." + fi +} diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh new file mode 100644 index 0000000..97d6bc2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/ci_sanity.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Sanity check script that runs tests and lint under local environment. +# Make sure that tensorflow and pylint is installed. +# usage: models >: ./official/utils/testing/scripts/ci_sanity.sh do_pylint --incremental +set +x + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${SCRIPT_DIR}/builds_common.sh" +cd "$SCRIPT_DIR/../../../.." +MODEL_ROOT="$(pwd)" + +export PYTHONPATH="$PYTHONPATH:${MODEL_ROOT}" + +# Run pylint +do_pylint() { + # Usage: do_pylint [--incremental] + # + # Options: + # --incremental Performs check on only the python files changed in the + # last non-merge git commit. + + # Use this list to whitelist pylint errors + ERROR_WHITELIST="" + + echo "ERROR_WHITELIST=\"${ERROR_WHITELIST}\"" + + PYLINT_BIN="python3 -m pylint" + + PYTHON_SRC_FILES=$(get_py_files_to_check $1) + if [[ -z ${PYTHON_SRC_FILES} ]]; then + echo "do_pylint found no Python files to check. Returning." + return 0 + fi + + PYLINTRC_FILE="official/utils/testing/pylint.rcfile" + + if [[ ! -f "${PYLINTRC_FILE}" ]]; then + die "ERROR: Cannot find pylint rc file at ${PYLINTRC_FILE}" + fi + + NUM_SRC_FILES=$(echo ${PYTHON_SRC_FILES} | wc -w) + NUM_CPUS=$(num_cpus) + + echo "Running pylint on ${NUM_SRC_FILES} files with ${NUM_CPUS} "\ + "parallel jobs..." + echo "" + + PYLINT_START_TIME=$(date +'%s') + OUTPUT_FILE="$(mktemp)_pylint_output.log" + ERRORS_FILE="$(mktemp)_pylint_errors.log" + NONWL_ERRORS_FILE="$(mktemp)_pylint_nonwl_errors.log" + + rm -rf ${OUTPUT_FILE} + rm -rf ${ERRORS_FILE} + rm -rf ${NONWL_ERRORS_FILE} + touch ${NONWL_ERRORS_FILE} + + ${PYLINT_BIN} --rcfile="${PYLINTRC_FILE}" --output-format=parseable \ + --jobs=${NUM_CPUS} ${PYTHON_SRC_FILES} > ${OUTPUT_FILE} 2>&1 + PYLINT_END_TIME=$(date +'%s') + + echo "" + echo "pylint took $((PYLINT_END_TIME - PYLINT_START_TIME)) s" + echo "" + + # Report only what we care about + # Ref https://pylint.readthedocs.io/en/latest/technical_reference/features.html + # E: all errors + # W0311 bad-indentation + # W0312 mixed-indentation + # C0330 bad-continuation + # C0301 line-too-long + # C0326 bad-whitespace + # W0611 unused-import + # W0622 redefined-builtin + grep -E '(\[E|\[W0311|\[W0312|\[C0330|\[C0301|\[C0326|\[W0611|\[W0622)' ${OUTPUT_FILE} > ${ERRORS_FILE} + + N_ERRORS=0 + while read -r LINE; do + IS_WHITELISTED=0 + for WL_REGEX in ${ERROR_WHITELIST}; do + if echo ${LINE} | grep -q "${WL_REGEX}"; then + echo "Found a whitelisted error:" + echo " ${LINE}" + IS_WHITELISTED=1 + fi + done + + if [[ ${IS_WHITELISTED} == "0" ]]; then + echo "${LINE}" >> ${NONWL_ERRORS_FILE} + echo "" >> ${NONWL_ERRORS_FILE} + ((N_ERRORS++)) + fi + done <${ERRORS_FILE} + + echo "Raw lint output file: ${OUTPUT_FILE}" + + echo "" + if [[ ${N_ERRORS} != 0 ]]; then + echo "FAIL: Found ${N_ERRORS} non-whitelited pylint errors:" + cat "${NONWL_ERRORS_FILE}" + return 1 + else + echo "PASS: No non-whitelisted pylint errors were found." + return 0 + fi +} + +test_result=0 + +TESTS="$@" + +for t in "${TESTS}"; do + ${t} || test_result=$? +done + +exit "${test_result}" diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/presubmit.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/presubmit.sh new file mode 100644 index 0000000..954d96d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/code/official/utils/testing/scripts/presubmit.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +# Presubmit script that runs tests and lint under local environment. +# Make sure that tensorflow and pylint is installed. +# usage: models >: ./official/utils/testing/scripts/presubmit.sh +# usage: models >: ./official/utils/testing/scripts/presubmit.sh lint py2_test py3_test +set +x + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR/../../../.." +MODEL_ROOT="$(pwd)" + +export PYTHONPATH="$PYTHONPATH:${MODEL_ROOT}" + +py_test() { + local PY_BINARY="$1" + local exit_code=0 + + echo "===========Running Python test============" + + for test_file in `find official/ -name '*test.py' -print` + do + echo "####=======Testing ${test_file}=======####" + ${PY_BINARY} "${test_file}" + _exit_code=$? + if [[ $_exit_code != 0 ]]; then + exit_code=$_exit_code + echo "FAIL: ${test_file}" + fi + done + + return "${exit_code}" +} + +py2_test() { + local PY_BINARY=$(which python2) + py_test "$PY_BINARY" + return $? +} + +py3_test() { + local PY_BINARY=$(which python3) + py_test "$PY_BINARY" + return $? +} + +test_result=0 + +if [ "$#" -eq 0 ]; then + TESTS="lint py2_test py3_test" +else + TESTS="$@" +fi + +for t in "${TESTS}"; do + ${t} || test_result=$? +done + +exit "${test_result}" diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..e015ca1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/npu_set_env.sh @@ -0,0 +1,42 @@ +# main env + +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +#export RANK_SIZE={RANK_SIZE} +#export RANK_INDEX={RANK_INDEX} +#export RANK_ID={RANK_ID} + +# profiling env +export PROFILING_MODE=false +export PROFILING_OPTIONS=training_trace +export FP_POINT=resnet_model/conv2d/Conv2Dresnet_model/batch_normalization/FusedBatchNormV3_Reduce +export BP_POINT=gradients/AddN_70 +export AICPU_PROFILING_MODE=false + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_16p_npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_16p_npu.py new file mode 100644 index 0000000..c5565ed --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_16p_npu.py @@ -0,0 +1,18 @@ + + +config = { + 'batch_size': 32, + 'train_epochs': 2, + 'data_dir': '/home/imagenet_TF/', + 'epochs_between_evals': 1, + 'dynamic_loss_scale': True, + 'rank_size': 16, + 'max_train_steps': 1000, + 'iterations_per_loop': 100, + 'save_checkpoints_steps': 115200, +} + + +def resnet50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_1p_npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_1p_npu.py new file mode 100644 index 0000000..268720c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_1p_npu.py @@ -0,0 +1,18 @@ + + +config = { + 'batch_size': 32, + 'train_epochs': 1, + 'data_dir': '/home/data/imagenet_TF/', + 'epochs_between_evals': 1, + 'dynamic_loss_scale': True, + 'rank_size': 1, + 'max_train_steps': 1000, + 'iterations_per_loop': 1000, + 'save_checkpoints_steps': 115200, +} + + +def resnet50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_2p_npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_2p_npu.py new file mode 100644 index 0000000..a056853 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_2p_npu.py @@ -0,0 +1,18 @@ + + +config = { + 'batch_size': 32, + 'train_epochs': 1, + 'data_dir': '/home/imagenet_TF/', + 'epochs_between_evals': 1, + 'dynamic_loss_scale': True, + 'rank_size': 2, + 'max_train_steps': 1000, + 'iterations_per_loop': 1000, + 'save_checkpoints_steps': 115200, +} + + +def resnet50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_4p_npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_4p_npu.py new file mode 100644 index 0000000..2216a39 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_4p_npu.py @@ -0,0 +1,18 @@ + + +config = { + 'batch_size': 32, + 'train_epochs': 1, + 'data_dir': '/home/imagenet_TF/', + 'epochs_between_evals': 1, + 'dynamic_loss_scale': True, + 'rank_size': 4, + 'max_train_steps': 1000, + 'iterations_per_loop': 1000, + 'save_checkpoints_steps': 115200, +} + + +def resnet50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_8p_npu.py b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_8p_npu.py new file mode 100644 index 0000000..d6ffa1b --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/config/resnet_config_8p_npu.py @@ -0,0 +1,18 @@ + + +config = { + 'batch_size': 32, + 'train_epochs': 2, + 'data_dir': '/home/imagenet_TF/', + 'epochs_between_evals': 1, + 'dynamic_loss_scale': True, + 'rank_size': 8, + 'max_train_steps': 1000, + 'iterations_per_loop': 100, + 'save_checkpoints_steps': 115200, +} + + +def resnet50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/run.sh new file mode 100644 index 0000000..882c73c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/run.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 +MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) +# 配置环境变量并调用 train 方法 +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_resnet50/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_resnet50/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export SLOG_PRINT_TO_STDOUT=0 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + + +data_url_new=`echo ${data_url//\//\\\\/}` + +jsonFilePath=${currentDir}/config/resnet_config_${rank_size}p_npu.py +echo "start to modify inner config file" +#echo "jsonfilepath is "${jsonFilePath} + +sed -i "s/train_epochs.*$/train_epochs\': ${epoches},/g" ${jsonFilePath} +sed -i "0,/batch_size.*$/s//batch_size\': ${batch_size},/" ${jsonFilePath} +sed -i "s/max_train_steps.*$/max_train_steps\': ${max_train_steps},/g" ${jsonFilePath} +sed -i "s/data_dir.*$/data_dir\': \'${data_url_new}\',/g" ${jsonFilePath} +#sed -i "s/rank_size.*$/rank_size\': ${rank_size},/g" ${jsonFilePath} +sed -i "s/epochs_between_evals.*$/epochs_between_evals\': ${epochs_between_evals},/g" ${jsonFilePath} +sed -i "s/iterations_per_loop.*$/iterations_per_loop\': ${iterations_per_loop},/g" ${jsonFilePath} +sed -i "s/save_checkpoints_steps.*$/save_checkpoints_steps\': ${save_checkpoints_steps},/g" ${jsonFilePath} +sed -i 's/\r//g' ${jsonFilePath} +if [ $? -eq 0 ] ; +then + echo "modify inner config file success" +else + echo "modify inner config file fail" + exit +fi + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_resnet50.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_resnet50.log ${train_job_dir} + for device_id in $device_group;do + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +fi +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" + diff --git a/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/train.sh new file mode 100644 index 0000000..b108d01 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNet50/tensorflow/scripts/train.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +export REMARK_LOG_FILE=hw_resnet50.log + +# ${mainDir%train*}/train/result/tensorflow/Bert/TrainingJob-${currtime} # +mkdir -p ${currentDir%train*}/train/result/tf_resnet50/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_resnet50/training_job_${currtime}/ + + +source ${currentDir}/config/npu_set_env.sh + +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +#atlasboost_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +code_dir_path=${currentDir}/code +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path}:${code_dir_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# user env +export YAML_PATH=$3 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +export MODEL_CKPT_PATH=${train_job_dir}/${device_id}/ckpt${device_id} + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 根据单卡/多卡区分调用参数 + +if [ x"$6" == x"True" ];then + export CLUSTER=True + echo "run cluster" + python3.7 ${currentDir}/code/official/benchmark/resnet_tf_r1_benchmark.py ${rank_size} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 4 ];then + # 单卡 + python3.7 ${currentDir}/code/official/benchmark/resnet_tf_r1_benchmark.py ${rank_size} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + python3.7 ${currentDir}/code/official/benchmark/resnet_tf_r1_benchmark.py ${rank_size} > ${train_job_dir}/train_${device_id}.log 2>&1 +fi + +if [ $? -eq 0 ] ; +then + echo ":::ABK 1.0.0 resnet50 train success" + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50 train success" >> ${train_job_dir}/${device_id}/hw_resnet50.log +else + echo ":::ABK 1.0.0 resnet50 train failed" + echo ":::ABK 1.0.0 resnet50 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50 train failed" >> ${train_job_dir}/${device_id}/hw_resnet50.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 resnet50 train total time:${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnet50.log + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/README.md new file mode 100644 index 0000000..142b99e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/README.md @@ -0,0 +1,46 @@ +# ResNext50_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/ResNext50.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: /home/imagenet_TF/ + epoches: 1 + epochs_between_evals: 1 + batch_size: 32 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + + # 1. 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + # 2. 仅在小于 8p 时生效 + # 3. 若不使用该配置, 请使用在行首添加'#'注释的方法将其关闭 + # device_group: 0 1 2 3 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + profiling_mode: false + profiling_options: training_trace + fp_point: fp32_vars/conv2d/Conv2Dfp32_vars/BatchNorm/FusedBatchNormV3_Reduce + bp_point: loss_scale/gradients/AddN_70 + aicpu_profiling_mode: false +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/pid b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/pid new file mode 100644 index 0000000..0d49bb1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/pid @@ -0,0 +1 @@ +13650 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_1p.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_1p.py new file mode 100644 index 0000000..1938397 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_1p.py @@ -0,0 +1,115 @@ +import tensorflow as tf + +import os +log_dir = '../result/'+os.path.basename(__file__).split('.')[0] + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 1, + 'shard': False, + + # ======= basic config ======= # + 'mode':'train', # "train","evaluate","train_and_evaluate" + 'epochs_between_evals': 4, #used if mode is "train_and_evaluate" + 'stop_threshold': 80.0, #used if mode is "train_and_evaluate" + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '/home/imagenet_TF', #data + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': 1, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'num_evaluating_samples': 50000, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':32, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "conv_bn_init" or "adv_bn_init",initializer the gamma in bn in different modes + # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== model architecture ========== + #'resnet_version': 'v1.5', + 'resnet_version': 'resnext', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + #'ckpt_dir': '/data/resnext50/opp2/ckpt0', + 'ckpt_dir': os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../result/ckpt0'), + + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'linear', # "linear" or "cosine" + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 0.1, + + 'lr_decay_mode': 'steps', # "steps", "poly", "poly_cycle", "cosine", "linear_cosine", "linear_twice", "constant" for 1980 only + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_8p.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_8p.py new file mode 100644 index 0000000..cb5d667 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/configs/res50_32bs_8p.py @@ -0,0 +1,115 @@ +import tensorflow as tf + +import os +log_dir = '../result/'+os.path.basename(__file__).split('.')[0] + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 8, + 'shard': True, + + # ======= basic config ======= # + 'mode':'train', # "train","evaluate","train_and_evaluate" + 'epochs_between_evals': 4, #used if mode is "train_and_evaluate" + 'stop_threshold': 80.0, #used if mode is "train_and_evaluate" + 'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '/home/imagenet_TF', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': 120, #None + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':32, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "conv_bn_init" or "adv_bn_init",initializer the gamma in bn in different modes + # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== model architecture ========== + #'resnet_version': 'v1.5', + 'resnet_version': 'resnext', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + #'ckpt_dir': '/data/resnext50_10w/ckpt0', #log_dir + #'ckpt_dir': '/d_solution/ckpt0', + 'ckpt_dir': os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../result/ckpt0'), + 'log_dir': log_dir, + + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'linear', # "linear" or "cosine" + 'warmup_lr': 0.0, + 'warmup_epochs': 5, + 'learning_rate_maximum': 0.1, + + 'lr_decay_mode': 'cosine', # "steps", "poly", "poly_cycle", "cosine", "linear_cosine", "linear_twice", "constant" for 1980 only + 'learning_rate_end': 0.000001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/data_loader.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/data_loader.py new file mode 100644 index 0000000..4cec4ba --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/data_loader.py @@ -0,0 +1,236 @@ +import numpy as np +from . import preprocessing +import tensorflow as tf +from tensorflow.python.util import nest +import os,sys +import numpy as np +sys.path.append("..") +from trainers.train_helper import stage + +class DataLoader: + + def __init__(self, config): + self.config = config + + # dataset info + num_training_samples = 1281167 + self.config['num_evaluating_samples'] = 50000 + #num_evaluating_samples = get_num_records(self.eval_filenames) + self.config['num_training_samples'] = num_training_samples + print( 'total num_training_sampels: %d' % num_training_samples ) + + self.training_samples_per_rank = num_training_samples + + + def get_train_input_fn_synthetic(self): + batch_size = self.config['batch_size'] + input_shape = [self.config['height'], self.config['width'], 3] + input_element = nest.map_structure(lambda s: tf.constant(0.5, tf.float32, s), tf.TensorShape(input_shape)) + label_element = nest.map_structure(lambda s: tf.constant(1, tf.int32, s), tf.TensorShape([1])) + element = (input_element, label_element) + ds = tf.data.Dataset.from_tensors(element).repeat() + ds = ds.batch(batch_size) + return ds + + def get_train_input_fn(self): + # filenames = self.train_filenames + filenames = None + take_count = self.training_samples_per_rank + batch_size = self.config['batch_size'] + height = self.config['height'] + width = self.config['width'] + brightness = self.config['brightness'] + contrast = self.config['contrast'] + saturation = self.config['saturation'] + hue = self.config['hue'] + num_threads = self.config['num_preproc_threads'] + increased_aug = self.config['increased_aug'] + shard = self.config['shard'] + + return make_dataset(self.config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=True, num_threads=num_threads, nsummary=10, shard=shard, synthetic=False, + increased_aug=increased_aug ) + + def get_eval_input_fn(self): + # filenames = self.eval_filenames + filenames = None + # take_count = get_num_records(self.eval_filenames) + take_count = 50000 + batch_size = self.config['batch_size'] + height = self.config['height'] + width = self.config['width'] + brightness = self.config['brightness'] + contrast = self.config['contrast'] + saturation = self.config['saturation'] + hue = self.config['hue'] + num_threads = self.config['num_preproc_threads'] + shard = self.config['shard'] + + return make_dataset(self.config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=False, num_threads=num_threads, nsummary=10, shard=shard, synthetic=False, + increased_aug=False) + + def get_input_pipeline_op(self, inputs, labels, mode): + with tf.device('/cpu:0'): + preload_op, (inputs, labels) = stage([inputs, labels]) + + with tf.device('/gpu:0'): + gpucopy_op, (inputs, labels) = stage([inputs, labels]) + return preload_op, gpucopy_op, inputs, labels + + def normalize_and_format(self, inputs, data_format): + + dataset_mean = np.array([121, 115, 100], dtype=np.float32) + dataset_std = np.array([70, 68, 71], dtype=np.float32) + inputs = tf.subtract(inputs, dataset_mean) + inputs = tf.multiply(inputs, 1. / dataset_std) + if data_format == 'channels_first': + inputs = tf.transpose(inputs, [0, 3, 1, 2]) + return inputs + + + + +#-------------------------------- Funcs ----------------------------------- +def get_num_records(filenames): + def count_records(tf_record_filename): + count = 0 + for _ in tf.python_io.tf_record_iterator(tf_record_filename): + count += 1 + return count + + nfile = len(filenames) + return (count_records(filenames[0]) * (nfile - 1) + + count_records(filenames[-1])) + +def _parse_example_proto(example_serialized): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.FixedLenFeature([], dtype=tf.int64, default_value=-1), + 'image/class/text': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.parse_single_example(example_serialized, feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(bbox, [0, 2, 1]) + + return features['image/encoded'], label, bbox + +def parse_record(raw_record,is_training): + image_buffer, label, bbox = _parse_example_proto(raw_record) + # for 1980 only + config={'min_object_covered': 0.1, 'aspect_ratio_range': [3. / 4., 4. / 3.], 'area_range': [0.08, 1.0], 'max_attempts': 100} + image = preprocessing.parse_and_preprocess_image_record( + config, image_buffer, height=224, width=224, + brightness=0.4, contrast=0.4, saturation=0.4, hue=0.13, + distort=is_training, nsummary=10, increased_aug=True, random_search_aug=False) + return image, label + +def read_rawdata(file_path_tensor): + def _read_file(file_path): + image = tf.gfile.GFile(file_path, 'rb').read() + return image + return tf.py_func(_read_file, inp=[file_path_tensor], Tout=tf.string) + +def parse_function(filename, label): + image = read_rawdata(filename) + image_decoded = tf.image.decode_jpeg(image, channels=3) + image_resized = tf.image.resize_images(image_decoded, [224, 224]) + # 7.3rawĬϸʽΪint64Ŀǰresnet50ֻ֧int32³ǰӰ죬³ûӸתӣӰܿǡ + label = tf.cast(label, dtype=tf.int32) + return image_resized, label + + +def make_dataset(config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=False, num_threads=10, nsummary=10, shard=False, synthetic=False, + increased_aug=False, random_search_aug=False): + if synthetic and training: + input_shape = [height, width, 3] + input_element = nest.map_structure(lambda s: tf.constant(0.5, tf.float32, s), tf.TensorShape(input_shape)) + label_element = nest.map_structure(lambda s: tf.constant(1, tf.int32, s), tf.TensorShape([1])) + element = (input_element, label_element) + ds = tf.data.Dataset.from_tensors(element).repeat() + ds = ds.batch(batch_size) + return ds + else: + shuffle_buffer_size = 10000 + num_readers = 10 + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('DEVICE_INDEX')) + + if config['data_type'] == 'RAW DATA': + images = [] + labels = [] + with tf.gfile.GFile(config['label_index_url'], 'r') as f: + for line in f.readlines(): + tmp_list = line.strip().split(" ") + image_file = os.path.join(config['data_url'], tmp_list[0]) + #image_raw = tf.gfile.GFile(image_file, 'rb').read() + #images.append(image_raw) + images.append(image_file) + labels.append(int(tmp_list[-1])) + + #images = tf.convert_to_tensor(images, dtype=tf.string) + #labels = tf.convert_to_tensor(labels, dtype=tf.int32) + ds = tf.data.Dataset.from_tensor_slices((images, labels)) + else: + if training: + filename_pattern = os.path.join(config['data_url'], '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'train')) + else: + filename_pattern = os.path.join(config['data_url'], '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'validation')) + + ds = tf.data.Dataset.from_tensor_slices(filenames) + + if shard: + # split the dataset into parts for each GPU + ds = ds.shard(rank_size, rank_id) + + if not training: + ds = ds.take(take_count) # make sure all ranks have the same amount + + if training: + ds = ds.shuffle(1000, seed=7 * (1 + rank_id)) + + if config['data_type'] == 'TFRECORD': + ds = ds.interleave(tf.data.TFRecordDataset, cycle_length=num_readers, block_length=1) + counter = tf.data.Dataset.range(sys.maxsize) + ds = tf.data.Dataset.zip((ds, counter)) + + if training: + ds = ds.apply(tf.data.experimental.shuffle_and_repeat(shuffle_buffer_size, seed=5*(1+rank_id))) + + if config['data_type'] == 'RAW DATA': + ds = ds.map(lambda image, label: parse_function(image, label), num_parallel_calls=14) + else: + ds = ds.map(lambda image, label: parse_record(image, training), num_parallel_calls=14) + #ds = ds.prefetch(10) + ds = ds.batch(batch_size, drop_remainder=True) + return ds + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/preprocessing.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/preprocessing.py new file mode 100644 index 0000000..bde13df --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/data_loader/resnet50/preprocessing.py @@ -0,0 +1,152 @@ +import tensorflow as tf +#import horovod.tensorflow as hvd +from tensorflow.contrib.image.python.ops import distort_image_ops +import math +#from .data_aug_search import random_aug_search + + + +def deserialize_image_record(record): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], tf.string, ''), + 'image/class/label': tf.FixedLenFeature([1], tf.int64, -1), + 'image/class/text': tf.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': tf.VarLenFeature(dtype=tf.float32) + } + with tf.name_scope('deserialize_image_record'): + obj = tf.parse_single_example(record, feature_map) + imgdata = obj['image/encoded'] + label = tf.cast(obj['image/class/label'], tf.int32) + bbox = tf.stack([obj['image/object/bbox/%s' % x].values + for x in ['ymin', 'xmin', 'ymax', 'xmax']]) + bbox = tf.transpose(tf.expand_dims(bbox, 0), [0, 2, 1]) + text = obj['image/class/text'] + return imgdata, label, bbox, text + +def decode_jpeg(imgdata, channels=3): + return tf.image.decode_jpeg(imgdata, channels=channels, + fancy_upscaling=False, + dct_method='INTEGER_FAST') + + +def crop_and_resize_image(config, image, height, width, + distort=False, nsummary=10): + with tf.name_scope('crop_and_resize'): + # Evaluation is done on a center-crop of this ratio + eval_crop_ratio = 0.8 + if distort: + initial_shape = [int(round(height / eval_crop_ratio)), + int(round(width / eval_crop_ratio)), + 3] + jpeg_shape = tf.image.extract_jpeg_shape( image ) + + bbox_begin, bbox_size, bbox = \ + tf.image.sample_distorted_bounding_box( + initial_shape, + bounding_boxes=tf.constant([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4]), + # tf.zeros(shape=[1,0,4]), # No bounding boxes + min_object_covered=config['min_object_covered'], + aspect_ratio_range=config['aspect_ratio_range'], + area_range=config['area_range'], + max_attempts=config['max_attempts'], + # seed=11 , # Need to set for deterministic results + use_image_if_no_bounding_boxes=True) + bbox = bbox[0, 0] # Remove batch, box_idx dims + + # offset_y, offset_x, _ = tf.unstack(bbox_begin) + # target_height, target_width, _ = tf.unstack( bbox_size ) + # + + + + + # offset_y = tf.minimum( offset_y, jpeg_shape[0] - 1 ) + # offset_x = tf.minimum( offset_x, jpeg_shape[1] - 1 ) + + # target_height, target_width, _ = tf.unstack( bbox_size ) + # new_height = tf.maximum( tf.minimum( offset_y + target_height, jpeg_shape[0] ) - offset_y, 0 ) + # new_width = tf.maximum( tf.minimum( offset_x + target_width, jpeg_shape[1] ) - offset_x, 0 ) + + y_min = tf.cast( bbox[0] * (tf.cast( jpeg_shape[0], tf.float32) ), tf.int32) + x_min = tf.cast( bbox[1] * (tf.cast(jpeg_shape[1], tf.float32) ), tf.int32) + y_max = tf.cast( bbox[2] * (tf.cast(jpeg_shape[0], tf.float32) ), tf.int32) + x_max = tf.cast( bbox[3] * (tf.cast(jpeg_shape[1], tf.float32) ), tf.int32) + + crop_height = y_max - y_min + crop_width = x_max - x_min + # crop_window = tf.stack( [offset_y, offset_x, new_height, new_width] ) + crop_window = tf.stack( [y_min, x_min, crop_height, crop_width] ) + image = tf.image.decode_and_crop_jpeg( image, crop_window, channels=3 ) + image = tf.image.resize_images( image, [height, width] ) + + + # def func_decode_and_crop(image): + # image = tf.image.decode_and_crop_jpeg( image, crop_window, channels=3 ) + # image = tf.image.resize_images( image, [height, width] ) + # return image + + # def func_crop_and_resize(image): + # image = decode_jpeg(image, channels=3) + # image = tf.image.crop_and_resize( + # image[None, :, :, :], bbox[None, :], [0], [height, width])[0] + # return image + + + # condtion_1 = tf.logical_and( tf.less(target_height, jpeg_shape[0]), tf.less( target_width, jpeg_shape[1] ) ) + # condtion_2 = tf.logical_and( tf.less(target_height + offset_y, jpeg_shape[0]), tf.less( target_width + offset_x, jpeg_shape[1] ) ) + + # image = tf.cond( tf.logical_and( condtion_1, condtion_2 ), lambda:func_decode_and_crop(image), lambda:func_crop_and_resize(image) ) + + + else: + # Central crop + + image = decode_jpeg(image, channels=3) + ratio_y = ratio_x = eval_crop_ratio + bbox = tf.constant([0.5 * (1 - ratio_y), 0.5 * (1 - ratio_x), + 0.5 * (1 + ratio_y), 0.5 * (1 + ratio_x)]) + image = tf.image.crop_and_resize( + image[None, :, :, :], bbox[None, :], [0], [height, width])[0] + + return image + + +def parse_and_preprocess_image_record(config, record, height, width, + brightness, contrast, saturation, hue, + distort, nsummary=10, increased_aug=False, random_search_aug=False): + #imgdata, label, bbox, text = deserialize_image_record(record) + #label -= 1 # Change to 0-based (don't use background class) + with tf.name_scope('preprocess_train'): + image = crop_and_resize_image(config, record, height, width, distort) + if distort: + image = tf.image.random_flip_left_right(image) + if increased_aug: + image = tf.image.random_brightness(image, max_delta=brightness) + #image = distort_image_ops.random_hsv_in_yiq(image, + # lower_saturation=saturation, + # upper_saturation=2.0 - saturation, + # max_delta_hue=hue * math.pi) + image = tf.image.random_contrast(image, lower=contrast, upper=2.0 - contrast) + image = tf.image.random_saturation(image, lower=saturation, upper=2.0-saturation) + # tf.summary.image('distorted_color_image', tf.expand_dims(image, 0)) + + image = tf.clip_by_value(image, 0., 255.) + #image = tf.cast(image, tf.uint8) + # if random_search_aug: + # image = random_aug_search(image) + image = normalize(image) + image = tf.cast(image, tf.float16) + return image +def normalize(inputs): + imagenet_mean = [121.0, 115.0, 100.0] #np.array([121, 115, 100], dtype=np.float32) + imagenet_std = [70.0, 68.0, 71.0] #np.array([70, 68, 71], dtype=np.float32) + imagenet_mean = tf.expand_dims(tf.expand_dims(imagenet_mean, 0), 0) + imagenet_std = tf.expand_dims(tf.expand_dims(imagenet_std, 0), 0) + inputs = inputs - imagenet_mean #tf.subtract(inputs, imagenet_mean) + inputs = inputs * (1.0 / imagenet_std) + #inputs = tf.multiply(inputs, 1. / imagenet_std) + + return inputs diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/hyper_param.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/hyper_param.py new file mode 100644 index 0000000..eed8743 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/hyper_param.py @@ -0,0 +1,50 @@ +import tensorflow as tf +from .lr_schedule import warmup_decay, get_lr, get_1980_lr + + +class HyperParams: + def __init__(self, config): + self.config=config + nsteps_per_epoch = self.config['num_training_samples'] // self.config['global_batch_size'] + self.config['nsteps_per_epoch'] = nsteps_per_epoch + # nstep = self.config['num_training_samples'] * self.config['num_epochs'] // self.config['global_batch_size'] + if self.config['num_epochs']: + nstep = nsteps_per_epoch * self.config['num_epochs'] #------calculate nsteps in a different way------ + else: + nstep = self.config['max_train_steps'] + self.config['nstep'] = nstep + + self.config['total_steps_include_iterations'] = int( self.config['nstep'] + self.config['iterations_per_loop']) + self.config['save_summary_steps'] = nsteps_per_epoch + self.config['save_checkpoints_steps'] = nsteps_per_epoch + + + def get_hyper_params(self): + hyper_params = {} + hyper_params['learning_rate'] = self.get_learning_rate() + + return hyper_params + + + def get_learning_rate(self): + global_step = tf.train.get_global_step() + nsteps_per_epoch = self.config['nsteps_per_epoch'] + + warmup_lr = self.config['warmup_lr'] + lr = self.config['learning_rate_maximum'] + lr_end = self.config['learning_rate_end'] + lr_decay_mode = self.config['lr_decay_mode'] + + + + with tf.device('/cpu:0'): # Allow fallback to CPU if no GPU support for these ops + + if lr_decay_mode == 'constant' or self.config['num_epochs'] == None: + learning_rate = tf.constant(lr, tf.float32) + else: + learning_rate = get_1980_lr(self.config, global_step, warmup_lr, lr_end, lr, self.config['warmup_epochs'], nsteps_per_epoch, self.config['nstep'], lr_decay_mode ) + + learning_rate = tf.identity(learning_rate, 'learning_rate') + return learning_rate + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/lr_schedule.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/lr_schedule.py new file mode 100644 index 0000000..4484a9a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/hyper_param/lr_schedule.py @@ -0,0 +1,172 @@ +import tensorflow as tf +import numpy as np + +def get_lr(lr, lr_end, lr_decay_mode, warmup_it, decay_steps, global_step, steps, lr_steps, ploy_power, + cdr_first_decay_ratio, cdr_t_mul, cdr_m_mul, cdr_alpha, cd_alpha, lc_periods, lc_alpha, lc_beta, lr_mid, it_mid): + if lr_decay_mode == 'steps': + learning_rate = tf.train.piecewise_constant(global_step, + steps, lr_steps) + elif lr_decay_mode == 'poly' or lr_decay_mode == 'poly_cycle': + cycle = lr_decay_mode == 'poly_cycle' + learning_rate = tf.train.polynomial_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + end_learning_rate=lr_end, + power=ploy_power, + cycle=cycle) + elif lr_decay_mode == 'cosine_decay_restarts': + learning_rate = tf.train.cosine_decay_restarts(lr, + global_step - warmup_it, + (decay_steps - warmup_it) * cdr_first_decay_ratio, + t_mul=cdr_t_mul, + m_mul=cdr_m_mul, + alpha=cdr_alpha) + elif lr_decay_mode == 'cosine': + learning_rate = tf.train.cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + alpha=cd_alpha) + elif lr_decay_mode == 'linear_cosine': + learning_rate = tf.train.linear_cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + num_periods=lc_periods,#0.47, + alpha=lc_alpha,#0.0, + beta=lc_beta)#0.00001) + elif lr_decay_mode == 'linear_twice': + learning_rate = decay_linear_twice(lr, lr_mid, lr_end, warmup_it, it_mid, decay_steps, global_step ) + + else: + raise ValueError('Invalid type of lr_decay_mode') + return learning_rate + + +def cos_warmup_1980( global_step, warmup_steps, max_lr ): + PI = 3.14159265359 + ang = PI + PI * ( float(global_step+1) / float(warmup_steps) ) + offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + return offset + +def cos_decay_1980( global_step, warmup_steps, total_steps, max_lr,end_lr ): + PI = 3.14159265359 + ang = PI * ( float(global_step - warmup_steps+1) / float(total_steps - warmup_steps) ) + #offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + + #zp-cosine + cosine_decay_tmp=0.5*( 1.0 + np.cos( ang ) ) + decayed_tmp = (1 - end_lr) * cosine_decay_tmp + end_lr + offset = max_lr * decayed_tmp + return offset + +def get_1980_lr(config, global_step, lr_init, lr_end, lr_max, warmup_epochs, steps_per_epoch, nsteps, lr_decay_mode): + lr_each_step = [] + + if lr_decay_mode == 'steps': + decay_epoch_index = [30 * steps_per_epoch,60 * steps_per_epoch,80 * steps_per_epoch] + total_steps = int(nsteps) + for i in range(total_steps): + if i < decay_epoch_index[0]: + lr = lr_max + elif i < decay_epoch_index[1]: + lr = lr_max * 0.1 + elif i < decay_epoch_index[2]: + lr = lr_max * 0.01 + else: + lr = lr_max * 0.001 + lr_each_step.append(lr) + elif lr_decay_mode == 'poly': + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + for i in range( config['total_steps_include_iterations'] ): + if i < warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + elif i <= total_steps: + base = ( 1.0 - (float(i)-float(warmup_steps))/(float(total_steps)-float(warmup_steps)) ) + lr = float(lr_max) * base + else: + lr = 0.0 + lr_each_step.append(lr) + + elif lr_decay_mode == 'cosine': + total_steps = int(nsteps) + + warmup_steps = steps_per_epoch * warmup_epochs + for i in range( config['total_steps_include_iterations'] ): + if i < warmup_steps: + lr = cos_warmup_1980( i, warmup_steps, lr_max ) + elif i <= total_steps: + lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ,lr_end) + else: + lr = lr_end * 0.01 + lr_each_step.append(lr) + elif lr_decay_mode == 'linear_cosine': + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + for i in range( config['total_steps_include_iterations'] ): + if i < warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + elif i <= total_steps: + lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ) + else: + lr = 0.0 + lr_each_step.append(lr) + else: + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + for i in range(total_steps): + if i < warmup_steps: + lr = lr_init + (lr_max - lr_init) * i / warmup_steps + else: + lr = lr_max - ( lr_max - lr_end ) * (i - warmup_steps) / (total_steps - warmup_steps) + lr_each_step.append( lr ) + + # current_step = tf.to_int32( tf.cast(global_step,tf.float32) / float(steps_per_epoch) ) + current_step = global_step + lr_each_step = tf.convert_to_tensor( lr_each_step ) + print (lr_each_step) + learning_rate = tf.gather( lr_each_step, current_step ) + + return learning_rate + +def warmup_decay(lr_warmup_mode, warmup_lr, global_step, warmup_steps, warmup_end_lr): + if lr_warmup_mode == 'linear': + learning_rate = linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + elif lr_warmup_mode == 'cosine': + learning_rate = cos_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + else: + raise ValueError('Invalid type of lr_warmup_mode') + return learning_rate + + +def linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr): + from tensorflow.python.ops import math_ops + p = tf.cast(global_step, tf.float32) / tf.cast(warmup_steps, tf.float32) + diff = math_ops.subtract(warmup_end_lr, warmup_lr) + res = math_ops.add(warmup_lr, math_ops.multiply(diff, p)) + return res + +def cos_warmup( warmup_lr, global_step, warmup_steps, warmup_end_lr ): + PI = 3.14159265359 + diff = tf.subtract( warmup_end_lr, warmup_lr ) + ang = PI + PI * ( tf.cast( global_step, tf.float32 ) / tf.cast( warmup_steps,tf.float32 )) + offset = diff * 0.5 * ( 1.0 + tf.math.cos( ang ) ) + res = tf.add( warmup_lr, offset ) + return res + + +def decay_linear( lr_start, lr_end, it_start, it_end, global_step ): + down_steps = it_end - it_start + down_range = lr_start - lr_end + down_per_step = float( down_range ) / float( down_steps ) + res = tf.subtract( tf.cast(lr_start, tf.float32), tf.multiply( tf.cast(down_per_step, tf.float32), tf.subtract(tf.cast(global_step, tf.float32), tf.cast(it_start, tf.float32) )) ) + return res + +def decay_linear_twice(lr_start, lr_mid, lr_end, it_start, it_mid, it_end, global_step ): + learning_rate = tf.cond( global_step < it_start, lambda: tf.cast(lr_start, tf.float32), lambda: decay_linear(lr_start, lr_mid, it_start, it_mid, global_step)) + learning_rate = tf.cond( global_step > it_mid, lambda: decay_linear(lr_mid, lr_end, it_mid, it_end, global_step) , lambda: learning_rate ) + return learning_rate + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/layers/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/layers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/layers/layers.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/layers/layers.py new file mode 100644 index 0000000..0312452 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/layers/layers.py @@ -0,0 +1,23 @@ +import tensorflow as tf +#from tensorflow.contrib.hccl.python.ops import hccl_ops +from npu_bridge.hccl import hccl_ops + +class Layers: + + def get_accuracy(self, labels, predicted_classes, logits, config): + accuracy = tf.metrics.accuracy( + labels=labels, predictions=predicted_classes) + top5acc = tf.metrics.mean( + tf.cast(tf.nn.in_top_k(logits, labels, 5), tf.float32)) + if config['rank_size'] == 1: + newaccuracy = (accuracy[0], accuracy[1]) + newtop5acc = (top5acc[0], top5acc[1]) + else: + newaccuracy = (hccl_ops.allreduce(accuracy[0],"sum")/config['rank_size'], accuracy[1]) + newtop5acc = (hccl_ops.allreduce(top5acc[0],"sum")/config['rank_size'], top5acc[1]) + metrics = {'val-top1acc': newaccuracy, 'val-top5acc': newtop5acc} + return metrics + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/losses/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/losses/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/losses/res50_loss.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/losses/res50_loss.py new file mode 100644 index 0000000..ad383f9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/losses/res50_loss.py @@ -0,0 +1,36 @@ +import tensorflow as tf + +class Loss: + def __init__(self,config): + self.config = config + + def get_loss(self, logits, labels): + labels_one_hot = tf.one_hot(labels, self.config['num_classes']) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot,label_smoothing=self.config['label_smoothing']) + loss = tf.identity(loss, name='loss') + return loss + + def get_total_loss(self, loss): + reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + total_loss = tf.add_n([loss] + reg_losses, name='total_loss') + return total_loss + + + def optimize_loss(self, total_loss, opt): + gate_gradients = (tf.train.Optimizer.GATE_NONE) + # grads_and_vars = opt.compute_gradients(total_loss, colocate_gradients_with_ops=True, gate_gradients=gate_gradients) + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + + # train_op = opt.apply_gradients( grads_and_vars, global_step=None ) + train_op = opt.apply_gradients( grads_and_vars) + + return train_op + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/clean.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/clean.sh new file mode 100644 index 0000000..14ec7df --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/clean.sh @@ -0,0 +1,7 @@ + ps -ef | grep TdtMain | awk '{print $2}' | xargs kill -9 +rm -rf *.pbtxt +rm -rf /var/log/npu/slog/*.log +rm ckpt* -rf +find ./ -name "*.pyc" | xargs rm -rf +find ./ -name __pycache__ | xargs rm -rf +rm /var/log/npu/dataset/* -rf diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/res50.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/res50.py new file mode 100644 index 0000000..724c89a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/res50.py @@ -0,0 +1,141 @@ +import tensorflow as tf +import sys +import ast +#sys.path.append("..") +#sys.path.append("../models") +#sys.path.append("./resnet50_train/") +#sys.path.append("./resnet50_train/models") +import os +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../../utils')) +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../../utils/atlasboost')) +base_path=os.path.split(os.path.realpath(__file__))[0] +print ("#########base_path:", base_path) +path_1 = base_path + "/.." +print (path_1) +path_2 = base_path + "/../models" +print (path_2) +path_3 = base_path + "/../../" +print (path_3) + + +sys.path.append(base_path + "/..") +sys.path.append(base_path + "/../models") +sys.path.append(base_path + "/../../") +sys.path.append(base_path + "/../../models") + +from utils import create_session as cs +from utils import logger as lg +from data_loader.resnet50 import data_loader as dl +from models.resnet50 import res50_model as ml +from optimizers import optimizer as op +from losses import res50_loss as ls +from trainers import gpu_base_trainer as tr +# from configs import res50_config as cfg +from hyper_param import hyper_param as hp +from layers import layers as ly +from datetime import datetime +# from utils import hwlog +import argparse + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +# import hwlog +# remark_logger = hwlog.get_logger(__file__, "hw_Resnext50.log") +# initinal_data={"base_lr": 0.128, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, "batchsize": 32} +# hwlog.add_additional_info(remark_logger, "Resnext50", "tensorflow", initinal_data) # logger_obj, model_name, framework, initinal_data + + +def main(): + #-------------------choose the config file in .sh file----------- + cmdline = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + cmdline.add_argument('--config_file', default="", + help="""config file used.""") + cmdline.add_argument('--iterations_per_loop', default=1, + help="""config file used.""") + cmdline.add_argument('--max_train_steps', default=200, + help="""config file used.""") + cmdline.add_argument('--debug', default=True, type=ast.literal_eval, + help="""config file used.""") + cmdline.add_argument('--eval', default=False, type=ast.literal_eval, + help="""config file used.""") + cmdline.add_argument('--model_dir', default="./model_dir", + help="""config file used.""") + FLAGS, unknown_args = cmdline.parse_known_args() + if len(unknown_args) > 0: + for bad_arg in unknown_args: + print("ERROR: Unknown command line arg: %s" % bad_arg) + raise ValueError("Invalid command line arg(s)") + + cfg_file = FLAGS.config_file + configs = 'configs' + cfg = getattr(__import__(configs, fromlist=[cfg_file]), cfg_file) + #------------------------------------------------------------------ + + config = cfg.res50_config() + config['iterations_per_loop'] = int(FLAGS.iterations_per_loop) + config['max_train_steps'] = int(FLAGS.max_train_steps) + config['debug'] = FLAGS.debug + config['eval'] = FLAGS.eval + config['model_dir'] = FLAGS.model_dir + print("iterations_per_loop:%d" %(config['iterations_per_loop'])) + print("max_train_steps :%d" %(config['max_train_steps'])) + print("debug :%s" %(config['debug'])) + print("eval :%s" %(config['eval'])) + print("model_dir :%s" %(config['model_dir'])) + Session = cs.CreateSession(config) + data = dl.DataLoader(config) + hyper_param = hp.HyperParams(config) + layers = ly.Layers() + optimizer = op.Optimizer(config) + loss = ls.Loss(config) + logger = lg.LogSessionRunHook(config) # add tensorboard summary + + model = ml.Model(config, data, hyper_param,layers, optimizer, loss, logger) # get the model + trainer = tr.GPUBaseTrain(Session, config, data, model, logger) # use Estimator to build training process + + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # try: + if config['mode'] =='train': + trainer.train() + if config['eval'] : + trainer.evaluate() + elif config['mode'] =='evaluate': + trainer.evaluate() + elif config['mode'] =='train_and_evaluate': + trainer.train_and_evaluate() + else: + raise ValueError('Invalid type of mode') + # hwlog.vlogger.info("namespace:%s,time_ts:%s,event_type:benchmark_stop" % (work_num, date_time)) + # hwlog.vlogger.info("atlas benchmark train success") + # remark_logger.info("ABK train success") + # except: + # # hwlog.vlogger.info("namespace:%s,time_ts:%s,event_type:benchmark_stop" % (work_num, date_time)) + # # hwlog.vlogger.info("atlas benchmark train failed") + # remark_logger.info("ABK train failed") + + # add by zwx5326390 + + + +if __name__ == '__main__': + # add zwx5326390 日志打点 + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.01, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, + "batchsize": 32} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + main() diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50.sh new file mode 100644 index 0000000..bbd2da5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50.sh @@ -0,0 +1,21 @@ +#!/bin/bash +#export CUDA_VISIBLE_DEVICES=0 +dir=`pwd` + +#cp -rf ./config /tmp/ +export JOB_ID=10086 +#export PROFILING_DIR=/var/log/npu/profiling/container/0 +export DEVICE_ID=0 +#export PROFILING_MODE=true +export PRINT_MODEL=1 +#export ENABLE_DATA_PRE_PROC=1 +export RANK_ID=0 +export RANK_SIZE=1 +export RANK_TABLE_FILE=/home/lxh/config/new_rank_table_1p.json +export FUSION_TENSOR_SIZE=1000000000 +export PYTHONPATH=${dir} +export LD_LIBRARY_PATH=/usr/local/HiAI/runtime/lib64/ +/usr/local/HiAI/runtime/bin/TdtMain --configfile=/home/lxh/test/config/job_tdt_2p_$DEVICE_ID.json & +sleep 5 + +python3.6 res50.py --config_file res50_baseline diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50_gpu.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50_gpu.sh new file mode 100644 index 0000000..c89b78e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/mains/train_res50_gpu.sh @@ -0,0 +1,4 @@ +#!/bin/bash +export CUDA_VISIBLE_DEVICES=7 + +python3.5 res50.py --config_file res50_baseline_gpu diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_helper.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_helper.py new file mode 100644 index 0000000..0e16df6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_helper.py @@ -0,0 +1,24 @@ +import tensorflow as tf + +def _fp32_trainvar_getter(getter, name, shape=None, dtype=None, + trainable=True, regularizer=None, + *args, **kwargs): + storage_dtype = dtype + variable = getter(name, shape, dtype=storage_dtype, + trainable=trainable, + regularizer=regularizer if trainable and 'BatchNorm' not in name and 'batchnorm' not in name and 'batch_norm' not in name and 'Batch_Norm' not in name else None, + *args, **kwargs) + + return variable + + +def fp32_trainable_vars(name='fp32_vars', *args, **kwargs): + """A varible scope with custom variable getter to convert fp16 trainable + variables with fp32 storage followed by fp16 cast. + """ + return tf.variable_scope( + name, custom_getter=_fp32_trainvar_getter, *args, **kwargs) + +def custom_getter_with_fp16_and_weight_decay(dtype, weight_decay): + return fp32_trainable_vars(dtype=dtype, regularizer=tf.contrib.layers.l2_regularizer(weight_decay)) + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_model.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_model.py new file mode 100644 index 0000000..02e3958 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/res50_model.py @@ -0,0 +1,222 @@ + +import tensorflow as tf +from . import resnet, res50_helper +from trainers.train_helper import stage +#from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +#from tensorflow.contrib.offline_train.python import npu_ops +from npu_bridge.estimator import npu_ops +_NUM_EXAMPLES_NAME="num_examples" + + +class Model(object): + def __init__(self, config, data, hyper_param, layers, optimizer, loss, logger): + self.config = config + self.data = data + self.hyper_param = hyper_param + self.layers = layers + self.optimizer = optimizer + self.loss = loss + self.logger = logger + + def get_estimator_model_func(self, features, labels, mode, params=None): + labels = tf.reshape(labels, (-1,)) # Squash unnecessary unary dim #----------------not use when use onehot label + + model_func = self.get_model_func() + inputs = features # TODO: Should be using feature columns? + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + with tf.device('/gpu:0'): + if self.config['accelerator'] == 'gpu': + inputs = tf.cast(inputs, self.config['dtype']) + + inputs = tf.cast(inputs, self.config['dtype']) + with res50_helper.custom_getter_with_fp16_and_weight_decay(dtype=self.config['dtype'], weight_decay=self.config['weight_decay']): # no BN decay + + top_layer = model_func( + inputs, data_format=self.config['data_format'], training=is_training, + conv_initializer=self.config['conv_init'], + bn_init_mode=self.config['bn_init_mode'], bn_gamma_initial_value=self.config['bn_gamma_initial_value']) + + + logits = top_layer + predicted_classes = tf.argmax(logits, axis=1, output_type=tf.int32) + logits = tf.cast(logits, tf.float32) + + #loss = self.loss.get_loss(logits, labels) + #loss = tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels) + + labels_one_hot = tf.one_hot(labels, depth=1001) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot, label_smoothing=self.config['label_smoothing']) + + + base_loss = tf.identity(loss, name='loss') # For access by logger (TODO: Better way to access it?) + # base_loss = tf.add_n([loss]) + + def exclude_batch_norm(name): + #return 'batch_normalization' not in name + return 'BatchNorm' not in name + loss_filter_fn = exclude_batch_norm + + # Add weight decay to the loss. + l2_loss = self.config['weight_decay'] * tf.add_n( + # loss is computed using fp32 for numerical stability. + [tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables() + if loss_filter_fn(v.name)]) + #tf.summary.scalar('l2_loss', l2_loss) + # total_loss = base_loss + l2_loss + if self.config['use_lars']: + total_loss = base_loss + else: + total_loss = base_loss + l2_loss + + total_loss = tf.identity(total_loss, name = 'total_loss') + + + if mode == tf.estimator.ModeKeys.EVAL: + with tf.device(None): + metrics = self.layers.get_accuracy( labels, predicted_classes, logits, self.config) + + return tf.estimator.EstimatorSpec( + mode, loss=loss, eval_metric_ops=metrics) + + assert (mode == tf.estimator.ModeKeys.TRAIN) + + #reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + #total_loss = tf.add_n([tf.saturate_cast(loss, self.config['dtype']) ] + reg_losses, name='total_loss') + #total_loss = tf.add_n([loss], name='total_loss') + + batch_size = tf.shape(inputs)[0] + + global_step = tf.train.get_global_step() + with tf.device('/cpu:0'): + learning_rate = self.hyper_param.get_learning_rate() + + #-----------------------batchsize scaling---------------------------------- + momentum = self.config['momentum'][0] + #------------------------------end------------------------------------------ + + opt = tf.train.MomentumOptimizer( + learning_rate, momentum, use_nesterov=self.config['use_nesterov']) + opt=NPUDistributedOptimizer(opt) + if self.config['accelerator'] == 'gpu': + opt = self.optimizer.get_lbs_optimizer(opt) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + with tf.control_dependencies(update_ops): + if self.config['accelerator'] == 'gpu': + gate_gradients = (tf.train.Optimizer.GATE_NONE) + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + train_op = opt.apply_gradients( grads_and_vars,global_step = global_step) + else: + with tf.name_scope('loss_scale'): + loss_scale = float( self.config['loss_scale'] ) + scaled_grads_and_vars = opt.compute_gradients( total_loss * loss_scale ) + unscaled_grads_and_vars = [ (g/loss_scale, v) for g,v in scaled_grads_and_vars ] + + + #-----------------------------------------Lars------------------------------------------ + with tf.name_scope('LARS'): + fp32_grads_and_vars = [ (tf.cast(g, tf.float32), v) for g,v in unscaled_grads_and_vars ] + grad_var_list = [] + + if self.config['use_lars']: + if self.config['accelerator'] == 'gpu': + for g, var in fp32_grads_and_vars: + + if 'BatchNorm' not in var.name and 'bias' not in var.name: + grad_norm = tf.norm(g,ord='euclidean') + weight_norm = tf.norm(var,ord='euclidean') + grad_norm_wd = tf.add( grad_norm, tf.multiply( self.config['weight_decay'] , weight_norm ) ) + rescale_factor = tf.div( tf.multiply(0.001, weight_norm), tf.add(grad_norm_wd, tf.constant(1e-5, tf.float32)) ) + decayed_g = tf.add( g, tf.multiply(self.config['weight_decay'], var ) ) + + with tf.name_scope('lars_grad'): + g = tf.multiply(rescale_factor, decayed_g) + + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + + elif self.config['accelerator'] == '1980': + print('lars9999999999999999999999') + g_list_bn_bias = [] + var_list_bn_bias = [] + g_list_else = [] + var_list_else = [] + for g, var in fp32_grads_and_vars: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + g_list_else.append(g) + var_list_else.append(var) + else: + g_list_bn_bias.append(g) + var_list_bn_bias.append(var) + + + g_list_else_lars = npu_ops.LARS(inputs_w=var_list_else, + inputs_g=g_list_else, + weight_decay=self.config['weight_decay'], + hyperpara=0.001, + epsilon=1e-5) + + g_list_lars = g_list_bn_bias + g_list_else_lars + var_list = var_list_bn_bias + var_list_else + + for (g, var) in zip(g_list_lars,var_list): + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + + + else: + print('do not use lars111111111111111111') + for g, var in fp32_grads_and_vars: + #if 'BatchNorm' not in var.name and 'bias' not in var.name: + # decayed_g = tf.add( g, tf.multiply( self.config['weight_decay'], var ) ) + # g = decayed_g + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + #-----------------------------------------end Lars------------------------------------------ + + + + + train_op = opt.apply_gradients( grad_var_list, global_step = global_step ) + + train_op = tf.group(train_op) + + #with tf.device('/cpu:0'): + #tf.summary.scalar('total_loss', total_loss) + #tf.summary.scalar('base_loss', base_loss) + #tf.summary.scalar('learning_rate', learning_rate) + #tf.contrib.summary.flush() +# if self.config['do_checkpoint']: +# summary_hook = tf.train.SummarySaverHook( save_steps=20, +# output_dir=self.config['log_dir']+'/train_summary', +# summary_op = tf.summary.merge_all() ) + + #return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op, training_hooks=[summary_hook] )\ + # if self.config['do_checkpoint'] else tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op ) + return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op ) + + # return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op) + + + + def get_model_func(self): + model_name = self.config['model_name'] + if model_name.startswith('resnet'): + nlayer = int(model_name[len('resnet'):]) + return lambda images, *args, **kwargs: \ + resnet.inference_resnet_v1(self.config,images, nlayer, *args, **kwargs) + else: + raise ValueError("Invalid model type: %s" % model_name) + + + + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/resnet.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/resnet.py new file mode 100644 index 0000000..71a10e2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/models/resnet50/resnet.py @@ -0,0 +1,545 @@ +import tensorflow as tf + +_BATCH_NORM_EPSILON = 1e-4 +_BATCH_NORM_DECAY = 0.9 + +_Cardi = 32 + +class LayerBuilder(object): + def __init__(self, activation=None, data_format='channels_last', + training=False, use_batch_norm=False, batch_norm_config=None, + conv_initializer=None, bn_init_mode='adv_bn_init', bn_gamma_initial_value=1.0 ): + self.activation = activation + self.data_format = data_format + self.training = training + self.use_batch_norm = use_batch_norm + self.batch_norm_config = batch_norm_config + self.conv_initializer = conv_initializer + self.bn_init_mode = bn_init_mode + self.bn_gamma_initial_value = bn_gamma_initial_value + if self.batch_norm_config is None: + self.batch_norm_config = { + 'decay': _BATCH_NORM_DECAY, + 'epsilon': _BATCH_NORM_EPSILON, + 'scale': True, + 'zero_debias_moving_mean': False, + } + + def _conv2d(self, inputs, activation, *args, **kwargs): + x = tf.layers.conv2d( + inputs, data_format=self.data_format, + # use_bias=not self.use_batch_norm, + use_bias=False, + kernel_initializer=self.conv_initializer, + activation=None if self.use_batch_norm else activation, + *args, **kwargs) + if self.use_batch_norm: + param_initializers = { + 'moving_mean': tf.zeros_initializer(), + 'moving_variance': tf.ones_initializer(), + 'beta': tf.zeros_initializer(), + } + if self.bn_init_mode == 'adv_bn_init': + param_initializers['gamma'] = tf.ones_initializer() + elif self.bn_init_mode == 'conv_bn_init': + param_initializers['gamma'] = tf.constant_initializer(self.bn_gamma_initial_value) + else: + raise ValueError("--bn_init_mode must be 'conv_bn_init' or 'adv_bn_init' ") + + x = self.batch_norm(x) + x = activation(x) if activation is not None else x + return x + + def conv2d_linear_last_bn(self, inputs, *args, **kwargs): + x = tf.layers.conv2d( + inputs, data_format=self.data_format, + use_bias=False, + kernel_initializer=self.conv_initializer, + activation=None, *args, **kwargs) + param_initializers = { + 'moving_mean': tf.zeros_initializer(), + 'moving_variance': tf.ones_initializer(), + 'beta': tf.zeros_initializer(), + } + if self.bn_init_mode == 'adv_bn_init': + param_initializers['gamma'] = tf.zeros_initializer() + elif self.bn_init_mode == 'conv_bn_init': + param_initializers['gamma'] = tf.constant_initializer(self.bn_gamma_initial_value) + else: + raise ValueError("--bn_init_mode must be 'conv_bn_init' or 'adv_bn_init' ") + + x = self.batch_norm(x, param_initializers=param_initializers) + return x + + def conv2d_no_act_no_bn(self, inputs, *args, **kwargs): + x = tf.layers.conv2d( + inputs, data_format=self.data_format, + use_bias=False, + kernel_initializer=self.conv_initializer, + activation=None, *args, **kwargs) + return x + + def conv2d_linear(self, inputs, *args, **kwargs): + return self._conv2d(inputs, None, *args, **kwargs) + + def conv2d(self, inputs, *args, **kwargs): + return self._conv2d(inputs, self.activation, *args, **kwargs) + + def pad2d(self, inputs, begin, end=None): + if end is None: + end = begin + try: + _ = begin[1] + except TypeError: + begin = [begin, begin] + try: + _ = end[1] + except TypeError: + end = [end, end] + if self.data_format == 'channels_last': + padding = [[0, 0], [begin[0], end[0]], [begin[1], end[1]], [0, 0]] + else: + padding = [[0, 0], [0, 0], [begin[0], end[0]], [begin[1], end[1]]] + return tf.pad(inputs, padding) + + def max_pooling2d(self, inputs, *args, **kwargs): + return tf.layers.max_pooling2d( + inputs, data_format=self.data_format, *args, **kwargs) + + def average_pooling2d_stride_1(self, inputs, *args, **kwargs): + # inputs = tf.nn.avg_pool(inputs, ksize=[1,1,1,1],strides=[1,1,1,1], padding="VALID", data_format="NHWC" ) + return inputs + + def average_pooling2d(self, inputs, *args, **kwargs): + inputs = tf.nn.avg_pool(inputs, ksize=[1,2,2,1],strides=[1,2,2,1], padding="VALID", data_format="NHWC" ) + return inputs + + # return tf.layers.average_pooling2d( + # inputs, data_format=self.data_format, *args, **kwargs) + + def dense_linear(self, inputs, units, **kwargs): + return tf.layers.dense(inputs, units, activation=None) + + def dense(self, inputs, units, **kwargs): + return tf.layers.dense(inputs, units, activation=self.activation) + + def activate(self, inputs, activation=None): + activation = activation or self.activation + return activation(inputs) if activation is not None else inputs + + def batch_norm(self, inputs, **kwargs): + all_kwargs = dict(self.batch_norm_config) + all_kwargs.update(kwargs) + data_format = 'NHWC' if self.data_format == 'channels_last' else 'NCHW' + bn_inputs = inputs + outputs = tf.contrib.layers.batch_norm( + inputs, is_training=self.training, data_format=data_format, + fused=True, **all_kwargs) + + return outputs + + def spatial_average2d(self, inputs): + shape = inputs.get_shape().as_list() + if self.data_format == 'channels_last': + n, h, w, c = shape + else: + n, c, h, w = shape + n = -1 if n is None else n + x = tf.layers.average_pooling2d(inputs, (h, w), (1, 1), + data_format=self.data_format) + return tf.reshape(x, [n, c]) + + def flatten2d(self, inputs): + x = inputs + if self.data_format != 'channel_last': + # Note: This ensures the output order matches that of NHWC networks + x = tf.transpose(x, [0, 2, 3, 1]) + input_shape = x.get_shape().as_list() + num_inputs = 1 + for dim in input_shape[1:]: + num_inputs *= dim + return tf.reshape(x, [-1, num_inputs], name='flatten') + + def residual2d(self, inputs, network, units=None, scale=1.0, activate=False): + outputs = network(inputs) + c_axis = -1 if self.data_format == 'channels_last' else 1 + h_axis = 1 if self.data_format == 'channels_last' else 2 + w_axis = h_axis + 1 + ishape, oshape = [y.get_shape().as_list() for y in [inputs, outputs]] + ichans, ochans = ishape[c_axis], oshape[c_axis] + strides = ((ishape[h_axis] - 1) // oshape[h_axis] + 1, + (ishape[w_axis] - 1) // oshape[w_axis] + 1) + with tf.name_scope('residual'): + if (ochans != ichans or strides[0] != 1 or strides[1] != 1): + inputs = self.conv2d_linear(inputs, units, 1, strides, 'SAME') + x = inputs + scale * outputs + if activate: + x = self.activate(x) + return x + + +def resnet_bottleneck_v1(builder, inputs, depth, depth_bottleneck, stride, filters, arch_type, + basic=False): + num_inputs = inputs.get_shape().as_list()[3] + x = inputs + #with tf.name_scope('resnet_model'): + if depth == num_inputs: + if stride == 1:#v1.5 + shortcut = x + else:#v1 + shortcut = builder.max_pooling2d(x, 1, stride) + else: # the downsample(first) block in each layer + if 'D1' in arch_type: + if stride == 1: + shortcut = builder.average_pooling2d_stride_1(x, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.average_pooling2d(x, stride, stride) #--------------------Resnet-D------------ + shortcut = builder.conv2d_linear(shortcut, depth, 1, 1, 'SAME') + elif 'D2' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 3, stride, 'SAME') + elif 'D3' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + shortcut = builder.average_pooling2d(shortcut, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.conv2d_linear(x, depth, 1, stride, 'SAME') + conv_input = x + + if basic: + x = builder.pad2d(x, 1) + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'VALID') + x = builder.conv2d_linear(x, depth, 3, 1, 'SAME') + else: + conv_input = x + x = builder.conv2d(x, depth_bottleneck, 1, 1, 'SAME') + conv_input = x + if stride == 1: + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + else: + if 'E1' in arch_type: + x = builder.average_pooling2d( x, stride, stride ) + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + elif 'E2' in arch_type: + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + if stride == 1: + x = builder.average_pooling2d_stride_1( x, stride, stride ) + else: + x = builder.average_pooling2d( x, stride, stride ) + else: # E0 + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + + # x = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + conv_input = x + x = builder.conv2d_linear_last_bn(x, depth, 1, 1, 'SAME') + + x = tf.nn.relu(x + shortcut) + return x + + + + +def resnext_bottleneck(builder, inputs, depth, depth_bottleneck, stride, filters, arch_type, + basic=False): + num_inputs = inputs.get_shape().as_list()[3] + x = inputs + with tf.name_scope('resnet_v1'): + if depth == num_inputs: + if stride == 1:#v1.5 + shortcut = x + else:#v1 + shortcut = builder.max_pooling2d(x, 1, stride) + else: # the downsample(first) block in each layer + shortcut = builder.conv2d_linear(x, depth, 1, stride, 'SAME') + if basic: + x = builder.pad2d(x, 1) + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'VALID') + x = builder.conv2d_linear(x, depth, 3, 1, 'SAME') + else: + + #----- split layer ------ + x = builder.conv2d( x, depth_bottleneck, 1, 1, 'SAME' ) + + group_inputs = tf.split( x, _Cardi, axis=3 ) + + layers_split=[] + tmp = x + for i in range(_Cardi): + with tf.name_scope('cardi_'+str(i)): + split = builder.conv2d_no_act_no_bn( group_inputs[i], depth_bottleneck/_Cardi, 3, stride, 'SAME' ) + layers_split.append(split) + + x = tf.concat(layers_split, axis=3) + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + x = builder.conv2d_linear_last_bn(x, depth, 1, 1, 'SAME') + x = tf.nn.relu(x + shortcut) + return x + + + + + + +def resnet_bottleneck_v2(builder, inputs, depth, depth_bottleneck, stride, filters, arch_type, + basic=False): + num_inputs = inputs.get_shape().as_list()[1] + x = inputs + with tf.name_scope('resnet_v1'): + # ------- shortcut --------------- + if depth == num_inputs: + if stride == 1:#v1.5 + shortcut = x + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else:#v1 + shortcut = builder.max_pooling2d(x, 1, stride) + else: # the downsample(first) block in each layer + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + if 'D1' in arch_type: + shortcut = builder.average_pooling2d(x, stride, stride) #--------------------Resnet-D------------ + shortcut = builder.conv2d_linear(shortcut, depth, 1, 1, 'SAME') + elif 'D2' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 3, stride, 'SAME') + elif 'D3' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + shortcut = builder.average_pooling2d(shortcut, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.conv2d_linear(x, depth, 1, stride, 'SAME') + + # -------- mainstream ---------------- + if basic: + x = builder.pad2d(x, 1) + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'VALID') + x = builder.conv2d_linear(x, depth, 3, 1, 'SAME') + else: + x = builder.conv2d(x, depth_bottleneck, 1, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + if stride == 1: + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else: + if 'E1' in arch_type: + x = builder.average_pooling2d( x, stride, stride ) + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'E2' in arch_type: + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.average_pooling2d( x, stride, stride ) + else: # E0 + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + x = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + + + x = x + shortcut + return x + +def inference_resnext_impl(builder, inputs, layer_counts, arch_type='C1+D', resnet_version='v1.5', basic=False): + x = inputs + #x = builder.batch_norm(x) + x = builder.pad2d(x, 3) + x = builder.conv2d(x, 64, 7, 2, 'VALID') + #x = builder.conv2d(x, 64, 7, 2, 'SAME') + + + num_filters=64 + x = builder.max_pooling2d(x, 3, 2, 'SAME') + #x, argmax = tf.nn.max_pool_with_argmax(input=x, ksize=(1,3,3,1), strides=(1,2,2,1), padding='SAME') + + for i in range(layer_counts[0]): + x = resnext_bottleneck(builder, x, 256, 128, 1, num_filters, arch_type, basic) + for i in range(layer_counts[1]): + num_filters=num_filters*2 + x = resnext_bottleneck(builder, x, 512, 256, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[2]): + num_filters=num_filters*2 + x = resnext_bottleneck(builder, x, 1024, 512, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[3]): + num_filters=num_filters*2 + x = resnext_bottleneck(builder, x, 2048, 1024, 2 if i == 0 else 1, num_filters, arch_type, basic) + print ('====================Final x:', x) + + + axes = [1,2] + x = tf.reduce_mean( x, axes, keepdims=True ) + x = tf.identity(x, 'final_reduce_mean') + x = tf.reshape( x, [-1, 2048] ) + x = tf.layers.dense(inputs=x, units=1001,kernel_initializer= tf.variance_scaling_initializer() ) + x = tf.identity( x, 'final_dense' ) + return x + + +def inference_resnet_v1_impl(builder, inputs, layer_counts, arch_type='C1+D', resnet_version='v1.5', basic=False): + x = inputs + #x = builder.pad2d(x, 1) + + if 'C1' in arch_type: # --- Resnet C ----- + x = builder.conv2d(x, 32, 3, 2, 'SAME') + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.conv2d(x, 64, 3, 1, 'SAME') + elif 'C2' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.conv2d(x, 64, 3, 1, 'VALID') + elif 'C3' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.conv2d(x, 64, 3, 2, 'VALID') + else: + x = builder.conv2d(x, 64, 7, 2, 'SAME') + + num_filters=64 + + pooled_inputs = x + #x = builder.max_pooling2d(x, 3, 2, 'SAME') + x, argmax = tf.nn.max_pool_with_argmax(input=x, ksize=(1,3,3,1), strides=(1,2,2,1), padding='SAME') + + for i in range(layer_counts[0]): + x = resnet_bottleneck_v1(builder, x, 256, 64, 1, num_filters, arch_type, basic) + for i in range(layer_counts[1]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 512, 128, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[2]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 1024, 256, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[3]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 2048, 512, 2 if i == 0 else 1, num_filters, arch_type, basic) + + axes = [1,2] + x = tf.reduce_mean( x, axes, keepdims=True ) + x = tf.identity(x, 'final_reduce_mean') + x = tf.reshape( x, [-1, 2048] ) + x = tf.layers.dense(inputs=x, units=1001,kernel_initializer=tf.random_normal_initializer(stddev=0.01)) + x = tf.identity( x, 'final_dense' ) + return x + +def inference_resnet_v2_impl(builder, inputs, layer_counts, arch_type='C1+D', basic=False): + x = inputs + x = builder.pad2d(x, 3) + + if 'C1' in arch_type: # --- Resnet C ----- + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'C2' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'C3' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else: + x = builder.conv2d(x, 64, 7, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + num_filters=64 + + pooled_inputs = x + x = builder.max_pooling2d(x, 3, 2, 'SAME') + + for i in range(layer_counts[0]): + x = resnet_bottleneck_v2(builder, x, 256, 64, 1, num_filters, arch_type, basic) + for i in range(layer_counts[1]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 512, 128, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[2]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 1024, 256, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[3]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 2048, 512, 2 if i == 0 else 1, num_filters, arch_type, basic) + return builder.spatial_average2d(x) + +def inference_resnet_v1(config, inputs, nlayer, data_format='channels_last', + training=False, conv_initializer=None, bn_init_mode='adv_bn_init', bn_gamma_initial_value=1.0 ): + """Deep Residual Networks family of models + https://arxiv.org/abs/1512.03385 + """ + if config['resnet_version'] == 'v1.5': + builder = LayerBuilder(tf.nn.relu, data_format, training, use_batch_norm=True, + conv_initializer=conv_initializer, bn_init_mode=bn_init_mode, bn_gamma_initial_value=bn_gamma_initial_value) + if nlayer == 18: + return inference_resnet_v1_impl(builder, inputs, [2, 2, 2, 2], config['arch_type'], config['resnet_version'], basic=True) + elif nlayer == 34: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], config['resnet_version'], basic=True) + elif nlayer == 50: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], config['resnet_version']) + elif nlayer == 101: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 23, 3], config['arch_type'], config['resnet_version']) + elif nlayer == 152: + return inference_resnet_v1_impl(builder, inputs, [3, 8, 36, 3], config['arch_type'], config['resnet_version']) + else: + raise ValueError("Invalid nlayer (%i); must be one of: 18,34,50,101,152" % + nlayer) + + elif config['resnet_version'] == 'v2': + builder = LayerBuilder( None, data_format, training, use_batch_norm=False, + conv_initializer=conv_initializer, bn_init_mode=bn_init_mode, bn_gamma_initial_value=bn_gamma_initial_value) + if nlayer == 18: + return inference_resnet_v2_impl(builder, inputs, [2, 2, 2, 2], config['arch_type'], basic=True) + elif nlayer == 34: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], basic=True) + elif nlayer == 50: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 6, 3], config['arch_type']) + elif nlayer == 101: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 23, 3], config['arch_type']) + elif nlayer == 152: + return inference_resnet_v2_impl(builder, inputs, [3, 8, 36, 3], config['arch_type']) + else: + raise ValueError("Invalid nlayer (%i); must be one of: 18,34,50,101,152" % + nlayer) + + elif config['resnet_version'] == 'resnext': + builder = LayerBuilder( tf.nn.relu, data_format, training, use_batch_norm=True, + conv_initializer=conv_initializer, bn_init_mode=bn_init_mode, bn_gamma_initial_value=bn_gamma_initial_value) + if nlayer == 18: + return inference_resnext_impl(builder, inputs, [2, 2, 2, 2], config['arch_type'], basic=True) + elif nlayer == 34: + return inference_resnext_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], basic=True) + elif nlayer == 50: + return inference_resnext_impl(builder, inputs, [3, 4, 6, 3], config['arch_type']) + elif nlayer == 101: + return inference_resnext_impl(builder, inputs, [3, 4, 23, 3], config['arch_type']) + elif nlayer == 152: + return inference_resnext_impl(builder, inputs, [3, 8, 36, 3], config['arch_type']) + else: + raise ValueError("Invalid nlayer (%i); must be one of: 18,34,50,101,152" % + nlayer) + + + else: + raise ValueError("Invalid resnet version") + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/optimizers/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/optimizers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/optimizers/optimizer.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/optimizers/optimizer.py new file mode 100644 index 0000000..ce42d6a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/optimizers/optimizer.py @@ -0,0 +1,228 @@ +import six +import tensorflow as tf + +class Optimizer: + def __init__(self, config): + self.config = config + + def get_lbs_optimizer(self, opt): #TODO input is ( self, hyper_param ) + + # opt = LargeBatchSizeOptimizer(opt, weight_decay=self.config['weight_decay'], + # accum_dtype = self.config['dtype'], + # use_lars = self.config['use_lars'], + # bn_lr_scale = self.config.get('bn_lr_scale', 1.0) + # ) + opt = MixedPrecisionOptimizer(opt, self.config) + + return opt + +class MixedPrecisionOptimizer(tf.train.Optimizer): + """An optimizer that updates trainable variables in fp32.""" + + def __init__(self, optimizer, config): + super(MixedPrecisionOptimizer, self).__init__( + optimizer._use_locking, + optimizer._name + '-MP', + ) + self._optimizer = optimizer + self._config = config + loss_scale=self._config['loss_scale'] + self._loss_scale = float(loss_scale) + self._fp32_to_fp16 = {} + + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + with tf.device('/gpu:0'): + self.var_fp32_copy = [ tf.Variable( tf.cast(v.initialized_value(), tf.float32), + dtype=tf.float32, trainable=False, + collections=[tf.GraphKeys.GLOBAL_VARIABLES, "FP32_MASTER_COPIES"] ) for v in var_list ] + + def compute_gradients(self, loss, var_list=None, + gate_gradients=tf.train.Optimizer.GATE_OP, + aggregation_method=None, + colocate_gradients_with_ops=False, + grad_loss=None): + if var_list is None: + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + + if self._loss_scale != 1.0: + loss = tf.scalar_mul(self._loss_scale, loss) + + grads_and_vars_fp16 = self._optimizer.compute_gradients( + loss, var_list=var_list, + gate_gradients=gate_gradients, + aggregation_method=aggregation_method, + colocate_gradients_with_ops=colocate_gradients_with_ops, + grad_loss=grad_loss, + ) + # creating FP-32 variables and filling the fp32 dict + grads_and_vars_fp32 = [] + + with tf.variable_scope('FP32-master-copy'): + for i, (grad, var) in enumerate(grads_and_vars_fp16): + if grad is not None: + if var.dtype.base_dtype == tf.float16: + fp32_var = self.var_fp32_copy[i] + self._fp32_to_fp16[fp32_var.name] = var + fp32_grad = tf.cast(grad, tf.float32) + grads_and_vars_fp32.append((fp32_grad, fp32_var)) + else: + grads_and_vars_fp32.append((grad, var)) + else: + grads_and_vars_fp32.append((None, var)) + + grads_and_vars_fp32_rescaled = [ (g/self._loss_scale, v) for g,v in grads_and_vars_fp32 ] + + + return grads_and_vars_fp32_rescaled + + def apply_gradients(self, grads_and_vars, *args, **kwargs): + update_op = self._optimizer.apply_gradients(grads_and_vars, *args, **kwargs) + apply_ops = [] + with tf.control_dependencies([update_op]): + for grad, var in grads_and_vars: + if var.name in self._fp32_to_fp16: + dst_var = self._fp32_to_fp16[var.name] + apply_ops.append( + tf.assign(dst_var, tf.saturate_cast(var, tf.float16))) + if apply_ops: + return tf.group(apply_ops) + return update_op + + +class LargeBatchSizeOptimizer(tf.train.Optimizer): + """ LARC implementation + ------------------- + Parameters: + - optimizer: initial optimizer that you wanna apply + example: tf.train.MomentumOptimizer + - learning_rate: initial learning_rate from initial optimizer + - clip: if True apply LARC otherwise LARS + - epsilon: default value is weights or grads are 0. + - name + - use_locking + """ + + def __init__(self, optimizer, weight_decay, clip=True, epsilon=1., accum_dtype=tf.float16, use_lars=True, bn_lr_scale=1.0, + name="LarcOptimizer", use_locking=False): + super(LargeBatchSizeOptimizer, self).__init__( + name=name, use_locking=use_locking) + self._optimizer = optimizer + # self._learning_rate = learning_rate + self._weight_decay = weight_decay + self._clip = clip + self._epsilon = float(epsilon) + self._accum_dtype=accum_dtype + self._use_lars=use_lars + self._bn_lr_scale=bn_lr_scale + + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + with tf.device('/gpu:0'): + self._grads_accum = [ tf.Variable( tf.cast(tf.zeros_like(v.initialized_value()), self._accum_dtype), dtype=self._accum_dtype, trainable=False, collections=[tf.GraphKeys.LOCAL_VARIABLES] ) for v in var_list ] + + + def compute_gradients(self, *args, **kwargs): + return self._optimizer.compute_gradients(*args, **kwargs) + + + def apply_gradients(self, gradvars, loss_scale, *args, **kwargs): + + global_step = tf.train.get_global_step() + + grads_and_vars_clean = [] + for grad, var in gradvars: + if grad is not None: + grads_and_vars_clean.append( (grad, var) ) + + processed_grads_and_vars = self.post_process_grads(grads_and_vars_clean, loss_scale) # post_process_grads includes Lars + + def apply(): + red_grad_updates = self._optimizer.apply_gradients( processed_grads_and_vars, global_step=tf.train.get_global_step() ) + return tf.group(red_grad_updates) + + update_weight_op_1 = apply() + return update_weight_op_1 + + apply_gradients_op = update_weight_op_1 + + with tf.device('/cpu:0'): + #tf.summary.scalar('loss_scale', loss_scale) + for grad, var in gradvars: + g = grad / loss_scale + v_norm_2 = tf.norm(var, ord='euclidean') + g_norm_2 = tf.norm(g, ord='euclidean') + v_g_norm2_ratio = v_norm_2 / ( + g_norm_2 + self._weight_decay * v_norm_2) + if grad is not None: + if 'BatchNorm' in var.name: + with tf.name_scope('bn_norm2/'): + tf.summary.scalar(var.name + '/norm2', + v_norm_2) + with tf.name_scope('grad_bn_norm2/'): + tf.summary.scalar(var.name + '/grad_norm2', + g_norm_2) + with tf.name_scope('bn_ratio_var_grad/'): + tf.summary.scalar(var.name + '/ratio_var_grad', + v_g_norm2_ratio) + else: + with tf.name_scope('conv_norm2/'): + tf.summary.scalar(var.name + '/norm2', + v_norm_2) + with tf.name_scope('grad_conv_norm2/'): + tf.summary.scalar(var.name + '/grad_norm2', + g_norm_2) + with tf.name_scope('conv_ratio_var_grad/'): + tf.summary.scalar(var.name + '/ratio_var_grad', + v_g_norm2_ratio) + + return apply_gradients_op + + def post_process_grads(self, grads_and_vars, loss_scale): + + g_and_v_scaled = [] + for g, v in grads_and_vars: + g = g / loss_scale + g_and_v_scaled.append((g,v)) + + # Lars + if self._use_lars: + grad_var_list = [] + #-----------------------------------------------LARS and weight decay----------------------------------- + for g, var in g_and_v_scaled: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + grad_norm = tf.norm(g,ord='euclidean') + weight_norm = tf.norm(var,ord='euclidean') + + grad_norm_wd = tf.add( grad_norm, tf.multiply( self._weight_decay, weight_norm ) ) + rescale_factor = tf.div( tf.multiply(0.001, weight_norm), tf.add(grad_norm_wd, tf.constant(1e-5, tf.float32)) ) + + coeffi = tf.clip_by_value( rescale_factor, 0.001, 50.0 ) + decayed_g = tf.add( g, tf.multiply( self._weight_decay, var ) ) + + g = tf.multiply(coeffi, decayed_g) + else: + g = self._bn_lr_scale * g + + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + #-------------------------------------------LARS end--------------------------------- + return grad_var_list + else: + grad_var_list_without_lars = [] + #----------------------------------------weight decay----------------------------------- + for g, var in g_and_v_scaled: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + decayed_g = tf.add( g, tf.multiply( self._weight_decay, var ) ) + g = decayed_g + else: + g = self._bn_lr_scale * g + + g_and_v = ( g, var ) + grad_var_list_without_lars.append( g_and_v ) + + return grad_var_list_without_lars diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/2q b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/2q new file mode 100644 index 0000000..ef8c703 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/2q @@ -0,0 +1,172 @@ +import tensorflow as tf +import math +import time +from . import train_helper +from .train_helper import stage +from utils.logger import rank0log + +from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig +from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator +from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer + +class GPUBaseTrain(object): + def __init__(self, session, config, data, model, logger): + self.sess = session + self.config = config + self.data = data + self.model = model + self.logger = logger + self.print_logger = self.logger.logger + self.all_preds = [] + self.all_targets = [] + if self.config['accelerator'] == 'gpu': + self.classifier, self.training_hook = self.get_classifier() + else: + from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig + from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator + from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer + self.classifier, self.training_hook = self.get_npu_classifier() + + + + def get_classifier(self): + classifier = tf.estimator.Estimator( + model_fn=self.model.get_estimator_model_func, + model_dir=self.config['log_dir'], + config = tf.estimator.RunConfig( + session_config=self.sess.get_config(), + save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + keep_checkpoint_max=None + ) + ) + + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def get_npu_classifier(self): + session_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True) + + if self.config['debug'] : + run_config = NPURunConfig(enable_auto_mix_precision=True, enable_data_pre_proc=True, save_checkpoints_steps=112590, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop'], keep_checkpoint_max=5) + else : + run_config = NPURunConfig(enable_auto_mix_precision=True, save_summary_steps=0, log_step_count_steps=None, enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop']) +# run_config = NPURunConfig(enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir']) + + # classifier = tf.estimator.Estimator( + # model_fn=self.model.get_estimator_model_func, + # model_dir=self.config['log_dir'], + # config = tf.estimator.RunConfig( + # session_config=self.sess.get_config(), + # save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + # save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + # keep_checkpoint_max=None + # ) + # ) + + classifier =NPUEstimator( + model_fn= self.model.get_estimator_model_func, + config= run_config +# job_start_file='/tmp/config/deviceid_devindex_jobstart' + ) + + training_hooks = [] + if self.config['debug']: + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def train(self): + print ('training steps: %d' % self.config['nstep']) + self.classifier.train( input_fn=lambda:self.data.get_train_input_fn(), + # max_steps = self.config['max_train_steps'], + max_steps = self.config['nstep'], + #steps = 100, + hooks = self.training_hook + ) + + + def evaluate(self): + rank0log(self.print_logger, "Evaluating") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + try: + ckpts = train_helper.sort_and_load_ckpts(self.config['log_dir']) + for i, c in enumerate(ckpts): + if i < len(ckpts) - 1: + if i % self.config['eval_interval'] != 0: + continue + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['batch_size']))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + for i, c in enumerate(ckpts): + if 'top1' not in c: + continue + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + rank0log(self.print_logger, "Finished evaluation") + except KeyboardInterrupt: + self.print_logger.error("Keyboard interrupt") + + def train_and_evaluate(self): + success = False + epochs_between_evals = self.config.get('epochs_between_evals', 4) + + + for i in range(self.config['num_epochs'] // epochs_between_evals): + + rank0log(self.print_logger, "Starting a training cycle") + + self.classifier.train(input_fn=lambda:self.data.get_train_input_fn(), + steps = self.config['nsteps_per_epoch']*epochs_between_evals, + hooks = self.training_hook ) + + rank0log(self.print_logger, "Starting to evaluate") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + + ckpts = train_helper.sort_and_load_ckpts(self.config['log_dir']) + c = ckpts[-1] + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['batch_size'] * hvd.size()))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + if eval_result['val-top1acc']*100 > self.config.get('stop_threshold', 74.9): + success = True + break + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/gpu_base_trainer.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/gpu_base_trainer.py new file mode 100644 index 0000000..02b3e15 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/gpu_base_trainer.py @@ -0,0 +1,253 @@ +import os + +import sys +import tensorflow as tf +import math +import time +from . import train_helper +from .train_helper import stage +from utils.logger import rank0log +# add by zwx5326390 +from datetime import datetime +# import hwlog +from benchmark_log import hwlog + +#from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig +#from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator +#from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + +# remark_logger = hwlog.get_logger(__file__, "hw_Resnext50.log") +# file_name = hwlog.get_file_name(__file__) + +class GPUBaseTrain(object): + def __init__(self, session, config, data, model, logger): + self.sess = session + self.config = config + self.data = data + self.model = model + self.logger = logger + self.print_logger = self.logger.logger + self.all_preds = [] + self.all_targets = [] + + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("namespace:%s,time_ts:%s,event_type:benchmark_start" % (work_num, date_time)) + + if self.config['accelerator'] == 'gpu': + self.classifier, self.training_hook = self.get_classifier() + else: + #from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig + #from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator + #from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer + from npu_bridge.estimator.npu.npu_config import NPURunConfig + from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + self.classifier, self.training_hook = self.get_npu_classifier() + + + + def get_classifier(self): + classifier = tf.estimator.Estimator( + model_fn=self.model.get_estimator_model_func, + model_dir=self.config['log_dir'], + config = tf.estimator.RunConfig( + session_config=self.sess.get_config(), + save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + keep_checkpoint_max=None + ) + ) + + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def get_npu_classifier(self): + session_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True) + print (" config.debug:") + print ( self.config['debug']) + print (self.config['log_dir']) + if self.config['debug'] : + run_config = NPURunConfig(hcom_parallel=True, precision_mode='allow_mix_precision', enable_data_pre_proc=True, save_checkpoints_steps=112590, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop'], keep_checkpoint_max=5) + else : + run_config = NPURunConfig(hcom_parallel=True, precision_mode='allow_mix_precision', save_summary_steps=0, log_step_count_steps=None, enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop']) +# run_config = NPURunConfig(enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir']) + + # classifier = tf.estimator.Estimator( + # model_fn=self.model.get_estimator_model_func, + # model_dir=self.config['log_dir'], + # config = tf.estimator.RunConfig( + # session_config=self.sess.get_config(), + # save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + # save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + # keep_checkpoint_max=None + # ) + # ) + + classifier =NPUEstimator( + model_fn= self.model.get_estimator_model_func, + config= run_config +# job_start_file='/tmp/config/deviceid_devindex_jobstart' + ) + + training_hooks = [] + if self.config['debug']: + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def train(self): + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("nemespace:%s,time_ts:%s,event_type:epoch_start, num_train_epochs: %d" % ( \ + # work_num, date_time, self.config['num_epochs'])) + # date_time = hwlog.get_time() + # remark_logger.info("ABK time_ts: %s, current_epoch: %d, batch_size: %d, file: %s, lineno: %s" % \ + # (date_time, self.config['num_epochs'], self.config['batch_size'], file_name, + # sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=self.config['num_epochs']) + + print ('training steps: %d' % self.config['nstep']) + self.classifier.train( input_fn=lambda:self.data.get_train_input_fn(), + # max_steps = self.config['max_train_steps'], + max_steps = self.config['nstep'], + #steps = 100, + hooks = self.training_hook + ) + # hwlog.vlogger.info("namespace:%s,time_ts:%s,event_type:epoch_stop, num_train_epochs: %d" % ( \ + # work_num, date_time, self.config['num_epochs'])) + + def evaluate(self): + rank0log(self.print_logger, "Evaluating") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + try: + ckpts = train_helper.sort_and_load_ckpts(self.config['ckpt_dir']) + for i, c in enumerate(ckpts): + if i < len(ckpts) - 1: + if i % self.config['eval_interval'] != 0: + continue + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("namespace:%s, time_ts:%s, val-top1acc:%d, val-top5acc: %d" % ( + # work_num, date_time, eval_result.get("val-top1acc"), eval_result.get("val-top5acc") + # )) + # date_time = hwlog.get_time() + # remark_logger.info("ABK time_ts: %s, accuracy: %f, accuracy_top_5: %f, file: %s, lineno: %s" % \ + # (date_time, float(eval_result.get("val-top1acc")), + # float(eval_result.get("val-top5acc")), \ + # file_name, sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + + #c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['batch_size']))) + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['batch_size'] * self.config['rank_size']))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + for i, c in enumerate(ckpts): + if 'top1' not in c: + continue + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + rank0log(self.print_logger, "Finished evaluation") + except KeyboardInterrupt: + self.print_logger.error("Keyboard interrupt") + + def train_and_evaluate(self): + success = False + epochs_between_evals = self.config.get('epochs_between_evals', 4) + + + for i in range(self.config['num_epochs'] // epochs_between_evals): + + rank0log(self.print_logger, "Starting a training cycle") + + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("nemespace:%s,time_ts:%s,event_type:epoch_start, num_train_epochs: %d" % (\ + # work_num, date_time, self.config['num_epochs'])) + # date_time = hwlog.get_time() + # remark_logger.info("ABK time_ts: %s, current_epoch: %d, batch_size: %d, file: %s, lineno: %s" % \ + # (date_time, self.config['num_epochs'], self.config['batch_size'], file_name, + # sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=self.config['num_epochs']) + + self.classifier.train(input_fn=lambda:self.data.get_train_input_fn(), + steps = self.config['nsteps_per_epoch']*epochs_between_evals, + hooks = self.training_hook ) + + # hwlog.vlogger.info("namespace:%s,time_ts:%s,event_type:epoch_stop, num_train_epochs: %d" % ( \ + # work_num, date_time, self.config['num_epochs'])) + + rank0log(self.print_logger, "Starting to evaluate") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + + ckpts = train_helper.sort_and_load_ckpts(self.config['log_dir']) + c = ckpts[-1] + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("namespace:%s, time_ts:%s, val-top1acc:%d, val-top5acc: %d" % ( + # work_num, date_time, eval_result.get("val-top1acc"), eval_result.get("val-top5acc") + # )) + # date_time = hwlog.get_time() + # remark_logger.info("ABK time_ts: %s, accuracy: %f, accuracy_top_5: %f, file: %s, lineno: %s" % \ + # (date_time, float(eval_result.get("val-top1acc")), float(eval_result.get("val-top5acc")), \ + # file_name, sys._getframe().f_lineno)) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + + + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['batch_size'] * self.config['rank_size']))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + if eval_result['val-top1acc']*100 > self.config.get('stop_threshold', 74.9): + success = True + break + + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/train_helper.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/train_helper.py new file mode 100644 index 0000000..8d1fa8f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/trainers/train_helper.py @@ -0,0 +1,39 @@ +import tensorflow as tf +from tensorflow.python.ops import data_flow_ops +import re +import os +from operator import itemgetter + +class PrefillStagingAreasHook(tf.train.SessionRunHook): + def after_create_session(self, session, coord): + enqueue_ops = tf.get_collection('STAGING_AREA_PUTS') + for i in range(len(enqueue_ops)): + session.run(enqueue_ops[:i + 1]) + +def stage(tensors): + """Stages the given tensors in a StagingArea for asynchronous put/get. + """ + stage_area = data_flow_ops.StagingArea( + dtypes=[tensor.dtype for tensor in tensors], + shapes=[tensor.get_shape() for tensor in tensors]) + put_op = stage_area.put(tensors) + get_tensors = stage_area.get() + tf.add_to_collection('STAGING_AREA_PUTS', put_op) + return put_op, get_tensors + + +def sort_and_load_ckpts(log_dir): + ckpts = [] + for f in os.listdir(log_dir): + m = re.match(r'model.ckpt-([0-9]+).index', f) + if m is None: + continue + fullpath = os.path.join(log_dir, f) + ckpts.append({'step': int(m.group(1)), + 'path': os.path.splitext(fullpath)[0], + 'mtime': os.stat(fullpath).st_mtime, + }) + ckpts.sort(key=itemgetter('step')) + return ckpts + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/__init__.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/create_session.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/create_session.py new file mode 100644 index 0000000..86853d1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/create_session.py @@ -0,0 +1,48 @@ +import tensorflow as tf +import os,sys + +class CreateSession(): + def __init__(self, config): + self.config = config + + if self.config['accelerator'] == '1980': + from tensorflow.python.client import device_lib + #from tensorflow.contrib.offline_train.python import npu_ops + from npu_bridge.estimator import npu_ops + #self.estimator_config = tf.ConfigProto(allow_soft_placement=True, min_group_size=20, use_off_line=True) + self.estimator_config = tf.ConfigProto(allow_soft_placement=True) + custom_op = self.estimator_config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + custom_op.parameter_map["use_off_line"].b = True + custom_op.parameter_map["min_group_size"].b = 20 + else: + self.estimator_config = tf.ConfigProto(allow_soft_placement=False) + + self.estimator_config.gpu_options.allow_growth = True + + if self.config['accelerator'] == '1980': + local_device_protos = device_lib.list_local_devices(self.estimator_config) + + self.set_env() + + + def set_env(self): + # TODO, get env from config file + gpu_thread_count = 2 + os.environ['TF_GPU_THREAD_MODE'] = 'gpu_private' + os.environ['TF_GPU_THREAD_COUNT'] = str(gpu_thread_count) + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1' + + # barrier = self.hvd.allreduce(tf.constant(0, dtype=tf.float32)) + # tf.Session(config=self.estimator_config).run(barrier) + + + def get_config(self): + self.estimator_config.gpu_options.visible_device_list = str(0) +# self.estimator_config.gpu_options.force_gpu_compatible = True # Force pinned memory + self.estimator_config.intra_op_parallelism_threads = 1 # Avoid pool of Eigen threads + self.estimator_config.inter_op_parallelism_threads = 5 + return self.estimator_config + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/logger.py b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/logger.py new file mode 100644 index 0000000..07ede21 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/code/resnext50_train/utils/logger.py @@ -0,0 +1,103 @@ +from __future__ import print_function +import tensorflow as tf +import logging +import numpy as np +import time +import sys,os +from datetime import datetime +# import hwlog +# remark_logger = hwlog.get_logger(__file__, "hw_Resnext50.log") +# file_name = hwlog.get_file_name(__file__) +from benchmark_log import hwlog + +class LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, config, warmup_steps=5): + # def __init__(self, global_batch_size, num_records, display_every=10, logger=None): + self.global_batch_size = config['global_batch_size'] + self.iterations_per_loop = config['iterations_per_loop'] + self.warmup_steps = warmup_steps + self.iter_times = [] + self.num_records = config['num_training_samples'] + self.display_every = config['display_every'] + self.logger = get_logger(config['log_name'], config['log_dir']) + rank0log(self.logger, 'PY' + str(sys.version) + 'TF' + str(tf.__version__)) + + + + def after_create_session(self, session, coord): + rank0log(self.logger, 'Step Epoch Speed Loss FinLoss LR') + self.elapsed_secs = 0. + self.count = 0 + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=[tf.train.get_global_step(), 'loss:0', 'total_loss:0', 'learning_rate:0']) +# 'loss:0', 'loss:0', 'learning_rate:0']) + + def after_run(self, run_context, run_values): + batch_time = time.time() - self.t0 + self.iter_times.append(batch_time) + self.elapsed_secs += batch_time + self.count += 1 + global_step, loss, total_loss, lr = run_values.results + if global_step == 1 or global_step % self.display_every == 0: + dt = self.elapsed_secs / self.count + img_per_sec = self.global_batch_size * self.iterations_per_loop / dt + epoch = global_step * self.global_batch_size / self.num_records + self.logger.info('step:%6i epoch:%5.1f FPS:%7.1f loss:%6.3f total_loss:%6.3f lr:%7.7f' % + (global_step, epoch, img_per_sec, loss, total_loss, lr)) + self.elapsed_secs = 0. + self.count = 0 + # add by zwx5326390 + # work_num = "device " + str(os.environ.get("DEVICE_INDEX")) + # date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + # hwlog.vlogger.info("namespace:%s, time_ts:%s, FPS:%f, steps: %s" % (work_num, date_time, + # img_per_sec, + # global_step)) + # date_time = hwlog.get_time() + # remark_logger.info("ABK time_ts: %s, fps: %f, steps: %s, file: %s, lineno: %s" % \ + # (date_time, img_per_sec, global_step, file_name, \ + # sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.FPS, value='%7.1f'%img_per_sec) + + + def get_average_speed(self): + avg_time = np.mean(self.iter_times[self.warmup_steps:]) + speed = self.global_batch_size / avg_time + return speed + + + +def rank0log(logger, *args, **kwargs): + if logger: + logger.info(''.join([str(x) for x in list(args)])) + else: + print(*args, **kwargs) + + +def get_logger(log_name, log_dir): + logger = logging.getLogger(log_name) + logger.setLevel(logging.INFO) # INFO, ERROR + # file handler which logs debug messages + if not os.path.isdir(log_dir): + try: + os.makedirs(log_dir) + except FileExistsError: + # if log_dir is common for multiple ranks like on nfs + pass + # console handler + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + # add formatter to the handlers + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + formatter = logging.Formatter('%(message)s') + ch.setFormatter(formatter) + logger.addHandler(ch) + fh = logging.FileHandler(os.path.join(log_dir, log_name)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(formatter) + # add handlers to logger + logger.addHandler(fh) + return logger + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..cec6b14 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/hccl_sample.json @@ -0,0 +1,6 @@ +{ + "server_count": "1", + "server_list": [{"device":[{devices}],"server_id":"127.0.0.1"}], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/main_sample.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/main_sample.sh new file mode 100644 index 0000000..a43856f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/main_sample.sh @@ -0,0 +1,18 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +device_group=$@ +device_num=$# + +touch ${currentDir}/main.log + +for device_phy_id in ${device_group} +do + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train.sh ${device_phy_id} & " >> ${currentDir}/main.log + ${currentDir}/train.sh ${device_phy_id} & +done + +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train.sh exit " >> ${currentDir}/main.log diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..65ad3e2 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/npu_set_env.sh @@ -0,0 +1,41 @@ +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +#export RANK_SIZE={RANK_SIZE} +#export RANK_INDEX={RANK_INDEX} +#export RANK_ID={RANK_ID} + +# profiling env +export PROFILING_MODE={PROFILING_MODE} +export AICPU_PROFILING_MODE={AICPU_PROFILING_MODE} +export PROFILING_OPTIONS={PROFILING_OPTIONS} +export FP_POINT={FP_POINT} +export BP_POINT={BP_POINT} + + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/train_sample.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/train_sample.sh new file mode 100644 index 0000000..b4ee768 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/config/train_sample.sh @@ -0,0 +1,33 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +PWD=${currentDir} + +device_id=$1 +if [ x"${device_id}" = x ] ; +then + echo "turing train fail" >> ${currentDir}/train_${device_id}.log + exit +else + export DEVICE_ID=${device_id} +fi + +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +env > ${currentDir}/env_${device_id}.log + +#mkdir exec path +mkdir -p ${currentDir}/${device_id} +rm -rf ${currentDir}/${device_id}/* +cd ${currentDir}/${device_id} + +#start exec +python3.7 {RUN_ALGORITHM_CMD} {CHECKPOINT_DIR} > ${currentDir}/train_${device_id}.log 2>&1 +if [ $? -eq 0 ] ; +then + echo "turing train success" >> ${currentDir}/train_${device_id}.log +else + echo "turing train fail" >> ${currentDir}/train_${device_id}.log +fi diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/run.sh new file mode 100644 index 0000000..62a1b1f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/run.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +#export RANK_ID=npu${rank_size}p + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +data_url_new=`echo ${data_url//\//\\\\/}` +echo ${data_url} +echo ${max_steps} +echo ${epoches} +if [ x"${CLUSTER}" == x"True" ];then + jsonFilePath=${currentDir}/code/resnext50_train/configs/res50_32bs_8p.py +elif [ ${rank_size} -lt 8 ];then + jsonFilePath=${currentDir}/code/resnext50_train/configs/res50_32bs_1p.py + if [ ${rank_size} -eq 1 ];then + sed -i "0,/rank_size.*$/s//rank_size\': ${rank_size},/" ${jsonFilePath} + + elif [ ${rank_size} -eq 2 ];then + sed -i "0,/rank_size.*$/s//rank_size\': ${rank_size},/" ${jsonFilePath} + else + sed -i "0,/rank_size.*$/s//rank_size\': ${rank_size},/" ${jsonFilePath} + fi + +else + jsonFilePath=${currentDir}/code/resnext50_train/configs/res50_32bs_8p.py + if [ ${rank_size} -eq 8 ];then + sed -i "0,/rank_size.*$/s//rank_size\': ${rank_size},/" ${jsonFilePath} + else + rank_size=16 + sed -i "0,/rank_size.*$/s//rank_size\': ${rank_size},/" ${jsonFilePath} + fi +fi + +#echo "jsonfilepath is "${jsonFilePath} +sed -i "s/data_url.*$/data_url\': \'${data_url_new}\',/g" ${jsonFilePath} +#sed -i "s/max_train_steps.*$/max_train_steps\': ${max_steps},/g" ${jsonFilePath} +sed -i "s/num_epochs.*$/num_epochs\': ${epoches},/g" ${jsonFilePath} +sed -i "0,/batch_size.*$/s//batch_size\': ${batch_size},/" ${jsonFilePath} +sed -i "s/epochs_between_evals.*$/epochs_between_evals\': ${epochs_between_evals},/g" ${jsonFilePath} +sed -i 's/\r//g' ${jsonFilePath} + + +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 或大于等于 8p 时根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` +echo ${device_group_str} +echo ${first_device_id} + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/0/hw_resnext50.log ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$this_ip" != x"$ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/${first_device_id}/hw_resnext50.log ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id& + let rank_id++ + done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/train.sh new file mode 100644 index 0000000..b897c6f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ResNext50/tensorflow/scripts/train.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +mkdir -p ${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_resnext50/training_job_${currtime}/ + +source ${currentDir}/config/npu_set_env.sh + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# 声明变量 +export REMARK_LOG_FILE=hw_resnext50.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export YAML_PATH=$3 +export MODEL_CKPT_PATH=${currentDir}/result/ckpt${device_id} + +if [ ${profiling_mode} == True ]; +then + export PROFILING_MODE=true +else + export PROFILING_MODE=false +fi + +if [ ${aicpu_profiling_mode} == True ]; +then + export AICPU_PROFILING_MODE=true +else + export AICPU_PROFILING_MODE=false +fi + +export PROFILING_OPTIONS=${profiling_options} +export FP_POINT=${fp_point} +export BP_POINT=${bp_point} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` +#cd ${currentDir}/code +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + export CLUSTER=True + # 多卡多机 + rm -rf ${currentDir}/result/*.log + rm -rf ${currentDir}/code/core.* + python3.7 ${currentDir}/code/resnext50_train/mains/res50.py --config_file=res50_32bs_8p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=True --model_dir=${currentDir}/result/ckpt${device_id} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 4 ];then + # 单卡 + python3.7 ${currentDir}/code/resnext50_train/mains/res50.py --config_file=res50_32bs_1p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=False --model_dir=${currentDir}/result/ckpt${device_id} > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + python3.7 ${currentDir}/code/resnext50_train/mains/res50.py --config_file=res50_32bs_8p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=True --model_dir=${currentDir}/result/ckpt${device_id} > ${train_job_dir}/train_${device_id}.log 2>&1 +fi + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 resnext50 train success" + echo ":::ABK 1.0.0 resnext50 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnext50 train success" >> ${train_job_dir}/${device_id}/hw_resnext50.log +else + echo ":::ABK 1.0.0 resnext50 train failed" + echo ":::ABK 1.0.0 resnext50 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 resnext50 train failed" >> ${train_job_dir}/${device_id}/hw_resnext50.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ${hour}:${min}:${sec} +echo ":::ABK 1.0.0 resnext50 train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnext50.log + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/README.md b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/README.md new file mode 100644 index 0000000..11778d1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/README.md @@ -0,0 +1,40 @@ +# Resnet50_HC_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/Resnet50_HC.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: /home/imagenet_TF + epoches: 1 + epochs_between_evals: 1 + mode: train + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.154:8,90.90.176.54:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + + # 1. 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + # 2. 仅在小于 8p 时生效 + # 3. 若不使用该配置, 请使用在行首添加'#'注释的方法将其关闭 + # device_group: 0 1 2 3 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/pid b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/pid new file mode 100644 index 0000000..0d49bb1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/pid @@ -0,0 +1 @@ +13650 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_16p.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_16p.py new file mode 100644 index 0000000..9e3a47a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_16p.py @@ -0,0 +1,111 @@ +import tensorflow as tf + +import os +log_dir = 'ckpt/' + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 32, + 'shard': True, + + # ======= basic config ======= # + 'mode':'train', # "train","evaluate","train_and_evaluate" + 'epochs_between_evals': 4, #used if mode is "train_and_evaluate" + 'stop_threshold': 80.0, #used if mode is "train_and_evaluate" + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '{DATA_URL}', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': None, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':256, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "conv_bn_init" or "adv_bn_init",initializer the gamma in bn in different modes + # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== model architecture ========== + 'resnet_version': 'v1.5', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'linear', # "linear" or "cosine" + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 3.2, + + 'lr_decay_mode': 'cosine', # "steps", "poly", "poly_cycle", "cosine", "linear_cosine", "linear_twice", "constant" for 1980 only + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_1p.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_1p.py new file mode 100644 index 0000000..e2d07ef --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_1p.py @@ -0,0 +1,109 @@ +import tensorflow as tf + +import os +log_dir = 'ckpt/' + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 1, + 'shard': False, + + # ======= basic config ======= # + 'mode': 'train', + 'epochs_between_evals': 5, + 'stop_threshold': 80.0, #used if mode': 'train', + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '/home/mencai/training_shop-master/02-e2e/e2e_function/e2e_func_node/data/resnet50/imagenet_TF', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': 100, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':256, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== mode': 'train', + 'resnet_version': 'v1.5', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'train', + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 0.1, + + 'lr_decay_mode': 'train', + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_2p.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_2p.py new file mode 100644 index 0000000..7338e70 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_2p.py @@ -0,0 +1,109 @@ +import tensorflow as tf + +import os +log_dir = 'ckpt/' + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 2, + 'shard': True, + + # ======= basic config ======= # + 'mode': 'train', + 'epochs_between_evals': 5, + 'stop_threshold': 80.0, #used if mode': 'train', + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '/home/mencai/training_shop-master/02-e2e/e2e_function/e2e_func_node/data/resnet50/imagenet_TF', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': 100, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':256, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== mode': 'train', + 'resnet_version': 'v1.5', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'train', + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 0.1, + + 'lr_decay_mode': 'train', + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_4p.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_4p.py new file mode 100644 index 0000000..94e91ba --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_4p.py @@ -0,0 +1,109 @@ +import tensorflow as tf + +import os +log_dir = 'ckpt/' + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 4, + 'shard': True, + + # ======= basic config ======= # + 'mode': 'train', + 'epochs_between_evals': 5, + 'stop_threshold': 80.0, #used if mode': 'train', + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '/home/mencai/training_shop-master/02-e2e/e2e_function/e2e_func_node/data/resnet50/imagenet_TF', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': 100, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':256, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== mode': 'train', + 'resnet_version': 'v1.5', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'train', + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 0.1, + + 'lr_decay_mode': 'train', + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_8p.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_8p.py new file mode 100644 index 0000000..9163dc0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/configs/res50_256bs_8p.py @@ -0,0 +1,111 @@ +import tensorflow as tf + +import os +log_dir = 'ckpt/' + +#256 +config = { + # ============ for testing ===================== + 'accelerator': '1980', # 'gpu', '1980' + 'shuffle_enable': 'yes', + 'shuffle_buffer_size': 10000, + 'rank_size': 8, + 'shard': True, + + # ======= basic config ======= # + 'mode':'train', # "train","evaluate","train_and_evaluate" + 'epochs_between_evals': 4, #used if mode is "train_and_evaluate" + 'stop_threshold': 80.0, #used if mode is "train_and_evaluate" + #'data_dir':'/opt/npu/resnet_data_new', + 'data_url': '{DATA_URL}', + 'data_type': 'TFRECORD', + 'model_name': 'resnet50', + 'num_classes': 1001, + 'num_epochs': None, + 'height':224, + 'width':224, + 'dtype': tf.float32, + 'data_format': 'channels_last', + 'use_nesterov': True, + 'eval_interval': 1, + 'loss_scale': 1024, #could be float or string. If float, static loss scaling is applied. + #If string, the corresponding automatic loss scaling algorithm is used. + #Must be one of 'Backoff' of 'LogMax' (case insensitive). + 'use_lars': False, + 'label_smoothing':0.1, #If greater than 0 then smooth the labels. + 'weight_decay': 0.0001, + 'batch_size':256, #minibatch size per node, total batchsize = batch_size*hvd.size()*itersize + + 'momentum': [0.9], + + #======= data processing config ======= + 'min_object_covered': 0.1, #used for random crop + 'aspect_ratio_range':[3. / 4., 4. / 3.], + 'area_range':[0.16, 1.0], + 'max_attempts': 100, + + #======= data augment config ======= + 'increased_aug': False, + 'brightness':0.3, + 'saturation': 0.6, + 'contrast': 0.6, + 'hue': 0.13, + 'num_preproc_threads': 22, + + #======= initialization config ======= + 'conv_init': tf.variance_scaling_initializer(), + 'bn_init_mode': 'adv_bn_init', # "conv_bn_init" or "adv_bn_init",initializer the gamma in bn in different modes + # "adv_bn_init" means initialize gamma to 0 in each residual block's last bn, and initialize other gamma to 1 + # "conv_bn_init" means initialize all the gamma to a constant, defined by "bn_gamma_initial_value" + 'bn_gamma_initial_value': 1.0, + + #======== model architecture ========== + 'resnet_version': 'v1.5', + 'arch_type': 'original', # ------ input ------- + # C1,C2,C3: input block, stride in different layer + # ------ shortcut ------ + # D1: average_pooling + conv1*1 in shortcut in downsample block + # D2: conv3*3,stride=2 in shortcut in downsample block + # D3: conv1*1 +average_pooling in shortcut in downsample block + # ------ mainstream ---- + # E1: average_pooling + conv3*3 in mainstream in downsample block + # E2: conv3*3 + average_pooling in mainstream in downsample block + + #======= logger config ======= + 'display_every': 1, + 'log_name': 'resnet50.log', + 'log_dir': log_dir, + + #======= Learning Rate Config ======= + 'lr_warmup_mode': 'linear', # "linear" or "cosine" + 'warmup_lr': 0.0, + 'warmup_epochs': 10, + 'learning_rate_maximum': 0.8, + + 'lr_decay_mode': 'cosine', # "steps", "poly", "poly_cycle", "cosine", "linear_cosine", "linear_twice", "constant" for 1980 only + 'learning_rate_end': 0.00001, + + 'decay_steps': '10,20,30', #for "steps" + 'lr_decay_steps': '6.4,0.64,0.064', + + 'ploy_power': 2.0, #for "poly" and "poly_cycle" + + 'cdr_first_decay_ratio': 0.33, #for "cosine_decay_restarts" + 'cdr_t_mul':2.0, + 'cdr_m_mul':0.1, + + 'lc_periods':0.47, #for "linear_consine" + 'lc_beta':0.00001, + + 'lr_mid': 0.5, #for "linear_twice" + 'epoch_mid': 80, + + 'bn_lr_scale':1.0, + + } + +def res50_config(): + config['global_batch_size'] = config['batch_size'] * config['rank_size'] + config['do_checkpoint'] = True + + return config diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/data_loader.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/data_loader.py new file mode 100644 index 0000000..5d5285e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/data_loader.py @@ -0,0 +1,237 @@ +import numpy as np +from . import preprocessing +import tensorflow as tf +from tensorflow.python.util import nest +import os,sys +import numpy as np +sys.path.append("..") +from trainers.train_helper import stage + +class DataLoader: + + def __init__(self, config): + self.config = config + + num_training_samples = 1281167 + #num_evaluating_samples = get_num_records(self.eval_filenames) + self.config['num_training_samples'] = num_training_samples + self.config['num_evaluating_samples'] = 50000 + print( 'total num_training_sampels: %d' % num_training_samples ) + + self.training_samples_per_rank = num_training_samples + + + def get_train_input_fn_synthetic(self): + batch_size = self.config['batch_size'] + input_shape = [self.config['height'], self.config['width'], 3] + input_element = nest.map_structure(lambda s: tf.constant(0.5, tf.float32, s), tf.TensorShape(input_shape)) + label_element = nest.map_structure(lambda s: tf.constant(1, tf.int32, s), tf.TensorShape([1])) + element = (input_element, label_element) + ds = tf.data.Dataset.from_tensors(element).repeat() + ds = ds.batch(batch_size) + return ds + + def get_train_input_fn(self): + # filenames = self.train_filenames + filenames = None + take_count = self.training_samples_per_rank + batch_size = self.config['batch_size'] + height = self.config['height'] + width = self.config['width'] + brightness = self.config['brightness'] + contrast = self.config['contrast'] + saturation = self.config['saturation'] + hue = self.config['hue'] + num_threads = self.config['num_preproc_threads'] + increased_aug = self.config['increased_aug'] + shard = self.config['shard'] + + return make_dataset(self.config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=True, num_threads=num_threads, nsummary=10, shard=shard, synthetic=False, + increased_aug=increased_aug ) + + def get_eval_input_fn(self): + # filenames = self.eval_filenames + filenames = None + # take_count = get_num_records(self.eval_filenames) + take_count = 50000 + batch_size = self.config['batch_size'] + height = self.config['height'] + width = self.config['width'] + brightness = self.config['brightness'] + contrast = self.config['contrast'] + saturation = self.config['saturation'] + hue = self.config['hue'] + num_threads = self.config['num_preproc_threads'] + shard = self.config['shard'] + + return make_dataset(self.config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=False, num_threads=num_threads, nsummary=10, shard=shard, synthetic=False, + increased_aug=False) + + def get_input_pipeline_op(self, inputs, labels, mode): + with tf.device('/cpu:0'): + preload_op, (inputs, labels) = stage([inputs, labels]) + + with tf.device('/gpu:0'): + gpucopy_op, (inputs, labels) = stage([inputs, labels]) + return preload_op, gpucopy_op, inputs, labels + + def normalize_and_format(self, inputs, data_format): + + dataset_mean = np.array([121, 115, 100], dtype=np.float32) + dataset_std = np.array([70, 68, 71], dtype=np.float32) + inputs = tf.subtract(inputs, dataset_mean) + inputs = tf.multiply(inputs, 1. / dataset_std) + if data_format == 'channels_first': + inputs = tf.transpose(inputs, [0, 3, 1, 2]) + return inputs + + + + +#-------------------------------- Funcs ----------------------------------- +def get_num_records(filenames): + def count_records(tf_record_filename): + count = 0 + for _ in tf.python_io.tf_record_iterator(tf_record_filename): + count += 1 + return count + + nfile = len(filenames) + return (count_records(filenames[0]) * (nfile - 1) + + count_records(filenames[-1])) + +def _parse_example_proto(example_serialized): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.FixedLenFeature([], dtype=tf.int64, default_value=-1), + 'image/class/text': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.parse_single_example(example_serialized, feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(bbox, [0, 2, 1]) + + return features['image/encoded'], label, bbox + +def parse_record(raw_record): + image_buffer, label, bbox = _parse_example_proto(raw_record) + # for 1980 only + config={'min_object_covered': 0.1, 'aspect_ratio_range': [3. / 4., 4. / 3.], 'area_range': [0.16, 1.0], 'max_attempts': 100} + image = preprocessing.parse_and_preprocess_image_record( + config, image_buffer, height=224, width=224, + brightness=0.3, contrast=0.6, saturation=0.6, hue=0.13, + distort=True, nsummary=10, increased_aug=False, random_search_aug=False) + return image, label + +def read_rawdata(file_path_tensor): + def _read_file(file_path): + image = tf.gfile.GFile(file_path, 'rb').read() + return image + return tf.py_func(_read_file, inp=[file_path_tensor], Tout=tf.string) + +def parse_function(filename, label): + image = read_rawdata(filename) + image_decoded = tf.image.decode_jpeg(image, channels=3) + image_resized = tf.image.resize_images(image_decoded, [224, 224]) + # 7.3,raw默认格式为int64,目前resnet50只支持int32,下沉前不影响,下沉后,没有增加该转换算子,影响性能考虑。 + label = tf.cast(label, dtype=tf.int32) + return image_resized, label + +def parse_record1(image, label): + image = preprocessing.split_device(image) + return image, label + +def make_dataset(config, filenames, take_count, batch_size, height, width, + brightness, contrast, saturation, hue, + training=False, num_threads=10, nsummary=10, shard=False, synthetic=False, + increased_aug=False, random_search_aug=False): + if synthetic and training: + input_shape = [height, width, 3] + input_element = nest.map_structure(lambda s: tf.constant(0.5, tf.float32, s), tf.TensorShape(input_shape)) + label_element = nest.map_structure(lambda s: tf.constant(1, tf.int32, s), tf.TensorShape([1])) + element = (input_element, label_element) + ds = tf.data.Dataset.from_tensors(element).repeat() + ds = ds.batch(batch_size) + return ds + else: + shuffle_buffer_size = 10000 + num_readers = 10 + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('DEVICE_INDEX')) + + if config['data_type'] == 'RAW DATA': + images = [] + labels = [] + with tf.gfile.GFile(config['label_index_url'], 'r') as f: + for line in f.readlines(): + tmp_list = line.strip().split(" ") + image_file = os.path.join(config['data_url'], tmp_list[0]) + #image_raw = tf.gfile.GFile(image_file, 'rb').read() + #images.append(image_raw) + images.append(image_file) + labels.append(int(tmp_list[-1])) + + #images = tf.convert_to_tensor(images, dtype=tf.string) + #labels = tf.convert_to_tensor(labels, dtype=tf.int32) + ds = tf.data.Dataset.from_tensor_slices((images, labels)) + else: + filename_pattern = os.path.join(config['data_url'], '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'train')) + ds = tf.data.Dataset.from_tensor_slices(filenames) + + if shard: + # split the dataset into parts for each GPU + ds = ds.shard(rank_size, rank_id) + + if not training: + ds = ds.take(take_count) # make sure all ranks have the same amount + + if training: + ds = ds.shuffle(1000, seed=7 * (1 + rank_id)) + + if config['data_type'] == 'TFRECORD': + ds = ds.interleave(tf.data.TFRecordDataset, cycle_length=num_readers, block_length=1) + counter = tf.data.Dataset.range(sys.maxsize) + ds = tf.data.Dataset.zip((ds, counter)) + + if training: + ds = ds.apply(tf.data.experimental.shuffle_and_repeat(shuffle_buffer_size, seed=5*(1+rank_id))) + + if config['data_type'] == 'RAW DATA': + ds = ds.map(lambda image, label: parse_function(image, label), num_parallel_calls=14) + else: + #ds = ds.map(lambda image, label: parse_record(image), num_parallel_calls=192) + #ds = ds.prefetch(buffer_size=tf.contrib.data.AUTOTUNE) + #ds = ds.map(lambda image, label: parse_record1(image, label), num_parallel_calls=14) + ds = ds.map(lambda image, label: parse_record(image), num_parallel_calls=192) + #ds = ds.prefetch(10) + ds = ds.batch(batch_size, drop_remainder=True) + ds = ds.prefetch(buffer_size=tf.contrib.data.AUTOTUNE) + return ds + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/preprocessing.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/preprocessing.py new file mode 100644 index 0000000..9486a81 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/data_loader/resnet50/preprocessing.py @@ -0,0 +1,160 @@ +import tensorflow as tf +#import horovod.tensorflow as hvd +from tensorflow.contrib.image.python.ops import distort_image_ops +import math +#from .data_aug_search import random_aug_search + + + +def deserialize_image_record(record): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], tf.string, ''), + 'image/class/label': tf.FixedLenFeature([1], tf.int64, -1), + 'image/class/text': tf.FixedLenFeature([], tf.string, ''), + 'image/object/bbox/xmin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymin': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/xmax': tf.VarLenFeature(dtype=tf.float32), + 'image/object/bbox/ymax': tf.VarLenFeature(dtype=tf.float32) + } + with tf.name_scope('deserialize_image_record'): + obj = tf.parse_single_example(record, feature_map) + imgdata = obj['image/encoded'] + label = tf.cast(obj['image/class/label'], tf.int32) + bbox = tf.stack([obj['image/object/bbox/%s' % x].values + for x in ['ymin', 'xmin', 'ymax', 'xmax']]) + bbox = tf.transpose(tf.expand_dims(bbox, 0), [0, 2, 1]) + text = obj['image/class/text'] + return imgdata, label, bbox, text + +def decode_jpeg(imgdata, channels=3): + return tf.image.decode_jpeg(imgdata, channels=channels, + fancy_upscaling=False, + dct_method='INTEGER_FAST') + + +def crop_and_resize_image(config, image, height, width, + distort=False, nsummary=10): + with tf.name_scope('crop_and_resize'): + # Evaluation is done on a center-crop of this ratio + eval_crop_ratio = 0.8 + if distort: + # crop_window = tf.stack( [0, 0, 7, 7] ) + # image = tf.image.decode_and_crop_jpeg( image, crop_window, channels=3 ) + # image = tf.image.resize_images( image, [height, width] ) + initial_shape = [int(round(height / eval_crop_ratio)), + int(round(width / eval_crop_ratio)), + 3] + jpeg_shape = tf.image.extract_jpeg_shape( image ) + + bbox_begin, bbox_size, bbox = \ + tf.image.sample_distorted_bounding_box( + initial_shape, + bounding_boxes=tf.constant([0.0, 0.0, 1.0, 1.0], dtype=tf.float32, shape=[1, 1, 4]), + # tf.zeros(shape=[1,0,4]), # No bounding boxes + min_object_covered=config['min_object_covered'], + aspect_ratio_range=config['aspect_ratio_range'], + area_range=config['area_range'], + max_attempts=config['max_attempts'], + # seed=11 , # Need to set for deterministic results + use_image_if_no_bounding_boxes=True) + bbox = bbox[0, 0] # Remove batch, box_idx dims + + # offset_y, offset_x, _ = tf.unstack(bbox_begin) + # target_height, target_width, _ = tf.unstack( bbox_size ) + # + + + + + # offset_y = tf.minimum( offset_y, jpeg_shape[0] - 1 ) + # offset_x = tf.minimum( offset_x, jpeg_shape[1] - 1 ) + + # target_height, target_width, _ = tf.unstack( bbox_size ) + # new_height = tf.maximum( tf.minimum( offset_y + target_height, jpeg_shape[0] ) - offset_y, 0 ) + # new_width = tf.maximum( tf.minimum( offset_x + target_width, jpeg_shape[1] ) - offset_x, 0 ) + + y_min = tf.cast( bbox[0] * (tf.cast( jpeg_shape[0], tf.float32) ), tf.int32) + x_min = tf.cast( bbox[1] * (tf.cast(jpeg_shape[1], tf.float32) ), tf.int32) + y_max = tf.cast( bbox[2] * (tf.cast(jpeg_shape[0], tf.float32) ), tf.int32) + x_max = tf.cast( bbox[3] * (tf.cast(jpeg_shape[1], tf.float32) ), tf.int32) + + crop_height = y_max - y_min + crop_width = x_max - x_min + # crop_window = tf.stack( [offset_y, offset_x, new_height, new_width] ) + crop_window = tf.stack( [y_min, x_min, crop_height, crop_width] ) + image = tf.image.decode_and_crop_jpeg( image, crop_window, channels=3 ) + image = tf.image.resize_images( image, [height, width] ) + + + # def func_decode_and_crop(image): + # image = tf.image.decode_and_crop_jpeg( image, crop_window, channels=3 ) + # image = tf.image.resize_images( image, [height, width] ) + # return image + + # def func_crop_and_resize(image): + # image = decode_jpeg(image, channels=3) + # image = tf.image.crop_and_resize( + # image[None, :, :, :], bbox[None, :], [0], [height, width])[0] + # return image + + + # condtion_1 = tf.logical_and( tf.less(target_height, jpeg_shape[0]), tf.less( target_width, jpeg_shape[1] ) ) + # condtion_2 = tf.logical_and( tf.less(target_height + offset_y, jpeg_shape[0]), tf.less( target_width + offset_x, jpeg_shape[1] ) ) + + # image = tf.cond( tf.logical_and( condtion_1, condtion_2 ), lambda:func_decode_and_crop(image), lambda:func_crop_and_resize(image) ) + + + else: + # Central crop + + image = decode_jpeg(image, channels=3) + ratio_y = ratio_x = eval_crop_ratio + bbox = tf.constant([0.5 * (1 - ratio_y), 0.5 * (1 - ratio_x), + 0.5 * (1 + ratio_y), 0.5 * (1 + ratio_x)]) + image = tf.image.crop_and_resize( + image[None, :, :, :], bbox[None, :], [0], [height, width])[0] + + return image + + +def parse_and_preprocess_image_record(config, record, height, width, + brightness, contrast, saturation, hue, + distort, nsummary=10, increased_aug=False, random_search_aug=False): + #imgdata, label, bbox, text = deserialize_image_record(record) + #label -= 1 # Change to 0-based (don't use background class) + with tf.name_scope('preprocess_train'): + image = crop_and_resize_image(config, record, height, width, distort) + if distort: + image = tf.image.random_flip_left_right(image) + if increased_aug: + image = tf.image.random_brightness(image, max_delta=brightness) + image = distort_image_ops.random_hsv_in_yiq(image, + lower_saturation=saturation, + upper_saturation=2.0 - saturation, + max_delta_hue=hue * math.pi) + image = tf.image.random_contrast(image, lower=contrast, upper=2.0 - contrast) + tf.summary.image('distorted_color_image', tf.expand_dims(image, 0)) + +# image = tf.clip_by_value(image, 0., 255.) + #image = tf.cast(image, tf.uint8) + # if random_search_aug: + # image = random_aug_search(image) +# image = normalize(image) +# image = tf.cast(image, tf.float16) + return image +def normalize(inputs): + dataset_mean = [121.0, 115.0, 100.0] #np.array([121, 115, 100], dtype=np.float32) + dataset_std = [70.0, 68.0, 71.0] #np.array([70, 68, 71], dtype=np.float32) + dataset_mean = tf.expand_dims(tf.expand_dims(dataset_mean, 0), 0) + dataset_std = tf.expand_dims(tf.expand_dims(dataset_std, 0), 0) + inputs = inputs - dataset_mean #tf.subtract(inputs, dataset_mean) + inputs = inputs * (1.0 / dataset_std) + #inputs = tf.multiply(inputs, 1. / dataset_std) + + return inputs + +def split_device(image): + image = tf.clip_by_value(image, 0., 255.) + image = normalize(image) + image = tf.cast(image, tf.float16) + return image diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/hyper_param.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/hyper_param.py new file mode 100644 index 0000000..eed8743 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/hyper_param.py @@ -0,0 +1,50 @@ +import tensorflow as tf +from .lr_schedule import warmup_decay, get_lr, get_1980_lr + + +class HyperParams: + def __init__(self, config): + self.config=config + nsteps_per_epoch = self.config['num_training_samples'] // self.config['global_batch_size'] + self.config['nsteps_per_epoch'] = nsteps_per_epoch + # nstep = self.config['num_training_samples'] * self.config['num_epochs'] // self.config['global_batch_size'] + if self.config['num_epochs']: + nstep = nsteps_per_epoch * self.config['num_epochs'] #------calculate nsteps in a different way------ + else: + nstep = self.config['max_train_steps'] + self.config['nstep'] = nstep + + self.config['total_steps_include_iterations'] = int( self.config['nstep'] + self.config['iterations_per_loop']) + self.config['save_summary_steps'] = nsteps_per_epoch + self.config['save_checkpoints_steps'] = nsteps_per_epoch + + + def get_hyper_params(self): + hyper_params = {} + hyper_params['learning_rate'] = self.get_learning_rate() + + return hyper_params + + + def get_learning_rate(self): + global_step = tf.train.get_global_step() + nsteps_per_epoch = self.config['nsteps_per_epoch'] + + warmup_lr = self.config['warmup_lr'] + lr = self.config['learning_rate_maximum'] + lr_end = self.config['learning_rate_end'] + lr_decay_mode = self.config['lr_decay_mode'] + + + + with tf.device('/cpu:0'): # Allow fallback to CPU if no GPU support for these ops + + if lr_decay_mode == 'constant' or self.config['num_epochs'] == None: + learning_rate = tf.constant(lr, tf.float32) + else: + learning_rate = get_1980_lr(self.config, global_step, warmup_lr, lr_end, lr, self.config['warmup_epochs'], nsteps_per_epoch, self.config['nstep'], lr_decay_mode ) + + learning_rate = tf.identity(learning_rate, 'learning_rate') + return learning_rate + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule.py new file mode 100644 index 0000000..37103e9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule.py @@ -0,0 +1,168 @@ +import tensorflow as tf +import numpy as np + +def get_lr(lr, lr_end, lr_decay_mode, warmup_it, decay_steps, global_step, steps, lr_steps, ploy_power, + cdr_first_decay_ratio, cdr_t_mul, cdr_m_mul, cdr_alpha, cd_alpha, lc_periods, lc_alpha, lc_beta, lr_mid, it_mid): + if lr_decay_mode == 'steps': + learning_rate = tf.train.piecewise_constant(global_step, + steps, lr_steps) + elif lr_decay_mode == 'poly' or lr_decay_mode == 'poly_cycle': + cycle = lr_decay_mode == 'poly_cycle' + learning_rate = tf.train.polynomial_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + end_learning_rate=lr_end, + power=ploy_power, + cycle=cycle) + elif lr_decay_mode == 'cosine_decay_restarts': + learning_rate = tf.train.cosine_decay_restarts(lr, + global_step - warmup_it, + (decay_steps - warmup_it) * cdr_first_decay_ratio, + t_mul=cdr_t_mul, + m_mul=cdr_m_mul, + alpha=cdr_alpha) + elif lr_decay_mode == 'cosine': + learning_rate = tf.train.cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + alpha=cd_alpha) + elif lr_decay_mode == 'linear_cosine': + learning_rate = tf.train.linear_cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + num_periods=lc_periods,#0.47, + alpha=lc_alpha,#0.0, + beta=lc_beta)#0.00001) + elif lr_decay_mode == 'linear_twice': + learning_rate = decay_linear_twice(lr, lr_mid, lr_end, warmup_it, it_mid, decay_steps, global_step ) + + else: + raise ValueError('Invalid type of lr_decay_mode') + return learning_rate + + +def cos_warmup_1980( global_step, warmup_steps, max_lr ): + PI = 3.14159265359 + ang = PI + PI * ( float(global_step+1) / float(warmup_steps) ) + offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + return offset + +def cos_decay_1980( global_step, warmup_steps, total_steps, max_lr ): + PI = 3.14159265359 + ang = PI * ( float(global_step - warmup_steps+1) / float(total_steps - warmup_steps) ) + offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + return offset + + +def get_1980_lr(config, global_step, lr_init, lr_end, lr_max, warmup_epochs, steps_per_epoch, nsteps, lr_decay_mode): + lr_each_step = [] + + if lr_decay_mode == 'steps': + decay_epoch_index = [30 * steps_per_epoch,60 * steps_per_epoch,80 * steps_per_epoch] + total_steps = int(nsteps) + for i in range(total_steps): + if i < decay_epoch_index[0]: + lr = lr_max + elif i < decay_epoch_index[1]: + lr = lr_max * 0.1 + elif i < decay_epoch_index[2]: + lr = lr_max * 0.01 + else: + lr = lr_max * 0.001 + lr_each_step.append(lr) + elif lr_decay_mode == 'poly': + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + for i in range( config['total_steps_include_iterations'] ): + if i <= warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + elif i < total_steps: + base = ( 1.0 - (float(i)-float(warmup_steps))/(float(total_steps)-float(warmup_steps)) ) + lr = float(lr_max) * base + else: + lr = 0.0 + lr_each_step.append(lr) + + elif lr_decay_mode == 'cosine': + total_steps = int(nsteps) + + warmup_steps = steps_per_epoch * warmup_epochs + for i in range( config['total_steps_include_iterations'] ): + if i <= warmup_steps: + lr = cos_warmup_1980( i, warmup_steps, lr_max ) + elif i < total_steps: + lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ) + else: + lr = 0.0 + lr_each_step.append(lr) + elif lr_decay_mode == 'linear_cosine': + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + for i in range( config['total_steps_include_iterations'] ): + if i <= warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + elif i < total_steps: + lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ) + else: + lr = 0.0 + lr_each_step.append(lr) + else: + total_steps = int(nsteps) + warmup_steps = steps_per_epoch * warmup_epochs + for i in range(total_steps): + if i <= warmup_steps: + lr = lr_init + (lr_max - lr_init) * i / warmup_steps + else: + lr = lr_max - ( lr_max - lr_end ) * (i - warmup_steps) / (total_steps - warmup_steps) + lr_each_step.append( lr ) + + # current_step = tf.to_int32( tf.cast(global_step,tf.float32) / float(steps_per_epoch) ) + current_step = global_step + lr_each_step = tf.convert_to_tensor( lr_each_step ) + print (lr_each_step) + learning_rate = tf.gather( lr_each_step, current_step ) + + return learning_rate + +def warmup_decay(lr_warmup_mode, warmup_lr, global_step, warmup_steps, warmup_end_lr): + if lr_warmup_mode == 'linear': + learning_rate = linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + elif lr_warmup_mode == 'cosine': + learning_rate = cos_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + else: + raise ValueError('Invalid type of lr_warmup_mode') + return learning_rate + + +def linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr): + from tensorflow.python.ops import math_ops + p = tf.cast(global_step, tf.float32) / tf.cast(warmup_steps, tf.float32) + diff = math_ops.subtract(warmup_end_lr, warmup_lr) + res = math_ops.add(warmup_lr, math_ops.multiply(diff, p)) + return res + +def cos_warmup( warmup_lr, global_step, warmup_steps, warmup_end_lr ): + PI = 3.14159265359 + diff = tf.subtract( warmup_end_lr, warmup_lr ) + ang = PI + PI * ( tf.cast( global_step, tf.float32 ) / tf.cast( warmup_steps,tf.float32 )) + offset = diff * 0.5 * ( 1.0 + tf.math.cos( ang ) ) + res = tf.add( warmup_lr, offset ) + return res + + +def decay_linear( lr_start, lr_end, it_start, it_end, global_step ): + down_steps = it_end - it_start + down_range = lr_start - lr_end + down_per_step = float( down_range ) / float( down_steps ) + res = tf.subtract( tf.cast(lr_start, tf.float32), tf.multiply( tf.cast(down_per_step, tf.float32), tf.subtract(tf.cast(global_step, tf.float32), tf.cast(it_start, tf.float32) )) ) + return res + +def decay_linear_twice(lr_start, lr_mid, lr_end, it_start, it_mid, it_end, global_step ): + learning_rate = tf.cond( global_step < it_start, lambda: tf.cast(lr_start, tf.float32), lambda: decay_linear(lr_start, lr_mid, it_start, it_mid, global_step)) + learning_rate = tf.cond( global_step > it_mid, lambda: decay_linear(lr_mid, lr_end, it_mid, it_end, global_step) , lambda: learning_rate ) + return learning_rate + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule_0907_back.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule_0907_back.py new file mode 100644 index 0000000..126efc8 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/hyper_param/lr_schedule_0907_back.py @@ -0,0 +1,169 @@ +import tensorflow as tf +import numpy as np + +def get_lr(lr, lr_end, lr_decay_mode, warmup_it, decay_steps, global_step, steps, lr_steps, ploy_power, + cdr_first_decay_ratio, cdr_t_mul, cdr_m_mul, cdr_alpha, cd_alpha, lc_periods, lc_alpha, lc_beta, lr_mid, it_mid): + if lr_decay_mode == 'steps': + learning_rate = tf.train.piecewise_constant(global_step, + steps, lr_steps) + elif lr_decay_mode == 'poly' or lr_decay_mode == 'poly_cycle': + cycle = lr_decay_mode == 'poly_cycle' + learning_rate = tf.train.polynomial_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + end_learning_rate=lr_end, + power=ploy_power, + cycle=cycle) + elif lr_decay_mode == 'cosine_decay_restarts': + learning_rate = tf.train.cosine_decay_restarts(lr, + global_step - warmup_it, + (decay_steps - warmup_it) * cdr_first_decay_ratio, + t_mul=cdr_t_mul, + m_mul=cdr_m_mul, + alpha=cdr_alpha) + elif lr_decay_mode == 'cosine': + learning_rate = tf.train.cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + alpha=cd_alpha) + elif lr_decay_mode == 'linear_cosine': + learning_rate = tf.train.linear_cosine_decay(lr, + global_step - warmup_it, + decay_steps=decay_steps - warmup_it, + num_periods=lc_periods,#0.47, + alpha=lc_alpha,#0.0, + beta=lc_beta)#0.00001) + elif lr_decay_mode == 'linear_twice': + learning_rate = decay_linear_twice(lr, lr_mid, lr_end, warmup_it, it_mid, decay_steps, global_step ) + + else: + raise ValueError('Invalid type of lr_decay_mode') + return learning_rate + + +def cos_warmup_1980( global_step, warmup_steps, max_lr ): + PI = 3.14159265359 + ang = PI + PI * ( float(global_step) / float(warmup_steps) ) + offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + return offset + +def cos_decay_1980( global_step, warmup_steps, total_steps, max_lr ): + PI = 3.14159265359 + ang = PI * ( float(global_step - warmup_steps) / float(total_steps - warmup_steps) ) + offset = max_lr * 0.5*( 1.0 + np.cos( ang ) ) + return offset + + +def get_1980_lr(config, global_step, lr_init, lr_end, lr_max, warmup_epochs, total_epochs, steps_per_epoch, lr_decay_mode): + lr_each_step = [] + + if lr_decay_mode == 'steps': + decay_epoch_index = [30 * steps_per_epoch,60 * steps_per_epoch,80 * steps_per_epoch] + total_steps = int(steps_per_epoch * total_epochs) + # total_steps = total_epochs + for i in range(total_steps): + if i < decay_epoch_index[0]: + lr = lr_max + elif i < decay_epoch_index[1]: + lr = lr_max * 0.1 + elif i < decay_epoch_index[2]: + lr = lr_max * 0.01 + else: + lr = lr_max * 0.001 + lr_each_step.append(lr) + elif lr_decay_mode == 'poly': + total_steps = int(steps_per_epoch * total_epochs) + warmup_steps = steps_per_epoch * warmup_epochs + inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + for i in range( config['total_steps_include_iterations'] ): + if i < warmup_steps: + lr = float(lr_init) + inc_each_step * float(i) + elif i <= total_steps: + base = ( 1.0 - (float(i)-float(warmup_steps))/(float(total_steps)-float(warmup_steps)) ) + lr = float(lr_max) * base + else: + lr = 0.0 + lr_each_step.append(lr) + + elif lr_decay_mode == 'cosine': + total_steps = int(steps_per_epoch * total_epochs) + + warmup_steps = steps_per_epoch * warmup_epochs + for i in range( config['total_steps_include_iterations'] ): + if i < warmup_steps: + lr = cos_warmup_1980( i, warmup_steps, lr_max ) + elif i <= total_steps: + lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ) + else: + lr = 0.0 + lr_each_step.append(lr) + # elif lr_decay_mode == 'linear_cosine': + # total_steps = int(steps_per_epoch * total_epochs) + # warmup_steps = steps_per_epoch * warmup_epochs + # inc_each_step = ( float(lr_max) - float(lr_init) ) / float(warmup_steps) + # for i in range( config['total_steps_include_iterations'] ): + # if i < warmup_steps: + # lr = float(lr_init) + inc_each_step * float(i) + # elif i <= total_steps: + # lr = cos_decay_1980( i, warmup_steps, total_steps, lr_max ) + # else: + # lr = 0.0 + # lr_each_step.append(lr) + else: + total_steps = steps_per_epoch * total_epochs + warmup_steps = steps_per_epoch * warmup_epochs + for i in range(total_steps): + if i < warmup_steps: + lr = lr_init + (lr_max - lr_init) * i / warmup_steps + else: + lr = lr_max - ( lr_max - lr_end ) * (i - warmup_steps) / (total_steps - warmup_steps) + lr_each_step.append( lr ) + + # current_step = tf.to_int32( tf.cast(global_step,tf.float32) / float(steps_per_epoch) ) + current_step = global_step + lr_each_step = tf.convert_to_tensor( lr_each_step ) + print (lr_each_step) + learning_rate = tf.gather( lr_each_step, current_step ) + + return learning_rate + +def warmup_decay(lr_warmup_mode, warmup_lr, global_step, warmup_steps, warmup_end_lr): + if lr_warmup_mode == 'linear': + learning_rate = linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + elif lr_warmup_mode == 'cosine': + learning_rate = cos_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr) + else: + raise ValueError('Invalid type of lr_warmup_mode') + return learning_rate + + +def linear_warmup(warmup_lr, global_step, warmup_steps, warmup_end_lr): + from tensorflow.python.ops import math_ops + p = tf.cast(global_step, tf.float32) / tf.cast(warmup_steps, tf.float32) + diff = math_ops.subtract(warmup_end_lr, warmup_lr) + res = math_ops.add(warmup_lr, math_ops.multiply(diff, p)) + return res + +def cos_warmup( warmup_lr, global_step, warmup_steps, warmup_end_lr ): + PI = 3.14159265359 + diff = tf.subtract( warmup_end_lr, warmup_lr ) + ang = PI + PI * ( tf.cast( global_step, tf.float32 ) / tf.cast( warmup_steps,tf.float32 )) + offset = diff * 0.5 * ( 1.0 + tf.math.cos( ang ) ) + res = tf.add( warmup_lr, offset ) + return res + + +def decay_linear( lr_start, lr_end, it_start, it_end, global_step ): + down_steps = it_end - it_start + down_range = lr_start - lr_end + down_per_step = float( down_range ) / float( down_steps ) + res = tf.subtract( tf.cast(lr_start, tf.float32), tf.multiply( tf.cast(down_per_step, tf.float32), tf.subtract(tf.cast(global_step, tf.float32), tf.cast(it_start, tf.float32) )) ) + return res + +def decay_linear_twice(lr_start, lr_mid, lr_end, it_start, it_mid, it_end, global_step ): + learning_rate = tf.cond( global_step < it_start, lambda: tf.cast(lr_start, tf.float32), lambda: decay_linear(lr_start, lr_mid, it_start, it_mid, global_step)) + learning_rate = tf.cond( global_step > it_mid, lambda: decay_linear(lr_mid, lr_end, it_mid, it_end, global_step) , lambda: learning_rate ) + return learning_rate + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/layers/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/layers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/layers/layers.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/layers/layers.py new file mode 100644 index 0000000..0312452 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/layers/layers.py @@ -0,0 +1,23 @@ +import tensorflow as tf +#from tensorflow.contrib.hccl.python.ops import hccl_ops +from npu_bridge.hccl import hccl_ops + +class Layers: + + def get_accuracy(self, labels, predicted_classes, logits, config): + accuracy = tf.metrics.accuracy( + labels=labels, predictions=predicted_classes) + top5acc = tf.metrics.mean( + tf.cast(tf.nn.in_top_k(logits, labels, 5), tf.float32)) + if config['rank_size'] == 1: + newaccuracy = (accuracy[0], accuracy[1]) + newtop5acc = (top5acc[0], top5acc[1]) + else: + newaccuracy = (hccl_ops.allreduce(accuracy[0],"sum")/config['rank_size'], accuracy[1]) + newtop5acc = (hccl_ops.allreduce(top5acc[0],"sum")/config['rank_size'], top5acc[1]) + metrics = {'val-top1acc': newaccuracy, 'val-top5acc': newtop5acc} + return metrics + + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/losses/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/losses/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/losses/res50_loss.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/losses/res50_loss.py new file mode 100644 index 0000000..ad383f9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/losses/res50_loss.py @@ -0,0 +1,36 @@ +import tensorflow as tf + +class Loss: + def __init__(self,config): + self.config = config + + def get_loss(self, logits, labels): + labels_one_hot = tf.one_hot(labels, self.config['num_classes']) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot,label_smoothing=self.config['label_smoothing']) + loss = tf.identity(loss, name='loss') + return loss + + def get_total_loss(self, loss): + reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + total_loss = tf.add_n([loss] + reg_losses, name='total_loss') + return total_loss + + + def optimize_loss(self, total_loss, opt): + gate_gradients = (tf.train.Optimizer.GATE_NONE) + # grads_and_vars = opt.compute_gradients(total_loss, colocate_gradients_with_ops=True, gate_gradients=gate_gradients) + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + + # train_op = opt.apply_gradients( grads_and_vars, global_step=None ) + train_op = opt.apply_gradients( grads_and_vars) + + return train_op + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/clean.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/clean.sh new file mode 100644 index 0000000..14ec7df --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/clean.sh @@ -0,0 +1,7 @@ + ps -ef | grep TdtMain | awk '{print $2}' | xargs kill -9 +rm -rf *.pbtxt +rm -rf /var/log/npu/slog/*.log +rm ckpt* -rf +find ./ -name "*.pyc" | xargs rm -rf +find ./ -name __pycache__ | xargs rm -rf +rm /var/log/npu/dataset/* -rf diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/res50.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/res50.py new file mode 100644 index 0000000..0b30c0c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/res50.py @@ -0,0 +1,120 @@ +import tensorflow as tf +import sys +import ast +#sys.path.append("..") +#sys.path.append("../models") +#sys.path.append("./resnet50_train/") +#sys.path.append("./resnet50_train/models") +import os +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../../utils')) +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../../utils/atlasboost')) +base_path=os.path.split(os.path.realpath(__file__))[0] +print ("#########base_path:", base_path) +path_1 = base_path + "/.." +print (path_1) +path_2 = base_path + "/../models" +print (path_2) +path_3 = base_path + "/../../" +print (path_3) + + +sys.path.append(base_path + "/..") +sys.path.append(base_path + "/../models") +sys.path.append(base_path + "/../../") +sys.path.append(base_path + "/../../models") + +from utils import create_session as cs +from utils import logger as lg +from data_loader.resnet50 import data_loader as dl +from models.resnet50 import res50_model as ml +from optimizers import optimizer as op +from losses import res50_loss as ls +from trainers import gpu_base_trainer as tr +# from configs import res50_config as cfg +from hyper_param import hyper_param as hp +from layers import layers as ly + +import argparse +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +def main(): + #-------------------choose the config file in .sh file----------- + cmdline = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + cmdline.add_argument('--config_file', default="", + help="""config file used.""") + cmdline.add_argument('--iterations_per_loop', default=1, + help="""config file used.""") + cmdline.add_argument('--max_train_steps', default=200, + help="""config file used.""") + cmdline.add_argument('--debug', default=True, type=ast.literal_eval, + help="""config file used.""") + cmdline.add_argument('--eval', default=False, type=ast.literal_eval, + help="""config file used.""") + cmdline.add_argument('--model_dir', default="./model_dir", + help="""config file used.""") + FLAGS, unknown_args = cmdline.parse_known_args() + if len(unknown_args) > 0: + for bad_arg in unknown_args: + print("ERROR: Unknown command line arg: %s" % bad_arg) + raise ValueError("Invalid command line arg(s)") + + cfg_file = FLAGS.config_file + configs = 'configs' + cfg = getattr(__import__(configs, fromlist=[cfg_file]), cfg_file) + #------------------------------------------------------------------ + + config = cfg.res50_config() + config['iterations_per_loop'] = int(FLAGS.iterations_per_loop) + config['max_train_steps'] = int(FLAGS.max_train_steps) + config['debug'] = FLAGS.debug + config['eval'] = FLAGS.eval + config['model_dir'] = FLAGS.model_dir + print("iterations_per_loop:%d" %(config['iterations_per_loop'])) + print("max_train_steps :%d" %(config['max_train_steps'])) + print("debug :%s" %(config['debug'])) + print("eval :%s" %(config['eval'])) + print("model_dir :%s" %(config['model_dir'])) + Session = cs.CreateSession(config) + data = dl.DataLoader(config) + hyper_param = hp.HyperParams(config) + layers = ly.Layers() + optimizer = op.Optimizer(config) + loss = ls.Loss(config) + logger = lg.LogSessionRunHook(config) # add tensorboard summary + + model = ml.Model(config, data, hyper_param,layers, optimizer, loss, logger) # get the model + trainer = tr.GPUBaseTrain(Session, config, data, model, logger) # use Estimator to build training process + + if config['mode'] =='train': + trainer.train() + if config['eval'] : + trainer.evaluate() + elif config['mode'] =='evaluate': + trainer.evaluate() + elif config['mode'] =='train_and_evaluate': + trainer.train_and_evaluate() + else: + raise ValueError('Invalid type of mode') + +if __name__ == '__main__': + # add zwx5326390 日志打点 + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.1, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, + "batchsize": 256} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + main() diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50.sh new file mode 100644 index 0000000..bbd2da5 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50.sh @@ -0,0 +1,21 @@ +#!/bin/bash +#export CUDA_VISIBLE_DEVICES=0 +dir=`pwd` + +#cp -rf ./config /tmp/ +export JOB_ID=10086 +#export PROFILING_DIR=/var/log/npu/profiling/container/0 +export DEVICE_ID=0 +#export PROFILING_MODE=true +export PRINT_MODEL=1 +#export ENABLE_DATA_PRE_PROC=1 +export RANK_ID=0 +export RANK_SIZE=1 +export RANK_TABLE_FILE=/home/lxh/config/new_rank_table_1p.json +export FUSION_TENSOR_SIZE=1000000000 +export PYTHONPATH=${dir} +export LD_LIBRARY_PATH=/usr/local/HiAI/runtime/lib64/ +/usr/local/HiAI/runtime/bin/TdtMain --configfile=/home/lxh/test/config/job_tdt_2p_$DEVICE_ID.json & +sleep 5 + +python3.6 res50.py --config_file res50_baseline diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50_gpu.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50_gpu.sh new file mode 100644 index 0000000..c89b78e --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/mains/train_res50_gpu.sh @@ -0,0 +1,4 @@ +#!/bin/bash +export CUDA_VISIBLE_DEVICES=7 + +python3.5 res50.py --config_file res50_baseline_gpu diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_helper.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_helper.py new file mode 100644 index 0000000..0e16df6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_helper.py @@ -0,0 +1,24 @@ +import tensorflow as tf + +def _fp32_trainvar_getter(getter, name, shape=None, dtype=None, + trainable=True, regularizer=None, + *args, **kwargs): + storage_dtype = dtype + variable = getter(name, shape, dtype=storage_dtype, + trainable=trainable, + regularizer=regularizer if trainable and 'BatchNorm' not in name and 'batchnorm' not in name and 'batch_norm' not in name and 'Batch_Norm' not in name else None, + *args, **kwargs) + + return variable + + +def fp32_trainable_vars(name='fp32_vars', *args, **kwargs): + """A varible scope with custom variable getter to convert fp16 trainable + variables with fp32 storage followed by fp16 cast. + """ + return tf.variable_scope( + name, custom_getter=_fp32_trainvar_getter, *args, **kwargs) + +def custom_getter_with_fp16_and_weight_decay(dtype, weight_decay): + return fp32_trainable_vars(dtype=dtype, regularizer=tf.contrib.layers.l2_regularizer(weight_decay)) + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py new file mode 100644 index 0000000..02e3958 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py @@ -0,0 +1,222 @@ + +import tensorflow as tf +from . import resnet, res50_helper +from trainers.train_helper import stage +#from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +#from tensorflow.contrib.offline_train.python import npu_ops +from npu_bridge.estimator import npu_ops +_NUM_EXAMPLES_NAME="num_examples" + + +class Model(object): + def __init__(self, config, data, hyper_param, layers, optimizer, loss, logger): + self.config = config + self.data = data + self.hyper_param = hyper_param + self.layers = layers + self.optimizer = optimizer + self.loss = loss + self.logger = logger + + def get_estimator_model_func(self, features, labels, mode, params=None): + labels = tf.reshape(labels, (-1,)) # Squash unnecessary unary dim #----------------not use when use onehot label + + model_func = self.get_model_func() + inputs = features # TODO: Should be using feature columns? + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + with tf.device('/gpu:0'): + if self.config['accelerator'] == 'gpu': + inputs = tf.cast(inputs, self.config['dtype']) + + inputs = tf.cast(inputs, self.config['dtype']) + with res50_helper.custom_getter_with_fp16_and_weight_decay(dtype=self.config['dtype'], weight_decay=self.config['weight_decay']): # no BN decay + + top_layer = model_func( + inputs, data_format=self.config['data_format'], training=is_training, + conv_initializer=self.config['conv_init'], + bn_init_mode=self.config['bn_init_mode'], bn_gamma_initial_value=self.config['bn_gamma_initial_value']) + + + logits = top_layer + predicted_classes = tf.argmax(logits, axis=1, output_type=tf.int32) + logits = tf.cast(logits, tf.float32) + + #loss = self.loss.get_loss(logits, labels) + #loss = tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels) + + labels_one_hot = tf.one_hot(labels, depth=1001) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot, label_smoothing=self.config['label_smoothing']) + + + base_loss = tf.identity(loss, name='loss') # For access by logger (TODO: Better way to access it?) + # base_loss = tf.add_n([loss]) + + def exclude_batch_norm(name): + #return 'batch_normalization' not in name + return 'BatchNorm' not in name + loss_filter_fn = exclude_batch_norm + + # Add weight decay to the loss. + l2_loss = self.config['weight_decay'] * tf.add_n( + # loss is computed using fp32 for numerical stability. + [tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables() + if loss_filter_fn(v.name)]) + #tf.summary.scalar('l2_loss', l2_loss) + # total_loss = base_loss + l2_loss + if self.config['use_lars']: + total_loss = base_loss + else: + total_loss = base_loss + l2_loss + + total_loss = tf.identity(total_loss, name = 'total_loss') + + + if mode == tf.estimator.ModeKeys.EVAL: + with tf.device(None): + metrics = self.layers.get_accuracy( labels, predicted_classes, logits, self.config) + + return tf.estimator.EstimatorSpec( + mode, loss=loss, eval_metric_ops=metrics) + + assert (mode == tf.estimator.ModeKeys.TRAIN) + + #reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + #total_loss = tf.add_n([tf.saturate_cast(loss, self.config['dtype']) ] + reg_losses, name='total_loss') + #total_loss = tf.add_n([loss], name='total_loss') + + batch_size = tf.shape(inputs)[0] + + global_step = tf.train.get_global_step() + with tf.device('/cpu:0'): + learning_rate = self.hyper_param.get_learning_rate() + + #-----------------------batchsize scaling---------------------------------- + momentum = self.config['momentum'][0] + #------------------------------end------------------------------------------ + + opt = tf.train.MomentumOptimizer( + learning_rate, momentum, use_nesterov=self.config['use_nesterov']) + opt=NPUDistributedOptimizer(opt) + if self.config['accelerator'] == 'gpu': + opt = self.optimizer.get_lbs_optimizer(opt) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + with tf.control_dependencies(update_ops): + if self.config['accelerator'] == 'gpu': + gate_gradients = (tf.train.Optimizer.GATE_NONE) + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + train_op = opt.apply_gradients( grads_and_vars,global_step = global_step) + else: + with tf.name_scope('loss_scale'): + loss_scale = float( self.config['loss_scale'] ) + scaled_grads_and_vars = opt.compute_gradients( total_loss * loss_scale ) + unscaled_grads_and_vars = [ (g/loss_scale, v) for g,v in scaled_grads_and_vars ] + + + #-----------------------------------------Lars------------------------------------------ + with tf.name_scope('LARS'): + fp32_grads_and_vars = [ (tf.cast(g, tf.float32), v) for g,v in unscaled_grads_and_vars ] + grad_var_list = [] + + if self.config['use_lars']: + if self.config['accelerator'] == 'gpu': + for g, var in fp32_grads_and_vars: + + if 'BatchNorm' not in var.name and 'bias' not in var.name: + grad_norm = tf.norm(g,ord='euclidean') + weight_norm = tf.norm(var,ord='euclidean') + grad_norm_wd = tf.add( grad_norm, tf.multiply( self.config['weight_decay'] , weight_norm ) ) + rescale_factor = tf.div( tf.multiply(0.001, weight_norm), tf.add(grad_norm_wd, tf.constant(1e-5, tf.float32)) ) + decayed_g = tf.add( g, tf.multiply(self.config['weight_decay'], var ) ) + + with tf.name_scope('lars_grad'): + g = tf.multiply(rescale_factor, decayed_g) + + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + + elif self.config['accelerator'] == '1980': + print('lars9999999999999999999999') + g_list_bn_bias = [] + var_list_bn_bias = [] + g_list_else = [] + var_list_else = [] + for g, var in fp32_grads_and_vars: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + g_list_else.append(g) + var_list_else.append(var) + else: + g_list_bn_bias.append(g) + var_list_bn_bias.append(var) + + + g_list_else_lars = npu_ops.LARS(inputs_w=var_list_else, + inputs_g=g_list_else, + weight_decay=self.config['weight_decay'], + hyperpara=0.001, + epsilon=1e-5) + + g_list_lars = g_list_bn_bias + g_list_else_lars + var_list = var_list_bn_bias + var_list_else + + for (g, var) in zip(g_list_lars,var_list): + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + + + else: + print('do not use lars111111111111111111') + for g, var in fp32_grads_and_vars: + #if 'BatchNorm' not in var.name and 'bias' not in var.name: + # decayed_g = tf.add( g, tf.multiply( self.config['weight_decay'], var ) ) + # g = decayed_g + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + #-----------------------------------------end Lars------------------------------------------ + + + + + train_op = opt.apply_gradients( grad_var_list, global_step = global_step ) + + train_op = tf.group(train_op) + + #with tf.device('/cpu:0'): + #tf.summary.scalar('total_loss', total_loss) + #tf.summary.scalar('base_loss', base_loss) + #tf.summary.scalar('learning_rate', learning_rate) + #tf.contrib.summary.flush() +# if self.config['do_checkpoint']: +# summary_hook = tf.train.SummarySaverHook( save_steps=20, +# output_dir=self.config['log_dir']+'/train_summary', +# summary_op = tf.summary.merge_all() ) + + #return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op, training_hooks=[summary_hook] )\ + # if self.config['do_checkpoint'] else tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op ) + return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op ) + + # return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op) + + + + def get_model_func(self): + model_name = self.config['model_name'] + if model_name.startswith('resnet'): + nlayer = int(model_name[len('resnet'):]) + return lambda images, *args, **kwargs: \ + resnet.inference_resnet_v1(self.config,images, nlayer, *args, **kwargs) + else: + raise ValueError("Invalid model type: %s" % model_name) + + + + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py_bak b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py_bak new file mode 100644 index 0000000..f3465ee --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/res50_model.py_bak @@ -0,0 +1,143 @@ +import tensorflow as tf +from . import resnet, res50_helper +from trainers.train_helper import stage +from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer +_NUM_EXAMPLES_NAME="num_examples" + + +class Model(object): + def __init__(self, config, data, hyper_param, layers, optimizer, loss, logger): + self.config = config + self.data = data + self.hyper_param = hyper_param + self.layers = layers + self.optimizer = optimizer + self.loss = loss + self.logger = logger + + def get_estimator_model_func(self, features, labels, mode, params=None): + labels = tf.reshape(labels, (-1,)) # Squash unnecessary unary dim + + model_func = self.get_model_func() + inputs = features # TODO: Should be using feature columns? + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + #if mode == tf.estimator.ModeKeys.TRAIN: + # preload_op, gpucopy_op, inputs, labels = self.data.get_input_pipeline_op( inputs, labels, mode ) + + with tf.device('/gpu:0'): + if self.config['accelerator'] == 'gpu': + inputs = tf.cast(inputs, self.config['dtype']) + + with res50_helper.custom_getter_with_fp16_and_weight_decay(dtype=self.config['dtype'], weight_decay=self.config['weight_decay']): # no BN decay + + top_layer = model_func( + inputs, data_format=self.config['data_format'], training=is_training, + conv_initializer=self.config['conv_init'], + bn_init_mode=self.config['bn_init_mode'], bn_gamma_initial_value=self.config['bn_gamma_initial_value']) + + + logits = top_layer + predicted_classes = tf.argmax(logits, axis=1, output_type=tf.int32) + logits = tf.cast(logits, tf.float32) + + #loss = self.loss.get_loss(logits, labels) + loss = tf.losses.sparse_softmax_cross_entropy(logits=logits, labels=labels) + base_loss = tf.identity(loss, name='loss') # For access by logger (TODO: Better way to access it?) + # base_loss = tf.add_n([loss]) + + # def exclude_batch_norm(name): + # #return 'batch_normalization' not in name + # return 'BatchNorm' not in name + # loss_filter_fn = exclude_batch_norm + + # Add weight decay to the loss. + # l2_loss = self.config['weight_decay'] * tf.add_n( + # # loss is computed using fp32 for numerical stability. + # [tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables() + # if loss_filter_fn(v.name)]) + # #tf.summary.scalar('l2_loss', l2_loss) + # total_loss = base_loss + l2_loss + total_loss = base_loss + total_loss = tf.identity(total_loss, name = 'total_loss') + + + if mode == tf.estimator.ModeKeys.EVAL: + with tf.device(None): + metrics = self.layers.get_accuracy( labels, predicted_classes, logits ) + + return tf.estimator.EstimatorSpec( + mode, loss=loss, eval_metric_ops=metrics) + + assert (mode == tf.estimator.ModeKeys.TRAIN) + + #reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + #total_loss = tf.add_n([tf.saturate_cast(loss, self.config['dtype']) ] + reg_losses, name='total_loss') + #total_loss = tf.add_n([loss], name='total_loss') + + batch_size = tf.shape(inputs)[0] + + global_step = tf.train.get_global_step() + with tf.device('/cpu:0'): + learning_rate = self.hyper_param.get_learning_rate() + + #-----------------------batchsize scaling---------------------------------- + momentum = self.config['momentum'][0] + #------------------------------end------------------------------------------ + + opt = tf.train.MomentumOptimizer( + learning_rate, momentum, use_nesterov=False) + optimizer=NPUDistributedOptimizer(opt) + if self.config['accelerator'] == 'gpu': + opt = self.optimizer.get_lbs_optimizer(opt) + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + with tf.control_dependencies(update_ops): + if self.config['accelerator'] == 'gpu': + gate_gradients = (tf.train.Optimizer.GATE_NONE) + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + train_op = opt.apply_gradients( grads_and_vars,global_step = global_step) + else: + with tf.name_scope('loss_scale'): + loss_scale = float( self.config['loss_scale'] ) + scaled_grads_and_vars = opt.compute_gradients( total_loss * loss_scale ) + unscaled_grads_and_vars = [ (g/loss_scale, v) for g,v in scaled_grads_and_vars ] + train_op = opt.apply_gradients( unscaled_grads_and_vars, global_step = global_step ) + + train_op = tf.group(train_op) + + with tf.device('/cpu:0'): + #tf.summary.scalar('total_loss', total_loss) + tf.summary.scalar('base_loss', base_loss) + tf.summary.scalar('learning_rate', learning_rate) + tf.contrib.summary.flush() + if self.config['do_checkpoint']: + summary_hook = tf.train.SummarySaverHook( save_steps=20, + output_dir=self.config['log_dir']+'/train_summary', + summary_op = tf.summary.merge_all() ) + + return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op, training_hooks=[summary_hook] )\ + if self.config['do_checkpoint'] else tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op ) + + # return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op) + + + + def get_model_func(self): + model_name = self.config['model_name'] + if model_name.startswith('resnet'): + nlayer = int(model_name[len('resnet'):]) + return lambda images, *args, **kwargs: \ + resnet.inference_resnet_v1(self.config,images, nlayer, *args, **kwargs) + else: + raise ValueError("Invalid model type: %s" % model_name) + + + + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/resnet.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/resnet.py new file mode 100644 index 0000000..6e81f17 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/models/resnet50/resnet.py @@ -0,0 +1,436 @@ +import tensorflow as tf + +_BATCH_NORM_EPSILON = 1e-4 +_BATCH_NORM_DECAY = 0.9 + + +class LayerBuilder(object): + def __init__(self, activation=None, data_format='channels_last', + training=False, use_batch_norm=False, batch_norm_config=None, + conv_initializer=None, bn_init_mode='adv_bn_init', bn_gamma_initial_value=1.0 ): + self.activation = activation + self.data_format = data_format + self.training = training + self.use_batch_norm = use_batch_norm + self.batch_norm_config = batch_norm_config + self.conv_initializer = conv_initializer + self.bn_init_mode = bn_init_mode + self.bn_gamma_initial_value = bn_gamma_initial_value + if self.batch_norm_config is None: + self.batch_norm_config = { + 'decay': _BATCH_NORM_DECAY, + 'epsilon': _BATCH_NORM_EPSILON, + 'scale': True, + 'zero_debias_moving_mean': False, + } + + def _conv2d(self, inputs, activation, *args, **kwargs): + x = tf.layers.conv2d( + inputs, data_format=self.data_format, + # use_bias=not self.use_batch_norm, + use_bias=False, + kernel_initializer=self.conv_initializer, + activation=None if self.use_batch_norm else activation, + *args, **kwargs) + if self.use_batch_norm: + param_initializers = { + 'moving_mean': tf.zeros_initializer(), + 'moving_variance': tf.ones_initializer(), + 'beta': tf.zeros_initializer(), + } + if self.bn_init_mode == 'adv_bn_init': + param_initializers['gamma'] = tf.ones_initializer() + elif self.bn_init_mode == 'conv_bn_init': + param_initializers['gamma'] = tf.constant_initializer(self.bn_gamma_initial_value) + else: + raise ValueError("--bn_init_mode must be 'conv_bn_init' or 'adv_bn_init' ") + + x = self.batch_norm(x) + x = activation(x) if activation is not None else x + return x + + def conv2d_linear_last_bn(self, inputs, *args, **kwargs): + x = tf.layers.conv2d( + inputs, data_format=self.data_format, + use_bias=False, + kernel_initializer=self.conv_initializer, + activation=None, *args, **kwargs) + param_initializers = { + 'moving_mean': tf.zeros_initializer(), + 'moving_variance': tf.ones_initializer(), + 'beta': tf.zeros_initializer(), + } + if self.bn_init_mode == 'adv_bn_init': + param_initializers['gamma'] = tf.zeros_initializer() + elif self.bn_init_mode == 'conv_bn_init': + param_initializers['gamma'] = tf.constant_initializer(self.bn_gamma_initial_value) + else: + raise ValueError("--bn_init_mode must be 'conv_bn_init' or 'adv_bn_init' ") + + x = self.batch_norm(x, param_initializers=param_initializers) + return x + + def conv2d_linear(self, inputs, *args, **kwargs): + return self._conv2d(inputs, None, *args, **kwargs) + + def conv2d(self, inputs, *args, **kwargs): + return self._conv2d(inputs, self.activation, *args, **kwargs) + + def pad2d(self, inputs, begin, end=None): + if end is None: + end = begin + try: + _ = begin[1] + except TypeError: + begin = [begin, begin] + try: + _ = end[1] + except TypeError: + end = [end, end] + if self.data_format == 'channels_last': + padding = [[0, 0], [begin[0], end[0]], [begin[1], end[1]], [0, 0]] + else: + padding = [[0, 0], [0, 0], [begin[0], end[0]], [begin[1], end[1]]] + return tf.pad(inputs, padding) + + def max_pooling2d(self, inputs, *args, **kwargs): + return tf.layers.max_pooling2d( + inputs, data_format=self.data_format, *args, **kwargs) + + def average_pooling2d_stride_1(self, inputs, *args, **kwargs): + # inputs = tf.nn.avg_pool(inputs, ksize=[1,1,1,1],strides=[1,1,1,1], padding="VALID", data_format="NHWC" ) + return inputs + + def average_pooling2d(self, inputs, *args, **kwargs): + inputs = tf.nn.avg_pool(inputs, ksize=[1,2,2,1],strides=[1,2,2,1], padding="VALID", data_format="NHWC" ) + return inputs + + # return tf.layers.average_pooling2d( + # inputs, data_format=self.data_format, *args, **kwargs) + + def dense_linear(self, inputs, units, **kwargs): + return tf.layers.dense(inputs, units, activation=None) + + def dense(self, inputs, units, **kwargs): + return tf.layers.dense(inputs, units, activation=self.activation) + + def activate(self, inputs, activation=None): + activation = activation or self.activation + return activation(inputs) if activation is not None else inputs + + def batch_norm(self, inputs, **kwargs): + all_kwargs = dict(self.batch_norm_config) + all_kwargs.update(kwargs) + data_format = 'NHWC' if self.data_format == 'channels_last' else 'NCHW' + bn_inputs = inputs + outputs = tf.contrib.layers.batch_norm( + inputs, is_training=self.training, data_format=data_format, + fused=True, **all_kwargs) + + return outputs + + def spatial_average2d(self, inputs): + shape = inputs.get_shape().as_list() + if self.data_format == 'channels_last': + n, h, w, c = shape + else: + n, c, h, w = shape + n = -1 if n is None else n + x = tf.layers.average_pooling2d(inputs, (h, w), (1, 1), + data_format=self.data_format) + return tf.reshape(x, [n, c]) + + def flatten2d(self, inputs): + x = inputs + if self.data_format != 'channel_last': + # Note: This ensures the output order matches that of NHWC networks + x = tf.transpose(x, [0, 2, 3, 1]) + input_shape = x.get_shape().as_list() + num_inputs = 1 + for dim in input_shape[1:]: + num_inputs *= dim + return tf.reshape(x, [-1, num_inputs], name='flatten') + + def residual2d(self, inputs, network, units=None, scale=1.0, activate=False): + outputs = network(inputs) + c_axis = -1 if self.data_format == 'channels_last' else 1 + h_axis = 1 if self.data_format == 'channels_last' else 2 + w_axis = h_axis + 1 + ishape, oshape = [y.get_shape().as_list() for y in [inputs, outputs]] + ichans, ochans = ishape[c_axis], oshape[c_axis] + strides = ((ishape[h_axis] - 1) // oshape[h_axis] + 1, + (ishape[w_axis] - 1) // oshape[w_axis] + 1) + with tf.name_scope('residual'): + if (ochans != ichans or strides[0] != 1 or strides[1] != 1): + inputs = self.conv2d_linear(inputs, units, 1, strides, 'SAME') + x = inputs + scale * outputs + if activate: + x = self.activate(x) + return x + + +def resnet_bottleneck_v1(builder, inputs, depth, depth_bottleneck, stride, filters, arch_type, + basic=False): + num_inputs = inputs.get_shape().as_list()[3] + x = inputs + #with tf.name_scope('resnet_model'): + if depth == num_inputs: + if stride == 1:#v1.5 + shortcut = x + else:#v1 + shortcut = builder.max_pooling2d(x, 1, stride) + else: # the downsample(first) block in each layer + if 'D1' in arch_type: + if stride == 1: + shortcut = builder.average_pooling2d_stride_1(x, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.average_pooling2d(x, stride, stride) #--------------------Resnet-D------------ + shortcut = builder.conv2d_linear(shortcut, depth, 1, 1, 'SAME') + elif 'D2' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 3, stride, 'SAME') + elif 'D3' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + shortcut = builder.average_pooling2d(shortcut, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.conv2d_linear(x, depth, 1, stride, 'SAME') + conv_input = x + + if basic: + x = builder.pad2d(x, 1) + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'VALID') + x = builder.conv2d_linear(x, depth, 3, 1, 'SAME') + else: + conv_input = x + x = builder.conv2d(x, depth_bottleneck, 1, 1, 'SAME') + conv_input = x + if stride == 1: + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + else: + if 'E1' in arch_type: + x = builder.average_pooling2d( x, stride, stride ) + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + elif 'E2' in arch_type: + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + if stride == 1: + x = builder.average_pooling2d_stride_1( x, stride, stride ) + else: + x = builder.average_pooling2d( x, stride, stride ) + else: # E0 + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + + # x = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + conv_input = x + x = builder.conv2d_linear_last_bn(x, depth, 1, 1, 'SAME') + + x = tf.nn.relu(x + shortcut) + return x + +def resnet_bottleneck_v2(builder, inputs, depth, depth_bottleneck, stride, filters, arch_type, + basic=False): + num_inputs = inputs.get_shape().as_list()[1] + x = inputs + with tf.name_scope('resnet_v1'): + # ------- shortcut --------------- + if depth == num_inputs: + if stride == 1:#v1.5 + shortcut = x + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else:#v1 + shortcut = builder.max_pooling2d(x, 1, stride) + else: # the downsample(first) block in each layer + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + if 'D1' in arch_type: + shortcut = builder.average_pooling2d(x, stride, stride) #--------------------Resnet-D------------ + shortcut = builder.conv2d_linear(shortcut, depth, 1, 1, 'SAME') + elif 'D2' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 3, stride, 'SAME') + elif 'D3' in arch_type: + shortcut = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + shortcut = builder.average_pooling2d(shortcut, stride, stride) #--------------------Resnet-D------------ + else: + shortcut = builder.conv2d_linear(x, depth, 1, stride, 'SAME') + + # -------- mainstream ---------------- + if basic: + x = builder.pad2d(x, 1) + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'VALID') + x = builder.conv2d_linear(x, depth, 3, 1, 'SAME') + else: + x = builder.conv2d(x, depth_bottleneck, 1, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + if stride == 1: + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else: + if 'E1' in arch_type: + x = builder.average_pooling2d( x, stride, stride ) + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'E2' in arch_type: + x = builder.conv2d(x, depth_bottleneck, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.average_pooling2d( x, stride, stride ) + else: # E0 + x = builder.conv2d(x, depth_bottleneck, 3, stride, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + x = builder.conv2d_linear(x, depth, 1, 1, 'SAME') + + + x = x + shortcut + return x + +def inference_resnet_v1_impl(builder, inputs, layer_counts, arch_type='C1+D', resnet_version='v1.5', basic=False): + x = inputs + #x = builder.pad2d(x, 1) + + if 'C1' in arch_type: # --- Resnet C ----- + x = builder.conv2d(x, 32, 3, 2, 'SAME') + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.conv2d(x, 64, 3, 1, 'SAME') + elif 'C2' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.conv2d(x, 64, 3, 1, 'VALID') + elif 'C3' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.conv2d(x, 64, 3, 2, 'VALID') + else: + x = builder.conv2d(x, 64, 7, 2, 'SAME') + + num_filters=64 + + pooled_inputs = x + #x = builder.max_pooling2d(x, 3, 2, 'SAME') + x, argmax = tf.nn.max_pool_with_argmax(input=x, ksize=(1,3,3,1), strides=(1,2,2,1), padding='SAME') + + for i in range(layer_counts[0]): + x = resnet_bottleneck_v1(builder, x, 256, 64, 1, num_filters, arch_type, basic) + for i in range(layer_counts[1]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 512, 128, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[2]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 1024, 256, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[3]): + num_filters=num_filters*2 + x = resnet_bottleneck_v1(builder, x, 2048, 512, 2 if i == 0 else 1, num_filters, arch_type, basic) + + axes = [1,2] + x = tf.reduce_mean( x, axes, keepdims=True ) + x = tf.identity(x, 'final_reduce_mean') + x = tf.reshape( x, [-1, 2048] ) + x = tf.layers.dense(inputs=x, units=1001,kernel_initializer=tf.random_normal_initializer(stddev=0.01)) + x = tf.identity( x, 'final_dense' ) + return x + +def inference_resnet_v2_impl(builder, inputs, layer_counts, arch_type='C1+D', basic=False): + x = inputs + x = builder.pad2d(x, 3) + + if 'C1' in arch_type: # --- Resnet C ----- + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'C2' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'SAME') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + elif 'C3' in arch_type: + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 32, 3, 1, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + x = builder.conv2d(x, 64, 3, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + else: + x = builder.conv2d(x, 64, 7, 2, 'VALID') + x = builder.batch_norm(x) + x = tf.nn.relu(x) + + num_filters=64 + + pooled_inputs = x + x = builder.max_pooling2d(x, 3, 2, 'SAME') + + for i in range(layer_counts[0]): + x = resnet_bottleneck_v2(builder, x, 256, 64, 1, num_filters, arch_type, basic) + for i in range(layer_counts[1]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 512, 128, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[2]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 1024, 256, 2 if i == 0 else 1, num_filters, arch_type, basic) + for i in range(layer_counts[3]): + num_filters=num_filters*2 + x = resnet_bottleneck_v2(builder, x, 2048, 512, 2 if i == 0 else 1, num_filters, arch_type, basic) + return builder.spatial_average2d(x) + +def inference_resnet_v1(config, inputs, nlayer, data_format='channels_last', + training=False, conv_initializer=None, bn_init_mode='adv_bn_init', bn_gamma_initial_value=1.0 ): + """Deep Residual Networks family of models + https://arxiv.org/abs/1512.03385 + """ + if config['resnet_version'] == 'v1.5': + builder = LayerBuilder(tf.nn.relu, data_format, training, use_batch_norm=True, + conv_initializer=conv_initializer, bn_init_mode=bn_init_mode, bn_gamma_initial_value=bn_gamma_initial_value) + if nlayer == 18: + return inference_resnet_v1_impl(builder, inputs, [2, 2, 2, 2], config['arch_type'], config['resnet_version'], basic=True) + elif nlayer == 34: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], config['resnet_version'], basic=True) + elif nlayer == 50: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], config['resnet_version']) + elif nlayer == 101: + return inference_resnet_v1_impl(builder, inputs, [3, 4, 23, 3], config['arch_type'], config['resnet_version']) + elif nlayer == 152: + return inference_resnet_v1_impl(builder, inputs, [3, 8, 36, 3], config['arch_type'], config['resnet_version']) + else: + raise ValueError("Invalid nlayer (%i); must be one of: 18,34,50,101,152" % + nlayer) + + elif config['resnet_version'] == 'v2': + builder = LayerBuilder( None, data_format, training, use_batch_norm=False, + conv_initializer=conv_initializer, bn_init_mode=bn_init_mode, bn_gamma_initial_value=bn_gamma_initial_value) + if nlayer == 18: + return inference_resnet_v2_impl(builder, inputs, [2, 2, 2, 2], config['arch_type'], basic=True) + elif nlayer == 34: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 6, 3], config['arch_type'], basic=True) + elif nlayer == 50: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 6, 3], config['arch_type']) + elif nlayer == 101: + return inference_resnet_v2_impl(builder, inputs, [3, 4, 23, 3], config['arch_type']) + elif nlayer == 152: + return inference_resnet_v2_impl(builder, inputs, [3, 8, 36, 3], config['arch_type']) + else: + raise ValueError("Invalid nlayer (%i); must be one of: 18,34,50,101,152" % + nlayer) + else: + raise ValueError("Invalid resnet version") + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/optimizers/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/optimizers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/optimizers/optimizer.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/optimizers/optimizer.py new file mode 100644 index 0000000..ce42d6a --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/optimizers/optimizer.py @@ -0,0 +1,228 @@ +import six +import tensorflow as tf + +class Optimizer: + def __init__(self, config): + self.config = config + + def get_lbs_optimizer(self, opt): #TODO input is ( self, hyper_param ) + + # opt = LargeBatchSizeOptimizer(opt, weight_decay=self.config['weight_decay'], + # accum_dtype = self.config['dtype'], + # use_lars = self.config['use_lars'], + # bn_lr_scale = self.config.get('bn_lr_scale', 1.0) + # ) + opt = MixedPrecisionOptimizer(opt, self.config) + + return opt + +class MixedPrecisionOptimizer(tf.train.Optimizer): + """An optimizer that updates trainable variables in fp32.""" + + def __init__(self, optimizer, config): + super(MixedPrecisionOptimizer, self).__init__( + optimizer._use_locking, + optimizer._name + '-MP', + ) + self._optimizer = optimizer + self._config = config + loss_scale=self._config['loss_scale'] + self._loss_scale = float(loss_scale) + self._fp32_to_fp16 = {} + + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + with tf.device('/gpu:0'): + self.var_fp32_copy = [ tf.Variable( tf.cast(v.initialized_value(), tf.float32), + dtype=tf.float32, trainable=False, + collections=[tf.GraphKeys.GLOBAL_VARIABLES, "FP32_MASTER_COPIES"] ) for v in var_list ] + + def compute_gradients(self, loss, var_list=None, + gate_gradients=tf.train.Optimizer.GATE_OP, + aggregation_method=None, + colocate_gradients_with_ops=False, + grad_loss=None): + if var_list is None: + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + + if self._loss_scale != 1.0: + loss = tf.scalar_mul(self._loss_scale, loss) + + grads_and_vars_fp16 = self._optimizer.compute_gradients( + loss, var_list=var_list, + gate_gradients=gate_gradients, + aggregation_method=aggregation_method, + colocate_gradients_with_ops=colocate_gradients_with_ops, + grad_loss=grad_loss, + ) + # creating FP-32 variables and filling the fp32 dict + grads_and_vars_fp32 = [] + + with tf.variable_scope('FP32-master-copy'): + for i, (grad, var) in enumerate(grads_and_vars_fp16): + if grad is not None: + if var.dtype.base_dtype == tf.float16: + fp32_var = self.var_fp32_copy[i] + self._fp32_to_fp16[fp32_var.name] = var + fp32_grad = tf.cast(grad, tf.float32) + grads_and_vars_fp32.append((fp32_grad, fp32_var)) + else: + grads_and_vars_fp32.append((grad, var)) + else: + grads_and_vars_fp32.append((None, var)) + + grads_and_vars_fp32_rescaled = [ (g/self._loss_scale, v) for g,v in grads_and_vars_fp32 ] + + + return grads_and_vars_fp32_rescaled + + def apply_gradients(self, grads_and_vars, *args, **kwargs): + update_op = self._optimizer.apply_gradients(grads_and_vars, *args, **kwargs) + apply_ops = [] + with tf.control_dependencies([update_op]): + for grad, var in grads_and_vars: + if var.name in self._fp32_to_fp16: + dst_var = self._fp32_to_fp16[var.name] + apply_ops.append( + tf.assign(dst_var, tf.saturate_cast(var, tf.float16))) + if apply_ops: + return tf.group(apply_ops) + return update_op + + +class LargeBatchSizeOptimizer(tf.train.Optimizer): + """ LARC implementation + ------------------- + Parameters: + - optimizer: initial optimizer that you wanna apply + example: tf.train.MomentumOptimizer + - learning_rate: initial learning_rate from initial optimizer + - clip: if True apply LARC otherwise LARS + - epsilon: default value is weights or grads are 0. + - name + - use_locking + """ + + def __init__(self, optimizer, weight_decay, clip=True, epsilon=1., accum_dtype=tf.float16, use_lars=True, bn_lr_scale=1.0, + name="LarcOptimizer", use_locking=False): + super(LargeBatchSizeOptimizer, self).__init__( + name=name, use_locking=use_locking) + self._optimizer = optimizer + # self._learning_rate = learning_rate + self._weight_decay = weight_decay + self._clip = clip + self._epsilon = float(epsilon) + self._accum_dtype=accum_dtype + self._use_lars=use_lars + self._bn_lr_scale=bn_lr_scale + + var_list = ( + tf.trainable_variables() + + tf.get_collection(tf.GraphKeys.TRAINABLE_RESOURCE_VARIABLES)) + with tf.device('/gpu:0'): + self._grads_accum = [ tf.Variable( tf.cast(tf.zeros_like(v.initialized_value()), self._accum_dtype), dtype=self._accum_dtype, trainable=False, collections=[tf.GraphKeys.LOCAL_VARIABLES] ) for v in var_list ] + + + def compute_gradients(self, *args, **kwargs): + return self._optimizer.compute_gradients(*args, **kwargs) + + + def apply_gradients(self, gradvars, loss_scale, *args, **kwargs): + + global_step = tf.train.get_global_step() + + grads_and_vars_clean = [] + for grad, var in gradvars: + if grad is not None: + grads_and_vars_clean.append( (grad, var) ) + + processed_grads_and_vars = self.post_process_grads(grads_and_vars_clean, loss_scale) # post_process_grads includes Lars + + def apply(): + red_grad_updates = self._optimizer.apply_gradients( processed_grads_and_vars, global_step=tf.train.get_global_step() ) + return tf.group(red_grad_updates) + + update_weight_op_1 = apply() + return update_weight_op_1 + + apply_gradients_op = update_weight_op_1 + + with tf.device('/cpu:0'): + #tf.summary.scalar('loss_scale', loss_scale) + for grad, var in gradvars: + g = grad / loss_scale + v_norm_2 = tf.norm(var, ord='euclidean') + g_norm_2 = tf.norm(g, ord='euclidean') + v_g_norm2_ratio = v_norm_2 / ( + g_norm_2 + self._weight_decay * v_norm_2) + if grad is not None: + if 'BatchNorm' in var.name: + with tf.name_scope('bn_norm2/'): + tf.summary.scalar(var.name + '/norm2', + v_norm_2) + with tf.name_scope('grad_bn_norm2/'): + tf.summary.scalar(var.name + '/grad_norm2', + g_norm_2) + with tf.name_scope('bn_ratio_var_grad/'): + tf.summary.scalar(var.name + '/ratio_var_grad', + v_g_norm2_ratio) + else: + with tf.name_scope('conv_norm2/'): + tf.summary.scalar(var.name + '/norm2', + v_norm_2) + with tf.name_scope('grad_conv_norm2/'): + tf.summary.scalar(var.name + '/grad_norm2', + g_norm_2) + with tf.name_scope('conv_ratio_var_grad/'): + tf.summary.scalar(var.name + '/ratio_var_grad', + v_g_norm2_ratio) + + return apply_gradients_op + + def post_process_grads(self, grads_and_vars, loss_scale): + + g_and_v_scaled = [] + for g, v in grads_and_vars: + g = g / loss_scale + g_and_v_scaled.append((g,v)) + + # Lars + if self._use_lars: + grad_var_list = [] + #-----------------------------------------------LARS and weight decay----------------------------------- + for g, var in g_and_v_scaled: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + grad_norm = tf.norm(g,ord='euclidean') + weight_norm = tf.norm(var,ord='euclidean') + + grad_norm_wd = tf.add( grad_norm, tf.multiply( self._weight_decay, weight_norm ) ) + rescale_factor = tf.div( tf.multiply(0.001, weight_norm), tf.add(grad_norm_wd, tf.constant(1e-5, tf.float32)) ) + + coeffi = tf.clip_by_value( rescale_factor, 0.001, 50.0 ) + decayed_g = tf.add( g, tf.multiply( self._weight_decay, var ) ) + + g = tf.multiply(coeffi, decayed_g) + else: + g = self._bn_lr_scale * g + + g_and_v = ( g, var ) + grad_var_list.append( g_and_v ) + #-------------------------------------------LARS end--------------------------------- + return grad_var_list + else: + grad_var_list_without_lars = [] + #----------------------------------------weight decay----------------------------------- + for g, var in g_and_v_scaled: + if 'BatchNorm' not in var.name and 'bias' not in var.name: + decayed_g = tf.add( g, tf.multiply( self._weight_decay, var ) ) + g = decayed_g + else: + g = self._bn_lr_scale * g + + g_and_v = ( g, var ) + grad_var_list_without_lars.append( g_and_v ) + + return grad_var_list_without_lars diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/results/res50_baseline/resnet50.log b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/results/res50_baseline/resnet50.log new file mode 100644 index 0000000..d94c637 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/results/res50_baseline/resnet50.log @@ -0,0 +1,3 @@ +PY3.6.1 (default, Jun 6 2019, 16:37:03) +[GCC 4.8.5 20150623 (EulerOS 4.8.5-28)]TF1.12.0 +Step Epoch Speed Loss FinLoss LR diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/gpu_base_trainer.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/gpu_base_trainer.py new file mode 100644 index 0000000..099d4b0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/gpu_base_trainer.py @@ -0,0 +1,189 @@ +import tensorflow as tf +import math +import time +from . import train_helper +from .train_helper import stage +from utils.logger import rank0log +from benchmark_log import hwlog +#from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_config import NPURunConfig +#from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +#from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + +class GPUBaseTrain(object): + def __init__(self, session, config, data, model, logger): + self.sess = session + self.config = config + self.data = data + self.model = model + self.logger = logger + self.print_logger = self.logger.logger + self.all_preds = [] + self.all_targets = [] + if self.config['accelerator'] == 'gpu': + self.classifier, self.training_hook = self.get_classifier() + else: + # from tensorflow.contrib.offline_train.python.npu.npu_config import NPURunConfig + from npu_bridge.estimator.npu.npu_config import NPURunConfig + # from tensorflow.contrib.offline_train.python.npu.npu_estimator import NPUEstimator + from npu_bridge.estimator.npu.npu_estimator import NPUEstimator +# from tensorflow.contrib.offline_train.python.npu.npu_optimizer import NPUDistributedOptimizer + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + self.classifier, self.training_hook = self.get_npu_classifier() + + + + def get_classifier(self): + classifier = tf.estimator.Estimator( + model_fn=self.model.get_estimator_model_func, + model_dir=self.config['log_dir'], + config = tf.estimator.RunConfig( + session_config=self.sess.get_config(), + save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + keep_checkpoint_max=None + ) + ) + + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def get_npu_classifier(self): + session_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True,) + + + if self.config['debug'] : + run_config = NPURunConfig(hcom_parallel=True, precision_mode="allow_mix_precision", enable_data_pre_proc=True, save_checkpoints_steps=112590, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop'], keep_checkpoint_max=5) + else : + run_config = NPURunConfig(hcom_parallel=True, precision_mode="allow_mix_precision", save_summary_steps=0, log_step_count_steps=None, enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir'], iterations_per_loop=self.config['iterations_per_loop']) +# run_config = NPURunConfig(enable_data_pre_proc=True,save_checkpoints_secs=1e9, session_config=session_config, model_dir = self.config['model_dir']) + + # classifier = tf.estimator.Estimator( + # model_fn=self.model.get_estimator_model_func, + # model_dir=self.config['log_dir'], + # config = tf.estimator.RunConfig( + # session_config=self.sess.get_config(), + # save_summary_steps=self.config['save_summary_steps'] if self.config['do_checkpoint'] else None, + # save_checkpoints_steps=self.config['save_checkpoints_steps'] if self.config['do_checkpoint'] else None, + # keep_checkpoint_max=None + # ) + # ) + + classifier =NPUEstimator( + model_fn= self.model.get_estimator_model_func, + config= run_config + ) + + training_hooks = [] + if self.config['debug']: + training_hooks = [train_helper.PrefillStagingAreasHook()] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def train(self): + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=self.config['num_epochs']) + print ('training steps: %d' % self.config['nstep']) + self.classifier.train( input_fn=lambda:self.data.get_train_input_fn(), + max_steps = self.config['nstep'], + hooks = self.training_hook + ) + + def evaluate(self): + rank0log(self.print_logger, "Evaluating") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + try: + ckpts = train_helper.sort_and_load_ckpts(self.config['log_dir']) + print("=========ckpt==========") + print(ckpts) + print("=========ckpt==========") + for i, c in enumerate(ckpts): + if i < len(ckpts) - 1: + if i % self.config['eval_interval'] != 0: + continue + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['global_batch_size']))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + for i, c in enumerate(ckpts): + if 'top1' not in c: + continue + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + rank0log(self.print_logger, "Finished evaluation") + except KeyboardInterrupt: + self.print_logger.error("Keyboard interrupt") + + def train_and_evaluate(self): + success = False + epochs_between_evals = self.config.get('epochs_between_evals', 4) + + + for i in range(self.config['num_epochs'] // epochs_between_evals): + + rank0log(self.print_logger, "Starting a training cycle") + # add by zwx5326390 + itepoches = 0 + itepoches += self.config['num_epochs'] + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=itepoches) + + self.classifier.train(input_fn=lambda:self.data.get_train_input_fn(), + steps = self.config['nsteps_per_epoch']*epochs_between_evals, + hooks = self.training_hook ) + + rank0log(self.print_logger, "Starting to evaluate") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.config['num_evaluating_samples'] )) + time.sleep(5) # a little extra margin... + + ckpts = train_helper.sort_and_load_ckpts(self.config['log_dir']) + c = ckpts[-1] + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + + c['epoch'] = math.ceil(c['step'] / (self.config['num_training_samples']/ (self.config['global_batch_size']))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + if eval_result['val-top1acc']*100 > self.config.get('stop_threshold', 74.9): + success = True + break + + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/train_helper.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/train_helper.py new file mode 100644 index 0000000..8d1fa8f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/trainers/train_helper.py @@ -0,0 +1,39 @@ +import tensorflow as tf +from tensorflow.python.ops import data_flow_ops +import re +import os +from operator import itemgetter + +class PrefillStagingAreasHook(tf.train.SessionRunHook): + def after_create_session(self, session, coord): + enqueue_ops = tf.get_collection('STAGING_AREA_PUTS') + for i in range(len(enqueue_ops)): + session.run(enqueue_ops[:i + 1]) + +def stage(tensors): + """Stages the given tensors in a StagingArea for asynchronous put/get. + """ + stage_area = data_flow_ops.StagingArea( + dtypes=[tensor.dtype for tensor in tensors], + shapes=[tensor.get_shape() for tensor in tensors]) + put_op = stage_area.put(tensors) + get_tensors = stage_area.get() + tf.add_to_collection('STAGING_AREA_PUTS', put_op) + return put_op, get_tensors + + +def sort_and_load_ckpts(log_dir): + ckpts = [] + for f in os.listdir(log_dir): + m = re.match(r'model.ckpt-([0-9]+).index', f) + if m is None: + continue + fullpath = os.path.join(log_dir, f) + ckpts.append({'step': int(m.group(1)), + 'path': os.path.splitext(fullpath)[0], + 'mtime': os.stat(fullpath).st_mtime, + }) + ckpts.sort(key=itemgetter('step')) + return ckpts + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/__init__.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/create_session.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/create_session.py new file mode 100644 index 0000000..7f2ff17 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/create_session.py @@ -0,0 +1,43 @@ +import tensorflow as tf +import os,sys + +class CreateSession(): + def __init__(self, config): + self.config = config + + if self.config['accelerator'] == '1980': + from tensorflow.python.client import device_lib + from npu_bridge.estimator import npu_ops + # self.estimator_config = tf.ConfigProto(allow_soft_placement=True, min_group_size=20, use_off_line=True) + self.estimator_config = tf.ConfigProto(allow_soft_placement=True) + else: + self.estimator_config = tf.ConfigProto(allow_soft_placement=False) + + self.estimator_config.gpu_options.allow_growth = True + + if self.config['accelerator'] == '1980': + local_device_protos = device_lib.list_local_devices(self.estimator_config) + + self.set_env() + + + def set_env(self): + # TODO, get env from config file + gpu_thread_count = 2 + os.environ['TF_GPU_THREAD_MODE'] = 'gpu_private' + os.environ['TF_GPU_THREAD_COUNT'] = str(gpu_thread_count) + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1' + + # barrier = self.hvd.allreduce(tf.constant(0, dtype=tf.float32)) + # tf.Session(config=self.estimator_config).run(barrier) + + + def get_config(self): + self.estimator_config.gpu_options.visible_device_list = str(0) +# self.estimator_config.gpu_options.force_gpu_compatible = True # Force pinned memory + self.estimator_config.intra_op_parallelism_threads = 1 # Avoid pool of Eigen threads + self.estimator_config.inter_op_parallelism_threads = 5 + return self.estimator_config + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/logger.py b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/logger.py new file mode 100644 index 0000000..349c71d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/code/resnet50_train/utils/logger.py @@ -0,0 +1,87 @@ +from __future__ import print_function +import tensorflow as tf +import logging +import numpy as np +import time +import sys,os +from benchmark_log import hwlog +class LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, config, warmup_steps=5): + # def __init__(self, global_batch_size, num_records, display_every=10, logger=None): + self.global_batch_size = config['global_batch_size'] + self.iterations_per_loop = config['iterations_per_loop'] + self.warmup_steps = warmup_steps + self.iter_times = [] + self.num_records = config['num_training_samples'] + self.display_every = config['display_every'] + self.logger = get_logger(config['log_name'], config['log_dir']) + rank0log(self.logger, 'PY' + str(sys.version) + 'TF' + str(tf.__version__)) + + + + def after_create_session(self, session, coord): + rank0log(self.logger, 'Step Epoch Speed Loss FinLoss LR') + self.elapsed_secs = 0. + self.count = 0 + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=[tf.train.get_global_step(), 'loss:0', 'total_loss:0', 'learning_rate:0']) +# 'loss:0', 'loss:0', 'learning_rate:0']) + + def after_run(self, run_context, run_values): + batch_time = time.time() - self.t0 + self.iter_times.append(batch_time) + self.elapsed_secs += batch_time + self.count += 1 + global_step, loss, total_loss, lr = run_values.results + if global_step == 1 or global_step % self.display_every == 0: + dt = self.elapsed_secs / self.count + img_per_sec = self.global_batch_size * self.iterations_per_loop / dt + epoch = global_step * self.global_batch_size / self.num_records + self.logger.info('step:%6i epoch:%5.1f FPS:%7.1f loss:%6.3f total_loss:%6.3f lr:%7.5f' % + (global_step, epoch, img_per_sec, loss, total_loss, lr)) + self.elapsed_secs = 0. + self.count = 0 + hwlog.remark_print(key=hwlog.FPS, value='%7.1f' % img_per_sec) + + def get_average_speed(self): + avg_time = np.mean(self.iter_times[self.warmup_steps:]) + speed = self.global_batch_size / avg_time + return speed + + + +def rank0log(logger, *args, **kwargs): + if logger: + logger.info(''.join([str(x) for x in list(args)])) + else: + print(*args, **kwargs) + + +def get_logger(log_name, log_dir): + logger = logging.getLogger(log_name) + logger.setLevel(logging.INFO) # INFO, ERROR + # file handler which logs debug messages + if not os.path.isdir(log_dir): + try: + os.makedirs(log_dir) + except FileExistsError: + # if log_dir is common for multiple ranks like on nfs + pass + # console handler + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + # add formatter to the handlers + # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + formatter = logging.Formatter('%(message)s') + ch.setFormatter(formatter) + logger.addHandler(ch) + fh = logging.FileHandler(os.path.join(log_dir, log_name)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(formatter) + # add handlers to logger + logger.addHandler(fh) + return logger + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..bf0d716 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/config/npu_set_env.sh @@ -0,0 +1,41 @@ +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +#export RANK_SIZE={RANK_SIZE} +#export RANK_INDEX={RANK_INDEX} +#export RANK_ID={RANK_ID} + +# profiling env +export PROFILING_MODE={PROFILING_MODE} +export AICPU_PROFILING_MODE={AICPU_PROFILING_MODE} +export PROFILING_OPTIONS={PROFILING_OPTIONS} +export FP_POINT={FP_POINT} +export BP_POINT={BP_POINT} + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/run.sh new file mode 100644 index 0000000..9226a23 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/run.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +#export RANK_ID=npu${rank_size}p + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +data_url_new=`echo ${data_url//\//\\\\/}` +echo ${data_url} +echo ${max_steps} +echo ${epoches} +if [ x"${CLUSTER}" == x"True" ];then + jsonFilePath=${currentDir}/code/resnet50_train/configs/res50_256bs_16p.py +elif [ ${rank_size} -le 1 ];then + jsonFilePath=${currentDir}/code/resnet50_train/configs/res50_256bs_1p.py +elif [ ${rank_size} -le 2 ];then + jsonFilePath=${currentDir}/code/resnet50_train/configs/res50_256bs_2p.py +elif [ ${rank_size} -le 4 ];then + jsonFilePath=${currentDir}/code/resnet50_train/configs/res50_256bs_4p.py +else + jsonFilePath=${currentDir}/code/resnet50_train/configs/res50_256bs_8p.py +fi + +#echo "jsonfilepath is "${jsonFilePath} +sed -i "s/data_url.*$/data_url\': \'${data_url_new}\',/g" ${jsonFilePath} +#sed -i "s/max_train_steps.*$/max_train_steps\': ${max_steps},/g" ${jsonFilePath} +sed -i "s/num_epochs.*$/num_epochs\': ${epoches},/g" ${jsonFilePath} +sed -i "s/epochs_between_evals.*$/epochs_between_evals\': ${epochs_between_evals},/g" ${jsonFilePath} +sed -i "0,/mode.*$/s//mode\': \'${mode}\',/g" ${jsonFilePath} +sed -i 's/\r//g' ${jsonFilePath} +sed -i "0,/batch_size.*$/s//batch_size\': ${batch_size},/" ${jsonFilePath} + +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 或大于等于 8p 时根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/0/hw_resnet50_hc.log ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$this_ip" != x"$ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/0/hw_resnet50_hc.log ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id& + let rank_id++ + done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/train.sh new file mode 100644 index 0000000..3974d99 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/Resnet50_HC/tensorflow/scripts/train.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +mkdir -p ${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_resnet50_hc/training_job_${currtime}/ + + +source ${currentDir}/config/npu_set_env.sh + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# 声明变量 +export REMARK_LOG_FILE=hw_resnet50_hc.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + + + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export YAML_PATH=$3 +export MODEL_CKPT_PATH=${currentDir}/result/ckpt${device_id} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` +#cd ${currentDir}/code +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + export CLUSTER=True + # 多卡多机 + rm -rf ${currentDir}/result/*.log + rm -rf ${currentDir}/code/core.* + python3.7 ${currentDir}/code/resnet50_train/mains/res50.py --config_file=res50_256bs_16p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=True --model_dir=./ckpt > ${train_job_dir}/train_${device_id}.log 2>&1 + +elif [ ${rank_size} -le 1 ];then + # 单卡 + + python3.7 ${currentDir}/code/resnet50_train/mains/res50.py --config_file=res50_256bs_1p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=False --model_dir=./ckpt > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 2 ];then + # 单卡 + python3.7 ${currentDir}/code/resnet50_train/mains/res50.py --config_file=res50_256bs_2p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=False --model_dir=./ckpt > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 4 ];then + # 单卡 + python3.7 ${currentDir}/code/resnet50_train/mains/res50.py --config_file=res50_256bs_4p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=False --model_dir=./ckpt > ${train_job_dir}/train_${device_id}.log 2>&1 +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + python3.7 ${currentDir}/code/resnet50_train/mains/res50.py --config_file=res50_256bs_8p --max_train_steps=${max_steps} --iterations_per_loop=1000 --debug=True --eval=True --model_dir=./ckpt > ${train_job_dir}/train_${device_id}.log 2>&1 +fi +#cp ./hw_resnet50_hc.log ${currentDir}/../../../../performance/ + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 resnet50_hc train success" + echo ":::ABK 1.0.0 resnet50_hc train success" >> ${train_job_dir}/${device_id}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50_hc train success" >> ${train_job_dir}/${device_id}/hw_resnet50_hc.log +else + echo ":::ABK 1.0.0 resnet50_hc train failed" + echo ":::ABK 1.0.0 resnet50_hc train failed" >> ${train_job_dir}/${device_id}/train_${device_id}.log + echo ":::ABK 1.0.0 resnet50_hc train failed" >> ${train_job_dir}/${device_id}/hw_resnet50_hc.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ${hour}:${min}:${sec} +echo ":::ABK 1.0.0 resnet50_hc train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_resnet50_hc.log + + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/__init__.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/README.md b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/README.md new file mode 100644 index 0000000..7cfc001 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/README.md @@ -0,0 +1,35 @@ +# ShuffleNet_pytorch训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/ShuffleNet.yaml中修改相应配置, 配置项含义: + +``` +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + #跑1p时batch_size为1024, 2p为2048,4p为4096,8p时为8196 + batch_size: 1024 + epoches: 240 + epochs_between_evals: 5 + # 默认参数1p 0.5 2p 1 4p 2 8p 4 + lr: 0.5 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同,目前,只有shufflenet 的1p支持指定device id,多p不支持指定device id。 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main.py new file mode 100644 index 0000000..75c3fde --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main.py @@ -0,0 +1,541 @@ +# -*- coding: utf-8 -*- + +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import models as models +import numpy as np + +from apex import amp +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +BATCH_SIZE = 512 +OPTIMIZER_BATCH_SIZE = 2048 +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('--workspace', type=str, default='./', metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, + help='npu or gpu') +parser.add_argument('--addr', default='10.136.181.115', type=str, + help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, + help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=0, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') +parser.add_argument('--device_num', default=-1, type=int, + help='device_num') +parser.add_argument('--warm_up_epochs', default=0, type=int, + help='warm up') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=64., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + +warnings.filterwarnings('ignore') +best_acc1 = 0 + + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + + os.environ['KERNEL_NAME_ID'] = str(0) + print("+++++++++++++++++++++++++++KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '29688' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + if args.device_num != -1: + ngpus_per_node = args.device_num + elif args.device == 'npu': + ngpus_per_node = torch.npu.device_count() + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + print("[npu id:", args.gpu, "]", "+++++++++++++++++++++++++++ before set KERNEL_NAME_ID:", + os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(gpu) + print("[npu id:", args.gpu, "]", "+++++++++++++++++++++++++++KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[npu id:", args.gpu, "]", "Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, # init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + print("[npu id:", args.gpu, "]", args) + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, drop_last=True) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=True, + num_workers=args.workers, pin_memory=True, drop_last=True) + + # create model + print("[npu id:", args.gpu, "]", "=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + # model = densenet121() + model = model.to(loc) + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, model, criterion, optimizer, epoch, args, ngpus_per_node) + + if (epoch + 1) % (args.eval_freq) == 0 or epoch == args.epochs - 1: + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0 or epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + +def train(train_loader, model, criterion, optimizer, epoch, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e', start_count_index=0) + top1 = AverageMeter('Acc@1', ':6.2f', start_count_index=0) + top5 = AverageMeter('Acc@5', ':6.2f', start_count_index=0) + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + end = time.time() + if args.benchmark == 1: + optimizer.zero_grad() + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + + # compute output + output = model(images) + + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0: + optimizer.zero_grad() + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + if args.benchmark == 0: + optimizer.step() + elif args.benchmark == 1: + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '* FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + + +def validate(val_loader, model, criterion, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f', start_count_index=0) + losses = AverageMeter('Loss', ':.4e', start_count_index=0) + top1 = AverageMeter('Acc@1', ':6.2f', start_count_index=0) + top5 = AverageMeter('Acc@5', ':6.2f', start_count_index=0) + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + + loc = 'npu:{}'.format(args.gpu) + target = target.to(torch.int32) + images, target = images.to(loc, non_blocking=False), target.to(loc, non_blocking=False) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar' % (state['best_acc1'], state['epoch'])) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self, name, fmt=':f', start_count_index=10): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = start_count_index + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.count += n + if self.count > (self.start_count_index * n): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * n) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[npu id:", os.environ['KERNEL_NAME_ID'], "]", '\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.1 ** (epoch // (args.epochs//3 - 3))) + + if args.warm_up_epochs > 0 and epoch < args.warm_up_epochs: + lr = args.lr * ((epoch+1) / (args.warm_up_epochs+1)) + else: + alpha = 0 + cosine_decay = 0.5 * ( + 1 + np.cos(np.pi * (epoch - args.warm_up_epochs) / (args.epochs - args.warm_up_epochs))) + decayed = (1 - alpha) * cosine_decay + alpha + lr = args.lr * decayed + + print("=> Epoch[%d] Setting lr: %.4f" % (epoch, lr)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 4, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 64} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main_med.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main_med.py new file mode 100644 index 0000000..674f36c --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/8p_main_med.py @@ -0,0 +1,605 @@ +# -*- coding: utf-8 -*- + +import argparse +import os +import random +import shutil +import time +import warnings + +import numpy as np + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import models as models +import numpy as np + +from apex import amp +from multi_epochs_dataloader import MultiEpochsDataLoader +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +BATCH_SIZE = 512 +OPTIMIZER_BATCH_SIZE = 2048 +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('--data', metavar='DIR', default='/opt/npu/dataset/imagenet', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet50', + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=32, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=BATCH_SIZE, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('--workspace', type=str, default='./', metavar='DIR', + help='path to directory where checkpoints will be stored') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('-ef', '--eval-freq', default=5, type=int, + metavar='N', help='evaluate frequency (default: 5)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') +parser.add_argument('-bm', '--benchmark', default=0, type=int, + metavar='N', help='set benchmark status (default: 1,run benchmark)') +parser.add_argument('--device', default='npu', type=str, help='npu or gpu') +parser.add_argument('--addr', default='10.136.181.115', type=str, help='master addr') +parser.add_argument('--checkpoint-nameprefix', default='checkpoint', type=str, help='checkpoint-nameprefix') +parser.add_argument('--checkpoint-freq', default=0, type=int, + metavar='N', help='checkpoint frequency (default: 0)' + '0: save only one file whitch per epoch;' + 'n: save diff file per n epoch' + '-1:no checkpoint,not support') +parser.add_argument('--device_num', default=-1, type=int, + help='device_num') +parser.add_argument('--device-list', default='', type=str, help='device id list') +parser.add_argument('--warm_up_epochs', default=0, type=int, + help='warm up') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss-scale', default=64., type=float, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt-level', default='O2', type=str, + help='loss scale using in amp, default -1 means dynamic') + +warnings.filterwarnings('ignore') +best_acc1 = 0 + + +def main(): + args = parser.parse_args() + print("===============main()=================") + print(args) + print("===============main()=================") + + os.environ['KERNEL_NAME_ID'] = str(0) + print("+++++++++++++++++++++++++++KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + os.environ['MASTER_ADDR'] = args.addr # '10.136.181.51' + os.environ['MASTER_PORT'] = '29688' + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + if args.device_list != '': + ngpus_per_node = len(args.device_list.split(',')) + elif args.device_num != -1: + ngpus_per_node = args.device_num + elif args.device == 'npu': + ngpus_per_node = torch.npu.device_count() + else: + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + # The child process uses the environment variables of the parent process, + # we have to set KERNEL_NAME_ID for every proc + if args.device == 'npu': + # main_worker(args.gpu, ngpus_per_node, args) + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + + if args.device_list != '': + args.gpu = int(args.device_list.split(',')[gpu]) + else: + args.gpu = gpu + + print("[npu id:", args.gpu, "]", "++++++++++++++++ before set KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + os.environ['KERNEL_NAME_ID'] = str(args.gpu) + print("[npu id:", args.gpu, "]", "++++++++++++++++ KERNEL_NAME_ID:", os.environ['KERNEL_NAME_ID']) + + if args.gpu is not None: + print("[npu id:", args.gpu, "]", "Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + + if args.device == 'npu': + dist.init_process_group(backend=args.dist_backend, # init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + else: + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + + loc = 'npu:{}'.format(args.gpu) + torch.npu.set_device(loc) + + args.batch_size = int(args.batch_size / ngpus_per_node) + args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + print("[npu id:", args.gpu, "]", args) + print("[npu id:", args.gpu, "]", "===============main_worker()=================") + + train_loader, train_loader_len, train_sampler = get_pytorch_train_loader(args.data, + args.batch_size, + workers=args.workers, + distributed=args.distributed) + + val_loader = get_pytorch_val_loader(args.data, args.batch_size, args.workers, distributed=False) + + # create model + print("[npu id:", args.gpu, "]", "=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + model = model.to(loc) + + # define loss function (criterion) and optimizer + criterion = nn.CrossEntropyLoss().to(loc) + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.amp: + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu], broadcast_buffers=False) + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + if args.amp: + amp.load_state_dict(checkpoint['amp']) + print("=> loaded checkpoint '{}' (epoch {})".format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + cudnn.benchmark = True + + if args.evaluate: + validate(val_loader, model, criterion, args, ngpus_per_node) + return + + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + adjust_learning_rate(optimizer, epoch, args) + + # train for one epoch + train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node) + + if (epoch + 1) % args.eval_freq == 0 or epoch == args.epochs - 1 or epoch > int(args.epochs * 0.9): + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args, ngpus_per_node) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0 or epoch == args.epochs - 1): + if args.amp: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + 'amp': amp.state_dict(), + }, is_best) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + 'optimizer': optimizer.state_dict(), + }, is_best) + + +def train(train_loader, train_loader_len, model, criterion, optimizer, epoch, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + data_time = AverageMeter('Data', ':6.3f') + losses = AverageMeter('Loss', ':.4e', start_count_index=0) + top1 = AverageMeter('Acc@1', ':6.2f', start_count_index=0) + top5 = AverageMeter('Acc@5', ':6.2f', start_count_index=0) + progress = ProgressMeter( + train_loader_len, + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + loc = 'npu:{}'.format(args.gpu) + + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + # switch to train mode + model.train() + end = time.time() + if args.benchmark == 1: + optimizer.zero_grad() + + steps_per_epoch = train_loader_len + print('==========step per epoch======================', steps_per_epoch) + for i, (images, target) in enumerate(train_loader): + # measure data loading time + data_time.update(time.time() - end) + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + if args.benchmark == 0: + optimizer.zero_grad() + + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + stream = torch.npu.current_stream() + stream.synchronize() + + if args.benchmark == 0: + optimizer.step() + elif args.benchmark == 1: + BATCH_SIZE_multiplier = int(OPTIMIZER_BATCH_SIZE / args.batch_size) + BM_optimizer_step = ((i + 1) % BATCH_SIZE_multiplier) == 0 + if BM_optimizer_step: + for param_group in optimizer.param_groups: + for param in param_group['params']: + param.grad /= BATCH_SIZE_multiplier + optimizer.step() + optimizer.zero_grad() + stream = torch.npu.current_stream() + stream.synchronize() + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + progress.display(i) + + + if not args.multiprocessing_distributed or (args.multiprocessing_distributed + and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '* FPS@all {:.3f}, TIME@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg, batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(ngpus_per_node * args.batch_size / batch_time.avg)) + + +def validate(val_loader, model, criterion, args, ngpus_per_node): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e', start_count_index=0) + top1 = AverageMeter('Acc@1', ':6.2f', start_count_index=0) + top5 = AverageMeter('Acc@5', ':6.2f', start_count_index=0) + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + + with torch.no_grad(): + loc = 'npu:{}'.format(args.gpu) + mean = torch.tensor([0.485 * 255, 0.456 * 255, 0.406 * 255]).view(1, 3, 1, 1) + std = torch.tensor([0.229 * 255, 0.224 * 255, 0.225 * 255]).view(1, 3, 1, 1) + mean = mean.to(loc, non_blocking=True) + std = std.to(loc, non_blocking=True) + + end = time.time() + for i, (images, target) in enumerate(val_loader): + + target = target.to(torch.int32) + images = images.to(loc, non_blocking=True).to(torch.float).sub(mean).div(std) + target = target.to(loc, non_blocking=True) + + # compute output + output = model(images) + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + if not args.multiprocessing_distributed or \ + (args.multiprocessing_distributed and args.rank % ngpus_per_node == 0): + print("[npu id:", args.gpu, "]", '[AVG-ACC] * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): + torch.save(state, filename) + if is_best: + shutil.copyfile(filename, 'model_best_acc%.4f_epoch%d.pth.tar' % (state['best_acc1'], state['epoch'])) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self, name, fmt=':f', start_count_index=10): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = start_count_index + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + if self.count == 0: + self.N = n + + self.val = val + self.count += n + if self.count > (self.start_count_index * self.N): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * self.N) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print("[npu id:", os.environ['KERNEL_NAME_ID'], "]", '\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + # lr = args.lr * (0.1 ** (epoch // (args.epochs//3 - 3))) + + if args.warm_up_epochs > 0 and epoch < args.warm_up_epochs: + lr = args.lr * ((epoch + 1) / (args.warm_up_epochs + 1)) + else: + alpha = 0 + cosine_decay = 0.5 * ( + 1 + np.cos(np.pi * (epoch - args.warm_up_epochs) / (args.epochs - args.warm_up_epochs))) + decayed = (1 - alpha) * cosine_decay + alpha + lr = args.lr * decayed + + print("=> Epoch[%d] Setting lr: %.4f" % (epoch, lr)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +def fast_collate(batch): + imgs = [img[0] for img in batch] + targets = torch.tensor([target[1] for target in batch], dtype=torch.int64) + w = imgs[0].size[0] + h = imgs[0].size[1] + tensor = torch.zeros((len(imgs), 3, h, w), dtype=torch.uint8) + for i, img in enumerate(imgs): + nump_array = np.asarray(img, dtype=np.uint8) + if nump_array.ndim < 3: + nump_array = np.expand_dims(nump_array, axis=-1) + nump_array = np.rollaxis(nump_array, 2) + + tensor[i] += torch.from_numpy(nump_array) + + return tensor, targets + + +def get_pytorch_train_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + traindir = os.path.join(data_path, 'train') + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2), + transforms.RandomHorizontalFlip(), + ])) + + if distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + train_loader = dataloader_fn( + train_dataset, batch_size=batch_size, shuffle=(train_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, sampler=train_sampler, + collate_fn=fast_collate, drop_last=True) + return train_loader, len(train_loader), train_sampler + + +def get_pytorch_val_loader(data_path, batch_size, workers=5, _worker_init_fn=None, distributed=False): + valdir = os.path.join(data_path, 'val') + val_dataset = datasets.ImageFolder( + valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + ])) + + if distributed: + val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset) + else: + val_sampler = None + + dataloader_fn = MultiEpochsDataLoader # torch.utils.data.DataLoader + val_loader = dataloader_fn( + val_dataset, + sampler=val_sampler, + batch_size=batch_size, shuffle=(val_sampler is None), + num_workers=workers, worker_init_fn=_worker_init_fn, pin_memory=True, collate_fn=fast_collate) + + return val_loader + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = { "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 64} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/README.md b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/README.md new file mode 100644 index 0000000..f658759 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/README.md @@ -0,0 +1,60 @@ +# ImageNet training in PyTorch + +This implements training of ShuffleNetV2 on the ImageNet dataset, mainly modified from [pytorch/examples](https://github.com/pytorch/examples/tree/master/imagenet). + +## ShuffleNet Detail +As of the current date, Ascend-Pytorch is still inefficient for contiguous operations. +Therefore, ShufflenetV2 is re-implemented using semantics such as custom OP. For details, see models/shufflenetv2_wock_op_woct.py . + + +## Requirements + +- Install PyTorch ([pytorch.org](http://pytorch.org)) +- `pip install -r requirements.txt` +- Download the ImageNet dataset from http://www.image-net.org/ + - Then, and move validation images to labeled subfolders, using [the following shell script](https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh) + +## Training 1p + +To train a model, run `main.py` with the desired model architecture and the path to the ImageNet dataset: + +```bash +# FP32 training +bash 1p.sh + +# O2 training +bash 1p_amp.sh + +# FP32 training for 20 epoch experiment +bash 1p_20e.sh + +# FP32 training for 20 epoch experiment +bash 1p_20e_amp.sh + +``` + +## Training multi-cards +```bash +# O2 training 2p +# Only Support device-list setting in [[0,1], [2,3], [4,5], [6,7]] +bash 2p_amp_med.sh + +# O2 training 4p +# Only Support device-list setting in [[0,1,2,3], [4,5,6,7]] +bash 4p_amp_med.sh + +# O2 training 8p +bash 8p_amp_med.sh + +``` + +## ShufflenetV2 training result + +| Acc@1 | FPS | Npu_nums| Epochs | Type | +| :------: | :------: | :------ | :------: | :------: | +| 61.5 | 1200 | 1 | 20 | O2 | +| 68.5 | 2200 | 1 | 240 | O2 | +| 66.3 | 14000 | 1 | 240 | O2 | + + + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/main.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/main.py new file mode 100644 index 0000000..3a3cd73 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/main.py @@ -0,0 +1,649 @@ +import argparse +import os +import random +import shutil +import time +import warnings + +import torch +import torch.nn as nn +import torch.nn.parallel +import torch.backends.cudnn as cudnn +import torch.distributed as dist +import torch.optim +import torch.multiprocessing as mp +import torch.utils.data +import torch.utils.data.distributed +import torchvision.transforms as transforms +import torchvision.datasets as datasets +import models as models + +# Apex +import numpy as np +from apex import amp + +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +# from megvii repo +class CrossEntropyLabelSmooth(nn.Module): + def __init__(self, num_classes, epsilon): + super(CrossEntropyLabelSmooth, self).__init__() + self.num_classes = num_classes + self.epsilon = epsilon + # self.logsoftmax = nn.LogSoftmax(dim=1) + + def forward(self, inputs, targets): + # log_probs = self.logsoftmax(inputs) + # targets = torch.zeros_like(log_probs).scatter_(1, targets.unsqueeze(1), 1) + # targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes + # loss = (-targets * log_probs).mean(0).sum() + # return loss + + logprobs = torch.nn.functional.log_softmax(inputs, dim=-1).to("cpu") + targets = torch.zeros_like(logprobs).scatter_(1, targets.unsqueeze(1), 1) + targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes + loss = (-targets * logprobs).mean(0).sum() + return loss + + + +model_names = sorted(name for name in models.__dict__ + if name.islower() and not name.startswith("__") + and callable(models.__dict__[name])) + +parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') +parser.add_argument('data', metavar='DIR', + help='path to dataset') +parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', + choices=model_names, + help='model architecture: ' + + ' | '.join(model_names) + + ' (default: resnet18)') +parser.add_argument('-j', '--workers', default=8, type=int, metavar='N', + help='number of data loading workers (default: 4)') +parser.add_argument('--epochs', default=90, type=int, metavar='N', + help='number of total epochs to run') +parser.add_argument('--start-epoch', default=0, type=int, metavar='N', + help='manual epoch number (useful on restarts)') +parser.add_argument('-b', '--batch-size', default=256, type=int, + metavar='N', + help='mini-batch size (default: 256), this is the total ' + 'batch size of all GPUs on the current node when ' + 'using Data Parallel or Distributed Data Parallel') +parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, + metavar='LR', help='initial learning rate', dest='lr') +parser.add_argument('--momentum', default=0.9, type=float, metavar='M', + help='momentum') +parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, + metavar='W', help='weight decay (default: 1e-4)', + dest='weight_decay') +parser.add_argument('-p', '--print-freq', default=10, type=int, + metavar='N', help='print frequency (default: 10)') +parser.add_argument('--resume', default='', type=str, metavar='PATH', + help='path to latest checkpoint (default: none)') +parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', + help='evaluate model on validation set') +parser.add_argument('--pretrained', dest='pretrained', action='store_true', + help='use pre-trained model') +parser.add_argument('--world-size', default=-1, type=int, + help='number of nodes for distributed training') +parser.add_argument('--rank', default=-1, type=int, + help='node rank for distributed training') +parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, + help='url used to set up distributed training') +parser.add_argument('--dist-backend', default='nccl', type=str, + help='distributed backend') +parser.add_argument('--seed', default=None, type=int, + help='seed for initializing training. ') +parser.add_argument('--gpu', default=None, type=int, + help='GPU id to use.') +parser.add_argument('--multiprocessing-distributed', action='store_true', + help='Use multi-processing distributed training to launch ' + 'N processes per node, which has N GPUs. This is the ' + 'fastest way to use PyTorch for either single node or ' + 'multi node data parallel training') + +# npu +parser.add_argument('--npu', default=None, type=int, + help='NPU id to use.') + +# add +parser.add_argument('--eval_between_epochs', default=1, type=int, + help='setting bigger interval to speed up training.') +parser.add_argument('--label_smooth', default=0, type=float, + help='label smoothing using in CE') +parser.add_argument('--lr_scheduler_type', default='step_epoch', type=str, + help='lr_scheduler type, such as linear,cosine') +parser.add_argument('--warm_up_epochs', default=0, type=int, + help='warm up') +parser.add_argument('--total_steps', default=-1, type=float, + help='warm up') +parser.add_argument('--save_path', default='./training/save', type=str, + help='save model base path') +parser.add_argument('--tb_path', default='./training/events', type=str, + help='save tensorboard events path') + +# apex +parser.add_argument('--amp', default=False, action='store_true', + help='use amp to train the model') +parser.add_argument('--loss_scale', default='dynamic', type=str, + help='loss scale using in amp, default -1 means dynamic') +parser.add_argument('--opt_level', default='O1', type=str, + help='opt_level using in amp, default O1.') + +best_acc1 = 0 + + +def main(): + args = parser.parse_args() + print(args) + + if args.seed is not None: + random.seed(args.seed) + torch.manual_seed(args.seed) + cudnn.deterministic = True + warnings.warn('You have chosen to seed training. ' + 'This will turn on the CUDNN deterministic setting, ' + 'which can slow down your training considerably! ' + 'You may see unexpected behavior when restarting ' + 'from checkpoints.') + + if args.gpu is not None: + warnings.warn('You have chosen a specific GPU. This will completely ' + 'disable data parallelism.') + + if args.dist_url == "env://" and args.world_size == -1: + args.world_size = int(os.environ["WORLD_SIZE"]) + + args.distributed = args.world_size > 1 or args.multiprocessing_distributed + + ngpus_per_node = torch.cuda.device_count() + if args.multiprocessing_distributed: + # Since we have ngpus_per_node processes per node, the total world_size + # needs to be adjusted accordingly + args.world_size = ngpus_per_node * args.world_size + # Use torch.multiprocessing.spawn to launch distributed processes: the + # main_worker process function + mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) + else: + # Simply call main_worker function + main_worker(args.gpu, ngpus_per_node, args) + + +def main_worker(gpu, ngpus_per_node, args): + global best_acc1 + args.gpu = gpu + + if args.gpu is not None: + print("Use GPU: {} for training".format(args.gpu)) + + if args.distributed: + if args.dist_url == "env://" and args.rank == -1: + args.rank = int(os.environ["RANK"]) + if args.multiprocessing_distributed: + # For multiprocessing distributed training, rank needs to be the + # global rank among all the processes + args.rank = args.rank * ngpus_per_node + gpu + dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, + world_size=args.world_size, rank=args.rank) + # create model + if args.pretrained: + print("=> using pre-trained model '{}'".format(args.arch)) + model = models.__dict__[args.arch](pretrained=True) + else: + print("=> creating model '{}'".format(args.arch)) + model = models.__dict__[args.arch]() + + + optimizer = torch.optim.SGD(model.parameters(), args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay) + + if args.gpu is not None: + torch.cuda.set_device(args.gpu) + model = model.cuda(args.gpu) + elif args.npu is not None: + torch.npu.set_device("npu:%d"%args.npu) + model = model.to("npu:%d"%args.npu) + # else: + # # DataParallel will divide and allocate batch_size to all available GPUs + # if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): + # model.features = torch.nn.DataParallel(model.features) + # model.cuda() + # else: + # model = torch.nn.DataParallel(model).cuda() + + # apex + if args.amp: + # Initialization + model, optimizer = amp.initialize(model, optimizer, opt_level=args.opt_level, loss_scale=args.loss_scale) + print("=> Using amp mode.") + + # if args.distributed: + # # For multiprocessing distributed, DistributedDataParallel constructor + # # should always set the single device scope, otherwise, + # # DistributedDataParallel will use all available devices. + # if args.gpu is not None: + # # torch.cuda.set_device(args.gpu) + # # model.cuda(args.gpu) + # # When using a single GPU per process and per + # # DistributedDataParallel, we need to divide the batch size + # # ourselves based on the total number of GPUs we have + # args.batch_size = int(args.batch_size / ngpus_per_node) + # args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) + # model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + # else: + # # model.cuda() + # # DistributedDataParallel will divide and allocate batch_size to all + # # available GPUs if device_ids are not set + # model = torch.nn.parallel.DistributedDataParallel(model) + + + # define loss function (criterion) and optimizer + if args.label_smooth > 0: + # criterion = CrossEntropyLabelSmooth(1000, 0.1).cuda(args.gpu) + criterion = CrossEntropyLabelSmooth(1000, 0.1).to("npu:%d"%args.npu) + else: + # criterion = nn.CrossEntropyLoss().cuda(args.gpu) + criterion = nn.CrossEntropyLoss().to("npu:%d"%args.npu) + + + + + # optionally resume from a checkpoint + if args.resume: + if os.path.isfile(args.resume): + print("=> loading checkpoint '{}'".format(args.resume)) + if args.gpu is None: + checkpoint = torch.load(args.resume) + else: + # Map model to be loaded to specified single gpu. + loc = 'cuda:{}'.format(args.gpu) + checkpoint = torch.load(args.resume, map_location=loc) + args.start_epoch = checkpoint['epoch'] + best_acc1 = checkpoint['best_acc1'] + if args.gpu is not None: + # best_acc1 may be from a checkpoint from a different GPU + best_acc1 = best_acc1.to(args.gpu) + model.load_state_dict(checkpoint['state_dict']) + optimizer.load_state_dict(checkpoint['optimizer']) + print("=> loaded checkpoint '{}' (epoch {})" + .format(args.resume, checkpoint['epoch'])) + else: + print("=> no checkpoint found at '{}'".format(args.resume)) + + # cudnn.benchmark = True + + # Data loading code + traindir = os.path.join(args.data, 'train') + valdir = os.path.join(args.data, 'val') + normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], + std=[0.229, 0.224, 0.225]) + + train_dataset = datasets.ImageFolder( + traindir, + transforms.Compose([ + transforms.RandomResizedCrop(224), + transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2), + transforms.RandomHorizontalFlip(), + transforms.ToTensor(), + normalize, + ])) + + if args.distributed: + train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) + else: + train_sampler = None + + train_loader = torch.utils.data.DataLoader( + train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), + num_workers=args.workers, pin_memory=True, sampler=train_sampler, + drop_last=True, + ) + + val_loader = torch.utils.data.DataLoader( + datasets.ImageFolder(valdir, transforms.Compose([ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + normalize, + ])), + batch_size=args.batch_size, shuffle=False, + num_workers=args.workers, pin_memory=True, + drop_last=True, + ) + + if args.evaluate: + validate(val_loader, model, criterion, args) + return + + global_step = args.start_epoch * len(train_loader) + if args.total_steps < 0: + args.total_steps = len(train_loader) * args.epochs + if args.warm_up_epochs > 0: + args.warm_up_steps = len(train_loader) * args.warm_up_epochs + else: + args.warm_up_steps = 0 + for epoch in range(args.start_epoch, args.epochs): + if args.distributed: + train_sampler.set_epoch(epoch) + + if 'epoch' in args.lr_scheduler_type: + if args.lr_scheduler_type in ['', 'step_epoch']: + adjust_learning_rate(optimizer, epoch, args) + else: + adjust_learning_rate_epoch(optimizer, args, epoch) + + + # train for one epoch + global_step = train(train_loader, model, criterion, optimizer, epoch, args, global_step=global_step) + + + if (epoch + 1) % args.eval_between_epochs == 0 or epoch > int(args.epochs * 0.9): + # evaluate on validation set + acc1 = validate(val_loader, model, criterion, args) + + # remember best acc@1 and save checkpoint + is_best = acc1 > best_acc1 + best_acc1 = max(acc1, best_acc1) + + model = model.to("cpu") + if args.multiprocessing_distributed: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + # 'optimizer' : optimizer.state_dict(), + }, is_best.to("cpu"), save_path=os.path.join(args.save_path, str(args.gpu))) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + # 'optimizer': optimizer.state_dict(), + }, is_best.to("cpu"), save_path=args.save_path) + else: + model = model.to("cpu") + if args.multiprocessing_distributed: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + # 'optimizer': optimizer.state_dict(), + }, False, save_path=os.path.join(args.save_path, str(args.gpu))) + else: + save_checkpoint({ + 'epoch': epoch + 1, + 'arch': args.arch, + 'state_dict': model.state_dict(), + 'best_acc1': best_acc1, + # 'optimizer': optimizer.state_dict(), + }, False, save_path=args.save_path) + + model = model.to("npu") + +def train(train_loader, model, criterion, optimizer, epoch, args, global_step): + batch_time = AverageMeter('Time', ':6.3f', start_count_index=10) + data_time = AverageMeter('Data', ':6.3f', start_count_index=10) + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(train_loader), + [batch_time, data_time, losses, top1, top5], + prefix="Epoch: [{}]".format(epoch)) + + # switch to train mode + model.train() + print('==> enter train mode.') + + end = time.time() + for i, (images, target) in enumerate(train_loader): + if 'epoch' not in args.lr_scheduler_type: + lr_step = adjust_learning_rate_step(optimizer, args, global_step) + + # measure data loading time + data_time.update(time.time() - end) + + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + target = target.cuda(args.gpu, non_blocking=True) + if args.npu is not None: + images = images.to("npu:%d" % args.npu, non_blocking=True) + if not args.label_smooth > 0: + target = target.to(torch.int32) + target = target.to("npu:%d" % args.npu, non_blocking=True) + + # compute output + output = model(images) + if args.label_smooth > 0: + loss = criterion(output, target).to("npu:%d" % args.npu, non_blocking=True) + else: + loss = criterion(output, target) + + # measure accuracy and record loss + if args.label_smooth > 0: + target = target.to(torch.int32) + target = target.to("npu:%d" % args.npu, non_blocking=True) + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # compute gradient and do SGD step + optimizer.zero_grad() + if args.amp: + with amp.scale_loss(loss, optimizer) as scaled_loss: + scaled_loss.backward() + else: + loss.backward() + + optimizer.step() + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + global_step += 1 + + # if i > 50: + # break + print("[npu id:", args.gpu, "]", '* FPS@all {:.3f}'.format(args.batch_size / batch_time.avg)) + hwlog.remark_print(key=hwlog.FPS, value=' * FPS@all {:.3f}'.format(args.batch_size / batch_time.avg)) + + + return global_step + +def validate(val_loader, model, criterion, args): + batch_time = AverageMeter('Time', ':6.3f') + losses = AverageMeter('Loss', ':.4e') + top1 = AverageMeter('Acc@1', ':6.2f') + top5 = AverageMeter('Acc@5', ':6.2f') + progress = ProgressMeter( + len(val_loader), + [batch_time, losses, top1, top5], + prefix='Test: ') + + # switch to evaluate mode + model.eval() + print('==> enter eval mode.') + + with torch.no_grad(): + end = time.time() + for i, (images, target) in enumerate(val_loader): + if args.gpu is not None: + images = images.cuda(args.gpu, non_blocking=True) + target = target.cuda(args.gpu, non_blocking=True) + if args.npu is not None: + target = target.to(torch.int32) + images = images.to("npu:%d" % args.npu, non_blocking=True) + target = target.to("npu:%d" % args.npu, non_blocking=True) + + # compute output + output = model(images) + if args.label_smooth > 0: + loss = criterion(output, target).to("npu:%d" % args.npu, non_blocking=True) + else: + loss = criterion(output, target) + + # measure accuracy and record loss + acc1, acc5 = accuracy(output, target, topk=(1, 5)) + losses.update(loss.item(), images.size(0)) + top1.update(acc1[0], images.size(0)) + top5.update(acc5[0], images.size(0)) + + # measure elapsed time + batch_time.update(time.time() - end) + end = time.time() + + if i % args.print_freq == 0: + progress.display(i) + + # TODO: this should also be done with the ProgressMeter + print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}' + .format(top1=top1, top5=top5)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value="{top1.avg:.3f}".format(top1=top1)) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value="{top5.avg:.3f}".format(top5=top5)) + return top1.avg + + +def save_checkpoint(state, is_best, filename='checkpoint.pth.tar', save_path='./'): + if not os.path.exists(save_path): + os.makedirs(save_path) + torch.save(state, os.path.join(save_path, filename)) + if is_best: + shutil.copyfile(os.path.join(save_path, filename), os.path.join(save_path, 'model_best_acc%.4f_epoch%d.pth.tar'%(state['best_acc1'], state['epoch']))) + + +class AverageMeter(object): + """Computes and stores the average and current value""" + + def __init__(self, name, fmt=':f', start_count_index=0): + self.name = name + self.fmt = fmt + self.reset() + self.start_count_index = start_count_index + + def reset(self): + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.count += n + if self.count > (self.start_count_index * n): + self.sum += val * n + self.avg = self.sum / (self.count - self.start_count_index * n) + + def __str__(self): + fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' + return fmtstr.format(**self.__dict__) + + +class ProgressMeter(object): + def __init__(self, num_batches, meters, prefix=""): + self.batch_fmtstr = self._get_batch_fmtstr(num_batches) + self.meters = meters + self.prefix = prefix + + def display(self, batch): + entries = [self.prefix + self.batch_fmtstr.format(batch)] + entries += [str(meter) for meter in self.meters] + print('\t'.join(entries)) + + def _get_batch_fmtstr(self, num_batches): + num_digits = len(str(num_batches // 1)) + fmt = '{:' + str(num_digits) + 'd}' + return '[' + fmt + '/' + fmt.format(num_batches) + ']' + + +def adjust_learning_rate(optimizer, epoch, args): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + lr = args.lr * (0.1 ** (epoch // 30)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + +def adjust_learning_rate_step(optimizer, args, global_step): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + if args.warm_up_steps > 0 and global_step < args.warm_up_steps: + lr = args.lr * (global_step / args.warm_up_steps) + else: + if args.lr_scheduler_type == 'linear': + lr = args.lr * (1 - (global_step - args.warm_up_steps) / (args.total_steps - - args.warm_up_steps)) + elif args.lr_scheduler_type == 'cosine': + alpha = 0 + cosine_decay = 0.5 * (1 + np.cos(np.pi * (global_step - args.warm_up_steps) / (args.total_steps - args.warm_up_steps))) + decayed = (1 - alpha) * cosine_decay + alpha + lr = args.lr * decayed + + lr = max(lr, 0) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def adjust_learning_rate_epoch(optimizer, args, global_epoch): + """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" + if args.warm_up_epochs > 0 and global_epoch < args.warm_up_epochs: + lr = args.lr * ((global_epoch+1) / (args.warm_up_epochs+1)) + else: + if args.lr_scheduler_type == 'linear_epoch': + lr = args.lr * (1 - (global_epoch - args.warm_up_epochs) / (args.epochs - - args.warm_up_epochs)) + elif args.lr_scheduler_type == 'cosine_epoch': + alpha = 0 + cosine_decay = 0.5 * (1 + np.cos(np.pi * (global_epoch - args.warm_up_epochs) / (args.epochs - args.warm_up_epochs))) + decayed = (1 - alpha) * cosine_decay + alpha + lr = args.lr * decayed + + lr = max(lr, 0) + + print("=> Epoch[%d] Setting lr: %.4f"%(global_epoch, lr)) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + return lr + + +def accuracy(output, target, topk=(1,)): + """Computes the accuracy over the k top predictions for the specified values of k""" + with torch.no_grad(): + maxk = max(topk) + batch_size = target.size(0) + + _, pred = output.topk(maxk, 1, True, True) + pred = pred.t() + correct = pred.eq(target.view(1, -1).expand_as(pred)) + + res = [] + for k in topk: + correct_k = correct[:k].view(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / batch_size)) + return res + + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("pytorch") + config_info = get_model_parameter("pytorch_config") + initinal_data = {"base_lr": 0.256, "dataset": "imagenet", "optimizer": "SGD", "loss_scale": 64} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + main() diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/__init__.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/__init__.py new file mode 100644 index 0000000..a3d351d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/__init__.py @@ -0,0 +1 @@ +from .shufflenetv2_wock_op_woct_8p import * diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/_utils.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/_utils.py new file mode 100644 index 0000000..291041d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/_utils.py @@ -0,0 +1,67 @@ +from collections import OrderedDict + +import torch +from torch import nn +from torch.jit.annotations import Dict + + +class IntermediateLayerGetter(nn.ModuleDict): + """ + Module wrapper that returns intermediate layers from a model + + It has a strong assumption that the modules have been registered + into the model in the same order as they are used. + This means that one should **not** reuse the same nn.Module + twice in the forward if you want this to work. + + Additionally, it is only able to query submodules that are directly + assigned to the model. So if `model` is passed, `model.feature1` can + be returned, but not `model.feature1.layer2`. + + Arguments: + model (nn.Module): model on which we will extract the features + return_layers (Dict[name, new_name]): a dict containing the names + of the modules for which the activations will be returned as + the key of the dict, and the value of the dict is the name + of the returned activation (which the user can specify). + + Examples:: + + >>> m = torchvision.models.resnet18(pretrained=True) + >>> # extract layer1 and layer3, giving as names `feat1` and feat2` + >>> new_m = torchvision.models._utils.IntermediateLayerGetter(m, + >>> {'layer1': 'feat1', 'layer3': 'feat2'}) + >>> out = new_m(torch.rand(1, 3, 224, 224)) + >>> print([(k, v.shape) for k, v in out.items()]) + >>> [('feat1', torch.Size([1, 64, 56, 56])), + >>> ('feat2', torch.Size([1, 256, 14, 14]))] + """ + _version = 2 + __annotations__ = { + "return_layers": Dict[str, str], + } + + def __init__(self, model, return_layers): + if not set(return_layers).issubset([name for name, _ in model.named_children()]): + raise ValueError("return_layers are not present in model") + orig_return_layers = return_layers + return_layers = {str(k): str(v) for k, v in return_layers.items()} + layers = OrderedDict() + for name, module in model.named_children(): + layers[name] = module + if name in return_layers: + del return_layers[name] + if not return_layers: + break + + super(IntermediateLayerGetter, self).__init__(layers) + self.return_layers = orig_return_layers + + def forward(self, x): + out = OrderedDict() + for name, module in self.items(): + x = module(x) + if name in self.return_layers: + out_name = self.return_layers[name] + out[out_name] = x + return out diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2.py new file mode 100644 index 0000000..14f9521 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2.py @@ -0,0 +1,208 @@ +import torch +import torch.nn as nn +from .utils import load_state_dict_from_url + + +__all__ = [ + 'ShuffleNetV2', 'shufflenet_v2_x0_5', 'shufflenet_v2_x1_0', + 'shufflenet_v2_x1_5', 'shufflenet_v2_x2_0' +] + +model_urls = { + 'shufflenetv2_x0.5': 'https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth', + 'shufflenetv2_x1.0': 'https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth', + 'shufflenetv2_x1.5': None, + 'shufflenetv2_x2.0': None, +} + + +def channel_shuffle(x, groups): + # type: (torch.Tensor, int) -> torch.Tensor + batchsize, num_channels, height, width = x.data.size() + channels_per_group = num_channels // groups + + # reshape + x = x.view(batchsize, groups, + channels_per_group, height, width) + + x = torch.transpose(x, 1, 2).contiguous() + + # flatten + x = x.view(batchsize, -1, height, width) + + return x + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride): + super(InvertedResidual, self).__init__() + + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + if self.stride == 1: + x1, x2 = x.chunk(2, dim=1) + out = torch.cat((x1, self.branch2(x2)), dim=1) + else: + out = torch.cat((self.branch1(x), self.branch2(x)), dim=1) + + out = channel_shuffle(out, 2) + + return out + + +class ShuffleNetV2(nn.Module): + def __init__(self, stages_repeats, stages_out_channels, num_classes=1000, inverted_residual=InvertedResidual): + super(ShuffleNetV2, self).__init__() + + if len(stages_repeats) != 3: + raise ValueError('expected stages_repeats as list of 3 positive ints') + if len(stages_out_channels) != 5: + raise ValueError('expected stages_out_channels as list of 5 positive ints') + self._stage_out_channels = stages_out_channels + + input_channels = 3 + output_channels = self._stage_out_channels[0] + self.conv1 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 3, 2, 1, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + input_channels = output_channels + + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + stage_names = ['stage{}'.format(i) for i in [2, 3, 4]] + for name, repeats, output_channels in zip( + stage_names, stages_repeats, self._stage_out_channels[1:]): + seq = [inverted_residual(input_channels, output_channels, 2)] + for i in range(repeats - 1): + seq.append(inverted_residual(output_channels, output_channels, 1)) + setattr(self, name, nn.Sequential(*seq)) + input_channels = output_channels + + output_channels = self._stage_out_channels[-1] + self.conv5 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 1, 1, 0, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + + self.fc = nn.Linear(output_channels, num_classes) + + def _forward_impl(self, x): + # See note [TorchScript super()] + x = self.conv1(x) + x = self.maxpool(x) + x = self.stage2(x) + x = self.stage3(x) + x = self.stage4(x) + x = self.conv5(x) + x = x.mean([2, 3]) # globalpool + x = self.fc(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def _shufflenetv2(arch, pretrained, progress, *args, **kwargs): + model = ShuffleNetV2(*args, **kwargs) + + if pretrained: + model_url = model_urls[arch] + if model_url is None: + raise NotImplementedError('pretrained {} is not supported as of now'.format(arch)) + else: + state_dict = load_state_dict_from_url(model_url, progress=progress) + model.load_state_dict(state_dict) + + return model + + +def shufflenet_v2_x0_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 0.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x0.5', pretrained, progress, + [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + + +def shufflenet_v2_x1_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.5', pretrained, progress, + [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 2.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x2.0', pretrained, progress, + [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_group_shuffle.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_group_shuffle.py new file mode 100644 index 0000000..19a0fb4 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_group_shuffle.py @@ -0,0 +1,256 @@ +import torch +import torch.nn as nn + +try: + from .utils import load_state_dict_from_url +except: + pass + +import numpy as np + +__all__ = [ + 'ShuffleNetV2', 'shufflenet_v2_x0_5', 'shufflenet_v2_x1_0', + 'shufflenet_v2_x1_5', 'shufflenet_v2_x2_0' +] + +model_urls = { + 'shufflenetv2_x0.5': 'https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth', + 'shufflenetv2_x1.0': 'https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth', + 'shufflenetv2_x1.5': None, + 'shufflenetv2_x2.0': None, +} + + +class Channel_Shuffle(nn.Module): + def __init__(self, inp, groups=4, split_shuffle=True): + super(Channel_Shuffle, self).__init__() + + self.split_shuffle = split_shuffle + self.groups = groups + + def forward(self, x1, x2): + x1_list = x1.chunk(self.groups // 2, 1) + x2_list = x2.chunk(self.groups // 2, 1) + + if self.split_shuffle: + split_point = len(x1_list) // 2 + out1 = [] + out2 = [] + for idx in range(split_point): + out1.append(x1_list[idx]) + out1.append(x2_list[idx]) + for idx in range(split_point, len(x1_list), 1): + out2.append(x1_list[idx]) + out2.append(x2_list[idx]) + return torch.cat(out1, 1), torch.cat(out2, 1) + else: + out = [] + for idx in range(len(x1_list)): + out.append(x1_list[idx]) + out.append(x2_list[idx]) + return torch.cat(out, 1) + + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, split_shuffle=True): + super(InvertedResidual, self).__init__() + + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + if self.stride > 1: + self.channel_shuffle = Channel_Shuffle(inp=branch_features + branch_features, + split_shuffle=split_shuffle) + else: + self.channel_shuffle = Channel_Shuffle(inp=inp, split_shuffle=split_shuffle) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + if self.stride == 1: + x1, x2 = x + x2 = self.branch2(x2) + else: + x1 = self.branch1(x) + x2 = self.branch2(x) + + # out = channel_shuffle(out, 2) + out = self.channel_shuffle(x1, x2) + + return out + + +class ShuffleNetV2(nn.Module): + def __init__(self, stages_repeats, stages_out_channels, num_classes=1000, inverted_residual=InvertedResidual): + super(ShuffleNetV2, self).__init__() + + if len(stages_repeats) != 3: + raise ValueError('expected stages_repeats as list of 3 positive ints') + if len(stages_out_channels) != 5: + raise ValueError('expected stages_out_channels as list of 5 positive ints') + self._stage_out_channels = stages_out_channels + + input_channels = 3 + output_channels = self._stage_out_channels[0] + self.conv1 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 3, 2, 1, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + input_channels = output_channels + + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + stage_names = ['stage{}'.format(i) for i in [2, 3, 4]] + for name, repeats, output_channels in zip( + stage_names, stages_repeats, self._stage_out_channels[1:]): + seq = [inverted_residual(input_channels, output_channels, 2)] + for i in range(repeats - 1): + if i == repeats - 2: + seq.append(inverted_residual(output_channels, output_channels, 1, split_shuffle=False)) + else: + seq.append(inverted_residual(output_channels, output_channels, 1)) + setattr(self, name, nn.Sequential(*seq)) + input_channels = output_channels + + output_channels = self._stage_out_channels[-1] + self.conv5 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 1, 1, 0, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + + self.fc = nn.Linear(output_channels, num_classes) + + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + + def _forward_impl(self, x): + + # See note [TorchScript super()] + x = self.conv1(x) + x = self.maxpool(x) + x = self.stage2(x) + x = self.stage3(x) + x = self.stage4(x) + x = self.conv5(x) + # x = x.mean([2, 3]) # globalpool + x = self.avgpool(x) + x = torch.flatten(x, 1) + + x = self.fc(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def _shufflenetv2(arch, pretrained, progress, *args, **kwargs): + model = ShuffleNetV2(*args, **kwargs) + + if pretrained: + model_url = model_urls[arch] + if model_url is None: + raise NotImplementedError('pretrained {} is not supported as of now'.format(arch)) + else: + state_dict = load_state_dict_from_url(model_url, progress=progress) + model.load_state_dict(state_dict) + + return model + + +def shufflenet_v2_x0_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 0.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x0.5', pretrained, progress, + [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + # return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + # [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + [4, 8, 4], [16, 128, 256, 512, 1024], **kwargs) + + +def shufflenet_v2_x1_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.5', pretrained, progress, + [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 2.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x2.0', pretrained, progress, + [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) + + +if __name__ == '__main__': + model = shufflenet_v2_x1_0() + print(model) + x = torch.randn(1, 3, 224, 224) + y = model(x) + loss = y.sum() + loss.backward() + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct.py new file mode 100644 index 0000000..2b3fca6 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct.py @@ -0,0 +1,330 @@ +import torch +import torch.nn as nn + +try: + from .utils import load_state_dict_from_url +except: + pass + +import numpy as np + +__all__ = [ + 'ShuffleNetV2', 'shufflenet_v2_x0_5', 'shufflenet_v2_x1_0', + 'shufflenet_v2_x1_5', 'shufflenet_v2_x2_0' +] + +model_urls = { + 'shufflenetv2_x0.5': 'https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth', + 'shufflenetv2_x1.0': 'https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth', + 'shufflenetv2_x1.5': None, + 'shufflenetv2_x2.0': None, +} + + +class IndexSelectFullImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index, bp_index1, bp_index2): + stream = torch.npu.current_stream() + stream.synchronize() + + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + x = torch.cat([x1, x2], dim=1) + result = x.index_select(1, fp_index) + + + return result + + @staticmethod + def backward(ctx, grad_output): + stream = torch.npu.current_stream() + stream.synchronize() + + # convert to NCHW to avoid extra 5HD --> 4D + grad_output.data = grad_output.data.npu_format_cast(0) + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + +class IndexSelectHalfImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index1, fp_index2, bp_index1, bp_index2): + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + x = torch.cat([x1, x2], dim=1) + return x.index_select(1, fp_index1), x.index_select(1, fp_index2) + + @staticmethod + def backward(ctx, grad_output1, grad_output2): + grad_output = torch.cat([grad_output1, grad_output2], 1) + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + +class Channel_Shuffle(nn.Module): + def __init__(self, inp, groups=2, split_shuffle=True): + super(Channel_Shuffle, self).__init__() + + self.split_shuffle = split_shuffle + self.group_len = inp // groups + self.out = np.array(list(range(inp))).reshape(groups, self.group_len).transpose(1, 0).flatten().tolist() + if self.split_shuffle: + self.register_buffer('fp_index1', torch.tensor(self.out[:self.group_len])) + self.register_buffer('fp_index2', torch.tensor(self.out[self.group_len:])) + else: + self.register_buffer('fp_index', torch.tensor(self.out)) + # self.register_buffer('bp_index', torch.tensor(list(range(0, inp, 2))+list(range(1,inp,2)))) + self.register_buffer('bp_index1', torch.tensor(list(range(0, inp, 2)))) + self.register_buffer('bp_index2', torch.tensor(list(range(1, inp, 2)))) + + def forward(self, x1, x2): + if self.split_shuffle: + return IndexSelectHalfImplementation.apply(x1, x2, self.fp_index1, self.fp_index2, self.bp_index1, + self.bp_index2) + else: + return IndexSelectFullImplementation.apply(x1, x2, self.fp_index, self.bp_index1, self.bp_index2) + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, split_shuffle=True): + super(InvertedResidual, self).__init__() + + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + if self.stride > 1: + self.channel_shuffle = Channel_Shuffle(inp=branch_features + branch_features, groups=2, + split_shuffle=split_shuffle) + else: + self.channel_shuffle = Channel_Shuffle(inp=inp, groups=2, split_shuffle=split_shuffle) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + if self.stride == 1: + x1, x2 = x + x2 = self.branch2(x2) + else: + x1 = self.branch1(x) + x2 = self.branch2(x) + + # out = channel_shuffle(out, 2) + out = self.channel_shuffle(x1, x2) + + return out + + +class ShuffleNetV2(nn.Module): + def __init__(self, stages_repeats, stages_out_channels, num_classes=1000, inverted_residual=InvertedResidual): + super(ShuffleNetV2, self).__init__() + + if len(stages_repeats) != 3: + raise ValueError('expected stages_repeats as list of 3 positive ints') + if len(stages_out_channels) != 5: + raise ValueError('expected stages_out_channels as list of 5 positive ints') + self._stage_out_channels = stages_out_channels + + input_channels = 3 + output_channels = self._stage_out_channels[0] + self.conv1 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 3, 2, 1, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + input_channels = output_channels + + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + stage_names = ['stage{}'.format(i) for i in [2, 3, 4]] + for name, repeats, output_channels in zip( + stage_names, stages_repeats, self._stage_out_channels[1:]): + seq = [inverted_residual(input_channels, output_channels, 2)] + for i in range(repeats - 1): + if i == repeats - 2: + seq.append(inverted_residual(output_channels, output_channels, 1, split_shuffle=False)) + else: + seq.append(inverted_residual(output_channels, output_channels, 1)) + setattr(self, name, nn.Sequential(*seq)) + input_channels = output_channels + + output_channels = self._stage_out_channels[-1] + self.conv5 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 1, 1, 0, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + + self.fc = nn.Linear(output_channels, num_classes) + + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + + def _forward_impl(self, x): + + # See note [TorchScript super()] + x = self.conv1(x) + x = self.maxpool(x) + x = self.stage2(x) + x = self.stage3(x) + x = self.stage4(x) + x = self.conv5(x) + # x = x.mean([2, 3]) # globalpool + x = self.avgpool(x) + x = torch.flatten(x, 1) + + x = self.fc(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def _shufflenetv2(arch, pretrained, progress, *args, **kwargs): + model = ShuffleNetV2(*args, **kwargs) + + if pretrained: + model_url = model_urls[arch] + if model_url is None: + raise NotImplementedError('pretrained {} is not supported as of now'.format(arch)) + else: + state_dict = load_state_dict_from_url(model_url, progress=progress) + model.load_state_dict(state_dict) + + return model + + +def shufflenet_v2_x0_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 0.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x0.5', pretrained, progress, + [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + # return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + # [4, 8, 4], [16, 128, 256, 464, 1024], **kwargs) + + +def shufflenet_v2_x1_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.5', pretrained, progress, + [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 2.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x2.0', pretrained, progress, + [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) + + +if __name__ == '__main__': + import pickle + + + def init(): + # init input + x = np.random.randn(32, 3, 224, 224).astype(np.float32) + with open('input_tensor.pkl', 'wb')as f: + pickle.dump(x, f) + model = shufflenet_v2_x1_0() + with open('init_weight.pth', 'wb')as f: + torch.save(model.state_dict(), f) + + + with open('input_tensor.pkl', 'rb')as f: + input_tensor = torch.from_numpy(pickle.load(f)) + input_tensor.requires_grad = True + + model = shufflenet_v2_x1_0() + with open('init_weight.pth', 'rb')as f: + model.load_state_dict(torch.load(f)) + + inter_feature = {} + inter_gradient = {} + def make_hook(name, flag): + if flag == 'forward': + def hook(m, input, output): + inter_feature[name] = input + + return hook + elif flag == 'backward': + def hook(m, input, output): + inter_gradient[name] = output + + return hook + else: + assert False + for name, m in model.named_modules(): + m.register_forward_hook(make_hook(name, 'forward')) + m.register_backward_hook(make_hook(name, 'backward')) + + out = model(input_tensor) + loss = out.sum() + loss.backward() + + print(inter_feature) + print(inter_gradient) diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct_8p.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct_8p.py new file mode 100644 index 0000000..041fc01 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/shufflenetv2_wock_op_woct_8p.py @@ -0,0 +1,328 @@ +import torch +import torch.nn as nn + +try: + from .utils import load_state_dict_from_url +except: + pass + +import numpy as np + +__all__ = [ + 'ShuffleNetV2', 'shufflenet_v2_x0_5', 'shufflenet_v2_x1_0', + 'shufflenet_v2_x1_5', 'shufflenet_v2_x2_0' +] + +model_urls = { + 'shufflenetv2_x0.5': 'https://download.pytorch.org/models/shufflenetv2_x0.5-f707e7126e.pth', + 'shufflenetv2_x1.0': 'https://download.pytorch.org/models/shufflenetv2_x1-5666bf0f80.pth', + 'shufflenetv2_x1.5': None, + 'shufflenetv2_x2.0': None, +} + + +class IndexSelectFullImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index, bp_index1, bp_index2): + stream = torch.npu.current_stream() + stream.synchronize() + + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + x = torch.cat([x1, x2], dim=1) + result = x.index_select(1, fp_index) + + return result + + @staticmethod + def backward(ctx, grad_output): + stream = torch.npu.current_stream() + stream.synchronize() + + # convert to NCHW to avoid extra 5HD --> 4D + grad_output.data = grad_output.data.npu_format_cast(0) + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + +class IndexSelectHalfImplementation(torch.autograd.Function): + @staticmethod + def forward(ctx, x1, x2, fp_index1, fp_index2, bp_index1, bp_index2): + ctx.bp_index1 = bp_index1 + ctx.bp_index2 = bp_index2 + x = torch.cat([x1, x2], dim=1) + return x.index_select(1, fp_index1), x.index_select(1, fp_index2) + + @staticmethod + def backward(ctx, grad_output1, grad_output2): + grad_output = torch.cat([grad_output1, grad_output2], 1) + out1 = grad_output.index_select(1, ctx.bp_index1) + out2 = grad_output.index_select(1, ctx.bp_index2) + return out1, out2, None, None, None, None + + +class Channel_Shuffle(nn.Module): + def __init__(self, inp, groups=2, split_shuffle=True): + super(Channel_Shuffle, self).__init__() + + self.split_shuffle = split_shuffle + self.group_len = inp // groups + self.out = np.array(list(range(inp))).reshape(groups, self.group_len).transpose(1, 0).flatten().tolist() + if self.split_shuffle: + self.register_buffer('fp_index1', torch.tensor(self.out[:self.group_len], dtype=torch.int32)) + self.register_buffer('fp_index2', torch.tensor(self.out[self.group_len:], dtype=torch.int32)) + else: + self.register_buffer('fp_index', torch.tensor(self.out, dtype=torch.int32)) + self.register_buffer('bp_index1', torch.tensor(list(range(0, inp, 2)), dtype=torch.int32)) + self.register_buffer('bp_index2', torch.tensor(list(range(1, inp, 2)), dtype=torch.int32)) + + def forward(self, x1, x2): + if self.split_shuffle: + return IndexSelectHalfImplementation.apply(x1, x2, self.fp_index1, self.fp_index2, self.bp_index1, + self.bp_index2) + else: + return IndexSelectFullImplementation.apply(x1, x2, self.fp_index, self.bp_index1, self.bp_index2) + + +class InvertedResidual(nn.Module): + def __init__(self, inp, oup, stride, split_shuffle=True): + super(InvertedResidual, self).__init__() + + if not (1 <= stride <= 3): + raise ValueError('illegal stride value') + self.stride = stride + + branch_features = oup // 2 + assert (self.stride != 1) or (inp == branch_features << 1) + + if self.stride > 1: + self.branch1 = nn.Sequential( + self.depthwise_conv(inp, inp, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(inp), + nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + else: + self.branch1 = nn.Sequential() + + self.branch2 = nn.Sequential( + nn.Conv2d(inp if (self.stride > 1) else branch_features, + branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1), + nn.BatchNorm2d(branch_features), + nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False), + nn.BatchNorm2d(branch_features), + nn.ReLU(inplace=True), + ) + + if self.stride > 1: + self.channel_shuffle = Channel_Shuffle(inp=branch_features + branch_features, groups=2, + split_shuffle=split_shuffle) + else: + self.channel_shuffle = Channel_Shuffle(inp=inp, groups=2, split_shuffle=split_shuffle) + + @staticmethod + def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False): + return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i) + + def forward(self, x): + if self.stride == 1: + x1, x2 = x + x2 = self.branch2(x2) + else: + x1 = self.branch1(x) + x2 = self.branch2(x) + + # out = channel_shuffle(out, 2) + out = self.channel_shuffle(x1, x2) + + return out + + +class ShuffleNetV2(nn.Module): + def __init__(self, stages_repeats, stages_out_channels, num_classes=1000, inverted_residual=InvertedResidual): + super(ShuffleNetV2, self).__init__() + + if len(stages_repeats) != 3: + raise ValueError('expected stages_repeats as list of 3 positive ints') + if len(stages_out_channels) != 5: + raise ValueError('expected stages_out_channels as list of 5 positive ints') + self._stage_out_channels = stages_out_channels + + input_channels = 3 + output_channels = self._stage_out_channels[0] + self.conv1 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 3, 2, 1, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + input_channels = output_channels + + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + stage_names = ['stage{}'.format(i) for i in [2, 3, 4]] + for name, repeats, output_channels in zip( + stage_names, stages_repeats, self._stage_out_channels[1:]): + seq = [inverted_residual(input_channels, output_channels, 2)] + for i in range(repeats - 1): + if i == repeats - 2: + seq.append(inverted_residual(output_channels, output_channels, 1, split_shuffle=False)) + else: + seq.append(inverted_residual(output_channels, output_channels, 1)) + setattr(self, name, nn.Sequential(*seq)) + input_channels = output_channels + + output_channels = self._stage_out_channels[-1] + self.conv5 = nn.Sequential( + nn.Conv2d(input_channels, output_channels, 1, 1, 0, bias=False), + nn.BatchNorm2d(output_channels), + nn.ReLU(inplace=True), + ) + + self.fc = nn.Linear(output_channels, num_classes) + + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + + def _forward_impl(self, x): + + # See note [TorchScript super()] + x = self.conv1(x) + x = self.maxpool(x) + x = self.stage2(x) + x = self.stage3(x) + x = self.stage4(x) + x = self.conv5(x) + # x = x.mean([2, 3]) # globalpool + x = self.avgpool(x) + x = torch.flatten(x, 1) + + x = self.fc(x) + return x + + def forward(self, x): + return self._forward_impl(x) + + +def _shufflenetv2(arch, pretrained, progress, *args, **kwargs): + model = ShuffleNetV2(*args, **kwargs) + + if pretrained: + model_url = model_urls[arch] + if model_url is None: + raise NotImplementedError('pretrained {} is not supported as of now'.format(arch)) + else: + state_dict = load_state_dict_from_url(model_url, progress=progress) + model.load_state_dict(state_dict) + + return model + + +def shufflenet_v2_x0_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 0.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x0.5', pretrained, progress, + [4, 8, 4], [24, 48, 96, 192, 1024], **kwargs) + + +def shufflenet_v2_x1_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + [4, 8, 4], [24, 116, 232, 464, 1024], **kwargs) + # return _shufflenetv2('shufflenetv2_x1.0', pretrained, progress, + # [4, 8, 4], [16, 128, 256, 464, 1024], **kwargs) + + +def shufflenet_v2_x1_5(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 1.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x1.5', pretrained, progress, + [4, 8, 4], [24, 176, 352, 704, 1024], **kwargs) + + +def shufflenet_v2_x2_0(pretrained=False, progress=True, **kwargs): + """ + Constructs a ShuffleNetV2 with 2.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _shufflenetv2('shufflenetv2_x2.0', pretrained, progress, + [4, 8, 4], [24, 244, 488, 976, 2048], **kwargs) + + +if __name__ == '__main__': + import pickle + + + def init(): + # init input + x = np.random.randn(32, 3, 224, 224).astype(np.float32) + with open('input_tensor.pkl', 'wb')as f: + pickle.dump(x, f) + model = shufflenet_v2_x1_0() + with open('init_weight.pth', 'wb')as f: + torch.save(model.state_dict(), f) + + + with open('input_tensor.pkl', 'rb')as f: + input_tensor = torch.from_numpy(pickle.load(f)) + input_tensor.requires_grad = True + + model = shufflenet_v2_x1_0() + with open('init_weight.pth', 'rb')as f: + model.load_state_dict(torch.load(f)) + + inter_feature = {} + inter_gradient = {} + def make_hook(name, flag): + if flag == 'forward': + def hook(m, input, output): + inter_feature[name] = input + + return hook + elif flag == 'backward': + def hook(m, input, output): + inter_gradient[name] = output + + return hook + else: + assert False + for name, m in model.named_modules(): + m.register_forward_hook(make_hook(name, 'forward')) + m.register_backward_hook(make_hook(name, 'backward')) + + out = model(input_tensor) + loss = out.sum() + loss.backward() + + print(inter_feature) + print(inter_gradient) diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/utils.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/utils.py new file mode 100644 index 0000000..638ef07 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/models/utils.py @@ -0,0 +1,4 @@ +try: + from torch.hub import load_state_dict_from_url +except ImportError: + from torch.utils.model_zoo import load_url as load_state_dict_from_url diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/multi_epochs_dataloader.py b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/multi_epochs_dataloader.py new file mode 100644 index 0000000..28b6679 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/code/multi_epochs_dataloader.py @@ -0,0 +1,31 @@ +import torch + + +class MultiEpochsDataLoader(torch.utils.data.DataLoader): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._DataLoader__initialized = False + self.batch_sampler = _RepeatSampler(self.batch_sampler) + self._DataLoader__initialized = True + self.iterator = super().__iter__() + + def __len__(self): + return len(self.batch_sampler.sampler) + + def __iter__(self): + for _ in range(len(self)): + yield next(self.iterator) + + +class _RepeatSampler(object): + """ Sampler that repeats forever. + Args: + sampler (Sampler) + """ + + def __init__(self, sampler): + self.sampler = sampler + + def __iter__(self): + while True: + yield from iter(self.sampler) diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/config/npu_set_env.sh new file mode 100644 index 0000000..7618849 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/config/npu_set_env.sh @@ -0,0 +1,31 @@ +############## toolkit situation ################ +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ +#export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so +#export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH + + +############## nnae situation ################ + + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64_64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/nnae/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/nnae/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +else + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib64/:/usr/lib/:/usr/local/python3.7.5/lib/:/usr/local/openblas/lib:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin/:/usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin/ + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + export OPTION_EXEC_EXTERN_PLUGIN_PATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libfe.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libaicpu_engine.so:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64/plugin/opskernel/libge_local_engine.so + export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/auto_tune.egg/auto_tune:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/schedule_search.egg:$PYTHONPATH +fi + +# ln -s /usr/local/Ascend/ascend-toolkit/latest/toolkit/bin/adc /usr/local/bin/ + +export SLOG_PRINT_TO_STDOUT=0 +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device 0" + +export TASK_QUEUE_ENABLE=1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/run.sh b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/run.sh new file mode 100644 index 0000000..9f367a1 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) +# 配置环境变量并调用 train 方法 +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/pt_shufflenet/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/pt_shufflenet/training_job_${currtime}/ + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir}" +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export SLOG_PRINT_TO_STDOUT=0 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + + + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_shufflenet.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_shufflenet.log ${train_job_dir} + #for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + #${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + #let rank_id++ + device_id=${first_device_id} + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + #done +fi +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} " + diff --git a/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/train.sh b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/train.sh new file mode 100644 index 0000000..c3cb488 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/ShuffleNet/pytorch/scripts/train.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currtime=$4 +toolsPath=$5 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +export REMARK_LOG_FILE=hw_shufflenet.log + +mkdir -p ${currentDir%train*}/train/result/pt_shufflenet/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/pt_shufflenet/training_job_${currtime}/ + + +source ${currentDir}/config/npu_set_env.sh + + +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +#atlasboost_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +code_dir_path=${currentDir}/code +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path}:${code_dir_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "pytorch_config") + +# user env +export YAML_PATH=$3 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export MODEL_CKPT_PATH=${train_job_dir}/${device_id}/ckpt${device_id} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +#echo "rank size is ${rank_size}" + +if [ x"${rank_size}" == x"1" ];then + python3.7 ${currentDir}/code/8p_main_med.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed=49 \ + --workers=128 \ + --learning-rate=${lr} \ + --print-freq=1 \ + --eval-freq=${epochs_between_evals} \ + --arch=shufflenet_v2_x1_0 \ + --dist-url='tcp://127.0.0.1:50000' \ + --dist-backend='hccl' \ + --multiprocessing-distributed \ + --world-size=1 \ + --batch-size=${batch_size} \ + --epochs=${epoches} \ + --warm_up_epochs=${warm_up_epochs} \ + --rank=0 \ + --amp \ + --momentum=0 \ + --wd=3.0517578125e-05 \ + --device-list=${device_id} \ + --benchmark 0 \ + --data=${data_url} > ${train_job_dir}/train_1p.log 2>&1 +else + device_number=${rank_size} + #echo "device_group_multi ${device_group_multi}" + python3.7 ${currentDir}/code/8p_main_med.py \ + --addr=$(hostname -I |awk '{print $1}') \ + --seed=49 \ + --workers=184 \ + --learning-rate=${lr} \ + --print-freq=1 \ + --eval-freq=${epochs_between_evals} \ + --arch=shufflenet_v2_x1_0 \ + --dist-url='tcp://127.0.0.1:50000' \ + --dist-backend='hccl' \ + --multiprocessing-distributed \ + --world-size=1 \ + --batch-size=${batch_size} \ + --epochs=${epoches} \ + --warm_up_epochs=${warm_up_epochs} \ + --device_num=${device_number} \ + --rank=0 \ + --amp \ + --momentum=0 \ + --device-list=${device_group_multi} \ + --benchmark 0 \ + --data=${data_url} > ${train_job_dir}/train_${rank_size}p.log 2>&1 +fi + +if [ $? -eq 0 ] ; +then + echo ":::ABK 1.0.0 ShuffleNet train success" + echo ":::ABK 1.0.0 ShuffleNet train success" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 ShuffleNet train success" >> ${train_job_dir}/${device_id}/hw_shufflenet.log +else + echo ":::ABK 1.0.0 ShuffleNet train failed" + echo ":::ABK 1.0.0 ShuffleNet train failed" >> ${train_job_dir}/train_${rank_size}p.log + echo ":::ABK 1.0.0 ShuffleNet train failed" >> ${train_job_dir}/${device_id}/hw_shufflenet.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` + +sumTime=$[ $endTime_s - $startTime_s ] + +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 ShuffleNet train total time:${hour}:${min}:${sec}" + +echo ":::ABK 1.0.0 ShuffleNet train total time:${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_shufflenet.log + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/__init__.py b/train/atlas_benchmark-master/image_classification/vgg16/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/16p.json b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/16p.json new file mode 100644 index 0000000..42ea84d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/16p.json @@ -0,0 +1,182 @@ +{ + "board_id" : "0x002F", + "chip_info" : "910", + "deploy_mode" : "lab", + "group_count" : "1", + "group_list" : [ + { + "device_num" : "16", + "server_num" : "2", + "group_name" : "", + "instance_count" : "16", + "instance_list" : [ + { + "devices" : [ + { + "device_id" : "0", + "device_ip" : "192.168.104.101" + } + ], + "rank_id" : "0", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "1", + "device_ip" : "192.168.105.101" + } + ], + "rank_id" : "1", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "2", + "device_ip" : "192.168.106.101" + } + ], + "rank_id" : "2", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "3", + "device_ip" : "192.168.107.101" + } + ], + "rank_id" : "3", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "4", + "device_ip" : "192.168.108.100" + } + ], + "rank_id" : "4", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "5", + "device_ip" : "192.168.109.100" + } + ], + "rank_id" : "5", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "6", + "device_ip" : "192.168.110.100" + } + ], + "rank_id" : "6", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "7", + "device_ip" : "192.168.111.100" + } + ], + "rank_id" : "7", + "server_id" : "90.90.176.104" + }, + { + "devices" : [ + { + "device_id" : "0", + "device_ip" : "192.168.100.101" + } + ], + "rank_id" : "8", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "1", + "device_ip" : "192.168.101.101" + } + ], + "rank_id" : "9", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "2", + "device_ip" : "192.168.102.101" + } + ], + "rank_id" : "10", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "3", + "device_ip" : "192.168.103.101" + } + ], + "rank_id" : "11", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "4", + "device_ip" : "192.168.100.100" + } + ], + "rank_id" : "12", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "5", + "device_ip" : "192.168.101.100" + } + ], + "rank_id" : "13", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "6", + "device_ip" : "192.168.102.100" + } + ], + "rank_id" : "14", + "server_id" : "90.90.176.102" + }, + { + "devices" : [ + { + "device_id" : "7", + "device_ip" : "192.168.103.100" + } + ], + "rank_id" : "15", + "server_id" : "90.90.176.102" + } + ] + } + ], + "para_plane_nic_location" : "device", + "para_plane_nic_name" : [ + "eth0" + ], + "para_plane_nic_num" : "1", + "status" : "completed" +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/1p.json b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/1p.json new file mode 100644 index 0000000..233cccf --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/1p.json @@ -0,0 +1,12 @@ +{ +"group_count": "1", +"group_list": [ +{ + "group_name": "worker", + "device_count": "1", + "instance_count": "1", + "instance_list": [{"devices":[{"device_id":"2","device_ip":"192.168.101.102"}],"pod_name":"npu1p","server_id":"127.0.0.1"}] +} +], +"status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/8p.json b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/8p.json new file mode 100644 index 0000000..84139c7 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/8p.json @@ -0,0 +1,12 @@ +{ +"group_count": "1", +"group_list": [ +{ + "group_name": "worker", + "device_count": "8", + "instance_count": "1", + "instance_list": [{"devices":[{"device_id":"0","device_ip":"192.168.190.102"},{"device_id":"1","device_ip":"192.168.191.102"},{"device_id":"2","device_ip":"192.168.192.102"},{"device_id":"3","device_ip":"192.168.193.102"},{"device_id":"4","device_ip":"192.168.190.103"},{"device_id":"5","device_ip":"192.168.191.103"},{"device_id":"6","device_ip":"192.168.192.103"},{"device_id":"7","device_ip":"192.168.193.103"}],"pod_name":"npu8p","server_id":"127.0.0.1"}] +} +], +"status": "completed" +} diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/cloud_docker_init.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/cloud_docker_init.sh new file mode 100644 index 0000000..a5cddc9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/cloud_docker_init.sh @@ -0,0 +1,48 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +DEVICE_LIST=$@ + +export exec_type={MODE} + +prog_exit() +{ + if [ x"${exec_type}" = xdocker ]; + then + # stop slogd progress + bash /usr/local/Ascend/driver/tools/docker_stop_post_sys.sh + fi +} + +# register prog_exit +trap "prog_exit" SIGTERM + +if [ x"${exec_type}" = xdocker ]; +then + #set env + . ${currentDir}/npu_set_env.sh + + # start slogd progress + mkdir -p /var/log/npu/slog/slogd + /usr/local/Ascend/driver/tools/docker/slogd & + + # start main.sh + ${currentDir}/main.sh ${DEVICE_LIST} & + + # wait slogd stop + flag=1 + while [ $flag -ne 0 ]; + do + sleep 5; + flag=`ps -ef | grep train.sh | grep -v grep | wc -l` + ps -ef >> ${currentDir}/ps.log + echo "" >> ${currentDir}/ps.log + done +else + RANK_ID=`cat ${currentDir}/npu_set_env.sh | grep "RANK_ID=" | awk -F"=" '{print $2}'` + # start main.sh + su - HwHiAiUser -c ". ${currentDir}/npu_set_env.sh;export PROFILING_DIR=/var/log/npu/profiling/container/${RANK_ID};${currentDir}/main.sh ${DEVICE_LIST}" & + wait +fi + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..cec6b14 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/hccl_sample.json @@ -0,0 +1,6 @@ +{ + "server_count": "1", + "server_list": [{"device":[{devices}],"server_id":"127.0.0.1"}], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/main_sample.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/main_sample.sh new file mode 100644 index 0000000..a43856f --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/main_sample.sh @@ -0,0 +1,18 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +device_group=$@ +device_num=$# + +touch ${currentDir}/main.log + +for device_phy_id in ${device_group} +do + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train.sh ${device_phy_id} & " >> ${currentDir}/main.log + ${currentDir}/train.sh ${device_phy_id} & +done + +wait + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train.sh exit " >> ${currentDir}/main.log diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..c791ac3 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/npu_set_env.sh @@ -0,0 +1,40 @@ +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi +export SOC_VERSION=Ascend910 +export HCCL_CONNECT_TIMEOUT=600 + +# user env +export JOB_ID={JOB_ID} +export RANK_TABLE_FILE={RANK_TABLE_FILE} +#export RANK_SIZE={RANK_SIZE} +#export RANK_INDEX={RANK_INDEX} +#export RANK_ID={RANK_ID} + +# profiling env +export PROFILING_MODE={PROFILING_MODE} +export AICPU_PROFILING_MODE={AICPU_PROFILING_MODE} +export PROFILING_OPTIONS={PROFILING_OPTIONS} +export FP_POINT={FP_POINT} +export BP_POINT={BP_POINT} + +# debug env +#export DUMP_GE_GRAPH=2 +#export DUMP_OP=1 +#export DUMP_OP_LESS=1 +#export PRINT_MODEL=1 +#export TE_PARALLEL_COMPILER=0 + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/train_sample.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/train_sample.sh new file mode 100644 index 0000000..b4ee768 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/config/train_sample.sh @@ -0,0 +1,33 @@ +#!/bin/sh +currentDir=$(cd "$(dirname "$0")"; pwd) +cd ${currentDir} + +PWD=${currentDir} + +device_id=$1 +if [ x"${device_id}" = x ] ; +then + echo "turing train fail" >> ${currentDir}/train_${device_id}.log + exit +else + export DEVICE_ID=${device_id} +fi + +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} + +env > ${currentDir}/env_${device_id}.log + +#mkdir exec path +mkdir -p ${currentDir}/${device_id} +rm -rf ${currentDir}/${device_id}/* +cd ${currentDir}/${device_id} + +#start exec +python3.7 {RUN_ALGORITHM_CMD} {CHECKPOINT_DIR} > ${currentDir}/train_${device_id}.log 2>&1 +if [ $? -eq 0 ] ; +then + echo "turing train success" >> ${currentDir}/train_${device_id}.log +else + echo "turing train fail" >> ${currentDir}/train_${device_id}.log +fi diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/run.sh new file mode 100644 index 0000000..1e18916 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/run.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +# device 列表, 若无指定 device 或大于等于 8p 时根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named last_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +rank_id=0 + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/0/hw_vgg16.log ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$this_ip" != x"$ip" ];then + scp $yamlPath root@$ip:$yamlPath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/${first_device_id}/hw_vgg16.log ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id& + let rank_id++ + done +fi +wait + + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/train.sh new file mode 100644 index 0000000..5576f9d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/scripts/train.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 +mkdir -p ${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_vgg16/training_job_${currtime}/ + +source ${currentDir}/config/npu_set_env.sh + +# 声明变量 +export REMARK_LOG_FILE=hw_vgg16.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export RANK_INDEX=0 +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=$1 +DEVICE_INDEX=$(( DEVICE_ID + RANK_INDEX * 8 )) +export DEVICE_INDEX=${DEVICE_INDEX} +export YAML_PATH=$3 + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +# 根据单卡/多卡区分调用参数 + +if [ x"$6" == x"True" ];then + export CLUSTER=True + rm -rf ${currentDir}/result/*.log + if [ ${rank_size} -le 4 ];then + # python3.7 ${currentDir}/vgg16/train.py --config_file vgg16_config_1p > ${train_job_dir}/train_${device_id}.log 2>&1 + + python3.7 ${currentDir}/vgg16/train.py --rank_size=${rank_size}\ + --mode=${mode_1p} \ + --max_train_steps=${max_train_steps} \ + --iterations_per_loop=${iterations_per_loop_1p} \ + --data_dir=${data_url} \ + --display_every=${display_every} \ + --log_dir=${log_dir} \ + --log_name=${log_name_1p}> ${train_job_dir}/train_${device_id}.log 2>&1 + else + # python3.7 ${currentDir}/vgg16/train.py --config_file vgg16_config_${rank_size}p > ${train_job_dir}/train_${device_id}.log 2>&1 + + python3.7 ${currentDir}/vgg16/train.py --rank_size=${rank_size} \ + --mode=${mode_8p} \ + --max_epochs=${max_epoches} \ + --iterations_per_loop=${iterations_per_loop_8p}\ + --epochs_between_evals=${epochs_between_evals} \ + --data_dir=${data_url} \ + --lr=${lr} \ + --log_dir=${log_dir} \ + --log_name=${log_name_8p} > ${train_job_dir}/train_${device_id}.log 2>&1 + fi + +elif [ ${rank_size} -le 4 ];then + # 单卡 + # python3.7 ${currentDir}/vgg16/train.py --config_file vgg16_config_1p > ${train_job_dir}/train_${device_id}.log 2>&1 + + python3.7 ${currentDir}/vgg16/train.py --rank_size=${rank_size} \ + --mode=${mode_1p} \ + --max_train_steps=${max_train_steps} \ + --iterations_per_loop=${iterations_per_loop_1p} \ + --data_dir=${data_url} \ + --display_every=${display_every} \ + --log_dir=${log_dir} \ + --log_name=${log_name_1p}> ${train_job_dir}/train_${device_id}.log 2>&1 + +elif [ ${rank_size} -le 8 ];then + # 多卡单机 + # python3.7 ${currentDir}/vgg16/train.py --config_file vgg16_config_8p > ${train_job_dir}/train_${device_id}.log 2>&1 + + python3.7 ${currentDir}/vgg16/train.py --rank_size=${rank_size} \ + --mode=${mode_8p} \ + --max_epochs=${max_epoches} \ + --iterations_per_loop=${iterations_per_loop_8p}\ + --epochs_between_evals=${epochs_between_evals} \ + --data_dir=${data_url} \ + --lr=${lr} \ + --log_dir=${log_dir} \ + --log_name=${log_name_8p} > ${train_job_dir}/train_${device_id}.log 2>&1 +fi + +#cp ./hw_vgg16.log ${currentDir}/../../../../performance/ + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 vgg16 train success" + echo ":::ABK 1.0.0 vgg16 train success" >> ${train_job_dir}/train_${device_id}.log 2 + echo ":::ABK 1.0.0 vgg16 train success" >> ${train_job_dir}/${device_id}/hw_vgg16.log +else + echo ":::ABK 1.0.0 vgg16 train failed" + echo ":::ABK 1.0.0 vgg16 train failed" >> ${train_job_dir}/train_${device_id}.log 2 + echo ":::ABK 1.0.0 vgg16 train failed" >> ${train_job_dir}/${device_id}/hw_vgg16.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ${hour}:${min}:${sec} +echo ":::ABK 1.0.0 vgg16 train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_vgg16.log diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/create_session.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/create_session.py new file mode 100644 index 0000000..781356d --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/create_session.py @@ -0,0 +1,22 @@ +import tensorflow as tf +import os,sys + + +class CreateSession(): + def __init__(self): + self.estimator_config = tf.ConfigProto( + inter_op_parallelism_threads=10, + intra_op_parallelism_threads=10, + allow_soft_placement=True) + + self.estimator_config.gpu_options.allow_growth = True + + self.set_env() + + def set_env(self): + gpu_thread_count = 2 + os.environ['TF_GPU_THREAD_MODE'] = 'gpu_private' + os.environ['TF_GPU_THREAD_COUNT'] = str(gpu_thread_count) + os.environ['TF_USE_CUDNN_BATCHNORM_SPATIAL_PERSISTENT'] = '1' + os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1' + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/data_loader.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/data_loader.py new file mode 100644 index 0000000..4c4a803 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/data_loader.py @@ -0,0 +1,133 @@ +import numpy as np +import preprocessing +import tensorflow as tf +from tensorflow.python.util import nest +import os,sys +import numpy as np + + +class DataLoader: + + def __init__(self, args): + self.args = args + + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames_train = sorted(tf.gfile.Glob(filename_pattern % 'train')) + self.num_training_samples = get_num_records(filenames_train) + self.args.num_training_samples = self.num_training_samples + + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames_val = sorted(tf.gfile.Glob(filename_pattern % 'validation')) + self.num_evaluating_samples = get_num_records(filenames_val) + self.args.num_evaluating_samples = self.num_evaluating_samples + + print( 'total num_training_sampels: %d' % self.num_training_samples ) + print( 'total num_evaluating_sampels: %d' % self.num_evaluating_samples ) + + self.training_samples_per_rank = self.num_training_samples + + def get_train_input_fn(self): + take_count = self.training_samples_per_rank + + return make_dataset(self.args, take_count, self.args.batch_size, training=True) + + def get_eval_input_fn(self): + take_count = self.num_evaluating_samples + + return make_dataset(self.args, take_count, self.args.batch_size, training=False) + + +def get_num_records(filenames): + def count_records(tf_record_filename): + count = 0 + for _ in tf.python_io.tf_record_iterator(tf_record_filename): + count += 1 + return count + + nfile = len(filenames) + return (count_records(filenames[0]) * (nfile - 1) + + count_records(filenames[-1])) + + +def _parse_example_proto(example_serialized): + feature_map = { + 'image/encoded': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + 'image/class/label': tf.FixedLenFeature([], dtype=tf.int64, default_value=-1), + 'image/class/text': tf.FixedLenFeature([], dtype=tf.string, + default_value=''), + } + sparse_float32 = tf.VarLenFeature(dtype=tf.float32) + # Sparse features in Example proto. + feature_map.update( + {k: sparse_float32 for k in ['image/object/bbox/xmin', + 'image/object/bbox/ymin', + 'image/object/bbox/xmax', + 'image/object/bbox/ymax']}) + + features = tf.parse_single_example(example_serialized, feature_map) + label = tf.cast(features['image/class/label'], dtype=tf.int32) + + xmin = tf.expand_dims(features['image/object/bbox/xmin'].values, 0) + ymin = tf.expand_dims(features['image/object/bbox/ymin'].values, 0) + xmax = tf.expand_dims(features['image/object/bbox/xmax'].values, 0) + ymax = tf.expand_dims(features['image/object/bbox/ymax'].values, 0) + + # Note that we impose an ordering of (y, x) just to make life difficult. + bbox = tf.concat([ymin, xmin, ymax, xmax], 0) + + # Force the variable number of bounding boxes into the shape + # [1, num_boxes, coords]. + bbox = tf.expand_dims(bbox, 0) + bbox = tf.transpose(bbox, [0, 2, 1]) + + return features['image/encoded'], label, bbox + + +# since the preprocessing is done here, we add args file +def parse_record(raw_record, is_training): + image_buffer, label, bbox = _parse_example_proto(raw_record) + + image = preprocessing.parse_and_preprocess_image_record(image_buffer, bbox, training=is_training) + + # label-1 for VGG16 + return image, label-1 + + +def make_dataset(args, take_count, batch_size, + training=False, shard=False): + + shuffle_buffer_size = 10000 + num_readers = 10 + + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('DEVICE_INDEX')) + + if training: + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'train')) + else: + filename_pattern = os.path.join(args.data_dir, '%s-*') + filenames = sorted(tf.gfile.Glob(filename_pattern % 'validation')) + + ds = tf.data.Dataset.from_tensor_slices(filenames) + + if not training: + ds = ds.take(take_count) + + if training: + ds = ds.shuffle(1000, seed=7*(1+rank_id)) + + ds = ds.interleave(tf.data.TFRecordDataset, cycle_length=num_readers, block_length=1) + counter = tf.data.Dataset.range(sys.maxsize) + ds = tf.data.Dataset.zip((ds, counter)) + + if training: + ds = ds.apply(tf.data.experimental.shuffle_and_repeat(shuffle_buffer_size, seed=5*(1+rank_id))) + + ds = ds.map(lambda image, counter: parse_record(image, training), num_parallel_calls=14) + + ds = ds.batch(batch_size, drop_remainder=True) + return ds + + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/hyper_param.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/hyper_param.py new file mode 100644 index 0000000..52fd6f9 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/hyper_param.py @@ -0,0 +1,45 @@ +import tensorflow as tf +import math +import numpy as np + + +def warmup_cosine_annealing_lr(lr, steps_per_epoch, warmup_epochs, max_epoch, T_max, eta_min=0): + base_lr = lr + warmup_init_lr = 0 + total_steps = int(max_epoch * steps_per_epoch) + warmup_steps = int(warmup_epochs * steps_per_epoch) + + lr_each_step = [] + for i in range(total_steps): + last_epoch = i // steps_per_epoch + if i < warmup_steps: + lr = linear_warmup_lr(i + 1, warmup_steps, base_lr, warmup_init_lr) + else: + lr = eta_min + (base_lr - eta_min) * (1. + math.cos(math.pi*last_epoch / T_max)) / 2 + lr_each_step.append(lr) + + return np.array(lr_each_step).astype(np.float32) + + +class HyperParams: + def __init__(self, args): + self.args=args + nsteps_per_epoch = self.args.num_training_samples // self.args.global_batch_size + self.args.nsteps_per_epoch = nsteps_per_epoch + if self.args.max_epochs: + nstep = nsteps_per_epoch * self.args.max_epochs + else: + nstep = self.args.max_train_steps + self.args.nstep = nstep + + self.cos_lr = warmup_cosine_annealing_lr(self.args.lr, nsteps_per_epoch, 0, self.args.T_max, self.args.T_max, 0.0) + + def get_learning_rate(self): + global_step = tf.train.get_global_step() + + learning_rate = tf.gather(tf.convert_to_tensor(self.cos_lr), global_step) + + learning_rate = tf.identity(learning_rate, 'learning_rate') + + return learning_rate + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/layers.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/layers.py new file mode 100644 index 0000000..c2938bc --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/layers.py @@ -0,0 +1,22 @@ +import tensorflow as tf + + +class Layers: + def get_accuracy(self, labels, predicted_classes, logits, args): + accuracy = tf.metrics.accuracy( + labels=labels, predictions=predicted_classes) + top5acc = tf.metrics.mean( + tf.cast(tf.nn.in_top_k(logits, labels, 5), tf.float32)) + if args.rank_size == 1: + newaccuracy = (accuracy[0], accuracy[1]) + newtop5acc = (top5acc[0], top5acc[1]) + else: + from npu_bridge.hccl import hccl_ops + newaccuracy = (hccl_ops.allreduce(accuracy[0],"sum")/args.rank_size, accuracy[1]) + newtop5acc = (hccl_ops.allreduce(top5acc[0],"sum")/args.rank_size, top5acc[1]) + metrics = {'val-top1acc': newaccuracy, 'val-top5acc': newtop5acc} + return metrics + + + + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/logger.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/logger.py new file mode 100644 index 0000000..13a77f0 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/logger.py @@ -0,0 +1,88 @@ +from __future__ import print_function +import tensorflow as tf +import logging +import numpy as np +import time +import sys,os + +from benchmark_log import hwlog + +class LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, args, warmup_steps=5): + self.global_batch_size = args.global_batch_size + if args.iterations_per_loop is not None: + self.iterations_per_loop = args.iterations_per_loop + else: + self.iterations_per_loop = args.nsteps_per_epoch + self.warmup_steps = warmup_steps + self.iter_times = [] + self.num_records = args.num_training_samples + self.display_every = args.display_every + self.logger = get_logger(args.log_name, args.log_dir) + rank0log(self.logger, 'PY' + str(sys.version) + 'TF' + str(tf.__version__)) + + def after_create_session(self, session, coord): + rank0log(self.logger, 'Step Epoch Speed Loss FinLoss LR') + self.elapsed_secs = 0. + self.count = 0 + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=[tf.train.get_global_step(), 'loss:0', 'total_loss:0', 'learning_rate:0']) + + def after_run(self, run_context, run_values): + batch_time = time.time() - self.t0 + self.iter_times.append(batch_time) + self.elapsed_secs += batch_time + self.count += 1 + global_step, loss, total_loss, lr = run_values.results + if global_step == 1 or global_step % self.display_every == 0: + dt = self.elapsed_secs / self.count + img_per_sec = self.global_batch_size * self.iterations_per_loop / dt + epoch = global_step * self.global_batch_size / self.num_records + self.logger.info('step:%6i epoch:%5.1f FPS:%7.1f loss:%6.3f total_loss:%6.3f lr:%7.5f' % + (global_step, epoch, img_per_sec, loss, total_loss, lr)) + self.elapsed_secs = 0. + self.count = 0 + + hwlog.remark_print(key=hwlog.FPS, value='%7.1f'%img_per_sec) + + def get_average_speed(self): + avg_time = np.mean(self.iter_times[self.warmup_steps:]) + speed = self.global_batch_size / avg_time + return speed + + + +def rank0log(logger, *args, **kwargs): + if logger: + logger.info(''.join([str(x) for x in list(args)])) + else: + print(*args, **kwargs) + + +def get_logger(log_name, log_dir): + logger = logging.getLogger(log_name) + logger.setLevel(logging.INFO) # INFO, ERROR + # file handler which logs debug messages + if not os.path.isdir(log_dir): + try: + os.makedirs(log_dir) + except FileExistsError: + # if log_dir is common for multiple ranks like on nfs + pass + # console handler + ch = logging.StreamHandler() + ch.setLevel(logging.INFO) + # add formatter to the handlers + formatter = logging.Formatter('%(message)s') + ch.setFormatter(formatter) + logger.addHandler(ch) + fh = logging.FileHandler(os.path.join(log_dir, log_name)) + fh.setLevel(logging.DEBUG) + fh.setFormatter(formatter) + # add handlers to logger + logger.addHandler(fh) + return logger + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/model.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/model.py new file mode 100644 index 0000000..eb3b7bb --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/model.py @@ -0,0 +1,71 @@ +import tensorflow as tf +import vgg + + +class Model(object): + def __init__(self, args, data, hyper_param, layers, logger): + self.args = args + self.data = data + self.hyper_param = hyper_param + self.layers = layers + self.logger = logger + + def get_estimator_model_func(self, features, labels, mode, params=None): + labels = tf.reshape(labels, (-1,)) + + inputs = features + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + inputs = tf.cast(inputs, self.args.dtype) + + top_layer = vgg.vgg_impl(inputs, is_training) + + logits = top_layer + predicted_classes = tf.argmax(logits, axis=1, output_type=tf.int32) + logits = tf.cast(logits, tf.float32) + + labels_one_hot = tf.one_hot(labels, depth=1000) + loss = tf.losses.softmax_cross_entropy( + logits=logits, onehot_labels=labels_one_hot, label_smoothing=self.args.label_smoothing) + + base_loss = tf.identity(loss, name='loss') + + l2_loss = tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()]) + l2_loss = tf.multiply(l2_loss, self.args.weight_decay) + total_loss = base_loss + l2_loss + + total_loss = tf.identity(total_loss, name = 'total_loss') + + if mode == tf.estimator.ModeKeys.EVAL: + with tf.device(None): + metrics = self.layers.get_accuracy( labels, predicted_classes, logits, self.args) + + return tf.estimator.EstimatorSpec( + mode, loss=loss, eval_metric_ops=metrics) + + assert (mode == tf.estimator.ModeKeys.TRAIN) + + batch_size = tf.shape(inputs)[0] + + global_step = tf.train.get_global_step() + learning_rate = self.hyper_param.get_learning_rate() + + momentum = self.args.momentum + + opt = tf.train.MomentumOptimizer( + learning_rate, momentum, use_nesterov=self.args.use_nesterov) + + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + opt = NPUDistributedOptimizer(opt) + + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) or [] + + with tf.control_dependencies(update_ops): + gate_gradients = tf.train.Optimizer.GATE_NONE + grads_and_vars = opt.compute_gradients(total_loss, gate_gradients=gate_gradients) + train_op = opt.apply_gradients(grads_and_vars, global_step=global_step) + + train_op = tf.group(train_op) + + return tf.estimator.EstimatorSpec(mode, loss=total_loss, train_op=train_op) + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/preprocessing.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/preprocessing.py new file mode 100644 index 0000000..3637496 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/preprocessing.py @@ -0,0 +1,73 @@ +import tensorflow as tf +from tensorflow.contrib.image.python.ops import distort_image_ops +import math +import random + + +def decode_jpeg(imgdata, channels=3): + return tf.image.decode_jpeg(imgdata, channels=channels, + fancy_upscaling=False, + dct_method='INTEGER_FAST') + + +def random_horizontal_flip(image, prob): + if prob > random.random(): + image = tf.image.flip_left_right(image) + return image + + +def decode_crop_and_resize(record, bbox, size, scale, ratio): + with tf.name_scope('decode_crop_and_resize'): + height = 224 + width = 224 + crop_ratio = 0.8 + initial_shape = [int(round(height / crop_ratio)), + int(round(width / crop_ratio)), 3] + jpeg_shape = tf.image.extract_jpeg_shape( record ) + + bbox_begin, bbox_size, bbox = \ + tf.image.sample_distorted_bounding_box( + tf.image.extract_jpeg_shape(record), + bounding_boxes=bbox, + min_object_covered=0.1, + aspect_ratio_range=ratio, + area_range=scale, + max_attempts=10, + use_image_if_no_bounding_boxes=True) + + # Reassemble the bounding box in the format the crop op requires. + offset_y, offset_x, _ = tf.unstack(bbox_begin) + target_height, target_width, _ = tf.unstack(bbox_size) + crop_window = tf.stack([offset_y, offset_x, target_height, target_width]) + + image = tf.image.decode_and_crop_jpeg( record, crop_window, channels=3 ) + image = tf.image.resize_images( image, [height, width] ) + + return image + + +def parse_and_preprocess_image_record(record, bbox, training): + with tf.name_scope('preprocess'): + if training: + image = decode_crop_and_resize(record, bbox, 224, (0.08, 1.0), (0.75, 1.333)) + image = random_horizontal_flip(image, 0.5) + image = normalize(image) + else: + image = decode_jpeg(record, channels=3) + image = tf.image.resize_images(image, [256, 256]) + image = tf.image.central_crop(image, 224.0/256) + image = normalize(image) + + return image + + +def normalize(inputs): + imagenet_mean = [0.485 * 255, 0.456 * 255, 0.406 * 255] + imagenet_std = [0.229 * 255, 0.224 * 255, 0.225 * 255] + imagenet_mean = tf.expand_dims(tf.expand_dims(imagenet_mean, 0), 0) + imagenet_std = tf.expand_dims(tf.expand_dims(imagenet_std, 0), 0) + inputs = inputs - imagenet_mean + inputs = inputs * (1.0 / imagenet_std) + + return inputs + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train.py new file mode 100644 index 0000000..901eeae --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train.py @@ -0,0 +1,143 @@ +import tensorflow as tf +import numpy as np +import os +import sys +import ast + +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../'))) +sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../config'))) +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../utils')) +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../utils/atlasboost')) + + +import data_loader as dl +import model as ml +import hyper_param as hp +import layers as ly +import logger as lg +import trainer as tr +import create_session as cs + +print(os.getcwd()) + +import argparse + +#import hwlog +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +def parse_args(): + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + + parser.add_argument('--rank_size', default=1,type=int, + help="""number of NPUs to use.""") + + # mode and parameters related + parser.add_argument('--mode', default='train_and_evaluate', + help="""mode to run the program e.g. train, evaluate, and + train_and_evaluate""") + parser.add_argument('--max_train_steps', default=100,type=int, + help="""max steps to train""") + parser.add_argument('--iterations_per_loop', default=10, type=int, + help="""the number of steps in devices for each iteration""") + parser.add_argument('--max_epochs', default=None, type=int, + help="""total epochs for training""") + parser.add_argument('--epochs_between_evals', default=5, type=int, + help="""the interval between train and evaluation , only meaningful + when the mode is train_and_evaluate""") + + # dataset + parser.add_argument('--data_dir', default='path/data', + help="""directory of dataset.""") + + # path for evaluation + parser.add_argument('--eval_dir', default='path/eval', + help="""directory to evaluate.""") + + parser.add_argument('--dtype', default=tf.float32, + help="""data type of inputs.""") + parser.add_argument('--use_nesterov', default=True, type=ast.literal_eval, + help="""whether to use Nesterov in optimizer""") + parser.add_argument('--label_smoothing', default=0.1, type=float, + help="""label smoothing factor""") + parser.add_argument('--weight_decay', default=0.0001, + help="""weight decay for regularization""") + parser.add_argument('--batch_size', default=32, type=int, + help="""batch size for one NPU""") + + # learning rate and momentum + parser.add_argument('--lr', default=0.01, type=float, + help="""initial learning rate""") + parser.add_argument('--T_max', default=150, type=int, + help="""T_max for cosing_annealing learning rate""") + parser.add_argument('--momentum', default=0.9, type=float, + help="""momentum used in optimizer.""") + + # display frequency + parser.add_argument('--display_every', default=1, type=int, + help="""the frequency to display info""") + + # log file + parser.add_argument('--log_name', default='vgg16.log', + help="""name of log file""") + parser.add_argument('--log_dir', default='./model_1p', + help="""log directory""") + + args, unknown_args = parser.parse_known_args() + if len(unknown_args) > 0: + for bad_arg in unknown_args: + print("ERROR: Unknown command line arg: %s" % bad_arg) + raise ValueError("Invalid command line arg(s)") + + return args + + +def main(): + + args = parse_args() + args.global_batch_size = args.batch_size * args.rank_size + + session = cs.CreateSession() + data = dl.DataLoader(args) + hyper_param = hp.HyperParams(args) + layers = ly.Layers() + logger = lg.LogSessionRunHook(args) + model = ml.Model(args, data, hyper_param, layers, logger) + + trainer = tr.Trainer(session, args, data, model, logger) + + if args.mode == 'train': + trainer.train() + elif args.mode == 'evaluate': + trainer.evaluate() + elif args.mode == 'train_and_evaluate': + trainer.train_and_evaluate() + else: + raise ValueError("Invalid mode.") + + +if __name__ == '__main__': + + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.01, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512, + "batchsize": 32} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + + tf.logging.set_verbosity(tf.logging.INFO) + main() + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train_helper.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train_helper.py new file mode 100644 index 0000000..9d3d3de --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/train_helper.py @@ -0,0 +1,21 @@ +import tensorflow as tf +from tensorflow.python.ops import data_flow_ops +import re +import os +from operator import itemgetter + + +def sort_and_load_ckpts(log_dir): + ckpts = [] + for f in os.listdir(log_dir): + m = re.match(r'model.ckpt-([0-9]+).index', f) + if m is None: + continue + fullpath = os.path.join(log_dir, f) + ckpts.append({'step': int(m.group(1)), + 'path': os.path.splitext(fullpath)[0], + 'mtime': os.stat(fullpath).st_mtime, + }) + ckpts.sort(key=itemgetter('step')) + return ckpts + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/trainer.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/trainer.py new file mode 100644 index 0000000..7bcbcad --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/trainer.py @@ -0,0 +1,142 @@ +import tensorflow as tf +import math +import time +import os +import train_helper +from logger import rank0log + +import sys +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../utils')) +from benchmark_log import hwlog + + +class Trainer(object): + def __init__(self, session, args, data, model, logger): + self.sess = session + self.args = args + self.data = data + self.model = model + self.logger = logger + self.print_logger = self.logger.logger + self.all_preds = [] + self.all_targets = [] + + self.classifier, self.training_hook = self.get_npu_classifier() + + def get_npu_classifier(self): + from npu_bridge.estimator.npu.npu_config import NPURunConfig + from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + + run_config = NPURunConfig( + hcom_parallel=True, + precision_mode="allow_mix_precision", + enable_data_pre_proc=True, + save_checkpoints_steps=self.args.nsteps_per_epoch, + session_config=self.sess.estimator_config, + model_dir=self.args.log_dir, + iterations_per_loop=self.args.iterations_per_loop, + keep_checkpoint_max=5) + + classifier =NPUEstimator( + model_fn= self.model.get_estimator_model_func, + config= run_config + ) + + training_hooks = [] + training_hooks.append(self.logger) + + return classifier, training_hooks + + def train(self): + + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=self.args.max_epochs) + + print ('training steps: %d' % self.args.nstep) + self.classifier.train( input_fn=lambda:self.data.get_train_input_fn(), + max_steps = self.args.nstep, + hooks = self.training_hook + ) + + def evaluate(self): + rank0log(self.print_logger, "Evaluating") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.args.num_evaluating_samples)) + time.sleep(5) # a little extra margin... + try: + ckpts = train_helper.sort_and_load_ckpts(self.args.eval_dir) + print("=========ckpt==========") + print(ckpts) + print("=========ckpt==========") + for i, c in enumerate(ckpts): + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + + + c['epoch'] = math.ceil(c['step'] / (self.args.num_training_samples/ (self.args.batch_size))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + for i, c in enumerate(ckpts): + if 'top1' not in c: + continue + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + rank0log(self.print_logger, "Finished evaluation") + except KeyboardInterrupt: + self.print_logger.error("Keyboard interrupt") + + def train_and_evaluate(self): + epochs_between_evals = self.args.epochs_between_evals + + for i in range(self.args.max_epochs // epochs_between_evals): + + rank0log(self.print_logger, "Starting a training cycle") + + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=self.args.max_epochs) + + + self.classifier.train(input_fn=lambda:self.data.get_train_input_fn(), + steps = self.args.nsteps_per_epoch*epochs_between_evals, + hooks = self.training_hook ) + + rank0log(self.print_logger, "Starting to evaluate") + rank0log(self.print_logger, "Validation dataset size: {}".format(self.args.num_evaluating_samples)) + time.sleep(5) # a little extra margin... + + ckpts = train_helper.sort_and_load_ckpts(self.args.log_dir) + c = ckpts[-1] + eval_result = self.classifier.evaluate( + input_fn=lambda: self.data.get_eval_input_fn(), + checkpoint_path=c['path']) + + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP1, value=float(eval_result.get("val-top1acc"))) + hwlog.remark_print(key=hwlog.EVAL_ACCURACY_TOP5, value=float(eval_result.get("val-top5acc"))) + + + c['epoch'] = math.ceil(c['step'] / (self.args.num_training_samples / (self.args.batch_size * self.args.rank_size))) + c['top1'] = eval_result['val-top1acc'] + c['top5'] = eval_result['val-top5acc'] + c['loss'] = eval_result['loss'] + + rank0log(self.print_logger, ' step epoch top1 top5 loss checkpoint_time(UTC)') + + rank0log(self.print_logger,'{:5d} {:5.1f} {:5.3f} {:6.2f} {:6.2f} {time}' + .format(c['step'], + c['epoch'], + c['top1'] * 100, + c['top5'] * 100, + c['loss'], + time=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(c['mtime'])))) + diff --git a/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/vgg.py b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/vgg.py new file mode 100644 index 0000000..7f38b85 --- /dev/null +++ b/train/atlas_benchmark-master/image_classification/vgg16/tensorflow/vgg16/vgg.py @@ -0,0 +1,63 @@ +import tensorflow as tf + +from npu_bridge.estimator import npu_ops + +# vgg with initialization method in gluoncv +def vgg_impl(inputs, is_training=True): + x = inputs + + # conv1 + x = tf.layers.conv2d(x, 64, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 64, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + + # mp1 + x = tf.layers.max_pooling2d(x, (2, 2), (2, 2), padding='SAME') + + # covn2 + x = tf.layers.conv2d(x, 128, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 128, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + + # mp2 + x = tf.layers.max_pooling2d(x, (2, 2), (2, 2), padding='SAME') + + # conv3 + x = tf.layers.conv2d(x, 256, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 256, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 256, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + + # mp3 + x = tf.layers.max_pooling2d(x, (2, 2), (2, 2), padding='SAME') + + # conv4 + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + + # mp4 + x = tf.layers.max_pooling2d(x, (2, 2), (2, 2), padding='SAME') + + # conv5 + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + x = tf.layers.conv2d(x, 512, kernel_size=(3, 3), activation=tf.nn.relu, padding='SAME', use_bias=True, kernel_initializer=tf.initializers.variance_scaling(scale=2.0, mode='fan_out')) + + # mp5 + x = tf.layers.max_pooling2d(x, (2, 2), (2, 2), padding='SAME') + + x = tf.reshape(x, [-1, 7 * 7 * 512]) + + # fc6 + x = tf.layers.dense(x, 4096, activation=tf.nn.relu, use_bias=True, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01)) + # drop6 + if is_training: + x = npu_ops.dropout(x, 0.5) + # fc7 + x = tf.layers.dense(x, 4096, activation=tf.nn.relu, use_bias=True, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01)) + # drop7 + if is_training: + x = npu_ops.dropout(x, 0.5) + # fc8 + x = tf.layers.dense(x, 1000, activation=None, use_bias=True, kernel_initializer=tf.keras.initializers.RandomNormal(stddev=0.01)) + + return x + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/README.md b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/README.md new file mode 100644 index 0000000..427e3da --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/README.md @@ -0,0 +1,56 @@ +# Bert-Base_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/Bert-Base.yaml中修改相应配置, 配置项含义: + +``` + tensorflow_config: + #layer层数有6和12两种,中文数据集用 bert_base_layer6_cn.json/bert_base_layer12_cn.json 英文用bert_base_layer6_cn.json/bert_base_layer12_en.json + bert_config_file: bert_base_layer6_cn.json + #数据集句子长度是256时 设置为 256,40,句子长度是128时设置为128,20 + max_seq_length: 128 + max_predictions_per_seq: 20 + + # 最佳性能train_batch_size为160 + train_batch_size: 160 + learning_rate: 1e-4 + num_warmup_steps: 100 + num_train_steps: 1000 + optimizer_type: adam + manual_fp16: True + use_fp16_cls: True + input_files_dir: 数据集路径 + eval_files_dir: 数据集路径 + npu_bert_debug: False + npu_bert_use_tdt: True + distributed: True + do_train: True + do_eval: False + num_accumulation_steps: 1 + iterations_per_loop: 100 + npu_bert_loss_scale: 0 + save_checkpoints_steps: 1000 + npu_bert_clip_by_global_norm: False + + # docker 镜像名称:版本号 + docker_image: c73:b021 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.140.199:8,90.90.140.229:8 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 6 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/__init__.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/__init__.py new file mode 100644 index 0000000..effb57b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_config.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_config.json new file mode 100644 index 0000000..012ec3b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_config.json @@ -0,0 +1,13 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 12, + "type_vocab_size": 2, + "vocab_size": 30522 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_vocab.txt b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_vocab.txt new file mode 100644 index 0000000..ca4f978 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/bert_base_vocab.txt @@ -0,0 +1,21128 @@ +[PAD] +[unused1] +[unused2] +[unused3] +[unused4] +[unused5] +[unused6] +[unused7] +[unused8] +[unused9] +[unused10] +[unused11] +[unused12] +[unused13] +[unused14] +[unused15] +[unused16] +[unused17] +[unused18] +[unused19] +[unused20] +[unused21] +[unused22] +[unused23] +[unused24] +[unused25] +[unused26] +[unused27] +[unused28] +[unused29] +[unused30] +[unused31] +[unused32] +[unused33] +[unused34] +[unused35] +[unused36] +[unused37] +[unused38] +[unused39] +[unused40] +[unused41] +[unused42] +[unused43] +[unused44] +[unused45] +[unused46] +[unused47] +[unused48] +[unused49] +[unused50] +[unused51] +[unused52] +[unused53] +[unused54] +[unused55] +[unused56] +[unused57] +[unused58] +[unused59] +[unused60] +[unused61] +[unused62] +[unused63] +[unused64] +[unused65] +[unused66] +[unused67] +[unused68] +[unused69] +[unused70] +[unused71] +[unused72] +[unused73] +[unused74] +[unused75] +[unused76] +[unused77] +[unused78] +[unused79] +[unused80] +[unused81] +[unused82] +[unused83] +[unused84] +[unused85] +[unused86] +[unused87] +[unused88] +[unused89] +[unused90] +[unused91] +[unused92] +[unused93] +[unused94] +[unused95] +[unused96] +[unused97] +[unused98] +[unused99] +[UNK] +[CLS] +[SEP] +[MASK] + + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +[ +\ +] +^ +_ +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +£ +¤ +¥ +§ +© +« +® +° +± +² +³ +µ +· +¹ +º +» +¼ +× +ß +æ +÷ +ø +đ +ŋ +ɔ +ə +ɡ +ʰ +ˇ +ˈ +ˊ +ˋ +ˍ +ː +˙ +˚ +ˢ +α +β +γ +δ +ε +η +θ +ι +κ +λ +μ +ν +ο +π +ρ +ς +σ +τ +υ +φ +χ +ψ +ω +а +б +в +г +д +е +ж +з +и +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +ы +ь +я +і +ا +ب +ة +ت +د +ر +س +ع +ل +م +ن +ه +و +ي +۩ +ก +ง +น +ม +ย +ร +อ +า +เ +๑ +་ +ღ +ᄀ +ᄁ +ᄂ +ᄃ +ᄅ +ᄆ +ᄇ +ᄈ +ᄉ +ᄋ +ᄌ +ᄎ +ᄏ +ᄐ +ᄑ +ᄒ +ᅡ +ᅢ +ᅣ +ᅥ +ᅦ +ᅧ +ᅨ +ᅩ +ᅪ +ᅬ +ᅭ +ᅮ +ᅯ +ᅲ +ᅳ +ᅴ +ᅵ +ᆨ +ᆫ +ᆯ +ᆷ +ᆸ +ᆺ +ᆻ +ᆼ +ᗜ +ᵃ +ᵉ +ᵍ +ᵏ +ᵐ +ᵒ +ᵘ +‖ +„ +† +• +‥ +‧ +
 +‰ +′ +″ +‹ +› +※ +‿ +⁄ +ⁱ +⁺ +ⁿ +₁ +₂ +₃ +₄ +€ +℃ +№ +™ +ⅰ +ⅱ +ⅲ +ⅳ +ⅴ +← +↑ +→ +↓ +↔ +↗ +↘ +⇒ +∀ +− +∕ +∙ +√ +∞ +∟ +∠ +∣ +∥ +∩ +∮ +∶ +∼ +∽ +≈ +≒ +≡ +≤ +≥ +≦ +≧ +≪ +≫ +⊙ +⋅ +⋈ +⋯ +⌒ +① +② +③ +④ +⑤ +⑥ +⑦ +⑧ +⑨ +⑩ +⑴ +⑵ +⑶ +⑷ +⑸ +⒈ +⒉ +⒊ +⒋ +ⓒ +ⓔ +ⓘ +─ +━ +│ +┃ +┅ +┆ +┊ +┌ +└ +├ +┣ +═ +║ +╚ +╞ +╠ +╭ +╮ +╯ +╰ +╱ +╳ +▂ +▃ +▅ +▇ +█ +▉ +▋ +▌ +▍ +▎ +■ +□ +▪ +▫ +▬ +▲ +△ +▶ +► +▼ +▽ +◆ +◇ +○ +◎ +● +◕ +◠ +◢ +◤ +☀ +★ +☆ +☕ +☞ +☺ +☼ +♀ +♂ +♠ +♡ +♣ +♥ +♦ +♪ +♫ +♬ +✈ +✔ +✕ +✖ +✦ +✨ +✪ +✰ +✿ +❀ +❤ +➜ +➤ +⦿ +、 +。 +〃 +々 +〇 +〈 +〉 +《 +》 +「 +」 +『 +』 +【 +】 +〓 +〔 +〕 +〖 +〗 +〜 +〝 +〞 +ぁ +あ +ぃ +い +う +ぇ +え +お +か +き +く +け +こ +さ +し +す +せ +そ +た +ち +っ +つ +て +と +な +に +ぬ +ね +の +は +ひ +ふ +へ +ほ +ま +み +む +め +も +ゃ +や +ゅ +ゆ +ょ +よ +ら +り +る +れ +ろ +わ +を +ん +゜ +ゝ +ァ +ア +ィ +イ +ゥ +ウ +ェ +エ +ォ +オ +カ +キ +ク +ケ +コ +サ +シ +ス +セ +ソ +タ +チ +ッ +ツ +テ +ト +ナ +ニ +ヌ +ネ +ノ +ハ +ヒ +フ +ヘ +ホ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ワ +ヲ +ン +ヶ +・ +ー +ヽ +ㄅ +ㄆ +ㄇ +ㄉ +ㄋ +ㄌ +ㄍ +ㄎ +ㄏ +ㄒ +ㄚ +ㄛ +ㄞ +ㄟ +ㄢ +ㄤ +ㄥ +ㄧ +ㄨ +ㆍ +㈦ +㊣ +㎡ +㗎 +一 +丁 +七 +万 +丈 +三 +上 +下 +不 +与 +丐 +丑 +专 +且 +丕 +世 +丘 +丙 +业 +丛 +东 +丝 +丞 +丟 +両 +丢 +两 +严 +並 +丧 +丨 +个 +丫 +中 +丰 +串 +临 +丶 +丸 +丹 +为 +主 +丼 +丽 +举 +丿 +乂 +乃 +久 +么 +义 +之 +乌 +乍 +乎 +乏 +乐 +乒 +乓 +乔 +乖 +乗 +乘 +乙 +乜 +九 +乞 +也 +习 +乡 +书 +乩 +买 +乱 +乳 +乾 +亀 +亂 +了 +予 +争 +事 +二 +于 +亏 +云 +互 +五 +井 +亘 +亙 +亚 +些 +亜 +亞 +亟 +亡 +亢 +交 +亥 +亦 +产 +亨 +亩 +享 +京 +亭 +亮 +亲 +亳 +亵 +人 +亿 +什 +仁 +仃 +仄 +仅 +仆 +仇 +今 +介 +仍 +从 +仏 +仑 +仓 +仔 +仕 +他 +仗 +付 +仙 +仝 +仞 +仟 +代 +令 +以 +仨 +仪 +们 +仮 +仰 +仲 +件 +价 +任 +份 +仿 +企 +伉 +伊 +伍 +伎 +伏 +伐 +休 +伕 +众 +优 +伙 +会 +伝 +伞 +伟 +传 +伢 +伤 +伦 +伪 +伫 +伯 +估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +佇 +佈 +位 +低 +住 +佐 +佑 +体 +佔 +何 +佗 +佘 +余 +佚 +佛 +作 +佝 +佞 +佟 +你 +佢 +佣 +佤 +佥 +佩 +佬 +佯 +佰 +佳 +併 +佶 +佻 +佼 +使 +侃 +侄 +來 +侈 +例 +侍 +侏 +侑 +侖 +侗 +供 +依 +侠 +価 +侣 +侥 +侦 +侧 +侨 +侬 +侮 +侯 +侵 +侶 +侷 +便 +係 +促 +俄 +俊 +俎 +俏 +俐 +俑 +俗 +俘 +俚 +保 +俞 +俟 +俠 +信 +俨 +俩 +俪 +俬 +俭 +修 +俯 +俱 +俳 +俸 +俺 +俾 +倆 +倉 +個 +倌 +倍 +倏 +們 +倒 +倔 +倖 +倘 +候 +倚 +倜 +借 +倡 +値 +倦 +倩 +倪 +倫 +倬 +倭 +倶 +债 +值 +倾 +偃 +假 +偈 +偉 +偌 +偎 +偏 +偕 +做 +停 +健 +側 +偵 +偶 +偷 +偻 +偽 +偿 +傀 +傅 +傍 +傑 +傘 +備 +傚 +傢 +傣 +傥 +储 +傩 +催 +傭 +傲 +傳 +債 +傷 +傻 +傾 +僅 +働 +像 +僑 +僕 +僖 +僚 +僥 +僧 +僭 +僮 +僱 +僵 +價 +僻 +儀 +儂 +億 +儆 +儉 +儋 +儒 +儕 +儘 +償 +儡 +優 +儲 +儷 +儼 +儿 +兀 +允 +元 +兄 +充 +兆 +兇 +先 +光 +克 +兌 +免 +児 +兑 +兒 +兔 +兖 +党 +兜 +兢 +入 +內 +全 +兩 +八 +公 +六 +兮 +兰 +共 +兲 +关 +兴 +兵 +其 +具 +典 +兹 +养 +兼 +兽 +冀 +内 +円 +冇 +冈 +冉 +冊 +册 +再 +冏 +冒 +冕 +冗 +写 +军 +农 +冠 +冢 +冤 +冥 +冨 +冪 +冬 +冯 +冰 +冲 +决 +况 +冶 +冷 +冻 +冼 +冽 +冾 +净 +凄 +准 +凇 +凈 +凉 +凋 +凌 +凍 +减 +凑 +凛 +凜 +凝 +几 +凡 +凤 +処 +凪 +凭 +凯 +凰 +凱 +凳 +凶 +凸 +凹 +出 +击 +函 +凿 +刀 +刁 +刃 +分 +切 +刈 +刊 +刍 +刎 +刑 +划 +列 +刘 +则 +刚 +创 +初 +删 +判 +別 +刨 +利 +刪 +别 +刮 +到 +制 +刷 +券 +刹 +刺 +刻 +刽 +剁 +剂 +剃 +則 +剉 +削 +剋 +剌 +前 +剎 +剐 +剑 +剔 +剖 +剛 +剜 +剝 +剣 +剤 +剥 +剧 +剩 +剪 +副 +割 +創 +剷 +剽 +剿 +劃 +劇 +劈 +劉 +劊 +劍 +劏 +劑 +力 +劝 +办 +功 +加 +务 +劣 +动 +助 +努 +劫 +劭 +励 +劲 +劳 +労 +劵 +効 +劾 +势 +勁 +勃 +勇 +勉 +勋 +勐 +勒 +動 +勖 +勘 +務 +勛 +勝 +勞 +募 +勢 +勤 +勧 +勳 +勵 +勸 +勺 +勻 +勾 +勿 +匀 +包 +匆 +匈 +匍 +匐 +匕 +化 +北 +匙 +匝 +匠 +匡 +匣 +匪 +匮 +匯 +匱 +匹 +区 +医 +匾 +匿 +區 +十 +千 +卅 +升 +午 +卉 +半 +卍 +华 +协 +卑 +卒 +卓 +協 +单 +卖 +南 +単 +博 +卜 +卞 +卟 +占 +卡 +卢 +卤 +卦 +卧 +卫 +卮 +卯 +印 +危 +即 +却 +卵 +卷 +卸 +卻 +卿 +厂 +厄 +厅 +历 +厉 +压 +厌 +厕 +厘 +厚 +厝 +原 +厢 +厥 +厦 +厨 +厩 +厭 +厮 +厲 +厳 +去 +县 +叁 +参 +參 +又 +叉 +及 +友 +双 +反 +収 +发 +叔 +取 +受 +变 +叙 +叛 +叟 +叠 +叡 +叢 +口 +古 +句 +另 +叨 +叩 +只 +叫 +召 +叭 +叮 +可 +台 +叱 +史 +右 +叵 +叶 +号 +司 +叹 +叻 +叼 +叽 +吁 +吃 +各 +吆 +合 +吉 +吊 +吋 +同 +名 +后 +吏 +吐 +向 +吒 +吓 +吕 +吖 +吗 +君 +吝 +吞 +吟 +吠 +吡 +否 +吧 +吨 +吩 +含 +听 +吭 +吮 +启 +吱 +吳 +吴 +吵 +吶 +吸 +吹 +吻 +吼 +吽 +吾 +呀 +呂 +呃 +呆 +呈 +告 +呋 +呎 +呐 +呓 +呕 +呗 +员 +呛 +呜 +呢 +呤 +呦 +周 +呱 +呲 +味 +呵 +呷 +呸 +呻 +呼 +命 +咀 +咁 +咂 +咄 +咆 +咋 +和 +咎 +咏 +咐 +咒 +咔 +咕 +咖 +咗 +咘 +咙 +咚 +咛 +咣 +咤 +咦 +咧 +咨 +咩 +咪 +咫 +咬 +咭 +咯 +咱 +咲 +咳 +咸 +咻 +咽 +咿 +哀 +品 +哂 +哄 +哆 +哇 +哈 +哉 +哋 +哌 +响 +哎 +哏 +哐 +哑 +哒 +哔 +哗 +哟 +員 +哥 +哦 +哧 +哨 +哩 +哪 +哭 +哮 +哲 +哺 +哼 +哽 +唁 +唄 +唆 +唇 +唉 +唏 +唐 +唑 +唔 +唠 +唤 +唧 +唬 +售 +唯 +唰 +唱 +唳 +唷 +唸 +唾 +啃 +啄 +商 +啉 +啊 +問 +啓 +啕 +啖 +啜 +啞 +啟 +啡 +啤 +啥 +啦 +啧 +啪 +啫 +啬 +啮 +啰 +啱 +啲 +啵 +啶 +啷 +啸 +啻 +啼 +啾 +喀 +喂 +喃 +善 +喆 +喇 +喉 +喊 +喋 +喎 +喏 +喔 +喘 +喙 +喚 +喜 +喝 +喟 +喧 +喪 +喫 +喬 +單 +喰 +喱 +喲 +喳 +喵 +営 +喷 +喹 +喺 +喻 +喽 +嗅 +嗆 +嗇 +嗎 +嗑 +嗒 +嗓 +嗔 +嗖 +嗚 +嗜 +嗝 +嗟 +嗡 +嗣 +嗤 +嗦 +嗨 +嗪 +嗬 +嗯 +嗰 +嗲 +嗳 +嗶 +嗷 +嗽 +嘀 +嘅 +嘆 +嘈 +嘉 +嘌 +嘍 +嘎 +嘔 +嘖 +嘗 +嘘 +嘚 +嘛 +嘜 +嘞 +嘟 +嘢 +嘣 +嘤 +嘧 +嘩 +嘭 +嘮 +嘯 +嘰 +嘱 +嘲 +嘴 +嘶 +嘸 +嘹 +嘻 +嘿 +噁 +噌 +噎 +噓 +噔 +噗 +噙 +噜 +噠 +噢 +噤 +器 +噩 +噪 +噬 +噱 +噴 +噶 +噸 +噹 +噻 +噼 +嚀 +嚇 +嚎 +嚏 +嚐 +嚓 +嚕 +嚟 +嚣 +嚥 +嚨 +嚮 +嚴 +嚷 +嚼 +囂 +囉 +囊 +囍 +囑 +囔 +囗 +囚 +四 +囝 +回 +囟 +因 +囡 +团 +団 +囤 +囧 +囪 +囫 +园 +困 +囱 +囲 +図 +围 +囹 +固 +国 +图 +囿 +圃 +圄 +圆 +圈 +國 +圍 +圏 +園 +圓 +圖 +團 +圜 +土 +圣 +圧 +在 +圩 +圭 +地 +圳 +场 +圻 +圾 +址 +坂 +均 +坊 +坍 +坎 +坏 +坐 +坑 +块 +坚 +坛 +坝 +坞 +坟 +坠 +坡 +坤 +坦 +坨 +坪 +坯 +坳 +坵 +坷 +垂 +垃 +垄 +型 +垒 +垚 +垛 +垠 +垢 +垣 +垦 +垩 +垫 +垭 +垮 +垵 +埂 +埃 +埋 +城 +埔 +埕 +埗 +域 +埠 +埤 +埵 +執 +埸 +培 +基 +埼 +堀 +堂 +堃 +堅 +堆 +堇 +堑 +堕 +堙 +堡 +堤 +堪 +堯 +堰 +報 +場 +堵 +堺 +堿 +塊 +塌 +塑 +塔 +塗 +塘 +塚 +塞 +塢 +塩 +填 +塬 +塭 +塵 +塾 +墀 +境 +墅 +墉 +墊 +墒 +墓 +増 +墘 +墙 +墜 +增 +墟 +墨 +墩 +墮 +墳 +墻 +墾 +壁 +壅 +壆 +壇 +壊 +壑 +壓 +壕 +壘 +壞 +壟 +壢 +壤 +壩 +士 +壬 +壮 +壯 +声 +売 +壳 +壶 +壹 +壺 +壽 +处 +备 +変 +复 +夏 +夔 +夕 +外 +夙 +多 +夜 +够 +夠 +夢 +夥 +大 +天 +太 +夫 +夭 +央 +夯 +失 +头 +夷 +夸 +夹 +夺 +夾 +奂 +奄 +奇 +奈 +奉 +奋 +奎 +奏 +奐 +契 +奔 +奕 +奖 +套 +奘 +奚 +奠 +奢 +奥 +奧 +奪 +奬 +奮 +女 +奴 +奶 +奸 +她 +好 +如 +妃 +妄 +妆 +妇 +妈 +妊 +妍 +妒 +妓 +妖 +妘 +妙 +妝 +妞 +妣 +妤 +妥 +妨 +妩 +妪 +妮 +妲 +妳 +妹 +妻 +妾 +姆 +姉 +姊 +始 +姍 +姐 +姑 +姒 +姓 +委 +姗 +姚 +姜 +姝 +姣 +姥 +姦 +姨 +姪 +姫 +姬 +姹 +姻 +姿 +威 +娃 +娄 +娅 +娆 +娇 +娉 +娑 +娓 +娘 +娛 +娜 +娟 +娠 +娣 +娥 +娩 +娱 +娲 +娴 +娶 +娼 +婀 +婁 +婆 +婉 +婊 +婕 +婚 +婢 +婦 +婧 +婪 +婭 +婴 +婵 +婶 +婷 +婺 +婿 +媒 +媚 +媛 +媞 +媧 +媲 +媳 +媽 +媾 +嫁 +嫂 +嫉 +嫌 +嫑 +嫔 +嫖 +嫘 +嫚 +嫡 +嫣 +嫦 +嫩 +嫲 +嫵 +嫻 +嬅 +嬉 +嬌 +嬗 +嬛 +嬢 +嬤 +嬪 +嬰 +嬴 +嬷 +嬸 +嬿 +孀 +孃 +子 +孑 +孔 +孕 +孖 +字 +存 +孙 +孚 +孛 +孜 +孝 +孟 +孢 +季 +孤 +学 +孩 +孪 +孫 +孬 +孰 +孱 +孳 +孵 +學 +孺 +孽 +孿 +宁 +它 +宅 +宇 +守 +安 +宋 +完 +宏 +宓 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +实 +実 +宠 +审 +客 +宣 +室 +宥 +宦 +宪 +宫 +宮 +宰 +害 +宴 +宵 +家 +宸 +容 +宽 +宾 +宿 +寂 +寄 +寅 +密 +寇 +富 +寐 +寒 +寓 +寛 +寝 +寞 +察 +寡 +寢 +寥 +實 +寧 +寨 +審 +寫 +寬 +寮 +寰 +寵 +寶 +寸 +对 +寺 +寻 +导 +対 +寿 +封 +専 +射 +将 +將 +專 +尉 +尊 +尋 +對 +導 +小 +少 +尔 +尕 +尖 +尘 +尚 +尝 +尤 +尧 +尬 +就 +尴 +尷 +尸 +尹 +尺 +尻 +尼 +尽 +尾 +尿 +局 +屁 +层 +屄 +居 +屆 +屈 +屉 +届 +屋 +屌 +屍 +屎 +屏 +屐 +屑 +展 +屜 +属 +屠 +屡 +屢 +層 +履 +屬 +屯 +山 +屹 +屿 +岀 +岁 +岂 +岌 +岐 +岑 +岔 +岖 +岗 +岘 +岙 +岚 +岛 +岡 +岩 +岫 +岬 +岭 +岱 +岳 +岷 +岸 +峇 +峋 +峒 +峙 +峡 +峤 +峥 +峦 +峨 +峪 +峭 +峯 +峰 +峴 +島 +峻 +峽 +崁 +崂 +崆 +崇 +崎 +崑 +崔 +崖 +崗 +崙 +崛 +崧 +崩 +崭 +崴 +崽 +嵇 +嵊 +嵋 +嵌 +嵐 +嵘 +嵩 +嵬 +嵯 +嶂 +嶄 +嶇 +嶋 +嶙 +嶺 +嶼 +嶽 +巅 +巍 +巒 +巔 +巖 +川 +州 +巡 +巢 +工 +左 +巧 +巨 +巩 +巫 +差 +己 +已 +巳 +巴 +巷 +巻 +巽 +巾 +巿 +币 +市 +布 +帅 +帆 +师 +希 +帐 +帑 +帕 +帖 +帘 +帚 +帛 +帜 +帝 +帥 +带 +帧 +師 +席 +帮 +帯 +帰 +帳 +帶 +帷 +常 +帼 +帽 +幀 +幂 +幄 +幅 +幌 +幔 +幕 +幟 +幡 +幢 +幣 +幫 +干 +平 +年 +并 +幸 +幹 +幺 +幻 +幼 +幽 +幾 +广 +庁 +広 +庄 +庆 +庇 +床 +序 +庐 +库 +应 +底 +庖 +店 +庙 +庚 +府 +庞 +废 +庠 +度 +座 +庫 +庭 +庵 +庶 +康 +庸 +庹 +庾 +廁 +廂 +廃 +廈 +廉 +廊 +廓 +廖 +廚 +廝 +廟 +廠 +廢 +廣 +廬 +廳 +延 +廷 +建 +廿 +开 +弁 +异 +弃 +弄 +弈 +弊 +弋 +式 +弑 +弒 +弓 +弔 +引 +弗 +弘 +弛 +弟 +张 +弥 +弦 +弧 +弩 +弭 +弯 +弱 +張 +強 +弹 +强 +弼 +弾 +彅 +彆 +彈 +彌 +彎 +归 +当 +录 +彗 +彙 +彝 +形 +彤 +彥 +彦 +彧 +彩 +彪 +彫 +彬 +彭 +彰 +影 +彷 +役 +彻 +彼 +彿 +往 +征 +径 +待 +徇 +很 +徉 +徊 +律 +後 +徐 +徑 +徒 +従 +徕 +得 +徘 +徙 +徜 +從 +徠 +御 +徨 +復 +循 +徬 +微 +徳 +徴 +徵 +德 +徹 +徼 +徽 +心 +必 +忆 +忌 +忍 +忏 +忐 +忑 +忒 +忖 +志 +忘 +忙 +応 +忠 +忡 +忤 +忧 +忪 +快 +忱 +念 +忻 +忽 +忿 +怀 +态 +怂 +怅 +怆 +怎 +怏 +怒 +怔 +怕 +怖 +怙 +怜 +思 +怠 +怡 +急 +怦 +性 +怨 +怪 +怯 +怵 +总 +怼 +恁 +恃 +恆 +恋 +恍 +恐 +恒 +恕 +恙 +恚 +恢 +恣 +恤 +恥 +恨 +恩 +恪 +恫 +恬 +恭 +息 +恰 +恳 +恵 +恶 +恸 +恺 +恻 +恼 +恿 +悄 +悅 +悉 +悌 +悍 +悔 +悖 +悚 +悟 +悠 +患 +悦 +您 +悩 +悪 +悬 +悯 +悱 +悲 +悴 +悵 +悶 +悸 +悻 +悼 +悽 +情 +惆 +惇 +惊 +惋 +惑 +惕 +惘 +惚 +惜 +惟 +惠 +惡 +惦 +惧 +惨 +惩 +惫 +惬 +惭 +惮 +惯 +惰 +惱 +想 +惴 +惶 +惹 +惺 +愁 +愆 +愈 +愉 +愍 +意 +愕 +愚 +愛 +愜 +感 +愣 +愤 +愧 +愫 +愷 +愿 +慄 +慈 +態 +慌 +慎 +慑 +慕 +慘 +慚 +慟 +慢 +慣 +慧 +慨 +慫 +慮 +慰 +慳 +慵 +慶 +慷 +慾 +憂 +憊 +憋 +憎 +憐 +憑 +憔 +憚 +憤 +憧 +憨 +憩 +憫 +憬 +憲 +憶 +憾 +懂 +懇 +懈 +應 +懊 +懋 +懑 +懒 +懦 +懲 +懵 +懶 +懷 +懸 +懺 +懼 +懾 +懿 +戀 +戈 +戊 +戌 +戍 +戎 +戏 +成 +我 +戒 +戕 +或 +战 +戚 +戛 +戟 +戡 +戦 +截 +戬 +戮 +戰 +戲 +戳 +戴 +戶 +户 +戸 +戻 +戾 +房 +所 +扁 +扇 +扈 +扉 +手 +才 +扎 +扑 +扒 +打 +扔 +払 +托 +扛 +扣 +扦 +执 +扩 +扪 +扫 +扬 +扭 +扮 +扯 +扰 +扱 +扳 +扶 +批 +扼 +找 +承 +技 +抄 +抉 +把 +抑 +抒 +抓 +投 +抖 +抗 +折 +抚 +抛 +抜 +択 +抟 +抠 +抡 +抢 +护 +报 +抨 +披 +抬 +抱 +抵 +抹 +押 +抽 +抿 +拂 +拄 +担 +拆 +拇 +拈 +拉 +拋 +拌 +拍 +拎 +拐 +拒 +拓 +拔 +拖 +拗 +拘 +拙 +拚 +招 +拜 +拟 +拡 +拢 +拣 +拥 +拦 +拧 +拨 +择 +括 +拭 +拮 +拯 +拱 +拳 +拴 +拷 +拼 +拽 +拾 +拿 +持 +挂 +指 +挈 +按 +挎 +挑 +挖 +挙 +挚 +挛 +挝 +挞 +挟 +挠 +挡 +挣 +挤 +挥 +挨 +挪 +挫 +振 +挲 +挹 +挺 +挽 +挾 +捂 +捅 +捆 +捉 +捋 +捌 +捍 +捎 +捏 +捐 +捕 +捞 +损 +捡 +换 +捣 +捧 +捨 +捩 +据 +捱 +捲 +捶 +捷 +捺 +捻 +掀 +掂 +掃 +掇 +授 +掉 +掌 +掏 +掐 +排 +掖 +掘 +掙 +掛 +掠 +採 +探 +掣 +接 +控 +推 +掩 +措 +掬 +掰 +掲 +掳 +掴 +掷 +掸 +掺 +揀 +揃 +揄 +揆 +揉 +揍 +描 +提 +插 +揖 +揚 +換 +握 +揣 +揩 +揪 +揭 +揮 +援 +揶 +揸 +揹 +揽 +搀 +搁 +搂 +搅 +損 +搏 +搐 +搓 +搔 +搖 +搗 +搜 +搞 +搡 +搪 +搬 +搭 +搵 +搶 +携 +搽 +摀 +摁 +摄 +摆 +摇 +摈 +摊 +摒 +摔 +摘 +摞 +摟 +摧 +摩 +摯 +摳 +摸 +摹 +摺 +摻 +撂 +撃 +撅 +撇 +撈 +撐 +撑 +撒 +撓 +撕 +撚 +撞 +撤 +撥 +撩 +撫 +撬 +播 +撮 +撰 +撲 +撵 +撷 +撸 +撻 +撼 +撿 +擀 +擁 +擂 +擄 +擅 +擇 +擊 +擋 +操 +擎 +擒 +擔 +擘 +據 +擞 +擠 +擡 +擢 +擦 +擬 +擰 +擱 +擲 +擴 +擷 +擺 +擼 +擾 +攀 +攏 +攒 +攔 +攘 +攙 +攜 +攝 +攞 +攢 +攣 +攤 +攥 +攪 +攫 +攬 +支 +收 +攸 +改 +攻 +放 +政 +故 +效 +敌 +敍 +敎 +敏 +救 +敕 +敖 +敗 +敘 +教 +敛 +敝 +敞 +敢 +散 +敦 +敬 +数 +敲 +整 +敵 +敷 +數 +斂 +斃 +文 +斋 +斌 +斎 +斐 +斑 +斓 +斗 +料 +斛 +斜 +斟 +斡 +斤 +斥 +斧 +斩 +斫 +斬 +断 +斯 +新 +斷 +方 +於 +施 +旁 +旃 +旅 +旋 +旌 +旎 +族 +旖 +旗 +无 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旮 +旱 +时 +旷 +旺 +旻 +昀 +昂 +昆 +昇 +昉 +昊 +昌 +明 +昏 +易 +昔 +昕 +昙 +星 +映 +春 +昧 +昨 +昭 +是 +昱 +昴 +昵 +昶 +昼 +显 +晁 +時 +晃 +晉 +晋 +晌 +晏 +晒 +晓 +晔 +晕 +晖 +晗 +晚 +晝 +晞 +晟 +晤 +晦 +晨 +晩 +普 +景 +晰 +晴 +晶 +晷 +智 +晾 +暂 +暄 +暇 +暈 +暉 +暌 +暐 +暑 +暖 +暗 +暝 +暢 +暧 +暨 +暫 +暮 +暱 +暴 +暸 +暹 +曄 +曆 +曇 +曉 +曖 +曙 +曜 +曝 +曠 +曦 +曬 +曰 +曲 +曳 +更 +書 +曹 +曼 +曾 +替 +最 +會 +月 +有 +朋 +服 +朐 +朔 +朕 +朗 +望 +朝 +期 +朦 +朧 +木 +未 +末 +本 +札 +朮 +术 +朱 +朴 +朵 +机 +朽 +杀 +杂 +权 +杆 +杈 +杉 +李 +杏 +材 +村 +杓 +杖 +杜 +杞 +束 +杠 +条 +来 +杨 +杭 +杯 +杰 +東 +杳 +杵 +杷 +杼 +松 +板 +极 +构 +枇 +枉 +枋 +析 +枕 +林 +枚 +果 +枝 +枢 +枣 +枪 +枫 +枭 +枯 +枰 +枱 +枳 +架 +枷 +枸 +柄 +柏 +某 +柑 +柒 +染 +柔 +柘 +柚 +柜 +柞 +柠 +柢 +查 +柩 +柬 +柯 +柱 +柳 +柴 +柵 +査 +柿 +栀 +栃 +栄 +栅 +标 +栈 +栉 +栋 +栎 +栏 +树 +栓 +栖 +栗 +校 +栩 +株 +样 +核 +根 +格 +栽 +栾 +桀 +桁 +桂 +桃 +桅 +框 +案 +桉 +桌 +桎 +桐 +桑 +桓 +桔 +桜 +桠 +桡 +桢 +档 +桥 +桦 +桧 +桨 +桩 +桶 +桿 +梁 +梅 +梆 +梏 +梓 +梗 +條 +梟 +梢 +梦 +梧 +梨 +梭 +梯 +械 +梳 +梵 +梶 +检 +棂 +棄 +棉 +棋 +棍 +棒 +棕 +棗 +棘 +棚 +棟 +棠 +棣 +棧 +森 +棱 +棲 +棵 +棹 +棺 +椁 +椅 +椋 +植 +椎 +椒 +検 +椪 +椭 +椰 +椹 +椽 +椿 +楂 +楊 +楓 +楔 +楚 +楝 +楞 +楠 +楣 +楨 +楫 +業 +楮 +極 +楷 +楸 +楹 +楼 +楽 +概 +榄 +榆 +榈 +榉 +榔 +榕 +榖 +榛 +榜 +榨 +榫 +榭 +榮 +榱 +榴 +榷 +榻 +槁 +槃 +構 +槌 +槍 +槎 +槐 +槓 +様 +槛 +槟 +槤 +槭 +槲 +槳 +槻 +槽 +槿 +樁 +樂 +樊 +樑 +樓 +標 +樞 +樟 +模 +樣 +権 +横 +樫 +樯 +樱 +樵 +樸 +樹 +樺 +樽 +樾 +橄 +橇 +橋 +橐 +橘 +橙 +機 +橡 +橢 +橫 +橱 +橹 +橼 +檀 +檄 +檎 +檐 +檔 +檗 +檜 +檢 +檬 +檯 +檳 +檸 +檻 +櫃 +櫚 +櫛 +櫥 +櫸 +櫻 +欄 +權 +欒 +欖 +欠 +次 +欢 +欣 +欧 +欲 +欸 +欺 +欽 +款 +歆 +歇 +歉 +歌 +歎 +歐 +歓 +歙 +歛 +歡 +止 +正 +此 +步 +武 +歧 +歩 +歪 +歯 +歲 +歳 +歴 +歷 +歸 +歹 +死 +歼 +殁 +殃 +殆 +殇 +殉 +殊 +残 +殒 +殓 +殖 +殘 +殞 +殡 +殤 +殭 +殯 +殲 +殴 +段 +殷 +殺 +殼 +殿 +毀 +毁 +毂 +毅 +毆 +毋 +母 +毎 +每 +毒 +毓 +比 +毕 +毗 +毘 +毙 +毛 +毡 +毫 +毯 +毽 +氈 +氏 +氐 +民 +氓 +气 +氖 +気 +氙 +氛 +氟 +氡 +氢 +氣 +氤 +氦 +氧 +氨 +氪 +氫 +氮 +氯 +氰 +氲 +水 +氷 +永 +氹 +氾 +汀 +汁 +求 +汆 +汇 +汉 +汎 +汐 +汕 +汗 +汙 +汛 +汝 +汞 +江 +池 +污 +汤 +汨 +汩 +汪 +汰 +汲 +汴 +汶 +汹 +決 +汽 +汾 +沁 +沂 +沃 +沅 +沈 +沉 +沌 +沏 +沐 +沒 +沓 +沖 +沙 +沛 +沟 +没 +沢 +沣 +沥 +沦 +沧 +沪 +沫 +沭 +沮 +沱 +河 +沸 +油 +治 +沼 +沽 +沾 +沿 +況 +泄 +泉 +泊 +泌 +泓 +法 +泗 +泛 +泞 +泠 +泡 +波 +泣 +泥 +注 +泪 +泫 +泮 +泯 +泰 +泱 +泳 +泵 +泷 +泸 +泻 +泼 +泽 +泾 +洁 +洄 +洋 +洒 +洗 +洙 +洛 +洞 +津 +洩 +洪 +洮 +洱 +洲 +洵 +洶 +洸 +洹 +活 +洼 +洽 +派 +流 +浃 +浄 +浅 +浆 +浇 +浊 +测 +济 +浏 +浑 +浒 +浓 +浔 +浙 +浚 +浜 +浣 +浦 +浩 +浪 +浬 +浮 +浯 +浴 +海 +浸 +涂 +涅 +涇 +消 +涉 +涌 +涎 +涓 +涔 +涕 +涙 +涛 +涝 +涞 +涟 +涠 +涡 +涣 +涤 +润 +涧 +涨 +涩 +涪 +涮 +涯 +液 +涵 +涸 +涼 +涿 +淀 +淄 +淅 +淆 +淇 +淋 +淌 +淑 +淒 +淖 +淘 +淙 +淚 +淞 +淡 +淤 +淦 +淨 +淩 +淪 +淫 +淬 +淮 +深 +淳 +淵 +混 +淹 +淺 +添 +淼 +清 +済 +渉 +渊 +渋 +渍 +渎 +渐 +渔 +渗 +渙 +渚 +減 +渝 +渠 +渡 +渣 +渤 +渥 +渦 +温 +測 +渭 +港 +渲 +渴 +游 +渺 +渾 +湃 +湄 +湊 +湍 +湖 +湘 +湛 +湟 +湧 +湫 +湮 +湯 +湳 +湾 +湿 +満 +溃 +溅 +溉 +溏 +源 +準 +溜 +溝 +溟 +溢 +溥 +溧 +溪 +溫 +溯 +溱 +溴 +溶 +溺 +溼 +滁 +滂 +滄 +滅 +滇 +滋 +滌 +滑 +滓 +滔 +滕 +滙 +滚 +滝 +滞 +滟 +满 +滢 +滤 +滥 +滦 +滨 +滩 +滬 +滯 +滲 +滴 +滷 +滸 +滾 +滿 +漁 +漂 +漆 +漉 +漏 +漓 +演 +漕 +漠 +漢 +漣 +漩 +漪 +漫 +漬 +漯 +漱 +漲 +漳 +漸 +漾 +漿 +潆 +潇 +潋 +潍 +潑 +潔 +潘 +潛 +潜 +潞 +潟 +潢 +潤 +潦 +潧 +潭 +潮 +潰 +潴 +潸 +潺 +潼 +澀 +澄 +澆 +澈 +澍 +澎 +澗 +澜 +澡 +澤 +澧 +澱 +澳 +澹 +激 +濁 +濂 +濃 +濑 +濒 +濕 +濘 +濛 +濟 +濠 +濡 +濤 +濫 +濬 +濮 +濯 +濱 +濺 +濾 +瀅 +瀆 +瀉 +瀋 +瀏 +瀑 +瀕 +瀘 +瀚 +瀛 +瀝 +瀞 +瀟 +瀧 +瀨 +瀬 +瀰 +瀾 +灌 +灏 +灑 +灘 +灝 +灞 +灣 +火 +灬 +灭 +灯 +灰 +灵 +灶 +灸 +灼 +災 +灾 +灿 +炀 +炁 +炅 +炉 +炊 +炎 +炒 +炔 +炕 +炖 +炙 +炜 +炫 +炬 +炭 +炮 +炯 +炳 +炷 +炸 +点 +為 +炼 +炽 +烁 +烂 +烃 +烈 +烊 +烏 +烘 +烙 +烛 +烟 +烤 +烦 +烧 +烨 +烩 +烫 +烬 +热 +烯 +烷 +烹 +烽 +焉 +焊 +焕 +焖 +焗 +焘 +焙 +焚 +焜 +無 +焦 +焯 +焰 +焱 +然 +焼 +煅 +煉 +煊 +煌 +煎 +煒 +煖 +煙 +煜 +煞 +煤 +煥 +煦 +照 +煨 +煩 +煮 +煲 +煸 +煽 +熄 +熊 +熏 +熒 +熔 +熙 +熟 +熠 +熨 +熬 +熱 +熵 +熹 +熾 +燁 +燃 +燄 +燈 +燉 +燊 +燎 +燒 +燔 +燕 +燙 +燜 +營 +燥 +燦 +燧 +燭 +燮 +燴 +燻 +燼 +燿 +爆 +爍 +爐 +爛 +爪 +爬 +爭 +爰 +爱 +爲 +爵 +父 +爷 +爸 +爹 +爺 +爻 +爽 +爾 +牆 +片 +版 +牌 +牍 +牒 +牙 +牛 +牝 +牟 +牠 +牡 +牢 +牦 +牧 +物 +牯 +牲 +牴 +牵 +特 +牺 +牽 +犀 +犁 +犄 +犊 +犍 +犒 +犢 +犧 +犬 +犯 +状 +犷 +犸 +犹 +狀 +狂 +狄 +狈 +狎 +狐 +狒 +狗 +狙 +狞 +狠 +狡 +狩 +独 +狭 +狮 +狰 +狱 +狸 +狹 +狼 +狽 +猎 +猕 +猖 +猗 +猙 +猛 +猜 +猝 +猥 +猩 +猪 +猫 +猬 +献 +猴 +猶 +猷 +猾 +猿 +獄 +獅 +獎 +獐 +獒 +獗 +獠 +獣 +獨 +獭 +獰 +獲 +獵 +獷 +獸 +獺 +獻 +獼 +獾 +玄 +率 +玉 +王 +玑 +玖 +玛 +玟 +玠 +玥 +玩 +玫 +玮 +环 +现 +玲 +玳 +玷 +玺 +玻 +珀 +珂 +珅 +珈 +珉 +珊 +珍 +珏 +珐 +珑 +珙 +珞 +珠 +珣 +珥 +珩 +珪 +班 +珮 +珲 +珺 +現 +球 +琅 +理 +琇 +琉 +琊 +琍 +琏 +琐 +琛 +琢 +琥 +琦 +琨 +琪 +琬 +琮 +琰 +琲 +琳 +琴 +琵 +琶 +琺 +琼 +瑀 +瑁 +瑄 +瑋 +瑕 +瑗 +瑙 +瑚 +瑛 +瑜 +瑞 +瑟 +瑠 +瑣 +瑤 +瑩 +瑪 +瑯 +瑰 +瑶 +瑾 +璀 +璁 +璃 +璇 +璉 +璋 +璎 +璐 +璜 +璞 +璟 +璧 +璨 +環 +璽 +璿 +瓊 +瓏 +瓒 +瓜 +瓢 +瓣 +瓤 +瓦 +瓮 +瓯 +瓴 +瓶 +瓷 +甄 +甌 +甕 +甘 +甙 +甚 +甜 +生 +產 +産 +甥 +甦 +用 +甩 +甫 +甬 +甭 +甯 +田 +由 +甲 +申 +电 +男 +甸 +町 +画 +甾 +畀 +畅 +界 +畏 +畑 +畔 +留 +畜 +畝 +畢 +略 +畦 +番 +畫 +異 +畲 +畳 +畴 +當 +畸 +畹 +畿 +疆 +疇 +疊 +疏 +疑 +疔 +疖 +疗 +疙 +疚 +疝 +疟 +疡 +疣 +疤 +疥 +疫 +疮 +疯 +疱 +疲 +疳 +疵 +疸 +疹 +疼 +疽 +疾 +痂 +病 +症 +痈 +痉 +痊 +痍 +痒 +痔 +痕 +痘 +痙 +痛 +痞 +痠 +痢 +痣 +痤 +痧 +痨 +痪 +痫 +痰 +痱 +痴 +痹 +痺 +痼 +痿 +瘀 +瘁 +瘋 +瘍 +瘓 +瘘 +瘙 +瘟 +瘠 +瘡 +瘢 +瘤 +瘦 +瘧 +瘩 +瘪 +瘫 +瘴 +瘸 +瘾 +療 +癇 +癌 +癒 +癖 +癜 +癞 +癡 +癢 +癣 +癥 +癫 +癬 +癮 +癱 +癲 +癸 +発 +登 +發 +白 +百 +皂 +的 +皆 +皇 +皈 +皋 +皎 +皑 +皓 +皖 +皙 +皚 +皮 +皰 +皱 +皴 +皺 +皿 +盂 +盃 +盅 +盆 +盈 +益 +盎 +盏 +盐 +监 +盒 +盔 +盖 +盗 +盘 +盛 +盜 +盞 +盟 +盡 +監 +盤 +盥 +盧 +盪 +目 +盯 +盱 +盲 +直 +相 +盹 +盼 +盾 +省 +眈 +眉 +看 +県 +眙 +眞 +真 +眠 +眦 +眨 +眩 +眯 +眶 +眷 +眸 +眺 +眼 +眾 +着 +睁 +睇 +睏 +睐 +睑 +睛 +睜 +睞 +睡 +睢 +督 +睥 +睦 +睨 +睪 +睫 +睬 +睹 +睽 +睾 +睿 +瞄 +瞅 +瞇 +瞋 +瞌 +瞎 +瞑 +瞒 +瞓 +瞞 +瞟 +瞠 +瞥 +瞧 +瞩 +瞪 +瞬 +瞭 +瞰 +瞳 +瞻 +瞼 +瞿 +矇 +矍 +矗 +矚 +矛 +矜 +矢 +矣 +知 +矩 +矫 +短 +矮 +矯 +石 +矶 +矽 +矾 +矿 +码 +砂 +砌 +砍 +砒 +研 +砖 +砗 +砚 +砝 +砣 +砥 +砧 +砭 +砰 +砲 +破 +砷 +砸 +砺 +砼 +砾 +础 +硅 +硐 +硒 +硕 +硝 +硫 +硬 +确 +硯 +硼 +碁 +碇 +碉 +碌 +碍 +碎 +碑 +碓 +碗 +碘 +碚 +碛 +碟 +碣 +碧 +碩 +碰 +碱 +碳 +碴 +確 +碼 +碾 +磁 +磅 +磊 +磋 +磐 +磕 +磚 +磡 +磨 +磬 +磯 +磲 +磷 +磺 +礁 +礎 +礙 +礡 +礦 +礪 +礫 +礴 +示 +礼 +社 +祀 +祁 +祂 +祇 +祈 +祉 +祎 +祐 +祕 +祖 +祗 +祚 +祛 +祜 +祝 +神 +祟 +祠 +祢 +祥 +票 +祭 +祯 +祷 +祸 +祺 +祿 +禀 +禁 +禄 +禅 +禍 +禎 +福 +禛 +禦 +禧 +禪 +禮 +禱 +禹 +禺 +离 +禽 +禾 +禿 +秀 +私 +秃 +秆 +秉 +秋 +种 +科 +秒 +秘 +租 +秣 +秤 +秦 +秧 +秩 +秭 +积 +称 +秸 +移 +秽 +稀 +稅 +程 +稍 +税 +稔 +稗 +稚 +稜 +稞 +稟 +稠 +稣 +種 +稱 +稲 +稳 +稷 +稹 +稻 +稼 +稽 +稿 +穀 +穂 +穆 +穌 +積 +穎 +穗 +穢 +穩 +穫 +穴 +究 +穷 +穹 +空 +穿 +突 +窃 +窄 +窈 +窍 +窑 +窒 +窓 +窕 +窖 +窗 +窘 +窜 +窝 +窟 +窠 +窥 +窦 +窨 +窩 +窪 +窮 +窯 +窺 +窿 +竄 +竅 +竇 +竊 +立 +竖 +站 +竜 +竞 +竟 +章 +竣 +童 +竭 +端 +競 +竹 +竺 +竽 +竿 +笃 +笆 +笈 +笋 +笏 +笑 +笔 +笙 +笛 +笞 +笠 +符 +笨 +第 +笹 +笺 +笼 +筆 +等 +筊 +筋 +筍 +筏 +筐 +筑 +筒 +答 +策 +筛 +筝 +筠 +筱 +筲 +筵 +筷 +筹 +签 +简 +箇 +箋 +箍 +箏 +箐 +箔 +箕 +算 +箝 +管 +箩 +箫 +箭 +箱 +箴 +箸 +節 +篁 +範 +篆 +篇 +築 +篑 +篓 +篙 +篝 +篠 +篡 +篤 +篩 +篪 +篮 +篱 +篷 +簇 +簌 +簍 +簡 +簦 +簧 +簪 +簫 +簷 +簸 +簽 +簾 +簿 +籁 +籃 +籌 +籍 +籐 +籟 +籠 +籤 +籬 +籮 +籲 +米 +类 +籼 +籽 +粄 +粉 +粑 +粒 +粕 +粗 +粘 +粟 +粤 +粥 +粧 +粪 +粮 +粱 +粲 +粳 +粵 +粹 +粼 +粽 +精 +粿 +糅 +糊 +糍 +糕 +糖 +糗 +糙 +糜 +糞 +糟 +糠 +糧 +糬 +糯 +糰 +糸 +系 +糾 +紀 +紂 +約 +紅 +紉 +紊 +紋 +納 +紐 +紓 +純 +紗 +紘 +紙 +級 +紛 +紜 +素 +紡 +索 +紧 +紫 +紮 +累 +細 +紳 +紹 +紺 +終 +絃 +組 +絆 +経 +結 +絕 +絞 +絡 +絢 +給 +絨 +絮 +統 +絲 +絳 +絵 +絶 +絹 +綁 +綏 +綑 +經 +継 +続 +綜 +綠 +綢 +綦 +綫 +綬 +維 +綱 +網 +綴 +綵 +綸 +綺 +綻 +綽 +綾 +綿 +緊 +緋 +総 +緑 +緒 +緘 +線 +緝 +緞 +締 +緣 +編 +緩 +緬 +緯 +練 +緹 +緻 +縁 +縄 +縈 +縛 +縝 +縣 +縫 +縮 +縱 +縴 +縷 +總 +績 +繁 +繃 +繆 +繇 +繋 +織 +繕 +繚 +繞 +繡 +繩 +繪 +繫 +繭 +繳 +繹 +繼 +繽 +纂 +續 +纍 +纏 +纓 +纔 +纖 +纜 +纠 +红 +纣 +纤 +约 +级 +纨 +纪 +纫 +纬 +纭 +纯 +纰 +纱 +纲 +纳 +纵 +纶 +纷 +纸 +纹 +纺 +纽 +纾 +线 +绀 +练 +组 +绅 +细 +织 +终 +绊 +绍 +绎 +经 +绑 +绒 +结 +绔 +绕 +绘 +给 +绚 +绛 +络 +绝 +绞 +统 +绡 +绢 +绣 +绥 +绦 +继 +绩 +绪 +绫 +续 +绮 +绯 +绰 +绳 +维 +绵 +绶 +绷 +绸 +绻 +综 +绽 +绾 +绿 +缀 +缄 +缅 +缆 +缇 +缈 +缉 +缎 +缓 +缔 +缕 +编 +缘 +缙 +缚 +缜 +缝 +缠 +缢 +缤 +缥 +缨 +缩 +缪 +缭 +缮 +缰 +缱 +缴 +缸 +缺 +缽 +罂 +罄 +罌 +罐 +网 +罔 +罕 +罗 +罚 +罡 +罢 +罩 +罪 +置 +罰 +署 +罵 +罷 +罹 +羁 +羅 +羈 +羊 +羌 +美 +羔 +羚 +羞 +羟 +羡 +羣 +群 +羥 +羧 +羨 +義 +羯 +羲 +羸 +羹 +羽 +羿 +翁 +翅 +翊 +翌 +翎 +習 +翔 +翘 +翟 +翠 +翡 +翦 +翩 +翰 +翱 +翳 +翹 +翻 +翼 +耀 +老 +考 +耄 +者 +耆 +耋 +而 +耍 +耐 +耒 +耕 +耗 +耘 +耙 +耦 +耨 +耳 +耶 +耷 +耸 +耻 +耽 +耿 +聂 +聆 +聊 +聋 +职 +聒 +联 +聖 +聘 +聚 +聞 +聪 +聯 +聰 +聲 +聳 +聴 +聶 +職 +聽 +聾 +聿 +肃 +肄 +肅 +肆 +肇 +肉 +肋 +肌 +肏 +肓 +肖 +肘 +肚 +肛 +肝 +肠 +股 +肢 +肤 +肥 +肩 +肪 +肮 +肯 +肱 +育 +肴 +肺 +肽 +肾 +肿 +胀 +胁 +胃 +胄 +胆 +背 +胍 +胎 +胖 +胚 +胛 +胜 +胝 +胞 +胡 +胤 +胥 +胧 +胫 +胭 +胯 +胰 +胱 +胳 +胴 +胶 +胸 +胺 +能 +脂 +脅 +脆 +脇 +脈 +脉 +脊 +脍 +脏 +脐 +脑 +脓 +脖 +脘 +脚 +脛 +脣 +脩 +脫 +脯 +脱 +脲 +脳 +脸 +脹 +脾 +腆 +腈 +腊 +腋 +腌 +腎 +腐 +腑 +腓 +腔 +腕 +腥 +腦 +腩 +腫 +腭 +腮 +腰 +腱 +腳 +腴 +腸 +腹 +腺 +腻 +腼 +腾 +腿 +膀 +膈 +膊 +膏 +膑 +膘 +膚 +膛 +膜 +膝 +膠 +膦 +膨 +膩 +膳 +膺 +膻 +膽 +膾 +膿 +臀 +臂 +臃 +臆 +臉 +臊 +臍 +臓 +臘 +臟 +臣 +臥 +臧 +臨 +自 +臬 +臭 +至 +致 +臺 +臻 +臼 +臾 +舀 +舂 +舅 +舆 +與 +興 +舉 +舊 +舌 +舍 +舎 +舐 +舒 +舔 +舖 +舗 +舛 +舜 +舞 +舟 +航 +舫 +般 +舰 +舱 +舵 +舶 +舷 +舸 +船 +舺 +舾 +艇 +艋 +艘 +艙 +艦 +艮 +良 +艰 +艱 +色 +艳 +艷 +艹 +艺 +艾 +节 +芃 +芈 +芊 +芋 +芍 +芎 +芒 +芙 +芜 +芝 +芡 +芥 +芦 +芩 +芪 +芫 +芬 +芭 +芮 +芯 +花 +芳 +芷 +芸 +芹 +芻 +芽 +芾 +苁 +苄 +苇 +苋 +苍 +苏 +苑 +苒 +苓 +苔 +苕 +苗 +苛 +苜 +苞 +苟 +苡 +苣 +若 +苦 +苫 +苯 +英 +苷 +苹 +苻 +茁 +茂 +范 +茄 +茅 +茉 +茎 +茏 +茗 +茜 +茧 +茨 +茫 +茬 +茭 +茯 +茱 +茲 +茴 +茵 +茶 +茸 +茹 +茼 +荀 +荃 +荆 +草 +荊 +荏 +荐 +荒 +荔 +荖 +荘 +荚 +荞 +荟 +荠 +荡 +荣 +荤 +荥 +荧 +荨 +荪 +荫 +药 +荳 +荷 +荸 +荻 +荼 +荽 +莅 +莆 +莉 +莊 +莎 +莒 +莓 +莖 +莘 +莞 +莠 +莢 +莧 +莪 +莫 +莱 +莲 +莴 +获 +莹 +莺 +莽 +莿 +菀 +菁 +菅 +菇 +菈 +菊 +菌 +菏 +菓 +菖 +菘 +菜 +菟 +菠 +菡 +菩 +華 +菱 +菲 +菸 +菽 +萁 +萃 +萄 +萊 +萋 +萌 +萍 +萎 +萘 +萝 +萤 +营 +萦 +萧 +萨 +萩 +萬 +萱 +萵 +萸 +萼 +落 +葆 +葉 +著 +葚 +葛 +葡 +董 +葦 +葩 +葫 +葬 +葭 +葯 +葱 +葳 +葵 +葷 +葺 +蒂 +蒋 +蒐 +蒔 +蒙 +蒜 +蒞 +蒟 +蒡 +蒨 +蒲 +蒸 +蒹 +蒻 +蒼 +蒿 +蓁 +蓄 +蓆 +蓉 +蓋 +蓑 +蓓 +蓖 +蓝 +蓟 +蓦 +蓬 +蓮 +蓼 +蓿 +蔑 +蔓 +蔔 +蔗 +蔘 +蔚 +蔡 +蔣 +蔥 +蔫 +蔬 +蔭 +蔵 +蔷 +蔺 +蔻 +蔼 +蔽 +蕁 +蕃 +蕈 +蕉 +蕊 +蕎 +蕙 +蕤 +蕨 +蕩 +蕪 +蕭 +蕲 +蕴 +蕻 +蕾 +薄 +薅 +薇 +薈 +薊 +薏 +薑 +薔 +薙 +薛 +薦 +薨 +薩 +薪 +薬 +薯 +薰 +薹 +藉 +藍 +藏 +藐 +藓 +藕 +藜 +藝 +藤 +藥 +藩 +藹 +藻 +藿 +蘆 +蘇 +蘊 +蘋 +蘑 +蘚 +蘭 +蘸 +蘼 +蘿 +虎 +虏 +虐 +虑 +虔 +處 +虚 +虛 +虜 +虞 +號 +虢 +虧 +虫 +虬 +虱 +虹 +虻 +虽 +虾 +蚀 +蚁 +蚂 +蚊 +蚌 +蚓 +蚕 +蚜 +蚝 +蚣 +蚤 +蚩 +蚪 +蚯 +蚱 +蚵 +蛀 +蛆 +蛇 +蛊 +蛋 +蛎 +蛐 +蛔 +蛙 +蛛 +蛟 +蛤 +蛭 +蛮 +蛰 +蛳 +蛹 +蛻 +蛾 +蜀 +蜂 +蜃 +蜆 +蜇 +蜈 +蜊 +蜍 +蜒 +蜓 +蜕 +蜗 +蜘 +蜚 +蜜 +蜡 +蜢 +蜥 +蜱 +蜴 +蜷 +蜻 +蜿 +蝇 +蝈 +蝉 +蝌 +蝎 +蝕 +蝗 +蝙 +蝟 +蝠 +蝦 +蝨 +蝴 +蝶 +蝸 +蝼 +螂 +螃 +融 +螞 +螢 +螨 +螯 +螳 +螺 +蟀 +蟄 +蟆 +蟋 +蟎 +蟑 +蟒 +蟠 +蟬 +蟲 +蟹 +蟻 +蟾 +蠅 +蠍 +蠔 +蠕 +蠛 +蠟 +蠡 +蠢 +蠣 +蠱 +蠶 +蠹 +蠻 +血 +衄 +衅 +衆 +行 +衍 +術 +衔 +街 +衙 +衛 +衝 +衞 +衡 +衢 +衣 +补 +表 +衩 +衫 +衬 +衮 +衰 +衲 +衷 +衹 +衾 +衿 +袁 +袂 +袄 +袅 +袈 +袋 +袍 +袒 +袖 +袜 +袞 +袤 +袪 +被 +袭 +袱 +裁 +裂 +装 +裆 +裊 +裏 +裔 +裕 +裘 +裙 +補 +裝 +裟 +裡 +裤 +裨 +裱 +裳 +裴 +裸 +裹 +製 +裾 +褂 +複 +褐 +褒 +褓 +褔 +褚 +褥 +褪 +褫 +褲 +褶 +褻 +襁 +襄 +襟 +襠 +襪 +襬 +襯 +襲 +西 +要 +覃 +覆 +覇 +見 +規 +覓 +視 +覚 +覦 +覧 +親 +覬 +観 +覷 +覺 +覽 +觀 +见 +观 +规 +觅 +视 +览 +觉 +觊 +觎 +觐 +觑 +角 +觞 +解 +觥 +触 +觸 +言 +訂 +計 +訊 +討 +訓 +訕 +訖 +託 +記 +訛 +訝 +訟 +訣 +訥 +訪 +設 +許 +訳 +訴 +訶 +診 +註 +証 +詆 +詐 +詔 +評 +詛 +詞 +詠 +詡 +詢 +詣 +試 +詩 +詫 +詬 +詭 +詮 +詰 +話 +該 +詳 +詹 +詼 +誅 +誇 +誉 +誌 +認 +誓 +誕 +誘 +語 +誠 +誡 +誣 +誤 +誥 +誦 +誨 +說 +説 +読 +誰 +課 +誹 +誼 +調 +諄 +談 +請 +諏 +諒 +論 +諗 +諜 +諡 +諦 +諧 +諫 +諭 +諮 +諱 +諳 +諷 +諸 +諺 +諾 +謀 +謁 +謂 +謄 +謊 +謎 +謐 +謔 +謗 +謙 +講 +謝 +謠 +謨 +謬 +謹 +謾 +譁 +證 +譎 +譏 +識 +譙 +譚 +譜 +警 +譬 +譯 +議 +譲 +譴 +護 +譽 +讀 +變 +讓 +讚 +讞 +计 +订 +认 +讥 +讧 +讨 +让 +讪 +讫 +训 +议 +讯 +记 +讲 +讳 +讴 +讶 +讷 +许 +讹 +论 +讼 +讽 +设 +访 +诀 +证 +诃 +评 +诅 +识 +诈 +诉 +诊 +诋 +词 +诏 +译 +试 +诗 +诘 +诙 +诚 +诛 +话 +诞 +诟 +诠 +诡 +询 +诣 +诤 +该 +详 +诧 +诩 +诫 +诬 +语 +误 +诰 +诱 +诲 +说 +诵 +诶 +请 +诸 +诺 +读 +诽 +课 +诿 +谀 +谁 +调 +谄 +谅 +谆 +谈 +谊 +谋 +谌 +谍 +谎 +谏 +谐 +谑 +谒 +谓 +谔 +谕 +谗 +谘 +谙 +谚 +谛 +谜 +谟 +谢 +谣 +谤 +谥 +谦 +谧 +谨 +谩 +谪 +谬 +谭 +谯 +谱 +谲 +谴 +谶 +谷 +豁 +豆 +豇 +豈 +豉 +豊 +豌 +豎 +豐 +豔 +豚 +象 +豢 +豪 +豫 +豬 +豹 +豺 +貂 +貅 +貌 +貓 +貔 +貘 +貝 +貞 +負 +財 +貢 +貧 +貨 +販 +貪 +貫 +責 +貯 +貰 +貳 +貴 +貶 +買 +貸 +費 +貼 +貽 +貿 +賀 +賁 +賂 +賃 +賄 +資 +賈 +賊 +賑 +賓 +賜 +賞 +賠 +賡 +賢 +賣 +賤 +賦 +質 +賬 +賭 +賴 +賺 +購 +賽 +贅 +贈 +贊 +贍 +贏 +贓 +贖 +贛 +贝 +贞 +负 +贡 +财 +责 +贤 +败 +账 +货 +质 +贩 +贪 +贫 +贬 +购 +贮 +贯 +贰 +贱 +贲 +贴 +贵 +贷 +贸 +费 +贺 +贻 +贼 +贾 +贿 +赁 +赂 +赃 +资 +赅 +赈 +赊 +赋 +赌 +赎 +赏 +赐 +赓 +赔 +赖 +赘 +赚 +赛 +赝 +赞 +赠 +赡 +赢 +赣 +赤 +赦 +赧 +赫 +赭 +走 +赳 +赴 +赵 +赶 +起 +趁 +超 +越 +趋 +趕 +趙 +趟 +趣 +趨 +足 +趴 +趵 +趸 +趺 +趾 +跃 +跄 +跆 +跋 +跌 +跎 +跑 +跖 +跚 +跛 +距 +跟 +跡 +跤 +跨 +跩 +跪 +路 +跳 +践 +跷 +跹 +跺 +跻 +踉 +踊 +踌 +踏 +踐 +踝 +踞 +踟 +踢 +踩 +踪 +踮 +踱 +踴 +踵 +踹 +蹂 +蹄 +蹇 +蹈 +蹉 +蹊 +蹋 +蹑 +蹒 +蹙 +蹟 +蹣 +蹤 +蹦 +蹩 +蹬 +蹭 +蹲 +蹴 +蹶 +蹺 +蹼 +蹿 +躁 +躇 +躉 +躊 +躋 +躍 +躏 +躪 +身 +躬 +躯 +躲 +躺 +軀 +車 +軋 +軌 +軍 +軒 +軟 +転 +軸 +軼 +軽 +軾 +較 +載 +輒 +輓 +輔 +輕 +輛 +輝 +輟 +輩 +輪 +輯 +輸 +輻 +輾 +輿 +轄 +轅 +轆 +轉 +轍 +轎 +轟 +车 +轧 +轨 +轩 +转 +轭 +轮 +软 +轰 +轲 +轴 +轶 +轻 +轼 +载 +轿 +较 +辄 +辅 +辆 +辇 +辈 +辉 +辊 +辍 +辐 +辑 +输 +辕 +辖 +辗 +辘 +辙 +辛 +辜 +辞 +辟 +辣 +辦 +辨 +辩 +辫 +辭 +辮 +辯 +辰 +辱 +農 +边 +辺 +辻 +込 +辽 +达 +迁 +迂 +迄 +迅 +过 +迈 +迎 +运 +近 +返 +还 +这 +进 +远 +违 +连 +迟 +迢 +迤 +迥 +迦 +迩 +迪 +迫 +迭 +述 +迴 +迷 +迸 +迹 +迺 +追 +退 +送 +适 +逃 +逅 +逆 +选 +逊 +逍 +透 +逐 +递 +途 +逕 +逗 +這 +通 +逛 +逝 +逞 +速 +造 +逢 +連 +逮 +週 +進 +逵 +逶 +逸 +逻 +逼 +逾 +遁 +遂 +遅 +遇 +遊 +運 +遍 +過 +遏 +遐 +遑 +遒 +道 +達 +違 +遗 +遙 +遛 +遜 +遞 +遠 +遢 +遣 +遥 +遨 +適 +遭 +遮 +遲 +遴 +遵 +遶 +遷 +選 +遺 +遼 +遽 +避 +邀 +邁 +邂 +邃 +還 +邇 +邈 +邊 +邋 +邏 +邑 +邓 +邕 +邛 +邝 +邢 +那 +邦 +邨 +邪 +邬 +邮 +邯 +邰 +邱 +邳 +邵 +邸 +邹 +邺 +邻 +郁 +郅 +郊 +郎 +郑 +郜 +郝 +郡 +郢 +郤 +郦 +郧 +部 +郫 +郭 +郴 +郵 +郷 +郸 +都 +鄂 +鄉 +鄒 +鄔 +鄙 +鄞 +鄢 +鄧 +鄭 +鄰 +鄱 +鄲 +鄺 +酉 +酊 +酋 +酌 +配 +酐 +酒 +酗 +酚 +酝 +酢 +酣 +酥 +酩 +酪 +酬 +酮 +酯 +酰 +酱 +酵 +酶 +酷 +酸 +酿 +醃 +醇 +醉 +醋 +醍 +醐 +醒 +醚 +醛 +醜 +醞 +醣 +醪 +醫 +醬 +醮 +醯 +醴 +醺 +釀 +釁 +采 +釉 +释 +釋 +里 +重 +野 +量 +釐 +金 +釗 +釘 +釜 +針 +釣 +釦 +釧 +釵 +鈀 +鈉 +鈍 +鈎 +鈔 +鈕 +鈞 +鈣 +鈦 +鈪 +鈴 +鈺 +鈾 +鉀 +鉄 +鉅 +鉉 +鉑 +鉗 +鉚 +鉛 +鉤 +鉴 +鉻 +銀 +銃 +銅 +銑 +銓 +銖 +銘 +銜 +銬 +銭 +銮 +銳 +銷 +銹 +鋁 +鋅 +鋒 +鋤 +鋪 +鋰 +鋸 +鋼 +錄 +錐 +錘 +錚 +錠 +錢 +錦 +錨 +錫 +錮 +錯 +録 +錳 +錶 +鍊 +鍋 +鍍 +鍛 +鍥 +鍰 +鍵 +鍺 +鍾 +鎂 +鎊 +鎌 +鎏 +鎔 +鎖 +鎗 +鎚 +鎧 +鎬 +鎮 +鎳 +鏈 +鏖 +鏗 +鏘 +鏞 +鏟 +鏡 +鏢 +鏤 +鏽 +鐘 +鐮 +鐲 +鐳 +鐵 +鐸 +鐺 +鑄 +鑊 +鑑 +鑒 +鑣 +鑫 +鑰 +鑲 +鑼 +鑽 +鑾 +鑿 +针 +钉 +钊 +钎 +钏 +钒 +钓 +钗 +钙 +钛 +钜 +钝 +钞 +钟 +钠 +钡 +钢 +钣 +钤 +钥 +钦 +钧 +钨 +钩 +钮 +钯 +钰 +钱 +钳 +钴 +钵 +钺 +钻 +钼 +钾 +钿 +铀 +铁 +铂 +铃 +铄 +铅 +铆 +铉 +铎 +铐 +铛 +铜 +铝 +铠 +铡 +铢 +铣 +铤 +铨 +铩 +铬 +铭 +铮 +铰 +铲 +铵 +银 +铸 +铺 +链 +铿 +销 +锁 +锂 +锄 +锅 +锆 +锈 +锉 +锋 +锌 +锏 +锐 +锑 +错 +锚 +锟 +锡 +锢 +锣 +锤 +锥 +锦 +锭 +键 +锯 +锰 +锲 +锵 +锹 +锺 +锻 +镀 +镁 +镂 +镇 +镉 +镌 +镍 +镐 +镑 +镕 +镖 +镗 +镛 +镜 +镣 +镭 +镯 +镰 +镳 +镶 +長 +长 +門 +閃 +閉 +開 +閎 +閏 +閑 +閒 +間 +閔 +閘 +閡 +関 +閣 +閥 +閨 +閩 +閱 +閲 +閹 +閻 +閾 +闆 +闇 +闊 +闌 +闍 +闔 +闕 +闖 +闘 +關 +闡 +闢 +门 +闪 +闫 +闭 +问 +闯 +闰 +闲 +间 +闵 +闷 +闸 +闹 +闺 +闻 +闽 +闾 +阀 +阁 +阂 +阅 +阆 +阇 +阈 +阉 +阎 +阐 +阑 +阔 +阕 +阖 +阙 +阚 +阜 +队 +阡 +阪 +阮 +阱 +防 +阳 +阴 +阵 +阶 +阻 +阿 +陀 +陂 +附 +际 +陆 +陇 +陈 +陋 +陌 +降 +限 +陕 +陛 +陝 +陞 +陟 +陡 +院 +陣 +除 +陨 +险 +陪 +陰 +陲 +陳 +陵 +陶 +陷 +陸 +険 +陽 +隅 +隆 +隈 +隊 +隋 +隍 +階 +随 +隐 +隔 +隕 +隘 +隙 +際 +障 +隠 +隣 +隧 +隨 +險 +隱 +隴 +隶 +隸 +隻 +隼 +隽 +难 +雀 +雁 +雄 +雅 +集 +雇 +雉 +雋 +雌 +雍 +雎 +雏 +雑 +雒 +雕 +雖 +雙 +雛 +雜 +雞 +離 +難 +雨 +雪 +雯 +雰 +雲 +雳 +零 +雷 +雹 +電 +雾 +需 +霁 +霄 +霆 +震 +霈 +霉 +霊 +霍 +霎 +霏 +霑 +霓 +霖 +霜 +霞 +霧 +霭 +霰 +露 +霸 +霹 +霽 +霾 +靂 +靄 +靈 +青 +靓 +靖 +静 +靚 +靛 +靜 +非 +靠 +靡 +面 +靥 +靦 +革 +靳 +靴 +靶 +靼 +鞅 +鞋 +鞍 +鞏 +鞑 +鞘 +鞠 +鞣 +鞦 +鞭 +韆 +韋 +韌 +韓 +韜 +韦 +韧 +韩 +韬 +韭 +音 +韵 +韶 +韻 +響 +頁 +頂 +頃 +項 +順 +須 +頌 +預 +頑 +頒 +頓 +頗 +領 +頜 +頡 +頤 +頫 +頭 +頰 +頷 +頸 +頹 +頻 +頼 +顆 +題 +額 +顎 +顏 +顔 +願 +顛 +類 +顧 +顫 +顯 +顱 +顴 +页 +顶 +顷 +项 +顺 +须 +顼 +顽 +顾 +顿 +颁 +颂 +预 +颅 +领 +颇 +颈 +颉 +颊 +颌 +颍 +颐 +频 +颓 +颔 +颖 +颗 +题 +颚 +颛 +颜 +额 +颞 +颠 +颡 +颢 +颤 +颦 +颧 +風 +颯 +颱 +颳 +颶 +颼 +飄 +飆 +风 +飒 +飓 +飕 +飘 +飙 +飚 +飛 +飞 +食 +飢 +飨 +飩 +飪 +飯 +飲 +飼 +飽 +飾 +餃 +餅 +餉 +養 +餌 +餐 +餒 +餓 +餘 +餚 +餛 +餞 +餡 +館 +餮 +餵 +餾 +饅 +饈 +饋 +饌 +饍 +饑 +饒 +饕 +饗 +饞 +饥 +饨 +饪 +饬 +饭 +饮 +饯 +饰 +饱 +饲 +饴 +饵 +饶 +饷 +饺 +饼 +饽 +饿 +馀 +馁 +馄 +馅 +馆 +馈 +馋 +馍 +馏 +馒 +馔 +首 +馗 +香 +馥 +馨 +馬 +馭 +馮 +馳 +馴 +駁 +駄 +駅 +駆 +駐 +駒 +駕 +駛 +駝 +駭 +駱 +駿 +騁 +騎 +騏 +験 +騙 +騨 +騰 +騷 +驀 +驅 +驊 +驍 +驒 +驕 +驗 +驚 +驛 +驟 +驢 +驥 +马 +驭 +驮 +驯 +驰 +驱 +驳 +驴 +驶 +驷 +驸 +驹 +驻 +驼 +驾 +驿 +骁 +骂 +骄 +骅 +骆 +骇 +骈 +骊 +骋 +验 +骏 +骐 +骑 +骗 +骚 +骛 +骜 +骞 +骠 +骡 +骤 +骥 +骧 +骨 +骯 +骰 +骶 +骷 +骸 +骼 +髂 +髅 +髋 +髏 +髒 +髓 +體 +髖 +高 +髦 +髪 +髮 +髯 +髻 +鬃 +鬆 +鬍 +鬓 +鬚 +鬟 +鬢 +鬣 +鬥 +鬧 +鬱 +鬼 +魁 +魂 +魄 +魅 +魇 +魍 +魏 +魔 +魘 +魚 +魯 +魷 +鮑 +鮨 +鮪 +鮭 +鮮 +鯉 +鯊 +鯖 +鯛 +鯨 +鯰 +鯽 +鰍 +鰓 +鰭 +鰲 +鰻 +鰾 +鱈 +鱉 +鱔 +鱗 +鱷 +鱸 +鱼 +鱿 +鲁 +鲈 +鲍 +鲑 +鲛 +鲜 +鲟 +鲢 +鲤 +鲨 +鲫 +鲱 +鲲 +鲶 +鲷 +鲸 +鳃 +鳄 +鳅 +鳌 +鳍 +鳕 +鳖 +鳗 +鳝 +鳞 +鳥 +鳩 +鳳 +鳴 +鳶 +鴉 +鴕 +鴛 +鴦 +鴨 +鴻 +鴿 +鵑 +鵜 +鵝 +鵡 +鵬 +鵰 +鵲 +鶘 +鶩 +鶯 +鶴 +鷗 +鷲 +鷹 +鷺 +鸚 +鸞 +鸟 +鸠 +鸡 +鸢 +鸣 +鸥 +鸦 +鸨 +鸪 +鸭 +鸯 +鸳 +鸵 +鸽 +鸾 +鸿 +鹂 +鹃 +鹄 +鹅 +鹈 +鹉 +鹊 +鹌 +鹏 +鹑 +鹕 +鹘 +鹜 +鹞 +鹤 +鹦 +鹧 +鹫 +鹭 +鹰 +鹳 +鹵 +鹹 +鹼 +鹽 +鹿 +麂 +麋 +麒 +麓 +麗 +麝 +麟 +麥 +麦 +麩 +麴 +麵 +麸 +麺 +麻 +麼 +麽 +麾 +黃 +黄 +黍 +黎 +黏 +黑 +黒 +黔 +默 +黛 +黜 +黝 +點 +黠 +黨 +黯 +黴 +鼋 +鼎 +鼐 +鼓 +鼠 +鼬 +鼹 +鼻 +鼾 +齁 +齊 +齋 +齐 +齒 +齡 +齢 +齣 +齦 +齿 +龄 +龅 +龈 +龊 +龋 +龌 +龍 +龐 +龔 +龕 +龙 +龚 +龛 +龜 +龟 +︰ +︱ +︶ +︿ +﹁ +﹂ +﹍ +﹏ +﹐ +﹑ +﹒ +﹔ +﹕ +﹖ +﹗ +﹙ +﹚ +﹝ +﹞ +﹡ +﹣ +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +。 +「 +」 +、 +・ +ッ +ー +イ +ク +シ +ス +ト +ノ +フ +ラ +ル +ン +゙ +゚ + ̄ +¥ +👍 +🔥 +😂 +😎 +... +yam +10 +2017 +12 +11 +2016 +20 +30 +15 +06 +lofter +##s +2015 +by +16 +14 +18 +13 +24 +17 +2014 +21 +##0 +22 +19 +25 +23 +com +100 +00 +05 +2013 +##a +03 +09 +08 +28 +##2 +50 +01 +04 +##1 +27 +02 +2012 +##3 +26 +##e +07 +##8 +##5 +##6 +##4 +##9 +##7 +29 +2011 +40 +##t +2010 +##o +##d +##i +2009 +##n +app +www +the +##m +31 +##c +##l +##y +##r +##g +2008 +60 +http +200 +qq +##p +80 +##f +google +pixnet +90 +cookies +tripadvisor +500 +##er +##k +35 +##h +facebook +2007 +2000 +70 +##b +of +##x +##u +45 +300 +iphone +32 +1000 +2006 +48 +ip +36 +in +38 +3d +##w +##ing +55 +ctrip +##on +##v +33 +##の +to +34 +400 +id +2005 +it +37 +windows +llc +top +99 +42 +39 +000 +led +at +##an +41 +51 +52 +46 +49 +43 +53 +44 +##z +android +58 +and +59 +2004 +56 +vr +##か +5000 +2003 +47 +blogthis +twitter +54 +##le +150 +ok +2018 +57 +75 +cn +no +ios +##in +##mm +##00 +800 +on +te +3000 +65 +2001 +360 +95 +ig +lv +120 +##ng +##を +##us +##に +pc +てす +── +600 +##te +85 +2002 +88 +##ed +html +ncc +wifi +email +64 +blog +is +##10 +##て +mail +online +##al +dvd +##ic +studio +##は +##℃ +##ia +##と +line +vip +72 +##q +98 +##ce +##en +for +##is +##ra +##es +##j +usb +net +cp +1999 +asia +4g +##cm +diy +new +3c +##お +ta +66 +language +vs +apple +tw +86 +web +##ne +ipad +62 +you +##re +101 +68 +##tion +ps +de +bt +pony +atm +##2017 +1998 +67 +##ch +ceo +##or +go +##na +av +pro +cafe +96 +pinterest +97 +63 +pixstyleme3c +##ta +more +said +##2016 +1997 +mp3 +700 +##ll +nba +jun +##20 +92 +tv +1995 +pm +61 +76 +nbsp +250 +##ie +linux +##ma +cd +110 +hd +##17 +78 +##ion +77 +6000 +am +##th +##st +94 +##se +##et +69 +180 +gdp +my +105 +81 +abc +89 +flash +79 +one +93 +1990 +1996 +##ck +gps +##も +##ly +web885 +106 +2020 +91 +##ge +4000 +1500 +xd +boss +isbn +1994 +org +##ry +me +love +##11 +0fork +73 +##12 +3g +##ter +##ar +71 +82 +##la +hotel +130 +1970 +pk +83 +87 +140 +ie +##os +##30 +##el +74 +##50 +seo +cpu +##ml +p2p +84 +may +##る +sun +tue +internet +cc +posted +youtube +##at +##ン +##man +ii +##ル +##15 +abs +nt +pdf +yahoo +ago +1980 +##it +news +mac +104 +##てす +##me +##り +java +1992 +spa +##de +##nt +hk +all +plus +la +1993 +##mb +##16 +##ve +west +##da +160 +air +##い +##ps +から +##to +1989 +logo +htc +php +https +fi +momo +##son +sat +##ke +##80 +ebd +suv +wi +day +apk +##88 +##um +mv +galaxy +wiki +or +brake +##ス +1200 +する +this +1991 +mon +##こ +❤2017 +po +##ない +javascript +life +home +june +##ss +system +900 +##ー +##0 +pp +1988 +world +fb +4k +br +##as +ic +ai +leonardo +safari +##60 +live +free +xx +wed +win7 +kiehl +##co +lg +o2o +##go +us +235 +1949 +mm +しい +vfm +kanye +##90 +##2015 +##id +jr +##ey +123 +rss +##sa +##ro +##am +##no +thu +fri +350 +##sh +##ki +103 +comments +name +##のて +##pe +##ine +max +1987 +8000 +uber +##mi +##ton +wordpress +office +1986 +1985 +##ment +107 +bd +win10 +##ld +##li +gmail +bb +dior +##rs +##ri +##rd +##ます +up +cad +##® +dr +して +read +##21 +をお +##io +##99 +url +1984 +pvc +paypal +show +policy +##40 +##ty +##18 +with +##★ +##01 +txt +102 +##ba +dna +from +post +mini +ar +taiwan +john +##ga +privacy +agoda +##13 +##ny +word +##24 +##22 +##by +##ur +##hz +1982 +##ang +265 +cookie +netscape +108 +##ka +##~ +##ad +house +share +note +ibm +code +hello +nike +sim +survey +##016 +1979 +1950 +wikia +##32 +##017 +5g +cbc +##tor +##kg +1983 +##rt +##14 +campaign +store +2500 +os +##ct +##ts +##° +170 +api +##ns +365 +excel +##な +##ao +##ら +##し +~~ +##nd +university +163 +には +518 +##70 +##ya +##il +##25 +pierre +ipo +0020 +897 +##23 +hotels +##ian +のお +125 +years +6606 +##ers +##26 +high +##day +time +##ay +bug +##line +##く +##す +##be +xp +talk2yam +yamservice +10000 +coco +##dy +sony +##ies +1978 +microsoft +david +people +##ha +1960 +instagram +intel +その +##ot +iso +1981 +##va +115 +##mo +##land +xxx +man +co +ltxsw +##ation +baby +220 +##pa +##ol +1945 +7000 +tag +450 +##ue +msn +##31 +oppo +##ト +##ca +control +##om +st +chrome +##ure +##ん +be +##き +lol +##19 +した +##bo +240 +lady +##100 +##way +##から +4600 +##ko +##do +##un +4s +corporation +168 +##ni +herme +##28 +cp +978 +##up +##06 +ui +##ds +ppt +admin +three +します +bbc +re +128 +##48 +ca +##015 +##35 +hp +##ee +tpp +##た +##ive +×× +root +##cc +##ました +##ble +##ity +adobe +park +114 +et +oled +city +##ex +##ler +##ap +china +##book +20000 +view +##ice +global +##km +your +hong +##mg +out +##ms +ng +ebay +##29 +menu +ubuntu +##cy +rom +##view +open +ktv +do +server +##lo +if +english +##ね +##5 +##oo +1600 +##02 +step1 +kong +club +135 +july +inc +1976 +mr +hi +##net +touch +##ls +##ii +michael +lcd +##05 +##33 +phone +james +step2 +1300 +ios9 +##box +dc +##2 +##ley +samsung +111 +280 +pokemon +css +##ent +##les +いいえ +##1 +s8 +atom +play +bmw +##said +sa +etf +ctrl +♥yoyo♥ +##55 +2025 +##2014 +##66 +adidas +amazon +1958 +##ber +##ner +visa +##77 +##der +1800 +connectivity +##hi +firefox +109 +118 +hr +so +style +mark +pop +ol +skip +1975 +as +##27 +##ir +##61 +190 +mba +##う +##ai +le +##ver +1900 +cafe2017 +lte +super +113 +129 +##ron +amd +like +##☆ +are +##ster +we +##sk +paul +data +international +##ft +longchamp +ssd +good +##ート +##ti +reply +##my +↓↓↓ +apr +star +##ker +source +136 +js +112 +get +force +photo +##one +126 +##2013 +##ow +link +bbs +1972 +goods +##lin +python +119 +##ip +game +##ics +##ません +blue +##● +520 +##45 +page +itunes +##03 +1955 +260 +1968 +gt +gif +618 +##ff +##47 +group +くたさい +about +bar +ganji +##nce +music +lee +not +1977 +1971 +1973 +##per +an +faq +comment +##って +days +##ock +116 +##bs +1974 +1969 +v1 +player +1956 +xbox +sql +fm +f1 +139 +##ah +210 +##lv +##mp +##000 +melody +1957 +##3 +550 +17life +199 +1966 +xml +market +##au +##71 +999 +##04 +what +gl +##95 +##age +tips +##68 +book +##ting +mysql +can +1959 +230 +##ung +wonderland +watch +10℃ +##ction +9000 +mar +mobile +1946 +1962 +article +##db +part +▲top +party +って +1967 +1964 +1948 +##07 +##ore +##op +この +dj +##78 +##38 +010 +main +225 +1965 +##ong +art +320 +ad +134 +020 +##73 +117 +pm2 +japan +228 +##08 +ts +1963 +##ica +der +sm +##36 +2019 +##wa +ct +##7 +##や +##64 +1937 +homemesh +search +##85 +##れは +##tv +##di +macbook +##9 +##くたさい +service +##♥ +type +った +750 +##ier +##si +##75 +##います +##ok +best +##ット +goris +lock +##った +cf +3m +big +##ut +ftp +carol +##vi +10 +1961 +happy +sd +##ac +122 +anti +pe +cnn +iii +1920 +138 +##ラ +1940 +esp +jan +tags +##98 +##51 +august +vol +##86 +154 +##™ +##fs +##れ +##sion +design +ac +##ム +press +jordan +ppp +that +key +check +##6 +##tt +##㎡ +1080p +##lt +power +##42 +1952 +##bc +vivi +##ック +he +133 +121 +jpg +##rry +201 +175 +3500 +1947 +nb +##ted +##rn +しています +1954 +usd +##t00 +master +##ンク +001 +model +##58 +al +##09 +1953 +##34 +ram +goo +ても +##ui +127 +1930 +red +##ary +rpg +item +##pm +##41 +270 +##za +project +##2012 +hot +td +blogabstract +##ger +##62 +650 +##44 +gr2 +##します +##m +black +electronic +nfc +year +asus +また +html5 +cindy +##hd +m3 +132 +esc +##od +booking +##53 +fed +tvb +##81 +##ina +mit +165 +##いる +chan +192 +distribution +next +になる +peter +bios +steam +cm +1941 +にも +pk10 +##ix +##65 +##91 +dec +nasa +##ana +icecat +00z +b1 +will +##46 +li +se +##ji +##み +##ard +oct +##ain +jp +##ze +##bi +cio +##56 +smart +h5 +##39 +##port +curve +vpn +##nm +##dia +utc +##あり +12345678910 +##52 +rmvb +chanel +a4 +miss +##and +##im +media +who +##63 +she +girl +5s +124 +vera +##して +class +vivo +king +##フ +##ei +national +ab +1951 +5cm +888 +145 +ipod +ap +1100 +5mm +211 +ms +2756 +##69 +mp4 +msci +##po +##89 +131 +mg +index +380 +##bit +##out +##zz +##97 +##67 +158 +apec +##8 +photoshop +opec +¥799 +ては +##96 +##tes +##ast +2g +○○ +##ール +¥2899 +##ling +##よ +##ory +1938 +##ical +kitty +content +##43 +step3 +##cn +win8 +155 +vc +1400 +iphone7 +robert +##した +tcl +137 +beauty +##87 +en +dollars +##ys +##oc +step +pay +yy +a1 +##2011 +##lly +##ks +##♪ +1939 +188 +download +1944 +sep +exe +ph +います +school +gb +center +pr +street +##board +uv +##37 +##lan +winrar +##que +##ua +##com +1942 +1936 +480 +gpu +##4 +ettoday +fu +tom +##54 +##ren +##via +149 +##72 +b2b +144 +##79 +##tch +rose +arm +mb +##49 +##ial +##nn +nvidia +step4 +mvp +00㎡ +york +156 +##イ +how +cpi +591 +2765 +gov +kg +joe +##xx +mandy +pa +##ser +copyright +fashion +1935 +don +##け +ecu +##ist +##art +erp +wap +have +##lm +talk +##ek +##ning +##if +ch +##ite +video +1943 +cs +san +iot +look +##84 +##2010 +##ku +october +##ux +trump +##hs +##ide +box +141 +first +##ins +april +##ight +##83 +185 +angel +protected +aa +151 +162 +x1 +m2 +##fe +##× +##ho +size +143 +min +ofo +fun +gomaji +ex +hdmi +food +dns +march +chris +kevin +##のか +##lla +##pp +##ec +ag +ems +6s +720p +##rm +##ham +off +##92 +asp +team +fandom +ed +299 +▌♥ +##ell +info +されています +##82 +sina +4066 +161 +##able +##ctor +330 +399 +315 +dll +rights +ltd +idc +jul +3kg +1927 +142 +ma +surface +##76 +##ク +~~~ +304 +mall +eps +146 +green +##59 +map +space +donald +v2 +sodu +##light +1931 +148 +1700 +まて +310 +reserved +htm +##han +##57 +2d +178 +mod +##ise +##tions +152 +ti +##shi +doc +1933 +icp +055 +wang +##ram +shopping +aug +##pi +##well +now +wam +b2 +からお +##hu +236 +1928 +##gb +266 +f2 +##93 +153 +mix +##ef +##uan +bwl +##plus +##res +core +##ess +tea +5℃ +hktvmall +nhk +##ate +list +##ese +301 +feb +4m +inn +ての +nov +159 +12345 +daniel +##ci +pass +##bet +##nk +coffee +202 +ssl +airbnb +##ute +fbi +woshipm +skype +ea +cg +sp +##fc +##www +yes +edge +alt +007 +##94 +fpga +##ght +##gs +iso9001 +さい +##ile +##wood +##uo +image +lin +icon +american +##em +1932 +set +says +##king +##tive +blogger +##74 +なと +256 +147 +##ox +##zy +##red +##ium +##lf +nokia +claire +##リ +##ding +november +lohas +##500 +##tic +##マ +##cs +##ある +##che +##ire +##gy +##ult +db +january +win +##カ +166 +road +ptt +##ま +##つ +198 +##fa +##mer +anna +pchome +はい +udn +ef +420 +##time +##tte +2030 +##ア +g20 +white +かかります +1929 +308 +garden +eleven +di +##おります +chen +309b +777 +172 +young +cosplay +ちてない +4500 +bat +##123 +##tra +##ては +kindle +npc +steve +etc +##ern +##| +call +xperia +ces +travel +sk +s7 +##ous +1934 +##int +みいたたけます +183 +edu +file +cho +qr +##car +##our +186 +##ant +##d +eric +1914 +rends +##jo +##する +mastercard +##2000 +kb +##min +290 +##ino +vista +##ris +##ud +jack +2400 +##set +169 +pos +1912 +##her +##ou +taipei +しく +205 +beta +##ませんか +232 +##fi +express +255 +body +##ill +aphojoy +user +december +meiki +##ick +tweet +richard +##av +##ᆫ +iphone6 +##dd +ちてすか +views +##mark +321 +pd +##00 +times +##▲ +level +##ash +10g +point +5l +##ome +208 +koreanmall +##ak +george +q2 +206 +wma +tcp +##200 +スタッフ +full +mlb +##lle +##watch +tm +run +179 +911 +smith +business +##und +1919 +color +##tal +222 +171 +##less +moon +4399 +##rl +update +pcb +shop +499 +157 +little +なし +end +##mhz +van +dsp +easy +660 +##house +##key +history +##o +oh +##001 +##hy +##web +oem +let +was +##2009 +##gg +review +##wan +182 +##°c +203 +uc +title +##val +united +233 +2021 +##ons +doi +trivago +overdope +sbs +##ance +##ち +grand +special +573032185 +imf +216 +wx17house +##so +##ーム +audi +##he +london +william +##rp +##ake +science +beach +cfa +amp +ps4 +880 +##800 +##link +##hp +crm +ferragamo +bell +make +##eng +195 +under +zh +photos +2300 +##style +##ント +via +176 +da +##gi +company +i7 +##ray +thomas +370 +ufo +i5 +##max +plc +ben +back +research +8g +173 +mike +##pc +##ッフ +september +189 +##ace +vps +february +167 +pantos +wp +lisa +1921 +★★ +jquery +night +long +offer +##berg +##news +1911 +##いて +ray +fks +wto +せます +over +164 +340 +##all +##rus +1924 +##888 +##works +blogtitle +loftpermalink +##→ +187 +martin +test +ling +km +##め +15000 +fda +v3 +##ja +##ロ +wedding +かある +outlet +family +##ea +をこ +##top +story +##ness +salvatore +##lu +204 +swift +215 +room +している +oracle +##ul +1925 +sam +b2c +week +pi +rock +##のは +##a +##けと +##ean +##300 +##gle +cctv +after +chinese +##back +powered +x2 +##tan +1918 +##nes +##イン +canon +only +181 +##zi +##las +say +##oe +184 +##sd +221 +##bot +##world +##zo +sky +made +top100 +just +1926 +pmi +802 +234 +gap +##vr +177 +les +174 +▲topoct +ball +vogue +vi +ing +ofweek +cos +##list +##ort +▲topmay +##なら +##lon +として +last +##tc +##of +##bus +##gen +real +eva +##コ +a3 +nas +##lie +##ria +##coin +##bt +▲topapr +his +212 +cat +nata +vive +health +⋯⋯ +drive +sir +▲topmar +du +cup +##カー +##ook +##よう +##sy +alex +msg +tour +しました +3ce +##word +193 +ebooks +r8 +block +318 +##より +2200 +nice +pvp +207 +months +1905 +rewards +##ther +1917 +0800 +##xi +##チ +##sc +micro +850 +gg +blogfp +op +1922 +daily +m1 +264 +true +##bb +ml +##tar +##のお +##ky +anthony +196 +253 +##yo +state +218 +##ara +##aa +##rc +##tz +##ston +より +gear +##eo +##ade +ge +see +1923 +##win +##ura +ss +heart +##den +##ita +down +##sm +el +png +2100 +610 +rakuten +whatsapp +bay +dream +add +##use +680 +311 +pad +gucci +mpv +##ode +##fo +island +▲topjun +##▼ +223 +jason +214 +chicago +##❤ +しの +##hone +io +##れる +##ことか +sogo +be2 +##ology +990 +cloud +vcd +##con +2~3 +##ford +##joy +##kb +##こさいます +##rade +but +##ach +docker +##ful +rfid +ul +##ase +hit +ford +##star +580 +##○ +11 +a2 +sdk +reading +edited +##are +cmos +##mc +238 +siri +light +##ella +##ため +bloomberg +##read +pizza +##ison +jimmy +##vm +college +node +journal +ba +18k +##play +245 +##cer +20 +magic +##yu +191 +jump +288 +tt +##ings +asr +##lia +3200 +step5 +network +##cd +mc +いします +1234 +pixstyleme +273 +##600 +2800 +money +★★★★★ +1280 +12 +430 +bl +みの +act +##tus +tokyo +##rial +##life +emba +##ae +saas +tcs +##rk +##wang +summer +##sp +ko +##ving +390 +premium +##その +netflix +##ヒ +uk +mt +##lton +right +frank +two +209 +える +##ple +##cal +021 +##んな +##sen +##ville +hold +nexus +dd +##ius +てお +##mah +##なく +tila +zero +820 +ce +##tin +resort +##ws +charles +old +p10 +5d +report +##360 +##ru +##には +bus +vans +lt +##est +pv +##レ +links +rebecca +##ツ +##dm +azure +##365 +きな +limited +bit +4gb +##mon +1910 +moto +##eam +213 +1913 +var +eos +なとの +226 +blogspot +された +699 +e3 +dos +dm +fc +##ments +##ik +##kw +boy +##bin +##ata +960 +er +##せ +219 +##vin +##tu +##ula +194 +##∥ +station +##ろ +##ature +835 +files +zara +hdr +top10 +nature +950 +magazine +s6 +marriott +##シ +avira +case +##っと +tab +##ran +tony +##home +oculus +im +##ral +jean +saint +cry +307 +rosie +##force +##ini +ice +##bert +のある +##nder +##mber +pet +2600 +##◆ +plurk +▲topdec +##sis +00kg +▲topnov +720 +##ence +tim +##ω +##nc +##ても +##name +log +ips +great +ikea +malaysia +unix +##イト +3600 +##ncy +##nie +12000 +akb48 +##ye +##oid +404 +##chi +##いた +oa +xuehai +##1000 +##orm +##rf +275 +さん +##ware +##リー +980 +ho +##pro +text +##era +560 +bob +227 +##ub +##2008 +8891 +scp +avi +##zen +2022 +mi +wu +museum +qvod +apache +lake +jcb +▲topaug +★★★ +ni +##hr +hill +302 +ne +weibo +490 +ruby +##ーシ +##ヶ +##row +4d +▲topjul +iv +##ish +github +306 +mate +312 +##スト +##lot +##ane +andrew +のハイト +##tina +t1 +rf +ed2k +##vel +##900 +way +final +りの +ns +5a +705 +197 +##メ +sweet +bytes +##ene +▲topjan +231 +##cker +##2007 +##px +100g +topapp +229 +helpapp +rs +low +14k +g4g +care +630 +ldquo +あり +##fork +leave +rm +edition +##gan +##zon +##qq +▲topsep +##google +##ism +gold +224 +explorer +##zer +toyota +category +select +visual +##labels +restaurant +##md +posts +s1 +##ico +もっと +angelababy +123456 +217 +sports +s3 +mbc +1915 +してくたさい +shell +x86 +candy +##new +kbs +face +xl +470 +##here +4a +swissinfo +v8 +▲topfeb +dram +##ual +##vice +3a +##wer +sport +q1 +ios10 +public +int +card +##c +ep +au +rt +##れた +1080 +bill +##mll +kim +30 +460 +wan +##uk +##ミ +x3 +298 +0t +scott +##ming +239 +e5 +##3d +h7n9 +worldcat +brown +##あります +##vo +##led +##580 +##ax +249 +410 +##ert +paris +##~6 +polo +925 +##lr +599 +##ナ +capital +##hing +bank +cv +1g +##chat +##s +##たい +adc +##ule +2m +##e +digital +hotmail +268 +##pad +870 +bbq +quot +##ring +before +wali +##まて +mcu +2k +2b +という +costco +316 +north +333 +switch +##city +##p +philips +##mann +management +panasonic +##cl +##vd +##ping +##rge +alice +##lk +##ましょう +css3 +##ney +vision +alpha +##ular +##400 +##tter +lz +にお +##ありません +mode +gre +1916 +pci +##tm +237 +1~2 +##yan +##そ +について +##let +##キ +work +war +coach +ah +mary +##ᅵ +huang +##pt +a8 +pt +follow +##berry +1895 +##ew +a5 +ghost +##ション +##wn +##og +south +##code +girls +##rid +action +villa +git +r11 +table +games +##cket +error +##anonymoussaid +##ag +here +##ame +##gc +qa +##■ +##lis +gmp +##gin +vmalife +##cher +yu +wedding +##tis +demo +dragon +530 +soho +social +bye +##rant +river +orz +acer +325 +##↑ +##ース +##ats +261 +del +##ven +440 +ups +##ように +##ター +305 +value +macd +yougou +##dn +661 +##ano +ll +##urt +##rent +continue +script +##wen +##ect +paper +263 +319 +shift +##chel +##フト +##cat +258 +x5 +fox +243 +##さん +car +aaa +##blog +loading +##yn +##tp +kuso +799 +si +sns +イカせるテンマ +ヒンクテンマ3 +rmb +vdc +forest +central +prime +help +ultra +##rmb +##ような +241 +square +688 +##しい +のないフロクに +##field +##reen +##ors +##ju +c1 +start +510 +##air +##map +cdn +##wo +cba +stephen +m8 +100km +##get +opera +##base +##ood +vsa +com™ +##aw +##ail +251 +なのて +count +t2 +##ᅡ +##een +2700 +hop +##gp +vsc +tree +##eg +##ose +816 +285 +##ories +##shop +alphago +v4 +1909 +simon +##ᆼ +fluke62max +zip +スホンサー +##sta +louis +cr +bas +##~10 +bc +##yer +hadoop +##ube +##wi +1906 +0755 +hola +##low +place +centre +5v +d3 +##fer +252 +##750 +##media +281 +540 +0l +exchange +262 +series +##ハー +##san +eb +##bank +##k +q3 +##nge +##mail +take +##lp +259 +1888 +client +east +cache +event +vincent +##ールを +きを +##nse +sui +855 +adchoice +##и +##stry +##なたの +246 +##zone +ga +apps +sea +##ab +248 +cisco +##タ +##rner +kymco +##care +dha +##pu +##yi +minkoff +royal +p1 +への +annie +269 +collection +kpi +playstation +257 +になります +866 +bh +##bar +queen +505 +radio +1904 +andy +armani +##xy +manager +iherb +##ery +##share +spring +raid +johnson +1908 +##ob +volvo +hall +##ball +v6 +our +taylor +##hk +bi +242 +##cp +kate +bo +water +technology +##rie +サイトは +277 +##ona +##sl +hpv +303 +gtx +hip +rdquo +jayz +stone +##lex +##rum +namespace +##やり +620 +##ale +##atic +des +##erson +##ql +##ves +##type +enter +##この +##てきます +d2 +##168 +##mix +##bian +との +a9 +jj +ky +##lc +access +movie +##hc +リストに +tower +##ration +##mit +ます +##nch +ua +tel +prefix +##o2 +1907 +##point +1901 +ott +~10 +##http +##ury +baidu +##ink +member +##logy +bigbang +nownews +##js +##shot +##tb +##こと +247 +eba +##tics +##lus +ける +v5 +spark +##ama +there +##ions +god +##lls +##down +hiv +##ress +burberry +day2 +##kv +◆◆ +jeff +related +film +edit +joseph +283 +##ark +cx +32gb +order +g9 +30000 +##ans +##tty +s5 +##bee +かあります +thread +xr +buy +sh +005 +land +spotify +mx +##ari +276 +##verse +×email +sf +why +##ことて +244 +7headlines +nego +sunny +dom +exo +401 +666 +positioning +fit +rgb +##tton +278 +kiss +alexa +adam +lp +みリストを +##g +mp +##ties +##llow +amy +##du +np +002 +institute +271 +##rth +##lar +2345 +590 +##des +sidebar +15 +imax +site +##cky +##kit +##ime +##009 +season +323 +##fun +##ンター +##ひ +gogoro +a7 +pu +lily +fire +twd600 +##ッセーシを +いて +##vis +30ml +##cture +##をお +information +##オ +close +friday +##くれる +yi +nick +てすか +##tta +##tel +6500 +##lock +cbd +economy +254 +かお +267 +tinker +double +375 +8gb +voice +##app +oops +channel +today +985 +##right +raw +xyz +##+ +jim +edm +##cent +7500 +supreme +814 +ds +##its +##asia +dropbox +##てすか +##tti +books +272 +100ml +##tle +##ller +##ken +##more +##boy +sex +309 +##dom +t3 +##ider +##なります +##unch +1903 +810 +feel +5500 +##かった +##put +により +s2 +mo +##gh +men +ka +amoled +div +##tr +##n1 +port +howard +##tags +ken +dnf +##nus +adsense +##а +ide +##へ +buff +thunder +##town +##ique +has +##body +auto +pin +##erry +tee +てした +295 +number +##the +##013 +object +psp +cool +udnbkk +16gb +##mic +miui +##tro +most +r2 +##alk +##nity +1880 +±0 +##いました +428 +s4 +law +version +##oa +n1 +sgs +docomo +##tf +##ack +henry +fc2 +##ded +##sco +##014 +##rite +286 +0mm +linkedin +##ada +##now +wii +##ndy +ucbug +##◎ +sputniknews +legalminer +##ika +##xp +2gb +##bu +q10 +oo +b6 +come +##rman +cheese +ming +maker +##gm +nikon +##fig +ppi +kelly +##ります +jchere +てきます +ted +md +003 +fgo +tech +##tto +dan +soc +##gl +##len +hair +earth +640 +521 +img +##pper +##a1 +##てきる +##ロク +acca +##ition +##ference +suite +##ig +outlook +##mond +##cation +398 +##pr +279 +101vip +358 +##999 +282 +64gb +3800 +345 +airport +##over +284 +##おり +jones +##ith +lab +##su +##いるのて +co2 +town +piece +##llo +no1 +vmware +24h +##qi +focus +reader +##admin +##ora +tb +false +##log +1898 +know +lan +838 +##ces +f4 +##ume +motel +stop +##oper +na +flickr +netcomponents +##af +##─ +pose +williams +local +##ound +##cg +##site +##iko +いお +274 +5m +gsm +con +##ath +1902 +friends +##hip +cell +317 +##rey +780 +cream +##cks +012 +##dp +facebooktwitterpinterestgoogle +sso +324 +shtml +song +swiss +##mw +##キンク +lumia +xdd +string +tiffany +522 +marc +られた +insee +russell +sc +dell +##ations +ok +camera +289 +##vs +##flow +##late +classic +287 +##nter +stay +g1 +mtv +512 +##ever +##lab +##nger +qe +sata +ryan +d1 +50ml +cms +##cing +su +292 +3300 +editor +296 +##nap +security +sunday +association +##ens +##700 +##bra +acg +##かり +sofascore +とは +mkv +##ign +jonathan +gary +build +labels +##oto +tesla +moba +qi +gohappy +general +ajax +1024 +##かる +サイト +society +##test +##urs +wps +fedora +##ich +mozilla +328 +##480 +##dr +usa +urn +##lina +##r +grace +##die +##try +##ader +1250 +##なり +elle +570 +##chen +##ᆯ +price +##ten +uhz +##ough +eq +##hen +states +push +session +balance +wow +506 +##cus +##py +when +##ward +##ep +34e +wong +library +prada +##サイト +##cle +running +##ree +313 +ck +date +q4 +##ctive +##ool +##> +mk +##ira +##163 +388 +die +secret +rq +dota +buffet +は1ヶ +e6 +##ez +pan +368 +ha +##card +##cha +2a +##さ +alan +day3 +eye +f3 +##end +france +keep +adi +rna +tvbs +##ala +solo +nova +##え +##tail +##ょう +support +##ries +##なる +##ved +base +copy +iis +fps +##ways +hero +hgih +profile +fish +mu +ssh +entertainment +chang +##wd +click +cake +##ond +pre +##tom +kic +pixel +##ov +##fl +product +6a +##pd +dear +##gate +es +yumi +audio +##² +##sky +echo +bin +where +##ture +329 +##ape +find +sap +isis +##なと +nand +##101 +##load +##ream +band +a6 +525 +never +##post +festival +50cm +##we +555 +guide +314 +zenfone +##ike +335 +gd +forum +jessica +strong +alexander +##ould +software +allen +##ious +program +360° +else +lohasthree +##gar +することかてきます +please +##れます +rc +##ggle +##ric +bim +50000 +##own +eclipse +355 +brian +3ds +##side +061 +361 +##other +##ける +##tech +##ator +485 +engine +##ged +##t +plaza +##fit +cia +ngo +westbrook +shi +tbs +50mm +##みませんか +sci +291 +reuters +##ily +contextlink +##hn +af +##cil +bridge +very +##cel +1890 +cambridge +##ize +15g +##aid +##data +790 +frm +##head +award +butler +##sun +meta +##mar +america +ps3 +puma +pmid +##すか +lc +670 +kitchen +##lic +オーフン5 +きなしソフトサーヒス +そして +day1 +future +★★★★ +##text +##page +##rris +pm1 +##ket +fans +##っています +1001 +christian +bot +kids +trackback +##hai +c3 +display +##hl +n2 +1896 +idea +さんも +##sent +airmail +##ug +##men +pwm +けます +028 +##lution +369 +852 +awards +schemas +354 +asics +wikipedia +font +##tional +##vy +c2 +293 +##れている +##dget +##ein +っている +contact +pepper +スキル +339 +##~5 +294 +##uel +##ument +730 +##hang +みてす +q5 +##sue +rain +##ndi +wei +swatch +##cept +わせ +331 +popular +##ste +##tag +p2 +501 +trc +1899 +##west +##live +justin +honda +ping +messenger +##rap +v9 +543 +##とは +unity +appqq +はすへて +025 +leo +##tone +##テ +##ass +uniqlo +##010 +502 +her +jane +memory +moneydj +##tical +human +12306 +していると +##m2 +coc +miacare +##mn +tmt +##core +vim +kk +##may +fan +target +use +too +338 +435 +2050 +867 +737 +fast +##2c +services +##ope +omega +energy +##わ +pinkoi +1a +##なから +##rain +jackson +##ement +##シャンルの +374 +366 +そんな +p9 +rd +##ᆨ +1111 +##tier +##vic +zone +##│ +385 +690 +dl +isofix +cpa +m4 +322 +kimi +めて +davis +##lay +lulu +##uck +050 +weeks +qs +##hop +920 +##n +ae +##ear +~5 +eia +405 +##fly +korea +jpeg +boost +##ship +small +##リア +1860 +eur +297 +425 +valley +##iel +simple +##ude +rn +k2 +##ena +されます +non +patrick +しているから +##ナー +feed +5757 +30g +process +well +qqmei +##thing +they +aws +lu +pink +##ters +##kin +または +board +##vertisement +wine +##ien +unicode +##dge +r1 +359 +##tant +いを +##twitter +##3c +cool1 +される +##れて +##l +isp +##012 +standard +45㎡2 +402 +##150 +matt +##fu +326 +##iner +googlemsn +pixnetfacebookyahoo +##ラン +x7 +886 +##uce +メーカー +sao +##ev +##きました +##file +9678 +403 +xddd +shirt +6l +##rio +##hat +3mm +givenchy +ya +bang +##lio +monday +crystal +ロクイン +##abc +336 +head +890 +ubuntuforumwikilinuxpastechat +##vc +##~20 +##rity +cnc +7866 +ipv6 +null +1897 +##ost +yang +imsean +tiger +##fet +##ンス +352 +##= +dji +327 +ji +maria +##come +##んて +foundation +3100 +##beth +##なった +1m +601 +active +##aft +##don +3p +sr +349 +emma +##khz +living +415 +353 +1889 +341 +709 +457 +sas +x6 +##face +pptv +x4 +##mate +han +sophie +##jing +337 +fifa +##mand +other +sale +inwedding +##gn +てきちゃいます +##mmy +##pmlast +bad +nana +nbc +してみてくたさいね +なとはお +##wu +##かあります +##あ +note7 +single +##340 +せからこ +してくたさい♪この +しにはとんとんワークケートを +するとあなたにもっとマッチした +ならワークケートへ +もみつかっちゃうかも +ワークケートの +##bel +window +##dio +##ht +union +age +382 +14 +##ivity +##y +コメント +domain +neo +##isa +##lter +5k +f5 +steven +##cts +powerpoint +tft +self +g2 +ft +##テル +zol +##act +mwc +381 +343 +もう +nbapop +408 +てある +eds +ace +##room +previous +author +tomtom +il +##ets +hu +financial +☆☆☆ +っています +bp +5t +chi +1gb +##hg +fairmont +cross +008 +gay +h2 +function +##けて +356 +also +1b +625 +##ータ +##raph +1894 +3~5 +##ils +i3 +334 +avenue +##host +による +##bon +##tsu +message +navigation +50g +fintech +h6 +##ことを +8cm +##ject +##vas +##firm +credit +##wf +xxxx +form +##nor +##space +huawei +plan +json +sbl +##dc +machine +921 +392 +wish +##120 +##sol +windows7 +edward +##ために +development +washington +##nsis +lo +818 +##sio +##ym +##bor +planet +##~8 +##wt +ieee +gpa +##めて +camp +ann +gm +##tw +##oka +connect +##rss +##work +##atus +wall +chicken +soul +2mm +##times +fa +##ather +##cord +009 +##eep +hitachi +gui +harry +##pan +e1 +disney +##press +##ーション +wind +386 +frigidaire +##tl +liu +hsu +332 +basic +von +ev +いた +てきる +スホンサーサイト +learning +##ull +expedia +archives +change +##wei +santa +cut +ins +6gb +turbo +brand +cf1 +508 +004 +return +747 +##rip +h1 +##nis +##をこ +128gb +##にお +3t +application +しており +emc +rx +##oon +384 +quick +412 +15058 +wilson +wing +chapter +##bug +beyond +##cms +##dar +##oh +zoom +e2 +trip +sb +##nba +rcep +342 +aspx +ci +080 +gc +gnu +める +##count +advanced +dance +dv +##url +##ging +367 +8591 +am09 +shadow +battle +346 +##i +##cia +##という +emily +##のてす +##tation +host +ff +techorz +sars +##mini +##mporary +##ering +nc +4200 +798 +##next +cma +##mbps +##gas +##ift +##dot +##ィ +455 +##~17 +amana +##りの +426 +##ros +ir +00㎡1 +##eet +##ible +##↓ +710 +ˋ▽ˊ +##aka +dcs +iq +##v +l1 +##lor +maggie +##011 +##iu +588 +##~1 +830 +##gt +1tb +articles +create +##burg +##iki +database +fantasy +##rex +##cam +dlc +dean +##you +hard +path +gaming +victoria +maps +cb +##lee +##itor +overchicstoretvhome +systems +##xt +416 +p3 +sarah +760 +##nan +407 +486 +x9 +install +second +626 +##ann +##ph +##rcle +##nic +860 +##nar +ec +##とう +768 +metro +chocolate +##rian +~4 +##table +##しています +skin +##sn +395 +mountain +##0mm +inparadise +6m +7x24 +ib +4800 +##jia +eeworld +creative +g5 +g3 +357 +parker +ecfa +village +からの +18000 +sylvia +サーヒス +hbl +##ques +##onsored +##x2 +##きます +##v4 +##tein +ie6 +383 +##stack +389 +ver +##ads +##baby +sound +bbe +##110 +##lone +##uid +ads +022 +gundam +351 +thinkpad +006 +scrum +match +##ave +mems +##470 +##oy +##なりました +##talk +glass +lamigo +span +##eme +job +##a5 +jay +wade +kde +498 +##lace +ocean +tvg +##covery +##r3 +##ners +##rea +junior +think +##aine +cover +##ision +##sia +↓↓ +##bow +msi +413 +458 +406 +##love +711 +801 +soft +z2 +##pl +456 +1840 +mobil +mind +##uy +427 +nginx +##oi +めた +##rr +6221 +##mple +##sson +##ーシてす +371 +##nts +91tv +comhd +crv3000 +##uard +1868 +397 +deep +lost +field +gallery +##bia +rate +spf +redis +traction +930 +icloud +011 +なら +fe +jose +372 +##tory +into +sohu +fx +899 +379 +kicstart2 +##hia +すく +##~3 +##sit +ra +24 +##walk +##xure +500g +##pact +pacific +xa +natural +carlo +##250 +##walker +1850 +##can +cto +gigi +516 +##サー +pen +##hoo +ob +matlab +##b +##yy +13913459 +##iti +mango +##bbs +sense +c5 +oxford +##ニア +walker +jennifer +##ola +course +##bre +701 +##pus +##rder +lucky +075 +##ぁ +ivy +なお +##nia +sotheby +side +##ugh +joy +##orage +##ush +##bat +##dt +364 +r9 +##2d +##gio +511 +country +wear +##lax +##~7 +##moon +393 +seven +study +411 +348 +lonzo +8k +##ェ +evolution +##イフ +##kk +gs +kd +##レス +arduino +344 +b12 +##lux +arpg +##rdon +cook +##x5 +dark +five +##als +##ida +とても +sign +362 +##ちの +something +20mm +##nda +387 +##posted +fresh +tf +1870 +422 +cam +##mine +##skip +##form +##ssion +education +394 +##tee +dyson +stage +##jie +want +##night +epson +pack +あります +##ppy +テリヘル +##█ +wd +##eh +##rence +left +##lvin +golden +mhz +discovery +##trix +##n2 +loft +##uch +##dra +##sse +speed +~1 +1mdb +sorry +welcome +##urn +wave +gaga +##lmer +teddy +##160 +トラックハック +せよ +611 +##f2016 +378 +rp +##sha +rar +##あなたに +##きた +840 +holiday +##ュー +373 +074 +##vg +##nos +##rail +gartner +gi +6p +##dium +kit +488 +b3 +eco +##ろう +20g +sean +##stone +autocad +nu +##np +f16 +write +029 +m5 +##ias +images +atp +##dk +fsm +504 +1350 +ve +52kb +##xxx +##のに +##cake +414 +unit +lim +ru +1v +##ification +published +angela +16g +analytics +ak +##q +##nel +gmt +##icon +again +##₂ +##bby +ios11 +445 +かこさいます +waze +いてす +##ハ +9985 +##ust +##ティー +framework +##007 +iptv +delete +52sykb +cl +wwdc +027 +30cm +##fw +##ての +1389 +##xon +brandt +##ses +##dragon +tc +vetements +anne +monte +modern +official +##へて +##ere +##nne +##oud +もちろん +50 +etnews +##a2 +##graphy +421 +863 +##ちゃん +444 +##rtex +##てお +l2 +##gma +mount +ccd +たと +archive +morning +tan +ddos +e7 +##ホ +day4 +##ウ +gis +453 +its +495 +factory +bruce +pg +##ito +ってくたさい +guest +cdma +##lling +536 +n3 +しかし +3~4 +mega +eyes +ro +13 +women +dac +church +##jun +singapore +##facebook +6991 +starbucks +##tos +##stin +##shine +zen +##mu +tina +20℃ +1893 +##たけて +503 +465 +request +##gence +qt +##っ +1886 +347 +363 +q7 +##zzi +diary +##tore +409 +##ead +468 +cst +##osa +canada +agent +va +##jiang +##ちは +##ーク +##lam +sg +##nix +##sday +##よって +g6 +##master +bing +##zl +charlie +16 +8mm +nb40 +##ーン +thai +##ルフ +ln284ct +##itz +##2f +bonnie +##food +##lent +originals +##stro +##lts +418 +∟∣ +##bscribe +children +ntd +yesstyle +##かも +hmv +##tment +d5 +2cm +arts +sms +##pn +##я +##いい +topios9 +539 +lifestyle +virtual +##ague +xz +##deo +muji +024 +unt +##nnis +##ᅩ +faq1 +1884 +396 +##ette +fly +64㎡ +はしめまして +441 +curry +##pop +のこ +release +##← +##◆◆ +##cast +073 +ありな +500ml +##ews +5c +##stle +ios7 +##ima +787 +dog +lenovo +##r4 +roger +013 +cbs +vornado +100m +417 +##desk +##クok +##ald +1867 +9595 +2900 +##van +oil +##x +some +break +common +##jy +##lines +g7 +twice +419 +ella +nano +belle +にこ +##mes +##self +##note +jb +##ことかてきます +benz +##との +##ova +451 +save +##wing +##ますのて +kai +りは +##hua +##rect +rainer +##unge +448 +##0m +adsl +##かな +guestname +##uma +##kins +##zu +tokichoi +##price +county +##med +##mus +rmk +391 +address +vm +えて +openload +##group +##hin +##iginal +amg +urban +##oz +jobs +emi +##public +beautiful +##sch +album +##dden +##bell +jerry +works +hostel +miller +##drive +##rmin +##10 +376 +boot +828 +##370 +##fx +##cm~ +1885 +##nome +##ctionary +##oman +##lish +##cr +##hm +433 +##how +432 +francis +xi +c919 +b5 +evernote +##uc +vga +##3000 +coupe +##urg +##cca +##uality +019 +6g +れる +multi +##また +##ett +em +hey +##ani +##tax +##rma +inside +than +740 +leonnhurt +##jin +ict +れた +bird +notes +200mm +くの +##dical +##lli +result +442 +iu +ee +438 +smap +gopro +##last +yin +pure +998 +32g +けた +5kg +##dan +##rame +mama +##oot +bean +marketing +##hur +2l +bella +sync +xuite +##ground +515 +discuz +##getrelax +##ince +##bay +##5s +cj +##イス +gmat +apt +##pass +jing +##rix +c4 +rich +##とても +niusnews +##ello +bag +770 +##eting +##mobile +18 +culture +015 +##のてすか +377 +1020 +area +##ience +616 +details +gp +universal +silver +dit +はお +private +ddd +u11 +kanshu +##ified +fung +##nny +dx +##520 +tai +475 +023 +##fr +##lean +3s +##pin +429 +##rin +25000 +ly +rick +##bility +usb3 +banner +##baru +##gion +metal +dt +vdf +1871 +karl +qualcomm +bear +1010 +oldid +ian +jo +##tors +population +##ernel +1882 +mmorpg +##mv +##bike +603 +##© +ww +friend +##ager +exhibition +##del +##pods +fpx +structure +##free +##tings +kl +##rley +##copyright +##mma +california +3400 +orange +yoga +4l +canmake +honey +##anda +##コメント +595 +nikkie +##ルハイト +dhl +publishing +##mall +##gnet +20cm +513 +##クセス +##┅ +e88 +970 +##dog +fishbase +##! +##" +### +##$ +##% +##& +##' +##( +##) +##* +##+ +##, +##- +##. +##/ +##: +##; +##< +##= +##> +##? +##@ +##[ +##\ +##] +##^ +##_ +##{ +##| +##} +##~ +##£ +##¤ +##¥ +##§ +##« +##± +##³ +##µ +##· +##¹ +##º +##» +##¼ +##ß +##æ +##÷ +##ø +##đ +##ŋ +##ɔ +##ə +##ɡ +##ʰ +##ˇ +##ˈ +##ˊ +##ˋ +##ˍ +##ː +##˙ +##˚ +##ˢ +##α +##β +##γ +##δ +##ε +##η +##θ +##ι +##κ +##λ +##μ +##ν +##ο +##π +##ρ +##ς +##σ +##τ +##υ +##φ +##χ +##ψ +##б +##в +##г +##д +##е +##ж +##з +##к +##л +##м +##н +##о +##п +##р +##с +##т +##у +##ф +##х +##ц +##ч +##ш +##ы +##ь +##і +##ا +##ب +##ة +##ت +##د +##ر +##س +##ع +##ل +##م +##ن +##ه +##و +##ي +##۩ +##ก +##ง +##น +##ม +##ย +##ร +##อ +##า +##เ +##๑ +##་ +##ღ +##ᄀ +##ᄁ +##ᄂ +##ᄃ +##ᄅ +##ᄆ +##ᄇ +##ᄈ +##ᄉ +##ᄋ +##ᄌ +##ᄎ +##ᄏ +##ᄐ +##ᄑ +##ᄒ +##ᅢ +##ᅣ +##ᅥ +##ᅦ +##ᅧ +##ᅨ +##ᅪ +##ᅬ +##ᅭ +##ᅮ +##ᅯ +##ᅲ +##ᅳ +##ᅴ +##ᆷ +##ᆸ +##ᆺ +##ᆻ +##ᗜ +##ᵃ +##ᵉ +##ᵍ +##ᵏ +##ᵐ +##ᵒ +##ᵘ +##‖ +##„ +##† +##• +##‥ +##‧ +##
 +##‰ +##′ +##″ +##‹ +##› +##※ +##‿ +##⁄ +##ⁱ +##⁺ +##ⁿ +##₁ +##₃ +##₄ +##€ +##№ +##ⅰ +##ⅱ +##ⅲ +##ⅳ +##ⅴ +##↔ +##↗ +##↘ +##⇒ +##∀ +##− +##∕ +##∙ +##√ +##∞ +##∟ +##∠ +##∣ +##∩ +##∮ +##∶ +##∼ +##∽ +##≈ +##≒ +##≡ +##≤ +##≥ +##≦ +##≧ +##≪ +##≫ +##⊙ +##⋅ +##⋈ +##⋯ +##⌒ +##① +##② +##③ +##④ +##⑤ +##⑥ +##⑦ +##⑧ +##⑨ +##⑩ +##⑴ +##⑵ +##⑶ +##⑷ +##⑸ +##⒈ +##⒉ +##⒊ +##⒋ +##ⓒ +##ⓔ +##ⓘ +##━ +##┃ +##┆ +##┊ +##┌ +##└ +##├ +##┣ +##═ +##║ +##╚ +##╞ +##╠ +##╭ +##╮ +##╯ +##╰ +##╱ +##╳ +##▂ +##▃ +##▅ +##▇ +##▉ +##▋ +##▌ +##▍ +##▎ +##□ +##▪ +##▫ +##▬ +##△ +##▶ +##► +##▽ +##◇ +##◕ +##◠ +##◢ +##◤ +##☀ +##☕ +##☞ +##☺ +##☼ +##♀ +##♂ +##♠ +##♡ +##♣ +##♦ +##♫ +##♬ +##✈ +##✔ +##✕ +##✖ +##✦ +##✨ +##✪ +##✰ +##✿ +##❀ +##➜ +##➤ +##⦿ +##、 +##。 +##〃 +##々 +##〇 +##〈 +##〉 +##《 +##》 +##「 +##」 +##『 +##』 +##【 +##】 +##〓 +##〔 +##〕 +##〖 +##〗 +##〜 +##〝 +##〞 +##ぃ +##ぇ +##ぬ +##ふ +##ほ +##む +##ゃ +##ゅ +##ゆ +##ょ +##゜ +##ゝ +##ァ +##ゥ +##エ +##ォ +##ケ +##サ +##セ +##ソ +##ッ +##ニ +##ヌ +##ネ +##ノ +##ヘ +##モ +##ャ +##ヤ +##ュ +##ユ +##ョ +##ヨ +##ワ +##ヲ +##・ +##ヽ +##ㄅ +##ㄆ +##ㄇ +##ㄉ +##ㄋ +##ㄌ +##ㄍ +##ㄎ +##ㄏ +##ㄒ +##ㄚ +##ㄛ +##ㄞ +##ㄟ +##ㄢ +##ㄤ +##ㄥ +##ㄧ +##ㄨ +##ㆍ +##㈦ +##㊣ +##㗎 +##一 +##丁 +##七 +##万 +##丈 +##三 +##上 +##下 +##不 +##与 +##丐 +##丑 +##专 +##且 +##丕 +##世 +##丘 +##丙 +##业 +##丛 +##东 +##丝 +##丞 +##丟 +##両 +##丢 +##两 +##严 +##並 +##丧 +##丨 +##个 +##丫 +##中 +##丰 +##串 +##临 +##丶 +##丸 +##丹 +##为 +##主 +##丼 +##丽 +##举 +##丿 +##乂 +##乃 +##久 +##么 +##义 +##之 +##乌 +##乍 +##乎 +##乏 +##乐 +##乒 +##乓 +##乔 +##乖 +##乗 +##乘 +##乙 +##乜 +##九 +##乞 +##也 +##习 +##乡 +##书 +##乩 +##买 +##乱 +##乳 +##乾 +##亀 +##亂 +##了 +##予 +##争 +##事 +##二 +##于 +##亏 +##云 +##互 +##五 +##井 +##亘 +##亙 +##亚 +##些 +##亜 +##亞 +##亟 +##亡 +##亢 +##交 +##亥 +##亦 +##产 +##亨 +##亩 +##享 +##京 +##亭 +##亮 +##亲 +##亳 +##亵 +##人 +##亿 +##什 +##仁 +##仃 +##仄 +##仅 +##仆 +##仇 +##今 +##介 +##仍 +##从 +##仏 +##仑 +##仓 +##仔 +##仕 +##他 +##仗 +##付 +##仙 +##仝 +##仞 +##仟 +##代 +##令 +##以 +##仨 +##仪 +##们 +##仮 +##仰 +##仲 +##件 +##价 +##任 +##份 +##仿 +##企 +##伉 +##伊 +##伍 +##伎 +##伏 +##伐 +##休 +##伕 +##众 +##优 +##伙 +##会 +##伝 +##伞 +##伟 +##传 +##伢 +##伤 +##伦 +##伪 +##伫 +##伯 +##估 +##伴 +##伶 +##伸 +##伺 +##似 +##伽 +##佃 +##但 +##佇 +##佈 +##位 +##低 +##住 +##佐 +##佑 +##体 +##佔 +##何 +##佗 +##佘 +##余 +##佚 +##佛 +##作 +##佝 +##佞 +##佟 +##你 +##佢 +##佣 +##佤 +##佥 +##佩 +##佬 +##佯 +##佰 +##佳 +##併 +##佶 +##佻 +##佼 +##使 +##侃 +##侄 +##來 +##侈 +##例 +##侍 +##侏 +##侑 +##侖 +##侗 +##供 +##依 +##侠 +##価 +##侣 +##侥 +##侦 +##侧 +##侨 +##侬 +##侮 +##侯 +##侵 +##侶 +##侷 +##便 +##係 +##促 +##俄 +##俊 +##俎 +##俏 +##俐 +##俑 +##俗 +##俘 +##俚 +##保 +##俞 +##俟 +##俠 +##信 +##俨 +##俩 +##俪 +##俬 +##俭 +##修 +##俯 +##俱 +##俳 +##俸 +##俺 +##俾 +##倆 +##倉 +##個 +##倌 +##倍 +##倏 +##們 +##倒 +##倔 +##倖 +##倘 +##候 +##倚 +##倜 +##借 +##倡 +##値 +##倦 +##倩 +##倪 +##倫 +##倬 +##倭 +##倶 +##债 +##值 +##倾 +##偃 +##假 +##偈 +##偉 +##偌 +##偎 +##偏 +##偕 +##做 +##停 +##健 +##側 +##偵 +##偶 +##偷 +##偻 +##偽 +##偿 +##傀 +##傅 +##傍 +##傑 +##傘 +##備 +##傚 +##傢 +##傣 +##傥 +##储 +##傩 +##催 +##傭 +##傲 +##傳 +##債 +##傷 +##傻 +##傾 +##僅 +##働 +##像 +##僑 +##僕 +##僖 +##僚 +##僥 +##僧 +##僭 +##僮 +##僱 +##僵 +##價 +##僻 +##儀 +##儂 +##億 +##儆 +##儉 +##儋 +##儒 +##儕 +##儘 +##償 +##儡 +##優 +##儲 +##儷 +##儼 +##儿 +##兀 +##允 +##元 +##兄 +##充 +##兆 +##兇 +##先 +##光 +##克 +##兌 +##免 +##児 +##兑 +##兒 +##兔 +##兖 +##党 +##兜 +##兢 +##入 +##內 +##全 +##兩 +##八 +##公 +##六 +##兮 +##兰 +##共 +##兲 +##关 +##兴 +##兵 +##其 +##具 +##典 +##兹 +##养 +##兼 +##兽 +##冀 +##内 +##円 +##冇 +##冈 +##冉 +##冊 +##册 +##再 +##冏 +##冒 +##冕 +##冗 +##写 +##军 +##农 +##冠 +##冢 +##冤 +##冥 +##冨 +##冪 +##冬 +##冯 +##冰 +##冲 +##决 +##况 +##冶 +##冷 +##冻 +##冼 +##冽 +##冾 +##净 +##凄 +##准 +##凇 +##凈 +##凉 +##凋 +##凌 +##凍 +##减 +##凑 +##凛 +##凜 +##凝 +##几 +##凡 +##凤 +##処 +##凪 +##凭 +##凯 +##凰 +##凱 +##凳 +##凶 +##凸 +##凹 +##出 +##击 +##函 +##凿 +##刀 +##刁 +##刃 +##分 +##切 +##刈 +##刊 +##刍 +##刎 +##刑 +##划 +##列 +##刘 +##则 +##刚 +##创 +##初 +##删 +##判 +##別 +##刨 +##利 +##刪 +##别 +##刮 +##到 +##制 +##刷 +##券 +##刹 +##刺 +##刻 +##刽 +##剁 +##剂 +##剃 +##則 +##剉 +##削 +##剋 +##剌 +##前 +##剎 +##剐 +##剑 +##剔 +##剖 +##剛 +##剜 +##剝 +##剣 +##剤 +##剥 +##剧 +##剩 +##剪 +##副 +##割 +##創 +##剷 +##剽 +##剿 +##劃 +##劇 +##劈 +##劉 +##劊 +##劍 +##劏 +##劑 +##力 +##劝 +##办 +##功 +##加 +##务 +##劣 +##动 +##助 +##努 +##劫 +##劭 +##励 +##劲 +##劳 +##労 +##劵 +##効 +##劾 +##势 +##勁 +##勃 +##勇 +##勉 +##勋 +##勐 +##勒 +##動 +##勖 +##勘 +##務 +##勛 +##勝 +##勞 +##募 +##勢 +##勤 +##勧 +##勳 +##勵 +##勸 +##勺 +##勻 +##勾 +##勿 +##匀 +##包 +##匆 +##匈 +##匍 +##匐 +##匕 +##化 +##北 +##匙 +##匝 +##匠 +##匡 +##匣 +##匪 +##匮 +##匯 +##匱 +##匹 +##区 +##医 +##匾 +##匿 +##區 +##十 +##千 +##卅 +##升 +##午 +##卉 +##半 +##卍 +##华 +##协 +##卑 +##卒 +##卓 +##協 +##单 +##卖 +##南 +##単 +##博 +##卜 +##卞 +##卟 +##占 +##卡 +##卢 +##卤 +##卦 +##卧 +##卫 +##卮 +##卯 +##印 +##危 +##即 +##却 +##卵 +##卷 +##卸 +##卻 +##卿 +##厂 +##厄 +##厅 +##历 +##厉 +##压 +##厌 +##厕 +##厘 +##厚 +##厝 +##原 +##厢 +##厥 +##厦 +##厨 +##厩 +##厭 +##厮 +##厲 +##厳 +##去 +##县 +##叁 +##参 +##參 +##又 +##叉 +##及 +##友 +##双 +##反 +##収 +##发 +##叔 +##取 +##受 +##变 +##叙 +##叛 +##叟 +##叠 +##叡 +##叢 +##口 +##古 +##句 +##另 +##叨 +##叩 +##只 +##叫 +##召 +##叭 +##叮 +##可 +##台 +##叱 +##史 +##右 +##叵 +##叶 +##号 +##司 +##叹 +##叻 +##叼 +##叽 +##吁 +##吃 +##各 +##吆 +##合 +##吉 +##吊 +##吋 +##同 +##名 +##后 +##吏 +##吐 +##向 +##吒 +##吓 +##吕 +##吖 +##吗 +##君 +##吝 +##吞 +##吟 +##吠 +##吡 +##否 +##吧 +##吨 +##吩 +##含 +##听 +##吭 +##吮 +##启 +##吱 +##吳 +##吴 +##吵 +##吶 +##吸 +##吹 +##吻 +##吼 +##吽 +##吾 +##呀 +##呂 +##呃 +##呆 +##呈 +##告 +##呋 +##呎 +##呐 +##呓 +##呕 +##呗 +##员 +##呛 +##呜 +##呢 +##呤 +##呦 +##周 +##呱 +##呲 +##味 +##呵 +##呷 +##呸 +##呻 +##呼 +##命 +##咀 +##咁 +##咂 +##咄 +##咆 +##咋 +##和 +##咎 +##咏 +##咐 +##咒 +##咔 +##咕 +##咖 +##咗 +##咘 +##咙 +##咚 +##咛 +##咣 +##咤 +##咦 +##咧 +##咨 +##咩 +##咪 +##咫 +##咬 +##咭 +##咯 +##咱 +##咲 +##咳 +##咸 +##咻 +##咽 +##咿 +##哀 +##品 +##哂 +##哄 +##哆 +##哇 +##哈 +##哉 +##哋 +##哌 +##响 +##哎 +##哏 +##哐 +##哑 +##哒 +##哔 +##哗 +##哟 +##員 +##哥 +##哦 +##哧 +##哨 +##哩 +##哪 +##哭 +##哮 +##哲 +##哺 +##哼 +##哽 +##唁 +##唄 +##唆 +##唇 +##唉 +##唏 +##唐 +##唑 +##唔 +##唠 +##唤 +##唧 +##唬 +##售 +##唯 +##唰 +##唱 +##唳 +##唷 +##唸 +##唾 +##啃 +##啄 +##商 +##啉 +##啊 +##問 +##啓 +##啕 +##啖 +##啜 +##啞 +##啟 +##啡 +##啤 +##啥 +##啦 +##啧 +##啪 +##啫 +##啬 +##啮 +##啰 +##啱 +##啲 +##啵 +##啶 +##啷 +##啸 +##啻 +##啼 +##啾 +##喀 +##喂 +##喃 +##善 +##喆 +##喇 +##喉 +##喊 +##喋 +##喎 +##喏 +##喔 +##喘 +##喙 +##喚 +##喜 +##喝 +##喟 +##喧 +##喪 +##喫 +##喬 +##單 +##喰 +##喱 +##喲 +##喳 +##喵 +##営 +##喷 +##喹 +##喺 +##喻 +##喽 +##嗅 +##嗆 +##嗇 +##嗎 +##嗑 +##嗒 +##嗓 +##嗔 +##嗖 +##嗚 +##嗜 +##嗝 +##嗟 +##嗡 +##嗣 +##嗤 +##嗦 +##嗨 +##嗪 +##嗬 +##嗯 +##嗰 +##嗲 +##嗳 +##嗶 +##嗷 +##嗽 +##嘀 +##嘅 +##嘆 +##嘈 +##嘉 +##嘌 +##嘍 +##嘎 +##嘔 +##嘖 +##嘗 +##嘘 +##嘚 +##嘛 +##嘜 +##嘞 +##嘟 +##嘢 +##嘣 +##嘤 +##嘧 +##嘩 +##嘭 +##嘮 +##嘯 +##嘰 +##嘱 +##嘲 +##嘴 +##嘶 +##嘸 +##嘹 +##嘻 +##嘿 +##噁 +##噌 +##噎 +##噓 +##噔 +##噗 +##噙 +##噜 +##噠 +##噢 +##噤 +##器 +##噩 +##噪 +##噬 +##噱 +##噴 +##噶 +##噸 +##噹 +##噻 +##噼 +##嚀 +##嚇 +##嚎 +##嚏 +##嚐 +##嚓 +##嚕 +##嚟 +##嚣 +##嚥 +##嚨 +##嚮 +##嚴 +##嚷 +##嚼 +##囂 +##囉 +##囊 +##囍 +##囑 +##囔 +##囗 +##囚 +##四 +##囝 +##回 +##囟 +##因 +##囡 +##团 +##団 +##囤 +##囧 +##囪 +##囫 +##园 +##困 +##囱 +##囲 +##図 +##围 +##囹 +##固 +##国 +##图 +##囿 +##圃 +##圄 +##圆 +##圈 +##國 +##圍 +##圏 +##園 +##圓 +##圖 +##團 +##圜 +##土 +##圣 +##圧 +##在 +##圩 +##圭 +##地 +##圳 +##场 +##圻 +##圾 +##址 +##坂 +##均 +##坊 +##坍 +##坎 +##坏 +##坐 +##坑 +##块 +##坚 +##坛 +##坝 +##坞 +##坟 +##坠 +##坡 +##坤 +##坦 +##坨 +##坪 +##坯 +##坳 +##坵 +##坷 +##垂 +##垃 +##垄 +##型 +##垒 +##垚 +##垛 +##垠 +##垢 +##垣 +##垦 +##垩 +##垫 +##垭 +##垮 +##垵 +##埂 +##埃 +##埋 +##城 +##埔 +##埕 +##埗 +##域 +##埠 +##埤 +##埵 +##執 +##埸 +##培 +##基 +##埼 +##堀 +##堂 +##堃 +##堅 +##堆 +##堇 +##堑 +##堕 +##堙 +##堡 +##堤 +##堪 +##堯 +##堰 +##報 +##場 +##堵 +##堺 +##堿 +##塊 +##塌 +##塑 +##塔 +##塗 +##塘 +##塚 +##塞 +##塢 +##塩 +##填 +##塬 +##塭 +##塵 +##塾 +##墀 +##境 +##墅 +##墉 +##墊 +##墒 +##墓 +##増 +##墘 +##墙 +##墜 +##增 +##墟 +##墨 +##墩 +##墮 +##墳 +##墻 +##墾 +##壁 +##壅 +##壆 +##壇 +##壊 +##壑 +##壓 +##壕 +##壘 +##壞 +##壟 +##壢 +##壤 +##壩 +##士 +##壬 +##壮 +##壯 +##声 +##売 +##壳 +##壶 +##壹 +##壺 +##壽 +##处 +##备 +##変 +##复 +##夏 +##夔 +##夕 +##外 +##夙 +##多 +##夜 +##够 +##夠 +##夢 +##夥 +##大 +##天 +##太 +##夫 +##夭 +##央 +##夯 +##失 +##头 +##夷 +##夸 +##夹 +##夺 +##夾 +##奂 +##奄 +##奇 +##奈 +##奉 +##奋 +##奎 +##奏 +##奐 +##契 +##奔 +##奕 +##奖 +##套 +##奘 +##奚 +##奠 +##奢 +##奥 +##奧 +##奪 +##奬 +##奮 +##女 +##奴 +##奶 +##奸 +##她 +##好 +##如 +##妃 +##妄 +##妆 +##妇 +##妈 +##妊 +##妍 +##妒 +##妓 +##妖 +##妘 +##妙 +##妝 +##妞 +##妣 +##妤 +##妥 +##妨 +##妩 +##妪 +##妮 +##妲 +##妳 +##妹 +##妻 +##妾 +##姆 +##姉 +##姊 +##始 +##姍 +##姐 +##姑 +##姒 +##姓 +##委 +##姗 +##姚 +##姜 +##姝 +##姣 +##姥 +##姦 +##姨 +##姪 +##姫 +##姬 +##姹 +##姻 +##姿 +##威 +##娃 +##娄 +##娅 +##娆 +##娇 +##娉 +##娑 +##娓 +##娘 +##娛 +##娜 +##娟 +##娠 +##娣 +##娥 +##娩 +##娱 +##娲 +##娴 +##娶 +##娼 +##婀 +##婁 +##婆 +##婉 +##婊 +##婕 +##婚 +##婢 +##婦 +##婧 +##婪 +##婭 +##婴 +##婵 +##婶 +##婷 +##婺 +##婿 +##媒 +##媚 +##媛 +##媞 +##媧 +##媲 +##媳 +##媽 +##媾 +##嫁 +##嫂 +##嫉 +##嫌 +##嫑 +##嫔 +##嫖 +##嫘 +##嫚 +##嫡 +##嫣 +##嫦 +##嫩 +##嫲 +##嫵 +##嫻 +##嬅 +##嬉 +##嬌 +##嬗 +##嬛 +##嬢 +##嬤 +##嬪 +##嬰 +##嬴 +##嬷 +##嬸 +##嬿 +##孀 +##孃 +##子 +##孑 +##孔 +##孕 +##孖 +##字 +##存 +##孙 +##孚 +##孛 +##孜 +##孝 +##孟 +##孢 +##季 +##孤 +##学 +##孩 +##孪 +##孫 +##孬 +##孰 +##孱 +##孳 +##孵 +##學 +##孺 +##孽 +##孿 +##宁 +##它 +##宅 +##宇 +##守 +##安 +##宋 +##完 +##宏 +##宓 +##宕 +##宗 +##官 +##宙 +##定 +##宛 +##宜 +##宝 +##实 +##実 +##宠 +##审 +##客 +##宣 +##室 +##宥 +##宦 +##宪 +##宫 +##宮 +##宰 +##害 +##宴 +##宵 +##家 +##宸 +##容 +##宽 +##宾 +##宿 +##寂 +##寄 +##寅 +##密 +##寇 +##富 +##寐 +##寒 +##寓 +##寛 +##寝 +##寞 +##察 +##寡 +##寢 +##寥 +##實 +##寧 +##寨 +##審 +##寫 +##寬 +##寮 +##寰 +##寵 +##寶 +##寸 +##对 +##寺 +##寻 +##导 +##対 +##寿 +##封 +##専 +##射 +##将 +##將 +##專 +##尉 +##尊 +##尋 +##對 +##導 +##小 +##少 +##尔 +##尕 +##尖 +##尘 +##尚 +##尝 +##尤 +##尧 +##尬 +##就 +##尴 +##尷 +##尸 +##尹 +##尺 +##尻 +##尼 +##尽 +##尾 +##尿 +##局 +##屁 +##层 +##屄 +##居 +##屆 +##屈 +##屉 +##届 +##屋 +##屌 +##屍 +##屎 +##屏 +##屐 +##屑 +##展 +##屜 +##属 +##屠 +##屡 +##屢 +##層 +##履 +##屬 +##屯 +##山 +##屹 +##屿 +##岀 +##岁 +##岂 +##岌 +##岐 +##岑 +##岔 +##岖 +##岗 +##岘 +##岙 +##岚 +##岛 +##岡 +##岩 +##岫 +##岬 +##岭 +##岱 +##岳 +##岷 +##岸 +##峇 +##峋 +##峒 +##峙 +##峡 +##峤 +##峥 +##峦 +##峨 +##峪 +##峭 +##峯 +##峰 +##峴 +##島 +##峻 +##峽 +##崁 +##崂 +##崆 +##崇 +##崎 +##崑 +##崔 +##崖 +##崗 +##崙 +##崛 +##崧 +##崩 +##崭 +##崴 +##崽 +##嵇 +##嵊 +##嵋 +##嵌 +##嵐 +##嵘 +##嵩 +##嵬 +##嵯 +##嶂 +##嶄 +##嶇 +##嶋 +##嶙 +##嶺 +##嶼 +##嶽 +##巅 +##巍 +##巒 +##巔 +##巖 +##川 +##州 +##巡 +##巢 +##工 +##左 +##巧 +##巨 +##巩 +##巫 +##差 +##己 +##已 +##巳 +##巴 +##巷 +##巻 +##巽 +##巾 +##巿 +##币 +##市 +##布 +##帅 +##帆 +##师 +##希 +##帐 +##帑 +##帕 +##帖 +##帘 +##帚 +##帛 +##帜 +##帝 +##帥 +##带 +##帧 +##師 +##席 +##帮 +##帯 +##帰 +##帳 +##帶 +##帷 +##常 +##帼 +##帽 +##幀 +##幂 +##幄 +##幅 +##幌 +##幔 +##幕 +##幟 +##幡 +##幢 +##幣 +##幫 +##干 +##平 +##年 +##并 +##幸 +##幹 +##幺 +##幻 +##幼 +##幽 +##幾 +##广 +##庁 +##広 +##庄 +##庆 +##庇 +##床 +##序 +##庐 +##库 +##应 +##底 +##庖 +##店 +##庙 +##庚 +##府 +##庞 +##废 +##庠 +##度 +##座 +##庫 +##庭 +##庵 +##庶 +##康 +##庸 +##庹 +##庾 +##廁 +##廂 +##廃 +##廈 +##廉 +##廊 +##廓 +##廖 +##廚 +##廝 +##廟 +##廠 +##廢 +##廣 +##廬 +##廳 +##延 +##廷 +##建 +##廿 +##开 +##弁 +##异 +##弃 +##弄 +##弈 +##弊 +##弋 +##式 +##弑 +##弒 +##弓 +##弔 +##引 +##弗 +##弘 +##弛 +##弟 +##张 +##弥 +##弦 +##弧 +##弩 +##弭 +##弯 +##弱 +##張 +##強 +##弹 +##强 +##弼 +##弾 +##彅 +##彆 +##彈 +##彌 +##彎 +##归 +##当 +##录 +##彗 +##彙 +##彝 +##形 +##彤 +##彥 +##彦 +##彧 +##彩 +##彪 +##彫 +##彬 +##彭 +##彰 +##影 +##彷 +##役 +##彻 +##彼 +##彿 +##往 +##征 +##径 +##待 +##徇 +##很 +##徉 +##徊 +##律 +##後 +##徐 +##徑 +##徒 +##従 +##徕 +##得 +##徘 +##徙 +##徜 +##從 +##徠 +##御 +##徨 +##復 +##循 +##徬 +##微 +##徳 +##徴 +##徵 +##德 +##徹 +##徼 +##徽 +##心 +##必 +##忆 +##忌 +##忍 +##忏 +##忐 +##忑 +##忒 +##忖 +##志 +##忘 +##忙 +##応 +##忠 +##忡 +##忤 +##忧 +##忪 +##快 +##忱 +##念 +##忻 +##忽 +##忿 +##怀 +##态 +##怂 +##怅 +##怆 +##怎 +##怏 +##怒 +##怔 +##怕 +##怖 +##怙 +##怜 +##思 +##怠 +##怡 +##急 +##怦 +##性 +##怨 +##怪 +##怯 +##怵 +##总 +##怼 +##恁 +##恃 +##恆 +##恋 +##恍 +##恐 +##恒 +##恕 +##恙 +##恚 +##恢 +##恣 +##恤 +##恥 +##恨 +##恩 +##恪 +##恫 +##恬 +##恭 +##息 +##恰 +##恳 +##恵 +##恶 +##恸 +##恺 +##恻 +##恼 +##恿 +##悄 +##悅 +##悉 +##悌 +##悍 +##悔 +##悖 +##悚 +##悟 +##悠 +##患 +##悦 +##您 +##悩 +##悪 +##悬 +##悯 +##悱 +##悲 +##悴 +##悵 +##悶 +##悸 +##悻 +##悼 +##悽 +##情 +##惆 +##惇 +##惊 +##惋 +##惑 +##惕 +##惘 +##惚 +##惜 +##惟 +##惠 +##惡 +##惦 +##惧 +##惨 +##惩 +##惫 +##惬 +##惭 +##惮 +##惯 +##惰 +##惱 +##想 +##惴 +##惶 +##惹 +##惺 +##愁 +##愆 +##愈 +##愉 +##愍 +##意 +##愕 +##愚 +##愛 +##愜 +##感 +##愣 +##愤 +##愧 +##愫 +##愷 +##愿 +##慄 +##慈 +##態 +##慌 +##慎 +##慑 +##慕 +##慘 +##慚 +##慟 +##慢 +##慣 +##慧 +##慨 +##慫 +##慮 +##慰 +##慳 +##慵 +##慶 +##慷 +##慾 +##憂 +##憊 +##憋 +##憎 +##憐 +##憑 +##憔 +##憚 +##憤 +##憧 +##憨 +##憩 +##憫 +##憬 +##憲 +##憶 +##憾 +##懂 +##懇 +##懈 +##應 +##懊 +##懋 +##懑 +##懒 +##懦 +##懲 +##懵 +##懶 +##懷 +##懸 +##懺 +##懼 +##懾 +##懿 +##戀 +##戈 +##戊 +##戌 +##戍 +##戎 +##戏 +##成 +##我 +##戒 +##戕 +##或 +##战 +##戚 +##戛 +##戟 +##戡 +##戦 +##截 +##戬 +##戮 +##戰 +##戲 +##戳 +##戴 +##戶 +##户 +##戸 +##戻 +##戾 +##房 +##所 +##扁 +##扇 +##扈 +##扉 +##手 +##才 +##扎 +##扑 +##扒 +##打 +##扔 +##払 +##托 +##扛 +##扣 +##扦 +##执 +##扩 +##扪 +##扫 +##扬 +##扭 +##扮 +##扯 +##扰 +##扱 +##扳 +##扶 +##批 +##扼 +##找 +##承 +##技 +##抄 +##抉 +##把 +##抑 +##抒 +##抓 +##投 +##抖 +##抗 +##折 +##抚 +##抛 +##抜 +##択 +##抟 +##抠 +##抡 +##抢 +##护 +##报 +##抨 +##披 +##抬 +##抱 +##抵 +##抹 +##押 +##抽 +##抿 +##拂 +##拄 +##担 +##拆 +##拇 +##拈 +##拉 +##拋 +##拌 +##拍 +##拎 +##拐 +##拒 +##拓 +##拔 +##拖 +##拗 +##拘 +##拙 +##拚 +##招 +##拜 +##拟 +##拡 +##拢 +##拣 +##拥 +##拦 +##拧 +##拨 +##择 +##括 +##拭 +##拮 +##拯 +##拱 +##拳 +##拴 +##拷 +##拼 +##拽 +##拾 +##拿 +##持 +##挂 +##指 +##挈 +##按 +##挎 +##挑 +##挖 +##挙 +##挚 +##挛 +##挝 +##挞 +##挟 +##挠 +##挡 +##挣 +##挤 +##挥 +##挨 +##挪 +##挫 +##振 +##挲 +##挹 +##挺 +##挽 +##挾 +##捂 +##捅 +##捆 +##捉 +##捋 +##捌 +##捍 +##捎 +##捏 +##捐 +##捕 +##捞 +##损 +##捡 +##换 +##捣 +##捧 +##捨 +##捩 +##据 +##捱 +##捲 +##捶 +##捷 +##捺 +##捻 +##掀 +##掂 +##掃 +##掇 +##授 +##掉 +##掌 +##掏 +##掐 +##排 +##掖 +##掘 +##掙 +##掛 +##掠 +##採 +##探 +##掣 +##接 +##控 +##推 +##掩 +##措 +##掬 +##掰 +##掲 +##掳 +##掴 +##掷 +##掸 +##掺 +##揀 +##揃 +##揄 +##揆 +##揉 +##揍 +##描 +##提 +##插 +##揖 +##揚 +##換 +##握 +##揣 +##揩 +##揪 +##揭 +##揮 +##援 +##揶 +##揸 +##揹 +##揽 +##搀 +##搁 +##搂 +##搅 +##損 +##搏 +##搐 +##搓 +##搔 +##搖 +##搗 +##搜 +##搞 +##搡 +##搪 +##搬 +##搭 +##搵 +##搶 +##携 +##搽 +##摀 +##摁 +##摄 +##摆 +##摇 +##摈 +##摊 +##摒 +##摔 +##摘 +##摞 +##摟 +##摧 +##摩 +##摯 +##摳 +##摸 +##摹 +##摺 +##摻 +##撂 +##撃 +##撅 +##撇 +##撈 +##撐 +##撑 +##撒 +##撓 +##撕 +##撚 +##撞 +##撤 +##撥 +##撩 +##撫 +##撬 +##播 +##撮 +##撰 +##撲 +##撵 +##撷 +##撸 +##撻 +##撼 +##撿 +##擀 +##擁 +##擂 +##擄 +##擅 +##擇 +##擊 +##擋 +##操 +##擎 +##擒 +##擔 +##擘 +##據 +##擞 +##擠 +##擡 +##擢 +##擦 +##擬 +##擰 +##擱 +##擲 +##擴 +##擷 +##擺 +##擼 +##擾 +##攀 +##攏 +##攒 +##攔 +##攘 +##攙 +##攜 +##攝 +##攞 +##攢 +##攣 +##攤 +##攥 +##攪 +##攫 +##攬 +##支 +##收 +##攸 +##改 +##攻 +##放 +##政 +##故 +##效 +##敌 +##敍 +##敎 +##敏 +##救 +##敕 +##敖 +##敗 +##敘 +##教 +##敛 +##敝 +##敞 +##敢 +##散 +##敦 +##敬 +##数 +##敲 +##整 +##敵 +##敷 +##數 +##斂 +##斃 +##文 +##斋 +##斌 +##斎 +##斐 +##斑 +##斓 +##斗 +##料 +##斛 +##斜 +##斟 +##斡 +##斤 +##斥 +##斧 +##斩 +##斫 +##斬 +##断 +##斯 +##新 +##斷 +##方 +##於 +##施 +##旁 +##旃 +##旅 +##旋 +##旌 +##旎 +##族 +##旖 +##旗 +##无 +##既 +##日 +##旦 +##旧 +##旨 +##早 +##旬 +##旭 +##旮 +##旱 +##时 +##旷 +##旺 +##旻 +##昀 +##昂 +##昆 +##昇 +##昉 +##昊 +##昌 +##明 +##昏 +##易 +##昔 +##昕 +##昙 +##星 +##映 +##春 +##昧 +##昨 +##昭 +##是 +##昱 +##昴 +##昵 +##昶 +##昼 +##显 +##晁 +##時 +##晃 +##晉 +##晋 +##晌 +##晏 +##晒 +##晓 +##晔 +##晕 +##晖 +##晗 +##晚 +##晝 +##晞 +##晟 +##晤 +##晦 +##晨 +##晩 +##普 +##景 +##晰 +##晴 +##晶 +##晷 +##智 +##晾 +##暂 +##暄 +##暇 +##暈 +##暉 +##暌 +##暐 +##暑 +##暖 +##暗 +##暝 +##暢 +##暧 +##暨 +##暫 +##暮 +##暱 +##暴 +##暸 +##暹 +##曄 +##曆 +##曇 +##曉 +##曖 +##曙 +##曜 +##曝 +##曠 +##曦 +##曬 +##曰 +##曲 +##曳 +##更 +##書 +##曹 +##曼 +##曾 +##替 +##最 +##會 +##月 +##有 +##朋 +##服 +##朐 +##朔 +##朕 +##朗 +##望 +##朝 +##期 +##朦 +##朧 +##木 +##未 +##末 +##本 +##札 +##朮 +##术 +##朱 +##朴 +##朵 +##机 +##朽 +##杀 +##杂 +##权 +##杆 +##杈 +##杉 +##李 +##杏 +##材 +##村 +##杓 +##杖 +##杜 +##杞 +##束 +##杠 +##条 +##来 +##杨 +##杭 +##杯 +##杰 +##東 +##杳 +##杵 +##杷 +##杼 +##松 +##板 +##极 +##构 +##枇 +##枉 +##枋 +##析 +##枕 +##林 +##枚 +##果 +##枝 +##枢 +##枣 +##枪 +##枫 +##枭 +##枯 +##枰 +##枱 +##枳 +##架 +##枷 +##枸 +##柄 +##柏 +##某 +##柑 +##柒 +##染 +##柔 +##柘 +##柚 +##柜 +##柞 +##柠 +##柢 +##查 +##柩 +##柬 +##柯 +##柱 +##柳 +##柴 +##柵 +##査 +##柿 +##栀 +##栃 +##栄 +##栅 +##标 +##栈 +##栉 +##栋 +##栎 +##栏 +##树 +##栓 +##栖 +##栗 +##校 +##栩 +##株 +##样 +##核 +##根 +##格 +##栽 +##栾 +##桀 +##桁 +##桂 +##桃 +##桅 +##框 +##案 +##桉 +##桌 +##桎 +##桐 +##桑 +##桓 +##桔 +##桜 +##桠 +##桡 +##桢 +##档 +##桥 +##桦 +##桧 +##桨 +##桩 +##桶 +##桿 +##梁 +##梅 +##梆 +##梏 +##梓 +##梗 +##條 +##梟 +##梢 +##梦 +##梧 +##梨 +##梭 +##梯 +##械 +##梳 +##梵 +##梶 +##检 +##棂 +##棄 +##棉 +##棋 +##棍 +##棒 +##棕 +##棗 +##棘 +##棚 +##棟 +##棠 +##棣 +##棧 +##森 +##棱 +##棲 +##棵 +##棹 +##棺 +##椁 +##椅 +##椋 +##植 +##椎 +##椒 +##検 +##椪 +##椭 +##椰 +##椹 +##椽 +##椿 +##楂 +##楊 +##楓 +##楔 +##楚 +##楝 +##楞 +##楠 +##楣 +##楨 +##楫 +##業 +##楮 +##極 +##楷 +##楸 +##楹 +##楼 +##楽 +##概 +##榄 +##榆 +##榈 +##榉 +##榔 +##榕 +##榖 +##榛 +##榜 +##榨 +##榫 +##榭 +##榮 +##榱 +##榴 +##榷 +##榻 +##槁 +##槃 +##構 +##槌 +##槍 +##槎 +##槐 +##槓 +##様 +##槛 +##槟 +##槤 +##槭 +##槲 +##槳 +##槻 +##槽 +##槿 +##樁 +##樂 +##樊 +##樑 +##樓 +##標 +##樞 +##樟 +##模 +##樣 +##権 +##横 +##樫 +##樯 +##樱 +##樵 +##樸 +##樹 +##樺 +##樽 +##樾 +##橄 +##橇 +##橋 +##橐 +##橘 +##橙 +##機 +##橡 +##橢 +##橫 +##橱 +##橹 +##橼 +##檀 +##檄 +##檎 +##檐 +##檔 +##檗 +##檜 +##檢 +##檬 +##檯 +##檳 +##檸 +##檻 +##櫃 +##櫚 +##櫛 +##櫥 +##櫸 +##櫻 +##欄 +##權 +##欒 +##欖 +##欠 +##次 +##欢 +##欣 +##欧 +##欲 +##欸 +##欺 +##欽 +##款 +##歆 +##歇 +##歉 +##歌 +##歎 +##歐 +##歓 +##歙 +##歛 +##歡 +##止 +##正 +##此 +##步 +##武 +##歧 +##歩 +##歪 +##歯 +##歲 +##歳 +##歴 +##歷 +##歸 +##歹 +##死 +##歼 +##殁 +##殃 +##殆 +##殇 +##殉 +##殊 +##残 +##殒 +##殓 +##殖 +##殘 +##殞 +##殡 +##殤 +##殭 +##殯 +##殲 +##殴 +##段 +##殷 +##殺 +##殼 +##殿 +##毀 +##毁 +##毂 +##毅 +##毆 +##毋 +##母 +##毎 +##每 +##毒 +##毓 +##比 +##毕 +##毗 +##毘 +##毙 +##毛 +##毡 +##毫 +##毯 +##毽 +##氈 +##氏 +##氐 +##民 +##氓 +##气 +##氖 +##気 +##氙 +##氛 +##氟 +##氡 +##氢 +##氣 +##氤 +##氦 +##氧 +##氨 +##氪 +##氫 +##氮 +##氯 +##氰 +##氲 +##水 +##氷 +##永 +##氹 +##氾 +##汀 +##汁 +##求 +##汆 +##汇 +##汉 +##汎 +##汐 +##汕 +##汗 +##汙 +##汛 +##汝 +##汞 +##江 +##池 +##污 +##汤 +##汨 +##汩 +##汪 +##汰 +##汲 +##汴 +##汶 +##汹 +##決 +##汽 +##汾 +##沁 +##沂 +##沃 +##沅 +##沈 +##沉 +##沌 +##沏 +##沐 +##沒 +##沓 +##沖 +##沙 +##沛 +##沟 +##没 +##沢 +##沣 +##沥 +##沦 +##沧 +##沪 +##沫 +##沭 +##沮 +##沱 +##河 +##沸 +##油 +##治 +##沼 +##沽 +##沾 +##沿 +##況 +##泄 +##泉 +##泊 +##泌 +##泓 +##法 +##泗 +##泛 +##泞 +##泠 +##泡 +##波 +##泣 +##泥 +##注 +##泪 +##泫 +##泮 +##泯 +##泰 +##泱 +##泳 +##泵 +##泷 +##泸 +##泻 +##泼 +##泽 +##泾 +##洁 +##洄 +##洋 +##洒 +##洗 +##洙 +##洛 +##洞 +##津 +##洩 +##洪 +##洮 +##洱 +##洲 +##洵 +##洶 +##洸 +##洹 +##活 +##洼 +##洽 +##派 +##流 +##浃 +##浄 +##浅 +##浆 +##浇 +##浊 +##测 +##济 +##浏 +##浑 +##浒 +##浓 +##浔 +##浙 +##浚 +##浜 +##浣 +##浦 +##浩 +##浪 +##浬 +##浮 +##浯 +##浴 +##海 +##浸 +##涂 +##涅 +##涇 +##消 +##涉 +##涌 +##涎 +##涓 +##涔 +##涕 +##涙 +##涛 +##涝 +##涞 +##涟 +##涠 +##涡 +##涣 +##涤 +##润 +##涧 +##涨 +##涩 +##涪 +##涮 +##涯 +##液 +##涵 +##涸 +##涼 +##涿 +##淀 +##淄 +##淅 +##淆 +##淇 +##淋 +##淌 +##淑 +##淒 +##淖 +##淘 +##淙 +##淚 +##淞 +##淡 +##淤 +##淦 +##淨 +##淩 +##淪 +##淫 +##淬 +##淮 +##深 +##淳 +##淵 +##混 +##淹 +##淺 +##添 +##淼 +##清 +##済 +##渉 +##渊 +##渋 +##渍 +##渎 +##渐 +##渔 +##渗 +##渙 +##渚 +##減 +##渝 +##渠 +##渡 +##渣 +##渤 +##渥 +##渦 +##温 +##測 +##渭 +##港 +##渲 +##渴 +##游 +##渺 +##渾 +##湃 +##湄 +##湊 +##湍 +##湖 +##湘 +##湛 +##湟 +##湧 +##湫 +##湮 +##湯 +##湳 +##湾 +##湿 +##満 +##溃 +##溅 +##溉 +##溏 +##源 +##準 +##溜 +##溝 +##溟 +##溢 +##溥 +##溧 +##溪 +##溫 +##溯 +##溱 +##溴 +##溶 +##溺 +##溼 +##滁 +##滂 +##滄 +##滅 +##滇 +##滋 +##滌 +##滑 +##滓 +##滔 +##滕 +##滙 +##滚 +##滝 +##滞 +##滟 +##满 +##滢 +##滤 +##滥 +##滦 +##滨 +##滩 +##滬 +##滯 +##滲 +##滴 +##滷 +##滸 +##滾 +##滿 +##漁 +##漂 +##漆 +##漉 +##漏 +##漓 +##演 +##漕 +##漠 +##漢 +##漣 +##漩 +##漪 +##漫 +##漬 +##漯 +##漱 +##漲 +##漳 +##漸 +##漾 +##漿 +##潆 +##潇 +##潋 +##潍 +##潑 +##潔 +##潘 +##潛 +##潜 +##潞 +##潟 +##潢 +##潤 +##潦 +##潧 +##潭 +##潮 +##潰 +##潴 +##潸 +##潺 +##潼 +##澀 +##澄 +##澆 +##澈 +##澍 +##澎 +##澗 +##澜 +##澡 +##澤 +##澧 +##澱 +##澳 +##澹 +##激 +##濁 +##濂 +##濃 +##濑 +##濒 +##濕 +##濘 +##濛 +##濟 +##濠 +##濡 +##濤 +##濫 +##濬 +##濮 +##濯 +##濱 +##濺 +##濾 +##瀅 +##瀆 +##瀉 +##瀋 +##瀏 +##瀑 +##瀕 +##瀘 +##瀚 +##瀛 +##瀝 +##瀞 +##瀟 +##瀧 +##瀨 +##瀬 +##瀰 +##瀾 +##灌 +##灏 +##灑 +##灘 +##灝 +##灞 +##灣 +##火 +##灬 +##灭 +##灯 +##灰 +##灵 +##灶 +##灸 +##灼 +##災 +##灾 +##灿 +##炀 +##炁 +##炅 +##炉 +##炊 +##炎 +##炒 +##炔 +##炕 +##炖 +##炙 +##炜 +##炫 +##炬 +##炭 +##炮 +##炯 +##炳 +##炷 +##炸 +##点 +##為 +##炼 +##炽 +##烁 +##烂 +##烃 +##烈 +##烊 +##烏 +##烘 +##烙 +##烛 +##烟 +##烤 +##烦 +##烧 +##烨 +##烩 +##烫 +##烬 +##热 +##烯 +##烷 +##烹 +##烽 +##焉 +##焊 +##焕 +##焖 +##焗 +##焘 +##焙 +##焚 +##焜 +##無 +##焦 +##焯 +##焰 +##焱 +##然 +##焼 +##煅 +##煉 +##煊 +##煌 +##煎 +##煒 +##煖 +##煙 +##煜 +##煞 +##煤 +##煥 +##煦 +##照 +##煨 +##煩 +##煮 +##煲 +##煸 +##煽 +##熄 +##熊 +##熏 +##熒 +##熔 +##熙 +##熟 +##熠 +##熨 +##熬 +##熱 +##熵 +##熹 +##熾 +##燁 +##燃 +##燄 +##燈 +##燉 +##燊 +##燎 +##燒 +##燔 +##燕 +##燙 +##燜 +##營 +##燥 +##燦 +##燧 +##燭 +##燮 +##燴 +##燻 +##燼 +##燿 +##爆 +##爍 +##爐 +##爛 +##爪 +##爬 +##爭 +##爰 +##爱 +##爲 +##爵 +##父 +##爷 +##爸 +##爹 +##爺 +##爻 +##爽 +##爾 +##牆 +##片 +##版 +##牌 +##牍 +##牒 +##牙 +##牛 +##牝 +##牟 +##牠 +##牡 +##牢 +##牦 +##牧 +##物 +##牯 +##牲 +##牴 +##牵 +##特 +##牺 +##牽 +##犀 +##犁 +##犄 +##犊 +##犍 +##犒 +##犢 +##犧 +##犬 +##犯 +##状 +##犷 +##犸 +##犹 +##狀 +##狂 +##狄 +##狈 +##狎 +##狐 +##狒 +##狗 +##狙 +##狞 +##狠 +##狡 +##狩 +##独 +##狭 +##狮 +##狰 +##狱 +##狸 +##狹 +##狼 +##狽 +##猎 +##猕 +##猖 +##猗 +##猙 +##猛 +##猜 +##猝 +##猥 +##猩 +##猪 +##猫 +##猬 +##献 +##猴 +##猶 +##猷 +##猾 +##猿 +##獄 +##獅 +##獎 +##獐 +##獒 +##獗 +##獠 +##獣 +##獨 +##獭 +##獰 +##獲 +##獵 +##獷 +##獸 +##獺 +##獻 +##獼 +##獾 +##玄 +##率 +##玉 +##王 +##玑 +##玖 +##玛 +##玟 +##玠 +##玥 +##玩 +##玫 +##玮 +##环 +##现 +##玲 +##玳 +##玷 +##玺 +##玻 +##珀 +##珂 +##珅 +##珈 +##珉 +##珊 +##珍 +##珏 +##珐 +##珑 +##珙 +##珞 +##珠 +##珣 +##珥 +##珩 +##珪 +##班 +##珮 +##珲 +##珺 +##現 +##球 +##琅 +##理 +##琇 +##琉 +##琊 +##琍 +##琏 +##琐 +##琛 +##琢 +##琥 +##琦 +##琨 +##琪 +##琬 +##琮 +##琰 +##琲 +##琳 +##琴 +##琵 +##琶 +##琺 +##琼 +##瑀 +##瑁 +##瑄 +##瑋 +##瑕 +##瑗 +##瑙 +##瑚 +##瑛 +##瑜 +##瑞 +##瑟 +##瑠 +##瑣 +##瑤 +##瑩 +##瑪 +##瑯 +##瑰 +##瑶 +##瑾 +##璀 +##璁 +##璃 +##璇 +##璉 +##璋 +##璎 +##璐 +##璜 +##璞 +##璟 +##璧 +##璨 +##環 +##璽 +##璿 +##瓊 +##瓏 +##瓒 +##瓜 +##瓢 +##瓣 +##瓤 +##瓦 +##瓮 +##瓯 +##瓴 +##瓶 +##瓷 +##甄 +##甌 +##甕 +##甘 +##甙 +##甚 +##甜 +##生 +##產 +##産 +##甥 +##甦 +##用 +##甩 +##甫 +##甬 +##甭 +##甯 +##田 +##由 +##甲 +##申 +##电 +##男 +##甸 +##町 +##画 +##甾 +##畀 +##畅 +##界 +##畏 +##畑 +##畔 +##留 +##畜 +##畝 +##畢 +##略 +##畦 +##番 +##畫 +##異 +##畲 +##畳 +##畴 +##當 +##畸 +##畹 +##畿 +##疆 +##疇 +##疊 +##疏 +##疑 +##疔 +##疖 +##疗 +##疙 +##疚 +##疝 +##疟 +##疡 +##疣 +##疤 +##疥 +##疫 +##疮 +##疯 +##疱 +##疲 +##疳 +##疵 +##疸 +##疹 +##疼 +##疽 +##疾 +##痂 +##病 +##症 +##痈 +##痉 +##痊 +##痍 +##痒 +##痔 +##痕 +##痘 +##痙 +##痛 +##痞 +##痠 +##痢 +##痣 +##痤 +##痧 +##痨 +##痪 +##痫 +##痰 +##痱 +##痴 +##痹 +##痺 +##痼 +##痿 +##瘀 +##瘁 +##瘋 +##瘍 +##瘓 +##瘘 +##瘙 +##瘟 +##瘠 +##瘡 +##瘢 +##瘤 +##瘦 +##瘧 +##瘩 +##瘪 +##瘫 +##瘴 +##瘸 +##瘾 +##療 +##癇 +##癌 +##癒 +##癖 +##癜 +##癞 +##癡 +##癢 +##癣 +##癥 +##癫 +##癬 +##癮 +##癱 +##癲 +##癸 +##発 +##登 +##發 +##白 +##百 +##皂 +##的 +##皆 +##皇 +##皈 +##皋 +##皎 +##皑 +##皓 +##皖 +##皙 +##皚 +##皮 +##皰 +##皱 +##皴 +##皺 +##皿 +##盂 +##盃 +##盅 +##盆 +##盈 +##益 +##盎 +##盏 +##盐 +##监 +##盒 +##盔 +##盖 +##盗 +##盘 +##盛 +##盜 +##盞 +##盟 +##盡 +##監 +##盤 +##盥 +##盧 +##盪 +##目 +##盯 +##盱 +##盲 +##直 +##相 +##盹 +##盼 +##盾 +##省 +##眈 +##眉 +##看 +##県 +##眙 +##眞 +##真 +##眠 +##眦 +##眨 +##眩 +##眯 +##眶 +##眷 +##眸 +##眺 +##眼 +##眾 +##着 +##睁 +##睇 +##睏 +##睐 +##睑 +##睛 +##睜 +##睞 +##睡 +##睢 +##督 +##睥 +##睦 +##睨 +##睪 +##睫 +##睬 +##睹 +##睽 +##睾 +##睿 +##瞄 +##瞅 +##瞇 +##瞋 +##瞌 +##瞎 +##瞑 +##瞒 +##瞓 +##瞞 +##瞟 +##瞠 +##瞥 +##瞧 +##瞩 +##瞪 +##瞬 +##瞭 +##瞰 +##瞳 +##瞻 +##瞼 +##瞿 +##矇 +##矍 +##矗 +##矚 +##矛 +##矜 +##矢 +##矣 +##知 +##矩 +##矫 +##短 +##矮 +##矯 +##石 +##矶 +##矽 +##矾 +##矿 +##码 +##砂 +##砌 +##砍 +##砒 +##研 +##砖 +##砗 +##砚 +##砝 +##砣 +##砥 +##砧 +##砭 +##砰 +##砲 +##破 +##砷 +##砸 +##砺 +##砼 +##砾 +##础 +##硅 +##硐 +##硒 +##硕 +##硝 +##硫 +##硬 +##确 +##硯 +##硼 +##碁 +##碇 +##碉 +##碌 +##碍 +##碎 +##碑 +##碓 +##碗 +##碘 +##碚 +##碛 +##碟 +##碣 +##碧 +##碩 +##碰 +##碱 +##碳 +##碴 +##確 +##碼 +##碾 +##磁 +##磅 +##磊 +##磋 +##磐 +##磕 +##磚 +##磡 +##磨 +##磬 +##磯 +##磲 +##磷 +##磺 +##礁 +##礎 +##礙 +##礡 +##礦 +##礪 +##礫 +##礴 +##示 +##礼 +##社 +##祀 +##祁 +##祂 +##祇 +##祈 +##祉 +##祎 +##祐 +##祕 +##祖 +##祗 +##祚 +##祛 +##祜 +##祝 +##神 +##祟 +##祠 +##祢 +##祥 +##票 +##祭 +##祯 +##祷 +##祸 +##祺 +##祿 +##禀 +##禁 +##禄 +##禅 +##禍 +##禎 +##福 +##禛 +##禦 +##禧 +##禪 +##禮 +##禱 +##禹 +##禺 +##离 +##禽 +##禾 +##禿 +##秀 +##私 +##秃 +##秆 +##秉 +##秋 +##种 +##科 +##秒 +##秘 +##租 +##秣 +##秤 +##秦 +##秧 +##秩 +##秭 +##积 +##称 +##秸 +##移 +##秽 +##稀 +##稅 +##程 +##稍 +##税 +##稔 +##稗 +##稚 +##稜 +##稞 +##稟 +##稠 +##稣 +##種 +##稱 +##稲 +##稳 +##稷 +##稹 +##稻 +##稼 +##稽 +##稿 +##穀 +##穂 +##穆 +##穌 +##積 +##穎 +##穗 +##穢 +##穩 +##穫 +##穴 +##究 +##穷 +##穹 +##空 +##穿 +##突 +##窃 +##窄 +##窈 +##窍 +##窑 +##窒 +##窓 +##窕 +##窖 +##窗 +##窘 +##窜 +##窝 +##窟 +##窠 +##窥 +##窦 +##窨 +##窩 +##窪 +##窮 +##窯 +##窺 +##窿 +##竄 +##竅 +##竇 +##竊 +##立 +##竖 +##站 +##竜 +##竞 +##竟 +##章 +##竣 +##童 +##竭 +##端 +##競 +##竹 +##竺 +##竽 +##竿 +##笃 +##笆 +##笈 +##笋 +##笏 +##笑 +##笔 +##笙 +##笛 +##笞 +##笠 +##符 +##笨 +##第 +##笹 +##笺 +##笼 +##筆 +##等 +##筊 +##筋 +##筍 +##筏 +##筐 +##筑 +##筒 +##答 +##策 +##筛 +##筝 +##筠 +##筱 +##筲 +##筵 +##筷 +##筹 +##签 +##简 +##箇 +##箋 +##箍 +##箏 +##箐 +##箔 +##箕 +##算 +##箝 +##管 +##箩 +##箫 +##箭 +##箱 +##箴 +##箸 +##節 +##篁 +##範 +##篆 +##篇 +##築 +##篑 +##篓 +##篙 +##篝 +##篠 +##篡 +##篤 +##篩 +##篪 +##篮 +##篱 +##篷 +##簇 +##簌 +##簍 +##簡 +##簦 +##簧 +##簪 +##簫 +##簷 +##簸 +##簽 +##簾 +##簿 +##籁 +##籃 +##籌 +##籍 +##籐 +##籟 +##籠 +##籤 +##籬 +##籮 +##籲 +##米 +##类 +##籼 +##籽 +##粄 +##粉 +##粑 +##粒 +##粕 +##粗 +##粘 +##粟 +##粤 +##粥 +##粧 +##粪 +##粮 +##粱 +##粲 +##粳 +##粵 +##粹 +##粼 +##粽 +##精 +##粿 +##糅 +##糊 +##糍 +##糕 +##糖 +##糗 +##糙 +##糜 +##糞 +##糟 +##糠 +##糧 +##糬 +##糯 +##糰 +##糸 +##系 +##糾 +##紀 +##紂 +##約 +##紅 +##紉 +##紊 +##紋 +##納 +##紐 +##紓 +##純 +##紗 +##紘 +##紙 +##級 +##紛 +##紜 +##素 +##紡 +##索 +##紧 +##紫 +##紮 +##累 +##細 +##紳 +##紹 +##紺 +##終 +##絃 +##組 +##絆 +##経 +##結 +##絕 +##絞 +##絡 +##絢 +##給 +##絨 +##絮 +##統 +##絲 +##絳 +##絵 +##絶 +##絹 +##綁 +##綏 +##綑 +##經 +##継 +##続 +##綜 +##綠 +##綢 +##綦 +##綫 +##綬 +##維 +##綱 +##網 +##綴 +##綵 +##綸 +##綺 +##綻 +##綽 +##綾 +##綿 +##緊 +##緋 +##総 +##緑 +##緒 +##緘 +##線 +##緝 +##緞 +##締 +##緣 +##編 +##緩 +##緬 +##緯 +##練 +##緹 +##緻 +##縁 +##縄 +##縈 +##縛 +##縝 +##縣 +##縫 +##縮 +##縱 +##縴 +##縷 +##總 +##績 +##繁 +##繃 +##繆 +##繇 +##繋 +##織 +##繕 +##繚 +##繞 +##繡 +##繩 +##繪 +##繫 +##繭 +##繳 +##繹 +##繼 +##繽 +##纂 +##續 +##纍 +##纏 +##纓 +##纔 +##纖 +##纜 +##纠 +##红 +##纣 +##纤 +##约 +##级 +##纨 +##纪 +##纫 +##纬 +##纭 +##纯 +##纰 +##纱 +##纲 +##纳 +##纵 +##纶 +##纷 +##纸 +##纹 +##纺 +##纽 +##纾 +##线 +##绀 +##练 +##组 +##绅 +##细 +##织 +##终 +##绊 +##绍 +##绎 +##经 +##绑 +##绒 +##结 +##绔 +##绕 +##绘 +##给 +##绚 +##绛 +##络 +##绝 +##绞 +##统 +##绡 +##绢 +##绣 +##绥 +##绦 +##继 +##绩 +##绪 +##绫 +##续 +##绮 +##绯 +##绰 +##绳 +##维 +##绵 +##绶 +##绷 +##绸 +##绻 +##综 +##绽 +##绾 +##绿 +##缀 +##缄 +##缅 +##缆 +##缇 +##缈 +##缉 +##缎 +##缓 +##缔 +##缕 +##编 +##缘 +##缙 +##缚 +##缜 +##缝 +##缠 +##缢 +##缤 +##缥 +##缨 +##缩 +##缪 +##缭 +##缮 +##缰 +##缱 +##缴 +##缸 +##缺 +##缽 +##罂 +##罄 +##罌 +##罐 +##网 +##罔 +##罕 +##罗 +##罚 +##罡 +##罢 +##罩 +##罪 +##置 +##罰 +##署 +##罵 +##罷 +##罹 +##羁 +##羅 +##羈 +##羊 +##羌 +##美 +##羔 +##羚 +##羞 +##羟 +##羡 +##羣 +##群 +##羥 +##羧 +##羨 +##義 +##羯 +##羲 +##羸 +##羹 +##羽 +##羿 +##翁 +##翅 +##翊 +##翌 +##翎 +##習 +##翔 +##翘 +##翟 +##翠 +##翡 +##翦 +##翩 +##翰 +##翱 +##翳 +##翹 +##翻 +##翼 +##耀 +##老 +##考 +##耄 +##者 +##耆 +##耋 +##而 +##耍 +##耐 +##耒 +##耕 +##耗 +##耘 +##耙 +##耦 +##耨 +##耳 +##耶 +##耷 +##耸 +##耻 +##耽 +##耿 +##聂 +##聆 +##聊 +##聋 +##职 +##聒 +##联 +##聖 +##聘 +##聚 +##聞 +##聪 +##聯 +##聰 +##聲 +##聳 +##聴 +##聶 +##職 +##聽 +##聾 +##聿 +##肃 +##肄 +##肅 +##肆 +##肇 +##肉 +##肋 +##肌 +##肏 +##肓 +##肖 +##肘 +##肚 +##肛 +##肝 +##肠 +##股 +##肢 +##肤 +##肥 +##肩 +##肪 +##肮 +##肯 +##肱 +##育 +##肴 +##肺 +##肽 +##肾 +##肿 +##胀 +##胁 +##胃 +##胄 +##胆 +##背 +##胍 +##胎 +##胖 +##胚 +##胛 +##胜 +##胝 +##胞 +##胡 +##胤 +##胥 +##胧 +##胫 +##胭 +##胯 +##胰 +##胱 +##胳 +##胴 +##胶 +##胸 +##胺 +##能 +##脂 +##脅 +##脆 +##脇 +##脈 +##脉 +##脊 +##脍 +##脏 +##脐 +##脑 +##脓 +##脖 +##脘 +##脚 +##脛 +##脣 +##脩 +##脫 +##脯 +##脱 +##脲 +##脳 +##脸 +##脹 +##脾 +##腆 +##腈 +##腊 +##腋 +##腌 +##腎 +##腐 +##腑 +##腓 +##腔 +##腕 +##腥 +##腦 +##腩 +##腫 +##腭 +##腮 +##腰 +##腱 +##腳 +##腴 +##腸 +##腹 +##腺 +##腻 +##腼 +##腾 +##腿 +##膀 +##膈 +##膊 +##膏 +##膑 +##膘 +##膚 +##膛 +##膜 +##膝 +##膠 +##膦 +##膨 +##膩 +##膳 +##膺 +##膻 +##膽 +##膾 +##膿 +##臀 +##臂 +##臃 +##臆 +##臉 +##臊 +##臍 +##臓 +##臘 +##臟 +##臣 +##臥 +##臧 +##臨 +##自 +##臬 +##臭 +##至 +##致 +##臺 +##臻 +##臼 +##臾 +##舀 +##舂 +##舅 +##舆 +##與 +##興 +##舉 +##舊 +##舌 +##舍 +##舎 +##舐 +##舒 +##舔 +##舖 +##舗 +##舛 +##舜 +##舞 +##舟 +##航 +##舫 +##般 +##舰 +##舱 +##舵 +##舶 +##舷 +##舸 +##船 +##舺 +##舾 +##艇 +##艋 +##艘 +##艙 +##艦 +##艮 +##良 +##艰 +##艱 +##色 +##艳 +##艷 +##艹 +##艺 +##艾 +##节 +##芃 +##芈 +##芊 +##芋 +##芍 +##芎 +##芒 +##芙 +##芜 +##芝 +##芡 +##芥 +##芦 +##芩 +##芪 +##芫 +##芬 +##芭 +##芮 +##芯 +##花 +##芳 +##芷 +##芸 +##芹 +##芻 +##芽 +##芾 +##苁 +##苄 +##苇 +##苋 +##苍 +##苏 +##苑 +##苒 +##苓 +##苔 +##苕 +##苗 +##苛 +##苜 +##苞 +##苟 +##苡 +##苣 +##若 +##苦 +##苫 +##苯 +##英 +##苷 +##苹 +##苻 +##茁 +##茂 +##范 +##茄 +##茅 +##茉 +##茎 +##茏 +##茗 +##茜 +##茧 +##茨 +##茫 +##茬 +##茭 +##茯 +##茱 +##茲 +##茴 +##茵 +##茶 +##茸 +##茹 +##茼 +##荀 +##荃 +##荆 +##草 +##荊 +##荏 +##荐 +##荒 +##荔 +##荖 +##荘 +##荚 +##荞 +##荟 +##荠 +##荡 +##荣 +##荤 +##荥 +##荧 +##荨 +##荪 +##荫 +##药 +##荳 +##荷 +##荸 +##荻 +##荼 +##荽 +##莅 +##莆 +##莉 +##莊 +##莎 +##莒 +##莓 +##莖 +##莘 +##莞 +##莠 +##莢 +##莧 +##莪 +##莫 +##莱 +##莲 +##莴 +##获 +##莹 +##莺 +##莽 +##莿 +##菀 +##菁 +##菅 +##菇 +##菈 +##菊 +##菌 +##菏 +##菓 +##菖 +##菘 +##菜 +##菟 +##菠 +##菡 +##菩 +##華 +##菱 +##菲 +##菸 +##菽 +##萁 +##萃 +##萄 +##萊 +##萋 +##萌 +##萍 +##萎 +##萘 +##萝 +##萤 +##营 +##萦 +##萧 +##萨 +##萩 +##萬 +##萱 +##萵 +##萸 +##萼 +##落 +##葆 +##葉 +##著 +##葚 +##葛 +##葡 +##董 +##葦 +##葩 +##葫 +##葬 +##葭 +##葯 +##葱 +##葳 +##葵 +##葷 +##葺 +##蒂 +##蒋 +##蒐 +##蒔 +##蒙 +##蒜 +##蒞 +##蒟 +##蒡 +##蒨 +##蒲 +##蒸 +##蒹 +##蒻 +##蒼 +##蒿 +##蓁 +##蓄 +##蓆 +##蓉 +##蓋 +##蓑 +##蓓 +##蓖 +##蓝 +##蓟 +##蓦 +##蓬 +##蓮 +##蓼 +##蓿 +##蔑 +##蔓 +##蔔 +##蔗 +##蔘 +##蔚 +##蔡 +##蔣 +##蔥 +##蔫 +##蔬 +##蔭 +##蔵 +##蔷 +##蔺 +##蔻 +##蔼 +##蔽 +##蕁 +##蕃 +##蕈 +##蕉 +##蕊 +##蕎 +##蕙 +##蕤 +##蕨 +##蕩 +##蕪 +##蕭 +##蕲 +##蕴 +##蕻 +##蕾 +##薄 +##薅 +##薇 +##薈 +##薊 +##薏 +##薑 +##薔 +##薙 +##薛 +##薦 +##薨 +##薩 +##薪 +##薬 +##薯 +##薰 +##薹 +##藉 +##藍 +##藏 +##藐 +##藓 +##藕 +##藜 +##藝 +##藤 +##藥 +##藩 +##藹 +##藻 +##藿 +##蘆 +##蘇 +##蘊 +##蘋 +##蘑 +##蘚 +##蘭 +##蘸 +##蘼 +##蘿 +##虎 +##虏 +##虐 +##虑 +##虔 +##處 +##虚 +##虛 +##虜 +##虞 +##號 +##虢 +##虧 +##虫 +##虬 +##虱 +##虹 +##虻 +##虽 +##虾 +##蚀 +##蚁 +##蚂 +##蚊 +##蚌 +##蚓 +##蚕 +##蚜 +##蚝 +##蚣 +##蚤 +##蚩 +##蚪 +##蚯 +##蚱 +##蚵 +##蛀 +##蛆 +##蛇 +##蛊 +##蛋 +##蛎 +##蛐 +##蛔 +##蛙 +##蛛 +##蛟 +##蛤 +##蛭 +##蛮 +##蛰 +##蛳 +##蛹 +##蛻 +##蛾 +##蜀 +##蜂 +##蜃 +##蜆 +##蜇 +##蜈 +##蜊 +##蜍 +##蜒 +##蜓 +##蜕 +##蜗 +##蜘 +##蜚 +##蜜 +##蜡 +##蜢 +##蜥 +##蜱 +##蜴 +##蜷 +##蜻 +##蜿 +##蝇 +##蝈 +##蝉 +##蝌 +##蝎 +##蝕 +##蝗 +##蝙 +##蝟 +##蝠 +##蝦 +##蝨 +##蝴 +##蝶 +##蝸 +##蝼 +##螂 +##螃 +##融 +##螞 +##螢 +##螨 +##螯 +##螳 +##螺 +##蟀 +##蟄 +##蟆 +##蟋 +##蟎 +##蟑 +##蟒 +##蟠 +##蟬 +##蟲 +##蟹 +##蟻 +##蟾 +##蠅 +##蠍 +##蠔 +##蠕 +##蠛 +##蠟 +##蠡 +##蠢 +##蠣 +##蠱 +##蠶 +##蠹 +##蠻 +##血 +##衄 +##衅 +##衆 +##行 +##衍 +##術 +##衔 +##街 +##衙 +##衛 +##衝 +##衞 +##衡 +##衢 +##衣 +##补 +##表 +##衩 +##衫 +##衬 +##衮 +##衰 +##衲 +##衷 +##衹 +##衾 +##衿 +##袁 +##袂 +##袄 +##袅 +##袈 +##袋 +##袍 +##袒 +##袖 +##袜 +##袞 +##袤 +##袪 +##被 +##袭 +##袱 +##裁 +##裂 +##装 +##裆 +##裊 +##裏 +##裔 +##裕 +##裘 +##裙 +##補 +##裝 +##裟 +##裡 +##裤 +##裨 +##裱 +##裳 +##裴 +##裸 +##裹 +##製 +##裾 +##褂 +##複 +##褐 +##褒 +##褓 +##褔 +##褚 +##褥 +##褪 +##褫 +##褲 +##褶 +##褻 +##襁 +##襄 +##襟 +##襠 +##襪 +##襬 +##襯 +##襲 +##西 +##要 +##覃 +##覆 +##覇 +##見 +##規 +##覓 +##視 +##覚 +##覦 +##覧 +##親 +##覬 +##観 +##覷 +##覺 +##覽 +##觀 +##见 +##观 +##规 +##觅 +##视 +##览 +##觉 +##觊 +##觎 +##觐 +##觑 +##角 +##觞 +##解 +##觥 +##触 +##觸 +##言 +##訂 +##計 +##訊 +##討 +##訓 +##訕 +##訖 +##託 +##記 +##訛 +##訝 +##訟 +##訣 +##訥 +##訪 +##設 +##許 +##訳 +##訴 +##訶 +##診 +##註 +##証 +##詆 +##詐 +##詔 +##評 +##詛 +##詞 +##詠 +##詡 +##詢 +##詣 +##試 +##詩 +##詫 +##詬 +##詭 +##詮 +##詰 +##話 +##該 +##詳 +##詹 +##詼 +##誅 +##誇 +##誉 +##誌 +##認 +##誓 +##誕 +##誘 +##語 +##誠 +##誡 +##誣 +##誤 +##誥 +##誦 +##誨 +##說 +##説 +##読 +##誰 +##課 +##誹 +##誼 +##調 +##諄 +##談 +##請 +##諏 +##諒 +##論 +##諗 +##諜 +##諡 +##諦 +##諧 +##諫 +##諭 +##諮 +##諱 +##諳 +##諷 +##諸 +##諺 +##諾 +##謀 +##謁 +##謂 +##謄 +##謊 +##謎 +##謐 +##謔 +##謗 +##謙 +##講 +##謝 +##謠 +##謨 +##謬 +##謹 +##謾 +##譁 +##證 +##譎 +##譏 +##識 +##譙 +##譚 +##譜 +##警 +##譬 +##譯 +##議 +##譲 +##譴 +##護 +##譽 +##讀 +##變 +##讓 +##讚 +##讞 +##计 +##订 +##认 +##讥 +##讧 +##讨 +##让 +##讪 +##讫 +##训 +##议 +##讯 +##记 +##讲 +##讳 +##讴 +##讶 +##讷 +##许 +##讹 +##论 +##讼 +##讽 +##设 +##访 +##诀 +##证 +##诃 +##评 +##诅 +##识 +##诈 +##诉 +##诊 +##诋 +##词 +##诏 +##译 +##试 +##诗 +##诘 +##诙 +##诚 +##诛 +##话 +##诞 +##诟 +##诠 +##诡 +##询 +##诣 +##诤 +##该 +##详 +##诧 +##诩 +##诫 +##诬 +##语 +##误 +##诰 +##诱 +##诲 +##说 +##诵 +##诶 +##请 +##诸 +##诺 +##读 +##诽 +##课 +##诿 +##谀 +##谁 +##调 +##谄 +##谅 +##谆 +##谈 +##谊 +##谋 +##谌 +##谍 +##谎 +##谏 +##谐 +##谑 +##谒 +##谓 +##谔 +##谕 +##谗 +##谘 +##谙 +##谚 +##谛 +##谜 +##谟 +##谢 +##谣 +##谤 +##谥 +##谦 +##谧 +##谨 +##谩 +##谪 +##谬 +##谭 +##谯 +##谱 +##谲 +##谴 +##谶 +##谷 +##豁 +##豆 +##豇 +##豈 +##豉 +##豊 +##豌 +##豎 +##豐 +##豔 +##豚 +##象 +##豢 +##豪 +##豫 +##豬 +##豹 +##豺 +##貂 +##貅 +##貌 +##貓 +##貔 +##貘 +##貝 +##貞 +##負 +##財 +##貢 +##貧 +##貨 +##販 +##貪 +##貫 +##責 +##貯 +##貰 +##貳 +##貴 +##貶 +##買 +##貸 +##費 +##貼 +##貽 +##貿 +##賀 +##賁 +##賂 +##賃 +##賄 +##資 +##賈 +##賊 +##賑 +##賓 +##賜 +##賞 +##賠 +##賡 +##賢 +##賣 +##賤 +##賦 +##質 +##賬 +##賭 +##賴 +##賺 +##購 +##賽 +##贅 +##贈 +##贊 +##贍 +##贏 +##贓 +##贖 +##贛 +##贝 +##贞 +##负 +##贡 +##财 +##责 +##贤 +##败 +##账 +##货 +##质 +##贩 +##贪 +##贫 +##贬 +##购 +##贮 +##贯 +##贰 +##贱 +##贲 +##贴 +##贵 +##贷 +##贸 +##费 +##贺 +##贻 +##贼 +##贾 +##贿 +##赁 +##赂 +##赃 +##资 +##赅 +##赈 +##赊 +##赋 +##赌 +##赎 +##赏 +##赐 +##赓 +##赔 +##赖 +##赘 +##赚 +##赛 +##赝 +##赞 +##赠 +##赡 +##赢 +##赣 +##赤 +##赦 +##赧 +##赫 +##赭 +##走 +##赳 +##赴 +##赵 +##赶 +##起 +##趁 +##超 +##越 +##趋 +##趕 +##趙 +##趟 +##趣 +##趨 +##足 +##趴 +##趵 +##趸 +##趺 +##趾 +##跃 +##跄 +##跆 +##跋 +##跌 +##跎 +##跑 +##跖 +##跚 +##跛 +##距 +##跟 +##跡 +##跤 +##跨 +##跩 +##跪 +##路 +##跳 +##践 +##跷 +##跹 +##跺 +##跻 +##踉 +##踊 +##踌 +##踏 +##踐 +##踝 +##踞 +##踟 +##踢 +##踩 +##踪 +##踮 +##踱 +##踴 +##踵 +##踹 +##蹂 +##蹄 +##蹇 +##蹈 +##蹉 +##蹊 +##蹋 +##蹑 +##蹒 +##蹙 +##蹟 +##蹣 +##蹤 +##蹦 +##蹩 +##蹬 +##蹭 +##蹲 +##蹴 +##蹶 +##蹺 +##蹼 +##蹿 +##躁 +##躇 +##躉 +##躊 +##躋 +##躍 +##躏 +##躪 +##身 +##躬 +##躯 +##躲 +##躺 +##軀 +##車 +##軋 +##軌 +##軍 +##軒 +##軟 +##転 +##軸 +##軼 +##軽 +##軾 +##較 +##載 +##輒 +##輓 +##輔 +##輕 +##輛 +##輝 +##輟 +##輩 +##輪 +##輯 +##輸 +##輻 +##輾 +##輿 +##轄 +##轅 +##轆 +##轉 +##轍 +##轎 +##轟 +##车 +##轧 +##轨 +##轩 +##转 +##轭 +##轮 +##软 +##轰 +##轲 +##轴 +##轶 +##轻 +##轼 +##载 +##轿 +##较 +##辄 +##辅 +##辆 +##辇 +##辈 +##辉 +##辊 +##辍 +##辐 +##辑 +##输 +##辕 +##辖 +##辗 +##辘 +##辙 +##辛 +##辜 +##辞 +##辟 +##辣 +##辦 +##辨 +##辩 +##辫 +##辭 +##辮 +##辯 +##辰 +##辱 +##農 +##边 +##辺 +##辻 +##込 +##辽 +##达 +##迁 +##迂 +##迄 +##迅 +##过 +##迈 +##迎 +##运 +##近 +##返 +##还 +##这 +##进 +##远 +##违 +##连 +##迟 +##迢 +##迤 +##迥 +##迦 +##迩 +##迪 +##迫 +##迭 +##述 +##迴 +##迷 +##迸 +##迹 +##迺 +##追 +##退 +##送 +##适 +##逃 +##逅 +##逆 +##选 +##逊 +##逍 +##透 +##逐 +##递 +##途 +##逕 +##逗 +##這 +##通 +##逛 +##逝 +##逞 +##速 +##造 +##逢 +##連 +##逮 +##週 +##進 +##逵 +##逶 +##逸 +##逻 +##逼 +##逾 +##遁 +##遂 +##遅 +##遇 +##遊 +##運 +##遍 +##過 +##遏 +##遐 +##遑 +##遒 +##道 +##達 +##違 +##遗 +##遙 +##遛 +##遜 +##遞 +##遠 +##遢 +##遣 +##遥 +##遨 +##適 +##遭 +##遮 +##遲 +##遴 +##遵 +##遶 +##遷 +##選 +##遺 +##遼 +##遽 +##避 +##邀 +##邁 +##邂 +##邃 +##還 +##邇 +##邈 +##邊 +##邋 +##邏 +##邑 +##邓 +##邕 +##邛 +##邝 +##邢 +##那 +##邦 +##邨 +##邪 +##邬 +##邮 +##邯 +##邰 +##邱 +##邳 +##邵 +##邸 +##邹 +##邺 +##邻 +##郁 +##郅 +##郊 +##郎 +##郑 +##郜 +##郝 +##郡 +##郢 +##郤 +##郦 +##郧 +##部 +##郫 +##郭 +##郴 +##郵 +##郷 +##郸 +##都 +##鄂 +##鄉 +##鄒 +##鄔 +##鄙 +##鄞 +##鄢 +##鄧 +##鄭 +##鄰 +##鄱 +##鄲 +##鄺 +##酉 +##酊 +##酋 +##酌 +##配 +##酐 +##酒 +##酗 +##酚 +##酝 +##酢 +##酣 +##酥 +##酩 +##酪 +##酬 +##酮 +##酯 +##酰 +##酱 +##酵 +##酶 +##酷 +##酸 +##酿 +##醃 +##醇 +##醉 +##醋 +##醍 +##醐 +##醒 +##醚 +##醛 +##醜 +##醞 +##醣 +##醪 +##醫 +##醬 +##醮 +##醯 +##醴 +##醺 +##釀 +##釁 +##采 +##釉 +##释 +##釋 +##里 +##重 +##野 +##量 +##釐 +##金 +##釗 +##釘 +##釜 +##針 +##釣 +##釦 +##釧 +##釵 +##鈀 +##鈉 +##鈍 +##鈎 +##鈔 +##鈕 +##鈞 +##鈣 +##鈦 +##鈪 +##鈴 +##鈺 +##鈾 +##鉀 +##鉄 +##鉅 +##鉉 +##鉑 +##鉗 +##鉚 +##鉛 +##鉤 +##鉴 +##鉻 +##銀 +##銃 +##銅 +##銑 +##銓 +##銖 +##銘 +##銜 +##銬 +##銭 +##銮 +##銳 +##銷 +##銹 +##鋁 +##鋅 +##鋒 +##鋤 +##鋪 +##鋰 +##鋸 +##鋼 +##錄 +##錐 +##錘 +##錚 +##錠 +##錢 +##錦 +##錨 +##錫 +##錮 +##錯 +##録 +##錳 +##錶 +##鍊 +##鍋 +##鍍 +##鍛 +##鍥 +##鍰 +##鍵 +##鍺 +##鍾 +##鎂 +##鎊 +##鎌 +##鎏 +##鎔 +##鎖 +##鎗 +##鎚 +##鎧 +##鎬 +##鎮 +##鎳 +##鏈 +##鏖 +##鏗 +##鏘 +##鏞 +##鏟 +##鏡 +##鏢 +##鏤 +##鏽 +##鐘 +##鐮 +##鐲 +##鐳 +##鐵 +##鐸 +##鐺 +##鑄 +##鑊 +##鑑 +##鑒 +##鑣 +##鑫 +##鑰 +##鑲 +##鑼 +##鑽 +##鑾 +##鑿 +##针 +##钉 +##钊 +##钎 +##钏 +##钒 +##钓 +##钗 +##钙 +##钛 +##钜 +##钝 +##钞 +##钟 +##钠 +##钡 +##钢 +##钣 +##钤 +##钥 +##钦 +##钧 +##钨 +##钩 +##钮 +##钯 +##钰 +##钱 +##钳 +##钴 +##钵 +##钺 +##钻 +##钼 +##钾 +##钿 +##铀 +##铁 +##铂 +##铃 +##铄 +##铅 +##铆 +##铉 +##铎 +##铐 +##铛 +##铜 +##铝 +##铠 +##铡 +##铢 +##铣 +##铤 +##铨 +##铩 +##铬 +##铭 +##铮 +##铰 +##铲 +##铵 +##银 +##铸 +##铺 +##链 +##铿 +##销 +##锁 +##锂 +##锄 +##锅 +##锆 +##锈 +##锉 +##锋 +##锌 +##锏 +##锐 +##锑 +##错 +##锚 +##锟 +##锡 +##锢 +##锣 +##锤 +##锥 +##锦 +##锭 +##键 +##锯 +##锰 +##锲 +##锵 +##锹 +##锺 +##锻 +##镀 +##镁 +##镂 +##镇 +##镉 +##镌 +##镍 +##镐 +##镑 +##镕 +##镖 +##镗 +##镛 +##镜 +##镣 +##镭 +##镯 +##镰 +##镳 +##镶 +##長 +##长 +##門 +##閃 +##閉 +##開 +##閎 +##閏 +##閑 +##閒 +##間 +##閔 +##閘 +##閡 +##関 +##閣 +##閥 +##閨 +##閩 +##閱 +##閲 +##閹 +##閻 +##閾 +##闆 +##闇 +##闊 +##闌 +##闍 +##闔 +##闕 +##闖 +##闘 +##關 +##闡 +##闢 +##门 +##闪 +##闫 +##闭 +##问 +##闯 +##闰 +##闲 +##间 +##闵 +##闷 +##闸 +##闹 +##闺 +##闻 +##闽 +##闾 +##阀 +##阁 +##阂 +##阅 +##阆 +##阇 +##阈 +##阉 +##阎 +##阐 +##阑 +##阔 +##阕 +##阖 +##阙 +##阚 +##阜 +##队 +##阡 +##阪 +##阮 +##阱 +##防 +##阳 +##阴 +##阵 +##阶 +##阻 +##阿 +##陀 +##陂 +##附 +##际 +##陆 +##陇 +##陈 +##陋 +##陌 +##降 +##限 +##陕 +##陛 +##陝 +##陞 +##陟 +##陡 +##院 +##陣 +##除 +##陨 +##险 +##陪 +##陰 +##陲 +##陳 +##陵 +##陶 +##陷 +##陸 +##険 +##陽 +##隅 +##隆 +##隈 +##隊 +##隋 +##隍 +##階 +##随 +##隐 +##隔 +##隕 +##隘 +##隙 +##際 +##障 +##隠 +##隣 +##隧 +##隨 +##險 +##隱 +##隴 +##隶 +##隸 +##隻 +##隼 +##隽 +##难 +##雀 +##雁 +##雄 +##雅 +##集 +##雇 +##雉 +##雋 +##雌 +##雍 +##雎 +##雏 +##雑 +##雒 +##雕 +##雖 +##雙 +##雛 +##雜 +##雞 +##離 +##難 +##雨 +##雪 +##雯 +##雰 +##雲 +##雳 +##零 +##雷 +##雹 +##電 +##雾 +##需 +##霁 +##霄 +##霆 +##震 +##霈 +##霉 +##霊 +##霍 +##霎 +##霏 +##霑 +##霓 +##霖 +##霜 +##霞 +##霧 +##霭 +##霰 +##露 +##霸 +##霹 +##霽 +##霾 +##靂 +##靄 +##靈 +##青 +##靓 +##靖 +##静 +##靚 +##靛 +##靜 +##非 +##靠 +##靡 +##面 +##靥 +##靦 +##革 +##靳 +##靴 +##靶 +##靼 +##鞅 +##鞋 +##鞍 +##鞏 +##鞑 +##鞘 +##鞠 +##鞣 +##鞦 +##鞭 +##韆 +##韋 +##韌 +##韓 +##韜 +##韦 +##韧 +##韩 +##韬 +##韭 +##音 +##韵 +##韶 +##韻 +##響 +##頁 +##頂 +##頃 +##項 +##順 +##須 +##頌 +##預 +##頑 +##頒 +##頓 +##頗 +##領 +##頜 +##頡 +##頤 +##頫 +##頭 +##頰 +##頷 +##頸 +##頹 +##頻 +##頼 +##顆 +##題 +##額 +##顎 +##顏 +##顔 +##願 +##顛 +##類 +##顧 +##顫 +##顯 +##顱 +##顴 +##页 +##顶 +##顷 +##项 +##顺 +##须 +##顼 +##顽 +##顾 +##顿 +##颁 +##颂 +##预 +##颅 +##领 +##颇 +##颈 +##颉 +##颊 +##颌 +##颍 +##颐 +##频 +##颓 +##颔 +##颖 +##颗 +##题 +##颚 +##颛 +##颜 +##额 +##颞 +##颠 +##颡 +##颢 +##颤 +##颦 +##颧 +##風 +##颯 +##颱 +##颳 +##颶 +##颼 +##飄 +##飆 +##风 +##飒 +##飓 +##飕 +##飘 +##飙 +##飚 +##飛 +##飞 +##食 +##飢 +##飨 +##飩 +##飪 +##飯 +##飲 +##飼 +##飽 +##飾 +##餃 +##餅 +##餉 +##養 +##餌 +##餐 +##餒 +##餓 +##餘 +##餚 +##餛 +##餞 +##餡 +##館 +##餮 +##餵 +##餾 +##饅 +##饈 +##饋 +##饌 +##饍 +##饑 +##饒 +##饕 +##饗 +##饞 +##饥 +##饨 +##饪 +##饬 +##饭 +##饮 +##饯 +##饰 +##饱 +##饲 +##饴 +##饵 +##饶 +##饷 +##饺 +##饼 +##饽 +##饿 +##馀 +##馁 +##馄 +##馅 +##馆 +##馈 +##馋 +##馍 +##馏 +##馒 +##馔 +##首 +##馗 +##香 +##馥 +##馨 +##馬 +##馭 +##馮 +##馳 +##馴 +##駁 +##駄 +##駅 +##駆 +##駐 +##駒 +##駕 +##駛 +##駝 +##駭 +##駱 +##駿 +##騁 +##騎 +##騏 +##験 +##騙 +##騨 +##騰 +##騷 +##驀 +##驅 +##驊 +##驍 +##驒 +##驕 +##驗 +##驚 +##驛 +##驟 +##驢 +##驥 +##马 +##驭 +##驮 +##驯 +##驰 +##驱 +##驳 +##驴 +##驶 +##驷 +##驸 +##驹 +##驻 +##驼 +##驾 +##驿 +##骁 +##骂 +##骄 +##骅 +##骆 +##骇 +##骈 +##骊 +##骋 +##验 +##骏 +##骐 +##骑 +##骗 +##骚 +##骛 +##骜 +##骞 +##骠 +##骡 +##骤 +##骥 +##骧 +##骨 +##骯 +##骰 +##骶 +##骷 +##骸 +##骼 +##髂 +##髅 +##髋 +##髏 +##髒 +##髓 +##體 +##髖 +##高 +##髦 +##髪 +##髮 +##髯 +##髻 +##鬃 +##鬆 +##鬍 +##鬓 +##鬚 +##鬟 +##鬢 +##鬣 +##鬥 +##鬧 +##鬱 +##鬼 +##魁 +##魂 +##魄 +##魅 +##魇 +##魍 +##魏 +##魔 +##魘 +##魚 +##魯 +##魷 +##鮑 +##鮨 +##鮪 +##鮭 +##鮮 +##鯉 +##鯊 +##鯖 +##鯛 +##鯨 +##鯰 +##鯽 +##鰍 +##鰓 +##鰭 +##鰲 +##鰻 +##鰾 +##鱈 +##鱉 +##鱔 +##鱗 +##鱷 +##鱸 +##鱼 +##鱿 +##鲁 +##鲈 +##鲍 +##鲑 +##鲛 +##鲜 +##鲟 +##鲢 +##鲤 +##鲨 +##鲫 +##鲱 +##鲲 +##鲶 +##鲷 +##鲸 +##鳃 +##鳄 +##鳅 +##鳌 +##鳍 +##鳕 +##鳖 +##鳗 +##鳝 +##鳞 +##鳥 +##鳩 +##鳳 +##鳴 +##鳶 +##鴉 +##鴕 +##鴛 +##鴦 +##鴨 +##鴻 +##鴿 +##鵑 +##鵜 +##鵝 +##鵡 +##鵬 +##鵰 +##鵲 +##鶘 +##鶩 +##鶯 +##鶴 +##鷗 +##鷲 +##鷹 +##鷺 +##鸚 +##鸞 +##鸟 +##鸠 +##鸡 +##鸢 +##鸣 +##鸥 +##鸦 +##鸨 +##鸪 +##鸭 +##鸯 +##鸳 +##鸵 +##鸽 +##鸾 +##鸿 +##鹂 +##鹃 +##鹄 +##鹅 +##鹈 +##鹉 +##鹊 +##鹌 +##鹏 +##鹑 +##鹕 +##鹘 +##鹜 +##鹞 +##鹤 +##鹦 +##鹧 +##鹫 +##鹭 +##鹰 +##鹳 +##鹵 +##鹹 +##鹼 +##鹽 +##鹿 +##麂 +##麋 +##麒 +##麓 +##麗 +##麝 +##麟 +##麥 +##麦 +##麩 +##麴 +##麵 +##麸 +##麺 +##麻 +##麼 +##麽 +##麾 +##黃 +##黄 +##黍 +##黎 +##黏 +##黑 +##黒 +##黔 +##默 +##黛 +##黜 +##黝 +##點 +##黠 +##黨 +##黯 +##黴 +##鼋 +##鼎 +##鼐 +##鼓 +##鼠 +##鼬 +##鼹 +##鼻 +##鼾 +##齁 +##齊 +##齋 +##齐 +##齒 +##齡 +##齢 +##齣 +##齦 +##齿 +##龄 +##龅 +##龈 +##龊 +##龋 +##龌 +##龍 +##龐 +##龔 +##龕 +##龙 +##龚 +##龛 +##龜 +##龟 +##︰ +##︱ +##︶ +##︿ +##﹁ +##﹂ +##﹍ +##﹏ +##﹐ +##﹑ +##﹒ +##﹔ +##﹕ +##﹖ +##﹗ +##﹙ +##﹚ +##﹝ +##﹞ +##﹡ +##﹣ +##! +##" +### +##$ +##% +##& +##' +##( +##) +##* +##, +##- +##. +##/ +##: +##; +##< +##? +##@ +##[ +##\ +##] +##^ +##_ +##` +##f +##h +##j +##u +##w +##z +##{ +##} +##。 +##「 +##」 +##、 +##・ +##ッ +##ー +##イ +##ク +##シ +##ス +##ト +##ノ +##フ +##ラ +##ル +##ン +##゙ +##゚ +## ̄ +##¥ +##👍 +##🔥 +##😂 +##😎 diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/create_pretraining_data.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/create_pretraining_data.py new file mode 100644 index 0000000..8bcbe27 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/create_pretraining_data.py @@ -0,0 +1,442 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Create masked LM/next sentence masked_lm TF examples for BERT.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import random +import tokenization +import tensorflow as tf + +flags = tf.flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string("input_file", None, + "Input raw text file (or comma-separated list of files).") + +flags.DEFINE_string( + "output_file", None, + "Output TF example file (or comma-separated list of files).") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer("max_seq_length", 128, "Maximum sequence length.") + +flags.DEFINE_integer("max_predictions_per_seq", 20, + "Maximum number of masked LM predictions per sequence.") + +flags.DEFINE_integer("random_seed", 12345, "Random seed for data generation.") + +flags.DEFINE_integer( + "dupe_factor", 10, + "Number of times to duplicate the input data (with different masks).") + +flags.DEFINE_float("masked_lm_prob", 0.15, "Masked LM probability.") + +flags.DEFINE_float( + "short_seq_prob", 0.1, + "Probability of creating sequences which are shorter than the " + "maximum length.") + + +class TrainingInstance(object): + """A single training instance (sentence pair).""" + + def __init__(self, tokens, segment_ids, masked_lm_positions, masked_lm_labels, + is_random_next): + self.tokens = tokens + self.segment_ids = segment_ids + self.is_random_next = is_random_next + self.masked_lm_positions = masked_lm_positions + self.masked_lm_labels = masked_lm_labels + + def __str__(self): + s = "" + s += "tokens: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.tokens])) + s += "segment_ids: %s\n" % (" ".join([str(x) for x in self.segment_ids])) + s += "is_random_next: %s\n" % self.is_random_next + s += "masked_lm_positions: %s\n" % (" ".join( + [str(x) for x in self.masked_lm_positions])) + s += "masked_lm_labels: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.masked_lm_labels])) + s += "\n" + return s + + def __repr__(self): + return self.__str__() + + +def write_instance_to_example_files(instances, tokenizer, max_seq_length, + max_predictions_per_seq, output_files): + """Create TF example files from `TrainingInstance`s.""" + writers = [] + for output_file in output_files: + writers.append(tf.python_io.TFRecordWriter(output_file)) + + writer_index = 0 + + total_written = 0 + for (inst_index, instance) in enumerate(instances): + input_ids = tokenizer.convert_tokens_to_ids(instance.tokens) + input_mask = [1] * len(input_ids) + segment_ids = list(instance.segment_ids) + assert len(input_ids) <= max_seq_length + + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + masked_lm_positions = list(instance.masked_lm_positions) + masked_lm_ids = tokenizer.convert_tokens_to_ids(instance.masked_lm_labels) + masked_lm_weights = [1.0] * len(masked_lm_ids) + + while len(masked_lm_positions) < max_predictions_per_seq: + masked_lm_positions.append(0) + masked_lm_ids.append(0) + masked_lm_weights.append(0.0) + + next_sentence_label = 1 if instance.is_random_next else 0 + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(input_ids) + features["input_mask"] = create_int_feature(input_mask) + features["segment_ids"] = create_int_feature(segment_ids) + features["masked_lm_positions"] = create_int_feature(masked_lm_positions) + features["masked_lm_ids"] = create_int_feature(masked_lm_ids) + features["masked_lm_weights"] = create_float_feature(masked_lm_weights) + features["next_sentence_labels"] = create_int_feature([next_sentence_label]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + + writers[writer_index].write(tf_example.SerializeToString()) + writer_index = (writer_index + 1) % len(writers) + + total_written += 1 + + if inst_index < 20: + tf.logging.info("*** Example ***") + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in instance.tokens])) + + for feature_name in features.keys(): + feature = features[feature_name] + values = [] + if feature.int64_list.value: + values = feature.int64_list.value + elif feature.float_list.value: + values = feature.float_list.value + tf.logging.info( + "%s: %s" % (feature_name, " ".join([str(x) for x in values]))) + + for writer in writers: + writer.close() + + tf.logging.info("Wrote %d total instances", total_written) + + +def create_int_feature(values): + feature = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return feature + + +def create_float_feature(values): + feature = tf.train.Feature(float_list=tf.train.FloatList(value=list(values))) + return feature + + +def create_training_instances(input_files, tokenizer, max_seq_length, + dupe_factor, short_seq_prob, masked_lm_prob, + max_predictions_per_seq, rng): + """Create `TrainingInstance`s from raw text.""" + all_documents = [[]] + + # Input file format: + # (1) One sentence per line. These should ideally be actual sentences, not + # entire paragraphs or arbitrary spans of text. (Because we use the + # sentence boundaries for the "next sentence prediction" task). + # (2) Blank lines between documents. Document boundaries are needed so + # that the "next sentence prediction" task doesn't span between documents. + for input_file in input_files: + with tf.gfile.GFile(input_file, "r") as reader: + while True: + line = tokenization.convert_to_unicode(reader.readline()) + if not line: + break + line = line.strip() + + # Empty lines are used as document delimiters + if not line: + all_documents.append([]) + tokens = tokenizer.tokenize(line) + if tokens: + all_documents[-1].append(tokens) + + # Remove empty documents + all_documents = [x for x in all_documents if x] + rng.shuffle(all_documents) + + vocab_words = list(tokenizer.vocab.keys()) + instances = [] + for _ in range(dupe_factor): + for document_index in range(len(all_documents)): + instances.extend( + create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng)) + + rng.shuffle(instances) + return instances + + +def create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng): + """Creates `TrainingInstance`s for a single document.""" + document = all_documents[document_index] + + # Account for [CLS], [SEP], [SEP] + max_num_tokens = max_seq_length - 3 + + # We *usually* want to fill up the entire sequence since we are padding + # to `max_seq_length` anyways, so short sequences are generally wasted + # computation. However, we *sometimes* + # (i.e., short_seq_prob == 0.1 == 10% of the time) want to use shorter + # sequences to minimize the mismatch between pre-training and fine-tuning. + # The `target_seq_length` is just a rough target however, whereas + # `max_seq_length` is a hard limit. + target_seq_length = max_num_tokens + if rng.random() < short_seq_prob: + target_seq_length = rng.randint(2, max_num_tokens) + + # We DON'T just concatenate all of the tokens from a document into a long + # sequence and choose an arbitrary split point because this would make the + # next sentence prediction task too easy. Instead, we split the input into + # segments "A" and "B" based on the actual "sentences" provided by the user + # input. + instances = [] + current_chunk = [] + current_length = 0 + i = 0 + while i < len(document): + segment = document[i] + current_chunk.append(segment) + current_length += len(segment) + if i == len(document) - 1 or current_length >= target_seq_length: + if current_chunk: + # `a_end` is how many segments from `current_chunk` go into the `A` + # (first) sentence. + a_end = 1 + if len(current_chunk) >= 2: + a_end = rng.randint(1, len(current_chunk) - 1) + + tokens_a = [] + for j in range(a_end): + tokens_a.extend(current_chunk[j]) + + tokens_b = [] + # Random next + is_random_next = False + if len(current_chunk) == 1 or rng.random() < 0.5: + is_random_next = True + target_b_length = target_seq_length - len(tokens_a) + + # This should rarely go for more than one iteration for large + # corpora. However, just to be careful, we try to make sure that + # the random document is not the same as the document + # we're processing. + for _ in range(10): + random_document_index = rng.randint(0, len(all_documents) - 1) + if random_document_index != document_index: + break + + random_document = all_documents[random_document_index] + random_start = rng.randint(0, len(random_document) - 1) + for j in range(random_start, len(random_document)): + tokens_b.extend(random_document[j]) + if len(tokens_b) >= target_b_length: + break + # We didn't actually use these segments so we "put them back" so + # they don't go to waste. + num_unused_segments = len(current_chunk) - a_end + i -= num_unused_segments + # Actual next + else: + is_random_next = False + for j in range(a_end, len(current_chunk)): + tokens_b.extend(current_chunk[j]) + truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng) + + assert len(tokens_a) >= 1 + assert len(tokens_b) >= 1 + + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + + tokens.append("[SEP]") + segment_ids.append(0) + + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + (tokens, masked_lm_positions, + masked_lm_labels) = create_masked_lm_predictions( + tokens, masked_lm_prob, max_predictions_per_seq, vocab_words, rng) + instance = TrainingInstance( + tokens=tokens, + segment_ids=segment_ids, + is_random_next=is_random_next, + masked_lm_positions=masked_lm_positions, + masked_lm_labels=masked_lm_labels) + instances.append(instance) + current_chunk = [] + current_length = 0 + i += 1 + + return instances + + +MaskedLmInstance = collections.namedtuple("MaskedLmInstance", + ["index", "label"]) + + +def create_masked_lm_predictions(tokens, masked_lm_prob, + max_predictions_per_seq, vocab_words, rng): + """Creates the predictions for the masked LM objective.""" + + cand_indexes = [] + for (i, token) in enumerate(tokens): + if token == "[CLS]" or token == "[SEP]": + continue + cand_indexes.append(i) + + rng.shuffle(cand_indexes) + + output_tokens = list(tokens) + + num_to_predict = min(max_predictions_per_seq, + max(1, int(round(len(tokens) * masked_lm_prob)))) + + masked_lms = [] + covered_indexes = set() + for index in cand_indexes: + if len(masked_lms) >= num_to_predict: + break + if index in covered_indexes: + continue + covered_indexes.add(index) + + masked_token = None + # 80% of the time, replace with [MASK] + if rng.random() < 0.8: + masked_token = "[MASK]" + else: + # 10% of the time, keep original + if rng.random() < 0.5: + masked_token = tokens[index] + # 10% of the time, replace with random word + else: + masked_token = vocab_words[rng.randint(0, len(vocab_words) - 1)] + + output_tokens[index] = masked_token + + masked_lms.append(MaskedLmInstance(index=index, label=tokens[index])) + + masked_lms = sorted(masked_lms, key=lambda x: x.index) + + masked_lm_positions = [] + masked_lm_labels = [] + for p in masked_lms: + masked_lm_positions.append(p.index) + masked_lm_labels.append(p.label) + + return (output_tokens, masked_lm_positions, masked_lm_labels) + + +def truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng): + """Truncates a pair of sequences to a maximum sequence length.""" + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_num_tokens: + break + + trunc_tokens = tokens_a if len(tokens_a) > len(tokens_b) else tokens_b + assert len(trunc_tokens) >= 1 + + # We want to sometimes truncate from the front and sometimes from the + # back to add more randomness and avoid biases. + if rng.random() < 0.5: + del trunc_tokens[0] + else: + trunc_tokens.pop() + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + input_files = [] + for input_pattern in FLAGS.input_file.split(","): + input_files.extend(tf.gfile.Glob(input_pattern)) + + tf.logging.info("*** Reading from input files ***") + for input_file in input_files: + tf.logging.info(" %s", input_file) + + rng = random.Random(FLAGS.random_seed) + instances = create_training_instances( + input_files, tokenizer, FLAGS.max_seq_length, FLAGS.dupe_factor, + FLAGS.short_seq_prob, FLAGS.masked_lm_prob, FLAGS.max_predictions_per_seq, + rng) + + output_files = FLAGS.output_file.split(",") + tf.logging.info("*** Writing to output files ***") + for output_file in output_files: + tf.logging.info(" %s", output_file) + + write_instance_to_example_files(instances, tokenizer, FLAGS.max_seq_length, + FLAGS.max_predictions_per_seq, output_files) + + +if __name__ == "__main__": + flags.mark_flag_as_required("input_file") + flags.mark_flag_as_required("output_file") + flags.mark_flag_as_required("vocab_file") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/extract_features.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/extract_features.py new file mode 100644 index 0000000..60e3830 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/extract_features.py @@ -0,0 +1,419 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Extract pre-computed feature vectors from BERT.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import codecs +import collections +import json +import re + +import modeling +import tokenization +import tensorflow as tf + +flags = tf.flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string("input_file", None, "") + +flags.DEFINE_string("output_file", None, "") + +flags.DEFINE_string("layers", "-1,-2,-3,-4", "") + +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer("batch_size", 32, "Batch size for predictions.") + +flags.DEFINE_bool("use_tpu", False, "Whether to use TPU or GPU/CPU.") + +flags.DEFINE_string("master", None, + "If using a TPU, the address of the master.") + +flags.DEFINE_integer( + "num_tpu_cores", 8, + "Only used if `use_tpu` is True. Total number of TPU cores to use.") + +flags.DEFINE_bool( + "use_one_hot_embeddings", False, + "If True, tf.one_hot will be used for embedding lookups, otherwise " + "tf.nn.embedding_lookup will be used. On TPUs, this should be True " + "since it is much faster.") + + +class InputExample(object): + + def __init__(self, unique_id, text_a, text_b): + self.unique_id = unique_id + self.text_a = text_a + self.text_b = text_b + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, unique_id, tokens, input_ids, input_mask, input_type_ids): + self.unique_id = unique_id + self.tokens = tokens + self.input_ids = input_ids + self.input_mask = input_mask + self.input_type_ids = input_type_ids + + +def input_fn_builder(features, seq_length): + """Creates an `input_fn` closure to be passed to TPUEstimator.""" + + all_unique_ids = [] + all_input_ids = [] + all_input_mask = [] + all_input_type_ids = [] + + for feature in features: + all_unique_ids.append(feature.unique_id) + all_input_ids.append(feature.input_ids) + all_input_mask.append(feature.input_mask) + all_input_type_ids.append(feature.input_type_ids) + + def input_fn(params): + """The actual input function.""" + batch_size = params["batch_size"] + + num_examples = len(features) + + # This is for demo purposes and does NOT scale to large data sets. We do + # not use Dataset.from_generator() because that uses tf.py_func which is + # not TPU compatible. The right way to load data is with TFRecordReader. + d = tf.data.Dataset.from_tensor_slices({ + "unique_ids": + tf.constant(all_unique_ids, shape=[num_examples], dtype=tf.int32), + "input_ids": + tf.constant( + all_input_ids, shape=[num_examples, seq_length], + dtype=tf.int32), + "input_mask": + tf.constant( + all_input_mask, + shape=[num_examples, seq_length], + dtype=tf.int32), + "input_type_ids": + tf.constant( + all_input_type_ids, + shape=[num_examples, seq_length], + dtype=tf.int32), + }) + + d = d.batch(batch_size=batch_size, drop_remainder=False) + return d + + return input_fn + + +def model_fn_builder(bert_config, init_checkpoint, layer_indexes, use_tpu, + use_one_hot_embeddings): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + unique_ids = features["unique_ids"] + input_ids = features["input_ids"] + input_mask = features["input_mask"] + input_type_ids = features["input_type_ids"] + + model = modeling.BertModel( + config=bert_config, + is_training=False, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=input_type_ids, + use_one_hot_embeddings=use_one_hot_embeddings) + + if mode != tf.estimator.ModeKeys.PREDICT: + raise ValueError("Only PREDICT modes are supported: %s" % (mode)) + + tvars = tf.trainable_variables() + scaffold_fn = None + (assignment_map, + initialized_variable_names) = modeling.get_assignment_map_from_checkpoint( + tvars, init_checkpoint) + if use_tpu: + + def tpu_scaffold(): + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + return tf.train.Scaffold() + + scaffold_fn = tpu_scaffold + else: + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, + init_string) + + all_layers = model.get_all_encoder_layers() + + predictions = { + "unique_id": unique_ids, + } + + for (i, layer_index) in enumerate(layer_indexes): + predictions["layer_output_%d" % i] = all_layers[layer_index] + + output_spec = tf.contrib.tpu.TPUEstimatorSpec( + mode=mode, predictions=predictions, scaffold_fn=scaffold_fn) + return output_spec + + return model_fn + + +def convert_examples_to_features(examples, seq_length, tokenizer): + """Loads a data file into a list of `InputBatch`s.""" + + features = [] + for (ex_index, example) in enumerate(examples): + tokens_a = tokenizer.tokenize(example.text_a) + + tokens_b = None + if example.text_b: + tokens_b = tokenizer.tokenize(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for [CLS], [SEP], [SEP] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, seq_length - 3) + else: + # Account for [CLS] and [SEP] with "- 2" + if len(tokens_a) > seq_length - 2: + tokens_a = tokens_a[0:(seq_length - 2)] + + # The convention in BERT is: + # (a) For sequence pairs: + # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] + # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 + # (b) For single sequences: + # tokens: [CLS] the dog is hairy . [SEP] + # type_ids: 0 0 0 0 0 0 0 + # + # Where "type_ids" are used to indicate whether this is the first + # sequence or the second sequence. The embedding vectors for `type=0` and + # `type=1` were learned during pre-training and are added to the wordpiece + # embedding vector (and position vector). This is not *strictly* necessary + # since the [SEP] token unambiguously separates the sequences, but it makes + # it easier for the model to learn the concept of sequences. + # + # For classification tasks, the first vector (corresponding to [CLS]) is + # used as as the "sentence vector". Note that this only makes sense because + # the entire model is fine-tuned. + tokens = [] + input_type_ids = [] + tokens.append("[CLS]") + input_type_ids.append(0) + for token in tokens_a: + tokens.append(token) + input_type_ids.append(0) + tokens.append("[SEP]") + input_type_ids.append(0) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + input_type_ids.append(1) + tokens.append("[SEP]") + input_type_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < seq_length: + input_ids.append(0) + input_mask.append(0) + input_type_ids.append(0) + + assert len(input_ids) == seq_length + assert len(input_mask) == seq_length + assert len(input_type_ids) == seq_length + + if ex_index < 5: + tf.logging.info("*** Example ***") + tf.logging.info("unique_id: %s" % (example.unique_id)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info( + "input_type_ids: %s" % " ".join([str(x) for x in input_type_ids])) + + features.append( + InputFeatures( + unique_id=example.unique_id, + tokens=tokens, + input_ids=input_ids, + input_mask=input_mask, + input_type_ids=input_type_ids)) + return features + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + + +def read_examples(input_file): + """Read a list of `InputExample`s from an input file.""" + examples = [] + unique_id = 0 + with tf.gfile.GFile(input_file, "r") as reader: + while True: + line = tokenization.convert_to_unicode(reader.readline()) + if not line: + break + line = line.strip() + text_a = None + text_b = None + m = re.match(r"^(.*) \|\|\| (.*)$", line) + if m is None: + text_a = line + else: + text_a = m.group(1) + text_b = m.group(2) + examples.append( + InputExample(unique_id=unique_id, text_a=text_a, text_b=text_b)) + unique_id += 1 + return examples + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + layer_indexes = [int(x) for x in FLAGS.layers.split(",")] + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + run_config = tf.contrib.tpu.RunConfig( + master=FLAGS.master, + tpu_config=tf.contrib.tpu.TPUConfig( + num_shards=FLAGS.num_tpu_cores, + per_host_input_for_training=is_per_host)) + + examples = read_examples(FLAGS.input_file) + + features = convert_examples_to_features( + examples=examples, seq_length=FLAGS.max_seq_length, tokenizer=tokenizer) + + unique_id_to_feature = {} + for feature in features: + unique_id_to_feature[feature.unique_id] = feature + + model_fn = model_fn_builder( + bert_config=bert_config, + init_checkpoint=FLAGS.init_checkpoint, + layer_indexes=layer_indexes, + use_tpu=FLAGS.use_tpu, + use_one_hot_embeddings=FLAGS.use_one_hot_embeddings) + + # If TPU is not available, this will fall back to normal Estimator on CPU + # or GPU. + estimator = tf.contrib.tpu.TPUEstimator( + use_tpu=FLAGS.use_tpu, + model_fn=model_fn, + config=run_config, + predict_batch_size=FLAGS.batch_size) + + input_fn = input_fn_builder( + features=features, seq_length=FLAGS.max_seq_length) + + with codecs.getwriter("utf-8")(tf.gfile.Open(FLAGS.output_file, + "w")) as writer: + for result in estimator.predict(input_fn, yield_single_examples=True): + unique_id = int(result["unique_id"]) + feature = unique_id_to_feature[unique_id] + output_json = collections.OrderedDict() + output_json["linex_index"] = unique_id + all_features = [] + for (i, token) in enumerate(feature.tokens): + all_layers = [] + for (j, layer_index) in enumerate(layer_indexes): + layer_output = result["layer_output_%d" % j] + layers = collections.OrderedDict() + layers["index"] = layer_index + layers["values"] = [ + round(float(x), 6) for x in layer_output[i:(i + 1)].flat + ] + all_layers.append(layers) + features = collections.OrderedDict() + features["token"] = token + features["layers"] = all_layers + all_features.append(features) + output_json["features"] = all_features + writer.write(json.dumps(output_json) + "\n") + + +if __name__ == "__main__": + flags.mark_flag_as_required("input_file") + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("init_checkpoint") + flags.mark_flag_as_required("output_file") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fp16_utils.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fp16_utils.py new file mode 100644 index 0000000..6b8bda9 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fp16_utils.py @@ -0,0 +1,35 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import tensorflow as tf +import numpy as np + + +def float32_variable_storage_getter(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fused_layer_norm.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fused_layer_norm.py new file mode 100644 index 0000000..ff6e137 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/fused_layer_norm.py @@ -0,0 +1,141 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import copy +import json +import math +import re +import six +import tensorflow as tf + +from tensorflow.python.framework import ops +from tensorflow.contrib.layers.python.layers import utils +from tensorflow.contrib.framework.python.ops import variables +from tensorflow.python.ops import init_ops +import numpy +from tensorflow.python.ops import array_ops +from tensorflow.python.framework import dtypes +from tensorflow.python.ops import nn + +def fused_layer_norm(inputs, + center=True, + scale=True, + activation_fn=None, + reuse=None, + variables_collections=None, + outputs_collections=None, + trainable=True, + begin_norm_axis=1, + begin_params_axis=-1, + scope=None, + use_fused_batch_norm=False): + with tf.variable_scope( + scope, 'LayerNorm', [inputs], reuse=reuse) as sc: + inputs = ops.convert_to_tensor(inputs) + inputs_shape = inputs.shape + inputs_rank = inputs_shape.ndims + if inputs_rank is None: + raise ValueError('Inputs %s has undefined rank.' % inputs.name) + dtype = inputs.dtype.base_dtype + if begin_norm_axis < 0: + begin_norm_axis = inputs_rank + begin_norm_axis + if begin_params_axis >= inputs_rank or begin_norm_axis >= inputs_rank: + raise ValueError('begin_params_axis (%d) and begin_norm_axis (%d) ' + 'must be < rank(inputs) (%d)' % + (begin_params_axis, begin_norm_axis, inputs_rank)) + params_shape = inputs_shape[begin_params_axis:] + if not params_shape.is_fully_defined(): + raise ValueError( + 'Inputs %s: shape(inputs)[%s:] is not fully defined: %s' % + (inputs.name, begin_params_axis, inputs_shape)) + # Allocate parameters for the beta and gamma of the normalization. + beta, gamma = None, None + if center: + beta_collections = utils.get_variable_collections(variables_collections, + 'beta') + beta = variables.model_variable( + 'beta', + shape=params_shape, + dtype=dtype, + initializer=init_ops.zeros_initializer(), + collections=beta_collections, + trainable=trainable) + if scale: + gamma_collections = utils.get_variable_collections( + variables_collections, 'gamma') + gamma = variables.model_variable( + 'gamma', + shape=params_shape, + dtype=dtype, + initializer=init_ops.ones_initializer(), + collections=gamma_collections, + trainable=trainable) + if use_fused_batch_norm: + # get static TensorShape if fully defined, + # otherwise retrieve shape tensor + norm_shape = inputs.shape[begin_norm_axis:] + if norm_shape.is_fully_defined(): + bn_shape = [1, -1, 1, numpy.prod(norm_shape.as_list())] + else: + norm_shape = tf.shape(inputs)[begin_norm_axis:] + bn_shape = [1, -1, 1, tf.reduce_prod(norm_shape)] + if inputs.get_shape().is_fully_defined(): + outputs_shape = inputs.get_shape() + else: + outputs_shape = tf.shape(inputs) + inputs = array_ops.reshape(inputs, bn_shape) + if inputs.get_shape().is_fully_defined(): + # static inputs TensorShape fully defined after reshape. + ones = array_ops.ones(inputs.get_shape()[1], dtype=dtypes.float32) + zeros = array_ops.zeros(inputs.get_shape()[1], dtype=dtypes.float32) + else: + # static inputs TensorShape NOT fully defined after reshape. + # must use dynamic shape, which means these input tensors + # have to be created at runtime, which causes a slowdown. + scale_shape = tf.shape(inputs)[1] + ones = array_ops.ones(scale_shape, dtype=dtypes.float32) + zeros = array_ops.zeros(scale_shape, dtype=dtypes.float32) + outputs, mean, variance = nn.fused_batch_norm( + inputs, + ones, zeros, + epsilon=1e-4, + data_format="NCHW") + outputs = array_ops.reshape(outputs, outputs_shape) + if center and scale: + outputs = outputs * gamma + beta + elif center: + outputs = outputs + beta + elif scale: + outputs = outputs * gamma + else: + # Calculate the moments on the last axis (layer activations). + norm_axes = list(range(begin_norm_axis, inputs_rank)) + mean, variance = nn.moments(inputs, norm_axes, keep_dims=True) + # Compute layer normalization using the batch_normalization function. + variance_epsilon = 1e-4 + outputs = nn.batch_normalization( + inputs, + mean, + variance, + offset=beta, + scale=gamma, + variance_epsilon=variance_epsilon) + outputs.set_shape(inputs_shape) + if activation_fn is not None: + outputs = activation_fn(outputs) + return utils.collect_named_outputs(outputs_collections, sc.name, outputs) + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/gpu_environment.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/gpu_environment.py new file mode 100644 index 0000000..948c3fa --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/gpu_environment.py @@ -0,0 +1,36 @@ +# coding=utf-8 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tensorflow as tf +import numpy as np + +def float32_variable_storage_getter(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + +def get_custom_getter(compute_type): + return float32_variable_storage_getter if compute_type == tf.float16 else None diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/modeling.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/modeling.py new file mode 100644 index 0000000..95a8eda --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/modeling.py @@ -0,0 +1,1031 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The main BERT model and related functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import json +import math +import re +import numpy as np +import six +import tensorflow as tf + +from gpu_environment import get_custom_getter + +from npu_bridge.estimator.npu_unary_ops import npu_unary_ops +from npu_bridge.estimator import npu_ops + +class BertConfig(object): + """Configuration for `BertModel`.""" + + def __init__(self, + vocab_size, + hidden_size=768, + num_hidden_layers=12, + num_attention_heads=12, + intermediate_size=3072, + hidden_act="gelu", + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + max_position_embeddings=512, + type_vocab_size=16, + initializer_range=0.02): + """Constructs BertConfig. + + Args: + vocab_size: Vocabulary size of `inputs_ids` in `BertModel`. + hidden_size: Size of the encoder layers and the pooler layer. + num_hidden_layers: Number of hidden layers in the Transformer encoder. + num_attention_heads: Number of attention heads for each attention layer in + the Transformer encoder. + intermediate_size: The size of the "intermediate" (i.e., feed-forward) + layer in the Transformer encoder. + hidden_act: The non-linear activation function (function or string) in the + encoder and pooler. + hidden_dropout_prob: The dropout probability for all fully connected + layers in the embeddings, encoder, and pooler. + attention_probs_dropout_prob: The dropout ratio for the attention + probabilities. + max_position_embeddings: The maximum sequence length that this model might + ever be used with. Typically set this to something large just in case + (e.g., 512 or 1024 or 2048). + type_vocab_size: The vocabulary size of the `token_type_ids` passed into + `BertModel`. + initializer_range: The stdev of the truncated_normal_initializer for + initializing all weight matrices. + """ + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.hidden_act = hidden_act + self.intermediate_size = intermediate_size + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.type_vocab_size = type_vocab_size + self.initializer_range = initializer_range + + @classmethod + def from_dict(cls, json_object): + """Constructs a `BertConfig` from a Python dictionary of parameters.""" + config = BertConfig(vocab_size=None) + for (key, value) in six.iteritems(json_object): + config.__dict__[key] = value + return config + + @classmethod + def from_json_file(cls, json_file): + """Constructs a `BertConfig` from a json file of parameters.""" + with tf.gfile.GFile(json_file, "r") as reader: + text = reader.read() + return cls.from_dict(json.loads(text)) + + def to_dict(self): + """Serializes this instance to a Python dictionary.""" + output = copy.deepcopy(self.__dict__) + return output + + def to_json_string(self): + """Serializes this instance to a JSON string.""" + return json.dumps(self.to_dict(), indent=2, sort_keys=True) + "\n" + + +class BertModel(object): + """BERT model ("Bidirectional Encoder Representations from Transformers"). + + Example usage: + + ```python + # Already been converted into WordPiece token ids + input_ids = tf.constant([[31, 51, 99], [15, 5, 0]]) + input_mask = tf.constant([[1, 1, 1], [1, 1, 0]]) + token_type_ids = tf.constant([[0, 0, 1], [0, 2, 0]]) + + config = modeling.BertConfig(vocab_size=32000, hidden_size=512, + num_hidden_layers=8, num_attention_heads=6, intermediate_size=1024) + + model = modeling.BertModel(config=config, is_training=True, + input_ids=input_ids, input_mask=input_mask, token_type_ids=token_type_ids) + + label_embeddings = tf.get_variable(...) + pooled_output = model.get_pooled_output() + logits = tf.matmul(pooled_output, label_embeddings) + ... + ``` + """ + + def __init__(self, + config, + is_training, + input_ids, + input_mask=None, + token_type_ids=None, + use_one_hot_embeddings=False, + scope=None, + compute_type=tf.float32): + """Constructor for BertModel. + + Args: + config: `BertConfig` instance. + is_training: bool. true for training model, false for eval model. Controls + whether dropout will be applied. + input_ids: int32 Tensor of shape [batch_size, seq_length]. + input_mask: (optional) int32 Tensor of shape [batch_size, seq_length]. + token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. + use_one_hot_embeddings: (optional) bool. Whether to use one-hot word + embeddings or tf.embedding_lookup() for the word embeddings. On the TPU, + it is much faster if this is True, on the CPU or GPU, it is faster if + this is False. + scope: (optional) variable scope. Defaults to "bert". + compute_type: (optional) either float32 or float16. Only applies to GPUs. + + Raises: + ValueError: The config is invalid or one of the input tensor shapes + is invalid. + """ + config = copy.deepcopy(config) + if not is_training: + config.hidden_dropout_prob = 0.0 + config.attention_probs_dropout_prob = 0.0 + + input_shape = get_shape_list(input_ids, expected_rank=2) + batch_size = input_shape[0] + seq_length = input_shape[1] + + if input_mask is None: + input_mask = tf.ones(shape=[batch_size, seq_length], dtype=tf.int32) + + if token_type_ids is None: + token_type_ids = tf.zeros(shape=[batch_size, seq_length], dtype=tf.int32) + + with tf.variable_scope(scope, default_name="bert", custom_getter=get_custom_getter(compute_type)): + with tf.variable_scope("embeddings"): + # For good convergence with mixed precision training, + # it is important that the embedding codes remain fp32. + # Perform embedding lookup on the word ids. + (self.embedding_output, self.embedding_table) = embedding_lookup( + input_ids=input_ids, + vocab_size=config.vocab_size, + embedding_size=config.hidden_size, + initializer_range=config.initializer_range, + word_embedding_name="word_embeddings", + use_one_hot_embeddings=use_one_hot_embeddings) + + # Add positional embeddings and token type embeddings, then layer + # normalize and perform dropout. + self.embedding_output = embedding_postprocessor( + input_tensor=self.embedding_output, + use_token_type=True, + token_type_ids=token_type_ids, + token_type_vocab_size=config.type_vocab_size, + token_type_embedding_name="token_type_embeddings", + use_position_embeddings=True, + position_embedding_name="position_embeddings", + initializer_range=config.initializer_range, + max_position_embeddings=config.max_position_embeddings, + dropout_prob=config.hidden_dropout_prob, + use_one_hot_embeddings=use_one_hot_embeddings) + + with tf.variable_scope("encoder"): + # This converts a 2D mask of shape [batch_size, seq_length] to a 3D + # mask of shape [batch_size, seq_length, seq_length] which is used + # for the attention scores. + attention_mask = create_attention_mask_from_input_mask( + input_ids, input_mask) + + # Run the stacked transformer. + # `sequence_output` shape = [batch_size, seq_length, hidden_size]. + self.all_encoder_layers = transformer_model( + input_tensor=tf.saturate_cast(self.embedding_output, compute_type), + attention_mask=attention_mask, + hidden_size=config.hidden_size, + num_hidden_layers=config.num_hidden_layers, + num_attention_heads=config.num_attention_heads, + intermediate_size=config.intermediate_size, + intermediate_act_fn=get_activation(config.hidden_act), + hidden_dropout_prob=config.hidden_dropout_prob, + attention_probs_dropout_prob=config.attention_probs_dropout_prob, + initializer_range=config.initializer_range, + do_return_all_layers=True) + self.sequence_output = tf.cast(self.all_encoder_layers[-1], tf.float32) + # The "pooler" converts the encoded sequence tensor of shape + # [batch_size, seq_length, hidden_size] to a tensor of shape + # [batch_size, hidden_size]. This is necessary for segment-level + # (or segment-pair-level) classification tasks where we need a fixed + # dimensional representation of the segment. + with tf.variable_scope("pooler"): + # We "pool" the model by simply taking the hidden state corresponding + # to the first token. We assume that this has been pre-trained + first_token_tensor = tf.squeeze(self.sequence_output[:, 0:1, :], axis=1) + if tf.flags.FLAGS.use_fp16_cls: + first_token_tensor = tf.cast(first_token_tensor, tf.float16) + self_pooled_output = tf.layers.dense( + first_token_tensor, + config.hidden_size, + activation=tf.tanh, + kernel_initializer=create_initializer(config.initializer_range)) + self.pooled_output = tf.cast(self_pooled_output, tf.float32) + + def get_pooled_output(self): + return self.pooled_output + + def get_sequence_output(self): + """Gets final hidden layer of encoder. + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size] corresponding + to the final hidden of the transformer encoder. + """ + return self.sequence_output + + def get_all_encoder_layers(self): + return self.all_encoder_layers + + def get_embedding_output(self): + """Gets output of the embedding lookup (i.e., input to the transformer). + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size] corresponding + to the output of the embedding layer, after summing the word + embeddings with the positional embeddings and the token type embeddings, + then performing layer normalization. This is the input to the transformer. + """ + return self.embedding_output + + def get_embedding_table(self): + return self.embedding_table + + +def gelu(x): + """Gaussian Error Linear Unit. + + This is a smoother version of the RELU. + Original paper: https://arxiv.org/abs/1606.08415 + Args: + x: float Tensor to perform activation. + + Returns: + `x` with the GELU activation applied. + """ + + if tf.flags.FLAGS.npu_bert_fused_gelu: + return npu_unary_ops.gelu(x) + else: + cdf = 0.5 * (1.0 + tf.tanh( + (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))) + return x * cdf + + + +def get_activation(activation_string): + """Maps a string to a Python function, e.g., "relu" => `tf.nn.relu`. + + Args: + activation_string: String name of the activation function. + + Returns: + A Python function corresponding to the activation function. If + `activation_string` is None, empty, or "linear", this will return None. + If `activation_string` is not a string, it will return `activation_string`. + + Raises: + ValueError: The `activation_string` does not correspond to a known + activation. + """ + + # We assume that anything that"s not a string is already an activation + # function, so we just return it. + if not isinstance(activation_string, six.string_types): + return activation_string + + if not activation_string: + return None + + act = activation_string.lower() + if act == "linear": + return None + elif act == "relu": + return tf.nn.relu + elif act == "gelu": + return gelu + elif act == "tanh": + return tf.tanh + else: + raise ValueError("Unsupported activation: %s" % act) + + +def get_assignment_map_from_checkpoint(tvars, init_checkpoint): + """Compute the union of the current variables and checkpoint variables.""" + assignment_map = {} + initialized_variable_names = {} + + name_to_variable = collections.OrderedDict() + for var in tvars: + name = var.name + m = re.match("^(.*):\\d+$", name) + if m is not None: + name = m.group(1) + name_to_variable[name] = var + + init_vars = tf.train.list_variables(init_checkpoint) + + assignment_map = collections.OrderedDict() + for x in init_vars: + (name, var) = (x[0], x[1]) + if name not in name_to_variable: + continue + assignment_map[name] = name + initialized_variable_names[name] = 1 + initialized_variable_names[name + ":0"] = 1 + + return (assignment_map, initialized_variable_names) + + +def dropout(input_tensor, dropout_prob): + """Perform dropout. + + Args: + input_tensor: float Tensor. + dropout_prob: Python float. The probability of dropping out a value (NOT of + *keeping* a dimension as in `tf.nn.dropout`). + + Returns: + A version of `input_tensor` with dropout applied. + """ + + if tf.flags.FLAGS.npu_bert_debug: + return input_tensor + + if dropout_prob is None or dropout_prob == 0.0: + return input_tensor + + if tf.flags.FLAGS.npu_bert_npu_dropout: + output = npu_ops.dropout(input_tensor, 1.0 - dropout_prob) + else: + output = tf.nn.dropout(input_tensor, 1.0 - dropout_prob) + return output + + +def layer_norm(input_tensor, name=None): + """Run layer normalization on the last dimension of the tensor.""" + if input_tensor.dtype == tf.float16: + try: + from fused_layer_norm import fused_layer_norm + return fused_layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name, + use_fused_batch_norm=True) + except ImportError: + return tf.contrib.layers.layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name) + else: + return tf.contrib.layers.layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name) + + +def layer_norm_and_dropout(input_tensor, dropout_prob, name=None): + """Runs layer normalization followed by dropout.""" + output_tensor = layer_norm(input_tensor, name) + output_tensor = dropout(output_tensor, dropout_prob) + return output_tensor + + +def create_initializer(initializer_range=0.02): + """Creates a `truncated_normal_initializer` with the given range.""" + return tf.truncated_normal_initializer(stddev=initializer_range) + + +def embedding_lookup(input_ids, + vocab_size, + embedding_size=128, + initializer_range=0.02, + word_embedding_name="word_embeddings", + use_one_hot_embeddings=False): + """Looks up words embeddings for id tensor. + + Args: + input_ids: int32 Tensor of shape [batch_size, seq_length] containing word + ids. + vocab_size: int. Size of the embedding vocabulary. + embedding_size: int. Width of the word embeddings. + initializer_range: float. Embedding initialization range. + word_embedding_name: string. Name of the embedding table. + use_one_hot_embeddings: bool. If True, use one-hot method for word + embeddings. If False, use `tf.gather()`. + + Returns: + float Tensor of shape [batch_size, seq_length, embedding_size]. + """ + # This function assumes that the input is of shape [batch_size, seq_length, + # num_inputs]. + # + # If the input is a 2D tensor of shape [batch_size, seq_length], we + # reshape to [batch_size, seq_length, 1]. + if input_ids.shape.ndims == 2: + input_ids = tf.expand_dims(input_ids, axis=[-1]) + + embedding_table = tf.get_variable( + name=word_embedding_name, + shape=[vocab_size, embedding_size], + initializer=create_initializer(initializer_range)) + + flat_input_ids = tf.reshape(input_ids, [-1]) + if use_one_hot_embeddings: + one_hot_input_ids = tf.one_hot(flat_input_ids, depth=vocab_size) + output = tf.matmul(one_hot_input_ids, embedding_table) + else: + if tf.flags.FLAGS.npu_gather: + output = gather_npu(embedding_table, flat_input_ids) + else: + output = tf.gather(embedding_table, flat_input_ids) + + input_shape = get_shape_list(input_ids) + + output = tf.reshape(output, + input_shape[0:-1] + [input_shape[-1] * embedding_size]) + return (output, embedding_table) + + +def embedding_postprocessor(input_tensor, + use_token_type=False, + token_type_ids=None, + token_type_vocab_size=16, + token_type_embedding_name="token_type_embeddings", + use_position_embeddings=True, + position_embedding_name="position_embeddings", + initializer_range=0.02, + max_position_embeddings=512, + dropout_prob=0.1, + use_one_hot_embeddings=False): + """Performs various post-processing on a word embedding tensor. + + Args: + input_tensor: float Tensor of shape [batch_size, seq_length, + embedding_size]. + use_token_type: bool. Whether to add embeddings for `token_type_ids`. + token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. + Must be specified if `use_token_type` is True. + token_type_vocab_size: int. The vocabulary size of `token_type_ids`. + token_type_embedding_name: string. The name of the embedding table variable + for token type ids. + use_position_embeddings: bool. Whether to add position embeddings for the + position of each token in the sequence. + position_embedding_name: string. The name of the embedding table variable + for positional embeddings. + initializer_range: float. Range of the weight initialization. + max_position_embeddings: int. Maximum sequence length that might ever be + used with this model. This can be longer than the sequence length of + input_tensor, but cannot be shorter. + dropout_prob: float. Dropout probability applied to the final output tensor. + use_one_hot_embeddings: (optional) bool. Whether to use one-hot word + embeddings or tf.embedding_lookup() for the word embeddings. + + Returns: + float tensor with same shape as `input_tensor`. + + Raises: + ValueError: One of the tensor shapes or input values is invalid. + """ + input_shape = get_shape_list(input_tensor, expected_rank=3) + batch_size = input_shape[0] + seq_length = input_shape[1] + width = input_shape[2] + + output = input_tensor + + if use_token_type: + if token_type_ids is None: + raise ValueError("`token_type_ids` must be specified if" + "`use_token_type` is True.") + token_type_table = tf.get_variable( + name=token_type_embedding_name, + shape=[token_type_vocab_size, width], + initializer=create_initializer(initializer_range)) + flat_token_type_ids = tf.reshape(token_type_ids, [-1]) + if use_one_hot_embeddings: + # This vocab will be small so we always do one-hot here, since it is + # always faster for a small vocabulary. + one_hot_ids = tf.one_hot(flat_token_type_ids, depth=token_type_vocab_size) + token_type_embeddings = tf.matmul(one_hot_ids, token_type_table) + else: + if tf.flags.FLAGS.npu_gather: + token_type_embeddings = gather_npu(token_type_table, flat_token_type_ids) + else: + token_type_embeddings = tf.gather(token_type_table, flat_token_type_ids) + token_type_embeddings = tf.reshape(token_type_embeddings, + [batch_size, seq_length, width]) + output += token_type_embeddings + + if use_position_embeddings: + full_position_embeddings = tf.get_variable( + name=position_embedding_name, + shape=[max_position_embeddings, width], + initializer=create_initializer(initializer_range)) + # Since the position embedding table is a learned variable, we create it + # using a (long) sequence length `max_position_embeddings`. The actual + # sequence length might be shorter than this, for faster training of + # tasks that do not have long sequences. + # + # So `full_position_embeddings` is effectively an embedding table + # for position [0, 1, 2, ..., max_position_embeddings-1], and the current + # sequence has positions [0, 1, 2, ... seq_length-1], so we can just + # perform a slice. + position_embeddings = tf.slice(full_position_embeddings, [0, 0], + [seq_length, width]) + num_dims = len(output.shape.as_list()) + + # Only the last two dimensions are relevant (`seq_length` and `width`), so + # we broadcast among the first dimensions, which is typically just + # the batch size. + position_broadcast_shape = [] + for _ in range(num_dims - 2): + position_broadcast_shape.append(1) + position_broadcast_shape.extend([seq_length, width]) + position_embeddings = tf.reshape(position_embeddings, + position_broadcast_shape) + output += position_embeddings + + output = layer_norm_and_dropout(output, dropout_prob) + return output + + +def create_attention_mask_from_input_mask(from_tensor, to_mask): + """Create 3D attention mask from a 2D tensor mask. + + Args: + from_tensor: 2D or 3D Tensor of shape [batch_size, from_seq_length, ...]. + to_mask: int32 Tensor of shape [batch_size, to_seq_length]. + + Returns: + float Tensor of shape [batch_size, from_seq_length, to_seq_length]. + """ + to_mask = tf.cast(to_mask, dtype=tf.float32) + + from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) + batch_size = from_shape[0] + + to_shape = get_shape_list(to_mask, expected_rank=2) + to_seq_length = to_shape[1] + + to_mask = tf.reshape(to_mask, [batch_size, 1, to_seq_length]) + # The mask will be automatically broadcasted to + # [batch_size, from_seq_length, to_seq_length] when it is used in the + # attention layer. + return to_mask + +def attention_layer(from_tensor, + to_tensor, + attention_mask=None, + num_attention_heads=1, + size_per_head=512, + query_act=None, + key_act=None, + value_act=None, + attention_probs_dropout_prob=0.0, + initializer_range=0.02, + do_return_2d_tensor=False, + batch_size=None, + from_seq_length=None, + to_seq_length=None): + """Performs multi-headed attention from `from_tensor` to `to_tensor`. + + This is an implementation of multi-headed attention based on "Attention + is all you Need". If `from_tensor` and `to_tensor` are the same, then + this is self-attention. Each timestep in `from_tensor` attends to the + corresponding sequence in `to_tensor`, and returns a fixed-with vector. + + This function first projects `from_tensor` into a "query" tensor and + `to_tensor` into "key" and "value" tensors. These are (effectively) a list + of tensors of length `num_attention_heads`, where each tensor is of shape + [batch_size, seq_length, size_per_head]. + + Then, the query and key tensors are dot-producted and scaled. These are + softmaxed to obtain attention probabilities. The value tensors are then + interpolated by these probabilities, then concatenated back to a single + tensor and returned. + + In practice, the multi-headed attention are done with transposes and + reshapes rather than actual separate tensors. + + Args: + from_tensor: float Tensor of shape [batch_size, from_seq_length, + from_width]. + to_tensor: float Tensor of shape [batch_size, to_seq_length, to_width]. + attention_mask: (optional) int32 Tensor of shape [batch_size, + from_seq_length, to_seq_length]. The values should be 1 or 0. The + attention scores will effectively be set to -infinity for any positions in + the mask that are 0, and will be unchanged for positions that are 1. + num_attention_heads: int. Number of attention heads. + size_per_head: int. Size of each attention head. + query_act: (optional) Activation function for the query transform. + key_act: (optional) Activation function for the key transform. + value_act: (optional) Activation function for the value transform. + attention_probs_dropout_prob: (optional) float. Dropout probability of the + attention probabilities. + initializer_range: float. Range of the weight initializer. + do_return_2d_tensor: bool. If True, the output will be of shape [batch_size + * from_seq_length, num_attention_heads * size_per_head]. If False, the + output will be of shape [batch_size, from_seq_length, num_attention_heads + * size_per_head]. + batch_size: (Optional) int. If the input is 2D, this might be the batch size + of the 3D version of the `from_tensor` and `to_tensor`. + from_seq_length: (Optional) If the input is 2D, this might be the seq length + of the 3D version of the `from_tensor`. + to_seq_length: (Optional) If the input is 2D, this might be the seq length + of the 3D version of the `to_tensor`. + + Returns: + float Tensor of shape [batch_size, from_seq_length, + num_attention_heads * size_per_head]. (If `do_return_2d_tensor` is + true, this will be of shape [batch_size * from_seq_length, + num_attention_heads * size_per_head]). + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + + def transpose_for_scores(input_tensor, batch_size, num_attention_heads, + seq_length, width): + output_tensor = tf.reshape( + input_tensor, [batch_size, seq_length, num_attention_heads, width]) + + output_tensor = tf.transpose(output_tensor, [0, 2, 1, 3]) + return output_tensor + + from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) + to_shape = get_shape_list(to_tensor, expected_rank=[2, 3]) + + if len(from_shape) != len(to_shape): + raise ValueError( + "The rank of `from_tensor` must match the rank of `to_tensor`.") + + if len(from_shape) == 3: + batch_size = from_shape[0] + from_seq_length = from_shape[1] + to_seq_length = to_shape[1] + elif len(from_shape) == 2: + if (batch_size is None or from_seq_length is None or to_seq_length is None): + raise ValueError( + "When passing in rank 2 tensors to attention_layer, the values " + "for `batch_size`, `from_seq_length`, and `to_seq_length` " + "must all be specified.") + + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # F = `from_tensor` sequence length + # T = `to_tensor` sequence length + # N = `num_attention_heads` + # H = `size_per_head` + + from_tensor_2d = reshape_to_matrix(from_tensor) + to_tensor_2d = reshape_to_matrix(to_tensor) + + # `query_layer` = [B*F, N*H] + query_layer = tf.layers.dense( + from_tensor_2d, + num_attention_heads * size_per_head, + activation=query_act, + name="query", + kernel_initializer=create_initializer(initializer_range)) + + # `key_layer` = [B*T, N*H] + key_layer = tf.layers.dense( + to_tensor_2d, + num_attention_heads * size_per_head, + activation=key_act, + name="key", + kernel_initializer=create_initializer(initializer_range)) + + # `value_layer` = [B*T, N*H] + value_layer = tf.layers.dense( + to_tensor_2d, + num_attention_heads * size_per_head, + activation=value_act, + name="value", + kernel_initializer=create_initializer(initializer_range)) + + # `query_layer` = [B, N, F, H] + query_layer = transpose_for_scores(query_layer, batch_size, + num_attention_heads, from_seq_length, + size_per_head) + + # `key_layer` = [B, N, T, H] + key_layer = transpose_for_scores(key_layer, batch_size, num_attention_heads, + to_seq_length, size_per_head) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + # `attention_scores` = [B, N, F, T] + attention_scores = tf.matmul(query_layer, key_layer, transpose_b=True) + attention_scores = tf.multiply(attention_scores, + 1.0 / math.sqrt(float(size_per_head))) + + if attention_mask is not None: + # `attention_mask` = [B, 1, F, T] + attention_mask = tf.expand_dims(attention_mask, axis=[1]) + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and -10000.0 for masked positions. + adder = (1.0 - tf.cast(attention_mask, attention_scores.dtype)) * -10000.0 + + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. + attention_scores += adder + + # Normalize the attention scores to probabilities. + # `attention_probs` = [B, N, F, T] + attention_probs = tf.nn.softmax(attention_scores) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = dropout(attention_probs, attention_probs_dropout_prob) + + # `value_layer` = [B, T, N, H] + value_layer = tf.reshape( + value_layer, + [batch_size, to_seq_length, num_attention_heads, size_per_head]) + + # `value_layer` = [B, N, T, H] + value_layer = tf.transpose(value_layer, [0, 2, 1, 3]) + + # `context_layer` = [B, N, F, H] + context_layer = tf.matmul(attention_probs, value_layer) + + # `context_layer` = [B, F, N, H] + context_layer = tf.transpose(context_layer, [0, 2, 1, 3]) + + if do_return_2d_tensor: + # `context_layer` = [B*F, N*H] + context_layer = tf.reshape( + context_layer, + [batch_size * from_seq_length, num_attention_heads * size_per_head]) + else: + # `context_layer` = [B, F, N*H] + context_layer = tf.reshape( + context_layer, + [batch_size, from_seq_length, num_attention_heads * size_per_head]) + + return context_layer + + +def transformer_model(input_tensor, + attention_mask=None, + hidden_size=768, + num_hidden_layers=12, + num_attention_heads=12, + intermediate_size=3072, + intermediate_act_fn=gelu, + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + initializer_range=0.02, + do_return_all_layers=False): + """Multi-headed, multi-layer Transformer from "Attention is All You Need". + + This is almost an exact implementation of the original Transformer encoder. + + See the original paper: + https://arxiv.org/abs/1706.03762 + + Also see: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py + + Args: + input_tensor: float Tensor of shape [batch_size, seq_length, hidden_size]. + attention_mask: (optional) int32 Tensor of shape [batch_size, seq_length, + seq_length], with 1 for positions that can be attended to and 0 in + positions that should not be. + hidden_size: int. Hidden size of the Transformer. + num_hidden_layers: int. Number of layers (blocks) in the Transformer. + num_attention_heads: int. Number of attention heads in the Transformer. + intermediate_size: int. The size of the "intermediate" (a.k.a., feed + forward) layer. + intermediate_act_fn: function. The non-linear activation function to apply + to the output of the intermediate/feed-forward layer. + hidden_dropout_prob: float. Dropout probability for the hidden layers. + attention_probs_dropout_prob: float. Dropout probability of the attention + probabilities. + initializer_range: float. Range of the initializer (stddev of truncated + normal). + do_return_all_layers: Whether to also return all layers or just the final + layer. + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size], the final + hidden layer of the Transformer. + + Raises: + ValueError: A Tensor shape or parameter is invalid. + """ + if hidden_size % num_attention_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (hidden_size, num_attention_heads)) + + attention_head_size = int(hidden_size / num_attention_heads) + input_shape = get_shape_list(input_tensor, expected_rank=3) + batch_size = input_shape[0] + seq_length = input_shape[1] + input_width = input_shape[2] + + # The Transformer performs sum residuals on all layers so the input needs + # to be the same as the hidden size. + if input_width != hidden_size: + raise ValueError("The width of the input tensor (%d) != hidden size (%d)" % + (input_width, hidden_size)) + + # We keep the representation as a 2D tensor to avoid re-shaping it back and + # forth from a 3D tensor to a 2D tensor. Re-shapes are normally free on + # the GPU/CPU but may not be free on the TPU, so we want to minimize them to + # help the optimizer. + prev_output = reshape_to_matrix(input_tensor) + + all_layer_outputs = [] + for layer_idx in range(num_hidden_layers): + with tf.variable_scope("layer_%d" % layer_idx): + layer_input = prev_output + + with tf.variable_scope("attention"): + attention_heads = [] + with tf.variable_scope("self"): + attention_head = attention_layer( + from_tensor=layer_input, + to_tensor=layer_input, + attention_mask=attention_mask, + num_attention_heads=num_attention_heads, + size_per_head=attention_head_size, + attention_probs_dropout_prob=attention_probs_dropout_prob, + initializer_range=initializer_range, + do_return_2d_tensor=True, + batch_size=batch_size, + from_seq_length=seq_length, + to_seq_length=seq_length) + attention_heads.append(attention_head) + + attention_output = None + if len(attention_heads) == 1: + attention_output = attention_heads[0] + else: + # In the case where we have other sequences, we just concatenate + # them to the self-attention head before the projection. + attention_output = tf.concat(attention_heads, axis=-1) + + # Run a linear projection of `hidden_size` then add a residual + # with `layer_input`. + with tf.variable_scope("output"): + attention_output = tf.layers.dense( + attention_output, + hidden_size, + kernel_initializer=create_initializer(initializer_range)) + attention_output = dropout(attention_output, hidden_dropout_prob) + attention_output = layer_norm(attention_output + layer_input) + + # The activation is only applied to the "intermediate" hidden layer. + with tf.variable_scope("intermediate"): + intermediate_output = tf.layers.dense( + attention_output, + intermediate_size, + activation=intermediate_act_fn, + kernel_initializer=create_initializer(initializer_range)) + + # Down-project back to `hidden_size` then add the residual. + with tf.variable_scope("output"): + layer_output = tf.layers.dense( + intermediate_output, + hidden_size, + kernel_initializer=create_initializer(initializer_range)) + layer_output = dropout(layer_output, hidden_dropout_prob) + layer_output = layer_norm(layer_output + attention_output) + prev_output = layer_output + all_layer_outputs.append(layer_output) + + if do_return_all_layers: + final_outputs = [] + for layer_output in all_layer_outputs: + final_output = reshape_from_matrix(layer_output, input_shape) + final_outputs.append(final_output) + return final_outputs + else: + final_output = reshape_from_matrix(prev_output, input_shape) + return final_output + + +def get_shape_list(tensor, expected_rank=None, name=None): + """Returns a list of the shape of tensor, preferring static dimensions. + + Args: + tensor: A tf.Tensor object to find the shape of. + expected_rank: (optional) int. The expected rank of `tensor`. If this is + specified and the `tensor` has a different rank, and exception will be + thrown. + name: Optional name of the tensor for the error message. + + Returns: + A list of dimensions of the shape of tensor. All static dimensions will + be returned as python integers, and dynamic dimensions will be returned + as tf.Tensor scalars. + """ + if name is None: + name = tensor.name + + if expected_rank is not None: + assert_rank(tensor, expected_rank, name) + + shape = tensor.shape.as_list() + + non_static_indexes = [] + for (index, dim) in enumerate(shape): + if dim is None: + non_static_indexes.append(index) + + if not non_static_indexes: + return shape + + dyn_shape = tf.shape(tensor) + for index in non_static_indexes: + shape[index] = dyn_shape[index] + return shape + + +def reshape_to_matrix(input_tensor): + """Reshapes a >= rank 2 tensor to a rank 2 tensor (i.e., a matrix).""" + ndims = input_tensor.shape.ndims + if ndims < 2: + raise ValueError("Input tensor must have at least rank 2. Shape = %s" % + (input_tensor.shape)) + if ndims == 2: + return input_tensor + + width = input_tensor.shape[-1] + output_tensor = tf.reshape(input_tensor, [-1, width]) + return output_tensor + + +def reshape_from_matrix(output_tensor, orig_shape_list): + """Reshapes a rank 2 tensor back to its original rank >= 2 tensor.""" + if len(orig_shape_list) == 2: + return output_tensor + + output_shape = get_shape_list(output_tensor) + + orig_dims = orig_shape_list[0:-1] + width = output_shape[-1] + + return tf.reshape(output_tensor, orig_dims + [width]) + + +def assert_rank(tensor, expected_rank, name=None): + """Raises an exception if the tensor rank is not of the expected rank. + + Args: + tensor: A tf.Tensor to check the rank of. + expected_rank: Python integer or list of integers, expected rank. + name: Optional name of the tensor for the error message. + + Raises: + ValueError: If the expected shape doesn't match the actual shape. + """ + if name is None: + name = tensor.name + + expected_rank_dict = {} + if isinstance(expected_rank, six.integer_types): + expected_rank_dict[expected_rank] = True + else: + for x in expected_rank: + expected_rank_dict[x] = True + + actual_rank = tensor.shape.ndims + if actual_rank not in expected_rank_dict: + scope_name = tf.get_variable_scope().name + raise ValueError( + "For the tensor `%s` in scope `%s`, the actual rank " + "`%d` (shape = %s) is not equal to the expected rank `%s`" % + (name, scope_name, actual_rank, str(tensor.shape), str(expected_rank))) + +@tf.custom_gradient +def gather_npu(params, indices): + def grad(dy): + params_shape = tf.shape(params, out_type=tf.int64) + params_shape = tf.cast(params_shape, tf.int32) + grad_gather = tf.unsorted_segment_sum(dy, indices, params_shape[0]) + return grad_gather, None + return tf.gather(params, indices), grad + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/optimization.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/optimization.py new file mode 100644 index 0000000..d4a67ce --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/optimization.py @@ -0,0 +1,439 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Functions and classes related to optimization (weight updates).""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import re +import tensorflow as tf +from tensorflow.python.ops import array_ops +from tensorflow.python.ops import linalg_ops +from tensorflow.python.ops import math_ops + +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu import npu_loss_scale_optimizer as lso +from npu_bridge.estimator.npu import npu_loss_scale_manager as lsm_lib + +def create_optimizer(loss, init_lr, num_train_steps, num_warmup_steps, hvd=None, manual_fp16=False, use_fp16=False, num_accumulation_steps=1, + optimizer_type="adam", allreduce_post_accumulation=False): + """Creates an optimizer training op.""" + global_step = tf.train.get_or_create_global_step() + + # avoid step change in learning rate at end of warmup phase + if optimizer_type == "adam": + power = 1.0 + decayed_learning_rate_at_crossover_point = init_lr * ( + (1.0 - float(num_warmup_steps) / float(num_train_steps)) ** power) + else: + power = 0.5 + decayed_learning_rate_at_crossover_point = init_lr + + adjusted_init_lr = init_lr * (init_lr / decayed_learning_rate_at_crossover_point) + print('decayed_learning_rate_at_crossover_point = %e, adjusted_init_lr = %e' % (decayed_learning_rate_at_crossover_point, adjusted_init_lr)) + + learning_rate = tf.constant(value=init_lr, shape=[], dtype=tf.float32) + + # Implements linear decay of the learning rate. + learning_rate = tf.train.polynomial_decay( + learning_rate, + global_step, + num_train_steps, + end_learning_rate=0.0, + power=power, + cycle=False) + + # Implements linear warmup. I.e., if global_step < num_warmup_steps, the + # learning rate will be `global_step/num_warmup_steps * init_lr`. + if num_warmup_steps: + global_steps_int = tf.cast(global_step, tf.int32) + warmup_steps_int = tf.constant(num_warmup_steps, dtype=tf.int32) + + global_steps_float = tf.cast(global_steps_int, tf.float32) + warmup_steps_float = tf.cast(warmup_steps_int, tf.float32) + + warmup_percent_done = global_steps_float / warmup_steps_float + warmup_learning_rate = init_lr * warmup_percent_done + + is_warmup = tf.cast(global_steps_int < warmup_steps_int, tf.float32) + learning_rate = ( + (1.0 - is_warmup) * learning_rate + is_warmup * warmup_learning_rate) + + if optimizer_type == "lamb": + print("Initializing LAMB Optimizer") + optimizer = LAMBOptimizer( + learning_rate=learning_rate, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"]) + else: + print("Initializing ADAM Weight Decay Optimizer") + # It is recommended that you use this optimizer for fine tuning, since this + # is how the model was trained (note that the Adam m/v variables are NOT + # loaded from init_checkpoint.) + optimizer = AdamWeightDecayOptimizer( + learning_rate=learning_rate, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-4, + exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"]) + + if hvd is not None and (num_accumulation_steps == 1 or (not allreduce_post_accumulation)): + optimizer = hvd.DistributedOptimizer(optimizer, sparse_as_dense=True, compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) + + optimizer = NPUDistributedOptimizer(optimizer) + if tf.flags.FLAGS.npu_bert_loss_scale not in [None, -1]: + opt_tmp = optimizer + if tf.flags.FLAGS.npu_bert_loss_scale == 0: + loss_scale_manager = lsm_lib.ExponentialUpdateLossScaleManager(init_loss_scale=tf.flags.FLAGS.init_loss_scale_value, incr_every_n_steps=1000, decr_every_n_nan_or_inf=2, decr_ratio=0.5) + elif tf.flags.FLAGS.npu_bert_loss_scale >= 1: + loss_scale_manager = lsm_lib.FixedLossScaleManager(loss_scale=tf.flags.FLAGS.npu_bert_loss_scale) + else: + raise ValueError("Invalid loss scale: %d" % tf.flags.FLAGS.npu_bert_loss_scale) + optimizer = lso.NPULossScaleOptimizer(opt_tmp, loss_scale_manager, is_distributed=tf.flags.FLAGS.distributed) + + tvars = tf.trainable_variables() + grads_and_vars = optimizer.compute_gradients(loss * 1.0 / num_accumulation_steps, tvars) + + if num_accumulation_steps > 1: + local_step = tf.get_variable(name="local_step", shape=[], dtype=tf.int32, trainable=False, + initializer=tf.zeros_initializer) + batch_finite = tf.get_variable(name="batch_finite", shape=[], dtype=tf.bool, trainable=False, + initializer=tf.ones_initializer) + accum_vars = [tf.get_variable( + name=tvar.name.split(":")[0] + "/accum", + shape=tvar.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) for tvar in tf.trainable_variables()] + + reset_step = tf.cast(tf.math.equal(local_step % num_accumulation_steps, 0), dtype=tf.bool) + local_step = tf.cond(reset_step, lambda:local_step.assign(tf.ones_like(local_step)), lambda:local_step.assign_add(1)) + + with tf.name_scope(accumulate_step): + grads_and_vars_and_accums = [(gv[0],gv[1],accum_vars[i]) for i, gv in enumerate(grads_and_vars) if gv[0] is not None] + grads, tvars, accum_vars = list(zip(*grads_and_vars_and_accums)) + + all_are_finite = tf.reduce_all([tf.reduce_all(tf.is_finite(g)) for g in grads]) if (tf.flags.FLAGS.npu_bert_loss_scale not in [None, -1]) and (manual_fp16 or use_fp16) else tf.constant(True, dtype=tf.bool) + batch_finite = tf.cond(reset_step, + lambda: batch_finite.assign(tf.math.logical_and(tf.constant(True, dtype=tf.bool), all_are_finite)), + lambda:batch_finite.assign(tf.math.logical_and(batch_finite, all_are_finite))) + + # This is how the model was pre-trained. + # ensure global norm is a finite number + # to prevent clip_by_global_norm from having a hizzy fit. + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + (clipped_grads, _) = tf.clip_by_global_norm( + grads, clip_norm=1.0, + use_norm=tf.cond( + all_are_finite, + lambda: tf.global_norm(grads), + lambda: tf.constant(1.0))) + else: + with tf.name_scope("clip_grads"): + clipped_grads = [ + (tf.clip_by_norm(grad, clip_norm=1.0)) + if grad is not None else (grad, var) for grad in grads + ] + + accum_vars = tf.cond(reset_step, + lambda: [accum_vars[i].assign(grad) for i, grad in enumerate(clipped_grads)], + lambda: [accum_vars[i].assign_add(grad) for i, grad in enumerate(clipped_grads)]) + + def update(accum_vars): + with tf.name_scope("opt_update"): + if allreduce_post_accumulation and hvd is not None: + accum_vars = [hvd.allreduce(tf.convert_to_tensor(accum_var), compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) if isinstance(accum_var, tf.IndexedSlices) + else hvd.allreduce(accum_var, compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) for accum_var in accum_vars] + return optimizer.apply_gradients(list(zip(accum_vars, tvars)), global_step=global_step) + + update_step = tf.identity(tf.cast(tf.math.equal(local_step % num_accumulation_steps, 0), dtype=tf.bool), name="update_step") + update_op = tf.cond(update_step, + lambda: update(accum_vars), lambda: tf.no_op()) + + new_global_step = tf.cond(tf.math.logical_and(update_step, tf.cast(hvd.allreduce(tf.cast(batch_finite, tf.int32)), tf.bool)), lambda: global_step+1, lambda: global_step) + new_global_step = tf.identity(new_global_step, name='step_update') + train_op = tf.group(update_op, [global_step.assign(new_global_step)]) + else: + grads_and_vars = [(g, v) for g, v in grads_and_vars if g is not None] + grads, tvars = list(zip(*grads_and_vars)) + + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + all_are_finite = tf.reduce_all( + [tf.reduce_all(tf.is_finite(g)) for g in grads]) if (tf.flags.FLAGS.npu_bert_loss_scale not in [None, -1]) and (use_fp16 or manual_fp16) else tf.constant(True, dtype=tf.bool) + + # This is how the model was pre-trained. + # ensure global norm is a finite number + # to prevent clip_by_global_norm from having a hizzy fit. + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + (clipped_grads, _) = tf.clip_by_global_norm( + grads, clip_norm=1.0, + use_norm=tf.cond( + all_are_finite, + lambda: tf.global_norm(grads), + lambda: tf.constant(1.0))) + else: + with tf.name_scope("clip_grads"): + clipped_grads = [ + (tf.clip_by_norm(grad, clip_norm=1.0)) + if grad is not None else (grad, var) for grad in grads + ] + + with tf.name_scope("apply_grads"): + train_op = optimizer.apply_gradients( + list(zip(clipped_grads, tvars)), global_step=global_step) + + #if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + # new_global_step = tf.cond(all_are_finite, lambda: global_step + 1, lambda: global_step) + #else: + # new_global_step = global_step + 1 + #new_global_step = tf.identity(new_global_step, name='step_update') + #train_op = tf.group(train_op, [global_step.assign(new_global_step)]) + return train_op + + +class AdamWeightDecayOptimizer(tf.train.Optimizer): + """A basic Adam optimizer that includes "correct" L2 weight decay.""" + + def __init__(self, + learning_rate, + weight_decay_rate=0.0, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-4, + exclude_from_weight_decay=None, + name="AdamWeightDecayOptimizer"): + """Constructs a AdamWeightDecayOptimizer.""" + super(AdamWeightDecayOptimizer, self).__init__(False, name) + + self.learning_rate = tf.identity(learning_rate, name='learning_rate') + self.weight_decay_rate = weight_decay_rate + self.beta_1 = beta_1 + self.beta_2 = beta_2 + self.epsilon = epsilon + self.exclude_from_weight_decay = exclude_from_weight_decay + + def apply_gradients(self, grads_and_vars, global_step=None, name=None, + manual_fp16=False): + """See base class.""" + assignments = [] + for (grad, param) in grads_and_vars: + with tf.name_scope("apply_one_adam"): + if grad is None or param is None: + continue + + param_name = self._get_variable_name(param.name) + has_shadow = manual_fp16 and param.dtype.base_dtype != tf.float32 + if has_shadow: + # create shadow fp32 weights for fp16 variable + param_fp32 = tf.get_variable( + name=param_name + "/shadow", + dtype=tf.float32, + trainable=False, + initializer=tf.cast(param.initialized_value(),tf.float32)) + else: + param_fp32 = param + + m = tf.get_variable( + name=param_name + "/adam_m", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + v = tf.get_variable( + name=param_name + "/adam_v", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + + # Standard Adam update. + next_m = ( + tf.multiply(self.beta_1, m) + tf.multiply(1.0 - self.beta_1, grad)) + next_v = ( + tf.multiply(self.beta_2, v) + tf.multiply(1.0 - self.beta_2, + tf.square(grad))) + + update = next_m / (tf.sqrt(next_v) + self.epsilon) + + # Just adding the square of the weights to the loss function is *not* + # the correct way of using L2 regularization/weight decay with Adam, + # since that will interact with the m and v parameters in strange ways. + # + # Instead we want to decay the weights in a manner that doesn't interact + # with the m/v parameters. This is equivalent to adding the square + # of the weights to the loss with plain (non-momentum) SGD. + if self._do_use_weight_decay(param_name): + update += self.weight_decay_rate * param_fp32 + + update_with_lr = self.learning_rate * update + + next_param = param_fp32 - update_with_lr + + if has_shadow: + # cast shadow fp32 weights to fp16 and assign to trainable variable + param.assign(tf.cast(next_param, param.dtype.base_dtype)) + assignments.extend( + [param_fp32.assign(next_param), + m.assign(next_m), + v.assign(next_v)]) + new_global_step = global_step + 1 + new_global_step = tf.identity(new_global_step, name='step_update') + assignments.extend([global_step.assign(new_global_step)]) + return tf.group(*assignments, name=name) + + def _do_use_weight_decay(self, param_name): + """Whether to use L2 weight decay for `param_name`.""" + if not self.weight_decay_rate: + return False + if self.exclude_from_weight_decay: + for r in self.exclude_from_weight_decay: + if re.search(r, param_name) is not None: + return False + return True + + def _get_variable_name(self, param_name): + """Get the variable name from the tensor name.""" + m = re.match("^(.*):\\d+$", param_name) + if m is not None: + param_name = m.group(1) + return param_name + + +class LAMBOptimizer(tf.train.Optimizer): + """A LAMB optimizer that includes "correct" L2 weight decay.""" + + def __init__(self, + learning_rate, + weight_decay_rate=0.0, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=None, + name="LAMBOptimizer"): + """Constructs a LAMBOptimizer.""" + super(LAMBOptimizer, self).__init__(False, name) + + self.learning_rate = tf.identity(learning_rate, name='learning_rate') + self.weight_decay_rate = weight_decay_rate + self.beta_1 = beta_1 + self.beta_2 = beta_2 + self.epsilon = epsilon + self.exclude_from_weight_decay = exclude_from_weight_decay + self.steps = 0 + + def apply_gradients(self, grads_and_vars, global_step=None, name=None, + manual_fp16=False): + """See base class.""" + assignments = [] + for (grad, param) in grads_and_vars: + with tf.name_scope("apply_one_lamb"): + if grad is None or param is None: + continue + + param_name = self._get_variable_name(param.name) + has_shadow = manual_fp16 and param.dtype.base_dtype != tf.float32 + if has_shadow: + # create shadow fp32 weights for fp16 variable + param_fp32 = tf.get_variable( + name=param_name + "/shadow", + dtype=tf.float32, + trainable=False, + initializer=tf.cast(param.initialized_value(),tf.float32)) + else: + param_fp32 = param + + m = tf.get_variable( + name=param_name + "/adam_m", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + v = tf.get_variable( + name=param_name + "/adam_v", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + + # LAMB update + next_m = ( + tf.multiply(self.beta_1, m) + tf.multiply(1.0 - self.beta_1, grad)) + next_v = ( + tf.multiply(self.beta_2, v) + tf.multiply(1.0 - self.beta_2, + tf.square(grad))) + + self.steps += 1 + beta1_correction = (1 - self.beta_1 ** self.steps) + beta2_correction = (1 - self.beta_2 ** self.steps) + + next_m_unbiased = next_m / beta1_correction + next_v_unbiased = next_v / beta2_correction + + update = next_m_unbiased / (tf.sqrt(next_v_unbiased) + self.epsilon) + + # Just adding the square of the weights to the loss function is *not* + # the correct way of using L2 regularization/weight decay with Adam, + # since that will interact with the m and v parameters in strange ways. + # + # Instead we want to decay the weights in a manner that doesn't interact + # with the m/v parameters. This is equivalent to adding the square + # of the weights to the loss with plain (non-momentum) SGD. + if self._do_use_weight_decay(param_name): + update += self.weight_decay_rate * param_fp32 + + w_norm = linalg_ops.norm(param, ord=2) + g_norm = linalg_ops.norm(update, ord=2) + ratio = array_ops.where(math_ops.greater(w_norm, 0), array_ops.where( + math_ops.greater(g_norm, 0), (w_norm / g_norm), 1.0), 1.0) + + update_with_lr = ratio * self.learning_rate * update + + next_param = param_fp32 - update_with_lr + + if has_shadow: + # cast shadow fp32 weights to fp16 and assign to trainable variable + param.assign(tf.cast(next_param, param.dtype.base_dtype)) + assignments.extend( + [param_fp32.assign(next_param), + m.assign(next_m), + v.assign(next_v)]) + new_global_step = global_step + 1 + new_global_step = tf.identity(new_global_step, name='step_update') + assignments.extend([global_step.assign(new_global_step)]) + return tf.group(*assignments, name=name) + + def _do_use_weight_decay(self, param_name): + """Whether to use L2 weight decay for `param_name`.""" + if not self.weight_decay_rate: + return False + if self.exclude_from_weight_decay: + for r in self.exclude_from_weight_decay: + if re.search(r, param_name) is not None: + return False + return True + + def _get_variable_name(self, param_name): + """Get the variable name from the tensor name.""" + m = re.match("^(.*):\\d+$", param_name) + if m is not None: + param_name = m.group(1) + return param_name diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/run_pretraining.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/run_pretraining.py new file mode 100644 index 0000000..3d0c770 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/run_pretraining.py @@ -0,0 +1,784 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Run masked LM/next sentence masked_lm pre-training for BERT.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time +import modeling +import optimization +import tensorflow as tf +import glob +from utils import LogEvalRunHook +from tensorflow.core.protobuf import rewriter_config_pb2 +from gpu_environment import get_custom_getter + +from npu_bridge.estimator.npu.npu_config import * +from npu_bridge.estimator.npu.npu_estimator import * +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../../../../../utils/atlasboost')) +# import hwlog +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +os.environ['WHICH_OP'] = 'GEOP' +os.environ['NEW_GE_FE_ID'] = '1' +os.environ['GE_AICPU_FLAG'] = '1' +os.environ['GE_USE_STATIC_MEMORY'] = '1' +os.environ['OPTION_EXEC_HCCL_FLAG'] = '1' +os.environ['HCCL_CONNECT_TIMEOUT'] = '600' + +flags = tf.flags + +FLAGS = flags.FLAGS + +## Required parameters +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_string( + "input_files_dir", "./data", + "Directory with input files, comma separated or single directory.") + +flags.DEFINE_string( + "eval_files_dir", None, + "Directory with eval files, comma separated or single directory. ") + +flags.DEFINE_string( + "output_dir", "./models", + "The output directory where the model checkpoints will be written.") + +## Other parameters +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_string( + "optimizer_type", "lamb", + "Optimizer used for training - LAMB or ADAM") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded. Must match data generation.") + +flags.DEFINE_integer( + "max_predictions_per_seq", 20, + "Maximum number of masked LM predictions per sequence. " + "Must match data generation.") + +flags.DEFINE_bool("do_train", True, "Whether to run training.") + +flags.DEFINE_bool("do_eval", False, "Whether to run eval on the dev set.") + +flags.DEFINE_integer("train_batch_size", 64, "Total batch size for training.") + +flags.DEFINE_integer("eval_batch_size", 8, "Total batch size for eval.") + +flags.DEFINE_float("learning_rate", 1e-4, "The initial learning rate for Adam.") + +flags.DEFINE_integer("num_train_steps", 1000000, "Number of training steps.") + +flags.DEFINE_integer("num_warmup_steps", 10000, "Number of warmup steps.") + +flags.DEFINE_integer("save_checkpoints_steps", 10000, + "How often to save the model checkpoint.") + +flags.DEFINE_integer("display_loss_steps", 10, + "How often to print loss") + +flags.DEFINE_integer("iterations_per_loop", 1000, + "How many steps to make in each estimator call.") + +flags.DEFINE_integer("max_eval_steps", 100, "Maximum number of eval steps.") + +flags.DEFINE_integer("num_accumulation_steps", 1, + "Number of accumulation steps before gradient update." + "Global batch size = num_accumulation_steps * train_batch_size") + +flags.DEFINE_bool("allreduce_post_accumulation", False, "Whether to all reduce after accumulation of N steps or after each step") + +flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the trainable parameters are printed") + +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") + +flags.DEFINE_bool("report_loss", True, "Whether to report total loss during training.") + +flags.DEFINE_bool("manual_fp16", True, "Whether to use fp32 or fp16 arithmetic on GPU. " + "Manual casting is done instead of using AMP") + +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") + +flags.DEFINE_bool("use_fp16", False, "Whether to enable AMP ops.") + +flags.DEFINE_bool("use_fp16_cls", True, "Whether to use fp16 in cls and pooler.") + +flags.DEFINE_bool("distributed", True, "Whether to use multi-npu") + +flags.DEFINE_bool('npu_bert_fused_gelu', True, 'Whether to use npu defined gelu op') + +flags.DEFINE_bool('npu_bert_debug', False, 'If True, dropout and shuffle is disabled.') + +flags.DEFINE_bool('npu_bert_use_tdt', True, 'Whether to use tdt as dataset') + +flags.DEFINE_string("npu_bert_job_start_file", None, "CSA job start file path.") + +flags.DEFINE_integer("npu_bert_loss_scale", 0, "Whether to use loss scale, -1 is disable, 0 is dynamic loss scale, >=1 is static loss scale") + +flags.DEFINE_bool("npu_bert_clip_by_global_norm", False, "Use clip_by_global_norm if True, or use clip_by_norm for each gradient") + +flags.DEFINE_bool('npu_bert_npu_dropout', True, 'Whether to use npu defined gelu op') + +flags.DEFINE_bool('npu_gather', True, 'Whether to use gather_npu whose backward propagation avoids IndexedSlices') + +flags.DEFINE_bool('hcom_parallel', True, 'Whether to use parallel allreduce') + +flags.DEFINE_integer('init_loss_scale_value', 2**32, 'Initial loss scale value for loss scale optimizer') + +# report samples/sec, total loss and learning rate during training +class _LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, num_accumulation_steps, display_every=10, hvd_rank=-1): + self.global_batch_size = global_batch_size + self.display_every = display_every + self.hvd_rank = hvd_rank + self.num_accumulation_steps = num_accumulation_steps + def after_create_session(self, session, coord): + self.elapsed_secs = 0. + self.count = 0 + self.all_count = 0 + self.avg_loss = 0.0 + + def before_run(self, run_context): + self.t0 = time.time() + if self.num_accumulation_steps <= 1: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0', 'loss_scale:0', 'apply_grads/All:0']) + else: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0']) + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'update_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0', 'loss_scale:0']) + else: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'update_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0']) + def after_run(self, run_context, run_values): + self.elapsed_secs += time.time() - self.t0 + if self.num_accumulation_steps <=1: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + global_step, total_loss, lr, nsp_loss, mlm_loss, loss_scaler, custom_arg = run_values.results + else: + global_step, total_loss, lr, nsp_loss, mlm_loss = run_values. \ + results + update_step = True + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + global_step, update_step, total_loss, lr, nsp_loss, mlm_loss, loss_scaler = run_values.results + else: + global_step, update_step, total_loss, lr, nsp_loss, mlm_loss = run_values.\ + results + print_step = global_step + 1 # One-based index for printing. + self.avg_loss += total_loss + self.all_count += 1 + if update_step: + self.count += 1 + dt = self.elapsed_secs / self.count + sent_per_sec = self.global_batch_size / dt * FLAGS.iterations_per_loop + avg_loss_step = self.avg_loss / self.all_count + if self.hvd_rank >= 0: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + print('Rank = %2d :: Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e Loss scale = %6.4e isFinite = %6i' % + (self.hvd_rank, print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr, loss_scaler, custom_arg), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + print('Rank = %2d :: Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e' % + (self.hvd_rank, print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + print('Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e Loss scale = %6.4e isFinite = %6i' % + (print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr, loss_scaler, custom_arg), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + print('Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e' % + (print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + self.elapsed_secs = 0. + self.count = 0 + self.avg_loss = 0.0 + self.all_count = 0 + +def model_fn_builder(bert_config, init_checkpoint, learning_rate, + num_train_steps, num_warmup_steps, + use_one_hot_embeddings, hvd=None): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + masked_lm_positions = features["masked_lm_positions"] + masked_lm_ids = features["masked_lm_ids"] + masked_lm_weights = features["masked_lm_weights"] + next_sentence_labels = features["next_sentence_labels"] + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings, + compute_type=tf.float16 if FLAGS.manual_fp16 else tf.float32) + + (masked_lm_loss, + masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( + bert_config, model.get_sequence_output(), model.get_embedding_table(), + masked_lm_positions, masked_lm_ids, + masked_lm_weights) + + (next_sentence_loss, next_sentence_example_loss, + next_sentence_log_probs) = get_next_sentence_output( + bert_config, model.get_pooled_output(), next_sentence_labels) + + masked_lm_loss = tf.identity(masked_lm_loss, name="mlm_loss") + next_sentence_loss = tf.identity(next_sentence_loss, name="nsp_loss") + total_loss = masked_lm_loss + next_sentence_loss + total_loss = tf.identity(total_loss, name='total_loss') + + tvars = tf.trainable_variables() + + initialized_variable_names = {} + if init_checkpoint and (hvd is None or hvd.rank() == 0): + print("Loading checkpoint", init_checkpoint) + (assignment_map, initialized_variable_names + ) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + if FLAGS.verbose_logging: + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" %d :: name = %s, shape = %s%s", 0 if hvd is None else hvd.rank(), var.name, var.shape, + init_string) + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, + hvd, FLAGS.manual_fp16, FLAGS.use_fp16, FLAGS.num_accumulation_steps, FLAGS.optimizer_type, FLAGS.allreduce_post_accumulation) + + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + + def metric_fn(masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, + masked_lm_weights, next_sentence_example_loss, + next_sentence_log_probs, next_sentence_labels): + """Computes the loss and accuracy of the model.""" + masked_lm_log_probs = tf.reshape(masked_lm_log_probs, + [-1, masked_lm_log_probs.shape[-1]]) + masked_lm_predictions = tf.argmax( + masked_lm_log_probs, axis=-1, output_type=tf.int32) + masked_lm_example_loss = tf.reshape(masked_lm_example_loss, [-1]) + masked_lm_ids = tf.reshape(masked_lm_ids, [-1]) + masked_lm_weights = tf.reshape(masked_lm_weights, [-1]) + masked_lm_accuracy = tf.metrics.accuracy( + labels=masked_lm_ids, + predictions=masked_lm_predictions, + weights=masked_lm_weights) + masked_lm_mean_loss = tf.metrics.mean( + values=masked_lm_example_loss, weights=masked_lm_weights) + + next_sentence_log_probs = tf.reshape( + next_sentence_log_probs, [-1, next_sentence_log_probs.shape[-1]]) + next_sentence_predictions = tf.argmax( + next_sentence_log_probs, axis=-1, output_type=tf.int32) + next_sentence_labels = tf.reshape(next_sentence_labels, [-1]) + next_sentence_accuracy = tf.metrics.accuracy( + labels=next_sentence_labels, predictions=next_sentence_predictions) + next_sentence_mean_loss = tf.metrics.mean( + values=next_sentence_example_loss) + + return { + "masked_lm_accuracy": masked_lm_accuracy, + "masked_lm_loss": masked_lm_mean_loss, + "next_sentence_accuracy": next_sentence_accuracy, + "next_sentence_loss": next_sentence_mean_loss, + } + + eval_metric_ops = metric_fn( + masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, + masked_lm_weights, next_sentence_example_loss, + next_sentence_log_probs, next_sentence_labels + ) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + else: + raise ValueError("Only TRAIN and EVAL modes are supported: %s" % (mode)) + + return output_spec + + return model_fn + + +def get_masked_lm_output(bert_config, input_tensor, output_weights, positions, + label_ids, label_weights): + """Get loss and log probs for the masked LM.""" + input_tensor = gather_indexes(input_tensor, positions) + + with tf.variable_scope("cls/predictions"): + # We apply one more non-linear transformation before the output layer. + # This matrix is not used after pre-training. + with tf.variable_scope("transform", custom_getter=get_custom_getter(compute_type=tf.float16 if FLAGS.use_fp16_cls else tf.float32)): + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + input_tensor = tf.layers.dense( + input_tensor, + units=bert_config.hidden_size, + activation=modeling.get_activation(bert_config.hidden_act), + kernel_initializer=modeling.create_initializer( + bert_config.initializer_range)) + input_tensor = tf.cast(input_tensor, tf.float32) + input_tensor = modeling.layer_norm(input_tensor) + + # The output weights are the same as the input embeddings, but there is + # an output-only bias for each token. + output_bias = tf.get_variable( + "output_bias", + shape=[bert_config.vocab_size], + initializer=tf.zeros_initializer()) + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + logits = tf.matmul(input_tensor, tf.cast(output_weights, tf.float16), transpose_b=True) + logits = tf.cast(logits, tf.float32) + else: + logits = tf.matmul(tf.cast(input_tensor, tf.float32), output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + log_probs = tf.nn.log_softmax(logits, axis=-1) + + label_ids = tf.reshape(label_ids, [-1]) + label_weights = tf.reshape(label_weights, [-1]) + + one_hot_labels = tf.one_hot( + label_ids, depth=bert_config.vocab_size, dtype=tf.float32) + + # The `positions` tensor might be zero-padded (if the sequence is too + # short to have the maximum number of predictions). The `label_weights` + # tensor has a value of 1.0 for every real prediction and 0.0 for the + # padding predictions. + per_example_loss = -tf.reduce_sum(log_probs * one_hot_labels, axis=[-1]) + numerator = tf.reduce_sum(label_weights * per_example_loss) + denominator = tf.reduce_sum(label_weights) + 1e-5 + loss = numerator / denominator + + return (loss, per_example_loss, log_probs) + + +def get_next_sentence_output(bert_config, input_tensor, labels): + """Get loss and log probs for the next sentence prediction.""" + + # Simple binary classification. Note that 0 is "next sentence" and 1 is + # "random sentence". This weight matrix is not used after pre-training. + with tf.variable_scope("cls/seq_relationship"): + output_weights = tf.get_variable( + "output_weights", + shape=[2, bert_config.hidden_size], + initializer=modeling.create_initializer(bert_config.initializer_range)) + output_bias = tf.get_variable( + "output_bias", shape=[2], initializer=tf.zeros_initializer()) + + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + logits = tf.matmul(input_tensor, tf.cast(output_weights, tf.float16), transpose_b=True) + logits = tf.cast(logits, tf.float32) + else: + logits = tf.matmul(tf.cast(input_tensor, tf.float32), output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + log_probs = tf.nn.log_softmax(logits, axis=-1) + labels = tf.reshape(labels, [-1]) + one_hot_labels = tf.one_hot(labels, depth=2, dtype=tf.float32) + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1) + loss = tf.reduce_mean(per_example_loss) + return (loss, per_example_loss, log_probs) + + +def gather_indexes(sequence_tensor, positions): + """Gathers the vectors at the specific positions over a minibatch.""" + sequence_shape = modeling.get_shape_list(sequence_tensor, expected_rank=3) + batch_size = sequence_shape[0] + seq_length = sequence_shape[1] + width = sequence_shape[2] + + flat_offsets = tf.reshape( + tf.range(0, batch_size, dtype=tf.int32) * seq_length, [-1, 1]) + flat_positions = tf.reshape(positions + flat_offsets, [-1]) + flat_sequence_tensor = tf.reshape(sequence_tensor, + [batch_size * seq_length, width]) + output_tensor = tf.gather(flat_sequence_tensor, flat_positions) + return output_tensor + + +def input_fn_builder(input_files, + batch_size, + max_seq_length, + max_predictions_per_seq, + is_training, + num_cpu_threads=4, + hvd=None): + """Creates an `input_fn` closure to be passed to Estimator.""" + + def input_fn(): + """The actual input function.""" + + name_to_features = { + "input_ids": + tf.FixedLenFeature([max_seq_length], tf.int64), + "input_mask": + tf.FixedLenFeature([max_seq_length], tf.int64), + "segment_ids": + tf.FixedLenFeature([max_seq_length], tf.int64), + "masked_lm_positions": + tf.FixedLenFeature([max_predictions_per_seq], tf.int64), + "masked_lm_ids": + tf.FixedLenFeature([max_predictions_per_seq], tf.int64), + "masked_lm_weights": + tf.FixedLenFeature([max_predictions_per_seq], tf.float32), + "next_sentence_labels": + tf.FixedLenFeature([1], tf.int64), + } + + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + if is_training: + d = tf.data.Dataset.from_tensor_slices(tf.constant(input_files)) + if FLAGS.distributed: + #rank_size = int(os.getenv('RANK_SIZE')) + #rank_id = int(os.getenv('RANK_INDEX')) + #device_id = int(os.getenv('DEVICE_ID')) + #local_rank = rank_id * 8 + device_id + #print('RANK_SIZE=', rank_size, ' RANK_ID=', local_rank) + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('RANK_ID')) + print('RANK_SIZE=', rank_size, ' rank_id=', rank_id) + d = d.shard(rank_size, rank_id) + d = d.repeat() + if not FLAGS.npu_bert_debug: + d = d.shuffle(buffer_size=len(input_files)) + + # `cycle_length` is the number of parallel files that get read. + if not FLAGS.npu_bert_debug: + #cycle_length = min(num_cpu_threads, len(input_files)) + cycle_length = min(num_cpu_threads, int(len(input_files)/int(os.getenv('RANK_SIZE')))) + else: + cycle_length = 1 + + # `sloppy` mode means that the interleaving is not exact. This adds + # even more randomness to the training pipeline. + #d = d.apply( + # tf.contrib.data.parallel_interleave( + # tf.data.TFRecordDataset, + # sloppy=(not FLAGS.npu_bert_debug), + # cycle_length=cycle_length)) + d = d.interleave( + tf.data.TFRecordDataset, + cycle_length=cycle_length, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + if not FLAGS.npu_bert_debug: + d = d.shuffle(buffer_size=100) + else: + d = tf.data.TFRecordDataset(input_files) + # Since we evaluate for a fixed number of steps we don't want to encounter + # out-of-range exceptions. + d = d.repeat() + + # We must `drop_remainder` on training because the TPU requires fixed + # size dimensions. For eval, we assume we are evaluating on the CPU or GPU + # and we *don't* want to drop the remainder, otherwise we wont cover + # every sample. + d = d.apply( + tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + num_parallel_batches=num_cpu_threads, + drop_remainder=True)) + return d + + return input_fn + + +def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + + return example + + +def main(_): + for name, value in FLAGS.__flags.items(): + print("name:", name, " ", FLAGS[name].value) + + tf.logging.set_verbosity(tf.logging.INFO) + + if not FLAGS.do_train and not FLAGS.do_eval: + raise ValueError("At least one of `do_train` or `do_eval` must be True.") + + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + + if FLAGS.horovod: + import horovod.tensorflow as hvd + hvd.init() + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + if FLAGS.npu_gather: + if FLAGS.distributed and bert_config.num_hidden_layers == 24: + #from hccl.split.api import set_split_strategy_by_idx + from hccl.split.api import set_split_strategy_by_size + #set_split_strategy_by_idx([8,72,136,200,264,328,392,397]) + set_split_strategy_by_size([10,10,10,10,15,15,15,15]) + if FLAGS.distributed and bert_config.num_hidden_layers == 12: + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([8,56,104,152,200,205]) + if FLAGS.distributed and bert_config.num_hidden_layers == 6: + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([8,40,72,104,109]) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + input_files = [] + for input_file_dir in FLAGS.input_files_dir.split(","): + input_files.extend(tf.gfile.Glob(os.path.join(input_file_dir, "*"))) + + input_files.sort() + print("Input Files:", input_files) + + if FLAGS.horovod and len(input_files) < hvd.size(): + raise ValueError("Input Files must be sharded") + if FLAGS.use_fp16 and FLAGS.manual_fp16: + raise ValueError("AMP and Manual Mixed Precision Training are both activated! Error") + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + config = tf.ConfigProto() + if FLAGS.horovod: + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.rank() == 0: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + +# config.gpu_options.per_process_gpu_memory_fraction = 0.7 + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + config.graph_options.rewrite_options.memory_optimization = rewriter_config_pb2.RewriterConfig.NO_MEM_OPT + + #run_config = tf.estimator.RunConfig( + run_config = NPURunConfig( + model_dir=FLAGS.output_dir, + save_summary_steps=0, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if not FLAGS.horovod or hvd.rank() == 0 else None, + # This variable controls how often estimator reports examples/sec. + # Default value is every 100 steps. + # When --report_loss is True, we set to very large value to prevent + # default info reporting from estimator. + # Ideally we should set it to None, but that does not work. + log_step_count_steps=1 if FLAGS.report_loss else 100, + enable_data_pre_proc=FLAGS.npu_bert_use_tdt, + iterations_per_loop=FLAGS.iterations_per_loop, + hcom_parallel=FLAGS.hcom_parallel) + + if FLAGS.distributed: + rank_size = int(os.getenv('RANK_SIZE')) + model_fn = model_fn_builder( + bert_config=bert_config, + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=FLAGS.learning_rate, + num_train_steps=FLAGS.num_train_steps, + num_warmup_steps=FLAGS.num_warmup_steps, + use_one_hot_embeddings=False, + hvd=None if not FLAGS.horovod else hvd) + + training_hooks = [] + """ + if FLAGS.report_loss and (not FLAGS.horovod or hvd.rank() == 0): + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps if not FLAGS.horovod else FLAGS.train_batch_size * FLAGS.num_accumulation_steps * hvd.size() + training_hooks.append(_LogSessionRunHook(global_batch_size, FLAGS.num_accumulation_steps, FLAGS.display_loss_steps)) + if FLAGS.horovod and hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + """ + if FLAGS.report_loss: + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps if not FLAGS.distributed else FLAGS.train_batch_size * FLAGS.num_accumulation_steps * rank_size + training_hooks.append(_LogSessionRunHook(global_batch_size, FLAGS.num_accumulation_steps, FLAGS.display_loss_steps)) + + + #estimator = tf.estimator.Estimator( + estimator = NPUEstimator( + model_fn=model_fn, + config=run_config, + job_start_file=FLAGS.npu_bert_job_start_file) + + if FLAGS.do_train: + tf.logging.info("***** Running training *****") + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + train_input_fn = input_fn_builder( + input_files=input_files, + batch_size=FLAGS.train_batch_size, + max_seq_length=FLAGS.max_seq_length, + max_predictions_per_seq=FLAGS.max_predictions_per_seq, + is_training=True, + hvd=None if not FLAGS.horovod else hvd) + + estimator.train(input_fn=train_input_fn, hooks=training_hooks, max_steps=FLAGS.num_train_steps) + + if FLAGS.do_eval and (not FLAGS.horovod or hvd.rank() == 0): + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + + eval_files = [] + for eval_file_dir in FLAGS.eval_files_dir.split(","): + eval_files.extend(tf.gfile.Glob(os.path.join(eval_file_dir, "*"))) + + eval_input_fn = input_fn_builder( + input_files=eval_files, + batch_size=FLAGS.eval_batch_size, + max_seq_length=FLAGS.max_seq_length, + max_predictions_per_seq=FLAGS.max_predictions_per_seq, + is_training=False, + hvd=None if not FLAGS.horovod else hvd) + + eval_hooks = [LogEvalRunHook(FLAGS.eval_batch_size)] + eval_start_time = time.time() + result = estimator.evaluate( + input_fn=eval_input_fn, steps=FLAGS.max_eval_steps, hooks=eval_hooks) + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size + + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.eval_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size) + tf.logging.info("Summary Inference Statistics on EVAL set") + tf.logging.info("Batch size = %d", FLAGS.eval_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.GFile(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + if key == 'masked_lm_accuracy': + hwlog.remark_print(key=hwlog.MASKED_LM_ACCURACY, value=str(result[key])) + elif key == 'next_sentence_accuracy ': + hwlog.remark_print(key=hwlog.NEXT_SENTENCE_ACCURACY, value=str(result[key])) + elif key == 'global_step': + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=str(result[key])) + elif key == 'loss': + hwlog.remark_print(key=hwlog.LOSS, value=str(result[key])) + elif key == 'masked_lm_loss': + hwlog.remark_print(key=hwlog.MASKED_LM_LOSS, value=str(result[key])) + elif key == 'next_sentence_loss ': + hwlog.remark_print(key=hwlog.NEXT_SENTENCE_LOSS, value=str(result[key])) + else: + pass + + +if __name__ == "__main__": + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.01, "dataset": "cn-clue/en-wiki", "optimizer": "Adam", "loss_scale": 512} + flags.mark_flag_as_required("input_files_dir") + flags.mark_flag_as_required("eval_files_dir") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + flags.mark_flag_as_required("npu_bert_job_start_file") + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + if FLAGS.use_xla and FLAGS.manual_fp16: + print('WARNING! Combining --use_xla with --manual_fp16 may prevent convergence.') + print(' This warning message will be removed when the underlying') + print(' issues have been fixed and you are running a TF version') + print(' that has that fix.') + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tf_metrics.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tf_metrics.py new file mode 100644 index 0000000..f4c5148 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tf_metrics.py @@ -0,0 +1,215 @@ +""" +Multiclass +from: +https://github.com/guillaumegenthial/tf_metrics/blob/master/tf_metrics/__init__.py + +""" + +__author__ = "Guillaume Genthial" + +import numpy as np +import tensorflow as tf +from tensorflow.python.ops.metrics_impl import _streaming_confusion_matrix + + +def precision(labels, predictions, num_classes, pos_indices=None, + weights=None, average='micro'): + """Multi-class precision metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + pr, _, _ = metrics_from_confusion_matrix( + cm, pos_indices, average=average) + op, _, _ = metrics_from_confusion_matrix( + op, pos_indices, average=average) + return (pr, op) + + +def recall(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro'): + """Multi-class recall metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + _, re, _ = metrics_from_confusion_matrix( + cm, pos_indices, average=average) + _, op, _ = metrics_from_confusion_matrix( + op, pos_indices, average=average) + return (re, op) + + +def f1(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro'): + return fbeta(labels, predictions, num_classes, pos_indices, weights, + average) + + +def fbeta(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro', beta=1): + """Multi-class fbeta metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + beta : int, optional + Weight of precision in harmonic mean + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + _, _, fbeta = metrics_from_confusion_matrix( + cm, pos_indices, average=average, beta=beta) + _, _, op = metrics_from_confusion_matrix( + op, pos_indices, average=average, beta=beta) + return (fbeta, op) + + +def safe_div(numerator, denominator): + """Safe division, return 0 if denominator is 0""" + numerator, denominator = tf.to_float(numerator), tf.to_float(denominator) + zeros = tf.zeros_like(numerator, dtype=numerator.dtype) + denominator_is_zero = tf.equal(denominator, zeros) + return tf.where(denominator_is_zero, zeros, numerator / denominator) + + +def pr_re_fbeta(cm, pos_indices, beta=1): + """Uses a confusion matrix to compute precision, recall and fbeta""" + num_classes = cm.shape[0] + neg_indices = [i for i in range(num_classes) if i not in pos_indices] + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[neg_indices, neg_indices] = 0 + diag_sum = tf.reduce_sum(tf.diag_part(cm * cm_mask)) + + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[:, neg_indices] = 0 + tot_pred = tf.reduce_sum(cm * cm_mask) + + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[neg_indices, :] = 0 + tot_gold = tf.reduce_sum(cm * cm_mask) + + pr = safe_div(diag_sum, tot_pred) + re = safe_div(diag_sum, tot_gold) + fbeta = safe_div((1. + beta**2) * pr * re, beta**2 * pr + re) + + return pr, re, fbeta + + +def metrics_from_confusion_matrix(cm, pos_indices=None, average='micro', + beta=1): + """Precision, Recall and F1 from the confusion matrix + Parameters + ---------- + cm : tf.Tensor of type tf.int32, of shape (num_classes, num_classes) + The streaming confusion matrix. + pos_indices : list of int, optional + The indices of the positive classes + beta : int, optional + Weight of precision in harmonic mean + average : str, optional + 'micro', 'macro' or 'weighted' + """ + num_classes = cm.shape[0] + if pos_indices is None: + pos_indices = [i for i in range(num_classes)] + + if average == 'micro': + return pr_re_fbeta(cm, pos_indices, beta) + elif average in {'macro', 'weighted'}: + precisions, recalls, fbetas, n_golds = [], [], [], [] + for idx in pos_indices: + pr, re, fbeta = pr_re_fbeta(cm, [idx], beta) + precisions.append(pr) + recalls.append(re) + fbetas.append(fbeta) + cm_mask = np.zeros([num_classes, num_classes]) + cm_mask[idx, :] = 1 + n_golds.append(tf.to_float(tf.reduce_sum(cm * cm_mask))) + + if average == 'macro': + pr = tf.reduce_mean(precisions) + re = tf.reduce_mean(recalls) + fbeta = tf.reduce_mean(fbetas) + return pr, re, fbeta + if average == 'weighted': + n_gold = tf.reduce_sum(n_golds) + pr_sum = sum(p * n for p, n in zip(precisions, n_golds)) + pr = safe_div(pr_sum, n_gold) + re_sum = sum(r * n for r, n in zip(recalls, n_golds)) + re = safe_div(re_sum, n_gold) + fbeta_sum = sum(f * n for f, n in zip(fbetas, n_golds)) + fbeta = safe_div(fbeta_sum, n_gold) + return pr, re, fbeta + + else: + raise NotImplementedError() diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tokenization.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tokenization.py new file mode 100644 index 0000000..6e53ce7 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/tokenization.py @@ -0,0 +1,451 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tokenization classes.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import unicodedata +import six +import tensorflow as tf +import re +import os + + +PRETRAINED_VOCAB_ARCHIVE_MAP = { + 'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt", + 'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt", + 'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt", + 'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt", + 'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt", + 'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt", + 'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt", +} + +def validate_case_matches_checkpoint(do_lower_case, init_checkpoint): + """Checks whether the casing config is consistent with the checkpoint name.""" + + # The casing has to be passed in by the user and there is no explicit check + # as to whether it matches the checkpoint. The casing information probably + # should have been stored in the bert_config.json file, but it's not, so + # we have to heuristically detect it to validate. + + if not init_checkpoint: + return + + m = re.match("^.*?([A-Za-z0-9_-]+)/bert_model.ckpt", init_checkpoint) + if m is None: + return + + model_name = m.group(1) + + lower_models = [ + "uncased_L-24_H-1024_A-16", "uncased_L-12_H-768_A-12", + "multilingual_L-12_H-768_A-12", "chinese_L-12_H-768_A-12" + ] + + cased_models = [ + "cased_L-12_H-768_A-12", "cased_L-24_H-1024_A-16", + "multi_cased_L-12_H-768_A-12" + ] + + is_bad_config = False + if model_name in lower_models and not do_lower_case: + is_bad_config = True + actual_flag = "False" + case_name = "lowercased" + opposite_flag = "True" + + if model_name in cased_models and do_lower_case: + is_bad_config = True + actual_flag = "True" + case_name = "cased" + opposite_flag = "False" + + if is_bad_config: + raise ValueError( + "You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. " + "However, `%s` seems to be a %s model, so you " + "should pass in `--do_lower_case=%s` so that the fine-tuning matches " + "how the model was pre-training. If this error is wrong, please " + "just comment out this check." % (actual_flag, init_checkpoint, + model_name, case_name, opposite_flag)) + + + +def convert_to_unicode(text): + """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + + +def printable_text(text): + """Returns text encoded in a way suitable for print or `tf.logging`.""" + + # These functions want `str` for both Python2 and Python3, but in one case + # it's a Unicode string and in the other it's a byte string. + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + + +def load_vocab(vocab_file): + """Loads a vocabulary file into a dictionary.""" + vocab = collections.OrderedDict() + index = 0 + with open(vocab_file, "r") as reader: + while True: + token = convert_to_unicode(reader.readline()) + if not token: + break + token = token.strip() + vocab[token] = index + index += 1 + return vocab + + +def convert_by_vocab(vocab, items): + """Converts a sequence of [tokens|ids] using the vocab.""" + output = [] + for item in items: + output.append(vocab[item]) + return output + + +def whitespace_tokenize(text): + """Runs basic whitespace cleaning and splitting on a peice of text.""" + text = text.strip() + if not text: + return [] + tokens = text.split() + return tokens + + +class FullTokenizer(object): + """Runs end-to-end tokenziation.""" + + def __init__(self, vocab_file, do_lower_case=True): + self.vocab = load_vocab(vocab_file) + self.inv_vocab = {v: k for k, v in self.vocab.items()} + self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + + return split_tokens + + def convert_tokens_to_ids(self, tokens): + return convert_by_vocab(self.vocab, tokens) + + def convert_ids_to_tokens(self, ids): + return convert_by_vocab(self.inv_vocab, ids) + + +class BertTokenizer(object): + """Runs end-to-end tokenization: punctuation splitting + wordpiece""" + + def __init__(self, vocab_file, do_lower_case=True): + if not os.path.isfile(vocab_file): + raise ValueError( + "Can't find a vocabulary file at path '{}'. To load the vocabulary from a Google pretrained " + "model use `tokenizer = BertTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)`".format(vocab_file)) + self.vocab = load_vocab(vocab_file) + self.ids_to_tokens = collections.OrderedDict( + [(ids, tok) for tok, ids in self.vocab.items()]) + self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + return split_tokens + + def convert_tokens_to_ids(self, tokens): + """Converts a sequence of tokens into ids using the vocab.""" + ids = [] + for token in tokens: + ids.append(self.vocab[token]) + return ids + + def convert_ids_to_tokens(self, ids): + """Converts a sequence of ids in wordpiece tokens using the vocab.""" + tokens = [] + for i in ids: + tokens.append(self.ids_to_tokens[i]) + return tokens + + @classmethod + def from_pretrained(cls, pretrained_model_name, do_lower_case=True): + """ + Instantiate a PreTrainedBertModel from a pre-trained model file. + Download and cache the pre-trained model file if needed. + """ + if pretrained_model_name in PRETRAINED_VOCAB_ARCHIVE_MAP: + vocab_file = PRETRAINED_VOCAB_ARCHIVE_MAP[pretrained_model_name] + else: + vocab_file = pretrained_model_name + # redirect to the cache, if necessary + try: + resolved_vocab_file = cached_path(vocab_file) + if resolved_vocab_file == vocab_file: + + logger.info("loading vocabulary file {}".format(vocab_file)) + else: + logger.info("loading vocabulary file {} from cache at {}".format( + vocab_file, resolved_vocab_file)) + # Instantiate tokenizer. + tokenizer = cls(resolved_vocab_file, do_lower_case) + except FileNotFoundError: + logger.error( + "Model name '{}' was not found in model name list ({}). " + "We assumed '{}' was a path or url but couldn't find any file " + "associated to this path or url.".format( + pretrained_model_name, + ', '.join(PRETRAINED_VOCAB_ARCHIVE_MAP.keys()), + pretrained_model_name)) + tokenizer = None + return tokenizer + + +class BasicTokenizer(object): + """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" + + def __init__(self, do_lower_case=True): + """Constructs a BasicTokenizer. + + Args: + do_lower_case: Whether to lower case the input. + """ + self.do_lower_case = do_lower_case + + def tokenize(self, text): + """Tokenizes a piece of text.""" + text = convert_to_unicode(text) + text = self._clean_text(text) + # This was added on November 1st, 2018 for the multilingual and Chinese + # models. This is also applied to the English models now, but it doesn't + # matter since the English models were not trained on any Chinese data + # and generally don't have any Chinese data in them (there are Chinese + # characters in the vocabulary because Wikipedia does have some Chinese + # words in the English Wikipedia.). + text = self._tokenize_chinese_chars(text) + orig_tokens = whitespace_tokenize(text) + split_tokens = [] + for token in orig_tokens: + if self.do_lower_case: + token = token.lower() + token = self._run_strip_accents(token) + split_tokens.extend(self._run_split_on_punc(token)) + + output_tokens = whitespace_tokenize(" ".join(split_tokens)) + return output_tokens + + def _run_strip_accents(self, text): + """Strips accents from a piece of text.""" + text = unicodedata.normalize("NFD", text) + output = [] + for char in text: + cat = unicodedata.category(char) + if cat == "Mn": + continue + output.append(char) + return "".join(output) + + def _run_split_on_punc(self, text): + """Splits punctuation on a piece of text.""" + chars = list(text) + i = 0 + start_new_word = True + output = [] + while i < len(chars): + char = chars[i] + if _is_punctuation(char): + output.append([char]) + start_new_word = True + else: + if start_new_word: + output.append([]) + start_new_word = False + output[-1].append(char) + i += 1 + + return ["".join(x) for x in output] + + def _tokenize_chinese_chars(self, text): + """Adds whitespace around any CJK character.""" + output = [] + for char in text: + cp = ord(char) + if self._is_chinese_char(cp): + output.append(" ") + output.append(char) + output.append(" ") + else: + output.append(char) + return "".join(output) + + def _is_chinese_char(self, cp): + """Checks whether CP is the codepoint of a CJK character.""" + # This defines a "chinese character" as anything in the CJK Unicode block: + # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + # + # Note that the CJK Unicode block is NOT all Japanese and Korean characters, + # despite its name. The modern Korean Hangul alphabet is a different block, + # as is Japanese Hiragana and Katakana. Those alphabets are used to write + # space-separated words, so they are not treated specially and handled + # like the all of the other languages. + if ((cp >= 0x4E00 and cp <= 0x9FFF) or # + (cp >= 0x3400 and cp <= 0x4DBF) or # + (cp >= 0x20000 and cp <= 0x2A6DF) or # + (cp >= 0x2A700 and cp <= 0x2B73F) or # + (cp >= 0x2B740 and cp <= 0x2B81F) or # + (cp >= 0x2B820 and cp <= 0x2CEAF) or + (cp >= 0xF900 and cp <= 0xFAFF) or # + (cp >= 0x2F800 and cp <= 0x2FA1F)): # + return True + + return False + + def _clean_text(self, text): + """Performs invalid character removal and whitespace cleanup on text.""" + output = [] + for char in text: + cp = ord(char) + if cp == 0 or cp == 0xfffd or _is_control(char): + continue + if _is_whitespace(char): + output.append(" ") + else: + output.append(char) + return "".join(output) + + +class WordpieceTokenizer(object): + """Runs WordPiece tokenization.""" + + def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=100): + self.vocab = vocab + self.unk_token = unk_token + self.max_input_chars_per_word = max_input_chars_per_word + + def tokenize(self, text): + """Tokenizes a piece of text into its word pieces. + + This uses a greedy longest-match-first algorithm to perform tokenization + using the given vocabulary. + + For example: + input = "unaffable" + output = ["un", "##aff", "##able"] + + Args: + text: A single token or whitespace separated tokens. This should have + already been passed through `BasicTokenizer. + + Returns: + A list of wordpiece tokens. + """ + + text = convert_to_unicode(text) + + output_tokens = [] + for token in whitespace_tokenize(text): + chars = list(token) + if len(chars) > self.max_input_chars_per_word: + output_tokens.append(self.unk_token) + continue + + is_bad = False + start = 0 + sub_tokens = [] + while start < len(chars): + end = len(chars) + cur_substr = None + while start < end: + substr = "".join(chars[start:end]) + if start > 0: + substr = "##" + substr + if substr in self.vocab: + cur_substr = substr + break + end -= 1 + if cur_substr is None: + is_bad = True + break + sub_tokens.append(cur_substr) + start = end + + if is_bad: + output_tokens.append(self.unk_token) + else: + output_tokens.extend(sub_tokens) + return output_tokens + + +def _is_whitespace(char): + """Checks whether `chars` is a whitespace character.""" + # \t, \n, and \r are technically contorl characters but we treat them + # as whitespace since they are generally considered as such. + if char == " " or char == "\t" or char == "\n" or char == "\r": + return True + cat = unicodedata.category(char) + if cat == "Zs": + return True + return False + + +def _is_control(char): + """Checks whether `chars` is a control character.""" + # These are technically control characters but we count them as whitespace + # characters. + if char == "\t" or char == "\n" or char == "\r": + return False + cat = unicodedata.category(char) + if cat.startswith("C"): + return True + return False + + +def _is_punctuation(char): + """Checks whether `chars` is a punctuation character.""" + cp = ord(char) + # We treat all non-letter/number ASCII as punctuation. + # Characters such as "^", "$", and "`" are not in the Unicode + # Punctuation class but we treat them as punctuation anyways, for + # consistency. + if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or + (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + return True + cat = unicodedata.category(char) + if cat.startswith("P"): + return True + return False diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/utils.py b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/utils.py new file mode 100644 index 0000000..3ac12ea --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/code/pretrain/utils.py @@ -0,0 +1,62 @@ +import tensorflow as tf +import time + +# report latency and throughput during eval +class LogEvalRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, hvd_rank=-1): + self.global_batch_size = global_batch_size + self.hvd_rank = hvd_rank + self.total_time = 0.0 + self.count = 0 + self.skipped = 0 + self.time_list = [] + + def before_run(self, run_context): + self.t0 = time.time() + + def after_run(self, run_context, run_values): + elapsed_secs = time.time() - self.t0 + self.count += 1 + + # Removing first 2 (arbitrary) number of startup iterations from perf evaluations + if self.count <= 2: + print("Skipping time record for ", self.count, " due to overhead") + self.skipped += 1 + else: + self.time_list.append(elapsed_secs) + self.total_time += elapsed_secs + +# report throughput during training +class LogTrainRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, hvd_rank=-1, save_checkpoints_steps=1000): + self.global_batch_size = global_batch_size + self.hvd_rank = hvd_rank + self.save_checkpoints_steps = save_checkpoints_steps + + self.total_time = 0.0 + self.count = 0 # Holds number of iterations, including skipped iterations for fp16 loss scaling + + def after_create_session(self, session, coord): + self.init_global_step = session.run(tf.train.get_global_step()) + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=['step_update:0']) + + def after_run(self, run_context, run_values): + elapsed_secs = time.time() - self.t0 + self.global_step = run_values.results[0] + self.count += 1 + + # Removing first step + first two steps after every checkpoint save + if (self.global_step - self.init_global_step) % self.save_checkpoints_steps <= 1: + print("Skipping time record for ", self.global_step, " due to checkpoint-saving/warmup overhead") + else: + self.total_time += elapsed_secs + + def end(self, session): + num_global_steps = self.global_step - self.init_global_step + + self.skipped = (num_global_steps // self.save_checkpoints_steps) * 2 + \ + min(2, num_global_steps % self.save_checkpoints_steps) - 1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/1p.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/1p.json new file mode 100644 index 0000000..5a5ef1d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/1p.json @@ -0,0 +1,14 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [ + { + "device_id": "0", + "device_ip": "192.168.10.101", + "rank_id": "0" + }], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/8p.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/8p.json new file mode 100644 index 0000000..6ba12b6 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/8p.json @@ -0,0 +1,49 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [ + { + "device_id": "0", + "device_ip": "192.168.10.101", + "rank_id": "0" + }, + { + "device_id": "1", + "device_ip": "192.168.11.101", + "rank_id": "1" + }, + { + "device_id": "2", + "device_ip": "192.168.12.101", + "rank_id": "2" + }, + { + "device_id": "3", + "device_ip": "192.168.13.101", + "rank_id": "3" + }, + { + "device_id": "4", + "device_ip": "192.168.10.100", + "rank_id": "4" + }, + { + "device_id": "5", + "device_ip": "192.168.11.100", + "rank_id": "5" + }, + { + "device_id": "6", + "device_ip": "192.168.12.100", + "rank_id": "6" + }, + { + "device_id": "7", + "device_ip": "192.168.13.100", + "rank_id": "7" + }], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_cn.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_cn.json new file mode 100644 index 0000000..f3456bc --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_cn.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 12, + "type_vocab_size": 2, + "vocab_size": 21136 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_en.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_en.json new file mode 100644 index 0000000..d832c32 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer12_en.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 12, + "type_vocab_size": 2, + "vocab_size": 30522 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_cn.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_cn.json new file mode 100644 index 0000000..6ad4cbb --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_cn.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 6, + "type_vocab_size": 2, + "vocab_size": 21136 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_en.json b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_en.json new file mode 100644 index 0000000..69ef27f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_layer6_en.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 6, + "type_vocab_size": 2, + "vocab_size": 30522 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_vocab.txt b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_vocab.txt new file mode 100644 index 0000000..ca4f978 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/bert_base_vocab.txt @@ -0,0 +1,21128 @@ +[PAD] +[unused1] +[unused2] +[unused3] +[unused4] +[unused5] +[unused6] +[unused7] +[unused8] +[unused9] +[unused10] +[unused11] +[unused12] +[unused13] +[unused14] +[unused15] +[unused16] +[unused17] +[unused18] +[unused19] +[unused20] +[unused21] +[unused22] +[unused23] +[unused24] +[unused25] +[unused26] +[unused27] +[unused28] +[unused29] +[unused30] +[unused31] +[unused32] +[unused33] +[unused34] +[unused35] +[unused36] +[unused37] +[unused38] +[unused39] +[unused40] +[unused41] +[unused42] +[unused43] +[unused44] +[unused45] +[unused46] +[unused47] +[unused48] +[unused49] +[unused50] +[unused51] +[unused52] +[unused53] +[unused54] +[unused55] +[unused56] +[unused57] +[unused58] +[unused59] +[unused60] +[unused61] +[unused62] +[unused63] +[unused64] +[unused65] +[unused66] +[unused67] +[unused68] +[unused69] +[unused70] +[unused71] +[unused72] +[unused73] +[unused74] +[unused75] +[unused76] +[unused77] +[unused78] +[unused79] +[unused80] +[unused81] +[unused82] +[unused83] +[unused84] +[unused85] +[unused86] +[unused87] +[unused88] +[unused89] +[unused90] +[unused91] +[unused92] +[unused93] +[unused94] +[unused95] +[unused96] +[unused97] +[unused98] +[unused99] +[UNK] +[CLS] +[SEP] +[MASK] + + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +[ +\ +] +^ +_ +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +£ +¤ +¥ +§ +© +« +® +° +± +² +³ +µ +· +¹ +º +» +¼ +× +ß +æ +÷ +ø +đ +ŋ +ɔ +ə +ɡ +ʰ +ˇ +ˈ +ˊ +ˋ +ˍ +ː +˙ +˚ +ˢ +α +β +γ +δ +ε +η +θ +ι +κ +λ +μ +ν +ο +π +ρ +ς +σ +τ +υ +φ +χ +ψ +ω +а +б +в +г +д +е +ж +з +и +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +ы +ь +я +і +ا +ب +ة +ت +د +ر +س +ع +ل +م +ن +ه +و +ي +۩ +ก +ง +น +ม +ย +ร +อ +า +เ +๑ +་ +ღ +ᄀ +ᄁ +ᄂ +ᄃ +ᄅ +ᄆ +ᄇ +ᄈ +ᄉ +ᄋ +ᄌ +ᄎ +ᄏ +ᄐ +ᄑ +ᄒ +ᅡ +ᅢ +ᅣ +ᅥ +ᅦ +ᅧ +ᅨ +ᅩ +ᅪ +ᅬ +ᅭ +ᅮ +ᅯ +ᅲ +ᅳ +ᅴ +ᅵ +ᆨ +ᆫ +ᆯ +ᆷ +ᆸ +ᆺ +ᆻ +ᆼ +ᗜ +ᵃ +ᵉ +ᵍ +ᵏ +ᵐ +ᵒ +ᵘ +‖ +„ +† +• +‥ +‧ +
 +‰ +′ +″ +‹ +› +※ +‿ +⁄ +ⁱ +⁺ +ⁿ +₁ +₂ +₃ +₄ +€ +℃ +№ +™ +ⅰ +ⅱ +ⅲ +ⅳ +ⅴ +← +↑ +→ +↓ +↔ +↗ +↘ +⇒ +∀ +− +∕ +∙ +√ +∞ +∟ +∠ +∣ +∥ +∩ +∮ +∶ +∼ +∽ +≈ +≒ +≡ +≤ +≥ +≦ +≧ +≪ +≫ +⊙ +⋅ +⋈ +⋯ +⌒ +① +② +③ +④ +⑤ +⑥ +⑦ +⑧ +⑨ +⑩ +⑴ +⑵ +⑶ +⑷ +⑸ +⒈ +⒉ +⒊ +⒋ +ⓒ +ⓔ +ⓘ +─ +━ +│ +┃ +┅ +┆ +┊ +┌ +└ +├ +┣ +═ +║ +╚ +╞ +╠ +╭ +╮ +╯ +╰ +╱ +╳ +▂ +▃ +▅ +▇ +█ +▉ +▋ +▌ +▍ +▎ +■ +□ +▪ +▫ +▬ +▲ +△ +▶ +► +▼ +▽ +◆ +◇ +○ +◎ +● +◕ +◠ +◢ +◤ +☀ +★ +☆ +☕ +☞ +☺ +☼ +♀ +♂ +♠ +♡ +♣ +♥ +♦ +♪ +♫ +♬ +✈ +✔ +✕ +✖ +✦ +✨ +✪ +✰ +✿ +❀ +❤ +➜ +➤ +⦿ +、 +。 +〃 +々 +〇 +〈 +〉 +《 +》 +「 +」 +『 +』 +【 +】 +〓 +〔 +〕 +〖 +〗 +〜 +〝 +〞 +ぁ +あ +ぃ +い +う +ぇ +え +お +か +き +く +け +こ +さ +し +す +せ +そ +た +ち +っ +つ +て +と +な +に +ぬ +ね +の +は +ひ +ふ +へ +ほ +ま +み +む +め +も +ゃ +や +ゅ +ゆ +ょ +よ +ら +り +る +れ +ろ +わ +を +ん +゜ +ゝ +ァ +ア +ィ +イ +ゥ +ウ +ェ +エ +ォ +オ +カ +キ +ク +ケ +コ +サ +シ +ス +セ +ソ +タ +チ +ッ +ツ +テ +ト +ナ +ニ +ヌ +ネ +ノ +ハ +ヒ +フ +ヘ +ホ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ワ +ヲ +ン +ヶ +・ +ー +ヽ +ㄅ +ㄆ +ㄇ +ㄉ +ㄋ +ㄌ +ㄍ +ㄎ +ㄏ +ㄒ +ㄚ +ㄛ +ㄞ +ㄟ +ㄢ +ㄤ +ㄥ +ㄧ +ㄨ +ㆍ +㈦ +㊣ +㎡ +㗎 +一 +丁 +七 +万 +丈 +三 +上 +下 +不 +与 +丐 +丑 +专 +且 +丕 +世 +丘 +丙 +业 +丛 +东 +丝 +丞 +丟 +両 +丢 +两 +严 +並 +丧 +丨 +个 +丫 +中 +丰 +串 +临 +丶 +丸 +丹 +为 +主 +丼 +丽 +举 +丿 +乂 +乃 +久 +么 +义 +之 +乌 +乍 +乎 +乏 +乐 +乒 +乓 +乔 +乖 +乗 +乘 +乙 +乜 +九 +乞 +也 +习 +乡 +书 +乩 +买 +乱 +乳 +乾 +亀 +亂 +了 +予 +争 +事 +二 +于 +亏 +云 +互 +五 +井 +亘 +亙 +亚 +些 +亜 +亞 +亟 +亡 +亢 +交 +亥 +亦 +产 +亨 +亩 +享 +京 +亭 +亮 +亲 +亳 +亵 +人 +亿 +什 +仁 +仃 +仄 +仅 +仆 +仇 +今 +介 +仍 +从 +仏 +仑 +仓 +仔 +仕 +他 +仗 +付 +仙 +仝 +仞 +仟 +代 +令 +以 +仨 +仪 +们 +仮 +仰 +仲 +件 +价 +任 +份 +仿 +企 +伉 +伊 +伍 +伎 +伏 +伐 +休 +伕 +众 +优 +伙 +会 +伝 +伞 +伟 +传 +伢 +伤 +伦 +伪 +伫 +伯 +估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +佇 +佈 +位 +低 +住 +佐 +佑 +体 +佔 +何 +佗 +佘 +余 +佚 +佛 +作 +佝 +佞 +佟 +你 +佢 +佣 +佤 +佥 +佩 +佬 +佯 +佰 +佳 +併 +佶 +佻 +佼 +使 +侃 +侄 +來 +侈 +例 +侍 +侏 +侑 +侖 +侗 +供 +依 +侠 +価 +侣 +侥 +侦 +侧 +侨 +侬 +侮 +侯 +侵 +侶 +侷 +便 +係 +促 +俄 +俊 +俎 +俏 +俐 +俑 +俗 +俘 +俚 +保 +俞 +俟 +俠 +信 +俨 +俩 +俪 +俬 +俭 +修 +俯 +俱 +俳 +俸 +俺 +俾 +倆 +倉 +個 +倌 +倍 +倏 +們 +倒 +倔 +倖 +倘 +候 +倚 +倜 +借 +倡 +値 +倦 +倩 +倪 +倫 +倬 +倭 +倶 +债 +值 +倾 +偃 +假 +偈 +偉 +偌 +偎 +偏 +偕 +做 +停 +健 +側 +偵 +偶 +偷 +偻 +偽 +偿 +傀 +傅 +傍 +傑 +傘 +備 +傚 +傢 +傣 +傥 +储 +傩 +催 +傭 +傲 +傳 +債 +傷 +傻 +傾 +僅 +働 +像 +僑 +僕 +僖 +僚 +僥 +僧 +僭 +僮 +僱 +僵 +價 +僻 +儀 +儂 +億 +儆 +儉 +儋 +儒 +儕 +儘 +償 +儡 +優 +儲 +儷 +儼 +儿 +兀 +允 +元 +兄 +充 +兆 +兇 +先 +光 +克 +兌 +免 +児 +兑 +兒 +兔 +兖 +党 +兜 +兢 +入 +內 +全 +兩 +八 +公 +六 +兮 +兰 +共 +兲 +关 +兴 +兵 +其 +具 +典 +兹 +养 +兼 +兽 +冀 +内 +円 +冇 +冈 +冉 +冊 +册 +再 +冏 +冒 +冕 +冗 +写 +军 +农 +冠 +冢 +冤 +冥 +冨 +冪 +冬 +冯 +冰 +冲 +决 +况 +冶 +冷 +冻 +冼 +冽 +冾 +净 +凄 +准 +凇 +凈 +凉 +凋 +凌 +凍 +减 +凑 +凛 +凜 +凝 +几 +凡 +凤 +処 +凪 +凭 +凯 +凰 +凱 +凳 +凶 +凸 +凹 +出 +击 +函 +凿 +刀 +刁 +刃 +分 +切 +刈 +刊 +刍 +刎 +刑 +划 +列 +刘 +则 +刚 +创 +初 +删 +判 +別 +刨 +利 +刪 +别 +刮 +到 +制 +刷 +券 +刹 +刺 +刻 +刽 +剁 +剂 +剃 +則 +剉 +削 +剋 +剌 +前 +剎 +剐 +剑 +剔 +剖 +剛 +剜 +剝 +剣 +剤 +剥 +剧 +剩 +剪 +副 +割 +創 +剷 +剽 +剿 +劃 +劇 +劈 +劉 +劊 +劍 +劏 +劑 +力 +劝 +办 +功 +加 +务 +劣 +动 +助 +努 +劫 +劭 +励 +劲 +劳 +労 +劵 +効 +劾 +势 +勁 +勃 +勇 +勉 +勋 +勐 +勒 +動 +勖 +勘 +務 +勛 +勝 +勞 +募 +勢 +勤 +勧 +勳 +勵 +勸 +勺 +勻 +勾 +勿 +匀 +包 +匆 +匈 +匍 +匐 +匕 +化 +北 +匙 +匝 +匠 +匡 +匣 +匪 +匮 +匯 +匱 +匹 +区 +医 +匾 +匿 +區 +十 +千 +卅 +升 +午 +卉 +半 +卍 +华 +协 +卑 +卒 +卓 +協 +单 +卖 +南 +単 +博 +卜 +卞 +卟 +占 +卡 +卢 +卤 +卦 +卧 +卫 +卮 +卯 +印 +危 +即 +却 +卵 +卷 +卸 +卻 +卿 +厂 +厄 +厅 +历 +厉 +压 +厌 +厕 +厘 +厚 +厝 +原 +厢 +厥 +厦 +厨 +厩 +厭 +厮 +厲 +厳 +去 +县 +叁 +参 +參 +又 +叉 +及 +友 +双 +反 +収 +发 +叔 +取 +受 +变 +叙 +叛 +叟 +叠 +叡 +叢 +口 +古 +句 +另 +叨 +叩 +只 +叫 +召 +叭 +叮 +可 +台 +叱 +史 +右 +叵 +叶 +号 +司 +叹 +叻 +叼 +叽 +吁 +吃 +各 +吆 +合 +吉 +吊 +吋 +同 +名 +后 +吏 +吐 +向 +吒 +吓 +吕 +吖 +吗 +君 +吝 +吞 +吟 +吠 +吡 +否 +吧 +吨 +吩 +含 +听 +吭 +吮 +启 +吱 +吳 +吴 +吵 +吶 +吸 +吹 +吻 +吼 +吽 +吾 +呀 +呂 +呃 +呆 +呈 +告 +呋 +呎 +呐 +呓 +呕 +呗 +员 +呛 +呜 +呢 +呤 +呦 +周 +呱 +呲 +味 +呵 +呷 +呸 +呻 +呼 +命 +咀 +咁 +咂 +咄 +咆 +咋 +和 +咎 +咏 +咐 +咒 +咔 +咕 +咖 +咗 +咘 +咙 +咚 +咛 +咣 +咤 +咦 +咧 +咨 +咩 +咪 +咫 +咬 +咭 +咯 +咱 +咲 +咳 +咸 +咻 +咽 +咿 +哀 +品 +哂 +哄 +哆 +哇 +哈 +哉 +哋 +哌 +响 +哎 +哏 +哐 +哑 +哒 +哔 +哗 +哟 +員 +哥 +哦 +哧 +哨 +哩 +哪 +哭 +哮 +哲 +哺 +哼 +哽 +唁 +唄 +唆 +唇 +唉 +唏 +唐 +唑 +唔 +唠 +唤 +唧 +唬 +售 +唯 +唰 +唱 +唳 +唷 +唸 +唾 +啃 +啄 +商 +啉 +啊 +問 +啓 +啕 +啖 +啜 +啞 +啟 +啡 +啤 +啥 +啦 +啧 +啪 +啫 +啬 +啮 +啰 +啱 +啲 +啵 +啶 +啷 +啸 +啻 +啼 +啾 +喀 +喂 +喃 +善 +喆 +喇 +喉 +喊 +喋 +喎 +喏 +喔 +喘 +喙 +喚 +喜 +喝 +喟 +喧 +喪 +喫 +喬 +單 +喰 +喱 +喲 +喳 +喵 +営 +喷 +喹 +喺 +喻 +喽 +嗅 +嗆 +嗇 +嗎 +嗑 +嗒 +嗓 +嗔 +嗖 +嗚 +嗜 +嗝 +嗟 +嗡 +嗣 +嗤 +嗦 +嗨 +嗪 +嗬 +嗯 +嗰 +嗲 +嗳 +嗶 +嗷 +嗽 +嘀 +嘅 +嘆 +嘈 +嘉 +嘌 +嘍 +嘎 +嘔 +嘖 +嘗 +嘘 +嘚 +嘛 +嘜 +嘞 +嘟 +嘢 +嘣 +嘤 +嘧 +嘩 +嘭 +嘮 +嘯 +嘰 +嘱 +嘲 +嘴 +嘶 +嘸 +嘹 +嘻 +嘿 +噁 +噌 +噎 +噓 +噔 +噗 +噙 +噜 +噠 +噢 +噤 +器 +噩 +噪 +噬 +噱 +噴 +噶 +噸 +噹 +噻 +噼 +嚀 +嚇 +嚎 +嚏 +嚐 +嚓 +嚕 +嚟 +嚣 +嚥 +嚨 +嚮 +嚴 +嚷 +嚼 +囂 +囉 +囊 +囍 +囑 +囔 +囗 +囚 +四 +囝 +回 +囟 +因 +囡 +团 +団 +囤 +囧 +囪 +囫 +园 +困 +囱 +囲 +図 +围 +囹 +固 +国 +图 +囿 +圃 +圄 +圆 +圈 +國 +圍 +圏 +園 +圓 +圖 +團 +圜 +土 +圣 +圧 +在 +圩 +圭 +地 +圳 +场 +圻 +圾 +址 +坂 +均 +坊 +坍 +坎 +坏 +坐 +坑 +块 +坚 +坛 +坝 +坞 +坟 +坠 +坡 +坤 +坦 +坨 +坪 +坯 +坳 +坵 +坷 +垂 +垃 +垄 +型 +垒 +垚 +垛 +垠 +垢 +垣 +垦 +垩 +垫 +垭 +垮 +垵 +埂 +埃 +埋 +城 +埔 +埕 +埗 +域 +埠 +埤 +埵 +執 +埸 +培 +基 +埼 +堀 +堂 +堃 +堅 +堆 +堇 +堑 +堕 +堙 +堡 +堤 +堪 +堯 +堰 +報 +場 +堵 +堺 +堿 +塊 +塌 +塑 +塔 +塗 +塘 +塚 +塞 +塢 +塩 +填 +塬 +塭 +塵 +塾 +墀 +境 +墅 +墉 +墊 +墒 +墓 +増 +墘 +墙 +墜 +增 +墟 +墨 +墩 +墮 +墳 +墻 +墾 +壁 +壅 +壆 +壇 +壊 +壑 +壓 +壕 +壘 +壞 +壟 +壢 +壤 +壩 +士 +壬 +壮 +壯 +声 +売 +壳 +壶 +壹 +壺 +壽 +处 +备 +変 +复 +夏 +夔 +夕 +外 +夙 +多 +夜 +够 +夠 +夢 +夥 +大 +天 +太 +夫 +夭 +央 +夯 +失 +头 +夷 +夸 +夹 +夺 +夾 +奂 +奄 +奇 +奈 +奉 +奋 +奎 +奏 +奐 +契 +奔 +奕 +奖 +套 +奘 +奚 +奠 +奢 +奥 +奧 +奪 +奬 +奮 +女 +奴 +奶 +奸 +她 +好 +如 +妃 +妄 +妆 +妇 +妈 +妊 +妍 +妒 +妓 +妖 +妘 +妙 +妝 +妞 +妣 +妤 +妥 +妨 +妩 +妪 +妮 +妲 +妳 +妹 +妻 +妾 +姆 +姉 +姊 +始 +姍 +姐 +姑 +姒 +姓 +委 +姗 +姚 +姜 +姝 +姣 +姥 +姦 +姨 +姪 +姫 +姬 +姹 +姻 +姿 +威 +娃 +娄 +娅 +娆 +娇 +娉 +娑 +娓 +娘 +娛 +娜 +娟 +娠 +娣 +娥 +娩 +娱 +娲 +娴 +娶 +娼 +婀 +婁 +婆 +婉 +婊 +婕 +婚 +婢 +婦 +婧 +婪 +婭 +婴 +婵 +婶 +婷 +婺 +婿 +媒 +媚 +媛 +媞 +媧 +媲 +媳 +媽 +媾 +嫁 +嫂 +嫉 +嫌 +嫑 +嫔 +嫖 +嫘 +嫚 +嫡 +嫣 +嫦 +嫩 +嫲 +嫵 +嫻 +嬅 +嬉 +嬌 +嬗 +嬛 +嬢 +嬤 +嬪 +嬰 +嬴 +嬷 +嬸 +嬿 +孀 +孃 +子 +孑 +孔 +孕 +孖 +字 +存 +孙 +孚 +孛 +孜 +孝 +孟 +孢 +季 +孤 +学 +孩 +孪 +孫 +孬 +孰 +孱 +孳 +孵 +學 +孺 +孽 +孿 +宁 +它 +宅 +宇 +守 +安 +宋 +完 +宏 +宓 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +实 +実 +宠 +审 +客 +宣 +室 +宥 +宦 +宪 +宫 +宮 +宰 +害 +宴 +宵 +家 +宸 +容 +宽 +宾 +宿 +寂 +寄 +寅 +密 +寇 +富 +寐 +寒 +寓 +寛 +寝 +寞 +察 +寡 +寢 +寥 +實 +寧 +寨 +審 +寫 +寬 +寮 +寰 +寵 +寶 +寸 +对 +寺 +寻 +导 +対 +寿 +封 +専 +射 +将 +將 +專 +尉 +尊 +尋 +對 +導 +小 +少 +尔 +尕 +尖 +尘 +尚 +尝 +尤 +尧 +尬 +就 +尴 +尷 +尸 +尹 +尺 +尻 +尼 +尽 +尾 +尿 +局 +屁 +层 +屄 +居 +屆 +屈 +屉 +届 +屋 +屌 +屍 +屎 +屏 +屐 +屑 +展 +屜 +属 +屠 +屡 +屢 +層 +履 +屬 +屯 +山 +屹 +屿 +岀 +岁 +岂 +岌 +岐 +岑 +岔 +岖 +岗 +岘 +岙 +岚 +岛 +岡 +岩 +岫 +岬 +岭 +岱 +岳 +岷 +岸 +峇 +峋 +峒 +峙 +峡 +峤 +峥 +峦 +峨 +峪 +峭 +峯 +峰 +峴 +島 +峻 +峽 +崁 +崂 +崆 +崇 +崎 +崑 +崔 +崖 +崗 +崙 +崛 +崧 +崩 +崭 +崴 +崽 +嵇 +嵊 +嵋 +嵌 +嵐 +嵘 +嵩 +嵬 +嵯 +嶂 +嶄 +嶇 +嶋 +嶙 +嶺 +嶼 +嶽 +巅 +巍 +巒 +巔 +巖 +川 +州 +巡 +巢 +工 +左 +巧 +巨 +巩 +巫 +差 +己 +已 +巳 +巴 +巷 +巻 +巽 +巾 +巿 +币 +市 +布 +帅 +帆 +师 +希 +帐 +帑 +帕 +帖 +帘 +帚 +帛 +帜 +帝 +帥 +带 +帧 +師 +席 +帮 +帯 +帰 +帳 +帶 +帷 +常 +帼 +帽 +幀 +幂 +幄 +幅 +幌 +幔 +幕 +幟 +幡 +幢 +幣 +幫 +干 +平 +年 +并 +幸 +幹 +幺 +幻 +幼 +幽 +幾 +广 +庁 +広 +庄 +庆 +庇 +床 +序 +庐 +库 +应 +底 +庖 +店 +庙 +庚 +府 +庞 +废 +庠 +度 +座 +庫 +庭 +庵 +庶 +康 +庸 +庹 +庾 +廁 +廂 +廃 +廈 +廉 +廊 +廓 +廖 +廚 +廝 +廟 +廠 +廢 +廣 +廬 +廳 +延 +廷 +建 +廿 +开 +弁 +异 +弃 +弄 +弈 +弊 +弋 +式 +弑 +弒 +弓 +弔 +引 +弗 +弘 +弛 +弟 +张 +弥 +弦 +弧 +弩 +弭 +弯 +弱 +張 +強 +弹 +强 +弼 +弾 +彅 +彆 +彈 +彌 +彎 +归 +当 +录 +彗 +彙 +彝 +形 +彤 +彥 +彦 +彧 +彩 +彪 +彫 +彬 +彭 +彰 +影 +彷 +役 +彻 +彼 +彿 +往 +征 +径 +待 +徇 +很 +徉 +徊 +律 +後 +徐 +徑 +徒 +従 +徕 +得 +徘 +徙 +徜 +從 +徠 +御 +徨 +復 +循 +徬 +微 +徳 +徴 +徵 +德 +徹 +徼 +徽 +心 +必 +忆 +忌 +忍 +忏 +忐 +忑 +忒 +忖 +志 +忘 +忙 +応 +忠 +忡 +忤 +忧 +忪 +快 +忱 +念 +忻 +忽 +忿 +怀 +态 +怂 +怅 +怆 +怎 +怏 +怒 +怔 +怕 +怖 +怙 +怜 +思 +怠 +怡 +急 +怦 +性 +怨 +怪 +怯 +怵 +总 +怼 +恁 +恃 +恆 +恋 +恍 +恐 +恒 +恕 +恙 +恚 +恢 +恣 +恤 +恥 +恨 +恩 +恪 +恫 +恬 +恭 +息 +恰 +恳 +恵 +恶 +恸 +恺 +恻 +恼 +恿 +悄 +悅 +悉 +悌 +悍 +悔 +悖 +悚 +悟 +悠 +患 +悦 +您 +悩 +悪 +悬 +悯 +悱 +悲 +悴 +悵 +悶 +悸 +悻 +悼 +悽 +情 +惆 +惇 +惊 +惋 +惑 +惕 +惘 +惚 +惜 +惟 +惠 +惡 +惦 +惧 +惨 +惩 +惫 +惬 +惭 +惮 +惯 +惰 +惱 +想 +惴 +惶 +惹 +惺 +愁 +愆 +愈 +愉 +愍 +意 +愕 +愚 +愛 +愜 +感 +愣 +愤 +愧 +愫 +愷 +愿 +慄 +慈 +態 +慌 +慎 +慑 +慕 +慘 +慚 +慟 +慢 +慣 +慧 +慨 +慫 +慮 +慰 +慳 +慵 +慶 +慷 +慾 +憂 +憊 +憋 +憎 +憐 +憑 +憔 +憚 +憤 +憧 +憨 +憩 +憫 +憬 +憲 +憶 +憾 +懂 +懇 +懈 +應 +懊 +懋 +懑 +懒 +懦 +懲 +懵 +懶 +懷 +懸 +懺 +懼 +懾 +懿 +戀 +戈 +戊 +戌 +戍 +戎 +戏 +成 +我 +戒 +戕 +或 +战 +戚 +戛 +戟 +戡 +戦 +截 +戬 +戮 +戰 +戲 +戳 +戴 +戶 +户 +戸 +戻 +戾 +房 +所 +扁 +扇 +扈 +扉 +手 +才 +扎 +扑 +扒 +打 +扔 +払 +托 +扛 +扣 +扦 +执 +扩 +扪 +扫 +扬 +扭 +扮 +扯 +扰 +扱 +扳 +扶 +批 +扼 +找 +承 +技 +抄 +抉 +把 +抑 +抒 +抓 +投 +抖 +抗 +折 +抚 +抛 +抜 +択 +抟 +抠 +抡 +抢 +护 +报 +抨 +披 +抬 +抱 +抵 +抹 +押 +抽 +抿 +拂 +拄 +担 +拆 +拇 +拈 +拉 +拋 +拌 +拍 +拎 +拐 +拒 +拓 +拔 +拖 +拗 +拘 +拙 +拚 +招 +拜 +拟 +拡 +拢 +拣 +拥 +拦 +拧 +拨 +择 +括 +拭 +拮 +拯 +拱 +拳 +拴 +拷 +拼 +拽 +拾 +拿 +持 +挂 +指 +挈 +按 +挎 +挑 +挖 +挙 +挚 +挛 +挝 +挞 +挟 +挠 +挡 +挣 +挤 +挥 +挨 +挪 +挫 +振 +挲 +挹 +挺 +挽 +挾 +捂 +捅 +捆 +捉 +捋 +捌 +捍 +捎 +捏 +捐 +捕 +捞 +损 +捡 +换 +捣 +捧 +捨 +捩 +据 +捱 +捲 +捶 +捷 +捺 +捻 +掀 +掂 +掃 +掇 +授 +掉 +掌 +掏 +掐 +排 +掖 +掘 +掙 +掛 +掠 +採 +探 +掣 +接 +控 +推 +掩 +措 +掬 +掰 +掲 +掳 +掴 +掷 +掸 +掺 +揀 +揃 +揄 +揆 +揉 +揍 +描 +提 +插 +揖 +揚 +換 +握 +揣 +揩 +揪 +揭 +揮 +援 +揶 +揸 +揹 +揽 +搀 +搁 +搂 +搅 +損 +搏 +搐 +搓 +搔 +搖 +搗 +搜 +搞 +搡 +搪 +搬 +搭 +搵 +搶 +携 +搽 +摀 +摁 +摄 +摆 +摇 +摈 +摊 +摒 +摔 +摘 +摞 +摟 +摧 +摩 +摯 +摳 +摸 +摹 +摺 +摻 +撂 +撃 +撅 +撇 +撈 +撐 +撑 +撒 +撓 +撕 +撚 +撞 +撤 +撥 +撩 +撫 +撬 +播 +撮 +撰 +撲 +撵 +撷 +撸 +撻 +撼 +撿 +擀 +擁 +擂 +擄 +擅 +擇 +擊 +擋 +操 +擎 +擒 +擔 +擘 +據 +擞 +擠 +擡 +擢 +擦 +擬 +擰 +擱 +擲 +擴 +擷 +擺 +擼 +擾 +攀 +攏 +攒 +攔 +攘 +攙 +攜 +攝 +攞 +攢 +攣 +攤 +攥 +攪 +攫 +攬 +支 +收 +攸 +改 +攻 +放 +政 +故 +效 +敌 +敍 +敎 +敏 +救 +敕 +敖 +敗 +敘 +教 +敛 +敝 +敞 +敢 +散 +敦 +敬 +数 +敲 +整 +敵 +敷 +數 +斂 +斃 +文 +斋 +斌 +斎 +斐 +斑 +斓 +斗 +料 +斛 +斜 +斟 +斡 +斤 +斥 +斧 +斩 +斫 +斬 +断 +斯 +新 +斷 +方 +於 +施 +旁 +旃 +旅 +旋 +旌 +旎 +族 +旖 +旗 +无 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旮 +旱 +时 +旷 +旺 +旻 +昀 +昂 +昆 +昇 +昉 +昊 +昌 +明 +昏 +易 +昔 +昕 +昙 +星 +映 +春 +昧 +昨 +昭 +是 +昱 +昴 +昵 +昶 +昼 +显 +晁 +時 +晃 +晉 +晋 +晌 +晏 +晒 +晓 +晔 +晕 +晖 +晗 +晚 +晝 +晞 +晟 +晤 +晦 +晨 +晩 +普 +景 +晰 +晴 +晶 +晷 +智 +晾 +暂 +暄 +暇 +暈 +暉 +暌 +暐 +暑 +暖 +暗 +暝 +暢 +暧 +暨 +暫 +暮 +暱 +暴 +暸 +暹 +曄 +曆 +曇 +曉 +曖 +曙 +曜 +曝 +曠 +曦 +曬 +曰 +曲 +曳 +更 +書 +曹 +曼 +曾 +替 +最 +會 +月 +有 +朋 +服 +朐 +朔 +朕 +朗 +望 +朝 +期 +朦 +朧 +木 +未 +末 +本 +札 +朮 +术 +朱 +朴 +朵 +机 +朽 +杀 +杂 +权 +杆 +杈 +杉 +李 +杏 +材 +村 +杓 +杖 +杜 +杞 +束 +杠 +条 +来 +杨 +杭 +杯 +杰 +東 +杳 +杵 +杷 +杼 +松 +板 +极 +构 +枇 +枉 +枋 +析 +枕 +林 +枚 +果 +枝 +枢 +枣 +枪 +枫 +枭 +枯 +枰 +枱 +枳 +架 +枷 +枸 +柄 +柏 +某 +柑 +柒 +染 +柔 +柘 +柚 +柜 +柞 +柠 +柢 +查 +柩 +柬 +柯 +柱 +柳 +柴 +柵 +査 +柿 +栀 +栃 +栄 +栅 +标 +栈 +栉 +栋 +栎 +栏 +树 +栓 +栖 +栗 +校 +栩 +株 +样 +核 +根 +格 +栽 +栾 +桀 +桁 +桂 +桃 +桅 +框 +案 +桉 +桌 +桎 +桐 +桑 +桓 +桔 +桜 +桠 +桡 +桢 +档 +桥 +桦 +桧 +桨 +桩 +桶 +桿 +梁 +梅 +梆 +梏 +梓 +梗 +條 +梟 +梢 +梦 +梧 +梨 +梭 +梯 +械 +梳 +梵 +梶 +检 +棂 +棄 +棉 +棋 +棍 +棒 +棕 +棗 +棘 +棚 +棟 +棠 +棣 +棧 +森 +棱 +棲 +棵 +棹 +棺 +椁 +椅 +椋 +植 +椎 +椒 +検 +椪 +椭 +椰 +椹 +椽 +椿 +楂 +楊 +楓 +楔 +楚 +楝 +楞 +楠 +楣 +楨 +楫 +業 +楮 +極 +楷 +楸 +楹 +楼 +楽 +概 +榄 +榆 +榈 +榉 +榔 +榕 +榖 +榛 +榜 +榨 +榫 +榭 +榮 +榱 +榴 +榷 +榻 +槁 +槃 +構 +槌 +槍 +槎 +槐 +槓 +様 +槛 +槟 +槤 +槭 +槲 +槳 +槻 +槽 +槿 +樁 +樂 +樊 +樑 +樓 +標 +樞 +樟 +模 +樣 +権 +横 +樫 +樯 +樱 +樵 +樸 +樹 +樺 +樽 +樾 +橄 +橇 +橋 +橐 +橘 +橙 +機 +橡 +橢 +橫 +橱 +橹 +橼 +檀 +檄 +檎 +檐 +檔 +檗 +檜 +檢 +檬 +檯 +檳 +檸 +檻 +櫃 +櫚 +櫛 +櫥 +櫸 +櫻 +欄 +權 +欒 +欖 +欠 +次 +欢 +欣 +欧 +欲 +欸 +欺 +欽 +款 +歆 +歇 +歉 +歌 +歎 +歐 +歓 +歙 +歛 +歡 +止 +正 +此 +步 +武 +歧 +歩 +歪 +歯 +歲 +歳 +歴 +歷 +歸 +歹 +死 +歼 +殁 +殃 +殆 +殇 +殉 +殊 +残 +殒 +殓 +殖 +殘 +殞 +殡 +殤 +殭 +殯 +殲 +殴 +段 +殷 +殺 +殼 +殿 +毀 +毁 +毂 +毅 +毆 +毋 +母 +毎 +每 +毒 +毓 +比 +毕 +毗 +毘 +毙 +毛 +毡 +毫 +毯 +毽 +氈 +氏 +氐 +民 +氓 +气 +氖 +気 +氙 +氛 +氟 +氡 +氢 +氣 +氤 +氦 +氧 +氨 +氪 +氫 +氮 +氯 +氰 +氲 +水 +氷 +永 +氹 +氾 +汀 +汁 +求 +汆 +汇 +汉 +汎 +汐 +汕 +汗 +汙 +汛 +汝 +汞 +江 +池 +污 +汤 +汨 +汩 +汪 +汰 +汲 +汴 +汶 +汹 +決 +汽 +汾 +沁 +沂 +沃 +沅 +沈 +沉 +沌 +沏 +沐 +沒 +沓 +沖 +沙 +沛 +沟 +没 +沢 +沣 +沥 +沦 +沧 +沪 +沫 +沭 +沮 +沱 +河 +沸 +油 +治 +沼 +沽 +沾 +沿 +況 +泄 +泉 +泊 +泌 +泓 +法 +泗 +泛 +泞 +泠 +泡 +波 +泣 +泥 +注 +泪 +泫 +泮 +泯 +泰 +泱 +泳 +泵 +泷 +泸 +泻 +泼 +泽 +泾 +洁 +洄 +洋 +洒 +洗 +洙 +洛 +洞 +津 +洩 +洪 +洮 +洱 +洲 +洵 +洶 +洸 +洹 +活 +洼 +洽 +派 +流 +浃 +浄 +浅 +浆 +浇 +浊 +测 +济 +浏 +浑 +浒 +浓 +浔 +浙 +浚 +浜 +浣 +浦 +浩 +浪 +浬 +浮 +浯 +浴 +海 +浸 +涂 +涅 +涇 +消 +涉 +涌 +涎 +涓 +涔 +涕 +涙 +涛 +涝 +涞 +涟 +涠 +涡 +涣 +涤 +润 +涧 +涨 +涩 +涪 +涮 +涯 +液 +涵 +涸 +涼 +涿 +淀 +淄 +淅 +淆 +淇 +淋 +淌 +淑 +淒 +淖 +淘 +淙 +淚 +淞 +淡 +淤 +淦 +淨 +淩 +淪 +淫 +淬 +淮 +深 +淳 +淵 +混 +淹 +淺 +添 +淼 +清 +済 +渉 +渊 +渋 +渍 +渎 +渐 +渔 +渗 +渙 +渚 +減 +渝 +渠 +渡 +渣 +渤 +渥 +渦 +温 +測 +渭 +港 +渲 +渴 +游 +渺 +渾 +湃 +湄 +湊 +湍 +湖 +湘 +湛 +湟 +湧 +湫 +湮 +湯 +湳 +湾 +湿 +満 +溃 +溅 +溉 +溏 +源 +準 +溜 +溝 +溟 +溢 +溥 +溧 +溪 +溫 +溯 +溱 +溴 +溶 +溺 +溼 +滁 +滂 +滄 +滅 +滇 +滋 +滌 +滑 +滓 +滔 +滕 +滙 +滚 +滝 +滞 +滟 +满 +滢 +滤 +滥 +滦 +滨 +滩 +滬 +滯 +滲 +滴 +滷 +滸 +滾 +滿 +漁 +漂 +漆 +漉 +漏 +漓 +演 +漕 +漠 +漢 +漣 +漩 +漪 +漫 +漬 +漯 +漱 +漲 +漳 +漸 +漾 +漿 +潆 +潇 +潋 +潍 +潑 +潔 +潘 +潛 +潜 +潞 +潟 +潢 +潤 +潦 +潧 +潭 +潮 +潰 +潴 +潸 +潺 +潼 +澀 +澄 +澆 +澈 +澍 +澎 +澗 +澜 +澡 +澤 +澧 +澱 +澳 +澹 +激 +濁 +濂 +濃 +濑 +濒 +濕 +濘 +濛 +濟 +濠 +濡 +濤 +濫 +濬 +濮 +濯 +濱 +濺 +濾 +瀅 +瀆 +瀉 +瀋 +瀏 +瀑 +瀕 +瀘 +瀚 +瀛 +瀝 +瀞 +瀟 +瀧 +瀨 +瀬 +瀰 +瀾 +灌 +灏 +灑 +灘 +灝 +灞 +灣 +火 +灬 +灭 +灯 +灰 +灵 +灶 +灸 +灼 +災 +灾 +灿 +炀 +炁 +炅 +炉 +炊 +炎 +炒 +炔 +炕 +炖 +炙 +炜 +炫 +炬 +炭 +炮 +炯 +炳 +炷 +炸 +点 +為 +炼 +炽 +烁 +烂 +烃 +烈 +烊 +烏 +烘 +烙 +烛 +烟 +烤 +烦 +烧 +烨 +烩 +烫 +烬 +热 +烯 +烷 +烹 +烽 +焉 +焊 +焕 +焖 +焗 +焘 +焙 +焚 +焜 +無 +焦 +焯 +焰 +焱 +然 +焼 +煅 +煉 +煊 +煌 +煎 +煒 +煖 +煙 +煜 +煞 +煤 +煥 +煦 +照 +煨 +煩 +煮 +煲 +煸 +煽 +熄 +熊 +熏 +熒 +熔 +熙 +熟 +熠 +熨 +熬 +熱 +熵 +熹 +熾 +燁 +燃 +燄 +燈 +燉 +燊 +燎 +燒 +燔 +燕 +燙 +燜 +營 +燥 +燦 +燧 +燭 +燮 +燴 +燻 +燼 +燿 +爆 +爍 +爐 +爛 +爪 +爬 +爭 +爰 +爱 +爲 +爵 +父 +爷 +爸 +爹 +爺 +爻 +爽 +爾 +牆 +片 +版 +牌 +牍 +牒 +牙 +牛 +牝 +牟 +牠 +牡 +牢 +牦 +牧 +物 +牯 +牲 +牴 +牵 +特 +牺 +牽 +犀 +犁 +犄 +犊 +犍 +犒 +犢 +犧 +犬 +犯 +状 +犷 +犸 +犹 +狀 +狂 +狄 +狈 +狎 +狐 +狒 +狗 +狙 +狞 +狠 +狡 +狩 +独 +狭 +狮 +狰 +狱 +狸 +狹 +狼 +狽 +猎 +猕 +猖 +猗 +猙 +猛 +猜 +猝 +猥 +猩 +猪 +猫 +猬 +献 +猴 +猶 +猷 +猾 +猿 +獄 +獅 +獎 +獐 +獒 +獗 +獠 +獣 +獨 +獭 +獰 +獲 +獵 +獷 +獸 +獺 +獻 +獼 +獾 +玄 +率 +玉 +王 +玑 +玖 +玛 +玟 +玠 +玥 +玩 +玫 +玮 +环 +现 +玲 +玳 +玷 +玺 +玻 +珀 +珂 +珅 +珈 +珉 +珊 +珍 +珏 +珐 +珑 +珙 +珞 +珠 +珣 +珥 +珩 +珪 +班 +珮 +珲 +珺 +現 +球 +琅 +理 +琇 +琉 +琊 +琍 +琏 +琐 +琛 +琢 +琥 +琦 +琨 +琪 +琬 +琮 +琰 +琲 +琳 +琴 +琵 +琶 +琺 +琼 +瑀 +瑁 +瑄 +瑋 +瑕 +瑗 +瑙 +瑚 +瑛 +瑜 +瑞 +瑟 +瑠 +瑣 +瑤 +瑩 +瑪 +瑯 +瑰 +瑶 +瑾 +璀 +璁 +璃 +璇 +璉 +璋 +璎 +璐 +璜 +璞 +璟 +璧 +璨 +環 +璽 +璿 +瓊 +瓏 +瓒 +瓜 +瓢 +瓣 +瓤 +瓦 +瓮 +瓯 +瓴 +瓶 +瓷 +甄 +甌 +甕 +甘 +甙 +甚 +甜 +生 +產 +産 +甥 +甦 +用 +甩 +甫 +甬 +甭 +甯 +田 +由 +甲 +申 +电 +男 +甸 +町 +画 +甾 +畀 +畅 +界 +畏 +畑 +畔 +留 +畜 +畝 +畢 +略 +畦 +番 +畫 +異 +畲 +畳 +畴 +當 +畸 +畹 +畿 +疆 +疇 +疊 +疏 +疑 +疔 +疖 +疗 +疙 +疚 +疝 +疟 +疡 +疣 +疤 +疥 +疫 +疮 +疯 +疱 +疲 +疳 +疵 +疸 +疹 +疼 +疽 +疾 +痂 +病 +症 +痈 +痉 +痊 +痍 +痒 +痔 +痕 +痘 +痙 +痛 +痞 +痠 +痢 +痣 +痤 +痧 +痨 +痪 +痫 +痰 +痱 +痴 +痹 +痺 +痼 +痿 +瘀 +瘁 +瘋 +瘍 +瘓 +瘘 +瘙 +瘟 +瘠 +瘡 +瘢 +瘤 +瘦 +瘧 +瘩 +瘪 +瘫 +瘴 +瘸 +瘾 +療 +癇 +癌 +癒 +癖 +癜 +癞 +癡 +癢 +癣 +癥 +癫 +癬 +癮 +癱 +癲 +癸 +発 +登 +發 +白 +百 +皂 +的 +皆 +皇 +皈 +皋 +皎 +皑 +皓 +皖 +皙 +皚 +皮 +皰 +皱 +皴 +皺 +皿 +盂 +盃 +盅 +盆 +盈 +益 +盎 +盏 +盐 +监 +盒 +盔 +盖 +盗 +盘 +盛 +盜 +盞 +盟 +盡 +監 +盤 +盥 +盧 +盪 +目 +盯 +盱 +盲 +直 +相 +盹 +盼 +盾 +省 +眈 +眉 +看 +県 +眙 +眞 +真 +眠 +眦 +眨 +眩 +眯 +眶 +眷 +眸 +眺 +眼 +眾 +着 +睁 +睇 +睏 +睐 +睑 +睛 +睜 +睞 +睡 +睢 +督 +睥 +睦 +睨 +睪 +睫 +睬 +睹 +睽 +睾 +睿 +瞄 +瞅 +瞇 +瞋 +瞌 +瞎 +瞑 +瞒 +瞓 +瞞 +瞟 +瞠 +瞥 +瞧 +瞩 +瞪 +瞬 +瞭 +瞰 +瞳 +瞻 +瞼 +瞿 +矇 +矍 +矗 +矚 +矛 +矜 +矢 +矣 +知 +矩 +矫 +短 +矮 +矯 +石 +矶 +矽 +矾 +矿 +码 +砂 +砌 +砍 +砒 +研 +砖 +砗 +砚 +砝 +砣 +砥 +砧 +砭 +砰 +砲 +破 +砷 +砸 +砺 +砼 +砾 +础 +硅 +硐 +硒 +硕 +硝 +硫 +硬 +确 +硯 +硼 +碁 +碇 +碉 +碌 +碍 +碎 +碑 +碓 +碗 +碘 +碚 +碛 +碟 +碣 +碧 +碩 +碰 +碱 +碳 +碴 +確 +碼 +碾 +磁 +磅 +磊 +磋 +磐 +磕 +磚 +磡 +磨 +磬 +磯 +磲 +磷 +磺 +礁 +礎 +礙 +礡 +礦 +礪 +礫 +礴 +示 +礼 +社 +祀 +祁 +祂 +祇 +祈 +祉 +祎 +祐 +祕 +祖 +祗 +祚 +祛 +祜 +祝 +神 +祟 +祠 +祢 +祥 +票 +祭 +祯 +祷 +祸 +祺 +祿 +禀 +禁 +禄 +禅 +禍 +禎 +福 +禛 +禦 +禧 +禪 +禮 +禱 +禹 +禺 +离 +禽 +禾 +禿 +秀 +私 +秃 +秆 +秉 +秋 +种 +科 +秒 +秘 +租 +秣 +秤 +秦 +秧 +秩 +秭 +积 +称 +秸 +移 +秽 +稀 +稅 +程 +稍 +税 +稔 +稗 +稚 +稜 +稞 +稟 +稠 +稣 +種 +稱 +稲 +稳 +稷 +稹 +稻 +稼 +稽 +稿 +穀 +穂 +穆 +穌 +積 +穎 +穗 +穢 +穩 +穫 +穴 +究 +穷 +穹 +空 +穿 +突 +窃 +窄 +窈 +窍 +窑 +窒 +窓 +窕 +窖 +窗 +窘 +窜 +窝 +窟 +窠 +窥 +窦 +窨 +窩 +窪 +窮 +窯 +窺 +窿 +竄 +竅 +竇 +竊 +立 +竖 +站 +竜 +竞 +竟 +章 +竣 +童 +竭 +端 +競 +竹 +竺 +竽 +竿 +笃 +笆 +笈 +笋 +笏 +笑 +笔 +笙 +笛 +笞 +笠 +符 +笨 +第 +笹 +笺 +笼 +筆 +等 +筊 +筋 +筍 +筏 +筐 +筑 +筒 +答 +策 +筛 +筝 +筠 +筱 +筲 +筵 +筷 +筹 +签 +简 +箇 +箋 +箍 +箏 +箐 +箔 +箕 +算 +箝 +管 +箩 +箫 +箭 +箱 +箴 +箸 +節 +篁 +範 +篆 +篇 +築 +篑 +篓 +篙 +篝 +篠 +篡 +篤 +篩 +篪 +篮 +篱 +篷 +簇 +簌 +簍 +簡 +簦 +簧 +簪 +簫 +簷 +簸 +簽 +簾 +簿 +籁 +籃 +籌 +籍 +籐 +籟 +籠 +籤 +籬 +籮 +籲 +米 +类 +籼 +籽 +粄 +粉 +粑 +粒 +粕 +粗 +粘 +粟 +粤 +粥 +粧 +粪 +粮 +粱 +粲 +粳 +粵 +粹 +粼 +粽 +精 +粿 +糅 +糊 +糍 +糕 +糖 +糗 +糙 +糜 +糞 +糟 +糠 +糧 +糬 +糯 +糰 +糸 +系 +糾 +紀 +紂 +約 +紅 +紉 +紊 +紋 +納 +紐 +紓 +純 +紗 +紘 +紙 +級 +紛 +紜 +素 +紡 +索 +紧 +紫 +紮 +累 +細 +紳 +紹 +紺 +終 +絃 +組 +絆 +経 +結 +絕 +絞 +絡 +絢 +給 +絨 +絮 +統 +絲 +絳 +絵 +絶 +絹 +綁 +綏 +綑 +經 +継 +続 +綜 +綠 +綢 +綦 +綫 +綬 +維 +綱 +網 +綴 +綵 +綸 +綺 +綻 +綽 +綾 +綿 +緊 +緋 +総 +緑 +緒 +緘 +線 +緝 +緞 +締 +緣 +編 +緩 +緬 +緯 +練 +緹 +緻 +縁 +縄 +縈 +縛 +縝 +縣 +縫 +縮 +縱 +縴 +縷 +總 +績 +繁 +繃 +繆 +繇 +繋 +織 +繕 +繚 +繞 +繡 +繩 +繪 +繫 +繭 +繳 +繹 +繼 +繽 +纂 +續 +纍 +纏 +纓 +纔 +纖 +纜 +纠 +红 +纣 +纤 +约 +级 +纨 +纪 +纫 +纬 +纭 +纯 +纰 +纱 +纲 +纳 +纵 +纶 +纷 +纸 +纹 +纺 +纽 +纾 +线 +绀 +练 +组 +绅 +细 +织 +终 +绊 +绍 +绎 +经 +绑 +绒 +结 +绔 +绕 +绘 +给 +绚 +绛 +络 +绝 +绞 +统 +绡 +绢 +绣 +绥 +绦 +继 +绩 +绪 +绫 +续 +绮 +绯 +绰 +绳 +维 +绵 +绶 +绷 +绸 +绻 +综 +绽 +绾 +绿 +缀 +缄 +缅 +缆 +缇 +缈 +缉 +缎 +缓 +缔 +缕 +编 +缘 +缙 +缚 +缜 +缝 +缠 +缢 +缤 +缥 +缨 +缩 +缪 +缭 +缮 +缰 +缱 +缴 +缸 +缺 +缽 +罂 +罄 +罌 +罐 +网 +罔 +罕 +罗 +罚 +罡 +罢 +罩 +罪 +置 +罰 +署 +罵 +罷 +罹 +羁 +羅 +羈 +羊 +羌 +美 +羔 +羚 +羞 +羟 +羡 +羣 +群 +羥 +羧 +羨 +義 +羯 +羲 +羸 +羹 +羽 +羿 +翁 +翅 +翊 +翌 +翎 +習 +翔 +翘 +翟 +翠 +翡 +翦 +翩 +翰 +翱 +翳 +翹 +翻 +翼 +耀 +老 +考 +耄 +者 +耆 +耋 +而 +耍 +耐 +耒 +耕 +耗 +耘 +耙 +耦 +耨 +耳 +耶 +耷 +耸 +耻 +耽 +耿 +聂 +聆 +聊 +聋 +职 +聒 +联 +聖 +聘 +聚 +聞 +聪 +聯 +聰 +聲 +聳 +聴 +聶 +職 +聽 +聾 +聿 +肃 +肄 +肅 +肆 +肇 +肉 +肋 +肌 +肏 +肓 +肖 +肘 +肚 +肛 +肝 +肠 +股 +肢 +肤 +肥 +肩 +肪 +肮 +肯 +肱 +育 +肴 +肺 +肽 +肾 +肿 +胀 +胁 +胃 +胄 +胆 +背 +胍 +胎 +胖 +胚 +胛 +胜 +胝 +胞 +胡 +胤 +胥 +胧 +胫 +胭 +胯 +胰 +胱 +胳 +胴 +胶 +胸 +胺 +能 +脂 +脅 +脆 +脇 +脈 +脉 +脊 +脍 +脏 +脐 +脑 +脓 +脖 +脘 +脚 +脛 +脣 +脩 +脫 +脯 +脱 +脲 +脳 +脸 +脹 +脾 +腆 +腈 +腊 +腋 +腌 +腎 +腐 +腑 +腓 +腔 +腕 +腥 +腦 +腩 +腫 +腭 +腮 +腰 +腱 +腳 +腴 +腸 +腹 +腺 +腻 +腼 +腾 +腿 +膀 +膈 +膊 +膏 +膑 +膘 +膚 +膛 +膜 +膝 +膠 +膦 +膨 +膩 +膳 +膺 +膻 +膽 +膾 +膿 +臀 +臂 +臃 +臆 +臉 +臊 +臍 +臓 +臘 +臟 +臣 +臥 +臧 +臨 +自 +臬 +臭 +至 +致 +臺 +臻 +臼 +臾 +舀 +舂 +舅 +舆 +與 +興 +舉 +舊 +舌 +舍 +舎 +舐 +舒 +舔 +舖 +舗 +舛 +舜 +舞 +舟 +航 +舫 +般 +舰 +舱 +舵 +舶 +舷 +舸 +船 +舺 +舾 +艇 +艋 +艘 +艙 +艦 +艮 +良 +艰 +艱 +色 +艳 +艷 +艹 +艺 +艾 +节 +芃 +芈 +芊 +芋 +芍 +芎 +芒 +芙 +芜 +芝 +芡 +芥 +芦 +芩 +芪 +芫 +芬 +芭 +芮 +芯 +花 +芳 +芷 +芸 +芹 +芻 +芽 +芾 +苁 +苄 +苇 +苋 +苍 +苏 +苑 +苒 +苓 +苔 +苕 +苗 +苛 +苜 +苞 +苟 +苡 +苣 +若 +苦 +苫 +苯 +英 +苷 +苹 +苻 +茁 +茂 +范 +茄 +茅 +茉 +茎 +茏 +茗 +茜 +茧 +茨 +茫 +茬 +茭 +茯 +茱 +茲 +茴 +茵 +茶 +茸 +茹 +茼 +荀 +荃 +荆 +草 +荊 +荏 +荐 +荒 +荔 +荖 +荘 +荚 +荞 +荟 +荠 +荡 +荣 +荤 +荥 +荧 +荨 +荪 +荫 +药 +荳 +荷 +荸 +荻 +荼 +荽 +莅 +莆 +莉 +莊 +莎 +莒 +莓 +莖 +莘 +莞 +莠 +莢 +莧 +莪 +莫 +莱 +莲 +莴 +获 +莹 +莺 +莽 +莿 +菀 +菁 +菅 +菇 +菈 +菊 +菌 +菏 +菓 +菖 +菘 +菜 +菟 +菠 +菡 +菩 +華 +菱 +菲 +菸 +菽 +萁 +萃 +萄 +萊 +萋 +萌 +萍 +萎 +萘 +萝 +萤 +营 +萦 +萧 +萨 +萩 +萬 +萱 +萵 +萸 +萼 +落 +葆 +葉 +著 +葚 +葛 +葡 +董 +葦 +葩 +葫 +葬 +葭 +葯 +葱 +葳 +葵 +葷 +葺 +蒂 +蒋 +蒐 +蒔 +蒙 +蒜 +蒞 +蒟 +蒡 +蒨 +蒲 +蒸 +蒹 +蒻 +蒼 +蒿 +蓁 +蓄 +蓆 +蓉 +蓋 +蓑 +蓓 +蓖 +蓝 +蓟 +蓦 +蓬 +蓮 +蓼 +蓿 +蔑 +蔓 +蔔 +蔗 +蔘 +蔚 +蔡 +蔣 +蔥 +蔫 +蔬 +蔭 +蔵 +蔷 +蔺 +蔻 +蔼 +蔽 +蕁 +蕃 +蕈 +蕉 +蕊 +蕎 +蕙 +蕤 +蕨 +蕩 +蕪 +蕭 +蕲 +蕴 +蕻 +蕾 +薄 +薅 +薇 +薈 +薊 +薏 +薑 +薔 +薙 +薛 +薦 +薨 +薩 +薪 +薬 +薯 +薰 +薹 +藉 +藍 +藏 +藐 +藓 +藕 +藜 +藝 +藤 +藥 +藩 +藹 +藻 +藿 +蘆 +蘇 +蘊 +蘋 +蘑 +蘚 +蘭 +蘸 +蘼 +蘿 +虎 +虏 +虐 +虑 +虔 +處 +虚 +虛 +虜 +虞 +號 +虢 +虧 +虫 +虬 +虱 +虹 +虻 +虽 +虾 +蚀 +蚁 +蚂 +蚊 +蚌 +蚓 +蚕 +蚜 +蚝 +蚣 +蚤 +蚩 +蚪 +蚯 +蚱 +蚵 +蛀 +蛆 +蛇 +蛊 +蛋 +蛎 +蛐 +蛔 +蛙 +蛛 +蛟 +蛤 +蛭 +蛮 +蛰 +蛳 +蛹 +蛻 +蛾 +蜀 +蜂 +蜃 +蜆 +蜇 +蜈 +蜊 +蜍 +蜒 +蜓 +蜕 +蜗 +蜘 +蜚 +蜜 +蜡 +蜢 +蜥 +蜱 +蜴 +蜷 +蜻 +蜿 +蝇 +蝈 +蝉 +蝌 +蝎 +蝕 +蝗 +蝙 +蝟 +蝠 +蝦 +蝨 +蝴 +蝶 +蝸 +蝼 +螂 +螃 +融 +螞 +螢 +螨 +螯 +螳 +螺 +蟀 +蟄 +蟆 +蟋 +蟎 +蟑 +蟒 +蟠 +蟬 +蟲 +蟹 +蟻 +蟾 +蠅 +蠍 +蠔 +蠕 +蠛 +蠟 +蠡 +蠢 +蠣 +蠱 +蠶 +蠹 +蠻 +血 +衄 +衅 +衆 +行 +衍 +術 +衔 +街 +衙 +衛 +衝 +衞 +衡 +衢 +衣 +补 +表 +衩 +衫 +衬 +衮 +衰 +衲 +衷 +衹 +衾 +衿 +袁 +袂 +袄 +袅 +袈 +袋 +袍 +袒 +袖 +袜 +袞 +袤 +袪 +被 +袭 +袱 +裁 +裂 +装 +裆 +裊 +裏 +裔 +裕 +裘 +裙 +補 +裝 +裟 +裡 +裤 +裨 +裱 +裳 +裴 +裸 +裹 +製 +裾 +褂 +複 +褐 +褒 +褓 +褔 +褚 +褥 +褪 +褫 +褲 +褶 +褻 +襁 +襄 +襟 +襠 +襪 +襬 +襯 +襲 +西 +要 +覃 +覆 +覇 +見 +規 +覓 +視 +覚 +覦 +覧 +親 +覬 +観 +覷 +覺 +覽 +觀 +见 +观 +规 +觅 +视 +览 +觉 +觊 +觎 +觐 +觑 +角 +觞 +解 +觥 +触 +觸 +言 +訂 +計 +訊 +討 +訓 +訕 +訖 +託 +記 +訛 +訝 +訟 +訣 +訥 +訪 +設 +許 +訳 +訴 +訶 +診 +註 +証 +詆 +詐 +詔 +評 +詛 +詞 +詠 +詡 +詢 +詣 +試 +詩 +詫 +詬 +詭 +詮 +詰 +話 +該 +詳 +詹 +詼 +誅 +誇 +誉 +誌 +認 +誓 +誕 +誘 +語 +誠 +誡 +誣 +誤 +誥 +誦 +誨 +說 +説 +読 +誰 +課 +誹 +誼 +調 +諄 +談 +請 +諏 +諒 +論 +諗 +諜 +諡 +諦 +諧 +諫 +諭 +諮 +諱 +諳 +諷 +諸 +諺 +諾 +謀 +謁 +謂 +謄 +謊 +謎 +謐 +謔 +謗 +謙 +講 +謝 +謠 +謨 +謬 +謹 +謾 +譁 +證 +譎 +譏 +識 +譙 +譚 +譜 +警 +譬 +譯 +議 +譲 +譴 +護 +譽 +讀 +變 +讓 +讚 +讞 +计 +订 +认 +讥 +讧 +讨 +让 +讪 +讫 +训 +议 +讯 +记 +讲 +讳 +讴 +讶 +讷 +许 +讹 +论 +讼 +讽 +设 +访 +诀 +证 +诃 +评 +诅 +识 +诈 +诉 +诊 +诋 +词 +诏 +译 +试 +诗 +诘 +诙 +诚 +诛 +话 +诞 +诟 +诠 +诡 +询 +诣 +诤 +该 +详 +诧 +诩 +诫 +诬 +语 +误 +诰 +诱 +诲 +说 +诵 +诶 +请 +诸 +诺 +读 +诽 +课 +诿 +谀 +谁 +调 +谄 +谅 +谆 +谈 +谊 +谋 +谌 +谍 +谎 +谏 +谐 +谑 +谒 +谓 +谔 +谕 +谗 +谘 +谙 +谚 +谛 +谜 +谟 +谢 +谣 +谤 +谥 +谦 +谧 +谨 +谩 +谪 +谬 +谭 +谯 +谱 +谲 +谴 +谶 +谷 +豁 +豆 +豇 +豈 +豉 +豊 +豌 +豎 +豐 +豔 +豚 +象 +豢 +豪 +豫 +豬 +豹 +豺 +貂 +貅 +貌 +貓 +貔 +貘 +貝 +貞 +負 +財 +貢 +貧 +貨 +販 +貪 +貫 +責 +貯 +貰 +貳 +貴 +貶 +買 +貸 +費 +貼 +貽 +貿 +賀 +賁 +賂 +賃 +賄 +資 +賈 +賊 +賑 +賓 +賜 +賞 +賠 +賡 +賢 +賣 +賤 +賦 +質 +賬 +賭 +賴 +賺 +購 +賽 +贅 +贈 +贊 +贍 +贏 +贓 +贖 +贛 +贝 +贞 +负 +贡 +财 +责 +贤 +败 +账 +货 +质 +贩 +贪 +贫 +贬 +购 +贮 +贯 +贰 +贱 +贲 +贴 +贵 +贷 +贸 +费 +贺 +贻 +贼 +贾 +贿 +赁 +赂 +赃 +资 +赅 +赈 +赊 +赋 +赌 +赎 +赏 +赐 +赓 +赔 +赖 +赘 +赚 +赛 +赝 +赞 +赠 +赡 +赢 +赣 +赤 +赦 +赧 +赫 +赭 +走 +赳 +赴 +赵 +赶 +起 +趁 +超 +越 +趋 +趕 +趙 +趟 +趣 +趨 +足 +趴 +趵 +趸 +趺 +趾 +跃 +跄 +跆 +跋 +跌 +跎 +跑 +跖 +跚 +跛 +距 +跟 +跡 +跤 +跨 +跩 +跪 +路 +跳 +践 +跷 +跹 +跺 +跻 +踉 +踊 +踌 +踏 +踐 +踝 +踞 +踟 +踢 +踩 +踪 +踮 +踱 +踴 +踵 +踹 +蹂 +蹄 +蹇 +蹈 +蹉 +蹊 +蹋 +蹑 +蹒 +蹙 +蹟 +蹣 +蹤 +蹦 +蹩 +蹬 +蹭 +蹲 +蹴 +蹶 +蹺 +蹼 +蹿 +躁 +躇 +躉 +躊 +躋 +躍 +躏 +躪 +身 +躬 +躯 +躲 +躺 +軀 +車 +軋 +軌 +軍 +軒 +軟 +転 +軸 +軼 +軽 +軾 +較 +載 +輒 +輓 +輔 +輕 +輛 +輝 +輟 +輩 +輪 +輯 +輸 +輻 +輾 +輿 +轄 +轅 +轆 +轉 +轍 +轎 +轟 +车 +轧 +轨 +轩 +转 +轭 +轮 +软 +轰 +轲 +轴 +轶 +轻 +轼 +载 +轿 +较 +辄 +辅 +辆 +辇 +辈 +辉 +辊 +辍 +辐 +辑 +输 +辕 +辖 +辗 +辘 +辙 +辛 +辜 +辞 +辟 +辣 +辦 +辨 +辩 +辫 +辭 +辮 +辯 +辰 +辱 +農 +边 +辺 +辻 +込 +辽 +达 +迁 +迂 +迄 +迅 +过 +迈 +迎 +运 +近 +返 +还 +这 +进 +远 +违 +连 +迟 +迢 +迤 +迥 +迦 +迩 +迪 +迫 +迭 +述 +迴 +迷 +迸 +迹 +迺 +追 +退 +送 +适 +逃 +逅 +逆 +选 +逊 +逍 +透 +逐 +递 +途 +逕 +逗 +這 +通 +逛 +逝 +逞 +速 +造 +逢 +連 +逮 +週 +進 +逵 +逶 +逸 +逻 +逼 +逾 +遁 +遂 +遅 +遇 +遊 +運 +遍 +過 +遏 +遐 +遑 +遒 +道 +達 +違 +遗 +遙 +遛 +遜 +遞 +遠 +遢 +遣 +遥 +遨 +適 +遭 +遮 +遲 +遴 +遵 +遶 +遷 +選 +遺 +遼 +遽 +避 +邀 +邁 +邂 +邃 +還 +邇 +邈 +邊 +邋 +邏 +邑 +邓 +邕 +邛 +邝 +邢 +那 +邦 +邨 +邪 +邬 +邮 +邯 +邰 +邱 +邳 +邵 +邸 +邹 +邺 +邻 +郁 +郅 +郊 +郎 +郑 +郜 +郝 +郡 +郢 +郤 +郦 +郧 +部 +郫 +郭 +郴 +郵 +郷 +郸 +都 +鄂 +鄉 +鄒 +鄔 +鄙 +鄞 +鄢 +鄧 +鄭 +鄰 +鄱 +鄲 +鄺 +酉 +酊 +酋 +酌 +配 +酐 +酒 +酗 +酚 +酝 +酢 +酣 +酥 +酩 +酪 +酬 +酮 +酯 +酰 +酱 +酵 +酶 +酷 +酸 +酿 +醃 +醇 +醉 +醋 +醍 +醐 +醒 +醚 +醛 +醜 +醞 +醣 +醪 +醫 +醬 +醮 +醯 +醴 +醺 +釀 +釁 +采 +釉 +释 +釋 +里 +重 +野 +量 +釐 +金 +釗 +釘 +釜 +針 +釣 +釦 +釧 +釵 +鈀 +鈉 +鈍 +鈎 +鈔 +鈕 +鈞 +鈣 +鈦 +鈪 +鈴 +鈺 +鈾 +鉀 +鉄 +鉅 +鉉 +鉑 +鉗 +鉚 +鉛 +鉤 +鉴 +鉻 +銀 +銃 +銅 +銑 +銓 +銖 +銘 +銜 +銬 +銭 +銮 +銳 +銷 +銹 +鋁 +鋅 +鋒 +鋤 +鋪 +鋰 +鋸 +鋼 +錄 +錐 +錘 +錚 +錠 +錢 +錦 +錨 +錫 +錮 +錯 +録 +錳 +錶 +鍊 +鍋 +鍍 +鍛 +鍥 +鍰 +鍵 +鍺 +鍾 +鎂 +鎊 +鎌 +鎏 +鎔 +鎖 +鎗 +鎚 +鎧 +鎬 +鎮 +鎳 +鏈 +鏖 +鏗 +鏘 +鏞 +鏟 +鏡 +鏢 +鏤 +鏽 +鐘 +鐮 +鐲 +鐳 +鐵 +鐸 +鐺 +鑄 +鑊 +鑑 +鑒 +鑣 +鑫 +鑰 +鑲 +鑼 +鑽 +鑾 +鑿 +针 +钉 +钊 +钎 +钏 +钒 +钓 +钗 +钙 +钛 +钜 +钝 +钞 +钟 +钠 +钡 +钢 +钣 +钤 +钥 +钦 +钧 +钨 +钩 +钮 +钯 +钰 +钱 +钳 +钴 +钵 +钺 +钻 +钼 +钾 +钿 +铀 +铁 +铂 +铃 +铄 +铅 +铆 +铉 +铎 +铐 +铛 +铜 +铝 +铠 +铡 +铢 +铣 +铤 +铨 +铩 +铬 +铭 +铮 +铰 +铲 +铵 +银 +铸 +铺 +链 +铿 +销 +锁 +锂 +锄 +锅 +锆 +锈 +锉 +锋 +锌 +锏 +锐 +锑 +错 +锚 +锟 +锡 +锢 +锣 +锤 +锥 +锦 +锭 +键 +锯 +锰 +锲 +锵 +锹 +锺 +锻 +镀 +镁 +镂 +镇 +镉 +镌 +镍 +镐 +镑 +镕 +镖 +镗 +镛 +镜 +镣 +镭 +镯 +镰 +镳 +镶 +長 +长 +門 +閃 +閉 +開 +閎 +閏 +閑 +閒 +間 +閔 +閘 +閡 +関 +閣 +閥 +閨 +閩 +閱 +閲 +閹 +閻 +閾 +闆 +闇 +闊 +闌 +闍 +闔 +闕 +闖 +闘 +關 +闡 +闢 +门 +闪 +闫 +闭 +问 +闯 +闰 +闲 +间 +闵 +闷 +闸 +闹 +闺 +闻 +闽 +闾 +阀 +阁 +阂 +阅 +阆 +阇 +阈 +阉 +阎 +阐 +阑 +阔 +阕 +阖 +阙 +阚 +阜 +队 +阡 +阪 +阮 +阱 +防 +阳 +阴 +阵 +阶 +阻 +阿 +陀 +陂 +附 +际 +陆 +陇 +陈 +陋 +陌 +降 +限 +陕 +陛 +陝 +陞 +陟 +陡 +院 +陣 +除 +陨 +险 +陪 +陰 +陲 +陳 +陵 +陶 +陷 +陸 +険 +陽 +隅 +隆 +隈 +隊 +隋 +隍 +階 +随 +隐 +隔 +隕 +隘 +隙 +際 +障 +隠 +隣 +隧 +隨 +險 +隱 +隴 +隶 +隸 +隻 +隼 +隽 +难 +雀 +雁 +雄 +雅 +集 +雇 +雉 +雋 +雌 +雍 +雎 +雏 +雑 +雒 +雕 +雖 +雙 +雛 +雜 +雞 +離 +難 +雨 +雪 +雯 +雰 +雲 +雳 +零 +雷 +雹 +電 +雾 +需 +霁 +霄 +霆 +震 +霈 +霉 +霊 +霍 +霎 +霏 +霑 +霓 +霖 +霜 +霞 +霧 +霭 +霰 +露 +霸 +霹 +霽 +霾 +靂 +靄 +靈 +青 +靓 +靖 +静 +靚 +靛 +靜 +非 +靠 +靡 +面 +靥 +靦 +革 +靳 +靴 +靶 +靼 +鞅 +鞋 +鞍 +鞏 +鞑 +鞘 +鞠 +鞣 +鞦 +鞭 +韆 +韋 +韌 +韓 +韜 +韦 +韧 +韩 +韬 +韭 +音 +韵 +韶 +韻 +響 +頁 +頂 +頃 +項 +順 +須 +頌 +預 +頑 +頒 +頓 +頗 +領 +頜 +頡 +頤 +頫 +頭 +頰 +頷 +頸 +頹 +頻 +頼 +顆 +題 +額 +顎 +顏 +顔 +願 +顛 +類 +顧 +顫 +顯 +顱 +顴 +页 +顶 +顷 +项 +顺 +须 +顼 +顽 +顾 +顿 +颁 +颂 +预 +颅 +领 +颇 +颈 +颉 +颊 +颌 +颍 +颐 +频 +颓 +颔 +颖 +颗 +题 +颚 +颛 +颜 +额 +颞 +颠 +颡 +颢 +颤 +颦 +颧 +風 +颯 +颱 +颳 +颶 +颼 +飄 +飆 +风 +飒 +飓 +飕 +飘 +飙 +飚 +飛 +飞 +食 +飢 +飨 +飩 +飪 +飯 +飲 +飼 +飽 +飾 +餃 +餅 +餉 +養 +餌 +餐 +餒 +餓 +餘 +餚 +餛 +餞 +餡 +館 +餮 +餵 +餾 +饅 +饈 +饋 +饌 +饍 +饑 +饒 +饕 +饗 +饞 +饥 +饨 +饪 +饬 +饭 +饮 +饯 +饰 +饱 +饲 +饴 +饵 +饶 +饷 +饺 +饼 +饽 +饿 +馀 +馁 +馄 +馅 +馆 +馈 +馋 +馍 +馏 +馒 +馔 +首 +馗 +香 +馥 +馨 +馬 +馭 +馮 +馳 +馴 +駁 +駄 +駅 +駆 +駐 +駒 +駕 +駛 +駝 +駭 +駱 +駿 +騁 +騎 +騏 +験 +騙 +騨 +騰 +騷 +驀 +驅 +驊 +驍 +驒 +驕 +驗 +驚 +驛 +驟 +驢 +驥 +马 +驭 +驮 +驯 +驰 +驱 +驳 +驴 +驶 +驷 +驸 +驹 +驻 +驼 +驾 +驿 +骁 +骂 +骄 +骅 +骆 +骇 +骈 +骊 +骋 +验 +骏 +骐 +骑 +骗 +骚 +骛 +骜 +骞 +骠 +骡 +骤 +骥 +骧 +骨 +骯 +骰 +骶 +骷 +骸 +骼 +髂 +髅 +髋 +髏 +髒 +髓 +體 +髖 +高 +髦 +髪 +髮 +髯 +髻 +鬃 +鬆 +鬍 +鬓 +鬚 +鬟 +鬢 +鬣 +鬥 +鬧 +鬱 +鬼 +魁 +魂 +魄 +魅 +魇 +魍 +魏 +魔 +魘 +魚 +魯 +魷 +鮑 +鮨 +鮪 +鮭 +鮮 +鯉 +鯊 +鯖 +鯛 +鯨 +鯰 +鯽 +鰍 +鰓 +鰭 +鰲 +鰻 +鰾 +鱈 +鱉 +鱔 +鱗 +鱷 +鱸 +鱼 +鱿 +鲁 +鲈 +鲍 +鲑 +鲛 +鲜 +鲟 +鲢 +鲤 +鲨 +鲫 +鲱 +鲲 +鲶 +鲷 +鲸 +鳃 +鳄 +鳅 +鳌 +鳍 +鳕 +鳖 +鳗 +鳝 +鳞 +鳥 +鳩 +鳳 +鳴 +鳶 +鴉 +鴕 +鴛 +鴦 +鴨 +鴻 +鴿 +鵑 +鵜 +鵝 +鵡 +鵬 +鵰 +鵲 +鶘 +鶩 +鶯 +鶴 +鷗 +鷲 +鷹 +鷺 +鸚 +鸞 +鸟 +鸠 +鸡 +鸢 +鸣 +鸥 +鸦 +鸨 +鸪 +鸭 +鸯 +鸳 +鸵 +鸽 +鸾 +鸿 +鹂 +鹃 +鹄 +鹅 +鹈 +鹉 +鹊 +鹌 +鹏 +鹑 +鹕 +鹘 +鹜 +鹞 +鹤 +鹦 +鹧 +鹫 +鹭 +鹰 +鹳 +鹵 +鹹 +鹼 +鹽 +鹿 +麂 +麋 +麒 +麓 +麗 +麝 +麟 +麥 +麦 +麩 +麴 +麵 +麸 +麺 +麻 +麼 +麽 +麾 +黃 +黄 +黍 +黎 +黏 +黑 +黒 +黔 +默 +黛 +黜 +黝 +點 +黠 +黨 +黯 +黴 +鼋 +鼎 +鼐 +鼓 +鼠 +鼬 +鼹 +鼻 +鼾 +齁 +齊 +齋 +齐 +齒 +齡 +齢 +齣 +齦 +齿 +龄 +龅 +龈 +龊 +龋 +龌 +龍 +龐 +龔 +龕 +龙 +龚 +龛 +龜 +龟 +︰ +︱ +︶ +︿ +﹁ +﹂ +﹍ +﹏ +﹐ +﹑ +﹒ +﹔ +﹕ +﹖ +﹗ +﹙ +﹚ +﹝ +﹞ +﹡ +﹣ +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +。 +「 +」 +、 +・ +ッ +ー +イ +ク +シ +ス +ト +ノ +フ +ラ +ル +ン +゙ +゚ + ̄ +¥ +👍 +🔥 +😂 +😎 +... +yam +10 +2017 +12 +11 +2016 +20 +30 +15 +06 +lofter +##s +2015 +by +16 +14 +18 +13 +24 +17 +2014 +21 +##0 +22 +19 +25 +23 +com +100 +00 +05 +2013 +##a +03 +09 +08 +28 +##2 +50 +01 +04 +##1 +27 +02 +2012 +##3 +26 +##e +07 +##8 +##5 +##6 +##4 +##9 +##7 +29 +2011 +40 +##t +2010 +##o +##d +##i +2009 +##n +app +www +the +##m +31 +##c +##l +##y +##r +##g +2008 +60 +http +200 +qq +##p +80 +##f +google +pixnet +90 +cookies +tripadvisor +500 +##er +##k +35 +##h +facebook +2007 +2000 +70 +##b +of +##x +##u +45 +300 +iphone +32 +1000 +2006 +48 +ip +36 +in +38 +3d +##w +##ing +55 +ctrip +##on +##v +33 +##の +to +34 +400 +id +2005 +it +37 +windows +llc +top +99 +42 +39 +000 +led +at +##an +41 +51 +52 +46 +49 +43 +53 +44 +##z +android +58 +and +59 +2004 +56 +vr +##か +5000 +2003 +47 +blogthis +twitter +54 +##le +150 +ok +2018 +57 +75 +cn +no +ios +##in +##mm +##00 +800 +on +te +3000 +65 +2001 +360 +95 +ig +lv +120 +##ng +##を +##us +##に +pc +てす +── +600 +##te +85 +2002 +88 +##ed +html +ncc +wifi +email +64 +blog +is +##10 +##て +mail +online +##al +dvd +##ic +studio +##は +##℃ +##ia +##と +line +vip +72 +##q +98 +##ce +##en +for +##is +##ra +##es +##j +usb +net +cp +1999 +asia +4g +##cm +diy +new +3c +##お +ta +66 +language +vs +apple +tw +86 +web +##ne +ipad +62 +you +##re +101 +68 +##tion +ps +de +bt +pony +atm +##2017 +1998 +67 +##ch +ceo +##or +go +##na +av +pro +cafe +96 +pinterest +97 +63 +pixstyleme3c +##ta +more +said +##2016 +1997 +mp3 +700 +##ll +nba +jun +##20 +92 +tv +1995 +pm +61 +76 +nbsp +250 +##ie +linux +##ma +cd +110 +hd +##17 +78 +##ion +77 +6000 +am +##th +##st +94 +##se +##et +69 +180 +gdp +my +105 +81 +abc +89 +flash +79 +one +93 +1990 +1996 +##ck +gps +##も +##ly +web885 +106 +2020 +91 +##ge +4000 +1500 +xd +boss +isbn +1994 +org +##ry +me +love +##11 +0fork +73 +##12 +3g +##ter +##ar +71 +82 +##la +hotel +130 +1970 +pk +83 +87 +140 +ie +##os +##30 +##el +74 +##50 +seo +cpu +##ml +p2p +84 +may +##る +sun +tue +internet +cc +posted +youtube +##at +##ン +##man +ii +##ル +##15 +abs +nt +pdf +yahoo +ago +1980 +##it +news +mac +104 +##てす +##me +##り +java +1992 +spa +##de +##nt +hk +all +plus +la +1993 +##mb +##16 +##ve +west +##da +160 +air +##い +##ps +から +##to +1989 +logo +htc +php +https +fi +momo +##son +sat +##ke +##80 +ebd +suv +wi +day +apk +##88 +##um +mv +galaxy +wiki +or +brake +##ス +1200 +する +this +1991 +mon +##こ +❤2017 +po +##ない +javascript +life +home +june +##ss +system +900 +##ー +##0 +pp +1988 +world +fb +4k +br +##as +ic +ai +leonardo +safari +##60 +live +free +xx +wed +win7 +kiehl +##co +lg +o2o +##go +us +235 +1949 +mm +しい +vfm +kanye +##90 +##2015 +##id +jr +##ey +123 +rss +##sa +##ro +##am +##no +thu +fri +350 +##sh +##ki +103 +comments +name +##のて +##pe +##ine +max +1987 +8000 +uber +##mi +##ton +wordpress +office +1986 +1985 +##ment +107 +bd +win10 +##ld +##li +gmail +bb +dior +##rs +##ri +##rd +##ます +up +cad +##® +dr +して +read +##21 +をお +##io +##99 +url +1984 +pvc +paypal +show +policy +##40 +##ty +##18 +with +##★ +##01 +txt +102 +##ba +dna +from +post +mini +ar +taiwan +john +##ga +privacy +agoda +##13 +##ny +word +##24 +##22 +##by +##ur +##hz +1982 +##ang +265 +cookie +netscape +108 +##ka +##~ +##ad +house +share +note +ibm +code +hello +nike +sim +survey +##016 +1979 +1950 +wikia +##32 +##017 +5g +cbc +##tor +##kg +1983 +##rt +##14 +campaign +store +2500 +os +##ct +##ts +##° +170 +api +##ns +365 +excel +##な +##ao +##ら +##し +~~ +##nd +university +163 +には +518 +##70 +##ya +##il +##25 +pierre +ipo +0020 +897 +##23 +hotels +##ian +のお +125 +years +6606 +##ers +##26 +high +##day +time +##ay +bug +##line +##く +##す +##be +xp +talk2yam +yamservice +10000 +coco +##dy +sony +##ies +1978 +microsoft +david +people +##ha +1960 +instagram +intel +その +##ot +iso +1981 +##va +115 +##mo +##land +xxx +man +co +ltxsw +##ation +baby +220 +##pa +##ol +1945 +7000 +tag +450 +##ue +msn +##31 +oppo +##ト +##ca +control +##om +st +chrome +##ure +##ん +be +##き +lol +##19 +した +##bo +240 +lady +##100 +##way +##から +4600 +##ko +##do +##un +4s +corporation +168 +##ni +herme +##28 +cp +978 +##up +##06 +ui +##ds +ppt +admin +three +します +bbc +re +128 +##48 +ca +##015 +##35 +hp +##ee +tpp +##た +##ive +×× +root +##cc +##ました +##ble +##ity +adobe +park +114 +et +oled +city +##ex +##ler +##ap +china +##book +20000 +view +##ice +global +##km +your +hong +##mg +out +##ms +ng +ebay +##29 +menu +ubuntu +##cy +rom +##view +open +ktv +do +server +##lo +if +english +##ね +##5 +##oo +1600 +##02 +step1 +kong +club +135 +july +inc +1976 +mr +hi +##net +touch +##ls +##ii +michael +lcd +##05 +##33 +phone +james +step2 +1300 +ios9 +##box +dc +##2 +##ley +samsung +111 +280 +pokemon +css +##ent +##les +いいえ +##1 +s8 +atom +play +bmw +##said +sa +etf +ctrl +♥yoyo♥ +##55 +2025 +##2014 +##66 +adidas +amazon +1958 +##ber +##ner +visa +##77 +##der +1800 +connectivity +##hi +firefox +109 +118 +hr +so +style +mark +pop +ol +skip +1975 +as +##27 +##ir +##61 +190 +mba +##う +##ai +le +##ver +1900 +cafe2017 +lte +super +113 +129 +##ron +amd +like +##☆ +are +##ster +we +##sk +paul +data +international +##ft +longchamp +ssd +good +##ート +##ti +reply +##my +↓↓↓ +apr +star +##ker +source +136 +js +112 +get +force +photo +##one +126 +##2013 +##ow +link +bbs +1972 +goods +##lin +python +119 +##ip +game +##ics +##ません +blue +##● +520 +##45 +page +itunes +##03 +1955 +260 +1968 +gt +gif +618 +##ff +##47 +group +くたさい +about +bar +ganji +##nce +music +lee +not +1977 +1971 +1973 +##per +an +faq +comment +##って +days +##ock +116 +##bs +1974 +1969 +v1 +player +1956 +xbox +sql +fm +f1 +139 +##ah +210 +##lv +##mp +##000 +melody +1957 +##3 +550 +17life +199 +1966 +xml +market +##au +##71 +999 +##04 +what +gl +##95 +##age +tips +##68 +book +##ting +mysql +can +1959 +230 +##ung +wonderland +watch +10℃ +##ction +9000 +mar +mobile +1946 +1962 +article +##db +part +▲top +party +って +1967 +1964 +1948 +##07 +##ore +##op +この +dj +##78 +##38 +010 +main +225 +1965 +##ong +art +320 +ad +134 +020 +##73 +117 +pm2 +japan +228 +##08 +ts +1963 +##ica +der +sm +##36 +2019 +##wa +ct +##7 +##や +##64 +1937 +homemesh +search +##85 +##れは +##tv +##di +macbook +##9 +##くたさい +service +##♥ +type +った +750 +##ier +##si +##75 +##います +##ok +best +##ット +goris +lock +##った +cf +3m +big +##ut +ftp +carol +##vi +10 +1961 +happy +sd +##ac +122 +anti +pe +cnn +iii +1920 +138 +##ラ +1940 +esp +jan +tags +##98 +##51 +august +vol +##86 +154 +##™ +##fs +##れ +##sion +design +ac +##ム +press +jordan +ppp +that +key +check +##6 +##tt +##㎡ +1080p +##lt +power +##42 +1952 +##bc +vivi +##ック +he +133 +121 +jpg +##rry +201 +175 +3500 +1947 +nb +##ted +##rn +しています +1954 +usd +##t00 +master +##ンク +001 +model +##58 +al +##09 +1953 +##34 +ram +goo +ても +##ui +127 +1930 +red +##ary +rpg +item +##pm +##41 +270 +##za +project +##2012 +hot +td +blogabstract +##ger +##62 +650 +##44 +gr2 +##します +##m +black +electronic +nfc +year +asus +また +html5 +cindy +##hd +m3 +132 +esc +##od +booking +##53 +fed +tvb +##81 +##ina +mit +165 +##いる +chan +192 +distribution +next +になる +peter +bios +steam +cm +1941 +にも +pk10 +##ix +##65 +##91 +dec +nasa +##ana +icecat +00z +b1 +will +##46 +li +se +##ji +##み +##ard +oct +##ain +jp +##ze +##bi +cio +##56 +smart +h5 +##39 +##port +curve +vpn +##nm +##dia +utc +##あり +12345678910 +##52 +rmvb +chanel +a4 +miss +##and +##im +media +who +##63 +she +girl +5s +124 +vera +##して +class +vivo +king +##フ +##ei +national +ab +1951 +5cm +888 +145 +ipod +ap +1100 +5mm +211 +ms +2756 +##69 +mp4 +msci +##po +##89 +131 +mg +index +380 +##bit +##out +##zz +##97 +##67 +158 +apec +##8 +photoshop +opec +¥799 +ては +##96 +##tes +##ast +2g +○○ +##ール +¥2899 +##ling +##よ +##ory +1938 +##ical +kitty +content +##43 +step3 +##cn +win8 +155 +vc +1400 +iphone7 +robert +##した +tcl +137 +beauty +##87 +en +dollars +##ys +##oc +step +pay +yy +a1 +##2011 +##lly +##ks +##♪ +1939 +188 +download +1944 +sep +exe +ph +います +school +gb +center +pr +street +##board +uv +##37 +##lan +winrar +##que +##ua +##com +1942 +1936 +480 +gpu +##4 +ettoday +fu +tom +##54 +##ren +##via +149 +##72 +b2b +144 +##79 +##tch +rose +arm +mb +##49 +##ial +##nn +nvidia +step4 +mvp +00㎡ +york +156 +##イ +how +cpi +591 +2765 +gov +kg +joe +##xx +mandy +pa +##ser +copyright +fashion +1935 +don +##け +ecu +##ist +##art +erp +wap +have +##lm +talk +##ek +##ning +##if +ch +##ite +video +1943 +cs +san +iot +look +##84 +##2010 +##ku +october +##ux +trump +##hs +##ide +box +141 +first +##ins +april +##ight +##83 +185 +angel +protected +aa +151 +162 +x1 +m2 +##fe +##× +##ho +size +143 +min +ofo +fun +gomaji +ex +hdmi +food +dns +march +chris +kevin +##のか +##lla +##pp +##ec +ag +ems +6s +720p +##rm +##ham +off +##92 +asp +team +fandom +ed +299 +▌♥ +##ell +info +されています +##82 +sina +4066 +161 +##able +##ctor +330 +399 +315 +dll +rights +ltd +idc +jul +3kg +1927 +142 +ma +surface +##76 +##ク +~~~ +304 +mall +eps +146 +green +##59 +map +space +donald +v2 +sodu +##light +1931 +148 +1700 +まて +310 +reserved +htm +##han +##57 +2d +178 +mod +##ise +##tions +152 +ti +##shi +doc +1933 +icp +055 +wang +##ram +shopping +aug +##pi +##well +now +wam +b2 +からお +##hu +236 +1928 +##gb +266 +f2 +##93 +153 +mix +##ef +##uan +bwl +##plus +##res +core +##ess +tea +5℃ +hktvmall +nhk +##ate +list +##ese +301 +feb +4m +inn +ての +nov +159 +12345 +daniel +##ci +pass +##bet +##nk +coffee +202 +ssl +airbnb +##ute +fbi +woshipm +skype +ea +cg +sp +##fc +##www +yes +edge +alt +007 +##94 +fpga +##ght +##gs +iso9001 +さい +##ile +##wood +##uo +image +lin +icon +american +##em +1932 +set +says +##king +##tive +blogger +##74 +なと +256 +147 +##ox +##zy +##red +##ium +##lf +nokia +claire +##リ +##ding +november +lohas +##500 +##tic +##マ +##cs +##ある +##che +##ire +##gy +##ult +db +january +win +##カ +166 +road +ptt +##ま +##つ +198 +##fa +##mer +anna +pchome +はい +udn +ef +420 +##time +##tte +2030 +##ア +g20 +white +かかります +1929 +308 +garden +eleven +di +##おります +chen +309b +777 +172 +young +cosplay +ちてない +4500 +bat +##123 +##tra +##ては +kindle +npc +steve +etc +##ern +##| +call +xperia +ces +travel +sk +s7 +##ous +1934 +##int +みいたたけます +183 +edu +file +cho +qr +##car +##our +186 +##ant +##d +eric +1914 +rends +##jo +##する +mastercard +##2000 +kb +##min +290 +##ino +vista +##ris +##ud +jack +2400 +##set +169 +pos +1912 +##her +##ou +taipei +しく +205 +beta +##ませんか +232 +##fi +express +255 +body +##ill +aphojoy +user +december +meiki +##ick +tweet +richard +##av +##ᆫ +iphone6 +##dd +ちてすか +views +##mark +321 +pd +##00 +times +##▲ +level +##ash +10g +point +5l +##ome +208 +koreanmall +##ak +george +q2 +206 +wma +tcp +##200 +スタッフ +full +mlb +##lle +##watch +tm +run +179 +911 +smith +business +##und +1919 +color +##tal +222 +171 +##less +moon +4399 +##rl +update +pcb +shop +499 +157 +little +なし +end +##mhz +van +dsp +easy +660 +##house +##key +history +##o +oh +##001 +##hy +##web +oem +let +was +##2009 +##gg +review +##wan +182 +##°c +203 +uc +title +##val +united +233 +2021 +##ons +doi +trivago +overdope +sbs +##ance +##ち +grand +special +573032185 +imf +216 +wx17house +##so +##ーム +audi +##he +london +william +##rp +##ake +science +beach +cfa +amp +ps4 +880 +##800 +##link +##hp +crm +ferragamo +bell +make +##eng +195 +under +zh +photos +2300 +##style +##ント +via +176 +da +##gi +company +i7 +##ray +thomas +370 +ufo +i5 +##max +plc +ben +back +research +8g +173 +mike +##pc +##ッフ +september +189 +##ace +vps +february +167 +pantos +wp +lisa +1921 +★★ +jquery +night +long +offer +##berg +##news +1911 +##いて +ray +fks +wto +せます +over +164 +340 +##all +##rus +1924 +##888 +##works +blogtitle +loftpermalink +##→ +187 +martin +test +ling +km +##め +15000 +fda +v3 +##ja +##ロ +wedding +かある +outlet +family +##ea +をこ +##top +story +##ness +salvatore +##lu +204 +swift +215 +room +している +oracle +##ul +1925 +sam +b2c +week +pi +rock +##のは +##a +##けと +##ean +##300 +##gle +cctv +after +chinese +##back +powered +x2 +##tan +1918 +##nes +##イン +canon +only +181 +##zi +##las +say +##oe +184 +##sd +221 +##bot +##world +##zo +sky +made +top100 +just +1926 +pmi +802 +234 +gap +##vr +177 +les +174 +▲topoct +ball +vogue +vi +ing +ofweek +cos +##list +##ort +▲topmay +##なら +##lon +として +last +##tc +##of +##bus +##gen +real +eva +##コ +a3 +nas +##lie +##ria +##coin +##bt +▲topapr +his +212 +cat +nata +vive +health +⋯⋯ +drive +sir +▲topmar +du +cup +##カー +##ook +##よう +##sy +alex +msg +tour +しました +3ce +##word +193 +ebooks +r8 +block +318 +##より +2200 +nice +pvp +207 +months +1905 +rewards +##ther +1917 +0800 +##xi +##チ +##sc +micro +850 +gg +blogfp +op +1922 +daily +m1 +264 +true +##bb +ml +##tar +##のお +##ky +anthony +196 +253 +##yo +state +218 +##ara +##aa +##rc +##tz +##ston +より +gear +##eo +##ade +ge +see +1923 +##win +##ura +ss +heart +##den +##ita +down +##sm +el +png +2100 +610 +rakuten +whatsapp +bay +dream +add +##use +680 +311 +pad +gucci +mpv +##ode +##fo +island +▲topjun +##▼ +223 +jason +214 +chicago +##❤ +しの +##hone +io +##れる +##ことか +sogo +be2 +##ology +990 +cloud +vcd +##con +2~3 +##ford +##joy +##kb +##こさいます +##rade +but +##ach +docker +##ful +rfid +ul +##ase +hit +ford +##star +580 +##○ +11 +a2 +sdk +reading +edited +##are +cmos +##mc +238 +siri +light +##ella +##ため +bloomberg +##read +pizza +##ison +jimmy +##vm +college +node +journal +ba +18k +##play +245 +##cer +20 +magic +##yu +191 +jump +288 +tt +##ings +asr +##lia +3200 +step5 +network +##cd +mc +いします +1234 +pixstyleme +273 +##600 +2800 +money +★★★★★ +1280 +12 +430 +bl +みの +act +##tus +tokyo +##rial +##life +emba +##ae +saas +tcs +##rk +##wang +summer +##sp +ko +##ving +390 +premium +##その +netflix +##ヒ +uk +mt +##lton +right +frank +two +209 +える +##ple +##cal +021 +##んな +##sen +##ville +hold +nexus +dd +##ius +てお +##mah +##なく +tila +zero +820 +ce +##tin +resort +##ws +charles +old +p10 +5d +report +##360 +##ru +##には +bus +vans +lt +##est +pv +##レ +links +rebecca +##ツ +##dm +azure +##365 +きな +limited +bit +4gb +##mon +1910 +moto +##eam +213 +1913 +var +eos +なとの +226 +blogspot +された +699 +e3 +dos +dm +fc +##ments +##ik +##kw +boy +##bin +##ata +960 +er +##せ +219 +##vin +##tu +##ula +194 +##∥ +station +##ろ +##ature +835 +files +zara +hdr +top10 +nature +950 +magazine +s6 +marriott +##シ +avira +case +##っと +tab +##ran +tony +##home +oculus +im +##ral +jean +saint +cry +307 +rosie +##force +##ini +ice +##bert +のある +##nder +##mber +pet +2600 +##◆ +plurk +▲topdec +##sis +00kg +▲topnov +720 +##ence +tim +##ω +##nc +##ても +##name +log +ips +great +ikea +malaysia +unix +##イト +3600 +##ncy +##nie +12000 +akb48 +##ye +##oid +404 +##chi +##いた +oa +xuehai +##1000 +##orm +##rf +275 +さん +##ware +##リー +980 +ho +##pro +text +##era +560 +bob +227 +##ub +##2008 +8891 +scp +avi +##zen +2022 +mi +wu +museum +qvod +apache +lake +jcb +▲topaug +★★★ +ni +##hr +hill +302 +ne +weibo +490 +ruby +##ーシ +##ヶ +##row +4d +▲topjul +iv +##ish +github +306 +mate +312 +##スト +##lot +##ane +andrew +のハイト +##tina +t1 +rf +ed2k +##vel +##900 +way +final +りの +ns +5a +705 +197 +##メ +sweet +bytes +##ene +▲topjan +231 +##cker +##2007 +##px +100g +topapp +229 +helpapp +rs +low +14k +g4g +care +630 +ldquo +あり +##fork +leave +rm +edition +##gan +##zon +##qq +▲topsep +##google +##ism +gold +224 +explorer +##zer +toyota +category +select +visual +##labels +restaurant +##md +posts +s1 +##ico +もっと +angelababy +123456 +217 +sports +s3 +mbc +1915 +してくたさい +shell +x86 +candy +##new +kbs +face +xl +470 +##here +4a +swissinfo +v8 +▲topfeb +dram +##ual +##vice +3a +##wer +sport +q1 +ios10 +public +int +card +##c +ep +au +rt +##れた +1080 +bill +##mll +kim +30 +460 +wan +##uk +##ミ +x3 +298 +0t +scott +##ming +239 +e5 +##3d +h7n9 +worldcat +brown +##あります +##vo +##led +##580 +##ax +249 +410 +##ert +paris +##~6 +polo +925 +##lr +599 +##ナ +capital +##hing +bank +cv +1g +##chat +##s +##たい +adc +##ule +2m +##e +digital +hotmail +268 +##pad +870 +bbq +quot +##ring +before +wali +##まて +mcu +2k +2b +という +costco +316 +north +333 +switch +##city +##p +philips +##mann +management +panasonic +##cl +##vd +##ping +##rge +alice +##lk +##ましょう +css3 +##ney +vision +alpha +##ular +##400 +##tter +lz +にお +##ありません +mode +gre +1916 +pci +##tm +237 +1~2 +##yan +##そ +について +##let +##キ +work +war +coach +ah +mary +##ᅵ +huang +##pt +a8 +pt +follow +##berry +1895 +##ew +a5 +ghost +##ション +##wn +##og +south +##code +girls +##rid +action +villa +git +r11 +table +games +##cket +error +##anonymoussaid +##ag +here +##ame +##gc +qa +##■ +##lis +gmp +##gin +vmalife +##cher +yu +wedding +##tis +demo +dragon +530 +soho +social +bye +##rant +river +orz +acer +325 +##↑ +##ース +##ats +261 +del +##ven +440 +ups +##ように +##ター +305 +value +macd +yougou +##dn +661 +##ano +ll +##urt +##rent +continue +script +##wen +##ect +paper +263 +319 +shift +##chel +##フト +##cat +258 +x5 +fox +243 +##さん +car +aaa +##blog +loading +##yn +##tp +kuso +799 +si +sns +イカせるテンマ +ヒンクテンマ3 +rmb +vdc +forest +central +prime +help +ultra +##rmb +##ような +241 +square +688 +##しい +のないフロクに +##field +##reen +##ors +##ju +c1 +start +510 +##air +##map +cdn +##wo +cba +stephen +m8 +100km +##get +opera +##base +##ood +vsa +com™ +##aw +##ail +251 +なのて +count +t2 +##ᅡ +##een +2700 +hop +##gp +vsc +tree +##eg +##ose +816 +285 +##ories +##shop +alphago +v4 +1909 +simon +##ᆼ +fluke62max +zip +スホンサー +##sta +louis +cr +bas +##~10 +bc +##yer +hadoop +##ube +##wi +1906 +0755 +hola +##low +place +centre +5v +d3 +##fer +252 +##750 +##media +281 +540 +0l +exchange +262 +series +##ハー +##san +eb +##bank +##k +q3 +##nge +##mail +take +##lp +259 +1888 +client +east +cache +event +vincent +##ールを +きを +##nse +sui +855 +adchoice +##и +##stry +##なたの +246 +##zone +ga +apps +sea +##ab +248 +cisco +##タ +##rner +kymco +##care +dha +##pu +##yi +minkoff +royal +p1 +への +annie +269 +collection +kpi +playstation +257 +になります +866 +bh +##bar +queen +505 +radio +1904 +andy +armani +##xy +manager +iherb +##ery +##share +spring +raid +johnson +1908 +##ob +volvo +hall +##ball +v6 +our +taylor +##hk +bi +242 +##cp +kate +bo +water +technology +##rie +サイトは +277 +##ona +##sl +hpv +303 +gtx +hip +rdquo +jayz +stone +##lex +##rum +namespace +##やり +620 +##ale +##atic +des +##erson +##ql +##ves +##type +enter +##この +##てきます +d2 +##168 +##mix +##bian +との +a9 +jj +ky +##lc +access +movie +##hc +リストに +tower +##ration +##mit +ます +##nch +ua +tel +prefix +##o2 +1907 +##point +1901 +ott +~10 +##http +##ury +baidu +##ink +member +##logy +bigbang +nownews +##js +##shot +##tb +##こと +247 +eba +##tics +##lus +ける +v5 +spark +##ama +there +##ions +god +##lls +##down +hiv +##ress +burberry +day2 +##kv +◆◆ +jeff +related +film +edit +joseph +283 +##ark +cx +32gb +order +g9 +30000 +##ans +##tty +s5 +##bee +かあります +thread +xr +buy +sh +005 +land +spotify +mx +##ari +276 +##verse +×email +sf +why +##ことて +244 +7headlines +nego +sunny +dom +exo +401 +666 +positioning +fit +rgb +##tton +278 +kiss +alexa +adam +lp +みリストを +##g +mp +##ties +##llow +amy +##du +np +002 +institute +271 +##rth +##lar +2345 +590 +##des +sidebar +15 +imax +site +##cky +##kit +##ime +##009 +season +323 +##fun +##ンター +##ひ +gogoro +a7 +pu +lily +fire +twd600 +##ッセーシを +いて +##vis +30ml +##cture +##をお +information +##オ +close +friday +##くれる +yi +nick +てすか +##tta +##tel +6500 +##lock +cbd +economy +254 +かお +267 +tinker +double +375 +8gb +voice +##app +oops +channel +today +985 +##right +raw +xyz +##+ +jim +edm +##cent +7500 +supreme +814 +ds +##its +##asia +dropbox +##てすか +##tti +books +272 +100ml +##tle +##ller +##ken +##more +##boy +sex +309 +##dom +t3 +##ider +##なります +##unch +1903 +810 +feel +5500 +##かった +##put +により +s2 +mo +##gh +men +ka +amoled +div +##tr +##n1 +port +howard +##tags +ken +dnf +##nus +adsense +##а +ide +##へ +buff +thunder +##town +##ique +has +##body +auto +pin +##erry +tee +てした +295 +number +##the +##013 +object +psp +cool +udnbkk +16gb +##mic +miui +##tro +most +r2 +##alk +##nity +1880 +±0 +##いました +428 +s4 +law +version +##oa +n1 +sgs +docomo +##tf +##ack +henry +fc2 +##ded +##sco +##014 +##rite +286 +0mm +linkedin +##ada +##now +wii +##ndy +ucbug +##◎ +sputniknews +legalminer +##ika +##xp +2gb +##bu +q10 +oo +b6 +come +##rman +cheese +ming +maker +##gm +nikon +##fig +ppi +kelly +##ります +jchere +てきます +ted +md +003 +fgo +tech +##tto +dan +soc +##gl +##len +hair +earth +640 +521 +img +##pper +##a1 +##てきる +##ロク +acca +##ition +##ference +suite +##ig +outlook +##mond +##cation +398 +##pr +279 +101vip +358 +##999 +282 +64gb +3800 +345 +airport +##over +284 +##おり +jones +##ith +lab +##su +##いるのて +co2 +town +piece +##llo +no1 +vmware +24h +##qi +focus +reader +##admin +##ora +tb +false +##log +1898 +know +lan +838 +##ces +f4 +##ume +motel +stop +##oper +na +flickr +netcomponents +##af +##─ +pose +williams +local +##ound +##cg +##site +##iko +いお +274 +5m +gsm +con +##ath +1902 +friends +##hip +cell +317 +##rey +780 +cream +##cks +012 +##dp +facebooktwitterpinterestgoogle +sso +324 +shtml +song +swiss +##mw +##キンク +lumia +xdd +string +tiffany +522 +marc +られた +insee +russell +sc +dell +##ations +ok +camera +289 +##vs +##flow +##late +classic +287 +##nter +stay +g1 +mtv +512 +##ever +##lab +##nger +qe +sata +ryan +d1 +50ml +cms +##cing +su +292 +3300 +editor +296 +##nap +security +sunday +association +##ens +##700 +##bra +acg +##かり +sofascore +とは +mkv +##ign +jonathan +gary +build +labels +##oto +tesla +moba +qi +gohappy +general +ajax +1024 +##かる +サイト +society +##test +##urs +wps +fedora +##ich +mozilla +328 +##480 +##dr +usa +urn +##lina +##r +grace +##die +##try +##ader +1250 +##なり +elle +570 +##chen +##ᆯ +price +##ten +uhz +##ough +eq +##hen +states +push +session +balance +wow +506 +##cus +##py +when +##ward +##ep +34e +wong +library +prada +##サイト +##cle +running +##ree +313 +ck +date +q4 +##ctive +##ool +##> +mk +##ira +##163 +388 +die +secret +rq +dota +buffet +は1ヶ +e6 +##ez +pan +368 +ha +##card +##cha +2a +##さ +alan +day3 +eye +f3 +##end +france +keep +adi +rna +tvbs +##ala +solo +nova +##え +##tail +##ょう +support +##ries +##なる +##ved +base +copy +iis +fps +##ways +hero +hgih +profile +fish +mu +ssh +entertainment +chang +##wd +click +cake +##ond +pre +##tom +kic +pixel +##ov +##fl +product +6a +##pd +dear +##gate +es +yumi +audio +##² +##sky +echo +bin +where +##ture +329 +##ape +find +sap +isis +##なと +nand +##101 +##load +##ream +band +a6 +525 +never +##post +festival +50cm +##we +555 +guide +314 +zenfone +##ike +335 +gd +forum +jessica +strong +alexander +##ould +software +allen +##ious +program +360° +else +lohasthree +##gar +することかてきます +please +##れます +rc +##ggle +##ric +bim +50000 +##own +eclipse +355 +brian +3ds +##side +061 +361 +##other +##ける +##tech +##ator +485 +engine +##ged +##t +plaza +##fit +cia +ngo +westbrook +shi +tbs +50mm +##みませんか +sci +291 +reuters +##ily +contextlink +##hn +af +##cil +bridge +very +##cel +1890 +cambridge +##ize +15g +##aid +##data +790 +frm +##head +award +butler +##sun +meta +##mar +america +ps3 +puma +pmid +##すか +lc +670 +kitchen +##lic +オーフン5 +きなしソフトサーヒス +そして +day1 +future +★★★★ +##text +##page +##rris +pm1 +##ket +fans +##っています +1001 +christian +bot +kids +trackback +##hai +c3 +display +##hl +n2 +1896 +idea +さんも +##sent +airmail +##ug +##men +pwm +けます +028 +##lution +369 +852 +awards +schemas +354 +asics +wikipedia +font +##tional +##vy +c2 +293 +##れている +##dget +##ein +っている +contact +pepper +スキル +339 +##~5 +294 +##uel +##ument +730 +##hang +みてす +q5 +##sue +rain +##ndi +wei +swatch +##cept +わせ +331 +popular +##ste +##tag +p2 +501 +trc +1899 +##west +##live +justin +honda +ping +messenger +##rap +v9 +543 +##とは +unity +appqq +はすへて +025 +leo +##tone +##テ +##ass +uniqlo +##010 +502 +her +jane +memory +moneydj +##tical +human +12306 +していると +##m2 +coc +miacare +##mn +tmt +##core +vim +kk +##may +fan +target +use +too +338 +435 +2050 +867 +737 +fast +##2c +services +##ope +omega +energy +##わ +pinkoi +1a +##なから +##rain +jackson +##ement +##シャンルの +374 +366 +そんな +p9 +rd +##ᆨ +1111 +##tier +##vic +zone +##│ +385 +690 +dl +isofix +cpa +m4 +322 +kimi +めて +davis +##lay +lulu +##uck +050 +weeks +qs +##hop +920 +##n +ae +##ear +~5 +eia +405 +##fly +korea +jpeg +boost +##ship +small +##リア +1860 +eur +297 +425 +valley +##iel +simple +##ude +rn +k2 +##ena +されます +non +patrick +しているから +##ナー +feed +5757 +30g +process +well +qqmei +##thing +they +aws +lu +pink +##ters +##kin +または +board +##vertisement +wine +##ien +unicode +##dge +r1 +359 +##tant +いを +##twitter +##3c +cool1 +される +##れて +##l +isp +##012 +standard +45㎡2 +402 +##150 +matt +##fu +326 +##iner +googlemsn +pixnetfacebookyahoo +##ラン +x7 +886 +##uce +メーカー +sao +##ev +##きました +##file +9678 +403 +xddd +shirt +6l +##rio +##hat +3mm +givenchy +ya +bang +##lio +monday +crystal +ロクイン +##abc +336 +head +890 +ubuntuforumwikilinuxpastechat +##vc +##~20 +##rity +cnc +7866 +ipv6 +null +1897 +##ost +yang +imsean +tiger +##fet +##ンス +352 +##= +dji +327 +ji +maria +##come +##んて +foundation +3100 +##beth +##なった +1m +601 +active +##aft +##don +3p +sr +349 +emma +##khz +living +415 +353 +1889 +341 +709 +457 +sas +x6 +##face +pptv +x4 +##mate +han +sophie +##jing +337 +fifa +##mand +other +sale +inwedding +##gn +てきちゃいます +##mmy +##pmlast +bad +nana +nbc +してみてくたさいね +なとはお +##wu +##かあります +##あ +note7 +single +##340 +せからこ +してくたさい♪この +しにはとんとんワークケートを +するとあなたにもっとマッチした +ならワークケートへ +もみつかっちゃうかも +ワークケートの +##bel +window +##dio +##ht +union +age +382 +14 +##ivity +##y +コメント +domain +neo +##isa +##lter +5k +f5 +steven +##cts +powerpoint +tft +self +g2 +ft +##テル +zol +##act +mwc +381 +343 +もう +nbapop +408 +てある +eds +ace +##room +previous +author +tomtom +il +##ets +hu +financial +☆☆☆ +っています +bp +5t +chi +1gb +##hg +fairmont +cross +008 +gay +h2 +function +##けて +356 +also +1b +625 +##ータ +##raph +1894 +3~5 +##ils +i3 +334 +avenue +##host +による +##bon +##tsu +message +navigation +50g +fintech +h6 +##ことを +8cm +##ject +##vas +##firm +credit +##wf +xxxx +form +##nor +##space +huawei +plan +json +sbl +##dc +machine +921 +392 +wish +##120 +##sol +windows7 +edward +##ために +development +washington +##nsis +lo +818 +##sio +##ym +##bor +planet +##~8 +##wt +ieee +gpa +##めて +camp +ann +gm +##tw +##oka +connect +##rss +##work +##atus +wall +chicken +soul +2mm +##times +fa +##ather +##cord +009 +##eep +hitachi +gui +harry +##pan +e1 +disney +##press +##ーション +wind +386 +frigidaire +##tl +liu +hsu +332 +basic +von +ev +いた +てきる +スホンサーサイト +learning +##ull +expedia +archives +change +##wei +santa +cut +ins +6gb +turbo +brand +cf1 +508 +004 +return +747 +##rip +h1 +##nis +##をこ +128gb +##にお +3t +application +しており +emc +rx +##oon +384 +quick +412 +15058 +wilson +wing +chapter +##bug +beyond +##cms +##dar +##oh +zoom +e2 +trip +sb +##nba +rcep +342 +aspx +ci +080 +gc +gnu +める +##count +advanced +dance +dv +##url +##ging +367 +8591 +am09 +shadow +battle +346 +##i +##cia +##という +emily +##のてす +##tation +host +ff +techorz +sars +##mini +##mporary +##ering +nc +4200 +798 +##next +cma +##mbps +##gas +##ift +##dot +##ィ +455 +##~17 +amana +##りの +426 +##ros +ir +00㎡1 +##eet +##ible +##↓ +710 +ˋ▽ˊ +##aka +dcs +iq +##v +l1 +##lor +maggie +##011 +##iu +588 +##~1 +830 +##gt +1tb +articles +create +##burg +##iki +database +fantasy +##rex +##cam +dlc +dean +##you +hard +path +gaming +victoria +maps +cb +##lee +##itor +overchicstoretvhome +systems +##xt +416 +p3 +sarah +760 +##nan +407 +486 +x9 +install +second +626 +##ann +##ph +##rcle +##nic +860 +##nar +ec +##とう +768 +metro +chocolate +##rian +~4 +##table +##しています +skin +##sn +395 +mountain +##0mm +inparadise +6m +7x24 +ib +4800 +##jia +eeworld +creative +g5 +g3 +357 +parker +ecfa +village +からの +18000 +sylvia +サーヒス +hbl +##ques +##onsored +##x2 +##きます +##v4 +##tein +ie6 +383 +##stack +389 +ver +##ads +##baby +sound +bbe +##110 +##lone +##uid +ads +022 +gundam +351 +thinkpad +006 +scrum +match +##ave +mems +##470 +##oy +##なりました +##talk +glass +lamigo +span +##eme +job +##a5 +jay +wade +kde +498 +##lace +ocean +tvg +##covery +##r3 +##ners +##rea +junior +think +##aine +cover +##ision +##sia +↓↓ +##bow +msi +413 +458 +406 +##love +711 +801 +soft +z2 +##pl +456 +1840 +mobil +mind +##uy +427 +nginx +##oi +めた +##rr +6221 +##mple +##sson +##ーシてす +371 +##nts +91tv +comhd +crv3000 +##uard +1868 +397 +deep +lost +field +gallery +##bia +rate +spf +redis +traction +930 +icloud +011 +なら +fe +jose +372 +##tory +into +sohu +fx +899 +379 +kicstart2 +##hia +すく +##~3 +##sit +ra +24 +##walk +##xure +500g +##pact +pacific +xa +natural +carlo +##250 +##walker +1850 +##can +cto +gigi +516 +##サー +pen +##hoo +ob +matlab +##b +##yy +13913459 +##iti +mango +##bbs +sense +c5 +oxford +##ニア +walker +jennifer +##ola +course +##bre +701 +##pus +##rder +lucky +075 +##ぁ +ivy +なお +##nia +sotheby +side +##ugh +joy +##orage +##ush +##bat +##dt +364 +r9 +##2d +##gio +511 +country +wear +##lax +##~7 +##moon +393 +seven +study +411 +348 +lonzo +8k +##ェ +evolution +##イフ +##kk +gs +kd +##レス +arduino +344 +b12 +##lux +arpg +##rdon +cook +##x5 +dark +five +##als +##ida +とても +sign +362 +##ちの +something +20mm +##nda +387 +##posted +fresh +tf +1870 +422 +cam +##mine +##skip +##form +##ssion +education +394 +##tee +dyson +stage +##jie +want +##night +epson +pack +あります +##ppy +テリヘル +##█ +wd +##eh +##rence +left +##lvin +golden +mhz +discovery +##trix +##n2 +loft +##uch +##dra +##sse +speed +~1 +1mdb +sorry +welcome +##urn +wave +gaga +##lmer +teddy +##160 +トラックハック +せよ +611 +##f2016 +378 +rp +##sha +rar +##あなたに +##きた +840 +holiday +##ュー +373 +074 +##vg +##nos +##rail +gartner +gi +6p +##dium +kit +488 +b3 +eco +##ろう +20g +sean +##stone +autocad +nu +##np +f16 +write +029 +m5 +##ias +images +atp +##dk +fsm +504 +1350 +ve +52kb +##xxx +##のに +##cake +414 +unit +lim +ru +1v +##ification +published +angela +16g +analytics +ak +##q +##nel +gmt +##icon +again +##₂ +##bby +ios11 +445 +かこさいます +waze +いてす +##ハ +9985 +##ust +##ティー +framework +##007 +iptv +delete +52sykb +cl +wwdc +027 +30cm +##fw +##ての +1389 +##xon +brandt +##ses +##dragon +tc +vetements +anne +monte +modern +official +##へて +##ere +##nne +##oud +もちろん +50 +etnews +##a2 +##graphy +421 +863 +##ちゃん +444 +##rtex +##てお +l2 +##gma +mount +ccd +たと +archive +morning +tan +ddos +e7 +##ホ +day4 +##ウ +gis +453 +its +495 +factory +bruce +pg +##ito +ってくたさい +guest +cdma +##lling +536 +n3 +しかし +3~4 +mega +eyes +ro +13 +women +dac +church +##jun +singapore +##facebook +6991 +starbucks +##tos +##stin +##shine +zen +##mu +tina +20℃ +1893 +##たけて +503 +465 +request +##gence +qt +##っ +1886 +347 +363 +q7 +##zzi +diary +##tore +409 +##ead +468 +cst +##osa +canada +agent +va +##jiang +##ちは +##ーク +##lam +sg +##nix +##sday +##よって +g6 +##master +bing +##zl +charlie +16 +8mm +nb40 +##ーン +thai +##ルフ +ln284ct +##itz +##2f +bonnie +##food +##lent +originals +##stro +##lts +418 +∟∣ +##bscribe +children +ntd +yesstyle +##かも +hmv +##tment +d5 +2cm +arts +sms +##pn +##я +##いい +topios9 +539 +lifestyle +virtual +##ague +xz +##deo +muji +024 +unt +##nnis +##ᅩ +faq1 +1884 +396 +##ette +fly +64㎡ +はしめまして +441 +curry +##pop +のこ +release +##← +##◆◆ +##cast +073 +ありな +500ml +##ews +5c +##stle +ios7 +##ima +787 +dog +lenovo +##r4 +roger +013 +cbs +vornado +100m +417 +##desk +##クok +##ald +1867 +9595 +2900 +##van +oil +##x +some +break +common +##jy +##lines +g7 +twice +419 +ella +nano +belle +にこ +##mes +##self +##note +jb +##ことかてきます +benz +##との +##ova +451 +save +##wing +##ますのて +kai +りは +##hua +##rect +rainer +##unge +448 +##0m +adsl +##かな +guestname +##uma +##kins +##zu +tokichoi +##price +county +##med +##mus +rmk +391 +address +vm +えて +openload +##group +##hin +##iginal +amg +urban +##oz +jobs +emi +##public +beautiful +##sch +album +##dden +##bell +jerry +works +hostel +miller +##drive +##rmin +##10 +376 +boot +828 +##370 +##fx +##cm~ +1885 +##nome +##ctionary +##oman +##lish +##cr +##hm +433 +##how +432 +francis +xi +c919 +b5 +evernote +##uc +vga +##3000 +coupe +##urg +##cca +##uality +019 +6g +れる +multi +##また +##ett +em +hey +##ani +##tax +##rma +inside +than +740 +leonnhurt +##jin +ict +れた +bird +notes +200mm +くの +##dical +##lli +result +442 +iu +ee +438 +smap +gopro +##last +yin +pure +998 +32g +けた +5kg +##dan +##rame +mama +##oot +bean +marketing +##hur +2l +bella +sync +xuite +##ground +515 +discuz +##getrelax +##ince +##bay +##5s +cj +##イス +gmat +apt +##pass +jing +##rix +c4 +rich +##とても +niusnews +##ello +bag +770 +##eting +##mobile +18 +culture +015 +##のてすか +377 +1020 +area +##ience +616 +details +gp +universal +silver +dit +はお +private +ddd +u11 +kanshu +##ified +fung +##nny +dx +##520 +tai +475 +023 +##fr +##lean +3s +##pin +429 +##rin +25000 +ly +rick +##bility +usb3 +banner +##baru +##gion +metal +dt +vdf +1871 +karl +qualcomm +bear +1010 +oldid +ian +jo +##tors +population +##ernel +1882 +mmorpg +##mv +##bike +603 +##© +ww +friend +##ager +exhibition +##del +##pods +fpx +structure +##free +##tings +kl +##rley +##copyright +##mma +california +3400 +orange +yoga +4l +canmake +honey +##anda +##コメント +595 +nikkie +##ルハイト +dhl +publishing +##mall +##gnet +20cm +513 +##クセス +##┅ +e88 +970 +##dog +fishbase +##! +##" +### +##$ +##% +##& +##' +##( +##) +##* +##+ +##, +##- +##. +##/ +##: +##; +##< +##= +##> +##? +##@ +##[ +##\ +##] +##^ +##_ +##{ +##| +##} +##~ +##£ +##¤ +##¥ +##§ +##« +##± +##³ +##µ +##· +##¹ +##º +##» +##¼ +##ß +##æ +##÷ +##ø +##đ +##ŋ +##ɔ +##ə +##ɡ +##ʰ +##ˇ +##ˈ +##ˊ +##ˋ +##ˍ +##ː +##˙ +##˚ +##ˢ +##α +##β +##γ +##δ +##ε +##η +##θ +##ι +##κ +##λ +##μ +##ν +##ο +##π +##ρ +##ς +##σ +##τ +##υ +##φ +##χ +##ψ +##б +##в +##г +##д +##е +##ж +##з +##к +##л +##м +##н +##о +##п +##р +##с +##т +##у +##ф +##х +##ц +##ч +##ш +##ы +##ь +##і +##ا +##ب +##ة +##ت +##د +##ر +##س +##ع +##ل +##م +##ن +##ه +##و +##ي +##۩ +##ก +##ง +##น +##ม +##ย +##ร +##อ +##า +##เ +##๑ +##་ +##ღ +##ᄀ +##ᄁ +##ᄂ +##ᄃ +##ᄅ +##ᄆ +##ᄇ +##ᄈ +##ᄉ +##ᄋ +##ᄌ +##ᄎ +##ᄏ +##ᄐ +##ᄑ +##ᄒ +##ᅢ +##ᅣ +##ᅥ +##ᅦ +##ᅧ +##ᅨ +##ᅪ +##ᅬ +##ᅭ +##ᅮ +##ᅯ +##ᅲ +##ᅳ +##ᅴ +##ᆷ +##ᆸ +##ᆺ +##ᆻ +##ᗜ +##ᵃ +##ᵉ +##ᵍ +##ᵏ +##ᵐ +##ᵒ +##ᵘ +##‖ +##„ +##† +##• +##‥ +##‧ +##
 +##‰ +##′ +##″ +##‹ +##› +##※ +##‿ +##⁄ +##ⁱ +##⁺ +##ⁿ +##₁ +##₃ +##₄ +##€ +##№ +##ⅰ +##ⅱ +##ⅲ +##ⅳ +##ⅴ +##↔ +##↗ +##↘ +##⇒ +##∀ +##− +##∕ +##∙ +##√ +##∞ +##∟ +##∠ +##∣ +##∩ +##∮ +##∶ +##∼ +##∽ +##≈ +##≒ +##≡ +##≤ +##≥ +##≦ +##≧ +##≪ +##≫ +##⊙ +##⋅ +##⋈ +##⋯ +##⌒ +##① +##② +##③ +##④ +##⑤ +##⑥ +##⑦ +##⑧ +##⑨ +##⑩ +##⑴ +##⑵ +##⑶ +##⑷ +##⑸ +##⒈ +##⒉ +##⒊ +##⒋ +##ⓒ +##ⓔ +##ⓘ +##━ +##┃ +##┆ +##┊ +##┌ +##└ +##├ +##┣ +##═ +##║ +##╚ +##╞ +##╠ +##╭ +##╮ +##╯ +##╰ +##╱ +##╳ +##▂ +##▃ +##▅ +##▇ +##▉ +##▋ +##▌ +##▍ +##▎ +##□ +##▪ +##▫ +##▬ +##△ +##▶ +##► +##▽ +##◇ +##◕ +##◠ +##◢ +##◤ +##☀ +##☕ +##☞ +##☺ +##☼ +##♀ +##♂ +##♠ +##♡ +##♣ +##♦ +##♫ +##♬ +##✈ +##✔ +##✕ +##✖ +##✦ +##✨ +##✪ +##✰ +##✿ +##❀ +##➜ +##➤ +##⦿ +##、 +##。 +##〃 +##々 +##〇 +##〈 +##〉 +##《 +##》 +##「 +##」 +##『 +##』 +##【 +##】 +##〓 +##〔 +##〕 +##〖 +##〗 +##〜 +##〝 +##〞 +##ぃ +##ぇ +##ぬ +##ふ +##ほ +##む +##ゃ +##ゅ +##ゆ +##ょ +##゜ +##ゝ +##ァ +##ゥ +##エ +##ォ +##ケ +##サ +##セ +##ソ +##ッ +##ニ +##ヌ +##ネ +##ノ +##ヘ +##モ +##ャ +##ヤ +##ュ +##ユ +##ョ +##ヨ +##ワ +##ヲ +##・ +##ヽ +##ㄅ +##ㄆ +##ㄇ +##ㄉ +##ㄋ +##ㄌ +##ㄍ +##ㄎ +##ㄏ +##ㄒ +##ㄚ +##ㄛ +##ㄞ +##ㄟ +##ㄢ +##ㄤ +##ㄥ +##ㄧ +##ㄨ +##ㆍ +##㈦ +##㊣ +##㗎 +##一 +##丁 +##七 +##万 +##丈 +##三 +##上 +##下 +##不 +##与 +##丐 +##丑 +##专 +##且 +##丕 +##世 +##丘 +##丙 +##业 +##丛 +##东 +##丝 +##丞 +##丟 +##両 +##丢 +##两 +##严 +##並 +##丧 +##丨 +##个 +##丫 +##中 +##丰 +##串 +##临 +##丶 +##丸 +##丹 +##为 +##主 +##丼 +##丽 +##举 +##丿 +##乂 +##乃 +##久 +##么 +##义 +##之 +##乌 +##乍 +##乎 +##乏 +##乐 +##乒 +##乓 +##乔 +##乖 +##乗 +##乘 +##乙 +##乜 +##九 +##乞 +##也 +##习 +##乡 +##书 +##乩 +##买 +##乱 +##乳 +##乾 +##亀 +##亂 +##了 +##予 +##争 +##事 +##二 +##于 +##亏 +##云 +##互 +##五 +##井 +##亘 +##亙 +##亚 +##些 +##亜 +##亞 +##亟 +##亡 +##亢 +##交 +##亥 +##亦 +##产 +##亨 +##亩 +##享 +##京 +##亭 +##亮 +##亲 +##亳 +##亵 +##人 +##亿 +##什 +##仁 +##仃 +##仄 +##仅 +##仆 +##仇 +##今 +##介 +##仍 +##从 +##仏 +##仑 +##仓 +##仔 +##仕 +##他 +##仗 +##付 +##仙 +##仝 +##仞 +##仟 +##代 +##令 +##以 +##仨 +##仪 +##们 +##仮 +##仰 +##仲 +##件 +##价 +##任 +##份 +##仿 +##企 +##伉 +##伊 +##伍 +##伎 +##伏 +##伐 +##休 +##伕 +##众 +##优 +##伙 +##会 +##伝 +##伞 +##伟 +##传 +##伢 +##伤 +##伦 +##伪 +##伫 +##伯 +##估 +##伴 +##伶 +##伸 +##伺 +##似 +##伽 +##佃 +##但 +##佇 +##佈 +##位 +##低 +##住 +##佐 +##佑 +##体 +##佔 +##何 +##佗 +##佘 +##余 +##佚 +##佛 +##作 +##佝 +##佞 +##佟 +##你 +##佢 +##佣 +##佤 +##佥 +##佩 +##佬 +##佯 +##佰 +##佳 +##併 +##佶 +##佻 +##佼 +##使 +##侃 +##侄 +##來 +##侈 +##例 +##侍 +##侏 +##侑 +##侖 +##侗 +##供 +##依 +##侠 +##価 +##侣 +##侥 +##侦 +##侧 +##侨 +##侬 +##侮 +##侯 +##侵 +##侶 +##侷 +##便 +##係 +##促 +##俄 +##俊 +##俎 +##俏 +##俐 +##俑 +##俗 +##俘 +##俚 +##保 +##俞 +##俟 +##俠 +##信 +##俨 +##俩 +##俪 +##俬 +##俭 +##修 +##俯 +##俱 +##俳 +##俸 +##俺 +##俾 +##倆 +##倉 +##個 +##倌 +##倍 +##倏 +##們 +##倒 +##倔 +##倖 +##倘 +##候 +##倚 +##倜 +##借 +##倡 +##値 +##倦 +##倩 +##倪 +##倫 +##倬 +##倭 +##倶 +##债 +##值 +##倾 +##偃 +##假 +##偈 +##偉 +##偌 +##偎 +##偏 +##偕 +##做 +##停 +##健 +##側 +##偵 +##偶 +##偷 +##偻 +##偽 +##偿 +##傀 +##傅 +##傍 +##傑 +##傘 +##備 +##傚 +##傢 +##傣 +##傥 +##储 +##傩 +##催 +##傭 +##傲 +##傳 +##債 +##傷 +##傻 +##傾 +##僅 +##働 +##像 +##僑 +##僕 +##僖 +##僚 +##僥 +##僧 +##僭 +##僮 +##僱 +##僵 +##價 +##僻 +##儀 +##儂 +##億 +##儆 +##儉 +##儋 +##儒 +##儕 +##儘 +##償 +##儡 +##優 +##儲 +##儷 +##儼 +##儿 +##兀 +##允 +##元 +##兄 +##充 +##兆 +##兇 +##先 +##光 +##克 +##兌 +##免 +##児 +##兑 +##兒 +##兔 +##兖 +##党 +##兜 +##兢 +##入 +##內 +##全 +##兩 +##八 +##公 +##六 +##兮 +##兰 +##共 +##兲 +##关 +##兴 +##兵 +##其 +##具 +##典 +##兹 +##养 +##兼 +##兽 +##冀 +##内 +##円 +##冇 +##冈 +##冉 +##冊 +##册 +##再 +##冏 +##冒 +##冕 +##冗 +##写 +##军 +##农 +##冠 +##冢 +##冤 +##冥 +##冨 +##冪 +##冬 +##冯 +##冰 +##冲 +##决 +##况 +##冶 +##冷 +##冻 +##冼 +##冽 +##冾 +##净 +##凄 +##准 +##凇 +##凈 +##凉 +##凋 +##凌 +##凍 +##减 +##凑 +##凛 +##凜 +##凝 +##几 +##凡 +##凤 +##処 +##凪 +##凭 +##凯 +##凰 +##凱 +##凳 +##凶 +##凸 +##凹 +##出 +##击 +##函 +##凿 +##刀 +##刁 +##刃 +##分 +##切 +##刈 +##刊 +##刍 +##刎 +##刑 +##划 +##列 +##刘 +##则 +##刚 +##创 +##初 +##删 +##判 +##別 +##刨 +##利 +##刪 +##别 +##刮 +##到 +##制 +##刷 +##券 +##刹 +##刺 +##刻 +##刽 +##剁 +##剂 +##剃 +##則 +##剉 +##削 +##剋 +##剌 +##前 +##剎 +##剐 +##剑 +##剔 +##剖 +##剛 +##剜 +##剝 +##剣 +##剤 +##剥 +##剧 +##剩 +##剪 +##副 +##割 +##創 +##剷 +##剽 +##剿 +##劃 +##劇 +##劈 +##劉 +##劊 +##劍 +##劏 +##劑 +##力 +##劝 +##办 +##功 +##加 +##务 +##劣 +##动 +##助 +##努 +##劫 +##劭 +##励 +##劲 +##劳 +##労 +##劵 +##効 +##劾 +##势 +##勁 +##勃 +##勇 +##勉 +##勋 +##勐 +##勒 +##動 +##勖 +##勘 +##務 +##勛 +##勝 +##勞 +##募 +##勢 +##勤 +##勧 +##勳 +##勵 +##勸 +##勺 +##勻 +##勾 +##勿 +##匀 +##包 +##匆 +##匈 +##匍 +##匐 +##匕 +##化 +##北 +##匙 +##匝 +##匠 +##匡 +##匣 +##匪 +##匮 +##匯 +##匱 +##匹 +##区 +##医 +##匾 +##匿 +##區 +##十 +##千 +##卅 +##升 +##午 +##卉 +##半 +##卍 +##华 +##协 +##卑 +##卒 +##卓 +##協 +##单 +##卖 +##南 +##単 +##博 +##卜 +##卞 +##卟 +##占 +##卡 +##卢 +##卤 +##卦 +##卧 +##卫 +##卮 +##卯 +##印 +##危 +##即 +##却 +##卵 +##卷 +##卸 +##卻 +##卿 +##厂 +##厄 +##厅 +##历 +##厉 +##压 +##厌 +##厕 +##厘 +##厚 +##厝 +##原 +##厢 +##厥 +##厦 +##厨 +##厩 +##厭 +##厮 +##厲 +##厳 +##去 +##县 +##叁 +##参 +##參 +##又 +##叉 +##及 +##友 +##双 +##反 +##収 +##发 +##叔 +##取 +##受 +##变 +##叙 +##叛 +##叟 +##叠 +##叡 +##叢 +##口 +##古 +##句 +##另 +##叨 +##叩 +##只 +##叫 +##召 +##叭 +##叮 +##可 +##台 +##叱 +##史 +##右 +##叵 +##叶 +##号 +##司 +##叹 +##叻 +##叼 +##叽 +##吁 +##吃 +##各 +##吆 +##合 +##吉 +##吊 +##吋 +##同 +##名 +##后 +##吏 +##吐 +##向 +##吒 +##吓 +##吕 +##吖 +##吗 +##君 +##吝 +##吞 +##吟 +##吠 +##吡 +##否 +##吧 +##吨 +##吩 +##含 +##听 +##吭 +##吮 +##启 +##吱 +##吳 +##吴 +##吵 +##吶 +##吸 +##吹 +##吻 +##吼 +##吽 +##吾 +##呀 +##呂 +##呃 +##呆 +##呈 +##告 +##呋 +##呎 +##呐 +##呓 +##呕 +##呗 +##员 +##呛 +##呜 +##呢 +##呤 +##呦 +##周 +##呱 +##呲 +##味 +##呵 +##呷 +##呸 +##呻 +##呼 +##命 +##咀 +##咁 +##咂 +##咄 +##咆 +##咋 +##和 +##咎 +##咏 +##咐 +##咒 +##咔 +##咕 +##咖 +##咗 +##咘 +##咙 +##咚 +##咛 +##咣 +##咤 +##咦 +##咧 +##咨 +##咩 +##咪 +##咫 +##咬 +##咭 +##咯 +##咱 +##咲 +##咳 +##咸 +##咻 +##咽 +##咿 +##哀 +##品 +##哂 +##哄 +##哆 +##哇 +##哈 +##哉 +##哋 +##哌 +##响 +##哎 +##哏 +##哐 +##哑 +##哒 +##哔 +##哗 +##哟 +##員 +##哥 +##哦 +##哧 +##哨 +##哩 +##哪 +##哭 +##哮 +##哲 +##哺 +##哼 +##哽 +##唁 +##唄 +##唆 +##唇 +##唉 +##唏 +##唐 +##唑 +##唔 +##唠 +##唤 +##唧 +##唬 +##售 +##唯 +##唰 +##唱 +##唳 +##唷 +##唸 +##唾 +##啃 +##啄 +##商 +##啉 +##啊 +##問 +##啓 +##啕 +##啖 +##啜 +##啞 +##啟 +##啡 +##啤 +##啥 +##啦 +##啧 +##啪 +##啫 +##啬 +##啮 +##啰 +##啱 +##啲 +##啵 +##啶 +##啷 +##啸 +##啻 +##啼 +##啾 +##喀 +##喂 +##喃 +##善 +##喆 +##喇 +##喉 +##喊 +##喋 +##喎 +##喏 +##喔 +##喘 +##喙 +##喚 +##喜 +##喝 +##喟 +##喧 +##喪 +##喫 +##喬 +##單 +##喰 +##喱 +##喲 +##喳 +##喵 +##営 +##喷 +##喹 +##喺 +##喻 +##喽 +##嗅 +##嗆 +##嗇 +##嗎 +##嗑 +##嗒 +##嗓 +##嗔 +##嗖 +##嗚 +##嗜 +##嗝 +##嗟 +##嗡 +##嗣 +##嗤 +##嗦 +##嗨 +##嗪 +##嗬 +##嗯 +##嗰 +##嗲 +##嗳 +##嗶 +##嗷 +##嗽 +##嘀 +##嘅 +##嘆 +##嘈 +##嘉 +##嘌 +##嘍 +##嘎 +##嘔 +##嘖 +##嘗 +##嘘 +##嘚 +##嘛 +##嘜 +##嘞 +##嘟 +##嘢 +##嘣 +##嘤 +##嘧 +##嘩 +##嘭 +##嘮 +##嘯 +##嘰 +##嘱 +##嘲 +##嘴 +##嘶 +##嘸 +##嘹 +##嘻 +##嘿 +##噁 +##噌 +##噎 +##噓 +##噔 +##噗 +##噙 +##噜 +##噠 +##噢 +##噤 +##器 +##噩 +##噪 +##噬 +##噱 +##噴 +##噶 +##噸 +##噹 +##噻 +##噼 +##嚀 +##嚇 +##嚎 +##嚏 +##嚐 +##嚓 +##嚕 +##嚟 +##嚣 +##嚥 +##嚨 +##嚮 +##嚴 +##嚷 +##嚼 +##囂 +##囉 +##囊 +##囍 +##囑 +##囔 +##囗 +##囚 +##四 +##囝 +##回 +##囟 +##因 +##囡 +##团 +##団 +##囤 +##囧 +##囪 +##囫 +##园 +##困 +##囱 +##囲 +##図 +##围 +##囹 +##固 +##国 +##图 +##囿 +##圃 +##圄 +##圆 +##圈 +##國 +##圍 +##圏 +##園 +##圓 +##圖 +##團 +##圜 +##土 +##圣 +##圧 +##在 +##圩 +##圭 +##地 +##圳 +##场 +##圻 +##圾 +##址 +##坂 +##均 +##坊 +##坍 +##坎 +##坏 +##坐 +##坑 +##块 +##坚 +##坛 +##坝 +##坞 +##坟 +##坠 +##坡 +##坤 +##坦 +##坨 +##坪 +##坯 +##坳 +##坵 +##坷 +##垂 +##垃 +##垄 +##型 +##垒 +##垚 +##垛 +##垠 +##垢 +##垣 +##垦 +##垩 +##垫 +##垭 +##垮 +##垵 +##埂 +##埃 +##埋 +##城 +##埔 +##埕 +##埗 +##域 +##埠 +##埤 +##埵 +##執 +##埸 +##培 +##基 +##埼 +##堀 +##堂 +##堃 +##堅 +##堆 +##堇 +##堑 +##堕 +##堙 +##堡 +##堤 +##堪 +##堯 +##堰 +##報 +##場 +##堵 +##堺 +##堿 +##塊 +##塌 +##塑 +##塔 +##塗 +##塘 +##塚 +##塞 +##塢 +##塩 +##填 +##塬 +##塭 +##塵 +##塾 +##墀 +##境 +##墅 +##墉 +##墊 +##墒 +##墓 +##増 +##墘 +##墙 +##墜 +##增 +##墟 +##墨 +##墩 +##墮 +##墳 +##墻 +##墾 +##壁 +##壅 +##壆 +##壇 +##壊 +##壑 +##壓 +##壕 +##壘 +##壞 +##壟 +##壢 +##壤 +##壩 +##士 +##壬 +##壮 +##壯 +##声 +##売 +##壳 +##壶 +##壹 +##壺 +##壽 +##处 +##备 +##変 +##复 +##夏 +##夔 +##夕 +##外 +##夙 +##多 +##夜 +##够 +##夠 +##夢 +##夥 +##大 +##天 +##太 +##夫 +##夭 +##央 +##夯 +##失 +##头 +##夷 +##夸 +##夹 +##夺 +##夾 +##奂 +##奄 +##奇 +##奈 +##奉 +##奋 +##奎 +##奏 +##奐 +##契 +##奔 +##奕 +##奖 +##套 +##奘 +##奚 +##奠 +##奢 +##奥 +##奧 +##奪 +##奬 +##奮 +##女 +##奴 +##奶 +##奸 +##她 +##好 +##如 +##妃 +##妄 +##妆 +##妇 +##妈 +##妊 +##妍 +##妒 +##妓 +##妖 +##妘 +##妙 +##妝 +##妞 +##妣 +##妤 +##妥 +##妨 +##妩 +##妪 +##妮 +##妲 +##妳 +##妹 +##妻 +##妾 +##姆 +##姉 +##姊 +##始 +##姍 +##姐 +##姑 +##姒 +##姓 +##委 +##姗 +##姚 +##姜 +##姝 +##姣 +##姥 +##姦 +##姨 +##姪 +##姫 +##姬 +##姹 +##姻 +##姿 +##威 +##娃 +##娄 +##娅 +##娆 +##娇 +##娉 +##娑 +##娓 +##娘 +##娛 +##娜 +##娟 +##娠 +##娣 +##娥 +##娩 +##娱 +##娲 +##娴 +##娶 +##娼 +##婀 +##婁 +##婆 +##婉 +##婊 +##婕 +##婚 +##婢 +##婦 +##婧 +##婪 +##婭 +##婴 +##婵 +##婶 +##婷 +##婺 +##婿 +##媒 +##媚 +##媛 +##媞 +##媧 +##媲 +##媳 +##媽 +##媾 +##嫁 +##嫂 +##嫉 +##嫌 +##嫑 +##嫔 +##嫖 +##嫘 +##嫚 +##嫡 +##嫣 +##嫦 +##嫩 +##嫲 +##嫵 +##嫻 +##嬅 +##嬉 +##嬌 +##嬗 +##嬛 +##嬢 +##嬤 +##嬪 +##嬰 +##嬴 +##嬷 +##嬸 +##嬿 +##孀 +##孃 +##子 +##孑 +##孔 +##孕 +##孖 +##字 +##存 +##孙 +##孚 +##孛 +##孜 +##孝 +##孟 +##孢 +##季 +##孤 +##学 +##孩 +##孪 +##孫 +##孬 +##孰 +##孱 +##孳 +##孵 +##學 +##孺 +##孽 +##孿 +##宁 +##它 +##宅 +##宇 +##守 +##安 +##宋 +##完 +##宏 +##宓 +##宕 +##宗 +##官 +##宙 +##定 +##宛 +##宜 +##宝 +##实 +##実 +##宠 +##审 +##客 +##宣 +##室 +##宥 +##宦 +##宪 +##宫 +##宮 +##宰 +##害 +##宴 +##宵 +##家 +##宸 +##容 +##宽 +##宾 +##宿 +##寂 +##寄 +##寅 +##密 +##寇 +##富 +##寐 +##寒 +##寓 +##寛 +##寝 +##寞 +##察 +##寡 +##寢 +##寥 +##實 +##寧 +##寨 +##審 +##寫 +##寬 +##寮 +##寰 +##寵 +##寶 +##寸 +##对 +##寺 +##寻 +##导 +##対 +##寿 +##封 +##専 +##射 +##将 +##將 +##專 +##尉 +##尊 +##尋 +##對 +##導 +##小 +##少 +##尔 +##尕 +##尖 +##尘 +##尚 +##尝 +##尤 +##尧 +##尬 +##就 +##尴 +##尷 +##尸 +##尹 +##尺 +##尻 +##尼 +##尽 +##尾 +##尿 +##局 +##屁 +##层 +##屄 +##居 +##屆 +##屈 +##屉 +##届 +##屋 +##屌 +##屍 +##屎 +##屏 +##屐 +##屑 +##展 +##屜 +##属 +##屠 +##屡 +##屢 +##層 +##履 +##屬 +##屯 +##山 +##屹 +##屿 +##岀 +##岁 +##岂 +##岌 +##岐 +##岑 +##岔 +##岖 +##岗 +##岘 +##岙 +##岚 +##岛 +##岡 +##岩 +##岫 +##岬 +##岭 +##岱 +##岳 +##岷 +##岸 +##峇 +##峋 +##峒 +##峙 +##峡 +##峤 +##峥 +##峦 +##峨 +##峪 +##峭 +##峯 +##峰 +##峴 +##島 +##峻 +##峽 +##崁 +##崂 +##崆 +##崇 +##崎 +##崑 +##崔 +##崖 +##崗 +##崙 +##崛 +##崧 +##崩 +##崭 +##崴 +##崽 +##嵇 +##嵊 +##嵋 +##嵌 +##嵐 +##嵘 +##嵩 +##嵬 +##嵯 +##嶂 +##嶄 +##嶇 +##嶋 +##嶙 +##嶺 +##嶼 +##嶽 +##巅 +##巍 +##巒 +##巔 +##巖 +##川 +##州 +##巡 +##巢 +##工 +##左 +##巧 +##巨 +##巩 +##巫 +##差 +##己 +##已 +##巳 +##巴 +##巷 +##巻 +##巽 +##巾 +##巿 +##币 +##市 +##布 +##帅 +##帆 +##师 +##希 +##帐 +##帑 +##帕 +##帖 +##帘 +##帚 +##帛 +##帜 +##帝 +##帥 +##带 +##帧 +##師 +##席 +##帮 +##帯 +##帰 +##帳 +##帶 +##帷 +##常 +##帼 +##帽 +##幀 +##幂 +##幄 +##幅 +##幌 +##幔 +##幕 +##幟 +##幡 +##幢 +##幣 +##幫 +##干 +##平 +##年 +##并 +##幸 +##幹 +##幺 +##幻 +##幼 +##幽 +##幾 +##广 +##庁 +##広 +##庄 +##庆 +##庇 +##床 +##序 +##庐 +##库 +##应 +##底 +##庖 +##店 +##庙 +##庚 +##府 +##庞 +##废 +##庠 +##度 +##座 +##庫 +##庭 +##庵 +##庶 +##康 +##庸 +##庹 +##庾 +##廁 +##廂 +##廃 +##廈 +##廉 +##廊 +##廓 +##廖 +##廚 +##廝 +##廟 +##廠 +##廢 +##廣 +##廬 +##廳 +##延 +##廷 +##建 +##廿 +##开 +##弁 +##异 +##弃 +##弄 +##弈 +##弊 +##弋 +##式 +##弑 +##弒 +##弓 +##弔 +##引 +##弗 +##弘 +##弛 +##弟 +##张 +##弥 +##弦 +##弧 +##弩 +##弭 +##弯 +##弱 +##張 +##強 +##弹 +##强 +##弼 +##弾 +##彅 +##彆 +##彈 +##彌 +##彎 +##归 +##当 +##录 +##彗 +##彙 +##彝 +##形 +##彤 +##彥 +##彦 +##彧 +##彩 +##彪 +##彫 +##彬 +##彭 +##彰 +##影 +##彷 +##役 +##彻 +##彼 +##彿 +##往 +##征 +##径 +##待 +##徇 +##很 +##徉 +##徊 +##律 +##後 +##徐 +##徑 +##徒 +##従 +##徕 +##得 +##徘 +##徙 +##徜 +##從 +##徠 +##御 +##徨 +##復 +##循 +##徬 +##微 +##徳 +##徴 +##徵 +##德 +##徹 +##徼 +##徽 +##心 +##必 +##忆 +##忌 +##忍 +##忏 +##忐 +##忑 +##忒 +##忖 +##志 +##忘 +##忙 +##応 +##忠 +##忡 +##忤 +##忧 +##忪 +##快 +##忱 +##念 +##忻 +##忽 +##忿 +##怀 +##态 +##怂 +##怅 +##怆 +##怎 +##怏 +##怒 +##怔 +##怕 +##怖 +##怙 +##怜 +##思 +##怠 +##怡 +##急 +##怦 +##性 +##怨 +##怪 +##怯 +##怵 +##总 +##怼 +##恁 +##恃 +##恆 +##恋 +##恍 +##恐 +##恒 +##恕 +##恙 +##恚 +##恢 +##恣 +##恤 +##恥 +##恨 +##恩 +##恪 +##恫 +##恬 +##恭 +##息 +##恰 +##恳 +##恵 +##恶 +##恸 +##恺 +##恻 +##恼 +##恿 +##悄 +##悅 +##悉 +##悌 +##悍 +##悔 +##悖 +##悚 +##悟 +##悠 +##患 +##悦 +##您 +##悩 +##悪 +##悬 +##悯 +##悱 +##悲 +##悴 +##悵 +##悶 +##悸 +##悻 +##悼 +##悽 +##情 +##惆 +##惇 +##惊 +##惋 +##惑 +##惕 +##惘 +##惚 +##惜 +##惟 +##惠 +##惡 +##惦 +##惧 +##惨 +##惩 +##惫 +##惬 +##惭 +##惮 +##惯 +##惰 +##惱 +##想 +##惴 +##惶 +##惹 +##惺 +##愁 +##愆 +##愈 +##愉 +##愍 +##意 +##愕 +##愚 +##愛 +##愜 +##感 +##愣 +##愤 +##愧 +##愫 +##愷 +##愿 +##慄 +##慈 +##態 +##慌 +##慎 +##慑 +##慕 +##慘 +##慚 +##慟 +##慢 +##慣 +##慧 +##慨 +##慫 +##慮 +##慰 +##慳 +##慵 +##慶 +##慷 +##慾 +##憂 +##憊 +##憋 +##憎 +##憐 +##憑 +##憔 +##憚 +##憤 +##憧 +##憨 +##憩 +##憫 +##憬 +##憲 +##憶 +##憾 +##懂 +##懇 +##懈 +##應 +##懊 +##懋 +##懑 +##懒 +##懦 +##懲 +##懵 +##懶 +##懷 +##懸 +##懺 +##懼 +##懾 +##懿 +##戀 +##戈 +##戊 +##戌 +##戍 +##戎 +##戏 +##成 +##我 +##戒 +##戕 +##或 +##战 +##戚 +##戛 +##戟 +##戡 +##戦 +##截 +##戬 +##戮 +##戰 +##戲 +##戳 +##戴 +##戶 +##户 +##戸 +##戻 +##戾 +##房 +##所 +##扁 +##扇 +##扈 +##扉 +##手 +##才 +##扎 +##扑 +##扒 +##打 +##扔 +##払 +##托 +##扛 +##扣 +##扦 +##执 +##扩 +##扪 +##扫 +##扬 +##扭 +##扮 +##扯 +##扰 +##扱 +##扳 +##扶 +##批 +##扼 +##找 +##承 +##技 +##抄 +##抉 +##把 +##抑 +##抒 +##抓 +##投 +##抖 +##抗 +##折 +##抚 +##抛 +##抜 +##択 +##抟 +##抠 +##抡 +##抢 +##护 +##报 +##抨 +##披 +##抬 +##抱 +##抵 +##抹 +##押 +##抽 +##抿 +##拂 +##拄 +##担 +##拆 +##拇 +##拈 +##拉 +##拋 +##拌 +##拍 +##拎 +##拐 +##拒 +##拓 +##拔 +##拖 +##拗 +##拘 +##拙 +##拚 +##招 +##拜 +##拟 +##拡 +##拢 +##拣 +##拥 +##拦 +##拧 +##拨 +##择 +##括 +##拭 +##拮 +##拯 +##拱 +##拳 +##拴 +##拷 +##拼 +##拽 +##拾 +##拿 +##持 +##挂 +##指 +##挈 +##按 +##挎 +##挑 +##挖 +##挙 +##挚 +##挛 +##挝 +##挞 +##挟 +##挠 +##挡 +##挣 +##挤 +##挥 +##挨 +##挪 +##挫 +##振 +##挲 +##挹 +##挺 +##挽 +##挾 +##捂 +##捅 +##捆 +##捉 +##捋 +##捌 +##捍 +##捎 +##捏 +##捐 +##捕 +##捞 +##损 +##捡 +##换 +##捣 +##捧 +##捨 +##捩 +##据 +##捱 +##捲 +##捶 +##捷 +##捺 +##捻 +##掀 +##掂 +##掃 +##掇 +##授 +##掉 +##掌 +##掏 +##掐 +##排 +##掖 +##掘 +##掙 +##掛 +##掠 +##採 +##探 +##掣 +##接 +##控 +##推 +##掩 +##措 +##掬 +##掰 +##掲 +##掳 +##掴 +##掷 +##掸 +##掺 +##揀 +##揃 +##揄 +##揆 +##揉 +##揍 +##描 +##提 +##插 +##揖 +##揚 +##換 +##握 +##揣 +##揩 +##揪 +##揭 +##揮 +##援 +##揶 +##揸 +##揹 +##揽 +##搀 +##搁 +##搂 +##搅 +##損 +##搏 +##搐 +##搓 +##搔 +##搖 +##搗 +##搜 +##搞 +##搡 +##搪 +##搬 +##搭 +##搵 +##搶 +##携 +##搽 +##摀 +##摁 +##摄 +##摆 +##摇 +##摈 +##摊 +##摒 +##摔 +##摘 +##摞 +##摟 +##摧 +##摩 +##摯 +##摳 +##摸 +##摹 +##摺 +##摻 +##撂 +##撃 +##撅 +##撇 +##撈 +##撐 +##撑 +##撒 +##撓 +##撕 +##撚 +##撞 +##撤 +##撥 +##撩 +##撫 +##撬 +##播 +##撮 +##撰 +##撲 +##撵 +##撷 +##撸 +##撻 +##撼 +##撿 +##擀 +##擁 +##擂 +##擄 +##擅 +##擇 +##擊 +##擋 +##操 +##擎 +##擒 +##擔 +##擘 +##據 +##擞 +##擠 +##擡 +##擢 +##擦 +##擬 +##擰 +##擱 +##擲 +##擴 +##擷 +##擺 +##擼 +##擾 +##攀 +##攏 +##攒 +##攔 +##攘 +##攙 +##攜 +##攝 +##攞 +##攢 +##攣 +##攤 +##攥 +##攪 +##攫 +##攬 +##支 +##收 +##攸 +##改 +##攻 +##放 +##政 +##故 +##效 +##敌 +##敍 +##敎 +##敏 +##救 +##敕 +##敖 +##敗 +##敘 +##教 +##敛 +##敝 +##敞 +##敢 +##散 +##敦 +##敬 +##数 +##敲 +##整 +##敵 +##敷 +##數 +##斂 +##斃 +##文 +##斋 +##斌 +##斎 +##斐 +##斑 +##斓 +##斗 +##料 +##斛 +##斜 +##斟 +##斡 +##斤 +##斥 +##斧 +##斩 +##斫 +##斬 +##断 +##斯 +##新 +##斷 +##方 +##於 +##施 +##旁 +##旃 +##旅 +##旋 +##旌 +##旎 +##族 +##旖 +##旗 +##无 +##既 +##日 +##旦 +##旧 +##旨 +##早 +##旬 +##旭 +##旮 +##旱 +##时 +##旷 +##旺 +##旻 +##昀 +##昂 +##昆 +##昇 +##昉 +##昊 +##昌 +##明 +##昏 +##易 +##昔 +##昕 +##昙 +##星 +##映 +##春 +##昧 +##昨 +##昭 +##是 +##昱 +##昴 +##昵 +##昶 +##昼 +##显 +##晁 +##時 +##晃 +##晉 +##晋 +##晌 +##晏 +##晒 +##晓 +##晔 +##晕 +##晖 +##晗 +##晚 +##晝 +##晞 +##晟 +##晤 +##晦 +##晨 +##晩 +##普 +##景 +##晰 +##晴 +##晶 +##晷 +##智 +##晾 +##暂 +##暄 +##暇 +##暈 +##暉 +##暌 +##暐 +##暑 +##暖 +##暗 +##暝 +##暢 +##暧 +##暨 +##暫 +##暮 +##暱 +##暴 +##暸 +##暹 +##曄 +##曆 +##曇 +##曉 +##曖 +##曙 +##曜 +##曝 +##曠 +##曦 +##曬 +##曰 +##曲 +##曳 +##更 +##書 +##曹 +##曼 +##曾 +##替 +##最 +##會 +##月 +##有 +##朋 +##服 +##朐 +##朔 +##朕 +##朗 +##望 +##朝 +##期 +##朦 +##朧 +##木 +##未 +##末 +##本 +##札 +##朮 +##术 +##朱 +##朴 +##朵 +##机 +##朽 +##杀 +##杂 +##权 +##杆 +##杈 +##杉 +##李 +##杏 +##材 +##村 +##杓 +##杖 +##杜 +##杞 +##束 +##杠 +##条 +##来 +##杨 +##杭 +##杯 +##杰 +##東 +##杳 +##杵 +##杷 +##杼 +##松 +##板 +##极 +##构 +##枇 +##枉 +##枋 +##析 +##枕 +##林 +##枚 +##果 +##枝 +##枢 +##枣 +##枪 +##枫 +##枭 +##枯 +##枰 +##枱 +##枳 +##架 +##枷 +##枸 +##柄 +##柏 +##某 +##柑 +##柒 +##染 +##柔 +##柘 +##柚 +##柜 +##柞 +##柠 +##柢 +##查 +##柩 +##柬 +##柯 +##柱 +##柳 +##柴 +##柵 +##査 +##柿 +##栀 +##栃 +##栄 +##栅 +##标 +##栈 +##栉 +##栋 +##栎 +##栏 +##树 +##栓 +##栖 +##栗 +##校 +##栩 +##株 +##样 +##核 +##根 +##格 +##栽 +##栾 +##桀 +##桁 +##桂 +##桃 +##桅 +##框 +##案 +##桉 +##桌 +##桎 +##桐 +##桑 +##桓 +##桔 +##桜 +##桠 +##桡 +##桢 +##档 +##桥 +##桦 +##桧 +##桨 +##桩 +##桶 +##桿 +##梁 +##梅 +##梆 +##梏 +##梓 +##梗 +##條 +##梟 +##梢 +##梦 +##梧 +##梨 +##梭 +##梯 +##械 +##梳 +##梵 +##梶 +##检 +##棂 +##棄 +##棉 +##棋 +##棍 +##棒 +##棕 +##棗 +##棘 +##棚 +##棟 +##棠 +##棣 +##棧 +##森 +##棱 +##棲 +##棵 +##棹 +##棺 +##椁 +##椅 +##椋 +##植 +##椎 +##椒 +##検 +##椪 +##椭 +##椰 +##椹 +##椽 +##椿 +##楂 +##楊 +##楓 +##楔 +##楚 +##楝 +##楞 +##楠 +##楣 +##楨 +##楫 +##業 +##楮 +##極 +##楷 +##楸 +##楹 +##楼 +##楽 +##概 +##榄 +##榆 +##榈 +##榉 +##榔 +##榕 +##榖 +##榛 +##榜 +##榨 +##榫 +##榭 +##榮 +##榱 +##榴 +##榷 +##榻 +##槁 +##槃 +##構 +##槌 +##槍 +##槎 +##槐 +##槓 +##様 +##槛 +##槟 +##槤 +##槭 +##槲 +##槳 +##槻 +##槽 +##槿 +##樁 +##樂 +##樊 +##樑 +##樓 +##標 +##樞 +##樟 +##模 +##樣 +##権 +##横 +##樫 +##樯 +##樱 +##樵 +##樸 +##樹 +##樺 +##樽 +##樾 +##橄 +##橇 +##橋 +##橐 +##橘 +##橙 +##機 +##橡 +##橢 +##橫 +##橱 +##橹 +##橼 +##檀 +##檄 +##檎 +##檐 +##檔 +##檗 +##檜 +##檢 +##檬 +##檯 +##檳 +##檸 +##檻 +##櫃 +##櫚 +##櫛 +##櫥 +##櫸 +##櫻 +##欄 +##權 +##欒 +##欖 +##欠 +##次 +##欢 +##欣 +##欧 +##欲 +##欸 +##欺 +##欽 +##款 +##歆 +##歇 +##歉 +##歌 +##歎 +##歐 +##歓 +##歙 +##歛 +##歡 +##止 +##正 +##此 +##步 +##武 +##歧 +##歩 +##歪 +##歯 +##歲 +##歳 +##歴 +##歷 +##歸 +##歹 +##死 +##歼 +##殁 +##殃 +##殆 +##殇 +##殉 +##殊 +##残 +##殒 +##殓 +##殖 +##殘 +##殞 +##殡 +##殤 +##殭 +##殯 +##殲 +##殴 +##段 +##殷 +##殺 +##殼 +##殿 +##毀 +##毁 +##毂 +##毅 +##毆 +##毋 +##母 +##毎 +##每 +##毒 +##毓 +##比 +##毕 +##毗 +##毘 +##毙 +##毛 +##毡 +##毫 +##毯 +##毽 +##氈 +##氏 +##氐 +##民 +##氓 +##气 +##氖 +##気 +##氙 +##氛 +##氟 +##氡 +##氢 +##氣 +##氤 +##氦 +##氧 +##氨 +##氪 +##氫 +##氮 +##氯 +##氰 +##氲 +##水 +##氷 +##永 +##氹 +##氾 +##汀 +##汁 +##求 +##汆 +##汇 +##汉 +##汎 +##汐 +##汕 +##汗 +##汙 +##汛 +##汝 +##汞 +##江 +##池 +##污 +##汤 +##汨 +##汩 +##汪 +##汰 +##汲 +##汴 +##汶 +##汹 +##決 +##汽 +##汾 +##沁 +##沂 +##沃 +##沅 +##沈 +##沉 +##沌 +##沏 +##沐 +##沒 +##沓 +##沖 +##沙 +##沛 +##沟 +##没 +##沢 +##沣 +##沥 +##沦 +##沧 +##沪 +##沫 +##沭 +##沮 +##沱 +##河 +##沸 +##油 +##治 +##沼 +##沽 +##沾 +##沿 +##況 +##泄 +##泉 +##泊 +##泌 +##泓 +##法 +##泗 +##泛 +##泞 +##泠 +##泡 +##波 +##泣 +##泥 +##注 +##泪 +##泫 +##泮 +##泯 +##泰 +##泱 +##泳 +##泵 +##泷 +##泸 +##泻 +##泼 +##泽 +##泾 +##洁 +##洄 +##洋 +##洒 +##洗 +##洙 +##洛 +##洞 +##津 +##洩 +##洪 +##洮 +##洱 +##洲 +##洵 +##洶 +##洸 +##洹 +##活 +##洼 +##洽 +##派 +##流 +##浃 +##浄 +##浅 +##浆 +##浇 +##浊 +##测 +##济 +##浏 +##浑 +##浒 +##浓 +##浔 +##浙 +##浚 +##浜 +##浣 +##浦 +##浩 +##浪 +##浬 +##浮 +##浯 +##浴 +##海 +##浸 +##涂 +##涅 +##涇 +##消 +##涉 +##涌 +##涎 +##涓 +##涔 +##涕 +##涙 +##涛 +##涝 +##涞 +##涟 +##涠 +##涡 +##涣 +##涤 +##润 +##涧 +##涨 +##涩 +##涪 +##涮 +##涯 +##液 +##涵 +##涸 +##涼 +##涿 +##淀 +##淄 +##淅 +##淆 +##淇 +##淋 +##淌 +##淑 +##淒 +##淖 +##淘 +##淙 +##淚 +##淞 +##淡 +##淤 +##淦 +##淨 +##淩 +##淪 +##淫 +##淬 +##淮 +##深 +##淳 +##淵 +##混 +##淹 +##淺 +##添 +##淼 +##清 +##済 +##渉 +##渊 +##渋 +##渍 +##渎 +##渐 +##渔 +##渗 +##渙 +##渚 +##減 +##渝 +##渠 +##渡 +##渣 +##渤 +##渥 +##渦 +##温 +##測 +##渭 +##港 +##渲 +##渴 +##游 +##渺 +##渾 +##湃 +##湄 +##湊 +##湍 +##湖 +##湘 +##湛 +##湟 +##湧 +##湫 +##湮 +##湯 +##湳 +##湾 +##湿 +##満 +##溃 +##溅 +##溉 +##溏 +##源 +##準 +##溜 +##溝 +##溟 +##溢 +##溥 +##溧 +##溪 +##溫 +##溯 +##溱 +##溴 +##溶 +##溺 +##溼 +##滁 +##滂 +##滄 +##滅 +##滇 +##滋 +##滌 +##滑 +##滓 +##滔 +##滕 +##滙 +##滚 +##滝 +##滞 +##滟 +##满 +##滢 +##滤 +##滥 +##滦 +##滨 +##滩 +##滬 +##滯 +##滲 +##滴 +##滷 +##滸 +##滾 +##滿 +##漁 +##漂 +##漆 +##漉 +##漏 +##漓 +##演 +##漕 +##漠 +##漢 +##漣 +##漩 +##漪 +##漫 +##漬 +##漯 +##漱 +##漲 +##漳 +##漸 +##漾 +##漿 +##潆 +##潇 +##潋 +##潍 +##潑 +##潔 +##潘 +##潛 +##潜 +##潞 +##潟 +##潢 +##潤 +##潦 +##潧 +##潭 +##潮 +##潰 +##潴 +##潸 +##潺 +##潼 +##澀 +##澄 +##澆 +##澈 +##澍 +##澎 +##澗 +##澜 +##澡 +##澤 +##澧 +##澱 +##澳 +##澹 +##激 +##濁 +##濂 +##濃 +##濑 +##濒 +##濕 +##濘 +##濛 +##濟 +##濠 +##濡 +##濤 +##濫 +##濬 +##濮 +##濯 +##濱 +##濺 +##濾 +##瀅 +##瀆 +##瀉 +##瀋 +##瀏 +##瀑 +##瀕 +##瀘 +##瀚 +##瀛 +##瀝 +##瀞 +##瀟 +##瀧 +##瀨 +##瀬 +##瀰 +##瀾 +##灌 +##灏 +##灑 +##灘 +##灝 +##灞 +##灣 +##火 +##灬 +##灭 +##灯 +##灰 +##灵 +##灶 +##灸 +##灼 +##災 +##灾 +##灿 +##炀 +##炁 +##炅 +##炉 +##炊 +##炎 +##炒 +##炔 +##炕 +##炖 +##炙 +##炜 +##炫 +##炬 +##炭 +##炮 +##炯 +##炳 +##炷 +##炸 +##点 +##為 +##炼 +##炽 +##烁 +##烂 +##烃 +##烈 +##烊 +##烏 +##烘 +##烙 +##烛 +##烟 +##烤 +##烦 +##烧 +##烨 +##烩 +##烫 +##烬 +##热 +##烯 +##烷 +##烹 +##烽 +##焉 +##焊 +##焕 +##焖 +##焗 +##焘 +##焙 +##焚 +##焜 +##無 +##焦 +##焯 +##焰 +##焱 +##然 +##焼 +##煅 +##煉 +##煊 +##煌 +##煎 +##煒 +##煖 +##煙 +##煜 +##煞 +##煤 +##煥 +##煦 +##照 +##煨 +##煩 +##煮 +##煲 +##煸 +##煽 +##熄 +##熊 +##熏 +##熒 +##熔 +##熙 +##熟 +##熠 +##熨 +##熬 +##熱 +##熵 +##熹 +##熾 +##燁 +##燃 +##燄 +##燈 +##燉 +##燊 +##燎 +##燒 +##燔 +##燕 +##燙 +##燜 +##營 +##燥 +##燦 +##燧 +##燭 +##燮 +##燴 +##燻 +##燼 +##燿 +##爆 +##爍 +##爐 +##爛 +##爪 +##爬 +##爭 +##爰 +##爱 +##爲 +##爵 +##父 +##爷 +##爸 +##爹 +##爺 +##爻 +##爽 +##爾 +##牆 +##片 +##版 +##牌 +##牍 +##牒 +##牙 +##牛 +##牝 +##牟 +##牠 +##牡 +##牢 +##牦 +##牧 +##物 +##牯 +##牲 +##牴 +##牵 +##特 +##牺 +##牽 +##犀 +##犁 +##犄 +##犊 +##犍 +##犒 +##犢 +##犧 +##犬 +##犯 +##状 +##犷 +##犸 +##犹 +##狀 +##狂 +##狄 +##狈 +##狎 +##狐 +##狒 +##狗 +##狙 +##狞 +##狠 +##狡 +##狩 +##独 +##狭 +##狮 +##狰 +##狱 +##狸 +##狹 +##狼 +##狽 +##猎 +##猕 +##猖 +##猗 +##猙 +##猛 +##猜 +##猝 +##猥 +##猩 +##猪 +##猫 +##猬 +##献 +##猴 +##猶 +##猷 +##猾 +##猿 +##獄 +##獅 +##獎 +##獐 +##獒 +##獗 +##獠 +##獣 +##獨 +##獭 +##獰 +##獲 +##獵 +##獷 +##獸 +##獺 +##獻 +##獼 +##獾 +##玄 +##率 +##玉 +##王 +##玑 +##玖 +##玛 +##玟 +##玠 +##玥 +##玩 +##玫 +##玮 +##环 +##现 +##玲 +##玳 +##玷 +##玺 +##玻 +##珀 +##珂 +##珅 +##珈 +##珉 +##珊 +##珍 +##珏 +##珐 +##珑 +##珙 +##珞 +##珠 +##珣 +##珥 +##珩 +##珪 +##班 +##珮 +##珲 +##珺 +##現 +##球 +##琅 +##理 +##琇 +##琉 +##琊 +##琍 +##琏 +##琐 +##琛 +##琢 +##琥 +##琦 +##琨 +##琪 +##琬 +##琮 +##琰 +##琲 +##琳 +##琴 +##琵 +##琶 +##琺 +##琼 +##瑀 +##瑁 +##瑄 +##瑋 +##瑕 +##瑗 +##瑙 +##瑚 +##瑛 +##瑜 +##瑞 +##瑟 +##瑠 +##瑣 +##瑤 +##瑩 +##瑪 +##瑯 +##瑰 +##瑶 +##瑾 +##璀 +##璁 +##璃 +##璇 +##璉 +##璋 +##璎 +##璐 +##璜 +##璞 +##璟 +##璧 +##璨 +##環 +##璽 +##璿 +##瓊 +##瓏 +##瓒 +##瓜 +##瓢 +##瓣 +##瓤 +##瓦 +##瓮 +##瓯 +##瓴 +##瓶 +##瓷 +##甄 +##甌 +##甕 +##甘 +##甙 +##甚 +##甜 +##生 +##產 +##産 +##甥 +##甦 +##用 +##甩 +##甫 +##甬 +##甭 +##甯 +##田 +##由 +##甲 +##申 +##电 +##男 +##甸 +##町 +##画 +##甾 +##畀 +##畅 +##界 +##畏 +##畑 +##畔 +##留 +##畜 +##畝 +##畢 +##略 +##畦 +##番 +##畫 +##異 +##畲 +##畳 +##畴 +##當 +##畸 +##畹 +##畿 +##疆 +##疇 +##疊 +##疏 +##疑 +##疔 +##疖 +##疗 +##疙 +##疚 +##疝 +##疟 +##疡 +##疣 +##疤 +##疥 +##疫 +##疮 +##疯 +##疱 +##疲 +##疳 +##疵 +##疸 +##疹 +##疼 +##疽 +##疾 +##痂 +##病 +##症 +##痈 +##痉 +##痊 +##痍 +##痒 +##痔 +##痕 +##痘 +##痙 +##痛 +##痞 +##痠 +##痢 +##痣 +##痤 +##痧 +##痨 +##痪 +##痫 +##痰 +##痱 +##痴 +##痹 +##痺 +##痼 +##痿 +##瘀 +##瘁 +##瘋 +##瘍 +##瘓 +##瘘 +##瘙 +##瘟 +##瘠 +##瘡 +##瘢 +##瘤 +##瘦 +##瘧 +##瘩 +##瘪 +##瘫 +##瘴 +##瘸 +##瘾 +##療 +##癇 +##癌 +##癒 +##癖 +##癜 +##癞 +##癡 +##癢 +##癣 +##癥 +##癫 +##癬 +##癮 +##癱 +##癲 +##癸 +##発 +##登 +##發 +##白 +##百 +##皂 +##的 +##皆 +##皇 +##皈 +##皋 +##皎 +##皑 +##皓 +##皖 +##皙 +##皚 +##皮 +##皰 +##皱 +##皴 +##皺 +##皿 +##盂 +##盃 +##盅 +##盆 +##盈 +##益 +##盎 +##盏 +##盐 +##监 +##盒 +##盔 +##盖 +##盗 +##盘 +##盛 +##盜 +##盞 +##盟 +##盡 +##監 +##盤 +##盥 +##盧 +##盪 +##目 +##盯 +##盱 +##盲 +##直 +##相 +##盹 +##盼 +##盾 +##省 +##眈 +##眉 +##看 +##県 +##眙 +##眞 +##真 +##眠 +##眦 +##眨 +##眩 +##眯 +##眶 +##眷 +##眸 +##眺 +##眼 +##眾 +##着 +##睁 +##睇 +##睏 +##睐 +##睑 +##睛 +##睜 +##睞 +##睡 +##睢 +##督 +##睥 +##睦 +##睨 +##睪 +##睫 +##睬 +##睹 +##睽 +##睾 +##睿 +##瞄 +##瞅 +##瞇 +##瞋 +##瞌 +##瞎 +##瞑 +##瞒 +##瞓 +##瞞 +##瞟 +##瞠 +##瞥 +##瞧 +##瞩 +##瞪 +##瞬 +##瞭 +##瞰 +##瞳 +##瞻 +##瞼 +##瞿 +##矇 +##矍 +##矗 +##矚 +##矛 +##矜 +##矢 +##矣 +##知 +##矩 +##矫 +##短 +##矮 +##矯 +##石 +##矶 +##矽 +##矾 +##矿 +##码 +##砂 +##砌 +##砍 +##砒 +##研 +##砖 +##砗 +##砚 +##砝 +##砣 +##砥 +##砧 +##砭 +##砰 +##砲 +##破 +##砷 +##砸 +##砺 +##砼 +##砾 +##础 +##硅 +##硐 +##硒 +##硕 +##硝 +##硫 +##硬 +##确 +##硯 +##硼 +##碁 +##碇 +##碉 +##碌 +##碍 +##碎 +##碑 +##碓 +##碗 +##碘 +##碚 +##碛 +##碟 +##碣 +##碧 +##碩 +##碰 +##碱 +##碳 +##碴 +##確 +##碼 +##碾 +##磁 +##磅 +##磊 +##磋 +##磐 +##磕 +##磚 +##磡 +##磨 +##磬 +##磯 +##磲 +##磷 +##磺 +##礁 +##礎 +##礙 +##礡 +##礦 +##礪 +##礫 +##礴 +##示 +##礼 +##社 +##祀 +##祁 +##祂 +##祇 +##祈 +##祉 +##祎 +##祐 +##祕 +##祖 +##祗 +##祚 +##祛 +##祜 +##祝 +##神 +##祟 +##祠 +##祢 +##祥 +##票 +##祭 +##祯 +##祷 +##祸 +##祺 +##祿 +##禀 +##禁 +##禄 +##禅 +##禍 +##禎 +##福 +##禛 +##禦 +##禧 +##禪 +##禮 +##禱 +##禹 +##禺 +##离 +##禽 +##禾 +##禿 +##秀 +##私 +##秃 +##秆 +##秉 +##秋 +##种 +##科 +##秒 +##秘 +##租 +##秣 +##秤 +##秦 +##秧 +##秩 +##秭 +##积 +##称 +##秸 +##移 +##秽 +##稀 +##稅 +##程 +##稍 +##税 +##稔 +##稗 +##稚 +##稜 +##稞 +##稟 +##稠 +##稣 +##種 +##稱 +##稲 +##稳 +##稷 +##稹 +##稻 +##稼 +##稽 +##稿 +##穀 +##穂 +##穆 +##穌 +##積 +##穎 +##穗 +##穢 +##穩 +##穫 +##穴 +##究 +##穷 +##穹 +##空 +##穿 +##突 +##窃 +##窄 +##窈 +##窍 +##窑 +##窒 +##窓 +##窕 +##窖 +##窗 +##窘 +##窜 +##窝 +##窟 +##窠 +##窥 +##窦 +##窨 +##窩 +##窪 +##窮 +##窯 +##窺 +##窿 +##竄 +##竅 +##竇 +##竊 +##立 +##竖 +##站 +##竜 +##竞 +##竟 +##章 +##竣 +##童 +##竭 +##端 +##競 +##竹 +##竺 +##竽 +##竿 +##笃 +##笆 +##笈 +##笋 +##笏 +##笑 +##笔 +##笙 +##笛 +##笞 +##笠 +##符 +##笨 +##第 +##笹 +##笺 +##笼 +##筆 +##等 +##筊 +##筋 +##筍 +##筏 +##筐 +##筑 +##筒 +##答 +##策 +##筛 +##筝 +##筠 +##筱 +##筲 +##筵 +##筷 +##筹 +##签 +##简 +##箇 +##箋 +##箍 +##箏 +##箐 +##箔 +##箕 +##算 +##箝 +##管 +##箩 +##箫 +##箭 +##箱 +##箴 +##箸 +##節 +##篁 +##範 +##篆 +##篇 +##築 +##篑 +##篓 +##篙 +##篝 +##篠 +##篡 +##篤 +##篩 +##篪 +##篮 +##篱 +##篷 +##簇 +##簌 +##簍 +##簡 +##簦 +##簧 +##簪 +##簫 +##簷 +##簸 +##簽 +##簾 +##簿 +##籁 +##籃 +##籌 +##籍 +##籐 +##籟 +##籠 +##籤 +##籬 +##籮 +##籲 +##米 +##类 +##籼 +##籽 +##粄 +##粉 +##粑 +##粒 +##粕 +##粗 +##粘 +##粟 +##粤 +##粥 +##粧 +##粪 +##粮 +##粱 +##粲 +##粳 +##粵 +##粹 +##粼 +##粽 +##精 +##粿 +##糅 +##糊 +##糍 +##糕 +##糖 +##糗 +##糙 +##糜 +##糞 +##糟 +##糠 +##糧 +##糬 +##糯 +##糰 +##糸 +##系 +##糾 +##紀 +##紂 +##約 +##紅 +##紉 +##紊 +##紋 +##納 +##紐 +##紓 +##純 +##紗 +##紘 +##紙 +##級 +##紛 +##紜 +##素 +##紡 +##索 +##紧 +##紫 +##紮 +##累 +##細 +##紳 +##紹 +##紺 +##終 +##絃 +##組 +##絆 +##経 +##結 +##絕 +##絞 +##絡 +##絢 +##給 +##絨 +##絮 +##統 +##絲 +##絳 +##絵 +##絶 +##絹 +##綁 +##綏 +##綑 +##經 +##継 +##続 +##綜 +##綠 +##綢 +##綦 +##綫 +##綬 +##維 +##綱 +##網 +##綴 +##綵 +##綸 +##綺 +##綻 +##綽 +##綾 +##綿 +##緊 +##緋 +##総 +##緑 +##緒 +##緘 +##線 +##緝 +##緞 +##締 +##緣 +##編 +##緩 +##緬 +##緯 +##練 +##緹 +##緻 +##縁 +##縄 +##縈 +##縛 +##縝 +##縣 +##縫 +##縮 +##縱 +##縴 +##縷 +##總 +##績 +##繁 +##繃 +##繆 +##繇 +##繋 +##織 +##繕 +##繚 +##繞 +##繡 +##繩 +##繪 +##繫 +##繭 +##繳 +##繹 +##繼 +##繽 +##纂 +##續 +##纍 +##纏 +##纓 +##纔 +##纖 +##纜 +##纠 +##红 +##纣 +##纤 +##约 +##级 +##纨 +##纪 +##纫 +##纬 +##纭 +##纯 +##纰 +##纱 +##纲 +##纳 +##纵 +##纶 +##纷 +##纸 +##纹 +##纺 +##纽 +##纾 +##线 +##绀 +##练 +##组 +##绅 +##细 +##织 +##终 +##绊 +##绍 +##绎 +##经 +##绑 +##绒 +##结 +##绔 +##绕 +##绘 +##给 +##绚 +##绛 +##络 +##绝 +##绞 +##统 +##绡 +##绢 +##绣 +##绥 +##绦 +##继 +##绩 +##绪 +##绫 +##续 +##绮 +##绯 +##绰 +##绳 +##维 +##绵 +##绶 +##绷 +##绸 +##绻 +##综 +##绽 +##绾 +##绿 +##缀 +##缄 +##缅 +##缆 +##缇 +##缈 +##缉 +##缎 +##缓 +##缔 +##缕 +##编 +##缘 +##缙 +##缚 +##缜 +##缝 +##缠 +##缢 +##缤 +##缥 +##缨 +##缩 +##缪 +##缭 +##缮 +##缰 +##缱 +##缴 +##缸 +##缺 +##缽 +##罂 +##罄 +##罌 +##罐 +##网 +##罔 +##罕 +##罗 +##罚 +##罡 +##罢 +##罩 +##罪 +##置 +##罰 +##署 +##罵 +##罷 +##罹 +##羁 +##羅 +##羈 +##羊 +##羌 +##美 +##羔 +##羚 +##羞 +##羟 +##羡 +##羣 +##群 +##羥 +##羧 +##羨 +##義 +##羯 +##羲 +##羸 +##羹 +##羽 +##羿 +##翁 +##翅 +##翊 +##翌 +##翎 +##習 +##翔 +##翘 +##翟 +##翠 +##翡 +##翦 +##翩 +##翰 +##翱 +##翳 +##翹 +##翻 +##翼 +##耀 +##老 +##考 +##耄 +##者 +##耆 +##耋 +##而 +##耍 +##耐 +##耒 +##耕 +##耗 +##耘 +##耙 +##耦 +##耨 +##耳 +##耶 +##耷 +##耸 +##耻 +##耽 +##耿 +##聂 +##聆 +##聊 +##聋 +##职 +##聒 +##联 +##聖 +##聘 +##聚 +##聞 +##聪 +##聯 +##聰 +##聲 +##聳 +##聴 +##聶 +##職 +##聽 +##聾 +##聿 +##肃 +##肄 +##肅 +##肆 +##肇 +##肉 +##肋 +##肌 +##肏 +##肓 +##肖 +##肘 +##肚 +##肛 +##肝 +##肠 +##股 +##肢 +##肤 +##肥 +##肩 +##肪 +##肮 +##肯 +##肱 +##育 +##肴 +##肺 +##肽 +##肾 +##肿 +##胀 +##胁 +##胃 +##胄 +##胆 +##背 +##胍 +##胎 +##胖 +##胚 +##胛 +##胜 +##胝 +##胞 +##胡 +##胤 +##胥 +##胧 +##胫 +##胭 +##胯 +##胰 +##胱 +##胳 +##胴 +##胶 +##胸 +##胺 +##能 +##脂 +##脅 +##脆 +##脇 +##脈 +##脉 +##脊 +##脍 +##脏 +##脐 +##脑 +##脓 +##脖 +##脘 +##脚 +##脛 +##脣 +##脩 +##脫 +##脯 +##脱 +##脲 +##脳 +##脸 +##脹 +##脾 +##腆 +##腈 +##腊 +##腋 +##腌 +##腎 +##腐 +##腑 +##腓 +##腔 +##腕 +##腥 +##腦 +##腩 +##腫 +##腭 +##腮 +##腰 +##腱 +##腳 +##腴 +##腸 +##腹 +##腺 +##腻 +##腼 +##腾 +##腿 +##膀 +##膈 +##膊 +##膏 +##膑 +##膘 +##膚 +##膛 +##膜 +##膝 +##膠 +##膦 +##膨 +##膩 +##膳 +##膺 +##膻 +##膽 +##膾 +##膿 +##臀 +##臂 +##臃 +##臆 +##臉 +##臊 +##臍 +##臓 +##臘 +##臟 +##臣 +##臥 +##臧 +##臨 +##自 +##臬 +##臭 +##至 +##致 +##臺 +##臻 +##臼 +##臾 +##舀 +##舂 +##舅 +##舆 +##與 +##興 +##舉 +##舊 +##舌 +##舍 +##舎 +##舐 +##舒 +##舔 +##舖 +##舗 +##舛 +##舜 +##舞 +##舟 +##航 +##舫 +##般 +##舰 +##舱 +##舵 +##舶 +##舷 +##舸 +##船 +##舺 +##舾 +##艇 +##艋 +##艘 +##艙 +##艦 +##艮 +##良 +##艰 +##艱 +##色 +##艳 +##艷 +##艹 +##艺 +##艾 +##节 +##芃 +##芈 +##芊 +##芋 +##芍 +##芎 +##芒 +##芙 +##芜 +##芝 +##芡 +##芥 +##芦 +##芩 +##芪 +##芫 +##芬 +##芭 +##芮 +##芯 +##花 +##芳 +##芷 +##芸 +##芹 +##芻 +##芽 +##芾 +##苁 +##苄 +##苇 +##苋 +##苍 +##苏 +##苑 +##苒 +##苓 +##苔 +##苕 +##苗 +##苛 +##苜 +##苞 +##苟 +##苡 +##苣 +##若 +##苦 +##苫 +##苯 +##英 +##苷 +##苹 +##苻 +##茁 +##茂 +##范 +##茄 +##茅 +##茉 +##茎 +##茏 +##茗 +##茜 +##茧 +##茨 +##茫 +##茬 +##茭 +##茯 +##茱 +##茲 +##茴 +##茵 +##茶 +##茸 +##茹 +##茼 +##荀 +##荃 +##荆 +##草 +##荊 +##荏 +##荐 +##荒 +##荔 +##荖 +##荘 +##荚 +##荞 +##荟 +##荠 +##荡 +##荣 +##荤 +##荥 +##荧 +##荨 +##荪 +##荫 +##药 +##荳 +##荷 +##荸 +##荻 +##荼 +##荽 +##莅 +##莆 +##莉 +##莊 +##莎 +##莒 +##莓 +##莖 +##莘 +##莞 +##莠 +##莢 +##莧 +##莪 +##莫 +##莱 +##莲 +##莴 +##获 +##莹 +##莺 +##莽 +##莿 +##菀 +##菁 +##菅 +##菇 +##菈 +##菊 +##菌 +##菏 +##菓 +##菖 +##菘 +##菜 +##菟 +##菠 +##菡 +##菩 +##華 +##菱 +##菲 +##菸 +##菽 +##萁 +##萃 +##萄 +##萊 +##萋 +##萌 +##萍 +##萎 +##萘 +##萝 +##萤 +##营 +##萦 +##萧 +##萨 +##萩 +##萬 +##萱 +##萵 +##萸 +##萼 +##落 +##葆 +##葉 +##著 +##葚 +##葛 +##葡 +##董 +##葦 +##葩 +##葫 +##葬 +##葭 +##葯 +##葱 +##葳 +##葵 +##葷 +##葺 +##蒂 +##蒋 +##蒐 +##蒔 +##蒙 +##蒜 +##蒞 +##蒟 +##蒡 +##蒨 +##蒲 +##蒸 +##蒹 +##蒻 +##蒼 +##蒿 +##蓁 +##蓄 +##蓆 +##蓉 +##蓋 +##蓑 +##蓓 +##蓖 +##蓝 +##蓟 +##蓦 +##蓬 +##蓮 +##蓼 +##蓿 +##蔑 +##蔓 +##蔔 +##蔗 +##蔘 +##蔚 +##蔡 +##蔣 +##蔥 +##蔫 +##蔬 +##蔭 +##蔵 +##蔷 +##蔺 +##蔻 +##蔼 +##蔽 +##蕁 +##蕃 +##蕈 +##蕉 +##蕊 +##蕎 +##蕙 +##蕤 +##蕨 +##蕩 +##蕪 +##蕭 +##蕲 +##蕴 +##蕻 +##蕾 +##薄 +##薅 +##薇 +##薈 +##薊 +##薏 +##薑 +##薔 +##薙 +##薛 +##薦 +##薨 +##薩 +##薪 +##薬 +##薯 +##薰 +##薹 +##藉 +##藍 +##藏 +##藐 +##藓 +##藕 +##藜 +##藝 +##藤 +##藥 +##藩 +##藹 +##藻 +##藿 +##蘆 +##蘇 +##蘊 +##蘋 +##蘑 +##蘚 +##蘭 +##蘸 +##蘼 +##蘿 +##虎 +##虏 +##虐 +##虑 +##虔 +##處 +##虚 +##虛 +##虜 +##虞 +##號 +##虢 +##虧 +##虫 +##虬 +##虱 +##虹 +##虻 +##虽 +##虾 +##蚀 +##蚁 +##蚂 +##蚊 +##蚌 +##蚓 +##蚕 +##蚜 +##蚝 +##蚣 +##蚤 +##蚩 +##蚪 +##蚯 +##蚱 +##蚵 +##蛀 +##蛆 +##蛇 +##蛊 +##蛋 +##蛎 +##蛐 +##蛔 +##蛙 +##蛛 +##蛟 +##蛤 +##蛭 +##蛮 +##蛰 +##蛳 +##蛹 +##蛻 +##蛾 +##蜀 +##蜂 +##蜃 +##蜆 +##蜇 +##蜈 +##蜊 +##蜍 +##蜒 +##蜓 +##蜕 +##蜗 +##蜘 +##蜚 +##蜜 +##蜡 +##蜢 +##蜥 +##蜱 +##蜴 +##蜷 +##蜻 +##蜿 +##蝇 +##蝈 +##蝉 +##蝌 +##蝎 +##蝕 +##蝗 +##蝙 +##蝟 +##蝠 +##蝦 +##蝨 +##蝴 +##蝶 +##蝸 +##蝼 +##螂 +##螃 +##融 +##螞 +##螢 +##螨 +##螯 +##螳 +##螺 +##蟀 +##蟄 +##蟆 +##蟋 +##蟎 +##蟑 +##蟒 +##蟠 +##蟬 +##蟲 +##蟹 +##蟻 +##蟾 +##蠅 +##蠍 +##蠔 +##蠕 +##蠛 +##蠟 +##蠡 +##蠢 +##蠣 +##蠱 +##蠶 +##蠹 +##蠻 +##血 +##衄 +##衅 +##衆 +##行 +##衍 +##術 +##衔 +##街 +##衙 +##衛 +##衝 +##衞 +##衡 +##衢 +##衣 +##补 +##表 +##衩 +##衫 +##衬 +##衮 +##衰 +##衲 +##衷 +##衹 +##衾 +##衿 +##袁 +##袂 +##袄 +##袅 +##袈 +##袋 +##袍 +##袒 +##袖 +##袜 +##袞 +##袤 +##袪 +##被 +##袭 +##袱 +##裁 +##裂 +##装 +##裆 +##裊 +##裏 +##裔 +##裕 +##裘 +##裙 +##補 +##裝 +##裟 +##裡 +##裤 +##裨 +##裱 +##裳 +##裴 +##裸 +##裹 +##製 +##裾 +##褂 +##複 +##褐 +##褒 +##褓 +##褔 +##褚 +##褥 +##褪 +##褫 +##褲 +##褶 +##褻 +##襁 +##襄 +##襟 +##襠 +##襪 +##襬 +##襯 +##襲 +##西 +##要 +##覃 +##覆 +##覇 +##見 +##規 +##覓 +##視 +##覚 +##覦 +##覧 +##親 +##覬 +##観 +##覷 +##覺 +##覽 +##觀 +##见 +##观 +##规 +##觅 +##视 +##览 +##觉 +##觊 +##觎 +##觐 +##觑 +##角 +##觞 +##解 +##觥 +##触 +##觸 +##言 +##訂 +##計 +##訊 +##討 +##訓 +##訕 +##訖 +##託 +##記 +##訛 +##訝 +##訟 +##訣 +##訥 +##訪 +##設 +##許 +##訳 +##訴 +##訶 +##診 +##註 +##証 +##詆 +##詐 +##詔 +##評 +##詛 +##詞 +##詠 +##詡 +##詢 +##詣 +##試 +##詩 +##詫 +##詬 +##詭 +##詮 +##詰 +##話 +##該 +##詳 +##詹 +##詼 +##誅 +##誇 +##誉 +##誌 +##認 +##誓 +##誕 +##誘 +##語 +##誠 +##誡 +##誣 +##誤 +##誥 +##誦 +##誨 +##說 +##説 +##読 +##誰 +##課 +##誹 +##誼 +##調 +##諄 +##談 +##請 +##諏 +##諒 +##論 +##諗 +##諜 +##諡 +##諦 +##諧 +##諫 +##諭 +##諮 +##諱 +##諳 +##諷 +##諸 +##諺 +##諾 +##謀 +##謁 +##謂 +##謄 +##謊 +##謎 +##謐 +##謔 +##謗 +##謙 +##講 +##謝 +##謠 +##謨 +##謬 +##謹 +##謾 +##譁 +##證 +##譎 +##譏 +##識 +##譙 +##譚 +##譜 +##警 +##譬 +##譯 +##議 +##譲 +##譴 +##護 +##譽 +##讀 +##變 +##讓 +##讚 +##讞 +##计 +##订 +##认 +##讥 +##讧 +##讨 +##让 +##讪 +##讫 +##训 +##议 +##讯 +##记 +##讲 +##讳 +##讴 +##讶 +##讷 +##许 +##讹 +##论 +##讼 +##讽 +##设 +##访 +##诀 +##证 +##诃 +##评 +##诅 +##识 +##诈 +##诉 +##诊 +##诋 +##词 +##诏 +##译 +##试 +##诗 +##诘 +##诙 +##诚 +##诛 +##话 +##诞 +##诟 +##诠 +##诡 +##询 +##诣 +##诤 +##该 +##详 +##诧 +##诩 +##诫 +##诬 +##语 +##误 +##诰 +##诱 +##诲 +##说 +##诵 +##诶 +##请 +##诸 +##诺 +##读 +##诽 +##课 +##诿 +##谀 +##谁 +##调 +##谄 +##谅 +##谆 +##谈 +##谊 +##谋 +##谌 +##谍 +##谎 +##谏 +##谐 +##谑 +##谒 +##谓 +##谔 +##谕 +##谗 +##谘 +##谙 +##谚 +##谛 +##谜 +##谟 +##谢 +##谣 +##谤 +##谥 +##谦 +##谧 +##谨 +##谩 +##谪 +##谬 +##谭 +##谯 +##谱 +##谲 +##谴 +##谶 +##谷 +##豁 +##豆 +##豇 +##豈 +##豉 +##豊 +##豌 +##豎 +##豐 +##豔 +##豚 +##象 +##豢 +##豪 +##豫 +##豬 +##豹 +##豺 +##貂 +##貅 +##貌 +##貓 +##貔 +##貘 +##貝 +##貞 +##負 +##財 +##貢 +##貧 +##貨 +##販 +##貪 +##貫 +##責 +##貯 +##貰 +##貳 +##貴 +##貶 +##買 +##貸 +##費 +##貼 +##貽 +##貿 +##賀 +##賁 +##賂 +##賃 +##賄 +##資 +##賈 +##賊 +##賑 +##賓 +##賜 +##賞 +##賠 +##賡 +##賢 +##賣 +##賤 +##賦 +##質 +##賬 +##賭 +##賴 +##賺 +##購 +##賽 +##贅 +##贈 +##贊 +##贍 +##贏 +##贓 +##贖 +##贛 +##贝 +##贞 +##负 +##贡 +##财 +##责 +##贤 +##败 +##账 +##货 +##质 +##贩 +##贪 +##贫 +##贬 +##购 +##贮 +##贯 +##贰 +##贱 +##贲 +##贴 +##贵 +##贷 +##贸 +##费 +##贺 +##贻 +##贼 +##贾 +##贿 +##赁 +##赂 +##赃 +##资 +##赅 +##赈 +##赊 +##赋 +##赌 +##赎 +##赏 +##赐 +##赓 +##赔 +##赖 +##赘 +##赚 +##赛 +##赝 +##赞 +##赠 +##赡 +##赢 +##赣 +##赤 +##赦 +##赧 +##赫 +##赭 +##走 +##赳 +##赴 +##赵 +##赶 +##起 +##趁 +##超 +##越 +##趋 +##趕 +##趙 +##趟 +##趣 +##趨 +##足 +##趴 +##趵 +##趸 +##趺 +##趾 +##跃 +##跄 +##跆 +##跋 +##跌 +##跎 +##跑 +##跖 +##跚 +##跛 +##距 +##跟 +##跡 +##跤 +##跨 +##跩 +##跪 +##路 +##跳 +##践 +##跷 +##跹 +##跺 +##跻 +##踉 +##踊 +##踌 +##踏 +##踐 +##踝 +##踞 +##踟 +##踢 +##踩 +##踪 +##踮 +##踱 +##踴 +##踵 +##踹 +##蹂 +##蹄 +##蹇 +##蹈 +##蹉 +##蹊 +##蹋 +##蹑 +##蹒 +##蹙 +##蹟 +##蹣 +##蹤 +##蹦 +##蹩 +##蹬 +##蹭 +##蹲 +##蹴 +##蹶 +##蹺 +##蹼 +##蹿 +##躁 +##躇 +##躉 +##躊 +##躋 +##躍 +##躏 +##躪 +##身 +##躬 +##躯 +##躲 +##躺 +##軀 +##車 +##軋 +##軌 +##軍 +##軒 +##軟 +##転 +##軸 +##軼 +##軽 +##軾 +##較 +##載 +##輒 +##輓 +##輔 +##輕 +##輛 +##輝 +##輟 +##輩 +##輪 +##輯 +##輸 +##輻 +##輾 +##輿 +##轄 +##轅 +##轆 +##轉 +##轍 +##轎 +##轟 +##车 +##轧 +##轨 +##轩 +##转 +##轭 +##轮 +##软 +##轰 +##轲 +##轴 +##轶 +##轻 +##轼 +##载 +##轿 +##较 +##辄 +##辅 +##辆 +##辇 +##辈 +##辉 +##辊 +##辍 +##辐 +##辑 +##输 +##辕 +##辖 +##辗 +##辘 +##辙 +##辛 +##辜 +##辞 +##辟 +##辣 +##辦 +##辨 +##辩 +##辫 +##辭 +##辮 +##辯 +##辰 +##辱 +##農 +##边 +##辺 +##辻 +##込 +##辽 +##达 +##迁 +##迂 +##迄 +##迅 +##过 +##迈 +##迎 +##运 +##近 +##返 +##还 +##这 +##进 +##远 +##违 +##连 +##迟 +##迢 +##迤 +##迥 +##迦 +##迩 +##迪 +##迫 +##迭 +##述 +##迴 +##迷 +##迸 +##迹 +##迺 +##追 +##退 +##送 +##适 +##逃 +##逅 +##逆 +##选 +##逊 +##逍 +##透 +##逐 +##递 +##途 +##逕 +##逗 +##這 +##通 +##逛 +##逝 +##逞 +##速 +##造 +##逢 +##連 +##逮 +##週 +##進 +##逵 +##逶 +##逸 +##逻 +##逼 +##逾 +##遁 +##遂 +##遅 +##遇 +##遊 +##運 +##遍 +##過 +##遏 +##遐 +##遑 +##遒 +##道 +##達 +##違 +##遗 +##遙 +##遛 +##遜 +##遞 +##遠 +##遢 +##遣 +##遥 +##遨 +##適 +##遭 +##遮 +##遲 +##遴 +##遵 +##遶 +##遷 +##選 +##遺 +##遼 +##遽 +##避 +##邀 +##邁 +##邂 +##邃 +##還 +##邇 +##邈 +##邊 +##邋 +##邏 +##邑 +##邓 +##邕 +##邛 +##邝 +##邢 +##那 +##邦 +##邨 +##邪 +##邬 +##邮 +##邯 +##邰 +##邱 +##邳 +##邵 +##邸 +##邹 +##邺 +##邻 +##郁 +##郅 +##郊 +##郎 +##郑 +##郜 +##郝 +##郡 +##郢 +##郤 +##郦 +##郧 +##部 +##郫 +##郭 +##郴 +##郵 +##郷 +##郸 +##都 +##鄂 +##鄉 +##鄒 +##鄔 +##鄙 +##鄞 +##鄢 +##鄧 +##鄭 +##鄰 +##鄱 +##鄲 +##鄺 +##酉 +##酊 +##酋 +##酌 +##配 +##酐 +##酒 +##酗 +##酚 +##酝 +##酢 +##酣 +##酥 +##酩 +##酪 +##酬 +##酮 +##酯 +##酰 +##酱 +##酵 +##酶 +##酷 +##酸 +##酿 +##醃 +##醇 +##醉 +##醋 +##醍 +##醐 +##醒 +##醚 +##醛 +##醜 +##醞 +##醣 +##醪 +##醫 +##醬 +##醮 +##醯 +##醴 +##醺 +##釀 +##釁 +##采 +##釉 +##释 +##釋 +##里 +##重 +##野 +##量 +##釐 +##金 +##釗 +##釘 +##釜 +##針 +##釣 +##釦 +##釧 +##釵 +##鈀 +##鈉 +##鈍 +##鈎 +##鈔 +##鈕 +##鈞 +##鈣 +##鈦 +##鈪 +##鈴 +##鈺 +##鈾 +##鉀 +##鉄 +##鉅 +##鉉 +##鉑 +##鉗 +##鉚 +##鉛 +##鉤 +##鉴 +##鉻 +##銀 +##銃 +##銅 +##銑 +##銓 +##銖 +##銘 +##銜 +##銬 +##銭 +##銮 +##銳 +##銷 +##銹 +##鋁 +##鋅 +##鋒 +##鋤 +##鋪 +##鋰 +##鋸 +##鋼 +##錄 +##錐 +##錘 +##錚 +##錠 +##錢 +##錦 +##錨 +##錫 +##錮 +##錯 +##録 +##錳 +##錶 +##鍊 +##鍋 +##鍍 +##鍛 +##鍥 +##鍰 +##鍵 +##鍺 +##鍾 +##鎂 +##鎊 +##鎌 +##鎏 +##鎔 +##鎖 +##鎗 +##鎚 +##鎧 +##鎬 +##鎮 +##鎳 +##鏈 +##鏖 +##鏗 +##鏘 +##鏞 +##鏟 +##鏡 +##鏢 +##鏤 +##鏽 +##鐘 +##鐮 +##鐲 +##鐳 +##鐵 +##鐸 +##鐺 +##鑄 +##鑊 +##鑑 +##鑒 +##鑣 +##鑫 +##鑰 +##鑲 +##鑼 +##鑽 +##鑾 +##鑿 +##针 +##钉 +##钊 +##钎 +##钏 +##钒 +##钓 +##钗 +##钙 +##钛 +##钜 +##钝 +##钞 +##钟 +##钠 +##钡 +##钢 +##钣 +##钤 +##钥 +##钦 +##钧 +##钨 +##钩 +##钮 +##钯 +##钰 +##钱 +##钳 +##钴 +##钵 +##钺 +##钻 +##钼 +##钾 +##钿 +##铀 +##铁 +##铂 +##铃 +##铄 +##铅 +##铆 +##铉 +##铎 +##铐 +##铛 +##铜 +##铝 +##铠 +##铡 +##铢 +##铣 +##铤 +##铨 +##铩 +##铬 +##铭 +##铮 +##铰 +##铲 +##铵 +##银 +##铸 +##铺 +##链 +##铿 +##销 +##锁 +##锂 +##锄 +##锅 +##锆 +##锈 +##锉 +##锋 +##锌 +##锏 +##锐 +##锑 +##错 +##锚 +##锟 +##锡 +##锢 +##锣 +##锤 +##锥 +##锦 +##锭 +##键 +##锯 +##锰 +##锲 +##锵 +##锹 +##锺 +##锻 +##镀 +##镁 +##镂 +##镇 +##镉 +##镌 +##镍 +##镐 +##镑 +##镕 +##镖 +##镗 +##镛 +##镜 +##镣 +##镭 +##镯 +##镰 +##镳 +##镶 +##長 +##长 +##門 +##閃 +##閉 +##開 +##閎 +##閏 +##閑 +##閒 +##間 +##閔 +##閘 +##閡 +##関 +##閣 +##閥 +##閨 +##閩 +##閱 +##閲 +##閹 +##閻 +##閾 +##闆 +##闇 +##闊 +##闌 +##闍 +##闔 +##闕 +##闖 +##闘 +##關 +##闡 +##闢 +##门 +##闪 +##闫 +##闭 +##问 +##闯 +##闰 +##闲 +##间 +##闵 +##闷 +##闸 +##闹 +##闺 +##闻 +##闽 +##闾 +##阀 +##阁 +##阂 +##阅 +##阆 +##阇 +##阈 +##阉 +##阎 +##阐 +##阑 +##阔 +##阕 +##阖 +##阙 +##阚 +##阜 +##队 +##阡 +##阪 +##阮 +##阱 +##防 +##阳 +##阴 +##阵 +##阶 +##阻 +##阿 +##陀 +##陂 +##附 +##际 +##陆 +##陇 +##陈 +##陋 +##陌 +##降 +##限 +##陕 +##陛 +##陝 +##陞 +##陟 +##陡 +##院 +##陣 +##除 +##陨 +##险 +##陪 +##陰 +##陲 +##陳 +##陵 +##陶 +##陷 +##陸 +##険 +##陽 +##隅 +##隆 +##隈 +##隊 +##隋 +##隍 +##階 +##随 +##隐 +##隔 +##隕 +##隘 +##隙 +##際 +##障 +##隠 +##隣 +##隧 +##隨 +##險 +##隱 +##隴 +##隶 +##隸 +##隻 +##隼 +##隽 +##难 +##雀 +##雁 +##雄 +##雅 +##集 +##雇 +##雉 +##雋 +##雌 +##雍 +##雎 +##雏 +##雑 +##雒 +##雕 +##雖 +##雙 +##雛 +##雜 +##雞 +##離 +##難 +##雨 +##雪 +##雯 +##雰 +##雲 +##雳 +##零 +##雷 +##雹 +##電 +##雾 +##需 +##霁 +##霄 +##霆 +##震 +##霈 +##霉 +##霊 +##霍 +##霎 +##霏 +##霑 +##霓 +##霖 +##霜 +##霞 +##霧 +##霭 +##霰 +##露 +##霸 +##霹 +##霽 +##霾 +##靂 +##靄 +##靈 +##青 +##靓 +##靖 +##静 +##靚 +##靛 +##靜 +##非 +##靠 +##靡 +##面 +##靥 +##靦 +##革 +##靳 +##靴 +##靶 +##靼 +##鞅 +##鞋 +##鞍 +##鞏 +##鞑 +##鞘 +##鞠 +##鞣 +##鞦 +##鞭 +##韆 +##韋 +##韌 +##韓 +##韜 +##韦 +##韧 +##韩 +##韬 +##韭 +##音 +##韵 +##韶 +##韻 +##響 +##頁 +##頂 +##頃 +##項 +##順 +##須 +##頌 +##預 +##頑 +##頒 +##頓 +##頗 +##領 +##頜 +##頡 +##頤 +##頫 +##頭 +##頰 +##頷 +##頸 +##頹 +##頻 +##頼 +##顆 +##題 +##額 +##顎 +##顏 +##顔 +##願 +##顛 +##類 +##顧 +##顫 +##顯 +##顱 +##顴 +##页 +##顶 +##顷 +##项 +##顺 +##须 +##顼 +##顽 +##顾 +##顿 +##颁 +##颂 +##预 +##颅 +##领 +##颇 +##颈 +##颉 +##颊 +##颌 +##颍 +##颐 +##频 +##颓 +##颔 +##颖 +##颗 +##题 +##颚 +##颛 +##颜 +##额 +##颞 +##颠 +##颡 +##颢 +##颤 +##颦 +##颧 +##風 +##颯 +##颱 +##颳 +##颶 +##颼 +##飄 +##飆 +##风 +##飒 +##飓 +##飕 +##飘 +##飙 +##飚 +##飛 +##飞 +##食 +##飢 +##飨 +##飩 +##飪 +##飯 +##飲 +##飼 +##飽 +##飾 +##餃 +##餅 +##餉 +##養 +##餌 +##餐 +##餒 +##餓 +##餘 +##餚 +##餛 +##餞 +##餡 +##館 +##餮 +##餵 +##餾 +##饅 +##饈 +##饋 +##饌 +##饍 +##饑 +##饒 +##饕 +##饗 +##饞 +##饥 +##饨 +##饪 +##饬 +##饭 +##饮 +##饯 +##饰 +##饱 +##饲 +##饴 +##饵 +##饶 +##饷 +##饺 +##饼 +##饽 +##饿 +##馀 +##馁 +##馄 +##馅 +##馆 +##馈 +##馋 +##馍 +##馏 +##馒 +##馔 +##首 +##馗 +##香 +##馥 +##馨 +##馬 +##馭 +##馮 +##馳 +##馴 +##駁 +##駄 +##駅 +##駆 +##駐 +##駒 +##駕 +##駛 +##駝 +##駭 +##駱 +##駿 +##騁 +##騎 +##騏 +##験 +##騙 +##騨 +##騰 +##騷 +##驀 +##驅 +##驊 +##驍 +##驒 +##驕 +##驗 +##驚 +##驛 +##驟 +##驢 +##驥 +##马 +##驭 +##驮 +##驯 +##驰 +##驱 +##驳 +##驴 +##驶 +##驷 +##驸 +##驹 +##驻 +##驼 +##驾 +##驿 +##骁 +##骂 +##骄 +##骅 +##骆 +##骇 +##骈 +##骊 +##骋 +##验 +##骏 +##骐 +##骑 +##骗 +##骚 +##骛 +##骜 +##骞 +##骠 +##骡 +##骤 +##骥 +##骧 +##骨 +##骯 +##骰 +##骶 +##骷 +##骸 +##骼 +##髂 +##髅 +##髋 +##髏 +##髒 +##髓 +##體 +##髖 +##高 +##髦 +##髪 +##髮 +##髯 +##髻 +##鬃 +##鬆 +##鬍 +##鬓 +##鬚 +##鬟 +##鬢 +##鬣 +##鬥 +##鬧 +##鬱 +##鬼 +##魁 +##魂 +##魄 +##魅 +##魇 +##魍 +##魏 +##魔 +##魘 +##魚 +##魯 +##魷 +##鮑 +##鮨 +##鮪 +##鮭 +##鮮 +##鯉 +##鯊 +##鯖 +##鯛 +##鯨 +##鯰 +##鯽 +##鰍 +##鰓 +##鰭 +##鰲 +##鰻 +##鰾 +##鱈 +##鱉 +##鱔 +##鱗 +##鱷 +##鱸 +##鱼 +##鱿 +##鲁 +##鲈 +##鲍 +##鲑 +##鲛 +##鲜 +##鲟 +##鲢 +##鲤 +##鲨 +##鲫 +##鲱 +##鲲 +##鲶 +##鲷 +##鲸 +##鳃 +##鳄 +##鳅 +##鳌 +##鳍 +##鳕 +##鳖 +##鳗 +##鳝 +##鳞 +##鳥 +##鳩 +##鳳 +##鳴 +##鳶 +##鴉 +##鴕 +##鴛 +##鴦 +##鴨 +##鴻 +##鴿 +##鵑 +##鵜 +##鵝 +##鵡 +##鵬 +##鵰 +##鵲 +##鶘 +##鶩 +##鶯 +##鶴 +##鷗 +##鷲 +##鷹 +##鷺 +##鸚 +##鸞 +##鸟 +##鸠 +##鸡 +##鸢 +##鸣 +##鸥 +##鸦 +##鸨 +##鸪 +##鸭 +##鸯 +##鸳 +##鸵 +##鸽 +##鸾 +##鸿 +##鹂 +##鹃 +##鹄 +##鹅 +##鹈 +##鹉 +##鹊 +##鹌 +##鹏 +##鹑 +##鹕 +##鹘 +##鹜 +##鹞 +##鹤 +##鹦 +##鹧 +##鹫 +##鹭 +##鹰 +##鹳 +##鹵 +##鹹 +##鹼 +##鹽 +##鹿 +##麂 +##麋 +##麒 +##麓 +##麗 +##麝 +##麟 +##麥 +##麦 +##麩 +##麴 +##麵 +##麸 +##麺 +##麻 +##麼 +##麽 +##麾 +##黃 +##黄 +##黍 +##黎 +##黏 +##黑 +##黒 +##黔 +##默 +##黛 +##黜 +##黝 +##點 +##黠 +##黨 +##黯 +##黴 +##鼋 +##鼎 +##鼐 +##鼓 +##鼠 +##鼬 +##鼹 +##鼻 +##鼾 +##齁 +##齊 +##齋 +##齐 +##齒 +##齡 +##齢 +##齣 +##齦 +##齿 +##龄 +##龅 +##龈 +##龊 +##龋 +##龌 +##龍 +##龐 +##龔 +##龕 +##龙 +##龚 +##龛 +##龜 +##龟 +##︰ +##︱ +##︶ +##︿ +##﹁ +##﹂ +##﹍ +##﹏ +##﹐ +##﹑ +##﹒ +##﹔ +##﹕ +##﹖ +##﹗ +##﹙ +##﹚ +##﹝ +##﹞ +##﹡ +##﹣ +##! +##" +### +##$ +##% +##& +##' +##( +##) +##* +##, +##- +##. +##/ +##: +##; +##< +##? +##@ +##[ +##\ +##] +##^ +##_ +##` +##f +##h +##j +##u +##w +##z +##{ +##} +##。 +##「 +##」 +##、 +##・ +##ッ +##ー +##イ +##ク +##シ +##ス +##ト +##ノ +##フ +##ラ +##ル +##ン +##゙ +##゚ +## ̄ +##¥ +##👍 +##🔥 +##😂 +##😎 diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..73d48a2 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/config/npu_set_env.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +#toolkit env +#export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$utilDir +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +#nnae env +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/ +#export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:$utilDir +#export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:$utilDir + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$utilDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 +#export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=0 +export HCCL_CONNECT_TIMEOUT=600 + + +# system env +#ulimit -c unlimited diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/run.sh new file mode 100644 index 0000000..44a6a87 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/run.sh @@ -0,0 +1,67 @@ +#!/bin/bash +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_bert_base/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_bert_base/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] see more config info in ${currentDir}/config" +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] train result in ${train_job_dir}" + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +# user env +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=0 +export DEVICE_INDEX=$DEVICE_ID + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_bert.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $currtime $yamlPath 0 True ${toolsPath} ${rank_size} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_bert.log ${train_job_dir} + rank_id=0 + for device_id in ${device_group};do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ./main.log + ${currentDir}/scripts/train.sh $device_id $currtime $yamlPath $rank_id solo ${toolsPath} ${rank_size} & + let rank_id++ + done +fi +wait + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/train.sh new file mode 100644 index 0000000..9b39b78 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Base/tensorflow/scripts/train.sh @@ -0,0 +1,157 @@ +#!/bin/bash +# 0 $currtime $yamlPath 0 cluster ${toolsPath} +device_id=$1 +currtime=$2 +yamlPath=$3 +toolsPath=$6 +rank_size=$7 + + +export YAML_PATH=$3 + +mainDir=$(cd "$(dirname "$0")/.."; pwd) + +mkdir -p ${mainDir%train*}/train/result/tf_bert_base/training_job_${currtime}/ +export train_job_dir=${mainDir%train*}/train/result/tf_bert_base/training_job_${currtime}/ + + +#exec_path=${train_job_dir} + +cd ${train_job_dir} + +export utilDir=$(cd "$(dirname "$yamlPath")/../atlas_benchmark-master/utils"; pwd) +export utilDir=$(cd "$(dirname "$yamlPath")/../atlas_benchmark-master/utils/atlasboost"; pwd) +source ${mainDir}/config/npu_set_env.sh + + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# 声明变量 +export REMARK_LOG_FILE=hw_bert.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${mainDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +export JOB_ID=9999001 +export RANK_TABLE_FILE=${mainDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} + +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +export DEVICE_INDEX=$DEVICE_ID +export RANK_INDEX=0 + + +export PROFILING_OPTIONS=${PROFILING_OPTIONS} +export FP_POINT=${FP_POINT} +export BP_POINT=${BP_POINT} + +if [ ${PROFILING_MODE} == True ]; +then + export PROFILING_MODE=true +else + export PROFILING_MODE=false +fi + +if [ ${PROFILING_MODE} == True ]; +then + export AICPU_PROFILING_MODE=true +else + export AICPU_PROFILING_MODE=false +fi + + +if [ x"${device_id}" = x ] ; +then + echo "turing train fail" >> ${exec_path}/train_${device_id}.log + exit +else + export DEVICE_ID=${device_id} +fi + + +env > ${currentDir}/env_${device_id}.log + +cd ${train_job_dir} + +if [ x"$5" != x"True" ];then + rank_id=$4 + export RANK_ID=$4 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + #echo rank_id is $rank_id + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + #echo device_id is $device_id + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${mainDir}/config/${rank_size}p.json +fi +env > ${currentDir}/env_${device_id}.log +#mkdir exec path + + +mkdir -p ${train_job_dir}/${device_id}/ckpt${DEVICE_ID} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + +#start exec +python3.7 ${mainDir}/code/pretrain/run_pretraining.py \ + --bert_config_file=${mainDir}/config/${bert_config_file} \ + --max_seq_length=${max_seq_length} \ + --max_predictions_per_seq=${max_predictions_per_seq} \ + --train_batch_size=${train_batch_size} \ + --learning_rate=${learning_rate} \ + --num_warmup_steps=${num_warmup_steps} \ + --num_train_steps=${num_train_steps} \ + --optimizer_type=${optimizer_type} \ + --manual_fp16=${manual_fp16} \ + --use_fp16_cls=${use_fp16_cls} \ + --input_files_dir=${input_files_dir} \ + --eval_files_dir=${eval_files_dir} \ + --npu_bert_debug=${npu_bert_debug} \ + --npu_bert_use_tdt=${npu_bert_use_tdt} \ + --do_train=${do_train} \ + --do_eval=${do_eval} \ + --num_accumulation_steps=${num_accumulation_steps} \ + --npu_bert_job_start_file=None \ + --iterations_per_loop=${iterations_per_loop} \ + --npu_bert_loss_scale=${npu_bert_loss_scale} \ + --distributed=${distributed} \ + --save_checkpoints_steps=${save_checkpoints_steps} \ + --npu_bert_clip_by_global_norm=${npu_bert_clip_by_global_norm} \ + --output_dir=${train_job_dir}/${device_id}/ckpt${DEVICE_ID} > ${train_job_dir}/train_${device_id}.log 2>&1 + + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 bert train success" + echo ":::ABK 1.0.0 bert train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 bert train success" >> ${train_job_dir}/${device_id}/hw_bert.log +else + echo ":::ABK 1.0.0 bert train failed" + echo ":::ABK 1.0.0 bert train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 bert train failed" >> ${train_job_dir}/${device_id}/hw_bert.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 bert train total time ${hour}:${min}:${sec}" +echo ":::ABK 1.0.0 bert train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_bert.log + +#if [ x"$5" == x"solo" ]; +#then +# /bin/cp -f hw_bert.log $perfDir/hw_bert.log +#fi diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/README.md new file mode 100644 index 0000000..ff1b06a --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/README.md @@ -0,0 +1,54 @@ +# Bert-Large_tensorflow训练说明 + +### 1. 模型训练参数配置 + +在train/yaml/Bert-Large.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: + #中文数据用 bert_config_large_cn.json 英文用bert_config_large_en.json + bert_config_file: bert_config_large_cn.json + #数据集句子长度是256时 设置为 256,40,句子长度是128时设置为128,20 + max_seq_length: 128 + max_predictions_per_seq: 20 + + # 最佳性能train_batch_size为96,如果超显存,可调小至32 + train_batch_size: 96 + learning_rate: 3.125e-5 + num_warmup_steps: 100 + num_train_steps: 1000 + optimizer_type: adam + manual_fp16: True + use_fp16_cls: True + input_files_dir: /home/BertData/cn-wiki-128/ + eval_files_dir: /home/BertData/cn-wiki-128/ + do_train: True + do_eval: True + num_accumulation_steps: 1 + iterations_per_loop: 100 + npu_bert_loss_scale: 0 + save_checkpoints_steps: 1000 + npu_bert_clip_by_global_norm: False + + # docker 镜像名称:版本号 + docker_image: c73:b021 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.140.199:8,90.90.140.229:8 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + +``` + +------ + + + + + + + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/CONTRIBUTING.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/CONTRIBUTING.md new file mode 100644 index 0000000..124b4b3 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# How to Contribute + +BERT needs to maintain permanent compatibility with the pre-trained model files, +so we do not plan to make any major changes to this library (other than what was +promised in the README). However, we can accept small patches related to +re-factoring and documentation. To submit contributes, there are just a few +small guidelines you need to follow. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement. You (or your employer) retain the copyright to your contribution; +this simply gives us permission to use and redistribute your contributions as +part of the project. Head over to to see +your current agreements on file or to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. + +## Community Guidelines + +This project follows +[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/Dockerfile b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/Dockerfile new file mode 100644 index 0000000..f9044f5 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/Dockerfile @@ -0,0 +1,31 @@ +ARG FROM_IMAGE_NAME=nvcr.io/nvidia/tensorflow:19.08-py3 + +FROM tensorrtserver_client as trt + +FROM ${FROM_IMAGE_NAME} + +RUN apt-get update && apt-get install -y pbzip2 pv bzip2 libcurl3 + +RUN pip install toposort networkx pytest nltk tqdm html2text progressbar + +WORKDIR /workspace +RUN git clone https://github.com/openai/gradient-checkpointing.git +RUN git clone https://github.com/attardi/wikiextractor.git +RUN git clone https://github.com/soskek/bookcorpus.git +RUN git clone https://github.com/titipata/pubmed_parser + +RUN pip3 install /workspace/pubmed_parser + +#Copy the perf_client over +COPY --from=trt /workspace/install/ /workspace/install/ + +#Install the python wheel with pip +RUN pip install /workspace/install/python/tensorrtserver*.whl + +WORKDIR /workspace/bert +COPY . . + +ENV PYTHONPATH /workspace/bert +ENV BERT_PREP_WORKING_DIR /workspace/bert/data +ENV PATH //workspace/install/bin:${PATH} +ENV LD_LIBRARY_PATH /workspace/install/lib:${LD_LIBRARY_PATH} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/LICENSE b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/NOTICE b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/NOTICE new file mode 100644 index 0000000..917c2a6 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/NOTICE @@ -0,0 +1,4 @@ +BERT TensorFlow + +This repository includes software from https://github.com/google-research/bert +licensed under the Apache License, Version 2.0 (the "License") \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/README.md new file mode 100644 index 0000000..b880f57 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/README.md @@ -0,0 +1,1155 @@ +# BERT For TensorFlow + +This repository provides a script and recipe to train the BERT model for TensorFlow to achieve state-of-the-art accuracy, and is tested and maintained by NVIDIA. + +## Table Of Contents + +- [Model overview](#model-overview) + * [Model architecture](#model-architecture) + * [Default configuration](#default-configuration) + * [Feature support matrix](#feature-support-matrix) + * [Features](#features) + * [Mixed precision training](#mixed-precision-training) + * [Enabling mixed precision](#enabling-mixed-precision) + * [Glossary](#glossary) +- [Setup](#setup) + * [Requirements](#requirements) +- [Quick Start Guide](#quick-start-guide) +- [Advanced](#advanced) + * [Scripts and sample code](#scripts-and-sample-code) + * [Parameters](#parameters) + * [Command-line options](#command-line-options) + * [Getting the data](#getting-the-data) + * [Dataset guidelines](#dataset-guidelines) + * [Multi-dataset](#multi-dataset) + * [Training process](#training-process) + * [Pre-training](#pre-training) + * [Fine tuning](#fine-tuning) + * [Multi-node](#multi-node) + * [Inference process](#inference-process) + * [Deploying the BERT model using TensorRT Inference Server](#deploying-the-bert-model-using-tensorrt-inference-server) + * [BioBERT](#biobert) +- [Performance](#performance) + * [Benchmarking](#benchmarking) + * [Training performance benchmark](#training-performance-benchmark) + * [Inference performance benchmark](#inference-performance-benchmark) + * [Results](#results) + * [Training accuracy results](#training-accuracy-results) + * [Pre-training accuracy: single-node](#pre-training-accuracy-single-node) + * [Pre-training accuracy: multi-node](#pre-training-accuracy-multi-node) + * [Fine-tuning accuracy for SQuAD: NVIDIA DGX-2 (16x V100 32G)](#fine-tuning-accuracy-for-squad-nvidia-dgx-2-16x-v100-32g) + * [Training stability test](#training-stability-test) + * [Pre-training SQuAD stability test: NVIDIA DGX-2 (512x V100 32G)](#fine-tuning-squad-stability-test-nvidia-dgx-2-512x-v100-32g) + * [Fine-tuning SQuAD stability test: NVIDIA DGX-2 (16x V100 32G)](#fine-tuning-squad-stability-test-nvidia-dgx-2-16x-v100-32g) + * [Training performance results](#training-performance-results) + * [Training performance: NVIDIA DGX-1 (8x V100 16G)](#training-performance-nvidia-dgx-1-8x-v100-16g) + * [Pre-training training performance: single-node on 16G](#pre-training-training-performance-single-node-on-16g) + * [Pre-training training performance: multi-node on 16G](#pre-training-training-performance-multi-node-on-16g) + * [Fine-tuning training performance for SQuAD on 16G](#fine-tuning-training-performance-for-squad-on-16g) + * [Training performance: NVIDIA DGX-1 (8x V100 32G)](#training-performance-nvidia-dgx-1-8x-v100-32g) + * [Pre-training training performance: single-node on 32G](#pre-training-training-performance-single-node-on-32g) + * [Fine-tuning training performance for SQuAD on 32G](#fine-tuning-training-performance-for-squad-on-32g) + * [Training performance: NVIDIA DGX-2 (16x V100 32G)](#training-performance-nvidia-dgx-2-16x-v100-32g) + * [Pre-training training performance: single-node on DGX-2 32G](#pre-training-training-performance-single-node-on-dgx-2-32g) + * [Pre-training training performance: multi-node on DGX-2 32G](#pre-training-training-performance-multi-node-on-dgx-2-32g) + * [Fine-tuning training performance for SQuAD on DGX-2 32G](#fine-tuning-training-performance-for-squad-on-dgx-2-32g) + * [Inference performance results](#inference-performance-results) + * [Inference performance: NVIDIA DGX-1 (1x V100 16G)](#inference-performance-nvidia-dgx-1-1x-v100-16g) + * [Pre-training inference performance on 16G](#pre-training-inference-performance-on-16g) + * [Fine-tuning inference performance for SQuAD on 16G](#fine-tuning-inference-performance-for-squad-on-16g) + * [Inference performance: NVIDIA DGX-1 (1x V100 32G)](#inference-performance-nvidia-dgx-1-1x-v100-32g) + * [Pre-training inference performance on 32G](#pre-training-inference-performance-on-32g) + * [Fine-tuning inference performance for SQuAD on 32G](#fine-tuning-inference-performance-for-squad-on-32g) + * [Inference performance: NVIDIA DGX-2 (1x V100 32G)](#inference-performance-nvidia-dgx-2-1x-v100-32g) + * [Pre-training inference performance on DGX-2 32G](#pre-training-inference-performance-on-dgx-2-32g) + * [Fine-tuning inference performance for SQuAD on DGX-2 32G](#fine-tuning-inference-performance-for-squad-on-dgx-2-32g) + * [Inference performance: NVIDIA Tesla T4 (1x T4 16G)](#inference-performance-nvidia-tesla-t4-1x-t4-16g) + * [Fine-tuning inference performance for SQuAD on Tesla T4 16G](#fine-tuning-inference-performance-for-squad-on-tesla-t4-16g) +- [Release notes](#release-notes) + * [Changelog](#changelog) + * [Known issues](#known-issues) + + + + +## Model overview + +BERT, or Bidirectional Encoder Representations from Transformers, is a new method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. This model is based on the [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) paper. NVIDIA's BERT is an optimized version of [Google's official implementation](https://github.com/google-research/bert), leveraging mixed precision arithmetic and Tensor Cores on V100 GPUs for faster training times while maintaining target accuracy. + +Other publicly available implementations of BERT include: +1. [NVIDIA PyTorch](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/LanguageModeling/BERT) +2. [Hugging Face](https://github.com/huggingface/pytorch-pretrained-BERT) +3. [codertimo](https://github.com/codertimo/BERT-pytorch) +4. [gluon-nlp](https://github.com/dmlc/gluon-nlp/tree/master/scripts/bert) +5. [Google's official implementation](https://github.com/google-research/bert) + +This model is trained with mixed precision using Tensor Cores on NVIDIA Volta and Turing GPUs. Therefore, researchers can get results upto 4x faster than training without Tensor Cores, while experiencing the benefits of mixed precision training. This model is tested against each NGC monthly container release to ensure consistent accuracy and performance over time. + +### Model architecture + +BERT's model architecture is a multi-layer bidirectional Transformer encoder. Based on the model size, we have the following two default configurations of BERT: + +| **Model** | **Hidden layers** | **Hidden unit size** | **Attention heads** | **Feedforward filter size** | **Max sequence length** | **Parameters** | +|:---------:|:----------:|:----:|:---:|:--------:|:---:|:----:| +|BERTBASE |12 encoder| 768| 12|4 x 768|512|110M| +|BERTLARGE|24 encoder|1024| 16|4 x 1024|512|330M| + +BERT training consists of two steps, pre-training the language model in an unsupervised fashion on vast amounts of unannotated datasets, and then using this pre-trained model for fine-tuning for various NLP tasks, such as question and answer, sentence classification, or sentiment analysis. Fine-tuning typically adds an extra layer or two for the specific task and further trains the model using a task-specific annotated dataset, starting from the pre-trained backbone weights. The end-to-end process in depicted in the following image: + +![](data/images/bert_pipeline.png?raw=true) + +Figure 1: BERT Pipeline + +### Default configuration + +This repository contains scripts to interactively launch data download, training, benchmarking and inference routines in a Docker container for both pre-training and fine tuning for Question Answering. The major differences between the official implementation of the paper and our version of BERT are as follows: + +- Mixed precision support with TensorFlow Automatic Mixed Precision (TF-AMP), which enables mixed precision training without any changes to the code-base by performing automatic graph rewrites and loss scaling controlled by an environmental variable. +- Scripts to download dataset for: + - Pre-training - [Wikipedia](https://dumps.wikimedia.org/), [BookCorpus](http://yknzhu.wixsite.com/mbweb) + - Fine tuning - [SQuAD](https://rajpurkar.github.io/SQuAD-explorer/) (Stanford Question Answering Dataset) + - Fine tuning - [GLUE](https://gluebenchmark.com/) (The General Language Understanding Evaluation benchmark) + - Pretrained weights from Google +- Custom fused CUDA kernels for faster computations +- Multi-GPU/Multi-node support using Horovod + +The following performance optimizations were implemented in this model: +- [XLA](https://www.tensorflow.org/xla) support (experimental). + +These techniques and optimizations improve model performance and reduce training time, allowing you to perform various NLP tasks with no additional effort. + + +### Feature support matrix + +The following features are supported by this model. + +| **Feature** | **BERT** | +|:-----------------------:|:--------------------------:| +| Horovod Multi-GPU | Yes | +| Horovod Multi-Node | Yes | +| Automatic mixed precision (AMP) | Yes | +| LAMB | Yes | + +#### Features + +Multi-GPU training with Horovod - Our model uses Horovod to implement efficient multi-GPU training with NCCL. For details, see example sources in this repository or see the [TensorFlow tutorial](https://github.com/horovod/horovod/#usage) + +[LAMB](https://arxiv.org/pdf/1904.00962.pdf) stands for Layerwise Adaptive Moments based optimizer, is a large batch optimization technique that helps accelerate training of deep neural networks using large minibatches. It allows using a global batch size of 65536 and 32768 on sequence lengths 128 and 512 respectively, compared to a batch size of 256 for Adam. The optimized implementation accumulates 1024 gradients batches in phase 1 and 4096 steps in phase 2 before updating weights once. This results in 27% training speedup on a single DGX2 node. On multi-node systems, LAMB allows scaling up to 1024 GPUs resulting in training speedups of up to 17x in comparison to [Adam](https://arxiv.org/pdf/1412.6980.pdf). Adam has limitations on the learning rate that can be used since it is applied globally on all parameters whereas LAMB follows a layerwise learning rate strategy. + +NVLAMB adds necessary tweaks to [LAMB version 1](https://arxiv.org/abs/1904.00962v1), to ensure correct convergence. A guide to implementating the LAMB optimizer can be found in our [article](https://medium.com/@NvidiaAI/a-guide-to-optimizer-implementation-for-bert-at-scale-8338cc7f45fd) on Medium.com. The algorithm is as follows: + ![NVLAMB](data/images/images_nvlamb.png) + +### Mixed precision training + +Mixed precision is the combined use of different numerical precision in a computational method. [Mixed precision](https://arxiv.org/abs/1710.03740) training offers significant computational speedup by performing operations in half-precision format, while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of [Tensor Cores](https://developer.nvidia.com/tensor-cores) in the Volta and Turing architecture, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures. Using mixed precision training requires two steps: +1. Porting the model to use the FP16 data type where appropriate. +2. Adding loss scaling to preserve small gradient values. + +The ability to train deep learning networks with lower precision was introduced in the Pascal architecture and first supported in [CUDA 8](https://devblogs.nvidia.com/parallelforall/tag/fp16/) in the NVIDIA Deep Learning SDK. + +For information about: +- How to train using mixed precision, see the [Mixed Precision Training](https://arxiv.org/abs/1710.03740) paper and [Training With Mixed Precision](https://docs.nvidia.com/deeplearning/sdk/Mixed-Precision-training/index.html) documentation. +- Techniques used for mixed precision training, see the [Mixed Precision Training of Deep Neural Networks](https://devblogs.nvidia.com/mixed-precision-training-deep-neural-networks/) blog. +- How to access and enable AMP for TensorFlow, see [Using TF-AMP](https://docs.nvidia.com/deeplearning/dgx/tensorflow-user-guide/index.html#tfamp) from the TensorFlow User Guide. + +#### Enabling mixed precision + +Automatic Mixed Precision (AMP) for TensorFlow enables the full [mixed precision methodology](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html#tensorflow) in your existing TensorFlow model code. AMP enables mixed precision training on Volta and Turing GPUs automatically. The TensorFlow framework code makes all necessary model changes internally. + +In TF-AMP, the computational graph is optimized to use as few casts as necessary and maximizes the use of FP16, and the loss scaling is automatically applied inside of supported optimizers. AMP can be configured to work with the existing `tf.contrib` loss scaling manager by disabling the AMP scaling with a single environment variable to perform only the automatic mixed precision optimization. It accomplishes this by automatically rewriting all computation graphs with the necessary operations to enable mixed precision training and automatic loss scaling. + + +### Glossary + +**Fine-tuning** +Training an already pretrained model further using a task specific dataset for subject-specific refinements, by adding task-specific layers on top if required. + +**Language Model** +Assigns a probability distribution over a sequence of words. Given a sequence of words, it assigns a probability to the whole sequence. + +**Pre-training** +Training a model on vast amounts of data on the same (or different) task to build general understandings. + +**Transformer** +The paper [Attention Is All You Need](https://arxiv.org/abs/1706.03762) introduces a novel architecture called Transformer that uses an attention mechanism and transforms one sequence into another. + + +## Setup + +The following section lists the requirements in order to start training the BERT model. + + +### Requirements + +This repository contains `Dockerfile` which extends the TensorFlow NGC container and encapsulates some dependencies. Aside from these dependencies, ensure you have the following components: +- [NVIDIA Docker](https://github.com/NVIDIA/nvidia-docker) +- [TensorFlow 19.08-py3+](https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow) NGC container +- [NVIDIA Volta](https://www.nvidia.com/en-us/data-center/volta-gpu-architecture/) or [Turing](https://www.nvidia.com/en-us/geforce/turing/) based GPU + +For more information about how to get started with NGC containers, see the following sections from the NVIDIA GPU Cloud Documentation and the Deep Learning Documentation: +- [Getting Started Using NVIDIA GPU Cloud](https://docs.nvidia.com/ngc/ngc-getting-started-guide/index.html) +- [Accessing And Pulling From The NGC Container Registry](https://docs.nvidia.com/deeplearning/frameworks/user-guide/index.html#accessing_registry) +- [Running TensorFlow](https://docs.nvidia.com/deeplearning/frameworks/tensorflow-release-notes/running.html#running) + +For those unable to use the TensorFlow NGC container, to set up the required environment or create your own container, see the versioned [NVIDIA Container Support Matrix](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html). + +For multi-node, the sample provided in this repository requires [Enroot](https://github.com/NVIDIA/enroot) and [Pyxis](https://github.com/NVIDIA/pyxis) set up on a [SLURM](https://slurm.schedmd.com) cluster. + +More information on how to set up and launch can be found in the [Multi-node Documentation](https://docs.nvidia.com/ngc/multi-node-bert-user-guide). + + +## Quick Start Guide + +To pretrain or fine tune your model for Question Answering using mixed precision with Tensor Cores or using FP32, perform the following steps using the default parameters of the BERT model. + +1. Clone the repository. + +```bash +git clone https://github.com/NVIDIA/DeepLearningExamples +cd DeepLearningExamples/TensorFlow/LanguageModeling/BERT +``` + +2. Build the BERT TensorFlow NGC container. + +```bash +bash scripts/docker/build.sh +``` + +3. Download and preprocess the dataset. + +This repository provides scripts to download, verify and extract the SQuAD dataset, GLUE dataset and pretrained weights for fine tuning as well as Wikipedia and BookCorpus dataset for pre-training. + +To download, verify, and extract the required datasets, run: + +```bash +bash scripts/data_download.sh +``` + +The script launches a Docker container with the current directory mounted and downloads the datasets to a `data/` folder on the host. + +Note: The dataset is 170GB+ and takes 15+ hours to download. The BookCorpus server could sometimes get overloaded and also contain broken links resulting in HTTP 403 and 503 errors. You can either skip the missing files or retry downloading at a later time. Expired dataset links are ignored during data download. + +4. Download the pretrained models from NGC. + +We have uploaded checkpoints for both fine tuning and pre-training for various configurations on the NGC Model Registry. You can download them directly from the [NGC model catalog](https://ngc.nvidia.com/catalog/models). Download them to the `results/models/` to easily access them in your scripts. + + +5. Start an interactive session in the NGC container to run training/inference. + +After you build the container image and download the data, you can start an interactive CLI session as follows: + +```bash +bash scripts/docker/launch.sh +``` + +The `launch.sh` script assumes that the datasets are in the following locations by default after downloading the data. + +- SQuAD v1.1 - `data/download/squad/v1.1` +- SQuAD v2.0 - `data/download/squad/v2.0` +- GLUE The Corpus of Linguistic Acceptability (CoLA) - `data/download/CoLA` +- GLUE Microsoft Research Paraphrase Corpus (MRPC) - `data/download/MRPC` +- GLUE The Multi-Genre NLI Corpus (MNLI) - `data/download/MNLI` +- BERT Large - `data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16` +- BERT Base - `data/download/google_pretrained_weights/uncased_L-12_H-768_A-12` +- BERT - `data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16` +- Wikipedia + BookCorpus TFRecords - `data/tfrecords/books_wiki_en_corpus` + +6. Start pre-training. + +BERT is designed to pre-train deep bidirectional representations for language representations. The following scripts are to replicate pre-training on Wikipedia and BookCorpus from the [LAMB paper](https://arxiv.org/pdf/1904.00962.pdf). These scripts are general and can be used for pre-training language representations on any corpus of choice. + +From within the container, you can use the following script to run pre-training using LAMB. +```bash +bash scripts/run_pretraining_lamb.sh +``` + +For BERT Large FP16 training with XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_pretraining_lamb.sh 64 8 8 7.5e-4 5e-4 fp16 true 8 2000 200 7820 100 128 512 large +``` + +For BERT Large FP32 training without XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_pretraining_lamb.sh 64 8 8 7.5e-4 5e-4 fp32 false 8 2000 200 7820 100 128 512 large +``` + +Alternatively, to run pre-training with Adam as in the original [BERT paper](https://arxiv.org/pdf/1810.04805.pdf) from within the container, run: + +```bash +bash scripts/run_pretraining_adam.sh +``` + +7. Start fine tuning. + +The above pretrained BERT representations can be fine tuned with just one additional output layer for a state-of-the-art Question Answering system. From within the container, you can use the following script to run fine-training for SQuAD. + +```bash +bash scripts/run_squad.sh +``` + +For SQuAD 1.1 FP16 training with XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_squad.sh 10 5e-6 fp16 true 8 384 128 large 1.1 data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_model.ckpt 1.1 +``` + +For SQuAD 2.0 FP32 training without XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_squad.sh 5 5e-6 fp32 false 8 384 128 large 1.1 data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_model.ckpt 2.0 +``` + +Alternatively, to run fine tuning on GLUE benchmark, run: + +```bash +bash scripts/run_glue.sh +``` + +The GLUE tasks supported include CoLA, MRPC and MNLI. + +8. Start validation/evaluation. + +The `run_squad_inference.sh` script runs inference on a checkpoint fine tuned for SQuAD and evaluates the validity of predictions on the basis of exact match and F1 score. + +```bash +bash scripts/run_squad_inference.sh +``` + +For SQuAD 2.0 FP16 inference with XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_squad_inference.sh /results/model.ckpt 8 fp16 true 384 128 large 2.0 +``` + +For SQuAD 1.1 FP32 inference without XLA using a DGX-1 V100 32G, run: +```bash +bash scripts/run_squad_inference.sh /results/model.ckpt 8 fp32 false 384 128 large 1.1 +``` + +Alternatively, to run inference on GLUE benchmark, run: +```bash +bash scripts/run_glue_inference.sh +``` + +## Advanced + +The following sections provide greater details of the dataset, running training and inference, and the training results. + +### Scripts and sample code + +In the root directory, the most important files are: +* `run_pretraining.py` - Serves as entry point for pre-training +* `run_squad.py` - Serves as entry point for SQuAD training +* `run_classifier.py` - Serves as entry point for GLUE training +* `Dockerfile` - Container with the basic set of dependencies to run BERT + +The `scripts/` folder encapsulates all the one-click scripts required for running various functionalities supported such as: +* `run_squad.sh` - Runs SQuAD training and inference using `run_squad.py` file +* `run_glue.sh` - Runs GLUE training and inference using the `run_classifier.py` file +* `run_pretraining_adam.sh` - Runs pre-training with Adam optimizer using the `run_pretraining.py` file +* `run_pretraining_lamb.sh` - Runs pre-training with LAMB optimizer using the `run_pretraining.py` file in two phases. Phase 1 does 90% of training with sequence length = 128. In phase 2, the remaining 10% of the training is done with sequence length = 512. +* `data_download.sh` - Downloads datasets using files in the `data/` folder +* `finetune_train_benchmark.sh` - Captures performance metrics of training for multiple configurations +* `finetune_inference_benchmark.sh` - Captures performance metrics of inference for multiple configurations + +Other folders included in the root directory are: +* `data/` - Necessary folders and scripts to download datasets required for fine tuning and pre-training BERT. +* `utils/` - Necessary files for preprocessing data before feeding into BERT and hooks for obtaining performance metrics from BERT. + +### Parameters + +Aside from the options to set hyperparameters, the relevant options to control the behaviour of the `run_pretraining.py` script are: + +``` + --bert_config_file: The config json file corresponding to the pre-trained BERT model. This specifies the model architecture. + --init_checkpoint: Initial checkpoint (usually from a pre-trained BERT model). + --[no]do_eval: Whether to run evaluation on the dev set.(default: 'false') + --[no]do_train: Whether to run training.(evaluation: 'false') + --eval_batch_size: Total batch size for eval.(default: '8')(an integer) + --[no]horovod: Whether to use Horovod for multi-gpu runs(default: 'false') + --[no]use_fp16: Whether to enable AMP ops.(default: 'false') + --input_files_dir: Input TF example files (can be a dir or comma separated). + --output_dir: The output directory where the model checkpoints will be written. + --optimizer_type: Optimizer used for training - LAMB or ADAM + --num_accumulation_steps: Number of accumulation steps before gradient update. Global batch size = num_accumulation_steps * train_batch_size + --allreduce_post_accumulation: Whether to all reduce after accumulation of N steps or after each step +``` + +Aside from the options to set hyperparameters, some relevant options to control the behaviour of the `run_squad.py` script are: + +``` + --bert_config_file: The config json file corresponding to the pre-trained BERT model. This specifies the model architecture. + --output_dir: The output directory where the model checkpoints will be written. + --[no]do_predict: Whether to run evaluation on the dev set. (default: 'false') + --[no]do_train: Whether to run training. (default: 'false') + --learning_rate: The initial learning rate for Adam.(default: '5e-06')(a number) + --max_answer_length: The maximum length of an answer that can be generated. This is needed because the start and end predictions are not conditioned on one another.(default: '30')(an integer) + --max_query_length: The maximum number of tokens for the question. Questions longer than this will be truncated to this length.(default: '64')(an integer) + --max_seq_length: The maximum total input sequence length after WordPiece tokenization. Sequences longer than this will be truncated, and sequences shorter than this will be padded.(default: '384')(an integer) + --predict_batch_size: Total batch size for predictions.(default: '8')(an integer) + --train_batch_size: Total batch size for training.(default: '8')(an integer) + --[no]use_fp16: Whether to enable AMP ops.(default: 'false') + --[no]use_xla: Whether to enable XLA JIT compilation.(default: 'false') + --[no]version_2_with_negative: If true, the SQuAD examples contain some that do not have an answer.(default: 'false') +``` + +Aside from the options to set hyperparameters, some relevant options to control the behaviour of the `run_classifier.py` script are: + +``` + --bert_config_file: The config json file corresponding to the pre-trained BERT model. This specifies the model architecture. + --data_dir: The input data dir. Should contain the .tsv files (or other data files) for the task. + --[no]do_eval: Whether to run eval on the dev set. + (default: 'false') + --[no]do_predict: Whether to run the model in inference mode on the test set.(default: 'false') + --[no]do_train: Whether to run training.(default: 'false') + --[no]horovod: Whether to use Horovod for multi-gpu runs(default: 'false') + --init_checkpoint: Initial checkpoint (usually from a pre-trained BERT model). + --max_seq_length: The maximum total input sequence length after WordPiece tokenization. Sequences longer than this will be truncated, and sequences shorter than this will be padded.(default: '128')(an integer) + --num_train_epochs: Total number of training epochs to perform.(default: '3.0')(a number) + --output_dir: The output directory where the model checkpoints will be written. + --task_name: The name of the task to train. + --train_batch_size: Total batch size for training.(default: '32')(an integer) + --[no]use_fp16: Whether to use fp32 or fp16 arithmetic on GPU. + (default: 'false') + --[no]use_xla: Whether to enable XLA JIT compilation. + (default: 'false') + --vocab_file: The vocabulary file that the BERT model was trained on. + --warmup_proportion: Proportion of training to perform linear learning rate warmup for. E.g., 0.1 = 10% of training.(default: '0.1')(a number) +``` + +Note: When initializing from a checkpoint using `--init_checkpoint` and a corpus of your choice, keep in mind that `bert_config_file` and `vocab_file` should remain unchanged. + +### Command-line options + +To see the full list of available options and their descriptions, use the `-h` or `--help` command-line option with the Python file, for example: + +```bash +python run_pretraining.py --help +python run_squad.py --help +python run_classifier.py --help +``` + +### Getting the data + +For pre-training BERT, we use the concatenation of Wikipedia (2500M words) as well as BookCorpus (800M words). For Wikipedia, we extract only the text passages from [here](ftp://ftpmirror.your.org/pub/wikimedia/dumps/enwiki/latest/enwiki-latest-pages-articles-multistream.xml.bz2) and ignore headers list and tables. It is structured as a document level corpus rather than a shuffled sentence level corpus because it is critical to extract long contiguous sentences. + +The next step is to run `create_pretraining_data.py` with the document level corpus as input, which generates input data and labels for the masked language modeling and next sentence prediction tasks. Pre-training can also be performed on any corpus of your choice. The collection of data generation scripts are intended to be modular to allow modifications for additional preprocessing steps or to use additional data. They can hence easily be modified for an arbitrary corpus. + +The preparation of an individual pre-training dataset is described in the `create_datasets_from_start.sh` script found in the `data/` folder. The component steps to prepare the datasets are as follows: + +1. Data download and extract - the dataset is downloaded and extracted. +2. Clean and format - document tags, etc. are removed from the dataset. The end result of this step is a `{dataset_name_one_article_per_line}.txt` file that contains the entire corpus. Each line in the text file contains an entire document from the corpus. One file per dataset is created in the `formatted_one_article_per_line` folder. +3. Sharding - the sentence segmented corpus file is split into a number of smaller text documents. The sharding is configured so that a document will not be split between two shards. Sentence segmentation is performed at this time using NLTK. +4. TFRecord file creation - each text file shard is processed by the `create_pretraining_data.py` script to produce a corresponding TFRecord file. The script generates input data and labels for masked language modeling and sentence prediction tasks for the input text shard. + + +For fine tuning BERT for the task of Question Answering, we use SQuAD and GLUE. SQuAD v1.1 has 100,000+ question-answer pairs on 500+ articles. SQuAD v2.0 combines v1.1 with an additional 50,000 new unanswerable questions and must not only answer questions but also determine when that is not possible. GLUE consists of single-sentence tasks, similarity and paraphrase tasks and inference tasks. We support one of each: CoLA, MNLI and MRPC. + +#### Dataset guidelines + +The procedure to prepare a text corpus for pre-training is described in the previous section. This section provides additional insight into how exactly raw text is processed so that it is ready for pre-training. + +First, raw text is tokenized using [WordPiece tokenization](https://arxiv.org/pdf/1609.08144.pdf). A [CLS] token is inserted at the start of every sequence, and the two sentences in the sequence are separated by a [SEP] token. + +Note: BERT pre-training looks at pairs of sentences at a time. A sentence embedding token [A] is added to the first sentence and token [B] to the next. + +BERT pre-training optimizes for two unsupervised classification tasks. The first is Masked Language Modelling (Masked LM). One training instance of Masked LM is a single modified sentence. Each token in the sentence has a 15% chance of being replaced by a [MASK] token. The chosen token is replaced with [MASK] 80% of the time, 10% with another random token and the remaining 10% with the same token. The task is then to predict the original token. + +The second task is next sentence prediction. One training instance of BERT pre-training is two sentences (a sentence pair). A sentence pair may be constructed by simply taking two adjacent sentences from a single document, or by pairing up two random sentences with equal probability. The goal of this task is to predict whether or not the second sentence followed the first in the original document. + +The `create_pretraining_data.py` script takes in raw text and creates training instances for both pre-training tasks. + +#### Multi-dataset + +We are able to combine multiple datasets into a single dataset for pre-training on a diverse text corpus. Once TFRecords have been created for each component dataset, you can create a combined dataset by adding the directory to `SOURCES` in `run_pretraining_*.sh`. This will feed all matching files to the input pipeline in `run_pretraining.py`. However, in the training process, only one TFRecord file is consumed at a time, therefore, the training instances of any given training batch will all belong to the same source dataset. + +### Training process + +The training process consists of two steps: pre-training and fine tuning. + +#### Pre-training + +Pre-training is performed using the `run_pretraining.py` script along with parameters defined in the `scripts/run_pretraining_lamb.sh`. + +The `run_pretraining_lamb.sh` script runs a job on a single node that trains the BERT-large model from scratch using the Wikipedia and BookCorpus datasets as training data. By default, the training script: +- Runs on 8 GPUs. +- Has FP16 precision enabled. +- Is XLA enabled. +- Creates a log file containing all the output. +- Saves a checkpoint every 100 iterations (keeps only the latest checkpoint) and at the end of training. All checkpoints, evaluation results and training logs are saved to the `/results` directory (in the container which can be mounted to a local directory). +- Evaluates the model at the end of each phase. + +- Phase 1 + - Runs 7038 steps with 2000 warmup steps + - Sets Maximum sequence length as 128 + - Sets Global Batch size as 64K + +- Phase 2 + - Runs 1564 steps with 200 warm-up steps + - Sets Maximum sequence length as 512 + - Sets Global Batch size as 32K + - Starts from Phase1's final checkpoint + +These parameters train Wikipedia and BookCorpus with reasonable accuracy on a DGX-1 with 32GB V100 cards. + +For example: +```bash +scripts/run_pretraining_lamb.sh +``` + +Where: +- `` is per-GPU batch size used for training in the respective phase. Batch size varies with precision, larger batch sizes run more efficiently, but require more memory. + +- `` is per-GPU batch size used for evaluation after training. + +- `` is the default rate of 1e-4 is good for global batch size 256. + +- `` is the default rate of 1e-4 is good for global batch size 256. + +- `` is the type of math in your model, can be either `fp32` or `fp16`. Specifically: + + - `fp32` is 32-bit IEEE single precision floats. + - `fp16` is Automatic rewrite of TensorFlow compute graph to take advantage of 16-bit arithmetic whenever it is safe. + +- `` is the number of GPUs to use for training. Must be equal to or smaller than the number of GPUs attached to your node. + +- `` is the number of warm-up steps at the start of training in the respective phase. + +- `` is the total number of training steps in both phases combined. + +- `` controls how often checkpoints are saved. Default is 100 steps. + +- `` is used to mimic higher batch sizes in the respective phase by accumulating gradients N times before weight update. + +- `` is used to indicate whether to pretrain BERT Large or BERT Base model + +The following sample code trains BERT-large from scratch on a single DGX-2 using FP16 arithmetic. This will take around 4.5 days. + +```bash +bert_tf/scripts/run_pretraining_lamb.sh 32 8 8 3.75e-4 2.5e-4 fp16 true 16 2000 200 7820 100 128 512 256 large +``` + +#### Fine tuning + +Fine tuning is performed using the `run_squad.py` script along with parameters defined in `scripts/run_squad.sh`. + +The `run_squad.sh` script trains a model and performs evaluation on the SQuAD dataset. By default, the training script: + +- Trains for SQuAD v1.1 dataset. +- Trains on BERT Large Model. +- Uses 8 GPUs and batch size of 10 on each GPU. +- Has FP16 precision enabled. +- Is XLA enabled. +- Runs for 2 epochs. +- Saves a checkpoint every 1000 iterations (keeps only the latest checkpoint) and at the end of training. All checkpoints, evaluation results and training logs are saved to the `/results` directory (in the container which can be mounted to a local directory). +- Evaluation is done at the end of training. To skip evaluation, modify `--do_predict` to `False`. + +This script outputs checkpoints to the `/results` directory, by default, inside the container. Mount point of `/results` can be changed in the `scripts/docker/launch.sh` file. The training log contains information about: +- Loss for the final step +- Training and evaluation performance +- F1 and exact match score on the Dev Set of SQuAD after evaluation. + +The summary after training is printed in the following format: +```bash +I0312 23:10:45.137036 140287431493376 run_squad.py:1332] 0 Total Training Time = 3007.00 Training Time W/O start up overhead = 2855.92 Sentences processed = 175176 +I0312 23:10:45.137243 140287431493376 run_squad.py:1333] 0 Training Performance = 61.3378 sentences/sec +I0312 23:14:00.550846 140287431493376 run_squad.py:1396] 0 Total Inference Time = 145.46 Inference Time W/O start up overhead = 131.86 Sentences processed = 10840 +I0312 23:14:00.550973 140287431493376 run_squad.py:1397] 0 Inference Performance = 82.2095 sentences/sec +{"exact_match": 83.69914853358561, "f1": 90.8477003317459} +``` + +Multi-GPU training is enabled with the Horovod TensorFlow module. The following example runs training on 8 GPUs: + +```bash +BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 + +mpi_command="mpirun -np 8 -H localhost:8 \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" \ + python run_squad.py --horovod --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --output_dir=/results +``` + +#### Multi-node + + +Multi-node runs can be launched on a pyxis/enroot Slurm cluster (see [Requirements](#requirements)) with the `run.sub` script with the following command for a 4-node DGX1 example for both phase 1 and phase 2: +``` +BATCHSIZE=16 LEARNING_RATE='1.875e-4' NUM_ACCUMULATION_STEPS=128 PHASE=1 sbatch -N4 --ntasks-per-node=8 run.sub +BATCHSIZE=2 LEARNING_RATE='1.25e-4' NUM_ACCUMULATION_STEPS=512 PHASE=1 sbatch -N4 --ntasks-per-node=8 run.sub +``` + + +Checkpoint after phase 1 will be saved in `checkpointdir` specified in `run.sub`. The checkpoint will be automatically picked up to resume training on phase 2. Note that phase 2 should be run after phase 1. + +Variables to re-run the [Training performance results](#training-performance-results) are available in the `configurations.yml` file. + +The batch variables `BATCHSIZE`, `LEARNING_RATE`, `NUM_ACCUMULATION_STEPS` refer to the Python arguments `train_batch_size`, `learning_rate`, `num_accumulation_steps` respectively. +The variable `PHASE` refers to phase specific arguments available in `run.sub`. + +Note that the `run.sub` script is a starting point that has to be adapted depending on the environment. In particular, variables such as `datadir` handle the location of the files for each phase. + +Refer to the files contents to see the full list of variables to adjust for your system. + +### Inference process + +Inference on a fine tuned Question Answering system is performed using the `run_squad.py` script along with parameters defined in `scripts/run_squad_inference.sh`. Inference is supported on a single GPU. + +The `run_squad_inference.sh` script trains a model and performs evaluation on the SQuAD dataset. By default, the inferencing script: + +- Uses SQuAD v1.1 dataset +- Has FP16 precision enabled +- Is XLA enabled +- Evaluates the latest checkpoint present in `/results` with a batch size of 8 + +This script outputs predictions file to `/results/predictions.json` and computes F1 score and exact match score using SQuAD's evaluate file. Mount point of `/results` can be changed in the `scripts/docker/launch.sh` file. + +The output log contains information about: +Inference performance +Inference Accuracy (F1 and exact match scores) on the Dev Set of SQuAD after evaluation. + +The summary after inference is printed in the following format: +```bash +I0312 23:14:00.550846 140287431493376 run_squad.py:1396] 0 Total Inference Time = 145.46 Inference Time W/O start up overhead = 131.86 Sentences processed = 10840 +I0312 23:14:00.550973 140287431493376 run_squad.py:1397] 0 Inference Performance = 82.2095 sentences/sec +{"exact_match": 83.69914853358561, "f1": 90.8477003317459} +``` + +### Deploying the BERT model using TensorRT Inference Server + +The [NVIDIA TensorRT Inference Server](https://github.com/NVIDIA/tensorrt-inference-server) provides a datacenter and cloud inferencing solution optimized for NVIDIA GPUs. The server provides an inference service via an HTTP or gRPC endpoint, allowing remote clients to request inferencing for any number of GPU or CPU models being managed by the server. More information on how to perform inference using `TensorRT Inference Server` can be found in the subfolder `./trtis/README.md`. + +### BioBERT + +Many works, including [BioBERT](https://arxiv.org/pdf/1901.08746.pdf), [SciBERT](https://arxiv.org/pdf/1903.10676.pdf), [NCBI-BERT](https://arxiv.org/pdf/1906.05474.pdf), [ClinicalBERT (MIT)](https://arxiv.org/pdf/1904.03323.pdf), [ClinicalBERT (NYU, Princeton)](https://arxiv.org/pdf/1904.05342.pdf), and others at [BioNLP’19 workshop](https://aclweb.org/aclwiki/BioNLP_Workshop), show that pre-training of BERT on large biomedical text corpus such as [PubMed](https://www.ncbi.nlm.nih.gov/pubmed/) results in better performance in biomedical text-mining tasks. + +More information on how to download a biomedical corpus and pre-train as well as finetune for biomedical tasks can be found in the subfolder `./biobert/README.md`. + +## Performance + +### Benchmarking + +The following section shows how to run benchmarks measuring the model performance in training and inference modes. + +Both of these benchmarking scripts enable you to run a number of epochs, extract performance numbers, and run the BERT model for fine tuning. + +#### Training performance benchmark + +Training benchmarking can be performed by running the script: +``` bash +scripts/finetune_train_benchmark.sh squad +``` + +This script runs 2 epochs by default on the SQuAD v1.1 dataset and extracts performance numbers for various batch sizes and sequence lengths in both FP16 and FP32. These numbers are saved at `/results/squad_train_benchmark_bert__gpu_.log`. + +#### Inference performance benchmark + +Inference benchmarking can be performed by running the script: + +``` bash +scripts/finetune_inference_benchmark.sh squad +``` + +This script runs 1024 eval iterations by default on the SQuAD v1.1 dataset and extracts performance and latency numbers for various batch sizes and sequence lengths in both FP16 with XLA and FP32 without XLA. These numbers are saved at `/results/squad_inference_benchmark_bert_.log`. + +### Results + +The following sections provide details on how we achieved our performance and accuracy in training and inference for pre-training using LAMB optimizer as well as fine tuning for Question Answering. All results are on BERT-large model unless otherwise mentioned. All fine tuning results are on SQuAD v1.1 using a sequence length of 384 unless otherwise mentioned. + +#### Training accuracy results + +##### Training accuracy + +###### Pre-training accuracy: single-node + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.06-py3 NGC container. + +| **DGX System** | **GPUs** | **Batch size / GPU: Phase1, Phase2** | **Accumulation Steps: Phase1, Phase2** | **Time to Train - mixed precision (Hrs)** | **Final Loss - mixed precision** | +|:---:|:---:|:----:|:----:|:---:|:----:| +| DGX1 | 8 | 16, 2 | 512, 2048 | 247.51 | 1.43 | +| DGX2 | 16 | 64, 8 | 64, 256 | 108.16 | 1.58 | + +###### Pre-training accuracy: multi-node + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.08-py3 NGC container. + +| **DGX System** | **Nodes** | **Precision** | **Batch Size/GPU: Phase1, Phase2** | **Accumulation Steps: Phase1, Phase2** | **Time to Train (Hrs)** | **Final Loss** | +|----------------|-----------|---------------|------------------------------------|----------------------------------------|----------------|-------------------------| +| DGX1 | 4 | FP16 | 16, 4 |128, 256| 62.49 | 1.72 | +| DGX1 | 16 | FP16 | 16, 4 | 32, 64 | 16.58 | 1.76 | +| DGX1 | 32 | FP16 | 16, 2 | 16, 64 | 9.85 | 1.71 | +| DGX2H | 1 | FP16 | 32, 8 |128, 256| 69.27 | 1.59 | +| DGX2H | 4 | FP16 | 32, 8 | 32, 64 | 22.17 | 1.60 | +| DGX2H | 16 | FP16 | 32, 8 | 8, 16 | 6.25 | 1.56 | +| DGX2H | 32 | FP16 | 32, 8 | 4, 8 | 3.73 | 1.58 | +| DGX2H | 64 | FP16 | 32, 8 | 2, 4 | 2.44 | 1.64 | +| DGX2H | 64 | FP32 | 32, 4 | 2, 8 | 5.76 | 1.66 | + +Note: Time to train includes upto 16 minutes of start up time for every restart. Experiments were run on clusters with a maximum wall clock time of 8 hours. + +###### Fine-tuning accuracy for SQuAD: NVIDIA DGX-2 (16x V100 32G) + +Our results were obtained by running the `scripts/run_squad.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 16x V100 32G GPUs. + + +| **GPUs** | **Batch size / GPU** | **Accuracy - FP32** | **Accuracy - mixed precision** | **Time to Train - FP32 (Hrs)** | **Time to Train - mixed precision (Hrs)** | +|:---:|:----:|:----:|:---:|:----:|:----:| +| 16 | 4 |90.94|90.84|0.44|0.16| + + +##### Training stability test + +###### Pre-training stability test: NVIDIA DGX-2 (512x V100 32G) + +The following tables compare `Final Loss` scores across 5 different training runs with different seeds, for both FP16. The runs showcase consistent convergence on all 5 seeds with very little deviation. + +| **FP16, 512x GPUs** | **seed 1** | **seed 2** | **seed 3** | **seed 4** | **seed 5** | **mean** | **std** | +|:-----------:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|Final Loss |1.57 |1.598 |1.614 |1.583 |1.584 |1.5898|0.017 | + +###### Fine-tuning SQuAD stability test: NVIDIA DGX-2 (16x V100 32G) + +The following tables compare `F1` scores across 5 different training runs with different seeds, for both FP16 and FP32 respectively. The runs showcase consistent convergence on all 5 seeds with very little deviation. + +| **FP16, 8x GPUs** | **seed 1** | **seed 2** | **seed 3** | **seed 4** | **seed 5** | **mean** | **std** | +|:-----------:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|F1 |90.99|90.67|91.00|90.91|90.61|90.84|0.18| +|Exact match|84.12|83.60|84.02|84.05|83.47|83.85|0.29| + +| **FP32, 8x GPUs** | **seed 1** | **seed 2** | **seed 3** | **seed 4** | **seed 5** | **mean** | **std** | +|:-----------:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +|F1 |90.74|90.82|91.09|91.16|90.89|90.94|0.18 | +|Exact match|83.82|83.64|84.03|84.23|84.03|83.95|0.23 | + + +#### Training performance results + +##### Training performance: NVIDIA DGX-1 (8x V100 16G) + +###### Pre-training training performance: single-node on 16G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 16G GPUs. Performance (in sentences per second) is the steady state throughput. + + +| **GPUs** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 16,8 | 91.30 | 23.90 | 3.82 | 1.00 | 1.00 | +| 4 | 128 | 16,8 | 297.70 | 86.90 | 3.43 | 3.26 | 3.64 | +| 8 | 128 | 16,8 | 578.60 | 167.80 | 3.45 | 6.34 | 7.02 | +| 1 | 512 | 4,1 | 20.00 | 4.00 | 5.00 | 1.00 | 1.00 | +| 4 | 512 | 4,1 | 66.80 | 13.50 | 4.95 | 3.34 | 3.38 | +| 8 | 512 | 4,1 | 129.50 | 26.30 | 4.92 | 6.48 | 6.58 | + +Note: The respective values for FP32 runs that use a batch size of 16, 4 in sequence lengths 128 and 512 respectively are not available due to out of memory errors that arise. + +###### Pre-training training performance: multi-node on 16G + +Our results were obtained by running the `run.sub` training script in the TensorFlow 19.08-py3 NGC container using multiple NVIDIA DGX-1 with 8x V100 16G GPUs. Performance (in sentences per second) is the steady state throughput. + +| **Nodes** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 16,4 | 571.877 | 109.366 | 5.229019988 | 1.00 | 1.00 | +| 4 | 128 | 16,4 | 2028.85 | 386.23 | 5.252958082 | 3.55 | 3.53 | +| 16 | 128 | 16,4 | 7299.88 | 1350.49 | 5.405356574 | 12.76 | 12.35 | +| 32 | 128 | 16,4 | 13917.37 | 2555.25 | 5.446578613 | 24.34 | 23.36 | +| 1 | 512 | 4,1 | 128.94 | 25.65 | 5.026900585 | 1.00 | 1.00 | +| 4 | 512 | 4,1 | 466 | 92.36 | 5.045474231 | 3.61 | 3.60 | +| 16 | 512 | 4,1 | 1632 | 325.22 | 5.018141566 | 12.66 | 12.68 | +| 32 | 512 | 4,1 | 3076 | 614.18 | 5.008303755 | 23.86 | 23.94 | + +Note: The respective values for FP32 runs that use a batch size of 16, 2 in sequence lengths 128 and 512 respectively are not available due to out of memory errors that arise. + +###### Fine-tuning training performance for SQuAD on 16G + +Our results were obtained by running the `scripts/run_squad.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 16G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + +| **GPUs** | **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|:---:|:---:|:------:|:-----:|:----:|:----:|:----:| +| 1 | 3,2 | 17.17 | 7.35 | 2.336054422 | 1.00 | 1.00 | +| 4 | 3,2 | 50.68 | 26.38 | 1.921152388 | 3.59 | 2.95 | +| 8 | 3,2 | 89.98 | 50.17 | 1.793502093 | 6.83 | 5.24 | + +Note: The respective values for FP32 runs that use a batch size of 3 are not available due to out of memory errors that arise. Batch size of 3 is only available on using FP16. + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +##### Training performance: NVIDIA DGX-1 (8x V100 32G) + +###### Pre-training training performance: single-node on 32G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 32G GPUs. Performance (in sentences per second) is the steady state throughput. + +| **GPUs** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 48,32 | 140.30 | 34.30 | 4.09 | 1.00 | 1.00 | +| 4 | 128 | 48,32 | 504.40 | 131.70 | 3.83 | 3.60 | 3.84 | +| 8 | 128 | 48,32 | 986.80 | 260.10 | 3.79 | 7.03 | 7.58 | +| 1 | 512 | 8,4 | 25.60 | 6.50 | 3.94 | 1.00 | 1.00 | +| 4 | 512 | 8,4 | 89.90 | 24.70 | 3.64 | 3.51 | 3.80 | +| 8 | 512 | 8,4 | 176.70 | 48.60 | 3.64 | 6.90 | 7.48 | + +Note: The respective values for FP32 runs that use a batch size of 48, 8 in sequence lengths 128 and 512 respectively are not available due to out of memory errors that arise. + +###### Fine-tuning training performance for SQuAD on 32G + +Our results were obtained by running the `scripts/run_squad.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 32G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + + +| **GPUs** | **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|---|---|-----|------|----|----|----| +| 1 | 10,4 | 33.79 | 9 | 3.754444444 | 1.00 | 1.00 | +| 4 | 10,4 | 103.38 | 32.5 | 3.180923077 | 3.61 | 3.06 | +| 8 | 10,4 | 172.46 | 63.54 | 2.714195782 | 7.06 | 5.10 | + +Note: The respective values for FP32 runs that use a batch size of 10 are not available due to out of memory errors that arise. Batch size of 10 is only available on using FP16. + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +##### Training performance: NVIDIA DGX-2 (16x V100 32G) + +###### Pre-training training performance: single-node on DGX-2 32G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 16x V100 32G GPUs. Performance (in sentences per second) is the steady state throughput. + +| **GPUs** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 48,32 | 143.20 | 36.30 | 3.94 | 1.00 | 1.00 | +| 4 | 128 | 48,32 | 538.30 | 141.50 | 3.80 | 3.76 | 3.90 | +| 8 | 128 | 48,32 | 1057.30 | 281.30 | 3.76 | 7.38 | 7.75 | +| 16 | 128 | 48,32 | 1990.70 | 516.80 | 3.85 | 13.90 | 14.24 | +| 1 | 512 | 8,4 | 26.90 | 6.90 | 3.90 | 1.00 | 1.00 | +| 4 | 512 | 8,4 | 96.30 | 26.40 | 3.65 | 3.58 | 3.83 | +| 8 | 512 | 8,4 | 189.00 | 52.40 | 3.61 | 7.03 | 7.59 | +| 16 | 512 | 8,4 | 354.30 | 96.50 | 3.67 | 13.17 | 13.99 | + +Note: The respective values for FP32 runs that use a batch size of 48, 8 in sequence lengths 128 and 512 respectively are not available due to out of memory errors that arise. + +###### Pre-training training performance: multi-node on DGX-2H 32G + +Our results were obtained by running the `run.sub` training script in the TensorFlow 19.08-py3 NGC container using multiple NVIDIA DGX-2 with 16x V100 32G GPUs. Performance (in sentences per second) is the steady state throughput. + + +| **Nodes** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 32,32 | 1758.32 | 602.22 | 2.92 | 1.00 | 1.00 | +| 4 | 128 | 32,32 | 6379.94 | 2261.10 | 2.82 | 3.63 | 3.75 | +| 16 | 128 | 32,32 | 23846.92 | 8875.42 | 2.69 | 13.56 | 14.74 | +| 32 | 128 | 32,32 | 46191.78 | 17445.53 | 2.65 | 26.27 | 28.97 | +| 64 | 128 | 32,32 | 89195.63 | 34263.71 | 2.60 | 50.73 | 56.90 | +| 1 | 512 | 8,4 | 383.35 | 109.97 | 3.49 | 1.00 | 1.00 | +| 4 | 512 | 8,4 | 1408.75 | 400.93 | 3.51 | 3.67 | 3.65 | +| 16 | 512 | 8,4 | 5344.10 | 1559.96 | 3.43 | 13.94 | 14.19 | +| 32 | 512 | 8,4 | 10323.75 | 3061.39 | 3.37 | 26.93 | 27.84 | +| 64 | 512 | 8,4 | 19766.57 | 6029.48 | 3.28 | 51.56 | 54.83 | + + +###### Fine-tuning training performance for SQuAD on DGX-2 32G + +Our results were obtained by running the `scripts/run_squad.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 16x V100 32G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + +| **GPUs** | **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|---|---|------|------|----|-----|-----| +| 1 | 10,4 | 36.30 | 9.59 | 3.785192909 | 1.00 | 1.00 | +| 4 | 10,4 | 115.67 | 35.46 | 3.261985336 | 3.70 | 3.19 | +| 8 | 10,4 | 197.16 | 68.00 | 2.899411765 | 7.09 | 5.43 | +| 16 | 10,4 | 304.72 | 111.62 | 2.729976707 | 11.64 | 8.39 | + + +Note: The respective values for FP32 runs that use a batch size of 10 are not available due to out of memory errors that arise. Batch size of 10 is only available on using FP16. + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +#### Inference performance results + +##### Inference performance: NVIDIA DGX-1 (1x V100 16G) + +###### Pre-training inference performance on 16G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` script in the TensorFlow 19.06-py3 NGC container on NVIDIA DGX-1 with 1x V100 16G GPUs. + +| **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | +|:-----:|:-------:|:-------:|:-------:|:-------------:| +|128 |8, 8 |349.51 | 104.31 | 3.35 | + +###### Fine-tuning inference performance for SQuAD on 16G + +Our results were obtained by running the `scripts/finetune_inference_benchmark.sh` script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 1x V100 16G GPUs. Performance numbers (throughput in sentences per second and latency in milliseconds) were averaged from 1024 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining. + +BERT LARGE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 95.87 | 1.433462919 | 10.43 | 10.61 | 10.71 | 11.27 | +| 128 | 2 | 168.02 | 1.871046771 | 11.9 | 12.08 | 12.18 | 12.32 | +| 128 | 4 | 263.08 | 2.617451 | 15.2 | 14.86 | 14.95 | 15.55 | +| 128 | 8 | 379.78 | 3.414366628 | 21.07 | 20.94 | 21.03 | 21.49 | +| 384 | 1 | 67.52 | 2.274932615 | 14.81 | 14.93 | 15.05 | 15.38 | +| 384 | 2 | 93.8 | 2.929419113 | 21.32 | 20.75 | 20.83 | 21.43 | +| 384 | 4 | 118.97 | 3.397201599 | 33.62 | 33.17 | 33.37 | 33.85 | +| 384 | 8 | 138.43 | 3.838879645 | 57.79 | 57 | 57.38 | 58.19 | + +BERT LARGE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 66.88 | 14.95 | 14.96 | 15.41 | 18.02 | +| 128 | 2 | 89.8 | 22.27 | 22.46 | 22.53 | 22.84 | +| 128 | 4 | 100.51 | 39.8 | 39.91 | 40.06 | 41.04 | +| 128 | 8 | 111.23 | 71.92 | 72.42 | 72.58 | 73.63 | +| 384 | 1 | 29.68 | 33.7 | 33.85 | 33.91 | 34.62 | +| 384 | 2 | 32.02 | 62.47 | 63.06 | 63.28 | 63.66 | +| 384 | 4 | 35.02 | 114.21 | 114.69 | 114.82 | 115.85 | +| 384 | 8 | 36.06 | 221.86 | 222.7 | 223.03 | 223.53 | + +BERT BASE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 204.33 | 1.459187317 | 4.89 | 5.14 | 5.32 | 5.54 | +| 128 | 2 | 375.19 | 1.779501043 | 5.33 | 5.47 | 5.58 | 5.87 | +| 128 | 4 | 606.98 | 2.198645271 | 6.59 | 6.49 | 6.55 | 6.83 | +| 128 | 8 | 902.6 | 2.69023278 | 8.86 | 8.62 | 8.72 | 9.22 | +| 384 | 1 | 154.33 | 1.990070922 | 6.48 | 6.59 | 6.65 | 7.04 | +| 384 | 2 | 225.7 | 2.386087324 | 8.86 | 8.45 | 8.53 | 9.16 | +| 384 | 4 | 317.93 | 3.044431677 | 12.58 | 12.34 | 12.39 | 13.01 | +| 384 | 8 | 393.44 | 3.672547372 | 20.33 | 20.06 | 20.38 | 21.38 | + +BERT BASE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 140.03 | 7.14 | 7.6 | 7.78 | 7.97 | +| 128 | 2 | 210.84 | 9.49 | 9.59 | 9.65 | 10.57 | +| 128 | 4 | 276.07 | 14.49 | 14.61 | 14.71 | 15.16 | +| 128 | 8 | 335.51 | 23.84 | 23.79 | 23.89 | 24.94 | +| 384 | 1 | 77.55 | 12.89 | 13.01 | 13.05 | 14.26 | +| 384 | 2 | 94.59 | 21.14 | 21.14 | 21.23 | 21.86 | +| 384 | 4 | 104.43 | 38.3 | 38.38 | 38.45 | 39.15 | +| 384 | 8 | 107.13 | 74.68 | 75.05 | 75.19 | 76.2 | + + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +##### Inference performance: NVIDIA DGX-1 (1x V100 32G) + +###### Pre-training inference performance on 32G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 1x V100 32G GPUs. + +| **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | +|:-----:|:-------:|:-------:|:-------:|:-------------:| +|128 |8, 8 |345.50 | 101.84 | 3.39 | + +###### Fine-tuning inference performance for SQuAD on 32G + +Our results were obtained by running the `scripts/finetune_inference_benchmark.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 1x V100 32G GPUs. Performance numbers (throughput in sentences per second and latency in milliseconds) were averaged from 1024 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining. + +BERT LARGE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 87.75 | 1.352913969 | 11.4 | 11.46 | 18.77 | 19.06 | +| 128 | 2 | 159.87 | 1.833161335 | 12.51 | 12.69 | 12.79 | 12.98 | +| 128 | 4 | 254.65 | 2.622014003 | 15.71 | 15.49 | 15.59 | 16.03 | +| 128 | 8 | 365.51 | 3.377783939 | 21.89 | 21.72 | 21.94 | 23.79 | +| 384 | 1 | 63.11 | 2.153924915 | 15.84 | 17.3 | 19.22 | 19.37 | +| 384 | 2 | 89.61 | 2.884132604 | 22.32 | 21.83 | 21.96 | 23.8 | +| 384 | 4 | 114.9 | 3.395390071 | 34.81 | 34.33 | 34.47 | 35.15 | +| 384 | 8 | 132.79 | 3.814708417 | 60.25 | 59.4 | 59.77 | 60.7 | + +BERT LARGE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 64.86 | 15.42 | 16.32 | 17.55 | 20.89 | +| 128 | 2 | 87.21 | 22.93 | 23.06 | 24.17 | 31.93 | +| 128 | 4 | 97.12 | 41.19 | 41.38 | 41.5 | 44.13 | +| 128 | 8 | 108.21 | 73.93 | 74.34 | 74.48 | 74.77 | +| 384 | 1 | 29.3 | 34.13 | 34.21 | 34.25 | 34.76 | +| 384 | 2 | 31.07 | 64.38 | 64.83 | 64.95 | 65.42 | +| 384 | 4 | 33.84 | 118.22 | 119.01 | 119.57 | 120.06 | +| 384 | 8 | 34.81 | 229.84 | 230.72 | 231.22 | 232.96 | + +BERT BASE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 198.72 | 1.393352966 | 5.03 | 5.3 | 5.47 | 5.69 | +| 128 | 2 | 338.44 | 1.611158717 | 5.91 | 6.04 | 9.77 | 9.94 | +| 128 | 4 | 599.62 | 2.24804109 | 6.67 | 6.6 | 6.66 | 6.83 | +| 128 | 8 | 858.56 | 2.63370042 | 9.32 | 10.01 | 10.04 | 10.39 | +| 384 | 1 | 150.28 | 1.948146228 | 6.65 | 6.76 | 6.82 | 7.21 | +| 384 | 2 | 200.68 | 2.200197347 | 9.97 | 9.88 | 9.94 | 10.08 | +| 384 | 4 | 305.72 | 3.01707293 | 13.08 | 12.86 | 12.97 | 13.71 | +| 384 | 8 | 373.64 | 3.61249154 | 21.41 | 21.98 | 22.03 | 22.61 | + +BERT BASE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 142.62 | 7.01 | 7.07 | 7.44 | 9.23 | +| 128 | 2 | 210.06 | 9.52 | 9.63 | 9.69 | 10.22 | +| 128 | 4 | 266.73 | 15 | 15.77 | 15.91 | 16.79 | +| 128 | 8 | 325.99 | 24.54 | 24.52 | 24.6 | 25 | +| 384 | 1 | 77.14 | 12.96 | 13.01 | 13.03 | 13.67 | +| 384 | 2 | 91.21 | 21.93 | 21.93 | 21.99 | 22.31 | +| 384 | 4 | 101.33 | 39.47 | 39.69 | 39.82 | 40.88 | +| 384 | 8 | 103.43 | 77.34 | 77.76 | 77.9 | 78.45 | + + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +##### Inference performance: NVIDIA DGX-2 (1x V100 32G) + +###### Pre-training inference performance on DGX-2 32G + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 1x V100 32G GPUs. + +| **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | +|:-----:|:-------:|:-------:|:-------:|:-------------:| +|128 |8, 8 |366.24 | 107.88 | 3.39 | + +###### Fine-tuning inference performance for SQuAD on DGX-2 32G + +Our results were obtained by running the `scripts/finetune_inference_benchmark.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 1x V100 32G GPUs. Performance numbers (throughput in sentences per second and latency in milliseconds) were averaged from 1024 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining. + +BERT LARGE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 96.22 | 1.371045882 | 10.39 | 10.78 | 10.9 | 11.43 | +| 128 | 2 | 171.66 | 1.835935829 | 11.65 | 11.86 | 12.04 | 12.45 | +| 128 | 4 | 262.89 | 2.566032211 | 15.22 | 15.13 | 15.24 | 15.91 | +| 128 | 8 | 394.23 | 3.441253492 | 20.29 | 20.22 | 20.6 | 22.19 | +| 384 | 1 | 69.69 | 2.278195489 | 14.35 | 14.39 | 14.58 | 15.68 | +| 384 | 2 | 96.35 | 2.909118357 | 20.76 | 20.25 | 20.32 | 21.54 | +| 384 | 4 | 124.06 | 3.42612538 | 32.24 | 31.87 | 32.14 | 33.02 | +| 384 | 8 | 144.28 | 3.876410532 | 55.45 | 54.77 | 55.16 | 55.93 | + +BERT LARGE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 70.18 | 14.25 | 14.7 | 14.88 | 15.35 | +| 128 | 2 | 93.5 | 21.39 | 21.83 | 22.04 | 22.85 | +| 128 | 4 | 102.45 | 39.04 | 39.28 | 39.42 | 40.5 | +| 128 | 8 | 114.56 | 69.83 | 70.5 | 70.74 | 72.78 | +| 384 | 1 | 30.59 | 32.69 | 33.14 | 33.32 | 33.86 | +| 384 | 2 | 33.12 | 60.38 | 60.91 | 61.12 | 61.67 | +| 384 | 4 | 36.21 | 110.46 | 111.1 | 111.26 | 112.15 | +| 384 | 8 | 37.22 | 214.95 | 215.69 | 216.13 | 217.96 | + +BERT BASE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 207.01 | 1.455050257 | 4.83 | 5.23 | 5.38 | 5.59 | +| 128 | 2 | 405.92 | 1.808429119 | 4.93 | 4.99 | 5.04 | 5.2 | +| 128 | 4 | 646.8 | 2.258695349 | 6.18 | 6.06 | 6.14 | 6.55 | +| 128 | 8 | 909.41 | 2.616781285 | 8.8 | 8.86 | 8.96 | 9.52 | +| 384 | 1 | 153.97 | 1.959653812 | 6.49 | 6.88 | 7.01 | 7.2 | +| 384 | 2 | 229.46 | 2.366298855 | 8.72 | 8.57 | 8.67 | 8.97 | +| 384 | 4 | 333.2 | 3.078913325 | 12 | 11.74 | 11.85 | 12.86 | +| 384 | 8 | 403.02 | 3.646579805 | 19.85 | 19.83 | 20 | 21.11 | + +BERT BASE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 142.27 | 7.03 | 7.39 | 7.45 | 11.7 | +| 128 | 2 | 224.46 | 8.91 | 9 | 9.08 | 9.66 | +| 128 | 4 | 286.36 | 13.97 | 14.46 | 14.52 | 14.82 | +| 128 | 8 | 347.53 | 23.02 | 23.23 | 23.4 | 24.12 | +| 384 | 1 | 78.57 | 12.73 | 13.01 | 13.1 | 14.06 | +| 384 | 2 | 96.97 | 20.62 | 21 | 21.15 | 21.82 | +| 384 | 4 | 108.22 | 36.96 | 37.05 | 37.18 | 38.12 | +| 384 | 8 | 110.52 | 72.38 | 73.06 | 73.32 | 74.64 | + + +##### Inference performance: NVIDIA Tesla T4 (1x T4 16G) + +###### Fine-tuning inference performance for SQuAD on Tesla T4 16G + +Our results were obtained by running the `scripts/finetune_inference_benchmark.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA Tesla T4 with 1x T4 16G GPUs. Performance numbers (throughput in sentences per second and latency in milliseconds) were averaged from 1024 iterations. Latency is computed as the time taken for a batch to process as they are fed in one after another in the model ie no pipelining. + +BERT LARGE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 54.53 | 1.552234557 | 18.34 | 19.09 | 19.28 | 21.74 | +| 128 | 2 | 95.59 | 2.521498285 | 20.92 | 21.86 | 22.61 | 23.33 | +| 128 | 4 | 133.2 | 3.434760186 | 30.03 | 30.32 | 30.43 | 31.06 | +| 128 | 8 | 168.85 | 4.352926012 | 47.38 | 48.21 | 48.56 | 49.25 | +| 384 | 1 | 33.58 | 2.87008547 | 29.78 | 30.3 | 30.46 | 31.69 | +| 384 | 2 | 41.31 | 3.576623377 | 48.41 | 49.03 | 49.26 | 50.04 | +| 384 | 4 | 47.08 | 3.94635373 | 84.96 | 86.88 | 87.38 | 88.3 | +| 384 | 8 | 50.08 | 4.254885302 | 159.76 | 162.37 | 163.23 | 165.79 | + +BERT LARGE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 35.13 | 28.46 | 29.89 | 30.12 | 30.6 | +| 128 | 2 | 37.91 | 52.76 | 54.01 | 54.29 | 54.84 | +| 128 | 4 | 38.78 | 103.14 | 105.39 | 106.05 | 107.4 | +| 128 | 8 | 38.79 | 206.22 | 209.63 | 210.2 | 211.5 | +| 384 | 1 | 11.7 | 85.5 | 87.18 | 87.43 | 88 | +| 384 | 2 | 11.55 | 173.19 | 176.13 | 177.02 | 178.4 | +| 384 | 4 | 11.93 | 335.41 | 340.26 | 341.76 | 343.54 | +| 384 | 8 | 11.77 | 679.77 | 686.01 | 686.79 | 689.24 | + +BERT BASE FP16 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Throughput speedup (FP32 to mixed precision) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|----------------------------------------------|---------------------|-----------------|-----------------|-----------------| +| 12.71 | 13.1 | 13.22 | 1.552234557 | 18.34 | 19.09 | 19.28 | 21.74 | +| 11.16 | 12.85 | 12.97 | 2.521498285 | 20.92 | 21.86 | 22.61 | 23.33 | +| 11.82 | 11.9 | 13.21 | 3.434760186 | 30.03 | 30.32 | 30.43 | 31.06 | +| 17.88 | 18.08 | 18.82 | 4.352926012 | 47.38 | 48.21 | 48.56 | 49.25 | +| 11.83 | 12.95 | 15.44 | 2.87008547 | 29.78 | 30.3 | 30.46 | 31.69 | +| 16.91 | 17.08 | 19.38 | 3.576623377 | 48.41 | 49.03 | 49.26 | 50.04 | +| 28.89 | 29.23 | 30.84 | 3.94635373 | 84.96 | 86.88 | 87.38 | 88.3 | +| 54.58 | 55.19 | 56.31 | 4.254885302 | 159.76 | 162.37 | 163.23 | 165.79 | + +BERT BASE FP32 + +| Sequence Length | Batch Size | Throughput-Average(sent/sec) | Latency-Average(ms) | Latency-90%(ms) | Latency-95%(ms) | Latency-99%(ms) | +|-----------------|------------|------------------------------|---------------------|-----------------|-----------------|-----------------| +| 128 | 1 | 64.15 | 15.59 | 19.77 | 21.03 | 21.82 | +| 128 | 2 | 110.69 | 18.07 | 18.92 | 20.77 | 21.6 | +| 128 | 4 | 125.8 | 31.8 | 32.82 | 33.11 | 33.93 | +| 128 | 8 | 127.55 | 62.72 | 63.9 | 64.28 | 65.25 | +| 384 | 1 | 35.46 | 28.2 | 28.83 | 28.95 | 29.43 | +| 384 | 2 | 37.15 | 53.83 | 54.75 | 55.08 | 56.01 | +| 384 | 4 | 36.86 | 108.53 | 110.57 | 111.16 | 112.48 | +| 384 | 8 | 36.1 | 221.61 | 225.94 | 226.94 | 228.58 | + + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +## Release notes + +### Changelog + +November 2019 +- Pre-training and Finetuning on BioMedical tasks and corpus + +October 2019 +- Disabling Grappler Optimizations for improved performance + +September 2019 +- Pre-training using LAMB +- Multi Node support +- Fine Tuning support for GLUE (CoLA, MNLI, MRPC) + +July 2019 +- Results obtained using 19.06 +- Inference Studies using TensorRT Inference Server + +March 2019 +- Initial release + +### Known issues + + +- There is a known performance regression with the 19.08 release on Tesla V100 boards with 16 GB memory, smaller batch sizes may be a better choice for this model on these GPUs with the 19.08 release. 32 GB GPUs are not affected. diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/__init__.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/__init__.py new file mode 100644 index 0000000..effb57b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/README.md new file mode 100644 index 0000000..f29dd7a --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/README.md @@ -0,0 +1,567 @@ +# BioBert For TensorFlow + +This folder provides a script and recipe to train BERT for TensorFlow to achieve state-of-the-art accuracy on *biomedical text-mining* and is tested and maintained by NVIDIA. + +## Table Of Contents + +* [Model overview](#model-overview) +* [Quick Start Guide](#quick-start-guide) +* [Advanced](#advanced) + * [Scripts and sample code](#scripts-and-sample-code) + * [Parameters](#parameters) + * [Command-line options](#command-line-options) + * [Getting the data](#getting-the-data) + * [Dataset guidelines](#dataset-guidelines) + * [Multi-dataset](#multi-dataset) + * [Training process](#training-process) + * [Pre-training](#pre-training) + * [Fine tuning](#fine-tuning) + * [Multi-node](#multi-node) + * [Inference process](#inference-process) +* [Performance](#performance) + * [Benchmarking](#benchmarking) + * [Training performance benchmark](#training-performance-benchmark) + * [Inference performance benchmark](#inference-performance-benchmark) +* [Results](#results) + * [Training accuracy results](#training-accuracy-results) + * [Pre-training accuracy](#pre-training-accuracy) + * [Fine-tuning accuracy](#fine-tuning-accuracy) + * [Fine-tuning accuracy for NER Chem](#fine-tuning-accuracy-for-ner-chem) + * [Training stability test](#training-stability-test) + * [Fine-tuning stability test](#fine-tuning-stability-test) + * [Training performance results](#training-performance-results) + * [Training performance: NVIDIA DGX-1 (8x V100 16G)](#training-performance-nvidia-dgx-1-8x-v100-16g) + * [Pre-training training performance: multi-node on 16G](#pre-training-training-performance-multi-node-on-16g) + * [Fine-tuning training performance for NER on 16G](#fine-tuning-training-performance-for-ner-on-16g) + * [Training performance: NVIDIA DGX-1 (8x V100 32G)](#training-performance-nvidia-dgx-1-8x-v100-32g) + * [Fine-tuning training performance for NER on 32G](#fine-tuning-training-performance-for-ner-on-32g) + * [Training performance: NVIDIA DGX-2 (16x V100 32G)](#training-performance-nvidia-dgx-2-16x-v100-32g) + * [Pre-training training performance: multi-node on DGX-2 32G](#pre-training-training-performance-multi-node-on-dgx-2-32g) + * [Fine-tuning training performance for NER on DGX-2 32G](#fine-tuning-training-performance-for-ner-on-dgx-2-32g) +* [Release notes](#release-notes) + * [Changelog](#changelog) + * [Known issues](#known-issues) + + + +## Model overview + +In the original [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) paper, pre-training is done on [Wikipedia](https://dumps.wikimedia.org/) and [Books Corpus](http://yknzhu.wixsite.com/mbweb), with state-of-the-art results demonstrated on [SQuAD](https://rajpurkar.github.io/SQuAD-explorer/) (Stanford Question Answering Dataset) benchmark. + +Meanwhile, many works, including [BioBERT](https://arxiv.org/pdf/1901.08746.pdf), [SciBERT](https://arxiv.org/pdf/1903.10676.pdf), [NCBI-BERT](https://arxiv.org/pdf/1906.05474.pdf), [ClinicalBERT (MIT)](https://arxiv.org/pdf/1904.03323.pdf), [ClinicalBERT (NYU, Princeton)](https://arxiv.org/pdf/1904.05342.pdf), and others at [BioNLP’19 workshop](https://aclweb.org/aclwiki/BioNLP_Workshop), show that additional pre-training of BERT on large biomedical text corpus such as [PubMed](https://www.ncbi.nlm.nih.gov/pubmed/) results in better performance in biomedical text-mining tasks. + +This repository provides scripts and recipe to adopt the [NVIDIA BERT code-base](https://github.com/NVIDIA/DeepLearningExamples/tree/master/TensorFlow/LanguageModeling/BERT) to achieve state-of-the-art results in the following biomedical text-mining benchmark tasks: + +- [BC5CDR-disease](https://biocreative.bioinformatics.udel.edu/tasks/biocreative-v/track-3-cdr/) A Named-Entity-Recognition task to recognize diseases mentioned in a collection of 1500 PubMed titles and abstracts ([Li et al., 2016](https://academic.oup.com/database/article/doi/10.1093/database/baw068/2630414)) + +- [BC5CDR-chemical](https://biocreative.bioinformatics.udel.edu/tasks/biocreative-v/track-3-cdr/) A Named-Entity-Recognition task to recognize chemicals mentioned in a collection of 1500 PubMed titles and abstracts ([Li et al., 2016](https://academic.oup.com/database/article/doi/10.1093/database/baw068/2630414)) + +- [ChemProt](https://biocreative.bioinformatics.udel.edu/news/corpora/) A Relation-Extraction task to determine chemical-protein interactions in a collection of 1820 PubMed abstracts ([Krallinger et al., 2017](https://biocreative.bioinformatics.udel.edu/media/store/files/2017/ProceedingsBCVI_v2.pdf?page=141)) + + +## Quick Start Guide + +To pretrain or fine tune your model for BioMedical tasks using mixed precision with Tensor Cores or using FP32, perform the following steps using the default parameters of the BERT model. + +1. Clone the repository. + +```bash +git clone https://github.com/NVIDIA/DeepLearningExamples +cd DeepLearningExamples/TensorFlow/LanguageModeling/BERT +``` + +2. Build the BERT TensorFlow NGC container. + +```bash +bash scripts/docker/build.sh +``` + +3. Download and preprocess the PubMed dataset. + +To download and preprocess pre-training data as well as the required vocab files, run the following script: + + +```bash +bash biobert/scripts/biobert_data_download.sh +``` + +Datasets for finetuning can be obtained from this [repository](https://github.com/ncbi-nlp/BLUE_Benchmark/releases/tag/0.1) + +Place them in `/workspace/bert/data/biobert/` to be automatically picked up by our scripts. + +4. Start an interactive session in the NGC container to run training/inference. + +After you build the container image and download the data, you can start an interactive CLI session as follows: + +```bash +bash scripts/docker/launch.sh +``` + +5. Download the pre-trained checkpoint, vocabulary, and configuration files. + +We have uploaded checkpoints for fine tuning and pre-training on BioMedical Corpus’s on the NGC Model Registry. You can download them directly from the [NGC model catalog](https://ngc.nvidia.com/catalog/models). + +Place our `BioBERT checkpoints` in the `results/` to easily access it in your scripts. + +6. Start pre-training. + +From within the container, you can use the following script to run the 1st phase of the pre-training using cased vocabulary: + +```bash +bash biobert/scripts/run_pretraining-pubmed_base_phase_1.sh +``` + +For the 2nd phase of the pre-training, issue: + +```bash +bash biobert/scripts/run_pretraining-pubmed_base_phase_2.sh +``` + + +Refer to (MultiNode Section)[multi-node] for details on utilizing multiple nodes for faster pretraining. + +6. Start fine tuning. + +The above pretrained BERT representations can be fine tuned with just one additional output layer for a state-of-the-art biomedical text-mining system. +From within the container, you can use the following script to run fine-training for NER. + +Note: The scripts assume you are running on 16 V100 32GB GPUs. If you are running on GPU having less than 32GB memory or fewer GPUs, batch size, learning rate and number of GPUs needs to be adjusted. + +For NER on disease entities: + +```bash +bash biobert/scripts/ner_bc5cdr-disease.sh +``` + +For NER on chemical entities: + +```bash +bash biobert/scripts/ner_bc5cdr-chem.sh +``` + +For relation extraction, issue: + +``` +bash biobert/scripts/rel_chemprot.sh +``` + +8. Start validation/evaluation. + +The `biobert/scripts/run_biobert_finetuning_inference.sh` script runs inference on a checkpoint fine tuned for a specific task and evaluates the validity of predictions on the basis of F1, precision and recall scores. + +```bash +bash biobert/scripts/run_biobert_finetuning_inference.sh +``` + +For FP16 inference for NER on BC5DR Chemical task with XLA using a DGX-2 V100 32G, run: +```bash +bash biobert/scripts/run_biobert_finetuning_inference.sh ner_bc5cdr-chem /results/model.ckpt base false fp16 true 16 +``` + +Tasks `ner_bc5cdr-chem`, `ner_bc5cdr-disease` and `rel_chemprot` are currently supported. + +## Advanced + +The following sections provide greater details of the dataset, running training and inference, and the training results. + +### Scripts and sample code + +In addition to BERT TensorFlow files, the most important files added for NER and RE fine tuning tasks are: +* `run_ner.py` - Serves as an entry point for NER training. +* `run_re.py` - Serves as an entry point for RE training. + +The `biobert/scripts/` folder encapsulates all the one-click scripts required for running various functionalities supported such as: +* `ner_bc5cdr-chem.sh` - Runs NER training and inference on the BC5CDR Chemical dataset using the `run_ner.py` file. +* `ner_bc5cdr-disease.sh` - Runs NER training and inference on the BC5CDR Disease dataset using the `run_ner.py` file. +* `rel_chemprot.sh` - Runs RE training and inference on the ChemProt dataset using the `run_re.py` file. +* `run_pretraining_pubmed_base_phase_*.sh` - Runs pre-training with LAMB optimizer using the `run_pretraining.py` file in two phases. Phase 1 does training with sequence length = 128. In phase 2, the remaining 10% of the training is done with sequence length = 512. +* `biobert_data_download.sh` - Downloads the PubMed dataset and Vocab files using files in the `data/` folder. +* `run_biobert_finetuning_inference.sh` - Runs task specific inference using a fine tuned checkpoint. + + +### Parameters + +Aside from the options to set hyperparameters, some relevant options to control the behaviour of the `run_ner.py` and `run_re.py` scripts are: + +``` + --bert_config_file: The config json file corresponding to the pre-trained BERT model. This specifies the model architecture. +--vocab_file: The vocabulary file that the BERT model was trained on. + --output_dir: The output directory where the model checkpoints will be written. + --[no]do_eval: Whether to run evaluation on the dev set. (default: 'false') + --[no]do_predict: Whether to run evaluation on the test set. (default: 'false') + --[no]do_train: Whether to run training. (default: 'false') + --learning_rate: The initial learning rate for Adam.(default: '5e-06')(a number) + --max_seq_length: The maximum total input sequence length after WordPiece tokenization. Sequences longer than this will be truncated, and sequences shorter than this will be padded.(default: '384')(an integer) + --predict_batch_size: Total batch size for predictions.(default: '8')(an integer) + --train_batch_size: Total batch size for training (default: '8')(an integer) + --[no]use_fp16: Whether to enable AMP ops.(default: 'false') + --[no]use_xla: Whether to enable XLA JIT compilation.(default: 'false') +--init_checkpoint: Initial checkpoint (usually from a pre-trained BERT model). +--num_train_epochs: Total number of training epochs to perform.(default: '3.0')(a number) + +``` + +Note: When initializing from a checkpoint using `--init_checkpoint` and a corpus of your choice, keep in mind that `bert_config_file` and `vocab_file` should remain unchanged. + +### Command-line options + +To see the full list of available options and their descriptions, use the `-h` or `--help` command-line option with the Python file, for example: + +```bash +python run_ner.py --help +python run_re.py --help +``` +### Getting the data + +For pre-training BERT, we use the PubMed Dataset. For PubMed, we extract the xml files which are structured as a document level corpus rather than a shuffled sentence level corpus because it is critical to extract long contiguous sentences. + +The next step is to run `create_pretraining_data.py` with the document level corpus as input, which generates input data and labels for the masked language modeling and next sentence prediction tasks. Pre-training can also be performed on any corpus of your choice. The collection of data generation scripts are intended to be modular to allow modifications for additional preprocessing steps or to use additional data. They can hence easily be modified for an arbitrary corpus. + +The preparation of an individual pre-training dataset is described in the `create_biobert_datasets_from_start.sh ` script found in the `data/` folder. The component steps to prepare the datasets are as follows: + +1. Data download and extract - the dataset is downloaded and extracted. +2. Clean and format - document tags, etc. are removed from the dataset. The end result of this step is a `{dataset_name_one_article_per_line}.txt` file that contains the entire corpus. Each line in the text file contains an entire document from the corpus. One file per dataset is created in the `formatted_one_article_per_line` folder. +3. Sharding - the sentence segmented corpus file is split into a number of smaller text documents. The sharding is configured so that a document will not be split between two shards. Sentence segmentation is performed at this time using NLTK. +4. TFRecord file creation - each text file shard is processed by the `create_pretraining_data.py` script to produce a corresponding TFRecord file. The script generates input data and labels for masked language modeling and sentence prediction tasks for the input text shard. + + +For fine tuning BioBERT for the task of Named Entity Recognition and Relation Extraction Tasks, we use BC5CDR and Chemprot Datasets. BC5CDR corpus consists of 1500 PubMed articles with 4409 annotated chemicals, 5818 diseases and 3116 chemical-disease interactions. +ChemProt corpus consists of text exhaustively annotated by hand with mentions of chemical compounds/drugs and genes/proteins, as well as 22 different types of compound-protein relations focussing on 5 important relation classes. It was preprocessed following [Lim and Kang](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6014134/) guidelines. + +#### Dataset guidelines + +The procedure to prepare a text corpus for pre-training is described in the previous section. This section provides additional insight into how exactly raw text is processed so that it is ready for pre-training. + +First, raw text is tokenized using [WordPiece tokenization](https://arxiv.org/pdf/1609.08144.pdf). A [CLS] token is inserted at the start of every sequence, and the two sentences in the sequence are separated by a [SEP] token. + +Note: BERT pre-training looks at pairs of sentences at a time. A sentence embedding token [A] is added to the first sentence and token [B] to the next. + +BERT pre-training optimizes for two unsupervised classification tasks. The first is Masked Language Modelling (Masked LM). One training instance of Masked LM is a single modified sentence. Each token in the sentence has a 15% chance of being replaced by a [MASK] token. The chosen token is replaced with [MASK] 80% of the time, 10% with another random token and the remaining 10% with the same token. The task is then to predict the original token. + +The second task is next sentence prediction. One training instance of BERT pre-training is two sentences (a sentence pair). A sentence pair may be constructed by simply taking two adjacent sentences from a single document, or by pairing up two random sentences with equal probability. The goal of this task is to predict whether or not the second sentence followed the first in the original document. + +The `create_pretraining_data.py` script takes in raw text and creates training instances for both pre-training tasks. + +#### Multi-dataset + +We are able to combine multiple datasets into a single dataset for pre-training on a diverse text corpus. Once TFRecords have been created for each component dataset, you can create a combined dataset by adding the directory to `*FILES_DIR` in `run_pretraining_*.sh`. This will feed all matching files to the input pipeline in `run_pretraining.py`. However, in the training process, only one TFRecord file is consumed at a time, therefore, the training instances of any given training batch will all belong to the same source dataset. + + + +### Training process + +The training process consists of two steps: pre-training and fine tuning. + +#### Pre-training + +BERT is designed to pre-train deep bidirectional representations for language representations. The following scripts are to pre-train BERT on PubMed dataset. These scripts are general and can be used for pre-training language representations on additional corpus of biomedical text. + +Pre-training is performed using the `run_pretraining.py` script along with parameters defined in the `biobert/scripts/run_pretraining_pubmed_base_phase_1.sh` and `biobert/scripts/run_pretraining_pubmed_base_phase_2.sh` scripts. + +The `biobert/scripts/run_pretraining_pubmed_base_phase*.sh` scripts run a job on a single node that trains the BERT-base model from scratch using the PubMed Corpus dataset as training data. By default, the training script: +- Runs on 16 GPUs +- Has FP16 precision enabled +- Is XLA enabled +- Creates a log file containing all the output +- Saves a checkpoint every 5000 iterations (keeps only the latest checkpoint) and at the end of training. All checkpoints, evaluation results, and training logs are saved to the `/results` directory (in the container which can be mounted to a local directory). +- Evaluates the model at the end of each phase + +- Phase 1 + - Runs 19531 steps with 1953 warmup steps + - Sets Maximum sequence length as 128 + - Sets Global Batch size as 64K + +- Phase 2 + - Runs 4340 steps with 434 warm-up steps + - Sets Maximum sequence length as 512 + - Sets Global Batch size as 32K + - Should start from Phase1's final checkpoint + +These parameters train PubMed with reasonable accuracy on a DGX-2 with 32GB V100 cards. + +For example: +```bash +biobert/scripts/run_pretraining-pubmed_base_phase_1.sh +``` + +Where: +- `` is per-GPU batch size used for training. Batch size varies with precision, larger batch sizes run more efficiently, but require more memory. + +- `` is the default rate of 3.2e-5 is good for global batch size 64k. + +- `` is set to `true` or `false` depending on whether the model should be trained on cased or uncased data. + +- `` is the type of math in your model, can be either `fp32` or `fp16`. Specifically: + + - `fp32` is 32-bit IEEE single precision floats. + - `fp16` is Automatic rewrite of TensorFlow compute graph to take advantage of 16-bit arithmetic whenever it is safe. + +- `` is the number of GPUs to use for training. Must be equal to or smaller than the number of GPUs attached to your node. + +- `` is the number of warm-up steps at the start of training. + +- `` is the total number of training steps. + +- `` controls how often checkpoints are saved. Default is 5000 steps. + +- `` is used to mimic higher batch sizes in the respective phase by accumulating gradients N times before weight update. + +- `` is used to indicate whether to pretrain BERT Large or BERT Base model. + +- `` is per-GPU batch size used for evaluation after training. + +The following sample code trains phase 1 of BERT-base from scratch on a single DGX-2 using FP16 arithmetic and uncased data. + +```bash +biobert/scripts/run_pretraining-pubmed_base_phase_1.sh 128 3.2e-5 false fp16 true 16 1953 19531 32 5000 80 +``` + +#### Fine tuning + +Fine tuning is performed using the `run_ner.py` script along with parameters defined in `biobert/scripts/ner_bc5cdr*.sh`. + +For example, `biobert/scripts/ner_bc5cdr-chem.sh` script trains a model and performs evaluation on the BC5CDR Chemical dataset. By default, the training script: + +- Trains on BERT Base Uncased Model +- Uses 16 GPUs and batch size of 8 on each GPU +- Has FP16 precision enabled +- Is XLA enabled +- Runs for 10 epochs +- Evaluation is done at the end of training. To skip evaluation, modify `--do_eval` and `--do_predict` to `False`. + +This script outputs checkpoints to the `/results` directory, by default, inside the container. Mount point of `/results` can be changed in the `scripts/docker/launch.sh` file. The training log contains information about: +- Loss for the final step +- Training and evaluation performance +- F1, Precision and Recall on the Test Set of BC5CDR Chemical after evaluation. + +The summary after training is printed in the following format: +```bash + 0: /results/biobert_finetune_ner_chem_191028154209/test_labels.txt + 0: /results/biobert_finetune_ner_chem_191028154209/test_labels_errs.txt + 0: processed 124669 tokens with 5433 phrases; found: 5484 phrases; correct: 5102. + 0: accuracy: 99.26%; precision: 93.03%; recall: 93.91%; FB1: 93.47 + 0: : precision: 93.03%; recall: 93.91%; FB1: 93.47 5484 +``` + +Multi-GPU training is enabled with the Horovod TensorFlow module. The following example runs training on 16 GPUs: + +```bash +BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +DATA_DIR=data/biobert/BC5CDR/chem + +mpi_command="mpirun -np 16 -H localhost:16 \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" \ + python run_ner.py --horovod --use_fp16 --use_xla \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --output_dir=/results --data_dir=$DATA_DIR" +``` + +#### Multi-node + +Multi-node runs can be launched on a pyxis/enroot Slurm cluster (see [Requirements](https://github.com/NVIDIA/DeepLearningExamples/tree/master/TensorFlow/LanguageModeling/BERT#requirements)) with the `biobert/scripts/run_biobert.sub` script with the following command for a 4-node DGX2 example for both phase 1 and phase 2: + +```bash +BATCHSIZE=128 LEARNING_RATE='8e-6' NUM_ACCUMULATION_STEPS=8 PHASE=1 sbatch -N4 --ntasks-per-node=16 biobert/scripts/run_biobert.sub +BATCHSIZE=16 LEARNING_RATE='3.2e-5' NUM_ACCUMULATION_STEPS=32 PHASE=1 sbatch -N4 --ntasks-per-node=16 biobert/scripts/run_biobert.sub +``` + +Checkpoint after phase 1 will be saved in `checkpointdir` specified in `biobert/scripts/run_biobert.sub`. The checkpoint will be automatically picked up to resume training on phase 2. Note that phase 2 should be run after phase 1. + +Variables to re-run the [Training performance results](#training-performance-results) are available in the `configurations.yml` file. + +The batch variables `BATCHSIZE`, `LEARNING_RATE`, `NUM_ACCUMULATION_STEPS` refer to the Python arguments `train_batch_size`, `learning_rate`, `num_accumulation_steps` respectively. +The variable `PHASE` refers to phase specific arguments available in `biobert/scripts/run_biobert.sub`. + +Note that the `biobert/scripts/run_biobert.sub` script is a starting point that has to be adapted depending on the environment. In particular, variables such as `datadir` handle the location of the files for each phase. + +Refer to the file contents to see the full list of variables to adjust for your system. + +### Inference process + +Inference on a fine tuned model for Bio Medical tasks is performed using the `run_ner.py` or `run_re.py` script along with parameters defined in `biobert/scripts/run_biobert_finetuning_inference.sh`. Inference is supported on a single GPU. + +The `biobert/scripts/run_biobert_finetuning_inference.sh` script performs evaluation on ChemProt or BC5CDR datasets depending on the task specified. By default, the inferencing script: + +- Uses BC5CDR Chemical dataset +- Has FP16 precision enabled +- Is XLA enabled +- Evaluates the latest checkpoint present in `/results` with a batch size of 16. + +This script computes F1, Precision and Recall scores. Mount point of `/results` can be changed in the `scripts/docker/launch.sh` file. + +## Performance + +### Benchmarking + +The following section shows how to run benchmarks measuring the model performance in training and inference modes. + +Both of these benchmarking scripts enable you to run a number of epochs, extract performance numbers, and run the BERT model for fine tuning. + +#### Training performance benchmark + +Training benchmarking can be performed by running the script: +``` bash +biobert/scripts/biobert_finetune_training_benchmark.sh +``` + +This script runs 2 epochs by default on the NER BC5CDR dataset and extracts performance numbers for various batch sizes and sequence lengths in both FP16 and FP32. These numbers are saved at `/results/tf_bert_biobert__training_benchmark____num_gpu__` + +#### Inference performance benchmark + +Training benchmarking can be performed by running the script: +``` bash +biobert/scripts/biobert_finetune_inference_benchmark.sh +``` + +This script runs inference on the test and dev sets and extracts performance and latency numbers for various batch sizes and sequence lengths in both FP16 with XLA and FP32 without XLA. These numbers are saved at `/results/tf_bert_biobert__training_benchmark____num_gpu__` + +## Results + +The following sections provide detailed results of downstream fine-tuning task on NER and RE benchmark tasks. + +### Training accuracy results + +#### Pre-training accuracy + +Our results were obtained by running the `scripts/run_pretraining_lamb.sh` training script in the TensorFlow 19.08-py3 NGC container. + +| **DGX System** | **Nodes** | **Precision** | **Batch Size/GPU: Phase1, Phase2** | **Accumulation Steps: Phase1, Phase2** | **Time to Train (Hrs)** | **Final Loss** | +|----------------|-----------|---------------|------------------------------------|----------------------------------------|----------------|-------------------------| +| DGX2H | 4 | FP16 | 128, 16 | 8, 32 | 19.14 | 0.88 | +| DGX2H | 16 | FP16 | 128, 16 | 2, 8 | 4.81 | 0.86 | +| DGX2H | 32 | FP16 | 128, 16 | 1, 4 | 2.65 | 0.87 | + +#### Fine-tuning accuracy + +| **Task** | **F1** | **Precision** | **Recall** | +|:-------:|:----:|:----:|:----:| +| NER BC5CDR-chemical | 93.47 | 93.03 | 93.91 | +| NER BC5CDR-disease | 86.22 | 85.05 | 87.43 | +| RE Chemprot | 76.27 | 77.62 | 74.98 | + +##### Fine-tuning accuracy for NER Chem + +Our results were obtained by running the `biobert/scripts/ner_bc5cdr-chem.sh` training script in the TensorFlow 19.08-py3 NGC container. + +| **DGX System** | **Batch size / GPU** | **F1 - FP32** | **F1- mixed precision** | **Time to Train - FP32 (Minutes)** | **Time to Train - mixed precision (Minutes)** | +|:---:|:----:|:----:|:---:|:----:|:----:| +| DGX-1 16G | 64 |93.33|93.40|23.95|14.13| +| DGX-1 32G | 64 |93.31|93.36|24.35|12.63| +| DGX-2 32G | 64 |93.66|93.47|12.26|8.16| + + +### Training stability test + +#### Fine-tuning stability test: + +The following tables compare F1 scores scores across 5 different training runs on the NER Chemical task with different seeds, for both FP16 and FP32. The runs showcase consistent convergence on all 5 seeds with very little deviation. + +| **16 x V100 GPUs** | **seed 1** | **seed 2** | **seed 3** | **seed 4** | **seed 5** | **mean** | **std** | +|:-----------:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| +| F1 Score (FP16) | 93.13 | 92.92 | 93.34 | 93.66 | 93.47 | 93.3 | 0.29 | +| F1 Score (FP32) | 93.1 | 93.28 | 93.33 | 93.45 | 93.17 | 93.27 | 0.14 | + + +### Training performance results + +#### Training performance: NVIDIA DGX-1 (8x V100 16G) + +##### Pre-training training performance: multi-node on DGX-1 16G + +Our results were obtained by running the `biobert/scripts/run_biobert.sub` training script in the TensorFlow 19.08-py3 NGC container using multiple NVIDIA DGX-1 with 8x V100 16G GPUs. Performance (in sentences per second) is the steady state throughput. + +| **Nodes** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 64,32 | 2762.06 | 744.48 | 3.71 | 1.00 | 1.00 | +| 4 | 128 | 64,32 | 10283.08 | 2762.88 | 3.72 | 3.72 | 3.71 | +| 16 | 128 | 64,32 | 39051.69 | 10715.14 | 3.64 | 14.14 | 14.39 | +| 32 | 128 | 64,32 | 76077.39 | 21104.87 | 3.60 | 27.54 | 28.35 | +| 1 | 512 | 8,8 | 432.33 | 160.38 | 2.70 | 1.00 | 1.00 | +| 4 | 512 | 8,8 | 1593.00 | 604.36 | 2.64 | 3.68 | 3.77 | +| 16 | 512 | 8,8 | 5941.82 | 2356.44 | 2.52 | 13.74 | 14.69 | +| 32 | 512 | 8,8 | 11483.73 | 4631.29 | 2.48 | 26.56 | 28.88 | + +Note: The respective values for FP32 runs that use a batch size of 16, 2 in sequence lengths 128 and 512 respectively are not available due to out of memory errors that arise. + +##### Fine-tuning training performance for NER on DGX-1 16G + +Our results were obtained by running the `biobert/scripts/ner_bc5cdr-chem.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 16G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + +| **GPUs** | **Batch size / GPU** | **Throughput - FP32** | **Throughput - mixed precision** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|:---:|:---:|:------:|:-----:|:----:|:----:|:----:| +| 1 | 64 | 147.71 | 348.84 | 2.36 | 1.00 | 1.00 | +| 4 | 64 | 583.78 | 1145.46 | 1.96 | 3.95 | 3.28 | +| 8 | 64 | 981.22 | 1964.85 | 2.00 | 6.64 | 5.63 | + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +#### Training performance: NVIDIA DGX-1 (8x V100 32G) + + +##### Fine-tuning training performance for NER on DGX-1 32G + +Our results were obtained by running the `biobert/scripts/ner_bc5cdr-chem.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-1 with 8x V100 32G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + + +| **GPUs** | **Batch size / GPU** | **Throughput - FP32** | **Throughput - mixed precision** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|:---:|:---:|:------:|:-----:|:----:|:----:|:----:| +| 1 | 64 | 144.1 | 417.39 | 2.89 | 1.00 | 1.00 | +| 4 | 64 | 525.15 | 1354.14 | 2.57 | 3.64 | 3.24 | +| 8 | 64 | 969.4 | 2341.39 | 2.41 | 6.73 | 5.61 | + + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +#### Training performance: NVIDIA DGX-2 (16x V100 32G) + + +##### Pre-training training performance: multi-node on DGX-2H 32G + +Our results were obtained by running the `biobert/scripts/run_biobert.sub` training script in the TensorFlow 19.08-py3 NGC container using multiple NVIDIA DGX-2H with 16x V100 32G GPUs. Performance (in sentences per second) is the steady state throughput. + + +| **Nodes** | **Sequence Length**| **Batch size / GPU: mixed precision, FP32** | **Throughput - mixed precision** | **Throughput - FP32** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - mixed precision** | **Weak scaling - FP32** | +|:-------:|:-----:|:-------:|:-------:|:-------:|:-------------:|:------:|:------:| +| 1 | 128 | 128,128 | 7772.18 | 2165.04 | 3.59 | 1.00 | 1.00 | +| 4 | 128 | 128,128 | 29785.31 | 8516.90 | 3.50 | 3.83 | 3.93 | +| 16 | 128 | 128,128 | 115581.29 | 33699.15 | 3.43 | 14.87 | 15.57 | +| 32 | 128 | 128,128 | 226156.53 | 66996.73 | 3.38 | 29.10 | 30.94 | +| 64 | 128 | 128,128 | 444955.74 | 133424.95 | 3.33 | 57.25 | 61.63 | +| 1 | 512 | 16,16 | 1260.06 | 416.92 | 3.02 | 1.00 | 1.00 | +| 4 | 512 | 16,16 | 4781.19 | 1626.76 | 2.94 | 3.79 | 3.90 | +| 16 | 512 | 16,16 | 18405.65 | 6418.09 | 2.87 | 14.61 | 15.39 | +| 32 | 512 | 16,16 | 36071.06 | 12713.67 | 2.84 | 28.63 | 30.49 | +| 64 | 512 | 16,16 | 69950.86 | 25245.96 | 2.77 | 55.51 | 60.55 | + + +##### Fine-tuning training performance for NER on DGX-2 32G + +Our results were obtained by running the `biobert/scripts/ner_bc5cdr-chem.sh` training script in the TensorFlow 19.08-py3 NGC container on NVIDIA DGX-2 with 16x V100 32G GPUs. Performance (in sentences per second) is the mean throughput from 2 epochs. + +| **GPUs** | **Batch size / GPU** | **Throughput - FP32** | **Throughput - mixed precision** | **Throughput speedup (FP32 to mixed precision)** | **Weak scaling - FP32** | **Weak scaling - mixed precision** | +|:---:|:---:|:------:|:-----:|:----:|:----:|:----:| +| 1 | 64 | 139.59 | 475.54 | 3.4 | 1.00 | 1.00 | +| 4 | 64 | 517.08 | 1544.01 | 2.98 | 3.70 | 3.25 | +| 8 | 64 | 1009.84 | 2695.34 | 2.66 | 7.23 | 5.67 | +| 16 | 64 | 1997.73 | 4268.81 | 2.13 | 14.31 | 8.98 | + +To achieve these same results, follow the [Quick Start Guide](#quick-start-guide) outlined above. + +## Release notes + +### Changelog + +November 2019 +- Initial release + +### Known issues + + +- There are no known issues with the model. + + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/__init__.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/conlleval.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/conlleval.py new file mode 100644 index 0000000..d9a6471 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/conlleval.py @@ -0,0 +1,302 @@ +# Python version of the evaluation script from CoNLL'00- +# Originates from: https://github.com/spyysalo/conlleval.py + + +# Intentional differences: +# - accept any space as delimiter by default +# - optional file argument (default STDIN) +# - option to set boundary (-b argument) +# - LaTeX output (-l argument) not supported +# - raw tags (-r argument) not supported + +# add function :evaluate(predicted_label, ori_label): which will not read from file + +import sys +import re +import codecs +from collections import defaultdict, namedtuple + +ANY_SPACE = '' + + +class FormatError(Exception): + pass + +Metrics = namedtuple('Metrics', 'tp fp fn prec rec fscore') + + +class EvalCounts(object): + def __init__(self): + self.correct_chunk = 0 # number of correctly identified chunks + self.correct_tags = 0 # number of correct chunk tags + self.found_correct = 0 # number of chunks in corpus + self.found_guessed = 0 # number of identified chunks + self.token_counter = 0 # token counter (ignores sentence breaks) + + # counts by type + self.t_correct_chunk = defaultdict(int) + self.t_found_correct = defaultdict(int) + self.t_found_guessed = defaultdict(int) + + +def parse_args(argv): + import argparse + parser = argparse.ArgumentParser( + description='evaluate tagging results using CoNLL criteria', + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + arg = parser.add_argument + arg('-b', '--boundary', metavar='STR', default='-X-', + help='sentence boundary') + arg('-d', '--delimiter', metavar='CHAR', default=ANY_SPACE, + help='character delimiting items in input') + arg('-o', '--otag', metavar='CHAR', default='O', + help='alternative outside tag') + arg('file', nargs='?', default=None) + return parser.parse_args(argv) + + +def parse_tag(t): + m = re.match(r'^([^-]*)-(.*)$', t) + return m.groups() if m else (t, '') + + +def evaluate(iterable, options=None): + if options is None: + options = parse_args([]) # use defaults + + counts = EvalCounts() + num_features = None # number of features per line + in_correct = False # currently processed chunks is correct until now + last_correct = 'O' # previous chunk tag in corpus + last_correct_type = '' # type of previously identified chunk tag + last_guessed = 'O' # previously identified chunk tag + last_guessed_type = '' # type of previous chunk tag in corpus + + for i, line in enumerate(iterable): + line = line.rstrip('\r\n') + # print(line) + + if options.delimiter == ANY_SPACE: + features = line.split() + else: + features = line.split(options.delimiter) + + if num_features is None: + num_features = len(features) + elif num_features != len(features) and len(features) != 0: + raise FormatError('unexpected number of features: %d (%d) at line %d\n%s' % + (len(features), num_features, i, line)) + + if len(features) == 0 or features[0] == options.boundary: + features = [options.boundary, 'O', 'O'] + if len(features) < 3: + raise FormatError('unexpected number of features in line %s' % line) + + guessed, guessed_type = parse_tag(features.pop()) + correct, correct_type = parse_tag(features.pop()) + first_item = features.pop(0) + + if first_item == options.boundary: + guessed = 'O' + + end_correct = end_of_chunk(last_correct, correct, + last_correct_type, correct_type) + end_guessed = end_of_chunk(last_guessed, guessed, + last_guessed_type, guessed_type) + start_correct = start_of_chunk(last_correct, correct, + last_correct_type, correct_type) + start_guessed = start_of_chunk(last_guessed, guessed, + last_guessed_type, guessed_type) + + if in_correct: + if (end_correct and end_guessed and + last_guessed_type == last_correct_type): + in_correct = False + counts.correct_chunk += 1 + counts.t_correct_chunk[last_correct_type] += 1 + elif (end_correct != end_guessed or guessed_type != correct_type): + in_correct = False + + if start_correct and start_guessed and guessed_type == correct_type: + in_correct = True + + if start_correct: + counts.found_correct += 1 + counts.t_found_correct[correct_type] += 1 + if start_guessed: + counts.found_guessed += 1 + counts.t_found_guessed[guessed_type] += 1 + if first_item != options.boundary: + if correct == guessed and guessed_type == correct_type: + counts.correct_tags += 1 + counts.token_counter += 1 + + last_guessed = guessed + last_correct = correct + last_guessed_type = guessed_type + last_correct_type = correct_type + + if in_correct: + counts.correct_chunk += 1 + counts.t_correct_chunk[last_correct_type] += 1 + + return counts + + + +def uniq(iterable): + seen = set() + return [i for i in iterable if not (i in seen or seen.add(i))] + + +def calculate_metrics(correct, guessed, total): + tp, fp, fn = correct, guessed-correct, total-correct + p = 0 if tp + fp == 0 else 1.*tp / (tp + fp) + r = 0 if tp + fn == 0 else 1.*tp / (tp + fn) + f = 0 if p + r == 0 else 2 * p * r / (p + r) + return Metrics(tp, fp, fn, p, r, f) + + +def metrics(counts): + c = counts + overall = calculate_metrics( + c.correct_chunk, c.found_guessed, c.found_correct + ) + by_type = {} + for t in uniq(list(c.t_found_correct) + list(c.t_found_guessed)): + by_type[t] = calculate_metrics( + c.t_correct_chunk[t], c.t_found_guessed[t], c.t_found_correct[t] + ) + return overall, by_type + + +def report(counts, out=None): + if out is None: + out = sys.stdout + + overall, by_type = metrics(counts) + + c = counts + out.write('processed %d tokens with %d phrases; ' % + (c.token_counter, c.found_correct)) + out.write('found: %d phrases; correct: %d.\n' % + (c.found_guessed, c.correct_chunk)) + + if c.token_counter > 0: + out.write('accuracy: %6.2f%%; ' % + (100.*c.correct_tags/c.token_counter)) + out.write('precision: %6.2f%%; ' % (100.*overall.prec)) + out.write('recall: %6.2f%%; ' % (100.*overall.rec)) + out.write('FB1: %6.2f\n' % (100.*overall.fscore)) + + for i, m in sorted(by_type.items()): + out.write('%17s: ' % i) + out.write('precision: %6.2f%%; ' % (100.*m.prec)) + out.write('recall: %6.2f%%; ' % (100.*m.rec)) + out.write('FB1: %6.2f %d\n' % (100.*m.fscore, c.t_found_guessed[i])) + + +def report_notprint(counts, out=None): + if out is None: + out = sys.stdout + + overall, by_type = metrics(counts) + + c = counts + final_report = [] + line = [] + line.append('processed %d tokens with %d phrases; ' % + (c.token_counter, c.found_correct)) + line.append('found: %d phrases; correct: %d.\n' % + (c.found_guessed, c.correct_chunk)) + final_report.append("".join(line)) + + if c.token_counter > 0: + line = [] + line.append('accuracy: %6.2f%%; ' % + (100.*c.correct_tags/c.token_counter)) + line.append('precision: %6.2f%%; ' % (100.*overall.prec)) + line.append('recall: %6.2f%%; ' % (100.*overall.rec)) + line.append('FB1: %6.2f\n' % (100.*overall.fscore)) + final_report.append("".join(line)) + + for i, m in sorted(by_type.items()): + line = [] + line.append('%17s: ' % i) + line.append('precision: %6.2f%%; ' % (100.*m.prec)) + line.append('recall: %6.2f%%; ' % (100.*m.rec)) + line.append('FB1: %6.2f %d\n' % (100.*m.fscore, c.t_found_guessed[i])) + final_report.append("".join(line)) + return final_report + + +def end_of_chunk(prev_tag, tag, prev_type, type_): + # check if a chunk ended between the previous and current word + # arguments: previous and current chunk tags, previous and current types + chunk_end = False + + if prev_tag == 'E': chunk_end = True + if prev_tag == 'S': chunk_end = True + + if prev_tag == 'B' and tag == 'B': chunk_end = True + if prev_tag == 'B' and tag == 'S': chunk_end = True + if prev_tag == 'B' and tag == 'O': chunk_end = True + if prev_tag == 'I' and tag == 'B': chunk_end = True + if prev_tag == 'I' and tag == 'S': chunk_end = True + if prev_tag == 'I' and tag == 'O': chunk_end = True + + if prev_tag != 'O' and prev_tag != '.' and prev_type != type_: + chunk_end = True + + # these chunks are assumed to have length 1 + if prev_tag == ']': chunk_end = True + if prev_tag == '[': chunk_end = True + + return chunk_end + + +def start_of_chunk(prev_tag, tag, prev_type, type_): + # check if a chunk started between the previous and current word + # arguments: previous and current chunk tags, previous and current types + chunk_start = False + + if tag == 'B': chunk_start = True + if tag == 'S': chunk_start = True + + if prev_tag == 'E' and tag == 'E': chunk_start = True + if prev_tag == 'E' and tag == 'I': chunk_start = True + if prev_tag == 'S' and tag == 'E': chunk_start = True + if prev_tag == 'S' and tag == 'I': chunk_start = True + if prev_tag == 'O' and tag == 'E': chunk_start = True + if prev_tag == 'O' and tag == 'I': chunk_start = True + + if tag != 'O' and tag != '.' and prev_type != type_: + chunk_start = True + + # these chunks are assumed to have length 1 + if tag == '[': chunk_start = True + if tag == ']': chunk_start = True + + return chunk_start + + +def main(argv): + args = parse_args(argv[1:]) + + if args.file is None: + counts = evaluate(sys.stdin, args) + else: + with open(args.file) as f: + counts = evaluate(f, args) + report(counts) + + +def return_report(input_file): + with open(input_file, "r") as f: + counts = evaluate(f) + return report_notprint(counts) + +if __name__ == '__main__': + # sys.exit(main(sys.argv)) + return_report('/home/pengy6/data/sentence_similarity/data/cdr/test1/wanli_result2/label_test.txt') \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/re_eval.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/re_eval.py new file mode 100644 index 0000000..2660602 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/re_eval.py @@ -0,0 +1,51 @@ +import os +import numpy as np +import pandas as pd +import sklearn.metrics +import argparse + + +parser = argparse.ArgumentParser(description='') +parser.add_argument('--output_path', type=str, help='') +parser.add_argument('--answer_path', type=str, help='') +parser.add_argument('--task', type=str, default="binary", help='default:binary, possible other options:{chemprot}') +args = parser.parse_args() + + +testdf = pd.read_csv(args.answer_path, sep="\t", index_col=0) +preddf = pd.read_csv(args.output_path, sep="\t", header=None) + + +# binary +if args.task == "binary": + pred = [preddf.iloc[i].tolist() for i in preddf.index] + pred_class = [np.argmax(v) for v in pred] + pred_prob_one = [v[1] for v in pred] + + p,r,f,s = sklearn.metrics.precision_recall_fscore_support(y_pred=pred_class, y_true=testdf["label"]) + results = dict() + results["f1 score"] = f[1] + results["recall"] = r[1] + results["precision"] = p[1] + results["specificity"] = r[0] + +# chemprot +# micro-average of 5 target classes +# see "Potent pairing: ensemble of long short-term memory networks and support vector machine for chemical-protein relation extraction (Mehryary, 2018)" for details +if args.task == "chemprot": + pred = [preddf.iloc[i].tolist() for i in preddf.index] + pred_class = [np.argmax(v) for v in pred] + str_to_int_mapper = dict() + + for i,v in enumerate(sorted(testdf["label"].unique())): + str_to_int_mapper[v] = i + test_answer = [str_to_int_mapper[v] for v in testdf["label"]] + + p,r,f,s = sklearn.metrics.precision_recall_fscore_support(y_pred=pred_class, y_true=test_answer, labels=[0,1,2,3,4], average="micro") + results = dict() + results["f1 score"] = f + results["recall"] = r + results["precision"] = p + +for k,v in results.items(): + print("{:11s} : {:.2%}".format(k,v)) diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_data_download.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_data_download.sh new file mode 100644 index 0000000..531637d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_data_download.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +docker run --runtime=nvidia -v $PWD:/workspace/bert \ + --rm --shm-size=1g --ulimit memlock=-1 \ + --ulimit stack=67108864 --ipc=host -t -i \ + bert bash -c "bash data/create_biobert_datasets_from_start.sh" \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_inference_benchmark.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_inference_benchmark.sh new file mode 100644 index 0000000..77a71a0 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_inference_benchmark.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +task=${1:-"ner_bc5cdr-chem"} +bert_model=${2:-"base"} +cased=${3:-"false"} + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + +DATESTAMP=`date +'%y%m%d%H%M%S'` +printf -v TAG "tf_bert_biobert_%s_inference_benchmark_%s_%s" "$task" "$bert_model" "$CASING_DIR_PREFIX" +OUTPUT_DIR=/results/${TAG}_${DATESTAMP} +mkdir -p ${OUTPUT_DIR} + +if [ "$task" = "ner_bc5cdr-chem" ] ; then + + + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/chem + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_sl_${seq_len}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + + python /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=$seq_length \ + $use_fp16 $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | tail -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_len $batch_size $perf" >> $LOGFILE + + done + done + done + +elif [ "$task" = "ner_bc5cdr-disease" ] ; then + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/disease + + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_sl_${seq_len}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + python3 /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=$seq_length \ + "$use_fp16" $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | tail -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_len $batch_size $perf" >> $LOGFILE + + done + done + done + +elif [ "$task" = "rel_chemprot" ] ; then + DATASET_DIR=/workspace/bert/data/biobert/ChemProt + + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_sl_${seq_len}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + python3 /workspace/bert/run_re.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="chemprot" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=$seq_length \ + "$use_fp16" $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | tail -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_len $batch_size $perf" >> $LOGFILE + + done + done + done + +else + + echo "Benchmarking for " $task "currently not supported. Sorry!" + +fi \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_train_benchmark.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_train_benchmark.sh new file mode 100644 index 0000000..bc93e3b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/biobert_finetune_train_benchmark.sh @@ -0,0 +1,203 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +task=${1:-"ner_bc5cdr-chem"} +num_gpu=${2:-"2"} +bert_model=${3:-"base"} +cased=${4:-"false"} + + +epochs=2.0 + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +DATESTAMP=`date +'%y%m%d%H%M%S'` +printf -v TAG "tf_bert_biobert_%s_training_benchmark_%s_%s_num_gpu_%d" "$task" "$bert_model" "$CASING_DIR_PREFIX" "$num_gpu" +OUTPUT_DIR=/results/${TAG}_${DATESTAMP} +mkdir -p ${OUTPUT_DIR} + +if [ "$task" = "ner_bc5cdr-chem" ] ; then + + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/chem + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}_gpu_${num_gpu}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for train_batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_gpu_${num_gpu}_sl_${seq_length}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + + $mpi_command python /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name=bc5cdr \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --train_batch_size=$train_batch_size \ + --max_seq_length=$seq_length \ + $use_hvd $use_fp16 $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | head -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_length $train_batch_size $perf" >> $LOGFILE + + done + done + done + +elif [ "$task" = "ner_bc5cdr-disease" ] ; then + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/disease + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}_gpu_${num_gpu}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for train_batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_gpu_${num_gpu}_sl_${seq_length}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + + $mpi_command python3 /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --train_batch_size=$train_batch_size \ + --max_seq_length=$seq_length \ + "$use_hvd" "$use_fp16" $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | head -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_length $train_batch_size $perf" >> $LOGFILE + + done + done + done + +elif [ "$task" = "rel_chemprot" ] ; then + DATASET_DIR=/workspace/bert/data/biobert/ChemProt + LOGFILE="${OUTPUT_DIR}/${task}_training_benchmark_bert_${bert_model}_gpu_${num_gpu}.log" + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_length in 128 512; do + for train_batch_size in 8 32 64; do + for precision in fp16 fp32; do + res_dir=${OUTPUT_DIR}/bert_${bert_model}_gpu_${num_gpu}_sl_${seq_length}_prec_${precision}_bs_${batch_size} + mkdir -p ${res_dir} + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + + $mpi_command python3 /workspace/bert/run_re.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="chemprot" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint="$BERT_DIR/bert_model.ckpt" \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$res_dir \ + --train_batch_size=$train_batch_size \ + --max_seq_length=$seq_length \ + "$use_hvd" "$use_fp16" $use_xla_tag $case_flag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | head -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_length $train_batch_size $perf" >> $LOGFILE + + done + done + done + +else + + echo "Benchmarking for " $task "currently not supported. Sorry!" + +fi \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-chem.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-chem.sh new file mode 100644 index 0000000..321ad76 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-chem.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +init_checkpoint=${1:-"/results/biobert_tf_uncased_base/model.ckpt-4340"} +train_batch_size=${2:-8} +learning_rate=${3:-3.125e-6} +cased=${4:-false} +precision=${5:-"fp16"} +use_xla=${6:-"true"} +num_gpu=${7:-"16"} +seq_length=${8:-128} +bert_model=${9:-"base"} +eval_batch_size=${10:-8} #Eval and Predict BS is assumed to be same +epochs=${11:-"10.0"} + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + + +export GBS=$(expr $train_batch_size \* $num_gpu) +printf -v TAG "tf_bert_biobert_ner_bc5cdr_chem_%s_%s_gbs%d" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` + + +DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/chem +OUTPUT_DIR=/results/${TAG}_${DATESTAMP} +mkdir -p ${OUTPUT_DIR} + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +$mpi python /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name=bc5cdr \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --learning_rate=$learning_rate \ + --train_batch_size=$train_batch_size \ + --eval_batch_size=$eval_batch_size \ + --predict_batch_size=$eval_batch_size \ + --max_seq_length=$seq_length \ + $use_hvd $use_fp16 $use_xla_tag $case_flag diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-disease.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-disease.sh new file mode 100644 index 0000000..f0992fa --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/ner_bc5cdr-disease.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +init_checkpoint=${1:-"/results/biobert_tf_uncased_base/model.ckpt-4340"} +train_batch_size=${2:-8} +learning_rate=${3:-3.125e-6} +cased=${4:-false} +precision=${5:-"fp16"} +use_xla=${6:-"true"} +num_gpu=${7:-"16"} +seq_length=${8:-128} +bert_model=${9:-"base"} +eval_batch_size=${10:-8} #Eval and Predict BS is assumed to be same +epochs=${11:-"100.0"} + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + +export GBS=$(expr $train_batch_size \* $num_gpu) +printf -v TAG "tf_bert_biobert_ner_bc5cdr_disease_%s_%s_gbs%d" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` + + + +DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/disease +OUTPUT_DIR=/results/${TAG}_${DATESTAMP} +mkdir -p ${OUTPUT_DIR} + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +$mpi_command python3 /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --learning_rate=$learning_rate \ + --train_batch_size=$train_batch_size \ + --eval_batch_size=$eval_batch_size \ + --predict_batch_size=$eval_batch_size \ + --max_seq_length=$seq_length \ + "$use_hvd" "$use_fp16" $use_xla_tag $case_flag diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/rel_chemprot.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/rel_chemprot.sh new file mode 100644 index 0000000..eae0ea3 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/rel_chemprot.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +init_checkpoint=${1:-"/results/biobert_tf_uncased_base/model.ckpt-4340"} +train_batch_size=${2:-64} +learning_rate=${3:-1.5e-6} +cased=${4:-false} +precision=${5:-"fp16"} +use_xla=${6:-"true"} +num_gpu=${7:-"16"} +seq_length=${8:-512} +bert_model=${9:-"base"} +eval_batch_size=${10:-16} #Eval and Predict BS is assumed to be same +epochs=${11:-"3.0"} + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + +export GBS=$(expr $train_batch_size \* $num_gpu) +printf -v TAG "tf_bert_biobert_rel_chemprot_%s_%s_gbs%d" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` + + +DATASET_DIR=/workspace/bert/data/biobert/ChemProt +OUTPUT_DIR=/results/${TAG}_${DATESTAMP} +mkdir -p ${OUTPUT_DIR} + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +$mpi_command python3 /workspace/bert/run_re.py \ + --do_prepare=true \ + --do_train=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="chemprot" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --num_train_epochs=$epochs \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --learning_rate=$learning_rate \ + --train_batch_size=$train_batch_size \ + --eval_batch_size=$eval_batch_size \ + --predict_batch_size=$eval_batch_size \ + --max_seq_length=$seq_length \ + "$use_hvd" "$use_fp16" $use_xla_tag $case_flag + +python3 /workspace/bert/biobert/re_eval.py --task=chemprot --output_path=$OUTPUT_DIR/test_results.tsv \ + --answer_path=$DATASET_DIR/test.tsv |& tee $OUTPUT_DIR/test_results.txt diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert.sub b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert.sub new file mode 100644 index 0000000..c9b87bc --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert.sub @@ -0,0 +1,87 @@ +#!/bin/bash +#SBATCH --exclusive +#SBATCH --mem=0 +#SBATCH --overcommit + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eux + +readonly docker_image="nvcr.io/nvidia/tensorflow:19.08-py3" +readonly datadir="/raid/data/bert" +readonly checkpointdir="$PWD/checkpoints" + +readonly mounts=".:/workspace/bert,${datadir}:/workspace/bert/data,${checkpointdir}:/results" + +DO_LOWER_CASE=${DO_LOWER_CASE:-1} +if [ "$DO_LOWER_CASE" == "1" ]; then + CASING_DIR_PREFIX="uncased" +else + CASING_DIR_PREFIX="cased" +fi + +DO_BERT_BASE=${DO_BERT_BASE:-1} +if [ "$DO_BERT_BASE" == "1" ]; then + CASING_DIR_SUFFIX="L-12_H-768_A-12" +else + CASING_DIR_SUFFIX="L-24_H-1024_A-16" +fi + +srun --ntasks="${SLURM_JOB_NUM_NODES}" --ntasks-per-node=1 mkdir -p "${checkpointdir}/biobert_phase_1" +srun --ntasks="${SLURM_JOB_NUM_NODES}" --ntasks-per-node=1 mkdir -p "${checkpointdir}/biobert_phase_2" + +PHASE1="\ + --train_batch_size=${BATCHSIZE:-128} \ + --learning_rate=${LEARNING_RATE:-3.2e-5} \ + --num_accumulation_steps=${NUM_ACCUMULATION_STEPS:-128} \ + --input_files_dir=lower_case_${DO_LOWER_CASE}_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/training \ + --eval_files_dir=lower_case_${DO_LOWER_CASE}_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/test \ + --max_seq_length=128 \ + --max_predictions_per_seq=20 \ + --num_train_steps=19531 \ + --num_warmup_steps=1953 \ + --output_dir=/results/biobert_phase_1 \ + " + +PHASE2="\ + --train_batch_size=${BATCHSIZE:-16} \ + --learning_rate=${LEARNING_RATE:-6.4e-5} \ + --num_accumulation_steps=${NUM_ACCUMULATION_STEPS:-512} \ + --input_files_dir=/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/training \ + --eval_files_dir=/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/test \ + --max_seq_length=512 \ + --max_predictions_per_seq=80 \ + --num_train_steps=4340 \ + --num_warmup_steps=434 \ + --output_dir=/results/biobert_phase_2 \ + --init_checkpoint=/results/biobert_phase_1/model.ckpt-19531 \ + " + +PHASES=( "$PHASE1" "$PHASE2" ) + +PHASE=${PHASE:-1} + +BERT_CMD="\ + python /workspace/bert/run_pretraining.py \ + ${PHASES[$((PHASE-1))]} \ + --bert_config_file=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_${CASING_DIR_SUFFIX}/bert_config.json \ + --vocab_file=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_${CASING_DIR_SUFFIX}/vocab.txt \ + --do_train=True \ + --do_eval=True \ + --save_checkpoints_steps=5000 \ + --horovod --use_fp16 --use_xla \ + --allreduce_post_accumulation=True \ + --eval_batch_size=8" + +srun --mpi=pmi2 -l --container-image="${docker_image}" --container-mounts="${mounts}" bash -c "${BERT_CMD}" \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert_finetuning_inference.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert_finetuning_inference.sh new file mode 100644 index 0000000..9f6f08e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_biobert_finetuning_inference.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +task=${1:-"ner_bc5cdr-chem"} +init_checkpoint=${2:-"/results/biobert_tf_uncased_base/model.ckpt-4340"} +bert_model=${3:-"base"} +cased=${4:-"false"} +precision=${5:-"fp16"} +use_xla=${6:-"true"} +batch_size=${7:-"16"} + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" + case_flag="--do_lower_case=False" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" + case_flag="--do_lower_case=True" +fi + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-24_H-1024_A-16 +else + export BERT_DIR=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12 +fi + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +DATESTAMP=`date +'%y%m%d%H%M%S'` + +if [ "$task" = "ner_bc5cdr-chem" ] ; then + + printf -v TAG "tf_bert_biobert_ner_bc5cdr_chem_inference_%s_%s" "$bert_model" "$precision" + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/chem + OUTPUT_DIR=/results/${TAG}_${DATESTAMP} + + python /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=128 \ + $use_fp16 $use_xla_tag $case_flag + +elif [ "$task" = "ner_bc5cdr-disease" ] ; then + printf -v TAG "tf_bert_biobert_ner_bc5cdr_disease_inference_%s_%s" "$bert_model" "$precision" + DATASET_DIR=/workspace/bert/data/biobert/BC5CDR/disease + OUTPUT_DIR=/results/${TAG}_${DATESTAMP} + + python3 /workspace/bert/run_ner.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="bc5cdr" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=128 \ + "$use_fp16" $use_xla_tag $case_flag + +elif [ "$task" = "rel_chemprot" ] ; then + printf -v TAG "tf_bert_biobert_rel_chemprot_inference_%s_%s_" "$bert_model" "$precision" + DATASET_DIR=/workspace/bert/data/biobert/ChemProt + OUTPUT_DIR=/results/${TAG}_${DATESTAMP} + + python3 /workspace/bert/run_re.py \ + --do_prepare=true \ + --do_eval=true \ + --do_predict=true \ + --task_name="chemprot" \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --data_dir=$DATASET_DIR \ + --output_dir=$OUTPUT_DIR \ + --eval_batch_size=$batch_size \ + --predict_batch_size=$batch_size \ + --max_seq_length=512 \ + "$use_fp16" $use_xla_tag $case_flag + + python3 /workspace/bert/biobert/re_eval.py --task=chemprot --output_path=$OUTPUT_DIR/test_results.tsv \ + --answer_path=$DATASET_DIR/test.tsv |& tee $OUTPUT_DIR/test_results.txt + +else + + echo "Benchmarking for " $task "currently not supported. Sorry!" + +fi \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_1.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_1.sh new file mode 100644 index 0000000..8ee9020 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_1.sh @@ -0,0 +1,87 @@ +#! /bin/bash + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +train_batch_size=${1:-128} +learning_rate=${2:-"9.625e-5"} +cased=${3:-false} +precision=${4:-"fp16"} +use_xla=${5:-"true"} +num_gpus=${6:-16} +warmup_steps=${7:-"1953"} +train_steps=${8:-19531} +num_accumulation_steps=${9:-32} +save_checkpoint_steps=${10:-5000} +eval_batch_size=${11:-80} + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" +fi + +BERT_CONFIG=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12/bert_config.json +RESULTS_DIR=/results +CHECKPOINTS_DIR=${RESULTS_DIR}/biobert_phase_1 +mkdir -p ${CHECKPOINTS_DIR} + +INIT_CHECKPOINT=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12/bert_model.ckpt + +INPUT_FILES_DIR="/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/training" +EVAL_FILES_DIR="/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/test" + + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + + +export GBS=$(expr $train_batch_size \* $num_gpus \* num_accumulation_steps) +printf -v TAG "tf_bert_bio_1n_phase1_cased_%s_%s_gbs%d" "$cased" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +printf "Logs written to %s\n" "$LOGFILE" + + +$mpi python3 /workspace/bert/run_pretraining.py \ + --input_files_dir=$INPUT_FILES_DIR \ + --eval_files_dir=$EVAL_FILES_DIR \ + --output_dir=$CHECKPOINTS_DIR \ + --bert_config_file=$BERT_CONFIG \ + --do_train=True \ + --do_eval=True \ + --train_batch_size=$train_batch_size \ + --eval_batch_size=$eval_batch_size \ + --max_seq_length=128 \ + --max_predictions_per_seq=20 \ + --num_train_steps=$train_steps \ + --num_warmup_steps=$warmup_steps \ + --save_checkpoints_steps=$save_checkpoint_steps \ + --num_accumulation_steps=$num_accumulation_steps \ + --learning_rate=$learning_rate \ + --report_loss \ + --$use_hvd $use_fp16 $use_xla_tag \ + --init_checkpoint=$INIT_CHECKPOINT |& tee $LOGFILE \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_2.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_2.sh new file mode 100644 index 0000000..a6e41af --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/biobert/scripts/run_pretraining_pubmed_base_phase_2.sh @@ -0,0 +1,85 @@ +#! /bin/bash + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +init_checkpoint=${1} +train_batch_size=${2:-16} +learning_rate=${3:-"2.9e-4"} +cased=${4:-false} +precision=${5:-"fp16"} +use_xla=${6:-true} +num_gpus=${7:-16} +warmup_steps=${8:-"434"} +train_steps=${9:-4340} +num_accumulation_steps=${10:-128} +save_checkpoint_steps=${11:-5000} +eval_batch_size=${12:-26} + + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ "$cased" = "true" ] ; then + DO_LOWER_CASE=0 + CASING_DIR_PREFIX="cased" +else + DO_LOWER_CASE=1 + CASING_DIR_PREFIX="uncased" +fi + +BERT_CONFIG=/workspace/bert/data/download/google_pretrained_weights/${CASING_DIR_PREFIX}_L-12_H-768_A-12/bert_config.json +RESULTS_DIR=/results +CHECKPOINTS_DIR=${RESULTS_DIR}/biobert_phase_2 +mkdir -p ${CHECKPOINTS_DIR} + +INPUT_FILES_DIR="/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/training" +EVAL_FILES_DIR="/workspace/bert/data/tfrecord/lower_case_${DO_LOWER_CASE}_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/pubmed_baseline/test" + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +export GBS=$(expr $train_batch_size \* $num_gpus \* num_accumulation_steps) +printf -v TAG "tf_bert_bio_1n_phase2_cased_%s_%s_gbs%d" "$cased" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +printf "Logs written to %s\n" "$LOGFILE" + + +$mpi python3 /workspace/bert/run_pretraining.py \ + --input_files_dir=$INPUT_FILES_DIR \ + --eval_files_dir=$EVAL_FILES_DIR \ + --output_dir=$CHECKPOINTS_DIR \ + --bert_config_file=$BERT_CONFIG \ + --do_train=True \ + --do_eval=True \ + --train_batch_size=$train_batch_size \ + --eval_batch_size=$eval_batch_size \ + --max_seq_length=512 \ + --max_predictions_per_seq=80 \ + --num_train_steps=$train_steps \ + --num_warmup_steps=$warmup_steps \ + --save_checkpoints_steps=$save_checkpoint_steps \ + --num_accumulation_steps=$num_accumulation_steps \ + --learning_rate=$learning_rate \ + --report_loss \ + --$use_hvd $use_xla_tag $use_fp16 \ + --init_checkpoint=$INIT_CHECKPOINT |& tee $LOGFILE \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/configurations.yml b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/configurations.yml new file mode 100644 index 0000000..675c6d8 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/configurations.yml @@ -0,0 +1,206 @@ +# Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#1 DGX1 phase1 +bert--DGX1: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "1" + BATCHSIZE: "8" + LEARNING_RATE: "7.5e-4" + NUM_ACCUMULATION_STEPS: "1024" + PHASE: "1" + +#4 DGX1 phase1 +bert--DGX1_n4: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "4" + BATCHSIZE: "8" + LEARNING_RATE: "1.875e-4" + NUM_ACCUMULATION_STEPS: "256" + PHASE: "1" + +#16 DGX1 phase1 +bert--DGX1_n16: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "16" + BATCHSIZE: "8" + LEARNING_RATE: "4.6875e-5" + NUM_ACCUMULATION_STEPS: "64" + PHASE: "1" + +#32 DGX1 phase1 +bert--DGX1_n32: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "32" + BATCHSIZE: "8" + LEARNING_RATE: "2.34375e-5" + NUM_ACCUMULATION_STEPS: "32" + PHASE: "1" + +#1 DGX2 phase1 +bert--DGX2: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "1" + BATCHSIZE: "32" + LEARNING_RATE: "3.75e-4" + NUM_ACCUMULATION_STEPS: "128" + PHASE: "1" + +#4 DGX2 phase1 +bert--DGX2_n4: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "4" + BATCHSIZE: "32" + LEARNING_RATE: "9.375e-5" + NUM_ACCUMULATION_STEPS: "32" + PHASE: "1" + +#16 DGX2 phase1 +bert--DGX2_n16: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "16" + BATCHSIZE: "256" + LEARNING_RATE: "3.75e-4" + NUM_ACCUMULATION_STEPS: "4" + PHASE: "1" + +#32 DGX2 phase1 +bert--DGX2_n32: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "32" + BATCHSIZE: "32" + LEARNING_RATE: "2.34375e-5" + NUM_ACCUMULATION_STEPS: "8" + PHASE: "1" + +#1 DGX1 phase2 +bert--DGX1_n1p2: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "1" + BATCHSIZE: "2" + LEARNING_RATE: "5e-4" + NUM_ACCUMULATION_STEPS: "4096" + PHASE: "2" + +#4 DGX1 phase2 +bert--DGX1_n4p2: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "4" + BATCHSIZE: "2" + LEARNING_RATE: "1.25e-4" + NUM_ACCUMULATION_STEPS: "512" + PHASE: "2" + +#16 DGX1 phase2 +bert--DGX1_n16p2: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "16" + BATCHSIZE: "2" + LEARNING_RATE: "1.5625e-5" + NUM_ACCUMULATION_STEPS: "128" + PHASE: "2" + +#32 DGX1 phase2 +bert--DGX1_n32p2: + <<: *BERT_ON_CLUSTER + <<: *DGX1 + variables: + <<: *DGX1_VARS + NNODES: "32" + BATCHSIZE: "2" + LEARNING_RATE: "1.5625e-5" + NUM_ACCUMULATION_STEPS: "64" + PHASE: "2" + +#1 DGX2 phase2 +bert--DGX2_n1p2: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "1" + BATCHSIZE: "8" + LEARNING_RATE: "2.5e-5" + NUM_ACCUMULATION_STEPS: "256" + PHASE: "2" + +#4 DGX2 phase2 +bert--DGX2_n4p2: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "4" + BATCHSIZE: "8" + LEARNING_RATE: "6.25e-5" + NUM_ACCUMULATION_STEPS: "64" + PHASE: "2" + +#16 DGX2 phase2 +bert--DGX2_n16p2: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "16" + BATCHSIZE: "8" + LEARNING_RATE: "1.5625e-5" + NUM_ACCUMULATION_STEPS: "16" + PHASE: "2" + +#32 DGX2 phase2 +bert--DGX2_n32p2: + <<: *BERT_ON_CLUSTER + <<: *DGX2 + variables: + <<: *DGX2_VARS + NNODES: "32" + BATCHSIZE: "8" + LEARNING_RATE: "7.8125e-6" + NUM_ACCUMULATION_STEPS: "8" + PHASE: "2" + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BooksDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BooksDownloader.py new file mode 100644 index 0000000..53ee6c4 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BooksDownloader.py @@ -0,0 +1,26 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import subprocess + +class BooksDownloader: + def __init__(self, save_path): + self.save_path = save_path + pass + + + def download(self): + bookscorpus_download_command = 'python3 /workspace/bookcorpus/download_files.py --list /workspace/bookcorpus/url_list.jsonl --out' + bookscorpus_download_command += ' ' + self.save_path + '/bookscorpus' + bookscorpus_download_command += ' --trash-bad-count' + bookscorpus_download_process = subprocess.run(bookscorpus_download_command, shell=True, check=True) \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BookscorpusTextFormatting.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BookscorpusTextFormatting.py new file mode 100644 index 0000000..22e48d4 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/BookscorpusTextFormatting.py @@ -0,0 +1,32 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import glob +import os + +class BookscorpusTextFormatting: + def __init__(self, books_path, output_filename, recursive = False): + self.books_path = books_path + self.recursive = recursive + self.output_filename = output_filename + + + # This puts one book per line + def merge(self): + with open(self.output_filename, mode='w', newline='\n') as ofile: + for filename in glob.glob(self.books_path + '/' + '*.txt', recursive=True): + with open(filename, mode='r', encoding='utf-8-sig', newline='\n') as file: + for line in file: + if line.strip() != '': + ofile.write(line.strip() + ' ') + ofile.write("\n\n") \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/Downloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/Downloader.py new file mode 100644 index 0000000..20b48c1 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/Downloader.py @@ -0,0 +1,120 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from GooglePretrainedWeightDownloader import GooglePretrainedWeightDownloader +from NVIDIAPretrainedWeightDownloader import NVIDIAPretrainedWeightDownloader +from WikiDownloader import WikiDownloader +from BooksDownloader import BooksDownloader +from GLUEDownloader import GLUEDownloader +from SquadDownloader import SquadDownloader +from PubMedDownloader import PubMedDownloader + +class Downloader: + def __init__(self, dataset_name, save_path): + self.dataset_name = dataset_name + self.save_path = save_path + + + def download(self): + if self.dataset_name == 'bookscorpus': + self.download_bookscorpus() + + elif self.dataset_name == 'wikicorpus_en': + self.download_wikicorpus('en') + + elif self.dataset_name == 'wikicorpus_zh': + self.download_wikicorpus('zh') + + elif self.dataset_name == 'pubmed_baseline': + self.download_pubmed('baseline') + + elif self.dataset_name == 'pubmed_daily_update': + self.download_pubmed('daily_update') + + elif self.dataset_name == 'pubmed_fulltext': + self.download_pubmed('fulltext') + + elif self.dataset_name == 'pubmed_open_access': + self.download_pubmed('open_access') + + elif self.dataset_name == 'google_pretrained_weights': + self.download_google_pretrained_weights() + + elif self.dataset_name == 'nvidia_pretrained_weights': + self.download_nvidia_pretrained_weights() + + elif self.dataset_name == 'MRPC': + self.download_glue(self.dataset_name) + + elif self.dataset_name == 'MNLI': + self.download_glue(self.dataset_name) + + elif self.dataset_name == 'CoLA': + self.download_glue(self.dataset_name) + + elif self.dataset_name == 'squad': + self.download_squad() + + elif self.dataset_name == 'all': + self.download_bookscorpus() + self.download_wikicorpus('en') + self.download_wikicorpus('zh') + self.download_pubmed('baseline') + self.download_pubmed('daily_update') + self.download_pubmed('fulltext') + self.download_pubmed('open_access') + self.download_google_pretrained_weights() + self.download_nvidia_pretrained_weights() + self.download_glue("CoLA") + self.download_glue("MNLI") + self.download_glue("MRPC") + self.download_squad() + + else: + print(self.dataset_name) + assert False, 'Unknown dataset_name provided to downloader' + + + def download_bookscorpus(self): + downloader = BooksDownloader(self.save_path) + downloader.download() + + + def download_wikicorpus(self, language): + downloader = WikiDownloader(language, self.save_path) + downloader.download() + + + def download_pubmed(self, subset): + downloader = PubMedDownloader(subset, self.save_path) + downloader.download() + + + def download_google_pretrained_weights(self): + downloader = GooglePretrainedWeightDownloader(self.save_path) + downloader.download() + + + def download_nvidia_pretrained_weights(self): + downloader = NVIDIAPretrainedWeightDownloader(self.save_path) + downloader.download() + + + def download_glue(self, glue_task_name): + downloader = GLUEDownloader(glue_task_name, self.save_path) + downloader.download() + + + def download_squad(self): + downloader = SquadDownloader(self.save_path) + downloader.download() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GLUEDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GLUEDownloader.py new file mode 100644 index 0000000..e270b37 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GLUEDownloader.py @@ -0,0 +1,109 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import bz2 +import os +import urllib +import sys +import zipfile +import io + +URLLIB=urllib +if sys.version_info >= (3, 0): + URLLIB=urllib.request + +class GLUEDownloader: + def __init__(self, task, save_path): + + # Documentation - Download link obtained from here: https://github.com/nyu-mll/GLUE-baselines/blob/master/download_glue_data.py + + self.TASK2PATH = {"CoLA":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FCoLA.zip?alt=media&token=46d5e637-3411-4188-bc44-5809b5bfb5f4', + "SST":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FSST-2.zip?alt=media&token=aabc5f6b-e466-44a2-b9b4-cf6337f84ac8', + "MRPC":{"mrpc_dev": 'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2Fmrpc_dev_ids.tsv?alt=media&token=ec5c0836-31d5-48f4-b431-7480817f1adc', + "mrpc_train": 'https://dl.fbaipublicfiles.com/senteval/senteval_data/msr_paraphrase_train.txt', + "mrpc_test": 'https://dl.fbaipublicfiles.com/senteval/senteval_data/msr_paraphrase_test.txt'}, + "QQP":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FQQP.zip?alt=media&token=700c6acf-160d-4d89-81d1-de4191d02cb5', + "STS":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FSTS-B.zip?alt=media&token=bddb94a7-8706-4e0d-a694-1109e12273b5', + "MNLI":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FMNLI.zip?alt=media&token=50329ea1-e339-40e2-809c-10c40afff3ce', + "SNLI":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FSNLI.zip?alt=media&token=4afcfbb2-ff0c-4b2d-a09a-dbf07926f4df', + "QNLI":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FQNLI.zip?alt=media&token=c24cad61-f2df-4f04-9ab6-aa576fa829d0', + "RTE":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FRTE.zip?alt=media&token=5efa7e85-a0bb-4f19-8ea2-9e1840f077fb', + "WNLI":'https://firebasestorage.googleapis.com/v0/b/mtl-sentence-representations.appspot.com/o/data%2FWNLI.zip?alt=media&token=068ad0a0-ded7-4bd7-99a5-5e00222e0faf', + "diagnostic":'https://storage.googleapis.com/mtl-sentence-representations.appspot.com/tsvsWithoutLabels%2FAX.tsv?GoogleAccessId=firebase-adminsdk-0khhl@mtl-sentence-representations.iam.gserviceaccount.com&Expires=2498860800&Signature=DuQ2CSPt2Yfre0C%2BiISrVYrIFaZH1Lc7hBVZDD4ZyR7fZYOMNOUGpi8QxBmTNOrNPjR3z1cggo7WXFfrgECP6FBJSsURv8Ybrue8Ypt%2FTPxbuJ0Xc2FhDi%2BarnecCBFO77RSbfuz%2Bs95hRrYhTnByqu3U%2FYZPaj3tZt5QdfpH2IUROY8LiBXoXS46LE%2FgOQc%2FKN%2BA9SoscRDYsnxHfG0IjXGwHN%2Bf88q6hOmAxeNPx6moDulUF6XMUAaXCSFU%2BnRO2RDL9CapWxj%2BDl7syNyHhB7987hZ80B%2FwFkQ3MEs8auvt5XW1%2Bd4aCU7ytgM69r8JDCwibfhZxpaa4gd50QXQ%3D%3D'} + + + self.save_path = save_path + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + self.task = task + + def download(self): + + if self.task == 'MRPC': + self.download_mrpc() + elif self.task == 'diagnostic': + self.download_diagnostic() + else: + self.download_and_extract(self.task) + + def download_and_extract(self, task): + print("Downloading and extracting %s..." % task) + data_file = "%s.zip" % task + URLLIB.urlretrieve(self.TASK2PATH[task], data_file) + print(data_file,"\n\n\n") + with zipfile.ZipFile(data_file) as zip_ref: + zip_ref.extractall(self.save_path) + os.remove(data_file) + print("\tCompleted!") + + def download_mrpc(self): + print("Processing MRPC...") + mrpc_dir = os.path.join(self.save_path, "MRPC") + if not os.path.isdir(mrpc_dir): + os.mkdir(mrpc_dir) + + mrpc_train_file = os.path.join(mrpc_dir, "msr_paraphrase_train.txt") + mrpc_dev_file = os.path.join(mrpc_dir, "dev_ids.tsv") + mrpc_test_file = os.path.join(mrpc_dir, "msr_paraphrase_test.txt") + + URLLIB.urlretrieve(self.TASK2PATH["MRPC"]["mrpc_train"], mrpc_train_file) + URLLIB.urlretrieve(self.TASK2PATH["MRPC"]["mrpc_test"], mrpc_test_file) + URLLIB.urlretrieve(self.TASK2PATH["MRPC"]["mrpc_dev"], mrpc_dev_file) + + dev_ids = [] + with io.open(os.path.join(mrpc_dir, "dev_ids.tsv"), encoding='utf-8') as ids_fh: + for row in ids_fh: + dev_ids.append(row.strip().split('\t')) + + with io.open(mrpc_train_file, encoding='utf-8') as data_fh, \ + io.open(os.path.join(mrpc_dir, "train.tsv"), 'w', encoding='utf-8') as train_fh, \ + io.open(os.path.join(mrpc_dir, "dev.tsv"), 'w', encoding='utf-8') as dev_fh: + header = data_fh.readline() + train_fh.write(header) + dev_fh.write(header) + for row in data_fh: + label, id1, id2, s1, s2 = row.strip().split('\t') + if [id1, id2] in dev_ids: + dev_fh.write("%s\t%s\t%s\t%s\t%s\n" % (label, id1, id2, s1, s2)) + else: + train_fh.write("%s\t%s\t%s\t%s\t%s\n" % (label, id1, id2, s1, s2)) + + with io.open(mrpc_test_file, encoding='utf-8') as data_fh, \ + io.open(os.path.join(mrpc_dir, "test.tsv"), 'w', encoding='utf-8') as test_fh: + header = data_fh.readline() + test_fh.write("index\t#1 ID\t#2 ID\t#1 String\t#2 String\n") + for idx, row in enumerate(data_fh): + label, id1, id2, s1, s2 = row.strip().split('\t') + test_fh.write("%d\t%s\t%s\t%s\t%s\n" % (idx, id1, id2, s1, s2)) + print("\tCompleted!") \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GooglePretrainedWeightDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GooglePretrainedWeightDownloader.py new file mode 100644 index 0000000..bb0684d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/GooglePretrainedWeightDownloader.py @@ -0,0 +1,158 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import hashlib +import os +import urllib.request +import zipfile + +class GooglePretrainedWeightDownloader: + def __init__(self, save_path): + self.save_path = save_path + '/google_pretrained_weights' + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + # Download urls + self.model_urls = { + 'bert_base_uncased': ('https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip', 'uncased_L-12_H-768_A-12.zip'), + 'bert_large_uncased': ('https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-24_H-1024_A-16.zip', 'uncased_L-24_H-1024_A-16.zip'), + 'bert_base_cased': ('https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip', 'cased_L-12_H-768_A-12.zip'), + 'bert_large_cased': ('https://storage.googleapis.com/bert_models/2018_10_18/cased_L-24_H-1024_A-16.zip', 'cased_L-24_H-1024_A-16.zip'), + 'bert_base_multilingual_cased': ('https://storage.googleapis.com/bert_models/2018_11_23/multi_cased_L-12_H-768_A-12.zip', 'multi_cased_L-12_H-768_A-12.zip'), + 'bert_large_multilingual_uncased': ('https://storage.googleapis.com/bert_models/2018_11_03/multilingual_L-12_H-768_A-12.zip', 'multilingual_L-12_H-768_A-12.zip'), + 'bert_base_chinese': ('https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip', 'chinese_L-12_H-768_A-12.zip') + } + + # SHA256sum verification for file download integrity (and checking for changes from the download source over time) + self.bert_base_uncased_sha = { + 'bert_config.json': '7b4e5f53efbd058c67cda0aacfafb340113ea1b5797d9ce6ee411704ba21fcbc', + 'bert_model.ckpt.data-00000-of-00001': '58580dc5e0bf0ae0d2efd51d0e8272b2f808857f0a43a88aaf7549da6d7a8a84', + 'bert_model.ckpt.index': '04c1323086e2f1c5b7c0759d8d3e484afbb0ab45f51793daab9f647113a0117b', + 'bert_model.ckpt.meta': 'dd5682170a10c3ea0280c2e9b9a45fee894eb62da649bbdea37b38b0ded5f60e', + 'vocab.txt': '07eced375cec144d27c900241f3e339478dec958f92fddbc551f295c992038a3', + } + + self.bert_large_uncased_sha = { + 'bert_config.json': 'bfa42236d269e2aeb3a6d30412a33d15dbe8ea597e2b01dc9518c63cc6efafcb', + 'bert_model.ckpt.data-00000-of-00001': 'bc6b3363e3be458c99ecf64b7f472d2b7c67534fd8f564c0556a678f90f4eea1', + 'bert_model.ckpt.index': '68b52f2205ffc64dc627d1120cf399c1ef1cbc35ea5021d1afc889ffe2ce2093', + 'bert_model.ckpt.meta': '6fcce8ff7628f229a885a593625e3d5ff9687542d5ef128d9beb1b0c05edc4a1', + 'vocab.txt': '07eced375cec144d27c900241f3e339478dec958f92fddbc551f295c992038a3', + } + + self.bert_base_cased_sha = { + 'bert_config.json': 'f11dfb757bea16339a33e1bf327b0aade6e57fd9c29dc6b84f7ddb20682f48bc', + 'bert_model.ckpt.data-00000-of-00001': '734d5a1b68bf98d4e9cb6b6692725d00842a1937af73902e51776905d8f760ea', + 'bert_model.ckpt.index': '517d6ef5c41fc2ca1f595276d6fccf5521810d57f5a74e32616151557790f7b1', + 'bert_model.ckpt.meta': '5f8a9771ff25dadd61582abb4e3a748215a10a6b55947cbb66d0f0ba1694be98', + 'vocab.txt': 'eeaa9875b23b04b4c54ef759d03db9d1ba1554838f8fb26c5d96fa551df93d02', + } + + self.bert_large_cased_sha = { + 'bert_config.json': '7adb2125c8225da495656c982fd1c5f64ba8f20ad020838571a3f8a954c2df57', + 'bert_model.ckpt.data-00000-of-00001': '6ff33640f40d472f7a16af0c17b1179ca9dcc0373155fb05335b6a4dd1657ef0', + 'bert_model.ckpt.index': 'ef42a53f577fbe07381f4161b13c7cab4f4fc3b167cec6a9ae382c53d18049cf', + 'bert_model.ckpt.meta': 'd2ddff3ed33b80091eac95171e94149736ea74eb645e575d942ec4a5e01a40a1', + 'vocab.txt': 'eeaa9875b23b04b4c54ef759d03db9d1ba1554838f8fb26c5d96fa551df93d02', + } + + self.bert_base_multilingual_cased_sha = { + 'bert_config.json': 'e76c3964bc14a8bb37a5530cdc802699d2f4a6fddfab0611e153aa2528f234f0', + 'bert_model.ckpt.data-00000-of-00001': '55b8a2df41f69c60c5180e50a7c31b7cdf6238909390c4ddf05fbc0d37aa1ac5', + 'bert_model.ckpt.index': '7d8509c2a62b4e300feb55f8e5f1eef41638f4998dd4d887736f42d4f6a34b37', + 'bert_model.ckpt.meta': '95e5f1997e8831f1c31e5cf530f1a2e99f121e9cd20887f2dce6fe9e3343e3fa', + 'vocab.txt': 'fe0fda7c425b48c516fc8f160d594c8022a0808447475c1a7c6d6479763f310c', + } + + self.bert_large_multilingual_uncased_sha = { + 'bert_config.json': '49063bb061390211d2fdd108cada1ed86faa5f90b80c8f6fdddf406afa4c4624', + 'bert_model.ckpt.data-00000-of-00001': '3cd83912ebeb0efe2abf35c9f1d5a515d8e80295e61c49b75c8853f756658429', + 'bert_model.ckpt.index': '87c372c1a3b1dc7effaaa9103c80a81b3cbab04c7933ced224eec3b8ad2cc8e7', + 'bert_model.ckpt.meta': '27f504f34f02acaa6b0f60d65195ec3e3f9505ac14601c6a32b421d0c8413a29', + 'vocab.txt': '87b44292b452f6c05afa49b2e488e7eedf79ea4f4c39db6f2f4b37764228ef3f', + } + + self.bert_base_chinese_sha = { + 'bert_config.json': '7aaad0335058e2640bcb2c2e9a932b1cd9da200c46ea7b8957d54431f201c015', + 'bert_model.ckpt.data-00000-of-00001': '756699356b78ad0ef1ca9ba6528297bcb3dd1aef5feadd31f4775d7c7fc989ba', + 'bert_model.ckpt.index': '46315546e05ce62327b3e2cd1bed22836adcb2ff29735ec87721396edb21b82e', + 'bert_model.ckpt.meta': 'c0f8d51e1ab986604bc2b25d6ec0af7fd21ff94cf67081996ec3f3bf5d823047', + 'vocab.txt': '45bbac6b341c319adc98a532532882e91a9cefc0329aa57bac9ae761c27b291c', + } + + # Relate SHA to urls for loop below + self.model_sha = { + 'bert_base_uncased': self.bert_base_uncased_sha, + 'bert_large_uncased': self.bert_large_uncased_sha, + 'bert_base_cased': self.bert_base_cased_sha, + 'bert_large_cased': self.bert_large_cased_sha, + 'bert_base_multilingual_cased': self.bert_base_multilingual_cased_sha, + 'bert_large_multilingual_uncased': self.bert_large_multilingual_uncased_sha, + 'bert_base_chinese': self.bert_base_chinese_sha + } + + # Helper to get sha256sum of a file + def sha256sum(self, filename): + h = hashlib.sha256() + b = bytearray(128*1024) + mv = memoryview(b) + with open(filename, 'rb', buffering=0) as f: + for n in iter(lambda : f.readinto(mv), 0): + h.update(mv[:n]) + + return h.hexdigest() + + def download(self): + # Iterate over urls: download, unzip, verify sha256sum + found_mismatch_sha = False + for model in self.model_urls: + url = self.model_urls[model][0] + file = self.save_path + '/' + self.model_urls[model][1] + + print('Downloading', url) + response = urllib.request.urlopen(url) + with open(file, 'wb') as handle: + handle.write(response.read()) + + print('Unzipping', file) + zip = zipfile.ZipFile(file, 'r') + zip.extractall(self.save_path) + zip.close() + + sha_dict = self.model_sha[model] + for extracted_file in sha_dict: + sha = sha_dict[extracted_file] + if sha != self.sha256sum(file[:-4] + '/' + extracted_file): + found_mismatch_sha = True + print('SHA256sum does not match on file:', extracted_file, 'from download url:', url) + else: + print(file[:-4] + '/' + extracted_file, '\t', 'verified') + + if not found_mismatch_sha: + print("All downloads pass sha256sum verification.") + + def serialize(self): + pass + + def deserialize(self): + pass + + def listAvailableWeights(self): + print("Available Weight Datasets") + for item in self.model_urls: + print(item) + + def listLocallyStoredWeights(self): + pass + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/NVIDIAPretrainedWeightDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/NVIDIAPretrainedWeightDownloader.py new file mode 100644 index 0000000..13c9a32 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/NVIDIAPretrainedWeightDownloader.py @@ -0,0 +1,27 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +class NVIDIAPretrainedWeightDownloader: + def __init__(self, save_path): + self.save_path = save_path + '/nvidia_pretrained_weights' + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + pass + + + def download(self): + assert False, 'NVIDIAPretrainedWeightDownloader not implemented yet.' \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedDownloader.py new file mode 100644 index 0000000..a2aef07 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedDownloader.py @@ -0,0 +1,93 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import bz2 +import glob +import gzip +import os +import urllib.request +import shutil +import sys + +class PubMedDownloader: + def __init__(self, subset, save_path): + self.subset = subset + # Modifying self.save_path in two steps to handle creation of subdirectories + self.save_path = save_path + '/pubmed' + '/' + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + self.save_path = self.save_path + '/' + subset + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + self.download_urls = { + 'baseline' : 'ftp://ftp.ncbi.nlm.nih.gov/pubmed/baseline/', + 'daily_update' : 'ftp://ftp.ncbi.nlm.nih.gov/pubmed/updatefiles/', + 'fulltext' : 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_bulk/', + 'open_access' : 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_bulk/' + } + + + def download(self): + print('subset:', self.subset) + url = self.download_urls[self.subset] + self.download_files(url) + self.extract_files() + + + def download_files(self, url): + url = self.download_urls[self.subset] + output = os.popen('curl ' + url).read() + + if self.subset == 'fulltext' or self.subset == 'open_access': + line_split = 'comm_use' if self.subset == 'fulltext' else 'non_comm_use' + for line in output.splitlines(): + if line[-10:] == 'xml.tar.gz' and \ + line.split(' ')[-1].split('.')[0] == line_split: + file = os.path.join(self.save_path, line.split(' ')[-1]) + if not os.path.isfile(file): + print('Downloading', file) + response = urllib.request.urlopen(url + line.split(' ')[-1]) + with open(file, "wb") as handle: + handle.write(response.read()) + + elif self.subset == 'baseline' or self.subset == 'daily_update': + for line in output.splitlines(): + if line[-3:] == '.gz': + file = os.path.join(self.save_path, line.split(' ')[-1]) + if not os.path.isfile(file): + print('Downloading', file) + response = urllib.request.urlopen(url + line.split(' ')[-1]) + with open(file, "wb") as handle: + handle.write(response.read()) + else: + assert False, 'Invalid PubMed dataset/subset specified.' + + def extract_files(self): + files = glob.glob(self.save_path + '/*.xml.gz') + + for file in files: + print('file:', file) + input = gzip.GzipFile(file, mode='rb') + s = input.read() + input.close() + + out = open(file[:-3], mode='wb') + out.write(s) + out.close() + + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedTextFormatting.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedTextFormatting.py new file mode 100644 index 0000000..df85178 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/PubMedTextFormatting.py @@ -0,0 +1,44 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import glob +import os +import pubmed_parser as pmp + +class PubMedTextFormatting: + def __init__(self, pubmed_path, output_filename, recursive = False): + self.pubmed_path = pubmed_path + self.recursive = recursive + self.output_filename = output_filename + + + # This puts one article per line + def merge(self): + print('PubMed path:', self.pubmed_path) + + with open(self.output_filename, mode='w', newline='\n') as ofile: + for filename in glob.glob(self.pubmed_path + '/*.xml*', recursive=self.recursive): + print('file:', filename) + dicts_out = pmp.parse_medline_xml(filename) + for dict_out in dicts_out: + if not dict_out['abstract']: + continue + try: + for line in dict_out['abstract'].splitlines(): + if len(line) < 30: + continue + ofile.write(line.strip() + " ") + ofile.write("\n\n") + except: + ofile.write("\n\n") + continue diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/README.md new file mode 100644 index 0000000..d7544da --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/README.md @@ -0,0 +1,32 @@ +Steps to reproduce datasets from web + +1) Build the container + * docker build -t bert_tf . +2) Run the container interactively + * nvidia-docker run -it --ipc=host bert_tf + * Optional: Mount data volumes + * -v yourpath:/workspace/bert/data/wikipedia_corpus/download + * -v yourpath:/workspace/bert/data/wikipedia_corpus/extracted_articles + * -v yourpath:/workspace/bert/data/wikipedia_corpus/raw_data + * -v yourpath:/workspace/bert/data/wikipedia_corpus/intermediate_files + * -v yourpath:/workspace/bert/data/wikipedia_corpus/final_text_file_single + * -v yourpath:/workspace/bert/data/wikipedia_corpus/final_text_files_sharded + * -v yourpath:/workspace/bert/data/wikipedia_corpus/final_tfrecords_sharded + * -v yourpath:/workspace/bert/data/bookcorpus/download + * -v yourpath:/workspace/bert/data/bookcorpus/final_text_file_single + * -v yourpath:/workspace/bert/data/bookcorpus/final_text_files_sharded + * -v yourpath:/workspace/bert/data/bookcorpus/final_tfrecords_sharded + * Optional: Select visible GPUs + * -e CUDA_VISIBLE_DEVICES=0 + +** Inside of the container starting here** +3) Download pretrained weights (they contain vocab files for preprocessing) + * cd data/pretrained_models_google && python3 download_models.py +4) "One-click" SQuAD download + * cd /workspace/bert/data/squad && . squad_download.sh +5) "One-click" Wikipedia data download and prep (provides tfrecords) + * Set your configuration in data/wikipedia_corpus/config.sh + * cd /data/wikipedia_corpus && ./run_preprocessing.sh +6) "One-click" BookCorpus data download and prep (provided tfrecords) + * Set your configuration in data/wikipedia_corpus/config.sh + * cd /data/bookcorpus && ./run_preprocessing.sh diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/SquadDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/SquadDownloader.py new file mode 100644 index 0000000..6d64ffc --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/SquadDownloader.py @@ -0,0 +1,54 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import bz2 +import os +import urllib.request +import sys + +class SquadDownloader: + def __init__(self, save_path): + self.save_path = save_path + '/squad' + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + if not os.path.exists(self.save_path + '/v1.1'): + os.makedirs(self.save_path + '/v1.1') + + if not os.path.exists(self.save_path + '/v2.0'): + os.makedirs(self.save_path + '/v2.0') + + self.download_urls = { + 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json' : 'v1.1/train-v1.1.json', + 'https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json' : 'v1.1/dev-v1.1.json', + 'https://worksheets.codalab.org/rest/bundles/0xbcd57bee090b421c982906709c8c27e1/contents/blob/' : 'v1.1/evaluate-v1.1.py', + 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json' : 'v2.0/train-v2.0.json', + 'https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v2.0.json' : 'v2.0/dev-v2.0.json', + 'https://worksheets.codalab.org/rest/bundles/0x6b567e1cf2e041ec80d7098f031c5c9e/contents/blob/' : 'v2.0/evaluate-v2.0.py', + } + + def download(self): + for item in self.download_urls: + url = item + file = self.download_urls[item] + + print('Downloading:', url) + if os.path.isfile(self.save_path + '/' + file): + print('** Download file already exists, skipping download') + else: + response = urllib.request.urlopen(url) + with open(self.save_path + '/' + file, "wb") as handle: + handle.write(response.read()) + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/TextSharding.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/TextSharding.py new file mode 100644 index 0000000..85012a5 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/TextSharding.py @@ -0,0 +1,331 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections import defaultdict +from itertools import islice + +import multiprocessing +import os +import statistics + +class Sharding: + def __init__(self, input_files, output_name_prefix, n_training_shards, n_test_shards, fraction_test_set): + assert len(input_files) > 0, 'The input file list must contain at least one file.' + assert n_training_shards > 0, 'There must be at least one output shard.' + assert n_test_shards > 0, 'There must be at least one output shard.' + + self.n_training_shards = n_training_shards + self.n_test_shards = n_test_shards + self.fraction_test_set = fraction_test_set + + self.input_files = input_files + + self.output_name_prefix = output_name_prefix + self.output_training_identifier = '_training' + self.output_test_identifier = '_test' + self.output_file_extension = '.txt' + + self.articles = {} # key: integer identifier, value: list of articles + self.sentences = {} # key: integer identifier, value: list of sentences + self.output_training_files = {} # key: filename, value: list of articles to go into file + self.output_test_files = {} # key: filename, value: list of articles to go into file + + self.init_output_files() + + + # Remember, the input files contain one article per line (the whitespace check is to skip extraneous blank lines) + def load_articles(self): + print('Start: Loading Articles') + + global_article_count = 0 + for input_file in self.input_files: + print('input file:', input_file) + with open(input_file, mode='r', newline='\n') as f: + for i, line in enumerate(f): + if line.strip(): + self.articles[global_article_count] = line.rstrip() + global_article_count += 1 + + print('End: Loading Articles: There are', len(self.articles), 'articles.') + + + def segment_articles_into_sentences(self, segmenter): + print('Start: Sentence Segmentation') + if len(self.articles) is 0: + self.load_articles() + + assert len(self.articles) is not 0, 'Please check that input files are present and contain data.' + + # TODO: WIP: multiprocessing (create independent ranges and spawn processes) + use_multiprocessing = 'serial' + + def chunks(data, size=len(self.articles)): + it = iter(data) + for i in range(0, len(data), size): + yield {k: data[k] for k in islice(it, size)} + + if use_multiprocessing == 'manager': + manager = multiprocessing.Manager() + return_dict = manager.dict() + jobs = [] + n_processes = 7 # in addition to the main process, total = n_proc+1 + + def work(articles, return_dict): + sentences = {} + for i, article in enumerate(articles): + sentences[i] = segmenter.segment_string(articles[article]) + + if i % 5000 == 0: + print('Segmenting article', i) + + return_dict.update(sentences) + + for item in chunks(self.articles, len(self.articles)): + p = multiprocessing.Process(target=work, args=(item, return_dict)) + + # Busy wait + while len(jobs) >= n_processes: + pass + + jobs.append(p) + p.start() + + for proc in jobs: + proc.join() + + elif use_multiprocessing == 'queue': + work_queue = multiprocessing.Queue() + jobs = [] + + for item in chunks(self.articles, len(self.articles)): + pass + + else: # serial option + for i, article in enumerate(self.articles): + self.sentences[i] = segmenter.segment_string(self.articles[article]) + + if i % 5000 == 0: + print('Segmenting article', i) + + print('End: Sentence Segmentation') + + + def init_output_files(self): + print('Start: Init Output Files') + assert len(self.output_training_files) is 0, 'Internal storage self.output_files already contains data. This function is intended to be used by the constructor only.' + assert len(self.output_test_files) is 0, 'Internal storage self.output_files already contains data. This function is intended to be used by the constructor only.' + + for i in range(self.n_training_shards): + name = self.output_name_prefix + self.output_training_identifier + '_' + str(i) + self.output_file_extension + self.output_training_files[name] = [] + + for i in range(self.n_test_shards): + name = self.output_name_prefix + self.output_test_identifier + '_' + str(i) + self.output_file_extension + self.output_test_files[name] = [] + + print('End: Init Output Files') + + + def get_sentences_per_shard(self, shard): + result = 0 + for article_id in shard: + result += len(self.sentences[article_id]) + + return result + + + def distribute_articles_over_shards(self): + print('Start: Distribute Articles Over Shards') + assert len(self.articles) >= self.n_training_shards + self.n_test_shards, 'There are fewer articles than shards. Please add more data or reduce the number of shards requested.' + + # Create dictionary with - key: sentence count per article, value: article id number + sentence_counts = defaultdict(lambda: []) + + max_sentences = 0 + total_sentences = 0 + + for article_id in self.sentences: + current_length = len(self.sentences[article_id]) + sentence_counts[current_length].append(article_id) + max_sentences = max(max_sentences, current_length) + total_sentences += current_length + + n_sentences_assigned_to_training = int((1 - self.fraction_test_set) * total_sentences) + nominal_sentences_per_training_shard = n_sentences_assigned_to_training // self.n_training_shards + nominal_sentences_per_test_shard = (total_sentences - n_sentences_assigned_to_training) // self.n_test_shards + + consumed_article_set = set({}) + unused_article_set = set(self.articles.keys()) + + # Make first pass and add one article worth of lines per file + for file in self.output_training_files: + current_article_id = sentence_counts[max_sentences][-1] + sentence_counts[max_sentences].pop(-1) + self.output_training_files[file].append(current_article_id) + consumed_article_set.add(current_article_id) + unused_article_set.remove(current_article_id) + + # Maintain the max sentence count + while len(sentence_counts[max_sentences]) == 0 and max_sentences > 0: + max_sentences -= 1 + + if len(self.sentences[current_article_id]) > nominal_sentences_per_training_shard: + nominal_sentences_per_training_shard = len(self.sentences[current_article_id]) + print('Warning: A single article contains more than the nominal number of sentences per training shard.') + + for file in self.output_test_files: + current_article_id = sentence_counts[max_sentences][-1] + sentence_counts[max_sentences].pop(-1) + self.output_test_files[file].append(current_article_id) + consumed_article_set.add(current_article_id) + unused_article_set.remove(current_article_id) + + # Maintain the max sentence count + while len(sentence_counts[max_sentences]) == 0 and max_sentences > 0: + max_sentences -= 1 + + if len(self.sentences[current_article_id]) > nominal_sentences_per_test_shard: + nominal_sentences_per_test_shard = len(self.sentences[current_article_id]) + print('Warning: A single article contains more than the nominal number of sentences per test shard.') + + training_counts = [] + test_counts = [] + + for shard in self.output_training_files: + training_counts.append(self.get_sentences_per_shard(self.output_training_files[shard])) + + for shard in self.output_test_files: + test_counts.append(self.get_sentences_per_shard(self.output_test_files[shard])) + + training_median = statistics.median(training_counts) + test_median = statistics.median(test_counts) + + # Make subsequent passes over files to find articles to add without going over limit + history_remaining = [] + n_history_remaining = 4 + + while len(consumed_article_set) < len(self.articles): + for fidx, file in enumerate(self.output_training_files): + nominal_next_article_size = min(nominal_sentences_per_training_shard - training_counts[fidx], max_sentences) + + # Maintain the max sentence count + while len(sentence_counts[max_sentences]) == 0 and max_sentences > 0: + max_sentences -= 1 + + while len(sentence_counts[nominal_next_article_size]) == 0 and nominal_next_article_size > 0: + nominal_next_article_size -= 1 + + if nominal_next_article_size not in sentence_counts or nominal_next_article_size is 0 or training_counts[fidx] > training_median: + continue # skip adding to this file, will come back later if no file can accept unused articles + + current_article_id = sentence_counts[nominal_next_article_size][-1] + sentence_counts[nominal_next_article_size].pop(-1) + + self.output_training_files[file].append(current_article_id) + consumed_article_set.add(current_article_id) + unused_article_set.remove(current_article_id) + + for fidx, file in enumerate(self.output_test_files): + nominal_next_article_size = min(nominal_sentences_per_test_shard - test_counts[fidx], max_sentences) + + # Maintain the max sentence count + while len(sentence_counts[max_sentences]) == 0 and max_sentences > 0: + max_sentences -= 1 + + while len(sentence_counts[nominal_next_article_size]) == 0 and nominal_next_article_size > 0: + nominal_next_article_size -= 1 + + if nominal_next_article_size not in sentence_counts or nominal_next_article_size is 0 or test_counts[fidx] > test_median: + continue # skip adding to this file, will come back later if no file can accept unused articles + + current_article_id = sentence_counts[nominal_next_article_size][-1] + sentence_counts[nominal_next_article_size].pop(-1) + + self.output_test_files[file].append(current_article_id) + consumed_article_set.add(current_article_id) + unused_article_set.remove(current_article_id) + + # If unable to place articles a few times, bump up nominal sizes by fraction until articles get placed + if len(history_remaining) == n_history_remaining: + history_remaining.pop(0) + history_remaining.append(len(unused_article_set)) + + history_same = True + for i in range(1, len(history_remaining)): + history_same = history_same and (history_remaining[i-1] == history_remaining[i]) + + if history_same: + nominal_sentences_per_training_shard += 1 + # nominal_sentences_per_test_shard += 1 + + training_counts = [] + test_counts = [] + for shard in self.output_training_files: + training_counts.append(self.get_sentences_per_shard(self.output_training_files[shard])) + + for shard in self.output_test_files: + test_counts.append(self.get_sentences_per_shard(self.output_test_files[shard])) + + training_median = statistics.median(training_counts) + test_median = statistics.median(test_counts) + + print('Distributing data over shards:', len(unused_article_set), 'articles remaining.') + + + if len(unused_article_set) != 0: + print('Warning: Some articles did not make it into output files.') + + + for shard in self.output_training_files: + print('Training shard:', self.get_sentences_per_shard(self.output_training_files[shard])) + + for shard in self.output_test_files: + print('Test shard:', self.get_sentences_per_shard(self.output_test_files[shard])) + + print('End: Distribute Articles Over Shards') + + + def write_shards_to_disk(self): + print('Start: Write Shards to Disk') + for shard in self.output_training_files: + self.write_single_shard(shard, self.output_training_files[shard], 'training') + + for shard in self.output_test_files: + self.write_single_shard(shard, self.output_test_files[shard], 'test') + + print('End: Write Shards to Disk') + + + def write_single_shard(self, shard_name, shard, split): + shard_split = os.path.split(shard_name) + shard_name = shard_split[0] + '/' + split + '/' + shard_split[1] + + with open(shard_name, mode='w', newline='\n') as f: + for article_id in shard: + for line in self.sentences[article_id]: + f.write(line + '\n') + + f.write('\n') # Line break between articles + + +import nltk + +nltk.download('punkt') + +class NLTKSegmenter: + def __init(self): + pass + + def segment_string(self, article): + return nltk.tokenize.sent_tokenize(article) + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikiDownloader.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikiDownloader.py new file mode 100644 index 0000000..87f9529 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikiDownloader.py @@ -0,0 +1,58 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import bz2 +import os +import urllib.request +import sys +import subprocess + +class WikiDownloader: + def __init__(self, language, save_path): + self.save_path = save_path + '/wikicorpus_' + language + + if not os.path.exists(self.save_path): + os.makedirs(self.save_path) + + self.language = language + self.download_urls = { + 'en' : 'https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2', + 'zh' : 'https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2' + } + + self.output_files = { + 'en' : 'wikicorpus_en.xml.bz2', + 'zh' : 'wikicorpus_zh.xml.bz2' + } + + + def download(self): + if self.language in self.download_urls: + url = self.download_urls[self.language] + filename = self.output_files[self.language] + + print('Downloading:', url) + if os.path.isfile(self.save_path + '/' + filename): + print('** Download file already exists, skipping download') + else: + response = urllib.request.urlopen(url) + with open(self.save_path + '/' + filename, "wb") as handle: + handle.write(response.read()) + + # Always unzipping since this is relatively fast and will overwrite + print('Unzipping:', self.output_files[self.language]) + subprocess.run('bzip2 -dk ' + self.save_path + '/' + filename, shell=True, check=True) + + else: + assert False, 'WikiDownloader not implemented for this language yet.' + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikicorpusTextFormatting.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikicorpusTextFormatting.py new file mode 100644 index 0000000..9d356b1 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/WikicorpusTextFormatting.py @@ -0,0 +1,46 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import glob +import os + +class WikicorpusTextFormatting: + def __init__(self, wiki_path, output_filename, recursive = False): + self.wiki_path = wiki_path + self.recursive = recursive + self.output_filename = output_filename + + + # This puts one article per line + def merge(self): + with open(self.output_filename, mode='w', newline='\n') as ofile: + for dirname in glob.glob(self.wiki_path + '/*/', recursive=False): + for filename in glob.glob(dirname + 'wiki_*', recursive=self.recursive): + print(filename) + article_lines = [] + article_open = False + + with open(filename, mode='r', newline='\n') as file: + for line in file: + if '' in line: + article_open = False + for oline in article_lines[1:]: + if oline != '\n': + ofile.write(oline.rstrip() + " ") + ofile.write("\n\n") + article_lines = [] + else: + if article_open: + article_lines.append(line) \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/__init__.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/__init__.py new file mode 100644 index 0000000..d49f0d0 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/bertPrep.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/bertPrep.py new file mode 100644 index 0000000..044e25a --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/bertPrep.py @@ -0,0 +1,387 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import BookscorpusTextFormatting +import Downloader +import TextSharding +import WikicorpusTextFormatting +import PubMedTextFormatting + +import argparse +import itertools +import multiprocessing +import os +import pprint +import subprocess + + +def main(args): + working_dir = os.environ['BERT_PREP_WORKING_DIR'] + + print('Working Directory:', working_dir) + print('Action:', args.action) + print('Dataset Name:', args.dataset) + + if args.input_files: + args.input_files = args.input_files.split(',') + + hdf5_tfrecord_folder_prefix = "/lower_case_" + str(args.do_lower_case) + "_seq_len_" + str(args.max_seq_length) \ + + "_max_pred_" + str(args.max_predictions_per_seq) + "_masked_lm_prob_" + str(args.masked_lm_prob) \ + + "_random_seed_" + str(args.random_seed) + "_dupe_factor_" + str(args.dupe_factor) \ + + "_shard_" + str(args.n_training_shards) + "_test_split_" + str(int(args.fraction_test_set * 100)) + directory_structure = { + 'download' : working_dir + '/download', # Downloaded and decompressed + 'extracted' : working_dir +'/extracted', # Extracted from whatever the initial format is (e.g., wikiextractor) + 'formatted' : working_dir + '/formatted_one_article_per_line', # This is the level where all sources should look the same + 'sharded' : working_dir + '/sharded', + 'tfrecord' : working_dir + '/tfrecord' + hdf5_tfrecord_folder_prefix, + 'hdf5': working_dir + '/hdf5'+ hdf5_tfrecord_folder_prefix, + } + + print('\nDirectory Structure:') + pp = pprint.PrettyPrinter(indent=2) + pp.pprint(directory_structure) + print('') + + if args.action == 'download': + if not os.path.exists(directory_structure['download']): + os.makedirs(directory_structure['download']) + + downloader = Downloader.Downloader(args.dataset, directory_structure['download']) + downloader.download() + + elif args.action == 'text_formatting': + assert args.dataset != 'google_pretrained_weights' and args.dataset != 'nvidia_pretrained_weights' \ + and args.dataset != 'squad' and args.dataset != 'MRPC' and args.dataset != 'CoLA' and \ + args.dataset != 'MNLI', 'Cannot perform text_formatting on pretrained weights' + + if not os.path.exists(directory_structure['extracted']): + os.makedirs(directory_structure['extracted']) + + if not os.path.exists(directory_structure['formatted']): + os.makedirs(directory_structure['formatted']) + + if args.dataset == 'bookscorpus': + books_path = directory_structure['download'] + '/bookscorpus' + #books_path = directory_structure['download'] + output_filename = directory_structure['formatted'] + '/bookscorpus_one_book_per_line.txt' + books_formatter = BookscorpusTextFormatting.BookscorpusTextFormatting(books_path, output_filename, recursive=True) + books_formatter.merge() + + elif args.dataset == 'wikicorpus_en': + if args.skip_wikiextractor == 0: + path_to_wikiextractor_in_container = '/workspace/wikiextractor/WikiExtractor.py' + wikiextractor_command = path_to_wikiextractor_in_container + ' ' + directory_structure['download'] + '/' + args.dataset + '/wikicorpus_en.xml ' + '-b 100M --processes ' + str(args.n_processes) + ' -o ' + directory_structure['extracted'] + '/' + args.dataset + print('WikiExtractor Command:', wikiextractor_command) + wikiextractor_process = subprocess.run(wikiextractor_command, shell=True, check=True) + + wiki_path = directory_structure['extracted'] + '/wikicorpus_en' + output_filename = directory_structure['formatted'] + '/wikicorpus_en_one_article_per_line.txt' + wiki_formatter = WikicorpusTextFormatting.WikicorpusTextFormatting(wiki_path, output_filename, recursive=True) + wiki_formatter.merge() + + elif args.dataset == 'wikicorpus_zh': + assert False, 'wikicorpus_zh not fully supported at this time. The simplified/tradition Chinese data needs to be translated and properly segmented still, and should work once this step is added.' + if args.skip_wikiextractor == 0: + path_to_wikiextractor_in_container = '/workspace/wikiextractor/WikiExtractor.py' + wikiextractor_command = path_to_wikiextractor_in_container + ' ' + directory_structure['download'] + '/' + args.dataset + '/wikicorpus_zh.xml ' + '-b 100M --processes ' + str(args.n_processes) + ' -o ' + directory_structure['extracted'] + '/' + args.dataset + print('WikiExtractor Command:', wikiextractor_command) + wikiextractor_process = subprocess.run(wikiextractor_command, shell=True, check=True) + + wiki_path = directory_structure['extracted'] + '/wikicorpus_zh' + output_filename = directory_structure['formatted'] + '/wikicorpus_zh_one_article_per_line.txt' + wiki_formatter = WikicorpusTextFormatting.WikicorpusTextFormatting(wiki_path, output_filename, recursive=True) + wiki_formatter.merge() + + elif args.dataset == 'pubmed_baseline': + pubmed_path = directory_structure['download'] + '/pubmed' + '/baseline' + output_filename = directory_structure['formatted'] + '/pubmed_baseline_one_article_per_line.txt' + pubmed_formatter = PubMedTextFormatting.PubMedTextFormatting(pubmed_path, output_filename, recursive=True) + pubmed_formatter.merge() + + elif args.action == 'sharding': + # Note: books+wiki requires user to provide list of input_files (comma-separated with no spaces) + if args.dataset == 'bookscorpus' or 'wikicorpus' in args.dataset or 'books_wiki' in args.dataset or 'pubmed' in args.dataset: + if args.input_files is None: + if args.dataset == 'bookscorpus': + args.input_files = [directory_structure['formatted'] + '/bookscorpus_one_book_per_line.txt'] + elif args.dataset == 'wikicorpus_en': + args.input_files = [directory_structure['formatted'] + '/wikicorpus_en_one_article_per_line.txt'] + elif args.dataset == 'wikicorpus_zh': + args.input_files = [directory_structure['formatted'] + '/wikicorpus_zh_one_article_per_line.txt'] + elif args.dataset == 'books_wiki_en_corpus': + args.input_files = [directory_structure['formatted'] + '/bookscorpus_one_book_per_line.txt', directory_structure['formatted'] + '/wikicorpus_en_one_article_per_line.txt'] + elif args.dataset == 'pubmed_baseline': + args.input_files = [directory_structure['formatted'] + '/pubmed_baseline_one_article_per_line.txt'] + + output_file_prefix = directory_structure['sharded'] + '/' + args.dataset + '/' + args.dataset + + if not os.path.exists(directory_structure['sharded']): + os.makedirs(directory_structure['sharded']) + + if not os.path.exists(directory_structure['sharded'] + '/' + args.dataset): + os.makedirs(directory_structure['sharded'] + '/' + args.dataset) + + if not os.path.exists(directory_structure['sharded'] + '/' + args.dataset + '/training'): + os.makedirs(directory_structure['sharded'] + '/' + args.dataset + '/training') + + if not os.path.exists(directory_structure['sharded'] + '/' + args.dataset + '/test'): + os.makedirs(directory_structure['sharded'] + '/' + args.dataset + '/test') + + # Segmentation is here because all datasets look the same in one article/book/whatever per line format, and + # it seemed unnecessarily complicated to add an additional preprocessing step to call just for this. + # Different languages (e.g., Chinese simplified/traditional) may require translation and + # other packages to be called from here -- just add a conditional branch for those extra steps + segmenter = TextSharding.NLTKSegmenter() + sharding = TextSharding.Sharding(args.input_files, output_file_prefix, args.n_training_shards, args.n_test_shards, args.fraction_test_set) + + sharding.load_articles() + sharding.segment_articles_into_sentences(segmenter) + sharding.distribute_articles_over_shards() + sharding.write_shards_to_disk() + + else: + assert False, 'Unsupported dataset for sharding' + + elif args.action == 'create_tfrecord_files': + if not os.path.exists(directory_structure['tfrecord'] + "/" + args.dataset): + os.makedirs(directory_structure['tfrecord'] + "/" + args.dataset) + + if not os.path.exists(directory_structure['tfrecord'] + "/" + args.dataset + '/training'): + os.makedirs(directory_structure['tfrecord'] + "/" + args.dataset + '/training') + + if not os.path.exists(directory_structure['tfrecord'] + "/" + args.dataset + '/test'): + os.makedirs(directory_structure['tfrecord'] + "/" + args.dataset + '/test') + + last_process = None + + def create_record_worker(filename_prefix, shard_id, output_format='tfrecord', split='training'): + bert_preprocessing_command = 'python /workspace/bert/utils/create_pretraining_data.py' + bert_preprocessing_command += ' --input_file=' + directory_structure['sharded'] + '/' + args.dataset + '/' + split + '/' + filename_prefix + '_' + str(shard_id) + '.txt' + bert_preprocessing_command += ' --output_file=' + directory_structure['tfrecord'] + '/' + args.dataset + '/' + split + '/' + filename_prefix + '_' + str(shard_id) + '.' + output_format + bert_preprocessing_command += ' --vocab_file=' + args.vocab_file + bert_preprocessing_command += ' --do_lower_case' if args.do_lower_case else '' + bert_preprocessing_command += ' --max_seq_length=' + str(args.max_seq_length) + bert_preprocessing_command += ' --max_predictions_per_seq=' + str(args.max_predictions_per_seq) + bert_preprocessing_command += ' --masked_lm_prob=' + str(args.masked_lm_prob) + bert_preprocessing_command += ' --random_seed=' + str(args.random_seed) + bert_preprocessing_command += ' --dupe_factor=' + str(args.dupe_factor) + bert_preprocessing_process = subprocess.Popen(bert_preprocessing_command, shell=True) + + last_process = bert_preprocessing_process + + # This could be better optimized (fine if all take equal time) + if shard_id % args.n_processes == 0 and shard_id > 0: + bert_preprocessing_process.wait() + + return last_process + + output_file_prefix = args.dataset + + for i in range(args.n_training_shards): + last_process = create_record_worker(output_file_prefix + '_training', i, 'tfrecord', 'training') + + last_process.wait() + + for i in range(args.n_test_shards): + last_process = create_record_worker(output_file_prefix + '_test', i, 'tfrecord', 'test') + + last_process.wait() + + + elif args.action == 'create_hdf5_files': + assert False, 'HDF5 format not fully supported in this release.' + + if not os.path.exists(directory_structure['hdf5'] + "/" + args.dataset): + os.makedirs(directory_structure['hdf5'] + "/" + args.dataset) + + last_process = None + + def create_record_worker(filename_prefix, shard_id, output_format='hdf5'): + bert_preprocessing_command = 'python /workspace/bert/utils/create_pretraining_data.py' + bert_preprocessing_command += ' --input_file=' + directory_structure['sharded'] + '/' + args.dataset + '/' + filename_prefix + '_' + str(shard_id) + '.txt' + bert_preprocessing_command += ' --output_file=' + directory_structure['hdf5'] + '/' + args.dataset + '/' + filename_prefix + '_' + str(shard_id) + '.' + output_format + bert_preprocessing_command += ' --vocab_file=' + args.vocab_file + bert_preprocessing_command += ' --do_lower_case' if args.do_lower_case else '' + bert_preprocessing_command += ' --max_seq_length=' + args.max_seq_length + bert_preprocessing_command += ' --max_predictions_per_seq=' + args.max_predictions_per_seq + bert_preprocessing_command += ' --masked_lm_prob=' + args.masked_lm_prob + bert_preprocessing_command += ' --random_seed=' + args.random_seed + bert_preprocessing_command += ' --dupe_factor=' + args.dupe_factor + bert_preprocessing_process = subprocess.Popen(bert_preprocessing_command, shell=True) + + last_process = bert_preprocessing_process + + # This could be better optimized (fine if all take equal time) + if shard_id % args.n_processes == 0 and shard_id > 0: + bert_preprocessing_process.wait() + + for i in range(args.n_training_shards): + create_record_worker(args.output_file_prefix + '_training', i) + + last_process.wait() + + for i in range(args.n_test_shards): + create_record_worker(args.output_file_prefix + '_test', i) + + last_process.wait() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description='Preprocessing Application for Everything BERT-related' + ) + + parser.add_argument( + '--action', + type=str, + help='Specify the action you want the app to take. e.g., generate vocab, segment, create tfrecords', + choices={ + 'download', # Download and verify mdf5/sha sums + 'text_formatting', # Convert into a file that contains one article/book per line + 'sharding', # Convert previous formatted text into shards containing one sentence per line + 'create_tfrecord_files', # Turn each shard into a TFrecord with masking and next sentence prediction info + 'create_hdf5_files' # Turn each shard into a HDF5 file with masking and next sentence prediction info + } + ) + + parser.add_argument( + '--dataset', + type=str, + help='Specify the dataset to perform --action on', + choices={ + 'bookscorpus', + 'wikicorpus_en', + 'wikicorpus_zh', + 'books_wiki_en_corpus', + 'pubmed_baseline', + 'pubmed_daily_update', + 'pubmed_fulltext', + 'pubmed_open_access', + 'google_pretrained_weights', + 'nvidia_pretrained_weights', + 'squad', + 'MRPC', + 'CoLA', + 'MNLI', + 'all' + } + ) + + parser.add_argument( + '--input_files', + type=str, + help='Specify the input files in a comma-separated list (no spaces)' + ) + + parser.add_argument( + '--n_training_shards', + type=int, + help='Specify the number of training shards to generate', + default=1472 + ) + + parser.add_argument( + '--n_test_shards', + type=int, + help='Specify the number of test shards to generate', + default=1472 + ) + + parser.add_argument( + '--fraction_test_set', + type=float, + help='Specify the fraction (0..1) of the data to withhold for the test data split (based on number of sequences)', + default=0.1 + ) + + parser.add_argument( + '--segmentation_method', + type=str, + help='Specify your choice of sentence segmentation', + choices={ + 'nltk' + }, + default='nltk' + ) + + parser.add_argument( + '--n_processes', + type=int, + help='Specify the max number of processes to allow at one time', + default=4 + ) + + parser.add_argument( + '--random_seed', + type=int, + help='Specify the base seed to use for any random number generation', + default=12345 + ) + + parser.add_argument( + '--dupe_factor', + type=int, + help='Specify the duplication factor', + default=5 + ) + + parser.add_argument( + '--masked_lm_prob', + type=float, + help='Specify the probability for masked lm', + default=0.15 + ) + + parser.add_argument( + '--max_seq_length', + type=int, + help='Specify the maximum sequence length', + default=512 + ) + + parser.add_argument( + '--max_predictions_per_seq', + type=int, + help='Specify the maximum number of masked words per sequence', + default=20 + ) + + parser.add_argument( + '--do_lower_case', + type=int, + help='Specify whether it is cased (0) or uncased (1) (any number greater than 0 will be treated as uncased)', + default=1 + ) + + parser.add_argument( + '--vocab_file', + type=str, + help='Specify absolute path to vocab file to use)' + ) + + parser.add_argument( + '--skip_wikiextractor', + type=int, + help='Specify whether to skip wikiextractor step 0=False, 1=True', + default=0 + ) + + parser.add_argument( + '--interactive_json_config_generator', + type=str, + help='Specify the action you want the app to take. e.g., generate vocab, segment, create tfrecords' + ) + + args = parser.parse_args() + main(args) diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_biobert_datasets_from_start.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_biobert_datasets_from_start.sh new file mode 100644 index 0000000..3f1a416 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_biobert_datasets_from_start.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export BERT_PREP_WORKING_DIR="${BERT_PREP_WORKING_DIR}" + +# Download +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset pubmed_baseline + +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset google_pretrained_weights # Includes vocab + +# Properly format the text files +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action text_formatting --dataset pubmed_baseline + + +# Shard the text files +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action sharding --dataset pubmed_baseline + +### BERT BASE + +## UNCASED + +# Create TFRecord files Phase 1 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset pubmed_baseline --max_seq_length 128 \ + --max_predictions_per_seq 20 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/uncased_L-12_H-768_A-12/vocab.txt + + +# Create TFRecord files Phase 2 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset pubmed_baseline --max_seq_length 512 \ + --max_predictions_per_seq 80 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/uncased_L-12_H-768_A-12/vocab.txt + + +## CASED + +# Create TFRecord files Phase 1 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset pubmed_baseline --max_seq_length 128 \ + --max_predictions_per_seq 20 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/cased_L-12_H-768_A-12/vocab.txt \ + --do_lower_case=0 + + +# Create TFRecord files Phase 2 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset pubmed_baseline --max_seq_length 512 \ + --max_predictions_per_seq 80 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/cased_L-12_H-768_A-12/vocab.txt \ + --do_lower_case=0 diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_datasets_from_start.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_datasets_from_start.sh new file mode 100644 index 0000000..f21914e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/create_datasets_from_start.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export BERT_PREP_WORKING_DIR="${BERT_PREP_WORKING_DIR}" + +# Download +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset bookscorpus +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset wikicorpus_en + +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset google_pretrained_weights # Includes vocab + +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset squad +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset "CoLA" +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset "MRPC" +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action download --dataset "MNLI" + + +# Properly format the text files +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action text_formatting --dataset bookscorpus +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action text_formatting --dataset wikicorpus_en + + +# Shard the text files (group wiki+books then shard) +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action sharding --dataset books_wiki_en_corpus + + +# Create TFRecord files Phase 1 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset books_wiki_en_corpus --max_seq_length 128 \ + --max_predictions_per_seq 20 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt + + +# Create TFRecord files Phase 2 +python3 ${BERT_PREP_WORKING_DIR}/bertPrep.py --action create_tfrecord_files --dataset books_wiki_en_corpus --max_seq_length 512 \ + --max_predictions_per_seq 80 --vocab_file ${BERT_PREP_WORKING_DIR}/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/bert_pipeline.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/bert_pipeline.png new file mode 100644 index 0000000..40193e9 Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/bert_pipeline.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/images_nvlamb.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/images_nvlamb.png new file mode 100644 index 0000000..a28f24e Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/images_nvlamb.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_base_summary.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_base_summary.png new file mode 100644 index 0000000..b0314f4 Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_base_summary.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_1.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_1.png new file mode 100644 index 0000000..c916b1a Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_1.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_8.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_8.png new file mode 100644 index 0000000..2d75cba Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_bs_8.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_dynamic.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_dynamic.png new file mode 100644 index 0000000..bc1a4c7 Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_dynamic.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_1.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_1.png new file mode 100644 index 0000000..05d8a7e Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_1.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_4.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_4.png new file mode 100644 index 0000000..9dff479 Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_ec_4.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_large_summary.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_large_summary.png new file mode 100644 index 0000000..b692487 Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_large_summary.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_static.png b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_static.png new file mode 100644 index 0000000..7e0815b Binary files /dev/null and b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/images/trtis_static.png differ diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/uncased_L-24_H-1024_A-16/bert_config.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/uncased_L-24_H-1024_A-16/bert_config.json new file mode 100644 index 0000000..63dfe77 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/data/uncased_L-24_H-1024_A-16/bert_config.json @@ -0,0 +1,13 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 1024, + "initializer_range": 0.02, + "intermediate_size": 4096, + "max_position_embeddings": 512, + "num_attention_heads": 16, + "num_hidden_layers": 24, + "type_vocab_size": 2, + "vocab_size": 30528 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/extract_features.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/extract_features.py new file mode 100644 index 0000000..60e3830 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/extract_features.py @@ -0,0 +1,419 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Extract pre-computed feature vectors from BERT.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import codecs +import collections +import json +import re + +import modeling +import tokenization +import tensorflow as tf + +flags = tf.flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string("input_file", None, "") + +flags.DEFINE_string("output_file", None, "") + +flags.DEFINE_string("layers", "-1,-2,-3,-4", "") + +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer("batch_size", 32, "Batch size for predictions.") + +flags.DEFINE_bool("use_tpu", False, "Whether to use TPU or GPU/CPU.") + +flags.DEFINE_string("master", None, + "If using a TPU, the address of the master.") + +flags.DEFINE_integer( + "num_tpu_cores", 8, + "Only used if `use_tpu` is True. Total number of TPU cores to use.") + +flags.DEFINE_bool( + "use_one_hot_embeddings", False, + "If True, tf.one_hot will be used for embedding lookups, otherwise " + "tf.nn.embedding_lookup will be used. On TPUs, this should be True " + "since it is much faster.") + + +class InputExample(object): + + def __init__(self, unique_id, text_a, text_b): + self.unique_id = unique_id + self.text_a = text_a + self.text_b = text_b + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, unique_id, tokens, input_ids, input_mask, input_type_ids): + self.unique_id = unique_id + self.tokens = tokens + self.input_ids = input_ids + self.input_mask = input_mask + self.input_type_ids = input_type_ids + + +def input_fn_builder(features, seq_length): + """Creates an `input_fn` closure to be passed to TPUEstimator.""" + + all_unique_ids = [] + all_input_ids = [] + all_input_mask = [] + all_input_type_ids = [] + + for feature in features: + all_unique_ids.append(feature.unique_id) + all_input_ids.append(feature.input_ids) + all_input_mask.append(feature.input_mask) + all_input_type_ids.append(feature.input_type_ids) + + def input_fn(params): + """The actual input function.""" + batch_size = params["batch_size"] + + num_examples = len(features) + + # This is for demo purposes and does NOT scale to large data sets. We do + # not use Dataset.from_generator() because that uses tf.py_func which is + # not TPU compatible. The right way to load data is with TFRecordReader. + d = tf.data.Dataset.from_tensor_slices({ + "unique_ids": + tf.constant(all_unique_ids, shape=[num_examples], dtype=tf.int32), + "input_ids": + tf.constant( + all_input_ids, shape=[num_examples, seq_length], + dtype=tf.int32), + "input_mask": + tf.constant( + all_input_mask, + shape=[num_examples, seq_length], + dtype=tf.int32), + "input_type_ids": + tf.constant( + all_input_type_ids, + shape=[num_examples, seq_length], + dtype=tf.int32), + }) + + d = d.batch(batch_size=batch_size, drop_remainder=False) + return d + + return input_fn + + +def model_fn_builder(bert_config, init_checkpoint, layer_indexes, use_tpu, + use_one_hot_embeddings): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + unique_ids = features["unique_ids"] + input_ids = features["input_ids"] + input_mask = features["input_mask"] + input_type_ids = features["input_type_ids"] + + model = modeling.BertModel( + config=bert_config, + is_training=False, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=input_type_ids, + use_one_hot_embeddings=use_one_hot_embeddings) + + if mode != tf.estimator.ModeKeys.PREDICT: + raise ValueError("Only PREDICT modes are supported: %s" % (mode)) + + tvars = tf.trainable_variables() + scaffold_fn = None + (assignment_map, + initialized_variable_names) = modeling.get_assignment_map_from_checkpoint( + tvars, init_checkpoint) + if use_tpu: + + def tpu_scaffold(): + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + return tf.train.Scaffold() + + scaffold_fn = tpu_scaffold + else: + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, + init_string) + + all_layers = model.get_all_encoder_layers() + + predictions = { + "unique_id": unique_ids, + } + + for (i, layer_index) in enumerate(layer_indexes): + predictions["layer_output_%d" % i] = all_layers[layer_index] + + output_spec = tf.contrib.tpu.TPUEstimatorSpec( + mode=mode, predictions=predictions, scaffold_fn=scaffold_fn) + return output_spec + + return model_fn + + +def convert_examples_to_features(examples, seq_length, tokenizer): + """Loads a data file into a list of `InputBatch`s.""" + + features = [] + for (ex_index, example) in enumerate(examples): + tokens_a = tokenizer.tokenize(example.text_a) + + tokens_b = None + if example.text_b: + tokens_b = tokenizer.tokenize(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for [CLS], [SEP], [SEP] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, seq_length - 3) + else: + # Account for [CLS] and [SEP] with "- 2" + if len(tokens_a) > seq_length - 2: + tokens_a = tokens_a[0:(seq_length - 2)] + + # The convention in BERT is: + # (a) For sequence pairs: + # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] + # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 + # (b) For single sequences: + # tokens: [CLS] the dog is hairy . [SEP] + # type_ids: 0 0 0 0 0 0 0 + # + # Where "type_ids" are used to indicate whether this is the first + # sequence or the second sequence. The embedding vectors for `type=0` and + # `type=1` were learned during pre-training and are added to the wordpiece + # embedding vector (and position vector). This is not *strictly* necessary + # since the [SEP] token unambiguously separates the sequences, but it makes + # it easier for the model to learn the concept of sequences. + # + # For classification tasks, the first vector (corresponding to [CLS]) is + # used as as the "sentence vector". Note that this only makes sense because + # the entire model is fine-tuned. + tokens = [] + input_type_ids = [] + tokens.append("[CLS]") + input_type_ids.append(0) + for token in tokens_a: + tokens.append(token) + input_type_ids.append(0) + tokens.append("[SEP]") + input_type_ids.append(0) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + input_type_ids.append(1) + tokens.append("[SEP]") + input_type_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < seq_length: + input_ids.append(0) + input_mask.append(0) + input_type_ids.append(0) + + assert len(input_ids) == seq_length + assert len(input_mask) == seq_length + assert len(input_type_ids) == seq_length + + if ex_index < 5: + tf.logging.info("*** Example ***") + tf.logging.info("unique_id: %s" % (example.unique_id)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info( + "input_type_ids: %s" % " ".join([str(x) for x in input_type_ids])) + + features.append( + InputFeatures( + unique_id=example.unique_id, + tokens=tokens, + input_ids=input_ids, + input_mask=input_mask, + input_type_ids=input_type_ids)) + return features + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + + +def read_examples(input_file): + """Read a list of `InputExample`s from an input file.""" + examples = [] + unique_id = 0 + with tf.gfile.GFile(input_file, "r") as reader: + while True: + line = tokenization.convert_to_unicode(reader.readline()) + if not line: + break + line = line.strip() + text_a = None + text_b = None + m = re.match(r"^(.*) \|\|\| (.*)$", line) + if m is None: + text_a = line + else: + text_a = m.group(1) + text_b = m.group(2) + examples.append( + InputExample(unique_id=unique_id, text_a=text_a, text_b=text_b)) + unique_id += 1 + return examples + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + layer_indexes = [int(x) for x in FLAGS.layers.split(",")] + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + run_config = tf.contrib.tpu.RunConfig( + master=FLAGS.master, + tpu_config=tf.contrib.tpu.TPUConfig( + num_shards=FLAGS.num_tpu_cores, + per_host_input_for_training=is_per_host)) + + examples = read_examples(FLAGS.input_file) + + features = convert_examples_to_features( + examples=examples, seq_length=FLAGS.max_seq_length, tokenizer=tokenizer) + + unique_id_to_feature = {} + for feature in features: + unique_id_to_feature[feature.unique_id] = feature + + model_fn = model_fn_builder( + bert_config=bert_config, + init_checkpoint=FLAGS.init_checkpoint, + layer_indexes=layer_indexes, + use_tpu=FLAGS.use_tpu, + use_one_hot_embeddings=FLAGS.use_one_hot_embeddings) + + # If TPU is not available, this will fall back to normal Estimator on CPU + # or GPU. + estimator = tf.contrib.tpu.TPUEstimator( + use_tpu=FLAGS.use_tpu, + model_fn=model_fn, + config=run_config, + predict_batch_size=FLAGS.batch_size) + + input_fn = input_fn_builder( + features=features, seq_length=FLAGS.max_seq_length) + + with codecs.getwriter("utf-8")(tf.gfile.Open(FLAGS.output_file, + "w")) as writer: + for result in estimator.predict(input_fn, yield_single_examples=True): + unique_id = int(result["unique_id"]) + feature = unique_id_to_feature[unique_id] + output_json = collections.OrderedDict() + output_json["linex_index"] = unique_id + all_features = [] + for (i, token) in enumerate(feature.tokens): + all_layers = [] + for (j, layer_index) in enumerate(layer_indexes): + layer_output = result["layer_output_%d" % j] + layers = collections.OrderedDict() + layers["index"] = layer_index + layers["values"] = [ + round(float(x), 6) for x in layer_output[i:(i + 1)].flat + ] + all_layers.append(layers) + features = collections.OrderedDict() + features["token"] = token + features["layers"] = all_layers + all_features.append(features) + output_json["features"] = all_features + writer.write(json.dumps(output_json) + "\n") + + +if __name__ == "__main__": + flags.mark_flag_as_required("input_file") + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("init_checkpoint") + flags.mark_flag_as_required("output_file") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fp16_utils.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fp16_utils.py new file mode 100644 index 0000000..6b8bda9 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fp16_utils.py @@ -0,0 +1,35 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import tensorflow as tf +import numpy as np + + +def float32_variable_storage_getter(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fused_layer_norm.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fused_layer_norm.py new file mode 100644 index 0000000..ff6e137 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/fused_layer_norm.py @@ -0,0 +1,141 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import copy +import json +import math +import re +import six +import tensorflow as tf + +from tensorflow.python.framework import ops +from tensorflow.contrib.layers.python.layers import utils +from tensorflow.contrib.framework.python.ops import variables +from tensorflow.python.ops import init_ops +import numpy +from tensorflow.python.ops import array_ops +from tensorflow.python.framework import dtypes +from tensorflow.python.ops import nn + +def fused_layer_norm(inputs, + center=True, + scale=True, + activation_fn=None, + reuse=None, + variables_collections=None, + outputs_collections=None, + trainable=True, + begin_norm_axis=1, + begin_params_axis=-1, + scope=None, + use_fused_batch_norm=False): + with tf.variable_scope( + scope, 'LayerNorm', [inputs], reuse=reuse) as sc: + inputs = ops.convert_to_tensor(inputs) + inputs_shape = inputs.shape + inputs_rank = inputs_shape.ndims + if inputs_rank is None: + raise ValueError('Inputs %s has undefined rank.' % inputs.name) + dtype = inputs.dtype.base_dtype + if begin_norm_axis < 0: + begin_norm_axis = inputs_rank + begin_norm_axis + if begin_params_axis >= inputs_rank or begin_norm_axis >= inputs_rank: + raise ValueError('begin_params_axis (%d) and begin_norm_axis (%d) ' + 'must be < rank(inputs) (%d)' % + (begin_params_axis, begin_norm_axis, inputs_rank)) + params_shape = inputs_shape[begin_params_axis:] + if not params_shape.is_fully_defined(): + raise ValueError( + 'Inputs %s: shape(inputs)[%s:] is not fully defined: %s' % + (inputs.name, begin_params_axis, inputs_shape)) + # Allocate parameters for the beta and gamma of the normalization. + beta, gamma = None, None + if center: + beta_collections = utils.get_variable_collections(variables_collections, + 'beta') + beta = variables.model_variable( + 'beta', + shape=params_shape, + dtype=dtype, + initializer=init_ops.zeros_initializer(), + collections=beta_collections, + trainable=trainable) + if scale: + gamma_collections = utils.get_variable_collections( + variables_collections, 'gamma') + gamma = variables.model_variable( + 'gamma', + shape=params_shape, + dtype=dtype, + initializer=init_ops.ones_initializer(), + collections=gamma_collections, + trainable=trainable) + if use_fused_batch_norm: + # get static TensorShape if fully defined, + # otherwise retrieve shape tensor + norm_shape = inputs.shape[begin_norm_axis:] + if norm_shape.is_fully_defined(): + bn_shape = [1, -1, 1, numpy.prod(norm_shape.as_list())] + else: + norm_shape = tf.shape(inputs)[begin_norm_axis:] + bn_shape = [1, -1, 1, tf.reduce_prod(norm_shape)] + if inputs.get_shape().is_fully_defined(): + outputs_shape = inputs.get_shape() + else: + outputs_shape = tf.shape(inputs) + inputs = array_ops.reshape(inputs, bn_shape) + if inputs.get_shape().is_fully_defined(): + # static inputs TensorShape fully defined after reshape. + ones = array_ops.ones(inputs.get_shape()[1], dtype=dtypes.float32) + zeros = array_ops.zeros(inputs.get_shape()[1], dtype=dtypes.float32) + else: + # static inputs TensorShape NOT fully defined after reshape. + # must use dynamic shape, which means these input tensors + # have to be created at runtime, which causes a slowdown. + scale_shape = tf.shape(inputs)[1] + ones = array_ops.ones(scale_shape, dtype=dtypes.float32) + zeros = array_ops.zeros(scale_shape, dtype=dtypes.float32) + outputs, mean, variance = nn.fused_batch_norm( + inputs, + ones, zeros, + epsilon=1e-4, + data_format="NCHW") + outputs = array_ops.reshape(outputs, outputs_shape) + if center and scale: + outputs = outputs * gamma + beta + elif center: + outputs = outputs + beta + elif scale: + outputs = outputs * gamma + else: + # Calculate the moments on the last axis (layer activations). + norm_axes = list(range(begin_norm_axis, inputs_rank)) + mean, variance = nn.moments(inputs, norm_axes, keep_dims=True) + # Compute layer normalization using the batch_normalization function. + variance_epsilon = 1e-4 + outputs = nn.batch_normalization( + inputs, + mean, + variance, + offset=beta, + scale=gamma, + variance_epsilon=variance_epsilon) + outputs.set_shape(inputs_shape) + if activation_fn is not None: + outputs = activation_fn(outputs) + return utils.collect_named_outputs(outputs_collections, sc.name, outputs) + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/gpu_environment.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/gpu_environment.py new file mode 100644 index 0000000..948c3fa --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/gpu_environment.py @@ -0,0 +1,36 @@ +# coding=utf-8 +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tensorflow as tf +import numpy as np + +def float32_variable_storage_getter(getter, name, shape=None, dtype=None, + initializer=None, regularizer=None, + trainable=True, + *args, **kwargs): + """Custom variable getter that forces trainable variables to be stored in + float32 precision and then casts them to the training precision. + """ + storage_dtype = tf.float32 if trainable else dtype + variable = getter(name, shape, dtype=storage_dtype, + initializer=initializer, regularizer=regularizer, + trainable=trainable, + *args, **kwargs) + if trainable and dtype != tf.float32: + variable = tf.cast(variable, dtype) + return variable + +def get_custom_getter(compute_type): + return float32_variable_storage_getter if compute_type == tf.float16 else None diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling.py new file mode 100644 index 0000000..700ce8c --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling.py @@ -0,0 +1,1031 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The main BERT model and related functions.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import copy +import json +import math +import re +import numpy as np +import six +import tensorflow as tf + +from gpu_environment import get_custom_getter + +from npu_bridge.estimator.npu_unary_ops import npu_unary_ops +from npu_bridge.estimator import npu_ops + +class BertConfig(object): + """Configuration for `BertModel`.""" + + def __init__(self, + vocab_size, + hidden_size=768, + num_hidden_layers=12, + num_attention_heads=12, + intermediate_size=3072, + hidden_act="gelu", + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + max_position_embeddings=512, + type_vocab_size=16, + initializer_range=0.02): + """Constructs BertConfig. + + Args: + vocab_size: Vocabulary size of `inputs_ids` in `BertModel`. + hidden_size: Size of the encoder layers and the pooler layer. + num_hidden_layers: Number of hidden layers in the Transformer encoder. + num_attention_heads: Number of attention heads for each attention layer in + the Transformer encoder. + intermediate_size: The size of the "intermediate" (i.e., feed-forward) + layer in the Transformer encoder. + hidden_act: The non-linear activation function (function or string) in the + encoder and pooler. + hidden_dropout_prob: The dropout probability for all fully connected + layers in the embeddings, encoder, and pooler. + attention_probs_dropout_prob: The dropout ratio for the attention + probabilities. + max_position_embeddings: The maximum sequence length that this model might + ever be used with. Typically set this to something large just in case + (e.g., 512 or 1024 or 2048). + type_vocab_size: The vocabulary size of the `token_type_ids` passed into + `BertModel`. + initializer_range: The stdev of the truncated_normal_initializer for + initializing all weight matrices. + """ + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.hidden_act = hidden_act + self.intermediate_size = intermediate_size + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.type_vocab_size = type_vocab_size + self.initializer_range = initializer_range + + @classmethod + def from_dict(cls, json_object): + """Constructs a `BertConfig` from a Python dictionary of parameters.""" + config = BertConfig(vocab_size=None) + for (key, value) in six.iteritems(json_object): + config.__dict__[key] = value + return config + + @classmethod + def from_json_file(cls, json_file): + """Constructs a `BertConfig` from a json file of parameters.""" + with tf.gfile.GFile(json_file, "r") as reader: + text = reader.read() + return cls.from_dict(json.loads(text)) + + def to_dict(self): + """Serializes this instance to a Python dictionary.""" + output = copy.deepcopy(self.__dict__) + return output + + def to_json_string(self): + """Serializes this instance to a JSON string.""" + return json.dumps(self.to_dict(), indent=2, sort_keys=True) + "\n" + + +class BertModel(object): + """BERT model ("Bidirectional Encoder Representations from Transformers"). + + Example usage: + + ```python + # Already been converted into WordPiece token ids + input_ids = tf.constant([[31, 51, 99], [15, 5, 0]]) + input_mask = tf.constant([[1, 1, 1], [1, 1, 0]]) + token_type_ids = tf.constant([[0, 0, 1], [0, 2, 0]]) + + config = modeling.BertConfig(vocab_size=32000, hidden_size=512, + num_hidden_layers=8, num_attention_heads=6, intermediate_size=1024) + + model = modeling.BertModel(config=config, is_training=True, + input_ids=input_ids, input_mask=input_mask, token_type_ids=token_type_ids) + + label_embeddings = tf.get_variable(...) + pooled_output = model.get_pooled_output() + logits = tf.matmul(pooled_output, label_embeddings) + ... + ``` + """ + + def __init__(self, + config, + is_training, + input_ids, + input_mask=None, + token_type_ids=None, + use_one_hot_embeddings=False, + scope=None, + compute_type=tf.float32): + """Constructor for BertModel. + + Args: + config: `BertConfig` instance. + is_training: bool. true for training model, false for eval model. Controls + whether dropout will be applied. + input_ids: int32 Tensor of shape [batch_size, seq_length]. + input_mask: (optional) int32 Tensor of shape [batch_size, seq_length]. + token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. + use_one_hot_embeddings: (optional) bool. Whether to use one-hot word + embeddings or tf.embedding_lookup() for the word embeddings. On the TPU, + it is much faster if this is True, on the CPU or GPU, it is faster if + this is False. + scope: (optional) variable scope. Defaults to "bert". + compute_type: (optional) either float32 or float16. Only applies to GPUs. + + Raises: + ValueError: The config is invalid or one of the input tensor shapes + is invalid. + """ + config = copy.deepcopy(config) + if not is_training: + config.hidden_dropout_prob = 0.0 + config.attention_probs_dropout_prob = 0.0 + + input_shape = get_shape_list(input_ids, expected_rank=2) + batch_size = input_shape[0] + seq_length = input_shape[1] + + if input_mask is None: + input_mask = tf.ones(shape=[batch_size, seq_length], dtype=tf.int32) + + if token_type_ids is None: + token_type_ids = tf.zeros(shape=[batch_size, seq_length], dtype=tf.int32) + + with tf.variable_scope(scope, default_name="bert", custom_getter=get_custom_getter(compute_type)): + with tf.variable_scope("embeddings"): + # For good convergence with mixed precision training, + # it is important that the embedding codes remain fp32. + # Perform embedding lookup on the word ids. + (self.embedding_output, self.embedding_table) = embedding_lookup( + input_ids=input_ids, + vocab_size=config.vocab_size, + embedding_size=config.hidden_size, + initializer_range=config.initializer_range, + word_embedding_name="word_embeddings", + use_one_hot_embeddings=use_one_hot_embeddings) + + # Add positional embeddings and token type embeddings, then layer + # normalize and perform dropout. + self.embedding_output = embedding_postprocessor( + input_tensor=self.embedding_output, + use_token_type=True, + token_type_ids=token_type_ids, + token_type_vocab_size=config.type_vocab_size, + token_type_embedding_name="token_type_embeddings", + use_position_embeddings=True, + position_embedding_name="position_embeddings", + initializer_range=config.initializer_range, + max_position_embeddings=config.max_position_embeddings, + dropout_prob=config.hidden_dropout_prob, + use_one_hot_embeddings=use_one_hot_embeddings) + + with tf.variable_scope("encoder"): + # This converts a 2D mask of shape [batch_size, seq_length] to a 3D + # mask of shape [batch_size, seq_length, seq_length] which is used + # for the attention scores. + attention_mask = create_attention_mask_from_input_mask( + input_ids, input_mask) + + # Run the stacked transformer. + # `sequence_output` shape = [batch_size, seq_length, hidden_size]. + self.all_encoder_layers = transformer_model( + input_tensor=tf.saturate_cast(self.embedding_output, compute_type), + attention_mask=attention_mask, + hidden_size=config.hidden_size, + num_hidden_layers=config.num_hidden_layers, + num_attention_heads=config.num_attention_heads, + intermediate_size=config.intermediate_size, + intermediate_act_fn=get_activation(config.hidden_act), + hidden_dropout_prob=config.hidden_dropout_prob, + attention_probs_dropout_prob=config.attention_probs_dropout_prob, + initializer_range=config.initializer_range, + do_return_all_layers=True) + self.sequence_output = tf.cast(self.all_encoder_layers[-1], tf.float32) + # The "pooler" converts the encoded sequence tensor of shape + # [batch_size, seq_length, hidden_size] to a tensor of shape + # [batch_size, hidden_size]. This is necessary for segment-level + # (or segment-pair-level) classification tasks where we need a fixed + # dimensional representation of the segment. + with tf.variable_scope("pooler"): + # We "pool" the model by simply taking the hidden state corresponding + # to the first token. We assume that this has been pre-trained + first_token_tensor = tf.squeeze(self.sequence_output[:, 0:1, :], axis=1) + if tf.flags.FLAGS.use_fp16_cls: + first_token_tensor = tf.cast(first_token_tensor, tf.float16) + self_pooled_output = tf.layers.dense( + first_token_tensor, + config.hidden_size, + activation=tf.tanh, + kernel_initializer=create_initializer(config.initializer_range)) + self.pooled_output = tf.cast(self_pooled_output, tf.float32) + + def get_pooled_output(self): + return self.pooled_output + + def get_sequence_output(self): + """Gets final hidden layer of encoder. + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size] corresponding + to the final hidden of the transformer encoder. + """ + return self.sequence_output + + def get_all_encoder_layers(self): + return self.all_encoder_layers + + def get_embedding_output(self): + """Gets output of the embedding lookup (i.e., input to the transformer). + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size] corresponding + to the output of the embedding layer, after summing the word + embeddings with the positional embeddings and the token type embeddings, + then performing layer normalization. This is the input to the transformer. + """ + return self.embedding_output + + def get_embedding_table(self): + return self.embedding_table + + +def gelu(x): + """Gaussian Error Linear Unit. + + This is a smoother version of the RELU. + Original paper: https://arxiv.org/abs/1606.08415 + Args: + x: float Tensor to perform activation. + + Returns: + `x` with the GELU activation applied. + """ + + if tf.flags.FLAGS.npu_bert_fused_gelu: + return npu_unary_ops.gelu(x) + else: + cdf = 0.5 * (1.0 + tf.tanh( + (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3))))) + return x * cdf + + + +def get_activation(activation_string): + """Maps a string to a Python function, e.g., "relu" => `tf.nn.relu`. + + Args: + activation_string: String name of the activation function. + + Returns: + A Python function corresponding to the activation function. If + `activation_string` is None, empty, or "linear", this will return None. + If `activation_string` is not a string, it will return `activation_string`. + + Raises: + ValueError: The `activation_string` does not correspond to a known + activation. + """ + + # We assume that anything that"s not a string is already an activation + # function, so we just return it. + if not isinstance(activation_string, six.string_types): + return activation_string + + if not activation_string: + return None + + act = activation_string.lower() + if act == "linear": + return None + elif act == "relu": + return tf.nn.relu + elif act == "gelu": + return gelu + elif act == "tanh": + return tf.tanh + else: + raise ValueError("Unsupported activation: %s" % act) + + +def get_assignment_map_from_checkpoint(tvars, init_checkpoint): + """Compute the union of the current variables and checkpoint variables.""" + assignment_map = {} + initialized_variable_names = {} + + name_to_variable = collections.OrderedDict() + for var in tvars: + name = var.name + m = re.match("^(.*):\\d+$", name) + if m is not None: + name = m.group(1) + name_to_variable[name] = var + + init_vars = tf.train.list_variables(init_checkpoint) + + assignment_map = collections.OrderedDict() + for x in init_vars: + (name, var) = (x[0], x[1]) + if name not in name_to_variable: + continue + assignment_map[name] = name + initialized_variable_names[name] = 1 + initialized_variable_names[name + ":0"] = 1 + + return (assignment_map, initialized_variable_names) + + +def dropout(input_tensor, dropout_prob): + """Perform dropout. + + Args: + input_tensor: float Tensor. + dropout_prob: Python float. The probability of dropping out a value (NOT of + *keeping* a dimension as in `tf.nn.dropout`). + + Returns: + A version of `input_tensor` with dropout applied. + """ + + if tf.flags.FLAGS.npu_bert_debug: + return input_tensor + + if dropout_prob is None or dropout_prob == 0.0: + return input_tensor + + if tf.flags.FLAGS.npu_bert_npu_dropout: + output = npu_ops.dropout(input_tensor, 1.0 - dropout_prob) + else: + output = tf.nn.dropout(input_tensor, 1.0 - dropout_prob) + return output + + +def layer_norm(input_tensor, name=None): + """Run layer normalization on the last dimension of the tensor.""" + if input_tensor.dtype == tf.float16: + try: + from fused_layer_norm import fused_layer_norm + return fused_layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name, + use_fused_batch_norm=tf.flags.FLAGS.npu_bert_use_fused_batch_norm) + except ImportError: + return tf.contrib.layers.layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name) + else: + return tf.contrib.layers.layer_norm( + inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name) + + +def layer_norm_and_dropout(input_tensor, dropout_prob, name=None): + """Runs layer normalization followed by dropout.""" + output_tensor = layer_norm(input_tensor, name) + output_tensor = dropout(output_tensor, dropout_prob) + return output_tensor + + +def create_initializer(initializer_range=0.02): + """Creates a `truncated_normal_initializer` with the given range.""" + return tf.truncated_normal_initializer(stddev=initializer_range) + + +def embedding_lookup(input_ids, + vocab_size, + embedding_size=128, + initializer_range=0.02, + word_embedding_name="word_embeddings", + use_one_hot_embeddings=False): + """Looks up words embeddings for id tensor. + + Args: + input_ids: int32 Tensor of shape [batch_size, seq_length] containing word + ids. + vocab_size: int. Size of the embedding vocabulary. + embedding_size: int. Width of the word embeddings. + initializer_range: float. Embedding initialization range. + word_embedding_name: string. Name of the embedding table. + use_one_hot_embeddings: bool. If True, use one-hot method for word + embeddings. If False, use `tf.gather()`. + + Returns: + float Tensor of shape [batch_size, seq_length, embedding_size]. + """ + # This function assumes that the input is of shape [batch_size, seq_length, + # num_inputs]. + # + # If the input is a 2D tensor of shape [batch_size, seq_length], we + # reshape to [batch_size, seq_length, 1]. + if input_ids.shape.ndims == 2: + input_ids = tf.expand_dims(input_ids, axis=[-1]) + + embedding_table = tf.get_variable( + name=word_embedding_name, + shape=[vocab_size, embedding_size], + initializer=create_initializer(initializer_range)) + + flat_input_ids = tf.reshape(input_ids, [-1]) + if use_one_hot_embeddings: + one_hot_input_ids = tf.one_hot(flat_input_ids, depth=vocab_size) + output = tf.matmul(one_hot_input_ids, embedding_table) + else: + if tf.flags.FLAGS.npu_gather: + output = gather_npu(embedding_table, flat_input_ids) + else: + output = tf.gather(embedding_table, flat_input_ids) + + input_shape = get_shape_list(input_ids) + + output = tf.reshape(output, + input_shape[0:-1] + [input_shape[-1] * embedding_size]) + return (output, embedding_table) + + +def embedding_postprocessor(input_tensor, + use_token_type=False, + token_type_ids=None, + token_type_vocab_size=16, + token_type_embedding_name="token_type_embeddings", + use_position_embeddings=True, + position_embedding_name="position_embeddings", + initializer_range=0.02, + max_position_embeddings=512, + dropout_prob=0.1, + use_one_hot_embeddings=False): + """Performs various post-processing on a word embedding tensor. + + Args: + input_tensor: float Tensor of shape [batch_size, seq_length, + embedding_size]. + use_token_type: bool. Whether to add embeddings for `token_type_ids`. + token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. + Must be specified if `use_token_type` is True. + token_type_vocab_size: int. The vocabulary size of `token_type_ids`. + token_type_embedding_name: string. The name of the embedding table variable + for token type ids. + use_position_embeddings: bool. Whether to add position embeddings for the + position of each token in the sequence. + position_embedding_name: string. The name of the embedding table variable + for positional embeddings. + initializer_range: float. Range of the weight initialization. + max_position_embeddings: int. Maximum sequence length that might ever be + used with this model. This can be longer than the sequence length of + input_tensor, but cannot be shorter. + dropout_prob: float. Dropout probability applied to the final output tensor. + use_one_hot_embeddings: (optional) bool. Whether to use one-hot word + embeddings or tf.embedding_lookup() for the word embeddings. + + Returns: + float tensor with same shape as `input_tensor`. + + Raises: + ValueError: One of the tensor shapes or input values is invalid. + """ + input_shape = get_shape_list(input_tensor, expected_rank=3) + batch_size = input_shape[0] + seq_length = input_shape[1] + width = input_shape[2] + + output = input_tensor + + if use_token_type: + if token_type_ids is None: + raise ValueError("`token_type_ids` must be specified if" + "`use_token_type` is True.") + token_type_table = tf.get_variable( + name=token_type_embedding_name, + shape=[token_type_vocab_size, width], + initializer=create_initializer(initializer_range)) + flat_token_type_ids = tf.reshape(token_type_ids, [-1]) + if use_one_hot_embeddings: + # This vocab will be small so we always do one-hot here, since it is + # always faster for a small vocabulary. + one_hot_ids = tf.one_hot(flat_token_type_ids, depth=token_type_vocab_size) + token_type_embeddings = tf.matmul(one_hot_ids, token_type_table) + else: + if tf.flags.FLAGS.npu_gather: + token_type_embeddings = gather_npu(token_type_table, flat_token_type_ids) + else: + token_type_embeddings = tf.gather(token_type_table, flat_token_type_ids) + token_type_embeddings = tf.reshape(token_type_embeddings, + [batch_size, seq_length, width]) + output += token_type_embeddings + + if use_position_embeddings: + full_position_embeddings = tf.get_variable( + name=position_embedding_name, + shape=[max_position_embeddings, width], + initializer=create_initializer(initializer_range)) + # Since the position embedding table is a learned variable, we create it + # using a (long) sequence length `max_position_embeddings`. The actual + # sequence length might be shorter than this, for faster training of + # tasks that do not have long sequences. + # + # So `full_position_embeddings` is effectively an embedding table + # for position [0, 1, 2, ..., max_position_embeddings-1], and the current + # sequence has positions [0, 1, 2, ... seq_length-1], so we can just + # perform a slice. + position_embeddings = tf.slice(full_position_embeddings, [0, 0], + [seq_length, width]) + num_dims = len(output.shape.as_list()) + + # Only the last two dimensions are relevant (`seq_length` and `width`), so + # we broadcast among the first dimensions, which is typically just + # the batch size. + position_broadcast_shape = [] + for _ in range(num_dims - 2): + position_broadcast_shape.append(1) + position_broadcast_shape.extend([seq_length, width]) + position_embeddings = tf.reshape(position_embeddings, + position_broadcast_shape) + output += position_embeddings + + output = layer_norm_and_dropout(output, dropout_prob) + return output + + +def create_attention_mask_from_input_mask(from_tensor, to_mask): + """Create 3D attention mask from a 2D tensor mask. + + Args: + from_tensor: 2D or 3D Tensor of shape [batch_size, from_seq_length, ...]. + to_mask: int32 Tensor of shape [batch_size, to_seq_length]. + + Returns: + float Tensor of shape [batch_size, from_seq_length, to_seq_length]. + """ + to_mask = tf.cast(to_mask, dtype=tf.float32) + + from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) + batch_size = from_shape[0] + + to_shape = get_shape_list(to_mask, expected_rank=2) + to_seq_length = to_shape[1] + + to_mask = tf.reshape(to_mask, [batch_size, 1, to_seq_length]) + # The mask will be automatically broadcasted to + # [batch_size, from_seq_length, to_seq_length] when it is used in the + # attention layer. + return to_mask + +def attention_layer(from_tensor, + to_tensor, + attention_mask=None, + num_attention_heads=1, + size_per_head=512, + query_act=None, + key_act=None, + value_act=None, + attention_probs_dropout_prob=0.0, + initializer_range=0.02, + do_return_2d_tensor=False, + batch_size=None, + from_seq_length=None, + to_seq_length=None): + """Performs multi-headed attention from `from_tensor` to `to_tensor`. + + This is an implementation of multi-headed attention based on "Attention + is all you Need". If `from_tensor` and `to_tensor` are the same, then + this is self-attention. Each timestep in `from_tensor` attends to the + corresponding sequence in `to_tensor`, and returns a fixed-with vector. + + This function first projects `from_tensor` into a "query" tensor and + `to_tensor` into "key" and "value" tensors. These are (effectively) a list + of tensors of length `num_attention_heads`, where each tensor is of shape + [batch_size, seq_length, size_per_head]. + + Then, the query and key tensors are dot-producted and scaled. These are + softmaxed to obtain attention probabilities. The value tensors are then + interpolated by these probabilities, then concatenated back to a single + tensor and returned. + + In practice, the multi-headed attention are done with transposes and + reshapes rather than actual separate tensors. + + Args: + from_tensor: float Tensor of shape [batch_size, from_seq_length, + from_width]. + to_tensor: float Tensor of shape [batch_size, to_seq_length, to_width]. + attention_mask: (optional) int32 Tensor of shape [batch_size, + from_seq_length, to_seq_length]. The values should be 1 or 0. The + attention scores will effectively be set to -infinity for any positions in + the mask that are 0, and will be unchanged for positions that are 1. + num_attention_heads: int. Number of attention heads. + size_per_head: int. Size of each attention head. + query_act: (optional) Activation function for the query transform. + key_act: (optional) Activation function for the key transform. + value_act: (optional) Activation function for the value transform. + attention_probs_dropout_prob: (optional) float. Dropout probability of the + attention probabilities. + initializer_range: float. Range of the weight initializer. + do_return_2d_tensor: bool. If True, the output will be of shape [batch_size + * from_seq_length, num_attention_heads * size_per_head]. If False, the + output will be of shape [batch_size, from_seq_length, num_attention_heads + * size_per_head]. + batch_size: (Optional) int. If the input is 2D, this might be the batch size + of the 3D version of the `from_tensor` and `to_tensor`. + from_seq_length: (Optional) If the input is 2D, this might be the seq length + of the 3D version of the `from_tensor`. + to_seq_length: (Optional) If the input is 2D, this might be the seq length + of the 3D version of the `to_tensor`. + + Returns: + float Tensor of shape [batch_size, from_seq_length, + num_attention_heads * size_per_head]. (If `do_return_2d_tensor` is + true, this will be of shape [batch_size * from_seq_length, + num_attention_heads * size_per_head]). + + Raises: + ValueError: Any of the arguments or tensor shapes are invalid. + """ + + def transpose_for_scores(input_tensor, batch_size, num_attention_heads, + seq_length, width): + output_tensor = tf.reshape( + input_tensor, [batch_size, seq_length, num_attention_heads, width]) + + output_tensor = tf.transpose(output_tensor, [0, 2, 1, 3]) + return output_tensor + + from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) + to_shape = get_shape_list(to_tensor, expected_rank=[2, 3]) + + if len(from_shape) != len(to_shape): + raise ValueError( + "The rank of `from_tensor` must match the rank of `to_tensor`.") + + if len(from_shape) == 3: + batch_size = from_shape[0] + from_seq_length = from_shape[1] + to_seq_length = to_shape[1] + elif len(from_shape) == 2: + if (batch_size is None or from_seq_length is None or to_seq_length is None): + raise ValueError( + "When passing in rank 2 tensors to attention_layer, the values " + "for `batch_size`, `from_seq_length`, and `to_seq_length` " + "must all be specified.") + + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # F = `from_tensor` sequence length + # T = `to_tensor` sequence length + # N = `num_attention_heads` + # H = `size_per_head` + + from_tensor_2d = reshape_to_matrix(from_tensor) + to_tensor_2d = reshape_to_matrix(to_tensor) + + # `query_layer` = [B*F, N*H] + query_layer = tf.layers.dense( + from_tensor_2d, + num_attention_heads * size_per_head, + activation=query_act, + name="query", + kernel_initializer=create_initializer(initializer_range)) + + # `key_layer` = [B*T, N*H] + key_layer = tf.layers.dense( + to_tensor_2d, + num_attention_heads * size_per_head, + activation=key_act, + name="key", + kernel_initializer=create_initializer(initializer_range)) + + # `value_layer` = [B*T, N*H] + value_layer = tf.layers.dense( + to_tensor_2d, + num_attention_heads * size_per_head, + activation=value_act, + name="value", + kernel_initializer=create_initializer(initializer_range)) + + # `query_layer` = [B, N, F, H] + query_layer = transpose_for_scores(query_layer, batch_size, + num_attention_heads, from_seq_length, + size_per_head) + + # `key_layer` = [B, N, T, H] + key_layer = transpose_for_scores(key_layer, batch_size, num_attention_heads, + to_seq_length, size_per_head) + + # Take the dot product between "query" and "key" to get the raw + # attention scores. + # `attention_scores` = [B, N, F, T] + attention_scores = tf.matmul(query_layer, key_layer, transpose_b=True) + attention_scores = tf.multiply(attention_scores, + 1.0 / math.sqrt(float(size_per_head))) + + if attention_mask is not None: + # `attention_mask` = [B, 1, F, T] + attention_mask = tf.expand_dims(attention_mask, axis=[1]) + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and -10000.0 for masked positions. + adder = (1.0 - tf.cast(attention_mask, attention_scores.dtype)) * -10000.0 + + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. + attention_scores += adder + + # Normalize the attention scores to probabilities. + # `attention_probs` = [B, N, F, T] + attention_probs = tf.nn.softmax(attention_scores) + + # This is actually dropping out entire tokens to attend to, which might + # seem a bit unusual, but is taken from the original Transformer paper. + attention_probs = dropout(attention_probs, attention_probs_dropout_prob) + + # `value_layer` = [B, T, N, H] + value_layer = tf.reshape( + value_layer, + [batch_size, to_seq_length, num_attention_heads, size_per_head]) + + # `value_layer` = [B, N, T, H] + value_layer = tf.transpose(value_layer, [0, 2, 1, 3]) + + # `context_layer` = [B, N, F, H] + context_layer = tf.matmul(attention_probs, value_layer) + + # `context_layer` = [B, F, N, H] + context_layer = tf.transpose(context_layer, [0, 2, 1, 3]) + + if do_return_2d_tensor: + # `context_layer` = [B*F, N*H] + context_layer = tf.reshape( + context_layer, + [batch_size * from_seq_length, num_attention_heads * size_per_head]) + else: + # `context_layer` = [B, F, N*H] + context_layer = tf.reshape( + context_layer, + [batch_size, from_seq_length, num_attention_heads * size_per_head]) + + return context_layer + + +def transformer_model(input_tensor, + attention_mask=None, + hidden_size=768, + num_hidden_layers=12, + num_attention_heads=12, + intermediate_size=3072, + intermediate_act_fn=gelu, + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + initializer_range=0.02, + do_return_all_layers=False): + """Multi-headed, multi-layer Transformer from "Attention is All You Need". + + This is almost an exact implementation of the original Transformer encoder. + + See the original paper: + https://arxiv.org/abs/1706.03762 + + Also see: + https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py + + Args: + input_tensor: float Tensor of shape [batch_size, seq_length, hidden_size]. + attention_mask: (optional) int32 Tensor of shape [batch_size, seq_length, + seq_length], with 1 for positions that can be attended to and 0 in + positions that should not be. + hidden_size: int. Hidden size of the Transformer. + num_hidden_layers: int. Number of layers (blocks) in the Transformer. + num_attention_heads: int. Number of attention heads in the Transformer. + intermediate_size: int. The size of the "intermediate" (a.k.a., feed + forward) layer. + intermediate_act_fn: function. The non-linear activation function to apply + to the output of the intermediate/feed-forward layer. + hidden_dropout_prob: float. Dropout probability for the hidden layers. + attention_probs_dropout_prob: float. Dropout probability of the attention + probabilities. + initializer_range: float. Range of the initializer (stddev of truncated + normal). + do_return_all_layers: Whether to also return all layers or just the final + layer. + + Returns: + float Tensor of shape [batch_size, seq_length, hidden_size], the final + hidden layer of the Transformer. + + Raises: + ValueError: A Tensor shape or parameter is invalid. + """ + if hidden_size % num_attention_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (hidden_size, num_attention_heads)) + + attention_head_size = int(hidden_size / num_attention_heads) + input_shape = get_shape_list(input_tensor, expected_rank=3) + batch_size = input_shape[0] + seq_length = input_shape[1] + input_width = input_shape[2] + + # The Transformer performs sum residuals on all layers so the input needs + # to be the same as the hidden size. + if input_width != hidden_size: + raise ValueError("The width of the input tensor (%d) != hidden size (%d)" % + (input_width, hidden_size)) + + # We keep the representation as a 2D tensor to avoid re-shaping it back and + # forth from a 3D tensor to a 2D tensor. Re-shapes are normally free on + # the GPU/CPU but may not be free on the TPU, so we want to minimize them to + # help the optimizer. + prev_output = reshape_to_matrix(input_tensor) + + all_layer_outputs = [] + for layer_idx in range(num_hidden_layers): + with tf.variable_scope("layer_%d" % layer_idx): + layer_input = prev_output + + with tf.variable_scope("attention"): + attention_heads = [] + with tf.variable_scope("self"): + attention_head = attention_layer( + from_tensor=layer_input, + to_tensor=layer_input, + attention_mask=attention_mask, + num_attention_heads=num_attention_heads, + size_per_head=attention_head_size, + attention_probs_dropout_prob=attention_probs_dropout_prob, + initializer_range=initializer_range, + do_return_2d_tensor=True, + batch_size=batch_size, + from_seq_length=seq_length, + to_seq_length=seq_length) + attention_heads.append(attention_head) + + attention_output = None + if len(attention_heads) == 1: + attention_output = attention_heads[0] + else: + # In the case where we have other sequences, we just concatenate + # them to the self-attention head before the projection. + attention_output = tf.concat(attention_heads, axis=-1) + + # Run a linear projection of `hidden_size` then add a residual + # with `layer_input`. + with tf.variable_scope("output"): + attention_output = tf.layers.dense( + attention_output, + hidden_size, + kernel_initializer=create_initializer(initializer_range)) + attention_output = dropout(attention_output, hidden_dropout_prob) + attention_output = layer_norm(attention_output + layer_input) + + # The activation is only applied to the "intermediate" hidden layer. + with tf.variable_scope("intermediate"): + intermediate_output = tf.layers.dense( + attention_output, + intermediate_size, + activation=intermediate_act_fn, + kernel_initializer=create_initializer(initializer_range)) + + # Down-project back to `hidden_size` then add the residual. + with tf.variable_scope("output"): + layer_output = tf.layers.dense( + intermediate_output, + hidden_size, + kernel_initializer=create_initializer(initializer_range)) + layer_output = dropout(layer_output, hidden_dropout_prob) + layer_output = layer_norm(layer_output + attention_output) + prev_output = layer_output + all_layer_outputs.append(layer_output) + + if do_return_all_layers: + final_outputs = [] + for layer_output in all_layer_outputs: + final_output = reshape_from_matrix(layer_output, input_shape) + final_outputs.append(final_output) + return final_outputs + else: + final_output = reshape_from_matrix(prev_output, input_shape) + return final_output + + +def get_shape_list(tensor, expected_rank=None, name=None): + """Returns a list of the shape of tensor, preferring static dimensions. + + Args: + tensor: A tf.Tensor object to find the shape of. + expected_rank: (optional) int. The expected rank of `tensor`. If this is + specified and the `tensor` has a different rank, and exception will be + thrown. + name: Optional name of the tensor for the error message. + + Returns: + A list of dimensions of the shape of tensor. All static dimensions will + be returned as python integers, and dynamic dimensions will be returned + as tf.Tensor scalars. + """ + if name is None: + name = tensor.name + + if expected_rank is not None: + assert_rank(tensor, expected_rank, name) + + shape = tensor.shape.as_list() + + non_static_indexes = [] + for (index, dim) in enumerate(shape): + if dim is None: + non_static_indexes.append(index) + + if not non_static_indexes: + return shape + + dyn_shape = tf.shape(tensor) + for index in non_static_indexes: + shape[index] = dyn_shape[index] + return shape + + +def reshape_to_matrix(input_tensor): + """Reshapes a >= rank 2 tensor to a rank 2 tensor (i.e., a matrix).""" + ndims = input_tensor.shape.ndims + if ndims < 2: + raise ValueError("Input tensor must have at least rank 2. Shape = %s" % + (input_tensor.shape)) + if ndims == 2: + return input_tensor + + width = input_tensor.shape[-1] + output_tensor = tf.reshape(input_tensor, [-1, width]) + return output_tensor + + +def reshape_from_matrix(output_tensor, orig_shape_list): + """Reshapes a rank 2 tensor back to its original rank >= 2 tensor.""" + if len(orig_shape_list) == 2: + return output_tensor + + output_shape = get_shape_list(output_tensor) + + orig_dims = orig_shape_list[0:-1] + width = output_shape[-1] + + return tf.reshape(output_tensor, orig_dims + [width]) + + +def assert_rank(tensor, expected_rank, name=None): + """Raises an exception if the tensor rank is not of the expected rank. + + Args: + tensor: A tf.Tensor to check the rank of. + expected_rank: Python integer or list of integers, expected rank. + name: Optional name of the tensor for the error message. + + Raises: + ValueError: If the expected shape doesn't match the actual shape. + """ + if name is None: + name = tensor.name + + expected_rank_dict = {} + if isinstance(expected_rank, six.integer_types): + expected_rank_dict[expected_rank] = True + else: + for x in expected_rank: + expected_rank_dict[x] = True + + actual_rank = tensor.shape.ndims + if actual_rank not in expected_rank_dict: + scope_name = tf.get_variable_scope().name + raise ValueError( + "For the tensor `%s` in scope `%s`, the actual rank " + "`%d` (shape = %s) is not equal to the expected rank `%s`" % + (name, scope_name, actual_rank, str(tensor.shape), str(expected_rank))) + +@tf.custom_gradient +def gather_npu(params, indices): + def grad(dy): + params_shape = tf.shape(params, out_type=tf.int64) + params_shape = tf.cast(params_shape, tf.int32) + grad_gather = tf.unsorted_segment_sum(dy, indices, params_shape[0]) + return grad_gather, None + return tf.gather(params, indices), grad + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling_test.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling_test.py new file mode 100644 index 0000000..817ad2d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/modeling_test.py @@ -0,0 +1,277 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import json +import random +import re + +import modeling +import six +import tensorflow as tf + + +class BertModelTest(tf.test.TestCase): + + class BertModelTester(object): + + def __init__(self, + parent, + batch_size=13, + seq_length=7, + is_training=True, + use_input_mask=True, + use_token_type_ids=True, + vocab_size=99, + hidden_size=32, + num_hidden_layers=5, + num_attention_heads=4, + intermediate_size=37, + hidden_act="gelu", + hidden_dropout_prob=0.1, + attention_probs_dropout_prob=0.1, + max_position_embeddings=512, + type_vocab_size=16, + initializer_range=0.02, + scope=None): + self.parent = parent + self.batch_size = batch_size + self.seq_length = seq_length + self.is_training = is_training + self.use_input_mask = use_input_mask + self.use_token_type_ids = use_token_type_ids + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + self.intermediate_size = intermediate_size + self.hidden_act = hidden_act + self.hidden_dropout_prob = hidden_dropout_prob + self.attention_probs_dropout_prob = attention_probs_dropout_prob + self.max_position_embeddings = max_position_embeddings + self.type_vocab_size = type_vocab_size + self.initializer_range = initializer_range + self.scope = scope + + def create_model(self): + input_ids = BertModelTest.ids_tensor([self.batch_size, self.seq_length], + self.vocab_size) + + input_mask = None + if self.use_input_mask: + input_mask = BertModelTest.ids_tensor( + [self.batch_size, self.seq_length], vocab_size=2) + + token_type_ids = None + if self.use_token_type_ids: + token_type_ids = BertModelTest.ids_tensor( + [self.batch_size, self.seq_length], self.type_vocab_size) + + config = modeling.BertConfig( + vocab_size=self.vocab_size, + hidden_size=self.hidden_size, + num_hidden_layers=self.num_hidden_layers, + num_attention_heads=self.num_attention_heads, + intermediate_size=self.intermediate_size, + hidden_act=self.hidden_act, + hidden_dropout_prob=self.hidden_dropout_prob, + attention_probs_dropout_prob=self.attention_probs_dropout_prob, + max_position_embeddings=self.max_position_embeddings, + type_vocab_size=self.type_vocab_size, + initializer_range=self.initializer_range) + + model = modeling.BertModel( + config=config, + is_training=self.is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=token_type_ids, + scope=self.scope) + + outputs = { + "embedding_output": model.get_embedding_output(), + "sequence_output": model.get_sequence_output(), + "pooled_output": model.get_pooled_output(), + "all_encoder_layers": model.get_all_encoder_layers(), + } + return outputs + + def check_output(self, result): + self.parent.assertAllEqual( + result["embedding_output"].shape, + [self.batch_size, self.seq_length, self.hidden_size]) + + self.parent.assertAllEqual( + result["sequence_output"].shape, + [self.batch_size, self.seq_length, self.hidden_size]) + + self.parent.assertAllEqual(result["pooled_output"].shape, + [self.batch_size, self.hidden_size]) + + def test_default(self): + self.run_tester(BertModelTest.BertModelTester(self)) + + def test_config_to_json_string(self): + config = modeling.BertConfig(vocab_size=99, hidden_size=37) + obj = json.loads(config.to_json_string()) + self.assertEqual(obj["vocab_size"], 99) + self.assertEqual(obj["hidden_size"], 37) + + def run_tester(self, tester): + with self.test_session() as sess: + ops = tester.create_model() + init_op = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + sess.run(init_op) + output_result = sess.run(ops) + tester.check_output(output_result) + + self.assert_all_tensors_reachable(sess, [init_op, ops]) + + @classmethod + def ids_tensor(cls, shape, vocab_size, rng=None, name=None): + """Creates a random int32 tensor of the shape within the vocab size.""" + if rng is None: + rng = random.Random() + + total_dims = 1 + for dim in shape: + total_dims *= dim + + values = [] + for _ in range(total_dims): + values.append(rng.randint(0, vocab_size - 1)) + + return tf.constant(value=values, dtype=tf.int32, shape=shape, name=name) + + def assert_all_tensors_reachable(self, sess, outputs): + """Checks that all the tensors in the graph are reachable from outputs.""" + graph = sess.graph + + ignore_strings = [ + "^.*/assert_less_equal/.*$", + "^.*/dilation_rate$", + "^.*/Tensordot/concat$", + "^.*/Tensordot/concat/axis$", + "^testing/.*$", + ] + + ignore_regexes = [re.compile(x) for x in ignore_strings] + + unreachable = self.get_unreachable_ops(graph, outputs) + filtered_unreachable = [] + for x in unreachable: + do_ignore = False + for r in ignore_regexes: + m = r.match(x.name) + if m is not None: + do_ignore = True + if do_ignore: + continue + filtered_unreachable.append(x) + unreachable = filtered_unreachable + + self.assertEqual( + len(unreachable), 0, "The following ops are unreachable: %s" % + (" ".join([x.name for x in unreachable]))) + + @classmethod + def get_unreachable_ops(cls, graph, outputs): + """Finds all of the tensors in graph that are unreachable from outputs.""" + outputs = cls.flatten_recursive(outputs) + output_to_op = collections.defaultdict(list) + op_to_all = collections.defaultdict(list) + assign_out_to_in = collections.defaultdict(list) + + for op in graph.get_operations(): + for x in op.inputs: + op_to_all[op.name].append(x.name) + for y in op.outputs: + output_to_op[y.name].append(op.name) + op_to_all[op.name].append(y.name) + if str(op.type) == "Assign": + for y in op.outputs: + for x in op.inputs: + assign_out_to_in[y.name].append(x.name) + + assign_groups = collections.defaultdict(list) + for out_name in assign_out_to_in.keys(): + name_group = assign_out_to_in[out_name] + for n1 in name_group: + assign_groups[n1].append(out_name) + for n2 in name_group: + if n1 != n2: + assign_groups[n1].append(n2) + + seen_tensors = {} + stack = [x.name for x in outputs] + while stack: + name = stack.pop() + if name in seen_tensors: + continue + seen_tensors[name] = True + + if name in output_to_op: + for op_name in output_to_op[name]: + if op_name in op_to_all: + for input_name in op_to_all[op_name]: + if input_name not in stack: + stack.append(input_name) + + expanded_names = [] + if name in assign_groups: + for assign_name in assign_groups[name]: + expanded_names.append(assign_name) + + for expanded_name in expanded_names: + if expanded_name not in stack: + stack.append(expanded_name) + + unreachable_ops = [] + for op in graph.get_operations(): + is_unreachable = False + all_names = [x.name for x in op.inputs] + [x.name for x in op.outputs] + for name in all_names: + if name not in seen_tensors: + is_unreachable = True + if is_unreachable: + unreachable_ops.append(op) + return unreachable_ops + + @classmethod + def flatten_recursive(cls, item): + """Flattens (potentially nested) a tuple/dictionary/list to a list.""" + output = [] + if isinstance(item, list): + output.extend(item) + elif isinstance(item, tuple): + output.extend(list(item)) + elif isinstance(item, dict): + for (_, v) in six.iteritems(item): + output.append(v) + else: + return [item] + + flat_output = [] + for x in output: + flat_output.extend(cls.flatten_recursive(x)) + return flat_output + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/multilingual.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/multilingual.md new file mode 100644 index 0000000..e355ec8 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/multilingual.md @@ -0,0 +1,305 @@ +## Models + +There are two multilingual models currently available. We do not plan to release +more single-language models, but we may release `BERT-Large` versions of these +two in the future: + +* **[`BERT-Base, Multilingual Cased (New, recommended)`](https://storage.googleapis.com/bert_models/2018_11_23/multi_cased_L-12_H-768_A-12.zip)**: + 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters +* **[`BERT-Base, Multilingual Uncased (Orig, not recommended)`](https://storage.googleapis.com/bert_models/2018_11_03/multilingual_L-12_H-768_A-12.zip)**: + 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters +* **[`BERT-Base, Chinese`](https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip)**: + Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M + parameters + +**The `Multilingual Cased (New)` model also fixes normalization issues in many +languages, so it is recommended in languages with non-Latin alphabets (and is +often better for most languages with Latin alphabets). When using this model, +make sure to pass `--do_lower_case=false` to `run_pretraining.py` and other +scripts.** + +See the [list of languages](#list-of-languages) that the Multilingual model +supports. The Multilingual model does include Chinese (and English), but if your +fine-tuning data is Chinese-only, then the Chinese model will likely produce +better results. + +## Results + +To evaluate these systems, we use the +[XNLI dataset](https://github.com/facebookresearch/XNLI) dataset, which is a +version of [MultiNLI](https://www.nyu.edu/projects/bowman/multinli/) where the +dev and test sets have been translated (by humans) into 15 languages. Note that +the training set was *machine* translated (we used the translations provided by +XNLI, not Google NMT). For clarity, we only report on 6 languages below: + + + +| System | English | Chinese | Spanish | German | Arabic | Urdu | +| --------------------------------- | -------- | -------- | -------- | -------- | -------- | -------- | +| XNLI Baseline - Translate Train | 73.7 | 67.0 | 68.8 | 66.5 | 65.8 | 56.6 | +| XNLI Baseline - Translate Test | 73.7 | 68.3 | 70.7 | 68.7 | 66.8 | 59.3 | +| BERT - Translate Train Cased | **81.9** | **76.6** | **77.8** | **75.9** | **70.7** | 61.6 | +| BERT - Translate Train Uncased | 81.4 | 74.2 | 77.3 | 75.2 | 70.5 | 61.7 | +| BERT - Translate Test Uncased | 81.4 | 70.1 | 74.9 | 74.4 | 70.4 | **62.1** | +| BERT - Zero Shot Uncased | 81.4 | 63.8 | 74.3 | 70.5 | 62.1 | 58.3 | + + + +The first two rows are baselines from the XNLI paper and the last three rows are +our results with BERT. + +**Translate Train** means that the MultiNLI training set was machine translated +from English into the foreign language. So training and evaluation were both +done in the foreign language. Unfortunately, training was done on +machine-translated data, so it is impossible to quantify how much of the lower +accuracy (compared to English) is due to the quality of the machine translation +vs. the quality of the pre-trained model. + +**Translate Test** means that the XNLI test set was machine translated from the +foreign language into English. So training and evaluation were both done on +English. However, test evaluation was done on machine-translated English, so the +accuracy depends on the quality of the machine translation system. + +**Zero Shot** means that the Multilingual BERT system was fine-tuned on English +MultiNLI, and then evaluated on the foreign language XNLI test. In this case, +machine translation was not involved at all in either the pre-training or +fine-tuning. + +Note that the English result is worse than the 84.2 MultiNLI baseline because +this training used Multilingual BERT rather than English-only BERT. This implies +that for high-resource languages, the Multilingual model is somewhat worse than +a single-language model. However, it is not feasible for us to train and +maintain dozens of single-language model. Therefore, if your goal is to maximize +performance with a language other than English or Chinese, you might find it +beneficial to run pre-training for additional steps starting from our +Multilingual model on data from your language of interest. + +Here is a comparison of training Chinese models with the Multilingual +`BERT-Base` and Chinese-only `BERT-Base`: + +System | Chinese +----------------------- | ------- +XNLI Baseline | 67.0 +BERT Multilingual Model | 74.2 +BERT Chinese-only Model | 77.2 + +Similar to English, the single-language model does 3% better than the +Multilingual model. + +## Fine-tuning Example + +The multilingual model does **not** require any special consideration or API +changes. We did update the implementation of `BasicTokenizer` in +`tokenization.py` to support Chinese character tokenization, so please update if +you forked it. However, we did not change the tokenization API. + +To test the new models, we did modify `run_classifier.py` to add support for the +[XNLI dataset](https://github.com/facebookresearch/XNLI). This is a 15-language +version of MultiNLI where the dev/test sets have been human-translated, and the +training set has been machine-translated. + +To run the fine-tuning code, please download the +[XNLI dev/test set](https://s3.amazonaws.com/xnli/XNLI-1.0.zip) and the +[XNLI machine-translated training set](https://s3.amazonaws.com/xnli/XNLI-MT-1.0.zip) +and then unpack both .zip files into some directory `$XNLI_DIR`. + +To run fine-tuning on XNLI. The language is hard-coded into `run_classifier.py` +(Chinese by default), so please modify `XnliProcessor` if you want to run on +another language. + +This is a large dataset, so this will training will take a few hours on a GPU +(or about 30 minutes on a Cloud TPU). To run an experiment quickly for +debugging, just set `num_train_epochs` to a small value like `0.1`. + +```shell +export BERT_BASE_DIR=/path/to/bert/chinese_L-12_H-768_A-12 # or multilingual_L-12_H-768_A-12 +export XNLI_DIR=/path/to/xnli + +python run_classifier.py \ + --task_name=XNLI \ + --do_train=true \ + --do_eval=true \ + --data_dir=$XNLI_DIR \ + --vocab_file=$BERT_BASE_DIR/vocab.txt \ + --bert_config_file=$BERT_BASE_DIR/bert_config.json \ + --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \ + --max_seq_length=128 \ + --train_batch_size=32 \ + --learning_rate=5e-5 \ + --num_train_epochs=2.0 \ + --output_dir=/tmp/xnli_output/ +``` + +With the Chinese-only model, the results should look something like this: + +``` + ***** Eval results ***** +eval_accuracy = 0.774116 +eval_loss = 0.83554 +global_step = 24543 +loss = 0.74603 +``` + +## Details + +### Data Source and Sampling + +The languages chosen were the +[top 100 languages with the largest Wikipedias](https://meta.wikimedia.org/wiki/List_of_Wikipedias). +The entire Wikipedia dump for each language (excluding user and talk pages) was +taken as the training data for each language + +However, the size of the Wikipedia for a given language varies greatly, and +therefore low-resource languages may be "under-represented" in terms of the +neural network model (under the assumption that languages are "competing" for +limited model capacity to some extent). + +However, the size of a Wikipedia also correlates with the number of speakers of +a language, and we also don't want to overfit the model by performing thousands +of epochs over a tiny Wikipedia for a particular language. + +To balance these two factors, we performed exponentially smoothed weighting of +the data during pre-training data creation (and WordPiece vocab creation). In +other words, let's say that the probability of a language is *P(L)*, e.g., +*P(English) = 0.21* means that after concatenating all of the Wikipedias +together, 21% of our data is English. We exponentiate each probability by some +factor *S* and then re-normalize, and sample from that distribution. In our case +we use *S=0.7*. So, high-resource languages like English will be under-sampled, +and low-resource languages like Icelandic will be over-sampled. E.g., in the +original distribution English would be sampled 1000x more than Icelandic, but +after smoothing it's only sampled 100x more. + +### Tokenization + +For tokenization, we use a 110k shared WordPiece vocabulary. The word counts are +weighted the same way as the data, so low-resource languages are upweighted by +some factor. We intentionally do *not* use any marker to denote the input +language (so that zero-shot training can work). + +Because Chinese (and Japanese Kanji and Korean Hanja) does not have whitespace +characters, we add spaces around every character in the +[CJK Unicode range](https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_\(Unicode_block\)) +before applying WordPiece. This means that Chinese is effectively +character-tokenized. Note that the CJK Unicode block only includes +Chinese-origin characters and does *not* include Hangul Korean or +Katakana/Hiragana Japanese, which are tokenized with whitespace+WordPiece like +all other languages. + +For all other languages, we apply the +[same recipe as English](https://github.com/google-research/bert#tokenization): +(a) lower casing+accent removal, (b) punctuation splitting, (c) whitespace +tokenization. We understand that accent markers have substantial meaning in some +languages, but felt that the benefits of reducing the effective vocabulary make +up for this. Generally the strong contextual models of BERT should make up for +any ambiguity introduced by stripping accent markers. + +### List of Languages + +The multilingual model supports the following languages. These languages were +chosen because they are the top 100 languages with the largest Wikipedias: + +* Afrikaans +* Albanian +* Arabic +* Aragonese +* Armenian +* Asturian +* Azerbaijani +* Bashkir +* Basque +* Bavarian +* Belarusian +* Bengali +* Bishnupriya Manipuri +* Bosnian +* Breton +* Bulgarian +* Burmese +* Catalan +* Cebuano +* Chechen +* Chinese (Simplified) +* Chinese (Traditional) +* Chuvash +* Croatian +* Czech +* Danish +* Dutch +* English +* Estonian +* Finnish +* French +* Galician +* Georgian +* German +* Greek +* Gujarati +* Haitian +* Hebrew +* Hindi +* Hungarian +* Icelandic +* Ido +* Indonesian +* Irish +* Italian +* Japanese +* Javanese +* Kannada +* Kazakh +* Kirghiz +* Korean +* Latin +* Latvian +* Lithuanian +* Lombard +* Low Saxon +* Luxembourgish +* Macedonian +* Malagasy +* Malay +* Malayalam +* Marathi +* Minangkabau +* Nepali +* Newar +* Norwegian (Bokmal) +* Norwegian (Nynorsk) +* Occitan +* Persian (Farsi) +* Piedmontese +* Polish +* Portuguese +* Punjabi +* Romanian +* Russian +* Scots +* Serbian +* Serbo-Croatian +* Sicilian +* Slovak +* Slovenian +* South Azerbaijani +* Spanish +* Sundanese +* Swahili +* Swedish +* Tagalog +* Tajik +* Tamil +* Tatar +* Telugu +* Turkish +* Ukrainian +* Urdu +* Uzbek +* Vietnamese +* Volapük +* Waray-Waray +* Welsh +* West +* Western Punjabi +* Yoruba + +The **Multilingual Cased (New)** release contains additionally **Thai** and +**Mongolian**, which were not included in the original release. diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/README.md new file mode 100644 index 0000000..1ef4bc3 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/README.md @@ -0,0 +1,173 @@ +``` +# Licensed under the Apache License, Version 2.0 (the "License") +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and limitations under the License. +``` + + + +# Table Of Contents +- [BERT Question Answering Fine-Tuning and Inference with Mixed Precision](#bert-question-answering-inference/fine-tuning-with-mixed-precision) +- [BioBERT Named-Entity Recognition Inference with Mixed Precision](#biobert-named-entity-recognition-inference-with-mixed-precision) + + +# BERT Question Answering Inference/Fine-Tuning with Mixed Precision + +## 1. Overview + +Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. + +The original paper can be found here: https://arxiv.org/abs/1810.04805. + +NVIDIA's BERT 19.10 is an optimized version of Google's official implementation, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy. + +### 1.a Learning objectives + +This repository contains multiple notebooks which demonstrate: +- Inference on QA task with BERT Large model +- The use/download of pretrained NVIDIA BERT models +- Fine-Tuning on SQuaD 2.0 Dataset +- Use of Mixed Precision for Inference and Fine-Tuning + +Here is a short description of each relevant file: + - _bert_squad_tf_inference.ipynb_ : BERT Q&A Inference with TF Checkpoint model + - _bert_squad_tf_finetuning.ipynb_ : BERT Fine-Tuning on SQuaD dataset + +## 2. Quick Start Guide + +### 2.a Build the BERT TensorFlow NGC container: +To run the notebook you first need to build the Bert TensorFlow container using the following command from the main directory of this repository: + +``` bash +docker build . --rm -t bert +``` +### 2.b Dataset + +We need to download the vocabulary and the bert_config files: + +``` python3 +python3 /workspace/bert/data/bertPrep.py --action download --dataset google_pretrained_weights # Includes vocab +``` + +This is only needed during fine-tuning in order to download the Squad dataset: + +``` python3 +python3 /workspace/bert/data/bertPrep.py --action download --dataset squad +``` + +### 2.c Start of the NGC container to run inference: +Once the image is built, you need to run the container with the `--publish +0.0.0.0:8888:8888` option to publish Jupyter's port `8888` to the host machine +at port `8888` over all network interfaces (`0.0.0.0`): + +```bash +nvidia-docker run \ + -v $PWD:/workspace/bert \ + -v $PWD/results:/results \ + --shm-size=1g \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + --publish 0.0.0.0:8888:8888 \ + -it bert:latest bash +``` + +Then you can use the following command within the BERT Tensorflow container under +`/workspace/bert`: + +```bash +jupyter notebook --ip=0.0.0.0 --allow-root +``` + +And navigate a web browser to the IP address or hostname of the host machine +at port `8888`: + +``` +http://[host machine]:8888 +``` + +Use the token listed in the output from running the `jupyter` command to log +in, for example: + +``` +http://[host machine]:8888/?token=aae96ae9387cd28151868fee318c3b3581a2d794f3b25c6b +``` + + +# BioBERT Named-Entity Recognition Inference with Mixed Precision + +## 1. Overview + +Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. + +BioBERT is a domain specific version of BERT that has been trained on PubMed abstracts. + +The original BioBERT paper can be found here: https://arxiv.org/abs/1901.08746 + +NVIDIA's BioBERT is an optimized version of the implementation presented in the paper, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy. + +### 1.a Learning objectives + +This repository contains an example notebook that demonstrates: +- Inference on NER task with BioBERT model +- The use/download of fine-tuned NVIDIA BioBERT models +- Use of Mixed Precision for Inference + +Here is a short description of the relevant file: + - _biobert_ner_tf_inference.ipynb_ : BioBERT Inference with TF Checkpoint model + +## 2. Quick Start Guide + +### 2.a Build the BERT TensorFlow NGC container: +To run the notebook you first need to build the Bert TensorFlow container using the following command from the main directory of this repository: + +``` bash +docker build . --rm -t bert +``` +### 2.b Start of the NGC container to run inference: +Once the image is built, you need to run the container with the `--publish +0.0.0.0:8888:8888` option to publish Jupyter's port `8888` to the host machine +at port `8888` over all network interfaces (`0.0.0.0`): + +```bash +nvidia-docker run \ + -v $PWD:/workspace/bert \ + -v $PWD/results:/results \ + --shm-size=1g \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + --publish 0.0.0.0:8888:8888 \ + -it bert:latest bash +``` + +Then you can use the following commands within the BERT Tensorflow container under +`/workspace/bert`: + + +Install spaCy. You'll use this to pre-process text and to visualize the results using displaCy. +``` +pip install spacy +python -m spacy download en_core_web_sm +``` + +Launch Jupyter. +```bash +jupyter notebook --ip=0.0.0.0 --allow-root +``` + +And navigate a web browser to the IP address or hostname of the host machine +at port `8888`: + +``` +http://[host machine]:8888 +``` + +Use the token listed in the output from running the `jupyter` command to log +in, for example: + +``` +http://[host machine]:8888/?token=aae96ae9387cd28151868fee318c3b3581a2d794f3b25c6b +``` + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_finetuning.ipynb b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_finetuning.ipynb new file mode 100644 index 0000000..25c0b8f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_finetuning.ipynb @@ -0,0 +1,624 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# BERT Question Answering Fine-Tuning with Mixed Precision" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Overview\n", + "\n", + "Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. \n", + "\n", + "The original paper can be found here: https://arxiv.org/abs/1810.04805.\n", + "\n", + "NVIDIA's BERT 19.10 is an optimized version of Google's official implementation, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.a Learning objectives\n", + "\n", + "This notebook demonstrates:\n", + "- Fine-Tuning on Question Answering (QA) task with BERT Large model\n", + "- The use/download of pretrained NVIDIA BERT models\n", + "- Use of Mixed Precision for Training" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Requirements\n", + "\n", + "Please refer to Section 2. of the ReadMe file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. BERT Question Answering Task\n", + "\n", + "Here we run QA fine-tuning on a pre-trained BERT model.\n", + "To fine-tune we will use the [SQuaD 1.1 Dataset](https://rajpurkar.github.io/SQuAD-explorer/) which contains 100,000+ question-answer pairs on 500+ articles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "\n", + "data_dir = '/workspace/bert/data/download'\n", + "\n", + "# SQuAD json for training\n", + "train_file = os.path.join(data_dir, 'squad/v1.1/train-v1.1.json')\n", + "# json for inference\n", + "predict_file = os.path.join(data_dir, 'squad/v1.1/dev-v1.1.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.a Mixed Precision\n", + "\n", + "Mixed precision training offers significant computational speedup by performing operations in half-precision format, while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of tensor cores in the Volta and Turing architectures, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures.\n", + "\n", + "For information about:\n", + "- How to train using mixed precision, see the [Mixed Precision Training](https://arxiv.org/abs/1710.03740) paper and [Training With Mixed Precision](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) documentation.\n", + "- How to access and enable AMP for TensorFlow, see [Using TF-AMP](https://docs.nvidia.com/deeplearning/dgx/tensorflow-user-guide/index.html#tfamp) from the TensorFlow User Guide.\n", + "- Techniques used for mixed precision training, see the [Mixed-Precision Training of Deep Neural Networks](https://devblogs.nvidia.com/mixed-precision-training-deep-neural-networks/) blog." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we control mixed precision execution with the following flag: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_fp16 = True;\n", + "\n", + "import os\n", + "os.environ[\"TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE\"] = \"1\" if use_fp16 else \"0\" \n", + "\n", + "# For detailed debug uncomment the following line:\n", + "#os.environ[\"TF_CPP_VMODULE\"]=\"auto_mixed_precision=2\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Pre-Trained NVIDIA BERT TF Models\n", + "\n", + "Based on the model size, we have the following two default configurations of BERT.\n", + "\n", + "| **Model** | **Hidden layers** | **Hidden unit size** | **Attention heads** | **Feedforward filter size** | **Max sequence length** | **Parameters** |\n", + "|:---------:|:----------:|:----:|:---:|:--------:|:---:|:----:|\n", + "|BERTBASE |12 encoder| 768| 12|4 x 768|512|110M|\n", + "|BERTLARGE|24 encoder|1024| 16|4 x 1024|512|330M|\n", + "\n", + "We will large use pre-trained models avaialble on NGC (NVIDIA GPU Cluster, https://ngc.nvidia.com).\n", + "There are many configuration available, in particular we will download and use the following:\n", + "\n", + "**bert_tf_large_fp16_384**\n", + "\n", + "Which is pre-trained using the Wikipedia and Book corpus datasets as training data. \n", + "We will fine-tune on the SQuaD 1.1 Dataset." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create the folders for the pre-trained models:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# bert_tf_large_fp16_384\n", + "DATA_DIR_FP16 = '/workspace/bert/data/download/pretrained_model_fp16'\n", + "!mkdir -p $DATA_DIR_FP16\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP16/bert_for_tensorflow.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/bert_for_tensorflow/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP16/ $DATA_DIR_FP16/bert_for_tensorflow.zip " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code that follows we will refer to this model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "notebooks_dir = '/workspace/bert/notebooks'\n", + "\n", + "working_dir = '/workspace/bert'\n", + "if working_dir not in sys.path:\n", + " sys.path.append(working_dir)\n", + "\n", + "init_checkpoint = os.path.join(data_dir, 'pretrained_model_fp16/model.ckpt-1000000')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Running QA task fine-tuning\n", + "\n", + "In order to run Q-A inference we will follow step-by-step a simplified flow implemented in run_squad.py:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import run_squad\n", + "\n", + "import json\n", + "import tensorflow as tf\n", + "import modeling\n", + "import tokenization\n", + "import time\n", + "import random\n", + "\n", + "import optimization\n", + "\n", + "tf.logging.set_verbosity(tf.logging.INFO)\n", + "\n", + "# Create the output directory where all the results are saved.\n", + "output_dir = os.path.join(working_dir, 'results')\n", + "tf.gfile.MakeDirs(output_dir)\n", + "\n", + "# The config json file corresponding to the pre-trained BERT model.\n", + "# This specifies the model architecture.\n", + "bert_config_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json')\n", + "\n", + "# The vocabulary file that the BERT model was trained on.\n", + "vocab_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt')\n", + "\n", + "# Whether to lower case the input text. \n", + "# Should be True for uncased models and False for cased models.\n", + "do_lower_case = True\n", + " \n", + "# Total batch size for predictions\n", + "predict_batch_size = 1\n", + "params = dict([('batch_size', predict_batch_size)])\n", + "\n", + "# The maximum total input sequence length after WordPiece tokenization. \n", + "# Sequences longer than this will be truncated, and sequences shorter than this will be padded.\n", + "max_seq_length = 384\n", + "\n", + "# When splitting up a long document into chunks, how much stride to take between chunks.\n", + "doc_stride = 128\n", + "\n", + "# The maximum number of tokens for the question. \n", + "# Questions longer than this will be truncated to this length.\n", + "max_query_length = 64\n", + "\n", + "# This is a WA to use flags from here:\n", + "flags = tf.flags\n", + "\n", + "if 'f' not in tf.flags.FLAGS: \n", + " tf.app.flags.DEFINE_string('f', '', 'kernel')\n", + "FLAGS = flags.FLAGS\n", + "# FLAGS.verbose_logging = True\n", + "\n", + "# The total number of n-best predictions to generate in the nbest_predictions.json output file.\n", + "n_best_size = 20\n", + "\n", + "# The maximum length of an answer that can be generated. \n", + "# This is needed because the start and end predictions are not conditioned on one another.\n", + "max_answer_length = 30\n", + "\n", + "# The initial learning rate for Adam\n", + "learning_rate = 5e-6\n", + "\n", + "# Total batch size for training\n", + "train_batch_size = 3\n", + "\n", + "# Proportion of training to perform linear learning rate warmup for\n", + "warmup_proportion = 0.1\n", + "\n", + "# # Total number of training epochs to perform (results will improve if trained with epochs)\n", + "num_train_epochs = 2\n", + "\n", + "global_batch_size = train_batch_size\n", + "training_hooks = []\n", + "training_hooks.append(run_squad.LogTrainRunHook(global_batch_size, 0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's create the tokenizer and the training tf_record:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Validate the casing config consistency with the checkpoint name.\n", + "tokenization.validate_case_matches_checkpoint(do_lower_case, init_checkpoint)\n", + "\n", + "# Create the tokenizer.\n", + "tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)\n", + " \n", + "# Load the configuration from file\n", + "bert_config = modeling.BertConfig.from_json_file(bert_config_file)\n", + "\n", + "config = tf.ConfigProto(log_device_placement=True) \n", + "\n", + "run_config = tf.estimator.RunConfig(\n", + " model_dir=output_dir,\n", + " session_config=config,\n", + " save_checkpoints_steps=1000,\n", + " keep_checkpoint_max=1)\n", + "\n", + "# Read the training examples from the training file:\n", + "train_examples = run_squad.read_squad_examples(input_file=train_file, is_training=True)\n", + "\n", + "num_train_steps = int(len(train_examples) / global_batch_size * num_train_epochs)\n", + "num_warmup_steps = int(num_train_steps * warmup_proportion)\n", + "\n", + "# Pre-shuffle the input to avoid having to make a very large shuffle\n", + "# buffer in in the `input_fn`.\n", + "rng = random.Random(12345)\n", + "rng.shuffle(train_examples)\n", + "\n", + "start_index = 0 \n", + "end_index = len(train_examples)\n", + "tmp_filenames = os.path.join(output_dir, \"train.tf_record\")\n", + "\n", + "# We write to a temporary file to avoid storing very large constant tensors\n", + "# in memory.\n", + "train_writer = run_squad.FeatureWriter(\n", + " filename=tmp_filenames,\n", + " is_training=True)\n", + "\n", + "run_squad.convert_examples_to_features(\n", + " examples=train_examples[start_index:end_index],\n", + " tokenizer=tokenizer,\n", + " max_seq_length=max_seq_length,\n", + " doc_stride=doc_stride,\n", + " max_query_length=max_query_length,\n", + " is_training=True,\n", + " output_fn=train_writer.process_feature)\n", + "\n", + "train_writer.close()\n", + "\n", + "tf.logging.info(\"***** Running training *****\")\n", + "tf.logging.info(\" Num orig examples = %d\", end_index - start_index)\n", + "tf.logging.info(\" Num split examples = %d\", train_writer.num_features)\n", + "tf.logging.info(\" Batch size = %d\", train_batch_size)\n", + "tf.logging.info(\" Num steps = %d\", num_train_steps)\n", + "tf.logging.info(\" LR = %f\", learning_rate)\n", + "\n", + "del train_examples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to create the model for the estimator:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def model_fn(features, labels, mode, params): # pylint: disable=unused-argument\n", + " unique_ids = features[\"unique_ids\"]\n", + " input_ids = features[\"input_ids\"]\n", + " input_mask = features[\"input_mask\"]\n", + " segment_ids = features[\"segment_ids\"]\n", + " \n", + " is_training = (mode == tf.estimator.ModeKeys.TRAIN)\n", + "\n", + " (start_logits, end_logits) = run_squad.create_model(\n", + " bert_config=bert_config,\n", + " is_training=is_training,\n", + " input_ids=input_ids,\n", + " input_mask=input_mask,\n", + " segment_ids=segment_ids,\n", + " use_one_hot_embeddings=False)\n", + "\n", + " tvars = tf.trainable_variables()\n", + "\n", + " initialized_variable_names = {}\n", + " if init_checkpoint:\n", + " (assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint)\n", + " tf.train.init_from_checkpoint(init_checkpoint, assignment_map)\n", + "\n", + " output_spec = None\n", + " if mode == tf.estimator.ModeKeys.TRAIN:\n", + " seq_length = modeling.get_shape_list(input_ids)[1]\n", + " \n", + " def compute_loss(logits, positions):\n", + " one_hot_positions = tf.one_hot(positions, depth=seq_length, dtype=tf.float32)\n", + " log_probs = tf.nn.log_softmax(logits, axis=-1)\n", + " loss = -tf.reduce_mean(tf.reduce_sum(one_hot_positions * log_probs, axis=-1))\n", + " return loss\n", + "\n", + " start_positions = features[\"start_positions\"]\n", + " end_positions = features[\"end_positions\"]\n", + " start_loss = compute_loss(start_logits, start_positions)\n", + " end_loss = compute_loss(end_logits, end_positions)\n", + " total_loss = (start_loss + end_loss) / 2.0\n", + " \n", + " train_op = optimization.create_optimizer(total_loss, learning_rate, num_train_steps, num_warmup_steps, None, False, use_fp16)\n", + " \n", + " output_spec = tf.estimator.EstimatorSpec(mode=mode, loss=total_loss, train_op=train_op)\n", + " \n", + " elif mode == tf.estimator.ModeKeys.PREDICT:\n", + " predictions = {\n", + " \"unique_ids\": unique_ids,\n", + " \"start_logits\": start_logits,\n", + " \"end_logits\": end_logits,\n", + " }\n", + " output_spec = tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)\n", + "\n", + " return output_spec\n", + "\n", + "estimator = tf.estimator.Estimator(\n", + " model_fn=model_fn,\n", + " config=run_config,\n", + " params=params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.a Fine Tuning\n", + "\n", + "Fine tuning is performed using the run_squad.py.\n", + "\n", + "The run_squad.sh script trains a model and performs evaluation on the SQuaD v1.1 dataset. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "train_input_fn = run_squad.input_fn_builder(\n", + " input_file=tmp_filenames,\n", + " batch_size=train_batch_size,\n", + " seq_length=max_seq_length,\n", + " is_training=True,\n", + " drop_remainder=True,\n", + " hvd=None)\n", + "\n", + "train_start_time = time.time()\n", + "estimator.train(input_fn=train_input_fn, hooks=training_hooks, max_steps=num_train_steps)\n", + "train_time_elapsed = time.time() - train_start_time\n", + "train_time_wo_startup = training_hooks[-1].total_time\n", + "\n", + "avg_sentences_per_second = num_train_steps * global_batch_size * 1.0 / train_time_wo_startup if train_time_wo_startup else 0\n", + "\n", + "tf.logging.info(\"-----------------------------\")\n", + "tf.logging.info(\"Total Training Time = %0.2f Training Time W/O start up overhead = %0.2f \"\n", + " \"Sentences processed = %d\", train_time_elapsed, train_time_wo_startup,\n", + " num_train_steps * global_batch_size)\n", + "tf.logging.info(\"Training Performance = %0.4f sentences/sec\", avg_sentences_per_second)\n", + "tf.logging.info(\"-----------------------------\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.b Inference\n", + "\n", + "Now we run inference with the fine-tuned model just saved:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "eval_examples = run_squad.read_squad_examples(\n", + " input_file=predict_file, is_training=False)\n", + "\n", + "eval_writer = run_squad.FeatureWriter(\n", + " filename=os.path.join(output_dir, \"eval.tf_record\"),\n", + " is_training=False)\n", + "\n", + "eval_features = []\n", + "def append_feature(feature):\n", + " eval_features.append(feature)\n", + " eval_writer.process_feature(feature)\n", + "\n", + "\n", + "# Loads a data file into a list of InputBatch's\n", + "run_squad.convert_examples_to_features(\n", + " examples=eval_examples,\n", + " tokenizer=tokenizer,\n", + " max_seq_length=max_seq_length,\n", + " doc_stride=doc_stride,\n", + " max_query_length=max_query_length,\n", + " is_training=False,\n", + " output_fn=append_feature)\n", + "\n", + "eval_writer.close()\n", + "\n", + "tf.logging.info(\"***** Running predictions *****\")\n", + "tf.logging.info(\" Num orig examples = %d\", len(eval_examples))\n", + "tf.logging.info(\" Num split examples = %d\", len(eval_features))\n", + "tf.logging.info(\" Batch size = %d\", predict_batch_size)\n", + "\n", + "predict_input_fn = run_squad.input_fn_builder(\n", + " input_file=eval_writer.filename,\n", + " batch_size=predict_batch_size,\n", + " seq_length=max_seq_length,\n", + " is_training=False,\n", + " drop_remainder=False)\n", + "\n", + "all_results = []\n", + "eval_hooks = [run_squad.LogEvalRunHook(predict_batch_size)]\n", + "eval_start_time = time.time()\n", + "for result in estimator.predict(\n", + " predict_input_fn, yield_single_examples=True, hooks=eval_hooks, checkpoint_path=None):\n", + " unique_id = int(result[\"unique_ids\"])\n", + " start_logits = [float(x) for x in result[\"start_logits\"].flat]\n", + " end_logits = [float(x) for x in result[\"end_logits\"].flat]\n", + " all_results.append(\n", + " run_squad.RawResult(\n", + " unique_id=unique_id,\n", + " start_logits=start_logits,\n", + " end_logits=end_logits))\n", + "\n", + "eval_time_elapsed = time.time() - eval_start_time\n", + "eval_time_wo_startup = eval_hooks[-1].total_time\n", + "num_sentences = eval_hooks[-1].count * predict_batch_size\n", + "avg_sentences_per_second = num_sentences * 1.0 / eval_time_wo_startup\n", + "\n", + "tf.logging.info(\"-----------------------------\")\n", + "tf.logging.info(\"Total Inference Time = %0.2f Inference Time W/O start up overhead = %0.2f \"\n", + " \"Sentences processed = %d\", eval_time_elapsed, eval_time_wo_startup,\n", + " num_sentences)\n", + "tf.logging.info(\"Inference Performance = %0.4f sentences/sec\", avg_sentences_per_second)\n", + "tf.logging.info(\"-----------------------------\")\n", + "\n", + "output_prediction_file = os.path.join(output_dir, \"predictions.json\")\n", + "output_nbest_file = os.path.join(output_dir, \"nbest_predictions.json\")\n", + "output_null_log_odds_file = os.path.join(output_dir, \"null_odds.json\")\n", + "\n", + "run_squad.write_predictions(eval_examples, eval_features, all_results,\n", + " n_best_size, max_answer_length,\n", + " do_lower_case, output_prediction_file,\n", + " output_nbest_file, output_null_log_odds_file)\n", + "\n", + "tf.logging.info(\"Inference Results:\")\n", + "\n", + "# Here we show only the prediction results, nbest prediction is also available in the output directory\n", + "results = \"\"\n", + "with open(output_prediction_file, 'r') as json_file:\n", + " data = json.load(json_file)\n", + " for question in eval_examples:\n", + " results += \"{}{}{}\".format(question.qas_id, question.question_text, data[question.qas_id])\n", + "\n", + "\n", + "from IPython.display import display, HTML\n", + "display(HTML(\"{}
IdQuestionAnswer
\".format(results))) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.b Evaluation\n", + "\n", + "Let's run evaluation using the script in the SQuaD1.1 folder and our fine-tuned model:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!python /workspace/bert/data/download/squad/v1.1/evaluate-v1.1.py \\\n", + " $predict_file \\\n", + " $output_dir/predictions.json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. What's next\n", + "\n", + "Now that you have fine-tuned a BERT model you may want to take a look ad the run_squad script which containd more options for fine-tuning." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference.ipynb b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference.ipynb new file mode 100644 index 0000000..27e6db1 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference.ipynb @@ -0,0 +1,577 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# BERT Question Answering Inference with Mixed Precision\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Overview\n", + "\n", + "Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. \n", + "\n", + "The original paper can be found here: https://arxiv.org/abs/1810.04805.\n", + "\n", + "NVIDIA's BERT 19.10 is an optimized version of Google's official implementation, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.a Learning objectives\n", + "\n", + "This notebook demonstrates:\n", + "- Inference on QA task with BERT Large model\n", + "- The use/download of fine-tuned NVIDIA BERT models\n", + "- Use of Mixed Precision for Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Requirements\n", + "\n", + "Please refer to the ReadMe file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. BERT Inference: Question Answering\n", + "\n", + "We can run inference on a fine-tuned BERT model for tasks like Question Answering.\n", + "\n", + "Here we use a BERT model fine-tuned on a [SQuaD 2.0 Dataset](https://rajpurkar.github.io/SQuAD-explorer/) which contains 100,000+ question-answer pairs on 500+ articles combined with over 50,000 new, unanswerable questions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.a Paragraph and Queries\n", + "\n", + "In this example we will ask our BERT model questions related to the following paragraph:\n", + "\n", + "**The Apollo Program**\n", + "_\"The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F. Kennedy's national goal of landing a man on the Moon and returning him safely to the Earth by the end of the 1960s, which he proposed in a May 25, 1961, address to Congress. Project Mercury was followed by the two-man Project Gemini. The first manned flight of Apollo was in 1968. Apollo ran from 1961 to 1972, and was supported by the two-man Gemini program which ran concurrently with it from 1962 to 1966. Gemini missions developed some of the space travel techniques that were necessary for the success of the Apollo missions. Apollo used Saturn family rockets as launch vehicles. Apollo/Saturn vehicles were also used for an Apollo Applications Program, which consisted of Skylab, a space station that supported three manned missions in 1973-74, and the Apollo-Soyuz Test Project, a joint Earth orbit mission with the Soviet Union in 1975.\"_\n", + "\n", + "The questions and relative answers expected are shown below:\n", + "\n", + " - **Q1:** \"What project put the first Americans into space?\" \n", + " - **A1:** \"Project Mercury\"\n", + " - **Q2:** \"What program was created to carry out these projects and missions?\"\n", + " - **A2:** \"The Apollo program\"\n", + " - **Q3:** \"What year did the first manned Apollo flight occur?\"\n", + " - **A3:** \"1968\"\n", + " - **Q4:** \"What President is credited with the original notion of putting Americans in space?\"\n", + " - **A4:** \"John F. Kennedy\"\n", + " - **Q5:** \"Who did the U.S. collaborate with on an Earth orbit mission in 1975?\"\n", + " - **A5:** \"Soviet Union\"\n", + " - **Q6:** \"How long did Project Apollo run?\"\n", + " - **A6:** \"1961 to 1972\"\n", + " - **Q7:** \"What program helped develop space travel techniques that Project Apollo used?\"\n", + " - **A7:** \"Gemini Mission\"\n", + " - **Q8:** \"What space station supported three manned missions in 1973-1974?\"\n", + " - **A8:** \"Skylab\"\n", + " \n", + "---\n", + "\n", + "The paragraph and the questions can be easily customized by changing the code below:\n", + "\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile input.json\n", + "{\"data\": \n", + " [\n", + " {\"title\": \"Project Apollo\",\n", + " \"paragraphs\": [\n", + " {\"context\":\"The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F. Kennedy's national goal of landing a man on the Moon and returning him safely to the Earth by the end of the 1960s, which he proposed in a May 25, 1961, address to Congress. Project Mercury was followed by the two-man Project Gemini. The first manned flight of Apollo was in 1968. Apollo ran from 1961 to 1972, and was supported by the two man Gemini program which ran concurrently with it from 1962 to 1966. Gemini missions developed some of the space travel techniques that were necessary for the success of the Apollo missions. Apollo used Saturn family rockets as launch vehicles. Apollo/Saturn vehicles were also used for an Apollo Applications Program, which consisted of Skylab, a space station that supported three manned missions in 1973-74, and the Apollo-Soyuz Test Project, a joint Earth orbit mission with the Soviet Union in 1975.\", \n", + " \"qas\": [\n", + " { \"question\": \"What project put the first Americans into space?\", \n", + " \"id\": \"Q1\"\n", + " },\n", + " { \"question\": \"What program was created to carry out these projects and missions?\",\n", + " \"id\": \"Q2\"\n", + " },\n", + " { \"question\": \"What year did the first manned Apollo flight occur?\",\n", + " \"id\": \"Q3\"\n", + " }, \n", + " { \"question\": \"What President is credited with the original notion of putting Americans in space?\",\n", + " \"id\": \"Q4\"\n", + " },\n", + " { \"question\": \"Who did the U.S. collaborate with on an Earth orbit mission in 1975?\",\n", + " \"id\": \"Q5\"\n", + " },\n", + " { \"question\": \"How long did Project Apollo run?\",\n", + " \"id\": \"Q6\"\n", + " }, \n", + " { \"question\": \"What program helped develop space travel techniques that Project Apollo used?\",\n", + " \"id\": \"Q7\"\n", + " }, \n", + " {\"question\": \"What space station supported three manned missions in 1973-1974?\",\n", + " \"id\": \"Q8\"\n", + " } \n", + "]}]}]}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "\n", + "notebooks_dir = '/workspace/bert/notebooks'\n", + "data_dir = '/workspace/bert/data/download'\n", + "\n", + "working_dir = '/workspace/bert'\n", + "if working_dir not in sys.path:\n", + " sys.path.append(working_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_file = os.path.join(notebooks_dir, 'input.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.b Mixed Precision\n", + "\n", + "Mixed precision training offers significant computational speedup by performing operations in half-precision format, while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of tensor cores in the Volta and Turing architectures, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures.\n", + "\n", + "For information about:\n", + "- How to train using mixed precision, see the [Mixed Precision Training](https://arxiv.org/abs/1710.03740) paper and [Training With Mixed Precision](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) documentation.\n", + "- How to access and enable AMP for TensorFlow, see [Using TF-AMP](https://docs.nvidia.com/deeplearning/dgx/tensorflow-user-guide/index.html#tfamp) from the TensorFlow User Guide.\n", + "- Techniques used for mixed precision training, see the [Mixed-Precision Training of Deep Neural Networks](https://devblogs.nvidia.com/mixed-precision-training-deep-neural-networks/) blog." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we control mixed precision execution with the environmental variable:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"TF_ENABLE_AUTO_MIXED_PRECISION\"] = \"1\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can choose the mixed precision model (which takes much less time to train than the fp32 version) without losing accuracy, with the following flag: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_mixed_precision_model = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To effectively evaluate the speedup of mixed precision try a bigger workload by uncommenting the following line:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#input_file = '/workspace/bert/data/download/squad/v2.0/dev-v2.0.json'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Fine-Tuned NVIDIA BERT TF Models\n", + "\n", + "Based on the model size, we have the following two default configurations of BERT.\n", + "\n", + "| **Model** | **Hidden layers** | **Hidden unit size** | **Attention heads** | **Feedforward filter size** | **Max sequence length** | **Parameters** |\n", + "|:---------:|:----------:|:----:|:---:|:--------:|:---:|:----:|\n", + "|BERTBASE |12 encoder| 768| 12|4 x 768|512|110M|\n", + "|BERTLARGE|24 encoder|1024| 16|4 x 1024|512|330M|\n", + "\n", + "We will take advantage of the fine-tuned models available on NGC (NVIDIA GPU Cluster, https://ngc.nvidia.com).\n", + "Among the many configurations available we will download these two:\n", + "\n", + " - **bert_tf_v2_large_fp32_384**\n", + "\n", + " - **bert_tf_v2_large_fp16_384**\n", + "\n", + "Which are trained on the SQuaD 2.0 Dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# bert_tf_v2_large_fp32_384\n", + "DATA_DIR_FP32='/workspace/bert/data/download/finetuned_model_fp32'\n", + "!mkdir -p $DATA_DIR_FP32\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP32/bert_tf_v2_large_fp32_384.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_v2_large_fp32_384/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP32/ $DATA_DIR_FP32/bert_tf_v2_large_fp32_384.zip \n", + " \n", + "# bert_tf_v2_large_fp16_384\n", + "DATA_DIR_FP16='/workspace/bert/data/download/finetuned_model_fp16'\n", + "!mkdir -p $DATA_DIR_FP16\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP16/bert_tf_v2_large_fp16_384.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_v2_large_fp16_384/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP16/ $DATA_DIR_FP16/bert_tf_v2_large_fp16_384.zip " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code that follows we will refer to these models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Running QA task inference\n", + "\n", + "In order to run QA inference we will follow step-by-step the flow implemented in run_squad.py.\n", + "\n", + "Configuration:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import run_squad\n", + "import json\n", + "import tensorflow as tf\n", + "import modeling\n", + "import tokenization\n", + "import time\n", + "import random\n", + "\n", + "tf.logging.set_verbosity(tf.logging.INFO)\n", + "\n", + "# Create the output directory where all the results are saved.\n", + "output_dir = os.path.join(working_dir, 'results')\n", + "tf.gfile.MakeDirs(output_dir)\n", + "\n", + "# The config json file corresponding to the pre-trained BERT model.\n", + "# This specifies the model architecture.\n", + "bert_config_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json')\n", + "\n", + "# The vocabulary file that the BERT model was trained on.\n", + "vocab_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt')\n", + "\n", + "# Depending on the mixed precision flag we use different fine-tuned model\n", + "if use_mixed_precision_model:\n", + " init_checkpoint = os.path.join(data_dir, 'finetuned_model_fp16/model.ckpt-8144')\n", + "else:\n", + " init_checkpoint = os.path.join(data_dir, 'finetuned_model_fp32/model.ckpt-8144')\n", + "\n", + "# Whether to lower case the input text. \n", + "# Should be True for uncased models and False for cased models.\n", + "do_lower_case = True\n", + " \n", + "# Total batch size for predictions\n", + "predict_batch_size = 1\n", + "params = dict([('batch_size', predict_batch_size)])\n", + "\n", + "# The maximum total input sequence length after WordPiece tokenization. \n", + "# Sequences longer than this will be truncated, and sequences shorter than this will be padded.\n", + "max_seq_length = 384\n", + "\n", + "# When splitting up a long document into chunks, how much stride to take between chunks.\n", + "doc_stride = 128\n", + "\n", + "# The maximum number of tokens for the question. \n", + "# Questions longer than this will be truncated to this length.\n", + "max_query_length = 64\n", + "\n", + "# This is a WA to use flags from here:\n", + "flags = tf.flags\n", + "\n", + "if 'f' not in tf.flags.FLAGS: \n", + " tf.app.flags.DEFINE_string('f', '', 'kernel')\n", + "FLAGS = flags.FLAGS\n", + "\n", + "# The total number of n-best predictions to generate in the nbest_predictions.json output file.\n", + "n_best_size = 20\n", + "\n", + "# The maximum length of an answer that can be generated. \n", + "# This is needed because the start and end predictions are not conditioned on one another.\n", + "max_answer_length = 30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's define the tokenizer and create the model for the estimator:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Validate the casing config consistency with the checkpoint name.\n", + "tokenization.validate_case_matches_checkpoint(do_lower_case, init_checkpoint)\n", + "\n", + "# Create the tokenizer.\n", + "tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)\n", + "\n", + "# Load the configuration from file\n", + "bert_config = modeling.BertConfig.from_json_file(bert_config_file)\n", + "\n", + "def model_fn(features, labels, mode, params): # pylint: disable=unused-argument\n", + " unique_ids = features[\"unique_ids\"]\n", + " input_ids = features[\"input_ids\"]\n", + " input_mask = features[\"input_mask\"]\n", + " segment_ids = features[\"segment_ids\"]\n", + "\n", + " (start_logits, end_logits) = run_squad.create_model(\n", + " bert_config=bert_config,\n", + " is_training=False,\n", + " input_ids=input_ids,\n", + " input_mask=input_mask,\n", + " segment_ids=segment_ids,\n", + " use_one_hot_embeddings=False)\n", + "\n", + " tvars = tf.trainable_variables()\n", + "\n", + " initialized_variable_names = {}\n", + " (assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint)\n", + " tf.train.init_from_checkpoint(init_checkpoint, assignment_map)\n", + " output_spec = None\n", + " predictions = {\"unique_ids\": unique_ids,\n", + " \"start_logits\": start_logits,\n", + " \"end_logits\": end_logits}\n", + " output_spec = tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)\n", + " return output_spec\n", + "\n", + "config = tf.ConfigProto(log_device_placement=True) \n", + "\n", + "run_config = tf.estimator.RunConfig(\n", + " model_dir=None,\n", + " session_config=config,\n", + " save_checkpoints_steps=1000,\n", + " keep_checkpoint_max=1)\n", + "\n", + "estimator = tf.estimator.Estimator(\n", + " model_fn=model_fn,\n", + " config=run_config,\n", + " params=params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.a Inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "eval_examples = run_squad.read_squad_examples(\n", + " input_file=input_file, is_training=False)\n", + "\n", + "eval_writer = run_squad.FeatureWriter(\n", + " filename=os.path.join(output_dir, \"eval.tf_record\"),\n", + " is_training=False)\n", + "\n", + "eval_features = []\n", + "def append_feature(feature):\n", + " eval_features.append(feature)\n", + " eval_writer.process_feature(feature)\n", + "\n", + "\n", + "# Loads a data file into a list of InputBatch's\n", + "run_squad.convert_examples_to_features(\n", + " examples=eval_examples,\n", + " tokenizer=tokenizer,\n", + " max_seq_length=max_seq_length,\n", + " doc_stride=doc_stride,\n", + " max_query_length=max_query_length,\n", + " is_training=False,\n", + " output_fn=append_feature)\n", + "\n", + "eval_writer.close()\n", + "\n", + "tf.logging.info(\"***** Running predictions *****\")\n", + "tf.logging.info(\" Num orig examples = %d\", len(eval_examples))\n", + "tf.logging.info(\" Num split examples = %d\", len(eval_features))\n", + "tf.logging.info(\" Batch size = %d\", predict_batch_size)\n", + "\n", + "predict_input_fn = run_squad.input_fn_builder(\n", + " input_file=eval_writer.filename,\n", + " batch_size=predict_batch_size,\n", + " seq_length=max_seq_length,\n", + " is_training=False,\n", + " drop_remainder=False)\n", + "\n", + "all_results = []\n", + "eval_hooks = [run_squad.LogEvalRunHook(predict_batch_size)]\n", + "eval_start_time = time.time()\n", + "for result in estimator.predict(\n", + " predict_input_fn, yield_single_examples=True, hooks=eval_hooks, checkpoint_path=init_checkpoint):\n", + " unique_id = int(result[\"unique_ids\"])\n", + " start_logits = [float(x) for x in result[\"start_logits\"].flat]\n", + " end_logits = [float(x) for x in result[\"end_logits\"].flat]\n", + " all_results.append(\n", + " run_squad.RawResult(\n", + " unique_id=unique_id,\n", + " start_logits=start_logits,\n", + " end_logits=end_logits))\n", + "\n", + "eval_time_elapsed = time.time() - eval_start_time\n", + "\n", + "eval_time_wo_startup = eval_hooks[-1].total_time\n", + "num_sentences = eval_hooks[-1].count * predict_batch_size\n", + "avg_sentences_per_second = num_sentences * 1.0 / eval_time_wo_startup\n", + "\n", + "tf.logging.info(\"-----------------------------\")\n", + "tf.logging.info(\"Total Inference Time = %0.2f Inference Time W/O start up overhead = %0.2f \"\n", + " \"Sentences processed = %d\", eval_time_elapsed, eval_time_wo_startup,\n", + " num_sentences)\n", + "tf.logging.info(\"Inference Performance = %0.4f sentences/sec\", avg_sentences_per_second)\n", + "tf.logging.info(\"-----------------------------\")\n", + "\n", + "output_prediction_file = os.path.join(output_dir, \"predictions.json\")\n", + "output_nbest_file = os.path.join(output_dir, \"nbest_predictions.json\")\n", + "output_null_log_odds_file = os.path.join(output_dir, \"null_odds.json\")\n", + "\n", + "run_squad.write_predictions(eval_examples, eval_features, all_results,\n", + " n_best_size, max_answer_length,\n", + " do_lower_case, output_prediction_file,\n", + " output_nbest_file, output_null_log_odds_file)\n", + "\n", + "tf.logging.info(\"Inference Results:\")\n", + "\n", + "# Here we show only the prediction results, nbest prediction is also available in the output directory\n", + "results = \"\"\n", + "with open(output_prediction_file, 'r') as json_file:\n", + " data = json.load(json_file)\n", + " for question in eval_examples:\n", + " results += \"{}{}{}\".format(question.qas_id, question.question_text, data[question.qas_id])\n", + "\n", + "\n", + "from IPython.display import display, HTML\n", + "display(HTML(\"{}
IdQuestionAnswer
\".format(results))) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. What's next" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that you are familiar with running QA Inference on BERT, using mixed precision, you may want to try\n", + "your own paragraphs and queries. \n", + "\n", + "You may also want to take a look to the notebook __bert_squad_tf_finetuning.ipynb__ on how to run fine-tuning on BERT, available in the same directory." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference_colab.ipynb b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference_colab.ipynb new file mode 100644 index 0000000..5e9d38d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/bert_squad_tf_inference_colab.ipynb @@ -0,0 +1,765 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "jDXroBuNw60P" + }, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "k-XnFINow60d" + }, + "source": [ + "\n", + "\n", + "# BERT Question Answering Inference with Mixed Precision\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "TfF7V662w60j" + }, + "source": [ + "## 1. Overview\n", + "\n", + "Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. \n", + "\n", + "The original paper can be found here: https://arxiv.org/abs/1810.04805.\n", + "\n", + "NVIDIA's BERT 19.10 is an optimized version of Google's official implementation, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Ah3Lv9zyw60l" + }, + "source": [ + "### 1.a Learning objectives\n", + "\n", + "This notebook demonstrates:\n", + "- Inference on QA task with BERT Large model\n", + "- The use/download of fine-tuned NVIDIA BERT models\n", + "- Use of Mixed Precision for Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hxNJ8HByw60o" + }, + "source": [ + "## 2. Requirements\n", + "\n", + "### 2.a GPU\n", + "\n", + "Before running this notebook, please set the Colab runtime environment to GPU via the menu *Runtime => Change runtime type => GPU*.\n", + "\n", + "This demo will work on any NVIDIA GPU with CUDA cores, though for improved FP16 inference, a Volta, Turing or newer generation GPU with Tensor cores is desired. On Google Colab, this normally means a T4 GPU. If you are assigned an older K80 GPU, another trial at another time might give you a T4 GPU." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hxNJ8HByw60o" + }, + "source": [ + "### 2.b Download the required files from NVIDIA-Github:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "KV_WnOY4zUa_" + }, + "outputs": [], + "source": [ + "!wget -nc -q --show-progress -O ./master.zip \\\n", + "https://github.com/NVIDIA/DeepLearningExamples/archive/master.zip\n", + "!unzip -q -n -d . ./master.zip " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "5D7i7Pao5qoj" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "WORKSPACE_DIR='./DeepLearningExamples-master/TensorFlow/LanguageModeling/BERT/'\n", + "os.chdir(WORKSPACE_DIR)\n", + "print (os.getcwd())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mjlZbP0dw60r" + }, + "source": [ + "## 3. BERT Inference: Question Answering\n", + "\n", + "We can run inference on a fine-tuned BERT model for tasks like Question Answering.\n", + "\n", + "Here we use a BERT model fine-tuned on a [SQuaD 2.0 Dataset](https://rajpurkar.github.io/SQuAD-explorer/) which contains 100,000+ question-answer pairs on 500+ articles combined with over 50,000 new, unanswerable questions." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mOc16svBw60t" + }, + "source": [ + "### 3.a Paragraph and Queries\n", + "\n", + "In this example we will ask our BERT model questions related to the following paragraph:\n", + "\n", + "**The Apollo Program**\n", + "_\"The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F. Kennedy's national goal of landing a man on the Moon and returning him safely to the Earth by the end of the 1960s, which he proposed in a May 25, 1961, address to Congress. Project Mercury was followed by the two-man Project Gemini. The first manned flight of Apollo was in 1968. Apollo ran from 1961 to 1972, and was supported by the two-man Gemini program which ran concurrently with it from 1962 to 1966. Gemini missions developed some of the space travel techniques that were necessary for the success of the Apollo missions. Apollo used Saturn family rockets as launch vehicles. Apollo/Saturn vehicles were also used for an Apollo Applications Program, which consisted of Skylab, a space station that supported three manned missions in 1973-74, and the Apollo-Soyuz Test Project, a joint Earth orbit mission with the Soviet Union in 1975.\"_\n", + "\n", + "The questions and relative answers expected are shown below:\n", + "\n", + " - **Q1:** \"What project put the first Americans into space?\" \n", + " - **A1:** \"Project Mercury\"\n", + " - **Q2:** \"What program was created to carry out these projects and missions?\"\n", + " - **A2:** \"The Apollo program\"\n", + " - **Q3:** \"What year did the first manned Apollo flight occur?\"\n", + " - **A3:** \"1968\"\n", + " - **Q4:** \"What President is credited with the original notion of putting Americans in space?\"\n", + " - **A4:** \"John F. Kennedy\"\n", + " - **Q5:** \"Who did the U.S. collaborate with on an Earth orbit mission in 1975?\"\n", + " - **A5:** \"Soviet Union\"\n", + " - **Q6:** \"How long did Project Apollo run?\"\n", + " - **A6:** \"1961 to 1972\"\n", + " - **Q7:** \"What program helped develop space travel techniques that Project Apollo used?\"\n", + " - **A7:** \"Gemini Mission\"\n", + " - **Q8:** \"What space station supported three manned missions in 1973-1974?\"\n", + " - **A8:** \"Skylab\"\n", + " \n", + "---\n", + "\n", + "The paragraph and the questions can be easily customized by changing the code below:\n", + "\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "srU0TT1Iw60v" + }, + "outputs": [], + "source": [ + "%%writefile input.json\n", + "{\"data\": \n", + " [\n", + " {\"title\": \"Project Apollo\",\n", + " \"paragraphs\": [\n", + " {\"context\":\"The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F. Kennedy's national goal of landing a man on the Moon and returning him safely to the Earth by the end of the 1960s, which he proposed in a May 25, 1961, address to Congress. Project Mercury was followed by the two-man Project Gemini. The first manned flight of Apollo was in 1968. Apollo ran from 1961 to 1972, and was supported by the two man Gemini program which ran concurrently with it from 1962 to 1966. Gemini missions developed some of the space travel techniques that were necessary for the success of the Apollo missions. Apollo used Saturn family rockets as launch vehicles. Apollo/Saturn vehicles were also used for an Apollo Applications Program, which consisted of Skylab, a space station that supported three manned missions in 1973-74, and the Apollo-Soyuz Test Project, a joint Earth orbit mission with the Soviet Union in 1975.\", \n", + " \"qas\": [\n", + " { \"question\": \"What project put the first Americans into space?\", \n", + " \"id\": \"Q1\"\n", + " },\n", + " { \"question\": \"What program was created to carry out these projects and missions?\",\n", + " \"id\": \"Q2\"\n", + " },\n", + " { \"question\": \"What year did the first manned Apollo flight occur?\",\n", + " \"id\": \"Q3\"\n", + " }, \n", + " { \"question\": \"What President is credited with the original notion of putting Americans in space?\",\n", + " \"id\": \"Q4\"\n", + " },\n", + " { \"question\": \"Who did the U.S. collaborate with on an Earth orbit mission in 1975?\",\n", + " \"id\": \"Q5\"\n", + " },\n", + " { \"question\": \"How long did Project Apollo run?\",\n", + " \"id\": \"Q6\"\n", + " }, \n", + " { \"question\": \"What program helped develop space travel techniques that Project Apollo used?\",\n", + " \"id\": \"Q7\"\n", + " }, \n", + " {\"question\": \"What space station supported three manned missions in 1973-1974?\",\n", + " \"id\": \"Q8\"\n", + " } \n", + "]}]}]}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ujyka-8Iw603" + }, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "working_dir = os.getcwd();\n", + "data_dir = os.path.join(working_dir, 'data/download');\n", + "if working_dir not in sys.path:\n", + " sys.path.append(working_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "6gA3-6LVw61D" + }, + "outputs": [], + "source": [ + "input_file = os.path.join(working_dir, 'input.json')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "D9p8XaBnw61N" + }, + "source": [ + "### 3.b Mixed Precision\n", + "\n", + "Mixed precision training offers significant computational speedup by performing operations in half-precision format, while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of tensor cores in the Volta and Turing architectures, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures.\n", + "\n", + "For information about:\n", + "- How to train using mixed precision, see the [Mixed Precision Training](https://arxiv.org/abs/1710.03740) paper and [Training With Mixed Precision](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) documentation.\n", + "- How to access and enable AMP for TensorFlow, see [Using TF-AMP](https://docs.nvidia.com/deeplearning/dgx/tensorflow-user-guide/index.html#tfamp) from the TensorFlow User Guide.\n", + "- Techniques used for mixed precision training, see the [Mixed-Precision Training of Deep Neural Networks](https://devblogs.nvidia.com/mixed-precision-training-deep-neural-networks/) blog." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ceeYPqQcw61P" + }, + "source": [ + "In this notebook we control mixed precision execution with the environmental variable:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "k4jIJevFw61R" + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"TF_ENABLE_AUTO_MIXED_PRECISION\"] = \"1\" " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "rt_4-ZA5w61Y" + }, + "source": [ + "We can choose the mixed precision model (which takes much less time to train than the fp32 version) without losing accuracy, with the following flag: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "BRdclfEaw61Z" + }, + "outputs": [], + "source": [ + "use_mixed_precision_model = True" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "iu4Jb5puw61p" + }, + "source": [ + "## 4. Fine-Tuned NVIDIA BERT TF Models\n", + "\n", + "Based on the model size, we have the following two default configurations of BERT.\n", + "\n", + "| **Model** | **Hidden layers** | **Hidden unit size** | **Attention heads** | **Feedforward filter size** | **Max sequence length** | **Parameters** |\n", + "|:---------:|:----------:|:----:|:---:|:--------:|:---:|:----:|\n", + "|BERTBASE |12 encoder| 768| 12|4 x 768|512|110M|\n", + "|BERTLARGE|24 encoder|1024| 16|4 x 1024|512|330M|\n", + "\n", + "We will take advantage of the fine-tuned models available on NGC (NVIDIA GPU Cluster, https://ngc.nvidia.com).\n", + "Among the many configurations available we will download these two:\n", + "\n", + " - **bert_tf_v2_large_fp32_384**\n", + "\n", + " - **bert_tf_v2_large_fp16_384**\n", + "\n", + "Which are trained on the SQuaD 2.0 Dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "5JWKZfP8w61t" + }, + "outputs": [], + "source": [ + "# bert_tf_v2_large_fp32_384\n", + "DATA_DIR_FP32 = os.path.join(data_dir, 'finetuned_model_fp32')\n", + "!mkdir -p $DATA_DIR_FP32\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP32/bert_tf_v2_large_fp32_384.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_v2_large_fp32_384/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP32/ $DATA_DIR_FP32/bert_tf_v2_large_fp32_384.zip \n", + " \n", + "# bert_tf_v2_large_fp16_384\n", + "DATA_DIR_FP16 = os.path.join(data_dir, 'finetuned_model_fp16')\n", + "!mkdir -p $DATA_DIR_FP16\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP16/bert_tf_v2_large_fp16_384.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/bert_tf_v2_large_fp16_384/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP16/ $DATA_DIR_FP16/bert_tf_v2_large_fp16_384.zip " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "GrFrZickw61z" + }, + "source": [ + "In the code that follows we will refer to these models." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "cU8mGJDa1FfX" + }, + "source": [ + "Download the Google pretrained weights and vocab file:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "5hRb96NKE3X0" + }, + "outputs": [], + "source": [ + "os.chdir(\"./data\");\n", + "from GooglePretrainedWeightDownloader import GooglePretrainedWeightDownloader\n", + "gd = GooglePretrainedWeightDownloader(data_dir)\n", + "gd.download()\n", + "os.chdir(\"..\");" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "VY1Dipam15DE" + }, + "source": [ + "We need the horovod package:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "jqAJob92C2wA" + }, + "outputs": [], + "source": [ + "try:\n", + " __import__(\"horovod\")\n", + "except ImportError:\n", + " os.system(\"pip install horovod\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "5NuuGNsDw611" + }, + "source": [ + "## 5. Running QA task inference\n", + "\n", + "In order to run QA inference we will follow step-by-step the flow implemented in run_squad.py.\n", + "\n", + "Configuration:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "_c2qCQ9-w613" + }, + "outputs": [], + "source": [ + "import run_squad\n", + "import json\n", + "import tensorflow as tf\n", + "import modeling\n", + "import tokenization\n", + "import time\n", + "import random\n", + "\n", + "tf.logging.set_verbosity(tf.logging.INFO)\n", + "\n", + "# Create the output directory where all the results are saved.\n", + "output_dir = os.path.join(working_dir, 'results')\n", + "tf.gfile.MakeDirs(output_dir)\n", + "\n", + "# The config json file corresponding to the pre-trained BERT model.\n", + "# This specifies the model architecture.\n", + "bert_config_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json')\n", + "\n", + "# The vocabulary file that the BERT model was trained on.\n", + "vocab_file = os.path.join(data_dir, 'google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt')\n", + "\n", + "# Depending on the mixed precision flag we use different fine-tuned model\n", + "if use_mixed_precision_model:\n", + " init_checkpoint = os.path.join(data_dir, 'finetuned_model_fp16/model.ckpt-8144')\n", + "else:\n", + " init_checkpoint = os.path.join(data_dir, 'finetuned_model_fp32/model.ckpt-8144')\n", + "\n", + "# Whether to lower case the input text. \n", + "# Should be True for uncased models and False for cased models.\n", + "do_lower_case = True\n", + " \n", + "# Total batch size for predictions\n", + "predict_batch_size = 1\n", + "params = dict([('batch_size', predict_batch_size)])\n", + "\n", + "# The maximum total input sequence length after WordPiece tokenization. \n", + "# Sequences longer than this will be truncated, and sequences shorter than this will be padded.\n", + "max_seq_length = 384\n", + "\n", + "# When splitting up a long document into chunks, how much stride to take between chunks.\n", + "doc_stride = 128\n", + "\n", + "# The maximum number of tokens for the question. \n", + "# Questions longer than this will be truncated to this length.\n", + "max_query_length = 64\n", + "\n", + "# This is a WA to use flags from here:\n", + "flags = tf.flags\n", + "\n", + "if 'f' not in tf.flags.FLAGS: \n", + " tf.app.flags.DEFINE_string('f', '', 'kernel')\n", + "FLAGS = flags.FLAGS\n", + "\n", + "# The total number of n-best predictions to generate in the nbest_predictions.json output file.\n", + "n_best_size = 20\n", + "\n", + "# The maximum length of an answer that can be generated. \n", + "# This is needed because the start and end predictions are not conditioned on one another.\n", + "max_answer_length = 30" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2h_eLUgPw618" + }, + "source": [ + "Let's define the tokenizer and create the model for the estimator:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "RXHdoUb9w619" + }, + "outputs": [], + "source": [ + "# Validate the casing config consistency with the checkpoint name.\n", + "tokenization.validate_case_matches_checkpoint(do_lower_case, init_checkpoint)\n", + "\n", + "# Create the tokenizer.\n", + "tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)\n", + "\n", + "# Load the configuration from file\n", + "bert_config = modeling.BertConfig.from_json_file(bert_config_file)\n", + "\n", + "def model_fn(features, labels, mode, params): # pylint: disable=unused-argument\n", + " unique_ids = features[\"unique_ids\"]\n", + " input_ids = features[\"input_ids\"]\n", + " input_mask = features[\"input_mask\"]\n", + " segment_ids = features[\"segment_ids\"]\n", + "\n", + " (start_logits, end_logits) = run_squad.create_model(\n", + " bert_config=bert_config,\n", + " is_training=False,\n", + " input_ids=input_ids,\n", + " input_mask=input_mask,\n", + " segment_ids=segment_ids,\n", + " use_one_hot_embeddings=False)\n", + "\n", + " tvars = tf.trainable_variables()\n", + "\n", + " initialized_variable_names = {}\n", + " (assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint)\n", + " tf.train.init_from_checkpoint(init_checkpoint, assignment_map)\n", + " output_spec = None\n", + " predictions = {\"unique_ids\": unique_ids,\n", + " \"start_logits\": start_logits,\n", + " \"end_logits\": end_logits}\n", + " output_spec = tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)\n", + " return output_spec\n", + "\n", + "config = tf.ConfigProto(log_device_placement=True) \n", + "\n", + "run_config = tf.estimator.RunConfig(\n", + " model_dir=None,\n", + " session_config=config,\n", + " save_checkpoints_steps=1000,\n", + " keep_checkpoint_max=1)\n", + "\n", + "estimator = tf.estimator.Estimator(\n", + " model_fn=model_fn,\n", + " config=run_config,\n", + " params=params)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "xSKkf4JLw62E" + }, + "source": [ + "### 5.a Inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3OKhc349w62F", + "scrolled": true + }, + "outputs": [], + "source": [ + "eval_examples = run_squad.read_squad_examples(\n", + " input_file=input_file, is_training=False)\n", + "\n", + "eval_writer = run_squad.FeatureWriter(\n", + " filename=os.path.join(output_dir, \"eval.tf_record\"),\n", + " is_training=False)\n", + "\n", + "eval_features = []\n", + "def append_feature(feature):\n", + " eval_features.append(feature)\n", + " eval_writer.process_feature(feature)\n", + "\n", + "\n", + "# Loads a data file into a list of InputBatch's\n", + "run_squad.convert_examples_to_features(\n", + " examples=eval_examples,\n", + " tokenizer=tokenizer,\n", + " max_seq_length=max_seq_length,\n", + " doc_stride=doc_stride,\n", + " max_query_length=max_query_length,\n", + " is_training=False,\n", + " output_fn=append_feature)\n", + "\n", + "eval_writer.close()\n", + "\n", + "tf.logging.info(\"***** Running predictions *****\")\n", + "tf.logging.info(\" Num orig examples = %d\", len(eval_examples))\n", + "tf.logging.info(\" Num split examples = %d\", len(eval_features))\n", + "tf.logging.info(\" Batch size = %d\", predict_batch_size)\n", + "\n", + "predict_input_fn = run_squad.input_fn_builder(\n", + " input_file=eval_writer.filename,\n", + " batch_size=predict_batch_size,\n", + " seq_length=max_seq_length,\n", + " is_training=False,\n", + " drop_remainder=False)\n", + "\n", + "all_results = []\n", + "eval_hooks = [run_squad.LogEvalRunHook(predict_batch_size)]\n", + "eval_start_time = time.time()\n", + "for result in estimator.predict(\n", + " predict_input_fn, yield_single_examples=True, hooks=eval_hooks, checkpoint_path=init_checkpoint):\n", + " unique_id = int(result[\"unique_ids\"])\n", + " start_logits = [float(x) for x in result[\"start_logits\"].flat]\n", + " end_logits = [float(x) for x in result[\"end_logits\"].flat]\n", + " all_results.append(\n", + " run_squad.RawResult(\n", + " unique_id=unique_id,\n", + " start_logits=start_logits,\n", + " end_logits=end_logits))\n", + "\n", + "eval_time_elapsed = time.time() - eval_start_time\n", + "\n", + "eval_time_wo_startup = eval_hooks[-1].total_time\n", + "num_sentences = eval_hooks[-1].count * predict_batch_size\n", + "avg_sentences_per_second = num_sentences * 1.0 / eval_time_wo_startup\n", + "\n", + "tf.logging.info(\"-----------------------------\")\n", + "tf.logging.info(\"Total Inference Time = %0.2f Inference Time W/O start up overhead = %0.2f \"\n", + " \"Sentences processed = %d\", eval_time_elapsed, eval_time_wo_startup,\n", + " num_sentences)\n", + "tf.logging.info(\"Inference Performance = %0.4f sentences/sec\", avg_sentences_per_second)\n", + "tf.logging.info(\"-----------------------------\")\n", + "\n", + "output_prediction_file = os.path.join(output_dir, \"predictions.json\")\n", + "output_nbest_file = os.path.join(output_dir, \"nbest_predictions.json\")\n", + "output_null_log_odds_file = os.path.join(output_dir, \"null_odds.json\")\n", + "\n", + "run_squad.write_predictions(eval_examples, eval_features, all_results,\n", + " n_best_size, max_answer_length,\n", + " do_lower_case, output_prediction_file,\n", + " output_nbest_file, output_null_log_odds_file)\n", + "\n", + "tf.logging.info(\"Inference Results:\")\n", + "\n", + "# Here we show only the prediction results, nbest prediction is also available in the output directory\n", + "results = \"\"\n", + "with open(output_prediction_file, 'r') as json_file:\n", + " data = json.load(json_file)\n", + " for question in eval_examples:\n", + " results += \"{}{}{}\".format(question.qas_id, question.question_text, data[question.qas_id])\n", + "\n", + "\n", + "from IPython.display import display, HTML\n", + "display(HTML(\"{}
IdQuestionAnswer
\".format(results))) " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "EMT0sKxHw62L" + }, + "source": [ + "## 6. What's next" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mKBM_UD6w62N" + }, + "source": [ + "Now that you are familiar with running QA Inference on BERT, using mixed precision, you may want to try\n", + "your own paragraphs and queries. \n", + "\n", + "You may also want to take a look to the notebook __bert_squad_tf_finetuning.ipynb__ on how to run fine-tuning on BERT, available in the same directory." + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "bert_squad_tf_inference.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/biobert_ner_tf_inference.ipynb b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/biobert_ner_tf_inference.ipynb new file mode 100644 index 0000000..64645d6 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/biobert_ner_tf_inference.ipynb @@ -0,0 +1,610 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright 2019 NVIDIA Corporation. All Rights Reserved.\n", + "#\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "#\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "#\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License.\n", + "# ==============================================================================" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "# BioBERT Named-Entity Recognition Inference with Mixed Precision\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Overview\n", + "\n", + "Bidirectional Embedding Representations from Transformers (BERT), is a method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks. \n", + "\n", + "BioBERT is a domain specific version of BERT that has been trained on PubMed abstracts.\n", + "\n", + "The original BioBERT paper can be found here: https://arxiv.org/abs/1901.08746\n", + "\n", + "NVIDIA's BioBERT is an optimized version of the implementation presented in the paper, leveraging mixed precision arithmetic and tensor cores on V100 GPUS for faster training times while maintaining target accuracy." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.a Learning objectives\n", + "\n", + "This notebook demonstrates:\n", + "- Inference on NER task with BioBERT model\n", + "- The use/download of fine-tuned NVIDIA BioBERT models\n", + "- Use of Mixed Precision for Inference" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Requirements\n", + "\n", + "Please refer to the ReadMe file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. BioBERT Inference: Named-Entity Recognition\n", + "\n", + "We can run inference on a fine-tuned BioBERT model for tasks like Named-Entity Recognition.\n", + "\n", + "Here we use a BioBERT model fine-tuned on a [BC5CDR-disease Dataset](https://www.ncbi.nlm.nih.gov/research/bionlp/Data/) which consists of 1500 PubMed articles with 5818 annotated diseases." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.a Extract Disease Information from Text\n", + "\n", + "In this example we will use Named-Entity Recognition model created using BioBERT to extract disease information from the following paragraph:\n", + "\n", + "**Input Text**\n", + "\n", + "_\"The authors describe the case of a 56 - year - old woman with chronic, severe heart failure \n", + "secondary to dilated cardiomyopathy and absence of significant ventricular arrhythmias \n", + "who developed QT prolongation and torsade de pointes ventricular tachycardia during one cycle \n", + "of intermittent low dose (2.5 mcg/kg per min) dobutamine. \n", + "This report of torsade de pointes ventricular tachycardia during intermittent dobutamine \n", + "supports the hypothesis that unpredictable fatal arrhythmias may occur even with low doses \n", + "and in patients with no history of significant rhythm disturbances.\n", + "The mechanisms of proarrhythmic effects of Dubutamine are discussed.\"_\n", + "\n", + "**Output visualized using displaCy**\n", + "\n", + "
The authors describe the case of a 56 year old woman with chronic , severe \n", + "\n", + " heart failure \n", + " DISEASE\n", + "\n", + "secondary to \n", + "\n", + " dilated cardiomyopathy \n", + " DISEASE\n", + "\n", + "and absence of significant \n", + "\n", + " ventricular arrhythmias \n", + " DISEASE\n", + "\n", + "who developed QT \n", + "\n", + " prolongation \n", + " DISEASE\n", + "\n", + "and torsade de pointes \n", + "\n", + " ventricular tachycardia \n", + " DISEASE\n", + "\n", + "during one cycle of intermittent low dose ( 2.5 mcg / kg per min ) dobutamine . This report of torsade de pointes \n", + "\n", + " ventricular tachycardia \n", + " DISEASE\n", + "\n", + "during intermittent dobutamine supports the hypothesis that unpredictable fatal \n", + "\n", + " arrhythmias \n", + " DISEASE\n", + "\n", + "may occur even with low doses and in patients with no history of significant \n", + "\n", + " rhythm disturbances \n", + " DISEASE\n", + "\n", + ". The mechanisms of proarrhythmic effects of Dubutamine are discussed .
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "text= \"\"\"\n", + "The authors describe the case of a 56 year old woman with chronic, severe heart failure\n", + "secondary to dilated cardiomyopathy and absence of significant ventricular arrhythmias\n", + "who developed QT prolongation and torsade de pointes ventricular tachycardia during one cycle\n", + "of intermittent low dose (2.5 mcg/kg per min) dobutamine.\n", + "This report of torsade de pointes ventricular tachycardia during intermittent dobutamine\n", + "supports the hypothesis that unpredictable fatal arrhythmias may occur even with low doses\n", + "and in patients with no history of significant rhythm disturbances.\n", + "The mechanisms of proarrhythmic effects of Dubutamine are discussed.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "\n", + "notebooks_dir = '/workspace/bert/notebooks'\n", + "working_dir = '/workspace/bert'\n", + "if working_dir not in sys.path:\n", + " sys.path.append(working_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert the text into the IOB tags format seen during training, using dummy placeholder labels\n", + "import spacy\n", + "nlp = spacy.load(\"en_core_web_sm\")\n", + "\n", + "text = text.strip()\n", + "doc = nlp(text)\n", + "input_file = os.path.join(notebooks_dir, 'input.tsv')\n", + "with open(os.path.join(input_file), 'w') as wf: \n", + " for word in doc:\n", + " if word.text is '\\n':\n", + " continue\n", + " wf.write(word.text + '\\tO\\n')\n", + " wf.write('\\n') # Indicate end of text" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.b Mixed Precision\n", + "\n", + "Mixed precision training offers significant computational speedup by performing operations in half-precision format, while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of tensor cores in the Volta and Turing architectures, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures.\n", + "\n", + "For information about:\n", + "- How to train using mixed precision, see the [Mixed Precision Training](https://arxiv.org/abs/1710.03740) paper and [Training With Mixed Precision](https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html) documentation.\n", + "- How to access and enable AMP for TensorFlow, see [Using TF-AMP](https://docs.nvidia.com/deeplearning/dgx/tensorflow-user-guide/index.html#tfamp) from the TensorFlow User Guide.\n", + "- Techniques used for mixed precision training, see the [Mixed-Precision Training of Deep Neural Networks](https://devblogs.nvidia.com/mixed-precision-training-deep-neural-networks/) blog." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we control mixed precision execution with the environmental variable:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"TF_ENABLE_AUTO_MIXED_PRECISION\"] = \"1\" " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model we'll use was trained with mixed precision model, which takes much less time to train than the fp32 version, without losing accuracy. So we'll need to set with the following flag: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "use_mixed_precision_model = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Fine-Tuned NVIDIA BioBERT TF Models\n", + "\n", + "We have the following Named Entity Reconition models fine-tuned from BioBERT available on NGC (NVIDIA GPU Cluster, https://ngc.nvidia.com).\n", + "\n", + "| **Model** | **Description** |\n", + "|:---------:|:----------:|\n", + "|BioBERT NER BC5CDR Disease | NER model to extract disease information from text, trained on the BC5CDR-Disease dataset |\n", + "|BioBERT NER BC5CDR Chemical | NER model to extract chemical information from text, trained on the BC5CDR-Chemical dataset. |\n", + "\n", + "\n", + "For this exampple, we will download the Diease NER model trained from the BC5CDR-disease Dataset.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# biobert_uncased_base_ner_disease\n", + "DATA_DIR_FP16='/workspace/bert/data/download/finetuned_model_fp16'\n", + "!mkdir -p $DATA_DIR_FP16\n", + "!wget -nc -q --show-progress -O $DATA_DIR_FP16/biobert_uncased_base_ner_disease.zip \\\n", + "https://api.ngc.nvidia.com/v2/models/nvidia/biobert_uncased_base_ner_disease/versions/1/zip\n", + "!unzip -n -d $DATA_DIR_FP16/ $DATA_DIR_FP16/biobert_uncased_base_ner_disease.zip " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code that follows we will refer to these models." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Running NER task inference\n", + "\n", + "In order to run NER inference we will follow step-by-step the flow implemented in run_ner.py." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.a Configure Things" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import run_ner\n", + "from run_ner import BC5CDRProcessor, model_fn_builder, file_based_input_fn_builder, filed_based_convert_examples_to_features, result_to_pair\n", + "\n", + "import os, sys\n", + "import time\n", + "\n", + "import tensorflow as tf\n", + "import modeling\n", + "import tokenization\n", + "\n", + "tf.logging.set_verbosity(tf.logging.ERROR)\n", + "\n", + "# Create the output directory where all the results are saved.\n", + "output_dir = os.path.join(working_dir, 'output')\n", + "tf.gfile.MakeDirs(output_dir)\n", + "\n", + "# The config json file corresponding to the pre-trained BERT model.\n", + "# This specifies the model architecture.\n", + "bert_config_file = os.path.join(DATA_DIR_FP16, 'bert_config.json')\n", + "\n", + "# The vocabulary file that the BERT model was trained on.\n", + "vocab_file = os.path.join(DATA_DIR_FP16, 'vocab.txt')\n", + "\n", + "init_checkpoint = os.path.join(DATA_DIR_FP16, 'model.ckpt-10251')\n", + "\n", + "# Whether to lower case the input text. \n", + "# Should be True for uncased models and False for cased models.\n", + "# The BioBERT available in NGC is uncased\n", + "do_lower_case = True\n", + " \n", + "# Total batch size for predictions\n", + "predict_batch_size = 1\n", + "params = dict([('batch_size', predict_batch_size)])\n", + "\n", + "# The maximum total input sequence length after WordPiece tokenization. \n", + "# Sequences longer than this will be truncated, and sequences shorter than this will be padded.\n", + "max_seq_length = 128\n", + "\n", + "# This is a WA to use flags from here:\n", + "flags = tf.flags\n", + "\n", + "if 'f' not in tf.flags.FLAGS: \n", + " tf.app.flags.DEFINE_string('f', '', 'kernel')\n", + "FLAGS = flags.FLAGS\n", + "\n", + "FLAGS.output_dir = output_dir" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.b Define Tokenizer & Create Estimator" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Validate the casing config consistency with the checkpoint name.\n", + "tokenization.validate_case_matches_checkpoint(do_lower_case, init_checkpoint)\n", + "\n", + "# Create the tokenizer.\n", + "tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)\n", + "\n", + "# Load the configuration from file\n", + "bert_config = modeling.BertConfig.from_json_file(bert_config_file)\n", + "\n", + "\n", + "# Use the data processor for BC5CDR\n", + "processor = BC5CDRProcessor()\n", + "# Get labels in the index order that was used during training\n", + "label_list = processor.get_labels()\n", + "\n", + "# Reverse index the labels. This will be used later when evaluating predictions.\n", + "id2label = {}\n", + "for (i, label) in enumerate(label_list, 1):\n", + " id2label[i] = label\n", + "\n", + "\n", + "config = tf.ConfigProto(log_device_placement=True) \n", + "run_config = tf.estimator.RunConfig(\n", + " model_dir=None,\n", + " session_config=config,\n", + " save_checkpoints_steps=1000,\n", + " keep_checkpoint_max=1)\n", + "\n", + "\n", + "# Use model function builder to create the model function\n", + "model_fn = model_fn_builder(\n", + " bert_config=bert_config,\n", + " num_labels=len(label_list) + 1,\n", + " init_checkpoint=init_checkpoint,\n", + " use_fp16=use_mixed_precision_model)\n", + "\n", + "estimator = tf.estimator.Estimator(\n", + " model_fn=model_fn,\n", + " config=run_config,\n", + " params=params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.c Run Inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the input data using the BC5CDR processor\n", + "predict_examples = processor.get_test_examples(notebooks_dir, file_name='input.tsv')\n", + "\n", + "\n", + "# Convert to tf_records and save it\n", + "predict_file = os.path.join(output_dir, \"predict.tf_record\")\n", + "filed_based_convert_examples_to_features(predict_examples, label_list,\n", + " max_seq_length, tokenizer,\n", + " predict_file)\n", + "\n", + "\n", + "tf.logging.info(\"***** Running predictions *****\")\n", + "tf.logging.info(\" Num orig examples = %d\", len(predict_examples))\n", + "tf.logging.info(\" Batch size = %d\", predict_batch_size)\n", + "\n", + "# Run prediction on this tf_record file\n", + "predict_input_fn = file_based_input_fn_builder(\n", + " input_file=predict_file,\n", + " batch_size=predict_batch_size,\n", + " seq_length=max_seq_length,\n", + " is_training=False,\n", + " drop_remainder=False)\n", + "\n", + "\n", + "pred_start_time = time.time()\n", + "\n", + "predictions = estimator.predict(input_fn=predict_input_fn)\n", + "predictions = list(predictions)\n", + "\n", + "pred_time_elapsed = time.time() - pred_start_time\n", + "\n", + "tf.logging.info(\"-----------------------------\")\n", + "tf.logging.info(\"Total Inference Time = %0.2f\", pred_time_elapsed)\n", + "# tf.logging.info(\"Inference Performance = %0.4f sentences/sec\", avg_sentences_per_second)\n", + "tf.logging.info(\"-----------------------------\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.d Save Predictions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Let's now process the predictions and save them to file(s)\n", + "tf.logging.info(\"Save Predictions:\")\n", + "\n", + "# File containing the list of predictions as IOB tags\n", + "output_predict_file = os.path.join(FLAGS.output_dir, \"label_test.txt\")\n", + "# File containing the list of words, the dummy token and the predicted IOB tag\n", + "test_labels_file = os.path.join(FLAGS.output_dir, \"test_labels.txt\")\n", + "test_labels_err_file = os.path.join(FLAGS.output_dir, \"test_labels_errs.txt\")\n", + "\n", + "with tf.gfile.Open(output_predict_file, 'w') as writer, \\\n", + " tf.gfile.Open(test_labels_file, 'w') as tl, \\\n", + " tf.gfile.Open(test_labels_err_file, 'w') as tle:\n", + " i=0\n", + " for prediction in estimator.predict(input_fn=predict_input_fn, yield_single_examples=True):\n", + " output_line = \"\\n\".join(id2label[id] for id in prediction if id != 0) + \"\\n\"\n", + " writer.write(output_line)\n", + " result_to_pair(predict_examples[i], prediction, id2label, tl, tle)\n", + " i = i + 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.e Visualize Predictions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Let's create a function that can formats the predictions for display using displaCy\n", + "def predictions_for_displacy(predict_examples, predictions, id2label):\n", + " processed_text = ''\n", + " entities = []\n", + " current_pos = 0\n", + " start_pos = 0\n", + " end_pos = 0\n", + " end_detected = False\n", + " prev_label = ''\n", + "\n", + " for predict_line, pred_ids in zip(predict_examples, predictions):\n", + " words = str(predict_line.text).split(' ')\n", + " labels = str(predict_line.label).split(' ')\n", + "\n", + " # get from CLS to SEP\n", + " pred_labels = []\n", + " for id in pred_ids:\n", + " if id == 0:\n", + " continue\n", + " curr_label = id2label[id]\n", + " if curr_label == '[CLS]':\n", + " continue\n", + " elif curr_label == '[SEP]':\n", + " break\n", + " elif curr_label == 'X':\n", + " continue\n", + " pred_labels.append(curr_label)\n", + "\n", + " for tok, label, pred_label in zip(words, labels, pred_labels):\n", + " if pred_label is 'B':\n", + " start_pos = current_pos\n", + " elif pred_label is 'I' and prev_label is not 'B' and prev_label is not 'I':\n", + " start_pos = current_pos\n", + " elif pred_label is 'O' and (prev_label is 'B' or prev_label is 'I'):\n", + " end_pos = current_pos\n", + " end_detected = True\n", + "\n", + " if end_detected:\n", + " entities.append({'start':start_pos, 'end': end_pos, 'label': 'DISEASE'})\n", + " start_pos = 0\n", + " end_pos = 0\n", + " end_detected = False\n", + "\n", + " processed_text = processed_text + tok + ' '\n", + " current_pos = current_pos + len(tok) + 1\n", + " prev_label = pred_label\n", + "\n", + " #Handle entity at the very end\n", + " if start_pos > 0 and end_detected is False:\n", + " entities.append({'start':start_pos, 'end': current_pos, 'label': 'DISEASE'})\n", + " \n", + " displacy_input = [{\"text\": processed_text,\n", + " \"ents\": entities,\n", + " \"title\": None}]\n", + " \n", + " return displacy_input" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert the predictions to the Named Entities format required by displaCy and visualize\n", + "displacy_input = predictions_for_displacy(predict_examples, predictions, id2label)\n", + "html = spacy.displacy.render(displacy_input, style=\"ent\", manual=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. What's next" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that you are familiar with running NER Inference on BioBERT, using mixed precision, you may want to try extracting disease information from other biomedical text. " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/input.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/input.json new file mode 100644 index 0000000..7910fb8 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/notebooks/input.json @@ -0,0 +1,31 @@ +{"data": + [ + {"title": "Project Apollo", + "paragraphs": [ + {"context":"The Apollo program, also known as Project Apollo, was the third United States human spaceflight program carried out by the National Aeronautics and Space Administration (NASA), which accomplished landing the first humans on the Moon from 1969 to 1972. First conceived during Dwight D. Eisenhower's administration as a three-man spacecraft to follow the one-man Project Mercury which put the first Americans in space, Apollo was later dedicated to President John F. Kennedy's national goal of landing a man on the Moon and returning him safely to the Earth by the end of the 1960s, which he proposed in a May 25, 1961, address to Congress. Project Mercury was followed by the two-man Project Gemini. The first manned flight of Apollo was in 1968. Apollo ran from 1961 to 1972, and was supported by the two man Gemini program which ran concurrently with it from 1962 to 1966. Gemini missions developed some of the space travel techniques that were necessary for the success of the Apollo missions. Apollo used Saturn family rockets as launch vehicles. Apollo/Saturn vehicles were also used for an Apollo Applications Program, which consisted of Skylab, a space station that supported three manned missions in 1973-74, and the Apollo-Soyuz Test Project, a joint Earth orbit mission with the Soviet Union in 1975.", + "qas": [ + { "question": "What project put the first Americans into space?", + "id": "Q1" + }, + { "question": "What program was created to carry out these projects and missions?", + "id": "Q2" + }, + { "question": "What year did the first manned Apollo flight occur?", + "id": "Q3" + }, + { "question": "What President is credited with the original notion of putting Americans in space?", + "id": "Q4" + }, + { "question": "Who did the U.S. collaborate with on an Earth orbit mission in 1975?", + "id": "Q5" + }, + { "question": "How long did Project Apollo run?", + "id": "Q6" + }, + { "question": "What program helped develop space travel techniques that Project Apollo used?", + "id": "Q7" + }, + {"question": "What space station supported three manned missions in 1973-1974?", + "id": "Q8" + } +]}]}]} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization.py new file mode 100644 index 0000000..b96ca80 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization.py @@ -0,0 +1,467 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Functions and classes related to optimization (weight updates).""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import re +import tensorflow as tf +from tensorflow.python.ops import array_ops +from tensorflow.python.ops import linalg_ops +from tensorflow.python.ops import math_ops + +from npu_bridge.estimator.npu.npu_optimizer import NPUOptimizer +from npu_bridge.estimator.npu import npu_loss_scale_manager as lsm_lib +from npu_bridge.estimator import npu_ops + + +def create_optimizer(loss, init_lr, num_train_steps, num_warmup_steps, hvd=None, manual_fp16=False, use_fp16=False, + num_accumulation_steps=1, + optimizer_type="adam", allreduce_post_accumulation=False): + """Creates an optimizer training op.""" + global_step = tf.train.get_or_create_global_step() + + # avoid step change in learning rate at end of warmup phase + if optimizer_type == "adam": + power = 1.0 + decayed_learning_rate_at_crossover_point = init_lr * ( + (1.0 - float(num_warmup_steps) / float(num_train_steps)) ** power) + else: + power = 0.5 + decayed_learning_rate_at_crossover_point = init_lr + + adjusted_init_lr = init_lr * (init_lr / decayed_learning_rate_at_crossover_point) + print('decayed_learning_rate_at_crossover_point = %e, adjusted_init_lr = %e' % ( + decayed_learning_rate_at_crossover_point, adjusted_init_lr)) + + learning_rate = tf.constant(value=adjusted_init_lr, shape=[], dtype=tf.float32) + + # Implements linear decay of the learning rate. + learning_rate = tf.train.polynomial_decay( + learning_rate, + global_step, + num_train_steps, + end_learning_rate=0.0, + power=power, + cycle=False) + + # Implements linear warmup. I.e., if global_step < num_warmup_steps, the + # learning rate will be `global_step/num_warmup_steps * init_lr`. + if num_warmup_steps: + global_steps_int = tf.cast(global_step, tf.int32) + warmup_steps_int = tf.constant(num_warmup_steps, dtype=tf.int32) + + global_steps_float = tf.cast(global_steps_int, tf.float32) + warmup_steps_float = tf.cast(warmup_steps_int, tf.float32) + + warmup_percent_done = global_steps_float / warmup_steps_float + warmup_learning_rate = init_lr * warmup_percent_done + + is_warmup = tf.cast(global_steps_int < warmup_steps_int, tf.float32) + learning_rate = ( + (1.0 - is_warmup) * learning_rate + is_warmup * warmup_learning_rate) + + if optimizer_type == "lamb": + print("Initializing LAMB Optimizer") + optimizer = LAMBOptimizer( + learning_rate=learning_rate, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"]) + else: + print("Initializing ADAM Weight Decay Optimizer") + # It is recommended that you use this optimizer for fine tuning, since this + # is how the model was trained (note that the Adam m/v variables are NOT + # loaded from init_checkpoint.) + optimizer = AdamWeightDecayOptimizer( + learning_rate=learning_rate, + weight_decay_rate=0.01, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=["LayerNorm", "layer_norm", "bias"]) + + if hvd is not None and (num_accumulation_steps == 1 or (not allreduce_post_accumulation)): + optimizer = hvd.DistributedOptimizer(optimizer, sparse_as_dense=True, + compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) + + if tf.flags.FLAGS.npu_bert_loss_scale not in [None, -1]: + if tf.flags.FLAGS.npu_bert_loss_scale == 0: + loss_scale_manager = lsm_lib.ExponentialUpdateLossScaleManager( + init_loss_scale=tf.flags.FLAGS.init_loss_scale_value, incr_every_n_steps=1000, + decr_every_n_nan_or_inf=2, decr_ratio=0.5) + elif tf.flags.FLAGS.npu_bert_loss_scale >= 1: + loss_scale_manager = lsm_lib.FixedLossScaleManager(loss_scale=tf.flags.FLAGS.npu_bert_loss_scale) + else: + raise ValueError("Invalid loss scale: %d" % tf.flags.FLAGS.npu_bert_loss_scale) + optimizer = NPUOptimizer(optimizer, loss_scale_manager, is_distributed=tf.flags.FLAGS.distributed, + is_loss_scale=True, is_tailing_optimization=tf.flags.FLAGS.npu_bert_tail_optimize) + else: + optimizer = NPUOptimizer(optimizer, is_distributed=tf.flags.FLAGS.distributed) + + tvars = tf.trainable_variables() + grads_and_vars = optimizer.compute_gradients(loss * 1.0 / num_accumulation_steps, tvars) + + if num_accumulation_steps > 1: + local_step = tf.get_variable(name="local_step", shape=[], dtype=tf.int32, trainable=False, + initializer=tf.zeros_initializer) + batch_finite = tf.get_variable(name="batch_finite", shape=[], dtype=tf.bool, trainable=False, + initializer=tf.ones_initializer) + accum_vars = [tf.get_variable( + name=tvar.name.split(":")[0] + "/accum", + shape=tvar.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) for tvar in tf.trainable_variables()] + + reset_step = tf.cast(tf.math.equal(local_step % num_accumulation_steps, 0), dtype=tf.bool) + local_step = tf.cond(reset_step, lambda: local_step.assign(tf.ones_like(local_step)), + lambda: local_step.assign_add(1)) + + with tf.name_scope(accumulate_step): + grads_and_vars_and_accums = [(gv[0], gv[1], accum_vars[i]) for i, gv in enumerate(grads_and_vars) if + gv[0] is not None] + grads, tvars, accum_vars = list(zip(*grads_and_vars_and_accums)) + + all_are_finite = tf.reduce_all([tf.reduce_all(tf.is_finite(g)) for g in grads]) if ( + tf.flags.FLAGS.npu_bert_loss_scale not in [ + None, -1]) and ( + manual_fp16 or use_fp16) else tf.constant( + True, dtype=tf.bool) + batch_finite = tf.cond(reset_step, + lambda: batch_finite.assign( + tf.math.logical_and(tf.constant(True, dtype=tf.bool), all_are_finite)), + lambda: batch_finite.assign(tf.math.logical_and(batch_finite, all_are_finite))) + + # This is how the model was pre-trained. + # ensure global norm is a finite number + # to prevent clip_by_global_norm from having a hizzy fit. + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + (clipped_grads, _) = tf.clip_by_global_norm( + grads, clip_norm=1.0, + use_norm=tf.cond( + all_are_finite, + lambda: tf.global_norm(grads), + lambda: tf.constant(1.0))) + else: + with tf.name_scope("clip_grads"): + clipped_grads = [ + (tf.clip_by_norm(grad, clip_norm=1.0)) + if grad is not None else (grad, var) for grad in grads + ] + + accum_vars = tf.cond(reset_step, + lambda: [accum_vars[i].assign(grad) for i, grad in enumerate(clipped_grads)], + lambda: [accum_vars[i].assign_add(grad) for i, grad in enumerate(clipped_grads)]) + + def update(accum_vars): + with tf.name_scope("opt_update"): + if allreduce_post_accumulation and hvd is not None: + accum_vars = [hvd.allreduce(tf.convert_to_tensor(accum_var), + compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) if isinstance( + accum_var, tf.IndexedSlices) + else hvd.allreduce(accum_var, + compression=Compression.fp16 if use_fp16 or manual_fp16 else Compression.none) + for accum_var in accum_vars] + return optimizer.apply_gradients(list(zip(accum_vars, tvars)), global_step=global_step) + + update_step = tf.identity(tf.cast(tf.math.equal(local_step % num_accumulation_steps, 0), dtype=tf.bool), + name="update_step") + update_op = tf.cond(update_step, + lambda: update(accum_vars), lambda: tf.no_op()) + + new_global_step = tf.cond( + tf.math.logical_and(update_step, tf.cast(hvd.allreduce(tf.cast(batch_finite, tf.int32)), tf.bool)), + lambda: global_step + 1, lambda: global_step) + new_global_step = tf.identity(new_global_step, name='step_update') + train_op = tf.group(update_op, [global_step.assign(new_global_step)]) + else: + grads_and_vars = [(g, v) for g, v in grads_and_vars if g is not None] + grads, tvars = list(zip(*grads_and_vars)) + + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + all_are_finite = tf.constant(True, dtype=tf.bool) + + # This is how the model was pre-trained. + # ensure global norm is a finite number + # to prevent clip_by_global_norm from having a hizzy fit. + if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + (clipped_grads, _) = tf.clip_by_global_norm( + grads, clip_norm=1.0, + use_norm=tf.cond( + all_are_finite, + lambda: tf.global_norm(grads), + lambda: tf.constant(1.0))) + else: + with tf.name_scope("clip_grads"): + clipped_grads = [ + (tf.clip_by_norm(grad, clip_norm=1.0)) + if grad is not None else (grad, var) for grad in grads + ] + + with tf.name_scope("apply_grads"): + train_op = optimizer.apply_gradients( + list(zip(clipped_grads, tvars)), global_step=global_step) + + # if tf.flags.FLAGS.npu_bert_clip_by_global_norm: + # new_global_step = tf.cond(all_are_finite, lambda: global_step + 1, lambda: global_step) + # else: + # new_global_step = global_step + 1 + # new_global_step = tf.identity(new_global_step, name='step_update') + # train_op = tf.group(train_op, [global_step.assign(new_global_step)]) + return train_op + + +class AdamWeightDecayOptimizer(tf.train.Optimizer): + """A basic Adam optimizer that includes "correct" L2 weight decay.""" + + def __init__(self, + learning_rate, + weight_decay_rate=0.0, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=None, + name="AdamWeightDecayOptimizer"): + """Constructs a AdamWeightDecayOptimizer.""" + super(AdamWeightDecayOptimizer, self).__init__(False, name) + + self.learning_rate = tf.identity(learning_rate, name='learning_rate') + self.weight_decay_rate = weight_decay_rate + self.beta_1 = beta_1 + self.beta_2 = beta_2 + self.epsilon = epsilon + self.exclude_from_weight_decay = exclude_from_weight_decay + + def apply_gradients(self, grads_and_vars, global_step=None, name=None, + manual_fp16=False): + """See base class.""" + assignments = [] + for (grad, param) in grads_and_vars: + with tf.name_scope("apply_one_adam"): + if grad is None or param is None: + continue + + param_name = self._get_variable_name(param.name) + has_shadow = manual_fp16 and param.dtype.base_dtype != tf.float32 + if has_shadow: + # create shadow fp32 weights for fp16 variable + param_fp32 = tf.get_variable( + name=param_name + "/shadow", + dtype=tf.float32, + trainable=False, + initializer=tf.cast(param.initialized_value(), tf.float32)) + else: + param_fp32 = param + + m = tf.get_variable( + name=param_name + "/adam_m", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + v = tf.get_variable( + name=param_name + "/adam_v", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + if tf.flags.FLAGS.npu_bert_use_fused_adam_momentum: + if self._do_use_weight_decay(param_name): + assignments.extend([npu_ops.adam_apply_one_with_decay_assign(grad, v, m, param_fp32, self.learning_rate, + self.beta_1, 1.0 - self.beta_1, self.beta_2, 1.0 - self.beta_2, + self.weight_decay_rate, self.epsilon)]) + else: + assignments.extend([npu_ops.adam_apply_one_assign(grad, v, m, param_fp32, self.learning_rate, self.beta_1, + 1.0 - self.beta_1, self.beta_2, 1.0 - self.beta_2, self.epsilon)]) + else: + # Standard Adam update. + next_m = ( + tf.multiply(self.beta_1, m) + tf.multiply(1.0 - self.beta_1, grad)) + next_v = ( + tf.multiply(self.beta_2, v) + tf.multiply(1.0 - self.beta_2, + tf.square(grad))) + + update = next_m / (tf.sqrt(next_v) + self.epsilon) + + # Just adding the square of the weights to the loss function is *not* + # the correct way of using L2 regularization/weight decay with Adam, + # since that will interact with the m and v parameters in strange ways. + # + # Instead we want to decay the weights in a manner that doesn't interact + # with the m/v parameters. This is equivalent to adding the square + # of the weights to the loss with plain (non-momentum) SGD. + if self._do_use_weight_decay(param_name): + update += self.weight_decay_rate * param_fp32 + + update_with_lr = self.learning_rate * update + + next_param = param_fp32 - update_with_lr + + if has_shadow: + # cast shadow fp32 weights to fp16 and assign to trainable variable + param.assign(tf.cast(next_param, param.dtype.base_dtype)) + assignments.extend( + [param_fp32.assign(next_param), + m.assign(next_m), + v.assign(next_v)]) + new_global_step = global_step + 1 + new_global_step = tf.identity(new_global_step, name='step_update') + assignments.extend([global_step.assign(new_global_step)]) + return tf.group(*assignments, name=name) + + def _do_use_weight_decay(self, param_name): + """Whether to use L2 weight decay for `param_name`.""" + if not self.weight_decay_rate: + return False + if self.exclude_from_weight_decay: + for r in self.exclude_from_weight_decay: + if re.search(r, param_name) is not None: + return False + return True + + def _get_variable_name(self, param_name): + """Get the variable name from the tensor name.""" + m = re.match("^(.*):\\d+$", param_name) + if m is not None: + param_name = m.group(1) + return param_name + + +class LAMBOptimizer(tf.train.Optimizer): + """A LAMB optimizer that includes "correct" L2 weight decay.""" + + def __init__(self, + learning_rate, + weight_decay_rate=0.0, + beta_1=0.9, + beta_2=0.999, + epsilon=1e-6, + exclude_from_weight_decay=None, + name="LAMBOptimizer"): + """Constructs a LAMBOptimizer.""" + super(LAMBOptimizer, self).__init__(False, name) + + self.learning_rate = tf.identity(learning_rate, name='learning_rate') + self.weight_decay_rate = weight_decay_rate + self.beta_1 = beta_1 + self.beta_2 = beta_2 + self.epsilon = epsilon + self.exclude_from_weight_decay = exclude_from_weight_decay + self.steps = 0 + + def apply_gradients(self, grads_and_vars, global_step=None, name=None, + manual_fp16=False): + """See base class.""" + assignments = [] + for (grad, param) in grads_and_vars: + with tf.name_scope("apply_one_lamb"): + if grad is None or param is None: + continue + + param_name = self._get_variable_name(param.name) + has_shadow = manual_fp16 and param.dtype.base_dtype != tf.float32 + if has_shadow: + # create shadow fp32 weights for fp16 variable + param_fp32 = tf.get_variable( + name=param_name + "/shadow", + dtype=tf.float32, + trainable=False, + initializer=tf.cast(param.initialized_value(), tf.float32)) + else: + param_fp32 = param + + m = tf.get_variable( + name=param_name + "/adam_m", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + v = tf.get_variable( + name=param_name + "/adam_v", + shape=param.shape.as_list(), + dtype=tf.float32, + trainable=False, + initializer=tf.zeros_initializer()) + + # LAMB update + next_m = ( + tf.multiply(self.beta_1, m) + tf.multiply(1.0 - self.beta_1, grad)) + next_v = ( + tf.multiply(self.beta_2, v) + tf.multiply(1.0 - self.beta_2, + tf.square(grad))) + + self.steps += 1 + beta1_correction = (1 - self.beta_1 ** self.steps) + beta2_correction = (1 - self.beta_2 ** self.steps) + + next_m_unbiased = next_m / beta1_correction + next_v_unbiased = next_v / beta2_correction + + update = next_m_unbiased / (tf.sqrt(next_v_unbiased) + self.epsilon) + + # Just adding the square of the weights to the loss function is *not* + # the correct way of using L2 regularization/weight decay with Adam, + # since that will interact with the m and v parameters in strange ways. + # + # Instead we want to decay the weights in a manner that doesn't interact + # with the m/v parameters. This is equivalent to adding the square + # of the weights to the loss with plain (non-momentum) SGD. + if self._do_use_weight_decay(param_name): + update += self.weight_decay_rate * param_fp32 + + w_norm = linalg_ops.norm(param, ord=2) + g_norm = linalg_ops.norm(update, ord=2) + ratio = array_ops.where(math_ops.greater(w_norm, 0), array_ops.where( + math_ops.greater(g_norm, 0), (w_norm / g_norm), 1.0), 1.0) + + update_with_lr = ratio * self.learning_rate * update + + next_param = param_fp32 - update_with_lr + + if has_shadow: + # cast shadow fp32 weights to fp16 and assign to trainable variable + param.assign(tf.cast(next_param, param.dtype.base_dtype)) + assignments.extend( + [param_fp32.assign(next_param), + m.assign(next_m), + v.assign(next_v)]) + new_global_step = global_step + 1 + new_global_step = tf.identity(new_global_step, name='step_update') + assignments.extend([global_step.assign(new_global_step)]) + return tf.group(*assignments, name=name) + + def _do_use_weight_decay(self, param_name): + """Whether to use L2 weight decay for `param_name`.""" + if not self.weight_decay_rate: + return False + if self.exclude_from_weight_decay: + for r in self.exclude_from_weight_decay: + if re.search(r, param_name) is not None: + return False + return True + + def _get_variable_name(self, param_name): + """Get the variable name from the tensor name.""" + m = re.match("^(.*):\\d+$", param_name) + if m is not None: + param_name = m.group(1) + return param_name diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization_test.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization_test.py new file mode 100644 index 0000000..4f2dcf1 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/optimization_test.py @@ -0,0 +1,48 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import optimization +import tensorflow as tf + + +class OptimizationTest(tf.test.TestCase): + + def test_adam(self): + with self.test_session() as sess: + w = tf.get_variable( + "w", + shape=[3], + initializer=tf.constant_initializer([0.1, -0.2, -0.1])) + x = tf.constant([0.4, 0.2, -0.5]) + loss = tf.reduce_mean(tf.square(x - w)) + tvars = tf.trainable_variables() + grads = tf.gradients(loss, tvars) + global_step = tf.train.get_or_create_global_step() + optimizer = optimization.AdamWeightDecayOptimizer(learning_rate=0.2) + train_op = optimizer.apply_gradients(zip(grads, tvars), global_step) + init_op = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + sess.run(init_op) + for _ in range(100): + sess.run(train_op) + w_np = sess.run(w) + self.assertAllClose(w_np.flat, [0.4, 0.2, -0.5], rtol=1e-2, atol=1e-2) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/predicting_movie_reviews_with_bert_on_tf_hub.ipynb b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/predicting_movie_reviews_with_bert_on_tf_hub.ipynb new file mode 100644 index 0000000..466857f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/predicting_movie_reviews_with_bert_on_tf_hub.ipynb @@ -0,0 +1,1231 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Predicting Movie Reviews with BERT on TF Hub.ipynb", + "version": "0.3.2", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "metadata": { + "id": "j0a4mTk9o1Qg", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Copyright 2019 Google Inc.\n", + "\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "dCpvgG0vwXAZ", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "#Predicting Movie Review Sentiment with BERT on TF Hub" + ] + }, + { + "metadata": { + "id": "xiYrZKaHwV81", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "If you’ve been following Natural Language Processing over the past year, you’ve probably heard of BERT: Bidirectional Encoder Representations from Transformers. It’s a neural network architecture designed by Google researchers that’s totally transformed what’s state-of-the-art for NLP tasks, like text classification, translation, summarization, and question answering.\n", + "\n", + "Now that BERT's been added to [TF Hub](https://www.tensorflow.org/hub) as a loadable module, it's easy(ish) to add into existing Tensorflow text pipelines. In an existing pipeline, BERT can replace text embedding layers like ELMO and GloVE. Alternatively, [finetuning](http://wiki.fast.ai/index.php/Fine_tuning) BERT can provide both an accuracy boost and faster training time in many cases.\n", + "\n", + "Here, we'll train a model to predict whether an IMDB movie review is positive or negative using BERT in Tensorflow with tf hub. Some code was adapted from [this colab notebook](https://colab.sandbox.google.com/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb). Let's get started!" + ] + }, + { + "metadata": { + "id": "hsZvic2YxnTz", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "from sklearn.model_selection import train_test_split\n", + "import pandas as pd\n", + "import tensorflow as tf\n", + "import tensorflow_hub as hub\n", + "from datetime import datetime" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "cp5wfXDx5SPH", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "In addition to the standard libraries we imported above, we'll need to install BERT's python package." + ] + }, + { + "metadata": { + "id": "jviywGyWyKsA", + "colab_type": "code", + "outputId": "166f3005-d219-404f-b201-2a0b75480360", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + } + }, + "cell_type": "code", + "source": [ + "!pip install bert-tensorflow" + ], + "execution_count": 38, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Requirement already satisfied: bert-tensorflow in /usr/local/lib/python3.6/dist-packages (1.0.1)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from bert-tensorflow) (1.11.0)\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "hhbGEfwgdEtw", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "import bert\n", + "from bert import run_classifier\n", + "from bert import optimization\n", + "from bert import tokenization" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "KVB3eOcjxxm1", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Below, we'll set an output directory location to store our model output and checkpoints. This can be a local directory, in which case you'd set OUTPUT_DIR to the name of the directory you'd like to create. If you're running this code in Google's hosted Colab, the directory won't persist after the Colab session ends.\n", + "\n", + "Alternatively, if you're a GCP user, you can store output in a GCP bucket. To do that, set a directory name in OUTPUT_DIR and the name of the GCP bucket in the BUCKET field.\n", + "\n", + "Set DO_DELETE to rewrite the OUTPUT_DIR if it exists. Otherwise, Tensorflow will load existing model checkpoints from that directory (if they exist)." + ] + }, + { + "metadata": { + "id": "US_EAnICvP7f", + "colab_type": "code", + "outputId": "7780a032-31d4-4794-e6aa-664a5d2ae7dd", + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "cell_type": "code", + "source": [ + "# Set the output directory for saving model file\n", + "# Optionally, set a GCP bucket location\n", + "\n", + "OUTPUT_DIR = 'OUTPUT_DIR_NAME'#@param {type:\"string\"}\n", + "#@markdown Whether or not to clear/delete the directory and create a new one\n", + "DO_DELETE = False #@param {type:\"boolean\"}\n", + "#@markdown Set USE_BUCKET and BUCKET if you want to (optionally) store model output on GCP bucket.\n", + "USE_BUCKET = True #@param {type:\"boolean\"}\n", + "BUCKET = 'BUCKET_NAME' #@param {type:\"string\"}\n", + "\n", + "if USE_BUCKET:\n", + " OUTPUT_DIR = 'gs://{}/{}'.format(BUCKET, OUTPUT_DIR)\n", + " from google.colab import auth\n", + " auth.authenticate_user()\n", + "\n", + "if DO_DELETE:\n", + " try:\n", + " tf.gfile.DeleteRecursively(OUTPUT_DIR)\n", + " except:\n", + " # Doesn't matter if the directory didn't exist\n", + " pass\n", + "tf.gfile.MakeDirs(OUTPUT_DIR)\n", + "print('***** Model output directory: {} *****'.format(OUTPUT_DIR))\n" + ], + "execution_count": 40, + "outputs": [ + { + "output_type": "stream", + "text": [ + "***** Model output directory: gs://bert-tfhub/aclImdb_v1 *****\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "pmFYvkylMwXn", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "#Data" + ] + }, + { + "metadata": { + "id": "MC_w8SRqN0fr", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "First, let's download the dataset, hosted by Stanford. The code below, which downloads, extracts, and imports the IMDB Large Movie Review Dataset, is borrowed from [this Tensorflow tutorial](https://www.tensorflow.org/hub/tutorials/text_classification_with_tf_hub)." + ] + }, + { + "metadata": { + "id": "fom_ff20gyy6", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "from tensorflow import keras\n", + "import os\n", + "import re\n", + "\n", + "# Load all files from a directory in a DataFrame.\n", + "def load_directory_data(directory):\n", + " data = {}\n", + " data[\"sentence\"] = []\n", + " data[\"sentiment\"] = []\n", + " for file_path in os.listdir(directory):\n", + " with tf.gfile.GFile(os.path.join(directory, file_path), \"r\") as f:\n", + " data[\"sentence\"].append(f.read())\n", + " data[\"sentiment\"].append(re.match(\"\\d+_(\\d+)\\.txt\", file_path).group(1))\n", + " return pd.DataFrame.from_dict(data)\n", + "\n", + "# Merge positive and negative examples, add a polarity column and shuffle.\n", + "def load_dataset(directory):\n", + " pos_df = load_directory_data(os.path.join(directory, \"pos\"))\n", + " neg_df = load_directory_data(os.path.join(directory, \"neg\"))\n", + " pos_df[\"polarity\"] = 1\n", + " neg_df[\"polarity\"] = 0\n", + " return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)\n", + "\n", + "# Download and process the dataset files.\n", + "def download_and_load_datasets(force_download=False):\n", + " dataset = tf.keras.utils.get_file(\n", + " fname=\"aclImdb.tar.gz\", \n", + " origin=\"http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz\", \n", + " extract=True)\n", + " \n", + " train_df = load_dataset(os.path.join(os.path.dirname(dataset), \n", + " \"aclImdb\", \"train\"))\n", + " test_df = load_dataset(os.path.join(os.path.dirname(dataset), \n", + " \"aclImdb\", \"test\"))\n", + " \n", + " return train_df, test_df\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "2abfwdn-g135", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "train, test = download_and_load_datasets()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "XA8WHJgzhIZf", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "To keep training fast, we'll take a sample of 5000 train and test examples, respectively." + ] + }, + { + "metadata": { + "id": "lw_F488eixTV", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "train = train.sample(5000)\n", + "test = test.sample(5000)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "prRQM8pDi8xI", + "colab_type": "code", + "outputId": "34445cb8-2be0-4379-fdbc-7794091f6049", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "cell_type": "code", + "source": [ + "train.columns" + ], + "execution_count": 44, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['sentence', 'sentiment', 'polarity'], dtype='object')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 44 + } + ] + }, + { + "metadata": { + "id": "sfRnHSz3iSXz", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "For us, our input data is the 'sentence' column and our label is the 'polarity' column (0, 1 for negative and positive, respecitvely)" + ] + }, + { + "metadata": { + "id": "IuMOGwFui4it", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "DATA_COLUMN = 'sentence'\n", + "LABEL_COLUMN = 'polarity'\n", + "# label_list is the list of labels, i.e. True, False or 0, 1 or 'dog', 'cat'\n", + "label_list = [0, 1]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "V399W0rqNJ-Z", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "#Data Preprocessing\n", + "We'll need to transform our data into a format BERT understands. This involves two steps. First, we create `InputExample`'s using the constructor provided in the BERT library.\n", + "\n", + "- `text_a` is the text we want to classify, which in this case, is the `Request` field in our Dataframe. \n", + "- `text_b` is used if we're training a model to understand the relationship between sentences (i.e. is `text_b` a translation of `text_a`? Is `text_b` an answer to the question asked by `text_a`?). This doesn't apply to our task, so we can leave `text_b` blank.\n", + "- `label` is the label for our example, i.e. True, False" + ] + }, + { + "metadata": { + "id": "p9gEt5SmM6i6", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Use the InputExample class from BERT's run_classifier code to create examples from the data\n", + "train_InputExamples = train.apply(lambda x: bert.run_classifier.InputExample(guid=None, # Globally unique ID for bookkeeping, unused in this example\n", + " text_a = x[DATA_COLUMN], \n", + " text_b = None, \n", + " label = x[LABEL_COLUMN]), axis = 1)\n", + "\n", + "test_InputExamples = test.apply(lambda x: bert.run_classifier.InputExample(guid=None, \n", + " text_a = x[DATA_COLUMN], \n", + " text_b = None, \n", + " label = x[LABEL_COLUMN]), axis = 1)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "SCZWZtKxObjh", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Next, we need to preprocess our data so that it matches the data BERT was trained on. For this, we'll need to do a couple of things (but don't worry--this is also included in the Python library):\n", + "\n", + "\n", + "1. Lowercase our text (if we're using a BERT lowercase model)\n", + "2. Tokenize it (i.e. \"sally says hi\" -> [\"sally\", \"says\", \"hi\"])\n", + "3. Break words into WordPieces (i.e. \"calling\" -> [\"call\", \"##ing\"])\n", + "4. Map our words to indexes using a vocab file that BERT provides\n", + "5. Add special \"CLS\" and \"SEP\" tokens (see the [readme](https://github.com/google-research/bert))\n", + "6. Append \"index\" and \"segment\" tokens to each input (see the [BERT paper](https://arxiv.org/pdf/1810.04805.pdf))\n", + "\n", + "Happily, we don't have to worry about most of these details.\n", + "\n", + "\n" + ] + }, + { + "metadata": { + "id": "qMWiDtpyQSoU", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "To start, we'll need to load a vocabulary file and lowercasing information directly from the BERT tf hub module:" + ] + }, + { + "metadata": { + "id": "IhJSe0QHNG7U", + "colab_type": "code", + "outputId": "20b28cc7-3cb3-4ce6-bfff-a7847ce3bbaa", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "cell_type": "code", + "source": [ + "# This is a path to an uncased (all lowercase) version of BERT\n", + "BERT_MODEL_HUB = \"https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1\"\n", + "\n", + "def create_tokenizer_from_hub_module():\n", + " \"\"\"Get the vocab file and casing info from the Hub module.\"\"\"\n", + " with tf.Graph().as_default():\n", + " bert_module = hub.Module(BERT_MODEL_HUB)\n", + " tokenization_info = bert_module(signature=\"tokenization_info\", as_dict=True)\n", + " with tf.Session() as sess:\n", + " vocab_file, do_lower_case = sess.run([tokenization_info[\"vocab_file\"],\n", + " tokenization_info[\"do_lower_case\"]])\n", + " \n", + " return bert.tokenization.FullTokenizer(\n", + " vocab_file=vocab_file, do_lower_case=do_lower_case)\n", + "\n", + "tokenizer = create_tokenizer_from_hub_module()" + ], + "execution_count": 47, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Saver not created because there are no variables in the graph to restore\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "z4oFkhpZBDKm", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Great--we just learned that the BERT model we're using expects lowercase data (that's what stored in tokenization_info[\"do_lower_case\"]) and we also loaded BERT's vocab file. We also created a tokenizer, which breaks words into word pieces:" + ] + }, + { + "metadata": { + "id": "dsBo6RCtQmwx", + "colab_type": "code", + "outputId": "9af8c917-90ec-4fe9-897b-79dc89ca88e1", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + } + }, + "cell_type": "code", + "source": [ + "tokenizer.tokenize(\"This here's an example of using the BERT tokenizer\")" + ], + "execution_count": 48, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['this',\n", + " 'here',\n", + " \"'\",\n", + " 's',\n", + " 'an',\n", + " 'example',\n", + " 'of',\n", + " 'using',\n", + " 'the',\n", + " 'bert',\n", + " 'token',\n", + " '##izer']" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 48 + } + ] + }, + { + "metadata": { + "id": "0OEzfFIt6GIc", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Using our tokenizer, we'll call `run_classifier.convert_examples_to_features` on our InputExamples to convert them into features BERT understands." + ] + }, + { + "metadata": { + "id": "LL5W8gEGRTAf", + "colab_type": "code", + "outputId": "65001dda-155b-48fc-b5fc-1e4cabc8dfbf", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1261 + } + }, + "cell_type": "code", + "source": [ + "# We'll set sequences to be at most 128 tokens long.\n", + "MAX_SEQ_LENGTH = 128\n", + "# Convert our train and test features to InputFeatures that BERT understands.\n", + "train_features = bert.run_classifier.convert_examples_to_features(train_InputExamples, label_list, MAX_SEQ_LENGTH, tokenizer)\n", + "test_features = bert.run_classifier.convert_examples_to_features(test_InputExamples, label_list, MAX_SEQ_LENGTH, tokenizer)" + ], + "execution_count": 49, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Writing example 0 of 5000\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] i ' m watching this on the sci - fi channel right now . it ' s so horrible i can ' t stop watching it ! i ' m a video ##grapher and this movie makes me sad . i feel bad for anyone associated with this movie . some of the camera work is good . most is very questionable . there are a few decent actors in the flick . too bad they ' re surrounded by what must have been the director ' s relatives . that ' s the only way they could have been qualified to be in a movie ! music was a little better than the acting . if you get around to watching this i hope it [SEP]\n", + "INFO:tensorflow:input_ids: 101 1045 1005 1049 3666 2023 2006 1996 16596 1011 10882 3149 2157 2085 1012 2009 1005 1055 2061 9202 1045 2064 1005 1056 2644 3666 2009 999 1045 1005 1049 1037 2678 18657 1998 2023 3185 3084 2033 6517 1012 1045 2514 2919 2005 3087 3378 2007 2023 3185 1012 2070 1997 1996 4950 2147 2003 2204 1012 2087 2003 2200 21068 1012 2045 2024 1037 2261 11519 5889 1999 1996 17312 1012 2205 2919 2027 1005 2128 5129 2011 2054 2442 2031 2042 1996 2472 1005 1055 9064 1012 2008 1005 1055 1996 2069 2126 2027 2071 2031 2042 4591 2000 2022 1999 1037 3185 999 2189 2001 1037 2210 2488 2084 1996 3772 1012 2065 2017 2131 2105 2000 3666 2023 1045 3246 2009 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] i have been a fan of pushing dai ##sies since the very beginning . it is wonderful ##ly thought up , and bryan fuller has the most remarkable ideas for this show . < br / > < br / > it is unbelievable on how much tv has been needing a creative , original show like pushing dai ##sies . it is a huge relief to see a show , that is unlike the rest , where as , if you compared it to some of the newer shows , such as scrub ##s and house , you would see the similarities , and it does get ted ##ious at moments to see shows so close in identity . < br / > < br [SEP]\n", + "INFO:tensorflow:input_ids: 101 1045 2031 2042 1037 5470 1997 6183 18765 14625 2144 1996 2200 2927 1012 2009 2003 6919 2135 2245 2039 1010 1998 8527 12548 2038 1996 2087 9487 4784 2005 2023 2265 1012 1026 7987 1013 1028 1026 7987 1013 1028 2009 2003 23653 2006 2129 2172 2694 2038 2042 11303 1037 5541 1010 2434 2265 2066 6183 18765 14625 1012 2009 2003 1037 4121 4335 2000 2156 1037 2265 1010 2008 2003 4406 1996 2717 1010 2073 2004 1010 2065 2017 4102 2009 2000 2070 1997 1996 10947 3065 1010 2107 2004 18157 2015 1998 2160 1010 2017 2052 2156 1996 12319 1010 1998 2009 2515 2131 6945 6313 2012 5312 2000 2156 3065 2061 2485 1999 4767 1012 1026 7987 1013 1028 1026 7987 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 1 (id = 1)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] this movie starts out promising ##ly , with an early scene in which frank morgan advises against gary cooper ' s marriage to his daughter , anita louise . frank morgan , playing an una ##bas ##hed gold - digger , loudly complain ##s to cooper about his perceived pen ##ury at the hands of his family - including his daughter , anita louise . i am a fan of all 3 actors . frank morgan is ( to my mind ) a hollywood treasure , cooper a legend , and louise a very lovely , versatile and under - appreciated actress seldom seen in the leading role . i also have nothing against teresa wright , and while not blessed with great range , she [SEP]\n", + "INFO:tensorflow:input_ids: 101 2023 3185 4627 2041 10015 2135 1010 2007 2019 2220 3496 1999 2029 3581 5253 25453 2114 5639 6201 1005 1055 3510 2000 2010 2684 1010 12918 8227 1012 3581 5253 1010 2652 2019 14477 22083 9072 2751 1011 28661 1010 9928 17612 2015 2000 6201 2055 2010 8690 7279 13098 2012 1996 2398 1997 2010 2155 1011 2164 2010 2684 1010 12918 8227 1012 1045 2572 1037 5470 1997 2035 1017 5889 1012 3581 5253 2003 1006 2000 2026 2568 1007 1037 5365 8813 1010 6201 1037 5722 1010 1998 8227 1037 2200 8403 1010 22979 1998 2104 1011 12315 3883 15839 2464 1999 1996 2877 2535 1012 1045 2036 2031 2498 2114 12409 6119 1010 1998 2096 2025 10190 2007 2307 2846 1010 2016 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] i was over ##taken by the emotion . un ##for ##get ##table rendering of a wartime story which is unknown to most people . the performances were fault ##less and outstanding . [SEP]\n", + "INFO:tensorflow:input_ids: 101 1045 2001 2058 25310 2011 1996 7603 1012 4895 29278 18150 10880 14259 1997 1037 12498 2466 2029 2003 4242 2000 2087 2111 1012 1996 4616 2020 6346 3238 1998 5151 1012 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 1 (id = 1)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] soldier blue is a movie with pre ##tension ##s : pre ##tension ##s to be some sort of profound statement on man ' s inhuman ##ity to man , on the white man ' s exploitation of and brutality towards indigenous peoples ; a biting , un ##fl ##in ##ching and sar ##don ##ic commentary on the horrors of vietnam . well , sorry , but it fails mis ##era ##bly to be any of those things . what soldier blue actually is is per ##nic ##ious , tri ##te , badly made , dish ##ones ##t rubbish . < br / > < br / > another reviewer here hit the nail on the head in saying that it appears to be a hybrid of [SEP]\n", + "INFO:tensorflow:input_ids: 101 5268 2630 2003 1037 3185 2007 3653 29048 2015 1024 3653 29048 2015 2000 2022 2070 4066 1997 13769 4861 2006 2158 1005 1055 29582 3012 2000 2158 1010 2006 1996 2317 2158 1005 1055 14427 1997 1998 24083 2875 6284 7243 1025 1037 12344 1010 4895 10258 2378 8450 1998 18906 5280 2594 8570 2006 1996 22812 1997 5148 1012 2092 1010 3374 1010 2021 2009 11896 28616 6906 6321 2000 2022 2151 1997 2216 2477 1012 2054 5268 2630 2941 2003 2003 2566 8713 6313 1010 13012 2618 1010 6649 2081 1010 9841 21821 2102 29132 1012 1026 7987 1013 1028 1026 7987 1013 1028 2178 12027 2182 2718 1996 13774 2006 1996 2132 1999 3038 2008 2009 3544 2000 2022 1037 8893 1997 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:Writing example 0 of 5000\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] i just watched this today on tv . it was on abc ' s sunday afternoon movie . < br / > < br / > this wasn ' t a very good movie , but for a low budget independent film like this , it was okay . there is some suspense in it , but there are so many bad qualities that really bring the movie down . the script is pretty lame , and the plot elements aren ' t very realistic , such as the way a 911 operator would laugh and hang up when someone is reporting a murder . i don ' t know what the writer was thinking when they came up with that idea , but it isn [SEP]\n", + "INFO:tensorflow:input_ids: 101 1045 2074 3427 2023 2651 2006 2694 1012 2009 2001 2006 5925 1005 1055 4465 5027 3185 1012 1026 7987 1013 1028 1026 7987 1013 1028 2023 2347 1005 1056 1037 2200 2204 3185 1010 2021 2005 1037 2659 5166 2981 2143 2066 2023 1010 2009 2001 3100 1012 2045 2003 2070 23873 1999 2009 1010 2021 2045 2024 2061 2116 2919 11647 2008 2428 3288 1996 3185 2091 1012 1996 5896 2003 3492 20342 1010 1998 1996 5436 3787 4995 1005 1056 2200 12689 1010 2107 2004 1996 2126 1037 19989 6872 2052 4756 1998 6865 2039 2043 2619 2003 7316 1037 4028 1012 1045 2123 1005 1056 2113 2054 1996 3213 2001 3241 2043 2027 2234 2039 2007 2008 2801 1010 2021 2009 3475 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] from hardly alien sounding lasers , to an elementary school style shuttle crash , \" night ##be ##ast \" is better classified as a far ##cic ##al mix of fake blood and bare chest . the almost pornographic style of the film seems to be a failed attempt to recover from a lack of co ##hesive or effective story . the acting however is not nearly as beast ##ly , many of the young , aspiring , actors ad ##mir ##ably showcase a hidden talent . particularly don lei ##fer ##t and jamie ze ##mare ##l , who shed a well needed sha ##rd of light on this otherwise terrible film . night ##be ##ast would have never shown up on set had he known the [SEP]\n", + "INFO:tensorflow:input_ids: 101 2013 6684 7344 9391 23965 1010 2000 2019 4732 2082 2806 10382 5823 1010 1000 2305 4783 14083 1000 2003 2488 6219 2004 1037 2521 19053 2389 4666 1997 8275 2668 1998 6436 3108 1012 1996 2471 26932 2806 1997 1996 2143 3849 2000 2022 1037 3478 3535 2000 8980 2013 1037 3768 1997 2522 21579 2030 4621 2466 1012 1996 3772 2174 2003 2025 3053 2004 6841 2135 1010 2116 1997 1996 2402 1010 22344 1010 5889 4748 14503 8231 13398 1037 5023 5848 1012 3391 2123 26947 7512 2102 1998 6175 27838 24376 2140 1010 2040 8328 1037 2092 2734 21146 4103 1997 2422 2006 2023 4728 6659 2143 1012 2305 4783 14083 2052 2031 2196 3491 2039 2006 2275 2018 2002 2124 1996 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] here we have the in ##imi ##table charlie chaplin for ##sa ##king his slap ##stick past to tackle the serious subject of anti - semi ##tism , and into ##ler ##ance in general . he portrays two characters - the sweet , innocent jewish barber - a war veteran , and the ravi ##ng and ruthless dictator , aden ##oid h ##yn ##kel . the jewish ghetto in this country is not safe for long , due to the w ##him ##s of h ##yn ##kel and his armed thugs , who routinely rough up its residents , or leave them alone , dependent upon his mood that day or week . the barber is among them , but is befriended by his former commanding officer [SEP]\n", + "INFO:tensorflow:input_ids: 101 2182 2057 2031 1996 1999 27605 10880 4918 23331 2005 3736 6834 2010 14308 21354 2627 2000 11147 1996 3809 3395 1997 3424 1011 4100 17456 1010 1998 2046 3917 6651 1999 2236 1012 2002 17509 2048 3494 1011 1996 4086 1010 7036 3644 13362 1011 1037 2162 8003 1010 1998 1996 16806 3070 1998 18101 21237 1010 16298 9314 1044 6038 11705 1012 1996 3644 17276 1999 2023 2406 2003 2025 3647 2005 2146 1010 2349 2000 1996 1059 14341 2015 1997 1044 6038 11705 1998 2010 4273 24106 1010 2040 19974 5931 2039 2049 3901 1010 2030 2681 2068 2894 1010 7790 2588 2010 6888 2008 2154 2030 2733 1012 1996 13362 2003 2426 2068 1010 2021 2003 23386 2011 2010 2280 7991 2961 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 1 (id = 1)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] i really hated this movie and it ' s the first movie written by stephen king that i didn ' t finish . i was truly disappointed , it was the worst crap i ' ve ever seen . what were you thinking making three hours out of it ? it may have a quite good story , but actors ? no . suspense ? no . romance ? no . horror ? no . it didn ' t have anything . < br / > < br / > it ' s got this strange , crazy science man with einstein - hair , the classic thing . not real at all . and a man keep getting younger all the time . it seems [SEP]\n", + "INFO:tensorflow:input_ids: 101 1045 2428 6283 2023 3185 1998 2009 1005 1055 1996 2034 3185 2517 2011 4459 2332 2008 1045 2134 1005 1056 3926 1012 1045 2001 5621 9364 1010 2009 2001 1996 5409 10231 1045 1005 2310 2412 2464 1012 2054 2020 2017 3241 2437 2093 2847 2041 1997 2009 1029 2009 2089 2031 1037 3243 2204 2466 1010 2021 5889 1029 2053 1012 23873 1029 2053 1012 7472 1029 2053 1012 5469 1029 2053 1012 2009 2134 1005 1056 2031 2505 1012 1026 7987 1013 1028 1026 7987 1013 1028 2009 1005 1055 2288 2023 4326 1010 4689 2671 2158 2007 15313 1011 2606 1010 1996 4438 2518 1012 2025 2613 2012 2035 1012 1998 1037 2158 2562 2893 3920 2035 1996 2051 1012 2009 3849 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: None\n", + "INFO:tensorflow:tokens: [CLS] story chinese tall story tells the story of righteous monk trip ##ita ##ka , who , along with his guardians monkey , sandy and pigs ##y make their journey west on a quest to recover ancient sutra ##s , finally , they reach the final leg of their journey in sha ##che city but all is not as it seems when the city is attacked by evil tree demons . monkey tries his best to battle them but is overwhelmed , knowing his master is in grave danger , he uses his trust ##y golden staff to thrust trip ##ita ##ka to safety . < br / > < br / > the monk ends up being knocked out when he land and when he wakes [SEP]\n", + "INFO:tensorflow:input_ids: 101 2466 2822 4206 2466 4136 1996 2466 1997 19556 8284 4440 6590 2912 1010 2040 1010 2247 2007 2010 14240 10608 1010 7525 1998 14695 2100 2191 2037 4990 2225 2006 1037 8795 2000 8980 3418 26567 2015 1010 2633 1010 2027 3362 1996 2345 4190 1997 2037 4990 1999 21146 5403 2103 2021 2035 2003 2025 2004 2009 3849 2043 1996 2103 2003 4457 2011 4763 3392 7942 1012 10608 5363 2010 2190 2000 2645 2068 2021 2003 13394 1010 4209 2010 3040 2003 1999 6542 5473 1010 2002 3594 2010 3404 2100 3585 3095 2000 7400 4440 6590 2912 2000 3808 1012 1026 7987 1013 1028 1026 7987 1013 1028 1996 8284 4515 2039 2108 6573 2041 2043 2002 2455 1998 2043 2002 17507 102\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 1 (id = 1)\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "ccp5trMwRtmr", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "#Creating a model\n", + "\n", + "Now that we've prepared our data, let's focus on building a model. `create_model` does just this below. First, it loads the BERT tf hub module again (this time to extract the computation graph). Next, it creates a single new layer that will be trained to adapt BERT to our sentiment task (i.e. classifying whether a movie review is positive or negative). This strategy of using a mostly trained model is called [fine-tuning](http://wiki.fast.ai/index.php/Fine_tuning)." + ] + }, + { + "metadata": { + "id": "6o2a5ZIvRcJq", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def create_model(is_predicting, input_ids, input_mask, segment_ids, labels,\n", + " num_labels):\n", + " \"\"\"Creates a classification model.\"\"\"\n", + "\n", + " bert_module = hub.Module(\n", + " BERT_MODEL_HUB,\n", + " trainable=True)\n", + " bert_inputs = dict(\n", + " input_ids=input_ids,\n", + " input_mask=input_mask,\n", + " segment_ids=segment_ids)\n", + " bert_outputs = bert_module(\n", + " inputs=bert_inputs,\n", + " signature=\"tokens\",\n", + " as_dict=True)\n", + "\n", + " # Use \"pooled_output\" for classification tasks on an entire sentence.\n", + " # Use \"sequence_outputs\" for token-level output.\n", + " output_layer = bert_outputs[\"pooled_output\"]\n", + "\n", + " hidden_size = output_layer.shape[-1].value\n", + "\n", + " # Create our own layer to tune for politeness data.\n", + " output_weights = tf.get_variable(\n", + " \"output_weights\", [num_labels, hidden_size],\n", + " initializer=tf.truncated_normal_initializer(stddev=0.02))\n", + "\n", + " output_bias = tf.get_variable(\n", + " \"output_bias\", [num_labels], initializer=tf.zeros_initializer())\n", + "\n", + " with tf.variable_scope(\"loss\"):\n", + "\n", + " # Dropout helps prevent overfitting\n", + " output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)\n", + "\n", + " logits = tf.matmul(output_layer, output_weights, transpose_b=True)\n", + " logits = tf.nn.bias_add(logits, output_bias)\n", + " log_probs = tf.nn.log_softmax(logits, axis=-1)\n", + "\n", + " # Convert labels into one-hot encoding\n", + " one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32)\n", + "\n", + " predicted_labels = tf.squeeze(tf.argmax(log_probs, axis=-1, output_type=tf.int32))\n", + " # If we're predicting, we want predicted labels and the probabiltiies.\n", + " if is_predicting:\n", + " return (predicted_labels, log_probs)\n", + "\n", + " # If we're train/eval, compute loss between predicted and actual label\n", + " per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)\n", + " loss = tf.reduce_mean(per_example_loss)\n", + " return (loss, predicted_labels, log_probs)\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "qpE0ZIDOCQzE", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Next we'll wrap our model function in a `model_fn_builder` function that adapts our model to work for training, evaluation, and prediction." + ] + }, + { + "metadata": { + "id": "FnH-AnOQ9KKW", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# model_fn_builder actually creates our model function\n", + "# using the passed parameters for num_labels, learning_rate, etc.\n", + "def model_fn_builder(num_labels, learning_rate, num_train_steps,\n", + " num_warmup_steps):\n", + " \"\"\"Returns `model_fn` closure for TPUEstimator.\"\"\"\n", + " def model_fn(features, labels, mode, params): # pylint: disable=unused-argument\n", + " \"\"\"The `model_fn` for TPUEstimator.\"\"\"\n", + "\n", + " input_ids = features[\"input_ids\"]\n", + " input_mask = features[\"input_mask\"]\n", + " segment_ids = features[\"segment_ids\"]\n", + " label_ids = features[\"label_ids\"]\n", + "\n", + " is_predicting = (mode == tf.estimator.ModeKeys.PREDICT)\n", + " \n", + " # TRAIN and EVAL\n", + " if not is_predicting:\n", + "\n", + " (loss, predicted_labels, log_probs) = create_model(\n", + " is_predicting, input_ids, input_mask, segment_ids, label_ids, num_labels)\n", + "\n", + " train_op = bert.optimization.create_optimizer(\n", + " loss, learning_rate, num_train_steps, num_warmup_steps, use_tpu=False)\n", + "\n", + " # Calculate evaluation metrics. \n", + " def metric_fn(label_ids, predicted_labels):\n", + " accuracy = tf.metrics.accuracy(label_ids, predicted_labels)\n", + " f1_score = tf.contrib.metrics.f1_score(\n", + " label_ids,\n", + " predicted_labels)\n", + " auc = tf.metrics.auc(\n", + " label_ids,\n", + " predicted_labels)\n", + " recall = tf.metrics.recall(\n", + " label_ids,\n", + " predicted_labels)\n", + " precision = tf.metrics.precision(\n", + " label_ids,\n", + " predicted_labels) \n", + " true_pos = tf.metrics.true_positives(\n", + " label_ids,\n", + " predicted_labels)\n", + " true_neg = tf.metrics.true_negatives(\n", + " label_ids,\n", + " predicted_labels) \n", + " false_pos = tf.metrics.false_positives(\n", + " label_ids,\n", + " predicted_labels) \n", + " false_neg = tf.metrics.false_negatives(\n", + " label_ids,\n", + " predicted_labels)\n", + " return {\n", + " \"eval_accuracy\": accuracy,\n", + " \"f1_score\": f1_score,\n", + " \"auc\": auc,\n", + " \"precision\": precision,\n", + " \"recall\": recall,\n", + " \"true_positives\": true_pos,\n", + " \"true_negatives\": true_neg,\n", + " \"false_positives\": false_pos,\n", + " \"false_negatives\": false_neg\n", + " }\n", + "\n", + " eval_metrics = metric_fn(label_ids, predicted_labels)\n", + "\n", + " if mode == tf.estimator.ModeKeys.TRAIN:\n", + " return tf.estimator.EstimatorSpec(mode=mode,\n", + " loss=loss,\n", + " train_op=train_op)\n", + " else:\n", + " return tf.estimator.EstimatorSpec(mode=mode,\n", + " loss=loss,\n", + " eval_metric_ops=eval_metrics)\n", + " else:\n", + " (predicted_labels, log_probs) = create_model(\n", + " is_predicting, input_ids, input_mask, segment_ids, label_ids, num_labels)\n", + "\n", + " predictions = {\n", + " 'probabilities': log_probs,\n", + " 'labels': predicted_labels\n", + " }\n", + " return tf.estimator.EstimatorSpec(mode, predictions=predictions)\n", + "\n", + " # Return the actual model function in the closure\n", + " return model_fn\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "OjwJ4bTeWXD8", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Compute train and warmup steps from batch size\n", + "# These hyperparameters are copied from this colab notebook (https://colab.sandbox.google.com/github/tensorflow/tpu/blob/master/tools/colab/bert_finetuning_with_cloud_tpus.ipynb)\n", + "BATCH_SIZE = 32\n", + "LEARNING_RATE = 2e-5\n", + "NUM_TRAIN_EPOCHS = 3.0\n", + "# Warmup is a period of time where hte learning rate \n", + "# is small and gradually increases--usually helps training.\n", + "WARMUP_PROPORTION = 0.1\n", + "# Model configs\n", + "SAVE_CHECKPOINTS_STEPS = 500\n", + "SAVE_SUMMARY_STEPS = 100" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "emHf9GhfWBZ_", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Compute # train and warmup steps from batch size\n", + "num_train_steps = int(len(train_features) / BATCH_SIZE * NUM_TRAIN_EPOCHS)\n", + "num_warmup_steps = int(num_train_steps * WARMUP_PROPORTION)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "oEJldMr3WYZa", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Specify outpit directory and number of checkpoint steps to save\n", + "run_config = tf.estimator.RunConfig(\n", + " model_dir=OUTPUT_DIR,\n", + " save_summary_steps=SAVE_SUMMARY_STEPS,\n", + " save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "q_WebpS1X97v", + "colab_type": "code", + "outputId": "1648932a-7391-49d3-8af7-52d514e226e8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 156 + } + }, + "cell_type": "code", + "source": [ + "model_fn = model_fn_builder(\n", + " num_labels=len(label_list),\n", + " learning_rate=LEARNING_RATE,\n", + " num_train_steps=num_train_steps,\n", + " num_warmup_steps=num_warmup_steps)\n", + "\n", + "estimator = tf.estimator.Estimator(\n", + " model_fn=model_fn,\n", + " config=run_config,\n", + " params={\"batch_size\": BATCH_SIZE})\n" + ], + "execution_count": 55, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Using config: {'_model_dir': 'gs://bert-tfhub/aclImdb_v1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': 500, '_save_checkpoints_secs': None, '_session_config': allow_soft_placement: true\n", + "graph_options {\n", + " rewrite_options {\n", + " meta_optimizer_iterations: ONE\n", + " }\n", + "}\n", + ", '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "NOO3RfG1DYLo", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Next we create an input builder function that takes our training feature set (`train_features`) and produces a generator. This is a pretty standard design pattern for working with Tensorflow [Estimators](https://www.tensorflow.org/guide/estimators)." + ] + }, + { + "metadata": { + "id": "1Pv2bAlOX_-K", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "# Create an input function for training. drop_remainder = True for using TPUs.\n", + "train_input_fn = bert.run_classifier.input_fn_builder(\n", + " features=train_features,\n", + " seq_length=MAX_SEQ_LENGTH,\n", + " is_training=True,\n", + " drop_remainder=False)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "t6Nukby2EB6-", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Now we train our model! For me, using a Colab notebook running on Google's GPUs, my training time was about 14 minutes." + ] + }, + { + "metadata": { + "id": "nucD4gluYJmK", + "colab_type": "code", + "outputId": "5d728e72-4631-42bf-c48d-3f51d4b968ce", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + } + }, + "cell_type": "code", + "source": [ + "print(f'Beginning Training!')\n", + "current_time = datetime.now()\n", + "estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)\n", + "print(\"Training took time \", datetime.now() - current_time)" + ], + "execution_count": 57, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Beginning Training!\n", + "INFO:tensorflow:Skipping training since max_steps has already saved.\n", + "Training took time 0:00:00.759709\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "CmbLTVniARy3", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Now let's use our test data to see how well our model did:" + ] + }, + { + "metadata": { + "id": "JIhejfpyJ8Bx", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "test_input_fn = run_classifier.input_fn_builder(\n", + " features=test_features,\n", + " seq_length=MAX_SEQ_LENGTH,\n", + " is_training=False,\n", + " drop_remainder=False)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "PPVEXhNjYXC-", + "colab_type": "code", + "outputId": "dd5482cd-c558-465f-c854-ec11a0175316", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 445 + } + }, + "cell_type": "code", + "source": [ + "estimator.evaluate(input_fn=test_input_fn, steps=None)" + ], + "execution_count": 59, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Calling model_fn.\n", + "INFO:tensorflow:Saver not created because there are no variables in the graph to restore\n" + ], + "name": "stdout" + }, + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gradients_impl.py:110: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Starting evaluation at 2019-02-12T21:04:20Z\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from gs://bert-tfhub/aclImdb_v1/model.ckpt-468\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n", + "INFO:tensorflow:Finished evaluation at 2019-02-12-21:06:05\n", + "INFO:tensorflow:Saving dict for global step 468: auc = 0.86659324, eval_accuracy = 0.8664, f1_score = 0.8659711, false_negatives = 375.0, false_positives = 293.0, global_step = 468, loss = 0.51870537, precision = 0.880457, recall = 0.8519542, true_negatives = 2174.0, true_positives = 2158.0\n", + "INFO:tensorflow:Saving 'checkpoint_path' summary for global step 468: gs://bert-tfhub/aclImdb_v1/model.ckpt-468\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'auc': 0.86659324,\n", + " 'eval_accuracy': 0.8664,\n", + " 'f1_score': 0.8659711,\n", + " 'false_negatives': 375.0,\n", + " 'false_positives': 293.0,\n", + " 'global_step': 468,\n", + " 'loss': 0.51870537,\n", + " 'precision': 0.880457,\n", + " 'recall': 0.8519542,\n", + " 'true_negatives': 2174.0,\n", + " 'true_positives': 2158.0}" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 59 + } + ] + }, + { + "metadata": { + "id": "ueKsULteiz1B", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Now let's write code to make predictions on new sentences:" + ] + }, + { + "metadata": { + "id": "OsrbTD2EJTVl", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "def getPrediction(in_sentences):\n", + " labels = [\"Negative\", \"Positive\"]\n", + " input_examples = [run_classifier.InputExample(guid=\"\", text_a = x, text_b = None, label = 0) for x in in_sentences] # here, \"\" is just a dummy label\n", + " input_features = run_classifier.convert_examples_to_features(input_examples, label_list, MAX_SEQ_LENGTH, tokenizer)\n", + " predict_input_fn = run_classifier.input_fn_builder(features=input_features, seq_length=MAX_SEQ_LENGTH, is_training=False, drop_remainder=False)\n", + " predictions = estimator.predict(predict_input_fn)\n", + " return [(sentence, prediction['probabilities'], labels[prediction['labels']]) for sentence, prediction in zip(in_sentences, predictions)]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "-thbodgih_VJ", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "pred_sentences = [\n", + " \"That movie was absolutely awful\",\n", + " \"The acting was a bit lacking\",\n", + " \"The film was creative and surprising\",\n", + " \"Absolutely fantastic!\"\n", + "]" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "QrZmvZySKQTm", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 649 + }, + "outputId": "3891fafb-a460-4eb8-fa6c-335a5bbc10e5" + }, + "cell_type": "code", + "source": [ + "predictions = getPrediction(pred_sentences)" + ], + "execution_count": 72, + "outputs": [ + { + "output_type": "stream", + "text": [ + "INFO:tensorflow:Writing example 0 of 4\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: \n", + "INFO:tensorflow:tokens: [CLS] that movie was absolutely awful [SEP]\n", + "INFO:tensorflow:input_ids: 101 2008 3185 2001 7078 9643 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: \n", + "INFO:tensorflow:tokens: [CLS] the acting was a bit lacking [SEP]\n", + "INFO:tensorflow:input_ids: 101 1996 3772 2001 1037 2978 11158 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: \n", + "INFO:tensorflow:tokens: [CLS] the film was creative and surprising [SEP]\n", + "INFO:tensorflow:input_ids: 101 1996 2143 2001 5541 1998 11341 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:*** Example ***\n", + "INFO:tensorflow:guid: \n", + "INFO:tensorflow:tokens: [CLS] absolutely fantastic ! [SEP]\n", + "INFO:tensorflow:input_ids: 101 7078 10392 999 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:input_mask: 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:segment_ids: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "INFO:tensorflow:label: 0 (id = 0)\n", + "INFO:tensorflow:Calling model_fn.\n", + "INFO:tensorflow:Saver not created because there are no variables in the graph to restore\n", + "INFO:tensorflow:Done calling model_fn.\n", + "INFO:tensorflow:Graph was finalized.\n", + "INFO:tensorflow:Restoring parameters from gs://bert-tfhub/aclImdb_v1/model.ckpt-468\n", + "INFO:tensorflow:Running local_init_op.\n", + "INFO:tensorflow:Done running local_init_op.\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "MXkRiEBUqN3n", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "Voila! We have a sentiment classifier!" + ] + }, + { + "metadata": { + "id": "ERkTE8-7oQLZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "outputId": "26c33224-dc2c-4b3d-f7b4-ac3ef0a58b27" + }, + "cell_type": "code", + "source": [ + "predictions" + ], + "execution_count": 73, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[('That movie was absolutely awful',\n", + " array([-4.9142293e-03, -5.3180690e+00], dtype=float32),\n", + " 'Negative'),\n", + " ('The acting was a bit lacking',\n", + " array([-0.03325794, -3.4200459 ], dtype=float32),\n", + " 'Negative'),\n", + " ('The film was creative and surprising',\n", + " array([-5.3589125e+00, -4.7171740e-03], dtype=float32),\n", + " 'Positive'),\n", + " ('Absolutely fantastic!',\n", + " array([-5.0434084 , -0.00647258], dtype=float32),\n", + " 'Positive')]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 73 + } + ] + } + ] +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/results/models/.gitkeep b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/results/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/results/perf_client/.gitkeep b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/results/perf_client/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run.sub b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run.sub new file mode 100644 index 0000000..b743fda --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run.sub @@ -0,0 +1,73 @@ +#!/bin/bash +#SBATCH --exclusive +#SBATCH --mem=0 +#SBATCH --overcommit + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eux + +readonly docker_image="nvcr.io/nvidia/tensorflow:19.08-py3" +readonly datadir="/raid/data/bert" +readonly checkpointdir="$PWD/checkpoints" + +readonly mounts=".:/workspace/bert,${datadir}:/workspace/bert/data,${checkpointdir}:/results" + + +srun --ntasks="${SLURM_JOB_NUM_NODES}" --ntasks-per-node=1 mkdir -p "${checkpointdir}/phase_1" +srun --ntasks="${SLURM_JOB_NUM_NODES}" --ntasks-per-node=1 mkdir -p "${checkpointdir}/phase_2" + +PHASE1="\ + --train_batch_size=${BATCHSIZE:-16} \ + --learning_rate=${LEARNING_RATE:-1.875e-4} \ + --num_accumulation_steps=${NUM_ACCUMULATION_STEPS:-128} \ + --input_files_dir=/workspace/bert/data/tfrecord/lower_case_1_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/training \ + --eval_files_dir=/workspace/bert/data/tfrecord/lower_case_1_seq_len_128_max_pred_20_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/test \ + --max_seq_length=128 \ + --max_predictions_per_seq=20 \ + --num_train_steps=7038 \ + --num_warmup_steps=2000 \ + --output_dir=/results/phase_1 \ + " + +PHASE2="\ + --train_batch_size=${BATCHSIZE:-2} \ + --learning_rate=${LEARNING_RATE:-1.25e-4} \ + --num_accumulation_steps=${NUM_ACCUMULATION_STEPS:-512} \ + --input_files_dir=/workspace/bert/data/tfrecord/lower_case_1_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/training \ + --eval_files_dir=/workspace/bert/data/tfrecord/lower_case_1_seq_len_512_max_pred_80_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/test \ + --max_seq_length=512 \ + --max_predictions_per_seq=80 \ + --num_train_steps=1564 \ + --num_warmup_steps=200 \ + --output_dir=/results/phase_2 \ + --init_checkpoint=/results/phase_1/model.ckpt-7038 \ + " + +PHASES=( "$PHASE1" "$PHASE2" ) + +PHASE=${PHASE:-1} + +BERT_CMD="\ + python /workspace/bert/run_pretraining.py \ + ${PHASES[$((PHASE-1))]} \ + --bert_config_file=/workspace/bert/data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json \ + --do_train=True \ + --do_eval=True \ + --save_checkpoints_steps=100 \ + --horovod --use_fp16 --use_xla \ + --allreduce_post_accumulation=True \ + --eval_batch_size=8" + +srun --mpi=pmi2 -l --container-image="${docker_image}" --container-mounts="${mounts}" bash -c "${BERT_CMD}" diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier.py new file mode 100644 index 0000000..a14072e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier.py @@ -0,0 +1,706 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""BERT finetuning runner.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import csv +import os +import modeling +import optimization +import tokenization +import tensorflow as tf +import horovod.tensorflow as hvd +import time +from utils.utils import LogEvalRunHook, LogTrainRunHook +from utils.create_glue_data import * +import numpy as np + +flags = tf.flags + +FLAGS = flags.FLAGS + +## Required parameters +flags.DEFINE_string( + "data_dir", None, + "The input data dir. Should contain the .tsv files (or other data files) " + "for the task.") + +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_string("task_name", None, "The name of the task to train.") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_string( + "output_dir", None, + "The output directory where the model checkpoints will be written.") + +## Other parameters + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_bool("do_train", False, "Whether to run training.") + +flags.DEFINE_bool("do_eval", False, "Whether to run eval on the dev set.") + +flags.DEFINE_bool( + "do_predict", False, + "Whether to run the model in inference mode on the test set.") + +flags.DEFINE_integer("train_batch_size", 32, "Total batch size for training.") + +flags.DEFINE_integer("eval_batch_size", 8, "Total batch size for eval.") + +flags.DEFINE_integer("predict_batch_size", 8, "Total batch size for predict.") + +flags.DEFINE_float("learning_rate", 5e-5, "The initial learning rate for Adam.") + +flags.DEFINE_bool("use_trt", False, "Whether to use TF-TRT") + +flags.DEFINE_float("num_train_epochs", 3.0, + "Total number of training epochs to perform.") + +flags.DEFINE_float( + "warmup_proportion", 0.1, + "Proportion of training to perform linear learning rate warmup for. " + "E.g., 0.1 = 10% of training.") + +flags.DEFINE_integer("save_checkpoints_steps", 1000, + "How often to save the model checkpoint.") + +flags.DEFINE_integer("iterations_per_loop", 1000, + "How many steps to make in each estimator call.") +flags.DEFINE_integer("num_accumulation_steps", 1, + "Number of accumulation steps before gradient update" + "Global batch size = num_accumulation_steps * train_batch_size") +flags.DEFINE_bool("use_fp16", False, "Whether to use fp32 or fp16 arithmetic on GPU.") + +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") + +flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the warnings related to data processing will be printed. " + "A number of warnings are expected for a normal SQuAD evaluation.") + + +def file_based_input_fn_builder(input_file, batch_size, seq_length, is_training, + drop_remainder, hvd=None): + """Creates an `input_fn` closure to be passed to Estimator.""" + + name_to_features = { + "input_ids": tf.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.FixedLenFeature([seq_length], tf.int64), + "segment_ids": tf.FixedLenFeature([seq_length], tf.int64), + "label_ids": tf.FixedLenFeature([], tf.int64), + } + + def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + + return example + + def input_fn(): + """The actual input function.""" + + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + d = tf.data.TFRecordDataset(input_file) + if is_training: + if hvd is not None: d = d.shard(hvd.size(), hvd.rank()) + d = d.repeat() + d = d.shuffle(buffer_size=100) + + d = d.apply( + tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + drop_remainder=drop_remainder)) + + return d + + return input_fn + + +def create_model(bert_config, is_training, input_ids, input_mask, segment_ids, + labels, num_labels, use_one_hot_embeddings): + """Creates a classification model.""" + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings, + compute_type=tf.float16 if FLAGS.use_fp16 else tf.float32) + + # In the demo, we are doing a simple classification task on the entire + # segment. + # + # If you want to use the token-level output, use model.get_sequence_output() + # instead. + output_layer = model.get_pooled_output() + + hidden_size = output_layer.shape[-1].value + + output_weights = tf.get_variable( + "output_weights", [num_labels, hidden_size], + initializer=tf.truncated_normal_initializer(stddev=0.02)) + + output_bias = tf.get_variable( + "output_bias", [num_labels], initializer=tf.zeros_initializer()) + + with tf.variable_scope("loss"): + if is_training: + # I.e., 0.1 dropout + output_layer = tf.nn.dropout(output_layer, keep_prob=0.9) + + logits = tf.matmul(output_layer, output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias, name='cls_logits') + probabilities = tf.nn.softmax(logits, axis=-1, name='cls_probabilities') + log_probs = tf.nn.log_softmax(logits, axis=-1) + + one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32) + + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1, name='cls_per_example_loss') + loss = tf.reduce_mean(per_example_loss, name='cls_loss') + + return (loss, per_example_loss, logits, probabilities) + +def get_frozen_tftrt_model(bert_config, shape, num_labels, use_one_hot_embeddings, init_checkpoint): + tf_config = tf.ConfigProto() + output_node_names = ['loss/cls_loss', 'loss/cls_per_example_loss', 'loss/cls_logits', 'loss/cls_probabilities'] + + with tf.Session(config=tf_config) as tf_sess: + input_ids = tf.placeholder(tf.int32, shape, 'input_ids') + input_mask = tf.placeholder(tf.int32, shape, 'input_mask') + segment_ids = tf.placeholder(tf.int32, shape, 'segment_ids') + label_ids = tf.placeholder(tf.int32, (None), 'label_ids') + + create_model(bert_config, False, input_ids, input_mask, segment_ids, label_ids, + num_labels, use_one_hot_embeddings) + + tvars = tf.trainable_variables() + (assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + tf_sess.run(tf.global_variables_initializer()) + print("LOADED!") + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + else: + init_string = ", *NOTTTTTTTTTTTTTTTTTTTTT" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, init_string) + + frozen_graph = tf.graph_util.convert_variables_to_constants(tf_sess, + tf_sess.graph.as_graph_def(), output_node_names) + + num_nodes = len(frozen_graph.node) + print('Converting graph using TensorFlow-TensorRT...') + from tensorflow.python.compiler.tensorrt import trt_convert as trt + converter = trt.TrtGraphConverter( + input_graph_def=frozen_graph, + nodes_blacklist=output_node_names, + max_workspace_size_bytes=(4096 << 20) - 1000, + precision_mode = "FP16" if FLAGS.use_fp16 else "FP32", + minimum_segment_size=4, + is_dynamic_op=True, + maximum_cached_engines=1000 + ) + frozen_graph = converter.convert() + + print('Total node count before and after TF-TRT conversion:', + num_nodes, '->', len(frozen_graph.node)) + print('TRT node count:', + len([1 for n in frozen_graph.node if str(n.op) == 'TRTEngineOp'])) + + with tf.gfile.GFile("frozen_modelTRT.pb", "wb") as f: + f.write(frozen_graph.SerializeToString()) + + return frozen_graph + + + +def model_fn_builder(task_name, bert_config, num_labels, init_checkpoint, learning_rate, + num_train_steps, num_warmup_steps, + use_one_hot_embeddings, hvd=None): + """Returns `model_fn` closure for Estimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for Estimator.""" + + def metric_fn(per_example_loss, label_ids, logits): + predictions = tf.argmax(logits, axis=-1, output_type=tf.int32) + if task_name == "cola": + FN, FN_op = tf.metrics.false_negatives(labels=label_ids, predictions=predictions) + FP, FP_op = tf.metrics.false_positives(labels=label_ids, predictions=predictions) + TP, TP_op = tf.metrics.true_positives(labels=label_ids, predictions=predictions) + TN, TN_op = tf.metrics.true_negatives(labels=label_ids, predictions=predictions) + + MCC = (TP * TN - FP * FN) / ((TP + FP) * (TP + FN) * (TN + FP) * (TN + FN)) ** 0.5 + MCC_op = tf.group(FN_op, TN_op, TP_op, FP_op, tf.identity(MCC, name="MCC")) + return {"MCC": (MCC, MCC_op)} + else: + accuracy = tf.metrics.accuracy( + labels=label_ids, predictions=predictions) + loss = tf.metrics.mean(values=per_example_loss) + return { + "eval_accuracy": accuracy, + "eval_loss": loss, + } + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + label_ids = features["label_ids"] + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + if not is_training and FLAGS.use_trt: + trt_graph = get_frozen_tftrt_model(bert_config, input_ids.shape, num_labels, use_one_hot_embeddings, init_checkpoint) + (total_loss, per_example_loss, logits, probabilities) = tf.import_graph_def(trt_graph, + input_map={'input_ids':input_ids, 'input_mask':input_mask, 'segment_ids':segment_ids, 'label_ids':label_ids}, + return_elements=['loss/cls_loss:0', 'loss/cls_per_example_loss:0', 'loss/cls_logits:0', 'loss/cls_probabilities:0'], + name='') + if mode == tf.estimator.ModeKeys.PREDICT: + predictions = {"probabilities": probabilities} + output_spec = tf.estimator.EstimatorSpec( + mode=mode, predictions=predictions) + elif mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = metric_fn(per_example_loss, label_ids, logits) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + return output_spec + (total_loss, per_example_loss, logits, probabilities) = create_model( + bert_config, is_training, input_ids, input_mask, segment_ids, label_ids, + num_labels, use_one_hot_embeddings) + + tvars = tf.trainable_variables() + initialized_variable_names = {} + if init_checkpoint and (hvd is None or hvd.rank() == 0): + (assignment_map, initialized_variable_names + ) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + if FLAGS.verbose_logging: + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, + init_string) + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, + hvd, False, FLAGS.use_fp16, FLAGS.num_accumulation_steps) + + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + eval_metric_ops = metric_fn(per_example_loss, label_ids, logits) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + else: + output_spec = tf.estimator.EstimatorSpec( + mode=mode, predictions=probabilities) + return output_spec + + return model_fn + + +# This function is not used by this file but is still used by the Colab and +# people who depend on it. +def input_fn_builder(features, batch_size, seq_length, is_training, drop_remainder, hvd=None): + """Creates an `input_fn` closure to be passed to Estimator.""" + + all_input_ids = [] + all_input_mask = [] + all_segment_ids = [] + all_label_ids = [] + + for feature in features: + all_input_ids.append(feature.input_ids) + all_input_mask.append(feature.input_mask) + all_segment_ids.append(feature.segment_ids) + all_label_ids.append(feature.label_id) + + def input_fn(): + """The actual input function.""" + + num_examples = len(features) + + # This is for demo purposes and does NOT scale to large data sets. We do + # not use Dataset.from_generator() because that uses tf.py_func which is + # not TPU compatible. The right way to load data is with TFRecordReader. + d = tf.data.Dataset.from_tensor_slices({ + "input_ids": + tf.constant( + all_input_ids, shape=[num_examples, seq_length], + dtype=tf.int32), + "input_mask": + tf.constant( + all_input_mask, + shape=[num_examples, seq_length], + dtype=tf.int32), + "segment_ids": + tf.constant( + all_segment_ids, + shape=[num_examples, seq_length], + dtype=tf.int32), + "label_ids": + tf.constant(all_label_ids, shape=[num_examples], dtype=tf.int32), + }) + + if is_training: + if hvd is not None: d = d.shard(hvd.size(), hvd.rank()) + d = d.repeat() + d = d.shuffle(buffer_size=100) + + d = d.batch(batch_size=batch_size, drop_remainder=drop_remainder) + return d + + return input_fn + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + if FLAGS.horovod: + hvd.init() + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + processors = { + "cola": ColaProcessor, + "mnli": MnliProcessor, + "mrpc": MrpcProcessor, + "xnli": XnliProcessor, + } + + if not FLAGS.do_train and not FLAGS.do_eval and not FLAGS.do_predict: + raise ValueError( + "At least one of `do_train`, `do_eval` or `do_predict' must be True.") + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + if FLAGS.max_seq_length > bert_config.max_position_embeddings: + raise ValueError( + "Cannot use sequence length %d because the BERT model " + "was only trained up to sequence length %d" % + (FLAGS.max_seq_length, bert_config.max_position_embeddings)) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + task_name = FLAGS.task_name.lower() + + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + processor = processors[task_name]() + + label_list = processor.get_labels() + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + master_process = True + training_hooks = [] + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps + hvd_rank = 0 + + config = tf.ConfigProto() + if FLAGS.horovod: + + tf.logging.info("Multi-GPU training with TF Horovod") + tf.logging.info("hvd.size() = %d hvd.rank() = %d", hvd.size(), hvd.rank()) + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps * hvd.size() + master_process = (hvd.rank() == 0) + hvd_rank = hvd.rank() + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + + run_config = tf.estimator.RunConfig( + model_dir=FLAGS.output_dir if master_process else None, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if master_process else None, + keep_checkpoint_max=1) + + if master_process: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + + train_examples = None + num_train_steps = None + num_warmup_steps = None + training_hooks.append(LogTrainRunHook(global_batch_size, hvd_rank)) + + if FLAGS.do_train: + train_examples = processor.get_train_examples(FLAGS.data_dir) + num_train_steps = int( + len(train_examples) / global_batch_size * FLAGS.num_train_epochs) + num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion) + + start_index = 0 + end_index = len(train_examples) + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record")] + + if FLAGS.horovod: + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record{}".format(i)) for i in range(hvd.size())] + num_examples_per_rank = len(train_examples) // hvd.size() + remainder = len(train_examples) % hvd.size() + if hvd.rank() < remainder: + start_index = hvd.rank() * (num_examples_per_rank+1) + end_index = start_index + num_examples_per_rank + 1 + else: + start_index = hvd.rank() * num_examples_per_rank + remainder + end_index = start_index + (num_examples_per_rank) + + model_fn = model_fn_builder( + task_name=task_name, + bert_config=bert_config, + num_labels=len(label_list), + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=FLAGS.learning_rate if not FLAGS.horovod else FLAGS.learning_rate * hvd.size(), + num_train_steps=num_train_steps, + num_warmup_steps=num_warmup_steps, + use_one_hot_embeddings=False, + hvd=None if not FLAGS.horovod else hvd) + + estimator = tf.estimator.Estimator( + model_fn=model_fn, + config=run_config) + + if FLAGS.do_train: + + file_based_convert_examples_to_features( + train_examples[start_index:end_index], label_list, FLAGS.max_seq_length, tokenizer, tmp_filenames[hvd_rank]) + + tf.logging.info("***** Running training *****") + tf.logging.info(" Num examples = %d", len(train_examples)) + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + tf.logging.info(" Num steps = %d", num_train_steps) + train_input_fn = file_based_input_fn_builder( + input_file=tmp_filenames, + batch_size=FLAGS.train_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=True, + drop_remainder=True, + hvd=None if not FLAGS.horovod else hvd) + + train_start_time = time.time() + estimator.train(input_fn=train_input_fn, max_steps=num_train_steps, hooks=training_hooks) + train_time_elapsed = time.time() - train_start_time + train_time_wo_overhead = training_hooks[-1].total_time + avg_sentences_per_second = num_train_steps * global_batch_size * 1.0 / train_time_elapsed + ss_sentences_per_second = (num_train_steps - training_hooks[-1].skipped) * global_batch_size * 1.0 / train_time_wo_overhead + + if master_process: + tf.logging.info("-----------------------------") + tf.logging.info("Total Training Time = %0.2f for Sentences = %d", train_time_elapsed, + num_train_steps * global_batch_size) + tf.logging.info("Total Training Time W/O Overhead = %0.2f for Sentences = %d", train_time_wo_overhead, + (num_train_steps - training_hooks[-1].skipped) * global_batch_size) + tf.logging.info("Throughput Average (sentences/sec) with overhead = %0.2f", avg_sentences_per_second) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + if FLAGS.do_eval and master_process: + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + eval_file = os.path.join(FLAGS.output_dir, "eval.tf_record") + file_based_convert_examples_to_features( + eval_examples, label_list, FLAGS.max_seq_length, tokenizer, eval_file) + + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Num examples = %d", len(eval_examples)) + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + + eval_drop_remainder = False + eval_input_fn = file_based_input_fn_builder( + input_file=eval_file, + batch_size=FLAGS.eval_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=eval_drop_remainder) + + eval_hooks = [LogEvalRunHook(FLAGS.eval_batch_size)] + eval_start_time = time.time() + result = estimator.evaluate(input_fn=eval_input_fn, hooks=eval_hooks) + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + time_list = eval_hooks[-1].time_list + time_list.sort() + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size + + avg = np.mean(time_list) + cf_50 = max(time_list[:int(len(time_list) * 0.50)]) + cf_90 = max(time_list[:int(len(time_list) * 0.90)]) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.eval_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size) + tf.logging.info("Summary Inference Statistics on EVAL set") + tf.logging.info("Batch size = %d", FLAGS.eval_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Latency Confidence Level 50 (ms) = %0.2f", cf_50 * 1000) + tf.logging.info("Latency Confidence Level 90 (ms) = %0.2f", cf_90 * 1000) + tf.logging.info("Latency Confidence Level 95 (ms) = %0.2f", cf_95 * 1000) + tf.logging.info("Latency Confidence Level 99 (ms) = %0.2f", cf_99 * 1000) + tf.logging.info("Latency Confidence Level 100 (ms) = %0.2f", cf_100 * 1000) + tf.logging.info("Latency Average (ms) = %0.2f", avg * 1000) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.GFile(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + + if FLAGS.do_predict and master_process: + predict_examples = processor.get_test_examples(FLAGS.data_dir) + predict_file = os.path.join(FLAGS.output_dir, "predict.tf_record") + file_based_convert_examples_to_features(predict_examples, label_list, + FLAGS.max_seq_length, tokenizer, + predict_file) + + tf.logging.info("***** Running prediction*****") + tf.logging.info(" Num examples = %d", len(predict_examples)) + tf.logging.info(" Batch size = %d", FLAGS.predict_batch_size) + + predict_drop_remainder = False + predict_input_fn = file_based_input_fn_builder( + input_file=predict_file, + batch_size=FLAGS.predict_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=predict_drop_remainder) + + predict_hooks = [LogEvalRunHook(FLAGS.predict_batch_size)] + predict_start_time = time.time() + + output_predict_file = os.path.join(FLAGS.output_dir, "test_results.tsv") + with tf.gfile.GFile(output_predict_file, "w") as writer: + tf.logging.info("***** Predict results *****") + for prediction in estimator.predict(input_fn=predict_input_fn, hooks=predict_hooks, + yield_single_examples=False): + output_line = "\t".join( + str(class_probability) for class_probability in prediction) + "\n" + writer.write(output_line) + + + predict_time_elapsed = time.time() - predict_start_time + predict_time_wo_overhead = predict_hooks[-1].total_time + + time_list = predict_hooks[-1].time_list + time_list.sort() + num_sentences = (predict_hooks[-1].count - predict_hooks[-1].skipped) * FLAGS.predict_batch_size + + avg = np.mean(time_list) + cf_50 = max(time_list[:int(len(time_list) * 0.50)]) + cf_90 = max(time_list[:int(len(time_list) * 0.90)]) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + ss_sentences_per_second = num_sentences * 1.0 / predict_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", predict_time_elapsed, + predict_hooks[-1].count * FLAGS.predict_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", predict_time_wo_overhead, + (predict_hooks[-1].count - predict_hooks[-1].skipped) * FLAGS.predict_batch_size) + + tf.logging.info("Summary Inference Statistics on TEST SET") + tf.logging.info("Batch size = %d", FLAGS.predict_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Latency Confidence Level 50 (ms) = %0.2f", cf_50 * 1000) + tf.logging.info("Latency Confidence Level 90 (ms) = %0.2f", cf_90 * 1000) + tf.logging.info("Latency Confidence Level 95 (ms) = %0.2f", cf_95 * 1000) + tf.logging.info("Latency Confidence Level 99 (ms) = %0.2f", cf_99 * 1000) + tf.logging.info("Latency Confidence Level 100 (ms) = %0.2f", cf_100 * 1000) + tf.logging.info("Latency Average (ms) = %0.2f", avg * 1000) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + +if __name__ == "__main__": + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("task_name") + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + tf.app.run() \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier_with_tfhub.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier_with_tfhub.py new file mode 100644 index 0000000..9d2f80f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_classifier_with_tfhub.py @@ -0,0 +1,314 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""BERT finetuning runner with TF-Hub.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import optimization +import run_classifier +import tokenization +import tensorflow as tf +import tensorflow_hub as hub + +flags = tf.flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string( + "bert_hub_module_handle", None, + "Handle for the BERT TF-Hub module.") + + +def create_model(is_training, input_ids, input_mask, segment_ids, labels, + num_labels, bert_hub_module_handle): + """Creates a classification model.""" + tags = set() + if is_training: + tags.add("train") + bert_module = hub.Module(bert_hub_module_handle, tags=tags, trainable=True) + bert_inputs = dict( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids) + bert_outputs = bert_module( + inputs=bert_inputs, + signature="tokens", + as_dict=True) + + # In the demo, we are doing a simple classification task on the entire + # segment. + # + # If you want to use the token-level output, use + # bert_outputs["sequence_output"] instead. + output_layer = bert_outputs["pooled_output"] + + hidden_size = output_layer.shape[-1].value + + output_weights = tf.get_variable( + "output_weights", [num_labels, hidden_size], + initializer=tf.truncated_normal_initializer(stddev=0.02)) + + output_bias = tf.get_variable( + "output_bias", [num_labels], initializer=tf.zeros_initializer()) + + with tf.variable_scope("loss"): + if is_training: + # I.e., 0.1 dropout + output_layer = tf.nn.dropout(output_layer, keep_prob=0.9) + + logits = tf.matmul(output_layer, output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + probabilities = tf.nn.softmax(logits, axis=-1) + log_probs = tf.nn.log_softmax(logits, axis=-1) + + one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32) + + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1) + loss = tf.reduce_mean(per_example_loss) + + return (loss, per_example_loss, logits, probabilities) + + +def model_fn_builder(num_labels, learning_rate, num_train_steps, + num_warmup_steps, use_tpu, bert_hub_module_handle): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + label_ids = features["label_ids"] + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + (total_loss, per_example_loss, logits, probabilities) = create_model( + is_training, input_ids, input_mask, segment_ids, label_ids, num_labels, + bert_hub_module_handle) + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, use_tpu) + + output_spec = tf.contrib.tpu.TPUEstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + + def metric_fn(per_example_loss, label_ids, logits): + predictions = tf.argmax(logits, axis=-1, output_type=tf.int32) + accuracy = tf.metrics.accuracy(label_ids, predictions) + loss = tf.metrics.mean(per_example_loss) + return { + "eval_accuracy": accuracy, + "eval_loss": loss, + } + + eval_metrics = (metric_fn, [per_example_loss, label_ids, logits]) + output_spec = tf.contrib.tpu.TPUEstimatorSpec( + mode=mode, + loss=total_loss, + eval_metrics=eval_metrics) + elif mode == tf.estimator.ModeKeys.PREDICT: + output_spec = tf.contrib.tpu.TPUEstimatorSpec( + mode=mode, predictions={"probabilities": probabilities}) + else: + raise ValueError( + "Only TRAIN, EVAL and PREDICT modes are supported: %s" % (mode)) + + return output_spec + + return model_fn + + +def create_tokenizer_from_hub_module(bert_hub_module_handle): + """Get the vocab file and casing info from the Hub module.""" + with tf.Graph().as_default(): + bert_module = hub.Module(bert_hub_module_handle) + tokenization_info = bert_module(signature="tokenization_info", as_dict=True) + with tf.Session() as sess: + vocab_file, do_lower_case = sess.run([tokenization_info["vocab_file"], + tokenization_info["do_lower_case"]]) + return tokenization.FullTokenizer( + vocab_file=vocab_file, do_lower_case=do_lower_case) + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + processors = { + "cola": run_classifier.ColaProcessor, + "mnli": run_classifier.MnliProcessor, + "mrpc": run_classifier.MrpcProcessor, + } + + if not FLAGS.do_train and not FLAGS.do_eval: + raise ValueError("At least one of `do_train` or `do_eval` must be True.") + + tf.gfile.MakeDirs(FLAGS.output_dir) + + task_name = FLAGS.task_name.lower() + + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + processor = processors[task_name]() + + label_list = processor.get_labels() + + tokenizer = create_tokenizer_from_hub_module(FLAGS.bert_hub_module_handle) + + tpu_cluster_resolver = None + if FLAGS.use_tpu and FLAGS.tpu_name: + tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver( + FLAGS.tpu_name, zone=FLAGS.tpu_zone, project=FLAGS.gcp_project) + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + run_config = tf.contrib.tpu.RunConfig( + cluster=tpu_cluster_resolver, + master=FLAGS.master, + model_dir=FLAGS.output_dir, + save_checkpoints_steps=FLAGS.save_checkpoints_steps, + tpu_config=tf.contrib.tpu.TPUConfig( + iterations_per_loop=FLAGS.iterations_per_loop, + num_shards=FLAGS.num_tpu_cores, + per_host_input_for_training=is_per_host)) + + train_examples = None + num_train_steps = None + num_warmup_steps = None + if FLAGS.do_train: + train_examples = processor.get_train_examples(FLAGS.data_dir) + num_train_steps = int( + len(train_examples) / FLAGS.train_batch_size * FLAGS.num_train_epochs) + num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion) + + model_fn = model_fn_builder( + num_labels=len(label_list), + learning_rate=FLAGS.learning_rate, + num_train_steps=num_train_steps, + num_warmup_steps=num_warmup_steps, + use_tpu=FLAGS.use_tpu, + bert_hub_module_handle=FLAGS.bert_hub_module_handle) + + # If TPU is not available, this will fall back to normal Estimator on CPU + # or GPU. + estimator = tf.contrib.tpu.TPUEstimator( + use_tpu=FLAGS.use_tpu, + model_fn=model_fn, + config=run_config, + train_batch_size=FLAGS.train_batch_size, + eval_batch_size=FLAGS.eval_batch_size, + predict_batch_size=FLAGS.predict_batch_size) + + if FLAGS.do_train: + train_features = run_classifier.convert_examples_to_features( + train_examples, label_list, FLAGS.max_seq_length, tokenizer) + tf.logging.info("***** Running training *****") + tf.logging.info(" Num examples = %d", len(train_examples)) + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + tf.logging.info(" Num steps = %d", num_train_steps) + train_input_fn = run_classifier.input_fn_builder( + features=train_features, + seq_length=FLAGS.max_seq_length, + is_training=True, + drop_remainder=True) + estimator.train(input_fn=train_input_fn, max_steps=num_train_steps) + + if FLAGS.do_eval: + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + eval_features = run_classifier.convert_examples_to_features( + eval_examples, label_list, FLAGS.max_seq_length, tokenizer) + + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Num examples = %d", len(eval_examples)) + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + + # This tells the estimator to run through the entire set. + eval_steps = None + # However, if running eval on the TPU, you will need to specify the + # number of steps. + if FLAGS.use_tpu: + # Eval will be slightly WRONG on the TPU because it will truncate + # the last batch. + eval_steps = int(len(eval_examples) / FLAGS.eval_batch_size) + + eval_drop_remainder = True if FLAGS.use_tpu else False + eval_input_fn = run_classifier.input_fn_builder( + features=eval_features, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=eval_drop_remainder) + + result = estimator.evaluate(input_fn=eval_input_fn, steps=eval_steps) + + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.GFile(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + + if FLAGS.do_predict: + predict_examples = processor.get_test_examples(FLAGS.data_dir) + if FLAGS.use_tpu: + # Discard batch remainder if running on TPU + n = len(predict_examples) + predict_examples = predict_examples[:(n - n % FLAGS.predict_batch_size)] + + predict_file = os.path.join(FLAGS.output_dir, "predict.tf_record") + run_classifier.file_based_convert_examples_to_features( + predict_examples, label_list, FLAGS.max_seq_length, tokenizer, + predict_file) + + tf.logging.info("***** Running prediction*****") + tf.logging.info(" Num examples = %d", len(predict_examples)) + tf.logging.info(" Batch size = %d", FLAGS.predict_batch_size) + + predict_input_fn = run_classifier.file_based_input_fn_builder( + input_file=predict_file, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=FLAGS.use_tpu) + + result = estimator.predict(input_fn=predict_input_fn) + + output_predict_file = os.path.join(FLAGS.output_dir, "test_results.tsv") + with tf.gfile.GFile(output_predict_file, "w") as writer: + tf.logging.info("***** Predict results *****") + for prediction in result: + probabilities = prediction["probabilities"] + output_line = "\t".join( + str(class_probability) + for class_probability in probabilities) + "\n" + writer.write(output_line) + + +if __name__ == "__main__": + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("task_name") + flags.mark_flag_as_required("bert_hub_module_handle") + flags.mark_flag_as_required("output_dir") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_ner.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_ner.py new file mode 100644 index 0000000..ec0548e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_ner.py @@ -0,0 +1,871 @@ +#! usr/bin/env python3 +# -*- coding:utf-8 -*- +""" +Copyright 2018 The Google AI Language Team Authors. +BASED ON Google_BERT. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import os, sys +import pickle + +import tensorflow as tf +import numpy as np + +sys.path.append("/workspace/bert") + +from biobert.conlleval import evaluate, report_notprint +import modeling +import optimization +import tokenization +import tf_metrics + +import time +import horovod.tensorflow as hvd +from utils.utils import LogEvalRunHook, LogTrainRunHook + +flags = tf.flags + +FLAGS = flags.FLAGS + +flags.DEFINE_string( + "task_name", "NER", "The name of the task to train." +) + +flags.DEFINE_string( + "data_dir", None, + "The input datadir.", +) + +flags.DEFINE_string( + "output_dir", None, + "The output directory where the model checkpoints will be written." +) + +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model." +) + +flags.DEFINE_string( + "vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model)." +) + +flags.DEFINE_bool( + "do_lower_case", False, + "Whether to lower case the input text." +) + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization." +) + +flags.DEFINE_bool( + "do_train", False, + "Whether to run training." +) + +flags.DEFINE_bool( + "do_eval", False, + "Whether to run eval on the dev set.") + +flags.DEFINE_bool( + "do_predict", False, + "Whether to run the model in inference mode on the test set.") + +flags.DEFINE_integer( + "train_batch_size", 64, + "Total batch size for training.") + +flags.DEFINE_integer( + "eval_batch_size", 16, + "Total batch size for eval.") + +flags.DEFINE_integer( + "predict_batch_size", 16, + "Total batch size for predict.") + +flags.DEFINE_float( + "learning_rate", 5e-6, + "The initial learning rate for Adam.") + +flags.DEFINE_float( + "num_train_epochs", 10.0, + "Total number of training epochs to perform.") + +flags.DEFINE_float( + "warmup_proportion", 0.1, + "Proportion of training to perform linear learning rate warmup for. " + "E.g., 0.1 = 10% of training.") + +flags.DEFINE_integer( + "save_checkpoints_steps", 1000, + "How often to save the model checkpoint.") + +flags.DEFINE_integer( + "iterations_per_loop", 1000, + "How many steps to make in each estimator call.") + +tf.flags.DEFINE_string("master", None, "[Optional] TensorFlow master URL.") + +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") +flags.DEFINE_bool("use_fp16", False, "Whether to use fp32 or fp16 arithmetic on GPU.") +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") + +class InputExample(object): + """A single training/test example for simple sequence classification.""" + + def __init__(self, guid, text, label=None): + """Constructs a InputExample. + + Args: + guid: Unique id for the example. + text_a: string. The untokenized text of the first sequence. For single + sequence tasks, only this sequence must be specified. + label: (Optional) string. The label of the example. This should be + specified for train and dev examples, but not for test examples. + """ + self.guid = guid + self.text = text + self.label = label + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, input_ids, input_mask, segment_ids, label_ids, ): + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.label_ids = label_ids + # self.label_mask = label_mask + + +class DataProcessor(object): + """Base class for data converters for sequence classification data sets.""" + + def get_train_examples(self, data_dir): + """Gets a collection of `InputExample`s for the train set.""" + raise NotImplementedError() + + def get_dev_examples(self, data_dir): + """Gets a collection of `InputExample`s for the dev set.""" + raise NotImplementedError() + + def get_labels(self): + """Gets the list of labels for this data set.""" + raise NotImplementedError() + + @classmethod + def _read_data(cls, input_file): + """Reads a BIO data.""" + with tf.gfile.Open(input_file, "r") as f: + lines = [] + words = [] + labels = [] + for line in f: + contends = line.strip() + if len(contends) == 0: + assert len(words) == len(labels) + if len(words) > 30: + # split if the sentence is longer than 30 + while len(words) > 30: + tmplabel = labels[:30] + for iidx in range(len(tmplabel)): + if tmplabel.pop() == 'O': + break + l = ' '.join( + [label for label in labels[:len(tmplabel) + 1] if len(label) > 0]) + w = ' '.join( + [word for word in words[:len(tmplabel) + 1] if len(word) > 0]) + lines.append([l, w]) + words = words[len(tmplabel) + 1:] + labels = labels[len(tmplabel) + 1:] + + if len(words) == 0: + continue + l = ' '.join([label for label in labels if len(label) > 0]) + w = ' '.join([word for word in words if len(word) > 0]) + lines.append([l, w]) + words = [] + labels = [] + continue + + word = line.strip().split()[0] + label = line.strip().split()[-1] + words.append(word) + labels.append(label) + return lines + + +class BC5CDRProcessor(DataProcessor): + def get_train_examples(self, data_dir): + l1 = self._read_data(os.path.join(data_dir, "train.tsv")) + l2 = self._read_data(os.path.join(data_dir, "devel.tsv")) + return self._create_example(l1 + l2, "train") + + def get_dev_examples(self, data_dir, file_name="devel.tsv"): + return self._create_example( + self._read_data(os.path.join(data_dir, file_name)), "dev" + ) + + def get_test_examples(self, data_dir, file_name="test.tsv"): + return self._create_example( + self._read_data(os.path.join(data_dir, file_name)), "test") + + def get_labels(self): + return ["B", "I", "O", "X", "[CLS]", "[SEP]"] + + def _create_example(self, lines, set_type): + examples = [] + for (i, line) in enumerate(lines): + guid = "%s-%s" % (set_type, i) + text = tokenization.convert_to_unicode(line[1]) + label = tokenization.convert_to_unicode(line[0]) + examples.append(InputExample(guid=guid, text=text, label=label)) + return examples + + +class CLEFEProcessor(DataProcessor): + def get_train_examples(self, data_dir): + lines1 = self._read_data2(os.path.join(data_dir, "Training.tsv")) + lines2 = self._read_data2(os.path.join(data_dir, "Development.tsv")) + return self._create_example( + lines1 + lines2, "train" + ) + + def get_dev_examples(self, data_dir, file_name="Development.tsv"): + return self._create_example( + self._read_data2(os.path.join(data_dir, file_name)), "dev" + ) + + def get_test_examples(self, data_dir, file_name="Test.tsv"): + return self._create_example( + self._read_data2(os.path.join(data_dir, file_name)), "test") + + def get_labels(self): + return ["B", "I", "O", "X", "[CLS]", "[SEP]"] + + def _create_example(self, lines, set_type): + examples = [] + for (i, line) in enumerate(lines): + guid = "%s-%s" % (set_type, i) + text = tokenization.convert_to_unicode(line[1]) + label = tokenization.convert_to_unicode(line[0]) + examples.append(InputExample(guid=guid, text=text, label=label)) + return examples + + @classmethod + def _read_data2(cls, input_file): + with tf.gfile.Open(input_file, "r") as f: + lines = [] + words = [] + labels = [] + for line in f: + contends = line.strip() + if len(contends) == 0: + assert len(words) == len(labels) + if len(words) == 0: + continue + l = ' '.join([label for label in labels if len(label) > 0]) + w = ' '.join([word for word in words if len(word) > 0]) + lines.append([l, w]) + words = [] + labels = [] + continue + elif contends.startswith('###'): + continue + + word = line.strip().split()[0] + label = line.strip().split()[-1] + words.append(word) + labels.append(label) + return lines + + +class I2b22012Processor(CLEFEProcessor): + def get_labels(self): + return ['B-CLINICAL_DEPT', 'B-EVIDENTIAL', 'B-OCCURRENCE', 'B-PROBLEM', 'B-TEST', 'B-TREATMENT', 'I-CLINICAL_DEPT', 'I-EVIDENTIAL', 'I-OCCURRENCE', 'I-PROBLEM', 'I-TEST', 'I-TREATMENT', "O", "X", "[CLS]", "[SEP]"] + + +def write_tokens(tokens, labels, mode): + if mode == "test": + path = os.path.join(FLAGS.output_dir, "token_" + mode + ".txt") + if tf.gfile.Exists(path): + wf = tf.gfile.Open(path, 'a') + else: + wf = tf.gfile.Open(path, 'w') + for token, label in zip(tokens, labels): + if token != "**NULL**": + wf.write(token + ' ' + str(label) + '\n') + wf.close() + + +def convert_single_example(ex_index, example, label_list, max_seq_length, tokenizer, mode): + label_map = {} + for (i, label) in enumerate(label_list, 1): + label_map[label] = i + label2id_file = os.path.join(FLAGS.output_dir, 'label2id.pkl') + if not tf.gfile.Exists(label2id_file): + with tf.gfile.Open(label2id_file, 'wb') as w: + pickle.dump(label_map, w) + textlist = example.text.split(' ') + labellist = example.label.split(' ') + tokens = [] + labels = [] + for i, word in enumerate(textlist): + token = tokenizer.tokenize(word) + tokens.extend(token) + label_1 = labellist[i] + for m in range(len(token)): + if m == 0: + labels.append(label_1) + else: + labels.append("X") + # tokens = tokenizer.tokenize(example.text) + if len(tokens) >= max_seq_length - 1: + tokens = tokens[0:(max_seq_length - 2)] + labels = labels[0:(max_seq_length - 2)] + ntokens = [] + segment_ids = [] + label_ids = [] + ntokens.append("[CLS]") + segment_ids.append(0) + # append("O") or append("[CLS]") not sure! + label_ids.append(label_map["[CLS]"]) + for i, token in enumerate(tokens): + ntokens.append(token) + segment_ids.append(0) + label_ids.append(label_map[labels[i]]) + ntokens.append("[SEP]") + segment_ids.append(0) + # append("O") or append("[SEP]") not sure! + label_ids.append(label_map["[SEP]"]) + input_ids = tokenizer.convert_tokens_to_ids(ntokens) + input_mask = [1] * len(input_ids) + # label_mask = [1] * len(input_ids) + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + # we don't concerned about it! + label_ids.append(0) + ntokens.append("**NULL**") + # label_mask.append(0) + # print(len(input_ids)) + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + assert len(label_ids) == max_seq_length + # assert len(label_mask) == max_seq_length + + if ex_index < 5: + tf.logging.info("*** Example ***") + tf.logging.info("guid: %s" % (example.guid)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info("segment_ids: %s" % " ".join([str(x) for x in segment_ids])) + tf.logging.info("label_ids: %s" % " ".join([str(x) for x in label_ids])) + # tf.logging.info("label_mask: %s" % " ".join([str(x) for x in label_mask])) + + feature = InputFeatures( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + label_ids=label_ids, + # label_mask = label_mask + ) + # write_tokens(ntokens, label_ids, mode) + return feature + + +def filed_based_convert_examples_to_features( + examples, label_list, max_seq_length, tokenizer, output_file, mode=None): + writer = tf.python_io.TFRecordWriter(output_file) + for (ex_index, example) in enumerate(examples): + if ex_index % 5000 == 0: + tf.logging.info("Writing example %d of %d" % (ex_index, len(examples))) + feature = convert_single_example(ex_index, example, label_list, max_seq_length, tokenizer, + mode) + + def create_int_feature(values): + f = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return f + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + features["label_ids"] = create_int_feature(feature.label_ids) + # features["label_mask"] = create_int_feature(feature.label_mask) + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writer.write(tf_example.SerializeToString()) + + +def file_based_input_fn_builder(input_file, batch_size, seq_length, is_training, drop_remainder, hvd=None): + name_to_features = { + "input_ids": tf.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.FixedLenFeature([seq_length], tf.int64), + "segment_ids": tf.FixedLenFeature([seq_length], tf.int64), + "label_ids": tf.FixedLenFeature([seq_length], tf.int64), + # "label_ids":tf.VarLenFeature(tf.int64), + # "label_mask": tf.FixedLenFeature([seq_length], tf.int64), + } + + def _decode_record(record, name_to_features): + example = tf.parse_single_example(record, name_to_features) + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + return example + + def input_fn(params): + #batch_size = params["batch_size"] + d = tf.data.TFRecordDataset(input_file) + if is_training: + if hvd is not None: d = d.shard(hvd.size(), hvd.rank()) + d = d.repeat() + d = d.shuffle(buffer_size=100) + + d = d.apply(tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + drop_remainder=drop_remainder + )) + return d + + return input_fn + + +def create_model(bert_config, is_training, input_ids, input_mask, + segment_ids, labels, num_labels, use_one_hot_embeddings): + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings + ) + + output_layer = model.get_sequence_output() + + hidden_size = output_layer.shape[-1].value + + output_weight = tf.get_variable( + "output_weights", [num_labels, hidden_size], + initializer=tf.truncated_normal_initializer(stddev=0.02) + ) + output_bias = tf.get_variable( + "output_bias", [num_labels], initializer=tf.zeros_initializer() + ) + with tf.variable_scope("loss"): + if is_training: + output_layer = tf.nn.dropout(output_layer, keep_prob=0.9) + output_layer = tf.reshape(output_layer, [-1, hidden_size]) + logits = tf.matmul(output_layer, output_weight, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + logits = tf.reshape(logits, [-1, FLAGS.max_seq_length, num_labels]) + # mask = tf.cast(input_mask,tf.float32) + # loss = tf.contrib.seq2seq.sequence_loss(logits,labels,mask) + # return (loss, logits, predict) + ########################################################################## + log_probs = tf.nn.log_softmax(logits, axis=-1) + one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32) + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1) + loss = tf.reduce_mean(per_example_loss) + probabilities = tf.nn.softmax(logits, axis=-1) + predict = tf.argmax(probabilities, axis=-1) + return (loss, per_example_loss, logits, predict) + ########################################################################## + + +def model_fn_builder(bert_config, num_labels, init_checkpoint=None, learning_rate=None, + num_train_steps=None, num_warmup_steps=None, + use_one_hot_embeddings=False, hvd=None, use_fp16=False): + def model_fn(features, labels, mode, params): + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + label_ids = features["label_ids"] + # label_mask = features["label_mask"] + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + (total_loss, per_example_loss, logits, predicts) = create_model( + bert_config, is_training, input_ids, input_mask, segment_ids, label_ids, + num_labels, use_one_hot_embeddings) + tvars = tf.trainable_variables() + initialized_variable_names = {} + scaffold_fn = None + if init_checkpoint and (hvd is None or hvd.rank() == 0): + (assignment_map, + initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, + init_checkpoint) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + tf.logging.info("**** Trainable Variables ****") + + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, + init_string) + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, hvd, False, use_fp16) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + + def metric_fn(per_example_loss, label_ids, logits): + # def metric_fn(label_ids, logits): + predictions = tf.argmax(logits, axis=-1, output_type=tf.int32) + precision = tf_metrics.precision(label_ids, predictions, num_labels, [1, 2], average="macro") + recall = tf_metrics.recall(label_ids, predictions, num_labels, [1, 2], average="macro") + f = tf_metrics.f1(label_ids, predictions, num_labels, [1, 2], average="macro") + # + return { + "eval_precision": precision, + "eval_recall": recall, + "eval_f": f, + # "eval_loss": loss, + } + + eval_metric_ops = metric_fn(per_example_loss, label_ids, logits) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + else: + output_spec = tf.estimator.EstimatorSpec( + mode=mode, predictions=predicts)#probabilities) + return output_spec + + return model_fn + + +def result_to_pair(predict_line, pred_ids, id2label, writer, err_writer): + + words = str(predict_line.text).split(' ') + labels = str(predict_line.label).split(' ') + if len(words) != len(labels): + tf.logging.error('Text and label not equal') + tf.logging.error(predict_line.text) + tf.logging.error(predict_line.label) + exit(1) + + # get from CLS to SEP + pred_labels = [] + for id in pred_ids: + if id == 0: + continue + curr_label = id2label[id] + if curr_label == '[CLS]': + continue + elif curr_label == '[SEP]': + break + elif curr_label == 'X': + continue + pred_labels.append(curr_label) + if len(pred_labels) > len(words): + err_writer.write(predict_line.guid + '\n') + err_writer.write(predict_line.text + '\n') + err_writer.write(predict_line.label + '\n') + err_writer.write(' '.join([str(i) for i in pred_ids]) + '\n') + err_writer.write(' '.join([id2label.get(i, '**NULL**') for i in pred_ids]) + '\n\n') + pred_labels = pred_labels[:len(words)] + elif len(pred_labels) < len(words): + err_writer.write(predict_line.guid + '\n') + err_writer.write(predict_line.text + '\n') + err_writer.write(predict_line.label + '\n') + err_writer.write(' '.join([str(i) for i in pred_ids]) + '\n') + err_writer.write(' '.join([id2label.get(i, '**NULL**') for i in pred_ids]) + '\n\n') + pred_labels += ['O'] * (len(words) - len(pred_labels)) + + for tok, label, pred_label in zip(words, labels, pred_labels): + writer.write(tok + ' ' + label + ' ' + pred_label + '\n') + writer.write('\n') + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + if FLAGS.horovod: + hvd.init() + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + + processors = { + "bc5cdr": BC5CDRProcessor, + "clefe": CLEFEProcessor, + 'i2b2': I2b22012Processor + } + if not FLAGS.do_train and not FLAGS.do_eval and not FLAGS.do_predict: + raise ValueError("At least one of `do_train` or `do_eval` must be True.") + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + if FLAGS.max_seq_length > bert_config.max_position_embeddings: + raise ValueError( + "Cannot use sequence length %d because the BERT model " + "was only trained up to sequence length %d" % + (FLAGS.max_seq_length, bert_config.max_position_embeddings)) + + task_name = FLAGS.task_name.lower() + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + processor = processors[task_name]() + + label_list = processor.get_labels() + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + + master_process = True + training_hooks = [] + global_batch_size = FLAGS.train_batch_size + hvd_rank = 0 + + config = tf.ConfigProto() + if FLAGS.horovod: + global_batch_size = FLAGS.train_batch_size * hvd.size() + master_process = (hvd.rank() == 0) + hvd_rank = hvd.rank() + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + run_config = tf.estimator.RunConfig( + model_dir=FLAGS.output_dir if master_process else None, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if master_process else None, + keep_checkpoint_max=1) + + if master_process: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + + train_examples = None + num_train_steps = None + num_warmup_steps = None + training_hooks.append(LogTrainRunHook(global_batch_size, hvd_rank)) + + if FLAGS.do_train: + train_examples = processor.get_train_examples(FLAGS.data_dir) + num_train_steps = int( + len(train_examples) / global_batch_size * FLAGS.num_train_epochs) + num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion) + + start_index = 0 + end_index = len(train_examples) + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record")] + + if FLAGS.horovod: + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record{}".format(i)) for i in range(hvd.size())] + num_examples_per_rank = len(train_examples) // hvd.size() + remainder = len(train_examples) % hvd.size() + if hvd.rank() < remainder: + start_index = hvd.rank() * (num_examples_per_rank+1) + end_index = start_index + num_examples_per_rank + 1 + else: + start_index = hvd.rank() * num_examples_per_rank + remainder + end_index = start_index + (num_examples_per_rank) + + model_fn = model_fn_builder( + bert_config=bert_config, + num_labels=len(label_list) + 1, + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=FLAGS.learning_rate if not FLAGS.horovod else FLAGS.learning_rate * hvd.size(), + num_train_steps=num_train_steps, + num_warmup_steps=num_warmup_steps, + use_one_hot_embeddings=False, + hvd=None if not FLAGS.horovod else hvd, + use_fp16=FLAGS.use_fp16) + + estimator = tf.estimator.Estimator( + model_fn=model_fn, + config=run_config) + + if FLAGS.do_train: + #train_file = os.path.join(FLAGS.output_dir, "train.tf_record") + #filed_based_convert_examples_to_features( + # train_examples, label_list, FLAGS.max_seq_length, tokenizer, train_file) + filed_based_convert_examples_to_features( + train_examples[start_index:end_index], label_list, FLAGS.max_seq_length, tokenizer, tmp_filenames[hvd_rank]) + tf.logging.info("***** Running training *****") + tf.logging.info(" Num examples = %d", len(train_examples)) + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + tf.logging.info(" Num steps = %d", num_train_steps) + train_input_fn = file_based_input_fn_builder( + input_file=tmp_filenames, #train_file, + batch_size=FLAGS.train_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=True, + drop_remainder=True, + hvd=None if not FLAGS.horovod else hvd) + + #estimator.train(input_fn=train_input_fn, max_steps=num_train_steps) + train_start_time = time.time() + estimator.train(input_fn=train_input_fn, max_steps=num_train_steps, hooks=training_hooks) + train_time_elapsed = time.time() - train_start_time + train_time_wo_overhead = training_hooks[-1].total_time + avg_sentences_per_second = num_train_steps * global_batch_size * 1.0 / train_time_elapsed + ss_sentences_per_second = (num_train_steps - training_hooks[-1].skipped) * global_batch_size * 1.0 / train_time_wo_overhead + + if master_process: + tf.logging.info("-----------------------------") + tf.logging.info("Total Training Time = %0.2f for Sentences = %d", train_time_elapsed, + num_train_steps * global_batch_size) + tf.logging.info("Total Training Time W/O Overhead = %0.2f for Sentences = %d", train_time_wo_overhead, + (num_train_steps - training_hooks[-1].skipped) * global_batch_size) + tf.logging.info("Throughput Average (sentences/sec) with overhead = %0.2f", avg_sentences_per_second) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + if FLAGS.do_eval and master_process: + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + eval_file = os.path.join(FLAGS.output_dir, "eval.tf_record") + filed_based_convert_examples_to_features( + eval_examples, label_list, FLAGS.max_seq_length, tokenizer, eval_file) + + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Num examples = %d", len(eval_examples)) + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + eval_steps = None + eval_drop_remainder = False + eval_input_fn = file_based_input_fn_builder( + input_file=eval_file, + batch_size=FLAGS.eval_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=eval_drop_remainder) + result = estimator.evaluate(input_fn=eval_input_fn, steps=eval_steps) + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.Open(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + if FLAGS.do_predict and master_process: + predict_examples = processor.get_test_examples(FLAGS.data_dir) + predict_file = os.path.join(FLAGS.output_dir, "predict.tf_record") + filed_based_convert_examples_to_features(predict_examples, label_list, + FLAGS.max_seq_length, tokenizer, + predict_file, mode="test") + + with tf.gfile.Open(os.path.join(FLAGS.output_dir, 'label2id.pkl'), 'rb') as rf: + label2id = pickle.load(rf) + id2label = {value: key for key, value in label2id.items()} + token_path = os.path.join(FLAGS.output_dir, "token_test.txt") + if tf.gfile.Exists(token_path): + tf.gfile.Remove(token_path) + + tf.logging.info("***** Running prediction*****") + tf.logging.info(" Num examples = %d", len(predict_examples)) + tf.logging.info(" Batch size = %d", FLAGS.predict_batch_size) + + predict_drop_remainder = False + predict_input_fn = file_based_input_fn_builder( + input_file=predict_file, + batch_size=FLAGS.predict_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=predict_drop_remainder) + + eval_hooks = [LogEvalRunHook(FLAGS.predict_batch_size)] + eval_start_time = time.time() + + output_predict_file = os.path.join(FLAGS.output_dir, "label_test.txt") + test_labels_file = os.path.join(FLAGS.output_dir, "test_labels.txt") + test_labels_err_file = os.path.join(FLAGS.output_dir, "test_labels_errs.txt") + with tf.gfile.Open(output_predict_file, 'w') as writer, \ + tf.gfile.Open(test_labels_file, 'w') as tl, \ + tf.gfile.Open(test_labels_err_file, 'w') as tle: + print(id2label) + i=0 + for prediction in estimator.predict(input_fn=predict_input_fn, hooks=eval_hooks, + yield_single_examples=True): + output_line = "\n".join(id2label[id] for id in prediction if id != 0) + "\n" + writer.write(output_line) + result_to_pair(predict_examples[i], prediction, id2label, tl, tle) + i = i + 1 + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + time_list = eval_hooks[-1].time_list + time_list.sort() + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size + + avg = np.mean(time_list) + cf_50 = max(time_list[:int(len(time_list) * 0.50)]) + cf_90 = max(time_list[:int(len(time_list) * 0.90)]) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.predict_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size) + tf.logging.info("Summary Inference Statistics") + tf.logging.info("Batch size = %d", FLAGS.predict_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Latency Confidence Level 50 (ms) = %0.2f", cf_50 * 1000) + tf.logging.info("Latency Confidence Level 90 (ms) = %0.2f", cf_90 * 1000) + tf.logging.info("Latency Confidence Level 95 (ms) = %0.2f", cf_95 * 1000) + tf.logging.info("Latency Confidence Level 99 (ms) = %0.2f", cf_99 * 1000) + tf.logging.info("Latency Confidence Level 100 (ms) = %0.2f", cf_100 * 1000) + tf.logging.info("Latency Average (ms) = %0.2f", avg * 1000) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + tf.logging.info('Reading: %s', test_labels_file) + with tf.gfile.Open(test_labels_file, "r") as f: + counts = evaluate(f) + eval_result = report_notprint(counts) + print(''.join(eval_result)) + with tf.gfile.Open(os.path.join(FLAGS.output_dir, 'test_results_conlleval.txt'), 'w') as fd: + fd.write(''.join(eval_result)) + + + +if __name__ == "__main__": + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("task_name") + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_pretraining.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_pretraining.py new file mode 100644 index 0000000..d444720 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_pretraining.py @@ -0,0 +1,818 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Run masked LM/next sentence masked_lm pre-training for BERT.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import time +import modeling +import optimization +import tensorflow as tf +import glob +from utils.utils import LogEvalRunHook +from tensorflow.core.protobuf import rewriter_config_pb2 +from gpu_environment import get_custom_getter + +from npu_bridge.estimator.npu.npu_config import * +from npu_bridge.estimator.npu.npu_estimator import * +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + +import sys + +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../../../../../utils/atlasboost')) +# import hwlog +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + +os.environ['WHICH_OP'] = 'GEOP' +os.environ['NEW_GE_FE_ID'] = '1' +os.environ['GE_AICPU_FLAG'] = '1' +os.environ['GE_USE_STATIC_MEMORY'] = '1' +os.environ['OPTION_EXEC_HCCL_FLAG'] = '1' +os.environ['HCCL_CONNECT_TIMEOUT'] = '600' + +flags = tf.flags + +FLAGS = flags.FLAGS + +## Required parameters +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_string( + "input_files_dir", None, + "Directory with input files, comma separated or single directory.") + +flags.DEFINE_string( + "eval_files_dir", None, + "Directory with eval files, comma separated or single directory. ") + +flags.DEFINE_string( + "output_dir", None, + "The output directory where the model checkpoints will be written.") + +## Other parameters +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_string( + "optimizer_type", "lamb", + "Optimizer used for training - LAMB or ADAM") + +flags.DEFINE_integer( + "max_seq_length", 512, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded. Must match data generation.") + +flags.DEFINE_integer( + "max_predictions_per_seq", 80, + "Maximum number of masked LM predictions per sequence. " + "Must match data generation.") + +flags.DEFINE_bool("do_train", False, "Whether to run training.") + +flags.DEFINE_bool("do_eval", False, "Whether to run eval on the dev set.") + +flags.DEFINE_integer("train_batch_size", 32, "Total batch size for training.") + +flags.DEFINE_integer("eval_batch_size", 8, "Total batch size for eval.") + +flags.DEFINE_float("learning_rate", 5e-5, "The initial learning rate for Adam.") + +flags.DEFINE_integer("num_train_steps", 100000, "Number of training steps.") + +flags.DEFINE_integer("num_warmup_steps", 10000, "Number of warmup steps.") + +flags.DEFINE_integer("save_checkpoints_steps", 1000, + "How often to save the model checkpoint.") +flags.DEFINE_integer("display_loss_steps", 10, + "How often to print loss") + +flags.DEFINE_integer("iterations_per_loop", 1000, + "How many steps to make in each estimator call.") + +flags.DEFINE_integer("max_eval_steps", 100, "Maximum number of eval steps.") + +flags.DEFINE_integer("num_accumulation_steps", 1, + "Number of accumulation steps before gradient update." + "Global batch size = num_accumulation_steps * train_batch_size") + +flags.DEFINE_bool("allreduce_post_accumulation", False, + "Whether to all reduce after accumulation of N steps or after each step") + +flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the trainable parameters are printed") + +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") + +flags.DEFINE_bool("report_loss", True, "Whether to report total loss during training.") + +flags.DEFINE_bool("manual_fp16", False, "Whether to use fp32 or fp16 arithmetic on GPU. " + "Manual casting is done instead of using AMP") + +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") + +flags.DEFINE_bool("use_fp16", False, "Whether to enable AMP ops.") + +flags.DEFINE_bool("use_fp16_cls", False, "Whether to use fp16 in cls and pooler.") + +flags.DEFINE_bool("distributed", False, "Whether to use multi-npu") + +flags.DEFINE_bool('npu_bert_fused_gelu', True, 'Whether to use npu defined gelu op') + +flags.DEFINE_bool('npu_bert_debug', False, 'If True, dropout and shuffle is disabled.') + +flags.DEFINE_bool('npu_bert_use_tdt', True, 'Whether to use tdt as dataset') + +flags.DEFINE_string("npu_bert_job_start_file", None, "CSA job start file path.") + +flags.DEFINE_integer("npu_bert_loss_scale", -1, + "Whether to use loss scale, -1 is disable, 0 is dynamic loss scale, >=1 is static loss scale") + +flags.DEFINE_bool("npu_bert_clip_by_global_norm", True, + "Use clip_by_global_norm if True, or use clip_by_norm for each gradient") + +flags.DEFINE_bool('npu_bert_npu_dropout', True, 'Whether to use npu defined gelu op') + +flags.DEFINE_bool('npu_bert_tail_optimize', False, 'Whether to use npu allreduce tail optimization') + +flags.DEFINE_bool('npu_gather', True, 'Whether to use gather_npu whose backward propagation avoids IndexedSlices') + +flags.DEFINE_bool('hcom_parallel', True, 'Whether to use parallel allreduce') + +flags.DEFINE_integer('init_loss_scale_value', 2 ** 32, 'Initial loss scale value for loss scale optimizer') + +flags.DEFINE_bool('npu_bert_use_fused_batch_norm', False, + 'Whether to use fused batch norm implementation in fused_layer_norm') + +flags.DEFINE_bool('npu_bert_use_fused_adam_momentum', True, 'Whether to use fused apply and assign in adam') + +flags.DEFINE_integer('graph_memory_max_size', 27 * 1024 * 1024 * 1024, 'feature map memory max size') + +flags.DEFINE_integer('variable_memory_max_size', 4 * 1024 * 1024 * 1024, 'variable memory max size') + + +# report samples/sec, total loss and learning rate during training +class _LogSessionRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, num_accumulation_steps, display_every=10, hvd_rank=-1): + self.global_batch_size = global_batch_size + self.display_every = display_every + self.hvd_rank = hvd_rank + self.num_accumulation_steps = num_accumulation_steps + + def after_create_session(self, session, coord): + self.elapsed_secs = 0. + self.count = 0 + self.all_count = 0 + self.avg_loss = 0.0 + + def before_run(self, run_context): + self.t0 = time.time() + if self.num_accumulation_steps <= 1: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + if tf.flags.FLAGS.npu_bert_tail_optimize: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0', 'loss_scale:0']) + else: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0', 'loss_scale:0']) + else: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0']) + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'update_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0', 'loss_scale:0']) + else: + return tf.train.SessionRunArgs( + fetches=['global_step:0', 'update_step:0', 'total_loss:0', + 'learning_rate:0', 'nsp_loss:0', + 'mlm_loss:0']) + + def after_run(self, run_context, run_values): + self.elapsed_secs += time.time() - self.t0 + if self.num_accumulation_steps <= 1: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + global_step, total_loss, lr, nsp_loss, mlm_loss, loss_scaler = run_values.results + else: + global_step, total_loss, lr, nsp_loss, mlm_loss = run_values. \ + results + update_step = True + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + global_step, update_step, total_loss, lr, nsp_loss, mlm_loss, loss_scaler = run_values.results + else: + global_step, update_step, total_loss, lr, nsp_loss, mlm_loss = run_values. \ + results + print_step = global_step + 1 # One-based index for printing. + self.avg_loss += total_loss + self.all_count += 1 + if update_step: + self.count += 1 + dt = self.elapsed_secs / self.count + sent_per_sec = self.global_batch_size / dt * FLAGS.iterations_per_loop + avg_loss_step = self.avg_loss / self.all_count + if self.hvd_rank >= 0: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + print( + 'Rank = %2d :: Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e Loss scale = %6.4e' % + (self.hvd_rank, print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr, + loss_scaler), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + print( + 'Rank = %2d :: Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e' % + (self.hvd_rank, print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr), + flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + if (tf.flags.FLAGS.npu_bert_loss_scale == 0) and (FLAGS.manual_fp16 or FLAGS.use_fp16): + print( + 'Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e Loss scale = %6.4e' % + (print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr, loss_scaler), + flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + else: + print( + 'Step = %6i Throughput = %11.1f MLM Loss = %10.4e NSP Loss = %10.4e Loss = %9.6f Average Loss = %9.6f LR = %6.4e' % + (print_step, sent_per_sec, mlm_loss, nsp_loss, total_loss, avg_loss_step, lr), flush=True) + hwlog.remark_print(key=hwlog.CURRENT_STEP, value='%6i' % print_step) + hwlog.remark_print(key=hwlog.THROWOUT, value='%11.1f' % sent_per_sec) + + + self.elapsed_secs = 0. + self.count = 0 + self.avg_loss = 0.0 + self.all_count = 0 + + +def model_fn_builder(bert_config, init_checkpoint, learning_rate, + num_train_steps, num_warmup_steps, + use_one_hot_embeddings, hvd=None): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + masked_lm_positions = features["masked_lm_positions"] + masked_lm_ids = features["masked_lm_ids"] + masked_lm_weights = features["masked_lm_weights"] + next_sentence_labels = features["next_sentence_labels"] + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings, + compute_type=tf.float16 if FLAGS.manual_fp16 else tf.float32) + + (masked_lm_loss, + masked_lm_example_loss, masked_lm_log_probs) = get_masked_lm_output( + bert_config, model.get_sequence_output(), model.get_embedding_table(), + masked_lm_positions, masked_lm_ids, + masked_lm_weights) + + (next_sentence_loss, next_sentence_example_loss, + next_sentence_log_probs) = get_next_sentence_output( + bert_config, model.get_pooled_output(), next_sentence_labels) + + masked_lm_loss = tf.identity(masked_lm_loss, name="mlm_loss") + next_sentence_loss = tf.identity(next_sentence_loss, name="nsp_loss") + total_loss = masked_lm_loss + next_sentence_loss + total_loss = tf.identity(total_loss, name='total_loss') + + tvars = tf.trainable_variables() + + initialized_variable_names = {} + if init_checkpoint and (hvd is None or hvd.rank() == 0): + print("Loading checkpoint", init_checkpoint) + (assignment_map, initialized_variable_names + ) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + if FLAGS.verbose_logging: + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" %d :: name = %s, shape = %s%s", 0 if hvd is None else hvd.rank(), var.name, + var.shape, + init_string) + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, + hvd, FLAGS.manual_fp16, FLAGS.use_fp16, FLAGS.num_accumulation_steps, FLAGS.optimizer_type, + FLAGS.allreduce_post_accumulation) + + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + + def metric_fn(masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, + masked_lm_weights, next_sentence_example_loss, + next_sentence_log_probs, next_sentence_labels): + """Computes the loss and accuracy of the model.""" + masked_lm_log_probs = tf.reshape(masked_lm_log_probs, + [-1, masked_lm_log_probs.shape[-1]]) + masked_lm_predictions = tf.argmax( + masked_lm_log_probs, axis=-1, output_type=tf.int32) + masked_lm_example_loss = tf.reshape(masked_lm_example_loss, [-1]) + masked_lm_ids = tf.reshape(masked_lm_ids, [-1]) + masked_lm_weights = tf.reshape(masked_lm_weights, [-1]) + masked_lm_accuracy = tf.metrics.accuracy( + labels=masked_lm_ids, + predictions=masked_lm_predictions, + weights=masked_lm_weights) + masked_lm_mean_loss = tf.metrics.mean( + values=masked_lm_example_loss, weights=masked_lm_weights) + + next_sentence_log_probs = tf.reshape( + next_sentence_log_probs, [-1, next_sentence_log_probs.shape[-1]]) + next_sentence_predictions = tf.argmax( + next_sentence_log_probs, axis=-1, output_type=tf.int32) + next_sentence_labels = tf.reshape(next_sentence_labels, [-1]) + next_sentence_accuracy = tf.metrics.accuracy( + labels=next_sentence_labels, predictions=next_sentence_predictions) + next_sentence_mean_loss = tf.metrics.mean( + values=next_sentence_example_loss) + + return { + "masked_lm_accuracy": masked_lm_accuracy, + "masked_lm_loss": masked_lm_mean_loss, + "next_sentence_accuracy": next_sentence_accuracy, + "next_sentence_loss": next_sentence_mean_loss, + } + + eval_metric_ops = metric_fn( + masked_lm_example_loss, masked_lm_log_probs, masked_lm_ids, + masked_lm_weights, next_sentence_example_loss, + next_sentence_log_probs, next_sentence_labels + ) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + else: + raise ValueError("Only TRAIN and EVAL modes are supported: %s" % (mode)) + + return output_spec + + return model_fn + + +def get_masked_lm_output(bert_config, input_tensor, output_weights, positions, + label_ids, label_weights): + """Get loss and log probs for the masked LM.""" + input_tensor = gather_indexes(input_tensor, positions) + + with tf.variable_scope("cls/predictions"): + # We apply one more non-linear transformation before the output layer. + # This matrix is not used after pre-training. + with tf.variable_scope("transform", custom_getter=get_custom_getter( + compute_type=tf.float16 if FLAGS.use_fp16_cls else tf.float32)): + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + input_tensor = tf.layers.dense( + input_tensor, + units=bert_config.hidden_size, + activation=modeling.get_activation(bert_config.hidden_act), + kernel_initializer=modeling.create_initializer( + bert_config.initializer_range)) + input_tensor = tf.cast(input_tensor, tf.float32) + input_tensor = modeling.layer_norm(input_tensor) + + # The output weights are the same as the input embeddings, but there is + # an output-only bias for each token. + output_bias = tf.get_variable( + "output_bias", + shape=[bert_config.vocab_size], + initializer=tf.zeros_initializer()) + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + logits = tf.matmul(input_tensor, tf.cast(output_weights, tf.float16), transpose_b=True) + logits = tf.cast(logits, tf.float32) + else: + logits = tf.matmul(tf.cast(input_tensor, tf.float32), output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + log_probs = tf.nn.log_softmax(logits, axis=-1) + + label_ids = tf.reshape(label_ids, [-1]) + label_weights = tf.reshape(label_weights, [-1]) + + one_hot_labels = tf.one_hot( + label_ids, depth=bert_config.vocab_size, dtype=tf.float32) + + # The `positions` tensor might be zero-padded (if the sequence is too + # short to have the maximum number of predictions). The `label_weights` + # tensor has a value of 1.0 for every real prediction and 0.0 for the + # padding predictions. + per_example_loss = -tf.reduce_sum(log_probs * one_hot_labels, axis=[-1]) + numerator = tf.reduce_sum(label_weights * per_example_loss) + denominator = tf.reduce_sum(label_weights) + 1e-5 + loss = numerator / denominator + + return (loss, per_example_loss, log_probs) + + +def get_next_sentence_output(bert_config, input_tensor, labels): + """Get loss and log probs for the next sentence prediction.""" + + # Simple binary classification. Note that 0 is "next sentence" and 1 is + # "random sentence". This weight matrix is not used after pre-training. + with tf.variable_scope("cls/seq_relationship"): + output_weights = tf.get_variable( + "output_weights", + shape=[2, bert_config.hidden_size], + initializer=modeling.create_initializer(bert_config.initializer_range)) + output_bias = tf.get_variable( + "output_bias", shape=[2], initializer=tf.zeros_initializer()) + + if FLAGS.use_fp16_cls: + input_tensor = tf.cast(input_tensor, tf.float16) + logits = tf.matmul(input_tensor, tf.cast(output_weights, tf.float16), transpose_b=True) + logits = tf.cast(logits, tf.float32) + else: + logits = tf.matmul(tf.cast(input_tensor, tf.float32), output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + log_probs = tf.nn.log_softmax(logits, axis=-1) + labels = tf.reshape(labels, [-1]) + one_hot_labels = tf.one_hot(labels, depth=2, dtype=tf.float32) + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1) + loss = tf.reduce_mean(per_example_loss) + return (loss, per_example_loss, log_probs) + + +def gather_indexes(sequence_tensor, positions): + """Gathers the vectors at the specific positions over a minibatch.""" + sequence_shape = modeling.get_shape_list(sequence_tensor, expected_rank=3) + batch_size = sequence_shape[0] + seq_length = sequence_shape[1] + width = sequence_shape[2] + + flat_offsets = tf.reshape( + tf.range(0, batch_size, dtype=tf.int32) * seq_length, [-1, 1]) + flat_positions = tf.reshape(positions + flat_offsets, [-1]) + flat_sequence_tensor = tf.reshape(sequence_tensor, + [batch_size * seq_length, width]) + output_tensor = tf.gather(flat_sequence_tensor, flat_positions) + return output_tensor + + +def input_fn_builder(input_files, + batch_size, + max_seq_length, + max_predictions_per_seq, + is_training, + num_cpu_threads=4, + hvd=None): + """Creates an `input_fn` closure to be passed to Estimator.""" + + def input_fn(): + """The actual input function.""" + + name_to_features = { + "input_ids": + tf.FixedLenFeature([max_seq_length], tf.int64), + "input_mask": + tf.FixedLenFeature([max_seq_length], tf.int64), + "segment_ids": + tf.FixedLenFeature([max_seq_length], tf.int64), + "masked_lm_positions": + tf.FixedLenFeature([max_predictions_per_seq], tf.int64), + "masked_lm_ids": + tf.FixedLenFeature([max_predictions_per_seq], tf.int64), + "masked_lm_weights": + tf.FixedLenFeature([max_predictions_per_seq], tf.float32), + "next_sentence_labels": + tf.FixedLenFeature([1], tf.int64), + } + + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + if is_training: + d = tf.data.Dataset.from_tensor_slices(tf.constant(input_files)) + if FLAGS.distributed: + rank_size = int(os.getenv('RANK_SIZE')) + rank_id = int(os.getenv('RANK_ID')) + print('RANK_SIZE=', rank_size, ' rank_id=', rank_id) + d = d.shard(rank_size, rank_id) + d = d.repeat() + if not FLAGS.npu_bert_debug: + d = d.shuffle(buffer_size=len(input_files)) + + # `cycle_length` is the number of parallel files that get read. + if not FLAGS.npu_bert_debug: + # cycle_length = min(num_cpu_threads, len(input_files)) + cycle_length = min(num_cpu_threads, int(len(input_files) / int(os.getenv('RANK_SIZE')))) + else: + cycle_length = 1 + + # `sloppy` mode means that the interleaving is not exact. This adds + # even more randomness to the training pipeline. + # d = d.apply( + # tf.contrib.data.parallel_interleave( + # tf.data.TFRecordDataset, + # sloppy=(not FLAGS.npu_bert_debug), + # cycle_length=cycle_length)) + d = d.interleave(tf.data.TFRecordDataset, cycle_length=cycle_length, + num_parallel_calls=tf.data.experimental.AUTOTUNE) + + if not FLAGS.npu_bert_debug: + d = d.shuffle(buffer_size=100) + else: + d = tf.data.TFRecordDataset(input_files) + # Since we evaluate for a fixed number of steps we don't want to encounter + # out-of-range exceptions. + d = d.repeat() + + # We must `drop_remainder` on training because the TPU requires fixed + # size dimensions. For eval, we assume we are evaluating on the CPU or GPU + # and we *don't* want to drop the remainder, otherwise we wont cover + # every sample. + d = d.apply( + tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + num_parallel_batches=num_cpu_threads, + drop_remainder=True)) + return d + + return input_fn + + +def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + + return example + + +def main(_): + for name, value in FLAGS.__flags.items(): + print("name:", name, " ", FLAGS[name].value) + + tf.logging.set_verbosity(tf.logging.INFO) + + if not FLAGS.do_train and not FLAGS.do_eval: + raise ValueError("At least one of `do_train` or `do_eval` must be True.") + + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + + if FLAGS.horovod: + import horovod.tensorflow as hvd + hvd.init() + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + if FLAGS.npu_gather: + if FLAGS.distributed and bert_config.num_hidden_layers == 24: + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([49, 113, 177, 241, 305, 353, 385, 397]) + if FLAGS.distributed and bert_config.num_hidden_layers == 12: + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([8, 56, 104, 152, 200, 205]) + if FLAGS.distributed and bert_config.num_hidden_layers == 6: + from hccl.split.api import set_split_strategy_by_idx + set_split_strategy_by_idx([8, 40, 72, 104, 109]) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + input_files = [] + for input_file_dir in FLAGS.input_files_dir.split(","): + input_files.extend(tf.gfile.Glob(os.path.join(input_file_dir, "*"))) + + input_files.sort() + print("Input Files:", input_files) + + if FLAGS.horovod and len(input_files) < hvd.size(): + raise ValueError("Input Files must be sharded") + if FLAGS.use_fp16 and FLAGS.manual_fp16: + raise ValueError("AMP and Manual Mixed Precision Training are both activated! Error") + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + config = tf.ConfigProto() + if FLAGS.horovod: + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.rank() == 0: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + + # config.gpu_options.per_process_gpu_memory_fraction = 0.7 + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + config.graph_options.rewrite_options.memory_optimization = rewriter_config_pb2.RewriterConfig.NO_MEM_OPT + + # run_config = tf.estimator.RunConfig( + run_config = NPURunConfig( + model_dir=FLAGS.output_dir, + save_summary_steps=0, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if not FLAGS.horovod or hvd.rank() == 0 else None, + # This variable controls how often estimator reports examples/sec. + # Default value is every 100 steps. + # When --report_loss is True, we set to very large value to prevent + # default info reporting from estimator. + # Ideally we should set it to None, but that does not work. + log_step_count_steps=1 if FLAGS.report_loss else 100, + enable_data_pre_proc=FLAGS.npu_bert_use_tdt, + iterations_per_loop=FLAGS.iterations_per_loop, + is_tailing_optimization=FLAGS.npu_bert_tail_optimize, + hcom_parallel=FLAGS.hcom_parallel, + graph_memory_max_size=FLAGS.graph_memory_max_size, + variable_memory_max_size=FLAGS.variable_memory_max_size) + + if FLAGS.distributed: + rank_size = int(os.getenv('RANK_SIZE')) + model_fn = model_fn_builder( + bert_config=bert_config, + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=FLAGS.learning_rate if not (FLAGS.distributed) else FLAGS.learning_rate * rank_size, + num_train_steps=FLAGS.num_train_steps, + num_warmup_steps=FLAGS.num_warmup_steps, + use_one_hot_embeddings=False, + hvd=None if not FLAGS.horovod else hvd) + + training_hooks = [] + """ + if FLAGS.report_loss and (not FLAGS.horovod or hvd.rank() == 0): + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps if not FLAGS.horovod else FLAGS.train_batch_size * FLAGS.num_accumulation_steps * hvd.size() + training_hooks.append(_LogSessionRunHook(global_batch_size, FLAGS.num_accumulation_steps, FLAGS.display_loss_steps)) + if FLAGS.horovod and hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + """ + if FLAGS.report_loss: + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps if not FLAGS.distributed else FLAGS.train_batch_size * FLAGS.num_accumulation_steps * rank_size + training_hooks.append( + _LogSessionRunHook(global_batch_size, FLAGS.num_accumulation_steps, FLAGS.display_loss_steps)) + + # estimator = tf.estimator.Estimator( + estimator = NPUEstimator( + model_fn=model_fn, + config=run_config, + job_start_file=FLAGS.npu_bert_job_start_file) + + if FLAGS.do_train: + tf.logging.info("***** Running training *****") + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + train_input_fn = input_fn_builder( + input_files=input_files, + batch_size=FLAGS.train_batch_size, + max_seq_length=FLAGS.max_seq_length, + max_predictions_per_seq=FLAGS.max_predictions_per_seq, + is_training=True, + hvd=None if not FLAGS.horovod else hvd) + + estimator.train(input_fn=train_input_fn, hooks=training_hooks, max_steps=FLAGS.num_train_steps) + + if FLAGS.do_eval and (not FLAGS.horovod or hvd.rank() == 0): + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + + eval_files = [] + for eval_file_dir in FLAGS.eval_files_dir.split(","): + eval_files.extend(tf.gfile.Glob(os.path.join(eval_file_dir, "*"))) + + eval_input_fn = input_fn_builder( + input_files=eval_files, + batch_size=FLAGS.eval_batch_size, + max_seq_length=FLAGS.max_seq_length, + max_predictions_per_seq=FLAGS.max_predictions_per_seq, + is_training=False, + hvd=None if not FLAGS.horovod else hvd) + + eval_hooks = [LogEvalRunHook(FLAGS.eval_batch_size)] + eval_start_time = time.time() + result = estimator.evaluate( + input_fn=eval_input_fn, steps=FLAGS.max_eval_steps, hooks=eval_hooks) + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size + + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.eval_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.eval_batch_size) + tf.logging.info("Summary Inference Statistics on EVAL set") + tf.logging.info("Batch size = %d", FLAGS.eval_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.GFile(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + if key == 'masked_lm_accuracy': + hwlog.remark_print(key=hwlog.MASKED_LM_ACCURACY, value=str(result[key])) + elif key == 'next_sentence_accuracy ': + hwlog.remark_print(key=hwlog.NEXT_SENTENCE_ACCURACY, value=str(result[key])) + elif key == 'global_step': + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=str(result[key])) + elif key == 'loss': + hwlog.remark_print(key=hwlog.LOSS, value=str(result[key])) + elif key == 'masked_lm_loss': + hwlog.remark_print(key=hwlog.MASKED_LM_LOSS, value=str(result[key])) + elif key == 'next_sentence_loss ': + hwlog.remark_print(key=hwlog.NEXT_SENTENCE_LOSS, value=str(result[key])) + else: + pass + + +if __name__ == "__main__": + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.01, "dataset": "cn-clue/en-wiki", "optimizer": "Adam", "loss_scale": 512} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + flags.mark_flag_as_required("input_files_dir") + flags.mark_flag_as_required("eval_files_dir") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + flags.mark_flag_as_required("npu_bert_job_start_file") + if FLAGS.use_xla and FLAGS.manual_fp16: + print('WARNING! Combining --use_xla with --manual_fp16 may prevent convergence.') + print(' This warning message will be removed when the underlying') + print(' issues have been fixed and you are running a TF version') + print(' that has that fix.') + tf.app.run() + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_re.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_re.py new file mode 100644 index 0000000..86856cd --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_re.py @@ -0,0 +1,939 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""BERT finetuning runner.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import csv +import logging +import os, sys +import numpy as np + +import tensorflow as tf + +sys.path.append("/workspace/bert") + +import modeling +import optimization +import tokenization + +import time +import horovod.tensorflow as hvd +from utils.utils import LogEvalRunHook, LogTrainRunHook + +flags = tf.flags + +FLAGS = flags.FLAGS + +## Required parameters +flags.DEFINE_string( + "data_dir", None, + "The input data dir. Should contain the .tsv files (or other data files) " + "for the task.") + +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_string("task_name", None, "The name of the task to train.") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_string( + "output_dir", None, + "The output directory where the model checkpoints will be written.") + +## Other parameters + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_bool("do_train", False, "Whether to run training.") + +flags.DEFINE_bool("do_eval", False, "Whether to run eval on the dev set.") + +flags.DEFINE_bool( + "do_predict", False, + "Whether to run the model in inference mode on the test set.") + +flags.DEFINE_integer("train_batch_size", 16, "Total batch size for training.") + +flags.DEFINE_integer("eval_batch_size", 8, "Total batch size for eval.") + +flags.DEFINE_integer("predict_batch_size", 8, "Total batch size for predict.") + +flags.DEFINE_float("learning_rate", 5e-6, "The initial learning rate for Adam.") + +flags.DEFINE_float("num_train_epochs", 3.0, + "Total number of training epochs to perform.") + +flags.DEFINE_float( + "warmup_proportion", 0.1, + "Proportion of training to perform linear learning rate warmup for. " + "E.g., 0.1 = 10% of training.") + +flags.DEFINE_integer("save_checkpoints_steps", 1000, + "How often to save the model checkpoint.") + +flags.DEFINE_integer("iterations_per_loop", 1000, + "How many steps to make in each estimator call.") + +tf.flags.DEFINE_string("master", None, "[Optional] TensorFlow master URL.") + +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") +flags.DEFINE_bool("use_fp16", False, "Whether to use fp32 or fp16 arithmetic on GPU.") +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") + +class InputExample(object): + """A single training/test example for simple sequence classification.""" + + def __init__(self, guid, text_a, text_b=None, label=None): + """Constructs a InputExample. + + Args: + guid: Unique id for the example. + text_a: string. The untokenized text of the first sequence. For single + sequence tasks, only this sequence must be specified. + text_b: (Optional) string. The untokenized text of the second sequence. + Only must be specified for sequence pair tasks. + label: (Optional) string. The label of the example. This should be + specified for train and dev examples, but not for test examples. + """ + self.guid = guid + self.text_a = text_a + self.text_b = text_b + self.label = label + + +class PaddingInputExample(object): + """Fake example so the num input examples is a multiple of the batch size. + + When running eval/predict on the TPU, we need to pad the number of examples + to be a multiple of the batch size, because the TPU requires a fixed batch + size. The alternative is to drop the last batch, which is bad because it means + the entire output data won't be generated. + + We use this class instead of `None` because treating `None` as padding + battches could cause silent errors. + """ + + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + input_ids, + input_mask, + segment_ids, + label_id, + is_real_example=True): + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.label_id = label_id + self.is_real_example = is_real_example + + +class DataProcessor(object): + """Base class for data converters for sequence classification data sets.""" + + def get_train_examples(self, data_dir): + """Gets a collection of `InputExample`s for the train set.""" + raise NotImplementedError() + + def get_dev_examples(self, data_dir): + """Gets a collection of `InputExample`s for the dev set.""" + raise NotImplementedError() + + def get_test_examples(self, data_dir): + """Gets a collection of `InputExample`s for prediction.""" + raise NotImplementedError() + + def get_labels(self): + """Gets the list of labels for this data set.""" + raise NotImplementedError() + + @classmethod + def _read_tsv(cls, input_file, quotechar=None): + """Reads a tab separated value file.""" + with tf.gfile.Open(input_file, "r") as f: + reader = csv.reader(f, delimiter="\t", quotechar=quotechar) + lines = [] + for line in reader: + lines.append(line) + return lines + + +class _ChemProtProcessor(DataProcessor): + """Processor for the ChemProt data set.""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir, file_name="dev.tsv"): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, file_name)), "dev") + + def get_test_examples(self, data_dir, file_name="test.tsv"): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, file_name)), "test") + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + # skip header + if i == 0: + continue + guid = line[0] + text_a = tokenization.convert_to_unicode(line[1]) + if set_type == "test": + label = self.get_labels()[-1] + else: + try: + label = tokenization.convert_to_unicode(line[2]) + except IndexError: + logging.exception(line) + exit(1) + examples.append(InputExample(guid=guid, text_a=text_a, text_b=None, label=label)) + return examples + + +class ChemProtProcessor(_ChemProtProcessor): + def get_labels(self): + """See base class.""" + return ["CPR:3", "CPR:4", "CPR:5", "CPR:6", "CPR:9", "false"] + + + +class MedNLIProcessor(DataProcessor): + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir, file_name="dev.tsv"): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, file_name)), "dev") + + def get_test_examples(self, data_dir, file_name="test.tsv"): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, file_name)), "test") + + def get_labels(self): + """See base class.""" + return ['contradiction', 'entailment', 'neutral'] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = line[1] + text_a = tokenization.convert_to_unicode(line[2]) + text_b = tokenization.convert_to_unicode(line[3]) + if set_type == "test": + label = self.get_labels()[-1] + else: + label = tokenization.convert_to_unicode(line[0]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +def convert_single_example(ex_index, example, label_list, max_seq_length, + tokenizer): + """Converts a single `InputExample` into a single `InputFeatures`.""" + + if isinstance(example, PaddingInputExample): + return InputFeatures( + input_ids=[0] * max_seq_length, + input_mask=[0] * max_seq_length, + segment_ids=[0] * max_seq_length, + label_id=0, + is_real_example=False) + + label_map = {} + for (i, label) in enumerate(label_list): + label_map[label] = i + + tokens_a = tokenizer.tokenize(example.text_a) + tokens_b = None + if example.text_b: + tokens_b = tokenizer.tokenize(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for [CLS], [SEP], [SEP] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3) + else: + # Account for [CLS] and [SEP] with "- 2" + if len(tokens_a) > max_seq_length - 2: + tokens_a = tokens_a[0:(max_seq_length - 2)] + + # The convention in BERT is: + # (a) For sequence pairs: + # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] + # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 + # (b) For single sequences: + # tokens: [CLS] the dog is hairy . [SEP] + # type_ids: 0 0 0 0 0 0 0 + # + # Where "type_ids" are used to indicate whether this is the first + # sequence or the second sequence. The embedding vectors for `type=0` and + # `type=1` were learned during pre-training and are added to the wordpiece + # embedding vector (and position vector). This is not *strictly* necessary + # since the [SEP] token unambiguously separates the sequences, but it makes + # it easier for the model to learn the concept of sequences. + # + # For classification tasks, the first vector (corresponding to [CLS]) is + # used as the "sentence vector". Note that this only makes sense because + # the entire model is fine-tuned. + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + tokens.append("[SEP]") + segment_ids.append(0) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + label_id = label_map[example.label] + if ex_index < 5: + tf.logging.info("*** Example ***") + tf.logging.info("guid: %s" % (example.guid)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info("segment_ids: %s" % " ".join([str(x) for x in segment_ids])) + tf.logging.info("label: %s (id = %d)" % (example.label, label_id)) + + feature = InputFeatures( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + label_id=label_id, + is_real_example=True) + return feature + + +def file_based_convert_examples_to_features( + examples, label_list, max_seq_length, tokenizer, output_file): + """Convert a set of `InputExample`s to a TFRecord file.""" + + writer = tf.python_io.TFRecordWriter(output_file) + + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + tf.logging.info("Writing example %d of %d" % (ex_index, len(examples))) + + feature = convert_single_example(ex_index, example, label_list, + max_seq_length, tokenizer) + + def create_int_feature(values): + f = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return f + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + features["label_ids"] = create_int_feature([feature.label_id]) + features["is_real_example"] = create_int_feature( + [int(feature.is_real_example)]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writer.write(tf_example.SerializeToString()) + writer.close() + + +def file_based_input_fn_builder(input_file, batch_size, seq_length, is_training, + drop_remainder, hvd=None): + """Creates an `input_fn` closure to be passed to TPUEstimator.""" + + name_to_features = { + "input_ids": tf.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.FixedLenFeature([seq_length], tf.int64), + "segment_ids": tf.FixedLenFeature([seq_length], tf.int64), + "label_ids": tf.FixedLenFeature([], tf.int64), + "is_real_example": tf.FixedLenFeature([], tf.int64), + } + + def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + + return example + + def input_fn(params): + """The actual input function.""" + #batch_size = params["batch_size"] + + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + d = tf.data.TFRecordDataset(input_file) + if is_training: + if hvd is not None: d = d.shard(hvd.size(), hvd.rank()) + d = d.repeat() + d = d.shuffle(buffer_size=100) + + d = d.apply( + tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + drop_remainder=drop_remainder)) + + return d + + return input_fn + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + + +def create_model(bert_config, is_training, input_ids, input_mask, segment_ids, + labels, num_labels, use_one_hot_embeddings): + """Creates a classification model.""" + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings) + + # In the demo, we are doing a simple classification task on the entire + # segment. + # + # If you want to use the token-level output, use model.get_sequence_output() + # instead. + output_layer = model.get_pooled_output() + + hidden_size = output_layer.shape[-1].value + + output_weights = tf.get_variable( + "output_weights", [num_labels, hidden_size], + initializer=tf.truncated_normal_initializer(stddev=0.02)) + + output_bias = tf.get_variable( + "output_bias", [num_labels], initializer=tf.zeros_initializer()) + + with tf.variable_scope("loss"): + if is_training: + # I.e., 0.1 dropout + output_layer = tf.nn.dropout(output_layer, keep_prob=0.9) + + logits = tf.matmul(output_layer, output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + probabilities = tf.nn.softmax(logits, axis=-1) + log_probs = tf.nn.log_softmax(logits, axis=-1) + + one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32) + + per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1) + loss = tf.reduce_mean(per_example_loss) + + return (loss, per_example_loss, logits, probabilities) + + +def model_fn_builder(bert_config, num_labels, init_checkpoint, learning_rate=None, + num_train_steps=None, num_warmup_steps=None, + use_one_hot_embeddings=False, hvd=None, use_fp16=False): + """Returns `model_fn` closure for TPUEstimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for TPUEstimator.""" + + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + label_ids = features["label_ids"] + is_real_example = None + if "is_real_example" in features: + is_real_example = tf.cast(features["is_real_example"], dtype=tf.float32) + else: + is_real_example = tf.ones(tf.shape(label_ids), dtype=tf.float32) + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + (total_loss, per_example_loss, logits, probabilities) = create_model( + bert_config, is_training, input_ids, input_mask, segment_ids, label_ids, + num_labels, use_one_hot_embeddings) + + tvars = tf.trainable_variables() + initialized_variable_names = {} + scaffold_fn = None + if init_checkpoint and (hvd is None or hvd.rank() == 0): + (assignment_map, initialized_variable_names + ) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, + init_string) + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, hvd, False, use_fp16) + + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.EVAL: + + def metric_fn(per_example_loss, label_ids, logits, is_real_example): + predictions = tf.argmax(logits, axis=-1, output_type=tf.int32) + accuracy = tf.metrics.accuracy( + labels=label_ids, predictions=predictions, weights=is_real_example) + loss = tf.metrics.mean(values=per_example_loss, weights=is_real_example) + return { + "eval_accuracy": accuracy, + "eval_loss": loss, + } + + eval_metric_ops = metric_fn(per_example_loss, label_ids, logits, is_real_example) + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + eval_metric_ops=eval_metric_ops) + else: + output_spec = tf.estimator.EstimatorSpec( + mode=mode, predictions={"probabilities": probabilities})#predicts)#probabilities) + return output_spec + + return model_fn + + +# This function is not used by this file but is still used by the Colab and +# people who depend on it. +def input_fn_builder(features, seq_length, is_training, drop_remainder): + """Creates an `input_fn` closure to be passed to TPUEstimator.""" + + all_input_ids = [] + all_input_mask = [] + all_segment_ids = [] + all_label_ids = [] + + for feature in features: + all_input_ids.append(feature.input_ids) + all_input_mask.append(feature.input_mask) + all_segment_ids.append(feature.segment_ids) + all_label_ids.append(feature.label_id) + + def input_fn(params): + """The actual input function.""" + batch_size = params["batch_size"] + + num_examples = len(features) + + # This is for demo purposes and does NOT scale to large data sets. We do + # not use Dataset.from_generator() because that uses tf.py_func which is + # not TPU compatible. The right way to load data is with TFRecordReader. + d = tf.data.Dataset.from_tensor_slices({ + "input_ids": + tf.constant( + all_input_ids, shape=[num_examples, seq_length], + dtype=tf.int32), + "input_mask": + tf.constant( + all_input_mask, + shape=[num_examples, seq_length], + dtype=tf.int32), + "segment_ids": + tf.constant( + all_segment_ids, + shape=[num_examples, seq_length], + dtype=tf.int32), + "label_ids": + tf.constant(all_label_ids, shape=[num_examples], dtype=tf.int32), + }) + + if is_training: + d = d.repeat() + d = d.shuffle(buffer_size=100) + + d = d.batch(batch_size=batch_size, drop_remainder=drop_remainder) + return d + + return input_fn + + +# This function is not used by this file but is still used by the Colab and +# people who depend on it. +def convert_examples_to_features(examples, label_list, max_seq_length, + tokenizer): + """Convert a set of `InputExample`s to a list of `InputFeatures`.""" + + features = [] + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + tf.logging.info("Writing example %d of %d" % (ex_index, len(examples))) + + feature = convert_single_example(ex_index, example, label_list, + max_seq_length, tokenizer) + + features.append(feature) + return features + + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + if FLAGS.horovod: + hvd.init() + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + + processors = { + "chemprot": ChemProtProcessor, + 'mednli': MedNLIProcessor, + } + + tokenization.validate_case_matches_checkpoint(FLAGS.do_lower_case, + FLAGS.init_checkpoint) + + if not FLAGS.do_train and not FLAGS.do_eval and not FLAGS.do_predict: + raise ValueError( + "At least one of `do_train`, `do_eval` or `do_predict' must be True.") + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + if FLAGS.max_seq_length > bert_config.max_position_embeddings: + raise ValueError( + "Cannot use sequence length %d because the BERT model " + "was only trained up to sequence length %d" % + (FLAGS.max_seq_length, bert_config.max_position_embeddings)) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + task_name = FLAGS.task_name.lower() + + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + + processor = processors[task_name]() + + label_list = processor.get_labels() + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + is_per_host = tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2 + + master_process = True + training_hooks = [] + global_batch_size = FLAGS.train_batch_size + hvd_rank = 0 + + config = tf.ConfigProto() + if FLAGS.horovod: + global_batch_size = FLAGS.train_batch_size * hvd.size() + master_process = (hvd.rank() == 0) + hvd_rank = hvd.rank() + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + run_config = tf.estimator.RunConfig( + model_dir=FLAGS.output_dir if master_process else None, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if master_process else None, + keep_checkpoint_max=1) + + if master_process: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + + train_examples = None + num_train_steps = None + num_warmup_steps = None + + training_hooks.append(LogTrainRunHook(global_batch_size, hvd_rank)) + + if FLAGS.do_train: + train_examples = processor.get_train_examples(FLAGS.data_dir) + num_train_steps = int( + len(train_examples) / global_batch_size * FLAGS.num_train_epochs) + num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion) + + start_index = 0 + end_index = len(train_examples) + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record")] + + if FLAGS.horovod: + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record{}".format(i)) for i in range(hvd.size())] + num_examples_per_rank = len(train_examples) // hvd.size() + remainder = len(train_examples) % hvd.size() + if hvd.rank() < remainder: + start_index = hvd.rank() * (num_examples_per_rank+1) + end_index = start_index + num_examples_per_rank + 1 + else: + start_index = hvd.rank() * num_examples_per_rank + remainder + end_index = start_index + (num_examples_per_rank) + + + model_fn = model_fn_builder( + bert_config=bert_config, + num_labels=len(label_list), + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=FLAGS.learning_rate if not FLAGS.horovod else FLAGS.learning_rate * hvd.size(), + num_train_steps=num_train_steps, + num_warmup_steps=num_warmup_steps, + use_one_hot_embeddings=False, + hvd=None if not FLAGS.horovod else hvd, + use_fp16=FLAGS.use_fp16) + + estimator = tf.estimator.Estimator( + model_fn=model_fn, + config=run_config) + + + if FLAGS.do_train: + file_based_convert_examples_to_features( + train_examples[start_index:end_index], label_list, FLAGS.max_seq_length, tokenizer, tmp_filenames[hvd_rank]) + tf.logging.info("***** Running training *****") + tf.logging.info(" Num examples = %d", len(train_examples)) + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + tf.logging.info(" Num steps = %d", num_train_steps) + train_input_fn = file_based_input_fn_builder( + input_file=tmp_filenames, + batch_size=FLAGS.train_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=True, + drop_remainder=True, + hvd=None if not FLAGS.horovod else hvd) + + train_start_time = time.time() + estimator.train(input_fn=train_input_fn, max_steps=num_train_steps, hooks=training_hooks) + train_time_elapsed = time.time() - train_start_time + train_time_wo_overhead = training_hooks[-1].total_time + avg_sentences_per_second = num_train_steps * global_batch_size * 1.0 / train_time_elapsed + ss_sentences_per_second = (num_train_steps - training_hooks[-1].skipped) * global_batch_size * 1.0 / train_time_wo_overhead + + if master_process: + tf.logging.info("-----------------------------") + tf.logging.info("Total Training Time = %0.2f for Sentences = %d", train_time_elapsed, + num_train_steps * global_batch_size) + tf.logging.info("Total Training Time W/O Overhead = %0.2f for Sentences = %d", train_time_wo_overhead, + (num_train_steps - training_hooks[-1].skipped) * global_batch_size) + tf.logging.info("Throughput Average (sentences/sec) with overhead = %0.2f", avg_sentences_per_second) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + + if FLAGS.do_eval and master_process: + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + num_actual_eval_examples = len(eval_examples) + + + eval_file = os.path.join(FLAGS.output_dir, "eval.tf_record") + file_based_convert_examples_to_features( + eval_examples, label_list, FLAGS.max_seq_length, tokenizer, eval_file) + + tf.logging.info("***** Running evaluation *****") + tf.logging.info(" Num examples = %d (%d actual, %d padding)", + len(eval_examples), num_actual_eval_examples, + len(eval_examples) - num_actual_eval_examples) + tf.logging.info(" Batch size = %d", FLAGS.eval_batch_size) + + # This tells the estimator to run through the entire set. + eval_steps = None + + eval_drop_remainder = False + eval_input_fn = file_based_input_fn_builder( + input_file=eval_file, + batch_size=FLAGS.eval_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=eval_drop_remainder) + + result = estimator.evaluate(input_fn=eval_input_fn, steps=eval_steps) + + output_eval_file = os.path.join(FLAGS.output_dir, "eval_results.txt") + with tf.gfile.GFile(output_eval_file, "w") as writer: + tf.logging.info("***** Eval results *****") + for key in sorted(result.keys()): + tf.logging.info(" %s = %s", key, str(result[key])) + writer.write("%s = %s\n" % (key, str(result[key]))) + + if FLAGS.do_predict and master_process: + predict_examples = processor.get_test_examples(FLAGS.data_dir) + num_actual_predict_examples = len(predict_examples) + + predict_file = os.path.join(FLAGS.output_dir, "predict.tf_record") + file_based_convert_examples_to_features(predict_examples, label_list, + FLAGS.max_seq_length, tokenizer, + predict_file) + + tf.logging.info("***** Running prediction*****") + tf.logging.info(" Num examples = %d (%d actual, %d padding)", + len(predict_examples), num_actual_predict_examples, + len(predict_examples) - num_actual_predict_examples) + tf.logging.info(" Batch size = %d", FLAGS.predict_batch_size) + + predict_drop_remainder = False + predict_input_fn = file_based_input_fn_builder( + input_file=predict_file, + batch_size=FLAGS.predict_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=predict_drop_remainder) + + eval_hooks = [LogEvalRunHook(FLAGS.predict_batch_size)] + eval_start_time = time.time() + + + output_predict_file = os.path.join(FLAGS.output_dir, "test_results.tsv") + with tf.gfile.GFile(output_predict_file, "w") as writer: + num_written_lines = 0 + tf.logging.info("***** Predict results *****") + for prediction in estimator.predict(input_fn=predict_input_fn, hooks=eval_hooks, + yield_single_examples=True): + probabilities = prediction["probabilities"] + output_line = "\t".join( + str(class_probability) + for class_probability in probabilities) + "\n" + writer.write(output_line) + num_written_lines += 1 + assert num_written_lines == num_actual_predict_examples + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + time_list = eval_hooks[-1].time_list + time_list.sort() + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size + + avg = np.mean(time_list) + cf_50 = max(time_list[:int(len(time_list) * 0.50)]) + cf_90 = max(time_list[:int(len(time_list) * 0.90)]) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.predict_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size) + tf.logging.info("Summary Inference Statistics") + tf.logging.info("Batch size = %d", FLAGS.predict_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Latency Confidence Level 50 (ms) = %0.2f", cf_50 * 1000) + tf.logging.info("Latency Confidence Level 90 (ms) = %0.2f", cf_90 * 1000) + tf.logging.info("Latency Confidence Level 95 (ms) = %0.2f", cf_95 * 1000) + tf.logging.info("Latency Confidence Level 99 (ms) = %0.2f", cf_99 * 1000) + tf.logging.info("Latency Confidence Level 100 (ms) = %0.2f", cf_100 * 1000) + tf.logging.info("Latency Average (ms) = %0.2f", avg * 1000) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + +if __name__ == "__main__": + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("task_name") + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_squad.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_squad.py new file mode 100644 index 0000000..256477d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/run_squad.py @@ -0,0 +1,1158 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Run BERT on SQuAD 1.1 and SQuAD 2.0.""" + +from __future__ import absolute_import, division, print_function + +import collections +import json +import math +import os +import random +import shutil +import time + +import horovod.tensorflow as hvd +import numpy as np +import six +import tensorflow as tf +from tensorflow.python.client import device_lib + +import modeling +import optimization +import tokenization +from utils.create_squad_data import * +from utils.utils import LogEvalRunHook, LogTrainRunHook + +flags = tf.flags + +FLAGS = flags.FLAGS + +## Required parameters +flags.DEFINE_string( + "bert_config_file", None, + "The config json file corresponding to the pre-trained BERT model. " + "This specifies the model architecture.") + +flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + +flags.DEFINE_string( + "output_dir", None, + "The output directory where the model checkpoints will be written.") + +## Other parameters +flags.DEFINE_string("train_file", None, + "SQuAD json for training. E.g., train-v1.1.json") + +flags.DEFINE_string( + "predict_file", None, + "SQuAD json for predictions. E.g., dev-v1.1.json or test-v1.1.json") + +flags.DEFINE_string( + "init_checkpoint", None, + "Initial checkpoint (usually from a pre-trained BERT model).") + +flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + +flags.DEFINE_integer( + "max_seq_length", 384, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + +flags.DEFINE_integer( + "doc_stride", 128, + "When splitting up a long document into chunks, how much stride to " + "take between chunks.") + +flags.DEFINE_integer( + "max_query_length", 64, + "The maximum number of tokens for the question. Questions longer than " + "this will be truncated to this length.") + +flags.DEFINE_bool("do_train", False, "Whether to run training.") + +flags.DEFINE_bool("do_predict", False, "Whether to run eval on the dev set.") + +flags.DEFINE_integer("train_batch_size", 8, "Total batch size for training.") + +flags.DEFINE_integer("predict_batch_size", 8, + "Total batch size for predictions.") + +flags.DEFINE_float("learning_rate", 5e-6, "The initial learning rate for Adam.") + +flags.DEFINE_bool("use_trt", False, "Whether to use TF-TRT") + +flags.DEFINE_bool("horovod", False, "Whether to use Horovod for multi-gpu runs") +flags.DEFINE_float("num_train_epochs", 3.0, + "Total number of training epochs to perform.") + +flags.DEFINE_float( + "warmup_proportion", 0.1, + "Proportion of training to perform linear learning rate warmup for. " + "E.g., 0.1 = 10% of training.") + +flags.DEFINE_integer("save_checkpoints_steps", 1000, + "How often to save the model checkpoint.") + +flags.DEFINE_integer("iterations_per_loop", 1000, + "How many steps to make in each estimator call.") + +flags.DEFINE_integer("num_accumulation_steps", 1, + "Number of accumulation steps before gradient update" + "Global batch size = num_accumulation_steps * train_batch_size") + +flags.DEFINE_integer( + "n_best_size", 20, + "The total number of n-best predictions to generate in the " + "nbest_predictions.json output file.") + +flags.DEFINE_integer( + "max_answer_length", 30, + "The maximum length of an answer that can be generated. This is needed " + "because the start and end predictions are not conditioned on one another.") + + +flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the warnings related to data processing will be printed. " + "A number of warnings are expected for a normal SQuAD evaluation.") + +flags.DEFINE_bool( + "version_2_with_negative", False, + "If true, the SQuAD examples contain some that do not have an answer.") + +flags.DEFINE_float( + "null_score_diff_threshold", 0.0, + "If null_score - best_non_null is greater than the threshold predict null.") + +flags.DEFINE_bool("use_fp16", False, "Whether to use fp32 or fp16 arithmetic on GPU.") +flags.DEFINE_bool("use_xla", False, "Whether to enable XLA JIT compilation.") +flags.DEFINE_integer("num_eval_iterations", None, + "How many eval iterations to run - performs inference on subset") + +# TRTIS Specific flags +flags.DEFINE_bool("export_trtis", False, "Whether to export saved model or run inference with TRTIS") +flags.DEFINE_string("trtis_model_name", "bert", "exports to appropriate directory for TRTIS") +flags.DEFINE_integer("trtis_model_version", 1, "exports to appropriate directory for TRTIS") +flags.DEFINE_string("trtis_server_url", "localhost:8001", "exports to appropriate directory for TRTIS") +flags.DEFINE_bool("trtis_model_overwrite", False, "If True, will overwrite an existing directory with the specified 'model_name' and 'version_name'") +flags.DEFINE_integer("trtis_max_batch_size", 8, "Specifies the 'max_batch_size' in the TRTIS model config. See the TRTIS documentation for more info.") +flags.DEFINE_float("trtis_dyn_batching_delay", 0, "Determines the dynamic_batching queue delay in milliseconds(ms) for the TRTIS model config. Use '0' or '-1' to specify static batching. See the TRTIS documentation for more info.") +flags.DEFINE_integer("trtis_engine_count", 1, "Specifies the 'instance_group' count value in the TRTIS model config. See the TRTIS documentation for more info.") + + +def create_model(bert_config, is_training, input_ids, input_mask, segment_ids, + use_one_hot_embeddings): + """Creates a classification model.""" + model = modeling.BertModel( + config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + token_type_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings, + compute_type=tf.float32) + + final_hidden = model.get_sequence_output() + + final_hidden_shape = modeling.get_shape_list(final_hidden, expected_rank=3) + batch_size = final_hidden_shape[0] + seq_length = final_hidden_shape[1] + hidden_size = final_hidden_shape[2] + + output_weights = tf.get_variable( + "cls/squad/output_weights", [2, hidden_size], + initializer=tf.truncated_normal_initializer(stddev=0.02)) + + output_bias = tf.get_variable( + "cls/squad/output_bias", [2], initializer=tf.zeros_initializer()) + + final_hidden_matrix = tf.reshape(final_hidden, + [batch_size * seq_length, hidden_size]) + logits = tf.matmul(final_hidden_matrix, output_weights, transpose_b=True) + logits = tf.nn.bias_add(logits, output_bias) + + logits = tf.reshape(logits, [batch_size, seq_length, 2]) + logits = tf.transpose(logits, [2, 0, 1]) + + unstacked_logits = tf.unstack(logits, axis=0, name='unstack') + + (start_logits, end_logits) = (unstacked_logits[0], unstacked_logits[1]) + + return (start_logits, end_logits) + +def get_frozen_tftrt_model(bert_config, shape, use_one_hot_embeddings, init_checkpoint): + tf_config = tf.ConfigProto() + output_node_names = ['unstack'] + + with tf.Session(config=tf_config) as tf_sess: + input_ids = tf.placeholder(tf.int32, shape, 'input_ids') + input_mask = tf.placeholder(tf.int32, shape, 'input_mask') + segment_ids = tf.placeholder(tf.int32, shape, 'segment_ids') + + (start_logits, end_logits) = create_model(bert_config=bert_config, + is_training=False, + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings) + + + tvars = tf.trainable_variables() + (assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + tf_sess.run(tf.global_variables_initializer()) + print("LOADED!") + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + else: + init_string = ", *NOTTTTTTTTTTTTTTTTTTTTT" + tf.logging.info(" name = %s, shape = %s%s", var.name, var.shape, init_string) + + frozen_graph = tf.graph_util.convert_variables_to_constants(tf_sess, + tf_sess.graph.as_graph_def(), output_node_names) + + num_nodes = len(frozen_graph.node) + print('Converting graph using TensorFlow-TensorRT...') + from tensorflow.python.compiler.tensorrt import trt_convert as trt + converter = trt.TrtGraphConverter( + input_graph_def=frozen_graph, + nodes_blacklist=output_node_names, + max_workspace_size_bytes=(4096 << 20) - 1000, + precision_mode = "FP16" if FLAGS.use_fp16 else "FP32", + minimum_segment_size=4, + is_dynamic_op=True, + maximum_cached_engines=1000 + ) + frozen_graph = converter.convert() + + print('Total node count before and after TF-TRT conversion:', + num_nodes, '->', len(frozen_graph.node)) + print('TRT node count:', + len([1 for n in frozen_graph.node if str(n.op) == 'TRTEngineOp'])) + + with tf.gfile.GFile("frozen_modelTRT.pb", "wb") as f: + f.write(frozen_graph.SerializeToString()) + + return frozen_graph + + +def model_fn_builder(bert_config, init_checkpoint, learning_rate, + num_train_steps, num_warmup_steps, + hvd=None, use_fp16=False, use_one_hot_embeddings=False): + """Returns `model_fn` closure for Estimator.""" + + def model_fn(features, labels, mode, params): # pylint: disable=unused-argument + """The `model_fn` for Estimator.""" + if FLAGS.verbose_logging: + tf.logging.info("*** Features ***") + for name in sorted(features.keys()): + tf.logging.info(" name = %s, shape = %s" % (name, features[name].shape)) + + unique_ids = features["unique_ids"] + input_ids = features["input_ids"] + input_mask = features["input_mask"] + segment_ids = features["segment_ids"] + + is_training = (mode == tf.estimator.ModeKeys.TRAIN) + + if not is_training and FLAGS.use_trt: + trt_graph = get_frozen_tftrt_model(bert_config, input_ids.shape, use_one_hot_embeddings, init_checkpoint) + (start_logits, end_logits) = tf.import_graph_def(trt_graph, + input_map={'input_ids':input_ids, 'input_mask':input_mask, 'segment_ids':segment_ids}, + return_elements=['unstack:0', 'unstack:1'], + name='') + predictions = { + "unique_ids": unique_ids, + "start_logits": start_logits, + "end_logits": end_logits, + } + output_spec = tf.estimator.TPUEstimatorSpec( + mode=mode, predictions=predictions) + return output_spec + + (start_logits, end_logits) = create_model( + bert_config=bert_config, + is_training=is_training, + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + use_one_hot_embeddings=use_one_hot_embeddings) + + tvars = tf.trainable_variables() + + initialized_variable_names = {} + if init_checkpoint and (hvd is None or hvd.rank() == 0): + (assignment_map, initialized_variable_names + ) = modeling.get_assignment_map_from_checkpoint(tvars, init_checkpoint) + + tf.train.init_from_checkpoint(init_checkpoint, assignment_map) + + if FLAGS.verbose_logging: + tf.logging.info("**** Trainable Variables ****") + for var in tvars: + init_string = "" + if var.name in initialized_variable_names: + init_string = ", *INIT_FROM_CKPT*" + tf.logging.info(" %d name = %s, shape = %s%s", 0 if hvd is None else hvd.rank(), var.name, var.shape, + init_string) + + + output_spec = None + if mode == tf.estimator.ModeKeys.TRAIN: + seq_length = modeling.get_shape_list(input_ids)[1] + + def compute_loss(logits, positions): + one_hot_positions = tf.one_hot( + positions, depth=seq_length, dtype=tf.float32) + log_probs = tf.nn.log_softmax(logits, axis=-1) + loss = -tf.reduce_mean( + tf.reduce_sum(one_hot_positions * log_probs, axis=-1)) + return loss + + start_positions = features["start_positions"] + end_positions = features["end_positions"] + + start_loss = compute_loss(start_logits, start_positions) + end_loss = compute_loss(end_logits, end_positions) + + total_loss = (start_loss + end_loss) / 2.0 + + train_op = optimization.create_optimizer( + total_loss, learning_rate, num_train_steps, num_warmup_steps, hvd, False, use_fp16, FLAGS.num_accumulation_steps) + + output_spec = tf.estimator.EstimatorSpec( + mode=mode, + loss=total_loss, + train_op=train_op) + elif mode == tf.estimator.ModeKeys.PREDICT: + predictions = { + "unique_ids": unique_ids, + "start_logits": start_logits, + "end_logits": end_logits, + } + output_spec = tf.estimator.EstimatorSpec( + mode=mode, predictions=predictions) + else: + raise ValueError( + "Only TRAIN and PREDICT modes are supported: %s" % (mode)) + + return output_spec + + return model_fn + + +def input_fn_builder(input_file, batch_size, seq_length, is_training, drop_remainder, hvd=None): + """Creates an `input_fn` closure to be passed to Estimator.""" + + name_to_features = { + "unique_ids": tf.FixedLenFeature([], tf.int64), + "input_ids": tf.FixedLenFeature([seq_length], tf.int64), + "input_mask": tf.FixedLenFeature([seq_length], tf.int64), + "segment_ids": tf.FixedLenFeature([seq_length], tf.int64), + } + + if is_training: + name_to_features["start_positions"] = tf.FixedLenFeature([], tf.int64) + name_to_features["end_positions"] = tf.FixedLenFeature([], tf.int64) + + def _decode_record(record, name_to_features): + """Decodes a record to a TensorFlow example.""" + example = tf.parse_single_example(record, name_to_features) + + # tf.Example only supports tf.int64, but the TPU only supports tf.int32. + # So cast all int64 to int32. + for name in list(example.keys()): + t = example[name] + if t.dtype == tf.int64: + t = tf.to_int32(t) + example[name] = t + + return example + + def input_fn(): + """The actual input function.""" + + # For training, we want a lot of parallel reading and shuffling. + # For eval, we want no shuffling and parallel reading doesn't matter. + if is_training: + d = tf.data.TFRecordDataset(input_file, num_parallel_reads=4) + if hvd is not None: d = d.shard(hvd.size(), hvd.rank()) + d = d.apply(tf.data.experimental.ignore_errors()) + d = d.shuffle(buffer_size=100) + d = d.repeat() + else: + d = tf.data.TFRecordDataset(input_file) + + + d = d.apply( + tf.contrib.data.map_and_batch( + lambda record: _decode_record(record, name_to_features), + batch_size=batch_size, + drop_remainder=drop_remainder)) + + return d + + return input_fn + + + +RawResult = collections.namedtuple("RawResult", + ["unique_id", "start_logits", "end_logits"]) + + +def write_predictions(all_examples, all_features, all_results, n_best_size, + max_answer_length, do_lower_case, output_prediction_file, + output_nbest_file, output_null_log_odds_file): + """Write final predictions to the json file and log-odds of null if needed.""" + tf.logging.info("Writing predictions to: %s" % (output_prediction_file)) + tf.logging.info("Writing nbest to: %s" % (output_nbest_file)) + + example_index_to_features = collections.defaultdict(list) + for feature in all_features: + example_index_to_features[feature.example_index].append(feature) + + unique_id_to_result = {} + for result in all_results: + unique_id_to_result[result.unique_id] = result + + _PrelimPrediction = collections.namedtuple( # pylint: disable=invalid-name + "PrelimPrediction", + ["feature_index", "start_index", "end_index", "start_logit", "end_logit"]) + + all_predictions = collections.OrderedDict() + all_nbest_json = collections.OrderedDict() + scores_diff_json = collections.OrderedDict() + + for (example_index, example) in enumerate(all_examples): + features = example_index_to_features[example_index] + + prelim_predictions = [] + # keep track of the minimum score of null start+end of position 0 + score_null = 1000000 # large and positive + min_null_feature_index = 0 # the paragraph slice with min mull score + null_start_logit = 0 # the start logit at the slice with min null score + null_end_logit = 0 # the end logit at the slice with min null score + for (feature_index, feature) in enumerate(features): + result = unique_id_to_result[feature.unique_id] + start_indexes = _get_best_indexes(result.start_logits, n_best_size) + end_indexes = _get_best_indexes(result.end_logits, n_best_size) + # if we could have irrelevant answers, get the min score of irrelevant + if FLAGS.version_2_with_negative: + feature_null_score = result.start_logits[0] + result.end_logits[0] + if feature_null_score < score_null: + score_null = feature_null_score + min_null_feature_index = feature_index + null_start_logit = result.start_logits[0] + null_end_logit = result.end_logits[0] + for start_index in start_indexes: + for end_index in end_indexes: + # We could hypothetically create invalid predictions, e.g., predict + # that the start of the span is in the question. We throw out all + # invalid predictions. + if start_index >= len(feature.tokens): + continue + if end_index >= len(feature.tokens): + continue + if start_index not in feature.token_to_orig_map: + continue + if end_index not in feature.token_to_orig_map: + continue + if not feature.token_is_max_context.get(start_index, False): + continue + if end_index < start_index: + continue + length = end_index - start_index + 1 + if length > max_answer_length: + continue + prelim_predictions.append( + _PrelimPrediction( + feature_index=feature_index, + start_index=start_index, + end_index=end_index, + start_logit=result.start_logits[start_index], + end_logit=result.end_logits[end_index])) + + if FLAGS.version_2_with_negative: + prelim_predictions.append( + _PrelimPrediction( + feature_index=min_null_feature_index, + start_index=0, + end_index=0, + start_logit=null_start_logit, + end_logit=null_end_logit)) + prelim_predictions = sorted( + prelim_predictions, + key=lambda x: (x.start_logit + x.end_logit), + reverse=True) + + _NbestPrediction = collections.namedtuple( # pylint: disable=invalid-name + "NbestPrediction", ["text", "start_logit", "end_logit"]) + + seen_predictions = {} + nbest = [] + for pred in prelim_predictions: + if len(nbest) >= n_best_size: + break + feature = features[pred.feature_index] + if pred.start_index > 0: # this is a non-null prediction + tok_tokens = feature.tokens[pred.start_index:(pred.end_index + 1)] + orig_doc_start = feature.token_to_orig_map[pred.start_index] + orig_doc_end = feature.token_to_orig_map[pred.end_index] + orig_tokens = example.doc_tokens[orig_doc_start:(orig_doc_end + 1)] + tok_text = " ".join(tok_tokens) + + # De-tokenize WordPieces that have been split off. + tok_text = tok_text.replace(" ##", "") + tok_text = tok_text.replace("##", "") + + # Clean whitespace + tok_text = tok_text.strip() + tok_text = " ".join(tok_text.split()) + orig_text = " ".join(orig_tokens) + + final_text = get_final_text(tok_text, orig_text, do_lower_case) + if final_text in seen_predictions: + continue + + seen_predictions[final_text] = True + else: + final_text = "" + seen_predictions[final_text] = True + + nbest.append( + _NbestPrediction( + text=final_text, + start_logit=pred.start_logit, + end_logit=pred.end_logit)) + + # if we didn't inlude the empty option in the n-best, inlcude it + if FLAGS.version_2_with_negative: + if "" not in seen_predictions: + nbest.append( + _NbestPrediction( + text="", start_logit=null_start_logit, + end_logit=null_end_logit)) + # In very rare edge cases we could have no valid predictions. So we + # just create a nonce prediction in this case to avoid failure. + if not nbest: + nbest.append( + _NbestPrediction(text="empty", start_logit=0.0, end_logit=0.0)) + + assert len(nbest) >= 1 + + total_scores = [] + best_non_null_entry = None + for entry in nbest: + total_scores.append(entry.start_logit + entry.end_logit) + if not best_non_null_entry: + if entry.text: + best_non_null_entry = entry + + probs = _compute_softmax(total_scores) + + nbest_json = [] + for (i, entry) in enumerate(nbest): + output = collections.OrderedDict() + output["text"] = entry.text + output["probability"] = probs[i] + output["start_logit"] = entry.start_logit + output["end_logit"] = entry.end_logit + nbest_json.append(output) + + assert len(nbest_json) >= 1 + + if not FLAGS.version_2_with_negative: + all_predictions[example.qas_id] = nbest_json[0]["text"] + else: + # predict "" iff the null score - the score of best non-null > threshold + score_diff = score_null - best_non_null_entry.start_logit - ( + best_non_null_entry.end_logit) + scores_diff_json[example.qas_id] = score_diff + if score_diff > FLAGS.null_score_diff_threshold: + all_predictions[example.qas_id] = "" + else: + all_predictions[example.qas_id] = best_non_null_entry.text + + all_nbest_json[example.qas_id] = nbest_json + + with tf.gfile.GFile(output_prediction_file, "w") as writer: + writer.write(json.dumps(all_predictions, indent=4) + "\n") + + with tf.gfile.GFile(output_nbest_file, "w") as writer: + writer.write(json.dumps(all_nbest_json, indent=4) + "\n") + + if FLAGS.version_2_with_negative: + with tf.gfile.GFile(output_null_log_odds_file, "w") as writer: + writer.write(json.dumps(scores_diff_json, indent=4) + "\n") + + +def get_final_text(pred_text, orig_text, do_lower_case): + """Project the tokenized prediction back to the original text.""" + + # When we created the data, we kept track of the alignment between original + # (whitespace tokenized) tokens and our WordPiece tokenized tokens. So + # now `orig_text` contains the span of our original text corresponding to the + # span that we predicted. + # + # However, `orig_text` may contain extra characters that we don't want in + # our prediction. + # + # For example, let's say: + # pred_text = steve smith + # orig_text = Steve Smith's + # + # We don't want to return `orig_text` because it contains the extra "'s". + # + # We don't want to return `pred_text` because it's already been normalized + # (the SQuAD eval script also does punctuation stripping/lower casing but + # our tokenizer does additional normalization like stripping accent + # characters). + # + # What we really want to return is "Steve Smith". + # + # Therefore, we have to apply a semi-complicated alignment heruistic between + # `pred_text` and `orig_text` to get a character-to-charcter alignment. This + # can fail in certain cases in which case we just return `orig_text`. + + def _strip_spaces(text): + ns_chars = [] + ns_to_s_map = collections.OrderedDict() + for (i, c) in enumerate(text): + if c == " ": + continue + ns_to_s_map[len(ns_chars)] = i + ns_chars.append(c) + ns_text = "".join(ns_chars) + return (ns_text, ns_to_s_map) + + # We first tokenize `orig_text`, strip whitespace from the result + # and `pred_text`, and check if they are the same length. If they are + # NOT the same length, the heuristic has failed. If they are the same + # length, we assume the characters are one-to-one aligned. + tokenizer = tokenization.BasicTokenizer(do_lower_case=do_lower_case) + + tok_text = " ".join(tokenizer.tokenize(orig_text)) + + start_position = tok_text.find(pred_text) + if start_position == -1: + if FLAGS.verbose_logging: + tf.logging.info( + "Unable to find text: '%s' in '%s'" % (pred_text, orig_text)) + return orig_text + end_position = start_position + len(pred_text) - 1 + + (orig_ns_text, orig_ns_to_s_map) = _strip_spaces(orig_text) + (tok_ns_text, tok_ns_to_s_map) = _strip_spaces(tok_text) + + if len(orig_ns_text) != len(tok_ns_text): + if FLAGS.verbose_logging: + tf.logging.info("Length not equal after stripping spaces: '%s' vs '%s'", + orig_ns_text, tok_ns_text) + return orig_text + + # We then project the characters in `pred_text` back to `orig_text` using + # the character-to-character alignment. + tok_s_to_ns_map = {} + for (i, tok_index) in six.iteritems(tok_ns_to_s_map): + tok_s_to_ns_map[tok_index] = i + + orig_start_position = None + if start_position in tok_s_to_ns_map: + ns_start_position = tok_s_to_ns_map[start_position] + if ns_start_position in orig_ns_to_s_map: + orig_start_position = orig_ns_to_s_map[ns_start_position] + + if orig_start_position is None: + if FLAGS.verbose_logging: + tf.logging.info("Couldn't map start position") + return orig_text + + orig_end_position = None + if end_position in tok_s_to_ns_map: + ns_end_position = tok_s_to_ns_map[end_position] + if ns_end_position in orig_ns_to_s_map: + orig_end_position = orig_ns_to_s_map[ns_end_position] + + if orig_end_position is None: + if FLAGS.verbose_logging: + tf.logging.info("Couldn't map end position") + return orig_text + + output_text = orig_text[orig_start_position:(orig_end_position + 1)] + return output_text + + +def _get_best_indexes(logits, n_best_size): + """Get the n-best logits from a list.""" + index_and_score = sorted(enumerate(logits), key=lambda x: x[1], reverse=True) + + best_indexes = [] + for i in range(len(index_and_score)): + if i >= n_best_size: + break + best_indexes.append(index_and_score[i][0]) + return best_indexes + + +def _compute_softmax(scores): + """Compute softmax probability over raw logits.""" + if not scores: + return [] + + max_score = None + for score in scores: + if max_score is None or score > max_score: + max_score = score + + exp_scores = [] + total_sum = 0.0 + for score in scores: + x = math.exp(score - max_score) + exp_scores.append(x) + total_sum += x + + probs = [] + for score in exp_scores: + probs.append(score / total_sum) + return probs + + + +def validate_flags_or_throw(bert_config): + """Validate the input FLAGS or throw an exception.""" + tokenization.validate_case_matches_checkpoint(FLAGS.do_lower_case, + FLAGS.init_checkpoint) + + if not FLAGS.do_train and not FLAGS.do_predict and not FLAGS.export_trtis: + raise ValueError("At least one of `do_train` or `do_predict` or `export_SavedModel` must be True.") + + if FLAGS.do_train: + if not FLAGS.train_file: + raise ValueError( + "If `do_train` is True, then `train_file` must be specified.") + if FLAGS.do_predict: + if not FLAGS.predict_file: + raise ValueError( + "If `do_predict` is True, then `predict_file` must be specified.") + + if FLAGS.max_seq_length > bert_config.max_position_embeddings: + raise ValueError( + "Cannot use sequence length %d because the BERT model " + "was only trained up to sequence length %d" % + (FLAGS.max_seq_length, bert_config.max_position_embeddings)) + + if FLAGS.max_seq_length <= FLAGS.max_query_length + 3: + raise ValueError( + "The max_seq_length (%d) must be greater than max_query_length " + "(%d) + 3" % (FLAGS.max_seq_length, FLAGS.max_query_length)) + + +def export_model(estimator, export_dir, init_checkpoint): + """Exports a checkpoint in SavedModel format in a directory structure compatible with TRTIS.""" + + + def serving_input_fn(): + label_ids = tf.placeholder(tf.int32, [None,], name='unique_ids') + input_ids = tf.placeholder(tf.int32, [None, FLAGS.max_seq_length], name='input_ids') + input_mask = tf.placeholder(tf.int32, [None, FLAGS.max_seq_length], name='input_mask') + segment_ids = tf.placeholder(tf.int32, [None, FLAGS.max_seq_length], name='segment_ids') + input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn({ + 'unique_ids': label_ids, + 'input_ids': input_ids, + 'input_mask': input_mask, + 'segment_ids': segment_ids, + })() + return input_fn + + saved_dir = estimator.export_savedmodel( + export_dir, + serving_input_fn, + assets_extra=None, + as_text=False, + checkpoint_path=init_checkpoint, + strip_default_attrs=False) + + model_name = FLAGS.trtis_model_name + + model_folder = export_dir + "/trtis_models/" + model_name + version_folder = model_folder + "/" + str(FLAGS.trtis_model_version) + final_model_folder = version_folder + "/model.savedmodel" + + if not os.path.exists(version_folder): + os.makedirs(version_folder) + + if (not os.path.exists(final_model_folder)): + os.rename(saved_dir, final_model_folder) + print("Model saved to dir", final_model_folder) + else: + if (FLAGS.trtis_model_overwrite): + shutil.rmtree(final_model_folder) + os.rename(saved_dir, final_model_folder) + print("WARNING: Existing model was overwritten. Model dir: {}".format(final_model_folder)) + else: + print("ERROR: Could not save TRTIS model. Folder already exists. Use '--trtis_model_overwrite=True' if you would like to overwrite an existing model. Model dir: {}".format(final_model_folder)) + return + + # Now build the config for TRTIS. Check to make sure we can overwrite it, if it exists + config_filename = os.path.join(model_folder, "config.pbtxt") + + if (os.path.exists(config_filename) and not FLAGS.trtis_model_overwrite): + print("ERROR: Could not save TRTIS model config. Config file already exists. Use '--trtis_model_overwrite=True' if you would like to overwrite an existing model config. Model config: {}".format(config_filename)) + return + + config_template = r""" +name: "{model_name}" +platform: "tensorflow_savedmodel" +max_batch_size: {max_batch_size} +input [ + {{ + name: "unique_ids" + data_type: TYPE_INT32 + dims: [ 1 ] + reshape: {{ shape: [ ] }} + }}, + {{ + name: "segment_ids" + data_type: TYPE_INT32 + dims: {seq_length} + }}, + {{ + name: "input_ids" + data_type: TYPE_INT32 + dims: {seq_length} + }}, + {{ + name: "input_mask" + data_type: TYPE_INT32 + dims: {seq_length} + }} + ] + output [ + {{ + name: "end_logits" + data_type: TYPE_FP32 + dims: {seq_length} + }}, + {{ + name: "start_logits" + data_type: TYPE_FP32 + dims: {seq_length} + }} +] +{dynamic_batching} +instance_group [ + {{ + count: {engine_count} + kind: KIND_GPU + gpus: [{gpu_list}] + }} +]""" + + batching_str = "" + max_batch_size = FLAGS.trtis_max_batch_size + + if (FLAGS.trtis_dyn_batching_delay > 0): + + # Use only full and half full batches + pref_batch_size = [int(max_batch_size / 2.0), max_batch_size] + + batching_str = r""" +dynamic_batching {{ + preferred_batch_size: [{0}] + max_queue_delay_microseconds: {1} +}}""".format(", ".join([str(x) for x in pref_batch_size]), int(FLAGS.trtis_dyn_batching_delay * 1000.0)) + + config_values = { + "model_name": model_name, + "max_batch_size": max_batch_size, + "seq_length": FLAGS.max_seq_length, + "dynamic_batching": batching_str, + "gpu_list": ", ".join([x.name.split(":")[-1] for x in device_lib.list_local_devices() if x.device_type == "GPU"]), + "engine_count": FLAGS.trtis_engine_count + } + + with open(model_folder + "/config.pbtxt", "w") as file: + + final_config_str = config_template.format_map(config_values) + file.write(final_config_str) + +def main(_): + tf.logging.set_verbosity(tf.logging.INFO) + + if FLAGS.horovod: + hvd.init() + if FLAGS.use_fp16: + os.environ["TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE"] = "1" + + bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) + + validate_flags_or_throw(bert_config) + + tf.gfile.MakeDirs(FLAGS.output_dir) + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + master_process = True + training_hooks = [] + global_batch_size = FLAGS.train_batch_size * FLAGS.num_accumulation_steps + hvd_rank = 0 + + config = tf.ConfigProto() + learning_rate = FLAGS.learning_rate + if FLAGS.horovod: + + tf.logging.info("Multi-GPU training with TF Horovod") + tf.logging.info("hvd.size() = %d hvd.rank() = %d", hvd.size(), hvd.rank()) + global_batch_size = FLAGS.train_batch_size * hvd.size() * FLAGS.num_accumulation_steps + learning_rate = learning_rate * hvd.size() + master_process = (hvd.rank() == 0) + hvd_rank = hvd.rank() + config.gpu_options.visible_device_list = str(hvd.local_rank()) + if hvd.size() > 1: + training_hooks.append(hvd.BroadcastGlobalVariablesHook(0)) + if FLAGS.use_xla: + config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1 + run_config = tf.estimator.RunConfig( + model_dir=FLAGS.output_dir if master_process else None, + session_config=config, + save_checkpoints_steps=FLAGS.save_checkpoints_steps if master_process else None, + keep_checkpoint_max=1) + + if master_process: + tf.logging.info("***** Configuaration *****") + for key in FLAGS.__flags.keys(): + tf.logging.info(' {}: {}'.format(key, getattr(FLAGS, key))) + tf.logging.info("**************************") + + train_examples = None + num_train_steps = None + num_warmup_steps = None + training_hooks.append(LogTrainRunHook(global_batch_size, hvd_rank, FLAGS.save_checkpoints_steps)) + + # Prepare Training Data + if FLAGS.do_train: + train_examples = read_squad_examples( + input_file=FLAGS.train_file, is_training=True, + version_2_with_negative=FLAGS.version_2_with_negative) + num_train_steps = int( + len(train_examples) / global_batch_size * FLAGS.num_train_epochs) + num_warmup_steps = int(num_train_steps * FLAGS.warmup_proportion) + + # Pre-shuffle the input to avoid having to make a very large shuffle + # buffer in in the `input_fn`. + rng = random.Random(12345) + rng.shuffle(train_examples) + + start_index = 0 + end_index = len(train_examples) + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record")] + + if FLAGS.horovod: + tmp_filenames = [os.path.join(FLAGS.output_dir, "train.tf_record{}".format(i)) for i in range(hvd.size())] + num_examples_per_rank = len(train_examples) // hvd.size() + remainder = len(train_examples) % hvd.size() + if hvd.rank() < remainder: + start_index = hvd.rank() * (num_examples_per_rank+1) + end_index = start_index + num_examples_per_rank + 1 + else: + start_index = hvd.rank() * num_examples_per_rank + remainder + end_index = start_index + (num_examples_per_rank) + + + model_fn = model_fn_builder( + bert_config=bert_config, + init_checkpoint=FLAGS.init_checkpoint, + learning_rate=learning_rate, + num_train_steps=num_train_steps, + num_warmup_steps=num_warmup_steps, + hvd=None if not FLAGS.horovod else hvd, + use_fp16=FLAGS.use_fp16) + + estimator = tf.estimator.Estimator( + model_fn=model_fn, + config=run_config) + + if FLAGS.do_train: + + # We write to a temporary file to avoid storing very large constant tensors + # in memory. + train_writer = FeatureWriter( + filename=tmp_filenames[hvd_rank], + is_training=True) + convert_examples_to_features( + examples=train_examples[start_index:end_index], + tokenizer=tokenizer, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=True, + output_fn=train_writer.process_feature, + verbose_logging=FLAGS.verbose_logging) + train_writer.close() + + tf.logging.info("***** Running training *****") + tf.logging.info(" Num orig examples = %d", end_index - start_index) + tf.logging.info(" Num split examples = %d", train_writer.num_features) + tf.logging.info(" Batch size = %d", FLAGS.train_batch_size) + tf.logging.info(" Num steps = %d", num_train_steps) + tf.logging.info(" LR = %f", learning_rate) + del train_examples + + train_input_fn = input_fn_builder( + input_file=tmp_filenames, + batch_size=FLAGS.train_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=True, + drop_remainder=True, + hvd=None if not FLAGS.horovod else hvd) + + train_start_time = time.time() + estimator.train(input_fn=train_input_fn, hooks=training_hooks, max_steps=num_train_steps) + train_time_elapsed = time.time() - train_start_time + train_time_wo_overhead = training_hooks[-1].total_time + avg_sentences_per_second = num_train_steps * global_batch_size * 1.0 / train_time_elapsed + ss_sentences_per_second = (num_train_steps - training_hooks[-1].skipped) * global_batch_size * 1.0 / train_time_wo_overhead + + if master_process: + tf.logging.info("-----------------------------") + tf.logging.info("Total Training Time = %0.2f for Sentences = %d", train_time_elapsed, + num_train_steps * global_batch_size) + tf.logging.info("Total Training Time W/O Overhead = %0.2f for Sentences = %d", train_time_wo_overhead, + (num_train_steps - training_hooks[-1].skipped) * global_batch_size) + tf.logging.info("Throughput Average (sentences/sec) with overhead = %0.2f", avg_sentences_per_second) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + + if FLAGS.export_trtis and master_process: + export_model(estimator, FLAGS.output_dir, FLAGS.init_checkpoint) + + if FLAGS.do_predict and master_process: + eval_examples = read_squad_examples( + input_file=FLAGS.predict_file, is_training=False, + version_2_with_negative=FLAGS.version_2_with_negative) + + # Perform evaluation on subset, useful for profiling + if FLAGS.num_eval_iterations is not None: + eval_examples = eval_examples[:FLAGS.num_eval_iterations*FLAGS.predict_batch_size] + + eval_writer = FeatureWriter( + filename=os.path.join(FLAGS.output_dir, "eval.tf_record"), + is_training=False) + eval_features = [] + + def append_feature(feature): + eval_features.append(feature) + eval_writer.process_feature(feature) + + convert_examples_to_features( + examples=eval_examples, + tokenizer=tokenizer, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=False, + output_fn=append_feature, + verbose_logging=FLAGS.verbose_logging) + eval_writer.close() + + tf.logging.info("***** Running predictions *****") + tf.logging.info(" Num orig examples = %d", len(eval_examples)) + tf.logging.info(" Num split examples = %d", len(eval_features)) + tf.logging.info(" Batch size = %d", FLAGS.predict_batch_size) + + predict_input_fn = input_fn_builder( + input_file=eval_writer.filename, + batch_size=FLAGS.predict_batch_size, + seq_length=FLAGS.max_seq_length, + is_training=False, + drop_remainder=False) + + all_results = [] + eval_hooks = [LogEvalRunHook(FLAGS.predict_batch_size)] + eval_start_time = time.time() + for result in estimator.predict( + predict_input_fn, yield_single_examples=True, hooks=eval_hooks): + if len(all_results) % 1000 == 0: + tf.logging.info("Processing example: %d" % (len(all_results))) + unique_id = int(result["unique_ids"]) + start_logits = [float(x) for x in result["start_logits"].flat] + end_logits = [float(x) for x in result["end_logits"].flat] + all_results.append( + RawResult( + unique_id=unique_id, + start_logits=start_logits, + end_logits=end_logits)) + + eval_time_elapsed = time.time() - eval_start_time + eval_time_wo_overhead = eval_hooks[-1].total_time + + time_list = eval_hooks[-1].time_list + time_list.sort() + num_sentences = (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size + + avg = np.mean(time_list) + cf_50 = max(time_list[:int(len(time_list) * 0.50)]) + cf_90 = max(time_list[:int(len(time_list) * 0.90)]) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + ss_sentences_per_second = num_sentences * 1.0 / eval_time_wo_overhead + + tf.logging.info("-----------------------------") + tf.logging.info("Total Inference Time = %0.2f for Sentences = %d", eval_time_elapsed, + eval_hooks[-1].count * FLAGS.predict_batch_size) + tf.logging.info("Total Inference Time W/O Overhead = %0.2f for Sentences = %d", eval_time_wo_overhead, + (eval_hooks[-1].count - eval_hooks[-1].skipped) * FLAGS.predict_batch_size) + tf.logging.info("Summary Inference Statistics") + tf.logging.info("Batch size = %d", FLAGS.predict_batch_size) + tf.logging.info("Sequence Length = %d", FLAGS.max_seq_length) + tf.logging.info("Precision = %s", "fp16" if FLAGS.use_fp16 else "fp32") + tf.logging.info("Latency Confidence Level 50 (ms) = %0.2f", cf_50 * 1000) + tf.logging.info("Latency Confidence Level 90 (ms) = %0.2f", cf_90 * 1000) + tf.logging.info("Latency Confidence Level 95 (ms) = %0.2f", cf_95 * 1000) + tf.logging.info("Latency Confidence Level 99 (ms) = %0.2f", cf_99 * 1000) + tf.logging.info("Latency Confidence Level 100 (ms) = %0.2f", cf_100 * 1000) + tf.logging.info("Latency Average (ms) = %0.2f", avg * 1000) + tf.logging.info("Throughput Average (sentences/sec) = %0.2f", ss_sentences_per_second) + tf.logging.info("-----------------------------") + + output_prediction_file = os.path.join(FLAGS.output_dir, "predictions.json") + output_nbest_file = os.path.join(FLAGS.output_dir, "nbest_predictions.json") + output_null_log_odds_file = os.path.join(FLAGS.output_dir, "null_odds.json") + + write_predictions(eval_examples, eval_features, all_results, + FLAGS.n_best_size, FLAGS.max_answer_length, + FLAGS.do_lower_case, output_prediction_file, + output_nbest_file, output_null_log_odds_file) + + +if __name__ == "__main__": + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + tf.app.run() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/data_download.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/data_download.sh new file mode 100644 index 0000000..79ffc9b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/data_download.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +docker run --runtime=nvidia -v $PWD:/workspace/bert \ + --rm --shm-size=1g --ulimit memlock=-1 \ + --ulimit stack=67108864 --ipc=host -t -i \ + bert bash -c "bash data/create_datasets_from_start.sh" \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/build.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/build.sh new file mode 100644 index 0000000..d14b1b3 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +docker pull nvcr.io/nvidia/tensorrtserver:19.08-py3 + +#Will have to update submodule from root +git submodule update --init --recursive +cd tensorrt-inference-server && docker build -t tensorrtserver_client -f Dockerfile.client . && cd - + +docker build . --rm -t bert diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/launch.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/launch.sh new file mode 100644 index 0000000..025957f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/docker/launch.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +CMD=${@:-/bin/bash} +NV_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES:-"all"} + + +nvidia-docker run --rm -it \ + --net=host \ + --shm-size=1g \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + -e NVIDIA_VISIBLE_DEVICES=$NV_VISIBLE_DEVICES \ + -v $PWD:/workspace/bert \ + -v $PWD/results:/results \ + bert $CMD diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_inference_benchmark.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_inference_benchmark.sh new file mode 100644 index 0000000..57c9313 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_inference_benchmark.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +bert_model=${1:-"large"} +task=${2:-"squad"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi +echo "BERT directory set as " $BERT_DIR + +init_checkpoint="$BERT_DIR/bert_model.ckpt" + +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results +if [ ! -d "$RESULTS_DIR" ] ; then + echo "Error! $RESULTS_DIR directory missing." + exit -1 +fi +echo "Results directory set as " $RESULTS_DIR + +LOGFILE="${RESULTS_DIR}/${task}_inference_benchmark_bert_${bert_model}.log" +tmp_file="/tmp/${task}_inference_benchmark.log" +if [ "$task" = "squad" ] ; then + export SQUAD_DIR=data/download/squad/v1.1 + + echo "Squad directory set as " $SQUAD_DIR + + echo "Inference performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + echo "Precision Sequence-Length Batch-size Precision Throughput-Average(sent/sec) Latency-Average(ms) Latency-50%(ms) Latency-90%(ms) Latency-95%(ms) Latency-99%(ms) Latency-100%(ms)" >> $LOGFILE + + for seq_len in 128 384; do + + for bs in 1 2 4 8; do + + for precision in fp16 fp32; do + + + if [ "$precision" = "fp16" ] ; then + echo "fp16 and XLA activated!" + use_fp16="--use_fp16" + use_xla_tag="--use_xla" + else + echo "fp32 activated!" + use_fp16="" + use_xla_tag="" + fi + + python run_squad.py \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --do_predict=True \ + --predict_file=$SQUAD_DIR/dev-v1.1.json \ + --predict_batch_size=$bs \ + --max_seq_length=$seq_len \ + --doc_stride=128 \ + --output_dir=${RESULTS_DIR} \ + "$use_fp16" \ + $use_xla_tag --num_eval_iterations=1024 |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | tail -1 | awk -F'= ' '{print $2}'` + la=`cat $tmp_file | grep -F 'Latency Average (ms)' | awk -F'= ' '{print $2}'` + l50=`cat $tmp_file | grep -F 'Latency Confidence Level 50 (ms)' | awk -F'= ' '{print $2}'` + l90=`cat $tmp_file | grep -F 'Latency Confidence Level 90 (ms)' | awk -F'= ' '{print $2}'` + l95=`cat $tmp_file | grep -F 'Latency Confidence Level 95 (ms)' | awk -F'= ' '{print $2}'` + l99=`cat $tmp_file | grep -F 'Latency Confidence Level 99 (ms)' | awk -F'= ' '{print $2}'` + l100=`cat $tmp_file | grep -F 'Latency Confidence Level 100 (ms)' | awk -F'= ' '{print $2}'` + + echo "$precision $seq_len $bs $precision $perf $la $l50 $l90 $l95 $l99 $l100" >> $LOGFILE + + done + done + done + +else + + echo "Benchmarking for " $task "currently not supported. Sorry!" + +fi \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_train_benchmark.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_train_benchmark.sh new file mode 100644 index 0000000..d12540b --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/finetune_train_benchmark.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +bert_model=${1:-"large"} +use_xla=${2:-"true"} +num_gpu=${3:-"8"} +task=${4:-"squad"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi + +echo "BERT directory set as " $BERT_DIR + +init_checkpoint="$BERT_DIR/bert_model.ckpt" +learning_rate=5e-6 + +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results +if [ ! -d "$RESULTS_DIR" ] ; then + echo "Error! $RESULTS_DIR directory missing." + exit -1 +fi +echo "Results directory set as " $RESULTS_DIR + + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" +else + use_xla_tag="" +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" + use_hvd="--horovod" +else + mpi_command="" + use_hvd="" +fi + +LOGFILE="${RESULTS_DIR}/${task}_training_benchmark_bert_${bert_model}_gpu_${num_gpu}.log" + +if [ "$task" = "squad" ] ; then + export SQUAD_DIR=data/download/squad/v1.1 + epochs="2.0" + echo "Squad directory set as " $SQUAD_DIR + + echo "Training performance benchmarking for BERT $bert_model from $BERT_DIR" >> $LOGFILE + echo "Precision Sequence Length Batch size Performance(sent/sec)" >> $LOGFILE + + for seq_len in 128 384; do + + if [ "$seq_len" = "128" ] ; then + doc_stride=64 + else + doc_stride=128 + fi + + for batch_size in 1 2 4; do + for precision in fp16 fp32; do + res_dir=${RESULTS_DIR}/bert_${bert_model}_gpu_${num_gpu}_sl_${seq_len}_prec_${precision}_bs_${batch_size} + mkdir -p $res_dir + tmp_file="${res_dir}/${task}_training_benchmark.log" + + if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" + else + echo "fp32 activated!" + use_fp16="" + fi + + $mpi_command python run_squad.py \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --do_train=True \ + --train_file=$SQUAD_DIR/train-v1.1.json \ + --train_batch_size=$batch_size \ + --learning_rate=$learning_rate \ + --num_train_epochs=$epochs \ + --max_seq_length=$seq_len \ + --doc_stride=$doc_stride \ + --output_dir=$res_dir \ + "$use_hvd" \ + "$use_fp16" \ + $use_xla_tag |& tee $tmp_file + + perf=`cat $tmp_file | grep -F 'Throughput Average (sentences/sec) =' | head -1 | awk -F'= ' '{print $2}' | awk -F' sen' '{print $1}'` + echo "$precision $seq_len $batch_size $perf" >> $LOGFILE + + done + done + done + +else + + echo "Benchmarking for " $task "currently not supported. Sorry!" + +fi \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue.sh new file mode 100644 index 0000000..359113e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +task_name=${1:-"MRPC"} +batch_size=${2:-"32"} +learning_rate=${3:-"2e-5"} +precision=${4:-"fp16"} +use_xla=${5:-"true"} +num_gpu=${6:-"8"} +seq_length=${7:-"128"} +doc_stride=${8:-"64"} +bert_model=${9:-"large"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi +export GLUE_DIR=data/download + + +epochs=${10:-"3.0"} +ws=${11:-"0.1"} +init_checkpoint=${12:-"$BERT_DIR/bert_model.ckpt"} + +echo "GLUE directory set as " $GLUE_DIR " BERT directory set as " $BERT_DIR + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" +else + mpi_command="" +fi + +export GBS=$(expr $batch_size \* $num_gpu) +printf -v TAG "tf_bert_finetuning_glue_%s_%s_%s_gbs%d" "$task_name" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results/${TAG}_${DATESTAMP} +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +mkdir -m 777 -p $RESULTS_DIR +printf "Saving checkpoints to %s\n" "$RESULTS_DIR" +printf "Logs written to %s\n" "$LOGFILE" + +#Check if all necessary files are available before training +for DIR_or_file in $GLUE_DIR/${task_name} $RESULTS_DIR $BERT_DIR/vocab.txt $BERT_DIR/bert_config.json; do + echo $DIR_or_file + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +$mpi_command python run_classifier.py \ + --task_name=$task_name \ + --do_train=true \ + --do_eval=true \ + --data_dir=$GLUE_DIR/$task_name \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --max_seq_length=$seq_length \ + --doc_stride=$doc_stride \ + --train_batch_size=$batch_size \ + --learning_rate=$learning_rate \ + --num_train_epochs=$epochs \ + --output_dir=$RESULTS_DIR \ + --horovod "$use_fp16" \ + $use_xla_tag --warmup_proportion=$ws |& tee $LOGFILE \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue_inference.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue_inference.sh new file mode 100644 index 0000000..6e7e0e7 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_glue_inference.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID +task_name=${1:-"MRPC"} +init_checkpoint=${2:-"$BERT_DIR/bert_model.ckpt"} +batch_size=${3:-"32"} +precision=${4:-"fp16"} +use_xla=${5:-"true"} +seq_length=${6:-"128"} +doc_stride=${7:-"64"} +bert_model=${8:-"large"} + +if [ "$bert_model" = "large" ] ; then + BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi +GLUE_DIR=data/download + +echo "GLUE directory set as " $GLUE_DIR " BERT directory set as " $BERT_DIR + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + + +export GBS=$(expr $batch_size \* $num_gpu) +printf -v TAG "tf_bert_finetuning_glue_%s_inf_%s_%s_gbs%d_ckpt_%s" "$task_name" "$bert_model" "$precision" $GBS "$init_checkpoint" +DATESTAMP=`date +'%y%m%d%H%M%S'` +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +printf "Logs written to %s\n" "$LOGFILE" + +#Check if all necessary files are available before training +for DIR_or_file in $GLUE_DIR $RESULTS_DIR $BERT_DIR/vocab.txt $BERT_DIR/bert_config.json; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +$mpi_command python run_classifier.py \ + --task_name=$task_name \ + --predict_batch_size=$batch_size \ + --eval_batch_size=$batch_size \ + --do_eval=true \ + --data_dir=$GLUE_DIR/$task_name \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --init_checkpoint=$init_checkpoint \ + --max_seq_length=$seq_length \ + --doc_stride=$doc_stride \ + --output_dir=$RESULTS_DIR \ + --horovod "$use_fp16" \ + $use_xla_tag |& tee $LOGFILE \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_adam.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_adam.sh new file mode 100644 index 0000000..8c6a2d4 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_adam.sh @@ -0,0 +1,111 @@ +#! /bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +train_batch_size=${1:-14} +eval_batch_size=${2:-8} +learning_rate=${3:-"1e-4"} +precision=${4:-"manual_fp16"} +use_xla=${5:-"true"} +num_gpus=${6:-8} +warmup_steps=${7:-"10000"} +train_steps=${8:-1144000} +save_checkpoints_steps=${9:-5000} +bert_model=${10:-"large"} +num_accumulation_steps=${11:-1} +seq_len=${12:-512} +max_pred_per_seq=${13:-80} + +DATA_DIR=data/tfrecord/lower_case_1_seq_len_${seq_len}_max_pred_${max_pred_per_seq}_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus + +if [ "$bert_model" = "large" ] ; then + export BERT_CONFIG=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json +else + export BERT_CONFIG=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12/bert_config.json +fi + +PREC="" +if [ "$precision" = "fp16" ] ; then + PREC="--use_fp16" +elif [ "$precision" = "fp32" ] ; then + PREC="" +elif [ "$precision" = "manual_fp16" ] ; then + PREC="--manual_fp16" +else + echo "Unknown argument" + exit -2 +fi + +if [ "$use_xla" = "true" ] ; then + PREC="$PREC --use_xla" + echo "XLA activated" +fi + +export GBS=$(expr $train_batch_size \* $num_gpus \* $num_accumulation_steps) +printf -v TAG "tf_bert_pretraining_adam_%s_%s_gbs%d" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` + +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=${RESULTS_DIR:-/results/${TAG}_${DATESTAMP}} +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +mkdir -m 777 -p $RESULTS_DIR +printf "Saving checkpoints to %s\n" "$RESULTS_DIR" +printf "Logs written to %s\n" "$LOGFILE" + +INPUT_FILES="$DATA_DIR/training" +EVAL_FILES="$DATA_DIR/test" + +CMD="python3 /workspace/bert/run_pretraining.py" +CMD+=" --input_files_dir=$INPUT_FILES" +CMD+=" --eval_files_dir=$EVAL_FILES" +CMD+=" --output_dir=$RESULTS_DIR" +CMD+=" --bert_config_file=$BERT_CONFIG" +CMD+=" --do_train=True" +CMD+=" --do_eval=True" +CMD+=" --train_batch_size=$train_batch_size" +CMD+=" --eval_batch_size=$eval_batch_size" +CMD+=" --max_seq_length=$seq_len" +CMD+=" --max_predictions_per_seq=$max_pred_per_seq" +CMD+=" --num_train_steps=$train_steps" +CMD+=" --num_warmup_steps=$warmup_steps" +CMD+=" --num_accumulation_steps=$num_accumulation_steps" +CMD+=" --save_checkpoints_steps=$save_checkpoints_steps" +CMD+=" --learning_rate=$learning_rate" +CMD+=" --optimizer_type=adam" +CMD+=" --horovod $PREC" +CMD+=" --allreduce_post_accumulation=True" + +#Check if all necessary files are available before training +for DIR_or_file in $DATA_DIR $BERT_CONFIG $RESULTS_DIR; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +if [ $num_gpus -gt 1 ] ; then + CMD="mpiexec --allow-run-as-root -np $num_gpus --bind-to socket $CMD" +fi + +set -x +if [ -z "$LOGFILE" ] ; then + $CMD +else + ( + $CMD + ) |& tee $LOGFILE +fi +set +x diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb.sh new file mode 100644 index 0000000..8c8d97a --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +train_batch_size_phase1=${1:-64} +train_batch_size_phase2=${2:-8} +eval_batch_size=${3:-8} +learning_rate_phase1=${4:-"7.5e-4"} +learning_rate_phase2=${5:-"5e-4"} +precision=${6:-"fp16"} +use_xla=${7:-"true"} +num_gpus=${8:-8} +warmup_steps_phase1=${9:-"2000"} +warmup_steps_phase2=${10:-"200"} +train_steps=${11:-7820} +save_checkpoints_steps=${12:-100} +num_accumulation_steps_phase1=${13:-128} +num_accumulation_steps_phase2=${14:-512} +bert_model=${15:-"large"} + +DATA_DIR=data +export DATA_DIR=$DATA_DIR + +GBS1=$(expr $train_batch_size_phase1 \* $num_gpus \* $num_accumulation_steps_phase1) +GBS2=$(expr $train_batch_size_phase2 \* $num_gpus \* $num_accumulation_steps_phase2) +printf -v TAG "tf_bert_pretraining_lamb_%s_%s_gbs1%d_gbs2%d" "$bert_model" "$precision" $GBS1 $GBS2 +DATESTAMP=`date +'%y%m%d%H%M%S'` + +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=${RESULTS_DIR:-/results/${TAG}_${DATESTAMP}} +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +mkdir -m 777 -p $RESULTS_DIR +printf "Saving checkpoints to %s\n" "$RESULTS_DIR" +printf "Logs written to %s\n" "$LOGFILE" +export RESULTS_DIR=$RESULTS_DIR + +printf -v SCRIPT_ARGS "%d %d %d %e %e %s %s %d %d %d %d %d %d %d %s %s" \ + $train_batch_size_phase1 $train_batch_size_phase2 $eval_batch_size $learning_rate_phase1 \ + $learning_rate_phase2 "$precision" "$use_xla" $num_gpus $warmup_steps_phase1 \ + $warmup_steps_phase2 $train_steps $save_checkpoints_steps \ + $num_accumulation_steps_phase1 $num_accumulation_steps_phase2 "$bert_model" + +# RUN PHASE 1 +bash scripts/run_pretraining_lamb_phase1.sh $SCRIPT_ARGS |& tee -a $LOGFILE + +# RUN PHASE 2 +bash scripts/run_pretraining_lamb_phase2.sh $SCRIPT_ARGS |& tee -a $LOGFILE diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase1.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase1.sh new file mode 100644 index 0000000..2a397dc --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase1.sh @@ -0,0 +1,111 @@ +#! /bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +export JOB_ID=1 +export RANK_ID=0 +export RANK_SIZE=1 +export DEVICE_ID=0 +export RANK_TABLE_FILE=./config/rank_table_1980intra_1rank.json +#export FUSION_TENSOR_SIZE=1000000000 +export PYTHONPATH=${dir}:$PYTHONPATH + +#export DUMP_GE_GRAPH=3 + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +train_batch_size_phase1=${1:-16} +train_batch_size_phase2=${2:-8} +eval_batch_size=${3:-8} +learning_rate_phase1=${4:-"7.5e-4"} +learning_rate_phase2=${5:-"5e-4"} +precision=${6:-"fp16"} +use_xla=${7:-"false"} +warmup_steps_phase1=${9:-"2000"} +warmup_steps_phase2=${10:-"200"} +train_steps=${11:-7820} +save_checkpoints_steps=${12:-100} +num_accumulation_steps_phase1=${13:-1} +num_accumulation_steps_phase2=${14:-512} +bert_model=${15:-"large"} + +DATA_DIR=${DATA_DIR:-data} +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=${RESULTS_DIR:-./results} + +if [ "$bert_model" = "large" ] ; then + export BERT_CONFIG=data/uncased_L-24_H-1024_A-16/bert_config.json +else + export BERT_CONFIG=data/uncased_L-12_H-768_A-12/bert_config.json +fi + +PREC="" +if [ "$precision" = "fp16" ] ; then + PREC="--use_fp16" +elif [ "$precision" = "fp32" ] ; then + PREC="" +elif [ "$precision" = "manual_fp16" ] ; then + PREC="--manual_fp16" +else + echo "Unknown argument" + exit -2 +fi + +if [ "$use_xla" = "true" ] ; then + PREC="$PREC --use_xla" + echo "XLA activated" +fi + +#PHASE 1 + +train_steps_phase1=$(expr $train_steps \* 9 \/ 10) #Phase 1 is 10% of training +gbs_phase1=$(expr $train_batch_size_phase1 \* $num_accumulation_steps_phase1) +seq_len=128 +max_pred_per_seq=20 +RESULTS_DIR_PHASE1=${RESULTS_DIR}/phase_1 +mkdir -m 777 -p $RESULTS_DIR_PHASE1 + +INPUT_FILES="/opt/npu/bert-170-zhanghui/cn-news-128-f100" +EVAL_FILES="/opt/npu/bert-170-zhanghui/cn-news-128-f100" + +#Check if all necessary files are available before training +for DIR_or_file in $DATA_DIR $RESULTS_DIR_PHASE1 $BERT_CONFIG; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +python3 ./run_pretraining.py \ + --input_files_dir=$INPUT_FILES \ + --eval_files_dir=$EVAL_FILES \ + --output_dir=$RESULTS_DIR_PHASE1 \ + --bert_config_file=$BERT_CONFIG \ + --do_train=True \ + --train_batch_size=$train_batch_size_phase1 \ + --eval_batch_size=$eval_batch_size \ + --max_seq_length=$seq_len \ + --max_predictions_per_seq=$max_pred_per_seq \ + --num_train_steps=$train_steps_phase1 \ + --num_accumulation_steps=$num_accumulation_steps_phase1 \ + --num_warmup_steps=$warmup_steps_phase1 \ + --save_checkpoints_steps=$save_checkpoints_steps \ + --learning_rate=$learning_rate_phase1 \ + --optimizer_type=adam \ + --manual_fp16=True \ + --use_fp16_cls=True \ + --npu_bert_debug=False \ + --npu_bert_use_tdt=True \ + --npu_bert_clip_by_global_norm=False \ + --npu_bert_job_start_file="./config/deviceid_devindex_jobstart" diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase2.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase2.sh new file mode 100644 index 0000000..b26311c --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_pretraining_lamb_phase2.sh @@ -0,0 +1,115 @@ +#! /bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +train_batch_size_phase1=${1:-64} +train_batch_size_phase2=${2:-8} +eval_batch_size=${3:-8} +learning_rate_phase1=${4:-"7.5e-4"} +learning_rate_phase2=${5:-"5e-4"} +precision=${6:-"fp16"} +use_xla=${7:-"true"} +num_gpus=${8:-2} +warmup_steps_phase1=${9:-"2000"} +warmup_steps_phase2=${10:-"200"} +train_steps=${11:-7820} +save_checkpoints_steps=${12:-100} +num_accumulation_steps_phase1=${13:-128} +num_accumulation_steps_phase2=${14:-512} +bert_model=${15:-"large"} + +DATA_DIR=${DATA_DIR:-data} +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=${RESULTS_DIR:-/results} + +if [ "$bert_model" = "large" ] ; then + export BERT_CONFIG=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/bert_config.json +else + export BERT_CONFIG=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12/bert_config.json +fi + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +PREC="" +if [ "$precision" = "fp16" ] ; then + PREC="--use_fp16" +elif [ "$precision" = "fp32" ] ; then + PREC="" +elif [ "$precision" = "manual_fp16" ] ; then + PREC="--manual_fp16" +else + echo "Unknown argument" + exit -2 +fi + +if [ "$use_xla" = "true" ] ; then + PREC="$PREC --use_xla" + echo "XLA activated" +fi + +mpi="" +if [ $num_gpus -gt 1 ] ; then + mpi="mpiexec --allow-run-as-root -np $num_gpus --bind-to socket" +fi + +#PHASE 1 Config + +train_steps_phase1=$(expr $train_steps \* 9 \/ 10) #Phase 1 is 10% of training +gbs_phase1=$(expr $train_batch_size_phase1 \* $num_accumulation_steps_phase1) +PHASE1_CKPT=${RESULTS_DIR}/phase_1/model.ckpt-${train_steps_phase1} + +#PHASE 2 + +seq_len=512 +max_pred_per_seq=80 +train_steps_phase2=$(expr $train_steps \* 1 \/ 10) #Phase 2 is 10% of training +gbs_phase2=$(expr $train_batch_size_phase2 \* $num_accumulation_steps_phase2) +train_steps_phase2=$(expr $train_steps_phase2 \* $gbs_phase1 \/ $gbs_phase2) # Adjust for batch size + +RESULTS_DIR_PHASE2=${RESULTS_DIR}/phase_2 +mkdir -m 777 -p $RESULTS_DIR_PHASE2 + +INPUT_FILES="$DATA_DIR/tfrecord/lower_case_1_seq_len_${seq_len}_max_pred_${max_pred_per_seq}_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/training" +EVAL_FILES="$DATA_DIR/tfrecord/lower_case_1_seq_len_${seq_len}_max_pred_${max_pred_per_seq}_masked_lm_prob_0.15_random_seed_12345_dupe_factor_5_shard_1472_test_split_10/books_wiki_en_corpus/test" + +#Check if all necessary files are available before training +for DIR_or_file in $DATA_DIR $RESULTS_DIR $BERT_CONFIG ${PHASE1_CKPT}.meta; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +$mpi python /workspace/bert/run_pretraining.py \ + --input_files_dir=$INPUT_FILES \ + --init_checkpoint=$PHASE1_CKPT \ + --eval_files_dir=$EVAL_FILES \ + --output_dir=$RESULTS_DIR_PHASE2 \ + --bert_config_file=$BERT_CONFIG \ + --do_train=True \ + --do_eval=True \ + --train_batch_size=$train_batch_size_phase2 \ + --eval_batch_size=$eval_batch_size \ + --max_seq_length=$seq_len \ + --max_predictions_per_seq=$max_pred_per_seq \ + --num_train_steps=$train_steps_phase2 \ + --num_accumulation_steps=$num_accumulation_steps_phase2 \ + --num_warmup_steps=$warmup_steps_phase2 \ + --save_checkpoints_steps=$save_checkpoints_steps \ + --learning_rate=$learning_rate_phase2 \ + --horovod $PREC \ + --allreduce_post_accumulation=True + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad.sh new file mode 100644 index 0000000..da3c8eb --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +batch_size=${1:-"8"} +learning_rate=${2:-"5e-6"} +precision=${3:-"fp16"} +use_xla=${4:-"true"} +num_gpu=${5:-"8"} +seq_length=${6:-"384"} +doc_stride=${7:-"128"} +bert_model=${8:-"large"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi + +squad_version=${9:-"1.1"} + +export SQUAD_DIR=data/download/squad/v${squad_version} +if [ "$squad_version" = "1.1" ] ; then + version_2_with_negative="False" +else + version_2_with_negative="True" +fi + +init_checkpoint=${10:-"$BERT_DIR/bert_model.ckpt"} +epochs=${11:-"2.0"} + +echo "Squad directory set as " $SQUAD_DIR " BERT directory set as " $BERT_DIR + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +if [ $num_gpu -gt 1 ] ; then + mpi_command="mpirun -np $num_gpu -H localhost:$num_gpu \ + --allow-run-as-root -bind-to none -map-by slot \ + -x NCCL_DEBUG=INFO \ + -x LD_LIBRARY_PATH \ + -x PATH -mca pml ob1 -mca btl ^openib" +else + mpi_command="" +fi + +export GBS=$(expr $batch_size \* $num_gpu) +printf -v TAG "tf_bert_finetuning_squad_%s_%s_gbs%d" "$bert_model" "$precision" $GBS +DATESTAMP=`date +'%y%m%d%H%M%S'` + +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results/${TAG}_${DATESTAMP} +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +mkdir -m 777 -p $RESULTS_DIR +printf "Saving checkpoints to %s\n" "$RESULTS_DIR" +printf "Logs written to %s\n" "$LOGFILE" + +#Check if all necessary files are available before training +for DIR_or_file in $SQUAD_DIR $RESULTS_DIR $BERT_DIR/bert_config.json $BERT_DIR/vocab.txt; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +$mpi_command python run_squad.py \ +--vocab_file=$BERT_DIR/vocab.txt \ +--bert_config_file=$BERT_DIR/bert_config.json \ +--init_checkpoint=$init_checkpoint \ +--do_train=True \ +--train_file=$SQUAD_DIR/train-v${squad_version}.json \ +--do_predict=True \ +--predict_file=$SQUAD_DIR/dev-v${squad_version}.json \ +--train_batch_size=$batch_size \ +--learning_rate=$learning_rate \ +--num_train_epochs=$epochs \ +--max_seq_length=$seq_length \ +--doc_stride=$doc_stride \ +--save_checkpoints_steps 1000 \ +--output_dir=$RESULTS_DIR \ +--horovod "$use_fp16" \ +$use_xla_tag --version_2_with_negative=${version_2_with_negative} |& tee $LOGFILE + +python $SQUAD_DIR/evaluate-v${squad_version}.py $SQUAD_DIR/dev-v${squad_version}.json ${RESULTS_DIR}/predictions.json |& tee -a $LOGFILE diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad_inference.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad_inference.sh new file mode 100644 index 0000000..2a8aa2c --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/scripts/run_squad_inference.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Container nvidia build = " $NVIDIA_BUILD_ID + +init_checkpoint=${1:-"/results/model.ckpt"} +batch_size=${2:-"8"} +precision=${3:-"fp16"} +use_xla=${4:-"true"} +seq_length=${5:-"384"} +doc_stride=${6:-"128"} +bert_model=${7:-"large"} +squad_version=${8:-"1.1"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi + +export SQUAD_DIR=data/download/squad/v${squad_version} +if [ "$squad_version" = "1.1" ] ; then + version_2_with_negative="False" +else + version_2_with_negative="True" +fi + + +echo "Squad directory set as " $SQUAD_DIR " BERT directory set as " $BERT_DIR +echo "Results directory set as " $RESULTS_DIR + +use_fp16="" +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + use_fp16="--use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + use_xla_tag="--use_xla" + echo "XLA activated" +else + use_xla_tag="" +fi + +printf -v TAG "tf_bert_finetuning_squad_%s_inf_%s_gbs%d_ckpt_%s" "$bert_model" "$precision" $batch_size "$init_checkpoint" +DATESTAMP=`date +'%y%m%d%H%M%S'` +#Edit to save logs & checkpoints in a different directory +RESULTS_DIR=/results +LOGFILE=$RESULTS_DIR/$TAG.$DATESTAMP.log +printf "Logs written to %s\n" "$LOGFILE" + +#Check if all necessary files are available before training +for DIR_or_file in $SQUAD_DIR $RESULTS_DIR $BERT_DIR/vocab.txt $BERT_DIR/bert_config.json; do + if [ ! -d "$DIR_or_file" ] && [ ! -f "$DIR_or_file" ]; then + echo "Error! $DIR_or_file directory missing. Please mount correctly" + exit -1 + fi +done + +python run_squad.py \ +--vocab_file=$BERT_DIR/vocab.txt \ +--bert_config_file=$BERT_DIR/bert_config.json \ +--init_checkpoint=$init_checkpoint \ +--do_predict=True \ +--predict_file=$SQUAD_DIR/dev-v${squad_version}.json \ +--predict_batch_size=$batch_size \ +--max_seq_length=$seq_length \ +--doc_stride=$doc_stride \ +--predict_batch_size=$batch_size \ +--output_dir=$RESULTS_DIR \ +"$use_fp16" \ +$use_xla_tag --version_2_with_negative=${version_2_with_negative} + +python $SQUAD_DIR/evaluate-v${squad_version}.py $SQUAD_DIR/dev-v${squad_version}.json $RESULTS_DIR/predictions.json diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/setenv.sh.geop b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/setenv.sh.geop new file mode 100644 index 0000000..e212cb9 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/setenv.sh.geop @@ -0,0 +1,15 @@ +export PATH=$PATH:/usr/local/HiAI/runtime/ccec_compiler/bin +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/HiAI/runtime/lib64/:/usr/local/HiAI/driver/lib64/:/usr/local/python3/lib/ +export PYTHONPATH=/usr/local/HiAI/runtime/ops/op_impl/built-in/ai_core/tbe/ +export DDK_VERSION_PATH=/usr/local/HiAI/runtime/ddk_info +export HCCL_CONNECT_TIMEOUT=600 +export GE_USE_STATIC_MEMORY=1 + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export OPTION_EXEC_HCCL_FLAG=1 +export WHICH_OP=GEOP + +export PRINT_MODEL=1 +export DUMP_GE_GRAPH=3 + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tf_metrics.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tf_metrics.py new file mode 100644 index 0000000..f4c5148 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tf_metrics.py @@ -0,0 +1,215 @@ +""" +Multiclass +from: +https://github.com/guillaumegenthial/tf_metrics/blob/master/tf_metrics/__init__.py + +""" + +__author__ = "Guillaume Genthial" + +import numpy as np +import tensorflow as tf +from tensorflow.python.ops.metrics_impl import _streaming_confusion_matrix + + +def precision(labels, predictions, num_classes, pos_indices=None, + weights=None, average='micro'): + """Multi-class precision metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + pr, _, _ = metrics_from_confusion_matrix( + cm, pos_indices, average=average) + op, _, _ = metrics_from_confusion_matrix( + op, pos_indices, average=average) + return (pr, op) + + +def recall(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro'): + """Multi-class recall metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + _, re, _ = metrics_from_confusion_matrix( + cm, pos_indices, average=average) + _, op, _ = metrics_from_confusion_matrix( + op, pos_indices, average=average) + return (re, op) + + +def f1(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro'): + return fbeta(labels, predictions, num_classes, pos_indices, weights, + average) + + +def fbeta(labels, predictions, num_classes, pos_indices=None, weights=None, + average='micro', beta=1): + """Multi-class fbeta metric for Tensorflow + Parameters + ---------- + labels : Tensor of tf.int32 or tf.int64 + The true labels + predictions : Tensor of tf.int32 or tf.int64 + The predictions, same shape as labels + num_classes : int + The number of classes + pos_indices : list of int, optional + The indices of the positive classes, default is all + weights : Tensor of tf.int32, optional + Mask, must be of compatible shape with labels + average : str, optional + 'micro': counts the total number of true positives, false + positives, and false negatives for the classes in + `pos_indices` and infer the metric from it. + 'macro': will compute the metric separately for each class in + `pos_indices` and average. Will not account for class + imbalance. + 'weighted': will compute the metric separately for each class in + `pos_indices` and perform a weighted average by the total + number of true labels for each class. + beta : int, optional + Weight of precision in harmonic mean + Returns + ------- + tuple of (scalar float Tensor, update_op) + """ + cm, op = _streaming_confusion_matrix( + labels, predictions, num_classes, weights) + _, _, fbeta = metrics_from_confusion_matrix( + cm, pos_indices, average=average, beta=beta) + _, _, op = metrics_from_confusion_matrix( + op, pos_indices, average=average, beta=beta) + return (fbeta, op) + + +def safe_div(numerator, denominator): + """Safe division, return 0 if denominator is 0""" + numerator, denominator = tf.to_float(numerator), tf.to_float(denominator) + zeros = tf.zeros_like(numerator, dtype=numerator.dtype) + denominator_is_zero = tf.equal(denominator, zeros) + return tf.where(denominator_is_zero, zeros, numerator / denominator) + + +def pr_re_fbeta(cm, pos_indices, beta=1): + """Uses a confusion matrix to compute precision, recall and fbeta""" + num_classes = cm.shape[0] + neg_indices = [i for i in range(num_classes) if i not in pos_indices] + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[neg_indices, neg_indices] = 0 + diag_sum = tf.reduce_sum(tf.diag_part(cm * cm_mask)) + + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[:, neg_indices] = 0 + tot_pred = tf.reduce_sum(cm * cm_mask) + + cm_mask = np.ones([num_classes, num_classes]) + cm_mask[neg_indices, :] = 0 + tot_gold = tf.reduce_sum(cm * cm_mask) + + pr = safe_div(diag_sum, tot_pred) + re = safe_div(diag_sum, tot_gold) + fbeta = safe_div((1. + beta**2) * pr * re, beta**2 * pr + re) + + return pr, re, fbeta + + +def metrics_from_confusion_matrix(cm, pos_indices=None, average='micro', + beta=1): + """Precision, Recall and F1 from the confusion matrix + Parameters + ---------- + cm : tf.Tensor of type tf.int32, of shape (num_classes, num_classes) + The streaming confusion matrix. + pos_indices : list of int, optional + The indices of the positive classes + beta : int, optional + Weight of precision in harmonic mean + average : str, optional + 'micro', 'macro' or 'weighted' + """ + num_classes = cm.shape[0] + if pos_indices is None: + pos_indices = [i for i in range(num_classes)] + + if average == 'micro': + return pr_re_fbeta(cm, pos_indices, beta) + elif average in {'macro', 'weighted'}: + precisions, recalls, fbetas, n_golds = [], [], [], [] + for idx in pos_indices: + pr, re, fbeta = pr_re_fbeta(cm, [idx], beta) + precisions.append(pr) + recalls.append(re) + fbetas.append(fbeta) + cm_mask = np.zeros([num_classes, num_classes]) + cm_mask[idx, :] = 1 + n_golds.append(tf.to_float(tf.reduce_sum(cm * cm_mask))) + + if average == 'macro': + pr = tf.reduce_mean(precisions) + re = tf.reduce_mean(recalls) + fbeta = tf.reduce_mean(fbetas) + return pr, re, fbeta + if average == 'weighted': + n_gold = tf.reduce_sum(n_golds) + pr_sum = sum(p * n for p, n in zip(precisions, n_golds)) + pr = safe_div(pr_sum, n_gold) + re_sum = sum(r * n for r, n in zip(recalls, n_golds)) + re = safe_div(re_sum, n_gold) + fbeta_sum = sum(f * n for f, n in zip(fbetas, n_golds)) + fbeta = safe_div(fbeta_sum, n_gold) + return pr, re, fbeta + + else: + raise NotImplementedError() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization.py new file mode 100644 index 0000000..6e53ce7 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization.py @@ -0,0 +1,451 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tokenization classes.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import unicodedata +import six +import tensorflow as tf +import re +import os + + +PRETRAINED_VOCAB_ARCHIVE_MAP = { + 'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt", + 'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt", + 'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt", + 'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt", + 'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt", + 'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt", + 'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt", +} + +def validate_case_matches_checkpoint(do_lower_case, init_checkpoint): + """Checks whether the casing config is consistent with the checkpoint name.""" + + # The casing has to be passed in by the user and there is no explicit check + # as to whether it matches the checkpoint. The casing information probably + # should have been stored in the bert_config.json file, but it's not, so + # we have to heuristically detect it to validate. + + if not init_checkpoint: + return + + m = re.match("^.*?([A-Za-z0-9_-]+)/bert_model.ckpt", init_checkpoint) + if m is None: + return + + model_name = m.group(1) + + lower_models = [ + "uncased_L-24_H-1024_A-16", "uncased_L-12_H-768_A-12", + "multilingual_L-12_H-768_A-12", "chinese_L-12_H-768_A-12" + ] + + cased_models = [ + "cased_L-12_H-768_A-12", "cased_L-24_H-1024_A-16", + "multi_cased_L-12_H-768_A-12" + ] + + is_bad_config = False + if model_name in lower_models and not do_lower_case: + is_bad_config = True + actual_flag = "False" + case_name = "lowercased" + opposite_flag = "True" + + if model_name in cased_models and do_lower_case: + is_bad_config = True + actual_flag = "True" + case_name = "cased" + opposite_flag = "False" + + if is_bad_config: + raise ValueError( + "You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. " + "However, `%s` seems to be a %s model, so you " + "should pass in `--do_lower_case=%s` so that the fine-tuning matches " + "how the model was pre-training. If this error is wrong, please " + "just comment out this check." % (actual_flag, init_checkpoint, + model_name, case_name, opposite_flag)) + + + +def convert_to_unicode(text): + """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + + +def printable_text(text): + """Returns text encoded in a way suitable for print or `tf.logging`.""" + + # These functions want `str` for both Python2 and Python3, but in one case + # it's a Unicode string and in the other it's a byte string. + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + + +def load_vocab(vocab_file): + """Loads a vocabulary file into a dictionary.""" + vocab = collections.OrderedDict() + index = 0 + with open(vocab_file, "r") as reader: + while True: + token = convert_to_unicode(reader.readline()) + if not token: + break + token = token.strip() + vocab[token] = index + index += 1 + return vocab + + +def convert_by_vocab(vocab, items): + """Converts a sequence of [tokens|ids] using the vocab.""" + output = [] + for item in items: + output.append(vocab[item]) + return output + + +def whitespace_tokenize(text): + """Runs basic whitespace cleaning and splitting on a peice of text.""" + text = text.strip() + if not text: + return [] + tokens = text.split() + return tokens + + +class FullTokenizer(object): + """Runs end-to-end tokenziation.""" + + def __init__(self, vocab_file, do_lower_case=True): + self.vocab = load_vocab(vocab_file) + self.inv_vocab = {v: k for k, v in self.vocab.items()} + self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + + return split_tokens + + def convert_tokens_to_ids(self, tokens): + return convert_by_vocab(self.vocab, tokens) + + def convert_ids_to_tokens(self, ids): + return convert_by_vocab(self.inv_vocab, ids) + + +class BertTokenizer(object): + """Runs end-to-end tokenization: punctuation splitting + wordpiece""" + + def __init__(self, vocab_file, do_lower_case=True): + if not os.path.isfile(vocab_file): + raise ValueError( + "Can't find a vocabulary file at path '{}'. To load the vocabulary from a Google pretrained " + "model use `tokenizer = BertTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)`".format(vocab_file)) + self.vocab = load_vocab(vocab_file) + self.ids_to_tokens = collections.OrderedDict( + [(ids, tok) for tok, ids in self.vocab.items()]) + self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + return split_tokens + + def convert_tokens_to_ids(self, tokens): + """Converts a sequence of tokens into ids using the vocab.""" + ids = [] + for token in tokens: + ids.append(self.vocab[token]) + return ids + + def convert_ids_to_tokens(self, ids): + """Converts a sequence of ids in wordpiece tokens using the vocab.""" + tokens = [] + for i in ids: + tokens.append(self.ids_to_tokens[i]) + return tokens + + @classmethod + def from_pretrained(cls, pretrained_model_name, do_lower_case=True): + """ + Instantiate a PreTrainedBertModel from a pre-trained model file. + Download and cache the pre-trained model file if needed. + """ + if pretrained_model_name in PRETRAINED_VOCAB_ARCHIVE_MAP: + vocab_file = PRETRAINED_VOCAB_ARCHIVE_MAP[pretrained_model_name] + else: + vocab_file = pretrained_model_name + # redirect to the cache, if necessary + try: + resolved_vocab_file = cached_path(vocab_file) + if resolved_vocab_file == vocab_file: + + logger.info("loading vocabulary file {}".format(vocab_file)) + else: + logger.info("loading vocabulary file {} from cache at {}".format( + vocab_file, resolved_vocab_file)) + # Instantiate tokenizer. + tokenizer = cls(resolved_vocab_file, do_lower_case) + except FileNotFoundError: + logger.error( + "Model name '{}' was not found in model name list ({}). " + "We assumed '{}' was a path or url but couldn't find any file " + "associated to this path or url.".format( + pretrained_model_name, + ', '.join(PRETRAINED_VOCAB_ARCHIVE_MAP.keys()), + pretrained_model_name)) + tokenizer = None + return tokenizer + + +class BasicTokenizer(object): + """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" + + def __init__(self, do_lower_case=True): + """Constructs a BasicTokenizer. + + Args: + do_lower_case: Whether to lower case the input. + """ + self.do_lower_case = do_lower_case + + def tokenize(self, text): + """Tokenizes a piece of text.""" + text = convert_to_unicode(text) + text = self._clean_text(text) + # This was added on November 1st, 2018 for the multilingual and Chinese + # models. This is also applied to the English models now, but it doesn't + # matter since the English models were not trained on any Chinese data + # and generally don't have any Chinese data in them (there are Chinese + # characters in the vocabulary because Wikipedia does have some Chinese + # words in the English Wikipedia.). + text = self._tokenize_chinese_chars(text) + orig_tokens = whitespace_tokenize(text) + split_tokens = [] + for token in orig_tokens: + if self.do_lower_case: + token = token.lower() + token = self._run_strip_accents(token) + split_tokens.extend(self._run_split_on_punc(token)) + + output_tokens = whitespace_tokenize(" ".join(split_tokens)) + return output_tokens + + def _run_strip_accents(self, text): + """Strips accents from a piece of text.""" + text = unicodedata.normalize("NFD", text) + output = [] + for char in text: + cat = unicodedata.category(char) + if cat == "Mn": + continue + output.append(char) + return "".join(output) + + def _run_split_on_punc(self, text): + """Splits punctuation on a piece of text.""" + chars = list(text) + i = 0 + start_new_word = True + output = [] + while i < len(chars): + char = chars[i] + if _is_punctuation(char): + output.append([char]) + start_new_word = True + else: + if start_new_word: + output.append([]) + start_new_word = False + output[-1].append(char) + i += 1 + + return ["".join(x) for x in output] + + def _tokenize_chinese_chars(self, text): + """Adds whitespace around any CJK character.""" + output = [] + for char in text: + cp = ord(char) + if self._is_chinese_char(cp): + output.append(" ") + output.append(char) + output.append(" ") + else: + output.append(char) + return "".join(output) + + def _is_chinese_char(self, cp): + """Checks whether CP is the codepoint of a CJK character.""" + # This defines a "chinese character" as anything in the CJK Unicode block: + # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + # + # Note that the CJK Unicode block is NOT all Japanese and Korean characters, + # despite its name. The modern Korean Hangul alphabet is a different block, + # as is Japanese Hiragana and Katakana. Those alphabets are used to write + # space-separated words, so they are not treated specially and handled + # like the all of the other languages. + if ((cp >= 0x4E00 and cp <= 0x9FFF) or # + (cp >= 0x3400 and cp <= 0x4DBF) or # + (cp >= 0x20000 and cp <= 0x2A6DF) or # + (cp >= 0x2A700 and cp <= 0x2B73F) or # + (cp >= 0x2B740 and cp <= 0x2B81F) or # + (cp >= 0x2B820 and cp <= 0x2CEAF) or + (cp >= 0xF900 and cp <= 0xFAFF) or # + (cp >= 0x2F800 and cp <= 0x2FA1F)): # + return True + + return False + + def _clean_text(self, text): + """Performs invalid character removal and whitespace cleanup on text.""" + output = [] + for char in text: + cp = ord(char) + if cp == 0 or cp == 0xfffd or _is_control(char): + continue + if _is_whitespace(char): + output.append(" ") + else: + output.append(char) + return "".join(output) + + +class WordpieceTokenizer(object): + """Runs WordPiece tokenization.""" + + def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=100): + self.vocab = vocab + self.unk_token = unk_token + self.max_input_chars_per_word = max_input_chars_per_word + + def tokenize(self, text): + """Tokenizes a piece of text into its word pieces. + + This uses a greedy longest-match-first algorithm to perform tokenization + using the given vocabulary. + + For example: + input = "unaffable" + output = ["un", "##aff", "##able"] + + Args: + text: A single token or whitespace separated tokens. This should have + already been passed through `BasicTokenizer. + + Returns: + A list of wordpiece tokens. + """ + + text = convert_to_unicode(text) + + output_tokens = [] + for token in whitespace_tokenize(text): + chars = list(token) + if len(chars) > self.max_input_chars_per_word: + output_tokens.append(self.unk_token) + continue + + is_bad = False + start = 0 + sub_tokens = [] + while start < len(chars): + end = len(chars) + cur_substr = None + while start < end: + substr = "".join(chars[start:end]) + if start > 0: + substr = "##" + substr + if substr in self.vocab: + cur_substr = substr + break + end -= 1 + if cur_substr is None: + is_bad = True + break + sub_tokens.append(cur_substr) + start = end + + if is_bad: + output_tokens.append(self.unk_token) + else: + output_tokens.extend(sub_tokens) + return output_tokens + + +def _is_whitespace(char): + """Checks whether `chars` is a whitespace character.""" + # \t, \n, and \r are technically contorl characters but we treat them + # as whitespace since they are generally considered as such. + if char == " " or char == "\t" or char == "\n" or char == "\r": + return True + cat = unicodedata.category(char) + if cat == "Zs": + return True + return False + + +def _is_control(char): + """Checks whether `chars` is a control character.""" + # These are technically control characters but we count them as whitespace + # characters. + if char == "\t" or char == "\n" or char == "\r": + return False + cat = unicodedata.category(char) + if cat.startswith("C"): + return True + return False + + +def _is_punctuation(char): + """Checks whether `chars` is a punctuation character.""" + cp = ord(char) + # We treat all non-letter/number ASCII as punctuation. + # Characters such as "^", "$", and "`" are not in the Unicode + # Punctuation class but we treat them as punctuation anyways, for + # consistency. + if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or + (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + return True + cat = unicodedata.category(char) + if cat.startswith("P"): + return True + return False diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization_test.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization_test.py new file mode 100644 index 0000000..8eacf57 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/tokenization_test.py @@ -0,0 +1,133 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import tempfile +import tokenization +import six +import tensorflow as tf + + +class TokenizationTest(tf.test.TestCase): + + def test_full_tokenizer(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing", "," + ] + with tempfile.NamedTemporaryFile(delete=False) as vocab_writer: + vocab_writer.write("".join([x + "\n" for x in vocab_tokens])) + + vocab_file = vocab_writer.name + + tokenizer = tokenization.FullTokenizer(vocab_file) + os.unlink(vocab_file) + + tokens = tokenizer.tokenize(u"UNwant\u00E9d,running") + self.assertAllEqual(tokens, ["un", "##want", "##ed", ",", "runn", "##ing"]) + + self.assertAllEqual( + tokenizer.convert_tokens_to_ids(tokens), [7, 4, 5, 10, 8, 9]) + + def test_chinese(self): + tokenizer = tokenization.BasicTokenizer() + + self.assertAllEqual( + tokenizer.tokenize(u"ah\u535A\u63A8zz"), + [u"ah", u"\u535A", u"\u63A8", u"zz"]) + + def test_basic_tokenizer_lower(self): + tokenizer = tokenization.BasicTokenizer(do_lower_case=True) + + self.assertAllEqual( + tokenizer.tokenize(u" \tHeLLo!how \n Are yoU? "), + ["hello", "!", "how", "are", "you", "?"]) + self.assertAllEqual(tokenizer.tokenize(u"H\u00E9llo"), ["hello"]) + + def test_basic_tokenizer_no_lower(self): + tokenizer = tokenization.BasicTokenizer(do_lower_case=False) + + self.assertAllEqual( + tokenizer.tokenize(u" \tHeLLo!how \n Are yoU? "), + ["HeLLo", "!", "how", "Are", "yoU", "?"]) + + def test_wordpiece_tokenizer(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing" + ] + + vocab = {} + for (i, token) in enumerate(vocab_tokens): + vocab[token] = i + tokenizer = tokenization.WordpieceTokenizer(vocab=vocab) + + self.assertAllEqual(tokenizer.tokenize(""), []) + + self.assertAllEqual( + tokenizer.tokenize("unwanted running"), + ["un", "##want", "##ed", "runn", "##ing"]) + + self.assertAllEqual( + tokenizer.tokenize("unwantedX running"), ["[UNK]", "runn", "##ing"]) + + def test_convert_tokens_to_ids(self): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing" + ] + + vocab = {} + for (i, token) in enumerate(vocab_tokens): + vocab[token] = i + + self.assertAllEqual( + tokenization.convert_tokens_to_ids( + vocab, ["un", "##want", "##ed", "runn", "##ing"]), [7, 4, 5, 8, 9]) + + def test_is_whitespace(self): + self.assertTrue(tokenization._is_whitespace(u" ")) + self.assertTrue(tokenization._is_whitespace(u"\t")) + self.assertTrue(tokenization._is_whitespace(u"\r")) + self.assertTrue(tokenization._is_whitespace(u"\n")) + self.assertTrue(tokenization._is_whitespace(u"\u00A0")) + + self.assertFalse(tokenization._is_whitespace(u"A")) + self.assertFalse(tokenization._is_whitespace(u"-")) + + def test_is_control(self): + self.assertTrue(tokenization._is_control(u"\u0005")) + + self.assertFalse(tokenization._is_control(u"A")) + self.assertFalse(tokenization._is_control(u" ")) + self.assertFalse(tokenization._is_control(u"\t")) + self.assertFalse(tokenization._is_control(u"\r")) + self.assertFalse(tokenization._is_control(u"\U0001F4A9")) + + def test_is_punctuation(self): + self.assertTrue(tokenization._is_punctuation(u"-")) + self.assertTrue(tokenization._is_punctuation(u"$")) + self.assertTrue(tokenization._is_punctuation(u"`")) + self.assertTrue(tokenization._is_punctuation(u".")) + + self.assertFalse(tokenization._is_punctuation(u"A")) + self.assertFalse(tokenization._is_punctuation(u" ")) + + +if __name__ == "__main__": + tf.test.main() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/README.md b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/README.md new file mode 100644 index 0000000..247014e --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/README.md @@ -0,0 +1,108 @@ +# Deploying the BERT model using TensorRT Inference Server + +The [NVIDIA TensorRT Inference Server](https://github.com/NVIDIA/tensorrt-inference-server) provides a datacenter and cloud inferencing solution optimized for NVIDIA GPUs. The server provides an inference service via an HTTP or gRPC endpoint, allowing remote clients to request inferencing for any number of GPU or CPU models being managed by the server. +This folder contains detailed performance analysis as well as scripts to run SQuAD fine-tuning on BERT model using TensorRT Inference Server. + +## Table Of Contents + +- [TensorRT Inference Server Overview](#tensorrt-inference-server-overview) +- [Performance analysis for TensorRT Inference Server](#performance-analysis-for-tensorrt-inference-server) + * [Advanced Details](#advanced-details) +- [Running the TensorRT Inference Server and client](#running-the-tensorrt-inference-server-and-client) + +## TensorRT Inference Server Overview + +A typical TensorRT Inference Server pipeline can be broken down into the following 8 steps: +1. Client serializes the inference request into a message and sends it to the server (Client Send) +2. Message travels over the network from the client to the server (Network) +3. Message arrives at server, and is deserialized (Server Receive) +4. Request is placed on the queue (Server Queue) +5. Request is removed from the queue and computed (Server Compute) +6. Completed request is serialized in a message and sent back to the client (Server Send) +7. Completed message travels over network from the server to the client (Network) +8. Completed message is deserialized by the client and processed as a completed inference request (Client Receive) + +Generally, for local clients, steps 1-4 and 6-8 will only occupy a small fraction of time, compared to steps 5-6. As backend deep learning systems like BERT are rarely exposed directly to end users, but instead only interfacing with local front-end servers, for the sake of BERT, we can consider that all clients are local. +In this section, we will go over how to launch TensorRT Inference Server and client and get the best performant solution that fits your specific application needs. + +Note: The following instructions are run from outside the container and call `docker run` commands as required. + +## Performance analysis for TensorRT Inference Server + +Based on the figures 1 and 2 below, we recommend using the Dynamic Batcher with `max_batch_size = 8`, `max_queue_delay_microseconds` as large as possible to fit within your latency window (the values used below are extremely large to exaggerate their effect), and only 1 instance of the engine. The largest improvements to both throughput and latency come from increasing the batch size due to efficiency gains in the GPU with larger batches. The Dynamic Batcher combines the best of both worlds by efficiently batching together a large number of simultaneous requests, while also keeping latency down for infrequent requests. We recommend only 1 instance of the engine due to the negligible improvement to throughput at the cost of significant increases in latency. Many models can benefit from multiple engine instances but as the figures below show, that is not the case for this model. + +![](../data/images/trtis_base_summary.png?raw=true) + +Figure 1: Latency vs Throughput for BERT Base, FP16, Sequence Length = 128 using various configurations available in TensorRT Inference Server + +![](../data/images/trtis_large_summary.png?raw=true) + +Figure 2: Latency vs Throughput for BERT Large, FP16, Sequence Length = 384 using various configurations available in TensorRT Inference Server + +### Advanced Details + +This section digs deeper into the performance numbers and configurations corresponding to running TensorRT Inference Server for BERT fine tuning for Question Answering. It explains the tradeoffs in selecting maximum batch sizes, batching techniques and number of inference engines on the same GPU to understand how we arrived at the optimal configuration specified previously. + +Results can be reproduced by running `generate_figures.sh`. It exports the TensorFlow BERT model as a `tensorflow_savedmodel` that TensorRT Inference Server accepts, builds a matching [TensorRT Inference Server model config](https://docs.nvidia.com/deeplearning/sdk/tensorrt-inference-server-guide/docs/model_configuration.html#), starts the server on localhost in a detached state and runs [perf_client](https://docs.nvidia.com/deeplearning/sdk/tensorrt-inference-server-guide/docs/client.html#performance-example-application) for various configurations. + +```bash +bash trtis/scripts/generate_figures.sh +``` + +All results below are obtained on a single DGX-1 V100 32GB GPU for BERT Base, Sequence Length = 128 and FP16 precision running on a local server. Latencies are indicated by bar plots using the left axis. Throughput is indicated by the blue line plot using the right axis. X-axis indicates the concurrency - the maximum number of inference requests that can be in the pipeline at any given time. For example, when the concurrency is set to 1, the client waits for an inference request to be completed (Step 8) before it sends another to the server (Step 1). A high number of concurrent requests can reduce the impact of network latency on overall throughput. + +#### Maximum batch size + +As we can see in Figure 3, the throughput at BS=1, Client Concurrent Requests = 64 is 119 and in Figure 4, the throughput at BS=8, Client Concurrent Requests = 8 is 517, respectively giving a speedup of ~4.3x + +Note: We compare BS=1, Client Concurrent Requests = 64 to BS=8, Client Concurrent Requests = 8 to keep the Total Number of Outstanding Requests equal between the two different modes. Where Total Number of Outstanding Requests = Batch Size * Client Concurrent Requests. This is also why there are 8 times as many bars on the BS=1 chart than the BS=8 chart. + +Increasing the batch size from 1 to 8 results in an increase in compute time by 1.8x (8.38ms to 15.46ms) showing that computation is more efficient at higher batch sizes. Hence, an optimal batch size would be the maximum batch size that can both fit in memory and is within the preferred latency threshold. + +![](../data/images/trtis_bs_1.png?raw=true) + +Figure 3: Latency & Throughput vs Concurrency at Batch size = 1 + +![](../data/images/trtis_bs_8.png?raw=true) + +Figure 4: Latency & Throughput vs Concurrency at Batch size = 8 + +#### Batching techniques + +Static batching is a feature of the inference server that allows inference requests to be served as they are received. It is preferred in scenarios where low latency is desired at the cost of throughput when the GPU is under utilized. + +Dynamic batching is a feature of the inference server that allows inference requests to be combined by the server, so that a batch is created dynamically, resulting in an increased throughput. It is preferred in scenarios where we would like to maximize throughput and GPU utilization at the cost of higher latencies. You can set the [Dynamic Batcher parameters](https://docs.nvidia.com/deeplearning/sdk/tensorrt-inference-server-master-branch-guide/docs/model_configuration.html#dynamic-batcher) `max_queue_delay_microseconds` to indicate the maximum amount of time you are willing to wait and ‘preferred_batchsize’ to indicate your optimal batch sizes in the TensorRT Inference Server model config. + +Figures 5 and 6 emphasize the increase in overall throughput with dynamic batching. At low numbers of concurrent requests, the increased throughput comes at the cost of increasing latency as the requests are queued up to `max_queue_delay_microseconds`. The effect of `preferred_batchsize` for dynamic batching is visually depicted by the dip in Server Queue time at integer multiples of the preferred batch sizes. At higher numbers of concurrent requests, observe that the throughput approach a maximum limit as we saturate the GPU utilization. + +![](../data/images/trtis_static.png?raw=true) + +Figure 5: Latency & Throughput vs Concurrency using Static Batching at `Batch size` = 1 + +![](../data/images/trtis_dynamic.png?raw=true) + +Figure 6: Latency & Throughput vs Concurrency using Dynamic Batching at `Batch size` = 1, `preferred_batchsize` = [4, 8] and `max_queue_delay_microseconds` = 5000 + +#### Model execution instance count + +TensorRT Inference Server enables us to launch multiple engines in separate CUDA streams by setting the `instance_group_count` parameter to improve both latency and throughput. Multiple engines are useful when the model doesn’t saturate the GPU allowing the GPU to run multiple instances of the model in parallel. + +Figures 7 and 8 show a drop in queue time as more models are available to serve an inference request. However, this is countered by an increase in compute time as multiple models compete for resources. Since BERT is a large model which utilizes the majority of the GPU, the benefit to running multiple engines is not seen. + +![](../data/images/trtis_ec_1.png?raw=true) + +Figure 7: Latency & Throughput vs Concurrency at Batch size = 1, Engine Count = 1 +(One copy of the model loaded in GPU memory) + +![](../data/images/trtis_ec_4.png?raw=true) + +Figure 8: Latency & Throughput vs Concurrency at Batch size = 1, Engine count = 4 +(Four copies the model loaded in GPU memory) + +## Running the TensorRT Inference Server and client + +The `run_trtis.sh` script exports the TensorFlow BERT model as a `tensorflow_savedmodel` that TensorRT Inference Server accepts, builds a matching [TensorRT Inference Server model config](https://docs.nvidia.com/deeplearning/sdk/tensorrt-inference-server-guide/docs/model_configuration.html#), starts the server on local host in a detached state, runs client and then evaluates the validity of predictions on the basis of exact match and F1 score all in one step. + +```bash +bash trtis/scripts/run_trtis.sh +``` diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/run_squad_trtis_client.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/run_squad_trtis_client.py new file mode 100644 index 0000000..83f91b1 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/run_squad_trtis_client.py @@ -0,0 +1,222 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import modeling +import tokenization +from tensorrtserver.api import ProtocolType, InferContext, ServerStatusContext, grpc_service_pb2_grpc, grpc_service_pb2, model_config_pb2 +from utils.create_squad_data import * +import grpc +from run_squad import * +import numpy as np +import tqdm + +# Set this to either 'label_ids' for Google bert or 'unique_ids' for JoC +label_id_key = "unique_ids" + +PendingResult = collections.namedtuple("PendingResult", + ["async_id", "start_time", "inputs"]) + +def batch(iterable, n=1): + l = len(iterable) + for ndx in range(0, l, n): + label_ids_data = () + input_ids_data = () + input_mask_data = () + segment_ids_data = () + for i in range(0, min(n, l-ndx)): + label_ids_data = label_ids_data + (np.array([iterable[ndx + i].unique_id], dtype=np.int32),) + input_ids_data = input_ids_data+ (np.array(iterable[ndx + i].input_ids, dtype=np.int32),) + input_mask_data = input_mask_data+ (np.array(iterable[ndx + i].input_mask, dtype=np.int32),) + segment_ids_data = segment_ids_data+ (np.array(iterable[ndx + i].segment_ids, dtype=np.int32),) + + inputs_dict = {label_id_key: label_ids_data, + 'input_ids': input_ids_data, + 'input_mask': input_mask_data, + 'segment_ids': segment_ids_data} + yield inputs_dict + +def run_client(): + """ + Ask a question of context on TRTIS. + :param context: str + :param question: str + :param question_id: int + :return: + """ + + tokenizer = tokenization.FullTokenizer(vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + + + eval_examples = read_squad_examples( + input_file=FLAGS.predict_file, is_training=False, + version_2_with_negative=FLAGS.version_2_with_negative) + + eval_features = [] + + def append_feature(feature): + eval_features.append(feature) + + convert_examples_to_features( + examples=eval_examples[0:], + tokenizer=tokenizer, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=False, + output_fn=append_feature) + + protocol_str = 'grpc' # http or grpc + url = FLAGS.trtis_server_url + verbose = True + model_name = FLAGS.trtis_model_name + model_version = FLAGS.trtis_model_version + batch_size = FLAGS.predict_batch_size + + protocol = ProtocolType.from_str(protocol_str) # or 'grpc' + + ctx = InferContext(url, protocol, model_name, model_version, verbose) + + channel = grpc.insecure_channel(url) + + stub = grpc_service_pb2_grpc.GRPCServiceStub(channel) + + prof_request = grpc_service_pb2.server__status__pb2.model__config__pb2.ModelConfig() + + prof_response = stub.Profile(prof_request) + + status_ctx = ServerStatusContext(url, protocol, model_name=model_name, verbose=verbose) + + model_config_pb2.ModelConfig() + + status_result = status_ctx.get_server_status() + + outstanding = {} + max_outstanding = 20 + + sent_prog = tqdm.tqdm(desc="Send Requests", total=len(eval_features)) + recv_prog = tqdm.tqdm(desc="Recv Requests", total=len(eval_features)) + + def process_outstanding(do_wait): + + if (len(outstanding) == 0): + return + + ready_id = ctx.get_ready_async_request(do_wait) + + if (ready_id is None): + return + + # If we are here, we got an id + result = ctx.get_async_run_results(ready_id, False) + stop = time.time() + + if (result is None): + raise ValueError("Context returned null for async id marked as done") + + outResult = outstanding.pop(ready_id) + + time_list.append(stop - outResult.start_time) + + batch_count = len(outResult.inputs[label_id_key]) + + for i in range(batch_count): + unique_id = int(outResult.inputs[label_id_key][i][0]) + start_logits = [float(x) for x in result["start_logits"][i].flat] + end_logits = [float(x) for x in result["end_logits"][i].flat] + all_results.append( + RawResult( + unique_id=unique_id, + start_logits=start_logits, + end_logits=end_logits)) + + recv_prog.update(n=batch_count) + + all_results = [] + time_list = [] + + print("Starting Sending Requests....\n") + + all_results_start = time.time() + + for inputs_dict in batch(eval_features, batch_size): + + present_batch_size = len(inputs_dict[label_id_key]) + + outputs_dict = {'start_logits': InferContext.ResultFormat.RAW, + 'end_logits': InferContext.ResultFormat.RAW} + + start = time.time() + async_id = ctx.async_run(inputs_dict, outputs_dict, batch_size=present_batch_size) + + outstanding[async_id] = PendingResult(async_id=async_id, start_time=start, inputs=inputs_dict) + + sent_prog.update(n=present_batch_size) + + # Try to process at least one response per request + process_outstanding(len(outstanding) >= max_outstanding) + + tqdm.tqdm.write("All Requests Sent! Waiting for responses. Outstanding: {}.\n".format(len(outstanding))) + + # Now process all outstanding requests + while (len(outstanding) > 0): + process_outstanding(True) + + all_results_end = time.time() + all_results_total = (all_results_end - all_results_start) * 1000.0 + + print("-----------------------------") + print("Individual Time Runs - Ignoring first two iterations") + print("Total Time: {} ms".format(all_results_total)) + print("-----------------------------") + + print("-----------------------------") + print("Total Inference Time = %0.2f for" + "Sentences processed = %d" % (sum(time_list), len(eval_features))) + print("Throughput Average (sentences/sec) = %0.2f" % (len(eval_features) / all_results_total * 1000.0)) + print("-----------------------------") + + time_list.sort() + + avg = np.mean(time_list) + cf_95 = max(time_list[:int(len(time_list) * 0.95)]) + cf_99 = max(time_list[:int(len(time_list) * 0.99)]) + cf_100 = max(time_list[:int(len(time_list) * 1)]) + print("-----------------------------") + print("Summary Statistics") + print("Batch size =", FLAGS.predict_batch_size) + print("Sequence Length =", FLAGS.max_seq_length) + print("Latency Confidence Level 95 (ms) =", cf_95 * 1000) + print("Latency Confidence Level 99 (ms) =", cf_99 * 1000) + print("Latency Confidence Level 100 (ms) =", cf_100 * 1000) + print("Latency Average (ms) =", avg * 1000) + print("-----------------------------") + + + output_prediction_file = os.path.join(FLAGS.output_dir, "predictions.json") + output_nbest_file = os.path.join(FLAGS.output_dir, "nbest_predictions.json") + output_null_log_odds_file = os.path.join(FLAGS.output_dir, "null_odds.json") + + write_predictions(eval_examples, eval_features, all_results, + FLAGS.n_best_size, FLAGS.max_answer_length, + FLAGS.do_lower_case, output_prediction_file, + output_nbest_file, output_null_log_odds_file) + + + +if __name__ == "__main__": + flags.mark_flag_as_required("vocab_file") + flags.mark_flag_as_required("bert_config_file") + flags.mark_flag_as_required("output_dir") + + run_client() + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/export_model.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/export_model.sh new file mode 100644 index 0000000..d6bf4f4 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/export_model.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +init_checkpoint=${1:-"/results/models/bert_large_fp16_384_v1/model.ckpt-5474"} +batch_size=${2:-"8"} +precision=${3:-"fp16"} +use_xla=${4:-"true"} +seq_length=${5:-"384"} +doc_stride=${6:-"128"} +BERT_DIR=${7:-"data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16"} +trtis_model_version=${8:-1} +trtis_model_name=${9:-"bert"} +trtis_dyn_batching_delay=${10:-0} +trtis_engine_count=${11:-1} +trtis_model_overwrite=${12:-"False"} + +additional_args="--trtis_model_version=$trtis_model_version --trtis_model_name=$trtis_model_name --trtis_max_batch_size=$batch_size \ + --trtis_model_overwrite=$trtis_model_overwrite --trtis_dyn_batching_delay=$trtis_dyn_batching_delay \ + --trtis_engine_count=$trtis_engine_count" + +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + additional_args="$additional_args --use_fp16" +fi + +if [ "$use_xla" = "true" ] ; then + echo "XLA activated" + additional_args="$additional_args --use_xla" +fi + +echo "Additional args: $additional_args" + +bash scripts/docker/launch.sh \ + python run_squad.py \ + --vocab_file=${BERT_DIR}/vocab.txt \ + --bert_config_file=${BERT_DIR}/bert_config.json \ + --init_checkpoint=${init_checkpoint} \ + --max_seq_length=${seq_length} \ + --doc_stride=${doc_stride} \ + --predict_batch_size=${batch_size} \ + --output_dir=/results \ + --export_trtis=True \ + ${additional_args} + + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/generate_figures.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/generate_figures.sh new file mode 100644 index 0000000..4c31941 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/generate_figures.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Set the number of devices to use +export NVIDIA_VISIBLE_DEVICES=0 + +# Always need to be overwriting models to keep memory use low +export TRTIS_MODEL_OVERWRITE=True + +bert_model=${1:-small} +seq_length=${2:-128} +precision=${3:-fp16} +init_checkpoint=${4:-"/results/models/bert_tf_${bert_model}_${precision}_${seq_length}_v1/model.ckpt-5474"} + +MODEL_NAME="bert_${bert_model}_${seq_length}_${precision}" + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi + +doc_stride=128 +use_xla=true +EXPORT_MODEL_ARGS="${precision} ${use_xla} ${seq_length} ${doc_stride} ${BERT_DIR} 1 ${MODEL_NAME}" +PERF_CLIENT_ARGS="1000 10 20 localhost" + +# Start Server +bash trtis/scripts/launch_server.sh $precision + +# Restart Server +restart_server() { +docker kill trt_server_cont +bash trtis/scripts/launch_server.sh $precision +} + +############## Dynamic Batching Comparison ############## +SERVER_BATCH_SIZE=8 +CLIENT_BATCH_SIZE=1 +TRTIS_ENGINE_COUNT=1 + +# Dynamic batching 10 ms +TRTIS_DYN_BATCHING_DELAY=10 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + +# Dynamic batching 5 ms +TRTIS_DYN_BATCHING_DELAY=5 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + +# Dynamic batching 2 ms +TRTIS_DYN_BATCHING_DELAY=2 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + + +# Static Batching (i.e. Dynamic batching 0 ms) +TRTIS_DYN_BATCHING_DELAY=0 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + + +# ############## Engine Count Comparison ############## +SERVER_BATCH_SIZE=1 +CLIENT_BATCH_SIZE=1 +TRTIS_DYN_BATCHING_DELAY=0 + +# Engine Count = 4 +TRTIS_ENGINE_COUNT=4 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + +# Engine Count = 2 +TRTIS_ENGINE_COUNT=2 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + +# Engine Count = 1 +TRTIS_ENGINE_COUNT=1 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} ${PERF_CLIENT_ARGS} + + +############## Batch Size Comparison ############## +# BATCH=1 Generate model and perf +SERVER_BATCH_SIZE=1 +CLIENT_BATCH_SIZE=1 +TRTIS_ENGINE_COUNT=1 +TRTIS_DYN_BATCHING_DELAY=0 + +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} 1000 10 64 localhost + +# BATCH=2 Generate model and perf +SERVER_BATCH_SIZE=2 +CLIENT_BATCH_SIZE=2 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} 1000 10 32 localhost + +# BATCH=4 Generate model and perf +SERVER_BATCH_SIZE=4 +CLIENT_BATCH_SIZE=4 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} 1000 10 16 localhost + +# BATCH=8 Generate model and perf +SERVER_BATCH_SIZE=8 +CLIENT_BATCH_SIZE=8 +bash trtis/scripts/export_model.sh ${init_checkpoint} ${SERVER_BATCH_SIZE} ${EXPORT_MODEL_ARGS} ${TRTIS_DYN_BATCHING_DELAY} ${TRTIS_ENGINE_COUNT} ${TRTIS_MODEL_OVERWRITE} +restart_server +sleep 15 +bash trtis/scripts/run_perf_client.sh ${MODEL_NAME} 1 ${precision} ${CLIENT_BATCH_SIZE} 1000 10 8 localhost + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/launch_server.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/launch_server.sh new file mode 100644 index 0000000..a0cc077 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/launch_server.sh @@ -0,0 +1,24 @@ +precision=${1:-"fp16"} +NV_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES:-"all"} + +if [ "$precision" = "fp16" ] ; then + echo "fp16 activated!" + export TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE=1 +else + echo "fp32 activated!" + export TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE=0 +fi + +# Start TRTIS server in detached state +nvidia-docker run -d --rm \ + --shm-size=1g \ + --ulimit memlock=-1 \ + --ulimit stack=67108864 \ + -p8000:8000 \ + -p8001:8001 \ + -p8002:8002 \ + --name trt_server_cont \ + -e NVIDIA_VISIBLE_DEVICES=$NV_VISIBLE_DEVICES \ + -e TF_ENABLE_AUTO_MIXED_PRECISION_GRAPH_REWRITE \ + -v $PWD/results/trtis_models:/models \ + nvcr.io/nvidia/tensorrtserver:19.08-py3 trtserver --model-store=/models --strict-model-config=false \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_client.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_client.sh new file mode 100644 index 0000000..ab107ca --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_client.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +batch_size=${1:-"8"} +seq_length=${2:-"384"} +doc_stride=${3:-"128"} +trtis_version_name=${4:-"1"} +trtis_model_name=${5:-"bert"} +BERT_DIR=${6:-"data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16"} +squad_version=${7:-"1.1"} + +export SQUAD_DIR=data/download/squad/v${squad_version} +if [ "$squad_version" = "1.1" ] ; then + version_2_with_negative="False" +else + version_2_with_negative="True" +fi + +echo "Squad directory set as " $SQUAD_DIR +if [ ! -d "$SQUAD_DIR" ] ; then + echo "Error! $SQUAD_DIR directory missing. Please mount SQuAD dataset." + exit -1 +fi + +bash scripts/docker/launch.sh \ + "python trtis/run_squad_trtis_client.py \ + --trtis_model_name=$trtis_model_name \ + --trtis_model_version=$trtis_version_name \ + --vocab_file=$BERT_DIR/vocab.txt \ + --bert_config_file=$BERT_DIR/bert_config.json \ + --predict_file=$SQUAD_DIR/dev-v${squad_version}.json \ + --predict_batch_size=$batch_size \ + --max_seq_length=${seq_length} \ + --doc_stride=${doc_stride} \ + --output_dir=/results \ + --version_2_with_negative=${version_2_with_negative}" + +bash scripts/docker/launch.sh "python $SQUAD_DIR/evaluate-v${squad_version}.py \ + $SQUAD_DIR/dev-v${squad_version}.json /results/predictions.json" diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_perf_client.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_perf_client.sh new file mode 100644 index 0000000..b5fff76 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_perf_client.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +MODEL_NAME=${1:-"bert"} +MODEL_VERSION=${2:-1} +precision=${3:-"fp16"} +BATCH_SIZE=${4:-1} +MAX_LATENCY=${5:-500} +MAX_CLIENT_THREADS=${6:-10} +MAX_CONCURRENCY=${7:-50} +SERVER_HOSTNAME=${8:-"localhost"} + +if [[ $SERVER_HOSTNAME == *":"* ]]; then + echo "ERROR! Do not include the port when passing the Server Hostname. These scripts require that the TRTIS HTTP endpoint is on Port 8000 and the gRPC endpoint is on Port 8001. Exiting..." + exit 1 +fi + +if [ "$SERVER_HOSTNAME" = "localhost" ] +then + if [ ! "$(docker inspect -f "{{.State.Running}}" trt_server_cont)" = "true" ] ; then + + echo "Launching TRTIS server" + bash trtis/scripts/launch_server.sh $precision + SERVER_LAUNCHED=true + + function cleanup_server { + echo "Killing TRTIS server" + docker kill trt_server_cont + } + + # Ensure we cleanup the server on exit + # trap "exit" INT TERM + trap cleanup_server EXIT + fi +fi + +# Wait until server is up. curl on the health of the server and sleep until its ready +bash trtis/scripts/wait_for_trtis_server.sh $SERVER_HOSTNAME + +TIMESTAMP=$(date "+%y%m%d_%H%M") + +bash scripts/docker/launch.sh mkdir -p /results/perf_client/${MODEL_NAME} +OUTPUT_FILE_CSV="/results/perf_client/${MODEL_NAME}/results_${TIMESTAMP}.csv" + +ARGS="\ + --max-threads ${MAX_CLIENT_THREADS} \ + -m ${MODEL_NAME} \ + -x ${MODEL_VERSION} \ + -p 3000 \ + -d \ + -v \ + -i gRPC \ + -u ${SERVER_HOSTNAME}:8001 \ + -b ${BATCH_SIZE} \ + -l ${MAX_LATENCY} \ + -c ${MAX_CONCURRENCY} \ + -f ${OUTPUT_FILE_CSV}" + +echo "Using args: $(echo "$ARGS" | sed -e 's/ -/\n-/g')" + +bash scripts/docker/launch.sh /workspace/install/bin/perf_client $ARGS diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_trtis.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_trtis.sh new file mode 100644 index 0000000..38cb823 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/run_trtis.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +init_checkpoint=${1:-"/results/models/bert_large_fp16_384_v1/model.ckpt-5474"} +batch_size=${2:-"8"} +precision=${3:-"fp16"} +use_xla=${4:-"true"} +seq_length=${5:-"384"} +doc_stride=${6:-"128"} +bert_model=${7:-"large"} +squad_version=${8:-"1.1"} +trtis_version_name=${9:-1} +trtis_model_name=${10:-"bert"} +trtis_export_model=${11:-"false"} +trtis_dyn_batching_delay=${12:-0} +trtis_engine_count=${13:-1} +trtis_model_overwrite=${14:-"False"} + +if [ "$bert_model" = "large" ] ; then + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-24_H-1024_A-16 +else + export BERT_DIR=data/download/google_pretrained_weights/uncased_L-12_H-768_A-12 +fi + +if [ ! -d "$BERT_DIR" ] ; then + echo "Error! $BERT_DIR directory missing. Please mount pretrained BERT dataset." + exit -1 +fi + +# Need to ignore case on some variables +trtis_export_model=$(echo "$trtis_export_model" | tr '[:upper:]' '[:lower:]') + +# Explicitly save this variable to pass down to new containers +NV_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES:-"all"} + +echo " BERT directory set as " $BERT_DIR +echo +echo "Argument: " +echo " init_checkpoint = $init_checkpoint" +echo " batch_size = $batch_size" +echo " precision = $precision" +echo " use_xla = $use_xla" +echo " seq_length = $seq_length" +echo " doc_stride = $doc_stride" +echo " bert_model = $bert_model" +echo " squad_version = $squad_version" +echo " version_name = $trtis_version_name" +echo " model_name = $trtis_model_name" +echo " export_model = $trtis_export_model" +echo +echo "Env: " +echo " NVIDIA_VISIBLE_DEVICES = $NV_VISIBLE_DEVICES" +echo + +# Export Model in SavedModel format if enabled +if [ "$trtis_export_model" = "true" ] ; then + echo "Exporting model as: Name - $trtis_model_name Version - $trtis_version_name" + + bash trtis/scripts/export_model.sh $init_checkpoint $batch_size $precision $use_xla $seq_length \ + $doc_stride $BERT_DIR $RESULTS_DIR $trtis_version_name $trtis_model_name \ + $trtis_dyn_batching_delay $trtis_engine_count $trtis_model_overwrite +fi + +# Start TRTIS server in detached state +bash trtis/scripts/launch_server.sh $precision + +# Wait until server is up. curl on the health of the server and sleep until its ready +bash trtis/scripts/wait_for_trtis_server.sh localhost + +# Start TRTIS client for inference and evaluate results +bash trtis/scripts/run_client.sh $batch_size $seq_length $doc_stride $trtis_version_name $trtis_model_name \ + $BERT_DIR $squad_version + + +#Kill the TRTIS Server +docker kill trt_server_cont diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/wait_for_trtis_server.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/wait_for_trtis_server.sh new file mode 100644 index 0000000..ab73f0f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/trtis/scripts/wait_for_trtis_server.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +SERVER_URI=${1:-"localhost"} + +echo "Waiting for TRTIS Server to be ready at http://$SERVER_URI:8000..." + +live_command="curl -m 1 -L -s -o /dev/null -w %{http_code} http://$SERVER_URI:8000/api/health/live" +ready_command="curl -m 1 -L -s -o /dev/null -w %{http_code} http://$SERVER_URI:8000/api/health/ready" + +current_status=$($live_command) + +# First check the current status. If that passes, check the json. If either fail, loop +while [[ ${current_status} != "200" ]] || [[ $($ready_command) != "200" ]]; do + + printf "." + sleep 1 + current_status=$($live_command) +done + +echo "TRTIS Server is ready!" \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_glue_data.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_glue_data.py new file mode 100644 index 0000000..de21962 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_glue_data.py @@ -0,0 +1,512 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import json +import math +import os +import random +import modeling +import optimization +import tokenization +import six +import tensorflow as tf +import horovod.tensorflow as hvd +import time +import csv + +flags = tf.flags +FLAGS = None + +def extract_flags(): + + ## Required parameters + flags.DEFINE_string( + "data_dir", None, + "The input data dir. Should contain the .tsv files (or other data files) " + "for the task.") + + flags.DEFINE_string("task_name", None, "The name of the task to train.") + + flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + + flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + + flags.DEFINE_integer( + "max_seq_length", 128, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + + flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the warnings related to data processing will be printed. " + "A number of warnings are expected for a normal SQuAD evaluation.") + flags.mark_flag_as_required("data_dir") + flags.mark_flag_as_required("task_name") + flags.mark_flag_as_required("vocab_file") + return flags.FLAGS + + +class InputExample(object): + """A single training/test example for simple sequence classification.""" + + def __init__(self, guid, text_a, text_b=None, label=None): + """Constructs a InputExample. + Args: + guid: Unique id for the example. + text_a: string. The untokenized text of the first sequence. For single + sequence tasks, only this sequence must be specified. + text_b: (Optional) string. The untokenized text of the second sequence. + Only must be specified for sequence pair tasks. + label: (Optional) string. The label of the example. This should be + specified for train and dev examples, but not for test examples. + """ + self.guid = guid + self.text_a = text_a + self.text_b = text_b + self.label = label + +class PaddingInputExample(object): + """Fake example so the num input examples is a multiple of the batch size. + + When running eval/predict on the TPU, we need to pad the number of examples + to be a multiple of the batch size, because the TPU requires a fixed batch + size. The alternative is to drop the last batch, which is bad because it means + the entire output data won't be generated. + + We use this class instead of `None` because treating `None` as padding + battches could cause silent errors. + """ + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + input_ids, + input_mask, + segment_ids, + label_id, + is_real_example=True): + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.label_id = label_id + self.is_real_example = is_real_example + + +class DataProcessor(object): + """Base class for data converters for sequence classification data sets.""" + + def get_train_examples(self, data_dir): + """Gets a collection of `InputExample`s for the train set.""" + raise NotImplementedError() + + def get_dev_examples(self, data_dir): + """Gets a collection of `InputExample`s for the dev set.""" + raise NotImplementedError() + + def get_test_examples(self, data_dir): + """Gets a collection of `InputExample`s for prediction.""" + raise NotImplementedError() + + def get_labels(self): + """Gets the list of labels for this data set.""" + raise NotImplementedError() + + @classmethod + def _read_tsv(cls, input_file, quotechar=None): + """Reads a tab separated value file.""" + with tf.gfile.Open(input_file, "r") as f: + reader = csv.reader(f, delimiter="\t", quotechar=quotechar) + lines = [] + for line in reader: + lines.append(line) + return lines + + +class XnliProcessor(DataProcessor): + """Processor for the XNLI data set.""" + + def __init__(self): + self.language = "zh" + + def get_train_examples(self, data_dir): + """See base class.""" + lines = self._read_tsv( + os.path.join(data_dir, "multinli", + "multinli.train.%s.tsv" % self.language)) + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "train-%d" % (i) + text_a = tokenization.convert_to_unicode(line[0]) + text_b = tokenization.convert_to_unicode(line[1]) + label = tokenization.convert_to_unicode(line[2]) + if label == tokenization.convert_to_unicode("contradictory"): + label = tokenization.convert_to_unicode("contradiction") + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + def get_dev_examples(self, data_dir): + """See base class.""" + lines = self._read_tsv(os.path.join(data_dir, "xnli.dev.tsv")) + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "dev-%d" % (i) + language = tokenization.convert_to_unicode(line[0]) + if language != tokenization.convert_to_unicode(self.language): + continue + text_a = tokenization.convert_to_unicode(line[6]) + text_b = tokenization.convert_to_unicode(line[7]) + label = tokenization.convert_to_unicode(line[1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + def get_labels(self): + """See base class.""" + return ["contradiction", "entailment", "neutral"] + + +class MnliProcessor(DataProcessor): + """Processor for the MultiNLI data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev_matched.tsv")), + "dev_matched") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test_matched.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["contradiction", "entailment", "neutral"] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, tokenization.convert_to_unicode(line[0])) + text_a = tokenization.convert_to_unicode(line[8]) + text_b = tokenization.convert_to_unicode(line[9]) + if set_type == "test": + label = "contradiction" + else: + label = tokenization.convert_to_unicode(line[-1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class MrpcProcessor(DataProcessor): + """Processor for the MRPC data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + if i == 0: + continue + guid = "%s-%s" % (set_type, i) + text_a = tokenization.convert_to_unicode(line[3]) + text_b = tokenization.convert_to_unicode(line[4]) + if set_type == "test": + label = "0" + else: + label = tokenization.convert_to_unicode(line[0]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label)) + return examples + + +class ColaProcessor(DataProcessor): + """Processor for the CoLA data set (GLUE version).""" + + def get_train_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "train.tsv")), "train") + + def get_dev_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev") + + def get_test_examples(self, data_dir): + """See base class.""" + return self._create_examples( + self._read_tsv(os.path.join(data_dir, "test.tsv")), "test") + + def get_labels(self): + """See base class.""" + return ["0", "1"] + + def _create_examples(self, lines, set_type): + """Creates examples for the training and dev sets.""" + examples = [] + for (i, line) in enumerate(lines): + # Only the test set has a header + if set_type == "test" and i == 0: + continue + guid = "%s-%s" % (set_type, i) + if set_type == "test": + text_a = tokenization.convert_to_unicode(line[1]) + label = "0" + else: + text_a = tokenization.convert_to_unicode(line[3]) + label = tokenization.convert_to_unicode(line[1]) + examples.append( + InputExample(guid=guid, text_a=text_a, text_b=None, label=label)) + return examples + + +def _truncate_seq_pair(tokens_a, tokens_b, max_length): + """Truncates a sequence pair in place to the maximum length.""" + + # This is a simple heuristic which will always truncate the longer sequence + # one token at a time. This makes more sense than truncating an equal percent + # of tokens from each, since if one sequence is very short then each token + # that's truncated likely contains more information than a longer sequence. + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_length: + break + if len(tokens_a) > len(tokens_b): + tokens_a.pop() + else: + tokens_b.pop() + +def convert_single_example(ex_index, example, label_list, max_seq_length, + tokenizer, verbose_logging=False): + """Converts a single `InputExample` into a single `InputFeatures`.""" + + if isinstance(example, PaddingInputExample): + return InputFeatures( + input_ids=[0] * max_seq_length, + input_mask=[0] * max_seq_length, + segment_ids=[0] * max_seq_length, + label_id=0, + is_real_example=False) + + label_map = {} + for (i, label) in enumerate(label_list): + label_map[label] = i + + tokens_a = tokenizer.tokenize(example.text_a) + tokens_b = None + if example.text_b: + tokens_b = tokenizer.tokenize(example.text_b) + + if tokens_b: + # Modifies `tokens_a` and `tokens_b` in place so that the total + # length is less than the specified length. + # Account for [CLS], [SEP], [SEP] with "- 3" + _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3) + else: + # Account for [CLS] and [SEP] with "- 2" + if len(tokens_a) > max_seq_length - 2: + tokens_a = tokens_a[0:(max_seq_length - 2)] + + # The convention in BERT is: + # (a) For sequence pairs: + # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] + # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 + # (b) For single sequences: + # tokens: [CLS] the dog is hairy . [SEP] + # type_ids: 0 0 0 0 0 0 0 + # + # Where "type_ids" are used to indicate whether this is the first + # sequence or the second sequence. The embedding vectors for `type=0` and + # `type=1` were learned during pre-training and are added to the wordpiece + # embedding vector (and position vector). This is not *strictly* necessary + # since the [SEP] token unambiguously separates the sequences, but it makes + # it easier for the model to learn the concept of sequences. + # + # For classification tasks, the first vector (corresponding to [CLS]) is + # used as the "sentence vector". Note that this only makes sense because + # the entire model is fine-tuned. + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + tokens.append("[SEP]") + segment_ids.append(0) + + if tokens_b: + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + label_id = label_map[example.label] + if ex_index < 5 and verbose_logging: + tf.logging.info("*** Example ***") + tf.logging.info("guid: %s" % (example.guid)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info("segment_ids: %s" % " ".join([str(x) for x in segment_ids])) + tf.logging.info("label: %s (id = %d)" % (example.label, label_id)) + + feature = InputFeatures( + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + label_id=label_id, + is_real_example=True) + return feature + +# This function is not used by this file but is still used by the Colab and +# people who depend on it. +def convert_examples_to_features(examples, label_list, max_seq_length, + tokenizer): + """Convert a set of `InputExample`s to a list of `InputFeatures`.""" + + features = [] + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + tf.logging.info("Writing example %d of %d" % (ex_index, len(examples))) + + feature = convert_single_example(ex_index, example, label_list, + max_seq_length, tokenizer, FLAGS.verbose_logging) + + features.append(feature) + return features + +def file_based_convert_examples_to_features( + examples, label_list, max_seq_length, tokenizer, output_file): + """Convert a set of `InputExample`s to a TFRecord file.""" + + writer = tf.python_io.TFRecordWriter(output_file) + + for (ex_index, example) in enumerate(examples): + if ex_index % 10000 == 0: + tf.logging.info("Writing example %d of %d" % (ex_index, len(examples))) + + feature = convert_single_example(ex_index, example, label_list, + max_seq_length, tokenizer) + + def create_int_feature(values): + f = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return f + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + features["label_ids"] = create_int_feature([feature.label_id]) + features["is_real_example"] = create_int_feature( + [int(feature.is_real_example)]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writer.write(tf_example.SerializeToString()) + writer.close() + +def main(): + processors = { + "cola": ColaProcessor, + "mnli": MnliProcessor, + "mrpc": MrpcProcessor, + "xnli": XnliProcessor, + } + task_name = FLAGS.task_name.lower() + if task_name not in processors: + raise ValueError("Task not found: %s" % (task_name)) + processor = processors[task_name]() + label_list = processor.get_labels() + + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + tf.gfile.MakeDirs(FLAGS.data_dir + "final_tfrecords_sharded") + train_examples = processor.get_train_examples(FLAGS.data_dir) + train_file = os.path.join(FLAGS.data_dir, "final_tfrecords_sharded/" + task_name + "train.tf_record") + file_based_convert_examples_to_features( + train_examples, label_list, FLAGS.max_seq_length, tokenizer, train_file) + + eval_examples = processor.get_dev_examples(FLAGS.data_dir) + eval_file = os.path.join(FLAGS.data_dir, "final_tfrecords_sharded/" + task_name + "eval.tf_record") + file_based_convert_examples_to_features( + eval_examples, label_list, FLAGS.max_seq_length, tokenizer, eval_file) + + predict_examples = processor.get_test_examples(FLAGS.data_dir) + predict_file = os.path.join(FLAGS.data_dir, "final_tfrecords_sharded/" + task_name + "predict.tf_record") + file_based_convert_examples_to_features(predict_examples, label_list, + FLAGS.max_seq_length, tokenizer, + predict_file) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_pretraining_data.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_pretraining_data.py new file mode 100644 index 0000000..d628091 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_pretraining_data.py @@ -0,0 +1,501 @@ +# coding=utf-8 +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Create masked LM/next sentence masked_lm TF examples for BERT.""" + +from __future__ import absolute_import, division, print_function, unicode_literals + +import argparse +import logging +import os +import random +from io import open +import h5py +import tensorflow as tf +import numpy as np +from tqdm import tqdm, trange + +from tokenization import BertTokenizer +import tokenization as tokenization + +import random +import collections + +class TrainingInstance(object): + """A single training instance (sentence pair).""" + + def __init__(self, tokens, segment_ids, masked_lm_positions, masked_lm_labels, + is_random_next): + self.tokens = tokens + self.segment_ids = segment_ids + self.is_random_next = is_random_next + self.masked_lm_positions = masked_lm_positions + self.masked_lm_labels = masked_lm_labels + + def __str__(self): + s = "" + s += "tokens: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.tokens])) + s += "segment_ids: %s\n" % (" ".join([str(x) for x in self.segment_ids])) + s += "is_random_next: %s\n" % self.is_random_next + s += "masked_lm_positions: %s\n" % (" ".join( + [str(x) for x in self.masked_lm_positions])) + s += "masked_lm_labels: %s\n" % (" ".join( + [tokenization.printable_text(x) for x in self.masked_lm_labels])) + s += "\n" + return s + + def __repr__(self): + return self.__str__() + + +def write_instance_to_example_files(instances, tokenizer, max_seq_length, + max_predictions_per_seq, output_files, output_formats="tfrecord"): + """Create TF example files from `TrainingInstance`s.""" + writers = [] + for output_file in output_files: + writers.append(tf.python_io.TFRecordWriter(output_file)) + + writer_index = 0 + + total_written = 0 + if 'hdf5' in output_formats: + features_hdf5 = collections.OrderedDict() + num_instances = len(instances) + features_hdf5["input_ids"] = np.zeros([num_instances, max_seq_length], dtype="int32") + features_hdf5["input_mask"] = np.zeros([num_instances, max_seq_length], dtype="int32") + features_hdf5["segment_ids"] = np.zeros([num_instances, max_seq_length], dtype="int32") + features_hdf5["masked_lm_positions"] = np.zeros([num_instances, max_predictions_per_seq], dtype="int32") + features_hdf5["masked_lm_ids"] = np.zeros([num_instances, max_predictions_per_seq], dtype="int32") + features_hdf5["next_sentence_labels"] = np.zeros(num_instances, dtype="int32") + + for (inst_index, instance) in enumerate(instances): + input_ids = tokenizer.convert_tokens_to_ids(instance.tokens) + input_mask = [1] * len(input_ids) + segment_ids = list(instance.segment_ids) + assert len(input_ids) <= max_seq_length + + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + masked_lm_positions = list(instance.masked_lm_positions) + masked_lm_ids = tokenizer.convert_tokens_to_ids(instance.masked_lm_labels) + masked_lm_weights = [1.0] * len(masked_lm_ids) + + while len(masked_lm_positions) < max_predictions_per_seq: + masked_lm_positions.append(0) + masked_lm_ids.append(0) + masked_lm_weights.append(0.0) + + next_sentence_label = 1 if instance.is_random_next else 0 + + features = collections.OrderedDict() + features["input_ids"] = create_int_feature(input_ids) + features["input_mask"] = create_int_feature(input_mask) + features["segment_ids"] = create_int_feature(segment_ids) + features["masked_lm_positions"] = create_int_feature(masked_lm_positions) + features["masked_lm_ids"] = create_int_feature(masked_lm_ids) + features["masked_lm_weights"] = create_float_feature(masked_lm_weights) + features["next_sentence_labels"] = create_int_feature([next_sentence_label]) + + if 'tfrecord' in output_formats: + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + writers[writer_index].write(tf_example.SerializeToString()) + if 'hdf5' in output_formats: + features_hdf5["input_ids"][inst_index] = input_ids + features_hdf5["input_mask"][inst_index] = input_mask + features_hdf5["segment_ids"][inst_index] = segment_ids + features_hdf5["masked_lm_positions"][inst_index] = masked_lm_positions + features_hdf5["masked_lm_ids"][inst_index] = masked_lm_ids + features_hdf5["next_sentence_labels"][inst_index] = next_sentence_label + if 'tfrecord' not in output_formats and 'hdf5' not in output_formats: + assert False, 'Either empty output_formats list or unsupported type specified. Try: tfrecord or hdf5' + + writer_index = (writer_index + 1) % len(writers) + + total_written += 1 + + if inst_index < 20: + tf.logging.info("*** Example ***") + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in instance.tokens])) + + for feature_name in features.keys(): + feature = features[feature_name] + values = [] + if feature.int64_list.value: + values = feature.int64_list.value + elif feature.float_list.value: + values = feature.float_list.value + tf.logging.info( + "%s: %s" % (feature_name, " ".join([str(x) for x in values]))) + + for writer in writers: + writer.close() + + if 'hdf5' in output_formats: + f = h5py.File(output_file, 'w') + f.create_dataset("input_ids", data=features_hdf5["input_ids"], dtype='i4', compression='gzip') + f.create_dataset("input_mask", data=features_hdf5["input_mask"], dtype='i1', compression='gzip') + f.create_dataset("segment_ids", data=features_hdf5["segment_ids"], dtype='i1', compression='gzip') + f.create_dataset("masked_lm_positions", data=features_hdf5["masked_lm_positions"], dtype='i4', compression='gzip') + f.create_dataset("masked_lm_ids", data=features_hdf5["masked_lm_ids"], dtype='i4', compression='gzip') + f.create_dataset("next_sentence_labels", data=features_hdf5["next_sentence_labels"], dtype='i1', compression='gzip') + f.flush() + f.close() + + tf.logging.info("Wrote %d total instances", total_written) + + +def create_int_feature(values): + feature = tf.train.Feature(int64_list=tf.train.Int64List(value=list(values))) + return feature + + +def create_float_feature(values): + feature = tf.train.Feature(float_list=tf.train.FloatList(value=list(values))) + return feature + + +def create_training_instances(input_files, tokenizer, max_seq_length, + dupe_factor, short_seq_prob, masked_lm_prob, + max_predictions_per_seq, rng): + """Create `TrainingInstance`s from raw text.""" + all_documents = [[]] + + # Input file format: + # (1) One sentence per line. These should ideally be actual sentences, not + # entire paragraphs or arbitrary spans of text. (Because we use the + # sentence boundaries for the "next sentence prediction" task). + # (2) Blank lines between documents. Document boundaries are needed so + # that the "next sentence prediction" task doesn't span between documents. + for input_file in input_files: + print("creating instance from {}".format(input_file)) + with open(input_file, "r") as reader: + while True: + line = tokenization.convert_to_unicode(reader.readline()) + if not line: + break + line = line.strip() + + # Empty lines are used as document delimiters + if not line: + all_documents.append([]) + tokens = tokenizer.tokenize(line) + if tokens: + all_documents[-1].append(tokens) + + # Remove empty documents + all_documents = [x for x in all_documents if x] + rng.shuffle(all_documents) + + vocab_words = list(tokenizer.vocab.keys()) + instances = [] + for _ in range(dupe_factor): + for document_index in range(len(all_documents)): + instances.extend( + create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng)) + + rng.shuffle(instances) + return instances + + +def create_instances_from_document( + all_documents, document_index, max_seq_length, short_seq_prob, + masked_lm_prob, max_predictions_per_seq, vocab_words, rng): + """Creates `TrainingInstance`s for a single document.""" + document = all_documents[document_index] + + # Account for [CLS], [SEP], [SEP] + max_num_tokens = max_seq_length - 3 + + # We *usually* want to fill up the entire sequence since we are padding + # to `max_seq_length` anyways, so short sequences are generally wasted + # computation. However, we *sometimes* + # (i.e., short_seq_prob == 0.1 == 10% of the time) want to use shorter + # sequences to minimize the mismatch between pre-training and fine-tuning. + # The `target_seq_length` is just a rough target however, whereas + # `max_seq_length` is a hard limit. + target_seq_length = max_num_tokens + if rng.random() < short_seq_prob: + target_seq_length = rng.randint(2, max_num_tokens) + + # We DON'T just concatenate all of the tokens from a document into a long + # sequence and choose an arbitrary split point because this would make the + # next sentence prediction task too easy. Instead, we split the input into + # segments "A" and "B" based on the actual "sentences" provided by the user + # input. + instances = [] + current_chunk = [] + current_length = 0 + i = 0 + while i < len(document): + segment = document[i] + current_chunk.append(segment) + current_length += len(segment) + if i == len(document) - 1 or current_length >= target_seq_length: + if current_chunk: + # `a_end` is how many segments from `current_chunk` go into the `A` + # (first) sentence. + a_end = 1 + if len(current_chunk) >= 2: + a_end = rng.randint(1, len(current_chunk) - 1) + + tokens_a = [] + for j in range(a_end): + tokens_a.extend(current_chunk[j]) + + tokens_b = [] + # Random next + is_random_next = False + if len(current_chunk) == 1 or rng.random() < 0.5: + is_random_next = True + target_b_length = target_seq_length - len(tokens_a) + + # This should rarely go for more than one iteration for large + # corpora. However, just to be careful, we try to make sure that + # the random document is not the same as the document + # we're processing. + for _ in range(10): + random_document_index = rng.randint(0, len(all_documents) - 1) + if random_document_index != document_index: + break + + random_document = all_documents[random_document_index] + random_start = rng.randint(0, len(random_document) - 1) + for j in range(random_start, len(random_document)): + tokens_b.extend(random_document[j]) + if len(tokens_b) >= target_b_length: + break + # We didn't actually use these segments so we "put them back" so + # they don't go to waste. + num_unused_segments = len(current_chunk) - a_end + i -= num_unused_segments + # Actual next + else: + is_random_next = False + for j in range(a_end, len(current_chunk)): + tokens_b.extend(current_chunk[j]) + truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng) + + assert len(tokens_a) >= 1 + assert len(tokens_b) >= 1 + + tokens = [] + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in tokens_a: + tokens.append(token) + segment_ids.append(0) + + tokens.append("[SEP]") + segment_ids.append(0) + + for token in tokens_b: + tokens.append(token) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + (tokens, masked_lm_positions, + masked_lm_labels) = create_masked_lm_predictions( + tokens, masked_lm_prob, max_predictions_per_seq, vocab_words, rng) + instance = TrainingInstance( + tokens=tokens, + segment_ids=segment_ids, + is_random_next=is_random_next, + masked_lm_positions=masked_lm_positions, + masked_lm_labels=masked_lm_labels) + instances.append(instance) + current_chunk = [] + current_length = 0 + i += 1 + + return instances + + +MaskedLmInstance = collections.namedtuple("MaskedLmInstance", + ["index", "label"]) + + +def create_masked_lm_predictions(tokens, masked_lm_prob, + max_predictions_per_seq, vocab_words, rng): + """Creates the predictions for the masked LM objective.""" + + cand_indexes = [] + for (i, token) in enumerate(tokens): + if token == "[CLS]" or token == "[SEP]": + continue + cand_indexes.append(i) + + rng.shuffle(cand_indexes) + + output_tokens = list(tokens) + + num_to_predict = min(max_predictions_per_seq, + max(1, int(round(len(tokens) * masked_lm_prob)))) + + masked_lms = [] + covered_indexes = set() + for index in cand_indexes: + if len(masked_lms) >= num_to_predict: + break + if index in covered_indexes: + continue + covered_indexes.add(index) + + masked_token = None + # 80% of the time, replace with [MASK] + if rng.random() < 0.8: + masked_token = "[MASK]" + else: + # 10% of the time, keep original + if rng.random() < 0.5: + masked_token = tokens[index] + # 10% of the time, replace with random word + else: + masked_token = vocab_words[rng.randint(0, len(vocab_words) - 1)] + + output_tokens[index] = masked_token + + masked_lms.append(MaskedLmInstance(index=index, label=tokens[index])) + + masked_lms = sorted(masked_lms, key=lambda x: x.index) + + masked_lm_positions = [] + masked_lm_labels = [] + for p in masked_lms: + masked_lm_positions.append(p.index) + masked_lm_labels.append(p.label) + + return (output_tokens, masked_lm_positions, masked_lm_labels) + + +def truncate_seq_pair(tokens_a, tokens_b, max_num_tokens, rng): + """Truncates a pair of sequences to a maximum sequence length.""" + while True: + total_length = len(tokens_a) + len(tokens_b) + if total_length <= max_num_tokens: + break + + trunc_tokens = tokens_a if len(tokens_a) > len(tokens_b) else tokens_b + assert len(trunc_tokens) >= 1 + + # We want to sometimes truncate from the front and sometimes from the + # back to add more randomness and avoid biases. + if rng.random() < 0.5: + del trunc_tokens[0] + else: + trunc_tokens.pop() + + +def main(): + parser = argparse.ArgumentParser() + ## Required parameters + parser.add_argument("--vocab_file", + default=None, + type=str, + required=True, + help="The vocabulary the BERT model will train on.") + parser.add_argument("--input_file", + default=None, + type=str, + required=True, + help="The input train corpus. can be directory with .txt files or a path to a single file") + parser.add_argument("--output_file", + default=None, + type=str, + required=True, + help="The output file where the model checkpoints will be written.") + + ## Other parameters + # int + parser.add_argument("--max_seq_length", + default=128, + type=int, + help="The maximum total input sequence length after WordPiece tokenization. \n" + "Sequences longer than this will be truncated, and sequences shorter \n" + "than this will be padded.") + parser.add_argument("--dupe_factor", + default=10, + type=int, + help="Number of times to duplicate the input data (with different masks).") + parser.add_argument("--max_predictions_per_seq", + default=20, + type=int, + help="Maximum sequence length.") + + # floats + + parser.add_argument("--masked_lm_prob", + default=0.15, + type=float, + help="Masked LM probability.") + + parser.add_argument("--short_seq_prob", + default=0.1, + type=float, + help="Probability to create a sequence shorter than maximum sequence length") + + parser.add_argument("--do_lower_case", + action='store_true', + default=True, + help="Whether to lower case the input text. True for uncased models, False for cased models.") + parser.add_argument('--random_seed', + type=int, + default=12345, + help="random seed for initialization") + + args = parser.parse_args() + + tokenizer = BertTokenizer(args.vocab_file, do_lower_case=args.do_lower_case) + + input_files = [] + if os.path.isfile(args.input_file): + input_files.append(args.input_file) + elif os.path.isdir(args.input_file): + input_files = [os.path.join(args.input_file, f) for f in os.listdir(args.input_file) if + (os.path.isfile(os.path.join(args.input_file, f)) and f.endswith('.txt'))] + else: + raise ValueError("{} is not a valid path".format(args.input_file)) + + rng = random.Random(args.random_seed) + instances = create_training_instances( + input_files, tokenizer, args.max_seq_length, args.dupe_factor, + args.short_seq_prob, args.masked_lm_prob, args.max_predictions_per_seq, + rng) + + output_files = args.output_file.split(",") + print("*** Writing to output files ***") + for output_file in output_files: + print(output_file) + + + write_instance_to_example_files(instances, tokenizer, args.max_seq_length, + args.max_predictions_per_seq, output_files) + + +if __name__ == "__main__": + main() diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_squad_data.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_squad_data.py new file mode 100644 index 0000000..fe37675 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/create_squad_data.py @@ -0,0 +1,561 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import json +import math +import os +import random +import modeling +import optimization +import tokenization +import six +import tensorflow as tf +import horovod.tensorflow as hvd +import time + +flags = tf.flags +FLAGS = None + +def extract_flags(): + flags.DEFINE_integer( + "max_seq_length", 384, + "The maximum total input sequence length after WordPiece tokenization. " + "Sequences longer than this will be truncated, and sequences shorter " + "than this will be padded.") + + flags.DEFINE_integer( + "doc_stride", 128, + "When splitting up a long document into chunks, how much stride to " + "take between chunks.") + + flags.DEFINE_integer( + "max_query_length", 64, + "The maximum number of tokens for the question. Questions longer than " + "this will be truncated to this length.") + + flags.DEFINE_bool( + "version_2_with_negative", False, + "If true, the SQuAD examples contain some that do not have an answer.") + + flags.DEFINE_string("train_file", None, + "SQuAD json for training. E.g., train-v1.1.json") + + flags.DEFINE_string( + "predict_file", None, + "SQuAD json for predictions. E.g., dev-v1.1.json or test-v1.1.json") + + flags.DEFINE_string( + "squad_dir", None, + "The output directory where the model checkpoints will be written.") + + flags.DEFINE_string("vocab_file", None, + "The vocabulary file that the BERT model was trained on.") + + flags.DEFINE_bool( + "do_lower_case", True, + "Whether to lower case the input text. Should be True for uncased " + "models and False for cased models.") + + flags.DEFINE_bool( + "verbose_logging", False, + "If true, all of the warnings related to data processing will be printed. " + "A number of warnings are expected for a normal SQuAD evaluation.") + flags.mark_flag_as_required("train_file") + flags.mark_flag_as_required("predict_file") + flags.mark_flag_as_required("squad_dir") + flags.mark_flag_as_required("vocab_file") + return flags.FLAGS + +class SquadExample(object): + """A single training/test example for simple sequence classification. + + For examples without an answer, the start and end position are -1. + """ + + def __init__(self, + qas_id, + question_text, + doc_tokens, + orig_answer_text=None, + start_position=None, + end_position=None, + is_impossible=False): + self.qas_id = qas_id + self.question_text = question_text + self.doc_tokens = doc_tokens + self.orig_answer_text = orig_answer_text + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + + def __str__(self): + return self.__repr__() + + def __repr__(self): + s = "" + s += "qas_id: %s" % (tokenization.printable_text(self.qas_id)) + s += ", question_text: %s" % ( + tokenization.printable_text(self.question_text)) + s += ", doc_tokens: [%s]" % (" ".join(self.doc_tokens)) + if self.start_position: + s += ", start_position: %d" % (self.start_position) + if self.start_position: + s += ", end_position: %d" % (self.end_position) + if self.start_position: + s += ", is_impossible: %r" % (self.is_impossible) + return s + +class InputFeatures(object): + """A single set of features of data.""" + + def __init__(self, + unique_id, + example_index, + doc_span_index, + tokens, + token_to_orig_map, + token_is_max_context, + input_ids, + input_mask, + segment_ids, + start_position=None, + end_position=None, + is_impossible=None): + self.unique_id = unique_id + self.example_index = example_index + self.doc_span_index = doc_span_index + self.tokens = tokens + self.token_to_orig_map = token_to_orig_map + self.token_is_max_context = token_is_max_context + self.input_ids = input_ids + self.input_mask = input_mask + self.segment_ids = segment_ids + self.start_position = start_position + self.end_position = end_position + self.is_impossible = is_impossible + +def read_squad_examples(input_file, is_training, version_2_with_negative=False): + """Read a SQuAD json file into a list of SquadExample.""" + with tf.gfile.Open(input_file, "r") as reader: + input_data = json.load(reader)["data"] + + def is_whitespace(c): + if c == " " or c == "\t" or c == "\r" or c == "\n" or ord(c) == 0x202F: + return True + return False + + examples = [] + for entry in input_data: + for paragraph in entry["paragraphs"]: + paragraph_text = paragraph["context"] + doc_tokens = [] + char_to_word_offset = [] + prev_is_whitespace = True + for c in paragraph_text: + if is_whitespace(c): + prev_is_whitespace = True + else: + if prev_is_whitespace: + doc_tokens.append(c) + else: + doc_tokens[-1] += c + prev_is_whitespace = False + char_to_word_offset.append(len(doc_tokens) - 1) + + for qa in paragraph["qas"]: + qas_id = qa["id"] + question_text = qa["question"] + start_position = None + end_position = None + orig_answer_text = None + is_impossible = False + if is_training: + + if version_2_with_negative: + is_impossible = qa["is_impossible"] + if (len(qa["answers"]) != 1) and (not is_impossible): + raise ValueError( + "For training, each question should have exactly 1 answer.") + if not is_impossible: + answer = qa["answers"][0] + orig_answer_text = answer["text"] + answer_offset = answer["answer_start"] + answer_length = len(orig_answer_text) + start_position = char_to_word_offset[answer_offset] + end_position = char_to_word_offset[answer_offset + answer_length - + 1] + # Only add answers where the text can be exactly recovered from the + # document. If this CAN'T happen it's likely due to weird Unicode + # stuff so we will just skip the example. + # + # Note that this means for training mode, every example is NOT + # guaranteed to be preserved. + actual_text = " ".join( + doc_tokens[start_position:(end_position + 1)]) + cleaned_answer_text = " ".join( + tokenization.whitespace_tokenize(orig_answer_text)) + if actual_text.find(cleaned_answer_text) == -1: + tf.logging.warning("Could not find answer: '%s' vs. '%s'", + actual_text, cleaned_answer_text) + continue + else: + start_position = -1 + end_position = -1 + orig_answer_text = "" + + example = SquadExample( + qas_id=qas_id, + question_text=question_text, + doc_tokens=doc_tokens, + orig_answer_text=orig_answer_text, + start_position=start_position, + end_position=end_position, + is_impossible=is_impossible) + examples.append(example) + + return examples + +def _check_is_max_context(doc_spans, cur_span_index, position): + """Check if this is the 'max context' doc span for the token.""" + + # Because of the sliding window approach taken to scoring documents, a single + # token can appear in multiple documents. E.g. + # Doc: the man went to the store and bought a gallon of milk + # Span A: the man went to the + # Span B: to the store and bought + # Span C: and bought a gallon of + # ... + # + # Now the word 'bought' will have two scores from spans B and C. We only + # want to consider the score with "maximum context", which we define as + # the *minimum* of its left and right context (the *sum* of left and + # right context will always be the same, of course). + # + # In the example the maximum context for 'bought' would be span C since + # it has 1 left context and 3 right context, while span B has 4 left context + # and 0 right context. + best_score = None + best_span_index = None + for (span_index, doc_span) in enumerate(doc_spans): + end = doc_span.start + doc_span.length - 1 + if position < doc_span.start: + continue + if position > end: + continue + num_left_context = position - doc_span.start + num_right_context = end - position + score = min(num_left_context, num_right_context) + 0.01 * doc_span.length + if best_score is None or score > best_score: + best_score = score + best_span_index = span_index + + return cur_span_index == best_span_index + +def _improve_answer_span(doc_tokens, input_start, input_end, tokenizer, + orig_answer_text): + """Returns tokenized answer spans that better match the annotated answer.""" + + # The SQuAD annotations are character based. We first project them to + # whitespace-tokenized words. But then after WordPiece tokenization, we can + # often find a "better match". For example: + # + # Question: What year was John Smith born? + # Context: The leader was John Smith (1895-1943). + # Answer: 1895 + # + # The original whitespace-tokenized answer will be "(1895-1943).". However + # after tokenization, our tokens will be "( 1895 - 1943 ) .". So we can match + # the exact answer, 1895. + # + # However, this is not always possible. Consider the following: + # + # Question: What country is the top exporter of electornics? + # Context: The Japanese electronics industry is the lagest in the world. + # Answer: Japan + # + # In this case, the annotator chose "Japan" as a character sub-span of + # the word "Japanese". Since our WordPiece tokenizer does not split + # "Japanese", we just use "Japanese" as the annotation. This is fairly rare + # in SQuAD, but does happen. + tok_answer_text = " ".join(tokenizer.tokenize(orig_answer_text)) + + for new_start in range(input_start, input_end + 1): + for new_end in range(input_end, new_start - 1, -1): + text_span = " ".join(doc_tokens[new_start:(new_end + 1)]) + if text_span == tok_answer_text: + return (new_start, new_end) + + return (input_start, input_end) + + +def convert_examples_to_features(examples, tokenizer, max_seq_length, + doc_stride, max_query_length, is_training, + output_fn, verbose_logging=False): + """Loads a data file into a list of `InputBatch`s.""" + + unique_id = 1000000000 + + for (example_index, example) in enumerate(examples): + query_tokens = tokenizer.tokenize(example.question_text) + + if len(query_tokens) > max_query_length: + query_tokens = query_tokens[0:max_query_length] + + tok_to_orig_index = [] + orig_to_tok_index = [] + all_doc_tokens = [] + for (i, token) in enumerate(example.doc_tokens): + orig_to_tok_index.append(len(all_doc_tokens)) + sub_tokens = tokenizer.tokenize(token) + for sub_token in sub_tokens: + tok_to_orig_index.append(i) + all_doc_tokens.append(sub_token) + + tok_start_position = None + tok_end_position = None + if is_training and example.is_impossible: + tok_start_position = -1 + tok_end_position = -1 + if is_training and not example.is_impossible: + tok_start_position = orig_to_tok_index[example.start_position] + if example.end_position < len(example.doc_tokens) - 1: + tok_end_position = orig_to_tok_index[example.end_position + 1] - 1 + else: + tok_end_position = len(all_doc_tokens) - 1 + (tok_start_position, tok_end_position) = _improve_answer_span( + all_doc_tokens, tok_start_position, tok_end_position, tokenizer, + example.orig_answer_text) + + # The -3 accounts for [CLS], [SEP] and [SEP] + max_tokens_for_doc = max_seq_length - len(query_tokens) - 3 + + # We can have documents that are longer than the maximum sequence length. + # To deal with this we do a sliding window approach, where we take chunks + # of the up to our max length with a stride of `doc_stride`. + _DocSpan = collections.namedtuple( # pylint: disable=invalid-name + "DocSpan", ["start", "length"]) + doc_spans = [] + start_offset = 0 + while start_offset < len(all_doc_tokens): + length = len(all_doc_tokens) - start_offset + if length > max_tokens_for_doc: + length = max_tokens_for_doc + doc_spans.append(_DocSpan(start=start_offset, length=length)) + if start_offset + length == len(all_doc_tokens): + break + start_offset += min(length, doc_stride) + + for (doc_span_index, doc_span) in enumerate(doc_spans): + tokens = [] + token_to_orig_map = {} + token_is_max_context = {} + segment_ids = [] + tokens.append("[CLS]") + segment_ids.append(0) + for token in query_tokens: + tokens.append(token) + segment_ids.append(0) + tokens.append("[SEP]") + segment_ids.append(0) + + for i in range(doc_span.length): + split_token_index = doc_span.start + i + token_to_orig_map[len(tokens)] = tok_to_orig_index[split_token_index] + + is_max_context = _check_is_max_context(doc_spans, doc_span_index, + split_token_index) + token_is_max_context[len(tokens)] = is_max_context + tokens.append(all_doc_tokens[split_token_index]) + segment_ids.append(1) + tokens.append("[SEP]") + segment_ids.append(1) + + input_ids = tokenizer.convert_tokens_to_ids(tokens) + + # The mask has 1 for real tokens and 0 for padding tokens. Only real + # tokens are attended to. + input_mask = [1] * len(input_ids) + + # Zero-pad up to the sequence length. + while len(input_ids) < max_seq_length: + input_ids.append(0) + input_mask.append(0) + segment_ids.append(0) + + assert len(input_ids) == max_seq_length + assert len(input_mask) == max_seq_length + assert len(segment_ids) == max_seq_length + + start_position = None + end_position = None + if is_training and not example.is_impossible: + # For training, if our document chunk does not contain an annotation + # we throw it out, since there is nothing to predict. + doc_start = doc_span.start + doc_end = doc_span.start + doc_span.length - 1 + out_of_span = False + if not (tok_start_position >= doc_start and + tok_end_position <= doc_end): + out_of_span = True + if out_of_span: + start_position = 0 + end_position = 0 + else: + doc_offset = len(query_tokens) + 2 + start_position = tok_start_position - doc_start + doc_offset + end_position = tok_end_position - doc_start + doc_offset + + if is_training and example.is_impossible: + start_position = 0 + end_position = 0 + + if verbose_logging and example_index < 20: + tf.logging.info("*** Example ***") + tf.logging.info("unique_id: %s" % (unique_id)) + tf.logging.info("example_index: %s" % (example_index)) + tf.logging.info("doc_span_index: %s" % (doc_span_index)) + tf.logging.info("tokens: %s" % " ".join( + [tokenization.printable_text(x) for x in tokens])) + tf.logging.info("token_to_orig_map: %s" % " ".join( + ["%d:%d" % (x, y) for (x, y) in six.iteritems(token_to_orig_map)])) + tf.logging.info("token_is_max_context: %s" % " ".join([ + "%d:%s" % (x, y) for (x, y) in six.iteritems(token_is_max_context) + ])) + tf.logging.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) + tf.logging.info( + "input_mask: %s" % " ".join([str(x) for x in input_mask])) + tf.logging.info( + "segment_ids: %s" % " ".join([str(x) for x in segment_ids])) + if is_training and example.is_impossible: + tf.logging.info("impossible example") + if is_training and not example.is_impossible: + answer_text = " ".join(tokens[start_position:(end_position + 1)]) + tf.logging.info("start_position: %d" % (start_position)) + tf.logging.info("end_position: %d" % (end_position)) + tf.logging.info( + "answer: %s" % (tokenization.printable_text(answer_text))) + + feature = InputFeatures( + unique_id=unique_id, + example_index=example_index, + doc_span_index=doc_span_index, + tokens=tokens, + token_to_orig_map=token_to_orig_map, + token_is_max_context=token_is_max_context, + input_ids=input_ids, + input_mask=input_mask, + segment_ids=segment_ids, + start_position=start_position, + end_position=end_position, + is_impossible=example.is_impossible) + + # Run callback + output_fn(feature) + + unique_id += 1 + +class FeatureWriter(object): + """Writes InputFeature to TF example file.""" + + def __init__(self, filename, is_training): + self.filename = filename + self.is_training = is_training + self.num_features = 0 + self._writer = tf.python_io.TFRecordWriter(filename) + + def process_feature(self, feature): + """Write a InputFeature to the TFRecordWriter as a tf.train.Example.""" + self.num_features += 1 + + def create_int_feature(values): + feature = tf.train.Feature( + int64_list=tf.train.Int64List(value=list(values))) + return feature + + features = collections.OrderedDict() + features["unique_ids"] = create_int_feature([feature.unique_id]) + features["input_ids"] = create_int_feature(feature.input_ids) + features["input_mask"] = create_int_feature(feature.input_mask) + features["segment_ids"] = create_int_feature(feature.segment_ids) + + if self.is_training: + features["start_positions"] = create_int_feature([feature.start_position]) + features["end_positions"] = create_int_feature([feature.end_position]) + impossible = 0 + if feature.is_impossible: + impossible = 1 + features["is_impossible"] = create_int_feature([impossible]) + + tf_example = tf.train.Example(features=tf.train.Features(feature=features)) + self._writer.write(tf_example.SerializeToString()) + + def close(self): + self._writer.close() + +def main(): + + FLAGS = extract_flags() + tokenizer = tokenization.FullTokenizer( + vocab_file=FLAGS.vocab_file, do_lower_case=FLAGS.do_lower_case) + tf.gfile.MakeDirs(FLAGS.squad_dir + "/final_tfrecords_sharded") + # We write to a temporary file to avoid storing very large constant tensors + # in memory. + train_examples = read_squad_examples( + input_file=FLAGS.train_file, is_training=True, + version_2_with_negative=FLAGS.version_2_with_negative) + train_writer = FeatureWriter( + filename=os.path.join(FLAGS.squad_dir, "final_tfrecords_sharded/train.tf_record"), + is_training=True) + convert_examples_to_features( + examples=train_examples, + tokenizer=tokenizer, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=True, + output_fn=train_writer.process_feature, + verbose_logging=FLAGS.verbose_logging) + train_writer.close() + + + eval_examples = read_squad_examples( + input_file=FLAGS.predict_file, is_training=False, + version_2_with_negative=FLAGS.version_2_with_negative) + + eval_writer = FeatureWriter( + filename=os.path.join(FLAGS.squad_dir, "final_tfrecords_sharded/eval.tf_record"), + is_training=False) + eval_features = [] + + def append_feature(feature): + eval_features.append(feature) + eval_writer.process_feature(feature) + + convert_examples_to_features( + examples=eval_examples, + tokenizer=tokenizer, + max_seq_length=FLAGS.max_seq_length, + doc_stride=FLAGS.doc_stride, + max_query_length=FLAGS.max_query_length, + is_training=False, + output_fn=append_feature, + verbose_logging=FLAGS.verbose_logging) + eval_writer.close() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/utils.py b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/utils.py new file mode 100644 index 0000000..84affee --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/code/bert-Nv/utils/utils.py @@ -0,0 +1,75 @@ +# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import tensorflow as tf +import time + +# report latency and throughput during eval +class LogEvalRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, hvd_rank=-1): + self.global_batch_size = global_batch_size + self.hvd_rank = hvd_rank + self.total_time = 0.0 + self.count = 0 + self.skipped = 0 + self.time_list = [] + + def before_run(self, run_context): + self.t0 = time.time() + + def after_run(self, run_context, run_values): + elapsed_secs = time.time() - self.t0 + self.count += 1 + + # Removing first 2 (arbitrary) number of startup iterations from perf evaluations + if self.count <= 2: + print("Skipping time record for ", self.count, " due to overhead") + self.skipped += 1 + else: + self.time_list.append(elapsed_secs) + self.total_time += elapsed_secs + +# report throughput during training +class LogTrainRunHook(tf.train.SessionRunHook): + def __init__(self, global_batch_size, hvd_rank=-1, save_checkpoints_steps=1000): + self.global_batch_size = global_batch_size + self.hvd_rank = hvd_rank + self.save_checkpoints_steps = save_checkpoints_steps + + self.total_time = 0.0 + self.count = 0 # Holds number of iterations, including skipped iterations for fp16 loss scaling + + def after_create_session(self, session, coord): + self.init_global_step = session.run(tf.train.get_global_step()) + + def before_run(self, run_context): + self.t0 = time.time() + return tf.train.SessionRunArgs( + fetches=['step_update:0']) + + def after_run(self, run_context, run_values): + elapsed_secs = time.time() - self.t0 + self.global_step = run_values.results[0] + self.count += 1 + + # Removing first step + first two steps after every checkpoint save + if (self.global_step - self.init_global_step) % self.save_checkpoints_steps <= 1: + print("Skipping time record for ", self.global_step, " due to checkpoint-saving/warmup overhead") + else: + self.total_time += elapsed_secs + + def end(self, session): + num_global_steps = self.global_step - self.init_global_step + + self.skipped = (num_global_steps // self.save_checkpoints_steps) * 2 + \ + min(2, num_global_steps % self.save_checkpoints_steps) - 1 \ No newline at end of file diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/1p.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/1p.json new file mode 100644 index 0000000..5a5ef1d --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/1p.json @@ -0,0 +1,14 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [ + { + "device_id": "0", + "device_ip": "192.168.10.101", + "rank_id": "0" + }], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/8p.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/8p.json new file mode 100644 index 0000000..6ba12b6 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/8p.json @@ -0,0 +1,49 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [ + { + "device_id": "0", + "device_ip": "192.168.10.101", + "rank_id": "0" + }, + { + "device_id": "1", + "device_ip": "192.168.11.101", + "rank_id": "1" + }, + { + "device_id": "2", + "device_ip": "192.168.12.101", + "rank_id": "2" + }, + { + "device_id": "3", + "device_ip": "192.168.13.101", + "rank_id": "3" + }, + { + "device_id": "4", + "device_ip": "192.168.10.100", + "rank_id": "4" + }, + { + "device_id": "5", + "device_ip": "192.168.11.100", + "rank_id": "5" + }, + { + "device_id": "6", + "device_ip": "192.168.12.100", + "rank_id": "6" + }, + { + "device_id": "7", + "device_ip": "192.168.13.100", + "rank_id": "7" + }], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_cn.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_cn.json new file mode 100644 index 0000000..e2e1f4f --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_cn.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 1024, + "initializer_range": 0.02, + "intermediate_size": 4096, + "max_position_embeddings": 512, + "num_attention_heads": 16, + "num_hidden_layers": 24, + "type_vocab_size": 2, + "vocab_size": 21136 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_en.json b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_en.json new file mode 100644 index 0000000..db8c00a --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/bert_config_large_en.json @@ -0,0 +1,14 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 1024, + "initializer_range": 0.02, + "intermediate_size": 4096, + "max_position_embeddings": 512, + "num_attention_heads": 16, + "num_hidden_layers": 24, + "type_vocab_size": 2, + "vocab_size": 30522 +} + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..73d48a2 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/config/npu_set_env.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +#toolkit env +#export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +#export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$utilDir +#export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +#nnae env +#export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/ +#export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:$utilDir +#export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin +#export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp + +if [ -d /usr/local/Ascend/nnae/latest ];then + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:$utilDir + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$utilDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 +#export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=0 +export HCCL_CONNECT_TIMEOUT=600 + + +# system env +#ulimit -c unlimited diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/run.sh new file mode 100644 index 0000000..2a3a437 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/run.sh @@ -0,0 +1,68 @@ +#!/bin/bash +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_bert_large/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_bert_large/training_job_${currtime}/ + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] see more config info in ${currentDir}/config" +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] train result in ${train_job_dir}" + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +# user env +export JOB_ID=9999001 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=0 +export DEVICE_INDEX=$DEVICE_ID + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_bert.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $currtime $yamlPath 0 True ${toolsPath} ${rank_size} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_bert.log ${train_job_dir} + rank_id=0 + for device_id in ${device_group};do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ./main.log + ${currentDir}/scripts/train.sh $device_id $currtime $yamlPath $rank_id solo ${toolsPath} ${rank_size} & + let rank_id++ + done +fi +wait + + diff --git a/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/train.sh new file mode 100644 index 0000000..3e46354 --- /dev/null +++ b/train/atlas_benchmark-master/nlp/Bert-Large/tensorflow/scripts/train.sh @@ -0,0 +1,152 @@ +#!/bin/bash +# 0 $currtime $yamlPath 0 cluster ${toolsPath} +device_id=$1 +currtime=$2 +yamlPath=$3 +toolsPath=$6 +rank_size=$7 + + +export YAML_PATH=$3 + +mainDir=$(cd "$(dirname "$0")/.."; pwd) + +mkdir -p ${mainDir%train*}/train/result/tf_bert_large/training_job_${currtime}/ +export train_job_dir=${mainDir%train*}/train/result/tf_bert_large/training_job_${currtime}/ + + +#exec_path=${train_job_dir} + +cd ${train_job_dir} + +export utilDir=$(cd "$(dirname "$yamlPath")/../atlas_benchmark-master/utils"; pwd) +export utilDir=$(cd "$(dirname "$yamlPath")/../atlas_benchmark-master/utils/atlasboost"; pwd) +source ${mainDir}/config/npu_set_env.sh + + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +# 声明变量 +export REMARK_LOG_FILE=hw_bert.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${mainDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +export JOB_ID=9999001 +export RANK_TABLE_FILE=${mainDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} + +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +export DEVICE_INDEX=$DEVICE_ID +export RANK_INDEX=0 + +if [ ${PROFILING_MODE} == True ]; +then + export PROFILING_MODE=true +else + export PROFILING_MODE=false +fi + +if [ ${PROFILING_MODE} == True ]; +then + export AICPU_PROFILING_MODE=true +else + export AICPU_PROFILING_MODE=false +fi +export PROFILING_OPTIONS=${PROFILING_OPTIONS} +export FP_POINT=${FP_POINT} +export BP_POINT=${BP_POINT} + +if [ x"${device_id}" = x ] ; +then + echo "turing train fail" >> ${exec_path}/train_${device_id}.log + exit +else + export DEVICE_ID=${device_id} +fi + + +env > ${currentDir}/env_${device_id}.log + +cd ${train_job_dir} + +if [ x"$5" != x"True" ];then + rank_id=$4 + export RANK_ID=$4 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + #echo rank_id is $rank_id + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + #echo device_id is $device_id + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${mainDir}/config/${rank_size}p.json +fi +env > ${currentDir}/env_${device_id}.log +#mkdir exec path + + +mkdir -p ${train_job_dir}/${device_id}/ckpt${DEVICE_ID} +cd ${train_job_dir}/${device_id} + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + + +#start exec +python3.7 ${mainDir}/code/bert-Nv/run_pretraining.py \ + --bert_config_file=${mainDir}/config/${bert_config_file} \ + --max_seq_length=${max_seq_length} \ + --max_predictions_per_seq=${max_predictions_per_seq} \ + --train_batch_size=${train_batch_size} \ + --learning_rate=${learning_rate} \ + --num_warmup_steps=${num_warmup_steps} \ + --num_train_steps=${num_train_steps} \ + --optimizer_type=${optimizer_type} \ + --manual_fp16=${manual_fp16} \ + --use_fp16_cls=${use_fp16_cls} \ + --input_files_dir=${input_files_dir} \ + --eval_files_dir=${eval_files_dir} \ + --do_train=${do_train} \ + --do_eval=${do_eval} \ + --num_accumulation_steps=${num_accumulation_steps} \ + --npu_bert_job_start_file=None \ + --iterations_per_loop=${iterations_per_loop} \ + --npu_bert_loss_scale=${npu_bert_loss_scale} \ + --distributed=${distributed} \ + --graph_memory_max_size=${graph_memory_max_size} \ + --variable_memory_max_size=${variable_memory_max_size} \ + --npu_bert_tail_optimize=${npu_bert_tail_optimize} \ + --save_checkpoints_steps=${save_checkpoints_steps} \ + --npu_bert_clip_by_global_norm=${npu_bert_clip_by_global_norm} \ + --output_dir=${train_job_dir}/${device_id}/ckpt${DEVICE_ID} > ${train_job_dir}/train_${device_id}.log 2>&1 + + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 bert train success" + echo ":::ABK 1.0.0 bert train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 bert train success" >> ${train_job_dir}/${device_id}/hw_bert.log +else + echo ":::ABK 1.0.0 bert train failed" + echo ":::ABK 1.0.0 bert train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 bert train failed" >> ${train_job_dir}/${device_id}/hw_bert.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ":::ABK 1.0.0 bert train total time ${hour}:${min}:${sec}" +echo ":::ABK 1.0.0 bert train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_bert.log + + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/__init__.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/README.md b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/README.md new file mode 100644 index 0000000..a4f9bcf --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/README.md @@ -0,0 +1,89 @@ +# SSD-Resnet34 TensorFlow训练说明 + +### 1. 运行环境 +Python版本: 3.7.5 +主要python三方库: +- tensorflow >= 1.15.0 (satisfied with NPU) + + +### 2. 参数配置 +在train/yaml/SSD-Resnet34.yaml中修改相应配置, 配置项含义: + +``` +tensorflow_config: tensorflow框架下ssd-resnet34的配置项 + +train_batch_size: 训练时设置的batch size大小 +training_file_pattern: 数据集中训练数据集文件标签类型, 数据集中有该类型的文件夹 +resnet_checkpoint: ckpt路径 +validation_file_pattern: 数据集中验证数据文件标签类型, 数据集中有该类型的文件夹 +val_json_file: 数据集中验证数据json文件 +eval_batch_size: 评测时设置的batch size大小 +num_epochs: epochs数量 +model_dir: 存放模型graph等数据的路径 +max_steps: 最大步数 +runmode: 运行模式 边训练边评测、只训练、只评测 +device_group_1p: 跑1p时的device_id +device_group_2p: 跑2p时的device_id +device_group_4p: 跑4p时的device_id +mpirun_ip: 仅集群场景时需要配置, 格式ip1:卡数量1,ip2:卡数量2 +docker_image: docker镜像名称:版本号 +``` + + +SSD-Resnet34.yaml中配置项示例: +``` +tensorflow_config: + + train_batch_size: 32 + training_file_pattern: /home/data/raw_data/tfrecord/train2017* + resnet_checkpoint: /home/data/raw_data/resnet34_pretrain_model/model.ckpt-28152 + validation_file_pattern: /home/data/raw_data/tfrecord/val2017* + val_json_file: /home/data/raw_data/annotations/instances_val2017.json + eval_batch_size: 32 + num_epochs: 1 + model_dir: result_npu + max_steps: 432000 + runmode: train_and_eval + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + docker_image: mpirun3:latest + +``` +SSD-Resnet34.yaml中配置注意事项: + 当ssd-resnet34在docker侧进行训练时,resnet_checkpoint、validation_file_pattern和val_json_file的路径都必须规划在training_file_pattern字段路径中的raw_data下,因配置路径较多,脚本中统一只对training_file_pattern字段路径中的raw_data下文件做映射 + +### 3. 启动训练脚本 + +#### 3.1 训练脚本启动 +当前路径为benchmark包的train文件夹下 +``` +bash benchmark.sh -e SSD-Resnet34 -hw 1p # host侧1p +bash benchmark.sh -e SSD-Resnet34 -hw 8p # host侧8p +bash benchmark.sh -e SSD-Resnet34 -hw 1p -docker # docker侧1p +bash benchmark.sh -e SSD-Resnet34 -hw 8p -docker # docker侧8p +bash benchmark.sh -e SSD-Resnet34 -ct # host侧集群 +bash benchmark.sh -e SSD-Resnet34 -ct -docker # docker侧集群 +``` + +#### 3.2 训练日志 +日志在benchmark包的train路径下reuslt中找到ssd-resnet34的文件夹里。 +``` +./result/tf_ssd-resnet34/TrainingJob-2020xxxxxxxxxx/train_${device_id}.log +./result/tf_ssd-resnet34/TrainingJob-2020xxxxxxxxxx/device_id/hw_ssd-resnet34.log +``` + +### 4. 模型评测 +将train/yaml/SSD-Resnet34.yaml中resnet_checkpoint的值改为训练产生的日志的路径, runmode的值改为evaluate,如2中示例; +然后运行与训练时相同的脚本,结果参看见train.log。 + + +### 5. 训练结果参考 + +1p: 600 +4P: 2000 +8p: 4000 + + + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/__init__.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/__init__.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/coco_metric.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/coco_metric.py new file mode 100644 index 0000000..296d751 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/coco_metric.py @@ -0,0 +1,281 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""COCO-style evaluation metrics. + +Implements the interface of COCO API and metric_fn in tf.TPUEstimator. + +COCO API: github.com/cocodataset/cocoapi/ +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import atexit +import tempfile +import time + +from absl import flags + +import numpy as np +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval +import six + +#COCO = coco.COCO +#COCOeval = coco.COCOeval + +import tensorflow as tf + +import ssd_constants + +FLAGS = flags.FLAGS + + +# https://github.com/cocodataset/cocoapi/issues/49 +if six.PY3: + import pycocotools.coco + pycocotools.coco.unicode = str + + +def create_coco(val_json_file, use_cpp_extension=True): + """Creates Microsoft COCO helper class object and return it.""" + if val_json_file.startswith('gs://'): + _, local_val_json = tempfile.mkstemp(suffix='.json') + tf.gfile.Remove(local_val_json) + + tf.gfile.Copy(val_json_file, local_val_json) + atexit.register(tf.gfile.Remove, local_val_json) + else: + local_val_json = val_json_file + + if use_cpp_extension: + coco_gt = coco.COCO(local_val_json, False) + else: + coco_gt = COCO(local_val_json) + return coco_gt + + +def compute_map(labels_and_predictions, + coco_gt, + use_cpp_extension=True, + nms_on_tpu=True): + """Use model predictions to compute mAP. + + The evaluation code is largely copied from the MLPerf reference + implementation. While it is possible to write the evaluation as a tensor + metric and use Estimator.evaluate(), this approach was selected for simplicity + and ease of duck testing. + + Args: + labels_and_predictions: A map from TPU predict method. + coco_gt: ground truch COCO object. + use_cpp_extension: use cocoeval C++ library. + nms_on_tpu: do NMS on TPU. + Returns: + Evaluation result. + """ + + predictions = [] + tic = time.time() + + if nms_on_tpu: + p = [] + for i in labels_and_predictions: + for j in i: + p.append(np.array(j, dtype=np.float32)) + predictions = np.concatenate(list(p)).reshape((-1, 7)) + else: + k = 0 + for example in labels_and_predictions: + if ssd_constants.IS_PADDED in example and example[ + ssd_constants.IS_PADDED]: + continue + print(k) + k += 1 + htot, wtot, _ = example[ssd_constants.RAW_SHAPE] + pred_box = example['pred_box'] + pred_scores = example['pred_scores'] + indices = example['indices'] + loc, label, prob = decode_single( + pred_box, pred_scores, indices, ssd_constants.OVERLAP_CRITERIA, + ssd_constants.MAX_NUM_EVAL_BOXES, ssd_constants.MAX_NUM_EVAL_BOXES) + + for loc_, label_, prob_ in zip(loc, label, prob): + # Ordering convention differs, hence [1], [0] rather than [0], [1] + predictions.append([ + int(example[ssd_constants.SOURCE_ID]), + loc_[1] * wtot, loc_[0] * htot, (loc_[3] - loc_[1]) * wtot, + (loc_[2] - loc_[0]) * htot, prob_, + ssd_constants.CLASS_INV_MAP[label_] + ]) + + toc = time.time() + tf.logging.info('Prepare predictions DONE (t={:0.2f}s).'.format(toc - tic)) + + if coco_gt is None: + coco_gt = create_coco( + FLAGS.val_json_file, use_cpp_extension=use_cpp_extension) + + if use_cpp_extension: + coco_dt = coco_gt.LoadRes(np.array(predictions, dtype=np.float32)) + coco_eval = COCOeval(coco_gt, coco_dt, iou_type='bbox') + coco_eval.Evaluate() + coco_eval.Accumulate() + coco_eval.Summarize() + stats = coco_eval.GetStats() + + else: + coco_dt = coco_gt.loadRes(np.array(predictions)) + + coco_eval = COCOeval(coco_gt, coco_dt, iouType='bbox') + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + stats = coco_eval.stats + + print('Current AP: {:.5f}'.format(stats[0])) + metric_names = ['AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'ARmax1', + 'ARmax10', 'ARmax100', 'ARs', 'ARm', 'ARl'] + coco_time = time.time() + tf.logging.info('COCO eval DONE (t={:0.2f}s).'.format(coco_time - toc)) + + # Prefix with "COCO" to group in TensorBoard. + return {'COCO/' + key: value for key, value in zip(metric_names, stats)} + + +def calc_iou(target, candidates): + target_tiled = np.tile(target[np.newaxis, :], (candidates.shape[0], 1)) + # Left Top & Right Bottom + lt = np.maximum(target_tiled[:,:2], candidates[:,:2]) + + rb = np.minimum(target_tiled[:,2:], candidates[:,2:]) + + delta = np.maximum(rb - lt, 0) + + intersect = delta[:,0] * delta[:,1] + + delta1 = target_tiled[:, 2:] - target_tiled[:, :2] + area1 = delta1[:,0] * delta1[:,1] + delta2 = candidates[:, 2:] - candidates[:, :2] + area2 = delta2[:,0] * delta2[:,1] + + iou = intersect/(area1 + area2 - intersect) + return iou + + +def decode_single(bboxes_in, + scores_in, + indices, + criteria, + max_output, + max_num=200): + """Implement Non-maximum suppression. + + Reference to https://github.com/amdegroot/ssd.pytorch + + Args: + bboxes_in: a Tensor with shape [N, 4], which stacks box regression outputs + on all feature levels. The N is the number of total anchors on all levels. + scores_in: a Tensor with shape [ssd_constants.MAX_NUM_EVAL_BOXES, + num_classes]. The top ssd_constants.MAX_NUM_EVAL_BOXES box scores for each + class. + indices: a Tensor with shape [ssd_constants.MAX_NUM_EVAL_BOXES, + num_classes]. The indices for these top boxes for each class. + criteria: a float number to specify the threshold of NMS. + max_output: maximum output length. + max_num: maximum number of boxes before NMS. + + Returns: + boxes, labels and scores after NMS. + """ + + bboxes_out = [] + scores_out = [] + labels_out = [] + + for i, score in enumerate(np.split(scores_in, scores_in.shape[1], 1)): + class_indices = indices[:, i] + bboxes = bboxes_in[class_indices, :] + score = np.squeeze(score, 1) + + # skip background + if i == 0: + continue + + mask = score > ssd_constants.MIN_SCORE + if not np.any(mask): + continue + + bboxes, score = bboxes[mask, :], score[mask] + + # remain_list = [] + # for r in range(bboxes.shape[0]): + # if bboxes[r, 0] < 0 or bboxes[r, 1] < 0 or bboxes[r, 2] < 0 or bboxes[r, 3] < 0 or bboxes[r, 0] >= bboxes[r, 2] or \ + # bboxes[r, 1] >= bboxes[r, 3]: + # continue + # remain_list.append(r) + # bboxes = bboxes[remain_list, :] + # score = score[remain_list] + + remain_list = [] + for r in range(bboxes.shape[0]): + for j in range(4): + if bboxes[r, j] < 0: + bboxes[r, j] = 0.00001 + if bboxes[r, 0] >= bboxes[r, 2]: + bboxes[r, 2] = bboxes[r, 0] + 0.00001 + if bboxes[r, 1] >= bboxes[r, 3]: + bboxes[r, 3] = bboxes[r, 1] + 0.00001 + remain_list.append(r) + bboxes = bboxes[remain_list, :] + score = score[remain_list] + + + score_idx_sorted = np.argsort(score) + score_sorted = score[score_idx_sorted] + + score_idx_sorted = score_idx_sorted[-max_num:] + candidates = [] + + # perform non-maximum suppression + while len(score_idx_sorted): + idx = score_idx_sorted[-1] + bboxes_sorted = bboxes[score_idx_sorted, :] + bboxes_idx = bboxes[idx, :] + iou = calc_iou(bboxes_idx, bboxes_sorted) + + score_idx_sorted = score_idx_sorted[iou < criteria] + candidates.append(idx) + + bboxes_out.append(bboxes[candidates, :]) + scores_out.append(score[candidates]) + labels_out.extend([i]*len(candidates)) + + if len(scores_out) == 0: + tf.logging.info("No objects detected. Returning dummy values.") + return ( + np.zeros(shape=(1, 4), dtype=np.float32), + np.zeros(shape=(1,), dtype=np.int32), + np.ones(shape=(1,), dtype=np.float32) * ssd_constants.DUMMY_SCORE, + ) + + bboxes_out = np.concatenate(bboxes_out, axis=0) + scores_out = np.concatenate(scores_out, axis=0) + labels_out = np.array(labels_out) + + max_ids = np.argsort(scores_out)[-max_output:] + + return bboxes_out[max_ids, :], labels_out[max_ids], scores_out[max_ids] diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/create_coco_tf_record.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/create_coco_tf_record.py new file mode 100644 index 0000000..1802191 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/create_coco_tf_record.py @@ -0,0 +1,369 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +r"""Convert raw COCO dataset to TFRecord for object_detection. + +Example usage: + python create_coco_tf_record.py --logtostderr \ + --image_dir="${TRAIN_IMAGE_DIR}" \ + --object_annotations_file="${TRAIN_ANNOTATIONS_FILE}" \ + --caption_annotations_file="${CAPTION_ANNOTATIONS_FILE}" \ + --output_file_prefix="${OUTPUT_DIR/FILE_PREFIX}" \ + --num_shards=32 +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import hashlib +import io +import json +import logging +import multiprocessing +import os +from absl import app +from absl import flags +import numpy as np +import PIL.Image + +from pycocotools import mask +from research.object_detection.utils import dataset_util +from research.object_detection.utils import label_map_util + +import tensorflow.compat.v1 as tf +flags.DEFINE_boolean( + 'include_masks', False, 'Whether to include instance segmentations masks ' + '(PNG encoded) in the result. default: False.') +flags.DEFINE_string('image_dir', '', 'Directory containing images.') +flags.DEFINE_string( + 'image_info_file', '', 'File containing image information. ' + 'Tf Examples in the output files correspond to the image ' + 'info entries in this file. If this file is not provided ' + 'object_annotations_file is used if present. Otherwise, ' + 'caption_annotations_file is used to get image info.') +flags.DEFINE_string( + 'object_annotations_file', '', 'File containing object ' + 'annotations - boxes and instance masks.') +flags.DEFINE_string('caption_annotations_file', '', 'File containing image ' + 'captions.') +flags.DEFINE_string('output_file_prefix', '/tmp/train', 'Path to output file') +flags.DEFINE_integer('num_shards', 32, 'Number of shards for output file.') + +FLAGS = flags.FLAGS + +logger = tf.get_logger() +logger.setLevel(logging.INFO) + + +def create_tf_example(image, + image_dir, + bbox_annotations=None, + category_index=None, + caption_annotations=None, + include_masks=False): + """Converts image and annotations to a tf.Example proto. + + Args: + image: dict with keys: [u'license', u'file_name', u'coco_url', u'height', + u'width', u'date_captured', u'flickr_url', u'id'] + image_dir: directory containing the image files. + bbox_annotations: + list of dicts with keys: [u'segmentation', u'area', u'iscrowd', + u'image_id', u'bbox', u'category_id', u'id'] Notice that bounding box + coordinates in the official COCO dataset are given as [x, y, width, + height] tuples using absolute coordinates where x, y represent the + top-left (0-indexed) corner. This function converts to the format + expected by the Tensorflow Object Detection API (which is which is + [ymin, xmin, ymax, xmax] with coordinates normalized relative to image + size). + category_index: a dict containing COCO category information keyed by the + 'id' field of each category. See the label_map_util.create_category_index + function. + caption_annotations: + list of dict with keys: [u'id', u'image_id', u'str']. + include_masks: Whether to include instance segmentations masks + (PNG encoded) in the result. default: False. + + Returns: + example: The converted tf.Example + num_annotations_skipped: Number of (invalid) annotations that were ignored. + + Raises: + ValueError: if the image pointed to by data['filename'] is not a valid JPEG + """ + image_height = image['height'] + image_width = image['width'] + filename = image['file_name'] + image_id = image['id'] + + full_path = os.path.join(image_dir, filename) + with tf.gfile.GFile(full_path, 'rb') as fid: + encoded_jpg = fid.read() + encoded_jpg_io = io.BytesIO(encoded_jpg) + image = PIL.Image.open(encoded_jpg_io) + key = hashlib.sha256(encoded_jpg).hexdigest() + feature_dict = { + 'image/height': + dataset_util.int64_feature(image_height), + 'image/width': + dataset_util.int64_feature(image_width), + 'image/filename': + dataset_util.bytes_feature(filename.encode('utf8')), + 'image/source_id': + dataset_util.bytes_feature(str(image_id).encode('utf8')), + 'image/key/sha256': + dataset_util.bytes_feature(key.encode('utf8')), + 'image/encoded': + dataset_util.bytes_feature(encoded_jpg), + 'image/format': + dataset_util.bytes_feature('jpeg'.encode('utf8')), + } + + num_annotations_skipped = 0 + if bbox_annotations: + xmin = [] + xmax = [] + ymin = [] + ymax = [] + is_crowd = [] + category_names = [] + category_ids = [] + area = [] + encoded_mask_png = [] + for object_annotations in bbox_annotations: + (x, y, width, height) = tuple(object_annotations['bbox']) + if width <= 0 or height <= 0: + num_annotations_skipped += 1 + continue + if x + width > image_width or y + height > image_height: + num_annotations_skipped += 1 + continue + xmin.append(float(x) / image_width) + xmax.append(float(x + width) / image_width) + ymin.append(float(y) / image_height) + ymax.append(float(y + height) / image_height) + is_crowd.append(object_annotations['iscrowd']) + category_id = int(object_annotations['category_id']) + category_ids.append(category_id) + category_names.append(category_index[category_id]['name'].encode('utf8')) + area.append(object_annotations['area']) + + if include_masks: + run_len_encoding = mask.frPyObjects(object_annotations['segmentation'], + image_height, image_width) + binary_mask = mask.decode(run_len_encoding) + if not object_annotations['iscrowd']: + binary_mask = np.amax(binary_mask, axis=2) + pil_image = PIL.Image.fromarray(binary_mask) + output_io = io.BytesIO() + pil_image.save(output_io, format='PNG') + encoded_mask_png.append(output_io.getvalue()) + feature_dict.update({ + 'image/object/bbox/xmin': + dataset_util.float_list_feature(xmin), + 'image/object/bbox/xmax': + dataset_util.float_list_feature(xmax), + 'image/object/bbox/ymin': + dataset_util.float_list_feature(ymin), + 'image/object/bbox/ymax': + dataset_util.float_list_feature(ymax), + 'image/object/class/text': + dataset_util.bytes_list_feature(category_names), + 'image/object/class/label': + dataset_util.int64_list_feature(category_ids), + 'image/object/is_crowd': + dataset_util.int64_list_feature(is_crowd), + 'image/object/area': + dataset_util.float_list_feature(area), + }) + if include_masks: + feature_dict['image/object/mask'] = ( + dataset_util.bytes_list_feature(encoded_mask_png)) + if caption_annotations: + captions = [] + for caption_annotation in caption_annotations: + captions.append(caption_annotation['caption'].encode('utf8')) + feature_dict.update( + {'image/caption': dataset_util.bytes_list_feature(captions)}) + + example = tf.train.Example(features=tf.train.Features(feature=feature_dict)) + return key, example, num_annotations_skipped + + +def _pool_create_tf_example(args): + return create_tf_example(*args) + + +def _load_object_annotations(object_annotations_file): + """Loads object annotation JSON file.""" + with tf.gfile.GFile(object_annotations_file, 'r') as fid: + obj_annotations = json.load(fid) + + images = obj_annotations['images'] + category_index = label_map_util.create_category_index( + obj_annotations['categories']) + + img_to_obj_annotation = collections.defaultdict(list) + logging.info('Building bounding box index.') + for annotation in obj_annotations['annotations']: + image_id = annotation['image_id'] + img_to_obj_annotation[image_id].append(annotation) + + missing_annotation_count = 0 + for image in images: + image_id = image['id'] + if image_id not in img_to_obj_annotation: + missing_annotation_count += 1 + + logging.info('%d images are missing bboxes.', missing_annotation_count) + + return img_to_obj_annotation, category_index + + +def _load_caption_annotations(caption_annotations_file): + """Loads caption annotation JSON file.""" + with tf.gfile.GFile(caption_annotations_file, 'r') as fid: + caption_annotations = json.load(fid) + + img_to_caption_annotation = collections.defaultdict(list) + logging.info('Building caption index.') + for annotation in caption_annotations['annotations']: + image_id = annotation['image_id'] + img_to_caption_annotation[image_id].append(annotation) + + missing_annotation_count = 0 + images = caption_annotations['images'] + for image in images: + image_id = image['id'] + if image_id not in img_to_caption_annotation: + missing_annotation_count += 1 + + logging.info('%d images are missing captions.', missing_annotation_count) + + return img_to_caption_annotation + + +def _load_images_info(images_info_file): + with tf.gfile.GFile(images_info_file, 'r') as fid: + info_dict = json.load(fid) + return info_dict['images'] + + +def _create_tf_record_from_coco_annotations(images_info_file, + image_dir, + output_path, + num_shards, + object_annotations_file=None, + caption_annotations_file=None, + include_masks=False): + """Loads COCO annotation json files and converts to tf.Record format. + + Args: + images_info_file: JSON file containing image info. The number of tf.Examples + in the output tf Record files is exactly equal to the number of image info + entries in this file. This can be any of train/val/test annotation json + files Eg. 'image_info_test-dev2017.json', + 'instance_annotations_train2017.json', + 'caption_annotations_train2017.json', etc. + image_dir: Directory containing the image files. + output_path: Path to output tf.Record file. + num_shards: Number of output files to create. + object_annotations_file: JSON file containing bounding box annotations. + caption_annotations_file: JSON file containing caption annotations. + include_masks: Whether to include instance segmentations masks + (PNG encoded) in the result. default: False. + """ + + logging.info('writing to output path: %s', output_path) + writers = [ + tf.python_io.TFRecordWriter( + output_path + '-%05d-of-%05d.tfrecord' % (i, num_shards)) + for i in range(num_shards) + ] + images = _load_images_info(images_info_file) + + img_to_obj_annotation = None + img_to_caption_annotation = None + category_index = None + if object_annotations_file: + img_to_obj_annotation, category_index = ( + _load_object_annotations(object_annotations_file)) + if caption_annotations_file: + img_to_caption_annotation = ( + _load_caption_annotations(caption_annotations_file)) + + def _get_object_annotation(image_id): + if img_to_obj_annotation: + return img_to_obj_annotation[image_id] + else: + return None + + def _get_caption_annotation(image_id): + if img_to_caption_annotation: + return img_to_caption_annotation[image_id] + else: + return None + + pool = multiprocessing.Pool() + total_num_annotations_skipped = 0 + for idx, (_, tf_example, num_annotations_skipped) in enumerate( + pool.imap(_pool_create_tf_example, + [(image, image_dir, _get_object_annotation(image['id']), + category_index, _get_caption_annotation(image['id']), + include_masks) for image in images])): + if idx % 100 == 0: + logging.info('On image %d of %d', idx, len(images)) + + total_num_annotations_skipped += num_annotations_skipped + writers[idx % num_shards].write(tf_example.SerializeToString()) + + pool.close() + pool.join() + + for writer in writers: + writer.close() + + logging.info('Finished writing, skipped %d annotations.', + total_num_annotations_skipped) + + +def main(_): + assert FLAGS.image_dir, '`image_dir` missing.' + assert (FLAGS.image_info_file or FLAGS.object_annotations_file or + FLAGS.caption_annotations_file), ('All annotation files are ' + 'missing.') + if FLAGS.image_info_file: + images_info_file = FLAGS.image_info_file + elif FLAGS.object_annotations_file: + images_info_file = FLAGS.object_annotations_file + else: + images_info_file = FLAGS.caption_annotations_file + + directory = os.path.dirname(FLAGS.output_file_prefix) + if not tf.gfile.IsDirectory(directory): + tf.gfile.MakeDirs(directory) + + _create_tf_record_from_coco_annotations(images_info_file, FLAGS.image_dir, + FLAGS.output_file_prefix, + FLAGS.num_shards, + FLAGS.object_annotations_file, + FLAGS.caption_annotations_file, + FLAGS.include_masks) + + +if __name__ == '__main__': + logger = tf.get_logger() + logger.setLevel(logging.INFO) + app.run(main) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/dataloader.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/dataloader.py new file mode 100644 index 0000000..28fd3e0 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/dataloader.py @@ -0,0 +1,436 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Data loader and processing.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import itertools as it +import math +import os + +import numpy as np +import tensorflow as tf + +from object_detection import argmax_matcher +from object_detection import box_list +from object_detection import faster_rcnn_box_coder +from object_detection import preprocessor +from object_detection import region_similarity_calculator +from object_detection import target_assigner +from object_detection import tf_example_decoder +import ssd_constants + + +def get_rank_size(): + return int(os.environ['RANK_SIZE']) + +def get_rank_id(): + return int(os.environ['DEVICE_ID']) + +class DefaultBoxes(object): + """Default bounding boxes for 300x300 5 layer SSD. + + Default bounding boxes generation follows the order of (W, H, anchor_sizes). + Therefore, the tensor converted from DefaultBoxes has a shape of + [anchor_sizes, H, W, 4]. The last dimension is the box coordinates; 'ltrb' + is [ymin, xmin, ymax, xmax] while 'xywh' is [cy, cx, h, w]. + """ + + def __init__(self): + fk = ssd_constants.IMAGE_SIZE / np.array(ssd_constants.STEPS) + + self.default_boxes = [] + # size of feature and number of feature + for idx, feature_size in enumerate(ssd_constants.FEATURE_SIZES): + sk1 = ssd_constants.SCALES[idx] / ssd_constants.IMAGE_SIZE + sk2 = ssd_constants.SCALES[idx+1] / ssd_constants.IMAGE_SIZE + sk3 = math.sqrt(sk1*sk2) + all_sizes = [(sk1, sk1), (sk3, sk3)] + + for alpha in ssd_constants.ASPECT_RATIOS[idx]: + w, h = sk1 * math.sqrt(alpha), sk1 / math.sqrt(alpha) + all_sizes.append((w, h)) + all_sizes.append((h, w)) + + assert len(all_sizes) == ssd_constants.NUM_DEFAULTS[idx] + + for i, j in it.product(range(feature_size), repeat=2): + for w, h in all_sizes: + cx, cy = (j + 0.5) / fk[idx], (i + 0.5) / fk[idx] + box = tuple(np.clip(k, 0, 1) for k in (cy, cx, h, w)) + self.default_boxes.append(box) + + assert len(self.default_boxes) == ssd_constants.NUM_SSD_BOXES + + def to_ltrb(cy, cx, h, w): + return cy - h / 2, cx - w / 2, cy + h / 2, cx + w / 2 + + # For IoU calculation + self.default_boxes_ltrb = tuple(to_ltrb(*i) for i in self.default_boxes) + + def __call__(self, order='ltrb'): + if order == 'ltrb': return self.default_boxes_ltrb + if order == 'xywh': return self.default_boxes + + +def calc_iou_tensor(box1, box2): + """ Calculation of IoU based on two boxes tensor, + Reference to https://github.com/kuangliu/pytorch-ssd + input: + box1 (N, 4) + box2 (M, 4) + output: + IoU (N, M) + """ + N = tf.shape(box1)[0] + M = tf.shape(box2)[0] + + be1 = tf.tile(tf.expand_dims(box1, axis=1), (1, M, 1)) + be2 = tf.tile(tf.expand_dims(box2, axis=0), (N, 1, 1)) + + # Left Top & Right Bottom + lt = tf.maximum(be1[:,:,:2], be2[:,:,:2]) + + rb = tf.minimum(be1[:,:,2:], be2[:,:,2:]) + + delta = tf.maximum(rb - lt, 0) + + intersect = delta[:,:,0]*delta[:,:,1] + + delta1 = be1[:,:,2:] - be1[:,:,:2] + area1 = delta1[:,:,0]*delta1[:,:,1] + delta2 = be2[:,:,2:] - be2[:,:,:2] + area2 = delta2[:,:,0]*delta2[:,:,1] + + iou = intersect/(area1 + area2 - intersect) + return iou + + +def ssd_crop(image, boxes, classes): + """IoU biassed random crop. + + Reference: https://github.com/chauhan-utk/ssd.DomainAdaptation + """ + + num_boxes = tf.shape(boxes)[0] + + def no_crop_check(): + return (tf.random_uniform(shape=(), minval=0, maxval=1, dtype=tf.float32) + < ssd_constants.P_NO_CROP_PER_PASS) + + def no_crop_proposal(): + return ( + tf.ones((), tf.bool), + tf.convert_to_tensor([0, 0, 1, 1], dtype=tf.float32), + tf.ones((num_boxes,), tf.bool), + ) + + def crop_proposal(): + rand_vec = lambda minval, maxval: tf.random_uniform( + shape=(ssd_constants.NUM_CROP_PASSES, 1), minval=minval, maxval=maxval, + dtype=tf.float32) + + width, height = rand_vec(0.3, 1), rand_vec(0.3, 1) + left, top = rand_vec(0, 1-width), rand_vec(0, 1-height) + + right = left + width + bottom = top + height + + ltrb = tf.concat([left, top, right, bottom], axis=1) + + min_iou = tf.random_shuffle(ssd_constants.CROP_MIN_IOU_CHOICES)[0] + ious = calc_iou_tensor(ltrb, boxes) + + # discard any bboxes whose center not in the cropped image + xc, yc = [tf.tile(0.5 * (boxes[:, i + 0] + boxes[:, i + 2])[tf.newaxis, :], + (ssd_constants.NUM_CROP_PASSES, 1)) for i in range(2)] + + masks = tf.reduce_all(tf.stack([ + tf.greater(xc, tf.tile(left, (1, num_boxes))), + tf.less(xc, tf.tile(right, (1, num_boxes))), + tf.greater(yc, tf.tile(top, (1, num_boxes))), + tf.less(yc, tf.tile(bottom, (1, num_boxes))), + ], axis=2), axis=2) + + # Checks of whether a crop is valid. + valid_aspect = tf.logical_and(tf.less(height/width, 2), + tf.less(width/height, 2)) + valid_ious = tf.reduce_all(tf.greater(ious, min_iou), axis=1, keepdims=True) + valid_masks = tf.reduce_any(masks, axis=1, keepdims=True) + + valid_all = tf.cast(tf.reduce_all(tf.concat( + [valid_aspect, valid_ious, valid_masks], axis=1), axis=1), tf.int32) + + # One indexed, as zero is needed for the case of no matches. + index = tf.range(1, 1 + ssd_constants.NUM_CROP_PASSES, dtype=tf.int32) + + # Either one-hot, or zeros if there is no valid crop. + selection = tf.equal(tf.reduce_max(index * valid_all), index) + + use_crop = tf.reduce_any(selection) + output_ltrb = tf.reduce_sum(tf.multiply(ltrb, tf.tile(tf.cast( + selection, tf.float32)[:, tf.newaxis], (1, 4))), axis=0) + output_masks = tf.reduce_any(tf.logical_and(masks, tf.tile( + selection[:, tf.newaxis], (1, num_boxes))), axis=0) + + return use_crop, output_ltrb, output_masks + + def proposal(*args): + return tf.cond( + pred=no_crop_check(), + true_fn=no_crop_proposal, + false_fn=crop_proposal, + ) + + _, crop_bounds, box_masks = tf.while_loop( + cond=lambda x, *_: tf.logical_not(x), + body=proposal, + loop_vars=[tf.zeros((), tf.bool), tf.zeros((4,), tf.float32), tf.zeros((num_boxes,), tf.bool)], + ) + + filtered_boxes = tf.boolean_mask(boxes, box_masks, axis=0) + + # Clip boxes to the cropped region. + filtered_boxes = tf.stack([ + tf.maximum(filtered_boxes[:, 0], crop_bounds[0]), + tf.maximum(filtered_boxes[:, 1], crop_bounds[1]), + tf.minimum(filtered_boxes[:, 2], crop_bounds[2]), + tf.minimum(filtered_boxes[:, 3], crop_bounds[3]), + ], axis=1) + + left = crop_bounds[0] + top = crop_bounds[1] + width = crop_bounds[2] - left + height = crop_bounds[3] - top + + cropped_boxes = tf.stack([ + (filtered_boxes[:, 0] - left) / width, + (filtered_boxes[:, 1] - top) / height, + (filtered_boxes[:, 2] - left) / width, + (filtered_boxes[:, 3] - top) / height, + ], axis=1) + + cropped_image = tf.image.crop_and_resize( + image=image[tf.newaxis, :, :, :], + boxes=crop_bounds[tf.newaxis, :], + box_ind=tf.zeros((1,), tf.int32), + crop_size=(ssd_constants.IMAGE_SIZE, ssd_constants.IMAGE_SIZE), + )[0, :, :, :] + + cropped_classes = tf.boolean_mask(classes, box_masks, axis=0) + + return cropped_image, cropped_boxes, cropped_classes + + +def color_jitter(image, brightness=0, contrast=0, saturation=0, hue=0): + """Distorts the color of the image. + + Args: + image: The input image tensor. + brightness: A float, specifying the brightness for color jitter. + contrast: A float, specifying the contrast for color jitter. + saturation: A float, specifying the saturation for color jitter. + hue: A float, specifying the hue for color jitter. + + Returns: + The distorted image tensor. + """ + with tf.name_scope('distort_color'): + if brightness > 0: + image = tf.image.random_brightness(image, max_delta=brightness) + if contrast > 0: + image = tf.image.random_contrast( + image, lower=1-contrast, upper=1+contrast) + if saturation > 0: + image = tf.image.random_saturation( + image, lower=1-saturation, upper=1+saturation) + if hue > 0: + image = tf.image.random_hue(image, max_delta=hue) + return image + + +def encode_labels(gt_boxes, gt_labels): + """Labels anchors with ground truth inputs. + + Args: + gt_boxes: A float tensor with shape [N, 4] representing groundtruth boxes. + For each row, it stores [y0, x0, y1, x1] for four corners of a box. + gt_labels: A integer tensor with shape [N, 1] representing groundtruth + classes. + Returns: + encoded_classes: a tensor with shape [num_anchors, 1]. + encoded_boxes: a tensor with shape [num_anchors, 4]. + num_positives: scalar tensor storing number of positives in an image. + """ + similarity_calc = region_similarity_calculator.IouSimilarity() + matcher = argmax_matcher.ArgMaxMatcher( + matched_threshold=ssd_constants.MATCH_THRESHOLD, + unmatched_threshold=ssd_constants.MATCH_THRESHOLD, + negatives_lower_than_unmatched=True, + force_match_for_each_row=True) + + box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( + scale_factors=ssd_constants.BOX_CODER_SCALES) + + default_boxes = box_list.BoxList(tf.convert_to_tensor(DefaultBoxes()('ltrb'))) + target_boxes = box_list.BoxList(gt_boxes) + + assigner = target_assigner.TargetAssigner( + similarity_calc, matcher, box_coder) + + encoded_classes, _, encoded_boxes, _, matches = assigner.assign( + default_boxes, target_boxes, gt_labels) + num_matched_boxes = tf.reduce_sum( + tf.cast(tf.not_equal(matches.match_results, -1), tf.float32)) + return encoded_classes, encoded_boxes, num_matched_boxes + +class SSDInputReader(object): + """Input reader for dataset.""" + + def __init__(self, + file_pattern, + transpose_input=False, + is_training=False, + distributed_eval=False, + count=-1): + self._file_pattern = file_pattern + self._transpose_input = transpose_input + self._is_training = is_training + self._distributed_eval = distributed_eval + self._count = count + + def __call__(self, params): + example_decoder = tf_example_decoder.TfExampleDecoder() + + def _parse_example(data): + with tf.name_scope('augmentation'): + source_id = data['source_id'] + image = data['image'] # dtype uint8 + raw_shape = tf.shape(image) + boxes = data['groundtruth_boxes'] + classes = tf.reshape(data['groundtruth_classes'], [-1, 1]) + + # Only 80 of the 90 COCO classes are used. + class_map = tf.convert_to_tensor(ssd_constants.CLASS_MAP) + classes = tf.gather(class_map, classes) + classes = tf.cast(classes, dtype=tf.float32) + + if self._is_training: + image, boxes, classes = ssd_crop(image, boxes, classes) + # ssd_crop resizes and returns image of dtype float32 and does not + # change its range (i.e., value in between 0--255). Divide by 255. + # converts it to [0, 1] range. Not doing this before cropping to + # avoid dtype cast (which incurs additional memory copy). + image /= 255.0 + + # random_horizontal_flip() is hard coded to flip with 50% chance. + image, boxes = preprocessor.random_horizontal_flip( + image=image, boxes=boxes) + + # TODO(shibow): Investigate the parameters for color jitter. + image = color_jitter( + image, brightness=0.125, contrast=0.5, saturation=0.5, hue=0.05) + + + encoded_classes, encoded_boxes, num_matched_boxes = encode_labels( + boxes, classes) + + # TODO(taylorrobie): Check that this cast is valid. + encoded_classes = tf.cast(encoded_classes, tf.int32) + + labels = { + ssd_constants.NUM_MATCHED_BOXES: num_matched_boxes, + ssd_constants.BOXES: encoded_boxes, + ssd_constants.CLASSES: tf.squeeze(encoded_classes, axis=1), + } + + return image, labels + + else: + image = tf.image.resize_images( + image, size=(ssd_constants.IMAGE_SIZE, ssd_constants.IMAGE_SIZE)) + # resize_image returns image of dtype float32 and does not change its + # range. Divide by 255 to convert image to [0, 1] range. + image /= 255. + + def trim_and_pad(inp_tensor, dim_1): + """Limit the number of boxes, and pad if necessary.""" + inp_tensor = inp_tensor[:ssd_constants.MAX_NUM_EVAL_BOXES] + num_pad = ssd_constants.MAX_NUM_EVAL_BOXES - tf.shape(inp_tensor)[0] + inp_tensor = tf.pad(inp_tensor, [[0, num_pad], [0, 0]]) + return tf.reshape( + inp_tensor, [ssd_constants.MAX_NUM_EVAL_BOXES, dim_1]) + + boxes, classes = trim_and_pad(boxes, 4), trim_and_pad(classes, 1) + + sample = { + ssd_constants.IMAGE: image, + ssd_constants.BOXES: boxes, + ssd_constants.CLASSES: classes, + ssd_constants.SOURCE_ID: tf.string_to_number(source_id, tf.int32), + ssd_constants.RAW_SHAPE: raw_shape, + } + + return sample + + batch_size = params['batch_size'] + dataset = tf.data.Dataset.list_files(self._file_pattern, shuffle=False) + + if self._is_training or self._distributed_eval: + if get_rank_size() == 1: + dataset = dataset.shard(1, 0) + else: + dataset = dataset.shard(get_rank_size(), get_rank_id()) + if self._is_training: + dataset = dataset.shuffle( tf.to_int64(256)) + + # Prefetch data from files. + def _prefetch_dataset(filename): + dataset = tf.data.TFRecordDataset(filename).prefetch(1) + return dataset + dataset = dataset.apply( + tf.data.experimental.parallel_interleave( + _prefetch_dataset, cycle_length=32, sloppy=self._is_training)) + + # Parse the fetched records to input tensors for model function. + dataset = dataset.map(example_decoder.decode, num_parallel_calls=64) + + if self._is_training: + dataset = dataset.map( + # pylint: disable=g-long-lambda + lambda data: (data, + tf.greater(tf.shape(data['groundtruth_boxes'])[0], 0)), + num_parallel_calls=64) + dataset = dataset.filter(lambda data, pred: pred) + + dataset = dataset.shuffle(64).repeat() + + dataset = dataset.map(lambda data, pred: data) # use the first value + dataset = dataset.map(_parse_example, num_parallel_calls=64) + dataset = dataset.batch(batch_size=batch_size, drop_remainder=True) + else: + dataset = dataset.prefetch(batch_size * 64) + dataset = dataset.map(_parse_example, num_parallel_calls=64) + dataset = dataset.batch(batch_size=batch_size, drop_remainder=True) + + dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE) + options = tf.data.Options() + options.experimental_threading.max_intra_op_parallelism = 1 + options.experimental_threading.private_threadpool_size = 48 + dataset = dataset.with_options(options) + + return dataset diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/exec_main.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/exec_main.sh new file mode 100644 index 0000000..b51841c --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/exec_main.sh @@ -0,0 +1,24 @@ +#!/bin/bash +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export JOB_ID=990 +export FUSION_TENSOR_SIZE=1000000000 + +python3 ${3}/ssd_main.py --mode=train_and_eval \ + --train_batch_size=32 \ + --training_file_pattern="train_tfrecord_path/train2017*" \ + --resnet_checkpoint=resnet34_path/model.ckpt-28152 \ + --validation_file_pattern="val_tfrecord_path/val2017*" \ + --val_json_file="annotations_patah/instances_val2017.json" \ + --eval_batch_size=32 \ + --model_dir=result_npu + + +sleep 2 +echo "**************** train finished ***************" +cp /var/log/npu/slog/host-0/* ./slog +cp /var/log/npu/slog/device-$DEVICE_ID/* ./slog +cp /var/log/npu/slog/device-os-$DEVICE_ID/* ./slog + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/__init__.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/__init__.py new file mode 100644 index 0000000..85c94f4 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/argmax_matcher.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/argmax_matcher.py new file mode 100644 index 0000000..cdf4ad0 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/argmax_matcher.py @@ -0,0 +1,199 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Argmax matcher implementation. + +This class takes a similarity matrix and matches columns to rows based on the +maximum value per column. One can specify matched_thresholds and +to prevent columns from matching to rows (generally resulting in a negative +training example) and unmatched_theshold to ignore the match (generally +resulting in neither a positive or negative training example). + +This matcher is used in Fast(er)-RCNN. + +Note: matchers are used in TargetAssigners. There is a create_target_assigner +factory function for popular implementations. +""" +import tensorflow as tf + +from object_detection import matcher +from object_detection import shape_utils + + +class ArgMaxMatcher(matcher.Matcher): + """Matcher based on highest value. + + This class computes matches from a similarity matrix. Each column is matched + to a single row. + + To support object detection target assignment this class enables setting both + matched_threshold (upper threshold) and unmatched_threshold (lower thresholds) + defining three categories of similarity which define whether examples are + positive, negative, or ignored: + (1) similarity >= matched_threshold: Highest similarity. Matched/Positive! + (2) matched_threshold > similarity >= unmatched_threshold: Medium similarity. + Depending on negatives_lower_than_unmatched, this is either + Unmatched/Negative OR Ignore. + (3) unmatched_threshold > similarity: Lowest similarity. Depending on flag + negatives_lower_than_unmatched, either Unmatched/Negative OR Ignore. + For ignored matches this class sets the values in the Match object to -2. + """ + + def __init__(self, + matched_threshold, + unmatched_threshold=None, + negatives_lower_than_unmatched=True, + force_match_for_each_row=False): + """Construct ArgMaxMatcher. + + Args: + matched_threshold: Threshold for positive matches. Positive if + sim >= matched_threshold, where sim is the maximum value of the + similarity matrix for a given column. Set to None for no threshold. + unmatched_threshold: Threshold for negative matches. Negative if + sim < unmatched_threshold. Defaults to matched_threshold + when set to None. + negatives_lower_than_unmatched: Boolean which defaults to True. If True + then negative matches are the ones below the unmatched_threshold, + whereas ignored matches are in between the matched and umatched + threshold. If False, then negative matches are in between the matched + and unmatched threshold, and everything lower than unmatched is ignored. + force_match_for_each_row: If True, ensures that each row is matched to + at least one column (which is not guaranteed otherwise if the + matched_threshold is high). Defaults to False. See + argmax_matcher_test.testMatcherForceMatch() for an example. + + Raises: + ValueError: if unmatched_threshold is set but matched_threshold is not set + or if unmatched_threshold > matched_threshold. + """ + if (matched_threshold is None) and (unmatched_threshold is not None): + raise ValueError('Need to also define matched_threshold when' + 'unmatched_threshold is defined') + self._matched_threshold = matched_threshold + if unmatched_threshold is None: + self._unmatched_threshold = matched_threshold + else: + if unmatched_threshold > matched_threshold: + raise ValueError('unmatched_threshold needs to be smaller or equal' + 'to matched_threshold') + self._unmatched_threshold = unmatched_threshold + if not negatives_lower_than_unmatched: + if self._unmatched_threshold == self._matched_threshold: + raise ValueError('When negatives are in between matched and ' + 'unmatched thresholds, these cannot be of equal ' + 'value. matched: %s, unmatched: %s', + self._matched_threshold, self._unmatched_threshold) + self._force_match_for_each_row = force_match_for_each_row + self._negatives_lower_than_unmatched = negatives_lower_than_unmatched + + def _match(self, similarity_matrix): + """Tries to match each column of the similarity matrix to a row. + + Args: + similarity_matrix: tensor of shape [N, M] representing any similarity + metric. + + Returns: + Match object with corresponding matches for each of M columns. + """ + + def _match_when_rows_are_empty(): + """Performs matching when the rows of similarity matrix are empty. + + When the rows are empty, all detections are false positives. So we return + a tensor of -1's to indicate that the columns do not match to any rows. + + Returns: + matches: int32 tensor indicating the row each column matches to. + """ + similarity_matrix_shape = shape_utils.combined_static_and_dynamic_shape( + similarity_matrix) + return -1 * tf.ones([similarity_matrix_shape[1]], dtype=tf.int32) + + def _match_when_rows_are_non_empty(): + """Performs matching when the rows of similarity matrix are non empty. + + Returns: + matches: int32 tensor indicating the row each column matches to. + """ + # Matches for each column + matches = tf.argmax(similarity_matrix, 0, output_type=tf.int32) + + # Deal with matched and unmatched threshold + if self._matched_threshold is not None: + # Get logical indices of ignored and unmatched columns as tf.int64 + matched_vals = tf.reduce_max(similarity_matrix, 0) + below_unmatched_threshold = tf.greater(self._unmatched_threshold, + matched_vals) + between_thresholds = tf.logical_and( + tf.greater_equal(matched_vals, self._unmatched_threshold), + tf.greater(self._matched_threshold, matched_vals)) + + if self._negatives_lower_than_unmatched: + matches = self._set_values_using_indicator(matches, + below_unmatched_threshold, + -1) + matches = self._set_values_using_indicator(matches, + between_thresholds, + -2) + else: + matches = self._set_values_using_indicator(matches, + below_unmatched_threshold, + -2) + matches = self._set_values_using_indicator(matches, + between_thresholds, + -1) + + if self._force_match_for_each_row: + similarity_matrix_shape = shape_utils.combined_static_and_dynamic_shape( + similarity_matrix) + force_match_column_ids = tf.argmax(similarity_matrix, 1, + output_type=tf.int32) + force_match_column_indicators = tf.one_hot( + force_match_column_ids, depth=similarity_matrix_shape[1]) + force_match_row_ids = tf.argmax(force_match_column_indicators, 0, + output_type=tf.int32) + force_match_column_mask = tf.cast( + tf.reduce_max(force_match_column_indicators, 0), tf.bool) + final_matches = tf.where(force_match_column_mask, + force_match_row_ids, matches) + return final_matches + else: + return matches + + if similarity_matrix.shape.is_fully_defined(): + if similarity_matrix.shape[0].value == 0: + return _match_when_rows_are_empty() + else: + return _match_when_rows_are_non_empty() + else: + return tf.cond( + tf.greater(tf.shape(similarity_matrix)[0], 0), + _match_when_rows_are_non_empty, _match_when_rows_are_empty) + + def _set_values_using_indicator(self, x, indicator, val): + """Set the indicated fields of x to val. + + Args: + x: tensor. + indicator: boolean with same shape as x. + val: scalar with value to set. + + Returns: + modified tensor. + """ + indicator = tf.cast(indicator, x.dtype) + return tf.add(tf.multiply(x, 1 - indicator), val * indicator) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_coder.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_coder.py new file mode 100644 index 0000000..f20ac95 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_coder.py @@ -0,0 +1,151 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Base box coder. + +Box coders convert between coordinate frames, namely image-centric +(with (0,0) on the top left of image) and anchor-centric (with (0,0) being +defined by a specific anchor). + +Users of a BoxCoder can call two methods: + encode: which encodes a box with respect to a given anchor + (or rather, a tensor of boxes wrt a corresponding tensor of anchors) and + decode: which inverts this encoding with a decode operation. +In both cases, the arguments are assumed to be in 1-1 correspondence already; +it is not the job of a BoxCoder to perform matching. +""" +from abc import ABCMeta +from abc import abstractmethod +from abc import abstractproperty + +import tensorflow as tf + + +# Box coder types. +FASTER_RCNN = 'faster_rcnn' +KEYPOINT = 'keypoint' +MEAN_STDDEV = 'mean_stddev' +SQUARE = 'square' + + +class BoxCoder(object): + """Abstract base class for box coder.""" + __metaclass__ = ABCMeta + + @abstractproperty + def code_size(self): + """Return the size of each code. + + This number is a constant and should agree with the output of the `encode` + op (e.g. if rel_codes is the output of self.encode(...), then it should have + shape [N, code_size()]). This abstractproperty should be overridden by + implementations. + + Returns: + an integer constant + """ + pass + + def encode(self, boxes, anchors): + """Encode a box list relative to an anchor collection. + + Args: + boxes: BoxList holding N boxes to be encoded + anchors: BoxList of N anchors + + Returns: + a tensor representing N relative-encoded boxes + """ + with tf.name_scope('Encode'): + return self._encode(boxes, anchors) + + def decode(self, rel_codes, anchors): + """Decode boxes that are encoded relative to an anchor collection. + + Args: + rel_codes: a tensor representing N relative-encoded boxes + anchors: BoxList of anchors + + Returns: + boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., + with corners y_min, x_min, y_max, x_max) + """ + with tf.name_scope('Decode'): + return self._decode(rel_codes, anchors) + + @abstractmethod + def _encode(self, boxes, anchors): + """Method to be overriden by implementations. + + Args: + boxes: BoxList holding N boxes to be encoded + anchors: BoxList of N anchors + + Returns: + a tensor representing N relative-encoded boxes + """ + pass + + @abstractmethod + def _decode(self, rel_codes, anchors): + """Method to be overriden by implementations. + + Args: + rel_codes: a tensor representing N relative-encoded boxes + anchors: BoxList of anchors + + Returns: + boxlist: BoxList holding N boxes encoded in the ordinary way (i.e., + with corners y_min, x_min, y_max, x_max) + """ + pass + + +def batch_decode(encoded_boxes, box_coder, anchors): + """Decode a batch of encoded boxes. + + This op takes a batch of encoded bounding boxes and transforms + them to a batch of bounding boxes specified by their corners in + the order of [y_min, x_min, y_max, x_max]. + + Args: + encoded_boxes: a float32 tensor of shape [batch_size, num_anchors, + code_size] representing the location of the objects. + box_coder: a BoxCoder object. + anchors: a BoxList of anchors used to encode `encoded_boxes`. + + Returns: + decoded_boxes: a float32 tensor of shape [batch_size, num_anchors, + coder_size] representing the corners of the objects in the order + of [y_min, x_min, y_max, x_max]. + + Raises: + ValueError: if batch sizes of the inputs are inconsistent, or if + the number of anchors inferred from encoded_boxes and anchors are + inconsistent. + """ + encoded_boxes.get_shape().assert_has_rank(3) + if encoded_boxes.get_shape()[1].value != anchors.num_boxes_static(): + raise ValueError('The number of anchors inferred from encoded_boxes' + ' and anchors are inconsistent: shape[1] of encoded_boxes' + ' %s should be equal to the number of anchors: %s.' % + (encoded_boxes.get_shape()[1].value, + anchors.num_boxes_static())) + + decoded_boxes = tf.stack([ + box_coder.decode(boxes, anchors).get() + for boxes in tf.unstack(encoded_boxes) + ]) + return decoded_boxes diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_list.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_list.py new file mode 100644 index 0000000..c0196f0 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/box_list.py @@ -0,0 +1,207 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Bounding Box List definition. + +BoxList represents a list of bounding boxes as tensorflow +tensors, where each bounding box is represented as a row of 4 numbers, +[y_min, x_min, y_max, x_max]. It is assumed that all bounding boxes +within a given list correspond to a single image. See also +box_list_ops.py for common box related operations (such as area, iou, etc). + +Optionally, users can add additional related fields (such as weights). +We assume the following things to be true about fields: +* they correspond to boxes in the box_list along the 0th dimension +* they have inferrable rank at graph construction time +* all dimensions except for possibly the 0th can be inferred + (i.e., not None) at graph construction time. + +Some other notes: + * Following tensorflow conventions, we use height, width ordering, + and correspondingly, y,x (or ymin, xmin, ymax, xmax) ordering + * Tensors are always provided as (flat) [N, 4] tensors. +""" + +import tensorflow as tf + + +class BoxList(object): + """Box collection.""" + + def __init__(self, boxes): + """Constructs box collection. + + Args: + boxes: a tensor of shape [N, 4] representing box corners + + Raises: + ValueError: if invalid dimensions for bbox data or if bbox data is not in + float32 format. + """ + if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: + raise ValueError('Invalid dimensions for box data.') + if boxes.dtype != tf.float32: + raise ValueError('Invalid tensor type: should be tf.float32') + self.data = {'boxes': boxes} + + def num_boxes(self): + """Returns number of boxes held in collection. + + Returns: + a tensor representing the number of boxes held in the collection. + """ + return tf.shape(self.data['boxes'])[0] + + def num_boxes_static(self): + """Returns number of boxes held in collection. + + This number is inferred at graph construction time rather than run-time. + + Returns: + Number of boxes held in collection (integer) or None if this is not + inferrable at graph construction time. + """ + return self.data['boxes'].get_shape()[0].value + + def get_all_fields(self): + """Returns all fields.""" + return self.data.keys() + + def get_extra_fields(self): + """Returns all non-box fields (i.e., everything not named 'boxes').""" + return [k for k in self.data.keys() if k != 'boxes'] + + def add_field(self, field, field_data): + """Add field to box list. + + This method can be used to add related box data such as + weights/labels, etc. + + Args: + field: a string key to access the data via `get` + field_data: a tensor containing the data to store in the BoxList + """ + self.data[field] = field_data + + def has_field(self, field): + return field in self.data + + def get(self): + """Convenience function for accessing box coordinates. + + Returns: + a tensor with shape [N, 4] representing box coordinates. + """ + return self.get_field('boxes') + + def set(self, boxes): + """Convenience function for setting box coordinates. + + Args: + boxes: a tensor of shape [N, 4] representing box corners + + Raises: + ValueError: if invalid dimensions for bbox data + """ + if len(boxes.get_shape()) != 2 or boxes.get_shape()[-1] != 4: + raise ValueError('Invalid dimensions for box data.') + self.data['boxes'] = boxes + + def get_field(self, field): + """Accesses a box collection and associated fields. + + This function returns specified field with object; if no field is specified, + it returns the box coordinates. + + Args: + field: this optional string parameter can be used to specify + a related field to be accessed. + + Returns: + a tensor representing the box collection or an associated field. + + Raises: + ValueError: if invalid field + """ + if not self.has_field(field): + raise ValueError('field ' + str(field) + ' does not exist') + return self.data[field] + + def set_field(self, field, value): + """Sets the value of a field. + + Updates the field of a box_list with a given value. + + Args: + field: (string) name of the field to set value. + value: the value to assign to the field. + + Raises: + ValueError: if the box_list does not have specified field. + """ + if not self.has_field(field): + raise ValueError('field %s does not exist' % field) + self.data[field] = value + + def get_center_coordinates_and_sizes(self, scope=None): + """Computes the center coordinates, height and width of the boxes. + + Args: + scope: name scope of the function. + + Returns: + a list of 4 1-D tensors [ycenter, xcenter, height, width]. + """ + with tf.name_scope(scope, 'get_center_coordinates_and_sizes'): + box_corners = self.get() + ymin, xmin, ymax, xmax = tf.unstack(tf.transpose(box_corners)) + width = xmax - xmin + height = ymax - ymin + ycenter = ymin + height / 2. + xcenter = xmin + width / 2. + return [ycenter, xcenter, height, width] + + def transpose_coordinates(self, scope=None): + """Transpose the coordinate representation in a boxlist. + + Args: + scope: name scope of the function. + """ + with tf.name_scope(scope, 'transpose_coordinates'): + y_min, x_min, y_max, x_max = tf.split( + value=self.get(), num_or_size_splits=4, axis=1) + self.set(tf.concat([x_min, y_min, x_max, y_max], 1)) + + def as_tensor_dict(self, fields=None): + """Retrieves specified fields as a dictionary of tensors. + + Args: + fields: (optional) list of fields to return in the dictionary. + If None (default), all fields are returned. + + Returns: + tensor_dict: A dictionary of tensors specified by fields. + + Raises: + ValueError: if specified field is not contained in boxlist. + """ + tensor_dict = {} + if fields is None: + fields = self.get_all_fields() + for field in fields: + if not self.has_field(field): + raise ValueError('boxlist must contain all specified fields') + tensor_dict[field] = self.get_field(field) + return tensor_dict diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/faster_rcnn_box_coder.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/faster_rcnn_box_coder.py new file mode 100644 index 0000000..4527480 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/faster_rcnn_box_coder.py @@ -0,0 +1,118 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Faster RCNN box coder. + +Faster RCNN box coder follows the coding schema described below: + ty = (y - ya) / ha + tx = (x - xa) / wa + th = log(h / ha) + tw = log(w / wa) + where x, y, w, h denote the box's center coordinates, width and height + respectively. Similarly, xa, ya, wa, ha denote the anchor's center + coordinates, width and height. tx, ty, tw and th denote the anchor-encoded + center, width and height respectively. + + See http://arxiv.org/abs/1506.01497 for details. +""" + +import tensorflow as tf + +from object_detection import box_coder +from object_detection import box_list + +EPSILON = 1e-8 + + +class FasterRcnnBoxCoder(box_coder.BoxCoder): + """Faster RCNN box coder.""" + + def __init__(self, scale_factors=None): + """Constructor for FasterRcnnBoxCoder. + + Args: + scale_factors: List of 4 positive scalars to scale ty, tx, th and tw. + If set to None, does not perform scaling. For Faster RCNN, + the open-source implementation recommends using [10.0, 10.0, 5.0, 5.0]. + """ + if scale_factors: + assert len(scale_factors) == 4 + for scalar in scale_factors: + assert scalar > 0 + self._scale_factors = scale_factors + + @property + def code_size(self): + return 4 + + def _encode(self, boxes, anchors): + """Encode a box collection with respect to anchor collection. + + Args: + boxes: BoxList holding N boxes to be encoded. + anchors: BoxList of anchors. + + Returns: + a tensor representing N anchor-encoded boxes of the format + [ty, tx, th, tw]. + """ + # Convert anchors to the center coordinate representation. + ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() + ycenter, xcenter, h, w = boxes.get_center_coordinates_and_sizes() + # Avoid NaN in division and log below. + ha += EPSILON + wa += EPSILON + h += EPSILON + w += EPSILON + + tx = (xcenter - xcenter_a) / wa + ty = (ycenter - ycenter_a) / ha + tw = tf.log(w / wa) + th = tf.log(h / ha) + # Scales location targets as used in paper for joint training. + if self._scale_factors: + ty *= self._scale_factors[0] + tx *= self._scale_factors[1] + th *= self._scale_factors[2] + tw *= self._scale_factors[3] + return tf.transpose(tf.stack([ty, tx, th, tw])) + + def _decode(self, rel_codes, anchors): + """Decode relative codes to boxes. + + Args: + rel_codes: a tensor representing N anchor-encoded boxes. + anchors: BoxList of anchors. + + Returns: + boxes: BoxList holding N bounding boxes. + """ + ycenter_a, xcenter_a, ha, wa = anchors.get_center_coordinates_and_sizes() + + ty, tx, th, tw = tf.unstack(tf.transpose(rel_codes)) + if self._scale_factors: + ty /= self._scale_factors[0] + tx /= self._scale_factors[1] + th /= self._scale_factors[2] + tw /= self._scale_factors[3] + w = tf.exp(tw) * wa + h = tf.exp(th) * ha + ycenter = ty * ha + ycenter_a + xcenter = tx * wa + xcenter_a + ymin = ycenter - h / 2. + xmin = xcenter - w / 2. + ymax = ycenter + h / 2. + xmax = xcenter + w / 2. + return box_list.BoxList(tf.transpose(tf.stack([ymin, xmin, ymax, xmax]))) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/matcher.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/matcher.py new file mode 100644 index 0000000..ddded89 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/matcher.py @@ -0,0 +1,241 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Matcher interface and Match class. + +This module defines the Matcher interface and the Match object. The job of the +matcher is to match row and column indices based on the similarity matrix and +other optional parameters. Each column is matched to at most one row. There +are three possibilities for the matching: + +1) match: A column matches a row. +2) no_match: A column does not match any row. +3) ignore: A column that is neither 'match' nor no_match. + +The ignore case is regularly encountered in object detection: when an anchor has +a relatively small overlap with a ground-truth box, one neither wants to +consider this box a positive example (match) nor a negative example (no match). + +The Match class is used to store the match results and it provides simple apis +to query the results. +""" +from abc import ABCMeta +from abc import abstractmethod + +import tensorflow as tf + + +class Match(object): + """Class to store results from the matcher. + + This class is used to store the results from the matcher. It provides + convenient methods to query the matching results. + """ + + def __init__(self, match_results): + """Constructs a Match object. + + Args: + match_results: Integer tensor of shape [N] with (1) match_results[i]>=0, + meaning that column i is matched with row match_results[i]. + (2) match_results[i]=-1, meaning that column i is not matched. + (3) match_results[i]=-2, meaning that column i is ignored. + + Raises: + ValueError: if match_results does not have rank 1 or is not an + integer int32 scalar tensor + """ + if match_results.shape.ndims != 1: + raise ValueError('match_results should have rank 1') + if match_results.dtype != tf.int32: + raise ValueError('match_results should be an int32 or int64 scalar ' + 'tensor') + self._match_results = match_results + + @property + def match_results(self): + """The accessor for match results. + + Returns: + the tensor which encodes the match results. + """ + return self._match_results + + def matched_column_indices(self): + """Returns column indices that match to some row. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.greater(self._match_results, -1))) + + def matched_column_indicator(self): + """Returns column indices that are matched. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return tf.greater_equal(self._match_results, 0) + + def num_matched_columns(self): + """Returns number (int32 scalar tensor) of matched columns.""" + return tf.size(self.matched_column_indices()) + + def unmatched_column_indices(self): + """Returns column indices that do not match any row. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.equal(self._match_results, -1))) + + def unmatched_column_indicator(self): + """Returns column indices that are unmatched. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return tf.equal(self._match_results, -1) + + def num_unmatched_columns(self): + """Returns number (int32 scalar tensor) of unmatched columns.""" + return tf.size(self.unmatched_column_indices()) + + def ignored_column_indices(self): + """Returns column indices that are ignored (neither Matched nor Unmatched). + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(self.ignored_column_indicator())) + + def ignored_column_indicator(self): + """Returns boolean column indicator where True means the colum is ignored. + + Returns: + column_indicator: boolean vector which is True for all ignored column + indices. + """ + return tf.equal(self._match_results, -2) + + def num_ignored_columns(self): + """Returns number (int32 scalar tensor) of matched columns.""" + return tf.size(self.ignored_column_indices()) + + def unmatched_or_ignored_column_indices(self): + """Returns column indices that are unmatched or ignored. + + The indices returned by this op are always sorted in increasing order. + + Returns: + column_indices: int32 tensor of shape [K] with column indices. + """ + return self._reshape_and_cast(tf.where(tf.greater(0, self._match_results))) + + def matched_row_indices(self): + """Returns row indices that match some column. + + The indices returned by this op are ordered so as to be in correspondence + with the output of matched_column_indicator(). For example if + self.matched_column_indicator() is [0,2], and self.matched_row_indices() is + [7, 3], then we know that column 0 was matched to row 7 and column 2 was + matched to row 3. + + Returns: + row_indices: int32 tensor of shape [K] with row indices. + """ + return self._reshape_and_cast( + tf.gather(self._match_results, self.matched_column_indices())) + + def _reshape_and_cast(self, t): + return tf.cast(tf.reshape(t, [-1]), tf.int32) + + def gather_based_on_match(self, input_tensor, unmatched_value, + ignored_value): + """Gathers elements from `input_tensor` based on match results. + + For columns that are matched to a row, gathered_tensor[col] is set to + input_tensor[match_results[col]]. For columns that are unmatched, + gathered_tensor[col] is set to unmatched_value. Finally, for columns that + are ignored gathered_tensor[col] is set to ignored_value. + + Note that the input_tensor.shape[1:] must match with unmatched_value.shape + and ignored_value.shape + + Args: + input_tensor: Tensor to gather values from. + unmatched_value: Constant tensor value for unmatched columns. + ignored_value: Constant tensor value for ignored columns. + + Returns: + gathered_tensor: A tensor containing values gathered from input_tensor. + The shape of the gathered tensor is [match_results.shape[0]] + + input_tensor.shape[1:]. + """ + input_tensor = tf.concat([tf.stack([ignored_value, unmatched_value]), + input_tensor], axis=0) + gather_indices = tf.maximum(self.match_results + 2, 0) + gathered_tensor = tf.gather(input_tensor, gather_indices) + return gathered_tensor + + +class Matcher(object): + """Abstract base class for matcher. + """ + __metaclass__ = ABCMeta + + def match(self, similarity_matrix, scope=None, **params): + """Computes matches among row and column indices and returns the result. + + Computes matches among the row and column indices based on the similarity + matrix and optional arguments. + + Args: + similarity_matrix: Float tensor of shape [N, M] with pairwise similarity + where higher value means more similar. + scope: Op scope name. Defaults to 'Match' if None. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + A Match object with the results of matching. + """ + with tf.name_scope(scope, 'Match', [similarity_matrix, params]) as scope: + return Match(self._match(similarity_matrix, **params)) + + @abstractmethod + def _match(self, similarity_matrix, **params): + """Method to be overridden by implementations. + + Args: + similarity_matrix: Float tensor of shape [N, M] with pairwise similarity + where higher value means more similar. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + match_results: Integer tensor of shape [M]: match_results[i]>=0 means + that column i is matched to row match_results[i], match_results[i]=-1 + means that the column is not matched. match_results[i]=-2 means that + the column is ignored (usually this happens when there is a very weak + match which one neither wants as positive nor negative example). + """ + pass diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/preprocessor.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/preprocessor.py new file mode 100644 index 0000000..b98c591 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/preprocessor.py @@ -0,0 +1,442 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Preprocess images and bounding boxes for detection. + +We perform two sets of operations in preprocessing stage: +(a) operations that are applied to both training and testing data, +(b) operations that are applied only to training data for the purpose of + data augmentation. + +A preprocessing function receives a set of inputs, +e.g. an image and bounding boxes, +performs an operation on them, and returns them. +Some examples are: randomly cropping the image, randomly mirroring the image, + randomly changing the brightness, contrast, hue and + randomly jittering the bounding boxes. + +The image is a rank 4 tensor: [1, height, width, channels] with +dtype=tf.float32. The groundtruth_boxes is a rank 2 tensor: [N, 4] where +in each row there is a box with [ymin xmin ymax xmax]. +Boxes are in normalized coordinates meaning +their coordinate values range in [0, 1] + +Important Note: In tensor_dict, images is a rank 4 tensor, but preprocessing +functions receive a rank 3 tensor for processing the image. Thus, inside the +preprocess function we squeeze the image to become a rank 3 tensor and then +we pass it to the functions. At the end of the preprocess we expand the image +back to rank 4. +""" + +import tensorflow as tf + +from object_detection import box_list + + +def _flip_boxes_left_right(boxes): + """Left-right flip the boxes. + + Args: + boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + Each row is in the form of [ymin, xmin, ymax, xmax]. + + Returns: + Flipped boxes. + """ + ymin, xmin, ymax, xmax = tf.split(value=boxes, num_or_size_splits=4, axis=1) + flipped_xmin = tf.subtract(1.0, xmax) + flipped_xmax = tf.subtract(1.0, xmin) + flipped_boxes = tf.concat([ymin, flipped_xmin, ymax, flipped_xmax], 1) + return flipped_boxes + + +def _flip_masks_left_right(masks): + """Left-right flip masks. + + Args: + masks: rank 3 float32 tensor with shape + [num_instances, height, width] representing instance masks. + + Returns: + flipped masks: rank 3 float32 tensor with shape + [num_instances, height, width] representing instance masks. + """ + return masks[:, :, ::-1] + + +def keypoint_flip_horizontal(keypoints, flip_point, flip_permutation, + scope=None): + """Flips the keypoints horizontally around the flip_point. + + This operation flips the x coordinate for each keypoint around the flip_point + and also permutes the keypoints in a manner specified by flip_permutation. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + flip_point: (float) scalar tensor representing the x coordinate to flip the + keypoints around. + flip_permutation: rank 1 int32 tensor containing the keypoint flip + permutation. This specifies the mapping from original keypoint indices + to the flipped keypoint indices. This is used primarily for keypoints + that are not reflection invariant. E.g. Suppose there are 3 keypoints + representing ['head', 'right_eye', 'left_eye'], then a logical choice for + flip_permutation might be [0, 2, 1] since we want to swap the 'left_eye' + and 'right_eye' after a horizontal flip. + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + with tf.name_scope(scope, 'FlipHorizontal'): + keypoints = tf.transpose(keypoints, [1, 0, 2]) + keypoints = tf.gather(keypoints, flip_permutation) + v, u = tf.split(value=keypoints, num_or_size_splits=2, axis=2) + u = flip_point * 2.0 - u + new_keypoints = tf.concat([v, u], 2) + new_keypoints = tf.transpose(new_keypoints, [1, 0, 2]) + return new_keypoints + + +def random_horizontal_flip(image, + boxes=None, + masks=None, + keypoints=None, + keypoint_flip_permutation=None, + seed=None): + """Randomly flips the image and detections horizontally. + + The probability of flipping the image is 50%. + + Args: + image: rank 3 float32 tensor with shape [height, width, channels]. + boxes: (optional) rank 2 float32 tensor with shape [N, 4] + containing the bounding boxes. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + Each row is in the form of [ymin, xmin, ymax, xmax]. + masks: (optional) rank 3 float32 tensor with shape + [num_instances, height, width] containing instance masks. The masks + are of the same height, width as the input `image`. + keypoints: (optional) rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2]. The keypoints are in y-x + normalized coordinates. + keypoint_flip_permutation: rank 1 int32 tensor containing the keypoint flip + permutation. + seed: random seed + + Returns: + image: image which is the same shape as input image. + + If boxes, masks, keypoints, and keypoint_flip_permutation are not None, + the function also returns the following tensors. + + boxes: rank 2 float32 tensor containing the bounding boxes -> [N, 4]. + Boxes are in normalized form meaning their coordinates vary + between [0, 1]. + masks: rank 3 float32 tensor with shape [num_instances, height, width] + containing instance masks. + keypoints: rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2] + + Raises: + ValueError: if keypoints are provided but keypoint_flip_permutation is not. + """ + + def _flip_image(image): + # flip image + image_flipped = tf.image.flip_left_right(image) + return image_flipped + + if keypoints is not None and keypoint_flip_permutation is None: + raise ValueError( + 'keypoints are provided but keypoints_flip_permutation is not provided') + + with tf.name_scope('RandomHorizontalFlip', values=[image, boxes]): + result = [] + # random variable defining whether to do flip or not + do_a_flip_random = tf.greater(tf.random_uniform([], seed=seed), 0.5) + + # flip image + image = tf.cond(do_a_flip_random, lambda: _flip_image(image), lambda: image) + result.append(image) + + # flip boxes + if boxes is not None: + boxes = tf.cond(do_a_flip_random, lambda: _flip_boxes_left_right(boxes), + lambda: boxes) + result.append(boxes) + + # flip masks + if masks is not None: + masks = tf.cond(do_a_flip_random, lambda: _flip_masks_left_right(masks), + lambda: masks) + result.append(masks) + + # flip keypoints + if keypoints is not None and keypoint_flip_permutation is not None: + permutation = keypoint_flip_permutation + keypoints = tf.cond( + do_a_flip_random, + lambda: keypoint_flip_horizontal(keypoints, 0.5, permutation), + lambda: keypoints) + result.append(keypoints) + + return tuple(result) + + +def _compute_new_static_size(image, min_dimension, max_dimension): + """Compute new static shape for resize_to_range method.""" + image_shape = image.get_shape().as_list() + orig_height = image_shape[0] + orig_width = image_shape[1] + num_channels = image_shape[2] + orig_min_dim = min(orig_height, orig_width) + # Calculates the larger of the possible sizes + large_scale_factor = min_dimension / float(orig_min_dim) + # Scaling orig_(height|width) by large_scale_factor will make the smaller + # dimension equal to min_dimension, save for floating point rounding errors. + # For reasonably-sized images, taking the nearest integer will reliably + # eliminate this error. + large_height = int(round(orig_height * large_scale_factor)) + large_width = int(round(orig_width * large_scale_factor)) + large_size = [large_height, large_width] + if max_dimension: + # Calculates the smaller of the possible sizes, use that if the larger + # is too big. + orig_max_dim = max(orig_height, orig_width) + small_scale_factor = max_dimension / float(orig_max_dim) + # Scaling orig_(height|width) by small_scale_factor will make the larger + # dimension equal to max_dimension, save for floating point rounding + # errors. For reasonably-sized images, taking the nearest integer will + # reliably eliminate this error. + small_height = int(round(orig_height * small_scale_factor)) + small_width = int(round(orig_width * small_scale_factor)) + small_size = [small_height, small_width] + new_size = large_size + if max(large_size) > max_dimension: + new_size = small_size + else: + new_size = large_size + return tf.constant(new_size + [num_channels]) + + +def _compute_new_dynamic_size(image, min_dimension, max_dimension): + """Compute new dynamic shape for resize_to_range method.""" + image_shape = tf.shape(image) + orig_height = tf.to_float(image_shape[0]) + orig_width = tf.to_float(image_shape[1]) + num_channels = image_shape[2] + orig_min_dim = tf.minimum(orig_height, orig_width) + # Calculates the larger of the possible sizes + min_dimension = tf.constant(min_dimension, dtype=tf.float32) + large_scale_factor = min_dimension / orig_min_dim + # Scaling orig_(height|width) by large_scale_factor will make the smaller + # dimension equal to min_dimension, save for floating point rounding errors. + # For reasonably-sized images, taking the nearest integer will reliably + # eliminate this error. + large_height = tf.to_int32(tf.round(orig_height * large_scale_factor)) + large_width = tf.to_int32(tf.round(orig_width * large_scale_factor)) + large_size = tf.stack([large_height, large_width]) + if max_dimension: + # Calculates the smaller of the possible sizes, use that if the larger + # is too big. + orig_max_dim = tf.maximum(orig_height, orig_width) + max_dimension = tf.constant(max_dimension, dtype=tf.float32) + small_scale_factor = max_dimension / orig_max_dim + # Scaling orig_(height|width) by small_scale_factor will make the larger + # dimension equal to max_dimension, save for floating point rounding + # errors. For reasonably-sized images, taking the nearest integer will + # reliably eliminate this error. + small_height = tf.to_int32(tf.round(orig_height * small_scale_factor)) + small_width = tf.to_int32(tf.round(orig_width * small_scale_factor)) + small_size = tf.stack([small_height, small_width]) + new_size = tf.cond( + tf.to_float(tf.reduce_max(large_size)) > max_dimension, + lambda: small_size, lambda: large_size) + else: + new_size = large_size + return tf.stack(tf.unstack(new_size) + [num_channels]) + + +def resize_to_range(image, + masks=None, + min_dimension=None, + max_dimension=None, + method=tf.image.ResizeMethod.BILINEAR, + align_corners=False, + pad_to_max_dimension=False): + """Resizes an image so its dimensions are within the provided value. + + The output size can be described by two cases: + 1. If the image can be rescaled so its minimum dimension is equal to the + provided value without the other dimension exceeding max_dimension, + then do so. + 2. Otherwise, resize so the largest dimension is equal to max_dimension. + + Args: + image: A 3D tensor of shape [height, width, channels] + masks: (optional) rank 3 float32 tensor with shape + [num_instances, height, width] containing instance masks. + min_dimension: (optional) (scalar) desired size of the smaller image + dimension. + max_dimension: (optional) (scalar) maximum allowed size + of the larger image dimension. + method: (optional) interpolation method used in resizing. Defaults to + BILINEAR. + align_corners: bool. If true, exactly align all 4 corners of the input + and output. Defaults to False. + pad_to_max_dimension: Whether to resize the image and pad it with zeros + so the resulting image is of the spatial size + [max_dimension, max_dimension]. If masks are included they are padded + similarly. + + Returns: + Note that the position of the resized_image_shape changes based on whether + masks are present. + resized_image: A 3D tensor of shape [new_height, new_width, channels], + where the image has been resized (with bilinear interpolation) so that + min(new_height, new_width) == min_dimension or + max(new_height, new_width) == max_dimension. + resized_masks: If masks is not None, also outputs masks. A 3D tensor of + shape [num_instances, new_height, new_width]. + resized_image_shape: A 1D tensor of shape [3] containing shape of the + resized image. + + Raises: + ValueError: if the image is not a 3D tensor. + """ + if len(image.get_shape()) != 3: + raise ValueError('Image should be 3D tensor') + + with tf.name_scope('ResizeToRange', values=[image, min_dimension]): + if image.get_shape().is_fully_defined(): + new_size = _compute_new_static_size(image, min_dimension, max_dimension) + else: + new_size = _compute_new_dynamic_size(image, min_dimension, max_dimension) + new_image = tf.image.resize_images( + image, new_size[:-1], method=method, align_corners=align_corners) + + if pad_to_max_dimension: + new_image = tf.image.pad_to_bounding_box( + new_image, 0, 0, max_dimension, max_dimension) + + result = [new_image] + if masks is not None: + new_masks = tf.expand_dims(masks, 3) + new_masks = tf.image.resize_images( + new_masks, + new_size[:-1], + method=tf.image.ResizeMethod.NEAREST_NEIGHBOR, + align_corners=align_corners) + new_masks = tf.squeeze(new_masks, 3) + if pad_to_max_dimension: + new_masks = tf.image.pad_to_bounding_box( + new_masks, 0, 0, max_dimension, max_dimension) + result.append(new_masks) + + result.append(new_size) + return result + + +def _copy_extra_fields(boxlist_to_copy_to, boxlist_to_copy_from): + """Copies the extra fields of boxlist_to_copy_from to boxlist_to_copy_to. + + Args: + boxlist_to_copy_to: BoxList to which extra fields are copied. + boxlist_to_copy_from: BoxList from which fields are copied. + + Returns: + boxlist_to_copy_to with extra fields. + """ + for field in boxlist_to_copy_from.get_extra_fields(): + boxlist_to_copy_to.add_field(field, boxlist_to_copy_from.get_field(field)) + return boxlist_to_copy_to + + +def box_list_scale(boxlist, y_scale, x_scale, scope=None): + """scale box coordinates in x and y dimensions. + + Args: + boxlist: BoxList holding N boxes + y_scale: (float) scalar tensor + x_scale: (float) scalar tensor + scope: name scope. + + Returns: + boxlist: BoxList holding N boxes + """ + with tf.name_scope(scope, 'Scale'): + y_scale = tf.cast(y_scale, tf.float32) + x_scale = tf.cast(x_scale, tf.float32) + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + y_min = y_scale * y_min + y_max = y_scale * y_max + x_min = x_scale * x_min + x_max = x_scale * x_max + scaled_boxlist = box_list.BoxList( + tf.concat([y_min, x_min, y_max, x_max], 1)) + return _copy_extra_fields(scaled_boxlist, boxlist) + + +def keypoint_scale(keypoints, y_scale, x_scale, scope=None): + """Scales keypoint coordinates in x and y dimensions. + + Args: + keypoints: a tensor of shape [num_instances, num_keypoints, 2] + y_scale: (float) scalar tensor + x_scale: (float) scalar tensor + scope: name scope. + + Returns: + new_keypoints: a tensor of shape [num_instances, num_keypoints, 2] + """ + with tf.name_scope(scope, 'Scale'): + y_scale = tf.cast(y_scale, tf.float32) + x_scale = tf.cast(x_scale, tf.float32) + new_keypoints = keypoints * [[[y_scale, x_scale]]] + return new_keypoints + + +def scale_boxes_to_pixel_coordinates(image, boxes, keypoints=None): + """Scales boxes from normalized to pixel coordinates. + + Args: + image: A 3D float32 tensor of shape [height, width, channels]. + boxes: A 2D float32 tensor of shape [num_boxes, 4] containing the bounding + boxes in normalized coordinates. Each row is of the form + [ymin, xmin, ymax, xmax]. + keypoints: (optional) rank 3 float32 tensor with shape + [num_instances, num_keypoints, 2]. The keypoints are in y-x normalized + coordinates. + + Returns: + image: unchanged input image. + scaled_boxes: a 2D float32 tensor of shape [num_boxes, 4] containing the + bounding boxes in pixel coordinates. + scaled_keypoints: a 3D float32 tensor with shape + [num_instances, num_keypoints, 2] containing the keypoints in pixel + coordinates. + """ + boxlist = box_list.BoxList(boxes) + image_height = tf.shape(image)[0] + image_width = tf.shape(image)[1] + scaled_boxes = box_list_scale(boxlist, image_height, image_width).get() + result = [image, scaled_boxes] + if keypoints is not None: + scaled_keypoints = keypoint_scale(keypoints, image_height, image_width) + result.append(scaled_keypoints) + return tuple(result) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/region_similarity_calculator.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/region_similarity_calculator.py new file mode 100644 index 0000000..9346a61 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/region_similarity_calculator.py @@ -0,0 +1,135 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Region Similarity Calculators for BoxLists. + +Region Similarity Calculators compare a pairwise measure of similarity +between the boxes in two BoxLists. +""" +from abc import ABCMeta +from abc import abstractmethod + +import tensorflow as tf + + +def area(boxlist, scope=None): + """Computes area of boxes. + + Args: + boxlist: BoxList holding N boxes + scope: name scope. + + Returns: + a tensor with shape [N] representing box areas. + """ + with tf.name_scope(scope, 'Area'): + y_min, x_min, y_max, x_max = tf.split( + value=boxlist.get(), num_or_size_splits=4, axis=1) + return tf.squeeze((y_max - y_min) * (x_max - x_min), [1]) + + +def intersection(boxlist1, boxlist2, scope=None): + """Compute pairwise intersection areas between boxes. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise intersections + """ + with tf.name_scope(scope, 'Intersection'): + y_min1, x_min1, y_max1, x_max1 = tf.split( + value=boxlist1.get(), num_or_size_splits=4, axis=1) + y_min2, x_min2, y_max2, x_max2 = tf.split( + value=boxlist2.get(), num_or_size_splits=4, axis=1) + all_pairs_min_ymax = tf.minimum(y_max1, tf.transpose(y_max2)) + all_pairs_max_ymin = tf.maximum(y_min1, tf.transpose(y_min2)) + intersect_heights = tf.maximum(0.0, all_pairs_min_ymax - all_pairs_max_ymin) + all_pairs_min_xmax = tf.minimum(x_max1, tf.transpose(x_max2)) + all_pairs_max_xmin = tf.maximum(x_min1, tf.transpose(x_min2)) + intersect_widths = tf.maximum(0.0, all_pairs_min_xmax - all_pairs_max_xmin) + return intersect_heights * intersect_widths + + +def iou(boxlist1, boxlist2, scope=None): + """Computes pairwise intersection-over-union between box collections. + + Args: + boxlist1: BoxList holding N boxes + boxlist2: BoxList holding M boxes + scope: name scope. + + Returns: + a tensor with shape [N, M] representing pairwise iou scores. + """ + with tf.name_scope(scope, 'IOU'): + intersections = intersection(boxlist1, boxlist2) + areas1 = area(boxlist1) + areas2 = area(boxlist2) + unions = ( + tf.expand_dims(areas1, 1) + tf.expand_dims(areas2, 0) - intersections) + return tf.where( + tf.equal(intersections, 0.0), + tf.zeros_like(intersections), tf.truediv(intersections, unions)) + + +class RegionSimilarityCalculator(object): + """Abstract base class for region similarity calculator.""" + __metaclass__ = ABCMeta + + def compare(self, boxlist1, boxlist2, scope=None): + """Computes matrix of pairwise similarity between BoxLists. + + This op (to be overriden) computes a measure of pairwise similarity between + the boxes in the given BoxLists. Higher values indicate more similarity. + + Note that this method simply measures similarity and does not explicitly + perform a matching. + + Args: + boxlist1: BoxList holding N boxes. + boxlist2: BoxList holding M boxes. + scope: Op scope name. Defaults to 'Compare' if None. + + Returns: + a (float32) tensor of shape [N, M] with pairwise similarity score. + """ + with tf.name_scope(scope, 'Compare', [boxlist1, boxlist2]) as scope: + return self._compare(boxlist1, boxlist2) + + @abstractmethod + def _compare(self, boxlist1, boxlist2): + pass + + +class IouSimilarity(RegionSimilarityCalculator): + """Class to compute similarity based on Intersection over Union (IOU) metric. + + This class computes pairwise similarity between two BoxLists based on IOU. + """ + + def _compare(self, boxlist1, boxlist2): + """Compute pairwise IOU similarity between the two BoxLists. + + Args: + boxlist1: BoxList holding N boxes. + boxlist2: BoxList holding M boxes. + + Returns: + A tensor with shape [N, M] representing pairwise iou scores. + """ + return iou(boxlist1, boxlist2) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/shape_utils.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/shape_utils.py new file mode 100644 index 0000000..6fda6c3 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/shape_utils.py @@ -0,0 +1,70 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Utils used to manipulate tensor shapes.""" + +import tensorflow as tf + + +def assert_shape_equal(shape_a, shape_b): + """Asserts that shape_a and shape_b are equal. + + If the shapes are static, raises a ValueError when the shapes + mismatch. + + If the shapes are dynamic, raises a tf InvalidArgumentError when the shapes + mismatch. + + Args: + shape_a: a list containing shape of the first tensor. + shape_b: a list containing shape of the second tensor. + + Returns: + Either a tf.no_op() when shapes are all static and a tf.assert_equal() op + when the shapes are dynamic. + + Raises: + ValueError: When shapes are both static and unequal. + """ + if (all(isinstance(dim, int) for dim in shape_a) and + all(isinstance(dim, int) for dim in shape_b)): + if shape_a != shape_b: + raise ValueError('Unequal shapes {}, {}'.format(shape_a, shape_b)) + else: return tf.no_op() + else: + return tf.assert_equal(shape_a, shape_b) + + +def combined_static_and_dynamic_shape(tensor): + """Returns a list containing static and dynamic values for the dimensions. + + Returns a list of static and dynamic values for shape dimensions. This is + useful to preserve static shapes when available in reshape operation. + + Args: + tensor: A tensor of any type. + + Returns: + A list of size tensor.shape.ndims containing integers or a scalar tensor. + """ + static_tensor_shape = tensor.shape.as_list() + dynamic_tensor_shape = tf.shape(tensor) + combined_shape = [] + for index, dim in enumerate(static_tensor_shape): + if dim is not None: + combined_shape.append(dim) + else: + combined_shape.append(dynamic_tensor_shape[index]) + return combined_shape diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/target_assigner.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/target_assigner.py new file mode 100644 index 0000000..cb3cc12 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/target_assigner.py @@ -0,0 +1,310 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Base target assigner module. + +The job of a TargetAssigner is, for a given set of anchors (bounding boxes) and +groundtruth detections (bounding boxes), to assign classification and regression +targets to each anchor as well as weights to each anchor (specifying, e.g., +which anchors should not contribute to training loss). + +It assigns classification/regression targets by performing the following steps: +1) Computing pairwise similarity between anchors and groundtruth boxes using a + provided RegionSimilarity Calculator +2) Computing a matching based on the similarity matrix using a provided Matcher +3) Assigning regression targets based on the matching and a provided BoxCoder +4) Assigning classification targets based on the matching and groundtruth labels + +Note that TargetAssigners only operate on detections from a single +image at a time, so any logic for applying a TargetAssigner to multiple +images must be handled externally. +""" +import tensorflow as tf + +from object_detection import box_list +from object_detection import shape_utils + + +KEYPOINTS_FIELD_NAME = 'keypoints' + + +class TargetAssigner(object): + """Target assigner to compute classification and regression targets.""" + + def __init__(self, similarity_calc, matcher, box_coder, + negative_class_weight=1.0, unmatched_cls_target=None): + """Construct Object Detection Target Assigner. + + Args: + similarity_calc: a RegionSimilarityCalculator + matcher: Matcher used to match groundtruth to anchors. + box_coder: BoxCoder used to encode matching groundtruth boxes with + respect to anchors. + negative_class_weight: classification weight to be associated to negative + anchors (default: 1.0). The weight must be in [0., 1.]. + unmatched_cls_target: a float32 tensor with shape [d_1, d_2, ..., d_k] + which is consistent with the classification target for each + anchor (and can be empty for scalar targets). This shape must thus be + compatible with the groundtruth labels that are passed to the "assign" + function (which have shape [num_gt_boxes, d_1, d_2, ..., d_k]). + If set to None, unmatched_cls_target is set to be [0] for each anchor. + + Raises: + ValueError: if similarity_calc is not a RegionSimilarityCalculator or + if matcher is not a Matcher or if box_coder is not a BoxCoder + """ + self._similarity_calc = similarity_calc + self._matcher = matcher + self._box_coder = box_coder + self._negative_class_weight = negative_class_weight + if unmatched_cls_target is None: + self._unmatched_cls_target = tf.constant([0], tf.float32) + else: + self._unmatched_cls_target = unmatched_cls_target + + @property + def box_coder(self): + return self._box_coder + + def assign(self, anchors, groundtruth_boxes, groundtruth_labels=None, + groundtruth_weights=None, **params): + """Assign classification and regression targets to each anchor. + + For a given set of anchors and groundtruth detections, match anchors + to groundtruth_boxes and assign classification and regression targets to + each anchor as well as weights based on the resulting match (specifying, + e.g., which anchors should not contribute to training loss). + + Anchors that are not matched to anything are given a classification target + of self._unmatched_cls_target which can be specified via the constructor. + + Args: + anchors: a BoxList representing N anchors + groundtruth_boxes: a BoxList representing M groundtruth boxes + groundtruth_labels: a tensor of shape [M, d_1, ... d_k] + with labels for each of the ground_truth boxes. The subshape + [d_1, ... d_k] can be empty (corresponding to scalar inputs). When set + to None, groundtruth_labels assumes a binary problem where all + ground_truth boxes get a positive label (of 1). + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. The weights + must be in [0., 1.]. If None, all weights are set to 1. + **params: Additional keyword arguments for specific implementations of + the Matcher. + + Returns: + cls_targets: a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], + where the subshape [d_1, ..., d_k] is compatible with groundtruth_labels + which has shape [num_gt_boxes, d_1, d_2, ... d_k]. + cls_weights: a float32 tensor with shape [num_anchors] + reg_targets: a float32 tensor with shape [num_anchors, box_code_dimension] + reg_weights: a float32 tensor with shape [num_anchors] + match: a matcher.Match object encoding the match between anchors and + groundtruth boxes, with rows corresponding to groundtruth boxes + and columns corresponding to anchors. + + Raises: + ValueError: if anchors or groundtruth_boxes are not of type + box_list.BoxList + """ + if not isinstance(anchors, box_list.BoxList): + raise ValueError('anchors must be an BoxList') + if not isinstance(groundtruth_boxes, box_list.BoxList): + raise ValueError('groundtruth_boxes must be an BoxList') + + if groundtruth_labels is None: + groundtruth_labels = tf.ones(tf.expand_dims(groundtruth_boxes.num_boxes(), + 0)) + groundtruth_labels = tf.expand_dims(groundtruth_labels, -1) + unmatched_shape_assert = shape_utils.assert_shape_equal( + shape_utils.combined_static_and_dynamic_shape(groundtruth_labels)[1:], + shape_utils.combined_static_and_dynamic_shape( + self._unmatched_cls_target)) + labels_and_box_shapes_assert = shape_utils.assert_shape_equal( + shape_utils.combined_static_and_dynamic_shape( + groundtruth_labels)[:1], + shape_utils.combined_static_and_dynamic_shape( + groundtruth_boxes.get())[:1]) + + if groundtruth_weights is None: + num_gt_boxes = groundtruth_boxes.num_boxes_static() + if not num_gt_boxes: + num_gt_boxes = groundtruth_boxes.num_boxes() + groundtruth_weights = tf.ones([num_gt_boxes], dtype=tf.float32) + with tf.control_dependencies( + [unmatched_shape_assert, labels_and_box_shapes_assert]): + match_quality_matrix = self._similarity_calc.compare(groundtruth_boxes, + anchors) + match = self._matcher.match(match_quality_matrix, **params) + reg_targets = self._create_regression_targets(anchors, + groundtruth_boxes, + match) + cls_targets = self._create_classification_targets(groundtruth_labels, + match) + reg_weights = self._create_regression_weights(match, groundtruth_weights) + cls_weights = self._create_classification_weights(match, + groundtruth_weights) + + num_anchors = anchors.num_boxes_static() + if num_anchors is not None: + reg_targets = self._reset_target_shape(reg_targets, num_anchors) + cls_targets = self._reset_target_shape(cls_targets, num_anchors) + reg_weights = self._reset_target_shape(reg_weights, num_anchors) + cls_weights = self._reset_target_shape(cls_weights, num_anchors) + + return cls_targets, cls_weights, reg_targets, reg_weights, match + + def _reset_target_shape(self, target, num_anchors): + """Sets the static shape of the target. + + Args: + target: the target tensor. Its first dimension will be overwritten. + num_anchors: the number of anchors, which is used to override the target's + first dimension. + + Returns: + A tensor with the shape info filled in. + """ + target_shape = target.get_shape().as_list() + target_shape[0] = num_anchors + target.set_shape(target_shape) + return target + + def _create_regression_targets(self, anchors, groundtruth_boxes, match): + """Returns a regression target for each anchor. + + Args: + anchors: a BoxList representing N anchors + groundtruth_boxes: a BoxList representing M groundtruth_boxes + match: a matcher.Match object + + Returns: + reg_targets: a float32 tensor with shape [N, box_code_dimension] + """ + matched_gt_boxes = match.gather_based_on_match( + groundtruth_boxes.get(), + unmatched_value=tf.zeros(4), + ignored_value=tf.zeros(4)) + matched_gt_boxlist = box_list.BoxList(matched_gt_boxes) + if groundtruth_boxes.has_field(KEYPOINTS_FIELD_NAME): + groundtruth_keypoints = groundtruth_boxes.get_field(KEYPOINTS_FIELD_NAME) + matched_keypoints = match.gather_based_on_match( + groundtruth_keypoints, + unmatched_value=tf.zeros(groundtruth_keypoints.get_shape()[1:]), + ignored_value=tf.zeros(groundtruth_keypoints.get_shape()[1:])) + matched_gt_boxlist.add_field(KEYPOINTS_FIELD_NAME, matched_keypoints) + matched_reg_targets = self._box_coder.encode(matched_gt_boxlist, anchors) + match_results_shape = shape_utils.combined_static_and_dynamic_shape( + match.match_results) + + # Zero out the unmatched and ignored regression targets. + unmatched_ignored_reg_targets = tf.tile( + self._default_regression_target(), [match_results_shape[0], 1]) + matched_anchors_mask = match.matched_column_indicator() + reg_targets = tf.where(matched_anchors_mask, + matched_reg_targets, + unmatched_ignored_reg_targets) + return reg_targets + + def _default_regression_target(self): + """Returns the default target for anchors to regress to. + + Default regression targets are set to zero (though in + this implementation what these targets are set to should + not matter as the regression weight of any box set to + regress to the default target is zero). + + Returns: + default_target: a float32 tensor with shape [1, box_code_dimension] + """ + return tf.constant([self._box_coder.code_size*[0]], tf.float32) + + def _create_classification_targets(self, groundtruth_labels, match): + """Create classification targets for each anchor. + + Assign a classification target of for each anchor to the matching + groundtruth label that is provided by match. Anchors that are not matched + to anything are given the target self._unmatched_cls_target + + Args: + groundtruth_labels: a tensor of shape [num_gt_boxes, d_1, ... d_k] + with labels for each of the ground_truth boxes. The subshape + [d_1, ... d_k] can be empty (corresponding to scalar labels). + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + + Returns: + a float32 tensor with shape [num_anchors, d_1, d_2 ... d_k], where the + subshape [d_1, ..., d_k] is compatible with groundtruth_labels which has + shape [num_gt_boxes, d_1, d_2, ... d_k]. + """ + return match.gather_based_on_match( + groundtruth_labels, + unmatched_value=self._unmatched_cls_target, + ignored_value=self._unmatched_cls_target) + + def _create_regression_weights(self, match, groundtruth_weights): + """Set regression weight for each anchor. + + Only positive anchors are set to contribute to the regression loss, so this + method returns a weight of 1 for every positive anchor and 0 for every + negative anchor. + + Args: + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. + + Returns: + a float32 tensor with shape [num_anchors] representing regression weights. + """ + return match.gather_based_on_match( + groundtruth_weights, ignored_value=0., unmatched_value=0.) + + def _create_classification_weights(self, + match, + groundtruth_weights): + """Create classification weights for each anchor. + + Positive (matched) anchors are associated with a weight of + positive_class_weight and negative (unmatched) anchors are associated with + a weight of negative_class_weight. When anchors are ignored, weights are set + to zero. By default, both positive/negative weights are set to 1.0, + but they can be adjusted to handle class imbalance (which is almost always + the case in object detection). + + Args: + match: a matcher.Match object that provides a matching between anchors + and groundtruth boxes. + groundtruth_weights: a float tensor of shape [M] indicating the weight to + assign to all anchors match to a particular groundtruth box. + + Returns: + a float32 tensor with shape [num_anchors] representing classification + weights. + """ + return match.gather_based_on_match( + groundtruth_weights, + ignored_value=0., + unmatched_value=self._negative_class_weight) + + def get_box_coder(self): + """Get BoxCoder of this TargetAssigner. + + Returns: + BoxCoder object. + """ + return self._box_coder diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/tf_example_decoder.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/tf_example_decoder.py new file mode 100644 index 0000000..3ff9fea --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/object_detection/tf_example_decoder.py @@ -0,0 +1,210 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Tensorflow Example proto decoder for object detection. + +A decoder to decode string tensors containing serialized tensorflow.Example +protos for object detection. +""" +import tensorflow as tf + + +slim_example_decoder = tf.contrib.slim.tfexample_decoder + + +class TfExampleDecoder(object): + """Tensorflow Example proto decoder.""" + + def __init__(self): + """Constructor sets keys_to_features and items_to_handlers.""" + self.keys_to_features = { + 'image/encoded': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/format': + tf.FixedLenFeature((), tf.string, default_value='jpeg'), + 'image/filename': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/key/sha256': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/source_id': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/height': + tf.FixedLenFeature((), tf.int64, 1), + 'image/width': + tf.FixedLenFeature((), tf.int64, 1), + # Object boxes and classes. + 'image/object/bbox/xmin': + tf.VarLenFeature(tf.float32), + 'image/object/bbox/xmax': + tf.VarLenFeature(tf.float32), + 'image/object/bbox/ymin': + tf.VarLenFeature(tf.float32), + 'image/object/bbox/ymax': + tf.VarLenFeature(tf.float32), + 'image/object/class/label': + tf.VarLenFeature(tf.int64), + 'image/object/class/text': + tf.VarLenFeature(tf.string), + 'image/object/area': + tf.VarLenFeature(tf.float32), + 'image/object/is_crowd': + tf.VarLenFeature(tf.int64), + 'image/object/difficult': + tf.VarLenFeature(tf.int64), + 'image/object/group_of': + tf.VarLenFeature(tf.int64), + 'image/object/weight': + tf.VarLenFeature(tf.float32), + } + self.items_to_handlers = { + 'image': slim_example_decoder.Image( + image_key='image/encoded', format_key='image/format', channels=3), + 'source_id': ( + slim_example_decoder.Tensor('image/source_id')), + 'key': ( + slim_example_decoder.Tensor('image/key/sha256')), + 'filename': ( + slim_example_decoder.Tensor('image/filename')), + # Object boxes and classes. + 'groundtruth_boxes': ( + slim_example_decoder.BoundingBox( + ['ymin', 'xmin', 'ymax', 'xmax'], 'image/object/bbox/')), + 'groundtruth_area': slim_example_decoder.Tensor( + 'image/object/area'), + 'groundtruth_is_crowd': ( + slim_example_decoder.Tensor('image/object/is_crowd')), + 'groundtruth_difficult': ( + slim_example_decoder.Tensor('image/object/difficult')), + 'groundtruth_group_of': ( + slim_example_decoder.Tensor('image/object/group_of')), + 'groundtruth_weights': ( + slim_example_decoder.Tensor('image/object/weight')), + } + label_handler = slim_example_decoder.Tensor('image/object/class/label') + self.items_to_handlers['groundtruth_classes'] = label_handler + + def decode(self, tf_example_string_tensor): + """Decodes serialized tensorflow example and returns a tensor dictionary. + + Args: + tf_example_string_tensor: a string tensor holding a serialized tensorflow + example proto. + + Returns: + A dictionary of the following tensors. + image - 3D uint8 tensor of shape [None, None, 3] + containing image. + source_id - string tensor containing original + image id. + key - string tensor with unique sha256 hash key. + filename - string tensor with original dataset + filename. + groundtruth_boxes - 2D float32 tensor of shape + [None, 4] containing box corners. + groundtruth_classes - 1D int64 tensor of shape + groundtruth_weights - 1D float32 tensor of + shape [None] indicating the weights of groundtruth boxes. + [None] containing classes for the boxes. + groundtruth_area - 1D float32 tensor of shape + [None] containing containing object mask area in pixel squared. + groundtruth_is_crowd - 1D bool tensor of shape + [None] indicating if the boxes enclose a crowd. + + Optional: + groundtruth_difficult - 1D bool tensor of shape + [None] indicating if the boxes represent `difficult` instances. + groundtruth_group_of - 1D bool tensor of shape + [None] indicating if the boxes represent `group_of` instances. + groundtruth_instance_masks - 3D float32 tensor of + shape [None, None, None] containing instance masks. + """ + serialized_example = tf.reshape(tf_example_string_tensor, shape=[]) + decoder = slim_example_decoder.TFExampleDecoder(self.keys_to_features, + self.items_to_handlers) + keys = sorted(decoder.list_items()) + + tensors = decoder.decode(serialized_example, items=keys) + tensor_dict = dict(zip(keys, tensors)) + is_crowd = 'groundtruth_is_crowd' + tensor_dict[is_crowd] = tf.cast(tensor_dict[is_crowd], dtype=tf.bool) + tensor_dict['image'].set_shape([None, None, 3]) + + def default_groundtruth_weights(): + return tf.ones( + tf.shape(tensor_dict['groundtruth_boxes'])[0], + dtype=tf.float32) + + tensor_dict['groundtruth_weights'] = tf.cond( + tf.greater( + tf.shape( + tensor_dict['groundtruth_weights'])[0], + 0), lambda: tensor_dict['groundtruth_weights'], + default_groundtruth_weights) + return tensor_dict + + +class TfExampleSegmentationDecoder(object): + """Tensorflow Example proto decoder.""" + + def __init__(self): + """Constructor sets keys_to_features and items_to_handlers.""" + self.keys_to_features = { + 'image/encoded': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/filename': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/format': + tf.FixedLenFeature((), tf.string, default_value='jpeg'), + 'image/height': + tf.FixedLenFeature((), tf.int64, default_value=0), + 'image/width': + tf.FixedLenFeature((), tf.int64, default_value=0), + 'image/segmentation/class/encoded': + tf.FixedLenFeature((), tf.string, default_value=''), + 'image/segmentation/class/format': + tf.FixedLenFeature((), tf.string, default_value='png'), + } + self.items_to_handlers = { + 'image': slim_example_decoder.Image( + image_key='image/encoded', format_key='image/format', channels=3), + 'labels_class': slim_example_decoder.Image( + image_key='image/segmentation/class/encoded', + format_key='image/segmentation/class/format', + channels=1) + } + + def decode(self, tf_example_string_tensor): + """Decodes serialized tensorflow example and returns a tensor dictionary. + + Args: + tf_example_string_tensor: a string tensor holding a serialized tensorflow + example proto. + + Returns: + A dictionary of the following tensors. + image - 3D uint8 tensor of shape [None, None, 3] containing image. + labels_class - 2D unit8 tensor of shape [None, None] containing + pixel-wise class labels. + """ + serialized_example = tf.reshape(tf_example_string_tensor, shape=[]) + decoder = slim_example_decoder.TFExampleDecoder(self.keys_to_features, + self.items_to_handlers) + keys = sorted(decoder.list_items()) + keys = ['image', 'labels_class'] + + tensors = decoder.decode(serialized_example, items=keys) + tensor_dict = dict(zip(keys, tensors)) + tensor_dict['image'].set_shape([None, None, 3]) + return tensor_dict diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_1p.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_1p.sh new file mode 100644 index 0000000..c433b81 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_1p.sh @@ -0,0 +1,44 @@ +#clean slog +rm -rf /var/log/npu/slog/host-0/*.log +rm -rf /var/log/npu/slog/device-*/*.log + +# set env +export PYTHONPATH=/usr/local/Ascend/ops/op_impl/built-in/ai_core/tbe +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu +PATH=$PATH:$HOME/bin +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin:$PATH +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export DDK_VERSION_FLAG=1.71.T5.0.B060 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +export DUMP_GE_GRAPH=1 +export DUMP_GRAPH_LEVEL=3 +export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=1 + + +export RANK_SIZE=1 +RANK_ID_START=1 + +SAVE_PATH=training +BASE_PATH=`pwd` +echo $BASE_PATH + +for((RANK_ID=$RANK_ID_START;RANK_ID<$((RANK_SIZE+RANK_ID_START));RANK_ID++)); +do +echo +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device "$RANK_ID +TMP_PATH=$SAVE_PATH/D$RANK_ID +mkdir -p $TMP_PATH +cp exec_main.sh $TMP_PATH/ +cd $TMP_PATH +bash exec_main.sh $RANK_ID $RANK_SIZE $BASE_PATH > train_$RANK_ID.log & +cd - +done + + + + + + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_8p.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_8p.sh new file mode 100644 index 0000000..aac0dae --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_8p.sh @@ -0,0 +1,41 @@ + +#clean slog +rm -rf /var/log/npu/slog/host-0/*.log +rm -rf /var/log/npu/slog/device-*/*.log + +# set env +export PYTHONPATH=/usr/local/Ascend/ops/op_impl/built-in/ai_core/tbe/ +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu +PATH=$PATH:$HOME/bin +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin:$PATH +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export DDK_VERSION_FLAG=1.71.T5.0.B060 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +export DUMP_GE_GRAPH=1 +export DUMP_GRAPH_LEVEL=3 +export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=1 + + +export RANK_SIZE=8 +export RANK_TABLE_FILE=${PWD}/npu_config/${RANK_SIZE}p.json +RANK_ID_START=0 + +BASE_PATH=`pwd` +SAVE_PATH=training +for((RANK_ID=$RANK_ID_START;RANK_ID<$((RANK_SIZE+RANK_ID_START));RANK_ID++)); +do +echo +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device "$RANK_ID +TMP_PATH=$SAVE_PATH/D$RANK_ID +mkdir -p $TMP_PATH +cp exec_main.sh $TMP_PATH/ +cd $TMP_PATH +nohup bash exec_main.sh $RANK_ID $RANK_SIZE $BASE_PATH > train_$RANK_ID.log & +cd - +done + + + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_architecture.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_architecture.py new file mode 100644 index 0000000..c91cbf1 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_architecture.py @@ -0,0 +1,484 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""SSD (via ResNet50) model definition. + +Defines the SSD model and loss functions from this paper: + +https://arxiv.org/pdf/1708.02002 + +Uses the ResNet model as a basis. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import tensorflow as tf + +import ssd_constants + +def batch_norm_relu(inputs, + is_training_bn, + params, + relu=True, + init_zero=False, + data_format='channels_last', + name=None): + """Performs a batch normalization followed by a ReLU. + + Args: + inputs: `Tensor` of shape `[batch, channels, ...]`. + is_training_bn: `bool` for whether the model is training. + params: params of the model, a dict including `distributed_group_size` + and `num_shards`. + relu: `bool` if False, omits the ReLU operation. + init_zero: `bool` if True, initializes scale parameter of batch + normalization with 0 instead of 1 (default). + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + name: the name of the batch normalization layer + + Returns: + A normalized `Tensor` with the same `data_format`. + """ + if init_zero: + gamma_initializer = tf.zeros_initializer() + else: + gamma_initializer = tf.ones_initializer() + + if data_format == 'channels_first': + axis = 1 + else: + axis = 3 + + + inputs = tf.layers.batch_normalization( + inputs=inputs, + axis=axis, + momentum=ssd_constants.BATCH_NORM_DECAY, + epsilon=ssd_constants.BATCH_NORM_EPSILON, + center=True, + scale=True, + training=is_training_bn, + fused=True, + gamma_initializer=gamma_initializer, + name=name) + + if relu: + inputs = tf.nn.relu(inputs) + return inputs + + +def fixed_padding(inputs, kernel_size, data_format='channels_last'): + """Pads the input along the spatial dimensions independently of input size. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]` or + `[batch, height, width, channels]` depending on `data_format`. + kernel_size: `int` kernel size to be used for `conv2d` or max_pool2d` + operations. Should be a positive integer. + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + + Returns: + A padded `Tensor` of the same `data_format` with size either intact + (if `kernel_size == 1`) or padded (if `kernel_size > 1`). + """ + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + if data_format == 'channels_first': + padded_inputs = tf.pad( + inputs, [[0, 0], [0, 0], [pad_beg, pad_end], [pad_beg, pad_end]]) + else: + padded_inputs = tf.pad( + inputs, [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + + return padded_inputs + + +def conv2d_fixed_padding(inputs, + filters, + kernel_size, + strides, + data_format='channels_last'): + """Strided 2-D convolution with explicit padding. + + The padding is consistent and is based only on `kernel_size`, not on the + dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone). + + Args: + inputs: `Tensor` of size `[batch, channels, height_in, width_in]`. + filters: `int` number of filters in the convolution. + kernel_size: `int` size of the kernel to be used in the convolution. + strides: `int` strides of the convolution. + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + + Returns: + A `Tensor` of shape `[batch, filters, height_out, width_out]`. + """ + if strides > 1: + inputs = fixed_padding(inputs, kernel_size, data_format=data_format) + + return tf.layers.conv2d( + inputs=inputs, + filters=filters, + kernel_size=kernel_size, + strides=strides, + padding=('SAME' if strides == 1 else 'VALID'), + use_bias=False, + kernel_initializer=tf.variance_scaling_initializer(), + data_format=data_format) + + +def residual_block(inputs, + filters, + is_training_bn, + strides, + params, + use_projection=False, + data_format='channels_last'): + """Standard building block for residual networks with BN after convolutions. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]`. + filters: `int` number of filters for the first two convolutions. Note that + the third and final convolution will use 4 times as many filters. + is_training_bn: `bool` for whether the model is in training. + strides: `int` block stride. If greater than 1, this block will ultimately + downsample the input. + params: params of the model, a dict. + use_projection: `bool` for whether this block should use a projection + shortcut (versus the default identity shortcut). This is usually `True` + for the first block of a block group, which may change the number of + filters and the resolution. + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + + Returns: + The output `Tensor` of the block. + """ + shortcut = inputs + if use_projection: + # Projection shortcut in first layer to match filters and strides + shortcut = conv2d_fixed_padding( + inputs=inputs, + filters=filters, + kernel_size=1, + strides=strides, + data_format=data_format) + shortcut = batch_norm_relu( + shortcut, is_training_bn, params, relu=False, data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, + filters=filters, + kernel_size=3, + strides=strides, + data_format=data_format) + inputs = batch_norm_relu( + inputs, is_training_bn, params, data_format=data_format) + + inputs = conv2d_fixed_padding( + inputs=inputs, + filters=filters, + kernel_size=3, + strides=1, + data_format=data_format) + inputs = batch_norm_relu( + inputs, + is_training_bn, + params, + relu=False, + init_zero=True, + data_format=data_format) + + return tf.nn.relu(inputs + shortcut) + + +def block_group(inputs, + filters, + block_fn, + blocks, + strides, + is_training_bn, + name, + params, + data_format='channels_last', + use_projection=True): + """Creates one group of blocks for the ResNet model. + + Args: + inputs: `Tensor` of size `[batch, channels, height, width]`. + filters: `int` number of filters for the first convolution of the layer. + block_fn: `function` for the block to use within the model + blocks: `int` number of blocks contained in the layer. + strides: `int` stride to use for the first convolution of the layer. If + greater than 1, this layer will downsample the input. + is_training_bn: `bool` for whether the model is training. + name: `str`name for the Tensor output of the block layer. + params: params of the model, a dict. + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + use_projection: `bool` for whether this block should use a projection + shortcut (versus the default identity shortcut). This is usually `True` + for the first block of a block group, which may change the number of + filters and the resolution. + + Returns: + The output `Tensor` of the block layer. + """ + # Only the first block per block_group uses projection shortcut and strides. + inputs = block_fn( + inputs, + filters, + is_training_bn, + strides, + params, + use_projection=use_projection, + data_format=data_format) + + for _ in range(1, blocks): + inputs = block_fn( + inputs, filters, is_training_bn, 1, params, data_format=data_format) + + return tf.identity(inputs, name) + + +def resnet_v1_generator(block_fn, layers, params, data_format='channels_last'): + """Generator of ResNet v1 model with classification layers removed. + + Our actual ResNet network. We return the output of c2, c3,c4,c5 + N.B. batch norm is always run with trained parameters, as we use very small + batches when training the object layers. + + Args: + block_fn: `function` for the block to use within the model. Either + `residual_block` or `bottleneck_block`. + layers: list of 4 `int`s denoting the number of blocks to include in each + of the 4 block groups. Each group consists of blocks that take inputs of + the same resolution. + params: params of the model, a dict. + data_format: `str` either "channels_first" for `[batch, channels, height, + width]` or "channels_last for `[batch, height, width, channels]`. + + Returns: + Model `function` that takes in `inputs` and `is_training` and returns the + output `Tensor` of the ResNet model. + """ + def model(inputs, is_training_bn=False): + """Creation of the model graph.""" + inputs = conv2d_fixed_padding( + inputs=inputs, + filters=64, + kernel_size=7, + strides=2, + data_format=data_format) + inputs = tf.identity(inputs, 'initial_conv') + inputs = batch_norm_relu( + inputs, is_training_bn, params, data_format=data_format) + + inputs = tf.layers.max_pooling2d( + inputs=inputs, + pool_size=3, + strides=2, + padding='SAME', + data_format=data_format) + inputs = tf.identity(inputs, 'initial_max_pool') + + c2 = block_group( + inputs=inputs, + filters=64, + blocks=layers[0], + strides=1, + block_fn=block_fn, + is_training_bn=is_training_bn, + params=params, + name='block_group1', + data_format=data_format, + use_projection=False) + c3 = block_group( + inputs=c2, + filters=128, + blocks=layers[1], + strides=2, + block_fn=block_fn, + is_training_bn=is_training_bn, + params=params, + name='block_group2', + data_format=data_format) + c4 = block_group( + inputs=c3, + filters=256, + blocks=layers[2], + strides=1, + block_fn=block_fn, + is_training_bn=is_training_bn, + params=params, + name='block_group3', + data_format=data_format) + return c2, c3, c4 + + return model + + +def resnet_v1(resnet_depth, params, data_format='channels_last'): + """Returns the ResNet model for a given size and number of output classes.""" + model_params = { + 34: {'block': residual_block, 'layers': [3, 4, 6, 3]} + } + + if resnet_depth not in model_params: + raise ValueError('Not a valid resnet_depth:', resnet_depth) + + resnet_params = model_params[resnet_depth] + return resnet_v1_generator(resnet_params['block'], resnet_params['layers'], + params, data_format) + + +def class_net(images, level, num_classes): + """Class prediction network for SSD.""" + return tf.layers.conv2d( + images, + num_classes * ssd_constants.NUM_DEFAULTS_BY_LEVEL[level], + kernel_size=(3, 3), + padding='same', + activation=None, + name='class-%d' % (level), + ) + + +def box_net(images, level): + """Box regression network for SSD.""" + return tf.layers.conv2d( + images, + 4 * ssd_constants.NUM_DEFAULTS_BY_LEVEL[level], + kernel_size=(3, 3), + padding='same', + activation=None, + name='box-%d' % (level), + ) + + +def ssd(features, params, is_training_bn=False): + """SSD classification and regression model.""" + # upward layers + with tf.variable_scope( + 'resnet%s' % ssd_constants.RESNET_DEPTH, reuse=tf.AUTO_REUSE): + resnet_fn = resnet_v1(ssd_constants.RESNET_DEPTH, params) + _, _, u4 = resnet_fn(features, is_training_bn) + + with tf.variable_scope('ssd', reuse=tf.AUTO_REUSE): + feats = {} + # output channels for mlperf logging. + out_channels = [256] + feats[3] = u4 + feats[4] = tf.layers.conv2d( + feats[3], + filters=256, + kernel_size=(1, 1), + padding='same', + activation=tf.nn.relu, + name='block7-conv1x1') + feats[4] = tf.layers.conv2d( + feats[4], + filters=512, + strides=(2, 2), + kernel_size=(3, 3), + padding='same', + activation=tf.nn.relu, + name='block7-conv3x3') + out_channels.append(512) + feats[5] = tf.layers.conv2d( + feats[4], + filters=256, + kernel_size=(1, 1), + padding='same', + activation=tf.nn.relu, + name='block8-conv1x1') + feats[5] = tf.layers.conv2d( + feats[5], + filters=512, + strides=(2, 2), + kernel_size=(3, 3), + padding='same', + activation=tf.nn.relu, + name='block8-conv3x3') + out_channels.append(512) + feats[6] = tf.layers.conv2d( + feats[5], + filters=128, + kernel_size=(1, 1), + padding='same', + activation=tf.nn.relu, + name='block9-conv1x1') + feats[6] = tf.layers.conv2d( + feats[6], + filters=256, + strides=(2, 2), + kernel_size=(3, 3), + padding='same', + activation=tf.nn.relu, + name='block9-conv3x3') + out_channels.append(256) + feats[7] = tf.layers.conv2d( + feats[6], + filters=128, + kernel_size=(1, 1), + padding='same', + activation=tf.nn.relu, + name='block10-conv1x1') + feats[7] = tf.layers.conv2d( + feats[7], + filters=256, + kernel_size=(3, 3), + padding='valid', + activation=tf.nn.relu, + name='block10-conv3x3') + out_channels.append(256) + feats[8] = tf.layers.conv2d( + feats[7], + filters=128, + kernel_size=(1, 1), + padding='same', + activation=tf.nn.relu, + name='block11-conv1x1') + feats[8] = tf.layers.conv2d( + feats[8], + filters=256, + kernel_size=(3, 3), + padding='valid', + activation=tf.nn.relu, + name='block11-conv3x3') + out_channels.append(256) + + class_outputs = {} + box_outputs = {} + min_level = ssd_constants.MIN_LEVEL + max_level = ssd_constants.MAX_LEVEL + num_classes = ssd_constants.NUM_CLASSES + + with tf.variable_scope('class_net', reuse=tf.AUTO_REUSE): + for level in range(min_level, max_level + 1): + class_outputs[level] = class_net( + feats[level], level, num_classes) + + with tf.variable_scope('box_net', reuse=tf.AUTO_REUSE): + for level in range(min_level, max_level + 1): + box_outputs[level] = box_net( + feats[level], level) + + return class_outputs, box_outputs diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_constants.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_constants.py new file mode 100644 index 0000000..87aa0dd --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_constants.py @@ -0,0 +1,122 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Central location for all constants related to MLPerf SSD.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# ============================================================================== +# == Model ===================================================================== +# ============================================================================== +IMAGE_SIZE = 300 +SPACE_TO_DEPTH_BLOCK_SIZE = 2 + +# TODO(taylorrobie): MLPerf uses 80, but COCO documents 90. (RetinaNet uses 90) +# Update(taylorrobie): Labels > 81 show up in the pipeline. This will need to +# be resolved. +NUM_CLASSES = 81 # Including "no class". Not all COCO classes are used. + +# Note: Zero is special. (Background class) CLASS_INV_MAP[0] must be zero. +CLASS_INV_MAP = ( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, + 88, 89, 90) +_MAP = {j: i for i, j in enumerate(CLASS_INV_MAP)} +CLASS_MAP = tuple(_MAP.get(i, -1) for i in range(max(CLASS_INV_MAP) + 1)) + +NUM_SSD_BOXES = 8732 + +RESNET_DEPTH = 34 + +"""SSD specific""" +MIN_LEVEL = 3 +MAX_LEVEL = 8 + +FEATURE_SIZES = (38, 19, 10, 5, 3, 1) +STEPS = (8, 16, 32, 64, 100, 300) + +# https://github.com/amdegroot/ssd.pytorch/blob/master/data/config.py +SCALES = (21, 45, 99, 153, 207, 261, 315) +ASPECT_RATIOS = ((2,), (2, 3), (2, 3), (2, 3), (2,), (2,)) +NUM_DEFAULTS = (4, 6, 6, 6, 4, 4) +NUM_DEFAULTS_BY_LEVEL = {3: 4, 4: 6, 5: 6, 6: 6, 7: 4, 8: 4} +SCALE_XY = 0.1 +SCALE_HW = 0.2 +BOX_CODER_SCALES = (1 / SCALE_XY, 1 / SCALE_XY, 1 / SCALE_HW, 1 / SCALE_HW) +MATCH_THRESHOLD = 0.5 + +# https://discuss.pytorch.org/t/how-to-preprocess-input-for-pre-trained-networks/683 +NORMALIZATION_MEAN = (0.485, 0.456, 0.406) +NORMALIZATION_STD = (0.229, 0.224, 0.225) + +# SSD Cropping +NUM_CROP_PASSES = 50 +CROP_MIN_IOU_CHOICES = (0, 0.1, 0.3, 0.5, 0.7, 0.9) +P_NO_CROP_PER_PASS = 1 / (len(CROP_MIN_IOU_CHOICES) + 1) + +# Hard example mining +NEGS_PER_POSITIVE = 3 + +# Batch normalization +BATCH_NORM_DECAY = 0.9 +BATCH_NORM_EPSILON = 1e-5 + + +# ============================================================================== +# == Optimizer ================================================================= +# ============================================================================== +BASE_LEARNING_RATE = 3.0e-3 +FIRST_LR_DROP_STEP = 160000 # 该参数不起作用 +SECOND_LR_DROP_STEP = 200000 # 该参数不起作用 +MOMENTUM = 0.9 +WEIGHT_DECAY = 5e-4 +DEFAULT_BATCH_SIZE = 32.0 + +# ============================================================================== +# == Keys ====================================================================== +# ============================================================================== +BOXES = "boxes" +CLASSES = "classes" +NUM_MATCHED_BOXES = "num_matched_boxes" +IMAGE = "image" +SOURCE_ID = "source_id" +RAW_SHAPE = "raw_shape" +IS_PADDED = "is_padded" + + +# ============================================================================== +# == Evaluation ================================================================ +# ============================================================================== + +# Note: This is based on a batch size of 32 +# https://github.com/mlperf/reference/blob/master/single_stage_detector/ssd/train.py#L21-L37 # pylint: disable=line-too-long +EVAL_SAMPLES = 5000 +CHECKPOINT_FREQUENCY = 5000 +MAX_NUM_EVAL_BOXES = 200 +OVERLAP_CRITERIA = 0.5 # Used for nonmax supression +MIN_SCORE = 0.05 # Minimum score to be considered during evaluation. +DUMMY_SCORE = -1e5 # If no boxes are matched. +# Eval step intervals starting from 0 +#EVAL_STEPS = (24000, 24000, 24000, 24000, 24000,24000, 24000, 24000, 24000, 24000) +EVAL_STEPS = (432000,) +# Target COCO/AP for mlperf. +EVAL_TARGET = 0.24 + +# For multiprocessing. +QUEUE_SIZE = 24 +WORKER_COUNT = 10 diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_main.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_main.py new file mode 100644 index 0000000..078494d --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_main.py @@ -0,0 +1,309 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Training script for SSD. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math +import multiprocessing +import os + +import sys +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../utils/atlasboost')) + +import threading +from absl import app +import numpy as np +import tensorflow as tf + +from npu_bridge.estimator import npu_ops +from tensorflow.core.protobuf import rewriter_config_pb2 +from npu_bridge.estimator.npu.npu_config import NPURunConfig +from npu_bridge.estimator.npu.npu_estimator import NPUEstimator + +import coco_metric +import dataloader +import ssd_constants +import ssd_model + + +def get_rank_size(): + return int(os.environ['RANK_SIZE']) +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +tf.flags.DEFINE_string('model_dir', None, 'Location of model_dir') +tf.flags.DEFINE_string('resnet_checkpoint', '', + 'Location of the ResNet checkpoint to use for model ' + 'initialization.') +tf.flags.DEFINE_integer('train_batch_size', 64, 'training batch size') +tf.flags.DEFINE_integer('eval_batch_size', 1, 'evaluation batch size') +tf.flags.DEFINE_integer('eval_samples', 5000, 'The number of samples for ' + 'evaluation.') +tf.flags.DEFINE_string( + 'training_file_pattern', None, + 'Glob for training data files (e.g., COCO train - minival set)') +tf.flags.DEFINE_string( + 'validation_file_pattern', None, + 'Glob for evaluation tfrecords (e.g., COCO val2017 set)') +tf.flags.DEFINE_string( + 'val_json_file', + None, + 'COCO validation JSON containing golden bounding boxes.') +tf.flags.DEFINE_integer('num_examples_per_epoch', 120000, + 'Number of examples in one epoch') +tf.flags.DEFINE_float('num_epochs', 58, 'Number of epochs for training') + +tf.flags.DEFINE_string('mode', 'train_and_eval', + 'Mode to run: train_and_eval, train, eval') + +tf.flags.DEFINE_integer( + 'keep_checkpoint_max', 32, + 'Maximum number of checkpoints to keep.') + + +FLAGS = tf.flags.FLAGS + +SUCCESS = False + + +def construct_run_config(): + """Construct the run config.""" + + # Parse hparams + hparams = ssd_model.default_hparams() + + params = dict( + hparams.values(), + num_examples_per_epoch=FLAGS.num_examples_per_epoch, + resnet_checkpoint=FLAGS.resnet_checkpoint, + val_json_file=FLAGS.val_json_file, + mode=FLAGS.mode, + model_dir=FLAGS.model_dir, + eval_samples=FLAGS.eval_samples, + ) + + return NPURunConfig( + model_dir=FLAGS.model_dir, + session_config=tf.ConfigProto(), + keep_checkpoint_max=FLAGS.keep_checkpoint_max, + save_checkpoints_steps=ssd_constants.CHECKPOINT_FREQUENCY, + enable_data_pre_proc=True, + save_summary_steps=100, + iterations_per_loop=100, + precision_mode='allow_mix_precision' + ), params + +def coco_eval(predictions, + current_step, + summary_writer, + coco_gt, + use_cpp_extension=True, + nms_on_tpu=True): + """Call the coco library to get the eval metrics.""" + global SUCCESS + eval_results = coco_metric.compute_map( + predictions, + coco_gt, + use_cpp_extension=use_cpp_extension, + nms_on_tpu=nms_on_tpu) + if eval_results['COCO/AP'] >= ssd_constants.EVAL_TARGET and not SUCCESS: + SUCCESS = True + tf.logging.info('Eval results: %s' % eval_results) + hwlog.remark_print(key=hwlog.EVAL_RESULTS, value=eval_results) + # Write out eval results for the checkpoint. + with tf.Graph().as_default(): + summaries = [] + for metric in eval_results: + summaries.append( + tf.Summary.Value(tag=metric, simple_value=eval_results[metric])) + tf_summary = tf.Summary(value=list(summaries)) + summary_writer.add_summary(tf_summary, current_step) + +def init_npu(): + """Initialize npu manually. + Returns: + `init_sess` npu init session config. + `npu_init` npu init ops. + """ + npu_init = npu_ops.initialize_system() + config = tf.ConfigProto() + + #npu mix precision attribute set to true when using mix precision + config.graph_options.rewrite_options.remapping = rewriter_config_pb2.RewriterConfig.OFF + custom_op = config.graph_options.rewrite_options.custom_optimizers.add() + custom_op.name = "NpuOptimizer" + custom_op.parameter_map["use_off_line"].b = True + + init_sess = tf.Session(config=config) + return init_sess,npu_init + +def main(argv): + init_sess, npu_init = init_npu() + init_sess.run(npu_init) + + del argv # Unused. + global SUCCESS + + # Check data path + if FLAGS.mode in ('train', + 'train_and_eval') and FLAGS.training_file_pattern is None: + raise RuntimeError('You must specify --training_file_pattern for training.') + if FLAGS.mode in ('train_and_eval', 'eval'): + if FLAGS.validation_file_pattern is None: + raise RuntimeError('You must specify --validation_file_pattern ' + 'for evaluation.') + if FLAGS.val_json_file is None: + raise RuntimeError('You must specify --val_json_file for evaluation.') + + run_config, params = construct_run_config() + + if FLAGS.mode == 'train': + train_params = dict(params) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=train_params['num_examples_per_epoch']) + train_params['batch_size'] = FLAGS.train_batch_size + train_estimator = NPUEstimator( + model_fn=ssd_model.ssd_model_fn, + model_dir=FLAGS.model_dir, + config=run_config, + params=train_params) + + tf.logging.info(params) + + train_estimator.train( + input_fn=dataloader.SSDInputReader( + FLAGS.training_file_pattern, + params['transpose_input'], + is_training=True), + steps=int((FLAGS.num_epochs * FLAGS.num_examples_per_epoch) / + FLAGS.train_batch_size / get_rank_size())) + + elif FLAGS.mode == 'train_and_eval': + output_dir = os.path.join(FLAGS.model_dir, 'eval') + tf.gfile.MakeDirs(output_dir) + # Summary writer writes out eval metrics. + summary_writer = tf.summary.FileWriter(output_dir) + + current_step = 0 + + coco_gt = coco_metric.create_coco( + FLAGS.val_json_file, use_cpp_extension=params['use_cocoeval_cc']) + for eval_step in ssd_constants.EVAL_STEPS: + # Compute the actual eval steps based on the actural train_batch_size + steps = int(eval_step / get_rank_size() * ssd_constants.DEFAULT_BATCH_SIZE / + FLAGS.train_batch_size) + print('###################################', steps) + + tf.logging.info('Starting training cycle for %d steps.' % steps) + run_config, params = construct_run_config() + + train_params = dict(params) + hwlog.remark_print(key=hwlog.CURRENT_EPOCH, value=train_params['num_examples_per_epoch']) + train_params['batch_size'] = FLAGS.train_batch_size + train_estimator = NPUEstimator( + model_fn=ssd_model.ssd_model_fn, + model_dir=FLAGS.model_dir, + config=run_config, + params=train_params) + tf.logging.info(params) + train_estimator.train( + input_fn=dataloader.SSDInputReader( + FLAGS.training_file_pattern, + params['transpose_input'], + is_training=True), + steps=steps) + + if SUCCESS: + break + + current_step = current_step + steps + + tf.logging.info('Starting evaluation cycle at step %d.' % current_step) + # Run evaluation at the given step. + eval_params = dict(params) + eval_params['batch_size'] = FLAGS.eval_batch_size + eval_estimator = NPUEstimator( + model_fn=ssd_model.ssd_model_fn, + model_dir=FLAGS.model_dir, + config=run_config, + params=eval_params) + + predictions = list( + eval_estimator.predict( + input_fn=dataloader.SSDInputReader( + FLAGS.validation_file_pattern, + is_training=False))) + + coco_eval(predictions, current_step, summary_writer, coco_gt, params['use_cocoeval_cc'], False) + summary_writer.close() + + elif FLAGS.mode == 'eval': + coco_gt = coco_metric.create_coco( + FLAGS.val_json_file, use_cpp_extension=params['use_cocoeval_cc']) + eval_params = dict(params) + eval_params['batch_size'] = FLAGS.eval_batch_size + eval_estimator = NPUEstimator( + model_fn=ssd_model.ssd_model_fn, + model_dir=FLAGS.model_dir, + config=run_config, + params=eval_params) + + output_dir = os.path.join(FLAGS.model_dir, 'eval') + tf.gfile.MakeDirs(output_dir) + # Summary writer writes out eval metrics. + summary_writer = tf.summary.FileWriter(output_dir) + ckpt = tf.train.latest_checkpoint(FLAGS.model_dir) + tf.logging.info('Starting to evaluate on newest checkpoint.') + predictions = list( + eval_estimator.predict( + checkpoint_path=ckpt, + input_fn=dataloader.SSDInputReader( + FLAGS.validation_file_pattern, + is_training=False))) + tf.logging.info('Starting to cal coco ap.') + current_step = int(os.path.basename(ckpt).split('-')[1]) + + coco_eval(predictions, current_step, summary_writer, coco_gt, + params['use_cocoeval_cc'], False) + + tf.logging.info('end to evaluate.') + + summary_writer.close() + + npu_shutdown = npu_ops.shutdown_system() + init_sess.run(npu_shutdown) + init_sess.close() + +if __name__ == '__main__': + hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] + cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") + config_info = get_model_parameter("tensorflow_config") + initinal_data = {"base_lr": 0.01, "dataset": "imagenet1024", "optimizer": "SGD", "loss_scale": 512} + hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) + hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) + hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) + hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) + hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) + hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) + hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) + hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) + hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) + hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) + hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + tf.logging.set_verbosity(tf.logging.INFO) + app.run(main) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_model.py b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_model.py new file mode 100644 index 0000000..e253b7e --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/code/ssd_model.py @@ -0,0 +1,500 @@ +# Copyright 2018 Google. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Model defination for the SSD Model. + +Defines model_fn of SSD for TF Estimator. The model_fn includes SSD +model architecture, loss function, learning rate schedule, and evaluation +procedure. + +T.-Y. Lin, P. Goyal, R. Girshick, K. He, and P. Dollar +Focal Loss for Dense Object Detection. arXiv:1708.02002 +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import os +import tensorflow as tf + +from object_detection import box_coder +from object_detection import box_list +from object_detection import faster_rcnn_box_coder + +from tensorflow.python.estimator import model_fn as model_fn_lib + +import dataloader +import ssd_architecture +import ssd_constants +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter + + +def get_rank_size(): + return int(os.environ['RANK_SIZE']) + +def select_top_k_scores(scores_in, pre_nms_num_detections=5000): + """Select top_k scores and indices for each class. + + Args: + scores_in: a Tensor with shape [batch_size, N, num_classes], which stacks + class logit outputs on all feature levels. The N is the number of total + anchors on all levels. The num_classes is the number of classes predicted + by the model. + pre_nms_num_detections: Number of candidates before NMS. + + Returns: + scores and indices: Tensors with shape [batch_size, pre_nms_num_detections, + num_classes]. + """ + scores_trans = tf.transpose(scores_in, perm=[0, 2, 1]) + + top_k_scores, top_k_indices = tf.nn.top_k( + scores_trans, k=pre_nms_num_detections, sorted=True) + + return tf.transpose(top_k_scores, [0, 2, 1]), tf.transpose( + top_k_indices, [0, 2, 1]) + + +def concat_outputs(cls_outputs, box_outputs): + """Concatenate predictions into a single tensor. + + This function takes the dicts of class and box prediction tensors and + concatenates them into a single tensor for comparison with the ground truth + boxes and class labels. + Args: + cls_outputs: an OrderDict with keys representing levels and values + representing logits in [batch_size, height, width, + num_anchors * num_classses]. + box_outputs: an OrderDict with keys representing levels and values + representing box regression targets in + [batch_size, height, width, num_anchors * 4]. + Returns: + concatenanted cls_outputs and box_outputs. + """ + assert set(cls_outputs.keys()) == set(box_outputs.keys()) + + # This sort matters. The labels assume a certain order based on + # ssd_constants.FEATURE_SIZES, and this sort matches that convention. + keys = sorted(cls_outputs.keys()) + batch_size = int(cls_outputs[keys[0]].shape[0]) + + flat_cls = [] + flat_box = [] + + for i, k in enumerate(keys): + # TODO(taylorrobie): confirm that this reshape, transpose, + # reshape is correct. + scale = ssd_constants.FEATURE_SIZES[i] # 不同特征尺度, 38,19,10,5,3,1 + split_shape = (ssd_constants.NUM_DEFAULTS[i], ssd_constants.NUM_CLASSES) # (4,81)、(6,81)... + assert cls_outputs[k].shape[3] == split_shape[0] * split_shape[1] + intermediate_shape = (batch_size, scale, scale) + split_shape # (32,38,38)+ (4,81)=(32,38,38,4,81) + final_shape = (batch_size, scale ** 2 * split_shape[0], split_shape[1]) # (32, 38^2 * 4, 81) + flat_cls.append(tf.reshape(tf.reshape( + cls_outputs[k], intermediate_shape), final_shape)) + + split_shape = (ssd_constants.NUM_DEFAULTS[i], 4) # (4,4), (6,4)... + assert box_outputs[k].shape[3] == split_shape[0] * split_shape[1] + intermediate_shape = (batch_size, scale, scale) + split_shape # (32, 19,19) + (6,4) 为避免歧义,以第二个default box为例 + final_shape = (batch_size, scale ** 2 * split_shape[0], split_shape[1]) # (32, 19^2 * 6, 4) + flat_box.append(tf.reshape(tf.reshape( + box_outputs[k], intermediate_shape), final_shape)) + + return tf.concat(flat_cls, axis=1), tf.concat(flat_box, axis=1) + + +def _localization_loss(pred_locs, gt_locs, gt_labels, num_matched_boxes): + """Computes the localization loss. + + Computes the localization loss using smooth l1 loss. + Args: + pred_locs: a dict from index to tensor of predicted locations. The shape + of each tensor is [batch_size, num_anchors, 4]. + gt_locs: a list of tensors representing box regression targets in + [batch_size, num_anchors, 4]. + gt_labels: a list of tensors that represents the classification groundtruth + targets. The shape is [batch_size, num_anchors, 1]. + num_matched_boxes: the number of anchors that are matched to a groundtruth + targets, used as the loss normalizater. The shape is [batch_size]. + Returns: + box_loss: a float32 representing total box regression loss. + """ + keys = sorted(pred_locs.keys()) + box_loss = 0 + for i, k in enumerate(keys): + gt_label = gt_labels[i] + gt_loc = gt_locs[i] + pred_loc = tf.reshape(pred_locs[k], gt_loc.shape) + mask = tf.greater(gt_label, 0) + float_mask = tf.cast(mask, tf.float32) + + smooth_l1 = tf.reduce_sum( + tf.losses.huber_loss( + gt_loc, pred_loc, reduction=tf.losses.Reduction.NONE), + axis=-1) + smooth_l1 = tf.multiply(smooth_l1, float_mask) + box_loss = box_loss + tf.reduce_sum( + smooth_l1, axis=list(range(1, smooth_l1.shape.ndims))) + + # TODO(taylorrobie): Confirm that normalizing by the number of boxes matches + # reference + return tf.reduce_mean(box_loss / num_matched_boxes) + + +@tf.custom_gradient +def _softmax_cross_entropy(logits, label): + """Helper function to compute softmax cross entropy loss.""" + shifted_logits = logits - tf.expand_dims(tf.reduce_max(logits, -1), -1) + exp_shifted_logits = tf.math.exp(shifted_logits) + sum_exp = tf.reduce_sum(exp_shifted_logits, -1) + log_sum_exp = tf.math.log(sum_exp) + one_hot_label = tf.one_hot(label, ssd_constants.NUM_CLASSES) + shifted_logits = tf.reduce_sum(shifted_logits * one_hot_label, -1) + loss = log_sum_exp - shifted_logits + + def grad(dy): + return (exp_shifted_logits / tf.expand_dims(sum_exp, -1) - + one_hot_label) * tf.expand_dims(dy, -1), dy + + return loss, grad + + +def _classification_loss(pred_labels, gt_labels, num_matched_boxes): + """Computes the classification loss. + + Computes the classification loss with hard negative mining. + Args: + pred_labels: a dict from index to tensor of predicted class. The shape + of the tensor is [batch_size, num_anchors, num_classes]. + gt_labels: a list of tensor that represents the classification groundtruth + targets. The shape is [batch_size, num_anchors, 1]. + num_matched_boxes: the number of anchors that are matched to a groundtruth + targets. This is used as the loss normalizater. + Returns: + box_loss: a float32 representing total box regression loss. + """ + keys = sorted(pred_labels.keys()) + batch_size = gt_labels[0].shape[0] + cross_entropy = [] + for i, k in enumerate(keys): + gt_label = gt_labels[i] + pred_label = tf.reshape( + pred_labels[k], + gt_label.get_shape().as_list() + [ssd_constants.NUM_CLASSES]) + cross_entropy.append( + tf.reshape( + _softmax_cross_entropy(pred_label, gt_label), [batch_size, -1])) + + + # Put the rest of the loss computation on one device to avoid excessive + # communication inside topk_mask with spatial partition + #with tf.device(tf.contrib.tpu.core(0)): + cross_entropy = tf.concat(cross_entropy, 1) + gt_label = tf.concat([tf.reshape(l, [batch_size, -1]) for l in gt_labels], + 1) + mask = tf.greater(gt_label, 0) + float_mask = tf.cast(mask, tf.float32) + + # Hard example mining + neg_masked_cross_entropy = cross_entropy * (1 - float_mask) + + + value1, _ = tf.math.top_k(neg_masked_cross_entropy, k=4096) + kth1 = tf.reduce_min(value1, 1, keepdims=True) + mask1 = tf.cast(tf.less(neg_masked_cross_entropy, kth1), tf.float32) + + value2, _ = tf.math.top_k(tf.multiply(neg_masked_cross_entropy, mask1), k=4096) + kth2 = tf.reduce_min(value2, 1, keepdims=True) + mask2 = tf.cast(tf.less(neg_masked_cross_entropy, kth2), tf.float32) + + value3, _ = tf.math.top_k(tf.multiply(neg_masked_cross_entropy, mask2), k=540) + + value = tf.concat([value1, value2, value3], axis=1) + + num_neg_boxes = tf.minimum( + tf.to_int32(num_matched_boxes) * ssd_constants.NEGS_PER_POSITIVE, 8731) + large_neg_ce = tf.batch_gather(value, num_neg_boxes[:, tf.newaxis]) + top_k_neg_mask = tf.cast(tf.greater_equal(neg_masked_cross_entropy, large_neg_ce), tf.float32) + + + + class_loss = tf.reduce_sum( + tf.multiply(cross_entropy, float_mask + top_k_neg_mask), axis=1) + + + # TODO(taylorrobie): Confirm that normalizing by the number of boxes matches + # reference + return tf.reduce_mean(class_loss / num_matched_boxes) + + +def detection_loss(cls_outputs, box_outputs, labels): + """Computes total detection loss. + + Computes total detection loss including box and class loss from all levels. + Args: + cls_outputs: an OrderDict with keys representing levels and values + representing logits in [batch_size, height, width, num_anchors]. + box_outputs: an OrderDict with keys representing levels and values + representing box regression targets in + [batch_size, height, width, num_anchors * 4]. + labels: the dictionary that returned from dataloader that includes + groundturth targets. + Returns: + total_loss: a float32 representing total loss reducing from class and box + losses from all levels. + cls_loss: a float32 representing total class loss. + box_loss: a float32 representing total box regression loss. + """ + if isinstance(labels[ssd_constants.BOXES], dict): + gt_boxes = list(labels[ssd_constants.BOXES].values()) + gt_classes = list(labels[ssd_constants.CLASSES].values()) + else: + gt_boxes = [labels[ssd_constants.BOXES]] + gt_classes = [labels[ssd_constants.CLASSES]] + cls_outputs, box_outputs = concat_outputs(cls_outputs, box_outputs) + cls_outputs = {'flatten': cls_outputs} + box_outputs = {'flatten': box_outputs} + + box_loss = _localization_loss(box_outputs, gt_boxes, gt_classes, + labels[ssd_constants.NUM_MATCHED_BOXES]) + class_loss = _classification_loss(cls_outputs, gt_classes, + labels[ssd_constants.NUM_MATCHED_BOXES]) + + return class_loss + box_loss, class_loss, box_loss + + +def update_learning_rate_schedule_parameters(params): + """Updates params that are related to the learning rate schedule. + + Args: + params: a parameter dictionary that includes learning_rate, lr_warmup_epoch, + first_lr_drop_epoch, and second_lr_drop_epoch. + """ + batch_size = params['batch_size'] + # Learning rate is proportional to the batch size + steps_per_epoch = params['num_examples_per_epoch'] / batch_size // get_rank_size() + params['lr_warmup_step'] = int(params['lr_warmup_epoch'] * steps_per_epoch) + params['cos_decay_step'] = int( + params['cos_decay_epoch'] * steps_per_epoch) + + +def learning_rate_schedule(params, global_step): + """Handles learning rate scaling, linear warmup, and learning rate decay. + + Args: + params: A dictionary that defines hyperparameters of model. + global_step: A tensor representing current global step. + + Returns: + A tensor representing current learning rate. + """ + base_learning_rate = params['base_learning_rate'] + lr_warmup_step = params['lr_warmup_step'] + cos_decay_step = params['cos_decay_step'] + batch_size = params['batch_size'] + scaling_factor = get_rank_size() * batch_size / ssd_constants.DEFAULT_BATCH_SIZE + adjusted_learning_rate = base_learning_rate * scaling_factor + learning_rate = (tf.cast(global_step, dtype=tf.float32) / + lr_warmup_step) * adjusted_learning_rate + + learning_rate = tf.where(global_step < lr_warmup_step, learning_rate, + tf.train.cosine_decay(adjusted_learning_rate, global_step, cos_decay_step, alpha=0.01)) + + return learning_rate + + +class ExamplesPerSecondHook(tf.train.SessionRunHook): + def __init__( + self, + batch_size, + lr=0, + loss=0, + every_n_steps=100, + every_n_secs=None,): + + + if (every_n_steps is None) == (every_n_secs is None): + raise ValueError('exactly one of every_n_steps' + ' and every_n_secs should be provided.') + + self._timer = tf.train.SecondOrStepTimer( + every_steps=every_n_steps, every_secs=every_n_secs) + + self._step_train_time = 0 + self._total_steps = 0 + self._batch_size = batch_size + self._lr = lr + self._loss = loss + + def begin(self): + self._global_step_tensor = tf.compat.v1.train.get_global_step() + if self._global_step_tensor is None: + raise RuntimeError( + 'Global step should be created to use StepCounterHook.') + + def before_run(self, run_context): # pylint: disable=unused-argument + return tf.train.SessionRunArgs([self._global_step_tensor, self._lr, self._loss]) + + def after_run(self, run_context, run_values): + _ = run_context + + global_step, lr, loss = run_values.results + if self._timer.should_trigger_for_step(global_step): + + elapsed_time, elapsed_steps = self._timer.update_last_triggered_step( + global_step) + if elapsed_time is not None: + steps_per_sec = elapsed_steps / elapsed_time + self._step_train_time += elapsed_time + self._total_steps += elapsed_steps + + current_examples_per_sec = steps_per_sec * self._batch_size + tf.logging.info('%s: %g, %s: %s, %s: %s', 'FPS', current_examples_per_sec, 'learning rate', lr, 'loss', loss) + hwlog.remark_print(key=hwlog.FPS, value='%7.1f' % current_examples_per_sec) + + + +def _model_fn(features, labels, mode, params, model): + """Model defination for the SSD model based on ResNet-50. + + Args: + features: the input image tensor with shape [batch_size, height, width, 3]. + The height and width are fixed and equal. + labels: the input labels in a dictionary. The labels include class targets + and box targets which are dense label maps. The labels are generated from + get_input_fn function in data/dataloader.py + mode: the mode of TPUEstimator including TRAIN, EVAL, and PREDICT. + params: the dictionary defines hyperparameters of model. The default + settings are in default_hparams function in this file. + model: the SSD model outputs class logits and box regression outputs. + + Returns: + spec: the EstimatorSpec or TPUEstimatorSpec to run training, evaluation, + or prediction. + """ + if mode == tf.estimator.ModeKeys.PREDICT: + labels = features + features = labels.pop('image') + + features -= tf.constant( + ssd_constants.NORMALIZATION_MEAN, shape=[1, 1, 3], dtype=features.dtype) + + features /= tf.constant( + ssd_constants.NORMALIZATION_STD, shape=[1, 1, 3], dtype=features.dtype) + + def _model_outputs(): + return model( + features, params, is_training_bn=(mode == tf.estimator.ModeKeys.TRAIN)) + + + cls_outputs, box_outputs = _model_outputs() + + # First check if it is in PREDICT mode. + if mode == tf.estimator.ModeKeys.PREDICT: + flattened_cls, flattened_box = concat_outputs(cls_outputs, box_outputs) + ssd_box_coder = faster_rcnn_box_coder.FasterRcnnBoxCoder( + scale_factors=ssd_constants.BOX_CODER_SCALES) + + anchors = box_list.BoxList( + tf.convert_to_tensor(dataloader.DefaultBoxes()('ltrb'))) + + decoded_boxes = box_coder.batch_decode( + encoded_boxes=flattened_box, box_coder=ssd_box_coder, anchors=anchors) + + pred_scores = tf.nn.softmax(flattened_cls, axis=2) + + pred_scores, indices = select_top_k_scores(pred_scores, + ssd_constants.MAX_NUM_EVAL_BOXES) + + predictions = dict( + labels, + indices=indices, + pred_scores=pred_scores, + pred_box=decoded_boxes, + ) + + return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) + + # Load pretrained model from checkpoint. + if params['resnet_checkpoint'] and mode == tf.estimator.ModeKeys.TRAIN: + + def scaffold_fn(): + """Loads pretrained model through scaffold function.""" + tf.train.init_from_checkpoint(params['resnet_checkpoint'], { + '/': 'resnet%s/' % ssd_constants.RESNET_DEPTH, + }) + return tf.train.Scaffold() + else: + scaffold_fn = None + + # Set up training loss and learning rate. + update_learning_rate_schedule_parameters(params) + global_step = tf.train.get_or_create_global_step() + learning_rate = learning_rate_schedule(params, global_step) + # cls_loss and box_loss are for logging. only total_loss is optimized. + total_loss, cls_loss, box_loss = detection_loss( + cls_outputs, box_outputs, labels) + + total_loss += params['weight_decay'] * tf.add_n( + [tf.nn.l2_loss(v) for v in tf.trainable_variables()]) + + if mode == tf.estimator.ModeKeys.TRAIN: + total_loss_t = tf.reduce_mean(tf.reshape(total_loss, [1])) + cls_loss_t = tf.reduce_mean(tf.reshape(cls_loss, [1])) + box_loss_t = tf.reduce_mean(tf.reshape(box_loss, [1])) + learning_rate_t = tf.reduce_mean(tf.reshape(learning_rate, [1])) + tf.summary.scalar('total_loss', total_loss_t) + tf.summary.scalar('cls_loss_t', cls_loss_t) + tf.summary.scalar('box_loss_t', box_loss_t) + tf.summary.scalar('learning_rate_t', learning_rate_t) + + optimizer = tf.train.MomentumOptimizer( + learning_rate, momentum=ssd_constants.MOMENTUM) + from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer + optimizer = NPUDistributedOptimizer(optimizer) # 使用NPU分布式计算,更新梯度 + + # Batch norm requires update_ops to be added as a train_op dependency. + update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) + + examples_sec_hook = ExamplesPerSecondHook(get_rank_size() * 32, learning_rate, total_loss) + + train_op = tf.group(optimizer.minimize(total_loss, global_step), + update_ops) + return model_fn_lib.EstimatorSpec( + mode=mode, loss=total_loss, train_op=train_op, scaffold=scaffold_fn(), + training_hooks=[examples_sec_hook]) + + if mode == tf.estimator.ModeKeys.EVAL: + raise NotImplementedError + + +def ssd_model_fn(features, labels, mode, params): + """SSD model.""" + return _model_fn(features, labels, mode, params, model=ssd_architecture.ssd) + + +def default_hparams(): + # TODO(taylorrobie): replace params useages with global constants. + return tf.contrib.training.HParams( + + num_examples_per_epoch=120000, + lr_warmup_epoch=0.8, + cos_decay_epoch=106, + weight_decay=ssd_constants.WEIGHT_DECAY, + base_learning_rate=ssd_constants.BASE_LEARNING_RATE, + eval_every_checkpoint=False, + transpose_input=False, + use_cocoeval_cc=False + ) diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/README.md b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/README.md new file mode 100644 index 0000000..618f182 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/README.md @@ -0,0 +1,197 @@ +# Alexnet for Tensorflow + +This repository provides a script and recipe to train the AlexNet model . + +## Table Of Contents + +* [Model overview](#model-overview) + * [Model Architecture](#model-architecture) + * [Default configuration](#default-configuration) +* [Data augmentation](#data-augmentation) +* [Setup](#setup) + * [Requirements](#requirements) +* [Quick start guide](#quick-start-guide) +* [Advanced](#advanced) + * [Command line arguments](#command-line-arguments) + * [Training process](#training-process) +* [Performance](#performance) + * [Results](#results) + * [Training accuracy results](#training-accuracy-results) + * [Training performance results](#training-performance-results) + + + + +## Model overview + +AlexNet model from +`Alex Krizhevsky. "One weird trick for parallelizing convolutional neural networks". .` +reference implementation: +### Model architecture + + + +### Default configuration + +The following sections introduce the default configurations and hyperparameters for AlexNet model. + +#### Optimizer + +This model uses Momentum optimizer from Tensorflow with the following hyperparameters: + +- Momentum : 0.9 +- Learning rate (LR) : 0.06 +- LR schedule: cosine_annealing +- Batch size : 128 +- Weight decay : 0.0001. +- Label smoothing = 0.1 +- We train for: + - 150 epochs -> 60.1% top1 accuracy + +#### Data augmentation + +This model uses the following data augmentation: + +- For training: + - RandomResizeCrop, scale=(0.08, 1.0), ratio=(0.75, 1.333) + - RandomHorizontalFlip, prob=0.5 + - Normalize, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225) +- For inference: + - Resize to (256, 256) + - CenterCrop to (224, 224) + - Normalize, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225) + +## Setup +The following section lists the requirements to start training the Alexnet model. +### Requirements + +Tensorflow +NPU environmemnt + +## Quick Start Guide + +### 1. Clone the respository + +```shell +git clone xxx +cd Model_zoo_Alexnet_HARD +``` + +### 2. Download and preprocess the dataset + +1. down load the imagenet dataset +2. Extract the training data +3. The train and val images are under the train/ and val/ directories, respectively. All images within one folder have the same label. + +### 3. Train +- train on single NPU + - **edit** *scripts/train_alexnet_1p.sh*( see example below) + - bash scripts/run_npu_1p.sh +- train on 8 NPUs + - **edit** *scripts/train_alexnet_8p.sh*(see example below) + - bash scripts/run_npu_8p.sh + + +for example: +- case for single NPU + - In scripts/train_alexnet_1p.sh , python scripts part should look like as follows. For more detailed command lines arguments, please refer to [Command line arguments](#command-line-arguments) +```shell +python3.7 ${EXEC_DIR}/train.py --rank_size=1 \ + --iterations_per_loop=100 \ + --batch_size=256 \ + --data_dir=/path/to/dataset \ + --mode=train \ + --lr=0.015 \ + --log_dir=./model_1p > ./train_${device_id}.log 2>&1 +``` +run the program +``` +bash scripts/run_npu_1p.sh +``` +- case for 8 NPUs + - In scripts/train_alexnet_8p.sh , python scripts part should look like as follows. +```shell +python3.7 ${EXEC_DIR}/train.py --rank_size=8 \ + --iterations_per_loop=100 \ + --batch_size=128 \ + --data_dir=/path/to/dataset \ + --mode=train \ + --lr=0.06 \ + --log_dir=./model_8p > ./train_${device_id}.log 2>&1 +``` +run the program +``` +bash scripts/run_npu_1p.sh +``` + +### 4. Test +- same procedure as training except 2 following modifications + - change `--mode=train` to `--mode=evaluate` + - add `--checkpoint_dir=/path/to/checkpoints` + + +## Advanced +### Commmand-line options + +``` + --data_dir train data dir + --num_classes num of classes in ImageNet(default:1000) + --image_size image size of the dataset + --batch_size mini-batch size (default: 128) per npu + --pretrained path of pretrained model + --lr initial learning rate + --max_epochs max epoch num to train the model + --warmup_epochs warmup epoch(when batchsize is large) + --weight_decay weight decay (default: 1e-4) + --momentum momentum(default: 0.9) + --label_smoothing use label smooth in CE, default 0.1 + --save_summary_steps logging interval(dafault:100) + --log_dir path to save checkpoint and log + --log_name name of log file + --save_checkpoints_steps the interval to save checkpoint + --mode mode to run the program (train, evaluate) + --checkpoint_dir path to checkpoint for evaluation + --max_train_steps max number of training steps + --synthetic whether to use synthetic data or not + --version weight initialization for model + --do_checkpoint whether to save checkpoint or not + --rank_size local rank of distributed(default: 0) + --group_size world size of distributed(default: 1) + --max_train_steps number of training step , default : None, when set ,it will override the max_epoch +``` +for a complete list of options, please refer to `train.py` +### Training process + +All the results of the training will be stored in the directory `results`. +Script will store: + - checkpoints. + - log. + +## Performance + +### Result + +Our result were obtained by running the applicable training script. To achieve the same results, follow the steps in the Quick Start Guide. + +#### Training accuracy results + +| **epochs** | Top1/Top5 | +| :--------: | :-----------: | +| 150 | 60.12%/82.06% | + +#### Training performance results + +| **NPUs** | train performance | +| :------: | :---------------: | +| 8 | 30000+ img/s | + + + + + + + + + + + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..96ec094 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..bbab0db --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/config/npu_set_env.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +rm -rf /var/log/npu/slog/host-0/* +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export DDK_VERSION_FLAG=1.60.T17.B830 +export HCCL_CONNECT_TIMEOUT=600 +export JOB_ID=9999001 + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +export DUMP_GE_GRAPH=1 +export DUMP_GRAPH_LEVEL=3 +export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=1 + + +export PROFILING_MODE=false +export PROFILING_OPTIONS=training_trace +export FP_POINT=ssd/block7-conv1x1/Relu +export BP_POINT=gradients/resnet34/Relu_grad/ReluGrad +export AICPU_PROFILING_MODE=false \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/run.sh new file mode 100644 index 0000000..7c45f9b --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/run.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 + +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +model_name=$(cd $currentDir/..;basename `pwd`) + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +#mkdir train job path +currtime=`date +%Y%m%d%H%M%S` +mkdir -p ${currentDir%train*}/train/result/tf_ssd_resnet34/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_ssd_resnet34/training_job_${currtime}/ +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +jsonFilePath=${currentDir}/code/ssd_constants.py + +echo "start to modify inner config file" +echo "jsonfilepath is "${jsonFilePath} + +sed -i "s/EVAL_STEPS = (.*,)$/EVAL_STEPS = (${max_steps},)/g" ${jsonFilePath} + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_SSD-Resnet34.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $jsonFilePath root@$ip:$jsonFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +else + # ln hw log + ln -snf ${train_job_dir}/${first_device_id}/hw_SSD-Resnet34.log ${train_job_dir} + rank_id=0 + for device_id in $device_group;do + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id & + let rank_id++ + done +fi +wait + +#echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train exit " >> ${currentDir}/result/main.log + diff --git a/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/train.sh new file mode 100644 index 0000000..a0b68f8 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/SSD-Resnet34/tensorflow/scripts/train.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +device_id=$1 +rank_size=$2 +yamlPath=$3 + +currentDir=$(cd "$(dirname "$0")/.."; pwd) +#model_name="SSD-Resnet34" +currtime=$4 +toolsPath=$5 +export YAML_PATH=$3 + +mkdir -p ${currentDir%train*}/train/result/tf_ssd_resnet34/training_job_${currtime}/ +train_job_dir=${currentDir%train*}/train/result/tf_ssd_resnet34/training_job_${currtime}/ + + +# 从 yaml 获取配置 + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + +source ${currentDir}/config/npu_set_env.sh + + +# 声明变量 +export REMARK_LOG_FILE=hw_SSD-Resnet34.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +# user env +export DDK_VERSION_FLAG=1.60.T17.B830 +export HCCL_CONNECT_TIMEOUT=600 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +export DEVICE_INDEX=$RANK_ID +export JOB_ID=990 +export FUSION_TENSOR_SIZE=1000000000 + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +# 根据单卡/多卡区分调用参数 +if [ x"$6" == x"True" ];then + # 多卡多机 + export CLUSTER=True +fi +python3.7 ${currentDir}/code/ssd_main.py \ + --mode=${runmode} \ + --train_batch_size=${train_batch_size} \ + --training_file_pattern=${training_file_pattern} \ + --resnet_checkpoint=${resnet_checkpoint} \ + --validation_file_pattern=${validation_file_pattern} \ + --val_json_file=${val_json_file} \ + --eval_batch_size=${eval_batch_size} \ + --num_epochs=${num_epochs} \ + --model_dir=${model_dir} > ${train_job_dir}/train_${device_id}.log 2>&1 + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 SSD-Resnet34 train success" + echo ":::ABK 1.0.0 SSD-Resnet34 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 SSD-Resnet34 train success" >> ${train_job_dir}/${device_id}/hw_SSD-Resnet34.log +else + echo ":::ABK 1.0.0 SSD-Resnet34 train failed" + echo ":::ABK 1.0.0 SSD-Resnet34 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 SSD-Resnet34 train failed" >> ${train_job_dir}/${device_id}/hw_SSD-Resnet34.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ${hour}:${min}:${sec} +echo ":::ABK 1.0.0 SSD-Resnet34 train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_SSD-Resnet34.log + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/README.md b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/README.md new file mode 100644 index 0000000..d8589c4 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/README.md @@ -0,0 +1,141 @@ +# YOLOv3_TensorFlow训练说明 + +### 1. 介绍 +YOLOv3是基于第三方TensorFlow开源代码,使用darknet-53作为主干网络,同时支持单尺度与多尺度训练。包含训练集和验证集两部分,可选用包括COCO2014、COCO2017等, 本文档以COCO2014数据集为例,说明yolov3训练操作步骤。 + +### 2. 运行环境 +Python版本: 3.7.5 +主要python三方库: +- tensorflow >= 1.15.0 (satisfied with NPU) + +- opencv-python + + 1、直接pip install opencv-python + + 2、如果直接使用pip install opencv-python无法正常安装三方库,则采用离线安装方法安装。 + + (1)'解压opencv包' + + (2)'进入解压后的opencv包 cd opencv' + + (3)'mkdir -p build' + + (4)'cd build' + + (5)'cmake -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/local/python3.7.5/bin/python3.7m -D PYTHON3_INCLUDE_DIR=/usr/local/python3.7.5/include/python3.7m -D PYTHON3_LIBRARY=/usr/local/python3.7.5/lib/libpython3.7m.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/python3.7.5/lib/python3.7/site-packages/numpy/core/include -D PYTHON3_PACKAGES_PATH=/usr/local/python3.7.5/lib/python3.7/site-packages -D PYTHON_DEFAULT_EXECUTABLE=/usr/local/python3.7.5/bin/python3.7m ..' + + (5)'make -j4' + (6)'make install' + + 说明:cmake -D 后参数匹配当前环境 + +- tqdm 安装方式:pip install tqdm + +- pycocotools 安装方式:pip install pycocotools + + 说明: 评测的时候需要用到三方库pycocotools + +### 3. 数据集预处理 +#### 3.1 修改coco_dataset_path的值 +在yolov3/tensorflow/code下对coco_minival_anns.py和coco_trainval_anns.py中coco_dataset_path的值改为当前环境的数据集路径, 如/opt/dataset/coco2014。 + +#### 3.2 运行脚本 +``` +python3.7 coco_minival_anns.py +python3.7 coco_trainval_anns.py +``` +生成训练和验证样本标注文件coco2014_trainval.txt和coco2014_minival.txt,请将这2个文件放置到yolov3/tensorflow/code/data下。 +生成的txt文件内容示例如下: +``` +0 xxx/xxx/a.jpg 1920 1080 0 453 369 473 391 1 588 245 608 268 +1 xxx/xxx/b.jpg 1920 1080 1 466 403 485 422 2 793 300 809 320 +... +``` + +### 4. 准备预训练模型 +#### 4.1 下载预训练模型 +请从链接https://pjreddie.com/media/files/yolov3.weights下载darknet框架下的预训练模型。 + +#### 4.2 模型转换 +使用train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code下的convert_weight.py将预处理模型转换为TensorFlow框架的ckpt文件: +在convert_weight.py中将weight_path修改为下载下的预训练模型文件的路径,save_path的值修改为命名的转换为TensorFlow框架的ckpt文件的路径; 如 +``` +weight_path = '../yolov3-tf2/data/darknet53.conv.74' +save_path = './data/darknet_weights/darknet53.ckpt' +``` +然后执行 +``` +python3.7 convert_weight.py + +``` +注意:save_path中ckpt文件的路径不是在train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/darknet_weights/下时, 请将其手动移至该路径; + +### 5. 模型训练 +#### 5.1 训练参数配置 +在train/yaml/YoLoV3.yaml中修改相应配置, 配置项含义: +``` +mode: yolov3的单尺度或者多尺度模式,值为single或者 multi +data_url:数据集路径 +runmode: 运行模式,是训练还是评测,值为train或者evaluate +ckpt_path: 评测时要用到的ckpt文件的路径, 仅在evaluate时用到 +total_epoches: 跑多少个epoch, +save_epoch: 多少epoch保存一次ckpt文件 +device_group_1p: 跑1p时的device_id +device_group_2p: 跑2p时的device_id +device_group_4p: 跑4p时的device_id +mpirun_ip: 仅集群场景时需要配置, 格式ip1:卡数量1,ip2:卡数量2 +docker_image: docker镜像名称:版本号 +``` +YoLoV3.yaml中配置项示例: +``` +mode: single +data_url: /opt/npu/dataset +runmode: train +ckpt_path: /home/benchmark-master720/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/result/TrainingJob-20200724115042 +total_epoches: 1 +save_epoch: 3 +device_group_1p: 0 +device_group_2p: 0 1 +device_group_4p: 0 1 2 3 +mpirun_ip: 90.90.176.152:8,90.90.176.154:8 +docker_image: mpirun3:latest +``` + +#### 5.2 训练脚本启动 +当前路径为benchmark包的train文件夹下 +``` +bash benchmark.sh -e YoLoV3 -hw 1p # host侧1p +bash benchmark.sh -e YoLoV3 -hw 8p # host侧8p +bash benchmark.sh -e YoLoV3 -hw 1p -docker # docker侧1p +bash benchmark.sh -e YoLoV3 -hw 8p -docker # docker侧8p +bash benchmark.sh -e YoLoV3 -ct # host侧集群 +bash benchmark.sh -e YoLoV3 -ct -docker # docker侧集群 +``` + +#### 5.3 训练日志 +日志在benchmark包的train路径下reuslt中找到YoLoV3的文件夹里。 +``` +./result/tf_yolov3/TrainingJob-2020xxxxxxxxxx/train_${device_id}.log +./result/TrainingJob-2020xxxxxxxxxx/train_${device_id}.log +./result/tensorflow/yolov3t/TrainingJob-2020xxxxxxxxxx/device_id/hw_yolov3.log +``` + +### 6. 模型评测 +将train/yaml/YoLoV3.yaml中ckpt_path的值改为训练产生的日志的路径, runmode的值改为evaluate,如5.1中示例; +然后运行与训练时相同的脚本,结果参看见train.log。 + + +### 7. 训练结果参考 + +| Model | Npu_nums | mAP | FPS | +| :-------------------- | :------: | :------: | :------: | +| single_scale | 8 | 30.0 | 740 | +| multi_scale | 8 | 31.0 | 340 | +| single_scale | 1 | ---- | 96 | +| multi_scale | 1 | ---- | 44 | + + + +------- + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/.gitignore b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/.gitignore new file mode 100644 index 0000000..da9fac4 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/.gitignore @@ -0,0 +1,13 @@ + +# dirs +.idea/ +__pycache__/ +tmp*/ + +# fils +*.pyc +*.log +*.out + +data/darknet_weights/*.ckpt* + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/README.md b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/README.md new file mode 100644 index 0000000..4f94530 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/README.md @@ -0,0 +1,140 @@ +# YOLOv3_TensorFlow + +### 1. Introduction +This is npu implementation of [YOLOv3](https://pjreddie.com/media/files/papers/YOLOv3.pdf) using TensorFlow modified from [YOLOv3_TensorFlow](https://github.com/wizyoung/YOLOv3_TensorFlow). + +### 2. Requirements +Python version: 3.7.5 +Main Python Packages: +- tensorflow >= 1.15.0 (satisfied with NPU) +- opencv-python +- tqdm + +### 3. Weights convertion +The pretrained darknet53 weights file can be downloaded [here](https://pjreddie.com/media/files/darknet53.conv.74). +Place this weights file under directory `./data/darknet_weights/` and then run: +```python +python3 convert_weight.py +``` +Then the converted TensorFlow checkpoint file will be saved to `./data/darknet_weights/` directory. +In this repo, conerted weight file may be contained. + +### 4. Training +#### 4.1 Data preparation +0. dataset +To compare with official implement, for example, we use [get_coco_dataset.sh](https://github.com/pjreddie/darknet/blob/master/scripts/get_coco_dataset.sh) to prepare our dataset. + +1. annotation file +- ATTENTION: you can use easy tricks to fit default setting + - ln -s ${real_dataset_path} /opt/npu/dataset/coco +Using script generate `coco2014_trainval.txt/coco2014_minival.txt` files under `./data/` directory. +```python +python3 coco_trainval_anns.py +python3 coco_minival_anns.py +``` +One line for one image, in the format like `image_index image_absolute_path img_width img_height box_1 box_2 ... box_n`. +Box_x format: +- `label_index x_min y_min x_max y_max`. (The origin of coordinates is at the left top corner, left top => (xmin, ymin), right bottom => (xmax, ymax).) +- `image_index` is the line index which starts from zero. `label_index` is in range [0, class_num - 1]. + +For example: +``` +0 xxx/xxx/a.jpg 1920 1080 0 453 369 473 391 1 588 245 608 268 +1 xxx/xxx/b.jpg 1920 1080 1 466 403 485 422 2 793 300 809 320 +... +``` + +(2) class_names file: +Generate the `data.names` file under `./data/` directory. Each line represents a class name. +For example: +``` +bird +person +bike +... +``` + +The COCO dataset class names file is placed at `./data/coco.names`. + +(3) prior anchor file: + +Using the kmeans algorithm to get the prior anchors: + +``` +python get_kmeans.py +``` + +Then you will get 9 anchors and the average IoU. Save the anchors to a txt file. + +The COCO dataset anchors offered by YOLO's author is placed at `./data/yolo_anchors.txt`, you can use that one too. + +The yolo anchors computed by the kmeans script is on the resized image scale. The default resize method is the letterbox resize, i.e., keep the original aspect ratio in the resized image. + +#### 4.2 Training +1. single scale +Using `npu_train_*p_single.sh`. The hyper-parameters and the corresponding annotations can be found in `args_single.py`: + +```shell +bash npu_train_1p_single.sh +or +bash npu_train_8p_single.sh +``` + +2. multi scale +Using `npu_train_*p_multi.sh`. The hyper-parameters and the corresponding annotations can be found in `args_multi.py`: + +```shell +bash npu_train_1p_multi.sh +or +bash npu_train_8p_multi.sh +``` + +Check the `args.py` for more details. You should set the parameters yourself in your own specific task. + +3. training details + 1. nohup.out -- training task main_log + 2. ./training/t1/D0/train_0.log -- training host log + 3. training/t1/D0/training/train.log -- training perf log + +### 5. Evaluation + +Using `eval.sh` to evaluate the validation or test dataset. The parameters are as following: + +```shell +bash eval.sh +``` + +Check the `eval.py` for more details. You could set the parameters yourself. + +You will get the mAP metrics results using official cocoapi. +Using `tail -f eval_*.out` to watching results of models. + + +### 6. Training result + +| Model | Npu_nums | mAP | FPS | +| :-------------------- | :------: | :------: | :------: | +| single_scale | 8 | 30.0 | 740 | +| multi_scale | 8 | 31.0 | 340 | +| single_scale | 1 | ---- | 96 | +| multi_scale | 1 | ---- | 44 | + + + + +------- + +### Credits: + +I referred to many fantastic repos during the implementation: + +[YunYang1994/tensorflow-yolov3](https://github.com/YunYang1994/tensorflow-yolov3) + +[qqwweee/keras-yolo3](https://github.com/qqwweee/keras-yolo3) + +[eriklindernoren/PyTorch-YOLOv3](https://github.com/eriklindernoren/PyTorch-YOLOv3) + +[pjreddie/darknet](https://github.com/pjreddie/darknet) + +[dmlc/gluon-cv](https://github.com/dmlc/gluon-cv/tree/master/scripts/detection/yolo) + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_multi.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_multi.py new file mode 100644 index 0000000..7afa709 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_multi.py @@ -0,0 +1,110 @@ +# coding: utf-8 +# This file contains the parameter used in train.py + +from __future__ import division, print_function + +from utils.misc_utils import parse_anchors, read_class_names +import math +import os + + +save_dir = './training/' # The directory of the weights to save. +log_dir = './training/logs/' # The directory to store the tensorboard log files. +progress_log_path = './training/train.log' # The path to record the training progress. +# save_dir = os.path.join(work_path, save_dir) +# log_dir = os.path.join(work_path, log_dir) +# progress_log_path = os.path.join(work_path, progress_log_path) + +if not os.path.exists(save_dir): + os.makedirs(save_dir) +if not os.path.exists(log_dir): + os.makedirs(log_dir) + + +work_path = os.path.realpath(__file__+"/..") +### Some paths +train_file = os.path.realpath(os.path.join(work_path, './data/coco2014_trainval.txt')) # The path of the training txt file. +val_file = os.path.realpath(os.path.join(work_path, './data/coco2014_minival.txt')) # The path of the validation txt file. +restore_path = os.path.realpath(os.path.join(work_path, './data/darknet_weights/darknet53.ckpt')) # The path of the weights to restore. +anchor_path = os.path.realpath(os.path.join(work_path, './data/yolo_anchors.txt')) # The path of the anchor txt file. +class_name_path = os.path.realpath(os.path.join(work_path, './data/coco.names')) # The path of the class names. + +### Distribution setting +num_gpus=int(os.environ['RANK_SIZE']) +iterations_per_loop=10 + +### Training releated numbersls + +batch_size = 16 +img_size = [608, 608] # Images will be resized to `img_size` and fed to the network, size format: [width, height] +letterbox_resize = True # Whether to use the letterbox resize, i.e., keep the original aspect ratio in the resized image. +total_epoches = 200 +train_evaluation_step = 1000 # Evaluate on the training batch after some steps. +val_evaluation_epoch = 2 # Evaluate on the whole validation dataset after some epochs. Set to None to evaluate every epoch. +save_epoch = 10 # Save the model after some epochs. +batch_norm_decay = 0.99 # decay in bn ops +weight_decay = 5e-4 # l2 weight decay +global_step = 0 # used when resuming training + +### tf.data parameters +num_threads = 8 # Number of threads for image processing used in tf.data pipeline. +prefetech_buffer = batch_size * 4 # Prefetech_buffer used in tf.data pipeline. + +### Learning rate and optimizer +optimizer_name = 'momentum' # Chosen from [sgd, momentum, adam, rmsprop] +save_optimizer = True # Whether to save the optimizer parameters into the checkpoint file. +learning_rate_base = 75e-4 +learning_rate_base_batch_size = 64 +learning_rate_init = learning_rate_base * ((batch_size * num_gpus) / learning_rate_base_batch_size) +lr_type = 'piecewise' # Chosen from [fixed, exponential, cosine_decay, cosine_decay_restart, piecewise] +lr_decay_epoch = 5 # Epochs after which learning rate decays. Int or float. Used when chosen `exponential` and `cosine_decay_restart` lr_type. +lr_decay_factor = 0.96 # The learning rate decay factor. Used when chosen `exponential` lr_type. +lr_lower_bound = 1e-6 # The minimum learning rate. +# only used in piecewise lr type +pw_boundaries = [80, 90] # epoch based boundaries +pw_values = [learning_rate_init, learning_rate_init*0.1, learning_rate_init*0.01] + +### Load and finetune +# Choose the parts you want to restore the weights. List form. +# restore_include: None, restore_exclude: None => restore the whole model +# restore_include: None, restore_exclude: scope => restore the whole model except `scope` +# restore_include: scope1, restore_exclude: scope2 => if scope1 contains scope2, restore scope1 and not restore scope2 (scope1 - scope2) +# choise 1: only restore the darknet body +# restore_include = ['yolov3/darknet53_body'] +restore_exclude = None +# choise 2: restore all layers except the last 3 conv2d layers in 3 scale +restore_include = None +# restore_exclude = ['yolov3/yolov3_head/Conv_14', 'yolov3/yolov3_head/Conv_6', 'yolov3/yolov3_head/Conv_22'] +# restore_exclude = None +# Choose the parts you want to finetune. List form. +# Set to None to train the whole model. +# update_part = ['yolov3/yolov3_head'] +update_part = None + +### other training strategies +multi_scale_train = True # Whether to apply multi-scale training strategy. Image size varies from [320, 320] to [640, 640] by default. +use_label_smooth = False # Whether to use class label smoothing strategy. +use_focal_loss = False # Whether to apply focal loss on the conf loss. +use_mix_up = False # Whether to use mix up data augmentation strategy. +use_warm_up = True # whether to use warm up strategy to prevent from gradient exploding. +warm_up_epoch = min(total_epoches*0.1, 3) # Warm up training epoches. Set to a larger value if gradient explodes. + +### some constants in validation +# nms +nms_threshold = 0.5 # iou threshold in nms operation +score_threshold = 0.001 # threshold of the probability of the classes in nms operation, i.e. score = pred_confs * pred_probs. set lower for higher recall. +nms_topk = 100 # keep at most nms_topk outputs after nms +# mAP eval +eval_threshold = 0.5 # the iou threshold applied in mAP evaluation +use_voc_07_metric = False # whether to use voc 2007 evaluation metric, i.e. the 11-point metric + +### parse some params +anchors = parse_anchors(anchor_path) +classes = read_class_names(class_name_path) +class_num = len(classes) +train_img_cnt = len(open(train_file, 'r').readlines()) +val_img_cnt = len(open(val_file, 'r').readlines()) +train_batch_num = int(float(train_img_cnt) / batch_size / num_gpus) + +lr_decay_freq = int(train_batch_num * lr_decay_epoch) +pw_boundaries = [float(i) * train_batch_num + global_step for i in pw_boundaries] diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_single.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_single.py new file mode 100644 index 0000000..29da2ce --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/args_single.py @@ -0,0 +1,105 @@ +# coding: utf-8 +# This file contains the parameter used in train.py + +from __future__ import division, print_function + +from utils.misc_utils import parse_anchors, read_class_names +import math +import os + +save_dir = './training/' # The directory of the weights to save. +log_dir = './training/logs/' # The directory to store the tensorboard log files. +progress_log_path = './training/train.log' # The path to record the training progress. + +if not os.path.exists(save_dir): + os.makedirs(save_dir) +if not os.path.exists(log_dir): + os.makedirs(log_dir) + + +work_path = os.path.realpath(__file__+"/..") +### Some paths +train_file = os.path.realpath(os.path.join(work_path, './data/coco2014_trainval.txt')) # The path of the training txt file. +val_file = os.path.realpath(os.path.join(work_path, './data/coco2014_minival.txt')) # The path of the validation txt file. +restore_path = os.path.realpath(os.path.join(work_path, './data/darknet_weights/darknet53.ckpt')) # The path of the weights to restore. +anchor_path = os.path.realpath(os.path.join(work_path, './data/yolo_anchors.txt')) # The path of the anchor txt file. +class_name_path = os.path.realpath(os.path.join(work_path, './data/coco.names')) # The path of the class names. + +### Distribution setting +num_gpus=int(os.environ['RANK_SIZE']) +iterations_per_loop=10 + +### Training releated numbersls + +batch_size = 32 +img_size = [416, 416] # Images will be resized to `img_size` and fed to the network, size format: [width, height] +letterbox_resize = True # Whether to use the letterbox resize, i.e., keep the original aspect ratio in the resized image. +total_epoches = 200 +train_evaluation_step = 1000 # Evaluate on the training batch after some steps. +val_evaluation_epoch = 2 # Evaluate on the whole validation dataset after some epochs. Set to None to evaluate every epoch. +save_epoch = 10 # Save the model after some epochs. +batch_norm_decay = 0.99 # decay in bn ops +weight_decay = 5e-4 # l2 weight decay +global_step = 0 # used when resuming training + +### tf.data parameters +num_threads = 8 # Number of threads for image processing used in tf.data pipeline. +prefetech_buffer = batch_size * 4 # Prefetech_buffer used in tf.data pipeline. + +### Learning rate and optimizer +optimizer_name = 'momentum' # Chosen from [sgd, momentum, adam, rmsprop] +save_optimizer = True # Whether to save the optimizer parameters into the checkpoint file. +learning_rate_base = 5e-3 +learning_rate_base_batch_size = 64 +learning_rate_init = learning_rate_base * ((batch_size * num_gpus) / learning_rate_base_batch_size) +lr_type = 'piecewise' # Chosen from [fixed, exponential, cosine_decay, cosine_decay_restart, piecewise] +lr_decay_epoch = 5 # Epochs after which learning rate decays. Int or float. Used when chosen `exponential` and `cosine_decay_restart` lr_type. +lr_decay_factor = 0.96 # The learning rate decay factor. Used when chosen `exponential` lr_type. +lr_lower_bound = 1e-6 # The minimum learning rate. +# only used in piecewise lr type +pw_boundaries = [80, 90] # epoch based boundaries +pw_values = [learning_rate_init, learning_rate_init*0.1, learning_rate_init*0.01] + +### Load and finetune +# Choose the parts you want to restore the weights. List form. +# restore_include: None, restore_exclude: None => restore the whole model +# restore_include: None, restore_exclude: scope => restore the whole model except `scope` +# restore_include: scope1, restore_exclude: scope2 => if scope1 contains scope2, restore scope1 and not restore scope2 (scope1 - scope2) +# choise 1: only restore the darknet body +# restore_include = ['yolov3/darknet53_body'] +restore_exclude = None +# choise 2: restore all layers except the last 3 conv2d layers in 3 scale +restore_include = None +# restore_exclude = ['yolov3/yolov3_head/Conv_14', 'yolov3/yolov3_head/Conv_6', 'yolov3/yolov3_head/Conv_22'] +# Choose the parts you want to finetune. List form. +# Set to None to train the whole model. +# update_part = ['yolov3/yolov3_head'] +update_part = None + +### other training strategies +multi_scale_train = False # Whether to apply multi-scale training strategy. Image size varies from [320, 320] to [640, 640] by default. +use_label_smooth = False # Whether to use class label smoothing strategy. +use_focal_loss = False # Whether to apply focal loss on the conf loss. +use_mix_up = False # Whether to use mix up data augmentation strategy. +use_warm_up = True # whether to use warm up strategy to prevent from gradient exploding. +warm_up_epoch = min(total_epoches*0.1, 3) # Warm up training epoches. Set to a larger value if gradient explodes. + +### some constants in validation +# nms +nms_threshold = 0.5 # iou threshold in nms operation +score_threshold = 0.001 # threshold of the probability of the classes in nms operation, i.e. score = pred_confs * pred_probs. set lower for higher recall. +nms_topk = 100 # keep at most nms_topk outputs after nms +# mAP eval +eval_threshold = 0.5 # the iou threshold applied in mAP evaluation +use_voc_07_metric = False # whether to use voc 2007 evaluation metric, i.e. the 11-point metric + +### parse some params +anchors = parse_anchors(anchor_path) +classes = read_class_names(class_name_path) +class_num = len(classes) +train_img_cnt = len(open(train_file, 'r').readlines()) +val_img_cnt = len(open(val_file, 'r').readlines()) +train_batch_num = int(float(train_img_cnt) / batch_size / num_gpus) + +lr_decay_freq = int(train_batch_num * lr_decay_epoch) +pw_boundaries = [float(i) * train_batch_num + global_step for i in pw_boundaries] diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_minival_anns.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_minival_anns.py new file mode 100644 index 0000000..3e52abf --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_minival_anns.py @@ -0,0 +1,113 @@ +import json,cv2 +from collections import defaultdict + +ban_path = './data/5k.txt' +with open(ban_path, 'r')as f: + ban_list = f.read().split('\n')[:-1] + ban_list = [i.split('/')[-1] for i in ban_list] + +name_box_id = defaultdict(list) +id_name = dict() + +coco_dataset_path = '/opt/npu/dataset/coco/coco2014' + +f = open( + coco_dataset_path + "/annotations/instances_train2014.json", + encoding='utf-8') +data = json.load(f) +annotations = data['annotations'] +for ant in annotations: + id = ant['image_id'] + name = coco_dataset_path + '/train2014/COCO_train2014_%012d.jpg' % id + cat = ant['category_id'] + + if cat >= 1 and cat <= 11: + cat = cat - 1 + elif cat >= 13 and cat <= 25: + cat = cat - 2 + elif cat >= 27 and cat <= 28: + cat = cat - 3 + elif cat >= 31 and cat <= 44: + cat = cat - 5 + elif cat >= 46 and cat <= 65: + cat = cat - 6 + elif cat == 67: + cat = cat - 7 + elif cat == 70: + cat = cat - 9 + elif cat >= 72 and cat <= 82: + cat = cat - 10 + elif cat >= 84 and cat <= 90: + cat = cat - 11 + + name_box_id[name].append([ant['bbox'], cat]) + + + + +f = open( + coco_dataset_path + "/annotations/instances_val2014.json", + encoding='utf-8') +data = json.load(f) +annotations = data['annotations'] +for ant in annotations: + id = ant['image_id'] + name = coco_dataset_path + '/val2014/COCO_val2014_%012d.jpg' % id + cat = ant['category_id'] + + if cat >= 1 and cat <= 11: + cat = cat - 1 + elif cat >= 13 and cat <= 25: + cat = cat - 2 + elif cat >= 27 and cat <= 28: + cat = cat - 3 + elif cat >= 31 and cat <= 44: + cat = cat - 5 + elif cat >= 46 and cat <= 65: + cat = cat - 6 + elif cat == 67: + cat = cat - 7 + elif cat == 70: + cat = cat - 9 + elif cat >= 72 and cat <= 82: + cat = cat - 10 + elif cat >= 84 and cat <= 90: + cat = cat - 11 + + name_box_id[name].append([ant['bbox'], cat]) + + + + + + +f = open('data/coco2014_minival.txt', 'w') +ii = 0 +for idx, key in enumerate(name_box_id.keys()): + if key.split('/')[-1] not in ban_list: + continue + + print('5k', key.split('/')[-1]) + + f.write('%d '%ii) + ii += 1 + f.write(key) + + img = cv2.imread(key) + h,w,c = img.shape + + f.write(' %d %d'%(w,h)) + + box_infos = name_box_id[key] + for info in box_infos: + x_min = int(info[0][0]) + y_min = int(info[0][1]) + x_max = x_min + int(info[0][2]) + y_max = y_min + int(info[0][3]) + + box_info = " %d %d %d %d %d" % ( + int(info[1]), x_min, y_min, x_max, y_max + ) + f.write(box_info) + f.write('\n') +f.close() diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_trainval_anns.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_trainval_anns.py new file mode 100644 index 0000000..6a787df --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/coco_trainval_anns.py @@ -0,0 +1,113 @@ +import json,cv2 +from collections import defaultdict + +ban_path = './data/5k.txt' +with open(ban_path, 'r')as f: + ban_list = f.read().split('\n')[:-1] + ban_list = [i.split('/')[-1] for i in ban_list] + +name_box_id = defaultdict(list) +id_name = dict() + +coco_dataset_path = '/opt/npu/dataset/coco/coco2014' + +f = open( + coco_dataset_path + "/annotations/instances_train2014.json", + encoding='utf-8') +data = json.load(f) +annotations = data['annotations'] +for ant in annotations: + id = ant['image_id'] + name = coco_dataset_path + '/train2014/COCO_train2014_%012d.jpg' % id + cat = ant['category_id'] + + if cat >= 1 and cat <= 11: + cat = cat - 1 + elif cat >= 13 and cat <= 25: + cat = cat - 2 + elif cat >= 27 and cat <= 28: + cat = cat - 3 + elif cat >= 31 and cat <= 44: + cat = cat - 5 + elif cat >= 46 and cat <= 65: + cat = cat - 6 + elif cat == 67: + cat = cat - 7 + elif cat == 70: + cat = cat - 9 + elif cat >= 72 and cat <= 82: + cat = cat - 10 + elif cat >= 84 and cat <= 90: + cat = cat - 11 + + name_box_id[name].append([ant['bbox'], cat]) + + + + +f = open( + coco_dataset_path + "/annotations/instances_val2014.json", + encoding='utf-8') +data = json.load(f) +annotations = data['annotations'] +for ant in annotations: + id = ant['image_id'] + name = coco_dataset_path + '/val2014/COCO_val2014_%012d.jpg' % id + cat = ant['category_id'] + + if cat >= 1 and cat <= 11: + cat = cat - 1 + elif cat >= 13 and cat <= 25: + cat = cat - 2 + elif cat >= 27 and cat <= 28: + cat = cat - 3 + elif cat >= 31 and cat <= 44: + cat = cat - 5 + elif cat >= 46 and cat <= 65: + cat = cat - 6 + elif cat == 67: + cat = cat - 7 + elif cat == 70: + cat = cat - 9 + elif cat >= 72 and cat <= 82: + cat = cat - 10 + elif cat >= 84 and cat <= 90: + cat = cat - 11 + + name_box_id[name].append([ant['bbox'], cat]) + + + + + + +f = open('data/coco2014_trainval.txt', 'w') +ii = 0 +for idx, key in enumerate(name_box_id.keys()): + if key.split('/')[-1] in ban_list: + continue + + print('trainval', key.split('/')[-1]) + + f.write('%d '%ii) + ii += 1 + f.write(key) + + img = cv2.imread(key) + h,w,c = img.shape + + f.write(' %d %d'%(w,h)) + + box_infos = name_box_id[key] + for info in box_infos: + x_min = int(info[0][0]) + y_min = int(info[0][1]) + x_max = x_min + int(info[0][2]) + y_max = y_min + int(info[0][3]) + + box_info = " %d %d %d %d %d" % ( + int(info[1]), x_min, y_min, x_max, y_max + ) + f.write(box_info) + f.write('\n') +f.close() diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/convert_weight.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/convert_weight.py new file mode 100644 index 0000000..87f115b --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/convert_weight.py @@ -0,0 +1,38 @@ +# coding: utf-8 +# for more details about the yolo darknet weights file, refer to +# https://itnext.io/implementing-yolo-v3-in-tensorflow-tf-slim-c3c55ff59dbe + +from __future__ import division, print_function + +import os +import sys +import tensorflow as tf +import numpy as np + +from model import yolov3 +from utils.misc_utils import parse_anchors, load_weights + +num_class = 80 +img_size = 416 +weight_path = '../yolov3-tf2/data/darknet53.conv.74' +save_path = './data/darknet_weights/darknet53.ckpt' +anchors = parse_anchors('./data/yolo_anchors.txt') + +model = yolov3(80, anchors) +with tf.Session() as sess: + inputs = tf.placeholder(tf.float32, [1, img_size, img_size, 3]) + + with tf.variable_scope('yolov3'): + feature_map = model.forward(inputs) + + saver = tf.train.Saver(var_list=tf.global_variables(scope='yolov3')) + + load_ops = load_weights(tf.global_variables(scope='yolov3'), weight_path) + + sess.run(tf.global_variables_initializer()) + sess.run(load_ops) + saver.save(sess, save_path=save_path) + print('TensorFlow model checkpoint has been saved to {}'.format(save_path)) + + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/5k.txt b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/5k.txt new file mode 100644 index 0000000..88a95b0 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/5k.txt @@ -0,0 +1,5000 @@ +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000164.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000283.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000599.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000764.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001554.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002621.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002684.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002764.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002894.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003103.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003134.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003326.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004092.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004283.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004764.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006091.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006153.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006789.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006847.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007256.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007873.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007899.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008010.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008179.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008190.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008204.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008350.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008853.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009105.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009217.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009270.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009553.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009908.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010249.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010613.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010764.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011099.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011181.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011184.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011721.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011813.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012047.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012115.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012370.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012375.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012448.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012543.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012897.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012966.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013333.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013357.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014029.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014056.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014108.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014591.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015386.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015599.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015709.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015735.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015883.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015968.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015987.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016030.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016228.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016257.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016327.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016410.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016995.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018358.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018783.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019042.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019923.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020175.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020268.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020349.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020553.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020947.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021161.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021639.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022002.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022191.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022492.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023309.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023995.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024247.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024396.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025191.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025293.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025360.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025685.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025807.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025989.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026026.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026430.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026534.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026560.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026690.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026734.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026908.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026946.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027787.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027789.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027946.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028039.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029019.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029030.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029577.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029648.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029697.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029709.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029719.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030034.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030793.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030998.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031151.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031164.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031247.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031521.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031817.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032510.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032625.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032715.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032947.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033158.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033243.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033345.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033499.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033835.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034056.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034183.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034689.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034892.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035326.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035474.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035498.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035738.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035966.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036049.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036508.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038190.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038465.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038685.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038825.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039480.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039697.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039731.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039743.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040426.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041373.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041635.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042492.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042743.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043165.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043218.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043404.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043614.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043816.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043850.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044309.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044478.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044536.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044575.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044612.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044699.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044989.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045433.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045685.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045728.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046329.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046919.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047131.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047552.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048504.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048731.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048840.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048905.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048910.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049881.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050177.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050324.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050481.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050844.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050896.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051249.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051250.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052020.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052290.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052425.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052575.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052871.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052982.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053183.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053949.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054301.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054334.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054490.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054603.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054643.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054959.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000055167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056326.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056541.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056624.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056633.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056724.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057091.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057238.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057454.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058232.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058636.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058800.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058949.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059202.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060010.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060049.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060126.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060448.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060859.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060899.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061658.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061836.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062041.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062198.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062726.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063047.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063715.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063939.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064796.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064915.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065258.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065430.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065465.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065942.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066064.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066243.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066355.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066412.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066423.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066427.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066502.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066519.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067207.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067218.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067412.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067532.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068204.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068435.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068546.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068674.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068745.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069077.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069356.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069577.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000070493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000070896.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071023.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071301.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071345.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071451.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071986.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072020.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072052.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072797.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072860.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073039.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073729.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074268.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074789.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074963.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075033.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075372.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075646.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075713.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075786.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076257.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076521.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076572.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076844.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077181.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077184.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077396.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077415.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079544.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079689.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080104.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080219.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080747.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081287.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081394.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081552.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082431.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082794.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082807.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082847.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082889.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083036.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083065.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083142.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083275.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084447.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084592.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084674.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084762.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084980.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085292.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085353.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085674.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085813.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086011.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086133.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086136.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086249.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086357.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086429.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086646.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087354.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087489.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087638.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088360.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088507.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088560.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088859.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088902.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089258.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089285.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089391.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089487.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089670.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091402.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091612.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091766.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091899.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092093.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092939.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093175.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093607.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093806.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094033.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094046.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094052.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094501.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094619.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095670.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095770.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096110.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096288.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096327.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096654.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096762.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096769.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096998.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097048.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097080.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097240.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097577.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097682.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097748.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097868.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097899.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098018.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098194.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098280.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098283.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098599.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099026.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099260.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099996.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100083.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100245.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100343.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100428.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100582.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100726.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100909.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101567.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101703.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101884.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102421.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102439.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102446.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102466.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102478.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102598.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102906.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103122.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103272.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103431.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103538.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103747.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104002.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104455.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104893.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105102.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105264.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105291.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105647.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105866.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106120.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106641.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106793.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107183.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107304.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107741.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107831.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108051.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108152.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108212.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108761.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109092.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109216.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109819.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110638.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110881.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110884.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111024.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111179.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111878.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112298.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112394.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112818.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113977.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114033.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114926.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115069.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116936.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117127.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117191.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117201.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117237.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117404.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117718.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117786.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117899.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118401.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118546.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119232.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119445.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120248.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120682.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120767.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120935.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121591.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121633.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121817.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122039.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122747.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124013.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124018.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124243.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124647.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125051.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125228.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125815.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125983.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126064.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126216.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126253.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126833.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126895.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127496.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127514.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127801.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127955.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128748.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129362.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129735.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130516.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130555.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130613.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130651.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130663.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130699.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130712.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131115.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131138.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131207.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131431.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132042.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132143.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132182.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132272.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132375.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132510.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132861.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132992.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133237.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133999.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134133.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134198.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134935.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135029.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135356.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135670.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135900.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136181.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136285.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136501.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136552.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136718.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136780.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136793.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136915.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137265.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137294.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137301.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137451.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137507.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137658.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137803.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138573.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138648.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138814.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138937.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139140.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139141.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139260.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139294.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139436.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139871.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140068.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140664.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140987.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141807.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142092.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142318.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142941.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142949.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143143.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143174.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143217.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143769.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143792.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144058.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144228.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145093.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145781.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145824.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145831.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146253.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146614.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147030.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147058.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147921.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148719.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148792.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148955.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149052.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149268.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149329.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149767.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150026.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150080.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150301.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150538.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150763.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150888.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151159.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151558.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151657.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151962.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151970.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152245.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152330.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152340.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152499.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153011.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153061.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153697.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153896.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154053.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154363.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154423.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154854.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155131.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155142.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155811.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155861.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156292.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156466.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156636.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156834.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157352.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157365.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157465.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157592.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157938.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158272.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158412.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158999.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159282.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159606.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160345.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160607.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160772.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160828.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160941.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161781.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161810.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161861.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162280.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162445.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162459.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163020.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163138.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163219.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163260.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163290.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163316.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163543.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164121.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164366.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164420.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164835.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164983.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165056.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165353.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165752.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165937.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166642.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166896.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167152.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167598.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168353.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168455.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168832.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168909.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169505.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169800.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170190.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170194.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170401.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170442.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170813.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170914.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170950.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170955.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171335.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171942.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172710.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172935.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172946.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173401.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173832.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173897.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174018.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174425.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174690.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174904.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175612.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175825.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175908.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176288.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176362.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176606.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176828.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176906.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177069.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177375.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177575.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177838.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177856.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178810.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179069.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179430.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179487.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179642.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179765.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180011.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180154.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180541.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180917.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181256.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181449.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181572.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181586.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181745.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181969.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182021.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182240.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182362.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182369.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182398.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182523.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183199.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183217.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183348.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183364.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185366.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185472.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185621.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185697.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185721.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186422.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186637.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186873.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186977.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186991.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187036.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187054.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187199.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187249.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187349.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187424.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187513.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188132.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188311.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188439.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188460.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188534.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188592.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188918.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189067.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189078.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189305.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189365.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189371.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189427.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189436.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190204.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190546.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190767.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190841.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190853.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191013.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191117.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191169.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191390.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191761.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191919.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192153.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192154.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192212.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192607.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192817.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192834.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193108.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193245.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193332.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193405.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193798.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193881.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194158.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195798.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195851.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195897.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196141.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196311.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196355.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196415.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196453.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196798.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197097.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197191.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197528.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197609.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197796.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197918.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198641.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198752.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198811.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199358.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199437.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199449.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199481.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199575.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199602.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199771.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200457.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200572.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200638.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200703.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201111.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201348.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201646.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201918.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201934.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201970.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202138.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202658.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202797.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202944.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203061.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203382.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203416.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203460.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203845.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204036.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204232.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204256.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204360.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204448.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204502.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204935.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205258.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205782.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206770.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206958.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207041.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207507.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207670.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207925.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208283.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208311.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208376.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208663.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208793.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209142.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209773.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209808.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210374.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210439.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210457.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210749.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210883.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211163.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211186.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211498.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212054.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212077.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212080.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212647.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212688.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212817.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213033.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213361.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213758.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214274.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214853.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215394.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215471.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215554.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215708.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216198.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216581.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216710.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216841.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217016.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217285.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218310.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218404.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218439.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218687.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218926.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218947.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219514.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219657.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220041.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220182.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220307.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220511.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220808.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221669.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221708.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222863.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222903.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223032.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223414.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223747.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223777.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224093.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224111.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224238.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224523.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224724.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225175.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225312.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225518.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225603.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226154.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226419.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226496.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226498.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226662.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226917.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226967.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227032.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227048.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227468.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227511.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227709.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227741.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228011.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228013.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228558.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228771.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229221.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229234.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229553.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229631.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229713.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230265.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230454.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230615.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230619.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230780.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231364.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231508.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231991.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232121.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232287.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232453.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233042.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233305.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233327.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233376.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233446.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233567.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233919.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233950.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233968.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234182.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234370.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234766.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235575.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235933.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236010.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236068.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236535.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236766.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237277.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237316.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237357.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237777.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237920.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237984.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238573.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238598.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238806.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239148.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239318.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240102.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240903.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240918.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240960.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241113.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241291.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241319.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241396.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241638.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241728.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241868.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241889.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242422.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242423.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242523.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242934.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243134.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243190.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243442.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243699.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243825.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244050.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245102.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245426.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246425.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246649.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246672.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247057.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247234.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248069.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248089.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248631.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249219.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249599.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250282.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250301.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250370.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250427.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250745.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250766.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250794.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250917.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250939.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251019.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251195.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251330.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251888.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251920.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252292.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252444.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252549.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252625.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252748.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253036.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253630.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253688.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254164.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254454.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254986.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255529.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255649.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256095.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256529.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256547.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256771.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256838.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256859.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257046.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257336.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257471.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257941.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258023.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258628.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259099.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259335.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259342.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259952.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260307.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260370.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260818.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260922.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261182.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261787.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262228.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262325.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262347.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262651.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262810.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262895.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262900.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262987.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000263425.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000263505.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264013.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264819.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265374.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265851.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266115.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267115.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267127.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267521.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267844.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267998.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268435.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268541.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268710.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268885.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268941.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268987.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269280.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269311.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269866.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270474.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270515.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270544.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270918.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271117.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271240.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271546.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271900.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272117.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272212.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272615.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272635.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272718.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272728.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272880.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272889.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273118.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273442.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273688.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273712.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273728.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274066.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274083.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274292.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274957.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275270.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275496.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275863.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276840.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276863.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277046.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277051.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277518.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277614.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277694.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277984.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278435.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278582.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278967.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278977.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279024.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279154.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279521.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279784.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279850.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280036.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280293.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280766.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281019.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281163.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281508.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281601.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281609.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281722.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282143.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283097.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283113.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283254.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283438.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283642.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283659.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283977.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284253.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284426.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284749.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284789.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285106.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285302.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285433.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286146.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286285.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286503.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286654.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286708.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286719.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286813.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286994.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287396.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287484.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287506.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288933.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289194.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289201.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289474.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289633.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289949.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289960.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289995.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290165.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290477.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290515.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290602.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290659.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291380.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291404.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291784.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291866.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292032.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292206.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292330.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292363.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292446.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292649.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292995.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293002.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293071.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293133.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293296.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293333.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293895.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294284.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294958.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295016.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295574.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295728.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295769.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296032.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296136.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296492.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296745.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296825.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296897.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297269.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297444.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297520.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297970.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298067.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298691.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298732.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298809.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299492.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299553.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300330.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300472.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300814.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301221.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301765.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301971.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302110.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302243.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302298.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302302.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302318.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302405.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302572.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302710.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302997.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303253.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303305.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303549.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303937.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304159.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304186.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304252.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304347.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304390.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304815.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304827.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305343.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305480.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305526.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305803.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305962.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306426.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306603.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306914.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306952.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307206.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307438.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307523.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307873.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308512.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308543.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308759.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308900.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309302.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309655.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309692.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310202.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310545.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310858.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311465.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311904.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312144.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312416.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312544.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313034.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313057.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313922.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314023.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314992.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315219.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315249.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315601.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315621.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315792.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315824.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315962.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316138.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316254.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316438.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316505.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317033.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317325.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317424.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317560.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318722.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319579.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319654.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319687.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319721.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319726.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320078.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320480.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320482.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320832.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320893.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321118.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321258.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321647.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322174.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322352.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322724.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322829.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322845.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322895.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323186.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323291.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323758.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323853.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323919.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323925.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324789.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325153.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325328.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325410.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326462.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326959.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327433.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327845.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327892.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328068.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328374.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328462.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328499.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328838.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329375.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329421.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329447.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330065.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330248.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330515.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330734.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331097.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331307.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331349.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331372.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331959.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332502.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332545.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332582.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332908.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333034.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333150.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333436.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333808.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333845.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334471.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335177.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335328.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335800.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335814.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335861.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335887.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335992.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336309.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336427.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336949.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337274.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337666.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337827.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338105.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338428.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338532.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338581.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339202.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339356.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339470.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339943.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340451.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340529.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340654.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340778.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340781.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340930.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341778.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342142.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342762.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343504.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343543.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343680.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343967.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344045.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344498.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344862.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344897.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344903.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345136.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345998.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346642.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346645.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347390.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347506.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347630.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347724.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347747.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347768.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347772.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347819.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347982.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348091.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348140.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348216.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348474.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348913.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349310.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349402.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349469.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349480.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349489.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350405.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350447.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350648.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350694.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350851.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351183.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351787.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351840.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352334.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352478.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352481.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352538.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353028.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353298.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353666.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354061.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354460.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355256.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355817.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355871.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355919.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356002.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356092.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356368.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356406.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356505.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356612.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357335.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357475.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357529.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357743.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357829.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357944.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358191.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358763.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358833.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358901.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359118.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359126.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359442.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359947.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360512.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360700.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360926.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361029.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361221.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361265.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361268.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361386.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361819.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361831.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361885.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361923.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362026.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362159.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362971.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363508.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363831.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364399.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364429.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364493.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364567.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365094.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365103.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365121.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365207.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365214.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365511.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365983.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366111.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366199.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366615.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367558.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367582.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367608.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367626.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367893.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368367.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368648.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368752.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369294.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369309.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369685.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369840.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369887.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369997.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370513.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370602.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370701.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370749.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371326.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371552.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371841.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372362.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372433.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372471.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372718.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373140.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373284.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373375.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373571.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374111.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374641.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374734.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375198.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375763.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375902.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375914.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376295.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376307.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376358.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376441.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376900.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376996.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377080.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377355.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377984.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378099.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378284.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378448.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378712.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378831.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379108.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379332.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379584.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380106.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380414.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380609.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380639.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380892.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381709.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382333.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382715.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383039.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383065.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383384.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383462.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384333.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384348.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384554.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384827.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385057.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385997.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386134.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386457.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386786.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387150.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387369.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387655.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387850.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388325.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388721.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388881.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388903.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389056.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389316.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389340.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389604.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389738.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389843.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390068.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390238.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390685.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390689.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390769.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390902.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391225.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391365.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391689.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391862.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392364.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393282.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393372.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393674.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393692.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393794.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394132.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394157.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394352.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395290.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395801.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396167.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396369.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396526.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396997.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000397322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000397475.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398045.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398438.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398519.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398604.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398606.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398637.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398866.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398905.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399545.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399567.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399655.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399741.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399832.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399865.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399991.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400046.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400202.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401028.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401092.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401384.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401425.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401591.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401860.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401892.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402334.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402887.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402909.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403639.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403950.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404601.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404602.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404889.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405104.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405530.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405970.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406053.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406217.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406451.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406841.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407650.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407960.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408120.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408336.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408534.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408830.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408873.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409115.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409181.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409964.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410068.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410612.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410724.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411187.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411405.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411768.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411821.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412204.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412240.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412364.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412437.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412510.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412592.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412604.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412753.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413616.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413950.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413959.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414122.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414216.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415020.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415163.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415770.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415798.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415841.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415885.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415958.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416385.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416405.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416489.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416885.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417416.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417946.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418275.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418288.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419216.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419371.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419386.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419558.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420059.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420546.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420610.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420929.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000421361.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000421401.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000421673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422424.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422536.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422706.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422778.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422833.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423048.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423104.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423613.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423715.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424155.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424192.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424247.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424293.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424633.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425324.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425371.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425462.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425475.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425526.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425848.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426532.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426917.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427782.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428231.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428234.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428248.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428366.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429293.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429369.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429718.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429996.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430056.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430238.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430518.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430744.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430973.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431047.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431257.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431472.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431521.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431573.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431615.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432276.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432534.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433554.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433845.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433883.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433892.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433963.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433980.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434006.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434060.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434219.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434410.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434657.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434787.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434915.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435206.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435391.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435466.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435598.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435671.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435703.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435910.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436350.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436603.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436694.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436738.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437284.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437298.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437459.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437923.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438103.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438807.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438851.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438999.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439651.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439777.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440617.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440646.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440706.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441072.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441247.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441496.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441500.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441695.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441824.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441863.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441969.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441974.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442210.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442223.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442417.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442523.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442952.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443334.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443343.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443361.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443498.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443591.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443797.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443969.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444304.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444390.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444495.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444626.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444888.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445200.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445512.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445567.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445594.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445602.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445643.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446324.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446358.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447354.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447378.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447501.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448053.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448114.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448117.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448256.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448511.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448690.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448786.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448923.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448998.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449031.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449338.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449412.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449466.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449872.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449888.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449903.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450355.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450458.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450596.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450655.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450695.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451120.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451305.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451345.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451440.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451468.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451683.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452195.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452218.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452308.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452516.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452759.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452947.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453104.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453162.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453166.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453926.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454161.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454414.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454561.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454741.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455299.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455325.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455343.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455355.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455365.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455384.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455395.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455414.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455515.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455767.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456143.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456420.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457217.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457262.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457436.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457901.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458054.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458103.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458275.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458846.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459164.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459400.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459590.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459933.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460053.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460149.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460652.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460684.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460757.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460967.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461123.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461275.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461331.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462330.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462466.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462677.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462953.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462982.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463084.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463283.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463398.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463555.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463898.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463913.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000464248.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000464390.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465588.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465692.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465715.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465735.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465887.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465986.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466347.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467116.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467138.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467477.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467705.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467726.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467821.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468354.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468954.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469096.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469356.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469424.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469982.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470161.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470370.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470513.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471394.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471858.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471893.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472034.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472078.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472088.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472211.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472643.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472691.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472762.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472821.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473124.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473406.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473415.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473839.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474021.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474028.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474078.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474110.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474384.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474410.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474600.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474609.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474906.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475208.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475244.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475398.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475572.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475586.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475906.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475944.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476120.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476282.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476300.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476335.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476398.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476455.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476647.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476856.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476873.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476925.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477305.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477477.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478120.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478136.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478184.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478433.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478490.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478621.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478664.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479008.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479078.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479099.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479334.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479938.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479948.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480345.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480472.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480726.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481327.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481398.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481404.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481446.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481890.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482007.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482021.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482477.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482487.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482735.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482774.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483179.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483994.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484066.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484225.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484397.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484674.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485673.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485740.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486175.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486232.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486568.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486576.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486580.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486632.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486803.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486991.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487222.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487282.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487391.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487630.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487659.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488075.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488250.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488360.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488385.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488386.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488664.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488979.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489019.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489304.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489475.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489764.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490022.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490051.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490105.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490286.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490338.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490505.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490860.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490952.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491169.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491336.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491449.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491481.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491835.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491836.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492246.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492323.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492363.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492605.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493132.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493196.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493206.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493772.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493814.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494144.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494320.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494438.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494578.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494731.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494869.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495125.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495491.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495519.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495734.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495852.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496152.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496324.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496360.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496409.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496450.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496554.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496687.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497099.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497312.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497348.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497488.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497928.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498274.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498346.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498392.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498650.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498709.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498765.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498807.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499093.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499105.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499313.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499391.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499393.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499755.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499810.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500062.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500139.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500175.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500464.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500514.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500723.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500829.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500878.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501116.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501122.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501527.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501824.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501835.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502168.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502336.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502854.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502895.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502910.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503097.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503202.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503207.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503467.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503772.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503826.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503951.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503983.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504152.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504353.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504452.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504559.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505014.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505043.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505132.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505516.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505528.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505650.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505733.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505739.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505754.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505792.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505814.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505862.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505945.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505967.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506335.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506357.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506449.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506515.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506736.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507684.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507783.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507927.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507935.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508119.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508586.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508811.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508822.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508985.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509185.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509258.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509379.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509423.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509526.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509577.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509695.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509855.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510343.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510707.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510798.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510942.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511076.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511236.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511403.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512145.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512248.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512254.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512307.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512630.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512722.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512776.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513073.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513342.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513507.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513585.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513681.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514241.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514525.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514586.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514682.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514913.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514990.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515077.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515176.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515350.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515485.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515531.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515777.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515779.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515904.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515993.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516026.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516316.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516318.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516476.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516804.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516893.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516913.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517318.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517596.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517619.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517737.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517821.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517987.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518039.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518213.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518234.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518324.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518365.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518584.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518716.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518729.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518818.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518850.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518914.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518968.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519055.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519271.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519316.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519387.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519542.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519565.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519649.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519874.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520147.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520338.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521142.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521359.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521613.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521634.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521669.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521689.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521943.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522163.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522613.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522702.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523230.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524002.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524064.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524173.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524263.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524333.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524533.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524536.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524742.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524799.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524992.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525021.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525087.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525118.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525170.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525373.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525849.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525927.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525971.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526040.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526089.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526342.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526371.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526418.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526560.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527447.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527535.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527558.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527573.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527750.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528314.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528386.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528643.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528738.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528980.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529004.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529065.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529215.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529270.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529455.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529494.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529668.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529907.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529944.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530013.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530052.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530461.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530624.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530630.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530854.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531111.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531189.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531563.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532009.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532126.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532159.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532212.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532690.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532695.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532773.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532827.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532867.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533097.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533261.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533434.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533511.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533532.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533688.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533816.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534018.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534349.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534377.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534601.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534639.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534679.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535156.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535198.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535591.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535858.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535889.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535952.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535997.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536028.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536154.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536486.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537025.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537280.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537369.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537604.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537620.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537636.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537954.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538005.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538153.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538451.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538463.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538589.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538596.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538741.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538775.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539224.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539251.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539453.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539551.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539678.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540098.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540107.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540172.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540186.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540264.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540372.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540414.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540483.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540502.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540816.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540860.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541071.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541474.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541773.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541879.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541991.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542234.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542792.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543112.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543118.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543203.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543220.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543281.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543492.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543581.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543660.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543676.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543696.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543782.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544044.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544071.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544140.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544607.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544611.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545407.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545475.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545734.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545756.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545788.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545958.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546226.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546229.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546388.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546424.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546524.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546569.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546622.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546649.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546667.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546760.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546782.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546962.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547137.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547519.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547583.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547738.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547858.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548126.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548339.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548795.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548882.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549063.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549242.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549351.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549410.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549518.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549713.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549936.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550627.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550722.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550862.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551243.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551336.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551669.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000552507.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000552837.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553074.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553165.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553253.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553306.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553353.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553443.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553664.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554037.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554100.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554255.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554266.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554291.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554302.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554340.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554347.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554537.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554607.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554618.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554625.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554711.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554727.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554767.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554978.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555035.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555110.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555180.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555197.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555267.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555322.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555412.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556091.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556178.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556193.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556278.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556562.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556633.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556641.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556751.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556758.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557016.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557402.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557556.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557564.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557595.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557731.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557785.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557896.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557916.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557923.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557965.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557977.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558539.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558587.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558661.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558784.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558864.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558955.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559047.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559348.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559656.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559778.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559790.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560000.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560235.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560279.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560373.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560626.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560662.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560721.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560911.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561357.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561399.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561570.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561619.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561698.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562101.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562227.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562557.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562582.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562708.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562805.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562834.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562875.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562906.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562943.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562994.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563015.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563641.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563665.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563730.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563871.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564109.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564127.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564129.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564289.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564317.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564366.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564934.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564940.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565239.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565389.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565479.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565543.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565597.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565670.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565691.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565761.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565957.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566038.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566103.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566135.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566298.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566518.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566538.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566644.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566908.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566941.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567093.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567171.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567205.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567315.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567340.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567383.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567686.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567801.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567812.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567886.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568082.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568131.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568132.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568195.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568259.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568265.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568555.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568623.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568653.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568675.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568717.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568956.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568961.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569001.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569272.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569273.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569319.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569432.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569437.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569972.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569976.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570188.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570456.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570471.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570680.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570688.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571012.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571497.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571550.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571584.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571635.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571636.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571746.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571931.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572017.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572042.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572051.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572090.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572233.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572303.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572347.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572408.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572517.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572802.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572850.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573058.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573067.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573209.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573363.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573791.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573853.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574108.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574411.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574413.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574454.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574509.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574725.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574823.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574988.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575020.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575079.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575081.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575194.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575428.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575624.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575957.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576070.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576085.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576566.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576629.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576654.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576704.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576714.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576820.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576857.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576955.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576981.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577128.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577160.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577161.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577169.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577212.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577385.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577522.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577584.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577847.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577877.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577912.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577924.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578225.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578237.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578341.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578344.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578427.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578871.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578878.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579003.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579240.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579321.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579337.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579548.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579885.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579902.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580027.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580029.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580294.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580540.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580608.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580693.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580720.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580870.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580975.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581332.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581593.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581655.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581731.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581781.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581887.jpg +/opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581899.jpg diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco.names b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco.names new file mode 100644 index 0000000..ca76c80 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco.names @@ -0,0 +1,80 @@ +person +bicycle +car +motorbike +aeroplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +sofa +pottedplant +bed +diningtable +toilet +tvmonitor +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco2014_minival.txt b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco2014_minival.txt new file mode 100644 index 0000000..dabff6b --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/coco2014_minival.txt @@ -0,0 +1,4954 @@ +0 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194306.jpg 640 425 16 232 103 415 206 2 0 0 640 419 +1 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185156.jpg 640 418 16 98 284 231 406 6 1 92 638 263 0 35 109 97 361 +2 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579321.jpg 640 498 16 200 89 600 340 0 94 0 334 211 +3 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494869.jpg 427 640 16 0 421 154 629 0 181 88 361 435 44 330 227 351 243 45 310 237 346 261 45 342 236 392 264 39 154 156 166 204 45 170 186 194 200 45 369 253 426 282 0 197 321 288 519 +4 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278435.jpg 427 640 16 77 454 134 529 3 30 209 247 607 0 33 129 258 551 0 0 0 62 117 0 71 0 110 113 0 118 0 167 110 26 87 245 193 342 +5 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047263.jpg 640 480 16 222 186 252 227 0 344 96 373 181 7 373 94 485 190 +6 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151988.jpg 640 480 16 321 292 480 347 0 177 26 407 372 0 301 145 615 268 13 142 229 567 355 24 149 276 260 378 39 381 277 406 359 73 275 144 296 169 24 321 205 366 237 +7 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098194.jpg 640 427 16 208 194 368 335 16 483 206 575 338 2 36 44 570 325 +8 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373193.jpg 500 281 16 164 122 322 263 0 286 39 390 218 61 83 45 172 154 +9 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351840.jpg 480 640 16 181 231 366 444 2 131 244 320 355 7 0 0 480 632 2 3 227 61 323 +10 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307993.jpg 640 429 16 363 171 444 249 2 71 0 639 422 0 228 55 437 346 73 434 201 577 253 +11 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187349.jpg 640 480 16 298 71 501 277 0 58 153 241 268 2 355 75 445 123 2 530 419 565 441 10 558 431 562 438 11 445 424 450 432 7 259 73 330 124 +12 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424378.jpg 375 500 16 0 256 125 499 0 109 6 374 494 +13 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319055.jpg 640 320 16 484 224 518 246 2 565 194 616 216 9 522 102 535 142 9 545 112 562 145 9 609 142 628 174 9 629 142 639 175 0 469 184 497 248 0 101 165 139 222 0 8 192 28 220 26 465 215 470 220 0 356 199 374 228 2 615 195 639 219 9 561 142 579 171 9 530 149 543 168 +14 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365207.jpg 640 588 16 464 273 557 355 2 69 260 210 462 2 417 177 594 519 13 375 350 430 379 2 399 306 484 490 +15 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018783.jpg 640 525 16 316 227 516 412 1 124 286 475 510 2 612 269 639 369 8 414 109 568 245 0 188 123 327 502 24 246 190 328 280 8 352 134 421 196 26 361 361 426 432 +16 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560373.jpg 335 500 16 15 230 192 490 0 53 12 227 435 28 246 61 332 491 0 51 96 80 129 60 232 185 333 249 56 215 200 249 341 60 3 182 60 190 +17 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540502.jpg 640 427 58 6 93 40 127 72 69 111 217 359 45 340 219 380 228 47 355 205 369 213 47 345 217 351 222 49 368 212 380 222 68 327 129 394 158 69 318 203 391 228 70 287 177 326 199 44 254 165 259 180 45 433 211 454 224 49 354 217 365 222 56 2 205 26 290 71 216 202 238 208 75 257 180 265 197 75 271 178 282 198 60 320 203 481 260 60 22 210 34 224 49 360 206 369 212 56 24 233 51 315 +18 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580027.jpg 490 350 58 249 54 326 221 39 51 176 75 229 71 119 208 190 226 71 0 241 37 262 +19 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476925.jpg 640 425 58 527 144 639 248 39 503 347 523 420 39 122 129 134 173 56 31 179 112 294 56 144 166 170 204 56 187 158 198 203 57 73 201 472 416 0 278 181 431 350 74 387 75 411 101 75 103 156 122 183 73 370 382 411 401 73 403 373 439 392 73 335 387 371 405 73 435 369 478 394 75 565 226 580 242 60 74 169 157 224 +20 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515904.jpg 640 428 58 169 159 260 307 58 581 39 630 113 61 104 289 172 336 71 0 208 74 253 75 171 272 218 307 75 581 72 614 113 75 607 68 638 114 +21 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541550.jpg 640 446 58 2 260 144 436 68 1 202 128 283 69 110 226 311 437 71 575 290 638 316 +22 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042492.jpg 640 480 58 112 193 141 218 60 108 202 167 227 0 156 105 250 235 71 486 232 523 249 67 203 132 209 145 69 210 248 367 286 69 356 136 409 266 72 494 120 639 478 56 54 195 135 320 56 132 181 164 233 56 61 183 94 204 41 337 281 353 308 60 88 210 166 306 41 312 275 329 299 68 111 115 168 155 +23 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432125.jpg 640 480 58 182 64 265 161 58 259 3 370 171 58 1 93 76 193 56 59 163 274 286 56 376 180 603 339 60 4 247 637 474 40 223 176 258 272 40 202 181 237 283 42 449 337 492 382 42 476 338 512 372 42 492 337 504 352 45 313 312 410 378 45 401 332 564 420 45 318 282 412 333 55 344 249 453 303 75 104 125 138 171 75 62 118 106 177 73 581 170 602 230 73 380 112 426 180 73 401 123 415 183 73 409 120 432 186 73 429 119 470 186 73 444 121 492 188 73 459 137 479 182 73 470 139 479 182 73 615 171 639 257 73 476 138 493 182 73 624 189 639 259 73 604 179 629 251 75 189 133 237 178 42 496 344 518 366 43 458 356 550 396 43 454 350 538 389 44 164 251 198 271 58 381 0 424 49 73 587 176 602 242 75 73 149 81 158 73 390 0 637 311 +24 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556178.jpg 481 640 58 238 360 307 457 39 314 424 322 458 39 327 421 337 459 39 149 421 161 452 60 133 461 238 634 0 194 363 252 506 72 16 365 131 454 68 383 349 480 401 69 398 463 480 593 39 342 419 353 459 39 144 422 151 443 +25 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199575.jpg 640 480 58 545 26 639 134 15 209 325 329 459 41 89 169 110 207 41 171 154 189 173 43 2 161 42 193 69 336 192 474 324 71 80 178 193 204 41 149 154 169 170 45 255 269 286 285 +26 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307564.jpg 640 480 58 81 33 134 122 39 573 222 590 258 39 565 217 581 258 39 556 206 573 258 39 573 206 581 222 56 357 311 505 471 56 129 255 241 417 56 179 214 209 276 60 184 254 404 335 41 344 254 369 276 42 285 291 336 311 43 245 270 285 281 45 553 256 605 289 69 242 199 378 261 71 158 198 191 215 75 99 89 120 123 43 362 288 378 293 44 364 289 378 294 46 0 450 25 468 46 0 432 21 439 56 400 209 468 337 41 267 238 294 267 50 24 457 72 473 +27 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275270.jpg 640 451 58 159 1 238 198 71 209 197 557 376 14 365 136 398 165 39 233 87 280 203 39 492 123 536 230 41 372 97 400 127 75 562 121 597 175 75 183 107 224 197 +28 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470313.jpg 496 500 58 329 150 356 197 39 414 265 431 297 39 247 298 263 326 0 231 148 386 325 71 162 260 438 342 +29 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543112.jpg 640 427 58 253 81 341 176 2 213 67 247 157 2 36 0 178 202 13 440 73 617 307 2 231 58 309 107 58 0 1 91 312 2 150 31 217 169 +30 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377867.jpg 640 480 58 529 130 619 242 58 139 2 382 261 15 230 267 267 308 1 295 184 480 338 2 425 156 527 241 58 311 187 389 271 58 44 168 143 271 +31 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398606.jpg 240 320 62 71 101 130 149 0 102 108 127 135 0 72 107 98 136 71 220 181 239 206 71 54 190 167 229 +32 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444390.jpg 640 427 62 249 101 281 134 17 404 183 439 224 39 407 215 417 246 39 392 220 402 245 56 598 189 639 331 69 2 254 190 399 71 327 241 422 269 56 375 193 401 206 58 404 175 456 208 72 0 86 87 252 75 526 186 557 237 75 419 191 431 202 39 315 185 322 197 40 247 160 256 177 40 242 160 247 176 40 254 159 262 175 40 265 162 269 173 40 309 160 315 180 40 290 161 295 172 40 282 161 288 172 40 272 162 280 173 40 297 161 303 177 40 238 161 243 176 40 303 159 309 178 +33 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554625.jpg 426 640 62 380 112 420 360 62 339 32 371 207 0 2 73 145 605 0 105 36 217 263 0 84 1 194 65 62 359 68 405 270 64 302 580 371 627 64 337 428 393 451 66 243 505 369 581 66 227 397 338 450 66 214 321 286 358 62 322 0 369 158 64 221 382 290 396 64 308 470 392 499 0 27 166 346 639 0 59 55 160 174 62 306 0 334 71 64 284 312 304 320 66 294 281 337 312 +34 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328462.jpg 640 426 62 484 141 545 191 56 282 266 371 414 56 537 254 593 308 56 202 208 296 425 60 347 179 538 421 0 0 66 249 424 0 275 171 397 398 72 0 56 280 418 65 416 259 437 270 69 408 268 639 425 45 394 246 423 257 45 382 250 403 267 56 278 209 300 223 44 463 269 491 296 +35 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017379.jpg 478 640 62 145 214 310 321 71 379 522 477 575 71 4 590 190 639 0 216 233 263 313 0 157 242 197 313 +36 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089359.jpg 640 480 62 49 75 315 267 62 313 92 579 270 66 104 350 453 433 64 552 386 593 418 64 561 380 639 441 +37 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018750.jpg 500 403 14 186 115 195 125 14 233 186 242 195 14 246 179 250 187 +38 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566038.jpg 480 384 14 128 151 301 248 2 152 0 443 101 +39 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109055.jpg 640 480 15 128 91 469 445 1 2 2 639 473 +40 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114239.jpg 425 640 15 246 238 424 544 0 2 60 253 559 73 187 358 301 412 +41 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489344.jpg 640 428 15 75 217 132 347 15 365 111 558 251 39 445 65 489 152 39 326 30 353 93 61 111 233 282 418 71 348 136 639 296 41 614 137 638 222 61 245 65 406 293 +42 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031392.jpg 500 378 15 89 156 317 253 0 22 77 93 105 2 0 176 9 187 +43 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350075.jpg 640 503 15 41 154 347 408 15 250 36 557 400 45 202 254 570 428 +44 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455365.jpg 640 480 15 355 133 513 418 61 248 161 564 470 +45 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513585.jpg 500 366 15 36 21 442 189 3 46 28 496 359 +46 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554291.jpg 640 428 15 211 78 492 416 57 443 38 639 239 60 3 233 639 427 16 209 69 499 414 45 187 54 511 399 45 105 74 206 128 56 452 32 639 238 64 91 251 211 331 +47 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416668.jpg 640 480 15 258 0 639 384 39 322 0 384 198 39 223 0 319 194 71 2 178 399 262 +48 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395290.jpg 480 640 15 151 116 267 248 2 0 230 479 632 2 1 203 87 295 +49 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003711.jpg 480 640 15 239 17 390 276 2 22 1 478 632 +50 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223747.jpg 500 370 15 39 222 483 369 0 249 98 436 292 59 117 70 499 369 +51 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280736.jpg 640 425 15 284 130 486 372 1 3 1 494 423 +52 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379869.jpg 640 428 15 197 194 397 421 15 323 108 615 314 45 172 258 276 313 +53 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497443.jpg 480 640 15 192 61 479 639 71 1 339 388 628 +54 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041322.jpg 480 640 15 1 163 380 498 74 1 0 145 141 73 152 79 478 142 73 150 131 479 157 +55 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137803.jpg 500 338 17 257 55 393 142 17 119 81 204 151 17 285 216 423 303 0 315 31 348 63 0 348 182 388 250 0 101 180 145 264 0 154 71 191 119 0 165 214 182 269 0 197 214 212 262 0 434 66 457 109 0 467 65 482 107 0 455 63 468 94 17 39 217 162 305 0 10 205 24 258 0 253 211 271 259 0 251 62 261 83 17 8 83 63 145 17 62 83 92 140 0 490 60 499 106 0 0 45 499 299 +56 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230615.jpg 640 480 17 390 317 416 388 2 110 342 206 386 0 389 300 410 325 2 2 347 62 387 2 195 339 279 388 2 48 344 132 388 2 288 339 301 355 2 358 335 368 345 7 300 328 356 371 74 272 257 278 264 2 278 339 293 351 2 454 332 469 338 2 438 334 451 343 2 349 339 371 359 74 252 259 257 264 0 410 315 421 335 +57 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392364.jpg 640 521 17 123 74 290 258 2 44 402 83 421 2 308 398 321 405 2 7 401 36 419 2 37 401 53 413 0 182 84 220 180 9 41 341 52 357 9 41 367 46 381 0 394 404 399 421 9 625 330 634 350 +58 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037675.jpg 640 415 17 84 207 182 388 17 390 289 441 361 0 280 314 282 324 0 284 314 288 325 0 272 313 275 324 +59 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289949.jpg 500 326 17 63 142 164 272 2 150 162 374 251 2 435 167 499 233 0 9 122 60 192 0 342 169 356 192 9 254 116 267 142 0 273 170 294 185 +60 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286813.jpg 640 480 17 4 210 327 447 17 535 267 639 433 0 298 180 472 357 +61 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210883.jpg 640 512 18 239 379 322 493 18 288 351 371 489 18 162 373 264 505 18 0 388 88 509 18 0 377 55 497 18 65 368 125 438 18 238 343 298 385 18 126 347 200 402 18 75 381 180 504 2 483 218 616 286 2 283 217 326 243 0 356 225 456 508 0 435 216 523 478 0 304 216 350 282 0 611 217 632 291 0 206 231 228 258 0 164 214 194 280 0 24 211 35 236 1 141 247 236 288 1 275 259 342 307 2 266 214 290 244 2 101 216 136 250 18 0 346 68 386 18 39 335 89 366 18 102 346 158 379 0 574 231 598 287 2 241 214 270 239 2 0 217 18 266 5 552 173 639 230 7 145 155 244 254 26 500 368 542 447 0 286 233 310 265 2 574 227 639 278 7 338 195 426 258 18 161 326 209 353 +62 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206135.jpg 332 500 19 38 304 119 455 19 172 302 233 439 19 116 307 175 440 19 232 297 300 435 74 140 112 161 132 +63 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173401.jpg 640 426 19 245 180 370 253 19 443 175 585 272 +64 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557016.jpg 640 509 19 357 123 401 152 19 438 122 475 149 19 566 125 583 155 2 1 5 632 459 0 275 97 316 197 0 94 366 578 508 0 510 116 526 139 0 308 107 323 179 3 273 132 314 200 0 274 109 294 127 19 469 123 510 153 19 432 126 455 150 +65 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277542.jpg 640 320 19 190 131 245 218 19 232 130 257 204 19 437 135 484 217 19 348 119 397 217 19 105 135 142 215 2 567 38 639 239 0 292 59 359 181 19 257 126 303 216 17 300 116 361 217 17 417 138 450 213 17 440 135 484 216 17 468 125 508 216 2 616 89 639 256 19 25 151 51 174 19 125 136 156 215 19 417 138 449 214 19 147 136 187 215 19 181 127 222 212 19 78 134 123 219 19 248 119 598 219 +66 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467705.jpg 426 640 39 288 346 328 434 39 362 333 379 433 39 401 326 425 438 39 378 326 406 435 39 344 378 360 431 39 251 227 306 310 39 66 134 94 177 60 54 570 425 631 67 164 366 180 419 45 134 577 214 605 70 2 359 117 438 39 395 331 409 368 41 141 534 199 591 45 310 471 384 505 45 237 490 284 502 39 154 152 186 198 39 109 147 142 199 39 196 267 225 309 68 0 360 118 437 +67 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344498.jpg 640 480 39 222 247 242 333 39 194 265 209 324 27 79 119 91 133 67 170 297 189 308 72 0 102 143 406 60 117 273 499 474 0 3 43 121 474 0 206 122 299 282 0 309 81 468 279 0 378 30 639 471 40 9 286 33 341 45 338 285 468 386 74 297 164 306 174 76 233 330 275 340 40 269 247 287 291 40 317 259 338 289 +68 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028022.jpg 480 640 39 284 16 313 109 39 319 82 327 109 39 342 73 351 110 61 79 442 209 621 39 309 76 320 109 +69 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214274.jpg 640 427 39 241 360 276 426 39 117 368 153 421 0 118 63 312 396 0 345 129 476 367 40 161 367 214 426 45 76 215 164 264 69 565 141 639 283 71 46 328 247 417 40 619 301 639 385 45 67 253 124 285 39 391 305 434 425 39 54 256 70 285 39 476 238 491 259 68 516 224 551 272 +70 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146961.jpg 640 360 39 27 176 57 272 39 287 188 306 245 39 74 163 85 203 0 94 75 195 236 41 324 208 343 236 68 218 48 307 127 71 61 225 210 270 42 197 175 213 178 56 99 289 219 359 71 225 222 289 252 41 371 211 385 228 41 348 215 356 220 45 397 226 441 236 56 263 315 341 358 44 196 174 206 178 45 421 204 461 227 +71 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235839.jpg 360 450 39 150 6 234 301 39 65 4 144 138 0 0 117 279 449 39 0 0 63 310 63 234 0 359 444 +72 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102707.jpg 612 612 39 323 186 478 591 41 477 361 607 604 69 6 373 604 605 +73 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089391.jpg 480 640 39 34 119 63 183 61 57 303 302 559 71 1 314 192 447 +74 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064155.jpg 480 640 39 360 375 370 405 39 369 375 384 405 0 216 314 262 413 71 246 442 332 455 78 103 496 135 534 +75 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204448.jpg 640 480 39 0 240 24 301 41 61 299 89 320 43 117 235 137 257 43 121 232 134 250 44 499 117 511 192 70 185 191 252 227 71 7 276 191 326 44 117 237 135 256 75 450 127 483 195 75 489 128 523 193 76 454 127 479 191 43 130 244 138 252 44 488 114 502 191 68 426 189 615 309 +76 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047775.jpg 640 480 39 437 163 448 203 39 422 151 436 203 79 573 208 585 246 79 499 181 506 216 39 401 175 414 208 71 549 256 639 325 71 393 203 490 254 39 448 156 459 182 +77 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571635.jpg 428 640 39 403 334 426 409 61 71 340 229 507 71 209 317 387 590 39 277 270 297 327 58 381 247 427 341 79 358 406 394 416 79 354 402 380 411 +78 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058232.jpg 640 427 39 206 231 503 276 0 273 194 340 264 0 263 199 286 247 0 408 186 447 239 41 384 227 391 241 41 501 261 512 275 41 190 252 205 262 45 236 238 252 245 45 333 264 358 273 45 226 249 251 262 39 193 233 205 261 45 22 196 38 212 45 173 254 192 260 45 22 229 39 246 45 27 295 45 311 45 22 324 47 346 41 302 257 311 268 +79 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151911.jpg 640 476 39 272 188 286 223 56 101 311 244 468 60 31 294 440 345 72 318 136 420 232 58 346 167 463 242 68 0 187 23 248 69 2 228 92 374 56 259 307 385 466 56 379 281 475 475 56 233 266 323 294 56 129 266 220 294 56 0 348 67 475 71 120 220 217 225 +80 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516805.jpg 640 480 39 465 123 477 152 39 449 117 459 151 39 440 115 450 152 39 420 115 431 153 39 429 115 440 154 39 407 103 420 154 1 414 119 592 320 1 59 54 108 92 0 223 16 244 43 0 237 17 249 45 0 113 38 146 70 13 83 224 543 431 26 457 293 541 363 26 469 262 565 354 1 302 31 340 90 45 423 229 450 246 1 390 50 421 103 24 86 270 156 344 24 38 106 119 195 24 109 95 187 178 39 392 124 412 156 39 372 123 393 156 39 493 189 517 216 45 433 246 448 258 0 1 25 21 74 13 2 160 500 294 39 466 144 478 154 +81 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014629.jpg 640 451 39 230 94 457 166 69 253 264 639 450 0 71 22 413 450 45 250 385 312 425 68 362 14 639 204 74 553 25 589 46 44 388 415 425 450 45 382 351 532 426 +82 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197796.jpg 640 478 39 213 96 229 170 39 282 61 304 168 39 312 57 336 155 39 116 120 152 205 39 229 103 255 174 39 66 84 125 219 71 80 247 376 477 +83 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048910.jpg 480 640 39 69 159 89 211 39 34 296 44 321 56 352 296 373 369 69 435 308 479 526 71 71 313 190 360 41 416 212 428 222 41 429 209 441 222 41 441 210 448 222 41 438 233 446 242 41 409 210 416 223 41 420 234 429 242 41 429 235 436 243 41 409 234 419 243 41 107 193 120 211 56 322 303 371 351 +84 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500464.jpg 430 640 39 264 323 277 369 79 157 32 171 64 71 0 226 211 354 78 139 48 167 86 79 168 45 173 63 +85 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111076.jpg 640 427 39 410 137 435 199 61 66 169 223 400 71 327 156 639 369 0 561 0 638 45 +86 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215255.jpg 640 428 39 241 244 263 294 0 122 141 175 210 71 79 375 281 427 39 199 0 258 41 61 523 397 573 427 +87 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342142.jpg 640 426 39 345 85 364 132 61 108 131 362 365 +88 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203661.jpg 640 480 39 443 188 462 239 56 431 289 506 311 60 172 297 639 470 43 422 173 436 190 43 410 178 422 192 68 1 60 116 133 71 17 234 227 268 43 417 178 428 191 43 422 172 429 180 43 427 188 437 199 56 314 303 401 321 73 563 334 639 377 41 170 21 188 54 41 204 29 224 55 41 190 113 211 129 41 212 117 224 124 45 599 298 625 321 45 194 315 347 372 45 368 184 391 196 56 432 432 552 473 56 548 421 639 473 43 414 202 426 213 +89 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395463.jpg 600 450 39 2 264 53 389 0 117 120 210 191 0 201 120 276 183 0 28 114 132 204 41 421 226 439 250 43 71 312 158 322 69 378 266 449 415 73 489 129 492 141 73 497 117 498 129 0 333 107 407 213 0 0 130 32 207 41 293 167 310 181 41 283 170 295 182 41 218 167 229 186 41 166 172 180 196 73 60 385 155 438 73 493 116 494 127 73 477 129 513 140 0 356 28 599 443 41 284 165 295 169 45 174 245 227 273 73 478 114 481 126 73 490 116 493 128 73 499 114 502 127 45 231 277 319 308 68 306 321 372 396 +90 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341397.jpg 613 640 39 99 236 111 292 39 501 370 516 409 39 520 369 540 419 61 488 348 603 526 39 493 362 510 403 +91 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415841.jpg 480 640 39 296 248 314 285 72 1 108 261 634 71 349 303 430 335 43 293 278 303 319 43 302 281 309 315 44 270 277 281 289 42 287 286 294 314 43 278 286 286 313 44 282 291 289 311 +92 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332908.jpg 640 480 39 376 31 400 100 45 385 342 419 369 45 104 247 257 332 45 365 351 441 401 39 399 66 417 102 45 473 358 535 394 69 303 384 434 432 +93 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505132.jpg 640 428 39 86 67 110 125 39 64 72 88 132 56 420 243 638 423 71 9 166 206 281 +94 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328757.jpg 500 332 39 53 236 66 274 0 184 61 493 328 44 188 158 314 189 50 298 291 320 306 50 271 290 296 308 68 427 202 499 301 69 59 197 281 331 +95 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523100.jpg 480 640 39 185 119 212 167 39 153 86 186 177 0 251 26 479 261 45 1 327 478 627 49 1 376 475 632 49 83 247 193 334 69 0 80 163 234 39 200 78 228 175 49 128 211 150 235 49 226 229 337 326 +96 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097240.jpg 640 480 39 82 159 130 338 69 229 156 639 451 39 207 191 227 255 44 3 208 38 266 68 296 0 635 86 39 137 200 167 267 69 391 361 639 473 39 194 267 219 324 39 170 272 195 329 39 144 271 171 327 +97 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381031.jpg 640 470 39 0 0 179 358 41 481 0 612 199 41 84 271 203 453 44 254 47 273 197 47 507 182 627 300 54 384 313 513 426 41 187 149 327 310 60 1 121 639 463 68 0 1 385 165 54 257 317 389 426 +98 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435466.jpg 427 640 39 325 214 344 275 56 0 392 63 597 70 241 402 291 453 39 343 219 364 268 56 37 378 78 580 60 0 379 42 419 +99 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195271.jpg 399 640 39 80 163 97 203 39 62 354 85 442 0 73 204 257 636 39 320 373 345 437 74 215 0 271 57 69 277 440 398 639 40 52 58 81 134 40 40 60 65 127 40 99 70 123 124 40 79 77 103 141 40 141 66 153 99 40 121 83 132 120 40 12 46 39 114 40 7 52 32 119 40 131 78 137 113 40 0 68 13 123 69 195 466 291 639 71 0 440 82 450 +100 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568717.jpg 640 383 39 210 158 217 183 56 608 228 639 382 60 315 190 607 379 45 441 200 496 224 68 136 56 203 91 69 49 154 160 297 71 173 180 268 201 39 175 221 182 243 39 168 226 174 243 75 185 172 195 183 39 414 180 459 215 56 580 253 614 381 56 459 272 586 382 +101 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231450.jpg 640 282 39 256 127 267 161 39 266 135 272 155 59 1 174 306 281 72 505 115 584 266 2 70 103 172 144 56 202 203 300 279 41 323 183 332 197 43 344 204 352 215 60 227 184 386 225 68 237 152 297 191 69 320 134 382 187 71 399 151 459 162 43 485 161 495 167 74 356 99 378 123 56 313 166 347 187 +102 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327892.jpg 640 333 39 387 27 410 66 67 115 67 148 94 41 338 36 377 71 63 202 76 412 326 63 437 5 639 262 63 35 110 180 272 66 210 219 404 278 0 0 74 276 327 0 490 193 639 332 +103 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103667.jpg 427 640 39 31 357 45 390 72 375 227 426 426 69 313 301 377 404 71 52 349 123 386 60 180 320 332 477 56 290 391 362 506 56 328 365 367 452 +104 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449466.jpg 488 640 39 33 422 75 553 0 43 117 487 630 71 73 482 183 521 41 101 469 159 536 0 427 131 487 444 43 293 487 331 549 69 0 547 305 628 +105 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107123.jpg 640 480 39 447 344 470 370 39 20 310 40 330 39 1 329 24 353 39 0 343 16 365 61 388 330 562 457 71 35 301 184 455 +106 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065258.jpg 640 480 39 471 306 485 350 56 303 239 362 316 41 389 352 399 365 13 228 347 552 377 41 378 353 389 366 41 412 352 420 365 41 280 351 290 364 41 298 351 313 361 41 352 351 361 366 41 377 351 385 364 45 350 371 371 388 41 402 348 409 364 41 363 352 373 364 41 348 340 358 358 41 382 342 387 350 41 398 348 402 353 41 388 345 393 351 45 217 271 239 286 41 323 338 401 364 +107 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094052.jpg 640 480 39 456 272 467 307 56 192 368 338 479 56 413 398 552 478 56 462 329 518 387 56 256 328 314 369 60 230 346 532 460 41 359 393 390 438 46 258 386 306 422 69 1 309 140 470 71 238 293 294 306 26 362 263 393 297 56 593 237 612 257 68 0 196 111 267 73 468 398 512 421 73 472 302 503 312 73 486 300 518 307 +108 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000164.jpg 640 480 39 389 183 397 209 39 374 189 380 209 39 367 184 374 211 39 383 187 390 211 39 433 280 451 311 72 428 171 524 309 39 463 282 472 318 39 399 161 408 178 39 373 135 383 150 39 404 132 413 147 39 415 131 425 147 56 159 409 310 479 40 153 189 165 217 40 141 190 157 226 40 108 196 122 229 40 58 196 77 233 40 81 195 96 234 40 95 196 106 232 41 146 233 172 253 41 114 236 137 255 41 176 232 196 248 41 196 228 215 243 45 506 221 562 231 68 377 227 430 257 69 274 263 320 297 40 76 194 86 233 40 119 191 134 228 40 133 192 143 227 41 159 231 180 252 41 512 134 527 155 41 532 139 547 152 41 506 146 512 154 41 169 203 186 221 41 133 233 148 253 45 505 211 534 215 45 505 219 561 223 45 509 215 561 220 45 506 212 561 218 45 362 171 375 180 60 372 459 509 473 +109 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119617.jpg 500 333 39 361 245 457 332 39 309 95 347 199 39 277 111 302 189 41 248 237 285 290 44 126 287 140 331 45 1 221 68 295 71 81 140 324 327 43 98 275 130 327 43 310 158 356 184 44 144 66 156 89 44 201 270 236 332 39 268 0 314 68 43 322 136 361 173 43 338 134 373 174 43 360 135 390 178 45 454 213 499 293 +110 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073009.jpg 375 500 39 335 241 352 289 61 140 286 211 391 0 82 95 316 378 71 0 193 151 231 73 168 192 289 278 73 162 397 281 474 73 105 445 243 499 39 354 246 368 293 +111 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106120.jpg 427 640 39 191 124 206 173 61 161 361 345 571 71 73 395 182 495 +112 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365822.jpg 480 640 39 348 281 365 337 56 174 497 244 602 69 131 367 269 498 39 275 269 286 305 75 143 285 158 304 58 127 242 181 304 +113 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034137.jpg 480 640 39 156 170 179 230 41 69 186 109 235 71 116 176 374 307 +114 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528411.jpg 640 480 39 613 61 639 110 0 573 106 639 478 61 550 322 603 478 71 273 269 332 291 56 457 400 545 473 +115 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192440.jpg 640 426 39 382 230 408 271 79 519 20 526 46 79 498 27 509 46 61 202 247 336 420 71 473 284 639 418 39 367 133 387 152 39 385 139 401 154 39 477 240 486 262 39 486 240 502 272 79 129 73 140 84 39 357 234 376 258 +116 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159377.jpg 640 640 39 46 269 66 325 39 262 151 281 200 72 455 170 638 550 0 105 163 231 555 0 303 129 474 585 45 264 318 307 333 45 274 304 308 318 45 309 317 348 334 45 218 313 237 323 71 67 324 133 352 73 249 151 261 201 73 241 152 250 200 73 185 138 195 195 73 483 302 520 345 73 202 149 233 202 73 196 146 204 199 73 232 149 240 204 73 172 138 187 181 +117 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483179.jpg 640 427 39 286 196 297 226 58 171 97 258 253 58 174 139 188 228 61 40 278 241 426 71 255 230 332 248 +118 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193271.jpg 480 320 39 433 132 447 176 39 43 160 58 204 41 253 157 265 169 44 76 162 93 178 45 296 44 318 51 69 135 185 211 300 70 178 149 203 170 40 406 71 416 88 41 306 153 317 171 41 406 104 416 110 68 91 84 177 140 39 137 142 161 177 39 159 142 163 171 39 226 144 237 165 42 69 153 80 178 45 395 48 419 60 45 290 50 321 58 40 414 96 426 109 44 53 157 64 179 71 445 199 479 245 +119 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242422.jpg 640 480 39 180 251 204 326 45 457 271 551 313 47 82 304 131 347 47 466 267 548 284 71 186 301 509 370 43 104 218 124 261 43 114 227 135 262 43 114 235 141 270 43 103 271 119 301 43 153 203 163 215 43 92 228 114 268 43 119 266 131 298 43 151 265 172 296 43 137 238 162 266 43 110 269 122 300 43 126 266 137 296 43 133 227 148 267 47 52 281 74 301 43 132 267 145 296 43 127 211 170 299 +120 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210855.jpg 640 427 39 357 233 370 269 39 345 235 358 270 61 194 254 269 390 71 415 281 504 301 75 384 243 394 269 +121 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556633.jpg 640 427 57 327 333 638 420 59 0 291 248 419 79 296 208 302 214 71 254 226 304 234 +122 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375180.jpg 500 333 56 74 182 131 255 56 36 177 65 201 56 118 174 138 239 60 36 191 106 216 60 1 235 491 332 72 236 115 348 272 68 464 93 499 181 70 397 185 429 207 45 263 72 325 108 58 62 167 102 203 71 112 220 274 286 69 408 224 499 289 58 420 285 498 328 +123 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441247.jpg 640 424 56 221 220 300 347 56 290 202 343 327 56 25 283 223 417 57 526 189 639 417 0 245 163 290 230 0 335 184 387 267 60 54 222 308 343 72 387 122 433 269 74 34 150 53 177 68 128 179 162 212 49 155 228 161 234 49 162 231 166 233 75 82 157 95 174 75 92 201 103 218 75 88 184 96 197 24 468 353 561 421 26 444 231 497 275 56 529 186 639 423 57 21 284 223 423 60 0 366 71 422 69 332 205 360 260 69 130 180 159 213 39 287 205 300 228 46 109 247 121 261 +124 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479008.jpg 500 333 56 304 67 498 329 56 263 89 380 311 56 1 0 180 329 0 160 77 204 151 0 113 44 222 226 0 270 64 335 200 0 193 88 211 141 0 137 161 234 327 0 228 93 263 157 0 220 109 243 149 56 121 71 186 228 56 237 105 256 161 56 194 122 202 136 73 269 74 298 112 0 209 110 221 136 0 208 114 223 146 0 229 100 243 116 56 249 102 275 172 56 236 108 243 121 +125 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117899.jpg 640 425 56 489 184 535 209 56 478 252 569 418 60 397 203 568 284 72 331 108 393 225 74 421 107 434 121 68 288 124 329 145 71 178 182 224 189 +126 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178084.jpg 640 480 56 249 103 344 143 3 1 89 564 459 3 361 0 554 190 56 112 81 170 162 56 0 81 314 221 3 499 64 639 164 +127 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304409.jpg 640 427 56 429 266 465 339 58 484 213 515 250 71 509 261 614 289 75 468 234 479 254 75 494 234 503 252 +128 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221708.jpg 480 640 56 373 266 466 445 56 270 265 383 472 56 210 255 285 423 60 239 263 444 334 56 283 254 328 284 58 309 251 359 294 72 132 171 239 352 71 64 256 101 259 62 426 228 454 261 +129 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254589.jpg 375 500 60 1 338 373 496 0 68 78 322 418 0 1 0 183 350 43 193 98 200 124 43 176 82 184 100 45 47 301 282 472 45 114 175 134 188 45 112 149 157 182 71 301 181 374 278 43 196 92 203 122 43 187 102 191 124 43 190 93 196 123 43 193 91 196 100 43 178 100 185 125 +130 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140006.jpg 640 480 1 496 125 639 238 1 1 137 102 241 3 98 97 297 244 3 328 88 519 257 12 542 93 564 141 +131 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267972.jpg 640 427 1 489 229 549 334 1 320 194 344 258 10 592 190 613 279 26 24 173 61 245 26 393 165 399 182 26 65 228 96 262 0 478 158 545 310 0 311 151 350 242 0 199 150 236 239 0 15 147 94 317 0 387 168 420 226 0 146 153 162 204 0 122 153 134 194 0 133 158 147 205 0 261 155 280 216 0 278 155 300 218 0 79 156 105 234 0 101 150 111 195 0 164 150 172 180 1 353 182 448 247 1 200 183 242 253 11 51 84 80 114 0 246 152 265 206 +132 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390137.jpg 640 263 1 5 126 230 254 0 87 54 185 250 0 513 51 572 218 0 556 88 611 216 13 319 73 400 114 13 250 74 323 114 26 495 89 534 123 1 127 98 296 220 13 498 174 634 215 73 583 127 608 147 +133 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323564.jpg 640 427 1 66 56 563 359 39 304 175 356 237 +134 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105647.jpg 640 429 1 297 273 496 428 1 284 349 377 421 2 215 115 245 137 2 222 107 238 115 5 290 0 637 224 0 302 171 340 240 0 443 143 496 306 0 0 281 131 427 0 26 157 75 263 0 103 149 142 257 0 217 136 257 251 0 174 137 205 178 0 147 146 182 189 0 552 41 621 99 0 502 44 538 101 1 252 241 311 350 1 112 243 204 410 1 261 271 297 365 26 102 168 120 210 26 182 155 211 196 26 144 163 179 204 0 281 159 289 199 1 264 262 304 354 1 284 220 363 327 1 213 235 268 347 1 239 263 265 308 2 211 105 221 116 26 69 213 85 238 0 216 123 232 143 9 24 31 81 113 26 325 202 339 215 0 80 145 112 231 1 217 267 241 307 2 202 127 458 312 2 225 101 233 105 2 246 109 259 129 2 160 133 189 144 0 136 81 408 134 +135 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347982.jpg 640 640 1 206 328 568 573 0 413 211 543 413 0 412 214 429 265 0 278 240 369 411 0 32 209 93 312 40 379 305 391 327 0 368 225 389 296 43 420 307 442 311 74 278 142 323 191 74 471 109 515 156 74 397 103 443 154 0 5 218 35 327 0 528 223 578 282 0 526 219 535 230 56 432 268 581 431 74 200 101 230 165 0 383 225 400 292 +136 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241291.jpg 500 337 1 105 150 154 267 1 159 189 166 243 1 212 153 255 240 2 0 125 27 148 2 289 124 299 130 3 306 142 350 223 3 272 149 298 205 13 410 143 426 159 0 348 106 414 242 26 150 158 163 186 26 142 113 150 151 0 307 115 350 202 0 341 126 348 142 0 95 89 162 245 0 151 90 195 236 0 204 110 250 228 0 246 125 260 154 0 451 121 463 151 0 266 126 301 175 0 300 129 312 141 0 253 127 277 153 0 291 129 302 144 1 151 158 193 246 1 348 142 415 258 1 442 131 449 142 2 206 121 230 134 3 251 144 280 191 3 295 141 303 188 0 401 121 410 134 2 253 123 267 128 3 302 135 312 150 +137 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135670.jpg 375 500 1 196 199 301 372 +138 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087038.jpg 640 480 1 253 271 312 331 0 226 229 237 259 0 257 224 301 321 0 68 238 84 280 0 79 232 107 283 0 98 234 117 280 0 326 223 339 261 1 155 246 169 267 36 298 316 361 363 0 345 173 417 358 0 239 225 249 258 0 167 234 182 271 0 209 231 218 265 0 408 231 425 265 0 204 229 211 263 0 195 228 205 265 0 1 190 639 291 +139 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465692.jpg 640 427 1 284 107 432 240 2 533 150 557 169 0 509 129 529 177 0 325 25 416 202 13 42 165 88 193 +140 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158795.jpg 424 640 1 66 257 185 353 1 268 283 364 376 0 276 223 347 313 24 320 231 343 257 +141 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252625.jpg 500 333 1 288 213 347 257 1 306 212 328 239 0 215 187 232 245 0 332 189 340 198 0 273 188 284 223 0 306 189 318 206 9 378 179 394 202 9 186 126 199 173 9 367 159 374 177 0 289 188 305 217 58 38 241 63 270 0 402 184 413 205 +142 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204360.jpg 500 375 1 225 200 242 258 0 221 163 259 242 0 287 215 338 307 0 266 184 285 233 1 268 208 279 247 5 324 192 349 217 9 46 134 66 153 2 152 202 181 220 2 177 203 189 218 2 180 201 195 217 24 295 240 326 285 1 300 277 318 304 2 361 206 371 225 +143 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317320.jpg 640 425 1 0 5 425 391 3 356 10 491 179 0 323 0 417 156 0 1 1 183 303 +144 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122166.jpg 640 480 1 87 357 129 460 2 320 292 446 401 2 516 301 545 319 2 460 302 508 347 2 367 280 453 357 2 158 264 322 417 0 76 225 154 432 0 505 305 519 342 9 390 251 401 269 9 338 192 344 209 9 324 245 333 265 0 567 298 582 320 9 524 268 528 272 0 162 255 188 323 9 306 237 318 266 9 512 266 517 274 9 581 276 585 287 0 591 300 597 320 0 5 286 35 361 1 546 304 551 314 2 600 296 632 315 3 35 301 84 404 9 492 287 496 296 24 84 296 130 358 2 551 273 566 284 2 535 279 548 294 2 545 284 557 299 7 158 263 323 412 7 460 302 509 346 +145 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348306.jpg 500 375 1 89 185 268 304 39 178 231 197 254 24 105 194 147 235 +146 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012993.jpg 500 333 1 21 151 54 194 5 281 44 474 189 0 21 121 63 176 2 463 120 489 143 3 486 126 500 142 0 486 117 499 139 +147 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436350.jpg 500 375 1 422 230 450 276 2 1 202 79 280 5 116 42 385 345 0 77 186 115 356 0 0 184 23 207 0 424 200 452 265 0 249 136 262 180 0 33 187 59 215 2 69 213 115 252 +148 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507037.jpg 640 480 1 360 313 538 434 1 178 456 337 479 1 132 314 174 341 24 244 401 296 469 24 31 271 64 321 0 0 255 65 410 0 583 276 639 401 0 237 278 273 361 0 301 257 360 471 0 123 279 151 378 0 372 268 410 347 0 421 263 457 390 0 352 274 374 359 0 284 253 330 436 0 229 273 248 353 0 179 264 223 351 0 0 246 25 383 1 0 424 105 473 1 441 328 598 415 1 428 354 443 379 1 277 341 300 376 26 610 298 633 340 26 205 308 225 318 53 121 271 131 273 53 295 303 311 321 0 71 224 138 430 0 150 263 243 360 +149 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459933.jpg 640 480 1 40 234 342 416 1 383 228 521 399 0 462 18 495 84 0 217 27 268 61 0 164 35 177 68 8 159 81 492 172 8 0 65 640 324 +150 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520524.jpg 640 480 1 90 79 433 461 2 266 0 295 23 3 309 1 639 451 +151 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135671.jpg 640 284 1 30 56 135 136 3 134 98 342 270 3 402 60 492 167 3 532 84 639 246 3 479 75 545 193 0 45 0 95 109 0 278 23 302 74 0 481 20 541 80 0 131 29 155 61 0 154 17 179 59 0 150 20 164 36 0 300 10 347 124 0 416 23 479 75 0 113 38 127 93 0 0 30 50 179 0 199 25 239 68 0 338 22 358 99 3 371 60 419 135 24 299 36 320 84 67 45 69 51 75 0 539 40 636 206 0 1 0 630 229 +152 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515289.jpg 639 640 1 264 169 374 419 1 200 144 249 312 1 129 110 180 257 0 248 0 377 313 0 187 24 272 293 0 1 27 25 127 0 111 19 201 232 14 0 525 105 614 25 556 94 588 128 0 459 84 475 109 0 415 81 422 103 0 402 86 408 103 +153 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366111.jpg 500 319 1 131 226 298 301 1 302 225 471 313 1 3 194 95 313 1 0 205 132 290 2 292 169 375 223 0 167 104 238 296 0 0 89 49 207 0 39 142 102 238 9 461 0 487 40 0 138 175 165 263 2 305 160 416 283 0 124 167 137 186 0 384 45 499 314 9 437 0 457 45 +154 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140197.jpg 333 500 1 0 307 132 490 1 188 223 231 323 1 152 206 183 285 0 267 141 332 312 0 247 133 301 269 0 172 143 247 263 0 134 148 182 264 0 1 112 116 409 1 252 250 285 348 0 81 133 115 205 0 109 128 130 171 0 127 146 151 193 0 53 138 150 343 1 280 268 332 396 0 105 143 134 218 +155 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128119.jpg 640 427 1 309 206 477 349 1 268 212 401 335 5 0 29 441 384 0 521 187 549 272 0 552 194 585 267 0 435 188 460 238 0 119 149 161 338 67 568 201 571 203 24 126 147 158 210 26 550 212 569 237 67 580 222 584 224 0 550 181 565 200 +156 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395180.jpg 640 481 1 57 262 102 445 8 407 200 549 214 0 32 122 166 435 0 446 187 457 202 0 494 188 507 203 0 510 192 520 204 67 142 202 151 207 0 477 189 492 202 0 464 187 477 200 +157 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226417.jpg 500 333 1 449 191 498 242 2 154 181 198 219 3 291 184 349 273 3 194 197 230 262 3 102 187 146 267 9 53 67 75 117 9 412 59 426 100 24 369 180 384 204 24 298 191 317 227 0 0 168 50 286 0 183 158 233 256 0 94 160 145 260 0 280 163 311 248 0 476 163 499 242 0 252 175 262 188 0 303 161 350 248 1 361 201 385 250 10 430 210 445 234 26 0 231 21 264 0 352 164 390 231 0 278 174 289 209 0 180 173 185 181 3 281 180 293 214 3 251 185 260 202 26 128 203 140 212 +158 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050481.jpg 640 427 1 433 324 545 389 2 0 289 97 425 0 455 279 516 373 0 144 210 192 254 7 1 171 259 415 24 457 283 494 302 +159 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146667.jpg 640 539 2 581 2 639 99 2 105 0 237 53 3 4 46 516 528 0 251 37 455 305 0 162 1 207 128 0 64 17 109 138 0 540 24 582 130 0 529 9 548 123 0 431 14 476 84 0 334 25 361 85 0 27 24 77 143 0 511 15 536 119 0 149 49 171 70 24 162 17 193 55 26 21 42 52 84 26 71 37 98 78 26 230 107 242 132 26 431 49 453 83 26 373 23 387 60 26 411 129 442 184 47 399 30 402 33 0 477 16 516 57 26 349 51 379 84 0 228 4 275 195 +160 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071345.jpg 640 427 2 255 281 305 309 2 207 248 254 276 2 456 309 511 339 2 22 191 48 207 6 39 133 425 259 6 159 140 614 262 7 67 195 106 226 7 194 116 229 146 6 203 156 418 213 2 76 105 93 117 +161 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108531.jpg 640 480 2 474 0 637 328 3 0 67 640 474 +162 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175570.jpg 640 428 2 509 205 638 361 2 71 191 113 235 3 423 227 503 317 5 187 114 522 282 0 441 199 499 316 0 2 182 45 287 9 553 66 573 113 9 475 134 489 153 2 0 194 6 205 9 173 130 183 151 9 0 162 9 168 0 261 163 294 192 0 246 162 266 194 +163 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005205.jpg 612 612 2 11 92 416 306 3 0 198 612 561 0 137 106 450 562 0 398 139 506 456 2 499 163 611 259 +164 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427561.jpg 427 640 2 84 90 154 161 3 157 330 286 551 7 2 2 82 157 0 129 97 327 526 0 15 115 181 563 0 290 126 413 568 0 22 158 88 329 0 265 86 297 171 0 135 74 187 161 0 255 83 272 110 2 80 68 131 111 2 141 78 160 91 7 80 68 139 111 26 188 212 277 336 0 221 80 252 108 0 210 77 226 98 0 182 80 207 119 0 285 77 299 120 0 196 73 207 96 2 268 65 320 119 2 325 79 333 93 26 144 285 224 341 26 149 212 217 294 2 165 77 184 96 3 141 105 180 177 3 238 105 272 169 +165 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153038.jpg 500 399 2 60 302 218 357 4 184 214 297 263 0 99 290 113 305 2 0 294 99 359 +166 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568265.jpg 640 429 2 131 380 221 410 2 608 394 637 417 2 23 384 59 407 0 42 274 104 428 0 165 384 178 413 0 313 365 331 415 2 553 390 565 396 9 194 358 200 369 13 547 397 570 415 33 135 103 192 212 0 563 388 567 395 0 0 348 20 412 0 302 368 316 415 0 498 380 508 410 0 272 383 284 410 0 289 391 295 396 13 106 393 127 405 0 190 382 199 409 0 249 383 261 411 6 350 376 434 399 0 219 387 223 394 2 129 383 177 394 13 333 396 338 411 0 519 389 533 415 0 11 351 545 423 +167 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250794.jpg 640 426 2 569 249 601 283 3 362 260 436 349 0 596 237 636 361 0 481 83 503 101 0 193 223 235 279 1 163 311 330 425 1 368 92 403 170 1 465 309 612 425 1 0 287 157 415 1 273 88 304 171 1 353 305 476 422 1 532 77 568 162 1 49 309 115 346 3 371 8 405 31 1 192 91 208 172 1 613 354 638 425 1 248 290 311 313 1 407 95 446 172 3 459 263 524 349 1 400 103 417 164 1 1 0 639 358 +168 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546388.jpg 500 355 2 0 167 73 241 2 390 127 492 163 3 259 145 447 287 0 202 118 276 296 0 167 145 220 282 2 467 137 499 170 7 43 106 393 277 +169 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195267.jpg 500 333 2 0 205 62 265 3 290 219 314 255 0 280 177 327 257 9 183 118 194 146 74 489 116 498 127 +170 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525971.jpg 640 424 2 448 326 639 418 0 464 250 511 344 0 524 251 560 313 0 377 237 402 293 0 319 254 382 356 0 346 263 413 316 0 36 254 132 380 0 80 260 171 413 3 275 282 451 379 0 54 248 83 316 0 289 250 317 300 0 145 244 170 287 3 263 289 300 351 3 212 274 300 345 3 463 274 519 298 3 0 288 234 419 3 600 263 635 295 3 428 253 483 295 3 436 255 451 269 3 173 257 216 306 3 263 248 282 263 3 541 258 571 287 0 513 251 533 308 3 400 264 429 289 3 347 232 360 249 0 244 252 291 333 0 221 236 234 252 3 205 217 637 295 0 2 0 639 357 +171 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567171.jpg 480 640 2 7 195 295 449 2 0 216 92 314 3 3 292 461 630 0 298 213 313 262 0 319 216 333 259 2 243 203 287 299 58 357 222 394 267 58 349 216 385 261 58 344 231 355 253 58 331 211 359 250 13 401 235 466 262 13 379 234 411 246 0 287 221 292 241 +172 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413339.jpg 640 480 2 585 299 639 432 5 65 113 411 466 5 401 223 639 362 0 27 274 47 359 0 296 224 357 278 0 444 264 459 287 0 422 278 440 296 0 6 263 20 296 0 28 264 38 292 26 35 312 48 338 26 21 322 32 343 0 40 277 72 374 0 122 211 164 265 0 278 208 314 273 0 347 199 369 227 0 473 266 487 287 0 418 263 429 288 27 327 257 332 268 +173 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096351.jpg 640 480 2 1 132 135 236 2 524 147 577 178 2 523 149 565 183 2 536 142 600 170 2 590 144 616 173 2 568 140 639 177 7 62 105 206 201 37 328 78 502 110 0 346 146 369 177 2 572 154 591 178 5 155 80 533 337 +174 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579902.jpg 556 640 2 391 198 555 639 3 189 325 345 582 0 200 232 382 502 2 0 238 195 325 2 338 238 480 334 2 2 216 211 321 36 267 164 327 339 2 474 252 505 287 +175 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243825.jpg 480 640 2 0 306 184 412 0 280 308 347 470 0 177 281 218 403 0 269 303 306 365 0 379 280 407 365 0 349 301 356 318 1 304 391 328 484 1 285 344 294 399 9 420 0 464 145 0 81 295 101 312 0 58 335 70 350 0 342 299 350 319 5 229 283 274 328 7 7 283 120 353 7 3 224 149 381 24 186 298 206 315 24 370 293 385 324 36 191 395 211 405 0 364 294 377 350 0 356 299 363 321 0 425 292 442 350 2 214 303 252 341 +176 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540860.jpg 640 480 2 421 60 637 127 2 2 74 47 98 2 351 69 435 93 2 308 67 333 91 5 44 1 316 152 9 22 50 29 60 58 0 96 57 140 58 511 0 556 55 2 575 57 639 89 2 5 154 639 473 2 0 78 15 103 9 439 9 446 22 +177 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529004.jpg 640 481 2 202 228 264 279 19 148 225 176 272 19 193 226 214 253 19 257 243 321 286 19 591 275 632 329 19 492 242 521 269 19 175 227 196 277 +178 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172710.jpg 640 512 2 593 89 639 289 2 507 108 588 129 3 127 145 556 452 0 236 70 391 241 0 295 60 504 443 26 245 213 420 370 2 154 105 181 111 +179 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281676.jpg 640 427 3 214 140 511 349 0 186 83 496 293 +180 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199481.jpg 480 640 3 72 254 337 548 0 132 150 326 523 24 296 234 376 308 +181 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179765.jpg 640 480 3 94 6 604 387 +182 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268539.jpg 500 333 3 185 121 455 332 0 183 0 309 187 36 181 96 281 199 +183 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113559.jpg 640 427 3 194 217 397 309 0 233 169 267 241 0 279 221 327 275 0 265 169 332 247 +184 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089378.jpg 640 480 3 245 167 453 387 24 175 113 258 175 0 174 69 267 401 +185 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292456.jpg 500 375 3 249 173 392 340 0 184 45 312 300 0 322 68 353 160 0 129 31 189 269 26 149 153 223 218 28 315 152 362 225 58 190 112 216 152 26 312 156 360 225 +186 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326368.jpg 640 480 3 394 133 632 333 3 3 151 434 392 0 227 83 348 235 +187 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031817.jpg 334 640 3 0 147 332 632 0 0 68 330 608 0 286 0 333 228 0 0 77 39 186 0 218 0 333 292 0 0 0 64 132 +188 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499802.jpg 640 425 3 293 159 514 339 3 470 175 543 304 3 206 197 240 263 3 190 220 206 246 3 163 215 173 232 0 44 224 117 310 0 110 194 123 256 0 206 190 228 248 0 261 193 274 246 0 344 143 409 308 0 560 197 570 219 0 596 221 608 253 0 163 209 175 229 0 103 199 114 250 0 437 162 472 208 0 0 179 25 298 0 565 222 580 256 3 249 199 300 261 0 59 184 78 236 0 11 179 569 305 +189 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205300.jpg 640 480 3 156 116 573 443 0 273 1 471 372 +190 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471858.jpg 640 473 3 44 130 608 465 0 231 10 375 278 58 455 182 460 191 58 40 140 186 191 +191 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399545.jpg 427 640 3 249 438 407 639 0 220 251 399 632 0 165 257 274 610 74 356 294 378 312 +192 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004764.jpg 640 364 3 9 27 634 353 0 412 0 547 163 39 81 22 92 60 41 37 42 53 66 41 28 46 37 64 41 66 36 81 65 56 549 103 623 210 41 102 36 118 59 41 124 43 141 60 41 86 29 100 61 +193 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226662.jpg 640 453 3 87 18 605 444 0 548 9 599 206 3 10 10 533 323 0 483 10 561 213 +194 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338044.jpg 640 428 3 50 13 630 345 3 482 25 615 129 0 336 1 395 137 0 396 0 437 144 0 408 0 470 135 0 161 0 205 123 0 188 1 222 44 0 54 0 105 132 0 0 0 58 183 0 480 23 515 69 +195 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102331.jpg 500 357 3 136 110 362 263 0 197 46 276 152 +196 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012744.jpg 640 480 3 437 240 563 316 3 174 270 230 308 0 240 199 280 263 0 235 189 263 314 0 451 195 520 298 0 175 236 219 299 3 230 204 368 358 +197 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267112.jpg 640 427 3 335 254 601 425 3 292 259 308 282 3 218 269 235 301 3 262 255 268 265 0 220 241 239 285 0 483 0 639 190 0 366 246 373 262 0 405 240 415 261 0 411 239 426 270 0 288 242 304 276 0 395 202 639 419 3 258 255 261 261 3 406 249 436 273 3 362 253 378 264 3 323 252 338 262 3 106 397 358 421 0 263 248 271 262 +198 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472160.jpg 640 513 3 33 53 544 492 0 152 18 290 421 26 40 241 158 351 +199 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099389.jpg 640 533 3 75 286 392 515 +200 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379605.jpg 640 480 4 107 253 494 342 8 219 240 263 258 8 335 230 507 255 0 190 345 208 399 0 134 346 157 401 2 318 375 376 408 7 306 375 375 409 8 145 193 164 252 8 259 237 300 251 8 0 315 41 350 +201 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062726.jpg 640 424 5 0 106 284 401 5 284 198 408 319 0 529 258 555 335 0 491 253 516 308 0 558 250 579 295 0 589 254 600 287 0 60 290 192 417 0 141 251 207 378 0 600 252 614 291 26 416 297 440 368 26 544 270 555 292 26 614 260 618 270 0 578 247 587 276 0 589 248 597 264 5 423 198 504 292 5 425 211 461 310 0 374 270 446 418 26 608 257 614 274 0 522 249 539 316 +202 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385346.jpg 640 428 5 288 145 501 276 9 609 176 617 195 7 533 202 593 228 2 601 202 606 206 9 599 184 601 190 9 618 187 626 195 2 597 196 602 200 +203 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568961.jpg 640 428 6 85 110 344 312 0 364 177 373 213 +204 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422706.jpg 640 427 8 164 174 284 315 0 4 17 147 225 0 0 5 186 156 0 1 141 119 317 0 252 266 261 274 26 18 208 73 300 +205 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139440.jpg 640 426 8 48 104 521 205 0 240 111 297 160 0 184 107 226 163 0 153 113 191 164 0 322 102 377 150 0 366 93 388 145 0 286 103 313 156 +206 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348140.jpg 500 367 8 30 34 463 204 0 309 8 325 35 0 295 12 316 63 0 218 9 230 41 0 408 10 420 40 0 389 11 393 34 0 280 10 290 34 0 200 10 208 34 0 128 8 142 51 0 46 10 60 43 0 443 9 464 37 0 465 9 475 37 0 433 11 440 28 0 328 16 338 53 +207 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429924.jpg 640 480 8 157 163 469 321 8 17 216 108 250 8 110 205 165 231 7 64 170 130 211 24 582 168 609 206 1 468 247 639 308 1 529 235 610 257 1 544 207 584 230 1 488 183 500 196 1 497 196 523 221 1 521 180 543 186 2 0 194 22 227 7 118 169 176 204 0 571 153 612 223 1 305 267 630 479 1 416 303 639 428 1 476 267 497 276 1 451 225 526 284 1 490 191 533 216 0 544 152 549 165 1 18 157 639 335 +208 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177069.jpg 500 322 0 59 20 491 285 8 0 22 445 317 +209 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364079.jpg 426 640 0 152 53 364 437 0 149 60 241 274 26 230 129 352 323 3 122 172 360 544 +210 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267875.jpg 480 640 0 149 287 174 322 0 456 305 474 337 9 425 167 466 190 3 114 305 198 357 0 111 278 129 327 0 188 289 211 345 3 101 314 125 351 3 295 317 332 349 3 328 321 350 348 3 349 316 365 346 3 374 325 384 339 3 342 321 351 343 3 345 311 373 344 3 368 323 378 343 3 19 297 97 351 3 282 300 292 334 3 458 326 469 340 +211 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519542.jpg 259 500 0 61 6 200 329 3 38 117 197 428 0 180 57 223 171 +212 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354929.jpg 640 426 0 134 75 179 181 0 323 4 542 284 0 303 72 368 150 0 211 70 256 155 24 402 38 543 135 0 85 99 96 112 1 333 146 575 377 24 146 87 178 121 24 98 104 123 120 24 251 93 274 109 24 69 100 82 118 0 91 92 128 160 0 13 77 52 185 0 64 95 80 126 1 214 118 261 181 1 139 122 178 181 1 103 129 133 189 1 23 128 46 203 1 502 134 558 208 1 302 134 385 199 1 72 112 274 157 1 46 114 55 146 24 330 90 370 120 24 19 91 40 115 0 351 70 375 97 2 542 105 558 124 +213 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504452.jpg 593 640 0 366 191 521 444 0 213 168 278 382 0 195 261 287 374 +214 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226408.jpg 640 469 0 12 118 387 401 59 0 114 306 461 77 105 0 309 170 +215 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210299.jpg 640 480 0 126 124 254 325 1 136 183 260 399 +216 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525667.jpg 640 480 1 292 285 548 473 1 2 192 49 282 0 192 123 256 321 0 51 114 146 359 0 540 18 639 421 0 443 135 502 248 0 338 168 353 184 0 623 196 639 317 0 415 144 455 294 13 464 365 639 473 13 360 331 406 357 41 420 293 441 340 60 368 286 639 401 1 559 245 639 368 1 158 221 205 262 0 245 120 443 472 0 365 127 443 296 +217 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086220.jpg 640 428 5 38 142 514 260 0 169 188 179 201 0 297 225 313 250 2 134 209 445 335 2 0 212 31 235 6 33 145 512 263 +218 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185802.jpg 480 640 25 228 375 312 556 56 2 374 254 605 56 348 428 478 626 46 33 111 233 464 +219 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061503.jpg 640 426 25 61 30 415 292 26 276 182 396 421 0 90 101 396 425 +220 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123570.jpg 640 425 25 223 124 365 212 2 591 245 639 337 0 301 173 358 381 0 282 186 316 371 +221 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267537.jpg 640 470 25 89 74 279 204 25 262 61 437 140 0 107 103 298 385 0 190 105 285 234 0 279 85 515 371 0 0 0 79 233 0 387 0 423 53 0 341 83 475 307 0 498 0 635 234 0 68 0 177 160 13 447 195 639 245 13 445 163 537 190 13 409 127 639 169 13 415 140 528 159 13 411 95 498 122 13 399 75 508 99 13 462 245 637 309 13 2 243 124 319 13 179 64 293 88 13 329 49 523 66 27 163 159 180 189 0 165 0 247 68 0 48 0 84 61 13 318 29 637 50 13 599 79 639 90 +222 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192154.jpg 640 480 25 272 43 548 357 67 327 13 403 62 0 0 0 525 480 +223 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510707.jpg 640 480 58 337 209 400 266 58 223 272 252 327 74 196 192 220 231 40 463 178 479 210 40 478 178 488 210 40 485 176 501 209 40 496 176 512 209 40 525 232 539 269 40 520 231 532 265 40 548 232 563 269 40 567 232 582 272 40 540 232 558 268 41 272 245 280 266 41 243 247 252 264 41 252 247 262 264 69 86 300 231 418 41 265 246 273 265 71 226 291 478 372 41 287 197 300 220 41 275 196 286 221 41 531 185 552 207 41 298 200 308 219 41 275 255 279 265 41 548 185 559 206 41 552 183 587 200 75 248 162 268 222 41 258 247 267 265 +224 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386707.jpg 640 423 27 218 214 272 418 0 49 50 310 416 +225 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262895.jpg 334 500 27 152 302 278 495 0 0 6 334 499 +226 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479597.jpg 375 500 27 178 166 230 462 0 51 2 350 488 +227 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297578.jpg 500 281 27 240 75 268 197 0 152 7 325 276 0 14 94 78 248 26 235 174 303 278 2 418 97 473 209 2 121 203 176 277 2 424 183 477 261 2 50 130 79 161 0 82 15 172 280 2 0 155 19 216 +228 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232073.jpg 640 427 27 164 157 182 188 27 115 166 132 185 27 328 200 352 219 27 473 169 495 203 39 240 75 255 100 0 381 33 595 419 0 284 121 397 426 0 202 149 305 422 27 411 155 423 167 67 87 198 105 202 75 255 79 269 97 0 100 98 210 425 0 161 122 247 420 0 7 99 36 342 0 81 113 162 408 0 393 53 454 227 27 253 208 266 223 27 190 178 203 187 72 28 47 203 393 39 402 0 408 33 41 399 61 405 74 0 1 158 27 388 41 552 156 585 171 +229 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117037.jpg 500 375 27 158 76 174 138 2 331 101 499 237 2 353 77 498 138 0 105 24 192 293 0 182 13 273 300 0 265 61 356 303 24 244 175 289 277 26 99 121 129 161 24 98 68 150 161 28 244 173 288 276 2 329 98 361 140 +230 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363403.jpg 425 640 27 200 256 267 525 0 0 65 423 639 +231 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333756.jpg 639 640 32 9 47 30 62 0 250 199 393 522 +232 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377595.jpg 640 480 48 195 147 478 374 45 1 20 112 124 76 497 396 639 472 76 79 258 155 307 44 303 0 357 79 45 484 100 525 130 44 349 30 365 54 +233 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442417.jpg 500 375 67 274 249 311 360 0 62 149 387 373 67 129 239 159 285 +234 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278582.jpg 429 640 67 141 140 269 349 0 173 457 428 639 0 96 342 205 570 0 0 236 83 433 0 0 388 180 639 0 54 4 421 497 0 202 91 428 436 +235 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423123.jpg 640 426 67 308 245 342 255 72 317 149 569 420 0 36 88 388 421 0 178 44 430 352 24 0 82 302 299 0 494 229 639 424 0 0 0 50 141 +236 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007256.jpg 640 346 67 182 134 191 143 67 325 137 338 151 67 580 135 586 139 67 506 151 519 154 0 326 37 416 339 0 68 51 189 341 0 434 76 532 345 0 520 85 590 327 0 568 90 625 319 0 271 59 347 223 24 49 133 110 234 26 237 105 301 268 26 570 158 591 195 +237 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480472.jpg 500 375 67 228 141 260 164 0 0 0 166 301 0 157 25 310 257 71 349 231 499 352 71 171 239 334 304 26 15 226 201 333 26 332 259 499 374 0 405 54 466 173 0 445 60 499 182 0 481 68 499 117 26 228 160 301 223 0 354 52 449 182 26 461 134 499 165 67 433 121 445 127 67 191 77 201 88 +238 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268224.jpg 640 480 67 440 416 482 455 0 167 80 435 472 0 365 4 469 297 0 391 41 638 479 53 121 358 291 450 69 1 196 226 267 43 85 161 97 179 +239 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493509.jpg 500 500 67 292 186 311 233 0 34 154 262 494 0 267 116 441 495 63 118 304 317 407 27 320 239 344 277 +240 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106351.jpg 480 640 72 386 143 479 615 41 329 159 356 180 41 302 160 329 180 47 290 312 307 322 70 326 309 374 351 41 138 323 168 352 41 235 147 255 180 41 148 191 171 232 41 213 148 234 180 41 302 104 331 129 41 340 101 371 128 45 112 143 166 168 45 304 204 333 209 47 262 318 271 320 41 197 147 212 179 41 259 167 274 180 45 207 116 272 130 45 106 110 169 129 45 259 321 310 352 45 301 230 332 235 45 301 225 334 231 45 301 209 334 215 45 301 215 333 220 41 350 165 378 180 +241 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519649.jpg 640 480 72 110 81 318 422 68 312 203 389 244 69 371 190 550 454 44 576 177 588 193 56 624 355 639 416 68 393 82 546 172 +242 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527750.jpg 427 640 72 286 181 426 404 0 176 124 291 463 69 16 288 183 485 39 331 141 344 182 45 52 391 128 436 45 100 341 130 369 +243 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291742.jpg 640 480 72 39 111 162 400 44 435 203 446 227 44 449 204 456 216 68 249 182 301 216 69 260 246 421 282 71 191 218 244 232 39 236 138 242 148 39 241 138 247 151 39 228 122 233 134 39 234 108 238 121 39 229 111 234 119 39 243 111 246 120 39 234 93 237 103 39 230 94 233 103 39 225 93 230 103 44 404 247 446 253 60 92 326 285 479 39 240 123 247 134 41 309 188 320 218 39 225 111 230 119 39 232 136 237 149 39 223 138 228 146 39 211 74 258 164 +244 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301837.jpg 427 640 72 107 263 177 429 69 289 283 426 639 71 209 371 254 382 47 6 372 54 381 74 393 294 426 309 +245 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164121.jpg 640 480 72 542 82 639 473 45 206 211 278 234 46 513 257 540 276 49 215 266 267 304 68 75 98 203 168 69 395 262 493 447 71 353 239 408 255 44 22 195 43 219 45 39 306 51 316 69 72 190 229 284 75 64 234 85 340 75 53 232 68 332 45 300 235 326 242 47 233 287 255 305 47 250 280 268 302 +246 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476335.jpg 640 426 72 456 141 610 309 0 103 129 248 318 71 0 313 294 349 45 242 290 301 307 45 174 310 322 329 0 346 138 445 264 0 576 172 639 294 44 571 277 578 290 71 193 309 227 318 45 536 296 572 308 +247 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135356.jpg 640 480 72 0 0 129 480 0 179 94 305 473 41 553 377 585 425 45 477 318 564 367 62 510 131 538 195 71 305 436 459 473 57 140 255 191 365 45 267 181 344 255 +248 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004296.jpg 640 480 72 433 165 516 345 41 558 323 592 361 41 401 246 413 266 41 411 245 423 265 41 383 248 392 262 69 286 272 394 390 71 157 256 245 281 26 248 437 328 472 39 94 288 107 324 39 386 219 400 258 39 399 218 413 249 44 247 260 268 268 +249 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048905.jpg 640 480 72 408 99 592 441 43 67 205 85 231 44 326 189 338 206 68 309 101 405 163 69 283 224 402 310 71 170 296 297 340 43 54 201 65 225 43 58 198 71 227 44 306 186 319 206 71 158 286 231 317 44 319 183 331 206 +250 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010114.jpg 480 640 72 0 276 90 632 69 79 368 214 632 71 307 349 427 368 39 131 307 147 340 39 124 325 139 366 39 123 311 128 337 45 185 337 216 348 45 212 330 237 349 +251 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509185.jpg 640 480 74 260 181 359 234 +252 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117725.jpg 427 640 74 238 358 261 402 74 138 354 177 398 +253 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342387.jpg 640 425 74 616 0 639 48 50 217 286 242 305 0 214 72 305 291 0 273 71 389 280 0 259 95 445 356 0 255 0 640 418 0 123 70 281 222 43 176 248 260 280 72 74 0 245 212 0 199 55 275 211 +254 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215408.jpg 480 640 74 143 274 217 354 +255 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513497.jpg 480 640 74 271 403 295 429 +256 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357944.jpg 480 640 74 126 127 156 155 7 97 510 406 639 2 99 522 395 639 +257 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367452.jpg 480 640 74 131 171 341 297 +258 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535997.jpg 640 554 74 387 324 463 382 74 202 387 234 482 +259 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145093.jpg 640 426 74 387 42 517 131 +260 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132861.jpg 480 640 74 305 474 338 517 74 209 471 237 514 +261 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535889.jpg 640 480 74 111 313 145 355 39 575 332 590 367 0 118 98 308 473 68 2 320 73 363 71 419 359 605 391 41 353 327 365 344 41 370 328 385 344 46 310 340 336 367 68 0 220 79 305 45 284 216 312 246 45 244 318 288 359 41 286 216 314 244 41 359 307 379 328 41 348 289 368 303 +262 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445567.jpg 640 480 79 111 306 157 324 0 116 65 272 473 +263 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241319.jpg 640 476 79 456 122 570 304 79 128 102 199 306 79 428 153 484 245 39 105 37 143 130 41 106 221 175 314 71 1 319 639 389 26 0 176 134 324 41 511 214 588 306 79 196 151 238 238 41 470 229 511 244 +264 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141795.jpg 375 500 79 82 343 123 354 61 238 295 333 483 71 43 308 195 462 26 112 301 178 342 +265 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162280.jpg 480 640 79 390 349 398 362 79 416 333 428 351 71 303 362 479 439 75 7 386 34 447 45 399 349 425 380 58 2 356 121 488 +266 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370233.jpg 500 333 79 128 124 149 133 0 260 50 424 332 71 148 288 250 317 0 92 91 203 212 +267 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298732.jpg 640 480 79 326 289 349 334 79 388 278 397 305 41 491 381 524 440 71 256 334 413 414 71 405 311 550 366 41 542 408 579 472 41 590 386 628 443 41 542 365 573 408 +268 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466583.jpg 427 640 79 108 370 117 384 79 113 368 120 383 71 21 389 150 458 58 0 388 24 440 +269 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096998.jpg 640 427 79 375 241 379 256 71 306 298 387 329 61 124 392 190 426 79 288 277 297 284 79 407 239 411 265 39 291 281 306 317 +270 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262228.jpg 480 640 1 71 366 479 630 1 106 270 379 425 +271 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240918.jpg 500 332 1 46 86 206 294 +272 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518850.jpg 426 640 1 108 250 136 284 1 400 265 418 343 2 153 189 232 251 2 145 201 177 254 3 152 281 238 407 3 65 221 136 305 0 306 187 325 238 0 124 196 154 259 0 387 217 424 328 0 378 198 406 253 0 264 188 282 238 0 409 197 425 232 0 332 187 351 238 0 0 192 37 240 0 183 202 217 242 0 159 224 252 372 0 279 191 293 239 2 216 197 255 240 3 39 264 68 314 3 21 232 61 266 3 0 216 38 380 0 249 203 261 224 0 295 191 307 214 0 37 177 269 246 +273 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272015.jpg 480 640 2 106 77 168 112 2 268 77 336 116 2 324 84 368 112 2 350 77 395 107 2 401 83 439 107 2 0 71 43 107 0 406 74 416 107 13 111 137 379 297 2 419 71 431 79 2 390 70 405 80 2 381 67 391 76 7 245 58 271 78 13 427 144 479 187 2 24 80 133 128 2 168 90 213 109 2 469 71 475 81 7 22 80 134 127 7 0 51 67 83 2 271 69 289 79 7 194 60 222 79 +274 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235380.jpg 640 524 2 8 279 269 423 2 20 279 100 322 2 233 277 337 363 2 311 273 377 338 2 383 270 401 280 2 370 268 383 278 2 426 270 441 279 2 408 269 429 280 2 11 285 29 326 12 137 309 158 335 0 226 255 234 267 0 212 255 224 269 0 245 255 252 268 0 254 258 265 273 2 451 268 495 287 12 318 289 328 308 2 493 265 513 293 0 222 256 227 267 0 248 256 257 270 0 260 256 266 268 2 398 269 412 280 +275 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227511.jpg 500 375 2 65 286 225 374 2 225 261 267 294 2 156 256 174 269 2 240 258 270 284 10 79 272 83 279 2 182 258 194 267 2 138 260 153 268 +276 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279024.jpg 478 640 2 345 165 376 178 0 414 143 434 205 2 374 167 387 178 2 159 161 191 178 2 212 165 226 178 7 98 155 126 177 9 8 3 38 68 9 415 99 431 135 14 438 261 466 292 61 91 274 406 490 39 244 276 328 305 2 244 165 258 177 +277 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323919.jpg 640 460 2 1 1 639 453 77 195 247 311 373 +278 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027530.jpg 500 413 2 40 224 468 407 28 315 145 369 212 28 227 95 347 197 28 156 180 217 210 +279 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058223.jpg 500 343 2 162 176 317 271 23 29 127 219 272 +280 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198139.jpg 640 608 2 0 210 381 572 12 553 91 602 149 12 504 90 595 224 +281 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062200.jpg 401 640 2 1 326 105 416 12 188 234 273 448 12 98 231 188 450 2 22 287 114 332 2 266 295 346 336 2 325 298 367 345 2 360 275 400 354 +282 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187424.jpg 640 480 2 1 223 239 473 61 321 308 414 420 7 461 43 637 473 7 318 23 415 119 +283 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154854.jpg 500 375 2 208 254 296 295 2 312 261 469 309 2 120 257 150 274 2 78 257 111 274 2 134 269 241 331 2 72 256 80 269 9 245 205 253 229 9 213 207 224 230 0 39 256 52 303 2 13 258 31 271 9 55 202 66 230 2 56 260 72 269 2 0 260 6 269 +284 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160345.jpg 500 333 2 186 41 308 91 13 58 127 415 252 73 140 142 179 155 2 0 67 61 138 0 113 90 215 256 +285 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301135.jpg 428 640 2 300 349 410 395 2 123 346 182 377 2 89 349 131 374 13 277 443 426 566 24 59 432 87 471 24 0 346 28 402 26 221 441 272 475 26 126 422 163 441 0 134 373 160 413 0 234 397 336 547 0 17 323 52 487 0 106 389 186 500 0 125 383 181 439 0 65 381 151 491 0 285 449 414 521 0 206 396 277 541 0 246 339 260 379 0 280 341 294 377 0 308 338 324 363 13 139 445 180 488 26 276 456 302 471 1 49 359 105 406 2 47 344 58 358 +286 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235788.jpg 640 427 2 493 147 637 277 56 0 177 33 227 7 49 30 502 359 0 36 126 75 248 0 0 140 11 176 5 56 29 502 360 56 33 197 43 227 0 9 147 38 220 2 631 189 639 203 2 565 183 639 239 7 494 149 634 276 +287 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068520.jpg 640 427 5 210 200 572 342 5 28 239 177 313 5 1 248 30 303 +288 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199771.jpg 640 425 39 367 264 439 421 41 256 391 301 424 41 285 291 370 419 43 393 335 580 418 73 560 46 600 68 0 306 28 409 283 0 244 104 342 270 0 370 66 565 363 0 544 23 639 398 0 157 69 216 239 0 0 90 87 226 0 8 60 94 169 45 191 293 305 390 48 547 377 637 424 0 148 75 191 241 0 0 125 15 283 48 476 386 542 424 48 411 399 493 424 74 494 0 516 25 0 36 55 229 415 +289 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344488.jpg 640 458 56 266 282 406 457 49 96 233 105 239 49 86 235 95 239 68 1 148 39 179 69 0 198 48 322 75 445 220 476 257 47 69 233 76 239 47 78 234 87 239 74 518 96 546 131 49 93 223 99 229 56 217 234 266 251 47 93 224 98 229 +290 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020788.jpg 426 640 56 89 311 184 412 0 20 0 417 442 60 0 231 426 632 45 160 492 233 530 45 172 387 216 418 45 133 400 176 432 45 308 313 343 339 45 194 451 260 502 45 162 416 224 448 51 275 495 320 520 75 340 193 388 286 45 268 313 307 339 51 245 386 264 397 51 264 385 283 395 45 176 523 261 582 45 139 463 200 514 45 293 307 333 325 45 256 469 377 563 45 207 364 298 421 51 284 298 299 304 51 290 292 305 299 58 298 7 425 289 +291 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504074.jpg 640 427 56 484 156 569 237 56 40 137 146 255 56 320 157 406 303 0 100 75 203 358 63 249 231 405 351 40 134 192 149 224 56 522 198 639 421 56 545 199 630 405 0 260 87 553 426 +292 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319579.jpg 640 480 56 246 311 365 398 56 63 238 160 407 0 196 155 366 433 0 228 133 297 217 0 60 173 219 399 0 65 109 168 219 0 139 153 197 235 63 244 194 271 239 73 214 266 280 306 24 269 358 429 473 73 130 191 180 215 0 305 136 332 156 0 191 140 250 234 +293 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532126.jpg 640 478 56 323 123 552 322 61 0 176 254 477 39 20 170 34 201 39 42 169 51 192 +294 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108212.jpg 640 427 56 562 240 595 387 60 573 263 639 421 42 60 235 79 260 44 103 231 120 259 69 153 205 366 426 43 133 239 146 261 43 139 245 150 263 43 142 250 159 271 43 130 233 147 257 42 94 214 111 259 44 82 224 94 237 44 75 242 89 260 +295 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254864.jpg 335 500 10 121 247 192 386 2 313 64 334 76 2 37 78 163 109 +296 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451345.jpg 640 480 0 234 81 492 477 13 3 345 639 479 26 353 127 431 212 13 60 320 595 355 13 0 219 640 361 73 282 190 336 229 +297 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216096.jpg 500 281 0 137 127 228 195 0 363 40 386 72 0 317 73 365 104 0 73 86 98 119 0 404 25 426 41 0 423 57 475 139 37 192 189 243 210 37 335 40 392 80 37 421 137 455 149 37 301 85 373 115 37 36 108 54 116 +298 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107304.jpg 640 480 0 312 20 552 479 61 91 278 224 435 41 90 190 107 215 +299 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273450.jpg 640 612 0 0 290 361 603 2 0 0 339 449 12 0 0 640 604 +300 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179930.jpg 640 427 0 79 178 355 426 23 259 150 370 299 56 43 373 272 426 +301 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412510.jpg 480 640 0 186 204 286 519 61 0 345 111 480 61 342 391 393 415 61 299 364 311 383 61 198 326 208 401 +302 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357743.jpg 640 480 0 0 64 431 466 0 1 317 216 473 43 266 212 293 318 44 189 166 213 192 53 518 5 586 74 53 453 0 525 73 53 369 161 525 351 53 388 5 451 100 53 297 61 346 158 53 287 194 361 296 53 333 173 428 312 53 358 164 467 323 53 415 1 487 92 53 371 24 412 103 53 294 194 334 259 51 397 305 408 329 +303 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580294.jpg 640 443 0 411 3 639 438 45 2 320 192 437 45 365 171 410 200 71 442 186 496 212 44 0 330 342 442 69 4 245 441 408 79 495 184 500 214 45 450 172 497 210 41 405 174 435 198 +304 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141197.jpg 480 640 0 112 286 239 553 67 213 336 227 354 +305 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580870.jpg 480 640 0 109 119 464 637 68 40 166 183 261 71 428 408 479 443 41 396 374 418 405 41 368 360 396 389 41 343 372 366 387 73 33 478 98 556 73 37 587 49 639 73 37 579 63 638 73 35 470 101 554 73 54 578 74 639 73 72 506 104 543 41 371 375 394 400 56 279 610 404 639 +306 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145831.jpg 640 427 0 213 25 353 187 36 191 86 290 184 36 59 40 110 204 36 391 0 427 66 0 403 236 639 421 0 0 1 86 229 0 423 0 482 65 +307 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294209.jpg 640 480 0 286 85 639 474 71 46 451 176 479 0 35 148 132 471 0 162 152 304 406 +308 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150538.jpg 640 480 0 251 218 311 347 13 141 267 361 341 +309 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012448.jpg 427 640 0 0 128 427 631 77 1 139 196 533 +310 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571012.jpg 375 500 0 122 32 242 387 36 92 355 284 434 62 48 186 82 223 66 115 236 144 241 +311 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579003.jpg 480 640 0 373 182 445 282 71 367 375 431 477 24 402 236 440 296 71 235 301 325 324 +312 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472078.jpg 500 332 0 385 109 414 190 0 342 121 374 177 30 338 178 380 183 30 372 187 397 192 +313 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115930.jpg 640 361 0 167 114 293 356 0 274 102 377 360 0 360 102 464 355 0 564 130 639 316 0 0 110 85 356 45 342 78 363 86 60 501 311 618 360 60 494 190 575 206 0 167 136 209 194 39 99 78 108 115 39 263 93 270 112 39 127 80 137 116 39 212 86 219 121 39 163 83 173 119 39 144 86 156 118 39 117 79 128 116 39 189 91 197 120 39 240 92 248 122 39 174 85 180 118 39 180 86 190 119 39 205 88 213 121 40 255 54 263 85 40 216 41 232 87 40 200 40 212 84 40 141 33 152 58 40 158 53 175 76 40 99 40 114 69 40 78 21 94 79 40 210 44 219 83 40 228 44 244 86 56 81 324 134 358 0 140 145 158 162 0 109 136 141 162 40 267 52 278 83 40 184 39 199 80 40 41 18 56 60 60 66 221 186 359 0 565 144 594 177 39 219 87 227 120 40 262 53 272 85 0 21 87 105 193 0 163 137 188 184 39 0 71 280 174 40 4 14 522 129 +314 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169505.jpg 425 640 0 62 598 86 638 33 120 500 163 523 33 134 231 303 280 0 407 572 424 618 0 164 559 189 616 +315 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407017.jpg 640 425 0 413 99 568 419 0 312 47 471 351 42 589 392 603 420 69 266 280 432 424 45 62 389 106 398 45 0 407 22 417 45 106 378 160 424 45 62 376 111 393 45 140 361 186 413 45 65 399 105 419 45 68 367 110 379 45 22 415 60 424 45 21 402 62 415 72 610 182 639 368 +316 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276149.jpg 640 424 0 481 305 544 376 0 311 233 331 279 0 207 246 241 327 0 380 266 404 305 0 397 267 416 308 0 541 259 569 329 31 300 342 353 368 31 355 308 391 324 31 223 400 264 423 0 560 250 580 324 0 358 232 374 276 0 400 221 413 263 0 367 211 379 238 0 343 219 351 238 30 223 319 271 330 30 492 361 526 376 0 614 205 621 218 31 361 254 381 282 31 83 393 163 423 31 206 359 227 378 31 326 255 336 281 31 147 335 179 350 31 148 320 179 329 31 30 320 51 337 0 393 215 398 222 30 472 364 497 369 30 285 333 335 342 30 449 239 481 241 30 302 352 348 368 31 5 298 31 310 31 152 305 169 316 31 286 332 331 343 31 234 225 604 327 0 3 104 630 275 +317 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113590.jpg 640 425 0 281 87 416 316 0 60 141 115 273 0 214 162 227 179 0 304 125 335 188 0 125 155 174 197 45 205 181 226 189 45 202 189 226 195 52 136 318 144 327 52 143 318 148 328 52 161 318 169 325 52 156 317 161 326 53 255 225 283 234 53 209 251 256 264 53 202 233 209 238 0 172 157 241 196 48 191 215 214 226 +318 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459400.jpg 333 500 0 4 246 328 494 61 47 0 249 320 +319 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463398.jpg 640 428 0 114 47 292 382 0 299 43 482 387 26 120 109 193 232 7 0 0 640 421 +320 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121849.jpg 612 612 0 134 26 440 602 61 137 4 561 604 +321 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557923.jpg 640 480 0 160 182 238 358 0 310 188 389 355 1 154 260 231 374 2 558 238 615 282 2 568 212 639 271 2 224 222 318 308 7 359 193 579 299 7 289 207 472 306 7 0 202 152 334 1 314 273 384 377 7 75 205 302 320 +322 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540209.jpg 640 428 0 221 100 562 423 45 125 346 152 363 44 428 337 480 354 72 536 189 626 298 69 183 340 253 427 74 210 106 233 130 +323 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050493.jpg 640 362 0 168 77 217 215 0 365 80 404 202 0 67 66 117 213 0 555 76 615 207 0 485 62 498 106 37 329 111 403 152 37 534 102 579 154 37 82 85 125 184 0 444 62 469 101 0 496 81 509 103 37 170 106 184 163 +324 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071986.jpg 500 375 0 210 133 251 252 0 180 154 213 243 0 125 136 151 246 0 49 134 98 261 0 98 138 128 240 30 80 257 123 266 30 270 234 298 261 30 217 236 250 263 0 402 139 444 229 24 119 156 135 187 24 269 149 291 181 24 98 152 115 182 30 99 237 173 248 0 251 132 311 250 +325 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358191.jpg 640 309 0 390 148 414 186 61 547 239 564 280 71 319 210 353 223 71 423 200 511 243 +326 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054679.jpg 456 640 0 14 66 140 324 33 25 202 282 440 +327 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103538.jpg 640 427 0 0 142 32 270 69 459 217 578 383 72 164 153 261 260 +328 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398905.jpg 640 427 0 217 31 510 366 +329 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181359.jpg 640 426 0 561 45 634 87 20 247 75 322 177 20 132 99 218 176 20 63 63 137 149 20 34 94 84 196 7 387 75 639 310 +330 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387696.jpg 640 592 0 312 155 483 591 0 265 61 381 427 0 154 100 296 517 41 491 424 521 471 43 564 446 590 536 43 475 325 512 333 44 497 426 508 457 44 147 194 191 215 69 451 264 602 356 70 61 305 138 380 39 448 350 487 380 41 472 376 496 404 67 619 500 638 544 39 523 389 569 488 39 513 204 533 271 39 580 206 604 265 39 537 195 558 259 39 476 199 505 268 39 573 198 595 259 45 152 132 179 146 45 146 104 178 130 45 0 401 38 472 45 86 261 133 290 39 529 191 541 256 39 510 376 535 414 39 539 182 548 217 39 546 231 563 270 41 497 333 536 397 41 608 434 639 499 +331 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103413.jpg 640 426 0 181 54 435 325 0 489 229 516 275 0 587 203 626 268 0 527 228 536 242 0 538 231 547 241 0 446 229 456 241 36 166 284 303 366 0 433 229 445 241 0 587 218 592 230 0 405 257 434 287 +332 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513129.jpg 426 640 0 166 190 226 303 71 150 352 268 415 41 108 367 124 386 41 127 367 143 387 +333 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010463.jpg 640 446 0 347 75 505 342 13 168 154 544 440 13 473 147 639 278 26 457 167 522 375 +334 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025096.jpg 375 500 0 1 37 212 328 43 39 310 143 385 22 224 471 274 499 36 101 277 326 409 56 0 213 33 252 60 0 232 375 499 +335 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576704.jpg 480 640 0 11 2 327 631 76 140 461 229 604 45 142 560 417 639 27 181 151 215 179 0 313 191 479 252 +336 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242189.jpg 375 500 0 143 85 223 270 26 199 156 223 203 26 134 142 172 204 +337 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539251.jpg 393 640 0 299 333 338 482 0 193 302 236 482 71 187 519 364 567 58 0 282 40 435 71 0 506 77 562 +338 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206411.jpg 640 480 0 2 194 176 376 61 172 0 470 359 +339 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295574.jpg 480 640 0 45 127 207 520 71 167 361 304 452 39 329 119 350 197 67 107 146 121 169 61 125 459 314 639 +340 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399832.jpg 640 480 0 0 308 39 474 68 213 188 299 236 69 364 159 425 236 72 3 1 130 472 71 605 231 639 359 +341 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381551.jpg 640 522 13 471 312 527 390 0 422 292 508 386 0 408 285 428 322 0 148 272 187 331 0 192 278 225 325 0 222 279 244 319 0 253 280 269 312 0 123 276 161 334 0 440 289 492 368 0 556 280 565 306 0 157 277 189 328 2 163 256 211 270 0 341 268 352 295 13 116 288 129 324 13 439 307 472 332 0 361 257 367 275 0 136 250 483 357 +342 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455325.jpg 640 480 13 245 210 570 473 13 173 203 452 402 13 131 197 419 357 13 100 192 295 314 13 78 186 274 293 13 64 183 247 272 13 46 177 146 255 73 306 343 324 363 13 571 185 639 279 13 453 185 509 219 13 347 176 452 197 13 17 174 76 227 +343 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237777.jpg 448 336 20 173 76 371 259 20 123 104 262 270 +344 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209015.jpg 425 640 23 53 76 424 527 +345 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000764.jpg 500 343 29 135 135 178 152 0 70 95 148 280 0 252 128 436 330 0 186 113 219 206 0 377 120 389 158 0 434 120 447 157 0 447 106 487 172 0 427 134 435 161 0 231 106 261 167 0 270 109 292 160 0 409 123 420 157 0 386 112 399 163 0 57 114 80 158 0 252 123 261 159 0 27 108 409 172 +346 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049236.jpg 491 640 30 185 442 327 513 0 177 64 209 143 0 121 39 149 102 0 458 139 490 204 0 148 33 168 65 0 245 53 276 102 0 324 101 346 126 0 392 116 413 148 0 190 289 287 484 0 194 278 269 465 0 417 148 440 230 0 352 134 387 248 0 98 20 114 87 0 422 186 464 282 31 408 274 471 306 0 1 0 490 316 +347 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373988.jpg 500 375 31 19 336 147 354 24 18 327 84 362 24 286 284 306 298 0 271 215 288 247 0 359 215 383 269 0 89 222 122 320 0 147 220 182 314 0 61 216 98 333 0 108 222 136 320 0 204 259 242 312 0 7 220 49 331 0 234 208 248 248 0 285 220 300 271 0 46 219 64 267 0 128 226 152 284 2 207 171 242 194 2 385 183 417 201 2 238 180 267 201 2 378 197 400 217 2 347 189 379 214 24 272 223 282 238 25 48 135 174 189 30 404 259 440 266 2 308 178 338 193 24 259 283 286 296 30 419 256 458 260 30 484 261 499 268 30 334 272 356 287 0 134 216 149 235 2 360 171 372 185 2 455 202 498 211 31 380 280 418 285 30 410 294 497 309 30 315 267 371 273 30 188 231 195 270 30 376 256 401 260 30 481 283 485 284 30 278 227 286 271 0 0 161 364 313 +348 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220511.jpg 640 563 33 583 56 619 94 33 53 134 165 195 0 382 93 436 244 0 355 117 381 213 0 26 163 74 242 0 431 167 472 206 0 555 159 578 211 0 229 227 340 481 0 152 182 172 206 0 99 192 113 207 0 463 184 481 206 0 542 192 557 207 0 439 188 451 206 0 483 198 496 206 36 196 458 355 500 +349 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119964.jpg 640 428 36 377 238 430 374 0 243 215 414 403 +350 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035222.jpg 425 640 41 43 305 118 356 61 253 405 336 465 71 1 288 203 505 +351 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416467.jpg 640 482 41 133 245 146 259 45 152 240 183 256 69 200 248 287 370 71 66 257 149 303 +352 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567686.jpg 500 375 41 442 24 499 119 64 217 100 296 170 66 0 49 218 142 +353 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431236.jpg 640 427 41 503 227 547 263 41 533 150 560 172 44 94 195 108 211 68 462 170 583 254 69 150 257 297 422 42 108 199 120 210 42 92 198 100 211 69 461 170 581 257 +354 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136780.jpg 640 359 41 353 38 375 60 61 469 116 573 344 41 390 33 413 58 +355 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504711.jpg 640 483 42 32 197 639 397 55 144 0 576 290 +356 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563730.jpg 612 612 42 4 361 611 499 49 122 41 420 347 60 1 50 611 598 +357 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490286.jpg 640 480 43 434 201 452 271 44 391 189 418 267 39 110 64 137 166 69 0 195 431 479 39 549 44 594 140 39 453 103 513 194 39 418 121 462 186 39 180 120 228 176 39 491 153 547 213 71 614 147 639 269 68 177 7 353 139 +358 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091341.jpg 480 640 43 130 307 143 333 43 179 288 194 309 44 133 279 153 304 45 434 326 479 351 45 137 304 182 335 68 230 246 338 319 68 14 253 129 330 45 390 194 448 223 44 145 259 159 286 44 155 266 166 290 44 136 261 147 282 44 133 294 151 314 69 11 259 127 328 45 393 140 446 171 +359 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346940.jpg 640 426 43 17 56 73 119 43 0 117 45 172 43 5 80 57 152 45 0 256 225 372 43 0 99 45 153 43 11 157 47 202 43 3 69 23 86 69 1 150 420 417 +360 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554037.jpg 640 480 43 468 165 639 427 45 221 112 339 207 70 1 0 134 170 76 361 7 446 43 45 455 23 624 133 +361 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130555.jpg 480 640 43 325 255 333 273 43 315 256 324 274 43 313 249 321 273 44 0 310 31 362 68 13 252 94 319 43 307 249 315 277 43 320 248 334 274 43 312 248 322 271 45 244 305 288 326 49 165 188 179 195 44 28 291 47 340 44 12 283 33 328 +362 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438999.jpg 640 425 44 0 184 333 377 55 310 46 639 361 60 1 0 639 413 +363 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098018.jpg 640 427 44 157 400 173 426 45 105 356 151 391 45 110 412 178 426 75 8 164 46 215 75 383 242 477 321 +364 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109216.jpg 640 426 44 371 187 377 200 68 411 157 482 221 69 228 207 373 298 44 380 185 390 199 44 373 182 381 188 71 59 193 137 252 +365 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542611.jpg 339 500 44 243 369 283 435 44 94 351 137 393 44 297 269 338 349 44 146 97 258 198 70 137 122 310 388 44 178 143 290 203 +366 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308543.jpg 640 426 44 177 93 421 316 44 321 24 425 154 0 210 138 639 357 71 2 5 639 357 +367 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512912.jpg 500 334 44 18 124 279 262 45 93 15 360 215 46 314 124 421 228 46 271 98 313 122 46 243 115 285 130 +368 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412592.jpg 640 437 44 380 220 530 427 44 0 70 301 156 45 115 0 629 430 50 171 187 224 243 50 211 195 284 252 50 260 103 345 197 50 267 255 315 335 50 372 254 449 332 50 302 333 387 417 50 397 34 464 101 50 317 222 381 280 50 263 193 322 258 50 317 166 375 232 +369 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051476.jpg 640 574 44 574 294 639 332 45 458 0 639 139 45 425 140 637 284 45 213 145 427 271 45 0 143 180 284 45 80 74 140 130 45 82 65 143 92 45 135 85 180 130 45 318 288 443 398 45 4 286 218 430 44 151 145 211 202 44 443 145 525 240 45 326 1 457 140 45 85 55 133 74 45 216 288 300 428 55 141 61 176 92 69 447 286 542 430 +370 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227220.jpg 640 480 44 114 0 148 36 69 178 200 396 466 39 51 99 74 119 39 341 24 361 54 39 362 19 380 56 39 22 157 29 181 +371 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193015.jpg 500 375 45 0 26 185 149 46 0 86 363 370 +372 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110884.jpg 640 640 45 16 347 80 409 61 375 446 612 624 71 28 351 312 481 +373 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309775.jpg 640 428 45 126 296 202 351 45 66 271 146 324 45 424 207 495 257 39 177 128 197 186 39 151 138 174 186 44 105 235 153 269 44 100 0 129 93 45 65 241 140 283 39 48 137 100 214 41 606 257 639 331 45 384 353 510 427 45 622 358 639 409 +374 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267844.jpg 480 640 45 55 213 99 239 45 72 205 114 229 45 198 344 230 368 45 166 347 198 358 69 38 394 191 614 71 207 366 355 469 45 96 369 136 400 45 156 198 186 210 45 131 191 160 216 +375 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003661.jpg 640 384 46 61 0 552 348 66 0 163 115 207 41 567 19 639 239 +376 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007241.jpg 480 640 54 4 71 298 627 41 233 1 479 633 +377 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255928.jpg 418 640 61 332 342 389 412 71 144 297 225 336 +378 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362026.jpg 427 640 61 304 345 384 489 71 89 367 119 412 +379 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351149.jpg 429 640 61 233 298 322 466 61 82 290 126 458 71 302 301 428 404 71 335 405 428 544 +380 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238389.jpg 480 640 61 2 171 269 514 +381 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285433.jpg 640 480 61 224 24 542 473 71 76 91 259 210 +382 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356351.jpg 640 480 61 188 103 352 361 71 393 116 586 214 +383 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531569.jpg 427 640 61 175 321 251 472 +384 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311081.jpg 480 640 61 0 533 166 639 +385 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357475.jpg 640 480 61 2 127 209 476 +386 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521359.jpg 640 480 61 274 343 514 474 71 314 97 494 167 39 514 8 553 88 39 469 42 518 137 39 496 0 528 76 79 483 133 530 175 +387 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195897.jpg 480 640 61 63 299 276 632 71 425 455 478 594 +388 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327323.jpg 640 480 61 299 343 510 474 71 61 200 456 306 +389 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225867.jpg 640 426 61 286 187 404 390 71 150 272 248 384 +390 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428234.jpg 426 640 61 44 375 196 638 58 258 30 425 325 +391 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514682.jpg 640 480 61 13 292 138 479 71 150 276 266 321 39 138 186 153 229 +392 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560279.jpg 612 612 61 181 149 434 604 39 325 48 369 171 +393 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460812.jpg 480 640 61 24 433 117 557 71 168 350 278 404 78 108 216 144 237 +394 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302185.jpg 480 640 61 152 195 346 594 +395 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455343.jpg 640 480 61 61 268 245 473 +396 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458054.jpg 640 426 61 33 0 336 426 61 228 172 423 352 61 236 11 504 390 61 346 73 539 312 61 448 41 586 206 61 399 28 549 240 61 539 78 639 229 61 0 0 201 426 61 504 135 556 169 61 428 129 562 232 +397 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093331.jpg 480 640 61 226 529 406 639 71 0 366 158 433 +398 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109178.jpg 640 480 61 11 139 165 370 61 244 142 379 364 61 455 138 606 361 +399 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237723.jpg 480 640 61 291 579 347 639 +400 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265574.jpg 640 426 61 66 148 229 424 +401 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309495.jpg 326 500 61 138 229 325 428 +402 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032947.jpg 427 640 61 21 243 144 553 71 163 299 258 363 0 177 136 350 477 61 220 477 395 619 +403 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065124.jpg 640 480 61 180 301 331 448 +404 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555035.jpg 480 640 61 187 415 323 621 71 364 474 432 530 +405 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206958.jpg 480 640 61 260 536 399 630 71 295 362 424 557 +406 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066879.jpg 480 640 61 94 339 207 605 71 248 390 414 485 +407 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063715.jpg 375 500 61 268 306 374 490 61 52 317 191 490 +408 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345224.jpg 480 640 61 145 471 254 558 71 204 404 435 588 +409 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179611.jpg 426 640 61 128 420 198 517 +410 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257660.jpg 480 640 61 0 109 401 562 71 0 168 161 377 +411 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297976.jpg 480 640 61 222 377 366 605 71 57 378 155 397 +412 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063882.jpg 640 480 61 4 122 350 438 +413 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543660.jpg 640 640 61 405 123 501 344 61 145 106 241 338 +414 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480215.jpg 480 640 61 165 281 442 492 +415 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462982.jpg 480 640 61 102 322 212 595 71 417 395 477 446 41 293 283 314 313 +416 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219657.jpg 500 376 61 207 20 376 208 +417 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186079.jpg 480 640 61 270 431 479 632 +418 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057454.jpg 640 427 61 431 205 558 420 61 338 168 429 273 61 14 199 142 320 61 144 172 241 258 +419 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242073.jpg 640 480 61 193 208 430 472 +420 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117718.jpg 640 480 61 65 100 235 435 61 206 193 334 361 61 302 162 408 309 61 431 183 535 287 61 0 408 55 478 61 371 189 460 311 +421 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435533.jpg 640 478 61 171 0 402 288 71 404 78 637 470 +422 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412753.jpg 640 480 61 405 318 502 425 71 138 273 217 299 71 464 365 617 419 61 468 341 621 473 +423 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154363.jpg 427 640 61 63 440 153 533 71 13 443 49 496 +424 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206271.jpg 323 640 61 214 293 313 429 61 22 301 118 439 +425 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440299.jpg 640 480 61 172 0 524 420 +426 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017235.jpg 461 640 61 350 313 460 514 71 0 353 110 439 +427 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564127.jpg 428 640 61 111 214 307 569 +428 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136793.jpg 612 612 61 484 32 600 599 +429 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281019.jpg 640 360 61 290 208 417 354 71 452 246 555 288 41 578 266 592 300 41 463 218 482 245 41 378 206 397 225 +430 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175948.jpg 426 640 61 186 309 274 436 +431 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079689.jpg 480 640 61 397 431 456 528 0 1 50 176 632 56 109 333 238 626 +432 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497099.jpg 640 428 61 276 167 446 330 61 470 165 598 293 61 616 158 639 206 61 534 119 605 198 71 91 32 256 146 71 44 177 239 270 71 225 23 352 43 +433 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452516.jpg 427 640 61 0 287 421 639 +434 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127496.jpg 640 480 61 331 201 462 359 71 284 158 387 227 +435 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286907.jpg 480 640 61 232 340 380 565 +436 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248231.jpg 480 640 61 136 225 290 520 +437 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338098.jpg 427 640 61 47 359 187 639 71 160 338 295 398 +438 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334015.jpg 480 640 61 170 198 318 484 +439 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197278.jpg 640 426 61 271 237 304 280 +440 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303549.jpg 375 500 61 110 49 303 407 +441 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252857.jpg 427 640 61 37 495 129 632 +442 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022191.jpg 640 640 61 0 0 392 357 +443 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567093.jpg 480 640 61 116 310 340 639 +444 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111014.jpg 640 429 61 107 0 557 427 +445 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550597.jpg 640 427 61 332 255 444 404 71 47 176 291 418 +446 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577912.jpg 375 500 61 1 330 96 492 71 57 162 174 220 79 175 137 190 205 39 35 142 53 183 +447 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512463.jpg 480 640 61 132 215 342 611 +448 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322594.jpg 640 489 61 472 309 552 456 71 67 238 200 331 39 137 232 153 264 39 413 274 427 298 61 194 277 280 443 71 349 279 473 336 39 343 258 365 306 79 363 267 374 301 +449 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092124.jpg 360 640 61 247 384 359 630 71 212 350 354 425 39 325 328 348 386 +450 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360564.jpg 640 427 61 224 217 344 381 71 328 134 392 158 +451 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386786.jpg 640 480 61 93 113 375 473 +452 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531111.jpg 427 640 61 246 480 352 586 71 0 358 114 391 79 76 311 81 326 +453 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046869.jpg 480 640 61 198 239 285 339 71 329 185 414 215 58 302 124 360 182 58 365 132 418 178 39 257 152 280 197 +454 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147030.jpg 640 480 61 23 89 267 476 61 395 38 638 435 +455 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035498.jpg 500 375 64 67 22 367 271 71 0 22 123 367 +456 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110951.jpg 640 480 65 151 240 424 408 +457 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243857.jpg 640 425 68 403 138 499 180 69 369 196 506 373 71 113 233 232 263 43 378 202 388 211 43 379 195 389 208 43 386 198 392 205 43 376 201 383 212 45 18 58 35 66 45 362 211 381 222 45 37 124 58 133 75 20 140 53 167 +458 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375317.jpg 480 640 68 0 125 169 339 71 379 317 479 347 69 1 328 290 630 +459 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499391.jpg 480 640 69 0 424 478 629 +460 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320480.jpg 427 640 69 256 370 359 573 71 0 420 117 497 71 326 343 368 365 0 63 152 274 638 0 99 235 164 395 41 28 400 56 421 41 1 404 22 425 41 0 410 12 433 41 323 351 346 373 41 311 352 326 375 41 293 352 309 382 +461 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577212.jpg 500 375 69 463 104 499 178 71 95 134 340 209 24 37 26 65 54 +462 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086320.jpg 500 336 71 308 252 396 299 +463 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088846.jpg 640 426 71 390 333 556 412 +464 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545597.jpg 640 360 71 56 250 294 358 +465 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366867.jpg 480 640 71 17 319 237 422 61 0 586 58 639 79 278 361 309 387 +466 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080219.jpg 640 480 71 212 385 639 473 41 174 279 236 370 41 83 277 174 365 41 111 232 187 291 +467 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146730.jpg 640 480 71 0 125 356 479 +468 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323186.jpg 500 375 71 415 203 471 207 58 0 16 126 368 58 415 102 467 201 +469 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024924.jpg 480 640 71 95 294 162 304 +470 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298461.jpg 640 480 71 156 244 277 282 69 454 220 608 246 69 0 118 150 321 68 7 164 150 324 +471 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386929.jpg 427 640 71 253 351 331 380 56 117 398 128 465 69 315 400 408 434 +472 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425371.jpg 640 480 71 385 277 544 350 +473 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033243.jpg 500 333 71 0 180 112 233 71 88 158 145 180 +474 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339943.jpg 640 480 71 454 196 627 260 +475 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187513.jpg 427 640 71 20 490 123 525 61 105 455 255 639 +476 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494438.jpg 480 640 71 432 539 479 605 61 94 396 115 462 +477 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006213.jpg 640 425 71 406 253 496 286 71 589 292 639 312 +478 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237316.jpg 375 500 71 166 243 261 288 61 62 260 162 480 +479 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097017.jpg 640 480 71 355 296 601 412 +480 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474003.jpg 640 480 71 327 263 634 472 61 239 296 380 437 +481 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549171.jpg 359 640 76 182 15 358 115 0 0 1 359 632 +482 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117191.jpg 375 500 77 74 173 281 340 61 110 29 252 404 +483 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312278.jpg 640 293 28 60 25 373 235 28 373 61 614 248 +484 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373140.jpg 640 428 7 542 168 588 231 7 459 140 545 265 7 587 184 606 209 7 112 46 465 397 2 617 190 632 202 2 602 187 618 204 5 541 169 586 231 +485 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325907.jpg 506 640 0 130 130 506 639 0 0 35 140 230 +486 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084762.jpg 640 424 0 171 74 332 363 0 262 77 322 295 0 499 70 521 94 0 94 54 142 154 0 331 72 466 252 0 477 69 577 216 0 565 76 634 193 0 471 78 508 108 0 290 68 344 220 0 558 74 587 105 0 132 89 162 120 3 112 99 350 378 3 328 91 459 242 3 484 87 558 222 3 565 84 625 195 3 8 78 141 280 3 287 90 359 219 3 459 84 499 172 3 369 209 406 261 3 620 139 638 160 3 550 88 576 122 +487 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455384.jpg 640 480 0 210 125 348 258 27 266 205 282 238 0 439 156 508 250 0 404 127 456 220 7 43 39 610 327 0 308 140 389 228 0 497 154 555 268 0 109 94 127 152 2 610 205 639 273 67 274 174 288 199 0 81 104 93 149 +488 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352334.jpg 640 443 41 21 247 39 270 41 63 247 79 265 75 23 227 50 265 41 11 253 30 275 +489 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541279.jpg 640 480 41 266 305 303 340 44 271 222 285 239 44 304 225 319 248 76 216 245 234 270 45 296 316 332 330 69 328 345 415 479 69 73 386 199 471 71 97 310 284 414 39 65 302 80 377 +490 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418226.jpg 500 375 61 37 268 89 367 61 188 234 235 356 61 312 225 330 293 61 403 181 451 225 61 393 228 400 245 +491 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386755.jpg 640 480 61 1 0 163 373 +492 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256668.jpg 375 500 61 56 164 325 494 +493 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060760.jpg 375 500 61 240 412 374 494 +494 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348216.jpg 480 640 61 0 473 374 639 61 215 265 365 342 61 235 247 355 292 61 256 233 355 273 61 268 226 350 254 61 48 368 368 608 61 161 290 358 424 61 279 222 348 242 +495 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295769.jpg 480 640 71 0 440 118 629 +496 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543118.jpg 480 640 73 63 332 84 398 73 357 313 360 333 73 395 280 400 302 73 355 368 368 392 73 281 394 285 424 73 234 226 237 262 73 310 241 314 270 73 30 430 35 498 73 382 95 386 109 73 447 113 453 129 73 292 79 296 99 73 324 312 330 337 74 52 339 59 400 74 105 198 210 413 73 436 307 442 326 73 1 24 479 479 +497 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503983.jpg 640 427 74 470 146 485 160 +498 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270918.jpg 480 640 0 61 598 93 639 2 402 610 470 635 2 469 612 479 636 +499 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189634.jpg 500 375 46 294 202 338 338 46 257 201 305 337 46 234 187 282 323 46 194 185 248 322 +500 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215812.jpg 640 480 61 378 157 516 408 61 133 166 267 434 +501 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538589.jpg 427 640 61 276 386 353 562 +502 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540186.jpg 621 640 71 344 275 442 301 71 307 292 327 298 +503 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340737.jpg 427 640 71 0 352 111 555 +504 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202658.jpg 427 640 56 302 114 426 431 61 8 267 280 592 +505 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014108.jpg 640 480 16 382 278 579 461 16 193 85 238 212 62 102 52 326 233 56 0 251 48 460 +506 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483994.jpg 640 557 16 362 44 464 171 18 207 301 504 452 18 119 146 302 316 18 4 136 212 308 18 262 123 398 283 18 508 153 600 268 18 160 341 330 489 18 366 270 639 430 18 1 300 212 502 18 414 81 519 257 18 622 237 639 280 +507 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411187.jpg 640 468 16 106 6 597 370 +508 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091612.jpg 640 428 16 176 91 426 423 16 401 13 453 84 0 225 0 606 422 0 552 0 639 288 13 344 230 639 427 0 21 0 54 49 26 609 50 639 115 +509 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137595.jpg 640 480 16 134 263 333 478 62 296 86 512 313 58 15 151 38 178 75 66 129 97 188 75 0 229 39 323 58 29 81 111 185 +510 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169076.jpg 612 612 16 222 293 591 594 62 23 30 292 265 0 53 75 178 205 0 153 111 251 209 15 194 294 592 593 59 316 328 404 386 +511 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107542.jpg 640 426 16 540 186 630 348 13 0 0 493 420 13 317 0 639 266 13 617 0 639 41 +512 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084980.jpg 500 332 16 312 109 369 153 18 0 156 77 247 18 33 145 125 248 0 480 0 499 26 0 165 0 194 19 0 445 1 483 22 18 42 140 95 163 0 291 0 308 19 0 17 0 35 20 0 88 0 129 19 0 189 0 208 18 0 200 0 233 18 0 359 0 399 18 18 46 194 79 243 0 127 0 168 19 0 258 0 296 18 0 59 0 94 18 0 217 0 255 19 0 1 0 493 331 +513 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515226.jpg 640 480 16 346 211 473 403 16 183 204 304 420 0 148 166 165 186 0 167 170 183 185 0 183 161 208 183 0 620 95 639 171 13 0 169 640 479 13 180 176 255 182 +514 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169800.jpg 640 493 16 377 290 415 403 0 411 129 506 391 26 484 209 511 256 9 259 93 277 114 +515 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096618.jpg 640 590 16 331 212 613 581 +516 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000070493.jpg 500 375 16 259 97 358 165 16 0 129 72 175 16 338 110 370 161 5 1 0 499 354 11 38 198 190 340 16 400 44 499 164 16 133 115 174 167 +517 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062875.jpg 640 338 16 56 195 229 315 18 148 47 376 229 18 366 29 489 94 18 364 17 564 177 18 319 71 490 221 +518 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531189.jpg 288 352 16 80 174 112 251 10 115 105 179 223 +519 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566027.jpg 640 480 16 290 194 349 307 10 288 123 351 229 +520 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029393.jpg 500 375 16 170 157 365 340 49 344 244 351 253 49 322 230 331 242 49 356 165 369 180 +521 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580540.jpg 480 640 16 28 144 137 263 62 10 104 237 286 15 304 314 479 510 +522 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490105.jpg 640 480 16 210 95 341 202 62 135 45 357 226 56 2 247 78 453 0 146 98 221 192 16 432 277 611 451 +523 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444236.jpg 640 480 58 59 292 102 321 58 339 301 404 331 58 223 293 261 320 58 172 300 223 325 58 413 296 464 322 58 306 296 335 325 5 273 206 542 338 0 540 299 556 347 0 274 294 294 361 2 566 325 621 372 9 2 73 62 219 0 344 148 382 210 58 0 287 28 314 58 320 295 353 324 58 551 299 633 345 58 108 292 158 323 58 453 302 524 345 58 251 298 303 330 +524 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511236.jpg 500 375 58 264 162 447 330 2 69 64 200 104 2 221 75 280 100 2 273 79 340 106 2 313 99 442 171 2 190 70 216 97 61 143 219 247 336 2 304 76 345 100 2 425 96 446 126 2 380 87 420 103 +525 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253036.jpg 640 427 58 3 245 59 342 5 276 173 582 392 0 414 235 431 253 0 375 232 405 263 0 522 235 536 267 0 392 231 407 251 9 503 83 524 113 5 208 213 291 321 9 481 85 500 117 +526 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125476.jpg 640 427 58 0 117 216 426 58 523 304 565 385 13 141 101 506 426 +527 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077396.jpg 640 480 62 270 40 496 188 15 230 202 392 367 15 92 344 263 479 60 446 302 635 479 56 128 221 240 351 63 141 150 237 215 65 351 40 396 47 65 489 228 513 237 73 564 307 639 363 +528 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178671.jpg 640 500 62 15 188 66 251 56 242 218 304 295 59 115 215 639 494 41 170 215 175 225 41 191 214 196 224 46 334 209 346 225 56 202 241 220 272 60 161 224 217 232 75 302 204 312 222 47 330 212 334 216 49 329 217 335 222 +529 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131138.jpg 640 480 62 150 120 318 303 41 224 376 265 433 44 131 384 170 412 63 314 143 449 258 66 267 296 419 374 58 125 111 248 224 66 326 221 423 239 0 534 119 555 139 41 126 335 170 385 41 177 336 219 391 64 264 361 297 389 +530 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302110.jpg 640 480 62 516 1 639 82 15 307 210 394 335 45 244 378 352 467 73 572 164 591 212 73 557 161 573 211 73 578 165 598 214 73 239 377 362 478 73 563 95 633 114 73 564 163 585 210 45 1 427 128 472 +531 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155142.jpg 640 480 62 81 170 238 270 28 462 340 639 458 59 396 404 639 477 +532 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041872.jpg 640 426 62 523 88 601 176 56 327 255 431 368 56 252 252 322 354 59 0 215 266 357 74 178 139 224 195 +533 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513073.jpg 500 281 62 295 57 358 120 59 0 181 499 280 56 1 115 52 239 0 145 158 376 276 0 318 67 342 99 24 368 83 416 119 +534 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166565.jpg 640 480 62 504 120 628 211 56 429 181 639 468 63 303 145 399 241 63 188 108 307 209 64 251 293 294 312 64 430 168 454 179 65 585 116 599 130 66 75 296 245 446 66 363 163 418 201 62 339 44 398 134 65 599 120 613 131 65 613 122 626 134 66 336 203 368 234 76 393 116 401 129 76 411 120 422 153 62 1 152 118 370 62 286 71 341 170 +535 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247123.jpg 299 300 62 66 18 246 142 73 222 236 241 271 73 165 231 170 271 73 173 230 205 269 73 205 233 227 270 73 211 235 235 270 +536 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550722.jpg 500 375 62 168 36 316 150 74 445 21 484 73 63 274 194 499 367 +537 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528386.jpg 640 480 62 278 204 400 338 39 50 253 74 344 39 84 251 112 342 39 111 282 135 343 39 22 259 44 334 39 497 261 519 321 39 511 226 525 290 39 523 262 544 321 39 541 268 563 319 39 473 223 492 292 39 568 253 589 319 39 491 230 505 294 39 545 247 567 290 39 78 223 95 298 39 1 220 627 351 +538 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187249.jpg 640 480 62 32 1 484 384 39 473 0 639 472 0 136 126 374 315 0 267 127 453 320 +539 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291380.jpg 500 375 62 118 184 177 237 0 162 137 247 229 24 128 137 156 167 56 173 191 227 229 +540 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321476.jpg 500 375 14 126 313 174 346 14 83 282 130 308 14 27 312 48 353 14 165 351 200 374 14 171 274 224 315 14 194 275 240 300 14 240 262 276 307 14 275 260 315 305 14 355 154 386 175 14 332 355 366 374 14 398 222 441 255 14 313 290 361 327 14 444 288 466 315 14 417 278 449 307 14 410 256 448 277 14 399 174 417 203 14 417 185 457 209 14 323 137 339 154 0 121 79 220 294 13 207 139 373 279 14 447 180 477 205 14 4 55 499 312 +541 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327433.jpg 640 427 14 327 147 332 154 14 342 147 345 153 14 379 147 385 154 14 424 148 431 154 22 164 220 224 247 22 99 223 154 244 23 380 128 430 254 14 3 142 9 155 14 338 147 342 155 14 316 103 319 110 14 334 147 337 154 14 392 147 397 154 14 433 149 437 154 14 307 114 309 118 14 400 116 404 118 +542 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501116.jpg 640 480 14 318 225 327 231 9 282 220 353 279 9 495 294 543 409 9 588 376 639 477 +543 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136008.jpg 640 480 14 176 169 243 219 56 51 275 278 479 +544 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458846.jpg 500 375 14 126 169 131 176 14 140 168 143 176 2 289 289 499 370 9 121 189 139 235 9 454 265 477 289 9 188 297 198 322 14 407 212 417 223 14 392 211 401 218 14 321 202 327 206 14 341 202 349 211 14 429 217 439 226 14 169 169 176 178 14 149 167 155 176 14 158 169 165 177 14 185 171 190 177 14 195 171 201 177 14 279 177 287 183 14 201 171 465 230 +545 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505733.jpg 640 266 14 234 65 377 218 14 60 114 190 228 23 512 51 632 193 23 445 141 527 186 +546 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435569.jpg 640 428 14 285 155 314 216 14 311 168 367 213 14 93 379 105 397 14 20 380 33 407 14 205 197 282 233 22 174 209 386 355 23 215 29 542 323 14 632 43 639 54 +547 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413839.jpg 640 480 14 398 100 500 184 14 408 249 476 318 0 70 70 251 360 14 433 229 509 274 14 318 252 385 276 13 2 170 631 399 14 569 257 635 278 14 451 223 465 235 14 470 275 496 327 14 577 305 614 342 14 0 260 19 278 14 231 219 254 274 14 4 249 20 264 14 54 253 79 268 +548 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536154.jpg 500 363 15 376 123 484 346 0 186 77 358 251 77 100 128 144 157 77 96 121 188 193 77 138 218 205 304 77 184 263 259 350 77 347 144 413 209 77 354 62 409 147 77 195 140 239 211 77 167 116 207 162 77 281 13 335 93 77 326 273 377 344 77 19 111 112 214 77 161 152 353 192 +549 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074268.jpg 427 640 15 82 35 293 535 13 0 203 427 639 +550 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115070.jpg 480 640 15 60 96 163 266 13 114 2 479 225 15 0 290 226 630 +551 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109869.jpg 425 640 15 4 7 374 622 56 1 1 424 631 13 1 0 424 640 +552 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233446.jpg 640 511 15 66 185 301 410 +553 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469424.jpg 640 480 15 200 145 485 311 13 1 248 159 445 13 211 202 639 429 +554 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323128.jpg 479 640 15 205 232 478 494 43 243 480 466 538 43 370 523 473 631 +555 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022129.jpg 640 480 15 285 123 365 265 0 50 0 292 209 13 185 0 639 480 24 419 0 639 185 24 60 40 235 144 0 51 2 229 138 0 3 0 69 108 +556 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559047.jpg 640 430 15 354 93 486 337 13 264 164 589 417 58 577 342 639 404 +557 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181586.jpg 640 480 15 1 139 379 436 15 264 73 555 351 +558 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044823.jpg 640 428 17 254 196 492 427 0 321 130 421 340 0 533 190 582 295 17 80 216 273 332 17 507 220 639 347 +559 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011320.jpg 500 395 17 258 285 291 306 0 399 292 417 341 0 369 290 374 310 0 358 292 363 305 0 290 287 298 308 0 197 285 205 307 0 176 284 182 311 0 68 281 81 323 7 221 282 252 310 0 377 286 385 309 10 345 319 361 349 0 58 285 65 322 0 129 288 142 316 0 167 284 177 313 0 161 285 169 313 0 152 289 169 329 7 344 282 365 306 0 65 265 378 323 +560 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143653.jpg 500 352 17 271 229 302 255 17 246 228 263 253 18 306 284 323 303 18 204 268 215 281 18 398 280 420 301 18 340 282 359 301 18 392 261 402 270 6 15 167 137 271 0 470 260 485 308 0 252 221 262 231 18 250 278 271 302 18 199 266 205 280 18 164 262 181 280 18 167 230 174 237 18 317 280 340 299 18 370 282 393 306 17 290 229 335 257 18 224 273 257 299 18 131 216 499 307 +561 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327872.jpg 640 359 18 181 181 272 267 18 426 160 463 223 18 302 160 349 225 18 349 179 388 216 18 498 158 537 226 18 518 186 604 292 18 106 168 153 224 18 58 163 108 246 18 166 163 206 224 18 0 177 51 239 18 261 159 308 223 18 259 154 286 182 18 51 170 120 191 18 304 156 639 264 +562 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059393.jpg 640 480 18 112 186 304 323 18 393 194 470 255 +563 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190776.jpg 480 640 18 84 406 222 536 18 305 405 358 452 18 368 418 425 499 18 41 385 54 396 +564 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066561.jpg 640 427 18 187 70 607 369 18 53 135 219 391 +565 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271900.jpg 640 480 18 1 185 426 472 18 402 81 639 479 18 1 142 303 268 18 5 0 130 108 18 0 36 100 236 +566 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091899.jpg 640 355 18 135 16 639 300 18 0 119 355 327 18 313 128 639 311 +567 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579885.jpg 640 480 18 85 174 183 285 18 194 135 317 272 18 232 43 298 116 18 315 177 401 244 18 276 190 488 405 18 357 286 517 396 +568 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545788.jpg 640 480 18 182 452 199 465 18 200 447 223 461 18 235 443 249 456 18 300 421 322 439 18 328 417 347 430 18 362 403 380 413 18 382 401 404 415 18 432 390 443 405 18 522 367 543 381 18 409 383 423 390 18 549 287 560 298 18 165 444 181 456 18 197 447 205 462 18 525 362 544 374 18 71 204 639 479 +569 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033830.jpg 640 550 18 291 406 551 549 18 2 377 301 542 76 262 374 285 396 0 256 211 387 398 0 1 1 639 522 0 324 52 415 190 +570 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380756.jpg 640 480 18 212 285 310 356 5 353 90 637 464 18 74 313 191 384 18 0 278 81 372 18 16 214 107 289 18 193 221 265 274 18 114 217 190 282 18 276 256 350 299 18 158 288 244 365 18 291 237 354 284 18 123 272 211 298 18 204 271 288 297 7 366 88 639 465 18 87 307 173 322 18 226 213 289 276 18 0 180 387 348 +571 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373255.jpg 640 428 18 407 243 428 257 18 302 236 309 239 18 259 237 269 249 0 444 213 454 231 18 280 244 293 257 18 294 242 309 254 18 319 237 332 247 18 339 246 355 257 18 376 244 390 255 18 387 241 402 251 18 429 244 447 256 18 354 234 368 240 18 202 226 214 235 18 25 222 39 236 17 437 223 462 235 18 164 242 188 255 19 129 241 144 257 19 165 238 190 256 19 76 237 87 252 19 230 241 250 251 19 39 237 66 253 19 21 238 43 248 19 25 222 38 233 19 129 213 139 218 0 160 224 168 232 18 0 205 536 266 +572 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442539.jpg 640 486 18 112 236 194 314 18 136 204 209 257 18 11 223 93 334 18 191 231 264 330 18 255 229 336 351 18 283 216 327 229 18 308 229 400 337 18 339 186 415 238 18 418 245 513 340 18 359 208 432 310 18 492 220 563 246 +573 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264737.jpg 480 640 18 330 292 475 466 19 222 35 479 412 0 409 0 479 84 0 300 1 407 54 18 56 222 215 369 18 59 313 295 590 18 64 431 193 633 0 22 26 99 257 0 113 2 126 45 18 239 418 479 633 0 0 1 99 631 0 132 4 143 44 +574 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213758.jpg 640 480 18 157 163 263 282 +575 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239148.jpg 640 427 18 96 283 230 374 18 379 269 525 380 18 147 281 273 359 18 299 300 396 375 18 459 251 531 279 18 544 236 634 318 18 600 261 639 351 18 504 254 582 331 18 429 236 540 272 +576 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383039.jpg 640 388 18 149 10 423 307 18 345 0 639 326 +577 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233567.jpg 480 640 18 121 238 302 616 18 70 170 372 467 18 92 89 366 246 18 459 147 478 321 18 118 53 252 154 19 121 240 301 619 18 319 58 448 162 +578 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115069.jpg 640 480 18 342 272 385 326 18 446 273 512 321 18 323 141 375 174 18 177 55 200 80 18 92 90 132 121 18 155 56 201 87 +579 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192479.jpg 640 480 18 2 288 52 325 18 203 76 432 456 +580 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176606.jpg 640 480 18 214 100 459 369 2 63 195 128 249 0 25 179 69 347 67 28 250 36 256 +581 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434060.jpg 640 427 18 274 268 368 337 18 400 268 484 351 18 453 251 504 313 18 399 207 425 224 18 506 206 527 223 18 297 203 327 234 18 108 228 142 268 18 440 197 449 203 18 240 233 295 278 18 81 225 100 251 18 195 227 243 266 18 428 213 454 237 18 594 218 624 245 18 436 205 463 223 18 1 191 639 328 +582 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545958.jpg 640 428 19 380 261 571 395 +583 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305978.jpg 640 480 19 185 316 304 412 0 595 303 612 329 0 560 293 592 330 0 610 294 632 319 0 621 296 639 329 0 543 306 559 329 0 587 302 597 324 23 120 151 374 427 0 604 294 615 313 7 524 309 639 397 28 563 215 593 231 28 611 224 631 234 0 628 286 638 299 23 313 308 406 397 +584 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416385.jpg 640 425 19 232 281 283 384 2 148 236 319 373 2 0 247 204 403 2 464 169 639 419 5 298 31 639 393 0 213 213 247 240 0 353 128 395 204 0 497 141 571 208 0 409 116 456 178 0 552 128 580 159 0 458 128 498 200 19 55 279 191 410 +585 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576981.jpg 427 640 39 0 398 151 639 45 0 160 228 411 49 60 163 155 227 49 1 189 67 267 49 115 187 201 276 49 61 269 153 352 +586 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113139.jpg 640 480 39 191 84 268 330 39 316 116 395 182 40 302 145 423 342 40 246 127 341 241 41 222 241 338 389 39 158 74 205 301 56 2 3 171 231 39 249 99 325 154 60 13 263 639 479 +587 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292945.jpg 640 425 39 158 325 164 340 0 175 311 308 353 13 276 325 470 406 13 425 331 615 418 13 35 323 280 394 13 1 325 54 355 13 613 317 636 347 0 11 320 140 393 +588 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449976.jpg 500 333 39 289 220 390 272 13 0 0 499 327 +589 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488075.jpg 640 480 39 620 143 632 183 39 630 156 639 185 39 411 179 416 190 39 415 179 420 190 39 444 164 449 174 39 436 179 438 188 56 414 251 599 449 56 101 395 210 479 68 353 109 425 153 45 501 426 617 479 72 235 117 267 320 39 431 164 439 174 69 348 164 415 196 56 577 325 639 444 +590 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069577.jpg 640 426 39 40 188 69 246 56 443 40 584 142 60 0 83 640 425 0 274 0 384 141 47 275 257 327 285 51 119 362 145 377 51 188 265 207 292 51 119 349 141 366 51 95 348 156 391 51 156 266 201 297 55 208 183 291 261 39 288 143 310 193 41 16 159 56 211 45 567 252 628 306 45 541 214 603 261 46 480 185 494 202 0 0 0 103 148 41 0 150 23 200 45 338 179 363 210 45 32 139 108 170 45 60 180 193 257 50 158 331 233 381 50 204 371 219 386 0 129 0 294 143 43 213 159 307 179 46 445 156 494 203 +591 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026564.jpg 640 426 39 554 240 609 353 63 435 194 578 300 64 422 326 469 365 66 215 268 409 326 73 110 204 127 268 73 64 266 164 301 73 50 292 173 347 62 253 90 404 266 64 411 279 436 301 73 126 194 146 267 73 119 192 137 268 73 63 200 79 271 73 97 197 112 271 73 133 188 163 271 73 158 197 169 271 73 153 175 181 270 73 65 195 86 271 73 68 192 98 269 73 96 190 120 269 +592 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109231.jpg 640 425 56 593 196 638 263 4 19 145 639 320 4 125 124 343 202 0 312 122 427 423 0 72 150 106 213 0 51 141 73 215 0 188 148 203 167 0 229 154 241 171 0 485 177 502 193 0 513 141 529 173 0 205 151 227 171 0 418 141 431 189 0 453 172 479 193 0 568 146 581 162 0 537 141 551 163 7 570 142 639 178 56 103 183 137 210 0 225 147 237 171 0 103 142 603 209 +593 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060548.jpg 500 334 57 311 189 499 329 0 285 138 495 295 41 323 224 335 243 65 153 228 164 232 59 13 203 222 324 +594 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426917.jpg 640 480 1 496 339 601 477 5 185 43 432 427 0 273 127 294 149 0 238 257 290 297 0 611 270 628 326 0 534 280 553 323 0 442 281 456 299 0 587 273 601 319 0 545 289 565 332 0 625 260 639 334 0 547 277 561 300 1 503 330 527 400 1 534 320 558 335 2 0 304 20 336 24 594 282 604 302 0 592 282 622 348 0 555 277 568 311 26 620 303 627 314 26 518 290 520 296 0 513 282 528 329 2 0 303 183 431 2 166 292 188 327 2 103 297 178 334 +595 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110881.jpg 640 425 1 488 170 639 423 2 38 42 84 154 3 13 39 293 332 3 179 26 639 418 0 383 66 415 103 0 559 63 609 161 12 462 58 472 71 0 272 61 311 162 0 349 60 392 153 +596 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420882.jpg 480 640 1 355 529 378 554 13 92 561 223 639 13 270 540 479 636 0 191 495 203 513 1 185 537 206 574 0 160 518 184 562 +597 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434410.jpg 640 478 1 402 85 497 228 0 274 73 441 467 13 189 262 410 472 32 592 200 617 224 1 371 76 406 85 +598 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093964.jpg 640 428 1 531 248 550 294 2 565 272 583 283 2 604 259 636 292 2 546 273 558 278 5 21 128 518 305 9 520 102 534 134 1 508 243 535 293 2 544 268 554 272 0 84 188 115 209 +599 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318200.jpg 500 333 1 219 164 222 173 2 84 153 124 180 2 165 156 188 172 2 0 148 53 206 2 141 158 153 168 2 121 155 143 170 2 156 158 167 168 5 0 107 74 182 0 285 103 322 240 0 400 112 444 261 0 348 107 379 194 0 257 130 295 224 0 326 107 359 265 0 348 93 405 273 0 438 101 483 312 0 218 151 224 170 1 205 169 213 187 25 315 68 406 109 25 393 100 421 124 25 315 104 376 116 0 434 105 479 181 0 275 131 288 162 0 251 148 257 168 0 346 118 356 136 2 190 157 197 163 24 321 138 331 170 26 268 173 281 201 26 421 131 438 206 24 291 124 316 143 24 386 156 396 177 0 323 127 334 138 25 239 141 258 152 0 146 142 252 191 +600 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461123.jpg 640 425 2 60 176 74 186 4 212 186 522 273 2 172 170 193 183 2 227 164 243 175 7 32 173 55 187 7 128 174 167 187 2 240 166 261 177 +601 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302137.jpg 640 428 2 566 213 639 324 2 534 220 566 262 2 3 196 134 302 2 553 217 593 248 5 10 141 541 280 9 596 115 607 160 0 43 208 82 225 0 362 187 380 201 0 255 188 268 200 0 131 187 146 202 0 117 187 134 203 0 71 182 95 203 0 300 186 315 200 +602 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182874.jpg 640 427 2 385 321 437 356 2 449 316 479 336 2 480 275 501 288 2 429 324 457 346 2 112 317 136 361 5 135 228 380 395 5 481 290 561 355 5 523 248 548 272 0 162 284 199 315 +603 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106661.jpg 640 427 2 395 146 439 162 3 4 149 317 343 3 54 155 303 267 3 281 133 408 254 3 426 152 517 203 0 571 152 603 197 3 541 152 577 206 3 395 162 418 191 3 276 162 411 211 7 447 52 561 202 3 420 152 489 200 +604 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151733.jpg 424 640 2 85 301 118 324 2 29 298 65 317 2 15 299 32 313 2 3 298 27 312 5 116 247 300 367 0 240 291 255 311 2 3 298 8 303 +605 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347768.jpg 640 286 2 565 120 639 269 2 523 140 595 226 2 480 103 579 209 5 158 68 617 175 0 336 119 356 143 7 0 17 165 228 0 0 94 35 136 0 480 100 499 113 0 443 100 455 113 0 422 98 428 108 0 273 104 283 112 0 176 102 188 124 0 532 96 542 106 0 494 98 510 114 2 317 131 383 142 2 285 103 444 251 0 241 104 245 114 0 521 101 529 110 +606 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198495.jpg 640 343 2 0 19 86 180 3 13 8 626 340 +607 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562708.jpg 640 428 2 87 228 174 322 2 158 248 208 292 2 411 254 423 268 2 450 250 471 265 2 202 248 224 277 2 434 255 452 265 2 484 252 506 261 2 421 256 433 267 2 514 252 529 261 2 542 252 558 259 5 220 131 414 354 5 1 76 117 385 2 589 264 618 288 2 609 256 626 269 2 622 248 636 258 2 415 235 629 270 +608 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201934.jpg 500 375 2 261 160 296 192 2 282 159 305 185 2 290 155 310 177 2 306 155 320 172 2 311 154 323 166 5 0 58 261 297 +609 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524533.jpg 640 427 2 548 311 638 426 2 0 259 64 293 5 70 146 637 353 0 325 155 351 183 0 311 167 326 182 0 297 164 313 183 9 360 166 373 177 0 551 154 565 172 0 99 246 122 268 0 261 174 273 187 0 578 140 602 170 7 0 258 64 294 56 427 164 440 177 56 469 163 481 175 56 385 166 403 179 56 346 169 358 181 56 271 172 288 185 56 324 170 335 183 0 287 178 295 184 0 397 166 405 169 0 157 155 174 182 0 602 153 612 170 0 294 168 301 175 56 560 153 572 172 58 9 272 80 299 56 514 155 527 173 56 404 175 413 179 0 203 176 213 185 56 525 154 530 173 +610 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392392.jpg 640 427 2 0 124 161 294 2 489 150 587 220 2 598 188 634 211 3 165 186 333 408 3 355 183 462 341 0 170 58 315 299 0 358 94 468 265 0 530 158 540 165 0 421 105 462 180 9 570 53 639 105 0 250 74 328 307 +611 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524992.jpg 640 480 2 597 266 639 436 2 610 239 639 264 5 97 26 550 445 0 614 235 630 275 5 542 140 584 286 0 542 218 565 308 5 0 167 111 288 +612 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284160.jpg 640 480 2 22 378 95 441 5 133 162 552 472 0 350 336 462 472 0 47 392 120 479 9 0 357 42 420 2 42 377 124 428 9 0 58 35 280 9 25 58 75 279 +613 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449872.jpg 640 480 2 559 308 596 335 2 480 299 519 318 2 439 295 482 316 2 578 305 612 326 0 73 284 89 325 2 607 304 639 331 7 516 298 550 327 0 402 293 413 305 0 606 302 611 309 2 352 295 377 307 2 408 293 444 321 2 549 303 594 320 2 383 293 409 310 7 308 291 351 307 +614 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543203.jpg 640 283 2 599 255 608 260 4 0 1 342 278 4 428 163 565 248 4 554 181 606 242 4 142 112 467 280 4 590 175 633 229 7 598 249 615 260 4 587 190 637 240 7 349 258 398 270 7 632 250 639 257 +615 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199951.jpg 640 480 2 53 151 78 155 2 173 143 190 148 3 311 239 403 286 0 336 231 378 260 2 93 149 118 152 2 351 134 378 149 2 374 133 394 142 7 21 143 75 157 +616 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180541.jpg 640 426 2 445 254 638 419 2 0 218 44 272 5 45 2 602 355 +617 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463084.jpg 640 480 2 2 261 33 288 2 26 264 44 278 2 204 262 216 281 5 217 203 486 357 5 83 240 161 297 0 480 262 514 336 0 392 243 426 273 26 494 279 515 309 0 366 242 390 273 0 244 254 256 269 13 498 306 505 336 2 0 263 6 270 +618 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312559.jpg 640 480 2 125 240 207 304 5 184 199 383 275 1 46 301 81 342 7 519 166 639 260 13 0 278 60 348 9 358 177 366 185 0 103 230 122 287 0 10 235 20 270 7 422 175 567 252 9 368 107 381 160 +619 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482707.jpg 640 427 2 361 1 482 23 3 0 14 575 417 3 128 4 385 174 2 482 0 503 17 +620 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252911.jpg 640 427 2 0 139 111 249 2 62 85 495 303 3 283 201 477 324 0 337 145 453 294 11 619 134 624 144 0 298 137 330 178 +621 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525021.jpg 640 427 2 398 204 463 231 2 358 197 413 217 2 378 207 414 230 3 34 183 266 341 3 598 212 633 253 3 523 211 569 242 3 501 210 528 242 3 464 214 484 238 3 448 206 480 238 0 101 140 161 341 0 73 153 114 284 0 359 200 454 236 0 379 200 388 229 0 479 199 489 216 0 514 194 529 219 0 531 198 541 215 0 535 196 556 243 0 581 192 608 251 0 488 198 505 240 3 420 211 455 236 0 621 191 639 251 2 327 206 338 212 3 561 210 598 248 +622 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520009.jpg 500 412 2 0 334 216 411 5 220 289 407 393 0 449 335 484 409 0 449 322 484 367 74 319 136 332 152 9 266 172 324 256 9 106 283 113 307 9 0 226 18 264 0 186 334 193 344 74 366 137 373 153 +623 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205676.jpg 640 451 2 430 148 638 392 2 107 134 168 206 5 167 12 520 248 0 244 87 347 421 0 10 127 89 333 0 14 113 45 180 27 177 178 203 276 26 259 142 338 288 26 111 168 164 269 26 9 192 40 245 0 508 115 540 168 0 607 106 639 146 0 44 117 63 133 2 80 124 126 175 26 528 131 535 152 67 132 289 140 309 0 0 119 6 144 0 129 114 234 439 0 6 125 19 178 +624 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278848.jpg 480 640 2 404 343 438 377 5 70 43 387 301 0 83 381 190 639 0 168 360 237 632 0 357 393 438 605 25 102 273 274 326 25 254 332 419 435 25 281 290 430 341 0 297 428 360 616 2 436 352 478 393 +625 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287396.jpg 640 480 2 0 262 56 419 2 45 271 203 405 5 196 24 600 465 0 232 238 308 316 9 534 132 580 219 9 85 52 127 203 2 590 283 639 400 9 1 40 28 175 +626 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463037.jpg 640 427 2 611 243 639 259 4 0 98 640 385 +627 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471488.jpg 640 480 2 461 291 573 354 3 2 309 636 474 0 409 292 429 342 0 99 278 200 449 0 592 270 639 341 12 418 306 424 319 26 419 306 429 319 +628 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241728.jpg 500 375 2 390 193 499 274 5 6 127 142 267 0 223 189 285 350 0 52 172 132 374 0 1 150 61 369 0 414 173 497 347 0 267 185 319 247 0 160 164 224 358 48 303 220 312 227 9 424 71 445 112 0 348 182 372 235 0 380 189 399 237 0 397 187 410 222 0 56 166 69 191 10 346 263 374 331 52 277 62 315 84 52 354 60 395 76 52 290 245 312 248 25 116 46 246 100 25 239 25 452 113 25 55 70 199 122 25 338 161 402 174 25 282 166 333 180 26 406 255 432 307 26 104 293 133 344 0 366 185 379 217 2 230 169 314 219 52 289 234 313 245 +629 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275843.jpg 640 422 2 25 286 98 344 2 109 283 155 332 5 156 103 417 351 0 550 263 575 357 0 38 293 50 303 0 132 290 141 297 9 540 181 557 219 26 545 313 557 348 0 212 266 218 275 0 240 260 251 275 0 431 281 445 310 0 289 255 310 274 0 182 253 191 277 2 4 281 44 314 2 409 312 438 347 9 546 220 561 231 0 11 284 20 291 0 622 267 639 343 +630 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181296.jpg 640 436 2 322 56 436 141 3 4 106 639 431 0 74 48 320 435 13 64 100 145 133 60 77 82 159 103 +631 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244246.jpg 480 640 2 134 446 321 603 2 296 469 330 500 2 119 462 148 502 7 0 291 125 539 2 147 467 164 478 2 271 460 306 483 7 433 450 479 542 2 141 462 148 467 4 246 276 354 310 +632 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274083.jpg 640 480 2 192 254 406 442 5 230 9 585 381 0 167 222 208 420 0 292 56 330 108 0 392 73 411 121 0 122 181 175 389 0 81 180 135 394 0 387 211 499 468 0 351 207 420 249 0 52 198 93 389 0 263 42 301 99 0 198 212 254 313 0 7 203 83 399 0 271 215 310 256 0 447 208 468 246 +633 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484531.jpg 480 640 2 345 128 479 292 2 214 223 277 308 3 176 222 479 631 3 0 232 81 548 0 53 2 336 628 39 133 232 169 315 0 434 167 479 502 +634 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020273.jpg 640 480 2 71 182 107 216 5 119 22 551 459 0 339 160 432 223 2 0 168 68 222 2 132 195 138 220 +635 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019025.jpg 640 478 2 0 397 191 477 2 622 269 639 309 5 35 82 580 336 0 295 136 313 177 0 464 142 491 185 0 507 247 533 288 0 420 263 445 289 0 331 264 351 292 0 103 239 147 300 2 0 258 89 336 0 210 126 234 172 0 453 250 478 280 0 393 268 420 290 +636 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507927.jpg 640 427 2 34 121 70 148 2 88 120 127 150 2 69 124 92 146 2 195 124 321 196 2 12 126 35 141 2 0 123 18 138 3 46 165 154 311 3 225 200 445 426 3 380 145 540 370 0 44 134 184 300 0 118 128 200 236 0 230 136 412 422 0 265 109 323 173 0 391 97 533 316 0 345 110 380 231 0 371 104 408 175 0 311 91 346 198 0 338 109 357 210 3 503 160 639 314 9 49 11 59 37 9 137 14 146 38 9 321 66 328 79 0 513 123 526 151 74 107 47 116 57 74 96 48 98 57 3 129 139 187 251 3 543 134 588 184 3 471 143 532 177 3 542 115 631 204 3 496 130 540 159 3 627 130 639 184 0 136 119 144 129 0 561 120 588 150 +637 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305480.jpg 640 427 2 0 273 11 294 4 27 105 589 256 7 134 236 187 252 4 310 118 331 190 7 611 248 639 265 +638 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009286.jpg 640 640 2 484 341 603 449 2 403 310 469 360 3 136 258 223 345 5 206 209 421 363 5 51 180 243 300 5 477 281 565 344 5 416 272 444 320 0 568 326 620 465 0 458 313 475 330 0 416 310 423 317 2 441 299 454 315 7 496 321 591 371 5 587 305 627 341 +639 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340778.jpg 640 424 2 304 132 639 313 3 129 164 639 373 26 112 161 132 216 0 104 135 154 282 0 151 138 199 279 0 228 149 304 328 0 334 129 374 199 0 378 122 411 172 0 380 111 419 153 0 434 128 454 142 0 366 139 384 172 0 235 147 265 203 26 114 206 118 212 0 567 147 633 323 +640 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279850.jpg 640 427 2 0 294 67 368 3 596 346 639 425 5 51 69 540 422 +641 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269975.jpg 640 424 2 382 248 461 297 2 505 251 552 283 2 287 249 351 300 5 285 223 433 280 5 444 194 505 290 5 31 222 120 269 0 221 257 228 284 0 190 257 201 286 0 172 256 182 282 0 160 258 174 287 0 144 263 153 279 0 140 262 145 289 0 112 260 117 280 0 102 258 109 270 0 210 259 217 284 5 195 237 232 276 24 161 263 166 274 0 130 258 133 283 0 559 255 569 287 0 120 259 126 271 2 362 259 385 287 2 572 254 593 280 2 574 250 594 254 0 591 247 603 288 0 65 240 639 293 +642 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449031.jpg 640 425 2 590 226 611 259 2 44 227 90 260 5 60 78 591 359 0 2 183 39 277 0 537 194 559 228 1 2 239 46 283 0 479 218 501 243 0 470 188 492 228 0 167 158 220 218 +643 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530220.jpg 640 421 3 22 0 629 408 3 412 95 639 279 0 310 26 385 147 0 176 35 228 140 0 0 17 60 229 0 128 96 142 134 0 505 75 582 144 0 369 47 394 117 0 565 50 613 150 0 226 85 263 134 0 255 47 283 147 0 276 36 318 147 0 153 84 172 141 0 56 41 105 184 0 61 30 116 180 +644 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290170.jpg 640 425 3 323 179 357 240 0 529 141 534 149 0 469 141 479 157 0 490 147 500 166 0 496 139 504 150 2 165 146 289 223 3 462 150 490 164 0 520 138 527 148 0 583 145 594 163 7 0 139 247 237 7 155 146 287 225 0 323 153 363 222 3 515 151 536 164 3 533 151 542 162 3 484 156 509 170 +645 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076257.jpg 640 427 3 121 94 376 355 0 158 33 380 233 +646 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134537.jpg 640 427 3 342 339 373 402 5 504 201 638 315 2 488 305 636 393 0 75 308 87 338 7 398 272 486 387 9 289 188 315 258 9 364 285 369 289 0 156 305 169 346 0 145 303 153 330 0 104 301 117 351 9 130 279 152 302 9 486 259 495 268 0 42 303 57 317 0 116 306 126 352 0 131 303 145 348 2 374 296 404 336 2 397 272 484 381 0 149 301 161 344 0 168 299 184 345 0 248 303 258 331 0 256 311 261 323 0 602 226 619 242 0 337 310 374 353 0 29 298 244 349 +647 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316138.jpg 500 375 3 395 112 499 369 3 300 131 428 345 3 242 123 390 330 0 343 92 381 169 3 8 146 195 344 3 162 159 266 309 3 120 128 206 189 3 43 147 84 196 0 136 97 144 113 0 38 112 61 150 3 136 179 224 247 3 1 137 50 247 +648 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422870.jpg 640 548 3 320 117 463 286 3 187 127 323 284 7 90 245 519 457 +649 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418288.jpg 640 425 3 40 21 638 422 1 573 6 639 221 3 570 3 638 191 +650 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302710.jpg 640 360 3 316 114 619 291 3 21 119 286 285 58 576 117 617 215 +651 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042805.jpg 500 333 3 151 197 186 246 3 360 190 382 233 0 293 171 309 211 0 235 173 246 204 0 266 177 278 194 25 0 0 418 111 25 0 80 302 135 0 286 172 295 186 0 329 175 344 219 25 268 163 302 177 0 254 170 261 187 0 327 162 336 182 0 323 159 330 171 0 309 175 315 215 0 248 174 255 199 +652 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491169.jpg 640 376 3 10 38 587 360 3 219 91 540 181 0 148 0 218 106 0 215 46 257 104 0 378 31 430 89 0 560 85 579 111 0 580 82 597 123 3 508 103 584 226 3 573 115 639 203 0 250 37 300 94 0 635 77 639 93 0 593 74 639 154 3 529 103 605 209 0 317 40 345 73 3 275 57 354 103 0 325 40 362 92 +653 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413822.jpg 640 427 3 120 212 441 393 26 576 158 607 225 0 180 128 226 235 0 498 127 548 346 0 384 92 440 262 0 311 103 366 286 0 105 91 137 149 0 246 92 293 200 0 209 133 351 391 0 178 94 234 169 0 300 93 333 140 0 431 111 494 320 0 543 129 600 312 0 594 99 628 312 0 10 76 73 322 26 159 148 180 205 0 69 77 608 318 +654 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080737.jpg 640 438 3 40 21 602 404 +655 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408830.jpg 640 427 3 74 34 571 415 3 282 1 510 107 3 478 2 561 63 3 500 0 598 29 +656 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226154.jpg 640 507 3 62 273 130 347 5 145 104 530 381 0 60 257 96 307 0 86 254 122 328 0 206 170 269 224 0 293 191 329 224 +657 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488385.jpg 480 640 3 25 2 371 630 3 380 0 451 81 +658 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250939.jpg 640 480 3 62 173 577 470 0 246 2 484 460 +659 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568653.jpg 426 640 3 2 30 420 629 0 50 1 114 175 0 0 19 55 118 0 352 72 425 352 0 131 3 192 138 0 279 7 344 127 0 346 28 381 89 0 108 3 135 37 0 174 3 198 44 0 221 2 268 85 +660 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114147.jpg 640 480 3 155 212 359 356 3 383 229 440 308 3 489 214 617 320 3 1 266 46 372 0 195 164 292 357 0 245 169 282 225 3 294 194 360 295 0 169 175 208 258 0 418 163 454 237 0 62 173 141 353 0 128 170 190 259 0 41 174 68 227 0 13 185 38 231 0 154 176 182 239 0 286 175 312 212 0 268 173 305 218 3 20 219 169 346 3 327 210 371 270 3 319 228 373 273 26 252 240 276 271 0 0 179 33 290 26 523 232 538 257 0 503 155 602 316 +661 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290231.jpg 640 427 3 189 143 611 392 0 157 72 514 307 +662 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191117.jpg 640 427 3 93 18 513 388 3 0 138 146 281 +663 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000263505.jpg 424 640 3 90 271 232 512 0 67 172 221 483 +664 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241113.jpg 640 480 3 97 83 559 434 73 81 175 103 201 73 312 164 344 188 73 12 164 38 177 73 42 162 76 200 6 77 10 107 19 6 298 11 342 24 6 348 13 391 25 6 397 15 438 27 6 485 18 522 29 6 527 21 560 31 6 565 22 596 32 6 28 11 73 20 73 111 169 135 200 73 110 160 134 194 73 78 164 107 197 73 297 193 340 205 73 6 130 14 163 73 1 172 24 201 +665 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143737.jpg 426 640 3 151 300 251 440 3 261 300 358 449 0 167 262 244 421 0 258 261 349 396 +666 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283380.jpg 500 333 3 125 136 432 285 +667 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506335.jpg 640 450 3 162 224 478 419 0 358 144 481 404 0 393 190 441 282 0 154 68 285 264 0 236 107 399 394 3 83 129 335 305 +668 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048924.jpg 640 425 3 283 108 466 406 24 383 224 443 291 26 266 204 344 248 +669 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315601.jpg 640 424 3 353 312 396 359 3 234 311 279 393 5 606 170 639 340 5 551 175 612 247 0 330 274 382 394 0 42 267 95 312 3 520 301 548 380 0 517 271 553 365 0 368 236 378 256 0 0 274 27 386 3 36 292 93 383 3 1 317 23 395 3 475 298 524 392 0 471 270 528 391 2 381 276 474 378 2 393 230 458 274 7 319 163 342 183 0 291 245 308 265 0 229 272 289 394 0 246 201 257 216 2 515 238 598 322 2 379 242 437 276 2 79 257 175 303 2 8 271 65 371 2 224 272 331 371 2 294 246 388 289 2 280 258 351 339 2 493 260 558 313 2 247 249 295 274 7 276 173 306 217 7 331 177 363 210 7 397 211 453 243 7 171 196 209 237 7 197 193 231 222 2 275 229 347 260 2 67 280 245 392 2 83 161 635 357 +670 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361386.jpg 500 333 3 70 37 438 286 +671 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580975.jpg 480 640 3 0 12 366 600 3 144 107 346 377 3 289 236 335 296 3 217 174 345 324 3 289 204 350 298 3 246 189 297 267 3 302 220 348 278 +672 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388677.jpg 640 480 3 92 199 474 479 0 156 12 391 479 5 387 14 639 410 0 89 164 126 245 0 23 162 53 244 0 14 159 32 191 78 135 0 195 44 0 0 146 8 221 0 375 171 388 228 +673 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024396.jpg 640 480 3 43 15 607 397 0 132 41 186 126 0 183 90 207 119 56 530 162 567 211 +674 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363875.jpg 558 640 3 2 153 557 629 0 107 15 408 422 5 0 3 558 385 +675 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291930.jpg 640 480 3 210 132 366 407 0 340 144 503 386 +676 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012370.jpg 640 428 3 42 121 514 422 0 249 32 401 386 2 519 146 551 155 +677 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223930.jpg 640 484 3 21 11 631 469 0 264 3 334 106 1 382 12 639 234 +678 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098043.jpg 640 480 3 233 0 536 286 0 144 159 355 478 +679 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484397.jpg 640 427 3 302 157 553 343 0 263 139 399 244 +680 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197683.jpg 640 427 3 103 125 314 410 0 126 48 317 346 0 612 112 639 218 0 112 77 154 346 +681 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369997.jpg 640 428 3 327 138 626 316 3 24 184 171 257 0 383 104 512 290 0 66 162 125 246 +682 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194875.jpg 640 574 3 45 290 469 551 3 290 288 638 552 0 159 223 256 324 0 5 228 100 324 0 442 243 498 319 0 512 237 587 320 0 219 168 308 289 0 292 157 364 292 0 441 144 517 288 0 389 154 446 236 0 387 240 506 360 26 304 205 353 278 39 376 92 389 134 39 457 94 468 124 41 417 210 429 234 56 393 298 491 362 56 511 274 530 308 56 580 298 639 474 56 247 287 277 320 56 1 287 62 350 58 114 286 154 329 75 393 201 404 225 0 263 234 327 333 3 0 328 128 566 39 447 95 457 120 39 434 97 446 121 39 412 101 423 134 39 401 101 412 135 39 389 93 399 136 39 366 97 376 135 39 322 94 333 135 39 309 97 321 135 39 344 95 354 135 39 249 130 262 168 60 350 224 467 274 60 183 322 214 332 0 588 239 639 298 41 388 205 399 236 41 109 278 121 317 +683 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049881.jpg 612 612 3 161 212 510 485 3 91 211 224 345 0 115 136 136 176 0 213 103 399 455 0 322 109 471 434 0 504 164 518 195 0 180 141 193 161 0 126 129 233 251 0 558 172 568 196 +684 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084447.jpg 640 480 3 162 31 339 349 0 285 169 537 349 +685 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378727.jpg 640 427 3 289 202 337 260 0 290 159 337 235 +686 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390017.jpg 640 425 3 300 240 535 363 26 473 239 515 275 24 473 236 514 274 26 367 242 425 273 +687 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142537.jpg 640 428 3 75 50 506 410 3 0 140 201 368 0 538 197 559 254 0 555 204 566 241 0 576 215 597 253 13 583 222 610 252 0 564 195 579 254 0 598 137 638 263 0 560 213 586 252 56 582 226 601 253 +688 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498709.jpg 640 425 3 0 38 639 422 2 1 175 26 245 2 30 189 109 245 2 164 173 207 218 +689 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542101.jpg 427 640 3 81 180 401 576 0 143 1 426 535 +690 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514913.jpg 640 426 3 38 16 601 393 +691 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344862.jpg 500 333 3 116 116 328 266 5 97 0 499 156 0 120 67 209 259 0 188 70 281 252 +692 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224724.jpg 480 640 3 315 540 389 576 0 181 488 231 638 0 391 509 401 533 0 401 508 409 533 2 283 514 318 571 2 285 509 421 563 26 160 514 201 564 0 336 526 355 554 0 408 512 419 535 +693 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040485.jpg 640 388 4 0 83 640 373 +694 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236535.jpg 640 427 4 89 176 511 299 +695 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282229.jpg 427 640 4 5 163 409 337 7 351 367 423 463 +696 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207323.jpg 640 426 4 19 63 620 268 +697 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184359.jpg 640 426 4 253 138 442 205 4 40 185 230 239 4 0 38 390 116 4 491 154 639 248 0 501 313 512 343 0 103 309 114 347 0 258 324 276 373 0 331 314 347 347 4 0 372 185 425 0 528 314 537 340 4 167 263 637 349 +698 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283495.jpg 640 425 4 294 65 432 135 +699 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386585.jpg 640 538 4 5 0 556 530 +700 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003035.jpg 640 425 4 184 225 391 288 7 0 273 18 308 7 17 277 29 293 7 470 282 551 330 2 473 288 552 335 +701 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165937.jpg 640 480 4 0 187 371 384 4 251 187 558 298 +702 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267521.jpg 640 480 4 253 198 639 347 7 475 406 631 479 0 260 325 267 353 4 262 245 398 270 7 536 343 589 407 7 471 342 525 400 4 267 249 339 266 4 435 258 462 268 +703 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381709.jpg 640 426 4 223 221 314 247 +704 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161044.jpg 640 229 4 306 159 329 184 4 361 183 383 205 +705 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374886.jpg 640 404 4 142 152 519 284 0 265 165 283 183 +706 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149052.jpg 640 427 4 302 153 591 261 4 5 146 294 289 +707 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025685.jpg 500 426 4 0 2 470 325 8 200 308 484 386 0 318 277 347 342 0 352 304 385 340 +708 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378448.jpg 640 414 4 200 0 505 104 0 366 101 377 112 0 252 65 260 90 7 312 109 438 169 24 388 139 582 330 7 127 118 199 174 67 269 305 313 326 63 91 238 200 269 67 60 230 104 238 +709 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015709.jpg 640 427 4 22 31 638 329 4 350 50 638 146 7 289 115 329 135 4 395 40 474 94 +710 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515531.jpg 640 640 4 314 199 427 215 +711 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478120.jpg 640 427 4 106 182 511 288 +712 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226419.jpg 640 426 4 47 38 611 320 +713 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360346.jpg 640 412 4 153 169 623 278 0 327 170 344 186 +714 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445643.jpg 640 480 4 2 2 638 295 0 258 286 266 316 7 58 243 87 270 7 95 246 114 268 +715 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071123.jpg 640 425 4 91 59 572 222 +716 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510942.jpg 640 424 4 0 135 527 400 +717 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545407.jpg 640 424 4 176 175 475 298 +718 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336309.jpg 640 427 4 122 190 284 237 +719 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192788.jpg 640 430 4 159 182 469 308 +720 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023802.jpg 640 478 4 1 94 639 471 0 193 97 374 469 +721 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173737.jpg 640 424 4 353 106 456 177 +722 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246425.jpg 640 332 4 294 47 418 207 4 187 89 316 248 +723 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309530.jpg 640 465 4 47 3 639 267 +724 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119232.jpg 640 440 4 88 128 448 397 +725 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366031.jpg 640 424 4 147 17 622 362 0 273 193 322 402 4 575 251 639 295 +726 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069196.jpg 512 640 4 2 2 511 562 0 155 446 183 524 0 69 437 116 585 0 16 429 75 582 0 182 432 210 509 0 127 408 162 517 0 274 417 325 543 0 289 342 321 430 0 176 482 245 634 0 233 360 262 407 0 209 416 238 488 0 356 384 381 450 0 326 359 349 387 24 253 531 288 571 26 254 516 287 571 24 290 435 313 474 24 22 451 51 492 24 211 432 230 456 24 74 476 130 501 24 213 368 226 386 24 175 378 197 405 24 364 363 375 380 0 341 367 361 428 24 237 453 260 502 0 1 344 417 567 +727 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364145.jpg 640 427 4 125 100 541 247 +728 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233090.jpg 640 425 4 207 85 241 98 8 113 310 514 384 8 95 304 229 348 0 281 332 289 349 0 296 332 307 340 0 404 329 413 346 8 604 346 639 358 0 469 317 476 335 0 478 316 485 327 8 295 292 435 349 +729 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371973.jpg 640 428 4 42 178 637 351 0 318 191 345 220 0 377 211 397 235 +730 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359303.jpg 640 448 4 127 92 577 217 4 103 212 496 366 +731 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332502.jpg 640 427 4 336 177 421 218 +732 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327857.jpg 640 480 4 329 10 638 184 +733 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074434.jpg 478 640 4 11 218 468 343 7 9 354 142 433 7 384 304 407 311 7 423 301 436 308 +734 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016241.jpg 640 425 4 329 269 426 297 +735 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474410.jpg 640 426 4 300 177 334 233 4 182 265 223 318 4 412 115 450 170 4 540 68 575 122 +736 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527644.jpg 640 447 4 411 251 456 338 +737 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540816.jpg 640 401 4 38 142 620 309 +738 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139871.jpg 640 427 4 14 97 625 315 +739 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425303.jpg 640 427 4 270 55 390 102 +740 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376996.jpg 640 236 4 101 22 595 186 +741 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357829.jpg 640 426 4 108 109 161 235 4 231 123 286 248 4 119 228 172 352 4 371 148 425 272 4 203 1 260 123 4 496 179 536 304 +742 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513681.jpg 640 469 4 60 45 588 256 4 246 47 524 118 4 57 48 167 83 4 0 65 40 76 0 318 301 366 433 0 19 161 37 202 0 539 151 557 188 0 177 116 185 125 7 172 122 210 140 7 503 70 532 83 7 541 214 639 251 7 166 81 179 88 0 168 79 172 84 7 491 70 501 79 +743 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479912.jpg 478 640 4 0 226 325 446 0 117 336 121 351 0 128 331 131 343 0 90 342 94 354 7 385 353 459 384 7 431 507 477 618 4 113 260 144 277 +744 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448690.jpg 484 640 4 14 23 483 560 24 13 552 26 566 26 227 560 237 571 26 354 560 361 575 26 402 579 409 592 0 349 553 369 594 0 471 532 483 596 0 254 533 280 603 0 388 553 403 576 0 241 535 257 601 0 452 544 470 592 0 467 563 472 589 0 226 551 242 598 0 131 567 138 596 0 117 572 131 596 0 101 559 119 591 0 43 576 63 596 0 4 570 41 597 0 47 264 453 600 +745 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465735.jpg 640 480 4 2 138 594 399 7 517 372 576 396 0 578 377 585 395 7 501 375 530 389 7 474 373 500 388 +746 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441695.jpg 502 640 4 0 225 497 504 7 416 388 463 409 7 146 457 192 523 4 149 373 501 638 0 204 419 225 454 4 1 303 321 372 +747 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128644.jpg 640 394 4 91 117 606 241 7 41 157 104 180 +748 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133279.jpg 640 374 4 0 96 209 169 4 317 136 547 175 2 114 176 194 215 2 32 174 108 211 2 237 173 424 294 2 425 177 462 197 2 486 181 550 222 2 587 183 638 225 7 470 170 503 192 2 548 175 575 196 2 596 174 622 188 2 520 173 550 195 2 570 176 596 198 2 397 177 417 194 2 453 171 473 183 4 109 78 311 165 4 309 150 364 163 2 222 176 281 215 7 595 173 623 189 2 468 168 639 193 +749 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196681.jpg 427 640 4 182 95 228 110 +750 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487222.jpg 640 488 4 164 113 250 141 +751 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547790.jpg 640 387 4 272 193 521 271 +752 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278760.jpg 428 640 4 178 176 220 208 6 0 514 308 639 +753 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353964.jpg 640 434 4 381 180 620 249 4 32 140 227 204 +754 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466347.jpg 640 426 4 364 186 469 226 +755 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084870.jpg 640 424 4 58 141 621 283 +756 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176828.jpg 640 427 4 55 122 558 343 +757 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535198.jpg 480 640 4 41 67 386 424 +758 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466005.jpg 600 400 4 74 118 471 241 +759 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189203.jpg 640 498 4 55 46 579 206 4 39 281 609 466 +760 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000055167.jpg 640 360 5 209 131 364 243 0 412 185 417 203 0 132 194 144 227 0 371 179 378 190 0 417 184 420 204 2 392 182 407 193 2 565 213 601 227 24 132 197 139 211 7 161 175 217 228 0 408 183 413 204 0 233 171 253 186 +761 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367205.jpg 640 428 5 90 167 632 325 0 25 234 40 274 9 296 181 326 255 0 33 234 41 268 0 96 239 104 260 0 56 236 67 285 0 52 236 59 266 0 582 231 594 246 9 389 154 409 206 0 175 233 181 247 0 499 229 511 243 +762 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042137.jpg 640 427 5 0 194 258 340 2 425 254 490 293 2 280 257 330 296 2 260 254 312 287 2 624 254 639 281 +763 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430467.jpg 640 626 5 257 328 549 555 2 578 502 596 522 2 560 483 590 491 9 69 350 81 379 9 608 323 617 360 2 558 501 581 523 2 544 501 554 521 2 549 503 559 518 2 621 506 634 523 +764 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443498.jpg 640 478 5 185 118 470 385 +765 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012014.jpg 640 360 5 67 0 517 340 0 620 163 639 353 0 226 42 260 92 0 570 210 579 228 0 302 70 344 109 0 337 82 360 116 0 408 102 419 130 0 461 191 474 223 0 201 182 230 310 +766 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163219.jpg 640 360 5 21 108 569 324 +767 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066717.jpg 640 480 5 49 1 639 422 6 47 0 639 422 0 308 86 378 333 0 392 114 422 168 0 350 96 413 235 0 422 107 446 227 5 0 57 57 259 28 351 209 393 322 67 372 156 379 159 0 586 156 630 220 0 571 124 605 165 +768 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454741.jpg 500 375 5 78 0 499 369 +769 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558539.jpg 640 480 5 49 86 582 431 0 149 208 217 269 0 200 219 220 292 0 469 239 482 253 0 503 232 528 260 +770 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061520.jpg 640 480 5 476 432 639 473 9 330 235 406 268 7 473 428 639 479 +771 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090208.jpg 640 429 5 162 36 506 405 5 30 105 186 347 5 0 138 57 319 +772 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060128.jpg 640 480 5 6 56 634 391 0 463 159 530 235 2 156 244 186 282 13 616 192 639 206 +773 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425388.jpg 640 427 5 196 175 557 296 0 75 220 97 288 0 284 220 302 244 24 78 233 89 250 26 74 239 84 262 +774 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498274.jpg 640 480 5 102 41 498 444 5 496 255 638 339 5 81 276 103 326 0 251 250 316 309 +775 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387850.jpg 640 480 5 139 127 587 310 0 0 104 193 473 0 147 180 221 318 0 214 202 283 313 0 435 211 476 331 0 261 237 399 479 0 215 201 248 263 0 268 225 287 245 13 152 308 495 479 24 178 256 251 322 24 466 377 639 479 5 0 104 51 222 56 553 276 587 312 56 507 277 549 315 56 457 278 522 352 56 432 278 459 319 0 163 231 227 315 0 125 213 150 281 0 312 220 322 253 +776 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234182.jpg 640 427 5 47 109 559 303 2 589 240 621 254 +777 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480075.jpg 640 425 5 45 242 572 360 0 183 285 206 360 0 234 280 263 364 0 404 283 437 366 0 497 271 520 352 0 517 279 531 326 24 191 297 207 324 13 100 333 222 363 24 423 299 431 326 26 414 293 432 325 26 237 297 244 320 28 421 329 455 364 0 230 280 244 347 13 0 342 28 359 28 207 351 235 362 +778 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377723.jpg 640 427 5 377 148 610 344 0 324 237 352 342 0 71 228 97 333 0 89 235 115 337 0 132 231 163 351 0 184 234 220 339 0 220 235 241 336 0 239 230 269 338 0 488 230 518 255 0 294 235 330 343 0 314 226 328 258 24 62 247 73 273 26 326 268 349 288 26 357 282 372 298 26 277 294 301 327 26 231 289 240 312 0 268 234 293 337 0 349 228 375 338 26 211 275 221 297 0 236 221 254 251 0 215 225 355 263 +779 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568623.jpg 640 416 5 0 32 208 209 0 438 88 636 379 0 141 81 190 177 0 94 95 137 233 5 325 109 396 143 9 69 28 80 46 9 53 23 63 43 9 339 70 350 91 9 414 53 421 59 24 376 120 391 149 24 304 109 332 140 24 409 118 427 153 24 613 117 636 150 67 516 127 534 150 0 62 82 100 235 0 552 85 605 205 0 389 90 428 154 0 123 105 151 219 0 334 106 366 145 0 34 111 76 229 0 207 110 224 126 0 426 109 452 155 67 577 95 581 105 67 134 136 139 138 0 369 106 394 150 26 557 127 568 150 26 355 128 357 143 26 132 120 141 136 26 413 208 468 264 13 240 124 588 398 13 78 122 244 343 +780 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449412.jpg 640 426 5 339 64 605 377 0 337 319 514 420 0 228 208 283 371 0 187 299 223 369 25 298 140 584 363 25 0 155 274 302 24 342 335 431 420 26 49 311 83 411 0 70 284 183 423 26 261 270 282 313 +781 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299044.jpg 640 640 5 135 222 355 410 5 35 285 147 379 2 426 361 639 486 7 0 327 95 394 2 129 404 292 467 +782 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205782.jpg 640 401 5 73 15 517 337 0 535 239 586 331 0 14 252 28 309 0 56 242 70 298 0 24 249 45 309 26 539 289 555 302 0 24 244 35 269 0 0 244 14 307 26 63 266 75 281 0 34 247 60 312 +783 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220307.jpg 640 426 5 197 214 254 252 5 572 182 639 250 0 592 196 600 208 0 577 196 588 213 0 588 208 595 213 0 602 190 611 213 0 623 209 628 227 23 349 62 584 379 23 325 188 402 277 7 560 183 639 252 0 618 207 622 213 7 196 212 255 251 0 613 193 619 206 0 573 204 578 213 0 229 227 233 232 +784 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469119.jpg 500 485 5 3 1 486 383 0 104 158 177 328 0 122 60 192 168 24 166 190 189 249 +785 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460967.jpg 604 640 5 60 358 563 554 0 509 430 528 459 +786 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347506.jpg 640 329 5 1 180 289 304 26 353 260 365 282 26 432 279 450 306 0 204 243 217 312 0 214 242 239 318 0 240 233 267 316 0 314 233 346 318 0 342 237 364 310 0 362 236 386 319 0 384 230 407 323 0 290 235 313 309 0 410 233 430 316 24 185 245 199 276 24 199 258 205 279 26 209 251 219 284 28 438 283 451 306 0 181 233 199 313 0 376 231 389 314 26 407 274 414 285 0 415 224 443 318 +787 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177173.jpg 480 640 5 219 208 479 566 0 64 396 109 465 +788 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097899.jpg 500 375 5 42 61 347 344 5 0 200 32 265 0 414 244 456 319 0 28 227 36 248 0 40 227 45 244 +789 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008204.jpg 640 480 5 345 269 639 472 0 182 377 213 426 0 321 379 338 457 0 443 354 457 367 0 437 358 455 374 0 449 353 457 363 7 1 138 336 476 26 326 423 339 448 0 483 364 493 374 0 553 361 566 374 0 597 356 609 375 0 128 350 165 441 0 538 361 550 377 0 470 342 476 354 26 324 416 330 423 0 433 360 445 376 0 466 351 479 368 0 265 368 480 439 +790 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182398.jpg 640 480 5 42 209 554 341 13 28 398 89 479 +791 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541879.jpg 640 427 5 326 31 608 365 5 32 153 235 284 25 32 272 46 301 26 270 251 283 262 26 278 257 286 264 28 146 270 165 297 0 158 228 189 302 0 303 228 321 287 0 281 232 301 285 0 264 231 283 294 0 136 257 163 299 0 131 228 152 264 0 124 250 146 298 0 0 220 42 319 0 177 230 195 294 +792 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003134.jpg 640 428 5 0 32 377 339 0 230 194 252 222 0 190 177 233 221 7 454 203 492 246 9 380 102 390 129 9 516 147 527 180 9 518 205 529 215 10 527 241 535 256 12 517 231 526 247 10 626 262 639 282 +793 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317622.jpg 640 480 5 110 220 318 411 5 308 245 506 356 5 507 262 606 325 0 563 289 586 345 0 600 288 618 345 0 530 292 546 336 0 32 307 72 411 0 0 296 23 375 2 49 302 72 332 2 63 302 83 329 0 26 296 49 376 2 17 301 39 341 2 78 301 115 332 2 85 296 118 311 2 81 302 116 321 0 64 297 69 302 0 63 297 66 303 0 578 308 584 343 +794 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387387.jpg 640 480 5 41 211 610 378 +795 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516804.jpg 480 640 5 262 442 322 476 5 183 441 248 473 +796 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143931.jpg 640 480 5 0 0 638 472 0 449 155 536 294 +797 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150267.jpg 640 352 5 288 166 536 235 5 1 170 239 236 0 409 185 417 196 0 336 181 346 193 0 305 187 312 194 0 91 191 97 197 0 187 184 194 197 13 242 215 289 224 0 126 192 130 197 0 203 185 211 196 0 160 191 164 198 0 171 191 176 197 0 106 190 112 196 0 71 191 75 197 12 167 213 209 278 0 62 191 64 198 +798 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125645.jpg 640 480 5 87 227 478 437 5 306 322 614 458 5 0 275 161 471 5 0 236 108 262 +799 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101703.jpg 432 640 5 48 463 137 552 0 403 513 421 558 0 369 514 385 557 0 356 517 369 557 0 332 532 344 552 0 318 514 329 555 0 259 516 269 546 0 243 517 257 547 0 240 516 245 538 0 143 513 148 524 0 291 511 298 542 0 205 519 214 546 0 227 519 236 547 74 164 203 201 237 0 169 516 175 535 5 14 498 32 525 0 38 507 265 550 +800 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433963.jpg 640 425 5 91 33 588 385 0 400 215 425 241 0 264 45 310 60 0 348 53 387 100 0 396 56 440 102 0 300 32 329 75 10 478 338 527 407 0 459 107 483 139 0 355 201 396 246 0 489 113 511 134 +801 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539975.jpg 640 411 5 31 102 616 368 +802 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538153.jpg 640 480 6 99 247 538 380 6 84 206 605 313 +803 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547583.jpg 425 640 6 0 169 424 564 0 121 359 151 387 +804 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161185.jpg 640 480 6 225 184 272 233 9 125 80 195 183 9 54 251 69 281 +805 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086133.jpg 640 480 6 105 8 611 442 10 9 174 239 479 +806 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079566.jpg 375 500 6 3 2 371 376 +807 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280293.jpg 640 425 8 441 265 530 312 8 427 209 493 250 8 361 211 400 239 8 326 199 368 239 8 301 201 325 231 0 138 269 153 304 0 180 257 187 278 0 454 264 466 288 0 156 270 166 303 13 248 369 344 405 13 200 313 228 340 13 166 295 189 316 13 170 288 191 298 0 289 236 291 241 0 468 266 476 275 13 205 337 282 361 0 284 236 286 244 8 282 234 298 248 +808 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246233.jpg 640 583 8 28 49 582 536 7 607 332 639 360 +809 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503467.jpg 500 345 0 44 33 142 281 9 343 44 360 89 24 49 60 101 131 9 361 55 373 84 9 380 19 408 89 1 112 140 158 290 +810 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145620.jpg 640 436 0 495 68 511 120 0 521 68 534 123 0 303 93 420 256 0 513 67 523 119 3 300 155 431 323 +811 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283438.jpg 500 375 0 283 104 305 164 0 303 118 331 170 0 2 172 40 302 62 243 93 360 193 56 247 103 283 161 +812 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284698.jpg 375 500 0 19 165 220 333 3 1 155 234 499 +813 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053580.jpg 640 428 0 0 52 325 426 56 568 218 639 342 56 471 193 612 277 5 0 2 640 427 56 250 247 534 280 56 240 219 457 248 +814 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495519.jpg 500 375 0 218 187 276 268 0 208 103 219 116 0 127 94 141 107 0 150 103 155 110 0 476 138 481 145 0 481 138 486 144 7 186 213 318 296 0 43 97 54 128 0 54 99 65 129 +815 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305803.jpg 640 292 0 375 124 388 152 0 126 120 158 154 0 236 126 264 158 0 316 124 337 152 0 283 131 292 143 0 298 121 316 150 0 410 128 426 146 0 367 131 376 147 3 337 151 418 192 58 44 183 117 216 58 203 178 262 206 0 266 130 281 146 0 277 128 283 139 0 591 129 610 171 0 487 134 493 146 3 62 134 187 203 3 451 146 483 185 3 3 152 44 188 3 218 136 312 195 3 508 141 546 178 3 186 138 227 176 3 178 145 207 181 3 320 146 346 177 3 400 149 448 178 3 348 143 379 160 3 478 137 506 166 58 458 165 504 188 58 548 161 581 185 58 346 171 394 197 58 607 159 633 181 0 0 134 12 190 3 434 142 453 167 0 336 121 594 168 +816 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505967.jpg 640 426 0 101 372 129 407 2 340 374 393 421 2 270 357 313 392 2 339 349 384 384 2 351 324 423 348 7 138 324 229 361 7 470 301 530 322 9 537 311 546 332 9 550 308 557 333 9 364 241 371 255 27 477 27 484 52 0 68 216 70 225 0 51 224 55 238 0 121 216 125 225 0 187 219 191 226 0 212 218 216 225 0 247 218 250 225 0 360 223 363 229 0 335 221 341 230 2 200 318 263 339 2 440 405 499 419 2 223 281 240 290 2 256 287 275 303 2 158 388 213 425 2 568 330 634 352 2 510 318 570 346 3 101 373 129 414 9 237 230 245 243 9 70 245 88 271 9 272 233 279 246 9 515 263 522 285 9 327 238 332 251 9 114 246 125 273 9 59 243 71 271 2 371 297 399 313 9 403 246 409 263 2 0 219 575 425 +817 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226496.jpg 640 480 0 466 176 512 293 0 504 177 540 291 0 56 191 107 324 0 134 203 154 268 0 109 213 130 259 3 0 232 36 365 3 100 244 138 300 0 363 209 376 260 0 427 194 444 248 0 40 213 57 237 2 541 195 639 262 0 4 210 45 325 0 238 146 297 256 0 281 150 352 263 2 460 184 545 249 0 3 210 13 234 2 388 207 458 246 3 249 172 392 438 0 455 199 462 234 +818 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336464.jpg 500 375 0 298 175 311 197 0 337 173 350 189 5 284 146 390 271 0 332 175 340 195 +819 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268469.jpg 640 479 0 484 10 610 258 0 113 1 133 33 0 615 0 639 23 0 183 0 212 32 1 85 89 486 398 26 564 125 610 238 56 575 123 591 161 56 622 162 639 239 56 478 66 604 232 0 213 0 264 92 +820 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339022.jpg 640 425 0 311 171 375 291 0 472 124 599 324 3 468 166 608 370 3 274 193 404 310 4 188 16 201 20 0 16 85 131 369 +821 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398119.jpg 640 480 0 18 327 41 393 0 0 335 31 431 9 107 278 114 296 9 35 268 49 295 0 187 319 204 343 0 38 330 57 393 0 30 329 38 339 5 238 140 463 472 5 153 218 251 398 9 13 255 34 299 9 87 262 109 299 +822 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365618.jpg 640 480 11 441 263 467 291 11 504 254 509 265 11 614 249 618 263 2 223 306 288 354 10 465 321 479 343 2 565 257 602 277 11 108 230 160 285 11 383 275 395 297 11 480 247 496 265 11 493 251 507 270 +823 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460652.jpg 640 480 11 206 157 286 239 2 0 332 66 390 2 48 332 104 370 2 320 331 383 355 2 383 325 468 353 2 271 332 320 354 9 203 59 257 158 0 552 299 578 347 0 528 315 543 348 2 166 334 252 360 0 439 316 449 325 1 609 309 617 344 3 596 322 622 344 5 44 313 146 363 9 21 262 29 277 9 600 267 611 284 9 101 292 106 306 28 552 335 565 343 2 58 345 83 381 2 242 335 258 354 2 0 389 61 479 2 0 327 13 335 0 365 321 376 330 0 370 321 376 330 +824 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348091.jpg 640 480 25 259 243 346 328 59 0 374 439 473 61 359 177 405 263 73 491 58 501 107 73 508 44 520 104 73 535 50 548 103 73 518 51 527 103 73 611 135 639 155 73 501 50 507 107 73 547 220 596 243 56 501 273 639 479 73 610 123 639 138 73 530 49 538 103 73 526 53 533 103 73 594 227 617 246 +825 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029709.jpg 500 375 25 0 0 436 314 25 312 52 499 267 56 353 246 398 328 56 67 313 123 370 56 351 306 418 367 60 127 313 322 371 60 53 245 128 259 60 320 242 396 254 60 351 221 379 233 60 484 255 498 267 60 81 261 186 332 60 0 241 51 256 60 444 227 499 252 56 458 257 499 357 56 461 225 491 263 56 172 291 249 319 56 336 220 359 243 56 144 225 161 245 56 186 277 249 314 56 308 243 349 310 56 50 251 94 302 56 52 286 124 374 60 374 233 435 241 60 169 231 223 243 60 14 300 54 314 56 241 250 271 314 56 6 212 464 332 +826 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419216.jpg 640 426 25 514 195 546 268 25 426 152 584 199 25 332 169 505 276 0 236 235 287 324 0 316 238 386 361 0 342 242 383 291 0 373 239 394 273 0 436 261 455 288 0 572 241 601 297 0 454 237 471 272 0 500 243 521 261 0 483 244 523 339 0 395 238 423 266 0 456 257 508 332 26 450 349 484 370 56 189 253 243 332 56 231 251 281 324 56 415 286 472 382 56 319 291 375 366 56 496 273 538 348 56 574 260 605 319 56 457 275 517 364 56 570 269 584 316 56 564 254 576 263 58 274 229 330 407 58 368 249 428 423 58 541 251 575 349 58 592 236 617 307 58 531 235 544 255 0 422 246 444 269 56 417 268 435 275 56 334 235 356 261 56 217 260 238 274 0 537 239 563 267 2 608 230 631 246 2 565 228 597 246 41 365 276 372 289 60 525 267 549 278 56 178 232 478 343 0 432 241 448 254 +827 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195798.jpg 427 640 25 161 179 412 317 56 215 267 231 295 56 140 244 207 326 56 351 268 408 319 56 281 269 348 320 0 154 255 342 571 0 16 176 127 326 13 0 456 320 633 13 1 393 178 457 13 0 370 163 398 13 2 333 163 370 13 0 318 140 341 0 0 179 29 273 13 12 269 32 281 56 372 205 417 258 +828 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103431.jpg 640 548 27 252 120 285 256 0 180 1 353 502 0 486 24 639 528 0 7 0 202 507 13 66 317 138 460 0 326 0 516 535 0 0 1 105 493 0 449 1 510 129 0 156 0 250 131 0 307 0 386 128 13 390 321 511 351 +829 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106096.jpg 480 640 27 170 210 228 305 0 1 89 347 631 13 2 361 476 638 +830 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202339.jpg 480 640 27 149 106 161 173 5 207 71 462 297 5 0 0 83 327 0 102 35 275 435 26 73 282 131 373 28 406 308 479 564 0 458 560 479 598 +831 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034299.jpg 375 500 27 139 265 147 283 0 130 236 220 441 0 58 216 176 440 0 185 226 192 233 13 200 288 305 438 13 58 313 95 396 0 213 234 223 259 0 222 232 229 258 +832 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097577.jpg 640 360 59 1 115 629 359 56 55 0 147 134 73 225 11 248 45 39 213 19 221 38 39 204 20 214 43 56 308 0 417 126 60 198 11 268 125 +833 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273494.jpg 333 500 59 0 84 304 381 56 196 0 290 91 41 222 327 263 373 45 135 360 182 402 45 180 333 228 373 41 224 390 268 457 41 226 347 254 383 43 166 331 210 354 56 308 7 332 61 24 76 90 142 154 45 150 396 187 429 45 208 291 249 334 60 136 43 200 112 41 240 362 275 404 56 81 65 162 127 +834 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198645.jpg 640 640 67 215 361 231 368 0 155 275 270 493 13 0 342 194 461 13 501 194 588 221 13 591 197 639 221 +835 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302452.jpg 403 403 67 358 202 368 212 23 134 105 269 402 0 210 158 269 238 0 88 222 152 279 0 87 182 117 227 0 0 178 55 290 0 308 217 334 260 0 309 168 389 259 0 84 142 125 204 0 115 176 160 251 39 203 68 245 117 0 391 186 402 228 +836 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393692.jpg 640 480 67 402 332 467 397 67 416 292 492 341 67 107 311 149 359 63 157 96 412 382 64 370 310 418 362 67 99 283 161 314 +837 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144003.jpg 500 375 72 0 142 155 370 0 18 89 244 370 0 181 15 411 367 0 330 0 499 339 0 276 0 450 188 0 193 0 385 180 43 152 254 201 264 45 371 202 426 248 55 178 212 289 295 65 361 212 396 237 0 108 1 215 161 56 368 174 469 359 60 123 177 375 369 +838 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022660.jpg 640 427 74 234 103 261 127 13 230 217 379 404 13 290 203 320 231 13 285 207 336 270 +839 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086848.jpg 480 640 74 54 99 68 113 0 91 1 463 430 41 399 355 479 447 42 312 427 447 461 55 106 326 311 579 0 101 188 144 229 44 460 328 479 372 60 4 412 479 629 62 173 65 223 100 56 0 223 131 426 +840 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169226.jpg 640 426 74 378 143 393 157 2 552 361 583 391 2 570 391 607 423 2 537 350 564 372 3 496 323 515 335 9 401 284 404 295 9 395 282 398 289 2 523 337 548 357 2 512 333 531 349 2 243 395 288 424 2 476 312 489 325 2 483 315 498 329 2 546 360 563 378 2 519 335 535 352 2 580 401 619 425 9 391 284 394 292 +841 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011721.jpg 480 640 74 157 132 253 228 +842 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476704.jpg 640 428 1 497 280 551 385 2 575 233 631 277 2 530 224 543 239 5 107 81 521 349 7 13 146 119 280 13 590 263 618 307 2 543 225 585 238 2 632 235 639 259 +843 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091520.jpg 640 426 2 0 350 35 417 2 5 315 169 411 23 304 200 410 411 23 450 287 562 424 +844 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320482.jpg 640 425 2 14 280 84 323 5 167 183 434 348 5 0 256 53 298 0 102 279 119 312 26 481 309 489 323 26 103 300 106 310 0 588 255 639 348 0 546 226 568 294 0 605 254 616 269 0 117 276 126 311 0 511 266 533 330 0 449 259 461 270 0 462 254 478 267 0 436 256 450 272 0 479 256 489 306 0 140 272 150 305 0 487 263 508 333 9 510 161 543 209 24 109 284 118 297 0 623 251 639 338 28 571 315 596 343 +845 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558587.jpg 640 480 2 0 0 110 380 2 119 51 271 113 2 208 48 268 84 2 116 52 223 125 2 137 36 272 69 0 160 30 444 443 3 183 88 434 446 2 362 44 456 108 +846 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160276.jpg 640 480 2 0 316 598 479 9 477 264 511 330 9 16 105 48 174 9 218 206 234 252 2 605 446 639 479 9 274 223 288 268 +847 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389378.jpg 640 512 2 57 339 106 366 9 54 231 77 282 9 124 265 136 294 2 401 324 467 330 9 77 251 85 277 9 571 279 586 295 9 87 262 91 273 58 124 340 258 362 58 492 330 612 388 +848 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561570.jpg 640 424 2 548 206 573 229 9 294 150 301 170 9 18 115 33 148 9 77 113 87 132 9 350 123 357 139 9 84 115 95 139 9 543 72 611 140 +849 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038465.jpg 640 407 2 298 240 501 385 2 94 245 174 306 2 158 251 215 296 9 396 154 420 198 9 503 179 512 194 9 471 186 481 194 2 0 248 112 335 9 341 149 361 176 9 349 182 358 201 9 431 192 437 200 +850 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436694.jpg 640 427 2 400 327 585 405 9 233 170 282 296 9 409 213 443 303 +851 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423005.jpg 427 640 2 0 551 135 639 9 149 204 205 296 9 282 146 313 204 9 239 157 264 178 +852 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437303.jpg 513 640 2 291 446 313 460 2 247 445 270 460 2 330 443 349 454 2 67 449 95 468 2 9 448 56 476 2 270 441 289 457 10 444 510 482 589 2 161 444 180 458 2 172 446 189 457 2 177 438 213 451 2 317 430 332 437 2 306 442 321 456 2 284 443 293 455 2 108 448 152 465 2 211 429 355 455 +853 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155671.jpg 480 640 2 357 382 407 413 2 188 377 210 391 2 88 380 122 400 7 26 366 86 407 7 235 374 269 401 9 151 213 165 249 9 164 215 180 254 9 356 327 365 347 9 139 215 150 253 2 446 381 479 413 +854 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259342.jpg 640 414 2 75 356 328 413 25 223 277 335 309 25 367 288 459 314 0 83 316 112 394 0 538 304 558 406 2 620 365 639 413 60 378 360 437 372 60 267 359 324 399 +855 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016076.jpg 379 640 2 213 316 378 452 2 169 265 294 362 2 159 197 231 236 2 237 176 300 221 2 337 183 377 221 10 223 395 263 482 0 204 348 332 568 0 21 209 65 315 0 1 166 27 227 0 11 130 21 166 2 145 233 255 317 2 232 172 256 181 11 273 126 362 213 +856 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008179.jpg 500 333 2 94 175 148 216 9 292 0 488 180 9 186 0 302 147 +857 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170072.jpg 640 422 2 172 194 304 243 9 536 32 587 101 0 448 202 479 289 24 459 214 463 225 2 523 204 639 282 2 372 197 522 257 2 448 212 580 277 2 3 209 91 260 +858 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556278.jpg 640 424 2 548 205 573 228 9 19 115 33 147 9 83 115 96 140 9 292 150 304 165 9 347 121 357 141 9 534 184 543 200 2 519 202 531 208 9 78 113 85 138 +859 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338105.jpg 640 480 2 117 213 208 284 2 341 212 383 241 2 383 203 411 228 2 402 208 444 240 2 421 205 457 228 2 493 207 508 238 9 433 100 441 127 9 498 95 507 121 9 145 28 159 68 9 15 101 26 130 9 461 192 468 199 9 482 192 485 199 2 376 213 391 237 7 476 0 639 397 9 373 19 388 62 9 255 27 276 70 2 484 208 498 233 2 26 224 125 265 +860 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327383.jpg 640 480 2 565 141 639 242 5 1 1 500 265 +861 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132143.jpg 427 640 2 81 575 166 608 2 236 571 249 582 2 271 569 284 579 9 240 480 252 503 9 25 488 37 509 9 338 529 349 538 0 401 559 420 616 0 325 568 333 600 26 371 603 386 629 2 207 574 222 585 2 166 573 184 585 9 218 557 223 562 26 399 586 409 599 0 375 562 409 634 0 333 567 347 607 2 47 574 100 595 2 185 574 207 584 2 261 570 271 579 2 144 576 164 586 9 268 553 271 559 +862 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398007.jpg 640 427 2 0 304 38 337 9 246 245 311 390 9 445 268 476 353 2 295 210 318 222 2 317 204 339 217 2 229 209 256 222 0 18 359 36 417 0 80 335 91 364 0 105 330 121 373 0 176 303 185 340 0 210 287 221 302 0 229 287 241 316 0 178 251 184 272 0 304 266 311 290 0 75 267 87 289 0 429 224 435 244 2 197 212 228 227 9 538 320 559 342 74 498 99 505 107 74 506 97 512 108 0 137 316 151 356 9 493 323 506 354 0 118 308 127 345 0 59 353 81 407 0 35 198 578 403 +863 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046805.jpg 640 373 2 384 207 626 357 9 138 14 166 52 9 228 13 252 53 9 561 178 585 197 9 509 129 519 156 9 467 119 478 148 9 548 176 560 195 9 340 12 364 48 +864 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554537.jpg 640 547 2 0 156 145 310 7 544 187 626 266 0 143 85 246 380 0 243 153 258 202 0 261 153 281 208 9 87 61 220 128 9 207 252 291 393 9 305 322 391 382 +865 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309696.jpg 640 423 2 391 101 469 132 10 70 88 158 274 11 104 24 143 64 2 297 112 309 123 +866 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228558.jpg 640 427 2 124 211 350 371 2 43 250 155 344 2 346 296 465 339 9 180 120 204 169 7 43 248 147 342 +867 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405530.jpg 640 270 2 629 123 639 134 0 283 0 631 269 13 582 146 637 267 13 281 202 437 269 +868 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084592.jpg 640 480 2 411 348 425 361 2 394 347 409 359 7 371 339 388 358 9 338 286 351 291 7 251 355 283 374 7 395 343 409 359 9 382 319 389 322 9 409 319 413 323 9 516 310 524 324 9 559 335 564 339 2 211 361 216 367 9 432 289 445 295 9 386 287 399 292 +869 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307438.jpg 640 424 2 129 296 207 362 2 1 281 80 411 9 342 2 617 388 0 249 293 298 389 0 57 317 141 423 3 245 343 293 417 0 197 298 229 339 0 307 291 329 328 0 339 299 350 315 0 363 290 392 364 0 351 297 368 339 3 184 342 225 384 3 306 320 324 353 3 335 297 353 330 3 356 317 366 336 24 59 343 107 416 +870 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455515.jpg 640 455 2 1 116 129 443 10 212 269 281 404 0 181 144 271 402 26 252 189 292 290 58 391 288 443 339 58 239 104 313 197 58 290 4 412 158 58 508 30 585 132 58 403 242 445 287 2 194 235 639 454 58 415 78 466 149 58 141 267 211 330 0 41 126 102 270 58 191 238 197 254 58 160 238 180 256 +871 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224111.jpg 640 480 2 62 298 254 434 2 321 348 423 431 2 0 298 105 478 2 289 356 311 372 2 233 332 290 410 9 80 162 106 227 9 451 316 463 339 9 29 296 47 311 9 478 315 484 321 9 575 271 584 286 9 351 285 359 304 13 587 397 608 407 13 622 388 639 402 +872 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252292.jpg 640 425 2 333 245 443 371 2 4 228 142 303 2 237 209 325 244 9 285 0 340 75 26 459 289 481 319 26 494 217 500 231 26 535 291 558 318 2 293 216 370 271 2 257 185 279 193 2 25 197 98 219 2 127 218 310 315 2 126 184 166 205 2 241 190 270 209 0 491 286 525 368 0 458 273 486 354 0 541 290 582 386 0 515 263 543 348 0 475 238 501 305 0 489 236 513 305 0 230 186 240 211 0 442 226 460 274 0 467 229 488 272 0 549 248 567 278 0 561 238 574 283 2 0 214 86 257 7 209 160 226 175 0 506 230 518 281 2 208 177 226 188 7 172 180 212 208 26 494 299 501 315 26 557 221 564 229 26 620 253 625 268 0 559 226 568 238 2 288 189 312 205 0 34 162 639 317 2 37 162 635 386 +873 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436738.jpg 500 486 2 370 348 467 390 2 451 346 499 380 5 154 296 387 401 7 380 306 452 353 9 121 287 133 313 9 104 283 112 311 0 133 333 151 396 0 61 339 89 407 73 133 364 145 374 2 264 347 395 403 +874 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406841.jpg 640 480 2 611 369 639 412 7 553 347 638 374 7 579 352 639 406 7 553 342 628 359 12 156 356 166 380 12 143 357 154 381 2 553 346 585 353 2 564 335 588 340 2 560 353 639 391 2 625 338 639 351 +875 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090351.jpg 357 500 2 313 224 356 255 10 176 233 220 324 0 136 127 188 322 2 123 190 274 249 2 0 184 66 231 +876 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196415.jpg 640 480 3 84 63 612 416 0 335 203 359 250 0 353 199 421 302 +877 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303305.jpg 640 480 5 18 56 626 361 2 591 203 639 254 0 181 170 202 214 0 478 146 508 207 0 228 195 242 207 +878 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400189.jpg 640 380 5 49 52 480 331 0 218 121 237 174 0 134 133 151 167 0 112 154 123 169 0 90 151 97 170 0 178 131 205 160 0 154 136 168 164 0 126 135 137 165 0 353 112 410 180 0 301 124 334 158 +879 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516476.jpg 640 425 5 70 106 319 398 5 0 190 74 277 5 428 199 639 325 9 252 57 271 99 9 429 170 438 195 0 1 237 18 291 2 349 225 532 380 2 313 242 356 362 2 310 232 358 272 0 249 208 284 260 26 13 255 19 266 0 331 211 342 232 0 361 224 367 232 0 340 208 349 232 0 319 214 328 230 0 328 209 333 231 7 347 224 543 383 0 343 217 353 233 9 171 37 195 86 +880 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271017.jpg 640 425 5 45 35 545 367 74 441 151 469 183 +881 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211192.jpg 500 375 39 389 121 396 144 39 44 254 57 271 56 0 315 119 373 56 0 269 82 337 71 329 136 375 145 59 287 183 498 287 +882 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215708.jpg 375 500 56 55 267 243 454 0 69 40 354 406 0 189 75 245 124 0 0 1 202 319 27 120 56 130 71 60 0 311 297 499 +883 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542509.jpg 640 480 56 302 298 572 473 63 463 285 575 347 64 282 226 298 239 66 137 215 245 241 62 484 140 618 257 74 364 35 397 72 73 352 112 358 154 73 358 112 363 155 73 379 116 394 159 73 405 118 424 163 73 370 116 384 158 73 589 323 639 387 62 46 66 191 164 62 190 69 314 155 +884 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237920.jpg 640 426 56 459 226 513 305 56 530 209 568 262 56 564 202 591 245 13 232 255 424 418 +885 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237984.jpg 640 427 56 112 94 243 228 13 28 135 637 417 +886 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325623.jpg 640 400 56 457 276 514 348 56 519 280 585 349 56 333 272 388 345 56 499 259 544 266 60 343 256 584 279 0 248 155 289 256 0 135 180 194 375 0 33 167 123 372 0 349 205 394 260 26 179 229 198 261 56 597 266 623 355 58 15 222 45 280 9 72 44 86 72 26 141 275 168 317 56 381 273 443 348 56 427 254 478 269 +887 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224238.jpg 480 640 56 395 255 418 283 10 363 384 445 568 56 352 257 371 290 58 285 270 312 298 58 310 277 327 294 56 410 258 423 284 56 413 265 424 283 10 243 92 288 150 +888 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248314.jpg 640 480 56 447 1 636 326 44 297 245 387 309 45 229 298 333 382 63 0 8 358 328 64 224 385 338 463 39 367 0 406 83 66 117 127 312 286 56 538 362 639 479 +889 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532129.jpg 640 427 60 0 0 639 422 41 591 0 639 145 53 49 41 587 393 45 28 0 212 30 +890 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144985.jpg 640 404 7 0 134 252 333 9 283 139 289 188 13 365 269 437 312 9 293 189 323 205 +891 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474906.jpg 500 375 7 301 240 414 279 9 198 154 207 173 9 323 201 332 217 9 213 225 215 228 2 409 247 470 278 7 410 246 472 279 9 145 148 157 168 9 179 221 182 224 2 51 237 71 243 9 202 225 204 228 9 166 220 169 225 +892 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130651.jpg 640 480 9 595 167 604 185 9 593 129 607 161 9 42 145 52 175 13 324 376 607 441 13 23 367 273 439 9 61 177 75 199 +893 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362159.jpg 640 480 9 175 267 208 349 9 109 267 142 341 9 146 265 179 343 +894 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452308.jpg 480 640 9 151 7 309 371 9 316 273 354 359 9 39 295 69 373 +895 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002621.jpg 500 375 9 376 86 440 182 9 345 85 405 229 9 438 94 480 178 +896 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308907.jpg 500 333 9 141 139 160 179 0 3 249 11 275 58 66 285 79 314 58 50 285 68 311 58 83 282 97 313 1 7 263 9 275 +897 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376187.jpg 500 375 9 428 197 481 362 +898 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151558.jpg 427 640 9 217 73 300 282 9 235 365 380 500 +899 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372433.jpg 500 500 9 182 33 291 262 9 94 25 202 258 9 31 163 133 391 +900 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102906.jpg 640 428 9 362 238 382 249 9 305 236 326 249 9 150 0 237 24 9 422 0 501 21 10 101 320 113 347 10 199 322 205 333 2 220 302 238 314 +901 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041119.jpg 426 640 9 197 266 251 412 9 405 546 425 576 +902 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095063.jpg 480 640 9 165 187 243 318 9 167 343 234 421 9 231 197 287 333 2 138 506 218 552 2 211 501 220 507 +903 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168455.jpg 425 640 9 225 171 292 283 +904 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367843.jpg 640 427 9 167 193 246 389 9 47 104 146 295 9 210 63 311 263 25 286 275 637 354 9 0 311 23 352 9 155 86 206 271 +905 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222494.jpg 500 333 9 267 9 401 273 9 109 304 123 332 9 220 118 265 227 11 285 309 374 328 +906 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580029.jpg 640 427 9 153 43 226 205 +907 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143174.jpg 640 512 9 206 350 242 371 9 311 454 321 492 9 492 395 510 450 9 553 409 580 434 9 439 467 449 483 +908 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021839.jpg 480 640 9 261 203 282 261 0 211 392 277 577 0 409 462 434 521 0 431 457 456 525 0 168 456 181 504 0 47 448 60 496 0 467 471 478 508 26 217 439 245 470 26 448 468 456 497 26 424 471 432 496 26 428 491 437 506 0 24 453 47 497 0 59 457 67 482 2 0 456 32 518 0 450 472 460 524 +909 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364757.jpg 640 480 9 510 229 570 358 9 80 241 143 362 +910 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053139.jpg 640 480 9 83 318 136 417 9 12 271 70 426 9 98 238 117 317 9 321 432 348 478 +911 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160025.jpg 500 333 9 257 275 274 321 +912 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521634.jpg 480 640 9 57 24 209 387 9 221 124 320 305 +913 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430875.jpg 500 375 9 196 270 244 334 9 372 275 403 338 9 49 48 104 154 +914 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436653.jpg 640 360 9 245 157 254 174 9 187 142 199 166 9 385 193 396 209 0 616 225 636 263 0 322 228 329 247 0 338 226 344 236 2 277 230 323 260 2 601 250 637 325 2 143 223 173 248 2 0 222 101 359 2 56 226 114 269 7 394 225 447 270 9 107 193 114 207 9 144 186 147 192 9 164 190 167 196 0 336 237 343 249 2 346 231 417 275 2 466 226 553 283 2 192 228 220 248 2 178 222 198 243 2 69 250 118 334 2 445 228 481 267 9 139 194 142 200 9 156 197 159 201 9 254 157 267 162 9 351 198 356 210 2 220 221 230 230 2 256 225 289 254 2 67 210 446 273 +915 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185721.jpg 640 428 9 109 64 157 171 0 570 219 589 249 9 6 138 33 195 9 548 183 556 193 6 2 165 363 266 9 605 148 621 184 9 224 147 239 172 9 625 187 637 205 +916 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227125.jpg 375 500 9 105 5 353 488 +917 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052005.jpg 465 640 10 119 51 359 460 +918 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463303.jpg 333 500 10 73 193 212 431 +919 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262677.jpg 407 640 10 74 116 295 629 +920 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035012.jpg 639 640 10 414 471 442 544 +921 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431573.jpg 640 561 10 392 83 537 407 +922 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112928.jpg 640 480 10 118 14 173 158 +923 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544644.jpg 640 425 10 506 121 627 335 +924 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225916.jpg 640 480 10 576 281 625 393 0 36 278 93 400 0 33 270 51 314 +925 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021671.jpg 480 640 10 118 84 332 500 +926 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203483.jpg 426 640 12 142 111 281 631 6 1 0 425 640 +927 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183348.jpg 480 640 12 406 332 440 425 +928 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519565.jpg 640 480 0 131 158 189 265 0 222 101 325 374 0 327 107 504 401 13 0 170 640 341 +929 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534377.jpg 640 480 0 306 87 315 100 0 238 90 241 101 13 0 199 639 479 0 293 92 301 101 +930 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098280.jpg 640 429 0 59 2 501 420 46 246 299 450 428 +931 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533532.jpg 640 480 0 368 21 545 477 0 0 223 136 474 0 557 18 639 267 13 10 79 374 144 24 194 288 309 411 28 79 26 632 396 0 391 59 476 223 0 194 0 223 49 13 99 66 247 100 13 360 84 428 112 13 159 50 255 60 13 360 52 425 78 13 362 36 396 69 13 3 66 65 82 13 543 126 582 199 13 569 178 639 226 24 199 173 272 251 24 134 24 156 46 24 322 383 386 475 28 279 70 301 95 28 65 36 107 73 24 476 306 618 439 24 280 119 327 164 24 7 179 76 273 24 127 276 237 406 24 525 216 566 234 24 263 145 310 197 24 16 242 51 288 28 247 62 282 128 28 273 25 301 62 28 283 235 350 301 28 524 80 559 117 13 27 58 62 84 13 68 44 127 84 13 177 66 332 81 13 372 116 399 138 24 325 295 418 422 13 0 50 341 479 +932 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126833.jpg 426 640 0 218 326 335 463 0 32 307 78 371 0 0 309 23 333 13 256 381 344 492 13 147 316 172 336 13 211 320 253 369 13 277 329 304 373 13 88 315 130 340 13 21 325 76 373 13 320 316 370 341 13 0 334 32 376 13 77 316 91 339 56 369 318 402 351 56 254 325 285 366 56 44 336 80 374 56 0 334 30 377 56 214 328 254 370 13 258 327 289 367 56 275 320 298 329 56 240 319 255 347 60 259 330 303 374 60 22 313 58 327 +933 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191300.jpg 500 431 0 355 208 381 280 0 391 199 419 280 0 217 83 239 138 0 124 2 139 46 0 138 18 148 43 0 342 49 374 104 0 354 27 369 56 0 244 78 269 142 0 266 154 287 211 13 339 119 391 167 13 388 157 446 211 24 340 114 358 138 24 217 93 223 108 0 349 86 375 126 0 270 22 287 70 24 249 81 263 98 28 338 80 352 98 0 475 142 499 218 0 290 22 312 77 13 184 4 215 35 24 266 210 291 234 24 354 222 366 243 24 329 255 350 267 +934 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075372.jpg 640 480 0 1 4 139 357 0 65 0 191 262 0 172 0 246 82 23 77 1 639 395 41 68 427 101 440 0 1 180 72 477 +935 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373705.jpg 640 427 0 492 65 579 210 0 206 129 249 201 0 94 85 136 201 0 130 154 165 204 0 0 159 10 185 0 620 135 639 208 10 365 165 554 424 +936 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170813.jpg 640 424 0 284 155 380 255 0 610 204 622 236 13 59 162 309 254 63 270 179 293 200 0 582 210 593 235 0 566 210 577 237 +937 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460053.jpg 640 480 0 200 198 630 442 39 88 11 125 93 39 201 0 223 33 61 364 114 541 427 39 171 0 204 34 39 78 35 100 95 39 224 0 240 29 71 94 106 162 151 +938 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010249.jpg 426 640 0 111 80 412 632 13 0 316 197 582 0 1 119 73 389 +939 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565693.jpg 640 480 0 126 119 254 467 0 224 63 356 479 13 51 162 623 409 0 339 147 435 385 0 504 167 639 344 0 586 25 597 62 0 566 26 575 57 0 256 0 340 134 0 538 20 550 52 0 559 24 568 48 41 510 258 536 298 +940 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523230.jpg 640 471 0 78 72 316 450 0 260 85 449 436 13 20 193 564 432 39 189 209 222 278 +941 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048791.jpg 640 480 0 156 14 469 475 23 332 34 497 441 +942 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431047.jpg 457 640 0 120 57 406 629 61 210 355 456 639 73 29 272 268 370 +943 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278977.jpg 640 454 0 204 174 365 376 13 199 222 422 375 +944 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310524.jpg 640 480 0 187 269 214 304 0 212 260 235 295 0 183 187 192 207 0 203 184 212 195 0 193 188 208 208 13 3 236 270 339 24 22 265 36 279 13 23 339 127 399 13 90 252 148 279 13 0 229 230 306 13 131 223 173 242 13 87 231 136 255 13 1 245 90 271 13 115 305 196 349 13 231 253 324 290 26 178 294 206 312 26 66 249 75 267 0 548 177 561 212 0 8 236 42 282 0 55 242 81 275 0 554 179 569 216 0 272 152 278 161 0 619 179 634 208 0 509 183 525 201 24 184 298 200 310 +945 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443343.jpg 640 640 0 226 284 289 364 13 208 314 311 365 +946 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078701.jpg 480 640 0 98 54 346 351 55 49 361 477 545 39 52 315 72 353 39 349 272 362 306 39 433 221 445 291 57 1 203 424 389 57 435 220 479 315 62 0 0 265 191 58 426 86 479 231 +947 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120767.jpg 640 426 0 149 203 199 338 0 398 200 474 328 0 503 155 509 180 0 514 156 521 180 0 633 170 639 187 0 621 159 628 178 13 35 163 76 179 23 120 0 525 426 13 346 173 369 184 0 361 190 450 311 0 15 196 109 357 0 532 154 544 183 0 619 159 623 164 0 526 159 532 182 +948 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330065.jpg 640 359 0 17 53 302 354 23 224 17 589 284 0 0 53 68 295 0 594 103 639 354 +949 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398519.jpg 640 480 0 333 349 375 434 23 101 83 637 472 +950 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296825.jpg 640 480 0 547 115 596 246 7 37 30 603 425 0 347 106 406 153 0 505 118 511 135 +951 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403378.jpg 640 425 0 274 0 639 425 +952 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028820.jpg 480 640 0 221 325 239 349 0 350 325 364 365 23 77 116 410 560 +953 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461278.jpg 500 375 13 24 204 345 367 +954 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236714.jpg 640 427 13 24 7 639 419 41 373 214 420 276 +955 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056624.jpg 612 612 13 222 372 488 542 +956 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361751.jpg 640 567 13 60 66 512 552 13 271 58 394 146 +957 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183187.jpg 640 427 13 259 291 364 331 +958 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340451.jpg 640 424 13 42 166 569 368 0 238 45 394 381 +959 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356379.jpg 500 334 13 116 121 287 251 13 401 115 438 157 13 462 111 482 136 58 253 82 400 138 58 409 99 433 126 58 467 106 476 120 58 481 109 486 118 58 485 108 490 118 58 454 105 464 120 58 476 108 481 117 +960 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152192.jpg 640 360 13 96 249 164 268 +961 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479099.jpg 640 480 13 383 167 445 202 +962 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461007.jpg 375 500 13 149 338 374 492 +963 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365214.jpg 640 480 13 0 1 640 328 41 468 151 547 248 73 92 167 233 332 +964 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083557.jpg 640 480 13 120 222 310 330 +965 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151005.jpg 640 428 13 0 1 321 323 +966 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147058.jpg 640 480 13 134 299 473 474 73 244 277 387 353 0 16 29 79 207 0 537 33 561 102 0 509 40 534 101 0 420 31 436 76 0 499 38 514 88 0 554 28 567 86 0 472 27 481 60 0 493 33 513 99 26 525 63 537 77 0 447 33 459 76 0 521 33 543 98 0 601 43 621 109 26 10 109 47 143 0 570 34 577 64 0 0 27 60 193 0 456 21 636 71 +967 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156466.jpg 503 640 13 121 357 386 504 +968 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352538.jpg 480 640 13 1 1 475 632 26 57 198 444 542 +969 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423172.jpg 640 432 13 19 136 544 431 13 0 129 139 255 13 1 122 56 179 +970 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097479.jpg 640 480 13 117 174 529 396 26 234 187 317 295 0 234 107 456 411 +971 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215826.jpg 500 375 13 0 1 498 370 +972 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322829.jpg 640 427 13 81 47 539 335 +973 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196852.jpg 640 496 13 157 75 574 440 13 77 47 199 200 +974 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442952.jpg 640 400 13 188 218 493 398 +975 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227413.jpg 600 402 13 0 197 595 396 27 269 200 302 239 14 236 259 283 285 +976 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262347.jpg 640 427 13 341 153 543 297 +977 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419558.jpg 640 424 13 122 185 526 377 +978 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258209.jpg 640 426 13 175 322 272 368 73 226 318 250 325 13 559 321 638 370 0 137 256 226 373 +979 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562834.jpg 640 480 13 45 336 279 478 +980 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192153.jpg 640 480 13 24 233 373 434 +981 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401124.jpg 640 429 13 79 198 377 326 +982 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181572.jpg 480 640 13 0 0 480 632 35 312 113 389 170 +983 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320893.jpg 640 408 13 310 262 637 403 +984 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118401.jpg 640 428 20 310 173 391 231 20 87 170 180 231 20 397 198 444 230 20 491 190 529 230 20 527 189 583 231 23 182 172 261 237 +985 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562875.jpg 640 479 20 52 54 99 90 15 274 99 310 176 62 443 3 637 66 41 343 63 364 97 41 367 71 389 110 41 396 67 419 103 59 292 449 549 478 73 275 235 311 243 73 192 251 244 266 39 85 251 101 295 39 71 299 89 358 39 12 276 26 318 39 37 282 49 315 +986 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238700.jpg 640 523 22 19 316 208 430 23 232 75 611 511 +987 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516026.jpg 500 375 22 131 208 279 309 23 282 56 436 246 +988 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311295.jpg 640 427 22 498 226 574 288 22 30 212 76 254 22 221 225 265 272 23 464 168 485 246 23 203 158 210 169 23 227 168 232 177 23 245 179 291 238 23 398 176 418 204 23 245 203 265 237 22 89 214 104 254 +989 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032193.jpg 640 480 22 299 314 397 441 22 213 352 324 443 23 168 59 252 451 23 114 144 288 458 23 276 154 518 438 +990 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149890.jpg 640 480 22 432 257 536 356 22 433 255 514 343 23 131 115 215 315 +991 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364589.jpg 640 512 22 323 286 566 498 22 104 324 388 496 23 110 17 404 338 +992 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547858.jpg 480 640 23 274 325 337 496 23 44 395 208 597 +993 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064746.jpg 424 640 23 81 216 324 556 +994 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001063.jpg 480 640 23 162 162 292 556 +995 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102665.jpg 640 480 23 51 148 179 390 23 377 86 494 375 23 397 69 555 352 +996 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191390.jpg 640 427 23 134 146 264 391 23 231 132 379 374 23 292 128 462 370 23 383 119 606 362 +997 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316359.jpg 427 640 23 4 60 356 635 +998 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394611.jpg 640 480 23 394 208 447 317 23 85 202 188 304 +999 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306952.jpg 480 640 23 153 140 285 388 +1000 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393282.jpg 640 640 23 320 244 471 531 23 124 348 236 484 +1001 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285961.jpg 640 427 23 52 35 639 420 +1002 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491481.jpg 640 427 23 233 29 494 426 +1003 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091857.jpg 640 427 23 0 156 346 421 23 539 278 639 426 +1004 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186637.jpg 640 425 23 144 130 369 419 +1005 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155035.jpg 640 480 23 121 222 235 332 23 285 207 440 330 23 388 138 470 316 +1006 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566135.jpg 640 638 23 7 0 490 603 23 525 323 622 403 +1007 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302298.jpg 425 640 23 129 114 326 515 23 70 257 262 582 +1008 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076087.jpg 640 425 23 22 251 84 338 23 59 55 339 424 23 281 202 439 424 23 228 98 526 417 23 585 275 639 343 +1009 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262900.jpg 500 375 23 75 73 416 362 23 87 70 316 219 +1010 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480345.jpg 640 480 23 200 110 512 448 +1011 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289337.jpg 448 640 23 110 81 295 568 +1012 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150301.jpg 640 427 23 318 81 514 395 23 258 200 326 373 23 324 118 477 335 +1013 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079188.jpg 480 640 23 0 10 451 639 +1014 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443334.jpg 424 640 23 107 312 402 631 23 302 406 401 627 +1015 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373375.jpg 640 480 23 186 11 504 472 +1016 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461993.jpg 640 426 23 323 231 347 348 23 621 227 639 349 +1017 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495734.jpg 427 640 23 221 85 374 543 14 82 222 113 238 23 197 122 278 475 23 319 192 373 270 23 112 161 164 303 23 64 226 185 465 23 197 148 245 337 23 158 178 222 431 +1018 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048956.jpg 480 640 23 100 53 451 565 +1019 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158494.jpg 427 640 23 0 51 375 541 23 0 259 308 639 +1020 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404889.jpg 425 640 23 44 86 395 610 +1021 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517318.jpg 640 513 23 259 14 639 501 0 11 253 301 505 +1022 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026799.jpg 640 626 23 168 211 337 580 23 182 274 616 617 +1023 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254568.jpg 640 514 23 298 276 451 472 +1024 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404886.jpg 480 640 23 101 108 336 542 +1025 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142189.jpg 640 360 23 12 7 620 335 +1026 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526341.jpg 640 428 23 44 64 203 422 23 364 154 596 427 +1027 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518729.jpg 478 640 23 196 205 284 420 +1028 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330931.jpg 640 427 23 348 133 572 382 +1029 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531000.jpg 640 427 23 0 13 563 424 +1030 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453104.jpg 640 427 23 228 157 478 426 +1031 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016995.jpg 512 640 23 93 113 392 453 +1032 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315792.jpg 500 400 23 0 0 445 400 +1033 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459757.jpg 640 480 23 201 191 369 309 +1034 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470370.jpg 500 375 33 161 93 225 137 +1035 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100166.jpg 426 640 41 170 271 245 349 41 181 250 215 272 13 1 0 285 640 +1036 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463555.jpg 640 425 44 402 66 639 196 46 320 222 435 317 46 291 153 376 238 46 243 171 326 278 46 182 179 278 283 46 193 100 304 182 60 2 0 638 418 +1037 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362189.jpg 640 427 45 1 0 638 421 46 93 39 585 420 +1038 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050896.jpg 640 640 45 46 57 582 594 49 189 156 329 299 49 201 86 336 180 49 338 121 472 247 49 296 223 443 370 49 142 181 212 307 49 379 329 531 492 49 256 346 382 489 49 113 344 261 496 49 441 214 556 355 49 84 286 198 402 49 199 285 313 392 60 1 1 635 626 49 247 465 388 573 +1039 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302997.jpg 480 640 46 176 27 404 305 +1040 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427782.jpg 480 640 49 0 71 296 426 49 3 0 158 93 60 0 20 480 639 13 0 10 477 627 +1041 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068059.jpg 640 480 49 310 194 450 330 45 75 8 581 462 +1042 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136458.jpg 480 640 63 139 81 281 276 73 332 381 467 593 73 316 391 372 526 64 253 310 292 331 65 112 220 130 266 62 1 12 196 178 67 104 183 128 219 67 110 292 142 345 66 148 197 276 245 +1043 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090753.jpg 447 640 75 215 457 355 613 73 120 428 240 527 73 119 603 335 633 45 227 545 348 616 73 380 457 445 580 +1044 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092093.jpg 640 414 24 79 133 148 274 0 203 66 326 347 0 307 35 426 364 0 388 29 547 369 0 16 78 117 356 0 523 100 543 154 0 511 100 525 152 0 552 105 579 157 0 590 105 599 134 3 9 258 247 413 3 536 245 639 381 3 527 186 639 302 3 517 136 639 206 3 550 160 589 187 3 277 127 315 173 3 293 122 330 160 3 303 120 343 158 3 600 139 640 168 3 132 115 143 145 3 577 110 612 139 3 313 101 337 119 0 140 87 199 193 0 207 98 228 121 28 335 353 523 413 0 1 137 59 258 0 302 98 315 123 0 577 102 589 119 3 562 148 639 180 0 0 80 633 165 3 7 116 639 413 +1045 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343315.jpg 640 478 10 520 62 581 209 +1046 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264683.jpg 640 425 0 79 163 92 186 4 65 189 639 420 4 382 41 639 200 4 38 40 187 163 4 1 288 68 370 4 41 257 224 349 4 298 175 510 246 4 506 284 640 356 4 149 227 230 260 4 240 75 342 125 4 387 128 494 157 0 70 164 77 188 4 263 152 352 176 4 183 102 266 151 4 346 114 452 163 +1047 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383065.jpg 426 640 0 388 317 425 361 0 25 344 34 366 11 413 305 425 317 +1048 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334675.jpg 640 425 5 153 254 205 279 5 206 258 232 278 5 299 265 350 300 5 267 267 314 300 5 337 267 376 296 5 362 266 405 295 5 419 266 455 295 5 390 266 430 296 5 235 266 296 301 5 259 254 307 274 5 232 254 280 278 5 285 253 323 270 5 307 254 347 271 5 94 180 554 314 +1049 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386661.jpg 500 337 13 334 185 431 258 13 65 191 170 261 56 251 187 312 226 13 429 205 456 225 +1050 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486991.jpg 540 640 5 0 0 137 640 +1051 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219514.jpg 500 400 7 53 357 276 392 9 170 11 263 144 +1052 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302572.jpg 427 640 9 158 212 186 278 +1053 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245102.jpg 640 427 9 404 143 428 173 +1054 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389340.jpg 460 640 10 1 240 152 541 +1055 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386457.jpg 426 640 15 123 133 241 517 +1056 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496554.jpg 640 480 23 244 157 379 476 +1057 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220041.jpg 429 640 5 154 1 428 629 +1058 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329375.jpg 640 480 18 134 116 540 407 18 134 14 309 126 18 592 69 639 121 +1059 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279154.jpg 640 480 10 176 147 255 341 +1060 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338826.jpg 640 427 10 299 253 320 288 +1061 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078565.jpg 640 499 16 201 306 232 322 8 201 193 248 264 8 51 200 114 256 0 412 265 436 344 0 469 286 490 343 0 293 251 300 288 0 496 262 515 337 0 571 244 580 267 0 350 249 363 283 0 332 247 341 279 0 238 245 247 263 0 488 276 504 341 0 540 242 567 268 0 478 249 487 263 0 314 251 324 282 8 183 209 213 240 8 529 259 557 268 8 464 188 507 262 8 513 187 552 254 0 344 252 350 275 8 357 228 376 234 8 255 174 338 282 8 587 232 613 235 8 443 230 459 232 0 96 222 621 286 +1062 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443537.jpg 500 311 16 162 79 499 190 15 89 50 232 171 59 0 127 499 304 +1063 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219578.jpg 640 427 16 29 115 468 362 15 420 148 637 276 57 0 140 238 422 57 8 28 639 286 +1064 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038031.jpg 500 375 16 366 186 395 215 2 297 131 499 368 0 325 51 393 242 0 385 231 499 368 26 314 116 344 150 67 380 69 384 83 67 378 115 388 119 7 0 327 357 374 +1065 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366615.jpg 640 480 16 70 1 507 479 +1066 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435391.jpg 640 480 16 360 372 598 479 0 38 138 231 363 0 314 132 452 393 8 3 253 639 479 +1067 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271359.jpg 267 400 16 103 210 120 256 16 211 222 247 284 0 223 130 266 256 0 0 124 55 307 0 1 145 21 326 0 11 118 44 186 0 99 141 117 192 0 120 141 133 183 0 131 142 142 182 3 49 171 89 235 19 146 139 228 298 0 142 134 164 191 0 113 144 122 182 0 186 139 198 160 49 223 201 226 204 49 213 196 217 200 0 76 148 100 185 0 164 143 180 155 0 101 144 115 202 49 218 199 221 202 +1068 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096288.jpg 640 480 16 299 261 381 377 0 370 182 471 440 0 246 87 311 276 0 193 102 241 224 24 355 147 447 260 24 232 64 298 151 24 178 68 240 136 41 247 194 261 212 +1069 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431615.jpg 640 424 16 294 199 351 239 8 295 199 526 265 0 341 195 397 250 0 403 197 456 251 8 131 122 397 164 8 84 91 203 124 +1070 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201918.jpg 640 480 16 377 40 640 475 15 198 194 348 365 +1071 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370701.jpg 640 640 16 223 507 326 598 16 350 546 480 620 0 342 119 495 580 7 147 293 198 308 +1072 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183571.jpg 640 380 16 273 178 345 265 8 139 64 624 340 0 16 49 268 359 0 92 10 120 68 +1073 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534679.jpg 640 428 16 416 134 451 209 8 110 50 507 273 0 253 145 275 159 +1074 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140203.jpg 640 480 16 485 42 577 113 0 508 20 588 246 0 0 118 43 410 0 7 47 26 113 7 19 0 503 389 0 17 18 37 83 0 229 48 254 90 0 0 20 29 68 +1075 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379108.jpg 500 333 16 211 139 299 191 8 17 156 419 219 0 181 107 240 183 8 0 6 499 76 +1076 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549936.jpg 640 389 16 541 193 590 248 19 251 138 354 223 19 332 134 491 232 19 147 115 227 145 19 13 114 127 194 19 589 127 639 212 19 594 111 639 145 19 455 137 492 215 19 381 118 429 135 19 177 127 266 148 19 197 109 266 128 19 132 107 177 171 19 38 102 141 180 7 100 53 148 66 2 467 53 491 61 19 266 124 305 140 16 249 207 306 233 0 508 93 559 238 19 155 113 607 240 +1077 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265916.jpg 640 640 16 275 156 431 335 58 361 6 639 630 2 533 14 639 155 0 8 12 233 632 0 41 0 435 629 2 0 0 89 76 2 342 0 431 63 2 83 0 219 73 2 484 1 593 59 24 86 223 395 638 2 379 0 493 63 +1078 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382717.jpg 640 483 16 132 125 258 232 16 207 69 270 187 39 108 171 120 215 2 400 56 592 184 7 50 53 351 334 7 282 52 418 126 +1079 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305343.jpg 640 427 16 341 150 559 357 41 60 124 304 391 +1080 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223777.jpg 640 480 58 407 221 422 249 58 423 227 437 249 6 434 121 626 292 13 247 234 293 261 13 305 234 340 257 13 387 231 415 251 58 117 224 139 264 58 33 210 49 232 58 96 231 120 265 58 338 215 362 254 +1081 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500723.jpg 480 640 58 33 0 320 150 15 0 372 334 597 56 59 33 428 593 +1082 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369776.jpg 375 500 58 94 358 142 406 56 16 373 44 418 56 29 370 60 419 56 30 352 67 406 2 314 323 373 414 2 221 326 252 365 2 246 325 270 370 11 161 82 374 312 58 107 341 122 359 58 88 319 100 349 7 266 318 331 374 +1083 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433075.jpg 640 480 58 124 170 295 364 58 301 199 525 443 15 286 117 504 271 +1084 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501824.jpg 640 427 58 0 65 75 132 6 101 141 639 420 0 188 276 225 385 0 212 280 241 356 0 138 275 169 389 0 109 282 143 380 0 66 278 106 406 0 30 283 48 355 0 59 284 69 310 0 67 284 76 308 0 73 284 80 298 25 184 333 192 383 24 146 291 174 330 24 112 297 143 339 26 60 310 79 343 28 216 335 249 395 28 101 339 130 388 24 79 297 103 334 26 69 286 73 291 0 172 282 186 324 +1085 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083065.jpg 640 604 62 33 84 597 586 0 174 159 442 403 74 78 0 150 87 +1086 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406211.jpg 640 480 62 460 2 619 182 15 118 226 268 391 73 193 54 210 92 73 172 43 190 88 73 177 3 181 37 73 220 59 234 96 73 158 45 170 79 73 160 89 171 117 73 179 89 191 124 73 208 95 213 133 73 227 100 234 136 73 227 144 236 179 73 205 136 213 170 73 224 7 230 45 56 0 119 64 204 73 202 6 207 42 73 0 1 591 311 +1087 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573877.jpg 500 374 62 54 79 456 358 15 199 94 494 369 63 53 76 455 361 +1088 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260686.jpg 640 481 62 222 31 404 179 0 259 54 388 161 27 307 104 330 158 +1089 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154095.jpg 500 375 62 0 112 126 267 46 21 88 86 140 73 414 10 440 76 73 439 12 455 62 73 423 104 473 115 73 367 102 422 111 73 368 119 419 126 73 419 126 469 133 73 420 118 470 129 0 118 0 144 30 59 23 279 499 369 73 366 105 421 115 73 432 12 448 70 73 422 113 471 120 73 377 0 403 83 39 35 59 48 83 73 394 6 423 80 24 81 66 227 302 73 367 0 499 83 +1090 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316015.jpg 500 400 62 128 85 330 215 15 306 164 461 367 63 0 257 55 310 66 124 232 325 314 73 392 141 406 179 73 422 150 493 168 73 0 272 46 310 67 59 276 111 307 73 384 144 399 171 +1091 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334062.jpg 500 375 62 461 66 499 126 15 234 177 340 254 57 0 68 499 374 +1092 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037907.jpg 640 448 62 1 22 180 378 15 237 151 321 315 58 410 1 639 398 +1093 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215579.jpg 640 456 62 13 0 585 263 15 197 174 347 368 0 215 0 388 119 +1094 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198641.jpg 640 479 62 94 112 384 304 62 0 111 109 352 15 221 184 495 422 66 0 363 265 471 74 571 275 588 295 63 413 178 574 299 63 427 298 595 360 +1095 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113977.jpg 500 333 14 1 62 499 185 0 324 133 442 316 0 170 181 273 291 0 291 130 357 243 0 225 59 290 232 0 266 213 353 323 0 107 129 192 196 0 5 129 121 263 0 230 9 271 84 0 119 0 174 86 0 62 28 98 73 0 437 3 499 142 0 158 208 190 259 0 319 0 388 75 0 1 0 499 300 +1096 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277051.jpg 640 427 14 254 173 437 326 14 65 193 374 361 56 427 65 578 177 43 21 338 506 420 60 0 284 640 422 60 472 133 639 174 39 55 3 185 305 56 614 71 639 117 14 500 99 585 149 14 500 99 586 148 +1097 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436044.jpg 640 428 14 230 146 380 329 +1098 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222407.jpg 640 427 14 186 126 601 292 +1099 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095441.jpg 640 400 14 424 137 599 309 14 303 80 424 287 14 241 127 414 232 14 135 190 280 394 14 0 196 143 364 14 60 141 137 204 14 112 118 203 195 14 539 142 603 239 14 489 143 557 211 14 354 166 444 332 14 27 191 87 254 14 78 192 146 277 14 22 176 77 224 14 1 104 639 267 +1100 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412364.jpg 640 427 14 72 129 193 341 14 401 27 557 286 +1101 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047395.jpg 375 500 14 28 48 40 55 9 0 71 53 105 +1102 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523137.jpg 500 490 14 406 298 461 375 14 25 50 29 57 14 366 53 369 58 14 439 50 455 61 19 52 106 333 384 14 273 55 279 61 14 48 53 54 64 14 153 325 166 360 +1103 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312544.jpg 640 450 14 100 172 340 365 14 315 68 487 247 56 232 211 539 431 +1104 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529494.jpg 500 375 14 328 96 430 152 14 80 95 173 177 14 196 80 321 148 74 0 52 500 369 14 412 292 499 350 14 0 181 83 268 14 1 288 104 366 14 401 186 491 256 +1105 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440500.jpg 640 427 14 179 224 254 299 +1106 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213361.jpg 640 451 14 243 81 584 336 +1107 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015751.jpg 640 427 14 152 231 298 398 14 107 322 153 370 14 43 347 170 397 14 222 381 269 426 +1108 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333808.jpg 640 427 14 100 74 411 365 +1109 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503951.jpg 640 640 14 32 55 319 466 14 384 46 558 604 +1110 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482477.jpg 492 640 14 147 83 429 487 +1111 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402000.jpg 640 447 14 586 98 639 183 14 403 305 432 327 0 253 292 277 405 14 472 205 520 253 14 590 315 614 333 14 233 57 254 69 14 533 283 561 294 14 466 279 504 290 14 422 269 462 286 14 224 34 331 66 14 414 43 479 69 14 567 288 612 313 26 255 308 275 355 14 467 179 520 211 14 556 290 594 344 14 5 41 639 349 +1112 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542234.jpg 640 425 14 181 159 243 218 +1113 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359791.jpg 500 375 14 281 23 286 28 8 0 118 499 374 25 24 84 81 135 25 72 75 140 110 0 74 90 101 133 13 0 164 154 229 13 0 131 145 146 13 5 142 193 159 13 1 117 28 130 56 243 258 385 373 56 109 268 242 371 56 64 218 155 374 56 92 187 160 260 56 165 187 227 215 56 367 264 494 370 56 260 217 334 260 56 348 218 418 271 56 171 219 246 309 56 240 189 299 250 56 475 262 499 366 56 417 216 496 261 0 43 102 85 133 0 92 93 122 133 +1114 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494578.jpg 640 429 14 128 235 212 303 14 381 86 418 114 14 306 135 334 181 14 333 110 372 143 14 424 48 454 75 14 230 203 294 242 14 404 66 433 91 14 444 23 467 46 14 474 8 493 24 14 480 0 505 16 14 27 146 72 158 +1115 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142941.jpg 479 640 14 87 50 336 628 65 12 409 410 630 0 111 0 478 379 41 151 386 354 639 56 91 1 478 411 +1116 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553165.jpg 500 243 14 382 123 392 136 14 197 109 206 116 8 38 203 121 221 0 123 194 129 205 0 118 195 121 205 0 74 194 77 201 0 48 193 52 202 14 419 123 424 127 14 149 76 160 81 14 369 177 373 180 14 403 161 406 165 14 49 149 52 153 +1117 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511076.jpg 640 427 14 266 262 306 307 14 296 242 322 279 14 340 227 388 263 14 204 250 244 295 14 165 263 200 312 14 173 248 199 282 14 143 147 208 243 14 223 85 269 167 14 186 88 262 147 14 271 198 318 264 14 297 217 319 250 2 179 116 220 151 0 352 72 542 375 14 132 254 178 299 13 451 252 635 415 0 139 122 149 154 14 311 279 358 329 26 472 208 573 276 14 55 160 370 364 +1118 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233327.jpg 500 393 14 164 124 284 346 +1119 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473015.jpg 640 427 14 213 153 282 192 14 214 71 260 97 14 223 57 244 65 14 227 100 245 107 14 219 35 255 50 +1120 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163020.jpg 640 492 14 96 104 244 226 +1121 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004283.jpg 640 415 14 79 92 587 338 +1122 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041867.jpg 500 379 14 62 50 472 349 +1123 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155087.jpg 640 480 14 193 173 505 354 +1124 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302302.jpg 478 640 14 306 237 359 350 +1125 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200703.jpg 600 420 14 117 255 450 381 14 242 178 517 285 14 105 76 435 216 14 97 28 297 127 +1126 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111590.jpg 640 427 14 322 66 458 242 +1127 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201348.jpg 640 431 14 478 344 567 397 15 63 50 269 368 1 0 0 639 359 45 209 133 404 308 +1128 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495852.jpg 640 485 14 211 36 540 456 +1129 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294593.jpg 426 640 14 224 216 287 307 17 41 224 405 515 +1130 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567383.jpg 640 480 14 303 158 570 294 14 114 168 318 340 74 108 295 638 474 +1131 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218310.jpg 420 640 14 83 46 391 483 14 206 473 320 584 14 0 402 99 497 +1132 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435671.jpg 640 425 14 222 138 364 317 +1133 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025360.jpg 640 524 14 14 42 611 340 +1134 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448278.jpg 640 480 14 382 353 441 385 14 374 282 418 307 14 474 181 508 197 14 212 332 247 385 14 504 281 538 303 14 0 347 58 390 14 63 292 99 330 14 231 237 275 266 14 87 370 151 424 14 22 139 54 148 14 12 162 43 178 14 552 140 568 155 14 439 216 458 241 14 88 1 639 236 +1135 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148458.jpg 640 441 14 511 97 541 140 14 209 97 289 149 14 250 88 309 137 14 20 77 89 141 14 571 42 602 80 14 385 42 407 67 14 381 20 425 55 14 449 47 474 74 14 507 47 524 62 14 295 100 367 133 14 423 108 478 146 14 428 86 455 104 14 185 68 254 97 14 344 85 404 116 14 271 68 311 96 14 204 82 245 126 14 102 56 153 107 14 52 74 77 111 14 91 52 135 76 14 504 59 546 93 14 377 101 413 117 15 46 279 178 422 14 472 106 504 148 14 1 10 579 150 +1136 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468354.jpg 640 427 14 213 239 235 296 14 323 357 347 370 14 347 302 353 316 14 141 263 162 270 14 387 368 412 389 14 51 246 58 257 14 34 258 42 267 8 257 134 355 145 8 160 135 213 146 8 66 139 140 148 8 0 141 60 151 8 204 137 246 145 14 14 300 26 311 14 485 296 503 302 14 394 287 404 296 14 359 281 376 288 14 323 288 337 293 14 179 298 195 306 14 136 264 208 308 +1137 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272635.jpg 500 334 14 109 50 435 261 0 183 212 188 226 +1138 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061836.jpg 450 303 14 108 59 376 223 +1139 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574988.jpg 480 640 14 189 259 290 356 2 300 394 330 420 2 211 423 270 447 2 293 388 314 415 +1140 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280017.jpg 640 427 14 43 86 450 378 +1141 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119233.jpg 500 334 14 380 0 455 91 15 12 97 456 259 44 335 21 351 46 44 316 24 326 48 63 60 11 313 215 41 20 39 60 91 44 352 19 364 39 44 329 29 336 46 67 0 207 45 237 +1142 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515727.jpg 640 480 14 137 212 272 330 14 322 182 482 305 14 75 279 121 323 14 273 156 302 221 14 547 190 574 226 14 444 289 531 337 +1143 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293452.jpg 640 513 14 60 177 163 453 14 342 100 585 407 14 366 86 582 278 +1144 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337035.jpg 640 480 14 376 188 476 327 14 170 77 272 162 14 103 135 196 248 14 0 421 96 473 14 463 190 582 259 14 465 127 583 199 14 178 361 330 461 14 269 260 357 366 +1145 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250205.jpg 640 457 14 197 126 379 325 14 87 123 239 299 +1146 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356092.jpg 480 640 14 137 10 479 633 +1147 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009553.jpg 640 427 14 267 137 613 332 +1148 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512337.jpg 479 640 14 146 164 406 474 +1149 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066519.jpg 640 439 14 468 216 565 316 +1150 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131207.jpg 640 479 14 214 168 286 357 14 81 177 184 321 13 1 284 639 471 +1151 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500175.jpg 612 612 14 232 432 297 468 14 120 93 162 146 14 446 534 491 605 14 169 181 214 206 14 383 338 424 381 14 438 89 456 123 14 463 91 480 116 +1152 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354061.jpg 640 360 14 96 40 259 235 +1153 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475944.jpg 425 640 14 11 182 266 617 +1154 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012230.jpg 640 480 14 195 117 233 160 2 224 175 639 432 2 0 148 422 386 2 0 175 49 232 2 391 150 486 179 14 457 115 507 181 0 587 159 603 177 14 439 156 470 175 7 513 145 601 174 0 409 160 419 176 2 35 175 75 185 60 82 183 109 185 +1155 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388881.jpg 640 430 14 169 121 559 324 +1156 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577522.jpg 640 640 14 0 159 597 548 63 0 5 629 632 +1157 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019042.jpg 640 371 14 308 165 329 205 2 344 1 390 11 2 221 8 246 12 +1158 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114090.jpg 640 427 14 337 145 470 267 14 0 94 279 389 +1159 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183469.jpg 500 355 14 202 47 334 302 14 344 63 474 282 14 29 56 162 319 +1160 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309452.jpg 640 480 14 245 134 385 474 +1161 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568956.jpg 426 640 14 72 234 196 508 14 45 404 98 444 14 107 473 160 518 14 134 526 187 587 14 182 530 238 570 14 135 456 175 486 0 161 218 271 543 14 190 475 199 499 14 213 219 235 274 25 114 3 425 271 14 98 288 111 306 26 208 320 332 554 0 282 154 332 269 14 10 440 55 490 14 229 296 266 372 0 203 124 425 639 0 349 243 425 292 14 137 488 178 525 +1162 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230679.jpg 640 480 14 273 246 313 343 0 419 139 517 410 22 37 192 79 220 23 109 156 407 477 26 462 252 479 288 25 116 148 204 215 25 67 136 137 152 25 0 128 87 225 14 509 181 521 204 25 0 95 48 132 +1163 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300155.jpg 640 427 14 279 153 455 350 +1164 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572017.jpg 640 427 14 226 142 295 348 +1165 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494731.jpg 640 427 14 145 223 174 250 14 400 139 457 200 +1166 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137265.jpg 640 480 14 536 88 545 98 25 0 2 327 270 73 0 241 551 479 +1167 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430238.jpg 640 452 14 3 134 240 266 60 1 220 639 444 41 131 233 272 354 41 61 222 128 345 44 281 300 340 338 44 333 341 411 357 56 452 7 640 314 +1168 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211063.jpg 640 614 14 7 1 432 432 +1169 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197652.jpg 640 426 14 238 246 465 361 14 102 218 225 373 14 417 175 541 338 14 281 345 466 425 14 36 147 154 255 14 494 100 612 418 14 349 57 445 115 14 160 151 260 250 14 84 80 158 166 +1170 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538976.jpg 480 640 14 151 222 320 582 +1171 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302318.jpg 500 375 14 108 310 120 320 14 262 256 267 261 14 2 295 14 303 14 67 270 72 275 2 457 208 499 255 2 412 201 464 238 2 390 199 419 224 2 361 194 384 213 2 345 196 362 211 0 435 216 455 244 0 373 197 405 300 0 433 218 468 259 14 15 323 20 329 13 437 243 479 288 0 419 244 465 280 0 339 201 344 211 0 320 200 325 213 2 414 198 431 203 13 336 214 346 233 14 0 367 9 374 14 191 237 194 239 14 0 351 3 357 2 452 197 475 209 2 484 202 499 209 +1172 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440706.jpg 640 426 14 205 136 305 292 +1173 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117237.jpg 640 480 14 131 155 249 268 +1174 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197191.jpg 640 480 14 319 160 367 205 14 371 347 447 403 +1175 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411188.jpg 640 426 14 148 36 368 231 +1176 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012115.jpg 640 427 14 436 34 461 51 0 76 160 245 420 0 291 193 349 262 0 345 196 431 332 0 251 282 334 360 0 421 233 461 283 14 275 51 301 84 14 503 36 522 56 14 577 19 608 48 14 279 30 326 100 14 0 358 8 370 14 48 361 56 372 14 410 269 435 298 0 240 204 289 264 +1177 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129362.jpg 429 640 14 46 188 261 602 +1178 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277518.jpg 640 512 14 31 203 67 236 14 349 170 390 202 14 155 147 171 206 14 345 17 375 55 14 404 274 450 295 8 24 185 425 310 +1179 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123220.jpg 640 426 15 100 187 318 338 15 257 66 421 162 +1180 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137507.jpg 640 429 15 0 8 460 424 57 2 0 635 422 +1181 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346865.jpg 500 375 15 2 187 325 374 2 16 0 96 34 15 275 61 498 368 +1182 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295016.jpg 503 640 15 26 81 465 462 41 194 270 451 559 +1183 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122213.jpg 480 640 15 117 297 265 553 56 99 592 217 639 71 154 529 310 601 +1184 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423337.jpg 640 530 15 11 20 605 470 73 22 301 546 529 +1185 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286708.jpg 640 481 15 37 107 639 448 +1186 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296032.jpg 480 640 15 48 54 456 569 +1187 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512630.jpg 480 640 15 96 1 479 435 46 0 283 215 635 +1188 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569272.jpg 640 478 15 96 67 292 275 56 1 232 81 392 32 448 269 528 346 67 381 343 519 402 41 176 377 298 459 41 303 290 431 407 64 77 375 179 432 66 135 136 333 342 73 5 109 31 144 73 0 42 34 76 73 272 0 400 41 73 190 1 259 24 73 286 0 405 26 73 254 63 368 131 73 0 159 48 216 73 28 93 53 113 73 189 0 286 43 76 282 230 351 305 0 22 0 194 207 62 335 0 453 293 +1189 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490702.jpg 640 428 15 334 110 605 422 15 0 12 248 421 +1190 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387383.jpg 640 480 15 69 108 639 473 59 0 112 640 477 +1191 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056541.jpg 640 458 15 77 115 477 398 56 349 103 428 283 56 219 0 296 128 56 410 120 452 278 60 334 114 454 275 +1192 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191169.jpg 426 640 15 70 121 255 403 0 143 72 356 536 16 320 396 425 479 +1193 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054603.jpg 640 419 15 311 268 408 308 +1194 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187236.jpg 640 480 15 296 46 569 227 15 0 221 412 473 56 4 101 79 229 57 110 0 639 407 +1195 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476856.jpg 640 480 15 154 9 639 479 67 60 375 210 431 41 201 314 372 479 +1196 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274292.jpg 640 436 15 1 20 404 429 15 302 13 639 430 +1197 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073467.jpg 500 311 15 209 135 396 244 63 164 64 338 252 63 282 82 391 136 64 429 204 463 227 73 0 272 125 310 +1198 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434580.jpg 640 480 15 352 170 597 367 57 1 10 639 471 0 47 65 637 399 63 293 135 473 325 +1199 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422424.jpg 640 427 15 150 140 583 371 39 470 19 539 202 62 0 1 250 160 +1200 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306855.jpg 640 480 15 182 142 552 360 56 0 59 372 474 +1201 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318837.jpg 640 480 15 84 262 453 452 28 378 4 636 344 28 32 108 403 370 28 8 3 450 159 +1202 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481398.jpg 429 640 15 0 440 260 633 +1203 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501229.jpg 640 480 15 78 76 565 403 51 290 259 314 326 +1204 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290659.jpg 640 519 15 239 37 543 443 57 227 379 639 518 56 0 232 254 518 56 227 384 639 518 +1205 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566644.jpg 640 415 15 160 133 411 311 49 596 174 627 200 49 624 158 639 187 49 573 189 600 202 63 171 91 531 389 47 599 185 639 210 56 0 61 243 278 60 6 171 639 409 +1206 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066355.jpg 640 424 15 276 37 465 165 59 0 129 638 418 73 121 202 210 289 73 255 300 346 393 73 112 290 216 363 77 271 244 360 310 73 352 225 445 288 73 2 271 98 371 73 336 313 438 382 73 535 242 632 317 73 444 251 495 291 73 161 276 205 306 73 236 227 326 304 73 234 200 312 235 73 324 153 382 204 73 386 363 436 399 73 1 108 639 409 +1207 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181449.jpg 640 480 15 291 4 614 474 65 227 93 313 417 67 115 170 215 401 +1208 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518324.jpg 500 375 15 149 51 366 356 39 364 120 409 308 39 223 0 252 55 67 100 1 145 26 63 47 5 226 235 64 102 240 165 277 65 109 15 178 40 76 309 181 372 306 56 0 246 41 309 57 250 0 499 355 58 0 0 62 125 73 432 31 495 66 41 303 117 409 316 +1209 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405306.jpg 640 417 15 11 1 639 411 59 0 234 493 416 +1210 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112388.jpg 640 426 15 204 92 457 413 57 1 164 478 425 +1211 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086136.jpg 412 500 15 6 1 411 335 +1212 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268885.jpg 640 513 15 6 0 438 312 15 263 7 637 327 66 2 284 639 512 73 1 10 173 75 +1213 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491985.jpg 500 375 15 90 88 499 360 59 0 96 499 367 +1214 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122458.jpg 640 470 15 2 110 398 469 +1215 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545475.jpg 640 426 15 200 14 532 195 +1216 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505945.jpg 426 640 15 1 375 334 631 0 280 278 305 331 0 314 262 353 318 0 233 288 275 334 0 193 270 231 332 15 128 317 246 431 +1217 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366199.jpg 640 427 15 237 171 414 251 59 0 221 637 412 +1218 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303550.jpg 500 348 15 65 14 432 338 59 0 38 154 340 59 0 0 500 342 41 211 45 311 155 45 292 72 482 222 +1219 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485139.jpg 640 480 15 39 33 579 352 63 105 275 596 451 73 38 111 72 118 73 8 90 64 115 73 1 37 127 69 73 16 153 60 166 73 5 78 59 88 73 11 119 71 130 73 14 130 66 141 73 4 60 128 81 +1220 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228746.jpg 640 480 15 91 112 454 473 +1221 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418275.jpg 375 500 15 6 95 262 204 39 166 366 366 439 0 141 50 374 270 59 0 312 371 492 +1222 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438985.jpg 500 375 15 125 87 404 219 28 23 150 316 275 28 0 246 343 369 +1223 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472762.jpg 640 464 15 251 183 477 297 +1224 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104494.jpg 640 459 15 388 197 499 271 2 33 84 152 206 2 329 85 370 109 46 35 379 190 439 46 62 356 180 409 46 104 344 258 431 46 163 344 211 361 73 475 366 598 421 0 39 133 85 286 60 214 403 380 458 73 478 166 509 201 73 481 163 510 170 73 521 169 553 195 73 417 161 449 200 73 587 173 622 195 73 423 144 450 155 +1225 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188667.jpg 640 572 15 34 51 479 561 +1226 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388009.jpg 640 480 15 0 3 343 457 +1227 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549410.jpg 500 374 15 0 69 476 276 73 331 307 397 369 +1228 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250924.jpg 500 375 15 0 0 500 370 73 188 174 277 194 73 222 48 248 153 73 183 251 271 277 73 183 193 279 206 73 186 232 280 256 73 264 23 276 153 73 255 23 273 158 73 248 40 259 152 73 199 54 216 154 73 173 38 221 155 73 187 222 278 234 73 210 55 225 155 73 181 204 278 213 73 142 0 311 374 +1229 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028273.jpg 640 480 15 163 107 557 388 26 36 0 639 480 +1230 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215394.jpg 640 480 15 146 86 504 240 +1231 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197528.jpg 480 640 15 128 116 390 637 +1232 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364429.jpg 500 375 15 1 86 355 262 +1233 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180830.jpg 640 640 15 436 391 598 624 13 267 388 339 437 58 58 484 197 619 75 89 556 161 616 +1234 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121112.jpg 640 433 15 288 113 616 310 15 19 110 296 306 66 197 303 639 408 73 225 10 292 95 62 495 0 638 222 73 142 72 204 97 73 593 254 639 303 +1235 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229387.jpg 640 481 15 40 181 639 432 59 0 2 640 473 +1236 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071673.jpg 640 427 15 130 145 515 397 46 481 67 607 266 +1237 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168031.jpg 640 480 15 1 78 371 266 56 76 2 206 76 56 0 2 140 128 69 595 21 639 144 72 298 0 397 149 15 293 31 523 262 +1238 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052290.jpg 640 480 15 4 0 267 474 63 234 43 639 476 62 262 46 639 358 +1239 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361157.jpg 500 439 15 120 4 493 431 39 0 0 144 438 +1240 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102421.jpg 640 461 15 218 72 639 456 26 0 87 362 436 59 0 411 640 460 +1241 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081552.jpg 500 333 15 206 78 317 159 57 1 1 499 329 +1242 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259112.jpg 640 393 15 111 85 522 278 59 19 16 619 355 +1243 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320078.jpg 500 375 15 16 78 481 276 56 31 0 499 374 +1244 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292931.jpg 640 480 15 158 143 543 454 15 79 29 420 414 45 35 5 574 474 59 0 0 640 480 +1245 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249599.jpg 640 480 15 3 201 576 477 56 256 42 520 222 41 293 117 488 479 +1246 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031176.jpg 640 390 15 329 181 457 350 +1247 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273728.jpg 640 425 17 0 286 639 420 0 206 9 448 424 0 0 332 86 424 0 81 337 126 354 0 492 318 505 328 0 0 306 42 391 0 119 324 158 356 0 445 332 481 373 0 508 306 527 323 0 164 293 217 361 0 405 301 423 320 0 473 334 495 355 0 458 294 471 320 0 134 302 465 341 +1248 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139140.jpg 427 640 17 0 239 425 633 0 0 33 263 485 0 0 191 80 330 0 250 218 289 277 0 189 203 260 282 7 246 1 423 312 0 46 207 90 295 +1249 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318645.jpg 640 480 17 461 248 531 325 19 47 265 104 331 19 143 267 215 322 +1250 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324776.jpg 640 424 17 282 153 501 316 0 359 91 430 292 +1251 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423715.jpg 640 480 17 263 163 578 298 0 2 76 288 479 0 267 159 331 394 0 339 118 639 473 0 0 170 33 242 56 256 118 262 121 56 263 119 270 122 56 273 118 280 121 56 281 119 287 122 56 281 122 288 124 56 297 122 302 125 56 311 122 319 126 56 291 126 297 128 56 307 126 315 128 56 318 122 325 125 56 339 126 346 128 0 507 170 518 182 0 532 172 542 182 0 322 164 330 176 0 244 105 251 127 0 593 169 608 181 0 195 119 204 127 0 334 168 341 176 0 364 170 373 178 56 258 122 265 127 56 277 126 283 128 0 1 0 639 212 56 260 107 589 132 +1252 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005178.jpg 640 528 17 310 289 372 442 19 66 15 105 89 19 149 94 241 232 19 428 42 505 143 0 286 152 387 276 0 301 204 391 337 17 150 94 241 234 +1253 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061171.jpg 640 480 17 1 84 280 409 19 334 16 637 294 19 321 1 471 184 19 277 0 360 84 19 372 9 629 145 19 441 134 639 460 19 120 2 325 215 +1254 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441009.jpg 427 640 17 0 279 427 633 0 223 5 426 567 0 129 31 268 265 0 59 68 195 289 2 0 145 66 228 17 378 288 426 359 17 347 219 426 263 17 345 175 426 242 17 2 235 75 297 17 0 220 52 250 0 55 110 95 200 17 358 233 426 293 +1255 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141634.jpg 640 504 17 190 68 483 446 0 314 77 634 498 0 4 62 259 501 27 120 205 174 410 26 495 329 571 424 27 420 270 487 387 +1256 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094055.jpg 640 400 17 248 123 590 394 17 20 162 262 393 0 243 57 375 359 0 43 47 258 392 0 320 257 456 395 0 611 146 639 228 0 0 206 66 391 0 471 232 560 392 0 536 231 639 392 0 344 244 460 399 +1257 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494620.jpg 640 489 17 61 145 571 488 0 230 41 377 351 +1258 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537954.jpg 500 497 17 302 120 456 245 19 65 186 141 281 0 214 130 257 259 0 395 95 427 172 +1259 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196355.jpg 640 603 17 75 57 343 602 17 303 137 616 527 0 123 30 231 350 27 390 130 400 156 17 43 217 100 386 0 65 162 124 232 0 346 81 439 360 +1260 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136285.jpg 640 526 17 154 89 632 489 0 371 16 494 285 0 35 72 247 516 +1261 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460129.jpg 640 488 17 196 209 506 487 17 79 167 208 374 17 38 160 110 288 0 224 86 363 390 +1262 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200739.jpg 500 404 17 0 293 72 353 0 443 275 494 350 7 212 264 327 326 2 404 283 463 322 7 403 270 493 320 2 398 323 499 398 2 472 276 499 329 +1263 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002124.jpg 640 480 17 222 191 275 226 17 285 185 331 224 17 198 191 212 225 17 272 192 284 225 19 217 189 288 225 0 293 162 314 184 0 461 217 468 225 0 502 219 509 229 0 523 222 528 231 0 543 223 550 235 0 412 236 425 259 7 377 251 599 315 0 501 229 511 241 0 134 209 144 217 0 148 206 159 217 0 634 255 639 261 0 617 254 628 261 17 207 187 243 225 19 199 189 222 225 0 607 248 616 261 0 1 187 631 295 +1264 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255649.jpg 640 478 17 82 98 371 463 17 353 50 607 477 0 234 57 309 293 0 436 7 546 276 0 19 259 113 361 13 0 283 104 362 +1265 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044699.jpg 640 426 18 213 235 308 305 18 437 256 476 317 18 471 253 564 321 18 105 211 216 302 +1266 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190441.jpg 640 480 18 454 268 597 417 18 39 301 130 430 18 59 277 176 371 18 203 237 291 312 18 238 187 287 252 18 332 226 431 305 18 285 261 365 342 18 269 283 356 438 18 345 180 393 241 18 436 159 480 222 18 162 307 271 427 18 599 195 639 273 18 509 166 579 247 18 522 156 584 203 +1267 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547383.jpg 640 426 18 134 174 587 407 18 100 32 446 215 18 493 1 589 10 +1268 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001554.jpg 640 427 18 157 207 288 411 18 348 166 456 404 18 236 247 384 417 0 421 24 488 243 0 516 11 574 258 0 398 2 449 228 0 490 22 532 95 25 518 0 603 69 7 179 0 502 142 0 553 28 607 270 0 596 28 639 233 26 437 113 483 160 26 521 121 558 155 +1269 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203299.jpg 429 640 18 35 391 323 561 18 306 443 360 541 +1270 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541991.jpg 640 480 18 243 227 316 347 +1271 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435206.jpg 640 427 18 382 167 386 178 19 301 157 328 183 19 426 147 439 165 8 205 159 260 168 0 424 199 452 274 0 344 195 370 240 0 302 187 319 238 19 338 146 360 162 19 352 137 365 146 19 365 135 381 145 19 316 146 338 156 19 449 144 458 149 20 238 147 255 158 19 294 142 304 156 19 239 148 255 159 +1272 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379584.jpg 640 428 18 55 98 291 417 18 197 108 639 422 +1273 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250745.jpg 640 384 18 68 48 355 293 18 356 48 556 350 +1274 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576714.jpg 640 480 18 63 20 568 453 0 28 119 44 154 0 0 116 10 158 0 320 104 343 121 +1275 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176906.jpg 460 500 18 92 288 201 379 18 188 283 263 396 18 25 342 218 471 18 208 341 405 487 18 251 270 358 380 0 365 23 454 418 0 260 104 283 166 13 162 133 237 169 13 0 168 43 206 26 127 157 166 194 7 287 118 345 149 45 201 418 254 441 2 249 127 298 149 0 5 91 108 300 0 113 87 169 248 0 230 105 258 167 +1276 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536486.jpg 480 204 18 229 104 258 171 18 291 105 324 176 18 338 117 372 140 18 394 100 414 119 18 356 117 418 179 18 273 80 304 98 18 210 66 227 75 18 61 90 96 144 18 128 84 157 118 18 197 99 226 149 18 249 100 270 112 18 328 77 353 93 18 369 86 381 101 18 117 71 141 82 18 221 81 237 95 18 199 71 207 76 18 324 131 358 194 18 183 102 199 140 18 0 58 479 195 +1277 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099026.jpg 640 480 18 284 130 465 372 18 23 113 358 425 18 20 134 229 228 18 115 99 270 172 18 443 73 543 283 0 199 0 219 36 0 36 0 79 50 18 522 87 620 251 0 267 0 297 49 18 14 132 148 153 0 236 0 258 35 +1278 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191533.jpg 640 480 18 201 364 228 389 18 503 334 540 362 +1279 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428562.jpg 640 480 18 34 27 450 453 18 455 98 638 409 18 546 1 639 102 18 483 66 560 145 18 198 28 428 166 0 28 2 141 161 0 316 0 351 52 0 214 0 236 63 18 333 354 639 479 26 391 0 422 27 0 281 0 299 58 0 304 0 319 50 18 132 114 206 159 18 226 0 267 32 0 391 0 457 85 +1280 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474384.jpg 640 444 18 270 111 639 438 18 0 0 246 437 18 491 1 637 116 +1281 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272008.jpg 640 480 18 131 183 639 419 +1282 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424633.jpg 640 427 18 132 147 401 365 18 177 214 375 386 +1283 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141517.jpg 640 480 18 329 259 356 294 18 377 252 398 292 18 426 246 446 268 18 227 277 249 303 18 183 262 200 290 18 200 259 228 308 18 228 255 246 277 18 171 264 185 279 18 317 253 334 276 18 560 232 570 242 18 326 245 338 259 18 413 253 420 269 18 514 233 522 241 18 162 251 181 276 18 80 240 93 257 18 94 222 595 270 +1284 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212559.jpg 640 528 18 0 246 407 491 18 405 186 518 253 18 276 154 363 215 18 212 138 290 254 18 512 147 594 192 18 513 100 585 174 18 525 180 616 236 18 585 119 639 195 18 586 104 639 126 18 0 204 30 331 +1285 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375763.jpg 640 480 18 232 217 313 344 18 406 173 477 299 18 288 193 366 304 18 122 196 193 301 18 40 197 124 303 18 63 186 141 282 18 270 179 326 222 18 468 184 541 303 18 184 191 254 300 18 220 184 277 213 18 347 178 423 281 18 161 182 204 210 +1286 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272212.jpg 640 480 19 151 279 233 349 19 493 273 527 306 19 518 272 592 311 +1287 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354242.jpg 640 471 19 239 222 545 470 0 60 208 148 465 +1288 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164568.jpg 640 427 19 345 305 421 351 19 454 314 575 384 19 242 305 348 386 19 43 297 75 338 0 164 301 169 314 0 176 298 181 313 0 157 299 161 312 0 161 304 163 312 +1289 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114907.jpg 640 425 19 192 37 584 289 0 315 74 430 283 0 41 127 116 306 0 0 120 76 300 0 34 334 121 424 0 271 315 369 424 0 242 264 417 418 0 507 379 579 424 0 517 290 558 349 0 346 272 429 399 0 34 258 159 368 0 79 369 161 424 0 151 357 212 424 7 1 1 194 210 0 125 292 193 361 0 0 153 639 424 +1290 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179200.jpg 640 480 19 19 85 236 417 19 124 71 531 333 19 460 34 639 184 19 218 27 378 48 19 143 13 232 48 19 351 19 418 38 19 470 28 580 49 19 459 2 586 35 19 312 14 386 49 19 215 9 310 47 19 402 26 435 51 19 621 23 639 35 +1291 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200667.jpg 640 425 19 179 175 350 318 +1292 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361268.jpg 640 480 19 325 226 533 358 +1293 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409115.jpg 640 480 19 267 189 428 278 +1294 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191919.jpg 640 480 19 151 166 471 335 19 441 188 605 327 19 0 203 158 262 19 622 265 639 303 +1295 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164366.jpg 640 425 19 245 47 564 419 0 31 182 212 417 62 1 122 58 267 62 597 241 639 424 +1296 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027975.jpg 640 480 19 303 325 364 420 2 178 179 269 240 2 123 175 188 225 0 154 179 168 208 0 274 158 284 206 0 507 184 531 211 0 85 138 103 163 3 82 147 109 171 0 108 135 119 155 0 25 141 40 173 1 105 152 136 174 1 127 142 155 160 0 175 174 188 192 0 188 177 200 188 0 168 131 175 148 0 63 157 77 177 1 83 147 110 171 19 206 227 244 274 19 308 208 364 248 19 365 202 408 244 19 96 196 116 234 19 154 212 198 249 3 485 232 552 296 0 462 178 474 196 1 151 163 177 179 1 100 151 128 173 +1297 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400046.jpg 640 360 19 211 54 436 185 19 1 200 27 258 19 31 127 315 264 +1298 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344897.jpg 640 425 19 133 105 300 219 19 329 108 398 225 19 431 161 555 224 19 511 147 594 193 19 385 165 441 214 19 105 106 215 206 19 483 101 525 127 +1299 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419386.jpg 640 512 19 0 56 312 443 19 115 0 511 170 0 276 166 535 447 0 405 159 639 505 0 212 76 397 436 0 546 2 639 207 0 290 0 432 227 0 432 0 533 166 0 213 80 264 134 19 0 0 107 104 0 584 0 639 29 +1300 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192730.jpg 640 424 19 169 246 342 364 19 74 249 179 352 19 172 229 285 255 +1301 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105264.jpg 640 427 19 61 112 355 402 0 396 110 493 323 0 537 181 574 294 0 316 173 361 301 0 482 214 520 279 0 434 197 465 296 0 15 202 61 283 0 0 205 29 279 0 40 255 85 312 +1302 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349616.jpg 640 427 19 302 227 326 256 19 275 227 297 257 19 188 226 203 248 19 250 226 264 249 19 133 231 138 243 19 490 221 523 252 19 272 226 282 255 19 182 233 187 247 19 117 225 127 243 +1303 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380088.jpg 433 640 19 28 291 234 522 0 228 207 361 559 +1304 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430073.jpg 640 480 19 216 186 371 307 56 360 211 395 262 56 501 208 528 271 56 553 207 590 256 56 571 247 639 313 56 439 229 483 288 56 469 191 483 206 56 509 252 573 320 60 290 196 401 251 0 0 192 61 444 0 230 113 245 146 0 496 206 556 308 0 56 163 141 401 26 148 134 158 155 41 362 157 367 164 41 386 157 392 166 0 179 128 200 184 0 116 122 139 178 0 450 201 501 288 0 547 205 635 296 0 194 117 210 170 0 399 156 443 259 0 257 123 279 147 3 0 153 24 185 41 410 158 415 168 0 162 178 201 217 26 134 137 142 156 0 140 119 272 181 +1305 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575624.jpg 640 427 19 209 275 296 308 19 343 267 387 288 19 335 286 409 309 19 212 276 359 303 19 469 283 515 296 19 513 284 524 296 +1306 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314616.jpg 612 612 19 136 261 287 562 19 475 256 567 383 19 0 291 32 471 19 397 256 471 425 +1307 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033561.jpg 640 480 19 19 285 74 333 19 59 276 89 310 19 90 260 102 279 19 513 269 534 282 19 415 263 436 276 19 438 265 451 278 19 288 251 306 261 19 188 340 253 420 19 179 273 220 303 19 143 265 186 301 19 61 261 94 277 19 118 271 156 296 19 403 261 421 274 19 133 235 561 278 +1308 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376358.jpg 640 480 19 128 132 523 437 +1309 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125072.jpg 640 314 19 184 195 208 210 19 136 197 154 206 19 88 196 110 211 19 223 196 250 211 19 47 201 61 212 19 8 196 31 209 +1310 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307206.jpg 640 480 19 304 293 419 344 19 399 289 461 332 19 405 289 480 314 19 271 278 345 329 19 266 277 314 303 19 239 276 275 297 19 269 266 318 294 19 370 294 396 303 19 336 282 370 305 +1311 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377355.jpg 640 363 19 11 181 142 352 19 283 146 527 354 19 469 222 521 275 +1312 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218220.jpg 480 640 19 212 299 479 609 19 0 163 316 632 19 309 150 391 197 19 329 182 404 226 19 270 274 479 504 19 387 171 414 198 19 284 194 338 246 +1313 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540372.jpg 500 333 19 168 133 310 267 0 304 70 311 91 0 372 99 380 114 0 313 81 323 96 0 347 94 357 113 0 20 103 26 122 0 364 101 371 113 2 182 87 227 106 2 250 96 293 116 0 395 98 405 116 +1314 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075713.jpg 428 500 19 103 69 342 493 19 12 134 142 220 25 9 70 54 99 25 151 58 193 78 25 361 75 427 126 0 244 25 414 492 0 215 45 244 101 0 241 45 268 89 0 44 78 80 119 0 157 66 184 101 26 159 93 176 103 26 69 113 87 139 26 8 106 20 116 27 287 97 306 114 56 3 79 17 91 56 75 77 97 102 56 100 78 123 102 56 183 104 205 113 56 0 163 12 172 56 0 134 11 149 56 11 134 27 151 56 0 119 20 130 56 45 118 69 133 0 21 80 56 127 0 4 86 26 115 0 19 118 47 155 0 180 64 214 111 0 122 114 140 137 0 163 112 174 125 19 383 134 427 230 56 123 77 145 103 56 215 89 236 100 56 206 101 233 113 0 400 105 423 138 0 385 127 404 155 56 239 87 260 98 0 70 56 427 151 56 0 76 254 197 +1315 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186413.jpg 640 427 19 382 240 570 321 19 392 326 444 351 19 494 326 544 350 19 172 339 279 377 +1316 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052575.jpg 640 428 19 2 189 326 422 19 526 141 639 410 19 456 87 565 198 19 318 82 419 150 19 400 111 451 137 19 136 106 163 120 19 425 126 460 148 19 243 94 327 185 19 149 101 163 108 +1317 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300008.jpg 640 480 19 282 172 508 353 19 87 198 173 237 25 131 171 147 175 0 75 137 104 214 0 101 129 130 203 0 163 162 175 202 0 234 178 239 192 0 212 171 217 183 0 247 175 257 199 0 175 161 189 203 0 223 174 227 184 25 11 160 39 180 25 148 172 156 175 25 63 158 76 165 0 42 164 62 193 0 14 170 20 182 0 126 174 131 183 25 0 163 14 171 25 155 171 163 175 25 125 171 131 175 25 12 167 37 177 25 64 175 73 179 25 63 170 76 175 25 102 167 107 175 25 68 165 78 169 0 142 179 145 184 0 75 171 80 182 0 33 154 230 190 +1318 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223314.jpg 640 406 19 361 150 533 235 19 165 109 214 131 19 241 183 340 269 +1319 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221155.jpg 640 512 19 136 343 245 432 19 345 342 496 462 +1320 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108380.jpg 640 480 19 226 209 331 294 19 129 210 238 360 +1321 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518213.jpg 640 480 19 55 115 487 418 19 0 118 20 148 +1322 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442223.jpg 640 429 19 143 314 246 406 19 151 299 275 396 0 351 299 390 421 0 509 296 559 410 3 314 334 437 417 3 221 331 316 402 0 604 307 618 325 0 566 312 569 317 0 581 307 599 358 0 554 331 583 361 0 603 298 633 423 +1323 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213961.jpg 640 480 19 311 196 404 260 19 429 207 451 244 +1324 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244167.jpg 640 480 19 293 185 468 457 0 38 152 48 181 0 5 155 14 182 +1325 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190767.jpg 640 451 19 45 338 63 363 19 63 340 92 360 19 318 334 342 359 19 340 335 380 358 19 415 332 456 356 +1326 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000464390.jpg 640 480 19 360 299 453 447 23 188 99 363 368 +1327 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343504.jpg 640 480 19 77 81 544 442 2 1 227 116 339 3 552 263 636 357 0 552 170 639 323 1 159 264 277 309 1 314 293 341 308 0 35 238 57 260 0 175 272 200 306 0 223 260 234 279 0 595 167 639 283 +1328 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277694.jpg 612 612 19 80 126 525 263 3 9 19 83 270 3 408 21 608 489 19 6 193 540 608 +1329 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573067.jpg 640 477 19 163 219 617 469 +1330 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572408.jpg 424 640 19 96 240 302 467 19 34 442 243 544 19 287 223 315 259 19 230 229 259 253 18 104 248 284 462 +1331 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451440.jpg 640 480 56 0 216 295 479 60 245 51 639 473 41 500 244 577 336 63 217 10 418 105 15 88 172 234 417 +1332 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226917.jpg 480 360 57 27 160 478 355 0 131 102 355 270 +1333 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204256.jpg 500 375 57 0 0 499 342 67 294 278 359 351 73 0 199 199 367 26 84 4 451 214 73 342 229 490 364 +1334 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533434.jpg 427 640 1 243 542 263 582 2 180 542 226 584 0 124 530 134 564 0 105 528 114 556 0 94 531 106 558 0 87 527 95 555 12 23 549 40 587 0 48 523 55 536 0 132 528 147 575 0 226 534 242 573 0 409 527 426 590 0 55 525 64 552 0 31 524 39 549 12 309 545 315 562 12 251 542 256 554 12 417 550 425 568 12 55 533 59 542 0 22 524 28 548 0 115 530 121 557 2 0 527 17 554 0 10 524 17 537 12 153 572 179 632 0 39 507 117 557 +1335 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373060.jpg 640 480 1 124 388 174 437 2 355 315 479 387 2 301 312 376 357 2 217 310 258 341 2 253 312 307 346 3 200 322 209 337 5 401 276 513 303 1 62 370 85 409 1 169 350 207 435 26 93 346 124 417 0 79 321 144 478 0 0 325 24 433 0 11 315 28 365 0 50 309 68 354 2 169 297 217 310 2 373 307 439 326 2 298 312 316 328 2 153 277 162 284 9 485 241 502 246 26 79 312 82 316 28 0 398 33 478 0 85 303 92 322 0 133 306 140 329 0 188 306 196 333 0 163 310 174 335 0 175 307 183 328 0 182 309 188 334 0 212 303 223 329 1 44 370 68 405 1 42 354 60 379 2 228 288 238 297 26 61 331 71 337 74 360 215 401 265 0 6 306 22 343 2 224 286 235 298 7 482 287 637 372 1 141 354 169 387 0 30 314 46 356 26 42 333 46 341 0 19 272 497 359 +1336 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185472.jpg 640 480 1 426 241 488 368 6 371 120 484 229 0 446 157 551 357 24 619 252 639 340 0 409 156 429 168 0 588 139 639 306 24 590 263 620 307 1 619 313 639 342 0 594 348 639 471 +1337 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050145.jpg 480 320 1 152 220 371 315 0 203 91 378 318 0 176 161 219 225 0 360 154 387 209 25 176 144 248 164 24 182 186 206 228 1 348 178 387 238 1 243 196 277 230 25 425 143 471 166 0 470 157 480 188 1 390 185 410 210 +1338 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011197.jpg 640 427 1 553 162 600 190 2 400 153 485 193 2 172 143 212 167 0 309 112 362 253 0 17 112 44 185 0 567 146 589 190 9 179 68 187 86 9 248 19 284 57 9 219 73 229 90 0 302 119 313 130 9 89 95 95 105 9 42 94 49 109 24 4 140 23 173 9 558 106 571 115 24 578 152 594 166 0 300 128 319 244 +1339 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301746.jpg 640 480 1 460 311 639 472 1 235 271 333 337 0 522 167 639 440 0 236 201 293 334 11 562 155 598 190 9 556 130 604 147 +1340 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233727.jpg 640 427 1 610 224 639 256 1 528 221 556 263 5 81 83 458 328 0 581 200 614 279 0 24 209 34 226 0 36 213 45 240 1 553 215 579 264 0 504 221 533 282 0 474 218 499 286 1 570 220 591 261 1 494 223 505 260 1 492 212 508 227 1 480 213 493 222 1 454 223 479 257 0 517 200 526 212 0 205 185 233 233 0 532 197 541 217 0 360 179 396 215 +1341 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228011.jpg 640 480 1 529 219 542 277 1 208 224 236 273 1 104 241 124 272 3 382 231 525 312 3 169 211 214 280 3 111 215 172 276 0 420 194 462 313 0 480 176 533 344 0 136 192 175 283 0 0 182 16 278 3 553 216 608 303 67 146 201 147 203 1 552 225 607 303 0 3 183 91 407 0 206 49 226 91 3 403 220 478 250 3 219 229 238 275 19 236 213 411 318 0 480 174 523 278 +1342 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537620.jpg 356 500 1 257 332 328 450 1 182 329 325 483 1 119 333 195 478 3 31 314 130 456 3 310 322 355 437 0 230 283 266 345 0 336 283 355 329 +1343 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116667.jpg 640 487 2 146 379 589 486 5 0 152 235 475 2 614 450 638 485 +1344 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081287.jpg 640 480 2 424 376 639 475 2 0 243 75 306 5 60 67 639 416 6 71 140 639 407 2 634 271 639 285 +1345 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508985.jpg 640 538 2 248 228 340 321 3 137 357 209 529 3 192 282 247 351 2 318 214 357 249 2 244 210 294 255 7 448 201 587 354 7 48 162 147 267 7 292 201 332 232 0 192 231 246 289 0 119 257 224 471 0 193 233 217 276 0 165 217 202 254 0 201 212 220 233 0 153 208 165 238 2 376 222 471 292 2 363 213 396 237 2 226 210 251 234 2 426 214 472 234 2 374 217 425 248 5 222 190 253 223 0 242 197 245 202 0 200 211 209 227 0 510 221 526 240 0 407 231 415 238 0 267 244 281 257 0 190 215 203 242 2 268 206 281 210 3 169 250 198 266 0 437 232 457 245 +1346 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104893.jpg 640 435 2 27 231 60 247 6 180 233 431 429 0 397 329 419 352 5 83 214 104 231 74 11 177 18 185 74 27 178 32 185 +1347 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450458.jpg 640 554 2 1 333 322 522 6 0 67 526 449 0 114 341 166 374 0 28 269 37 278 +1348 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006789.jpg 640 424 2 265 376 476 418 2 275 370 359 407 6 81 258 639 326 0 360 393 384 411 2 469 372 539 410 2 533 366 639 415 7 534 367 637 417 +1349 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057149.jpg 640 427 2 269 269 467 420 6 118 213 516 304 5 323 234 407 271 9 363 144 390 160 9 262 172 294 182 2 333 263 408 273 +1350 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355441.jpg 640 477 2 204 288 284 334 2 143 288 216 331 2 283 285 335 319 2 327 284 358 315 2 202 279 241 300 2 272 283 297 304 5 356 251 453 322 5 6 251 175 332 0 577 278 594 320 5 263 264 333 284 0 125 278 135 292 9 452 247 456 252 2 250 283 274 290 2 338 278 360 293 9 555 223 575 244 +1351 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097080.jpg 640 392 2 568 203 583 213 6 135 160 394 292 9 109 190 113 198 13 574 253 639 279 13 525 233 571 262 2 567 215 596 229 2 532 214 560 230 +1352 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571584.jpg 640 427 2 72 209 132 231 5 213 112 480 296 0 406 171 442 202 75 612 96 617 102 75 592 96 596 101 +1353 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127520.jpg 480 640 2 332 285 479 442 5 50 237 369 367 0 119 299 176 434 0 425 309 454 339 2 449 281 466 288 5 377 271 394 291 5 390 272 411 292 +1354 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097868.jpg 480 640 2 205 118 303 186 2 1 142 57 228 2 292 137 331 179 2 324 143 360 176 10 176 223 381 593 2 360 148 376 173 7 59 100 223 201 +1355 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279521.jpg 640 338 2 558 162 604 190 2 629 133 639 151 2 559 138 598 176 6 0 0 560 299 0 296 69 364 308 0 349 63 392 307 5 1 2 562 272 26 48 95 123 204 0 18 57 121 312 24 53 125 123 207 +1356 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368648.jpg 640 480 2 162 351 267 409 2 115 352 178 403 5 106 261 375 394 0 45 337 56 365 2 620 362 639 391 9 526 287 542 306 0 323 320 337 335 +1357 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212346.jpg 640 480 2 555 243 639 288 5 38 11 592 466 +1358 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276720.jpg 640 480 2 276 281 310 316 2 243 279 268 299 2 206 280 219 292 7 276 281 311 315 7 243 278 268 300 +1359 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036522.jpg 640 427 2 147 183 215 216 2 43 178 148 270 5 211 59 639 267 0 154 185 182 261 0 304 168 341 230 0 59 178 88 282 24 327 245 351 270 26 155 199 173 225 28 339 222 366 258 28 308 228 335 268 0 133 181 153 216 0 130 181 137 196 28 86 222 116 233 +1360 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133999.jpg 640 424 2 325 289 396 322 2 16 297 41 321 5 66 211 292 330 5 392 241 609 324 0 554 261 565 270 0 363 293 371 302 0 606 272 617 302 0 614 272 617 299 0 487 265 496 274 0 400 265 414 280 2 621 276 639 305 0 526 259 547 272 +1361 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534639.jpg 640 475 2 24 199 48 221 6 12 29 529 448 6 529 179 625 241 9 617 176 623 194 9 547 89 568 125 +1362 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356612.jpg 640 416 2 201 187 323 286 2 283 164 318 202 5 0 130 251 223 0 554 168 613 278 0 528 169 565 273 1 505 211 614 329 7 310 99 525 308 0 63 157 75 173 0 57 158 63 174 19 224 199 282 299 19 140 194 205 312 19 59 193 134 314 19 317 196 401 340 19 202 183 220 212 19 404 202 483 336 19 51 186 117 262 0 376 144 410 181 0 446 150 494 187 0 22 162 29 175 19 112 202 155 306 19 241 179 260 190 +1363 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177149.jpg 640 480 2 114 271 126 296 2 114 268 133 290 3 173 276 185 290 3 587 306 616 382 7 266 185 566 356 0 154 378 186 452 0 189 354 270 453 0 418 277 458 406 0 462 262 523 421 0 513 281 576 454 0 127 276 149 346 0 172 266 183 285 0 92 316 127 370 0 48 318 79 395 0 90 286 133 358 0 0 378 66 457 0 72 304 94 378 0 545 259 568 308 2 45 335 51 358 0 17 165 639 459 +1364 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236010.jpg 640 351 2 191 202 219 220 2 206 201 226 216 2 417 186 434 206 5 240 146 379 292 +1365 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548126.jpg 640 427 2 547 205 621 246 5 148 131 529 288 11 318 192 337 215 +1366 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502895.jpg 640 426 2 620 336 639 358 2 0 284 30 343 6 102 18 587 417 2 593 325 626 350 2 33 291 62 305 2 609 324 639 351 +1367 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423617.jpg 640 480 2 126 289 264 400 2 408 341 564 465 3 14 80 32 106 5 150 118 442 339 5 50 42 204 201 0 15 61 32 99 2 336 467 454 480 0 120 116 143 137 0 323 247 343 270 0 159 313 188 338 0 451 368 485 390 2 0 153 56 221 +1368 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067178.jpg 640 433 2 447 260 503 298 5 139 96 466 390 0 12 280 27 313 0 617 244 639 291 0 607 243 631 289 0 26 292 44 343 26 623 260 632 269 0 267 268 283 280 0 208 264 228 281 0 183 182 193 196 0 169 185 179 201 0 287 136 308 160 0 337 230 374 282 0 300 264 307 277 +1369 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315621.jpg 640 427 2 326 185 362 214 3 103 201 241 418 0 376 185 384 216 0 389 185 399 214 0 363 185 369 197 +1370 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081394.jpg 640 480 2 618 147 639 178 3 532 172 633 224 3 521 201 542 246 0 547 152 568 183 7 84 19 524 435 3 611 179 639 220 +1371 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194158.jpg 640 437 2 0 234 69 436 5 50 22 560 410 0 218 73 256 103 0 184 63 219 109 0 234 62 289 101 0 286 61 315 94 0 587 291 625 400 0 314 77 532 317 24 599 308 625 352 0 214 75 229 104 0 124 172 171 386 +1372 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087489.jpg 640 424 2 70 255 303 373 2 619 258 639 329 2 610 254 633 308 5 294 56 639 374 0 174 199 241 409 67 211 216 218 226 +1373 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319654.jpg 500 333 3 374 217 391 240 0 203 189 251 299 0 369 189 392 229 0 325 186 341 237 0 462 186 474 204 0 443 187 461 238 0 428 189 443 233 7 397 178 430 211 10 461 223 472 249 26 438 196 443 210 0 457 188 466 222 0 22 192 28 212 56 306 205 324 230 0 462 189 491 253 +1374 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297956.jpg 480 360 3 316 246 401 293 0 340 220 379 286 11 114 65 233 179 +1375 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035966.jpg 640 426 3 524 242 638 332 0 33 189 99 357 0 137 213 160 302 0 542 217 601 269 0 586 197 604 251 0 539 208 566 238 0 21 222 40 262 0 89 213 104 241 0 566 209 579 230 0 213 123 273 179 7 156 63 489 389 0 91 226 107 266 0 137 213 148 233 1 40 286 98 406 1 622 306 639 368 74 88 278 96 281 0 23 225 34 241 1 97 249 130 298 +1376 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343059.jpg 640 480 5 1 211 623 368 1 359 164 397 206 1 434 161 469 207 1 401 153 457 238 1 455 154 494 207 1 514 166 555 203 1 497 169 546 207 1 502 166 532 200 1 477 151 512 204 1 367 163 407 208 1 469 162 502 206 1 485 174 521 204 1 387 156 431 208 1 173 168 233 213 1 183 150 524 216 +1377 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157465.jpg 640 400 5 69 111 385 274 5 362 119 581 279 7 0 188 75 279 +1378 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121503.jpg 640 490 5 80 150 624 410 0 79 265 111 361 0 31 267 61 350 0 13 264 40 347 0 60 267 84 359 0 489 204 560 261 25 0 246 45 276 24 79 276 100 311 24 60 281 75 308 0 150 254 172 291 0 0 280 12 320 +1379 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352481.jpg 640 427 5 103 159 625 342 +1380 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358750.jpg 640 480 5 84 47 560 438 +1381 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370602.jpg 480 640 5 2 96 217 494 0 311 242 463 559 0 271 220 290 268 0 201 261 279 460 0 273 237 347 451 0 398 234 463 321 0 299 214 317 239 0 326 211 340 247 0 249 224 283 296 0 393 227 423 273 2 220 216 256 248 2 312 219 327 231 2 239 211 299 231 2 428 201 439 215 2 335 215 349 227 26 263 370 288 437 26 409 247 424 273 0 351 230 376 288 0 356 215 381 244 2 321 209 360 219 2 421 202 440 215 2 437 201 464 219 0 313 233 344 273 0 335 223 357 281 0 227 201 467 265 +1382 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137993.jpg 640 427 5 92 45 327 140 0 85 81 131 237 24 0 96 48 146 24 78 105 121 143 0 408 107 424 128 0 224 96 239 120 0 569 127 573 133 0 37 62 77 186 0 242 105 249 117 0 268 99 275 112 0 577 125 587 133 28 78 176 129 233 28 3 190 84 266 0 559 123 566 133 0 248 100 257 113 +1383 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249219.jpg 640 479 5 92 184 518 456 +1384 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147409.jpg 640 427 5 19 48 637 288 0 63 159 105 197 39 495 57 577 223 +1385 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338428.jpg 640 366 5 0 0 222 185 7 55 11 596 324 7 564 93 639 160 7 549 82 639 117 +1386 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044269.jpg 640 480 5 129 113 590 386 0 575 216 639 412 0 550 254 583 352 0 535 256 567 330 0 180 221 240 272 0 356 220 375 268 0 470 237 486 266 0 478 241 488 268 0 427 225 442 247 26 551 272 571 303 26 611 241 639 327 26 357 235 368 254 26 607 260 627 299 0 281 225 302 277 0 364 220 388 271 67 599 258 605 264 +1387 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424155.jpg 373 500 5 1 35 125 439 0 146 239 179 314 0 178 246 207 314 5 248 57 372 436 0 213 213 229 248 13 174 252 209 293 13 205 289 216 293 0 203 247 252 323 24 123 297 140 322 +1388 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124128.jpg 480 640 5 31 560 69 602 0 215 527 242 592 0 195 556 217 606 2 7 587 47 601 0 240 562 247 592 +1389 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204036.jpg 640 480 5 44 30 301 273 7 0 251 115 433 0 9 0 26 30 0 46 51 54 65 +1390 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562805.jpg 640 427 5 253 187 471 287 5 526 196 619 275 5 470 199 527 256 0 327 232 356 310 0 346 230 370 314 0 94 230 108 255 0 402 234 430 325 0 117 219 134 269 0 370 235 405 318 0 23 218 32 236 24 402 250 420 277 0 0 212 8 239 0 18 218 26 236 24 369 248 389 280 0 73 231 89 254 +1391 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440043.jpg 470 640 5 4 14 439 616 5 4 134 74 489 +1392 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299074.jpg 640 480 5 10 16 607 448 0 244 154 305 234 67 275 175 281 181 +1393 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241517.jpg 640 480 5 68 124 504 367 0 315 210 340 248 0 384 216 432 258 +1394 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491965.jpg 612 612 5 339 225 611 532 0 474 333 515 392 +1395 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021644.jpg 640 480 5 108 208 348 285 5 346 222 396 280 5 417 223 527 299 5 0 203 115 261 5 519 207 586 346 +1396 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254653.jpg 640 427 5 77 91 590 327 2 0 215 76 245 2 591 214 604 227 +1397 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082846.jpg 640 454 5 83 171 560 442 11 59 176 72 192 11 47 184 65 205 +1398 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244344.jpg 640 428 5 2 0 458 353 13 465 152 515 171 +1399 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400202.jpg 640 428 5 343 226 403 352 0 129 297 144 339 0 0 323 12 377 0 34 308 56 354 0 58 306 75 343 0 74 301 91 345 0 200 280 210 307 0 191 283 201 311 0 177 284 184 310 0 540 303 550 325 0 323 264 327 278 7 442 258 529 317 5 396 229 469 293 9 308 258 313 271 9 335 248 339 252 9 231 257 235 270 0 571 305 583 346 0 590 311 610 361 0 92 240 573 333 +1400 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527961.jpg 640 480 5 31 17 540 472 0 488 307 512 412 0 31 329 53 391 26 488 354 500 375 +1401 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390068.jpg 640 360 5 17 3 311 271 26 389 242 421 308 26 569 258 612 328 0 310 114 392 324 0 401 97 515 355 0 478 131 531 293 27 504 160 511 199 0 579 126 610 178 0 511 126 540 164 0 383 133 412 226 0 403 121 434 149 7 17 7 313 269 9 382 93 390 100 9 365 107 373 114 9 323 62 339 77 9 375 63 380 74 5 310 83 352 186 9 409 106 417 113 9 373 119 382 128 9 386 115 401 125 24 526 142 534 162 +1402 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136552.jpg 640 480 5 76 81 568 471 +1403 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355817.jpg 640 480 5 132 131 628 332 0 511 201 595 255 0 411 199 431 236 +1404 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438220.jpg 640 427 6 82 21 638 422 0 0 129 38 420 0 23 154 94 367 26 60 207 98 273 +1405 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112820.jpg 640 360 6 85 146 377 245 6 508 101 525 125 +1406 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546524.jpg 640 425 6 0 143 578 282 +1407 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067704.jpg 640 480 6 1 0 639 374 +1408 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160941.jpg 640 427 6 236 147 519 282 +1409 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161990.jpg 640 427 6 175 97 552 330 +1410 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488664.jpg 629 489 6 10 297 509 412 2 564 364 591 378 2 591 369 603 377 +1411 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113570.jpg 640 427 6 115 75 557 361 +1412 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288799.jpg 640 406 6 0 291 89 400 9 446 172 508 276 9 440 277 479 326 9 450 128 489 172 +1413 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093434.jpg 338 500 6 2 3 337 335 0 156 147 295 404 0 48 127 165 446 24 169 377 259 493 24 45 344 180 499 +1414 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517596.jpg 640 427 6 1 46 615 367 0 606 215 632 309 24 612 271 633 301 0 17 199 25 213 0 32 198 44 218 0 583 219 604 294 0 512 179 523 205 +1415 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559790.jpg 640 424 6 136 122 513 344 6 0 179 141 306 0 243 189 275 224 27 262 209 267 218 0 415 210 422 224 +1416 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554767.jpg 640 428 6 137 148 481 340 6 535 202 639 257 9 476 199 486 211 13 508 251 546 301 13 509 241 530 265 13 505 228 515 244 13 546 258 578 300 13 538 243 555 261 13 504 226 513 238 9 523 201 527 208 +1417 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543676.jpg 426 640 6 0 122 329 428 0 182 199 222 345 0 58 262 94 411 +1418 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283653.jpg 640 480 6 170 133 396 346 0 113 243 159 364 0 381 217 414 300 0 428 213 448 293 0 141 237 168 287 39 115 307 120 325 +1419 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155443.jpg 640 423 6 160 196 375 283 9 208 182 213 189 6 589 201 639 269 +1420 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575428.jpg 640 427 6 1 57 638 340 0 363 103 396 154 27 372 124 380 156 13 410 319 639 426 +1421 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429718.jpg 640 640 6 139 281 356 467 0 170 322 184 349 +1422 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581899.jpg 640 480 6 243 2 635 473 6 0 1 241 473 0 367 207 408 244 56 519 254 575 354 0 326 168 348 312 0 263 195 267 218 +1423 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467990.jpg 640 480 6 40 93 543 395 +1424 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137727.jpg 640 359 6 0 91 573 263 0 230 156 249 195 0 240 185 283 238 28 332 230 352 259 28 299 198 316 221 28 222 231 248 273 0 559 187 578 210 28 254 232 276 268 28 206 236 231 274 28 286 231 307 262 28 246 239 253 268 28 275 239 286 255 2 611 205 624 220 24 431 263 460 295 24 458 262 478 292 28 305 246 318 263 28 389 206 402 221 28 378 204 389 220 28 355 210 367 221 2 582 194 614 222 24 276 253 301 266 28 287 211 297 222 26 459 261 477 292 26 317 248 330 262 24 319 250 329 261 24 330 210 345 222 +1425 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149329.jpg 613 449 6 101 172 484 345 +1426 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080104.jpg 640 480 6 91 184 182 296 0 31 220 42 259 0 302 221 315 256 0 327 221 337 254 0 311 218 319 238 0 348 220 357 243 0 360 221 372 255 0 380 218 386 241 28 334 240 352 257 28 312 245 322 256 28 354 240 367 256 28 322 239 331 256 28 288 238 295 249 28 282 238 288 246 0 364 218 370 229 0 298 218 305 234 0 278 219 287 248 0 337 215 345 242 0 377 242 385 257 0 383 214 394 263 0 296 217 381 257 +1427 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035826.jpg 640 360 6 44 77 607 280 0 262 125 272 144 6 595 142 639 212 +1428 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370929.jpg 640 480 6 268 67 513 369 9 238 198 249 234 9 192 197 196 203 9 116 173 129 200 9 241 146 248 194 9 445 29 500 70 +1429 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087503.jpg 640 425 6 0 51 640 412 +1430 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264013.jpg 640 425 6 3 99 597 337 9 550 49 563 91 9 441 46 456 84 +1431 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101145.jpg 640 425 6 1 126 508 317 +1432 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527558.jpg 640 428 6 257 143 514 181 0 421 212 457 340 0 348 225 363 275 0 297 239 311 263 0 446 224 457 235 0 441 218 460 311 +1433 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448786.jpg 612 612 6 55 66 611 567 +1434 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059009.jpg 333 500 6 143 286 264 468 0 188 340 200 367 +1435 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484225.jpg 640 426 6 0 90 490 327 9 4 183 19 215 +1436 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140686.jpg 640 427 6 48 105 548 295 +1437 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538463.jpg 640 427 6 0 121 182 264 6 116 92 489 321 0 457 175 489 263 0 526 178 546 256 0 508 176 528 253 0 488 178 514 256 0 415 172 445 253 0 436 165 452 195 0 580 202 612 256 0 579 161 602 238 13 578 228 625 295 0 518 166 532 250 0 547 174 563 204 0 441 170 460 236 0 550 165 590 285 0 440 194 455 253 0 408 166 606 259 +1438 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090155.jpg 640 427 6 66 169 521 327 +1439 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337666.jpg 640 360 6 84 58 639 226 +1440 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234928.jpg 640 340 6 20 101 638 320 +1441 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002972.jpg 640 480 6 203 132 426 371 6 418 122 639 411 +1442 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143217.jpg 640 426 6 376 130 639 350 0 5 263 27 321 11 228 230 248 253 74 321 217 338 235 13 250 311 280 325 58 187 301 210 326 58 284 254 378 325 58 209 261 229 291 +1443 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110389.jpg 640 484 6 225 184 478 382 +1444 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047552.jpg 640 360 6 0 100 255 305 0 173 136 197 188 0 178 156 199 186 13 254 165 291 212 +1445 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510343.jpg 640 427 6 76 103 540 341 9 77 91 80 98 +1446 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435742.jpg 640 426 6 68 124 556 314 +1447 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529907.jpg 640 389 6 186 196 340 331 +1448 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125815.jpg 640 480 6 191 133 593 417 0 170 259 180 279 0 80 265 89 277 0 150 263 158 283 0 55 285 73 295 +1449 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418533.jpg 640 362 6 35 123 639 285 6 0 124 64 235 +1450 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093236.jpg 640 423 6 0 62 639 381 +1451 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049075.jpg 640 470 6 168 237 555 377 +1452 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505040.jpg 640 320 6 0 206 512 270 +1453 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440617.jpg 640 480 6 60 190 420 323 9 0 124 21 193 +1454 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190546.jpg 640 425 6 203 152 385 280 13 438 223 486 247 +1455 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547738.jpg 640 428 6 0 0 255 424 0 187 166 210 257 0 180 211 202 402 +1456 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103255.jpg 640 423 6 77 0 639 415 9 10 98 82 128 9 34 163 46 191 +1457 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498392.jpg 640 427 6 215 0 637 419 6 0 1 202 421 0 96 20 234 375 0 475 174 523 342 0 288 136 302 188 0 439 130 452 167 0 394 124 406 149 0 142 144 175 195 0 619 159 638 194 0 503 255 530 335 0 549 107 580 178 67 516 200 521 208 0 236 127 245 152 0 261 129 267 165 +1458 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563641.jpg 640 360 6 115 123 365 320 0 44 215 62 280 0 66 228 80 273 0 93 227 111 276 0 104 224 122 273 0 198 162 215 192 24 87 229 96 246 +1459 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036049.jpg 640 426 6 0 2 540 211 6 524 28 639 145 0 214 145 271 339 0 316 193 367 260 9 298 6 327 86 9 150 52 162 99 +1460 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323758.jpg 640 480 6 220 144 514 474 6 289 135 639 388 +1461 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444879.jpg 640 479 6 187 183 428 362 +1462 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329486.jpg 640 400 6 125 130 574 215 +1463 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067948.jpg 640 425 6 66 130 639 257 +1464 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369675.jpg 640 429 6 2 90 638 412 0 412 173 438 214 0 60 188 87 228 0 507 184 522 210 74 607 128 623 140 0 277 176 298 208 0 325 166 346 223 0 444 175 454 212 +1465 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399567.jpg 640 427 6 75 24 639 403 6 506 156 601 269 +1466 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454561.jpg 480 640 6 2 149 400 632 +1467 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117125.jpg 500 396 6 113 175 498 289 0 381 218 389 239 0 440 224 446 240 +1468 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380698.jpg 640 480 6 222 2 639 479 +1469 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065942.jpg 640 390 6 0 51 638 257 +1470 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368038.jpg 640 317 6 70 17 632 300 +1471 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313057.jpg 640 427 6 83 84 523 346 0 463 212 483 229 +1472 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256003.jpg 640 318 6 132 44 235 162 6 19 60 97 145 7 362 54 468 114 +1473 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236951.jpg 640 444 6 138 107 373 345 0 360 231 385 296 0 386 229 409 297 0 485 224 511 293 0 72 250 96 303 0 47 250 70 304 0 572 238 585 284 0 623 231 639 274 0 463 236 480 286 0 438 232 452 291 0 482 233 495 289 0 516 226 532 282 24 584 248 594 268 0 68 249 74 264 24 437 244 451 259 26 55 257 68 278 0 62 249 70 267 26 87 259 96 278 0 1 175 609 292 +1474 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564934.jpg 640 480 6 175 116 502 397 0 550 192 601 385 0 496 217 533 306 0 604 210 635 341 0 522 220 534 244 0 488 219 497 237 0 534 209 551 256 0 477 223 496 254 0 106 220 125 290 0 125 221 138 269 13 42 249 99 280 0 13 219 30 278 0 173 223 185 274 0 31 225 47 274 0 495 219 509 241 +1475 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567315.jpg 640 427 6 178 91 451 370 +1476 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564129.jpg 640 480 6 1 53 597 417 0 619 195 639 339 0 608 184 639 278 67 606 213 610 217 +1477 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401320.jpg 640 428 6 66 133 614 362 0 579 213 602 282 0 15 218 32 250 13 24 234 52 246 +1478 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361221.jpg 640 441 6 126 186 627 346 9 77 135 154 208 +1479 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482799.jpg 640 427 6 121 145 347 237 +1480 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477623.jpg 640 480 6 97 75 554 429 +1481 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494320.jpg 360 640 6 1 213 358 492 0 6 309 20 325 0 22 270 45 387 0 215 259 219 272 6 260 235 359 364 +1482 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241948.jpg 640 425 6 41 121 639 259 6 0 124 157 238 +1483 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437284.jpg 640 480 6 0 0 639 395 +1484 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562227.jpg 640 480 6 57 220 232 300 +1485 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577924.jpg 640 480 6 291 48 629 472 26 211 243 223 259 0 136 265 158 327 0 207 219 228 285 0 363 120 374 168 0 243 180 270 243 0 257 177 272 228 0 273 161 286 214 0 296 161 312 220 0 323 131 336 186 0 171 222 185 287 0 307 142 319 170 0 224 204 248 259 26 292 198 307 210 26 348 145 357 154 28 311 184 323 191 0 221 212 236 271 0 179 232 200 306 0 230 41 503 221 +1486 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204098.jpg 640 429 6 192 128 468 392 +1487 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441211.jpg 494 640 6 281 161 400 238 2 232 209 271 236 2 216 206 260 232 2 264 216 290 234 +1488 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130663.jpg 640 427 6 37 12 639 266 24 576 233 639 336 0 610 260 639 426 0 489 196 557 408 0 477 172 513 323 0 440 155 494 322 0 508 147 564 231 0 339 162 378 277 0 161 131 246 322 0 243 171 337 378 0 225 153 252 207 0 130 146 176 302 26 214 231 263 289 24 82 153 149 231 0 247 154 285 205 0 372 156 411 276 0 0 158 137 379 0 1 69 425 312 +1489 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161231.jpg 640 480 6 35 164 390 367 6 338 160 539 336 0 129 235 196 401 0 111 315 142 421 0 62 241 97 318 26 136 291 179 335 0 6 247 18 281 0 525 246 550 301 0 14 233 40 322 0 551 239 576 302 28 45 255 55 277 28 53 285 68 306 28 49 277 61 300 0 41 237 52 277 0 53 237 68 277 +1490 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064610.jpg 640 480 6 40 0 639 480 0 0 238 5 260 0 498 182 548 342 0 1 249 3 252 +1491 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452461.jpg 640 473 6 68 166 562 332 0 472 207 502 223 6 0 162 84 337 +1492 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047131.jpg 500 372 6 29 103 499 360 0 316 127 377 231 0 278 124 330 185 0 238 111 279 175 0 204 86 250 132 0 87 83 107 145 0 6 128 40 212 0 256 279 310 365 0 0 141 14 217 0 142 84 157 109 0 118 71 150 142 0 209 199 250 275 +1493 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060859.jpg 640 427 6 70 213 639 295 14 504 174 510 181 +1494 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170194.jpg 640 427 6 295 143 526 225 13 552 334 639 426 +1495 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331667.jpg 640 360 6 0 37 640 352 0 613 201 639 323 28 582 257 626 332 +1496 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006153.jpg 459 640 6 71 250 301 421 +1497 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450695.jpg 640 448 6 112 232 637 430 0 114 291 128 354 0 94 280 112 352 +1498 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402909.jpg 500 375 6 0 277 208 359 13 11 360 110 374 6 370 102 388 179 +1499 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139623.jpg 640 428 6 123 271 510 350 0 390 359 407 371 0 411 359 419 370 0 437 312 444 333 0 183 311 193 333 0 167 312 171 322 0 409 363 415 371 +1500 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085292.jpg 640 427 6 92 114 562 346 +1501 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122039.jpg 640 393 6 148 38 639 348 +1502 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002894.jpg 427 640 6 170 224 248 339 6 0 4 96 632 +1503 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208524.jpg 640 348 6 218 102 639 316 0 358 162 375 179 +1504 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190204.jpg 640 426 6 124 207 456 324 0 417 235 459 294 0 350 228 375 260 0 316 226 339 257 0 386 232 412 262 0 256 214 276 242 0 190 217 204 230 0 277 224 297 248 0 235 211 258 239 0 129 204 141 213 0 140 202 146 213 +1505 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431257.jpg 640 480 6 411 195 520 369 2 180 23 189 32 +1506 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027874.jpg 640 480 6 20 36 599 313 +1507 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308785.jpg 640 427 6 58 74 562 264 +1508 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571746.jpg 480 640 6 204 142 297 279 0 328 183 340 204 0 341 154 352 167 0 400 122 412 143 0 64 37 72 62 0 326 232 337 256 0 53 40 61 63 0 229 73 234 89 0 218 74 224 83 0 228 74 231 85 +1509 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074789.jpg 480 640 6 89 151 327 489 0 438 286 458 357 0 194 379 228 408 0 200 88 206 100 +1510 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283642.jpg 640 467 6 86 154 626 406 0 18 204 64 346 +1511 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347747.jpg 640 480 6 102 148 359 349 +1512 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555180.jpg 640 426 6 89 155 242 298 +1513 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277614.jpg 640 427 6 2 147 387 347 11 498 265 509 278 74 544 58 561 76 74 569 58 577 74 9 400 154 411 165 9 388 149 399 162 +1514 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563665.jpg 640 480 6 168 81 551 479 13 555 244 599 276 +1515 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021483.jpg 640 480 6 77 57 572 474 +1516 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492805.jpg 640 427 6 169 87 635 426 +1517 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555267.jpg 640 360 6 34 10 639 348 0 46 154 72 204 0 13 151 49 178 +1518 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166896.jpg 640 426 6 1 112 457 326 0 172 130 236 263 +1519 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265579.jpg 386 640 6 34 271 279 509 +1520 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535591.jpg 640 427 6 309 280 341 314 14 394 183 400 185 +1521 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293333.jpg 640 468 6 98 120 559 386 +1522 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022215.jpg 640 414 6 135 175 472 313 9 53 70 97 161 0 415 214 446 236 0 288 218 298 231 0 323 226 329 233 +1523 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335887.jpg 640 480 6 4 110 628 390 +1524 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188918.jpg 640 480 6 1 181 196 288 9 455 154 516 183 9 587 170 621 201 9 314 220 323 237 9 417 201 443 224 +1525 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056562.jpg 480 640 8 1 165 241 389 14 161 83 238 168 +1526 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235791.jpg 640 435 8 1 151 47 188 8 22 142 50 163 8 422 200 576 389 8 95 197 257 389 8 319 145 372 188 8 448 109 479 132 8 376 125 413 141 0 111 275 130 310 0 192 190 209 209 0 433 274 451 310 0 516 188 531 204 8 0 137 40 168 8 120 105 154 132 8 0 127 82 151 8 64 121 90 143 0 228 285 237 304 8 84 117 121 129 0 219 284 228 315 0 541 284 555 316 8 46 99 639 166 +1527 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133611.jpg 640 321 8 107 132 560 280 0 353 139 366 162 0 369 141 384 162 0 243 99 260 132 0 280 98 292 134 +1528 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377882.jpg 640 480 8 226 4 483 376 8 3 216 442 294 37 481 215 638 261 37 490 127 638 178 8 207 162 325 181 8 206 182 319 203 8 277 146 321 160 37 483 331 638 398 37 275 146 320 156 8 0 181 67 214 37 213 148 286 163 37 529 269 639 343 37 205 165 323 179 37 186 186 285 201 +1529 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091912.jpg 640 480 8 290 181 361 208 8 412 187 466 201 0 505 224 511 244 0 589 264 608 275 +1530 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378139.jpg 640 427 8 114 228 486 322 0 224 264 240 282 1 62 226 113 246 2 391 214 427 228 2 470 214 493 227 2 492 214 512 224 2 520 213 540 224 8 597 220 634 231 8 552 221 611 234 2 429 214 458 228 1 3 229 65 248 1 115 229 148 243 1 230 220 246 237 0 145 213 153 232 0 167 263 186 289 1 153 225 171 243 1 184 228 202 242 +1531 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220215.jpg 640 427 8 1 232 575 261 8 372 189 639 225 0 418 178 438 211 0 27 182 56 237 0 153 221 207 246 0 200 213 242 245 0 242 222 280 245 0 309 218 350 244 0 346 213 381 244 0 619 190 635 222 0 309 221 332 245 8 0 192 99 220 0 438 170 470 242 0 237 209 257 237 0 501 200 518 216 0 276 212 315 246 0 167 191 625 249 +1532 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401088.jpg 640 480 0 568 126 605 183 19 192 187 458 304 19 176 235 496 439 19 0 153 220 249 19 52 202 296 388 19 402 170 490 197 19 2 221 145 458 19 480 173 611 322 19 104 180 188 208 19 425 174 493 288 19 224 175 352 214 19 201 171 302 189 19 332 180 378 207 7 409 80 631 132 +1533 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306972.jpg 640 436 0 281 83 366 347 0 346 78 405 189 0 229 167 291 268 6 356 119 589 401 6 0 117 235 405 0 476 103 515 149 26 236 210 288 274 0 230 177 253 212 0 448 117 465 144 0 447 133 459 146 11 111 114 129 141 +1534 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395717.jpg 435 500 0 24 73 380 499 0 0 368 62 498 8 1 135 433 491 +1535 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432276.jpg 612 612 2 7 104 151 248 2 194 128 355 257 2 10 67 133 106 25 27 39 413 250 7 8 78 604 600 7 236 140 428 277 7 327 65 452 148 7 12 67 207 202 16 236 199 379 278 2 247 144 428 271 +1536 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359442.jpg 480 640 6 1 139 477 232 6 1 81 479 139 6 218 59 469 83 +1537 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572303.jpg 640 480 6 12 33 619 352 2 0 279 19 335 +1538 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476873.jpg 500 375 11 181 69 305 219 12 173 277 192 319 12 192 277 206 317 +1539 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163012.jpg 500 400 11 241 125 308 194 9 256 58 268 88 +1540 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266115.jpg 480 640 11 234 136 321 284 +1541 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327665.jpg 332 500 11 87 58 324 301 0 20 207 148 493 26 60 451 80 492 +1542 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066427.jpg 640 480 11 265 220 458 431 +1543 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271240.jpg 425 640 11 256 258 303 355 +1544 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473171.jpg 640 480 11 356 133 605 420 +1545 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535242.jpg 500 375 11 105 29 419 327 +1546 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136400.jpg 480 640 11 109 15 382 291 +1547 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050485.jpg 640 480 11 512 249 553 289 2 242 244 330 293 10 315 236 382 335 2 220 250 300 284 2 269 228 364 264 2 264 277 323 311 2 375 232 488 316 +1548 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192716.jpg 518 640 11 109 171 413 490 2 0 589 55 638 2 137 595 233 639 0 38 595 52 623 +1549 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479334.jpg 399 500 11 32 100 384 478 0 205 237 276 354 +1550 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100723.jpg 500 333 11 205 42 328 161 26 68 115 75 141 0 256 111 341 252 0 200 181 332 329 0 335 72 363 177 0 3 192 153 332 0 378 188 470 331 0 201 142 256 277 0 465 9 492 43 0 114 48 142 134 0 109 167 197 328 0 55 141 92 179 0 7 106 43 283 24 361 230 401 303 24 389 141 428 174 0 45 60 71 83 0 57 83 113 179 0 4 1 499 332 +1551 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212072.jpg 500 375 11 310 29 460 177 +1552 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522940.jpg 511 640 11 8 17 367 383 +1553 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072052.jpg 500 379 11 55 173 154 322 2 169 309 426 373 2 422 349 474 378 2 0 297 94 371 7 159 309 428 378 +1554 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273617.jpg 640 427 11 129 165 164 203 +1555 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124246.jpg 640 460 11 259 142 401 275 +1556 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104965.jpg 400 267 11 86 54 131 97 2 44 124 67 139 +1557 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006091.jpg 480 640 11 100 117 353 391 +1558 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234463.jpg 640 480 11 98 132 275 308 +1559 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122589.jpg 420 266 11 224 84 279 142 +1560 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320203.jpg 428 640 11 22 375 256 632 +1561 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424293.jpg 640 480 11 297 148 348 213 +1562 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091517.jpg 426 640 11 294 192 369 272 58 360 325 399 362 58 370 287 424 362 58 402 198 422 223 58 338 326 362 353 +1563 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448053.jpg 478 640 11 209 81 351 227 +1564 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105291.jpg 640 480 11 269 98 539 413 2 92 441 228 473 2 0 433 44 478 13 69 460 99 479 +1565 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196754.jpg 375 500 11 118 293 199 377 56 215 302 374 499 +1566 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340654.jpg 426 640 11 61 210 87 240 9 60 294 97 381 9 43 382 81 409 12 404 494 411 509 9 111 383 141 407 10 264 552 291 590 +1567 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273188.jpg 480 640 11 155 121 255 220 +1568 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013333.jpg 640 480 11 30 70 246 367 +1569 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261273.jpg 427 640 11 177 218 304 387 +1570 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189427.jpg 500 333 11 21 52 148 173 +1571 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532159.jpg 640 480 11 384 26 490 179 2 145 155 179 180 2 97 155 133 179 2 503 178 530 191 2 540 181 561 193 +1572 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203846.jpg 640 427 11 63 186 258 384 +1573 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066239.jpg 640 480 11 279 215 492 442 2 441 457 481 474 2 395 458 447 478 2 481 466 528 479 2 558 465 572 479 2 292 466 366 479 0 1 438 14 458 2 156 467 237 478 +1574 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322845.jpg 640 365 11 453 175 540 318 +1575 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274629.jpg 640 480 11 272 22 599 438 7 68 327 117 342 +1576 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390685.jpg 428 640 11 211 7 311 425 11 116 510 157 602 +1577 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500139.jpg 512 640 11 134 61 400 337 2 129 490 202 572 2 187 500 236 559 2 263 500 300 551 2 267 485 334 545 2 327 494 359 538 2 347 494 372 533 2 488 499 511 571 2 363 491 387 530 7 3 485 164 589 7 388 440 497 548 +1578 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331307.jpg 500 375 14 284 240 311 260 75 437 225 470 324 58 379 26 483 324 +1579 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095227.jpg 640 480 11 376 128 457 231 7 34 248 121 287 0 84 249 94 283 +1580 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000464248.jpg 640 424 14 229 171 300 272 14 98 208 175 302 14 480 116 546 204 +1581 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237476.jpg 640 550 15 341 73 625 527 45 0 291 79 389 +1582 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021161.jpg 640 427 15 163 2 362 256 59 106 27 534 419 48 291 219 375 311 +1583 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215471.jpg 500 383 15 281 123 361 204 +1584 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086467.jpg 640 428 18 200 203 293 263 18 289 196 382 267 18 283 180 358 241 18 196 203 271 229 18 84 199 167 263 +1585 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170346.jpg 640 428 18 268 193 356 247 18 464 183 572 245 18 88 134 192 253 +1586 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092679.jpg 640 427 19 0 31 503 314 19 307 125 603 283 49 248 239 321 299 +1587 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321176.jpg 640 471 25 178 0 639 470 0 407 80 638 411 +1588 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422432.jpg 640 241 25 124 26 149 32 7 204 41 514 174 24 108 48 116 62 2 552 95 639 200 0 513 50 568 157 0 292 35 317 69 0 233 32 248 69 0 244 28 261 69 0 257 25 286 69 0 152 40 178 115 0 127 39 139 65 0 119 58 130 89 0 67 35 83 92 0 46 34 71 97 26 49 59 67 73 26 25 46 40 63 26 161 51 185 82 26 270 38 288 68 0 22 35 44 91 0 196 35 222 75 7 554 99 639 200 0 129 32 153 116 0 87 29 187 97 +1589 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129062.jpg 640 480 25 451 302 586 351 12 0 198 112 474 0 532 343 624 474 60 431 425 512 479 60 106 424 296 479 60 312 416 491 476 12 143 381 163 426 +1590 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410068.jpg 640 403 25 140 149 240 234 2 216 95 288 154 2 302 93 367 155 2 23 118 48 184 2 318 113 356 174 56 184 87 194 103 56 99 85 109 99 56 110 85 120 99 56 124 85 136 100 56 226 92 235 103 56 146 86 154 102 56 156 83 164 103 7 390 34 635 299 0 157 191 254 350 2 0 128 36 211 2 355 127 408 218 2 28 92 88 146 2 77 79 102 130 2 25 102 73 164 7 337 101 409 177 25 82 46 150 72 25 70 48 94 63 25 133 48 183 106 56 176 88 185 103 56 211 92 225 103 56 121 87 126 96 56 195 87 205 106 56 208 92 219 101 2 0 112 34 172 2 9 109 62 171 56 135 86 147 98 56 96 83 211 106 +1591 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006074.jpg 640 427 25 486 97 639 170 7 191 135 592 339 0 164 175 212 305 0 29 151 108 302 0 125 156 148 181 0 378 157 414 207 0 124 189 169 266 0 98 155 127 221 0 192 150 212 191 0 235 154 259 200 0 508 166 639 426 0 519 177 540 202 0 204 154 232 217 0 141 154 169 222 0 92 154 103 178 0 0 150 119 290 +1592 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443969.jpg 612 612 25 181 28 475 149 0 242 106 371 416 0 0 109 132 579 0 68 46 157 271 0 180 8 486 269 0 119 85 137 134 0 181 82 194 122 +1593 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060049.jpg 375 500 27 309 447 314 476 0 297 428 332 499 11 273 250 300 285 +1594 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557564.jpg 500 500 27 181 277 248 452 0 68 58 461 492 +1595 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232597.jpg 427 640 27 200 214 223 328 0 125 142 290 570 74 11 205 45 240 +1596 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151657.jpg 385 640 27 142 143 179 340 0 198 107 341 631 0 10 16 214 632 +1597 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398045.jpg 500 374 27 272 81 326 255 0 0 91 163 370 0 156 4 358 370 0 296 54 496 368 0 0 99 33 224 0 115 79 231 368 27 339 170 434 373 0 270 32 490 340 +1598 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458275.jpg 317 500 27 148 127 176 246 0 91 50 247 467 +1599 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216581.jpg 640 424 67 299 203 318 212 67 344 114 353 124 13 63 224 293 423 13 171 219 322 390 73 563 159 621 196 73 98 252 180 315 26 307 191 361 266 26 52 338 108 387 0 0 159 214 423 0 198 134 390 423 0 237 94 283 137 0 310 68 528 373 0 386 88 617 350 0 586 67 637 292 0 602 55 639 123 0 587 13 623 59 0 549 33 588 84 0 446 85 598 248 0 516 81 608 185 13 514 57 552 93 24 306 190 359 267 0 237 96 557 419 0 1 343 84 420 26 290 251 352 313 26 594 185 634 232 67 433 116 445 138 +1600 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057091.jpg 640 427 67 199 337 270 410 24 5 41 262 350 28 207 0 639 415 59 194 0 639 110 +1601 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482476.jpg 640 425 67 133 240 216 266 0 141 2 637 424 26 256 403 302 425 +1602 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400975.jpg 427 640 74 54 13 356 638 14 81 293 149 370 +1603 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391689.jpg 612 612 2 40 335 180 376 7 265 294 585 432 2 2 336 76 373 +1604 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206770.jpg 640 480 2 309 195 586 349 11 568 129 624 186 +1605 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286654.jpg 500 459 2 233 211 312 248 0 262 214 268 220 +1606 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299409.jpg 640 427 2 244 232 610 426 2 594 272 628 294 7 206 160 611 426 9 529 219 538 230 +1607 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444888.jpg 500 375 2 22 362 38 374 7 53 356 109 370 2 41 360 63 367 56 155 266 161 281 58 420 189 429 198 +1608 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338562.jpg 499 500 2 137 293 254 364 10 241 200 345 420 0 85 295 101 330 +1609 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199389.jpg 480 640 2 295 98 438 177 10 158 138 315 541 +1610 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530620.jpg 640 425 2 201 169 225 183 2 173 158 193 172 7 0 92 174 230 0 266 172 345 272 0 411 145 453 271 0 364 154 413 251 0 342 155 365 181 7 521 220 592 254 +1611 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170190.jpg 361 640 2 104 332 315 415 0 190 344 206 361 0 336 310 355 329 0 0 307 30 363 6 154 246 360 369 +1612 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532085.jpg 500 375 2 42 203 140 251 12 89 155 132 244 9 275 14 294 56 9 369 112 377 131 9 194 119 207 143 12 3 199 11 216 12 12 198 19 213 12 131 159 167 242 2 318 184 446 246 +1613 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217016.jpg 640 480 2 123 138 500 380 0 416 152 426 184 0 447 155 455 183 0 22 157 28 176 37 196 98 405 156 0 592 174 622 182 0 622 176 635 180 0 570 144 577 158 0 101 168 110 180 +1614 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332545.jpg 640 493 2 442 310 490 334 2 494 309 537 330 2 98 307 175 323 2 219 310 259 321 12 335 182 368 216 2 485 308 508 326 +1615 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476339.jpg 640 480 2 445 0 639 95 12 230 16 434 451 +1616 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125286.jpg 480 640 2 0 598 113 631 9 48 354 157 481 9 122 525 137 538 2 262 608 373 639 9 190 383 297 486 +1617 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571636.jpg 640 429 2 600 179 638 227 7 23 0 625 420 0 458 145 504 213 39 221 209 262 239 39 278 178 319 203 39 285 116 318 142 39 219 175 263 196 39 166 200 234 229 39 151 200 177 226 +1618 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293071.jpg 335 500 2 0 153 90 219 2 73 148 281 230 10 82 246 166 475 2 273 181 332 239 +1619 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329379.jpg 480 640 2 227 187 328 263 2 194 191 214 206 7 159 161 183 203 2 133 185 144 200 +1620 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490338.jpg 640 427 2 31 244 195 386 0 381 253 404 303 0 348 248 366 300 0 335 257 347 301 0 310 255 323 302 0 368 249 391 301 2 402 266 409 273 25 367 279 378 300 0 320 250 334 304 0 407 255 426 304 +1621 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038531.jpg 640 519 2 547 267 632 455 2 503 270 590 364 2 484 270 513 327 12 571 291 587 329 0 409 256 428 315 0 397 267 406 286 0 263 258 280 301 0 239 256 251 299 0 309 264 317 292 0 318 265 328 292 12 494 280 502 302 12 477 278 482 286 0 214 255 230 271 0 386 268 394 285 2 468 266 500 332 0 103 238 129 314 0 393 268 397 280 12 463 274 467 277 +1622 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387150.jpg 640 480 2 181 98 639 425 2 38 140 76 206 2 586 114 639 161 2 2 145 37 175 12 418 6 493 198 7 75 82 267 242 12 52 114 72 158 +1623 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052871.jpg 426 640 2 401 409 425 446 2 354 405 414 439 2 290 395 332 427 2 325 402 372 435 2 49 394 77 413 2 259 401 291 422 2 251 400 268 417 2 190 400 204 423 7 239 389 268 416 2 201 398 217 412 2 219 396 235 406 0 139 407 160 428 2 93 397 138 419 7 13 388 53 424 1 129 402 150 424 2 234 399 242 412 +1624 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245426.jpg 640 427 2 58 189 179 231 7 172 44 509 400 9 86 56 97 93 9 13 65 26 91 2 0 201 26 285 9 1 66 12 90 0 366 154 427 206 0 42 225 70 288 +1625 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374241.jpg 640 427 2 411 281 457 302 9 461 168 472 194 10 512 288 518 305 0 491 279 501 313 0 501 278 514 313 0 366 278 389 323 0 547 277 560 303 0 91 279 112 326 2 105 284 119 292 7 170 277 257 326 9 353 246 361 272 9 535 254 542 264 9 511 255 519 262 13 61 321 124 358 13 214 387 401 426 13 102 338 221 415 0 362 279 369 289 0 81 273 94 322 9 134 239 150 253 2 410 286 418 292 2 346 284 359 298 2 359 282 387 298 +1626 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581887.jpg 640 480 2 85 394 144 424 2 66 399 100 421 2 179 377 233 422 2 230 396 257 415 2 122 277 639 473 2 145 397 176 414 2 254 397 265 411 9 323 249 345 298 9 164 358 173 373 0 533 351 584 429 7 41 394 77 419 +1627 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153011.jpg 640 480 2 326 217 398 253 2 364 213 421 237 2 462 214 481 240 5 477 84 639 305 56 75 282 164 408 7 0 113 317 277 26 466 234 483 280 7 479 118 639 302 0 430 208 476 348 0 414 202 442 342 0 97 201 203 383 0 216 193 246 289 0 0 204 28 354 0 20 229 37 282 0 136 216 181 321 0 164 191 195 241 60 513 264 591 380 60 367 249 414 334 60 346 240 394 309 60 221 235 271 308 0 24 220 71 312 26 174 234 205 272 56 41 253 94 344 60 25 254 47 262 2 363 211 381 220 +1628 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057095.jpg 480 640 2 228 349 245 362 2 257 350 268 359 2 0 571 480 639 9 290 189 305 222 2 307 351 314 355 9 440 273 453 298 9 303 317 305 324 +1629 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153061.jpg 500 375 2 446 168 499 189 7 21 71 418 328 2 410 189 498 265 +1630 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171548.jpg 640 480 2 536 245 639 473 2 518 281 576 309 3 166 345 257 457 3 380 343 475 471 7 306 220 402 340 9 485 195 490 209 9 556 251 562 266 9 564 251 571 267 24 180 251 260 361 0 177 214 305 462 0 365 207 512 475 0 385 224 404 258 0 346 225 370 268 0 328 223 351 269 0 306 236 330 270 0 369 231 388 268 0 101 282 156 376 2 294 295 311 305 0 326 238 337 263 0 314 224 325 240 0 363 227 373 241 2 1 218 170 463 +1631 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296988.jpg 640 480 2 9 244 53 269 7 81 109 514 373 +1632 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230450.jpg 640 480 2 301 247 374 262 9 303 172 311 192 9 395 226 404 244 9 396 249 403 255 12 182 228 260 403 12 133 238 183 333 12 418 202 639 470 12 103 238 118 283 12 111 238 134 290 3 361 249 401 264 +1633 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260595.jpg 480 640 2 55 530 227 619 2 0 530 56 591 2 270 543 381 594 2 173 528 261 582 2 44 515 109 549 9 23 12 80 132 0 324 544 356 639 0 222 535 300 639 2 86 517 169 539 0 145 547 165 562 0 54 503 72 525 2 373 548 479 616 12 5 501 15 523 +1634 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536795.jpg 480 640 2 0 343 154 541 2 244 328 395 434 2 321 314 385 341 12 138 309 254 527 +1635 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277172.jpg 480 640 2 28 200 205 284 2 5 186 65 217 2 177 181 223 230 7 214 129 438 256 7 75 183 166 208 57 105 240 234 335 2 211 121 452 252 +1636 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376677.jpg 640 444 2 115 310 135 326 2 89 312 112 328 2 111 306 128 324 7 223 139 533 435 9 65 280 72 292 2 82 312 91 325 2 80 310 95 322 9 158 277 162 286 +1637 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188346.jpg 640 427 2 104 251 115 258 7 226 185 550 301 0 451 261 530 421 24 151 277 200 350 0 266 212 286 233 0 0 225 48 425 2 84 249 92 258 0 138 248 216 425 +1638 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361029.jpg 640 426 2 97 236 222 305 0 71 1 639 425 9 284 193 295 214 2 231 238 275 289 2 0 244 35 274 9 196 136 208 161 9 119 151 139 176 2 71 236 118 270 +1639 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497348.jpg 425 640 2 169 286 204 318 2 163 276 182 285 +1640 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490491.jpg 485 640 2 89 383 102 419 2 90 377 103 386 2 93 383 103 399 0 107 373 114 396 0 118 373 125 396 2 94 374 100 377 11 56 164 106 215 +1641 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499537.jpg 480 640 2 142 361 187 385 2 74 355 144 387 2 433 372 455 388 2 422 369 428 381 2 390 361 410 369 2 410 370 423 386 7 377 367 408 393 9 330 328 334 336 10 459 392 466 410 9 352 328 354 337 9 352 340 355 345 9 390 343 391 348 9 361 345 364 349 9 370 340 372 346 2 455 365 459 372 +1642 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546782.jpg 375 500 2 169 419 223 448 2 218 428 252 450 2 313 459 335 476 1 102 411 121 431 2 318 476 340 497 +1643 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567205.jpg 640 480 2 1 80 369 400 2 294 74 577 175 12 296 141 349 333 0 266 29 545 474 67 518 356 548 396 +1644 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460147.jpg 640 424 2 236 290 296 358 2 283 193 311 218 2 482 196 529 226 2 536 269 639 376 2 326 152 341 163 2 535 219 609 271 2 355 142 361 149 2 460 180 491 207 2 586 169 614 200 2 414 173 437 191 9 159 219 169 229 2 302 172 319 188 3 412 168 418 177 5 371 128 389 144 5 351 126 372 140 7 433 146 456 174 0 540 169 544 187 0 570 233 583 243 2 315 160 329 174 3 412 150 417 159 3 404 157 411 165 7 344 215 418 289 7 472 228 549 284 7 0 236 90 289 0 411 162 419 169 2 339 149 351 158 2 1 119 639 363 +1645 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198805.jpg 640 398 2 53 249 135 303 2 10 234 138 280 7 129 155 612 389 2 50 228 96 247 2 0 230 8 248 2 22 233 68 256 7 68 215 145 245 7 37 227 96 248 +1646 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291404.jpg 640 480 2 1 244 81 335 7 6 81 639 392 0 550 128 604 184 2 211 249 220 256 0 8 256 31 276 +1647 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295683.jpg 640 480 2 514 344 587 379 2 572 332 639 362 2 437 349 467 366 2 414 351 441 366 2 474 350 513 378 2 471 346 503 365 9 139 1 252 132 9 505 298 515 318 0 416 366 428 392 0 488 358 499 379 9 484 299 492 322 2 392 352 400 364 9 452 214 469 250 9 468 212 486 247 +1648 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107244.jpg 640 429 2 480 287 511 314 +1649 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484215.jpg 640 379 2 31 280 74 310 2 82 280 98 302 2 380 283 397 292 2 414 278 433 289 2 49 273 88 303 2 99 285 127 298 9 436 235 440 243 9 462 235 466 250 9 91 251 95 254 9 72 251 76 259 9 134 225 140 236 2 169 283 173 289 9 107 280 110 283 2 0 270 34 315 2 157 284 167 294 2 483 278 490 281 7 109 281 149 298 7 445 276 473 289 2 496 275 503 280 9 461 234 465 239 9 92 255 93 258 9 476 272 477 275 9 481 272 483 274 9 438 244 442 251 +1650 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529597.jpg 640 480 2 107 40 265 111 2 344 15 488 82 2 499 9 623 64 12 347 100 639 470 12 0 136 353 473 2 0 71 54 130 +1651 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335177.jpg 640 479 2 552 295 612 316 7 186 302 308 341 11 338 239 371 273 +1652 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244005.jpg 640 428 5 409 141 628 321 7 390 185 417 260 +1653 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027946.jpg 640 426 5 102 114 505 378 0 41 232 53 264 0 545 253 555 286 2 479 249 537 294 2 590 236 639 345 0 26 231 41 265 0 75 235 89 269 2 93 238 106 248 0 6 227 28 313 0 0 230 13 277 +1654 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349310.jpg 640 427 5 117 111 529 385 2 608 247 636 267 +1655 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051249.jpg 640 554 6 150 168 512 402 9 475 200 482 210 0 162 314 180 322 0 211 314 224 324 +1656 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018295.jpg 640 427 6 139 104 503 302 9 52 81 55 83 9 69 88 71 91 +1657 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256838.jpg 640 480 6 111 90 480 370 0 5 193 16 261 26 15 215 22 226 +1658 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023995.jpg 640 424 6 1 177 562 349 9 124 109 137 133 9 30 116 44 138 +1659 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299492.jpg 640 474 6 27 199 432 215 8 332 219 354 234 +1660 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323751.jpg 640 424 6 119 114 483 367 9 476 95 482 112 9 572 105 577 114 0 552 208 568 279 13 545 396 574 423 0 208 247 232 267 9 571 95 576 104 27 217 259 221 268 6 468 108 502 128 +1661 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014226.jpg 640 480 56 59 399 226 471 56 394 16 592 270 0 208 30 540 369 63 221 236 434 369 56 0 357 87 474 56 595 27 639 230 60 154 295 639 469 47 311 290 333 311 +1662 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205289.jpg 640 451 7 147 120 485 283 0 264 145 314 202 +1663 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130516.jpg 640 480 7 57 84 564 479 0 500 155 583 368 +1664 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317424.jpg 640 408 7 22 36 617 279 +1665 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349185.jpg 640 384 7 325 106 565 306 7 267 104 283 113 7 113 103 181 124 +1666 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304347.jpg 640 418 7 447 274 549 376 7 423 314 451 367 +1667 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103272.jpg 640 480 7 83 62 591 405 +1668 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100006.jpg 640 427 7 0 21 639 420 60 483 285 639 382 +1669 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361923.jpg 640 480 7 33 71 447 355 +1670 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351081.jpg 612 612 7 207 352 543 518 7 151 355 323 454 7 33 331 202 464 7 328 300 611 465 0 261 397 289 425 7 157 330 361 410 2 0 378 25 423 10 57 424 81 471 +1671 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123469.jpg 640 478 7 32 59 603 430 0 16 251 30 288 +1672 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149767.jpg 640 424 7 33 155 639 394 +1673 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446324.jpg 375 500 7 95 3 327 382 +1674 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192607.jpg 640 425 7 1 209 468 411 0 456 223 518 382 +1675 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148719.jpg 640 480 7 96 96 582 379 7 0 108 259 319 7 545 115 633 183 7 192 116 221 150 7 231 118 273 147 0 1 119 42 163 +1676 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350084.jpg 640 427 7 59 83 574 387 +1677 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491336.jpg 640 423 7 54 99 601 411 2 0 239 32 295 7 23 183 136 306 +1678 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497351.jpg 640 427 7 86 25 557 406 7 424 70 639 324 7 1 142 60 349 +1679 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358901.jpg 640 300 7 103 66 349 245 +1680 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367893.jpg 640 457 7 33 126 592 378 +1681 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171733.jpg 640 427 7 51 229 199 300 7 197 167 574 329 7 32 200 50 250 +1682 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020947.jpg 640 404 7 17 89 615 343 +1683 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060677.jpg 640 480 7 124 113 610 317 2 0 197 17 340 +1684 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232453.jpg 640 480 7 37 48 598 416 7 523 162 638 316 +1685 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500829.jpg 640 427 7 278 85 528 368 +1686 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203061.jpg 640 480 7 6 4 637 471 7 571 168 639 223 7 529 181 557 192 +1687 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137211.jpg 640 427 7 209 88 533 345 7 518 135 617 277 7 207 168 263 245 7 93 159 223 248 +1688 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188439.jpg 640 408 7 76 209 404 380 0 405 255 416 286 +1689 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448114.jpg 640 396 7 267 122 639 280 7 196 156 445 274 7 58 157 313 276 9 530 80 549 121 9 430 84 440 118 +1690 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093607.jpg 640 439 7 86 125 532 376 0 240 194 262 233 28 430 187 470 231 28 476 139 492 179 0 453 126 480 177 +1691 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532773.jpg 640 427 7 52 76 613 361 +1692 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088902.jpg 500 375 9 37 53 106 204 +1693 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372471.jpg 640 427 9 191 162 263 335 +1694 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335800.jpg 640 427 9 52 255 262 426 +1695 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567801.jpg 640 428 9 27 0 163 270 9 65 281 211 397 +1696 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399865.jpg 337 500 9 153 263 163 287 0 69 311 77 323 +1697 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556653.jpg 640 379 9 461 17 488 87 9 582 20 629 125 6 37 194 194 263 +1698 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260307.jpg 640 480 9 231 315 247 350 9 336 294 407 370 9 305 259 366 366 +1699 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267224.jpg 640 480 9 466 117 487 161 9 447 173 464 192 9 177 161 193 182 7 116 176 560 397 +1700 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560235.jpg 640 480 9 295 276 324 356 9 452 202 501 310 9 33 92 88 222 9 338 319 368 354 9 336 163 368 214 +1701 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379070.jpg 555 640 10 404 247 461 363 10 497 165 522 214 2 320 145 454 243 2 381 67 421 99 2 309 66 369 101 2 258 76 303 115 2 217 85 270 128 2 152 88 205 129 2 103 93 167 138 2 28 89 99 141 9 171 27 177 44 2 88 75 142 129 2 243 54 257 69 2 487 79 516 117 2 414 69 431 95 2 1 98 31 149 10 454 211 492 279 2 156 0 492 110 +1702 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087244.jpg 375 500 10 149 164 292 486 0 182 0 239 107 13 227 63 261 86 +1703 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000178810.jpg 427 640 10 135 290 194 395 +1704 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451014.jpg 640 480 10 338 136 446 331 +1705 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118956.jpg 500 342 10 9 69 248 336 +1706 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378831.jpg 500 315 10 312 73 362 221 0 98 70 152 286 26 124 110 165 178 26 96 193 161 282 +1707 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427500.jpg 428 640 10 173 296 343 460 2 0 5 43 136 +1708 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412551.jpg 640 425 10 334 278 361 330 2 558 259 631 288 2 604 266 639 284 +1709 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433892.jpg 640 480 10 96 312 117 350 2 315 270 407 298 11 110 215 152 257 +1710 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387244.jpg 500 375 10 330 0 417 131 +1711 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416405.jpg 375 500 10 100 215 191 419 +1712 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520338.jpg 480 640 10 122 399 224 593 0 278 200 333 415 58 32 269 152 472 0 406 180 479 483 +1713 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569273.jpg 640 480 10 404 110 572 473 0 212 86 265 161 0 154 79 203 133 0 53 122 81 147 0 13 116 35 136 0 34 100 63 146 +1714 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029656.jpg 426 640 10 8 95 259 630 0 198 63 285 312 0 322 79 413 306 24 257 148 280 187 2 0 183 37 252 7 0 185 35 248 +1715 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430583.jpg 500 375 10 263 57 460 368 13 0 5 95 99 13 135 6 211 52 13 145 5 414 173 +1716 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581731.jpg 513 640 10 188 356 233 512 +1717 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158563.jpg 640 480 10 252 49 482 478 0 118 1 377 434 +1718 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487698.jpg 640 512 10 353 117 485 496 0 160 46 335 365 13 0 212 27 318 67 221 68 231 81 26 207 141 282 219 +1719 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435703.jpg 478 640 10 194 48 425 623 +1720 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030383.jpg 427 640 10 216 92 417 480 2 175 397 192 411 2 231 383 239 389 2 173 392 185 402 +1721 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087875.jpg 640 487 10 144 167 298 484 +1722 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198811.jpg 480 640 10 46 189 289 631 +1723 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029648.jpg 427 640 10 135 107 297 535 +1724 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164420.jpg 640 480 10 324 147 426 340 +1725 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462677.jpg 478 640 12 174 38 327 354 58 1 435 118 575 +1726 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107004.jpg 578 640 12 323 0 391 176 26 242 197 309 324 0 381 43 532 622 0 503 197 576 425 0 210 155 306 403 0 135 144 227 405 0 67 198 132 374 0 300 257 332 327 12 306 41 343 184 0 525 202 577 426 0 125 255 143 339 +1727 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472643.jpg 640 554 12 370 129 518 542 0 0 39 447 480 0 2 402 262 547 0 203 262 258 328 0 582 187 639 362 0 274 213 374 352 0 219 265 339 377 0 518 214 570 252 0 479 238 639 553 0 183 154 228 258 +1728 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064495.jpg 640 480 12 230 40 411 227 +1729 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474110.jpg 375 500 0 120 125 374 490 0 172 210 189 255 0 182 201 202 254 0 160 208 174 257 0 98 210 110 224 0 113 204 130 240 0 86 203 99 233 0 75 210 85 241 0 22 210 33 239 9 6 168 18 180 0 44 207 57 241 0 31 211 39 239 9 73 167 88 192 9 270 166 280 186 9 164 166 178 200 25 169 197 193 203 +1730 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273579.jpg 640 480 0 2 220 134 474 20 217 198 639 479 2 0 196 31 289 +1731 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502336.jpg 640 431 0 193 289 228 390 0 140 297 191 392 0 604 262 637 382 0 303 276 387 418 26 195 367 221 392 26 348 320 373 351 26 322 321 346 361 26 172 340 184 369 26 142 347 152 364 0 168 288 195 332 +1732 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150317.jpg 480 640 0 119 298 262 558 0 307 232 325 276 30 86 544 261 565 30 304 274 342 276 +1733 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221882.jpg 544 640 0 329 460 410 616 0 201 447 238 551 0 288 447 312 523 0 255 441 281 522 0 501 430 521 522 11 455 205 539 287 0 379 446 410 550 0 229 447 249 520 0 359 447 371 466 0 181 442 207 522 10 511 500 538 546 26 383 474 394 497 0 152 451 179 524 0 167 450 185 521 0 104 465 131 528 0 225 445 233 463 0 73 443 384 552 +1734 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173166.jpg 375 500 0 3 266 23 286 23 168 87 278 372 23 257 37 373 344 +1735 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441156.jpg 640 480 0 273 155 402 479 0 480 201 560 431 0 606 208 639 398 20 162 105 365 437 26 491 244 528 345 24 298 232 370 285 +1736 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527573.jpg 429 640 0 116 181 166 341 24 154 204 167 241 10 267 256 373 417 +1737 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078843.jpg 640 480 0 122 3 599 475 0 3 189 444 471 27 424 349 512 479 +1738 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462315.jpg 640 427 0 285 195 320 258 0 451 198 475 256 0 493 205 531 292 7 572 166 639 232 7 0 80 254 281 7 276 144 448 242 0 282 200 297 256 +1739 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415885.jpg 640 640 0 1 76 487 574 38 333 347 387 429 +1740 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148568.jpg 500 375 0 479 140 499 176 0 395 200 499 373 0 457 187 499 273 0 413 142 463 207 0 460 143 486 175 23 0 155 378 374 0 439 153 487 211 0 456 170 499 233 23 108 238 285 323 +1741 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445014.jpg 640 480 0 346 84 639 479 0 478 298 639 479 23 1 170 293 370 23 52 23 111 87 0 389 287 467 479 +1742 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180011.jpg 480 640 0 212 461 432 632 23 78 295 369 639 23 396 285 479 639 23 0 132 220 547 23 304 178 414 436 23 1 490 192 639 +1743 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165056.jpg 640 480 0 263 392 422 472 23 337 28 545 473 23 53 40 293 479 +1744 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566941.jpg 640 480 0 269 172 378 471 0 419 210 514 449 0 610 214 639 400 20 122 111 490 445 24 244 277 288 368 26 431 258 486 354 +1745 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250427.jpg 640 640 0 100 396 171 566 0 253 374 295 530 0 33 406 49 457 0 72 404 84 450 0 11 405 32 456 0 44 404 63 456 +1746 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424975.jpg 640 480 0 286 300 314 371 2 545 312 574 334 0 242 304 277 396 11 166 209 202 256 +1747 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106641.jpg 640 384 0 364 0 401 50 13 107 0 186 63 13 301 0 364 63 13 604 0 639 59 6 0 30 640 328 13 31 31 258 125 +1748 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518716.jpg 500 375 0 0 225 195 369 23 168 85 334 254 45 91 113 183 187 0 348 221 499 374 +1749 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312081.jpg 403 303 0 39 253 107 302 0 175 195 247 299 73 45 230 81 263 73 120 240 147 282 73 303 236 352 273 73 353 248 382 295 0 103 286 153 302 0 256 273 323 299 0 299 256 354 302 0 0 223 31 282 +1750 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183701.jpg 640 427 23 2 98 434 420 23 112 188 420 426 23 310 2 495 426 +1751 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095551.jpg 500 375 23 224 117 284 364 +1752 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564109.jpg 500 375 23 277 152 331 299 23 204 119 266 313 23 78 128 183 229 23 19 167 85 318 23 314 159 353 284 +1753 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338532.jpg 375 500 23 151 123 318 429 0 317 288 320 306 0 325 288 332 300 +1754 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173897.jpg 333 500 23 59 150 182 397 23 196 252 271 333 +1755 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048840.jpg 480 640 23 219 208 305 511 23 124 120 312 454 +1756 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380106.jpg 640 426 23 198 58 437 418 23 339 63 494 290 +1757 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478184.jpg 640 480 23 103 67 476 428 23 13 108 34 208 +1758 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026946.jpg 459 640 23 49 2 391 638 23 26 574 125 639 +1759 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345261.jpg 585 640 23 330 333 439 574 23 133 337 241 567 +1760 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553522.jpg 511 640 23 15 18 491 623 +1761 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474600.jpg 375 500 23 104 149 270 427 +1762 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522613.jpg 457 640 23 169 32 295 625 +1763 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580693.jpg 640 384 23 515 195 591 284 23 425 82 595 284 23 418 224 487 277 23 308 206 393 284 23 46 127 275 336 23 95 53 369 354 23 67 251 111 284 23 0 193 47 277 +1764 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363508.jpg 640 480 23 65 60 507 474 +1765 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574725.jpg 500 333 23 163 28 327 296 +1766 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543492.jpg 338 500 23 1 16 312 493 23 36 11 210 499 23 61 75 256 381 23 146 74 282 482 +1767 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469096.jpg 333 500 23 206 124 332 493 23 10 106 232 499 23 111 136 219 473 +1768 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301981.jpg 640 480 23 184 123 546 387 +1769 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324135.jpg 426 640 34 0 378 108 608 0 63 176 400 631 +1770 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265611.jpg 640 480 55 49 10 569 431 +1771 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075886.jpg 640 426 55 259 108 586 409 60 0 0 637 417 +1772 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227656.jpg 480 640 63 67 251 442 622 56 52 75 330 426 56 306 99 358 188 +1773 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276863.jpg 500 334 28 85 207 430 323 28 147 171 364 237 0 73 0 116 108 28 151 92 366 192 0 158 18 169 46 0 167 12 174 38 0 189 11 197 19 0 200 11 207 16 26 333 24 480 133 73 6 93 43 119 +1774 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384827.jpg 640 480 2 205 281 270 346 2 0 290 245 474 2 177 287 258 367 2 254 283 275 315 58 499 290 538 363 58 126 237 159 257 +1775 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366178.jpg 375 500 2 193 170 208 182 2 0 186 18 206 10 189 358 237 432 +1776 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134001.jpg 640 480 0 30 457 56 479 0 33 458 40 471 +1777 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516775.jpg 480 640 0 437 404 448 429 9 199 347 213 366 9 34 338 49 358 9 405 358 413 373 9 357 379 370 388 +1778 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396736.jpg 480 640 0 113 532 139 628 2 19 539 25 545 2 0 543 18 600 +1779 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086483.jpg 500 375 0 425 96 436 109 2 436 103 452 109 2 478 105 499 113 +1780 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477305.jpg 640 480 0 245 207 354 479 0 194 230 226 330 0 360 251 430 434 0 92 220 152 381 0 0 204 80 473 0 426 238 448 322 0 472 237 545 440 0 591 229 639 402 0 545 244 593 396 0 146 223 180 341 0 219 223 253 342 0 449 223 493 380 0 545 244 574 327 0 7 208 568 370 +1781 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072860.jpg 640 480 0 41 323 49 335 8 0 285 51 346 0 302 272 308 292 0 310 270 318 291 8 116 80 391 355 +1782 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085353.jpg 480 640 2 94 520 223 592 2 220 508 251 520 2 235 516 287 555 2 164 508 202 523 2 184 506 216 520 2 208 506 224 518 2 279 483 479 639 2 192 520 253 566 9 134 454 140 467 9 182 438 190 455 9 152 457 157 469 2 0 514 113 639 2 97 511 109 518 2 141 505 158 519 2 161 507 171 522 9 71 428 83 453 9 127 441 134 457 2 275 508 310 550 12 161 523 171 547 12 285 515 289 527 2 64 503 248 521 +1783 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251330.jpg 500 371 6 0 209 226 231 +1784 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314440.jpg 640 427 7 126 268 159 280 9 462 297 467 304 9 468 297 473 301 6 285 278 357 399 9 492 265 499 275 +1785 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293296.jpg 426 640 9 58 575 145 638 +1786 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365511.jpg 640 480 11 485 328 639 474 +1787 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038685.jpg 640 427 11 392 407 407 422 +1788 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509258.jpg 640 428 13 111 336 143 362 +1789 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401384.jpg 640 640 13 114 534 226 639 13 412 571 542 612 13 328 497 359 520 +1790 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086357.jpg 640 474 14 394 276 423 301 +1791 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284426.jpg 640 363 19 235 211 258 229 19 300 191 321 211 19 135 180 162 195 19 32 202 62 224 19 278 202 286 210 19 15 202 34 221 19 450 212 462 223 19 428 215 436 230 19 365 211 383 227 19 269 205 280 209 19 79 212 104 231 19 260 227 269 238 19 60 213 83 229 19 1 172 454 228 +1792 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388325.jpg 631 640 25 337 323 373 500 56 441 504 487 523 56 363 506 374 521 56 244 497 272 527 58 291 483 346 527 56 386 507 400 518 60 378 516 475 522 +1793 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242523.jpg 500 375 58 418 40 499 158 58 247 1 376 73 +1794 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324774.jpg 339 329 74 63 50 282 288 +1795 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524742.jpg 640 480 6 7 0 639 480 +1796 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087354.jpg 640 480 6 335 204 373 234 6 418 208 425 217 +1797 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415585.jpg 640 480 6 366 261 639 436 +1798 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010928.jpg 640 572 9 221 508 326 564 +1799 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412015.jpg 640 552 9 200 455 369 543 +1800 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262987.jpg 375 500 9 163 92 190 171 2 208 245 223 256 2 224 245 244 256 2 278 245 292 258 +1801 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327149.jpg 426 640 10 127 82 330 539 +1802 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361321.jpg 427 640 12 48 109 388 539 +1803 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420929.jpg 640 427 14 85 120 322 209 14 263 239 537 416 +1804 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373284.jpg 640 428 25 554 412 591 417 25 571 397 639 421 25 506 415 554 427 25 545 416 617 427 +1805 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546622.jpg 640 427 56 0 1 639 420 15 50 54 624 340 +1806 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035940.jpg 640 480 9 558 138 595 178 +1807 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185620.jpg 600 402 12 367 190 390 234 +1808 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375914.jpg 454 640 13 420 544 453 566 +1809 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000552507.jpg 640 480 0 237 366 317 478 +1810 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356456.jpg 640 399 6 125 110 452 317 6 427 179 608 271 +1811 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090062.jpg 640 425 19 59 126 418 395 +1812 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296136.jpg 480 640 10 166 97 324 479 +1813 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191296.jpg 640 427 10 304 30 490 426 +1814 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021588.jpg 500 333 10 39 81 167 325 +1815 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456420.jpg 480 640 11 163 23 341 193 +1816 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575957.jpg 640 427 16 87 159 620 352 59 0 238 639 418 +1817 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406053.jpg 500 333 16 225 240 270 274 0 292 153 368 270 26 278 210 328 280 +1818 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067532.jpg 500 436 16 53 145 267 335 16 230 223 410 335 56 441 220 496 428 0 121 4 456 427 60 430 269 479 310 +1819 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417846.jpg 640 360 16 328 138 459 222 16 213 139 377 258 62 450 63 569 145 56 606 196 639 273 56 14 106 213 277 65 96 287 177 359 60 2 257 257 354 41 0 320 49 359 +1820 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415798.jpg 640 425 16 120 192 173 226 8 64 114 82 124 8 190 268 635 302 0 96 133 500 280 8 111 50 132 123 8 152 119 174 124 8 191 122 208 127 37 14 221 204 231 +1821 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026908.jpg 640 427 16 124 169 614 317 54 491 263 536 294 +1822 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043850.jpg 333 500 16 135 385 206 468 0 86 181 232 454 37 112 257 304 335 +1823 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412240.jpg 500 375 16 148 47 410 292 +1824 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274470.jpg 640 426 16 382 266 436 305 8 0 207 181 320 8 27 214 359 299 8 102 197 518 275 8 195 183 638 255 0 556 157 565 182 0 545 157 554 182 0 280 198 286 208 +1825 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108761.jpg 640 480 16 226 0 526 465 58 0 1 237 452 58 174 366 306 479 +1826 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200572.jpg 427 640 16 144 440 284 606 57 28 183 184 456 27 256 210 289 299 0 117 83 426 540 73 399 238 424 328 73 414 246 424 339 73 417 87 426 194 73 397 330 419 452 73 403 95 420 193 73 401 352 426 457 +1827 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404602.jpg 640 480 16 356 274 520 392 59 21 209 613 474 74 316 240 327 252 75 264 207 304 255 +1828 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025989.jpg 640 428 16 2 83 394 340 29 386 292 471 350 +1829 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406976.jpg 500 400 16 211 182 432 299 16 46 179 238 267 57 0 97 499 399 65 469 208 494 244 73 19 127 35 158 26 0 295 111 392 73 4 131 25 162 73 25 115 57 161 73 0 123 32 134 73 0 136 17 164 +1830 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292330.jpg 640 512 16 175 30 632 324 34 135 279 516 309 +1831 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537604.jpg 640 480 16 279 121 445 268 55 151 273 290 364 41 61 263 107 329 60 0 215 537 473 41 29 327 113 426 +1832 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428366.jpg 480 640 16 106 364 188 468 2 197 242 266 274 2 142 246 209 275 2 406 234 479 285 2 120 247 144 275 0 263 145 396 464 0 23 215 114 417 29 315 277 358 287 2 371 235 415 283 13 253 247 289 272 +1833 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306395.jpg 640 480 16 133 113 322 336 15 352 147 514 291 59 108 84 594 425 +1834 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446990.jpg 640 427 16 48 72 231 213 24 547 398 634 422 0 178 200 313 346 0 173 281 370 426 0 365 235 485 421 0 450 220 589 426 0 515 88 592 317 0 566 72 613 383 0 391 262 406 283 0 0 227 122 400 0 422 265 430 294 0 413 260 424 286 0 599 27 639 421 24 44 391 85 407 56 518 363 603 412 56 389 374 458 414 56 420 280 429 292 24 144 364 179 411 0 341 283 348 291 0 312 278 324 294 60 51 328 69 407 +1835 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026734.jpg 640 427 16 111 228 160 357 16 47 232 117 363 0 520 189 584 353 0 398 41 543 361 0 161 70 260 370 28 196 215 307 383 28 344 221 450 370 +1836 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489940.jpg 480 640 16 73 1 456 631 +1837 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222317.jpg 640 480 16 223 197 450 286 57 98 96 639 474 65 0 427 19 440 +1838 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207509.jpg 640 444 16 65 108 579 438 29 161 216 447 409 +1839 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170278.jpg 640 504 16 122 143 598 479 59 4 127 638 494 +1840 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069077.jpg 640 512 16 382 235 627 491 56 124 202 323 496 56 2 278 74 492 60 2 224 216 482 +1841 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311961.jpg 640 475 16 73 25 420 330 59 203 231 594 469 +1842 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102598.jpg 500 333 16 307 106 363 198 29 290 95 312 104 +1843 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059652.jpg 640 428 16 208 122 548 398 58 513 219 639 339 29 83 26 171 61 +1844 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048731.jpg 640 360 16 158 55 397 260 16 369 27 589 271 29 303 225 384 273 +1845 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399655.jpg 500 375 16 15 26 499 333 57 0 1 500 371 +1846 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360128.jpg 481 640 16 118 43 370 582 29 178 162 301 357 +1847 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537636.jpg 500 375 16 190 0 499 370 77 0 160 371 374 +1848 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112830.jpg 640 480 16 186 379 292 421 17 126 104 456 374 0 163 53 247 401 +1849 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183199.jpg 640 426 16 168 13 488 312 16 16 252 197 388 57 0 140 600 425 73 188 374 282 412 +1850 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444755.jpg 640 640 16 447 404 639 631 0 52 179 575 639 27 493 503 621 632 73 326 300 399 314 73 506 372 520 409 73 341 385 417 442 73 17 449 28 506 73 621 393 639 464 73 334 344 400 354 73 521 374 541 406 73 471 436 507 464 73 483 380 499 419 73 500 377 508 420 73 543 376 548 407 73 549 369 553 407 73 561 370 570 412 73 318 281 398 298 73 0 109 639 534 +1851 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559778.jpg 500 375 16 95 86 499 292 16 249 14 359 92 57 0 0 264 252 0 427 224 499 361 77 107 142 232 255 73 405 13 430 69 73 434 13 458 75 +1852 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154053.jpg 640 427 16 436 276 463 339 0 484 120 600 368 +1853 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008350.jpg 640 430 16 373 93 599 192 37 4 0 209 429 +1854 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215554.jpg 459 640 16 19 5 458 491 77 11 322 310 630 +1855 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099996.jpg 500 326 16 153 0 324 286 32 223 255 276 314 +1856 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101567.jpg 500 375 16 105 108 317 212 47 348 117 484 244 58 306 0 443 229 +1857 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289716.jpg 500 333 16 161 64 326 207 29 80 5 202 126 +1858 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329447.jpg 640 505 16 466 336 631 454 19 295 146 489 458 19 185 114 317 440 19 75 118 272 449 19 3 134 79 449 +1859 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156025.jpg 640 360 16 139 65 507 288 59 39 41 620 283 +1860 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165035.jpg 640 364 16 39 220 146 311 17 154 17 611 317 0 577 36 639 102 +1861 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303314.jpg 640 426 16 0 74 582 421 29 384 337 620 409 +1862 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337274.jpg 500 344 16 165 101 485 326 25 13 17 463 315 +1863 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459733.jpg 640 428 16 489 109 519 142 14 144 201 159 220 14 89 196 103 211 0 450 51 496 147 37 387 137 555 150 +1864 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024247.jpg 480 640 16 99 325 391 427 16 2 497 231 626 0 152 4 397 360 62 292 2 420 101 +1865 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026671.jpg 480 640 16 21 104 433 519 51 175 372 458 491 +1866 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227227.jpg 500 334 16 200 144 286 303 2 0 71 498 328 0 433 77 499 256 0 70 151 208 293 0 367 56 408 93 +1867 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145781.jpg 640 480 16 3 0 603 340 39 311 202 639 479 39 0 166 96 304 +1868 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165752.jpg 335 500 16 16 95 252 424 29 183 91 281 192 +1869 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151585.jpg 640 480 16 8 33 532 458 1 108 2 638 277 +1870 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490171.jpg 640 427 16 275 231 384 308 0 55 247 292 309 37 181 281 458 313 +1871 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179069.jpg 640 427 16 266 203 324 265 0 368 211 395 238 37 220 238 333 280 37 321 234 348 244 +1872 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181969.jpg 573 640 16 18 23 572 632 57 2 0 572 626 +1873 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572042.jpg 428 640 16 45 269 244 528 0 185 54 423 639 27 289 261 335 404 +1874 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028874.jpg 640 480 16 9 26 635 469 56 0 200 85 471 57 1 2 639 412 +1875 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123867.jpg 640 480 16 218 147 377 292 0 350 0 401 94 0 241 1 317 167 29 356 211 386 289 56 535 0 561 25 +1876 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297830.jpg 512 640 16 161 59 474 543 39 118 431 164 596 +1877 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378403.jpg 640 426 16 125 106 506 312 59 0 21 640 420 +1878 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179392.jpg 480 640 16 112 49 477 546 62 61 1 479 261 66 389 430 479 566 73 0 286 140 487 73 1 116 93 271 15 117 42 479 592 +1879 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032677.jpg 458 640 16 16 227 428 612 59 1 256 457 639 15 25 89 159 236 +1880 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143792.jpg 640 427 16 289 64 607 413 29 71 146 243 227 +1881 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327845.jpg 500 333 16 19 2 457 274 57 119 0 499 135 55 17 187 129 304 59 264 155 495 327 +1882 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212470.jpg 640 628 16 178 451 258 603 16 146 442 285 534 17 198 241 534 510 0 355 291 426 520 0 270 284 353 519 0 341 230 389 364 27 307 323 321 364 +1883 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385997.jpg 640 480 16 296 299 413 395 58 461 147 599 300 56 356 141 487 287 32 203 340 214 351 32 215 372 226 383 39 447 445 467 478 39 507 421 528 467 59 294 285 424 425 75 549 235 572 266 +1884 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403315.jpg 640 480 16 400 112 461 229 29 407 172 451 208 +1885 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498346.jpg 500 375 16 139 128 362 310 29 124 250 170 295 +1886 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483587.jpg 640 427 16 108 227 472 418 35 73 358 191 426 +1887 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149568.jpg 640 549 16 125 114 453 483 16 102 115 354 294 0 145 0 328 396 29 82 161 130 191 +1888 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086215.jpg 640 425 16 17 58 357 420 15 363 246 490 313 73 109 0 125 70 73 118 0 136 72 73 52 25 82 71 73 34 0 54 78 59 277 277 639 417 73 94 0 115 69 +1889 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515777.jpg 640 480 16 161 205 337 309 16 313 266 481 467 57 100 147 612 473 0 189 179 392 454 65 338 227 372 246 65 475 324 518 347 73 279 139 302 150 73 289 135 334 150 +1890 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082807.jpg 640 601 16 123 74 516 478 56 74 183 472 451 60 0 405 640 590 55 287 483 444 591 +1891 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413616.jpg 640 429 16 266 175 637 379 29 22 94 109 137 +1892 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209286.jpg 640 480 16 1 9 587 402 51 415 312 443 331 +1893 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045176.jpg 500 374 16 200 244 486 370 16 62 5 227 322 +1894 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151962.jpg 640 479 16 342 239 449 358 2 65 97 470 470 0 53 378 90 468 +1895 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123964.jpg 640 512 16 106 288 318 485 0 385 57 547 419 0 266 37 414 398 0 148 50 315 326 0 65 8 197 323 34 177 267 389 401 39 77 265 92 319 +1896 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324500.jpg 640 480 16 146 281 209 330 0 12 97 94 275 37 121 306 462 340 37 0 221 148 314 0 266 146 339 328 +1897 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386119.jpg 640 428 58 500 185 522 231 58 230 189 292 246 58 191 178 229 255 58 522 173 545 209 8 54 96 554 342 0 590 97 601 130 0 597 96 616 132 58 273 134 285 161 58 210 160 245 225 58 361 96 385 135 58 283 136 296 152 58 294 133 305 151 58 512 182 534 223 58 534 171 559 211 8 480 94 572 166 58 277 200 293 241 58 128 106 365 251 +1898 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230780.jpg 640 427 58 504 69 616 167 74 514 147 526 161 0 345 25 572 417 27 441 128 481 149 39 294 285 342 426 39 247 290 296 426 39 265 282 296 364 39 94 383 126 426 39 26 393 54 426 39 286 158 329 255 39 177 286 207 379 39 140 297 194 420 39 197 292 247 426 39 288 49 303 104 39 304 51 317 106 39 317 53 329 106 39 331 52 344 106 39 125 51 472 268 +1899 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005804.jpg 457 640 58 232 19 311 129 15 54 118 208 218 56 5 233 365 631 63 185 74 429 283 66 227 203 370 249 56 299 3 455 240 +1900 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000599.jpg 640 407 58 528 5 639 242 15 0 37 412 402 57 0 1 619 401 65 439 198 618 285 65 389 167 587 227 +1901 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309044.jpg 640 427 58 96 1 273 71 58 479 34 498 53 58 549 20 576 48 58 580 8 607 54 58 501 30 523 42 58 58 0 122 21 15 287 152 352 250 15 390 103 450 127 57 528 51 639 421 57 293 35 639 220 56 0 111 175 328 60 1 120 168 334 56 0 21 107 113 58 512 0 552 37 75 219 32 251 68 75 134 33 147 56 +1902 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390322.jpg 640 640 58 4 180 291 511 15 302 274 598 536 75 4 285 231 523 75 207 2 303 202 +1903 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038645.jpg 478 640 58 181 412 294 524 56 401 399 477 570 25 12 90 477 449 41 288 480 323 533 +1904 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152208.jpg 640 427 58 309 301 472 407 25 300 86 559 152 13 302 333 321 357 13 482 333 523 361 58 328 134 426 299 +1905 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409100.jpg 640 480 58 105 214 224 292 58 19 262 89 420 58 149 330 173 370 0 108 81 493 473 56 371 173 476 338 27 293 243 348 467 58 115 274 161 327 56 450 202 613 478 58 165 280 188 323 60 504 385 639 473 +1906 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010779.jpg 532 640 62 125 0 362 158 0 43 24 503 630 27 213 216 323 612 57 481 372 531 554 63 394 506 471 547 +1907 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309692.jpg 640 480 62 385 125 424 159 0 461 189 498 349 0 424 184 467 369 0 385 188 406 197 28 196 353 287 411 28 187 267 263 316 28 190 292 287 360 28 364 274 447 348 24 487 221 520 270 +1908 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035738.jpg 512 640 62 0 327 129 542 0 114 91 378 637 27 217 216 288 510 +1909 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344197.jpg 640 480 14 223 198 234 202 14 228 195 233 198 14 287 186 290 188 14 41 274 50 281 14 43 274 54 282 14 206 237 222 248 14 239 192 245 197 20 15 291 114 348 20 322 293 380 340 20 292 266 374 331 20 371 227 616 391 20 255 313 307 385 14 225 244 238 252 14 141 165 147 169 20 145 246 278 400 20 266 250 297 305 14 39 181 299 296 +1910 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186422.jpg 640 427 14 498 276 561 347 21 188 107 453 305 +1911 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572517.jpg 640 424 14 154 191 590 401 21 145 72 338 245 +1912 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247306.jpg 640 427 14 565 48 582 54 14 477 161 478 162 14 248 16 261 20 14 355 93 363 102 8 170 230 179 240 8 0 213 169 254 8 154 196 269 219 8 267 185 581 306 8 444 183 485 212 0 435 154 639 422 0 475 247 482 260 0 500 250 507 268 0 507 254 511 267 0 515 254 520 271 0 535 256 539 270 0 544 257 552 275 0 551 258 557 276 8 54 200 133 216 0 481 251 487 270 0 569 261 575 278 0 522 255 528 270 14 17 38 33 43 14 71 114 83 119 14 105 93 112 97 14 250 142 256 146 0 492 248 500 268 14 252 90 265 98 0 486 251 491 270 0 311 205 584 275 +1913 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060823.jpg 640 480 14 363 434 426 476 19 443 119 565 314 19 23 279 184 374 0 168 38 268 219 19 380 269 632 393 45 160 218 188 232 45 114 217 137 228 45 138 220 163 229 45 99 212 123 228 45 137 213 172 217 45 115 204 139 216 45 138 205 173 211 45 130 179 151 187 45 140 191 151 198 14 254 377 280 433 14 263 345 310 394 14 393 76 451 133 14 388 129 403 155 14 228 292 243 321 14 274 328 298 363 14 376 297 404 318 14 413 278 429 288 14 554 76 607 118 14 588 189 623 214 14 188 304 229 332 45 138 217 170 220 0 38 52 127 200 14 252 304 280 321 14 211 119 616 437 +1914 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120248.jpg 500 333 14 309 103 321 108 8 120 153 380 260 8 0 189 56 206 0 261 215 276 226 0 321 212 327 222 0 303 213 310 224 0 308 212 317 222 0 294 214 299 225 0 287 214 294 226 0 273 216 279 227 0 280 213 287 225 0 283 209 287 218 0 356 190 366 216 0 324 212 330 221 0 297 214 300 225 0 292 217 295 225 8 416 195 439 202 +1915 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535226.jpg 500 375 15 128 122 372 235 +1916 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173832.jpg 640 480 15 87 35 429 367 64 163 277 238 377 +1917 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318722.jpg 500 375 15 138 155 331 273 72 119 0 312 230 69 75 43 382 369 +1918 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045197.jpg 640 480 15 0 38 395 404 59 0 0 443 474 63 382 0 637 473 +1919 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394157.jpg 427 369 15 97 63 328 311 74 55 22 370 340 +1920 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313593.jpg 640 480 15 394 70 639 335 63 0 1 616 403 59 0 184 640 479 +1921 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441974.jpg 640 480 15 171 200 639 400 74 103 220 179 314 +1922 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449888.jpg 640 480 15 0 1 591 447 65 258 325 626 479 56 3 1 633 460 +1923 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403639.jpg 640 480 15 285 0 590 329 63 473 45 639 479 73 181 167 287 224 63 22 278 273 427 66 497 373 639 479 59 34 283 506 479 +1924 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350851.jpg 480 640 15 74 119 310 396 39 222 406 322 622 39 116 392 216 627 72 1 0 479 627 16 74 117 310 402 +1925 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073729.jpg 640 427 15 0 0 560 280 66 0 248 639 426 +1926 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255244.jpg 500 375 15 1 39 474 365 57 0 191 477 356 58 266 26 303 88 74 36 78 61 105 +1927 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229631.jpg 480 640 15 148 89 314 259 58 304 227 479 402 69 104 418 472 638 +1928 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100000.jpg 640 480 15 1 0 500 307 65 217 229 478 426 +1929 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407960.jpg 640 426 15 55 158 354 376 45 198 105 282 160 69 372 1 639 422 +1930 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488386.jpg 500 376 15 138 24 498 343 63 2 0 459 367 66 160 249 426 368 +1931 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445267.jpg 640 480 15 227 129 355 318 59 0 0 640 480 77 207 269 527 471 77 1 111 65 477 77 9 183 250 446 +1932 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488979.jpg 640 335 19 557 266 600 291 19 475 256 489 268 19 590 270 630 303 19 460 250 472 258 19 429 247 433 251 19 582 247 588 253 19 589 245 593 248 19 521 247 524 251 19 544 255 569 267 19 492 248 495 252 19 552 249 557 253 19 629 242 632 246 +1933 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240754.jpg 640 427 19 203 79 463 365 19 469 63 638 315 19 22 195 188 293 +1934 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105367.jpg 640 480 19 119 225 152 272 19 445 221 515 271 19 519 221 634 281 19 179 221 317 302 19 316 216 442 282 19 339 234 463 318 19 92 223 117 245 19 143 225 195 278 19 19 224 48 269 19 32 229 130 315 +1935 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216235.jpg 480 640 19 0 239 233 595 19 363 219 436 315 +1936 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158999.jpg 640 427 19 145 297 191 325 19 200 294 227 309 19 227 293 234 304 19 163 292 174 298 19 44 299 71 317 19 73 295 79 301 19 98 296 118 308 19 7 297 25 306 19 187 291 204 301 19 114 293 126 299 19 137 292 155 301 19 78 299 121 325 19 420 315 438 321 19 1 289 639 323 +1937 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104002.jpg 640 478 19 288 148 310 190 19 379 139 412 187 19 492 122 513 151 19 548 117 565 135 19 451 117 461 127 19 342 116 355 128 19 297 116 315 129 19 147 118 187 142 19 11 119 51 142 19 624 144 640 193 19 270 180 310 288 19 273 138 295 179 19 293 141 321 187 +1938 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136740.jpg 640 428 19 239 154 608 362 19 109 258 260 350 +1939 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350491.jpg 640 480 19 24 205 336 425 +1940 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224093.jpg 640 316 19 404 133 460 166 19 327 116 373 153 19 147 116 190 145 19 22 136 94 187 19 236 118 251 145 19 414 118 430 142 19 263 127 271 135 +1941 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041635.jpg 640 480 19 4 166 248 344 19 1 255 32 333 19 208 164 414 324 19 331 147 638 307 +1942 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222863.jpg 640 427 19 146 1 388 425 +1943 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429369.jpg 640 480 19 449 301 485 350 19 507 269 518 291 19 504 256 516 268 19 125 296 155 322 19 115 273 130 283 19 85 265 98 276 19 149 275 165 286 19 231 283 245 290 19 371 287 379 306 19 288 283 301 293 19 484 267 500 272 19 607 238 617 246 19 235 292 313 350 19 241 245 568 311 +1944 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503972.jpg 640 559 39 37 182 81 331 27 231 346 344 558 0 3 1 639 551 39 112 52 144 137 +1945 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074037.jpg 640 426 39 542 201 570 264 39 524 203 530 209 39 567 209 594 257 27 443 212 506 421 0 129 9 425 425 0 349 28 639 420 39 578 365 619 424 60 571 273 611 308 +1946 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316879.jpg 640 427 39 166 337 191 415 25 151 71 364 282 25 458 26 565 64 24 52 276 165 417 24 395 211 485 274 24 0 184 76 232 26 188 48 207 71 26 62 174 158 227 0 0 55 50 152 0 25 53 134 188 0 355 42 396 92 0 338 77 422 247 0 129 18 166 95 0 113 49 150 89 0 582 79 639 188 0 125 0 207 139 0 238 0 272 58 0 489 39 632 319 0 603 0 639 39 26 277 0 311 48 26 299 168 396 240 0 410 105 497 257 24 262 324 379 420 24 471 100 523 198 24 610 181 639 272 24 115 110 159 173 24 275 0 309 43 24 78 182 158 228 26 236 282 353 380 28 166 275 356 403 28 477 101 523 196 0 159 64 224 154 0 1 0 367 122 +1947 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540414.jpg 640 480 39 407 408 423 456 5 585 178 634 208 25 338 183 384 199 25 384 166 460 189 25 16 149 194 264 25 185 165 278 191 0 228 189 282 280 0 217 256 283 368 0 293 185 339 333 0 77 230 116 272 0 172 198 211 256 0 389 205 431 311 0 164 199 179 244 0 367 309 465 440 0 606 204 627 228 0 340 198 366 271 0 469 296 601 429 0 481 285 541 354 0 475 280 511 322 26 310 210 328 231 45 97 304 149 330 45 177 286 205 305 45 462 319 478 334 0 48 186 612 388 +1948 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519387.jpg 640 424 39 548 304 570 329 0 320 215 411 419 0 430 256 498 421 0 429 300 556 407 0 146 33 268 408 0 289 246 332 324 0 258 291 334 407 0 586 229 629 393 0 521 222 607 423 25 90 0 328 190 25 259 172 400 227 0 436 266 465 308 0 278 243 304 291 0 386 258 419 334 39 563 308 572 324 1 410 341 462 420 +1949 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553353.jpg 425 640 39 142 1 257 131 27 156 200 333 514 0 37 41 424 639 +1950 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015968.jpg 513 640 57 4 222 511 632 27 237 274 265 510 0 25 84 481 639 +1951 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159269.jpg 427 640 56 330 418 391 507 56 66 417 321 609 56 8 414 72 497 56 71 397 108 460 56 180 384 222 433 56 240 392 273 429 56 260 383 277 435 56 0 394 33 470 56 296 382 318 419 56 307 374 327 396 60 152 431 266 564 60 179 394 246 434 25 14 204 88 529 25 107 266 133 437 25 232 275 266 394 25 250 234 317 444 25 323 153 426 442 56 157 393 200 438 60 26 413 80 426 60 0 414 79 431 8 209 339 229 346 8 184 339 206 342 8 199 332 214 336 8 220 334 236 338 8 235 338 245 345 8 9 332 24 342 8 89 332 110 338 8 0 329 10 337 60 314 406 335 483 60 315 385 328 391 8 152 331 162 334 8 167 332 180 335 8 145 338 162 343 8 17 325 27 333 8 132 320 331 356 +1952 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480379.jpg 640 516 56 444 179 542 289 8 186 148 621 438 0 403 103 461 239 8 107 159 189 207 +1953 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174679.jpg 640 480 56 289 199 460 403 8 1 173 96 203 8 505 107 552 121 8 91 111 112 119 8 34 104 54 118 8 98 63 465 350 8 0 116 8 121 8 459 71 481 98 8 516 91 528 97 8 576 84 595 98 8 600 86 627 99 8 547 87 572 98 +1954 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411405.jpg 640 477 56 336 156 636 469 64 280 262 339 292 66 175 268 337 439 77 353 194 574 457 73 622 323 636 394 73 617 353 626 396 73 612 363 619 395 62 1 102 168 315 67 294 221 316 265 73 605 362 611 397 67 417 360 453 401 +1955 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408255.jpg 500 333 57 1 169 498 286 27 200 168 272 328 0 22 4 461 332 +1956 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172877.jpg 640 480 57 0 287 148 473 57 262 295 561 478 27 295 188 321 298 0 105 67 506 473 39 611 94 639 151 39 602 101 613 151 74 579 144 639 172 74 371 289 389 303 +1957 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221094.jpg 640 429 1 229 191 432 339 2 0 141 259 319 2 428 154 572 315 0 335 132 429 317 0 295 110 387 315 24 268 206 311 293 28 424 250 538 348 26 399 218 443 262 58 407 131 460 165 58 6 54 108 138 58 238 23 415 217 58 529 53 572 116 +1958 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521689.jpg 480 640 1 36 172 141 258 2 273 145 479 232 0 130 81 296 489 0 63 115 129 235 0 244 125 282 184 0 134 135 163 169 0 461 146 477 173 28 249 309 415 561 0 391 133 401 145 2 106 151 132 167 1 21 170 30 184 11 106 32 132 67 +1959 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137451.jpg 640 360 1 448 199 477 221 2 55 188 141 224 2 554 186 638 228 2 275 194 382 237 0 229 179 258 263 0 256 191 282 253 0 289 179 318 266 0 319 172 353 264 0 473 195 507 297 0 547 190 570 220 0 463 185 479 200 25 299 163 340 176 25 256 182 284 192 24 300 197 318 229 26 223 229 234 248 9 429 110 440 146 9 243 151 249 163 0 211 183 218 197 0 345 184 352 199 0 191 184 198 201 0 131 181 138 203 26 270 200 282 217 26 345 191 354 227 2 39 183 64 196 2 16 177 39 192 25 442 178 455 185 26 500 222 516 242 2 92 184 137 203 25 300 179 318 192 +1960 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195079.jpg 640 427 1 474 126 502 169 2 146 101 388 193 28 442 246 639 426 28 259 170 446 382 28 35 182 334 388 28 156 333 286 424 28 249 376 396 426 +1961 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127775.jpg 640 360 1 454 251 471 282 2 0 224 326 335 0 560 191 588 228 3 389 227 413 285 20 123 1 387 355 1 567 221 588 274 1 451 228 498 281 1 510 236 546 279 1 372 230 414 287 1 531 219 570 276 1 408 227 446 286 1 495 227 517 277 1 0 244 32 270 +1962 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102466.jpg 500 332 2 33 51 71 61 2 249 51 273 64 8 93 97 383 181 2 65 44 77 50 2 103 48 124 58 2 133 50 151 64 2 16 48 35 60 7 81 39 97 50 2 189 48 200 54 2 323 52 352 63 2 293 52 309 62 2 88 47 108 60 2 0 48 17 60 2 116 50 131 62 2 159 46 177 54 2 6 43 418 68 +1963 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293785.jpg 640 480 2 441 426 633 474 7 0 315 335 473 +1964 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277227.jpg 640 480 2 446 79 558 108 8 143 133 572 414 8 0 149 640 479 8 114 308 264 376 +1965 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107183.jpg 640 426 2 519 301 592 341 3 549 318 579 353 0 449 222 471 246 0 338 207 371 233 25 569 279 613 299 20 15 248 213 405 20 283 261 421 380 20 429 259 512 360 0 551 290 579 339 0 542 295 549 302 0 219 301 235 358 0 246 298 262 357 0 173 304 193 351 0 418 302 426 318 2 617 297 639 330 0 133 172 154 219 3 47 342 112 389 0 600 295 621 337 0 424 301 431 314 +1966 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393497.jpg 640 480 2 460 227 561 294 2 508 227 562 254 2 365 236 394 250 5 0 204 90 294 0 254 255 306 427 0 137 250 187 393 0 0 256 40 395 0 329 233 355 304 0 74 219 83 243 27 275 286 281 312 27 153 278 157 296 0 352 235 363 300 +1967 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412437.jpg 640 480 2 173 181 201 256 3 131 201 196 280 5 222 18 636 432 5 3 5 141 192 0 335 148 470 473 0 4 75 149 474 0 142 169 171 260 0 564 159 612 221 25 278 77 461 176 0 468 160 507 216 0 268 166 280 198 +1968 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109819.jpg 640 480 2 482 232 501 254 3 220 283 291 396 3 69 237 124 318 3 453 250 472 280 3 471 253 481 277 3 591 251 605 270 3 578 243 592 254 5 193 159 372 295 0 71 214 120 305 0 217 223 290 352 0 383 107 411 133 0 495 218 554 380 0 277 225 326 341 0 485 237 524 359 20 353 172 435 321 0 219 196 244 217 0 471 235 481 269 9 609 210 614 229 0 257 198 280 227 0 500 235 513 252 0 453 233 478 270 7 510 207 558 265 7 432 230 462 265 0 108 219 129 298 +1969 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034930.jpg 600 550 2 136 192 492 364 3 336 219 388 271 0 456 176 567 523 0 24 219 133 504 0 369 215 396 279 25 11 190 164 229 25 373 205 408 218 9 143 56 161 92 26 117 302 162 370 26 499 397 553 533 25 325 208 363 218 26 31 270 57 344 2 13 226 38 243 7 44 172 148 265 7 0 197 32 239 25 264 201 300 219 2 553 209 599 285 0 334 217 361 255 +1970 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440486.jpg 640 480 2 487 163 526 175 8 375 184 531 295 8 271 218 466 293 7 1 246 202 447 0 396 212 405 222 +1971 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551669.jpg 500 339 2 243 180 290 212 8 0 97 173 228 8 221 128 279 181 8 280 158 344 180 8 189 114 225 162 8 265 124 304 156 8 293 138 317 149 8 333 144 381 165 8 314 140 344 158 8 142 107 203 207 8 280 148 324 162 2 391 161 409 168 2 380 163 393 173 +1972 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475244.jpg 640 478 2 607 359 620 368 2 596 360 604 367 2 569 426 586 438 8 151 169 175 182 8 231 176 281 201 8 371 240 418 261 8 377 202 417 213 8 234 127 239 129 8 473 96 492 103 8 405 116 418 120 8 385 307 408 322 8 49 152 70 160 2 629 343 635 351 8 88 173 115 186 8 140 203 164 215 9 373 421 377 428 2 580 381 595 392 8 487 239 513 252 8 41 77 639 369 +1973 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155811.jpg 640 427 3 409 66 473 139 3 510 78 584 130 3 368 65 395 115 25 340 137 452 235 25 179 114 261 166 25 490 143 604 206 25 573 116 638 157 25 501 120 590 163 25 214 37 258 56 0 1 140 179 426 0 166 162 227 308 0 227 124 282 313 0 463 195 548 306 0 567 158 639 426 0 277 68 302 147 0 325 61 361 144 0 215 30 251 116 0 539 201 580 383 0 617 66 639 128 0 180 62 198 118 3 467 82 512 142 3 597 87 630 124 26 437 221 468 273 26 279 77 300 108 0 386 176 469 389 26 540 243 577 300 3 0 58 44 121 +1974 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293895.jpg 500 375 3 169 324 307 370 3 1 303 37 359 0 295 279 329 355 0 388 268 412 349 0 90 270 116 342 25 160 240 243 333 25 236 243 341 265 25 8 225 114 319 25 323 239 431 260 24 99 287 109 307 26 317 303 329 322 0 286 267 302 343 0 373 299 399 360 0 220 276 268 374 0 161 272 172 294 39 330 309 335 321 39 357 306 361 321 58 176 166 196 185 +1975 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449432.jpg 640 427 5 3 104 604 289 28 167 275 203 306 0 97 178 169 310 0 203 181 259 352 0 272 188 308 340 8 603 106 639 196 24 308 197 585 307 26 358 201 377 266 0 338 180 368 330 0 379 177 421 319 0 429 172 477 323 0 507 180 540 301 0 474 187 508 309 0 579 181 633 305 0 288 188 358 357 0 524 197 556 297 0 414 186 440 306 +1976 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384188.jpg 480 640 6 4 4 475 205 28 154 314 320 546 +1977 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503823.jpg 500 333 8 175 120 379 223 8 186 110 499 257 8 350 128 493 175 8 418 125 464 153 +1978 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251888.jpg 640 427 8 133 207 231 345 +1979 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160772.jpg 640 512 8 84 133 556 267 0 159 217 166 231 0 165 218 173 227 0 259 223 269 231 0 305 220 320 230 0 334 221 342 229 0 461 217 465 224 0 185 224 192 232 0 233 222 244 230 0 272 222 280 230 0 254 220 262 228 +1980 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288114.jpg 640 457 8 159 218 275 253 8 204 68 436 158 0 189 222 198 242 0 205 219 215 236 0 215 215 232 234 0 196 217 201 237 0 167 226 173 239 +1981 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099961.jpg 640 480 8 96 153 563 266 +1982 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414216.jpg 640 428 8 209 162 276 187 0 408 262 417 275 8 472 175 482 180 0 515 252 570 307 +1983 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281722.jpg 480 640 8 162 206 451 551 +1984 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026430.jpg 640 427 8 60 93 80 118 8 362 99 368 105 25 336 135 580 352 0 544 210 556 235 0 603 204 619 237 0 511 211 544 246 0 275 197 309 237 0 120 185 134 211 0 302 149 311 166 0 557 149 567 166 56 166 194 194 244 0 616 173 639 241 0 325 153 334 163 0 187 175 228 226 0 219 202 246 232 56 217 212 245 232 56 274 228 295 248 0 588 153 603 168 +1985 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177856.jpg 640 426 8 52 0 632 426 0 200 69 296 150 0 281 86 375 154 0 392 83 463 143 0 462 65 547 144 0 469 37 576 134 0 186 65 243 143 0 287 56 360 131 +1986 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017667.jpg 640 480 8 25 238 605 316 0 516 237 551 282 0 58 216 64 228 16 488 270 516 298 +1987 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147921.jpg 640 349 8 62 196 150 229 0 487 208 507 246 0 356 213 365 240 0 256 212 266 241 0 304 213 312 239 0 28 212 35 221 1 491 226 515 250 14 59 234 63 237 14 73 241 75 245 14 13 241 17 247 14 26 238 31 241 14 92 240 94 245 14 110 240 112 244 14 128 239 131 244 +1988 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213033.jpg 480 640 8 401 272 444 282 0 122 182 340 632 25 23 139 333 311 8 450 216 479 284 8 20 258 40 270 8 4 265 19 268 +1989 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199125.jpg 640 432 8 34 184 289 362 8 283 185 639 395 8 283 184 342 194 0 139 111 208 188 0 468 145 505 195 0 337 189 392 232 0 417 182 482 318 0 512 156 537 191 0 226 144 282 217 0 215 158 241 169 0 127 172 147 189 +1990 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335861.jpg 640 431 8 69 54 483 243 +1991 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329421.jpg 640 640 8 227 355 583 526 13 56 322 214 404 13 321 399 553 433 60 99 320 168 373 +1992 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502168.jpg 640 458 8 405 133 639 448 0 432 232 470 334 0 438 337 523 457 0 514 316 564 426 0 474 256 510 350 0 591 123 608 167 8 50 78 109 105 8 552 60 614 109 8 278 132 293 143 8 378 85 387 101 0 288 132 290 135 0 285 132 287 134 0 558 287 612 442 0 281 131 284 136 +1993 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410612.jpg 500 334 8 174 193 299 241 +1994 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003326.jpg 640 480 8 166 201 535 354 0 203 194 284 290 0 394 160 516 317 8 3 101 98 145 8 0 93 192 141 8 431 102 624 159 +1995 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041924.jpg 640 437 8 403 40 529 288 8 264 70 406 291 8 146 86 299 308 8 524 184 596 249 8 56 161 242 305 0 188 176 200 186 0 533 174 542 184 2 53 207 76 215 8 572 84 639 242 +1996 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208283.jpg 480 640 8 2 363 473 555 0 253 104 419 568 +1997 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186873.jpg 612 612 8 92 220 611 281 0 207 205 228 231 0 223 202 250 233 0 340 198 367 241 0 265 203 289 234 0 290 208 310 235 0 311 204 345 245 0 167 213 200 235 0 245 205 264 234 0 107 196 125 222 +1998 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350694.jpg 500 336 8 293 277 419 309 8 113 246 209 303 8 250 268 396 290 0 281 251 300 279 8 260 194 499 274 0 110 227 117 247 0 235 227 244 247 0 299 249 317 277 0 271 227 278 243 0 255 230 262 241 8 444 288 499 329 25 268 186 306 204 25 404 105 430 129 25 390 143 420 166 25 331 163 374 194 25 213 162 247 181 0 272 252 283 276 0 283 231 304 262 0 440 271 464 314 0 166 216 173 246 8 205 264 252 295 8 0 249 94 302 0 354 242 380 271 0 259 217 267 229 8 200 248 274 261 0 201 227 209 244 25 253 197 282 219 25 331 147 370 166 25 218 191 250 212 25 250 184 273 201 25 286 194 331 221 25 213 150 232 167 25 200 194 225 225 25 224 197 260 222 25 79 147 101 162 0 3 160 474 296 25 61 107 499 205 +1999 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179229.jpg 500 354 8 336 224 455 281 0 30 182 34 191 +2000 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377080.jpg 640 428 8 287 202 382 258 0 577 128 585 138 0 383 127 388 133 0 366 124 374 133 0 350 125 355 130 0 333 123 337 133 0 314 121 320 132 0 302 122 307 136 0 566 131 572 137 0 436 125 443 134 0 344 124 350 138 0 329 126 334 137 0 294 122 297 127 0 244 120 416 220 +2001 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044309.jpg 640 480 8 250 328 579 446 +2002 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491836.jpg 640 425 8 70 252 91 277 8 226 265 231 270 8 317 268 321 271 8 456 266 459 267 +2003 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513507.jpg 640 480 8 369 277 430 294 8 466 224 532 321 8 466 251 473 255 8 330 212 355 256 8 291 221 308 252 8 29 297 95 314 8 140 243 150 250 8 525 250 534 253 8 557 241 562 244 8 617 240 627 245 0 84 296 91 305 +2004 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433804.jpg 640 424 8 359 117 592 286 0 535 214 557 242 0 435 199 453 226 0 400 176 418 189 0 503 224 515 234 0 481 227 499 246 0 517 219 535 243 0 500 217 524 244 0 515 214 524 227 +2005 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200457.jpg 640 428 8 296 265 523 423 8 501 282 638 409 8 24 348 291 427 8 2 266 300 399 8 187 257 347 310 8 7 280 193 356 0 347 223 370 273 0 450 237 489 302 0 158 247 189 290 0 131 223 158 289 0 34 235 74 309 0 611 246 635 313 +2006 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484321.jpg 480 640 8 0 381 332 542 8 356 448 393 460 0 345 444 358 463 +2007 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077184.jpg 640 428 8 186 128 478 309 0 410 219 414 231 0 255 214 273 224 0 366 221 371 230 0 400 224 406 231 0 436 225 443 234 0 442 226 449 248 0 452 228 461 237 0 386 225 392 230 0 375 223 381 229 0 421 227 429 232 0 340 225 345 232 +2008 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133233.jpg 640 361 8 250 237 326 275 8 220 227 243 248 8 438 231 478 241 8 164 220 179 231 8 396 227 432 238 8 359 202 404 243 8 411 204 499 227 8 212 216 231 226 8 504 165 635 255 8 390 238 428 251 8 417 222 446 235 8 64 207 93 227 8 131 217 162 243 8 16 186 573 258 +2009 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292822.jpg 640 349 8 470 0 639 269 0 486 170 509 204 0 508 195 536 218 0 594 189 610 205 0 539 190 559 215 0 531 71 552 155 0 612 192 639 225 0 586 84 608 116 0 610 175 626 221 0 520 80 542 121 0 562 75 590 104 0 618 148 639 192 0 490 194 511 216 0 468 182 486 207 +2010 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467540.jpg 500 333 8 201 170 476 286 0 340 159 384 227 25 323 134 397 173 +2011 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499393.jpg 640 425 8 232 178 498 245 0 434 200 444 211 0 381 202 387 209 0 336 203 342 208 0 400 202 409 210 0 320 200 336 208 0 365 200 376 208 0 417 200 426 209 0 315 202 317 207 0 279 198 289 207 0 308 202 315 207 0 351 200 358 208 0 302 203 306 208 +2012 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187036.jpg 427 640 8 265 496 362 556 0 57 503 75 551 0 41 499 47 512 0 0 501 10 557 0 73 499 76 515 0 24 499 27 509 0 84 498 92 526 8 374 475 419 508 0 27 499 35 528 0 82 497 85 505 0 42 501 62 556 0 185 437 193 466 0 16 499 24 522 0 201 435 209 455 8 105 467 275 576 8 66 22 341 514 0 63 498 66 505 0 8 440 186 543 +2013 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002764.jpg 640 479 8 100 140 310 281 8 52 88 110 107 8 179 96 223 111 8 231 91 288 113 8 513 104 547 119 0 528 95 538 108 0 554 95 566 117 0 423 87 427 99 0 11 96 19 100 0 168 84 173 92 0 413 88 419 100 8 125 86 161 103 0 419 93 422 99 0 595 93 601 108 0 115 87 126 101 0 369 88 374 101 8 284 52 312 101 0 614 91 618 100 0 430 87 435 98 0 113 84 118 103 8 612 102 639 124 +2014 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379022.jpg 640 480 8 3 2 635 311 +2015 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385877.jpg 640 427 8 2 270 639 394 0 303 140 512 328 29 276 93 349 167 +2016 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283101.jpg 640 480 8 391 79 419 94 0 119 362 170 423 0 163 316 192 350 0 399 55 404 63 0 423 55 429 68 0 403 76 410 83 0 230 314 242 327 0 179 356 219 390 0 221 312 232 322 0 211 297 221 311 0 216 348 237 367 0 410 40 418 55 8 137 406 216 456 0 154 338 180 407 0 213 321 233 339 0 134 48 426 432 +2017 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273323.jpg 480 640 8 133 424 386 623 8 229 408 262 421 8 442 419 479 431 0 183 439 200 473 0 0 409 17 447 8 0 346 67 425 8 92 408 139 418 8 107 409 187 458 8 368 340 477 424 8 176 414 215 428 8 228 223 283 424 +2018 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278321.jpg 375 500 8 76 195 269 334 8 263 216 371 352 +2019 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262651.jpg 640 368 8 114 221 219 252 8 46 126 584 267 +2020 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391225.jpg 640 427 8 282 12 419 76 0 294 163 343 213 0 214 187 241 213 37 261 183 314 219 0 368 52 374 63 37 214 205 221 211 +2021 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172616.jpg 640 439 0 435 138 535 344 0 482 182 528 249 0 462 152 583 361 0 58 44 107 229 0 7 54 75 241 0 11 54 36 111 13 420 219 635 420 26 562 258 609 302 27 75 74 78 80 27 47 86 56 116 +2022 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448256.jpg 640 426 0 66 87 178 425 0 423 125 497 218 0 267 81 478 336 39 157 262 173 295 8 155 75 589 306 7 243 0 639 419 +2023 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472088.jpg 640 480 0 306 88 549 335 8 605 17 629 26 0 505 21 573 133 0 427 43 532 185 0 573 17 639 133 0 534 9 586 98 0 564 76 639 202 0 562 8 606 64 25 0 0 419 179 13 471 176 639 346 13 529 124 575 192 13 375 281 639 479 13 570 58 622 96 67 577 129 591 157 13 607 49 621 64 0 134 92 403 473 +2024 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268941.jpg 640 426 0 582 239 639 359 0 269 222 282 239 8 82 0 639 381 0 305 200 324 236 8 613 291 640 418 +2025 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154004.jpg 640 427 0 224 184 323 294 0 123 55 169 242 0 165 63 197 162 0 317 114 355 150 37 295 92 399 125 0 188 70 211 158 0 205 70 228 164 0 322 126 384 190 0 325 112 346 141 0 453 118 514 158 0 71 106 121 154 0 266 107 291 142 0 355 101 393 130 0 314 171 403 268 0 1 50 446 338 +2026 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156756.jpg 640 427 0 177 36 287 190 17 25 70 438 367 19 213 169 639 415 19 374 135 517 175 19 544 147 637 194 19 0 153 91 237 19 465 153 564 188 +2027 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193380.jpg 640 480 0 20 206 36 227 0 95 189 101 196 24 128 180 146 217 0 161 187 166 195 0 55 197 60 205 0 60 199 70 216 8 356 215 406 262 8 437 207 464 245 8 289 239 345 271 8 597 229 639 255 8 345 201 375 232 8 368 195 385 216 8 474 196 507 231 8 516 227 585 254 8 414 198 445 233 8 387 198 411 224 8 563 253 612 265 56 0 206 19 251 56 20 203 43 248 56 43 216 57 245 0 120 177 155 219 25 0 159 61 203 25 40 168 70 188 56 57 208 67 241 60 0 222 15 225 60 0 202 9 204 60 25 202 36 205 0 43 202 50 207 0 86 189 95 196 8 310 193 323 219 25 0 160 37 185 0 294 231 301 247 1 2 267 119 458 +2028 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525927.jpg 640 425 0 334 361 341 371 8 507 344 596 376 56 20 370 31 385 56 0 371 13 387 56 148 365 164 380 56 615 350 621 360 +2029 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449485.jpg 346 500 0 81 38 248 372 58 171 277 268 358 73 111 128 181 222 28 102 308 282 493 +2030 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346642.jpg 500 375 0 162 293 169 315 0 241 210 244 223 0 169 292 176 310 0 144 306 152 329 8 113 166 168 182 8 144 113 192 131 8 124 80 151 85 0 233 331 246 342 0 271 203 277 211 0 248 360 252 366 0 249 203 251 205 0 257 203 260 207 0 365 175 368 181 0 347 173 351 178 8 145 160 200 166 8 199 92 254 102 8 223 121 287 139 8 126 58 183 70 8 220 206 358 230 8 343 122 401 143 8 394 107 489 134 8 304 98 404 125 8 261 167 346 193 0 127 170 129 177 8 186 317 330 338 8 35 25 421 190 +2031 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473415.jpg 640 396 0 187 178 292 337 0 92 214 216 353 8 222 2 327 74 8 508 110 608 157 8 4 3 171 130 8 446 12 520 37 0 344 2 358 25 0 346 3 381 56 0 418 2 441 23 0 438 3 466 40 0 406 2 431 25 0 491 0 522 34 0 525 77 569 154 8 149 0 220 97 8 351 20 453 54 8 75 325 369 372 0 363 12 400 57 0 391 0 403 22 0 404 2 416 28 0 366 0 401 28 0 30 0 595 125 +2032 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296014.jpg 534 640 0 111 286 380 467 0 134 171 277 446 8 12 23 508 572 0 266 174 292 210 0 270 34 425 370 +2033 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027787.jpg 640 278 0 495 206 503 216 0 237 187 241 191 0 381 184 389 190 8 79 187 107 192 8 204 154 273 217 8 343 179 574 232 8 288 157 366 184 8 399 164 517 196 +2034 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090476.jpg 640 480 0 67 127 95 183 8 269 276 545 458 8 94 345 265 461 8 43 249 209 366 8 396 145 614 238 8 427 188 639 354 8 203 171 362 334 8 0 51 149 144 8 368 95 639 196 8 226 37 444 120 8 116 109 295 234 8 0 110 59 210 8 302 66 433 145 8 0 416 101 479 8 500 42 616 155 +2035 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528980.jpg 426 640 11 183 525 200 567 25 128 83 359 462 2 81 606 182 639 2 17 618 92 639 2 58 599 107 616 2 87 597 144 627 2 126 574 182 594 2 59 579 108 604 2 10 596 36 607 +2036 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062220.jpg 640 427 19 471 128 634 251 19 61 105 448 359 +2037 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090594.jpg 640 480 25 0 0 624 284 0 309 106 639 479 0 121 170 371 470 +2038 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052425.jpg 425 640 25 138 187 357 316 2 220 311 379 446 0 232 215 337 625 7 218 308 383 447 +2039 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143125.jpg 426 640 25 262 406 377 539 0 42 234 227 550 0 203 217 355 552 11 357 135 383 186 26 217 506 298 534 +2040 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339823.jpg 484 640 25 70 39 395 358 0 17 184 356 634 +2041 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293002.jpg 640 359 25 314 83 520 286 0 179 52 252 113 0 383 277 449 319 13 89 112 339 257 0 432 38 546 178 +2042 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096762.jpg 640 426 25 369 192 597 235 2 2 231 115 286 2 536 214 639 329 2 502 231 538 252 9 537 108 549 132 9 550 109 565 132 0 357 221 366 254 0 365 221 376 259 0 383 233 392 256 26 367 310 412 396 0 375 234 383 256 10 217 242 224 258 25 0 184 65 270 25 282 218 300 226 25 309 219 324 227 25 341 220 357 228 25 360 216 380 226 26 357 231 362 237 0 346 223 354 255 0 380 229 514 420 0 315 222 327 258 0 520 235 530 257 0 281 223 299 256 0 313 226 318 252 0 485 232 496 258 2 63 213 218 267 0 507 231 523 256 9 548 112 552 134 +2043 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571931.jpg 640 512 25 278 58 487 129 0 160 158 273 442 0 377 130 440 395 0 290 129 398 453 2 533 165 574 180 2 365 167 410 185 9 548 119 554 131 9 554 95 561 119 2 424 164 442 179 +2044 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524536.jpg 427 640 25 379 194 426 252 25 1 255 50 273 27 166 285 323 543 0 0 35 360 639 0 287 265 349 477 0 364 244 426 575 25 63 215 292 269 25 242 260 308 297 0 265 325 305 402 0 259 287 284 333 +2045 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339678.jpg 640 640 25 164 121 446 283 2 0 148 161 347 2 465 201 639 360 10 359 496 478 629 0 192 261 352 545 2 126 153 201 217 9 590 150 597 157 7 0 149 160 348 2 473 159 502 185 2 549 155 583 194 9 509 43 535 70 +2046 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209773.jpg 640 480 25 0 0 640 271 0 184 204 638 472 +2047 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453162.jpg 640 461 25 264 0 639 455 0 60 222 250 460 0 272 238 532 460 +2048 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367953.jpg 427 640 25 185 20 423 210 0 178 103 281 479 7 56 126 426 258 +2049 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181714.jpg 640 355 25 22 21 292 244 25 400 30 526 141 0 102 49 283 334 0 449 84 509 297 +2050 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529215.jpg 469 640 25 54 398 137 453 25 145 442 204 461 0 149 451 209 553 0 86 430 132 540 +2051 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235124.jpg 428 640 25 156 190 208 207 13 30 306 160 333 56 190 231 204 247 0 197 222 198 228 0 187 212 198 231 +2052 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478621.jpg 640 427 25 395 106 532 153 27 468 172 480 243 0 431 138 520 372 +2053 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333114.jpg 427 640 25 164 149 216 175 25 103 162 144 203 25 292 164 320 185 0 252 165 287 220 0 299 176 319 216 0 117 171 140 252 26 254 192 269 208 26 184 177 205 198 0 181 169 204 247 25 311 181 332 202 26 298 206 317 227 26 140 207 152 226 25 247 159 288 193 +2054 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565543.jpg 640 426 25 78 170 171 280 25 370 113 542 158 25 296 191 366 212 25 210 195 277 271 25 51 219 82 259 25 0 199 35 260 +2055 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449981.jpg 640 428 25 458 57 548 106 25 47 113 77 123 25 390 79 431 95 20 60 119 120 205 20 487 139 606 255 20 243 127 328 230 0 25 114 71 185 0 114 111 152 217 0 161 115 176 189 0 164 109 190 200 0 317 100 378 196 0 216 106 248 156 0 245 105 284 144 0 409 69 476 264 0 359 103 393 218 0 391 132 414 218 0 521 93 571 227 0 484 86 525 224 25 6 114 35 122 39 134 143 160 159 20 154 143 246 217 39 467 142 488 159 39 317 123 325 136 0 202 115 222 206 0 0 79 630 233 +2056 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365540.jpg 426 640 25 220 18 360 74 +2057 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086429.jpg 640 480 25 0 77 504 472 0 496 250 508 265 0 526 271 541 284 13 176 448 418 479 13 2 319 107 336 56 537 298 572 327 56 477 280 495 304 56 468 289 505 317 56 0 332 113 375 56 59 300 63 308 0 547 256 561 269 13 0 310 110 322 13 2 331 111 377 56 312 284 361 328 56 571 310 619 339 56 199 447 399 474 56 1 291 79 299 56 0 319 112 338 56 0 310 110 324 56 341 289 446 338 56 1 301 639 344 56 370 255 563 479 +2058 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230454.jpg 640 455 25 197 18 639 352 0 244 98 536 447 0 46 156 111 369 28 536 300 615 387 0 196 198 290 450 0 614 333 632 383 +2059 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110313.jpg 480 640 25 336 364 421 486 25 268 329 356 368 0 271 372 388 628 0 244 394 270 489 0 390 381 430 542 0 110 379 153 490 0 270 400 278 441 0 20 342 120 639 0 0 346 53 639 0 148 371 205 533 0 206 392 254 493 0 266 378 308 532 26 5 479 30 519 0 367 379 398 536 0 195 402 212 493 26 117 407 129 424 26 261 467 286 486 26 213 425 225 445 26 371 446 387 466 +2060 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285106.jpg 426 640 25 41 163 263 272 0 58 220 191 605 26 60 271 100 454 +2061 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361265.jpg 640 427 25 393 41 569 148 2 137 163 286 277 2 98 157 140 193 2 48 151 66 166 2 87 150 100 163 0 307 136 490 419 2 63 143 80 151 2 0 160 13 221 +2062 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152000.jpg 486 500 25 221 173 329 280 56 290 245 331 289 56 227 243 264 287 56 265 255 284 280 56 253 239 273 250 56 332 248 353 277 58 403 260 468 306 58 1 283 76 418 60 250 250 304 255 +2063 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177953.jpg 640 480 25 304 66 535 249 25 25 25 303 177 0 367 159 497 352 0 212 325 532 473 0 30 188 215 433 0 27 401 168 477 25 181 1 320 125 0 169 427 339 479 +2064 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573209.jpg 640 425 25 0 0 354 359 25 250 0 637 287 25 363 187 495 307 25 249 168 404 310 25 182 266 340 366 25 569 105 638 187 25 557 188 639 221 25 565 219 639 257 25 335 118 551 198 67 104 301 121 340 0 141 327 263 424 0 234 329 295 424 0 356 222 538 424 0 558 276 639 422 0 0 359 35 424 0 292 337 366 424 25 118 261 209 318 25 580 257 639 281 0 4 277 181 424 0 139 354 156 389 25 529 260 591 344 25 249 244 359 293 67 420 307 439 325 +2065 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520109.jpg 640 426 25 316 234 415 273 25 38 225 100 299 25 478 247 535 311 25 533 251 583 308 25 168 224 229 247 25 429 242 484 299 25 581 257 596 284 +2066 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408120.jpg 640 427 25 259 85 320 141 2 268 74 336 102 2 345 75 390 100 2 242 68 256 91 0 285 104 317 206 +2067 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126253.jpg 424 640 25 1 31 137 76 25 298 105 352 127 0 305 117 358 223 0 294 152 304 177 0 31 50 120 278 0 161 151 174 178 0 284 152 294 179 1 126 150 161 200 26 302 151 318 175 +2068 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121417.jpg 480 640 25 162 79 435 321 0 103 144 441 629 0 45 1 111 99 0 256 2 353 65 0 411 0 442 55 0 85 0 116 62 26 222 319 287 376 67 238 183 263 208 0 367 0 410 36 0 158 0 262 56 0 451 0 479 51 0 204 0 243 33 13 332 412 478 501 +2069 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278843.jpg 640 427 25 83 0 357 148 0 4 226 173 417 0 49 127 522 422 0 208 188 639 421 0 0 214 84 358 24 0 325 84 425 0 590 249 639 367 0 559 249 611 322 +2070 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493772.jpg 640 640 25 272 262 342 285 0 284 285 335 440 +2071 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148955.jpg 612 612 25 118 64 324 229 25 240 142 427 273 25 20 54 150 146 27 538 249 561 335 27 308 244 320 286 27 219 215 232 244 27 437 241 443 264 0 84 169 197 564 0 259 182 382 551 0 30 188 118 529 0 384 186 469 525 0 520 194 591 523 0 430 196 544 549 0 29 208 83 519 0 20 89 117 208 0 431 22 489 196 0 370 20 432 203 0 172 148 270 556 27 151 229 175 351 27 47 130 63 209 0 241 272 277 516 0 212 17 261 171 +2072 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532867.jpg 480 640 25 95 163 207 264 0 94 185 101 192 0 211 183 218 191 0 222 183 227 190 0 233 184 240 191 0 327 181 330 191 0 41 186 47 192 0 48 185 54 190 0 91 186 95 193 0 108 187 112 190 0 291 184 297 190 0 138 242 193 405 0 307 184 312 189 +2073 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003109.jpg 480 640 25 33 86 431 295 56 0 447 73 639 56 0 376 64 471 0 231 272 332 563 +2074 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052982.jpg 640 480 25 514 98 608 136 0 354 216 511 448 0 1 139 80 362 0 557 121 601 173 20 189 49 519 473 0 565 133 586 156 0 572 124 581 134 0 209 105 243 231 +2075 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315962.jpg 640 480 25 197 240 315 302 25 310 275 371 295 25 158 0 639 477 25 207 266 275 285 0 57 234 350 479 0 395 324 522 357 56 343 346 377 394 56 381 306 404 350 56 231 281 623 473 56 416 303 461 343 56 395 302 411 326 0 370 322 373 330 0 378 314 382 326 0 380 321 384 331 45 578 352 589 359 56 16 289 306 479 0 344 319 351 325 0 306 313 316 322 0 297 316 300 321 0 376 324 379 330 0 384 325 386 329 25 312 307 323 310 +2076 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537280.jpg 640 480 25 62 36 313 177 0 151 82 230 335 2 1 9 111 112 +2077 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250629.jpg 640 424 25 105 3 589 145 0 236 50 497 418 0 46 81 251 387 26 62 335 292 422 67 368 358 400 384 74 380 261 394 277 0 494 95 622 350 0 597 119 639 423 25 570 73 639 123 +2078 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313588.jpg 480 640 25 346 189 479 288 2 152 285 195 312 0 340 224 479 576 26 417 322 479 401 7 229 247 335 334 +2079 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549351.jpg 500 400 25 152 14 213 280 56 65 191 146 273 56 236 165 326 238 56 23 287 132 387 60 60 208 310 334 56 349 52 461 176 +2080 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433714.jpg 640 480 25 251 141 291 162 0 271 159 310 218 20 254 187 322 286 0 265 148 291 173 +2081 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153578.jpg 640 427 25 0 1 475 252 67 607 212 621 232 67 462 223 478 234 0 440 125 558 398 0 347 133 438 426 0 380 113 440 222 0 585 101 639 426 0 535 156 586 405 0 333 127 365 163 0 542 133 591 201 41 0 302 41 346 0 309 160 352 243 0 95 176 133 225 0 80 16 393 419 0 568 113 633 417 0 451 114 502 209 0 0 103 469 405 +2082 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491377.jpg 426 640 25 235 89 400 312 0 208 136 346 608 +2083 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209864.jpg 640 427 25 62 52 228 195 0 76 186 418 315 20 0 264 575 426 +2084 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260370.jpg 640 494 25 399 71 592 214 0 439 107 527 366 26 504 197 542 261 +2085 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238598.jpg 640 640 25 220 72 454 160 0 163 113 306 601 0 76 148 193 589 0 313 139 475 576 26 399 194 481 422 0 265 98 377 551 +2086 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107741.jpg 480 640 25 124 193 369 349 25 12 224 79 259 25 337 187 479 218 0 153 222 339 630 0 3 230 57 379 0 116 244 139 353 26 161 294 277 439 0 292 237 403 575 0 424 280 447 324 0 447 285 471 313 67 270 261 287 285 0 42 238 59 271 0 50 237 96 378 0 86 235 108 364 0 376 281 388 292 0 470 281 479 307 25 100 229 149 247 +2087 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530854.jpg 640 425 25 1 154 459 419 25 385 67 639 369 25 193 94 451 217 25 406 63 611 129 25 259 41 513 100 25 558 42 638 81 25 0 90 183 169 0 59 133 142 168 +2088 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350467.jpg 424 640 25 165 210 350 386 56 304 540 387 627 0 40 238 99 299 0 14 106 72 172 +2089 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518914.jpg 612 612 25 193 200 602 549 2 131 541 312 587 2 349 563 555 611 25 0 239 27 340 2 129 568 309 602 12 400 545 473 603 +2090 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152499.jpg 640 480 25 472 0 638 64 0 186 161 273 277 0 560 209 622 339 0 149 62 193 248 0 310 238 394 338 0 588 226 637 381 56 246 163 301 243 58 29 102 97 235 0 377 187 538 422 0 427 166 535 255 0 67 138 160 261 0 436 141 506 303 37 108 300 249 362 60 601 215 639 235 +2091 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116936.jpg 500 375 25 0 130 16 142 25 71 125 121 170 56 47 158 58 170 56 39 159 48 169 56 6 160 24 169 0 296 119 313 170 0 360 121 379 169 +2092 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508230.jpg 439 640 25 68 83 410 199 25 0 103 191 200 25 63 75 345 192 0 15 209 140 632 0 271 192 363 345 0 301 186 438 629 0 0 225 41 639 0 143 260 190 308 0 337 243 353 264 0 238 229 294 320 25 291 164 438 214 0 332 255 372 296 0 109 192 315 620 0 100 215 154 335 +2093 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325153.jpg 500 375 57 0 7 85 192 28 299 129 396 220 28 162 146 296 216 28 64 192 240 275 28 243 186 429 278 56 357 23 499 140 56 320 74 478 175 +2094 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481446.jpg 332 500 27 69 193 170 458 0 0 8 330 500 +2095 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546424.jpg 456 640 27 167 177 189 316 0 97 95 254 580 0 214 118 366 574 0 434 169 455 295 0 63 170 108 272 0 399 168 446 296 0 374 180 419 361 0 22 174 53 249 27 91 199 96 215 0 2 130 61 485 0 44 175 74 229 0 334 131 387 275 +2096 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367582.jpg 279 430 27 132 160 183 292 0 13 22 252 341 56 10 216 27 315 73 173 304 278 344 +2097 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063114.jpg 266 640 27 106 117 135 268 0 5 7 241 623 +2098 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573363.jpg 640 419 27 295 195 327 299 0 230 112 346 413 0 401 137 422 216 0 480 170 510 205 0 467 177 481 205 0 50 138 70 194 0 159 137 193 215 0 106 150 116 186 0 79 143 100 206 0 95 147 107 187 0 176 139 194 210 0 240 139 255 169 26 67 147 74 171 26 271 149 275 165 26 76 177 87 198 0 383 149 403 220 0 230 146 249 207 0 151 135 375 201 +2099 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087617.jpg 344 500 27 165 139 187 255 0 140 35 295 496 0 42 66 164 492 2 0 64 26 86 +2100 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123244.jpg 506 640 27 303 114 327 159 2 263 101 506 380 2 0 107 186 353 0 178 38 402 418 0 58 329 283 608 27 310 116 331 164 +2101 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140087.jpg 427 640 27 166 333 200 391 0 36 61 365 630 +2102 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565670.jpg 500 375 27 108 236 253 369 0 0 2 499 374 +2103 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475586.jpg 640 640 27 294 550 447 637 0 1 28 639 639 +2104 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201220.jpg 552 346 27 323 215 363 273 0 253 14 551 341 0 0 29 278 341 +2105 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269280.jpg 375 500 27 62 60 210 417 0 0 1 375 493 +2106 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089487.jpg 640 428 27 332 227 362 334 27 220 199 261 375 27 436 236 451 301 0 260 74 502 421 0 60 28 286 427 0 402 147 511 401 0 515 242 557 308 26 490 379 536 427 0 590 154 639 419 0 5 326 66 421 0 0 198 49 403 25 506 358 544 427 26 66 179 176 422 0 504 191 610 426 +2107 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138589.jpg 640 360 27 603 79 617 108 28 444 280 520 355 28 195 237 226 293 0 108 180 192 353 0 129 167 179 232 0 272 141 329 200 0 490 104 512 143 0 584 58 629 108 0 358 105 435 283 0 443 94 515 236 26 451 131 462 150 +2108 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077400.jpg 480 640 27 169 199 276 310 56 244 457 422 639 0 4 69 367 628 +2109 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440646.jpg 640 432 27 350 178 379 250 56 184 146 552 431 0 236 47 543 430 0 113 176 425 424 78 499 201 560 264 60 492 184 636 420 +2110 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572850.jpg 640 480 27 248 48 415 393 0 0 0 640 473 +2111 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100428.jpg 640 491 27 283 235 472 258 0 261 100 619 483 0 119 85 249 484 27 185 242 267 421 +2112 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335587.jpg 434 640 27 142 219 202 480 0 52 75 367 639 74 333 467 346 480 +2113 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331627.jpg 640 480 27 401 190 485 306 27 220 230 238 262 2 492 175 638 330 2 351 181 394 214 2 0 115 270 468 2 331 187 353 206 0 89 49 425 475 0 341 64 583 472 2 286 183 316 204 2 480 182 501 205 +2114 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101948.jpg 333 500 27 160 240 203 435 0 0 3 333 490 +2115 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314147.jpg 427 640 27 159 238 233 527 0 7 60 395 632 60 1 397 122 636 56 306 504 373 639 +2116 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283254.jpg 533 640 27 218 311 297 592 0 0 0 88 348 0 96 0 210 231 0 368 0 433 130 0 415 22 449 89 45 232 559 364 633 26 40 24 98 212 0 0 10 532 639 0 295 0 403 105 60 10 561 532 637 0 43 9 100 230 +2117 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067660.jpg 640 360 27 218 215 315 282 0 46 0 571 354 +2118 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068409.jpg 640 263 27 415 80 424 103 0 474 18 637 259 0 503 1 639 97 0 200 16 368 248 0 346 5 485 259 0 408 0 518 152 0 253 0 410 93 0 88 0 183 83 0 110 17 264 252 0 3 5 151 257 27 291 90 306 121 27 192 81 207 118 27 80 77 94 106 27 561 89 570 110 0 209 2 281 80 27 454 0 465 16 +2119 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370315.jpg 333 500 27 96 298 131 416 67 178 228 201 278 0 1 61 332 499 +2120 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125051.jpg 480 640 27 155 465 251 639 0 1 170 356 627 +2121 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352005.jpg 375 500 27 130 325 199 499 0 0 29 373 489 0 11 228 86 339 0 22 227 43 271 0 1 189 35 238 0 100 228 117 259 56 8 274 28 384 0 0 225 26 324 +2122 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359126.jpg 640 480 27 277 241 301 333 0 172 117 404 442 +2123 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172087.jpg 427 640 27 143 250 315 632 0 0 87 408 639 +2124 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356043.jpg 640 480 27 248 303 292 408 0 48 5 588 466 +2125 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028702.jpg 481 640 27 97 372 203 566 0 1 24 470 639 +2126 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183716.jpg 353 500 27 86 259 118 300 27 220 229 271 477 0 2 47 221 494 56 8 74 348 230 0 148 14 351 482 +2127 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310705.jpg 500 462 27 0 265 254 459 0 0 17 500 456 +2128 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496687.jpg 631 640 27 446 444 525 567 27 233 476 289 568 0 349 86 629 569 0 1 72 398 571 +2129 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136644.jpg 640 302 27 42 181 52 222 27 523 186 528 204 41 455 212 472 228 0 79 145 130 233 0 121 158 150 212 0 174 156 215 210 0 0 118 68 248 0 471 139 570 233 0 130 155 175 215 0 469 153 523 218 0 541 135 618 242 0 577 145 639 260 0 424 163 448 213 0 437 159 471 213 39 113 201 134 274 39 483 199 502 265 39 212 191 223 228 39 231 189 241 218 39 248 188 255 212 39 257 188 264 209 39 265 186 271 208 39 577 207 609 301 39 440 195 456 243 39 181 194 196 242 39 383 189 391 214 41 61 225 98 267 56 60 187 84 231 56 566 187 581 202 27 200 181 204 193 27 469 191 475 206 27 446 187 451 193 27 418 186 421 192 27 588 201 594 207 27 157 191 163 200 39 415 193 426 232 58 289 272 338 301 60 1 198 638 297 0 462 157 494 217 39 396 191 405 223 41 410 204 414 214 41 194 217 207 239 41 587 261 626 301 41 489 231 511 268 41 134 235 141 262 41 396 207 408 224 41 229 198 232 209 0 206 162 212 180 41 240 196 247 206 39 354 184 383 217 41 138 192 512 241 0 0 163 624 269 +2130 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482605.jpg 303 640 27 118 156 168 433 0 20 14 274 639 +2131 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540264.jpg 425 640 27 128 283 315 406 0 68 82 424 639 0 1 78 329 518 +2132 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145227.jpg 509 640 27 225 314 260 425 0 69 62 443 639 +2133 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009105.jpg 640 640 27 153 310 211 517 0 0 104 349 639 +2134 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170955.jpg 640 427 27 467 120 486 217 0 408 5 637 419 +2135 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393372.jpg 480 640 27 254 472 339 638 0 2 77 479 627 +2136 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060010.jpg 640 547 27 270 430 351 546 0 54 4 604 537 +2137 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006847.jpg 640 513 27 209 191 423 512 0 1 2 639 505 +2138 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512307.jpg 640 427 27 179 303 229 426 0 0 89 337 426 0 450 80 639 420 0 40 171 122 342 0 492 253 602 420 0 231 178 421 370 +2139 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376059.jpg 413 640 27 181 243 295 584 0 0 8 413 632 +2140 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574411.jpg 426 640 27 136 233 290 483 0 1 39 425 639 +2141 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453166.jpg 640 425 27 89 145 106 221 27 371 117 387 157 27 247 115 262 156 27 505 115 517 137 0 2 57 170 418 0 314 41 464 423 0 451 46 628 420 0 165 40 325 424 +2142 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018476.jpg 500 347 27 228 31 426 341 59 2 1 499 130 +2143 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551243.jpg 640 640 27 283 240 356 634 0 125 48 595 630 0 127 267 173 388 0 0 456 188 639 41 193 422 262 577 39 78 453 95 517 +2144 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141509.jpg 396 640 27 148 200 192 373 0 74 81 297 585 77 202 227 264 379 +2145 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406417.jpg 568 640 27 218 317 264 422 27 445 278 522 339 27 61 331 89 357 0 375 267 524 632 0 12 292 149 639 0 164 259 350 631 +2146 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420546.jpg 640 428 27 329 191 359 259 0 1 0 419 425 0 277 44 556 427 +2147 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500514.jpg 640 569 27 262 174 327 439 0 140 23 414 561 0 0 163 80 561 0 44 85 198 568 0 554 87 639 453 0 401 130 441 223 0 356 70 416 193 0 169 115 250 201 0 177 104 196 139 0 311 46 637 560 0 17 72 108 243 +2148 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161875.jpg 640 422 27 224 125 240 170 0 174 72 281 384 +2149 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423613.jpg 283 424 27 57 236 128 416 0 0 0 283 423 +2150 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463452.jpg 640 640 27 283 308 337 473 0 28 33 632 632 +2151 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279259.jpg 428 640 27 121 86 185 244 0 92 13 388 605 +2152 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098872.jpg 500 487 27 298 157 336 379 27 203 170 287 415 0 13 68 288 479 0 245 20 474 478 +2153 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147128.jpg 612 612 27 247 409 369 602 0 30 30 611 611 0 198 201 237 253 0 31 199 90 317 24 42 220 64 269 0 7 204 16 219 0 16 204 25 217 0 583 228 602 280 0 552 230 592 280 0 541 233 559 273 0 556 233 578 268 +2154 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473109.jpg 612 612 27 218 393 400 513 0 2 17 611 604 +2155 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282698.jpg 640 428 27 232 255 282 426 0 28 46 456 426 +2156 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268541.jpg 430 430 27 157 326 208 427 0 0 98 428 425 41 147 151 227 240 +2157 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437459.jpg 476 640 27 163 305 339 631 0 0 1 476 632 +2158 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319677.jpg 389 640 27 207 198 327 541 0 0 15 389 584 43 1 0 204 185 +2159 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030548.jpg 640 480 27 297 360 376 478 0 3 15 575 473 +2160 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206025.jpg 424 640 27 167 373 252 639 0 4 79 423 629 +2161 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211775.jpg 500 391 27 199 238 299 390 0 0 0 479 385 56 25 134 140 390 59 359 218 499 385 +2162 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068435.jpg 640 480 27 210 149 294 215 0 96 34 376 475 0 225 117 533 474 +2163 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473839.jpg 334 500 27 142 120 196 384 0 27 21 327 492 +2164 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398637.jpg 640 480 27 292 198 316 212 27 452 178 472 185 0 213 137 338 472 0 323 129 424 474 0 373 115 422 233 0 453 146 524 425 0 421 143 526 391 26 387 360 424 405 26 514 210 527 251 +2165 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250282.jpg 640 426 27 369 230 380 274 27 157 308 163 325 27 162 77 170 102 0 1 187 70 384 0 343 182 406 322 0 556 196 631 369 0 120 85 166 193 0 172 276 258 410 0 373 131 426 264 0 285 90 338 229 0 343 78 398 183 0 461 94 527 195 0 245 40 302 130 0 206 43 241 131 0 267 136 321 266 27 270 80 285 87 27 286 308 293 329 27 85 126 94 136 27 415 122 424 129 27 449 89 461 126 27 357 310 366 332 27 424 312 437 330 27 496 316 506 331 27 558 136 565 152 0 205 190 268 327 27 330 80 336 88 27 59 82 522 148 0 0 34 639 422 +2166 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529270.jpg 427 640 27 198 309 286 608 0 1 96 366 638 +2167 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182369.jpg 640 426 32 129 139 191 198 21 87 192 312 320 +2168 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240903.jpg 640 480 32 496 234 561 295 67 566 385 576 424 0 546 293 626 453 20 230 86 391 328 +2169 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153822.jpg 457 640 32 347 406 414 455 0 14 126 395 630 38 201 166 303 315 +2170 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010395.jpg 500 476 59 1 68 497 468 77 49 66 427 445 +2171 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243569.jpg 500 333 59 0 163 500 332 0 125 104 231 225 63 162 187 294 259 77 277 176 421 316 +2172 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068674.jpg 640 418 59 0 0 638 413 0 214 80 424 320 28 164 120 639 417 +2173 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200252.jpg 500 375 59 16 112 499 374 73 382 200 425 217 73 379 195 401 199 +2174 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057359.jpg 500 375 59 0 74 257 245 73 397 0 414 61 73 432 2 448 57 73 376 0 398 64 73 388 0 407 63 28 377 54 499 272 28 199 160 404 306 24 172 145 241 230 56 14 262 114 371 73 403 1 417 59 73 408 0 441 59 26 444 268 499 315 73 461 10 474 55 73 466 0 489 54 73 440 8 454 56 73 447 0 469 58 +2175 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199358.jpg 500 375 59 18 159 499 339 56 88 132 169 220 56 0 196 25 374 28 344 176 438 247 28 212 190 346 261 28 245 155 340 214 +2176 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481890.jpg 500 400 59 0 103 500 395 77 69 45 494 355 65 334 63 391 80 +2177 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261787.jpg 640 484 59 2 211 639 482 73 130 255 152 293 73 169 318 248 348 77 298 206 571 474 0 0 59 611 469 +2178 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436413.jpg 640 428 59 0 91 639 427 77 37 170 229 300 +2179 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509526.jpg 640 453 67 302 138 307 156 0 251 94 420 399 +2180 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153697.jpg 457 640 74 94 231 315 578 +2181 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174690.jpg 640 480 74 262 124 323 188 0 299 241 424 447 0 160 261 196 412 0 318 246 348 360 0 383 236 424 312 0 235 245 267 374 0 179 245 196 281 0 289 236 314 321 24 359 280 394 332 24 248 268 282 309 28 186 354 244 436 28 301 335 342 436 28 266 337 287 391 28 273 321 305 391 0 304 248 328 343 28 171 345 200 411 0 171 240 178 261 0 196 271 256 420 0 275 239 293 315 0 493 233 499 261 0 198 228 213 265 +2182 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309993.jpg 500 333 2 0 75 247 173 2 177 78 252 109 2 479 64 499 112 2 452 61 491 96 28 131 200 164 287 0 230 97 320 286 0 242 62 272 136 0 429 61 442 110 0 391 52 412 107 0 228 51 240 79 0 377 82 437 222 0 439 58 454 103 0 419 60 434 94 0 272 88 321 251 0 242 51 256 79 2 364 55 395 81 10 0 173 21 214 0 21 129 125 280 1 206 156 324 174 2 354 54 370 73 2 453 47 499 64 7 371 23 433 62 +2183 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559656.jpg 640 427 2 162 31 491 395 28 345 183 411 276 28 342 151 423 272 24 359 257 415 311 26 360 255 418 313 24 285 185 358 319 26 291 219 361 318 26 227 183 298 312 +2184 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122229.jpg 480 640 2 59 303 68 323 0 286 44 377 166 0 373 11 465 221 20 194 136 433 541 0 346 113 414 184 2 112 301 137 322 2 48 292 117 351 2 3 289 42 321 2 36 291 66 343 +2185 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375063.jpg 480 640 2 1 362 86 629 28 89 299 221 520 0 177 54 371 530 +2186 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335814.jpg 480 640 2 310 200 470 300 0 209 139 317 422 0 414 208 455 318 0 52 217 66 242 0 0 201 26 290 28 100 373 232 461 28 107 326 225 405 28 105 291 221 360 28 430 283 464 326 28 465 269 479 325 0 82 210 86 220 24 223 175 298 219 24 316 313 421 386 24 201 219 233 275 +2187 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442746.jpg 500 375 2 311 130 363 149 0 182 105 234 228 29 222 133 239 140 9 15 97 20 106 9 61 99 65 111 9 44 68 48 79 +2188 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501790.jpg 480 640 2 335 188 436 251 20 137 210 296 376 +2189 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087740.jpg 640 480 56 434 171 475 207 56 113 160 161 206 0 117 119 179 202 0 182 148 216 211 0 438 131 499 215 0 506 174 571 234 20 378 212 579 306 20 24 198 260 307 0 141 119 160 152 +2190 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333034.jpg 429 640 56 148 425 278 583 25 159 279 331 424 56 281 418 428 596 0 128 360 147 387 +2191 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190753.jpg 640 478 56 156 302 172 342 56 217 291 230 314 0 167 245 220 411 0 224 255 268 310 0 243 253 333 374 0 345 250 381 311 0 354 226 387 268 0 510 219 529 246 0 590 217 606 236 13 59 262 137 308 28 382 311 457 402 1 438 257 472 300 13 233 279 439 434 13 434 255 526 343 13 314 245 354 272 24 350 284 381 303 36 612 246 624 250 13 505 230 533 246 13 584 225 599 237 13 627 222 637 230 13 126 260 191 304 +2192 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148542.jpg 379 640 56 118 63 190 227 28 51 218 227 463 28 233 167 319 442 0 136 19 171 68 0 116 19 125 43 0 174 26 203 74 0 177 18 190 46 0 119 0 145 42 56 131 42 155 70 56 193 42 203 58 56 152 43 180 74 56 182 47 193 57 0 190 18 203 35 58 290 0 329 62 +2193 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487282.jpg 640 480 0 430 151 568 420 24 448 207 540 292 28 434 415 584 479 +2194 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392251.jpg 640 456 0 520 252 639 448 20 204 133 480 393 +2195 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385057.jpg 503 640 0 148 199 280 619 0 322 289 473 570 20 1 439 502 639 +2196 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014990.jpg 640 478 0 178 175 225 299 20 24 141 162 372 20 335 133 639 452 26 184 198 212 254 +2197 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033055.jpg 427 640 0 164 291 398 559 29 151 389 191 397 +2198 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546667.jpg 530 640 0 195 95 284 244 20 78 227 441 638 0 251 50 376 277 13 182 148 403 265 +2199 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220808.jpg 640 480 0 336 246 382 306 28 337 282 455 450 28 242 311 330 446 13 210 335 244 370 28 131 269 161 313 0 264 244 303 273 26 204 369 249 438 +2200 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286503.jpg 640 427 0 162 285 180 311 0 143 289 160 312 20 234 178 525 379 0 299 289 313 307 +2201 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148188.jpg 640 480 0 303 168 322 227 0 285 158 316 236 0 269 168 296 214 0 493 161 508 223 0 378 246 424 330 0 612 227 639 356 0 503 152 522 186 20 221 199 373 337 20 425 209 502 347 0 401 245 413 300 0 482 188 491 205 0 408 245 427 300 0 480 168 495 199 0 447 158 493 208 0 375 245 387 299 0 354 242 625 308 +2202 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253742.jpg 640 480 0 391 92 528 471 0 299 109 364 249 0 24 115 92 273 0 156 110 225 243 0 538 155 585 266 24 409 154 481 282 0 103 110 163 243 25 139 80 278 160 25 337 0 614 186 25 0 99 41 122 25 283 94 410 183 25 606 108 639 155 25 578 126 613 144 25 519 121 600 158 25 606 153 639 190 25 0 104 100 163 26 97 169 120 204 0 586 151 622 255 0 250 126 304 240 0 357 181 392 250 25 207 140 257 157 25 301 67 350 104 26 235 192 244 212 26 102 141 147 228 25 233 105 303 134 0 621 194 638 254 25 83 94 167 149 26 410 199 473 285 25 593 109 629 133 +2203 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176362.jpg 640 512 0 142 29 240 357 34 295 7 366 161 35 151 317 211 385 0 273 87 554 486 0 0 230 212 497 +2204 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147556.jpg 480 640 0 289 88 383 259 0 0 310 109 639 0 187 342 267 628 20 179 231 465 632 20 71 264 223 611 0 128 181 227 310 0 0 305 26 379 +2205 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563015.jpg 480 640 0 289 156 422 583 24 258 159 334 311 24 200 213 269 260 28 9 531 223 639 28 0 429 214 593 28 8 343 178 465 28 2 230 187 376 28 209 431 297 590 28 174 322 300 451 28 169 250 274 354 28 0 74 154 235 +2206 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248069.jpg 426 640 0 157 306 273 614 20 30 25 284 322 +2207 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135975.jpg 640 480 0 562 2 639 147 77 201 75 455 409 28 364 202 639 473 28 42 168 261 236 28 2 104 123 189 28 390 140 639 214 28 1 232 362 474 58 510 0 583 137 +2208 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185621.jpg 500 330 0 106 89 235 285 29 261 100 313 120 +2209 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125983.jpg 458 640 0 170 14 340 586 0 2 65 80 350 0 129 167 202 305 0 337 177 395 303 0 417 181 456 289 0 179 139 219 216 0 57 93 110 148 28 13 353 185 639 28 391 269 444 346 0 87 179 117 216 0 396 150 435 211 0 344 137 398 211 74 0 41 44 76 0 322 136 352 194 0 289 137 321 191 0 134 169 164 212 +2210 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240102.jpg 427 640 0 175 264 284 558 0 32 345 88 450 0 2 327 58 465 29 245 392 282 403 +2211 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122747.jpg 480 640 0 0 101 461 637 27 176 457 323 526 +2212 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048504.jpg 640 427 0 528 267 585 403 13 0 201 152 211 13 0 178 212 187 20 197 202 368 405 20 352 230 530 415 0 15 250 48 302 +2213 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276239.jpg 640 640 0 156 0 509 531 28 353 459 495 638 28 497 468 609 635 28 18 445 207 631 28 147 440 358 629 +2214 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142949.jpg 640 360 0 197 35 255 106 20 145 88 539 340 20 92 171 140 260 20 169 192 214 259 0 212 199 229 221 20 211 216 233 258 20 301 211 314 249 20 477 174 529 209 20 312 211 365 248 56 295 14 355 90 +2215 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069009.jpg 640 427 0 65 129 265 425 0 326 118 488 420 21 119 75 529 352 +2216 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499810.jpg 640 480 0 208 1 452 454 0 0 1 194 399 0 465 0 531 136 0 509 3 568 131 28 153 39 483 216 24 495 23 639 327 28 52 65 104 158 0 159 0 260 83 0 446 0 471 67 +2217 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062060.jpg 640 334 0 23 162 65 288 0 186 151 247 313 0 423 143 480 301 0 560 130 595 248 29 476 217 499 230 0 274 136 336 310 +2218 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333167.jpg 640 457 0 33 83 332 417 0 1 298 353 451 0 159 75 291 290 0 9 109 47 264 26 222 137 286 289 26 49 213 92 327 0 402 11 619 451 27 427 188 510 310 0 29 68 77 224 +2219 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292206.jpg 333 500 0 112 58 207 368 0 195 235 305 421 0 0 174 57 342 0 203 260 236 316 24 253 271 325 352 28 78 266 182 474 0 299 186 320 222 0 311 169 332 255 0 280 214 298 258 0 259 235 270 262 7 38 196 118 326 0 284 195 305 223 0 317 166 332 220 0 270 220 286 272 0 210 250 221 263 +2220 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303556.jpg 640 423 0 158 168 277 376 0 308 172 340 269 29 263 194 290 201 +2221 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434006.jpg 640 428 0 154 149 301 353 0 351 173 363 202 0 342 175 353 202 0 303 196 317 215 0 277 189 293 208 0 198 177 205 199 0 152 183 156 199 29 31 254 106 308 0 315 188 323 206 0 436 63 589 353 0 169 179 175 197 0 215 175 522 197 +2222 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560626.jpg 640 428 0 223 12 366 415 27 258 79 293 135 +2223 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285799.jpg 640 430 0 273 123 376 349 26 324 246 378 316 26 241 295 314 351 +2224 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104486.jpg 457 640 0 100 157 193 540 0 261 133 373 374 28 243 359 375 545 24 190 480 252 530 26 190 174 270 327 0 0 242 63 622 24 206 401 245 481 +2225 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248224.jpg 457 640 0 170 134 339 557 29 274 205 344 223 +2226 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283097.jpg 640 480 0 200 146 294 354 28 246 280 304 368 28 307 268 410 326 28 302 321 406 375 28 260 203 376 280 13 33 162 73 185 28 289 241 380 295 +2227 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140696.jpg 640 423 0 276 158 354 349 0 388 166 564 412 24 287 180 343 260 24 415 176 443 225 26 459 245 509 344 28 356 303 437 411 0 378 149 450 248 26 279 246 307 279 28 344 248 436 307 +2228 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324040.jpg 480 640 0 177 39 256 185 0 420 338 462 378 20 37 162 321 597 20 429 301 479 379 +2229 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151970.jpg 386 640 0 97 314 274 609 20 21 20 385 628 +2230 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457217.jpg 640 480 0 82 141 232 406 13 216 176 304 194 20 110 170 633 473 45 52 223 89 242 26 117 183 143 277 25 302 139 331 175 25 259 140 290 153 60 215 179 301 190 0 445 153 459 169 +2231 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515779.jpg 332 500 0 183 1 225 81 0 220 37 240 84 0 147 86 192 136 0 11 41 173 273 28 12 247 331 484 0 245 89 330 270 24 47 168 235 320 24 170 114 311 265 0 99 0 171 74 0 252 32 282 73 28 38 449 153 493 28 145 301 331 496 28 0 413 78 499 0 231 58 280 113 0 25 70 84 118 0 290 57 324 79 26 183 69 215 106 26 0 47 89 179 26 1 44 83 84 +2232 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560227.jpg 425 640 0 92 96 422 632 27 266 242 339 571 +2233 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572347.jpg 640 400 0 229 121 305 351 0 84 136 297 394 0 46 75 157 399 0 1 9 75 106 20 169 1 639 394 20 0 56 107 240 +2234 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012897.jpg 640 426 0 507 53 639 425 0 274 170 328 247 0 423 170 471 305 0 495 163 542 342 0 216 180 255 260 0 98 157 174 267 0 269 213 312 269 24 430 187 458 226 24 467 204 479 233 0 328 181 365 274 0 493 180 517 222 0 209 187 218 205 0 193 190 218 232 24 146 200 173 234 24 347 251 387 283 28 421 367 484 425 28 396 303 458 375 0 235 201 281 378 28 352 366 422 425 28 456 244 511 318 28 232 400 367 425 28 276 316 347 408 28 403 214 417 244 28 376 341 421 374 28 378 312 396 361 28 428 257 447 305 28 370 243 401 283 0 144 195 207 292 +2235 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321804.jpg 640 480 0 0 91 172 470 0 432 257 501 436 29 375 245 391 275 +2236 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128849.jpg 640 480 0 334 141 446 361 0 564 63 608 169 20 2 99 368 334 20 259 120 396 207 20 475 115 546 157 20 193 116 352 285 26 565 106 579 129 0 592 89 637 203 20 483 114 615 173 20 352 114 401 134 74 362 258 368 264 0 386 48 499 271 +2237 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486112.jpg 640 427 0 414 157 639 422 20 5 27 639 420 +2238 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082456.jpg 640 480 0 133 124 177 206 20 99 173 201 427 20 204 196 375 423 0 279 133 331 209 +2239 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109486.jpg 427 640 0 85 31 310 419 0 324 149 347 213 0 64 142 85 189 0 39 138 59 185 28 101 384 293 523 0 267 142 290 205 0 26 145 39 173 0 409 154 423 215 0 365 153 372 183 0 394 156 408 183 0 3 129 38 203 25 294 136 339 150 0 293 150 324 218 +2240 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492246.jpg 478 640 0 93 103 400 629 27 232 297 286 553 +2241 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122300.jpg 640 456 0 32 138 126 360 0 518 114 609 300 29 513 208 535 228 29 552 193 574 215 29 242 287 279 323 0 231 122 309 419 39 105 254 125 278 +2242 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283977.jpg 640 480 0 255 193 335 390 20 375 155 449 334 20 64 128 345 349 +2243 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181256.jpg 425 640 0 135 59 287 214 20 53 187 355 600 +2244 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574413.jpg 425 640 0 227 320 272 452 0 114 193 207 260 0 173 196 222 279 0 198 232 235 276 20 115 282 320 432 0 358 324 390 438 0 0 330 36 444 0 135 242 177 308 +2245 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475879.jpg 640 424 0 531 0 639 168 28 161 79 355 416 +2246 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313922.jpg 481 640 0 1 11 394 639 0 299 85 398 272 26 386 237 480 313 28 249 296 480 637 26 20 149 322 374 56 1 243 191 627 +2247 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122678.jpg 640 426 0 0 32 570 420 27 100 278 255 405 +2248 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210457.jpg 640 426 0 80 126 317 415 0 379 124 521 418 41 278 137 301 172 41 189 143 217 177 29 301 237 397 255 +2249 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325157.jpg 640 426 0 476 133 554 393 0 416 146 482 379 0 342 135 422 367 0 275 144 342 366 0 114 157 194 376 0 10 145 102 390 0 391 123 430 191 0 318 135 369 208 0 257 146 290 201 0 211 161 280 361 27 571 183 583 222 27 492 180 504 225 27 426 185 441 223 27 365 176 378 218 27 245 197 251 224 27 155 197 168 243 27 288 182 300 219 27 57 184 73 226 0 548 135 634 412 0 454 132 493 196 0 410 121 572 349 0 71 148 254 354 +2250 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028540.jpg 640 480 0 387 14 499 272 20 191 138 575 479 0 243 60 391 218 0 221 365 244 393 20 579 272 622 359 26 401 124 463 162 26 165 321 183 362 46 311 119 333 137 56 379 101 530 209 0 151 307 182 390 0 603 256 620 325 0 203 343 221 398 0 316 11 406 132 +2251 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106757.jpg 426 640 0 212 223 420 639 0 276 192 280 200 20 0 35 301 639 +2252 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270515.jpg 640 458 0 134 0 172 29 63 157 0 203 21 28 165 164 299 402 28 235 133 382 384 28 385 125 501 385 28 498 157 611 356 28 61 87 159 309 28 227 79 333 119 28 449 61 501 113 28 24 158 77 281 28 140 127 257 311 28 223 97 299 137 28 524 116 613 180 28 345 107 430 270 56 511 51 576 120 56 0 22 32 72 56 139 5 169 65 56 386 19 462 107 56 170 20 246 60 56 341 6 406 41 56 254 14 290 61 56 522 31 596 125 56 319 33 406 103 56 0 53 78 189 56 59 12 132 94 56 455 14 514 59 28 156 89 229 139 56 291 0 328 51 57 504 5 566 41 57 391 0 445 21 56 83 1 639 116 28 95 41 527 326 +2253 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512911.jpg 331 500 0 44 103 275 210 28 40 207 283 462 74 192 188 201 195 0 290 19 327 280 0 64 293 278 435 +2254 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011181.jpg 640 424 0 117 204 191 342 26 137 249 151 276 25 120 190 187 228 +2255 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267076.jpg 640 478 0 0 0 367 470 20 185 40 444 469 0 571 442 639 477 +2256 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558661.jpg 426 640 0 76 30 357 557 29 72 207 179 243 +2257 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097748.jpg 480 640 0 80 156 245 456 20 67 312 346 632 26 169 213 254 366 20 80 324 197 423 +2258 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287506.jpg 640 480 0 194 179 224 238 20 1 288 169 474 20 195 250 387 454 20 167 229 224 347 20 479 420 547 479 0 93 366 222 471 0 278 199 352 319 0 35 131 128 192 +2259 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347630.jpg 640 427 0 571 154 582 196 20 84 70 498 364 0 564 174 574 194 +2260 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317033.jpg 640 425 0 153 253 179 282 0 269 233 297 270 0 64 245 98 271 20 309 165 639 424 0 315 248 388 423 0 147 253 164 281 0 176 249 206 283 0 313 246 327 271 0 206 244 226 274 0 106 251 130 278 25 455 28 639 171 0 133 246 148 270 0 131 263 146 281 0 303 256 323 272 +2261 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160607.jpg 480 640 13 43 386 105 474 29 25 244 101 294 0 0 339 10 405 0 141 365 477 639 +2262 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489304.jpg 640 480 13 0 390 274 479 13 78 125 114 140 13 549 132 586 162 13 115 123 163 143 28 300 182 393 249 28 333 192 429 265 26 185 154 241 181 26 228 166 288 204 28 204 196 267 237 28 157 186 225 230 28 149 223 188 296 28 183 229 226 300 28 273 246 306 317 28 224 236 268 304 28 347 264 409 328 28 303 250 353 320 28 259 185 325 249 13 312 124 371 149 0 468 101 598 469 +2263 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538259.jpg 480 640 13 0 0 479 632 73 146 392 425 630 77 84 8 463 630 56 1 1 426 631 +2264 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566538.jpg 640 400 20 366 129 580 205 20 26 46 306 311 0 571 154 620 208 +2265 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166642.jpg 640 480 20 50 57 536 329 +2266 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554978.jpg 640 480 20 301 316 357 361 20 360 323 385 359 +2267 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482667.jpg 428 640 20 103 35 350 603 +2268 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540483.jpg 640 425 20 373 221 536 302 20 266 249 375 320 20 57 251 170 335 20 180 251 254 306 +2269 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065465.jpg 500 375 20 199 2 495 358 20 0 0 284 248 20 0 146 215 370 20 290 159 350 269 +2270 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061564.jpg 640 483 20 103 222 349 390 20 71 157 304 372 20 366 123 614 393 +2271 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097610.jpg 640 480 20 255 79 506 424 20 367 22 538 303 +2272 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389316.jpg 640 361 20 219 64 534 302 20 93 79 217 334 0 535 56 624 271 +2273 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114926.jpg 640 480 20 221 62 639 474 20 401 344 480 430 20 311 258 473 479 +2274 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026026.jpg 640 427 20 197 110 456 392 0 0 161 11 218 0 39 180 56 230 0 292 42 382 176 0 343 57 374 152 0 374 210 443 384 0 358 39 395 174 0 483 196 505 254 0 509 156 541 248 0 394 42 449 171 13 429 81 478 99 13 0 92 81 105 13 506 92 638 99 13 497 103 639 112 13 420 59 492 84 13 514 77 639 92 13 487 114 639 122 13 416 119 445 128 13 416 102 460 119 13 419 49 639 59 13 525 69 639 79 56 179 68 204 97 56 199 67 220 93 0 374 38 426 173 0 524 157 562 267 0 562 152 592 255 2 181 173 207 209 0 620 160 639 285 13 525 55 639 71 26 564 187 578 222 13 270 64 320 71 0 362 71 405 162 13 0 55 639 222 +2275 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123070.jpg 640 427 20 317 187 355 232 20 275 200 284 217 20 250 189 267 220 +2276 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111004.jpg 426 640 20 79 52 425 632 20 1 100 195 544 +2277 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270593.jpg 640 221 20 440 105 539 159 20 157 119 236 160 20 212 111 293 153 20 74 107 169 160 20 5 104 89 153 14 400 137 405 151 14 389 140 395 150 +2278 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290165.jpg 640 480 20 185 203 502 465 +2279 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370749.jpg 640 511 20 146 116 453 366 +2280 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245852.jpg 496 640 20 0 96 316 573 20 2 14 318 530 +2281 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341775.jpg 640 427 20 185 33 581 396 +2282 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000757.jpg 640 427 20 102 18 587 426 20 52 52 462 349 20 451 0 639 419 +2283 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498650.jpg 427 640 20 0 205 188 497 20 0 149 172 225 20 138 176 373 616 20 355 284 426 491 20 110 140 420 311 +2284 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294284.jpg 640 480 20 271 207 389 276 20 201 229 255 270 20 177 236 199 253 20 146 222 184 251 20 86 223 152 260 20 491 231 587 288 20 467 225 512 252 20 2 216 52 255 20 256 220 287 239 2 3 350 636 469 20 255 234 286 271 +2285 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196295.jpg 640 360 20 103 92 372 250 20 364 117 432 227 20 404 115 470 184 20 430 163 473 217 20 456 131 527 218 20 0 127 138 266 +2286 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015599.jpg 640 427 20 219 186 363 312 20 48 176 152 311 20 355 196 482 315 20 555 213 636 309 20 474 208 526 306 20 405 176 512 303 20 523 178 601 304 20 138 222 228 310 20 154 207 252 307 20 115 176 192 229 +2287 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035474.jpg 576 640 20 112 172 419 639 +2288 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133237.jpg 640 424 20 53 74 503 404 20 204 257 339 397 +2289 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167128.jpg 640 427 20 286 5 639 419 20 296 238 458 426 20 110 8 398 409 +2290 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273118.jpg 640 480 20 89 66 525 409 +2291 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512254.jpg 424 640 20 115 183 421 625 20 0 109 214 305 20 134 56 302 242 20 279 44 423 205 20 0 65 164 210 +2292 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108864.jpg 640 480 20 116 178 330 393 20 309 190 524 405 +2293 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271785.jpg 640 424 20 141 107 504 376 20 56 97 133 160 0 79 89 117 120 0 480 106 510 188 0 509 14 528 59 0 523 8 534 55 0 500 108 532 175 0 488 80 515 126 0 516 71 540 150 0 531 75 548 177 0 533 129 580 275 0 490 184 537 330 0 185 48 211 70 16 581 199 627 246 0 498 150 541 210 20 165 51 202 70 +2294 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234370.jpg 640 640 20 18 1 639 632 +2295 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476300.jpg 500 375 20 399 213 499 361 20 19 117 156 236 20 205 83 255 123 20 60 49 88 72 20 59 43 67 55 +2296 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331097.jpg 640 480 20 53 262 235 306 20 289 252 440 296 20 463 244 615 292 +2297 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384333.jpg 427 640 20 22 73 413 575 +2298 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398866.jpg 640 427 20 79 105 617 383 20 488 77 584 204 24 371 43 402 94 0 307 2 373 196 0 467 12 506 103 0 400 50 417 84 0 87 121 114 164 0 68 120 92 160 0 16 131 59 185 0 178 7 318 427 0 48 123 92 175 0 94 119 114 149 0 28 124 77 178 0 275 14 332 115 0 74 105 88 133 +2299 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096654.jpg 640 480 20 218 378 304 440 20 403 403 445 460 20 523 391 583 463 +2300 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246672.jpg 640 480 20 73 327 441 472 20 1 36 639 470 +2301 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126216.jpg 640 428 20 404 153 549 259 20 189 150 288 243 20 148 148 218 236 20 296 191 368 246 +2302 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015987.jpg 640 408 20 14 136 326 368 20 265 122 572 368 +2303 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260166.jpg 640 480 20 178 223 324 402 20 315 222 520 473 0 365 130 459 230 0 364 86 409 191 0 226 162 240 189 0 238 171 275 260 0 196 155 239 246 0 223 135 247 172 0 320 98 371 241 0 404 79 464 190 0 239 148 282 228 0 188 153 202 191 0 202 151 210 173 0 210 143 223 155 0 219 143 225 150 0 195 160 208 210 +2304 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408873.jpg 640 480 20 111 172 203 294 20 382 170 551 286 20 51 173 95 250 +2305 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568131.jpg 640 360 20 167 112 541 340 +2306 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168129.jpg 640 436 20 94 38 398 329 +2307 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490860.jpg 640 428 20 179 34 562 402 20 395 0 600 54 0 508 256 532 338 0 414 259 437 365 +2308 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415434.jpg 640 427 20 257 150 552 329 20 12 110 343 329 +2309 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057027.jpg 640 426 20 47 24 592 407 20 0 1 213 195 20 180 262 362 404 20 0 174 88 375 +2310 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296745.jpg 640 427 20 0 1 449 421 0 432 228 568 426 0 580 186 639 421 0 502 162 552 283 0 450 149 495 286 0 413 220 473 426 0 321 225 394 422 0 364 219 419 352 0 316 209 347 371 0 159 237 227 422 0 204 240 257 421 0 266 269 321 408 26 456 333 531 399 0 477 202 541 286 26 583 227 636 330 26 221 280 252 332 26 275 306 303 346 +2311 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170739.jpg 640 514 20 211 38 485 513 20 466 51 639 507 20 0 72 233 428 +2312 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139436.jpg 491 640 20 113 27 396 577 +2313 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420230.jpg 427 640 20 20 19 394 626 +2314 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025191.jpg 640 480 20 9 118 388 313 20 298 145 633 307 +2315 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485485.jpg 640 480 20 272 307 410 396 20 435 297 502 419 2 166 334 191 358 0 616 359 633 372 2 61 318 116 350 +2316 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518365.jpg 640 427 20 255 90 536 323 20 92 183 182 211 20 0 152 84 207 20 407 225 569 268 20 393 229 549 316 +2317 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535156.jpg 640 505 20 133 50 530 438 20 1 112 198 241 20 373 190 568 420 +2318 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488360.jpg 640 428 20 184 188 260 236 +2319 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110638.jpg 640 427 20 107 2 586 350 20 228 130 438 343 20 0 0 125 307 +2320 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196798.jpg 513 640 20 151 182 306 519 20 11 193 160 504 0 428 72 445 107 2 75 120 236 177 2 0 125 18 188 2 59 97 118 131 20 301 176 441 257 0 67 113 83 132 0 44 100 62 134 0 318 62 336 75 0 443 63 457 97 2 213 142 512 639 2 0 66 63 136 2 383 111 466 155 0 10 97 39 135 2 217 86 296 143 0 413 65 431 113 +2321 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001869.jpg 640 424 20 295 144 513 314 20 377 2 639 325 20 3 12 182 339 20 146 64 249 309 +2322 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118579.jpg 480 640 20 0 0 480 631 +2323 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389604.jpg 425 640 20 102 410 193 527 20 67 336 332 509 +2324 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474170.jpg 640 480 20 291 204 383 281 20 250 186 366 282 +2325 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361341.jpg 427 640 21 190 266 225 335 21 308 112 347 153 +2326 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568082.jpg 428 640 21 104 162 325 281 +2327 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315824.jpg 500 332 21 137 157 343 256 21 146 214 278 276 +2328 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372855.jpg 640 449 21 173 115 450 334 32 518 100 604 184 +2329 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212688.jpg 640 480 21 66 83 612 401 +2330 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405226.jpg 640 480 21 230 91 381 368 +2331 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307209.jpg 428 640 21 141 187 270 373 +2332 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127955.jpg 640 425 21 310 31 621 380 21 4 96 360 411 +2333 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075786.jpg 640 427 21 313 136 548 341 +2334 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205776.jpg 640 425 21 91 28 533 268 +2335 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524263.jpg 640 437 21 229 171 347 295 21 329 105 473 196 +2336 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547519.jpg 640 425 21 274 132 495 379 +2337 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285929.jpg 640 300 21 0 88 230 267 21 481 91 599 160 +2338 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183359.jpg 640 425 21 45 128 329 307 +2339 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081081.jpg 640 480 21 24 254 169 350 21 243 149 413 357 21 183 233 257 322 +2340 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503207.jpg 640 426 21 283 217 539 344 +2341 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561027.jpg 640 425 21 64 149 297 278 21 430 182 618 279 21 394 192 470 279 +2342 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474246.jpg 640 454 21 86 35 288 444 +2343 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519611.jpg 640 480 21 144 112 506 384 +2344 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203382.jpg 640 427 21 311 118 420 334 32 277 290 316 324 +2345 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328499.jpg 640 368 21 151 150 313 305 21 197 9 449 161 +2346 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043614.jpg 640 418 21 3 7 529 307 +2347 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304220.jpg 640 480 21 193 202 639 324 +2348 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113313.jpg 640 480 21 91 103 486 446 +2349 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034193.jpg 612 612 21 65 106 216 416 21 251 311 501 528 +2350 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519874.jpg 640 429 21 126 64 387 283 +2351 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020972.jpg 640 425 21 137 38 494 281 29 494 96 616 171 +2352 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360263.jpg 640 427 21 90 189 220 324 +2353 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203460.jpg 640 480 21 37 7 539 436 +2354 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539678.jpg 640 550 21 72 90 447 523 +2355 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431727.jpg 640 427 21 277 177 523 349 21 365 93 532 200 +2356 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361180.jpg 640 426 21 168 35 459 381 +2357 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414261.jpg 640 427 21 390 9 639 392 21 153 65 432 327 +2358 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022002.jpg 640 457 21 368 120 505 423 +2359 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000421361.jpg 640 480 29 340 284 574 410 0 0 92 454 287 +2360 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058157.jpg 640 360 29 365 211 385 216 0 8 218 36 321 0 610 262 627 290 0 59 239 83 304 0 202 222 239 319 0 256 229 289 301 0 234 230 256 302 0 369 238 419 323 0 518 272 527 291 0 408 237 459 320 0 41 217 78 321 0 291 225 335 314 0 456 204 512 341 0 278 269 282 292 0 290 257 607 296 +2361 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557556.jpg 640 414 29 331 122 424 213 0 309 70 490 407 0 551 248 586 356 0 18 267 60 312 0 108 226 155 331 +2362 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165157.jpg 640 349 29 197 53 428 290 0 247 105 351 180 +2363 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323799.jpg 640 480 29 143 265 176 302 29 75 263 91 311 29 393 178 430 219 29 516 230 558 278 0 60 115 135 403 0 516 206 570 390 0 115 152 180 364 0 155 97 234 356 0 224 111 293 346 0 326 112 389 346 0 372 122 447 358 0 484 116 571 390 0 283 130 341 350 0 390 101 505 370 0 72 131 163 229 29 243 163 279 196 +2364 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521259.jpg 640 457 29 270 166 299 196 29 409 126 460 147 29 573 192 599 213 0 403 36 529 366 0 519 95 599 298 0 42 44 268 456 0 289 151 350 243 29 486 155 524 173 0 223 140 239 187 0 239 138 259 201 0 328 142 346 197 0 254 152 298 237 0 211 138 226 176 0 192 142 208 164 0 30 176 71 419 0 352 144 364 176 0 82 138 92 163 7 0 120 58 216 2 0 120 58 222 0 0 126 630 230 +2365 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490306.jpg 480 640 29 174 336 196 440 0 153 52 318 584 9 457 155 467 180 9 427 195 430 201 +2366 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448236.jpg 640 480 29 35 152 293 427 59 1 0 639 474 +2367 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116696.jpg 480 640 45 0 405 136 564 51 305 604 330 639 51 242 577 478 639 77 181 64 341 214 44 27 407 86 492 44 72 266 101 304 0 0 10 91 282 55 109 189 399 564 75 397 97 421 160 75 342 111 362 159 75 447 138 460 159 75 61 88 78 121 75 297 108 312 126 60 1 275 479 639 +2368 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514525.jpg 640 607 50 213 284 308 374 50 123 315 213 403 51 348 100 519 241 45 65 47 571 531 60 0 2 639 596 +2369 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218687.jpg 427 640 55 0 235 427 639 77 102 235 381 437 +2370 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192212.jpg 640 480 63 363 116 543 254 66 399 131 490 264 28 1 228 293 444 59 106 2 639 478 56 0 278 373 480 73 0 35 92 108 64 301 137 350 174 +2371 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369309.jpg 375 500 64 111 379 136 400 66 5 331 117 394 73 330 13 373 98 73 312 15 332 92 73 298 15 318 91 39 73 261 92 319 62 229 250 297 383 73 320 10 345 93 73 290 15 302 90 56 1 439 33 490 62 116 201 200 329 +2372 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462953.jpg 640 480 77 304 112 342 174 77 384 93 442 160 26 226 313 321 376 28 326 372 485 474 28 110 319 221 444 28 211 148 319 272 28 223 364 338 452 28 69 288 135 393 28 104 244 164 325 28 221 272 319 355 28 315 336 439 381 28 313 280 437 339 77 436 334 468 373 28 283 49 439 152 28 314 154 436 282 +2373 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286458.jpg 455 310 77 321 51 358 105 77 319 103 364 143 24 25 2 127 122 28 59 20 310 301 28 347 11 454 139 +2374 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436603.jpg 640 425 77 108 24 483 403 59 0 6 235 418 59 145 1 639 417 +2375 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256529.jpg 640 461 24 456 163 477 202 24 0 213 46 273 26 605 170 622 201 28 514 223 579 267 28 341 252 410 330 28 492 248 596 308 28 502 293 588 339 0 38 174 163 402 0 17 166 77 382 0 148 136 219 281 0 354 145 435 222 0 238 134 280 231 0 290 143 339 228 0 361 140 399 223 0 101 138 154 227 0 208 148 249 277 26 542 157 561 186 28 0 306 18 386 28 469 221 523 266 0 334 148 367 204 24 360 220 423 255 24 176 268 271 311 24 234 312 285 357 24 550 191 609 240 24 519 186 549 203 0 456 138 499 279 28 148 295 235 351 62 611 124 628 138 0 270 142 295 231 0 526 138 582 221 0 308 130 626 227 +2376 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152245.jpg 640 480 24 609 186 639 317 28 304 363 416 474 28 221 365 332 473 28 197 258 371 398 28 148 210 237 277 28 161 139 310 227 0 3 58 176 474 0 127 87 200 176 0 319 71 378 174 0 396 76 452 153 0 437 64 499 137 0 528 3 639 474 28 160 272 205 357 62 155 9 229 54 62 223 14 283 57 62 546 38 565 58 62 369 27 497 56 62 0 0 28 53 62 564 39 583 56 0 203 99 253 139 0 504 76 546 130 26 267 169 403 289 28 0 322 38 413 28 194 334 233 377 28 392 126 539 236 62 503 36 517 54 +2377 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170950.jpg 480 640 26 129 279 241 413 2 300 185 407 252 2 407 235 457 297 0 115 71 294 562 2 376 179 464 237 2 268 184 315 208 24 124 282 241 411 28 194 453 360 627 +2378 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576820.jpg 500 375 26 71 134 124 182 28 210 251 259 324 28 340 245 431 359 28 165 202 241 242 0 166 68 220 155 0 220 96 279 259 0 263 69 301 152 0 259 56 373 363 0 423 63 499 369 0 54 101 155 339 0 9 80 49 215 0 387 139 427 261 0 213 110 234 155 0 425 112 460 186 26 266 102 299 135 28 123 152 168 200 0 160 151 176 193 0 166 161 211 203 0 275 74 314 167 +2379 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067776.jpg 612 612 28 83 176 384 596 28 217 30 515 432 +2380 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420059.jpg 480 640 28 73 44 410 517 +2381 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434915.jpg 640 480 28 314 246 639 440 28 319 354 596 473 28 167 435 238 479 28 275 424 351 479 28 225 408 301 479 28 99 452 165 479 +2382 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411821.jpg 484 640 28 65 331 423 469 28 53 240 448 408 28 25 77 460 260 28 10 363 471 629 +2383 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064915.jpg 640 480 28 387 315 498 435 28 379 202 562 349 28 372 128 571 249 28 300 5 528 142 28 25 264 400 472 28 35 100 377 336 +2384 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432160.jpg 425 640 28 54 278 177 537 28 206 236 257 419 28 122 288 230 443 26 170 427 294 518 +2385 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108408.jpg 427 640 28 313 325 424 631 28 214 209 304 507 28 41 198 169 514 28 1 204 68 527 28 56 120 126 232 28 250 278 426 571 28 175 205 267 453 28 148 145 323 361 +2386 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304159.jpg 428 640 28 74 178 344 265 28 78 248 338 323 +2387 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251044.jpg 500 334 28 264 166 499 329 24 0 207 131 329 28 218 13 389 104 24 119 177 267 312 13 259 0 484 176 67 413 88 437 98 +2388 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507783.jpg 640 480 28 338 194 639 472 28 78 177 190 470 28 0 83 107 130 28 133 19 394 109 28 47 45 342 128 28 0 76 270 444 28 491 321 639 477 28 395 76 440 98 28 164 91 531 473 +2389 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534349.jpg 453 640 28 0 44 428 632 +2390 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300055.jpg 600 402 28 176 63 423 272 +2391 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491835.jpg 427 640 28 273 296 355 485 0 172 150 327 479 0 21 282 54 368 0 62 275 86 365 0 87 278 109 367 0 119 281 137 366 0 344 276 367 354 0 385 306 412 353 0 364 284 380 352 0 168 280 183 356 0 151 279 173 358 0 386 277 409 323 0 107 286 123 360 26 178 186 238 310 26 184 300 191 321 26 390 301 426 338 28 46 312 73 366 28 8 331 28 367 26 157 293 175 314 26 321 316 338 331 26 375 308 383 325 0 292 292 313 355 28 405 311 422 351 28 317 332 341 355 0 132 283 426 360 +2392 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079544.jpg 427 640 28 100 347 192 413 28 198 293 288 473 28 98 402 291 640 24 14 317 77 394 45 292 233 327 250 45 199 161 219 172 56 277 202 329 241 28 242 382 343 572 28 149 288 196 313 28 174 252 274 326 60 272 216 426 311 24 0 508 91 634 0 94 90 187 301 +2393 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227468.jpg 640 480 28 204 103 364 315 24 349 93 564 396 28 361 92 558 398 26 176 0 375 128 28 3 4 258 404 +2394 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020912.jpg 500 375 28 304 201 483 287 73 6 168 93 272 +2395 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289995.jpg 640 480 0 458 155 559 313 0 454 150 502 224 0 91 180 248 289 0 101 168 153 255 0 267 179 310 262 0 70 190 102 230 0 210 175 248 243 0 253 170 293 263 0 314 179 339 226 0 336 182 362 225 0 567 177 593 211 26 286 207 308 238 0 591 176 639 256 25 0 7 316 140 25 177 129 282 163 25 163 158 263 180 25 296 114 515 180 25 482 93 639 164 25 497 0 639 86 25 249 151 311 188 25 253 21 556 261 25 436 157 484 175 25 0 118 186 227 25 609 115 639 142 26 553 186 568 206 26 570 188 576 207 47 555 236 634 262 0 5 210 60 260 25 22 165 119 187 47 598 270 610 281 0 0 166 639 249 +2396 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283441.jpg 640 426 2 611 30 639 90 13 123 176 178 227 +2397 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387551.jpg 640 480 8 291 212 339 235 8 143 211 219 243 8 232 188 320 228 8 37 226 119 252 8 385 178 432 215 8 517 188 539 201 8 428 188 461 210 8 324 185 380 220 8 461 188 488 206 8 541 187 556 198 8 489 188 507 205 8 551 182 562 194 8 506 188 519 202 +2398 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361085.jpg 640 360 8 231 271 314 300 8 65 280 134 300 8 74 266 134 286 8 111 255 165 270 8 137 240 188 258 8 164 222 209 244 8 401 267 469 296 8 420 234 465 245 8 419 225 462 236 8 422 221 451 226 8 263 249 330 271 8 278 237 329 250 8 318 211 349 225 8 0 164 636 359 +2399 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230739.jpg 640 427 8 323 396 360 409 8 85 344 103 373 8 219 343 258 360 8 311 344 341 351 8 367 355 392 361 8 486 350 509 354 8 522 349 548 357 8 557 360 591 369 8 589 346 613 353 8 482 359 512 364 8 297 372 343 387 8 32 358 57 360 8 455 340 470 342 8 129 335 637 370 +2400 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442822.jpg 640 427 8 63 204 378 374 8 276 186 424 257 8 367 183 478 237 8 396 158 533 219 8 440 150 582 203 8 484 140 631 194 8 212 135 359 175 8 292 131 405 169 8 133 107 196 139 8 343 134 476 162 8 167 134 314 216 8 17 101 106 147 8 177 102 228 135 8 119 164 243 222 8 0 0 623 252 +2401 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144058.jpg 640 427 14 298 299 315 306 8 553 221 616 243 8 490 198 557 240 8 396 196 438 235 8 227 121 284 240 8 520 205 581 244 8 167 208 215 223 8 613 196 639 223 8 345 211 368 236 8 56 219 110 225 8 48 237 110 251 8 531 218 605 267 8 258 199 309 235 8 267 238 310 253 8 436 163 519 203 +2402 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286994.jpg 640 480 20 329 312 439 384 20 297 232 330 253 20 488 224 536 247 20 114 218 166 249 20 251 241 271 253 20 271 240 295 253 20 363 240 388 250 20 51 224 86 240 20 0 217 26 237 +2403 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540107.jpg 640 320 20 14 183 142 245 20 89 95 173 183 20 373 78 448 160 20 469 177 511 242 20 303 71 367 120 20 144 69 196 121 20 141 30 249 99 20 411 39 494 101 20 246 49 306 121 20 518 181 564 240 20 103 186 165 218 20 172 194 219 239 20 199 164 228 220 20 1 33 639 248 +2404 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121633.jpg 640 480 20 273 187 513 386 20 40 107 327 409 20 171 42 296 152 20 608 116 638 212 20 551 0 581 35 20 579 0 605 25 0 465 1 475 24 20 605 0 637 27 +2405 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418565.jpg 640 480 25 140 135 267 233 25 170 52 325 145 25 341 64 497 179 25 278 138 401 240 25 216 196 326 281 25 182 242 276 289 25 424 151 539 250 25 387 252 482 300 25 457 210 569 296 25 433 290 514 354 25 296 313 366 375 25 218 312 291 372 25 458 0 637 77 25 0 0 639 459 +2406 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347377.jpg 500 375 25 336 127 368 192 25 361 147 397 226 25 129 126 152 227 25 228 145 252 196 25 64 145 91 227 +2407 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247407.jpg 640 480 27 262 224 583 479 73 164 320 288 395 0 201 5 615 479 0 0 64 241 479 +2408 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252549.jpg 561 640 27 238 449 286 554 27 148 248 173 292 27 259 130 280 203 27 301 139 317 205 27 142 126 164 229 27 202 98 222 197 27 285 47 303 118 27 464 119 484 191 27 505 132 517 191 27 178 220 225 296 27 471 34 497 109 27 332 513 408 574 27 214 129 237 217 27 410 406 522 513 +2409 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112440.jpg 426 640 27 168 206 213 443 27 154 237 188 463 27 142 62 183 244 27 113 181 131 443 27 97 188 126 455 27 71 179 97 432 27 54 184 91 447 27 35 164 66 447 27 11 167 36 427 27 0 57 23 438 27 128 65 159 462 27 5 56 51 178 27 49 60 93 189 27 1 0 299 633 +2410 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216841.jpg 334 500 27 117 1 244 133 27 240 1 333 127 27 6 132 122 265 27 103 124 233 278 27 203 132 333 299 27 284 324 333 444 27 201 320 279 432 27 105 294 199 398 27 52 292 127 377 27 14 12 113 128 27 0 283 62 370 27 43 399 105 473 27 213 258 266 297 27 1 1 333 499 +2411 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227709.jpg 320 240 0 193 13 318 77 15 1 10 319 239 66 1 79 146 239 +2412 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000006497.jpg 640 521 3 126 76 143 96 75 439 44 595 227 +2413 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229221.jpg 640 427 19 146 92 483 421 19 447 242 522 275 +2414 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442210.jpg 375 500 24 205 116 361 365 24 70 225 246 459 24 14 51 202 369 +2415 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538451.jpg 500 375 25 0 0 382 375 +2416 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282790.jpg 640 308 26 17 73 129 245 28 464 37 624 257 28 126 57 230 241 28 349 47 451 240 24 244 49 344 245 26 133 57 232 239 28 20 75 127 244 +2417 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568337.jpg 640 480 28 41 95 354 432 +2418 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413341.jpg 640 480 66 2 218 639 473 77 134 91 247 268 77 374 98 466 255 +2419 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231364.jpg 640 480 21 21 100 608 406 +2420 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214306.jpg 640 424 16 330 132 467 423 41 81 121 104 144 58 198 50 237 79 +2421 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045367.jpg 480 640 16 0 257 395 577 0 0 50 480 628 59 0 54 430 639 73 169 280 479 551 +2422 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065430.jpg 640 307 16 86 150 315 287 16 415 131 593 253 29 77 215 142 258 +2423 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546962.jpg 475 640 16 208 251 347 408 29 238 303 292 349 +2424 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230619.jpg 500 332 16 0 34 265 327 69 336 2 499 325 +2425 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416059.jpg 640 427 16 121 238 217 394 0 349 39 443 242 0 420 58 532 297 30 365 241 405 255 30 435 298 484 312 26 512 108 549 188 +2426 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012966.jpg 640 427 16 186 31 570 416 +2427 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134112.jpg 500 357 16 193 65 487 271 59 2 6 498 347 63 1 88 394 332 +2428 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356406.jpg 640 425 16 162 195 362 363 0 221 54 278 325 0 372 89 539 366 0 328 109 381 321 0 8 131 26 189 0 57 132 69 162 0 213 146 234 200 +2429 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090003.jpg 640 480 16 219 213 492 364 16 144 205 329 325 29 136 248 189 274 +2430 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197097.jpg 640 480 16 305 218 470 344 57 187 60 639 472 57 2 62 186 473 63 154 251 391 425 65 164 423 242 475 65 194 443 271 479 73 298 440 422 479 56 0 68 208 473 75 192 0 242 93 +2431 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303253.jpg 640 360 16 263 202 467 339 +2432 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132389.jpg 640 428 16 21 100 484 424 +2433 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267115.jpg 375 500 16 145 253 305 440 +2434 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556758.jpg 640 480 16 491 217 508 237 17 386 213 420 253 17 420 199 467 240 17 477 185 527 219 17 416 188 472 214 0 494 165 511 206 24 511 172 516 184 0 438 171 452 191 0 450 175 462 192 24 457 185 462 192 0 443 183 457 225 0 397 189 417 232 +2435 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277622.jpg 640 427 16 96 127 402 393 16 264 25 620 417 +2436 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223032.jpg 500 357 16 110 137 322 237 29 256 180 323 235 +2437 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482021.jpg 640 581 16 146 384 338 556 0 28 24 162 554 0 154 53 291 492 0 289 59 461 529 0 430 33 639 541 73 409 165 436 262 73 237 229 277 239 26 517 190 630 304 26 416 123 448 166 73 416 163 456 223 24 31 203 45 277 +2438 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504341.jpg 640 480 16 120 151 510 348 +2439 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462330.jpg 640 322 16 92 34 579 228 65 51 199 393 305 57 0 2 639 315 +2440 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339470.jpg 640 480 16 138 68 507 440 59 1 283 639 472 +2441 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283940.jpg 640 428 16 2 42 585 377 65 372 1 639 250 57 3 238 309 427 +2442 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445594.jpg 640 480 16 0 2 547 398 73 0 258 640 472 +2443 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307531.jpg 500 332 16 230 90 337 168 0 102 0 135 67 29 169 49 225 62 +2444 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054643.jpg 640 478 16 215 0 639 331 77 103 20 448 432 +2445 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058001.jpg 640 425 16 51 10 608 348 24 1 0 108 370 57 0 0 640 425 65 61 292 224 409 65 375 323 443 417 +2446 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518584.jpg 500 375 16 151 123 498 369 +2447 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303006.jpg 500 333 58 0 149 16 189 60 0 222 206 328 60 256 161 300 223 73 123 38 152 57 73 72 240 138 278 73 121 133 133 152 39 293 160 296 175 56 264 173 291 215 56 272 171 276 178 75 14 159 28 184 75 28 168 41 184 39 14 161 28 183 56 30 183 125 250 56 290 193 299 223 57 30 182 125 249 73 175 29 191 49 73 264 37 267 59 73 343 27 346 46 73 401 15 404 38 73 127 64 130 78 73 282 33 299 55 73 250 14 256 33 73 288 5 292 27 73 332 0 337 19 73 232 16 243 38 73 110 0 499 306 +2448 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525087.jpg 640 480 58 458 269 604 341 58 319 270 455 345 58 6 267 149 339 58 153 288 182 338 58 226 280 284 337 17 127 70 563 366 0 282 6 370 113 0 204 14 291 101 0 57 3 128 262 0 161 94 274 374 0 530 22 614 259 0 403 18 488 258 0 362 0 428 121 0 0 5 55 258 0 127 25 203 138 26 546 98 607 169 26 425 87 478 119 27 391 28 400 67 +2449 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051339.jpg 640 426 58 37 0 639 396 50 449 309 490 346 50 383 119 403 138 50 115 271 161 313 +2450 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334471.jpg 640 427 58 161 121 322 423 13 456 239 639 425 58 311 205 451 392 2 357 0 445 41 2 257 17 272 25 +2451 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240393.jpg 478 640 62 423 64 477 290 66 354 325 477 427 16 99 177 376 441 +2452 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189566.jpg 353 480 62 73 183 280 365 0 76 215 154 350 0 235 233 276 327 0 136 219 265 354 +2453 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431671.jpg 640 480 62 364 19 639 240 41 573 296 638 376 46 517 321 576 377 63 83 327 267 429 66 462 235 639 317 62 579 50 639 260 41 436 266 490 365 +2454 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241868.jpg 640 313 14 603 121 629 139 22 114 117 266 223 22 291 58 582 212 +2455 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123627.jpg 640 480 17 110 249 342 384 17 302 229 537 381 0 356 220 425 293 0 158 231 248 302 0 0 340 151 479 0 353 405 467 469 0 230 430 331 479 0 607 399 639 478 0 332 458 450 479 0 554 391 631 479 0 199 443 243 479 0 363 365 450 426 +2456 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030843.jpg 333 640 17 23 35 332 626 17 0 2 260 412 +2457 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129735.jpg 640 458 17 68 116 502 452 0 180 6 409 325 0 121 28 162 77 0 74 134 128 203 0 205 149 236 206 0 40 133 77 200 0 81 23 138 90 0 569 34 609 87 0 472 12 507 57 0 42 47 84 99 0 24 43 54 81 0 506 62 546 101 0 261 49 290 88 56 573 147 609 192 56 610 147 637 193 56 578 106 606 123 56 220 78 255 105 0 90 59 122 103 56 177 136 239 161 56 577 87 615 101 56 188 78 222 105 56 469 77 506 119 0 0 0 639 155 +2458 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505739.jpg 640 470 17 106 0 634 465 0 80 94 198 263 17 381 70 460 134 +2459 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331242.jpg 640 480 17 221 129 502 479 0 70 106 139 369 0 122 112 167 304 0 199 153 228 226 0 182 157 194 187 0 195 153 200 168 0 254 143 302 356 0 198 160 206 178 0 161 188 177 226 8 472 119 487 122 0 206 156 212 167 0 0 207 26 474 0 107 138 153 335 +2460 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133571.jpg 640 427 17 0 63 385 426 7 150 136 376 275 7 260 72 494 275 7 0 88 127 196 +2461 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431521.jpg 640 403 17 488 226 515 245 17 313 232 343 251 +2462 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316000.jpg 500 375 17 214 174 311 276 +2463 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243331.jpg 500 375 17 149 127 303 321 +2464 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300814.jpg 640 435 17 164 177 260 349 0 157 108 270 283 0 428 28 467 59 0 398 36 425 71 0 354 29 385 73 0 314 33 347 83 0 233 36 266 87 0 24 48 56 89 0 347 103 430 263 17 351 184 439 332 0 0 59 18 91 0 589 62 639 179 0 270 35 300 74 +2465 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105156.jpg 640 480 17 124 138 390 369 0 252 152 260 164 2 1 141 75 269 13 320 206 569 430 0 232 137 249 169 +2466 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044612.jpg 640 624 17 28 125 386 480 0 392 67 585 615 +2467 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442523.jpg 375 500 17 91 266 136 299 +2468 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226571.jpg 640 426 17 172 200 513 422 17 46 227 284 401 0 325 145 390 331 0 144 164 209 326 8 51 205 56 218 +2469 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496450.jpg 640 427 17 353 233 543 422 0 310 184 332 203 0 346 195 376 223 0 375 187 413 220 0 335 178 361 218 26 282 203 308 225 17 239 209 248 234 26 396 203 406 220 0 253 205 259 215 0 373 187 388 217 0 277 185 317 233 +2470 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471205.jpg 640 424 17 140 174 315 298 17 41 173 214 296 0 312 158 348 297 0 274 154 320 290 0 460 166 509 295 0 487 144 544 296 +2471 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016228.jpg 640 440 17 340 152 537 351 13 527 233 623 292 0 196 189 243 301 0 314 178 350 232 0 76 196 108 262 0 117 195 129 254 0 121 188 144 256 0 38 200 53 261 0 156 197 166 218 25 349 129 476 192 25 591 161 632 174 27 223 214 228 243 0 66 205 79 259 0 8 222 30 262 0 264 195 282 218 0 528 170 547 199 0 85 202 105 256 6 119 135 346 319 25 618 153 633 165 0 6 194 18 252 0 13 166 629 293 +2472 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015956.jpg 640 480 17 129 84 365 302 74 493 126 514 147 74 42 83 67 106 0 365 138 445 336 +2473 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550001.jpg 640 456 17 75 63 226 385 +2474 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031164.jpg 427 640 17 15 118 272 284 0 223 151 335 464 0 309 138 418 470 0 97 48 164 223 +2475 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309302.jpg 500 338 17 307 71 459 250 17 227 63 285 201 17 204 71 242 178 17 167 67 208 181 17 151 78 186 168 1 56 110 61 125 2 66 102 85 118 0 54 100 62 123 17 142 90 173 158 +2476 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455355.jpg 640 511 17 326 209 574 401 19 65 288 153 393 2 529 104 577 123 2 431 140 615 188 2 123 127 211 155 2 248 111 317 153 0 381 131 464 332 0 463 177 501 228 2 86 132 151 160 7 396 108 533 142 7 216 106 317 153 0 1 117 59 231 2 296 114 400 150 7 525 105 581 143 7 98 149 337 228 +2477 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445512.jpg 640 436 17 499 239 624 329 17 452 240 528 330 0 398 208 450 289 17 336 231 426 337 17 204 229 378 341 17 145 230 307 339 17 103 225 248 338 17 52 234 196 336 17 0 227 79 320 17 386 229 494 338 17 588 266 630 317 +2478 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230040.jpg 640 480 17 423 237 433 254 17 412 234 421 254 0 414 228 422 243 0 421 230 428 245 0 411 231 415 244 +2479 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210408.jpg 640 640 17 79 254 563 591 0 175 288 188 304 0 161 282 178 313 0 561 274 603 368 0 218 282 232 300 0 0 242 23 261 0 482 346 508 396 9 246 180 260 217 0 575 284 596 350 0 336 284 346 292 0 588 308 595 327 0 230 277 253 311 +2480 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000552837.jpg 640 427 17 228 330 304 399 +2481 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380892.jpg 640 480 17 229 350 357 420 2 34 297 47 302 2 37 294 41 296 2 50 292 65 297 2 86 297 95 302 17 560 336 583 376 19 561 338 580 374 2 124 298 133 302 2 132 297 140 301 2 279 302 294 308 2 257 301 275 308 2 15 297 31 301 +2482 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256470.jpg 500 375 17 195 88 354 370 +2483 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113579.jpg 640 423 17 411 9 638 415 17 0 210 255 418 +2484 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524064.jpg 640 428 17 420 255 528 426 17 209 267 329 421 0 428 216 497 345 0 254 229 315 344 0 67 298 95 353 0 150 304 169 332 0 24 281 62 353 0 337 291 355 363 0 358 281 371 300 0 385 281 397 297 0 403 295 418 317 0 85 292 100 324 0 131 332 181 422 0 134 294 154 322 0 122 299 150 343 0 1 262 634 378 +2485 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375530.jpg 427 640 17 46 362 426 633 0 297 389 324 426 0 254 380 302 423 0 266 379 274 401 0 373 399 397 439 0 342 379 373 430 0 288 377 299 400 0 283 378 288 384 0 248 378 261 413 0 17 376 58 498 0 325 381 333 407 0 386 395 406 431 9 188 323 196 350 9 18 298 52 330 0 334 409 348 428 0 322 406 335 428 0 23 368 426 471 +2486 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413959.jpg 640 398 17 323 228 484 349 0 379 211 396 242 0 563 227 595 295 0 406 206 421 238 0 421 214 434 233 0 463 213 470 244 0 550 217 568 262 0 490 253 527 311 0 457 266 479 300 0 619 218 635 264 0 394 210 413 238 14 541 345 562 365 14 302 343 319 357 14 432 327 443 338 14 457 323 470 336 0 275 226 290 263 14 518 337 536 346 14 606 331 626 342 14 304 133 319 141 14 404 346 412 355 14 428 346 438 363 14 452 344 470 361 14 498 350 522 364 0 258 225 283 280 14 468 330 479 338 0 433 215 451 232 14 442 330 456 339 14 1 333 606 397 0 44 201 639 310 +2487 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003209.jpg 640 640 17 145 98 639 525 17 195 243 233 325 0 345 51 431 360 0 43 191 107 396 0 1 200 39 409 0 195 213 235 276 +2488 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497312.jpg 480 640 17 0 316 342 636 0 322 415 431 639 0 172 220 353 522 2 413 336 479 372 0 0 293 44 412 +2489 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557965.jpg 640 427 17 147 167 367 337 17 396 181 637 348 8 331 135 341 146 0 248 113 307 258 0 489 109 552 275 8 567 139 575 146 +2490 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366576.jpg 640 480 17 66 137 220 241 0 561 140 628 237 0 430 114 469 142 7 248 123 362 197 22 237 200 443 365 0 303 135 335 171 2 207 127 247 183 2 364 140 402 170 2 375 151 412 174 56 167 214 228 307 56 64 199 87 242 0 331 139 343 160 2 350 147 363 175 7 208 127 248 182 0 34 198 53 252 +2491 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505650.jpg 429 640 17 272 316 388 601 17 145 334 241 576 25 277 275 429 330 32 185 442 220 477 0 136 284 253 493 0 349 349 384 407 0 96 352 130 395 0 376 351 411 410 0 17 352 47 395 0 59 348 97 396 0 124 342 155 398 0 93 355 109 385 0 244 314 387 502 0 37 351 70 394 0 0 350 22 394 0 338 323 368 379 0 421 364 428 414 0 6 338 428 409 +2492 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318671.jpg 640 424 17 96 129 359 402 24 83 181 98 201 24 51 194 66 215 0 416 162 460 287 0 563 172 577 200 0 72 181 90 237 0 37 174 59 240 0 377 164 390 178 0 374 178 388 194 0 352 160 375 194 0 407 161 422 188 0 469 161 491 224 0 607 159 636 228 0 594 189 611 227 0 539 171 547 185 26 616 169 633 197 0 551 180 558 196 6 288 56 530 311 24 616 168 633 196 0 67 154 602 232 +2493 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360661.jpg 640 480 17 75 186 356 354 17 372 204 620 355 17 0 204 80 326 0 216 177 285 257 0 493 180 559 267 0 113 220 145 313 0 0 183 22 230 +2494 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030668.jpg 640 427 17 368 149 519 281 0 407 99 447 213 14 559 204 576 218 14 432 18 462 28 +2495 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576857.jpg 640 427 17 530 236 606 353 17 495 231 542 350 17 422 252 498 346 17 381 246 433 341 17 218 256 261 284 17 302 243 341 336 17 340 256 400 336 2 0 275 66 397 9 554 109 579 161 0 129 240 206 426 0 548 202 590 296 0 490 204 537 292 0 451 208 486 300 0 418 216 448 258 27 260 269 266 281 0 330 219 364 262 0 309 226 331 259 0 407 244 424 261 0 236 226 252 258 0 201 232 224 262 0 230 223 320 421 0 356 219 402 257 0 19 236 162 426 17 198 258 223 317 17 180 254 205 316 +2496 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265063.jpg 640 424 17 461 235 535 337 0 472 208 520 285 0 252 247 265 276 17 515 241 594 338 0 334 249 339 264 0 524 215 562 289 0 271 249 277 267 0 362 249 370 273 0 319 242 323 260 +2497 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430788.jpg 640 427 17 89 139 402 381 0 0 167 38 237 13 262 256 359 315 0 28 167 108 376 +2498 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457230.jpg 640 427 17 6 101 247 421 17 122 136 379 422 39 144 96 168 127 0 73 53 169 177 0 238 66 330 167 0 364 82 456 198 0 425 106 474 162 0 546 126 638 175 17 384 153 625 424 17 0 186 82 371 17 266 142 511 420 9 284 20 313 81 17 480 197 639 410 0 1 38 36 205 +2499 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334760.jpg 427 640 17 0 220 284 387 0 205 76 255 194 0 135 71 193 233 0 88 81 135 235 0 124 64 150 118 0 14 78 67 234 0 253 79 296 125 0 302 73 361 129 0 360 75 403 153 0 54 78 102 232 0 406 73 426 123 0 180 113 408 380 +2500 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319721.jpg 480 640 17 155 148 375 639 0 1 168 177 630 0 134 255 160 352 0 0 169 32 258 +2501 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505528.jpg 640 425 17 168 155 361 310 0 391 137 446 223 +2502 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107227.jpg 480 640 17 0 329 478 639 0 155 93 324 590 +2503 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425973.jpg 640 360 17 296 46 433 310 17 331 117 499 345 +2504 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406451.jpg 640 427 17 273 104 504 424 2 466 92 565 149 2 550 92 639 146 2 286 97 388 132 2 0 101 31 155 2 236 95 293 126 2 163 99 219 107 9 143 35 154 51 9 152 41 160 55 +2505 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156834.jpg 640 427 17 240 187 440 354 0 310 149 359 277 0 125 208 139 241 0 111 204 121 241 0 151 202 162 238 0 59 208 71 244 +2506 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170173.jpg 640 426 17 129 125 348 385 0 187 70 260 276 0 79 132 121 251 17 85 179 154 339 +2507 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067590.jpg 426 640 17 179 258 310 608 17 62 241 129 496 0 178 190 301 470 0 126 197 196 355 0 297 196 352 291 0 14 256 71 431 0 43 177 149 399 0 200 185 229 252 17 118 264 200 469 17 278 231 372 368 17 178 241 223 345 +2508 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185366.jpg 640 425 17 83 66 243 388 17 455 99 586 279 +2509 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212647.jpg 640 425 17 299 169 583 394 0 136 195 226 413 0 409 121 467 292 0 453 187 582 419 +2510 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336949.jpg 640 427 17 5 253 328 391 2 54 271 74 276 0 567 137 617 334 0 326 245 338 280 0 313 248 324 280 0 321 247 329 281 +2511 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052020.jpg 424 640 17 0 12 297 544 2 344 315 399 336 +2512 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479938.jpg 640 425 17 82 212 335 408 9 334 81 360 117 0 403 176 512 282 0 273 208 308 243 0 517 196 549 263 0 550 201 579 323 0 0 216 9 287 0 15 196 76 323 0 60 212 114 313 0 578 177 585 204 0 83 190 102 210 0 158 200 179 234 3 568 219 618 314 26 53 217 79 257 0 246 200 277 251 3 329 230 375 271 3 348 222 393 251 3 368 208 405 246 3 621 237 639 317 3 400 227 444 246 3 541 232 554 256 3 382 227 413 249 3 307 220 351 243 0 125 202 146 231 0 501 195 515 223 0 4 187 120 321 +2513 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127576.jpg 640 425 17 260 165 413 239 56 44 9 404 424 +2514 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373119.jpg 640 427 17 426 260 464 332 17 481 258 515 314 0 432 216 462 256 0 484 235 504 260 0 501 223 520 248 0 475 209 501 251 0 454 218 483 298 17 503 247 524 287 17 471 226 503 263 26 463 266 474 282 +2515 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501835.jpg 640 426 17 268 197 333 393 17 155 188 282 399 0 117 217 165 289 0 154 236 178 268 0 70 241 83 259 0 66 246 72 263 0 181 238 191 249 0 69 239 101 288 +2516 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377060.jpg 640 428 17 105 92 359 311 17 594 233 621 285 0 191 37 294 245 +2517 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029577.jpg 480 640 17 129 188 451 632 17 1 185 170 625 +2518 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173693.jpg 640 480 17 215 207 356 297 0 262 178 290 255 0 252 186 275 209 0 359 386 394 479 0 388 380 423 470 0 426 383 459 479 0 589 385 631 478 0 510 398 558 477 0 509 375 551 418 0 466 385 512 479 0 332 391 376 479 17 246 200 275 224 0 549 394 582 479 26 129 416 150 458 26 386 393 409 444 0 227 397 273 479 0 276 395 305 479 0 1 0 639 479 +2519 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073039.jpg 431 640 17 268 75 429 266 2 0 308 78 373 26 171 366 257 505 26 270 524 359 624 +2520 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253843.jpg 640 427 17 180 182 462 381 0 214 152 266 348 0 169 153 217 338 +2521 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479078.jpg 600 400 17 143 140 385 361 0 177 77 210 115 0 506 90 539 112 0 386 260 411 285 0 425 263 458 314 0 41 89 72 118 0 474 259 499 310 0 567 52 599 112 0 209 98 315 255 +2522 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348474.jpg 640 480 17 254 243 352 320 0 333 250 358 324 17 473 245 563 301 17 352 231 403 299 +2523 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300791.jpg 448 640 17 221 246 317 456 1 66 354 97 492 0 224 224 275 289 0 43 238 124 446 0 189 246 225 287 24 52 317 114 363 0 270 246 282 261 0 213 239 232 279 +2524 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489266.jpg 640 480 17 199 126 485 400 +2525 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576955.jpg 640 427 17 333 93 443 343 0 308 52 425 256 0 239 16 269 114 +2526 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142318.jpg 640 424 17 47 34 516 404 +2527 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007281.jpg 640 361 17 349 188 460 356 17 471 179 547 355 0 344 132 472 298 0 465 122 527 195 0 551 193 568 221 0 572 201 579 211 0 592 203 601 216 0 255 199 260 205 0 601 203 606 214 0 634 209 637 214 0 0 225 34 270 0 534 209 537 213 +2528 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382088.jpg 640 426 17 187 71 431 419 +2529 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012166.jpg 640 425 17 92 20 383 386 17 349 103 498 361 +2530 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005723.jpg 640 360 17 382 222 453 277 17 272 219 301 274 17 354 235 390 273 17 305 220 335 274 17 333 219 358 272 17 355 216 395 242 +2531 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244050.jpg 640 480 17 142 188 616 411 0 242 131 361 304 0 241 339 367 473 0 0 310 103 471 0 107 389 223 479 0 535 314 639 471 0 453 390 551 479 0 256 432 370 479 67 500 323 562 345 0 369 437 451 469 +2532 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364567.jpg 640 447 17 226 181 459 334 0 290 135 394 264 22 116 216 187 427 22 5 213 97 420 22 331 280 387 385 22 429 216 483 390 58 529 345 565 364 58 0 397 47 439 58 578 340 611 361 +2533 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124013.jpg 500 475 17 0 219 500 469 0 59 51 247 373 0 25 27 148 416 0 130 265 301 474 +2534 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377984.jpg 395 640 17 34 161 358 588 0 85 51 199 298 +2535 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465715.jpg 500 333 17 87 81 112 100 0 77 75 85 107 0 404 70 410 105 0 436 79 451 92 0 407 46 413 55 0 334 66 337 74 17 138 73 157 88 0 480 35 483 42 0 473 37 479 46 0 129 77 139 93 0 457 40 466 52 0 433 72 441 79 0 416 68 435 114 0 408 72 413 90 0 362 72 368 78 0 263 48 421 82 +2536 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437393.jpg 480 640 17 38 108 479 631 +2537 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238573.jpg 640 420 17 280 177 400 305 +2538 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056724.jpg 640 480 17 285 189 421 427 17 6 112 393 472 67 530 270 557 302 67 504 307 532 379 0 133 37 227 373 0 227 119 278 197 0 381 218 613 479 0 543 206 570 269 0 621 211 639 307 0 601 216 628 283 0 504 198 540 226 0 620 218 639 246 0 499 210 508 217 +2539 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297037.jpg 640 305 17 87 103 227 194 0 152 81 187 149 +2540 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538595.jpg 640 466 17 202 261 323 346 17 346 252 387 327 17 414 285 437 306 17 433 288 444 299 17 448 289 476 305 17 475 286 498 303 17 500 288 517 301 17 174 276 204 325 17 331 258 345 264 17 319 262 329 271 17 306 266 316 274 17 147 244 157 251 +2541 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542676.jpg 640 391 17 1 43 392 369 0 342 109 544 390 +2542 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108152.jpg 640 481 17 113 4 480 473 0 56 174 103 227 17 340 73 565 426 +2543 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198075.jpg 640 427 17 220 187 289 259 17 96 199 135 262 17 182 181 233 257 17 130 195 179 259 17 313 196 357 250 0 138 169 166 228 0 198 170 231 226 0 355 179 369 208 0 331 180 347 223 0 282 175 298 224 0 368 176 387 226 17 366 199 383 252 0 116 167 138 210 17 354 200 369 247 17 266 196 315 252 0 245 168 266 226 +2544 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143769.jpg 640 427 17 48 91 544 414 17 342 102 548 261 58 530 18 630 92 +2545 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372362.jpg 640 427 17 179 107 448 413 17 118 127 373 379 2 595 161 639 220 0 447 71 493 214 25 367 30 487 108 2 568 143 586 182 56 110 213 121 238 56 101 210 113 235 60 62 219 90 248 0 375 71 435 169 2 587 147 639 172 2 622 144 639 157 0 525 122 572 167 +2546 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395634.jpg 640 480 17 271 183 317 250 0 145 223 261 474 17 270 190 301 225 0 592 188 618 261 0 579 187 595 237 0 226 176 236 188 0 442 194 449 213 0 144 205 155 221 0 123 205 141 220 2 318 203 371 219 26 221 426 297 479 0 236 170 254 198 0 400 198 405 212 5 601 176 627 199 0 155 204 165 221 0 619 189 638 238 0 381 198 387 217 0 360 200 367 223 +2547 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495491.jpg 480 640 17 52 39 456 612 +2548 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345998.jpg 480 640 17 139 283 312 570 0 85 296 172 526 0 140 186 268 360 +2549 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016574.jpg 640 359 17 283 164 321 255 17 556 163 608 246 17 59 165 94 259 17 186 169 223 257 17 359 155 402 255 17 481 163 511 249 0 567 123 598 180 0 400 196 454 313 0 471 125 524 213 0 272 130 328 237 0 181 135 227 222 0 53 128 105 220 0 359 129 401 216 0 496 22 509 36 0 535 21 550 36 +2550 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051250.jpg 640 427 17 45 64 430 356 +2551 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241677.jpg 640 480 17 346 321 420 388 0 494 269 510 296 0 455 284 483 310 17 296 308 346 383 17 480 320 543 408 17 217 172 285 221 17 354 185 383 240 17 317 203 349 255 17 320 280 348 323 17 442 332 487 422 17 130 177 209 221 17 383 171 409 226 17 547 342 585 436 17 1 185 39 226 0 361 293 385 320 17 303 243 342 313 +2552 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492407.jpg 640 480 17 155 188 415 395 17 305 212 548 386 17 17 190 57 229 +2553 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457271.jpg 640 399 17 0 93 215 381 17 307 90 384 178 0 437 111 547 285 0 322 80 535 396 +2554 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102461.jpg 640 427 17 47 160 247 391 17 0 176 122 403 17 169 186 308 383 17 330 178 440 366 17 476 177 519 344 17 517 188 559 331 17 555 200 626 324 17 360 175 480 356 17 245 222 343 375 9 349 109 364 147 0 78 93 152 292 0 354 131 394 191 0 223 114 301 200 0 283 129 334 232 0 401 138 442 188 0 470 145 517 203 0 505 155 534 195 0 545 167 571 195 0 0 88 35 273 0 573 161 599 202 0 154 106 202 168 9 104 0 129 9 17 424 216 484 353 17 493 231 522 299 17 591 204 639 325 0 448 151 478 179 9 232 0 253 30 +2555 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456015.jpg 640 427 17 476 111 622 239 17 283 121 376 227 17 373 107 514 240 17 257 117 334 221 0 328 58 379 133 0 295 64 326 123 0 513 70 564 182 0 405 56 462 173 +2556 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029170.jpg 640 480 17 452 276 529 418 25 379 167 436 187 25 511 160 570 212 25 243 165 303 195 25 147 166 203 212 25 10 167 71 216 +2557 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367087.jpg 640 480 17 318 293 375 335 17 488 310 519 355 0 292 298 302 313 +2558 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080522.jpg 640 360 17 22 91 422 345 0 267 158 367 359 0 505 1 639 356 7 225 2 607 163 18 253 57 395 109 +2559 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273442.jpg 640 480 39 115 0 131 32 47 232 74 315 109 50 85 160 259 256 51 467 284 529 365 51 505 283 549 362 51 511 282 567 362 51 500 290 539 355 51 525 269 598 353 69 0 65 176 206 71 329 19 567 96 51 468 271 596 384 60 1 53 639 472 39 89 12 106 36 39 247 0 270 31 41 296 11 331 43 41 320 9 343 40 69 0 14 170 112 +2560 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205605.jpg 480 640 39 139 44 252 495 40 234 243 381 581 68 225 37 479 488 +2561 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261182.jpg 640 427 39 457 0 523 126 0 1 0 539 421 45 126 122 288 235 46 162 362 361 426 46 245 11 467 379 76 491 340 562 411 +2562 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000283.jpg 428 640 39 63 42 145 353 56 0 142 59 228 56 148 67 427 356 60 0 210 424 630 40 164 156 252 370 +2563 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221669.jpg 424 640 39 58 561 69 594 0 0 64 339 472 0 161 552 228 632 0 0 484 63 639 0 79 465 178 630 0 0 396 44 509 36 237 427 388 527 0 384 554 423 599 0 331 475 400 597 24 0 419 29 479 +2564 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026907.jpg 500 375 57 404 134 499 370 32 127 197 167 234 0 125 109 256 371 35 165 187 256 274 32 23 235 40 253 59 0 130 43 280 56 0 131 43 276 +2565 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556641.jpg 408 500 56 0 175 41 316 56 58 175 156 299 60 3 228 406 491 75 157 277 271 445 58 14 27 406 443 +2566 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569319.jpg 640 480 60 0 2 640 479 42 513 289 603 385 45 331 30 476 418 55 203 121 350 267 41 132 101 203 174 41 403 358 460 415 44 333 413 384 479 50 122 46 200 116 50 156 32 189 48 51 190 13 257 96 51 217 55 256 101 41 93 111 153 170 51 471 289 485 324 51 485 270 508 301 55 161 313 208 359 45 508 68 639 230 50 162 8 194 37 +2567 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135785.jpg 640 424 1 590 144 624 199 0 411 70 604 356 0 189 126 225 226 1 4 141 75 174 36 207 173 232 227 36 478 288 534 350 +2568 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095770.jpg 640 430 1 46 262 125 325 0 80 50 254 279 36 176 250 208 293 0 46 225 110 327 +2569 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370331.jpg 640 427 1 82 174 123 201 1 581 157 619 209 0 128 0 317 398 0 101 126 134 182 36 222 244 306 392 0 587 111 634 210 +2570 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382715.jpg 425 640 1 19 240 63 293 2 296 220 422 309 2 258 205 326 245 9 321 88 347 115 36 141 508 222 566 26 68 248 84 268 0 129 171 251 547 0 296 199 316 250 0 234 197 251 252 0 339 184 346 203 9 287 119 290 132 9 240 143 248 159 9 252 109 259 128 0 247 200 259 259 0 46 206 81 276 0 360 184 369 215 0 378 184 385 209 0 326 202 341 223 0 349 205 357 216 0 142 198 161 237 0 213 200 229 224 26 251 210 259 227 0 332 179 340 202 0 82 184 394 245 +2571 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554302.jpg 640 459 3 503 215 639 366 0 384 147 461 360 0 440 162 520 344 0 316 151 384 288 0 218 135 269 256 0 495 121 583 236 0 437 129 478 227 0 536 132 594 205 0 0 199 97 438 25 129 0 529 60 45 285 396 431 458 46 165 98 177 128 46 201 319 284 361 46 341 296 350 303 46 360 277 402 302 46 188 73 228 108 46 92 55 179 106 46 452 328 517 372 46 413 358 464 385 46 480 368 532 395 46 524 378 549 390 46 548 369 558 384 46 555 344 635 384 0 155 145 234 242 3 598 180 610 192 0 63 157 106 215 25 355 131 442 152 46 146 326 211 381 46 39 4 589 433 +2572 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452618.jpg 480 640 0 11 70 264 631 40 264 295 320 376 42 147 488 266 541 55 224 512 303 563 55 326 468 400 543 55 366 410 426 439 43 149 504 296 547 43 322 437 450 448 40 379 521 449 606 42 332 388 394 414 +2573 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124243.jpg 640 427 0 355 230 457 421 0 563 83 639 245 0 429 329 503 426 0 222 187 260 282 0 249 144 281 182 0 43 176 65 198 0 31 176 46 204 36 227 274 260 289 0 400 179 415 204 0 267 140 290 178 0 96 178 110 200 0 351 191 360 218 1 394 192 423 209 13 158 164 201 200 2 361 175 372 182 2 348 178 356 182 +2574 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294958.jpg 500 250 0 244 59 459 246 0 52 19 274 247 29 204 61 275 93 +2575 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042279.jpg 640 427 14 17 254 90 326 14 359 118 440 203 22 0 69 403 426 22 350 1 630 426 14 329 101 351 117 +2576 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000563871.jpg 640 480 25 134 15 167 26 25 96 15 123 26 0 83 175 374 390 0 185 0 263 233 0 56 63 138 132 26 187 413 304 479 25 264 21 302 32 60 124 45 172 64 74 288 291 296 301 29 357 284 628 320 60 98 42 121 57 60 158 47 181 48 25 185 21 192 26 0 0 1 61 151 56 169 46 187 65 +2577 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350463.jpg 640 427 25 18 0 639 369 25 358 38 609 269 56 456 271 580 421 56 545 231 615 307 56 55 325 155 426 56 328 332 450 426 0 594 214 639 356 0 1 75 464 419 0 471 212 587 373 0 329 211 474 425 0 420 147 444 209 0 433 143 473 204 0 458 147 519 244 46 111 0 368 91 46 165 59 175 65 46 476 368 556 426 0 513 131 577 271 0 45 231 170 409 25 307 141 352 153 46 115 56 121 78 0 605 153 638 206 0 99 157 188 260 25 442 84 639 143 25 505 93 590 122 60 0 378 38 426 +2578 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301971.jpg 640 429 25 0 208 81 257 0 76 285 134 424 0 169 238 222 406 0 239 250 280 335 0 130 262 177 390 0 154 259 177 344 0 33 248 97 428 0 102 259 127 292 0 0 236 55 414 0 326 265 409 348 0 396 262 455 338 26 58 332 94 366 26 159 281 179 323 46 390 102 451 188 46 388 25 450 85 46 430 82 495 148 46 495 123 562 186 46 312 196 327 237 46 265 187 309 231 46 331 264 380 317 46 308 257 344 294 46 192 399 213 428 46 400 54 452 88 46 366 25 437 77 46 348 129 405 197 0 42 250 70 309 0 406 274 421 297 46 374 83 403 132 49 395 361 413 373 49 380 368 422 393 49 325 373 385 428 0 273 260 307 325 0 111 245 639 382 46 70 104 639 428 +2579 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544607.jpg 640 426 25 60 1 200 23 0 185 72 276 347 0 125 16 193 136 0 191 8 220 64 0 548 13 590 93 29 309 156 362 173 0 33 91 291 345 +2580 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333565.jpg 640 429 25 0 0 366 56 0 163 20 281 204 0 347 26 609 421 49 234 193 257 211 49 258 225 279 247 49 303 194 322 213 49 136 182 372 247 46 443 175 466 202 46 345 197 381 213 46 450 222 478 240 46 368 224 447 244 46 459 221 487 241 0 441 171 458 179 0 17 47 146 423 +2581 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424147.jpg 640 442 32 278 78 305 106 0 275 113 433 405 0 60 67 188 413 34 142 180 347 209 35 351 236 410 307 +2582 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357916.jpg 500 333 32 450 299 471 314 32 449 296 479 322 35 106 17 198 123 0 108 20 489 332 +2583 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257046.jpg 640 325 32 468 69 486 87 0 85 30 131 147 0 91 29 222 269 0 395 26 449 135 35 509 133 544 184 35 92 151 126 192 35 433 48 450 68 35 114 47 129 65 0 378 100 546 287 0 325 214 382 317 +2584 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040886.jpg 640 428 32 358 53 369 64 0 461 104 495 140 0 213 48 501 376 0 202 104 223 142 35 212 131 245 187 0 393 107 432 142 0 597 105 634 140 0 519 108 559 140 0 230 100 264 140 +2585 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369294.jpg 640 427 32 259 217 268 223 35 32 143 51 162 35 361 264 385 286 0 269 108 315 231 0 30 118 98 278 0 609 152 639 270 0 230 202 415 380 0 449 90 497 154 0 179 64 215 132 0 32 70 77 133 0 88 93 112 120 0 108 60 148 122 0 162 107 185 138 0 69 51 98 82 0 543 76 583 120 0 408 85 438 121 0 1 0 639 217 +2586 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492605.jpg 640 418 32 493 182 511 197 0 103 94 215 193 0 376 115 503 411 0 274 93 285 121 0 244 90 263 124 0 18 101 33 121 34 503 219 606 274 0 307 104 332 120 35 194 116 208 135 35 360 113 369 123 0 339 73 367 147 +2587 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357529.jpg 640 427 32 432 17 449 31 0 240 14 574 421 35 298 125 338 191 +2588 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201970.jpg 500 316 32 136 154 157 166 0 253 126 361 275 0 322 86 492 281 0 383 4 446 120 0 221 44 335 249 34 162 125 229 182 35 255 162 283 201 0 112 0 146 42 +2589 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311015.jpg 640 400 32 362 95 373 105 0 261 69 417 301 35 315 103 356 121 +2590 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119445.jpg 640 426 32 301 91 312 102 0 184 177 348 386 0 522 227 639 399 34 92 240 179 249 35 420 280 452 313 0 442 262 563 397 +2591 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012047.jpg 640 319 32 313 168 338 190 0 167 0 297 238 0 253 7 464 288 0 0 192 284 308 0 306 104 446 301 35 340 162 393 205 34 290 137 399 212 35 356 207 380 222 +2592 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043816.jpg 640 426 32 93 215 108 227 0 250 80 453 344 0 479 193 639 370 34 318 187 426 219 35 480 227 526 274 +2593 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374111.jpg 500 375 48 297 187 400 311 60 3 10 499 370 +2594 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425526.jpg 500 375 48 179 103 418 285 48 293 45 433 152 60 0 2 498 370 42 127 47 161 76 45 0 2 54 76 45 462 4 499 54 49 417 133 487 207 43 0 65 134 157 47 197 120 238 170 47 156 95 211 138 +2595 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337563.jpg 640 480 59 2 263 396 471 0 11 181 240 479 0 236 2 639 472 46 330 183 383 382 46 159 277 209 399 +2596 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388903.jpg 500 332 67 301 118 328 149 0 81 51 207 309 0 241 27 468 326 0 178 74 225 216 47 84 201 240 331 26 209 143 298 331 26 399 141 418 253 28 15 280 81 331 1 460 154 499 218 +2597 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426532.jpg 429 640 1 404 20 428 62 1 63 46 141 67 1 248 44 347 70 0 167 78 337 207 0 104 4 158 73 36 176 165 237 214 1 370 51 400 63 0 169 0 204 56 0 141 0 165 63 0 9 0 50 83 0 309 0 335 56 0 209 0 248 74 +2598 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544140.jpg 640 427 1 96 235 137 258 36 133 325 183 334 36 226 318 271 327 0 184 214 211 329 0 137 219 189 289 0 307 254 348 306 0 350 271 373 294 0 455 227 468 267 0 439 223 455 260 0 534 238 555 281 0 340 228 356 270 0 292 231 306 255 0 279 234 292 253 0 371 160 383 190 0 304 231 316 257 36 140 288 170 294 36 237 312 269 315 0 376 240 384 254 13 268 303 346 334 0 201 148 563 267 +2599 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331959.jpg 500 334 2 10 205 106 263 2 307 220 419 281 2 384 206 458 267 29 150 30 183 67 24 71 281 103 295 0 68 58 226 327 0 174 25 279 311 0 86 160 149 310 0 0 156 35 313 0 137 155 202 327 0 315 180 349 289 0 265 253 295 302 0 325 250 369 307 0 411 254 456 307 0 372 252 415 306 0 463 256 499 307 2 269 207 317 267 56 26 239 57 271 56 86 236 104 283 0 227 227 254 273 0 212 248 230 298 +2600 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525118.jpg 640 426 2 274 11 315 39 56 155 91 299 175 56 311 86 443 191 56 514 90 628 183 60 0 183 639 419 46 194 201 235 265 46 199 251 237 326 46 214 280 252 366 46 123 118 437 411 +2601 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251857.jpg 640 427 2 540 163 594 200 2 440 164 499 202 2 498 172 543 203 2 324 186 376 211 0 321 137 466 279 0 29 1 319 420 36 381 257 433 299 2 413 184 444 207 2 354 178 380 206 2 295 197 324 215 9 246 155 259 167 +2602 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490952.jpg 640 427 2 501 133 604 189 0 257 0 479 276 36 250 272 477 317 2 0 124 35 186 +2603 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267127.jpg 640 480 2 33 307 63 318 0 120 2 469 287 36 141 162 626 420 0 608 279 616 313 +2604 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394352.jpg 640 480 2 239 47 255 61 22 231 137 304 254 22 395 145 449 254 22 58 161 162 240 +2605 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367509.jpg 640 426 2 344 151 504 240 22 307 172 345 241 2 308 116 356 145 22 512 173 545 233 2 214 118 264 136 7 306 115 357 145 +2606 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069356.jpg 640 505 2 612 156 639 205 0 74 110 179 488 0 416 131 526 458 0 567 113 628 378 46 285 335 325 378 46 326 339 360 372 46 311 340 342 373 46 338 333 365 358 46 339 318 360 349 46 320 317 338 340 46 279 314 346 347 47 276 298 289 312 47 351 327 394 351 47 260 284 271 292 47 220 254 323 319 47 196 252 207 263 0 626 155 639 268 0 437 152 455 192 0 556 155 576 200 47 57 204 64 211 47 75 168 91 184 47 141 199 195 245 +2607 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259665.jpg 640 426 2 204 186 239 206 2 255 185 270 197 2 242 184 262 191 0 344 191 492 324 0 256 175 309 297 0 89 156 237 419 29 116 382 159 425 29 547 226 569 250 29 281 238 296 252 29 64 287 79 292 29 182 217 197 226 29 415 333 435 339 29 541 363 565 369 0 543 183 610 407 2 282 183 289 193 +2608 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025864.jpg 426 640 2 335 194 380 235 2 170 196 339 255 0 162 19 312 588 2 404 184 425 244 +2609 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231508.jpg 335 500 2 127 103 220 144 35 155 306 186 324 0 62 215 217 393 0 248 211 295 275 0 221 218 262 274 0 234 200 263 230 0 230 187 255 227 0 68 233 109 269 0 56 247 72 267 0 30 222 43 269 0 193 147 236 200 0 198 105 215 145 0 174 101 199 157 13 102 171 121 193 32 31 64 39 72 56 113 229 143 262 56 159 159 196 196 56 216 158 255 197 56 265 239 296 274 56 262 233 266 241 0 153 222 185 247 2 224 112 295 151 56 213 180 223 197 0 156 105 177 159 13 71 181 104 205 0 1 83 334 295 +2610 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395723.jpg 640 427 2 1 214 187 421 22 390 40 639 420 22 70 59 312 419 +2611 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130699.jpg 640 427 2 523 240 559 291 2 196 236 243 244 0 261 229 298 318 0 83 228 117 310 0 364 235 420 325 0 467 225 504 340 0 496 227 518 272 0 494 52 506 71 2 437 256 454 291 7 189 28 396 71 29 371 121 399 129 0 602 257 639 392 2 13 243 58 288 2 569 63 618 72 2 450 241 539 293 2 565 230 636 249 2 381 245 422 271 +2612 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211215.jpg 640 428 2 1 253 52 321 0 107 32 536 422 46 205 204 280 301 24 328 216 437 423 0 86 245 98 280 2 7 275 133 416 5 0 223 66 256 +2613 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519055.jpg 640 521 2 129 1 577 138 0 55 68 587 515 35 502 211 573 332 0 490 154 639 355 0 0 149 78 332 0 214 147 294 358 0 50 156 186 327 32 59 157 87 185 0 432 207 464 303 2 582 81 639 132 56 431 209 475 354 56 102 263 151 325 +2614 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376307.jpg 375 500 56 3 224 68 292 0 139 190 198 269 47 109 306 141 342 47 190 303 228 339 49 99 263 141 292 49 175 227 206 258 46 11 309 38 328 46 69 341 130 412 46 219 370 247 424 46 237 370 297 426 46 40 302 77 333 46 51 332 120 389 46 155 324 189 379 46 183 369 219 453 46 255 355 335 438 46 241 384 268 434 46 207 386 239 452 46 165 348 189 398 47 73 288 100 310 60 0 279 361 499 0 247 148 374 420 0 195 153 265 249 41 316 443 353 483 51 151 299 201 338 51 30 292 50 311 46 128 326 168 385 47 136 287 170 325 +2615 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230265.jpg 500 375 56 234 144 364 194 56 194 135 273 169 56 304 122 397 160 60 0 231 420 370 0 202 21 270 110 0 343 24 431 130 0 0 0 177 269 0 347 50 368 76 0 306 39 354 85 40 380 158 415 243 41 167 149 202 224 41 205 164 238 208 43 222 271 310 341 43 223 272 312 344 43 274 257 327 272 44 41 263 161 292 53 91 223 324 328 0 285 168 499 374 0 345 43 384 107 41 383 157 417 199 41 302 86 315 110 0 278 32 313 76 0 6 34 20 49 42 132 224 170 247 56 313 75 359 113 56 164 64 192 86 56 445 128 499 316 60 209 113 349 138 60 134 106 232 159 74 363 250 396 279 0 254 49 302 105 26 327 62 342 77 53 274 70 286 101 56 125 75 158 107 56 165 74 202 105 56 192 141 212 149 56 146 68 179 105 0 23 37 34 50 0 412 1 499 142 41 159 108 174 120 41 260 95 274 108 56 384 110 426 159 +2616 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493799.jpg 640 483 60 0 2 640 482 42 1 77 97 269 51 369 350 526 477 51 486 283 547 362 51 428 224 528 343 51 463 269 531 343 +2617 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318618.jpg 640 355 60 0 206 640 304 41 492 172 557 251 49 287 131 356 183 49 227 121 293 176 49 307 76 374 137 49 348 119 414 184 49 258 78 313 136 45 23 221 197 271 45 444 214 603 262 +2618 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215062.jpg 640 480 60 2 1 638 465 41 272 7 437 203 42 69 128 283 227 50 160 153 306 302 50 388 174 573 305 50 196 320 236 362 51 408 346 481 427 51 366 200 426 380 51 108 196 155 286 51 150 189 175 231 +2619 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105102.jpg 611 640 60 0 51 611 632 42 0 499 607 632 43 0 506 319 639 50 382 51 570 202 +2620 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341230.jpg 640 480 7 3 1 638 472 0 288 0 566 474 0 614 56 639 196 49 186 159 400 280 49 110 218 126 230 49 135 210 152 225 +2621 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359239.jpg 640 480 60 0 1 639 474 42 0 111 62 442 42 223 36 431 72 42 41 113 114 429 43 234 20 639 244 53 50 56 578 429 40 324 0 402 21 40 226 0 311 33 +2622 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211498.jpg 640 480 60 0 2 640 474 50 263 56 373 116 50 287 144 332 195 50 336 220 418 318 50 376 62 477 153 50 195 109 295 214 50 168 102 260 185 +2623 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205222.jpg 500 375 60 2 3 466 349 54 123 24 360 186 55 0 1 81 139 55 126 24 373 213 +2624 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509695.jpg 640 428 0 358 117 535 422 29 317 111 406 150 0 357 170 381 203 0 323 170 352 200 0 112 153 137 182 0 84 155 108 180 +2625 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182523.jpg 640 480 0 261 118 497 469 0 100 223 215 403 0 46 179 118 362 30 436 107 522 479 30 118 364 328 405 24 256 192 332 368 24 99 252 151 351 24 44 191 81 254 30 23 352 132 374 30 0 338 58 353 30 205 368 236 378 +2626 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320461.jpg 640 427 0 207 12 390 382 13 533 351 639 410 36 298 298 399 373 2 269 241 608 342 2 610 246 639 332 +2627 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190853.jpg 383 640 0 0 401 279 639 46 3 141 379 506 +2628 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148792.jpg 640 426 0 555 137 635 388 0 373 123 429 167 0 513 134 536 202 0 183 151 213 207 0 133 166 171 213 0 101 170 120 207 0 206 183 221 203 49 289 219 328 234 49 488 212 500 223 49 400 216 411 226 49 377 218 387 227 49 505 203 513 213 49 475 196 487 206 49 423 216 434 223 49 332 200 359 232 49 453 221 473 228 58 225 304 258 397 58 344 322 385 425 58 279 251 301 272 0 260 145 309 209 0 16 210 31 265 49 514 202 525 214 49 451 205 459 215 49 267 217 287 234 58 121 313 142 346 58 116 271 131 314 58 101 296 119 339 58 370 173 495 417 49 233 216 238 222 49 51 188 541 237 +2629 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266491.jpg 500 332 0 381 194 446 327 0 236 181 293 315 30 241 307 266 319 +2630 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399991.jpg 640 542 0 36 28 459 499 35 267 232 358 326 32 431 171 464 205 0 91 1 128 58 +2631 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575194.jpg 640 521 0 180 56 639 511 0 67 11 291 252 35 94 204 196 303 0 136 111 457 520 0 353 11 491 153 +2632 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214961.jpg 640 455 0 138 125 608 448 36 140 82 363 198 +2633 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008853.jpg 640 337 0 209 209 258 273 30 201 262 244 278 +2634 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194704.jpg 640 424 0 147 153 458 417 0 173 387 216 423 0 88 395 139 422 0 29 379 67 422 0 556 391 586 418 0 410 411 423 423 0 430 405 458 423 0 623 401 639 423 0 616 405 633 423 26 330 313 387 408 30 22 37 605 301 +2635 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393674.jpg 480 640 0 117 66 326 493 35 286 153 321 211 0 460 26 479 60 0 360 38 390 66 0 441 54 479 84 0 328 26 359 59 0 259 0 290 33 +2636 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136501.jpg 460 640 0 114 44 338 580 35 183 171 237 240 +2637 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163260.jpg 427 640 0 123 106 271 504 0 232 141 404 549 30 0 478 248 533 30 157 159 314 599 +2638 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233305.jpg 478 640 0 139 137 308 518 30 70 506 277 618 +2639 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363831.jpg 640 399 0 94 234 240 345 0 258 198 408 352 34 391 235 463 248 0 44 230 124 358 0 0 4 30 76 13 57 8 145 57 32 588 80 595 87 35 194 257 233 281 +2640 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574108.jpg 640 480 0 236 178 304 357 30 252 326 291 385 0 320 207 328 229 0 295 208 305 227 24 252 204 290 250 24 320 208 326 217 30 313 227 323 235 +2641 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470070.jpg 640 480 0 351 46 428 257 0 214 115 298 352 0 496 1 561 146 0 554 40 618 142 0 418 40 447 62 0 141 76 175 114 35 593 109 612 137 34 476 20 520 64 56 502 15 533 31 56 491 13 506 30 56 360 11 395 25 56 451 47 487 59 56 487 48 504 61 56 602 49 635 58 56 550 14 579 27 0 612 19 639 48 0 381 39 409 61 0 463 19 493 59 0 157 50 201 114 0 20 60 53 113 56 350 35 359 41 56 454 14 469 35 56 368 24 394 42 56 416 47 451 60 56 379 47 414 56 0 3 59 36 113 0 383 14 422 49 56 417 14 433 41 0 1 0 639 64 +2642 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361819.jpg 640 373 0 68 51 229 316 0 422 80 469 214 0 476 66 524 210 0 474 48 639 296 0 455 29 475 100 24 323 166 354 204 24 303 82 319 107 0 594 32 616 71 0 235 37 261 103 30 2 282 279 307 30 471 287 623 302 0 479 31 499 74 0 347 31 391 104 0 327 39 348 103 0 550 4 569 35 0 263 25 285 91 0 286 72 315 151 0 202 0 639 178 +2643 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349822.jpg 500 333 0 45 25 376 328 0 120 196 153 226 29 191 240 261 293 24 133 212 153 229 25 219 157 303 193 13 365 255 441 299 +2644 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554727.jpg 428 640 0 2 4 298 327 36 80 134 163 359 1 404 343 427 424 +2645 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037846.jpg 426 640 0 20 28 268 603 30 36 572 289 631 +2646 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102478.jpg 640 375 0 547 17 605 82 0 194 267 235 356 0 118 300 146 353 34 214 266 235 279 32 622 32 627 36 32 228 199 245 211 35 127 285 139 301 35 590 35 596 43 0 76 311 137 374 +2647 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242945.jpg 640 478 0 272 159 385 471 30 155 430 300 477 24 287 214 355 268 +2648 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145408.jpg 640 371 0 21 125 92 253 0 148 48 240 243 0 416 104 508 265 0 288 4 375 215 36 431 240 503 257 36 549 232 610 252 36 22 238 89 257 36 175 196 204 251 36 321 213 352 225 0 537 107 602 243 +2649 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290196.jpg 640 480 0 340 306 381 401 0 466 253 489 305 0 485 242 505 285 0 459 228 476 253 30 428 340 458 364 30 450 314 471 336 30 323 385 407 411 24 342 316 359 345 24 430 292 445 313 24 454 277 464 294 0 428 285 458 357 0 449 269 471 330 24 490 248 501 262 24 465 228 473 236 24 386 218 391 228 0 374 215 395 246 24 470 264 478 280 30 470 293 486 310 30 489 278 505 291 +2650 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130579.jpg 388 640 0 174 71 332 556 35 175 186 238 242 +2651 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120964.jpg 429 640 0 162 43 402 431 36 163 376 314 451 0 251 407 291 448 +2652 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316617.jpg 640 480 0 199 141 264 333 0 67 146 182 359 29 228 221 250 244 29 416 255 432 279 26 176 164 235 249 29 28 146 52 171 0 336 199 468 339 29 46 255 72 264 29 81 262 94 291 +2653 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051461.jpg 640 365 0 226 1 488 358 36 175 3 332 328 +2654 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503233.jpg 640 426 0 331 162 383 296 0 364 174 419 300 29 340 204 352 217 29 364 216 380 222 29 357 250 370 260 29 337 203 343 216 29 339 204 348 217 56 0 236 37 304 +2655 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211163.jpg 640 361 0 224 12 317 222 35 251 101 281 133 32 261 119 267 126 +2656 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165353.jpg 640 426 0 294 98 486 409 0 129 30 259 380 0 10 120 149 425 35 8 193 81 249 35 426 156 478 180 0 465 115 553 407 +2657 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170401.jpg 640 480 0 0 1 640 164 50 344 211 547 378 51 169 200 251 263 42 32 435 228 479 +2658 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534018.jpg 640 480 0 442 172 568 479 0 317 195 403 473 0 222 258 281 429 0 408 203 444 319 0 442 197 467 249 0 89 190 168 454 0 214 202 255 324 0 255 207 288 329 30 10 442 224 478 30 224 295 243 454 24 429 307 519 406 0 0 186 79 450 0 586 250 639 479 0 272 218 324 397 0 552 208 583 324 0 167 234 201 383 24 418 222 441 264 0 35 136 639 468 +2659 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094033.jpg 640 427 0 569 276 607 365 0 548 288 597 367 29 478 178 499 189 24 592 289 607 335 26 594 289 606 335 29 616 315 628 327 +2660 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348263.jpg 417 640 0 120 136 298 629 35 211 418 280 503 45 273 135 315 155 74 204 108 227 134 0 111 98 140 138 +2661 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153520.jpg 640 480 0 71 23 378 473 0 601 119 639 386 29 232 251 391 368 0 268 77 314 126 60 435 131 572 165 60 226 115 363 145 +2662 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034452.jpg 640 480 0 318 178 405 313 29 326 250 349 263 29 381 249 398 271 +2663 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553253.jpg 640 459 0 58 55 349 458 46 118 57 263 217 46 451 186 458 200 46 451 230 464 248 46 438 221 461 243 46 458 215 472 227 46 462 180 474 196 46 455 190 473 208 46 434 193 471 224 46 434 240 451 257 46 352 188 373 206 46 352 221 368 230 46 437 163 462 198 +2664 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423740.jpg 640 553 0 1 95 417 544 35 137 413 402 552 0 287 57 639 552 +2665 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014135.jpg 640 427 0 334 163 579 420 36 427 343 528 426 +2666 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486580.jpg 640 480 0 295 214 343 285 30 274 273 353 293 +2667 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549518.jpg 480 640 0 229 542 479 639 44 89 0 348 277 45 0 99 314 363 45 0 0 89 135 46 84 359 462 604 46 60 316 395 585 47 149 60 202 113 42 312 160 479 301 46 59 197 130 243 46 21 210 109 277 46 120 189 169 231 41 392 28 479 270 47 263 118 316 155 47 196 86 243 120 47 189 40 247 92 +2668 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268435.jpg 640 480 0 424 354 459 430 30 422 422 467 434 24 439 360 454 392 +2669 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236874.jpg 640 426 0 172 59 493 420 35 174 250 267 340 +2670 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337827.jpg 461 640 0 0 13 162 363 0 286 156 387 291 0 26 34 85 135 46 193 482 261 527 46 255 474 355 586 46 386 450 460 582 46 245 441 295 475 46 217 367 277 421 46 355 426 397 462 46 144 338 216 390 46 213 338 245 360 46 162 321 200 350 46 301 434 375 513 46 306 384 328 435 0 19 30 59 83 46 159 454 265 563 0 0 10 33 169 46 348 514 433 617 46 119 100 460 597 +2671 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305000.jpg 500 375 0 237 17 357 367 0 153 40 181 63 0 216 35 265 77 0 391 56 411 86 0 432 57 469 101 0 355 64 373 85 46 426 119 456 138 46 427 100 499 135 47 195 78 207 87 47 344 328 354 336 0 0 48 21 106 +2672 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365983.jpg 427 640 0 193 293 243 405 24 208 308 229 340 30 174 278 253 367 +2673 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019176.jpg 640 480 0 286 224 313 258 0 223 237 261 264 0 523 182 538 224 0 564 212 588 271 0 153 202 187 261 35 565 237 571 243 35 533 205 538 209 56 229 84 232 89 56 228 54 234 58 56 233 59 237 61 56 221 61 226 64 56 215 61 221 63 56 249 54 256 58 56 224 56 230 59 56 281 54 285 57 56 281 61 287 64 56 132 51 137 55 56 144 51 149 53 0 293 88 300 96 0 308 95 313 99 0 272 99 277 103 0 614 37 624 50 0 391 94 398 103 0 148 86 155 95 56 209 54 214 56 0 179 83 187 95 56 172 58 179 61 0 335 72 343 86 56 0 1 639 117 0 12 1 638 155 +2674 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363522.jpg 427 640 0 93 97 226 367 0 252 63 308 177 0 205 69 267 196 26 296 133 316 145 0 172 0 225 106 0 145 75 219 201 0 98 85 138 150 0 40 50 86 127 0 0 14 46 190 0 35 104 103 225 26 67 143 108 204 36 86 327 226 380 0 382 1 426 132 0 304 1 379 138 +2675 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448117.jpg 427 640 0 41 435 127 584 0 158 435 190 514 0 345 408 366 452 0 330 414 352 461 0 295 413 317 459 30 337 459 353 464 30 169 428 190 515 24 340 419 349 434 24 300 418 308 429 24 350 413 359 424 30 301 451 317 461 30 60 415 124 475 30 67 395 96 442 +2676 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289497.jpg 434 640 0 167 151 244 261 45 380 131 399 148 46 193 478 246 523 46 218 429 228 453 46 215 401 232 421 46 224 423 247 457 46 225 447 235 468 46 182 477 209 518 46 56 426 75 468 47 345 435 388 476 49 285 413 292 421 49 335 471 427 535 49 277 398 287 406 49 262 400 271 409 60 167 131 417 186 0 304 83 355 131 13 174 229 403 291 41 307 131 316 145 49 267 393 277 404 49 280 390 289 398 49 277 404 288 415 49 269 420 280 429 49 261 415 272 425 49 307 390 317 400 0 102 82 147 154 26 230 204 254 250 49 291 417 299 424 49 272 382 282 393 41 259 142 270 163 46 102 470 151 526 46 17 387 72 430 46 8 422 62 468 46 198 384 252 426 46 192 420 246 477 49 259 387 266 397 49 92 199 393 586 +2677 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433554.jpg 640 427 0 96 213 160 368 0 278 206 369 355 0 406 173 440 230 0 131 133 189 180 0 424 127 551 426 0 108 125 137 196 13 283 256 639 372 37 265 304 353 376 56 103 139 179 217 8 0 0 640 426 37 386 356 517 426 37 94 319 162 410 37 437 209 445 216 37 441 208 449 213 31 265 304 355 380 31 386 358 516 426 +2678 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574823.jpg 375 500 0 26 57 82 190 0 70 68 115 187 0 318 112 374 179 32 262 105 274 114 0 319 44 372 166 35 343 152 366 170 0 87 31 324 492 +2679 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422622.jpg 640 427 0 367 174 447 384 0 149 157 203 323 0 15 168 82 311 0 600 173 615 202 30 60 146 93 424 30 313 329 386 341 24 133 158 173 238 24 228 333 344 392 24 266 228 341 280 24 71 289 113 377 0 259 259 335 339 0 559 164 583 203 30 112 413 141 426 30 0 181 101 426 30 206 159 234 313 30 1 332 190 384 30 415 385 507 409 +2680 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422536.jpg 480 640 0 175 397 349 628 46 155 12 294 196 +2681 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543782.jpg 640 480 0 507 86 594 414 0 419 84 507 325 0 125 94 233 392 0 99 85 152 306 30 51 332 281 443 30 401 354 639 442 30 367 294 581 341 30 56 287 166 343 +2682 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242246.jpg 426 640 0 4 241 118 470 0 177 272 249 374 0 20 296 289 638 0 145 270 191 321 46 298 382 329 391 46 298 393 329 403 46 323 398 350 416 46 333 403 363 421 46 296 390 341 423 46 352 388 397 416 47 188 364 232 387 45 301 467 377 507 45 264 460 307 490 45 242 440 272 475 45 226 394 278 427 45 342 491 406 539 45 369 447 424 477 45 376 410 425 449 45 257 366 300 395 45 210 438 249 463 45 403 509 425 549 46 299 387 330 399 46 293 402 310 416 47 177 358 188 375 49 380 405 425 427 0 0 271 18 406 45 313 433 357 444 45 224 385 265 400 46 351 407 367 424 49 318 461 333 476 49 259 366 298 384 49 267 438 330 467 49 372 456 387 466 49 277 422 291 432 49 337 451 356 467 49 385 470 409 485 49 340 471 354 483 49 349 459 362 474 49 344 470 421 505 49 302 451 369 481 0 45 278 60 299 45 324 444 383 461 0 7 287 36 343 49 212 416 255 461 49 187 369 425 528 +2683 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374734.jpg 640 427 0 280 154 354 239 30 231 188 366 279 +2684 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477477.jpg 640 480 0 410 244 462 388 30 185 330 256 343 30 417 371 449 400 0 199 212 246 342 +2685 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332852.jpg 500 303 0 250 98 295 213 0 234 38 448 254 29 124 101 156 112 0 194 95 248 214 +2686 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469961.jpg 640 427 0 261 192 275 227 0 278 204 347 288 30 289 284 361 291 +2687 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539453.jpg 500 191 0 356 27 401 163 0 92 52 108 81 0 272 90 318 145 0 135 52 144 85 0 125 53 137 81 0 166 36 199 98 0 189 42 210 96 0 213 46 229 89 29 238 24 247 28 24 328 54 356 103 0 396 85 431 146 0 417 99 444 155 0 433 91 498 173 0 436 105 462 150 0 422 58 438 94 0 64 37 497 161 +2688 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317560.jpg 480 640 0 49 222 136 348 0 378 292 469 368 0 307 476 353 590 0 320 287 379 363 0 5 103 477 632 46 223 330 279 418 46 307 207 378 270 46 86 418 126 515 46 289 147 354 226 46 266 134 335 215 46 255 117 322 202 46 220 110 271 195 46 197 107 254 200 46 159 117 219 262 46 250 364 316 447 46 54 355 141 428 46 306 186 377 256 0 376 492 479 601 0 331 324 367 359 0 465 304 478 359 0 335 470 401 563 46 114 303 175 369 46 60 109 379 575 +2689 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292649.jpg 640 480 0 295 122 403 405 0 118 141 200 419 30 328 394 393 479 30 213 400 272 479 30 144 404 168 479 0 196 126 301 402 0 284 161 292 168 +2690 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044575.jpg 640 401 0 181 95 231 236 0 326 156 355 245 0 490 195 618 362 0 224 96 246 151 34 293 194 332 201 13 0 161 39 221 32 296 202 302 207 32 446 121 450 124 35 536 306 563 331 35 220 167 230 187 0 542 94 561 139 0 566 81 606 162 32 368 221 374 225 35 407 209 424 225 +2691 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306585.jpg 640 424 0 139 0 311 408 30 87 399 357 419 0 343 2 436 136 0 416 2 461 127 +2692 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330248.jpg 640 480 0 301 181 359 284 24 339 195 360 224 +2693 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496360.jpg 640 341 0 69 259 89 289 24 66 259 79 272 30 65 280 91 299 +2694 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085813.jpg 609 640 0 253 263 305 376 0 306 273 347 382 0 374 238 378 250 30 263 368 290 376 30 319 375 342 380 0 532 231 537 244 0 359 237 364 248 0 369 237 373 247 0 523 235 530 247 +2695 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088507.jpg 640 427 0 333 153 397 259 24 366 159 392 195 30 308 240 396 276 +2696 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205911.jpg 640 457 0 412 259 492 355 31 460 348 478 357 30 422 349 491 364 +2697 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324595.jpg 484 640 0 243 169 401 620 0 112 162 267 577 29 169 150 223 170 +2698 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237357.jpg 426 640 0 71 248 347 624 29 0 298 23 330 +2699 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434219.jpg 640 427 0 436 227 628 422 34 271 22 429 115 35 436 299 493 341 0 188 48 430 399 +2700 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188852.jpg 640 440 0 346 146 455 435 0 96 104 243 439 +2701 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010764.jpg 640 424 0 218 80 483 394 35 388 210 482 277 +2702 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458103.jpg 640 427 0 399 180 503 408 35 382 162 413 188 32 393 175 400 180 +2703 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512776.jpg 500 356 0 16 20 161 323 0 138 17 446 296 35 132 20 234 93 +2704 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352760.jpg 544 640 0 142 80 377 428 30 64 152 409 537 +2705 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025293.jpg 400 515 0 13 45 399 510 29 0 17 113 102 +2706 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555197.jpg 640 427 0 353 231 420 344 30 343 333 427 352 +2707 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439522.jpg 428 640 0 41 24 427 605 +2708 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153486.jpg 374 500 0 69 148 334 468 0 1 175 61 491 0 56 194 99 399 46 124 80 173 144 46 98 0 155 76 26 88 215 161 283 46 206 94 237 139 46 255 90 287 145 46 331 98 365 135 46 110 48 166 123 46 296 100 320 146 46 363 101 373 151 0 102 178 126 213 46 169 95 185 128 +2709 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015559.jpg 640 480 0 158 105 341 444 30 330 125 365 430 +2710 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460461.jpg 640 429 0 213 140 280 338 0 41 207 182 356 0 409 184 635 339 0 373 175 391 229 0 390 178 410 228 0 409 174 419 229 0 430 168 442 226 0 42 189 80 244 0 41 192 140 307 0 331 198 346 230 13 132 222 212 294 13 504 235 632 344 13 424 210 464 259 13 501 221 570 269 13 459 217 532 286 36 119 337 214 365 36 389 283 429 329 36 274 312 306 330 2 137 190 195 209 2 305 188 364 209 13 3 246 104 363 13 0 225 17 247 0 293 189 297 202 13 421 209 448 231 13 407 208 439 247 36 235 319 297 334 13 551 195 632 220 13 189 216 221 251 67 222 203 233 205 +2711 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499255.jpg 640 428 0 264 29 490 359 30 411 329 525 381 +2712 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014874.jpg 427 640 0 60 141 272 595 30 305 178 383 548 +2713 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145824.jpg 640 480 0 143 159 268 475 24 161 184 259 317 30 227 463 250 479 +2714 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126895.jpg 640 457 0 28 119 328 411 0 263 98 591 376 35 305 143 358 219 0 249 50 322 224 13 215 249 639 276 39 372 217 387 259 +2715 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325736.jpg 472 640 0 99 160 406 445 30 313 85 471 421 +2716 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175908.jpg 640 480 0 34 106 177 429 0 466 154 629 477 30 319 84 378 392 30 367 71 429 340 30 157 157 208 355 30 588 26 639 373 30 202 85 238 357 30 225 76 271 348 30 251 75 318 346 30 450 24 477 346 30 484 6 516 309 30 119 167 176 348 30 554 57 591 158 30 511 3 564 214 30 422 126 449 349 30 0 55 452 310 +2717 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454414.jpg 640 427 0 431 4 499 108 26 29 103 49 202 0 144 0 171 26 0 161 5 174 37 22 178 14 528 164 22 552 47 639 200 22 65 95 171 281 22 76 9 558 413 67 9 182 32 207 0 0 20 55 116 0 94 7 104 17 0 614 8 639 238 0 0 23 55 289 0 50 0 87 69 0 0 196 46 426 0 79 7 95 43 0 475 18 502 63 +2718 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082259.jpg 640 360 0 53 240 79 296 0 204 251 213 266 0 225 256 235 271 24 156 222 181 240 24 53 250 66 263 0 156 205 197 276 0 186 251 194 275 0 215 223 218 231 0 206 223 208 230 0 308 251 316 261 0 375 239 378 243 0 421 226 423 232 0 284 232 290 245 30 157 253 219 293 30 78 289 87 292 +2719 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099707.jpg 640 640 0 33 46 178 492 30 46 435 258 545 +2720 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292493.jpg 640 480 0 227 210 268 299 0 272 234 292 272 13 0 246 54 290 13 115 256 154 287 31 217 299 263 309 36 210 295 257 301 0 310 239 342 309 +2721 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447779.jpg 640 277 0 158 103 183 159 36 158 156 180 162 0 267 185 331 263 +2722 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162855.jpg 640 427 0 36 80 188 426 29 74 381 185 426 +2723 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210439.jpg 500 333 0 115 54 293 328 0 54 97 183 327 29 327 83 401 100 0 222 183 333 332 +2724 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000352478.jpg 640 468 0 3 12 81 131 0 439 9 462 90 1 372 57 400 112 50 146 301 252 388 50 78 306 112 341 50 2 12 382 402 0 462 27 474 74 0 537 15 553 84 0 610 18 618 62 0 418 29 440 62 +2725 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506449.jpg 427 640 0 203 70 280 280 0 1 140 255 549 0 275 136 376 295 0 337 166 426 307 36 136 398 300 594 0 135 208 180 290 36 218 227 282 282 36 305 259 369 286 56 369 180 390 207 +2726 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163543.jpg 640 427 0 305 103 506 251 30 245 240 431 295 +2727 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172935.jpg 488 364 0 154 95 231 182 30 169 150 267 207 0 300 253 374 353 8 19 262 111 282 8 124 262 256 288 +2728 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545583.jpg 640 361 0 434 65 490 200 30 414 177 495 213 +2729 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357335.jpg 640 480 0 205 232 295 401 31 159 381 309 406 0 277 133 288 143 0 404 29 406 34 0 244 136 264 162 0 263 135 277 164 0 338 39 342 42 +2730 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526371.jpg 427 640 0 61 91 363 566 30 118 543 187 565 35 317 324 357 365 +2731 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287570.jpg 640 480 0 418 183 430 198 0 454 179 462 196 0 498 188 507 201 0 569 200 575 212 0 582 198 590 207 0 614 202 623 212 0 593 200 596 208 30 37 280 164 316 0 58 164 157 302 +2732 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456725.jpg 500 373 0 259 197 450 366 0 313 66 395 211 0 241 87 317 205 0 73 128 259 366 0 383 66 483 365 34 193 225 311 236 35 257 289 299 322 34 0 323 132 332 34 17 306 86 317 +2733 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067953.jpg 430 640 0 78 102 139 274 30 257 326 333 392 30 77 253 154 298 0 227 167 334 358 30 120 118 226 143 +2734 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297970.jpg 640 466 0 195 139 298 327 0 437 210 549 404 29 278 267 329 282 29 609 199 625 203 0 86 140 167 329 +2735 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024776.jpg 612 612 0 66 19 432 604 29 94 27 426 313 +2736 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562101.jpg 640 480 0 151 315 171 363 0 136 299 139 305 0 131 302 135 308 0 143 297 145 306 30 156 364 170 367 0 204 232 313 479 30 145 321 148 322 0 142 301 150 321 0 150 307 161 328 0 125 301 127 306 0 126 296 129 300 +2737 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061531.jpg 640 427 0 194 147 296 262 0 177 153 204 219 0 148 159 173 206 0 32 150 53 193 0 47 145 58 172 0 19 146 35 188 0 4 148 18 188 0 57 158 86 217 30 147 241 336 291 30 175 197 197 200 0 0 323 37 425 30 41 208 97 218 +2738 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389738.jpg 640 480 0 185 148 286 478 0 444 202 457 214 30 215 413 303 479 30 526 319 571 333 0 526 225 572 327 0 395 183 411 209 0 418 184 434 211 +2739 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037038.jpg 640 480 0 86 283 156 363 37 93 342 164 375 +2740 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301756.jpg 381 500 0 110 14 335 444 0 81 196 340 491 29 76 10 141 50 +2741 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013774.jpg 640 480 0 270 281 301 367 29 235 209 252 226 +2742 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492323.jpg 500 334 0 70 8 181 316 35 141 158 158 200 +2743 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045392.jpg 427 640 0 119 180 268 526 35 201 352 257 391 35 210 359 252 381 +2744 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000397475.jpg 640 425 0 241 74 377 382 0 307 88 468 385 29 61 211 115 226 +2745 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558784.jpg 500 375 0 120 162 178 288 29 153 210 171 216 24 34 283 73 311 +2746 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050324.jpg 640 480 0 352 100 407 223 0 271 142 336 371 0 255 222 500 434 +2747 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031151.jpg 640 383 0 73 16 245 292 0 453 103 555 283 0 525 29 566 140 30 325 238 470 335 30 53 240 263 332 0 623 43 639 184 30 516 276 639 353 1 420 141 574 298 0 293 9 439 285 0 445 66 503 146 +2748 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505344.jpg 640 480 0 364 128 482 286 29 414 224 444 254 +2749 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088360.jpg 640 389 0 118 112 284 332 0 207 104 297 331 29 107 124 143 159 2 367 86 389 92 +2750 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295124.jpg 640 311 0 313 33 480 265 0 246 120 321 241 0 72 99 171 245 0 458 41 563 243 30 467 240 639 247 30 274 253 546 276 +2751 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202799.jpg 640 424 0 134 0 398 214 0 407 33 500 359 0 559 22 620 130 0 354 35 392 109 36 239 82 461 314 36 446 331 502 369 0 578 124 639 171 0 500 31 558 147 +2752 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209162.jpg 640 427 0 529 117 633 382 0 84 142 180 358 0 8 118 102 351 29 161 153 207 177 7 146 209 363 302 7 0 199 45 272 7 423 195 536 295 0 221 149 452 382 2 446 205 639 298 2 0 227 181 302 2 423 195 537 295 +2753 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247057.jpg 473 640 0 322 112 368 249 0 148 102 345 375 0 307 127 328 223 0 0 152 22 263 0 14 208 47 262 0 439 154 472 278 31 100 346 309 394 0 359 119 414 275 0 264 116 299 170 0 264 117 317 232 0 75 111 161 267 0 318 124 337 203 31 410 191 447 236 +2754 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210458.jpg 640 442 13 481 139 535 158 22 123 131 355 321 14 511 178 528 186 14 592 427 617 441 14 274 431 307 441 +2755 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419371.jpg 640 480 22 94 154 402 367 +2756 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083142.jpg 640 480 22 293 155 334 227 22 88 173 143 241 +2757 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182240.jpg 640 480 22 418 155 517 375 22 199 158 414 366 22 138 160 364 374 22 99 165 293 363 +2758 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534988.jpg 640 480 22 201 139 436 323 22 138 112 482 322 +2759 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163290.jpg 480 640 22 30 439 228 587 23 253 285 312 514 23 186 331 224 361 +2760 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019890.jpg 640 480 22 102 127 352 349 22 286 120 479 319 +2761 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252008.jpg 640 480 22 127 99 258 363 +2762 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426075.jpg 640 479 22 83 114 378 400 22 107 66 555 401 +2763 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120935.jpg 640 425 22 170 100 394 319 22 320 105 477 307 22 112 117 226 244 22 429 100 639 315 +2764 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428178.jpg 640 360 22 145 142 265 304 22 37 134 111 308 22 307 141 409 324 22 430 154 510 325 0 26 101 34 140 22 419 131 567 308 +2765 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064865.jpg 640 429 22 298 122 369 217 22 135 152 273 269 +2766 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349469.jpg 427 640 22 1 33 255 629 22 232 50 426 632 +2767 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023981.jpg 640 480 22 434 167 626 277 22 323 162 438 263 22 265 175 325 217 22 240 182 293 283 22 189 227 258 289 22 182 187 249 257 22 31 141 66 188 +2768 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508586.jpg 640 360 22 20 138 194 254 22 301 173 428 242 22 316 151 351 192 22 349 157 390 191 22 429 161 499 244 22 506 158 625 247 22 422 163 439 187 22 0 157 39 171 22 597 191 632 227 22 625 166 639 196 +2769 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186991.jpg 640 426 22 257 51 427 401 22 102 318 275 377 +2770 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016716.jpg 640 427 22 222 180 445 356 22 388 160 610 326 22 33 176 220 328 +2771 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455557.jpg 640 480 22 186 250 365 377 22 521 240 611 364 22 17 235 199 369 22 339 238 492 364 +2772 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476282.jpg 640 480 22 19 111 454 469 22 359 130 639 474 +2773 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439015.jpg 640 426 22 153 2 639 420 22 46 0 285 330 +2774 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526560.jpg 640 540 22 112 138 528 488 +2775 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516316.jpg 640 480 22 429 271 537 341 22 108 272 240 353 14 432 150 434 154 14 334 147 335 148 14 367 146 369 151 14 325 139 329 144 14 268 149 272 152 14 258 144 263 145 14 416 146 421 150 14 142 153 144 154 14 136 144 138 146 +2776 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472821.jpg 640 480 22 67 220 341 378 22 375 184 592 305 +2777 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468178.jpg 640 360 22 275 212 400 359 22 395 103 475 157 22 448 91 491 138 22 503 34 536 75 22 534 73 624 172 22 302 205 343 247 22 387 142 534 311 22 152 297 236 354 22 205 267 269 316 22 329 168 387 216 22 463 58 529 108 22 553 26 622 100 22 91 0 639 333 +2778 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235239.jpg 640 233 22 112 67 237 154 22 429 73 566 149 +2779 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201676.jpg 640 480 22 303 125 476 444 22 218 142 314 434 22 364 114 463 187 22 605 115 638 186 22 514 117 605 186 22 196 127 358 411 22 599 128 620 186 +2780 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242100.jpg 640 426 22 125 125 408 307 22 385 142 635 366 +2781 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565691.jpg 500 426 22 43 4 484 392 +2782 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403950.jpg 500 375 22 211 152 340 268 22 93 157 152 267 22 0 171 66 278 22 319 177 397 255 +2783 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388721.jpg 640 428 22 180 140 607 422 22 0 5 209 427 +2784 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356368.jpg 500 375 22 214 65 431 290 22 120 133 255 370 22 106 102 214 199 +2785 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360512.jpg 640 427 22 128 183 228 322 22 228 149 515 403 22 218 180 384 318 22 386 192 546 324 +2786 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409181.jpg 640 426 22 0 32 293 279 22 282 54 342 113 22 0 32 293 308 22 191 102 426 300 22 38 202 101 287 +2787 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038825.jpg 640 427 22 335 0 639 392 22 112 0 467 378 +2788 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430590.jpg 640 480 22 320 224 578 456 +2789 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451305.jpg 640 480 22 93 104 410 457 +2790 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043165.jpg 640 480 22 29 99 305 385 22 284 75 529 316 +2791 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484066.jpg 591 640 22 303 52 560 304 23 167 99 537 614 0 0 16 251 639 +2792 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202503.jpg 640 427 22 100 48 561 405 +2793 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302243.jpg 640 512 22 37 190 110 292 22 537 213 588 345 22 218 196 310 316 22 439 227 511 336 +2794 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313557.jpg 500 357 22 104 116 392 293 +2795 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417946.jpg 640 427 22 128 143 426 317 +2796 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544071.jpg 640 480 22 84 180 305 338 22 390 165 464 273 22 464 169 525 286 22 120 112 163 155 22 416 147 581 260 22 297 136 324 199 22 219 124 311 187 +2797 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496267.jpg 640 427 22 60 122 639 420 22 247 25 639 426 +2798 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507668.jpg 640 427 22 177 140 418 309 22 395 161 578 306 22 307 150 455 304 +2799 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268710.jpg 553 371 22 57 67 526 370 22 0 17 354 367 +2800 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424392.jpg 640 360 22 2 2 584 353 22 228 1 639 352 +2801 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066700.jpg 640 453 22 213 221 440 422 22 1 66 314 352 +2802 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272188.jpg 500 375 22 25 79 225 294 22 207 82 361 280 22 338 111 483 289 +2803 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004754.jpg 640 427 22 422 189 622 323 22 291 199 435 310 22 165 194 295 307 22 509 111 539 128 22 541 111 567 125 22 15 199 174 300 +2804 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381213.jpg 640 480 22 313 186 517 322 22 444 132 536 205 22 131 191 239 293 +2805 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200720.jpg 423 640 22 69 39 398 639 +2806 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408336.jpg 640 427 22 277 110 518 365 22 123 150 219 291 22 392 154 555 284 22 234 146 394 285 +2807 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454750.jpg 640 427 22 0 14 412 420 22 235 168 581 426 +2808 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443591.jpg 640 400 22 121 41 508 399 22 365 8 585 218 22 388 132 585 241 +2809 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104455.jpg 640 480 22 76 25 597 395 22 168 199 358 351 +2810 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134167.jpg 640 426 22 406 147 501 259 22 348 242 530 292 +2811 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351787.jpg 640 480 22 391 321 441 361 22 370 320 385 355 22 336 324 372 353 22 386 324 436 358 22 340 312 350 320 22 328 310 340 319 +2812 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270244.jpg 640 428 22 103 145 357 337 +2813 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082252.jpg 479 640 22 12 287 282 627 22 1 2 478 505 22 242 362 478 630 +2814 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429996.jpg 640 480 22 65 18 591 464 +2815 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539551.jpg 640 457 22 337 186 632 354 22 5 165 332 361 +2816 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256859.jpg 640 427 22 30 179 425 318 +2817 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312890.jpg 480 640 22 109 157 355 610 +2818 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009548.jpg 500 331 22 31 87 239 265 22 146 73 486 286 +2819 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522702.jpg 640 480 22 265 117 444 438 +2820 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224848.jpg 640 425 22 79 53 536 402 22 390 55 563 373 +2821 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053907.jpg 640 427 22 387 251 452 332 22 410 245 462 336 22 350 247 389 326 +2822 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335610.jpg 640 480 22 320 90 639 425 22 21 91 364 425 22 365 87 553 419 +2823 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462241.jpg 640 480 29 355 112 388 142 29 439 461 480 470 0 127 206 166 253 0 55 185 110 340 0 429 111 470 161 0 496 142 552 225 0 217 191 245 228 0 570 97 602 158 0 100 217 133 254 29 623 430 639 437 29 577 440 617 451 0 0 235 21 320 0 463 149 505 215 0 183 200 199 225 0 601 80 639 156 +2824 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179578.jpg 640 457 29 540 253 576 303 0 173 154 199 231 0 96 19 189 371 0 33 167 79 276 0 71 181 89 229 0 87 147 115 228 24 358 215 386 228 25 0 136 77 156 0 387 179 408 230 0 447 131 590 436 0 421 143 460 274 0 569 155 578 181 0 345 153 353 181 0 247 149 293 232 0 225 150 257 231 0 26 196 41 234 0 1 114 623 247 +2825 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034892.jpg 480 640 29 1 457 374 632 +2826 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401028.jpg 500 471 29 25 39 67 64 0 313 192 453 459 +2827 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423104.jpg 427 640 29 210 217 225 242 0 167 236 263 417 +2828 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000589.jpg 640 480 29 463 229 481 235 0 347 184 492 368 +2829 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457436.jpg 640 640 30 426 489 494 545 30 277 405 321 428 0 99 245 102 254 0 383 296 485 506 0 256 298 317 412 +2830 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276840.jpg 640 480 30 203 235 249 239 30 593 313 639 340 30 237 166 262 235 0 250 193 375 474 0 381 147 404 213 0 561 169 619 348 0 187 157 226 246 0 245 182 271 239 0 137 166 175 257 0 47 167 75 275 0 35 154 54 199 0 346 173 400 331 0 2 158 16 193 0 10 165 32 225 0 29 159 38 187 30 412 172 473 264 30 17 225 32 229 30 41 189 52 197 31 424 168 491 267 30 203 230 216 236 +2831 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399822.jpg 640 428 30 370 270 499 310 0 156 67 285 395 0 245 70 316 299 0 500 109 542 207 0 409 71 499 297 0 595 117 628 190 0 28 111 90 223 0 149 103 167 144 0 565 111 588 198 0 529 121 574 220 0 581 130 602 187 0 628 134 639 194 30 261 269 330 310 30 273 216 367 226 30 529 210 572 220 30 191 347 233 427 30 496 196 539 210 30 605 183 623 188 30 566 192 586 199 30 626 194 636 196 0 73 100 90 134 0 309 125 343 218 30 217 349 301 427 30 57 213 88 220 0 86 95 617 156 +2832 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093806.jpg 640 425 30 187 254 331 276 30 346 272 461 290 0 228 117 317 263 0 450 119 498 258 0 362 111 412 236 0 312 111 383 254 0 495 124 542 236 0 525 129 558 210 0 566 119 624 196 0 414 105 460 214 30 421 250 508 270 0 564 109 582 133 30 317 248 386 263 30 427 205 456 219 30 577 192 635 202 0 372 132 455 279 0 536 116 561 149 0 518 99 531 136 30 522 205 557 216 30 588 179 639 184 +2833 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050177.jpg 640 427 30 135 300 256 399 0 174 160 264 361 +2834 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538741.jpg 640 480 30 175 305 353 366 30 30 363 295 415 30 452 332 566 466 0 77 89 214 406 0 172 96 297 347 0 428 33 594 433 0 175 70 226 161 0 234 69 249 97 0 618 37 634 67 0 481 22 501 45 0 581 24 587 39 0 436 16 442 36 0 569 25 573 40 0 557 28 561 42 0 564 25 568 38 +2835 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548090.jpg 640 427 30 181 268 259 287 0 200 136 341 281 +2836 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338678.jpg 640 427 30 304 292 333 349 0 285 121 357 309 +2837 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289474.jpg 640 480 30 332 398 352 410 30 275 405 291 411 0 212 335 243 413 0 269 320 294 406 0 324 322 360 405 0 474 313 500 396 0 441 319 463 401 0 66 324 93 405 0 358 328 379 385 0 309 324 321 380 0 353 322 363 370 0 382 318 394 396 0 379 317 414 401 0 408 318 429 391 30 385 395 409 405 30 480 392 494 397 30 493 393 519 409 0 325 328 333 394 30 216 399 466 412 30 361 383 373 387 30 413 389 431 393 0 235 327 253 376 +2838 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342762.jpg 500 375 34 179 210 188 239 35 391 172 398 184 35 316 146 320 152 35 27 161 36 170 0 176 228 205 309 0 14 146 43 196 0 311 134 325 175 0 391 170 413 233 0 439 146 456 191 0 104 240 154 322 0 288 321 332 374 0 290 65 298 83 0 219 321 277 370 0 202 60 209 81 0 14 97 26 126 0 211 59 218 81 +2839 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324497.jpg 640 524 34 445 38 545 254 0 267 171 595 523 0 160 310 258 479 0 163 287 196 334 0 124 96 180 193 0 449 225 478 254 0 0 174 38 276 0 226 70 296 133 0 322 68 377 171 0 125 204 181 264 0 451 128 476 157 0 403 203 441 239 0 528 197 556 239 0 122 299 156 347 0 2 0 638 364 +2840 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289194.jpg 500 388 34 421 228 471 234 0 380 204 422 325 0 208 209 236 255 0 413 206 431 255 0 426 212 434 241 0 193 210 214 255 0 259 206 272 235 0 275 210 282 226 0 252 212 259 231 0 403 251 484 352 0 371 212 379 237 0 82 217 94 237 13 460 214 498 231 13 450 214 455 222 35 219 232 223 238 35 401 268 423 284 74 425 163 433 173 0 481 245 499 328 35 251 222 254 224 0 241 211 246 223 35 90 227 93 231 0 116 202 489 243 +2841 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140068.jpg 640 428 35 347 268 376 297 0 215 116 405 419 0 484 157 508 255 0 3 157 41 245 0 44 120 66 142 0 155 113 178 158 0 265 90 288 122 0 239 200 263 224 0 390 75 405 96 0 258 117 277 138 0 346 70 370 100 35 484 204 496 218 0 106 99 126 135 0 435 77 459 102 13 385 217 467 227 13 204 220 222 226 13 282 217 299 225 0 408 41 429 65 56 283 220 287 225 0 1 0 639 232 +2842 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310008.jpg 457 640 35 168 125 234 207 0 138 63 307 559 0 252 243 369 473 0 362 363 456 471 0 271 79 372 197 0 0 205 100 472 0 61 86 152 197 0 337 65 386 144 0 128 39 200 135 0 362 88 456 194 0 245 52 280 83 0 177 28 235 99 0 280 37 328 100 0 418 51 457 150 0 0 0 445 169 +2843 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425462.jpg 427 640 35 189 312 245 394 0 70 26 363 635 +2844 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310858.jpg 640 347 36 424 141 489 168 0 391 82 503 170 0 41 57 56 75 +2845 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307523.jpg 457 640 36 125 469 237 590 0 181 129 456 533 +2846 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569437.jpg 333 500 36 79 180 150 244 0 67 45 235 235 0 88 394 96 418 0 122 385 128 398 0 156 363 161 382 25 139 349 154 357 25 153 346 174 353 25 10 356 55 372 0 105 386 115 412 0 139 372 149 387 0 59 398 73 426 0 168 384 176 405 0 44 409 53 434 0 184 363 188 381 0 151 381 162 409 25 54 362 76 369 25 125 348 140 356 25 189 338 202 343 25 0 361 15 373 25 171 345 183 349 0 1 336 214 462 +2847 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467821.jpg 640 311 36 237 218 303 252 36 427 231 526 278 36 347 222 400 242 24 216 201 260 268 24 361 199 377 227 0 434 0 531 270 0 285 94 330 245 0 404 32 450 245 0 208 182 261 310 0 174 87 207 193 0 380 39 434 248 0 120 93 149 193 0 140 104 154 193 0 100 107 129 194 0 44 145 66 195 0 30 187 58 230 36 402 246 486 253 36 344 230 361 237 36 116 189 148 193 0 15 189 32 215 0 205 76 253 192 0 0 53 639 251 +2848 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016030.jpg 640 426 40 327 149 415 274 40 379 158 423 272 40 463 233 493 294 41 257 266 305 384 60 0 313 640 421 40 185 80 504 282 40 462 254 475 283 41 318 271 406 358 41 395 278 422 355 41 131 255 243 391 41 232 256 275 384 41 419 283 469 334 41 487 284 501 322 42 428 341 638 362 42 56 347 138 353 +2849 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463283.jpg 612 612 41 31 79 455 590 49 210 109 598 434 41 502 1 600 136 60 0 0 612 603 +2850 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472034.jpg 640 427 41 306 12 411 163 41 1 0 60 96 42 105 313 230 426 43 411 125 625 224 44 123 119 197 215 45 91 120 196 259 45 152 65 284 170 50 236 280 310 339 40 302 11 414 168 40 0 0 60 98 40 0 209 54 389 41 0 215 54 394 60 0 0 640 421 50 226 242 279 291 +2851 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080395.jpg 640 360 41 106 21 151 63 46 191 143 403 272 41 169 9 213 100 +2852 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558864.jpg 640 480 41 32 2 247 154 43 442 118 639 205 51 145 363 253 428 51 141 282 189 381 51 207 317 328 372 51 160 242 274 295 51 185 309 231 348 51 219 264 278 308 51 185 292 276 331 51 323 300 365 401 51 312 343 401 448 39 280 1 397 126 51 273 294 327 399 60 0 0 640 480 51 247 368 320 454 51 102 238 159 359 +2853 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339356.jpg 640 427 41 395 1 534 130 41 274 0 400 90 45 0 182 248 390 45 244 187 624 398 46 139 25 418 187 +2854 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232865.jpg 640 426 41 286 0 371 24 41 436 1 574 93 42 0 137 271 414 55 162 28 505 381 60 1 1 639 221 +2855 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135579.jpg 640 480 41 249 0 359 90 42 5 130 140 437 43 587 94 639 357 45 562 0 639 93 51 142 149 327 308 60 1 1 639 475 +2856 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509855.jpg 612 612 42 362 58 611 346 50 242 162 389 314 50 90 352 295 534 50 195 222 290 417 50 270 298 411 478 50 404 358 496 429 50 348 189 455 295 50 107 243 197 354 50 412 231 510 347 50 367 419 464 519 45 47 139 542 582 50 243 344 299 423 +2857 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127192.jpg 640 480 42 1 0 35 116 53 217 1 637 349 +2858 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250766.jpg 500 410 42 42 0 395 265 43 0 44 406 196 51 443 91 461 119 60 0 0 498 399 48 114 60 499 403 +2859 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112818.jpg 640 480 42 2 217 467 388 55 176 43 599 458 60 3 1 639 471 +2860 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530630.jpg 500 375 42 328 18 358 55 44 147 92 250 110 45 245 56 484 253 48 48 132 250 297 41 170 2 269 31 43 319 15 378 62 60 1 2 499 365 +2861 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235575.jpg 385 289 42 0 51 182 131 50 175 73 334 192 41 263 0 385 142 +2862 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107831.jpg 334 500 43 83 1 333 351 47 0 286 117 429 60 2 370 333 493 +2863 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237277.jpg 385 308 43 204 127 285 165 47 38 44 164 175 55 126 150 252 254 41 234 0 340 153 60 0 0 385 303 +2864 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144200.jpg 640 412 44 244 224 626 333 50 140 228 254 335 50 184 196 279 242 50 159 174 169 191 50 284 175 515 274 50 45 246 214 333 50 26 189 105 269 50 373 301 423 317 50 77 156 152 231 69 109 58 639 277 +2865 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202944.jpg 640 480 44 337 103 595 479 50 6 148 151 275 50 497 105 553 153 +2866 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521540.jpg 640 480 44 37 285 203 480 46 39 67 446 470 60 2 0 639 473 +2867 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096327.jpg 640 640 44 205 338 504 629 46 211 115 639 639 60 0 0 147 203 60 4 408 125 638 +2868 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506357.jpg 480 640 44 65 178 170 290 45 61 206 243 338 47 363 479 479 620 47 166 461 278 575 47 129 567 260 624 47 202 292 285 375 47 33 303 227 424 47 199 383 296 463 47 30 363 139 458 47 255 334 339 419 43 40 421 202 508 +2869 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333156.jpg 640 480 44 539 153 639 176 55 55 12 556 356 +2870 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455395.jpg 640 480 44 151 38 447 95 50 261 98 332 150 50 155 113 239 214 50 237 126 311 175 51 153 333 284 416 51 188 289 234 360 51 124 216 308 417 42 116 76 462 117 50 215 191 271 275 51 140 351 203 435 +2871 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038190.jpg 640 480 44 393 274 639 370 50 409 191 505 269 50 128 125 205 195 50 355 201 407 247 50 298 215 333 242 50 209 148 258 177 50 238 112 259 130 50 194 108 489 222 50 273 201 293 212 +2872 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139260.jpg 640 388 44 77 0 123 223 46 77 178 597 306 46 66 135 186 199 46 465 132 576 190 45 0 167 639 363 60 0 3 640 380 +2873 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493814.jpg 640 424 45 0 88 640 423 50 235 272 302 367 50 272 120 408 169 50 123 172 259 305 50 409 222 488 309 51 347 163 389 255 51 376 239 422 319 51 385 156 464 235 51 484 259 527 351 51 509 296 570 346 51 100 228 138 278 51 186 161 221 188 51 67 136 118 177 51 82 180 113 205 +2874 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158660.jpg 612 612 45 334 278 611 422 45 71 251 327 366 46 70 183 320 295 47 324 205 456 329 47 435 265 567 344 47 515 264 610 343 0 0 95 58 174 69 393 127 542 250 47 381 266 467 337 0 473 5 611 293 +2875 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475413.jpg 640 480 45 6 0 639 443 49 346 38 447 211 49 161 7 307 88 51 56 60 207 248 51 334 173 396 231 51 458 118 510 167 51 275 203 305 230 51 256 183 305 217 51 253 152 286 184 51 307 191 337 228 +2876 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272615.jpg 480 640 45 248 222 465 439 45 24 231 246 439 45 128 21 355 272 46 157 411 344 603 50 272 331 371 411 50 340 252 446 328 45 147 406 351 611 60 0 1 480 630 51 132 105 146 134 51 297 148 345 214 51 255 12 274 45 51 183 179 200 221 51 194 199 206 223 51 200 184 226 214 51 302 148 323 171 51 286 32 304 55 51 173 189 184 200 51 166 152 178 165 +2877 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368096.jpg 640 481 45 159 167 615 474 49 313 15 487 192 47 397 160 527 292 +2878 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191761.jpg 500 375 45 42 27 499 329 46 297 107 499 201 49 278 194 410 274 49 378 199 495 283 +2879 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378712.jpg 640 368 45 389 144 607 354 45 263 42 541 179 50 268 171 377 282 45 102 14 263 156 +2880 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266176.jpg 640 428 45 174 278 513 421 46 278 177 394 251 +2881 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198367.jpg 639 640 45 110 82 521 496 46 206 96 451 424 47 336 282 465 413 47 209 302 318 437 +2882 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335976.jpg 640 427 45 13 3 610 420 50 195 41 354 200 50 316 53 532 335 50 289 205 403 334 50 139 85 199 174 50 364 55 464 197 51 437 88 448 122 +2883 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177575.jpg 640 424 45 0 2 639 418 50 256 256 374 346 50 485 296 619 411 50 336 325 506 404 50 164 110 639 417 50 298 112 420 188 +2884 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572051.jpg 480 640 45 2 1 479 632 50 188 241 339 379 50 39 81 132 184 50 117 84 209 163 50 0 394 113 579 50 122 378 392 637 50 0 300 64 389 50 266 22 330 86 50 7 224 60 294 50 0 420 36 483 50 30 376 75 434 +2885 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298691.jpg 640 427 45 24 0 639 420 50 331 120 388 187 50 159 284 260 365 50 329 336 492 410 50 459 92 623 247 50 514 288 607 362 50 166 50 256 94 50 261 298 328 405 50 342 213 396 282 50 172 246 227 290 50 353 20 412 83 50 568 116 635 218 50 402 298 459 345 50 207 108 256 141 50 82 10 639 403 +2886 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091766.jpg 639 640 45 330 231 533 441 50 108 126 362 413 51 0 46 90 216 51 52 150 107 347 51 80 45 152 384 51 110 277 181 424 51 133 109 178 186 51 0 66 117 297 +2887 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257137.jpg 640 480 45 1 2 639 479 50 161 196 250 286 50 450 99 509 174 50 294 109 344 191 50 468 200 563 308 50 409 339 532 426 50 387 418 438 469 50 432 167 476 219 50 107 249 144 308 50 107 261 136 308 50 136 284 264 451 50 266 333 407 433 50 322 159 442 254 +2888 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321079.jpg 640 426 46 192 220 321 368 46 76 146 180 255 46 302 115 401 234 55 0 0 592 420 +2889 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375198.jpg 640 429 46 0 1 573 422 46 127 1 198 44 51 577 112 639 152 +2890 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423048.jpg 425 640 46 216 426 268 455 46 256 382 274 418 46 278 320 314 350 46 172 219 213 243 46 129 84 312 131 46 269 385 295 406 46 201 328 265 356 46 192 418 234 443 46 153 425 192 441 46 203 181 219 224 46 251 326 285 353 46 173 315 226 351 46 225 308 243 335 46 118 136 319 458 +2891 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167583.jpg 427 640 46 328 85 354 114 49 0 382 210 631 47 185 289 281 440 0 102 107 214 211 47 0 222 185 279 47 1 256 258 537 47 311 300 322 311 +2892 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060126.jpg 432 354 46 65 31 388 309 55 48 33 393 344 +2893 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340529.jpg 640 427 46 145 174 317 350 46 180 332 345 421 49 264 268 559 425 6 242 13 442 175 46 12 265 96 390 46 1 200 202 392 46 51 304 105 426 46 92 282 146 426 47 527 316 582 355 47 574 308 639 366 47 481 317 526 370 47 527 279 577 315 0 430 55 464 128 0 217 93 261 129 47 564 343 623 385 47 509 346 574 395 47 554 362 639 426 47 576 271 625 308 0 346 60 363 114 46 0 380 67 426 +2894 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333845.jpg 640 486 46 226 208 629 432 47 13 329 125 414 47 101 364 263 433 45 5 323 603 476 47 286 310 370 332 60 535 425 628 473 +2895 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100343.jpg 480 640 46 0 250 480 629 46 314 40 474 352 77 54 63 425 447 +2896 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161820.jpg 428 640 46 77 1 427 633 +2897 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074963.jpg 640 428 46 231 162 359 292 46 342 157 450 260 46 401 172 501 281 46 505 199 571 277 46 106 251 144 276 46 158 197 176 232 46 86 196 219 300 +2898 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310202.jpg 640 425 46 162 133 204 192 46 345 240 393 263 46 41 259 109 318 46 125 283 139 311 46 93 274 198 378 0 149 85 323 297 0 525 179 639 423 0 535 192 566 287 0 474 217 548 374 0 339 160 385 217 0 299 144 350 279 0 499 201 537 239 0 439 209 456 234 26 516 244 545 307 26 209 238 283 299 46 323 340 340 376 46 427 333 452 346 46 181 205 499 402 46 128 179 157 206 0 453 211 488 270 0 451 201 470 217 46 495 384 520 408 +2899 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209441.jpg 640 427 46 418 168 603 338 46 519 149 639 281 46 402 253 617 386 46 338 333 461 421 46 328 120 454 342 46 615 125 639 237 46 358 153 639 421 46 468 139 520 215 46 557 209 613 239 47 139 104 243 196 47 0 162 266 355 47 0 238 44 320 47 0 311 65 359 +2900 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325410.jpg 429 640 46 225 347 269 399 46 66 214 413 555 +2901 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310094.jpg 375 500 46 210 115 295 185 46 97 192 293 430 46 76 4 261 122 +2902 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160886.jpg 375 500 46 25 113 346 460 +2903 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457262.jpg 612 612 46 27 122 437 280 46 64 151 457 385 60 4 6 607 591 +2904 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013004.jpg 375 500 46 44 72 342 289 60 1 6 374 483 +2905 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189078.jpg 500 334 46 20 66 172 152 46 59 44 180 88 46 21 74 198 204 47 335 7 477 198 49 252 119 354 219 49 183 47 267 134 49 261 60 350 136 +2906 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000513342.jpg 365 480 46 30 300 302 455 47 16 24 352 259 49 122 217 224 314 +2907 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035368.jpg 612 612 46 326 153 405 415 46 359 118 557 409 46 301 300 354 428 46 240 410 421 516 49 381 484 495 597 41 0 431 123 611 41 0 294 67 420 45 226 416 609 604 60 107 541 588 601 41 114 434 152 584 41 0 417 104 438 49 418 434 535 508 +2908 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543696.jpg 640 480 46 66 78 538 251 46 48 163 599 415 60 1 1 639 473 +2909 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088560.jpg 500 375 47 308 156 495 293 49 253 191 308 249 49 206 185 257 236 49 292 183 341 216 49 246 148 300 196 47 84 128 194 209 56 299 86 306 129 56 105 84 118 93 56 104 70 144 103 56 271 84 286 125 56 283 85 299 120 49 15 124 94 182 56 261 84 271 118 56 227 82 240 109 56 254 84 263 121 56 239 82 253 95 60 60 97 126 103 60 98 106 140 116 +2910 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495090.jpg 640 374 47 265 60 359 136 50 29 27 180 135 51 188 166 396 294 55 160 78 270 136 45 28 27 376 196 45 177 134 619 356 55 215 156 364 297 +2911 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134542.jpg 640 416 47 441 147 487 190 47 399 105 503 190 +2912 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303937.jpg 640 307 47 1 5 481 259 49 438 27 639 228 +2913 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335992.jpg 612 612 47 194 416 280 508 49 142 480 240 588 0 553 180 590 330 41 310 115 577 545 +2914 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056137.jpg 500 375 47 73 116 323 307 47 0 137 205 366 47 190 119 401 272 47 371 120 499 220 0 338 29 405 122 49 291 126 472 243 49 100 58 163 104 49 147 48 155 58 +2915 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203095.jpg 640 480 47 503 297 586 376 51 424 150 490 247 51 402 137 443 236 50 298 107 404 167 69 0 109 116 416 +2916 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399744.jpg 640 457 47 305 294 513 362 26 506 330 578 374 26 360 242 394 299 0 92 134 293 334 0 315 171 420 302 0 305 206 345 286 0 444 150 529 337 0 536 169 639 373 0 568 132 639 196 0 421 194 472 315 0 229 203 262 262 47 75 362 106 383 0 199 200 241 264 47 213 341 238 360 47 8 351 639 453 0 250 225 275 256 0 41 216 71 256 0 471 156 588 329 0 0 2 434 404 +2917 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166557.jpg 640 427 49 200 132 428 364 +2918 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166320.jpg 640 480 49 159 26 177 66 49 88 45 89 47 49 16 30 32 53 49 145 24 162 64 47 256 279 449 479 47 49 290 242 474 47 473 283 639 479 +2919 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284253.jpg 640 480 49 0 2 640 165 49 392 72 446 129 +2920 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298809.jpg 640 480 49 141 34 537 419 +2921 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383341.jpg 640 480 49 231 162 381 290 46 331 89 505 368 46 121 66 296 332 +2922 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350648.jpg 640 480 49 414 300 572 408 41 69 23 355 445 +2923 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577847.jpg 640 457 49 312 262 433 393 49 235 280 340 406 60 1 1 639 451 52 352 33 535 370 +2924 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533261.jpg 500 375 49 149 115 369 325 +2925 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140664.jpg 640 426 50 73 202 253 288 50 60 287 229 383 50 0 124 137 358 50 227 306 412 392 50 294 187 414 306 50 423 181 548 293 45 0 58 640 419 50 132 139 299 260 50 0 79 63 133 51 163 100 194 132 51 144 147 168 169 51 238 164 299 218 51 415 132 519 213 51 593 319 639 349 51 558 178 620 257 51 490 294 514 314 51 365 338 407 359 50 399 313 546 380 50 202 280 312 382 +2926 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318124.jpg 612 612 50 445 235 591 399 50 334 192 455 342 50 267 264 385 391 50 404 137 582 245 +2927 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163775.jpg 480 640 50 273 135 316 181 50 277 175 353 229 50 296 96 361 172 51 326 116 393 226 51 314 224 395 244 0 126 0 331 94 45 104 305 424 570 51 207 104 320 187 51 347 123 415 198 55 386 167 479 331 50 348 145 398 213 +2928 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500878.jpg 640 426 50 153 118 325 239 50 270 63 365 147 50 535 61 639 157 53 1 5 640 420 50 492 312 524 349 +2929 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208663.jpg 500 334 50 0 109 152 256 50 137 184 385 320 50 392 147 499 332 50 47 179 153 244 50 355 0 499 154 50 76 1 229 79 50 129 52 224 178 51 0 269 77 325 50 65 191 168 272 51 312 0 358 25 50 16 62 110 148 50 317 291 387 329 50 270 176 317 226 51 176 163 256 257 +2930 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371841.jpg 640 458 50 205 227 408 437 50 36 111 111 195 50 284 102 378 175 50 145 124 244 234 50 7 184 176 368 50 166 28 338 132 50 408 204 495 288 50 107 113 204 171 50 210 210 279 273 +2931 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425848.jpg 640 480 50 73 48 377 427 45 1 1 639 473 +2932 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063671.jpg 640 459 50 82 177 236 323 51 456 267 509 308 51 466 305 507 326 +2933 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457717.jpg 640 640 50 251 433 549 573 50 532 231 621 380 50 471 378 598 485 50 230 377 309 481 50 406 271 485 336 50 197 378 266 457 +2934 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209142.jpg 640 425 50 222 58 362 195 50 180 254 313 342 50 473 293 552 373 50 186 134 305 256 43 218 10 639 250 50 87 111 138 171 50 347 114 408 190 50 488 68 525 105 50 233 341 287 398 50 149 84 207 146 42 92 133 264 424 45 0 0 639 425 51 347 218 365 240 +2935 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207205.jpg 640 480 50 11 240 487 431 51 148 412 351 472 51 393 297 507 355 56 77 0 254 81 +2936 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347819.jpg 640 593 50 154 216 265 326 50 284 331 355 406 60 0 0 640 593 50 268 173 393 311 +2937 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188534.jpg 640 480 50 412 254 607 388 51 389 58 538 144 +2938 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571497.jpg 640 480 50 394 308 544 414 50 136 309 191 370 51 0 321 45 384 51 436 280 482 333 +2939 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264540.jpg 640 427 50 134 145 285 302 50 0 133 101 332 50 92 121 171 177 50 67 86 142 147 50 88 310 160 379 22 146 271 225 389 50 267 175 298 196 50 187 131 241 163 +2940 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402717.jpg 640 640 50 122 160 227 287 50 142 21 311 186 48 55 17 599 482 +2941 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061658.jpg 640 480 50 179 151 272 319 50 265 158 373 280 50 196 335 323 463 50 92 393 255 473 50 3 308 127 462 50 9 208 130 349 50 446 11 624 228 50 97 235 202 385 50 492 0 607 49 50 398 3 505 74 50 240 257 396 440 50 367 115 481 300 +2942 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468736.jpg 640 480 50 30 28 276 237 +2943 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086877.jpg 640 481 50 308 250 349 298 69 2 2 639 480 50 455 172 507 214 55 245 237 350 333 55 436 165 518 224 55 341 157 427 243 55 105 159 206 239 55 105 231 214 317 55 123 104 211 154 55 228 104 315 176 55 240 167 331 247 55 341 107 418 166 55 381 234 475 311 55 476 230 573 319 +2944 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031247.jpg 640 640 50 10 90 180 272 50 351 320 384 355 45 373 69 533 221 39 0 0 130 194 +2945 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444626.jpg 640 480 50 83 170 331 381 50 452 167 569 302 50 409 263 497 355 50 448 109 536 199 50 368 69 436 131 50 261 51 353 132 51 414 231 452 262 51 228 197 268 238 51 276 246 308 269 51 309 190 348 219 51 309 171 337 187 50 364 181 444 221 50 360 154 390 179 50 157 126 245 189 50 136 45 299 156 51 335 167 380 220 51 304 233 356 290 51 169 131 201 158 51 164 194 198 230 51 175 177 215 198 51 181 237 219 259 51 171 159 195 188 51 352 106 375 123 +2946 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037629.jpg 640 480 50 406 175 538 337 50 361 281 423 334 50 62 207 169 286 50 334 224 389 259 53 15 157 619 402 50 283 275 362 323 50 210 267 248 313 50 172 235 213 262 50 259 180 295 213 +2947 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323925.jpg 640 640 50 232 138 360 284 51 167 272 215 338 51 204 207 257 254 51 281 277 315 322 77 216 315 390 504 +2948 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483389.jpg 640 458 50 343 243 512 389 50 297 145 624 390 43 485 2 639 231 60 0 3 640 451 42 458 0 464 19 +2949 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447378.jpg 640 480 50 458 109 639 312 +2950 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393794.jpg 640 480 50 214 213 451 377 45 0 1 640 471 50 102 290 331 471 50 98 82 259 269 +2951 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023309.jpg 500 362 50 334 144 384 206 50 198 213 249 268 50 282 272 334 345 50 264 3 338 49 50 379 1 409 45 50 337 205 387 272 50 403 122 437 170 50 0 9 31 70 50 416 83 495 158 51 48 104 86 178 50 235 71 277 107 50 316 82 348 129 51 210 79 296 133 50 112 204 168 265 50 54 166 95 197 50 51 0 134 361 +2952 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036508.jpg 640 480 53 117 87 554 430 60 0 0 640 474 +2953 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038252.jpg 480 640 63 0 48 480 592 47 196 217 263 267 +2954 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343680.jpg 480 640 73 0 45 199 230 73 380 73 430 249 73 412 71 475 259 73 326 81 348 144 73 108 437 217 548 60 0 175 266 639 73 311 46 391 135 73 383 55 479 68 73 344 74 383 164 73 362 285 477 373 16 181 119 417 627 +2955 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041147.jpg 473 640 75 93 286 343 599 +2956 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000309655.jpg 640 480 0 241 203 357 471 0 236 216 255 281 0 389 224 431 292 0 133 231 158 274 0 358 225 377 281 0 221 233 238 276 0 252 219 268 271 0 372 232 391 278 0 89 238 111 283 0 0 222 5 271 30 396 289 439 292 30 89 280 108 281 30 364 277 375 282 30 0 283 56 287 0 25 217 45 284 31 5 282 57 288 0 66 222 94 278 0 3 213 32 298 30 389 284 401 288 +2957 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167152.jpg 640 480 22 310 184 342 208 22 283 183 314 210 22 414 188 448 209 22 480 195 501 209 22 504 194 513 211 22 544 194 565 215 22 384 187 408 206 22 376 189 382 204 22 447 188 476 211 22 407 186 426 209 22 110 192 144 214 22 526 192 545 215 22 35 186 64 216 22 13 182 488 209 +2958 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000028039.jpg 640 383 22 25 88 209 203 22 115 107 279 206 22 563 120 630 235 22 448 109 538 239 22 329 137 445 226 22 417 130 479 225 22 264 108 439 225 22 190 99 357 215 +2959 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023411.jpg 640 427 22 232 111 551 389 22 59 45 519 409 22 580 87 639 214 +2960 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002684.jpg 640 480 22 63 144 147 264 22 390 139 437 296 22 227 111 373 243 22 130 117 200 229 22 173 107 229 310 22 483 119 602 163 22 429 99 548 309 22 529 152 620 279 22 222 143 323 325 22 13 126 142 248 +2961 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489475.jpg 640 480 22 209 248 411 473 22 254 108 431 279 22 473 86 583 292 22 382 280 566 430 22 381 316 630 474 22 0 113 176 237 22 126 92 360 261 22 553 133 639 319 22 0 207 209 379 22 0 313 121 479 22 402 85 496 285 22 596 79 638 136 22 564 367 639 479 +2962 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226744.jpg 640 427 32 198 1 340 116 32 164 117 314 259 32 320 52 466 189 32 334 159 499 324 32 289 310 449 426 32 140 246 307 408 32 271 194 363 337 35 94 0 563 419 +2963 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175612.jpg 427 640 36 225 264 388 478 +2964 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045728.jpg 640 480 42 11 24 355 154 43 321 61 637 143 +2965 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431594.jpg 500 375 44 141 66 266 111 +2966 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350388.jpg 480 640 45 0 1 480 639 50 213 209 347 326 50 221 291 369 436 50 136 293 259 410 50 92 290 115 318 +2967 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371326.jpg 428 640 46 149 264 244 330 46 134 183 182 235 46 180 165 253 219 46 175 196 207 227 46 243 289 280 355 +2968 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349402.jpg 640 480 46 408 89 566 281 46 71 395 120 469 46 8 310 67 367 46 74 218 125 279 46 100 92 256 317 46 236 123 328 309 46 312 100 415 369 46 0 159 164 351 46 603 122 639 392 46 423 267 526 346 46 26 358 69 444 59 122 340 635 471 +2969 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000329533.jpg 480 640 46 119 204 195 309 46 277 192 341 290 46 367 164 419 252 46 94 304 180 359 46 70 15 182 127 46 192 9 292 147 46 282 5 318 97 46 319 181 373 272 46 277 296 312 328 47 118 356 164 395 47 200 365 254 401 47 58 336 479 629 47 21 427 75 474 49 0 469 59 532 49 12 544 88 605 49 83 531 147 595 49 25 579 96 639 49 64 490 133 546 49 106 568 177 619 49 0 565 22 627 49 0 514 11 564 49 9 506 69 549 49 137 541 171 580 0 444 491 479 616 46 349 189 379 268 46 1 22 75 135 47 134 422 444 629 49 20 526 83 565 49 92 617 152 639 49 147 616 182 639 +2970 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362971.jpg 640 424 46 229 62 402 336 46 57 55 287 315 46 268 1 550 231 46 289 119 463 305 46 84 278 429 418 46 0 312 127 417 46 0 202 85 323 46 515 0 629 107 46 414 14 480 126 0 548 3 639 121 46 421 266 628 417 46 346 98 549 290 46 511 200 639 423 46 233 88 319 185 46 18 0 639 423 +2971 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124157.jpg 640 427 46 127 135 263 182 46 144 183 275 222 46 103 216 230 291 46 310 158 462 203 46 265 257 430 297 46 292 196 444 228 46 309 150 436 179 46 302 132 432 163 46 405 71 534 135 46 464 132 543 174 46 266 288 416 332 46 0 56 638 419 +2972 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370388.jpg 612 612 46 14 8 352 289 +2973 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581781.jpg 640 478 46 136 216 433 315 46 214 375 446 436 46 561 6 639 40 46 467 0 537 25 46 48 85 169 151 46 467 280 639 457 46 2 184 139 343 46 206 306 446 404 46 439 94 599 265 46 582 141 639 227 46 75 105 173 212 46 2 2 43 172 46 193 183 441 246 46 0 20 639 477 +2974 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050331.jpg 640 480 50 366 92 504 235 50 33 157 111 267 58 1 57 399 473 58 298 90 639 479 +2975 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072020.jpg 478 640 50 116 241 207 325 50 194 294 231 343 50 93 309 192 376 50 170 209 253 302 56 67 0 458 48 45 24 173 475 549 26 361 0 451 48 +2976 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020349.jpg 479 640 50 350 240 474 349 50 272 358 363 457 50 128 234 245 351 50 1 363 180 531 50 159 395 259 489 50 246 276 364 360 50 385 335 477 425 50 392 425 478 548 50 247 438 395 551 50 1 0 478 446 51 392 22 405 32 51 259 6 289 36 51 404 19 417 33 51 440 20 458 31 51 347 4 385 24 51 373 21 385 34 51 307 18 314 31 51 418 0 431 25 +2977 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346337.jpg 427 640 57 1 4 426 622 16 1 1 360 601 +2978 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044559.jpg 425 640 0 184 260 264 388 30 210 385 235 402 +2979 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546760.jpg 640 425 6 2 0 639 418 +2980 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473124.jpg 312 504 49 0 174 104 275 +2981 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469088.jpg 500 381 16 165 59 354 322 16 44 80 221 377 +2982 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292995.jpg 640 426 52 64 156 529 340 45 179 44 283 81 52 468 51 559 132 52 555 135 583 168 52 261 0 475 65 52 526 87 639 188 41 0 1 121 95 52 565 257 639 320 52 551 218 639 277 52 118 72 479 168 +2983 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135266.jpg 426 640 52 139 180 270 242 0 2 5 273 631 0 205 260 324 625 0 373 243 396 290 0 101 251 141 283 48 138 178 270 243 41 157 328 222 414 39 217 405 231 470 41 144 569 186 609 0 85 278 128 341 0 304 263 425 639 0 287 267 305 289 8 285 228 413 314 8 161 574 271 632 +2984 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297074.jpg 500 375 52 183 176 381 365 0 1 41 382 367 +2985 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094795.jpg 500 375 16 230 169 499 373 0 209 78 243 149 0 184 93 202 142 0 0 108 10 158 37 192 54 254 114 2 164 97 188 108 2 271 98 294 104 +2986 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332025.jpg 612 612 16 336 356 397 456 0 35 244 88 420 0 79 233 129 401 0 489 228 598 501 0 122 242 173 395 24 25 270 62 355 67 498 250 505 264 31 57 273 92 420 31 135 266 171 396 30 85 256 136 414 +2987 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530624.jpg 640 478 16 96 107 614 301 59 0 0 640 467 +2988 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187199.jpg 640 478 16 148 165 630 470 39 168 42 201 85 59 6 152 639 471 74 133 0 177 31 +2989 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366611.jpg 640 478 16 0 165 172 377 32 145 251 216 324 +2990 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391940.jpg 640 480 16 523 247 630 312 56 518 150 539 184 56 547 153 582 192 56 502 151 521 167 56 539 149 563 182 60 480 143 546 150 0 136 16 460 392 0 459 123 486 145 0 367 98 402 173 0 406 138 426 176 26 163 139 227 396 0 347 104 367 153 0 228 101 235 139 0 416 129 423 144 0 432 102 461 204 24 376 112 403 142 47 560 332 593 364 47 514 374 555 411 47 167 102 198 135 47 565 374 603 414 47 421 424 468 467 47 77 396 318 474 47 400 385 439 422 47 0 425 59 479 47 335 423 376 461 0 401 121 415 138 0 562 107 578 139 25 336 64 414 122 0 475 106 493 137 0 434 104 438 124 47 487 358 523 393 47 312 364 568 479 47 603 380 639 420 0 424 103 433 120 26 302 150 422 371 0 141 102 475 214 +2991 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431464.jpg 640 427 58 362 0 523 78 58 78 30 125 74 58 52 32 83 71 58 23 15 55 76 58 261 0 328 70 39 428 57 507 251 42 505 321 591 426 45 0 248 105 315 51 304 271 320 283 51 347 310 408 347 51 382 352 408 384 51 276 321 333 348 51 274 280 314 317 51 192 286 214 312 51 218 305 266 325 51 226 279 270 289 51 351 340 386 362 51 180 243 430 407 39 509 89 548 235 42 212 137 274 151 44 311 254 480 322 60 0 189 640 421 0 519 0 639 197 58 0 16 29 80 +2992 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025252.jpg 480 640 58 431 553 479 593 58 272 533 314 557 58 151 539 183 557 74 289 318 350 395 +2993 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084674.jpg 480 640 62 134 229 174 288 57 421 295 479 327 0 144 171 477 629 0 0 158 195 629 74 395 213 416 262 54 252 370 292 405 73 140 365 158 449 0 195 285 395 633 57 166 313 209 401 +2994 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153231.jpg 640 426 62 134 29 233 106 39 581 47 598 85 60 246 269 639 420 0 271 229 329 291 0 475 103 600 291 0 90 142 366 425 48 357 342 431 384 48 419 328 490 365 56 427 161 528 280 65 565 298 594 336 73 306 123 360 139 73 71 51 119 93 73 97 111 106 150 39 621 53 634 78 39 614 58 623 79 39 634 56 639 77 39 595 50 610 82 51 390 338 413 345 51 375 342 420 363 53 338 296 399 318 73 83 230 97 266 73 260 171 275 196 73 74 107 86 150 73 304 154 352 161 73 86 113 96 151 73 103 112 115 150 73 98 20 108 52 73 90 19 95 49 73 96 0 123 11 75 597 49 610 82 75 622 54 634 78 75 633 59 639 77 42 503 162 531 202 75 610 62 622 80 75 177 246 220 278 73 309 144 352 149 73 68 5 361 263 +2995 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553443.jpg 640 360 62 404 154 471 243 56 108 276 152 351 0 182 112 488 355 0 114 153 243 349 0 458 89 525 223 47 290 212 335 239 63 474 178 537 226 63 485 252 639 356 66 416 259 467 284 66 429 213 472 229 66 486 328 608 359 +2996 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498765.jpg 414 500 62 68 118 130 202 48 69 282 144 349 40 0 384 25 499 41 296 452 398 499 48 37 421 110 466 57 35 133 413 499 66 0 247 45 267 0 77 15 360 468 62 0 132 69 214 +2997 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519316.jpg 640 427 62 185 139 220 184 56 152 198 235 339 59 280 151 506 261 56 229 381 428 426 56 444 252 595 419 57 448 251 595 418 65 211 188 230 191 57 225 379 429 426 +2998 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518968.jpg 640 427 14 396 10 423 45 0 26 183 40 200 0 279 188 299 213 37 294 211 305 221 37 592 234 612 236 8 116 146 137 152 0 571 221 593 236 +2999 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041373.jpg 640 347 15 369 219 445 262 59 300 182 568 342 77 175 169 219 200 +3000 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460757.jpg 640 430 15 108 60 637 348 51 84 206 148 314 +3001 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012085.jpg 640 480 15 46 202 227 291 15 525 171 616 291 0 143 215 634 471 59 0 124 640 472 +3002 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235790.jpg 640 640 15 228 332 499 500 15 227 444 400 627 55 217 53 321 152 55 132 451 208 625 55 110 87 200 185 +3003 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296492.jpg 480 640 39 389 238 438 377 0 87 110 312 561 41 326 316 378 423 43 58 259 73 293 71 0 236 180 348 39 371 241 407 354 41 48 281 82 326 45 287 24 340 50 45 287 3 338 26 45 287 50 341 60 47 337 458 471 563 47 384 463 455 526 +3004 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313034.jpg 640 480 39 192 228 207 265 39 232 180 250 263 74 553 169 573 191 0 2 109 324 472 0 294 88 547 472 42 304 274 330 330 55 215 277 311 330 39 595 204 601 218 75 232 180 251 256 0 289 141 310 202 41 602 274 612 287 +3005 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374702.jpg 428 640 39 189 417 290 639 0 5 1 427 564 42 115 547 184 602 43 97 535 111 637 54 27 523 191 631 26 357 84 427 536 60 278 532 427 631 +3006 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145597.jpg 640 480 39 300 303 355 359 39 106 231 179 265 41 359 325 382 362 26 166 355 263 479 0 315 10 473 219 0 476 33 639 264 0 355 123 639 479 0 0 65 198 479 0 37 12 159 209 26 445 156 496 217 39 98 220 178 257 40 295 159 310 178 41 298 270 324 302 49 371 282 384 296 49 385 286 395 294 49 376 290 388 299 49 382 279 394 289 49 388 255 394 258 49 377 300 393 317 +3007 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009270.jpg 424 640 39 0 466 25 631 60 17 516 422 629 0 53 54 372 535 0 36 139 88 257 42 38 216 182 273 13 0 250 424 504 0 86 74 166 221 41 0 230 27 291 41 373 249 403 286 55 179 539 304 634 +3008 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420610.jpg 640 478 39 422 240 539 395 39 494 228 568 373 60 3 6 639 472 0 0 179 179 301 41 134 0 201 93 44 329 45 422 53 44 151 12 221 87 45 168 19 343 143 45 337 71 403 116 45 372 32 533 124 45 248 0 391 73 52 467 44 505 80 52 400 77 466 114 52 389 54 452 92 52 405 54 445 71 52 464 82 502 113 52 422 45 469 82 52 439 48 483 66 52 455 83 483 98 44 183 219 362 254 42 547 19 632 124 42 186 230 336 252 52 456 58 488 82 52 480 61 491 72 39 316 88 358 151 +3009 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021639.jpg 640 480 39 45 101 83 176 39 80 100 129 171 39 2 102 46 166 42 41 214 84 278 45 63 183 132 229 45 499 133 580 179 55 121 101 461 357 43 448 272 621 304 45 1 160 69 197 45 18 192 64 231 60 6 221 639 398 +3010 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300472.jpg 640 480 39 79 338 168 479 39 247 113 263 163 39 271 122 282 161 39 245 164 259 200 60 0 304 640 479 0 213 2 617 388 41 465 274 550 375 52 297 326 383 362 52 290 298 359 338 73 130 178 143 204 73 117 177 136 205 56 7 178 185 323 73 134 183 164 204 +3011 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077415.jpg 640 480 39 25 5 244 412 39 209 1 324 97 48 236 61 539 427 0 0 59 253 474 +3012 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575020.jpg 640 426 39 472 189 537 391 48 190 287 369 383 0 165 6 602 328 42 70 410 92 425 60 0 278 192 425 0 181 87 317 275 40 98 226 154 311 60 328 312 638 424 +3013 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281163.jpg 120 120 39 41 3 67 91 52 52 63 105 117 +3014 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473406.jpg 480 640 39 376 223 417 364 39 355 226 388 335 0 84 93 329 619 41 315 307 360 411 41 26 271 64 319 43 36 249 52 284 47 321 448 459 546 71 0 246 153 338 71 0 236 59 271 +3015 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448923.jpg 640 480 39 481 32 552 236 39 591 81 639 223 48 43 34 341 473 40 323 5 362 97 40 14 0 43 79 40 107 2 141 83 40 124 0 158 78 40 360 0 385 69 45 13 77 80 111 40 335 0 355 9 40 374 31 396 73 26 392 281 454 337 60 0 39 467 471 39 395 0 432 107 +3016 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325328.jpg 640 624 39 459 0 583 310 56 311 46 447 212 40 219 51 329 296 53 4 290 636 614 0 248 0 355 55 43 0 412 54 454 60 0 191 640 623 60 409 55 487 152 45 348 197 464 281 40 578 123 639 354 +3017 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135029.jpg 640 480 56 46 51 387 144 60 0 105 640 479 48 24 204 248 386 41 229 105 368 243 41 437 28 563 267 44 219 186 317 254 56 543 104 639 164 56 0 16 42 153 +3018 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505862.jpg 640 426 56 268 179 357 244 56 136 193 290 285 60 2 285 90 405 60 9 114 212 239 0 127 3 637 418 0 173 73 301 193 0 277 86 326 178 0 86 90 186 164 0 127 54 165 113 0 61 19 129 155 0 342 73 434 191 7 251 53 378 133 41 70 235 149 321 42 260 210 332 274 53 73 256 362 415 0 341 85 360 119 0 319 85 345 136 0 354 86 378 124 39 153 137 164 176 40 341 131 351 138 40 98 130 113 159 40 112 128 134 166 40 471 178 494 202 41 319 136 333 158 41 83 157 109 172 60 303 155 347 188 40 66 235 148 324 53 192 262 238 276 41 336 138 347 161 +3019 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540172.jpg 640 480 56 330 1 543 149 60 0 89 640 474 1 130 0 217 88 0 0 0 72 106 48 161 264 331 407 48 206 238 393 346 41 359 132 447 232 44 419 195 441 264 52 168 269 324 402 1 225 0 236 17 1 212 0 346 93 1 285 0 341 96 56 0 1 65 121 +3020 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000338581.jpg 640 425 56 36 79 149 312 56 0 55 46 240 60 20 45 631 417 50 239 58 424 173 45 287 125 390 184 60 22 148 616 420 39 418 134 450 209 39 465 145 499 226 39 445 139 556 244 39 584 171 630 259 39 423 125 447 152 48 514 281 585 349 48 465 258 531 340 48 324 214 371 273 48 410 249 475 317 48 245 187 282 241 48 184 167 219 213 48 219 179 265 235 48 87 134 121 168 39 548 164 589 247 39 206 92 227 145 39 165 80 183 132 39 617 159 639 257 39 440 115 455 155 39 449 124 475 160 48 260 193 298 247 48 379 232 449 303 48 106 143 148 178 48 163 165 201 203 48 127 150 165 190 48 278 199 312 251 48 345 227 401 286 48 174 167 206 208 48 139 155 176 192 48 43 115 348 267 +3021 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141849.jpg 428 640 57 2 4 390 434 77 76 133 401 447 77 184 66 427 389 59 0 362 428 639 77 13 274 324 573 +3022 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505754.jpg 640 360 60 0 2 640 355 41 27 23 266 271 55 383 101 551 272 66 0 0 453 161 42 550 162 638 217 +3023 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143236.jpg 640 520 60 1 0 638 511 45 321 28 592 279 51 125 134 145 159 51 49 12 248 241 +3024 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198464.jpg 427 640 60 0 22 425 632 0 212 0 425 182 48 60 270 388 581 41 228 122 403 376 0 0 0 79 214 52 54 266 396 579 +3025 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255529.jpg 500 375 60 203 56 333 129 60 0 88 497 368 0 310 0 388 123 54 13 248 62 292 54 46 238 80 261 54 96 272 143 318 54 146 255 196 299 54 104 242 149 274 0 368 1 420 102 54 197 220 240 247 54 244 196 267 234 54 279 192 298 237 54 260 193 281 233 54 100 258 148 291 54 148 217 190 258 54 184 154 226 176 75 377 167 445 208 75 271 46 284 69 54 185 177 224 197 75 218 31 256 134 54 47 118 466 374 +3026 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577128.jpg 640 480 60 3 29 639 471 40 13 0 108 165 42 162 80 235 152 44 360 11 508 66 45 228 11 509 128 52 216 185 560 389 43 509 43 639 81 73 0 28 45 64 43 75 84 247 123 73 0 63 51 83 +3027 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493196.jpg 640 480 1 259 281 292 325 1 160 261 196 317 0 193 142 324 382 0 265 251 289 318 0 154 221 192 302 +3028 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328791.jpg 640 428 1 35 214 102 371 2 171 140 215 162 0 94 128 183 394 0 217 117 262 291 0 450 120 515 295 0 563 142 586 203 0 584 141 606 201 25 206 0 375 64 24 199 143 234 201 2 563 145 620 174 25 519 111 570 132 25 564 119 581 130 0 619 133 639 209 0 534 138 547 190 2 11 143 42 153 2 37 143 79 159 25 368 3 503 78 2 511 148 529 159 0 234 132 275 277 0 322 130 359 189 +3029 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275496.jpg 427 640 1 202 482 235 519 0 322 473 376 630 0 244 493 269 557 0 67 468 106 555 0 259 480 288 564 36 74 553 109 578 1 313 505 335 536 1 402 489 426 548 1 193 485 208 513 36 266 525 280 565 +3030 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315564.jpg 640 427 1 454 216 609 402 0 417 78 589 332 0 173 93 201 171 0 138 89 172 173 0 113 86 140 171 0 82 90 104 158 0 325 67 348 103 0 360 86 385 109 0 428 59 453 113 0 446 66 459 82 0 550 54 572 82 0 248 79 268 107 0 56 103 73 158 26 148 104 169 139 1 2 147 19 184 1 597 89 639 151 36 367 185 589 269 0 623 45 638 81 1 24 126 37 141 0 7 69 532 136 +3031 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455675.jpg 640 604 1 253 351 460 603 1 67 309 132 488 1 0 376 95 547 0 266 242 441 531 0 440 264 476 358 0 488 253 560 354 37 78 172 326 313 24 367 298 456 432 0 206 162 227 205 0 0 158 71 383 0 206 238 248 347 +3032 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039961.jpg 640 424 2 0 158 60 266 2 330 110 361 127 2 12 113 38 125 3 388 152 463 226 2 290 105 339 123 2 213 107 248 126 3 282 144 313 196 3 67 142 178 262 3 164 182 182 235 9 144 43 167 78 36 204 333 291 370 24 447 145 483 203 26 527 132 572 226 0 338 99 388 262 0 448 97 545 283 0 495 104 602 301 0 130 85 271 352 7 104 105 136 121 7 0 155 61 269 0 289 110 301 143 0 375 106 388 127 0 77 139 158 234 0 248 130 277 206 0 135 110 144 140 0 151 111 162 155 0 289 126 338 197 2 132 108 156 121 2 244 109 290 134 2 81 112 117 130 2 161 109 178 116 2 39 109 57 119 2 282 114 342 143 3 284 191 326 252 26 477 140 521 198 26 125 122 130 125 26 379 119 388 126 0 573 103 585 136 9 224 51 239 78 0 391 104 399 126 2 15 106 36 112 0 119 92 608 157 2 56 100 79 123 +3033 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146837.jpg 425 640 3 2 292 103 352 0 58 171 349 427 36 183 422 237 476 +3034 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324872.jpg 640 432 6 0 39 610 179 0 39 0 202 292 36 51 168 230 303 +3035 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391862.jpg 640 480 8 60 70 122 132 8 0 79 47 130 0 175 39 316 449 36 174 432 259 478 8 601 117 606 135 0 592 114 639 404 +3036 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062198.jpg 640 425 0 57 143 193 314 37 153 285 229 339 +3037 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010613.jpg 640 427 0 48 174 166 375 0 79 222 377 421 0 261 93 358 350 0 358 0 530 421 0 431 2 639 426 0 132 24 529 363 1 351 166 397 242 54 550 241 612 282 0 3 275 79 420 2 376 127 399 174 54 324 295 351 323 54 128 249 147 264 0 344 110 361 212 0 333 102 353 170 +3038 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000264819.jpg 480 640 0 241 360 369 506 31 286 366 419 632 0 55 275 59 282 0 33 289 71 300 13 36 243 89 302 +3039 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562557.jpg 640 480 0 63 42 147 206 0 242 74 345 409 0 336 123 398 435 0 439 145 542 462 37 417 255 472 449 37 330 195 435 344 37 194 156 390 247 37 43 186 145 390 24 224 117 313 233 24 301 171 352 268 24 30 118 71 211 +3040 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549063.jpg 640 480 0 277 233 427 363 0 197 252 218 281 0 110 229 130 251 0 123 233 139 251 0 218 255 225 264 33 375 123 385 134 37 108 297 333 322 37 207 315 515 358 24 56 309 168 346 0 224 241 227 244 0 217 275 235 285 0 88 206 105 248 0 209 252 218 262 2 73 233 92 245 +3041 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403087.jpg 640 285 0 121 163 278 258 0 299 38 326 114 0 182 33 210 114 0 73 53 89 105 0 202 23 235 117 0 397 66 414 105 0 510 62 521 103 36 183 230 290 258 0 55 52 71 104 0 388 70 395 91 0 322 68 332 99 0 526 63 539 104 0 436 74 444 96 26 214 40 231 81 1 386 79 424 105 0 341 66 352 96 0 332 68 612 101 +3042 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025807.jpg 640 426 0 169 148 201 219 37 157 205 215 225 45 0 319 185 408 41 212 266 325 358 +3043 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198223.jpg 640 480 0 213 124 318 408 0 88 59 188 422 0 309 264 374 417 0 404 127 426 154 32 434 374 443 381 37 397 129 421 150 0 539 157 545 161 +3044 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272718.jpg 640 454 0 206 247 252 300 37 189 287 226 308 +3045 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433845.jpg 640 480 0 140 80 248 271 37 134 258 235 295 +3046 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522622.jpg 640 427 25 344 126 431 214 25 98 97 239 157 32 300 211 326 237 0 367 174 465 368 0 435 162 482 322 0 387 99 476 221 0 200 148 240 300 0 84 95 212 385 0 273 153 357 331 0 89 159 108 187 0 79 222 108 347 0 536 30 601 103 0 468 136 550 421 +3047 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516893.jpg 500 334 25 38 7 164 39 32 203 253 235 285 0 2 75 27 128 0 250 41 268 66 0 312 30 335 63 0 215 177 367 280 0 421 107 499 333 0 451 47 477 90 0 33 50 55 93 0 103 44 253 292 0 347 42 389 109 0 275 55 304 103 39 381 270 394 293 0 371 28 399 81 39 368 269 381 292 0 271 65 379 283 0 186 41 203 71 0 10 26 498 136 +3048 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281601.jpg 640 480 25 422 0 637 116 56 2 187 138 350 56 20 148 91 197 56 67 128 143 172 56 37 118 79 147 60 0 280 639 473 0 110 10 597 336 0 419 75 466 148 0 208 76 251 107 0 20 64 75 125 41 125 301 189 395 45 469 364 561 430 45 212 420 482 472 45 208 323 287 363 45 62 310 127 360 45 152 182 183 199 45 97 164 119 180 44 76 304 104 334 45 175 134 188 141 45 187 135 196 141 54 199 403 246 446 56 0 114 41 195 56 153 119 202 140 56 229 141 279 166 56 81 110 100 128 56 188 113 208 137 60 48 133 215 170 54 231 378 279 417 54 182 365 231 414 54 244 412 294 440 56 235 119 273 147 60 39 168 182 207 60 23 99 49 114 41 97 164 119 178 41 129 181 153 199 44 466 231 523 357 41 489 299 552 376 44 542 369 588 455 56 152 109 178 121 56 161 104 185 115 41 112 161 132 178 41 582 281 639 385 +3049 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205251.jpg 640 480 25 16 194 133 281 37 373 354 393 362 0 201 238 243 356 25 616 239 639 273 37 190 221 212 267 37 115 307 146 364 37 156 230 166 253 37 216 206 229 235 0 535 242 574 364 0 229 178 253 257 0 177 178 203 237 0 13 197 135 435 0 346 289 412 361 0 196 175 229 235 0 141 178 166 278 0 127 177 159 282 0 83 194 116 347 37 364 327 392 354 +3050 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564366.jpg 427 640 58 267 250 293 301 58 55 255 66 287 36 146 446 314 487 0 6 114 282 464 +3051 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466456.jpg 480 640 27 187 171 225 237 0 136 2 373 535 0 1 87 343 632 43 330 505 386 535 40 417 390 446 473 55 339 465 479 639 60 296 567 373 639 0 351 113 469 518 +3052 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109092.jpg 500 400 27 409 181 460 345 0 123 0 499 394 52 119 258 193 317 0 196 37 372 244 58 1 140 148 399 +3053 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102848.jpg 640 427 27 107 90 133 151 27 514 75 538 168 24 141 57 198 138 24 502 59 555 123 24 58 109 78 164 0 287 0 496 427 0 147 16 251 301 0 84 49 155 260 0 70 69 111 246 0 485 23 566 297 0 172 23 251 241 0 549 22 569 73 0 20 101 52 208 0 52 103 75 212 0 0 70 40 246 0 145 140 172 213 13 257 192 289 217 13 267 174 306 221 27 0 121 12 176 36 129 289 234 324 36 202 237 241 250 36 482 289 586 317 36 487 270 579 295 36 87 253 158 271 36 60 239 110 252 36 191 276 237 295 36 90 252 134 260 36 419 215 506 426 36 50 211 72 218 0 287 156 297 193 27 83 104 101 147 0 38 150 53 197 36 20 189 153 228 0 51 130 639 206 +3054 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176288.jpg 640 425 32 396 128 426 157 0 216 77 382 287 +3055 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226579.jpg 640 427 32 429 187 461 219 0 214 0 444 357 0 393 27 445 223 0 0 0 51 151 0 157 73 375 347 +3056 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493132.jpg 640 424 32 228 229 267 268 0 331 208 583 354 0 38 93 166 355 +3057 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196453.jpg 640 384 32 470 283 500 316 0 452 144 543 299 0 433 146 492 301 13 290 204 305 208 +3058 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558955.jpg 640 388 32 13 61 371 379 +3059 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216198.jpg 640 425 32 137 345 186 395 0 290 32 569 400 0 31 35 362 357 +3060 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089027.jpg 640 447 32 336 305 365 334 2 276 126 334 158 0 334 97 463 353 0 239 157 309 317 0 283 138 312 252 0 131 150 237 368 0 8 147 90 330 0 0 126 46 270 0 559 85 639 368 0 44 122 51 137 0 235 113 256 162 0 259 114 274 161 0 462 115 513 270 +3061 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333014.jpg 612 612 32 114 265 132 282 0 182 200 247 291 0 463 164 527 328 0 519 160 553 322 0 353 190 413 279 2 23 210 35 226 0 44 217 54 227 0 416 221 421 235 2 135 211 155 225 2 64 212 93 225 2 94 215 112 226 2 271 214 290 227 2 180 215 200 225 2 312 214 336 222 2 44 216 67 227 2 115 214 133 226 2 161 216 183 226 2 352 213 360 221 +3062 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233042.jpg 640 351 32 477 256 506 287 13 289 172 501 221 0 178 85 311 311 0 532 78 629 294 0 78 7 296 342 0 452 138 482 172 0 301 133 381 264 0 405 140 429 172 0 19 144 88 277 0 51 145 107 278 39 456 194 463 212 41 507 153 517 172 0 44 8 92 90 0 436 74 483 161 0 307 107 344 166 0 170 32 208 141 39 499 154 504 170 0 217 46 249 98 0 1 0 513 283 +3063 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452218.jpg 640 425 32 192 331 236 373 0 226 94 419 385 0 77 97 294 363 0 217 52 284 127 0 301 87 335 156 0 491 68 531 158 0 416 67 605 372 +3064 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195851.jpg 640 462 32 356 170 421 232 0 228 62 431 461 0 398 34 639 454 0 49 0 329 462 0 150 94 310 441 0 438 162 473 291 0 405 156 447 291 0 379 155 394 170 0 19 80 57 124 0 41 39 69 69 0 239 203 320 255 0 14 154 48 197 0 73 32 107 79 0 398 157 418 186 0 0 1 530 294 +3065 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521943.jpg 640 468 32 285 183 308 204 32 518 334 535 349 32 451 295 460 301 2 112 224 139 244 34 243 133 333 195 7 38 206 113 266 7 111 222 139 244 0 328 147 488 441 2 466 182 639 295 8 263 202 364 234 +3066 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568132.jpg 640 480 32 154 162 204 219 0 212 84 449 474 35 398 277 449 342 35 44 461 77 479 0 0 306 72 479 +3067 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425324.jpg 640 480 32 425 339 478 391 2 379 77 402 83 0 47 79 243 391 2 407 78 412 82 0 551 102 559 111 0 278 82 287 106 0 567 100 574 112 2 296 80 317 89 0 329 87 337 101 2 491 72 511 86 +3068 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560662.jpg 480 640 32 334 225 388 280 0 208 163 333 520 0 84 339 194 503 0 21 133 341 522 0 286 240 479 639 0 0 76 148 424 0 0 62 64 357 0 178 331 281 508 0 161 106 247 193 0 233 48 294 134 0 227 87 300 172 27 192 152 202 177 27 376 206 384 236 0 317 325 377 483 0 326 147 435 248 0 413 110 474 247 0 1 0 479 351 +3069 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292990.jpg 640 390 32 432 93 441 99 34 97 85 190 130 35 432 172 442 183 35 550 168 569 181 0 68 99 180 375 0 527 127 595 229 0 287 127 295 145 0 414 133 456 197 0 491 126 498 146 0 485 127 492 146 0 464 125 470 146 0 434 122 442 145 0 377 127 384 146 0 275 124 287 145 0 456 128 462 146 +3070 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234779.jpg 640 427 48 237 135 582 383 48 87 85 284 230 +3071 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471394.jpg 640 480 48 315 314 599 473 41 37 68 160 330 45 134 319 321 473 42 352 65 361 95 43 354 45 359 57 43 435 42 455 95 60 0 279 639 479 60 559 239 639 321 +3072 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467726.jpg 640 480 48 337 175 486 319 60 1 0 639 474 41 370 3 526 166 42 9 182 189 451 +3073 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343458.jpg 480 640 48 1 101 459 607 0 2 0 347 216 +3074 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376233.jpg 640 427 48 275 244 387 358 56 614 285 636 405 0 7 98 136 419 0 101 0 500 426 56 444 200 506 275 0 449 140 631 426 56 11 282 52 426 58 2 15 71 174 60 451 199 505 274 +3075 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256945.jpg 640 455 48 267 78 498 278 48 112 61 288 234 42 248 266 614 410 60 3 1 639 448 +3076 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554100.jpg 640 426 48 170 123 378 386 48 58 39 228 249 0 0 16 141 132 60 4 24 639 420 0 0 254 44 419 52 338 89 452 164 52 308 6 418 79 52 447 247 532 333 52 559 237 639 335 +3077 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416885.jpg 500 375 48 259 259 499 353 40 64 0 183 322 40 38 15 91 214 42 371 201 499 254 43 0 219 27 267 44 391 201 499 244 2 173 0 499 158 54 180 134 279 215 43 358 217 499 266 60 2 108 499 369 +3078 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353411.jpg 640 480 48 329 128 613 332 0 445 137 639 443 44 348 72 386 120 41 1 94 188 360 41 127 34 285 237 45 572 105 639 149 56 70 0 364 78 60 2 53 638 479 50 297 84 334 125 50 284 51 333 86 41 574 106 639 150 +3079 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325027.jpg 640 427 48 52 45 593 416 0 49 0 426 168 +3080 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000519271.jpg 640 480 48 324 167 521 350 41 0 1 69 215 41 46 0 108 109 42 544 146 631 427 43 565 137 639 394 43 116 1 141 90 45 450 32 585 146 45 211 5 472 136 39 44 3 111 111 42 140 8 169 55 50 189 244 275 299 50 145 218 208 263 50 319 293 360 326 48 293 16 396 112 48 456 0 596 42 60 0 0 640 472 +3081 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310545.jpg 640 427 48 474 308 639 421 0 4 9 471 394 +3082 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561357.jpg 640 512 48 1 97 397 397 52 396 134 638 392 +3083 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009156.jpg 640 480 48 49 282 325 422 41 430 3 595 187 42 400 217 529 468 60 0 3 640 473 +3084 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450355.jpg 426 640 48 187 455 318 550 0 20 8 425 542 42 251 422 362 482 44 36 465 85 499 45 177 526 303 632 41 1 472 91 584 48 295 534 425 625 41 188 538 299 639 +3085 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015883.jpg 427 640 48 161 443 281 513 0 0 3 298 551 0 2 26 76 191 0 0 451 88 639 42 274 453 293 553 43 173 567 238 639 0 269 168 426 471 48 267 557 334 636 0 326 5 426 637 42 276 371 298 449 +3086 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365103.jpg 612 612 48 41 171 611 558 45 170 82 611 259 49 0 132 199 412 71 0 68 237 209 +3087 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528643.jpg 639 640 48 155 173 494 499 60 0 6 636 631 +3088 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311303.jpg 640 427 48 99 146 281 268 56 546 0 631 91 60 0 54 639 426 41 353 55 622 408 43 0 201 62 225 0 0 0 245 66 56 523 0 543 68 48 91 94 215 180 +3089 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132272.jpg 640 480 48 368 392 459 450 0 154 42 500 418 40 219 169 282 299 41 166 332 244 475 41 556 399 639 470 45 501 449 637 479 60 39 391 639 479 48 319 396 412 457 +3090 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239145.jpg 500 377 48 0 26 201 168 45 335 7 476 128 52 76 231 432 370 +3091 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000456143.jpg 640 361 48 301 123 603 320 45 13 214 241 304 53 1 38 406 201 51 57 142 72 222 51 70 143 173 219 51 158 183 212 220 51 10 194 57 280 51 449 264 495 300 +3092 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022492.jpg 480 640 48 112 75 479 604 0 45 38 176 198 41 119 78 258 239 41 307 5 430 82 41 43 168 88 222 0 68 71 101 128 +3093 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392753.jpg 640 480 48 236 112 499 319 42 453 147 638 230 45 1 87 210 295 +3094 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449522.jpg 640 427 48 250 266 349 346 48 217 291 284 358 48 438 357 539 426 0 162 2 493 312 45 152 285 231 338 60 1 269 639 426 39 46 200 127 420 39 0 302 49 390 +3095 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279730.jpg 500 333 48 197 128 415 280 0 0 0 97 141 41 46 166 177 332 41 391 31 472 127 0 196 206 371 327 0 410 101 499 243 52 198 129 412 282 +3096 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577385.jpg 640 480 48 197 162 376 309 60 3 142 618 469 +3097 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545289.jpg 500 334 48 108 91 349 257 60 0 1 499 327 0 1 1 307 179 41 249 0 365 83 48 105 169 409 300 53 104 86 407 304 +3098 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121826.jpg 640 480 48 151 201 343 408 41 66 147 208 286 41 491 15 637 278 41 349 22 378 115 42 0 281 157 329 42 278 29 349 61 45 70 149 207 289 39 364 0 474 208 60 4 1 639 479 +3099 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045574.jpg 480 640 48 40 156 479 574 +3100 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045550.jpg 640 480 48 148 309 383 472 74 199 0 241 27 0 116 4 639 474 0 599 69 627 139 0 463 87 508 155 0 65 89 96 119 0 102 60 149 115 0 18 85 62 119 0 455 95 480 155 45 96 375 208 457 +3101 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161810.jpg 480 640 48 229 349 361 454 60 5 448 243 632 0 1 42 365 480 0 366 98 474 428 43 186 496 263 632 +3102 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208793.jpg 640 480 48 418 401 541 470 67 136 385 261 452 2 43 195 194 331 0 228 53 618 405 56 328 26 639 403 48 550 385 639 443 +3103 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488250.jpg 360 640 48 197 310 297 381 53 207 314 299 374 0 0 48 338 632 7 205 42 359 285 56 176 41 359 307 +3104 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509577.jpg 640 440 48 58 100 273 228 40 457 59 620 334 40 434 22 577 249 42 500 353 639 418 43 597 363 639 393 0 110 1 450 144 45 65 245 510 434 +3105 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105040.jpg 640 480 48 292 175 639 473 41 497 2 639 135 42 23 4 102 247 43 97 1 137 129 44 128 49 185 109 45 130 304 315 466 45 85 123 393 314 49 390 130 517 203 45 139 0 456 102 41 0 0 65 60 +3106 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159981.jpg 612 612 48 33 284 440 585 56 464 0 611 177 41 257 15 454 310 60 0 1 612 605 52 37 291 435 587 +3107 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569001.jpg 640 480 48 75 251 214 380 48 253 71 395 175 41 16 23 178 210 60 2 1 639 473 41 552 216 639 406 48 121 285 260 425 48 230 126 375 226 52 119 283 260 429 52 76 253 213 381 52 230 127 375 228 52 253 66 396 176 +3108 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430056.jpg 500 375 48 219 123 400 275 66 101 117 499 164 48 56 118 232 272 +3109 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029308.jpg 640 368 59 1 144 396 361 56 368 169 411 212 56 467 201 502 367 56 455 170 519 253 56 467 164 511 206 56 285 167 333 226 56 417 172 447 215 60 398 168 431 174 60 452 181 523 213 60 348 185 393 190 73 503 240 578 260 +3110 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452195.jpg 480 640 59 167 366 479 632 73 426 249 456 295 +3111 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150874.jpg 640 353 59 266 217 637 347 56 99 198 160 352 56 137 168 167 189 56 115 178 140 215 56 267 172 308 222 60 115 188 199 205 60 246 172 279 190 56 222 172 262 223 56 323 170 391 226 63 30 235 112 255 73 30 236 112 253 +3112 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064196.jpg 640 480 67 473 366 527 389 60 14 273 639 477 0 172 106 334 300 0 298 138 450 292 44 414 244 421 276 45 194 351 269 402 55 192 288 209 302 55 242 287 259 300 55 209 292 230 313 68 4 93 126 151 71 172 400 486 472 41 574 337 620 410 43 362 266 376 280 62 0 167 42 244 69 194 99 308 200 43 324 273 330 295 43 54 331 75 358 55 327 278 358 306 55 182 319 208 338 55 184 302 213 318 55 205 312 234 330 55 256 303 278 319 55 228 306 254 323 55 159 313 188 331 55 419 350 438 366 55 437 350 455 365 45 409 261 487 330 55 258 292 275 306 +3113 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236323.jpg 500 375 72 0 0 500 369 52 250 196 271 216 52 212 186 317 286 52 239 173 315 197 39 240 322 301 374 39 110 293 143 372 39 213 328 243 373 39 171 330 214 374 39 79 321 117 369 39 0 179 26 236 39 25 305 93 365 39 51 270 91 335 39 82 280 113 325 39 127 284 190 365 52 297 216 326 231 52 232 161 319 182 39 53 214 102 250 52 231 272 244 279 52 291 200 328 218 39 138 183 209 271 39 305 341 382 374 52 197 196 215 259 52 280 188 322 208 52 205 255 223 271 +3114 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521142.jpg 640 426 74 106 121 136 180 0 298 0 601 415 55 269 322 381 378 73 46 109 100 211 73 159 116 215 154 73 0 101 51 216 73 187 112 250 176 0 32 144 305 420 57 328 248 639 425 73 366 156 378 196 +3115 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003103.jpg 400 338 74 230 146 239 153 0 50 14 385 259 36 53 159 203 275 0 166 256 231 333 0 71 63 117 97 0 248 242 291 283 0 160 197 198 233 0 109 187 152 232 +3116 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165172.jpg 480 640 79 217 32 291 526 41 156 345 372 607 +3117 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385779.jpg 427 640 1 312 401 426 607 0 71 122 347 478 36 183 407 278 560 +3118 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369840.jpg 640 427 1 19 250 53 295 1 470 251 509 302 1 602 255 609 283 0 279 93 421 355 13 247 251 271 268 36 314 348 449 385 36 255 311 380 324 24 548 222 564 249 26 504 226 522 267 0 174 223 186 267 0 166 227 173 258 0 386 243 402 274 0 473 228 506 282 0 504 211 535 303 0 541 207 573 305 0 20 220 36 258 0 263 241 288 271 0 427 237 440 270 0 40 229 53 251 26 499 268 511 283 0 596 231 615 279 0 135 224 147 258 1 527 249 544 289 0 0 206 639 288 +3119 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157365.jpg 427 640 2 1 193 124 376 2 208 160 282 233 2 2 171 110 241 9 231 89 244 103 0 106 116 231 479 9 0 90 12 149 2 354 114 426 236 36 141 468 207 495 9 313 15 344 51 +3120 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573058.jpg 427 640 2 340 299 382 311 2 20 309 63 349 0 36 126 307 485 13 30 304 108 349 36 161 480 303 514 2 266 313 292 332 58 111 290 135 316 +3121 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106314.jpg 427 640 2 38 299 72 322 2 6 301 49 325 2 321 287 426 346 2 173 299 195 323 0 168 60 287 359 0 133 242 172 363 0 0 259 16 356 0 379 243 421 369 0 68 231 120 368 36 146 316 264 409 0 279 298 286 311 0 333 245 377 369 0 249 290 262 319 0 127 296 141 325 36 37 351 57 363 36 84 306 95 368 36 164 361 205 372 0 122 302 130 315 +3122 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186788.jpg 640 427 2 424 66 630 197 2 403 103 440 163 2 133 111 199 149 2 0 90 36 150 2 281 135 298 147 2 297 137 305 145 0 153 0 372 321 36 165 304 319 409 2 86 108 147 140 +3123 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117201.jpg 640 400 2 85 305 96 311 0 236 266 262 343 0 570 213 639 391 0 428 207 542 399 0 33 298 55 345 0 70 297 82 337 30 327 350 384 373 0 324 250 344 318 0 334 246 389 363 30 307 325 334 333 0 256 268 282 331 0 531 243 553 301 0 491 212 530 251 0 0 333 5 342 30 426 389 469 399 30 33 337 67 348 30 354 315 376 322 30 214 335 295 350 30 546 380 614 396 30 466 384 472 392 +3124 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145295.jpg 640 480 2 107 289 160 327 36 134 412 189 436 2 158 293 189 313 0 317 340 402 479 0 542 343 571 379 0 458 327 472 345 0 490 332 525 413 0 549 346 636 479 0 207 307 240 402 2 504 323 535 345 24 328 365 380 416 24 304 319 311 330 36 0 453 42 479 0 255 306 282 365 0 138 325 203 427 0 251 311 266 354 0 442 334 497 436 0 98 310 145 379 0 357 318 380 352 24 538 389 574 444 24 213 325 229 345 24 0 313 54 372 24 343 313 352 326 24 502 341 522 365 36 262 361 279 371 36 117 364 139 375 36 297 357 305 363 36 452 414 478 429 36 428 378 445 385 36 418 360 426 366 36 414 347 419 352 36 254 350 264 357 0 163 296 181 333 36 1 446 35 464 36 91 321 104 339 36 300 327 302 329 24 365 322 376 330 0 380 323 454 397 36 484 368 544 450 +3125 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046269.jpg 640 427 2 35 90 367 221 0 350 66 520 259 36 392 249 487 270 +3126 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576085.jpg 640 393 2 183 212 267 260 2 264 224 308 254 2 500 183 589 241 0 429 146 466 249 0 173 137 245 277 0 516 154 581 246 36 192 272 265 287 2 1 132 43 301 36 508 202 546 246 36 428 151 446 202 +3127 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569432.jpg 503 640 2 334 389 382 401 2 391 380 444 403 0 128 173 295 564 0 365 409 379 450 0 442 411 453 441 36 218 544 288 588 7 361 388 391 403 24 447 417 452 425 36 361 447 374 452 +3128 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417965.jpg 640 480 2 417 137 639 353 0 225 111 411 473 0 51 45 287 478 37 187 263 428 383 +3129 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546229.jpg 640 480 2 15 221 98 306 36 377 360 474 439 36 292 418 391 468 36 197 296 253 458 36 597 291 633 424 2 0 275 116 393 0 341 128 438 436 0 229 73 377 453 0 74 108 225 461 0 528 134 639 425 2 204 181 547 357 2 186 191 222 272 1 390 258 534 367 1 293 272 364 371 1 589 318 631 355 +3130 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210749.jpg 457 640 2 116 85 223 143 2 100 91 180 145 2 338 95 455 145 0 258 29 359 279 36 257 257 325 306 58 418 151 456 233 0 107 267 157 308 0 430 84 449 116 2 0 80 73 145 +3131 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522163.jpg 640 458 39 520 75 537 130 39 173 185 188 225 0 194 46 417 452 37 311 4 407 450 73 57 84 96 93 73 57 91 92 96 73 67 160 103 168 73 47 96 113 108 73 40 112 112 120 73 477 347 523 361 73 478 358 519 364 73 507 50 546 56 73 508 54 549 58 73 511 58 536 65 73 44 105 111 115 73 50 95 88 103 +3132 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127170.jpg 640 427 56 234 209 498 364 0 37 2 311 263 55 247 272 292 324 60 0 203 606 420 0 270 89 419 329 39 33 202 92 302 53 313 244 378 272 55 0 15 15 46 55 0 0 38 30 +3133 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037865.jpg 640 426 56 474 295 604 418 0 201 41 499 421 54 278 218 363 264 0 0 48 42 420 +3134 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187533.jpg 480 640 56 27 183 71 251 0 131 311 245 540 0 392 112 455 290 0 334 129 378 280 37 44 521 205 554 37 192 175 331 206 37 325 171 367 211 37 391 157 404 215 0 364 100 400 157 0 243 115 313 282 0 117 64 158 178 37 128 229 162 250 +3135 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236985.jpg 640 638 56 595 168 635 209 56 569 163 586 192 41 528 457 575 506 0 1 25 37 109 41 576 387 617 429 41 541 417 568 443 56 530 158 561 190 41 491 559 543 617 41 467 507 527 560 41 567 461 598 502 41 487 473 521 501 41 592 364 629 419 41 525 505 573 523 54 42 246 67 261 54 367 326 413 355 54 69 234 84 256 54 400 344 441 370 55 505 209 526 233 55 499 313 524 332 55 492 208 509 227 55 383 273 417 295 55 279 98 293 108 55 507 330 538 342 55 394 235 512 285 55 542 278 574 297 55 508 182 606 217 55 498 316 599 372 55 605 213 629 234 55 480 204 497 225 56 595 166 630 190 56 606 137 636 150 54 469 381 521 429 54 113 249 135 262 54 90 257 110 267 52 43 328 198 390 52 68 364 196 421 55 321 254 605 329 +3136 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469982.jpg 640 480 56 152 88 286 240 56 178 20 272 123 56 489 138 639 295 56 3 49 101 183 0 107 2 636 471 0 99 2 225 181 54 189 208 355 334 56 567 134 636 221 60 0 342 128 479 60 579 52 639 85 60 232 83 262 108 60 25 0 165 185 +3137 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570471.jpg 375 500 56 32 101 97 173 0 48 0 374 494 41 23 228 78 312 55 45 414 144 473 55 0 370 101 447 55 0 328 62 387 45 0 250 36 291 55 55 471 134 499 0 198 87 374 253 60 71 266 207 490 +3138 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379837.jpg 640 428 56 70 182 301 427 56 561 229 639 401 60 422 384 639 423 0 75 183 222 396 0 397 28 598 427 55 319 236 465 305 45 387 148 417 161 75 389 116 416 148 +3139 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553074.jpg 640 427 56 134 0 480 148 56 534 0 638 103 0 149 68 440 313 0 465 1 557 152 36 289 246 555 348 0 545 0 627 107 +3140 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000303590.jpg 375 500 56 280 86 374 184 0 0 2 375 353 0 45 2 91 109 52 131 295 320 477 0 0 1 60 102 0 78 0 105 69 0 96 0 118 70 60 1 214 374 489 +3141 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407259.jpg 640 457 56 419 374 551 456 56 127 314 186 383 56 34 291 85 359 56 274 336 347 446 0 15 37 145 346 0 148 102 250 393 0 277 15 639 450 43 290 418 300 434 45 186 386 260 427 45 92 358 193 405 0 222 115 258 163 0 614 98 639 178 0 219 13 452 449 0 132 116 172 321 0 273 119 283 131 55 180 428 303 456 56 0 210 36 286 +3142 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092939.jpg 424 640 56 0 301 44 404 56 369 265 395 286 0 20 113 281 564 40 406 486 423 530 55 207 499 374 626 0 403 228 423 402 40 186 604 239 639 41 186 605 239 639 56 351 265 370 284 56 0 328 26 408 43 91 530 145 608 43 266 478 274 494 56 394 264 408 274 0 179 126 393 518 +3143 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248235.jpg 640 480 56 352 238 410 479 0 10 93 394 472 55 72 375 240 472 60 1 266 363 474 +3144 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426795.jpg 640 480 56 377 306 578 472 0 57 19 469 473 +3145 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360730.jpg 500 375 56 453 242 499 359 60 385 266 418 281 0 372 143 493 366 0 470 90 499 351 0 0 29 404 374 0 364 153 425 238 60 369 357 499 374 +3146 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118788.jpg 640 428 60 0 0 639 410 41 419 129 595 324 41 244 0 363 162 41 522 0 639 124 44 558 258 626 364 56 0 0 84 201 0 141 0 189 12 42 435 0 485 51 48 292 106 461 299 48 93 101 252 281 +3147 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001667.jpg 424 640 60 0 374 170 621 0 397 135 423 399 42 121 316 245 416 0 110 160 423 637 55 73 374 84 388 55 188 444 353 630 75 28 353 45 399 0 1 194 48 351 0 13 202 177 385 13 4 538 171 616 44 126 317 245 414 55 91 375 114 388 +3148 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412464.jpg 640 426 60 2 3 637 420 41 307 7 486 206 50 329 164 366 186 40 388 73 486 206 42 125 139 319 165 44 328 0 390 138 45 504 168 639 304 56 125 0 201 128 56 193 2 282 133 56 280 0 310 134 44 328 1 390 139 48 143 215 374 361 48 161 150 311 231 56 193 3 282 132 +3149 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168353.jpg 426 640 60 1 565 292 631 0 179 83 399 562 0 1 9 266 574 55 273 337 395 447 55 231 431 419 548 0 307 69 424 238 27 138 157 169 278 0 391 63 424 206 43 266 402 282 429 +3150 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398604.jpg 640 447 60 0 83 640 441 52 125 158 314 344 40 442 18 619 275 45 59 114 454 439 +3151 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320832.jpg 640 427 60 40 70 632 369 42 363 209 639 271 43 433 62 633 214 0 546 29 639 260 39 0 43 65 413 41 414 0 479 120 39 317 0 390 115 39 2 0 94 245 +3152 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500965.jpg 333 500 60 1 331 326 490 0 0 51 267 421 0 205 107 329 339 0 296 203 332 328 42 96 302 160 367 42 259 315 332 375 55 111 355 228 455 +3153 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111878.jpg 426 640 60 1 132 265 630 45 43 261 424 629 50 123 305 333 439 50 293 525 380 583 50 176 392 247 453 50 328 351 413 419 50 283 468 329 533 +3154 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419848.jpg 640 480 60 1 1 638 474 40 8 1 102 143 42 162 59 227 127 44 357 0 465 36 45 221 0 401 110 52 220 158 562 360 52 130 124 281 234 +3155 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527535.jpg 640 427 60 0 36 639 418 0 0 0 187 104 41 276 0 351 94 46 341 272 404 325 55 112 64 559 356 55 1 141 84 261 60 296 325 637 420 0 587 0 639 45 +3156 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000429293.jpg 640 428 60 7 16 639 421 48 317 172 537 422 +3157 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134223.jpg 640 480 60 0 2 639 271 45 231 245 398 384 45 62 85 247 289 45 60 308 251 468 45 402 306 581 463 50 317 274 477 421 52 229 21 624 246 +3158 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197609.jpg 640 480 60 0 299 639 474 52 153 304 345 410 52 389 287 558 348 39 18 108 110 382 +3159 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442877.jpg 640 427 60 0 0 640 418 42 111 92 213 404 43 477 93 563 406 48 165 201 346 340 48 212 90 410 231 +3160 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301221.jpg 426 640 60 0 195 426 627 41 402 174 425 284 43 0 133 166 148 45 262 257 345 311 45 138 243 219 314 53 18 298 424 593 0 0 0 250 261 41 290 151 404 288 +3161 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262200.jpg 612 612 60 0 312 273 604 0 54 86 277 379 0 215 41 332 227 0 121 0 260 93 41 204 231 260 312 55 291 290 410 387 41 270 364 332 454 0 0 13 612 603 41 401 221 440 295 0 290 0 611 282 +3162 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140388.jpg 431 640 60 0 339 429 633 43 66 420 112 498 55 0 421 399 625 0 93 28 393 440 +3163 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044536.jpg 472 640 0 143 310 225 542 37 29 525 378 551 +3164 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450559.jpg 427 640 0 71 34 303 359 36 181 215 341 373 +3165 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082157.jpg 640 640 0 17 73 622 631 54 200 371 327 478 +3166 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350668.jpg 640 426 0 192 139 297 340 30 245 309 334 346 +3167 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387776.jpg 500 330 0 334 86 402 194 31 336 178 367 199 0 210 145 214 152 0 7 281 10 297 +3168 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296564.jpg 617 640 0 0 0 463 472 36 411 275 486 410 +3169 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318314.jpg 640 420 0 131 53 311 181 36 171 142 246 186 +3170 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189368.jpg 640 480 0 397 257 514 451 30 343 430 544 474 24 396 269 432 352 24 215 373 295 414 +3171 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524173.jpg 500 375 0 311 50 386 326 0 327 51 461 349 0 25 216 270 358 37 23 239 337 365 0 114 46 194 274 +3172 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161799.jpg 640 427 0 578 212 613 289 0 191 72 304 237 36 220 192 291 241 36 589 285 605 290 0 286 244 295 272 0 48 226 70 266 0 325 237 335 275 0 301 240 313 278 +3173 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076521.jpg 500 375 0 99 92 207 347 0 207 87 297 332 0 300 97 444 338 30 310 295 492 353 30 196 326 286 346 13 167 175 431 263 30 56 327 254 364 30 265 309 332 336 +3174 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412604.jpg 640 428 0 102 0 638 422 54 87 211 269 363 73 37 199 49 362 73 0 183 64 357 73 59 191 75 357 73 0 198 40 372 73 161 107 249 198 73 63 184 101 361 +3175 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380414.jpg 510 640 0 124 168 367 486 0 81 174 210 451 36 231 458 284 502 36 122 430 161 458 +3176 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204232.jpg 425 640 0 83 188 385 362 36 168 371 320 420 0 264 531 308 639 0 140 531 169 550 0 71 536 92 550 0 128 532 143 552 0 169 531 193 567 0 58 539 71 565 0 25 544 34 558 0 184 532 214 624 0 1 563 20 611 0 108 531 136 550 +3177 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446358.jpg 332 500 0 23 169 193 266 31 144 220 204 289 +3178 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336427.jpg 640 428 0 245 203 309 313 30 217 305 337 318 +3179 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000310196.jpg 640 427 0 317 200 341 243 31 319 231 327 245 +3180 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084463.jpg 500 333 0 8 2 498 327 40 40 120 200 332 40 183 113 294 332 40 281 160 403 286 +3181 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103747.jpg 640 427 0 309 98 418 275 30 303 261 473 286 +3182 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435598.jpg 480 640 0 145 78 346 400 54 246 409 363 518 41 40 145 76 178 41 8 117 41 160 41 42 177 78 183 41 10 166 39 175 41 114 238 146 276 54 240 364 344 432 69 341 289 476 351 41 44 190 77 194 41 44 194 76 208 41 12 174 42 179 41 10 162 39 168 54 339 394 425 449 41 43 183 77 187 +3183 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072281.jpg 427 640 0 94 15 353 501 36 95 436 363 541 +3184 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268987.jpg 640 511 0 256 201 379 399 37 270 220 410 270 +3185 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098599.jpg 428 640 0 139 0 281 102 36 257 61 307 114 +3186 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508119.jpg 640 367 0 191 78 390 296 30 91 259 304 303 +3187 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555456.jpg 640 427 0 277 179 351 303 0 425 150 447 197 0 179 153 186 166 0 136 162 152 204 30 239 297 395 311 30 118 200 163 206 30 437 196 447 197 +3188 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414661.jpg 429 640 0 93 216 231 527 0 219 127 341 379 0 91 320 108 340 0 74 321 94 376 36 73 507 198 539 36 227 341 311 391 0 84 199 242 348 +3189 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445602.jpg 640 480 0 359 313 435 447 0 38 263 45 279 30 330 436 480 447 0 68 264 75 279 0 198 233 202 241 0 216 233 220 241 0 217 227 220 233 +3190 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557785.jpg 480 640 0 103 31 329 582 30 124 549 312 631 +3191 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042661.jpg 426 640 0 83 144 403 572 31 187 537 354 610 0 327 251 336 275 0 289 234 296 249 0 344 249 349 260 +3192 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000001700.jpg 640 480 0 212 43 400 409 31 248 379 359 413 0 295 286 314 330 +3193 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348701.jpg 427 640 0 170 151 338 321 36 225 293 372 348 2 30 323 37 331 2 43 326 54 331 +3194 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143143.jpg 427 640 0 73 161 412 626 0 313 357 376 512 0 0 264 70 629 52 197 461 268 504 0 160 262 185 289 0 354 279 386 356 0 416 281 426 375 26 145 279 405 639 0 297 286 323 323 56 389 337 405 362 58 304 309 357 386 58 72 317 97 362 0 0 220 75 560 +3195 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045433.jpg 640 301 0 249 50 329 236 30 151 189 324 244 24 322 82 348 137 +3196 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188592.jpg 480 640 0 73 127 342 639 47 188 321 277 384 +3197 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000052314.jpg 640 427 0 188 3 530 417 0 433 198 530 422 0 147 144 178 283 0 82 152 99 214 36 322 239 411 426 0 32 136 98 278 0 132 205 155 284 36 67 262 94 279 +3198 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384348.jpg 640 480 0 272 168 338 332 0 2 175 22 224 30 306 319 385 339 +3199 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224222.jpg 640 426 0 259 74 327 186 0 444 187 506 260 0 32 188 103 250 37 230 164 304 194 +3200 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170015.jpg 375 500 0 211 160 309 499 54 172 313 185 323 54 184 308 193 318 54 198 310 212 322 54 208 305 220 316 54 203 192 220 202 54 215 184 232 199 54 107 189 120 198 54 96 193 110 201 54 299 254 323 268 54 189 318 201 328 54 181 194 198 202 54 206 185 213 192 0 39 172 124 336 54 190 188 201 195 0 1 178 45 236 54 94 165 374 376 +3201 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117014.jpg 640 426 0 170 127 319 243 31 209 99 265 283 +3202 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229553.jpg 640 488 0 58 55 504 385 36 161 362 543 426 +3203 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190841.jpg 640 427 0 338 49 460 190 36 347 182 445 203 +3204 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026690.jpg 427 640 0 244 164 382 314 0 161 444 215 500 0 254 497 297 538 0 327 548 373 639 0 367 564 409 639 36 217 249 255 292 0 287 515 324 544 0 82 400 115 462 0 217 470 250 539 0 34 297 104 449 72 271 539 312 587 0 196 489 221 535 0 0 346 47 420 0 228 515 259 559 0 103 433 135 472 0 252 523 276 567 +3205 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431472.jpg 640 480 0 109 283 454 471 52 97 110 548 403 +3206 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331403.jpg 426 640 0 130 167 244 522 24 135 192 199 315 30 57 490 383 546 +3207 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000520147.jpg 332 500 0 300 294 332 399 0 254 310 320 430 0 79 39 268 292 0 248 296 280 335 31 96 227 285 314 +3208 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286719.jpg 478 640 0 321 1 477 191 51 128 531 212 630 51 309 308 455 373 51 227 469 328 587 51 325 402 437 456 51 327 419 426 502 51 260 466 378 546 51 207 516 333 638 51 144 508 200 597 51 91 525 119 637 51 376 269 471 311 51 245 381 332 438 51 302 441 393 528 51 36 517 87 638 51 200 568 232 638 51 263 491 395 609 49 145 84 446 250 51 0 236 477 639 +3209 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478522.jpg 640 608 0 131 265 340 502 37 153 403 383 523 +3210 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281733.jpg 480 640 0 1 4 479 629 54 116 368 455 639 +3211 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260470.jpg 640 427 0 12 57 178 207 0 278 53 339 134 55 43 238 276 426 55 395 235 464 269 55 337 224 401 259 55 420 204 477 245 55 322 159 354 191 55 510 150 544 174 55 2 193 237 277 0 607 0 639 187 55 417 185 456 216 0 255 53 269 98 0 267 55 277 96 2 326 58 430 125 54 394 230 466 273 54 496 130 527 154 55 311 144 335 166 55 340 139 363 162 55 455 189 497 222 55 0 246 66 317 55 367 200 424 236 0 176 56 199 115 55 231 92 541 284 +3212 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405062.jpg 500 375 0 137 10 267 170 36 200 145 266 181 +3213 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162459.jpg 640 427 0 217 96 327 426 0 324 112 430 300 0 371 134 496 425 0 66 98 288 421 37 301 262 446 405 0 333 148 374 239 0 483 170 531 246 +3214 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094619.jpg 640 640 0 184 53 408 556 36 178 535 415 586 0 11 173 145 251 +3215 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124647.jpg 613 640 0 221 1 612 633 0 85 408 142 569 36 182 577 258 596 36 120 554 140 566 36 273 483 286 538 0 178 400 267 583 0 347 447 400 527 0 267 402 308 537 +3216 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241638.jpg 428 640 0 51 171 273 476 30 85 447 298 476 +3217 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005443.jpg 481 640 0 262 285 347 525 30 185 502 380 538 +3218 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380609.jpg 640 480 0 228 103 537 295 37 71 211 524 292 +3219 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051314.jpg 640 480 0 227 37 444 342 37 45 251 214 329 +3220 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226848.jpg 427 640 0 145 182 323 553 36 196 503 300 570 0 38 139 113 302 36 54 321 75 327 +3221 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122239.jpg 640 426 0 138 13 445 420 47 151 354 224 425 0 552 237 639 419 +3222 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200296.jpg 640 427 0 255 121 424 331 0 342 133 484 308 30 396 293 588 331 30 155 325 262 356 +3223 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058800.jpg 640 425 0 113 74 240 278 0 252 214 283 271 0 82 185 113 239 36 135 271 205 288 0 533 229 542 243 0 207 215 216 231 0 114 366 197 424 0 512 229 527 241 0 0 146 30 365 +3224 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490051.jpg 640 427 0 454 105 563 389 0 359 121 442 358 0 235 124 358 375 0 50 105 178 379 30 46 58 168 231 30 351 87 453 204 31 236 183 302 299 0 184 157 195 192 30 477 15 504 267 +3225 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529455.jpg 640 360 0 9 47 595 279 37 0 68 137 281 +3226 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572090.jpg 640 639 0 81 170 562 630 47 372 363 451 448 +3227 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151159.jpg 640 488 0 53 27 350 430 36 164 400 344 465 36 391 395 524 459 13 445 140 632 229 13 315 133 376 212 0 531 104 566 154 0 478 103 534 163 0 136 0 256 379 +3228 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348524.jpg 426 640 0 133 260 359 534 0 294 130 343 238 0 186 134 196 169 31 95 430 414 601 31 125 275 273 330 30 184 166 195 170 30 311 238 343 243 30 96 429 414 600 0 121 190 192 300 +3229 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117127.jpg 500 332 0 289 148 412 276 37 285 162 417 242 +3230 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493279.jpg 640 427 0 181 2 460 420 31 459 107 639 426 26 255 134 458 368 24 256 138 460 373 +3231 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321258.jpg 640 428 0 149 174 274 290 37 128 271 172 301 +3232 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212817.jpg 640 478 0 281 175 423 414 0 390 112 423 184 0 312 118 330 166 31 285 356 409 441 0 521 103 560 183 0 468 120 510 202 0 512 102 534 176 31 481 193 510 203 31 535 174 560 182 0 436 121 465 181 0 516 87 520 95 30 448 181 486 188 30 518 180 567 183 0 464 120 484 189 0 358 113 389 184 +3233 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359677.jpg 427 640 0 179 292 231 340 37 199 339 245 352 +3234 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496409.jpg 500 375 0 303 95 352 175 0 0 71 21 112 30 303 160 324 180 +3235 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320978.jpg 640 512 0 16 161 83 268 0 453 136 639 511 50 351 309 455 369 51 91 328 102 363 51 100 336 112 363 51 43 330 54 361 51 69 328 76 342 51 61 326 72 344 51 50 322 68 347 51 113 334 122 363 51 70 323 82 344 51 49 334 59 361 51 82 327 88 338 51 104 334 113 362 51 97 328 104 338 51 111 337 114 363 51 21 250 214 418 +3236 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452676.jpg 640 457 0 201 133 306 284 24 236 143 262 157 +3237 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177838.jpg 612 612 0 428 191 611 604 52 120 175 599 442 0 544 0 611 177 +3238 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367608.jpg 512 640 0 113 255 505 457 36 106 295 217 371 36 71 403 269 463 0 12 366 29 394 0 28 53 200 343 +3239 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156636.jpg 640 428 0 270 78 359 274 0 222 144 234 161 37 272 260 349 283 37 366 315 639 342 0 174 146 193 164 0 628 155 639 185 +3240 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097656.jpg 640 425 0 239 118 361 378 36 244 365 370 393 +3241 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063047.jpg 640 561 0 61 217 388 553 0 446 307 466 414 0 464 313 486 404 0 496 306 526 407 0 482 322 491 396 0 493 305 528 394 41 94 350 144 430 +3242 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557595.jpg 640 428 0 268 1 572 422 36 250 126 353 427 26 559 0 635 126 0 525 0 639 422 +3243 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529065.jpg 425 640 0 80 114 265 353 36 91 328 138 382 36 161 369 168 375 +3244 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376667.jpg 640 480 0 57 42 205 478 0 355 3 519 472 0 300 100 326 193 0 545 40 638 302 0 359 10 411 107 37 170 0 304 376 24 387 60 494 176 26 59 123 181 345 6 3 0 185 265 67 481 168 514 188 0 328 53 367 190 0 256 68 293 231 0 283 175 381 308 0 302 58 310 96 24 521 79 609 218 37 468 209 639 479 6 472 56 612 160 0 313 57 333 98 +3245 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241396.jpg 640 480 0 190 0 639 418 41 2 395 90 473 42 350 294 461 380 55 49 358 177 428 42 87 372 238 439 44 0 406 23 477 74 602 357 625 389 41 32 332 63 357 60 79 310 638 479 41 40 318 66 332 +3246 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455414.jpg 640 427 0 399 101 559 364 30 331 347 587 388 +3247 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524799.jpg 500 333 0 309 0 400 69 0 117 82 302 231 30 205 106 420 276 +3248 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504790.jpg 480 640 0 87 53 479 375 0 59 97 99 210 0 0 145 47 217 39 15 274 108 441 40 0 409 115 630 41 136 318 208 456 41 1 412 113 627 48 238 232 442 362 56 67 170 126 213 56 0 224 70 324 60 0 259 479 639 40 139 314 211 460 45 199 460 479 639 48 258 458 479 597 +3249 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504559.jpg 500 447 0 350 99 447 399 0 237 7 368 426 0 43 24 221 430 31 109 97 199 439 31 306 106 341 432 +3250 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418548.jpg 401 500 0 15 26 265 490 54 250 283 293 321 54 209 262 249 293 54 297 279 343 313 54 249 258 291 285 54 211 290 248 325 54 216 323 257 361 54 297 254 335 281 66 366 256 400 321 +3251 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501527.jpg 640 427 0 261 68 339 407 0 232 51 294 410 37 154 173 514 264 37 150 124 464 335 +3252 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452611.jpg 640 425 0 241 129 492 333 0 29 3 117 175 36 260 309 499 362 0 6 4 49 162 +3253 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554347.jpg 480 360 0 157 51 279 287 0 42 0 191 268 31 134 273 330 291 +3254 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315281.jpg 640 480 0 0 87 255 472 54 146 61 432 380 +3255 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564289.jpg 640 427 0 220 170 314 289 31 193 268 264 296 +3256 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000307873.jpg 429 640 0 134 90 370 344 36 176 301 291 356 0 342 230 364 323 +3257 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407443.jpg 426 640 0 27 72 352 488 36 23 463 216 506 0 361 313 392 377 +3258 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181745.jpg 500 333 0 180 100 274 197 37 138 178 252 207 +3259 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576566.jpg 469 640 0 141 17 329 438 36 119 312 290 475 36 135 521 201 576 36 129 553 202 627 +3260 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407948.jpg 640 426 0 400 197 429 227 0 574 252 638 337 37 572 272 628 316 37 168 293 200 308 0 167 263 224 342 37 402 203 412 220 +3261 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189067.jpg 640 636 0 198 55 308 312 36 197 282 314 304 +3262 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526040.jpg 640 405 0 277 146 479 291 31 217 191 442 229 +3263 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000099260.jpg 640 427 0 4 0 639 427 54 66 178 449 400 +3264 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208311.jpg 640 427 0 285 29 491 207 0 432 166 454 222 36 247 167 427 271 0 123 154 149 234 0 623 187 639 232 0 409 188 429 223 0 633 154 639 181 +3265 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554595.jpg 500 376 0 322 244 453 351 37 162 229 368 334 +3266 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525373.jpg 640 480 0 29 142 320 478 0 277 36 629 478 54 297 305 441 457 54 63 306 179 393 57 588 242 639 351 +3267 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161060.jpg 640 480 0 163 71 289 218 0 337 65 504 215 54 159 278 509 471 54 1 248 198 393 54 472 236 639 417 54 302 431 493 479 54 538 181 639 258 54 50 213 158 257 54 484 403 636 471 54 0 366 159 477 +3268 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540098.jpg 488 640 0 45 212 340 524 36 325 523 444 586 0 229 331 236 346 +3269 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312289.jpg 640 427 0 343 28 515 420 0 105 44 145 110 0 394 22 620 422 0 84 28 233 281 0 212 35 290 201 0 212 143 275 249 0 0 52 29 245 55 223 296 359 409 27 78 114 99 140 27 227 66 254 102 27 487 77 525 144 27 129 93 138 106 27 0 103 10 176 60 173 353 485 424 0 9 24 138 294 0 109 51 117 80 55 33 275 89 292 43 341 323 391 358 60 614 290 639 340 +3270 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036252.jpg 612 612 0 293 332 477 534 0 139 132 195 266 0 227 128 268 162 37 79 249 257 276 37 277 373 520 467 0 122 146 133 162 +3271 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000419379.jpg 427 640 0 143 4 269 133 54 41 156 181 260 54 86 323 202 421 54 179 116 321 206 54 19 122 137 201 +3272 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378652.jpg 640 425 0 347 113 474 178 37 298 61 420 221 +3273 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000109308.jpg 425 640 0 163 133 411 419 36 240 335 330 423 0 215 109 236 139 0 258 106 282 142 2 242 27 357 71 13 248 121 324 142 +3274 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032331.jpg 426 640 0 90 102 209 388 31 182 339 395 391 31 49 373 170 383 0 283 159 395 342 +3275 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469634.jpg 640 428 0 221 10 352 207 0 390 156 410 206 0 499 140 519 213 36 243 199 320 218 36 503 211 518 216 7 368 203 387 212 36 392 208 404 210 +3276 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136870.jpg 500 281 0 133 128 167 177 0 406 202 412 210 0 435 202 437 207 0 449 204 451 211 0 309 199 312 204 0 288 189 293 200 0 72 175 75 182 0 320 194 322 203 0 303 194 305 200 0 88 177 89 181 30 137 163 172 186 0 336 195 338 198 0 432 199 434 203 30 147 165 171 196 0 32 119 458 207 +3277 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478433.jpg 640 427 0 260 216 323 278 37 260 244 344 294 +3278 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373007.jpg 426 640 0 177 298 425 583 36 0 254 175 351 +3279 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131276.jpg 640 513 0 127 26 277 149 54 208 301 240 337 54 194 311 208 334 54 181 311 199 335 54 168 310 182 333 54 159 306 169 335 54 278 303 310 318 54 122 305 149 335 54 235 303 262 315 54 265 337 310 356 54 265 386 300 405 62 439 40 476 72 0 401 55 474 138 0 0 25 123 169 26 160 96 192 124 54 234 336 271 355 54 407 346 436 362 54 118 246 639 442 +3280 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541474.jpg 640 427 0 379 173 525 322 31 350 283 512 338 +3281 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538005.jpg 429 640 0 298 204 369 267 36 240 183 297 201 0 116 399 128 433 0 33 515 46 528 0 46 517 59 534 0 5 512 17 524 0 195 132 288 203 0 361 527 389 625 +3282 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517987.jpg 427 640 0 5 21 403 630 36 12 459 426 607 74 303 344 318 351 24 109 193 269 420 41 2 267 66 349 +3283 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375902.jpg 640 426 0 525 164 600 367 0 116 223 131 244 0 0 170 127 425 0 68 221 123 355 0 506 199 538 304 0 169 238 177 244 0 192 236 213 295 24 556 189 605 245 0 275 173 391 383 30 304 359 386 424 30 280 286 286 287 +3284 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014029.jpg 640 425 0 265 130 565 311 37 19 256 387 320 +3285 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343543.jpg 640 480 0 0 59 638 474 54 62 190 291 415 +3286 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090864.jpg 479 640 0 158 191 223 300 37 130 284 478 461 8 436 119 442 125 8 82 160 91 165 +3287 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475229.jpg 293 448 0 88 92 205 328 31 56 193 243 314 +3288 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146193.jpg 640 425 0 241 63 340 296 37 176 151 493 254 +3289 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288933.jpg 640 480 0 422 0 546 42 55 121 191 459 479 55 280 7 532 216 60 2 3 551 474 41 96 116 142 169 +3290 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064189.jpg 375 500 0 163 0 268 241 36 167 145 266 248 11 72 69 83 89 +3291 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039785.jpg 500 375 0 201 171 272 260 0 410 116 425 151 13 165 143 221 155 37 224 249 258 275 37 396 126 430 141 0 79 46 88 62 +3292 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566518.jpg 640 427 0 188 57 282 199 31 145 146 308 235 +3293 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207670.jpg 427 640 0 125 112 374 579 0 76 128 142 256 0 59 118 103 205 0 37 103 56 150 0 266 99 305 221 30 180 558 412 618 30 155 385 337 423 9 336 0 351 26 9 252 6 270 48 9 165 59 172 78 9 56 75 64 86 24 293 123 309 155 0 72 108 84 119 0 135 126 172 240 0 55 112 73 173 30 81 239 138 256 0 25 108 46 152 0 233 87 248 146 0 205 100 229 181 0 16 116 45 194 30 64 200 78 218 30 44 181 54 192 +3294 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134198.jpg 427 640 0 151 60 396 481 36 186 271 327 513 +3295 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543220.jpg 640 640 0 161 397 250 465 36 207 457 224 464 +3296 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284789.jpg 640 425 0 300 214 309 225 0 551 211 555 217 0 407 202 411 207 0 16 204 24 214 33 463 46 498 85 33 538 155 548 165 33 467 162 476 174 33 324 140 329 149 33 166 98 192 134 0 498 203 500 205 37 301 223 310 226 +3297 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067218.jpg 640 478 0 221 154 309 350 0 345 127 399 266 0 387 209 455 323 0 391 189 599 430 31 99 247 529 472 0 568 94 577 115 0 544 95 555 121 0 594 95 605 116 0 523 91 535 116 0 354 73 635 229 0 515 92 523 107 0 54 93 67 138 0 128 191 213 315 +3298 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115128.jpg 640 425 0 306 159 433 274 0 43 113 127 189 37 0 185 85 204 37 306 244 343 275 +3299 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313916.jpg 640 443 0 83 234 127 355 30 75 361 109 385 24 91 250 119 269 30 503 35 570 84 0 457 113 544 258 +3300 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507935.jpg 640 480 0 197 59 464 270 36 242 264 355 310 +3301 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046919.jpg 500 333 0 285 131 379 292 0 148 143 161 161 0 223 149 232 167 30 314 263 393 316 24 312 131 359 170 +3302 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402723.jpg 402 640 0 56 4 255 402 0 342 311 401 441 0 0 269 42 392 36 156 339 278 425 0 0 339 63 514 +3303 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505792.jpg 427 640 0 197 254 330 405 31 152 339 316 372 +3304 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259099.jpg 640 427 0 380 156 485 378 0 527 292 533 302 0 537 278 541 284 0 484 286 493 302 0 127 271 143 291 0 109 273 125 294 31 335 359 524 381 0 51 274 65 291 0 482 282 486 294 0 492 279 495 288 0 548 278 553 286 0 517 285 525 297 0 119 277 133 293 +3305 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276215.jpg 640 480 0 323 164 410 293 0 598 198 639 310 36 335 283 416 310 +3306 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322724.jpg 640 425 0 238 177 357 401 0 169 317 195 385 30 254 402 320 424 +3307 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302405.jpg 500 375 0 204 91 335 369 0 138 105 192 262 31 150 317 198 370 24 287 159 326 241 31 85 242 205 278 31 34 232 75 258 31 9 191 85 213 0 28 168 75 213 24 0 213 40 284 +3308 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036539.jpg 427 640 0 167 292 263 531 0 74 358 118 458 31 135 515 306 542 +3309 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132510.jpg 358 500 0 93 121 215 408 31 140 382 244 430 24 91 164 155 242 +3310 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121591.jpg 500 400 0 256 122 378 285 36 258 108 343 186 +3311 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233961.jpg 640 480 0 15 139 93 268 0 181 249 271 381 37 167 313 297 399 37 50 178 96 225 0 355 82 374 96 0 296 7 306 33 0 285 0 292 22 0 605 96 617 115 37 345 94 399 102 37 292 14 306 23 37 617 127 638 145 0 279 3 284 22 +3312 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039731.jpg 640 413 0 112 9 294 321 0 51 285 63 315 0 47 287 56 313 0 0 269 15 293 36 107 315 204 341 +3313 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512722.jpg 500 375 0 0 0 500 369 54 236 55 416 187 +3314 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388464.jpg 427 640 0 175 148 347 553 36 191 465 341 551 +3315 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185397.jpg 500 399 0 1 208 284 394 54 138 137 390 323 62 214 0 361 23 0 0 2 198 263 +3316 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000147101.jpg 640 427 0 138 3 370 355 0 479 0 538 83 0 2 16 179 160 36 285 302 360 383 36 14 153 105 173 36 548 145 639 163 13 89 127 157 137 13 369 108 574 120 13 415 82 558 94 13 454 60 545 71 13 509 30 554 63 26 523 21 552 40 0 557 0 639 152 0 537 0 634 84 0 167 0 238 168 0 45 43 114 169 1 171 74 221 129 +3317 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139294.jpg 431 640 0 78 293 280 601 31 59 557 304 609 0 282 112 347 198 +3318 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257870.jpg 500 375 0 119 60 361 374 52 217 168 228 188 52 228 166 242 183 52 265 271 315 336 +3319 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234766.jpg 640 427 0 71 239 88 269 36 264 183 325 209 0 87 239 106 277 0 239 67 398 198 +3320 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486232.jpg 612 612 0 121 2 611 607 47 283 265 435 490 47 293 109 533 330 +3321 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270544.jpg 640 480 0 258 30 411 343 0 355 111 456 321 0 460 235 593 316 37 0 299 586 360 0 0 114 153 363 0 83 198 235 331 +3322 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212080.jpg 640 425 0 47 73 357 419 0 277 71 476 416 0 1 73 122 211 0 469 13 637 419 0 294 47 597 355 41 206 314 264 391 0 347 71 433 180 0 0 120 112 311 0 327 162 363 189 +3323 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415393.jpg 640 425 0 231 6 517 376 36 387 343 568 382 0 306 38 368 163 0 29 187 124 322 0 24 192 48 231 0 159 130 198 250 +3324 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398438.jpg 500 333 0 213 0 500 222 43 160 187 226 225 55 0 1 180 312 +3325 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467477.jpg 640 356 0 222 143 324 265 37 219 247 292 283 +3326 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319073.jpg 640 427 0 230 71 556 326 37 379 299 556 401 +3327 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118740.jpg 640 282 0 400 145 438 210 37 361 206 409 215 37 410 200 463 214 +3328 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349622.jpg 429 640 0 148 87 271 239 36 237 174 279 249 0 11 329 44 385 0 0 331 16 383 +3329 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335328.jpg 512 640 0 336 221 491 330 0 51 330 215 427 37 122 380 181 433 +3330 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127514.jpg 335 500 0 155 24 334 459 36 164 443 305 486 +3331 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428248.jpg 526 640 0 139 132 323 416 36 177 406 327 435 +3332 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072368.jpg 640 480 0 284 3 541 392 36 297 338 511 462 +3333 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268400.jpg 500 340 0 99 3 304 238 36 143 212 314 279 +3334 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161781.jpg 640 428 0 260 20 465 363 30 144 335 501 382 +3335 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068205.jpg 500 500 0 84 142 362 363 36 167 315 336 381 +3336 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063804.jpg 400 300 0 176 9 399 299 54 234 124 303 163 63 0 120 220 295 +3337 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071301.jpg 500 333 0 389 109 431 205 0 236 98 281 192 0 362 32 400 112 0 192 65 219 156 0 333 226 407 328 0 275 237 338 328 0 246 27 276 101 31 405 197 426 215 0 469 23 499 110 0 294 58 329 111 30 404 190 446 215 30 253 172 273 196 0 199 246 273 328 0 457 46 477 110 30 354 33 402 111 0 327 40 360 112 0 218 36 233 75 0 141 40 499 332 +3338 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436696.jpg 426 640 0 156 22 353 617 0 102 234 149 412 36 221 334 285 597 +3339 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000165522.jpg 640 480 0 223 13 294 182 37 157 57 378 113 37 292 56 417 104 0 278 6 301 59 0 413 214 492 462 +3340 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054527.jpg 640 427 0 98 45 515 421 36 110 3 508 111 +3341 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528314.jpg 423 640 0 238 419 344 572 0 346 150 371 222 0 156 184 182 244 0 120 181 142 253 0 98 186 122 254 0 63 189 83 236 0 51 165 71 193 0 212 148 235 169 0 24 183 52 238 30 219 450 259 568 +3342 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042837.jpg 500 500 0 218 136 296 277 37 135 268 364 303 +3343 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258023.jpg 640 480 0 281 204 321 297 0 102 94 219 343 0 258 140 269 168 0 233 161 254 206 30 37 297 251 371 30 273 286 334 303 0 280 153 304 208 30 224 202 271 208 +3344 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143479.jpg 480 640 0 50 58 375 639 52 108 516 197 567 52 116 496 190 538 52 189 523 280 562 52 232 454 288 528 52 224 436 309 480 52 180 408 256 454 52 168 482 228 526 52 147 450 236 493 52 122 485 177 514 56 324 191 466 465 0 317 471 479 639 52 183 477 248 522 +3345 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113173.jpg 500 281 0 61 0 298 275 0 29 219 64 279 0 81 228 109 280 +3346 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326128.jpg 480 640 0 239 184 367 592 31 106 548 455 600 24 268 247 389 425 +3347 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072737.jpg 480 640 0 323 287 362 329 36 86 276 191 369 0 108 73 261 287 36 347 292 362 327 +3348 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248276.jpg 480 640 0 0 53 480 638 54 1 171 478 608 +3349 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448998.jpg 426 640 0 67 105 315 463 36 120 431 338 484 +3350 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045627.jpg 480 640 0 35 220 453 552 37 0 482 257 586 +3351 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218947.jpg 640 640 0 255 206 367 403 0 503 207 517 245 24 270 230 329 298 24 505 210 515 222 30 178 381 444 421 +3352 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040681.jpg 640 480 0 234 148 297 295 0 362 161 373 188 0 437 158 445 180 0 467 154 472 169 0 536 175 542 188 30 220 269 342 309 24 235 172 250 207 0 357 142 361 154 0 365 141 366 145 30 434 175 448 180 0 377 140 378 144 30 465 168 477 170 30 360 187 373 189 +3353 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578427.jpg 480 640 0 109 96 365 612 30 204 599 296 639 +3354 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224693.jpg 640 427 0 86 39 308 376 0 392 53 548 374 32 280 225 338 283 +3355 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241889.jpg 640 426 0 263 40 375 232 30 222 188 397 251 +3356 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114055.jpg 457 640 0 48 267 81 347 0 0 270 21 338 36 201 350 301 501 36 102 449 127 462 0 86 272 117 333 0 8 70 357 366 0 83 312 138 456 0 150 274 185 320 +3357 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440062.jpg 500 333 0 228 161 350 320 0 368 178 387 208 2 215 129 219 131 2 222 111 230 117 2 232 115 239 121 2 235 116 244 122 2 235 128 238 130 30 200 295 295 326 +3358 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000334483.jpg 480 640 0 95 138 243 337 0 237 94 390 355 0 39 420 209 599 55 324 368 464 455 55 236 500 274 539 55 365 513 441 571 55 254 599 333 639 55 248 366 305 389 55 361 337 406 384 0 0 420 68 639 0 438 186 479 309 43 338 351 362 371 55 195 495 238 537 0 0 88 234 424 0 37 500 236 639 0 265 78 327 156 26 16 367 189 532 55 426 590 479 634 55 372 575 473 635 42 276 403 311 416 +3359 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254164.jpg 639 640 0 266 268 393 611 +3360 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000436203.jpg 640 426 0 308 130 376 254 0 198 159 233 216 31 181 211 234 221 30 198 211 219 217 30 316 250 375 263 +3361 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243699.jpg 640 480 0 284 147 329 331 37 255 173 374 275 +3362 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441496.jpg 375 500 0 260 306 279 337 8 179 329 374 347 8 3 269 110 284 8 248 186 281 190 8 80 177 89 189 0 307 228 331 235 0 269 214 288 220 0 44 261 64 277 0 207 219 220 222 0 357 215 374 221 0 186 217 202 223 0 153 214 156 217 0 159 212 162 215 0 117 212 124 215 0 87 217 112 221 37 302 232 338 235 +3363 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463913.jpg 640 360 0 0 0 372 191 48 203 66 475 350 39 82 126 146 151 +3364 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100245.jpg 640 480 0 372 376 383 401 0 402 382 407 395 0 239 362 247 379 0 215 434 230 451 0 177 432 189 452 0 81 456 103 479 0 157 377 166 396 0 226 447 244 479 0 179 418 193 448 30 32 411 44 413 31 205 450 233 457 31 166 451 193 460 0 409 331 415 344 0 275 352 283 365 30 366 398 385 399 30 335 344 342 346 30 278 365 284 367 0 190 418 207 443 0 329 325 333 334 31 164 380 172 381 31 398 395 411 399 0 1 195 436 479 +3365 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226588.jpg 640 425 0 255 89 417 348 0 160 3 196 62 30 235 325 457 371 31 150 56 203 68 +3366 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407650.jpg 640 428 0 284 211 358 293 31 267 277 363 302 +3367 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158583.jpg 640 425 0 248 115 417 248 0 135 153 227 301 0 100 111 180 232 0 485 314 639 419 36 262 202 341 292 0 422 360 437 384 0 240 231 277 301 +3368 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408208.jpg 640 617 0 3 169 53 334 0 262 227 312 322 0 27 351 81 545 30 438 73 557 161 30 169 310 338 333 0 485 108 571 224 24 79 492 146 540 24 194 380 268 515 +3369 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157352.jpg 429 640 0 408 209 428 289 0 65 185 115 217 36 179 232 254 260 0 184 74 337 251 0 334 200 407 287 +3370 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347848.jpg 441 640 0 76 15 407 483 36 153 376 295 484 +3371 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212739.jpg 640 480 0 120 198 158 296 0 213 186 316 421 0 157 248 183 300 36 207 367 316 403 0 177 252 228 345 +3372 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527447.jpg 480 640 0 323 521 363 575 0 355 509 395 582 0 260 466 271 487 24 372 518 389 546 24 338 535 351 558 30 275 463 279 465 0 272 447 281 464 +3373 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256771.jpg 480 640 0 239 1 477 632 43 76 269 252 383 55 26 370 180 512 60 2 464 305 632 45 26 575 187 638 +3374 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501122.jpg 640 427 0 196 17 435 420 37 55 277 349 411 +3375 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183843.jpg 640 427 0 13 46 167 354 31 37 294 190 372 +3376 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442387.jpg 640 427 0 166 3 346 224 0 9 126 157 421 0 546 111 639 343 0 60 263 251 426 39 537 285 579 394 45 394 403 469 426 60 143 213 556 426 0 0 1 341 300 55 315 185 480 306 +3377 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517619.jpg 640 427 0 301 203 334 263 0 85 206 91 227 0 103 206 115 224 0 431 178 445 204 0 168 195 174 210 31 299 256 324 265 0 438 177 441 184 0 568 224 639 426 0 504 163 514 176 31 168 208 173 210 31 433 199 445 205 0 0 213 101 426 +3378 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019129.jpg 640 406 0 320 113 509 351 37 40 209 551 289 0 133 95 300 297 +3379 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486803.jpg 640 418 0 215 161 316 252 0 517 326 568 411 31 223 233 349 263 +3380 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517737.jpg 500 375 0 177 33 318 296 0 226 114 299 309 30 225 295 280 304 30 156 282 314 310 +3381 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047226.jpg 640 480 0 40 56 208 399 0 78 19 123 140 0 8 38 74 208 +3382 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000357279.jpg 640 360 0 167 16 456 290 0 99 166 176 354 31 176 251 486 298 0 321 328 348 359 0 17 156 97 314 0 287 317 309 359 0 355 336 371 359 +3383 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281377.jpg 500 335 0 293 0 499 331 37 194 147 499 330 +3384 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497907.jpg 424 640 0 187 304 201 329 0 374 302 379 311 31 55 344 188 364 31 190 323 202 330 0 83 193 187 362 +3385 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506569.jpg 500 333 0 145 29 260 293 30 87 280 340 314 +3386 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376751.jpg 640 480 0 127 282 173 354 30 113 369 135 382 30 127 345 151 355 0 89 288 140 377 +3387 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434657.jpg 640 427 0 256 227 278 245 37 84 224 159 259 37 126 274 289 311 0 261 32 426 282 +3388 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343753.jpg 480 640 0 165 348 215 444 36 159 410 208 452 0 235 295 246 333 0 167 285 179 323 0 215 311 237 336 0 202 311 216 335 0 180 307 201 335 0 340 294 373 351 0 413 293 427 324 0 128 338 175 408 0 137 316 161 352 0 160 318 188 339 +3389 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098283.jpg 500 375 0 57 1 246 334 36 70 279 287 366 +3390 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326462.jpg 612 612 0 22 398 399 588 54 96 126 427 443 +3391 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031542.jpg 640 322 0 160 45 446 253 30 35 0 594 241 +3392 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391365.jpg 480 640 13 128 402 340 451 36 172 431 265 494 0 265 366 292 450 0 88 91 304 443 +3393 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536517.jpg 640 427 21 85 0 639 325 55 75 242 476 392 47 216 325 242 370 47 316 290 360 330 47 126 296 164 320 +3394 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387655.jpg 640 406 30 245 228 335 264 0 247 98 328 250 +3395 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477172.jpg 640 402 30 278 177 433 223 0 282 61 421 216 +3396 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086755.jpg 640 480 30 300 309 413 326 30 303 289 359 307 24 354 230 376 260 0 324 220 394 326 0 331 203 366 301 +3397 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256145.jpg 640 462 30 364 347 433 375 30 157 342 251 428 30 0 95 124 251 0 44 132 150 368 0 141 137 210 349 0 191 168 253 353 0 239 171 295 354 0 286 161 335 349 0 314 165 385 359 0 372 172 416 348 0 230 68 278 170 0 398 146 432 227 0 486 151 568 348 0 287 91 337 170 30 471 203 500 348 30 563 302 610 339 0 430 170 483 337 30 542 269 606 292 0 337 99 396 178 30 313 355 352 380 0 167 89 231 171 +3398 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328374.jpg 640 480 30 461 155 639 182 0 132 4 196 66 0 385 0 508 259 0 285 145 409 282 0 128 209 383 381 0 528 2 619 172 0 0 121 159 479 0 604 0 639 132 0 0 54 38 146 0 98 37 213 344 30 365 255 490 309 30 76 329 428 426 +3399 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465986.jpg 640 475 31 106 345 292 379 0 402 206 504 406 24 94 323 158 359 +3400 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400044.jpg 483 640 31 249 468 482 561 0 181 309 435 540 +3401 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332582.jpg 427 640 31 91 540 260 639 0 159 377 343 631 +3402 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000473075.jpg 640 494 31 127 152 228 231 0 578 247 633 359 0 534 260 591 410 0 171 133 255 209 0 488 306 562 487 0 432 297 497 475 0 299 82 337 132 0 349 266 395 445 0 239 302 292 448 0 110 313 166 459 0 169 300 213 447 0 207 294 252 445 24 503 333 529 386 24 18 346 39 396 24 66 326 90 372 0 391 273 454 450 0 272 85 303 176 0 0 26 639 475 +3403 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066412.jpg 480 640 31 290 165 406 632 0 39 30 307 639 56 10 242 76 329 0 0 232 64 360 +3404 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164835.jpg 640 427 31 127 365 216 426 0 30 28 424 421 0 0 9 24 95 +3405 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350405.jpg 500 333 31 260 233 428 266 0 37 145 67 191 0 186 84 398 247 +3406 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290602.jpg 640 480 31 314 193 417 235 0 327 81 391 216 +3407 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009727.jpg 500 375 31 258 203 323 227 0 184 89 285 235 +3408 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066243.jpg 480 640 31 148 190 229 610 0 126 93 339 628 0 322 162 373 275 0 379 151 407 219 0 274 145 297 192 0 422 145 437 182 0 115 140 143 211 0 364 150 379 185 0 161 139 190 188 0 94 139 120 201 31 17 188 53 198 0 412 143 427 179 0 295 166 327 223 0 300 146 320 184 0 29 139 48 185 0 12 140 75 183 +3409 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230964.jpg 640 480 36 139 271 205 325 0 5 18 192 294 +3410 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570680.jpg 480 640 36 96 454 319 525 0 104 54 361 487 13 126 332 177 357 0 0 320 15 365 13 0 364 33 391 13 307 335 368 384 13 210 335 274 382 +3411 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298736.jpg 427 640 36 7 520 124 632 0 2 0 424 617 +3412 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046329.jpg 640 512 36 328 359 410 426 0 461 136 478 154 0 312 87 438 243 0 281 52 410 230 0 371 147 466 269 0 330 187 520 444 0 448 153 538 236 0 501 173 557 237 0 532 175 574 247 0 566 208 606 277 0 504 213 586 314 0 395 137 509 285 0 565 235 638 364 0 235 42 368 215 36 20 78 120 134 0 0 11 639 388 +3413 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381527.jpg 640 426 36 399 206 461 284 0 307 16 441 268 0 561 127 577 178 0 555 133 565 178 0 545 124 559 169 0 607 140 619 155 0 534 121 548 165 0 593 142 608 163 2 316 152 343 173 2 42 140 65 151 2 517 155 542 170 0 304 154 323 198 0 497 149 513 181 0 486 148 500 180 0 458 151 476 171 0 453 153 461 167 2 90 133 118 147 0 438 150 452 181 0 0 34 611 277 +3414 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000059202.jpg 426 640 36 251 200 295 236 0 142 136 284 269 0 130 58 210 201 0 71 163 147 258 0 57 109 157 237 0 0 173 63 285 0 189 39 274 186 0 238 3 325 153 0 150 62 239 194 0 106 89 157 157 36 43 88 296 298 39 220 126 234 144 39 201 186 216 204 +3415 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489019.jpg 394 500 36 314 185 331 220 0 213 137 324 216 +3416 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000017755.jpg 427 640 36 111 420 329 585 0 75 23 328 558 +3417 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417416.jpg 640 428 36 297 302 351 335 0 214 129 351 324 +3418 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252444.jpg 640 480 36 261 214 332 254 36 607 204 634 221 0 283 94 370 233 0 104 98 122 150 0 607 176 639 253 0 391 77 404 119 0 356 77 369 105 0 342 89 360 104 0 323 83 336 103 0 488 90 499 120 0 92 95 102 136 36 598 156 614 162 0 471 89 485 121 0 514 85 526 122 0 503 85 516 118 0 161 84 172 131 0 0 77 639 222 +3419 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032464.jpg 640 426 36 192 401 255 414 0 179 234 250 403 +3420 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008010.jpg 640 443 37 451 253 585 293 37 115 234 272 269 0 191 212 243 312 0 497 211 545 337 +3421 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014056.jpg 612 612 37 258 405 367 416 37 212 366 253 373 37 86 310 96 317 37 310 319 329 327 37 410 395 446 401 0 166 237 175 252 0 189 228 202 253 0 203 234 217 254 0 114 221 144 249 0 47 242 66 265 0 579 208 590 253 0 280 371 353 409 0 213 351 319 375 0 310 310 381 323 0 114 291 152 309 0 444 379 482 398 0 509 370 575 395 0 178 228 185 242 0 119 240 596 405 +3422 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391463.jpg 640 640 37 285 305 371 388 24 547 260 558 285 0 286 261 345 441 0 97 241 122 296 0 74 238 97 298 0 9 241 27 292 0 567 246 591 323 0 552 250 571 325 0 366 241 392 268 16 70 295 89 315 +3423 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390689.jpg 640 427 37 249 279 378 305 0 216 175 379 298 +3424 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000018358.jpg 493 640 37 290 347 433 532 0 105 176 398 473 +3425 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510864.jpg 427 640 37 79 379 302 453 0 162 166 323 417 +3426 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026560.jpg 640 426 37 238 294 305 323 0 162 114 295 305 +3427 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367626.jpg 640 267 37 394 44 446 129 0 398 36 485 108 +3428 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470513.jpg 640 640 37 9 325 324 417 0 104 209 287 570 +3429 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535858.jpg 640 426 37 407 277 446 287 0 364 208 452 278 +3430 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138937.jpg 428 640 37 57 438 426 524 0 106 16 356 489 +3431 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111024.jpg 480 640 40 171 1 238 79 41 47 0 113 74 54 30 306 280 507 54 225 257 409 396 54 76 196 237 312 42 174 67 238 135 60 0 51 480 639 0 232 0 479 180 40 284 38 420 207 41 7 148 87 226 +3432 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176696.jpg 478 640 40 125 12 268 338 41 277 90 430 329 54 93 349 296 568 54 258 351 364 501 60 0 155 474 632 58 23 0 142 144 56 81 0 373 169 +3433 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445200.jpg 640 427 41 380 45 466 174 43 380 283 439 426 51 298 277 380 305 51 319 244 366 284 51 343 252 417 269 51 273 271 349 306 45 173 119 322 201 50 397 301 421 317 60 0 0 634 421 45 462 157 635 282 51 270 263 296 287 51 340 266 413 279 +3434 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257941.jpg 640 342 41 415 104 630 281 42 0 226 319 330 45 156 236 354 291 45 171 201 343 263 55 171 187 343 266 +3435 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082794.jpg 612 612 41 412 21 555 174 52 61 172 553 523 60 22 16 591 346 +3436 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000119785.jpg 640 427 41 473 0 639 90 42 423 33 639 227 48 0 155 160 358 48 63 13 351 237 +3437 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085674.jpg 640 403 41 583 226 626 269 52 351 286 366 309 52 336 302 351 328 52 262 285 276 306 52 323 274 340 308 52 383 318 397 333 52 138 308 159 324 52 312 276 323 290 52 301 288 315 309 52 309 306 323 325 0 0 76 86 253 0 260 27 329 226 0 89 108 120 172 0 542 89 563 118 0 511 99 518 112 0 252 94 276 123 0 138 117 160 150 0 600 92 618 120 0 0 295 72 402 0 476 281 638 402 60 385 122 432 171 60 64 131 106 183 0 304 71 414 229 41 544 215 593 265 41 496 212 555 267 52 284 307 298 329 52 389 282 406 303 56 118 146 124 169 43 35 251 74 272 45 373 190 431 215 67 0 114 13 126 45 540 154 632 190 52 314 288 329 308 52 228 301 243 328 52 374 303 390 321 52 20 263 429 355 +3438 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319617.jpg 320 240 41 15 12 115 123 41 0 79 107 234 52 137 44 313 152 60 0 0 319 236 +3439 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439651.jpg 500 333 41 20 86 182 298 66 160 131 477 215 +3440 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188084.jpg 640 640 41 54 146 286 434 52 179 376 577 558 48 173 376 575 560 60 3 3 639 372 +3441 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000448511.jpg 385 289 41 16 0 130 88 42 34 29 193 175 51 289 107 315 178 51 269 94 290 130 51 205 82 230 134 51 244 80 271 105 51 309 96 335 132 51 171 77 227 117 51 223 79 270 115 51 252 122 331 151 40 13 0 129 88 60 0 0 385 284 51 261 131 302 187 +3442 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096110.jpg 640 480 41 96 0 258 186 52 131 222 258 464 52 263 103 473 249 52 246 222 321 377 60 2 0 639 474 41 569 0 638 135 +3443 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150026.jpg 500 332 41 322 0 499 297 52 55 17 331 274 +3444 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278822.jpg 640 480 41 28 358 73 416 41 14 320 60 375 0 128 0 295 204 0 129 2 169 61 0 25 27 74 90 0 398 44 426 80 0 436 0 600 363 0 343 64 441 228 0 90 42 138 104 0 96 54 164 206 0 109 9 131 54 39 51 260 85 333 39 29 84 40 112 41 289 259 318 307 54 296 409 335 451 54 257 346 298 377 54 292 355 334 385 54 329 364 365 396 54 308 382 346 416 54 272 371 311 407 54 116 349 158 385 56 387 218 443 271 56 1 201 96 296 56 289 94 345 182 56 337 133 420 226 56 569 150 639 242 56 147 154 174 237 56 89 58 105 73 56 0 176 52 212 60 2 200 537 474 60 407 113 462 132 62 402 6 506 89 63 67 99 114 142 63 17 45 49 63 63 64 92 108 99 67 436 140 453 149 0 127 11 147 58 0 0 48 18 131 24 182 179 307 261 24 597 220 637 260 41 117 205 146 240 41 391 252 421 268 41 422 110 431 125 41 417 104 426 121 41 37 144 47 163 54 248 396 298 435 54 211 387 252 421 54 274 437 320 474 54 231 424 276 455 54 234 365 273 397 60 287 94 350 131 0 0 88 58 232 54 187 411 233 439 56 588 405 639 479 60 34 127 108 149 54 84 254 449 365 +3445 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100083.jpg 640 480 42 169 54 212 110 41 109 55 170 111 42 292 159 357 184 60 3 0 639 473 41 35 48 112 118 +3446 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401425.jpg 640 426 42 313 96 365 201 42 32 94 123 195 42 236 310 411 349 42 524 198 626 240 42 497 131 639 178 55 430 312 590 417 55 263 278 372 380 55 107 181 258 266 55 129 99 256 174 55 489 192 610 294 55 39 275 199 379 55 464 60 567 115 55 349 1 444 54 42 0 169 47 281 42 507 300 611 338 55 284 126 387 186 55 0 184 71 257 55 9 107 111 179 60 0 0 640 426 55 245 55 311 107 55 215 0 570 192 +3447 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574509.jpg 640 427 42 309 41 639 318 55 81 1 398 421 45 0 1 640 422 +3448 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223289.jpg 640 425 42 491 328 639 391 49 413 208 639 332 48 1 179 426 418 +3449 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324203.jpg 500 375 42 406 177 499 200 45 382 141 498 239 45 288 220 462 369 46 369 0 498 111 52 178 149 274 232 52 209 91 239 131 52 151 76 182 122 52 185 84 217 130 52 168 83 205 130 0 1 162 278 369 52 191 88 225 134 52 158 79 195 127 +3450 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550862.jpg 640 427 42 0 275 372 364 55 334 140 510 292 51 367 143 452 174 60 0 0 639 420 +3451 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188616.jpg 480 640 42 153 215 431 366 45 0 431 155 591 45 134 229 468 524 48 167 280 314 403 48 315 278 420 432 48 231 324 337 471 +3452 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000324789.jpg 640 478 42 480 100 639 456 48 113 123 480 477 +3453 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032964.jpg 640 419 42 359 80 639 152 44 362 80 639 154 45 243 226 639 418 52 222 89 411 248 52 0 80 277 412 +3454 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009908.jpg 640 480 42 85 273 541 473 52 92 72 606 365 +3455 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267998.jpg 440 330 43 259 127 340 185 76 101 194 151 318 76 243 93 342 181 +3456 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233556.jpg 500 375 43 77 0 269 159 51 234 0 314 188 51 261 0 371 260 51 379 3 426 220 51 427 0 474 208 43 52 0 188 150 0 454 1 499 107 +3457 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130613.jpg 640 425 43 130 5 313 43 51 434 147 562 262 51 601 146 638 347 42 591 337 639 388 60 235 0 639 49 +3458 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488522.jpg 375 500 43 0 188 313 233 55 7 0 374 500 +3459 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170411.jpg 640 510 43 524 242 625 509 55 67 145 478 449 56 165 33 542 168 60 0 119 639 504 +3460 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245242.jpg 640 480 43 179 57 639 234 51 181 209 310 320 48 182 112 317 203 51 370 157 468 321 48 55 192 139 331 +3461 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243190.jpg 640 425 44 385 97 637 237 45 0 0 638 424 51 89 0 137 66 51 454 267 530 400 51 180 225 234 304 51 107 226 214 413 51 351 88 398 128 51 294 267 341 313 51 187 32 229 138 51 336 282 392 376 51 60 19 530 417 +3462 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554607.jpg 640 480 44 440 246 541 277 44 273 140 313 192 44 222 122 258 158 44 296 74 349 141 44 437 161 509 184 44 489 137 562 158 44 507 196 616 233 52 201 210 284 277 39 602 35 639 133 39 473 23 519 89 39 515 20 551 99 39 564 37 616 121 39 454 0 495 79 39 535 53 572 106 39 429 26 460 73 44 598 177 639 200 44 414 118 440 125 52 54 268 127 359 52 192 235 285 309 52 151 237 234 316 +3463 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056326.jpg 640 480 44 186 404 468 473 45 44 70 629 406 50 413 85 489 139 51 484 141 601 249 51 423 79 551 188 42 464 437 532 468 56 36 9 479 52 60 0 40 640 471 +3464 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323291.jpg 640 427 44 278 242 479 345 55 130 121 277 325 60 1 2 639 418 44 543 182 639 212 55 291 99 451 289 41 545 49 639 195 +3465 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356236.jpg 640 424 44 20 65 374 409 51 143 212 326 409 45 310 97 382 278 45 32 36 251 225 +3466 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279784.jpg 426 640 45 120 67 413 268 45 30 181 171 285 45 1 89 124 153 48 42 224 425 600 +3467 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493206.jpg 640 480 45 396 0 548 94 50 297 243 407 395 50 239 161 328 239 50 291 76 404 139 50 168 133 232 210 50 380 298 451 368 44 211 0 341 100 45 7 4 545 472 50 441 312 457 324 +3468 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496324.jpg 640 480 45 2 2 334 103 48 0 18 640 386 +3469 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349485.jpg 640 480 46 52 277 57 284 46 42 310 52 320 49 319 338 403 394 46 23 256 86 319 50 301 267 335 297 0 449 209 469 228 49 282 345 357 403 51 430 267 446 274 51 446 264 469 272 51 451 256 462 261 51 416 268 426 272 51 418 266 430 269 51 411 249 441 265 51 434 276 447 284 51 457 275 471 280 51 423 279 431 282 +3470 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323853.jpg 640 640 47 293 153 583 537 47 98 249 143 289 47 166 187 197 214 47 332 396 356 416 +3471 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015953.jpg 480 640 47 0 56 271 363 60 1 0 479 628 55 204 268 445 509 +3472 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306281.jpg 500 375 50 222 11 309 96 50 334 273 376 321 50 155 223 272 345 50 320 157 472 299 50 32 74 180 356 50 280 100 411 188 50 189 178 224 213 50 234 105 276 133 +3473 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292916.jpg 413 500 50 2 2 412 235 +3474 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262325.jpg 640 426 50 40 168 345 370 50 247 275 527 425 50 375 115 639 417 50 41 20 281 192 50 243 17 477 175 51 221 119 403 232 45 0 3 640 419 +3475 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407524.jpg 640 480 50 298 89 631 439 50 262 50 357 160 50 210 0 262 30 +3476 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347724.jpg 427 640 50 321 0 426 153 51 206 303 243 411 51 120 283 169 393 51 200 282 221 314 51 275 280 321 348 51 236 525 320 632 51 109 509 158 551 51 282 377 361 514 51 144 370 179 447 51 107 320 159 421 51 82 251 119 319 51 346 431 413 510 51 143 446 176 485 51 83 443 121 517 51 0 183 426 575 +3477 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000528738.jpg 640 426 51 310 135 420 198 73 183 55 321 86 73 167 9 316 63 49 216 300 290 375 50 428 188 577 332 51 406 184 429 222 51 391 195 412 206 51 352 137 403 146 51 415 209 430 226 51 365 197 386 202 39 404 0 464 91 +3478 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315744.jpg 640 480 51 247 245 630 419 77 282 115 639 422 +3479 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143671.jpg 640 473 51 93 93 291 249 51 55 71 427 465 51 338 141 530 466 51 87 236 211 439 51 482 254 597 396 51 412 104 540 206 +3480 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012375.jpg 640 480 51 181 205 401 422 50 146 200 318 375 60 450 2 639 470 +3481 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184590.jpg 640 480 51 227 260 270 276 51 231 271 301 334 50 378 37 593 369 51 199 251 239 266 51 19 201 188 253 51 79 182 238 222 +3482 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000279027.jpg 640 431 51 423 255 470 293 51 571 317 612 365 51 71 249 111 289 51 15 342 47 395 69 0 1 639 301 51 450 173 507 202 51 335 293 433 414 51 532 192 568 223 +3483 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533688.jpg 640 480 51 434 126 550 214 51 36 103 171 188 51 62 159 105 196 51 471 92 603 181 51 51 123 157 230 51 75 180 128 270 49 138 157 183 207 51 531 154 607 235 51 455 124 543 170 +3484 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506736.jpg 425 640 51 137 228 422 320 51 97 167 251 270 51 140 42 424 236 51 298 295 424 403 +3485 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277162.jpg 500 375 52 115 84 468 303 13 0 20 141 363 +3486 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015735.jpg 640 481 52 4 86 564 462 0 78 150 638 474 +3487 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000214853.jpg 640 480 52 1 185 347 418 39 553 0 639 79 +3488 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019491.jpg 333 500 52 167 257 230 353 0 5 72 332 493 0 0 287 45 336 60 234 168 279 205 60 276 152 332 219 60 1 435 24 496 48 164 256 236 382 +3489 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215565.jpg 640 427 52 186 179 482 307 +3490 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283113.jpg 480 640 52 1 101 290 519 52 311 105 479 437 41 207 0 364 106 +3491 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270001.jpg 640 480 52 91 5 415 264 +3492 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297520.jpg 640 480 52 376 374 455 450 52 281 318 341 382 52 175 301 224 361 52 245 312 298 374 52 322 345 374 410 52 213 314 260 361 52 348 354 400 435 52 92 275 140 324 52 154 286 221 335 53 480 141 590 181 53 418 112 514 150 53 315 104 409 141 +3493 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437923.jpg 640 360 52 56 5 447 352 56 0 0 54 47 +3494 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567340.jpg 500 375 52 294 77 379 200 0 21 1 444 371 62 404 1 499 116 +3495 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359118.jpg 640 480 52 83 88 356 391 60 0 0 640 478 +3496 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487391.jpg 640 399 52 330 13 639 388 52 0 6 333 392 +3497 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461953.jpg 500 191 52 16 33 485 166 +3498 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000522791.jpg 640 480 52 293 427 391 453 52 347 408 439 420 52 413 434 501 459 52 503 446 617 472 52 534 430 639 458 52 558 423 639 438 52 525 441 629 463 52 554 377 592 412 52 390 364 441 406 0 0 1 334 479 52 465 390 563 426 52 429 357 517 412 52 265 391 364 407 52 245 399 342 418 52 433 352 490 378 52 221 406 323 424 52 273 270 639 462 +3499 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430973.jpg 640 478 53 33 55 611 419 +3500 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345469.jpg 480 640 54 227 324 257 346 54 405 314 422 327 54 373 324 394 352 54 406 326 428 352 54 331 404 366 421 54 252 373 292 401 54 173 381 200 400 54 72 392 102 409 54 328 414 364 431 54 295 409 325 428 54 222 381 255 397 54 239 244 265 262 54 423 326 446 354 54 14 144 459 602 +3501 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221620.jpg 640 426 54 285 303 382 386 54 411 296 517 382 54 449 236 541 311 45 273 285 392 398 56 499 0 639 378 56 181 1 580 234 60 115 8 594 405 +3502 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174904.jpg 640 428 54 354 52 563 328 +3503 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298252.jpg 640 480 54 328 263 376 332 54 395 46 516 109 54 396 88 516 143 54 507 21 594 74 54 290 114 414 159 54 289 0 390 81 54 399 0 495 51 54 493 0 568 33 54 565 3 639 48 54 460 311 543 401 54 364 261 413 319 54 291 351 364 454 54 138 61 243 114 54 16 23 639 477 +3504 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537369.jpg 427 640 54 49 230 290 425 0 69 0 426 593 45 1 304 159 590 60 0 92 427 628 +3505 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183217.jpg 612 612 54 315 352 515 504 54 316 220 470 364 54 287 130 430 242 54 431 143 574 262 54 461 238 586 371 54 497 364 594 508 54 18 143 150 261 54 126 347 318 498 54 143 233 320 384 54 146 143 299 253 54 19 258 151 364 54 23 364 129 505 +3506 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367571.jpg 640 478 54 263 160 454 325 54 59 235 310 440 54 456 202 612 417 54 82 158 253 262 +3507 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355256.jpg 427 640 54 162 308 245 345 0 4 64 314 639 39 326 303 350 378 68 215 218 338 288 72 1 187 51 571 56 251 488 364 639 +3508 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512145.jpg 640 427 54 143 165 353 313 54 31 84 225 236 54 0 27 151 134 54 149 0 287 77 54 265 48 424 172 54 393 151 576 276 54 299 252 537 425 54 0 1 70 37 54 113 0 144 19 54 0 321 44 426 +3509 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141760.jpg 480 640 54 41 158 449 550 0 0 204 56 321 0 466 174 479 234 +3510 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550627.jpg 612 612 54 86 141 257 260 54 358 211 565 381 54 281 152 469 285 54 166 278 392 469 54 114 205 305 341 54 486 13 595 62 54 253 101 397 201 54 483 85 593 168 54 440 65 545 122 54 400 40 493 103 +3511 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556562.jpg 640 480 54 127 78 514 440 54 574 93 639 372 54 542 0 639 69 54 175 0 524 111 +3512 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568675.jpg 640 480 54 435 167 615 296 54 22 102 146 194 54 234 164 385 295 54 292 83 402 164 54 135 76 228 158 54 226 51 326 116 54 61 208 244 349 54 97 145 239 221 54 337 118 483 223 54 83 303 305 474 54 305 235 498 396 54 205 113 322 192 +3513 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554340.jpg 640 480 54 327 107 476 272 +3514 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080300.jpg 640 480 54 213 123 544 455 60 0 0 640 480 +3515 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478136.jpg 533 640 54 140 178 299 274 55 358 219 517 367 55 297 156 421 230 60 12 176 515 514 55 233 215 360 339 55 185 322 405 434 +3516 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173533.jpg 480 640 54 48 348 316 628 55 84 67 407 331 54 78 84 373 343 +3517 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453040.jpg 480 640 55 60 230 392 639 60 0 290 480 399 +3518 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000535952.jpg 428 640 55 15 289 195 456 55 169 360 383 549 55 202 215 359 344 60 1 212 424 624 42 196 336 427 446 42 119 273 148 295 +3519 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000051289.jpg 640 427 55 98 163 236 280 55 267 163 388 269 55 414 168 530 275 56 2 2 639 282 56 0 229 640 426 +3520 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034183.jpg 500 375 77 110 23 427 343 +3521 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146253.jpg 640 428 24 126 252 156 302 24 282 241 298 276 24 370 231 387 258 24 411 202 425 224 24 344 201 357 217 24 452 217 463 243 24 206 246 230 283 0 136 243 187 377 0 215 238 250 348 0 290 234 324 325 0 324 198 357 249 0 371 227 410 304 0 399 198 419 258 0 438 214 472 277 30 396 285 404 298 30 284 315 325 330 30 202 333 264 356 30 334 242 366 249 30 447 271 467 279 +3522 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189714.jpg 640 373 0 90 132 193 202 0 329 97 409 210 0 170 255 178 270 0 188 258 194 272 0 353 278 361 292 0 408 282 414 295 0 207 260 214 273 0 370 262 372 267 30 302 196 479 225 30 103 178 219 219 0 534 302 541 313 0 0 277 37 299 0 455 297 459 307 +3523 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281508.jpg 640 426 37 382 267 542 380 37 360 263 481 368 37 309 259 425 355 37 252 250 397 349 37 210 247 368 331 37 199 243 324 330 37 149 234 281 314 37 139 235 239 309 37 93 228 195 295 37 179 239 296 320 37 104 230 226 301 37 54 226 176 285 +3524 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573791.jpg 500 375 41 85 3 474 355 42 254 0 482 225 +3525 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364399.jpg 640 480 45 243 227 467 454 45 74 15 594 380 51 205 36 301 173 51 162 77 200 112 51 188 109 212 146 51 293 153 323 187 51 227 202 257 234 46 80 204 246 377 51 210 85 263 171 51 273 23 327 51 51 340 160 373 188 +3526 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492785.jpg 500 375 48 238 61 499 271 48 14 85 265 256 +3527 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209808.jpg 640 427 48 276 119 579 328 48 153 90 342 232 60 0 212 639 420 +3528 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530052.jpg 640 427 51 182 352 303 426 51 240 297 397 373 51 343 239 538 364 51 443 274 597 342 51 259 287 404 331 51 237 314 380 409 51 325 166 522 230 51 390 181 483 210 51 202 218 241 279 51 191 297 282 374 51 401 177 541 193 51 57 143 639 355 51 1 69 66 111 51 0 18 627 426 +3529 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242423.jpg 500 333 51 250 42 499 285 +3530 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402887.jpg 640 478 54 450 245 476 270 54 447 270 475 294 54 510 291 537 316 54 514 317 543 340 54 508 269 537 294 46 52 125 95 167 54 450 293 482 316 54 481 316 511 343 54 505 239 531 269 +3531 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492363.jpg 480 640 0 275 230 333 320 +3532 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030998.jpg 360 640 55 46 139 227 236 60 4 571 359 639 55 1 214 288 506 +3533 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000445009.jpg 640 480 16 336 323 423 420 57 520 288 639 473 56 333 167 416 282 56 177 213 203 294 58 399 141 440 237 45 281 434 309 463 45 275 403 294 421 45 248 378 272 398 39 459 387 479 417 75 462 345 477 368 62 469 165 595 290 +3534 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427965.jpg 428 640 16 239 555 332 639 62 234 233 314 314 57 0 254 207 469 57 0 470 173 627 0 385 482 427 544 56 290 271 379 409 15 241 560 332 631 56 0 471 174 639 56 83 254 206 370 +3535 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455750.jpg 640 425 16 108 151 541 371 59 0 0 638 419 59 0 0 250 219 65 223 77 251 92 +3536 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133251.jpg 408 408 16 83 109 294 281 15 170 231 318 354 57 0 49 408 388 +3537 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510593.jpg 640 640 16 218 171 572 385 16 260 41 417 129 0 0 263 516 630 59 0 37 640 639 +3538 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004392.jpg 640 319 16 34 52 596 283 59 361 0 639 318 +3539 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164983.jpg 640 383 16 126 64 505 286 0 1 0 226 228 73 437 36 507 52 73 437 46 506 56 73 203 24 282 37 59 3 96 639 381 73 381 44 437 62 73 448 30 508 37 73 304 48 380 60 73 248 52 300 58 73 179 36 257 49 73 196 53 241 57 +3540 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325587.jpg 480 640 16 108 361 169 453 39 249 327 273 391 57 211 256 478 613 56 279 251 404 359 56 77 240 128 311 73 294 260 299 279 73 262 288 265 304 73 259 257 264 277 73 260 254 321 279 73 275 284 278 304 39 249 344 260 373 58 289 181 322 217 73 324 263 344 278 73 257 289 262 305 73 265 286 272 305 73 271 285 276 304 58 185 242 203 263 58 217 245 233 266 41 281 357 299 386 +3541 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159458.jpg 640 480 16 220 217 311 252 59 112 162 516 462 56 525 246 639 428 +3542 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146614.jpg 640 426 58 145 93 225 177 57 34 151 233 256 57 299 128 635 245 39 604 225 633 315 39 627 189 639 286 45 337 188 393 211 75 278 175 299 198 45 379 219 407 244 58 248 126 321 200 58 15 102 67 164 41 607 281 638 327 41 625 299 639 338 57 0 128 48 198 +3543 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000211186.jpg 640 480 58 344 72 362 131 58 471 72 491 132 62 0 80 58 173 57 530 246 639 388 65 565 296 600 302 41 572 225 584 232 45 200 143 212 149 45 199 179 212 185 73 392 296 442 312 73 512 284 545 293 73 379 301 443 323 73 510 296 521 322 56 131 188 239 327 75 614 178 639 233 73 593 343 639 372 +3544 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100726.jpg 500 375 58 334 211 366 251 58 46 184 87 263 62 389 145 460 205 0 108 121 227 373 0 0 103 62 370 73 238 176 243 202 73 236 208 241 234 73 216 279 241 310 73 231 207 237 235 56 267 204 319 278 56 50 217 91 307 73 239 207 248 234 73 233 173 242 201 73 474 172 491 196 73 243 174 257 201 73 205 174 218 201 58 73 211 104 258 60 251 214 324 290 65 240 240 266 251 65 38 286 53 297 73 480 210 487 230 73 461 213 474 229 73 102 132 496 236 +3545 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516867.jpg 640 427 58 327 142 369 242 62 383 178 437 234 56 435 225 527 346 59 0 184 407 420 73 461 227 470 235 +3546 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054334.jpg 640 426 58 8 299 74 419 58 193 190 225 229 56 549 281 639 405 59 16 208 334 389 75 275 233 286 259 15 163 252 188 268 58 262 205 299 261 63 458 206 510 239 73 272 263 297 266 39 256 241 266 270 41 518 218 536 232 62 464 205 512 237 75 14 359 57 425 41 257 247 266 270 +3547 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168832.jpg 640 427 58 412 205 443 243 57 497 265 639 422 60 261 305 361 424 56 462 244 497 309 68 308 204 340 223 58 347 175 365 234 58 88 215 103 234 69 173 185 187 233 71 87 231 124 236 73 281 145 283 161 73 272 145 275 161 73 307 145 312 161 73 323 159 344 161 73 287 159 300 160 73 319 189 323 197 73 284 145 289 161 56 249 306 305 414 56 322 308 375 415 56 415 243 461 308 56 416 242 433 269 56 451 242 481 245 +3548 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577161.jpg 640 428 58 221 248 255 325 62 317 183 347 218 57 0 242 233 427 56 407 300 566 427 56 403 265 509 350 73 475 180 480 202 73 430 231 500 257 73 441 283 443 299 73 436 257 443 278 73 466 179 471 200 73 456 180 461 200 73 471 178 476 201 73 442 178 450 201 73 472 208 476 228 73 481 207 486 227 73 447 209 453 227 73 486 210 498 228 73 477 206 481 228 56 358 322 436 396 73 426 174 509 307 +3549 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327413.jpg 640 480 58 57 121 155 279 56 465 226 582 388 59 61 381 639 479 63 429 201 493 244 59 559 319 639 439 62 330 152 432 261 +3550 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400976.jpg 612 612 58 181 348 297 553 57 247 273 606 608 56 5 313 111 451 58 90 292 186 382 75 207 491 250 550 +3551 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193661.jpg 500 375 58 262 60 319 108 56 91 215 216 371 75 422 90 431 109 75 407 84 416 111 75 283 83 299 111 75 396 83 404 109 14 125 209 144 229 57 463 252 499 374 +3552 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000405970.jpg 640 427 58 9 203 81 331 62 163 138 275 204 57 502 202 639 426 73 353 257 394 273 41 329 202 336 213 73 355 270 392 277 56 0 328 76 410 56 0 287 164 426 +3553 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181485.jpg 612 612 58 538 315 566 351 58 570 313 589 352 62 14 287 76 342 56 367 298 539 587 60 450 518 591 594 57 170 310 328 431 56 208 310 320 431 58 149 309 208 353 75 548 326 563 350 +3554 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253630.jpg 640 480 58 234 11 320 123 62 0 0 129 80 56 543 34 639 224 +3555 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280766.jpg 640 426 58 386 132 471 214 62 470 141 628 248 57 0 301 61 418 0 35 45 209 420 65 196 360 219 385 73 430 278 435 300 73 449 291 485 305 73 526 293 533 317 73 448 303 491 312 73 580 296 593 335 39 200 304 215 348 56 0 353 58 424 73 420 271 438 300 73 594 281 610 286 65 280 370 309 380 65 519 135 561 140 73 436 278 439 297 +3556 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289172.jpg 500 375 58 347 89 433 200 0 135 44 340 370 0 231 44 352 374 0 285 126 354 295 0 431 111 499 281 57 0 152 146 355 40 113 262 129 295 65 313 251 355 275 67 483 125 486 129 65 338 162 352 173 65 292 207 311 226 65 102 283 137 289 +3557 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351590.jpg 500 333 58 309 242 447 328 0 70 28 219 328 74 435 106 471 159 65 190 175 220 193 73 420 173 437 214 73 397 174 411 218 73 387 176 400 217 73 427 169 441 213 73 452 170 463 211 73 459 143 477 210 73 487 154 499 198 73 480 159 490 199 73 406 237 413 251 73 408 174 428 216 73 440 176 453 212 57 0 290 279 332 +3558 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470746.jpg 640 427 58 409 264 429 283 56 202 312 323 420 56 107 225 192 317 57 320 218 578 309 57 213 269 425 388 57 540 259 635 403 73 74 130 83 154 73 307 125 327 142 73 65 127 77 151 73 62 192 78 216 60 377 273 458 330 73 307 183 351 202 56 64 279 161 351 56 0 228 63 310 56 285 206 339 261 56 359 204 400 228 56 424 228 443 256 57 449 289 543 396 57 5 359 221 426 73 511 147 525 156 73 308 144 351 161 73 325 126 329 143 73 327 109 348 127 73 328 201 332 219 73 344 224 347 232 73 71 218 74 243 60 0 302 87 377 60 150 351 243 426 73 68 191 81 215 57 424 203 633 267 57 202 308 322 426 73 1 14 556 315 +3559 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451468.jpg 640 425 58 258 146 338 227 57 546 238 638 362 56 73 247 117 323 56 145 232 197 314 56 303 204 350 268 60 58 235 258 317 13 114 255 347 383 47 242 234 247 239 47 245 230 252 237 56 210 220 231 234 56 550 354 639 423 60 209 221 316 276 75 390 193 400 207 75 554 203 569 225 47 229 232 240 239 56 26 274 127 398 73 131 163 134 188 73 141 163 146 186 73 138 207 148 230 73 154 162 158 185 73 114 108 142 130 73 173 160 175 183 73 175 191 180 212 73 189 157 198 181 73 210 154 213 178 73 121 133 123 142 73 134 131 137 150 73 150 132 155 151 39 213 78 218 99 73 123 164 129 189 75 541 208 550 223 73 111 108 258 254 +3560 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095062.jpg 640 480 58 568 10 639 172 39 468 1 615 261 56 1 1 221 225 56 368 0 501 155 53 102 261 406 478 73 262 74 277 116 73 286 76 294 122 73 284 80 292 120 73 248 80 272 129 73 289 76 300 122 60 0 116 640 479 73 271 82 281 120 73 275 75 288 121 73 276 83 286 120 73 251 13 255 53 39 0 138 50 349 +3561 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207041.jpg 640 289 58 591 60 632 139 62 511 75 591 141 56 331 143 365 195 56 287 137 331 156 56 248 151 279 202 56 330 143 345 155 56 248 163 270 185 56 478 144 497 184 56 290 188 373 252 57 0 143 214 285 28 443 158 462 184 56 362 143 375 158 56 307 157 311 172 56 372 156 398 200 60 279 154 371 206 58 214 102 231 141 56 287 178 369 217 +3562 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259952.jpg 640 425 58 117 131 204 234 56 3 194 220 417 59 352 109 639 292 73 84 176 99 184 73 58 161 71 189 56 81 195 145 279 73 64 165 78 188 +3563 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217562.jpg 640 426 58 500 21 555 110 62 149 137 297 281 0 289 78 554 418 75 543 215 589 304 24 37 301 105 387 39 329 65 343 103 65 430 109 461 115 75 512 102 538 117 0 549 81 559 100 0 538 88 553 112 0 475 93 484 104 0 482 88 486 109 0 488 94 496 112 58 307 3 375 116 65 508 122 542 147 65 562 103 588 107 65 215 136 246 139 75 330 65 343 103 +3564 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410587.jpg 640 428 58 316 187 390 256 58 562 159 612 199 58 32 162 84 196 57 56 192 625 259 45 384 247 405 256 45 421 262 446 272 +3565 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173434.jpg 640 427 58 389 197 423 237 62 294 130 367 194 56 538 210 591 284 56 505 191 550 263 56 213 278 371 420 57 53 216 165 331 60 513 194 627 280 74 98 87 155 142 39 81 129 91 151 39 180 130 189 154 56 213 179 270 243 56 589 226 635 271 39 62 122 74 151 39 171 133 176 150 39 161 136 166 153 39 501 151 505 157 45 488 180 499 186 45 390 232 420 242 56 584 221 595 259 60 326 339 635 421 75 75 132 84 152 75 61 121 73 151 75 92 141 100 152 75 166 142 172 153 75 177 137 182 154 75 180 129 189 153 +3566 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120380.jpg 640 640 58 0 178 128 350 62 130 63 369 217 0 201 227 295 513 0 314 127 507 507 65 270 327 306 356 65 369 284 393 298 59 1 339 639 630 +3567 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361885.jpg 320 240 58 101 73 134 117 57 0 123 61 237 56 75 105 99 148 0 164 0 245 235 65 209 64 231 89 +3568 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243134.jpg 640 427 58 471 237 509 268 58 438 229 492 271 62 513 211 521 239 56 152 262 242 383 57 447 295 586 420 57 322 247 453 334 56 253 235 335 343 56 317 226 343 252 75 123 279 151 322 56 357 216 409 256 75 148 278 158 310 +3569 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396526.jpg 500 338 58 171 57 249 206 56 100 196 166 325 56 167 206 245 333 56 79 166 121 191 56 173 174 230 189 56 252 279 434 332 75 199 162 211 204 75 315 178 329 220 58 265 63 374 221 60 44 176 252 300 73 282 222 318 240 +3570 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000187054.jpg 640 480 58 108 66 222 201 58 79 142 132 207 39 68 308 136 478 39 134 316 182 471 57 202 212 639 477 0 118 140 313 295 40 316 454 357 479 65 156 293 210 309 65 384 282 405 299 58 2 109 41 205 60 118 388 317 479 41 167 428 213 479 41 309 452 357 479 41 77 461 162 479 41 103 351 133 386 65 110 281 151 302 65 226 282 242 287 74 443 287 456 302 0 169 120 526 479 +3571 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389843.jpg 500 370 58 53 127 97 183 62 0 76 37 182 56 116 57 322 341 56 335 44 499 264 75 65 139 94 184 75 248 125 279 149 58 245 72 293 150 +3572 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410576.jpg 640 427 62 502 0 539 60 39 527 54 544 99 63 316 134 462 209 64 572 78 592 90 66 541 79 572 95 73 121 124 250 177 65 43 345 130 421 74 354 107 372 118 64 1 218 46 251 +3573 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000391978.jpg 640 428 62 250 211 341 285 0 285 226 310 261 0 306 243 326 275 59 0 323 597 427 +3574 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579548.jpg 500 371 62 230 105 319 173 62 113 71 230 187 63 233 181 331 290 64 424 269 443 287 64 344 273 375 295 66 87 260 221 318 65 376 173 412 183 66 239 256 322 274 +3575 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555322.jpg 640 425 62 237 140 392 256 57 583 251 638 399 73 343 328 381 344 73 381 321 420 339 73 403 314 449 331 56 410 266 453 312 73 365 323 398 340 0 286 161 375 236 +3576 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475906.jpg 640 480 62 436 27 639 185 56 277 105 302 187 57 2 157 234 321 0 21 120 85 158 56 0 316 93 479 56 256 410 639 478 73 211 282 281 303 68 102 128 143 147 +3577 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486576.jpg 640 427 62 493 231 639 388 56 245 219 331 354 0 118 10 318 419 74 490 80 537 126 64 80 278 91 287 65 287 292 318 309 66 27 258 85 283 41 52 242 75 260 68 38 94 84 142 73 35 273 71 291 73 624 121 639 127 65 270 233 301 269 73 596 184 639 195 +3578 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138070.jpg 640 427 62 2 166 69 252 57 207 229 474 355 57 0 309 304 422 26 325 217 351 234 73 563 208 572 230 73 571 208 583 229 73 575 208 606 231 73 566 209 579 231 15 57 267 107 348 41 392 283 402 300 +3579 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225518.jpg 640 436 62 517 138 612 277 0 547 165 563 219 0 539 172 549 213 59 89 177 449 373 39 213 93 225 143 40 191 102 203 162 56 430 166 492 244 56 335 170 385 212 39 396 176 405 200 0 566 162 586 220 57 429 165 492 243 +3580 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132223.jpg 640 549 62 381 41 599 307 0 0 29 341 548 65 137 112 152 132 0 446 139 475 254 +3581 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207925.jpg 640 480 62 319 86 394 152 57 224 253 536 473 56 477 280 639 437 56 525 260 639 383 56 196 196 329 334 56 47 330 244 479 56 409 320 620 479 57 48 332 248 474 57 196 196 331 337 57 1 285 83 432 58 529 168 578 233 58 569 168 639 270 58 490 135 544 230 58 524 195 555 231 15 161 265 184 304 65 196 285 224 297 56 0 290 88 433 56 348 209 478 323 57 347 207 571 319 +3582 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326959.jpg 640 426 62 183 118 252 192 57 528 296 639 425 57 440 224 570 338 60 332 306 486 418 73 386 308 435 327 56 439 223 571 337 75 70 183 94 238 +3583 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033835.jpg 640 480 62 0 287 96 393 62 495 213 557 256 0 284 146 443 474 0 404 222 563 473 0 574 116 639 474 0 101 149 278 468 66 0 388 117 433 56 491 246 547 314 65 414 212 431 260 65 227 420 269 445 73 249 104 264 127 73 195 95 203 113 73 138 95 149 110 73 66 126 79 161 73 72 183 91 217 73 206 98 210 114 73 277 140 287 165 73 44 185 55 217 73 42 128 64 161 73 56 180 72 215 73 292 138 315 144 73 0 179 128 219 56 390 386 421 477 65 379 209 401 281 65 224 255 253 309 73 30 129 55 160 60 2 370 297 472 73 0 90 331 178 +3584 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065267.jpg 640 426 62 413 189 463 224 57 221 219 351 271 56 452 221 532 302 56 340 210 359 243 73 342 308 386 337 73 339 323 392 346 73 333 327 396 352 45 189 242 212 255 75 85 188 114 292 57 178 252 374 404 +3585 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576070.jpg 500 333 62 404 99 463 155 59 0 133 401 328 +3586 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575081.jpg 640 427 62 474 21 639 266 0 218 7 321 391 65 215 0 255 38 65 114 286 128 297 +3587 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146570.jpg 640 480 62 245 113 403 224 57 2 214 343 460 17 451 133 508 196 17 605 150 639 214 45 398 267 423 284 +3588 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538596.jpg 640 436 62 517 91 532 193 57 28 162 297 384 57 82 110 265 207 65 283 173 310 184 63 165 143 213 169 73 266 182 294 191 +3589 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556193.jpg 500 333 62 230 162 290 269 0 271 36 419 333 0 74 59 273 325 65 259 177 272 186 65 303 305 314 331 65 256 168 267 176 +3590 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505043.jpg 640 480 62 183 135 395 278 67 557 343 609 361 63 1 179 176 308 63 476 190 639 347 64 473 321 510 352 66 166 311 450 359 66 15 264 157 287 66 483 300 639 347 +3591 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383462.jpg 640 515 62 385 281 612 496 0 28 55 433 492 65 411 268 428 280 +3592 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292446.jpg 612 612 62 32 0 109 108 62 241 107 349 288 0 265 188 611 353 0 366 109 490 210 0 193 62 251 169 0 262 82 278 111 53 278 384 413 477 53 75 418 162 491 53 452 361 523 395 62 144 75 185 145 63 26 37 148 155 0 0 107 10 135 53 534 373 596 411 +3593 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192834.jpg 640 425 62 34 182 83 236 56 0 237 97 380 59 214 205 436 336 +3594 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444304.jpg 640 429 62 301 108 454 228 59 48 301 344 422 0 0 1 210 424 65 313 328 470 422 65 261 314 404 404 +3595 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000423189.jpg 427 640 62 229 334 297 400 56 129 462 266 621 56 114 311 145 352 66 187 396 294 441 73 223 244 231 280 73 231 246 237 283 73 238 201 252 237 73 242 203 253 239 73 241 156 245 190 73 179 232 188 258 73 181 275 186 297 73 180 206 184 226 73 247 152 251 190 73 250 149 255 189 56 145 536 294 639 73 235 245 251 287 +3596 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232088.jpg 640 480 62 53 140 213 260 57 122 266 568 473 63 578 397 639 438 64 614 461 624 467 66 527 414 625 465 56 316 276 495 369 65 446 270 474 280 +3597 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546569.jpg 640 480 62 183 239 262 333 56 396 200 467 335 59 376 338 593 453 56 238 329 315 432 58 366 313 392 349 75 563 233 594 299 +3598 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425870.jpg 480 640 62 342 79 479 271 0 0 3 244 561 73 167 246 220 289 0 40 187 170 350 73 267 280 302 355 73 130 224 172 285 73 187 250 225 269 65 218 309 247 347 +3599 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177802.jpg 640 424 62 1 158 88 228 56 257 153 320 242 56 194 184 234 222 56 236 175 263 217 56 532 190 639 339 57 352 164 543 267 57 0 222 228 388 24 226 303 289 355 +3600 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244571.jpg 640 428 62 520 2 638 157 57 0 202 486 422 39 364 253 374 285 43 166 346 206 366 47 289 330 306 348 47 273 328 288 346 47 286 323 302 339 40 207 314 225 371 40 269 287 283 325 59 0 159 113 224 43 230 320 262 332 +3601 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516916.jpg 640 480 62 282 77 420 187 62 2 69 151 194 67 195 219 225 238 67 344 203 381 216 56 90 197 295 420 63 369 91 539 241 63 145 84 256 185 63 451 218 638 392 64 390 242 418 265 66 222 200 386 268 +3602 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102439.jpg 375 500 62 5 26 335 254 65 191 234 309 469 0 168 248 374 494 +3603 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369185.jpg 640 426 62 412 179 483 223 57 115 252 407 420 57 457 260 638 416 60 22 298 240 419 45 114 280 200 345 56 525 199 573 289 73 357 282 403 299 56 598 195 639 264 56 453 282 639 425 60 556 218 600 282 +3604 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044220.jpg 640 426 62 104 250 396 420 0 0 86 237 421 0 279 5 639 420 65 208 267 230 302 +3605 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218439.jpg 480 640 62 0 310 54 427 0 0 192 453 633 59 0 405 162 580 59 99 358 479 639 67 344 412 383 433 79 284 309 347 325 41 372 438 442 544 0 245 265 265 292 0 216 276 226 291 0 414 243 430 268 0 422 236 443 260 0 437 229 459 254 0 446 180 473 213 +3606 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415163.jpg 640 480 62 2 182 101 354 62 380 184 457 231 62 239 189 316 288 0 228 211 350 474 0 342 196 499 472 0 456 219 533 472 0 491 176 575 460 0 591 178 639 310 0 554 189 582 313 65 231 324 252 340 26 564 341 609 479 0 476 186 501 226 0 582 217 639 475 0 0 384 118 479 +3607 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154423.jpg 640 480 62 237 146 396 275 64 462 328 489 358 66 223 314 423 356 64 146 274 178 303 +3608 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248089.jpg 500 333 62 59 31 486 302 0 2 33 219 263 0 290 77 498 282 65 275 120 438 252 65 23 84 197 245 +3609 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188948.jpg 500 346 62 382 191 497 273 0 230 23 410 345 0 23 56 189 345 65 174 50 488 199 0 65 130 157 345 +3610 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343157.jpg 500 375 62 191 49 251 113 0 171 39 346 367 0 241 107 408 368 0 46 207 192 371 65 362 116 384 127 56 368 206 423 345 56 0 236 48 374 59 0 161 131 278 59 248 160 422 344 +3611 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503202.jpg 640 480 62 0 153 186 385 0 349 198 474 479 0 365 217 407 353 0 485 185 573 474 0 562 201 608 338 0 592 193 639 479 26 362 370 422 420 65 547 329 604 380 0 443 223 476 261 0 608 229 621 249 0 261 213 308 424 0 551 331 639 395 +3612 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132540.jpg 640 428 62 216 128 380 223 57 484 214 636 409 73 338 297 402 347 73 38 262 42 278 56 482 216 639 391 65 209 317 238 345 73 131 301 193 346 34 326 69 385 109 34 232 70 292 106 73 186 305 217 333 73 333 301 395 352 56 471 235 494 297 73 229 306 315 353 +3613 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577877.jpg 640 480 62 548 38 636 148 57 0 149 199 474 0 214 134 402 277 0 8 143 197 281 0 0 239 247 470 65 393 134 410 157 56 0 338 167 473 0 279 72 344 157 0 0 173 97 269 56 40 148 128 208 +3614 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442323.jpg 640 480 62 216 149 373 296 56 443 217 593 374 59 435 385 639 479 65 210 291 236 306 28 1 322 35 472 +3615 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476455.jpg 500 287 62 163 75 349 202 0 243 59 499 286 0 0 0 261 283 65 253 196 270 213 65 146 204 173 214 +3616 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565761.jpg 478 640 62 54 268 121 365 56 163 319 253 448 56 152 500 311 632 56 266 380 289 422 0 236 292 277 389 0 201 274 264 384 0 466 334 477 395 0 292 344 312 403 41 260 376 274 391 58 0 441 218 536 63 172 292 208 322 0 264 309 477 632 0 458 339 470 361 27 242 317 245 329 27 299 358 302 373 56 299 377 318 399 56 360 495 382 528 0 221 326 372 549 +3617 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027789.jpg 640 480 62 136 168 266 276 57 294 227 574 375 57 0 334 235 474 0 359 136 508 479 65 364 229 386 244 65 99 413 135 420 65 106 423 126 447 73 243 395 269 414 73 249 400 273 417 73 67 362 114 382 73 253 408 271 417 73 245 389 263 406 73 87 411 112 446 +3618 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353096.jpg 500 344 62 106 23 399 277 64 444 289 495 321 66 99 277 395 322 +3619 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020038.jpg 640 480 62 445 34 542 132 57 1 195 197 364 56 0 356 206 479 56 422 180 639 392 +3620 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449338.jpg 640 427 14 252 175 307 207 14 302 203 348 225 +3621 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033924.jpg 480 640 15 87 37 334 233 0 246 353 479 627 59 0 0 479 640 79 190 226 333 429 +3622 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512479.jpg 640 426 15 31 100 436 353 57 0 0 639 425 0 419 52 633 225 65 215 374 317 397 59 0 0 640 426 +3623 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067207.jpg 640 480 15 533 406 639 479 0 97 45 325 479 0 313 100 484 474 72 0 148 146 393 73 598 88 620 169 73 610 88 637 168 58 66 89 109 153 58 0 59 48 154 65 391 225 410 239 65 278 57 300 79 65 211 153 228 198 65 459 162 475 175 73 625 109 639 168 56 0 369 130 442 57 3 368 173 479 60 1 425 170 473 +3624 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000118546.jpg 612 612 15 0 260 156 390 15 366 295 490 377 59 1 30 604 604 15 390 171 489 216 15 468 286 569 376 67 0 274 15 288 +3625 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042576.jpg 480 640 15 0 36 172 299 15 1 0 479 633 59 0 288 89 391 +3626 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236945.jpg 640 480 15 99 61 507 327 65 192 214 348 368 57 0 1 640 479 +3627 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226220.jpg 640 480 15 368 129 639 351 57 297 327 637 473 73 51 390 160 430 39 35 187 80 299 75 79 247 124 292 58 82 0 595 163 73 44 412 176 448 +3628 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490022.jpg 640 428 39 343 322 370 415 57 86 133 640 410 57 1 92 263 228 57 325 96 589 156 0 397 109 574 426 0 357 84 419 141 0 217 84 387 383 0 240 2 296 134 0 356 22 390 65 0 395 28 430 72 0 450 30 534 104 41 317 369 352 426 63 367 60 410 90 63 433 81 467 104 63 170 201 242 274 0 537 23 564 50 0 560 26 574 48 0 502 302 639 427 39 350 61 356 89 39 356 64 364 87 39 180 205 192 228 39 439 60 447 79 39 82 195 94 231 56 220 49 248 104 58 403 5 465 34 65 411 259 447 274 65 224 226 273 271 65 451 251 466 264 65 267 352 332 393 65 273 389 303 410 0 462 78 502 126 0 320 28 357 58 63 74 133 139 162 56 288 48 319 78 63 583 276 639 310 56 533 47 584 85 +3629 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489235.jpg 640 480 39 170 306 220 471 39 123 310 170 470 67 458 456 522 474 0 41 247 140 352 40 97 318 112 349 40 215 392 259 477 41 90 423 137 472 41 61 403 108 477 41 214 393 255 477 45 255 408 301 446 63 403 314 623 455 63 6 294 72 360 45 255 422 262 443 45 217 420 255 450 65 251 442 335 470 39 0 300 15 374 +3630 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112298.jpg 640 480 39 265 147 284 209 39 240 133 255 207 39 306 161 327 188 39 329 131 371 208 0 128 216 318 479 38 58 69 244 202 39 319 163 337 207 39 379 137 413 209 39 363 141 381 207 +3631 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005038.jpg 640 480 39 40 286 54 335 59 93 211 639 471 0 389 159 597 435 +3632 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000108051.jpg 640 347 39 430 5 486 82 60 7 7 633 339 41 460 88 546 220 41 319 8 371 105 53 194 123 443 295 0 418 7 631 171 39 74 8 121 51 +3633 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094501.jpg 639 640 39 473 0 638 364 42 0 397 429 536 55 116 229 412 475 55 222 119 392 236 60 0 127 639 639 +3634 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474021.jpg 500 375 39 188 310 200 355 74 317 211 324 218 57 20 271 352 374 0 17 81 224 369 0 250 16 499 368 0 329 124 416 368 65 367 184 379 197 65 166 171 181 213 65 261 264 290 342 73 316 160 341 183 73 278 176 310 224 0 183 258 283 374 65 83 202 109 219 73 312 255 320 273 73 293 154 304 175 73 313 184 338 205 73 296 134 301 150 73 310 136 319 155 73 307 230 316 248 73 281 225 289 244 73 302 253 312 271 74 408 198 424 210 73 339 143 347 160 73 332 143 338 159 73 326 140 332 157 73 265 132 373 292 +3635 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509379.jpg 640 425 39 440 240 452 272 59 215 184 639 417 59 211 174 468 339 24 304 218 351 253 62 0 174 30 303 26 242 216 301 250 26 302 218 351 253 +3636 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209007.jpg 500 375 39 488 254 499 333 57 0 57 417 370 0 110 93 334 370 0 209 28 401 368 65 231 230 287 265 65 431 346 489 367 65 463 325 499 347 73 367 114 392 124 73 364 120 395 131 75 459 256 496 309 +3637 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000206027.jpg 640 480 39 250 0 348 212 39 363 1 468 239 39 2 1 98 281 60 3 160 639 475 53 67 259 550 451 39 83 1 182 239 +3638 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225603.jpg 640 480 39 181 14 251 176 41 407 401 558 473 42 140 91 183 175 43 123 94 168 174 44 91 85 153 162 45 416 100 616 239 53 27 168 470 277 60 23 175 618 400 0 229 14 517 130 41 443 141 583 241 +3639 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209530.jpg 640 428 39 430 216 454 295 39 379 302 445 426 0 345 132 443 314 0 183 152 237 253 40 300 299 355 392 53 180 348 245 398 53 211 242 384 269 0 258 160 334 235 0 0 1 168 427 40 288 366 369 427 41 285 231 292 242 41 372 342 445 427 53 248 188 274 202 62 153 42 206 84 0 411 82 624 395 0 97 130 263 355 0 302 164 366 244 41 292 359 369 420 43 192 369 287 426 43 350 332 394 340 43 223 301 235 304 53 218 212 252 226 39 289 278 310 310 +3640 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440779.jpg 640 480 39 29 267 39 301 39 53 263 63 293 57 44 226 639 471 0 207 113 317 423 0 385 81 528 472 0 491 212 594 379 0 89 234 217 401 0 356 246 499 395 0 149 208 253 374 65 409 248 419 261 65 214 161 219 184 65 258 169 264 173 65 593 362 602 375 39 93 271 104 306 39 513 288 520 315 65 437 228 448 238 +3641 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532690.jpg 528 640 57 0 250 186 630 0 58 40 499 631 0 373 1 525 629 65 64 494 112 590 0 120 4 388 169 +3642 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271820.jpg 480 640 57 104 310 282 474 59 248 428 479 639 56 95 299 153 389 62 2 297 99 459 +3643 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426070.jpg 640 427 57 21 78 638 417 60 2 338 304 426 0 38 46 407 343 65 72 331 101 371 24 0 172 108 268 24 0 125 44 200 +3644 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370279.jpg 479 640 57 11 190 472 443 65 361 64 398 151 65 296 176 357 255 0 165 13 396 585 +3645 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180289.jpg 480 640 57 87 193 479 574 0 58 67 452 576 65 169 351 200 387 65 405 323 435 351 58 0 436 57 578 +3646 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549713.jpg 480 640 57 1 195 479 358 0 0 4 480 631 65 333 228 452 498 +3647 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570188.jpg 500 375 57 112 130 439 295 0 149 92 407 370 0 412 72 499 325 0 1 1 124 367 0 78 93 119 197 0 313 81 407 265 41 296 49 309 68 41 297 50 308 68 41 436 50 449 68 65 349 210 459 289 0 270 229 499 374 0 175 64 275 194 65 301 302 317 326 +3648 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570456.jpg 640 480 57 294 280 426 411 56 388 178 414 244 45 176 314 191 327 71 46 252 92 277 73 387 174 416 185 45 119 268 151 285 56 448 223 511 301 60 100 241 218 407 56 349 257 437 341 60 284 179 398 286 73 385 180 398 188 +3649 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038296.jpg 640 427 57 0 309 639 421 0 26 0 477 421 65 167 70 216 106 65 415 256 441 289 +3650 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322352.jpg 500 375 56 248 136 356 318 56 210 113 268 150 60 103 99 304 346 56 52 60 133 222 56 148 180 248 353 56 209 123 256 150 56 102 136 134 195 74 399 12 413 40 75 393 131 414 152 75 199 86 223 114 75 463 178 495 211 75 183 98 210 154 58 434 126 499 213 58 377 92 438 153 +3651 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073973.jpg 640 480 56 214 118 290 305 56 358 111 443 297 57 0 191 200 473 58 2 59 194 199 58 285 219 333 279 45 258 290 335 331 73 342 146 358 164 73 398 128 404 210 73 396 129 401 208 73 323 175 331 206 73 350 171 357 205 73 330 97 336 125 73 314 97 319 127 73 326 98 331 126 73 313 176 324 207 73 347 96 354 125 73 343 173 351 205 75 302 256 319 278 41 372 61 385 76 56 471 139 639 348 73 355 169 368 206 74 410 92 437 113 75 108 170 129 200 73 307 92 457 234 +3652 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073239.jpg 500 281 56 107 171 163 278 56 158 198 241 280 56 379 86 428 151 56 420 87 471 154 56 131 119 171 164 56 163 58 242 148 74 364 44 380 60 56 254 253 283 279 63 299 165 441 277 64 252 218 277 230 64 147 182 165 192 56 74 39 161 197 56 0 72 77 209 63 126 127 199 187 63 318 123 382 153 63 189 120 249 166 63 191 143 293 221 63 271 110 332 149 63 482 120 499 162 64 422 277 442 280 +3653 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348913.jpg 640 480 56 1 212 132 472 57 249 187 639 393 60 0 221 244 419 2 560 10 603 28 75 104 178 142 237 40 134 203 154 247 +3654 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304186.jpg 640 480 56 17 165 201 393 57 212 68 639 478 0 117 3 575 472 0 0 120 164 363 0 0 159 35 242 58 335 173 397 242 56 188 235 258 329 58 486 94 503 135 65 113 366 209 403 68 199 171 233 202 74 63 95 74 118 58 113 115 144 141 58 262 120 285 144 58 229 126 255 145 65 151 435 183 457 60 0 239 50 286 60 189 242 258 290 +3655 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514990.jpg 640 424 56 290 194 455 281 56 62 201 253 291 56 234 181 369 258 56 56 182 115 220 56 0 139 23 198 60 0 266 636 416 0 88 55 289 297 0 16 71 148 239 0 22 85 58 192 53 139 273 229 334 53 172 299 279 355 0 61 100 79 117 0 221 114 242 142 0 0 118 27 231 0 220 55 371 187 +3656 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000397.jpg 640 480 56 477 0 620 98 53 4 44 635 456 41 0 294 36 365 41 480 315 630 473 42 595 404 639 456 60 1 349 504 479 0 3 0 228 205 +3657 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358833.jpg 640 326 56 438 238 449 288 57 73 214 295 321 60 326 201 424 240 74 382 134 421 175 73 306 178 322 195 73 488 285 533 324 73 483 270 542 321 73 317 224 323 237 56 353 195 367 213 56 398 200 437 286 56 333 201 349 272 65 61 282 80 293 73 262 188 284 196 74 582 114 595 133 75 203 182 213 201 73 258 195 269 207 39 43 248 58 288 +3658 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312144.jpg 428 640 56 80 400 427 632 74 169 15 250 94 56 6 400 110 628 +3659 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515077.jpg 640 479 56 525 329 639 470 56 490 273 542 371 56 99 297 172 407 56 196 269 244 338 60 402 283 579 384 0 0 120 114 476 62 442 19 639 219 57 185 336 522 469 65 97 365 111 379 56 574 404 639 478 56 555 358 595 384 56 621 263 639 328 +3660 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524002.jpg 435 500 57 24 142 291 401 63 242 268 364 328 0 235 98 393 499 0 49 95 246 370 +3661 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364493.jpg 640 480 57 329 210 537 312 59 1 132 495 474 +3662 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554618.jpg 640 480 57 201 371 482 472 56 504 413 616 471 +3663 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428231.jpg 640 480 57 187 231 478 383 57 0 299 230 479 58 158 150 227 225 75 178 200 202 225 45 440 343 507 378 75 506 207 521 256 75 490 187 504 256 56 522 243 639 355 +3664 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182155.jpg 640 426 57 2 265 541 420 0 94 22 591 420 65 218 149 247 252 65 456 89 485 170 0 338 51 543 418 65 508 244 583 281 65 490 98 509 136 +3665 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000215259.jpg 336 500 57 0 221 118 375 0 177 95 281 449 0 20 79 224 447 65 163 146 180 159 65 275 159 285 168 65 199 161 216 177 65 260 158 276 190 65 304 332 330 343 +3666 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521613.jpg 640 207 57 311 89 449 174 57 133 86 192 143 58 21 81 58 129 58 289 29 344 117 58 513 0 539 38 58 223 91 229 102 56 133 84 192 139 56 248 82 295 126 57 247 83 295 120 +3667 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144228.jpg 640 480 57 0 97 188 477 57 140 57 639 479 0 190 53 369 473 0 284 111 554 471 73 34 28 102 53 73 74 69 125 96 65 383 200 454 289 65 240 214 304 285 73 75 31 120 45 +3668 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092985.jpg 640 413 57 0 42 381 406 0 210 63 639 406 0 356 1 639 343 65 320 291 390 397 73 475 12 629 197 +3669 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199449.jpg 640 480 57 82 139 412 338 65 373 225 403 234 15 237 197 296 230 56 489 119 609 264 65 378 222 413 230 +3670 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188460.jpg 640 480 57 406 225 639 479 0 245 40 567 471 0 334 178 436 298 63 235 277 348 395 65 309 300 381 328 65 292 401 312 418 66 559 353 589 405 65 304 317 341 337 66 318 377 355 392 +3671 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468954.jpg 640 427 57 70 55 639 422 0 0 0 322 421 0 92 3 622 422 65 350 319 487 367 65 440 372 480 410 65 323 124 359 150 65 331 327 363 369 +3672 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370839.jpg 640 480 57 145 107 246 216 57 0 263 71 478 67 43 189 58 200 0 0 137 165 324 0 348 403 523 479 65 318 32 333 51 65 544 103 564 113 62 474 98 589 275 39 320 145 327 158 41 306 148 316 163 67 456 435 470 450 0 170 26 361 422 +3673 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308156.jpg 428 640 57 1 236 201 390 57 131 194 297 278 57 0 444 42 631 40 120 342 137 394 40 111 335 128 385 73 136 336 190 365 56 235 234 347 346 56 316 240 426 386 41 190 346 208 366 +3674 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314812.jpg 480 640 57 0 216 174 422 0 60 163 324 628 73 141 77 168 81 73 254 140 262 163 73 169 69 178 101 62 309 164 368 224 65 55 389 97 424 73 187 75 191 97 73 169 61 192 64 73 140 58 173 67 73 140 71 171 77 73 458 236 470 260 56 251 296 333 471 63 343 188 436 266 73 315 132 328 164 73 182 106 223 121 73 244 142 246 161 73 446 393 473 405 73 450 384 463 392 73 138 52 479 449 +3675 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130076.jpg 333 500 57 2 269 64 472 0 30 48 314 494 74 204 48 248 97 65 283 245 310 275 73 263 128 332 184 73 194 107 207 158 73 221 115 240 163 73 186 219 201 271 73 215 123 221 158 73 236 90 254 166 73 207 118 215 159 +3676 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518039.jpg 640 427 60 0 0 639 426 41 417 0 527 119 41 301 0 388 63 42 0 147 213 230 45 76 59 162 108 45 181 23 278 72 45 1 17 73 136 53 258 224 549 423 53 60 83 540 417 44 191 39 244 60 +3677 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000573853.jpg 640 480 60 1 0 639 473 53 40 85 637 473 +3678 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471893.jpg 640 442 60 79 277 494 441 0 444 33 637 436 0 13 138 140 440 65 473 200 518 223 65 29 307 70 321 56 120 208 177 305 56 143 207 228 307 56 314 209 374 262 56 201 361 345 436 56 275 387 388 441 65 250 317 294 329 73 245 133 256 164 73 192 87 290 122 73 217 137 219 165 0 414 183 498 273 56 541 353 586 441 56 622 207 639 249 73 282 136 286 164 73 201 46 206 77 73 202 38 289 75 73 252 136 258 164 73 246 181 250 203 73 273 178 291 194 73 597 20 602 54 73 586 73 589 109 73 189 47 195 78 73 215 137 217 165 56 260 255 393 389 56 384 209 432 261 56 192 267 264 304 56 221 260 258 273 +3679 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100582.jpg 640 427 60 1 1 640 418 42 337 0 575 33 53 1 0 639 415 +3680 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171942.jpg 640 432 60 4 2 639 425 48 542 93 639 188 41 0 0 41 163 41 191 1 255 46 44 118 31 174 64 55 256 151 428 284 55 393 106 492 227 55 117 37 248 115 44 150 200 211 225 55 33 244 288 417 +3681 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376295.jpg 640 480 60 2 228 403 471 0 296 131 561 451 0 187 0 545 258 42 287 296 367 331 42 234 284 263 291 45 224 283 306 343 55 140 298 253 403 56 0 172 140 238 0 510 127 639 478 42 212 291 247 300 0 0 206 157 348 +3682 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316505.jpg 640 478 60 0 2 640 472 53 40 174 310 386 53 312 156 601 414 53 318 36 559 189 53 53 29 302 176 53 269 29 406 174 42 139 0 169 16 43 126 0 147 22 53 125 189 380 433 +3683 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185559.jpg 640 427 60 56 296 375 426 67 66 13 80 34 41 202 88 219 112 43 242 341 268 354 55 135 284 243 382 0 262 4 622 426 0 146 12 249 303 0 150 0 306 319 0 47 21 171 318 0 503 19 616 254 0 1 61 94 323 0 255 4 436 426 0 41 58 57 110 0 582 31 639 224 27 531 70 547 155 27 258 46 270 87 58 1 224 110 411 0 454 31 503 104 27 355 112 385 178 40 274 101 288 143 75 0 322 112 426 +3684 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328464.jpg 640 427 8 238 140 347 306 0 266 272 277 289 0 272 280 295 292 0 268 279 279 289 +3685 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066423.jpg 640 360 8 450 122 464 131 0 370 138 410 241 0 254 161 289 243 0 183 147 215 237 0 452 175 485 240 37 245 220 305 251 37 362 219 403 252 37 173 216 236 242 37 337 204 366 226 0 501 154 508 179 8 91 122 113 131 37 443 215 492 249 0 314 140 357 224 37 541 180 559 185 37 481 177 518 181 8 602 124 609 130 +3686 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569972.jpg 640 574 0 92 225 205 365 37 114 360 218 385 +3687 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201646.jpg 640 427 0 0 0 288 426 56 267 322 455 420 65 42 317 106 364 57 268 325 465 422 +3688 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000234251.jpg 640 427 0 160 17 492 426 65 134 110 218 170 57 140 1 639 425 +3689 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487659.jpg 640 426 25 236 56 270 70 32 248 176 260 189 38 409 196 493 261 0 355 85 520 366 0 471 128 510 184 0 298 198 328 219 0 154 165 181 201 0 49 173 76 227 0 35 174 62 210 0 18 194 39 226 0 501 99 534 151 0 317 141 340 160 0 188 146 206 176 0 287 185 309 220 56 49 120 66 131 56 50 106 65 116 56 3 92 20 108 56 345 97 361 108 56 175 53 193 69 56 188 66 203 80 56 204 51 219 64 56 337 81 354 94 56 354 78 369 89 56 536 100 558 122 56 63 120 83 140 0 15 177 27 208 0 180 167 197 197 56 181 72 191 81 25 31 28 63 35 56 602 75 627 92 56 2 0 639 227 0 0 0 639 227 +3690 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262810.jpg 480 640 27 64 246 74 300 27 236 260 250 309 60 75 402 338 639 0 243 207 328 401 0 171 203 275 384 0 23 214 90 359 0 154 217 222 312 0 319 228 356 302 0 289 89 479 632 60 1 342 183 426 0 201 222 217 240 55 147 322 280 423 +3691 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086646.jpg 640 480 27 394 271 438 306 56 10 399 51 478 0 333 123 563 472 0 98 171 285 471 0 593 215 639 479 44 237 254 272 267 44 370 222 388 239 55 207 248 473 473 42 233 253 271 267 27 615 268 638 285 42 370 222 395 237 0 273 209 317 254 +3692 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193332.jpg 640 426 27 185 140 240 218 0 27 33 385 420 0 149 15 384 418 43 390 217 473 230 50 318 297 355 334 55 439 181 588 332 60 289 376 588 418 +3693 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365317.jpg 640 427 32 190 98 200 106 0 343 156 418 360 38 305 129 359 184 +3694 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371552.jpg 640 427 32 152 329 200 378 0 304 116 339 181 0 29 199 148 234 0 134 149 176 225 32 567 209 583 222 0 560 182 607 219 0 183 56 288 373 0 348 139 381 220 13 277 194 355 219 13 276 179 352 194 +3695 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507180.jpg 612 612 32 24 478 127 585 0 213 28 508 602 0 388 24 490 324 0 93 12 317 524 0 71 22 194 225 0 0 35 44 258 0 382 75 384 86 0 373 75 380 86 0 472 43 574 396 +3696 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390585.jpg 640 427 32 369 227 391 249 0 223 72 352 400 38 59 163 236 242 +3697 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021746.jpg 640 425 32 256 195 279 217 0 79 56 286 423 38 65 174 233 252 0 212 0 299 71 0 375 0 429 119 0 51 0 100 142 0 98 0 144 93 +3698 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213830.jpg 640 427 32 393 218 408 226 0 491 202 511 239 0 200 171 311 311 0 276 191 388 420 38 203 172 417 356 32 407 239 410 241 56 20 236 52 279 0 0 203 35 285 0 411 204 438 258 56 23 232 27 242 +3699 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414698.jpg 640 427 32 98 120 130 152 0 218 107 621 420 0 379 92 530 194 0 140 97 228 214 0 525 71 627 186 0 259 101 317 211 0 0 96 63 265 38 248 57 355 301 56 130 192 195 254 56 56 195 141 261 0 587 149 639 252 0 191 118 272 260 +3700 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157938.jpg 500 266 32 270 139 285 149 0 235 57 337 240 0 344 3 388 141 0 431 31 490 159 38 324 133 386 161 +3701 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146627.jpg 640 427 32 411 51 556 193 0 318 94 602 311 24 297 65 398 219 28 144 3 298 187 0 76 113 497 420 +3702 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029719.jpg 640 424 32 248 330 353 422 0 291 0 500 418 +3703 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496152.jpg 640 427 32 342 193 351 204 38 224 255 268 335 0 216 125 353 367 0 366 148 398 197 0 104 148 127 195 0 82 142 107 194 0 50 151 62 180 0 418 179 436 197 0 497 151 520 190 0 547 161 571 189 0 197 158 210 169 0 145 148 170 201 0 122 149 148 201 0 128 182 149 201 0 344 160 366 197 0 1 107 639 217 +3704 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005124.jpg 558 640 32 177 88 231 142 0 0 196 134 484 0 116 206 219 454 0 206 188 270 453 0 196 219 553 584 +3705 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460676.jpg 286 409 32 240 148 253 156 38 152 222 182 301 38 14 312 47 348 0 45 244 129 386 0 142 43 258 374 +3706 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126098.jpg 640 443 32 407 155 450 198 0 268 103 422 359 0 568 28 625 169 +3707 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227741.jpg 640 427 32 350 249 366 265 0 317 0 469 414 38 239 71 363 129 +3708 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226498.jpg 640 478 32 343 335 356 348 0 370 273 422 345 0 117 282 139 319 0 480 279 499 317 0 394 260 411 292 0 325 273 352 333 0 244 286 251 307 0 266 289 273 308 2 408 291 430 300 0 133 272 164 328 0 186 290 194 307 2 511 292 538 301 0 297 287 305 306 0 315 290 318 302 2 279 286 322 304 2 321 292 331 299 0 545 287 559 316 0 373 267 431 352 0 404 277 635 318 +3709 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112394.jpg 640 425 32 284 164 304 183 0 17 4 249 334 38 170 118 282 159 +3710 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072797.jpg 438 640 32 306 321 325 339 38 236 290 357 365 0 194 126 357 548 32 129 360 138 369 +3711 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227048.jpg 640 427 32 235 308 242 314 0 179 232 194 262 0 214 232 224 258 0 279 279 390 386 38 232 314 281 337 38 512 228 541 241 38 180 238 185 242 32 201 284 204 286 32 194 276 197 279 32 247 277 249 279 0 576 218 589 231 32 393 272 395 274 32 160 280 163 283 32 233 279 236 282 32 321 274 324 276 32 636 245 637 246 0 539 200 564 288 +3712 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045685.jpg 500 375 32 200 240 208 248 0 228 115 344 282 38 352 220 391 230 38 199 205 234 253 +3713 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000184276.jpg 427 640 32 102 349 112 361 0 155 226 270 442 0 233 56 362 205 38 163 232 207 271 +3714 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126229.jpg 640 427 32 246 72 254 81 0 160 149 249 401 0 101 231 147 278 0 97 244 123 279 0 60 238 85 279 0 135 243 162 277 0 147 234 172 264 0 17 236 46 279 0 246 219 278 248 13 268 217 477 249 38 138 159 190 209 56 425 118 454 137 56 408 113 587 152 56 548 133 570 183 0 454 169 481 196 0 168 240 186 277 0 158 264 169 278 0 479 173 512 243 56 507 205 515 245 56 515 171 537 218 0 500 130 526 149 0 108 127 639 281 +3715 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443313.jpg 640 480 32 330 325 340 335 38 183 225 198 303 0 189 167 322 352 0 105 150 140 190 0 40 129 70 171 0 3 125 40 164 0 384 145 418 192 0 204 91 243 155 0 241 90 269 126 0 207 53 233 89 0 398 95 423 132 0 425 93 451 129 0 494 152 533 195 56 294 118 318 127 56 279 127 310 156 56 414 157 442 171 56 319 118 346 128 56 256 127 283 146 56 345 119 369 128 56 363 127 391 155 56 371 118 394 128 56 310 128 337 145 56 283 99 308 109 56 92 94 118 113 56 70 162 105 174 67 20 158 24 161 0 495 104 524 172 0 561 108 588 137 56 298 84 321 91 0 11 1 639 204 56 1 1 639 198 +3716 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029524.jpg 459 640 32 237 401 321 481 0 49 54 417 619 0 337 78 458 504 7 0 20 424 234 +3717 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487630.jpg 640 427 32 236 184 248 195 56 84 130 126 187 0 233 140 409 391 0 53 42 96 191 0 0 51 30 224 0 449 9 490 76 0 419 26 466 80 0 551 4 581 52 0 505 19 520 53 0 518 10 543 69 0 476 9 510 78 38 220 176 245 226 27 489 29 498 56 0 530 20 582 94 +3718 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240403.jpg 640 424 32 550 153 555 158 0 130 32 238 371 0 223 54 315 372 0 297 48 384 381 0 577 8 639 287 0 8 97 53 218 38 123 245 156 383 38 232 196 291 341 38 378 151 516 246 38 4 164 22 211 38 251 246 353 372 0 364 22 480 404 32 572 157 578 163 32 574 163 578 166 32 578 159 583 165 32 312 232 317 245 32 561 158 566 164 32 556 162 562 167 32 567 161 574 167 32 585 163 591 168 32 581 153 586 158 32 589 159 595 163 32 573 165 578 168 32 555 157 561 163 32 308 149 605 243 +3719 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367673.jpg 640 640 32 28 480 103 555 0 151 153 405 627 0 341 198 614 639 0 38 120 102 257 0 335 129 359 185 0 488 163 526 209 0 377 136 401 172 0 417 133 447 162 0 226 114 260 211 +3720 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316147.jpg 427 640 32 130 70 153 86 0 181 161 376 609 38 155 52 226 173 +3721 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392981.jpg 427 640 32 395 280 411 297 0 143 14 352 621 38 304 0 356 187 32 405 272 426 293 32 48 242 58 253 +3722 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355000.jpg 640 497 32 616 65 629 77 0 289 152 611 420 38 276 197 320 217 +3723 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371289.jpg 640 428 32 250 112 256 118 0 406 16 523 400 0 172 125 267 356 0 336 210 339 217 38 191 191 229 196 38 405 166 441 213 +3724 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474028.jpg 640 427 32 135 289 186 340 0 407 76 596 361 0 591 142 636 253 0 235 156 274 261 0 119 176 178 230 0 106 152 151 265 0 75 173 112 271 0 20 176 57 267 0 501 145 543 219 0 537 170 558 231 0 126 224 317 396 0 220 198 233 242 0 0 199 11 251 0 578 215 585 228 0 1 213 588 248 +3725 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516913.jpg 480 640 32 300 414 323 438 0 0 1 87 162 38 287 35 337 208 0 102 73 345 561 56 11 96 80 158 +3726 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000427223.jpg 454 640 32 427 408 452 443 0 115 56 453 632 38 0 336 151 460 +3727 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510791.jpg 640 428 32 322 194 330 206 0 248 44 366 372 38 228 203 261 288 +3728 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308759.jpg 640 467 32 228 138 249 156 0 145 4 296 458 38 247 85 322 153 +3729 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075775.jpg 640 428 32 389 302 394 307 32 392 262 396 265 0 205 187 257 331 0 267 211 292 276 0 499 186 542 317 13 434 253 495 327 38 252 240 274 255 0 390 251 432 324 32 332 242 334 244 +3730 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160185.jpg 640 426 32 216 353 267 401 13 529 50 564 58 0 250 23 466 409 0 0 48 133 322 0 568 150 595 176 0 360 12 391 64 0 197 10 227 61 0 31 3 51 19 0 452 129 480 172 0 0 0 25 63 0 307 0 331 32 0 328 3 351 36 0 502 134 536 171 0 567 16 596 65 13 142 35 163 55 0 493 119 513 151 0 13 0 639 374 +3731 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233968.jpg 427 640 32 0 542 21 620 0 14 44 270 614 0 211 10 425 579 +3732 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179487.jpg 512 640 32 181 340 206 363 32 396 250 408 263 0 140 224 375 582 0 225 168 279 229 0 184 156 209 188 0 18 129 82 255 0 173 143 245 247 0 108 150 180 258 38 249 295 298 385 0 64 194 131 257 0 81 133 129 189 0 455 198 511 418 0 264 131 279 206 0 228 125 277 187 0 334 113 407 401 0 0 159 41 264 +3733 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094012.jpg 265 500 32 159 41 171 53 0 37 104 208 482 38 119 39 149 105 32 2 343 5 346 32 224 308 225 309 +3734 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205594.jpg 640 575 32 227 296 287 358 0 284 147 516 532 0 80 101 217 427 0 247 94 287 192 0 176 125 288 451 +3735 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361027.jpg 640 427 32 557 197 568 209 0 250 154 389 343 38 364 255 383 321 +3736 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541197.jpg 640 427 32 419 247 428 256 38 364 283 395 351 38 414 275 460 292 0 336 164 394 369 0 408 170 514 374 0 542 202 585 281 0 559 163 601 224 0 600 179 626 224 0 266 164 297 223 0 609 198 635 225 0 309 160 344 221 0 238 174 270 220 0 621 166 639 198 0 100 173 135 299 32 156 269 161 274 56 167 226 208 275 0 121 180 167 294 32 465 269 470 275 56 427 192 450 217 56 370 191 394 215 56 316 206 342 220 56 400 190 425 219 56 293 190 313 205 56 263 205 285 222 56 198 203 209 217 56 541 192 562 205 56 290 206 314 220 56 373 206 395 222 0 187 162 215 203 56 258 189 267 199 0 163 157 247 231 +3737 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331196.jpg 447 640 32 75 28 111 47 38 90 8 147 165 0 125 153 287 607 +3738 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372230.jpg 640 427 32 402 144 424 165 38 116 205 225 302 0 95 19 385 414 0 354 49 402 92 0 402 41 459 90 0 129 20 182 88 0 183 6 237 86 0 516 41 579 82 0 0 62 42 110 0 143 62 199 104 0 91 66 137 107 0 352 16 412 87 0 22 22 72 83 0 450 34 475 87 0 28 57 82 110 0 1 0 628 314 +3739 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483531.jpg 640 480 59 109 262 639 479 +3740 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430286.jpg 640 473 59 0 0 638 465 65 158 15 258 158 65 398 22 496 170 65 302 33 383 158 +3741 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000466570.jpg 480 640 59 0 28 480 632 77 327 110 405 176 77 209 463 328 629 77 158 423 231 568 77 102 399 177 522 77 269 203 325 271 77 223 192 281 268 77 312 182 384 268 77 329 162 392 247 77 348 152 377 173 77 324 540 387 639 +3742 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508822.jpg 427 640 59 1 136 426 630 0 79 121 401 632 41 156 402 200 470 77 285 266 376 383 77 321 282 426 405 +3743 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537025.jpg 640 425 59 0 0 639 425 +3744 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221000.jpg 640 480 59 30 184 639 472 0 175 55 634 278 0 35 169 164 294 56 147 183 199 249 0 315 97 383 214 26 0 260 57 316 +3745 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173081.jpg 640 349 59 34 70 178 230 59 197 80 327 130 59 462 152 639 345 59 319 85 609 283 +3746 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061717.jpg 640 425 59 0 179 525 424 56 386 181 519 253 +3747 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544611.jpg 640 480 59 328 251 638 479 0 0 213 88 431 0 62 228 107 338 0 133 216 144 230 0 213 259 258 469 0 238 237 344 474 0 277 216 294 240 0 378 214 391 233 0 522 228 621 417 0 58 182 109 280 0 583 253 639 441 2 250 204 280 223 2 281 206 313 221 11 493 82 546 137 26 83 262 96 350 26 5 325 76 402 67 329 185 344 192 67 72 282 82 288 0 41 237 88 365 2 322 207 368 225 2 414 203 430 222 2 450 204 466 214 2 462 205 472 209 0 146 235 189 337 0 202 222 219 240 2 170 203 187 219 11 381 111 403 157 0 1 168 639 479 +3748 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387576.jpg 612 612 59 1 0 610 605 77 157 140 272 244 +3749 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000374641.jpg 640 428 59 0 212 631 418 +3750 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071451.jpg 383 640 59 1 168 382 632 +3751 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262162.jpg 640 480 59 1 308 448 474 56 197 188 346 347 64 437 244 456 253 66 341 238 424 254 73 516 309 618 338 73 533 302 628 326 41 340 216 358 237 62 468 178 504 249 63 375 198 451 246 41 325 215 336 232 +3752 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441072.jpg 640 480 59 159 132 559 402 59 2 211 326 474 59 396 115 639 261 56 547 426 639 479 +3753 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200725.jpg 640 478 59 85 165 608 456 +3754 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208417.jpg 375 500 59 1 224 373 494 +3755 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256566.jpg 640 480 59 0 3 640 470 0 96 121 552 387 +3756 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170442.jpg 640 480 59 0 210 609 474 67 242 338 253 343 24 106 260 163 321 28 4 335 68 377 65 232 343 246 356 67 232 344 246 356 56 53 257 199 362 +3757 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468129.jpg 375 500 59 0 123 374 493 0 7 1 374 479 65 12 288 166 373 73 65 24 143 43 73 80 18 126 30 73 76 44 124 56 73 0 29 23 51 73 60 26 129 50 73 0 61 21 65 73 63 52 116 73 73 22 43 43 61 73 0 42 26 61 73 71 6 137 20 73 0 71 18 77 73 74 13 121 24 73 27 67 51 71 73 64 0 368 276 +3758 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518818.jpg 480 640 59 4 32 479 628 +3759 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141807.jpg 427 640 59 0 260 174 632 73 75 297 78 329 73 83 309 85 340 73 81 304 86 334 58 75 183 162 310 +3760 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415882.jpg 544 640 59 0 327 343 630 0 21 211 331 536 +3761 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268322.jpg 640 366 59 196 0 639 360 56 112 185 207 239 +3762 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443797.jpg 640 427 59 0 237 261 420 73 235 223 269 236 73 232 203 252 207 +3763 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469857.jpg 480 640 59 1 284 477 627 +3764 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358231.jpg 640 480 59 0 97 640 472 0 272 213 400 338 0 414 236 516 351 73 81 242 139 257 73 73 218 135 236 41 159 230 189 288 73 74 229 139 246 73 64 246 160 272 73 65 263 158 277 73 76 237 140 251 74 204 258 237 291 +3765 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314023.jpg 640 480 59 46 177 639 473 0 292 0 472 404 56 0 374 153 471 +3766 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296897.jpg 478 640 59 14 415 473 629 +3767 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460022.jpg 640 360 59 1 80 636 355 59 0 79 257 287 41 208 260 248 289 41 266 259 304 291 44 206 279 214 289 73 219 190 291 209 65 285 201 314 208 65 279 189 315 200 +3768 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452947.jpg 640 427 59 64 206 375 421 56 433 299 496 426 39 458 251 467 279 65 564 326 572 328 66 560 310 574 336 +3769 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000065074.jpg 424 640 59 2 229 423 616 73 322 305 347 320 +3770 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247788.jpg 640 466 59 1 68 528 380 0 249 44 539 347 +3771 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105866.jpg 500 333 59 156 154 451 332 59 92 156 280 273 47 21 285 48 310 49 88 252 101 270 75 196 159 200 184 47 93 266 117 284 47 33 297 54 316 +3772 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091716.jpg 427 640 59 17 523 426 629 +3773 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546649.jpg 640 480 59 1 378 491 479 59 198 254 417 379 56 0 259 57 336 +3774 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106793.jpg 640 360 59 0 0 579 355 0 293 144 474 316 0 247 105 433 225 +3775 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000575079.jpg 640 427 59 1 67 639 423 +3776 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497488.jpg 640 480 59 2 272 366 380 56 430 204 568 456 73 240 167 303 228 73 243 43 393 93 73 246 98 391 147 73 294 21 322 25 39 317 165 329 201 39 355 3 365 40 39 372 1 384 39 41 373 126 390 145 73 475 235 517 238 73 602 168 639 188 41 303 77 321 94 41 246 118 262 147 41 357 79 373 91 41 396 232 417 246 73 260 17 282 42 73 293 25 324 42 73 216 221 276 232 73 602 220 639 235 73 438 227 521 242 +3777 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210671.jpg 640 427 59 175 109 609 412 +3778 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086839.jpg 640 366 59 87 133 475 359 56 525 158 639 295 56 403 111 509 250 +3779 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044989.jpg 640 425 59 0 258 638 418 73 259 327 405 399 +3780 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159606.jpg 640 428 59 149 19 363 312 59 295 257 639 422 56 57 199 147 357 56 258 217 304 282 56 438 223 533 322 39 431 217 445 253 41 375 223 391 234 41 372 247 383 254 56 328 250 398 332 73 424 247 449 258 73 422 253 453 269 75 405 188 417 209 0 8 127 61 324 56 264 280 324 323 +3781 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060448.jpg 640 480 59 0 249 548 479 0 56 138 548 337 28 474 317 547 477 +3782 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188109.jpg 640 361 59 20 103 454 355 56 449 317 639 359 28 336 268 495 360 +3783 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512112.jpg 480 640 59 0 252 479 639 0 160 0 479 604 77 437 136 479 197 77 205 355 303 439 77 428 279 479 350 +3784 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007795.jpg 640 427 59 0 191 453 417 59 163 189 482 310 74 133 245 141 257 65 625 256 639 261 +3785 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470161.jpg 640 427 59 3 93 639 419 0 51 14 607 390 73 39 332 130 421 +3786 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136181.jpg 640 366 59 102 110 531 360 +3787 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287484.jpg 640 426 59 37 127 625 420 73 52 148 81 159 73 52 114 90 123 73 55 125 80 129 73 60 137 84 144 73 53 162 77 168 73 530 150 563 172 +3788 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554266.jpg 640 253 59 273 149 538 233 0 274 130 407 233 0 376 130 627 232 59 75 214 142 249 +3789 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064760.jpg 480 640 67 158 57 188 109 60 69 329 479 636 0 78 46 136 235 0 194 86 337 214 53 323 439 447 518 53 96 453 261 566 53 60 375 194 452 53 207 200 340 238 53 206 229 349 266 53 206 252 334 277 53 216 322 335 360 53 212 358 330 401 53 209 283 345 321 53 213 390 342 422 60 34 231 123 363 60 38 152 98 189 0 0 96 45 344 53 234 417 324 434 0 105 9 236 384 +3790 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333150.jpg 640 480 67 44 276 122 327 63 139 107 607 460 0 143 89 224 221 0 1 85 74 286 56 40 142 147 266 56 90 124 130 144 65 170 231 217 264 0 292 72 326 107 0 62 63 100 105 0 446 67 494 112 0 228 75 270 128 0 33 83 84 222 0 73 70 135 134 0 18 78 35 92 0 260 84 293 107 0 403 63 417 75 56 581 258 619 331 56 213 124 247 188 56 72 121 87 165 56 564 248 587 330 0 478 78 521 113 0 542 87 601 165 0 56 60 639 338 +3791 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000098095.jpg 375 500 67 4 459 22 470 0 117 73 373 494 0 69 346 219 499 0 162 339 243 499 57 1 367 195 434 65 134 442 207 485 0 0 344 75 499 67 227 462 239 474 65 134 260 159 276 +3792 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150417.jpg 640 480 72 280 0 513 262 56 105 147 284 325 60 182 167 591 472 0 112 70 341 334 41 477 191 503 234 45 358 242 467 333 55 269 308 383 401 41 51 107 68 124 41 34 102 50 124 41 358 242 467 335 41 350 234 388 278 0 379 2 639 449 +3793 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034056.jpg 427 640 72 102 140 243 372 0 128 34 422 628 53 65 364 213 432 39 0 383 28 458 69 103 267 165 353 +3794 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000129566.jpg 640 484 74 338 164 358 188 56 320 227 576 483 56 65 270 127 404 56 211 270 240 328 56 168 270 187 286 56 307 261 379 382 56 424 260 493 346 56 88 270 115 378 60 111 282 228 396 41 308 203 313 210 41 297 184 303 189 41 300 205 305 210 75 135 267 144 290 41 293 207 298 212 59 435 292 454 320 +3795 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145520.jpg 500 375 79 0 8 44 96 41 22 92 162 230 79 24 78 98 220 +3796 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080172.jpg 480 640 79 94 306 263 457 61 345 274 479 638 0 0 0 417 631 +3797 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190595.jpg 500 335 79 280 213 352 291 0 206 51 417 330 71 134 197 499 312 +3798 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016257.jpg 424 640 79 283 263 324 360 0 86 7 423 629 +3799 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034689.jpg 640 427 79 217 29 300 189 75 242 180 425 415 +3800 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207060.jpg 640 426 79 80 271 639 354 +3801 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289633.jpg 640 426 79 184 296 351 424 0 65 0 637 419 +3802 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086249.jpg 640 427 79 43 233 369 293 0 21 5 639 421 0 3 0 507 410 +3803 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441500.jpg 640 427 79 264 195 290 243 79 294 188 305 199 0 161 56 454 420 +3804 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014591.jpg 640 640 79 171 314 340 466 0 136 60 639 632 41 153 306 200 363 41 163 301 206 363 79 176 266 189 312 +3805 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469085.jpg 640 480 79 267 383 312 399 79 153 326 173 340 0 185 113 365 472 0 339 157 505 478 0 425 164 623 476 0 15 77 195 474 +3806 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252403.jpg 500 375 79 43 114 392 270 0 0 1 500 369 +3807 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476172.jpg 640 424 79 34 351 639 415 60 4 1 638 417 +3808 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290515.jpg 640 361 79 326 149 418 226 0 0 2 371 281 71 45 73 639 355 +3809 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410583.jpg 459 500 79 273 321 458 499 0 0 0 459 500 +3810 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000547137.jpg 640 481 79 152 296 181 329 79 371 170 439 195 79 113 283 129 331 79 142 280 165 332 0 273 19 639 477 71 81 395 283 417 39 85 234 114 335 77 55 118 84 176 +3811 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385320.jpg 480 640 79 131 212 227 454 0 30 1 392 632 73 71 215 84 306 73 82 215 94 296 73 113 214 127 248 73 91 209 113 273 73 70 123 80 197 73 101 116 112 191 73 74 104 93 195 73 93 110 102 192 +3812 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000148170.jpg 375 500 79 182 221 248 290 0 14 60 280 375 0 0 0 139 295 +3813 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000364188.jpg 359 640 79 213 398 253 455 0 2 0 358 631 +3814 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177375.jpg 640 480 79 200 87 241 148 56 571 267 639 473 56 340 183 388 234 0 203 0 576 479 0 114 1 262 272 0 8 42 143 370 73 230 209 322 251 72 488 15 621 241 0 0 1 91 473 73 140 284 380 421 0 482 60 523 173 26 262 106 290 159 26 106 21 147 53 26 68 128 91 166 26 64 24 89 53 26 263 64 308 98 +3815 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193405.jpg 375 500 79 230 160 245 220 0 114 59 285 498 71 238 223 374 326 61 72 375 150 494 +3816 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200638.jpg 426 640 79 274 349 335 384 56 77 376 234 632 41 325 364 378 418 41 298 349 327 383 41 295 385 325 420 41 274 384 299 415 41 363 381 394 415 41 334 359 367 373 79 336 350 344 362 79 365 356 375 369 79 283 336 299 352 +3817 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252388.jpg 640 480 79 351 235 389 318 0 121 57 412 474 0 4 3 394 470 71 217 301 639 479 79 0 31 176 172 +3818 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514241.jpg 606 640 79 418 112 548 592 79 520 0 605 320 79 266 0 324 74 79 88 55 208 503 +3819 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566298.jpg 500 375 79 353 183 374 247 79 168 260 249 274 79 3 171 56 229 0 131 136 317 370 0 197 1 499 370 0 0 0 187 368 +3820 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376441.jpg 640 427 2 145 36 232 72 0 183 65 300 389 0 300 74 427 383 0 154 129 179 157 37 103 155 351 291 +3821 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379162.jpg 640 427 39 335 341 353 404 56 285 145 453 388 56 53 145 217 391 0 97 0 215 376 0 366 1 518 99 38 208 290 284 411 0 273 39 447 409 0 171 0 263 98 39 353 344 373 409 26 21 114 220 271 +3822 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097048.jpg 600 400 56 527 19 560 66 56 173 0 201 38 0 382 117 439 209 0 335 22 373 78 0 154 0 189 61 13 455 291 517 372 38 432 114 449 143 0 350 241 399 321 32 326 200 331 204 32 361 255 365 259 56 376 276 416 304 56 342 3 377 46 +3823 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004092.jpg 512 640 56 432 245 511 600 0 1 90 477 632 65 212 572 274 603 65 330 540 381 594 +3824 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081000.jpg 480 640 56 436 354 479 517 56 173 329 309 565 75 369 239 399 285 75 397 239 430 286 60 353 447 480 622 56 0 358 25 537 +3825 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434787.jpg 612 612 56 285 121 377 286 56 509 110 574 253 0 0 76 299 536 0 464 75 560 246 0 356 74 444 204 0 233 79 358 267 41 434 284 489 351 53 193 317 482 484 41 475 310 555 408 42 214 284 280 319 43 478 426 609 519 60 33 176 310 228 41 486 264 540 313 56 379 200 431 216 56 151 488 273 534 60 171 250 611 537 60 411 106 543 247 0 505 164 610 296 0 1 78 70 236 +3826 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455767.jpg 640 480 56 98 289 209 442 56 153 303 251 474 60 176 312 400 389 0 216 107 320 475 0 331 37 559 470 45 373 320 402 333 45 344 317 368 332 65 330 265 380 283 45 322 323 347 334 56 372 299 403 321 56 547 317 564 387 +3827 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075527.jpg 640 480 56 37 254 123 389 0 107 73 443 471 43 245 284 355 337 53 257 333 399 391 53 186 294 370 386 72 0 236 51 419 +3828 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479557.jpg 640 480 56 0 341 102 411 0 245 51 459 474 0 104 309 122 351 0 97 311 112 351 0 93 308 105 343 0 484 370 529 424 0 619 322 623 328 56 223 338 278 391 0 272 314 276 328 0 136 288 159 336 0 519 326 531 358 0 495 314 500 323 0 122 309 141 350 0 451 313 459 321 37 101 217 287 443 0 1 290 581 389 +3829 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000139141.jpg 640 423 56 1 365 68 417 0 124 92 358 417 0 341 40 632 422 65 294 258 354 365 65 121 237 143 271 56 72 333 221 415 +3830 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091079.jpg 640 483 56 490 293 572 482 56 499 272 528 339 56 262 291 325 476 56 291 274 318 345 60 281 268 558 480 40 434 274 448 308 40 364 283 381 309 40 355 306 376 350 40 445 295 465 343 45 31 313 81 324 45 0 331 31 346 45 29 380 68 400 41 479 334 516 386 41 119 443 139 463 41 113 438 134 449 41 101 436 120 453 41 83 439 99 453 41 84 452 103 465 41 101 450 124 469 45 382 314 443 338 +3831 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151704.jpg 375 500 56 46 247 169 369 57 47 250 168 369 0 0 248 82 496 62 308 188 354 222 65 141 190 151 199 73 68 381 96 408 57 211 450 374 499 73 77 411 105 428 0 131 126 276 499 +3832 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133244.jpg 640 359 56 367 118 432 186 56 218 73 279 134 38 241 218 263 270 0 199 107 323 311 0 380 37 415 82 0 105 35 151 82 0 138 5 177 77 0 492 32 547 83 0 297 34 333 82 0 417 38 456 82 0 325 12 360 67 0 331 49 361 82 0 74 35 112 83 0 543 131 606 203 0 459 35 499 83 56 419 96 484 186 56 186 20 209 77 56 234 55 277 76 0 256 38 296 84 39 439 171 446 187 0 1 0 639 116 +3833 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221303.jpg 640 480 56 227 122 274 135 56 0 182 39 249 0 416 53 520 337 0 132 143 292 478 0 117 45 216 352 0 271 64 392 343 65 437 191 445 203 65 174 177 182 184 65 261 139 281 164 56 346 140 364 209 56 117 130 144 232 56 427 91 450 128 65 357 236 371 245 +3834 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472691.jpg 640 480 56 143 0 624 139 60 1 87 639 472 0 155 0 509 126 53 61 124 363 460 53 351 148 639 356 +3835 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277984.jpg 640 480 56 358 216 494 406 56 564 277 639 479 60 492 217 639 433 75 579 212 599 266 75 578 201 597 233 39 519 175 549 237 73 394 453 445 463 73 355 388 485 473 73 47 294 72 312 56 108 285 384 478 56 182 223 367 333 58 561 175 609 234 73 6 362 43 380 73 38 318 49 335 73 56 300 72 317 +3836 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000031521.jpg 426 640 56 263 366 425 639 0 142 261 379 549 40 154 316 184 371 60 0 414 220 518 63 35 350 157 459 71 127 221 345 241 58 147 138 217 189 58 212 155 277 193 56 23 501 161 639 +3837 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229713.jpg 640 427 60 0 204 639 389 0 308 1 469 210 53 3 212 427 380 73 534 99 638 151 73 501 176 639 213 73 605 159 639 186 56 0 66 15 207 +3838 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286146.jpg 640 428 60 1 2 639 422 43 425 258 494 409 45 363 110 479 209 55 95 214 453 421 43 389 1 456 43 42 394 111 441 144 42 381 165 468 186 42 369 121 461 156 42 383 121 451 169 42 406 111 442 141 42 394 130 478 176 42 404 161 479 177 42 402 165 449 181 42 402 153 480 175 48 503 114 542 133 45 455 26 519 68 48 542 138 580 166 +3839 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551129.jpg 640 480 60 1 2 626 467 53 176 199 503 473 53 266 20 497 171 53 392 151 604 280 52 1 6 265 297 +3840 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053183.jpg 478 640 60 0 335 477 639 0 139 3 409 366 41 34 318 94 401 42 150 272 230 319 42 112 345 229 380 43 98 347 218 401 44 147 271 227 319 53 48 418 396 626 41 59 298 106 366 43 0 513 46 575 45 404 436 477 554 45 443 384 477 441 45 0 397 87 461 45 0 471 10 528 13 0 136 225 346 0 431 179 477 387 +3841 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348973.jpg 427 640 60 10 292 426 627 44 65 461 120 561 45 239 421 352 511 45 147 448 240 520 45 7 515 105 624 53 78 347 274 462 0 172 61 354 391 56 131 229 419 425 43 57 477 150 519 +3842 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567877.jpg 640 360 60 369 241 639 321 60 0 245 211 358 0 102 9 330 359 0 426 146 518 252 0 546 86 639 203 0 82 110 159 242 56 317 0 638 355 56 0 0 289 360 55 6 242 141 291 55 437 242 577 300 57 320 0 639 353 57 0 152 67 210 +3843 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229286.jpg 477 640 60 0 356 476 639 0 51 5 428 399 55 127 356 374 536 45 0 266 60 309 63 362 484 476 638 45 0 307 96 442 44 443 321 458 337 +3844 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292363.jpg 612 612 60 1 0 611 602 42 0 301 526 611 53 11 0 611 567 +3845 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272117.jpg 640 428 60 3 267 485 422 0 351 140 553 369 0 201 155 351 338 0 172 185 213 256 41 186 279 219 340 41 287 307 321 387 45 334 365 385 398 55 10 317 175 417 0 154 186 175 210 41 127 230 139 251 45 98 237 118 242 45 252 403 309 427 0 407 0 639 420 41 258 316 302 404 56 95 253 180 287 56 176 258 221 279 0 175 187 187 210 0 119 159 134 209 45 237 332 258 366 60 95 231 206 258 0 1 40 119 281 +3846 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533097.jpg 640 426 60 5 52 637 419 41 89 11 207 214 53 205 234 377 378 53 187 151 562 379 +3847 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000454161.jpg 490 640 60 0 4 490 628 40 5 2 141 253 42 48 218 365 325 53 54 280 295 487 53 107 2 489 223 +3848 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000078929.jpg 640 359 60 0 2 640 353 41 0 0 28 178 44 530 149 639 185 45 287 100 545 195 45 227 72 406 127 44 539 137 639 171 48 4 100 308 279 48 164 142 464 316 48 425 49 523 103 0 170 0 552 66 48 369 45 441 89 48 309 39 395 72 +3849 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056633.jpg 640 478 60 4 1 639 471 41 360 0 428 76 45 424 3 495 67 45 274 0 362 50 53 52 60 604 471 41 488 0 554 52 41 555 0 639 108 +3850 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475398.jpg 424 640 60 188 262 422 631 0 17 14 281 625 55 217 275 366 369 45 399 228 423 284 71 301 188 423 203 +3851 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113440.jpg 640 427 60 0 137 639 421 43 190 63 558 156 55 161 110 455 350 56 2 72 117 199 0 448 0 639 120 +3852 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089618.jpg 640 427 60 0 9 639 420 40 574 2 639 83 42 71 290 232 418 43 582 278 637 377 43 69 66 192 137 53 202 62 567 278 42 410 48 517 102 53 270 45 412 105 0 42 0 552 43 +3853 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201452.jpg 640 229 0 173 45 234 201 0 102 48 141 190 37 204 81 243 136 37 72 87 155 129 +3854 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141574.jpg 640 427 0 497 211 542 272 0 401 129 421 157 0 122 174 162 202 0 156 171 177 190 0 185 169 204 186 0 388 143 404 169 0 446 177 465 203 37 412 180 446 201 37 155 185 189 203 37 88 212 103 233 37 364 166 389 170 37 381 152 441 158 37 511 142 529 149 37 500 261 530 274 37 14 75 31 81 37 224 82 233 90 0 461 115 476 136 0 70 204 98 234 0 550 123 569 145 0 241 76 252 90 0 11 67 65 86 +3855 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461898.jpg 640 636 0 110 18 623 628 65 402 331 452 382 +3856 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077181.jpg 640 457 0 1 0 379 448 0 1 0 189 220 0 219 125 286 259 0 423 0 476 208 0 158 0 217 33 39 401 206 466 307 0 417 1 639 442 0 152 178 241 307 +3857 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437298.jpg 640 427 0 279 187 318 228 0 547 214 568 227 37 295 224 318 234 0 25 183 42 203 +3858 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140987.jpg 425 640 0 58 137 367 433 0 264 100 424 325 41 387 335 424 473 41 283 466 424 639 53 104 412 293 521 41 17 219 47 257 41 281 194 313 232 56 297 330 360 408 56 322 260 424 419 56 78 301 97 340 0 15 118 154 434 0 138 100 203 142 0 1 66 68 222 0 272 131 335 222 58 351 37 424 139 58 217 56 333 154 60 8 248 71 295 60 3 417 407 639 +3859 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000320696.jpg 640 427 0 237 158 387 300 37 270 274 364 318 +3860 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498807.jpg 640 426 0 106 34 424 347 37 254 286 455 365 +3861 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179500.jpg 387 640 0 0 24 321 639 38 42 306 163 639 +3862 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000274066.jpg 640 427 0 262 154 445 319 0 406 109 522 226 0 415 45 504 132 37 11 209 267 342 0 373 185 401 210 0 171 87 327 280 37 352 112 408 129 37 476 212 578 251 37 478 122 511 130 +3863 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467138.jpg 427 640 0 112 64 382 620 0 40 27 123 173 0 122 3 237 171 0 238 8 332 162 0 320 22 425 162 0 84 2 148 81 38 46 140 156 315 56 21 5 88 177 56 0 64 54 91 56 359 44 426 104 56 0 0 22 29 56 347 0 376 44 0 392 0 426 48 0 0 0 40 63 0 270 0 332 75 0 180 0 274 75 +3864 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504733.jpg 640 427 0 242 77 534 421 0 67 1 195 255 38 189 344 351 421 0 603 0 639 171 32 304 403 346 426 38 0 65 57 239 38 148 72 205 248 0 220 0 301 239 0 0 3 54 259 38 577 113 629 221 +3865 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008190.jpg 640 427 0 208 62 291 142 37 242 112 304 160 +3866 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182681.jpg 640 427 0 152 126 222 375 38 140 115 202 160 32 633 54 639 66 +3867 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250301.jpg 640 426 0 162 216 194 294 0 283 210 327 313 0 357 204 395 251 0 325 170 375 327 0 450 201 493 345 0 236 177 292 293 0 482 196 542 317 37 311 255 456 283 37 500 204 561 270 37 383 307 449 321 0 354 216 389 311 37 236 224 259 275 +3868 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465588.jpg 640 400 0 282 130 394 253 37 327 228 422 261 +3869 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546188.jpg 640 596 0 315 174 449 320 37 335 315 416 330 +3870 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208376.jpg 525 525 0 182 62 345 457 38 303 289 353 375 38 291 319 339 388 +3871 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213359.jpg 427 640 0 280 107 426 392 0 28 55 365 408 53 48 414 373 602 43 68 356 170 404 60 13 254 106 261 60 1 369 426 629 +3872 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000002261.jpg 640 427 0 283 152 381 271 37 265 250 351 295 +3873 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126064.jpg 640 427 0 171 134 351 272 37 153 125 212 220 +3874 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066072.jpg 640 480 0 129 135 245 298 37 115 265 366 330 +3875 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316438.jpg 640 427 0 346 0 639 166 45 64 0 345 80 53 0 117 463 422 60 2 2 639 420 +3876 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265374.jpg 480 640 0 177 212 302 530 38 91 371 190 447 +3877 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218678.jpg 640 427 0 296 148 405 231 37 392 114 410 187 +3878 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156924.jpg 500 333 0 178 89 467 329 65 179 309 208 326 56 115 184 162 331 65 33 156 65 176 0 51 44 294 326 65 122 142 137 156 65 266 166 289 196 +3879 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462466.jpg 640 425 0 500 142 637 418 0 392 99 578 416 0 576 23 639 154 0 325 51 479 301 43 297 206 351 234 55 252 231 374 293 0 617 88 639 144 41 361 223 382 246 41 343 220 363 241 41 383 229 397 250 41 154 260 181 293 41 379 215 396 233 44 186 235 191 247 58 275 142 358 234 0 498 74 581 145 41 361 211 382 225 41 177 234 194 278 42 161 241 171 256 60 51 143 416 424 +3880 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000025595.jpg 640 480 0 227 11 469 267 41 480 292 530 358 44 538 334 625 375 53 253 303 346 348 53 363 291 462 338 56 554 74 639 212 56 207 70 245 122 +3881 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291588.jpg 500 375 0 1 10 499 369 58 208 5 304 153 59 0 12 499 369 75 253 88 301 142 +3882 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089285.jpg 426 640 0 41 136 288 617 38 257 204 376 305 +3883 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491449.jpg 640 427 0 235 159 285 212 37 232 192 279 221 +3884 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105668.jpg 640 427 0 83 35 573 420 65 126 303 200 421 +3885 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486568.jpg 500 298 0 159 17 414 293 73 36 220 56 277 73 49 107 61 153 73 91 110 105 153 73 49 44 56 95 73 41 0 47 40 73 91 50 134 99 73 120 109 130 152 73 155 60 173 97 73 143 111 148 155 73 68 220 81 280 73 101 157 123 205 73 141 155 147 200 73 123 157 129 201 65 217 111 247 150 73 17 2 180 279 +3886 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000112751.jpg 640 470 0 294 188 324 274 0 368 191 399 278 37 368 208 410 249 37 298 207 338 243 +3887 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000489764.jpg 640 538 0 105 17 639 537 65 45 406 185 477 73 118 157 126 182 73 120 188 126 206 73 104 122 114 147 73 116 121 134 152 73 112 154 120 182 73 94 266 104 338 56 0 255 81 399 +3888 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435910.jpg 640 428 0 174 157 234 355 37 72 210 294 281 +3889 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562943.jpg 640 285 0 375 82 408 179 0 321 77 347 179 0 480 69 544 205 0 291 82 335 178 37 477 101 515 149 0 193 88 220 178 0 360 105 383 125 +3890 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000468012.jpg 640 427 0 412 0 542 142 0 578 0 639 138 0 27 0 180 70 37 19 241 525 382 0 249 51 484 345 37 0 320 163 426 +3891 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212166.jpg 612 612 0 86 13 532 410 +3892 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082981.jpg 448 336 0 31 101 143 331 0 132 106 208 318 0 206 101 287 299 0 318 81 406 290 65 183 198 196 205 65 368 155 382 165 24 337 298 447 334 65 95 224 117 236 65 253 303 291 317 65 307 294 341 309 65 353 283 391 298 +3893 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103509.jpg 640 480 0 175 74 549 474 56 0 454 49 479 58 1 108 254 479 65 146 364 236 461 +3894 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145750.jpg 640 298 0 165 126 252 196 37 162 188 188 207 +3895 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189365.jpg 424 640 0 0 64 312 630 0 122 0 386 399 38 231 490 418 639 +3896 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000238806.jpg 640 383 0 503 71 639 169 42 516 81 543 117 45 383 11 476 55 53 53 58 584 364 0 560 0 639 88 45 505 107 589 165 +3897 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000023754.jpg 640 427 0 341 96 378 146 37 348 68 380 165 +3898 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335644.jpg 640 480 0 345 91 533 412 38 290 228 411 264 +3899 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000566908.jpg 500 334 0 181 69 365 273 38 26 198 185 274 32 83 170 110 194 +3900 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000008493.jpg 640 428 0 310 120 412 220 37 301 130 410 178 +3901 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283659.jpg 640 426 0 294 203 342 279 0 108 80 138 109 37 298 271 410 299 +3902 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304812.jpg 428 640 0 94 378 124 451 37 76 390 133 430 0 240 347 245 356 0 175 404 195 419 0 289 354 293 357 37 242 355 248 357 37 75 352 78 355 0 78 349 81 355 0 309 353 313 355 +3903 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063965.jpg 640 427 0 2 0 639 420 44 63 181 163 272 55 206 117 470 277 +3904 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053263.jpg 640 480 0 277 0 498 344 0 474 2 639 393 55 244 273 569 473 60 0 366 640 479 +3905 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048668.jpg 500 375 0 1 57 499 370 59 277 249 499 369 +3906 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394559.jpg 426 640 0 165 175 323 514 38 169 110 224 253 +3907 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180154.jpg 640 427 0 277 99 393 220 0 231 184 285 226 37 284 203 444 216 0 225 116 289 157 0 201 108 221 147 37 212 138 296 150 0 150 92 227 227 +3908 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561337.jpg 640 436 0 387 108 472 272 37 394 262 483 282 +3909 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565479.jpg 640 480 0 335 97 639 437 37 130 289 639 472 16 309 272 480 417 +3910 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333924.jpg 640 271 0 167 79 279 190 37 205 178 301 214 +3911 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066502.jpg 640 427 0 138 88 310 277 0 49 32 174 158 0 343 19 428 132 0 478 42 578 113 37 139 215 413 313 37 83 131 176 151 37 267 117 522 135 37 491 99 575 115 0 537 116 580 156 +3912 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004742.jpg 640 426 0 265 120 463 318 37 166 325 542 349 +3913 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332627.jpg 640 425 0 240 153 376 419 38 326 214 412 318 3 0 140 77 240 +3914 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246686.jpg 640 426 0 22 190 90 359 0 189 176 229 321 0 308 176 347 308 0 589 168 599 193 37 237 279 405 302 0 533 187 541 197 0 470 161 529 323 37 369 271 402 279 37 108 346 217 378 +3915 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478664.jpg 426 640 0 0 134 410 636 65 234 382 272 438 73 341 543 355 617 73 359 541 381 608 73 331 538 343 615 73 352 545 366 617 39 0 353 25 368 +3916 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160828.jpg 640 365 0 196 44 472 305 37 374 249 556 333 +3917 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568259.jpg 640 400 0 8 87 143 394 38 0 0 143 212 0 73 43 463 399 +3918 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259335.jpg 640 409 0 329 52 429 331 0 550 35 567 60 0 454 55 514 327 37 391 113 599 197 37 226 301 335 332 0 607 43 630 61 0 567 45 583 64 +3919 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529235.jpg 426 640 0 148 11 345 294 40 50 100 157 340 40 287 86 386 293 41 180 156 256 256 53 0 392 316 567 53 241 290 415 392 53 351 332 424 442 41 0 215 55 363 53 66 294 270 397 41 339 141 416 302 +3920 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304252.jpg 640 480 0 200 50 315 190 37 133 158 302 215 +3921 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305962.jpg 640 360 0 237 171 284 225 37 211 199 313 260 +3922 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132042.jpg 375 500 0 72 90 368 499 65 55 287 83 299 57 266 182 374 413 +3923 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568195.jpg 427 640 0 123 136 356 446 0 286 139 426 464 0 5 77 152 571 43 183 399 217 428 39 289 594 315 639 39 336 591 384 639 42 330 494 424 512 42 341 491 414 508 60 0 503 427 639 74 39 0 91 46 42 332 502 399 516 42 346 507 419 520 55 198 415 318 498 +3924 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000208012.jpg 640 471 0 225 55 552 459 53 200 204 396 275 74 449 327 460 334 +3925 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297444.jpg 640 428 0 20 0 259 332 55 208 147 566 412 0 266 0 478 167 45 524 259 639 422 +3926 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000516318.jpg 640 427 0 369 204 506 298 37 361 280 556 305 14 346 185 378 204 +3927 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032081.jpg 375 500 0 113 78 254 469 38 75 129 123 235 +3928 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000549242.jpg 640 480 0 289 132 366 228 0 242 110 312 175 37 286 226 344 241 37 242 155 284 175 +3929 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447208.jpg 428 640 0 7 122 382 638 55 133 341 385 488 60 96 382 427 639 +3930 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050746.jpg 640 415 0 534 206 578 322 38 137 232 187 331 0 177 82 282 381 +3931 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115898.jpg 640 427 0 279 6 461 297 37 139 238 382 311 +3932 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212077.jpg 640 428 0 144 151 367 320 37 281 273 392 336 +3933 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311465.jpg 640 480 0 104 18 639 479 38 39 47 291 454 0 538 102 639 311 +3934 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438807.jpg 640 427 0 310 250 362 314 37 274 304 354 325 +3935 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185916.jpg 640 429 0 2 103 304 356 37 168 320 316 371 +3936 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000175825.jpg 640 427 0 393 129 485 303 0 12 296 163 358 37 324 271 503 330 +3937 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000278967.jpg 640 395 0 228 1 384 182 37 475 192 626 316 +3938 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371497.jpg 640 480 0 318 231 409 341 37 269 340 392 367 +3939 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565389.jpg 640 425 0 295 119 327 165 0 0 0 248 416 0 67 113 107 221 0 249 76 448 210 0 368 50 513 255 41 236 234 274 265 41 529 220 593 331 41 246 222 276 238 41 611 237 639 421 41 244 261 295 331 41 347 228 382 268 41 389 200 427 268 41 318 232 351 275 43 451 335 489 382 53 356 256 430 298 60 145 213 639 417 0 32 109 86 228 0 46 120 92 200 0 141 120 216 194 0 325 121 365 155 0 234 120 297 188 41 314 196 345 236 45 208 323 403 423 0 498 55 608 265 41 191 231 238 282 41 292 199 315 250 41 209 212 232 234 43 194 283 244 306 53 611 52 639 80 53 249 147 261 152 0 95 117 110 149 42 439 301 461 374 41 240 187 252 198 +3940 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000164440.jpg 640 427 0 263 43 509 422 38 199 77 284 227 +3941 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034877.jpg 640 360 0 343 0 588 65 43 282 84 639 185 53 0 58 341 235 53 389 46 635 93 +3942 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482735.jpg 640 427 0 188 112 249 227 37 198 198 272 238 +3943 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174425.jpg 640 480 0 3 319 253 471 53 256 70 436 167 41 32 0 101 54 42 303 0 422 37 43 132 1 269 161 44 598 91 639 126 0 163 0 271 47 60 0 1 639 473 +3944 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114033.jpg 480 640 0 104 257 384 626 0 155 380 173 439 38 65 364 399 528 38 137 55 308 272 0 130 37 312 391 0 436 378 450 410 0 171 380 186 403 0 472 382 479 435 +3945 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185095.jpg 640 427 0 232 42 445 419 0 114 11 241 396 0 449 0 617 345 0 395 0 509 355 0 303 2 420 180 0 608 7 639 217 38 419 158 562 266 38 115 221 204 398 0 0 57 63 372 38 598 167 623 259 +3946 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069568.jpg 481 640 0 64 5 478 632 53 51 460 257 575 68 5 136 197 317 +3947 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403975.jpg 640 427 0 161 70 405 390 55 277 264 386 310 +3948 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000366569.jpg 640 427 0 239 55 607 426 0 147 147 243 276 38 67 84 259 224 0 537 17 638 284 0 488 21 530 54 0 338 171 416 416 0 601 0 639 76 0 552 44 577 81 0 0 158 41 338 +3949 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281500.jpg 640 426 0 343 34 488 374 38 360 116 448 159 +3950 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251019.jpg 426 640 0 131 103 344 591 38 72 144 156 325 +3951 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328068.jpg 640 428 0 398 3 586 423 38 272 161 400 235 0 247 102 382 422 32 355 140 361 145 +3952 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170208.jpg 640 427 0 205 110 387 305 37 312 275 456 359 +3953 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361804.jpg 640 360 0 173 63 429 354 0 311 100 451 274 37 38 252 639 344 73 363 258 450 273 +3954 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536028.jpg 480 640 0 224 238 296 333 37 221 328 248 351 +3955 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000327617.jpg 379 640 0 63 106 251 629 38 144 300 239 509 +3956 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258588.jpg 500 375 0 158 159 269 295 38 151 229 199 268 38 420 249 448 256 32 300 193 306 199 +3957 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356002.jpg 640 427 0 344 183 379 231 37 314 217 377 232 0 384 41 387 44 0 574 127 588 137 0 329 41 330 43 +3958 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415020.jpg 480 640 0 0 179 372 632 65 102 1 327 620 +3959 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390246.jpg 640 427 0 345 146 435 228 37 283 158 342 191 +3960 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000406848.jpg 640 360 0 365 15 406 86 0 417 19 441 122 0 48 0 346 104 53 0 122 637 359 41 434 0 579 165 53 19 90 183 113 56 545 19 639 173 +3961 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409964.jpg 640 428 0 155 89 463 422 38 71 2 192 200 +3962 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168367.jpg 427 640 0 63 232 426 638 65 129 35 287 614 57 0 245 186 629 +3963 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255315.jpg 427 640 0 183 41 416 430 0 50 128 226 632 65 278 393 304 410 65 81 569 152 636 73 7 406 30 476 73 10 499 72 513 73 175 282 180 328 73 177 202 188 274 73 145 216 177 275 73 210 35 219 80 73 124 32 129 95 73 137 80 170 83 73 0 506 25 587 73 169 18 240 27 73 112 30 123 94 73 0 257 44 270 57 192 360 426 629 73 229 27 237 56 73 1 32 232 473 +3964 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395665.jpg 640 427 0 170 74 511 401 38 472 109 578 175 32 314 243 334 259 +3965 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000266160.jpg 640 427 0 233 66 448 307 37 212 146 465 300 +3966 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515350.jpg 640 427 0 172 164 239 213 37 172 199 278 226 +3967 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411768.jpg 510 640 0 169 96 500 639 38 15 0 211 140 0 350 400 509 630 +3968 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378284.jpg 640 427 0 106 0 533 122 42 541 273 639 386 53 81 108 499 331 60 2 60 639 422 43 547 284 639 366 0 1 2 106 124 43 595 298 639 331 +3969 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508811.jpg 480 640 0 139 61 296 468 38 71 253 178 307 0 41 551 479 639 +3970 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033006.jpg 500 375 0 248 97 333 368 0 106 117 213 370 0 366 115 438 301 0 320 135 339 163 65 193 183 315 283 73 77 178 85 199 73 82 149 90 167 73 89 176 98 197 73 92 228 99 250 73 69 147 81 169 73 118 147 129 165 73 128 148 136 163 73 71 177 81 199 73 110 147 118 165 73 85 224 111 252 73 81 178 89 198 73 195 161 212 168 0 470 147 480 167 73 189 154 196 159 73 15 121 382 242 +3971 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185890.jpg 509 640 0 31 39 265 608 0 274 80 493 533 65 153 159 191 228 0 173 64 222 129 0 57 42 90 87 40 311 122 321 144 40 203 130 212 148 40 214 129 223 148 40 303 115 317 143 65 360 141 375 187 65 240 105 255 131 65 449 161 465 180 0 0 35 31 232 60 160 115 237 150 60 270 137 338 147 +3972 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076572.jpg 640 480 0 73 0 570 480 65 253 162 368 234 +3973 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415770.jpg 427 640 0 41 74 289 639 38 220 397 426 524 +3974 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499755.jpg 426 640 0 51 56 263 547 38 88 7 243 100 +3975 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250313.jpg 640 361 0 496 76 565 305 0 547 83 633 333 0 0 78 87 329 38 449 44 484 94 38 506 192 570 217 38 567 155 638 182 26 562 127 603 207 38 378 143 436 194 0 347 92 416 310 0 416 80 520 344 +3976 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372580.jpg 640 425 0 192 97 276 209 37 172 197 348 242 0 126 0 149 19 0 513 0 535 25 +3977 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219393.jpg 640 361 0 394 102 448 276 0 517 83 587 274 0 42 63 193 333 0 104 71 152 285 38 342 191 412 227 38 506 224 531 276 38 106 72 132 114 38 211 154 276 178 0 168 91 225 284 38 183 182 208 209 38 174 116 194 155 0 201 75 263 279 2 242 87 385 156 +3978 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315249.jpg 640 427 0 273 164 357 221 0 118 78 143 93 0 385 225 450 246 37 328 216 361 239 37 214 136 240 148 37 305 202 322 218 37 136 80 143 90 0 239 125 263 150 +3979 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000091402.jpg 640 425 37 270 345 341 385 0 192 202 306 371 +3980 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204935.jpg 640 424 37 269 284 379 315 0 246 189 359 299 +3981 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550432.jpg 640 480 37 181 266 255 288 0 211 248 228 292 +3982 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000356505.jpg 640 425 37 335 342 483 371 0 222 85 397 354 +3983 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016327.jpg 640 427 37 319 224 360 420 0 93 178 150 421 0 222 188 281 420 0 339 162 405 420 0 392 178 451 403 0 482 188 530 358 0 55 182 104 329 0 0 175 39 328 0 46 179 67 288 0 317 169 360 234 0 520 204 535 288 0 41 195 52 230 0 27 188 44 247 37 483 371 508 407 0 229 174 249 222 59 142 280 215 350 0 18 102 639 417 +3984 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000070896.jpg 640 426 37 347 281 413 293 37 503 283 639 310 0 330 235 352 265 0 545 234 639 320 0 331 249 406 289 +3985 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230432.jpg 640 425 37 439 246 490 301 0 398 188 483 284 +3986 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430518.jpg 481 640 38 119 462 144 498 0 374 292 402 328 0 117 467 160 602 0 397 200 414 232 0 5 422 40 482 0 101 381 145 448 0 220 333 239 351 0 244 393 270 441 0 352 332 372 347 0 0 230 8 270 0 142 395 169 445 0 297 199 308 216 32 156 352 161 357 56 172 302 187 318 56 305 410 324 439 56 164 319 179 331 56 266 411 285 429 56 284 411 304 438 56 324 409 345 437 56 344 407 365 437 56 362 407 384 424 56 381 406 403 425 56 401 404 421 422 56 417 405 440 433 56 456 403 474 429 0 325 242 340 260 0 267 155 284 174 56 258 435 280 466 56 1 139 389 447 0 197 330 480 428 +3987 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282231.jpg 640 503 38 348 247 598 444 0 0 0 357 444 +3988 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236766.jpg 640 363 38 460 180 487 202 0 68 100 550 353 0 189 35 270 137 0 147 78 214 170 0 50 43 118 154 0 147 242 234 318 0 579 91 632 201 0 538 56 599 145 0 379 68 421 111 0 240 90 292 166 0 118 50 168 127 0 347 34 395 102 0 120 127 160 170 0 194 124 248 266 0 1 0 639 362 +3989 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000376900.jpg 480 640 38 113 372 146 418 0 272 313 283 335 0 367 304 417 383 0 216 311 237 348 0 78 175 235 599 0 56 309 85 364 0 237 316 274 382 0 0 296 58 383 0 32 294 38 300 0 290 328 319 381 0 403 319 420 347 0 441 305 458 347 0 330 296 375 381 0 366 302 389 336 0 1 270 479 470 +3990 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179642.jpg 640 427 38 125 379 199 426 0 1 17 103 417 0 160 95 399 426 39 246 386 267 425 39 229 384 247 426 0 209 0 284 63 0 327 11 377 70 0 496 0 600 76 0 380 0 509 75 0 110 0 211 401 0 280 0 351 66 0 565 0 639 79 0 247 0 278 43 38 146 288 238 380 56 204 192 359 404 56 414 277 567 426 56 473 20 514 74 56 85 1 121 40 56 0 1 80 48 56 275 13 306 64 56 369 18 393 36 +3991 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000226967.jpg 640 427 38 92 132 219 261 0 90 16 452 395 0 193 61 323 420 0 443 70 567 284 0 560 71 638 135 0 561 196 625 276 0 477 55 525 118 0 87 208 163 315 56 273 108 310 130 56 176 70 216 89 56 67 123 104 141 56 33 83 71 99 56 527 48 566 65 56 129 276 197 311 56 540 92 587 119 0 441 21 535 115 0 386 0 442 73 0 351 0 398 77 0 96 94 150 139 0 0 271 25 321 56 161 116 198 140 56 34 288 80 320 56 77 79 107 95 56 575 56 595 68 38 280 222 322 300 +3992 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039480.jpg 640 427 38 280 292 420 363 0 243 164 342 420 +3993 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138814.jpg 427 640 38 40 151 93 270 56 10 102 82 143 0 55 61 266 587 +3994 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000400317.jpg 424 640 38 5 302 126 333 0 111 160 281 487 0 146 108 167 139 0 214 121 250 167 0 370 233 412 279 0 346 158 364 183 0 313 79 339 165 0 249 65 261 80 0 265 36 289 95 0 213 92 234 122 56 131 287 175 359 0 224 249 239 278 0 115 107 141 139 0 298 209 332 250 0 130 173 167 209 0 1 0 423 379 +3995 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163316.jpg 640 478 38 378 296 438 378 38 269 218 301 241 0 425 164 546 413 0 274 160 362 317 0 558 179 588 212 0 550 188 563 206 0 116 187 135 255 0 86 186 117 259 0 176 295 354 470 0 323 202 340 265 0 432 140 440 152 0 437 191 464 229 25 136 149 234 266 25 77 151 140 200 25 382 167 424 180 25 336 168 361 176 56 385 227 408 245 56 145 216 179 256 56 409 226 430 246 56 428 226 452 249 56 353 227 385 260 0 416 192 439 232 0 32 183 48 217 25 235 170 273 182 56 629 230 639 248 0 374 180 401 211 0 123 136 630 276 +3996 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152330.jpg 640 478 40 0 0 81 201 40 95 2 198 42 53 65 19 561 443 40 312 0 406 36 44 366 0 496 31 45 0 231 40 364 40 586 150 639 250 60 461 1 618 181 +3997 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124072.jpg 640 640 40 488 335 507 380 55 359 280 418 353 40 465 316 486 364 40 327 354 355 400 40 413 310 430 351 40 237 315 260 374 40 264 335 290 394 60 204 282 562 603 60 507 313 623 438 43 220 378 271 387 +3998 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242911.jpg 612 612 40 363 0 611 321 41 234 1 398 204 53 0 303 607 600 60 0 0 612 605 41 178 0 239 66 +3999 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560721.jpg 640 480 40 504 2 638 187 40 427 0 502 105 42 0 111 79 310 43 61 122 112 275 53 101 91 572 442 53 160 2 432 98 60 0 1 640 479 73 0 4 94 56 +4000 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254454.jpg 424 640 41 27 497 108 610 53 159 472 308 568 0 46 21 406 632 +4001 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000253452.jpg 640 426 41 444 150 639 362 42 8 78 50 193 55 73 22 242 119 43 24 94 62 176 44 0 72 30 147 51 142 148 312 220 51 102 191 122 208 54 457 78 581 171 54 458 51 541 102 54 323 77 430 160 54 363 30 469 84 54 494 64 616 137 54 371 73 471 149 43 100 0 130 21 60 0 0 640 426 +4002 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000252748.jpg 640 480 42 14 151 83 326 43 572 94 639 219 45 339 0 546 100 55 118 103 593 408 45 0 124 48 218 +4003 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365121.jpg 612 612 43 30 4 184 441 53 16 67 588 543 60 1 1 611 207 60 491 433 611 599 +4004 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000375211.jpg 640 480 45 5 3 639 478 +4005 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335774.jpg 478 640 47 260 425 359 504 47 291 384 408 486 41 219 1 306 136 51 255 348 299 388 0 2 0 179 87 51 273 381 326 423 60 0 60 478 638 +4006 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000069698.jpg 480 640 53 102 163 449 618 +4007 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499313.jpg 640 478 53 44 35 592 396 41 506 0 574 18 60 4 0 639 468 40 522 1 639 104 41 397 1 501 71 +4008 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355871.jpg 640 424 53 236 309 306 363 0 260 44 637 423 0 401 50 636 378 0 38 60 397 419 0 450 0 553 114 0 241 0 307 131 0 200 0 256 102 0 154 0 191 85 0 117 1 155 70 26 274 142 315 233 56 0 270 55 421 56 257 173 272 253 0 308 0 372 56 45 21 106 94 165 53 497 254 574 299 53 356 205 386 232 60 5 97 293 185 0 551 0 600 75 0 367 1 452 174 0 589 171 639 289 53 356 198 408 236 60 555 72 639 166 +4009 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353027.jpg 640 424 53 51 4 359 290 53 56 141 639 422 0 0 0 237 232 +4010 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514180.jpg 640 427 53 69 149 541 306 53 321 44 639 158 53 1 34 189 119 53 556 145 639 304 43 67 99 130 163 43 190 93 358 125 43 225 256 340 415 53 0 143 44 260 +4011 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127476.jpg 480 640 53 0 44 480 620 +4012 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007867.jpg 500 332 53 32 49 430 290 +4013 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180479.jpg 640 480 53 91 127 544 403 69 0 68 312 479 +4014 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451683.jpg 640 424 53 26 13 614 392 +4015 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401860.jpg 640 427 53 80 23 586 370 +4016 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532009.jpg 640 480 53 37 51 328 250 53 242 26 624 383 53 35 201 494 448 +4017 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197022.jpg 640 478 53 168 345 638 477 53 25 57 507 339 +4018 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578344.jpg 480 640 53 30 93 208 186 0 409 183 455 254 58 5 184 174 631 0 92 27 416 639 +4019 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000142092.jpg 640 480 53 144 64 514 396 +4020 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273688.jpg 640 480 53 0 0 640 479 53 436 1 639 131 +4021 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000381060.jpg 640 427 53 0 124 640 425 +4022 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039697.jpg 640 427 53 2 0 609 421 +4023 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179273.jpg 400 302 53 63 0 365 239 +4024 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428812.jpg 640 480 53 106 75 612 473 +4025 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371822.jpg 640 479 53 192 282 405 426 39 212 47 226 64 73 327 147 567 281 73 285 73 456 134 73 377 47 543 104 39 243 46 259 63 39 255 43 271 61 39 334 22 347 41 39 306 29 321 45 39 317 27 333 44 39 228 46 241 62 39 280 18 289 37 39 203 42 212 64 39 253 44 255 50 39 212 36 221 49 73 451 79 544 135 73 128 100 303 193 73 0 271 155 354 73 1 233 162 321 39 267 33 287 60 39 243 23 252 33 73 428 257 587 351 73 455 102 639 195 73 0 144 162 290 73 159 113 335 323 73 571 206 639 263 73 321 239 572 328 39 249 37 258 53 39 180 14 358 104 73 0 44 639 421 +4026 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149469.jpg 640 640 53 0 102 638 565 +4027 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000407945.jpg 640 426 53 199 42 608 292 53 0 30 604 419 0 247 1 638 290 +4028 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560000.jpg 640 478 53 49 46 576 433 +4029 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313162.jpg 612 612 53 5 47 581 577 60 0 0 612 612 41 1 1 161 64 +4030 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565597.jpg 478 640 53 31 131 476 535 60 1 376 477 630 53 160 1 477 219 53 0 53 137 218 +4031 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515993.jpg 640 428 55 132 70 414 362 42 584 221 639 297 +4032 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453926.jpg 640 426 55 42 43 564 379 45 13 0 380 82 43 473 0 563 166 45 3 0 638 416 44 167 0 310 51 +4033 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000198752.jpg 427 640 55 73 339 333 512 55 61 62 355 582 40 113 49 125 84 40 205 37 212 66 40 281 25 291 55 40 53 73 72 100 56 135 34 178 65 56 215 27 250 53 56 0 64 35 91 56 46 46 93 75 60 1 339 426 639 60 1 94 172 273 60 0 37 395 193 +4034 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213843.jpg 640 480 55 58 162 584 376 41 377 0 509 84 41 192 0 310 76 43 601 15 639 56 +4035 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295837.jpg 427 640 55 103 427 264 527 72 95 60 260 498 73 17 401 47 527 0 115 136 425 639 73 31 385 64 521 73 0 379 31 529 +4036 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225537.jpg 480 640 63 1 97 477 595 +4037 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286285.jpg 375 500 65 62 10 164 215 76 264 300 347 412 +4038 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460251.jpg 639 640 65 1 44 638 629 +4039 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000339202.jpg 500 384 65 121 197 235 323 0 0 0 499 383 65 205 110 315 187 +4040 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000172946.jpg 427 640 65 128 396 184 420 65 342 172 355 186 65 72 383 118 406 65 232 265 257 276 0 316 116 426 556 0 279 74 335 216 0 342 129 373 175 0 111 110 201 282 0 55 106 208 631 0 12 86 199 398 0 0 25 174 633 62 325 92 374 135 0 177 106 226 242 0 319 111 345 175 0 197 102 376 605 0 222 102 250 155 65 173 266 204 286 65 189 254 209 268 0 280 172 300 255 0 158 71 218 116 65 228 238 248 252 +4041 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207507.jpg 640 480 65 105 106 280 378 65 417 95 510 318 +4042 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030793.jpg 640 426 65 357 102 639 239 +4043 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140661.jpg 640 426 68 180 189 232 217 69 175 240 233 315 26 300 248 332 296 58 261 115 308 210 58 60 120 112 160 0 491 249 552 323 57 405 312 610 364 +4044 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185303.jpg 478 640 73 148 303 343 432 59 0 151 478 634 +4045 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562994.jpg 424 640 0 149 117 312 568 0 259 201 333 273 0 124 252 168 305 38 245 163 273 203 56 7 249 50 268 56 342 229 392 251 56 0 207 37 224 56 345 132 391 144 56 242 204 282 224 0 119 118 174 187 0 63 104 110 147 0 108 20 172 111 0 24 28 74 116 0 20 133 86 185 0 302 147 362 224 0 402 165 420 220 0 306 81 357 141 56 366 188 406 208 56 75 229 122 259 56 90 208 142 253 56 0 123 35 138 56 391 250 423 272 56 61 247 122 268 0 365 61 410 150 0 191 65 251 167 56 378 163 416 181 56 329 249 383 269 0 24 0 289 163 56 0 99 423 280 +4046 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075646.jpg 640 483 0 363 109 451 318 0 265 99 376 328 0 28 107 149 350 0 87 61 173 327 0 222 64 292 315 0 319 63 391 233 0 438 56 521 262 0 477 94 605 331 0 391 233 493 349 32 205 411 217 426 41 192 143 209 158 41 130 151 146 162 41 522 199 538 211 0 183 233 274 354 0 161 95 278 333 32 222 406 235 422 32 205 396 221 413 32 104 391 119 408 32 186 365 199 378 32 78 391 93 406 56 170 180 191 217 56 310 171 330 217 56 431 169 448 218 60 473 185 594 334 27 250 107 267 161 27 441 275 464 288 38 180 273 263 410 38 129 273 181 423 38 109 288 165 395 38 190 296 237 390 +4047 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205258.jpg 426 640 0 119 94 260 538 38 216 108 307 183 +4048 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344045.jpg 640 427 37 0 99 400 162 0 193 78 258 172 +4049 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171483.jpg 640 426 41 584 0 639 199 53 134 121 566 390 60 0 0 640 426 +4050 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089670.jpg 640 427 44 0 197 73 252 55 125 116 521 357 39 564 175 581 301 +4051 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581655.jpg 640 496 53 49 34 569 486 +4052 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295269.jpg 640 460 55 6 71 225 454 55 130 32 230 289 55 338 39 486 260 +4053 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424192.jpg 482 640 59 0 121 481 632 15 251 326 350 364 16 166 216 190 241 56 377 94 458 428 +4054 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246649.jpg 480 640 0 100 82 385 632 38 356 153 448 302 +4055 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505814.jpg 430 640 37 66 252 198 370 0 84 176 218 340 +4056 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555412.jpg 640 427 53 0 2 640 421 +4057 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443361.jpg 478 640 57 142 374 477 639 +4058 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000015386.jpg 640 480 59 131 165 632 479 +4059 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543581.jpg 640 427 16 258 134 352 223 62 0 104 103 198 62 181 182 262 246 15 485 318 628 402 57 251 123 556 345 39 532 208 545 238 39 384 342 414 400 73 262 92 267 107 73 262 112 265 125 73 264 131 267 144 73 264 148 270 162 73 269 131 271 143 73 234 128 254 138 73 265 111 270 126 73 259 113 262 127 73 275 92 279 106 73 262 131 264 145 73 88 228 115 240 65 571 247 591 253 +4060 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271117.jpg 500 375 58 167 176 314 288 39 94 183 126 287 67 247 307 281 335 67 264 300 329 320 74 426 262 472 296 45 200 68 241 85 65 13 319 116 358 65 90 308 143 338 73 260 32 269 100 73 267 41 277 101 75 212 254 309 297 41 99 66 139 104 41 147 89 168 104 41 169 91 191 104 41 54 244 82 289 73 285 56 301 102 73 281 50 290 101 73 359 72 490 97 73 355 83 491 103 73 124 283 195 323 73 390 93 487 105 73 187 284 239 324 73 243 1 260 102 73 358 296 486 358 +4061 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526342.jpg 640 480 58 163 279 285 469 58 528 241 627 430 56 108 325 200 451 56 247 378 316 449 39 373 342 381 374 39 382 339 395 378 72 350 160 469 423 39 393 226 397 245 39 378 295 384 316 39 367 226 373 245 39 372 227 381 246 39 390 251 394 264 39 393 274 398 286 39 379 275 384 281 39 376 317 382 326 39 366 339 373 374 39 381 332 392 374 39 392 296 398 314 39 140 224 406 372 +4062 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000497928.jpg 640 360 58 0 0 59 285 62 209 47 378 168 57 240 213 636 359 +4063 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532212.jpg 426 640 58 67 22 369 558 75 114 186 332 564 40 121 191 327 551 +4064 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561619.jpg 640 480 58 217 22 368 252 62 418 72 518 160 56 103 261 316 474 56 102 144 152 229 56 19 188 67 309 56 0 144 34 219 60 72 248 193 375 0 437 86 497 150 65 77 198 103 217 60 27 162 104 184 60 213 360 639 479 65 403 159 425 163 67 370 378 404 396 0 28 148 141 255 56 89 131 113 169 56 276 276 513 479 +4065 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000377003.jpg 480 640 58 144 311 193 405 56 32 358 310 625 57 265 313 479 508 65 213 397 231 407 58 90 329 153 381 +4066 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000115870.jpg 640 426 58 433 81 575 226 58 20 267 107 348 57 143 177 459 345 57 304 198 508 363 0 16 185 79 297 0 63 180 153 296 0 185 243 619 425 0 273 103 332 180 0 202 66 272 359 67 77 188 84 203 73 372 354 456 406 73 2 366 71 392 41 200 152 214 174 73 81 300 115 318 57 337 220 638 417 +4067 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000267321.jpg 500 375 58 122 169 208 323 58 0 255 100 350 15 87 48 150 93 57 0 77 290 264 56 324 135 498 355 35 203 219 264 299 65 186 217 198 246 65 167 220 178 243 73 88 334 172 369 +4068 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000313321.jpg 640 360 58 2 3 108 280 62 237 120 423 248 57 0 285 524 354 +4069 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380299.jpg 640 427 58 2 15 412 418 77 339 110 545 399 75 209 307 413 421 +4070 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450596.jpg 640 426 58 523 124 608 260 57 470 106 639 330 26 147 139 229 239 71 23 93 78 102 73 374 181 426 200 56 302 97 418 175 +4071 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162530.jpg 500 375 58 357 217 417 318 0 49 112 170 340 67 92 134 101 142 +4072 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293574.jpg 640 465 58 170 124 498 458 40 110 81 178 231 40 147 67 212 203 40 585 88 639 228 40 523 75 585 233 40 346 53 400 130 75 230 346 400 456 75 25 330 157 459 40 392 53 459 144 41 497 359 610 464 +4073 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102446.jpg 640 438 58 204 206 261 284 58 436 286 471 354 57 39 206 221 280 56 64 192 203 372 63 531 258 639 337 64 493 314 510 329 75 221 251 240 284 75 443 331 452 353 75 410 241 420 257 +4074 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384527.jpg 640 480 58 321 55 397 214 56 461 277 639 470 56 466 159 593 300 56 203 300 551 472 60 317 184 499 268 1 391 104 573 194 74 31 165 78 211 41 369 230 395 253 73 596 161 603 197 73 608 113 615 152 73 602 157 610 199 73 592 108 611 151 73 614 113 620 152 73 619 116 628 153 73 609 163 639 208 73 603 207 624 248 73 596 209 604 247 41 438 189 454 206 41 468 205 484 223 73 622 114 638 154 73 611 112 617 150 73 591 206 597 243 75 361 139 383 212 41 408 231 439 250 41 328 221 354 250 73 344 267 428 297 73 129 8 639 270 +4075 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441969.jpg 640 480 58 301 287 380 358 58 238 310 270 371 77 45 266 108 334 58 331 57 384 104 58 318 96 335 118 58 335 97 345 117 58 347 418 418 477 58 195 80 326 346 58 113 234 188 369 75 239 339 272 369 +4076 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080714.jpg 640 480 62 258 111 466 272 56 474 404 543 474 0 254 218 446 473 41 135 394 175 437 63 137 322 278 410 73 168 407 267 446 56 343 316 374 364 60 0 349 350 479 +4077 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287035.jpg 500 375 62 176 70 323 196 63 9 122 117 206 66 250 203 381 261 56 267 217 494 368 64 363 196 391 212 67 143 183 167 222 +4078 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137301.jpg 478 640 62 195 12 355 156 63 139 189 295 292 64 270 285 301 305 73 140 152 187 218 73 127 148 174 222 26 77 400 193 521 41 374 246 409 290 24 74 398 193 530 +4079 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003244.jpg 640 338 62 284 13 483 179 64 316 247 360 289 66 305 194 542 276 67 286 283 310 317 63 110 83 283 280 +4080 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000491408.jpg 640 425 62 385 145 486 235 56 164 201 233 287 56 241 293 458 419 60 109 296 312 384 59 581 159 639 266 46 186 310 225 331 24 40 242 126 284 24 0 234 50 290 45 162 321 223 337 47 200 311 208 319 65 363 222 379 226 73 175 376 248 414 73 148 363 195 388 49 176 306 188 314 60 188 216 355 315 47 165 312 176 321 56 0 266 137 352 57 561 349 639 424 +4081 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396178.jpg 640 480 62 0 0 476 34 64 490 172 569 273 66 5 152 398 334 +4082 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116556.jpg 500 375 62 284 64 361 134 2 298 42 342 64 63 340 112 425 177 64 279 153 294 160 66 185 144 266 174 41 141 167 158 190 56 213 167 368 374 62 363 111 426 161 +4083 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000241187.jpg 427 640 62 45 125 412 387 63 94 236 426 515 62 296 235 426 456 0 0 394 245 516 +4084 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304815.jpg 640 427 62 308 1 639 252 64 60 225 181 307 66 216 230 639 355 +4085 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014306.jpg 640 426 62 416 144 576 294 63 244 173 354 275 64 372 312 398 332 66 238 303 348 330 66 260 231 342 255 62 237 121 261 143 +4086 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434898.jpg 640 480 62 0 238 118 389 57 157 184 639 474 65 97 339 142 361 73 15 229 51 238 73 15 225 49 229 73 15 221 48 225 73 0 220 15 239 +4087 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438103.jpg 640 640 62 86 1 365 232 0 250 130 582 555 63 424 357 639 623 62 422 359 639 629 73 189 273 266 289 73 253 253 319 323 73 245 372 312 389 73 0 51 34 69 73 198 342 210 417 73 248 389 309 401 73 172 249 193 325 +4088 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219170.jpg 320 480 62 115 95 312 250 41 1 27 40 72 64 124 266 163 287 65 58 49 131 84 66 109 267 258 330 63 223 255 318 362 +4089 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257471.jpg 430 640 62 51 287 82 352 57 122 296 276 362 73 313 350 337 360 73 82 310 98 318 73 83 326 116 350 56 265 350 429 524 73 124 325 126 331 +4090 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533511.jpg 480 640 62 309 3 479 212 64 1 501 336 633 66 36 303 479 548 +4091 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066001.jpg 640 480 62 418 72 607 226 62 238 89 416 220 62 250 212 389 310 67 463 308 500 328 63 251 209 433 366 64 545 364 586 392 66 299 364 515 445 66 273 301 396 334 67 583 297 626 320 73 107 377 204 428 73 208 428 248 458 73 91 431 223 479 74 513 324 525 330 +4092 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000455299.jpg 500 400 62 0 0 118 90 64 362 186 499 303 64 317 100 435 170 66 1 166 499 395 66 2 76 258 226 +4093 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246308.jpg 480 640 62 226 377 389 494 63 109 408 239 536 64 312 590 350 622 66 116 581 311 634 56 28 563 109 639 +4094 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045463.jpg 640 480 62 455 1 601 111 1 1 246 351 478 0 217 426 283 479 72 338 187 457 302 68 336 119 448 186 24 302 394 408 453 41 485 263 514 317 59 185 447 639 473 +4095 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000113757.jpg 640 427 62 251 5 432 155 56 607 263 627 288 56 373 325 478 361 56 489 330 591 372 62 469 276 485 286 63 231 319 306 426 63 565 298 595 327 63 416 304 462 328 63 94 287 142 329 63 76 258 97 284 63 320 284 335 301 63 319 277 342 293 63 134 257 156 280 63 122 244 139 272 0 285 134 303 195 0 130 284 253 422 0 265 256 359 366 0 528 299 567 329 0 370 294 396 315 0 588 260 639 365 0 442 306 474 329 0 89 216 110 242 56 498 361 563 375 56 305 351 351 368 56 361 355 465 374 56 474 319 511 325 56 355 313 397 327 56 570 363 613 377 63 312 300 344 337 63 348 276 358 289 67 460 401 504 426 0 8 261 61 317 0 182 221 207 243 0 158 223 184 256 0 346 266 378 307 41 9 303 40 331 63 172 250 196 275 0 488 279 506 297 63 136 235 150 254 0 61 134 614 318 63 11 202 607 314 +4096 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000061693.jpg 640 480 62 585 153 611 204 56 220 199 259 263 56 301 201 342 267 56 416 204 437 221 56 175 198 223 255 62 292 79 378 137 0 278 63 639 433 74 377 387 393 392 64 413 463 461 479 66 491 435 640 479 66 177 352 292 413 66 229 172 269 175 62 188 140 216 164 62 314 139 346 165 62 238 140 268 166 63 130 255 302 432 +4097 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221605.jpg 640 480 62 297 89 518 245 63 51 190 216 288 64 474 312 518 351 66 222 249 481 318 66 73 257 186 278 +4098 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033345.jpg 640 480 62 457 257 574 369 56 37 271 199 450 65 11 437 40 453 63 0 358 36 443 +4099 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578225.jpg 640 480 62 328 108 407 189 62 404 174 485 253 57 0 105 330 366 26 121 182 200 239 24 188 302 293 391 +4100 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217269.jpg 500 400 62 235 59 390 183 64 429 240 469 264 66 219 240 443 282 62 390 78 445 182 62 438 78 492 180 67 50 224 89 237 +4101 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000145101.jpg 500 375 62 283 186 363 242 15 467 283 499 313 56 419 277 499 367 60 0 179 31 237 57 4 209 213 346 41 179 211 185 220 73 99 148 103 167 75 131 146 148 164 +4102 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000363461.jpg 640 478 62 355 142 456 265 62 438 163 485 402 56 0 185 205 424 63 125 341 339 471 64 85 354 398 472 66 348 309 406 357 +4103 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347390.jpg 640 480 62 379 81 509 182 0 298 220 408 325 56 87 271 178 389 56 10 247 55 265 56 147 230 173 241 56 259 208 287 219 56 242 221 272 228 56 529 217 579 265 63 302 302 417 393 63 431 330 584 462 63 468 260 553 304 63 235 223 284 259 63 143 237 199 274 63 22 243 74 280 63 87 231 133 258 63 400 278 465 331 63 171 222 205 246 63 619 312 639 380 56 198 385 347 473 56 204 224 236 235 56 315 216 343 229 56 168 256 239 359 56 253 245 316 338 56 388 222 423 285 62 347 177 368 191 56 487 251 531 285 56 1 202 458 392 +4104 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322895.jpg 640 480 62 119 163 183 212 57 110 243 310 455 56 152 190 175 243 57 380 306 639 474 56 209 224 303 297 56 304 220 387 285 75 85 195 95 213 45 375 284 419 302 57 125 236 304 313 +4105 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189305.jpg 640 426 62 0 181 71 308 0 366 43 637 420 63 221 223 357 335 0 0 134 273 419 +4106 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383339.jpg 640 428 14 350 257 355 265 0 250 292 271 318 +4107 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000711.jpg 640 480 15 445 164 490 198 57 286 164 548 354 58 348 148 389 168 65 206 342 232 370 43 285 314 338 335 56 552 165 587 270 58 278 175 296 202 58 504 125 525 150 75 405 65 413 85 75 330 118 338 143 58 493 166 541 192 58 556 126 579 155 75 43 87 69 121 75 415 91 431 112 73 237 352 275 373 57 0 164 302 405 +4108 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000090754.jpg 500 357 15 13 52 111 156 57 1 162 499 356 0 323 92 471 352 0 32 88 173 323 0 154 62 327 335 41 162 266 198 348 65 218 340 292 355 60 0 320 105 356 +4109 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229000.jpg 500 375 39 154 50 195 88 0 68 108 316 370 0 260 101 452 366 68 124 71 370 191 39 1 103 34 180 39 19 61 51 129 39 0 49 27 131 45 46 205 104 252 71 0 175 45 270 +4110 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557731.jpg 500 375 39 50 1 131 110 60 1 1 499 370 53 73 96 456 294 +4111 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168837.jpg 640 406 39 127 105 150 142 56 0 155 100 251 56 161 158 276 245 59 3 49 639 399 60 70 185 212 251 40 172 170 184 202 40 184 153 201 200 +4112 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312192.jpg 640 480 39 12 1 147 217 60 4 95 639 470 0 297 11 639 223 40 0 21 88 276 40 182 2 229 74 40 127 0 169 58 42 238 72 303 104 53 46 135 603 415 45 234 25 454 81 39 0 150 29 213 42 138 86 212 111 +4113 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251920.jpg 640 480 39 14 0 80 159 39 57 2 91 106 39 0 106 34 195 40 327 39 388 156 53 345 139 619 319 53 2 143 380 345 69 3 263 639 466 39 0 0 35 146 +4114 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182362.jpg 640 480 39 181 270 262 470 56 2 142 131 454 0 74 25 503 473 63 281 189 625 469 63 593 202 639 473 64 336 447 424 479 43 159 70 166 84 43 166 50 172 71 43 160 54 167 71 43 167 70 170 85 60 71 175 639 472 45 526 225 551 250 60 1 89 176 166 48 308 228 367 276 +4115 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022705.jpg 482 640 39 81 212 105 277 72 136 47 392 546 0 143 83 362 608 40 179 210 204 292 45 23 256 54 279 +4116 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548339.jpg 640 576 39 102 127 125 185 0 186 30 532 497 0 363 2 515 193 0 546 1 639 248 34 201 65 279 202 0 110 0 228 184 13 43 131 323 359 0 213 0 325 132 13 396 184 639 347 26 210 116 295 182 35 185 165 233 226 +4117 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465822.jpg 500 375 39 303 271 322 319 56 0 265 232 366 56 392 221 408 233 74 136 85 162 113 63 247 252 378 348 0 53 108 163 273 0 0 170 71 274 0 284 173 324 234 0 326 160 448 345 0 406 172 450 251 0 436 170 499 263 0 65 48 224 266 0 257 174 295 225 0 440 150 470 176 58 45 54 89 248 63 397 242 440 275 0 0 173 30 246 56 210 223 220 238 56 244 223 271 289 56 268 225 305 304 56 424 225 497 323 56 300 229 381 302 56 0 246 49 306 0 226 168 270 253 0 479 181 499 225 +4118 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000544044.jpg 640 404 39 179 99 216 166 39 389 192 425 286 67 384 300 412 346 73 243 128 307 190 73 246 65 328 73 73 569 99 639 119 73 235 32 338 46 26 482 293 555 367 39 164 54 215 161 39 529 220 558 282 74 422 305 445 348 24 79 139 223 317 26 28 263 142 353 73 239 48 333 66 73 240 68 331 93 73 243 46 332 56 73 560 88 639 126 73 592 146 639 159 73 351 42 454 90 73 349 70 455 103 73 349 101 443 116 73 234 92 332 107 73 294 222 376 297 +4119 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000096769.jpg 500 326 39 221 61 275 266 77 208 39 376 262 77 249 141 383 278 77 101 119 256 318 +4120 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435359.jpg 427 640 39 355 396 390 473 63 28 373 317 624 73 272 231 345 326 73 188 253 264 284 73 287 234 356 323 73 367 230 386 326 73 96 199 124 314 73 78 202 96 304 73 403 199 426 321 73 139 217 163 300 73 384 232 392 301 73 306 237 365 323 73 385 225 410 322 73 240 249 279 290 39 158 313 207 375 73 254 250 290 289 73 11 54 426 457 +4121 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000257336.jpg 640 480 39 82 188 111 261 39 64 194 91 261 39 43 201 75 272 0 269 1 639 397 0 516 34 639 307 41 117 306 187 390 44 119 278 150 324 53 106 373 260 470 39 385 219 400 257 76 133 309 165 323 68 225 216 387 333 44 99 273 136 322 69 189 308 355 388 69 0 257 139 473 +4122 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020553.jpg 500 375 39 364 132 381 167 39 391 133 407 191 39 406 132 417 185 77 170 79 284 167 77 240 179 271 232 25 85 142 177 254 56 123 192 240 295 75 405 132 417 185 77 273 115 302 160 41 362 166 383 191 60 321 163 427 203 +4123 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000551336.jpg 640 480 39 543 363 602 479 39 467 321 520 471 56 78 211 151 398 60 1 389 639 471 60 2 234 56 275 0 194 124 474 396 0 16 114 131 327 41 149 431 218 478 41 411 379 481 449 42 286 383 359 437 43 288 375 305 467 53 70 387 163 472 0 0 257 93 408 42 0 397 29 432 43 50 298 79 436 53 247 142 429 353 67 604 386 633 413 25 518 303 619 408 +4124 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000471869.jpg 413 500 57 0 2 413 493 77 0 35 362 486 27 127 229 235 305 +4125 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343967.jpg 640 480 57 296 201 389 285 56 298 201 388 287 56 176 270 256 368 75 499 134 520 171 57 173 268 255 365 58 472 79 552 173 74 442 143 477 169 56 500 233 620 360 58 232 353 329 479 +4126 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242934.jpg 500 227 56 32 157 68 209 56 50 97 137 195 57 146 98 413 195 73 279 60 318 69 73 302 76 305 84 60 394 97 433 139 73 283 87 285 94 73 276 70 283 82 73 305 77 308 84 73 298 76 301 83 73 296 76 297 83 73 284 75 297 83 73 315 75 317 84 73 282 87 285 94 73 310 76 313 84 62 29 0 47 138 +4127 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000092683.jpg 640 480 56 15 90 130 196 56 231 80 328 155 56 456 92 565 188 60 0 151 638 473 75 327 246 382 336 75 312 187 342 274 60 96 1 348 125 56 0 30 22 167 75 242 219 296 316 +4128 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243213.jpg 428 640 56 329 168 358 189 56 167 134 191 160 56 270 140 316 156 39 47 106 53 126 56 326 138 372 175 13 25 67 142 91 38 258 360 326 389 0 127 249 289 476 0 159 117 234 188 0 176 148 222 185 0 228 156 270 189 0 284 153 334 189 0 373 118 427 189 0 348 95 418 159 0 216 82 282 177 0 335 149 392 196 0 157 24 213 137 0 212 41 257 117 0 279 93 338 158 24 323 67 357 102 56 258 48 309 81 0 366 38 420 102 0 123 0 427 199 +4129 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196311.jpg 640 458 56 15 146 101 247 57 98 137 367 322 57 323 234 607 435 74 542 75 585 118 40 256 213 269 238 45 601 227 639 264 45 622 258 639 291 60 404 216 639 450 73 174 115 198 140 73 372 239 378 242 73 135 120 155 143 73 194 121 209 137 56 27 238 83 312 57 460 184 639 286 +4130 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422778.jpg 640 480 56 0 57 263 254 60 2 0 639 474 0 148 0 300 164 53 218 110 556 359 +4131 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000093175.jpg 500 338 56 387 185 493 333 0 164 28 411 324 62 9 16 122 300 64 151 178 194 201 66 53 198 216 310 73 414 133 473 161 73 412 119 443 136 73 481 123 499 152 73 475 216 499 240 73 390 129 426 155 +4132 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247234.jpg 640 360 56 297 183 340 229 56 147 209 294 355 57 449 192 634 353 60 310 205 426 314 60 292 149 367 222 1 372 139 488 213 56 349 152 376 212 2 436 122 485 139 2 423 122 447 135 58 321 102 381 179 62 138 1 299 166 63 334 224 379 243 66 0 334 48 359 +4133 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100187.jpg 640 480 57 322 149 617 311 57 356 262 639 479 56 1 134 45 280 65 278 242 315 257 73 223 222 249 238 73 237 220 282 236 56 93 122 221 268 56 355 260 639 479 +4134 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000021645.jpg 500 375 57 89 199 359 353 56 2 329 98 371 56 218 283 271 374 56 170 175 259 233 60 49 276 262 347 74 58 162 67 175 24 0 264 44 322 56 99 257 175 373 73 114 272 192 304 73 19 270 96 326 +4135 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000144539.jpg 500 333 57 1 133 254 278 57 8 248 111 327 56 403 201 499 332 65 110 279 163 314 73 298 73 301 94 73 370 70 375 100 73 336 72 352 97 73 333 71 340 96 75 249 176 274 225 41 342 33 358 57 56 5 243 117 328 73 364 70 370 98 73 342 75 347 98 73 359 75 361 99 73 306 76 312 94 73 354 74 360 98 73 324 70 333 96 73 351 75 355 98 73 366 73 370 98 75 162 218 180 259 56 327 140 485 283 60 469 239 499 264 60 128 122 356 301 73 271 220 296 229 57 328 141 484 284 62 111 290 232 332 73 247 66 358 271 +4136 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394677.jpg 500 375 57 0 152 432 335 0 152 95 343 367 0 1 58 192 364 26 208 186 348 232 26 32 150 92 208 0 0 80 52 205 0 424 74 499 374 26 445 166 499 244 26 371 127 470 270 67 72 106 105 130 26 0 137 45 192 26 1 293 123 372 +4137 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548795.jpg 640 427 57 246 192 489 319 65 278 299 304 309 56 319 265 600 426 56 80 189 224 323 +4138 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000470173.jpg 446 640 1 226 173 298 218 1 211 173 260 214 +4139 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398450.jpg 612 612 1 245 560 296 588 1 225 532 252 580 0 446 502 501 611 0 505 508 555 611 0 57 499 82 563 0 413 494 443 586 0 186 492 207 544 0 233 494 258 550 33 376 331 391 360 33 47 415 66 426 33 8 367 27 382 33 108 446 124 465 33 268 455 279 465 33 70 404 82 413 33 337 391 346 398 33 568 428 579 456 33 282 417 294 421 0 38 547 58 611 0 206 495 227 564 0 301 498 315 531 33 219 416 222 418 33 84 438 89 444 0 386 494 396 531 1 301 510 368 591 1 554 580 597 607 33 567 324 574 332 1 284 539 343 585 33 537 276 558 303 0 158 498 191 595 0 11 558 31 611 33 138 245 468 463 0 2 474 593 582 +4140 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308900.jpg 640 480 2 144 226 168 233 2 220 228 243 234 2 289 228 311 234 2 170 226 182 233 2 101 225 137 234 2 180 228 190 233 2 266 225 288 235 2 245 227 267 233 0 140 282 197 389 0 445 373 537 474 0 491 251 507 306 0 142 244 159 285 0 584 246 602 279 0 430 244 445 278 0 537 243 550 283 34 192 339 225 369 35 444 261 447 266 0 63 322 100 401 0 304 234 311 253 2 470 227 494 233 2 320 225 340 234 2 351 224 364 234 0 614 370 639 454 0 0 320 15 412 2 191 228 198 233 5 191 216 239 227 35 76 366 91 374 35 154 266 158 270 35 444 262 447 266 0 375 447 434 479 2 208 228 214 234 0 346 428 399 479 2 68 223 547 239 0 159 231 398 450 +4141 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117786.jpg 368 640 3 342 441 367 487 0 199 407 271 603 33 58 77 160 126 0 148 441 158 467 0 179 450 185 469 +4142 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262509.jpg 640 480 8 42 399 243 452 5 335 322 379 340 74 287 137 300 151 74 268 138 273 153 0 178 332 182 341 0 173 334 177 346 0 162 333 168 341 0 153 336 159 349 0 159 334 162 342 0 474 324 478 341 0 392 316 397 326 0 145 332 150 349 0 170 333 172 339 0 354 316 358 325 0 469 324 473 340 0 173 335 175 341 0 167 334 171 347 +4143 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506515.jpg 640 480 0 32 45 437 473 63 406 128 525 244 62 16 1 589 473 +4144 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137271.jpg 640 480 0 196 302 205 343 0 180 302 189 342 0 114 298 131 344 0 26 291 38 319 8 461 279 483 283 8 328 272 354 284 33 272 163 393 288 0 557 292 566 315 0 576 294 581 314 0 569 292 576 313 0 504 282 508 285 8 590 280 610 286 8 559 277 575 284 33 188 248 229 313 8 548 279 560 284 +4145 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476398.jpg 427 640 0 5 73 423 628 63 0 179 288 470 56 138 161 426 632 57 41 200 198 422 +4146 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000237230.jpg 640 383 0 564 158 639 370 75 247 222 293 356 75 289 247 364 367 39 482 105 492 153 39 451 112 466 154 39 434 122 445 179 39 425 119 436 179 39 413 111 430 177 39 411 236 424 271 39 436 208 448 267 39 456 221 465 263 39 559 127 567 169 39 555 129 562 168 40 383 336 401 359 40 469 298 497 352 40 500 292 520 336 40 515 313 534 356 40 485 293 502 333 40 552 290 576 342 40 484 328 504 356 40 467 331 484 356 72 115 81 220 377 39 445 127 456 179 39 428 210 438 267 40 535 300 547 335 40 459 313 471 350 40 469 314 478 338 41 422 323 438 339 39 494 159 507 207 39 403 106 559 272 +4147 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000536879.jpg 612 612 0 1 8 415 602 63 158 422 588 604 67 263 288 322 338 +4148 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000284749.jpg 427 640 0 149 474 188 581 0 306 460 316 479 0 194 481 212 577 0 151 459 170 504 0 211 484 258 616 0 219 461 223 483 0 286 456 303 481 0 274 483 317 629 0 348 456 402 600 33 286 201 419 259 33 143 198 152 204 33 256 202 280 229 33 200 192 222 230 0 97 452 116 512 0 116 456 128 509 33 89 168 125 175 33 53 91 59 98 33 31 509 229 599 33 239 415 281 430 33 399 487 425 502 33 404 438 426 447 0 321 484 352 547 33 162 424 177 437 1 381 503 421 535 0 0 345 426 639 +4149 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000342006.jpg 480 640 8 171 503 272 550 74 393 251 419 277 8 103 473 330 522 8 0 480 67 495 +4150 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000438851.jpg 457 640 25 341 319 418 453 67 367 474 427 542 26 12 7 409 337 79 102 385 124 447 +4151 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580720.jpg 640 321 25 240 245 340 316 25 80 240 142 261 33 247 82 280 107 0 38 236 71 316 0 314 232 321 258 0 1 228 22 261 0 68 269 121 320 0 135 274 176 318 0 542 225 560 275 0 173 280 196 320 0 174 229 190 274 0 518 232 533 274 0 213 229 229 273 0 357 225 381 288 0 441 233 459 294 25 102 252 179 290 0 463 224 481 272 25 0 244 46 263 0 13 218 582 313 +4152 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153563.jpg 640 427 27 474 4 572 225 27 331 3 401 200 27 22 24 39 29 67 239 54 282 90 0 236 0 560 214 63 1 45 290 203 63 0 31 98 165 0 0 0 219 170 0 253 274 639 426 63 91 52 330 268 63 59 144 386 421 0 314 0 639 313 +4153 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136915.jpg 640 427 27 212 174 246 334 0 75 77 329 421 0 412 112 578 421 34 125 265 327 350 73 11 213 57 227 0 578 288 639 426 73 126 2 136 71 73 156 1 187 72 56 627 219 639 286 +4154 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239656.jpg 640 232 27 209 87 217 134 27 467 73 475 96 67 199 70 203 77 1 352 42 397 85 2 276 29 388 85 2 52 27 186 102 7 364 0 508 66 0 173 58 275 213 0 58 28 126 226 0 425 53 500 162 0 464 15 489 59 0 15 30 67 203 1 385 51 415 83 13 307 118 412 181 13 469 109 531 161 0 602 7 627 64 2 2 26 89 86 2 624 9 639 44 24 23 56 59 115 26 470 25 490 48 67 98 48 101 55 67 454 104 459 106 0 594 4 603 26 13 149 141 262 209 +4155 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158412.jpg 640 427 27 157 247 195 425 74 557 146 605 229 0 11 49 408 425 56 11 98 496 421 73 613 120 639 146 41 253 210 271 269 75 482 0 603 151 +4156 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474078.jpg 640 480 32 584 228 592 237 0 127 273 278 456 34 430 272 504 281 35 365 321 405 344 35 622 0 639 9 0 316 216 473 389 0 238 291 404 453 0 592 0 626 87 +4157 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058949.jpg 500 429 32 134 225 141 233 0 334 113 433 372 0 286 120 327 168 0 129 158 194 269 34 317 67 406 148 2 436 50 458 59 35 186 177 217 193 0 185 105 195 118 0 196 105 206 116 0 166 114 174 131 2 408 51 430 63 35 297 145 312 153 +4158 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271546.jpg 640 427 32 429 218 441 230 32 145 163 156 173 0 167 78 336 404 0 113 21 246 309 38 335 143 445 195 38 65 150 168 196 +4159 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103122.jpg 640 480 32 63 218 92 240 0 335 179 510 429 0 287 235 441 479 0 278 30 330 103 0 97 62 147 107 0 142 63 179 104 0 175 5 262 83 0 168 61 261 110 38 254 189 321 305 0 510 9 570 96 0 348 57 395 101 0 378 8 438 99 56 133 281 206 374 0 0 69 55 110 0 315 56 363 98 0 408 69 436 100 0 0 0 623 376 +4160 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000037988.jpg 640 480 32 350 60 361 71 0 305 142 405 451 0 144 2 234 115 38 282 251 316 338 0 375 3 436 46 +4161 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360926.jpg 333 500 32 135 123 142 130 0 151 213 226 420 38 209 221 255 264 +4162 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000261346.jpg 500 333 32 310 150 327 165 0 368 66 392 165 0 395 65 419 164 38 43 155 112 202 0 31 15 53 43 0 99 12 133 47 0 52 13 75 44 0 73 11 85 44 0 4 11 19 43 0 104 17 261 319 0 10 7 30 42 0 144 24 171 48 +4163 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393031.jpg 500 343 32 153 122 160 127 0 336 177 421 330 0 110 128 153 189 0 379 99 399 142 34 340 156 403 212 35 139 152 149 158 35 392 122 397 128 +4164 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000130849.jpg 500 333 32 392 16 403 24 38 245 45 272 79 0 151 68 279 325 +4165 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000872.jpg 621 640 32 408 172 427 188 0 145 100 436 557 0 163 126 428 606 35 368 157 425 202 +4166 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449903.jpg 335 500 32 299 337 310 345 0 21 197 173 389 0 67 61 88 100 38 22 195 33 243 0 200 31 216 43 0 226 35 241 47 0 262 39 271 50 25 0 47 52 97 25 70 1 170 36 25 7 0 84 34 25 162 2 265 33 56 264 146 294 163 56 227 146 258 164 56 309 163 334 174 56 282 127 313 143 56 250 129 280 144 56 201 145 228 158 56 239 111 268 128 56 258 94 287 109 56 259 200 301 260 56 222 199 263 258 56 295 145 324 162 25 0 25 70 61 56 244 164 274 198 0 179 144 234 247 0 140 10 176 112 0 288 420 333 490 0 55 88 65 99 56 16 72 334 303 +4167 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000500062.jpg 640 441 32 177 38 209 54 0 405 122 550 385 38 406 99 450 135 32 230 342 237 348 32 352 340 358 346 +4168 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033158.jpg 345 500 32 71 185 86 201 0 164 58 282 415 34 43 186 171 203 +4169 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020001.jpg 531 640 32 64 192 89 217 0 2 402 283 630 0 172 300 495 630 34 269 194 476 352 0 221 3 505 364 35 469 97 505 140 +4170 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240739.jpg 481 640 32 109 438 128 455 38 114 361 148 488 0 20 87 50 136 0 72 112 98 147 0 132 143 418 523 0 109 75 148 139 +4171 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345211.jpg 500 375 32 93 175 98 180 0 9 203 65 324 0 397 212 440 275 0 410 59 439 113 38 66 177 86 220 0 382 228 456 316 56 414 255 457 322 56 471 162 489 210 56 430 69 443 99 0 423 134 478 220 0 491 72 498 98 +4172 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153896.jpg 427 640 32 299 298 328 325 32 207 326 238 352 38 40 359 173 443 0 107 110 328 606 +4173 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000296255.jpg 640 425 32 351 110 363 122 0 191 75 333 339 38 324 101 387 143 +4174 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319726.jpg 427 640 32 302 21 316 35 0 122 249 351 618 0 0 335 20 447 0 7 289 41 446 0 33 288 96 457 0 113 276 182 472 0 73 288 103 451 0 85 277 132 452 0 117 282 136 311 0 296 273 342 335 0 367 291 395 335 0 205 295 224 344 0 173 299 203 345 38 192 293 214 351 0 192 291 207 321 0 1 272 217 377 +4175 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530013.jpg 640 433 32 538 252 544 256 34 424 225 447 238 0 426 223 480 311 0 381 235 442 289 0 333 220 374 295 0 356 97 392 185 0 401 92 422 142 35 433 243 442 254 0 529 84 556 139 0 563 81 590 135 0 601 80 628 134 0 509 14 532 38 0 433 82 460 148 0 61 40 86 71 0 143 104 171 133 34 364 93 377 123 34 466 176 491 187 34 460 173 463 189 34 454 120 458 147 0 163 104 188 129 0 0 0 635 181 +4176 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258628.jpg 413 640 32 159 462 172 475 0 145 214 314 503 38 202 163 250 228 +4177 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196141.jpg 640 429 32 0 111 22 129 2 76 62 150 105 0 247 74 416 374 0 555 99 603 212 0 440 73 456 105 34 158 151 253 182 35 452 208 495 251 2 166 72 233 114 2 243 75 299 117 0 453 206 630 416 0 36 67 66 163 2 468 72 583 136 2 357 81 397 122 +4178 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416489.jpg 640 426 32 446 198 454 205 38 191 153 241 202 0 384 0 440 136 0 100 149 204 351 0 448 0 495 44 0 531 0 583 48 0 594 0 639 49 0 304 0 363 62 0 125 0 170 27 0 93 0 135 26 56 429 90 443 126 0 354 0 400 74 0 37 0 77 24 0 0 0 33 20 0 414 0 449 43 +4179 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155131.jpg 640 480 32 295 0 310 11 13 330 273 419 340 38 294 0 320 87 0 280 86 421 421 0 475 188 523 348 0 586 193 639 361 0 139 177 196 267 0 138 180 157 227 0 110 185 150 266 0 78 178 114 265 0 63 177 87 209 0 47 192 85 266 0 7 183 54 265 0 40 163 64 203 27 601 219 611 260 0 194 180 231 226 0 195 173 208 192 0 0 44 228 267 +4180 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499105.jpg 375 500 32 147 131 158 142 0 115 154 220 310 38 95 154 145 178 +4181 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246014.jpg 480 640 32 291 127 299 135 0 79 398 159 601 0 116 243 163 370 0 111 182 173 231 38 188 282 201 339 0 173 274 220 334 0 45 171 78 277 0 308 268 343 305 13 331 147 365 160 56 167 300 210 365 56 297 224 321 236 0 187 274 281 478 0 150 234 177 279 0 176 188 204 230 0 203 190 236 234 0 457 240 478 286 0 174 216 207 256 56 125 140 138 149 56 139 140 152 145 56 156 140 168 148 56 79 132 94 140 0 169 188 478 307 +4182 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273493.jpg 500 333 32 320 133 323 135 0 365 157 389 203 0 68 118 121 242 38 392 174 403 179 38 110 189 120 203 +4183 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298493.jpg 333 500 32 207 218 232 242 0 37 96 205 426 0 198 167 297 324 34 3 215 194 257 2 157 110 332 206 13 57 215 332 249 13 269 273 332 290 13 168 248 332 256 +4184 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000081100.jpg 375 500 32 118 347 129 355 0 195 199 276 484 38 199 177 259 221 32 339 304 345 311 +4185 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330515.jpg 640 427 32 76 284 89 297 0 139 104 425 369 0 504 100 603 327 34 141 228 237 287 34 527 87 609 132 0 440 125 484 180 0 469 112 510 179 0 225 117 281 178 0 166 130 210 175 0 138 128 175 175 0 576 133 605 180 0 0 103 53 316 0 402 214 594 365 0 215 159 237 177 0 378 134 425 177 35 382 283 419 318 35 200 208 252 253 0 340 154 369 176 0 116 97 639 183 +4186 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185988.jpg 458 640 32 191 236 207 251 2 0 202 90 282 2 86 211 116 272 2 419 218 457 308 2 194 211 247 250 2 239 213 426 309 0 113 137 221 464 38 195 265 304 316 2 176 226 239 285 2 240 215 295 241 +4187 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432534.jpg 640 427 58 0 11 386 420 58 568 185 639 300 75 388 237 458 349 75 461 219 516 308 75 280 253 383 418 75 513 204 557 280 75 586 252 611 305 75 67 330 155 426 75 551 198 578 262 +4188 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557916.jpg 640 426 59 0 0 640 426 0 143 65 529 419 77 109 88 185 182 75 400 0 466 74 +4189 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216837.jpg 507 640 59 5 417 504 632 63 5 386 291 544 +4190 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304390.jpg 375 500 59 0 373 373 492 74 317 186 358 228 0 96 290 304 497 +4191 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011099.jpg 640 320 67 171 231 244 267 67 60 34 141 105 67 542 115 573 136 0 323 5 436 133 0 481 8 601 156 0 163 7 258 154 0 205 4 307 58 63 483 177 619 273 0 5 61 132 155 0 325 12 477 160 0 549 6 633 131 0 485 256 602 312 0 33 212 145 264 56 536 52 594 132 56 580 70 632 141 56 480 136 509 156 67 406 234 473 257 67 540 214 619 289 67 32 246 50 254 0 323 162 478 312 0 189 161 323 311 56 231 74 310 95 56 250 62 316 87 63 347 119 390 139 0 539 7 590 68 67 16 233 29 242 67 395 128 430 156 +4192 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294119.jpg 480 640 67 121 66 353 439 62 1 0 479 424 +4193 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000287550.jpg 640 427 67 447 290 492 308 2 490 321 559 373 2 87 319 128 340 0 195 61 491 422 2 70 322 77 327 2 8 313 21 327 2 47 321 59 329 27 349 208 377 287 2 0 311 12 327 9 221 192 224 200 7 145 316 195 346 +4194 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049985.jpg 640 480 67 550 253 593 284 63 371 152 544 299 56 95 96 166 189 56 279 111 354 212 56 160 101 227 185 56 180 61 230 83 56 450 102 503 126 56 401 98 449 121 56 355 117 415 191 56 26 91 99 136 56 426 45 456 54 56 134 43 177 61 56 86 54 133 75 56 144 77 198 103 0 225 70 286 201 56 196 82 227 109 56 0 0 619 202 +4195 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094846.jpg 640 434 67 263 234 327 283 56 372 6 639 189 0 18 29 395 428 63 304 29 543 367 0 0 108 105 175 56 39 321 438 432 56 0 305 106 433 56 171 0 367 65 +4196 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485740.jpg 640 427 67 133 259 151 300 0 76 196 276 421 0 239 299 394 426 0 360 305 574 422 0 419 206 572 363 0 364 246 422 331 0 251 151 349 352 0 218 214 276 314 0 4 218 97 369 0 350 232 389 302 0 88 224 135 296 0 143 138 194 201 0 15 270 118 426 0 438 209 456 236 7 188 178 260 202 9 440 125 460 160 9 162 45 195 117 26 156 152 183 199 0 18 177 639 426 +4197 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000056739.jpg 480 640 67 297 347 305 357 2 44 386 121 473 2 1 392 31 461 2 80 368 148 529 0 260 316 345 611 0 135 310 220 565 0 334 339 372 494 2 0 389 34 456 7 18 371 129 473 2 201 369 279 539 +4198 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000417727.jpg 500 375 67 256 309 285 361 0 429 73 499 273 63 44 108 269 365 63 329 91 470 241 56 0 206 47 339 56 481 299 499 334 63 177 14 355 139 67 441 90 466 134 56 95 2 185 106 +4199 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200109.jpg 500 335 67 114 83 293 249 53 205 5 326 160 0 0 0 258 258 +4200 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223276.jpg 339 500 67 247 264 271 283 2 47 15 221 112 0 128 126 295 460 2 233 4 334 82 +4201 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000235933.jpg 338 450 67 198 117 201 129 0 87 70 215 442 +4202 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475208.jpg 640 428 67 49 223 93 249 2 455 119 571 225 2 588 105 639 267 2 554 127 603 251 2 148 151 283 348 2 125 115 207 163 2 416 117 475 219 0 2 0 157 422 0 66 119 272 427 0 53 0 151 201 2 385 134 427 209 2 352 123 422 193 2 252 122 276 157 0 560 107 586 137 0 320 112 340 171 2 272 115 319 168 +4203 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306603.jpg 640 480 67 336 209 364 229 0 144 80 366 472 0 91 109 117 146 +4204 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000086011.jpg 640 480 67 595 386 619 404 56 209 139 280 271 0 352 111 603 404 0 48 96 265 326 63 3 259 218 391 63 406 339 630 416 64 377 384 404 412 56 387 288 409 341 64 0 305 8 315 +4205 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029697.jpg 640 480 72 198 102 349 377 +4206 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384554.jpg 640 480 72 111 4 598 478 0 572 66 622 359 +4207 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000019923.jpg 500 334 74 264 64 274 78 74 246 61 258 81 2 31 219 242 318 2 248 228 449 294 7 469 214 499 258 7 326 209 461 242 2 472 239 499 258 +4208 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395801.jpg 640 480 74 452 106 501 154 2 430 299 448 324 2 460 285 471 292 26 414 440 459 475 26 447 313 456 325 0 399 362 510 473 0 253 320 304 467 0 446 300 463 359 0 468 296 491 359 0 222 295 238 336 0 486 298 501 340 2 487 281 496 288 13 474 443 500 478 16 243 460 299 479 0 463 290 476 338 0 504 294 515 321 0 500 295 505 309 0 446 297 455 321 0 490 291 496 302 0 454 296 459 303 2 495 279 503 286 2 505 272 511 278 2 502 284 511 291 0 408 283 412 295 2 490 288 499 296 +4209 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243775.jpg 480 640 74 54 160 220 319 +4210 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314027.jpg 640 428 74 415 322 489 410 74 310 338 369 423 +4211 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043404.jpg 640 396 74 267 98 288 126 74 236 99 253 123 2 25 345 126 376 2 218 351 252 374 2 164 356 196 371 2 187 356 213 374 0 147 344 164 374 +4212 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207180.jpg 640 457 74 306 94 337 126 0 305 258 318 309 0 282 257 308 308 0 555 233 615 401 0 265 257 279 310 0 205 260 222 318 0 395 278 436 309 0 220 259 230 318 13 591 354 639 398 13 18 359 204 404 13 135 321 243 348 13 179 307 238 324 13 433 305 509 323 0 356 263 365 289 0 343 265 350 291 0 303 261 309 293 13 238 309 256 323 13 403 296 419 311 13 388 292 398 301 13 430 297 459 306 0 599 255 621 341 0 540 260 561 344 13 482 321 546 346 13 228 297 266 311 26 611 285 622 302 +4213 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482487.jpg 480 640 74 134 139 246 249 74 330 383 367 426 +4214 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182483.jpg 426 640 74 194 199 232 232 +4215 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000418961.jpg 640 427 74 161 212 286 363 +4216 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203845.jpg 640 438 74 216 190 241 217 0 112 406 135 437 +4217 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416660.jpg 519 640 74 220 90 298 165 0 204 359 284 556 0 5 369 32 484 0 31 368 58 428 0 285 357 361 612 0 98 367 139 473 +4218 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161308.jpg 640 440 74 314 175 538 406 +4219 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000509388.jpg 640 428 74 152 91 163 102 5 381 121 435 140 +4220 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527407.jpg 640 496 74 34 108 254 316 +4221 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390795.jpg 612 612 74 489 278 574 362 +4222 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162561.jpg 640 427 74 437 60 491 111 2 354 280 407 324 2 400 279 423 300 0 269 264 294 338 0 85 262 102 323 0 54 269 73 331 2 363 276 380 280 2 393 277 409 285 26 316 293 320 313 0 295 269 320 339 +4223 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256095.jpg 640 294 74 560 100 576 119 74 588 99 597 118 +4224 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082431.jpg 640 245 74 304 114 320 130 0 267 179 275 204 0 262 180 269 204 13 551 194 600 209 13 9 203 57 216 0 281 181 290 203 0 281 177 283 187 0 492 175 496 181 0 297 177 303 190 +4225 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087387.jpg 480 640 74 192 114 244 166 2 0 471 91 534 2 299 441 361 496 2 140 458 189 500 2 384 449 428 483 2 373 456 385 477 2 64 465 138 519 2 275 458 300 484 0 424 445 459 501 0 130 447 145 471 0 150 448 163 465 0 24 457 39 470 0 293 460 302 469 0 31 452 43 470 0 459 445 473 474 0 458 445 464 465 9 335 425 353 440 9 296 435 304 450 9 283 432 289 444 0 470 444 479 473 2 359 456 375 462 0 6 453 19 470 +4226 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160580.jpg 640 428 74 222 127 259 163 0 431 236 464 267 0 420 254 430 269 0 211 288 229 302 0 43 407 51 427 0 160 298 174 310 +4227 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138648.jpg 427 640 74 241 164 307 228 74 354 170 397 245 +4228 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260922.jpg 640 427 74 492 33 575 115 9 531 288 560 379 0 358 223 378 251 0 439 258 457 277 +4229 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082367.jpg 640 427 74 256 66 449 256 58 120 228 336 422 +4230 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409542.jpg 428 640 74 184 101 269 194 74 134 111 165 201 0 70 431 144 630 0 257 449 305 592 0 407 450 427 577 0 38 468 76 605 0 375 444 413 565 0 304 442 356 574 +4231 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288229.jpg 425 640 74 38 127 332 400 44 104 587 248 608 47 35 554 83 613 +4232 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256590.jpg 640 360 74 426 20 495 86 +4233 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434488.jpg 480 640 74 268 164 298 197 74 221 168 238 197 0 337 515 362 614 0 97 515 112 555 0 61 525 65 541 0 69 515 78 538 2 56 503 97 513 0 297 514 331 613 +4234 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000246522.jpg 427 640 74 226 288 260 327 +4235 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488736.jpg 640 480 74 170 182 316 339 74 339 191 416 346 +4236 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000170914.jpg 640 480 74 185 300 240 354 0 342 193 352 201 0 330 196 342 202 0 359 194 363 201 0 353 193 358 200 0 361 190 367 198 +4237 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402334.jpg 427 640 74 222 416 252 449 74 127 424 142 458 +4238 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213434.jpg 427 640 2 19 172 165 195 0 37 133 340 495 0 385 68 426 350 0 5 206 44 282 0 307 209 359 275 0 362 222 389 271 0 376 174 410 290 0 74 209 126 273 0 147 227 177 280 +4239 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063488.jpg 640 428 2 409 173 427 185 0 230 63 415 421 0 9 159 24 216 34 258 49 419 303 2 461 173 474 186 2 215 168 233 181 2 234 169 250 179 2 475 174 493 185 2 346 175 362 185 2 364 175 386 185 2 508 167 529 172 35 6 188 15 197 2 65 165 72 173 2 514 175 539 187 2 498 176 514 185 2 382 171 413 186 2 481 167 497 171 2 0 158 639 188 +4240 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435823.jpg 500 456 2 313 216 393 284 2 3 185 43 265 2 423 198 453 275 26 33 183 59 228 26 313 50 349 224 0 184 115 296 420 0 201 2 337 412 0 109 0 257 396 0 30 110 104 314 0 372 191 457 435 0 363 179 388 237 0 446 151 492 331 0 349 173 371 232 0 423 174 434 191 0 108 177 136 250 0 372 164 386 188 0 135 164 153 251 0 13 153 41 205 33 8 0 217 220 0 0 69 499 307 +4241 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000432898.jpg 500 500 2 145 286 182 299 2 96 279 144 298 2 138 277 186 296 2 209 286 223 297 0 347 267 438 482 0 57 280 64 298 33 374 237 383 244 33 472 127 483 133 33 392 154 398 165 33 316 227 320 234 33 280 255 288 263 33 226 258 237 273 33 55 22 116 69 33 77 238 83 247 33 11 241 26 249 0 425 291 433 310 0 116 281 124 298 0 106 283 111 299 0 319 283 330 310 0 433 286 440 308 0 233 286 236 297 0 368 283 378 304 0 256 284 261 299 0 473 289 483 309 2 293 277 348 299 2 198 288 219 297 33 110 257 116 264 33 94 255 102 261 0 194 286 199 299 0 342 283 359 305 7 227 276 279 299 7 458 272 493 306 33 276 245 287 255 33 112 236 116 241 2 87 282 104 296 0 77 282 87 297 33 102 236 371 277 +4242 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000209733.jpg 500 391 2 436 288 451 294 2 165 292 188 302 0 120 283 134 325 0 373 280 387 322 33 140 15 204 127 7 269 291 309 307 7 349 288 392 306 2 102 292 142 303 2 452 281 475 291 +4243 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197266.jpg 500 375 2 0 0 125 121 69 156 128 321 365 7 66 0 278 93 +4244 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000076844.jpg 640 480 2 578 136 639 159 0 315 230 400 447 0 366 84 504 401 0 160 212 281 432 33 147 42 199 106 +4245 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000501242.jpg 640 600 56 311 476 639 599 0 242 0 639 580 63 0 77 309 371 64 240 208 282 225 66 87 216 254 342 74 31 324 79 365 +4246 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027620.jpg 640 480 56 298 172 612 479 63 224 40 366 163 66 236 175 391 209 64 394 168 423 182 66 15 391 145 448 39 177 108 215 172 66 241 129 346 148 +4247 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000370513.jpg 640 480 56 390 375 624 474 63 410 50 525 189 64 342 280 377 300 66 212 285 364 371 66 36 287 155 355 62 105 115 308 295 62 307 99 408 248 63 1 191 205 395 66 425 124 508 158 41 508 251 527 273 67 184 332 213 349 41 542 225 574 285 +4248 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000275863.jpg 640 427 56 17 40 96 133 0 123 131 306 396 34 142 245 153 362 13 89 81 151 107 56 0 47 31 137 56 39 35 84 70 +4249 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057100.jpg 640 481 56 499 54 638 169 60 0 164 640 474 43 44 159 371 307 55 256 110 583 365 51 472 199 522 235 51 451 131 506 154 0 0 75 96 213 +4250 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000437720.jpg 625 426 56 164 132 324 413 56 374 130 435 288 75 480 133 508 206 0 290 38 362 133 0 242 109 428 420 60 340 219 614 241 63 397 129 500 221 +4251 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228197.jpg 480 640 56 44 528 150 632 0 72 497 170 593 0 14 509 19 521 13 171 514 424 631 33 212 81 374 429 8 210 502 239 508 33 97 274 130 369 0 468 486 470 491 0 446 488 449 493 0 4 507 7 516 +4252 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000380639.jpg 480 640 56 364 401 419 544 56 29 285 85 370 60 0 474 478 631 0 0 90 480 531 53 39 460 277 606 0 0 205 75 320 0 446 238 479 354 67 293 599 389 639 56 417 313 455 362 +4253 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000404027.jpg 640 427 56 226 20 267 132 38 337 189 443 269 0 127 0 254 134 0 379 124 568 409 56 184 91 205 106 +4254 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358389.jpg 500 379 56 35 121 128 304 56 121 116 184 253 0 432 1 499 290 0 282 0 369 81 0 0 51 481 378 56 1 125 36 226 56 0 222 37 374 56 178 110 221 183 56 214 100 276 187 56 276 197 344 337 56 329 349 374 371 56 424 292 499 372 63 40 238 176 362 +4255 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000431742.jpg 427 640 56 27 76 58 104 38 132 381 224 475 0 183 220 375 526 0 178 175 234 230 0 183 133 224 192 0 351 123 406 205 0 141 120 184 192 0 158 84 200 153 0 34 138 83 201 0 103 145 128 205 0 209 36 262 106 0 7 138 42 237 0 352 186 401 232 0 126 181 158 225 0 76 169 119 229 0 1 1 426 259 +4256 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462213.jpg 640 640 56 20 218 301 608 0 189 145 486 564 0 339 78 511 356 63 388 271 600 449 26 326 401 614 563 26 478 203 615 377 26 318 21 356 98 +4257 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000422833.jpg 640 424 56 540 267 637 418 56 468 219 636 416 56 545 165 639 231 0 225 116 403 362 0 344 22 589 411 63 65 232 355 408 60 1 271 526 418 +4258 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150080.jpg 500 333 60 2 3 499 328 53 22 47 457 307 56 70 0 158 42 56 0 0 73 57 42 444 261 499 332 +4259 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291866.jpg 640 428 60 0 125 329 422 41 112 276 173 358 41 80 189 127 245 41 36 202 83 258 41 0 155 36 207 53 336 295 482 356 53 150 178 276 250 +4260 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504152.jpg 500 333 60 2 284 482 325 76 335 34 365 105 +4261 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000508443.jpg 428 640 60 0 1 424 632 40 103 0 313 222 53 22 345 225 553 53 128 207 427 411 53 210 416 422 618 +4262 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272880.jpg 480 384 60 0 0 479 377 42 328 310 479 381 53 148 107 365 214 41 95 0 197 84 43 241 1 478 29 0 179 304 316 383 +4263 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000194790.jpg 640 480 0 304 15 451 313 0 167 1 319 393 0 70 0 197 440 0 459 16 585 272 0 1 3 68 366 53 264 363 447 467 53 418 320 576 396 53 506 280 639 340 53 92 435 302 474 0 237 0 313 101 0 28 0 115 409 56 364 265 477 334 56 473 241 547 288 56 216 304 365 389 72 335 0 527 113 +4264 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137395.jpg 500 333 0 287 147 399 328 0 176 49 227 221 34 364 82 401 221 34 147 60 211 76 32 253 241 261 244 +4265 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000457901.jpg 480 640 0 61 93 335 639 34 235 211 356 305 0 191 284 380 639 0 314 85 479 639 25 329 361 358 467 56 0 491 87 635 +4266 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000542792.jpg 500 375 0 419 246 449 274 0 409 262 434 288 34 64 5 360 325 0 347 320 396 357 0 366 308 387 329 +4267 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273246.jpg 640 425 0 515 267 538 327 0 491 321 515 400 33 265 63 287 83 0 482 300 495 330 +4268 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217951.jpg 640 319 0 322 192 349 243 37 327 243 359 249 33 181 130 235 208 +4269 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000472211.jpg 640 480 0 101 154 238 471 0 454 223 483 298 0 346 235 373 274 0 317 238 345 284 33 117 96 227 218 0 432 234 449 272 0 485 248 501 274 0 53 202 60 226 0 60 201 68 213 13 306 255 420 291 13 94 234 129 241 26 502 256 525 294 0 506 240 531 330 0 450 243 454 252 13 420 259 435 269 24 502 270 523 293 26 341 245 358 267 0 432 229 442 270 +4270 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000480726.jpg 640 426 0 280 175 318 284 0 166 163 223 233 0 255 183 306 288 0 441 265 555 420 0 360 287 442 425 38 320 228 355 260 0 306 183 351 284 0 328 184 359 288 0 304 298 378 420 0 170 283 282 425 0 530 138 554 168 38 252 240 270 265 56 152 208 229 283 0 460 246 498 316 0 419 311 453 357 38 300 243 308 258 38 344 260 349 264 +4271 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000212054.jpg 640 425 0 59 84 258 420 0 427 46 592 419 33 235 132 465 417 +4272 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000413950.jpg 333 500 0 110 386 264 499 33 76 11 91 22 0 218 423 299 499 +4273 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043605.jpg 640 427 0 48 238 263 422 38 0 270 59 352 +4274 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000562906.jpg 640 480 0 0 181 142 474 53 124 34 570 467 +4275 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358652.jpg 428 640 0 148 137 366 510 77 97 84 299 390 59 1 456 114 631 +4276 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541071.jpg 374 640 0 285 542 316 610 0 329 531 332 540 26 306 551 327 585 0 262 531 266 544 33 283 62 314 123 0 92 541 93 545 0 69 543 73 555 0 66 545 68 554 0 21 545 27 568 0 254 536 257 544 0 247 534 250 543 0 334 533 337 541 0 59 543 62 551 0 38 545 43 558 0 258 533 262 543 0 44 532 131 557 +4277 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137300.jpg 640 427 0 401 200 476 403 33 353 34 444 118 +4278 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000095670.jpg 640 427 0 411 246 423 264 33 285 109 312 141 33 190 135 203 151 33 86 150 108 182 0 234 277 243 289 33 288 230 297 238 33 186 247 190 252 37 408 260 427 267 37 233 290 236 292 0 60 316 78 331 33 413 239 416 242 33 333 174 350 192 33 458 156 467 171 33 154 166 164 178 33 348 226 355 239 33 217 226 226 238 33 283 209 288 216 0 437 280 447 294 33 541 190 551 204 33 4 198 588 270 +4279 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000523517.jpg 640 480 0 302 151 519 466 34 320 90 412 185 35 139 323 172 377 0 10 289 174 454 0 0 255 51 479 35 305 178 326 202 +4280 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162580.jpg 587 640 0 24 13 554 632 77 63 115 409 327 56 509 338 586 542 56 0 274 451 639 +4281 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000510798.jpg 640 480 0 487 198 576 363 0 321 225 477 371 0 239 184 356 345 34 323 152 332 233 35 327 301 355 322 35 305 210 328 238 +4282 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105973.jpg 480 640 0 92 314 182 576 0 162 373 257 538 0 35 153 139 379 +4283 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000136718.jpg 640 428 0 0 33 314 421 63 210 155 573 422 57 1 0 508 378 +4284 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494144.jpg 640 480 0 265 271 387 472 0 382 158 527 472 0 110 409 142 479 0 58 457 80 479 33 249 79 326 146 24 305 290 383 356 24 425 293 529 439 26 110 432 138 479 13 510 258 638 322 13 525 229 638 280 13 385 365 408 430 +4285 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408774.jpg 500 333 0 166 124 215 212 0 0 109 31 329 0 219 162 281 181 0 33 135 85 218 35 220 174 226 179 35 165 172 176 185 +4286 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336629.jpg 500 375 0 396 46 463 162 0 195 5 297 262 0 266 44 326 165 0 71 45 219 271 0 9 43 64 166 0 132 26 175 90 0 61 23 114 80 0 324 37 399 161 34 181 93 187 101 0 0 19 28 101 56 333 17 404 39 0 464 44 499 163 0 12 51 170 268 56 349 38 396 71 56 370 52 417 78 56 397 36 459 58 56 450 53 469 77 56 311 55 339 67 56 405 14 469 42 56 14 20 59 40 56 289 18 333 41 56 19 41 71 81 56 107 38 134 68 +4287 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272129.jpg 426 640 0 61 375 364 631 33 102 88 132 244 33 224 57 311 236 +4288 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000430744.jpg 412 640 0 136 158 314 541 34 148 28 242 172 +4289 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467116.jpg 500 375 0 74 52 345 368 24 0 173 165 370 +4290 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000088859.jpg 640 426 0 192 208 212 254 34 410 349 428 366 0 173 153 188 179 0 478 147 503 179 0 537 155 556 191 0 576 127 598 155 0 454 384 491 425 0 404 359 431 422 0 136 86 155 120 35 538 179 542 182 35 193 213 197 219 +4291 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390238.jpg 640 427 0 405 13 639 291 53 68 137 377 371 60 0 198 640 426 +4292 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000149268.jpg 480 640 0 276 267 320 456 33 119 92 169 156 26 220 427 280 474 +4293 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054723.jpg 640 427 0 0 1 601 425 63 190 146 639 396 13 112 0 638 256 +4294 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083275.jpg 500 333 0 382 109 437 225 0 343 124 404 211 0 195 99 284 229 34 222 96 261 130 35 343 150 355 170 +4295 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268882.jpg 500 375 0 407 219 499 369 0 391 216 448 345 0 335 288 397 373 33 102 43 256 100 +4296 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000514586.jpg 354 500 0 56 110 300 499 0 212 100 330 226 0 241 101 261 157 34 0 9 136 172 0 0 188 83 305 2 276 120 312 152 7 326 114 354 151 +4297 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321647.jpg 640 429 0 279 181 297 226 0 162 250 200 352 0 178 293 247 364 0 441 189 491 263 0 117 251 163 367 0 21 171 37 201 34 170 236 184 257 35 294 204 300 208 35 468 189 478 196 +4298 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094046.jpg 640 595 0 152 108 466 551 34 359 367 439 455 34 599 241 638 348 34 406 239 443 347 13 55 233 132 282 13 378 234 502 329 34 377 238 407 354 13 124 225 180 325 +4299 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518109.jpg 480 640 0 0 68 270 629 0 205 140 225 243 63 192 311 456 543 73 247 366 278 408 26 201 164 212 200 0 226 134 235 151 +4300 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280036.jpg 418 640 0 201 355 344 631 33 86 12 116 45 +4301 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000161861.jpg 500 375 0 176 79 275 315 38 148 179 222 230 +4302 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396167.jpg 423 640 0 173 10 404 631 0 367 39 422 404 34 158 212 239 483 34 25 335 59 380 0 0 9 202 595 +4303 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503522.jpg 500 375 0 408 146 478 314 0 379 39 393 78 0 239 102 290 269 34 264 85 314 122 0 288 29 299 53 0 476 176 499 325 +4304 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000012543.jpg 480 640 0 168 357 255 630 0 208 421 310 633 0 448 517 479 581 33 262 55 327 99 +4305 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193108.jpg 375 500 0 101 151 307 499 0 0 0 131 491 34 218 41 241 160 34 82 352 132 391 0 263 319 319 463 +4306 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026534.jpg 640 427 0 275 181 418 423 33 202 68 285 151 +4307 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554711.jpg 480 640 0 12 152 337 532 63 158 207 479 587 66 163 418 326 576 59 1 197 479 631 +4308 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157109.jpg 426 640 0 250 591 279 624 33 99 1 172 139 37 244 620 272 624 +4309 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000146830.jpg 427 640 0 165 428 332 629 0 117 257 226 373 0 121 388 212 601 0 272 54 303 126 0 417 145 426 263 34 122 361 183 410 35 117 287 135 307 32 238 283 246 290 0 234 455 394 608 35 284 81 293 89 35 319 486 337 496 +4310 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000323930.jpg 500 375 0 252 55 303 202 0 105 99 169 271 34 66 146 154 173 35 266 76 289 97 32 96 170 101 175 +4311 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233919.jpg 640 426 0 2 53 330 374 63 18 0 639 424 +4312 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030062.jpg 640 427 0 1 2 448 388 63 189 40 637 316 64 194 306 454 397 +4313 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110617.jpg 640 426 0 107 36 384 401 13 0 246 142 322 13 307 243 412 305 13 431 230 574 288 34 110 17 218 158 24 562 232 616 297 24 41 198 132 250 24 319 201 402 248 24 447 198 521 241 13 171 246 309 309 24 180 223 255 266 +4314 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000192007.jpg 640 480 0 333 109 420 338 0 167 130 241 209 0 483 105 639 362 0 0 67 45 206 34 404 168 477 202 0 555 216 636 353 0 208 108 230 187 0 340 35 352 60 35 17 97 34 121 +4315 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000014756.jpg 500 500 0 121 88 464 492 34 55 128 442 426 +4316 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000408534.jpg 640 426 0 215 293 232 330 33 380 0 417 18 +4317 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506707.jpg 640 427 0 572 117 639 337 0 470 110 594 365 0 174 172 249 330 0 280 83 360 371 0 380 124 462 305 0 457 157 506 270 2 175 153 274 270 2 366 167 389 283 13 459 265 501 275 35 333 142 359 192 34 346 267 398 318 0 27 110 136 377 0 332 128 379 317 56 0 211 31 319 2 0 158 39 189 56 137 246 152 261 +4318 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000107839.jpg 640 427 0 313 366 325 393 0 428 310 481 393 33 256 248 274 274 33 443 311 600 372 33 621 360 627 369 33 300 350 305 357 37 420 347 442 392 33 615 363 622 369 +4319 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073491.jpg 500 400 0 50 14 338 382 0 226 30 279 245 0 74 24 148 292 0 336 33 419 289 34 297 89 447 154 24 340 242 393 290 32 66 207 77 217 0 266 0 359 292 56 0 172 70 293 0 473 93 499 151 +4320 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000042743.jpg 425 500 0 31 48 276 486 38 197 260 344 341 0 317 5 409 91 0 2 3 83 63 0 245 3 334 84 +4321 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000162445.jpg 480 640 0 135 438 255 639 0 312 474 400 639 0 48 500 66 539 0 21 506 35 540 0 118 499 133 537 0 61 498 75 538 33 140 107 165 127 33 102 276 118 288 33 424 368 430 373 33 416 400 425 407 24 335 504 395 627 24 73 525 89 543 0 444 493 453 532 24 427 503 436 514 33 143 262 152 269 0 385 486 414 559 0 271 494 282 525 0 284 494 296 522 0 410 503 417 513 33 70 70 129 219 0 87 492 100 531 0 90 500 110 565 0 2 479 478 557 +4322 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154520.jpg 640 416 0 498 277 606 415 0 454 382 504 415 33 28 18 92 88 33 273 199 287 206 33 609 8 628 21 +4323 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000181303.jpg 640 358 0 228 81 288 308 33 185 49 320 126 +4324 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050100.jpg 640 428 0 512 329 565 426 0 583 314 634 427 0 557 396 579 427 0 45 338 78 417 0 215 350 225 376 0 101 355 109 376 0 138 351 156 385 0 260 344 270 373 33 306 135 329 145 33 425 217 430 225 33 313 115 355 124 33 283 216 296 229 33 425 0 466 38 33 402 85 430 95 33 197 161 200 165 33 456 27 463 34 33 144 71 160 81 33 325 185 337 193 33 216 184 224 195 33 477 247 538 281 0 120 349 131 381 0 0 342 17 420 0 176 347 185 377 0 368 350 377 372 26 521 351 535 382 0 191 354 198 377 26 449 358 455 365 0 14 263 639 384 33 223 324 592 387 +4325 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046252.jpg 640 480 0 143 175 274 359 0 470 174 530 380 34 205 131 235 195 35 337 275 370 305 0 336 234 423 377 +4326 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308339.jpg 640 429 0 204 1 639 419 63 0 198 397 394 59 0 135 640 428 +4327 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199437.jpg 640 480 0 347 143 540 439 0 18 199 131 372 69 259 201 394 314 39 17 188 23 206 39 23 193 27 206 39 37 183 43 207 39 58 189 65 207 39 99 215 104 231 39 72 193 75 199 39 5 216 10 233 39 10 220 15 233 45 173 300 217 323 45 327 304 362 330 53 283 314 331 323 0 151 202 199 251 0 0 321 72 466 39 9 197 16 206 39 32 183 38 206 39 44 182 52 206 39 52 193 59 205 53 135 311 182 325 39 93 190 99 206 39 91 170 121 214 +4328 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000499093.jpg 334 500 0 139 397 150 427 0 171 435 180 454 0 24 381 32 403 0 302 368 310 387 0 137 446 146 458 33 243 206 282 252 33 223 21 260 66 33 43 100 94 145 37 149 409 157 420 37 149 454 161 457 0 188 444 193 449 0 167 433 173 451 0 118 445 131 457 0 197 450 201 453 +4329 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256547.jpg 640 393 0 251 17 352 148 0 354 47 448 283 0 294 1 384 48 34 385 49 465 59 35 324 121 347 152 +4330 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000100909.jpg 472 640 0 0 337 263 634 34 57 129 247 176 35 162 426 264 481 0 80 155 377 574 0 215 114 268 187 +4331 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447354.jpg 640 481 0 324 0 639 338 53 9 259 579 473 56 45 238 280 314 56 343 158 370 178 56 616 165 639 184 56 280 198 321 267 +4332 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000122266.jpg 428 640 0 138 326 320 632 0 33 492 43 515 0 50 496 56 516 33 13 333 20 338 33 2 411 6 414 33 16 425 18 431 33 163 124 197 158 33 129 406 132 408 33 343 502 359 510 33 386 477 390 480 33 141 431 149 439 33 390 363 393 366 33 143 232 153 241 0 12 506 16 512 0 115 516 120 525 33 104 316 109 322 0 102 517 108 523 0 346 522 355 534 0 407 515 413 534 0 401 521 405 533 0 406 521 409 532 0 92 516 96 521 33 0 93 176 492 +4333 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157592.jpg 500 332 0 37 59 157 258 38 144 7 175 74 32 467 53 477 62 +4334 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000347772.jpg 640 427 0 166 139 293 341 0 408 212 494 352 0 494 178 638 355 34 235 78 287 160 35 407 289 425 323 +4335 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557977.jpg 640 480 0 202 269 293 441 0 594 41 625 125 0 326 216 403 400 0 10 79 41 202 0 298 309 374 439 34 337 216 374 275 35 601 66 612 76 0 202 32 250 112 +4336 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068204.jpg 480 640 0 287 527 319 560 33 193 110 276 162 0 329 477 352 561 0 221 447 268 569 +4337 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000410724.jpg 640 480 0 15 0 196 189 0 328 0 507 118 76 499 318 618 408 0 480 196 565 243 +4338 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000311904.jpg 375 500 0 107 114 341 481 38 95 89 158 214 +4339 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289960.jpg 640 480 0 440 290 490 396 33 46 82 234 199 +4340 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300701.jpg 500 375 0 391 185 408 244 0 171 188 196 246 33 204 180 275 210 +4341 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565239.jpg 500 376 0 30 3 116 155 0 354 226 443 332 33 159 10 209 77 +4342 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383384.jpg 640 360 0 395 95 463 160 0 318 69 387 166 0 487 78 568 161 0 285 1 310 36 34 365 91 399 100 35 395 108 410 119 0 169 0 184 17 0 145 0 164 16 32 185 82 190 86 0 85 0 100 15 0 29 0 39 16 0 466 198 550 359 +4343 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403675.jpg 640 563 0 13 2 220 290 34 283 124 626 551 0 5 20 554 555 35 398 496 498 562 +4344 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000330734.jpg 640 640 0 519 444 565 573 33 77 86 141 142 0 126 372 141 428 14 520 399 528 406 24 447 509 479 525 +4345 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039322.jpg 500 500 0 261 131 279 174 0 59 75 229 405 0 354 137 367 176 0 326 135 334 160 0 388 152 400 164 0 399 152 409 166 0 441 141 449 164 0 463 164 478 181 0 224 137 230 153 0 342 148 350 163 33 414 36 462 88 33 478 89 491 103 0 62 124 73 151 5 344 131 421 163 7 240 126 329 158 33 383 72 391 78 33 389 76 395 82 33 233 77 245 84 33 131 99 141 106 33 458 100 465 107 33 0 84 10 90 33 187 80 192 84 33 329 125 363 161 33 90 82 103 97 2 240 140 262 153 7 348 130 421 162 0 125 127 134 135 7 41 119 87 149 7 33 114 107 141 33 211 90 213 93 33 243 83 246 86 0 77 130 84 152 0 1 123 499 467 33 51 102 289 123 +4346 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000409725.jpg 640 480 0 108 289 268 473 0 19 346 97 478 0 251 369 397 473 0 482 425 548 478 0 467 322 567 470 0 401 386 444 448 0 453 403 483 477 0 565 400 590 443 33 297 186 314 196 33 25 171 63 210 33 0 149 29 161 33 81 270 110 283 33 149 272 162 280 33 43 275 71 293 33 272 312 285 334 0 380 386 409 475 0 471 427 493 477 1 574 440 631 479 33 104 70 201 105 33 244 363 273 388 0 292 357 315 381 0 0 375 22 463 1 558 450 604 479 2 401 351 419 355 0 176 383 245 479 33 160 299 174 309 0 19 367 571 475 +4347 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191096.jpg 640 360 0 153 125 322 319 0 426 142 498 332 0 37 11 82 70 34 231 246 287 305 35 433 211 454 247 0 553 149 639 321 +4348 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000110562.jpg 480 640 0 54 20 470 348 0 5 190 478 639 63 0 266 211 565 63 87 142 239 297 57 169 39 479 208 57 93 227 454 437 +4349 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233950.jpg 640 426 0 97 343 117 375 33 483 136 525 205 +4350 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270474.jpg 500 375 0 190 11 327 369 34 287 126 480 237 +4351 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000299553.jpg 375 500 0 193 446 208 499 0 348 359 370 431 0 122 412 130 422 0 197 402 207 423 0 173 416 181 441 33 185 173 219 232 33 121 110 160 124 33 164 229 180 282 33 339 285 358 300 0 100 405 110 427 0 39 473 55 500 0 298 466 341 498 0 271 356 306 427 0 73 426 85 462 0 110 409 118 433 0 178 451 197 499 0 300 344 326 423 0 1 0 374 499 +4352 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474344.jpg 640 427 0 164 98 300 416 34 230 36 251 206 0 505 206 558 329 +4353 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425948.jpg 424 640 0 274 518 309 620 33 134 286 199 422 0 69 436 118 565 +4354 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398753.jpg 640 480 0 121 318 160 351 0 143 305 163 328 0 331 296 342 323 0 570 336 600 364 0 596 327 615 363 0 520 297 529 323 0 535 295 544 321 35 569 343 574 348 0 221 302 235 328 0 422 461 451 479 0 540 454 580 474 0 514 296 521 322 34 548 310 554 325 0 525 318 559 361 0 599 411 639 479 0 1 220 639 479 +4355 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000075033.jpg 640 478 0 234 136 430 476 33 279 21 538 212 +4356 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082847.jpg 640 427 0 428 147 495 340 0 484 100 566 421 33 189 44 369 158 +4357 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000128748.jpg 491 640 0 307 97 463 631 34 291 449 339 594 35 0 347 20 414 0 156 44 355 589 0 0 79 209 608 +4358 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482951.jpg 640 427 0 372 114 450 351 33 298 67 403 214 2 543 17 587 31 2 509 12 550 26 2 464 12 507 31 2 390 12 430 29 2 303 14 336 25 2 121 9 145 23 2 578 16 597 32 2 228 15 248 27 2 597 17 636 32 2 337 13 368 25 2 54 11 83 22 2 194 13 211 29 2 84 8 121 26 2 24 3 456 27 +4359 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032715.jpg 480 640 0 279 427 323 595 0 366 519 416 618 33 2 289 191 575 +4360 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465887.jpg 640 480 0 45 351 249 479 33 276 86 292 94 +4361 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000026432.jpg 612 612 0 237 490 255 557 0 179 464 187 491 0 227 478 244 554 0 268 500 294 530 0 322 491 347 554 13 526 547 575 582 13 404 555 505 561 0 376 487 387 511 0 399 485 408 518 0 544 522 587 578 0 465 469 471 494 7 463 443 611 556 13 400 528 464 542 13 264 534 301 556 25 123 465 149 475 25 151 463 166 474 33 333 343 386 358 33 263 352 328 371 33 353 279 399 293 33 547 283 592 301 33 209 372 218 377 33 553 149 603 159 33 211 402 238 412 33 293 272 303 279 33 254 236 353 270 33 298 436 311 451 33 166 431 191 462 56 289 513 303 537 0 376 515 399 573 0 389 490 394 509 33 388 340 412 347 60 400 528 475 541 60 257 521 338 531 60 521 539 546 546 0 447 471 455 487 0 434 458 441 479 13 370 550 401 557 33 346 311 352 317 60 375 537 469 547 0 0 443 529 593 33 207 13 606 420 +4362 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000000192.jpg 640 480 0 349 253 480 473 0 437 218 515 466 0 0 274 36 479 0 268 179 379 414 34 13 381 49 473 +4363 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576654.jpg 640 427 0 501 229 583 382 0 190 319 200 341 33 243 35 491 157 +4364 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000452759.jpg 640 428 0 589 74 638 150 0 184 49 476 390 0 0 176 180 383 0 412 86 464 156 0 546 3 580 84 0 132 84 180 164 34 436 225 471 302 35 168 271 221 329 0 527 0 548 33 0 621 0 639 35 0 445 0 481 31 32 473 273 489 289 0 570 0 637 87 0 481 4 514 32 0 486 39 501 58 +4365 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000393874.jpg 481 640 0 1 71 418 570 63 237 418 480 551 64 287 524 306 560 56 3 352 172 576 +4366 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131115.jpg 640 428 0 170 181 371 386 0 346 149 387 179 0 161 146 223 262 0 143 62 236 151 0 298 71 339 101 0 59 16 87 74 34 403 31 446 131 35 329 239 370 268 0 288 146 326 181 0 369 55 588 362 0 565 75 638 142 0 504 74 526 119 0 7 121 177 389 0 612 57 639 121 0 250 69 349 130 0 1 0 639 215 +4367 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332407.jpg 640 480 0 238 190 375 472 0 174 164 212 284 0 536 152 560 200 34 215 181 378 348 0 426 134 588 473 35 176 212 199 229 35 545 171 559 182 0 226 145 250 193 34 422 81 436 234 74 448 261 458 270 0 115 148 132 182 +4368 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526089.jpg 640 427 0 162 21 405 419 63 447 167 639 280 +4369 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399741.jpg 640 505 0 0 191 75 363 77 263 158 395 355 0 341 0 442 81 57 0 0 86 122 0 172 29 467 477 +4370 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308587.jpg 480 640 0 112 368 120 384 0 361 341 364 352 0 93 349 99 359 33 262 174 301 209 33 54 245 75 280 8 81 339 104 347 33 359 120 393 165 0 270 352 275 363 0 447 322 450 330 0 354 325 356 330 0 422 322 423 329 0 434 317 437 323 0 411 314 415 321 0 388 319 391 325 0 72 325 81 330 0 102 323 105 331 0 39 329 42 334 +4371 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361730.jpg 640 480 0 142 362 181 435 0 562 341 597 450 0 552 366 562 399 0 374 394 392 425 0 426 351 455 418 0 264 379 269 397 0 342 370 348 388 0 220 382 254 427 13 156 403 224 433 0 104 402 123 436 13 31 414 116 451 33 208 162 245 187 33 407 251 419 256 33 356 241 367 250 33 266 287 287 303 33 395 215 410 225 33 427 268 469 307 33 365 188 376 198 33 567 264 636 303 33 275 241 340 258 33 291 294 337 306 33 525 141 540 161 24 622 431 639 450 33 273 224 287 231 0 463 389 496 467 33 444 166 458 172 0 402 383 429 427 0 598 357 626 451 0 122 386 129 405 0 7 370 500 442 33 35 106 639 479 +4372 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000231991.jpg 500 375 0 101 105 350 370 63 241 159 392 301 73 363 99 431 119 73 358 113 430 132 73 297 115 353 140 73 387 153 499 185 73 346 128 392 148 73 340 136 389 159 73 389 136 499 170 73 182 193 274 230 56 104 304 166 374 66 269 234 344 283 73 350 121 441 146 73 356 105 432 124 73 345 133 390 153 73 338 141 396 170 64 315 306 353 327 73 476 175 499 191 73 286 131 499 205 +4373 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000493273.jpg 392 500 0 199 391 209 422 0 95 406 111 441 0 246 390 262 439 33 105 141 140 159 33 242 145 257 158 33 15 190 20 202 0 375 381 385 411 33 350 171 368 181 33 213 165 228 172 33 37 272 52 278 33 155 187 167 199 33 67 232 80 236 33 194 155 201 161 0 328 378 342 414 0 305 385 314 414 0 283 384 291 399 0 264 391 282 437 0 209 392 218 420 0 67 409 71 418 0 47 414 48 424 0 342 385 355 425 +4374 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248112.jpg 640 480 0 261 198 302 328 0 626 207 639 288 38 235 213 270 251 38 600 257 632 272 +4375 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053949.jpg 480 640 0 0 0 148 632 0 238 29 479 620 0 80 57 371 462 38 293 365 377 500 38 78 435 479 618 0 149 275 196 373 +4376 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158227.jpg 500 357 0 112 9 377 351 34 107 36 158 286 +4377 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379332.jpg 500 334 0 90 142 161 322 0 430 121 499 332 38 0 78 93 265 0 71 40 477 328 56 51 253 104 326 +4378 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390902.jpg 333 500 0 49 73 265 498 38 53 432 91 499 0 180 59 227 182 +4379 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269311.jpg 429 640 0 35 161 161 495 0 175 76 294 436 34 46 339 99 480 0 90 348 300 639 +4380 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111593.jpg 640 480 0 56 17 394 477 33 234 294 580 404 33 319 360 515 424 33 348 373 575 479 33 301 348 536 427 40 371 178 397 205 40 486 158 515 201 41 259 78 292 107 33 297 404 405 447 33 490 298 588 383 33 364 422 428 457 33 281 344 519 412 39 373 231 390 291 40 500 9 535 90 40 534 24 553 88 40 524 25 535 91 40 500 160 525 201 40 518 157 563 200 41 370 177 394 202 41 401 183 422 202 41 248 82 260 110 41 276 189 281 204 41 424 187 437 202 41 269 138 284 159 41 287 183 309 203 41 283 83 302 105 41 263 156 282 178 +4381 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348571.jpg 640 454 0 71 7 559 445 69 7 0 283 240 +4382 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000434622.jpg 640 426 0 123 177 180 295 0 172 204 205 294 33 501 38 519 59 +4383 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000576629.jpg 427 640 0 37 104 295 632 0 353 176 425 558 0 244 153 346 544 0 235 185 282 221 34 66 78 196 205 34 332 387 402 567 0 42 272 127 562 +4384 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132182.jpg 480 640 0 31 174 91 316 0 387 181 422 296 0 76 184 106 241 34 107 65 136 173 35 1 316 42 369 0 9 149 52 194 0 104 162 258 527 +4385 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000276804.jpg 512 640 0 296 367 314 414 0 219 474 265 585 34 228 440 256 491 0 283 473 339 611 35 178 394 188 404 35 306 381 311 386 0 281 520 305 599 0 151 379 187 459 +4386 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396997.jpg 640 420 0 0 162 73 383 0 342 88 513 384 0 567 161 609 230 0 502 164 546 234 0 328 175 367 237 0 110 209 254 370 35 231 258 255 289 34 412 91 422 180 34 303 210 328 247 56 379 196 408 241 56 488 185 517 236 13 92 184 127 211 13 120 185 166 211 56 303 196 344 239 56 536 188 576 237 56 470 189 491 237 56 562 189 596 212 +4387 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447242.jpg 640 480 0 509 249 568 432 0 303 282 332 363 0 450 292 455 311 0 439 293 446 312 33 274 205 322 219 33 421 377 496 413 0 298 291 301 311 +4388 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000085101.jpg 480 640 0 182 392 203 440 0 223 383 245 453 0 253 393 266 438 33 136 177 163 231 33 112 222 127 244 0 393 395 412 422 +4389 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505516.jpg 640 427 0 53 55 196 373 0 221 180 351 338 0 359 103 420 270 0 447 106 501 262 0 271 254 550 340 0 277 70 379 295 34 366 184 411 270 34 251 205 264 225 +4390 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578341.jpg 426 640 0 1 272 414 631 38 251 269 405 496 +4391 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545756.jpg 640 427 0 316 19 638 330 38 280 94 330 155 +4392 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254711.jpg 640 479 0 382 271 487 417 0 504 255 534 326 0 166 265 183 310 0 25 269 57 318 34 318 298 396 321 35 529 333 544 361 0 465 262 481 302 13 397 270 435 288 35 46 291 53 298 13 358 279 370 287 13 357 275 395 278 0 528 307 639 416 13 463 284 507 294 +4393 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000540912.jpg 500 375 0 5 137 298 372 64 18 81 119 217 66 132 69 486 223 +4394 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007899.jpg 640 427 0 84 25 419 404 0 441 202 465 280 0 54 268 71 314 0 17 278 45 319 0 623 225 639 262 0 603 232 627 267 0 336 232 361 292 33 522 59 525 63 33 567 203 602 237 33 471 72 479 80 33 512 199 533 208 33 634 159 639 162 33 544 99 553 105 33 575 109 581 113 33 298 74 329 90 33 448 97 460 104 0 436 243 457 281 33 428 203 434 209 33 488 178 493 183 33 97 85 108 90 33 590 139 592 142 0 573 242 582 269 0 587 203 631 267 0 532 183 569 273 33 1 8 539 340 +4395 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300330.jpg 640 480 0 68 32 386 400 0 478 153 639 370 63 306 201 504 395 56 220 364 530 473 56 7 259 243 469 56 463 303 639 479 0 0 357 21 471 +4396 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401892.jpg 500 375 0 109 244 151 374 0 380 245 432 370 0 330 70 375 186 0 108 217 117 247 33 103 35 184 94 33 334 51 445 121 33 390 222 488 287 33 110 232 216 290 0 190 36 195 49 0 445 52 450 62 0 268 203 274 217 0 431 51 435 62 0 420 51 431 61 0 396 52 398 58 0 478 218 488 247 0 90 60 129 176 0 57 40 70 70 0 170 31 398 231 +4397 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000574454.jpg 640 426 0 531 252 538 264 33 498 92 531 135 33 242 171 252 186 0 485 200 514 225 37 529 263 545 266 37 505 205 528 223 +4398 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435707.jpg 640 480 0 240 360 321 477 63 113 94 559 388 +4399 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000228013.jpg 640 480 0 465 52 614 282 63 186 35 427 261 64 463 203 511 243 0 284 1 639 473 +4400 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000371948.jpg 640 480 0 144 170 269 301 0 324 192 431 324 63 256 326 391 468 63 477 131 596 261 63 3 305 69 364 0 186 236 412 479 63 134 257 216 326 63 424 276 482 329 63 327 243 411 322 0 457 39 639 479 +4401 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000477805.jpg 640 427 0 383 12 584 386 0 163 308 225 353 63 70 227 249 406 +4402 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533517.jpg 449 640 0 107 178 132 240 0 70 186 119 271 41 0 523 141 639 41 0 380 54 531 75 182 479 273 621 39 28 295 69 381 +4403 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132686.jpg 480 640 33 303 74 339 230 33 228 167 384 380 33 407 437 467 474 33 217 461 248 487 33 382 512 395 532 33 58 294 231 632 33 134 118 141 137 +4404 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000570688.jpg 640 480 33 176 237 256 257 33 331 64 389 85 33 281 216 422 264 33 222 265 394 322 33 240 124 263 136 33 431 29 449 43 33 116 178 136 190 33 232 20 241 29 33 221 179 453 240 33 461 252 479 268 33 506 195 522 215 0 521 361 567 479 0 497 381 527 478 0 452 369 505 479 0 404 345 457 479 0 293 385 350 444 0 260 341 307 464 0 215 327 257 470 0 27 361 52 426 0 33 339 59 414 0 154 379 213 419 0 92 372 119 416 2 570 344 592 356 2 600 343 614 354 2 616 344 623 352 33 323 160 464 215 33 280 92 326 106 2 475 347 491 355 2 558 345 576 355 2 487 346 499 354 2 472 348 482 354 0 59 364 83 397 2 386 348 395 356 2 404 346 421 354 0 140 359 172 407 33 54 0 622 263 0 4 187 635 452 +4405 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003865.jpg 640 426 33 108 24 179 77 8 512 307 521 309 0 495 346 516 367 37 478 364 500 370 +4406 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000447501.jpg 640 428 33 194 153 435 422 +4407 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000492524.jpg 640 480 33 457 108 502 198 0 1 188 181 473 +4408 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306914.jpg 640 428 33 343 92 401 213 33 144 97 214 227 33 304 219 357 321 33 393 236 451 317 33 482 166 545 256 0 478 317 495 348 0 466 309 479 348 0 434 306 448 350 0 80 357 105 411 0 42 375 70 427 0 372 322 386 350 0 178 312 197 355 0 199 338 214 354 33 180 266 279 345 33 9 224 39 245 33 225 190 298 303 33 127 197 142 206 33 531 272 614 348 33 456 24 479 47 0 504 308 521 347 0 552 307 566 350 0 158 316 174 357 0 446 312 460 349 0 193 340 199 355 +4409 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000345136.jpg 640 427 33 97 30 114 52 33 508 80 527 123 33 531 101 545 117 33 579 135 602 155 33 367 125 373 132 33 619 77 627 81 33 400 107 408 113 33 285 84 304 106 33 439 74 443 76 0 481 143 505 164 0 503 145 513 169 0 513 144 526 181 0 357 158 372 181 0 388 157 393 172 0 307 159 329 180 0 322 147 327 166 0 628 168 632 181 33 387 137 417 162 33 122 33 131 48 0 325 83 353 182 0 432 163 440 180 33 162 67 166 70 0 122 117 336 307 0 581 165 588 181 33 27 34 639 158 +4410 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350675.jpg 640 425 33 267 151 298 169 0 0 256 205 424 +4411 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000337246.jpg 640 427 33 109 35 126 56 33 178 116 188 129 33 168 124 174 131 33 383 128 388 134 33 319 119 324 125 33 87 119 92 125 33 272 111 279 119 33 352 111 360 117 0 73 143 79 153 33 633 125 636 131 +4412 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103931.jpg 640 428 33 292 117 309 130 33 446 87 448 90 0 416 227 458 336 0 266 142 316 295 0 17 183 32 214 0 608 168 617 190 0 592 166 603 189 2 141 176 153 184 0 472 182 476 191 0 428 185 432 191 0 387 184 389 193 0 585 177 591 189 0 450 180 455 191 0 444 176 447 192 0 330 179 338 195 0 321 177 327 195 2 432 179 444 183 0 3 167 639 209 +4413 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000412204.jpg 375 500 33 161 96 179 120 33 196 89 209 118 33 221 102 231 116 0 322 401 367 499 0 283 412 330 499 +4414 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044478.jpg 640 424 33 120 111 426 246 +4415 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067412.jpg 640 480 33 445 87 559 296 33 82 161 197 266 33 51 39 64 52 24 185 348 233 420 0 365 362 427 478 33 302 177 362 215 33 203 167 218 180 33 485 271 513 291 33 98 101 140 118 0 500 336 585 479 0 458 331 514 478 0 435 365 467 476 0 264 341 343 479 0 165 319 233 479 0 37 284 154 479 0 604 339 627 434 0 618 356 639 453 0 440 346 462 373 0 412 367 434 445 0 596 355 607 381 0 217 343 260 477 24 39 366 67 436 33 10 90 21 114 33 288 241 306 253 33 319 235 339 263 33 248 164 293 170 0 0 330 612 479 +4416 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000458953.jpg 480 640 33 0 156 24 192 33 96 11 110 22 33 280 267 318 338 33 130 177 141 184 33 215 0 227 11 33 205 96 226 176 0 356 334 365 360 0 276 270 310 349 0 467 328 476 349 0 394 326 399 345 0 405 330 414 345 0 390 328 396 347 0 339 330 346 353 0 331 331 339 352 0 312 332 316 351 0 304 323 314 349 0 362 328 373 356 0 356 324 359 336 33 320 198 332 204 33 90 260 119 284 33 105 298 124 322 33 84 170 98 175 0 402 322 406 329 33 380 30 464 132 33 362 0 426 98 33 129 38 155 126 0 172 294 477 357 33 6 0 411 339 +4417 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000440226.jpg 341 500 33 204 143 246 176 33 284 244 303 267 33 18 142 60 188 0 157 428 164 439 0 247 413 255 434 0 132 415 142 422 +4418 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193245.jpg 500 375 33 176 0 216 26 33 148 55 178 74 33 213 22 243 59 33 272 0 311 15 33 361 0 386 10 33 470 48 497 64 33 125 5 142 18 0 78 176 146 371 0 294 200 303 235 0 239 190 266 275 0 251 178 293 287 0 398 192 416 230 0 416 183 442 251 0 462 165 497 289 0 151 202 181 269 0 413 195 419 220 0 373 191 378 204 0 333 200 341 227 33 234 76 248 85 33 74 117 86 124 0 322 192 324 201 33 73 135 83 141 33 399 94 405 99 33 228 0 250 8 0 328 194 332 206 0 358 187 413 214 +4419 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476647.jpg 640 426 33 428 111 475 236 33 398 68 630 349 33 305 144 429 191 33 237 117 354 230 33 44 182 256 257 33 355 190 373 238 0 66 120 191 425 0 147 205 176 257 0 176 144 226 292 33 48 91 78 161 33 199 117 238 144 33 451 84 469 101 33 157 167 180 186 0 253 131 319 307 0 315 169 347 264 0 335 184 363 277 0 494 117 571 345 0 412 182 441 252 0 0 178 18 242 0 243 176 261 231 0 234 164 247 203 0 61 152 73 187 0 389 193 407 223 33 556 176 574 196 +4420 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199602.jpg 500 375 33 181 157 331 263 0 201 92 285 310 +4421 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351557.jpg 640 511 33 239 289 423 439 26 521 284 548 343 26 576 292 602 339 26 213 320 232 358 26 469 307 494 354 0 573 270 632 438 0 486 258 547 427 0 301 249 354 302 0 162 259 218 407 0 216 238 290 431 0 437 253 497 423 0 333 259 386 396 67 182 310 187 314 0 272 258 295 294 0 115 234 177 400 +4422 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054301.jpg 640 428 34 302 117 345 176 35 401 303 429 324 0 195 162 375 366 0 402 256 501 393 0 558 206 639 391 0 561 60 616 123 0 612 57 639 128 0 481 47 554 115 0 436 35 570 98 0 375 0 428 86 0 162 0 205 42 0 552 1 622 115 0 287 0 317 66 0 467 0 508 74 0 549 0 583 61 +4423 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372494.jpg 640 481 34 293 273 329 295 35 476 336 525 372 0 287 152 449 416 0 479 212 606 394 0 244 87 294 167 0 277 77 324 143 0 164 95 220 168 0 126 106 195 170 0 71 115 129 170 0 205 107 269 167 0 275 13 327 78 67 153 117 161 128 0 315 112 374 172 0 251 51 285 110 67 395 125 401 134 67 337 132 352 140 0 328 9 374 75 0 366 5 446 136 0 0 0 639 480 +4424 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000312416.jpg 427 640 34 84 147 210 352 0 100 169 238 429 35 157 300 200 331 0 1 300 333 564 +4425 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000479948.jpg 640 480 34 180 54 248 142 35 317 269 377 325 0 277 218 389 426 0 100 163 216 426 0 184 106 324 450 0 416 105 507 246 0 355 109 420 216 0 336 174 426 246 0 514 82 571 242 0 552 203 587 247 0 32 146 104 251 0 111 121 175 201 0 577 77 623 149 0 1 175 56 249 0 477 105 536 243 0 1 1 639 263 +4426 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351683.jpg 640 427 34 376 50 437 174 35 318 257 358 291 0 158 203 354 386 0 357 82 567 365 0 467 107 524 225 0 540 98 594 201 0 574 128 627 191 0 22 157 162 397 0 213 174 287 223 0 605 96 639 180 13 479 88 564 118 24 610 207 638 230 24 575 214 604 231 13 277 8 461 150 13 572 98 620 106 13 488 151 516 164 24 491 209 542 240 +4427 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251367.jpg 640 428 34 237 195 251 213 0 219 223 309 309 0 171 263 222 322 0 71 236 159 319 0 220 16 243 37 0 381 26 406 95 0 122 71 140 107 0 216 71 244 128 0 167 79 200 133 0 150 80 178 134 0 104 100 150 145 0 7 92 45 153 0 124 22 145 43 13 55 109 124 143 35 211 292 219 302 56 428 53 443 65 56 411 58 429 74 56 383 65 400 100 0 189 74 219 133 0 15 0 621 150 +4428 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000182021.jpg 640 360 34 119 18 188 140 35 135 293 182 343 0 50 211 165 350 0 166 316 182 342 0 149 69 303 354 +4429 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217285.jpg 640 427 34 323 130 355 238 35 409 322 445 357 0 261 162 368 414 0 510 168 583 426 0 376 210 474 422 0 422 56 463 116 0 308 72 348 119 0 238 48 312 114 0 173 46 221 112 0 131 70 173 113 0 335 75 379 119 0 598 39 639 90 0 577 183 629 268 56 595 107 628 127 56 594 89 630 106 56 560 86 596 103 56 504 102 560 125 56 528 86 561 105 56 444 101 493 123 0 58 73 104 111 56 483 102 519 124 56 612 108 639 129 56 626 90 639 108 0 530 26 592 87 0 1 1 639 268 +4430 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000559348.jpg 640 480 34 265 144 279 175 0 34 267 152 457 35 228 236 245 248 0 145 187 219 282 0 210 201 252 280 0 242 171 295 288 0 34 138 73 197 0 90 137 126 174 0 275 124 306 173 0 494 144 524 196 0 433 144 460 178 0 28 56 46 82 0 441 124 468 161 0 388 104 416 141 0 301 91 334 131 0 112 122 589 204 +4431 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384012.jpg 640 512 34 368 318 397 346 35 422 403 433 418 0 434 276 448 294 0 249 345 295 379 0 211 252 222 270 0 347 336 407 442 0 190 325 216 375 0 466 358 521 446 0 566 324 587 346 0 421 384 501 446 0 378 272 401 289 0 314 326 339 378 13 305 165 323 172 56 92 180 101 189 56 106 181 110 185 56 113 180 119 183 56 123 180 132 184 56 517 170 527 177 56 13 185 20 191 56 502 158 511 163 56 41 191 47 198 56 42 186 47 191 56 13 193 21 197 56 1 198 9 207 0 339 273 351 287 56 522 163 531 168 0 213 330 240 375 56 120 175 127 180 0 172 329 194 375 56 1 0 639 235 0 1 114 639 399 +4432 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485673.jpg 640 480 34 126 173 154 225 35 55 279 74 294 35 596 316 614 343 0 125 173 188 304 0 353 94 374 132 0 320 85 344 132 0 304 108 332 133 0 277 105 311 167 0 571 118 614 238 0 301 79 322 118 0 214 93 248 133 0 515 268 622 394 0 24 234 88 298 0 12 198 69 284 32 317 206 319 209 0 333 102 366 163 34 571 100 579 135 0 11 111 52 169 0 1 0 639 182 +4433 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308441.jpg 640 426 38 272 207 302 246 0 292 195 351 257 0 326 126 340 150 0 339 125 358 164 0 394 113 411 135 0 377 143 397 164 0 413 122 431 147 0 429 113 447 142 0 398 148 415 165 0 415 148 433 165 0 360 129 379 160 0 413 139 430 161 0 450 135 465 158 0 465 137 491 161 0 170 131 284 164 +4434 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579337.jpg 640 480 38 0 213 232 314 0 167 40 583 477 +4435 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000554255.jpg 640 361 38 315 243 330 289 38 123 207 132 214 0 106 191 133 251 0 377 206 398 293 0 276 185 326 313 0 273 220 286 249 0 436 179 478 312 0 190 200 209 254 0 153 197 176 256 0 160 194 181 248 38 148 211 154 216 56 478 127 535 175 0 522 178 564 315 0 220 194 240 245 0 177 198 195 245 0 314 197 330 237 38 200 221 212 236 38 373 251 378 270 38 554 209 558 220 38 170 226 175 231 56 394 217 405 233 0 483 194 529 317 0 268 187 533 315 +4436 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000411774.jpg 375 500 38 145 34 337 419 0 5 71 327 493 +4437 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189371.jpg 426 640 38 85 367 204 482 0 81 0 391 631 +4438 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000217303.jpg 640 426 38 161 187 220 234 0 166 141 306 419 0 450 62 463 74 0 341 82 366 135 0 401 98 437 147 0 74 75 92 133 0 468 88 502 136 0 552 75 574 136 0 464 57 479 73 0 491 41 506 58 0 472 25 491 60 0 79 56 97 68 32 514 139 519 142 74 578 117 594 133 0 207 59 220 72 38 409 131 433 139 0 240 41 255 58 0 1 0 639 138 +4439 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000533816.jpg 640 426 38 168 185 210 244 38 417 325 462 378 0 398 129 486 425 0 105 136 176 370 0 447 116 502 186 0 444 69 521 152 0 351 0 391 137 0 506 0 563 50 0 264 116 374 404 0 385 0 422 138 0 249 79 303 138 0 112 82 153 141 0 50 87 108 138 0 210 93 253 136 0 536 65 610 149 +4440 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000498802.jpg 480 640 38 294 268 390 362 13 39 397 144 452 0 131 269 305 598 13 67 278 99 293 13 22 267 45 291 +4441 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186977.jpg 500 381 38 100 213 267 268 0 100 50 210 375 +4442 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000200267.jpg 591 640 38 196 396 252 496 0 166 277 311 508 0 165 163 289 260 0 315 173 395 258 0 407 179 468 257 0 527 186 590 268 0 172 165 213 249 0 53 176 86 250 0 522 176 542 211 0 271 174 321 261 0 384 166 428 258 0 6 163 39 255 32 144 547 163 563 32 312 570 330 589 32 340 576 359 594 32 395 552 416 571 32 375 316 391 334 32 473 544 490 560 32 551 564 573 581 32 528 542 545 558 32 436 564 454 577 0 119 171 182 259 0 438 164 469 215 0 0 161 590 273 +4443 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079084.jpg 500 333 38 161 119 235 191 0 211 45 382 333 0 313 31 376 139 0 19 72 67 140 0 174 17 228 107 0 122 39 177 139 0 67 53 152 143 0 0 24 36 102 0 167 66 243 138 0 267 3 315 90 0 365 22 408 141 0 477 1 499 74 24 157 48 171 84 0 385 13 486 145 0 0 99 37 139 0 17 0 499 297 +4444 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000350447.jpg 394 500 38 19 22 135 99 0 134 83 359 449 0 115 0 171 46 0 170 0 224 48 0 53 0 116 45 0 7 1 52 33 0 204 0 243 42 0 290 0 350 47 0 232 0 293 48 0 297 0 349 48 0 357 0 393 48 0 154 0 192 33 0 0 0 16 39 0 98 0 138 37 +4445 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000105711.jpg 640 480 40 153 0 251 117 41 315 0 391 67 45 503 0 639 85 60 0 2 640 388 53 71 74 588 364 +4446 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000282143.jpg 500 375 41 354 168 464 313 42 312 281 401 374 43 339 299 418 374 53 48 236 297 341 8 176 73 194 78 8 106 71 124 78 8 35 77 44 80 8 287 57 299 76 8 274 74 281 78 8 368 55 379 80 8 401 57 409 78 8 305 74 318 78 8 90 70 92 77 8 454 58 462 83 8 232 42 249 79 8 98 74 106 78 60 0 189 500 374 8 221 46 233 77 8 10 47 331 84 +4447 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000183364.jpg 640 480 41 497 352 631 479 41 302 29 369 101 63 0 1 339 472 63 262 2 638 400 54 390 448 442 479 +4448 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152751.jpg 640 480 41 541 309 597 386 76 252 143 275 184 76 259 136 282 163 76 230 141 249 161 73 517 261 639 294 73 519 235 639 277 +4449 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355450.jpg 640 480 41 280 240 298 263 41 298 234 314 255 41 258 232 275 250 71 274 171 287 174 73 131 362 156 432 73 172 367 182 417 73 129 357 163 427 73 166 368 175 419 73 179 369 187 413 73 283 319 350 358 75 105 99 179 321 75 352 136 384 217 41 263 246 281 269 45 164 280 251 343 57 176 207 251 277 73 157 364 169 423 73 175 367 182 414 73 357 308 413 331 +4450 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355919.jpg 375 500 41 97 17 203 209 53 1 208 374 450 56 130 1 330 79 60 0 85 375 499 +4451 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000151790.jpg 500 333 41 0 55 87 191 76 60 159 168 276 +4452 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353028.jpg 640 480 41 546 0 629 57 42 11 31 102 159 43 1 38 42 206 53 43 19 639 451 60 2 0 639 472 44 588 0 605 41 +4453 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467022.jpg 640 427 41 123 177 317 344 41 14 161 171 322 63 93 1 594 185 59 0 0 282 183 67 497 170 614 240 +4454 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167044.jpg 640 426 53 47 14 606 420 42 0 311 54 425 42 583 93 638 392 +4455 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000240960.jpg 640 426 53 5 29 639 417 +4456 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383073.jpg 424 640 53 51 289 414 500 53 62 244 349 367 53 61 151 334 281 +4457 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000555110.jpg 640 426 53 202 44 600 421 51 282 260 338 361 51 239 270 311 319 51 238 151 294 230 +4458 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000367558.jpg 375 500 53 91 244 374 499 53 0 160 201 439 53 34 19 278 217 +4459 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053491.jpg 640 425 53 70 209 574 327 39 24 11 138 219 +4460 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317325.jpg 640 480 53 305 67 602 399 53 28 88 323 473 +4461 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254986.jpg 500 375 63 24 119 313 350 64 320 276 388 305 73 290 191 483 240 73 283 145 411 295 73 468 154 499 170 73 477 200 499 214 73 330 129 469 162 73 465 171 499 188 73 471 232 499 253 73 475 189 499 202 73 468 212 499 234 73 219 194 279 218 +4462 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556091.jpg 640 477 63 140 96 315 264 64 447 269 494 314 66 131 261 388 320 67 524 313 581 358 62 310 22 564 205 +4463 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000459164.jpg 640 480 63 70 0 424 193 63 92 0 639 480 63 0 0 139 109 66 208 175 634 472 66 0 338 157 479 66 19 0 143 52 +4464 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054533.jpg 640 480 63 127 67 545 321 66 170 264 469 288 62 3 4 134 247 73 182 309 474 362 +4465 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503826.jpg 640 480 63 42 298 231 357 64 532 358 587 398 64 553 403 614 444 66 239 327 510 405 62 269 125 519 305 +4466 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000154705.jpg 640 464 63 216 207 298 267 64 520 311 548 331 64 418 303 436 321 66 321 275 440 306 66 200 273 299 289 73 139 200 207 252 73 198 201 233 241 62 333 194 432 277 +4467 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000248631.jpg 640 480 63 3 90 429 433 64 460 273 618 438 +4468 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232121.jpg 640 480 63 56 17 545 474 41 476 120 590 305 2 274 151 310 176 40 476 116 596 310 +4469 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188311.jpg 640 480 63 156 296 560 474 63 463 245 639 398 63 180 183 390 259 63 12 227 252 334 63 0 156 65 179 63 106 133 227 159 63 70 123 171 146 63 349 165 536 210 56 177 176 279 223 56 248 116 320 198 56 188 109 245 133 56 434 157 535 182 56 545 61 597 148 56 139 81 165 92 56 182 80 218 109 56 362 76 427 166 56 156 97 200 122 63 37 110 72 122 64 165 315 240 350 73 302 47 304 62 73 334 45 339 62 73 457 98 473 127 73 305 47 308 61 73 446 94 457 125 56 129 146 221 231 56 306 81 377 166 56 66 108 122 121 63 516 192 639 255 63 120 101 163 109 63 198 100 211 107 64 258 132 273 143 63 202 78 237 84 73 323 45 334 62 73 354 46 363 60 64 352 167 384 180 64 0 173 36 190 64 39 135 56 145 64 37 115 48 124 +4470 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000358763.jpg 640 478 63 0 283 125 415 64 469 399 508 422 64 488 359 540 379 66 210 355 449 401 62 266 220 443 356 62 367 73 561 215 62 178 104 350 217 62 445 220 638 365 62 82 215 261 351 66 0 365 107 396 +4471 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353300.jpg 640 428 63 251 0 639 75 66 230 159 622 338 73 30 82 234 250 +4472 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000239318.jpg 375 500 63 40 13 354 411 66 51 317 331 454 66 75 235 323 322 56 310 18 374 247 +4473 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000443723.jpg 640 480 64 183 42 588 324 +4474 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011184.jpg 500 375 64 220 20 296 132 66 0 82 473 320 64 343 49 436 123 +4475 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132001.jpg 500 334 64 406 130 455 208 66 30 123 341 207 +4476 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193798.jpg 478 640 64 178 327 428 591 66 0 77 191 351 73 191 136 371 195 +4477 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150320.jpg 640 480 64 539 261 598 304 66 196 237 460 371 62 219 14 403 213 +4478 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000378099.jpg 640 337 64 519 153 609 277 66 31 73 533 250 +4479 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000325211.jpg 473 640 66 2 323 472 449 63 0 0 473 457 73 1 404 472 625 +4480 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482774.jpg 640 427 66 36 134 639 306 62 144 1 638 52 +4481 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000467951.jpg 640 480 75 125 245 350 423 75 487 250 563 299 60 0 248 639 479 75 605 194 639 276 +4482 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000163138.jpg 500 375 75 8 65 90 250 75 133 250 223 319 75 340 255 427 324 75 117 153 226 283 75 230 115 332 220 75 229 212 311 320 75 396 115 481 270 0 149 29 294 206 45 342 255 405 326 45 364 341 434 367 75 291 149 396 307 75 25 231 122 328 75 429 214 477 326 +4483 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053503.jpg 480 640 75 170 342 287 494 75 427 191 479 455 +4484 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557402.jpg 372 500 75 143 312 229 459 +4485 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134935.jpg 640 426 75 249 162 310 272 60 0 218 640 425 55 386 231 441 268 +4486 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331372.jpg 427 640 75 284 440 323 527 75 229 464 283 529 58 88 456 178 519 +4487 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000388413.jpg 500 375 75 69 30 482 369 +4488 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000103379.jpg 640 426 76 177 32 379 384 +4489 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000340930.jpg 640 480 76 1 0 625 474 76 240 70 344 202 +4490 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000354460.jpg 640 343 76 179 238 220 263 76 462 240 512 282 76 354 237 400 284 76 37 233 70 265 0 236 17 401 342 0 119 47 265 337 0 199 70 220 111 0 8 53 160 342 0 379 53 515 339 0 472 17 639 342 0 1 125 24 342 +4491 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207585.jpg 640 480 77 232 42 526 442 77 58 150 258 431 77 431 111 602 324 77 179 69 395 450 27 130 231 199 292 27 341 137 419 196 +4492 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000534601.jpg 500 332 77 85 0 384 326 +4493 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316400.jpg 480 640 77 87 221 414 631 62 2 1 479 471 +4494 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000539224.jpg 394 640 77 30 125 376 521 +4495 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000394132.jpg 640 480 77 60 45 393 397 77 312 91 608 309 +4496 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517821.jpg 480 640 77 0 63 480 639 +4497 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185756.jpg 640 427 77 30 12 491 421 +4498 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190700.jpg 500 333 77 142 72 344 178 77 117 189 253 292 57 0 256 499 327 +4499 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000335081.jpg 640 427 77 52 66 274 392 77 196 161 371 392 14 332 148 544 293 77 0 0 198 230 +4500 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000258509.jpg 458 640 26 33 38 366 329 73 9 421 125 597 +4501 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515485.jpg 640 426 0 419 146 582 359 0 283 178 305 197 0 397 150 430 196 0 316 139 357 186 0 286 151 316 196 0 253 147 289 196 0 143 139 180 176 0 318 159 355 197 0 84 130 112 165 0 506 151 535 193 0 56 150 101 187 0 246 123 293 187 32 125 63 139 72 56 0 123 10 134 56 14 122 43 132 56 11 152 34 173 56 328 125 353 134 56 30 39 56 47 56 155 26 180 34 56 9 136 38 148 56 422 206 460 242 56 35 176 57 187 56 13 206 51 242 56 477 109 499 121 56 111 169 138 176 38 378 146 420 180 0 358 160 385 188 56 139 177 160 187 56 66 0 526 189 0 0 0 638 202 +4502 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000176744.jpg 640 501 0 48 442 59 468 0 206 448 220 492 0 271 439 312 500 0 616 417 639 493 0 336 439 355 500 0 360 441 374 484 0 397 427 422 500 0 428 441 440 459 0 564 434 579 479 0 37 480 59 500 0 186 446 202 498 24 80 473 90 487 33 512 202 607 235 33 195 113 214 130 33 305 121 316 128 0 128 456 138 483 26 383 452 393 473 33 254 213 264 219 33 209 214 214 216 33 435 267 459 274 33 219 4 444 334 33 12 171 54 181 33 501 282 508 289 33 155 359 165 364 33 187 22 205 35 33 45 246 58 253 0 220 457 231 471 25 544 394 628 423 25 256 410 339 444 25 123 425 154 441 25 445 419 499 437 26 202 466 207 475 26 93 479 102 487 33 120 368 136 381 33 377 352 458 378 0 1 399 639 500 +4503 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167598.jpg 426 640 0 158 516 278 639 0 148 503 190 628 0 88 490 138 631 0 191 488 199 515 0 198 488 219 552 0 286 488 296 526 0 324 488 333 516 0 346 489 352 508 0 360 490 371 521 26 205 517 216 528 26 126 504 137 516 26 221 571 263 638 33 175 346 230 391 33 196 285 235 321 33 201 237 237 272 33 219 160 244 190 33 225 136 239 153 33 227 109 257 140 33 231 94 254 120 33 229 51 242 61 33 159 429 216 483 33 234 73 243 81 33 232 81 247 94 0 213 501 228 563 0 127 489 140 530 0 295 492 308 526 33 213 197 245 224 0 0 488 17 576 33 155 358 170 367 33 147 59 425 581 0 9 50 425 560 +4504 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486788.jpg 640 428 32 337 366 350 378 34 433 123 554 198 34 358 43 422 170 34 349 39 377 166 34 126 112 247 193 34 151 92 258 189 34 83 219 215 243 34 94 241 215 248 34 178 196 281 213 34 175 207 279 253 34 240 242 286 301 34 346 215 416 289 32 331 319 342 331 32 333 293 344 305 32 322 297 331 309 32 318 346 330 358 32 293 260 305 271 32 324 240 336 251 32 339 225 351 237 32 350 212 364 224 32 303 208 315 220 32 339 351 352 363 32 344 320 352 333 32 309 315 321 328 34 177 125 568 333 32 282 202 373 397 +4505 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038539.jpg 640 431 39 328 89 339 173 39 319 92 331 186 74 234 101 281 185 74 490 178 580 324 74 415 259 448 323 74 353 230 390 328 74 297 262 327 332 74 235 272 273 374 74 55 250 125 400 74 0 279 29 327 74 0 39 83 184 74 496 364 585 426 74 400 0 483 172 74 310 64 370 205 74 516 0 639 126 74 144 151 639 430 +4506 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000256407.jpg 480 640 41 290 382 326 424 41 332 284 374 321 41 315 231 357 270 41 220 180 258 222 41 123 234 164 270 41 109 290 155 329 41 169 386 205 429 74 98 179 382 457 41 228 400 265 444 41 167 197 202 236 41 277 193 311 234 41 321 342 367 381 41 123 350 165 384 +4507 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000041550.jpg 640 478 56 440 267 509 380 56 374 241 424 275 56 291 218 340 246 56 222 213 266 231 56 444 186 480 201 56 134 204 180 224 56 0 261 55 286 56 88 281 144 430 56 318 177 341 192 56 267 157 297 166 56 237 177 270 190 63 296 291 362 320 63 268 226 352 280 63 0 149 584 333 56 383 183 400 197 56 213 156 232 166 63 380 164 421 170 63 0 359 27 385 63 315 165 350 169 56 27 155 599 193 +4508 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557720.jpg 640 426 74 170 55 522 365 +4509 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000053616.jpg 480 640 77 281 321 371 396 77 247 280 315 404 77 192 286 282 391 77 143 294 228 405 77 114 413 293 525 77 302 266 376 386 77 207 112 292 248 77 266 117 347 251 77 320 98 403 251 77 416 107 479 253 77 155 113 246 259 77 267 413 385 489 77 30 501 129 560 77 1 1 479 639 +4510 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218926.jpg 500 375 77 51 31 289 363 +4511 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000072004.jpg 500 375 53 163 68 248 134 53 122 39 195 94 53 108 138 220 221 53 160 210 285 298 53 34 196 165 308 53 0 151 103 232 53 0 111 83 179 53 204 120 308 184 53 283 71 366 121 53 234 40 312 83 53 337 107 431 170 53 262 165 369 242 53 74 87 175 160 53 1 0 499 147 +4512 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483564.jpg 500 281 74 337 100 490 245 +4513 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000180917.jpg 426 640 74 232 193 264 220 74 316 212 331 243 +4514 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000220182.jpg 500 381 75 0 68 15 107 +4515 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000315219.jpg 333 500 78 132 2 159 104 +4516 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071023.jpg 640 478 58 32 262 149 378 60 2 316 369 475 56 187 405 374 477 68 260 52 367 137 71 433 236 518 279 44 349 218 373 227 45 486 64 518 73 41 484 98 510 134 41 388 147 405 169 73 78 316 133 378 +4517 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207634.jpg 480 640 58 348 285 479 529 0 224 235 336 539 67 251 254 258 263 13 1 356 374 497 +4518 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000475572.jpg 640 431 58 2 28 270 342 75 65 192 197 337 77 154 153 359 370 0 374 206 453 346 0 430 205 539 350 13 0 315 640 430 +4519 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272889.jpg 640 427 58 8 37 576 419 75 312 310 419 424 +4520 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000168909.jpg 640 480 58 270 56 303 116 39 359 189 434 349 56 517 175 639 473 56 564 115 639 201 57 406 79 470 160 60 1 179 588 474 0 134 34 303 205 0 284 5 579 372 40 140 239 191 309 41 240 176 276 241 41 279 181 313 243 43 0 320 115 326 45 28 317 255 471 45 188 202 225 231 45 106 201 185 247 46 46 317 224 430 49 143 423 172 453 49 133 390 148 403 49 145 377 175 399 49 207 398 227 419 49 167 419 194 444 42 22 328 98 336 43 330 287 444 302 44 331 291 362 303 41 139 238 191 311 41 233 237 262 283 41 188 204 224 233 44 22 329 99 337 47 158 345 204 392 49 116 393 142 422 49 111 384 226 452 49 93 395 117 421 49 77 416 99 437 49 100 422 123 442 56 159 88 188 200 +4521 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043673.jpg 640 480 58 62 28 277 296 41 155 263 221 352 41 253 275 319 347 77 306 166 444 336 56 0 32 135 286 +4522 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000193881.jpg 612 612 58 54 22 259 221 56 170 447 273 590 75 105 124 187 221 75 133 362 185 447 75 378 214 472 362 75 452 86 537 225 75 519 139 608 584 +4523 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000244665.jpg 640 480 58 574 155 639 253 60 0 277 167 479 40 91 276 111 298 40 316 171 326 193 44 50 326 70 337 45 12 409 64 451 26 428 230 451 267 0 303 174 535 468 0 189 169 314 410 0 60 300 329 476 0 2 135 181 316 0 116 144 203 292 0 256 127 300 180 0 312 127 358 192 0 388 142 435 222 0 279 98 401 178 0 358 136 416 215 0 191 144 307 245 26 298 356 331 404 40 306 179 317 203 56 301 282 334 415 56 195 244 221 274 56 617 296 639 369 56 423 205 439 231 56 517 423 532 479 60 175 204 200 247 60 291 194 327 212 0 193 140 219 200 27 342 124 349 129 40 305 189 316 203 41 91 276 112 296 0 151 130 203 221 +4524 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000290477.jpg 640 426 58 135 17 519 321 75 285 205 354 320 +4525 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000421401.jpg 334 500 58 58 35 309 368 75 96 256 215 385 +4526 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460149.jpg 480 640 58 67 454 161 547 1 312 429 367 468 2 182 389 234 419 74 224 30 334 137 1 321 423 344 427 2 377 400 412 427 58 362 407 392 435 0 452 393 457 409 1 311 435 342 477 2 401 396 421 421 58 8 126 212 438 +4527 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225175.jpg 480 640 58 372 515 445 603 56 35 501 73 543 2 216 453 285 494 2 268 445 384 502 74 191 172 237 224 74 158 179 178 228 2 75 458 107 474 13 109 505 156 566 13 130 539 151 564 56 2 503 30 547 56 0 509 6 548 58 430 472 462 498 60 0 496 46 510 2 34 469 151 544 +4528 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000089258.jpg 504 640 58 23 2 484 610 75 184 415 270 608 +4529 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064796.jpg 426 640 58 17 96 413 492 75 110 293 307 490 +4530 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000121817.jpg 640 360 62 571 1 639 99 57 0 167 459 355 0 73 25 256 355 0 216 33 415 359 0 397 76 577 342 67 548 135 571 148 +4531 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300403.jpg 500 375 62 47 22 160 90 62 191 37 254 89 39 152 229 184 347 39 12 287 50 374 67 371 163 381 180 67 103 168 115 184 60 47 284 328 370 41 121 225 146 256 41 193 281 235 331 41 105 256 136 287 42 146 340 245 354 45 108 271 151 327 45 134 259 150 280 0 318 86 499 374 0 281 116 365 313 0 172 106 305 303 0 310 54 385 143 0 214 48 272 120 0 396 52 430 90 0 266 133 282 159 0 0 117 166 277 0 0 123 32 230 0 131 114 200 227 0 427 5 499 179 0 0 119 89 351 40 201 247 232 281 41 172 247 188 276 41 330 348 393 374 0 124 143 143 187 42 50 277 91 286 41 200 248 232 284 +4532 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000083036.jpg 640 480 62 214 44 427 213 0 0 188 112 383 0 15 113 130 228 0 563 196 639 299 0 1 376 409 479 41 351 352 391 388 63 402 338 639 473 56 375 272 450 298 56 237 265 305 296 41 221 295 243 312 44 386 382 414 389 63 221 263 328 334 +4533 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461331.jpg 640 480 62 248 73 324 274 68 125 49 324 226 69 173 283 315 445 69 246 69 329 279 +4534 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222043.jpg 612 612 15 3 294 71 339 39 452 37 477 101 0 310 13 466 202 45 254 179 289 213 45 45 212 120 261 45 492 396 550 454 45 393 190 436 221 60 0 104 460 330 60 0 349 612 604 41 476 413 532 469 41 508 63 523 80 41 500 48 509 59 75 99 434 183 602 75 372 407 427 520 75 152 174 171 219 75 429 227 469 283 75 97 106 131 146 75 168 397 239 567 75 130 183 170 252 75 207 163 261 268 41 490 399 552 452 41 358 186 396 238 75 299 151 357 257 75 143 486 229 611 60 440 40 611 95 75 135 373 184 434 41 479 47 493 60 41 468 431 539 503 41 254 165 291 214 75 526 278 611 384 75 77 65 424 315 +4535 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000236068.jpg 457 640 16 45 161 111 221 2 231 68 456 610 0 48 24 337 632 27 196 218 274 374 67 145 145 218 193 7 0 71 456 638 +4536 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000460684.jpg 640 480 39 293 263 327 356 39 351 259 385 350 39 395 252 428 341 56 395 412 518 473 56 55 396 107 479 60 193 270 464 479 0 28 107 236 450 0 221 117 367 436 0 421 113 624 471 40 267 283 289 333 40 428 260 447 305 40 327 249 344 290 40 284 255 301 295 40 305 253 321 287 40 192 240 213 285 40 382 265 398 309 26 506 182 582 246 40 370 259 386 301 40 262 278 279 328 56 555 380 623 479 56 224 427 352 474 26 496 323 557 356 26 259 175 312 253 56 80 429 214 479 56 151 179 191 210 56 166 223 228 310 +4537 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000541773.jpg 640 480 39 274 238 320 305 39 219 280 275 460 39 175 252 220 409 39 138 260 188 437 57 549 110 639 210 0 265 2 581 479 0 348 3 406 391 40 250 357 304 473 40 281 425 336 479 40 303 245 329 310 40 141 413 196 479 0 86 28 161 172 40 251 260 274 324 40 164 271 185 331 40 202 288 215 302 0 580 246 639 469 60 0 246 377 472 0 315 153 392 283 +4538 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000204502.jpg 480 640 39 45 19 200 587 40 209 187 359 579 41 359 342 428 482 60 0 435 480 638 +4539 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000317898.jpg 640 480 39 109 332 167 354 0 0 2 134 357 63 107 264 204 349 51 219 361 239 376 51 283 380 297 391 51 223 378 242 391 51 121 382 149 397 51 195 381 246 396 51 147 353 321 401 51 98 411 322 439 +4540 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000545734.jpg 640 480 39 399 75 416 125 39 330 96 355 144 39 350 102 360 122 41 609 176 639 207 41 575 203 608 233 45 403 307 449 340 45 534 388 571 409 45 482 201 503 220 45 536 355 589 374 69 145 270 323 423 69 133 188 262 270 41 604 208 626 233 41 627 215 639 239 41 559 273 575 303 41 560 258 573 276 41 572 259 588 302 41 573 172 609 202 43 389 44 397 79 43 399 42 404 71 43 369 43 377 78 43 377 53 385 75 44 246 414 275 442 45 534 422 569 430 45 533 405 570 416 45 608 359 639 378 45 373 181 397 207 41 594 266 610 306 41 540 255 556 300 43 375 39 390 78 43 390 27 403 75 43 377 23 389 57 45 484 187 504 204 45 611 353 637 366 40 625 255 639 316 40 603 270 616 297 +4541 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389644.jpg 640 480 39 301 274 323 355 39 330 264 346 317 39 442 322 476 409 56 213 326 322 479 56 562 338 639 405 60 347 375 639 474 41 287 343 308 363 41 433 346 443 363 41 406 332 425 366 41 388 330 406 360 45 464 431 536 457 46 333 344 398 374 46 304 360 331 370 49 312 369 334 382 0 207 152 310 327 0 306 165 399 345 0 410 178 539 388 0 81 140 179 475 0 167 250 225 389 0 0 210 70 370 0 0 317 223 474 0 60 217 79 304 24 345 418 413 479 56 67 432 81 478 0 175 236 197 254 0 179 206 221 264 0 41 218 76 361 46 336 354 383 373 60 388 351 443 379 60 266 274 445 406 46 299 359 327 369 41 473 404 511 434 41 137 232 151 253 +4542 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040426.jpg 640 480 39 405 14 486 207 39 326 154 398 258 39 258 157 322 264 39 370 0 418 152 39 335 0 367 106 39 255 35 293 116 39 0 89 70 287 44 409 146 608 347 45 319 220 556 474 73 0 332 50 479 +4543 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000450655.jpg 640 427 39 130 109 232 420 74 230 77 390 350 56 314 134 607 419 +4544 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000580608.jpg 416 640 39 162 247 262 589 58 29 63 383 586 +4545 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000488723.jpg 640 580 39 20 1 124 112 39 120 0 196 104 39 209 0 263 72 39 262 0 334 112 75 252 446 368 549 58 48 24 612 549 60 171 292 639 569 +4546 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210374.jpg 640 359 39 348 186 386 312 39 263 185 302 311 60 77 294 446 353 0 25 1 350 354 0 360 1 639 351 67 231 113 258 149 41 311 242 353 306 +4547 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524333.jpg 640 480 39 262 358 280 418 60 61 361 346 474 45 152 404 215 440 45 86 389 146 419 60 91 280 162 314 0 238 273 440 479 0 103 239 323 388 0 225 244 329 365 0 383 254 440 359 0 440 253 522 364 0 1 249 92 473 0 403 241 428 279 0 285 243 317 291 0 560 245 639 479 0 445 266 590 470 0 493 238 525 273 0 229 249 258 295 41 284 369 302 411 41 204 378 231 417 41 150 376 186 408 41 254 318 276 348 41 230 363 253 398 44 109 384 116 406 50 192 411 207 419 56 483 357 610 479 56 70 259 464 473 56 180 264 193 285 56 122 258 155 281 56 410 271 447 328 56 427 257 450 303 56 451 256 463 290 56 131 264 168 365 56 327 285 339 362 56 486 282 513 296 44 201 382 239 413 0 311 241 358 347 56 102 232 322 320 +4548 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141673.jpg 640 426 39 344 349 366 425 39 303 344 333 424 39 279 359 304 420 39 245 357 273 419 39 178 368 209 420 39 324 335 345 396 39 120 212 239 263 39 324 366 342 413 0 78 157 232 424 40 227 262 263 324 27 359 181 428 399 73 22 384 82 412 73 19 305 95 374 73 298 200 327 227 73 295 236 335 246 73 599 304 638 340 0 231 42 606 425 0 337 195 383 287 39 145 377 165 421 0 39 309 76 353 73 23 393 84 415 +4549 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071826.jpg 640 480 39 251 75 319 383 39 429 136 443 185 60 1 73 639 479 40 174 218 237 370 40 379 201 417 293 41 535 302 622 421 44 445 340 552 367 45 318 286 394 353 45 348 319 494 411 0 446 24 639 273 40 577 225 639 310 41 177 282 229 349 43 384 271 431 280 44 535 270 563 288 0 0 0 250 334 42 447 342 549 369 68 421 58 477 109 43 89 300 179 314 43 0 368 37 479 0 311 52 408 258 68 396 76 431 114 +4550 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000230701.jpg 500 375 39 389 171 446 364 39 8 181 88 370 67 215 40 254 117 0 2 4 248 357 39 484 273 498 374 60 322 323 487 374 74 132 198 154 220 0 174 58 393 364 60 82 356 337 374 +4551 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328838.jpg 640 480 39 528 0 639 194 44 459 263 640 303 41 0 0 43 240 41 450 1 560 154 42 459 255 639 302 69 1 53 459 473 55 151 134 478 376 +4552 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000114503.jpg 600 448 39 293 143 360 315 39 345 115 408 282 39 382 96 428 256 39 448 95 529 155 39 530 114 599 313 77 71 27 353 442 39 0 85 90 231 39 490 0 599 91 39 543 83 599 118 39 405 78 444 204 39 323 0 414 77 39 263 0 322 54 39 197 13 207 23 39 426 65 458 160 39 0 0 567 372 +4553 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355123.jpg 640 480 39 381 0 430 76 39 305 1 384 75 44 559 69 639 102 43 585 100 639 125 42 592 87 620 105 +4554 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000442128.jpg 640 480 39 196 252 204 277 72 447 171 493 381 69 493 254 522 362 0 383 202 448 361 71 155 271 196 277 0 29 285 112 376 68 494 188 523 256 71 157 283 189 287 71 157 281 171 283 39 144 254 151 276 39 173 256 184 272 +4555 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577160.jpg 612 612 39 100 1 241 293 39 229 2 356 262 0 402 0 611 122 41 25 197 207 318 51 484 525 552 611 58 263 41 496 293 58 450 36 608 342 60 0 152 612 611 51 495 499 549 537 +4556 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000140043.jpg 640 360 39 393 0 488 63 41 248 1 323 81 45 0 41 256 297 55 12 111 115 232 48 352 62 529 195 55 109 109 197 189 41 152 0 221 54 41 393 0 488 63 45 236 64 639 330 55 303 61 422 186 60 0 1 640 354 48 16 107 118 262 48 108 112 217 247 48 295 60 425 204 +4557 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047570.jpg 640 428 39 334 133 352 173 39 353 137 366 174 39 356 141 375 180 56 397 254 597 427 56 394 198 561 413 56 91 178 121 241 60 92 129 463 359 41 326 208 361 243 41 245 236 282 274 41 390 151 407 171 41 205 212 227 240 41 361 179 383 200 41 399 140 411 155 42 317 265 345 295 43 203 268 232 301 45 246 191 315 234 45 270 229 311 259 68 346 66 389 101 0 117 117 220 238 0 235 59 326 176 0 180 108 232 204 0 359 67 432 144 0 439 116 484 205 0 432 82 510 249 0 394 84 557 352 0 0 113 269 422 39 607 95 618 116 41 340 133 348 144 41 273 173 285 190 41 348 134 366 150 41 322 131 337 165 43 441 170 453 173 45 280 170 353 206 44 138 256 165 268 44 325 178 357 186 44 397 198 410 206 56 219 125 243 182 56 168 397 234 427 56 585 180 639 358 48 324 238 393 277 +4558 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000495125.jpg 640 426 39 502 1 558 179 39 439 0 486 182 39 606 59 639 171 39 349 8 371 83 56 349 67 391 139 60 0 138 638 419 0 227 36 285 143 40 376 67 479 282 40 537 64 639 324 40 252 71 355 283 40 137 79 248 290 40 22 89 153 327 39 622 12 638 65 0 0 0 122 93 56 0 95 73 256 +4559 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000201111.jpg 640 426 39 200 101 205 129 39 548 205 576 262 56 80 115 142 165 56 188 135 233 225 60 150 122 247 153 0 80 141 289 415 41 157 126 165 140 68 365 0 448 102 69 208 208 358 359 71 470 258 639 383 39 522 205 537 227 39 574 196 598 262 56 252 121 267 212 56 173 111 200 125 56 232 118 263 141 41 547 213 567 239 +4560 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000294035.jpg 456 640 39 316 99 344 183 39 298 96 320 184 39 272 106 291 186 39 64 89 113 124 39 359 118 385 182 0 100 40 226 431 72 4 42 455 630 41 68 259 106 298 32 327 498 449 620 39 264 302 314 376 39 358 222 387 301 39 373 229 406 304 51 43 342 60 351 39 393 120 435 178 39 399 200 433 310 39 303 194 340 238 39 299 225 324 295 51 35 346 101 376 39 377 124 438 182 39 265 133 384 304 +4561 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000336171.jpg 427 640 39 233 302 261 369 39 95 269 116 290 72 40 28 248 292 60 1 332 426 440 0 157 152 293 301 0 301 142 426 319 41 278 318 308 370 41 54 269 89 288 39 232 252 258 304 43 236 367 335 376 45 252 279 317 309 69 249 179 322 279 60 0 534 264 639 +4562 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000024112.jpg 640 480 39 232 330 314 472 0 151 112 421 388 0 292 103 639 474 27 275 225 340 375 41 166 343 208 375 41 355 436 455 479 41 322 439 356 463 0 554 122 639 264 0 533 307 639 478 0 0 360 156 479 60 150 373 477 472 +4563 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000524656.jpg 640 480 39 487 228 504 293 39 554 251 580 292 39 529 249 555 293 39 475 245 488 294 72 492 342 639 479 41 451 232 474 256 41 426 233 451 265 41 323 233 427 264 45 166 139 203 186 45 153 163 169 182 69 325 282 487 403 71 77 277 196 310 39 214 212 231 284 39 202 241 216 283 39 193 251 210 286 40 137 49 156 89 40 161 84 174 103 41 115 70 129 105 41 467 233 492 261 43 250 284 271 300 43 237 288 259 299 44 249 219 261 244 44 233 221 245 252 44 262 212 272 242 39 230 248 247 284 39 504 246 529 292 39 579 247 607 294 40 169 56 190 83 40 151 62 169 103 41 269 256 305 286 41 101 78 116 108 41 90 74 110 109 43 247 296 261 312 68 323 288 483 404 +4564 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196085.jpg 640 426 39 316 215 346 279 74 306 5 328 28 60 156 211 587 419 60 290 136 437 212 0 167 80 315 264 0 0 87 367 420 0 363 71 454 152 0 292 67 327 144 42 402 301 466 342 42 453 241 481 255 44 464 268 523 291 44 338 300 390 317 0 373 46 595 259 41 254 247 276 272 42 259 222 277 230 45 274 293 390 339 45 277 239 319 270 56 355 103 374 119 56 431 123 454 156 56 0 147 61 235 60 324 115 367 140 0 38 8 108 122 0 0 72 73 150 43 462 280 522 301 43 224 253 282 262 43 204 289 229 291 43 353 314 377 334 43 384 229 392 235 56 147 237 164 289 42 389 153 414 159 44 457 249 465 255 +4565 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233376.jpg 500 375 39 437 69 456 142 39 460 72 484 142 39 485 77 497 144 72 111 2 355 352 +4566 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435820.jpg 480 640 39 6 402 32 458 39 13 377 44 456 39 53 420 73 507 0 104 161 270 639 0 225 172 387 632 0 340 158 472 629 40 97 357 258 512 25 0 179 159 354 25 336 224 362 248 39 0 447 18 532 40 446 355 477 416 60 15 480 228 639 41 1 442 62 515 +4567 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000044677.jpg 612 612 39 356 105 450 407 60 1 102 611 603 0 23 0 397 293 0 11 113 64 171 41 188 281 307 437 45 493 249 606 328 45 1 414 220 537 0 424 80 493 213 42 477 165 553 258 0 478 0 611 303 43 67 249 78 260 +4568 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000485483.jpg 480 640 39 288 318 314 373 39 293 254 333 368 25 0 14 154 187 25 75 70 238 116 56 180 182 219 230 60 0 382 480 631 60 199 339 468 439 0 14 144 52 198 0 98 148 118 180 0 136 153 158 209 0 158 146 206 231 0 55 143 62 167 41 303 431 479 628 13 224 258 289 295 41 121 378 210 494 41 342 302 393 379 41 244 311 292 375 56 131 184 154 226 56 112 180 134 226 56 205 176 220 183 60 0 220 303 333 60 71 177 134 225 60 416 234 479 268 60 205 184 237 205 0 206 150 237 229 13 0 286 206 360 41 413 282 477 350 46 190 497 238 546 46 173 498 203 519 46 159 516 200 558 46 36 523 72 555 46 47 575 146 637 46 52 510 89 542 56 43 189 75 223 56 88 179 99 192 56 62 182 74 193 56 20 190 48 225 56 154 181 181 227 56 100 180 113 193 56 101 194 130 200 56 96 201 121 225 60 366 255 479 301 +4569 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000233315.jpg 400 346 39 66 8 85 58 39 80 0 93 47 0 95 3 352 345 0 1 48 135 342 39 11 3 38 52 39 40 1 66 58 45 98 7 163 41 45 315 194 369 246 +4570 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000104495.jpg 640 480 39 132 0 205 220 60 3 77 639 474 0 3 0 193 128 0 250 0 443 118 39 552 56 621 175 40 0 124 86 304 40 44 102 111 191 42 170 228 306 251 42 108 249 270 299 42 123 249 275 281 55 293 135 382 170 41 365 96 406 149 45 502 79 573 122 45 601 140 639 195 56 194 89 278 115 67 187 16 207 53 40 531 54 592 150 42 99 245 265 274 55 306 156 386 203 55 365 145 417 191 57 587 55 639 137 +4571 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316254.jpg 443 640 39 369 600 399 639 39 398 582 427 639 39 340 596 370 639 67 10 455 104 616 0 61 91 407 638 39 303 598 335 639 39 288 297 299 316 +4572 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000218404.jpg 640 427 39 209 237 273 309 60 1 41 636 420 0 2 3 254 108 0 354 1 605 48 41 276 318 334 378 41 218 352 275 407 41 246 172 303 234 41 474 214 540 274 42 196 72 224 125 44 369 76 410 201 44 510 305 565 426 45 303 115 462 269 42 513 1 540 50 42 356 95 386 195 44 0 93 109 106 48 0 124 50 203 39 321 304 362 349 +4573 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000049676.jpg 640 426 39 368 221 395 324 45 432 309 620 407 +4574 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000384040.jpg 640 452 39 40 237 76 269 60 1 0 639 446 41 261 41 373 147 41 215 98 305 184 42 201 248 280 378 43 140 212 191 272 43 185 249 266 380 39 172 86 230 158 41 424 0 522 56 41 266 23 310 67 41 1 327 31 370 41 331 1 417 40 44 201 249 280 374 42 188 231 264 379 41 23 257 106 350 48 245 136 388 252 +4575 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369685.jpg 640 480 39 190 238 259 442 39 259 246 327 436 48 486 370 582 437 39 417 387 456 464 56 536 61 581 179 60 1 347 639 474 0 1 50 341 389 40 314 270 365 408 0 341 0 387 56 0 261 1 365 170 0 607 0 637 26 56 606 69 639 183 0 578 3 594 25 0 407 172 584 356 56 363 62 439 146 67 158 460 217 479 0 310 62 560 356 41 360 366 421 468 +4576 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000298067.jpg 612 612 39 124 0 329 574 60 23 120 365 611 60 269 57 603 601 41 4 99 108 576 45 287 195 463 475 41 292 196 466 474 +4577 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565957.jpg 640 427 39 577 223 601 317 39 560 222 580 318 39 601 224 623 317 0 252 93 458 426 67 304 134 323 173 39 621 220 639 318 +4578 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000035326.jpg 640 480 39 132 260 189 291 39 134 284 189 316 43 55 217 85 257 69 102 306 622 479 39 127 212 187 241 39 130 234 185 265 +4579 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000560911.jpg 481 640 57 5 135 480 456 67 227 126 250 146 0 100 38 353 597 28 0 269 134 345 28 0 343 164 632 +4580 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300124.jpg 640 480 57 146 144 512 455 68 222 255 366 338 +4581 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000383087.jpg 360 640 57 299 151 357 196 56 0 56 75 317 56 38 64 103 209 60 0 368 360 633 0 1 1 354 414 56 126 90 198 175 56 91 152 359 295 56 43 65 106 115 41 260 394 359 576 45 71 459 160 537 55 101 371 144 419 43 204 521 265 575 +4582 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283012.jpg 640 480 57 485 207 639 453 0 170 1 518 474 67 269 245 345 313 24 569 266 639 328 56 490 207 639 449 59 111 395 639 472 +4583 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000565877.jpg 427 640 57 0 191 425 639 0 7 71 293 597 73 277 375 315 513 74 149 501 166 518 63 50 513 406 639 +4584 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291589.jpg 382 500 56 9 284 104 475 75 311 304 348 366 75 244 300 302 379 75 209 321 248 390 75 173 293 209 362 75 120 299 179 385 75 99 323 134 373 60 60 351 381 492 41 296 345 339 387 +4585 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000066064.jpg 465 640 56 295 346 367 451 75 153 344 247 581 75 58 323 111 461 75 101 334 164 508 56 238 349 278 498 60 265 342 393 455 +4586 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578871.jpg 480 640 56 284 166 374 243 60 1 239 477 631 60 94 36 389 116 3 330 1 396 63 0 73 1 289 295 44 194 500 386 571 44 268 327 381 398 45 160 459 384 599 45 276 222 354 283 45 170 120 273 193 45 139 327 336 457 +4587 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484674.jpg 375 500 56 37 381 126 498 56 0 358 48 394 60 1 393 114 493 72 150 190 308 466 +4588 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000057238.jpg 375 500 56 32 187 115 334 56 0 217 34 371 60 0 218 57 257 72 168 55 374 492 +4589 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000424247.jpg 640 480 56 458 397 522 478 56 365 337 393 355 56 493 379 579 479 56 321 418 390 479 56 333 331 357 363 56 404 314 455 343 56 427 325 456 339 41 354 397 370 411 41 219 424 237 440 41 226 387 240 399 41 158 424 171 439 44 339 357 345 362 44 110 421 123 429 44 209 442 226 458 45 292 395 307 404 26 408 415 480 470 0 329 238 352 274 0 457 241 476 267 0 517 239 552 311 0 472 284 517 329 0 208 321 287 395 0 301 282 334 313 0 251 287 296 324 0 296 310 340 378 0 397 333 488 442 0 71 336 199 432 56 366 315 393 356 56 69 371 95 411 56 454 315 476 332 56 501 370 565 407 60 68 390 250 479 60 225 377 401 446 60 380 336 527 378 60 339 304 393 324 60 256 319 302 367 60 352 308 405 340 60 57 332 217 393 0 347 243 367 308 56 391 340 411 349 60 460 313 555 359 60 341 361 412 401 0 203 394 313 479 41 98 425 124 444 41 286 319 293 329 41 347 309 352 315 41 520 336 528 345 41 377 360 383 375 56 280 349 298 378 0 311 249 333 277 41 291 316 297 323 60 2 431 89 473 60 321 344 423 397 41 22 274 627 476 0 0 240 639 479 60 167 279 354 308 +4590 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000481327.jpg 409 500 56 79 289 389 499 75 97 357 304 500 58 9 57 407 499 +4591 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101059.jpg 506 640 56 0 316 187 590 56 295 393 417 514 60 13 446 429 631 75 196 389 275 552 58 122 258 391 557 +4592 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138075.jpg 640 354 56 551 248 606 350 60 143 238 556 353 0 402 117 598 324 0 14 66 164 291 41 410 258 442 311 41 364 237 397 274 44 333 264 357 298 45 332 270 410 319 0 159 187 286 277 43 316 325 372 353 44 423 239 426 267 48 448 214 463 242 39 24 293 73 353 44 296 261 338 274 56 153 202 206 238 0 262 116 381 268 48 358 285 391 301 52 357 282 390 302 +4593 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250917.jpg 500 375 57 0 131 499 361 0 276 39 494 374 0 15 49 267 358 67 352 157 388 241 67 23 155 62 215 41 70 324 184 374 0 41 91 95 127 0 0 95 42 126 0 0 149 32 321 2 7 76 63 118 60 0 299 500 374 41 0 325 18 374 45 415 365 489 374 +4594 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000222903.jpg 640 480 60 0 37 608 474 41 159 224 259 332 41 75 77 154 163 43 382 76 419 111 56 90 0 330 88 41 0 151 62 242 54 354 121 554 311 +4595 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000387369.jpg 640 480 60 110 88 639 470 0 304 32 405 153 0 19 4 245 479 0 498 23 606 225 56 0 261 83 474 73 484 36 514 68 73 472 58 508 90 73 494 15 524 44 73 564 0 603 26 73 575 27 617 88 77 182 194 377 432 77 244 93 387 219 77 399 88 514 227 77 426 139 616 376 77 331 203 475 412 73 502 0 545 20 73 530 7 576 30 73 510 42 535 71 73 505 66 519 91 73 601 0 639 14 0 278 0 351 97 +4596 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000260818.jpg 375 500 60 14 356 370 492 0 32 14 343 367 40 223 75 337 135 42 81 455 223 499 45 9 344 125 455 45 199 378 267 412 55 155 372 200 429 0 215 11 358 387 40 324 251 374 425 43 152 348 236 376 43 73 447 241 499 55 124 374 160 407 55 67 378 121 405 55 76 362 108 378 +4597 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000300705.jpg 635 514 60 2 1 628 506 48 335 289 576 474 41 287 31 407 273 44 0 164 58 270 44 480 259 596 289 45 9 197 289 435 +4598 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132375.jpg 640 480 60 0 249 640 479 1 596 33 639 68 1 495 51 534 70 0 581 43 597 67 0 570 46 581 67 0 554 49 575 70 75 330 212 464 452 +4599 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000490505.jpg 478 640 60 1 136 477 631 0 2 1 277 138 0 424 140 477 191 69 207 1 401 141 75 169 395 275 540 73 14 601 96 638 58 7 72 445 542 73 0 417 88 592 +4600 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000155861.jpg 640 360 60 77 199 638 358 0 259 13 441 232 41 25 166 104 264 42 112 248 223 323 43 333 282 389 359 44 325 200 425 246 45 333 198 473 275 57 1 35 638 269 +4601 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000351183.jpg 640 478 60 1 13 639 470 41 23 73 204 234 41 274 0 350 100 42 242 330 557 457 43 415 176 595 322 45 459 125 594 238 45 337 71 448 159 45 74 36 195 95 39 542 0 639 181 39 504 4 566 110 +4602 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386187.jpg 640 480 60 1 391 391 473 0 131 119 324 419 0 227 148 569 479 40 222 367 251 462 40 227 230 255 322 73 147 399 378 466 39 0 205 25 317 39 546 18 577 102 39 150 203 167 301 39 177 205 192 240 39 172 204 184 243 39 204 205 213 226 39 194 203 205 230 39 504 209 525 280 39 524 208 542 288 39 549 119 570 190 40 73 86 98 145 73 1 163 39 170 73 0 169 41 176 39 21 205 49 315 39 116 204 142 311 40 18 76 46 137 40 0 108 18 163 40 49 21 76 80 39 107 202 123 282 39 0 0 593 432 +4603 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353298.jpg 480 640 60 1 494 479 629 75 234 316 395 620 56 40 215 243 532 +4604 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000120682.jpg 500 374 1 230 205 334 355 0 259 60 359 212 67 326 86 344 108 2 262 201 339 293 2 247 156 294 186 2 201 2 499 366 +4605 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572802.jpg 500 419 5 0 183 87 287 0 0 40 493 413 67 191 204 233 246 7 0 181 87 304 5 73 185 125 275 +4606 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000465087.jpg 480 640 0 184 139 342 633 0 21 198 55 327 0 15 214 24 263 58 353 352 409 440 58 401 356 479 459 58 336 371 355 399 58 366 302 393 333 0 305 227 325 247 0 5 203 19 239 39 35 364 57 464 39 65 363 90 466 39 83 357 101 453 39 106 371 129 470 39 136 365 158 465 39 25 353 41 451 39 53 342 66 389 39 89 344 104 389 39 51 355 70 453 39 125 366 139 450 39 79 343 87 380 58 404 340 424 361 58 442 277 458 302 39 111 346 118 361 58 404 471 453 535 58 427 523 479 639 58 351 359 366 369 58 338 332 364 356 58 390 300 422 334 39 111 361 124 378 0 160 178 250 360 0 0 203 25 352 39 99 215 443 449 +4607 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301397.jpg 500 411 0 0 56 499 403 67 194 197 234 238 5 77 204 131 285 +4608 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000027610.jpg 640 426 0 250 74 582 420 0 162 124 316 341 0 0 47 202 425 67 329 377 384 400 67 247 285 269 317 1 363 59 469 170 1 148 200 200 304 0 462 53 639 425 +4609 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302094.jpg 375 500 0 334 383 353 441 0 323 379 341 434 33 0 150 32 160 75 118 145 257 416 47 181 372 225 427 0 357 382 371 419 0 221 375 232 408 0 203 373 211 384 0 0 357 13 381 75 279 323 323 423 75 261 362 286 423 75 52 351 75 412 0 362 404 374 444 75 20 305 70 408 75 233 336 263 421 +4610 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000502854.jpg 640 427 0 213 166 267 229 56 0 268 59 301 75 85 316 156 426 75 191 299 262 420 75 273 289 312 383 75 296 310 351 410 75 383 263 423 359 75 430 269 456 333 75 438 206 473 320 75 464 205 485 305 75 490 239 512 288 75 336 205 388 383 75 410 203 441 344 75 462 255 480 312 58 25 210 60 254 75 241 296 268 399 +4611 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000160556.jpg 640 428 0 453 76 637 422 67 564 141 602 184 66 346 272 461 329 68 0 106 348 375 77 13 57 96 124 63 439 243 473 271 77 181 107 215 136 62 279 133 405 262 67 395 245 413 285 +4612 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229383.jpg 612 612 0 161 164 530 604 0 248 78 599 554 0 0 127 225 597 67 163 305 259 396 67 472 138 498 171 67 362 328 405 359 26 2 431 294 611 26 247 356 442 507 0 437 1 519 152 0 531 90 611 338 0 433 79 519 191 26 514 184 557 278 26 454 183 513 246 67 473 163 484 172 26 566 126 611 227 26 536 34 611 119 +4613 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000133485.jpg 283 500 58 11 7 278 492 75 17 256 216 494 +4614 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047720.jpg 612 612 48 338 328 611 471 60 12 154 611 595 0 61 0 229 119 41 33 94 335 289 44 55 257 197 316 48 388 207 581 355 0 0 0 89 108 0 229 0 416 100 43 564 303 611 326 53 392 207 583 362 +4615 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401092.jpg 512 640 48 0 310 385 505 0 389 0 511 160 41 330 185 444 364 41 417 156 481 256 42 461 373 512 454 45 166 136 248 188 56 128 65 278 148 56 248 67 358 168 60 0 130 512 631 75 246 134 320 261 0 0 0 126 134 +4616 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000504353.jpg 640 480 59 3 319 637 474 0 91 200 358 473 77 351 173 527 383 77 141 78 205 163 77 22 199 168 341 77 241 63 309 99 77 246 80 374 194 77 189 162 285 261 77 464 96 582 178 77 329 48 412 93 77 431 44 546 169 77 522 198 628 371 77 338 88 457 199 77 202 88 278 170 77 286 267 366 363 77 211 93 634 314 +4617 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000040686.jpg 500 375 59 255 180 353 369 59 412 187 460 334 72 86 128 219 369 28 438 229 458 268 69 429 307 499 374 +4618 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000496379.jpg 640 480 59 0 225 589 476 0 242 19 615 372 63 0 116 371 364 77 458 221 639 473 56 244 108 359 186 +4619 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125228.jpg 640 480 59 0 0 640 475 0 148 40 390 308 63 148 185 635 470 66 199 260 458 385 77 239 0 513 89 +4620 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062623.jpg 500 375 59 0 62 500 370 0 1 112 438 370 63 43 144 271 343 65 131 181 150 217 67 131 182 149 217 +4621 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532827.jpg 640 478 60 0 186 637 472 76 99 407 250 476 76 109 407 267 444 76 110 377 271 417 76 178 375 305 462 76 172 342 229 370 76 149 366 298 413 76 127 430 171 477 76 178 364 269 388 +4622 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000127801.jpg 429 640 67 75 108 333 533 0 1 191 367 629 +4623 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000396369.jpg 640 427 67 434 188 453 206 56 528 197 558 308 56 482 385 599 426 56 448 179 466 243 56 431 163 445 175 56 580 236 639 392 56 114 172 145 205 56 119 200 135 218 0 125 128 303 355 0 173 103 207 137 0 229 103 290 170 0 375 112 460 249 0 414 109 533 289 0 365 259 536 426 60 250 190 484 395 45 265 279 331 324 0 320 133 383 196 0 29 160 261 421 0 310 109 356 178 56 3 281 59 418 60 219 169 381 220 39 223 150 231 170 67 320 167 329 178 77 351 262 400 319 +4624 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047008.jpg 640 427 67 300 167 403 355 0 93 7 615 421 +4625 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000094746.jpg 500 400 67 136 97 177 173 0 1 11 368 396 27 170 254 181 274 27 74 92 80 105 27 31 83 36 96 27 441 106 446 120 +4626 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048564.jpg 427 640 67 95 153 140 233 0 4 1 423 630 +4627 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000179112.jpg 500 375 67 200 134 263 234 0 15 1 348 370 +4628 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000106849.jpg 640 573 67 105 473 137 497 0 84 27 404 572 0 438 109 629 395 40 396 402 439 459 45 394 449 422 483 39 589 385 628 531 39 427 364 440 390 39 407 167 427 247 39 427 171 444 238 39 528 350 552 393 39 385 172 405 248 39 362 161 388 250 39 39 338 73 450 39 64 347 96 453 39 42 159 50 204 39 626 402 639 535 39 551 358 567 392 45 424 458 461 489 60 2 438 639 565 39 454 381 481 452 45 348 450 361 475 45 329 441 348 470 39 0 46 635 483 +4629 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003337.jpg 640 427 67 335 163 426 203 0 4 2 395 416 2 142 0 380 54 2 442 0 639 91 +4630 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000369887.jpg 500 375 67 78 107 209 369 0 0 103 242 370 +4631 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000511403.jpg 426 640 67 136 123 319 604 +4632 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000399205.jpg 640 480 67 264 178 284 197 67 316 199 321 204 67 390 211 438 257 0 73 24 280 479 0 313 77 442 472 0 392 92 502 440 0 394 2 637 470 0 508 116 554 237 3 4 171 63 222 0 479 123 487 149 0 490 119 505 163 0 237 88 365 432 0 508 121 524 159 0 45 120 97 266 0 506 123 514 145 0 485 124 491 149 +4633 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000556751.jpg 480 640 67 155 262 203 276 67 149 256 187 263 0 119 98 342 612 56 0 214 45 320 +4634 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000036563.jpg 640 451 67 79 145 91 173 67 317 96 324 100 67 338 119 351 122 67 361 136 368 138 0 448 48 562 323 0 408 81 474 315 0 283 56 340 274 0 72 77 258 448 0 340 68 426 297 67 453 96 474 109 67 405 143 415 147 0 312 66 379 287 +4635 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125322.jpg 640 424 67 141 73 149 108 0 126 43 344 418 24 294 191 362 343 +4636 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362869.jpg 500 375 67 319 114 434 256 2 348 1 499 89 0 0 0 394 352 2 151 2 181 40 +4637 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000527704.jpg 500 375 67 384 80 388 90 2 82 131 177 179 0 265 58 411 342 2 217 40 499 226 7 217 37 499 224 +4638 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000185697.jpg 640 425 67 179 140 193 154 0 137 122 302 398 +4639 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512070.jpg 500 334 67 400 233 499 329 67 349 202 479 281 67 185 68 306 296 0 12 53 346 333 66 3 35 499 182 +4640 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137658.jpg 366 640 67 207 160 330 557 0 2 1 308 254 +4641 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068546.jpg 640 478 67 293 209 405 329 67 319 357 387 470 67 169 297 243 427 0 185 7 378 449 0 295 116 498 450 0 365 42 639 477 0 0 69 278 477 67 234 92 292 194 +4642 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000048739.jpg 480 640 67 233 243 273 294 0 1 94 379 634 0 206 50 479 632 74 415 289 429 315 +4643 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529668.jpg 480 640 67 235 166 258 222 0 72 139 310 639 26 183 342 315 487 +4644 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333101.jpg 640 466 67 170 269 214 322 0 137 0 634 456 56 52 311 132 465 0 0 249 61 459 +4645 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177452.jpg 500 333 67 199 97 364 234 67 135 66 271 174 67 75 55 211 143 67 31 30 154 105 67 313 139 469 292 60 0 10 499 327 +4646 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005060.jpg 480 640 67 231 370 242 388 0 159 309 324 497 +4647 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000005652.jpg 640 427 67 209 145 267 341 0 11 9 632 421 +4648 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022341.jpg 500 375 67 339 156 391 289 0 114 97 439 370 +4649 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000158272.jpg 360 640 67 125 195 141 210 2 236 212 335 271 2 0 207 104 257 0 45 74 241 581 26 210 249 271 343 0 349 216 359 242 0 86 200 98 220 1 0 352 15 483 1 332 518 359 639 +4650 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578878.jpg 480 640 67 13 364 118 469 0 14 1 479 638 60 1 502 257 630 62 199 156 288 275 +4651 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000332570.jpg 390 500 67 102 56 318 442 0 0 44 371 499 +4652 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000505014.jpg 500 371 67 79 262 204 357 0 28 0 499 371 +4653 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414289.jpg 508 640 67 123 139 143 173 0 259 10 380 260 41 170 237 237 340 26 68 367 312 638 0 388 3 507 244 0 41 18 418 629 +4654 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000046924.jpg 480 640 67 93 156 349 579 41 210 0 343 203 0 0 195 391 639 +4655 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373571.jpg 500 333 67 123 147 182 219 0 125 99 325 332 0 137 2 497 327 +4656 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000224523.jpg 425 640 67 159 239 192 272 0 33 287 168 494 0 1 386 120 574 0 286 271 388 455 0 283 427 408 639 0 154 162 306 639 41 104 404 122 439 41 363 494 383 523 0 347 395 424 537 0 141 485 171 639 41 116 332 140 369 56 0 569 142 639 +4657 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000382855.jpg 640 427 67 420 59 439 77 0 74 0 534 373 +4658 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000441824.jpg 612 612 67 147 53 274 271 0 110 17 599 584 +4659 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000543281.jpg 640 428 67 229 6 563 360 +4660 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000262235.jpg 480 640 67 218 314 237 378 0 127 248 385 638 39 71 593 110 639 +4661 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000007873.jpg 640 427 67 320 227 350 269 0 271 34 639 420 0 139 69 322 421 0 0 0 100 423 26 529 294 563 426 26 200 144 328 365 0 298 141 332 195 26 78 242 191 416 0 272 143 302 190 0 31 118 100 293 0 73 163 112 235 +4662 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368222.jpg 480 640 67 106 479 186 523 56 348 257 464 518 0 60 97 423 513 +4663 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333436.jpg 617 640 67 302 144 341 172 0 230 89 521 632 0 51 52 262 639 26 372 330 471 455 2 1 125 130 234 2 497 108 573 152 2 0 227 80 467 2 223 258 271 342 2 213 180 272 257 11 245 65 429 248 24 43 155 124 382 26 53 210 99 371 +4664 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000420339.jpg 640 428 67 322 240 375 282 2 68 192 160 234 0 216 159 409 426 0 408 187 422 232 0 503 185 530 231 0 439 189 445 206 13 408 251 503 321 13 468 209 487 239 73 228 343 296 408 0 437 198 461 239 0 577 188 586 209 0 468 192 498 240 0 123 186 148 252 0 567 183 576 219 2 187 191 207 206 2 0 200 69 249 2 170 189 196 212 0 270 186 294 236 0 266 187 272 222 0 561 190 568 216 0 400 194 410 232 2 212 188 230 212 2 239 195 250 215 2 259 194 266 214 2 232 194 247 208 0 17 185 507 224 +4665 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368367.jpg 500 400 67 62 245 110 378 0 0 139 274 399 0 301 237 330 254 0 334 236 361 265 0 0 232 23 304 0 6 224 25 259 41 371 375 447 392 0 215 165 275 392 +4666 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030034.jpg 375 500 67 36 73 150 201 0 1 73 347 494 13 300 300 374 378 +4667 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000286119.jpg 375 500 67 124 21 273 463 0 22 185 323 492 +4668 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000353666.jpg 611 640 67 468 103 484 137 0 3 509 338 616 24 3 529 48 593 32 275 529 332 575 0 33 422 213 553 0 357 48 523 637 +4669 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097682.jpg 240 320 67 54 100 113 142 0 0 14 239 319 41 104 260 191 319 41 76 209 143 300 +4670 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433980.jpg 375 500 67 77 291 151 434 0 2 1 351 493 +4671 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000348791.jpg 586 640 67 0 200 103 530 0 0 102 586 639 0 448 41 585 581 41 110 471 371 638 0 95 329 213 454 +4672 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386224.jpg 640 428 67 288 164 368 224 26 561 176 628 356 26 448 316 538 402 26 17 166 101 398 0 250 71 524 422 0 483 71 636 420 0 277 121 329 189 0 0 72 48 417 0 595 109 639 190 0 91 111 190 427 0 102 66 344 421 73 206 250 292 394 0 172 40 232 190 0 17 105 61 175 +4673 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029030.jpg 640 483 67 68 270 130 299 67 472 193 522 224 0 319 104 584 469 0 60 23 315 419 +4674 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000251195.jpg 640 480 67 534 123 563 171 67 509 243 586 353 56 311 168 363 289 0 360 0 606 257 73 288 280 521 429 73 486 192 606 231 73 522 314 639 467 0 1 0 577 473 0 612 1 639 212 +4675 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032510.jpg 500 375 67 275 116 316 244 0 117 49 350 374 +4676 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000316704.jpg 640 480 67 479 98 507 144 0 39 35 226 453 0 195 238 541 474 0 429 29 592 377 60 29 325 639 472 0 194 59 394 345 0 590 73 639 297 0 465 61 507 128 39 0 379 53 477 41 55 72 85 107 41 56 107 86 112 41 59 112 87 116 41 85 70 108 100 41 84 99 108 106 41 87 112 109 117 41 195 26 214 59 41 186 92 203 113 +4677 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000318566.jpg 480 640 67 364 237 372 250 0 212 233 382 593 26 282 298 336 407 +4678 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000314992.jpg 425 640 67 303 99 339 178 0 37 9 360 631 26 35 151 132 492 +4679 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000390769.jpg 480 640 67 417 228 447 290 67 443 228 446 234 0 333 176 476 629 +4680 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289128.jpg 480 640 72 98 15 350 605 56 398 332 479 573 39 238 240 257 293 39 264 212 287 288 39 168 397 192 450 39 253 393 282 449 39 248 520 269 582 39 243 84 273 193 39 190 81 216 179 39 163 201 188 299 39 258 211 275 290 39 266 517 282 577 39 195 519 214 579 56 72 586 346 639 39 131 84 158 190 39 178 521 197 582 39 133 84 320 585 +4681 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159791.jpg 500 375 72 109 1 413 368 56 0 294 123 374 69 23 246 119 353 14 283 63 308 82 45 69 238 110 249 68 0 192 30 242 69 37 193 110 240 0 264 306 287 334 0 258 327 288 360 0 227 313 257 342 0 215 315 230 339 0 166 282 191 325 0 148 214 155 230 0 147 204 158 234 0 137 215 144 232 +4682 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515760.jpg 480 640 72 1 5 479 629 0 178 105 477 632 +4683 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319616.jpg 427 640 72 24 68 409 558 68 0 247 52 371 +4684 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169757.jpg 480 640 72 188 330 419 632 41 350 327 384 373 69 244 264 403 352 69 0 481 161 593 +4685 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000243442.jpg 640 427 72 427 25 635 373 0 369 21 508 391 45 18 208 86 230 45 469 64 516 84 45 472 202 498 211 60 1 196 286 375 +4686 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000453755.jpg 500 374 72 116 117 253 271 56 163 229 229 245 56 250 342 440 373 56 388 247 475 269 56 2 294 35 372 43 412 252 423 285 45 363 326 407 342 45 353 287 392 302 39 31 218 45 247 39 1 244 16 292 39 4 216 19 250 39 121 285 129 307 39 97 285 113 313 43 404 256 408 272 43 424 317 436 335 43 397 252 403 272 44 488 338 491 342 44 471 353 475 366 56 268 236 349 267 56 303 214 348 243 58 363 214 393 248 39 150 284 166 306 40 276 279 294 302 42 427 354 441 365 42 445 357 450 367 42 449 357 460 369 43 421 259 445 275 45 221 311 260 324 45 248 299 286 322 45 206 299 241 318 45 204 322 277 349 45 223 321 260 330 45 156 312 199 327 45 363 344 403 357 45 157 324 200 334 45 217 334 262 346 45 203 346 258 369 56 64 308 202 369 +4687 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503772.jpg 640 480 72 304 2 639 474 39 278 169 294 204 69 0 165 92 357 43 82 117 94 143 44 244 188 265 197 68 122 125 180 167 +4688 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462629.jpg 640 426 72 230 135 330 362 72 151 150 236 362 72 67 112 158 236 72 435 150 547 359 72 36 158 72 323 72 468 117 563 259 72 107 100 213 153 72 475 254 612 418 72 72 233 154 348 +4689 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000195281.jpg 640 480 72 27 51 519 473 0 151 48 598 472 +4690 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084073.jpg 640 427 72 308 0 637 419 +4691 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000415958.jpg 428 640 72 75 247 142 476 56 14 393 91 630 0 1 211 107 404 69 303 338 411 533 71 220 351 303 367 26 1 361 44 432 24 113 499 200 635 +4692 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000463898.jpg 612 612 72 34 2 558 560 0 147 99 349 603 14 418 89 438 116 +4693 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389753.jpg 640 480 72 267 156 344 372 68 345 195 402 236 41 529 231 540 252 41 503 229 514 245 41 482 228 492 251 56 182 254 251 394 60 95 290 266 451 71 503 254 571 268 41 515 232 528 253 41 492 234 502 250 41 472 232 486 252 41 467 233 476 249 69 384 296 577 335 +4694 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000219075.jpg 640 480 72 189 147 340 479 62 0 375 44 468 60 510 361 639 479 71 552 293 572 296 0 336 98 475 473 +4695 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123622.jpg 640 480 72 18 2 507 471 0 0 74 225 473 39 525 138 579 232 39 573 91 634 226 +4696 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000331349.jpg 427 640 72 250 233 425 631 68 127 298 223 353 69 127 361 178 506 71 209 373 244 394 +4697 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000034114.jpg 640 480 72 29 202 103 473 39 560 27 576 73 68 450 302 639 472 +4698 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000289201.jpg 640 480 72 460 126 551 376 72 216 118 332 418 72 332 117 449 380 72 69 121 198 438 56 90 335 205 476 0 542 91 639 454 +4699 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190395.jpg 480 640 72 121 25 440 614 +4700 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000071241.jpg 370 500 72 289 222 369 460 68 111 180 186 299 69 35 331 257 462 +4701 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000304827.jpg 640 361 72 347 77 488 360 71 0 258 203 354 45 147 185 188 211 45 80 252 161 320 46 203 197 232 207 45 35 334 60 353 +4702 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000398222.jpg 640 427 72 393 39 449 169 56 480 226 502 292 56 76 171 98 207 56 50 237 79 344 56 64 290 98 360 60 154 173 325 339 45 69 385 157 425 45 221 168 241 188 0 332 139 422 254 0 387 166 486 286 0 489 174 639 342 0 295 111 367 205 0 269 120 318 178 0 162 101 246 175 0 96 110 165 203 0 93 204 235 355 0 74 169 197 306 0 513 320 639 426 42 507 309 533 327 43 179 201 202 205 44 224 245 229 255 44 352 382 402 412 44 384 241 402 275 44 253 286 269 308 45 277 91 307 103 45 433 282 474 304 47 573 114 639 141 60 11 287 511 426 71 472 99 494 108 39 204 191 216 226 39 297 68 303 77 42 454 376 498 414 42 356 380 399 410 56 69 249 100 336 56 416 126 454 175 73 524 127 570 144 +4703 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000361660.jpg 427 640 72 117 182 329 576 43 329 237 332 261 43 333 237 335 262 43 340 238 341 259 43 337 237 339 259 43 342 240 344 258 43 347 258 351 276 43 335 238 337 263 43 337 257 341 277 +4704 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273712.jpg 480 640 72 1 80 314 599 +4705 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000397322.jpg 500 333 72 214 22 436 322 +4706 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426377.jpg 480 640 72 192 149 370 553 56 267 502 348 638 56 152 438 262 638 39 265 263 278 306 39 279 249 291 305 39 300 244 309 278 40 443 25 474 87 39 305 250 321 300 39 314 378 327 429 39 303 374 316 424 39 279 384 291 437 40 415 312 424 343 40 429 176 457 203 40 442 293 462 338 40 441 135 454 161 40 452 141 464 166 40 430 138 441 164 40 418 173 436 202 40 456 295 463 336 40 402 163 420 201 40 373 163 389 209 41 398 246 438 290 41 403 209 416 238 41 457 250 471 266 41 462 228 470 236 41 405 322 420 349 41 422 319 440 350 41 429 210 440 238 41 416 217 426 239 56 104 403 200 546 60 0 448 138 569 73 57 546 176 627 39 311 448 327 499 39 272 448 286 503 39 298 443 309 488 39 292 381 303 433 39 306 443 318 495 39 317 312 327 359 39 210 13 438 489 +4707 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000064693.jpg 480 640 74 93 1 280 221 27 90 500 93 508 27 248 527 254 541 75 328 400 412 631 0 213 482 286 587 75 0 357 32 419 +4708 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000191013.jpg 474 640 74 142 209 330 397 2 305 551 438 611 2 44 548 223 639 7 122 520 267 607 0 59 542 83 583 2 450 567 473 603 0 366 564 378 577 2 0 621 210 639 +4709 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000177166.jpg 640 480 74 253 102 384 231 +4710 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000125070.jpg 480 640 74 293 182 337 276 +4711 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000494085.jpg 640 426 74 181 117 335 321 73 157 305 417 424 +4712 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000156292.jpg 428 640 74 133 241 271 371 74 277 244 339 302 74 66 243 128 302 74 58 306 126 372 74 143 394 269 516 0 183 500 228 631 0 61 378 126 551 26 182 519 212 580 +4713 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280007.jpg 426 640 74 121 599 253 639 +4714 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000558976.jpg 427 640 74 117 175 364 386 +4715 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000010400.jpg 427 640 74 262 197 302 234 +4716 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150888.jpg 426 640 74 174 195 256 274 0 29 459 59 516 0 165 412 197 516 0 199 437 229 466 0 300 464 320 517 0 408 435 425 516 0 78 434 108 516 0 324 438 350 518 0 349 439 380 518 0 63 455 93 516 0 0 438 29 515 0 132 444 162 517 0 229 436 264 516 +4717 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000229234.jpg 640 480 74 194 228 246 268 74 134 237 162 293 +4718 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000538775.jpg 427 640 74 154 160 220 221 26 21 487 46 534 26 71 517 81 533 0 102 479 119 523 0 24 461 72 639 0 167 488 188 558 40 413 605 426 635 40 348 572 360 608 40 360 578 372 601 40 380 583 392 621 40 279 557 288 576 40 286 555 297 580 40 307 568 316 589 40 329 571 339 598 40 340 571 347 591 40 391 589 407 624 40 317 566 325 590 40 296 555 305 580 60 247 565 426 639 60 221 541 254 554 60 208 534 237 542 0 269 487 340 566 0 0 468 27 582 0 74 480 99 576 0 157 484 168 508 0 188 483 208 520 0 201 503 219 526 0 210 481 233 509 0 249 492 268 512 60 337 537 369 545 0 233 487 248 523 40 375 579 385 609 0 210 505 237 535 0 16 470 414 548 40 301 553 425 613 +4719 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000079588.jpg 640 480 74 207 127 237 178 0 409 375 423 415 0 302 379 315 421 0 390 377 403 416 0 286 383 303 422 0 320 384 328 405 +4720 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000029019.jpg 619 640 74 276 251 322 299 74 348 261 377 311 +4721 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202797.jpg 480 640 74 329 53 425 165 56 292 300 479 609 56 44 234 96 271 56 0 244 64 330 60 278 255 479 418 73 0 406 92 525 28 281 190 359 267 56 319 223 439 402 56 352 225 363 246 +4722 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000503097.jpg 640 640 74 215 201 424 423 +4723 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000124018.jpg 612 612 74 370 373 396 400 74 322 385 335 408 +4724 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000328551.jpg 640 640 74 410 213 478 281 +4725 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439777.jpg 640 427 74 264 114 361 166 +4726 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000074137.jpg 640 480 74 285 193 400 317 0 604 462 626 479 +4727 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000171335.jpg 640 480 74 266 106 401 244 0 572 189 622 389 0 139 55 303 312 0 3 99 55 324 +4728 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000280530.jpg 480 640 74 242 261 301 319 74 171 278 198 338 +4729 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153094.jpg 640 427 74 248 122 278 157 74 212 125 230 159 +4730 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000449392.jpg 640 427 74 366 163 385 192 74 328 165 346 189 +4731 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000546226.jpg 640 426 74 527 169 554 195 2 619 368 635 377 28 275 379 289 390 0 562 365 567 375 0 338 361 345 385 0 533 363 538 376 0 524 364 528 376 9 577 354 586 357 9 577 361 579 363 74 568 172 574 198 0 447 360 452 379 0 350 359 357 385 0 402 360 412 381 0 284 359 295 390 0 442 364 446 378 0 472 360 477 378 0 496 361 504 379 0 482 363 489 378 9 578 357 584 362 9 585 361 587 364 24 405 364 410 372 0 601 366 604 376 0 457 355 612 405 +4732 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577169.jpg 640 480 74 93 1 498 439 0 184 271 253 467 0 385 284 443 471 0 335 280 384 469 24 389 402 418 450 0 284 294 352 479 0 244 283 300 470 0 49 271 114 465 0 599 270 639 479 0 470 280 527 454 +4733 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043218.jpg 640 428 74 233 97 342 208 75 384 315 420 361 75 422 278 468 362 75 422 325 446 359 75 101 318 152 356 75 173 287 222 359 58 92 207 298 391 +4734 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000416088.jpg 640 450 74 306 131 325 151 0 172 403 187 438 0 422 396 437 426 0 434 419 456 449 0 61 389 72 421 0 298 359 305 381 13 51 417 307 449 0 156 403 174 449 0 219 400 232 422 0 217 409 227 420 0 528 374 540 410 0 247 393 262 422 0 156 400 163 421 0 213 379 228 414 +4735 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254931.jpg 640 472 74 216 126 482 392 +4736 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000047886.jpg 480 640 74 427 173 479 226 0 33 76 362 639 0 343 238 394 470 0 146 197 183 262 0 451 229 479 354 0 0 83 119 639 77 167 275 279 401 39 30 247 53 307 0 388 224 458 472 0 378 241 395 270 +4737 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000101884.jpg 640 426 74 464 57 501 89 7 291 360 332 390 7 162 361 179 378 +4738 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000512248.jpg 480 640 74 295 324 420 436 +4739 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000062041.jpg 640 480 74 273 328 330 385 74 345 392 398 453 +4740 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137678.jpg 424 640 74 50 472 215 616 +4741 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305526.jpg 425 640 74 162 329 215 385 74 249 339 269 395 +4742 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277046.jpg 640 427 74 305 190 330 223 +4743 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000033499.jpg 640 480 74 250 180 455 381 +4744 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003084.jpg 640 480 74 217 144 429 325 +4745 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295728.jpg 512 640 74 115 151 301 340 74 323 165 380 341 +4746 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000038488.jpg 640 528 74 383 224 416 259 74 453 230 469 262 +4747 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000517443.jpg 480 640 74 225 143 267 183 74 310 164 322 194 +4748 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000530461.jpg 640 427 74 459 32 519 103 74 399 40 447 120 13 356 397 402 423 +4749 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000249295.jpg 640 640 74 172 109 242 197 74 119 115 149 201 +4750 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000131431.jpg 425 640 74 150 238 245 389 +4751 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000403180.jpg 506 640 74 137 130 178 168 1 275 393 344 442 2 41 362 82 388 2 57 363 97 390 2 177 372 194 406 2 25 360 62 383 2 100 357 124 399 2 18 363 40 384 2 0 359 43 384 2 0 354 23 363 2 87 370 96 392 +4752 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000305368.jpg 640 480 74 230 234 289 301 +4753 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301956.jpg 480 640 74 130 96 333 329 56 421 603 479 639 56 0 537 38 612 +4754 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000030470.jpg 427 640 74 199 429 272 509 +4755 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553306.jpg 426 640 74 222 147 242 189 74 138 143 176 188 +4756 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000302193.jpg 480 640 74 203 107 394 290 0 202 569 290 639 0 336 607 351 639 0 355 614 367 639 0 394 596 434 635 0 373 614 383 635 0 18 610 24 639 0 345 616 357 639 0 58 595 99 638 0 381 612 393 639 0 1 608 14 636 +4757 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000157756.jpg 480 640 74 227 152 266 186 0 32 438 60 512 0 69 436 94 508 0 402 452 432 515 0 466 453 477 476 0 157 441 163 464 2 6 441 78 487 0 87 441 101 506 1 231 467 281 507 9 376 372 395 418 9 461 420 469 434 9 471 402 479 424 9 406 389 423 435 26 54 463 60 472 0 447 450 463 474 7 317 446 433 506 0 397 442 416 472 0 319 446 327 462 0 102 448 110 463 2 314 457 331 489 +4758 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000188132.jpg 480 640 74 198 172 302 261 +4759 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000507684.jpg 512 640 74 188 295 319 368 +4760 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285160.jpg 480 640 74 197 155 209 192 56 330 550 382 620 56 367 527 399 559 56 407 512 435 536 0 262 475 326 628 0 205 473 264 639 0 155 479 197 588 2 34 465 90 490 56 397 521 453 581 60 335 533 396 553 60 426 517 466 578 2 74 466 87 476 56 463 535 469 545 74 225 149 260 183 56 384 540 434 615 +4761 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000245173.jpg 480 640 74 242 161 284 200 1 430 546 472 578 1 404 546 428 577 +4762 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058344.jpg 640 480 74 251 212 276 238 0 578 418 597 452 0 563 430 572 451 0 497 422 522 479 0 471 440 498 479 0 427 427 456 479 74 328 305 355 336 0 317 434 341 479 0 391 437 403 472 0 27 435 35 457 0 76 437 84 471 0 459 440 471 455 0 413 440 421 455 0 68 437 73 449 0 41 437 46 454 13 368 447 392 457 13 402 446 423 456 0 7 426 634 460 +4763 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000009217.jpg 480 640 74 176 257 225 320 +4764 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000518234.jpg 640 480 74 82 146 136 189 +4765 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365485.jpg 640 439 74 508 231 576 299 2 125 293 135 302 2 143 295 151 302 2 141 283 148 292 2 138 274 146 284 2 123 284 130 291 2 108 193 115 201 7 529 62 536 71 7 127 270 134 279 0 93 323 95 329 0 97 326 99 334 0 390 406 391 413 0 493 63 495 67 0 507 78 508 82 0 175 262 179 269 2 95 205 111 212 2 101 163 110 170 2 252 223 272 229 7 540 68 547 82 7 586 141 595 154 +4766 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000111179.jpg 480 640 74 174 172 203 236 74 228 152 298 222 +4767 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451679.jpg 640 480 2 0 40 161 238 56 451 128 478 189 56 441 117 463 176 0 331 130 557 470 0 466 86 557 243 0 545 60 639 374 0 538 90 589 180 0 475 79 527 129 60 512 208 577 266 69 81 34 392 356 +4768 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000247839.jpg 640 480 39 367 248 380 302 39 442 212 451 250 39 254 317 279 382 60 236 297 377 407 0 450 232 527 442 0 134 201 269 389 0 0 241 210 479 0 242 215 343 323 0 409 190 432 230 0 448 175 467 210 0 288 188 381 284 40 175 259 199 300 40 335 298 351 326 40 257 317 274 340 40 277 329 291 367 40 371 230 383 257 41 297 324 317 368 42 175 374 195 396 43 101 411 138 447 43 292 310 337 313 53 232 325 259 345 0 218 289 487 473 0 456 168 494 198 0 324 184 384 254 40 469 200 479 216 40 228 343 259 371 40 286 212 301 238 40 455 216 467 235 40 213 367 234 407 41 131 415 167 479 41 379 177 402 218 41 378 268 400 294 53 142 396 191 437 0 414 179 443 227 56 480 403 534 478 60 20 370 323 479 0 528 169 559 201 0 433 174 456 215 56 605 235 639 307 60 189 364 223 375 0 381 157 634 354 +4769 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283890.jpg 427 640 56 55 305 131 383 56 0 296 41 359 75 140 183 292 598 +4770 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000572233.jpg 640 427 56 353 332 422 426 56 590 241 604 277 60 0 259 243 422 40 92 283 129 352 40 55 272 84 322 40 63 265 91 317 75 493 225 527 256 0 1 167 106 303 0 120 158 235 316 0 441 178 495 240 0 533 169 636 372 0 220 103 457 419 0 372 191 421 245 0 395 193 419 219 0 414 185 457 235 40 464 234 479 264 40 0 264 9 294 40 434 229 446 251 58 470 202 553 257 58 69 8 236 157 58 85 209 145 260 58 5 47 105 161 0 125 192 165 237 0 263 193 276 215 0 525 151 552 205 0 201 193 236 231 27 291 204 338 245 41 34 291 63 321 56 385 334 490 426 60 428 247 622 419 40 98 268 122 284 43 80 311 163 325 +4771 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000433883.jpg 640 320 56 40 217 338 319 56 585 164 618 211 60 146 159 483 311 0 110 88 206 205 0 170 121 282 205 0 178 109 205 177 0 232 113 269 179 0 306 119 355 156 0 372 114 431 183 0 477 98 624 319 0 431 85 489 293 41 355 205 370 235 41 279 197 290 218 41 174 188 210 219 43 373 299 456 304 43 369 222 411 227 40 235 167 259 220 40 255 161 271 205 40 207 179 236 221 40 278 162 289 196 40 271 196 292 220 42 360 289 456 306 42 368 222 406 227 45 391 197 416 215 45 358 197 391 214 0 366 102 451 213 0 514 10 625 143 40 174 186 206 218 40 290 152 302 167 40 251 205 273 221 40 320 190 357 290 40 287 166 298 190 40 200 188 212 220 40 268 156 281 184 56 608 178 639 313 56 205 152 237 185 40 286 153 293 166 41 206 179 234 219 43 370 226 411 229 43 360 294 465 298 0 1 75 141 314 40 347 156 364 173 +4772 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000273855.jpg 640 480 56 42 272 89 472 0 365 61 633 308 0 75 64 344 479 44 338 379 379 415 45 276 303 374 370 45 527 273 551 301 71 0 174 138 208 39 237 119 254 180 39 416 214 530 430 39 232 120 242 181 41 395 263 429 303 41 288 159 303 177 41 362 159 376 184 74 168 380 205 432 60 148 266 639 474 39 310 145 327 177 41 430 157 444 185 +4773 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000223414.jpg 640 480 56 107 399 230 479 0 217 131 483 479 40 382 210 463 288 40 580 406 639 477 0 555 293 639 474 25 357 1 639 62 +4774 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000265851.jpg 640 640 56 55 218 317 580 77 15 166 391 627 26 209 1 273 152 26 233 175 313 267 +4775 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000063939.jpg 640 480 56 146 167 207 208 60 199 212 521 469 0 54 78 255 317 0 207 69 237 136 0 191 60 219 107 0 365 55 515 211 0 539 76 583 177 0 1 48 217 473 0 116 55 219 176 0 110 55 140 102 0 340 165 639 470 40 222 122 558 338 40 327 252 360 341 43 236 328 320 376 43 161 260 235 265 43 161 260 236 264 43 339 337 362 393 43 161 284 328 380 44 266 291 314 328 0 533 90 639 233 41 457 256 493 331 41 302 264 333 318 41 283 182 292 203 41 485 226 541 332 41 372 182 391 201 42 169 284 233 314 44 402 326 476 338 0 196 74 312 218 41 243 229 266 275 42 364 340 390 415 42 350 341 377 403 42 171 285 245 316 42 450 208 460 220 44 416 216 428 222 56 539 178 571 201 0 40 54 82 90 43 497 330 511 348 60 510 158 533 171 0 488 60 537 127 41 288 188 307 205 44 449 209 459 221 0 170 57 504 123 +4776 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000203416.jpg 640 426 56 461 81 593 406 56 514 67 552 152 56 212 128 249 337 60 159 321 579 421 0 189 53 425 330 42 89 382 159 403 44 181 319 219 357 45 197 333 255 389 60 508 145 639 222 60 607 96 639 113 56 614 43 632 97 56 582 48 601 148 50 318 337 333 348 50 132 402 190 425 +4777 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581593.jpg 640 480 56 267 26 411 172 60 2 126 598 479 40 237 36 329 221 42 291 290 515 400 51 411 320 432 338 51 428 288 447 301 51 443 289 456 300 51 416 274 432 295 51 363 299 376 310 51 376 332 392 347 51 402 331 418 342 51 384 322 396 334 51 407 272 412 282 56 0 37 32 127 56 274 38 323 86 +4778 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150763.jpg 612 612 56 266 101 346 185 56 165 314 608 611 56 0 159 85 247 42 244 374 387 445 43 210 396 375 456 43 141 237 166 248 43 530 204 611 216 41 388 244 447 319 42 548 190 611 210 0 457 0 611 170 39 228 104 285 296 39 159 102 223 323 39 423 47 460 206 39 460 53 499 193 39 79 133 155 359 40 332 182 387 312 40 339 132 363 185 40 355 109 389 189 40 0 202 51 336 40 376 195 412 311 40 591 97 611 169 41 321 143 357 190 56 3 418 192 611 60 1 155 611 611 +4779 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000285302.jpg 426 640 56 193 6 368 223 0 14 28 299 534 76 123 282 219 354 56 0 164 330 639 60 203 242 425 613 +4780 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000385580.jpg 500 331 56 374 208 403 306 0 216 98 268 160 0 125 37 342 330 0 245 50 375 330 0 127 60 141 141 56 448 205 496 318 56 371 201 388 234 26 160 183 264 293 56 356 215 387 264 60 354 212 382 223 67 340 213 360 221 0 237 86 251 98 0 455 169 497 276 +4781 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000268378.jpg 640 359 56 72 270 117 358 56 83 233 128 342 60 199 226 428 353 0 390 143 620 358 0 347 117 459 246 0 114 142 283 358 0 0 57 113 358 40 321 248 342 301 40 313 274 339 322 42 249 239 273 264 42 407 259 434 304 0 210 124 302 225 40 266 217 284 259 0 363 128 513 296 0 92 118 175 315 0 230 55 307 197 41 314 273 340 322 40 290 203 304 235 0 76 47 150 223 40 365 256 389 299 41 364 256 390 298 +4782 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000379476.jpg 485 640 56 446 384 484 513 56 332 285 373 343 56 316 250 332 320 60 204 354 366 396 60 234 274 337 347 40 214 406 311 638 40 263 395 342 595 40 229 323 280 406 40 274 326 308 398 40 27 298 59 377 40 50 295 79 370 40 237 296 268 323 40 265 297 280 325 60 264 246 293 249 56 391 347 422 426 56 350 311 384 398 60 262 248 297 255 60 186 396 418 487 60 107 419 484 633 60 0 300 225 616 60 256 261 310 276 60 262 255 299 261 60 201 258 235 284 +4783 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000060899.jpg 360 640 56 285 141 357 282 56 329 166 358 343 0 99 143 238 518 56 0 120 125 336 56 142 266 297 452 56 329 138 359 199 17 234 170 254 235 73 0 585 35 639 +4784 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000011813.jpg 333 500 56 0 332 93 389 63 0 386 168 466 +4785 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000291784.jpg 640 480 56 126 47 224 148 60 120 141 634 471 68 308 76 545 260 70 442 181 619 318 45 138 222 237 254 45 153 241 221 304 45 273 156 308 186 75 89 68 117 107 +4786 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000579240.jpg 640 427 60 0 210 635 421 0 0 1 93 374 0 424 72 610 351 0 539 2 639 424 0 373 155 463 275 0 266 180 350 248 42 430 304 530 358 42 367 233 385 245 43 479 351 515 419 0 149 175 229 273 39 283 160 291 169 39 275 161 283 169 39 268 161 274 168 39 260 161 266 167 39 252 161 259 168 39 246 161 250 168 39 384 160 390 170 39 369 161 375 169 41 311 317 376 411 41 353 290 390 317 41 318 253 354 321 41 157 282 201 310 41 355 268 367 289 45 324 315 400 366 48 7 352 125 426 48 416 324 495 398 0 29 106 163 331 41 230 336 318 425 55 295 262 316 297 58 448 87 498 136 0 22 19 228 242 39 241 160 245 168 39 241 175 250 178 39 360 163 366 169 39 284 173 291 179 39 252 174 260 177 0 212 171 240 201 0 197 183 237 225 0 457 129 521 290 0 352 179 415 265 41 344 314 400 365 39 240 172 374 219 +4787 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000322174.jpg 640 480 60 67 246 595 277 75 247 161 282 260 75 509 165 546 270 75 333 135 380 260 75 103 160 138 263 75 431 165 463 262 75 170 160 204 260 +4788 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000277025.jpg 480 640 60 2 412 458 632 0 30 34 474 425 41 405 423 479 597 44 91 447 122 462 45 105 416 299 597 40 0 270 51 570 56 427 215 458 246 +4789 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043261.jpg 640 480 60 0 0 640 473 0 152 227 459 472 42 515 363 542 479 42 470 376 518 473 42 405 435 455 479 42 0 25 116 168 42 420 187 461 251 45 353 18 570 221 45 404 228 536 388 45 524 134 639 314 45 209 0 377 159 +4790 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000003779.jpg 640 480 60 1 0 639 474 40 253 47 374 354 40 474 46 627 334 40 3 38 157 343 40 425 32 530 246 40 77 22 185 248 40 101 8 197 148 40 404 0 452 99 45 19 86 98 144 0 435 0 528 63 40 269 24 348 50 40 389 0 437 86 40 563 0 613 48 40 596 3 639 64 40 325 0 375 56 +4791 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000581332.jpg 640 425 60 1 56 638 418 40 296 1 533 294 40 449 0 639 258 40 80 1 289 324 +4792 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000344903.jpg 640 480 60 0 1 639 473 51 270 110 317 162 51 356 71 384 103 45 421 11 631 246 45 415 244 639 479 51 341 137 403 191 44 124 89 176 143 45 66 297 259 462 41 73 293 230 467 +4793 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000167452.jpg 640 426 0 426 18 639 425 77 167 207 247 417 77 117 200 181 282 77 35 66 138 224 77 371 205 439 274 77 435 310 558 415 77 399 280 452 329 77 379 367 431 424 77 123 172 169 205 77 436 265 502 344 77 23 229 79 329 77 269 322 323 373 77 0 30 61 100 77 435 201 513 280 77 1 201 400 423 +4794 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000548882.jpg 640 480 0 1 254 162 468 41 457 50 574 200 43 297 287 460 479 39 1 0 82 111 42 114 216 164 426 75 1 52 114 195 48 304 240 424 393 48 303 216 411 298 48 285 187 385 239 +4795 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000578237.jpg 640 480 0 220 151 358 479 0 63 138 180 474 40 140 216 375 310 0 350 109 451 479 +4796 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000166645.jpg 478 640 0 282 3 475 578 50 340 93 398 122 +4797 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525849.jpg 480 640 0 62 204 244 503 0 184 196 433 538 40 62 433 116 517 41 258 436 314 535 41 164 435 199 518 60 1 490 193 592 67 271 534 357 548 41 188 435 264 497 +4798 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000425475.jpg 369 500 0 34 155 368 499 40 51 25 199 438 +4799 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000569976.jpg 480 640 0 128 1 340 411 0 20 336 238 626 78 194 209 338 438 0 188 265 333 449 56 168 473 276 511 56 0 521 263 639 56 208 492 332 639 +4800 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000486175.jpg 427 640 0 0 33 384 629 0 143 5 329 321 44 379 469 416 518 45 370 461 426 536 55 227 402 262 432 55 215 584 266 621 55 180 506 238 549 55 242 380 276 403 45 331 337 400 404 +4801 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232610.jpg 333 500 0 3 79 332 492 67 251 276 324 449 +4802 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000082889.jpg 640 480 0 422 0 594 156 41 80 198 176 318 41 614 0 639 38 60 5 92 639 471 60 0 9 85 52 41 592 0 616 22 56 562 127 639 282 56 5 0 146 149 56 200 3 380 101 56 0 0 86 89 56 167 1 217 52 56 0 70 65 91 56 393 0 530 176 56 323 0 408 105 56 0 369 54 479 56 139 9 196 86 56 81 1 109 66 56 554 80 639 226 60 538 22 639 66 56 498 16 519 62 +4803 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000529944.jpg 640 480 0 1 43 299 479 69 272 4 617 368 72 270 0 619 380 72 0 0 157 131 +4804 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444746.jpg 500 375 0 75 128 391 368 67 40 2 373 370 67 371 182 480 334 67 384 137 486 240 67 0 182 100 350 67 292 49 367 142 67 422 42 469 90 67 432 79 499 157 67 350 73 449 188 67 377 349 416 369 67 442 204 499 315 67 264 51 296 92 67 438 324 488 369 67 2 87 95 206 +4805 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000451120.jpg 640 480 0 162 12 417 419 45 190 372 318 447 56 510 280 639 389 +4806 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000045094.jpg 640 480 0 1 0 380 473 40 278 140 630 275 41 553 226 615 346 75 609 232 639 357 0 278 67 584 472 39 5 241 35 262 +4807 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138517.jpg 640 424 0 218 21 573 416 40 196 210 318 356 75 0 208 82 417 +4808 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567812.jpg 640 480 0 69 79 639 473 77 153 131 484 354 +4809 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000484978.jpg 640 491 0 87 65 322 312 41 389 362 426 411 41 434 318 526 404 42 411 417 518 490 43 517 413 638 436 41 406 262 445 323 41 560 287 612 360 41 511 340 557 395 41 113 278 181 332 41 84 309 120 341 41 613 294 639 355 44 246 194 300 213 45 525 298 560 340 60 0 292 640 490 41 235 293 282 350 41 525 297 561 342 41 404 327 442 378 44 545 333 618 355 44 337 297 384 318 42 302 347 377 371 +4810 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000525170.jpg 418 640 0 21 54 417 573 40 263 536 399 639 40 1 472 62 639 42 55 456 130 578 45 66 544 264 639 +4811 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000039743.jpg 640 478 0 29 106 294 473 0 358 99 564 471 61 64 356 290 477 71 459 0 639 117 61 315 279 395 477 +4812 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000073588.jpg 640 427 0 216 1 639 421 44 142 330 176 394 67 417 215 445 264 67 427 315 450 340 +4813 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000126299.jpg 640 427 0 427 3 528 121 69 395 112 575 388 69 0 40 386 398 72 373 32 456 152 +4814 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000567886.jpg 500 375 0 0 98 198 366 73 0 3 42 85 73 53 1 70 81 77 67 42 217 176 73 34 0 50 85 +4815 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000306426.jpg 500 485 0 34 2 487 416 76 108 304 219 389 +4816 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000013357.jpg 640 457 0 96 174 142 254 63 137 229 187 257 39 154 316 178 400 63 240 221 290 255 0 487 163 552 358 63 531 221 567 250 63 38 254 74 258 +4817 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000474609.jpg 428 640 0 106 34 424 630 44 77 222 104 250 45 18 399 148 481 46 57 212 103 262 46 36 225 61 264 46 41 240 49 265 69 0 296 265 639 44 66 368 113 451 +4818 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000134133.jpg 640 480 0 456 0 639 421 0 1 45 189 324 43 440 134 474 253 55 269 380 357 473 55 173 372 279 428 24 0 0 348 149 +4819 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000359947.jpg 640 480 0 0 197 293 470 68 1 3 639 470 +4820 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000293133.jpg 640 640 0 149 0 618 632 0 153 288 411 625 78 211 190 294 282 +4821 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000532695.jpg 640 429 0 301 73 537 421 0 270 59 378 248 0 180 165 371 423 0 56 166 207 421 0 130 62 255 341 0 53 50 134 160 0 4 158 74 269 0 540 300 639 428 0 0 167 78 428 0 0 48 111 239 26 132 315 173 383 26 538 151 605 218 0 524 34 630 333 +4822 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000097667.jpg 612 612 0 123 0 366 163 42 24 304 120 430 43 49 315 155 451 55 425 156 476 185 60 2 115 608 605 41 0 72 30 138 43 31 127 85 167 45 463 238 554 286 45 269 436 390 537 45 182 361 288 441 45 112 382 199 480 45 217 232 302 265 45 283 295 373 398 45 559 191 611 239 45 229 148 323 192 45 360 153 484 190 45 380 238 462 279 45 347 327 512 484 45 330 258 477 329 55 372 148 427 186 55 93 234 155 290 55 217 306 267 348 55 187 193 266 234 45 229 264 334 315 56 436 0 475 153 56 364 1 440 158 0 470 1 609 174 41 21 5 42 31 45 1 106 611 508 +4823 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000196313.jpg 640 427 0 34 8 368 412 0 262 35 624 426 40 65 381 120 425 40 75 357 130 407 40 0 345 22 419 41 198 371 268 426 41 65 382 119 425 41 75 355 127 410 42 20 366 75 379 0 465 67 639 391 0 251 25 308 113 0 588 36 639 244 0 289 63 330 150 41 0 350 25 418 0 427 28 485 95 0 385 18 428 46 0 0 27 157 300 +4824 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020175.jpg 500 375 0 228 106 322 250 0 92 91 270 374 68 441 175 495 218 69 437 219 499 260 39 182 39 198 95 43 167 40 174 82 58 193 209 321 286 72 138 104 296 157 41 359 228 381 274 43 173 42 181 83 0 59 118 170 373 0 287 101 383 261 69 440 175 493 216 +4825 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000439339.jpg 612 612 0 173 2 384 463 41 353 316 582 544 41 51 304 318 547 44 528 214 611 314 44 0 93 131 306 60 0 98 612 601 +4826 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478874.jpg 640 427 0 134 63 525 426 78 101 147 214 378 71 64 95 270 178 0 488 268 639 421 +4827 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000401591.jpg 612 612 0 1 431 611 611 +4828 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032524.jpg 426 640 0 17 143 417 613 +4829 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000259408.jpg 640 480 0 0 232 126 478 63 0 142 640 479 +4830 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561399.jpg 640 640 0 57 89 336 561 69 292 145 494 351 69 516 150 639 391 +4831 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000254167.jpg 375 500 0 40 85 374 491 76 130 167 321 360 24 126 374 306 497 26 161 374 344 499 26 126 384 298 494 +4832 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117404.jpg 480 640 0 81 37 441 486 77 28 283 147 453 0 0 394 480 632 +4833 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000271681.jpg 640 427 0 174 0 638 422 0 48 83 75 167 0 139 102 152 134 2 176 109 203 124 0 61 88 79 143 1 248 125 254 150 2 551 103 605 121 2 154 110 178 124 0 246 120 257 152 0 199 106 210 131 0 99 80 114 115 +4834 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000521669.jpg 480 640 0 284 258 419 385 0 1 31 370 632 67 171 78 455 562 0 203 272 314 398 +4835 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000227032.jpg 500 332 0 72 109 274 305 76 242 105 415 328 +4836 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414857.jpg 500 333 0 1 1 439 328 78 0 0 137 71 +4837 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000197918.jpg 640 640 0 14 113 316 630 77 0 315 114 580 77 178 51 383 177 0 161 84 376 558 0 312 63 639 639 +4838 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000301266.jpg 612 612 0 0 40 254 404 0 301 80 452 386 0 366 23 609 414 41 308 238 331 264 41 289 295 305 305 41 310 264 332 278 41 264 183 270 193 41 290 263 306 294 42 164 436 176 445 42 81 453 114 479 42 166 443 187 455 42 94 456 119 479 44 447 421 465 438 44 481 422 513 445 44 494 420 503 437 44 533 434 547 445 73 243 194 249 224 73 231 202 237 226 73 192 197 197 225 73 218 201 225 224 73 212 195 218 226 73 201 200 204 225 73 208 203 212 225 44 244 323 261 335 41 291 227 310 251 42 293 407 304 420 71 3 470 611 601 73 196 197 201 225 0 149 88 225 314 42 471 428 485 440 44 431 430 457 441 41 288 249 309 266 73 235 198 241 225 +4839 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000205409.jpg 640 480 0 48 159 325 478 69 12 328 103 368 +4840 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326230.jpg 300 500 0 160 141 199 209 39 162 216 172 242 62 169 157 231 206 0 81 132 143 335 56 219 248 293 373 +4841 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000270702.jpg 428 640 0 52 11 427 632 77 270 270 427 479 +4842 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000368752.jpg 480 640 0 229 3 479 319 0 127 0 278 71 41 0 262 84 462 44 207 323 361 362 55 214 334 300 391 45 350 431 479 531 45 80 411 172 488 0 0 6 249 401 60 0 292 480 639 +4843 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000137294.jpg 640 427 0 262 145 638 426 0 440 173 495 240 69 151 174 445 424 +4844 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000186125.jpg 640 425 0 387 228 482 318 76 3 145 195 424 +4845 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000173565.jpg 500 332 40 125 99 237 305 40 93 81 183 288 40 44 64 138 258 45 304 278 400 304 45 354 152 435 198 60 0 30 500 331 73 113 29 430 198 +4846 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000067686.jpg 612 612 40 158 1 309 169 60 0 0 612 605 45 62 5 186 84 45 0 57 117 144 55 185 113 391 295 +4847 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000462978.jpg 500 375 40 258 93 384 356 14 171 51 233 292 +4848 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000210520.jpg 612 612 40 268 0 366 111 41 164 267 233 335 41 346 98 470 254 42 114 381 137 563 43 394 372 420 540 45 463 51 609 307 75 187 188 218 212 40 513 0 575 45 41 0 202 124 342 41 425 0 485 40 60 0 0 612 612 75 254 28 331 208 44 576 202 601 227 44 424 161 571 237 44 420 375 449 514 44 570 209 602 305 44 68 200 118 247 +4849 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349489.jpg 539 640 41 38 267 286 498 44 87 179 184 361 +4850 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000469356.jpg 640 480 41 172 1 306 95 48 104 205 418 470 60 481 199 639 354 48 1 160 341 457 48 425 24 620 151 +4851 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000153300.jpg 640 501 41 369 357 487 489 42 365 302 396 361 43 245 245 269 331 44 580 217 639 333 44 79 300 99 331 55 149 203 270 361 55 252 199 344 361 45 433 199 566 315 60 1 177 639 494 39 481 377 639 491 43 589 208 639 308 0 108 0 490 269 0 443 1 637 185 0 1 3 140 183 +4852 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000032625.jpg 612 612 41 392 177 505 412 42 351 433 611 528 45 24 390 228 547 73 426 78 453 118 73 397 5 462 44 73 378 145 398 175 60 2 163 611 601 73 352 143 374 176 +4853 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000292032.jpg 612 612 41 357 6 606 208 45 71 200 603 602 50 404 306 558 569 +4854 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000117527.jpg 640 424 41 271 304 310 384 0 569 109 639 197 0 379 145 639 418 0 170 125 281 311 0 111 132 247 416 0 0 136 220 418 0 0 101 40 182 0 99 88 153 148 0 159 96 208 187 0 556 73 590 102 0 100 49 142 82 0 166 47 208 86 41 338 367 379 423 41 308 218 341 256 45 303 254 369 297 0 421 107 521 291 41 282 205 309 288 41 332 312 403 402 60 220 110 467 417 0 386 99 441 217 41 344 216 378 271 0 10 16 605 260 +4855 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000152340.jpg 640 480 41 45 165 172 336 43 213 311 310 473 54 218 250 288 336 41 402 80 503 238 41 281 169 345 246 41 154 75 232 192 41 313 251 419 414 42 299 0 344 97 44 369 204 394 253 48 437 244 553 349 0 0 3 418 430 43 406 206 422 275 43 380 79 409 106 44 170 258 194 285 54 442 246 558 354 60 49 65 603 472 +4856 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207898.jpg 640 480 41 575 31 639 202 41 465 2 562 82 42 450 151 638 416 43 484 124 639 326 49 70 149 173 249 49 111 113 194 173 60 2 2 639 472 +4857 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000068745.jpg 640 378 41 311 286 369 371 41 174 154 250 231 41 75 152 122 204 41 18 105 62 149 41 396 349 466 377 42 211 201 277 274 42 186 198 266 253 44 64 183 177 216 77 385 26 637 375 77 200 87 306 191 77 84 86 165 194 73 353 101 448 270 43 190 217 264 267 43 105 202 178 237 43 80 200 177 236 43 84 197 177 227 43 61 187 142 231 44 157 64 190 113 44 148 74 174 111 28 16 8 367 365 +4858 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000255578.jpg 612 612 42 61 235 364 292 48 283 246 438 370 +4859 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000288313.jpg 640 480 42 0 83 195 407 43 67 79 131 296 44 367 231 603 461 44 453 119 639 177 42 538 139 586 213 43 560 130 617 203 45 297 3 572 180 60 0 0 638 478 41 170 0 287 54 +4860 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000346645.jpg 640 640 44 162 58 608 118 45 25 41 301 165 45 218 30 540 155 42 543 57 577 68 60 26 31 618 623 +4861 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000150843.jpg 426 640 45 259 333 386 404 69 58 276 411 585 0 0 38 282 630 +4862 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054959.jpg 640 193 45 454 54 517 83 68 433 71 633 190 68 222 71 434 188 68 1 53 240 185 +4863 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000216710.jpg 640 361 45 192 6 321 113 45 135 188 570 354 60 0 71 534 357 55 302 97 366 146 55 392 114 470 186 +4864 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000077178.jpg 640 640 45 190 286 435 520 75 350 212 588 359 75 184 43 327 219 75 369 71 507 246 75 82 217 207 389 +4865 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000349480.jpg 640 450 46 304 346 362 379 46 305 344 385 408 49 286 342 317 376 77 32 125 260 374 77 160 1 624 379 26 202 77 287 212 39 329 312 354 346 41 247 326 280 349 45 323 161 377 188 45 199 317 257 352 47 292 386 313 404 55 210 317 246 345 55 337 154 370 180 58 0 0 196 130 41 272 243 309 270 47 265 338 293 368 58 417 381 501 449 +4866 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000402867.jpg 640 480 52 193 29 418 195 52 144 1 368 151 +4867 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000557896.jpg 612 612 60 12 375 601 604 55 342 349 432 382 0 377 47 605 441 69 12 209 348 457 +4868 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000321118.jpg 640 426 63 87 3 551 419 64 517 267 638 326 +4869 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000553664.jpg 640 414 63 270 139 555 323 64 428 246 497 261 73 217 58 311 135 73 460 65 482 86 73 483 72 499 129 73 542 63 598 128 66 401 274 484 310 73 495 1 510 50 73 408 75 419 129 67 490 325 593 354 73 515 144 531 206 73 509 70 513 128 73 258 0 260 52 73 443 156 452 206 73 467 0 474 50 73 556 1 562 49 73 541 147 546 205 73 97 0 639 292 +4870 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000531563.jpg 500 375 68 133 22 228 103 69 98 122 242 365 69 243 51 428 302 +4871 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000476120.jpg 640 427 68 2 30 368 419 +4872 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000577584.jpg 418 640 68 139 156 350 341 45 63 277 220 357 +4873 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269866.jpg 640 427 68 110 50 530 391 +4874 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000232287.jpg 640 480 68 183 127 331 241 60 1 398 639 475 69 334 258 639 467 +4875 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000297269.jpg 640 425 68 307 215 501 361 39 246 273 276 320 +4876 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000020268.jpg 640 480 68 30 137 583 410 41 323 244 398 305 75 432 17 535 129 +4877 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000478490.jpg 426 640 68 0 315 37 360 45 95 160 117 172 45 83 161 96 173 71 160 355 253 369 74 229 34 265 72 45 381 325 425 369 69 323 385 425 563 +4878 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000199203.jpg 426 640 68 225 190 417 406 69 92 463 225 519 69 224 186 423 631 +4879 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000225312.jpg 640 321 68 283 46 618 269 +4880 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000308512.jpg 640 640 69 38 82 604 400 53 209 250 411 274 +4881 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000087638.jpg 500 375 73 1 1 498 354 67 336 63 373 169 +4882 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000526418.jpg 427 640 73 101 258 303 371 77 145 337 347 617 73 33 259 101 279 73 64 290 99 309 73 32 267 103 303 73 87 337 107 427 73 68 299 92 314 73 69 303 108 328 73 30 284 61 494 56 139 374 218 448 73 0 371 49 529 73 92 346 118 435 73 66 345 93 440 +4883 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000022563.jpg 426 640 75 111 338 279 572 +4884 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000250370.jpg 480 640 75 222 420 346 619 58 20 3 433 625 +4885 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000326308.jpg 375 500 75 119 233 280 405 +4886 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000272728.jpg 584 640 75 195 430 366 627 56 0 326 100 437 58 39 1 559 639 60 0 348 584 639 +4887 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000319687.jpg 640 457 75 177 120 323 423 75 406 55 574 424 13 0 0 640 457 +4888 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000444495.jpg 480 640 75 151 357 348 631 56 437 312 479 507 58 1 26 479 626 +4889 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341725.jpg 640 493 75 73 289 217 476 +4890 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000213224.jpg 427 640 75 205 324 321 510 75 60 374 120 534 60 0 414 427 638 56 0 371 46 437 56 386 349 426 458 56 0 432 50 462 +4891 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000269867.jpg 274 500 75 43 268 104 446 58 14 129 107 457 +4892 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000426852.jpg 640 428 75 302 137 400 378 75 442 262 532 395 75 387 263 450 348 +4893 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000004079.jpg 425 640 75 223 323 300 599 +4894 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000483849.jpg 427 640 75 166 364 325 545 +4895 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000561698.jpg 427 640 75 131 411 256 552 58 0 122 407 551 +4896 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000202138.jpg 439 500 75 167 283 282 480 +4897 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000568555.jpg 640 480 75 552 123 639 355 75 129 151 211 315 75 77 163 131 289 75 223 184 249 242 75 280 186 306 239 75 345 190 363 237 75 406 187 425 237 75 474 189 492 235 75 122 177 150 255 2 456 194 492 206 2 334 187 352 194 +4898 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000571550.jpg 640 639 75 236 293 402 528 57 2 283 639 456 60 1 425 636 628 +4899 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000506587.jpg 427 640 75 158 261 301 607 58 83 34 349 613 +4900 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000043542.jpg 500 480 75 153 334 261 473 58 9 27 481 473 +4901 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138397.jpg 640 480 75 226 90 292 261 75 559 371 639 472 75 119 46 168 181 75 234 321 282 457 45 407 236 557 320 75 0 211 44 365 75 115 395 209 431 75 322 427 370 479 +4902 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000159282.jpg 640 426 75 228 189 302 414 58 64 2 511 414 +4903 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016410.jpg 480 640 75 164 224 339 630 +4904 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000372718.jpg 640 638 75 260 396 398 629 +4905 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000550322.jpg 427 640 76 76 163 194 392 76 120 166 226 388 41 74 315 258 543 44 238 276 419 370 60 0 452 361 640 44 206 211 391 385 +4906 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000016928.jpg 427 640 76 142 37 346 549 +4907 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389056.jpg 640 480 76 7 125 631 423 +4908 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000116226.jpg 640 480 76 74 111 148 325 44 201 99 291 442 +4909 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000414122.jpg 612 612 76 19 259 540 351 76 19 186 508 303 76 20 144 323 257 76 26 138 195 229 76 22 96 237 154 76 20 77 143 120 +4910 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000080747.jpg 426 640 77 136 215 332 424 0 125 60 405 632 +4911 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000428867.jpg 500 333 77 87 108 218 299 77 151 122 234 270 77 205 129 276 225 77 228 54 301 181 56 480 150 497 218 60 2 148 432 327 56 423 132 436 148 +4912 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000207059.jpg 640 480 77 0 231 166 472 41 156 199 171 214 41 159 225 177 243 44 235 299 256 304 44 212 303 232 309 44 226 302 246 309 45 166 297 187 318 45 185 228 198 238 45 242 207 263 226 45 174 198 196 213 +4913 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000283261.jpg 640 481 77 1 70 287 468 59 0 209 640 480 77 452 118 635 300 +4914 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000141211.jpg 640 480 77 131 76 639 474 +4915 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000058522.jpg 640 391 77 252 130 345 200 +4916 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000138573.jpg 478 640 77 309 365 388 432 77 322 468 372 547 77 251 334 335 393 77 128 318 201 400 77 183 173 243 262 56 140 507 291 639 77 133 273 206 336 43 29 532 67 559 60 3 493 162 634 77 244 93 345 223 77 105 285 164 360 77 228 220 301 290 77 271 241 344 302 77 262 393 309 469 77 173 430 240 519 77 165 351 241 440 77 6 47 467 533 +4917 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000373440.jpg 500 375 77 55 238 142 343 77 1 273 39 373 73 459 348 499 374 77 183 360 247 374 73 457 203 499 314 73 449 201 475 315 77 129 240 221 340 77 207 241 287 342 77 281 238 366 340 77 347 236 436 341 +4918 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000132992.jpg 640 403 77 219 26 592 386 77 71 153 309 370 +4919 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000355263.jpg 640 480 77 326 143 412 303 77 405 141 510 339 +4920 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000084929.jpg 640 480 77 404 256 571 465 +4921 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000395531.jpg 500 375 77 112 47 330 323 13 0 235 500 370 24 52 128 196 279 +4922 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000362483.jpg 480 640 77 0 152 437 617 +4923 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000143644.jpg 500 333 77 0 23 346 328 +4924 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000221561.jpg 500 375 77 140 49 356 323 +4925 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000189436.jpg 480 640 77 2 56 380 614 60 1 415 479 633 27 80 240 324 372 62 349 123 421 181 62 82 108 154 178 +4926 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000564940.jpg 640 480 77 272 52 639 473 77 71 16 386 412 77 1 76 111 408 +4927 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000435205.jpg 500 333 77 10 95 202 293 0 27 0 496 329 +4928 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000281609.jpg 638 640 77 44 430 241 639 41 184 379 222 401 41 269 379 307 400 41 345 379 381 402 41 445 380 479 402 41 208 593 246 624 73 459 571 543 639 73 182 309 235 380 77 355 569 434 638 77 267 573 339 639 77 220 356 254 398 77 68 262 163 482 77 529 507 637 639 77 432 296 554 406 +4929 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000242972.jpg 640 428 77 203 136 459 354 +4930 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000050844.jpg 334 500 77 13 49 211 383 77 94 144 328 481 +4931 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000295059.jpg 500 375 77 50 194 131 269 77 142 178 210 230 77 203 191 276 271 77 276 193 330 286 77 207 242 273 283 77 312 223 347 251 77 295 246 379 289 77 339 208 391 280 77 201 67 293 199 77 285 258 317 279 77 155 223 206 260 77 129 230 157 264 +4932 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000174018.jpg 500 351 77 85 4 498 350 77 4 14 196 309 +4933 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000537802.jpg 640 480 77 35 16 583 412 77 550 18 639 225 +4934 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000123125.jpg 640 640 78 231 139 629 379 0 263 337 418 638 +4935 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000461681.jpg 640 480 41 499 280 571 374 46 455 233 533 313 69 0 301 148 479 +4936 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000135900.jpg 640 480 41 0 25 34 123 44 608 100 639 178 +4937 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000190432.jpg 640 424 45 490 343 637 419 76 228 156 512 316 +4938 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000446623.jpg 480 640 49 86 483 127 533 49 240 456 265 495 58 400 239 464 313 +4939 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000333303.jpg 640 427 72 8 318 639 426 +4940 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000169700.jpg 480 640 74 179 215 279 302 +4941 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000341778.jpg 480 640 75 0 304 155 569 75 133 248 271 466 75 0 143 130 338 75 256 335 437 595 75 246 133 383 344 75 352 222 479 452 75 61 0 174 159 75 244 19 366 167 75 126 60 255 255 75 383 70 479 238 75 390 1 479 104 75 1 41 94 167 +4942 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000482007.jpg 640 433 75 426 209 465 404 75 374 184 435 424 75 349 201 382 423 75 302 193 354 398 75 273 197 315 423 75 168 207 192 428 75 233 214 262 432 75 109 214 140 427 75 96 224 118 431 58 180 96 319 433 75 482 177 523 427 75 192 195 220 432 58 357 48 472 424 75 163 224 175 386 +4943 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000365094.jpg 640 480 77 385 122 507 296 77 203 97 338 357 77 522 103 639 390 +4944 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000102594.jpg 640 480 77 121 97 421 431 77 64 184 176 352 +4945 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000263425.jpg 640 428 0 183 100 283 216 0 389 38 483 185 +4946 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000487720.jpg 640 428 0 98 166 183 328 69 435 192 516 249 69 237 198 347 246 69 155 200 193 244 73 514 260 599 274 +4947 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000386134.jpg 612 612 50 171 295 589 568 +4948 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000343193.jpg 640 480 67 205 164 317 318 67 385 171 487 345 67 502 150 620 321 67 47 143 171 338 +4949 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000515176.jpg 417 500 72 164 58 368 463 +4950 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000360700.jpg 640 427 74 552 140 598 176 74 486 171 511 217 +4951 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000392004.jpg 375 500 75 64 207 254 453 +4952 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000054490.jpg 345 415 75 164 175 218 308 75 132 281 190 388 75 259 151 309 265 75 215 154 265 275 75 170 122 224 186 75 71 198 130 319 75 122 130 180 307 75 68 130 99 210 75 88 79 145 207 75 137 60 188 132 75 294 84 337 224 75 199 63 243 138 75 105 48 152 79 75 6 68 114 301 +4953 /opt/npu/dataset/coco/coco2014/val2014/COCO_val2014_000000389622.jpg 480 640 74 73 207 255 433 diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/yolo_anchors.txt b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/yolo_anchors.txt new file mode 100644 index 0000000..66212a8 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/data/yolo_anchors.txt @@ -0,0 +1 @@ +10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/backbone.png b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/backbone.png new file mode 100644 index 0000000..04fb0b5 Binary files /dev/null and b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/backbone.png differ diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/yolo_v3_architecture.png b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/yolo_v3_architecture.png new file mode 100644 index 0000000..896c8de Binary files /dev/null and b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/docs/yolo_v3_architecture.png differ diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.py new file mode 100644 index 0000000..bae6f5b --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.py @@ -0,0 +1,220 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import tensorflow as tf +import numpy as np +import argparse +import cv2 + +from utils.misc_utils import parse_anchors, read_class_names +from utils.nms_utils import gpu_nms, cpu_nms +from utils.plot_utils import get_color_table, plot_one_box +from utils.data_aug import letterbox_resize + +from model import yolov3 +from tqdm import trange +import json +import os,time + +# npu modified +from npu_bridge.estimator import npu_ops +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig +from npu_bridge.estimator.npu import util + +''' +coco weight from official checked + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.309 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.555 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.311 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.136 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.337 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.460 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.273 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.430 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.465 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.270 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.511 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.629 + +''' + +parser = argparse.ArgumentParser(description="YOLO-V3 test single image test procedure.") +parser.add_argument("--annotation_txt", type=str, default='../code/data/coco2014_minival.txt', + help="The path of the input image. Or annotation label txt.") +parser.add_argument("--anchor_path", type=str, default="../code/data/yolo_anchors.txt", + help="The path of the anchor txt file.") +parser.add_argument("--new_size", nargs='*', type=int, default=[416, 416], + help="Resize the input image with `new_size`, size format: [width, height]") +parser.add_argument("--max_test", type=int, default=-1, + help="max step for test") +parser.add_argument("--score_thresh", type=float, default=1e-3, + help="score_threshold for test") +parser.add_argument("--nms_thresh", type=float, default=0.5, + help="iou_threshold for test") +parser.add_argument("--max_boxes", type=int, default=100, + help="max_boxes for test") +parser.add_argument("--letterbox_resize", type=lambda x: (str(x).lower() == 'true'), default=True, + help="Whether to use the letterbox resize.") +parser.add_argument("--class_name_path", type=str, default="../code/data/coco.names", + help="The path of the class names.") +parser.add_argument("--restore_path", type=str, default="../code/data/darknet_weights/yolo3.ckpt", + # parser.add_argument("--restore_path", type=str, default="./training_s2/checkpoint_dir/model.ckpt-45800", + help="The path of the weights to restore.") +parser.add_argument("--save_img", type=bool, default=False, + help="whether to save detected-result image") +parser.add_argument("--save_json", type=bool, default=False, + help="whether to save detected-result cocolike json") +parser.add_argument("--save_json_path", type=str, default="../result/result.json", + help="The path of the result.json.") +args = parser.parse_args() + +args.anchors = parse_anchors(args.anchor_path) +args.classes = read_class_names(args.class_name_path) +args.num_class = len(args.classes) + +color_table = get_color_table(args.num_class) +cat_id_to_real_id = \ + {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, + 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 27: 25, 28: 26, 31: 27, 32: 28, 33: 29, 34: 30, + 35: 31, 36: 32, 37: 33, 38: 34, 39: 35, 40: 36, 41: 37, 42: 38, 43: 39, 44: 40, 46: 41, 47: 42, 48: 43, 49: 44, + 50: 45, 51: 46, 52: 47, 53: 48, 54: 49, 55: 50, 56: 51, 57: 52, 58: 53, 59: 54, 60: 55, 61: 56, 62: 57, 63: 58, + 64: 59, 65: 60, 67: 61, 70: 62, 72: 63, 73: 64, 74: 65, 75: 66, 76: 67, 77: 68, 78: 69, 79: 70, 80: 71, 81: 72, + 82: 73, 84: 74, 85: 75, 86: 76, 87: 77, 88: 78, 89: 79, 90: 80} +real_id_to_cat_id = {cat_id_to_real_id[i]: i for i in cat_id_to_real_id} + + +def get_default_dict(): + return {"image_id": -1, "category_id": -1, "bbox": [], "score": 0} + + +eval_path = args.annotation_txt +with open(eval_path, 'r')as f: + eval_file_list = f.read().split('\n')[:-1] + print(len(eval_file_list)) +eval_file_dict = {} +for i in eval_file_list: + tmp_list = i.split(' ') + idx = int(tmp_list[0]) + path = tmp_list[1] + w = float(tmp_list[2]) + h = float(tmp_list[3]) + bbox_len = len(tmp_list[4:]) // 5 + bbox = [] + for bbox_idx in range(bbox_len): + label, x1, y1, x2, y2 = tmp_list[4:][bbox_idx * 5:bbox_idx * 5 + 5] + bbox.append([label, x1, y1, x2, y2]) + eval_file_dict[idx] = { + 'path': path, + 'w': w, + 'h': h, + 'bbox': bbox + } + +config = tf.ConfigProto() +custom_op = config.graph_options.rewrite_options.custom_optimizers.add() +custom_op.name = "NpuOptimizer" +custom_op.parameter_map["use_off_line"].b = True # training on Ascend chips +config.graph_options.rewrite_options.remapping = RewriterConfig.OFF + +json_out = [] +with tf.Session(config=config) as sess: +# with tf.Session() as sess: + input_data = tf.placeholder(tf.float32, [1, args.new_size[1], args.new_size[0], 3], name='input_data') + yolo_model = yolov3(args.num_class, args.anchors) + with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(input_data, False) + pred_boxes, pred_confs, pred_probs = yolo_model.predict(pred_feature_maps) + + pred_scores = pred_confs * pred_probs + + # boxes, scores, labels = gpu_nms(pred_boxes, pred_scores, args.num_class, max_boxes=100, score_thresh=args.score_thresh, nms_thresh=0.5) + + saver = tf.train.Saver() + if args.restore_path.find('.ckpt') < 0 and args.restore_path.find('model-') < 0: + with open(os.path.join(args.restore_path, 'checkpoint'), 'r')as f: + tmp_checkpoint = f.readline() + tmp_checkpoint = tmp_checkpoint.replace('"', '').split(':')[1].strip() + args.restore_path = os.path.join(args.restore_path, tmp_checkpoint) + print('tmp_checkpoint: ', tmp_checkpoint) + # input() + + saver.restore(sess, args.restore_path) + + if args.max_test > 0: + test_len = min(args.max_test, len(eval_file_dict.keys())) + else: + test_len = len(eval_file_dict.keys()) + for test_idx in trange(test_len): + img_path = eval_file_dict[test_idx]['path'] + img_ori = cv2.imread(img_path) + if args.letterbox_resize: + img, resize_ratio, dw, dh = letterbox_resize(img_ori, args.new_size[0], args.new_size[1]) + else: + height_ori, width_ori = img_ori.shape[:2] + img = cv2.resize(img_ori, tuple(args.new_size)) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = np.asarray(img, np.float32) + img = img[np.newaxis, :] / 255. + + # boxes_, scores_, labels_ = sess.run([boxes, scores, labels], feed_dict={input_data: img}) + # print('bbox: ',boxes_) + t = time.time() + boxes_, scores_ = sess.run([pred_boxes, pred_scores], feed_dict={input_data: img}) + # print("FPS: ", 1/(time.time() - t)) + boxes_, scores_, labels_ = cpu_nms(boxes_, scores_, args.num_class, args.max_boxes, args.score_thresh, args.nms_thresh) + # print('bbox: ', boxes_) + + # try: + # boxes_[:, [0, 2]] = (boxes_[:, [0, 2]] - dw) / resize_ratio + # except: + # print("boxes_: ", boxes_) + # continue + + # print("boxes_: ", boxes_) + # rescale the coordinates to the original image + if args.letterbox_resize: + boxes_[:, [0, 2]] = (boxes_[:, [0, 2]] - dw) / resize_ratio + boxes_[:, [1, 3]] = (boxes_[:, [1, 3]] - dh) / resize_ratio + else: + boxes_[:, [0, 2]] *= (width_ori / float(args.new_size[0])) + boxes_[:, [1, 3]] *= (height_ori / float(args.new_size[1])) + + if args.save_img: + # print("box coords:") + # print(boxes_) + # print('*' * 30) + # print("scores:") + # print(scores_) + # print('*' * 30) + # print("labels:") + # print(labels_) + for i in range(len(boxes_)): + x0, y0, x1, y1 = boxes_[i] + plot_one_box(img_ori, [x0, y0, x1, y1], + label=args.classes[labels_[i]] + ', {:.2f}%'.format(scores_[i] * 100), + color=color_table[labels_[i]]) + cv2.imwrite('tmp/%d_detection_result.jpg' % test_idx, img_ori) + print('%d done' % test_idx) + + if args.save_json: + for i in range(len(boxes_)): + x0, y0, x1, y1 = boxes_[i] + bw = x1 - x0 + bh = y1 - y0 + s = scores_[i] + c = labels_[i] + t_dict = get_default_dict() + t_dict['image_id'] = int(img_path.split('/')[-1].split('.')[0].split('_')[-1]) + t_dict['category_id'] = real_id_to_cat_id[int(c) + 1] + t_dict['bbox'] = [int(i) for i in [x0, y0, bw, bh]] + t_dict['score'] = float(s) + json_out.append(t_dict) + +if args.save_json: + with open(args.save_json_path, 'w')as f: + json.dump(json_out, f) + print('output json saved to: ', args.save_json_path) + eval_coco = os.path.realpath(__file__ + "/../eval_coco.py") + os.system('python3.7 %s %s' % (eval_coco, args.save_json_path)) diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.sh new file mode 100644 index 0000000..fae22af --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval.sh @@ -0,0 +1,61 @@ + +#export CUDA_VISIBLE_DEVICES='' +#export CUDA_VISIBLE_DEVICES=7 + + + +# setting main path +MAIN_PATH=$(dirname $(readlink -f $0)) + +## set env +#export PYTHONPATH=/usr/local/Ascend/ops/op_impl/built-in/ai_core/tbe/:$MAIN_PATH/../../../ +#export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu +#PATH=$PATH:$HOME/bin +#export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin:$PATH +#export ASCEND_OPP_PATH=/usr/local/Ascend/opp + +# set env +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export DDK_VERSION_FLAG=1.60.T49.0.B201 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 + +export JOB_ID=10087 +export FUSION_TENSOR_SIZE=1000000000 +#export SLOG_PRINT_TO_STDOUT=1 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 + + + +for((RANK_ID=0;RANK_ID<8;RANK_ID++)); +do + +export RANK_ID=$RANK_ID +export RANK_SIZE=1 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[debug]\" --device "$RANK_ID + +RESTORE_PATH=./training/t1/D$RANK_ID/training/ + +nohup python3.7 eval.py \ +--save_json True \ +--score_thresh 0.0001 \ +--nms_thresh 0.55 \ +--max_boxes 100 \ +--restore_path $RESTORE_PATH \ +--max_test 10000 \ +--save_json_path eval_res_D$RANK_ID.json > eval_$RANK_ID.out & + + +done + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval_coco.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval_coco.py new file mode 100644 index 0000000..0f5d27c --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/eval_coco.py @@ -0,0 +1,57 @@ +#-*- coding:utf-8 -*- +# import matplotlib.pyplot as plt +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval +import numpy as np +import pylab,json +import sys +# pylab.rcParams['figure.figsize'] = (10.0, 8.0) + +def get_img_id(file_name): + ls = [] + myset = [] + annos = json.load(open(file_name, 'r')) + for anno in annos: + ls.append(anno['image_id']) + myset = {}.fromkeys(ls).keys() + return myset + + +''' + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.317 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.562 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.321 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.162 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.343 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.448 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.278 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.438 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.464 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.275 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.497 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.625 +''' + +if __name__ == '__main__': + annType = ['segm', 'bbox', 'keypoints']#set iouType to 'segm', 'bbox' or 'keypoints' + annType = annType[1] # specify type here + cocoGt_file = '/opt/npu/dataset/coco/coco2014/annotations/instances_val2014.json' + cocoGt = COCO(cocoGt_file)#取得标注集中coco json对象 + # print(list(cocoGt.anns.items())[:10]) + # print(cocoGt.anns[318219]) + # input() + # cocoDt_file = 'result.json' + cocoDt_file = sys.argv[1] + + imgIds = get_img_id(cocoDt_file) + # print(len(imgIds)) + cocoDt = cocoGt.loadRes(cocoDt_file)#取得结果集中image json对象 + imgIds = sorted(imgIds)#按顺序排列coco标注集image_id + # print(imgIds) + # input() + # imgIds = imgIds[0:5000]#标注集中的image数据 + cocoEval = COCOeval(cocoGt, cocoDt, annType) + cocoEval.params.imgIds = imgIds#参数设置 + cocoEval.evaluate()#评价 + cocoEval.accumulate()#积累 + cocoEval.summarize()#总结 \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/get_kmeans.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/get_kmeans.py new file mode 100644 index 0000000..df4e443 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/get_kmeans.py @@ -0,0 +1,155 @@ +# coding: utf-8 +# This script is modified from https://github.com/lars76/kmeans-anchor-boxes + +from __future__ import division, print_function + +import numpy as np + +def iou(box, clusters): + """ + Calculates the Intersection over Union (IoU) between a box and k clusters. + param: + box: tuple or array, shifted to the origin (i. e. width and height) + clusters: numpy array of shape (k, 2) where k is the number of clusters + return: + numpy array of shape (k, 0) where k is the number of clusters + """ + x = np.minimum(clusters[:, 0], box[0]) + y = np.minimum(clusters[:, 1], box[1]) + if np.count_nonzero(x == 0) > 0 or np.count_nonzero(y == 0) > 0: + raise ValueError("Box has no area") + + intersection = x * y + box_area = box[0] * box[1] + cluster_area = clusters[:, 0] * clusters[:, 1] + + iou_ = np.true_divide(intersection, box_area + cluster_area - intersection + 1e-10) + # iou_ = intersection / (box_area + cluster_area - intersection + 1e-10) + + return iou_ + + +def avg_iou(boxes, clusters): + """ + Calculates the average Intersection over Union (IoU) between a numpy array of boxes and k clusters. + param: + boxes: numpy array of shape (r, 2), where r is the number of rows + clusters: numpy array of shape (k, 2) where k is the number of clusters + return: + average IoU as a single float + """ + return np.mean([np.max(iou(boxes[i], clusters)) for i in range(boxes.shape[0])]) + + +def translate_boxes(boxes): + """ + Translates all the boxes to the origin. + param: + boxes: numpy array of shape (r, 4) + return: + numpy array of shape (r, 2) + """ + new_boxes = boxes.copy() + for row in range(new_boxes.shape[0]): + new_boxes[row][2] = np.abs(new_boxes[row][2] - new_boxes[row][0]) + new_boxes[row][3] = np.abs(new_boxes[row][3] - new_boxes[row][1]) + return np.delete(new_boxes, [0, 1], axis=1) + + +def kmeans(boxes, k, dist=np.median): + """ + Calculates k-means clustering with the Intersection over Union (IoU) metric. + param: + boxes: numpy array of shape (r, 2), where r is the number of rows + k: number of clusters + dist: distance function + return: + numpy array of shape (k, 2) + """ + rows = boxes.shape[0] + + distances = np.empty((rows, k)) + last_clusters = np.zeros((rows,)) + + np.random.seed() + + # the Forgy method will fail if the whole array contains the same rows + clusters = boxes[np.random.choice(rows, k, replace=False)] + + while True: + for row in range(rows): + distances[row] = 1 - iou(boxes[row], clusters) + + nearest_clusters = np.argmin(distances, axis=1) + + if (last_clusters == nearest_clusters).all(): + break + + for cluster in range(k): + clusters[cluster] = dist(boxes[nearest_clusters == cluster], axis=0) + + last_clusters = nearest_clusters + + return clusters + + +def parse_anno(annotation_path, target_size=None): + anno = open(annotation_path, 'r') + result = [] + for line in anno: + s = line.strip().split(' ') + img_w = int(s[2]) + img_h = int(s[3]) + s = s[4:] + box_cnt = len(s) // 5 + for i in range(box_cnt): + x_min, y_min, x_max, y_max = float(s[i*5+1]), float(s[i*5+2]), float(s[i*5+3]), float(s[i*5+4]) + width = x_max - x_min + height = y_max - y_min + assert width > 0 + assert height > 0 + # use letterbox resize, i.e. keep the original aspect ratio + # get k-means anchors on the resized target image size + if target_size is not None: + resize_ratio = min(target_size[0] / img_w, target_size[1] / img_h) + width *= resize_ratio + height *= resize_ratio + result.append([width, height]) + # get k-means anchors on the original image size + else: + result.append([width, height]) + result = np.asarray(result) + return result + + +def get_kmeans(anno, cluster_num=9): + + anchors = kmeans(anno, cluster_num) + ave_iou = avg_iou(anno, anchors) + + anchors = anchors.astype('int').tolist() + + anchors = sorted(anchors, key=lambda x: x[0] * x[1]) + + return anchors, ave_iou + + +if __name__ == '__main__': + # target resize format: [width, height] + # if target_resize is speficied, the anchors are on the resized image scale + # if target_resize is set to None, the anchors are on the original image scale + target_size = [416, 416] + annotation_path = "train.txt" + anno_result = parse_anno(annotation_path, target_size=target_size) + anchors, ave_iou = get_kmeans(anno_result, 9) + + anchor_string = '' + for anchor in anchors: + anchor_string += '{},{}, '.format(anchor[0], anchor[1]) + anchor_string = anchor_string[:-2] + + print('anchors are:') + print(anchor_string) + print('the average iou is:') + print(ave_iou) + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/.res50_baseline.py.swp b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/.res50_baseline.py.swp new file mode 100644 index 0000000..bf8873f Binary files /dev/null and b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/.res50_baseline.py.swp differ diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/1p.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/1p.json new file mode 100644 index 0000000..1e322ef --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/1p.json @@ -0,0 +1,32 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "1", + "server_num": "1", + "group_name": "", + "instance_count": "1", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0" + ], + "para_plane_nic_num": "1", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/2p.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/2p.json new file mode 100644 index 0000000..d6f1855 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/2p.json @@ -0,0 +1,43 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "2", + "server_num": "1", + "group_name": "", + "instance_count": "2", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1" + ], + "para_plane_nic_num": "2", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/4p.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/4p.json new file mode 100644 index 0000000..e4d2f7f --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/4p.json @@ -0,0 +1,65 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "4", + "server_num": "1", + "group_name": "", + "instance_count": "4", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3" + ], + "para_plane_nic_num": "4", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/8p.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/8p.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/hccl_config/8p.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/args_voc.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/args_voc.py new file mode 100644 index 0000000..bff5821 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/args_voc.py @@ -0,0 +1,88 @@ +# coding: utf-8 +# This file contains the parameter used in train.py + +from __future__ import division, print_function + +from utils.misc_utils import parse_anchors, read_class_names +import math + +### Some paths +train_file = './data/my_data/train.txt' # The path of the training txt file. +val_file = './data/my_data/val.txt' # The path of the validation txt file. +restore_path = './data/darknet_weights/yolov3.ckpt' # The path of the weights to restore. +save_dir = './checkpoint/' # The directory of the weights to save. +log_dir = './data/logs/' # The directory to store the tensorboard log files. +progress_log_path = './data/progress.log' # The path to record the training progress. +anchor_path = './data/yolo_anchors.txt' # The path of the anchor txt file. +class_name_path = './data/voc.names' # The path of the class names. + +### Training releated numbers +batch_size = 6 +img_size = [416, 416] # Images will be resized to `img_size` and fed to the network, size format: [width, height] +letterbox_resize = False # Whether to use the letterbox resize, i.e., keep the original aspect ratio in the resized image. +total_epoches = 100 +train_evaluation_step = 100 # Evaluate on the training batch after some steps. +val_evaluation_epoch = 1 # Evaluate on the whole validation dataset after some steps. Set to None to evaluate every epoch. +save_epoch = 10 # Save the model after some epochs. +batch_norm_decay = 0.99 # decay in bn ops +weight_decay = 5e-4 # l2 weight decay +global_step = 0 # used when resuming training + +### tf.data parameters +num_threads = 10 # Number of threads for image processing used in tf.data pipeline. +prefetech_buffer = 5 # Prefetech_buffer used in tf.data pipeline. + +### Learning rate and optimizer +optimizer_name = 'momentum' # Chosen from [sgd, momentum, adam, rmsprop] +save_optimizer = False # Whether to save the optimizer parameters into the checkpoint file. +learning_rate_init = 1e-4 +lr_type = 'piecewise' # Chosen from [fixed, exponential, cosine_decay, cosine_decay_restart, piecewise] +lr_decay_epoch = 5 # Epochs after which learning rate decays. Int or float. Used when chosen `exponential` and `cosine_decay_restart` lr_type. +lr_decay_factor = 0.96 # The learning rate decay factor. Used when chosen `exponential` lr_type. +lr_lower_bound = 1e-6 # The minimum learning rate. +# piecewise params +pw_boundaries = [25, 40] # epoch based boundaries +pw_values = [learning_rate_init, 3e-5, 1e-4] + +### Load and finetune +# Choose the parts you want to restore the weights. List form. +# restore_include: None, restore_exclude: None => restore the whole model +# restore_include: None, restore_exclude: scope => restore the whole model except `scope` +# restore_include: scope1, restore_exclude: scope2 => if scope1 contains scope2, restore scope1 and not restore scope2 (scope1 - scope2) +# choise 1: only restore the darknet body +# restore_include = ['yolov3/darknet53_body'] +# restore_exclude = None +# choise 2: restore all layers except the last 3 conv2d layers in 3 scale +restore_include = None +restore_exclude = ['yolov3/yolov3_head/Conv_14', 'yolov3/yolov3_head/Conv_6', 'yolov3/yolov3_head/Conv_22'] +# Choose the parts you want to finetune. List form. +# Set to None to train the whole model. +update_part = None + +### other training strategies +multi_scale_train = True # Whether to apply multi-scale training strategy. Image size varies from [320, 320] to [640, 640] by default. +use_label_smooth = True # Whether to use class label smoothing strategy. +use_focal_loss = True # Whether to apply focal loss on the conf loss. +use_mix_up = True # Whether to use mix up data augmentation strategy. +use_warm_up = True # whether to use warm up strategy to prevent from gradient exploding. +warm_up_epoch = 3 # Warm up training epoches. Set to a larger value if gradient explodes. + +### some constants in validation +# nms +nms_threshold = 0.45 # iou threshold in nms operation +score_threshold = 0.01 # threshold of the probability of the classes in nms operation, i.e. score = pred_confs * pred_probs. set lower for higher recall. +nms_topk = 150 # keep at most nms_topk outputs after nms +# mAP eval +eval_threshold = 0.5 # the iou threshold applied in mAP evaluation +use_voc_07_metric = False # whether to use voc 2007 evaluation metric, i.e. the 11-point metric + +### parse some params +anchors = parse_anchors(anchor_path) +classes = read_class_names(class_name_path) +class_num = len(classes) +train_img_cnt = len(open(train_file, 'r').readlines()) +val_img_cnt = len(open(val_file, 'r').readlines()) +train_batch_num = int(math.ceil(float(train_img_cnt) / batch_size)) + +lr_decay_freq = int(train_batch_num * lr_decay_epoch) +pw_boundaries = [float(i) * train_batch_num + global_step for i in pw_boundaries] \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/eval_voc.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/eval_voc.py new file mode 100644 index 0000000..688bd0d --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/eval_voc.py @@ -0,0 +1,140 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import tensorflow as tf +import numpy as np +import argparse +from tqdm import trange + +from utils.data_utils import get_batch_data +from utils.misc_utils import parse_anchors, read_class_names, AverageMeter +from utils.eval_utils import evaluate_on_cpu, evaluate_on_gpu, get_preds_gpu, voc_eval, parse_gt_rec +from utils.nms_utils import gpu_nms + +from model import yolov3 + +################# +# ArgumentParser +################# +parser = argparse.ArgumentParser(description="YOLO-V3 eval procedure.") +# some paths +parser.add_argument("--eval_file", type=str, default="./data/my_data/val.txt", + help="The path of the validation or test txt file.") + +parser.add_argument("--restore_path", type=str, default="./data/checkpoint_whole_finetune_no_letterbox/best_model_Epoch_32_step_91046_mAP_0.8754_loss_2.2147_lr_3e-05", + help="The path of the weights to restore.") + +parser.add_argument("--anchor_path", type=str, default="./data/yolo_anchors.txt", + help="The path of the anchor txt file.") + +parser.add_argument("--class_name_path", type=str, default="./data/voc.names", + help="The path of the class names.") + +# some numbers +parser.add_argument("--img_size", nargs='*', type=int, default=[416, 416], + help="Resize the input image to `img_size`, size format: [width, height]") + +parser.add_argument("--letterbox_resize", type=lambda x: (str(x).lower() == 'true'), default=False, + help="Whether to use the letterbox resize.") + +parser.add_argument("--num_threads", type=int, default=10, + help="Number of threads for image processing used in tf.data pipeline.") + +parser.add_argument("--prefetech_buffer", type=int, default=5, + help="Prefetech_buffer used in tf.data pipeline.") + +parser.add_argument("--nms_threshold", type=float, default=0.45, + help="IOU threshold in nms operation.") + +parser.add_argument("--score_threshold", type=float, default=0.01, + help="Threshold of the probability of the classes in nms operation.") + +parser.add_argument("--nms_topk", type=int, default=150, + help="Keep at most nms_topk outputs after nms.") + +parser.add_argument("--use_voc_07_metric", type=lambda x: (str(x).lower() == 'true'), default=False, + help="Whether to use the voc 2007 mAP metrics.") + +args = parser.parse_args() + +# args params +args.anchors = parse_anchors(args.anchor_path) +args.classes = read_class_names(args.class_name_path) +args.class_num = len(args.classes) +args.img_cnt = len(open(args.eval_file, 'r').readlines()) + +# setting placeholders +is_training = tf.placeholder(dtype=tf.bool, name="phase_train") +handle_flag = tf.placeholder(tf.string, [], name='iterator_handle_flag') +pred_boxes_flag = tf.placeholder(tf.float32, [1, None, None]) +pred_scores_flag = tf.placeholder(tf.float32, [1, None, None]) +gpu_nms_op = gpu_nms(pred_boxes_flag, pred_scores_flag, args.class_num, args.nms_topk, args.score_threshold, args.nms_threshold) + +################## +# tf.data pipeline +################## +val_dataset = tf.data.TextLineDataset(args.eval_file) +val_dataset = val_dataset.batch(1) +val_dataset = val_dataset.map( + lambda x: tf.py_func(get_batch_data, [x, args.class_num, args.img_size, args.anchors, 'val', False, False, args.letterbox_resize], [tf.int64, tf.float32, tf.float32, tf.float32, tf.float32]), + num_parallel_calls=args.num_threads +) +val_dataset.prefetch(args.prefetech_buffer) +iterator = val_dataset.make_one_shot_iterator() + +image_ids, image, y_true_13, y_true_26, y_true_52 = iterator.get_next() +image_ids.set_shape([None]) +y_true = [y_true_13, y_true_26, y_true_52] +image.set_shape([None, args.img_size[1], args.img_size[0], 3]) +for y in y_true: + y.set_shape([None, None, None, None, None]) + +################## +# Model definition +################## +yolo_model = yolov3(args.class_num, args.anchors) +with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(image, is_training=is_training) +loss = yolo_model.compute_loss(pred_feature_maps, y_true) +y_pred = yolo_model.predict(pred_feature_maps) + +saver_to_restore = tf.train.Saver() + +with tf.Session() as sess: + sess.run([tf.global_variables_initializer()]) + saver_to_restore.restore(sess, args.restore_path) + + print('\n----------- start to eval -----------\n') + + val_loss_total, val_loss_xy, val_loss_wh, val_loss_conf, val_loss_class = \ + AverageMeter(), AverageMeter(), AverageMeter(), AverageMeter(), AverageMeter() + val_preds = [] + + for j in trange(args.img_cnt): + __image_ids, __y_pred, __loss = sess.run([image_ids, y_pred, loss], feed_dict={is_training: False}) + pred_content = get_preds_gpu(sess, gpu_nms_op, pred_boxes_flag, pred_scores_flag, __image_ids, __y_pred) + + val_preds.extend(pred_content) + val_loss_total.update(__loss[0]) + val_loss_xy.update(__loss[1]) + val_loss_wh.update(__loss[2]) + val_loss_conf.update(__loss[3]) + val_loss_class.update(__loss[4]) + + rec_total, prec_total, ap_total = AverageMeter(), AverageMeter(), AverageMeter() + gt_dict = parse_gt_rec(args.eval_file, args.img_size, args.letterbox_resize) + print('mAP eval:') + for ii in range(args.class_num): + npos, nd, rec, prec, ap = voc_eval(gt_dict, val_preds, ii, iou_thres=0.5, use_07_metric=args.use_voc_07_metric) + rec_total.update(rec, npos) + prec_total.update(prec, nd) + ap_total.update(ap, 1) + print('Class {}: Recall: {:.4f}, Precision: {:.4f}, AP: {:.4f}'.format(ii, rec, prec, ap)) + + mAP = ap_total.average + print('final mAP: {:.4f}'.format(mAP)) + print("recall: {:.3f}, precision: {:.3f}".format(rec_total.average, prec_total.average)) + print("total_loss: {:.3f}, loss_xy: {:.3f}, loss_wh: {:.3f}, loss_conf: {:.3f}, loss_class: {:.3f}".format( + val_loss_total.average, val_loss_xy.average, val_loss_wh.average, val_loss_conf.average, val_loss_class.average + )) diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/train.txt b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/train.txt new file mode 100644 index 0000000..de46c33 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/train.txt @@ -0,0 +1,16551 @@ +0 /data/VOCdevkit/VOC2007/JPEGImages/000005.jpg 500 375 8 263 211 324 339 8 165 264 253 372 8 241 194 295 299 +1 /data/VOCdevkit/VOC2007/JPEGImages/000007.jpg 500 333 6 141 50 500 330 +2 /data/VOCdevkit/VOC2007/JPEGImages/000009.jpg 500 375 12 69 172 270 330 14 150 141 229 284 14 285 201 327 331 14 258 198 297 329 +3 /data/VOCdevkit/VOC2007/JPEGImages/000012.jpg 500 333 6 156 97 351 270 +4 /data/VOCdevkit/VOC2007/JPEGImages/000016.jpg 334 500 1 92 72 305 473 +5 /data/VOCdevkit/VOC2007/JPEGImages/000017.jpg 480 364 14 185 62 279 199 12 90 78 403 336 +6 /data/VOCdevkit/VOC2007/JPEGImages/000019.jpg 500 375 7 231 88 483 256 7 11 113 266 259 +7 /data/VOCdevkit/VOC2007/JPEGImages/000020.jpg 375 500 6 33 148 371 416 +8 /data/VOCdevkit/VOC2007/JPEGImages/000021.jpg 336 500 11 1 235 182 388 14 210 36 336 482 14 46 82 170 365 14 11 181 142 419 +9 /data/VOCdevkit/VOC2007/JPEGImages/000023.jpg 334 500 1 9 230 245 500 1 230 220 334 500 14 2 1 117 369 14 3 2 243 462 14 225 1 334 486 +10 /data/VOCdevkit/VOC2007/JPEGImages/000024.jpg 500 335 18 196 165 489 247 +11 /data/VOCdevkit/VOC2007/JPEGImages/000026.jpg 500 333 6 90 125 337 212 +12 /data/VOCdevkit/VOC2007/JPEGImages/000030.jpg 500 375 1 36 205 180 289 14 51 160 150 292 14 295 138 450 290 +13 /data/VOCdevkit/VOC2007/JPEGImages/000032.jpg 500 281 0 104 78 375 183 0 133 88 197 123 14 195 180 213 229 14 26 189 44 238 +14 /data/VOCdevkit/VOC2007/JPEGImages/000033.jpg 500 366 0 9 107 499 263 0 421 200 482 226 0 325 188 411 223 +15 /data/VOCdevkit/VOC2007/JPEGImages/000034.jpg 360 500 18 116 167 360 400 18 141 153 333 229 +16 /data/VOCdevkit/VOC2007/JPEGImages/000035.jpg 500 375 14 1 96 191 361 14 218 98 465 318 +17 /data/VOCdevkit/VOC2007/JPEGImages/000036.jpg 332 500 11 27 79 319 344 +18 /data/VOCdevkit/VOC2007/JPEGImages/000039.jpg 500 375 19 156 89 344 279 +19 /data/VOCdevkit/VOC2007/JPEGImages/000041.jpg 500 333 19 363 47 432 107 14 216 92 307 302 14 164 148 227 244 +20 /data/VOCdevkit/VOC2007/JPEGImages/000042.jpg 500 335 18 263 32 500 295 18 1 36 235 299 +21 /data/VOCdevkit/VOC2007/JPEGImages/000044.jpg 500 333 8 1 1 370 330 7 99 101 312 213 +22 /data/VOCdevkit/VOC2007/JPEGImages/000046.jpg 332 500 2 211 234 317 366 +23 /data/VOCdevkit/VOC2007/JPEGImages/000047.jpg 500 333 6 15 1 459 312 8 439 170 487 230 +24 /data/VOCdevkit/VOC2007/JPEGImages/000048.jpg 375 500 2 58 107 291 465 14 2 1 302 500 +25 /data/VOCdevkit/VOC2007/JPEGImages/000050.jpg 500 375 4 360 192 381 265 4 399 181 422 235 4 270 180 291 247 4 294 176 312 241 14 68 96 293 375 14 1 71 87 332 14 185 68 259 197 14 286 64 406 238 +26 /data/VOCdevkit/VOC2007/JPEGImages/000051.jpg 500 375 13 352 138 500 375 13 105 1 427 245 +27 /data/VOCdevkit/VOC2007/JPEGImages/000052.jpg 500 333 15 414 232 458 263 15 291 237 333 270 15 183 238 227 273 15 52 244 99 274 15 62 96 107 132 15 184 94 225 128 +28 /data/VOCdevkit/VOC2007/JPEGImages/000060.jpg 500 334 6 1 137 427 333 6 1 62 479 235 6 1 27 422 141 6 44 7 458 134 6 199 6 475 98 +29 /data/VOCdevkit/VOC2007/JPEGImages/000061.jpg 500 333 3 274 11 437 279 3 184 214 281 252 +30 /data/VOCdevkit/VOC2007/JPEGImages/000063.jpg 500 375 11 123 115 379 275 8 75 1 428 375 +31 /data/VOCdevkit/VOC2007/JPEGImages/000064.jpg 496 500 2 1 23 451 500 +32 /data/VOCdevkit/VOC2007/JPEGImages/000065.jpg 500 335 11 2 104 398 334 +33 /data/VOCdevkit/VOC2007/JPEGImages/000066.jpg 500 375 14 209 187 228 230 14 242 182 274 259 14 269 188 295 259 +34 /data/VOCdevkit/VOC2007/JPEGImages/000072.jpg 333 500 13 40 71 333 473 +35 /data/VOCdevkit/VOC2007/JPEGImages/000073.jpg 375 500 15 121 143 375 460 15 2 154 64 459 3 270 155 375 331 14 22 143 146 500 +36 /data/VOCdevkit/VOC2007/JPEGImages/000077.jpg 500 333 7 240 1 500 333 7 2 1 306 333 +37 /data/VOCdevkit/VOC2007/JPEGImages/000078.jpg 500 419 11 15 75 475 412 11 94 41 437 238 +38 /data/VOCdevkit/VOC2007/JPEGImages/000081.jpg 500 333 17 235 158 462 282 14 198 156 341 231 14 349 145 451 266 14 61 162 170 333 14 29 166 73 213 14 298 246 433 333 14 196 215 332 330 14 270 298 324 333 +39 /data/VOCdevkit/VOC2007/JPEGImages/000083.jpg 500 333 6 109 33 447 309 14 380 2 435 135 14 138 14 193 115 14 1 20 75 204 14 60 48 114 156 14 32 51 83 162 +40 /data/VOCdevkit/VOC2007/JPEGImages/000089.jpg 500 374 14 20 7 183 355 14 98 215 429 374 14 332 140 455 366 8 22 51 317 291 +41 /data/VOCdevkit/VOC2007/JPEGImages/000091.jpg 500 375 6 125 241 195 284 6 81 248 105 268 6 91 250 126 274 +42 /data/VOCdevkit/VOC2007/JPEGImages/000093.jpg 500 339 11 175 125 344 254 8 53 3 500 338 +43 /data/VOCdevkit/VOC2007/JPEGImages/000095.jpg 500 323 18 20 52 439 285 18 1 125 114 234 +44 /data/VOCdevkit/VOC2007/JPEGImages/000099.jpg 500 375 7 4 77 320 252 +45 /data/VOCdevkit/VOC2007/JPEGImages/000101.jpg 500 333 14 40 64 400 333 +46 /data/VOCdevkit/VOC2007/JPEGImages/000102.jpg 500 375 17 121 134 352 274 +47 /data/VOCdevkit/VOC2007/JPEGImages/000104.jpg 500 333 19 403 110 500 265 14 291 75 442 333 14 2 7 283 333 +48 /data/VOCdevkit/VOC2007/JPEGImages/000107.jpg 500 375 16 471 174 500 227 +49 /data/VOCdevkit/VOC2007/JPEGImages/000109.jpg 500 254 2 17 12 482 235 +50 /data/VOCdevkit/VOC2007/JPEGImages/000110.jpg 500 375 14 79 233 110 314 14 54 231 86 344 +51 /data/VOCdevkit/VOC2007/JPEGImages/000112.jpg 333 500 11 70 174 277 328 8 287 162 316 198 +52 /data/VOCdevkit/VOC2007/JPEGImages/000113.jpg 500 332 14 277 101 354 260 +53 /data/VOCdevkit/VOC2007/JPEGImages/000117.jpg 500 333 0 1 42 498 284 +54 /data/VOCdevkit/VOC2007/JPEGImages/000118.jpg 500 375 7 164 97 281 375 +55 /data/VOCdevkit/VOC2007/JPEGImages/000120.jpg 500 400 11 66 121 440 276 +56 /data/VOCdevkit/VOC2007/JPEGImages/000121.jpg 500 375 19 251 28 475 267 19 22 28 251 273 +57 /data/VOCdevkit/VOC2007/JPEGImages/000122.jpg 475 480 7 36 20 430 474 +58 /data/VOCdevkit/VOC2007/JPEGImages/000123.jpg 500 375 18 1 26 358 340 +59 /data/VOCdevkit/VOC2007/JPEGImages/000125.jpg 500 375 1 425 218 500 275 14 436 188 467 223 14 382 209 415 272 14 353 213 383 276 +60 /data/VOCdevkit/VOC2007/JPEGImages/000129.jpg 334 500 1 70 202 255 500 14 74 1 272 462 14 252 19 334 487 +61 /data/VOCdevkit/VOC2007/JPEGImages/000130.jpg 500 375 3 4 1 500 249 +62 /data/VOCdevkit/VOC2007/JPEGImages/000131.jpg 500 333 6 1 99 475 266 +63 /data/VOCdevkit/VOC2007/JPEGImages/000132.jpg 500 421 5 43 66 279 363 +64 /data/VOCdevkit/VOC2007/JPEGImages/000133.jpg 447 500 14 73 18 406 500 12 135 227 338 500 +65 /data/VOCdevkit/VOC2007/JPEGImages/000134.jpg 500 371 6 1 115 487 330 +66 /data/VOCdevkit/VOC2007/JPEGImages/000138.jpg 500 332 14 6 56 154 285 14 145 58 283 258 14 224 54 440 332 14 363 96 500 332 +67 /data/VOCdevkit/VOC2007/JPEGImages/000140.jpg 500 401 11 107 146 386 300 17 2 113 500 401 +68 /data/VOCdevkit/VOC2007/JPEGImages/000141.jpg 500 423 2 25 53 418 399 +69 /data/VOCdevkit/VOC2007/JPEGImages/000142.jpg 500 375 6 26 81 465 266 +70 /data/VOCdevkit/VOC2007/JPEGImages/000143.jpg 500 333 7 170 46 500 333 +71 /data/VOCdevkit/VOC2007/JPEGImages/000146.jpg 374 500 14 155 208 252 408 +72 /data/VOCdevkit/VOC2007/JPEGImages/000147.jpg 500 333 8 33 105 65 146 8 77 114 114 149 8 146 125 175 150 8 373 121 402 153 8 435 112 465 149 +73 /data/VOCdevkit/VOC2007/JPEGImages/000150.jpg 500 333 12 186 78 319 264 14 353 54 379 108 14 415 51 436 109 +74 /data/VOCdevkit/VOC2007/JPEGImages/000153.jpg 500 375 6 237 147 358 191 +75 /data/VOCdevkit/VOC2007/JPEGImages/000154.jpg 500 333 3 59 76 367 266 +76 /data/VOCdevkit/VOC2007/JPEGImages/000156.jpg 500 375 17 41 73 381 352 6 432 103 496 144 +77 /data/VOCdevkit/VOC2007/JPEGImages/000158.jpg 500 375 2 196 83 267 207 +78 /data/VOCdevkit/VOC2007/JPEGImages/000159.jpg 500 333 14 234 48 286 124 6 1 16 498 333 +79 /data/VOCdevkit/VOC2007/JPEGImages/000161.jpg 500 390 6 104 34 446 390 6 68 195 121 288 +80 /data/VOCdevkit/VOC2007/JPEGImages/000162.jpg 500 375 19 306 227 380 299 14 196 143 309 369 +81 /data/VOCdevkit/VOC2007/JPEGImages/000163.jpg 500 432 14 52 22 308 328 13 26 108 456 396 +82 /data/VOCdevkit/VOC2007/JPEGImages/000164.jpg 500 375 13 114 154 369 348 14 292 49 446 370 +83 /data/VOCdevkit/VOC2007/JPEGImages/000165.jpg 500 386 14 89 54 500 386 +84 /data/VOCdevkit/VOC2007/JPEGImages/000169.jpg 500 333 6 23 28 480 284 14 102 3 161 50 6 439 23 500 178 14 419 39 444 81 14 454 36 487 71 +85 /data/VOCdevkit/VOC2007/JPEGImages/000170.jpg 500 375 4 87 100 109 165 4 41 114 73 181 4 324 148 352 206 14 3 91 43 206 14 4 28 461 372 +86 /data/VOCdevkit/VOC2007/JPEGImages/000171.jpg 375 500 11 1 290 128 407 14 94 21 375 491 +87 /data/VOCdevkit/VOC2007/JPEGImages/000173.jpg 394 480 14 106 64 270 297 12 109 64 288 464 +88 /data/VOCdevkit/VOC2007/JPEGImages/000174.jpg 500 333 14 143 5 426 333 +89 /data/VOCdevkit/VOC2007/JPEGImages/000177.jpg 500 375 10 59 152 461 375 14 344 150 500 375 14 321 85 456 362 14 304 92 391 209 14 280 88 337 172 14 163 67 261 163 14 125 94 164 166 14 75 87 158 231 14 1 112 97 375 +90 /data/VOCdevkit/VOC2007/JPEGImages/000180.jpg 500 375 6 14 110 496 356 +91 /data/VOCdevkit/VOC2007/JPEGImages/000184.jpg 500 375 3 289 106 338 192 3 375 144 403 188 3 458 154 480 190 3 2 1 312 375 +92 /data/VOCdevkit/VOC2007/JPEGImages/000187.jpg 500 375 19 1 95 240 336 +93 /data/VOCdevkit/VOC2007/JPEGImages/000189.jpg 500 375 2 65 39 459 346 +94 /data/VOCdevkit/VOC2007/JPEGImages/000190.jpg 500 375 5 426 197 500 273 5 235 216 323 258 5 51 210 152 308 5 1 209 55 313 +95 /data/VOCdevkit/VOC2007/JPEGImages/000192.jpg 500 375 14 116 64 356 375 +96 /data/VOCdevkit/VOC2007/JPEGImages/000193.jpg 500 375 14 80 4 500 375 14 1 29 227 375 +97 /data/VOCdevkit/VOC2007/JPEGImages/000194.jpg 320 224 12 86 36 239 224 14 115 19 203 136 14 279 77 298 132 +98 /data/VOCdevkit/VOC2007/JPEGImages/000198.jpg 500 335 18 160 134 286 239 +99 /data/VOCdevkit/VOC2007/JPEGImages/000200.jpg 500 249 14 28 19 103 167 14 16 54 178 249 14 147 23 245 249 14 227 19 400 249 14 391 13 500 249 4 364 212 389 249 4 231 145 260 210 +100 /data/VOCdevkit/VOC2007/JPEGImages/000203.jpg 500 333 8 52 166 167 332 +101 /data/VOCdevkit/VOC2007/JPEGImages/000207.jpg 334 500 5 1 205 113 320 +102 /data/VOCdevkit/VOC2007/JPEGImages/000208.jpg 500 375 8 330 223 500 375 8 117 114 180 219 8 59 122 131 255 17 203 151 436 308 +103 /data/VOCdevkit/VOC2007/JPEGImages/000209.jpg 500 375 7 14 76 400 375 +104 /data/VOCdevkit/VOC2007/JPEGImages/000210.jpg 500 374 14 443 211 468 235 14 15 214 37 240 +105 /data/VOCdevkit/VOC2007/JPEGImages/000211.jpg 500 375 9 48 262 244 349 +106 /data/VOCdevkit/VOC2007/JPEGImages/000214.jpg 500 375 12 205 1 500 375 +107 /data/VOCdevkit/VOC2007/JPEGImages/000215.jpg 500 468 7 144 81 338 411 +108 /data/VOCdevkit/VOC2007/JPEGImages/000218.jpg 500 333 11 253 64 383 255 14 1 1 253 222 +109 /data/VOCdevkit/VOC2007/JPEGImages/000219.jpg 333 500 13 120 333 310 464 +110 /data/VOCdevkit/VOC2007/JPEGImages/000220.jpg 500 375 6 40 127 464 292 6 427 114 500 167 14 265 147 312 187 +111 /data/VOCdevkit/VOC2007/JPEGImages/000221.jpg 500 332 6 72 77 432 253 +112 /data/VOCdevkit/VOC2007/JPEGImages/000222.jpg 500 375 10 178 216 303 326 14 250 237 362 375 14 114 236 227 375 4 221 223 235 266 4 234 213 245 256 14 341 149 376 216 14 158 191 185 221 14 159 177 206 230 14 252 178 311 228 14 291 193 332 241 14 318 209 373 330 14 100 206 170 342 14 444 283 500 375 8 366 243 394 375 +113 /data/VOCdevkit/VOC2007/JPEGImages/000224.jpg 500 375 19 36 159 220 337 4 401 245 500 375 +114 /data/VOCdevkit/VOC2007/JPEGImages/000225.jpg 500 333 16 125 96 355 263 16 2 22 47 81 +115 /data/VOCdevkit/VOC2007/JPEGImages/000228.jpg 500 333 0 92 82 314 228 +116 /data/VOCdevkit/VOC2007/JPEGImages/000229.jpg 500 375 10 95 209 421 375 14 399 219 486 371 14 341 161 432 298 14 239 131 337 211 14 148 144 211 255 14 81 160 197 327 14 2 188 107 375 4 354 301 382 370 +117 /data/VOCdevkit/VOC2007/JPEGImages/000232.jpg 500 375 9 47 92 376 334 14 230 32 252 93 3 404 71 500 119 +118 /data/VOCdevkit/VOC2007/JPEGImages/000233.jpg 500 375 16 277 106 483 267 6 1 2 451 193 +119 /data/VOCdevkit/VOC2007/JPEGImages/000235.jpg 500 375 8 243 255 316 375 10 40 266 277 375 17 415 192 457 254 +120 /data/VOCdevkit/VOC2007/JPEGImages/000236.jpg 500 381 2 88 169 275 314 +121 /data/VOCdevkit/VOC2007/JPEGImages/000241.jpg 500 375 3 356 183 500 280 3 60 109 142 213 3 246 134 348 217 +122 /data/VOCdevkit/VOC2007/JPEGImages/000242.jpg 500 333 7 3 3 499 287 +123 /data/VOCdevkit/VOC2007/JPEGImages/000244.jpg 500 333 16 116 202 157 230 +124 /data/VOCdevkit/VOC2007/JPEGImages/000245.jpg 500 375 6 18 131 488 292 14 303 139 329 171 +125 /data/VOCdevkit/VOC2007/JPEGImages/000246.jpg 500 375 11 60 44 331 310 +126 /data/VOCdevkit/VOC2007/JPEGImages/000249.jpg 500 333 8 67 188 183 330 8 173 184 274 326 8 268 182 316 307 8 307 119 376 228 10 102 177 324 302 +127 /data/VOCdevkit/VOC2007/JPEGImages/000250.jpg 500 375 4 97 124 150 297 +128 /data/VOCdevkit/VOC2007/JPEGImages/000251.jpg 453 500 6 96 435 275 500 6 362 440 453 500 14 52 429 70 469 +129 /data/VOCdevkit/VOC2007/JPEGImages/000256.jpg 500 343 0 8 96 491 232 +130 /data/VOCdevkit/VOC2007/JPEGImages/000257.jpg 500 375 19 82 1 183 57 14 20 142 222 375 14 175 68 472 375 +131 /data/VOCdevkit/VOC2007/JPEGImages/000259.jpg 500 362 14 171 1 499 361 14 3 1 271 264 +132 /data/VOCdevkit/VOC2007/JPEGImages/000262.jpg 500 196 6 343 96 500 196 +133 /data/VOCdevkit/VOC2007/JPEGImages/000263.jpg 375 500 6 19 224 355 323 +134 /data/VOCdevkit/VOC2007/JPEGImages/000266.jpg 375 500 11 98 19 374 500 +135 /data/VOCdevkit/VOC2007/JPEGImages/000268.jpg 500 333 0 180 103 436 281 0 1 58 262 333 +136 /data/VOCdevkit/VOC2007/JPEGImages/000269.jpg 500 332 4 185 264 205 320 4 298 245 326 312 14 227 56 497 213 14 91 59 245 261 14 37 134 203 332 14 226 75 413 274 14 258 114 477 332 +137 /data/VOCdevkit/VOC2007/JPEGImages/000270.jpg 500 323 18 150 120 443 183 +138 /data/VOCdevkit/VOC2007/JPEGImages/000275.jpg 476 480 14 204 50 339 301 12 57 109 418 433 +139 /data/VOCdevkit/VOC2007/JPEGImages/000276.jpg 375 500 14 129 163 230 319 14 162 373 260 500 14 32 373 140 500 +140 /data/VOCdevkit/VOC2007/JPEGImages/000278.jpg 500 375 11 294 156 500 375 14 111 89 417 375 +141 /data/VOCdevkit/VOC2007/JPEGImages/000282.jpg 500 374 14 327 104 476 300 14 232 57 357 374 14 3 32 199 374 14 58 139 296 374 +142 /data/VOCdevkit/VOC2007/JPEGImages/000285.jpg 500 375 14 224 77 462 375 14 37 97 231 375 8 369 203 437 375 8 120 220 229 375 +143 /data/VOCdevkit/VOC2007/JPEGImages/000288.jpg 500 333 14 443 163 479 283 14 419 153 439 240 14 440 156 450 230 14 412 163 430 248 14 407 194 422 251 14 373 157 401 266 14 330 169 380 252 14 1 153 20 305 14 1 110 33 244 6 30 142 77 205 5 67 21 382 278 +144 /data/VOCdevkit/VOC2007/JPEGImages/000289.jpg 500 333 6 49 99 337 231 +145 /data/VOCdevkit/VOC2007/JPEGImages/000294.jpg 500 375 2 330 11 454 368 2 55 93 167 371 +146 /data/VOCdevkit/VOC2007/JPEGImages/000296.jpg 500 348 6 427 125 500 181 3 44 120 459 222 +147 /data/VOCdevkit/VOC2007/JPEGImages/000298.jpg 500 388 14 180 32 339 359 +148 /data/VOCdevkit/VOC2007/JPEGImages/000302.jpg 500 375 6 279 225 478 340 6 245 230 316 280 6 1 241 87 375 14 133 244 184 367 13 121 273 213 367 +149 /data/VOCdevkit/VOC2007/JPEGImages/000303.jpg 500 377 6 15 39 500 280 +150 /data/VOCdevkit/VOC2007/JPEGImages/000304.jpg 375 500 19 82 96 242 238 +151 /data/VOCdevkit/VOC2007/JPEGImages/000305.jpg 333 500 1 16 232 296 500 14 57 79 323 474 +152 /data/VOCdevkit/VOC2007/JPEGImages/000306.jpg 500 176 9 114 36 182 86 9 237 46 302 87 9 303 42 380 87 +153 /data/VOCdevkit/VOC2007/JPEGImages/000307.jpg 500 375 15 2 3 500 375 15 1 229 40 375 +154 /data/VOCdevkit/VOC2007/JPEGImages/000308.jpg 500 375 14 351 100 433 190 14 224 124 308 269 14 144 153 243 321 14 163 114 225 167 14 216 107 276 154 10 33 136 396 317 +155 /data/VOCdevkit/VOC2007/JPEGImages/000311.jpg 500 375 6 47 42 433 354 +156 /data/VOCdevkit/VOC2007/JPEGImages/000312.jpg 500 335 18 3 2 500 334 +157 /data/VOCdevkit/VOC2007/JPEGImages/000317.jpg 500 354 6 118 151 407 221 +158 /data/VOCdevkit/VOC2007/JPEGImages/000318.jpg 500 331 6 322 79 436 167 6 201 81 301 143 +159 /data/VOCdevkit/VOC2007/JPEGImages/000320.jpg 375 500 6 272 10 304 26 6 228 1 273 29 14 1 78 372 500 +160 /data/VOCdevkit/VOC2007/JPEGImages/000321.jpg 333 500 14 44 167 249 458 +161 /data/VOCdevkit/VOC2007/JPEGImages/000322.jpg 500 332 14 13 2 469 332 +162 /data/VOCdevkit/VOC2007/JPEGImages/000323.jpg 500 375 14 277 3 500 375 14 12 3 305 375 +163 /data/VOCdevkit/VOC2007/JPEGImages/000325.jpg 500 375 0 100 63 500 200 +164 /data/VOCdevkit/VOC2007/JPEGImages/000328.jpg 500 332 12 58 147 257 265 12 1 109 50 229 12 305 98 440 236 14 116 62 174 226 14 170 83 209 148 14 362 70 414 204 14 281 94 327 180 +165 /data/VOCdevkit/VOC2007/JPEGImages/000329.jpg 500 333 6 219 220 241 237 +166 /data/VOCdevkit/VOC2007/JPEGImages/000331.jpg 375 500 8 171 234 373 482 8 61 222 138 426 14 149 254 358 467 +167 /data/VOCdevkit/VOC2007/JPEGImages/000332.jpg 500 333 12 54 50 285 262 +168 /data/VOCdevkit/VOC2007/JPEGImages/000334.jpg 500 302 6 37 110 273 178 +169 /data/VOCdevkit/VOC2007/JPEGImages/000336.jpg 500 430 11 4 7 472 426 +170 /data/VOCdevkit/VOC2007/JPEGImages/000337.jpg 500 375 1 76 153 160 276 1 219 176 429 374 14 29 29 68 111 14 119 4 162 53 14 113 28 167 131 14 242 17 288 103 14 68 92 165 255 14 235 30 403 362 14 176 75 231 132 +171 /data/VOCdevkit/VOC2007/JPEGImages/000338.jpg 500 333 14 197 91 216 116 6 82 73 384 203 +172 /data/VOCdevkit/VOC2007/JPEGImages/000340.jpg 500 375 2 334 131 447 363 2 72 38 186 255 +173 /data/VOCdevkit/VOC2007/JPEGImages/000343.jpg 500 375 6 25 74 489 323 +174 /data/VOCdevkit/VOC2007/JPEGImages/000344.jpg 375 500 4 89 2 307 441 +175 /data/VOCdevkit/VOC2007/JPEGImages/000347.jpg 466 357 12 77 2 411 348 +176 /data/VOCdevkit/VOC2007/JPEGImages/000349.jpg 500 375 10 159 131 413 362 8 321 126 479 363 8 284 76 360 144 8 100 91 206 298 8 167 161 326 375 19 2 2 89 131 +177 /data/VOCdevkit/VOC2007/JPEGImages/000352.jpg 500 375 14 33 68 149 247 14 131 68 210 249 14 198 59 309 284 14 294 83 500 375 +178 /data/VOCdevkit/VOC2007/JPEGImages/000354.jpg 500 375 7 153 116 356 375 +179 /data/VOCdevkit/VOC2007/JPEGImages/000355.jpg 500 333 6 22 36 427 293 +180 /data/VOCdevkit/VOC2007/JPEGImages/000359.jpg 432 500 11 263 266 388 479 14 25 13 288 481 8 39 84 420 426 +181 /data/VOCdevkit/VOC2007/JPEGImages/000363.jpg 500 333 2 59 15 220 239 2 161 122 500 333 +182 /data/VOCdevkit/VOC2007/JPEGImages/000367.jpg 500 375 4 227 124 271 265 4 331 122 390 354 4 394 183 422 340 4 285 125 326 340 6 430 184 500 229 14 174 66 295 265 +183 /data/VOCdevkit/VOC2007/JPEGImages/000370.jpg 500 374 3 94 104 253 256 3 244 122 420 257 +184 /data/VOCdevkit/VOC2007/JPEGImages/000372.jpg 500 334 14 269 19 360 296 12 354 114 420 156 12 78 22 253 304 +185 /data/VOCdevkit/VOC2007/JPEGImages/000373.jpg 333 500 6 19 343 319 453 +186 /data/VOCdevkit/VOC2007/JPEGImages/000374.jpg 500 375 13 48 85 499 374 14 125 2 316 344 14 44 4 128 167 14 315 31 352 112 14 217 40 248 84 14 21 43 51 127 14 471 36 497 126 14 447 36 472 117 14 361 41 374 103 +187 /data/VOCdevkit/VOC2007/JPEGImages/000379.jpg 500 375 1 46 16 443 341 +188 /data/VOCdevkit/VOC2007/JPEGImages/000380.jpg 500 333 1 3 4 499 331 +189 /data/VOCdevkit/VOC2007/JPEGImages/000381.jpg 375 500 10 6 184 375 500 4 155 8 174 37 +190 /data/VOCdevkit/VOC2007/JPEGImages/000382.jpg 375 500 3 3 167 163 500 14 100 265 119 298 +191 /data/VOCdevkit/VOC2007/JPEGImages/000387.jpg 500 333 6 5 18 482 255 +192 /data/VOCdevkit/VOC2007/JPEGImages/000391.jpg 500 458 15 57 47 465 458 +193 /data/VOCdevkit/VOC2007/JPEGImages/000394.jpg 500 375 10 196 189 500 375 14 29 85 253 375 14 1 23 344 307 14 439 25 483 71 +194 /data/VOCdevkit/VOC2007/JPEGImages/000395.jpg 500 322 2 104 54 429 264 +195 /data/VOCdevkit/VOC2007/JPEGImages/000396.jpg 500 375 6 86 170 353 259 +196 /data/VOCdevkit/VOC2007/JPEGImages/000400.jpg 375 500 7 11 49 332 489 +197 /data/VOCdevkit/VOC2007/JPEGImages/000403.jpg 500 375 7 157 90 486 372 +198 /data/VOCdevkit/VOC2007/JPEGImages/000404.jpg 500 333 6 133 89 394 321 +199 /data/VOCdevkit/VOC2007/JPEGImages/000406.jpg 500 375 6 54 285 114 313 +200 /data/VOCdevkit/VOC2007/JPEGImages/000407.jpg 480 360 14 210 33 328 191 12 65 73 403 310 +201 /data/VOCdevkit/VOC2007/JPEGImages/000408.jpg 375 500 9 51 114 347 499 +202 /data/VOCdevkit/VOC2007/JPEGImages/000411.jpg 240 320 14 127 190 158 277 14 199 194 233 275 14 167 196 185 236 14 88 193 119 294 14 20 195 55 297 14 65 185 90 293 +203 /data/VOCdevkit/VOC2007/JPEGImages/000416.jpg 500 375 16 330 139 399 248 16 181 171 259 252 16 217 154 345 244 +204 /data/VOCdevkit/VOC2007/JPEGImages/000417.jpg 500 375 9 174 82 369 375 +205 /data/VOCdevkit/VOC2007/JPEGImages/000419.jpg 500 375 13 23 39 486 322 14 2 16 41 221 14 61 1 109 62 +206 /data/VOCdevkit/VOC2007/JPEGImages/000420.jpg 500 375 6 78 29 475 347 +207 /data/VOCdevkit/VOC2007/JPEGImages/000424.jpg 500 325 2 65 159 134 216 2 189 197 284 254 2 327 209 401 252 2 411 177 486 227 +208 /data/VOCdevkit/VOC2007/JPEGImages/000427.jpg 500 334 13 39 24 386 275 +209 /data/VOCdevkit/VOC2007/JPEGImages/000428.jpg 500 414 14 76 106 376 404 10 204 323 500 412 8 21 180 351 414 +210 /data/VOCdevkit/VOC2007/JPEGImages/000430.jpg 500 375 7 6 1 500 326 +211 /data/VOCdevkit/VOC2007/JPEGImages/000431.jpg 500 375 0 32 89 497 360 6 85 316 125 340 +212 /data/VOCdevkit/VOC2007/JPEGImages/000433.jpg 500 370 8 220 81 469 364 14 196 56 454 357 +213 /data/VOCdevkit/VOC2007/JPEGImages/000435.jpg 500 332 12 205 108 427 295 14 235 75 300 275 +214 /data/VOCdevkit/VOC2007/JPEGImages/000438.jpg 500 332 14 240 56 432 332 +215 /data/VOCdevkit/VOC2007/JPEGImages/000439.jpg 500 333 18 1 168 308 209 +216 /data/VOCdevkit/VOC2007/JPEGImages/000443.jpg 500 464 14 12 18 107 318 11 176 117 327 268 +217 /data/VOCdevkit/VOC2007/JPEGImages/000446.jpg 332 500 14 130 167 230 476 14 81 86 244 472 +218 /data/VOCdevkit/VOC2007/JPEGImages/000448.jpg 500 375 10 123 129 465 375 14 229 57 314 167 14 171 85 221 152 14 88 71 142 112 14 11 124 190 375 14 47 92 225 286 14 5 72 51 182 14 251 65 357 188 14 335 81 422 217 14 345 107 500 338 14 279 226 433 375 +219 /data/VOCdevkit/VOC2007/JPEGImages/000450.jpg 375 500 18 38 36 325 426 +220 /data/VOCdevkit/VOC2007/JPEGImages/000454.jpg 500 297 11 1 15 460 297 +221 /data/VOCdevkit/VOC2007/JPEGImages/000459.jpg 500 334 10 26 86 500 332 +222 /data/VOCdevkit/VOC2007/JPEGImages/000460.jpg 500 375 8 259 67 471 372 +223 /data/VOCdevkit/VOC2007/JPEGImages/000461.jpg 500 333 6 9 100 323 231 +224 /data/VOCdevkit/VOC2007/JPEGImages/000462.jpg 500 375 9 1 3 465 375 +225 /data/VOCdevkit/VOC2007/JPEGImages/000463.jpg 500 175 13 196 77 301 165 14 221 47 283 161 +226 /data/VOCdevkit/VOC2007/JPEGImages/000464.jpg 375 500 9 71 252 216 314 9 58 202 241 295 +227 /data/VOCdevkit/VOC2007/JPEGImages/000468.jpg 333 500 14 1 143 217 500 14 6 191 330 500 +228 /data/VOCdevkit/VOC2007/JPEGImages/000469.jpg 500 375 6 16 28 454 315 +229 /data/VOCdevkit/VOC2007/JPEGImages/000470.jpg 500 375 12 194 89 415 335 14 145 132 173 230 +230 /data/VOCdevkit/VOC2007/JPEGImages/000474.jpg 500 375 6 53 157 448 359 3 15 61 99 156 +231 /data/VOCdevkit/VOC2007/JPEGImages/000476.jpg 500 375 14 126 110 358 373 +232 /data/VOCdevkit/VOC2007/JPEGImages/000477.jpg 500 333 5 1 64 30 170 5 30 99 61 146 14 100 130 137 237 14 151 131 181 246 14 179 133 193 207 14 193 135 231 287 14 229 138 254 258 14 255 121 298 278 14 279 132 323 289 14 301 130 339 316 14 318 117 362 333 14 332 131 400 332 14 380 125 449 333 14 427 125 500 333 +233 /data/VOCdevkit/VOC2007/JPEGImages/000480.jpg 500 375 14 293 162 419 375 14 114 165 228 373 14 5 172 116 373 0 2 68 486 325 +234 /data/VOCdevkit/VOC2007/JPEGImages/000482.jpg 500 334 18 362 129 500 254 18 1 54 313 330 14 33 103 58 137 +235 /data/VOCdevkit/VOC2007/JPEGImages/000483.jpg 383 480 12 122 94 284 437 14 167 44 255 289 +236 /data/VOCdevkit/VOC2007/JPEGImages/000484.jpg 500 375 15 76 42 212 214 15 48 38 462 375 +237 /data/VOCdevkit/VOC2007/JPEGImages/000486.jpg 375 500 7 34 25 337 404 +238 /data/VOCdevkit/VOC2007/JPEGImages/000489.jpg 500 375 2 224 186 297 230 +239 /data/VOCdevkit/VOC2007/JPEGImages/000491.jpg 500 334 9 2 2 459 334 +240 /data/VOCdevkit/VOC2007/JPEGImages/000492.jpg 500 375 8 329 253 450 375 8 338 227 416 338 8 12 287 228 375 10 26 229 348 375 +241 /data/VOCdevkit/VOC2007/JPEGImages/000494.jpg 375 500 6 1 58 369 458 +242 /data/VOCdevkit/VOC2007/JPEGImages/000496.jpg 500 375 8 419 210 482 319 +243 /data/VOCdevkit/VOC2007/JPEGImages/000498.jpg 326 500 4 6 5 176 203 14 114 256 201 496 +244 /data/VOCdevkit/VOC2007/JPEGImages/000499.jpg 500 375 14 230 68 374 291 13 140 138 429 322 +245 /data/VOCdevkit/VOC2007/JPEGImages/000500.jpg 500 375 1 294 177 436 375 14 88 51 218 375 14 288 72 321 135 14 231 71 253 135 14 200 85 221 119 14 97 75 123 114 14 76 74 98 107 +246 /data/VOCdevkit/VOC2007/JPEGImages/000501.jpg 389 500 11 22 22 349 492 +247 /data/VOCdevkit/VOC2007/JPEGImages/000503.jpg 500 375 17 373 142 500 374 17 14 146 137 361 +248 /data/VOCdevkit/VOC2007/JPEGImages/000508.jpg 500 375 2 435 18 500 169 2 247 139 412 375 2 164 47 326 231 2 19 100 156 327 2 155 127 288 329 +249 /data/VOCdevkit/VOC2007/JPEGImages/000509.jpg 500 375 6 1 2 468 375 +250 /data/VOCdevkit/VOC2007/JPEGImages/000513.jpg 500 333 3 162 127 290 190 +251 /data/VOCdevkit/VOC2007/JPEGImages/000514.jpg 500 375 0 36 1 500 374 +252 /data/VOCdevkit/VOC2007/JPEGImages/000515.jpg 500 375 6 64 164 151 210 6 147 167 186 200 +253 /data/VOCdevkit/VOC2007/JPEGImages/000516.jpg 500 375 7 213 91 500 245 14 1 9 500 375 +254 /data/VOCdevkit/VOC2007/JPEGImages/000518.jpg 500 333 14 1 191 21 252 5 19 76 478 311 +255 /data/VOCdevkit/VOC2007/JPEGImages/000519.jpg 500 375 3 215 114 326 248 3 380 192 500 238 3 13 124 157 249 +256 /data/VOCdevkit/VOC2007/JPEGImages/000520.jpg 334 500 14 74 79 334 451 +257 /data/VOCdevkit/VOC2007/JPEGImages/000522.jpg 500 375 6 36 128 434 271 +258 /data/VOCdevkit/VOC2007/JPEGImages/000523.jpg 375 500 14 145 103 209 256 14 212 187 304 417 14 343 228 361 255 12 45 199 362 408 +259 /data/VOCdevkit/VOC2007/JPEGImages/000524.jpg 500 322 12 181 126 362 287 14 252 78 312 238 +260 /data/VOCdevkit/VOC2007/JPEGImages/000525.jpg 500 331 13 97 159 218 226 14 443 116 500 217 14 104 113 169 219 +261 /data/VOCdevkit/VOC2007/JPEGImages/000526.jpg 500 333 14 189 88 276 316 14 259 73 440 320 14 376 85 443 304 8 421 185 488 306 +262 /data/VOCdevkit/VOC2007/JPEGImages/000528.jpg 500 375 7 124 68 319 310 +263 /data/VOCdevkit/VOC2007/JPEGImages/000530.jpg 332 500 14 1 113 183 408 14 61 111 324 476 14 159 61 217 168 17 37 171 332 471 +264 /data/VOCdevkit/VOC2007/JPEGImages/000531.jpg 500 375 14 27 42 205 375 14 150 31 362 373 14 366 57 500 311 4 369 163 429 333 4 229 178 281 286 +265 /data/VOCdevkit/VOC2007/JPEGImages/000535.jpg 500 374 1 194 142 352 256 1 2 142 121 269 14 206 55 316 239 14 1 67 71 247 14 130 92 171 207 +266 /data/VOCdevkit/VOC2007/JPEGImages/000537.jpg 500 400 11 111 12 396 400 +267 /data/VOCdevkit/VOC2007/JPEGImages/000540.jpg 500 335 18 135 93 321 298 +268 /data/VOCdevkit/VOC2007/JPEGImages/000541.jpg 500 333 6 259 194 335 219 +269 /data/VOCdevkit/VOC2007/JPEGImages/000543.jpg 500 375 6 22 86 433 344 6 23 96 91 146 6 298 87 500 243 +270 /data/VOCdevkit/VOC2007/JPEGImages/000544.jpg 500 333 7 286 93 491 229 7 1 66 307 326 +271 /data/VOCdevkit/VOC2007/JPEGImages/000545.jpg 375 500 14 148 146 269 500 14 287 173 330 250 14 315 172 336 249 14 144 174 171 244 14 123 174 136 200 14 50 174 63 206 +272 /data/VOCdevkit/VOC2007/JPEGImages/000549.jpg 375 500 7 1 49 341 499 +273 /data/VOCdevkit/VOC2007/JPEGImages/000550.jpg 500 375 10 102 213 473 375 8 380 118 443 174 8 150 128 233 229 +274 /data/VOCdevkit/VOC2007/JPEGImages/000552.jpg 500 331 0 4 122 498 258 0 98 75 426 167 +275 /data/VOCdevkit/VOC2007/JPEGImages/000554.jpg 500 375 14 118 77 260 304 17 2 189 500 375 6 275 67 368 101 6 316 77 436 117 6 266 95 397 142 6 91 73 179 111 +276 /data/VOCdevkit/VOC2007/JPEGImages/000555.jpg 500 375 17 2 111 262 299 14 266 63 332 181 14 160 179 422 374 14 1 174 186 374 14 61 90 213 255 14 157 79 261 217 8 270 98 339 188 8 422 116 500 224 14 380 92 499 217 +277 /data/VOCdevkit/VOC2007/JPEGImages/000559.jpg 500 370 4 36 250 79 354 19 160 26 371 241 +278 /data/VOCdevkit/VOC2007/JPEGImages/000563.jpg 500 375 3 164 165 450 210 +279 /data/VOCdevkit/VOC2007/JPEGImages/000564.jpg 500 333 10 86 150 500 333 4 43 106 58 147 4 6 103 19 142 8 366 149 479 333 8 231 163 392 333 8 1 165 162 333 +280 /data/VOCdevkit/VOC2007/JPEGImages/000565.jpg 500 375 1 56 92 422 374 +281 /data/VOCdevkit/VOC2007/JPEGImages/000577.jpg 500 333 12 1 1 479 333 +282 /data/VOCdevkit/VOC2007/JPEGImages/000579.jpg 500 332 6 263 159 309 186 6 2 139 156 225 13 318 163 419 296 14 315 123 389 259 14 333 126 415 271 +283 /data/VOCdevkit/VOC2007/JPEGImages/000581.jpg 500 332 16 140 184 272 292 +284 /data/VOCdevkit/VOC2007/JPEGImages/000582.jpg 375 500 11 1 1 373 411 +285 /data/VOCdevkit/VOC2007/JPEGImages/000583.jpg 500 276 13 13 87 490 248 +286 /data/VOCdevkit/VOC2007/JPEGImages/000588.jpg 500 375 16 264 292 320 337 16 245 275 286 313 16 264 263 291 289 16 309 264 334 302 16 162 283 187 316 16 142 268 173 291 16 1 288 21 318 +287 /data/VOCdevkit/VOC2007/JPEGImages/000589.jpg 500 375 14 73 1 315 375 14 54 127 97 268 14 1 118 33 300 +288 /data/VOCdevkit/VOC2007/JPEGImages/000590.jpg 500 337 6 199 109 500 336 +289 /data/VOCdevkit/VOC2007/JPEGImages/000591.jpg 500 333 14 2 192 32 265 14 20 185 68 250 14 48 190 76 252 14 75 191 100 280 14 108 179 143 250 14 473 199 489 234 8 174 197 197 238 8 153 193 180 239 8 227 195 245 234 10 188 202 220 238 +290 /data/VOCdevkit/VOC2007/JPEGImages/000592.jpg 500 375 8 341 276 433 375 17 196 173 384 290 15 129 151 203 218 +291 /data/VOCdevkit/VOC2007/JPEGImages/000597.jpg 500 375 14 310 163 356 220 14 459 168 497 208 14 386 177 465 314 8 230 211 274 270 8 302 242 370 320 8 404 234 468 308 8 36 225 95 304 19 195 181 235 212 19 112 192 139 238 +292 /data/VOCdevkit/VOC2007/JPEGImages/000598.jpg 500 344 19 291 230 419 344 8 173 201 259 315 19 87 146 154 193 +293 /data/VOCdevkit/VOC2007/JPEGImages/000599.jpg 500 375 8 30 209 243 374 17 147 159 399 298 +294 /data/VOCdevkit/VOC2007/JPEGImages/000601.jpg 500 348 15 300 1 500 168 15 168 34 420 190 15 1 57 450 348 +295 /data/VOCdevkit/VOC2007/JPEGImages/000605.jpg 500 375 6 321 175 386 192 +296 /data/VOCdevkit/VOC2007/JPEGImages/000608.jpg 500 375 3 139 14 220 142 3 12 110 420 286 +297 /data/VOCdevkit/VOC2007/JPEGImages/000609.jpg 500 375 11 16 134 460 275 +298 /data/VOCdevkit/VOC2007/JPEGImages/000610.jpg 500 335 0 50 83 500 285 +299 /data/VOCdevkit/VOC2007/JPEGImages/000612.jpg 375 500 14 158 144 375 500 14 1 110 195 500 18 1 1 374 213 +300 /data/VOCdevkit/VOC2007/JPEGImages/000613.jpg 500 333 10 171 125 500 333 8 392 223 500 333 8 17 218 144 333 14 31 110 184 333 14 87 110 181 257 14 137 103 194 224 14 174 91 238 190 14 206 102 245 154 14 131 39 173 127 14 256 84 311 129 14 335 87 369 104 14 377 85 408 108 14 455 97 489 137 14 301 127 465 332 14 335 103 445 197 14 328 95 382 179 14 329 100 357 153 +301 /data/VOCdevkit/VOC2007/JPEGImages/000619.jpg 500 333 2 143 12 459 322 +302 /data/VOCdevkit/VOC2007/JPEGImages/000620.jpg 500 344 6 114 182 303 309 +303 /data/VOCdevkit/VOC2007/JPEGImages/000622.jpg 500 375 9 156 87 401 339 +304 /data/VOCdevkit/VOC2007/JPEGImages/000625.jpg 500 375 14 395 209 486 294 14 271 214 373 291 14 270 274 372 334 14 171 204 263 278 14 76 194 164 273 14 76 273 162 326 14 67 82 169 160 14 64 16 162 96 14 174 17 274 92 14 172 85 283 184 14 279 21 376 110 14 283 94 418 183 14 389 88 500 183 +305 /data/VOCdevkit/VOC2007/JPEGImages/000626.jpg 500 400 14 141 23 313 298 19 108 35 188 146 19 32 44 116 128 +306 /data/VOCdevkit/VOC2007/JPEGImages/000628.jpg 500 392 6 126 272 376 371 6 402 266 500 361 6 1 281 77 334 15 91 253 119 299 +307 /data/VOCdevkit/VOC2007/JPEGImages/000632.jpg 500 375 19 282 176 351 255 8 61 167 178 335 +308 /data/VOCdevkit/VOC2007/JPEGImages/000633.jpg 500 375 19 300 122 433 240 14 2 22 339 375 +309 /data/VOCdevkit/VOC2007/JPEGImages/000635.jpg 500 375 18 154 149 420 342 +310 /data/VOCdevkit/VOC2007/JPEGImages/000637.jpg 500 375 1 10 2 487 373 +311 /data/VOCdevkit/VOC2007/JPEGImages/000645.jpg 500 375 2 135 46 500 374 2 124 146 365 375 +312 /data/VOCdevkit/VOC2007/JPEGImages/000647.jpg 500 333 0 166 69 443 234 +313 /data/VOCdevkit/VOC2007/JPEGImages/000648.jpg 500 333 5 29 113 353 266 +314 /data/VOCdevkit/VOC2007/JPEGImages/000653.jpg 500 375 6 432 83 500 131 6 373 83 458 135 6 311 85 408 140 6 1 95 106 172 6 2 94 444 312 +315 /data/VOCdevkit/VOC2007/JPEGImages/000654.jpg 500 333 16 36 135 168 227 16 55 152 215 249 14 411 51 463 146 14 368 49 424 146 14 323 81 369 133 14 114 61 171 139 14 86 60 129 139 11 295 178 382 243 +316 /data/VOCdevkit/VOC2007/JPEGImages/000656.jpg 500 333 11 230 61 447 174 +317 /data/VOCdevkit/VOC2007/JPEGImages/000657.jpg 500 333 0 253 156 310 176 0 203 160 252 178 0 148 169 206 188 0 234 192 291 212 +318 /data/VOCdevkit/VOC2007/JPEGImages/000660.jpg 500 332 17 169 76 500 322 +319 /data/VOCdevkit/VOC2007/JPEGImages/000661.jpg 500 375 17 119 177 331 278 15 65 90 170 197 8 133 159 179 197 +320 /data/VOCdevkit/VOC2007/JPEGImages/000663.jpg 422 500 5 12 2 417 467 6 7 39 63 94 6 376 36 422 81 +321 /data/VOCdevkit/VOC2007/JPEGImages/000667.jpg 434 500 12 271 362 410 476 +322 /data/VOCdevkit/VOC2007/JPEGImages/000671.jpg 326 500 1 48 330 268 471 +323 /data/VOCdevkit/VOC2007/JPEGImages/000672.jpg 500 375 6 12 91 495 307 +324 /data/VOCdevkit/VOC2007/JPEGImages/000675.jpg 500 335 18 79 87 426 272 +325 /data/VOCdevkit/VOC2007/JPEGImages/000676.jpg 500 375 16 59 94 472 270 +326 /data/VOCdevkit/VOC2007/JPEGImages/000677.jpg 333 500 14 66 54 333 436 +327 /data/VOCdevkit/VOC2007/JPEGImages/000680.jpg 500 375 2 213 144 319 241 +328 /data/VOCdevkit/VOC2007/JPEGImages/000682.jpg 500 375 2 275 154 461 275 +329 /data/VOCdevkit/VOC2007/JPEGImages/000684.jpg 375 500 14 52 112 91 183 4 54 171 77 222 14 77 101 241 314 14 217 49 294 304 14 285 22 361 366 14 297 3 375 369 +330 /data/VOCdevkit/VOC2007/JPEGImages/000685.jpg 500 375 13 16 2 498 374 +331 /data/VOCdevkit/VOC2007/JPEGImages/000686.jpg 500 375 13 283 91 498 301 13 14 100 303 308 +332 /data/VOCdevkit/VOC2007/JPEGImages/000688.jpg 500 317 6 8 42 500 317 14 73 14 97 82 14 103 10 121 75 14 117 1 134 78 14 38 1 76 83 14 1 1 46 96 +333 /data/VOCdevkit/VOC2007/JPEGImages/000689.jpg 500 353 18 2 39 498 347 +334 /data/VOCdevkit/VOC2007/JPEGImages/000690.jpg 500 375 1 1 188 247 361 7 281 111 336 229 14 226 87 336 371 +335 /data/VOCdevkit/VOC2007/JPEGImages/000694.jpg 500 375 14 282 151 379 375 14 200 132 284 374 14 376 160 460 375 14 369 130 412 218 14 83 167 191 297 +336 /data/VOCdevkit/VOC2007/JPEGImages/000695.jpg 500 375 12 109 126 415 366 14 220 40 286 264 12 443 159 500 283 12 174 108 332 158 14 471 94 500 189 +337 /data/VOCdevkit/VOC2007/JPEGImages/000699.jpg 500 381 11 29 205 337 377 11 102 27 366 358 11 309 130 472 362 8 1 2 500 381 +338 /data/VOCdevkit/VOC2007/JPEGImages/000700.jpg 500 333 6 12 224 56 252 6 1 217 16 264 6 402 227 426 239 6 430 225 463 239 6 141 238 223 276 6 125 246 477 333 +339 /data/VOCdevkit/VOC2007/JPEGImages/000702.jpg 500 375 12 236 130 434 349 12 119 149 290 337 14 420 150 466 230 +340 /data/VOCdevkit/VOC2007/JPEGImages/000705.jpg 500 234 7 3 18 489 219 +341 /data/VOCdevkit/VOC2007/JPEGImages/000707.jpg 375 500 19 93 150 134 187 19 292 289 363 500 8 78 176 139 281 +342 /data/VOCdevkit/VOC2007/JPEGImages/000709.jpg 500 377 14 120 63 334 355 14 119 57 394 352 8 377 122 473 309 +343 /data/VOCdevkit/VOC2007/JPEGImages/000710.jpg 375 500 7 143 177 225 270 8 188 182 303 464 15 95 129 136 249 +344 /data/VOCdevkit/VOC2007/JPEGImages/000711.jpg 500 375 15 59 2 236 187 +345 /data/VOCdevkit/VOC2007/JPEGImages/000712.jpg 500 341 18 3 93 383 273 +346 /data/VOCdevkit/VOC2007/JPEGImages/000713.jpg 500 336 3 80 168 254 312 3 184 160 472 269 +347 /data/VOCdevkit/VOC2007/JPEGImages/000714.jpg 500 335 2 190 56 439 300 +348 /data/VOCdevkit/VOC2007/JPEGImages/000717.jpg 500 375 8 207 278 297 375 14 230 39 308 341 14 182 131 240 344 14 15 199 146 372 14 302 128 391 373 14 440 128 500 375 14 393 128 461 369 14 47 146 149 373 14 3 151 36 258 +349 /data/VOCdevkit/VOC2007/JPEGImages/000720.jpg 500 333 11 217 118 305 263 +350 /data/VOCdevkit/VOC2007/JPEGImages/000726.jpg 500 333 4 18 209 224 295 14 153 45 274 333 14 70 75 499 333 +351 /data/VOCdevkit/VOC2007/JPEGImages/000728.jpg 500 333 9 87 39 500 331 +352 /data/VOCdevkit/VOC2007/JPEGImages/000729.jpg 375 500 15 10 6 372 498 +353 /data/VOCdevkit/VOC2007/JPEGImages/000730.jpg 500 333 0 5 52 495 234 +354 /data/VOCdevkit/VOC2007/JPEGImages/000731.jpg 329 500 2 138 387 237 500 14 13 75 300 373 14 1 1 165 273 +355 /data/VOCdevkit/VOC2007/JPEGImages/000733.jpg 450 435 14 48 25 273 383 13 103 201 448 435 +356 /data/VOCdevkit/VOC2007/JPEGImages/000738.jpg 500 332 0 1 124 496 235 +357 /data/VOCdevkit/VOC2007/JPEGImages/000739.jpg 500 374 14 404 30 500 374 14 386 83 479 374 14 272 65 415 374 14 239 55 335 374 14 165 55 252 374 14 97 66 193 374 14 3 26 108 374 +358 /data/VOCdevkit/VOC2007/JPEGImages/000740.jpg 500 375 3 290 85 404 276 3 104 104 212 271 +359 /data/VOCdevkit/VOC2007/JPEGImages/000742.jpg 500 338 3 391 129 412 168 3 1 145 311 335 14 212 99 296 253 +360 /data/VOCdevkit/VOC2007/JPEGImages/000746.jpg 500 333 11 95 57 433 333 +361 /data/VOCdevkit/VOC2007/JPEGImages/000748.jpg 500 292 5 47 100 440 246 +362 /data/VOCdevkit/VOC2007/JPEGImages/000750.jpg 375 500 14 22 2 375 500 +363 /data/VOCdevkit/VOC2007/JPEGImages/000752.jpg 500 332 14 225 118 500 319 14 1 119 125 332 +364 /data/VOCdevkit/VOC2007/JPEGImages/000753.jpg 500 375 10 164 188 429 375 4 211 114 241 196 4 265 229 288 296 4 264 198 284 248 14 263 99 352 227 14 334 105 430 254 14 351 99 500 373 14 128 101 192 214 14 55 108 189 373 +365 /data/VOCdevkit/VOC2007/JPEGImages/000754.jpg 500 261 5 56 81 157 170 1 94 124 150 158 +366 /data/VOCdevkit/VOC2007/JPEGImages/000755.jpg 500 375 1 362 217 393 231 +367 /data/VOCdevkit/VOC2007/JPEGImages/000756.jpg 365 500 11 67 8 365 500 +368 /data/VOCdevkit/VOC2007/JPEGImages/000760.jpg 500 332 12 64 161 231 261 12 235 158 355 260 12 264 156 418 274 14 121 133 159 228 14 215 144 243 227 14 320 121 360 223 14 373 131 410 192 +369 /data/VOCdevkit/VOC2007/JPEGImages/000761.jpg 500 375 8 300 249 412 375 19 19 255 165 375 17 150 141 437 322 +370 /data/VOCdevkit/VOC2007/JPEGImages/000763.jpg 500 333 0 20 116 484 212 +371 /data/VOCdevkit/VOC2007/JPEGImages/000764.jpg 500 332 12 79 80 366 271 +372 /data/VOCdevkit/VOC2007/JPEGImages/000767.jpg 500 375 9 32 1 470 318 +373 /data/VOCdevkit/VOC2007/JPEGImages/000768.jpg 500 375 5 369 103 475 283 5 33 46 369 330 +374 /data/VOCdevkit/VOC2007/JPEGImages/000770.jpg 500 375 9 125 167 431 375 14 134 65 227 366 1 1 131 42 266 13 229 128 475 361 +375 /data/VOCdevkit/VOC2007/JPEGImages/000771.jpg 375 500 8 93 143 221 284 +376 /data/VOCdevkit/VOC2007/JPEGImages/000772.jpg 360 480 11 49 115 360 480 +377 /data/VOCdevkit/VOC2007/JPEGImages/000774.jpg 500 313 18 85 36 447 225 +378 /data/VOCdevkit/VOC2007/JPEGImages/000776.jpg 500 200 6 17 26 481 193 +379 /data/VOCdevkit/VOC2007/JPEGImages/000777.jpg 500 333 11 147 109 327 277 14 224 1 361 209 +380 /data/VOCdevkit/VOC2007/JPEGImages/000780.jpg 500 375 15 188 213 283 286 +381 /data/VOCdevkit/VOC2007/JPEGImages/000782.jpg 330 500 5 1 165 330 497 14 95 361 139 422 +382 /data/VOCdevkit/VOC2007/JPEGImages/000786.jpg 500 335 9 84 95 292 289 +383 /data/VOCdevkit/VOC2007/JPEGImages/000787.jpg 500 371 6 120 93 423 279 +384 /data/VOCdevkit/VOC2007/JPEGImages/000791.jpg 500 332 18 84 46 450 297 +385 /data/VOCdevkit/VOC2007/JPEGImages/000793.jpg 500 375 14 289 100 316 183 14 241 111 270 180 14 218 107 236 178 14 402 67 467 259 14 65 110 84 161 14 96 107 114 159 14 100 78 190 282 1 151 160 310 280 5 2 80 51 135 +386 /data/VOCdevkit/VOC2007/JPEGImages/000794.jpg 500 375 7 220 208 302 272 +387 /data/VOCdevkit/VOC2007/JPEGImages/000796.jpg 500 375 2 165 118 418 316 +388 /data/VOCdevkit/VOC2007/JPEGImages/000797.jpg 500 375 11 37 127 348 375 14 68 94 424 370 +389 /data/VOCdevkit/VOC2007/JPEGImages/000799.jpg 500 441 12 95 23 500 441 14 230 225 500 441 +390 /data/VOCdevkit/VOC2007/JPEGImages/000800.jpg 500 375 6 235 165 328 208 6 443 174 500 206 6 78 170 113 192 6 38 170 71 188 +391 /data/VOCdevkit/VOC2007/JPEGImages/000802.jpg 500 375 14 1 145 58 266 1 2 192 93 291 +392 /data/VOCdevkit/VOC2007/JPEGImages/000804.jpg 333 500 8 94 243 153 304 17 191 265 332 470 +393 /data/VOCdevkit/VOC2007/JPEGImages/000805.jpg 375 500 11 29 65 356 411 14 308 85 375 214 +394 /data/VOCdevkit/VOC2007/JPEGImages/000806.jpg 333 500 14 119 275 333 500 14 1 298 106 500 +395 /data/VOCdevkit/VOC2007/JPEGImages/000808.jpg 500 333 9 77 1 415 333 +396 /data/VOCdevkit/VOC2007/JPEGImages/000810.jpg 500 375 14 151 13 498 375 +397 /data/VOCdevkit/VOC2007/JPEGImages/000812.jpg 500 333 1 99 171 376 333 14 149 33 360 333 +398 /data/VOCdevkit/VOC2007/JPEGImages/000814.jpg 348 500 14 59 63 268 500 +399 /data/VOCdevkit/VOC2007/JPEGImages/000815.jpg 500 374 0 286 143 481 224 0 10 104 322 236 +400 /data/VOCdevkit/VOC2007/JPEGImages/000816.jpg 500 500 1 122 225 407 467 14 153 122 309 474 +401 /data/VOCdevkit/VOC2007/JPEGImages/000818.jpg 500 287 18 295 121 500 204 6 1 181 33 204 +402 /data/VOCdevkit/VOC2007/JPEGImages/000820.jpg 500 375 16 180 140 368 307 16 348 43 412 71 +403 /data/VOCdevkit/VOC2007/JPEGImages/000822.jpg 500 374 13 98 165 230 346 13 231 168 353 323 +404 /data/VOCdevkit/VOC2007/JPEGImages/000823.jpg 500 334 6 49 160 343 265 +405 /data/VOCdevkit/VOC2007/JPEGImages/000826.jpg 500 478 3 11 32 436 445 +406 /data/VOCdevkit/VOC2007/JPEGImages/000827.jpg 500 333 9 214 153 250 199 9 250 160 310 202 +407 /data/VOCdevkit/VOC2007/JPEGImages/000828.jpg 375 500 14 2 178 32 288 14 26 174 65 291 14 267 93 361 289 14 19 146 191 500 14 157 89 375 500 +408 /data/VOCdevkit/VOC2007/JPEGImages/000829.jpg 500 375 5 217 166 452 280 5 1 171 199 290 6 355 1 385 20 14 468 315 492 351 +409 /data/VOCdevkit/VOC2007/JPEGImages/000830.jpg 500 375 10 124 182 352 370 8 150 221 259 375 8 252 201 348 347 +410 /data/VOCdevkit/VOC2007/JPEGImages/000831.jpg 335 500 18 83 124 239 377 +411 /data/VOCdevkit/VOC2007/JPEGImages/000832.jpg 375 500 2 89 38 337 500 +412 /data/VOCdevkit/VOC2007/JPEGImages/000834.jpg 500 375 9 304 85 369 125 9 10 96 100 154 9 69 123 177 174 14 98 245 390 375 +413 /data/VOCdevkit/VOC2007/JPEGImages/000842.jpg 500 356 11 82 79 500 356 +414 /data/VOCdevkit/VOC2007/JPEGImages/000843.jpg 500 333 19 170 127 312 219 14 351 54 426 304 +415 /data/VOCdevkit/VOC2007/JPEGImages/000845.jpg 500 335 0 9 97 493 206 +416 /data/VOCdevkit/VOC2007/JPEGImages/000847.jpg 375 500 10 1 279 208 500 14 61 111 296 500 +417 /data/VOCdevkit/VOC2007/JPEGImages/000848.jpg 500 334 14 33 109 260 334 8 323 161 353 220 8 323 164 500 334 14 309 170 461 334 +418 /data/VOCdevkit/VOC2007/JPEGImages/000849.jpg 200 368 11 23 56 159 328 +419 /data/VOCdevkit/VOC2007/JPEGImages/000850.jpg 500 375 2 213 71 334 209 +420 /data/VOCdevkit/VOC2007/JPEGImages/000851.jpg 500 375 13 103 130 402 311 14 174 69 302 335 +421 /data/VOCdevkit/VOC2007/JPEGImages/000854.jpg 500 375 17 168 176 415 282 8 2 189 128 338 15 1 2 102 249 14 309 158 387 311 14 262 153 315 308 14 215 150 269 301 14 33 176 154 331 +422 /data/VOCdevkit/VOC2007/JPEGImages/000855.jpg 375 500 5 118 338 258 462 6 61 404 109 436 6 41 408 64 430 +423 /data/VOCdevkit/VOC2007/JPEGImages/000857.jpg 500 375 7 235 25 353 131 +424 /data/VOCdevkit/VOC2007/JPEGImages/000859.jpg 500 333 14 269 23 500 313 14 13 56 327 331 +425 /data/VOCdevkit/VOC2007/JPEGImages/000860.jpg 500 353 6 81 85 428 292 14 224 35 281 86 14 298 45 358 115 +426 /data/VOCdevkit/VOC2007/JPEGImages/000862.jpg 500 375 3 304 142 354 160 +427 /data/VOCdevkit/VOC2007/JPEGImages/000863.jpg 500 317 18 171 39 472 283 18 12 16 151 284 +428 /data/VOCdevkit/VOC2007/JPEGImages/000865.jpg 500 375 10 300 167 397 268 8 407 167 465 252 8 344 172 414 272 8 378 170 441 261 14 190 102 337 375 14 3 129 124 294 +429 /data/VOCdevkit/VOC2007/JPEGImages/000867.jpg 375 500 15 172 96 230 191 +430 /data/VOCdevkit/VOC2007/JPEGImages/000868.jpg 500 375 17 1 216 399 375 15 433 213 465 236 +431 /data/VOCdevkit/VOC2007/JPEGImages/000871.jpg 500 375 6 8 114 491 292 +432 /data/VOCdevkit/VOC2007/JPEGImages/000872.jpg 500 375 0 2 15 393 287 +433 /data/VOCdevkit/VOC2007/JPEGImages/000874.jpg 500 332 14 2 2 387 332 +434 /data/VOCdevkit/VOC2007/JPEGImages/000876.jpg 500 334 7 117 31 376 329 7 261 14 398 132 +435 /data/VOCdevkit/VOC2007/JPEGImages/000878.jpg 500 333 1 125 164 298 333 14 149 52 259 307 +436 /data/VOCdevkit/VOC2007/JPEGImages/000879.jpg 500 375 12 102 95 266 375 14 252 132 320 375 +437 /data/VOCdevkit/VOC2007/JPEGImages/000880.jpg 500 369 2 305 24 355 65 2 51 239 87 322 2 116 158 141 206 9 379 119 440 199 9 329 114 380 179 +438 /data/VOCdevkit/VOC2007/JPEGImages/000882.jpg 500 357 11 82 37 500 357 +439 /data/VOCdevkit/VOC2007/JPEGImages/000885.jpg 500 456 14 11 12 485 456 +440 /data/VOCdevkit/VOC2007/JPEGImages/000887.jpg 500 320 0 25 49 473 247 +441 /data/VOCdevkit/VOC2007/JPEGImages/000888.jpg 500 347 6 295 204 351 245 6 72 208 209 319 +442 /data/VOCdevkit/VOC2007/JPEGImages/000889.jpg 374 500 15 37 287 186 486 15 181 362 302 458 15 188 2 327 394 +443 /data/VOCdevkit/VOC2007/JPEGImages/000892.jpg 500 375 14 350 191 427 375 13 190 212 344 375 +444 /data/VOCdevkit/VOC2007/JPEGImages/000895.jpg 500 375 14 126 71 274 359 14 25 101 157 343 +445 /data/VOCdevkit/VOC2007/JPEGImages/000896.jpg 500 375 0 2 189 256 294 +446 /data/VOCdevkit/VOC2007/JPEGImages/000898.jpg 500 375 17 1 115 499 361 14 297 195 351 233 +447 /data/VOCdevkit/VOC2007/JPEGImages/000899.jpg 500 333 18 92 139 473 243 +448 /data/VOCdevkit/VOC2007/JPEGImages/000900.jpg 500 375 16 260 135 342 269 16 150 172 215 269 16 101 170 188 252 +449 /data/VOCdevkit/VOC2007/JPEGImages/000902.jpg 500 399 11 71 85 332 314 11 271 75 499 210 11 160 34 313 105 14 4 2 158 281 +450 /data/VOCdevkit/VOC2007/JPEGImages/000903.jpg 416 500 14 41 25 407 366 8 30 117 323 500 +451 /data/VOCdevkit/VOC2007/JPEGImages/000904.jpg 500 375 9 237 167 338 263 14 17 113 165 238 +452 /data/VOCdevkit/VOC2007/JPEGImages/000906.jpg 500 375 6 61 179 450 350 14 160 159 191 221 14 397 166 425 205 3 2 3 231 300 3 23 1 383 216 3 300 2 488 175 6 423 162 500 259 +453 /data/VOCdevkit/VOC2007/JPEGImages/000908.jpg 500 375 0 1 61 500 375 +454 /data/VOCdevkit/VOC2007/JPEGImages/000911.jpg 500 324 6 1 147 110 319 5 78 47 383 288 1 387 208 436 279 14 411 142 456 277 +455 /data/VOCdevkit/VOC2007/JPEGImages/000912.jpg 500 334 7 153 33 500 334 +456 /data/VOCdevkit/VOC2007/JPEGImages/000915.jpg 500 375 10 26 256 274 375 14 206 71 416 375 14 94 103 284 264 +457 /data/VOCdevkit/VOC2007/JPEGImages/000917.jpg 480 360 15 2 2 265 355 2 265 163 316 214 +458 /data/VOCdevkit/VOC2007/JPEGImages/000918.jpg 333 500 14 18 15 333 500 +459 /data/VOCdevkit/VOC2007/JPEGImages/000919.jpg 500 331 11 39 82 352 330 +460 /data/VOCdevkit/VOC2007/JPEGImages/000920.jpg 500 379 18 2 31 500 363 14 281 67 330 199 +461 /data/VOCdevkit/VOC2007/JPEGImages/000921.jpg 500 375 7 163 77 500 291 8 127 66 299 223 8 143 4 500 375 +462 /data/VOCdevkit/VOC2007/JPEGImages/000923.jpg 500 375 19 102 124 182 189 17 146 196 458 375 15 305 2 500 138 15 15 71 66 192 19 403 164 472 262 15 189 34 220 71 +463 /data/VOCdevkit/VOC2007/JPEGImages/000926.jpg 375 500 14 1 16 340 500 14 211 334 241 390 14 199 309 231 351 14 174 315 210 360 14 192 354 226 396 14 153 354 197 398 14 126 355 160 401 14 124 319 163 373 14 147 320 180 355 +464 /data/VOCdevkit/VOC2007/JPEGImages/000929.jpg 500 375 10 1 65 500 375 4 261 64 295 201 4 253 23 276 95 +465 /data/VOCdevkit/VOC2007/JPEGImages/000931.jpg 500 375 3 104 302 224 338 +466 /data/VOCdevkit/VOC2007/JPEGImages/000934.jpg 500 333 0 1 36 500 291 +467 /data/VOCdevkit/VOC2007/JPEGImages/000935.jpg 500 375 6 67 207 111 243 +468 /data/VOCdevkit/VOC2007/JPEGImages/000936.jpg 500 334 0 299 10 347 63 0 314 105 364 156 0 334 149 378 200 0 261 208 305 254 0 155 277 201 329 +469 /data/VOCdevkit/VOC2007/JPEGImages/000937.jpg 500 375 6 334 46 426 101 6 46 36 443 277 +470 /data/VOCdevkit/VOC2007/JPEGImages/000943.jpg 500 375 8 145 241 500 374 14 234 135 500 316 14 305 146 426 267 14 238 147 356 245 14 223 149 298 223 14 76 140 146 266 14 1 69 178 372 14 330 107 375 159 14 50 114 101 185 14 288 110 321 157 +471 /data/VOCdevkit/VOC2007/JPEGImages/000946.jpg 500 375 18 16 108 387 283 18 383 153 500 222 +472 /data/VOCdevkit/VOC2007/JPEGImages/000947.jpg 238 500 11 36 43 217 474 +473 /data/VOCdevkit/VOC2007/JPEGImages/000948.jpg 500 375 19 413 37 500 166 8 22 9 284 375 14 198 89 315 353 +474 /data/VOCdevkit/VOC2007/JPEGImages/000949.jpg 340 500 1 155 196 303 463 1 3 176 151 426 14 145 36 328 412 14 1 48 159 393 +475 /data/VOCdevkit/VOC2007/JPEGImages/000950.jpg 500 331 10 52 194 438 324 +476 /data/VOCdevkit/VOC2007/JPEGImages/000951.jpg 500 375 4 226 73 245 127 +477 /data/VOCdevkit/VOC2007/JPEGImages/000954.jpg 500 332 2 1 130 399 322 +478 /data/VOCdevkit/VOC2007/JPEGImages/000958.jpg 400 300 11 1 90 327 299 +479 /data/VOCdevkit/VOC2007/JPEGImages/000962.jpg 500 375 7 4 137 493 375 +480 /data/VOCdevkit/VOC2007/JPEGImages/000964.jpg 500 333 2 167 86 288 304 2 185 70 281 227 +481 /data/VOCdevkit/VOC2007/JPEGImages/000965.jpg 375 500 11 94 285 237 461 17 2 86 374 500 +482 /data/VOCdevkit/VOC2007/JPEGImages/000966.jpg 500 353 18 42 48 493 312 +483 /data/VOCdevkit/VOC2007/JPEGImages/000967.jpg 500 375 14 419 233 468 372 14 148 222 205 375 14 161 241 231 375 14 12 223 39 330 18 23 124 500 333 +484 /data/VOCdevkit/VOC2007/JPEGImages/000971.jpg 500 375 5 116 143 297 255 14 324 185 344 241 14 344 190 371 249 14 364 188 385 246 14 392 193 410 230 14 387 156 500 375 14 72 194 89 240 14 1 202 34 327 14 37 211 61 251 14 19 196 43 272 +485 /data/VOCdevkit/VOC2007/JPEGImages/000972.jpg 500 375 6 20 115 433 288 +486 /data/VOCdevkit/VOC2007/JPEGImages/000973.jpg 500 375 1 30 51 488 331 +487 /data/VOCdevkit/VOC2007/JPEGImages/000977.jpg 500 333 6 149 271 179 295 6 36 262 94 309 6 178 245 263 319 6 258 266 293 296 6 321 253 397 333 6 327 259 454 332 +488 /data/VOCdevkit/VOC2007/JPEGImages/000980.jpg 500 333 2 115 46 500 321 +489 /data/VOCdevkit/VOC2007/JPEGImages/000982.jpg 500 377 0 67 37 345 345 +490 /data/VOCdevkit/VOC2007/JPEGImages/000987.jpg 500 447 14 199 19 390 401 14 217 15 270 157 14 393 18 432 162 13 19 95 458 443 +491 /data/VOCdevkit/VOC2007/JPEGImages/000989.jpg 500 333 19 52 117 109 177 +492 /data/VOCdevkit/VOC2007/JPEGImages/000991.jpg 318 480 14 88 87 235 322 12 113 117 218 471 +493 /data/VOCdevkit/VOC2007/JPEGImages/000993.jpg 500 493 18 214 137 366 277 18 396 87 466 183 +494 /data/VOCdevkit/VOC2007/JPEGImages/000996.jpg 500 375 8 139 214 303 375 8 28 211 167 373 8 1 213 76 323 10 5 157 500 375 14 19 6 93 175 +495 /data/VOCdevkit/VOC2007/JPEGImages/000997.jpg 500 375 17 1 196 205 375 19 381 144 459 209 +496 /data/VOCdevkit/VOC2007/JPEGImages/000999.jpg 375 500 4 233 317 289 405 14 2 16 280 500 +497 /data/VOCdevkit/VOC2007/JPEGImages/001001.jpg 500 375 7 62 64 325 375 14 315 102 427 356 +498 /data/VOCdevkit/VOC2007/JPEGImages/001002.jpg 375 500 3 199 384 375 483 3 102 366 213 416 3 22 341 103 396 +499 /data/VOCdevkit/VOC2007/JPEGImages/001004.jpg 500 375 2 143 152 235 197 +500 /data/VOCdevkit/VOC2007/JPEGImages/001008.jpg 500 375 13 220 154 300 280 +501 /data/VOCdevkit/VOC2007/JPEGImages/001009.jpg 500 375 7 33 11 500 375 7 4 44 263 316 +502 /data/VOCdevkit/VOC2007/JPEGImages/001010.jpg 500 375 19 157 6 308 146 +503 /data/VOCdevkit/VOC2007/JPEGImages/001011.jpg 500 375 19 192 1 283 99 14 239 3 500 375 +504 /data/VOCdevkit/VOC2007/JPEGImages/001012.jpg 500 333 0 225 117 307 206 +505 /data/VOCdevkit/VOC2007/JPEGImages/001014.jpg 500 375 11 278 188 395 375 11 150 253 337 369 14 86 91 359 375 8 99 139 401 375 +506 /data/VOCdevkit/VOC2007/JPEGImages/001015.jpg 500 333 2 96 133 110 163 2 392 188 418 209 +507 /data/VOCdevkit/VOC2007/JPEGImages/001017.jpg 333 500 13 108 320 186 456 14 85 205 199 408 +508 /data/VOCdevkit/VOC2007/JPEGImages/001018.jpg 500 375 17 235 209 500 361 8 344 280 430 375 8 136 279 243 373 8 1 266 97 375 8 101 236 186 368 8 198 212 244 268 8 135 209 188 264 10 1 209 139 334 +509 /data/VOCdevkit/VOC2007/JPEGImages/001024.jpg 500 375 19 121 1 429 90 14 1 30 386 375 +510 /data/VOCdevkit/VOC2007/JPEGImages/001027.jpg 500 375 8 203 174 254 273 8 263 218 351 329 1 58 156 94 218 19 1 244 43 340 +511 /data/VOCdevkit/VOC2007/JPEGImages/001028.jpg 406 500 14 52 231 301 500 14 7 29 406 493 14 359 164 406 229 14 306 174 357 232 14 285 173 321 221 +512 /data/VOCdevkit/VOC2007/JPEGImages/001036.jpg 500 375 14 63 186 124 374 14 1 178 35 373 14 143 87 228 191 14 227 5 500 375 14 110 188 361 375 +513 /data/VOCdevkit/VOC2007/JPEGImages/001041.jpg 500 375 2 143 138 283 265 +514 /data/VOCdevkit/VOC2007/JPEGImages/001042.jpg 500 375 11 222 248 298 319 14 149 174 220 322 14 277 163 334 347 14 362 163 409 336 +515 /data/VOCdevkit/VOC2007/JPEGImages/001043.jpg 500 333 7 61 9 482 309 +516 /data/VOCdevkit/VOC2007/JPEGImages/001045.jpg 375 500 4 214 2 327 276 +517 /data/VOCdevkit/VOC2007/JPEGImages/001050.jpg 500 375 14 235 126 297 241 1 234 174 295 269 +518 /data/VOCdevkit/VOC2007/JPEGImages/001052.jpg 500 375 6 65 101 431 281 +519 /data/VOCdevkit/VOC2007/JPEGImages/001053.jpg 323 500 11 24 11 285 482 +520 /data/VOCdevkit/VOC2007/JPEGImages/001056.jpg 500 334 11 167 166 415 334 11 1 1 350 300 +521 /data/VOCdevkit/VOC2007/JPEGImages/001057.jpg 500 335 6 6 38 353 335 14 107 94 154 146 +522 /data/VOCdevkit/VOC2007/JPEGImages/001060.jpg 500 378 6 411 183 500 212 1 155 197 183 234 14 157 172 187 232 +523 /data/VOCdevkit/VOC2007/JPEGImages/001061.jpg 500 375 2 323 33 449 128 14 320 116 489 375 14 1 1 321 375 +524 /data/VOCdevkit/VOC2007/JPEGImages/001062.jpg 375 500 19 126 33 337 289 +525 /data/VOCdevkit/VOC2007/JPEGImages/001064.jpg 320 216 12 13 34 267 203 14 140 14 215 128 +526 /data/VOCdevkit/VOC2007/JPEGImages/001066.jpg 500 329 14 390 83 460 153 14 101 20 165 150 +527 /data/VOCdevkit/VOC2007/JPEGImages/001068.jpg 500 332 13 33 23 461 316 +528 /data/VOCdevkit/VOC2007/JPEGImages/001069.jpg 500 375 6 264 75 438 136 6 1 117 117 181 +529 /data/VOCdevkit/VOC2007/JPEGImages/001071.jpg 332 500 14 72 100 172 323 14 198 113 287 331 12 72 142 179 429 12 157 169 302 455 +530 /data/VOCdevkit/VOC2007/JPEGImages/001072.jpg 500 386 17 80 213 418 309 14 160 170 316 309 +531 /data/VOCdevkit/VOC2007/JPEGImages/001073.jpg 500 375 9 55 178 149 248 9 135 176 174 241 9 227 153 282 236 9 276 159 350 255 9 327 152 425 240 9 421 161 500 227 +532 /data/VOCdevkit/VOC2007/JPEGImages/001074.jpg 500 285 2 74 54 422 208 +533 /data/VOCdevkit/VOC2007/JPEGImages/001077.jpg 500 375 19 28 101 214 296 +534 /data/VOCdevkit/VOC2007/JPEGImages/001078.jpg 500 375 7 2 101 245 375 +535 /data/VOCdevkit/VOC2007/JPEGImages/001079.jpg 500 375 14 188 131 285 261 14 256 147 375 269 14 372 146 475 319 14 121 138 217 283 14 2 140 144 354 15 195 1 261 165 10 1 247 480 375 +536 /data/VOCdevkit/VOC2007/JPEGImages/001082.jpg 500 375 7 212 153 347 306 15 135 1 306 97 +537 /data/VOCdevkit/VOC2007/JPEGImages/001083.jpg 500 333 18 163 55 318 189 +538 /data/VOCdevkit/VOC2007/JPEGImages/001084.jpg 318 480 12 116 176 212 458 14 99 101 225 337 +539 /data/VOCdevkit/VOC2007/JPEGImages/001091.jpg 500 375 14 390 174 500 357 14 254 148 426 327 14 84 167 247 361 15 337 57 435 144 15 153 63 227 144 +540 /data/VOCdevkit/VOC2007/JPEGImages/001092.jpg 500 334 11 131 63 456 332 +541 /data/VOCdevkit/VOC2007/JPEGImages/001093.jpg 500 400 6 52 55 479 371 6 109 39 178 64 +542 /data/VOCdevkit/VOC2007/JPEGImages/001097.jpg 500 334 14 1 68 93 334 14 33 88 189 334 14 174 191 268 334 14 260 119 430 333 14 343 39 500 334 +543 /data/VOCdevkit/VOC2007/JPEGImages/001101.jpg 500 333 14 143 61 225 211 14 2 28 217 332 14 306 79 401 311 14 370 82 496 330 +544 /data/VOCdevkit/VOC2007/JPEGImages/001102.jpg 500 334 0 33 1 283 149 +545 /data/VOCdevkit/VOC2007/JPEGImages/001104.jpg 500 334 11 1 4 394 334 +546 /data/VOCdevkit/VOC2007/JPEGImages/001106.jpg 500 375 8 102 160 240 327 8 295 158 389 319 8 339 174 465 363 8 363 149 445 258 10 337 179 500 319 +547 /data/VOCdevkit/VOC2007/JPEGImages/001107.jpg 500 332 0 12 96 493 225 +548 /data/VOCdevkit/VOC2007/JPEGImages/001109.jpg 500 333 14 274 14 500 333 14 1 72 302 333 +549 /data/VOCdevkit/VOC2007/JPEGImages/001110.jpg 500 375 7 19 73 264 305 7 254 66 498 326 +550 /data/VOCdevkit/VOC2007/JPEGImages/001112.jpg 500 335 18 323 87 406 214 6 61 168 125 202 15 181 279 261 335 15 259 299 350 335 +551 /data/VOCdevkit/VOC2007/JPEGImages/001113.jpg 500 375 14 387 47 487 160 14 395 80 478 339 14 251 78 406 326 +552 /data/VOCdevkit/VOC2007/JPEGImages/001119.jpg 500 333 6 250 178 343 215 +553 /data/VOCdevkit/VOC2007/JPEGImages/001121.jpg 375 500 3 54 29 294 500 +554 /data/VOCdevkit/VOC2007/JPEGImages/001124.jpg 500 326 5 189 140 257 213 +555 /data/VOCdevkit/VOC2007/JPEGImages/001125.jpg 500 333 6 266 174 434 272 6 210 171 312 227 6 1 176 223 333 14 164 149 199 220 14 302 152 342 312 +556 /data/VOCdevkit/VOC2007/JPEGImages/001127.jpg 500 375 11 42 125 203 330 11 195 136 295 288 11 283 113 496 241 +557 /data/VOCdevkit/VOC2007/JPEGImages/001129.jpg 500 270 17 2 29 500 270 14 217 38 500 179 14 1 51 186 168 +558 /data/VOCdevkit/VOC2007/JPEGImages/001130.jpg 500 375 9 114 107 296 266 +559 /data/VOCdevkit/VOC2007/JPEGImages/001136.jpg 500 500 3 35 153 500 375 2 298 68 422 133 2 248 155 291 222 +560 /data/VOCdevkit/VOC2007/JPEGImages/001137.jpg 500 333 14 174 117 272 333 14 242 74 347 333 +561 /data/VOCdevkit/VOC2007/JPEGImages/001140.jpg 375 500 11 257 312 323 407 11 57 298 157 465 14 169 64 260 402 +562 /data/VOCdevkit/VOC2007/JPEGImages/001142.jpg 500 375 15 1 142 164 371 15 89 90 177 242 15 242 104 267 166 +563 /data/VOCdevkit/VOC2007/JPEGImages/001143.jpg 375 500 9 14 40 373 475 +564 /data/VOCdevkit/VOC2007/JPEGImages/001144.jpg 500 333 0 4 52 500 286 +565 /data/VOCdevkit/VOC2007/JPEGImages/001145.jpg 375 500 11 1 204 149 493 14 114 117 304 416 14 126 1 241 322 14 230 433 375 500 +566 /data/VOCdevkit/VOC2007/JPEGImages/001147.jpg 500 333 14 19 2 497 333 +567 /data/VOCdevkit/VOC2007/JPEGImages/001148.jpg 500 375 6 222 167 248 187 +568 /data/VOCdevkit/VOC2007/JPEGImages/001149.jpg 500 375 17 148 138 403 302 19 75 85 146 153 15 1 7 142 375 +569 /data/VOCdevkit/VOC2007/JPEGImages/001151.jpg 500 331 11 93 109 316 325 14 263 3 428 329 14 221 1 329 196 +570 /data/VOCdevkit/VOC2007/JPEGImages/001152.jpg 448 336 5 52 2 448 336 14 200 113 272 336 14 75 146 146 336 +571 /data/VOCdevkit/VOC2007/JPEGImages/001154.jpg 500 375 17 1 233 174 375 15 134 230 171 274 +572 /data/VOCdevkit/VOC2007/JPEGImages/001156.jpg 500 399 7 100 80 414 324 +573 /data/VOCdevkit/VOC2007/JPEGImages/001158.jpg 500 375 8 267 1 499 350 8 1 2 259 359 +574 /data/VOCdevkit/VOC2007/JPEGImages/001160.jpg 500 333 0 219 99 269 141 +575 /data/VOCdevkit/VOC2007/JPEGImages/001161.jpg 500 375 18 56 1 500 375 +576 /data/VOCdevkit/VOC2007/JPEGImages/001164.jpg 500 375 10 76 174 401 373 14 330 121 490 318 14 6 125 131 326 14 104 117 180 223 14 231 104 322 195 8 345 253 456 375 8 157 276 281 375 8 282 213 350 346 15 465 72 500 133 +577 /data/VOCdevkit/VOC2007/JPEGImages/001166.jpg 500 375 19 329 100 379 160 +578 /data/VOCdevkit/VOC2007/JPEGImages/001168.jpg 500 375 14 1 1 403 375 14 279 73 500 375 +579 /data/VOCdevkit/VOC2007/JPEGImages/001170.jpg 500 375 14 102 114 341 375 14 318 140 500 375 +580 /data/VOCdevkit/VOC2007/JPEGImages/001171.jpg 500 331 13 156 223 322 331 14 4 59 66 243 14 144 85 229 251 14 290 66 479 331 +581 /data/VOCdevkit/VOC2007/JPEGImages/001172.jpg 500 187 18 19 20 486 162 +582 /data/VOCdevkit/VOC2007/JPEGImages/001174.jpg 500 375 8 315 203 380 314 8 246 213 319 330 8 143 202 187 293 10 185 208 373 325 +583 /data/VOCdevkit/VOC2007/JPEGImages/001175.jpg 500 375 14 119 153 367 329 19 360 114 449 187 +584 /data/VOCdevkit/VOC2007/JPEGImages/001176.jpg 500 375 3 272 82 451 340 3 196 298 252 314 3 139 252 175 315 3 33 213 81 317 +585 /data/VOCdevkit/VOC2007/JPEGImages/001182.jpg 500 375 9 125 149 403 294 9 100 124 218 183 +586 /data/VOCdevkit/VOC2007/JPEGImages/001184.jpg 500 375 1 81 279 207 356 +587 /data/VOCdevkit/VOC2007/JPEGImages/001185.jpg 500 375 7 197 199 289 323 14 78 78 289 375 4 452 131 500 253 +588 /data/VOCdevkit/VOC2007/JPEGImages/001186.jpg 375 500 1 162 231 189 283 14 154 196 192 270 +589 /data/VOCdevkit/VOC2007/JPEGImages/001187.jpg 375 500 8 21 410 230 500 8 185 363 366 500 17 107 270 360 396 +590 /data/VOCdevkit/VOC2007/JPEGImages/001191.jpg 500 375 16 1 3 298 375 +591 /data/VOCdevkit/VOC2007/JPEGImages/001192.jpg 500 375 11 294 172 372 317 11 148 107 216 234 +592 /data/VOCdevkit/VOC2007/JPEGImages/001194.jpg 500 375 1 72 180 281 340 +593 /data/VOCdevkit/VOC2007/JPEGImages/001199.jpg 500 375 13 305 254 500 375 13 86 177 395 375 +594 /data/VOCdevkit/VOC2007/JPEGImages/001200.jpg 500 339 18 16 8 475 321 +595 /data/VOCdevkit/VOC2007/JPEGImages/001201.jpg 500 333 13 195 173 309 293 14 234 53 315 217 +596 /data/VOCdevkit/VOC2007/JPEGImages/001203.jpg 350 240 11 31 6 327 208 +597 /data/VOCdevkit/VOC2007/JPEGImages/001204.jpg 500 375 17 81 192 475 373 +598 /data/VOCdevkit/VOC2007/JPEGImages/001205.jpg 500 335 3 88 76 314 263 +599 /data/VOCdevkit/VOC2007/JPEGImages/001206.jpg 500 375 14 274 1 429 288 11 172 141 236 326 +600 /data/VOCdevkit/VOC2007/JPEGImages/001207.jpg 500 375 2 125 77 500 375 +601 /data/VOCdevkit/VOC2007/JPEGImages/001209.jpg 500 375 11 196 96 273 238 +602 /data/VOCdevkit/VOC2007/JPEGImages/001211.jpg 409 500 7 267 215 409 500 11 1 9 224 281 +603 /data/VOCdevkit/VOC2007/JPEGImages/001212.jpg 500 375 14 107 166 299 329 14 207 25 355 159 14 277 67 357 226 14 375 78 500 370 15 401 28 467 125 15 376 57 430 129 15 178 3 238 56 +604 /data/VOCdevkit/VOC2007/JPEGImages/001214.jpg 500 375 8 43 187 141 354 8 1 227 46 375 19 203 144 244 203 19 122 150 205 209 17 240 165 500 375 +605 /data/VOCdevkit/VOC2007/JPEGImages/001215.jpg 500 375 1 31 71 473 317 +606 /data/VOCdevkit/VOC2007/JPEGImages/001221.jpg 332 500 18 104 101 264 385 14 167 249 197 284 +607 /data/VOCdevkit/VOC2007/JPEGImages/001224.jpg 500 333 1 101 153 187 280 1 215 166 302 284 1 328 173 433 305 1 274 156 355 262 14 95 78 189 223 14 206 82 298 248 14 326 91 433 247 14 274 87 349 238 14 104 2 135 79 +608 /data/VOCdevkit/VOC2007/JPEGImages/001225.jpg 387 500 11 100 212 303 414 +609 /data/VOCdevkit/VOC2007/JPEGImages/001226.jpg 500 333 11 105 50 499 274 +610 /data/VOCdevkit/VOC2007/JPEGImages/001229.jpg 500 375 4 208 91 413 214 14 15 75 429 375 14 348 157 500 375 +611 /data/VOCdevkit/VOC2007/JPEGImages/001230.jpg 500 399 0 68 154 399 253 +612 /data/VOCdevkit/VOC2007/JPEGImages/001231.jpg 500 375 8 223 127 307 213 8 54 142 181 263 17 295 177 500 375 +613 /data/VOCdevkit/VOC2007/JPEGImages/001233.jpg 333 500 7 64 143 257 500 +614 /data/VOCdevkit/VOC2007/JPEGImages/001234.jpg 260 500 14 70 14 182 443 14 33 167 190 500 11 1 425 62 475 19 3 280 71 384 +615 /data/VOCdevkit/VOC2007/JPEGImages/001236.jpg 500 399 12 69 111 432 362 14 223 28 309 253 +616 /data/VOCdevkit/VOC2007/JPEGImages/001237.jpg 500 375 6 115 156 266 213 +617 /data/VOCdevkit/VOC2007/JPEGImages/001239.jpg 500 375 11 108 60 320 160 11 228 138 381 375 11 118 94 286 307 +618 /data/VOCdevkit/VOC2007/JPEGImages/001240.jpg 500 375 14 1 1 135 374 14 22 159 427 375 +619 /data/VOCdevkit/VOC2007/JPEGImages/001241.jpg 375 500 12 34 60 375 500 14 142 19 375 500 14 1 298 57 500 14 1 270 17 351 14 103 45 117 71 +620 /data/VOCdevkit/VOC2007/JPEGImages/001247.jpg 500 334 3 237 109 459 167 +621 /data/VOCdevkit/VOC2007/JPEGImages/001248.jpg 500 375 14 1 59 68 292 14 236 29 277 269 14 281 61 346 305 14 331 45 372 304 14 353 21 429 333 14 397 20 497 345 14 135 230 178 278 14 75 238 121 281 +622 /data/VOCdevkit/VOC2007/JPEGImages/001250.jpg 432 288 2 172 97 255 192 +623 /data/VOCdevkit/VOC2007/JPEGImages/001254.jpg 500 332 14 263 41 331 229 12 212 83 390 263 +624 /data/VOCdevkit/VOC2007/JPEGImages/001258.jpg 500 375 6 101 92 423 287 +625 /data/VOCdevkit/VOC2007/JPEGImages/001259.jpg 500 334 14 220 152 282 310 14 190 155 242 307 1 166 201 229 308 +626 /data/VOCdevkit/VOC2007/JPEGImages/001260.jpg 500 375 2 167 85 245 140 +627 /data/VOCdevkit/VOC2007/JPEGImages/001263.jpg 500 375 8 107 170 199 288 8 210 156 287 274 10 157 159 266 275 +628 /data/VOCdevkit/VOC2007/JPEGImages/001265.jpg 327 500 14 8 44 313 469 +629 /data/VOCdevkit/VOC2007/JPEGImages/001266.jpg 500 332 13 1 88 477 332 14 128 22 315 332 14 281 2 500 332 +630 /data/VOCdevkit/VOC2007/JPEGImages/001268.jpg 500 333 6 29 90 323 245 6 265 62 489 178 +631 /data/VOCdevkit/VOC2007/JPEGImages/001269.jpg 500 333 14 108 92 389 333 +632 /data/VOCdevkit/VOC2007/JPEGImages/001270.jpg 500 357 0 31 126 448 234 +633 /data/VOCdevkit/VOC2007/JPEGImages/001272.jpg 500 414 4 182 87 242 202 4 181 154 300 264 14 103 22 469 414 +634 /data/VOCdevkit/VOC2007/JPEGImages/001273.jpg 440 500 2 53 132 392 419 +635 /data/VOCdevkit/VOC2007/JPEGImages/001274.jpg 375 500 7 138 196 230 344 +636 /data/VOCdevkit/VOC2007/JPEGImages/001277.jpg 500 332 0 2 31 500 289 +637 /data/VOCdevkit/VOC2007/JPEGImages/001279.jpg 375 500 14 39 32 216 450 14 121 224 264 441 14 24 165 373 500 +638 /data/VOCdevkit/VOC2007/JPEGImages/001281.jpg 500 333 6 169 121 394 234 +639 /data/VOCdevkit/VOC2007/JPEGImages/001284.jpg 500 375 14 135 123 235 375 14 238 115 376 304 14 276 117 426 360 14 301 114 500 375 14 1 114 126 375 14 419 90 448 139 +640 /data/VOCdevkit/VOC2007/JPEGImages/001286.jpg 500 331 13 32 124 489 331 +641 /data/VOCdevkit/VOC2007/JPEGImages/001287.jpg 500 401 12 2 127 198 305 14 178 103 500 401 +642 /data/VOCdevkit/VOC2007/JPEGImages/001288.jpg 500 342 0 68 76 426 209 0 357 272 497 317 0 196 272 316 314 +643 /data/VOCdevkit/VOC2007/JPEGImages/001289.jpg 500 309 2 157 98 355 188 +644 /data/VOCdevkit/VOC2007/JPEGImages/001290.jpg 500 410 6 26 170 477 336 +645 /data/VOCdevkit/VOC2007/JPEGImages/001292.jpg 500 375 4 363 180 412 344 14 61 63 308 338 +646 /data/VOCdevkit/VOC2007/JPEGImages/001293.jpg 500 492 11 3 14 451 491 +647 /data/VOCdevkit/VOC2007/JPEGImages/001294.jpg 500 375 6 324 151 404 210 6 93 161 123 179 +648 /data/VOCdevkit/VOC2007/JPEGImages/001298.jpg 500 375 14 313 60 432 193 14 193 167 324 280 14 107 107 208 262 3 3 2 426 252 +649 /data/VOCdevkit/VOC2007/JPEGImages/001299.jpg 429 500 9 39 26 229 412 9 211 240 319 408 9 318 221 408 435 +650 /data/VOCdevkit/VOC2007/JPEGImages/001304.jpg 333 500 14 143 184 175 264 +651 /data/VOCdevkit/VOC2007/JPEGImages/001309.jpg 348 500 1 98 232 252 500 14 92 26 253 486 +652 /data/VOCdevkit/VOC2007/JPEGImages/001310.jpg 500 375 16 163 198 284 338 14 263 90 381 326 14 67 110 104 199 14 19 132 43 166 16 19 164 61 206 +653 /data/VOCdevkit/VOC2007/JPEGImages/001311.jpg 500 319 1 432 118 465 186 1 334 128 380 220 1 177 188 304 319 1 12 161 181 319 14 463 67 495 154 14 431 75 468 171 14 333 79 387 201 14 187 106 291 293 14 27 61 163 280 +654 /data/VOCdevkit/VOC2007/JPEGImages/001312.jpg 500 375 9 1 1 480 318 +655 /data/VOCdevkit/VOC2007/JPEGImages/001314.jpg 500 333 7 68 2 369 323 +656 /data/VOCdevkit/VOC2007/JPEGImages/001315.jpg 300 400 14 42 51 237 334 +657 /data/VOCdevkit/VOC2007/JPEGImages/001316.jpg 500 375 11 150 61 500 374 +658 /data/VOCdevkit/VOC2007/JPEGImages/001323.jpg 500 375 18 33 188 481 322 +659 /data/VOCdevkit/VOC2007/JPEGImages/001324.jpg 500 333 11 57 44 156 333 11 206 35 403 315 +660 /data/VOCdevkit/VOC2007/JPEGImages/001325.jpg 500 379 3 79 151 351 261 3 288 166 471 251 3 382 4 494 119 3 5 293 259 354 3 138 324 493 373 3 365 293 492 353 14 222 119 270 176 3 256 286 452 339 +661 /data/VOCdevkit/VOC2007/JPEGImages/001326.jpg 500 375 17 27 1 500 375 +662 /data/VOCdevkit/VOC2007/JPEGImages/001327.jpg 375 500 14 1 54 226 500 +663 /data/VOCdevkit/VOC2007/JPEGImages/001330.jpg 500 375 6 297 164 334 184 6 167 164 342 310 14 140 159 172 287 +664 /data/VOCdevkit/VOC2007/JPEGImages/001332.jpg 375 500 0 20 26 82 72 +665 /data/VOCdevkit/VOC2007/JPEGImages/001333.jpg 500 375 13 156 176 203 242 14 189 127 215 197 14 155 139 202 196 +666 /data/VOCdevkit/VOC2007/JPEGImages/001334.jpg 500 375 6 16 70 489 288 6 4 97 68 119 +667 /data/VOCdevkit/VOC2007/JPEGImages/001337.jpg 318 480 12 92 139 213 459 14 77 93 237 313 +668 /data/VOCdevkit/VOC2007/JPEGImages/001341.jpg 500 377 2 114 65 450 308 +669 /data/VOCdevkit/VOC2007/JPEGImages/001343.jpg 500 375 19 337 90 457 194 19 224 168 268 206 8 230 200 281 308 17 8 203 189 308 +670 /data/VOCdevkit/VOC2007/JPEGImages/001345.jpg 500 375 8 391 167 456 258 8 287 167 356 262 8 341 150 408 234 +671 /data/VOCdevkit/VOC2007/JPEGImages/001346.jpg 500 229 4 309 97 356 229 14 220 4 447 229 14 7 1 262 228 +672 /data/VOCdevkit/VOC2007/JPEGImages/001348.jpg 500 333 2 163 52 313 210 +673 /data/VOCdevkit/VOC2007/JPEGImages/001350.jpg 500 375 8 1 184 124 375 14 111 114 264 375 14 245 152 356 375 14 307 114 462 372 14 168 143 335 375 +674 /data/VOCdevkit/VOC2007/JPEGImages/001352.jpg 500 276 14 159 114 183 161 14 13 150 30 175 14 44 159 71 214 14 65 165 107 216 8 45 208 91 275 14 135 154 168 232 14 204 184 232 275 14 233 176 281 275 14 211 147 238 214 14 248 139 264 195 14 270 142 283 199 14 279 147 302 204 14 305 147 327 199 14 330 137 344 197 14 341 147 358 200 14 350 157 370 246 14 389 151 415 225 14 377 141 390 207 14 415 158 432 260 14 421 141 438 183 14 444 139 461 166 14 472 156 496 185 6 49 135 242 208 14 482 185 500 275 14 429 187 486 275 14 332 244 377 276 +675 /data/VOCdevkit/VOC2007/JPEGImages/001360.jpg 500 326 6 7 91 448 272 +676 /data/VOCdevkit/VOC2007/JPEGImages/001361.jpg 500 333 2 44 35 422 333 +677 /data/VOCdevkit/VOC2007/JPEGImages/001362.jpg 333 500 14 33 32 333 500 +678 /data/VOCdevkit/VOC2007/JPEGImages/001364.jpg 500 333 6 69 43 405 290 +679 /data/VOCdevkit/VOC2007/JPEGImages/001365.jpg 500 331 2 322 139 416 189 +680 /data/VOCdevkit/VOC2007/JPEGImages/001371.jpg 500 375 6 187 214 247 262 6 259 218 288 243 6 291 216 360 262 +681 /data/VOCdevkit/VOC2007/JPEGImages/001375.jpg 500 410 2 170 9 500 383 +682 /data/VOCdevkit/VOC2007/JPEGImages/001378.jpg 383 500 2 182 90 350 404 +683 /data/VOCdevkit/VOC2007/JPEGImages/001383.jpg 500 375 18 100 138 431 312 +684 /data/VOCdevkit/VOC2007/JPEGImages/001384.jpg 500 375 6 90 140 334 324 6 330 18 450 107 6 259 89 333 142 +685 /data/VOCdevkit/VOC2007/JPEGImages/001385.jpg 500 332 5 179 118 365 194 6 104 156 179 189 6 46 157 89 188 +686 /data/VOCdevkit/VOC2007/JPEGImages/001386.jpg 500 375 13 5 57 487 370 6 463 79 497 103 6 484 90 500 113 +687 /data/VOCdevkit/VOC2007/JPEGImages/001387.jpg 375 500 7 38 43 375 466 7 213 138 375 465 +688 /data/VOCdevkit/VOC2007/JPEGImages/001388.jpg 500 414 17 2 2 500 414 14 61 9 432 400 +689 /data/VOCdevkit/VOC2007/JPEGImages/001390.jpg 500 333 14 196 55 228 184 14 70 55 114 230 14 235 62 281 187 14 269 57 319 202 +690 /data/VOCdevkit/VOC2007/JPEGImages/001393.jpg 500 375 10 61 194 325 375 8 2 194 78 374 14 289 140 480 375 14 291 130 400 355 14 197 124 285 199 14 15 131 133 375 4 260 164 280 213 4 213 164 230 209 4 206 176 221 216 14 134 180 250 375 +691 /data/VOCdevkit/VOC2007/JPEGImages/001395.jpg 500 375 7 35 24 499 375 +692 /data/VOCdevkit/VOC2007/JPEGImages/001397.jpg 333 500 11 128 121 214 263 +693 /data/VOCdevkit/VOC2007/JPEGImages/001400.jpg 375 500 0 121 199 340 318 +694 /data/VOCdevkit/VOC2007/JPEGImages/001402.jpg 500 375 17 213 66 443 301 17 1 118 369 375 1 433 51 494 124 +695 /data/VOCdevkit/VOC2007/JPEGImages/001404.jpg 500 375 7 57 22 443 361 +696 /data/VOCdevkit/VOC2007/JPEGImages/001405.jpg 332 500 12 83 59 273 435 14 135 89 271 453 +697 /data/VOCdevkit/VOC2007/JPEGImages/001406.jpg 500 375 11 109 127 404 373 14 1 36 417 303 17 1 1 500 373 +698 /data/VOCdevkit/VOC2007/JPEGImages/001408.jpg 333 500 4 114 245 178 448 14 56 107 230 387 4 20 68 50 167 14 210 1 333 108 14 84 87 333 366 15 119 1 184 130 +699 /data/VOCdevkit/VOC2007/JPEGImages/001409.jpg 500 333 6 226 74 464 240 14 298 93 325 122 14 348 92 395 123 +700 /data/VOCdevkit/VOC2007/JPEGImages/001413.jpg 500 375 2 373 163 482 256 2 189 130 234 174 2 256 181 323 273 2 134 211 210 290 +701 /data/VOCdevkit/VOC2007/JPEGImages/001414.jpg 500 375 14 15 87 43 196 14 324 84 362 130 14 475 93 500 234 6 40 64 458 313 +702 /data/VOCdevkit/VOC2007/JPEGImages/001418.jpg 405 480 11 32 34 344 473 +703 /data/VOCdevkit/VOC2007/JPEGImages/001420.jpg 500 332 12 192 109 340 270 14 281 80 364 268 15 436 148 500 306 +704 /data/VOCdevkit/VOC2007/JPEGImages/001421.jpg 375 500 14 189 1 372 438 14 116 181 374 476 +705 /data/VOCdevkit/VOC2007/JPEGImages/001426.jpg 333 500 13 4 185 331 498 14 3 3 222 498 +706 /data/VOCdevkit/VOC2007/JPEGImages/001427.jpg 369 500 1 153 199 270 341 1 249 159 332 275 14 229 58 319 266 14 159 114 267 297 +707 /data/VOCdevkit/VOC2007/JPEGImages/001430.jpg 500 375 10 1 269 250 374 14 100 154 235 286 14 211 146 303 352 14 245 154 398 374 19 316 1 418 66 15 344 83 428 214 +708 /data/VOCdevkit/VOC2007/JPEGImages/001432.jpg 500 375 6 2 2 499 375 +709 /data/VOCdevkit/VOC2007/JPEGImages/001434.jpg 500 332 14 445 271 466 327 14 427 268 449 324 5 243 236 411 303 5 97 222 235 311 +710 /data/VOCdevkit/VOC2007/JPEGImages/001436.jpg 500 335 0 185 125 330 167 +711 /data/VOCdevkit/VOC2007/JPEGImages/001439.jpg 375 500 10 4 324 375 500 +712 /data/VOCdevkit/VOC2007/JPEGImages/001441.jpg 500 376 10 136 277 446 376 +713 /data/VOCdevkit/VOC2007/JPEGImages/001442.jpg 500 333 9 73 68 429 333 +714 /data/VOCdevkit/VOC2007/JPEGImages/001443.jpg 500 374 7 33 32 314 373 8 1 95 124 374 +715 /data/VOCdevkit/VOC2007/JPEGImages/001444.jpg 500 375 17 91 262 327 375 8 226 196 387 327 15 368 186 428 241 4 29 208 58 259 15 164 140 219 276 19 143 152 176 191 +716 /data/VOCdevkit/VOC2007/JPEGImages/001445.jpg 500 375 5 114 105 455 267 14 488 160 500 217 14 465 164 484 217 6 80 170 116 206 6 1 204 220 338 +717 /data/VOCdevkit/VOC2007/JPEGImages/001450.jpg 500 331 14 183 70 330 253 13 185 110 336 251 +718 /data/VOCdevkit/VOC2007/JPEGImages/001451.jpg 500 334 4 379 199 419 264 4 164 157 221 293 14 242 119 386 244 14 97 101 221 251 15 12 152 52 189 +719 /data/VOCdevkit/VOC2007/JPEGImages/001453.jpg 500 375 2 176 29 297 306 +720 /data/VOCdevkit/VOC2007/JPEGImages/001455.jpg 500 374 1 125 176 345 374 14 147 124 300 345 14 51 125 92 187 14 100 122 153 182 6 415 89 500 126 +721 /data/VOCdevkit/VOC2007/JPEGImages/001457.jpg 500 375 17 136 121 350 264 8 432 212 500 375 +722 /data/VOCdevkit/VOC2007/JPEGImages/001460.jpg 500 333 14 138 68 225 242 1 119 128 315 282 +723 /data/VOCdevkit/VOC2007/JPEGImages/001463.jpg 500 375 3 89 4 333 342 +724 /data/VOCdevkit/VOC2007/JPEGImages/001464.jpg 500 215 15 31 91 60 122 15 61 92 87 123 15 89 92 121 123 15 75 28 115 93 15 120 91 150 122 15 150 91 178 122 15 288 58 320 104 15 315 59 347 95 15 342 50 376 87 15 368 43 394 81 15 391 37 415 72 15 412 19 434 65 15 351 126 376 155 15 224 103 258 140 15 169 98 222 141 15 127 120 171 148 15 70 119 125 160 15 323 150 354 186 15 292 158 323 190 15 269 140 295 178 15 227 139 266 184 15 211 151 229 176 15 176 152 214 188 15 145 147 176 188 15 70 153 149 213 +725 /data/VOCdevkit/VOC2007/JPEGImages/001465.jpg 500 375 8 331 216 482 375 8 281 192 329 296 8 240 188 282 287 8 75 208 157 338 8 20 233 86 365 10 1 234 121 356 4 35 210 46 239 +726 /data/VOCdevkit/VOC2007/JPEGImages/001466.jpg 500 333 6 2 114 452 264 +727 /data/VOCdevkit/VOC2007/JPEGImages/001467.jpg 500 375 11 253 81 475 241 +728 /data/VOCdevkit/VOC2007/JPEGImages/001468.jpg 400 267 9 138 64 250 256 9 22 106 166 237 9 214 110 254 209 +729 /data/VOCdevkit/VOC2007/JPEGImages/001470.jpg 500 375 19 103 30 311 234 +730 /data/VOCdevkit/VOC2007/JPEGImages/001472.jpg 500 375 6 75 102 408 349 6 267 89 500 248 6 58 73 105 118 6 122 76 179 107 6 190 75 253 107 6 249 78 312 103 14 43 58 75 128 14 458 65 474 99 14 439 61 458 99 14 284 56 304 102 14 106 61 125 110 14 172 60 185 101 +731 /data/VOCdevkit/VOC2007/JPEGImages/001475.jpg 500 362 13 49 154 500 362 14 235 79 438 354 +732 /data/VOCdevkit/VOC2007/JPEGImages/001479.jpg 500 375 14 144 88 500 375 +733 /data/VOCdevkit/VOC2007/JPEGImages/001480.jpg 500 376 14 125 3 279 185 14 138 31 329 251 14 173 63 432 341 +734 /data/VOCdevkit/VOC2007/JPEGImages/001481.jpg 500 375 3 225 161 281 252 +735 /data/VOCdevkit/VOC2007/JPEGImages/001483.jpg 500 333 18 171 72 388 303 18 74 151 153 250 +736 /data/VOCdevkit/VOC2007/JPEGImages/001484.jpg 476 300 3 1 1 243 125 +737 /data/VOCdevkit/VOC2007/JPEGImages/001485.jpg 500 333 13 43 105 334 300 14 109 33 251 299 14 45 183 169 333 +738 /data/VOCdevkit/VOC2007/JPEGImages/001486.jpg 500 375 7 110 61 461 269 +739 /data/VOCdevkit/VOC2007/JPEGImages/001488.jpg 500 333 6 254 152 385 204 +740 /data/VOCdevkit/VOC2007/JPEGImages/001490.jpg 500 333 11 199 105 382 326 4 296 111 326 171 4 276 107 303 166 +741 /data/VOCdevkit/VOC2007/JPEGImages/001492.jpg 500 334 6 185 168 487 316 6 45 157 104 187 6 1 158 43 189 +742 /data/VOCdevkit/VOC2007/JPEGImages/001493.jpg 500 375 14 389 77 475 287 14 424 90 500 375 14 183 82 312 375 14 35 33 222 375 4 29 223 44 270 +743 /data/VOCdevkit/VOC2007/JPEGImages/001494.jpg 500 375 6 122 243 321 371 +744 /data/VOCdevkit/VOC2007/JPEGImages/001497.jpg 500 375 3 227 1 500 80 3 1 93 135 133 3 164 129 328 163 3 40 111 173 164 3 139 138 415 199 3 62 47 132 84 +745 /data/VOCdevkit/VOC2007/JPEGImages/001498.jpg 375 500 14 51 14 359 500 +746 /data/VOCdevkit/VOC2007/JPEGImages/001499.jpg 500 375 14 212 223 238 300 +747 /data/VOCdevkit/VOC2007/JPEGImages/001501.jpg 500 374 1 327 187 366 257 14 330 148 376 244 +748 /data/VOCdevkit/VOC2007/JPEGImages/001504.jpg 375 500 14 146 422 161 484 14 190 420 212 489 14 259 422 281 493 +749 /data/VOCdevkit/VOC2007/JPEGImages/001509.jpg 315 500 14 139 279 179 366 +750 /data/VOCdevkit/VOC2007/JPEGImages/001510.jpg 500 375 14 149 55 220 241 13 357 103 407 167 13 97 148 312 247 +751 /data/VOCdevkit/VOC2007/JPEGImages/001512.jpg 500 333 2 160 130 435 232 +752 /data/VOCdevkit/VOC2007/JPEGImages/001514.jpg 500 333 14 12 52 312 333 14 219 131 467 332 +753 /data/VOCdevkit/VOC2007/JPEGImages/001515.jpg 409 500 12 60 13 361 500 +754 /data/VOCdevkit/VOC2007/JPEGImages/001517.jpg 500 375 11 19 109 416 291 +755 /data/VOCdevkit/VOC2007/JPEGImages/001521.jpg 375 500 14 45 396 188 500 14 134 131 230 462 +756 /data/VOCdevkit/VOC2007/JPEGImages/001522.jpg 500 375 4 309 46 377 241 4 217 100 272 247 +757 /data/VOCdevkit/VOC2007/JPEGImages/001523.jpg 500 375 12 139 165 500 375 14 285 99 441 372 +758 /data/VOCdevkit/VOC2007/JPEGImages/001524.jpg 500 370 11 185 158 216 230 14 139 84 205 212 14 281 70 339 210 +759 /data/VOCdevkit/VOC2007/JPEGImages/001526.jpg 500 298 14 3 18 114 298 14 109 51 214 297 14 212 35 316 297 14 289 33 387 297 14 381 15 500 297 +760 /data/VOCdevkit/VOC2007/JPEGImages/001528.jpg 383 500 2 46 76 372 348 +761 /data/VOCdevkit/VOC2007/JPEGImages/001529.jpg 500 375 19 36 170 111 277 17 160 157 450 317 8 354 273 475 375 +762 /data/VOCdevkit/VOC2007/JPEGImages/001531.jpg 500 375 8 48 131 226 375 14 279 63 463 375 14 103 60 225 375 +763 /data/VOCdevkit/VOC2007/JPEGImages/001532.jpg 425 340 6 105 170 180 205 6 187 186 232 207 13 225 168 262 216 14 226 130 262 196 14 296 159 317 205 +764 /data/VOCdevkit/VOC2007/JPEGImages/001536.jpg 500 375 19 62 57 406 322 14 112 172 309 281 +765 /data/VOCdevkit/VOC2007/JPEGImages/001537.jpg 500 332 14 414 87 500 243 14 104 16 367 332 4 385 212 408 278 +766 /data/VOCdevkit/VOC2007/JPEGImages/001539.jpg 500 375 1 102 167 357 350 +767 /data/VOCdevkit/VOC2007/JPEGImages/001541.jpg 500 332 7 1 8 450 316 +768 /data/VOCdevkit/VOC2007/JPEGImages/001543.jpg 500 375 19 1 156 117 253 17 292 172 500 350 +769 /data/VOCdevkit/VOC2007/JPEGImages/001544.jpg 500 375 14 1 1 440 375 +770 /data/VOCdevkit/VOC2007/JPEGImages/001545.jpg 500 375 0 132 171 338 240 +771 /data/VOCdevkit/VOC2007/JPEGImages/001548.jpg 500 375 14 133 145 287 328 +772 /data/VOCdevkit/VOC2007/JPEGImages/001553.jpg 500 387 1 213 113 297 187 1 249 330 316 367 +773 /data/VOCdevkit/VOC2007/JPEGImages/001554.jpg 500 375 11 241 170 423 227 14 26 20 231 330 +774 /data/VOCdevkit/VOC2007/JPEGImages/001555.jpg 500 375 7 333 294 390 368 +775 /data/VOCdevkit/VOC2007/JPEGImages/001556.jpg 500 332 12 72 39 159 255 12 323 31 435 292 +776 /data/VOCdevkit/VOC2007/JPEGImages/001557.jpg 500 139 0 36 3 379 107 14 399 79 421 125 +777 /data/VOCdevkit/VOC2007/JPEGImages/001559.jpg 360 480 6 197 185 224 215 6 146 175 183 226 +778 /data/VOCdevkit/VOC2007/JPEGImages/001561.jpg 500 375 14 205 97 355 375 14 188 163 217 236 6 117 161 160 181 6 160 162 196 177 6 47 159 101 192 +779 /data/VOCdevkit/VOC2007/JPEGImages/001563.jpg 500 333 10 12 201 385 333 14 344 110 446 273 14 262 86 360 199 14 130 125 200 202 14 212 131 288 202 14 5 110 132 333 4 72 168 95 237 8 398 191 488 283 +780 /data/VOCdevkit/VOC2007/JPEGImages/001565.jpg 500 332 18 98 107 461 243 18 1 115 87 218 +781 /data/VOCdevkit/VOC2007/JPEGImages/001571.jpg 500 331 14 150 2 481 330 14 113 7 256 331 14 103 1 253 242 +782 /data/VOCdevkit/VOC2007/JPEGImages/001576.jpg 500 375 6 51 172 458 280 +783 /data/VOCdevkit/VOC2007/JPEGImages/001577.jpg 500 375 10 180 92 429 163 10 104 163 500 375 14 79 1 225 177 14 268 33 316 74 14 313 12 363 108 14 362 3 427 124 14 424 36 456 76 +784 /data/VOCdevkit/VOC2007/JPEGImages/001579.jpg 375 500 1 1 302 217 500 1 36 254 324 441 14 114 135 269 406 14 1 157 128 479 +785 /data/VOCdevkit/VOC2007/JPEGImages/001580.jpg 500 375 14 209 67 433 341 14 3 96 189 337 4 167 224 210 375 4 138 252 195 375 +786 /data/VOCdevkit/VOC2007/JPEGImages/001582.jpg 500 375 7 338 176 500 365 7 1 78 124 168 +787 /data/VOCdevkit/VOC2007/JPEGImages/001586.jpg 480 398 12 28 54 429 329 14 211 40 331 237 +788 /data/VOCdevkit/VOC2007/JPEGImages/001588.jpg 500 333 19 1 135 59 234 17 100 130 251 217 17 302 133 500 286 +789 /data/VOCdevkit/VOC2007/JPEGImages/001590.jpg 375 500 4 148 223 231 450 19 303 40 375 324 +790 /data/VOCdevkit/VOC2007/JPEGImages/001593.jpg 423 500 14 125 128 276 433 14 195 336 382 500 14 264 259 339 355 14 315 242 412 424 14 17 238 128 410 +791 /data/VOCdevkit/VOC2007/JPEGImages/001594.jpg 500 333 16 270 153 334 208 16 231 153 269 209 16 179 149 206 210 16 151 142 180 210 14 335 93 400 218 11 253 177 302 238 +792 /data/VOCdevkit/VOC2007/JPEGImages/001595.jpg 500 375 5 268 162 442 296 5 40 158 275 288 +793 /data/VOCdevkit/VOC2007/JPEGImages/001597.jpg 500 375 2 227 135 330 291 +794 /data/VOCdevkit/VOC2007/JPEGImages/001598.jpg 500 333 16 269 262 312 311 16 222 252 247 297 16 168 258 198 291 16 150 243 173 267 16 355 234 380 248 +795 /data/VOCdevkit/VOC2007/JPEGImages/001603.jpg 500 333 14 320 125 383 199 14 371 45 422 108 1 362 71 450 111 1 312 160 414 214 +796 /data/VOCdevkit/VOC2007/JPEGImages/001604.jpg 500 375 6 8 107 234 230 6 110 126 291 264 6 245 88 500 340 +797 /data/VOCdevkit/VOC2007/JPEGImages/001607.jpg 500 375 11 21 1 500 374 +798 /data/VOCdevkit/VOC2007/JPEGImages/001608.jpg 500 375 14 3 1 500 375 +799 /data/VOCdevkit/VOC2007/JPEGImages/001610.jpg 500 375 7 16 56 368 276 +800 /data/VOCdevkit/VOC2007/JPEGImages/001611.jpg 495 500 14 159 213 292 500 14 158 171 425 500 +801 /data/VOCdevkit/VOC2007/JPEGImages/001612.jpg 500 333 18 157 105 466 277 +802 /data/VOCdevkit/VOC2007/JPEGImages/001614.jpg 500 375 9 158 43 436 372 9 100 231 154 319 9 416 100 500 364 9 367 252 440 315 +803 /data/VOCdevkit/VOC2007/JPEGImages/001617.jpg 500 331 13 351 42 471 106 13 334 116 500 331 13 181 133 358 322 14 192 100 348 265 14 320 67 493 279 14 343 4 416 100 14 170 56 271 159 +804 /data/VOCdevkit/VOC2007/JPEGImages/001618.jpg 500 333 6 53 104 473 263 +805 /data/VOCdevkit/VOC2007/JPEGImages/001622.jpg 375 500 14 200 238 247 391 14 139 252 153 291 6 1 247 149 418 +806 /data/VOCdevkit/VOC2007/JPEGImages/001627.jpg 375 500 14 104 7 280 475 +807 /data/VOCdevkit/VOC2007/JPEGImages/001628.jpg 480 394 12 104 74 420 344 14 200 55 320 217 +808 /data/VOCdevkit/VOC2007/JPEGImages/001630.jpg 375 500 14 26 14 54 114 14 190 27 268 214 14 74 95 200 358 14 155 196 343 500 14 333 32 373 255 1 85 231 200 428 1 149 358 340 500 +809 /data/VOCdevkit/VOC2007/JPEGImages/001632.jpg 500 375 12 11 103 450 371 +810 /data/VOCdevkit/VOC2007/JPEGImages/001633.jpg 500 375 10 71 177 419 373 8 206 210 388 374 8 116 165 263 364 +811 /data/VOCdevkit/VOC2007/JPEGImages/001636.jpg 500 375 1 59 123 121 216 +812 /data/VOCdevkit/VOC2007/JPEGImages/001638.jpg 500 333 0 187 83 337 236 +813 /data/VOCdevkit/VOC2007/JPEGImages/001640.jpg 500 375 6 47 23 461 358 6 451 75 500 127 14 413 39 441 131 6 397 52 460 106 +814 /data/VOCdevkit/VOC2007/JPEGImages/001642.jpg 381 463 11 11 2 331 463 +815 /data/VOCdevkit/VOC2007/JPEGImages/001643.jpg 500 333 11 1 42 472 323 +816 /data/VOCdevkit/VOC2007/JPEGImages/001647.jpg 375 500 2 1 231 227 500 +817 /data/VOCdevkit/VOC2007/JPEGImages/001649.jpg 444 500 14 12 53 438 499 +818 /data/VOCdevkit/VOC2007/JPEGImages/001650.jpg 500 333 19 109 146 161 192 17 380 204 500 333 8 309 171 450 272 +819 /data/VOCdevkit/VOC2007/JPEGImages/001651.jpg 375 500 14 63 121 342 500 8 241 274 364 500 +820 /data/VOCdevkit/VOC2007/JPEGImages/001653.jpg 500 375 18 178 119 346 302 18 1 95 156 351 +821 /data/VOCdevkit/VOC2007/JPEGImages/001654.jpg 500 375 1 28 169 86 248 1 137 164 303 303 1 253 187 433 316 14 274 100 402 275 14 145 66 284 266 14 28 121 85 214 14 117 131 167 259 +822 /data/VOCdevkit/VOC2007/JPEGImages/001661.jpg 500 375 16 107 199 330 374 +823 /data/VOCdevkit/VOC2007/JPEGImages/001662.jpg 500 375 6 11 106 482 269 +824 /data/VOCdevkit/VOC2007/JPEGImages/001669.jpg 375 500 7 21 75 364 337 +825 /data/VOCdevkit/VOC2007/JPEGImages/001673.jpg 500 375 7 36 110 440 319 4 418 1 482 131 +826 /data/VOCdevkit/VOC2007/JPEGImages/001675.jpg 500 333 11 29 25 458 330 +827 /data/VOCdevkit/VOC2007/JPEGImages/001676.jpg 500 236 6 30 38 483 219 +828 /data/VOCdevkit/VOC2007/JPEGImages/001677.jpg 500 375 10 110 269 500 375 8 52 230 140 375 +829 /data/VOCdevkit/VOC2007/JPEGImages/001678.jpg 500 333 19 373 102 500 228 19 252 109 349 200 14 107 192 256 333 +830 /data/VOCdevkit/VOC2007/JPEGImages/001680.jpg 375 500 11 91 104 331 500 +831 /data/VOCdevkit/VOC2007/JPEGImages/001682.jpg 500 333 14 3 86 372 333 14 34 11 500 330 4 302 60 500 316 +832 /data/VOCdevkit/VOC2007/JPEGImages/001683.jpg 500 375 8 364 207 403 284 8 323 206 362 280 8 285 206 323 287 8 244 208 288 289 10 224 213 430 279 8 392 200 431 279 +833 /data/VOCdevkit/VOC2007/JPEGImages/001684.jpg 500 422 2 17 6 465 422 +834 /data/VOCdevkit/VOC2007/JPEGImages/001685.jpg 500 375 2 329 96 468 340 2 118 87 337 372 +835 /data/VOCdevkit/VOC2007/JPEGImages/001686.jpg 375 500 14 112 168 206 500 +836 /data/VOCdevkit/VOC2007/JPEGImages/001688.jpg 500 375 13 61 11 415 373 +837 /data/VOCdevkit/VOC2007/JPEGImages/001689.jpg 375 500 14 122 86 227 376 14 1 183 203 500 8 60 238 158 367 +838 /data/VOCdevkit/VOC2007/JPEGImages/001690.jpg 500 332 14 333 55 405 286 12 40 101 182 292 +839 /data/VOCdevkit/VOC2007/JPEGImages/001691.jpg 500 375 5 388 2 500 124 5 273 1 390 78 5 82 2 189 63 14 455 23 480 99 14 323 29 349 98 14 233 32 258 85 14 207 29 230 82 14 190 46 208 82 14 130 32 153 66 14 59 27 79 65 14 77 18 97 64 14 48 26 61 67 14 35 29 54 68 14 1 18 19 69 14 16 20 37 70 +840 /data/VOCdevkit/VOC2007/JPEGImages/001693.jpg 500 333 6 2 93 458 312 +841 /data/VOCdevkit/VOC2007/JPEGImages/001699.jpg 500 332 12 43 56 424 332 6 2 115 57 182 +842 /data/VOCdevkit/VOC2007/JPEGImages/001707.jpg 426 500 2 10 130 378 499 +843 /data/VOCdevkit/VOC2007/JPEGImages/001708.jpg 500 369 0 6 93 498 245 +844 /data/VOCdevkit/VOC2007/JPEGImages/001711.jpg 500 375 14 312 1 430 153 14 3 1 41 209 14 35 1 72 89 14 418 170 447 218 14 411 174 428 194 14 389 181 424 228 14 216 117 250 165 +845 /data/VOCdevkit/VOC2007/JPEGImages/001713.jpg 500 435 9 35 64 479 356 +846 /data/VOCdevkit/VOC2007/JPEGImages/001714.jpg 332 500 16 127 302 208 357 +847 /data/VOCdevkit/VOC2007/JPEGImages/001717.jpg 500 404 19 1 111 58 169 14 371 160 476 404 14 227 99 365 404 8 146 207 263 366 +848 /data/VOCdevkit/VOC2007/JPEGImages/001718.jpg 500 333 11 97 14 439 333 +849 /data/VOCdevkit/VOC2007/JPEGImages/001721.jpg 500 341 14 229 169 383 341 14 229 193 309 324 14 371 223 401 273 +850 /data/VOCdevkit/VOC2007/JPEGImages/001723.jpg 333 500 13 82 192 308 476 14 78 11 309 372 +851 /data/VOCdevkit/VOC2007/JPEGImages/001724.jpg 275 315 12 35 15 219 302 +852 /data/VOCdevkit/VOC2007/JPEGImages/001725.jpg 375 500 19 267 39 375 224 19 315 217 375 411 19 255 401 375 500 14 1 113 285 390 +853 /data/VOCdevkit/VOC2007/JPEGImages/001726.jpg 500 375 1 369 223 438 259 14 387 194 429 255 +854 /data/VOCdevkit/VOC2007/JPEGImages/001727.jpg 480 318 12 1 41 305 317 12 123 15 413 317 +855 /data/VOCdevkit/VOC2007/JPEGImages/001729.jpg 500 333 15 119 4 217 96 14 284 107 411 280 14 126 83 257 285 14 9 167 160 333 8 371 63 500 332 +856 /data/VOCdevkit/VOC2007/JPEGImages/001730.jpg 500 375 12 214 110 376 323 14 269 36 341 203 14 162 84 239 368 +857 /data/VOCdevkit/VOC2007/JPEGImages/001732.jpg 500 332 3 33 171 118 225 3 172 143 242 189 3 327 123 380 159 3 369 150 442 196 3 348 191 444 289 +858 /data/VOCdevkit/VOC2007/JPEGImages/001733.jpg 500 500 16 1 270 82 329 16 236 275 294 326 16 180 275 235 365 +859 /data/VOCdevkit/VOC2007/JPEGImages/001734.jpg 500 375 16 100 84 441 313 +860 /data/VOCdevkit/VOC2007/JPEGImages/001738.jpg 500 375 11 125 68 323 300 +861 /data/VOCdevkit/VOC2007/JPEGImages/001739.jpg 333 500 2 149 178 214 317 +862 /data/VOCdevkit/VOC2007/JPEGImages/001741.jpg 400 254 9 1 111 115 251 9 332 133 375 156 +863 /data/VOCdevkit/VOC2007/JPEGImages/001746.jpg 500 375 6 1 236 153 301 17 308 224 374 256 +864 /data/VOCdevkit/VOC2007/JPEGImages/001747.jpg 500 375 7 92 4 383 375 +865 /data/VOCdevkit/VOC2007/JPEGImages/001749.jpg 375 500 14 24 26 333 498 +866 /data/VOCdevkit/VOC2007/JPEGImages/001750.jpg 500 333 16 250 71 335 134 16 174 88 252 157 16 107 31 155 100 16 402 16 464 53 16 256 185 344 249 16 172 188 256 249 16 340 219 405 272 16 404 221 467 277 16 115 211 157 273 +867 /data/VOCdevkit/VOC2007/JPEGImages/001752.jpg 375 500 19 3 4 375 500 +868 /data/VOCdevkit/VOC2007/JPEGImages/001754.jpg 375 500 4 220 304 277 486 14 15 54 275 494 15 4 132 55 174 +869 /data/VOCdevkit/VOC2007/JPEGImages/001755.jpg 500 333 7 61 17 500 333 +870 /data/VOCdevkit/VOC2007/JPEGImages/001756.jpg 375 500 4 132 303 175 447 14 256 104 363 415 14 5 33 262 453 +871 /data/VOCdevkit/VOC2007/JPEGImages/001758.jpg 374 500 14 4 108 232 500 +872 /data/VOCdevkit/VOC2007/JPEGImages/001759.jpg 500 375 11 2 153 197 375 14 160 114 366 375 14 298 2 500 375 14 1 3 300 181 +873 /data/VOCdevkit/VOC2007/JPEGImages/001761.jpg 500 333 0 27 87 500 273 +874 /data/VOCdevkit/VOC2007/JPEGImages/001765.jpg 500 375 13 75 7 387 353 +875 /data/VOCdevkit/VOC2007/JPEGImages/001766.jpg 500 375 14 394 28 422 98 14 361 8 381 91 14 342 8 362 85 14 278 2 308 70 14 117 72 188 177 14 222 84 270 173 14 27 240 99 329 14 56 309 126 375 12 181 101 337 288 12 111 87 213 259 12 1 239 216 375 12 121 300 227 375 +876 /data/VOCdevkit/VOC2007/JPEGImages/001768.jpg 375 500 7 1 63 261 344 +877 /data/VOCdevkit/VOC2007/JPEGImages/001771.jpg 500 375 8 61 53 188 218 8 228 2 336 120 8 355 67 496 218 +878 /data/VOCdevkit/VOC2007/JPEGImages/001772.jpg 374 500 14 246 195 306 294 +879 /data/VOCdevkit/VOC2007/JPEGImages/001775.jpg 500 333 18 218 101 325 291 14 97 229 113 294 +880 /data/VOCdevkit/VOC2007/JPEGImages/001777.jpg 500 334 4 395 46 443 198 10 5 99 497 334 4 398 114 434 219 +881 /data/VOCdevkit/VOC2007/JPEGImages/001778.jpg 500 375 11 97 39 404 284 +882 /data/VOCdevkit/VOC2007/JPEGImages/001780.jpg 500 333 13 152 75 395 255 6 232 3 500 165 6 1 26 119 166 +883 /data/VOCdevkit/VOC2007/JPEGImages/001782.jpg 500 429 2 74 67 500 429 +884 /data/VOCdevkit/VOC2007/JPEGImages/001784.jpg 500 335 14 192 2 500 335 +885 /data/VOCdevkit/VOC2007/JPEGImages/001785.jpg 500 333 14 62 1 500 332 +886 /data/VOCdevkit/VOC2007/JPEGImages/001787.jpg 500 375 2 147 101 277 347 +887 /data/VOCdevkit/VOC2007/JPEGImages/001789.jpg 500 375 18 1 84 159 288 18 197 98 323 256 18 363 73 500 260 14 359 206 386 278 14 357 234 477 375 +888 /data/VOCdevkit/VOC2007/JPEGImages/001793.jpg 375 500 14 62 130 275 347 14 152 70 375 500 +889 /data/VOCdevkit/VOC2007/JPEGImages/001795.jpg 500 375 14 178 141 301 281 +890 /data/VOCdevkit/VOC2007/JPEGImages/001797.jpg 500 375 17 1 1 499 372 14 5 4 265 375 14 176 35 346 255 +891 /data/VOCdevkit/VOC2007/JPEGImages/001799.jpg 500 392 14 40 69 261 354 14 15 13 90 266 14 412 89 500 355 14 13 287 143 391 +892 /data/VOCdevkit/VOC2007/JPEGImages/001800.jpg 375 500 14 84 72 242 371 +893 /data/VOCdevkit/VOC2007/JPEGImages/001801.jpg 500 375 13 310 194 404 291 13 176 175 291 324 13 118 174 160 235 14 323 156 389 235 14 194 143 257 280 14 125 151 157 214 6 1 163 60 219 6 319 174 435 229 6 1 206 43 365 +894 /data/VOCdevkit/VOC2007/JPEGImages/001806.jpg 328 500 9 274 192 328 361 9 114 266 180 376 14 60 213 162 382 14 117 157 209 375 +895 /data/VOCdevkit/VOC2007/JPEGImages/001807.jpg 500 333 12 290 115 411 224 12 201 136 296 216 12 54 105 196 192 14 330 100 363 194 14 238 103 267 185 14 113 85 150 169 +896 /data/VOCdevkit/VOC2007/JPEGImages/001809.jpg 436 500 19 9 252 85 367 14 19 273 78 341 +897 /data/VOCdevkit/VOC2007/JPEGImages/001810.jpg 500 375 19 261 170 364 268 14 1 51 236 375 +898 /data/VOCdevkit/VOC2007/JPEGImages/001816.jpg 500 375 7 1 36 369 250 +899 /data/VOCdevkit/VOC2007/JPEGImages/001818.jpg 500 332 2 113 3 500 332 +900 /data/VOCdevkit/VOC2007/JPEGImages/001821.jpg 500 375 6 92 125 362 248 +901 /data/VOCdevkit/VOC2007/JPEGImages/001825.jpg 500 375 7 1 39 403 300 +902 /data/VOCdevkit/VOC2007/JPEGImages/001827.jpg 500 375 19 176 110 240 188 +903 /data/VOCdevkit/VOC2007/JPEGImages/001828.jpg 333 500 8 35 1 304 238 14 2 33 289 445 14 38 123 298 440 +904 /data/VOCdevkit/VOC2007/JPEGImages/001830.jpg 373 500 14 38 47 265 491 +905 /data/VOCdevkit/VOC2007/JPEGImages/001832.jpg 500 375 14 1 1 500 375 11 1 78 416 375 +906 /data/VOCdevkit/VOC2007/JPEGImages/001833.jpg 500 375 1 164 184 331 370 14 171 83 309 300 +907 /data/VOCdevkit/VOC2007/JPEGImages/001834.jpg 500 334 10 46 39 456 304 +908 /data/VOCdevkit/VOC2007/JPEGImages/001836.jpg 500 375 17 2 81 462 375 14 57 78 320 365 +909 /data/VOCdevkit/VOC2007/JPEGImages/001837.jpg 375 500 14 32 187 54 229 14 332 199 375 330 14 64 193 248 487 8 49 301 261 500 +910 /data/VOCdevkit/VOC2007/JPEGImages/001840.jpg 500 375 7 128 174 321 296 +911 /data/VOCdevkit/VOC2007/JPEGImages/001841.jpg 375 500 14 2 220 278 500 +912 /data/VOCdevkit/VOC2007/JPEGImages/001842.jpg 500 379 0 98 133 498 215 0 1 158 164 217 +913 /data/VOCdevkit/VOC2007/JPEGImages/001843.jpg 500 375 4 299 185 323 276 14 252 35 445 375 14 62 17 273 375 +914 /data/VOCdevkit/VOC2007/JPEGImages/001845.jpg 500 375 6 27 177 230 343 6 3 194 37 266 +915 /data/VOCdevkit/VOC2007/JPEGImages/001847.jpg 500 370 3 32 245 246 351 3 73 170 470 357 +916 /data/VOCdevkit/VOC2007/JPEGImages/001849.jpg 500 375 14 100 126 284 375 14 260 162 408 375 14 360 218 422 308 14 419 225 472 328 +917 /data/VOCdevkit/VOC2007/JPEGImages/001853.jpg 500 375 2 202 63 343 286 +918 /data/VOCdevkit/VOC2007/JPEGImages/001854.jpg 333 499 14 52 38 277 499 +919 /data/VOCdevkit/VOC2007/JPEGImages/001855.jpg 500 375 2 314 209 491 349 +920 /data/VOCdevkit/VOC2007/JPEGImages/001858.jpg 500 333 0 17 99 475 216 +921 /data/VOCdevkit/VOC2007/JPEGImages/001860.jpg 400 285 8 133 29 339 262 2 139 40 172 71 +922 /data/VOCdevkit/VOC2007/JPEGImages/001861.jpg 500 363 1 8 190 457 363 14 66 9 484 363 +923 /data/VOCdevkit/VOC2007/JPEGImages/001862.jpg 500 375 6 245 33 291 65 6 57 61 436 375 +924 /data/VOCdevkit/VOC2007/JPEGImages/001864.jpg 500 375 8 403 214 500 333 14 218 60 381 375 14 91 83 216 375 14 61 55 249 375 +925 /data/VOCdevkit/VOC2007/JPEGImages/001870.jpg 400 400 0 4 16 400 400 +926 /data/VOCdevkit/VOC2007/JPEGImages/001872.jpg 500 375 16 153 22 355 342 +927 /data/VOCdevkit/VOC2007/JPEGImages/001875.jpg 500 375 19 36 138 143 234 +928 /data/VOCdevkit/VOC2007/JPEGImages/001877.jpg 500 333 6 1 53 498 308 +929 /data/VOCdevkit/VOC2007/JPEGImages/001878.jpg 500 375 17 2 1 500 346 +930 /data/VOCdevkit/VOC2007/JPEGImages/001881.jpg 500 375 6 62 77 456 357 6 1 77 117 203 6 381 76 495 120 +931 /data/VOCdevkit/VOC2007/JPEGImages/001882.jpg 500 333 17 5 103 210 223 8 291 163 398 273 +932 /data/VOCdevkit/VOC2007/JPEGImages/001887.jpg 500 375 8 428 248 450 298 8 329 274 366 326 8 226 304 267 370 8 344 251 378 296 8 288 294 326 347 10 365 246 411 292 10 147 313 222 371 14 255 241 285 334 14 95 302 167 375 14 205 298 235 372 14 185 273 217 319 14 287 273 339 345 14 384 242 415 296 14 477 195 500 273 14 400 227 436 297 +933 /data/VOCdevkit/VOC2007/JPEGImages/001888.jpg 375 500 7 78 32 276 413 +934 /data/VOCdevkit/VOC2007/JPEGImages/001892.jpg 500 375 5 4 3 500 373 +935 /data/VOCdevkit/VOC2007/JPEGImages/001894.jpg 500 375 14 2 2 238 375 12 211 2 500 375 +936 /data/VOCdevkit/VOC2007/JPEGImages/001896.jpg 500 375 2 280 59 422 371 +937 /data/VOCdevkit/VOC2007/JPEGImages/001898.jpg 374 500 15 1 101 58 171 15 69 106 140 178 +938 /data/VOCdevkit/VOC2007/JPEGImages/001899.jpg 500 332 6 397 195 478 243 6 298 195 335 227 6 108 212 147 238 6 22 209 48 226 13 167 206 225 289 14 174 177 225 267 +939 /data/VOCdevkit/VOC2007/JPEGImages/001901.jpg 375 500 8 192 261 247 390 8 233 258 308 400 10 238 266 312 413 +940 /data/VOCdevkit/VOC2007/JPEGImages/001902.jpg 500 375 5 256 147 500 274 6 341 207 500 375 6 196 224 233 251 14 139 223 150 266 14 120 223 135 265 14 104 226 119 266 14 81 219 100 263 +941 /data/VOCdevkit/VOC2007/JPEGImages/001903.jpg 500 333 13 93 142 358 333 1 290 148 351 177 14 104 74 258 310 +942 /data/VOCdevkit/VOC2007/JPEGImages/001904.jpg 500 335 14 371 107 470 284 14 201 114 422 335 14 130 117 210 246 14 40 126 132 236 14 1 55 55 285 14 199 69 391 335 +943 /data/VOCdevkit/VOC2007/JPEGImages/001906.jpg 500 301 7 103 147 393 272 +944 /data/VOCdevkit/VOC2007/JPEGImages/001907.jpg 500 375 18 3 76 485 295 +945 /data/VOCdevkit/VOC2007/JPEGImages/001911.jpg 500 333 0 254 123 400 213 +946 /data/VOCdevkit/VOC2007/JPEGImages/001915.jpg 500 375 2 22 220 87 265 +947 /data/VOCdevkit/VOC2007/JPEGImages/001918.jpg 500 375 14 291 184 368 375 14 362 186 449 375 +948 /data/VOCdevkit/VOC2007/JPEGImages/001920.jpg 500 375 14 33 28 337 321 19 322 4 456 114 +949 /data/VOCdevkit/VOC2007/JPEGImages/001922.jpg 500 400 0 65 75 470 269 +950 /data/VOCdevkit/VOC2007/JPEGImages/001927.jpg 500 332 12 15 92 318 274 14 284 55 349 274 +951 /data/VOCdevkit/VOC2007/JPEGImages/001928.jpg 500 500 13 7 82 404 419 +952 /data/VOCdevkit/VOC2007/JPEGImages/001930.jpg 500 346 18 335 113 390 181 18 79 73 217 203 14 220 126 314 327 +953 /data/VOCdevkit/VOC2007/JPEGImages/001931.jpg 500 333 6 44 114 489 288 +954 /data/VOCdevkit/VOC2007/JPEGImages/001932.jpg 500 373 14 168 2 453 325 14 2 120 92 371 8 74 2 217 145 +955 /data/VOCdevkit/VOC2007/JPEGImages/001933.jpg 500 375 2 70 43 399 319 +956 /data/VOCdevkit/VOC2007/JPEGImages/001934.jpg 322 291 7 36 55 239 262 +957 /data/VOCdevkit/VOC2007/JPEGImages/001936.jpg 500 333 0 84 185 134 208 0 202 153 255 178 0 249 189 298 211 +958 /data/VOCdevkit/VOC2007/JPEGImages/001937.jpg 375 500 6 11 211 332 433 +959 /data/VOCdevkit/VOC2007/JPEGImages/001938.jpg 500 375 14 3 3 500 375 +960 /data/VOCdevkit/VOC2007/JPEGImages/001940.jpg 333 500 7 1 163 328 500 11 17 12 313 182 +961 /data/VOCdevkit/VOC2007/JPEGImages/001941.jpg 500 375 13 118 46 500 310 14 291 2 472 272 +962 /data/VOCdevkit/VOC2007/JPEGImages/001944.jpg 500 375 6 32 57 464 366 6 273 61 500 276 14 257 57 334 141 14 244 57 279 114 14 1 70 35 243 +963 /data/VOCdevkit/VOC2007/JPEGImages/001945.jpg 318 480 14 69 108 238 331 12 93 161 221 477 +964 /data/VOCdevkit/VOC2007/JPEGImages/001948.jpg 500 333 13 65 52 398 306 +965 /data/VOCdevkit/VOC2007/JPEGImages/001950.jpg 500 375 14 153 240 170 291 14 335 344 354 375 14 187 340 209 375 14 157 339 176 375 +966 /data/VOCdevkit/VOC2007/JPEGImages/001952.jpg 500 397 2 26 26 475 372 +967 /data/VOCdevkit/VOC2007/JPEGImages/001954.jpg 500 375 6 18 54 166 194 6 1 37 82 372 6 118 119 337 251 +968 /data/VOCdevkit/VOC2007/JPEGImages/001958.jpg 500 375 14 46 71 128 202 14 86 92 176 214 14 153 85 196 202 14 156 160 249 356 14 99 156 185 363 14 231 208 389 375 14 244 174 297 265 14 350 92 430 365 14 297 87 360 322 14 240 103 308 221 14 191 85 266 204 14 245 78 305 118 14 329 83 372 120 +969 /data/VOCdevkit/VOC2007/JPEGImages/001960.jpg 329 500 12 108 138 264 332 +970 /data/VOCdevkit/VOC2007/JPEGImages/001962.jpg 500 333 5 407 99 500 333 +971 /data/VOCdevkit/VOC2007/JPEGImages/001963.jpg 500 375 14 157 83 337 310 14 1 103 98 337 4 246 238 276 344 4 10 248 40 355 4 243 129 272 236 4 242 19 272 124 10 5 283 499 375 +972 /data/VOCdevkit/VOC2007/JPEGImages/001964.jpg 500 375 2 366 50 413 89 2 318 71 362 104 +973 /data/VOCdevkit/VOC2007/JPEGImages/001970.jpg 500 375 4 139 2 358 355 +974 /data/VOCdevkit/VOC2007/JPEGImages/001971.jpg 500 375 7 139 71 499 266 +975 /data/VOCdevkit/VOC2007/JPEGImages/001972.jpg 333 500 11 18 76 291 415 +976 /data/VOCdevkit/VOC2007/JPEGImages/001976.jpg 500 383 3 171 89 376 143 +977 /data/VOCdevkit/VOC2007/JPEGImages/001977.jpg 500 310 14 180 48 481 234 +978 /data/VOCdevkit/VOC2007/JPEGImages/001978.jpg 500 334 14 139 151 210 321 14 355 130 411 315 8 134 194 166 268 +979 /data/VOCdevkit/VOC2007/JPEGImages/001980.jpg 500 375 14 218 52 500 375 14 164 18 500 375 6 17 181 135 267 +980 /data/VOCdevkit/VOC2007/JPEGImages/001981.jpg 500 375 7 36 1 329 273 +981 /data/VOCdevkit/VOC2007/JPEGImages/001982.jpg 500 375 7 85 50 379 348 +982 /data/VOCdevkit/VOC2007/JPEGImages/001985.jpg 333 500 11 81 92 238 486 +983 /data/VOCdevkit/VOC2007/JPEGImages/001989.jpg 500 375 14 419 203 433 246 14 24 216 44 263 14 1 215 19 319 14 66 94 445 375 +984 /data/VOCdevkit/VOC2007/JPEGImages/001995.jpg 375 500 8 92 35 281 250 +985 /data/VOCdevkit/VOC2007/JPEGImages/001999.jpg 500 375 8 391 74 460 153 14 84 54 262 375 8 174 87 234 165 +986 /data/VOCdevkit/VOC2007/JPEGImages/002000.jpg 500 375 3 371 215 411 267 14 33 195 131 375 +987 /data/VOCdevkit/VOC2007/JPEGImages/002001.jpg 500 375 0 280 71 312 90 0 170 110 206 128 0 183 190 216 204 0 189 206 223 221 0 249 190 283 204 +988 /data/VOCdevkit/VOC2007/JPEGImages/002002.jpg 500 375 8 24 163 97 265 +989 /data/VOCdevkit/VOC2007/JPEGImages/002004.jpg 375 500 19 37 111 190 275 19 204 157 322 301 19 5 279 103 419 +990 /data/VOCdevkit/VOC2007/JPEGImages/002006.jpg 500 375 7 1 3 475 375 +991 /data/VOCdevkit/VOC2007/JPEGImages/002011.jpg 500 375 11 26 88 498 351 +992 /data/VOCdevkit/VOC2007/JPEGImages/002012.jpg 375 500 14 135 128 167 255 14 156 118 195 245 +993 /data/VOCdevkit/VOC2007/JPEGImages/002015.jpg 500 375 15 8 89 124 310 15 60 25 252 292 15 137 92 281 352 15 311 3 500 331 15 247 3 395 294 +994 /data/VOCdevkit/VOC2007/JPEGImages/002019.jpg 500 333 6 43 82 500 298 +995 /data/VOCdevkit/VOC2007/JPEGImages/002020.jpg 500 333 2 35 80 418 305 +996 /data/VOCdevkit/VOC2007/JPEGImages/002021.jpg 500 333 9 26 91 229 278 9 175 39 500 277 9 174 189 270 312 +997 /data/VOCdevkit/VOC2007/JPEGImages/002022.jpg 500 333 13 64 49 477 274 13 305 40 499 174 14 170 2 223 107 14 68 1 141 157 14 259 1 321 120 +998 /data/VOCdevkit/VOC2007/JPEGImages/002023.jpg 500 362 6 27 47 483 300 +999 /data/VOCdevkit/VOC2007/JPEGImages/002024.jpg 500 375 5 337 124 500 273 5 104 88 343 301 5 1 109 71 297 14 174 160 207 199 +1000 /data/VOCdevkit/VOC2007/JPEGImages/002025.jpg 375 500 8 204 297 332 500 10 236 318 375 500 +1001 /data/VOCdevkit/VOC2007/JPEGImages/002027.jpg 500 375 5 270 278 357 295 +1002 /data/VOCdevkit/VOC2007/JPEGImages/002030.jpg 500 375 14 101 151 151 188 14 183 150 226 202 14 437 1 500 374 14 1 68 207 375 14 199 101 383 304 14 316 110 468 246 4 309 256 365 375 4 274 229 313 322 4 472 199 493 265 +1003 /data/VOCdevkit/VOC2007/JPEGImages/002034.jpg 500 288 7 8 122 207 288 11 272 69 474 199 +1004 /data/VOCdevkit/VOC2007/JPEGImages/002036.jpg 500 325 18 234 123 383 175 +1005 /data/VOCdevkit/VOC2007/JPEGImages/002037.jpg 500 375 2 100 89 402 367 +1006 /data/VOCdevkit/VOC2007/JPEGImages/002039.jpg 500 332 3 246 87 284 175 +1007 /data/VOCdevkit/VOC2007/JPEGImages/002042.jpg 480 360 12 75 182 260 360 +1008 /data/VOCdevkit/VOC2007/JPEGImages/002043.jpg 454 500 12 38 12 364 497 +1009 /data/VOCdevkit/VOC2007/JPEGImages/002045.jpg 500 379 6 24 43 475 335 6 362 80 500 169 +1010 /data/VOCdevkit/VOC2007/JPEGImages/002047.jpg 500 375 17 210 225 295 285 +1011 /data/VOCdevkit/VOC2007/JPEGImages/002049.jpg 500 315 15 205 6 473 163 15 26 80 334 290 +1012 /data/VOCdevkit/VOC2007/JPEGImages/002051.jpg 333 500 14 1 2 333 500 2 2 15 195 500 +1013 /data/VOCdevkit/VOC2007/JPEGImages/002054.jpg 500 414 18 6 51 498 400 +1014 /data/VOCdevkit/VOC2007/JPEGImages/002055.jpg 500 375 11 15 248 151 368 14 64 146 229 375 +1015 /data/VOCdevkit/VOC2007/JPEGImages/002056.jpg 375 500 5 93 139 303 402 6 331 260 375 381 +1016 /data/VOCdevkit/VOC2007/JPEGImages/002058.jpg 500 333 7 111 67 500 239 +1017 /data/VOCdevkit/VOC2007/JPEGImages/002061.jpg 500 375 17 118 2 340 120 10 1 167 493 374 14 78 46 194 221 14 210 96 467 298 +1018 /data/VOCdevkit/VOC2007/JPEGImages/002063.jpg 375 500 10 50 268 375 500 8 11 249 124 473 8 39 270 193 500 8 250 403 375 500 +1019 /data/VOCdevkit/VOC2007/JPEGImages/002064.jpg 500 375 1 20 61 472 331 +1020 /data/VOCdevkit/VOC2007/JPEGImages/002067.jpg 500 333 7 172 40 398 321 +1021 /data/VOCdevkit/VOC2007/JPEGImages/002068.jpg 500 335 18 231 113 372 196 +1022 /data/VOCdevkit/VOC2007/JPEGImages/002069.jpg 500 375 1 132 179 227 341 1 5 156 117 265 1 23 181 92 328 1 376 202 482 372 1 270 174 323 311 1 291 197 383 337 14 132 44 245 337 14 8 90 113 315 14 69 73 104 213 14 100 68 142 258 14 266 78 344 305 14 306 92 402 332 14 381 84 486 361 +1023 /data/VOCdevkit/VOC2007/JPEGImages/002070.jpg 500 189 17 8 32 493 173 +1024 /data/VOCdevkit/VOC2007/JPEGImages/002082.jpg 500 302 13 82 120 230 267 14 98 36 203 242 +1025 /data/VOCdevkit/VOC2007/JPEGImages/002083.jpg 500 375 18 164 127 316 221 +1026 /data/VOCdevkit/VOC2007/JPEGImages/002086.jpg 500 375 19 281 78 405 179 19 31 134 139 237 +1027 /data/VOCdevkit/VOC2007/JPEGImages/002088.jpg 500 332 9 1 30 470 332 +1028 /data/VOCdevkit/VOC2007/JPEGImages/002090.jpg 400 300 14 110 44 312 300 8 181 165 265 300 +1029 /data/VOCdevkit/VOC2007/JPEGImages/002091.jpg 500 375 3 1 1 493 357 14 316 117 366 209 14 186 127 220 206 14 48 146 93 216 14 1 184 26 257 +1030 /data/VOCdevkit/VOC2007/JPEGImages/002094.jpg 500 332 2 72 1 335 331 +1031 /data/VOCdevkit/VOC2007/JPEGImages/002095.jpg 293 383 7 5 21 289 380 +1032 /data/VOCdevkit/VOC2007/JPEGImages/002096.jpg 334 500 14 46 45 270 500 +1033 /data/VOCdevkit/VOC2007/JPEGImages/002098.jpg 500 375 4 383 22 468 209 4 174 5 239 205 +1034 /data/VOCdevkit/VOC2007/JPEGImages/002099.jpg 500 375 0 1 92 500 331 +1035 /data/VOCdevkit/VOC2007/JPEGImages/002101.jpg 333 500 11 142 360 333 487 +1036 /data/VOCdevkit/VOC2007/JPEGImages/002102.jpg 500 283 2 36 57 486 261 +1037 /data/VOCdevkit/VOC2007/JPEGImages/002104.jpg 500 332 14 224 16 380 330 13 38 82 478 302 +1038 /data/VOCdevkit/VOC2007/JPEGImages/002108.jpg 500 375 14 29 115 155 260 14 141 114 245 243 14 279 129 351 222 14 337 131 409 216 10 1 200 500 375 15 262 262 306 305 15 319 261 357 307 15 343 248 377 291 +1039 /data/VOCdevkit/VOC2007/JPEGImages/002109.jpg 400 300 7 137 72 290 182 +1040 /data/VOCdevkit/VOC2007/JPEGImages/002112.jpg 375 500 4 136 2 375 500 +1041 /data/VOCdevkit/VOC2007/JPEGImages/002114.jpg 500 375 14 324 159 397 375 14 311 100 358 169 18 34 1 500 375 +1042 /data/VOCdevkit/VOC2007/JPEGImages/002116.jpg 500 375 11 177 206 425 373 17 235 126 424 263 17 33 103 231 238 6 177 41 258 72 15 36 1 131 221 +1043 /data/VOCdevkit/VOC2007/JPEGImages/002117.jpg 375 500 19 129 3 269 95 11 79 281 202 451 14 69 83 224 321 11 106 128 250 297 14 280 75 375 408 +1044 /data/VOCdevkit/VOC2007/JPEGImages/002120.jpg 500 335 2 228 35 347 90 14 64 24 496 334 +1045 /data/VOCdevkit/VOC2007/JPEGImages/002124.jpg 500 333 17 333 217 476 333 8 266 174 355 277 19 80 171 139 223 +1046 /data/VOCdevkit/VOC2007/JPEGImages/002125.jpg 500 375 6 58 154 467 310 +1047 /data/VOCdevkit/VOC2007/JPEGImages/002126.jpg 500 375 9 220 2 500 375 +1048 /data/VOCdevkit/VOC2007/JPEGImages/002129.jpg 500 379 0 106 50 256 122 0 110 95 280 176 0 126 142 323 236 0 167 194 408 313 +1049 /data/VOCdevkit/VOC2007/JPEGImages/002132.jpg 500 375 19 184 155 306 249 +1050 /data/VOCdevkit/VOC2007/JPEGImages/002134.jpg 500 375 6 1 61 484 342 +1051 /data/VOCdevkit/VOC2007/JPEGImages/002135.jpg 375 500 6 1 132 30 171 6 26 131 69 160 6 58 125 110 157 6 258 118 285 140 6 218 126 265 160 6 266 128 363 203 6 332 139 375 241 +1052 /data/VOCdevkit/VOC2007/JPEGImages/002136.jpg 500 375 2 76 71 491 305 +1053 /data/VOCdevkit/VOC2007/JPEGImages/002139.jpg 400 500 4 194 1 400 338 +1054 /data/VOCdevkit/VOC2007/JPEGImages/002140.jpg 375 500 11 39 86 256 215 +1055 /data/VOCdevkit/VOC2007/JPEGImages/002142.jpg 500 333 14 178 86 316 333 14 292 71 409 333 14 5 130 62 218 +1056 /data/VOCdevkit/VOC2007/JPEGImages/002145.jpg 340 500 7 125 199 272 389 14 58 60 285 500 +1057 /data/VOCdevkit/VOC2007/JPEGImages/002146.jpg 375 500 11 25 62 343 493 +1058 /data/VOCdevkit/VOC2007/JPEGImages/002151.jpg 375 500 7 29 1 305 327 +1059 /data/VOCdevkit/VOC2007/JPEGImages/002152.jpg 500 500 9 284 196 400 284 +1060 /data/VOCdevkit/VOC2007/JPEGImages/002153.jpg 500 375 6 83 166 375 291 +1061 /data/VOCdevkit/VOC2007/JPEGImages/002155.jpg 500 333 13 38 19 499 303 +1062 /data/VOCdevkit/VOC2007/JPEGImages/002156.jpg 500 375 8 114 213 223 370 8 226 206 323 349 8 394 193 465 278 8 15 200 118 355 8 468 191 500 238 10 33 167 300 305 14 334 100 399 285 +1063 /data/VOCdevkit/VOC2007/JPEGImages/002158.jpg 500 300 2 29 143 293 246 +1064 /data/VOCdevkit/VOC2007/JPEGImages/002163.jpg 500 375 14 76 91 460 352 +1065 /data/VOCdevkit/VOC2007/JPEGImages/002165.jpg 331 500 2 42 48 278 471 +1066 /data/VOCdevkit/VOC2007/JPEGImages/002166.jpg 500 337 18 14 74 481 317 +1067 /data/VOCdevkit/VOC2007/JPEGImages/002169.jpg 334 500 14 3 102 318 500 +1068 /data/VOCdevkit/VOC2007/JPEGImages/002170.jpg 500 375 6 148 261 379 344 6 378 246 500 316 14 54 236 82 322 +1069 /data/VOCdevkit/VOC2007/JPEGImages/002171.jpg 375 500 14 41 174 191 329 1 35 247 170 401 +1070 /data/VOCdevkit/VOC2007/JPEGImages/002172.jpg 500 375 13 263 273 320 347 14 270 244 313 320 14 126 262 176 354 +1071 /data/VOCdevkit/VOC2007/JPEGImages/002174.jpg 500 333 6 19 60 496 302 6 451 89 500 186 14 377 90 390 121 14 397 93 419 141 14 431 115 453 152 +1072 /data/VOCdevkit/VOC2007/JPEGImages/002176.jpg 500 404 17 79 92 500 404 14 96 29 465 389 +1073 /data/VOCdevkit/VOC2007/JPEGImages/002178.jpg 500 375 6 100 136 460 320 +1074 /data/VOCdevkit/VOC2007/JPEGImages/002179.jpg 500 375 15 6 8 487 373 +1075 /data/VOCdevkit/VOC2007/JPEGImages/002180.jpg 500 375 18 98 89 476 375 6 8 206 100 266 6 1 205 47 276 +1076 /data/VOCdevkit/VOC2007/JPEGImages/002181.jpg 500 375 8 367 1 468 156 +1077 /data/VOCdevkit/VOC2007/JPEGImages/002182.jpg 500 333 6 15 121 438 252 +1078 /data/VOCdevkit/VOC2007/JPEGImages/002183.jpg 500 327 12 2 139 412 327 14 33 1 183 327 +1079 /data/VOCdevkit/VOC2007/JPEGImages/002184.jpg 500 375 11 169 128 343 287 +1080 /data/VOCdevkit/VOC2007/JPEGImages/002186.jpg 500 375 14 233 158 297 255 8 300 35 351 117 8 204 37 263 140 +1081 /data/VOCdevkit/VOC2007/JPEGImages/002187.jpg 500 332 14 240 80 323 233 12 181 144 414 292 +1082 /data/VOCdevkit/VOC2007/JPEGImages/002190.jpg 500 333 12 174 156 305 312 12 153 90 230 222 14 422 173 474 231 14 181 3 250 126 14 240 97 326 306 14 1 103 40 291 +1083 /data/VOCdevkit/VOC2007/JPEGImages/002191.jpg 500 375 13 1 4 500 374 +1084 /data/VOCdevkit/VOC2007/JPEGImages/002192.jpg 500 375 15 19 75 102 372 15 191 46 365 333 +1085 /data/VOCdevkit/VOC2007/JPEGImages/002193.jpg 500 375 14 279 111 353 323 14 245 99 284 308 14 205 103 245 306 14 159 99 213 303 14 120 100 169 313 +1086 /data/VOCdevkit/VOC2007/JPEGImages/002194.jpg 500 333 8 294 188 391 300 14 81 107 155 278 14 127 117 177 283 14 295 126 464 305 14 377 144 464 268 +1087 /data/VOCdevkit/VOC2007/JPEGImages/002196.jpg 375 500 7 4 2 375 500 +1088 /data/VOCdevkit/VOC2007/JPEGImages/002197.jpg 500 375 6 1 116 330 336 6 335 131 500 209 +1089 /data/VOCdevkit/VOC2007/JPEGImages/002199.jpg 500 372 11 69 163 477 372 +1090 /data/VOCdevkit/VOC2007/JPEGImages/002201.jpg 500 375 5 4 23 498 374 +1091 /data/VOCdevkit/VOC2007/JPEGImages/002202.jpg 500 364 7 46 18 373 357 +1092 /data/VOCdevkit/VOC2007/JPEGImages/002208.jpg 500 375 3 135 92 500 361 3 1 84 347 242 +1093 /data/VOCdevkit/VOC2007/JPEGImages/002209.jpg 500 500 16 72 72 500 500 +1094 /data/VOCdevkit/VOC2007/JPEGImages/002212.jpg 500 334 2 42 72 459 247 +1095 /data/VOCdevkit/VOC2007/JPEGImages/002213.jpg 464 380 12 51 54 369 371 14 161 11 264 250 +1096 /data/VOCdevkit/VOC2007/JPEGImages/002214.jpg 500 375 18 191 80 323 280 14 188 149 203 227 14 384 181 402 206 +1097 /data/VOCdevkit/VOC2007/JPEGImages/002215.jpg 500 261 7 353 44 497 227 7 251 43 370 219 7 134 8 267 206 7 28 11 125 152 7 13 55 174 258 +1098 /data/VOCdevkit/VOC2007/JPEGImages/002218.jpg 500 327 11 237 51 484 178 11 242 130 444 317 11 68 84 246 235 8 3 3 493 327 +1099 /data/VOCdevkit/VOC2007/JPEGImages/002219.jpg 500 375 14 220 65 314 177 +1100 /data/VOCdevkit/VOC2007/JPEGImages/002220.jpg 500 375 14 1 41 180 371 14 121 39 365 375 14 305 76 500 375 +1101 /data/VOCdevkit/VOC2007/JPEGImages/002221.jpg 375 500 14 148 58 375 453 8 1 19 138 281 4 179 2 195 51 +1102 /data/VOCdevkit/VOC2007/JPEGImages/002224.jpg 500 375 14 282 189 376 264 14 103 128 338 323 14 1 39 268 374 +1103 /data/VOCdevkit/VOC2007/JPEGImages/002226.jpg 500 333 4 330 11 348 64 4 316 15 332 56 4 263 24 275 69 4 249 25 265 70 4 480 188 500 231 4 467 186 485 253 4 448 184 468 253 4 428 186 447 252 4 415 181 432 242 14 98 46 500 333 +1104 /data/VOCdevkit/VOC2007/JPEGImages/002228.jpg 500 375 5 78 177 106 197 +1105 /data/VOCdevkit/VOC2007/JPEGImages/002233.jpg 273 500 14 17 120 152 257 14 116 231 202 493 14 160 122 257 458 14 135 7 269 243 14 6 60 148 453 +1106 /data/VOCdevkit/VOC2007/JPEGImages/002234.jpg 500 375 3 110 150 415 250 3 1 83 136 166 +1107 /data/VOCdevkit/VOC2007/JPEGImages/002237.jpg 500 375 9 58 1 479 375 +1108 /data/VOCdevkit/VOC2007/JPEGImages/002238.jpg 500 327 12 240 129 305 246 14 235 91 300 231 +1109 /data/VOCdevkit/VOC2007/JPEGImages/002241.jpg 500 379 6 4 172 150 277 6 139 189 218 272 14 167 152 216 286 14 242 164 297 288 14 233 164 254 282 14 295 180 335 283 14 332 162 373 287 14 376 176 404 286 +1110 /data/VOCdevkit/VOC2007/JPEGImages/002244.jpg 500 333 6 317 215 465 292 6 107 227 145 259 6 144 233 201 266 14 214 220 236 269 14 468 224 484 269 +1111 /data/VOCdevkit/VOC2007/JPEGImages/002247.jpg 375 500 6 9 259 375 451 +1112 /data/VOCdevkit/VOC2007/JPEGImages/002248.jpg 500 375 6 65 2 500 301 +1113 /data/VOCdevkit/VOC2007/JPEGImages/002249.jpg 500 332 12 3 2 499 332 +1114 /data/VOCdevkit/VOC2007/JPEGImages/002251.jpg 500 375 17 2 25 500 375 +1115 /data/VOCdevkit/VOC2007/JPEGImages/002253.jpg 500 385 1 14 17 479 319 4 243 125 280 191 4 194 128 243 188 +1116 /data/VOCdevkit/VOC2007/JPEGImages/002255.jpg 392 336 0 87 70 311 269 +1117 /data/VOCdevkit/VOC2007/JPEGImages/002256.jpg 500 375 5 327 195 500 373 5 243 245 323 322 14 197 301 217 351 +1118 /data/VOCdevkit/VOC2007/JPEGImages/002257.jpg 500 375 1 222 220 299 347 +1119 /data/VOCdevkit/VOC2007/JPEGImages/002259.jpg 500 333 17 69 75 500 196 +1120 /data/VOCdevkit/VOC2007/JPEGImages/002260.jpg 500 330 13 107 61 447 287 +1121 /data/VOCdevkit/VOC2007/JPEGImages/002261.jpg 500 332 12 116 133 371 299 14 259 54 337 308 +1122 /data/VOCdevkit/VOC2007/JPEGImages/002263.jpg 500 375 16 121 1 395 246 +1123 /data/VOCdevkit/VOC2007/JPEGImages/002265.jpg 333 500 14 1 39 206 500 2 71 210 315 349 +1124 /data/VOCdevkit/VOC2007/JPEGImages/002266.jpg 500 373 0 231 251 458 346 0 5 118 499 258 +1125 /data/VOCdevkit/VOC2007/JPEGImages/002267.jpg 500 333 16 65 194 165 308 +1126 /data/VOCdevkit/VOC2007/JPEGImages/002268.jpg 500 375 11 65 256 242 354 7 288 186 378 249 17 6 188 493 375 +1127 /data/VOCdevkit/VOC2007/JPEGImages/002270.jpg 500 375 1 70 49 475 317 +1128 /data/VOCdevkit/VOC2007/JPEGImages/002272.jpg 500 375 1 1 227 341 375 14 1 3 341 375 +1129 /data/VOCdevkit/VOC2007/JPEGImages/002273.jpg 320 212 12 116 51 190 181 14 121 14 186 118 +1130 /data/VOCdevkit/VOC2007/JPEGImages/002276.jpg 500 333 2 55 56 439 326 +1131 /data/VOCdevkit/VOC2007/JPEGImages/002277.jpg 383 500 11 1 60 297 500 14 86 1 381 500 +1132 /data/VOCdevkit/VOC2007/JPEGImages/002278.jpg 500 375 5 8 76 486 312 +1133 /data/VOCdevkit/VOC2007/JPEGImages/002279.jpg 500 333 0 26 12 443 318 +1134 /data/VOCdevkit/VOC2007/JPEGImages/002280.jpg 500 351 19 401 180 500 287 +1135 /data/VOCdevkit/VOC2007/JPEGImages/002281.jpg 500 238 6 1 30 387 213 +1136 /data/VOCdevkit/VOC2007/JPEGImages/002284.jpg 375 500 15 120 19 216 116 15 176 48 234 125 15 169 121 240 243 15 110 278 250 493 +1137 /data/VOCdevkit/VOC2007/JPEGImages/002285.jpg 500 333 14 129 84 352 316 +1138 /data/VOCdevkit/VOC2007/JPEGImages/002287.jpg 500 375 4 267 114 327 260 11 11 65 466 319 8 1 1 500 375 +1139 /data/VOCdevkit/VOC2007/JPEGImages/002288.jpg 500 332 3 198 173 392 193 +1140 /data/VOCdevkit/VOC2007/JPEGImages/002290.jpg 500 468 13 150 136 475 436 14 157 13 421 343 14 146 70 173 122 14 115 64 135 124 14 98 78 125 124 14 67 66 89 127 14 38 76 72 128 14 186 70 202 123 +1141 /data/VOCdevkit/VOC2007/JPEGImages/002291.jpg 500 433 6 125 100 422 337 +1142 /data/VOCdevkit/VOC2007/JPEGImages/002293.jpg 332 500 14 2 47 264 500 14 87 131 287 500 +1143 /data/VOCdevkit/VOC2007/JPEGImages/002300.jpg 500 375 9 276 1 475 156 9 111 138 395 319 9 1 1 120 226 +1144 /data/VOCdevkit/VOC2007/JPEGImages/002302.jpg 500 375 3 150 82 489 323 14 66 36 204 372 +1145 /data/VOCdevkit/VOC2007/JPEGImages/002305.jpg 500 375 8 47 22 447 361 15 366 1 500 301 +1146 /data/VOCdevkit/VOC2007/JPEGImages/002306.jpg 270 360 14 20 56 141 346 14 148 103 211 333 +1147 /data/VOCdevkit/VOC2007/JPEGImages/002307.jpg 500 333 6 193 119 486 259 14 351 142 397 175 +1148 /data/VOCdevkit/VOC2007/JPEGImages/002308.jpg 375 500 7 174 81 340 361 8 43 249 139 432 +1149 /data/VOCdevkit/VOC2007/JPEGImages/002310.jpg 500 333 2 154 30 484 333 +1150 /data/VOCdevkit/VOC2007/JPEGImages/002311.jpg 500 375 6 1 57 499 355 14 338 8 373 131 14 404 7 445 132 14 419 108 474 167 14 377 22 411 105 14 444 29 488 126 14 286 18 320 65 14 179 23 207 57 14 143 27 174 56 14 118 15 136 58 14 29 33 61 91 14 316 19 341 71 14 367 19 393 104 +1151 /data/VOCdevkit/VOC2007/JPEGImages/002315.jpg 500 333 11 177 37 394 249 +1152 /data/VOCdevkit/VOC2007/JPEGImages/002318.jpg 500 375 13 29 167 188 340 +1153 /data/VOCdevkit/VOC2007/JPEGImages/002320.jpg 500 335 15 69 33 282 202 +1154 /data/VOCdevkit/VOC2007/JPEGImages/002321.jpg 335 500 18 117 197 242 306 +1155 /data/VOCdevkit/VOC2007/JPEGImages/002323.jpg 500 375 9 70 110 379 283 9 76 115 177 151 9 295 101 364 145 +1156 /data/VOCdevkit/VOC2007/JPEGImages/002324.jpg 500 375 14 1 1 194 374 14 171 1 293 182 14 166 127 373 375 +1157 /data/VOCdevkit/VOC2007/JPEGImages/002328.jpg 500 375 19 107 61 351 315 +1158 /data/VOCdevkit/VOC2007/JPEGImages/002329.jpg 500 375 12 80 170 340 374 12 291 154 475 375 14 87 73 223 351 14 247 66 346 208 +1159 /data/VOCdevkit/VOC2007/JPEGImages/002330.jpg 500 357 16 305 154 395 221 16 33 120 164 180 +1160 /data/VOCdevkit/VOC2007/JPEGImages/002332.jpg 500 375 14 121 39 254 231 14 337 61 494 182 14 101 81 500 362 +1161 /data/VOCdevkit/VOC2007/JPEGImages/002333.jpg 500 335 2 35 130 72 174 2 82 157 138 210 2 158 170 249 242 2 242 160 325 213 2 160 134 224 183 +1162 /data/VOCdevkit/VOC2007/JPEGImages/002334.jpg 500 375 8 83 262 325 375 8 15 139 102 286 19 137 114 227 210 19 237 121 319 208 19 325 163 415 252 +1163 /data/VOCdevkit/VOC2007/JPEGImages/002335.jpg 500 375 17 1 54 500 375 +1164 /data/VOCdevkit/VOC2007/JPEGImages/002337.jpg 500 333 1 157 146 302 282 14 177 73 317 273 +1165 /data/VOCdevkit/VOC2007/JPEGImages/002340.jpg 500 375 6 100 136 384 284 6 107 116 152 135 +1166 /data/VOCdevkit/VOC2007/JPEGImages/002342.jpg 376 500 14 23 39 376 500 +1167 /data/VOCdevkit/VOC2007/JPEGImages/002343.jpg 500 375 6 294 89 375 125 6 213 78 260 98 6 2 103 500 344 +1168 /data/VOCdevkit/VOC2007/JPEGImages/002345.jpg 375 500 11 78 144 282 477 +1169 /data/VOCdevkit/VOC2007/JPEGImages/002347.jpg 500 375 15 287 251 344 334 15 165 253 241 328 15 72 253 131 312 +1170 /data/VOCdevkit/VOC2007/JPEGImages/002348.jpg 500 333 0 186 135 299 253 0 61 114 179 230 +1171 /data/VOCdevkit/VOC2007/JPEGImages/002350.jpg 375 500 4 86 3 294 500 +1172 /data/VOCdevkit/VOC2007/JPEGImages/002352.jpg 500 198 18 51 48 436 150 18 1 58 49 144 +1173 /data/VOCdevkit/VOC2007/JPEGImages/002354.jpg 500 375 0 64 128 451 252 +1174 /data/VOCdevkit/VOC2007/JPEGImages/002355.jpg 500 375 6 18 137 488 314 +1175 /data/VOCdevkit/VOC2007/JPEGImages/002359.jpg 500 375 11 12 114 351 375 +1176 /data/VOCdevkit/VOC2007/JPEGImages/002361.jpg 375 500 15 21 199 148 486 14 294 296 375 500 +1177 /data/VOCdevkit/VOC2007/JPEGImages/002362.jpg 500 375 8 291 198 418 281 8 210 254 418 375 17 175 156 357 216 15 323 1 423 222 15 373 57 421 184 15 113 40 177 206 14 270 50 300 118 14 245 59 269 116 +1178 /data/VOCdevkit/VOC2007/JPEGImages/002364.jpg 500 329 11 169 108 397 276 +1179 /data/VOCdevkit/VOC2007/JPEGImages/002366.jpg 500 375 13 231 13 490 316 13 2 180 215 315 +1180 /data/VOCdevkit/VOC2007/JPEGImages/002367.jpg 500 375 14 169 68 355 311 13 100 132 403 342 +1181 /data/VOCdevkit/VOC2007/JPEGImages/002368.jpg 333 500 8 34 269 112 387 8 183 274 272 391 +1182 /data/VOCdevkit/VOC2007/JPEGImages/002369.jpg 500 375 9 138 135 215 232 +1183 /data/VOCdevkit/VOC2007/JPEGImages/002371.jpg 500 357 1 1 23 471 357 +1184 /data/VOCdevkit/VOC2007/JPEGImages/002372.jpg 400 500 3 165 224 312 383 14 273 288 343 380 +1185 /data/VOCdevkit/VOC2007/JPEGImages/002373.jpg 500 332 6 47 18 407 319 6 284 1 339 10 +1186 /data/VOCdevkit/VOC2007/JPEGImages/002374.jpg 500 332 5 126 143 312 241 +1187 /data/VOCdevkit/VOC2007/JPEGImages/002375.jpg 500 427 7 11 15 496 316 +1188 /data/VOCdevkit/VOC2007/JPEGImages/002376.jpg 500 333 0 1 32 458 224 +1189 /data/VOCdevkit/VOC2007/JPEGImages/002377.jpg 500 375 1 91 123 500 375 +1190 /data/VOCdevkit/VOC2007/JPEGImages/002378.jpg 500 375 14 184 10 384 305 15 1 2 196 296 15 117 37 170 164 +1191 /data/VOCdevkit/VOC2007/JPEGImages/002382.jpg 360 240 14 3 65 354 221 14 60 83 214 213 +1192 /data/VOCdevkit/VOC2007/JPEGImages/002384.jpg 500 375 14 43 64 298 368 11 210 110 442 369 +1193 /data/VOCdevkit/VOC2007/JPEGImages/002385.jpg 500 375 10 85 180 429 280 14 433 183 500 375 14 408 112 497 304 14 380 107 437 241 14 335 124 394 225 14 212 122 301 181 14 120 115 167 213 14 68 114 135 225 14 1 107 121 241 14 1 181 98 362 +1194 /data/VOCdevkit/VOC2007/JPEGImages/002387.jpg 500 375 9 246 170 342 244 14 220 153 250 252 14 194 128 214 166 14 160 130 188 167 +1195 /data/VOCdevkit/VOC2007/JPEGImages/002391.jpg 237 360 7 1 107 123 360 +1196 /data/VOCdevkit/VOC2007/JPEGImages/002392.jpg 500 375 3 60 106 412 177 +1197 /data/VOCdevkit/VOC2007/JPEGImages/002393.jpg 500 334 6 56 40 162 85 6 136 33 302 103 6 449 35 500 92 6 111 49 500 321 +1198 /data/VOCdevkit/VOC2007/JPEGImages/002401.jpg 333 500 14 13 85 301 500 +1199 /data/VOCdevkit/VOC2007/JPEGImages/002403.jpg 500 375 14 316 114 334 160 2 373 182 407 226 3 283 30 394 174 +1200 /data/VOCdevkit/VOC2007/JPEGImages/002404.jpg 500 375 4 352 70 389 167 10 2 82 500 375 +1201 /data/VOCdevkit/VOC2007/JPEGImages/002405.jpg 500 431 12 53 119 354 407 14 103 32 291 320 +1202 /data/VOCdevkit/VOC2007/JPEGImages/002407.jpg 375 500 7 43 16 300 495 +1203 /data/VOCdevkit/VOC2007/JPEGImages/002410.jpg 500 375 14 88 28 356 318 +1204 /data/VOCdevkit/VOC2007/JPEGImages/002411.jpg 500 375 6 129 163 300 259 +1205 /data/VOCdevkit/VOC2007/JPEGImages/002413.jpg 375 500 14 89 9 375 499 +1206 /data/VOCdevkit/VOC2007/JPEGImages/002415.jpg 332 500 11 3 1 331 500 +1207 /data/VOCdevkit/VOC2007/JPEGImages/002417.jpg 500 500 8 213 274 301 440 +1208 /data/VOCdevkit/VOC2007/JPEGImages/002419.jpg 500 344 13 113 106 379 262 14 160 56 277 215 +1209 /data/VOCdevkit/VOC2007/JPEGImages/002420.jpg 500 333 6 81 48 475 251 +1210 /data/VOCdevkit/VOC2007/JPEGImages/002423.jpg 500 361 18 233 146 410 237 +1211 /data/VOCdevkit/VOC2007/JPEGImages/002425.jpg 375 500 17 137 186 375 500 8 22 151 120 290 14 32 63 108 256 14 75 102 130 266 +1212 /data/VOCdevkit/VOC2007/JPEGImages/002427.jpg 320 240 17 161 143 261 228 17 1 60 137 240 +1213 /data/VOCdevkit/VOC2007/JPEGImages/002433.jpg 500 375 14 15 111 105 290 14 1 103 328 375 14 302 42 500 375 14 471 23 496 52 +1214 /data/VOCdevkit/VOC2007/JPEGImages/002435.jpg 500 375 3 161 1 342 224 +1215 /data/VOCdevkit/VOC2007/JPEGImages/002436.jpg 500 375 6 66 158 217 210 6 452 149 500 199 +1216 /data/VOCdevkit/VOC2007/JPEGImages/002437.jpg 500 338 7 86 9 375 338 +1217 /data/VOCdevkit/VOC2007/JPEGImages/002439.jpg 500 375 0 41 102 415 228 +1218 /data/VOCdevkit/VOC2007/JPEGImages/002441.jpg 500 375 7 43 64 500 362 19 2 88 500 375 +1219 /data/VOCdevkit/VOC2007/JPEGImages/002442.jpg 375 500 10 3 21 375 497 4 183 1 200 35 4 174 68 209 198 +1220 /data/VOCdevkit/VOC2007/JPEGImages/002443.jpg 333 500 11 51 175 333 393 14 3 135 286 321 +1221 /data/VOCdevkit/VOC2007/JPEGImages/002444.jpg 500 375 14 288 96 415 369 14 213 120 330 285 4 123 272 164 375 4 2 274 31 372 +1222 /data/VOCdevkit/VOC2007/JPEGImages/002445.jpg 360 500 7 13 89 349 490 +1223 /data/VOCdevkit/VOC2007/JPEGImages/002448.jpg 412 480 14 169 93 279 281 12 41 146 360 435 +1224 /data/VOCdevkit/VOC2007/JPEGImages/002450.jpg 500 423 11 47 131 281 329 14 238 1 472 318 +1225 /data/VOCdevkit/VOC2007/JPEGImages/002452.jpg 500 375 16 38 22 500 362 +1226 /data/VOCdevkit/VOC2007/JPEGImages/002454.jpg 500 334 6 100 73 263 200 +1227 /data/VOCdevkit/VOC2007/JPEGImages/002456.jpg 500 375 8 5 1 85 126 8 20 1 114 119 10 1 76 500 375 +1228 /data/VOCdevkit/VOC2007/JPEGImages/002458.jpg 500 375 13 22 150 102 203 14 39 131 69 185 +1229 /data/VOCdevkit/VOC2007/JPEGImages/002459.jpg 500 322 14 121 205 192 237 +1230 /data/VOCdevkit/VOC2007/JPEGImages/002460.jpg 500 375 1 295 184 446 358 14 308 82 426 368 +1231 /data/VOCdevkit/VOC2007/JPEGImages/002461.jpg 500 375 7 164 49 320 270 +1232 /data/VOCdevkit/VOC2007/JPEGImages/002462.jpg 500 375 18 54 75 500 158 +1233 /data/VOCdevkit/VOC2007/JPEGImages/002465.jpg 500 375 3 46 14 500 322 +1234 /data/VOCdevkit/VOC2007/JPEGImages/002466.jpg 500 333 11 125 92 421 217 +1235 /data/VOCdevkit/VOC2007/JPEGImages/002468.jpg 500 358 2 259 33 410 166 2 45 172 178 330 +1236 /data/VOCdevkit/VOC2007/JPEGImages/002470.jpg 417 500 7 23 86 417 462 +1237 /data/VOCdevkit/VOC2007/JPEGImages/002471.jpg 500 375 12 5 43 302 375 +1238 /data/VOCdevkit/VOC2007/JPEGImages/002472.jpg 500 375 14 390 184 414 246 14 422 177 443 247 14 479 181 500 244 0 4 138 200 245 0 136 146 384 235 +1239 /data/VOCdevkit/VOC2007/JPEGImages/002476.jpg 500 333 14 89 5 459 333 +1240 /data/VOCdevkit/VOC2007/JPEGImages/002477.jpg 500 375 18 61 57 292 189 14 340 79 410 228 14 1 32 72 295 +1241 /data/VOCdevkit/VOC2007/JPEGImages/002478.jpg 500 375 6 280 250 483 335 +1242 /data/VOCdevkit/VOC2007/JPEGImages/002479.jpg 500 375 3 40 204 71 260 3 305 136 356 235 +1243 /data/VOCdevkit/VOC2007/JPEGImages/002480.jpg 500 375 7 146 111 407 312 +1244 /data/VOCdevkit/VOC2007/JPEGImages/002481.jpg 334 500 14 15 19 316 426 +1245 /data/VOCdevkit/VOC2007/JPEGImages/002483.jpg 500 375 15 112 115 197 274 15 390 45 441 262 7 238 81 277 137 7 33 250 215 335 14 194 111 305 371 +1246 /data/VOCdevkit/VOC2007/JPEGImages/002490.jpg 500 375 5 206 137 287 247 5 1 134 147 340 6 139 207 188 287 6 168 209 222 266 +1247 /data/VOCdevkit/VOC2007/JPEGImages/002491.jpg 375 500 14 258 288 375 500 14 40 261 284 500 +1248 /data/VOCdevkit/VOC2007/JPEGImages/002492.jpg 500 375 17 28 146 241 279 8 262 140 390 246 8 1 230 153 375 +1249 /data/VOCdevkit/VOC2007/JPEGImages/002493.jpg 500 375 6 27 203 314 375 +1250 /data/VOCdevkit/VOC2007/JPEGImages/002494.jpg 500 375 9 10 23 500 374 +1251 /data/VOCdevkit/VOC2007/JPEGImages/002496.jpg 500 404 18 61 70 500 348 +1252 /data/VOCdevkit/VOC2007/JPEGImages/002497.jpg 500 375 6 193 159 393 280 +1253 /data/VOCdevkit/VOC2007/JPEGImages/002500.jpg 375 500 3 63 1 340 471 3 1 250 71 414 +1254 /data/VOCdevkit/VOC2007/JPEGImages/002501.jpg 500 375 8 6 124 262 375 17 212 135 500 358 14 81 117 205 373 14 245 125 498 372 14 295 92 496 262 +1255 /data/VOCdevkit/VOC2007/JPEGImages/002502.jpg 335 500 18 12 114 275 412 +1256 /data/VOCdevkit/VOC2007/JPEGImages/002504.jpg 500 374 6 272 319 320 348 6 371 311 398 330 6 423 313 464 335 6 459 313 496 334 6 318 310 347 337 6 98 310 139 327 14 151 305 186 374 14 87 320 113 374 14 129 316 156 374 +1257 /data/VOCdevkit/VOC2007/JPEGImages/002505.jpg 500 375 9 1 12 348 373 9 145 13 437 274 +1258 /data/VOCdevkit/VOC2007/JPEGImages/002508.jpg 500 333 1 67 52 444 293 +1259 /data/VOCdevkit/VOC2007/JPEGImages/002512.jpg 500 375 11 82 40 298 296 11 258 128 450 347 1 1 188 299 375 +1260 /data/VOCdevkit/VOC2007/JPEGImages/002513.jpg 500 375 0 253 243 269 259 0 247 227 263 243 0 225 206 241 223 0 219 191 234 206 0 207 219 223 238 0 212 238 228 256 0 188 229 203 250 +1261 /data/VOCdevkit/VOC2007/JPEGImages/002514.jpg 500 333 14 164 36 386 333 14 54 259 121 318 +1262 /data/VOCdevkit/VOC2007/JPEGImages/002518.jpg 500 332 14 254 128 362 323 14 84 151 121 220 14 141 138 225 246 4 147 198 181 298 4 182 201 216 292 +1263 /data/VOCdevkit/VOC2007/JPEGImages/002519.jpg 500 375 13 55 2 476 375 +1264 /data/VOCdevkit/VOC2007/JPEGImages/002520.jpg 500 332 12 209 186 257 283 14 331 167 382 285 14 440 181 468 285 +1265 /data/VOCdevkit/VOC2007/JPEGImages/002523.jpg 500 375 1 35 25 485 346 +1266 /data/VOCdevkit/VOC2007/JPEGImages/002524.jpg 333 500 14 45 125 314 461 +1267 /data/VOCdevkit/VOC2007/JPEGImages/002525.jpg 500 375 18 1 234 461 372 +1268 /data/VOCdevkit/VOC2007/JPEGImages/002529.jpg 500 375 10 1 92 497 375 +1269 /data/VOCdevkit/VOC2007/JPEGImages/002533.jpg 500 375 6 37 41 431 356 6 301 121 500 271 14 416 64 500 293 +1270 /data/VOCdevkit/VOC2007/JPEGImages/002534.jpg 500 333 6 347 156 386 185 6 226 157 281 197 +1271 /data/VOCdevkit/VOC2007/JPEGImages/002537.jpg 458 391 11 14 6 448 362 +1272 /data/VOCdevkit/VOC2007/JPEGImages/002539.jpg 500 333 5 1 1 500 333 14 198 105 307 333 +1273 /data/VOCdevkit/VOC2007/JPEGImages/002540.jpg 500 375 1 243 184 282 257 1 150 200 206 272 14 155 135 201 270 +1274 /data/VOCdevkit/VOC2007/JPEGImages/002542.jpg 500 375 14 198 131 350 368 14 146 138 262 278 14 1 124 105 206 10 1 194 346 375 15 220 103 270 160 15 212 43 261 99 15 175 46 208 109 15 148 10 196 71 15 153 124 188 184 +1275 /data/VOCdevkit/VOC2007/JPEGImages/002544.jpg 500 375 6 81 119 422 277 6 165 72 259 114 6 246 75 312 111 6 300 75 364 107 6 286 61 362 97 +1276 /data/VOCdevkit/VOC2007/JPEGImages/002545.jpg 375 500 14 75 43 206 496 4 181 62 211 132 +1277 /data/VOCdevkit/VOC2007/JPEGImages/002546.jpg 500 375 11 196 17 440 375 +1278 /data/VOCdevkit/VOC2007/JPEGImages/002547.jpg 500 375 2 195 142 272 284 +1279 /data/VOCdevkit/VOC2007/JPEGImages/002549.jpg 500 375 19 242 74 404 220 +1280 /data/VOCdevkit/VOC2007/JPEGImages/002554.jpg 500 332 14 167 108 287 215 +1281 /data/VOCdevkit/VOC2007/JPEGImages/002555.jpg 500 375 12 58 95 202 299 12 203 95 487 375 14 7 143 61 273 +1282 /data/VOCdevkit/VOC2007/JPEGImages/002558.jpg 500 375 1 95 125 215 290 1 330 170 438 344 14 86 39 222 268 14 330 74 448 319 +1283 /data/VOCdevkit/VOC2007/JPEGImages/002559.jpg 500 375 6 103 64 453 293 8 1 115 48 183 15 156 1 284 107 +1284 /data/VOCdevkit/VOC2007/JPEGImages/002561.jpg 500 375 19 185 58 292 169 8 44 291 300 375 14 322 71 500 375 14 86 80 299 375 +1285 /data/VOCdevkit/VOC2007/JPEGImages/002563.jpg 500 334 14 417 245 433 284 6 372 247 421 281 14 120 254 135 294 +1286 /data/VOCdevkit/VOC2007/JPEGImages/002564.jpg 500 333 14 17 48 211 333 14 157 34 448 333 +1287 /data/VOCdevkit/VOC2007/JPEGImages/002565.jpg 500 375 18 1 19 460 348 14 258 175 334 336 +1288 /data/VOCdevkit/VOC2007/JPEGImages/002566.jpg 500 375 5 238 144 367 196 6 34 181 104 207 +1289 /data/VOCdevkit/VOC2007/JPEGImages/002567.jpg 500 375 13 93 25 457 358 +1290 /data/VOCdevkit/VOC2007/JPEGImages/002569.jpg 378 500 15 33 23 353 482 15 1 72 52 417 +1291 /data/VOCdevkit/VOC2007/JPEGImages/002571.jpg 500 333 2 1 5 316 333 +1292 /data/VOCdevkit/VOC2007/JPEGImages/002572.jpg 500 333 4 135 98 173 195 4 118 142 136 195 8 370 156 500 327 8 339 125 429 273 14 121 30 150 107 14 148 22 182 106 14 201 18 245 86 14 243 23 288 87 14 282 89 401 288 14 242 85 309 175 14 33 73 210 333 14 220 82 263 177 14 197 77 239 175 +1293 /data/VOCdevkit/VOC2007/JPEGImages/002578.jpg 500 375 11 42 36 435 312 +1294 /data/VOCdevkit/VOC2007/JPEGImages/002579.jpg 384 500 2 80 74 357 475 +1295 /data/VOCdevkit/VOC2007/JPEGImages/002584.jpg 304 500 14 84 7 301 484 14 1 318 91 500 14 253 213 272 269 +1296 /data/VOCdevkit/VOC2007/JPEGImages/002585.jpg 500 331 14 223 55 344 242 14 110 49 208 205 13 149 118 390 293 13 66 104 229 232 +1297 /data/VOCdevkit/VOC2007/JPEGImages/002586.jpg 500 500 2 58 1 373 437 +1298 /data/VOCdevkit/VOC2007/JPEGImages/002589.jpg 400 300 8 140 140 228 272 8 183 67 225 134 14 18 91 111 275 14 208 145 349 300 14 157 95 242 286 14 226 49 316 237 +1299 /data/VOCdevkit/VOC2007/JPEGImages/002590.jpg 375 500 18 3 272 374 443 +1300 /data/VOCdevkit/VOC2007/JPEGImages/002593.jpg 500 375 16 230 164 288 234 +1301 /data/VOCdevkit/VOC2007/JPEGImages/002594.jpg 500 235 15 358 30 497 175 15 304 101 408 211 15 151 82 297 188 15 43 121 146 222 15 5 39 118 139 +1302 /data/VOCdevkit/VOC2007/JPEGImages/002595.jpg 500 375 6 68 115 442 234 14 297 131 330 159 14 460 50 482 146 14 419 59 439 145 14 398 58 421 144 14 424 60 470 198 14 337 48 387 135 14 282 64 342 121 14 267 70 295 115 14 231 61 269 121 14 198 64 224 140 14 143 59 182 149 14 122 67 153 151 14 47 60 86 174 14 19 69 58 183 14 2 65 16 181 +1303 /data/VOCdevkit/VOC2007/JPEGImages/002598.jpg 333 500 15 89 49 244 394 +1304 /data/VOCdevkit/VOC2007/JPEGImages/002599.jpg 500 375 13 70 43 425 364 13 1 100 161 316 +1305 /data/VOCdevkit/VOC2007/JPEGImages/002600.jpg 500 375 18 85 57 362 342 +1306 /data/VOCdevkit/VOC2007/JPEGImages/002603.jpg 500 375 2 185 99 304 245 +1307 /data/VOCdevkit/VOC2007/JPEGImages/002605.jpg 500 333 3 249 209 305 244 +1308 /data/VOCdevkit/VOC2007/JPEGImages/002606.jpg 500 335 6 351 196 432 228 6 252 194 369 238 6 193 196 252 241 +1309 /data/VOCdevkit/VOC2007/JPEGImages/002609.jpg 500 342 11 40 40 217 255 +1310 /data/VOCdevkit/VOC2007/JPEGImages/002611.jpg 500 375 14 1 1 397 351 11 152 131 337 298 +1311 /data/VOCdevkit/VOC2007/JPEGImages/002613.jpg 500 375 4 277 238 316 347 4 305 227 350 375 4 347 238 391 375 4 388 226 422 365 4 420 227 458 359 14 40 20 262 298 +1312 /data/VOCdevkit/VOC2007/JPEGImages/002615.jpg 500 333 16 177 107 200 132 16 343 263 383 288 +1313 /data/VOCdevkit/VOC2007/JPEGImages/002618.jpg 500 384 16 17 20 483 343 +1314 /data/VOCdevkit/VOC2007/JPEGImages/002621.jpg 500 375 2 162 61 490 307 2 325 2 475 108 +1315 /data/VOCdevkit/VOC2007/JPEGImages/002625.jpg 500 375 6 114 297 159 314 6 42 294 88 313 14 167 283 176 325 +1316 /data/VOCdevkit/VOC2007/JPEGImages/002627.jpg 375 500 17 101 221 238 298 19 22 211 79 275 10 4 335 375 500 +1317 /data/VOCdevkit/VOC2007/JPEGImages/002632.jpg 288 352 14 1 1 245 352 +1318 /data/VOCdevkit/VOC2007/JPEGImages/002633.jpg 332 500 12 136 152 315 412 14 179 101 246 311 +1319 /data/VOCdevkit/VOC2007/JPEGImages/002634.jpg 500 339 9 163 102 392 312 9 121 141 235 287 +1320 /data/VOCdevkit/VOC2007/JPEGImages/002635.jpg 500 334 2 137 109 419 281 +1321 /data/VOCdevkit/VOC2007/JPEGImages/002636.jpg 500 375 17 311 223 500 333 14 153 176 179 242 8 130 187 174 261 8 233 188 272 264 8 251 184 291 250 8 174 195 215 272 10 171 189 241 266 +1322 /data/VOCdevkit/VOC2007/JPEGImages/002637.jpg 500 375 7 60 188 231 282 14 237 42 380 130 +1323 /data/VOCdevkit/VOC2007/JPEGImages/002641.jpg 500 375 14 3 85 201 375 14 181 108 341 375 14 275 148 500 375 4 264 287 308 375 +1324 /data/VOCdevkit/VOC2007/JPEGImages/002643.jpg 500 375 6 1 51 89 152 14 407 57 453 174 14 180 102 281 207 13 181 133 302 282 +1325 /data/VOCdevkit/VOC2007/JPEGImages/002645.jpg 500 332 19 1 186 47 250 8 194 175 239 244 8 234 176 281 258 8 249 168 383 332 +1326 /data/VOCdevkit/VOC2007/JPEGImages/002646.jpg 500 375 6 18 103 487 323 +1327 /data/VOCdevkit/VOC2007/JPEGImages/002647.jpg 500 333 6 221 174 306 212 +1328 /data/VOCdevkit/VOC2007/JPEGImages/002648.jpg 500 375 16 104 157 302 372 16 239 148 350 225 16 38 100 255 267 +1329 /data/VOCdevkit/VOC2007/JPEGImages/002649.jpg 500 320 14 2 105 191 320 14 107 103 294 320 14 225 108 349 318 14 313 43 463 320 +1330 /data/VOCdevkit/VOC2007/JPEGImages/002653.jpg 500 375 3 2 12 456 375 +1331 /data/VOCdevkit/VOC2007/JPEGImages/002657.jpg 500 375 12 212 198 288 264 14 268 353 296 375 +1332 /data/VOCdevkit/VOC2007/JPEGImages/002658.jpg 500 333 4 163 92 189 202 15 103 8 147 115 15 146 11 183 118 15 181 43 234 117 14 274 3 472 324 10 56 181 387 333 8 279 100 466 302 +1333 /data/VOCdevkit/VOC2007/JPEGImages/002659.jpg 500 375 3 161 8 231 310 +1334 /data/VOCdevkit/VOC2007/JPEGImages/002662.jpg 500 378 10 120 170 491 378 14 373 42 500 293 14 212 14 327 174 14 142 34 210 172 14 92 55 156 170 14 5 53 227 368 +1335 /data/VOCdevkit/VOC2007/JPEGImages/002664.jpg 500 335 2 99 180 146 218 2 149 108 269 173 2 319 175 366 214 2 461 219 500 266 2 186 175 262 217 +1336 /data/VOCdevkit/VOC2007/JPEGImages/002666.jpg 334 500 13 3 174 299 448 +1337 /data/VOCdevkit/VOC2007/JPEGImages/002667.jpg 500 333 6 5 76 500 333 +1338 /data/VOCdevkit/VOC2007/JPEGImages/002668.jpg 500 375 14 426 105 462 134 14 95 83 309 319 14 89 169 112 190 +1339 /data/VOCdevkit/VOC2007/JPEGImages/002669.jpg 500 375 9 116 191 245 287 14 442 241 478 294 9 163 184 273 269 +1340 /data/VOCdevkit/VOC2007/JPEGImages/002670.jpg 375 500 11 22 143 374 429 +1341 /data/VOCdevkit/VOC2007/JPEGImages/002675.jpg 500 333 1 160 120 407 268 14 215 32 367 231 +1342 /data/VOCdevkit/VOC2007/JPEGImages/002677.jpg 333 500 7 3 3 319 375 +1343 /data/VOCdevkit/VOC2007/JPEGImages/002678.jpg 480 318 12 1 63 325 318 12 287 75 362 238 14 396 1 469 316 14 65 1 167 143 14 1 1 63 169 +1344 /data/VOCdevkit/VOC2007/JPEGImages/002680.jpg 500 334 11 4 36 500 334 +1345 /data/VOCdevkit/VOC2007/JPEGImages/002682.jpg 500 375 6 168 151 330 279 +1346 /data/VOCdevkit/VOC2007/JPEGImages/002683.jpg 500 375 16 130 123 348 293 +1347 /data/VOCdevkit/VOC2007/JPEGImages/002684.jpg 447 500 12 71 47 447 493 +1348 /data/VOCdevkit/VOC2007/JPEGImages/002689.jpg 500 375 14 199 21 336 344 +1349 /data/VOCdevkit/VOC2007/JPEGImages/002690.jpg 375 500 11 82 296 327 500 +1350 /data/VOCdevkit/VOC2007/JPEGImages/002691.jpg 500 375 11 1 232 192 365 14 64 27 478 375 +1351 /data/VOCdevkit/VOC2007/JPEGImages/002693.jpg 500 335 6 144 133 397 322 14 46 56 132 303 14 364 136 440 236 14 34 79 55 157 14 1 80 34 161 6 1 124 185 209 +1352 /data/VOCdevkit/VOC2007/JPEGImages/002695.jpg 500 375 9 7 3 279 337 9 426 114 500 184 9 348 107 405 166 +1353 /data/VOCdevkit/VOC2007/JPEGImages/002696.jpg 400 500 11 40 33 280 277 +1354 /data/VOCdevkit/VOC2007/JPEGImages/002697.jpg 480 498 11 25 26 216 498 11 199 42 422 404 11 241 375 480 498 +1355 /data/VOCdevkit/VOC2007/JPEGImages/002699.jpg 500 375 5 89 119 427 236 +1356 /data/VOCdevkit/VOC2007/JPEGImages/002702.jpg 333 500 8 89 189 333 500 8 1 274 100 500 8 77 199 278 429 +1357 /data/VOCdevkit/VOC2007/JPEGImages/002704.jpg 334 500 6 12 97 332 500 6 106 83 297 166 +1358 /data/VOCdevkit/VOC2007/JPEGImages/002706.jpg 500 333 7 119 61 351 330 +1359 /data/VOCdevkit/VOC2007/JPEGImages/002709.jpg 500 432 2 123 134 396 421 +1360 /data/VOCdevkit/VOC2007/JPEGImages/002710.jpg 500 331 14 125 63 493 331 +1361 /data/VOCdevkit/VOC2007/JPEGImages/002713.jpg 375 500 12 50 148 196 486 14 43 50 208 379 14 349 172 372 238 +1362 /data/VOCdevkit/VOC2007/JPEGImages/002714.jpg 500 375 14 168 91 246 357 +1363 /data/VOCdevkit/VOC2007/JPEGImages/002715.jpg 500 375 1 112 283 320 375 14 165 210 231 373 14 316 215 398 375 14 425 220 475 368 +1364 /data/VOCdevkit/VOC2007/JPEGImages/002717.jpg 500 375 2 170 103 278 300 +1365 /data/VOCdevkit/VOC2007/JPEGImages/002718.jpg 500 375 2 138 38 407 298 +1366 /data/VOCdevkit/VOC2007/JPEGImages/002721.jpg 500 357 2 274 86 453 220 +1367 /data/VOCdevkit/VOC2007/JPEGImages/002722.jpg 500 375 1 58 48 485 317 +1368 /data/VOCdevkit/VOC2007/JPEGImages/002723.jpg 500 375 13 114 183 334 335 13 285 176 472 315 13 411 170 500 334 13 82 184 140 287 14 133 151 196 240 +1369 /data/VOCdevkit/VOC2007/JPEGImages/002727.jpg 500 333 1 205 221 313 333 14 136 85 242 333 14 209 142 309 326 +1370 /data/VOCdevkit/VOC2007/JPEGImages/002730.jpg 500 333 6 186 88 385 294 14 220 131 270 184 +1371 /data/VOCdevkit/VOC2007/JPEGImages/002732.jpg 500 400 11 81 4 325 242 +1372 /data/VOCdevkit/VOC2007/JPEGImages/002734.jpg 500 374 6 449 45 500 94 6 319 45 420 92 5 250 6 432 80 +1373 /data/VOCdevkit/VOC2007/JPEGImages/002735.jpg 423 480 12 54 168 334 433 14 135 82 256 270 +1374 /data/VOCdevkit/VOC2007/JPEGImages/002737.jpg 500 335 0 125 91 420 200 +1375 /data/VOCdevkit/VOC2007/JPEGImages/002738.jpg 500 281 3 35 90 99 165 3 36 90 120 180 3 34 162 89 205 3 283 125 309 162 3 323 116 354 165 +1376 /data/VOCdevkit/VOC2007/JPEGImages/002741.jpg 500 333 14 321 169 388 332 18 82 19 500 333 14 31 184 51 232 +1377 /data/VOCdevkit/VOC2007/JPEGImages/002744.jpg 500 378 14 223 144 488 378 14 1 18 188 378 +1378 /data/VOCdevkit/VOC2007/JPEGImages/002745.jpg 375 500 4 213 59 312 442 +1379 /data/VOCdevkit/VOC2007/JPEGImages/002747.jpg 500 375 8 210 15 371 287 8 2 82 235 375 +1380 /data/VOCdevkit/VOC2007/JPEGImages/002749.jpg 500 375 9 143 185 391 375 9 175 25 500 319 +1381 /data/VOCdevkit/VOC2007/JPEGImages/002751.jpg 500 375 1 104 174 318 305 14 150 114 296 262 14 454 50 500 149 1 121 82 212 143 +1382 /data/VOCdevkit/VOC2007/JPEGImages/002755.jpg 500 375 14 122 89 359 308 14 291 82 494 357 +1383 /data/VOCdevkit/VOC2007/JPEGImages/002757.jpg 500 381 18 75 57 467 370 +1384 /data/VOCdevkit/VOC2007/JPEGImages/002759.jpg 500 374 13 75 82 413 310 6 342 90 500 175 6 256 94 372 153 14 443 67 478 181 14 475 76 500 116 +1385 /data/VOCdevkit/VOC2007/JPEGImages/002760.jpg 500 333 7 256 28 500 277 7 1 7 273 294 +1386 /data/VOCdevkit/VOC2007/JPEGImages/002762.jpg 500 375 2 268 87 304 183 +1387 /data/VOCdevkit/VOC2007/JPEGImages/002763.jpg 500 375 9 65 117 411 347 +1388 /data/VOCdevkit/VOC2007/JPEGImages/002765.jpg 500 332 0 362 119 492 172 0 203 116 360 172 0 19 117 131 174 0 118 125 213 172 +1389 /data/VOCdevkit/VOC2007/JPEGImages/002766.jpg 500 375 7 167 116 323 238 +1390 /data/VOCdevkit/VOC2007/JPEGImages/002767.jpg 500 375 19 246 189 302 259 19 75 167 113 221 14 114 171 249 375 14 19 172 111 274 8 11 206 84 333 8 92 245 198 375 +1391 /data/VOCdevkit/VOC2007/JPEGImages/002772.jpg 500 375 6 32 146 436 273 +1392 /data/VOCdevkit/VOC2007/JPEGImages/002774.jpg 500 375 12 284 77 500 375 12 72 128 340 375 +1393 /data/VOCdevkit/VOC2007/JPEGImages/002775.jpg 375 500 15 266 159 375 500 15 121 346 295 500 +1394 /data/VOCdevkit/VOC2007/JPEGImages/002776.jpg 500 332 5 429 175 500 204 14 320 258 337 281 6 239 218 302 250 +1395 /data/VOCdevkit/VOC2007/JPEGImages/002778.jpg 500 375 8 54 220 103 258 8 101 223 150 262 8 16 235 63 301 8 62 262 132 315 8 129 271 206 330 8 210 281 285 342 8 322 294 395 375 19 144 100 198 141 +1396 /data/VOCdevkit/VOC2007/JPEGImages/002779.jpg 500 331 6 32 132 229 234 6 284 126 440 243 +1397 /data/VOCdevkit/VOC2007/JPEGImages/002782.jpg 500 333 18 1 34 467 267 +1398 /data/VOCdevkit/VOC2007/JPEGImages/002783.jpg 500 375 5 281 295 338 354 +1399 /data/VOCdevkit/VOC2007/JPEGImages/002784.jpg 333 500 11 64 48 333 500 +1400 /data/VOCdevkit/VOC2007/JPEGImages/002785.jpg 500 333 7 222 1 475 178 +1401 /data/VOCdevkit/VOC2007/JPEGImages/002786.jpg 500 332 12 80 97 348 272 14 201 52 258 202 +1402 /data/VOCdevkit/VOC2007/JPEGImages/002791.jpg 500 319 2 114 115 487 309 2 228 18 374 317 +1403 /data/VOCdevkit/VOC2007/JPEGImages/002794.jpg 500 375 9 114 21 425 360 +1404 /data/VOCdevkit/VOC2007/JPEGImages/002795.jpg 500 375 14 101 248 121 295 14 205 193 228 236 13 196 204 256 249 +1405 /data/VOCdevkit/VOC2007/JPEGImages/002796.jpg 332 500 7 130 227 306 364 +1406 /data/VOCdevkit/VOC2007/JPEGImages/002798.jpg 500 375 14 387 50 500 187 14 259 174 500 375 14 1 149 238 375 14 58 44 157 159 14 169 54 253 135 14 234 41 357 153 10 8 135 500 375 +1407 /data/VOCdevkit/VOC2007/JPEGImages/002800.jpg 488 425 12 176 139 294 353 12 176 74 345 356 +1408 /data/VOCdevkit/VOC2007/JPEGImages/002801.jpg 500 375 10 2 2 500 375 +1409 /data/VOCdevkit/VOC2007/JPEGImages/002803.jpg 500 375 8 225 154 375 312 8 107 145 263 294 8 376 109 443 183 8 312 107 390 151 8 196 109 288 159 8 146 114 208 170 14 302 85 333 125 +1410 /data/VOCdevkit/VOC2007/JPEGImages/002804.jpg 500 375 6 471 149 500 176 6 330 131 449 174 6 51 131 121 154 6 1 135 46 156 14 454 138 472 179 14 1 156 19 233 14 219 156 264 311 14 362 162 388 258 14 304 151 339 203 12 304 170 358 246 12 189 196 233 291 +1411 /data/VOCdevkit/VOC2007/JPEGImages/002807.jpg 471 500 13 76 114 395 449 14 126 33 378 384 +1412 /data/VOCdevkit/VOC2007/JPEGImages/002810.jpg 500 325 11 84 59 360 256 +1413 /data/VOCdevkit/VOC2007/JPEGImages/002812.jpg 500 375 6 236 198 366 260 5 13 142 227 261 +1414 /data/VOCdevkit/VOC2007/JPEGImages/002815.jpg 333 500 14 1 33 333 500 +1415 /data/VOCdevkit/VOC2007/JPEGImages/002816.jpg 500 375 5 51 145 454 307 +1416 /data/VOCdevkit/VOC2007/JPEGImages/002817.jpg 500 375 15 23 8 381 319 +1417 /data/VOCdevkit/VOC2007/JPEGImages/002820.jpg 500 371 15 410 229 493 304 15 258 243 313 306 15 160 228 218 300 +1418 /data/VOCdevkit/VOC2007/JPEGImages/002826.jpg 333 500 11 211 26 333 183 11 1 60 202 196 14 1 1 96 181 14 233 1 331 184 14 128 93 316 461 11 47 242 230 458 +1419 /data/VOCdevkit/VOC2007/JPEGImages/002827.jpg 500 331 14 274 64 500 322 14 41 64 283 311 14 1 95 34 201 14 61 113 97 145 +1420 /data/VOCdevkit/VOC2007/JPEGImages/002833.jpg 500 333 6 63 41 498 330 +1421 /data/VOCdevkit/VOC2007/JPEGImages/002834.jpg 500 488 14 4 2 223 485 +1422 /data/VOCdevkit/VOC2007/JPEGImages/002835.jpg 500 272 18 35 144 366 204 +1423 /data/VOCdevkit/VOC2007/JPEGImages/002836.jpg 500 333 2 254 135 320 266 2 125 142 205 255 +1424 /data/VOCdevkit/VOC2007/JPEGImages/002838.jpg 500 321 14 203 145 279 305 3 351 143 500 210 +1425 /data/VOCdevkit/VOC2007/JPEGImages/002841.jpg 375 500 14 23 242 198 414 14 98 77 332 434 +1426 /data/VOCdevkit/VOC2007/JPEGImages/002842.jpg 500 332 12 167 98 425 296 14 242 53 306 211 +1427 /data/VOCdevkit/VOC2007/JPEGImages/002844.jpg 500 325 18 141 37 500 248 +1428 /data/VOCdevkit/VOC2007/JPEGImages/002845.jpg 375 500 16 284 196 326 216 16 14 265 175 347 16 140 199 186 235 16 220 210 248 229 16 254 204 279 227 16 230 201 256 220 +1429 /data/VOCdevkit/VOC2007/JPEGImages/002847.jpg 500 333 0 36 76 499 250 +1430 /data/VOCdevkit/VOC2007/JPEGImages/002848.jpg 500 96 13 201 15 278 82 +1431 /data/VOCdevkit/VOC2007/JPEGImages/002854.jpg 500 333 6 3 175 500 331 +1432 /data/VOCdevkit/VOC2007/JPEGImages/002855.jpg 500 375 17 215 192 475 374 14 181 142 373 337 +1433 /data/VOCdevkit/VOC2007/JPEGImages/002858.jpg 333 500 12 68 79 292 480 14 160 33 277 348 +1434 /data/VOCdevkit/VOC2007/JPEGImages/002859.jpg 500 375 5 1 47 476 351 14 333 124 356 144 14 376 128 397 148 14 398 133 422 150 14 130 100 153 132 14 111 96 130 131 +1435 /data/VOCdevkit/VOC2007/JPEGImages/002864.jpg 500 375 14 44 18 234 361 14 253 18 500 346 +1436 /data/VOCdevkit/VOC2007/JPEGImages/002866.jpg 500 375 8 97 274 231 375 8 224 255 338 375 8 277 236 371 375 10 122 225 347 375 +1437 /data/VOCdevkit/VOC2007/JPEGImages/002867.jpg 374 500 5 167 1 374 456 5 1 13 129 389 14 104 179 224 451 +1438 /data/VOCdevkit/VOC2007/JPEGImages/002868.jpg 500 375 9 79 234 192 319 9 382 219 464 312 9 395 262 442 319 +1439 /data/VOCdevkit/VOC2007/JPEGImages/002869.jpg 500 333 0 21 94 489 226 +1440 /data/VOCdevkit/VOC2007/JPEGImages/002870.jpg 500 333 13 62 110 184 325 14 68 15 179 280 14 231 138 271 241 14 334 185 426 259 14 457 135 491 249 14 309 157 329 235 14 384 158 411 231 14 16 143 56 233 13 411 179 449 252 +1441 /data/VOCdevkit/VOC2007/JPEGImages/002873.jpg 500 375 0 140 196 245 221 16 425 219 450 237 16 370 220 398 241 16 159 276 190 294 +1442 /data/VOCdevkit/VOC2007/JPEGImages/002875.jpg 500 375 11 36 74 499 292 +1443 /data/VOCdevkit/VOC2007/JPEGImages/002879.jpg 500 375 14 7 65 500 375 +1444 /data/VOCdevkit/VOC2007/JPEGImages/002880.jpg 455 500 11 51 35 388 471 +1445 /data/VOCdevkit/VOC2007/JPEGImages/002881.jpg 500 500 4 394 341 426 425 14 85 43 323 470 +1446 /data/VOCdevkit/VOC2007/JPEGImages/002884.jpg 500 333 6 153 44 358 230 14 207 79 246 107 +1447 /data/VOCdevkit/VOC2007/JPEGImages/002886.jpg 500 375 14 4 59 280 372 14 240 107 355 371 14 262 79 433 375 14 327 74 498 372 +1448 /data/VOCdevkit/VOC2007/JPEGImages/002889.jpg 500 333 14 235 61 309 333 14 144 68 238 330 +1449 /data/VOCdevkit/VOC2007/JPEGImages/002891.jpg 500 360 18 68 50 381 324 +1450 /data/VOCdevkit/VOC2007/JPEGImages/002893.jpg 500 375 13 1 6 494 375 +1451 /data/VOCdevkit/VOC2007/JPEGImages/002896.jpg 375 500 2 124 71 253 500 +1452 /data/VOCdevkit/VOC2007/JPEGImages/002899.jpg 375 500 5 26 56 371 390 14 251 199 349 442 14 217 227 274 434 14 149 327 201 449 14 96 309 184 464 14 29 305 100 474 14 1 245 74 448 14 3 220 156 318 14 72 232 131 341 14 126 213 174 245 14 154 184 206 237 14 188 179 256 235 +1453 /data/VOCdevkit/VOC2007/JPEGImages/002901.jpg 500 375 19 376 96 430 188 19 40 133 221 290 +1454 /data/VOCdevkit/VOC2007/JPEGImages/002906.jpg 375 500 18 149 195 293 380 +1455 /data/VOCdevkit/VOC2007/JPEGImages/002910.jpg 500 375 8 264 123 426 314 8 89 123 232 285 +1456 /data/VOCdevkit/VOC2007/JPEGImages/002912.jpg 375 500 1 151 239 212 337 14 152 183 213 297 +1457 /data/VOCdevkit/VOC2007/JPEGImages/002913.jpg 500 312 18 176 108 473 166 14 196 122 217 183 14 13 123 39 182 +1458 /data/VOCdevkit/VOC2007/JPEGImages/002914.jpg 500 375 14 287 13 500 374 +1459 /data/VOCdevkit/VOC2007/JPEGImages/002915.jpg 500 375 14 295 45 377 319 14 256 121 329 333 14 147 10 263 370 +1460 /data/VOCdevkit/VOC2007/JPEGImages/002916.jpg 375 500 14 83 39 231 500 +1461 /data/VOCdevkit/VOC2007/JPEGImages/002917.jpg 500 375 6 73 89 472 313 6 48 96 163 142 +1462 /data/VOCdevkit/VOC2007/JPEGImages/002919.jpg 500 375 2 27 4 363 361 +1463 /data/VOCdevkit/VOC2007/JPEGImages/002924.jpg 500 322 15 281 3 475 322 7 1 17 252 319 +1464 /data/VOCdevkit/VOC2007/JPEGImages/002931.jpg 500 375 4 168 149 184 212 4 288 288 316 375 19 414 100 500 208 14 271 80 500 375 14 31 131 238 375 4 406 1 414 29 4 414 1 423 29 4 422 1 430 29 4 461 1 471 31 4 453 1 464 30 +1465 /data/VOCdevkit/VOC2007/JPEGImages/002932.jpg 375 500 14 103 369 195 468 +1466 /data/VOCdevkit/VOC2007/JPEGImages/002933.jpg 500 341 14 97 78 397 339 14 214 47 410 341 +1467 /data/VOCdevkit/VOC2007/JPEGImages/002934.jpg 393 500 7 31 5 393 441 7 2 263 392 500 +1468 /data/VOCdevkit/VOC2007/JPEGImages/002935.jpg 314 235 14 210 32 314 235 14 4 16 132 235 14 16 28 217 235 +1469 /data/VOCdevkit/VOC2007/JPEGImages/002937.jpg 500 333 6 72 57 369 298 6 283 43 500 179 +1470 /data/VOCdevkit/VOC2007/JPEGImages/002938.jpg 500 321 2 46 139 259 260 +1471 /data/VOCdevkit/VOC2007/JPEGImages/002939.jpg 500 375 4 283 161 316 226 14 159 101 336 375 8 266 206 369 361 19 38 108 121 233 +1472 /data/VOCdevkit/VOC2007/JPEGImages/002940.jpg 500 375 9 337 122 498 370 9 247 110 279 139 14 1 4 234 375 +1473 /data/VOCdevkit/VOC2007/JPEGImages/002941.jpg 500 375 4 412 56 439 158 4 443 71 493 186 4 383 68 436 184 4 339 59 386 170 +1474 /data/VOCdevkit/VOC2007/JPEGImages/002942.jpg 500 333 0 222 153 312 192 +1475 /data/VOCdevkit/VOC2007/JPEGImages/002943.jpg 500 375 10 27 229 500 375 +1476 /data/VOCdevkit/VOC2007/JPEGImages/002944.jpg 335 500 7 15 15 302 369 +1477 /data/VOCdevkit/VOC2007/JPEGImages/002946.jpg 500 375 15 283 192 380 307 +1478 /data/VOCdevkit/VOC2007/JPEGImages/002947.jpg 375 500 17 6 291 375 500 8 42 290 128 369 +1479 /data/VOCdevkit/VOC2007/JPEGImages/002952.jpg 500 375 19 122 253 437 374 7 93 113 433 284 +1480 /data/VOCdevkit/VOC2007/JPEGImages/002953.jpg 500 370 4 25 102 93 325 4 94 104 166 337 4 165 103 247 347 19 216 52 416 304 +1481 /data/VOCdevkit/VOC2007/JPEGImages/002954.jpg 500 375 14 118 22 200 292 14 351 166 461 375 +1482 /data/VOCdevkit/VOC2007/JPEGImages/002956.jpg 500 375 1 245 178 472 334 +1483 /data/VOCdevkit/VOC2007/JPEGImages/002957.jpg 500 375 8 1 36 437 375 11 158 157 348 240 +1484 /data/VOCdevkit/VOC2007/JPEGImages/002958.jpg 500 333 14 65 2 500 333 +1485 /data/VOCdevkit/VOC2007/JPEGImages/002960.jpg 500 333 14 47 75 271 315 +1486 /data/VOCdevkit/VOC2007/JPEGImages/002962.jpg 500 334 14 192 1 466 326 14 1 146 128 331 +1487 /data/VOCdevkit/VOC2007/JPEGImages/002963.jpg 500 375 16 72 36 500 375 +1488 /data/VOCdevkit/VOC2007/JPEGImages/002965.jpg 500 375 4 24 176 61 274 4 94 150 128 262 4 132 150 167 244 4 171 153 199 234 4 199 151 231 228 4 235 157 259 240 4 261 153 286 260 4 288 155 316 263 4 316 157 346 266 4 349 158 375 266 4 376 163 410 269 4 209 241 279 374 4 270 262 336 375 14 12 35 121 192 14 134 22 181 120 14 289 64 374 172 14 173 96 263 199 14 297 114 375 204 14 373 68 427 174 14 332 61 389 161 14 163 44 277 168 14 435 74 493 153 14 415 79 449 142 14 121 72 178 142 14 1 1 36 149 +1489 /data/VOCdevkit/VOC2007/JPEGImages/002966.jpg 500 334 11 2 2 500 333 +1490 /data/VOCdevkit/VOC2007/JPEGImages/002967.jpg 336 500 15 167 1 255 255 15 7 153 153 266 15 142 333 237 436 +1491 /data/VOCdevkit/VOC2007/JPEGImages/002969.jpg 500 375 2 139 125 500 374 +1492 /data/VOCdevkit/VOC2007/JPEGImages/002975.jpg 500 285 18 225 25 500 207 14 231 125 254 192 +1493 /data/VOCdevkit/VOC2007/JPEGImages/002976.jpg 251 500 14 3 199 240 500 +1494 /data/VOCdevkit/VOC2007/JPEGImages/002977.jpg 500 374 11 295 78 433 288 11 191 116 321 264 +1495 /data/VOCdevkit/VOC2007/JPEGImages/002978.jpg 500 375 9 435 113 465 153 9 262 112 422 262 9 2 129 232 322 +1496 /data/VOCdevkit/VOC2007/JPEGImages/002984.jpg 500 330 2 185 132 247 171 +1497 /data/VOCdevkit/VOC2007/JPEGImages/002986.jpg 500 375 16 1 38 141 200 16 1 176 190 375 16 226 143 365 311 16 318 128 468 300 16 236 209 500 375 16 388 32 475 120 16 444 5 500 96 16 161 73 256 166 16 201 74 359 233 16 100 1 211 91 16 384 1 486 72 +1498 /data/VOCdevkit/VOC2007/JPEGImages/002987.jpg 500 334 14 128 158 322 334 +1499 /data/VOCdevkit/VOC2007/JPEGImages/002988.jpg 500 375 14 105 18 407 335 +1500 /data/VOCdevkit/VOC2007/JPEGImages/002989.jpg 500 333 19 281 149 339 204 8 436 163 500 291 8 81 178 197 265 17 219 163 284 204 +1501 /data/VOCdevkit/VOC2007/JPEGImages/002990.jpg 500 375 14 199 177 259 308 +1502 /data/VOCdevkit/VOC2007/JPEGImages/002992.jpg 333 500 1 30 202 316 423 14 68 92 277 360 +1503 /data/VOCdevkit/VOC2007/JPEGImages/002994.jpg 500 375 6 164 280 309 338 6 67 282 147 328 +1504 /data/VOCdevkit/VOC2007/JPEGImages/002995.jpg 408 500 7 1 24 392 500 +1505 /data/VOCdevkit/VOC2007/JPEGImages/003000.jpg 500 333 0 193 114 278 164 +1506 /data/VOCdevkit/VOC2007/JPEGImages/003002.jpg 375 500 15 1 89 119 389 14 121 104 317 418 +1507 /data/VOCdevkit/VOC2007/JPEGImages/003003.jpg 500 375 14 199 139 349 375 14 344 130 500 375 14 27 181 97 341 14 1 174 32 319 +1508 /data/VOCdevkit/VOC2007/JPEGImages/003004.jpg 500 375 17 19 105 500 332 8 407 62 467 153 8 454 52 500 141 15 377 18 428 59 +1509 /data/VOCdevkit/VOC2007/JPEGImages/003005.jpg 500 375 17 5 149 246 367 19 229 82 298 143 +1510 /data/VOCdevkit/VOC2007/JPEGImages/003007.jpg 500 332 6 29 2 500 296 +1511 /data/VOCdevkit/VOC2007/JPEGImages/003008.jpg 500 333 3 211 127 263 146 +1512 /data/VOCdevkit/VOC2007/JPEGImages/003009.jpg 500 494 6 135 294 386 363 +1513 /data/VOCdevkit/VOC2007/JPEGImages/003011.jpg 500 375 17 198 192 385 258 17 274 218 478 374 19 35 141 142 243 19 211 150 250 190 +1514 /data/VOCdevkit/VOC2007/JPEGImages/003013.jpg 500 375 6 85 117 432 291 +1515 /data/VOCdevkit/VOC2007/JPEGImages/003015.jpg 500 375 12 182 128 274 218 +1516 /data/VOCdevkit/VOC2007/JPEGImages/003017.jpg 500 311 12 139 117 453 301 14 174 99 309 234 +1517 /data/VOCdevkit/VOC2007/JPEGImages/003021.jpg 500 375 5 26 43 478 305 +1518 /data/VOCdevkit/VOC2007/JPEGImages/003023.jpg 381 500 14 29 76 254 500 14 2 245 117 453 +1519 /data/VOCdevkit/VOC2007/JPEGImages/003024.jpg 500 208 17 5 72 150 163 15 128 1 201 117 15 212 32 256 102 15 223 31 256 64 1 453 96 500 177 14 291 74 326 119 +1520 /data/VOCdevkit/VOC2007/JPEGImages/003027.jpg 480 318 6 131 93 345 206 12 138 93 397 289 14 182 57 251 196 +1521 /data/VOCdevkit/VOC2007/JPEGImages/003028.jpg 500 334 0 1 42 499 293 +1522 /data/VOCdevkit/VOC2007/JPEGImages/003031.jpg 500 375 7 6 89 493 315 +1523 /data/VOCdevkit/VOC2007/JPEGImages/003032.jpg 500 375 0 34 90 471 232 6 132 253 176 306 6 1 240 143 331 +1524 /data/VOCdevkit/VOC2007/JPEGImages/003034.jpg 500 375 8 301 174 466 375 14 305 201 429 331 14 40 97 259 307 +1525 /data/VOCdevkit/VOC2007/JPEGImages/003038.jpg 500 335 18 114 107 250 283 +1526 /data/VOCdevkit/VOC2007/JPEGImages/003039.jpg 500 375 14 158 64 259 343 14 247 75 341 355 +1527 /data/VOCdevkit/VOC2007/JPEGImages/003042.jpg 500 375 8 29 115 100 180 10 2 94 121 147 10 169 101 321 174 10 100 187 407 366 14 89 85 220 294 14 321 75 496 372 14 132 12 167 84 +1528 /data/VOCdevkit/VOC2007/JPEGImages/003044.jpg 375 500 14 80 426 103 500 14 96 427 117 497 15 4 438 47 475 15 97 416 143 478 15 259 415 298 464 +1529 /data/VOCdevkit/VOC2007/JPEGImages/003045.jpg 500 375 7 153 54 500 248 +1530 /data/VOCdevkit/VOC2007/JPEGImages/003047.jpg 500 377 1 383 80 434 189 1 277 87 366 173 1 190 80 262 161 +1531 /data/VOCdevkit/VOC2007/JPEGImages/003051.jpg 500 333 6 30 82 283 207 +1532 /data/VOCdevkit/VOC2007/JPEGImages/003053.jpg 500 333 18 282 178 450 236 6 458 210 491 237 +1533 /data/VOCdevkit/VOC2007/JPEGImages/003054.jpg 500 375 17 22 163 334 333 6 398 142 459 185 +1534 /data/VOCdevkit/VOC2007/JPEGImages/003056.jpg 500 375 10 274 255 368 333 8 259 244 286 330 8 278 248 308 330 4 358 285 390 338 8 46 232 97 266 +1535 /data/VOCdevkit/VOC2007/JPEGImages/003057.jpg 375 500 13 103 108 298 426 14 103 102 310 391 6 3 121 144 224 +1536 /data/VOCdevkit/VOC2007/JPEGImages/003058.jpg 396 500 14 2 2 395 500 +1537 /data/VOCdevkit/VOC2007/JPEGImages/003061.jpg 500 333 8 286 11 446 220 8 93 25 259 158 +1538 /data/VOCdevkit/VOC2007/JPEGImages/003063.jpg 375 500 14 54 9 291 485 17 3 43 372 386 +1539 /data/VOCdevkit/VOC2007/JPEGImages/003064.jpg 375 500 14 79 103 215 500 +1540 /data/VOCdevkit/VOC2007/JPEGImages/003065.jpg 500 333 3 68 233 371 280 14 252 206 302 248 14 195 213 234 250 +1541 /data/VOCdevkit/VOC2007/JPEGImages/003066.jpg 500 426 2 139 170 255 270 +1542 /data/VOCdevkit/VOC2007/JPEGImages/003072.jpg 500 333 2 207 57 348 312 +1543 /data/VOCdevkit/VOC2007/JPEGImages/003074.jpg 500 333 2 298 167 353 196 2 206 192 260 222 2 146 219 196 248 +1544 /data/VOCdevkit/VOC2007/JPEGImages/003077.jpg 500 332 8 323 151 441 252 8 250 155 344 254 14 73 139 156 289 14 153 142 237 285 14 244 127 321 266 14 352 134 435 262 +1545 /data/VOCdevkit/VOC2007/JPEGImages/003078.jpg 500 500 8 15 181 75 261 8 74 174 110 249 8 303 202 387 317 8 468 188 500 307 8 400 188 465 296 14 379 137 468 296 14 341 146 397 281 14 89 19 323 494 14 196 15 338 481 +1546 /data/VOCdevkit/VOC2007/JPEGImages/003082.jpg 500 407 2 197 186 284 284 2 143 233 304 368 +1547 /data/VOCdevkit/VOC2007/JPEGImages/003083.jpg 375 500 6 344 455 375 480 5 270 426 375 480 +1548 /data/VOCdevkit/VOC2007/JPEGImages/003085.jpg 500 376 7 174 81 327 266 +1549 /data/VOCdevkit/VOC2007/JPEGImages/003086.jpg 500 375 14 321 157 403 358 +1550 /data/VOCdevkit/VOC2007/JPEGImages/003088.jpg 500 375 4 107 269 154 366 14 69 65 330 375 14 209 91 286 211 +1551 /data/VOCdevkit/VOC2007/JPEGImages/003089.jpg 500 333 13 192 74 452 333 14 148 31 290 319 +1552 /data/VOCdevkit/VOC2007/JPEGImages/003090.jpg 500 345 18 79 116 301 206 +1553 /data/VOCdevkit/VOC2007/JPEGImages/003092.jpg 500 334 6 154 46 440 247 +1554 /data/VOCdevkit/VOC2007/JPEGImages/003093.jpg 500 375 15 160 233 180 315 15 139 218 167 320 15 370 223 397 316 +1555 /data/VOCdevkit/VOC2007/JPEGImages/003094.jpg 500 333 6 19 30 500 259 +1556 /data/VOCdevkit/VOC2007/JPEGImages/003098.jpg 500 352 3 4 86 429 352 +1557 /data/VOCdevkit/VOC2007/JPEGImages/003100.jpg 400 375 14 136 193 180 297 11 49 263 175 330 11 220 264 294 319 11 214 243 269 286 11 153 278 228 322 +1558 /data/VOCdevkit/VOC2007/JPEGImages/003102.jpg 333 500 14 60 32 262 362 1 60 200 243 461 +1559 /data/VOCdevkit/VOC2007/JPEGImages/003103.jpg 361 226 6 33 64 328 186 +1560 /data/VOCdevkit/VOC2007/JPEGImages/003105.jpg 500 333 9 42 56 351 271 9 248 113 458 289 +1561 /data/VOCdevkit/VOC2007/JPEGImages/003106.jpg 500 375 7 208 238 404 324 14 185 15 401 374 +1562 /data/VOCdevkit/VOC2007/JPEGImages/003107.jpg 332 500 14 1 131 274 500 +1563 /data/VOCdevkit/VOC2007/JPEGImages/003108.jpg 500 375 17 214 43 500 333 4 364 273 388 354 +1564 /data/VOCdevkit/VOC2007/JPEGImages/003110.jpg 500 358 11 213 127 275 266 11 121 107 188 234 +1565 /data/VOCdevkit/VOC2007/JPEGImages/003112.jpg 500 449 2 164 87 306 332 +1566 /data/VOCdevkit/VOC2007/JPEGImages/003116.jpg 500 400 2 100 67 487 400 +1567 /data/VOCdevkit/VOC2007/JPEGImages/003117.jpg 500 333 6 152 52 439 310 +1568 /data/VOCdevkit/VOC2007/JPEGImages/003118.jpg 500 333 2 207 21 286 108 2 361 153 461 220 2 298 174 373 248 14 125 73 391 333 14 362 206 472 333 +1569 /data/VOCdevkit/VOC2007/JPEGImages/003120.jpg 500 375 19 223 162 281 209 8 169 241 251 335 17 13 214 159 327 +1570 /data/VOCdevkit/VOC2007/JPEGImages/003121.jpg 500 333 12 2 16 282 333 14 210 50 482 333 14 468 170 500 333 14 438 146 489 241 +1571 /data/VOCdevkit/VOC2007/JPEGImages/003122.jpg 500 375 4 5 265 116 340 4 412 254 437 318 14 33 78 192 375 14 176 85 352 375 14 309 68 500 375 +1572 /data/VOCdevkit/VOC2007/JPEGImages/003124.jpg 500 375 13 54 29 475 325 14 308 2 395 125 +1573 /data/VOCdevkit/VOC2007/JPEGImages/003126.jpg 500 375 2 132 156 280 248 +1574 /data/VOCdevkit/VOC2007/JPEGImages/003127.jpg 500 375 7 3 2 499 350 +1575 /data/VOCdevkit/VOC2007/JPEGImages/003129.jpg 500 375 14 1 63 328 374 14 362 177 500 291 14 441 122 500 247 14 354 163 411 256 14 318 169 363 220 14 253 163 324 234 14 1 144 19 245 14 95 169 114 214 14 72 168 88 219 14 53 170 71 219 +1576 /data/VOCdevkit/VOC2007/JPEGImages/003133.jpg 500 333 0 32 55 435 213 +1577 /data/VOCdevkit/VOC2007/JPEGImages/003134.jpg 500 366 14 64 86 184 317 14 160 72 300 284 14 270 1 483 366 +1578 /data/VOCdevkit/VOC2007/JPEGImages/003135.jpg 500 375 18 2 114 497 276 +1579 /data/VOCdevkit/VOC2007/JPEGImages/003137.jpg 500 375 5 1 45 406 310 +1580 /data/VOCdevkit/VOC2007/JPEGImages/003138.jpg 500 375 14 205 76 445 375 14 1 119 144 374 14 387 122 454 220 +1581 /data/VOCdevkit/VOC2007/JPEGImages/003140.jpg 500 335 14 277 26 500 335 14 16 76 343 335 +1582 /data/VOCdevkit/VOC2007/JPEGImages/003142.jpg 500 375 1 52 39 402 344 +1583 /data/VOCdevkit/VOC2007/JPEGImages/003145.jpg 500 375 14 17 27 351 375 14 315 39 500 375 +1584 /data/VOCdevkit/VOC2007/JPEGImages/003146.jpg 500 375 15 43 153 214 319 +1585 /data/VOCdevkit/VOC2007/JPEGImages/003147.jpg 500 332 11 153 145 366 257 14 54 34 139 248 +1586 /data/VOCdevkit/VOC2007/JPEGImages/003149.jpg 500 375 4 72 36 153 288 4 178 16 308 74 4 144 46 296 225 4 245 49 387 148 4 131 31 464 331 4 140 224 395 375 +1587 /data/VOCdevkit/VOC2007/JPEGImages/003150.jpg 500 375 14 194 71 463 340 14 108 44 257 188 14 1 53 132 286 17 1 69 303 273 +1588 /data/VOCdevkit/VOC2007/JPEGImages/003154.jpg 500 375 5 162 102 468 302 +1589 /data/VOCdevkit/VOC2007/JPEGImages/003155.jpg 333 500 2 4 121 313 419 +1590 /data/VOCdevkit/VOC2007/JPEGImages/003157.jpg 375 500 19 137 57 303 185 +1591 /data/VOCdevkit/VOC2007/JPEGImages/003159.jpg 480 360 14 330 84 448 316 14 52 97 191 294 14 1 63 41 298 4 266 218 287 286 4 248 200 269 268 4 188 294 219 360 +1592 /data/VOCdevkit/VOC2007/JPEGImages/003161.jpg 500 328 16 394 158 450 276 16 330 177 381 284 16 220 167 272 280 16 174 162 225 276 11 113 161 157 224 +1593 /data/VOCdevkit/VOC2007/JPEGImages/003162.jpg 500 366 13 25 89 483 355 14 115 11 353 223 +1594 /data/VOCdevkit/VOC2007/JPEGImages/003163.jpg 500 295 5 56 66 441 240 +1595 /data/VOCdevkit/VOC2007/JPEGImages/003164.jpg 500 375 18 26 43 500 311 +1596 /data/VOCdevkit/VOC2007/JPEGImages/003165.jpg 323 355 6 42 52 273 301 +1597 /data/VOCdevkit/VOC2007/JPEGImages/003169.jpg 500 375 7 54 113 474 332 +1598 /data/VOCdevkit/VOC2007/JPEGImages/003170.jpg 500 375 16 381 211 458 283 16 344 224 383 281 16 70 202 165 275 14 19 121 75 259 14 109 143 179 222 14 146 166 190 263 14 176 167 219 262 14 206 171 241 258 14 195 143 268 220 +1599 /data/VOCdevkit/VOC2007/JPEGImages/003175.jpg 333 500 1 1 323 292 500 14 10 100 325 500 +1600 /data/VOCdevkit/VOC2007/JPEGImages/003176.jpg 375 500 6 139 160 287 311 +1601 /data/VOCdevkit/VOC2007/JPEGImages/003177.jpg 375 500 11 54 2 375 435 +1602 /data/VOCdevkit/VOC2007/JPEGImages/003178.jpg 500 375 18 72 138 411 269 +1603 /data/VOCdevkit/VOC2007/JPEGImages/003181.jpg 500 375 4 286 142 328 271 4 356 157 415 303 14 2 32 270 333 14 1 3 65 79 +1604 /data/VOCdevkit/VOC2007/JPEGImages/003183.jpg 500 375 0 220 176 243 191 +1605 /data/VOCdevkit/VOC2007/JPEGImages/003184.jpg 500 375 7 2 74 500 375 7 147 78 430 361 +1606 /data/VOCdevkit/VOC2007/JPEGImages/003185.jpg 500 375 14 231 169 316 279 14 312 170 419 287 4 432 210 482 366 4 390 213 415 293 14 105 73 231 375 14 35 66 118 375 +1607 /data/VOCdevkit/VOC2007/JPEGImages/003186.jpg 500 332 17 1 169 214 288 8 295 158 347 223 8 220 168 263 221 15 263 136 302 166 +1608 /data/VOCdevkit/VOC2007/JPEGImages/003188.jpg 500 375 1 54 125 320 375 14 257 4 435 375 +1609 /data/VOCdevkit/VOC2007/JPEGImages/003189.jpg 458 500 12 175 170 271 334 14 163 54 289 284 15 177 328 268 477 15 90 269 139 359 +1610 /data/VOCdevkit/VOC2007/JPEGImages/003194.jpg 500 333 11 1 16 374 299 +1611 /data/VOCdevkit/VOC2007/JPEGImages/003195.jpg 500 333 5 167 149 321 276 6 327 227 474 269 +1612 /data/VOCdevkit/VOC2007/JPEGImages/003199.jpg 500 333 2 124 38 376 328 +1613 /data/VOCdevkit/VOC2007/JPEGImages/003200.jpg 500 379 0 213 209 456 272 0 1 68 228 288 +1614 /data/VOCdevkit/VOC2007/JPEGImages/003202.jpg 500 375 8 334 119 398 206 8 172 139 295 275 15 26 117 127 251 +1615 /data/VOCdevkit/VOC2007/JPEGImages/003204.jpg 500 375 19 172 195 278 299 +1616 /data/VOCdevkit/VOC2007/JPEGImages/003205.jpg 333 500 14 28 76 306 376 8 11 168 322 447 +1617 /data/VOCdevkit/VOC2007/JPEGImages/003207.jpg 500 333 4 124 6 162 102 4 94 36 132 91 4 71 57 108 166 4 100 58 150 188 4 13 71 61 184 4 152 115 203 237 4 216 102 261 222 4 259 134 307 260 4 308 126 356 251 4 350 139 408 264 +1618 /data/VOCdevkit/VOC2007/JPEGImages/003210.jpg 351 480 12 46 73 265 456 14 97 51 223 266 +1619 /data/VOCdevkit/VOC2007/JPEGImages/003211.jpg 500 375 15 306 122 427 366 15 334 173 374 298 15 206 195 246 287 +1620 /data/VOCdevkit/VOC2007/JPEGImages/003213.jpg 500 334 14 279 1 497 138 14 1 54 72 290 7 1 47 352 334 +1621 /data/VOCdevkit/VOC2007/JPEGImages/003214.jpg 500 375 6 230 143 496 220 +1622 /data/VOCdevkit/VOC2007/JPEGImages/003216.jpg 500 333 11 135 74 380 285 +1623 /data/VOCdevkit/VOC2007/JPEGImages/003218.jpg 500 334 1 235 161 286 254 1 439 162 485 261 1 281 159 324 238 1 324 144 349 220 1 172 176 224 277 1 83 127 117 178 14 430 93 482 241 14 232 95 280 224 14 279 100 321 212 14 83 91 115 168 14 304 88 338 152 14 347 85 378 198 14 376 81 396 191 14 455 74 483 138 14 330 82 359 187 14 36 88 80 245 14 132 82 154 157 14 11 80 47 227 14 242 81 251 100 14 227 73 238 91 14 213 77 233 116 14 109 84 135 157 +1624 /data/VOCdevkit/VOC2007/JPEGImages/003219.jpg 334 500 10 14 162 334 500 4 104 126 120 185 +1625 /data/VOCdevkit/VOC2007/JPEGImages/003223.jpg 375 500 3 136 230 230 299 +1626 /data/VOCdevkit/VOC2007/JPEGImages/003228.jpg 500 333 6 305 104 394 183 14 453 112 482 175 11 11 227 80 325 5 2 37 217 200 5 205 84 295 162 +1627 /data/VOCdevkit/VOC2007/JPEGImages/003229.jpg 500 375 0 347 161 433 225 +1628 /data/VOCdevkit/VOC2007/JPEGImages/003231.jpg 375 500 6 38 270 167 366 +1629 /data/VOCdevkit/VOC2007/JPEGImages/003233.jpg 500 375 0 1 78 498 344 +1630 /data/VOCdevkit/VOC2007/JPEGImages/003236.jpg 500 375 14 309 267 376 340 14 2 145 49 192 17 243 1 500 282 +1631 /data/VOCdevkit/VOC2007/JPEGImages/003239.jpg 500 375 8 316 160 448 288 15 83 241 135 328 +1632 /data/VOCdevkit/VOC2007/JPEGImages/003240.jpg 374 500 6 184 141 374 278 6 1 412 130 500 1 49 339 111 416 6 4 1 145 31 +1633 /data/VOCdevkit/VOC2007/JPEGImages/003242.jpg 500 375 2 181 148 272 251 +1634 /data/VOCdevkit/VOC2007/JPEGImages/003243.jpg 500 375 6 153 195 223 227 6 364 200 426 230 +1635 /data/VOCdevkit/VOC2007/JPEGImages/003244.jpg 500 375 18 1 142 498 245 +1636 /data/VOCdevkit/VOC2007/JPEGImages/003247.jpg 500 375 14 261 14 380 332 14 158 29 265 335 +1637 /data/VOCdevkit/VOC2007/JPEGImages/003250.jpg 500 333 2 174 24 355 333 +1638 /data/VOCdevkit/VOC2007/JPEGImages/003253.jpg 500 430 11 8 126 249 405 11 313 19 500 304 14 1 1 500 426 +1639 /data/VOCdevkit/VOC2007/JPEGImages/003254.jpg 500 375 2 210 132 301 205 +1640 /data/VOCdevkit/VOC2007/JPEGImages/003255.jpg 500 375 17 33 103 500 375 +1641 /data/VOCdevkit/VOC2007/JPEGImages/003256.jpg 500 375 6 157 86 327 154 2 244 227 273 266 +1642 /data/VOCdevkit/VOC2007/JPEGImages/003258.jpg 500 333 17 200 198 500 333 19 212 130 256 169 +1643 /data/VOCdevkit/VOC2007/JPEGImages/003259.jpg 500 333 4 467 243 500 333 14 97 53 298 298 +1644 /data/VOCdevkit/VOC2007/JPEGImages/003260.jpg 326 500 19 261 111 326 198 14 11 58 112 449 14 118 76 201 431 14 187 72 261 425 +1645 /data/VOCdevkit/VOC2007/JPEGImages/003261.jpg 500 375 6 218 178 239 198 14 1 1 206 374 14 1 1 205 375 +1646 /data/VOCdevkit/VOC2007/JPEGImages/003262.jpg 500 375 4 179 10 339 304 +1647 /data/VOCdevkit/VOC2007/JPEGImages/003269.jpg 500 375 4 359 1 500 373 4 217 2 357 373 4 54 1 220 374 +1648 /data/VOCdevkit/VOC2007/JPEGImages/003270.jpg 500 333 2 118 80 327 305 14 149 19 287 333 +1649 /data/VOCdevkit/VOC2007/JPEGImages/003271.jpg 500 375 6 41 78 467 326 +1650 /data/VOCdevkit/VOC2007/JPEGImages/003272.jpg 500 335 7 226 119 434 311 +1651 /data/VOCdevkit/VOC2007/JPEGImages/003273.jpg 375 500 2 141 104 305 284 +1652 /data/VOCdevkit/VOC2007/JPEGImages/003274.jpg 500 375 11 148 77 298 239 +1653 /data/VOCdevkit/VOC2007/JPEGImages/003279.jpg 500 400 17 174 85 500 270 +1654 /data/VOCdevkit/VOC2007/JPEGImages/003280.jpg 500 333 14 107 59 494 333 +1655 /data/VOCdevkit/VOC2007/JPEGImages/003282.jpg 334 500 14 137 179 334 443 14 2 19 334 500 +1656 /data/VOCdevkit/VOC2007/JPEGImages/003284.jpg 500 375 15 336 186 441 227 14 61 172 233 372 11 345 303 443 375 +1657 /data/VOCdevkit/VOC2007/JPEGImages/003285.jpg 500 281 6 27 118 193 259 6 231 131 330 162 6 249 138 426 189 +1658 /data/VOCdevkit/VOC2007/JPEGImages/003290.jpg 500 332 12 238 76 403 285 12 121 129 248 246 14 181 90 230 202 14 312 24 404 218 14 286 80 314 106 +1659 /data/VOCdevkit/VOC2007/JPEGImages/003292.jpg 360 240 14 18 114 48 171 14 46 128 74 201 14 269 137 305 221 14 126 44 231 240 +1660 /data/VOCdevkit/VOC2007/JPEGImages/003293.jpg 333 500 11 2 86 333 500 +1661 /data/VOCdevkit/VOC2007/JPEGImages/003294.jpg 332 500 12 27 72 332 500 +1662 /data/VOCdevkit/VOC2007/JPEGImages/003296.jpg 500 374 14 2 58 252 374 14 218 58 500 374 +1663 /data/VOCdevkit/VOC2007/JPEGImages/003299.jpg 500 335 0 2 3 499 260 +1664 /data/VOCdevkit/VOC2007/JPEGImages/003300.jpg 500 375 17 330 186 450 291 10 227 274 471 375 19 230 148 279 190 +1665 /data/VOCdevkit/VOC2007/JPEGImages/003301.jpg 500 333 14 97 41 271 333 11 104 196 236 294 15 4 110 109 309 +1666 /data/VOCdevkit/VOC2007/JPEGImages/003303.jpg 332 500 14 197 175 282 308 14 62 162 149 304 12 212 212 260 347 12 78 221 132 339 +1667 /data/VOCdevkit/VOC2007/JPEGImages/003307.jpg 338 299 12 3 29 308 251 +1668 /data/VOCdevkit/VOC2007/JPEGImages/003308.jpg 375 500 7 174 58 257 104 8 11 277 181 500 +1669 /data/VOCdevkit/VOC2007/JPEGImages/003311.jpg 500 375 5 126 136 401 264 14 410 206 425 250 +1670 /data/VOCdevkit/VOC2007/JPEGImages/003313.jpg 500 333 6 181 106 426 207 14 340 4 369 87 14 285 119 310 146 +1671 /data/VOCdevkit/VOC2007/JPEGImages/003316.jpg 500 403 2 204 112 406 340 +1672 /data/VOCdevkit/VOC2007/JPEGImages/003320.jpg 500 333 14 333 80 490 333 14 207 83 362 333 14 1 71 185 333 14 10 162 53 220 14 288 136 323 181 +1673 /data/VOCdevkit/VOC2007/JPEGImages/003325.jpg 500 375 11 23 12 217 374 11 332 128 500 375 +1674 /data/VOCdevkit/VOC2007/JPEGImages/003327.jpg 375 500 13 90 35 325 476 14 291 2 375 264 +1675 /data/VOCdevkit/VOC2007/JPEGImages/003330.jpg 500 333 2 268 96 375 247 2 166 70 238 146 +1676 /data/VOCdevkit/VOC2007/JPEGImages/003331.jpg 500 333 6 161 140 313 226 6 438 134 500 179 6 101 145 190 181 6 280 139 351 171 6 422 121 480 153 +1677 /data/VOCdevkit/VOC2007/JPEGImages/003335.jpg 500 375 8 39 167 116 276 8 390 163 500 284 8 135 172 195 259 14 187 59 380 350 14 125 82 216 244 8 438 182 500 319 +1678 /data/VOCdevkit/VOC2007/JPEGImages/003336.jpg 500 375 13 3 61 242 375 13 291 21 419 91 13 144 29 247 89 +1679 /data/VOCdevkit/VOC2007/JPEGImages/003337.jpg 500 375 3 71 146 365 210 +1680 /data/VOCdevkit/VOC2007/JPEGImages/003338.jpg 500 329 2 196 75 334 285 +1681 /data/VOCdevkit/VOC2007/JPEGImages/003339.jpg 432 288 11 21 24 314 288 +1682 /data/VOCdevkit/VOC2007/JPEGImages/003343.jpg 500 375 11 167 82 407 333 +1683 /data/VOCdevkit/VOC2007/JPEGImages/003344.jpg 500 333 6 139 133 415 277 6 116 117 176 154 14 59 89 119 278 6 213 90 257 103 6 245 89 291 103 6 291 89 338 107 6 405 90 451 111 6 436 87 493 115 6 473 89 500 116 +1684 /data/VOCdevkit/VOC2007/JPEGImages/003349.jpg 500 333 2 88 55 327 289 +1685 /data/VOCdevkit/VOC2007/JPEGImages/003350.jpg 500 334 10 1 1 472 332 +1686 /data/VOCdevkit/VOC2007/JPEGImages/003351.jpg 500 375 7 160 83 461 347 +1687 /data/VOCdevkit/VOC2007/JPEGImages/003354.jpg 500 331 9 93 75 256 223 +1688 /data/VOCdevkit/VOC2007/JPEGImages/003355.jpg 500 335 14 226 122 376 276 6 2 2 324 242 6 329 2 500 134 6 220 53 486 175 +1689 /data/VOCdevkit/VOC2007/JPEGImages/003356.jpg 500 375 19 99 63 387 326 +1690 /data/VOCdevkit/VOC2007/JPEGImages/003359.jpg 500 382 6 22 31 426 365 6 342 37 500 229 +1691 /data/VOCdevkit/VOC2007/JPEGImages/003360.jpg 333 500 14 40 4 312 408 11 99 254 220 481 +1692 /data/VOCdevkit/VOC2007/JPEGImages/003362.jpg 500 332 12 174 122 282 263 14 171 44 294 226 +1693 /data/VOCdevkit/VOC2007/JPEGImages/003363.jpg 334 500 6 2 233 314 479 6 300 259 334 291 +1694 /data/VOCdevkit/VOC2007/JPEGImages/003365.jpg 500 333 0 118 108 450 197 +1695 /data/VOCdevkit/VOC2007/JPEGImages/003367.jpg 500 375 14 1 174 38 253 13 15 213 111 302 15 354 167 389 267 15 387 130 418 170 15 422 128 447 171 15 476 142 496 173 +1696 /data/VOCdevkit/VOC2007/JPEGImages/003369.jpg 500 375 14 259 212 284 310 14 225 215 252 310 0 1 1 447 299 +1697 /data/VOCdevkit/VOC2007/JPEGImages/003370.jpg 500 332 18 162 93 289 276 +1698 /data/VOCdevkit/VOC2007/JPEGImages/003373.jpg 500 375 11 232 160 441 329 14 176 1 330 196 +1699 /data/VOCdevkit/VOC2007/JPEGImages/003374.jpg 480 359 19 26 12 206 128 15 230 66 272 132 11 135 118 311 359 +1700 /data/VOCdevkit/VOC2007/JPEGImages/003376.jpg 500 375 8 114 264 216 375 8 369 210 485 375 4 458 305 479 375 14 192 118 302 375 14 415 192 500 324 +1701 /data/VOCdevkit/VOC2007/JPEGImages/003377.jpg 375 500 2 135 141 292 360 +1702 /data/VOCdevkit/VOC2007/JPEGImages/003379.jpg 500 333 6 68 114 409 213 +1703 /data/VOCdevkit/VOC2007/JPEGImages/003380.jpg 500 375 14 8 85 248 375 14 245 27 500 375 +1704 /data/VOCdevkit/VOC2007/JPEGImages/003382.jpg 375 500 16 4 141 127 224 16 6 272 235 500 14 146 158 375 500 +1705 /data/VOCdevkit/VOC2007/JPEGImages/003386.jpg 500 281 0 1 76 500 281 14 26 52 47 102 +1706 /data/VOCdevkit/VOC2007/JPEGImages/003390.jpg 500 375 6 147 116 403 340 14 104 73 143 250 14 1 71 61 375 14 45 89 80 168 +1707 /data/VOCdevkit/VOC2007/JPEGImages/003391.jpg 500 375 14 120 223 187 375 13 77 278 263 375 +1708 /data/VOCdevkit/VOC2007/JPEGImages/003392.jpg 500 375 7 135 3 497 375 +1709 /data/VOCdevkit/VOC2007/JPEGImages/003395.jpg 375 500 1 78 212 317 493 14 82 136 322 378 +1710 /data/VOCdevkit/VOC2007/JPEGImages/003396.jpg 500 344 13 14 84 376 330 13 192 75 387 330 14 124 50 371 279 14 287 37 427 164 +1711 /data/VOCdevkit/VOC2007/JPEGImages/003397.jpg 500 375 14 232 197 334 315 6 15 168 258 321 +1712 /data/VOCdevkit/VOC2007/JPEGImages/003398.jpg 500 375 19 52 25 455 368 +1713 /data/VOCdevkit/VOC2007/JPEGImages/003401.jpg 500 281 19 246 106 301 183 8 19 141 191 281 +1714 /data/VOCdevkit/VOC2007/JPEGImages/003403.jpg 500 334 12 71 43 496 290 14 170 18 330 208 +1715 /data/VOCdevkit/VOC2007/JPEGImages/003404.jpg 500 375 3 140 124 316 206 +1716 /data/VOCdevkit/VOC2007/JPEGImages/003406.jpg 500 375 14 341 37 458 361 14 442 75 500 292 6 2 4 500 374 +1717 /data/VOCdevkit/VOC2007/JPEGImages/003407.jpg 500 375 5 1 100 394 287 14 202 104 395 374 14 28 160 181 375 +1718 /data/VOCdevkit/VOC2007/JPEGImages/003408.jpg 500 375 17 298 259 500 375 +1719 /data/VOCdevkit/VOC2007/JPEGImages/003410.jpg 500 375 9 66 149 240 237 +1720 /data/VOCdevkit/VOC2007/JPEGImages/003412.jpg 332 500 13 60 131 332 500 14 131 62 332 440 +1721 /data/VOCdevkit/VOC2007/JPEGImages/003413.jpg 500 375 3 327 236 440 316 3 274 280 396 315 3 256 120 311 320 3 68 29 259 327 3 43 296 87 324 +1722 /data/VOCdevkit/VOC2007/JPEGImages/003415.jpg 500 374 7 197 2 500 217 7 128 153 334 373 +1723 /data/VOCdevkit/VOC2007/JPEGImages/003416.jpg 500 333 2 352 64 383 106 2 194 128 271 185 2 148 180 188 288 14 1 11 320 296 +1724 /data/VOCdevkit/VOC2007/JPEGImages/003417.jpg 500 335 18 20 83 433 257 14 132 222 195 280 14 1 257 61 326 +1725 /data/VOCdevkit/VOC2007/JPEGImages/003419.jpg 500 375 15 229 62 280 89 15 210 116 256 150 15 125 103 184 167 15 163 130 214 197 15 203 143 293 262 15 277 88 369 235 15 355 151 463 316 15 19 170 102 302 15 1 225 26 345 15 1 117 68 180 15 1 154 64 209 15 65 100 87 150 15 33 94 56 134 15 26 29 62 90 15 2 28 30 86 15 459 178 500 302 15 454 78 495 145 15 450 142 500 199 +1726 /data/VOCdevkit/VOC2007/JPEGImages/003420.jpg 500 375 6 25 216 121 266 6 111 219 203 264 6 178 219 270 262 6 242 223 333 260 6 293 226 380 261 6 351 230 429 261 +1727 /data/VOCdevkit/VOC2007/JPEGImages/003421.jpg 375 500 8 107 322 300 500 +1728 /data/VOCdevkit/VOC2007/JPEGImages/003422.jpg 500 375 14 248 121 447 262 14 1 85 239 375 10 124 222 500 375 +1729 /data/VOCdevkit/VOC2007/JPEGImages/003424.jpg 333 500 12 29 239 230 500 14 102 312 333 500 14 95 82 269 412 +1730 /data/VOCdevkit/VOC2007/JPEGImages/003425.jpg 500 375 11 44 1 408 291 +1731 /data/VOCdevkit/VOC2007/JPEGImages/003429.jpg 480 351 14 200 18 323 163 12 123 59 406 217 +1732 /data/VOCdevkit/VOC2007/JPEGImages/003430.jpg 500 375 11 150 128 355 324 +1733 /data/VOCdevkit/VOC2007/JPEGImages/003433.jpg 375 500 1 18 166 181 494 14 146 16 327 395 8 240 312 340 455 +1734 /data/VOCdevkit/VOC2007/JPEGImages/003435.jpg 500 334 14 255 17 500 334 14 55 151 266 334 +1735 /data/VOCdevkit/VOC2007/JPEGImages/003436.jpg 500 375 12 74 138 135 271 12 151 101 291 358 12 278 92 439 361 15 443 180 477 236 14 122 92 150 135 14 196 58 244 116 +1736 /data/VOCdevkit/VOC2007/JPEGImages/003439.jpg 500 333 9 263 177 420 295 9 86 89 279 295 +1737 /data/VOCdevkit/VOC2007/JPEGImages/003441.jpg 500 375 5 105 98 378 274 +1738 /data/VOCdevkit/VOC2007/JPEGImages/003443.jpg 500 375 11 59 96 229 233 +1739 /data/VOCdevkit/VOC2007/JPEGImages/003444.jpg 369 270 17 36 91 304 263 +1740 /data/VOCdevkit/VOC2007/JPEGImages/003449.jpg 500 375 19 3 20 121 312 4 190 241 283 294 4 107 245 170 298 19 377 2 500 89 +1741 /data/VOCdevkit/VOC2007/JPEGImages/003450.jpg 500 388 14 183 125 266 354 14 238 133 356 276 14 135 168 235 285 17 22 133 423 370 15 360 58 480 195 +1742 /data/VOCdevkit/VOC2007/JPEGImages/003451.jpg 500 333 17 235 154 408 225 8 212 167 260 246 19 390 202 466 277 4 7 217 25 260 +1743 /data/VOCdevkit/VOC2007/JPEGImages/003452.jpg 333 500 10 86 300 257 471 8 173 328 325 500 8 70 301 185 475 +1744 /data/VOCdevkit/VOC2007/JPEGImages/003453.jpg 500 375 14 107 107 421 282 +1745 /data/VOCdevkit/VOC2007/JPEGImages/003455.jpg 500 333 0 1 40 452 333 14 210 105 238 135 +1746 /data/VOCdevkit/VOC2007/JPEGImages/003458.jpg 328 500 2 120 121 326 474 2 17 161 224 493 +1747 /data/VOCdevkit/VOC2007/JPEGImages/003461.jpg 500 333 6 8 207 180 275 6 1 276 163 333 6 206 207 284 333 6 282 205 387 333 6 408 160 493 321 6 395 18 476 163 6 312 46 389 203 6 315 1 374 46 6 237 1 306 123 6 80 1 224 63 6 64 26 231 137 8 124 253 157 298 6 10 43 71 124 +1748 /data/VOCdevkit/VOC2007/JPEGImages/003462.jpg 500 375 11 134 187 316 375 11 196 41 337 242 14 130 1 262 192 +1749 /data/VOCdevkit/VOC2007/JPEGImages/003464.jpg 500 327 18 1 84 445 288 +1750 /data/VOCdevkit/VOC2007/JPEGImages/003465.jpg 500 375 14 132 184 289 320 +1751 /data/VOCdevkit/VOC2007/JPEGImages/003466.jpg 500 375 14 177 15 445 283 15 1 100 43 174 +1752 /data/VOCdevkit/VOC2007/JPEGImages/003468.jpg 500 375 14 353 202 388 331 1 346 258 384 352 +1753 /data/VOCdevkit/VOC2007/JPEGImages/003469.jpg 500 375 1 139 145 362 372 14 68 26 185 358 14 211 1 462 308 +1754 /data/VOCdevkit/VOC2007/JPEGImages/003470.jpg 333 500 14 66 2 295 462 14 17 47 86 198 14 48 36 79 127 14 79 31 105 119 14 88 52 128 116 14 272 24 303 87 14 299 64 322 103 +1755 /data/VOCdevkit/VOC2007/JPEGImages/003477.jpg 500 375 8 98 115 259 351 +1756 /data/VOCdevkit/VOC2007/JPEGImages/003484.jpg 500 333 14 468 35 493 78 14 464 29 500 159 14 450 43 475 93 14 405 30 433 120 6 49 65 491 323 +1757 /data/VOCdevkit/VOC2007/JPEGImages/003487.jpg 500 375 14 267 241 380 375 14 50 161 416 374 19 324 31 384 89 +1758 /data/VOCdevkit/VOC2007/JPEGImages/003489.jpg 500 375 11 280 32 456 257 +1759 /data/VOCdevkit/VOC2007/JPEGImages/003491.jpg 500 375 11 31 15 419 347 +1760 /data/VOCdevkit/VOC2007/JPEGImages/003492.jpg 500 366 12 100 2 500 366 14 134 84 458 366 14 39 96 143 366 +1761 /data/VOCdevkit/VOC2007/JPEGImages/003493.jpg 500 372 0 137 119 440 234 +1762 /data/VOCdevkit/VOC2007/JPEGImages/003496.jpg 500 333 4 384 199 415 269 14 448 69 500 239 14 235 61 437 333 14 1 5 466 333 14 1 34 105 155 14 433 91 458 146 14 86 90 117 131 14 245 106 268 146 14 265 138 287 157 14 206 107 270 165 +1763 /data/VOCdevkit/VOC2007/JPEGImages/003497.jpg 500 335 18 25 101 357 254 +1764 /data/VOCdevkit/VOC2007/JPEGImages/003499.jpg 500 375 18 107 26 496 324 +1765 /data/VOCdevkit/VOC2007/JPEGImages/003500.jpg 500 375 7 1 81 373 368 +1766 /data/VOCdevkit/VOC2007/JPEGImages/003506.jpg 500 332 15 63 42 261 287 +1767 /data/VOCdevkit/VOC2007/JPEGImages/003508.jpg 333 500 11 1 157 269 500 +1768 /data/VOCdevkit/VOC2007/JPEGImages/003509.jpg 375 500 15 184 28 375 499 +1769 /data/VOCdevkit/VOC2007/JPEGImages/003510.jpg 500 375 8 410 244 463 347 +1770 /data/VOCdevkit/VOC2007/JPEGImages/003511.jpg 500 332 1 52 9 469 323 +1771 /data/VOCdevkit/VOC2007/JPEGImages/003516.jpg 500 333 10 61 154 439 291 8 367 132 478 287 8 2 132 111 284 8 270 154 363 315 8 177 155 262 308 8 71 153 181 312 +1772 /data/VOCdevkit/VOC2007/JPEGImages/003518.jpg 500 333 8 1 31 141 333 14 66 63 366 333 14 1 1 106 288 +1773 /data/VOCdevkit/VOC2007/JPEGImages/003519.jpg 500 375 2 114 84 316 375 +1774 /data/VOCdevkit/VOC2007/JPEGImages/003521.jpg 500 375 8 144 151 351 375 8 357 108 439 279 14 330 110 500 375 14 147 135 328 375 14 1 2 112 375 +1775 /data/VOCdevkit/VOC2007/JPEGImages/003522.jpg 500 375 7 249 2 500 328 +1776 /data/VOCdevkit/VOC2007/JPEGImages/003524.jpg 459 500 2 34 39 418 480 +1777 /data/VOCdevkit/VOC2007/JPEGImages/003525.jpg 500 375 7 160 1 448 375 +1778 /data/VOCdevkit/VOC2007/JPEGImages/003528.jpg 500 375 17 1 22 458 361 14 316 123 500 375 14 263 24 384 341 14 143 145 301 374 14 35 138 162 374 14 40 49 178 245 14 153 44 340 346 14 401 2 500 321 +1779 /data/VOCdevkit/VOC2007/JPEGImages/003529.jpg 500 333 14 94 45 334 305 +1780 /data/VOCdevkit/VOC2007/JPEGImages/003530.jpg 500 375 14 6 117 376 375 +1781 /data/VOCdevkit/VOC2007/JPEGImages/003536.jpg 500 375 11 111 100 500 375 +1782 /data/VOCdevkit/VOC2007/JPEGImages/003537.jpg 500 291 18 75 46 473 240 +1783 /data/VOCdevkit/VOC2007/JPEGImages/003539.jpg 500 375 13 78 149 213 349 13 298 144 417 341 13 422 123 493 231 14 294 75 432 316 14 82 64 226 327 14 412 78 461 201 +1784 /data/VOCdevkit/VOC2007/JPEGImages/003546.jpg 500 375 7 132 82 257 228 +1785 /data/VOCdevkit/VOC2007/JPEGImages/003548.jpg 500 375 14 51 36 500 375 +1786 /data/VOCdevkit/VOC2007/JPEGImages/003549.jpg 370 278 1 4 41 192 202 1 159 48 350 215 +1787 /data/VOCdevkit/VOC2007/JPEGImages/003550.jpg 333 500 14 153 16 291 500 14 36 22 174 500 +1788 /data/VOCdevkit/VOC2007/JPEGImages/003551.jpg 500 375 6 32 112 432 291 6 1 106 217 194 6 298 99 358 118 6 339 104 418 133 +1789 /data/VOCdevkit/VOC2007/JPEGImages/003554.jpg 500 333 0 75 126 436 250 +1790 /data/VOCdevkit/VOC2007/JPEGImages/003555.jpg 500 375 15 405 261 427 288 15 375 265 397 290 15 337 265 359 296 15 288 270 315 297 15 236 272 259 304 6 438 241 500 301 +1791 /data/VOCdevkit/VOC2007/JPEGImages/003556.jpg 357 500 14 129 5 306 453 4 72 378 99 470 +1792 /data/VOCdevkit/VOC2007/JPEGImages/003564.jpg 500 335 18 93 51 339 304 +1793 /data/VOCdevkit/VOC2007/JPEGImages/003565.jpg 500 375 2 280 218 500 317 +1794 /data/VOCdevkit/VOC2007/JPEGImages/003566.jpg 375 500 4 223 291 243 338 14 113 133 227 340 +1795 /data/VOCdevkit/VOC2007/JPEGImages/003567.jpg 500 331 14 114 47 149 168 14 184 48 344 276 13 178 109 338 292 13 1 103 35 141 +1796 /data/VOCdevkit/VOC2007/JPEGImages/003575.jpg 500 375 14 20 151 266 375 14 195 140 320 264 14 355 117 487 282 17 22 146 344 364 +1797 /data/VOCdevkit/VOC2007/JPEGImages/003576.jpg 500 265 5 200 69 500 231 13 366 137 500 241 14 407 100 480 219 14 126 112 157 193 14 171 112 203 192 14 245 111 271 143 +1798 /data/VOCdevkit/VOC2007/JPEGImages/003577.jpg 500 375 4 93 237 128 339 4 121 230 153 333 4 171 220 198 304 14 249 115 340 220 14 344 107 445 260 14 320 105 500 375 14 117 130 199 241 14 2 127 149 286 10 1 206 420 375 +1799 /data/VOCdevkit/VOC2007/JPEGImages/003580.jpg 398 500 14 1 6 352 500 +1800 /data/VOCdevkit/VOC2007/JPEGImages/003585.jpg 333 500 14 138 183 259 411 13 89 244 291 425 +1801 /data/VOCdevkit/VOC2007/JPEGImages/003586.jpg 320 212 7 2 1 247 188 +1802 /data/VOCdevkit/VOC2007/JPEGImages/003587.jpg 500 361 18 72 40 496 267 +1803 /data/VOCdevkit/VOC2007/JPEGImages/003588.jpg 500 333 8 200 63 324 319 8 66 82 185 330 +1804 /data/VOCdevkit/VOC2007/JPEGImages/003589.jpg 500 358 1 153 181 368 325 14 198 68 324 302 14 24 72 68 172 14 6 52 89 171 14 64 97 118 169 14 79 51 125 123 14 108 79 139 159 14 128 51 178 146 14 121 138 158 167 14 171 105 216 164 14 257 60 295 107 14 320 96 388 162 14 386 49 436 160 14 438 75 486 156 14 436 40 494 155 +1805 /data/VOCdevkit/VOC2007/JPEGImages/003593.jpg 500 333 16 316 135 463 265 16 62 119 314 303 +1806 /data/VOCdevkit/VOC2007/JPEGImages/003594.jpg 500 482 2 149 131 357 448 +1807 /data/VOCdevkit/VOC2007/JPEGImages/003596.jpg 500 375 6 78 107 429 304 6 233 72 286 96 +1808 /data/VOCdevkit/VOC2007/JPEGImages/003597.jpg 421 500 18 9 135 392 399 +1809 /data/VOCdevkit/VOC2007/JPEGImages/003599.jpg 500 332 1 126 34 376 327 +1810 /data/VOCdevkit/VOC2007/JPEGImages/003603.jpg 500 375 14 160 263 318 375 14 332 245 439 375 14 415 217 479 361 14 397 142 500 347 14 256 102 383 269 14 181 133 257 223 14 106 135 140 186 14 1 93 171 375 10 95 223 417 375 +1811 /data/VOCdevkit/VOC2007/JPEGImages/003604.jpg 500 375 11 62 103 500 375 19 145 1 430 142 +1812 /data/VOCdevkit/VOC2007/JPEGImages/003605.jpg 500 386 18 15 80 500 383 +1813 /data/VOCdevkit/VOC2007/JPEGImages/003606.jpg 500 375 6 28 32 492 375 6 276 76 500 281 +1814 /data/VOCdevkit/VOC2007/JPEGImages/003608.jpg 500 375 6 86 64 443 285 +1815 /data/VOCdevkit/VOC2007/JPEGImages/003609.jpg 360 270 17 56 103 277 197 8 270 104 360 213 8 6 135 186 270 +1816 /data/VOCdevkit/VOC2007/JPEGImages/003611.jpg 500 375 14 217 271 237 307 12 215 281 235 326 +1817 /data/VOCdevkit/VOC2007/JPEGImages/003614.jpg 500 375 2 82 113 272 250 +1818 /data/VOCdevkit/VOC2007/JPEGImages/003618.jpg 500 332 14 219 105 271 226 14 225 119 245 165 14 58 140 90 193 12 156 160 390 265 12 57 154 92 223 +1819 /data/VOCdevkit/VOC2007/JPEGImages/003620.jpg 500 333 7 74 1 451 257 +1820 /data/VOCdevkit/VOC2007/JPEGImages/003621.jpg 500 343 1 199 153 328 271 14 249 72 334 224 5 441 62 492 120 +1821 /data/VOCdevkit/VOC2007/JPEGImages/003622.jpg 500 375 15 68 223 182 347 15 256 266 337 365 15 379 269 495 373 +1822 /data/VOCdevkit/VOC2007/JPEGImages/003623.jpg 500 375 2 107 22 428 312 +1823 /data/VOCdevkit/VOC2007/JPEGImages/003625.jpg 500 332 12 127 88 378 275 14 235 41 296 196 +1824 /data/VOCdevkit/VOC2007/JPEGImages/003627.jpg 500 333 11 135 1 365 333 +1825 /data/VOCdevkit/VOC2007/JPEGImages/003628.jpg 500 333 14 46 164 68 251 14 13 163 44 258 18 51 1 448 324 +1826 /data/VOCdevkit/VOC2007/JPEGImages/003629.jpg 500 375 15 390 170 477 338 15 229 42 387 322 15 66 16 257 199 15 134 68 270 292 +1827 /data/VOCdevkit/VOC2007/JPEGImages/003632.jpg 500 375 11 76 73 500 368 +1828 /data/VOCdevkit/VOC2007/JPEGImages/003634.jpg 500 281 6 268 102 471 215 6 46 105 200 195 +1829 /data/VOCdevkit/VOC2007/JPEGImages/003635.jpg 500 375 5 3 45 500 325 +1830 /data/VOCdevkit/VOC2007/JPEGImages/003636.jpg 500 375 5 184 222 258 298 6 283 272 344 325 6 158 273 217 317 6 7 284 271 371 6 302 247 355 309 6 282 238 378 277 6 356 232 406 256 +1831 /data/VOCdevkit/VOC2007/JPEGImages/003638.jpg 500 375 8 116 280 179 374 10 1 273 114 373 14 340 174 373 252 14 206 151 261 350 14 203 130 361 372 14 323 161 500 375 +1832 /data/VOCdevkit/VOC2007/JPEGImages/003639.jpg 500 375 3 227 5 500 319 +1833 /data/VOCdevkit/VOC2007/JPEGImages/003640.jpg 500 375 9 274 184 444 287 +1834 /data/VOCdevkit/VOC2007/JPEGImages/003642.jpg 500 260 5 26 58 461 226 +1835 /data/VOCdevkit/VOC2007/JPEGImages/003644.jpg 500 281 14 291 104 461 281 14 236 101 331 194 14 86 110 231 281 10 145 182 373 272 +1836 /data/VOCdevkit/VOC2007/JPEGImages/003645.jpg 500 330 12 256 127 288 182 14 171 114 204 178 14 257 106 288 160 +1837 /data/VOCdevkit/VOC2007/JPEGImages/003646.jpg 500 375 2 200 142 276 302 +1838 /data/VOCdevkit/VOC2007/JPEGImages/003648.jpg 500 375 17 52 91 500 373 14 224 82 314 335 14 160 55 334 294 +1839 /data/VOCdevkit/VOC2007/JPEGImages/003651.jpg 480 360 18 80 6 480 360 14 340 83 385 179 +1840 /data/VOCdevkit/VOC2007/JPEGImages/003654.jpg 375 500 14 1 162 26 232 14 24 152 80 230 14 82 156 106 188 14 329 114 375 275 14 12 185 204 500 +1841 /data/VOCdevkit/VOC2007/JPEGImages/003655.jpg 375 500 6 2 51 365 500 14 96 37 293 500 +1842 /data/VOCdevkit/VOC2007/JPEGImages/003656.jpg 500 313 7 34 37 91 84 +1843 /data/VOCdevkit/VOC2007/JPEGImages/003657.jpg 500 344 3 198 221 360 292 +1844 /data/VOCdevkit/VOC2007/JPEGImages/003658.jpg 500 341 1 25 10 496 333 +1845 /data/VOCdevkit/VOC2007/JPEGImages/003660.jpg 375 500 19 230 185 375 391 +1846 /data/VOCdevkit/VOC2007/JPEGImages/003662.jpg 333 500 19 104 8 216 121 8 175 147 333 500 14 89 130 217 450 +1847 /data/VOCdevkit/VOC2007/JPEGImages/003663.jpg 500 333 14 1 43 302 282 14 298 85 500 278 +1848 /data/VOCdevkit/VOC2007/JPEGImages/003664.jpg 500 375 8 4 234 230 375 14 201 215 416 374 14 47 184 95 283 14 221 194 253 273 +1849 /data/VOCdevkit/VOC2007/JPEGImages/003667.jpg 448 500 0 16 45 421 445 +1850 /data/VOCdevkit/VOC2007/JPEGImages/003669.jpg 500 375 3 1 38 291 259 3 192 135 436 260 14 393 261 418 301 14 476 258 500 309 +1851 /data/VOCdevkit/VOC2007/JPEGImages/003671.jpg 500 333 11 135 6 358 323 +1852 /data/VOCdevkit/VOC2007/JPEGImages/003673.jpg 500 375 11 231 145 500 374 11 63 2 252 375 +1853 /data/VOCdevkit/VOC2007/JPEGImages/003674.jpg 500 375 7 79 1 476 375 +1854 /data/VOCdevkit/VOC2007/JPEGImages/003675.jpg 500 333 2 185 133 271 227 2 144 110 242 163 +1855 /data/VOCdevkit/VOC2007/JPEGImages/003678.jpg 500 332 19 237 70 334 143 14 237 88 490 326 14 1 1 157 257 4 65 236 103 332 +1856 /data/VOCdevkit/VOC2007/JPEGImages/003679.jpg 500 332 2 38 53 432 302 +1857 /data/VOCdevkit/VOC2007/JPEGImages/003681.jpg 500 375 16 336 59 500 351 16 288 81 408 284 16 99 103 221 272 11 213 138 284 283 11 100 156 206 330 11 1 159 121 326 11 204 153 368 326 16 1 84 109 158 +1858 /data/VOCdevkit/VOC2007/JPEGImages/003684.jpg 375 500 13 60 5 360 473 +1859 /data/VOCdevkit/VOC2007/JPEGImages/003685.jpg 500 375 18 1 51 499 375 14 184 120 235 192 +1860 /data/VOCdevkit/VOC2007/JPEGImages/003688.jpg 500 333 14 2 2 267 333 14 233 79 496 333 +1861 /data/VOCdevkit/VOC2007/JPEGImages/003690.jpg 500 375 17 1 57 453 375 14 31 77 500 375 +1862 /data/VOCdevkit/VOC2007/JPEGImages/003691.jpg 333 500 12 12 200 326 399 14 142 107 215 312 +1863 /data/VOCdevkit/VOC2007/JPEGImages/003694.jpg 500 333 19 308 190 386 265 15 54 58 151 263 8 156 181 213 252 14 167 133 216 245 +1864 /data/VOCdevkit/VOC2007/JPEGImages/003695.jpg 480 318 18 1 145 480 283 +1865 /data/VOCdevkit/VOC2007/JPEGImages/003696.jpg 500 332 12 193 87 368 285 14 172 110 258 283 +1866 /data/VOCdevkit/VOC2007/JPEGImages/003698.jpg 500 375 16 356 259 404 322 +1867 /data/VOCdevkit/VOC2007/JPEGImages/003699.jpg 500 375 15 224 72 298 178 14 1 65 434 312 +1868 /data/VOCdevkit/VOC2007/JPEGImages/003700.jpg 500 375 14 423 110 491 369 14 283 121 339 333 14 196 135 253 294 14 221 131 271 275 14 57 169 100 351 14 83 167 148 372 +1869 /data/VOCdevkit/VOC2007/JPEGImages/003703.jpg 500 375 6 125 153 357 253 14 449 146 470 186 +1870 /data/VOCdevkit/VOC2007/JPEGImages/003704.jpg 500 375 2 220 62 458 347 +1871 /data/VOCdevkit/VOC2007/JPEGImages/003705.jpg 500 375 16 196 100 270 176 +1872 /data/VOCdevkit/VOC2007/JPEGImages/003706.jpg 500 375 13 80 11 474 366 14 439 26 489 199 14 390 16 426 121 +1873 /data/VOCdevkit/VOC2007/JPEGImages/003708.jpg 375 500 14 1 89 351 500 8 239 153 365 468 +1874 /data/VOCdevkit/VOC2007/JPEGImages/003709.jpg 500 375 18 368 195 436 256 18 204 214 285 304 18 52 186 106 285 +1875 /data/VOCdevkit/VOC2007/JPEGImages/003711.jpg 500 396 6 132 278 166 329 5 162 86 469 344 14 340 173 352 209 14 352 177 367 210 +1876 /data/VOCdevkit/VOC2007/JPEGImages/003713.jpg 500 375 6 176 230 228 276 6 2 217 75 344 6 283 234 324 255 6 372 221 496 287 6 315 216 370 255 6 80 204 140 271 +1877 /data/VOCdevkit/VOC2007/JPEGImages/003714.jpg 500 375 16 177 169 298 289 +1878 /data/VOCdevkit/VOC2007/JPEGImages/003717.jpg 500 334 1 114 172 358 311 1 353 88 500 203 1 97 32 244 170 1 297 12 489 173 14 238 2 286 93 14 107 1 196 163 14 169 91 320 247 14 27 119 118 319 14 10 270 93 326 14 192 267 254 312 14 29 81 116 297 14 354 2 472 226 14 355 1 409 175 14 1 1 88 162 +1879 /data/VOCdevkit/VOC2007/JPEGImages/003721.jpg 500 333 6 15 103 444 248 +1880 /data/VOCdevkit/VOC2007/JPEGImages/003722.jpg 500 339 3 301 256 488 294 +1881 /data/VOCdevkit/VOC2007/JPEGImages/003727.jpg 333 500 2 121 148 291 429 +1882 /data/VOCdevkit/VOC2007/JPEGImages/003729.jpg 500 375 4 199 1 266 128 4 405 1 500 227 +1883 /data/VOCdevkit/VOC2007/JPEGImages/003732.jpg 375 500 14 2 203 57 454 14 21 217 128 499 12 67 1 375 500 +1884 /data/VOCdevkit/VOC2007/JPEGImages/003735.jpg 480 345 14 154 33 254 193 14 410 89 473 200 12 75 78 405 330 12 382 129 480 270 +1885 /data/VOCdevkit/VOC2007/JPEGImages/003740.jpg 500 375 14 204 160 264 329 14 351 141 412 315 14 7 156 99 353 +1886 /data/VOCdevkit/VOC2007/JPEGImages/003743.jpg 500 281 17 84 145 292 273 +1887 /data/VOCdevkit/VOC2007/JPEGImages/003748.jpg 500 375 2 262 174 415 320 +1888 /data/VOCdevkit/VOC2007/JPEGImages/003749.jpg 500 375 14 170 57 500 375 +1889 /data/VOCdevkit/VOC2007/JPEGImages/003750.jpg 500 375 9 361 163 449 362 9 125 50 353 262 +1890 /data/VOCdevkit/VOC2007/JPEGImages/003751.jpg 500 334 17 2 190 140 334 8 115 171 212 247 8 244 154 283 206 19 380 1 480 153 14 407 34 456 140 +1891 /data/VOCdevkit/VOC2007/JPEGImages/003752.jpg 500 375 18 404 323 500 351 +1892 /data/VOCdevkit/VOC2007/JPEGImages/003753.jpg 500 375 11 45 55 500 321 +1893 /data/VOCdevkit/VOC2007/JPEGImages/003754.jpg 500 357 12 249 313 301 351 +1894 /data/VOCdevkit/VOC2007/JPEGImages/003758.jpg 500 333 15 33 34 253 330 15 83 2 489 333 +1895 /data/VOCdevkit/VOC2007/JPEGImages/003759.jpg 500 375 14 105 129 226 375 14 202 142 279 375 14 254 136 426 375 19 393 189 474 290 +1896 /data/VOCdevkit/VOC2007/JPEGImages/003760.jpg 500 375 13 175 223 231 322 13 118 227 180 296 14 24 211 46 273 14 47 207 75 284 14 73 209 100 284 14 82 199 100 273 14 94 192 115 282 14 118 188 176 298 14 176 178 238 317 14 246 204 274 311 14 286 206 308 305 14 304 204 327 305 11 309 273 358 311 14 330 217 356 287 14 362 218 392 305 14 394 220 414 308 14 414 198 445 307 14 344 201 366 304 +1897 /data/VOCdevkit/VOC2007/JPEGImages/003763.jpg 500 375 7 1 1 407 375 +1898 /data/VOCdevkit/VOC2007/JPEGImages/003767.jpg 500 375 8 272 170 373 301 8 278 201 456 375 8 74 165 164 282 8 47 199 213 375 +1899 /data/VOCdevkit/VOC2007/JPEGImages/003772.jpg 500 375 12 110 64 408 294 +1900 /data/VOCdevkit/VOC2007/JPEGImages/003773.jpg 500 333 0 13 121 485 230 +1901 /data/VOCdevkit/VOC2007/JPEGImages/003774.jpg 500 375 11 1 88 428 225 +1902 /data/VOCdevkit/VOC2007/JPEGImages/003779.jpg 480 465 12 56 105 400 383 14 182 69 322 260 +1903 /data/VOCdevkit/VOC2007/JPEGImages/003780.jpg 375 500 19 104 167 185 232 19 280 218 365 346 14 90 202 207 375 14 2 91 111 350 7 68 312 207 481 +1904 /data/VOCdevkit/VOC2007/JPEGImages/003781.jpg 500 375 14 32 98 334 375 14 259 60 500 375 14 36 252 82 296 +1905 /data/VOCdevkit/VOC2007/JPEGImages/003783.jpg 375 500 4 160 322 206 421 4 71 284 133 392 4 91 256 141 357 4 138 276 178 383 4 177 254 222 373 4 184 172 239 312 4 269 157 314 259 4 232 141 271 270 4 206 180 239 277 4 128 232 174 309 4 100 203 137 281 4 109 159 149 237 4 126 147 155 205 4 148 125 178 190 4 143 205 187 305 4 213 143 238 216 4 219 107 243 174 4 227 86 255 147 4 254 121 283 189 4 294 142 321 234 +1906 /data/VOCdevkit/VOC2007/JPEGImages/003784.jpg 328 500 1 32 232 311 407 +1907 /data/VOCdevkit/VOC2007/JPEGImages/003786.jpg 500 281 5 171 165 287 273 +1908 /data/VOCdevkit/VOC2007/JPEGImages/003788.jpg 500 281 7 164 123 320 266 8 1 1 500 281 +1909 /data/VOCdevkit/VOC2007/JPEGImages/003790.jpg 500 375 6 54 115 462 269 +1910 /data/VOCdevkit/VOC2007/JPEGImages/003791.jpg 500 375 8 197 247 321 374 10 36 268 224 375 15 221 255 270 296 +1911 /data/VOCdevkit/VOC2007/JPEGImages/003792.jpg 500 338 11 16 108 150 260 11 178 108 410 288 11 351 87 474 267 +1912 /data/VOCdevkit/VOC2007/JPEGImages/003793.jpg 375 500 7 30 26 348 500 +1913 /data/VOCdevkit/VOC2007/JPEGImages/003796.jpg 500 375 15 422 220 444 272 +1914 /data/VOCdevkit/VOC2007/JPEGImages/003797.jpg 500 414 14 312 304 346 378 14 269 289 302 339 14 408 313 439 372 3 39 1 500 400 +1915 /data/VOCdevkit/VOC2007/JPEGImages/003798.jpg 500 389 6 204 181 392 282 +1916 /data/VOCdevkit/VOC2007/JPEGImages/003803.jpg 375 500 2 156 186 249 341 +1917 /data/VOCdevkit/VOC2007/JPEGImages/003806.jpg 500 282 6 426 85 500 165 6 85 27 433 261 +1918 /data/VOCdevkit/VOC2007/JPEGImages/003807.jpg 500 375 7 36 67 500 375 7 44 39 398 344 +1919 /data/VOCdevkit/VOC2007/JPEGImages/003808.jpg 500 333 19 45 3 466 328 +1920 /data/VOCdevkit/VOC2007/JPEGImages/003809.jpg 500 333 6 107 128 485 274 +1921 /data/VOCdevkit/VOC2007/JPEGImages/003811.jpg 500 374 3 130 87 313 269 3 301 204 429 256 14 15 87 40 131 +1922 /data/VOCdevkit/VOC2007/JPEGImages/003814.jpg 500 374 7 116 75 423 314 +1923 /data/VOCdevkit/VOC2007/JPEGImages/003817.jpg 500 333 14 5 3 431 333 +1924 /data/VOCdevkit/VOC2007/JPEGImages/003818.jpg 500 335 18 170 137 341 210 +1925 /data/VOCdevkit/VOC2007/JPEGImages/003820.jpg 500 375 6 1 3 500 375 +1926 /data/VOCdevkit/VOC2007/JPEGImages/003821.jpg 500 375 11 50 42 405 374 +1927 /data/VOCdevkit/VOC2007/JPEGImages/003824.jpg 333 500 14 78 22 272 369 13 61 145 301 451 6 1 43 332 255 +1928 /data/VOCdevkit/VOC2007/JPEGImages/003826.jpg 500 331 13 104 116 337 294 14 170 60 322 227 +1929 /data/VOCdevkit/VOC2007/JPEGImages/003827.jpg 500 330 1 362 173 447 226 1 270 111 363 219 1 164 160 274 260 1 128 140 158 180 1 2 152 75 238 14 452 113 500 255 14 383 136 438 214 14 271 113 339 253 14 196 88 274 262 14 19 93 76 222 14 160 128 185 181 +1930 /data/VOCdevkit/VOC2007/JPEGImages/003828.jpg 403 500 2 168 53 223 86 +1931 /data/VOCdevkit/VOC2007/JPEGImages/003830.jpg 500 344 18 43 20 500 341 +1932 /data/VOCdevkit/VOC2007/JPEGImages/003834.jpg 500 375 15 295 50 496 335 15 7 57 188 333 15 238 268 284 322 15 190 180 272 310 15 255 215 297 269 +1933 /data/VOCdevkit/VOC2007/JPEGImages/003835.jpg 500 375 6 176 278 289 332 6 7 276 45 300 5 43 197 185 313 5 1 231 34 291 +1934 /data/VOCdevkit/VOC2007/JPEGImages/003837.jpg 375 500 8 2 301 172 446 8 27 392 374 500 +1935 /data/VOCdevkit/VOC2007/JPEGImages/003838.jpg 500 375 14 4 74 166 375 14 119 89 280 375 14 220 64 376 375 14 342 82 500 375 14 338 68 388 198 14 461 91 500 199 +1936 /data/VOCdevkit/VOC2007/JPEGImages/003844.jpg 500 375 7 137 163 266 329 7 173 151 355 333 +1937 /data/VOCdevkit/VOC2007/JPEGImages/003845.jpg 500 375 17 1 26 500 355 +1938 /data/VOCdevkit/VOC2007/JPEGImages/003846.jpg 500 333 11 171 93 263 234 +1939 /data/VOCdevkit/VOC2007/JPEGImages/003847.jpg 500 375 14 204 151 500 375 14 1 59 209 375 +1940 /data/VOCdevkit/VOC2007/JPEGImages/003848.jpg 500 176 18 11 21 482 161 +1941 /data/VOCdevkit/VOC2007/JPEGImages/003849.jpg 500 332 13 170 175 301 267 14 214 163 277 259 14 348 188 369 235 +1942 /data/VOCdevkit/VOC2007/JPEGImages/003855.jpg 500 375 13 243 139 389 229 14 264 105 331 209 14 32 111 97 210 14 156 119 221 213 1 130 164 235 225 1 16 154 104 218 +1943 /data/VOCdevkit/VOC2007/JPEGImages/003856.jpg 500 370 14 114 152 489 370 14 119 21 373 359 14 25 114 157 218 +1944 /data/VOCdevkit/VOC2007/JPEGImages/003857.jpg 375 500 8 3 6 375 394 +1945 /data/VOCdevkit/VOC2007/JPEGImages/003859.jpg 375 500 4 188 15 227 196 14 112 1 277 128 10 1 120 375 500 +1946 /data/VOCdevkit/VOC2007/JPEGImages/003860.jpg 500 333 3 1 1 458 212 14 319 110 448 310 +1947 /data/VOCdevkit/VOC2007/JPEGImages/003861.jpg 500 334 3 115 52 287 294 +1948 /data/VOCdevkit/VOC2007/JPEGImages/003863.jpg 500 335 3 75 111 349 179 14 189 91 324 335 +1949 /data/VOCdevkit/VOC2007/JPEGImages/003865.jpg 500 375 10 132 253 302 375 14 385 60 500 375 14 286 170 419 375 14 132 177 234 262 14 25 171 175 375 4 407 190 452 255 4 237 221 255 284 +1950 /data/VOCdevkit/VOC2007/JPEGImages/003866.jpg 500 338 18 11 82 385 234 18 385 133 500 203 +1951 /data/VOCdevkit/VOC2007/JPEGImages/003868.jpg 500 375 14 2 235 500 374 +1952 /data/VOCdevkit/VOC2007/JPEGImages/003869.jpg 500 333 11 328 158 458 300 11 128 110 317 292 14 1 86 189 280 14 117 109 286 318 14 192 75 486 333 +1953 /data/VOCdevkit/VOC2007/JPEGImages/003871.jpg 333 500 2 119 82 313 433 +1954 /data/VOCdevkit/VOC2007/JPEGImages/003872.jpg 500 375 11 205 170 309 245 +1955 /data/VOCdevkit/VOC2007/JPEGImages/003874.jpg 500 375 16 20 308 63 331 16 462 241 476 262 16 411 207 428 220 16 298 200 317 219 16 129 287 146 301 16 100 294 148 324 +1956 /data/VOCdevkit/VOC2007/JPEGImages/003876.jpg 500 382 0 93 98 174 144 +1957 /data/VOCdevkit/VOC2007/JPEGImages/003877.jpg 500 375 15 281 227 368 322 15 42 188 225 348 15 307 51 376 95 14 179 171 289 351 +1958 /data/VOCdevkit/VOC2007/JPEGImages/003879.jpg 500 375 14 312 57 401 325 14 241 64 330 334 14 211 63 257 335 14 167 89 240 347 14 86 73 191 326 +1959 /data/VOCdevkit/VOC2007/JPEGImages/003885.jpg 375 500 6 156 373 222 425 +1960 /data/VOCdevkit/VOC2007/JPEGImages/003886.jpg 500 332 0 24 79 458 228 +1961 /data/VOCdevkit/VOC2007/JPEGImages/003887.jpg 361 500 9 175 443 212 472 +1962 /data/VOCdevkit/VOC2007/JPEGImages/003889.jpg 480 318 12 345 75 427 295 12 157 79 282 294 12 52 105 138 297 14 337 32 439 193 14 122 35 239 188 14 1 58 102 308 14 51 48 123 196 8 431 119 472 166 +1963 /data/VOCdevkit/VOC2007/JPEGImages/003890.jpg 374 500 7 7 270 282 500 +1964 /data/VOCdevkit/VOC2007/JPEGImages/003891.jpg 332 500 14 306 247 332 339 14 251 252 298 313 14 146 234 182 284 14 69 249 118 352 14 29 231 55 298 14 51 231 76 298 6 3 314 331 500 6 5 284 332 395 +1965 /data/VOCdevkit/VOC2007/JPEGImages/003895.jpg 500 332 18 1 2 500 246 +1966 /data/VOCdevkit/VOC2007/JPEGImages/003898.jpg 500 185 2 103 75 157 104 2 152 87 199 110 +1967 /data/VOCdevkit/VOC2007/JPEGImages/003899.jpg 500 375 11 124 117 318 297 14 452 133 500 239 +1968 /data/VOCdevkit/VOC2007/JPEGImages/003905.jpg 500 357 2 236 66 376 267 +1969 /data/VOCdevkit/VOC2007/JPEGImages/003907.jpg 500 375 17 107 167 338 321 17 269 209 496 375 8 3 129 41 276 +1970 /data/VOCdevkit/VOC2007/JPEGImages/003911.jpg 500 293 19 211 9 345 95 +1971 /data/VOCdevkit/VOC2007/JPEGImages/003912.jpg 500 394 7 114 100 487 394 +1972 /data/VOCdevkit/VOC2007/JPEGImages/003913.jpg 500 375 14 210 2 500 374 14 3 1 263 375 +1973 /data/VOCdevkit/VOC2007/JPEGImages/003915.jpg 500 375 11 157 161 500 375 14 9 2 186 153 14 196 35 301 164 +1974 /data/VOCdevkit/VOC2007/JPEGImages/003918.jpg 396 500 2 26 78 285 500 +1975 /data/VOCdevkit/VOC2007/JPEGImages/003919.jpg 500 375 3 90 269 196 307 3 210 234 279 268 +1976 /data/VOCdevkit/VOC2007/JPEGImages/003921.jpg 500 375 11 83 68 398 375 +1977 /data/VOCdevkit/VOC2007/JPEGImages/003923.jpg 500 333 14 149 56 300 211 14 5 72 84 149 14 77 52 113 131 10 45 204 500 333 +1978 /data/VOCdevkit/VOC2007/JPEGImages/003924.jpg 375 500 15 64 318 100 396 15 109 320 148 383 15 120 337 152 400 15 159 323 195 358 15 160 350 194 406 15 198 248 233 400 15 55 113 103 199 15 106 104 144 192 15 143 116 188 198 15 188 147 207 194 15 201 125 242 200 +1979 /data/VOCdevkit/VOC2007/JPEGImages/003926.jpg 339 500 18 1 1 316 470 +1980 /data/VOCdevkit/VOC2007/JPEGImages/003932.jpg 375 500 4 207 345 247 493 14 62 20 283 493 15 243 273 372 412 +1981 /data/VOCdevkit/VOC2007/JPEGImages/003935.jpg 500 375 11 98 55 347 340 +1982 /data/VOCdevkit/VOC2007/JPEGImages/003936.jpg 500 330 6 34 202 190 259 +1983 /data/VOCdevkit/VOC2007/JPEGImages/003937.jpg 500 333 7 1 2 312 333 +1984 /data/VOCdevkit/VOC2007/JPEGImages/003939.jpg 500 198 12 111 87 347 198 12 276 79 459 197 14 275 45 367 117 14 167 52 261 176 +1985 /data/VOCdevkit/VOC2007/JPEGImages/003941.jpg 500 375 13 54 39 472 342 +1986 /data/VOCdevkit/VOC2007/JPEGImages/003945.jpg 500 334 1 186 173 305 276 1 103 136 227 256 1 1 116 49 230 14 210 120 315 241 14 142 95 230 222 14 2 40 48 153 +1987 /data/VOCdevkit/VOC2007/JPEGImages/003946.jpg 333 500 14 78 40 238 250 11 3 141 234 486 +1988 /data/VOCdevkit/VOC2007/JPEGImages/003947.jpg 375 500 8 68 386 180 500 8 180 404 304 500 19 96 304 149 344 10 96 365 312 500 +1989 /data/VOCdevkit/VOC2007/JPEGImages/003948.jpg 320 224 14 91 19 206 178 12 112 43 183 196 +1990 /data/VOCdevkit/VOC2007/JPEGImages/003949.jpg 500 332 2 210 151 245 193 +1991 /data/VOCdevkit/VOC2007/JPEGImages/003953.jpg 375 500 14 94 180 300 429 14 177 112 225 174 14 29 2 76 63 14 71 3 118 61 +1992 /data/VOCdevkit/VOC2007/JPEGImages/003954.jpg 500 333 6 6 118 135 180 6 159 148 278 217 6 156 227 316 324 +1993 /data/VOCdevkit/VOC2007/JPEGImages/003956.jpg 375 500 15 2 76 375 500 +1994 /data/VOCdevkit/VOC2007/JPEGImages/003957.jpg 500 332 18 15 73 413 253 +1995 /data/VOCdevkit/VOC2007/JPEGImages/003960.jpg 500 375 12 38 196 266 369 12 195 222 353 372 14 143 157 204 248 14 213 166 280 300 14 117 250 205 375 14 432 259 500 375 +1996 /data/VOCdevkit/VOC2007/JPEGImages/003961.jpg 375 500 14 1 1 329 500 +1997 /data/VOCdevkit/VOC2007/JPEGImages/003963.jpg 500 375 19 53 194 95 243 17 270 230 397 359 14 312 241 335 258 +1998 /data/VOCdevkit/VOC2007/JPEGImages/003965.jpg 500 375 2 236 105 381 326 +1999 /data/VOCdevkit/VOC2007/JPEGImages/003966.jpg 375 500 5 35 7 313 93 14 138 16 238 280 +2000 /data/VOCdevkit/VOC2007/JPEGImages/003969.jpg 500 334 11 410 118 440 180 2 76 136 132 185 2 207 152 241 181 +2001 /data/VOCdevkit/VOC2007/JPEGImages/003970.jpg 318 480 12 96 115 230 437 14 93 88 254 293 +2002 /data/VOCdevkit/VOC2007/JPEGImages/003971.jpg 500 375 6 26 125 479 273 +2003 /data/VOCdevkit/VOC2007/JPEGImages/003973.jpg 500 375 5 1 163 208 356 6 204 284 356 340 14 472 276 500 344 +2004 /data/VOCdevkit/VOC2007/JPEGImages/003974.jpg 500 380 3 1 47 289 259 14 255 164 298 316 14 284 141 333 312 14 322 146 374 312 14 367 152 411 314 14 386 152 415 320 14 408 141 447 328 +2005 /data/VOCdevkit/VOC2007/JPEGImages/003979.jpg 500 333 2 174 150 277 243 2 300 169 442 333 +2006 /data/VOCdevkit/VOC2007/JPEGImages/003983.jpg 500 333 19 150 54 337 218 +2007 /data/VOCdevkit/VOC2007/JPEGImages/003984.jpg 500 387 7 137 36 500 261 +2008 /data/VOCdevkit/VOC2007/JPEGImages/003986.jpg 500 375 11 44 57 311 330 14 175 28 462 299 +2009 /data/VOCdevkit/VOC2007/JPEGImages/003987.jpg 333 500 6 2 379 280 499 +2010 /data/VOCdevkit/VOC2007/JPEGImages/003988.jpg 448 336 8 1 222 117 336 +2011 /data/VOCdevkit/VOC2007/JPEGImages/003990.jpg 500 375 11 245 135 500 375 +2012 /data/VOCdevkit/VOC2007/JPEGImages/003991.jpg 500 389 7 79 53 500 264 +2013 /data/VOCdevkit/VOC2007/JPEGImages/003992.jpg 500 334 13 34 36 242 129 13 25 42 426 247 14 395 1 455 170 14 340 1 407 151 +2014 /data/VOCdevkit/VOC2007/JPEGImages/003993.jpg 500 333 0 45 87 418 245 +2015 /data/VOCdevkit/VOC2007/JPEGImages/003994.jpg 500 375 9 8 96 273 373 14 357 132 480 373 14 252 142 366 373 14 369 63 413 170 +2016 /data/VOCdevkit/VOC2007/JPEGImages/003996.jpg 500 375 14 321 11 500 375 14 118 2 407 375 +2017 /data/VOCdevkit/VOC2007/JPEGImages/003997.jpg 500 322 6 171 110 447 262 +2018 /data/VOCdevkit/VOC2007/JPEGImages/003998.jpg 500 375 6 12 60 500 307 +2019 /data/VOCdevkit/VOC2007/JPEGImages/004003.jpg 500 375 13 45 50 472 315 +2020 /data/VOCdevkit/VOC2007/JPEGImages/004005.jpg 500 373 18 118 185 360 217 +2021 /data/VOCdevkit/VOC2007/JPEGImages/004008.jpg 500 333 11 133 55 288 310 +2022 /data/VOCdevkit/VOC2007/JPEGImages/004009.jpg 500 366 0 153 106 274 255 +2023 /data/VOCdevkit/VOC2007/JPEGImages/004010.jpg 500 418 17 1 134 500 362 14 118 8 450 418 +2024 /data/VOCdevkit/VOC2007/JPEGImages/004011.jpg 500 333 6 87 97 415 267 +2025 /data/VOCdevkit/VOC2007/JPEGImages/004012.jpg 375 500 14 53 120 294 500 14 66 226 229 472 8 1 113 375 500 +2026 /data/VOCdevkit/VOC2007/JPEGImages/004013.jpg 500 423 2 170 170 387 343 +2027 /data/VOCdevkit/VOC2007/JPEGImages/004014.jpg 375 500 8 1 75 374 500 14 3 48 303 500 +2028 /data/VOCdevkit/VOC2007/JPEGImages/004015.jpg 500 375 11 73 23 302 375 +2029 /data/VOCdevkit/VOC2007/JPEGImages/004016.jpg 500 375 7 111 59 391 292 +2030 /data/VOCdevkit/VOC2007/JPEGImages/004017.jpg 500 375 15 237 1 450 217 14 10 4 450 375 +2031 /data/VOCdevkit/VOC2007/JPEGImages/004019.jpg 500 375 6 394 316 474 360 6 84 323 160 358 6 20 321 85 353 14 364 316 383 367 14 234 310 249 356 6 474 324 500 355 +2032 /data/VOCdevkit/VOC2007/JPEGImages/004020.jpg 500 375 14 265 51 371 188 14 204 61 230 114 19 2 102 118 233 +2033 /data/VOCdevkit/VOC2007/JPEGImages/004023.jpg 500 375 9 91 146 256 255 9 249 85 500 330 +2034 /data/VOCdevkit/VOC2007/JPEGImages/004025.jpg 500 333 2 164 86 366 279 +2035 /data/VOCdevkit/VOC2007/JPEGImages/004028.jpg 500 375 8 1 152 98 330 15 2 2 124 227 14 380 172 407 194 14 242 192 276 230 +2036 /data/VOCdevkit/VOC2007/JPEGImages/004031.jpg 500 375 7 101 195 295 375 14 345 1 395 65 +2037 /data/VOCdevkit/VOC2007/JPEGImages/004033.jpg 500 342 14 70 7 120 138 13 120 36 217 168 13 183 2 326 196 13 189 1 447 280 +2038 /data/VOCdevkit/VOC2007/JPEGImages/004034.jpg 375 500 11 102 118 375 458 +2039 /data/VOCdevkit/VOC2007/JPEGImages/004035.jpg 500 375 7 74 149 206 262 11 231 15 394 297 +2040 /data/VOCdevkit/VOC2007/JPEGImages/004037.jpg 338 500 15 4 104 51 160 15 70 177 110 227 15 145 239 191 292 15 230 179 276 231 15 3 334 54 422 15 39 404 74 475 15 85 406 115 473 15 104 308 149 359 15 107 256 150 319 15 196 263 241 312 15 193 305 237 352 15 265 397 297 472 15 235 395 287 469 +2041 /data/VOCdevkit/VOC2007/JPEGImages/004039.jpg 375 500 14 1 2 225 500 14 126 269 289 500 14 262 82 375 500 +2042 /data/VOCdevkit/VOC2007/JPEGImages/004046.jpg 500 335 2 196 56 365 198 +2043 /data/VOCdevkit/VOC2007/JPEGImages/004047.jpg 500 471 8 2 103 122 352 8 37 83 189 373 14 151 91 398 471 +2044 /data/VOCdevkit/VOC2007/JPEGImages/004051.jpg 480 403 12 116 105 406 351 14 197 41 315 237 +2045 /data/VOCdevkit/VOC2007/JPEGImages/004052.jpg 500 319 0 47 108 398 213 +2046 /data/VOCdevkit/VOC2007/JPEGImages/004057.jpg 500 329 1 59 84 354 315 +2047 /data/VOCdevkit/VOC2007/JPEGImages/004058.jpg 333 500 14 1 24 213 403 14 258 202 329 384 14 219 237 290 373 14 241 180 297 257 14 246 188 265 213 14 166 188 241 362 14 86 157 184 354 14 133 165 196 344 14 1 93 33 196 +2048 /data/VOCdevkit/VOC2007/JPEGImages/004060.jpg 500 375 14 95 89 301 375 14 261 112 382 268 +2049 /data/VOCdevkit/VOC2007/JPEGImages/004066.jpg 500 375 17 133 85 450 265 +2050 /data/VOCdevkit/VOC2007/JPEGImages/004067.jpg 500 331 13 211 152 263 184 13 285 148 337 182 +2051 /data/VOCdevkit/VOC2007/JPEGImages/004069.jpg 500 375 2 153 106 298 375 2 241 61 387 309 +2052 /data/VOCdevkit/VOC2007/JPEGImages/004073.jpg 500 375 14 236 87 500 374 6 403 208 465 234 5 19 147 200 245 +2053 /data/VOCdevkit/VOC2007/JPEGImages/004075.jpg 375 500 4 147 369 206 500 14 2 4 255 500 14 199 124 297 225 +2054 /data/VOCdevkit/VOC2007/JPEGImages/004076.jpg 500 375 7 77 53 415 280 +2055 /data/VOCdevkit/VOC2007/JPEGImages/004077.jpg 500 375 11 40 241 103 298 12 202 165 238 219 14 211 146 231 189 +2056 /data/VOCdevkit/VOC2007/JPEGImages/004082.jpg 500 375 1 170 74 261 331 +2057 /data/VOCdevkit/VOC2007/JPEGImages/004085.jpg 500 375 11 58 145 228 217 14 387 102 500 321 +2058 /data/VOCdevkit/VOC2007/JPEGImages/004087.jpg 500 375 6 1 29 412 375 +2059 /data/VOCdevkit/VOC2007/JPEGImages/004089.jpg 500 334 6 210 122 462 299 6 19 58 266 201 +2060 /data/VOCdevkit/VOC2007/JPEGImages/004091.jpg 500 375 14 185 110 240 330 14 187 92 272 310 14 265 110 309 300 14 300 121 352 312 14 323 109 348 146 14 346 102 385 291 14 378 96 416 297 14 404 100 456 305 6 1 143 197 375 +2061 /data/VOCdevkit/VOC2007/JPEGImages/004092.jpg 500 375 14 73 102 430 374 +2062 /data/VOCdevkit/VOC2007/JPEGImages/004093.jpg 500 333 8 320 162 375 275 8 257 189 381 320 +2063 /data/VOCdevkit/VOC2007/JPEGImages/004095.jpg 500 334 11 186 97 323 304 +2064 /data/VOCdevkit/VOC2007/JPEGImages/004100.jpg 500 333 19 318 162 467 286 +2065 /data/VOCdevkit/VOC2007/JPEGImages/004102.jpg 500 375 18 1 36 414 315 18 342 58 500 300 +2066 /data/VOCdevkit/VOC2007/JPEGImages/004105.jpg 500 375 8 93 271 164 375 8 2 277 93 375 8 205 271 296 375 8 164 304 281 375 8 316 271 401 368 8 341 312 491 374 17 192 245 313 307 +2067 /data/VOCdevkit/VOC2007/JPEGImages/004106.jpg 500 375 19 206 195 280 273 8 191 281 424 375 17 1 273 199 375 +2068 /data/VOCdevkit/VOC2007/JPEGImages/004108.jpg 500 333 6 5 127 493 327 +2069 /data/VOCdevkit/VOC2007/JPEGImages/004110.jpg 500 375 14 203 113 298 375 4 203 258 227 318 +2070 /data/VOCdevkit/VOC2007/JPEGImages/004111.jpg 500 375 14 128 114 375 375 8 139 108 298 367 +2071 /data/VOCdevkit/VOC2007/JPEGImages/004113.jpg 500 375 11 171 2 487 372 +2072 /data/VOCdevkit/VOC2007/JPEGImages/004117.jpg 480 348 12 89 56 427 328 14 174 52 277 209 +2073 /data/VOCdevkit/VOC2007/JPEGImages/004120.jpg 500 333 5 59 41 500 301 +2074 /data/VOCdevkit/VOC2007/JPEGImages/004121.jpg 500 332 15 19 154 108 263 14 220 92 347 242 +2075 /data/VOCdevkit/VOC2007/JPEGImages/004122.jpg 375 500 14 262 325 299 396 14 207 313 247 363 14 121 333 155 456 14 147 341 170 440 14 163 342 188 443 14 183 344 209 446 14 203 344 230 447 14 219 352 252 458 14 242 348 265 443 14 267 340 301 443 +2076 /data/VOCdevkit/VOC2007/JPEGImages/004129.jpg 500 375 7 2 34 460 319 +2077 /data/VOCdevkit/VOC2007/JPEGImages/004131.jpg 500 333 2 339 98 366 110 +2078 /data/VOCdevkit/VOC2007/JPEGImages/004133.jpg 500 334 14 97 18 224 334 +2079 /data/VOCdevkit/VOC2007/JPEGImages/004135.jpg 500 333 0 35 121 454 245 +2080 /data/VOCdevkit/VOC2007/JPEGImages/004136.jpg 500 375 1 71 101 451 338 14 146 32 323 368 6 447 36 500 91 6 342 26 394 49 6 205 18 281 59 6 83 19 132 39 6 20 19 43 35 6 311 29 344 44 5 141 1 314 45 +2081 /data/VOCdevkit/VOC2007/JPEGImages/004137.jpg 500 375 11 238 127 486 370 14 1 108 267 351 +2082 /data/VOCdevkit/VOC2007/JPEGImages/004138.jpg 320 480 14 168 247 320 480 14 5 72 297 480 +2083 /data/VOCdevkit/VOC2007/JPEGImages/004140.jpg 500 375 1 2 1 500 375 4 173 129 209 208 4 202 151 278 218 +2084 /data/VOCdevkit/VOC2007/JPEGImages/004141.jpg 420 500 9 10 8 312 488 14 232 95 414 393 +2085 /data/VOCdevkit/VOC2007/JPEGImages/004142.jpg 500 375 11 2 177 70 230 14 79 53 258 356 14 124 1 475 375 +2086 /data/VOCdevkit/VOC2007/JPEGImages/004143.jpg 500 375 2 146 68 441 351 +2087 /data/VOCdevkit/VOC2007/JPEGImages/004145.jpg 500 375 13 10 167 104 235 13 356 160 401 248 13 266 200 358 293 6 169 163 224 223 14 421 130 444 223 14 393 135 440 262 14 303 138 357 299 14 275 138 305 181 14 229 133 274 249 14 196 142 222 237 14 61 142 99 245 +2088 /data/VOCdevkit/VOC2007/JPEGImages/004146.jpg 500 375 12 47 60 500 375 +2089 /data/VOCdevkit/VOC2007/JPEGImages/004148.jpg 500 332 19 1 47 454 332 +2090 /data/VOCdevkit/VOC2007/JPEGImages/004149.jpg 500 375 7 157 92 330 262 10 1 89 500 375 8 2 14 158 375 +2091 /data/VOCdevkit/VOC2007/JPEGImages/004150.jpg 333 500 7 75 247 314 440 19 15 73 248 347 +2092 /data/VOCdevkit/VOC2007/JPEGImages/004152.jpg 375 500 4 153 45 375 426 4 117 329 291 500 4 1 31 203 317 +2093 /data/VOCdevkit/VOC2007/JPEGImages/004158.jpg 500 333 4 290 183 334 306 4 181 158 216 282 4 233 160 268 287 14 1 47 117 333 14 89 55 245 253 14 389 72 500 321 +2094 /data/VOCdevkit/VOC2007/JPEGImages/004163.jpg 500 500 19 248 197 355 316 +2095 /data/VOCdevkit/VOC2007/JPEGImages/004164.jpg 500 375 8 176 154 233 221 19 337 135 404 206 17 5 235 427 366 +2096 /data/VOCdevkit/VOC2007/JPEGImages/004168.jpg 500 439 12 288 224 426 424 14 291 167 385 343 +2097 /data/VOCdevkit/VOC2007/JPEGImages/004169.jpg 333 500 14 1 22 324 500 +2098 /data/VOCdevkit/VOC2007/JPEGImages/004170.jpg 500 335 3 77 189 411 250 14 335 153 368 207 14 312 174 342 214 14 125 140 157 196 14 156 143 211 219 14 185 140 213 218 +2099 /data/VOCdevkit/VOC2007/JPEGImages/004171.jpg 446 500 2 97 302 272 433 +2100 /data/VOCdevkit/VOC2007/JPEGImages/004174.jpg 500 454 5 3 233 136 381 +2101 /data/VOCdevkit/VOC2007/JPEGImages/004178.jpg 500 307 11 80 98 309 298 11 282 77 500 267 +2102 /data/VOCdevkit/VOC2007/JPEGImages/004185.jpg 500 375 7 27 89 464 279 +2103 /data/VOCdevkit/VOC2007/JPEGImages/004186.jpg 500 375 5 9 95 402 375 5 2 25 266 248 6 281 39 364 84 6 351 11 412 45 6 366 29 442 74 6 296 2 351 25 +2104 /data/VOCdevkit/VOC2007/JPEGImages/004189.jpg 500 333 11 171 57 344 280 +2105 /data/VOCdevkit/VOC2007/JPEGImages/004190.jpg 500 375 19 1 115 201 326 +2106 /data/VOCdevkit/VOC2007/JPEGImages/004191.jpg 332 500 13 161 231 273 387 14 191 204 275 357 +2107 /data/VOCdevkit/VOC2007/JPEGImages/004192.jpg 500 375 19 138 220 233 300 +2108 /data/VOCdevkit/VOC2007/JPEGImages/004193.jpg 500 375 19 144 187 246 287 4 277 70 289 111 4 290 68 305 107 8 216 289 380 375 +2109 /data/VOCdevkit/VOC2007/JPEGImages/004194.jpg 455 500 3 320 274 401 397 +2110 /data/VOCdevkit/VOC2007/JPEGImages/004195.jpg 500 375 12 22 184 187 312 14 89 156 129 241 14 149 220 199 309 +2111 /data/VOCdevkit/VOC2007/JPEGImages/004196.jpg 500 336 0 148 71 351 229 +2112 /data/VOCdevkit/VOC2007/JPEGImages/004200.jpg 375 270 9 18 53 151 252 9 160 53 266 246 9 258 31 373 251 +2113 /data/VOCdevkit/VOC2007/JPEGImages/004201.jpg 500 375 14 138 121 487 375 14 114 100 485 375 8 12 190 394 375 +2114 /data/VOCdevkit/VOC2007/JPEGImages/004203.jpg 500 385 6 163 37 284 151 6 270 62 320 115 6 1 2 203 385 +2115 /data/VOCdevkit/VOC2007/JPEGImages/004204.jpg 500 375 2 364 51 426 146 2 235 121 333 287 2 58 119 177 267 2 139 35 209 87 2 1 63 67 122 +2116 /data/VOCdevkit/VOC2007/JPEGImages/004205.jpg 500 333 14 3 11 247 333 14 268 1 499 333 14 191 45 262 277 14 274 68 329 165 +2117 /data/VOCdevkit/VOC2007/JPEGImages/004209.jpg 500 375 11 29 97 100 195 11 174 117 257 199 14 272 3 345 192 14 358 3 436 242 +2118 /data/VOCdevkit/VOC2007/JPEGImages/004212.jpg 500 375 7 88 176 250 312 15 454 115 500 291 +2119 /data/VOCdevkit/VOC2007/JPEGImages/004215.jpg 500 375 13 8 2 405 374 +2120 /data/VOCdevkit/VOC2007/JPEGImages/004220.jpg 500 333 2 152 132 380 214 +2121 /data/VOCdevkit/VOC2007/JPEGImages/004221.jpg 500 375 2 240 155 321 240 +2122 /data/VOCdevkit/VOC2007/JPEGImages/004223.jpg 500 327 14 184 5 424 327 +2123 /data/VOCdevkit/VOC2007/JPEGImages/004224.jpg 500 375 0 47 88 466 299 14 167 229 229 360 14 4 192 19 232 +2124 /data/VOCdevkit/VOC2007/JPEGImages/004228.jpg 500 294 6 42 71 429 262 6 40 56 122 87 +2125 /data/VOCdevkit/VOC2007/JPEGImages/004229.jpg 500 375 13 36 156 230 252 14 108 116 207 243 +2126 /data/VOCdevkit/VOC2007/JPEGImages/004230.jpg 500 333 14 268 122 465 333 14 77 37 500 333 +2127 /data/VOCdevkit/VOC2007/JPEGImages/004231.jpg 500 354 6 32 113 265 186 14 335 161 500 330 +2128 /data/VOCdevkit/VOC2007/JPEGImages/004232.jpg 500 263 11 26 130 101 180 11 110 140 159 182 11 252 128 320 171 14 1 82 33 170 +2129 /data/VOCdevkit/VOC2007/JPEGImages/004237.jpg 500 375 19 227 159 500 375 19 1 3 169 375 14 132 138 266 333 +2130 /data/VOCdevkit/VOC2007/JPEGImages/004239.jpg 333 500 16 1 89 257 478 16 102 181 329 432 +2131 /data/VOCdevkit/VOC2007/JPEGImages/004241.jpg 500 375 3 129 81 369 325 +2132 /data/VOCdevkit/VOC2007/JPEGImages/004242.jpg 500 375 6 3 13 474 374 +2133 /data/VOCdevkit/VOC2007/JPEGImages/004244.jpg 500 375 6 342 75 500 135 6 45 81 475 197 6 97 180 500 373 14 252 162 365 266 14 19 102 192 329 14 1 111 155 375 +2134 /data/VOCdevkit/VOC2007/JPEGImages/004246.jpg 500 375 14 98 148 242 375 3 34 4 428 299 +2135 /data/VOCdevkit/VOC2007/JPEGImages/004247.jpg 500 400 2 111 199 219 259 2 186 174 228 248 +2136 /data/VOCdevkit/VOC2007/JPEGImages/004253.jpg 500 375 8 141 192 252 337 8 181 163 267 291 8 274 182 352 308 10 167 179 348 332 +2137 /data/VOCdevkit/VOC2007/JPEGImages/004255.jpg 500 376 13 39 2 132 24 13 367 1 418 59 13 1 3 446 371 +2138 /data/VOCdevkit/VOC2007/JPEGImages/004256.jpg 500 323 18 2 2 500 300 +2139 /data/VOCdevkit/VOC2007/JPEGImages/004257.jpg 500 375 8 1 220 110 374 +2140 /data/VOCdevkit/VOC2007/JPEGImages/004258.jpg 500 375 3 1 2 343 207 14 252 46 307 117 14 91 32 123 63 14 309 57 353 118 14 351 42 379 111 14 43 2 76 110 14 75 3 104 74 14 411 46 453 96 +2141 /data/VOCdevkit/VOC2007/JPEGImages/004259.jpg 500 375 17 125 166 350 292 8 41 228 189 372 14 172 166 252 303 +2142 /data/VOCdevkit/VOC2007/JPEGImages/004263.jpg 500 335 2 76 112 366 328 +2143 /data/VOCdevkit/VOC2007/JPEGImages/004264.jpg 500 375 11 143 61 325 308 +2144 /data/VOCdevkit/VOC2007/JPEGImages/004265.jpg 500 375 14 253 139 402 276 +2145 /data/VOCdevkit/VOC2007/JPEGImages/004269.jpg 500 332 14 1 64 279 332 14 300 40 500 332 +2146 /data/VOCdevkit/VOC2007/JPEGImages/004270.jpg 500 375 14 280 120 433 375 14 140 103 333 375 8 97 215 302 375 +2147 /data/VOCdevkit/VOC2007/JPEGImages/004271.jpg 432 500 2 212 270 254 347 +2148 /data/VOCdevkit/VOC2007/JPEGImages/004272.jpg 375 500 11 163 146 367 394 +2149 /data/VOCdevkit/VOC2007/JPEGImages/004273.jpg 500 375 14 1 15 321 375 14 264 59 500 375 +2150 /data/VOCdevkit/VOC2007/JPEGImages/004274.jpg 500 375 19 272 5 500 298 15 1 1 270 298 +2151 /data/VOCdevkit/VOC2007/JPEGImages/004275.jpg 375 500 13 93 171 375 500 14 127 45 255 248 15 322 32 372 98 +2152 /data/VOCdevkit/VOC2007/JPEGImages/004279.jpg 500 375 4 261 166 289 272 14 4 65 171 375 14 75 58 193 329 14 158 68 339 216 14 299 51 383 255 14 358 83 500 372 10 132 303 451 375 10 151 192 377 305 +2153 /data/VOCdevkit/VOC2007/JPEGImages/004280.jpg 333 500 4 182 183 297 500 +2154 /data/VOCdevkit/VOC2007/JPEGImages/004281.jpg 500 375 18 270 1 500 375 +2155 /data/VOCdevkit/VOC2007/JPEGImages/004283.jpg 375 500 13 153 1 375 499 +2156 /data/VOCdevkit/VOC2007/JPEGImages/004284.jpg 500 263 6 100 118 212 185 6 251 104 389 182 +2157 /data/VOCdevkit/VOC2007/JPEGImages/004286.jpg 500 333 0 9 91 492 226 +2158 /data/VOCdevkit/VOC2007/JPEGImages/004287.jpg 500 400 14 2 1 500 400 7 75 81 376 400 +2159 /data/VOCdevkit/VOC2007/JPEGImages/004291.jpg 375 500 14 3 1 374 500 +2160 /data/VOCdevkit/VOC2007/JPEGImages/004292.jpg 374 500 15 10 158 183 412 14 156 32 271 377 +2161 /data/VOCdevkit/VOC2007/JPEGImages/004293.jpg 500 374 11 120 218 302 359 +2162 /data/VOCdevkit/VOC2007/JPEGImages/004295.jpg 500 375 6 36 11 453 351 +2163 /data/VOCdevkit/VOC2007/JPEGImages/004296.jpg 375 500 10 34 235 322 500 10 114 65 315 236 4 188 103 220 171 14 82 2 163 98 14 45 38 148 151 14 49 86 149 220 14 1 180 144 384 14 316 24 375 260 +2164 /data/VOCdevkit/VOC2007/JPEGImages/004298.jpg 500 375 11 284 169 349 284 17 1 149 440 375 14 158 84 363 373 +2165 /data/VOCdevkit/VOC2007/JPEGImages/004300.jpg 500 375 13 79 201 235 317 +2166 /data/VOCdevkit/VOC2007/JPEGImages/004303.jpg 500 281 5 1 3 305 281 6 410 129 482 154 6 295 130 410 169 6 389 127 435 145 +2167 /data/VOCdevkit/VOC2007/JPEGImages/004304.jpg 500 375 6 173 119 430 302 14 52 22 160 352 +2168 /data/VOCdevkit/VOC2007/JPEGImages/004307.jpg 500 332 12 171 87 454 262 12 61 96 295 245 +2169 /data/VOCdevkit/VOC2007/JPEGImages/004310.jpg 500 333 7 92 110 291 228 8 1 1 433 328 +2170 /data/VOCdevkit/VOC2007/JPEGImages/004312.jpg 500 375 16 134 30 437 375 +2171 /data/VOCdevkit/VOC2007/JPEGImages/004315.jpg 335 500 18 135 150 265 357 +2172 /data/VOCdevkit/VOC2007/JPEGImages/004318.jpg 375 500 11 1 61 365 283 +2173 /data/VOCdevkit/VOC2007/JPEGImages/004321.jpg 500 333 13 61 92 469 330 14 175 7 366 243 +2174 /data/VOCdevkit/VOC2007/JPEGImages/004322.jpg 333 500 4 3 350 50 489 14 3 37 241 500 +2175 /data/VOCdevkit/VOC2007/JPEGImages/004323.jpg 332 500 12 193 173 320 312 12 33 171 162 500 14 261 116 320 242 14 55 105 175 327 +2176 /data/VOCdevkit/VOC2007/JPEGImages/004325.jpg 390 500 3 1 22 189 346 +2177 /data/VOCdevkit/VOC2007/JPEGImages/004326.jpg 500 349 2 86 89 132 164 +2178 /data/VOCdevkit/VOC2007/JPEGImages/004327.jpg 500 422 11 12 66 493 415 14 132 1 403 397 +2179 /data/VOCdevkit/VOC2007/JPEGImages/004329.jpg 500 375 6 440 176 485 212 6 350 133 439 228 6 198 181 295 258 14 82 163 126 266 14 166 163 213 309 14 227 161 268 307 14 288 158 323 270 14 345 144 375 271 14 298 156 376 333 +2180 /data/VOCdevkit/VOC2007/JPEGImages/004331.jpg 500 375 19 166 78 341 276 +2181 /data/VOCdevkit/VOC2007/JPEGImages/004333.jpg 500 375 4 355 39 413 264 4 413 65 465 268 +2182 /data/VOCdevkit/VOC2007/JPEGImages/004338.jpg 500 333 13 69 75 450 313 +2183 /data/VOCdevkit/VOC2007/JPEGImages/004339.jpg 332 500 12 33 200 199 452 14 64 95 169 323 +2184 /data/VOCdevkit/VOC2007/JPEGImages/004341.jpg 500 375 19 73 54 392 355 +2185 /data/VOCdevkit/VOC2007/JPEGImages/004345.jpg 500 332 7 105 8 367 316 +2186 /data/VOCdevkit/VOC2007/JPEGImages/004346.jpg 500 375 6 3 250 392 326 6 358 255 453 306 6 438 259 500 322 +2187 /data/VOCdevkit/VOC2007/JPEGImages/004347.jpg 500 333 2 179 11 358 333 +2188 /data/VOCdevkit/VOC2007/JPEGImages/004349.jpg 500 376 2 88 50 156 88 2 149 90 217 129 2 150 57 220 100 2 151 323 228 363 2 262 300 371 348 2 372 285 454 323 2 443 175 500 221 2 266 174 362 217 2 345 121 419 162 2 358 5 434 42 2 260 6 323 45 2 75 289 181 342 2 199 285 258 331 2 323 275 409 314 2 329 200 400 232 2 158 246 274 304 2 104 209 181 257 2 81 142 149 204 2 150 128 219 183 2 370 91 453 138 2 287 70 352 122 2 183 38 234 74 2 202 202 298 253 2 448 20 488 70 2 387 41 460 91 2 354 53 405 108 2 226 110 298 166 2 305 105 356 152 2 344 159 411 201 2 426 3 474 31 +2189 /data/VOCdevkit/VOC2007/JPEGImages/004351.jpg 500 333 0 100 25 162 75 +2190 /data/VOCdevkit/VOC2007/JPEGImages/004352.jpg 500 375 11 5 96 493 370 +2191 /data/VOCdevkit/VOC2007/JPEGImages/004354.jpg 500 333 18 29 1 488 319 +2192 /data/VOCdevkit/VOC2007/JPEGImages/004356.jpg 500 375 14 279 119 338 211 1 253 163 327 232 +2193 /data/VOCdevkit/VOC2007/JPEGImages/004359.jpg 500 375 14 163 130 224 298 14 234 150 268 227 14 259 148 302 255 1 257 197 298 276 1 150 210 220 329 +2194 /data/VOCdevkit/VOC2007/JPEGImages/004360.jpg 333 500 14 18 65 333 500 +2195 /data/VOCdevkit/VOC2007/JPEGImages/004361.jpg 500 375 13 298 119 453 278 13 186 109 332 289 13 38 120 169 279 14 69 38 102 128 +2196 /data/VOCdevkit/VOC2007/JPEGImages/004364.jpg 500 332 17 109 164 221 267 15 11 134 77 332 8 249 165 282 216 15 209 145 240 175 +2197 /data/VOCdevkit/VOC2007/JPEGImages/004365.jpg 500 374 6 57 78 484 282 +2198 /data/VOCdevkit/VOC2007/JPEGImages/004367.jpg 500 375 6 109 51 500 375 +2199 /data/VOCdevkit/VOC2007/JPEGImages/004368.jpg 500 374 9 268 147 482 252 9 13 146 210 240 9 119 155 281 258 +2200 /data/VOCdevkit/VOC2007/JPEGImages/004369.jpg 500 375 17 129 101 360 331 +2201 /data/VOCdevkit/VOC2007/JPEGImages/004370.jpg 500 333 4 207 157 242 201 14 106 59 404 332 14 3 2 261 330 +2202 /data/VOCdevkit/VOC2007/JPEGImages/004371.jpg 500 491 3 243 223 410 279 3 443 240 500 288 3 431 229 488 282 +2203 /data/VOCdevkit/VOC2007/JPEGImages/004372.jpg 500 332 12 142 116 317 282 14 171 73 243 238 +2204 /data/VOCdevkit/VOC2007/JPEGImages/004376.jpg 500 374 7 111 16 500 374 +2205 /data/VOCdevkit/VOC2007/JPEGImages/004379.jpg 500 375 0 162 181 305 228 +2206 /data/VOCdevkit/VOC2007/JPEGImages/004380.jpg 333 500 13 8 74 333 500 14 5 26 324 445 14 40 104 273 322 +2207 /data/VOCdevkit/VOC2007/JPEGImages/004384.jpg 500 375 6 154 109 500 375 14 293 154 460 375 +2208 /data/VOCdevkit/VOC2007/JPEGImages/004386.jpg 500 333 6 19 79 384 331 18 196 1 240 44 +2209 /data/VOCdevkit/VOC2007/JPEGImages/004387.jpg 500 375 5 313 263 500 358 14 476 300 500 375 14 447 305 472 375 14 409 308 439 375 14 401 298 422 374 14 360 306 390 375 14 286 296 318 375 14 247 305 285 375 14 227 306 256 375 14 191 305 211 375 14 171 310 194 373 14 119 308 156 375 14 88 304 134 375 14 46 303 81 374 14 22 313 46 375 14 3 311 25 375 +2210 /data/VOCdevkit/VOC2007/JPEGImages/004389.jpg 327 500 12 61 239 308 496 14 135 73 263 325 +2211 /data/VOCdevkit/VOC2007/JPEGImages/004390.jpg 500 333 0 10 89 493 230 +2212 /data/VOCdevkit/VOC2007/JPEGImages/004391.jpg 500 333 0 206 153 320 183 +2213 /data/VOCdevkit/VOC2007/JPEGImages/004392.jpg 500 375 8 328 224 440 359 8 334 273 482 375 14 180 110 334 375 14 179 117 255 375 +2214 /data/VOCdevkit/VOC2007/JPEGImages/004396.jpg 500 375 0 238 197 267 215 +2215 /data/VOCdevkit/VOC2007/JPEGImages/004397.jpg 377 500 14 2 1 335 440 +2216 /data/VOCdevkit/VOC2007/JPEGImages/004404.jpg 500 375 7 302 128 385 176 7 115 242 196 329 14 75 58 393 375 +2217 /data/VOCdevkit/VOC2007/JPEGImages/004405.jpg 333 500 10 6 239 300 496 8 128 181 301 480 8 198 162 333 400 +2218 /data/VOCdevkit/VOC2007/JPEGImages/004409.jpg 500 323 11 1 1 361 275 +2219 /data/VOCdevkit/VOC2007/JPEGImages/004411.jpg 500 375 18 1 41 429 375 +2220 /data/VOCdevkit/VOC2007/JPEGImages/004421.jpg 375 500 8 168 358 260 500 8 30 272 63 388 8 58 268 143 412 8 2 292 78 474 10 64 280 271 412 10 235 383 375 500 +2221 /data/VOCdevkit/VOC2007/JPEGImages/004423.jpg 500 375 16 53 107 260 311 16 241 86 445 286 16 213 173 291 325 +2222 /data/VOCdevkit/VOC2007/JPEGImages/004424.jpg 375 500 14 166 97 298 500 14 85 90 255 500 14 23 100 57 145 14 100 73 126 122 +2223 /data/VOCdevkit/VOC2007/JPEGImages/004429.jpg 500 374 6 11 118 496 336 1 71 8 220 124 +2224 /data/VOCdevkit/VOC2007/JPEGImages/004430.jpg 500 333 1 93 25 245 302 +2225 /data/VOCdevkit/VOC2007/JPEGImages/004432.jpg 500 500 7 2 23 498 498 +2226 /data/VOCdevkit/VOC2007/JPEGImages/004433.jpg 342 500 11 49 350 341 500 14 123 78 258 409 14 98 79 168 154 15 222 15 290 115 +2227 /data/VOCdevkit/VOC2007/JPEGImages/004434.jpg 500 375 11 142 193 366 318 +2228 /data/VOCdevkit/VOC2007/JPEGImages/004436.jpg 332 500 18 108 154 243 382 +2229 /data/VOCdevkit/VOC2007/JPEGImages/004437.jpg 500 375 18 121 45 417 337 14 66 189 101 294 +2230 /data/VOCdevkit/VOC2007/JPEGImages/004438.jpg 480 360 11 147 200 238 288 14 122 114 325 360 14 290 42 414 322 19 10 149 138 311 +2231 /data/VOCdevkit/VOC2007/JPEGImages/004439.jpg 500 334 6 326 250 438 307 6 197 256 301 298 6 131 258 179 285 6 435 255 500 283 +2232 /data/VOCdevkit/VOC2007/JPEGImages/004441.jpg 374 500 9 114 155 174 199 +2233 /data/VOCdevkit/VOC2007/JPEGImages/004446.jpg 500 375 7 226 213 429 343 15 132 1 376 280 +2234 /data/VOCdevkit/VOC2007/JPEGImages/004450.jpg 333 500 12 1 1 272 371 +2235 /data/VOCdevkit/VOC2007/JPEGImages/004452.jpg 500 375 0 411 251 454 302 +2236 /data/VOCdevkit/VOC2007/JPEGImages/004455.jpg 500 333 7 164 116 256 206 15 81 1 473 325 +2237 /data/VOCdevkit/VOC2007/JPEGImages/004457.jpg 500 375 14 409 78 500 375 14 5 49 159 375 14 154 118 308 375 +2238 /data/VOCdevkit/VOC2007/JPEGImages/004459.jpg 500 375 14 99 202 118 251 14 47 202 64 244 0 2 12 500 267 +2239 /data/VOCdevkit/VOC2007/JPEGImages/004463.jpg 432 324 13 99 124 395 308 14 100 87 175 324 +2240 /data/VOCdevkit/VOC2007/JPEGImages/004464.jpg 500 375 11 242 169 334 335 14 104 2 238 206 3 278 54 306 101 +2241 /data/VOCdevkit/VOC2007/JPEGImages/004466.jpg 500 375 14 220 74 241 129 14 88 77 103 113 14 57 82 75 114 14 408 61 450 165 14 372 61 408 167 14 269 15 378 297 +2242 /data/VOCdevkit/VOC2007/JPEGImages/004468.jpg 174 500 4 6 5 157 498 +2243 /data/VOCdevkit/VOC2007/JPEGImages/004470.jpg 500 375 0 7 65 464 287 14 64 246 79 289 14 215 260 234 308 +2244 /data/VOCdevkit/VOC2007/JPEGImages/004471.jpg 281 500 14 10 90 151 485 14 137 92 236 452 14 197 77 281 479 +2245 /data/VOCdevkit/VOC2007/JPEGImages/004474.jpg 500 375 9 143 30 431 375 9 8 50 82 143 +2246 /data/VOCdevkit/VOC2007/JPEGImages/004479.jpg 500 375 14 2 63 85 326 4 86 303 139 375 4 47 271 89 375 14 171 73 373 361 14 373 123 500 375 +2247 /data/VOCdevkit/VOC2007/JPEGImages/004481.jpg 500 411 6 42 167 465 376 14 150 81 250 243 14 268 115 358 239 +2248 /data/VOCdevkit/VOC2007/JPEGImages/004484.jpg 500 375 8 419 209 500 375 8 367 230 457 375 10 47 199 500 375 15 89 129 160 216 +2249 /data/VOCdevkit/VOC2007/JPEGImages/004487.jpg 334 500 12 63 157 227 418 14 60 41 196 252 +2250 /data/VOCdevkit/VOC2007/JPEGImages/004488.jpg 500 375 6 202 241 263 272 6 271 241 319 267 +2251 /data/VOCdevkit/VOC2007/JPEGImages/004490.jpg 500 375 16 117 51 423 354 +2252 /data/VOCdevkit/VOC2007/JPEGImages/004493.jpg 500 375 4 355 61 404 194 10 1 95 500 375 +2253 /data/VOCdevkit/VOC2007/JPEGImages/004494.jpg 500 332 6 55 48 447 311 14 370 2 432 140 6 2 16 117 69 +2254 /data/VOCdevkit/VOC2007/JPEGImages/004495.jpg 500 375 14 9 77 301 375 14 220 81 416 375 14 397 89 500 373 4 381 148 396 190 +2255 /data/VOCdevkit/VOC2007/JPEGImages/004496.jpg 500 333 14 287 25 473 332 14 134 10 321 330 14 34 33 153 270 +2256 /data/VOCdevkit/VOC2007/JPEGImages/004498.jpg 332 500 3 126 159 215 284 +2257 /data/VOCdevkit/VOC2007/JPEGImages/004499.jpg 500 375 14 78 91 490 375 14 192 256 492 375 14 223 24 500 333 +2258 /data/VOCdevkit/VOC2007/JPEGImages/004500.jpg 480 360 9 60 105 253 241 9 2 128 151 270 +2259 /data/VOCdevkit/VOC2007/JPEGImages/004502.jpg 500 413 7 57 60 399 391 +2260 /data/VOCdevkit/VOC2007/JPEGImages/004507.jpg 500 375 13 5 4 458 372 +2261 /data/VOCdevkit/VOC2007/JPEGImages/004508.jpg 500 334 4 37 53 61 129 4 373 209 386 265 4 380 215 397 268 14 19 98 282 331 14 443 3 500 333 +2262 /data/VOCdevkit/VOC2007/JPEGImages/004509.jpg 333 500 1 51 218 333 470 14 71 58 316 402 +2263 /data/VOCdevkit/VOC2007/JPEGImages/004510.jpg 500 375 19 123 50 244 153 8 101 199 255 375 8 422 84 500 359 +2264 /data/VOCdevkit/VOC2007/JPEGImages/004512.jpg 500 332 11 94 190 315 317 14 385 1 460 180 14 100 59 183 160 8 325 119 389 196 +2265 /data/VOCdevkit/VOC2007/JPEGImages/004514.jpg 500 375 19 196 18 456 275 +2266 /data/VOCdevkit/VOC2007/JPEGImages/004517.jpg 421 500 14 2 98 355 500 +2267 /data/VOCdevkit/VOC2007/JPEGImages/004518.jpg 500 375 14 1 27 83 277 +2268 /data/VOCdevkit/VOC2007/JPEGImages/004519.jpg 500 375 6 92 110 408 241 +2269 /data/VOCdevkit/VOC2007/JPEGImages/004520.jpg 500 478 14 2 117 265 478 14 369 72 500 281 14 170 51 447 478 14 1 25 235 299 +2270 /data/VOCdevkit/VOC2007/JPEGImages/004524.jpg 500 375 2 311 273 383 344 2 256 131 309 171 2 461 198 500 243 2 107 1 186 21 +2271 /data/VOCdevkit/VOC2007/JPEGImages/004526.jpg 500 375 6 104 74 436 239 +2272 /data/VOCdevkit/VOC2007/JPEGImages/004527.jpg 500 500 16 295 171 450 289 16 238 148 387 186 16 270 141 422 178 16 74 132 228 274 16 1 108 69 204 16 104 107 198 131 16 232 110 294 140 16 205 100 334 137 16 189 174 308 298 16 435 112 493 145 16 8 127 139 236 16 369 105 419 141 16 412 138 469 252 16 302 110 371 149 16 124 125 149 154 16 65 113 117 138 +2273 /data/VOCdevkit/VOC2007/JPEGImages/004528.jpg 310 500 14 33 100 153 283 0 5 22 304 272 +2274 /data/VOCdevkit/VOC2007/JPEGImages/004530.jpg 500 375 5 54 41 415 295 14 140 106 186 147 +2275 /data/VOCdevkit/VOC2007/JPEGImages/004532.jpg 500 374 3 1 72 497 310 +2276 /data/VOCdevkit/VOC2007/JPEGImages/004535.jpg 480 445 12 80 100 401 423 14 215 40 324 271 +2277 /data/VOCdevkit/VOC2007/JPEGImages/004537.jpg 500 388 12 181 122 402 318 9 1 100 197 221 9 266 95 348 157 9 262 71 429 170 9 433 79 493 218 14 202 33 270 263 +2278 /data/VOCdevkit/VOC2007/JPEGImages/004539.jpg 500 375 6 4 268 164 374 6 42 243 125 282 6 345 253 500 373 6 421 236 500 263 6 268 240 308 269 +2279 /data/VOCdevkit/VOC2007/JPEGImages/004540.jpg 333 500 17 8 141 333 316 +2280 /data/VOCdevkit/VOC2007/JPEGImages/004542.jpg 500 376 14 337 20 461 362 14 200 118 312 335 14 5 219 129 375 14 70 177 128 319 17 134 137 500 321 +2281 /data/VOCdevkit/VOC2007/JPEGImages/004544.jpg 500 334 5 70 53 465 282 +2282 /data/VOCdevkit/VOC2007/JPEGImages/004548.jpg 500 367 11 141 58 414 272 +2283 /data/VOCdevkit/VOC2007/JPEGImages/004549.jpg 500 375 19 139 112 227 190 8 354 147 499 270 +2284 /data/VOCdevkit/VOC2007/JPEGImages/004551.jpg 500 375 11 1 1 493 375 +2285 /data/VOCdevkit/VOC2007/JPEGImages/004552.jpg 500 375 5 33 30 433 312 +2286 /data/VOCdevkit/VOC2007/JPEGImages/004553.jpg 500 334 12 140 105 498 334 14 51 164 95 297 14 242 35 368 251 +2287 /data/VOCdevkit/VOC2007/JPEGImages/004555.jpg 500 333 0 142 174 355 245 +2288 /data/VOCdevkit/VOC2007/JPEGImages/004558.jpg 333 500 15 127 63 185 121 15 129 169 183 235 15 129 283 180 352 15 114 348 247 470 +2289 /data/VOCdevkit/VOC2007/JPEGImages/004562.jpg 375 500 14 267 3 360 256 14 2 2 83 123 +2290 /data/VOCdevkit/VOC2007/JPEGImages/004563.jpg 500 333 6 58 219 135 267 6 155 226 195 242 6 365 211 417 231 14 428 199 446 236 +2291 /data/VOCdevkit/VOC2007/JPEGImages/004565.jpg 500 500 11 3 133 390 497 +2292 /data/VOCdevkit/VOC2007/JPEGImages/004566.jpg 500 375 7 76 97 353 315 7 211 1 500 250 +2293 /data/VOCdevkit/VOC2007/JPEGImages/004570.jpg 500 375 0 3 3 370 245 +2294 /data/VOCdevkit/VOC2007/JPEGImages/004571.jpg 500 323 9 224 120 387 243 9 56 42 168 236 14 209 51 239 157 14 237 56 263 150 +2295 /data/VOCdevkit/VOC2007/JPEGImages/004574.jpg 334 500 8 56 250 203 450 14 56 125 206 330 +2296 /data/VOCdevkit/VOC2007/JPEGImages/004576.jpg 500 333 6 30 64 441 245 6 385 68 497 137 +2297 /data/VOCdevkit/VOC2007/JPEGImages/004579.jpg 500 372 18 1 132 500 247 +2298 /data/VOCdevkit/VOC2007/JPEGImages/004581.jpg 500 333 6 15 94 477 278 +2299 /data/VOCdevkit/VOC2007/JPEGImages/004584.jpg 500 375 17 6 89 498 327 +2300 /data/VOCdevkit/VOC2007/JPEGImages/004585.jpg 500 375 9 23 238 101 314 9 100 207 176 267 9 257 243 340 302 9 203 188 262 242 +2301 /data/VOCdevkit/VOC2007/JPEGImages/004587.jpg 333 500 11 209 298 322 356 +2302 /data/VOCdevkit/VOC2007/JPEGImages/004588.jpg 411 500 14 54 180 146 332 14 57 148 147 302 14 186 157 237 233 14 220 139 302 195 14 224 176 309 233 14 273 174 383 376 14 217 213 342 381 4 234 250 253 295 4 200 274 214 320 +2303 /data/VOCdevkit/VOC2007/JPEGImages/004591.jpg 500 333 18 139 158 264 199 6 307 266 500 333 6 326 247 500 307 +2304 /data/VOCdevkit/VOC2007/JPEGImages/004592.jpg 500 375 3 73 6 497 327 +2305 /data/VOCdevkit/VOC2007/JPEGImages/004595.jpg 500 375 11 159 77 333 358 14 250 1 500 375 +2306 /data/VOCdevkit/VOC2007/JPEGImages/004597.jpg 500 375 8 83 181 120 255 +2307 /data/VOCdevkit/VOC2007/JPEGImages/004600.jpg 500 375 7 178 40 298 281 +2308 /data/VOCdevkit/VOC2007/JPEGImages/004601.jpg 500 333 13 151 100 266 317 14 200 43 332 308 +2309 /data/VOCdevkit/VOC2007/JPEGImages/004604.jpg 500 375 6 2 52 172 188 14 265 58 309 104 14 411 19 477 272 14 313 1 430 315 13 182 103 332 174 13 58 132 394 280 +2310 /data/VOCdevkit/VOC2007/JPEGImages/004605.jpg 500 333 1 93 121 352 325 1 411 7 500 139 14 158 29 292 315 14 444 36 500 332 +2311 /data/VOCdevkit/VOC2007/JPEGImages/004606.jpg 500 375 0 320 284 351 317 +2312 /data/VOCdevkit/VOC2007/JPEGImages/004607.jpg 500 375 17 93 107 389 232 8 348 117 497 303 8 1 128 132 295 +2313 /data/VOCdevkit/VOC2007/JPEGImages/004609.jpg 375 500 11 174 179 375 412 14 2 100 320 500 +2314 /data/VOCdevkit/VOC2007/JPEGImages/004611.jpg 500 375 14 355 167 480 374 14 342 171 408 266 14 263 197 361 372 14 132 179 266 372 14 34 187 135 349 14 238 169 295 252 8 426 305 500 375 8 2 259 100 374 +2315 /data/VOCdevkit/VOC2007/JPEGImages/004612.jpg 500 332 2 230 133 270 202 +2316 /data/VOCdevkit/VOC2007/JPEGImages/004618.jpg 375 500 6 258 367 336 424 +2317 /data/VOCdevkit/VOC2007/JPEGImages/004622.jpg 375 500 14 39 61 375 500 1 45 100 365 500 +2318 /data/VOCdevkit/VOC2007/JPEGImages/004623.jpg 500 378 2 51 83 428 358 +2319 /data/VOCdevkit/VOC2007/JPEGImages/004625.jpg 500 375 12 82 89 433 375 +2320 /data/VOCdevkit/VOC2007/JPEGImages/004626.jpg 500 333 18 89 106 479 234 18 1 132 93 224 +2321 /data/VOCdevkit/VOC2007/JPEGImages/004627.jpg 500 375 18 193 202 421 272 18 417 227 500 284 +2322 /data/VOCdevkit/VOC2007/JPEGImages/004628.jpg 500 333 7 235 1 443 279 +2323 /data/VOCdevkit/VOC2007/JPEGImages/004630.jpg 500 375 14 110 96 176 289 14 159 82 245 341 14 212 88 353 374 14 331 77 435 373 14 203 15 328 375 14 3 113 273 375 14 460 110 486 195 14 419 107 456 203 5 3 11 434 135 +2324 /data/VOCdevkit/VOC2007/JPEGImages/004631.jpg 375 500 8 221 359 362 500 14 194 153 298 414 14 89 154 251 496 15 36 156 88 231 +2325 /data/VOCdevkit/VOC2007/JPEGImages/004632.jpg 500 375 11 121 143 230 306 11 212 147 382 300 +2326 /data/VOCdevkit/VOC2007/JPEGImages/004634.jpg 460 500 12 160 143 400 305 +2327 /data/VOCdevkit/VOC2007/JPEGImages/004636.jpg 500 280 2 192 117 412 206 +2328 /data/VOCdevkit/VOC2007/JPEGImages/004643.jpg 500 374 0 9 62 472 306 +2329 /data/VOCdevkit/VOC2007/JPEGImages/004644.jpg 500 333 11 1 26 186 260 +2330 /data/VOCdevkit/VOC2007/JPEGImages/004647.jpg 500 333 13 83 121 298 332 14 275 57 371 312 14 115 53 213 213 +2331 /data/VOCdevkit/VOC2007/JPEGImages/004648.jpg 500 375 14 84 184 95 218 14 440 190 461 220 14 468 188 486 219 5 146 166 425 216 +2332 /data/VOCdevkit/VOC2007/JPEGImages/004649.jpg 500 335 18 36 126 393 237 +2333 /data/VOCdevkit/VOC2007/JPEGImages/004651.jpg 500 375 3 153 154 216 262 +2334 /data/VOCdevkit/VOC2007/JPEGImages/004652.jpg 500 333 19 79 1 434 216 +2335 /data/VOCdevkit/VOC2007/JPEGImages/004653.jpg 333 500 14 51 109 276 448 +2336 /data/VOCdevkit/VOC2007/JPEGImages/004654.jpg 500 357 7 73 109 363 294 8 1 3 480 357 +2337 /data/VOCdevkit/VOC2007/JPEGImages/004655.jpg 500 350 8 441 181 493 244 8 61 211 142 273 8 169 199 240 262 10 200 272 403 346 +2338 /data/VOCdevkit/VOC2007/JPEGImages/004656.jpg 375 500 12 146 284 234 383 14 177 240 208 330 +2339 /data/VOCdevkit/VOC2007/JPEGImages/004660.jpg 500 375 6 1 129 40 163 14 440 86 458 123 14 216 89 347 167 6 3 89 499 353 +2340 /data/VOCdevkit/VOC2007/JPEGImages/004662.jpg 332 500 12 3 179 223 473 14 185 122 290 451 +2341 /data/VOCdevkit/VOC2007/JPEGImages/004671.jpg 317 500 4 49 1 283 497 +2342 /data/VOCdevkit/VOC2007/JPEGImages/004672.jpg 500 375 1 83 1 383 328 14 192 2 360 234 +2343 /data/VOCdevkit/VOC2007/JPEGImages/004673.jpg 500 333 1 52 154 159 308 14 80 66 204 270 +2344 /data/VOCdevkit/VOC2007/JPEGImages/004674.jpg 500 333 0 2 36 500 332 +2345 /data/VOCdevkit/VOC2007/JPEGImages/004675.jpg 500 190 18 3 46 374 150 +2346 /data/VOCdevkit/VOC2007/JPEGImages/004676.jpg 500 375 1 145 201 315 343 14 206 122 277 317 +2347 /data/VOCdevkit/VOC2007/JPEGImages/004679.jpg 500 375 14 1 1 497 372 11 143 79 362 315 +2348 /data/VOCdevkit/VOC2007/JPEGImages/004682.jpg 500 375 15 22 68 245 261 15 246 114 472 333 +2349 /data/VOCdevkit/VOC2007/JPEGImages/004683.jpg 500 375 7 22 2 426 291 +2350 /data/VOCdevkit/VOC2007/JPEGImages/004685.jpg 333 500 14 70 165 161 341 14 119 167 328 414 +2351 /data/VOCdevkit/VOC2007/JPEGImages/004686.jpg 500 322 12 348 140 461 231 12 47 126 121 174 14 388 106 427 171 14 72 100 103 148 9 53 152 137 231 9 89 164 185 235 9 174 163 263 245 9 190 169 250 238 9 252 167 296 254 9 290 162 326 241 9 320 173 356 250 9 379 166 424 251 +2352 /data/VOCdevkit/VOC2007/JPEGImages/004687.jpg 500 375 13 98 83 383 321 14 145 34 288 316 14 403 84 436 170 6 442 100 500 161 +2353 /data/VOCdevkit/VOC2007/JPEGImages/004689.jpg 500 375 18 16 155 477 345 +2354 /data/VOCdevkit/VOC2007/JPEGImages/004691.jpg 500 375 18 54 67 500 318 6 33 1 71 20 +2355 /data/VOCdevkit/VOC2007/JPEGImages/004692.jpg 375 500 8 292 128 375 434 14 36 207 273 500 +2356 /data/VOCdevkit/VOC2007/JPEGImages/004693.jpg 500 333 18 1 1 143 226 18 104 2 500 261 14 168 141 218 278 +2357 /data/VOCdevkit/VOC2007/JPEGImages/004694.jpg 252 500 14 49 71 203 255 13 95 185 202 466 +2358 /data/VOCdevkit/VOC2007/JPEGImages/004699.jpg 500 378 15 319 33 500 322 14 379 303 417 360 14 337 295 382 354 14 186 257 224 309 14 52 308 71 331 14 38 309 56 335 14 63 307 82 329 +2359 /data/VOCdevkit/VOC2007/JPEGImages/004701.jpg 500 375 4 334 1 386 110 +2360 /data/VOCdevkit/VOC2007/JPEGImages/004702.jpg 500 307 2 34 166 195 257 2 404 112 494 212 2 126 16 217 114 +2361 /data/VOCdevkit/VOC2007/JPEGImages/004705.jpg 500 330 5 394 181 455 226 6 1 206 104 270 +2362 /data/VOCdevkit/VOC2007/JPEGImages/004706.jpg 500 357 14 117 20 362 340 1 46 164 428 357 +2363 /data/VOCdevkit/VOC2007/JPEGImages/004707.jpg 375 500 15 236 354 330 468 14 58 316 77 355 +2364 /data/VOCdevkit/VOC2007/JPEGImages/004708.jpg 500 375 7 45 157 239 330 7 312 154 480 214 17 5 3 500 371 +2365 /data/VOCdevkit/VOC2007/JPEGImages/004710.jpg 500 331 4 146 1 355 248 +2366 /data/VOCdevkit/VOC2007/JPEGImages/004714.jpg 500 375 8 139 51 256 224 8 2 43 77 203 15 317 75 408 149 15 219 161 260 214 15 127 232 217 274 +2367 /data/VOCdevkit/VOC2007/JPEGImages/004715.jpg 500 375 14 202 127 331 374 14 159 103 305 375 +2368 /data/VOCdevkit/VOC2007/JPEGImages/004718.jpg 500 375 4 1 1 49 102 14 95 7 340 341 14 45 1 499 374 +2369 /data/VOCdevkit/VOC2007/JPEGImages/004719.jpg 500 333 5 2 125 112 209 6 353 150 500 262 +2370 /data/VOCdevkit/VOC2007/JPEGImages/004722.jpg 500 375 12 71 76 167 286 14 257 104 367 359 14 330 110 436 373 +2371 /data/VOCdevkit/VOC2007/JPEGImages/004723.jpg 500 375 14 359 128 460 375 14 16 136 65 284 14 1 131 56 304 +2372 /data/VOCdevkit/VOC2007/JPEGImages/004727.jpg 500 500 5 263 165 298 226 5 86 59 264 299 6 36 215 86 258 6 1 205 56 266 14 120 217 263 500 14 221 228 263 408 14 245 187 282 259 14 253 225 340 498 14 295 316 472 500 14 401 201 484 500 14 391 171 429 217 14 334 199 412 321 14 312 201 354 270 +2373 /data/VOCdevkit/VOC2007/JPEGImages/004732.jpg 375 500 8 60 140 375 500 14 78 163 361 497 +2374 /data/VOCdevkit/VOC2007/JPEGImages/004735.jpg 500 375 8 1 206 291 375 +2375 /data/VOCdevkit/VOC2007/JPEGImages/004737.jpg 500 333 11 185 55 500 332 +2376 /data/VOCdevkit/VOC2007/JPEGImages/004742.jpg 500 375 10 2 213 500 375 4 420 207 471 354 4 245 216 274 308 4 239 188 277 293 4 297 181 334 276 4 136 176 192 207 15 276 43 344 107 14 339 112 500 250 14 266 102 376 238 14 114 85 261 224 14 6 104 110 230 +2377 /data/VOCdevkit/VOC2007/JPEGImages/004743.jpg 500 375 7 1 2 500 375 +2378 /data/VOCdevkit/VOC2007/JPEGImages/004746.jpg 500 335 18 266 54 492 297 18 29 55 241 293 +2379 /data/VOCdevkit/VOC2007/JPEGImages/004747.jpg 500 375 6 1 46 472 351 +2380 /data/VOCdevkit/VOC2007/JPEGImages/004748.jpg 500 375 0 27 215 234 334 0 265 253 330 276 6 376 309 422 332 6 346 326 405 357 +2381 /data/VOCdevkit/VOC2007/JPEGImages/004750.jpg 500 331 14 85 32 224 285 13 21 124 224 292 6 302 1 500 110 +2382 /data/VOCdevkit/VOC2007/JPEGImages/004753.jpg 500 375 14 2 23 393 375 14 208 12 329 163 4 339 125 361 184 +2383 /data/VOCdevkit/VOC2007/JPEGImages/004754.jpg 375 500 19 1 270 133 500 +2384 /data/VOCdevkit/VOC2007/JPEGImages/004760.jpg 500 375 11 210 114 495 375 14 1 1 177 375 +2385 /data/VOCdevkit/VOC2007/JPEGImages/004761.jpg 375 500 14 2 26 375 450 1 25 165 375 500 14 3 1 71 121 14 119 1 173 40 14 259 1 324 206 14 319 2 360 110 1 317 61 375 143 +2386 /data/VOCdevkit/VOC2007/JPEGImages/004768.jpg 500 375 16 24 28 499 368 +2387 /data/VOCdevkit/VOC2007/JPEGImages/004770.jpg 335 500 14 83 2 335 500 +2388 /data/VOCdevkit/VOC2007/JPEGImages/004773.jpg 375 500 10 78 249 368 496 8 240 231 375 443 8 8 288 190 500 19 11 184 65 226 +2389 /data/VOCdevkit/VOC2007/JPEGImages/004776.jpg 500 375 18 77 58 428 353 +2390 /data/VOCdevkit/VOC2007/JPEGImages/004777.jpg 500 395 11 178 101 437 360 +2391 /data/VOCdevkit/VOC2007/JPEGImages/004779.jpg 500 375 6 114 203 284 291 14 143 188 185 304 +2392 /data/VOCdevkit/VOC2007/JPEGImages/004782.jpg 500 334 1 153 162 240 266 14 155 109 266 244 +2393 /data/VOCdevkit/VOC2007/JPEGImages/004783.jpg 500 334 2 256 155 290 178 +2394 /data/VOCdevkit/VOC2007/JPEGImages/004785.jpg 500 331 10 56 97 475 331 8 1 81 52 159 +2395 /data/VOCdevkit/VOC2007/JPEGImages/004786.jpg 500 375 6 27 120 500 314 +2396 /data/VOCdevkit/VOC2007/JPEGImages/004788.jpg 480 388 12 72 89 413 354 14 196 49 316 220 +2397 /data/VOCdevkit/VOC2007/JPEGImages/004789.jpg 500 332 12 201 117 316 234 14 225 93 282 199 +2398 /data/VOCdevkit/VOC2007/JPEGImages/004790.jpg 500 375 14 1 4 263 375 14 204 22 499 375 14 277 70 489 323 +2399 /data/VOCdevkit/VOC2007/JPEGImages/004792.jpg 375 500 7 115 135 257 336 +2400 /data/VOCdevkit/VOC2007/JPEGImages/004793.jpg 500 375 6 28 132 295 372 +2401 /data/VOCdevkit/VOC2007/JPEGImages/004794.jpg 500 329 2 190 140 405 243 +2402 /data/VOCdevkit/VOC2007/JPEGImages/004796.jpg 500 375 13 316 111 491 375 13 57 117 267 270 14 89 85 153 280 +2403 /data/VOCdevkit/VOC2007/JPEGImages/004797.jpg 500 333 1 126 146 202 202 1 309 152 374 197 14 328 130 371 186 14 142 121 196 190 +2404 /data/VOCdevkit/VOC2007/JPEGImages/004799.jpg 341 500 2 61 111 328 474 +2405 /data/VOCdevkit/VOC2007/JPEGImages/004801.jpg 500 333 14 258 127 412 333 14 1 14 482 333 +2406 /data/VOCdevkit/VOC2007/JPEGImages/004805.jpg 500 333 13 106 17 407 331 6 355 54 498 179 6 2 53 136 181 6 43 59 252 129 +2407 /data/VOCdevkit/VOC2007/JPEGImages/004808.jpg 500 375 6 114 162 423 273 +2408 /data/VOCdevkit/VOC2007/JPEGImages/004812.jpg 500 362 0 89 77 484 292 14 433 163 492 272 +2409 /data/VOCdevkit/VOC2007/JPEGImages/004814.jpg 500 333 7 1 33 500 265 +2410 /data/VOCdevkit/VOC2007/JPEGImages/004815.jpg 500 332 12 187 122 373 262 14 369 112 426 257 +2411 /data/VOCdevkit/VOC2007/JPEGImages/004816.jpg 500 333 11 113 37 365 294 +2412 /data/VOCdevkit/VOC2007/JPEGImages/004818.jpg 500 400 8 52 117 245 400 8 302 104 426 308 +2413 /data/VOCdevkit/VOC2007/JPEGImages/004823.jpg 500 375 6 1 80 498 331 +2414 /data/VOCdevkit/VOC2007/JPEGImages/004825.jpg 375 500 15 1 12 373 500 +2415 /data/VOCdevkit/VOC2007/JPEGImages/004826.jpg 500 375 9 61 224 261 361 14 395 152 443 257 14 444 146 476 183 +2416 /data/VOCdevkit/VOC2007/JPEGImages/004828.jpg 500 483 14 1 150 32 278 14 61 152 209 399 14 245 111 352 341 6 412 187 480 282 6 139 171 446 391 +2417 /data/VOCdevkit/VOC2007/JPEGImages/004830.jpg 500 333 6 104 110 418 212 +2418 /data/VOCdevkit/VOC2007/JPEGImages/004831.jpg 500 333 14 111 29 361 318 +2419 /data/VOCdevkit/VOC2007/JPEGImages/004832.jpg 474 471 7 144 304 262 468 14 163 98 415 470 +2420 /data/VOCdevkit/VOC2007/JPEGImages/004834.jpg 387 480 14 140 94 270 304 12 153 128 252 441 +2421 /data/VOCdevkit/VOC2007/JPEGImages/004836.jpg 500 446 13 1 147 474 446 +2422 /data/VOCdevkit/VOC2007/JPEGImages/004837.jpg 500 375 17 273 138 500 320 8 67 166 253 357 +2423 /data/VOCdevkit/VOC2007/JPEGImages/004839.jpg 332 500 3 134 111 201 284 3 51 121 112 253 +2424 /data/VOCdevkit/VOC2007/JPEGImages/004840.jpg 500 375 14 114 1 408 370 14 140 85 338 375 13 2 222 215 375 +2425 /data/VOCdevkit/VOC2007/JPEGImages/004841.jpg 500 375 0 107 200 171 243 0 350 108 375 125 +2426 /data/VOCdevkit/VOC2007/JPEGImages/004842.jpg 500 333 16 323 92 500 330 16 79 107 321 333 16 128 33 271 156 16 274 1 422 139 16 1 1 108 208 +2427 /data/VOCdevkit/VOC2007/JPEGImages/004846.jpg 500 338 14 137 148 500 338 14 201 3 500 242 +2428 /data/VOCdevkit/VOC2007/JPEGImages/004848.jpg 500 490 2 162 60 279 299 +2429 /data/VOCdevkit/VOC2007/JPEGImages/004849.jpg 336 500 18 143 191 250 281 +2430 /data/VOCdevkit/VOC2007/JPEGImages/004850.jpg 500 375 6 245 92 405 195 +2431 /data/VOCdevkit/VOC2007/JPEGImages/004852.jpg 500 375 14 192 47 471 375 +2432 /data/VOCdevkit/VOC2007/JPEGImages/004856.jpg 368 500 7 28 1 335 496 +2433 /data/VOCdevkit/VOC2007/JPEGImages/004857.jpg 500 375 14 279 71 412 361 14 51 94 198 361 14 406 78 423 111 10 121 181 326 369 8 339 153 487 372 8 1 160 154 374 8 317 212 500 375 +2434 /data/VOCdevkit/VOC2007/JPEGImages/004859.jpg 375 500 14 136 171 209 270 14 57 205 177 390 14 177 170 359 450 14 189 128 374 499 +2435 /data/VOCdevkit/VOC2007/JPEGImages/004863.jpg 500 375 6 61 61 421 282 +2436 /data/VOCdevkit/VOC2007/JPEGImages/004866.jpg 500 375 7 111 97 237 192 +2437 /data/VOCdevkit/VOC2007/JPEGImages/004867.jpg 500 333 18 3 70 500 305 +2438 /data/VOCdevkit/VOC2007/JPEGImages/004868.jpg 500 375 14 99 97 251 297 14 217 69 392 282 10 1 260 500 375 19 284 72 392 164 +2439 /data/VOCdevkit/VOC2007/JPEGImages/004869.jpg 350 500 2 61 69 350 433 +2440 /data/VOCdevkit/VOC2007/JPEGImages/004872.jpg 500 375 12 252 131 291 263 14 237 94 311 212 +2441 /data/VOCdevkit/VOC2007/JPEGImages/004873.jpg 500 375 6 8 119 371 355 +2442 /data/VOCdevkit/VOC2007/JPEGImages/004876.jpg 500 248 2 26 91 61 208 2 152 151 177 237 2 404 141 443 194 2 202 149 224 203 2 313 119 338 184 +2443 /data/VOCdevkit/VOC2007/JPEGImages/004878.jpg 500 375 7 36 129 432 375 +2444 /data/VOCdevkit/VOC2007/JPEGImages/004879.jpg 500 330 1 262 158 332 202 14 269 136 309 192 14 174 131 197 189 +2445 /data/VOCdevkit/VOC2007/JPEGImages/004882.jpg 500 333 13 93 142 184 274 13 197 69 446 330 14 153 126 312 333 +2446 /data/VOCdevkit/VOC2007/JPEGImages/004885.jpg 500 375 3 104 138 412 340 +2447 /data/VOCdevkit/VOC2007/JPEGImages/004886.jpg 500 375 14 12 27 218 375 14 217 63 500 375 14 366 22 500 375 4 164 300 181 360 +2448 /data/VOCdevkit/VOC2007/JPEGImages/004890.jpg 500 380 6 56 97 454 313 +2449 /data/VOCdevkit/VOC2007/JPEGImages/004895.jpg 500 371 15 253 20 490 297 +2450 /data/VOCdevkit/VOC2007/JPEGImages/004896.jpg 500 332 0 1 69 500 243 +2451 /data/VOCdevkit/VOC2007/JPEGImages/004897.jpg 500 333 14 181 196 242 333 14 1 188 28 312 14 243 212 279 333 +2452 /data/VOCdevkit/VOC2007/JPEGImages/004898.jpg 500 375 14 146 17 252 303 14 93 159 160 291 15 273 173 307 213 15 383 197 429 262 +2453 /data/VOCdevkit/VOC2007/JPEGImages/004902.jpg 500 375 12 1 141 192 374 12 79 124 265 364 14 217 118 389 375 14 195 68 500 375 +2454 /data/VOCdevkit/VOC2007/JPEGImages/004903.jpg 500 331 17 37 126 374 301 6 335 55 472 159 6 440 95 500 247 6 441 53 500 81 +2455 /data/VOCdevkit/VOC2007/JPEGImages/004905.jpg 500 333 0 2 8 197 280 +2456 /data/VOCdevkit/VOC2007/JPEGImages/004907.jpg 500 333 7 177 1 440 329 +2457 /data/VOCdevkit/VOC2007/JPEGImages/004910.jpg 333 500 5 22 182 306 394 +2458 /data/VOCdevkit/VOC2007/JPEGImages/004911.jpg 500 375 18 1 120 99 241 18 70 37 396 343 +2459 /data/VOCdevkit/VOC2007/JPEGImages/004912.jpg 500 375 1 29 65 410 288 8 20 209 170 375 8 300 179 441 375 +2460 /data/VOCdevkit/VOC2007/JPEGImages/004913.jpg 500 375 14 274 97 323 335 14 217 126 335 340 14 133 178 227 358 14 390 82 493 291 14 281 38 337 128 14 70 50 138 138 14 1 105 92 351 14 69 110 157 357 14 175 124 236 304 14 125 52 205 187 14 201 67 282 172 14 310 75 374 209 14 362 60 426 218 14 306 206 394 352 14 388 190 487 356 +2461 /data/VOCdevkit/VOC2007/JPEGImages/004916.jpg 500 333 14 30 34 334 333 4 355 244 464 333 19 119 87 169 148 +2462 /data/VOCdevkit/VOC2007/JPEGImages/004926.jpg 500 375 4 217 71 255 230 10 1 175 498 375 +2463 /data/VOCdevkit/VOC2007/JPEGImages/004928.jpg 500 333 14 146 52 353 301 14 1 19 160 310 14 235 22 500 333 +2464 /data/VOCdevkit/VOC2007/JPEGImages/004929.jpg 500 375 11 215 21 500 375 +2465 /data/VOCdevkit/VOC2007/JPEGImages/004931.jpg 500 375 3 176 181 221 227 3 233 188 273 220 14 367 172 454 324 14 259 181 320 323 +2466 /data/VOCdevkit/VOC2007/JPEGImages/004935.jpg 332 500 14 87 62 250 295 12 104 140 292 433 +2467 /data/VOCdevkit/VOC2007/JPEGImages/004936.jpg 500 375 1 2 1 500 357 +2468 /data/VOCdevkit/VOC2007/JPEGImages/004938.jpg 500 375 17 5 170 500 374 +2469 /data/VOCdevkit/VOC2007/JPEGImages/004939.jpg 500 333 15 135 1 178 67 14 1 1 468 330 +2470 /data/VOCdevkit/VOC2007/JPEGImages/004943.jpg 500 333 4 377 168 425 310 14 427 118 500 262 14 315 128 416 258 14 138 138 272 292 14 1 28 169 333 4 326 178 359 271 +2471 /data/VOCdevkit/VOC2007/JPEGImages/004946.jpg 375 500 14 134 43 277 500 6 253 235 375 306 6 29 249 82 274 +2472 /data/VOCdevkit/VOC2007/JPEGImages/004948.jpg 500 375 15 210 237 294 347 15 127 213 203 336 15 163 123 220 217 15 227 130 284 221 +2473 /data/VOCdevkit/VOC2007/JPEGImages/004950.jpg 320 196 12 77 23 213 195 14 100 9 176 113 +2474 /data/VOCdevkit/VOC2007/JPEGImages/004951.jpg 500 375 18 51 142 500 262 +2475 /data/VOCdevkit/VOC2007/JPEGImages/004953.jpg 500 358 1 168 239 220 311 14 165 166 220 302 14 55 176 111 286 14 246 167 297 294 14 323 155 381 292 14 31 186 65 305 14 1 174 24 301 14 401 158 427 250 14 429 159 454 255 14 452 154 474 252 14 468 150 497 250 5 216 141 318 238 5 259 132 412 243 +2476 /data/VOCdevkit/VOC2007/JPEGImages/004954.jpg 450 500 16 24 153 381 482 14 104 30 416 436 +2477 /data/VOCdevkit/VOC2007/JPEGImages/004955.jpg 500 374 7 97 16 382 291 19 1 225 441 373 +2478 /data/VOCdevkit/VOC2007/JPEGImages/004956.jpg 333 500 19 115 226 151 266 8 127 245 177 293 +2479 /data/VOCdevkit/VOC2007/JPEGImages/004958.jpg 500 333 3 60 19 273 283 +2480 /data/VOCdevkit/VOC2007/JPEGImages/004960.jpg 426 500 15 3 3 423 499 15 346 245 426 461 15 1 290 110 462 +2481 /data/VOCdevkit/VOC2007/JPEGImages/004961.jpg 500 333 6 18 80 497 305 +2482 /data/VOCdevkit/VOC2007/JPEGImages/004962.jpg 500 333 6 255 172 348 208 +2483 /data/VOCdevkit/VOC2007/JPEGImages/004963.jpg 500 334 7 68 41 475 304 +2484 /data/VOCdevkit/VOC2007/JPEGImages/004966.jpg 500 326 2 135 130 322 276 +2485 /data/VOCdevkit/VOC2007/JPEGImages/004967.jpg 500 357 13 5 2 500 354 +2486 /data/VOCdevkit/VOC2007/JPEGImages/004968.jpg 329 500 12 45 2 329 470 14 169 193 329 431 +2487 /data/VOCdevkit/VOC2007/JPEGImages/004972.jpg 393 500 2 115 78 344 482 +2488 /data/VOCdevkit/VOC2007/JPEGImages/004973.jpg 500 375 6 111 149 235 239 6 281 149 408 240 +2489 /data/VOCdevkit/VOC2007/JPEGImages/004974.jpg 500 329 2 92 141 256 268 +2490 /data/VOCdevkit/VOC2007/JPEGImages/004976.jpg 500 338 14 311 108 476 221 14 224 98 350 226 14 177 132 247 263 14 43 139 196 332 10 128 193 500 338 +2491 /data/VOCdevkit/VOC2007/JPEGImages/004977.jpg 500 375 11 1 1 464 280 +2492 /data/VOCdevkit/VOC2007/JPEGImages/004982.jpg 500 333 0 5 111 500 221 +2493 /data/VOCdevkit/VOC2007/JPEGImages/004983.jpg 338 500 1 79 50 265 440 6 1 1 317 82 +2494 /data/VOCdevkit/VOC2007/JPEGImages/004984.jpg 500 375 8 295 34 480 213 +2495 /data/VOCdevkit/VOC2007/JPEGImages/004985.jpg 500 375 7 1 59 475 297 +2496 /data/VOCdevkit/VOC2007/JPEGImages/004986.jpg 375 500 8 140 305 185 392 +2497 /data/VOCdevkit/VOC2007/JPEGImages/004987.jpg 307 500 14 44 186 285 365 14 189 180 307 358 +2498 /data/VOCdevkit/VOC2007/JPEGImages/004990.jpg 500 375 14 15 102 448 365 +2499 /data/VOCdevkit/VOC2007/JPEGImages/004991.jpg 500 375 10 53 139 404 375 15 327 20 357 91 8 284 107 464 372 8 1 127 243 375 +2500 /data/VOCdevkit/VOC2007/JPEGImages/004992.jpg 500 375 11 54 57 480 294 +2501 /data/VOCdevkit/VOC2007/JPEGImages/004994.jpg 500 354 14 186 151 377 354 8 126 175 329 354 +2502 /data/VOCdevkit/VOC2007/JPEGImages/004995.jpg 332 500 12 200 166 309 302 14 225 140 265 250 12 106 214 235 390 14 158 168 227 330 +2503 /data/VOCdevkit/VOC2007/JPEGImages/004997.jpg 500 334 18 123 59 456 244 18 40 124 112 208 +2504 /data/VOCdevkit/VOC2007/JPEGImages/004998.jpg 500 375 7 146 22 432 180 +2505 /data/VOCdevkit/VOC2007/JPEGImages/004999.jpg 500 375 11 157 101 307 216 +2506 /data/VOCdevkit/VOC2007/JPEGImages/005001.jpg 500 333 16 146 120 309 333 16 125 67 204 252 16 309 138 496 333 16 310 50 442 165 16 1 1 160 287 16 174 12 291 141 16 126 2 193 71 16 4 199 85 333 +2507 /data/VOCdevkit/VOC2007/JPEGImages/005003.jpg 500 375 6 188 161 251 192 +2508 /data/VOCdevkit/VOC2007/JPEGImages/005004.jpg 500 333 17 137 31 454 275 +2509 /data/VOCdevkit/VOC2007/JPEGImages/005006.jpg 375 500 2 207 392 291 453 +2510 /data/VOCdevkit/VOC2007/JPEGImages/005007.jpg 500 375 19 116 10 390 266 +2511 /data/VOCdevkit/VOC2007/JPEGImages/005014.jpg 500 375 14 29 10 484 372 14 22 54 111 325 14 376 42 431 123 14 429 42 473 118 14 458 32 499 117 +2512 /data/VOCdevkit/VOC2007/JPEGImages/005016.jpg 500 333 0 10 121 196 183 0 119 53 489 190 +2513 /data/VOCdevkit/VOC2007/JPEGImages/005018.jpg 500 331 11 191 85 412 308 11 23 5 250 198 +2514 /data/VOCdevkit/VOC2007/JPEGImages/005020.jpg 500 375 6 270 181 436 234 +2515 /data/VOCdevkit/VOC2007/JPEGImages/005023.jpg 394 500 2 207 266 259 339 +2516 /data/VOCdevkit/VOC2007/JPEGImages/005024.jpg 500 375 14 1 71 176 375 14 150 2 500 375 +2517 /data/VOCdevkit/VOC2007/JPEGImages/005026.jpg 500 375 5 1 170 354 294 5 344 210 428 258 +2518 /data/VOCdevkit/VOC2007/JPEGImages/005027.jpg 500 375 14 235 54 274 125 14 215 91 283 176 19 277 74 457 243 +2519 /data/VOCdevkit/VOC2007/JPEGImages/005028.jpg 500 375 6 4 77 312 322 6 294 118 495 292 +2520 /data/VOCdevkit/VOC2007/JPEGImages/005029.jpg 500 335 1 421 107 492 156 1 378 34 439 86 1 249 99 315 152 1 178 111 246 159 14 380 13 427 70 14 437 80 487 140 14 259 79 308 142 14 188 87 240 147 +2521 /data/VOCdevkit/VOC2007/JPEGImages/005032.jpg 335 500 18 23 66 267 404 +2522 /data/VOCdevkit/VOC2007/JPEGImages/005033.jpg 500 379 2 107 122 478 348 +2523 /data/VOCdevkit/VOC2007/JPEGImages/005036.jpg 500 334 9 227 127 362 334 9 164 145 223 236 14 338 102 355 134 +2524 /data/VOCdevkit/VOC2007/JPEGImages/005037.jpg 333 500 14 65 171 169 412 +2525 /data/VOCdevkit/VOC2007/JPEGImages/005039.jpg 500 375 14 116 121 309 375 14 1 128 107 375 14 295 131 472 373 14 461 129 500 316 14 438 166 467 198 14 240 131 281 168 +2526 /data/VOCdevkit/VOC2007/JPEGImages/005042.jpg 340 500 1 158 205 302 462 1 4 182 147 428 14 155 37 328 399 14 1 46 157 394 +2527 /data/VOCdevkit/VOC2007/JPEGImages/005045.jpg 500 375 14 5 82 281 373 14 277 82 500 373 +2528 /data/VOCdevkit/VOC2007/JPEGImages/005047.jpg 500 252 6 3 1 500 244 +2529 /data/VOCdevkit/VOC2007/JPEGImages/005052.jpg 325 500 14 1 11 161 496 14 147 141 325 500 4 44 243 82 346 +2530 /data/VOCdevkit/VOC2007/JPEGImages/005054.jpg 334 500 14 78 135 258 485 14 154 84 334 479 +2531 /data/VOCdevkit/VOC2007/JPEGImages/005055.jpg 500 375 10 183 187 298 319 8 196 193 271 329 +2532 /data/VOCdevkit/VOC2007/JPEGImages/005056.jpg 288 372 11 43 45 242 213 +2533 /data/VOCdevkit/VOC2007/JPEGImages/005057.jpg 500 335 1 167 112 355 312 14 178 38 334 278 +2534 /data/VOCdevkit/VOC2007/JPEGImages/005058.jpg 500 375 16 131 266 177 304 16 86 285 127 315 +2535 /data/VOCdevkit/VOC2007/JPEGImages/005061.jpg 500 375 14 341 112 487 272 14 188 106 329 266 14 1 82 235 317 +2536 /data/VOCdevkit/VOC2007/JPEGImages/005062.jpg 500 375 11 160 141 401 266 +2537 /data/VOCdevkit/VOC2007/JPEGImages/005063.jpg 375 500 9 114 360 192 473 14 35 345 92 489 +2538 /data/VOCdevkit/VOC2007/JPEGImages/005064.jpg 500 375 1 246 163 352 292 14 251 108 332 259 +2539 /data/VOCdevkit/VOC2007/JPEGImages/005065.jpg 500 375 6 1 57 479 298 +2540 /data/VOCdevkit/VOC2007/JPEGImages/005067.jpg 500 333 6 400 233 441 273 +2541 /data/VOCdevkit/VOC2007/JPEGImages/005068.jpg 375 500 5 8 411 212 485 +2542 /data/VOCdevkit/VOC2007/JPEGImages/005071.jpg 500 375 6 10 156 55 180 6 293 163 327 186 6 327 181 379 206 6 422 174 459 198 6 444 201 493 237 6 103 199 198 230 6 65 164 121 187 +2543 /data/VOCdevkit/VOC2007/JPEGImages/005072.jpg 500 333 6 4 78 456 299 +2544 /data/VOCdevkit/VOC2007/JPEGImages/005073.jpg 500 375 3 410 85 500 151 +2545 /data/VOCdevkit/VOC2007/JPEGImages/005077.jpg 500 375 18 3 170 321 260 +2546 /data/VOCdevkit/VOC2007/JPEGImages/005078.jpg 500 375 7 75 13 500 375 +2547 /data/VOCdevkit/VOC2007/JPEGImages/005079.jpg 500 375 0 22 110 454 305 +2548 /data/VOCdevkit/VOC2007/JPEGImages/005081.jpg 500 281 12 227 137 440 266 11 171 115 195 150 14 114 65 210 222 14 440 30 469 104 14 414 29 430 97 14 335 32 359 104 14 266 53 294 124 14 259 35 279 116 14 238 61 253 99 14 208 61 231 119 +2549 /data/VOCdevkit/VOC2007/JPEGImages/005084.jpg 500 375 2 242 179 329 333 2 82 23 185 233 +2550 /data/VOCdevkit/VOC2007/JPEGImages/005085.jpg 355 500 10 118 334 293 482 8 220 348 348 500 +2551 /data/VOCdevkit/VOC2007/JPEGImages/005086.jpg 500 375 8 158 184 257 262 14 39 145 144 375 14 269 42 498 372 +2552 /data/VOCdevkit/VOC2007/JPEGImages/005090.jpg 500 352 5 28 119 466 265 14 461 164 498 256 14 409 174 445 259 14 167 157 209 293 +2553 /data/VOCdevkit/VOC2007/JPEGImages/005093.jpg 333 500 13 106 163 333 397 14 202 61 333 330 14 95 215 128 253 +2554 /data/VOCdevkit/VOC2007/JPEGImages/005094.jpg 500 375 18 1 135 281 226 12 298 167 448 268 12 293 188 370 270 +2555 /data/VOCdevkit/VOC2007/JPEGImages/005097.jpg 500 375 11 114 36 459 353 14 194 1 460 245 14 8 1 223 261 +2556 /data/VOCdevkit/VOC2007/JPEGImages/005101.jpg 375 500 8 1 2 374 500 7 162 224 349 368 +2557 /data/VOCdevkit/VOC2007/JPEGImages/005102.jpg 500 375 14 1 199 54 271 6 1 167 50 219 6 104 170 166 216 6 200 173 319 222 6 270 181 406 241 6 303 185 500 274 +2558 /data/VOCdevkit/VOC2007/JPEGImages/005104.jpg 500 333 19 1 63 69 208 17 305 84 500 333 7 355 199 450 297 +2559 /data/VOCdevkit/VOC2007/JPEGImages/005107.jpg 500 375 1 54 195 273 337 14 271 138 288 192 +2560 /data/VOCdevkit/VOC2007/JPEGImages/005108.jpg 500 281 0 171 113 231 173 3 110 226 162 248 +2561 /data/VOCdevkit/VOC2007/JPEGImages/005110.jpg 500 375 6 83 33 384 152 6 405 96 461 142 6 2 158 133 287 6 126 176 189 232 6 180 186 206 217 +2562 /data/VOCdevkit/VOC2007/JPEGImages/005111.jpg 367 500 14 3 1 365 500 +2563 /data/VOCdevkit/VOC2007/JPEGImages/005114.jpg 500 322 14 311 54 404 189 12 325 103 388 242 9 451 132 500 219 9 56 136 132 257 +2564 /data/VOCdevkit/VOC2007/JPEGImages/005116.jpg 500 331 13 410 125 500 245 13 282 119 395 236 13 141 128 315 254 14 302 97 401 240 14 165 103 332 272 14 416 107 500 246 14 380 67 409 161 13 205 85 256 152 14 302 75 348 112 14 15 43 37 81 +2565 /data/VOCdevkit/VOC2007/JPEGImages/005121.jpg 500 333 11 30 91 205 333 11 344 66 500 333 +2566 /data/VOCdevkit/VOC2007/JPEGImages/005122.jpg 333 500 1 19 189 309 373 14 3 57 54 204 14 61 73 285 349 +2567 /data/VOCdevkit/VOC2007/JPEGImages/005124.jpg 500 324 9 179 68 500 324 14 3 33 271 324 +2568 /data/VOCdevkit/VOC2007/JPEGImages/005128.jpg 500 375 3 122 138 401 206 +2569 /data/VOCdevkit/VOC2007/JPEGImages/005129.jpg 500 375 8 2 163 419 375 14 124 126 380 375 8 266 9 337 131 8 213 25 273 113 8 189 1 223 100 +2570 /data/VOCdevkit/VOC2007/JPEGImages/005130.jpg 500 500 2 115 131 324 433 +2571 /data/VOCdevkit/VOC2007/JPEGImages/005131.jpg 500 375 7 76 1 373 375 +2572 /data/VOCdevkit/VOC2007/JPEGImages/005134.jpg 500 375 14 31 139 48 212 14 42 131 72 236 14 109 138 130 220 14 130 130 163 248 14 182 146 203 210 14 200 135 233 231 14 265 150 287 217 14 321 140 359 276 14 369 145 399 248 14 408 148 444 230 14 295 162 312 202 14 477 147 496 177 14 236 173 252 206 +2573 /data/VOCdevkit/VOC2007/JPEGImages/005135.jpg 500 332 8 3 146 58 302 +2574 /data/VOCdevkit/VOC2007/JPEGImages/005136.jpg 500 375 18 22 82 483 297 +2575 /data/VOCdevkit/VOC2007/JPEGImages/005138.jpg 500 445 2 23 86 434 436 +2576 /data/VOCdevkit/VOC2007/JPEGImages/005143.jpg 274 289 15 6 10 258 278 +2577 /data/VOCdevkit/VOC2007/JPEGImages/005144.jpg 332 500 14 1 12 331 500 +2578 /data/VOCdevkit/VOC2007/JPEGImages/005145.jpg 333 500 15 2 359 241 500 +2579 /data/VOCdevkit/VOC2007/JPEGImages/005146.jpg 500 303 1 394 102 492 279 1 306 134 390 282 1 13 143 91 274 1 125 127 197 277 1 181 138 280 280 14 12 53 93 271 14 129 79 219 270 14 213 49 299 274 14 284 36 356 276 14 394 28 484 267 +2580 /data/VOCdevkit/VOC2007/JPEGImages/005150.jpg 500 400 1 320 212 440 294 3 158 214 229 231 3 291 215 352 228 +2581 /data/VOCdevkit/VOC2007/JPEGImages/005153.jpg 500 375 8 44 147 94 217 8 104 216 288 375 8 94 177 234 358 19 157 115 200 164 19 182 109 235 178 19 210 95 340 204 19 309 67 500 267 +2582 /data/VOCdevkit/VOC2007/JPEGImages/005156.jpg 500 375 13 57 131 412 360 14 171 50 337 346 6 8 111 166 239 +2583 /data/VOCdevkit/VOC2007/JPEGImages/005159.jpg 500 375 6 303 227 453 280 6 19 212 65 241 +2584 /data/VOCdevkit/VOC2007/JPEGImages/005160.jpg 500 375 8 1 170 171 373 8 249 196 391 375 8 334 171 420 373 10 32 170 395 373 19 1 68 94 174 14 298 62 357 188 15 3 1 62 68 15 215 160 290 232 4 118 207 141 285 +2585 /data/VOCdevkit/VOC2007/JPEGImages/005161.jpg 500 375 14 329 107 376 232 14 117 122 158 221 14 54 127 91 215 14 1 124 26 208 14 178 117 215 218 14 274 183 290 231 12 289 146 451 301 12 85 156 204 277 12 177 158 267 275 +2586 /data/VOCdevkit/VOC2007/JPEGImages/005168.jpg 500 333 18 36 116 445 229 +2587 /data/VOCdevkit/VOC2007/JPEGImages/005169.jpg 375 500 7 161 191 200 252 6 342 53 375 88 6 220 58 264 92 +2588 /data/VOCdevkit/VOC2007/JPEGImages/005171.jpg 500 313 3 189 227 276 269 +2589 /data/VOCdevkit/VOC2007/JPEGImages/005173.jpg 500 289 13 13 67 227 255 13 285 64 492 264 14 230 45 458 256 14 17 32 192 247 14 406 7 460 144 14 131 23 195 128 14 261 13 312 67 14 282 1 344 69 14 87 18 138 66 14 1 3 36 105 +2590 /data/VOCdevkit/VOC2007/JPEGImages/005175.jpg 500 375 0 25 198 207 267 0 195 196 337 256 0 330 206 429 247 +2591 /data/VOCdevkit/VOC2007/JPEGImages/005176.jpg 500 375 14 161 165 234 255 14 1 46 274 375 14 270 92 500 375 +2592 /data/VOCdevkit/VOC2007/JPEGImages/005177.jpg 377 500 17 7 179 377 363 +2593 /data/VOCdevkit/VOC2007/JPEGImages/005179.jpg 360 270 17 4 22 357 270 +2594 /data/VOCdevkit/VOC2007/JPEGImages/005181.jpg 500 375 3 144 223 194 311 +2595 /data/VOCdevkit/VOC2007/JPEGImages/005183.jpg 375 500 7 25 307 235 448 7 213 300 361 417 15 1 10 375 500 +2596 /data/VOCdevkit/VOC2007/JPEGImages/005185.jpg 500 375 17 3 73 500 343 11 238 117 358 207 11 141 139 270 229 +2597 /data/VOCdevkit/VOC2007/JPEGImages/005186.jpg 500 375 8 139 173 210 293 8 408 181 467 269 15 32 165 129 301 +2598 /data/VOCdevkit/VOC2007/JPEGImages/005189.jpg 500 405 14 139 45 500 404 14 2 1 305 404 +2599 /data/VOCdevkit/VOC2007/JPEGImages/005190.jpg 500 375 14 128 25 447 375 15 1 133 126 307 +2600 /data/VOCdevkit/VOC2007/JPEGImages/005191.jpg 500 375 10 62 128 500 285 10 33 206 445 375 8 24 143 85 223 8 160 142 210 208 8 207 126 245 223 8 237 127 268 230 8 254 131 292 242 8 282 142 358 278 8 347 153 426 330 8 414 171 500 374 +2601 /data/VOCdevkit/VOC2007/JPEGImages/005195.jpg 500 333 4 65 235 93 305 14 369 112 493 303 14 227 99 332 209 14 1 105 130 252 10 12 199 416 333 +2602 /data/VOCdevkit/VOC2007/JPEGImages/005199.jpg 500 375 6 22 215 481 344 +2603 /data/VOCdevkit/VOC2007/JPEGImages/005202.jpg 500 375 2 65 91 356 255 +2604 /data/VOCdevkit/VOC2007/JPEGImages/005203.jpg 500 375 11 118 103 332 351 17 3 2 499 375 +2605 /data/VOCdevkit/VOC2007/JPEGImages/005208.jpg 500 333 14 111 156 231 333 +2606 /data/VOCdevkit/VOC2007/JPEGImages/005209.jpg 500 333 6 82 75 416 299 +2607 /data/VOCdevkit/VOC2007/JPEGImages/005210.jpg 500 281 19 74 55 205 188 +2608 /data/VOCdevkit/VOC2007/JPEGImages/005212.jpg 500 333 13 355 203 432 267 8 432 213 466 291 +2609 /data/VOCdevkit/VOC2007/JPEGImages/005214.jpg 500 381 18 1 14 500 381 +2610 /data/VOCdevkit/VOC2007/JPEGImages/005215.jpg 500 375 13 62 2 500 375 +2611 /data/VOCdevkit/VOC2007/JPEGImages/005217.jpg 500 335 3 1 214 338 334 +2612 /data/VOCdevkit/VOC2007/JPEGImages/005219.jpg 500 333 14 97 60 160 255 14 276 111 308 215 14 290 140 363 245 14 346 108 373 181 14 363 111 403 202 14 322 116 346 155 +2613 /data/VOCdevkit/VOC2007/JPEGImages/005220.jpg 500 375 14 208 54 465 295 14 1 45 211 375 +2614 /data/VOCdevkit/VOC2007/JPEGImages/005222.jpg 500 333 7 2 27 100 231 14 242 28 500 309 +2615 /data/VOCdevkit/VOC2007/JPEGImages/005223.jpg 500 375 16 79 62 500 375 +2616 /data/VOCdevkit/VOC2007/JPEGImages/005224.jpg 500 375 15 1 86 52 307 15 36 90 480 304 +2617 /data/VOCdevkit/VOC2007/JPEGImages/005229.jpg 500 375 14 1 1 500 375 +2618 /data/VOCdevkit/VOC2007/JPEGImages/005230.jpg 500 374 14 113 111 201 259 14 289 127 367 250 14 1 168 35 217 14 21 172 41 218 14 39 176 72 225 1 115 175 214 285 1 288 186 373 284 +2619 /data/VOCdevkit/VOC2007/JPEGImages/005231.jpg 500 375 11 215 109 386 272 14 42 22 315 370 14 337 2 500 372 17 1 40 498 374 +2620 /data/VOCdevkit/VOC2007/JPEGImages/005236.jpg 500 375 14 80 75 266 375 12 174 145 307 375 14 297 57 433 375 14 366 89 465 333 +2621 /data/VOCdevkit/VOC2007/JPEGImages/005239.jpg 375 500 14 181 181 342 500 +2622 /data/VOCdevkit/VOC2007/JPEGImages/005242.jpg 500 333 4 396 209 443 333 14 112 40 302 266 14 326 34 500 255 +2623 /data/VOCdevkit/VOC2007/JPEGImages/005244.jpg 500 375 18 2 10 436 342 +2624 /data/VOCdevkit/VOC2007/JPEGImages/005245.jpg 500 375 14 285 57 489 246 14 1 25 198 241 +2625 /data/VOCdevkit/VOC2007/JPEGImages/005246.jpg 500 387 2 84 48 493 387 +2626 /data/VOCdevkit/VOC2007/JPEGImages/005248.jpg 500 375 14 440 181 459 234 12 1 163 129 374 +2627 /data/VOCdevkit/VOC2007/JPEGImages/005253.jpg 500 333 2 133 47 431 333 +2628 /data/VOCdevkit/VOC2007/JPEGImages/005254.jpg 500 375 11 139 142 307 304 +2629 /data/VOCdevkit/VOC2007/JPEGImages/005257.jpg 500 333 14 251 112 315 210 3 176 188 319 234 +2630 /data/VOCdevkit/VOC2007/JPEGImages/005258.jpg 500 375 13 1 1 500 315 +2631 /data/VOCdevkit/VOC2007/JPEGImages/005259.jpg 500 333 6 19 69 433 302 +2632 /data/VOCdevkit/VOC2007/JPEGImages/005260.jpg 500 235 14 223 57 331 189 14 35 55 171 191 13 171 91 325 194 13 16 88 167 207 +2633 /data/VOCdevkit/VOC2007/JPEGImages/005262.jpg 500 375 6 372 205 500 298 6 14 159 53 185 5 80 114 342 241 +2634 /data/VOCdevkit/VOC2007/JPEGImages/005263.jpg 500 375 17 3 4 499 373 +2635 /data/VOCdevkit/VOC2007/JPEGImages/005264.jpg 499 500 2 207 93 457 500 2 19 47 293 500 +2636 /data/VOCdevkit/VOC2007/JPEGImages/005267.jpg 500 335 18 68 51 404 310 +2637 /data/VOCdevkit/VOC2007/JPEGImages/005268.jpg 500 375 1 286 81 497 237 1 117 170 205 237 14 250 14 416 201 14 90 130 197 219 +2638 /data/VOCdevkit/VOC2007/JPEGImages/005269.jpg 500 395 18 76 113 402 302 14 372 206 403 287 +2639 /data/VOCdevkit/VOC2007/JPEGImages/005270.jpg 500 375 7 49 113 500 360 +2640 /data/VOCdevkit/VOC2007/JPEGImages/005273.jpg 500 375 6 108 55 285 156 6 235 84 418 153 14 336 12 415 160 14 397 50 439 154 1 1 112 305 357 +2641 /data/VOCdevkit/VOC2007/JPEGImages/005274.jpg 500 375 11 282 103 435 358 11 170 229 277 341 14 102 62 422 344 +2642 /data/VOCdevkit/VOC2007/JPEGImages/005278.jpg 480 318 12 104 65 319 318 12 3 132 101 243 14 204 45 266 218 14 151 72 199 142 14 42 94 78 191 14 263 90 283 131 +2643 /data/VOCdevkit/VOC2007/JPEGImages/005281.jpg 330 500 1 121 244 177 336 14 132 181 190 322 14 59 199 89 318 14 17 179 68 352 14 97 228 110 253 +2644 /data/VOCdevkit/VOC2007/JPEGImages/005283.jpg 500 375 14 303 87 474 375 14 1 99 146 375 14 150 20 345 375 +2645 /data/VOCdevkit/VOC2007/JPEGImages/005285.jpg 500 375 2 90 118 372 342 +2646 /data/VOCdevkit/VOC2007/JPEGImages/005288.jpg 500 375 16 217 259 249 290 +2647 /data/VOCdevkit/VOC2007/JPEGImages/005290.jpg 500 333 0 227 121 287 181 +2648 /data/VOCdevkit/VOC2007/JPEGImages/005292.jpg 500 376 17 304 218 500 376 +2649 /data/VOCdevkit/VOC2007/JPEGImages/005293.jpg 375 500 11 99 80 184 195 +2650 /data/VOCdevkit/VOC2007/JPEGImages/005297.jpg 500 333 14 89 2 454 333 14 104 71 249 333 14 37 132 106 270 +2651 /data/VOCdevkit/VOC2007/JPEGImages/005298.jpg 500 333 14 16 100 166 333 14 246 43 371 333 +2652 /data/VOCdevkit/VOC2007/JPEGImages/005303.jpg 378 500 11 72 196 378 470 14 10 40 378 500 +2653 /data/VOCdevkit/VOC2007/JPEGImages/005304.jpg 500 400 4 264 75 391 282 14 1 2 472 400 +2654 /data/VOCdevkit/VOC2007/JPEGImages/005305.jpg 375 500 6 74 358 266 462 +2655 /data/VOCdevkit/VOC2007/JPEGImages/005306.jpg 500 375 14 180 96 260 259 14 58 117 206 375 14 112 227 199 375 14 288 111 395 375 12 167 209 337 375 +2656 /data/VOCdevkit/VOC2007/JPEGImages/005307.jpg 500 375 7 256 170 356 259 14 3 55 378 341 +2657 /data/VOCdevkit/VOC2007/JPEGImages/005310.jpg 500 333 14 29 170 414 333 14 100 33 259 301 +2658 /data/VOCdevkit/VOC2007/JPEGImages/005311.jpg 500 332 14 218 66 250 110 14 239 51 305 112 14 1 1 194 205 14 261 7 429 212 +2659 /data/VOCdevkit/VOC2007/JPEGImages/005312.jpg 500 370 7 111 53 364 366 +2660 /data/VOCdevkit/VOC2007/JPEGImages/005314.jpg 500 375 13 6 11 499 358 +2661 /data/VOCdevkit/VOC2007/JPEGImages/005315.jpg 500 375 1 222 174 286 276 14 226 116 287 248 +2662 /data/VOCdevkit/VOC2007/JPEGImages/005318.jpg 500 375 6 109 37 421 291 +2663 /data/VOCdevkit/VOC2007/JPEGImages/005319.jpg 428 500 16 1 11 411 493 +2664 /data/VOCdevkit/VOC2007/JPEGImages/005320.jpg 500 375 3 374 144 480 188 +2665 /data/VOCdevkit/VOC2007/JPEGImages/005325.jpg 500 375 3 277 250 326 309 +2666 /data/VOCdevkit/VOC2007/JPEGImages/005326.jpg 500 376 14 197 197 237 269 14 341 176 361 235 9 60 223 181 283 9 34 225 143 277 +2667 /data/VOCdevkit/VOC2007/JPEGImages/005327.jpg 500 375 17 2 159 500 374 14 33 202 319 262 11 288 210 401 257 +2668 /data/VOCdevkit/VOC2007/JPEGImages/005328.jpg 500 375 2 150 163 210 232 +2669 /data/VOCdevkit/VOC2007/JPEGImages/005331.jpg 318 480 12 71 142 291 448 14 101 84 245 304 6 84 87 161 140 6 1 91 40 140 +2670 /data/VOCdevkit/VOC2007/JPEGImages/005336.jpg 429 500 17 36 273 399 447 14 117 302 367 383 +2671 /data/VOCdevkit/VOC2007/JPEGImages/005337.jpg 500 223 3 284 99 357 130 +2672 /data/VOCdevkit/VOC2007/JPEGImages/005338.jpg 500 375 2 65 32 178 178 2 234 46 397 361 +2673 /data/VOCdevkit/VOC2007/JPEGImages/005340.jpg 470 294 3 219 18 360 238 +2674 /data/VOCdevkit/VOC2007/JPEGImages/005343.jpg 500 375 14 110 142 387 375 14 122 142 429 374 +2675 /data/VOCdevkit/VOC2007/JPEGImages/005344.jpg 334 500 1 93 240 237 500 14 39 40 284 452 14 197 29 329 408 +2676 /data/VOCdevkit/VOC2007/JPEGImages/005345.jpg 375 500 4 161 158 180 224 10 2 198 375 500 +2677 /data/VOCdevkit/VOC2007/JPEGImages/005346.jpg 500 330 15 421 43 500 237 14 95 77 394 330 +2678 /data/VOCdevkit/VOC2007/JPEGImages/005348.jpg 333 500 14 181 146 330 499 14 1 24 215 499 +2679 /data/VOCdevkit/VOC2007/JPEGImages/005349.jpg 500 375 19 400 96 500 223 19 1 135 104 273 8 101 234 432 375 +2680 /data/VOCdevkit/VOC2007/JPEGImages/005350.jpg 500 333 6 85 140 400 249 +2681 /data/VOCdevkit/VOC2007/JPEGImages/005351.jpg 500 375 12 266 192 438 375 12 192 163 263 298 14 294 153 351 280 +2682 /data/VOCdevkit/VOC2007/JPEGImages/005352.jpg 500 335 11 137 97 237 291 +2683 /data/VOCdevkit/VOC2007/JPEGImages/005355.jpg 500 375 18 7 116 426 298 +2684 /data/VOCdevkit/VOC2007/JPEGImages/005358.jpg 500 375 0 231 131 278 155 +2685 /data/VOCdevkit/VOC2007/JPEGImages/005360.jpg 500 335 18 72 97 431 242 18 1 137 71 226 +2686 /data/VOCdevkit/VOC2007/JPEGImages/005363.jpg 375 500 16 2 69 368 499 +2687 /data/VOCdevkit/VOC2007/JPEGImages/005365.jpg 500 376 11 54 2 429 345 +2688 /data/VOCdevkit/VOC2007/JPEGImages/005367.jpg 500 333 4 112 51 217 313 +2689 /data/VOCdevkit/VOC2007/JPEGImages/005368.jpg 334 500 1 27 346 254 500 14 9 18 323 500 +2690 /data/VOCdevkit/VOC2007/JPEGImages/005369.jpg 500 375 3 310 220 387 255 +2691 /data/VOCdevkit/VOC2007/JPEGImages/005370.jpg 500 333 3 260 156 351 178 +2692 /data/VOCdevkit/VOC2007/JPEGImages/005371.jpg 500 333 2 22 206 214 333 14 89 14 499 332 +2693 /data/VOCdevkit/VOC2007/JPEGImages/005373.jpg 500 333 6 245 150 300 188 6 329 149 372 178 +2694 /data/VOCdevkit/VOC2007/JPEGImages/005374.jpg 500 374 14 290 147 361 325 14 211 136 255 262 14 215 153 258 262 5 187 2 500 347 +2695 /data/VOCdevkit/VOC2007/JPEGImages/005378.jpg 500 374 8 3 186 87 289 +2696 /data/VOCdevkit/VOC2007/JPEGImages/005379.jpg 500 334 11 34 92 346 232 +2697 /data/VOCdevkit/VOC2007/JPEGImages/005380.jpg 375 500 8 25 28 340 500 7 160 182 330 484 +2698 /data/VOCdevkit/VOC2007/JPEGImages/005383.jpg 500 326 14 80 2 399 319 +2699 /data/VOCdevkit/VOC2007/JPEGImages/005384.jpg 500 375 18 12 2 500 375 14 313 133 456 375 +2700 /data/VOCdevkit/VOC2007/JPEGImages/005385.jpg 500 336 4 46 208 101 334 14 153 5 500 336 14 74 33 321 283 +2701 /data/VOCdevkit/VOC2007/JPEGImages/005387.jpg 500 375 5 45 172 415 305 6 2 254 45 269 +2702 /data/VOCdevkit/VOC2007/JPEGImages/005388.jpg 375 500 4 82 67 121 196 4 147 106 183 199 +2703 /data/VOCdevkit/VOC2007/JPEGImages/005389.jpg 432 244 18 25 42 410 208 +2704 /data/VOCdevkit/VOC2007/JPEGImages/005391.jpg 500 375 0 25 109 463 226 +2705 /data/VOCdevkit/VOC2007/JPEGImages/005393.jpg 500 333 0 53 46 432 175 +2706 /data/VOCdevkit/VOC2007/JPEGImages/005395.jpg 500 375 16 253 209 292 238 16 287 209 312 241 16 345 202 382 229 16 406 224 457 267 16 172 195 207 220 16 147 195 179 215 +2707 /data/VOCdevkit/VOC2007/JPEGImages/005396.jpg 500 475 19 8 132 226 344 14 37 156 201 291 14 269 122 486 475 +2708 /data/VOCdevkit/VOC2007/JPEGImages/005397.jpg 500 375 17 315 172 500 375 8 165 163 251 295 8 249 174 330 290 +2709 /data/VOCdevkit/VOC2007/JPEGImages/005398.jpg 500 375 13 68 117 247 284 14 108 100 186 253 14 139 96 231 267 +2710 /data/VOCdevkit/VOC2007/JPEGImages/005404.jpg 500 375 9 132 88 500 375 +2711 /data/VOCdevkit/VOC2007/JPEGImages/005405.jpg 375 500 14 71 151 276 401 +2712 /data/VOCdevkit/VOC2007/JPEGImages/005406.jpg 500 333 0 172 126 235 187 +2713 /data/VOCdevkit/VOC2007/JPEGImages/005407.jpg 332 500 18 157 234 182 266 +2714 /data/VOCdevkit/VOC2007/JPEGImages/005408.jpg 400 300 11 87 113 335 269 +2715 /data/VOCdevkit/VOC2007/JPEGImages/005410.jpg 500 333 14 263 148 364 333 1 282 239 353 333 +2716 /data/VOCdevkit/VOC2007/JPEGImages/005413.jpg 375 500 14 60 101 228 499 +2717 /data/VOCdevkit/VOC2007/JPEGImages/005414.jpg 500 333 13 59 105 217 333 13 265 121 443 333 14 196 40 290 330 14 283 55 433 330 13 432 95 487 150 +2718 /data/VOCdevkit/VOC2007/JPEGImages/005416.jpg 500 439 11 1 25 469 439 +2719 /data/VOCdevkit/VOC2007/JPEGImages/005417.jpg 500 375 14 1 1 384 373 +2720 /data/VOCdevkit/VOC2007/JPEGImages/005418.jpg 500 375 9 216 97 432 312 +2721 /data/VOCdevkit/VOC2007/JPEGImages/005419.jpg 310 480 12 100 111 237 419 14 85 74 240 262 +2722 /data/VOCdevkit/VOC2007/JPEGImages/005420.jpg 445 500 3 32 22 395 464 +2723 /data/VOCdevkit/VOC2007/JPEGImages/005421.jpg 500 375 14 65 18 366 375 +2724 /data/VOCdevkit/VOC2007/JPEGImages/005423.jpg 375 500 6 3 140 131 192 6 206 139 297 181 6 61 139 319 325 +2725 /data/VOCdevkit/VOC2007/JPEGImages/005424.jpg 326 500 1 39 80 153 210 1 24 253 150 429 14 70 14 181 185 14 21 137 209 365 +2726 /data/VOCdevkit/VOC2007/JPEGImages/005429.jpg 500 333 1 206 139 287 216 14 226 97 269 195 14 242 57 304 207 +2727 /data/VOCdevkit/VOC2007/JPEGImages/005430.jpg 500 375 1 110 127 295 266 14 213 30 356 284 +2728 /data/VOCdevkit/VOC2007/JPEGImages/005431.jpg 500 375 3 150 220 191 255 +2729 /data/VOCdevkit/VOC2007/JPEGImages/005433.jpg 500 375 11 139 156 332 280 17 1 1 500 375 +2730 /data/VOCdevkit/VOC2007/JPEGImages/005434.jpg 212 320 7 72 98 192 307 8 1 2 129 320 +2731 /data/VOCdevkit/VOC2007/JPEGImages/005436.jpg 500 375 13 349 124 466 182 13 37 141 172 210 +2732 /data/VOCdevkit/VOC2007/JPEGImages/005438.jpg 500 342 8 35 175 157 315 +2733 /data/VOCdevkit/VOC2007/JPEGImages/005439.jpg 500 375 8 171 44 328 237 8 1 199 137 375 14 212 85 284 137 +2734 /data/VOCdevkit/VOC2007/JPEGImages/005440.jpg 500 335 18 1 176 444 243 +2735 /data/VOCdevkit/VOC2007/JPEGImages/005441.jpg 500 375 4 302 291 373 358 14 3 63 77 375 14 61 90 99 189 14 54 112 178 372 14 165 72 254 374 14 260 62 355 375 14 383 62 450 117 14 305 93 472 375 +2736 /data/VOCdevkit/VOC2007/JPEGImages/005445.jpg 375 500 7 32 233 353 497 +2737 /data/VOCdevkit/VOC2007/JPEGImages/005448.jpg 500 331 14 405 113 461 206 14 291 114 355 218 14 218 122 272 201 14 154 117 207 182 14 101 115 146 193 14 37 109 91 187 13 396 150 467 219 13 284 147 353 219 13 218 150 279 216 13 153 152 213 212 13 96 144 160 208 13 34 138 100 205 +2738 /data/VOCdevkit/VOC2007/JPEGImages/005450.jpg 357 500 14 7 123 342 500 +2739 /data/VOCdevkit/VOC2007/JPEGImages/005451.jpg 375 500 14 238 103 375 500 14 156 357 237 466 14 78 362 137 479 10 80 396 220 495 +2740 /data/VOCdevkit/VOC2007/JPEGImages/005453.jpg 500 333 11 1 235 197 330 12 203 3 500 333 +2741 /data/VOCdevkit/VOC2007/JPEGImages/005454.jpg 500 375 19 89 82 227 271 8 363 174 500 375 +2742 /data/VOCdevkit/VOC2007/JPEGImages/005455.jpg 383 293 7 89 34 333 250 +2743 /data/VOCdevkit/VOC2007/JPEGImages/005457.jpg 500 346 6 64 123 387 274 +2744 /data/VOCdevkit/VOC2007/JPEGImages/005461.jpg 500 375 12 146 170 450 319 12 47 184 225 266 14 227 122 288 298 14 163 170 183 189 14 71 142 129 371 14 5 165 39 217 +2745 /data/VOCdevkit/VOC2007/JPEGImages/005465.jpg 500 375 0 139 96 500 341 8 441 232 500 304 +2746 /data/VOCdevkit/VOC2007/JPEGImages/005467.jpg 500 375 4 345 107 408 303 14 402 64 498 241 14 347 71 427 184 14 38 21 220 375 10 111 192 500 375 +2747 /data/VOCdevkit/VOC2007/JPEGImages/005469.jpg 500 333 16 43 101 500 333 +2748 /data/VOCdevkit/VOC2007/JPEGImages/005470.jpg 375 500 7 3 3 375 500 +2749 /data/VOCdevkit/VOC2007/JPEGImages/005471.jpg 500 333 8 303 28 455 174 14 19 28 274 332 14 274 26 497 308 4 162 238 190 305 +2750 /data/VOCdevkit/VOC2007/JPEGImages/005475.jpg 500 333 14 286 28 489 333 +2751 /data/VOCdevkit/VOC2007/JPEGImages/005478.jpg 376 500 14 1 160 98 411 14 1 166 229 499 +2752 /data/VOCdevkit/VOC2007/JPEGImages/005481.jpg 500 375 18 1 54 466 277 +2753 /data/VOCdevkit/VOC2007/JPEGImages/005483.jpg 450 285 6 63 72 376 230 6 1 150 89 257 +2754 /data/VOCdevkit/VOC2007/JPEGImages/005485.jpg 500 375 2 451 149 476 172 2 203 175 242 205 2 156 196 192 220 2 33 183 55 210 2 118 184 148 205 2 133 160 166 177 14 161 216 202 325 14 213 235 261 322 14 237 220 263 258 14 248 241 298 322 14 245 252 273 287 +2755 /data/VOCdevkit/VOC2007/JPEGImages/005486.jpg 500 375 6 41 71 454 322 6 252 69 500 195 +2756 /data/VOCdevkit/VOC2007/JPEGImages/005487.jpg 500 333 0 68 113 477 259 14 199 223 223 268 14 79 231 103 283 +2757 /data/VOCdevkit/VOC2007/JPEGImages/005489.jpg 500 333 6 252 166 329 203 6 409 71 464 94 +2758 /data/VOCdevkit/VOC2007/JPEGImages/005496.jpg 500 346 3 164 107 454 299 14 415 202 437 233 +2759 /data/VOCdevkit/VOC2007/JPEGImages/005497.jpg 334 500 11 2 167 334 500 +2760 /data/VOCdevkit/VOC2007/JPEGImages/005499.jpg 500 333 6 2 48 500 333 14 277 5 414 180 +2761 /data/VOCdevkit/VOC2007/JPEGImages/005507.jpg 500 375 1 143 194 175 216 14 243 171 261 217 +2762 /data/VOCdevkit/VOC2007/JPEGImages/005508.jpg 375 500 14 89 131 275 500 +2763 /data/VOCdevkit/VOC2007/JPEGImages/005509.jpg 500 335 0 11 65 463 200 14 484 153 497 192 14 429 153 444 200 14 408 150 426 204 14 309 155 328 198 14 295 155 309 202 +2764 /data/VOCdevkit/VOC2007/JPEGImages/005510.jpg 500 328 17 3 25 498 328 +2765 /data/VOCdevkit/VOC2007/JPEGImages/005511.jpg 318 480 12 107 133 198 424 14 88 112 226 298 +2766 /data/VOCdevkit/VOC2007/JPEGImages/005514.jpg 500 375 9 1 53 364 297 +2767 /data/VOCdevkit/VOC2007/JPEGImages/005515.jpg 375 500 15 1 177 332 500 15 1 1 121 366 15 45 1 371 269 +2768 /data/VOCdevkit/VOC2007/JPEGImages/005517.jpg 500 333 8 350 120 500 333 15 10 10 89 239 19 67 45 153 125 19 239 44 330 132 19 337 40 432 123 +2769 /data/VOCdevkit/VOC2007/JPEGImages/005518.jpg 500 375 11 125 83 295 344 +2770 /data/VOCdevkit/VOC2007/JPEGImages/005519.jpg 500 489 7 86 149 174 358 7 223 76 389 289 +2771 /data/VOCdevkit/VOC2007/JPEGImages/005521.jpg 500 375 10 69 146 458 374 +2772 /data/VOCdevkit/VOC2007/JPEGImages/005522.jpg 500 375 14 429 96 447 130 14 454 93 470 131 14 272 91 306 183 14 116 92 146 216 14 86 108 111 160 14 59 104 82 160 14 1 115 94 312 +2773 /data/VOCdevkit/VOC2007/JPEGImages/005524.jpg 334 500 11 22 48 334 297 +2774 /data/VOCdevkit/VOC2007/JPEGImages/005526.jpg 500 375 19 412 275 500 375 14 1 4 268 375 14 219 116 457 375 +2775 /data/VOCdevkit/VOC2007/JPEGImages/005527.jpg 375 500 14 24 42 363 500 +2776 /data/VOCdevkit/VOC2007/JPEGImages/005530.jpg 500 318 5 4 164 164 303 5 99 169 281 303 5 214 173 355 283 5 286 175 433 285 +2777 /data/VOCdevkit/VOC2007/JPEGImages/005531.jpg 375 500 8 169 210 257 359 8 192 179 262 326 8 248 216 356 360 15 163 51 218 186 10 106 195 375 348 +2778 /data/VOCdevkit/VOC2007/JPEGImages/005535.jpg 500 375 11 82 1 433 308 +2779 /data/VOCdevkit/VOC2007/JPEGImages/005536.jpg 500 343 6 43 116 426 321 14 267 113 380 321 +2780 /data/VOCdevkit/VOC2007/JPEGImages/005539.jpg 500 351 7 164 36 458 351 +2781 /data/VOCdevkit/VOC2007/JPEGImages/005541.jpg 500 375 4 167 197 187 252 14 1 1 49 298 14 130 50 391 337 +2782 /data/VOCdevkit/VOC2007/JPEGImages/005542.jpg 500 375 14 153 122 277 375 14 284 141 321 234 14 432 192 480 302 14 472 144 500 309 14 256 140 287 228 14 374 155 388 187 14 354 149 367 187 +2783 /data/VOCdevkit/VOC2007/JPEGImages/005544.jpg 500 500 18 79 188 288 310 +2784 /data/VOCdevkit/VOC2007/JPEGImages/005547.jpg 500 375 9 171 175 320 368 6 48 150 447 347 14 439 148 471 269 +2785 /data/VOCdevkit/VOC2007/JPEGImages/005549.jpg 500 375 6 136 202 196 239 +2786 /data/VOCdevkit/VOC2007/JPEGImages/005550.jpg 480 360 12 222 189 268 256 14 237 176 291 269 +2787 /data/VOCdevkit/VOC2007/JPEGImages/005552.jpg 332 500 14 239 202 279 338 14 190 203 264 356 13 164 237 267 407 +2788 /data/VOCdevkit/VOC2007/JPEGImages/005554.jpg 500 333 1 316 157 427 284 1 207 171 341 324 1 24 163 210 330 14 61 72 235 302 14 225 91 355 277 14 343 86 445 283 14 398 6 428 42 +2789 /data/VOCdevkit/VOC2007/JPEGImages/005559.jpg 500 375 7 105 12 500 375 +2790 /data/VOCdevkit/VOC2007/JPEGImages/005563.jpg 500 375 19 419 1 500 77 14 207 39 374 330 14 104 84 369 374 4 356 81 373 127 +2791 /data/VOCdevkit/VOC2007/JPEGImages/005566.jpg 500 375 6 80 39 422 293 6 209 8 253 36 6 441 1 500 37 +2792 /data/VOCdevkit/VOC2007/JPEGImages/005568.jpg 500 375 12 28 146 236 287 12 272 143 482 294 +2793 /data/VOCdevkit/VOC2007/JPEGImages/005573.jpg 500 375 14 121 57 323 373 17 3 54 418 373 +2794 /data/VOCdevkit/VOC2007/JPEGImages/005574.jpg 500 375 0 130 127 500 308 14 158 199 226 374 +2795 /data/VOCdevkit/VOC2007/JPEGImages/005576.jpg 500 109 18 19 73 484 103 +2796 /data/VOCdevkit/VOC2007/JPEGImages/005577.jpg 500 375 6 1 138 479 375 +2797 /data/VOCdevkit/VOC2007/JPEGImages/005579.jpg 500 375 7 54 160 212 237 7 129 192 368 301 +2798 /data/VOCdevkit/VOC2007/JPEGImages/005582.jpg 500 375 14 74 8 382 375 14 370 2 500 375 14 1 2 107 375 14 297 25 339 108 +2799 /data/VOCdevkit/VOC2007/JPEGImages/005583.jpg 375 500 14 145 220 178 316 +2800 /data/VOCdevkit/VOC2007/JPEGImages/005584.jpg 500 375 6 334 192 488 319 +2801 /data/VOCdevkit/VOC2007/JPEGImages/005585.jpg 500 375 14 334 96 389 276 6 21 131 303 344 +2802 /data/VOCdevkit/VOC2007/JPEGImages/005586.jpg 500 375 7 116 107 212 301 +2803 /data/VOCdevkit/VOC2007/JPEGImages/005588.jpg 500 375 6 150 223 266 311 +2804 /data/VOCdevkit/VOC2007/JPEGImages/005590.jpg 500 316 7 21 75 309 316 7 234 59 333 252 7 314 47 500 316 +2805 /data/VOCdevkit/VOC2007/JPEGImages/005591.jpg 500 375 10 114 257 430 375 8 67 243 103 359 8 86 245 129 374 8 112 248 166 375 8 147 257 210 372 8 190 261 282 375 +2806 /data/VOCdevkit/VOC2007/JPEGImages/005592.jpg 500 375 6 122 135 277 207 +2807 /data/VOCdevkit/VOC2007/JPEGImages/005593.jpg 500 375 6 123 95 365 275 14 252 112 304 153 14 172 110 220 150 14 298 31 351 136 +2808 /data/VOCdevkit/VOC2007/JPEGImages/005599.jpg 347 500 1 179 146 308 435 1 46 171 181 408 14 150 27 318 369 14 26 37 191 376 +2809 /data/VOCdevkit/VOC2007/JPEGImages/005600.jpg 500 335 0 255 136 319 165 14 100 195 114 226 14 88 195 102 224 +2810 /data/VOCdevkit/VOC2007/JPEGImages/005601.jpg 500 382 11 2 161 427 382 +2811 /data/VOCdevkit/VOC2007/JPEGImages/005603.jpg 500 333 2 1 33 409 333 +2812 /data/VOCdevkit/VOC2007/JPEGImages/005605.jpg 500 375 19 209 138 289 205 8 381 223 500 362 15 302 64 358 266 15 91 204 128 266 15 76 234 107 258 15 68 184 104 222 15 144 163 162 216 8 358 153 421 244 15 323 193 356 265 +2813 /data/VOCdevkit/VOC2007/JPEGImages/005606.jpg 500 379 4 10 145 96 301 14 10 41 291 373 14 100 67 495 373 14 20 84 75 144 14 65 109 117 172 +2814 /data/VOCdevkit/VOC2007/JPEGImages/005608.jpg 375 500 13 1 226 303 462 14 31 146 199 441 14 97 181 241 321 +2815 /data/VOCdevkit/VOC2007/JPEGImages/005609.jpg 500 383 6 15 29 482 315 6 313 3 500 147 6 160 5 323 100 6 61 3 136 47 6 1 29 70 143 +2816 /data/VOCdevkit/VOC2007/JPEGImages/005611.jpg 480 369 12 93 53 343 319 14 163 22 266 199 +2817 /data/VOCdevkit/VOC2007/JPEGImages/005613.jpg 500 375 14 63 1 298 292 11 161 227 395 375 +2818 /data/VOCdevkit/VOC2007/JPEGImages/005614.jpg 500 375 3 58 192 281 277 3 210 72 334 237 3 314 194 413 230 +2819 /data/VOCdevkit/VOC2007/JPEGImages/005615.jpg 500 375 13 22 135 329 326 14 155 87 297 338 +2820 /data/VOCdevkit/VOC2007/JPEGImages/005618.jpg 500 375 19 376 147 499 272 8 216 155 270 255 8 266 145 316 238 8 187 146 225 231 14 89 92 124 241 14 142 93 191 243 +2821 /data/VOCdevkit/VOC2007/JPEGImages/005620.jpg 500 332 0 4 66 496 236 +2822 /data/VOCdevkit/VOC2007/JPEGImages/005624.jpg 500 333 2 206 51 338 291 +2823 /data/VOCdevkit/VOC2007/JPEGImages/005625.jpg 500 375 2 65 50 500 375 +2824 /data/VOCdevkit/VOC2007/JPEGImages/005629.jpg 500 333 8 250 84 415 321 8 110 70 256 275 10 94 56 424 325 +2825 /data/VOCdevkit/VOC2007/JPEGImages/005630.jpg 352 288 7 135 1 352 288 +2826 /data/VOCdevkit/VOC2007/JPEGImages/005631.jpg 375 500 5 1 118 206 498 14 273 290 303 376 14 320 288 359 403 +2827 /data/VOCdevkit/VOC2007/JPEGImages/005636.jpg 332 500 12 131 184 209 382 14 254 211 318 386 +2828 /data/VOCdevkit/VOC2007/JPEGImages/005637.jpg 500 332 2 62 91 132 240 2 227 122 314 274 2 352 97 447 228 +2829 /data/VOCdevkit/VOC2007/JPEGImages/005639.jpg 500 375 1 197 174 322 273 14 250 130 308 209 +2830 /data/VOCdevkit/VOC2007/JPEGImages/005640.jpg 375 500 6 107 188 245 271 +2831 /data/VOCdevkit/VOC2007/JPEGImages/005641.jpg 500 375 11 43 170 500 375 11 208 71 443 281 15 161 1 228 43 +2832 /data/VOCdevkit/VOC2007/JPEGImages/005644.jpg 500 375 14 184 39 500 372 14 1 78 227 373 +2833 /data/VOCdevkit/VOC2007/JPEGImages/005645.jpg 500 375 6 1 27 500 375 14 55 71 82 102 +2834 /data/VOCdevkit/VOC2007/JPEGImages/005647.jpg 500 375 8 213 218 315 364 8 72 223 164 346 8 41 190 97 306 8 153 181 255 326 10 22 189 309 344 +2835 /data/VOCdevkit/VOC2007/JPEGImages/005648.jpg 334 500 14 22 109 56 247 14 91 130 149 248 14 166 316 265 467 +2836 /data/VOCdevkit/VOC2007/JPEGImages/005652.jpg 500 333 14 192 60 248 220 1 185 117 260 309 13 302 52 364 151 +2837 /data/VOCdevkit/VOC2007/JPEGImages/005653.jpg 500 375 9 82 73 377 261 14 207 97 284 280 14 362 103 422 262 +2838 /data/VOCdevkit/VOC2007/JPEGImages/005654.jpg 500 372 18 1 61 442 324 +2839 /data/VOCdevkit/VOC2007/JPEGImages/005655.jpg 500 375 0 134 180 287 230 +2840 /data/VOCdevkit/VOC2007/JPEGImages/005657.jpg 500 331 14 1 14 490 331 +2841 /data/VOCdevkit/VOC2007/JPEGImages/005658.jpg 375 500 5 40 121 375 412 14 120 202 171 252 14 21 249 41 295 +2842 /data/VOCdevkit/VOC2007/JPEGImages/005660.jpg 417 500 18 262 218 382 389 14 190 304 220 394 +2843 /data/VOCdevkit/VOC2007/JPEGImages/005662.jpg 375 500 14 121 136 227 295 4 262 203 271 226 4 245 207 254 245 4 231 200 243 241 4 212 202 223 234 10 1 273 349 500 +2844 /data/VOCdevkit/VOC2007/JPEGImages/005664.jpg 500 375 14 206 16 365 203 14 82 19 412 375 14 1 16 153 375 +2845 /data/VOCdevkit/VOC2007/JPEGImages/005668.jpg 500 375 11 2 131 185 373 11 167 117 338 373 11 293 112 500 324 +2846 /data/VOCdevkit/VOC2007/JPEGImages/005669.jpg 500 333 6 254 151 341 202 5 409 135 500 199 14 160 87 194 220 14 1 1 154 332 +2847 /data/VOCdevkit/VOC2007/JPEGImages/005672.jpg 377 500 4 305 65 341 172 14 1 1 138 191 10 1 107 377 500 +2848 /data/VOCdevkit/VOC2007/JPEGImages/005674.jpg 360 480 2 10 63 288 476 +2849 /data/VOCdevkit/VOC2007/JPEGImages/005676.jpg 500 375 15 134 32 388 285 +2850 /data/VOCdevkit/VOC2007/JPEGImages/005679.jpg 500 360 6 440 47 500 119 6 42 27 443 330 6 2 74 115 312 6 33 42 140 124 +2851 /data/VOCdevkit/VOC2007/JPEGImages/005680.jpg 500 375 18 121 65 372 318 14 476 244 500 299 +2852 /data/VOCdevkit/VOC2007/JPEGImages/005682.jpg 500 375 14 85 3 404 375 15 5 2 162 174 +2853 /data/VOCdevkit/VOC2007/JPEGImages/005685.jpg 375 500 18 48 130 300 451 +2854 /data/VOCdevkit/VOC2007/JPEGImages/005686.jpg 500 371 8 364 215 465 363 8 299 200 404 349 10 289 191 500 356 +2855 /data/VOCdevkit/VOC2007/JPEGImages/005687.jpg 500 333 15 58 220 266 333 8 284 239 367 333 +2856 /data/VOCdevkit/VOC2007/JPEGImages/005693.jpg 375 500 14 186 70 375 500 14 1 8 152 500 11 105 227 230 446 +2857 /data/VOCdevkit/VOC2007/JPEGImages/005695.jpg 375 500 14 71 129 331 499 14 171 196 330 486 +2858 /data/VOCdevkit/VOC2007/JPEGImages/005696.jpg 333 500 11 4 101 325 436 +2859 /data/VOCdevkit/VOC2007/JPEGImages/005697.jpg 500 333 17 105 162 420 333 8 227 101 270 168 +2860 /data/VOCdevkit/VOC2007/JPEGImages/005699.jpg 500 375 3 155 217 346 310 +2861 /data/VOCdevkit/VOC2007/JPEGImages/005700.jpg 500 372 12 158 205 224 335 14 153 146 229 266 14 258 147 281 184 +2862 /data/VOCdevkit/VOC2007/JPEGImages/005701.jpg 375 500 8 273 274 317 312 8 161 270 219 344 8 86 277 146 355 8 4 277 109 406 +2863 /data/VOCdevkit/VOC2007/JPEGImages/005702.jpg 333 500 1 38 227 292 500 14 76 63 327 465 +2864 /data/VOCdevkit/VOC2007/JPEGImages/005704.jpg 500 375 10 387 174 500 255 14 437 113 492 178 14 352 130 433 273 14 279 198 390 307 14 270 232 408 374 14 197 294 322 375 14 74 82 220 302 14 58 121 100 173 14 7 131 57 179 +2865 /data/VOCdevkit/VOC2007/JPEGImages/005705.jpg 375 500 3 62 16 246 408 +2866 /data/VOCdevkit/VOC2007/JPEGImages/005710.jpg 500 333 8 259 244 334 333 8 286 217 329 263 8 348 211 387 280 10 236 193 319 268 +2867 /data/VOCdevkit/VOC2007/JPEGImages/005713.jpg 500 334 3 137 277 194 313 3 433 278 500 318 +2868 /data/VOCdevkit/VOC2007/JPEGImages/005714.jpg 500 375 3 122 223 377 295 +2869 /data/VOCdevkit/VOC2007/JPEGImages/005715.jpg 500 375 7 39 8 474 375 +2870 /data/VOCdevkit/VOC2007/JPEGImages/005716.jpg 500 297 14 1 7 295 297 14 368 1 500 206 +2871 /data/VOCdevkit/VOC2007/JPEGImages/005718.jpg 500 386 8 33 233 160 385 +2872 /data/VOCdevkit/VOC2007/JPEGImages/005719.jpg 500 375 10 178 166 500 375 14 1 59 79 326 14 45 48 102 203 14 164 51 239 156 14 244 33 323 196 14 329 110 373 209 14 333 119 465 247 14 96 124 280 373 +2873 /data/VOCdevkit/VOC2007/JPEGImages/005723.jpg 500 391 8 412 242 480 390 8 238 250 377 391 17 43 241 213 391 +2874 /data/VOCdevkit/VOC2007/JPEGImages/005728.jpg 500 322 14 132 61 194 192 9 280 142 406 248 12 149 114 231 250 +2875 /data/VOCdevkit/VOC2007/JPEGImages/005729.jpg 500 332 13 25 108 403 332 14 135 34 309 304 +2876 /data/VOCdevkit/VOC2007/JPEGImages/005730.jpg 500 333 8 321 255 363 307 8 128 238 192 332 8 298 255 324 293 +2877 /data/VOCdevkit/VOC2007/JPEGImages/005731.jpg 500 375 5 2 34 429 313 14 381 177 410 285 +2878 /data/VOCdevkit/VOC2007/JPEGImages/005732.jpg 493 500 12 349 232 450 406 12 249 209 336 408 12 38 171 195 401 14 348 166 453 385 14 229 157 351 374 14 44 115 173 373 +2879 /data/VOCdevkit/VOC2007/JPEGImages/005735.jpg 500 375 18 1 100 493 287 +2880 /data/VOCdevkit/VOC2007/JPEGImages/005736.jpg 500 333 13 11 142 260 300 13 311 117 488 228 +2881 /data/VOCdevkit/VOC2007/JPEGImages/005738.jpg 500 375 6 58 92 378 270 6 1 103 107 231 14 227 85 247 102 +2882 /data/VOCdevkit/VOC2007/JPEGImages/005740.jpg 500 333 2 255 146 365 312 14 1 26 274 333 +2883 /data/VOCdevkit/VOC2007/JPEGImages/005741.jpg 500 332 12 253 120 475 274 14 4 112 99 288 +2884 /data/VOCdevkit/VOC2007/JPEGImages/005742.jpg 500 335 3 422 226 472 254 +2885 /data/VOCdevkit/VOC2007/JPEGImages/005743.jpg 258 258 11 73 94 220 219 +2886 /data/VOCdevkit/VOC2007/JPEGImages/005747.jpg 500 259 6 6 13 493 259 14 100 4 140 80 14 67 14 101 84 +2887 /data/VOCdevkit/VOC2007/JPEGImages/005749.jpg 500 375 6 49 131 483 297 +2888 /data/VOCdevkit/VOC2007/JPEGImages/005752.jpg 500 375 11 3 40 433 322 +2889 /data/VOCdevkit/VOC2007/JPEGImages/005755.jpg 500 400 17 80 27 401 237 17 6 181 500 400 +2890 /data/VOCdevkit/VOC2007/JPEGImages/005756.jpg 500 375 6 40 167 463 303 +2891 /data/VOCdevkit/VOC2007/JPEGImages/005757.jpg 500 333 1 107 167 172 301 1 214 188 253 271 14 108 75 178 280 14 210 131 252 253 +2892 /data/VOCdevkit/VOC2007/JPEGImages/005760.jpg 500 375 6 41 124 232 227 6 220 127 448 229 +2893 /data/VOCdevkit/VOC2007/JPEGImages/005761.jpg 500 361 14 21 54 381 361 +2894 /data/VOCdevkit/VOC2007/JPEGImages/005762.jpg 375 500 15 325 390 375 485 15 228 426 301 500 +2895 /data/VOCdevkit/VOC2007/JPEGImages/005764.jpg 375 500 14 1 17 109 461 +2896 /data/VOCdevkit/VOC2007/JPEGImages/005765.jpg 500 375 14 2 2 338 374 14 251 4 500 375 14 1 1 118 262 +2897 /data/VOCdevkit/VOC2007/JPEGImages/005768.jpg 500 330 1 214 143 424 315 14 217 38 398 282 +2898 /data/VOCdevkit/VOC2007/JPEGImages/005769.jpg 500 394 7 68 162 497 343 +2899 /data/VOCdevkit/VOC2007/JPEGImages/005773.jpg 434 497 14 65 200 163 357 14 138 239 215 365 14 171 171 303 365 14 306 284 371 394 +2900 /data/VOCdevkit/VOC2007/JPEGImages/005779.jpg 500 332 11 134 27 500 331 +2901 /data/VOCdevkit/VOC2007/JPEGImages/005780.jpg 500 375 14 213 111 304 197 +2902 /data/VOCdevkit/VOC2007/JPEGImages/005781.jpg 337 500 2 23 114 207 295 +2903 /data/VOCdevkit/VOC2007/JPEGImages/005782.jpg 500 333 6 54 93 411 226 +2904 /data/VOCdevkit/VOC2007/JPEGImages/005783.jpg 500 333 13 70 173 202 260 13 239 162 416 271 +2905 /data/VOCdevkit/VOC2007/JPEGImages/005784.jpg 500 442 8 130 114 417 243 14 6 22 410 278 14 7 106 494 438 +2906 /data/VOCdevkit/VOC2007/JPEGImages/005786.jpg 500 333 14 358 25 447 312 14 320 51 390 312 14 250 41 327 315 14 192 31 271 318 14 130 45 200 314 14 47 47 146 328 +2907 /data/VOCdevkit/VOC2007/JPEGImages/005788.jpg 500 375 14 148 32 358 262 +2908 /data/VOCdevkit/VOC2007/JPEGImages/005789.jpg 500 375 11 237 137 500 347 +2909 /data/VOCdevkit/VOC2007/JPEGImages/005790.jpg 500 333 14 267 34 500 281 +2910 /data/VOCdevkit/VOC2007/JPEGImages/005791.jpg 500 375 6 1 44 74 156 13 35 36 479 328 +2911 /data/VOCdevkit/VOC2007/JPEGImages/005794.jpg 500 375 17 1 186 145 357 8 83 167 281 330 10 263 152 344 208 8 321 146 358 215 8 278 149 323 222 15 25 46 125 128 15 412 55 500 148 +2912 /data/VOCdevkit/VOC2007/JPEGImages/005796.jpg 375 500 14 45 57 294 500 19 300 275 375 387 +2913 /data/VOCdevkit/VOC2007/JPEGImages/005799.jpg 500 375 19 390 170 430 220 14 244 146 297 229 14 189 163 248 228 14 411 114 500 373 +2914 /data/VOCdevkit/VOC2007/JPEGImages/005803.jpg 500 375 10 67 156 433 273 +2915 /data/VOCdevkit/VOC2007/JPEGImages/005805.jpg 500 375 2 172 94 274 319 2 316 234 409 318 +2916 /data/VOCdevkit/VOC2007/JPEGImages/005806.jpg 500 375 6 216 154 349 286 6 125 75 189 154 +2917 /data/VOCdevkit/VOC2007/JPEGImages/005811.jpg 500 375 14 446 1 477 85 8 335 74 455 305 +2918 /data/VOCdevkit/VOC2007/JPEGImages/005812.jpg 500 334 11 291 182 466 275 11 11 165 127 291 +2919 /data/VOCdevkit/VOC2007/JPEGImages/005813.jpg 335 500 15 147 164 288 354 15 105 240 207 351 15 94 195 140 352 +2920 /data/VOCdevkit/VOC2007/JPEGImages/005814.jpg 500 375 19 249 163 388 275 14 53 1 279 346 4 188 310 323 351 +2921 /data/VOCdevkit/VOC2007/JPEGImages/005815.jpg 500 375 18 1 1 419 330 +2922 /data/VOCdevkit/VOC2007/JPEGImages/005817.jpg 500 375 15 252 2 500 370 +2923 /data/VOCdevkit/VOC2007/JPEGImages/005818.jpg 500 375 14 89 112 198 375 14 184 153 283 375 +2924 /data/VOCdevkit/VOC2007/JPEGImages/005819.jpg 500 375 7 348 167 479 260 7 52 114 242 277 +2925 /data/VOCdevkit/VOC2007/JPEGImages/005821.jpg 500 375 15 111 232 171 315 15 263 209 311 289 15 199 200 246 254 15 6 143 95 230 15 171 198 195 251 8 355 184 481 354 8 461 171 500 375 +2926 /data/VOCdevkit/VOC2007/JPEGImages/005824.jpg 500 359 14 171 95 231 237 +2927 /data/VOCdevkit/VOC2007/JPEGImages/005825.jpg 500 333 3 1 1 401 333 +2928 /data/VOCdevkit/VOC2007/JPEGImages/005826.jpg 500 375 14 78 159 132 286 +2929 /data/VOCdevkit/VOC2007/JPEGImages/005828.jpg 500 291 0 86 62 443 210 +2930 /data/VOCdevkit/VOC2007/JPEGImages/005829.jpg 500 327 14 41 15 189 327 14 174 92 363 327 14 372 137 500 327 +2931 /data/VOCdevkit/VOC2007/JPEGImages/005830.jpg 500 333 6 1 35 473 305 +2932 /data/VOCdevkit/VOC2007/JPEGImages/005831.jpg 500 375 6 36 147 465 344 +2933 /data/VOCdevkit/VOC2007/JPEGImages/005836.jpg 333 500 14 71 40 263 500 +2934 /data/VOCdevkit/VOC2007/JPEGImages/005838.jpg 500 375 7 73 17 467 287 +2935 /data/VOCdevkit/VOC2007/JPEGImages/005839.jpg 487 500 6 84 93 435 426 6 2 113 124 250 +2936 /data/VOCdevkit/VOC2007/JPEGImages/005840.jpg 493 500 14 1 136 118 500 14 77 160 245 500 14 212 160 303 500 14 326 180 493 500 14 258 165 381 500 +2937 /data/VOCdevkit/VOC2007/JPEGImages/005841.jpg 301 500 9 23 219 212 461 +2938 /data/VOCdevkit/VOC2007/JPEGImages/005843.jpg 500 375 9 124 199 294 312 +2939 /data/VOCdevkit/VOC2007/JPEGImages/005845.jpg 500 349 7 1 207 270 349 14 236 2 500 349 +2940 /data/VOCdevkit/VOC2007/JPEGImages/005850.jpg 500 375 7 54 117 348 322 +2941 /data/VOCdevkit/VOC2007/JPEGImages/005851.jpg 500 335 18 223 155 316 190 +2942 /data/VOCdevkit/VOC2007/JPEGImages/005852.jpg 333 500 19 231 206 317 277 14 129 220 320 475 +2943 /data/VOCdevkit/VOC2007/JPEGImages/005853.jpg 500 335 18 180 104 326 192 +2944 /data/VOCdevkit/VOC2007/JPEGImages/005854.jpg 500 375 2 150 167 211 216 2 242 71 337 257 2 255 184 361 265 +2945 /data/VOCdevkit/VOC2007/JPEGImages/005856.jpg 500 375 19 4 106 135 209 14 157 82 312 372 14 117 52 434 322 +2946 /data/VOCdevkit/VOC2007/JPEGImages/005859.jpg 500 375 14 2 3 298 375 +2947 /data/VOCdevkit/VOC2007/JPEGImages/005860.jpg 500 333 3 144 192 353 250 3 375 202 478 239 +2948 /data/VOCdevkit/VOC2007/JPEGImages/005861.jpg 500 338 6 246 147 382 222 6 30 160 84 183 6 122 160 183 185 +2949 /data/VOCdevkit/VOC2007/JPEGImages/005863.jpg 500 375 14 31 77 133 375 14 65 128 153 374 14 134 74 189 147 14 132 140 241 375 14 183 94 234 183 14 182 177 257 352 14 240 81 295 375 14 256 122 338 374 14 299 75 361 174 14 351 50 415 153 14 299 189 376 375 14 334 100 434 375 +2950 /data/VOCdevkit/VOC2007/JPEGImages/005864.jpg 431 285 17 126 161 316 268 +2951 /data/VOCdevkit/VOC2007/JPEGImages/005867.jpg 500 375 19 235 190 291 243 8 232 252 365 375 +2952 /data/VOCdevkit/VOC2007/JPEGImages/005868.jpg 500 375 6 19 134 488 324 +2953 /data/VOCdevkit/VOC2007/JPEGImages/005873.jpg 333 500 11 140 191 245 338 14 149 2 296 331 +2954 /data/VOCdevkit/VOC2007/JPEGImages/005874.jpg 500 332 17 153 163 434 331 15 125 161 159 236 +2955 /data/VOCdevkit/VOC2007/JPEGImages/005875.jpg 500 375 13 37 4 464 368 +2956 /data/VOCdevkit/VOC2007/JPEGImages/005877.jpg 500 333 12 106 40 219 333 12 292 38 484 333 +2957 /data/VOCdevkit/VOC2007/JPEGImages/005878.jpg 500 332 13 100 92 323 222 +2958 /data/VOCdevkit/VOC2007/JPEGImages/005879.jpg 375 500 7 5 33 310 494 +2959 /data/VOCdevkit/VOC2007/JPEGImages/005881.jpg 500 371 14 206 79 500 371 +2960 /data/VOCdevkit/VOC2007/JPEGImages/005884.jpg 500 334 13 56 36 370 324 14 81 39 245 212 +2961 /data/VOCdevkit/VOC2007/JPEGImages/005885.jpg 500 375 14 109 57 410 373 +2962 /data/VOCdevkit/VOC2007/JPEGImages/005888.jpg 500 375 11 277 40 500 373 11 13 69 334 375 +2963 /data/VOCdevkit/VOC2007/JPEGImages/005889.jpg 500 375 14 2 124 160 375 14 113 61 275 375 14 231 94 328 375 14 263 61 500 375 14 440 91 500 234 +2964 /data/VOCdevkit/VOC2007/JPEGImages/005893.jpg 500 374 18 1 84 479 182 +2965 /data/VOCdevkit/VOC2007/JPEGImages/005894.jpg 334 500 15 40 261 151 369 15 28 246 102 314 15 202 220 244 284 +2966 /data/VOCdevkit/VOC2007/JPEGImages/005895.jpg 500 375 0 274 204 316 235 +2967 /data/VOCdevkit/VOC2007/JPEGImages/005897.jpg 500 370 6 419 201 488 240 6 251 246 452 343 +2968 /data/VOCdevkit/VOC2007/JPEGImages/005899.jpg 500 500 11 125 125 379 260 6 1 1 142 149 +2969 /data/VOCdevkit/VOC2007/JPEGImages/005901.jpg 500 375 7 181 64 376 316 7 104 153 404 375 +2970 /data/VOCdevkit/VOC2007/JPEGImages/005903.jpg 500 375 18 2 87 324 375 14 381 207 402 292 +2971 /data/VOCdevkit/VOC2007/JPEGImages/005905.jpg 360 283 14 194 2 359 283 14 2 2 246 283 +2972 /data/VOCdevkit/VOC2007/JPEGImages/005906.jpg 500 375 5 114 114 188 221 14 232 170 257 232 14 358 131 400 257 +2973 /data/VOCdevkit/VOC2007/JPEGImages/005908.jpg 500 375 14 72 2 499 375 4 169 19 346 220 +2974 /data/VOCdevkit/VOC2007/JPEGImages/005909.jpg 500 375 2 152 124 291 333 +2975 /data/VOCdevkit/VOC2007/JPEGImages/005910.jpg 500 335 2 218 78 351 179 +2976 /data/VOCdevkit/VOC2007/JPEGImages/005911.jpg 500 375 5 2 50 500 314 +2977 /data/VOCdevkit/VOC2007/JPEGImages/005912.jpg 500 333 2 245 71 345 284 +2978 /data/VOCdevkit/VOC2007/JPEGImages/005914.jpg 500 375 3 422 226 486 273 3 243 227 360 264 3 2 227 233 296 +2979 /data/VOCdevkit/VOC2007/JPEGImages/005917.jpg 500 375 8 315 160 493 360 8 156 130 259 237 7 123 203 158 225 +2980 /data/VOCdevkit/VOC2007/JPEGImages/005918.jpg 500 333 6 53 27 469 266 6 15 25 126 123 6 385 33 500 123 6 295 29 353 85 +2981 /data/VOCdevkit/VOC2007/JPEGImages/005919.jpg 500 354 4 245 176 259 232 4 288 171 302 226 4 298 186 310 218 4 261 207 281 285 4 203 209 214 239 4 199 229 214 264 4 174 268 195 328 14 231 133 317 208 14 153 146 196 231 14 108 144 159 266 14 69 163 121 288 14 3 155 107 330 14 341 129 394 236 14 422 131 462 173 14 338 132 458 308 14 355 158 500 345 10 86 208 385 354 4 309 254 329 315 +2982 /data/VOCdevkit/VOC2007/JPEGImages/005920.jpg 500 375 10 15 265 350 375 8 302 272 349 375 8 220 294 309 375 +2983 /data/VOCdevkit/VOC2007/JPEGImages/005923.jpg 500 375 1 278 213 417 329 1 218 213 293 322 1 126 216 229 354 14 168 170 221 287 14 224 153 274 249 14 310 142 387 308 8 206 94 234 127 8 277 98 308 126 8 299 110 337 147 17 175 120 213 170 15 284 160 308 192 15 449 105 500 189 15 376 63 409 124 15 221 131 274 171 +2984 /data/VOCdevkit/VOC2007/JPEGImages/005928.jpg 500 375 13 388 103 500 337 13 2 153 104 375 13 84 149 156 245 13 214 136 326 331 14 289 77 334 201 14 212 89 331 298 14 144 85 207 315 +2985 /data/VOCdevkit/VOC2007/JPEGImages/005930.jpg 500 290 1 48 81 213 197 14 12 16 48 176 14 412 97 443 136 14 64 7 170 180 1 411 119 454 151 +2986 /data/VOCdevkit/VOC2007/JPEGImages/005938.jpg 500 313 14 135 73 401 313 14 3 102 152 312 14 148 116 224 221 14 8 127 53 175 +2987 /data/VOCdevkit/VOC2007/JPEGImages/005940.jpg 500 374 14 2 57 154 366 14 125 151 276 374 14 178 83 305 228 14 244 140 389 373 14 376 140 496 374 14 397 163 500 374 +2988 /data/VOCdevkit/VOC2007/JPEGImages/005947.jpg 500 333 16 90 26 323 330 +2989 /data/VOCdevkit/VOC2007/JPEGImages/005948.jpg 500 332 11 166 198 229 230 12 260 134 325 261 12 329 133 424 257 14 366 100 403 203 14 274 108 310 214 +2990 /data/VOCdevkit/VOC2007/JPEGImages/005951.jpg 500 375 13 185 62 498 301 14 329 36 468 272 +2991 /data/VOCdevkit/VOC2007/JPEGImages/005952.jpg 500 375 0 94 8 465 122 0 1 38 84 114 +2992 /data/VOCdevkit/VOC2007/JPEGImages/005954.jpg 375 500 7 173 54 375 484 +2993 /data/VOCdevkit/VOC2007/JPEGImages/005956.jpg 500 363 6 48 68 437 310 6 338 96 500 217 14 211 90 245 123 +2994 /data/VOCdevkit/VOC2007/JPEGImages/005960.jpg 500 375 7 94 284 166 370 +2995 /data/VOCdevkit/VOC2007/JPEGImages/005961.jpg 375 500 5 58 391 294 485 14 306 431 324 478 14 333 426 351 477 14 360 419 375 472 14 115 421 166 500 14 25 457 75 500 +2996 /data/VOCdevkit/VOC2007/JPEGImages/005963.jpg 500 375 8 252 155 385 322 8 327 178 500 375 +2997 /data/VOCdevkit/VOC2007/JPEGImages/005964.jpg 500 333 16 1 1 426 331 +2998 /data/VOCdevkit/VOC2007/JPEGImages/005968.jpg 500 333 11 98 1 500 333 +2999 /data/VOCdevkit/VOC2007/JPEGImages/005970.jpg 333 500 7 93 114 333 500 +3000 /data/VOCdevkit/VOC2007/JPEGImages/005971.jpg 500 333 14 8 109 341 333 +3001 /data/VOCdevkit/VOC2007/JPEGImages/005975.jpg 500 333 14 67 214 92 277 +3002 /data/VOCdevkit/VOC2007/JPEGImages/005979.jpg 500 332 6 26 9 487 331 14 393 1 438 116 14 337 1 376 97 +3003 /data/VOCdevkit/VOC2007/JPEGImages/005980.jpg 500 375 7 53 8 420 312 +3004 /data/VOCdevkit/VOC2007/JPEGImages/005981.jpg 500 375 9 244 130 404 375 9 69 73 205 153 +3005 /data/VOCdevkit/VOC2007/JPEGImages/005983.jpg 500 375 2 235 93 286 160 +3006 /data/VOCdevkit/VOC2007/JPEGImages/005984.jpg 500 375 11 93 200 295 369 11 280 215 464 330 14 60 58 445 374 +3007 /data/VOCdevkit/VOC2007/JPEGImages/005985.jpg 354 500 15 239 1 354 258 14 55 70 231 410 +3008 /data/VOCdevkit/VOC2007/JPEGImages/005988.jpg 500 375 11 332 186 413 225 11 97 167 165 222 14 37 66 95 232 14 346 48 455 252 6 446 68 500 142 +3009 /data/VOCdevkit/VOC2007/JPEGImages/005989.jpg 500 375 13 140 130 408 273 14 213 96 355 260 +3010 /data/VOCdevkit/VOC2007/JPEGImages/005990.jpg 500 375 13 97 1 397 372 14 373 184 500 375 14 362 179 454 276 +3011 /data/VOCdevkit/VOC2007/JPEGImages/005991.jpg 375 500 15 8 56 107 230 14 124 207 217 419 +3012 /data/VOCdevkit/VOC2007/JPEGImages/005992.jpg 500 375 17 1 48 488 371 14 43 77 449 293 11 60 147 286 245 +3013 /data/VOCdevkit/VOC2007/JPEGImages/005995.jpg 500 335 18 81 85 288 239 +3014 /data/VOCdevkit/VOC2007/JPEGImages/005996.jpg 500 375 13 1 1 500 290 +3015 /data/VOCdevkit/VOC2007/JPEGImages/005998.jpg 500 346 6 20 29 482 327 +3016 /data/VOCdevkit/VOC2007/JPEGImages/006000.jpg 489 500 8 181 259 344 500 19 196 179 354 282 +3017 /data/VOCdevkit/VOC2007/JPEGImages/006001.jpg 500 375 18 2 3 500 315 +3018 /data/VOCdevkit/VOC2007/JPEGImages/006004.jpg 333 500 8 94 164 301 424 14 57 146 184 468 14 130 169 266 500 14 1 173 101 500 +3019 /data/VOCdevkit/VOC2007/JPEGImages/006005.jpg 375 500 14 55 81 181 196 14 178 70 294 192 8 182 330 257 455 +3020 /data/VOCdevkit/VOC2007/JPEGImages/006009.jpg 500 333 6 134 118 298 235 +3021 /data/VOCdevkit/VOC2007/JPEGImages/006011.jpg 500 375 6 190 179 337 276 6 210 95 346 164 14 239 76 266 117 14 244 142 284 181 +3022 /data/VOCdevkit/VOC2007/JPEGImages/006012.jpg 500 375 2 287 186 317 210 2 312 169 337 203 +3023 /data/VOCdevkit/VOC2007/JPEGImages/006018.jpg 500 332 5 244 165 419 292 6 419 217 457 267 6 455 229 500 269 6 1 209 167 310 6 193 234 231 284 +3024 /data/VOCdevkit/VOC2007/JPEGImages/006020.jpg 500 375 17 21 82 500 305 +3025 /data/VOCdevkit/VOC2007/JPEGImages/006023.jpg 500 375 18 21 46 495 280 +3026 /data/VOCdevkit/VOC2007/JPEGImages/006025.jpg 500 333 0 21 119 449 232 +3027 /data/VOCdevkit/VOC2007/JPEGImages/006026.jpg 500 375 7 214 93 479 207 11 2 114 293 375 +3028 /data/VOCdevkit/VOC2007/JPEGImages/006027.jpg 500 344 8 150 203 198 344 +3029 /data/VOCdevkit/VOC2007/JPEGImages/006028.jpg 500 374 1 19 80 93 144 14 282 81 331 289 14 177 200 215 249 +3030 /data/VOCdevkit/VOC2007/JPEGImages/006029.jpg 500 375 19 2 52 51 121 14 140 33 175 99 14 26 39 174 142 14 132 33 217 136 15 225 46 252 82 15 252 38 283 72 8 261 39 377 124 17 1 109 500 375 14 150 132 490 307 11 52 217 371 309 +3031 /data/VOCdevkit/VOC2007/JPEGImages/006030.jpg 500 375 8 73 241 186 375 8 167 220 252 375 8 205 199 263 375 10 1 240 291 375 +3032 /data/VOCdevkit/VOC2007/JPEGImages/006033.jpg 375 500 14 4 12 227 500 14 178 44 372 494 +3033 /data/VOCdevkit/VOC2007/JPEGImages/006035.jpg 500 281 6 270 244 344 275 6 151 251 225 274 +3034 /data/VOCdevkit/VOC2007/JPEGImages/006038.jpg 500 332 6 176 220 256 257 13 373 233 447 315 14 379 195 429 290 14 397 203 443 292 +3035 /data/VOCdevkit/VOC2007/JPEGImages/006041.jpg 500 375 19 1 9 47 114 14 76 54 207 375 14 222 22 500 317 +3036 /data/VOCdevkit/VOC2007/JPEGImages/006042.jpg 500 333 11 205 102 318 213 +3037 /data/VOCdevkit/VOC2007/JPEGImages/006043.jpg 500 375 6 2 2 496 371 14 465 29 496 131 14 252 22 302 113 14 297 23 328 63 14 116 24 150 63 +3038 /data/VOCdevkit/VOC2007/JPEGImages/006045.jpg 500 375 8 1 147 149 343 17 156 167 500 375 +3039 /data/VOCdevkit/VOC2007/JPEGImages/006046.jpg 500 332 3 189 104 243 206 3 261 126 306 204 +3040 /data/VOCdevkit/VOC2007/JPEGImages/006055.jpg 500 375 8 369 168 423 296 8 412 179 461 306 8 125 149 208 303 8 27 155 118 309 +3041 /data/VOCdevkit/VOC2007/JPEGImages/006058.jpg 500 375 6 1 107 499 375 +3042 /data/VOCdevkit/VOC2007/JPEGImages/006061.jpg 500 375 7 213 7 500 200 7 207 185 280 374 4 170 1 210 61 4 106 1 157 56 +3043 /data/VOCdevkit/VOC2007/JPEGImages/006062.jpg 500 333 6 37 139 381 241 6 422 97 472 116 6 72 91 112 105 +3044 /data/VOCdevkit/VOC2007/JPEGImages/006065.jpg 500 375 11 4 29 500 287 +3045 /data/VOCdevkit/VOC2007/JPEGImages/006066.jpg 500 333 8 47 266 204 332 19 150 120 339 264 +3046 /data/VOCdevkit/VOC2007/JPEGImages/006067.jpg 500 375 0 41 184 291 257 +3047 /data/VOCdevkit/VOC2007/JPEGImages/006069.jpg 500 500 15 5 1 196 470 7 150 236 443 500 +3048 /data/VOCdevkit/VOC2007/JPEGImages/006070.jpg 500 500 2 1 179 338 500 +3049 /data/VOCdevkit/VOC2007/JPEGImages/006071.jpg 500 332 13 108 66 353 293 14 387 49 426 216 14 2 2 69 249 14 311 44 376 219 14 75 58 119 177 14 419 2 500 315 14 157 73 192 128 14 139 102 152 153 14 374 84 394 126 14 269 28 312 115 +3050 /data/VOCdevkit/VOC2007/JPEGImages/006073.jpg 500 375 9 130 54 496 346 +3051 /data/VOCdevkit/VOC2007/JPEGImages/006074.jpg 500 345 19 244 208 500 345 19 1 188 220 345 +3052 /data/VOCdevkit/VOC2007/JPEGImages/006078.jpg 500 375 8 27 187 91 284 +3053 /data/VOCdevkit/VOC2007/JPEGImages/006079.jpg 500 375 3 164 153 332 213 6 68 51 103 68 6 30 57 68 71 +3054 /data/VOCdevkit/VOC2007/JPEGImages/006084.jpg 500 375 7 141 64 500 282 +3055 /data/VOCdevkit/VOC2007/JPEGImages/006088.jpg 500 375 8 1 230 174 375 8 406 183 500 337 17 91 199 342 332 17 341 162 414 212 +3056 /data/VOCdevkit/VOC2007/JPEGImages/006089.jpg 500 375 6 152 130 298 255 +3057 /data/VOCdevkit/VOC2007/JPEGImages/006091.jpg 500 334 2 262 41 448 162 2 135 58 309 200 +3058 /data/VOCdevkit/VOC2007/JPEGImages/006095.jpg 500 322 9 264 148 496 280 12 98 123 237 248 14 150 77 189 181 +3059 /data/VOCdevkit/VOC2007/JPEGImages/006096.jpg 500 375 5 30 48 472 324 +3060 /data/VOCdevkit/VOC2007/JPEGImages/006097.jpg 500 333 6 1 77 454 281 +3061 /data/VOCdevkit/VOC2007/JPEGImages/006098.jpg 375 500 3 92 74 292 178 2 93 100 142 140 +3062 /data/VOCdevkit/VOC2007/JPEGImages/006100.jpg 500 375 17 317 144 500 347 15 106 53 169 103 15 250 107 291 158 8 183 128 238 213 11 141 163 198 200 +3063 /data/VOCdevkit/VOC2007/JPEGImages/006103.jpg 500 375 6 2 308 67 371 14 72 295 96 351 14 203 291 223 341 14 350 294 366 333 14 390 293 406 326 +3064 /data/VOCdevkit/VOC2007/JPEGImages/006104.jpg 500 333 17 33 149 456 333 14 171 100 331 333 +3065 /data/VOCdevkit/VOC2007/JPEGImages/006105.jpg 343 500 7 44 5 151 443 +3066 /data/VOCdevkit/VOC2007/JPEGImages/006107.jpg 500 335 18 53 116 500 327 +3067 /data/VOCdevkit/VOC2007/JPEGImages/006108.jpg 500 353 2 61 22 242 336 +3068 /data/VOCdevkit/VOC2007/JPEGImages/006111.jpg 500 375 9 111 89 472 301 +3069 /data/VOCdevkit/VOC2007/JPEGImages/006117.jpg 375 500 14 2 60 312 500 +3070 /data/VOCdevkit/VOC2007/JPEGImages/006120.jpg 500 333 13 66 42 484 285 +3071 /data/VOCdevkit/VOC2007/JPEGImages/006123.jpg 500 375 3 470 109 500 279 3 250 136 367 282 3 118 123 187 274 3 231 315 450 375 +3072 /data/VOCdevkit/VOC2007/JPEGImages/006124.jpg 500 375 6 31 103 452 303 +3073 /data/VOCdevkit/VOC2007/JPEGImages/006125.jpg 500 375 7 140 128 353 291 +3074 /data/VOCdevkit/VOC2007/JPEGImages/006128.jpg 500 323 6 94 194 500 323 6 64 195 225 264 +3075 /data/VOCdevkit/VOC2007/JPEGImages/006129.jpg 500 333 0 9 114 487 215 +3076 /data/VOCdevkit/VOC2007/JPEGImages/006130.jpg 500 375 17 1 116 500 349 14 3 85 263 352 14 203 81 428 367 14 360 78 500 370 +3077 /data/VOCdevkit/VOC2007/JPEGImages/006131.jpg 500 375 19 289 95 446 264 19 416 115 500 284 19 1 107 138 277 +3078 /data/VOCdevkit/VOC2007/JPEGImages/006133.jpg 500 333 6 87 79 422 283 6 1 102 157 181 14 2 82 63 196 14 455 96 485 174 +3079 /data/VOCdevkit/VOC2007/JPEGImages/006134.jpg 500 375 12 125 99 442 318 +3080 /data/VOCdevkit/VOC2007/JPEGImages/006135.jpg 500 332 18 221 143 266 183 +3081 /data/VOCdevkit/VOC2007/JPEGImages/006136.jpg 500 332 16 54 183 166 262 +3082 /data/VOCdevkit/VOC2007/JPEGImages/006139.jpg 500 375 11 82 86 165 153 11 325 167 500 375 +3083 /data/VOCdevkit/VOC2007/JPEGImages/006140.jpg 500 333 10 181 189 495 333 14 275 149 338 220 14 344 153 408 241 14 387 147 500 291 14 5 3 205 333 14 178 95 241 190 14 72 54 183 204 +3084 /data/VOCdevkit/VOC2007/JPEGImages/006141.jpg 375 500 4 238 28 336 388 +3085 /data/VOCdevkit/VOC2007/JPEGImages/006146.jpg 500 375 1 108 197 275 294 +3086 /data/VOCdevkit/VOC2007/JPEGImages/006148.jpg 375 500 9 100 231 208 413 14 92 122 289 452 +3087 /data/VOCdevkit/VOC2007/JPEGImages/006150.jpg 500 400 14 394 131 492 350 14 193 157 257 400 14 20 150 139 379 14 61 161 133 400 +3088 /data/VOCdevkit/VOC2007/JPEGImages/006151.jpg 334 500 12 106 173 321 377 14 53 170 140 363 14 215 171 262 340 14 276 174 334 332 6 1 192 207 337 +3089 /data/VOCdevkit/VOC2007/JPEGImages/006153.jpg 500 335 18 242 145 306 202 +3090 /data/VOCdevkit/VOC2007/JPEGImages/006156.jpg 500 375 14 2 2 451 375 +3091 /data/VOCdevkit/VOC2007/JPEGImages/006158.jpg 500 375 19 413 89 500 161 14 54 130 190 327 17 1 149 204 338 +3092 /data/VOCdevkit/VOC2007/JPEGImages/006159.jpg 375 500 15 15 29 359 463 +3093 /data/VOCdevkit/VOC2007/JPEGImages/006161.jpg 500 333 10 29 160 494 332 14 312 69 398 196 14 384 103 498 312 14 348 76 446 234 14 67 73 180 217 14 1 68 109 316 14 222 26 266 101 14 259 64 316 160 14 112 64 159 158 +3094 /data/VOCdevkit/VOC2007/JPEGImages/006162.jpg 500 333 0 38 100 445 215 +3095 /data/VOCdevkit/VOC2007/JPEGImages/006163.jpg 357 500 14 79 89 305 500 +3096 /data/VOCdevkit/VOC2007/JPEGImages/006166.jpg 500 419 18 125 122 312 340 +3097 /data/VOCdevkit/VOC2007/JPEGImages/006170.jpg 500 334 9 147 134 174 176 +3098 /data/VOCdevkit/VOC2007/JPEGImages/006171.jpg 500 375 14 54 37 231 174 11 2 166 412 315 +3099 /data/VOCdevkit/VOC2007/JPEGImages/006172.jpg 500 375 14 61 171 381 358 14 158 11 361 319 +3100 /data/VOCdevkit/VOC2007/JPEGImages/006174.jpg 500 375 11 49 76 388 374 +3101 /data/VOCdevkit/VOC2007/JPEGImages/006175.jpg 500 275 14 207 88 295 199 +3102 /data/VOCdevkit/VOC2007/JPEGImages/006176.jpg 500 481 14 4 2 281 479 14 203 4 497 479 +3103 /data/VOCdevkit/VOC2007/JPEGImages/006177.jpg 500 375 13 113 233 157 284 14 120 209 154 273 9 224 234 261 268 9 360 245 403 282 +3104 /data/VOCdevkit/VOC2007/JPEGImages/006179.jpg 500 333 19 58 15 302 221 14 206 109 243 156 14 159 89 220 159 +3105 /data/VOCdevkit/VOC2007/JPEGImages/006180.jpg 352 288 4 78 73 304 229 14 1 66 231 288 +3106 /data/VOCdevkit/VOC2007/JPEGImages/006181.jpg 500 375 2 26 66 486 319 +3107 /data/VOCdevkit/VOC2007/JPEGImages/006183.jpg 360 480 7 54 207 360 436 +3108 /data/VOCdevkit/VOC2007/JPEGImages/006184.jpg 500 385 0 54 94 449 322 +3109 /data/VOCdevkit/VOC2007/JPEGImages/006185.jpg 500 375 8 128 222 266 307 14 13 155 153 285 14 203 70 321 258 14 257 107 456 325 +3110 /data/VOCdevkit/VOC2007/JPEGImages/006187.jpg 375 500 14 61 33 375 500 14 1 43 218 500 +3111 /data/VOCdevkit/VOC2007/JPEGImages/006188.jpg 500 379 1 50 102 390 335 15 279 123 342 186 15 174 182 241 237 +3112 /data/VOCdevkit/VOC2007/JPEGImages/006189.jpg 500 333 4 133 92 186 290 11 112 1 426 330 +3113 /data/VOCdevkit/VOC2007/JPEGImages/006190.jpg 500 312 11 72 35 409 264 +3114 /data/VOCdevkit/VOC2007/JPEGImages/006196.jpg 500 375 6 68 1 500 373 +3115 /data/VOCdevkit/VOC2007/JPEGImages/006198.jpg 500 375 14 125 107 186 174 14 82 99 123 305 14 436 78 489 360 14 434 61 500 375 14 327 79 368 159 14 283 61 344 175 14 4 82 96 375 14 342 95 443 375 14 97 83 338 375 14 199 82 376 375 +3116 /data/VOCdevkit/VOC2007/JPEGImages/006201.jpg 500 333 18 186 174 500 224 +3117 /data/VOCdevkit/VOC2007/JPEGImages/006202.jpg 500 375 9 271 121 439 255 9 59 121 153 262 9 162 140 228 234 +3118 /data/VOCdevkit/VOC2007/JPEGImages/006203.jpg 327 500 6 46 366 275 458 +3119 /data/VOCdevkit/VOC2007/JPEGImages/006206.jpg 500 375 1 196 245 345 354 1 171 238 302 350 6 325 240 500 375 +3120 /data/VOCdevkit/VOC2007/JPEGImages/006208.jpg 500 375 0 2 106 499 266 +3121 /data/VOCdevkit/VOC2007/JPEGImages/006209.jpg 500 375 19 358 185 441 268 14 147 167 355 375 +3122 /data/VOCdevkit/VOC2007/JPEGImages/006210.jpg 500 375 6 403 92 500 255 6 374 134 426 206 +3123 /data/VOCdevkit/VOC2007/JPEGImages/006212.jpg 500 373 0 7 151 475 339 +3124 /data/VOCdevkit/VOC2007/JPEGImages/006214.jpg 500 375 1 357 187 440 262 +3125 /data/VOCdevkit/VOC2007/JPEGImages/006215.jpg 375 500 3 134 64 293 422 3 174 355 188 383 3 52 379 96 403 +3126 /data/VOCdevkit/VOC2007/JPEGImages/006216.jpg 500 375 13 6 2 485 370 13 83 85 444 281 +3127 /data/VOCdevkit/VOC2007/JPEGImages/006218.jpg 500 375 5 134 59 383 207 6 438 145 490 183 +3128 /data/VOCdevkit/VOC2007/JPEGImages/006219.jpg 500 375 11 186 96 365 312 +3129 /data/VOCdevkit/VOC2007/JPEGImages/006220.jpg 500 375 8 62 138 132 324 10 124 127 500 375 +3130 /data/VOCdevkit/VOC2007/JPEGImages/006221.jpg 500 375 14 1 75 344 375 +3131 /data/VOCdevkit/VOC2007/JPEGImages/006222.jpg 375 500 2 142 53 247 118 +3132 /data/VOCdevkit/VOC2007/JPEGImages/006223.jpg 500 333 6 128 90 426 266 +3133 /data/VOCdevkit/VOC2007/JPEGImages/006224.jpg 500 333 6 246 167 310 196 6 238 86 289 107 +3134 /data/VOCdevkit/VOC2007/JPEGImages/006225.jpg 500 375 6 86 82 463 292 14 1 1 79 266 14 99 9 189 149 14 181 11 213 125 14 194 13 255 117 +3135 /data/VOCdevkit/VOC2007/JPEGImages/006229.jpg 500 375 14 76 117 157 306 14 306 115 374 248 14 347 115 382 212 14 373 75 462 375 14 168 131 355 375 +3136 /data/VOCdevkit/VOC2007/JPEGImages/006230.jpg 500 375 11 1 33 487 356 +3137 /data/VOCdevkit/VOC2007/JPEGImages/006233.jpg 500 375 14 386 303 423 347 +3138 /data/VOCdevkit/VOC2007/JPEGImages/006234.jpg 500 375 7 15 63 499 232 +3139 /data/VOCdevkit/VOC2007/JPEGImages/006235.jpg 500 375 6 351 251 481 308 6 222 251 362 308 6 131 257 246 307 6 41 259 157 305 6 10 239 91 300 14 443 230 464 262 +3140 /data/VOCdevkit/VOC2007/JPEGImages/006236.jpg 375 500 13 4 204 339 423 13 302 235 375 500 14 98 115 220 441 +3141 /data/VOCdevkit/VOC2007/JPEGImages/006238.jpg 500 333 19 278 112 404 224 14 258 1 358 139 14 40 11 317 333 +3142 /data/VOCdevkit/VOC2007/JPEGImages/006240.jpg 351 467 14 1 14 350 467 +3143 /data/VOCdevkit/VOC2007/JPEGImages/006241.jpg 500 375 8 387 164 489 372 4 183 103 210 183 10 49 135 440 375 +3144 /data/VOCdevkit/VOC2007/JPEGImages/006243.jpg 500 375 13 1 178 366 375 13 38 97 500 324 14 75 52 138 250 14 205 68 246 149 14 266 37 314 192 14 347 37 385 195 14 416 43 463 202 14 132 50 170 159 14 313 46 349 181 +3145 /data/VOCdevkit/VOC2007/JPEGImages/006247.jpg 500 375 16 2 63 454 358 +3146 /data/VOCdevkit/VOC2007/JPEGImages/006249.jpg 414 371 12 11 4 409 365 +3147 /data/VOCdevkit/VOC2007/JPEGImages/006250.jpg 500 375 6 59 124 279 270 +3148 /data/VOCdevkit/VOC2007/JPEGImages/006251.jpg 500 375 16 75 238 146 286 16 160 221 201 255 16 127 232 179 269 16 397 225 426 263 16 323 222 361 260 16 227 232 272 269 16 170 199 203 221 16 358 199 382 218 +3149 /data/VOCdevkit/VOC2007/JPEGImages/006252.jpg 500 375 11 136 86 486 303 +3150 /data/VOCdevkit/VOC2007/JPEGImages/006254.jpg 500 333 18 61 102 366 207 +3151 /data/VOCdevkit/VOC2007/JPEGImages/006258.jpg 375 500 0 2 11 374 421 +3152 /data/VOCdevkit/VOC2007/JPEGImages/006259.jpg 333 500 10 1 188 333 442 14 68 112 127 171 14 4 136 45 195 +3153 /data/VOCdevkit/VOC2007/JPEGImages/006260.jpg 500 375 7 100 56 500 233 +3154 /data/VOCdevkit/VOC2007/JPEGImages/006261.jpg 398 500 6 246 330 392 438 6 1 259 74 350 +3155 /data/VOCdevkit/VOC2007/JPEGImages/006262.jpg 500 332 7 43 98 481 257 +3156 /data/VOCdevkit/VOC2007/JPEGImages/006264.jpg 500 374 2 193 38 339 348 +3157 /data/VOCdevkit/VOC2007/JPEGImages/006267.jpg 500 335 11 84 156 394 301 11 100 72 230 198 +3158 /data/VOCdevkit/VOC2007/JPEGImages/006269.jpg 500 375 7 4 1 419 293 +3159 /data/VOCdevkit/VOC2007/JPEGImages/006270.jpg 500 375 8 197 180 274 273 8 5 252 276 375 15 297 177 316 195 +3160 /data/VOCdevkit/VOC2007/JPEGImages/006272.jpg 355 500 14 71 217 146 347 13 72 269 133 382 +3161 /data/VOCdevkit/VOC2007/JPEGImages/006275.jpg 500 375 18 1 1 497 262 +3162 /data/VOCdevkit/VOC2007/JPEGImages/006276.jpg 364 480 14 106 47 232 308 12 86 120 285 455 +3163 /data/VOCdevkit/VOC2007/JPEGImages/006277.jpg 500 375 6 65 70 447 322 +3164 /data/VOCdevkit/VOC2007/JPEGImages/006279.jpg 500 375 0 31 127 499 244 +3165 /data/VOCdevkit/VOC2007/JPEGImages/006281.jpg 500 375 3 1 206 172 337 3 157 169 500 334 +3166 /data/VOCdevkit/VOC2007/JPEGImages/006282.jpg 500 334 14 119 98 312 334 +3167 /data/VOCdevkit/VOC2007/JPEGImages/006284.jpg 500 333 14 169 46 500 332 +3168 /data/VOCdevkit/VOC2007/JPEGImages/006285.jpg 500 332 14 256 78 343 237 14 139 87 230 239 12 242 117 352 308 12 143 129 238 306 +3169 /data/VOCdevkit/VOC2007/JPEGImages/006286.jpg 500 375 14 80 88 405 375 14 436 147 475 209 14 381 145 428 191 10 104 185 209 279 8 408 241 500 375 8 49 178 135 279 8 150 184 233 290 8 19 167 65 231 +3170 /data/VOCdevkit/VOC2007/JPEGImages/006289.jpg 497 500 8 12 178 171 419 14 105 122 256 339 14 160 202 436 499 14 349 157 428 276 +3171 /data/VOCdevkit/VOC2007/JPEGImages/006290.jpg 500 375 6 466 191 500 270 5 21 67 471 308 +3172 /data/VOCdevkit/VOC2007/JPEGImages/006291.jpg 500 374 9 301 27 484 337 9 252 2 387 224 9 100 3 305 220 9 47 12 166 211 +3173 /data/VOCdevkit/VOC2007/JPEGImages/006295.jpg 500 375 12 38 123 171 221 12 337 97 447 186 12 198 103 370 202 +3174 /data/VOCdevkit/VOC2007/JPEGImages/006296.jpg 500 400 14 199 57 331 400 14 320 7 496 400 14 1 9 199 400 +3175 /data/VOCdevkit/VOC2007/JPEGImages/006299.jpg 500 375 4 321 1 357 89 4 284 8 316 124 15 60 1 162 127 15 351 1 450 68 +3176 /data/VOCdevkit/VOC2007/JPEGImages/006300.jpg 500 375 1 27 147 77 204 1 65 177 174 270 1 181 176 500 375 14 33 112 72 188 14 100 92 178 267 14 282 37 429 375 +3177 /data/VOCdevkit/VOC2007/JPEGImages/006301.jpg 500 375 6 408 308 453 326 +3178 /data/VOCdevkit/VOC2007/JPEGImages/006304.jpg 500 333 3 321 197 357 252 +3179 /data/VOCdevkit/VOC2007/JPEGImages/006305.jpg 500 375 7 205 77 429 375 +3180 /data/VOCdevkit/VOC2007/JPEGImages/006306.jpg 500 333 0 1 71 348 213 +3181 /data/VOCdevkit/VOC2007/JPEGImages/006309.jpg 500 335 2 52 48 500 325 +3182 /data/VOCdevkit/VOC2007/JPEGImages/006314.jpg 375 500 19 103 114 354 373 +3183 /data/VOCdevkit/VOC2007/JPEGImages/006318.jpg 500 375 7 234 130 360 309 +3184 /data/VOCdevkit/VOC2007/JPEGImages/006319.jpg 500 375 15 176 2 500 374 15 1 1 85 156 +3185 /data/VOCdevkit/VOC2007/JPEGImages/006320.jpg 500 333 6 123 43 434 302 14 26 104 65 213 14 66 137 93 214 14 93 141 118 213 14 465 103 480 161 14 108 110 132 176 14 56 109 75 188 +3186 /data/VOCdevkit/VOC2007/JPEGImages/006321.jpg 375 500 11 54 200 232 412 +3187 /data/VOCdevkit/VOC2007/JPEGImages/006323.jpg 500 333 19 152 148 181 169 +3188 /data/VOCdevkit/VOC2007/JPEGImages/006325.jpg 500 458 6 276 277 363 353 +3189 /data/VOCdevkit/VOC2007/JPEGImages/006329.jpg 500 375 6 36 70 480 291 +3190 /data/VOCdevkit/VOC2007/JPEGImages/006330.jpg 500 375 6 313 301 394 338 6 415 307 469 345 6 442 307 500 363 6 120 307 189 339 6 80 304 124 332 6 226 312 270 333 6 12 306 40 322 5 106 277 227 334 +3191 /data/VOCdevkit/VOC2007/JPEGImages/006335.jpg 500 375 4 290 28 367 298 +3192 /data/VOCdevkit/VOC2007/JPEGImages/006337.jpg 500 333 11 55 111 418 318 +3193 /data/VOCdevkit/VOC2007/JPEGImages/006338.jpg 500 307 18 1 1 391 273 +3194 /data/VOCdevkit/VOC2007/JPEGImages/006339.jpg 500 375 19 67 65 148 137 17 284 100 383 335 14 284 166 371 238 14 265 104 322 184 14 81 128 183 199 14 86 254 188 301 +3195 /data/VOCdevkit/VOC2007/JPEGImages/006341.jpg 375 500 14 39 87 347 500 +3196 /data/VOCdevkit/VOC2007/JPEGImages/006344.jpg 500 335 18 1 39 401 313 14 394 129 439 239 14 460 152 497 249 14 449 132 490 177 +3197 /data/VOCdevkit/VOC2007/JPEGImages/006346.jpg 500 374 5 364 161 500 282 5 19 165 327 275 6 1 264 216 374 14 419 221 490 374 14 255 221 341 374 14 329 209 351 285 14 304 210 333 285 14 128 230 181 321 14 110 221 143 273 14 65 222 106 271 6 1 230 209 298 +3198 /data/VOCdevkit/VOC2007/JPEGImages/006348.jpg 500 375 19 12 75 80 205 8 216 107 500 374 +3199 /data/VOCdevkit/VOC2007/JPEGImages/006349.jpg 500 334 0 5 36 495 256 +3200 /data/VOCdevkit/VOC2007/JPEGImages/006350.jpg 500 377 0 20 68 454 228 +3201 /data/VOCdevkit/VOC2007/JPEGImages/006351.jpg 500 375 14 89 55 390 375 15 358 119 465 230 +3202 /data/VOCdevkit/VOC2007/JPEGImages/006352.jpg 500 375 5 153 118 408 177 14 43 82 174 374 +3203 /data/VOCdevkit/VOC2007/JPEGImages/006353.jpg 500 375 7 1 2 500 375 +3204 /data/VOCdevkit/VOC2007/JPEGImages/006355.jpg 500 375 11 238 214 313 336 11 202 175 245 318 14 189 27 283 217 +3205 /data/VOCdevkit/VOC2007/JPEGImages/006357.jpg 331 500 3 130 359 289 440 +3206 /data/VOCdevkit/VOC2007/JPEGImages/006362.jpg 500 375 6 40 28 406 332 6 1 114 146 277 +3207 /data/VOCdevkit/VOC2007/JPEGImages/006363.jpg 335 500 4 118 108 220 469 4 179 64 271 383 4 50 64 143 388 +3208 /data/VOCdevkit/VOC2007/JPEGImages/006366.jpg 500 384 11 1 31 461 384 +3209 /data/VOCdevkit/VOC2007/JPEGImages/006367.jpg 500 333 2 115 2 400 333 +3210 /data/VOCdevkit/VOC2007/JPEGImages/006369.jpg 500 333 6 18 110 424 301 14 435 102 446 131 6 450 108 500 146 14 479 96 500 156 6 334 95 380 121 14 367 100 401 137 14 400 125 425 167 6 179 13 235 64 +3211 /data/VOCdevkit/VOC2007/JPEGImages/006371.jpg 500 375 1 16 23 485 307 +3212 /data/VOCdevkit/VOC2007/JPEGImages/006374.jpg 500 375 0 157 127 412 279 +3213 /data/VOCdevkit/VOC2007/JPEGImages/006375.jpg 500 375 6 371 142 437 182 6 194 155 291 218 6 28 160 196 306 +3214 /data/VOCdevkit/VOC2007/JPEGImages/006377.jpg 500 333 18 79 117 391 282 +3215 /data/VOCdevkit/VOC2007/JPEGImages/006381.jpg 500 375 4 246 251 265 295 14 5 209 125 375 14 323 198 435 365 14 267 185 353 290 14 250 126 289 167 14 3 163 56 305 14 82 155 157 295 14 127 135 207 276 14 204 130 227 171 14 217 132 260 234 10 77 266 420 375 8 394 253 489 358 8 210 170 266 238 +3216 /data/VOCdevkit/VOC2007/JPEGImages/006382.jpg 500 332 12 3 62 295 331 +3217 /data/VOCdevkit/VOC2007/JPEGImages/006385.jpg 500 334 11 219 158 295 325 +3218 /data/VOCdevkit/VOC2007/JPEGImages/006387.jpg 500 281 1 209 169 253 222 14 208 134 238 208 +3219 /data/VOCdevkit/VOC2007/JPEGImages/006391.jpg 375 500 8 135 135 359 388 14 6 114 310 454 +3220 /data/VOCdevkit/VOC2007/JPEGImages/006392.jpg 320 214 12 82 50 245 198 14 119 17 202 121 +3221 /data/VOCdevkit/VOC2007/JPEGImages/006395.jpg 500 375 19 408 35 479 188 14 134 117 316 347 8 17 183 213 375 +3222 /data/VOCdevkit/VOC2007/JPEGImages/006396.jpg 500 170 6 101 110 171 167 6 352 95 454 133 6 235 101 350 137 6 309 95 373 119 6 183 93 271 139 6 160 97 185 109 6 1 99 27 126 +3223 /data/VOCdevkit/VOC2007/JPEGImages/006398.jpg 500 375 4 238 138 259 217 4 260 155 285 239 4 291 133 314 209 4 284 101 304 155 4 221 304 259 375 4 246 280 278 375 14 1 100 180 375 14 43 50 206 254 14 159 57 236 198 14 391 95 500 375 14 362 72 500 269 14 332 71 399 212 14 312 40 355 139 14 261 36 317 105 14 1 56 52 195 10 145 96 436 375 +3224 /data/VOCdevkit/VOC2007/JPEGImages/006400.jpg 500 335 18 433 80 500 256 18 189 101 440 235 18 40 125 199 203 +3225 /data/VOCdevkit/VOC2007/JPEGImages/006404.jpg 320 500 9 121 232 176 270 +3226 /data/VOCdevkit/VOC2007/JPEGImages/006409.jpg 500 375 14 304 98 500 375 14 1 128 114 264 4 167 178 193 241 10 8 227 376 375 +3227 /data/VOCdevkit/VOC2007/JPEGImages/006411.jpg 500 375 19 384 142 493 243 +3228 /data/VOCdevkit/VOC2007/JPEGImages/006417.jpg 500 375 6 78 109 401 262 6 1 126 79 278 6 8 116 105 190 6 283 82 499 233 +3229 /data/VOCdevkit/VOC2007/JPEGImages/006418.jpg 500 333 1 1 1 479 333 +3230 /data/VOCdevkit/VOC2007/JPEGImages/006419.jpg 333 500 8 57 348 153 485 8 127 406 217 500 +3231 /data/VOCdevkit/VOC2007/JPEGImages/006421.jpg 500 333 6 318 161 358 186 6 59 158 158 198 +3232 /data/VOCdevkit/VOC2007/JPEGImages/006424.jpg 500 375 17 203 180 496 375 8 1 288 217 375 +3233 /data/VOCdevkit/VOC2007/JPEGImages/006425.jpg 339 500 7 74 37 300 490 +3234 /data/VOCdevkit/VOC2007/JPEGImages/006427.jpg 500 375 14 265 47 500 375 14 27 49 297 375 14 1 153 22 195 +3235 /data/VOCdevkit/VOC2007/JPEGImages/006428.jpg 500 375 12 2 33 500 375 14 93 169 152 312 14 1 257 64 375 +3236 /data/VOCdevkit/VOC2007/JPEGImages/006429.jpg 332 500 12 1 2 328 500 +3237 /data/VOCdevkit/VOC2007/JPEGImages/006430.jpg 500 375 2 274 163 293 224 +3238 /data/VOCdevkit/VOC2007/JPEGImages/006433.jpg 500 375 0 1 1 500 375 14 212 65 249 119 +3239 /data/VOCdevkit/VOC2007/JPEGImages/006434.jpg 500 375 11 147 1 500 375 +3240 /data/VOCdevkit/VOC2007/JPEGImages/006436.jpg 500 375 3 170 36 376 282 +3241 /data/VOCdevkit/VOC2007/JPEGImages/006437.jpg 500 332 5 164 147 281 180 +3242 /data/VOCdevkit/VOC2007/JPEGImages/006438.jpg 500 332 6 192 97 359 225 6 1 87 40 140 +3243 /data/VOCdevkit/VOC2007/JPEGImages/006440.jpg 500 311 13 307 137 500 305 14 270 123 313 266 +3244 /data/VOCdevkit/VOC2007/JPEGImages/006442.jpg 348 500 14 2 29 195 500 14 130 181 347 500 +3245 /data/VOCdevkit/VOC2007/JPEGImages/006443.jpg 500 350 0 117 131 295 216 +3246 /data/VOCdevkit/VOC2007/JPEGImages/006444.jpg 500 375 11 134 146 271 364 14 411 3 500 229 +3247 /data/VOCdevkit/VOC2007/JPEGImages/006445.jpg 443 480 12 65 156 401 459 14 174 101 299 272 +3248 /data/VOCdevkit/VOC2007/JPEGImages/006447.jpg 310 233 8 133 163 189 232 8 190 139 257 232 8 8 144 86 233 10 97 141 242 233 15 70 32 105 104 +3249 /data/VOCdevkit/VOC2007/JPEGImages/006448.jpg 500 375 4 344 69 392 250 4 395 109 427 235 +3250 /data/VOCdevkit/VOC2007/JPEGImages/006449.jpg 500 375 1 2 15 500 367 +3251 /data/VOCdevkit/VOC2007/JPEGImages/006450.jpg 500 322 14 99 125 316 319 14 305 47 413 322 19 1 157 111 321 +3252 /data/VOCdevkit/VOC2007/JPEGImages/006455.jpg 320 212 12 85 42 254 199 14 119 11 167 137 +3253 /data/VOCdevkit/VOC2007/JPEGImages/006456.jpg 500 375 11 48 36 373 313 +3254 /data/VOCdevkit/VOC2007/JPEGImages/006458.jpg 500 314 6 196 62 493 271 6 26 110 235 265 +3255 /data/VOCdevkit/VOC2007/JPEGImages/006459.jpg 500 375 12 52 115 332 354 14 174 65 255 210 14 283 118 368 349 14 427 135 457 214 14 461 128 499 254 14 1 147 42 248 6 375 142 433 176 +3256 /data/VOCdevkit/VOC2007/JPEGImages/006462.jpg 375 500 7 67 2 375 500 +3257 /data/VOCdevkit/VOC2007/JPEGImages/006463.jpg 500 333 14 1 4 236 333 14 153 27 465 333 +3258 /data/VOCdevkit/VOC2007/JPEGImages/006465.jpg 500 375 14 75 202 279 375 14 1 168 54 375 14 370 224 492 375 14 298 225 376 375 14 220 202 467 375 14 140 153 182 210 +3259 /data/VOCdevkit/VOC2007/JPEGImages/006466.jpg 500 375 18 1 24 482 358 +3260 /data/VOCdevkit/VOC2007/JPEGImages/006468.jpg 500 375 18 199 129 358 247 +3261 /data/VOCdevkit/VOC2007/JPEGImages/006470.jpg 500 452 2 192 133 287 324 +3262 /data/VOCdevkit/VOC2007/JPEGImages/006472.jpg 500 400 19 48 1 500 312 +3263 /data/VOCdevkit/VOC2007/JPEGImages/006473.jpg 500 374 7 223 83 421 223 19 24 104 235 287 +3264 /data/VOCdevkit/VOC2007/JPEGImages/006474.jpg 500 333 11 1 28 500 333 +3265 /data/VOCdevkit/VOC2007/JPEGImages/006475.jpg 361 500 2 137 379 259 500 14 143 8 332 436 +3266 /data/VOCdevkit/VOC2007/JPEGImages/006476.jpg 500 368 14 133 198 146 238 14 256 98 447 367 13 217 200 479 367 +3267 /data/VOCdevkit/VOC2007/JPEGImages/006480.jpg 500 320 0 119 110 210 155 +3268 /data/VOCdevkit/VOC2007/JPEGImages/006482.jpg 500 375 14 30 31 406 375 +3269 /data/VOCdevkit/VOC2007/JPEGImages/006483.jpg 500 377 14 100 32 379 377 4 307 146 348 221 4 316 191 338 254 4 281 151 305 217 +3270 /data/VOCdevkit/VOC2007/JPEGImages/006484.jpg 500 333 6 301 192 458 329 +3271 /data/VOCdevkit/VOC2007/JPEGImages/006486.jpg 500 375 4 65 259 98 346 14 1 160 160 352 14 75 113 170 257 14 210 85 313 238 14 324 135 429 312 +3272 /data/VOCdevkit/VOC2007/JPEGImages/006488.jpg 500 425 11 143 185 420 358 14 245 51 498 359 +3273 /data/VOCdevkit/VOC2007/JPEGImages/006492.jpg 500 375 14 115 33 478 375 14 166 168 321 366 +3274 /data/VOCdevkit/VOC2007/JPEGImages/006495.jpg 500 375 7 196 150 338 365 +3275 /data/VOCdevkit/VOC2007/JPEGImages/006497.jpg 500 375 6 22 84 489 264 6 97 64 216 121 14 461 98 491 153 14 426 103 452 135 14 390 97 413 128 14 166 104 185 119 +3276 /data/VOCdevkit/VOC2007/JPEGImages/006499.jpg 500 333 18 1 89 320 304 +3277 /data/VOCdevkit/VOC2007/JPEGImages/006501.jpg 500 211 5 118 1 500 211 +3278 /data/VOCdevkit/VOC2007/JPEGImages/006503.jpg 500 375 4 435 84 461 159 4 394 80 416 137 14 307 109 474 327 14 219 86 350 270 14 1 60 100 247 10 3 201 479 375 +3279 /data/VOCdevkit/VOC2007/JPEGImages/006506.jpg 500 332 12 362 133 500 281 12 318 153 386 271 12 236 142 287 285 12 164 175 215 271 12 3 201 115 305 12 72 170 122 276 14 399 109 454 226 14 320 124 376 223 14 231 122 291 233 14 163 133 218 235 14 74 142 121 242 14 31 143 82 260 +3280 /data/VOCdevkit/VOC2007/JPEGImages/006507.jpg 500 375 11 160 89 263 223 +3281 /data/VOCdevkit/VOC2007/JPEGImages/006509.jpg 333 500 8 203 227 283 317 8 1 295 69 379 17 1 231 107 307 +3282 /data/VOCdevkit/VOC2007/JPEGImages/006512.jpg 500 375 7 86 66 415 375 +3283 /data/VOCdevkit/VOC2007/JPEGImages/006515.jpg 500 375 1 26 66 470 320 +3284 /data/VOCdevkit/VOC2007/JPEGImages/006519.jpg 500 375 14 4 114 172 369 14 139 105 380 375 14 177 87 500 353 4 329 262 357 375 10 80 313 499 375 +3285 /data/VOCdevkit/VOC2007/JPEGImages/006520.jpg 325 500 2 57 41 254 488 +3286 /data/VOCdevkit/VOC2007/JPEGImages/006523.jpg 500 375 0 189 186 312 230 +3287 /data/VOCdevkit/VOC2007/JPEGImages/006524.jpg 500 97 6 278 2 495 95 6 125 3 302 91 6 1 1 138 94 +3288 /data/VOCdevkit/VOC2007/JPEGImages/006529.jpg 500 375 14 4 48 214 375 0 171 77 394 256 +3289 /data/VOCdevkit/VOC2007/JPEGImages/006530.jpg 500 375 8 40 176 192 282 17 216 180 500 330 8 244 262 500 375 8 3 168 41 251 +3290 /data/VOCdevkit/VOC2007/JPEGImages/006532.jpg 500 375 13 116 156 412 288 14 205 124 331 223 +3291 /data/VOCdevkit/VOC2007/JPEGImages/006534.jpg 400 280 16 46 29 313 258 +3292 /data/VOCdevkit/VOC2007/JPEGImages/006536.jpg 334 500 14 28 194 334 500 +3293 /data/VOCdevkit/VOC2007/JPEGImages/006538.jpg 500 333 18 119 94 308 258 +3294 /data/VOCdevkit/VOC2007/JPEGImages/006542.jpg 500 374 14 431 172 457 229 14 414 172 433 228 14 394 175 415 227 14 181 84 194 135 14 136 84 154 134 14 122 89 137 137 14 104 86 129 134 14 88 84 107 137 14 34 87 48 104 3 1 1 500 372 +3295 /data/VOCdevkit/VOC2007/JPEGImages/006543.jpg 500 333 2 174 25 309 160 +3296 /data/VOCdevkit/VOC2007/JPEGImages/006547.jpg 333 500 7 23 97 273 500 +3297 /data/VOCdevkit/VOC2007/JPEGImages/006548.jpg 500 375 2 174 210 474 371 2 299 139 356 221 2 188 116 256 199 2 144 140 173 188 2 1 132 93 250 +3298 /data/VOCdevkit/VOC2007/JPEGImages/006549.jpg 375 500 3 176 20 247 68 +3299 /data/VOCdevkit/VOC2007/JPEGImages/006550.jpg 500 333 13 44 180 289 330 14 290 141 355 322 14 207 114 283 223 14 338 150 379 316 1 12 196 61 305 1 433 195 491 259 14 460 273 480 302 +3300 /data/VOCdevkit/VOC2007/JPEGImages/006551.jpg 500 375 1 260 198 362 311 1 226 183 319 273 1 104 181 216 287 14 107 110 199 269 14 227 126 286 207 14 261 125 355 269 14 5 96 32 148 14 31 100 64 150 14 63 98 89 148 14 13 125 80 235 14 61 135 111 231 14 95 129 128 177 14 334 111 368 153 14 370 110 395 153 14 390 108 425 227 14 423 117 450 155 14 447 116 496 225 +3301 /data/VOCdevkit/VOC2007/JPEGImages/006553.jpg 366 500 8 160 219 351 486 +3302 /data/VOCdevkit/VOC2007/JPEGImages/006556.jpg 500 333 11 2 2 500 333 +3303 /data/VOCdevkit/VOC2007/JPEGImages/006560.jpg 500 375 14 1 28 246 375 14 223 31 500 375 +3304 /data/VOCdevkit/VOC2007/JPEGImages/006562.jpg 500 247 9 281 116 399 234 9 181 108 281 235 9 87 87 171 236 9 1 15 74 237 9 60 160 100 222 +3305 /data/VOCdevkit/VOC2007/JPEGImages/006564.jpg 500 332 0 1 58 500 232 +3306 /data/VOCdevkit/VOC2007/JPEGImages/006565.jpg 500 373 7 1 134 401 373 +3307 /data/VOCdevkit/VOC2007/JPEGImages/006569.jpg 500 229 5 183 83 385 157 5 32 97 141 154 +3308 /data/VOCdevkit/VOC2007/JPEGImages/006570.jpg 500 375 11 1 54 311 237 11 107 129 334 328 +3309 /data/VOCdevkit/VOC2007/JPEGImages/006572.jpg 500 333 12 143 33 315 248 14 80 82 152 167 +3310 /data/VOCdevkit/VOC2007/JPEGImages/006575.jpg 375 500 15 81 52 310 461 +3311 /data/VOCdevkit/VOC2007/JPEGImages/006576.jpg 375 500 4 37 171 113 440 14 25 1 375 475 14 1 2 117 253 14 124 139 162 180 +3312 /data/VOCdevkit/VOC2007/JPEGImages/006578.jpg 333 500 14 93 52 292 334 14 4 168 275 428 +3313 /data/VOCdevkit/VOC2007/JPEGImages/006583.jpg 500 324 14 84 86 339 324 19 258 60 374 214 19 367 64 425 168 +3314 /data/VOCdevkit/VOC2007/JPEGImages/006584.jpg 500 331 14 122 87 174 164 14 191 98 210 124 14 212 79 275 283 14 242 86 286 233 14 86 101 182 214 14 143 99 241 327 14 2 39 217 331 14 233 39 373 331 14 384 57 484 323 +3315 /data/VOCdevkit/VOC2007/JPEGImages/006585.jpg 500 331 14 168 41 325 234 13 143 101 331 258 +3316 /data/VOCdevkit/VOC2007/JPEGImages/006587.jpg 500 375 14 213 31 288 198 +3317 /data/VOCdevkit/VOC2007/JPEGImages/006588.jpg 500 333 18 104 28 451 311 6 5 193 86 234 6 86 200 131 227 14 473 187 488 211 +3318 /data/VOCdevkit/VOC2007/JPEGImages/006593.jpg 500 333 6 2 3 499 333 +3319 /data/VOCdevkit/VOC2007/JPEGImages/006595.jpg 500 334 7 118 24 457 304 +3320 /data/VOCdevkit/VOC2007/JPEGImages/006597.jpg 500 384 11 19 17 445 305 +3321 /data/VOCdevkit/VOC2007/JPEGImages/006599.jpg 500 375 8 100 1 248 209 14 37 1 158 262 14 224 1 500 375 +3322 /data/VOCdevkit/VOC2007/JPEGImages/006602.jpg 356 500 11 92 121 205 237 14 202 365 293 489 14 22 254 85 445 14 99 365 191 465 +3323 /data/VOCdevkit/VOC2007/JPEGImages/006603.jpg 330 500 1 12 323 78 427 +3324 /data/VOCdevkit/VOC2007/JPEGImages/006605.jpg 500 375 8 158 186 235 311 8 340 199 412 313 8 246 222 360 375 8 142 214 256 361 15 86 181 134 218 15 49 96 96 243 +3325 /data/VOCdevkit/VOC2007/JPEGImages/006606.jpg 500 333 11 92 134 417 290 11 118 89 263 181 +3326 /data/VOCdevkit/VOC2007/JPEGImages/006609.jpg 500 375 11 214 156 500 375 14 1 15 500 375 +3327 /data/VOCdevkit/VOC2007/JPEGImages/006610.jpg 500 375 4 72 36 151 284 4 143 50 220 288 14 118 1 439 117 +3328 /data/VOCdevkit/VOC2007/JPEGImages/006611.jpg 332 500 12 80 135 224 393 14 181 237 295 382 +3329 /data/VOCdevkit/VOC2007/JPEGImages/006612.jpg 375 500 14 180 204 266 412 9 74 201 218 314 +3330 /data/VOCdevkit/VOC2007/JPEGImages/006617.jpg 500 332 12 88 89 362 267 14 224 36 281 192 +3331 /data/VOCdevkit/VOC2007/JPEGImages/006618.jpg 500 331 13 89 100 397 257 14 131 49 251 284 +3332 /data/VOCdevkit/VOC2007/JPEGImages/006619.jpg 500 333 0 110 128 222 195 +3333 /data/VOCdevkit/VOC2007/JPEGImages/006621.jpg 500 375 17 142 2 426 120 14 159 166 290 343 +3334 /data/VOCdevkit/VOC2007/JPEGImages/006622.jpg 500 332 17 242 123 456 236 19 26 73 111 151 +3335 /data/VOCdevkit/VOC2007/JPEGImages/006625.jpg 500 375 6 284 151 319 177 6 120 141 179 213 6 17 146 111 243 14 102 153 152 266 14 69 157 100 261 14 19 156 58 283 +3336 /data/VOCdevkit/VOC2007/JPEGImages/006626.jpg 500 332 14 443 106 500 213 14 277 113 372 285 14 185 101 355 303 14 2 77 258 332 4 408 207 426 268 4 442 188 464 239 +3337 /data/VOCdevkit/VOC2007/JPEGImages/006627.jpg 500 333 15 466 104 500 140 15 261 93 373 190 10 1 130 462 333 +3338 /data/VOCdevkit/VOC2007/JPEGImages/006628.jpg 500 375 8 64 128 113 155 8 157 124 190 171 8 172 137 209 182 8 213 144 252 195 8 249 161 291 216 8 133 207 271 375 8 17 179 152 373 10 48 150 216 375 19 386 104 429 140 +3339 /data/VOCdevkit/VOC2007/JPEGImages/006631.jpg 500 327 14 275 6 500 327 14 94 19 337 327 +3340 /data/VOCdevkit/VOC2007/JPEGImages/006632.jpg 500 375 6 300 256 472 365 1 224 276 270 315 +3341 /data/VOCdevkit/VOC2007/JPEGImages/006635.jpg 342 500 18 14 61 342 471 +3342 /data/VOCdevkit/VOC2007/JPEGImages/006636.jpg 500 375 0 26 75 355 238 +3343 /data/VOCdevkit/VOC2007/JPEGImages/006637.jpg 500 375 1 352 207 447 372 1 165 158 278 259 1 107 174 172 304 14 325 110 366 316 14 200 87 259 255 14 106 107 210 288 +3344 /data/VOCdevkit/VOC2007/JPEGImages/006638.jpg 500 400 17 25 110 445 325 +3345 /data/VOCdevkit/VOC2007/JPEGImages/006643.jpg 500 375 2 180 39 452 375 +3346 /data/VOCdevkit/VOC2007/JPEGImages/006645.jpg 332 500 14 44 171 185 379 12 133 109 289 370 +3347 /data/VOCdevkit/VOC2007/JPEGImages/006647.jpg 500 375 14 179 66 272 290 14 172 38 317 349 14 276 2 426 252 13 1 32 498 365 +3348 /data/VOCdevkit/VOC2007/JPEGImages/006648.jpg 500 334 4 293 2 435 334 14 3 1 463 332 14 372 204 416 285 14 312 183 346 283 +3349 /data/VOCdevkit/VOC2007/JPEGImages/006652.jpg 500 332 18 172 62 328 244 +3350 /data/VOCdevkit/VOC2007/JPEGImages/006654.jpg 500 333 6 1 8 157 140 +3351 /data/VOCdevkit/VOC2007/JPEGImages/006657.jpg 500 359 7 190 72 341 269 +3352 /data/VOCdevkit/VOC2007/JPEGImages/006658.jpg 500 375 10 119 158 382 345 14 160 99 204 186 14 200 104 264 205 14 259 102 327 209 14 304 117 387 219 14 362 131 415 222 14 288 145 490 375 14 1 96 71 269 14 39 86 137 239 14 79 121 297 372 8 1 215 72 373 +3353 /data/VOCdevkit/VOC2007/JPEGImages/006660.jpg 500 400 6 47 273 295 378 3 1 200 164 262 3 276 1 500 292 +3354 /data/VOCdevkit/VOC2007/JPEGImages/006661.jpg 500 333 1 75 147 134 220 1 191 147 213 188 14 77 96 132 210 14 144 111 175 188 14 182 123 215 186 +3355 /data/VOCdevkit/VOC2007/JPEGImages/006664.jpg 500 375 1 1 133 327 338 14 23 58 255 298 +3356 /data/VOCdevkit/VOC2007/JPEGImages/006666.jpg 375 500 14 8 97 375 500 14 8 154 334 434 +3357 /data/VOCdevkit/VOC2007/JPEGImages/006667.jpg 500 375 14 192 94 429 375 +3358 /data/VOCdevkit/VOC2007/JPEGImages/006668.jpg 500 374 6 94 28 435 334 14 27 69 134 214 14 1 1 70 258 +3359 /data/VOCdevkit/VOC2007/JPEGImages/006670.jpg 500 500 18 33 181 410 465 14 432 300 474 426 +3360 /data/VOCdevkit/VOC2007/JPEGImages/006671.jpg 500 375 2 57 168 201 244 2 268 103 446 235 +3361 /data/VOCdevkit/VOC2007/JPEGImages/006673.jpg 500 333 3 394 42 445 234 3 353 81 390 207 3 309 52 372 246 3 294 110 324 196 3 242 70 275 212 3 230 117 245 189 3 214 112 239 201 3 187 114 210 195 3 171 107 206 223 3 137 105 171 213 +3362 /data/VOCdevkit/VOC2007/JPEGImages/006674.jpg 332 500 7 41 58 250 500 +3363 /data/VOCdevkit/VOC2007/JPEGImages/006677.jpg 413 500 8 1 279 75 458 14 67 235 333 500 +3364 /data/VOCdevkit/VOC2007/JPEGImages/006678.jpg 500 375 16 133 96 459 365 +3365 /data/VOCdevkit/VOC2007/JPEGImages/006679.jpg 500 375 16 327 117 488 331 16 31 88 189 317 16 164 29 334 309 +3366 /data/VOCdevkit/VOC2007/JPEGImages/006681.jpg 500 375 15 65 228 86 258 15 244 222 262 250 15 309 220 330 246 15 351 214 372 245 +3367 /data/VOCdevkit/VOC2007/JPEGImages/006682.jpg 500 375 14 307 74 499 373 14 1 127 115 375 14 116 50 314 371 +3368 /data/VOCdevkit/VOC2007/JPEGImages/006684.jpg 500 375 19 76 20 393 351 19 376 64 500 266 +3369 /data/VOCdevkit/VOC2007/JPEGImages/006687.jpg 500 357 4 358 2 426 103 +3370 /data/VOCdevkit/VOC2007/JPEGImages/006689.jpg 500 374 8 300 230 448 374 8 178 185 242 298 8 8 229 224 374 8 249 182 281 269 10 144 186 253 278 +3371 /data/VOCdevkit/VOC2007/JPEGImages/006690.jpg 500 333 14 203 124 295 294 14 53 106 153 294 14 125 50 227 231 +3372 /data/VOCdevkit/VOC2007/JPEGImages/006694.jpg 500 375 18 100 52 500 248 +3373 /data/VOCdevkit/VOC2007/JPEGImages/006695.jpg 500 375 14 307 153 433 370 14 196 123 327 373 14 72 138 206 375 +3374 /data/VOCdevkit/VOC2007/JPEGImages/006696.jpg 500 440 14 36 77 163 368 14 291 160 358 261 14 390 110 500 314 10 1 326 454 439 +3375 /data/VOCdevkit/VOC2007/JPEGImages/006697.jpg 500 375 14 41 77 260 337 14 255 82 500 375 +3376 /data/VOCdevkit/VOC2007/JPEGImages/006698.jpg 500 375 14 245 1 495 375 14 70 128 387 375 +3377 /data/VOCdevkit/VOC2007/JPEGImages/006699.jpg 375 500 14 38 3 375 274 +3378 /data/VOCdevkit/VOC2007/JPEGImages/006702.jpg 500 333 0 274 108 496 227 0 37 180 199 238 +3379 /data/VOCdevkit/VOC2007/JPEGImages/006703.jpg 334 500 14 89 102 223 337 +3380 /data/VOCdevkit/VOC2007/JPEGImages/006704.jpg 500 375 19 34 1 341 213 +3381 /data/VOCdevkit/VOC2007/JPEGImages/006706.jpg 375 500 2 44 127 341 496 6 300 17 375 134 6 2 41 198 217 +3382 /data/VOCdevkit/VOC2007/JPEGImages/006707.jpg 500 375 8 252 6 417 265 14 118 53 362 354 +3383 /data/VOCdevkit/VOC2007/JPEGImages/006708.jpg 500 375 9 164 151 206 182 9 305 181 380 286 9 398 181 452 281 +3384 /data/VOCdevkit/VOC2007/JPEGImages/006709.jpg 500 375 14 113 146 181 223 14 187 159 272 238 14 394 110 500 252 +3385 /data/VOCdevkit/VOC2007/JPEGImages/006714.jpg 375 500 14 3 79 373 500 +3386 /data/VOCdevkit/VOC2007/JPEGImages/006718.jpg 500 375 1 91 193 122 258 14 76 147 101 255 +3387 /data/VOCdevkit/VOC2007/JPEGImages/006719.jpg 500 375 6 420 46 500 170 6 241 40 404 195 6 150 40 209 73 6 221 40 266 70 +3388 /data/VOCdevkit/VOC2007/JPEGImages/006722.jpg 500 375 12 161 115 395 375 12 368 164 500 326 12 129 164 186 327 14 238 28 334 266 14 410 86 472 254 14 108 105 190 255 +3389 /data/VOCdevkit/VOC2007/JPEGImages/006725.jpg 500 333 7 153 81 422 248 +3390 /data/VOCdevkit/VOC2007/JPEGImages/006726.jpg 375 500 15 78 333 230 472 +3391 /data/VOCdevkit/VOC2007/JPEGImages/006727.jpg 500 375 17 54 124 470 287 4 150 206 174 266 4 31 192 72 280 14 75 116 200 264 14 263 110 436 255 +3392 /data/VOCdevkit/VOC2007/JPEGImages/006730.jpg 500 375 18 5 174 465 338 +3393 /data/VOCdevkit/VOC2007/JPEGImages/006731.jpg 500 375 4 401 120 466 333 14 175 46 352 279 14 55 78 192 273 10 1 259 500 375 +3394 /data/VOCdevkit/VOC2007/JPEGImages/006734.jpg 500 375 6 164 126 479 367 +3395 /data/VOCdevkit/VOC2007/JPEGImages/006735.jpg 444 500 11 40 24 402 490 +3396 /data/VOCdevkit/VOC2007/JPEGImages/006736.jpg 500 375 6 102 170 282 241 +3397 /data/VOCdevkit/VOC2007/JPEGImages/006738.jpg 500 375 14 208 135 274 283 14 72 159 114 250 1 212 199 277 314 1 79 196 118 261 +3398 /data/VOCdevkit/VOC2007/JPEGImages/006739.jpg 500 375 14 114 8 431 375 2 23 160 190 285 2 188 180 288 375 +3399 /data/VOCdevkit/VOC2007/JPEGImages/006740.jpg 500 375 7 56 29 442 295 +3400 /data/VOCdevkit/VOC2007/JPEGImages/006747.jpg 500 375 13 139 3 341 334 +3401 /data/VOCdevkit/VOC2007/JPEGImages/006748.jpg 338 500 6 47 265 213 385 6 178 180 337 279 +3402 /data/VOCdevkit/VOC2007/JPEGImages/006751.jpg 500 317 2 247 109 454 283 2 91 39 241 144 +3403 /data/VOCdevkit/VOC2007/JPEGImages/006753.jpg 332 500 14 80 35 260 500 14 251 85 332 500 14 254 1 332 246 14 204 1 250 43 14 44 1 222 500 +3404 /data/VOCdevkit/VOC2007/JPEGImages/006755.jpg 500 375 8 2 169 213 375 15 169 46 240 117 19 265 152 341 223 19 340 146 416 254 +3405 /data/VOCdevkit/VOC2007/JPEGImages/006759.jpg 500 375 5 3 127 444 375 +3406 /data/VOCdevkit/VOC2007/JPEGImages/006760.jpg 500 374 7 204 87 334 258 19 450 175 500 374 19 2 2 253 211 +3407 /data/VOCdevkit/VOC2007/JPEGImages/006761.jpg 500 375 9 131 193 348 322 +3408 /data/VOCdevkit/VOC2007/JPEGImages/006762.jpg 500 375 13 81 229 222 351 14 249 192 290 296 14 125 197 192 322 +3409 /data/VOCdevkit/VOC2007/JPEGImages/006765.jpg 376 500 15 264 338 360 470 15 1 203 50 312 15 96 146 183 201 15 240 166 274 195 +3410 /data/VOCdevkit/VOC2007/JPEGImages/006766.jpg 500 375 5 100 289 499 357 6 298 339 475 375 6 263 309 442 372 6 58 345 231 375 +3411 /data/VOCdevkit/VOC2007/JPEGImages/006768.jpg 482 500 8 16 167 312 500 14 109 72 376 310 +3412 /data/VOCdevkit/VOC2007/JPEGImages/006769.jpg 500 355 12 111 99 487 354 11 74 190 124 253 +3413 /data/VOCdevkit/VOC2007/JPEGImages/006772.jpg 500 349 14 243 58 419 349 14 88 70 270 349 +3414 /data/VOCdevkit/VOC2007/JPEGImages/006773.jpg 500 375 0 4 127 440 333 3 3 200 25 260 +3415 /data/VOCdevkit/VOC2007/JPEGImages/006777.jpg 352 500 15 115 170 249 351 14 150 140 329 443 14 26 125 253 500 +3416 /data/VOCdevkit/VOC2007/JPEGImages/006781.jpg 234 367 7 7 10 220 367 +3417 /data/VOCdevkit/VOC2007/JPEGImages/006782.jpg 333 500 14 1 104 222 500 +3418 /data/VOCdevkit/VOC2007/JPEGImages/006783.jpg 333 500 6 1 227 59 332 6 77 220 167 275 6 144 221 194 254 14 64 211 84 250 +3419 /data/VOCdevkit/VOC2007/JPEGImages/006784.jpg 500 375 14 181 103 212 142 14 217 88 241 124 14 264 80 291 117 14 291 69 329 167 14 232 46 469 375 14 386 33 448 134 +3420 /data/VOCdevkit/VOC2007/JPEGImages/006786.jpg 500 375 14 82 1 324 358 14 296 24 451 328 +3421 /data/VOCdevkit/VOC2007/JPEGImages/006789.jpg 267 320 14 83 33 166 162 14 47 169 90 269 12 56 43 214 310 +3422 /data/VOCdevkit/VOC2007/JPEGImages/006794.jpg 500 333 0 92 117 373 203 +3423 /data/VOCdevkit/VOC2007/JPEGImages/006797.jpg 500 375 14 181 65 384 374 12 1 46 242 371 +3424 /data/VOCdevkit/VOC2007/JPEGImages/006799.jpg 500 500 2 143 75 357 409 +3425 /data/VOCdevkit/VOC2007/JPEGImages/006800.jpg 500 375 2 148 164 176 195 2 175 110 213 202 14 283 189 375 375 14 361 200 432 375 14 402 164 500 375 +3426 /data/VOCdevkit/VOC2007/JPEGImages/006802.jpg 500 350 18 131 2 499 349 14 344 99 366 119 14 209 89 258 231 +3427 /data/VOCdevkit/VOC2007/JPEGImages/006803.jpg 400 500 18 68 167 311 356 14 305 323 333 412 +3428 /data/VOCdevkit/VOC2007/JPEGImages/006805.jpg 500 401 11 36 13 447 397 +3429 /data/VOCdevkit/VOC2007/JPEGImages/006806.jpg 500 375 15 93 114 351 360 15 294 1 500 196 15 95 1 299 124 15 1 2 89 301 +3430 /data/VOCdevkit/VOC2007/JPEGImages/006808.jpg 500 375 14 33 11 266 375 +3431 /data/VOCdevkit/VOC2007/JPEGImages/006810.jpg 500 375 14 334 39 500 375 14 20 148 114 357 +3432 /data/VOCdevkit/VOC2007/JPEGImages/006813.jpg 500 291 7 214 56 498 199 7 3 93 224 283 +3433 /data/VOCdevkit/VOC2007/JPEGImages/006814.jpg 500 375 19 1 214 471 375 +3434 /data/VOCdevkit/VOC2007/JPEGImages/006819.jpg 500 375 10 92 185 309 333 8 97 167 146 290 8 129 178 206 328 8 217 209 286 337 +3435 /data/VOCdevkit/VOC2007/JPEGImages/006821.jpg 500 371 5 176 140 282 246 6 373 194 500 301 6 319 193 367 224 14 15 177 54 290 +3436 /data/VOCdevkit/VOC2007/JPEGImages/006822.jpg 400 500 13 67 8 334 496 +3437 /data/VOCdevkit/VOC2007/JPEGImages/006824.jpg 500 333 14 127 3 382 287 +3438 /data/VOCdevkit/VOC2007/JPEGImages/006825.jpg 500 333 2 150 54 447 278 +3439 /data/VOCdevkit/VOC2007/JPEGImages/006827.jpg 375 500 17 1 199 211 386 +3440 /data/VOCdevkit/VOC2007/JPEGImages/006828.jpg 500 426 4 61 30 219 360 +3441 /data/VOCdevkit/VOC2007/JPEGImages/006829.jpg 500 375 11 1 65 424 375 +3442 /data/VOCdevkit/VOC2007/JPEGImages/006833.jpg 500 375 16 201 195 500 375 14 60 40 353 375 +3443 /data/VOCdevkit/VOC2007/JPEGImages/006835.jpg 500 375 14 205 6 500 375 +3444 /data/VOCdevkit/VOC2007/JPEGImages/006836.jpg 469 480 12 112 76 393 425 14 153 61 323 263 +3445 /data/VOCdevkit/VOC2007/JPEGImages/006838.jpg 500 333 14 230 35 500 332 +3446 /data/VOCdevkit/VOC2007/JPEGImages/006839.jpg 500 375 13 29 13 459 351 +3447 /data/VOCdevkit/VOC2007/JPEGImages/006840.jpg 500 333 14 58 19 368 333 +3448 /data/VOCdevkit/VOC2007/JPEGImages/006841.jpg 500 316 9 196 147 376 307 14 386 106 436 284 +3449 /data/VOCdevkit/VOC2007/JPEGImages/006842.jpg 500 375 19 258 70 481 288 19 29 70 256 283 +3450 /data/VOCdevkit/VOC2007/JPEGImages/006844.jpg 500 375 18 87 105 492 237 +3451 /data/VOCdevkit/VOC2007/JPEGImages/006845.jpg 500 375 8 171 257 246 331 8 257 222 298 265 8 323 224 369 272 +3452 /data/VOCdevkit/VOC2007/JPEGImages/006847.jpg 500 335 12 68 139 180 300 12 187 96 397 286 14 235 67 297 214 14 85 91 139 242 +3453 /data/VOCdevkit/VOC2007/JPEGImages/006848.jpg 500 333 2 79 169 316 255 +3454 /data/VOCdevkit/VOC2007/JPEGImages/006849.jpg 500 375 11 51 94 285 195 11 236 117 500 274 +3455 /data/VOCdevkit/VOC2007/JPEGImages/006850.jpg 390 500 14 42 40 221 328 12 3 89 321 410 +3456 /data/VOCdevkit/VOC2007/JPEGImages/006852.jpg 500 281 17 122 156 324 253 8 327 164 447 277 +3457 /data/VOCdevkit/VOC2007/JPEGImages/006855.jpg 312 500 1 24 33 309 496 14 24 1 66 105 14 1 1 31 114 +3458 /data/VOCdevkit/VOC2007/JPEGImages/006858.jpg 500 375 12 122 128 205 295 14 196 43 299 300 6 1 75 137 186 +3459 /data/VOCdevkit/VOC2007/JPEGImages/006859.jpg 500 372 15 181 1 299 110 15 297 1 500 371 +3460 /data/VOCdevkit/VOC2007/JPEGImages/006860.jpg 500 333 0 173 125 305 196 +3461 /data/VOCdevkit/VOC2007/JPEGImages/006862.jpg 500 375 12 115 15 328 375 14 364 171 387 252 14 344 169 371 227 14 298 175 334 349 14 222 205 252 284 14 8 146 68 333 +3462 /data/VOCdevkit/VOC2007/JPEGImages/006864.jpg 500 334 14 336 1 500 325 14 237 6 380 283 +3463 /data/VOCdevkit/VOC2007/JPEGImages/006865.jpg 500 333 2 29 16 312 287 +3464 /data/VOCdevkit/VOC2007/JPEGImages/006866.jpg 480 392 14 221 44 331 218 12 43 56 407 374 14 94 130 129 177 +3465 /data/VOCdevkit/VOC2007/JPEGImages/006867.jpg 360 269 3 2 2 360 269 +3466 /data/VOCdevkit/VOC2007/JPEGImages/006868.jpg 500 375 6 79 185 341 372 6 52 193 168 259 14 235 181 325 372 +3467 /data/VOCdevkit/VOC2007/JPEGImages/006869.jpg 500 375 7 167 111 493 273 +3468 /data/VOCdevkit/VOC2007/JPEGImages/006874.jpg 500 375 13 242 244 372 326 3 364 45 401 61 13 111 168 169 211 14 202 317 252 375 14 259 213 321 298 14 71 110 86 161 +3469 /data/VOCdevkit/VOC2007/JPEGImages/006876.jpg 500 333 8 107 100 167 203 14 210 8 384 310 7 140 162 224 277 +3470 /data/VOCdevkit/VOC2007/JPEGImages/006878.jpg 500 375 17 262 211 500 322 17 1 204 296 375 +3471 /data/VOCdevkit/VOC2007/JPEGImages/006880.jpg 500 375 1 192 82 454 326 14 325 167 495 374 14 2 165 148 372 14 131 7 238 202 14 208 86 341 156 14 83 144 199 295 +3472 /data/VOCdevkit/VOC2007/JPEGImages/006883.jpg 500 375 7 93 131 252 250 +3473 /data/VOCdevkit/VOC2007/JPEGImages/006884.jpg 500 276 6 3 2 242 178 +3474 /data/VOCdevkit/VOC2007/JPEGImages/006886.jpg 500 254 8 19 42 214 206 17 218 38 496 215 +3475 /data/VOCdevkit/VOC2007/JPEGImages/006887.jpg 500 375 14 187 107 294 190 14 60 112 178 342 14 131 161 332 358 14 303 141 426 339 8 14 166 152 351 +3476 /data/VOCdevkit/VOC2007/JPEGImages/006892.jpg 500 375 4 222 160 353 375 4 194 167 264 375 +3477 /data/VOCdevkit/VOC2007/JPEGImages/006893.jpg 375 500 6 143 291 245 357 +3478 /data/VOCdevkit/VOC2007/JPEGImages/006896.jpg 500 375 14 187 111 224 241 14 58 137 89 271 14 29 149 72 262 14 1 135 121 375 14 118 119 167 261 +3479 /data/VOCdevkit/VOC2007/JPEGImages/006899.jpg 496 500 16 19 334 135 452 16 135 305 234 423 16 388 277 445 424 +3480 /data/VOCdevkit/VOC2007/JPEGImages/006900.jpg 500 375 6 1 117 150 203 6 1 151 61 310 6 86 120 490 337 6 327 82 465 185 +3481 /data/VOCdevkit/VOC2007/JPEGImages/006903.jpg 500 375 14 216 1 496 373 14 1 2 247 375 11 255 96 384 253 11 100 149 214 341 +3482 /data/VOCdevkit/VOC2007/JPEGImages/006908.jpg 500 375 14 2 89 398 375 14 139 93 264 375 14 130 54 295 287 14 264 66 436 225 14 259 65 451 375 4 63 193 91 298 4 218 293 242 363 4 396 85 419 145 4 146 36 178 89 4 233 135 252 182 4 263 220 300 287 +3483 /data/VOCdevkit/VOC2007/JPEGImages/006909.jpg 500 375 0 1 7 485 375 +3484 /data/VOCdevkit/VOC2007/JPEGImages/006910.jpg 500 335 2 2 192 114 335 2 29 228 122 335 2 184 123 285 215 14 61 16 436 335 14 5 130 81 335 +3485 /data/VOCdevkit/VOC2007/JPEGImages/006911.jpg 441 480 14 185 69 272 295 12 55 123 366 404 +3486 /data/VOCdevkit/VOC2007/JPEGImages/006912.jpg 500 375 10 2 74 500 375 4 235 1 267 84 +3487 /data/VOCdevkit/VOC2007/JPEGImages/006914.jpg 500 375 2 238 180 269 235 +3488 /data/VOCdevkit/VOC2007/JPEGImages/006916.jpg 500 332 11 299 73 500 328 11 5 87 351 331 +3489 /data/VOCdevkit/VOC2007/JPEGImages/006917.jpg 500 375 4 109 11 281 375 +3490 /data/VOCdevkit/VOC2007/JPEGImages/006918.jpg 500 375 6 149 112 418 300 6 1 147 172 230 +3491 /data/VOCdevkit/VOC2007/JPEGImages/006919.jpg 500 375 4 425 151 441 202 14 358 36 446 104 14 320 46 449 142 14 266 70 411 261 14 157 62 358 273 14 187 139 378 369 14 65 176 231 375 4 163 266 186 322 +3492 /data/VOCdevkit/VOC2007/JPEGImages/006922.jpg 500 333 0 126 71 480 227 +3493 /data/VOCdevkit/VOC2007/JPEGImages/006924.jpg 334 500 14 2 40 265 488 +3494 /data/VOCdevkit/VOC2007/JPEGImages/006930.jpg 500 375 17 2 136 493 375 +3495 /data/VOCdevkit/VOC2007/JPEGImages/006931.jpg 333 500 6 24 277 312 430 6 1 243 50 285 6 91 197 143 218 6 125 197 184 215 6 181 196 235 215 6 221 194 263 216 6 244 196 296 217 6 287 186 333 219 +3496 /data/VOCdevkit/VOC2007/JPEGImages/006932.jpg 500 375 14 312 245 385 375 14 249 57 306 132 +3497 /data/VOCdevkit/VOC2007/JPEGImages/006933.jpg 500 332 12 165 19 500 315 12 4 36 160 332 +3498 /data/VOCdevkit/VOC2007/JPEGImages/006934.jpg 500 375 14 415 56 500 284 14 199 101 284 247 14 99 142 244 364 14 1 61 210 375 14 14 71 68 165 +3499 /data/VOCdevkit/VOC2007/JPEGImages/006935.jpg 333 500 9 8 46 333 500 +3500 /data/VOCdevkit/VOC2007/JPEGImages/006939.jpg 500 375 14 217 2 500 375 14 1 32 229 375 4 115 78 132 148 4 130 73 150 149 4 147 71 171 149 +3501 /data/VOCdevkit/VOC2007/JPEGImages/006940.jpg 500 375 11 77 44 500 368 +3502 /data/VOCdevkit/VOC2007/JPEGImages/006943.jpg 500 375 18 121 82 310 297 18 284 78 500 313 14 64 159 88 231 14 2 135 58 375 +3503 /data/VOCdevkit/VOC2007/JPEGImages/006944.jpg 500 333 16 6 156 215 293 16 218 121 348 291 16 334 128 494 313 +3504 /data/VOCdevkit/VOC2007/JPEGImages/006945.jpg 333 500 14 11 133 165 500 14 116 125 309 500 14 142 4 248 135 1 2 83 146 237 1 266 49 330 165 +3505 /data/VOCdevkit/VOC2007/JPEGImages/006947.jpg 500 375 19 152 81 428 347 +3506 /data/VOCdevkit/VOC2007/JPEGImages/006948.jpg 500 375 4 126 298 199 375 14 182 4 500 375 14 2 30 170 375 14 243 230 288 262 +3507 /data/VOCdevkit/VOC2007/JPEGImages/006949.jpg 500 333 7 1 7 443 326 +3508 /data/VOCdevkit/VOC2007/JPEGImages/006950.jpg 333 500 14 103 159 225 372 1 61 209 194 387 +3509 /data/VOCdevkit/VOC2007/JPEGImages/006952.jpg 500 333 2 161 137 256 197 +3510 /data/VOCdevkit/VOC2007/JPEGImages/006953.jpg 500 375 3 260 184 313 218 +3511 /data/VOCdevkit/VOC2007/JPEGImages/006956.jpg 500 375 15 137 132 296 248 14 331 40 500 330 14 19 241 212 375 14 124 183 215 365 +3512 /data/VOCdevkit/VOC2007/JPEGImages/006958.jpg 333 500 14 25 2 333 500 +3513 /data/VOCdevkit/VOC2007/JPEGImages/006959.jpg 500 333 14 440 89 500 259 14 252 62 464 333 14 1 1 325 333 +3514 /data/VOCdevkit/VOC2007/JPEGImages/006962.jpg 500 375 11 353 196 467 284 +3515 /data/VOCdevkit/VOC2007/JPEGImages/006963.jpg 500 331 7 240 225 427 300 14 73 84 197 225 8 323 1 500 330 +3516 /data/VOCdevkit/VOC2007/JPEGImages/006965.jpg 500 375 3 159 68 242 235 3 255 202 500 374 14 210 177 242 208 +3517 /data/VOCdevkit/VOC2007/JPEGImages/006966.jpg 375 500 13 46 205 210 470 +3518 /data/VOCdevkit/VOC2007/JPEGImages/006968.jpg 500 375 17 225 160 500 301 11 158 215 267 349 14 88 53 201 297 14 262 121 377 273 +3519 /data/VOCdevkit/VOC2007/JPEGImages/006971.jpg 500 333 7 1 1 500 333 +3520 /data/VOCdevkit/VOC2007/JPEGImages/006972.jpg 500 333 10 2 121 500 333 +3521 /data/VOCdevkit/VOC2007/JPEGImages/006976.jpg 375 500 8 82 238 360 498 7 242 277 312 348 +3522 /data/VOCdevkit/VOC2007/JPEGImages/006981.jpg 500 375 14 183 94 253 273 +3523 /data/VOCdevkit/VOC2007/JPEGImages/006983.jpg 500 333 3 210 163 406 333 14 210 93 285 174 +3524 /data/VOCdevkit/VOC2007/JPEGImages/006987.jpg 500 372 19 417 83 474 133 14 258 15 436 227 14 155 62 259 221 +3525 /data/VOCdevkit/VOC2007/JPEGImages/006988.jpg 500 333 6 62 66 387 307 14 78 114 128 139 +3526 /data/VOCdevkit/VOC2007/JPEGImages/006989.jpg 500 375 7 171 95 497 375 14 2 3 203 375 +3527 /data/VOCdevkit/VOC2007/JPEGImages/006990.jpg 500 375 1 291 211 429 310 14 323 141 370 308 +3528 /data/VOCdevkit/VOC2007/JPEGImages/006994.jpg 500 301 11 24 2 484 268 +3529 /data/VOCdevkit/VOC2007/JPEGImages/006995.jpg 500 375 8 243 174 339 339 +3530 /data/VOCdevkit/VOC2007/JPEGImages/007002.jpg 500 333 5 291 195 500 325 +3531 /data/VOCdevkit/VOC2007/JPEGImages/007003.jpg 500 375 5 188 216 327 287 6 38 256 235 375 6 196 256 313 363 +3532 /data/VOCdevkit/VOC2007/JPEGImages/007004.jpg 500 375 1 102 238 150 320 14 100 201 150 303 6 318 206 463 280 6 160 197 199 222 +3533 /data/VOCdevkit/VOC2007/JPEGImages/007006.jpg 500 375 10 2 191 499 374 8 145 247 294 374 8 278 233 390 375 8 368 219 494 371 +3534 /data/VOCdevkit/VOC2007/JPEGImages/007007.jpg 500 374 14 112 203 291 374 14 1 2 298 281 +3535 /data/VOCdevkit/VOC2007/JPEGImages/007008.jpg 343 290 9 6 16 323 278 9 200 110 329 281 +3536 /data/VOCdevkit/VOC2007/JPEGImages/007009.jpg 432 296 13 25 1 432 218 +3537 /data/VOCdevkit/VOC2007/JPEGImages/007011.jpg 500 375 11 1 46 235 372 +3538 /data/VOCdevkit/VOC2007/JPEGImages/007016.jpg 500 375 14 166 82 244 348 14 246 82 333 198 14 360 61 430 290 +3539 /data/VOCdevkit/VOC2007/JPEGImages/007018.jpg 500 357 12 160 20 425 337 +3540 /data/VOCdevkit/VOC2007/JPEGImages/007020.jpg 375 500 14 54 176 129 430 +3541 /data/VOCdevkit/VOC2007/JPEGImages/007021.jpg 500 373 4 280 52 305 166 4 304 55 338 168 10 3 109 480 369 +3542 /data/VOCdevkit/VOC2007/JPEGImages/007022.jpg 500 332 2 146 101 266 179 +3543 /data/VOCdevkit/VOC2007/JPEGImages/007023.jpg 375 500 19 118 165 258 288 8 261 277 375 419 14 262 7 375 378 14 104 231 263 398 14 1 121 128 499 +3544 /data/VOCdevkit/VOC2007/JPEGImages/007025.jpg 500 375 7 79 48 440 375 +3545 /data/VOCdevkit/VOC2007/JPEGImages/007029.jpg 500 375 1 372 129 500 323 +3546 /data/VOCdevkit/VOC2007/JPEGImages/007031.jpg 375 500 14 1 86 140 489 14 262 122 370 465 +3547 /data/VOCdevkit/VOC2007/JPEGImages/007033.jpg 500 375 0 1 4 500 375 +3548 /data/VOCdevkit/VOC2007/JPEGImages/007035.jpg 500 375 12 170 95 418 315 14 283 49 375 177 14 1 1 150 323 +3549 /data/VOCdevkit/VOC2007/JPEGImages/007036.jpg 500 375 14 375 184 499 375 14 286 190 391 375 14 194 184 291 375 14 68 185 211 373 +3550 /data/VOCdevkit/VOC2007/JPEGImages/007038.jpg 500 375 7 32 59 332 374 +3551 /data/VOCdevkit/VOC2007/JPEGImages/007039.jpg 500 375 19 121 57 323 243 +3552 /data/VOCdevkit/VOC2007/JPEGImages/007040.jpg 500 425 14 220 171 334 302 6 156 32 444 153 +3553 /data/VOCdevkit/VOC2007/JPEGImages/007042.jpg 500 375 17 131 201 327 298 10 287 224 499 374 8 264 209 410 375 8 408 229 499 375 8 331 195 390 352 +3554 /data/VOCdevkit/VOC2007/JPEGImages/007045.jpg 357 500 14 168 159 331 409 9 91 249 273 369 9 2 213 94 305 +3555 /data/VOCdevkit/VOC2007/JPEGImages/007046.jpg 375 500 8 53 160 307 500 14 76 153 309 499 +3556 /data/VOCdevkit/VOC2007/JPEGImages/007048.jpg 500 332 16 227 55 500 324 16 82 56 245 257 4 76 42 129 151 14 114 1 240 59 14 1 1 132 329 +3557 /data/VOCdevkit/VOC2007/JPEGImages/007049.jpg 500 375 0 1 4 493 375 14 1 14 125 375 +3558 /data/VOCdevkit/VOC2007/JPEGImages/007050.jpg 500 333 7 135 93 310 332 +3559 /data/VOCdevkit/VOC2007/JPEGImages/007052.jpg 500 375 3 60 7 460 259 14 106 146 128 212 14 131 166 150 212 +3560 /data/VOCdevkit/VOC2007/JPEGImages/007054.jpg 375 500 14 17 13 375 500 +3561 /data/VOCdevkit/VOC2007/JPEGImages/007056.jpg 230 500 4 1 1 230 500 +3562 /data/VOCdevkit/VOC2007/JPEGImages/007058.jpg 500 409 6 1 152 472 400 +3563 /data/VOCdevkit/VOC2007/JPEGImages/007059.jpg 500 375 14 210 161 263 260 14 304 158 328 263 14 465 138 500 288 14 424 162 455 277 14 396 158 445 283 14 278 167 306 262 14 361 156 386 259 14 323 164 355 262 +3564 /data/VOCdevkit/VOC2007/JPEGImages/007062.jpg 500 375 1 1 36 436 375 +3565 /data/VOCdevkit/VOC2007/JPEGImages/007064.jpg 500 375 10 157 261 462 375 8 367 226 465 365 8 47 177 136 273 17 146 181 276 257 +3566 /data/VOCdevkit/VOC2007/JPEGImages/007065.jpg 500 333 2 166 58 382 307 +3567 /data/VOCdevkit/VOC2007/JPEGImages/007068.jpg 357 500 6 3 157 357 342 6 2 110 357 186 6 34 74 357 133 6 63 46 338 118 6 94 24 321 75 +3568 /data/VOCdevkit/VOC2007/JPEGImages/007070.jpg 500 375 11 132 4 464 332 +3569 /data/VOCdevkit/VOC2007/JPEGImages/007071.jpg 500 333 7 1 2 360 333 +3570 /data/VOCdevkit/VOC2007/JPEGImages/007072.jpg 500 375 9 2 25 394 372 +3571 /data/VOCdevkit/VOC2007/JPEGImages/007073.jpg 500 375 13 1 50 497 346 14 28 18 343 351 +3572 /data/VOCdevkit/VOC2007/JPEGImages/007074.jpg 500 375 5 33 89 479 305 +3573 /data/VOCdevkit/VOC2007/JPEGImages/007075.jpg 500 336 9 1 89 153 224 9 131 96 274 314 +3574 /data/VOCdevkit/VOC2007/JPEGImages/007077.jpg 500 332 8 155 260 279 332 8 256 264 380 332 +3575 /data/VOCdevkit/VOC2007/JPEGImages/007078.jpg 500 375 15 34 127 66 170 15 132 124 153 151 8 252 126 375 216 +3576 /data/VOCdevkit/VOC2007/JPEGImages/007079.jpg 500 375 14 143 50 253 184 +3577 /data/VOCdevkit/VOC2007/JPEGImages/007080.jpg 500 333 14 104 2 377 323 +3578 /data/VOCdevkit/VOC2007/JPEGImages/007084.jpg 500 374 2 157 109 389 315 +3579 /data/VOCdevkit/VOC2007/JPEGImages/007086.jpg 500 333 0 14 91 500 265 +3580 /data/VOCdevkit/VOC2007/JPEGImages/007088.jpg 500 333 0 185 160 457 277 +3581 /data/VOCdevkit/VOC2007/JPEGImages/007089.jpg 500 356 11 43 46 468 270 +3582 /data/VOCdevkit/VOC2007/JPEGImages/007090.jpg 500 375 6 75 203 321 365 +3583 /data/VOCdevkit/VOC2007/JPEGImages/007092.jpg 375 500 2 56 92 374 480 +3584 /data/VOCdevkit/VOC2007/JPEGImages/007093.jpg 500 375 14 76 74 323 299 8 70 184 235 375 8 284 179 445 375 +3585 /data/VOCdevkit/VOC2007/JPEGImages/007095.jpg 500 375 5 226 130 437 290 +3586 /data/VOCdevkit/VOC2007/JPEGImages/007097.jpg 500 288 0 31 113 422 216 +3587 /data/VOCdevkit/VOC2007/JPEGImages/007100.jpg 500 375 19 68 46 462 303 +3588 /data/VOCdevkit/VOC2007/JPEGImages/007101.jpg 500 333 18 100 77 382 281 +3589 /data/VOCdevkit/VOC2007/JPEGImages/007104.jpg 375 500 4 77 29 319 472 +3590 /data/VOCdevkit/VOC2007/JPEGImages/007105.jpg 500 333 17 5 153 500 333 +3591 /data/VOCdevkit/VOC2007/JPEGImages/007108.jpg 500 334 1 414 189 500 288 1 257 176 371 265 1 284 179 401 263 1 160 169 261 257 1 61 137 150 225 1 2 122 52 188 14 1 79 50 162 14 81 94 149 201 14 150 111 202 190 14 189 124 259 232 14 282 133 358 229 14 319 132 390 235 14 443 159 500 270 +3592 /data/VOCdevkit/VOC2007/JPEGImages/007109.jpg 500 332 12 150 2 500 332 14 1 72 211 332 +3593 /data/VOCdevkit/VOC2007/JPEGImages/007113.jpg 127 400 19 96 163 127 238 +3594 /data/VOCdevkit/VOC2007/JPEGImages/007114.jpg 500 333 14 222 22 397 333 14 50 140 263 332 +3595 /data/VOCdevkit/VOC2007/JPEGImages/007117.jpg 500 376 4 412 306 456 376 14 128 131 396 376 14 135 170 160 221 14 146 165 181 222 +3596 /data/VOCdevkit/VOC2007/JPEGImages/007121.jpg 375 500 4 252 376 375 500 14 109 82 266 340 14 1 159 317 500 +3597 /data/VOCdevkit/VOC2007/JPEGImages/007122.jpg 500 375 14 225 79 500 375 14 3 64 252 375 +3598 /data/VOCdevkit/VOC2007/JPEGImages/007123.jpg 500 335 18 86 121 281 277 +3599 /data/VOCdevkit/VOC2007/JPEGImages/007125.jpg 308 370 3 75 13 256 329 +3600 /data/VOCdevkit/VOC2007/JPEGImages/007128.jpg 375 500 14 181 73 375 500 14 62 75 213 500 14 327 111 375 245 14 282 130 327 229 14 46 129 95 242 +3601 /data/VOCdevkit/VOC2007/JPEGImages/007129.jpg 500 397 11 82 94 245 397 14 187 9 422 397 +3602 /data/VOCdevkit/VOC2007/JPEGImages/007130.jpg 500 375 19 106 96 192 188 19 221 80 295 157 15 355 109 475 171 +3603 /data/VOCdevkit/VOC2007/JPEGImages/007132.jpg 500 325 18 193 21 500 258 +3604 /data/VOCdevkit/VOC2007/JPEGImages/007133.jpg 375 500 6 4 111 375 372 6 20 135 167 192 +3605 /data/VOCdevkit/VOC2007/JPEGImages/007138.jpg 500 343 14 9 57 235 333 12 2 65 428 343 +3606 /data/VOCdevkit/VOC2007/JPEGImages/007139.jpg 500 366 3 201 25 413 194 14 406 227 440 298 +3607 /data/VOCdevkit/VOC2007/JPEGImages/007140.jpg 330 500 1 50 132 330 424 14 75 163 327 500 +3608 /data/VOCdevkit/VOC2007/JPEGImages/007141.jpg 500 375 4 309 174 330 220 4 40 178 75 304 4 8 160 43 293 +3609 /data/VOCdevkit/VOC2007/JPEGImages/007144.jpg 500 375 5 3 25 500 270 +3610 /data/VOCdevkit/VOC2007/JPEGImages/007146.jpg 500 374 2 124 43 462 367 +3611 /data/VOCdevkit/VOC2007/JPEGImages/007147.jpg 333 500 14 127 178 242 500 14 2 224 25 283 +3612 /data/VOCdevkit/VOC2007/JPEGImages/007148.jpg 500 333 14 36 22 415 333 14 319 49 500 333 +3613 /data/VOCdevkit/VOC2007/JPEGImages/007149.jpg 500 443 11 18 3 468 443 +3614 /data/VOCdevkit/VOC2007/JPEGImages/007150.jpg 500 375 14 277 67 498 374 14 225 75 348 277 13 79 195 499 374 +3615 /data/VOCdevkit/VOC2007/JPEGImages/007152.jpg 500 334 0 28 44 91 113 0 47 151 111 212 0 65 239 127 299 0 189 143 255 205 0 164 29 228 96 0 397 15 462 83 +3616 /data/VOCdevkit/VOC2007/JPEGImages/007153.jpg 500 375 9 228 166 317 276 14 321 114 355 189 +3617 /data/VOCdevkit/VOC2007/JPEGImages/007154.jpg 375 500 14 68 29 260 500 +3618 /data/VOCdevkit/VOC2007/JPEGImages/007159.jpg 500 375 6 435 151 500 210 14 146 155 177 282 14 36 154 68 289 +3619 /data/VOCdevkit/VOC2007/JPEGImages/007162.jpg 500 375 17 8 46 500 289 +3620 /data/VOCdevkit/VOC2007/JPEGImages/007163.jpg 500 375 14 177 116 299 375 14 58 109 223 375 +3621 /data/VOCdevkit/VOC2007/JPEGImages/007165.jpg 375 500 16 173 329 375 500 +3622 /data/VOCdevkit/VOC2007/JPEGImages/007166.jpg 333 500 11 64 130 287 393 11 2 91 333 341 19 174 55 317 186 +3623 /data/VOCdevkit/VOC2007/JPEGImages/007167.jpg 500 375 6 9 98 347 219 6 51 107 500 306 14 338 114 388 171 +3624 /data/VOCdevkit/VOC2007/JPEGImages/007168.jpg 375 500 18 48 102 372 424 +3625 /data/VOCdevkit/VOC2007/JPEGImages/007172.jpg 500 336 1 143 239 324 336 1 327 142 430 273 14 139 89 179 155 14 121 32 341 336 14 344 57 433 252 +3626 /data/VOCdevkit/VOC2007/JPEGImages/007174.jpg 500 334 13 238 186 320 271 +3627 /data/VOCdevkit/VOC2007/JPEGImages/007177.jpg 333 500 10 5 194 333 500 4 114 151 136 238 +3628 /data/VOCdevkit/VOC2007/JPEGImages/007180.jpg 375 500 15 89 85 138 139 15 50 97 88 139 15 2 112 50 139 +3629 /data/VOCdevkit/VOC2007/JPEGImages/007182.jpg 333 500 14 104 58 333 500 14 1 1 125 461 +3630 /data/VOCdevkit/VOC2007/JPEGImages/007184.jpg 334 500 14 60 313 192 500 14 245 337 332 500 14 304 135 334 240 14 272 264 293 292 +3631 /data/VOCdevkit/VOC2007/JPEGImages/007185.jpg 500 332 12 152 2 440 332 +3632 /data/VOCdevkit/VOC2007/JPEGImages/007187.jpg 500 375 17 14 149 422 308 14 1 121 238 224 14 277 120 473 223 14 153 101 348 334 +3633 /data/VOCdevkit/VOC2007/JPEGImages/007189.jpg 500 375 19 199 67 299 167 14 271 167 490 374 +3634 /data/VOCdevkit/VOC2007/JPEGImages/007191.jpg 500 375 10 93 308 436 374 4 68 170 81 199 4 260 257 290 353 4 299 322 316 375 4 274 315 292 375 10 45 191 153 279 8 89 192 150 286 8 12 197 85 289 8 4 220 35 349 +3635 /data/VOCdevkit/VOC2007/JPEGImages/007193.jpg 375 500 17 69 122 375 500 +3636 /data/VOCdevkit/VOC2007/JPEGImages/007194.jpg 500 334 2 1 106 57 168 2 61 163 138 219 2 102 162 185 237 2 172 154 222 230 2 344 141 425 201 +3637 /data/VOCdevkit/VOC2007/JPEGImages/007197.jpg 500 334 7 92 57 364 334 +3638 /data/VOCdevkit/VOC2007/JPEGImages/007200.jpg 500 333 13 46 61 446 297 14 394 1 500 233 +3639 /data/VOCdevkit/VOC2007/JPEGImages/007204.jpg 320 240 7 32 1 274 238 +3640 /data/VOCdevkit/VOC2007/JPEGImages/007205.jpg 500 375 6 130 149 201 220 6 10 188 141 325 +3641 /data/VOCdevkit/VOC2007/JPEGImages/007208.jpg 500 334 14 97 101 316 334 14 247 2 500 334 +3642 /data/VOCdevkit/VOC2007/JPEGImages/007210.jpg 500 375 19 90 1 413 156 +3643 /data/VOCdevkit/VOC2007/JPEGImages/007211.jpg 500 375 13 153 173 394 371 +3644 /data/VOCdevkit/VOC2007/JPEGImages/007212.jpg 500 333 11 143 9 445 331 +3645 /data/VOCdevkit/VOC2007/JPEGImages/007213.jpg 500 375 8 268 157 341 242 14 25 37 236 375 14 359 75 500 251 +3646 /data/VOCdevkit/VOC2007/JPEGImages/007214.jpg 375 500 11 30 351 113 491 14 84 132 209 499 14 183 105 336 498 +3647 /data/VOCdevkit/VOC2007/JPEGImages/007215.jpg 500 333 9 100 76 433 333 +3648 /data/VOCdevkit/VOC2007/JPEGImages/007216.jpg 375 500 12 230 295 270 408 14 217 260 280 347 +3649 /data/VOCdevkit/VOC2007/JPEGImages/007217.jpg 500 334 16 305 167 375 330 16 238 134 284 246 16 264 62 291 108 16 208 58 230 91 16 361 97 476 191 16 59 194 242 334 16 83 140 250 262 16 41 136 142 247 16 1 94 100 201 16 344 125 454 241 +3650 /data/VOCdevkit/VOC2007/JPEGImages/007219.jpg 375 500 19 133 185 231 273 8 1 339 224 500 +3651 /data/VOCdevkit/VOC2007/JPEGImages/007222.jpg 500 339 18 346 99 490 230 18 218 98 355 226 +3652 /data/VOCdevkit/VOC2007/JPEGImages/007223.jpg 500 333 7 5 1 370 333 +3653 /data/VOCdevkit/VOC2007/JPEGImages/007224.jpg 500 332 18 144 107 291 221 +3654 /data/VOCdevkit/VOC2007/JPEGImages/007227.jpg 296 500 14 5 36 268 500 +3655 /data/VOCdevkit/VOC2007/JPEGImages/007230.jpg 500 375 16 265 124 362 294 16 132 78 241 221 +3656 /data/VOCdevkit/VOC2007/JPEGImages/007234.jpg 320 214 12 85 35 224 189 14 113 23 188 118 +3657 /data/VOCdevkit/VOC2007/JPEGImages/007236.jpg 500 332 5 181 41 325 268 14 179 165 218 264 14 465 131 482 171 14 433 123 450 154 14 151 109 164 137 14 75 126 96 167 +3658 /data/VOCdevkit/VOC2007/JPEGImages/007241.jpg 500 375 5 7 71 479 365 +3659 /data/VOCdevkit/VOC2007/JPEGImages/007243.jpg 500 375 12 3 43 371 372 14 63 130 266 373 14 249 178 360 374 +3660 /data/VOCdevkit/VOC2007/JPEGImages/007244.jpg 500 375 14 100 34 410 375 1 22 271 488 375 +3661 /data/VOCdevkit/VOC2007/JPEGImages/007245.jpg 500 375 11 164 118 500 317 11 3 26 447 353 +3662 /data/VOCdevkit/VOC2007/JPEGImages/007247.jpg 500 375 6 100 93 494 291 +3663 /data/VOCdevkit/VOC2007/JPEGImages/007249.jpg 500 375 7 74 54 352 345 +3664 /data/VOCdevkit/VOC2007/JPEGImages/007250.jpg 500 333 4 281 227 311 330 19 122 19 327 176 +3665 /data/VOCdevkit/VOC2007/JPEGImages/007256.jpg 500 375 1 325 190 418 289 14 360 131 443 300 14 100 79 170 284 +3666 /data/VOCdevkit/VOC2007/JPEGImages/007258.jpg 393 164 17 6 14 388 160 +3667 /data/VOCdevkit/VOC2007/JPEGImages/007259.jpg 375 500 8 11 26 366 500 +3668 /data/VOCdevkit/VOC2007/JPEGImages/007260.jpg 422 480 12 64 159 367 446 14 149 71 267 303 +3669 /data/VOCdevkit/VOC2007/JPEGImages/007261.jpg 377 500 6 1 292 160 432 6 196 288 377 479 14 292 91 377 500 +3670 /data/VOCdevkit/VOC2007/JPEGImages/007263.jpg 500 375 19 276 160 319 204 8 44 167 161 291 17 157 201 486 358 +3671 /data/VOCdevkit/VOC2007/JPEGImages/007266.jpg 500 375 8 1 102 172 346 14 326 86 479 322 14 111 89 326 319 +3672 /data/VOCdevkit/VOC2007/JPEGImages/007270.jpg 500 375 6 128 181 274 299 14 443 125 475 210 6 350 158 445 188 +3673 /data/VOCdevkit/VOC2007/JPEGImages/007271.jpg 500 375 5 51 129 352 268 14 413 204 427 234 14 91 214 138 281 13 58 235 160 301 +3674 /data/VOCdevkit/VOC2007/JPEGImages/007274.jpg 500 327 0 1 108 497 264 +3675 /data/VOCdevkit/VOC2007/JPEGImages/007275.jpg 300 224 17 1 67 300 211 +3676 /data/VOCdevkit/VOC2007/JPEGImages/007276.jpg 500 335 18 272 101 374 226 +3677 /data/VOCdevkit/VOC2007/JPEGImages/007279.jpg 500 281 5 176 55 500 280 6 55 237 155 272 +3678 /data/VOCdevkit/VOC2007/JPEGImages/007280.jpg 500 333 0 203 103 345 177 0 142 121 281 195 +3679 /data/VOCdevkit/VOC2007/JPEGImages/007283.jpg 500 375 1 22 124 243 255 1 243 117 480 256 6 236 50 304 76 +3680 /data/VOCdevkit/VOC2007/JPEGImages/007284.jpg 500 333 6 78 72 385 207 14 198 90 217 116 +3681 /data/VOCdevkit/VOC2007/JPEGImages/007285.jpg 375 500 6 2 43 375 500 +3682 /data/VOCdevkit/VOC2007/JPEGImages/007289.jpg 500 333 3 1 75 159 144 3 28 96 435 295 +3683 /data/VOCdevkit/VOC2007/JPEGImages/007292.jpg 500 375 0 1 74 500 330 +3684 /data/VOCdevkit/VOC2007/JPEGImages/007294.jpg 500 312 6 270 172 361 252 +3685 /data/VOCdevkit/VOC2007/JPEGImages/007295.jpg 500 375 7 119 141 397 287 +3686 /data/VOCdevkit/VOC2007/JPEGImages/007296.jpg 500 375 2 191 64 319 153 14 142 149 350 375 14 396 281 458 375 14 87 283 106 312 14 118 278 132 303 +3687 /data/VOCdevkit/VOC2007/JPEGImages/007297.jpg 500 291 0 47 61 440 192 +3688 /data/VOCdevkit/VOC2007/JPEGImages/007298.jpg 500 333 5 3 1 278 330 14 291 135 333 275 14 217 132 268 266 +3689 /data/VOCdevkit/VOC2007/JPEGImages/007299.jpg 500 375 2 109 191 166 290 +3690 /data/VOCdevkit/VOC2007/JPEGImages/007300.jpg 500 375 2 230 122 388 307 2 26 154 97 206 2 187 167 220 211 2 447 24 485 61 2 450 45 500 87 +3691 /data/VOCdevkit/VOC2007/JPEGImages/007302.jpg 500 375 17 210 142 465 322 15 19 85 94 173 +3692 /data/VOCdevkit/VOC2007/JPEGImages/007305.jpg 500 331 13 343 113 463 181 13 58 134 213 233 14 128 113 188 234 14 398 85 445 184 6 442 65 489 99 6 347 63 408 101 6 303 67 348 102 6 263 70 305 101 6 219 72 263 103 6 104 75 165 105 6 53 82 108 104 6 22 81 72 105 +3693 /data/VOCdevkit/VOC2007/JPEGImages/007308.jpg 389 480 12 17 69 302 466 14 94 70 236 278 12 204 288 298 410 +3694 /data/VOCdevkit/VOC2007/JPEGImages/007311.jpg 500 375 8 200 169 348 362 8 322 163 381 244 8 3 215 50 374 +3695 /data/VOCdevkit/VOC2007/JPEGImages/007314.jpg 500 375 13 221 112 330 328 13 328 129 371 227 14 457 121 498 225 14 43 128 178 358 14 145 84 203 275 14 341 54 447 361 14 198 80 247 270 14 217 91 320 294 +3696 /data/VOCdevkit/VOC2007/JPEGImages/007318.jpg 500 375 14 21 23 46 93 +3697 /data/VOCdevkit/VOC2007/JPEGImages/007322.jpg 500 375 11 111 4 360 347 +3698 /data/VOCdevkit/VOC2007/JPEGImages/007323.jpg 228 500 4 3 1 225 496 +3699 /data/VOCdevkit/VOC2007/JPEGImages/007325.jpg 500 333 12 121 155 365 332 14 207 58 265 231 14 43 19 105 194 14 8 1 59 112 14 175 1 244 75 14 256 9 305 160 14 304 36 356 128 14 343 34 375 91 14 359 64 421 181 14 390 32 451 139 14 427 38 489 136 +3700 /data/VOCdevkit/VOC2007/JPEGImages/007327.jpg 500 375 8 394 259 454 340 8 298 257 361 347 8 145 235 187 291 8 218 240 268 304 8 263 229 294 290 1 385 213 426 239 1 246 212 310 252 8 160 213 183 253 +3701 /data/VOCdevkit/VOC2007/JPEGImages/007329.jpg 500 375 7 23 7 500 367 +3702 /data/VOCdevkit/VOC2007/JPEGImages/007330.jpg 500 344 14 124 14 487 330 +3703 /data/VOCdevkit/VOC2007/JPEGImages/007334.jpg 500 375 7 93 23 448 297 +3704 /data/VOCdevkit/VOC2007/JPEGImages/007336.jpg 375 500 14 46 189 149 472 14 226 203 325 478 +3705 /data/VOCdevkit/VOC2007/JPEGImages/007343.jpg 500 394 7 28 1 500 394 +3706 /data/VOCdevkit/VOC2007/JPEGImages/007344.jpg 500 375 7 109 54 445 347 15 213 1 305 99 15 284 2 447 121 +3707 /data/VOCdevkit/VOC2007/JPEGImages/007346.jpg 500 375 5 1 1 334 256 14 460 125 500 269 14 419 134 464 239 14 382 130 421 237 14 337 145 359 213 14 301 137 329 214 +3708 /data/VOCdevkit/VOC2007/JPEGImages/007350.jpg 480 360 10 219 233 459 360 10 4 197 182 328 14 171 75 245 360 14 245 87 316 281 +3709 /data/VOCdevkit/VOC2007/JPEGImages/007351.jpg 500 375 4 104 103 144 234 4 167 176 189 243 +3710 /data/VOCdevkit/VOC2007/JPEGImages/007356.jpg 500 333 1 45 61 447 326 15 432 74 461 124 +3711 /data/VOCdevkit/VOC2007/JPEGImages/007359.jpg 500 375 19 373 71 500 195 14 9 32 341 375 +3712 /data/VOCdevkit/VOC2007/JPEGImages/007361.jpg 500 375 18 72 260 334 280 +3713 /data/VOCdevkit/VOC2007/JPEGImages/007363.jpg 500 317 6 32 98 419 264 +3714 /data/VOCdevkit/VOC2007/JPEGImages/007365.jpg 500 332 3 12 46 82 151 3 298 101 323 147 3 263 100 295 143 +3715 /data/VOCdevkit/VOC2007/JPEGImages/007369.jpg 500 375 8 47 32 252 329 14 169 1 334 291 14 1 1 153 373 14 390 42 468 227 +3716 /data/VOCdevkit/VOC2007/JPEGImages/007370.jpg 375 500 4 35 1 340 500 +3717 /data/VOCdevkit/VOC2007/JPEGImages/007372.jpg 333 500 0 62 242 333 324 +3718 /data/VOCdevkit/VOC2007/JPEGImages/007373.jpg 500 375 10 1 178 493 375 10 74 106 295 177 +3719 /data/VOCdevkit/VOC2007/JPEGImages/007374.jpg 500 375 6 197 219 320 274 6 42 207 132 264 +3720 /data/VOCdevkit/VOC2007/JPEGImages/007375.jpg 500 375 0 23 35 500 375 +3721 /data/VOCdevkit/VOC2007/JPEGImages/007376.jpg 500 334 5 82 144 464 254 +3722 /data/VOCdevkit/VOC2007/JPEGImages/007381.jpg 417 500 14 75 67 255 400 14 232 155 336 398 +3723 /data/VOCdevkit/VOC2007/JPEGImages/007383.jpg 500 375 6 324 207 385 238 6 403 207 473 241 +3724 /data/VOCdevkit/VOC2007/JPEGImages/007385.jpg 500 333 17 1 26 429 333 +3725 /data/VOCdevkit/VOC2007/JPEGImages/007388.jpg 500 375 14 76 12 496 375 +3726 /data/VOCdevkit/VOC2007/JPEGImages/007389.jpg 500 337 9 17 62 171 272 9 122 75 248 277 9 229 66 333 295 9 317 135 392 300 9 383 128 438 297 9 394 106 500 300 +3727 /data/VOCdevkit/VOC2007/JPEGImages/007390.jpg 500 375 8 196 131 284 233 19 297 103 353 154 8 344 143 454 238 17 308 184 500 375 +3728 /data/VOCdevkit/VOC2007/JPEGImages/007394.jpg 500 333 19 105 32 409 321 +3729 /data/VOCdevkit/VOC2007/JPEGImages/007396.jpg 500 375 15 284 1 376 99 15 177 1 275 100 15 292 1 397 94 +3730 /data/VOCdevkit/VOC2007/JPEGImages/007398.jpg 500 283 5 1 1 499 265 14 344 64 434 280 +3731 /data/VOCdevkit/VOC2007/JPEGImages/007408.jpg 375 500 18 1 10 341 408 14 345 243 364 309 14 313 244 356 341 +3732 /data/VOCdevkit/VOC2007/JPEGImages/007410.jpg 500 333 4 283 196 306 285 4 250 195 273 279 4 266 169 284 233 14 258 93 360 196 14 327 49 499 333 14 149 92 250 267 14 7 77 169 307 +3733 /data/VOCdevkit/VOC2007/JPEGImages/007411.jpg 500 432 11 59 47 466 413 +3734 /data/VOCdevkit/VOC2007/JPEGImages/007413.jpg 500 375 0 1 1 380 221 14 135 217 167 291 +3735 /data/VOCdevkit/VOC2007/JPEGImages/007414.jpg 500 333 14 453 50 491 110 6 187 107 386 196 +3736 /data/VOCdevkit/VOC2007/JPEGImages/007416.jpg 500 349 7 223 101 369 317 8 1 2 459 349 +3737 /data/VOCdevkit/VOC2007/JPEGImages/007417.jpg 500 269 11 40 67 306 208 7 304 105 451 211 +3738 /data/VOCdevkit/VOC2007/JPEGImages/007419.jpg 500 375 7 172 66 479 339 +3739 /data/VOCdevkit/VOC2007/JPEGImages/007421.jpg 375 500 2 149 214 217 315 +3740 /data/VOCdevkit/VOC2007/JPEGImages/007422.jpg 500 333 6 116 135 398 284 +3741 /data/VOCdevkit/VOC2007/JPEGImages/007424.jpg 500 333 6 90 61 451 270 +3742 /data/VOCdevkit/VOC2007/JPEGImages/007425.jpg 500 333 17 1 171 374 333 +3743 /data/VOCdevkit/VOC2007/JPEGImages/007427.jpg 500 375 6 404 160 500 375 6 379 142 500 357 6 269 208 313 284 +3744 /data/VOCdevkit/VOC2007/JPEGImages/007431.jpg 500 417 2 92 333 170 372 2 93 374 169 410 2 289 369 365 408 2 291 325 367 368 2 357 153 412 181 2 350 108 388 145 2 397 50 452 84 2 377 32 407 81 2 240 83 291 113 2 61 56 122 96 +3745 /data/VOCdevkit/VOC2007/JPEGImages/007432.jpg 500 375 19 418 153 498 220 8 19 279 175 375 8 14 238 117 315 +3746 /data/VOCdevkit/VOC2007/JPEGImages/007433.jpg 500 375 11 179 53 474 375 +3747 /data/VOCdevkit/VOC2007/JPEGImages/007435.jpg 332 500 8 8 320 108 500 10 10 288 332 500 +3748 /data/VOCdevkit/VOC2007/JPEGImages/007436.jpg 500 375 14 104 61 380 375 +3749 /data/VOCdevkit/VOC2007/JPEGImages/007437.jpg 500 333 5 98 105 295 249 +3750 /data/VOCdevkit/VOC2007/JPEGImages/007438.jpg 329 500 14 71 41 264 475 +3751 /data/VOCdevkit/VOC2007/JPEGImages/007439.jpg 500 333 12 99 34 489 259 +3752 /data/VOCdevkit/VOC2007/JPEGImages/007443.jpg 500 333 8 284 219 425 317 8 92 214 225 321 8 291 173 337 222 8 161 178 208 224 17 206 171 295 211 +3753 /data/VOCdevkit/VOC2007/JPEGImages/007445.jpg 500 334 14 97 152 157 218 18 77 2 500 334 +3754 /data/VOCdevkit/VOC2007/JPEGImages/007446.jpg 375 500 1 43 241 218 500 14 53 9 203 380 6 192 125 346 184 6 1 121 43 147 +3755 /data/VOCdevkit/VOC2007/JPEGImages/007448.jpg 500 332 14 217 95 280 203 12 171 143 346 260 +3756 /data/VOCdevkit/VOC2007/JPEGImages/007449.jpg 500 375 3 249 205 325 235 +3757 /data/VOCdevkit/VOC2007/JPEGImages/007451.jpg 500 375 15 108 67 230 213 15 131 269 199 338 15 244 4 323 138 +3758 /data/VOCdevkit/VOC2007/JPEGImages/007454.jpg 500 375 7 179 56 500 314 7 18 43 393 361 +3759 /data/VOCdevkit/VOC2007/JPEGImages/007457.jpg 500 333 14 139 3 500 331 4 89 134 134 316 +3760 /data/VOCdevkit/VOC2007/JPEGImages/007458.jpg 500 375 8 330 222 500 375 10 132 157 481 375 19 224 39 291 100 +3761 /data/VOCdevkit/VOC2007/JPEGImages/007460.jpg 333 500 3 121 356 314 394 +3762 /data/VOCdevkit/VOC2007/JPEGImages/007461.jpg 500 375 4 288 3 323 58 4 323 2 355 128 4 254 2 288 55 4 217 1 249 56 4 183 1 218 124 4 147 3 182 124 4 111 2 146 126 4 75 3 110 123 4 36 1 72 122 4 5 2 38 122 +3763 /data/VOCdevkit/VOC2007/JPEGImages/007465.jpg 500 375 19 1 12 498 373 +3764 /data/VOCdevkit/VOC2007/JPEGImages/007466.jpg 500 331 13 170 116 275 208 13 400 127 472 226 1 39 104 141 168 14 290 135 341 275 14 325 125 380 273 13 282 167 389 286 8 348 145 425 244 14 1 92 70 320 +3765 /data/VOCdevkit/VOC2007/JPEGImages/007467.jpg 500 333 18 2 124 284 208 +3766 /data/VOCdevkit/VOC2007/JPEGImages/007468.jpg 500 375 6 3 1 493 359 +3767 /data/VOCdevkit/VOC2007/JPEGImages/007470.jpg 500 333 0 143 32 371 277 +3768 /data/VOCdevkit/VOC2007/JPEGImages/007474.jpg 500 375 11 277 71 433 322 11 43 45 327 372 +3769 /data/VOCdevkit/VOC2007/JPEGImages/007475.jpg 500 332 14 153 14 500 332 +3770 /data/VOCdevkit/VOC2007/JPEGImages/007477.jpg 431 500 3 259 30 421 154 +3771 /data/VOCdevkit/VOC2007/JPEGImages/007479.jpg 500 329 6 5 24 500 261 +3772 /data/VOCdevkit/VOC2007/JPEGImages/007480.jpg 500 305 5 95 11 468 303 14 82 93 139 269 +3773 /data/VOCdevkit/VOC2007/JPEGImages/007481.jpg 500 332 2 61 53 362 317 +3774 /data/VOCdevkit/VOC2007/JPEGImages/007482.jpg 500 333 14 96 103 242 266 14 237 76 370 265 14 389 75 500 299 +3775 /data/VOCdevkit/VOC2007/JPEGImages/007483.jpg 500 376 14 2 35 500 376 +3776 /data/VOCdevkit/VOC2007/JPEGImages/007484.jpg 500 375 5 356 120 500 333 5 75 96 330 350 +3777 /data/VOCdevkit/VOC2007/JPEGImages/007486.jpg 500 333 0 1 66 408 207 +3778 /data/VOCdevkit/VOC2007/JPEGImages/007489.jpg 500 395 11 198 42 491 372 +3779 /data/VOCdevkit/VOC2007/JPEGImages/007490.jpg 500 375 6 230 214 384 285 6 104 211 264 278 +3780 /data/VOCdevkit/VOC2007/JPEGImages/007491.jpg 500 375 17 233 153 500 337 +3781 /data/VOCdevkit/VOC2007/JPEGImages/007493.jpg 500 375 14 235 146 489 375 14 35 4 373 375 4 1 191 22 291 +3782 /data/VOCdevkit/VOC2007/JPEGImages/007497.jpg 500 333 6 162 178 354 270 6 309 124 386 195 6 2 146 161 207 6 231 51 315 89 6 329 73 424 119 14 230 111 248 166 14 441 84 461 132 14 469 85 489 122 14 425 185 461 246 14 450 188 491 255 +3783 /data/VOCdevkit/VOC2007/JPEGImages/007498.jpg 500 376 10 1 3 309 376 14 124 2 500 376 +3784 /data/VOCdevkit/VOC2007/JPEGImages/007503.jpg 500 375 0 15 37 500 366 +3785 /data/VOCdevkit/VOC2007/JPEGImages/007506.jpg 500 375 19 3 16 500 357 +3786 /data/VOCdevkit/VOC2007/JPEGImages/007511.jpg 500 375 10 2 241 500 375 15 157 104 389 300 14 348 1 440 272 14 331 8 376 246 14 236 40 314 124 14 161 46 226 118 14 5 1 120 280 4 71 269 107 337 +3787 /data/VOCdevkit/VOC2007/JPEGImages/007513.jpg 500 333 18 1 11 461 333 +3788 /data/VOCdevkit/VOC2007/JPEGImages/007517.jpg 333 500 7 32 55 320 484 +3789 /data/VOCdevkit/VOC2007/JPEGImages/007519.jpg 500 375 15 238 164 309 187 15 99 161 192 185 +3790 /data/VOCdevkit/VOC2007/JPEGImages/007521.jpg 500 293 3 20 79 109 202 +3791 /data/VOCdevkit/VOC2007/JPEGImages/007523.jpg 500 332 2 248 51 498 142 +3792 /data/VOCdevkit/VOC2007/JPEGImages/007524.jpg 333 500 7 52 47 333 472 +3793 /data/VOCdevkit/VOC2007/JPEGImages/007525.jpg 500 400 6 134 185 404 337 +3794 /data/VOCdevkit/VOC2007/JPEGImages/007526.jpg 332 500 14 167 123 260 312 12 86 160 300 412 +3795 /data/VOCdevkit/VOC2007/JPEGImages/007527.jpg 500 431 6 28 372 60 404 6 237 377 316 425 6 284 390 355 428 6 313 390 443 431 6 210 389 240 416 6 182 380 233 417 6 133 382 177 411 6 108 381 149 408 +3796 /data/VOCdevkit/VOC2007/JPEGImages/007528.jpg 500 375 9 174 163 278 266 9 233 181 337 249 9 310 189 423 248 9 242 234 449 375 +3797 /data/VOCdevkit/VOC2007/JPEGImages/007530.jpg 378 500 19 39 65 163 203 7 183 61 326 167 8 1 313 136 500 +3798 /data/VOCdevkit/VOC2007/JPEGImages/007533.jpg 500 375 3 67 22 249 332 3 358 49 493 325 +3799 /data/VOCdevkit/VOC2007/JPEGImages/007535.jpg 368 500 14 26 59 234 489 +3800 /data/VOCdevkit/VOC2007/JPEGImages/007536.jpg 500 375 17 245 121 500 312 +3801 /data/VOCdevkit/VOC2007/JPEGImages/007537.jpg 500 333 11 277 40 388 220 11 54 74 218 238 +3802 /data/VOCdevkit/VOC2007/JPEGImages/007538.jpg 500 375 8 134 132 274 337 +3803 /data/VOCdevkit/VOC2007/JPEGImages/007540.jpg 500 375 14 43 89 377 372 14 284 103 500 375 +3804 /data/VOCdevkit/VOC2007/JPEGImages/007543.jpg 500 375 1 213 172 288 320 1 328 172 417 308 1 61 145 202 310 14 216 103 295 290 14 315 107 410 285 +3805 /data/VOCdevkit/VOC2007/JPEGImages/007544.jpg 500 375 19 294 109 341 142 8 340 163 482 311 8 190 188 274 344 8 124 190 192 347 8 54 206 132 372 10 2 201 225 311 +3806 /data/VOCdevkit/VOC2007/JPEGImages/007546.jpg 500 332 5 157 143 275 178 +3807 /data/VOCdevkit/VOC2007/JPEGImages/007547.jpg 500 375 12 52 116 500 375 14 323 1 500 373 +3808 /data/VOCdevkit/VOC2007/JPEGImages/007551.jpg 375 500 1 49 65 252 485 +3809 /data/VOCdevkit/VOC2007/JPEGImages/007555.jpg 500 375 18 377 148 500 172 +3810 /data/VOCdevkit/VOC2007/JPEGImages/007558.jpg 500 334 14 198 52 367 334 14 310 37 475 334 8 157 21 283 180 +3811 /data/VOCdevkit/VOC2007/JPEGImages/007559.jpg 375 500 14 57 78 195 461 19 301 121 375 213 +3812 /data/VOCdevkit/VOC2007/JPEGImages/007563.jpg 375 500 14 84 172 234 499 14 208 178 326 500 +3813 /data/VOCdevkit/VOC2007/JPEGImages/007565.jpg 500 375 7 143 34 395 263 7 59 124 362 355 +3814 /data/VOCdevkit/VOC2007/JPEGImages/007566.jpg 500 336 6 2 30 496 334 6 90 1 189 70 14 440 2 496 120 14 348 37 366 53 14 185 4 216 35 +3815 /data/VOCdevkit/VOC2007/JPEGImages/007568.jpg 500 375 14 35 1 466 374 +3816 /data/VOCdevkit/VOC2007/JPEGImages/007570.jpg 500 332 14 283 59 389 289 12 75 107 190 291 +3817 /data/VOCdevkit/VOC2007/JPEGImages/007571.jpg 500 375 14 136 100 252 277 14 255 83 365 263 1 132 188 268 319 1 266 181 355 308 +3818 /data/VOCdevkit/VOC2007/JPEGImages/007572.jpg 500 333 10 2 97 315 234 4 40 100 67 181 4 19 99 38 174 14 265 46 491 333 14 4 53 235 331 +3819 /data/VOCdevkit/VOC2007/JPEGImages/007575.jpg 500 375 5 15 1 473 235 +3820 /data/VOCdevkit/VOC2007/JPEGImages/007576.jpg 480 371 12 87 65 398 338 14 180 44 290 196 +3821 /data/VOCdevkit/VOC2007/JPEGImages/007578.jpg 500 331 11 187 89 333 306 11 350 34 426 113 14 292 1 358 136 14 185 1 283 138 14 1 1 116 329 +3822 /data/VOCdevkit/VOC2007/JPEGImages/007579.jpg 500 375 14 143 60 364 375 14 387 55 500 375 14 411 57 458 128 14 1 4 101 340 14 143 72 224 365 +3823 /data/VOCdevkit/VOC2007/JPEGImages/007585.jpg 500 500 11 131 14 466 364 11 178 322 258 482 +3824 /data/VOCdevkit/VOC2007/JPEGImages/007586.jpg 500 375 18 1 145 241 248 +3825 /data/VOCdevkit/VOC2007/JPEGImages/007590.jpg 375 500 14 1 14 375 500 14 253 45 352 219 +3826 /data/VOCdevkit/VOC2007/JPEGImages/007592.jpg 333 500 6 8 121 323 320 14 183 221 295 463 14 96 197 207 446 +3827 /data/VOCdevkit/VOC2007/JPEGImages/007594.jpg 500 375 12 111 191 482 375 14 62 71 190 351 14 150 111 225 215 14 185 74 351 368 +3828 /data/VOCdevkit/VOC2007/JPEGImages/007600.jpg 500 333 15 62 44 244 302 15 224 53 443 305 +3829 /data/VOCdevkit/VOC2007/JPEGImages/007601.jpg 500 375 6 19 68 482 299 6 2 91 50 181 +3830 /data/VOCdevkit/VOC2007/JPEGImages/007603.jpg 500 375 12 206 177 337 291 +3831 /data/VOCdevkit/VOC2007/JPEGImages/007605.jpg 500 352 14 197 30 316 322 14 30 30 137 323 14 111 43 200 322 14 139 51 189 178 14 315 153 361 235 +3832 /data/VOCdevkit/VOC2007/JPEGImages/007606.jpg 500 375 14 119 41 415 375 +3833 /data/VOCdevkit/VOC2007/JPEGImages/007611.jpg 500 375 14 312 56 492 375 12 1 110 320 375 +3834 /data/VOCdevkit/VOC2007/JPEGImages/007612.jpg 375 500 11 94 189 258 500 +3835 /data/VOCdevkit/VOC2007/JPEGImages/007614.jpg 500 375 6 24 40 459 331 +3836 /data/VOCdevkit/VOC2007/JPEGImages/007615.jpg 500 375 2 297 43 428 365 2 141 160 291 375 +3837 /data/VOCdevkit/VOC2007/JPEGImages/007618.jpg 375 500 14 33 51 202 500 +3838 /data/VOCdevkit/VOC2007/JPEGImages/007619.jpg 500 333 8 245 256 342 333 14 384 143 440 291 +3839 /data/VOCdevkit/VOC2007/JPEGImages/007621.jpg 500 375 16 301 102 411 202 16 175 113 285 209 +3840 /data/VOCdevkit/VOC2007/JPEGImages/007622.jpg 500 333 6 2 1 497 330 +3841 /data/VOCdevkit/VOC2007/JPEGImages/007624.jpg 500 375 15 424 170 500 370 15 359 206 421 278 15 294 193 357 283 15 275 258 309 310 15 274 138 415 246 15 2 236 43 375 15 45 260 128 375 15 155 220 222 352 15 151 40 293 308 +3842 /data/VOCdevkit/VOC2007/JPEGImages/007626.jpg 500 333 0 34 110 473 266 +3843 /data/VOCdevkit/VOC2007/JPEGImages/007629.jpg 500 375 14 308 54 418 374 +3844 /data/VOCdevkit/VOC2007/JPEGImages/007631.jpg 500 375 14 286 1 363 114 14 373 1 435 113 4 327 78 341 116 4 157 75 171 118 4 120 76 136 120 14 40 1 100 116 8 436 117 500 230 8 344 117 425 229 8 65 120 142 224 8 1 121 64 224 14 96 64 327 340 14 257 101 457 375 14 443 255 500 375 14 209 253 317 375 14 92 269 179 375 14 1 262 93 375 14 115 50 237 117 +3845 /data/VOCdevkit/VOC2007/JPEGImages/007633.jpg 500 329 5 1 117 236 269 5 225 126 344 255 5 340 130 500 238 +3846 /data/VOCdevkit/VOC2007/JPEGImages/007637.jpg 500 375 12 93 145 345 305 +3847 /data/VOCdevkit/VOC2007/JPEGImages/007639.jpg 375 500 17 3 204 372 500 14 117 290 246 422 +3848 /data/VOCdevkit/VOC2007/JPEGImages/007640.jpg 500 375 7 78 121 500 307 +3849 /data/VOCdevkit/VOC2007/JPEGImages/007642.jpg 500 375 13 205 145 500 374 +3850 /data/VOCdevkit/VOC2007/JPEGImages/007647.jpg 333 500 13 22 240 131 337 14 30 181 113 303 6 111 236 333 335 +3851 /data/VOCdevkit/VOC2007/JPEGImages/007649.jpg 500 375 14 175 2 500 375 14 2 24 179 375 +3852 /data/VOCdevkit/VOC2007/JPEGImages/007650.jpg 375 500 5 78 274 156 344 5 156 123 335 414 6 1 316 42 365 +3853 /data/VOCdevkit/VOC2007/JPEGImages/007653.jpg 500 332 6 17 165 472 282 +3854 /data/VOCdevkit/VOC2007/JPEGImages/007654.jpg 500 350 0 259 78 400 247 +3855 /data/VOCdevkit/VOC2007/JPEGImages/007655.jpg 500 357 1 4 18 500 354 +3856 /data/VOCdevkit/VOC2007/JPEGImages/007656.jpg 375 500 14 217 319 254 394 +3857 /data/VOCdevkit/VOC2007/JPEGImages/007657.jpg 500 347 14 2 2 404 347 +3858 /data/VOCdevkit/VOC2007/JPEGImages/007662.jpg 374 500 2 7 206 111 489 +3859 /data/VOCdevkit/VOC2007/JPEGImages/007663.jpg 500 375 6 49 94 461 296 +3860 /data/VOCdevkit/VOC2007/JPEGImages/007664.jpg 500 375 8 165 227 271 375 8 22 283 176 375 10 13 222 258 375 15 148 75 171 124 +3861 /data/VOCdevkit/VOC2007/JPEGImages/007666.jpg 500 375 18 3 60 413 374 +3862 /data/VOCdevkit/VOC2007/JPEGImages/007667.jpg 500 375 6 458 333 494 353 +3863 /data/VOCdevkit/VOC2007/JPEGImages/007668.jpg 333 500 14 113 91 333 500 +3864 /data/VOCdevkit/VOC2007/JPEGImages/007670.jpg 500 333 13 244 28 486 285 13 19 79 265 275 +3865 /data/VOCdevkit/VOC2007/JPEGImages/007671.jpg 368 500 2 80 55 354 487 +3866 /data/VOCdevkit/VOC2007/JPEGImages/007672.jpg 500 375 17 1 166 128 316 +3867 /data/VOCdevkit/VOC2007/JPEGImages/007673.jpg 375 500 17 266 173 375 398 10 4 262 328 500 15 213 150 280 252 +3868 /data/VOCdevkit/VOC2007/JPEGImages/007675.jpg 500 333 14 19 2 229 333 14 304 153 496 332 +3869 /data/VOCdevkit/VOC2007/JPEGImages/007677.jpg 500 357 0 99 124 375 257 +3870 /data/VOCdevkit/VOC2007/JPEGImages/007678.jpg 500 314 2 78 83 420 181 +3871 /data/VOCdevkit/VOC2007/JPEGImages/007679.jpg 500 362 1 26 236 232 325 +3872 /data/VOCdevkit/VOC2007/JPEGImages/007680.jpg 500 375 2 55 70 194 124 2 158 18 271 199 2 226 43 315 110 2 271 174 332 375 2 21 164 128 375 +3873 /data/VOCdevkit/VOC2007/JPEGImages/007682.jpg 375 500 7 92 35 372 387 +3874 /data/VOCdevkit/VOC2007/JPEGImages/007683.jpg 500 375 11 51 248 210 375 14 232 44 344 375 +3875 /data/VOCdevkit/VOC2007/JPEGImages/007685.jpg 500 375 3 112 78 242 171 +3876 /data/VOCdevkit/VOC2007/JPEGImages/007687.jpg 500 346 11 280 25 500 345 14 1 27 452 346 +3877 /data/VOCdevkit/VOC2007/JPEGImages/007688.jpg 500 375 13 4 37 500 373 +3878 /data/VOCdevkit/VOC2007/JPEGImages/007691.jpg 500 375 6 270 85 500 321 +3879 /data/VOCdevkit/VOC2007/JPEGImages/007692.jpg 500 332 11 229 102 386 230 +3880 /data/VOCdevkit/VOC2007/JPEGImages/007694.jpg 500 375 11 143 44 359 302 14 1 81 129 375 14 300 1 500 375 +3881 /data/VOCdevkit/VOC2007/JPEGImages/007696.jpg 500 375 18 1 116 349 223 +3882 /data/VOCdevkit/VOC2007/JPEGImages/007697.jpg 332 500 12 70 206 242 436 14 105 116 204 330 +3883 /data/VOCdevkit/VOC2007/JPEGImages/007699.jpg 500 375 6 2 50 500 375 14 270 18 304 64 14 83 61 143 120 14 207 40 234 91 14 119 33 147 95 14 26 63 58 144 +3884 /data/VOCdevkit/VOC2007/JPEGImages/007702.jpg 500 375 19 381 206 460 283 +3885 /data/VOCdevkit/VOC2007/JPEGImages/007704.jpg 500 356 15 31 194 72 244 17 78 170 305 345 17 318 171 500 287 +3886 /data/VOCdevkit/VOC2007/JPEGImages/007705.jpg 333 500 11 81 284 245 500 12 137 102 333 500 +3887 /data/VOCdevkit/VOC2007/JPEGImages/007709.jpg 500 375 14 235 56 265 118 1 245 81 290 107 6 56 116 470 276 6 309 89 500 188 6 202 59 293 98 +3888 /data/VOCdevkit/VOC2007/JPEGImages/007712.jpg 307 450 13 52 128 262 411 14 72 42 246 396 +3889 /data/VOCdevkit/VOC2007/JPEGImages/007713.jpg 500 331 2 123 47 373 322 +3890 /data/VOCdevkit/VOC2007/JPEGImages/007715.jpg 500 375 15 26 39 466 373 +3891 /data/VOCdevkit/VOC2007/JPEGImages/007718.jpg 500 375 14 56 174 327 361 3 95 124 496 257 +3892 /data/VOCdevkit/VOC2007/JPEGImages/007720.jpg 500 375 8 38 62 388 375 +3893 /data/VOCdevkit/VOC2007/JPEGImages/007721.jpg 500 374 2 214 103 429 299 6 36 172 290 271 +3894 /data/VOCdevkit/VOC2007/JPEGImages/007723.jpg 500 375 0 55 93 430 287 14 455 104 500 320 +3895 /data/VOCdevkit/VOC2007/JPEGImages/007724.jpg 457 372 8 64 35 407 348 +3896 /data/VOCdevkit/VOC2007/JPEGImages/007727.jpg 480 318 14 2 66 77 191 14 180 21 281 203 12 176 103 280 291 12 7 99 84 276 +3897 /data/VOCdevkit/VOC2007/JPEGImages/007729.jpg 500 375 19 91 27 444 308 +3898 /data/VOCdevkit/VOC2007/JPEGImages/007731.jpg 375 500 6 26 189 340 474 +3899 /data/VOCdevkit/VOC2007/JPEGImages/007732.jpg 500 375 8 341 217 487 375 8 114 209 183 298 19 237 110 320 176 +3900 /data/VOCdevkit/VOC2007/JPEGImages/007735.jpg 500 333 14 191 68 284 295 10 4 266 366 333 8 240 209 384 316 +3901 /data/VOCdevkit/VOC2007/JPEGImages/007736.jpg 500 375 5 57 149 134 206 6 180 176 244 213 6 150 178 188 204 +3902 /data/VOCdevkit/VOC2007/JPEGImages/007740.jpg 500 375 4 197 136 266 363 4 279 75 337 326 4 356 196 383 290 4 239 144 318 353 +3903 /data/VOCdevkit/VOC2007/JPEGImages/007742.jpg 500 325 18 19 92 414 280 +3904 /data/VOCdevkit/VOC2007/JPEGImages/007743.jpg 332 500 3 116 149 218 275 +3905 /data/VOCdevkit/VOC2007/JPEGImages/007745.jpg 500 375 14 26 69 51 177 6 43 39 487 337 +3906 /data/VOCdevkit/VOC2007/JPEGImages/007746.jpg 500 375 14 242 58 500 375 14 55 27 330 375 14 125 246 144 272 +3907 /data/VOCdevkit/VOC2007/JPEGImages/007748.jpg 332 500 12 76 164 332 373 14 165 111 243 284 +3908 /data/VOCdevkit/VOC2007/JPEGImages/007749.jpg 500 375 11 128 23 500 375 +3909 /data/VOCdevkit/VOC2007/JPEGImages/007751.jpg 500 375 4 250 280 305 375 4 106 238 138 322 4 76 275 101 326 14 309 118 479 369 14 173 121 338 312 14 50 131 192 291 14 1 231 49 375 +3910 /data/VOCdevkit/VOC2007/JPEGImages/007753.jpg 500 375 7 2 1 500 374 +3911 /data/VOCdevkit/VOC2007/JPEGImages/007754.jpg 500 375 19 377 112 477 254 19 276 130 345 241 19 263 36 316 92 8 82 92 169 229 8 131 71 246 232 +3912 /data/VOCdevkit/VOC2007/JPEGImages/007758.jpg 500 387 7 54 50 196 215 +3913 /data/VOCdevkit/VOC2007/JPEGImages/007760.jpg 333 500 11 94 252 272 500 14 2 4 330 500 +3914 /data/VOCdevkit/VOC2007/JPEGImages/007762.jpg 500 375 19 217 90 362 252 4 252 29 272 89 4 292 32 311 71 7 147 16 174 53 +3915 /data/VOCdevkit/VOC2007/JPEGImages/007763.jpg 500 375 14 366 71 497 375 14 256 69 377 285 14 139 103 207 253 14 162 79 272 266 14 49 178 163 375 14 110 196 244 375 14 203 216 393 375 +3916 /data/VOCdevkit/VOC2007/JPEGImages/007765.jpg 375 500 2 26 111 294 498 +3917 /data/VOCdevkit/VOC2007/JPEGImages/007767.jpg 500 333 18 83 89 500 289 +3918 /data/VOCdevkit/VOC2007/JPEGImages/007768.jpg 500 375 14 289 36 500 375 14 5 3 385 375 +3919 /data/VOCdevkit/VOC2007/JPEGImages/007772.jpg 500 375 9 149 87 321 270 +3920 /data/VOCdevkit/VOC2007/JPEGImages/007773.jpg 500 334 5 153 277 211 311 +3921 /data/VOCdevkit/VOC2007/JPEGImages/007775.jpg 378 500 11 45 89 248 284 +3922 /data/VOCdevkit/VOC2007/JPEGImages/007776.jpg 500 333 18 167 111 263 156 18 105 147 375 259 18 355 135 500 204 +3923 /data/VOCdevkit/VOC2007/JPEGImages/007777.jpg 500 374 10 2 196 370 374 14 1 105 102 242 14 178 85 291 228 14 300 130 407 288 14 370 172 500 374 +3924 /data/VOCdevkit/VOC2007/JPEGImages/007779.jpg 500 375 6 111 248 186 298 6 186 221 305 298 6 305 247 387 295 +3925 /data/VOCdevkit/VOC2007/JPEGImages/007781.jpg 500 375 15 1 42 419 375 +3926 /data/VOCdevkit/VOC2007/JPEGImages/007786.jpg 500 375 9 387 90 500 192 9 54 92 312 196 9 2 99 114 199 14 265 87 417 214 +3927 /data/VOCdevkit/VOC2007/JPEGImages/007790.jpg 500 375 8 73 124 106 174 6 146 1 210 61 6 188 1 267 53 4 23 129 125 362 +3928 /data/VOCdevkit/VOC2007/JPEGImages/007791.jpg 500 375 11 30 61 440 326 11 256 233 470 360 +3929 /data/VOCdevkit/VOC2007/JPEGImages/007793.jpg 500 334 13 130 134 500 334 14 195 49 322 211 14 360 123 431 217 14 343 81 386 146 13 469 103 500 169 +3930 /data/VOCdevkit/VOC2007/JPEGImages/007795.jpg 500 375 14 7 108 153 374 14 107 118 207 305 14 295 151 359 269 14 334 152 408 279 14 404 154 485 322 15 258 242 304 310 8 229 167 284 234 +3931 /data/VOCdevkit/VOC2007/JPEGImages/007798.jpg 375 500 4 29 1 340 463 +3932 /data/VOCdevkit/VOC2007/JPEGImages/007799.jpg 500 331 14 63 89 159 322 8 341 178 408 308 +3933 /data/VOCdevkit/VOC2007/JPEGImages/007803.jpg 500 375 3 164 181 298 280 +3934 /data/VOCdevkit/VOC2007/JPEGImages/007809.jpg 500 375 12 87 25 500 373 14 370 3 500 323 +3935 /data/VOCdevkit/VOC2007/JPEGImages/007810.jpg 375 500 14 80 1 337 127 +3936 /data/VOCdevkit/VOC2007/JPEGImages/007812.jpg 500 375 8 1 199 65 301 8 122 237 269 375 +3937 /data/VOCdevkit/VOC2007/JPEGImages/007813.jpg 500 375 11 51 184 231 293 14 270 82 500 274 +3938 /data/VOCdevkit/VOC2007/JPEGImages/007814.jpg 500 375 15 454 243 500 322 15 360 237 395 314 15 62 234 87 306 14 192 57 274 230 14 252 130 357 375 14 303 135 364 361 14 144 134 203 353 14 82 135 174 372 14 47 124 93 195 +3939 /data/VOCdevkit/VOC2007/JPEGImages/007815.jpg 500 368 6 31 45 401 286 14 238 44 309 126 14 135 55 210 130 +3940 /data/VOCdevkit/VOC2007/JPEGImages/007819.jpg 500 208 18 12 62 500 128 6 32 110 93 131 +3941 /data/VOCdevkit/VOC2007/JPEGImages/007820.jpg 500 333 0 5 19 500 257 0 277 74 431 139 +3942 /data/VOCdevkit/VOC2007/JPEGImages/007821.jpg 357 500 6 23 58 313 312 14 130 79 278 484 14 21 46 165 428 +3943 /data/VOCdevkit/VOC2007/JPEGImages/007824.jpg 500 333 7 148 162 440 333 +3944 /data/VOCdevkit/VOC2007/JPEGImages/007826.jpg 500 375 10 80 217 320 273 8 197 193 257 326 8 258 180 312 314 8 10 195 93 358 8 82 252 243 372 +3945 /data/VOCdevkit/VOC2007/JPEGImages/007831.jpg 384 500 2 49 227 180 412 +3946 /data/VOCdevkit/VOC2007/JPEGImages/007833.jpg 500 332 3 371 2 459 141 2 141 222 277 318 +3947 /data/VOCdevkit/VOC2007/JPEGImages/007834.jpg 371 500 11 91 48 277 448 +3948 /data/VOCdevkit/VOC2007/JPEGImages/007836.jpg 500 375 1 2 186 227 338 1 328 192 500 332 14 355 117 500 313 14 2 124 144 330 14 228 31 263 121 14 273 40 295 116 +3949 /data/VOCdevkit/VOC2007/JPEGImages/007838.jpg 500 375 11 230 103 318 264 +3950 /data/VOCdevkit/VOC2007/JPEGImages/007840.jpg 333 500 2 11 33 268 486 +3951 /data/VOCdevkit/VOC2007/JPEGImages/007841.jpg 500 375 11 139 78 244 234 14 229 98 358 287 14 6 134 138 332 +3952 /data/VOCdevkit/VOC2007/JPEGImages/007843.jpg 500 480 6 49 306 471 450 +3953 /data/VOCdevkit/VOC2007/JPEGImages/007845.jpg 500 400 2 70 34 312 355 2 130 70 458 263 +3954 /data/VOCdevkit/VOC2007/JPEGImages/007847.jpg 500 333 2 170 110 465 294 +3955 /data/VOCdevkit/VOC2007/JPEGImages/007853.jpg 500 467 2 86 177 350 452 +3956 /data/VOCdevkit/VOC2007/JPEGImages/007854.jpg 301 500 1 18 323 293 485 +3957 /data/VOCdevkit/VOC2007/JPEGImages/007855.jpg 500 375 5 7 145 449 295 6 447 216 475 232 +3958 /data/VOCdevkit/VOC2007/JPEGImages/007856.jpg 500 333 6 151 118 394 230 14 91 101 121 156 14 70 104 101 157 14 32 90 52 116 14 15 92 35 115 14 12 103 43 160 14 34 105 54 158 14 47 103 80 157 14 26 66 40 85 +3959 /data/VOCdevkit/VOC2007/JPEGImages/007857.jpg 500 369 0 129 106 228 185 +3960 /data/VOCdevkit/VOC2007/JPEGImages/007859.jpg 500 337 16 1 4 469 337 +3961 /data/VOCdevkit/VOC2007/JPEGImages/007863.jpg 500 375 7 201 140 440 296 +3962 /data/VOCdevkit/VOC2007/JPEGImages/007864.jpg 500 333 0 22 64 148 148 +3963 /data/VOCdevkit/VOC2007/JPEGImages/007865.jpg 500 375 15 389 192 429 306 15 53 185 97 311 8 231 108 314 262 8 295 105 351 234 +3964 /data/VOCdevkit/VOC2007/JPEGImages/007868.jpg 400 400 7 31 16 388 378 +3965 /data/VOCdevkit/VOC2007/JPEGImages/007869.jpg 500 332 2 38 76 369 332 +3966 /data/VOCdevkit/VOC2007/JPEGImages/007872.jpg 500 333 10 3 143 500 333 14 2 42 175 302 14 134 113 196 192 14 153 78 217 160 14 192 91 223 159 14 180 22 229 141 14 348 88 450 180 14 379 18 500 237 +3967 /data/VOCdevkit/VOC2007/JPEGImages/007873.jpg 500 375 17 1 153 487 360 +3968 /data/VOCdevkit/VOC2007/JPEGImages/007876.jpg 500 375 2 226 181 316 308 +3969 /data/VOCdevkit/VOC2007/JPEGImages/007877.jpg 500 375 14 3 4 282 373 14 194 103 428 375 +3970 /data/VOCdevkit/VOC2007/JPEGImages/007878.jpg 375 500 7 66 67 294 373 +3971 /data/VOCdevkit/VOC2007/JPEGImages/007883.jpg 500 335 6 442 193 477 210 +3972 /data/VOCdevkit/VOC2007/JPEGImages/007884.jpg 500 416 14 28 12 479 406 1 13 244 450 416 +3973 /data/VOCdevkit/VOC2007/JPEGImages/007885.jpg 441 500 7 16 29 344 485 +3974 /data/VOCdevkit/VOC2007/JPEGImages/007886.jpg 500 466 2 162 129 475 367 +3975 /data/VOCdevkit/VOC2007/JPEGImages/007889.jpg 500 375 14 290 64 424 375 +3976 /data/VOCdevkit/VOC2007/JPEGImages/007890.jpg 500 333 15 242 123 350 220 15 289 196 355 282 +3977 /data/VOCdevkit/VOC2007/JPEGImages/007897.jpg 500 324 14 166 70 393 214 13 167 120 468 306 14 419 129 450 197 14 385 114 419 162 14 414 104 444 139 14 67 116 100 178 14 5 111 38 232 14 72 184 138 239 +3978 /data/VOCdevkit/VOC2007/JPEGImages/007898.jpg 400 500 6 1 1 400 366 +3979 /data/VOCdevkit/VOC2007/JPEGImages/007899.jpg 375 500 4 227 25 255 112 +3980 /data/VOCdevkit/VOC2007/JPEGImages/007900.jpg 500 375 11 187 116 325 286 +3981 /data/VOCdevkit/VOC2007/JPEGImages/007901.jpg 375 500 14 48 15 297 500 14 1 13 75 289 14 56 80 121 238 +3982 /data/VOCdevkit/VOC2007/JPEGImages/007902.jpg 500 375 13 320 49 486 154 13 1 57 232 316 14 367 1 458 110 14 1 48 189 213 +3983 /data/VOCdevkit/VOC2007/JPEGImages/007905.jpg 500 374 6 15 87 496 330 +3984 /data/VOCdevkit/VOC2007/JPEGImages/007908.jpg 500 333 5 191 2 500 333 +3985 /data/VOCdevkit/VOC2007/JPEGImages/007909.jpg 270 210 17 88 96 182 143 17 29 95 97 139 10 2 138 174 210 15 216 113 267 167 +3986 /data/VOCdevkit/VOC2007/JPEGImages/007910.jpg 500 375 14 316 18 465 375 +3987 /data/VOCdevkit/VOC2007/JPEGImages/007911.jpg 500 498 13 21 38 461 488 14 144 28 163 78 14 236 26 259 83 14 204 23 220 83 14 43 39 61 83 14 299 24 316 76 14 324 25 337 74 14 364 25 384 81 14 377 21 392 75 14 396 26 417 84 +3988 /data/VOCdevkit/VOC2007/JPEGImages/007914.jpg 375 500 2 62 114 352 414 +3989 /data/VOCdevkit/VOC2007/JPEGImages/007915.jpg 500 375 19 58 203 145 297 19 150 202 253 286 19 259 219 369 333 19 278 261 328 372 19 127 254 217 351 19 195 258 278 368 14 117 39 366 281 +3990 /data/VOCdevkit/VOC2007/JPEGImages/007916.jpg 500 332 0 13 82 491 229 +3991 /data/VOCdevkit/VOC2007/JPEGImages/007919.jpg 500 332 12 167 114 448 280 14 266 49 323 208 +3992 /data/VOCdevkit/VOC2007/JPEGImages/007920.jpg 375 500 5 1 274 119 415 5 115 329 234 409 5 114 298 278 397 5 269 316 358 389 +3993 /data/VOCdevkit/VOC2007/JPEGImages/007921.jpg 500 375 6 58 257 234 351 +3994 /data/VOCdevkit/VOC2007/JPEGImages/007923.jpg 500 235 8 397 106 450 179 17 189 104 309 189 17 135 147 353 235 +3995 /data/VOCdevkit/VOC2007/JPEGImages/007924.jpg 238 360 2 58 10 216 193 2 17 239 178 327 +3996 /data/VOCdevkit/VOC2007/JPEGImages/007925.jpg 500 375 1 58 30 440 319 15 274 61 334 116 15 380 50 466 117 15 140 5 190 115 +3997 /data/VOCdevkit/VOC2007/JPEGImages/007926.jpg 500 339 18 1 276 346 337 +3998 /data/VOCdevkit/VOC2007/JPEGImages/007928.jpg 500 328 14 30 113 70 212 14 361 144 389 198 14 139 141 169 197 14 1 141 30 197 +3999 /data/VOCdevkit/VOC2007/JPEGImages/007931.jpg 500 375 6 52 46 458 325 6 414 92 500 251 14 48 92 81 159 +4000 /data/VOCdevkit/VOC2007/JPEGImages/007932.jpg 500 333 6 79 177 266 268 6 214 167 334 224 6 268 163 369 213 14 419 150 452 230 14 436 140 455 217 14 270 174 290 199 +4001 /data/VOCdevkit/VOC2007/JPEGImages/007933.jpg 500 375 1 8 42 492 351 +4002 /data/VOCdevkit/VOC2007/JPEGImages/007935.jpg 500 375 11 124 126 380 284 +4003 /data/VOCdevkit/VOC2007/JPEGImages/007939.jpg 375 500 9 101 256 333 473 +4004 /data/VOCdevkit/VOC2007/JPEGImages/007940.jpg 500 375 14 90 16 383 375 +4005 /data/VOCdevkit/VOC2007/JPEGImages/007943.jpg 500 375 14 114 116 210 242 14 170 103 352 375 14 333 86 486 316 +4006 /data/VOCdevkit/VOC2007/JPEGImages/007946.jpg 500 375 14 244 60 426 225 11 118 111 309 252 +4007 /data/VOCdevkit/VOC2007/JPEGImages/007947.jpg 500 333 18 2 157 327 212 +4008 /data/VOCdevkit/VOC2007/JPEGImages/007950.jpg 500 375 6 1 315 56 350 6 110 311 171 338 6 84 312 120 335 6 37 310 82 336 +4009 /data/VOCdevkit/VOC2007/JPEGImages/007953.jpg 333 500 14 312 167 327 214 14 258 192 284 217 14 220 193 240 220 14 193 176 213 220 14 105 171 126 221 14 125 178 143 223 14 86 174 104 226 14 68 168 89 226 14 41 175 57 228 14 28 174 43 236 14 264 215 319 298 14 155 250 190 290 14 196 365 282 392 14 95 210 136 270 14 121 210 151 249 14 51 237 92 292 14 70 259 115 339 1 144 355 208 395 1 256 274 321 309 +4010 /data/VOCdevkit/VOC2007/JPEGImages/007954.jpg 500 334 11 28 111 380 212 +4011 /data/VOCdevkit/VOC2007/JPEGImages/007956.jpg 500 375 15 362 133 460 307 15 107 128 163 227 10 2 167 500 375 +4012 /data/VOCdevkit/VOC2007/JPEGImages/007958.jpg 500 375 7 162 101 330 306 +4013 /data/VOCdevkit/VOC2007/JPEGImages/007959.jpg 334 500 17 148 153 263 191 8 102 191 212 275 8 72 223 250 355 8 46 268 274 500 +4014 /data/VOCdevkit/VOC2007/JPEGImages/007963.jpg 500 375 14 285 291 304 337 14 263 293 284 335 6 457 230 500 248 6 1 322 80 375 18 1 200 470 334 +4015 /data/VOCdevkit/VOC2007/JPEGImages/007964.jpg 500 333 6 52 118 407 245 +4016 /data/VOCdevkit/VOC2007/JPEGImages/007968.jpg 500 375 11 132 1 341 287 +4017 /data/VOCdevkit/VOC2007/JPEGImages/007970.jpg 500 375 6 101 146 326 299 6 296 163 500 248 14 224 142 263 184 +4018 /data/VOCdevkit/VOC2007/JPEGImages/007971.jpg 500 333 6 1 1 500 333 14 179 83 323 261 +4019 /data/VOCdevkit/VOC2007/JPEGImages/007974.jpg 500 375 7 1 2 313 375 +4020 /data/VOCdevkit/VOC2007/JPEGImages/007976.jpg 500 375 0 204 129 228 151 0 232 154 254 177 0 266 185 288 207 0 265 206 288 228 0 272 229 294 249 +4021 /data/VOCdevkit/VOC2007/JPEGImages/007979.jpg 500 202 9 275 89 411 170 14 196 63 241 177 14 445 41 479 132 +4022 /data/VOCdevkit/VOC2007/JPEGImages/007980.jpg 500 329 3 187 43 298 220 3 323 193 384 218 +4023 /data/VOCdevkit/VOC2007/JPEGImages/007984.jpg 500 374 14 58 69 270 239 14 389 155 412 212 14 392 153 459 230 13 404 186 465 286 14 29 156 210 374 14 157 135 438 374 14 292 153 437 360 13 2 195 62 255 +4024 /data/VOCdevkit/VOC2007/JPEGImages/007987.jpg 500 375 4 312 312 359 374 4 119 260 145 315 14 193 56 344 328 +4025 /data/VOCdevkit/VOC2007/JPEGImages/007991.jpg 500 375 2 3 99 500 375 +4026 /data/VOCdevkit/VOC2007/JPEGImages/007996.jpg 500 333 14 189 99 237 222 14 118 187 199 267 14 92 244 195 333 14 198 220 357 333 14 397 61 500 270 17 189 113 351 240 +4027 /data/VOCdevkit/VOC2007/JPEGImages/007997.jpg 500 375 14 52 85 340 374 14 257 58 500 375 +4028 /data/VOCdevkit/VOC2007/JPEGImages/007998.jpg 500 375 14 65 2 500 375 14 1 1 119 247 +4029 /data/VOCdevkit/VOC2007/JPEGImages/007999.jpg 500 375 17 93 210 456 375 15 1 1 295 375 15 298 1 394 282 19 385 154 429 188 +4030 /data/VOCdevkit/VOC2007/JPEGImages/008001.jpg 500 353 6 252 25 500 131 6 393 86 500 151 6 52 96 458 282 +4031 /data/VOCdevkit/VOC2007/JPEGImages/008002.jpg 500 333 14 75 7 259 333 14 289 64 412 333 14 249 77 310 206 14 210 176 305 282 14 1 61 71 333 +4032 /data/VOCdevkit/VOC2007/JPEGImages/008004.jpg 375 500 5 195 192 325 310 +4033 /data/VOCdevkit/VOC2007/JPEGImages/008005.jpg 500 375 9 1 64 302 375 9 1 44 419 179 11 336 179 426 250 +4034 /data/VOCdevkit/VOC2007/JPEGImages/008008.jpg 500 331 13 189 79 336 237 13 130 1 217 35 14 194 35 334 226 +4035 /data/VOCdevkit/VOC2007/JPEGImages/008009.jpg 500 375 11 2 2 328 374 +4036 /data/VOCdevkit/VOC2007/JPEGImages/008012.jpg 500 393 15 5 9 442 388 +4037 /data/VOCdevkit/VOC2007/JPEGImages/008017.jpg 500 333 2 16 82 381 311 +4038 /data/VOCdevkit/VOC2007/JPEGImages/008019.jpg 480 318 12 15 122 365 318 14 173 66 288 274 6 381 164 480 318 +4039 /data/VOCdevkit/VOC2007/JPEGImages/008023.jpg 500 375 5 29 4 500 375 14 88 174 162 375 14 40 165 102 375 1 29 229 56 326 +4040 /data/VOCdevkit/VOC2007/JPEGImages/008024.jpg 500 375 0 1 71 494 362 14 219 105 298 265 +4041 /data/VOCdevkit/VOC2007/JPEGImages/008026.jpg 500 375 5 134 50 500 292 14 224 167 275 375 14 163 183 212 374 14 19 139 238 372 +4042 /data/VOCdevkit/VOC2007/JPEGImages/008029.jpg 500 333 15 134 14 258 195 +4043 /data/VOCdevkit/VOC2007/JPEGImages/008031.jpg 500 375 6 15 82 483 303 +4044 /data/VOCdevkit/VOC2007/JPEGImages/008032.jpg 500 333 2 166 67 472 266 +4045 /data/VOCdevkit/VOC2007/JPEGImages/008033.jpg 500 352 18 1 1 429 284 14 223 63 298 221 +4046 /data/VOCdevkit/VOC2007/JPEGImages/008036.jpg 500 333 11 186 68 422 330 +4047 /data/VOCdevkit/VOC2007/JPEGImages/008037.jpg 500 333 6 147 50 461 234 +4048 /data/VOCdevkit/VOC2007/JPEGImages/008040.jpg 500 399 14 47 117 95 208 14 129 106 186 235 14 221 86 278 229 14 296 90 371 165 14 30 174 89 246 14 92 183 134 233 14 177 165 224 271 14 312 151 374 232 14 387 147 436 210 12 2 222 46 384 12 8 218 123 376 12 95 233 160 373 12 148 209 246 357 12 246 184 400 347 12 318 172 475 338 +4049 /data/VOCdevkit/VOC2007/JPEGImages/008042.jpg 500 375 17 75 138 500 364 14 67 61 213 261 4 96 269 121 344 4 116 268 135 334 4 123 255 142 319 4 145 259 171 326 4 154 240 173 307 4 38 193 57 261 +4050 /data/VOCdevkit/VOC2007/JPEGImages/008043.jpg 292 288 14 14 9 284 288 +4051 /data/VOCdevkit/VOC2007/JPEGImages/008044.jpg 500 336 5 365 173 495 207 6 450 186 500 237 6 240 204 392 247 +4052 /data/VOCdevkit/VOC2007/JPEGImages/008048.jpg 350 262 14 48 75 100 178 14 108 59 145 191 14 113 46 189 199 14 175 37 243 197 14 240 24 316 197 +4053 /data/VOCdevkit/VOC2007/JPEGImages/008049.jpg 500 375 19 159 15 392 255 +4054 /data/VOCdevkit/VOC2007/JPEGImages/008051.jpg 500 375 2 131 110 358 375 +4055 /data/VOCdevkit/VOC2007/JPEGImages/008053.jpg 244 500 2 10 346 98 489 2 129 213 204 500 2 135 369 224 475 14 86 8 224 439 +4056 /data/VOCdevkit/VOC2007/JPEGImages/008057.jpg 500 333 6 61 119 378 224 +4057 /data/VOCdevkit/VOC2007/JPEGImages/008060.jpg 500 375 6 5 126 500 352 +4058 /data/VOCdevkit/VOC2007/JPEGImages/008061.jpg 500 375 4 236 17 314 216 4 104 100 156 270 4 295 43 337 167 4 42 2 92 117 4 1 1 47 95 +4059 /data/VOCdevkit/VOC2007/JPEGImages/008062.jpg 500 375 2 2 69 383 375 +4060 /data/VOCdevkit/VOC2007/JPEGImages/008063.jpg 500 375 8 325 97 426 297 8 53 105 157 301 8 208 107 294 286 +4061 /data/VOCdevkit/VOC2007/JPEGImages/008064.jpg 500 333 15 295 224 425 330 15 114 199 297 333 +4062 /data/VOCdevkit/VOC2007/JPEGImages/008067.jpg 500 375 19 132 163 349 330 +4063 /data/VOCdevkit/VOC2007/JPEGImages/008068.jpg 500 374 2 50 36 435 345 +4064 /data/VOCdevkit/VOC2007/JPEGImages/008069.jpg 500 375 14 1 132 46 292 14 58 101 127 180 14 111 131 156 184 14 192 111 241 276 14 213 160 289 314 14 102 215 172 368 14 1 298 46 375 14 43 293 104 375 14 110 303 154 375 14 158 287 220 375 14 143 342 198 375 12 1 171 290 295 14 458 106 500 255 14 377 83 450 238 12 316 28 411 222 +4065 /data/VOCdevkit/VOC2007/JPEGImages/008072.jpg 450 325 10 81 191 329 322 14 293 106 348 175 14 385 109 450 182 14 272 127 397 318 14 135 102 203 198 14 189 92 257 185 14 68 99 154 212 14 3 97 148 325 +4066 /data/VOCdevkit/VOC2007/JPEGImages/008075.jpg 500 375 11 1 64 298 375 +4067 /data/VOCdevkit/VOC2007/JPEGImages/008076.jpg 500 375 10 305 258 500 373 8 262 256 376 375 8 157 184 194 248 19 224 163 292 230 +4068 /data/VOCdevkit/VOC2007/JPEGImages/008079.jpg 500 335 14 148 133 203 309 14 195 127 274 308 14 270 137 320 273 14 338 187 366 275 14 321 151 373 274 11 267 249 356 331 6 48 137 159 198 +4069 /data/VOCdevkit/VOC2007/JPEGImages/008082.jpg 500 333 15 123 80 212 201 14 238 35 426 333 14 326 3 500 333 +4070 /data/VOCdevkit/VOC2007/JPEGImages/008083.jpg 400 300 14 82 85 204 294 14 152 66 362 300 17 95 140 400 300 +4071 /data/VOCdevkit/VOC2007/JPEGImages/008084.jpg 338 500 2 111 212 233 365 +4072 /data/VOCdevkit/VOC2007/JPEGImages/008085.jpg 500 282 2 54 173 100 219 +4073 /data/VOCdevkit/VOC2007/JPEGImages/008086.jpg 500 333 18 114 4 500 317 14 417 80 436 107 +4074 /data/VOCdevkit/VOC2007/JPEGImages/008087.jpg 500 333 6 73 133 458 280 +4075 /data/VOCdevkit/VOC2007/JPEGImages/008091.jpg 332 500 3 2 3 322 319 14 111 209 175 288 +4076 /data/VOCdevkit/VOC2007/JPEGImages/008093.jpg 500 375 6 1 284 84 375 +4077 /data/VOCdevkit/VOC2007/JPEGImages/008095.jpg 500 375 18 373 141 500 175 18 5 86 390 202 +4078 /data/VOCdevkit/VOC2007/JPEGImages/008096.jpg 500 375 1 130 163 249 241 14 165 140 233 220 +4079 /data/VOCdevkit/VOC2007/JPEGImages/008098.jpg 500 375 6 73 176 100 192 6 267 156 362 198 6 360 163 486 214 5 298 133 395 181 5 98 113 230 213 +4080 /data/VOCdevkit/VOC2007/JPEGImages/008100.jpg 500 375 7 1 70 227 372 +4081 /data/VOCdevkit/VOC2007/JPEGImages/008101.jpg 500 363 0 224 124 332 168 0 214 93 334 134 +4082 /data/VOCdevkit/VOC2007/JPEGImages/008103.jpg 500 374 17 3 136 500 368 14 207 72 326 374 +4083 /data/VOCdevkit/VOC2007/JPEGImages/008105.jpg 500 375 6 22 71 472 326 6 281 65 500 193 6 65 46 193 104 6 1 54 66 135 6 1 33 58 71 6 54 34 111 68 14 454 13 500 104 14 378 20 400 46 14 181 14 222 66 +4084 /data/VOCdevkit/VOC2007/JPEGImages/008106.jpg 375 500 8 168 189 266 355 8 280 222 367 385 15 288 232 306 259 +4085 /data/VOCdevkit/VOC2007/JPEGImages/008107.jpg 500 333 0 10 57 494 232 +4086 /data/VOCdevkit/VOC2007/JPEGImages/008108.jpg 500 375 13 27 235 62 300 13 97 229 130 303 14 64 216 87 294 14 80 209 109 300 14 199 202 234 319 14 376 207 402 291 13 153 240 182 303 6 240 223 356 324 +4087 /data/VOCdevkit/VOC2007/JPEGImages/008112.jpg 500 298 3 106 35 168 144 3 157 40 199 145 +4088 /data/VOCdevkit/VOC2007/JPEGImages/008115.jpg 500 333 11 195 159 278 241 11 107 110 187 158 11 72 125 138 200 11 366 110 420 185 11 396 136 440 192 11 470 130 500 202 +4089 /data/VOCdevkit/VOC2007/JPEGImages/008116.jpg 500 375 16 196 170 364 356 16 319 155 409 330 16 107 85 178 141 16 196 109 216 135 16 214 111 233 141 +4090 /data/VOCdevkit/VOC2007/JPEGImages/008117.jpg 500 375 2 218 213 397 375 2 51 254 133 375 2 206 151 382 265 +4091 /data/VOCdevkit/VOC2007/JPEGImages/008121.jpg 500 375 19 77 18 243 255 +4092 /data/VOCdevkit/VOC2007/JPEGImages/008122.jpg 500 333 14 58 42 227 330 14 274 61 406 206 10 4 209 115 296 8 48 199 109 332 +4093 /data/VOCdevkit/VOC2007/JPEGImages/008125.jpg 335 500 5 2 1 335 450 14 142 146 232 241 14 44 153 136 241 +4094 /data/VOCdevkit/VOC2007/JPEGImages/008127.jpg 500 334 10 193 224 500 334 15 268 109 341 205 14 346 129 449 247 14 225 149 328 255 14 58 77 178 334 +4095 /data/VOCdevkit/VOC2007/JPEGImages/008130.jpg 500 375 14 300 29 399 215 +4096 /data/VOCdevkit/VOC2007/JPEGImages/008132.jpg 500 375 0 146 163 196 200 14 251 270 356 375 +4097 /data/VOCdevkit/VOC2007/JPEGImages/008137.jpg 375 500 4 295 43 355 176 +4098 /data/VOCdevkit/VOC2007/JPEGImages/008138.jpg 500 333 2 47 44 390 244 +4099 /data/VOCdevkit/VOC2007/JPEGImages/008139.jpg 500 411 4 13 342 69 411 4 475 152 500 224 14 1 34 254 401 14 165 11 500 411 +4100 /data/VOCdevkit/VOC2007/JPEGImages/008140.jpg 500 375 15 388 80 485 237 +4101 /data/VOCdevkit/VOC2007/JPEGImages/008141.jpg 500 375 4 215 66 309 370 8 38 1 447 301 +4102 /data/VOCdevkit/VOC2007/JPEGImages/008142.jpg 500 332 14 189 73 253 229 12 149 119 325 286 +4103 /data/VOCdevkit/VOC2007/JPEGImages/008144.jpg 361 500 8 102 238 317 450 +4104 /data/VOCdevkit/VOC2007/JPEGImages/008150.jpg 500 333 16 331 178 358 197 16 297 180 316 195 +4105 /data/VOCdevkit/VOC2007/JPEGImages/008151.jpg 500 375 17 293 166 454 334 17 2 209 270 370 8 121 156 217 213 +4106 /data/VOCdevkit/VOC2007/JPEGImages/008159.jpg 375 500 10 5 189 375 500 +4107 /data/VOCdevkit/VOC2007/JPEGImages/008160.jpg 500 375 6 22 69 377 366 6 203 1 456 139 14 75 29 121 144 14 46 34 86 139 +4108 /data/VOCdevkit/VOC2007/JPEGImages/008163.jpg 500 327 3 2 65 150 99 3 121 53 200 79 3 209 75 354 129 3 307 62 419 106 3 40 182 381 265 14 81 146 176 224 14 41 160 81 221 +4109 /data/VOCdevkit/VOC2007/JPEGImages/008164.jpg 500 375 14 6 96 233 375 14 153 68 369 344 14 342 90 500 247 4 409 163 440 277 4 461 159 489 266 +4110 /data/VOCdevkit/VOC2007/JPEGImages/008166.jpg 500 333 3 151 178 349 236 3 351 143 411 176 +4111 /data/VOCdevkit/VOC2007/JPEGImages/008168.jpg 500 375 2 34 124 242 243 +4112 /data/VOCdevkit/VOC2007/JPEGImages/008169.jpg 500 375 7 276 163 436 343 6 11 174 91 226 +4113 /data/VOCdevkit/VOC2007/JPEGImages/008171.jpg 500 375 8 43 221 97 317 8 86 216 131 299 10 1 233 90 312 15 380 96 495 362 15 299 137 366 253 14 118 112 338 375 +4114 /data/VOCdevkit/VOC2007/JPEGImages/008173.jpg 500 333 18 112 150 500 237 +4115 /data/VOCdevkit/VOC2007/JPEGImages/008174.jpg 500 333 6 41 1 500 320 +4116 /data/VOCdevkit/VOC2007/JPEGImages/008175.jpg 500 375 14 197 4 424 374 14 12 37 242 375 +4117 /data/VOCdevkit/VOC2007/JPEGImages/008177.jpg 500 375 14 1 102 165 375 19 250 51 447 214 +4118 /data/VOCdevkit/VOC2007/JPEGImages/008180.jpg 333 500 1 3 334 333 500 14 38 6 333 500 +4119 /data/VOCdevkit/VOC2007/JPEGImages/008186.jpg 500 443 11 2 4 484 442 +4120 /data/VOCdevkit/VOC2007/JPEGImages/008188.jpg 500 305 6 44 54 463 284 14 260 60 322 118 14 361 75 393 124 +4121 /data/VOCdevkit/VOC2007/JPEGImages/008189.jpg 500 375 9 315 155 472 270 +4122 /data/VOCdevkit/VOC2007/JPEGImages/008190.jpg 500 374 1 235 117 461 374 14 265 3 415 297 14 136 1 274 309 1 139 168 263 345 1 61 174 157 323 1 1 188 53 294 14 3 100 60 271 14 65 72 170 285 8 44 214 78 278 +4123 /data/VOCdevkit/VOC2007/JPEGImages/008191.jpg 500 375 12 204 167 280 227 +4124 /data/VOCdevkit/VOC2007/JPEGImages/008197.jpg 500 335 6 451 187 497 227 6 336 177 366 207 +4125 /data/VOCdevkit/VOC2007/JPEGImages/008199.jpg 500 375 8 97 196 148 319 14 364 85 499 375 15 1 225 35 374 15 153 227 194 290 +4126 /data/VOCdevkit/VOC2007/JPEGImages/008200.jpg 500 375 2 196 129 397 315 +4127 /data/VOCdevkit/VOC2007/JPEGImages/008202.jpg 500 375 9 191 111 458 372 9 438 90 500 195 +4128 /data/VOCdevkit/VOC2007/JPEGImages/008203.jpg 500 375 17 331 148 426 247 17 38 188 304 360 +4129 /data/VOCdevkit/VOC2007/JPEGImages/008204.jpg 500 374 4 199 247 242 367 14 143 145 266 336 +4130 /data/VOCdevkit/VOC2007/JPEGImages/008208.jpg 375 500 9 1 65 312 433 +4131 /data/VOCdevkit/VOC2007/JPEGImages/008209.jpg 500 490 12 286 338 376 467 14 343 307 356 350 +4132 /data/VOCdevkit/VOC2007/JPEGImages/008211.jpg 375 500 14 78 182 282 500 +4133 /data/VOCdevkit/VOC2007/JPEGImages/008213.jpg 500 224 8 292 126 331 167 4 430 66 442 104 +4134 /data/VOCdevkit/VOC2007/JPEGImages/008216.jpg 375 500 15 280 276 315 407 15 217 322 242 365 8 201 409 270 500 8 263 422 333 500 10 227 407 374 500 14 88 308 154 500 14 158 302 197 351 14 153 321 205 479 14 46 305 68 387 14 66 312 85 385 +4135 /data/VOCdevkit/VOC2007/JPEGImages/008218.jpg 500 375 14 194 90 495 375 14 124 334 164 375 14 100 273 139 361 +4136 /data/VOCdevkit/VOC2007/JPEGImages/008220.jpg 500 333 18 1 1 458 333 14 214 153 295 219 +4137 /data/VOCdevkit/VOC2007/JPEGImages/008222.jpg 333 500 11 49 98 276 422 +4138 /data/VOCdevkit/VOC2007/JPEGImages/008223.jpg 500 375 16 129 12 500 374 +4139 /data/VOCdevkit/VOC2007/JPEGImages/008224.jpg 500 375 14 343 85 435 225 14 243 105 328 214 14 104 110 191 225 14 172 100 254 235 14 435 98 486 212 14 55 145 109 203 14 16 145 44 193 +4140 /data/VOCdevkit/VOC2007/JPEGImages/008225.jpg 500 385 14 242 136 281 231 14 112 201 189 330 6 56 128 190 221 6 128 189 249 247 +4141 /data/VOCdevkit/VOC2007/JPEGImages/008226.jpg 500 375 2 82 1 214 165 +4142 /data/VOCdevkit/VOC2007/JPEGImages/008229.jpg 500 375 7 55 62 277 315 10 58 103 456 375 +4143 /data/VOCdevkit/VOC2007/JPEGImages/008232.jpg 500 375 14 348 282 384 372 14 376 280 406 375 14 112 280 157 374 14 424 287 471 372 14 220 153 252 193 14 59 146 83 251 6 167 159 418 245 6 67 149 274 231 +4144 /data/VOCdevkit/VOC2007/JPEGImages/008235.jpg 500 333 18 48 127 337 284 +4145 /data/VOCdevkit/VOC2007/JPEGImages/008236.jpg 500 375 0 199 156 253 192 0 220 188 268 227 +4146 /data/VOCdevkit/VOC2007/JPEGImages/008241.jpg 500 375 13 3 248 444 375 14 109 170 232 374 14 108 138 284 375 14 284 220 348 340 14 235 162 361 375 14 281 147 421 374 +4147 /data/VOCdevkit/VOC2007/JPEGImages/008244.jpg 500 375 18 118 2 500 344 +4148 /data/VOCdevkit/VOC2007/JPEGImages/008248.jpg 500 375 12 245 128 349 375 14 327 57 477 375 14 292 44 346 138 +4149 /data/VOCdevkit/VOC2007/JPEGImages/008250.jpg 500 375 13 246 157 343 305 13 119 188 261 308 +4150 /data/VOCdevkit/VOC2007/JPEGImages/008251.jpg 500 260 3 114 174 334 209 +4151 /data/VOCdevkit/VOC2007/JPEGImages/008252.jpg 500 375 0 63 130 487 253 +4152 /data/VOCdevkit/VOC2007/JPEGImages/008253.jpg 500 375 14 89 132 427 325 1 350 4 500 200 +4153 /data/VOCdevkit/VOC2007/JPEGImages/008254.jpg 500 333 7 1 51 418 314 +4154 /data/VOCdevkit/VOC2007/JPEGImages/008258.jpg 408 500 7 13 36 350 500 +4155 /data/VOCdevkit/VOC2007/JPEGImages/008260.jpg 500 375 11 94 71 457 255 +4156 /data/VOCdevkit/VOC2007/JPEGImages/008261.jpg 332 500 14 109 179 161 244 3 56 3 238 265 +4157 /data/VOCdevkit/VOC2007/JPEGImages/008262.jpg 500 375 5 29 77 471 322 +4158 /data/VOCdevkit/VOC2007/JPEGImages/008263.jpg 500 375 18 15 93 366 337 14 144 178 177 260 14 162 244 217 375 14 209 234 240 369 14 230 232 286 375 14 284 241 346 372 +4159 /data/VOCdevkit/VOC2007/JPEGImages/008268.jpg 500 334 6 461 148 495 172 6 22 85 471 324 6 1 129 158 244 +4160 /data/VOCdevkit/VOC2007/JPEGImages/008269.jpg 500 335 7 21 30 500 335 +4161 /data/VOCdevkit/VOC2007/JPEGImages/008272.jpg 500 375 14 302 4 500 375 14 1 3 261 375 11 203 239 366 337 +4162 /data/VOCdevkit/VOC2007/JPEGImages/008275.jpg 500 357 0 44 24 459 331 +4163 /data/VOCdevkit/VOC2007/JPEGImages/008279.jpg 350 500 12 145 207 264 451 14 125 98 237 312 6 152 201 329 366 6 53 212 118 257 6 24 211 60 243 +4164 /data/VOCdevkit/VOC2007/JPEGImages/008280.jpg 500 335 0 2 90 500 281 +4165 /data/VOCdevkit/VOC2007/JPEGImages/008281.jpg 375 500 14 1 55 247 500 14 154 37 375 498 +4166 /data/VOCdevkit/VOC2007/JPEGImages/008282.jpg 500 375 19 203 156 243 190 17 8 174 191 284 17 253 209 500 375 +4167 /data/VOCdevkit/VOC2007/JPEGImages/008284.jpg 500 375 11 258 124 348 238 14 1 1 263 375 8 2 122 227 373 +4168 /data/VOCdevkit/VOC2007/JPEGImages/008285.jpg 500 375 19 132 32 327 203 14 88 50 395 375 +4169 /data/VOCdevkit/VOC2007/JPEGImages/008292.jpg 500 375 16 150 172 196 202 16 270 174 302 220 +4170 /data/VOCdevkit/VOC2007/JPEGImages/008293.jpg 333 500 5 107 195 163 250 5 163 48 333 379 14 266 144 333 232 14 43 194 114 403 +4171 /data/VOCdevkit/VOC2007/JPEGImages/008294.jpg 500 331 6 38 46 207 179 13 145 122 324 237 14 202 78 293 237 6 217 71 319 108 6 319 63 451 120 +4172 /data/VOCdevkit/VOC2007/JPEGImages/008295.jpg 500 321 18 2 5 495 291 +4173 /data/VOCdevkit/VOC2007/JPEGImages/008296.jpg 500 333 6 52 103 500 324 +4174 /data/VOCdevkit/VOC2007/JPEGImages/008297.jpg 500 375 2 2 2 500 375 +4175 /data/VOCdevkit/VOC2007/JPEGImages/008299.jpg 304 404 9 113 89 304 401 +4176 /data/VOCdevkit/VOC2007/JPEGImages/008300.jpg 500 333 0 3 1 500 330 +4177 /data/VOCdevkit/VOC2007/JPEGImages/008301.jpg 375 500 14 153 191 375 500 +4178 /data/VOCdevkit/VOC2007/JPEGImages/008302.jpg 500 375 19 222 220 500 373 14 1 1 248 375 +4179 /data/VOCdevkit/VOC2007/JPEGImages/008306.jpg 500 324 3 161 110 456 288 +4180 /data/VOCdevkit/VOC2007/JPEGImages/008307.jpg 480 367 14 161 54 264 196 12 78 85 412 313 +4181 /data/VOCdevkit/VOC2007/JPEGImages/008310.jpg 500 335 0 2 2 500 327 +4182 /data/VOCdevkit/VOC2007/JPEGImages/008311.jpg 500 333 12 19 47 384 313 +4183 /data/VOCdevkit/VOC2007/JPEGImages/008312.jpg 375 500 13 36 143 266 440 14 173 79 341 401 +4184 /data/VOCdevkit/VOC2007/JPEGImages/008313.jpg 500 375 1 369 208 446 308 1 252 220 368 347 1 1 236 165 374 14 55 174 134 375 14 325 169 387 344 +4185 /data/VOCdevkit/VOC2007/JPEGImages/008315.jpg 500 375 5 165 160 456 312 6 454 234 500 272 14 365 245 406 319 13 359 270 408 341 +4186 /data/VOCdevkit/VOC2007/JPEGImages/008316.jpg 500 333 18 148 1 500 332 +4187 /data/VOCdevkit/VOC2007/JPEGImages/008317.jpg 500 375 2 74 44 392 375 +4188 /data/VOCdevkit/VOC2007/JPEGImages/008318.jpg 500 375 15 302 252 337 296 15 334 150 411 375 +4189 /data/VOCdevkit/VOC2007/JPEGImages/008319.jpg 500 375 4 151 25 181 124 4 185 2 225 128 4 227 2 266 127 4 268 1 309 128 4 312 2 352 126 4 353 1 394 127 4 396 2 436 128 4 438 1 472 126 4 473 1 500 125 4 4 180 72 372 4 62 181 129 368 4 93 160 132 266 4 123 170 184 361 4 156 160 192 223 4 183 174 241 367 4 281 167 316 237 4 340 167 374 241 4 337 149 379 225 4 236 178 295 365 4 295 177 350 365 4 352 180 412 364 4 411 163 471 365 4 468 181 500 365 +4190 /data/VOCdevkit/VOC2007/JPEGImages/008320.jpg 250 198 12 1 8 245 198 +4191 /data/VOCdevkit/VOC2007/JPEGImages/008322.jpg 500 375 11 100 29 248 294 11 235 46 500 310 +4192 /data/VOCdevkit/VOC2007/JPEGImages/008323.jpg 500 375 17 1 262 228 375 +4193 /data/VOCdevkit/VOC2007/JPEGImages/008326.jpg 500 333 0 19 102 479 231 +4194 /data/VOCdevkit/VOC2007/JPEGImages/008327.jpg 500 333 14 255 33 489 333 14 1 65 285 333 +4195 /data/VOCdevkit/VOC2007/JPEGImages/008329.jpg 500 333 6 54 141 369 233 +4196 /data/VOCdevkit/VOC2007/JPEGImages/008332.jpg 500 375 14 2 56 359 375 11 233 202 358 375 +4197 /data/VOCdevkit/VOC2007/JPEGImages/008335.jpg 500 334 18 89 35 298 307 +4198 /data/VOCdevkit/VOC2007/JPEGImages/008336.jpg 500 375 6 272 257 306 285 6 297 248 380 330 +4199 /data/VOCdevkit/VOC2007/JPEGImages/008338.jpg 500 168 5 26 5 486 140 +4200 /data/VOCdevkit/VOC2007/JPEGImages/008341.jpg 500 333 17 1 119 266 333 8 371 117 500 333 14 79 88 203 333 14 295 96 425 333 +4201 /data/VOCdevkit/VOC2007/JPEGImages/008342.jpg 500 400 9 135 97 310 334 16 358 163 500 262 16 312 229 500 400 16 273 208 342 346 16 11 207 242 400 +4202 /data/VOCdevkit/VOC2007/JPEGImages/008345.jpg 500 438 9 199 165 257 254 9 328 174 412 278 9 369 147 446 232 +4203 /data/VOCdevkit/VOC2007/JPEGImages/008346.jpg 291 500 11 28 99 210 487 +4204 /data/VOCdevkit/VOC2007/JPEGImages/008349.jpg 500 375 16 134 64 316 324 +4205 /data/VOCdevkit/VOC2007/JPEGImages/008351.jpg 500 333 18 136 163 377 270 +4206 /data/VOCdevkit/VOC2007/JPEGImages/008355.jpg 500 378 7 174 85 500 333 +4207 /data/VOCdevkit/VOC2007/JPEGImages/008359.jpg 500 375 6 353 43 477 184 6 21 36 364 343 +4208 /data/VOCdevkit/VOC2007/JPEGImages/008360.jpg 500 375 5 2 21 401 280 6 396 157 426 203 +4209 /data/VOCdevkit/VOC2007/JPEGImages/008364.jpg 500 322 18 171 25 486 275 18 1 5 150 293 +4210 /data/VOCdevkit/VOC2007/JPEGImages/008365.jpg 500 332 19 16 127 119 216 17 171 164 313 230 +4211 /data/VOCdevkit/VOC2007/JPEGImages/008368.jpg 500 332 14 174 57 433 332 +4212 /data/VOCdevkit/VOC2007/JPEGImages/008370.jpg 417 500 2 57 63 311 485 +4213 /data/VOCdevkit/VOC2007/JPEGImages/008372.jpg 500 332 0 200 93 359 182 +4214 /data/VOCdevkit/VOC2007/JPEGImages/008374.jpg 500 375 19 258 223 320 294 19 323 216 403 288 14 185 181 271 375 14 292 202 369 373 +4215 /data/VOCdevkit/VOC2007/JPEGImages/008376.jpg 500 375 6 44 22 461 359 14 374 61 416 94 14 422 56 459 130 14 448 61 479 177 6 302 75 450 180 +4216 /data/VOCdevkit/VOC2007/JPEGImages/008381.jpg 463 500 14 62 46 463 500 +4217 /data/VOCdevkit/VOC2007/JPEGImages/008384.jpg 500 335 2 203 86 295 278 +4218 /data/VOCdevkit/VOC2007/JPEGImages/008385.jpg 369 500 10 1 378 327 500 14 104 196 305 454 8 269 318 354 500 +4219 /data/VOCdevkit/VOC2007/JPEGImages/008386.jpg 500 375 19 154 56 256 162 19 266 56 361 156 8 204 284 370 375 +4220 /data/VOCdevkit/VOC2007/JPEGImages/008387.jpg 500 375 5 256 2 500 372 14 395 150 465 375 14 305 169 431 375 14 232 149 322 361 14 152 238 330 375 14 29 215 164 375 14 110 115 135 155 +4221 /data/VOCdevkit/VOC2007/JPEGImages/008388.jpg 450 338 6 1 1 450 337 +4222 /data/VOCdevkit/VOC2007/JPEGImages/008390.jpg 375 500 14 54 230 301 450 14 32 117 289 500 8 31 111 335 489 +4223 /data/VOCdevkit/VOC2007/JPEGImages/008391.jpg 500 309 6 5 46 497 307 14 205 118 247 178 +4224 /data/VOCdevkit/VOC2007/JPEGImages/008397.jpg 500 375 6 199 354 294 375 14 19 322 36 358 14 42 324 54 358 5 58 290 294 375 5 6 303 68 329 +4225 /data/VOCdevkit/VOC2007/JPEGImages/008398.jpg 500 375 14 32 63 158 169 14 121 109 179 191 14 194 108 243 375 14 222 98 305 375 14 279 106 362 234 14 312 75 362 128 14 291 92 471 375 14 408 77 500 374 14 100 121 214 375 14 1 81 129 375 +4226 /data/VOCdevkit/VOC2007/JPEGImages/008403.jpg 499 500 7 229 17 499 385 +4227 /data/VOCdevkit/VOC2007/JPEGImages/008409.jpg 500 375 17 56 188 184 337 +4228 /data/VOCdevkit/VOC2007/JPEGImages/008410.jpg 500 375 14 295 156 411 367 14 1 160 153 375 14 169 121 232 226 14 260 120 319 229 14 139 170 215 375 14 211 149 298 375 +4229 /data/VOCdevkit/VOC2007/JPEGImages/008413.jpg 500 375 14 147 71 452 375 14 1 18 224 318 8 103 39 500 375 8 1 71 269 375 +4230 /data/VOCdevkit/VOC2007/JPEGImages/008415.jpg 500 349 11 267 139 379 310 11 36 104 206 217 +4231 /data/VOCdevkit/VOC2007/JPEGImages/008416.jpg 500 333 11 274 39 454 333 11 114 120 273 277 +4232 /data/VOCdevkit/VOC2007/JPEGImages/008422.jpg 500 375 19 87 22 224 113 19 145 171 262 304 19 274 177 407 330 +4233 /data/VOCdevkit/VOC2007/JPEGImages/008423.jpg 500 322 2 1 72 399 322 +4234 /data/VOCdevkit/VOC2007/JPEGImages/008424.jpg 333 500 15 198 404 333 500 15 140 341 270 461 15 75 120 258 390 15 28 221 79 291 15 29 197 100 226 15 8 130 85 197 +4235 /data/VOCdevkit/VOC2007/JPEGImages/008425.jpg 500 375 11 322 258 496 341 +4236 /data/VOCdevkit/VOC2007/JPEGImages/008426.jpg 500 398 2 160 81 380 329 +4237 /data/VOCdevkit/VOC2007/JPEGImages/008427.jpg 500 333 12 18 1 416 333 +4238 /data/VOCdevkit/VOC2007/JPEGImages/008429.jpg 500 339 6 148 127 370 188 +4239 /data/VOCdevkit/VOC2007/JPEGImages/008430.jpg 500 333 14 81 12 464 333 +4240 /data/VOCdevkit/VOC2007/JPEGImages/008433.jpg 500 364 1 280 195 386 348 1 172 126 261 271 1 107 78 200 209 14 274 103 422 303 14 170 43 295 234 14 125 14 227 194 +4241 /data/VOCdevkit/VOC2007/JPEGImages/008434.jpg 500 313 18 1 40 496 203 +4242 /data/VOCdevkit/VOC2007/JPEGImages/008437.jpg 333 500 12 71 122 239 362 14 52 178 103 267 +4243 /data/VOCdevkit/VOC2007/JPEGImages/008438.jpg 500 333 2 215 137 377 287 +4244 /data/VOCdevkit/VOC2007/JPEGImages/008442.jpg 500 375 7 231 70 387 221 +4245 /data/VOCdevkit/VOC2007/JPEGImages/008443.jpg 500 382 2 206 98 393 310 +4246 /data/VOCdevkit/VOC2007/JPEGImages/008444.jpg 500 375 6 19 36 500 250 13 10 36 497 304 14 446 17 493 108 14 88 16 139 81 14 32 26 68 92 14 9 15 38 94 14 344 30 387 107 14 217 22 242 42 14 348 29 368 54 14 489 32 500 93 +4247 /data/VOCdevkit/VOC2007/JPEGImages/008445.jpg 500 333 18 1 4 490 333 +4248 /data/VOCdevkit/VOC2007/JPEGImages/008449.jpg 500 375 6 436 208 482 234 3 1 13 467 266 14 443 202 461 241 +4249 /data/VOCdevkit/VOC2007/JPEGImages/008450.jpg 500 333 0 178 102 447 205 +4250 /data/VOCdevkit/VOC2007/JPEGImages/008452.jpg 500 369 17 157 172 374 295 14 118 162 310 310 +4251 /data/VOCdevkit/VOC2007/JPEGImages/008453.jpg 500 400 7 281 105 340 152 14 72 91 238 359 8 225 1 500 362 +4252 /data/VOCdevkit/VOC2007/JPEGImages/008454.jpg 375 500 3 2 249 375 500 +4253 /data/VOCdevkit/VOC2007/JPEGImages/008456.jpg 500 333 3 295 6 479 240 +4254 /data/VOCdevkit/VOC2007/JPEGImages/008461.jpg 500 333 6 261 135 355 171 6 154 161 358 224 +4255 /data/VOCdevkit/VOC2007/JPEGImages/008462.jpg 500 375 8 333 248 458 375 8 157 204 240 315 8 118 195 189 290 8 79 181 138 268 8 57 175 108 245 8 12 167 69 233 8 1 163 38 221 19 61 133 87 162 19 86 134 107 167 19 100 135 129 172 19 125 138 168 179 19 174 140 218 187 19 215 147 273 199 19 297 154 369 223 19 392 163 493 245 +4256 /data/VOCdevkit/VOC2007/JPEGImages/008465.jpg 500 500 15 19 27 499 498 +4257 /data/VOCdevkit/VOC2007/JPEGImages/008466.jpg 500 333 6 212 121 442 230 +4258 /data/VOCdevkit/VOC2007/JPEGImages/008467.jpg 375 500 11 68 153 251 433 14 179 12 375 486 14 1 109 155 277 +4259 /data/VOCdevkit/VOC2007/JPEGImages/008468.jpg 320 240 17 51 122 172 197 8 217 155 314 227 8 243 128 293 169 +4260 /data/VOCdevkit/VOC2007/JPEGImages/008470.jpg 500 375 10 151 175 500 375 14 397 114 500 281 14 284 77 421 228 14 63 138 235 375 14 1 73 104 341 +4261 /data/VOCdevkit/VOC2007/JPEGImages/008472.jpg 500 461 0 12 22 489 448 +4262 /data/VOCdevkit/VOC2007/JPEGImages/008475.jpg 500 375 14 424 92 482 205 9 246 125 305 162 9 139 195 383 351 9 19 266 246 375 9 145 312 380 375 +4263 /data/VOCdevkit/VOC2007/JPEGImages/008477.jpg 500 358 11 27 118 271 358 11 259 63 500 358 +4264 /data/VOCdevkit/VOC2007/JPEGImages/008478.jpg 500 375 1 1 169 53 245 1 24 160 100 240 1 134 161 207 215 6 94 138 422 306 6 373 131 500 227 +4265 /data/VOCdevkit/VOC2007/JPEGImages/008482.jpg 500 375 6 168 152 404 240 14 46 117 80 203 14 385 132 409 198 14 417 130 439 197 14 433 125 463 200 14 482 131 500 198 14 476 125 491 198 6 77 136 156 170 14 105 122 127 171 14 143 121 166 174 6 2 121 47 159 +4266 /data/VOCdevkit/VOC2007/JPEGImages/008483.jpg 500 333 6 202 137 348 186 +4267 /data/VOCdevkit/VOC2007/JPEGImages/008484.jpg 500 375 6 1 1 407 315 +4268 /data/VOCdevkit/VOC2007/JPEGImages/008485.jpg 500 375 7 22 1 262 373 14 5 3 499 375 +4269 /data/VOCdevkit/VOC2007/JPEGImages/008492.jpg 500 324 18 153 69 496 243 +4270 /data/VOCdevkit/VOC2007/JPEGImages/008494.jpg 500 375 5 210 143 296 230 +4271 /data/VOCdevkit/VOC2007/JPEGImages/008495.jpg 500 357 0 216 101 426 261 +4272 /data/VOCdevkit/VOC2007/JPEGImages/008498.jpg 500 358 3 47 90 488 335 +4273 /data/VOCdevkit/VOC2007/JPEGImages/008499.jpg 500 334 17 123 35 500 334 +4274 /data/VOCdevkit/VOC2007/JPEGImages/008502.jpg 385 500 6 2 51 385 500 +4275 /data/VOCdevkit/VOC2007/JPEGImages/008503.jpg 500 375 5 3 5 218 375 6 434 281 500 375 6 351 222 461 298 6 256 245 366 360 6 254 212 331 270 6 320 184 366 222 +4276 /data/VOCdevkit/VOC2007/JPEGImages/008506.jpg 500 319 18 10 142 93 252 18 89 49 457 291 +4277 /data/VOCdevkit/VOC2007/JPEGImages/008509.jpg 500 338 11 27 206 69 277 11 224 178 270 251 11 338 195 419 272 12 94 65 167 249 14 82 6 175 177 +4278 /data/VOCdevkit/VOC2007/JPEGImages/008512.jpg 500 400 11 209 106 318 207 +4279 /data/VOCdevkit/VOC2007/JPEGImages/008513.jpg 500 375 14 1 5 479 375 +4280 /data/VOCdevkit/VOC2007/JPEGImages/008514.jpg 500 333 1 115 82 178 209 1 163 124 234 261 1 260 143 337 266 1 337 75 393 185 14 334 15 422 165 14 401 1 461 119 14 256 75 354 241 14 165 50 256 243 14 238 22 295 173 14 281 7 333 96 14 127 23 220 144 +4281 /data/VOCdevkit/VOC2007/JPEGImages/008517.jpg 500 333 6 1 2 345 333 +4282 /data/VOCdevkit/VOC2007/JPEGImages/008518.jpg 500 353 11 81 53 374 248 +4283 /data/VOCdevkit/VOC2007/JPEGImages/008519.jpg 500 375 2 125 41 479 282 +4284 /data/VOCdevkit/VOC2007/JPEGImages/008521.jpg 500 375 7 76 2 381 375 +4285 /data/VOCdevkit/VOC2007/JPEGImages/008522.jpg 500 333 0 198 144 335 188 +4286 /data/VOCdevkit/VOC2007/JPEGImages/008523.jpg 500 333 0 235 125 436 249 0 1 1 323 322 +4287 /data/VOCdevkit/VOC2007/JPEGImages/008524.jpg 400 290 6 7 1 76 34 12 1 6 391 287 +4288 /data/VOCdevkit/VOC2007/JPEGImages/008526.jpg 375 500 12 133 250 274 424 12 255 246 316 385 14 57 218 86 258 14 82 203 101 242 14 100 176 156 280 +4289 /data/VOCdevkit/VOC2007/JPEGImages/008529.jpg 375 500 10 1 349 265 500 10 109 196 277 439 14 4 189 150 367 14 62 170 142 293 14 114 157 191 277 14 177 150 248 234 14 247 157 330 251 14 266 194 375 425 14 242 312 375 500 14 8 108 45 172 +4290 /data/VOCdevkit/VOC2007/JPEGImages/008530.jpg 500 333 11 1 32 327 333 +4291 /data/VOCdevkit/VOC2007/JPEGImages/008533.jpg 500 425 7 4 28 481 424 +4292 /data/VOCdevkit/VOC2007/JPEGImages/008534.jpg 500 387 7 143 21 487 387 +4293 /data/VOCdevkit/VOC2007/JPEGImages/008535.jpg 500 375 13 119 11 500 250 11 43 76 376 374 +4294 /data/VOCdevkit/VOC2007/JPEGImages/008536.jpg 375 500 15 254 339 277 376 15 32 322 66 364 15 155 306 195 378 15 132 330 169 381 +4295 /data/VOCdevkit/VOC2007/JPEGImages/008541.jpg 500 336 14 40 107 64 138 14 199 153 242 243 14 2 80 147 336 14 315 55 382 172 14 292 57 500 335 +4296 /data/VOCdevkit/VOC2007/JPEGImages/008542.jpg 371 500 7 73 151 289 349 8 82 1 310 189 +4297 /data/VOCdevkit/VOC2007/JPEGImages/008549.jpg 500 333 6 278 37 472 160 6 99 29 440 309 15 17 18 82 145 +4298 /data/VOCdevkit/VOC2007/JPEGImages/008550.jpg 500 375 6 55 107 377 324 6 371 40 459 119 14 440 31 475 190 14 261 21 336 125 14 139 33 201 115 14 224 18 263 112 14 118 29 151 121 +4299 /data/VOCdevkit/VOC2007/JPEGImages/008553.jpg 500 335 18 29 119 269 248 +4300 /data/VOCdevkit/VOC2007/JPEGImages/008556.jpg 500 333 8 284 100 500 333 +4301 /data/VOCdevkit/VOC2007/JPEGImages/008557.jpg 500 335 19 151 135 213 193 15 23 127 49 173 15 1 150 19 185 15 36 174 61 208 15 19 180 39 214 15 5 182 22 218 15 33 209 60 243 17 186 189 446 334 +4302 /data/VOCdevkit/VOC2007/JPEGImages/008558.jpg 500 375 11 103 36 295 198 11 284 108 475 328 11 102 166 284 349 +4303 /data/VOCdevkit/VOC2007/JPEGImages/008559.jpg 333 500 14 103 66 333 500 14 1 140 82 471 +4304 /data/VOCdevkit/VOC2007/JPEGImages/008562.jpg 500 375 5 75 49 383 298 6 12 184 58 213 14 196 130 240 198 14 128 137 174 178 14 431 158 443 187 13 461 161 486 192 +4305 /data/VOCdevkit/VOC2007/JPEGImages/008564.jpg 437 500 12 199 195 396 308 12 3 198 139 284 +4306 /data/VOCdevkit/VOC2007/JPEGImages/008568.jpg 500 375 3 228 89 500 284 3 17 121 296 283 +4307 /data/VOCdevkit/VOC2007/JPEGImages/008572.jpg 500 375 6 34 61 457 320 +4308 /data/VOCdevkit/VOC2007/JPEGImages/008573.jpg 500 418 17 73 190 327 415 14 176 178 303 314 +4309 /data/VOCdevkit/VOC2007/JPEGImages/008576.jpg 500 364 14 208 41 343 364 14 342 121 454 364 14 125 129 244 364 14 10 198 117 364 +4310 /data/VOCdevkit/VOC2007/JPEGImages/008581.jpg 333 500 6 105 59 333 309 6 1 167 234 495 +4311 /data/VOCdevkit/VOC2007/JPEGImages/008582.jpg 500 348 14 15 3 476 344 8 97 115 443 344 +4312 /data/VOCdevkit/VOC2007/JPEGImages/008584.jpg 340 500 3 66 277 209 372 +4313 /data/VOCdevkit/VOC2007/JPEGImages/008585.jpg 500 334 14 1 1 499 334 +4314 /data/VOCdevkit/VOC2007/JPEGImages/008586.jpg 500 379 6 174 36 483 274 +4315 /data/VOCdevkit/VOC2007/JPEGImages/008587.jpg 500 375 14 163 84 500 375 14 172 126 321 339 14 3 135 129 305 15 128 85 201 165 +4316 /data/VOCdevkit/VOC2007/JPEGImages/008588.jpg 500 375 2 289 237 312 282 2 319 200 370 220 +4317 /data/VOCdevkit/VOC2007/JPEGImages/008592.jpg 500 429 16 2 209 128 427 16 40 222 320 427 4 30 60 135 138 4 309 158 393 248 14 373 10 478 426 14 108 3 284 420 14 100 4 264 227 14 272 4 497 424 +4318 /data/VOCdevkit/VOC2007/JPEGImages/008595.jpg 500 333 13 94 103 219 269 13 165 2 500 333 +4319 /data/VOCdevkit/VOC2007/JPEGImages/008596.jpg 356 480 12 142 128 239 426 14 120 72 266 290 +4320 /data/VOCdevkit/VOC2007/JPEGImages/008601.jpg 500 375 6 79 16 500 364 6 295 66 500 203 6 244 7 353 48 +4321 /data/VOCdevkit/VOC2007/JPEGImages/008602.jpg 500 375 17 1 24 327 211 14 1 91 122 331 14 150 144 295 374 14 276 78 500 375 +4322 /data/VOCdevkit/VOC2007/JPEGImages/008604.jpg 500 375 3 1 115 471 375 14 86 20 159 268 14 147 96 230 276 14 142 190 256 328 14 251 145 353 326 14 321 101 396 202 14 336 85 391 179 14 379 82 447 173 +4323 /data/VOCdevkit/VOC2007/JPEGImages/008606.jpg 500 375 11 114 75 348 360 +4324 /data/VOCdevkit/VOC2007/JPEGImages/008607.jpg 500 375 9 5 103 307 315 9 195 107 440 340 +4325 /data/VOCdevkit/VOC2007/JPEGImages/008608.jpg 500 333 10 3 2 498 330 +4326 /data/VOCdevkit/VOC2007/JPEGImages/008610.jpg 500 326 12 186 73 337 291 12 373 53 452 293 +4327 /data/VOCdevkit/VOC2007/JPEGImages/008612.jpg 500 300 14 175 124 220 234 12 97 147 295 234 +4328 /data/VOCdevkit/VOC2007/JPEGImages/008615.jpg 500 375 9 50 170 118 209 +4329 /data/VOCdevkit/VOC2007/JPEGImages/008617.jpg 500 375 14 45 52 320 375 14 258 89 486 374 14 429 33 500 169 +4330 /data/VOCdevkit/VOC2007/JPEGImages/008618.jpg 500 331 16 282 116 393 241 16 198 113 334 254 16 143 125 292 261 16 94 139 297 328 16 42 148 233 331 14 1 1 164 330 14 284 17 373 149 14 391 21 455 215 14 148 7 214 161 14 89 16 149 158 +4331 /data/VOCdevkit/VOC2007/JPEGImages/008620.jpg 500 375 11 15 22 404 375 +4332 /data/VOCdevkit/VOC2007/JPEGImages/008621.jpg 500 257 18 256 26 481 238 +4333 /data/VOCdevkit/VOC2007/JPEGImages/008624.jpg 500 375 8 135 203 215 351 8 259 193 334 310 8 236 216 334 375 +4334 /data/VOCdevkit/VOC2007/JPEGImages/008628.jpg 375 500 8 169 31 320 173 14 1 1 250 406 +4335 /data/VOCdevkit/VOC2007/JPEGImages/008633.jpg 500 247 1 125 4 292 80 1 128 2 270 59 6 296 12 500 233 6 2 5 196 244 +4336 /data/VOCdevkit/VOC2007/JPEGImages/008635.jpg 500 372 2 154 70 479 251 +4337 /data/VOCdevkit/VOC2007/JPEGImages/008636.jpg 500 375 9 15 133 360 375 +4338 /data/VOCdevkit/VOC2007/JPEGImages/008638.jpg 500 333 18 47 47 233 293 18 235 50 483 280 14 13 212 49 306 +4339 /data/VOCdevkit/VOC2007/JPEGImages/008639.jpg 500 375 11 234 133 320 268 11 407 301 500 375 +4340 /data/VOCdevkit/VOC2007/JPEGImages/008644.jpg 500 350 14 9 52 132 329 14 128 43 246 337 14 419 7 492 345 14 337 78 423 342 14 231 49 333 339 +4341 /data/VOCdevkit/VOC2007/JPEGImages/008645.jpg 500 330 3 210 153 300 308 +4342 /data/VOCdevkit/VOC2007/JPEGImages/008647.jpg 500 375 14 1 2 465 375 +4343 /data/VOCdevkit/VOC2007/JPEGImages/008653.jpg 333 500 12 137 27 312 454 +4344 /data/VOCdevkit/VOC2007/JPEGImages/008654.jpg 500 338 2 40 116 259 257 +4345 /data/VOCdevkit/VOC2007/JPEGImages/008655.jpg 375 500 15 234 48 280 128 11 258 328 357 500 11 266 205 299 283 19 213 128 269 178 10 101 177 253 307 8 198 175 270 302 8 138 187 209 327 8 85 171 157 296 +4346 /data/VOCdevkit/VOC2007/JPEGImages/008663.jpg 500 375 6 1 106 496 328 14 242 60 277 105 14 111 115 141 135 14 383 89 412 131 +4347 /data/VOCdevkit/VOC2007/JPEGImages/008665.jpg 500 333 6 57 15 452 325 17 355 17 446 56 17 383 22 449 75 +4348 /data/VOCdevkit/VOC2007/JPEGImages/008667.jpg 500 336 0 15 22 433 328 +4349 /data/VOCdevkit/VOC2007/JPEGImages/008670.jpg 331 500 2 56 115 254 263 2 60 279 252 397 +4350 /data/VOCdevkit/VOC2007/JPEGImages/008676.jpg 500 336 13 415 199 478 279 13 245 256 345 334 13 182 217 232 308 13 53 223 106 292 6 125 153 249 238 14 411 140 481 251 14 252 143 343 327 14 167 141 246 276 14 44 151 109 276 14 29 156 48 200 14 14 154 34 198 +4351 /data/VOCdevkit/VOC2007/JPEGImages/008680.jpg 500 375 5 223 166 316 218 6 335 140 500 359 6 4 195 178 310 6 174 207 286 266 6 275 202 354 248 +4352 /data/VOCdevkit/VOC2007/JPEGImages/008683.jpg 500 333 0 8 3 500 333 +4353 /data/VOCdevkit/VOC2007/JPEGImages/008687.jpg 500 375 11 2 2 415 262 +4354 /data/VOCdevkit/VOC2007/JPEGImages/008688.jpg 500 325 15 2 1 500 325 +4355 /data/VOCdevkit/VOC2007/JPEGImages/008690.jpg 500 333 14 147 14 337 267 +4356 /data/VOCdevkit/VOC2007/JPEGImages/008691.jpg 500 334 18 1 140 454 213 +4357 /data/VOCdevkit/VOC2007/JPEGImages/008692.jpg 500 333 0 2 54 500 259 14 160 152 291 329 14 58 164 80 232 14 18 164 42 220 14 178 166 210 263 +4358 /data/VOCdevkit/VOC2007/JPEGImages/008695.jpg 500 333 13 4 21 482 333 13 140 1 417 57 +4359 /data/VOCdevkit/VOC2007/JPEGImages/008698.jpg 357 500 14 2 29 287 500 +4360 /data/VOCdevkit/VOC2007/JPEGImages/008699.jpg 500 375 12 148 135 394 365 14 240 56 312 253 +4361 /data/VOCdevkit/VOC2007/JPEGImages/008701.jpg 500 375 14 143 135 265 314 14 2 18 431 350 +4362 /data/VOCdevkit/VOC2007/JPEGImages/008702.jpg 500 375 5 31 96 489 346 1 89 286 283 375 14 118 196 212 375 14 76 219 130 375 14 1 191 22 342 +4363 /data/VOCdevkit/VOC2007/JPEGImages/008706.jpg 500 333 9 224 162 284 258 9 270 171 309 243 9 290 164 333 237 9 316 163 348 237 9 179 164 224 247 9 142 188 188 273 6 31 139 73 181 6 1 136 34 172 +4364 /data/VOCdevkit/VOC2007/JPEGImages/008709.jpg 500 375 19 36 164 142 249 +4365 /data/VOCdevkit/VOC2007/JPEGImages/008710.jpg 500 335 18 138 50 323 249 +4366 /data/VOCdevkit/VOC2007/JPEGImages/008713.jpg 500 333 17 1 76 478 333 +4367 /data/VOCdevkit/VOC2007/JPEGImages/008716.jpg 500 333 6 196 93 361 207 +4368 /data/VOCdevkit/VOC2007/JPEGImages/008717.jpg 500 375 10 185 156 283 256 8 167 149 217 263 8 203 162 251 287 8 139 147 188 207 +4369 /data/VOCdevkit/VOC2007/JPEGImages/008718.jpg 500 375 14 373 130 449 359 14 328 163 349 209 18 1 4 348 375 +4370 /data/VOCdevkit/VOC2007/JPEGImages/008720.jpg 333 500 7 93 235 250 386 +4371 /data/VOCdevkit/VOC2007/JPEGImages/008722.jpg 500 332 9 302 206 393 292 +4372 /data/VOCdevkit/VOC2007/JPEGImages/008723.jpg 500 334 0 5 66 468 252 +4373 /data/VOCdevkit/VOC2007/JPEGImages/008725.jpg 500 375 3 15 116 266 241 +4374 /data/VOCdevkit/VOC2007/JPEGImages/008727.jpg 375 500 6 3 249 375 500 +4375 /data/VOCdevkit/VOC2007/JPEGImages/008728.jpg 500 375 11 249 148 472 375 14 1 93 337 375 +4376 /data/VOCdevkit/VOC2007/JPEGImages/008730.jpg 500 375 3 160 207 436 284 3 213 176 277 199 3 341 187 465 230 3 138 129 203 208 +4377 /data/VOCdevkit/VOC2007/JPEGImages/008731.jpg 500 332 12 150 93 255 278 14 295 97 383 282 +4378 /data/VOCdevkit/VOC2007/JPEGImages/008732.jpg 371 500 2 101 197 223 395 +4379 /data/VOCdevkit/VOC2007/JPEGImages/008733.jpg 500 375 8 342 169 412 331 8 232 191 357 372 8 168 182 266 350 10 171 183 445 375 +4380 /data/VOCdevkit/VOC2007/JPEGImages/008738.jpg 500 333 11 1 137 357 332 14 316 1 466 218 +4381 /data/VOCdevkit/VOC2007/JPEGImages/008739.jpg 333 500 14 113 348 131 414 6 164 364 204 399 6 202 366 333 489 +4382 /data/VOCdevkit/VOC2007/JPEGImages/008741.jpg 375 500 1 4 4 374 499 +4383 /data/VOCdevkit/VOC2007/JPEGImages/008742.jpg 334 500 13 185 413 257 469 14 88 394 112 463 14 61 390 81 462 +4384 /data/VOCdevkit/VOC2007/JPEGImages/008744.jpg 332 500 14 125 128 265 325 12 131 180 270 383 +4385 /data/VOCdevkit/VOC2007/JPEGImages/008747.jpg 375 500 5 43 49 309 261 6 320 144 375 190 +4386 /data/VOCdevkit/VOC2007/JPEGImages/008748.jpg 344 500 14 118 327 204 453 14 204 344 242 454 14 241 340 272 458 14 270 344 294 457 14 82 339 125 456 14 43 333 81 468 14 302 274 338 358 14 7 290 29 355 +4387 /data/VOCdevkit/VOC2007/JPEGImages/008749.jpg 500 375 15 3 3 500 375 +4388 /data/VOCdevkit/VOC2007/JPEGImages/008750.jpg 500 375 6 24 81 479 304 +4389 /data/VOCdevkit/VOC2007/JPEGImages/008752.jpg 500 334 13 1 13 423 329 14 221 44 286 84 14 448 1 500 244 14 411 44 426 90 14 394 48 417 88 +4390 /data/VOCdevkit/VOC2007/JPEGImages/008753.jpg 500 437 2 363 274 482 367 +4391 /data/VOCdevkit/VOC2007/JPEGImages/008755.jpg 500 333 2 211 3 408 331 +4392 /data/VOCdevkit/VOC2007/JPEGImages/008756.jpg 500 375 7 210 121 289 174 +4393 /data/VOCdevkit/VOC2007/JPEGImages/008757.jpg 500 375 1 49 82 421 290 +4394 /data/VOCdevkit/VOC2007/JPEGImages/008759.jpg 500 375 1 147 1 500 374 +4395 /data/VOCdevkit/VOC2007/JPEGImages/008760.jpg 500 375 8 1 213 263 375 17 104 151 334 287 +4396 /data/VOCdevkit/VOC2007/JPEGImages/008764.jpg 400 500 2 100 38 340 325 +4397 /data/VOCdevkit/VOC2007/JPEGImages/008766.jpg 335 500 18 3 123 255 450 14 179 238 222 289 +4398 /data/VOCdevkit/VOC2007/JPEGImages/008768.jpg 367 500 14 89 111 165 366 14 259 124 355 359 6 1 124 247 315 +4399 /data/VOCdevkit/VOC2007/JPEGImages/008769.jpg 500 373 14 221 24 500 373 14 9 53 286 373 +4400 /data/VOCdevkit/VOC2007/JPEGImages/008770.jpg 500 333 0 185 106 337 190 +4401 /data/VOCdevkit/VOC2007/JPEGImages/008771.jpg 500 335 5 62 104 433 203 14 454 157 465 196 +4402 /data/VOCdevkit/VOC2007/JPEGImages/008772.jpg 500 375 7 8 84 491 373 +4403 /data/VOCdevkit/VOC2007/JPEGImages/008773.jpg 500 375 2 114 129 499 306 +4404 /data/VOCdevkit/VOC2007/JPEGImages/008775.jpg 500 333 14 178 153 300 270 14 252 61 426 260 14 8 1 64 102 14 58 1 97 95 14 91 1 152 96 14 161 1 205 103 14 220 1 278 107 14 358 1 402 107 14 399 1 450 109 14 445 1 493 107 +4405 /data/VOCdevkit/VOC2007/JPEGImages/008776.jpg 500 333 2 160 38 296 314 +4406 /data/VOCdevkit/VOC2007/JPEGImages/008783.jpg 500 375 10 150 238 479 373 8 86 227 224 375 +4407 /data/VOCdevkit/VOC2007/JPEGImages/008784.jpg 500 262 6 429 139 484 168 6 200 140 235 170 6 150 140 194 169 6 44 141 93 172 6 324 131 382 170 +4408 /data/VOCdevkit/VOC2007/JPEGImages/008790.jpg 500 327 18 1 169 213 230 +4409 /data/VOCdevkit/VOC2007/JPEGImages/008793.jpg 500 375 5 134 1 433 241 +4410 /data/VOCdevkit/VOC2007/JPEGImages/008794.jpg 500 375 14 1 107 46 254 14 41 149 97 250 14 125 143 170 172 14 184 137 208 166 14 224 97 249 124 14 355 131 383 166 14 420 78 447 135 6 81 96 500 312 14 272 64 310 108 14 242 67 270 113 14 203 64 240 149 +4411 /data/VOCdevkit/VOC2007/JPEGImages/008796.jpg 500 380 2 189 155 289 203 +4412 /data/VOCdevkit/VOC2007/JPEGImages/008799.jpg 500 375 0 22 50 500 298 +4413 /data/VOCdevkit/VOC2007/JPEGImages/008801.jpg 500 411 14 139 13 311 368 13 426 1 500 171 6 401 1 500 88 6 193 1 390 79 6 95 14 311 99 +4414 /data/VOCdevkit/VOC2007/JPEGImages/008805.jpg 405 480 12 60 143 348 450 14 159 117 279 284 +4415 /data/VOCdevkit/VOC2007/JPEGImages/008806.jpg 500 375 15 418 173 442 245 +4416 /data/VOCdevkit/VOC2007/JPEGImages/008809.jpg 500 320 7 38 40 443 221 +4417 /data/VOCdevkit/VOC2007/JPEGImages/008810.jpg 500 333 13 116 25 369 211 14 365 71 415 141 14 5 83 64 177 +4418 /data/VOCdevkit/VOC2007/JPEGImages/008811.jpg 500 375 1 3 56 500 375 +4419 /data/VOCdevkit/VOC2007/JPEGImages/008813.jpg 500 375 2 189 103 356 244 14 318 29 479 368 14 1 1 101 375 14 426 156 500 255 14 259 166 495 375 14 176 132 262 363 14 100 93 135 160 +4420 /data/VOCdevkit/VOC2007/JPEGImages/008814.jpg 500 332 8 369 172 436 266 8 189 214 277 332 8 102 191 181 321 10 127 200 362 320 +4421 /data/VOCdevkit/VOC2007/JPEGImages/008815.jpg 500 375 7 2 30 230 364 +4422 /data/VOCdevkit/VOC2007/JPEGImages/008817.jpg 500 375 14 274 13 412 374 13 5 36 465 375 +4423 /data/VOCdevkit/VOC2007/JPEGImages/008819.jpg 375 500 11 131 79 294 450 +4424 /data/VOCdevkit/VOC2007/JPEGImages/008822.jpg 500 333 11 1 12 393 333 +4425 /data/VOCdevkit/VOC2007/JPEGImages/008823.jpg 500 333 17 58 114 500 290 +4426 /data/VOCdevkit/VOC2007/JPEGImages/008826.jpg 500 375 6 346 188 500 336 +4427 /data/VOCdevkit/VOC2007/JPEGImages/008831.jpg 500 437 1 12 241 276 403 1 257 253 497 404 +4428 /data/VOCdevkit/VOC2007/JPEGImages/008833.jpg 500 375 14 26 1 305 375 +4429 /data/VOCdevkit/VOC2007/JPEGImages/008835.jpg 500 375 15 42 5 168 117 15 174 4 290 138 15 302 18 381 117 15 397 54 477 152 15 331 129 425 221 15 253 169 358 277 15 154 117 244 212 +4430 /data/VOCdevkit/VOC2007/JPEGImages/008836.jpg 500 375 14 148 80 441 375 14 340 70 430 266 14 1 115 127 375 14 446 278 500 375 14 417 112 500 330 14 429 1 456 67 14 256 11 282 77 14 1 103 55 214 +4431 /data/VOCdevkit/VOC2007/JPEGImages/008837.jpg 500 377 19 1 80 74 373 19 66 33 437 373 +4432 /data/VOCdevkit/VOC2007/JPEGImages/008838.jpg 500 321 5 122 45 334 278 +4433 /data/VOCdevkit/VOC2007/JPEGImages/008840.jpg 500 333 11 139 2 425 258 +4434 /data/VOCdevkit/VOC2007/JPEGImages/008841.jpg 500 375 11 178 243 249 375 4 325 55 341 89 4 299 54 313 89 +4435 /data/VOCdevkit/VOC2007/JPEGImages/008843.jpg 500 333 6 120 106 483 332 +4436 /data/VOCdevkit/VOC2007/JPEGImages/008847.jpg 500 361 0 115 45 292 270 +4437 /data/VOCdevkit/VOC2007/JPEGImages/008848.jpg 500 378 6 270 232 419 337 5 116 230 174 314 +4438 /data/VOCdevkit/VOC2007/JPEGImages/008849.jpg 500 375 11 141 139 340 375 17 2 78 500 375 +4439 /data/VOCdevkit/VOC2007/JPEGImages/008854.jpg 500 333 7 71 1 500 333 +4440 /data/VOCdevkit/VOC2007/JPEGImages/008856.jpg 500 375 7 50 3 500 375 +4441 /data/VOCdevkit/VOC2007/JPEGImages/008858.jpg 500 333 2 209 60 378 302 +4442 /data/VOCdevkit/VOC2007/JPEGImages/008859.jpg 500 333 6 128 100 219 148 6 104 82 167 121 +4443 /data/VOCdevkit/VOC2007/JPEGImages/008862.jpg 318 480 12 110 187 214 445 14 112 90 231 320 +4444 /data/VOCdevkit/VOC2007/JPEGImages/008865.jpg 500 334 14 272 161 500 303 17 155 187 500 334 +4445 /data/VOCdevkit/VOC2007/JPEGImages/008867.jpg 500 332 12 110 178 428 271 14 187 96 320 262 +4446 /data/VOCdevkit/VOC2007/JPEGImages/008871.jpg 500 409 16 26 21 487 409 +4447 /data/VOCdevkit/VOC2007/JPEGImages/008872.jpg 360 270 14 130 126 244 270 +4448 /data/VOCdevkit/VOC2007/JPEGImages/008873.jpg 500 357 0 90 80 237 264 +4449 /data/VOCdevkit/VOC2007/JPEGImages/008874.jpg 500 375 19 89 166 148 220 17 105 173 383 315 8 246 232 500 375 +4450 /data/VOCdevkit/VOC2007/JPEGImages/008876.jpg 500 333 14 224 102 299 253 12 49 188 486 333 +4451 /data/VOCdevkit/VOC2007/JPEGImages/008878.jpg 500 375 18 173 138 383 196 +4452 /data/VOCdevkit/VOC2007/JPEGImages/008879.jpg 500 375 14 127 67 375 375 14 151 161 310 374 +4453 /data/VOCdevkit/VOC2007/JPEGImages/008880.jpg 500 375 7 154 54 404 323 +4454 /data/VOCdevkit/VOC2007/JPEGImages/008883.jpg 500 375 5 155 220 318 285 5 333 225 408 284 +4455 /data/VOCdevkit/VOC2007/JPEGImages/008884.jpg 500 375 14 149 179 208 375 14 203 201 252 368 3 2 3 369 259 +4456 /data/VOCdevkit/VOC2007/JPEGImages/008885.jpg 395 500 7 1 42 350 496 +4457 /data/VOCdevkit/VOC2007/JPEGImages/008886.jpg 241 203 12 11 1 229 201 14 167 2 241 172 +4458 /data/VOCdevkit/VOC2007/JPEGImages/008888.jpg 500 375 19 183 92 250 159 8 235 142 412 373 8 1 181 63 345 +4459 /data/VOCdevkit/VOC2007/JPEGImages/008890.jpg 375 500 11 110 154 358 249 +4460 /data/VOCdevkit/VOC2007/JPEGImages/008891.jpg 500 333 6 150 102 462 236 14 277 124 311 153 +4461 /data/VOCdevkit/VOC2007/JPEGImages/008892.jpg 500 375 6 43 318 160 375 6 243 318 283 349 6 281 315 334 350 6 312 311 408 361 6 1 303 65 375 6 372 251 500 360 14 195 315 208 347 +4462 /data/VOCdevkit/VOC2007/JPEGImages/008900.jpg 500 375 3 1 42 500 124 3 1 53 500 208 14 3 193 92 301 14 161 148 218 303 14 205 151 287 248 14 353 110 412 255 14 411 109 482 203 14 401 7 461 64 14 309 13 387 71 14 231 25 291 83 14 45 48 103 100 14 167 34 219 85 11 127 278 199 362 +4463 /data/VOCdevkit/VOC2007/JPEGImages/008905.jpg 500 375 0 2 82 500 298 +4464 /data/VOCdevkit/VOC2007/JPEGImages/008909.jpg 500 375 6 22 61 486 308 +4465 /data/VOCdevkit/VOC2007/JPEGImages/008911.jpg 500 375 5 205 30 354 234 5 269 1 450 39 6 319 21 452 91 6 73 29 247 92 6 2 49 122 121 6 45 146 247 270 14 136 107 158 150 14 59 206 101 312 14 15 188 46 294 +4466 /data/VOCdevkit/VOC2007/JPEGImages/008913.jpg 500 375 19 202 132 259 181 19 254 141 308 192 +4467 /data/VOCdevkit/VOC2007/JPEGImages/008914.jpg 500 370 12 166 103 355 342 +4468 /data/VOCdevkit/VOC2007/JPEGImages/008917.jpg 500 500 7 211 14 500 500 +4469 /data/VOCdevkit/VOC2007/JPEGImages/008919.jpg 378 250 12 87 79 249 205 +4470 /data/VOCdevkit/VOC2007/JPEGImages/008920.jpg 500 375 16 224 151 401 301 14 61 67 230 284 +4471 /data/VOCdevkit/VOC2007/JPEGImages/008921.jpg 500 400 14 128 2 339 400 +4472 /data/VOCdevkit/VOC2007/JPEGImages/008923.jpg 500 209 6 15 31 366 176 +4473 /data/VOCdevkit/VOC2007/JPEGImages/008926.jpg 500 413 2 231 98 370 313 +4474 /data/VOCdevkit/VOC2007/JPEGImages/008927.jpg 500 375 9 203 238 266 317 +4475 /data/VOCdevkit/VOC2007/JPEGImages/008929.jpg 500 333 6 1 57 441 240 +4476 /data/VOCdevkit/VOC2007/JPEGImages/008930.jpg 375 500 7 2 59 375 500 +4477 /data/VOCdevkit/VOC2007/JPEGImages/008931.jpg 500 374 4 218 257 281 374 4 43 211 82 353 14 111 117 274 374 14 249 122 390 374 14 70 140 171 318 14 1 136 93 299 14 307 2 460 374 +4478 /data/VOCdevkit/VOC2007/JPEGImages/008932.jpg 500 375 14 60 126 156 375 14 139 92 230 375 14 221 121 311 302 14 301 81 390 303 10 199 298 466 375 +4479 /data/VOCdevkit/VOC2007/JPEGImages/008933.jpg 375 500 7 80 230 248 401 15 234 346 284 407 15 234 383 297 447 +4480 /data/VOCdevkit/VOC2007/JPEGImages/008936.jpg 500 375 8 92 214 210 341 8 29 199 121 306 8 206 174 257 238 8 247 197 320 278 8 372 174 419 223 +4481 /data/VOCdevkit/VOC2007/JPEGImages/008939.jpg 500 375 6 409 233 500 312 +4482 /data/VOCdevkit/VOC2007/JPEGImages/008940.jpg 500 338 0 8 6 493 333 +4483 /data/VOCdevkit/VOC2007/JPEGImages/008942.jpg 500 375 16 20 179 176 295 16 189 190 286 283 16 301 199 419 276 16 351 186 390 210 16 391 183 426 207 16 299 191 355 223 16 146 182 192 206 16 61 181 189 284 +4484 /data/VOCdevkit/VOC2007/JPEGImages/008943.jpg 500 375 2 347 319 407 372 2 426 328 456 363 2 238 337 269 372 2 277 342 339 372 14 138 120 266 326 14 137 7 217 182 14 40 9 75 113 14 62 3 104 117 14 2 4 49 101 2 23 354 67 375 +4485 /data/VOCdevkit/VOC2007/JPEGImages/008944.jpg 444 500 14 1 1 443 500 +4486 /data/VOCdevkit/VOC2007/JPEGImages/008948.jpg 500 375 8 3 159 182 323 8 251 129 367 246 19 474 123 500 201 +4487 /data/VOCdevkit/VOC2007/JPEGImages/008951.jpg 375 500 11 3 17 375 500 +4488 /data/VOCdevkit/VOC2007/JPEGImages/008953.jpg 332 500 14 1 47 191 316 4 163 266 222 360 +4489 /data/VOCdevkit/VOC2007/JPEGImages/008955.jpg 375 500 19 61 160 307 362 +4490 /data/VOCdevkit/VOC2007/JPEGImages/008958.jpg 500 375 6 50 35 500 359 +4491 /data/VOCdevkit/VOC2007/JPEGImages/008960.jpg 500 327 14 440 183 486 270 14 337 199 362 272 +4492 /data/VOCdevkit/VOC2007/JPEGImages/008961.jpg 500 407 8 259 179 479 407 14 247 89 472 407 14 1 78 269 407 14 31 59 73 108 +4493 /data/VOCdevkit/VOC2007/JPEGImages/008962.jpg 500 375 4 86 39 135 215 +4494 /data/VOCdevkit/VOC2007/JPEGImages/008965.jpg 500 333 14 118 1 500 332 +4495 /data/VOCdevkit/VOC2007/JPEGImages/008966.jpg 500 375 5 128 27 500 303 +4496 /data/VOCdevkit/VOC2007/JPEGImages/008967.jpg 500 333 4 229 15 379 331 4 359 15 480 322 4 162 54 260 333 4 137 71 233 332 +4497 /data/VOCdevkit/VOC2007/JPEGImages/008968.jpg 500 375 6 86 50 443 332 +4498 /data/VOCdevkit/VOC2007/JPEGImages/008969.jpg 500 375 6 43 110 468 375 6 418 121 500 183 +4499 /data/VOCdevkit/VOC2007/JPEGImages/008970.jpg 500 334 15 252 81 371 242 19 65 77 190 204 +4500 /data/VOCdevkit/VOC2007/JPEGImages/008971.jpg 500 294 0 83 48 462 244 +4501 /data/VOCdevkit/VOC2007/JPEGImages/008973.jpg 500 333 9 271 43 444 279 +4502 /data/VOCdevkit/VOC2007/JPEGImages/008975.jpg 500 375 17 160 174 350 359 8 24 160 135 261 14 377 120 500 375 +4503 /data/VOCdevkit/VOC2007/JPEGImages/008976.jpg 500 375 7 258 118 341 250 +4504 /data/VOCdevkit/VOC2007/JPEGImages/008978.jpg 500 375 6 212 146 491 358 +4505 /data/VOCdevkit/VOC2007/JPEGImages/008979.jpg 500 384 13 36 41 443 351 14 40 31 239 322 +4506 /data/VOCdevkit/VOC2007/JPEGImages/008980.jpg 459 500 11 53 58 372 428 +4507 /data/VOCdevkit/VOC2007/JPEGImages/008982.jpg 500 375 19 256 72 426 234 4 429 185 488 336 +4508 /data/VOCdevkit/VOC2007/JPEGImages/008983.jpg 500 203 14 393 45 496 201 14 305 28 384 83 14 224 11 302 90 14 79 31 211 137 14 5 52 139 203 10 102 84 422 203 +4509 /data/VOCdevkit/VOC2007/JPEGImages/008985.jpg 375 500 2 3 9 314 496 +4510 /data/VOCdevkit/VOC2007/JPEGImages/008987.jpg 500 333 17 302 129 449 227 17 93 156 288 312 15 89 204 116 262 +4511 /data/VOCdevkit/VOC2007/JPEGImages/008988.jpg 500 375 18 2 95 375 329 +4512 /data/VOCdevkit/VOC2007/JPEGImages/008989.jpg 500 375 4 199 182 236 250 4 317 197 358 234 4 342 195 388 232 +4513 /data/VOCdevkit/VOC2007/JPEGImages/008995.jpg 156 500 1 31 381 121 439 +4514 /data/VOCdevkit/VOC2007/JPEGImages/008997.jpg 500 445 10 1 284 261 445 8 426 289 500 375 15 138 175 205 332 15 110 207 143 247 +4515 /data/VOCdevkit/VOC2007/JPEGImages/008999.jpg 500 375 3 53 78 86 170 3 160 65 191 171 3 222 125 238 162 3 248 43 284 175 3 415 82 444 167 +4516 /data/VOCdevkit/VOC2007/JPEGImages/009000.jpg 500 375 11 219 168 284 225 14 367 162 475 238 14 30 7 49 50 6 23 1 160 46 +4517 /data/VOCdevkit/VOC2007/JPEGImages/009002.jpg 500 269 18 35 29 445 206 +4518 /data/VOCdevkit/VOC2007/JPEGImages/009004.jpg 500 334 13 40 60 454 317 13 231 2 408 90 +4519 /data/VOCdevkit/VOC2007/JPEGImages/009005.jpg 500 375 14 86 72 173 249 14 242 63 381 353 14 182 58 270 239 14 168 56 214 223 14 323 15 397 202 14 122 8 160 104 1 91 160 167 291 1 238 201 375 375 1 196 153 267 287 +4520 /data/VOCdevkit/VOC2007/JPEGImages/009006.jpg 500 334 6 195 167 231 188 6 263 169 298 188 6 285 176 343 211 +4521 /data/VOCdevkit/VOC2007/JPEGImages/009007.jpg 500 403 13 17 1 461 403 +4522 /data/VOCdevkit/VOC2007/JPEGImages/009015.jpg 500 333 5 232 128 431 242 6 1 211 54 333 6 114 196 153 220 6 213 202 233 228 6 72 199 113 221 +4523 /data/VOCdevkit/VOC2007/JPEGImages/009016.jpg 375 500 4 184 3 334 452 +4524 /data/VOCdevkit/VOC2007/JPEGImages/009018.jpg 500 375 2 5 93 351 313 +4525 /data/VOCdevkit/VOC2007/JPEGImages/009019.jpg 500 333 11 40 133 450 244 +4526 /data/VOCdevkit/VOC2007/JPEGImages/009020.jpg 500 332 14 259 61 356 292 12 163 102 402 274 +4527 /data/VOCdevkit/VOC2007/JPEGImages/009022.jpg 500 375 11 138 143 263 370 14 293 2 500 374 +4528 /data/VOCdevkit/VOC2007/JPEGImages/009024.jpg 332 500 14 197 140 278 310 12 163 172 288 360 +4529 /data/VOCdevkit/VOC2007/JPEGImages/009027.jpg 500 375 4 181 76 238 183 +4530 /data/VOCdevkit/VOC2007/JPEGImages/009029.jpg 333 500 6 49 46 280 147 +4531 /data/VOCdevkit/VOC2007/JPEGImages/009032.jpg 500 375 15 309 209 341 257 19 27 69 207 262 19 205 75 350 256 +4532 /data/VOCdevkit/VOC2007/JPEGImages/009034.jpg 500 375 13 346 98 401 203 13 278 103 362 276 13 410 131 485 241 13 84 149 181 332 13 161 215 270 374 14 253 66 307 124 14 218 64 261 125 14 150 78 199 128 14 144 75 176 115 14 431 64 481 244 14 461 64 500 318 14 33 92 125 312 14 132 78 308 368 +4533 /data/VOCdevkit/VOC2007/JPEGImages/009035.jpg 333 500 7 1 1 333 482 +4534 /data/VOCdevkit/VOC2007/JPEGImages/009036.jpg 500 405 1 287 263 474 405 14 303 132 475 387 14 29 2 111 129 14 1 29 69 238 +4535 /data/VOCdevkit/VOC2007/JPEGImages/009037.jpg 500 375 5 325 166 500 257 +4536 /data/VOCdevkit/VOC2007/JPEGImages/009039.jpg 500 375 0 214 273 340 323 +4537 /data/VOCdevkit/VOC2007/JPEGImages/009042.jpg 500 334 11 116 92 406 194 +4538 /data/VOCdevkit/VOC2007/JPEGImages/009045.jpg 500 375 14 204 106 259 181 14 252 104 311 156 14 295 103 336 142 14 335 108 366 145 14 380 104 429 161 14 429 107 494 224 14 196 167 285 276 6 1 82 500 375 +4539 /data/VOCdevkit/VOC2007/JPEGImages/009048.jpg 375 500 7 119 308 234 404 8 180 90 313 214 +4540 /data/VOCdevkit/VOC2007/JPEGImages/009049.jpg 500 349 13 283 75 440 262 13 51 79 359 327 14 227 11 345 122 14 100 16 248 269 +4541 /data/VOCdevkit/VOC2007/JPEGImages/009051.jpg 500 375 19 1 178 28 222 17 54 198 312 307 8 281 255 406 368 8 94 260 215 375 +4542 /data/VOCdevkit/VOC2007/JPEGImages/009053.jpg 500 375 6 43 82 418 306 +4543 /data/VOCdevkit/VOC2007/JPEGImages/009058.jpg 500 375 6 1 1 484 287 +4544 /data/VOCdevkit/VOC2007/JPEGImages/009059.jpg 500 375 5 97 85 314 187 +4545 /data/VOCdevkit/VOC2007/JPEGImages/009060.jpg 500 333 6 51 67 500 333 6 2 105 125 224 +4546 /data/VOCdevkit/VOC2007/JPEGImages/009063.jpg 500 334 0 48 149 181 189 0 260 124 392 176 +4547 /data/VOCdevkit/VOC2007/JPEGImages/009064.jpg 500 375 6 30 71 450 343 6 454 107 500 205 6 1 41 155 202 14 174 62 222 108 14 228 68 268 110 14 28 36 105 183 14 348 59 422 165 14 425 83 452 165 14 448 87 472 172 +4548 /data/VOCdevkit/VOC2007/JPEGImages/009066.jpg 500 351 11 98 95 467 351 +4549 /data/VOCdevkit/VOC2007/JPEGImages/009068.jpg 500 375 8 131 217 293 337 8 5 232 77 299 14 284 160 437 335 14 1 205 283 344 15 320 181 369 240 +4550 /data/VOCdevkit/VOC2007/JPEGImages/009072.jpg 375 500 8 1 2 154 284 +4551 /data/VOCdevkit/VOC2007/JPEGImages/009073.jpg 500 375 5 127 136 232 263 5 15 140 125 204 6 89 202 150 276 6 1 202 97 337 14 378 63 500 375 14 353 200 394 323 14 298 174 358 322 14 238 206 264 278 14 213 195 241 279 14 272 192 304 269 +4552 /data/VOCdevkit/VOC2007/JPEGImages/009078.jpg 500 368 6 114 248 391 338 14 219 252 251 280 6 201 225 254 247 15 456 245 483 279 +4553 /data/VOCdevkit/VOC2007/JPEGImages/009079.jpg 500 375 14 7 36 422 372 14 3 175 224 375 14 454 208 500 356 +4554 /data/VOCdevkit/VOC2007/JPEGImages/009080.jpg 500 375 2 79 78 174 188 +4555 /data/VOCdevkit/VOC2007/JPEGImages/009085.jpg 500 333 0 13 125 486 238 0 421 292 493 325 0 107 301 161 325 +4556 /data/VOCdevkit/VOC2007/JPEGImages/009086.jpg 500 281 18 31 34 500 281 +4557 /data/VOCdevkit/VOC2007/JPEGImages/009087.jpg 500 375 15 16 172 93 226 15 25 229 89 279 15 5 274 106 374 14 221 117 336 375 14 220 123 269 199 14 119 141 232 375 7 256 199 344 351 +4558 /data/VOCdevkit/VOC2007/JPEGImages/009089.jpg 375 500 14 1 80 342 500 +4559 /data/VOCdevkit/VOC2007/JPEGImages/009091.jpg 500 375 14 213 108 394 375 14 266 22 427 375 14 153 22 277 375 14 1 13 59 375 14 19 1 89 230 14 96 1 176 196 14 238 1 301 124 +4560 /data/VOCdevkit/VOC2007/JPEGImages/009094.jpg 500 375 19 235 81 394 227 +4561 /data/VOCdevkit/VOC2007/JPEGImages/009098.jpg 418 500 7 1 284 197 500 7 6 3 418 500 +4562 /data/VOCdevkit/VOC2007/JPEGImages/009099.jpg 500 375 2 146 128 286 334 +4563 /data/VOCdevkit/VOC2007/JPEGImages/009100.jpg 500 363 4 253 192 399 306 +4564 /data/VOCdevkit/VOC2007/JPEGImages/009105.jpg 500 375 5 34 40 500 315 +4565 /data/VOCdevkit/VOC2007/JPEGImages/009106.jpg 500 375 6 1 105 356 340 +4566 /data/VOCdevkit/VOC2007/JPEGImages/009108.jpg 500 376 4 265 1 417 352 4 119 1 264 342 +4567 /data/VOCdevkit/VOC2007/JPEGImages/009112.jpg 375 500 11 35 57 361 298 +4568 /data/VOCdevkit/VOC2007/JPEGImages/009113.jpg 500 375 9 87 111 336 343 9 192 92 214 112 9 169 108 214 125 +4569 /data/VOCdevkit/VOC2007/JPEGImages/009114.jpg 320 212 12 66 26 242 191 14 131 11 174 110 +4570 /data/VOCdevkit/VOC2007/JPEGImages/009116.jpg 500 375 6 9 172 456 355 +4571 /data/VOCdevkit/VOC2007/JPEGImages/009117.jpg 500 375 11 188 27 500 373 +4572 /data/VOCdevkit/VOC2007/JPEGImages/009121.jpg 500 333 6 160 134 304 231 6 1 110 100 208 6 46 96 141 172 6 29 56 110 108 6 391 57 473 124 6 162 19 233 69 6 420 99 500 178 6 427 148 500 248 +4573 /data/VOCdevkit/VOC2007/JPEGImages/009123.jpg 500 375 10 23 172 352 375 8 270 236 443 375 8 408 215 490 373 15 216 96 299 192 14 304 104 493 307 14 326 102 426 241 14 266 100 333 177 14 125 100 203 197 14 54 73 110 198 14 1 89 92 301 +4574 /data/VOCdevkit/VOC2007/JPEGImages/009126.jpg 500 375 5 19 40 490 268 +4575 /data/VOCdevkit/VOC2007/JPEGImages/009128.jpg 304 420 14 3 12 304 420 +4576 /data/VOCdevkit/VOC2007/JPEGImages/009129.jpg 500 333 17 80 67 480 326 +4577 /data/VOCdevkit/VOC2007/JPEGImages/009131.jpg 500 375 3 316 75 366 219 +4578 /data/VOCdevkit/VOC2007/JPEGImages/009133.jpg 500 333 9 1 22 358 333 +4579 /data/VOCdevkit/VOC2007/JPEGImages/009136.jpg 500 375 14 114 69 358 375 +4580 /data/VOCdevkit/VOC2007/JPEGImages/009138.jpg 500 375 12 63 2 500 375 +4581 /data/VOCdevkit/VOC2007/JPEGImages/009141.jpg 500 375 14 196 147 277 279 14 250 83 333 230 14 259 160 338 316 14 291 167 404 333 14 111 122 160 266 14 57 139 171 284 +4582 /data/VOCdevkit/VOC2007/JPEGImages/009144.jpg 500 357 2 49 47 474 345 +4583 /data/VOCdevkit/VOC2007/JPEGImages/009147.jpg 500 352 7 44 90 455 310 +4584 /data/VOCdevkit/VOC2007/JPEGImages/009148.jpg 369 276 12 90 54 206 256 12 145 13 175 43 +4585 /data/VOCdevkit/VOC2007/JPEGImages/009150.jpg 375 500 2 78 365 140 433 +4586 /data/VOCdevkit/VOC2007/JPEGImages/009151.jpg 500 375 8 20 182 110 301 +4587 /data/VOCdevkit/VOC2007/JPEGImages/009153.jpg 375 500 14 3 107 375 500 +4588 /data/VOCdevkit/VOC2007/JPEGImages/009155.jpg 500 374 19 143 37 337 185 +4589 /data/VOCdevkit/VOC2007/JPEGImages/009157.jpg 500 375 10 5 169 500 375 +4590 /data/VOCdevkit/VOC2007/JPEGImages/009159.jpg 500 375 8 101 264 237 375 +4591 /data/VOCdevkit/VOC2007/JPEGImages/009160.jpg 500 333 13 177 142 393 317 14 290 47 373 156 +4592 /data/VOCdevkit/VOC2007/JPEGImages/009161.jpg 500 379 5 19 179 423 317 14 212 247 262 364 14 280 241 323 364 14 372 241 405 326 +4593 /data/VOCdevkit/VOC2007/JPEGImages/009162.jpg 500 386 8 220 64 461 331 +4594 /data/VOCdevkit/VOC2007/JPEGImages/009163.jpg 500 320 5 177 66 419 166 6 22 110 176 194 6 2 112 29 169 +4595 /data/VOCdevkit/VOC2007/JPEGImages/009166.jpg 500 286 2 196 18 294 280 +4596 /data/VOCdevkit/VOC2007/JPEGImages/009168.jpg 500 333 11 151 64 387 333 +4597 /data/VOCdevkit/VOC2007/JPEGImages/009173.jpg 375 500 19 167 1 375 128 +4598 /data/VOCdevkit/VOC2007/JPEGImages/009174.jpg 500 375 5 6 54 500 321 6 266 252 490 375 6 40 252 206 328 +4599 /data/VOCdevkit/VOC2007/JPEGImages/009175.jpg 500 375 7 132 57 331 159 15 248 177 435 340 +4600 /data/VOCdevkit/VOC2007/JPEGImages/009177.jpg 500 375 3 240 122 358 301 +4601 /data/VOCdevkit/VOC2007/JPEGImages/009178.jpg 500 333 6 2 83 500 324 +4602 /data/VOCdevkit/VOC2007/JPEGImages/009179.jpg 500 375 6 243 307 328 356 +4603 /data/VOCdevkit/VOC2007/JPEGImages/009180.jpg 500 333 13 343 102 445 260 13 3 90 213 331 14 354 81 440 244 14 229 21 343 291 14 24 18 219 296 +4604 /data/VOCdevkit/VOC2007/JPEGImages/009181.jpg 333 500 15 38 32 306 450 +4605 /data/VOCdevkit/VOC2007/JPEGImages/009184.jpg 500 334 14 336 1 498 180 14 1 3 446 334 +4606 /data/VOCdevkit/VOC2007/JPEGImages/009185.jpg 500 411 11 140 64 433 322 +4607 /data/VOCdevkit/VOC2007/JPEGImages/009186.jpg 500 375 6 62 213 156 248 6 1 216 62 246 +4608 /data/VOCdevkit/VOC2007/JPEGImages/009187.jpg 500 335 18 49 30 500 309 +4609 /data/VOCdevkit/VOC2007/JPEGImages/009189.jpg 500 378 9 405 226 449 281 9 304 224 366 261 9 231 212 287 245 9 123 186 227 250 9 70 178 120 237 +4610 /data/VOCdevkit/VOC2007/JPEGImages/009191.jpg 500 348 13 29 23 487 325 +4611 /data/VOCdevkit/VOC2007/JPEGImages/009192.jpg 500 375 19 76 29 415 336 +4612 /data/VOCdevkit/VOC2007/JPEGImages/009193.jpg 500 375 17 8 221 494 375 14 24 167 242 344 14 82 248 272 374 14 298 51 500 358 +4613 /data/VOCdevkit/VOC2007/JPEGImages/009194.jpg 500 375 15 10 2 500 330 +4614 /data/VOCdevkit/VOC2007/JPEGImages/009195.jpg 377 500 11 101 51 257 419 +4615 /data/VOCdevkit/VOC2007/JPEGImages/009196.jpg 500 375 19 1 2 500 287 +4616 /data/VOCdevkit/VOC2007/JPEGImages/009197.jpg 500 376 11 104 93 467 357 14 47 1 186 348 14 199 1 362 353 +4617 /data/VOCdevkit/VOC2007/JPEGImages/009200.jpg 500 375 19 311 167 361 221 19 113 136 219 226 8 240 239 335 374 +4618 /data/VOCdevkit/VOC2007/JPEGImages/009202.jpg 460 480 12 143 114 372 447 14 175 25 321 293 +4619 /data/VOCdevkit/VOC2007/JPEGImages/009205.jpg 500 334 6 1 47 491 251 6 1 128 311 329 +4620 /data/VOCdevkit/VOC2007/JPEGImages/009208.jpg 500 333 14 234 40 383 333 12 1 43 249 305 +4621 /data/VOCdevkit/VOC2007/JPEGImages/009209.jpg 500 375 13 139 105 274 213 14 146 86 225 202 +4622 /data/VOCdevkit/VOC2007/JPEGImages/009212.jpg 333 500 11 1 198 323 500 +4623 /data/VOCdevkit/VOC2007/JPEGImages/009213.jpg 500 375 6 308 204 426 287 +4624 /data/VOCdevkit/VOC2007/JPEGImages/009214.jpg 500 375 1 180 114 314 226 6 146 223 468 375 14 107 198 142 309 14 72 206 103 308 14 38 210 72 312 14 466 188 500 286 14 1 212 20 313 14 140 218 159 255 14 226 82 311 194 +4625 /data/VOCdevkit/VOC2007/JPEGImages/009215.jpg 500 375 15 78 150 402 373 15 304 90 500 340 +4626 /data/VOCdevkit/VOC2007/JPEGImages/009218.jpg 375 500 18 3 60 374 500 +4627 /data/VOCdevkit/VOC2007/JPEGImages/009221.jpg 500 333 7 57 65 421 277 +4628 /data/VOCdevkit/VOC2007/JPEGImages/009224.jpg 375 500 14 110 188 375 380 14 206 82 295 378 14 185 60 245 335 14 32 120 94 291 14 1 109 31 259 +4629 /data/VOCdevkit/VOC2007/JPEGImages/009227.jpg 500 333 11 430 133 497 187 16 1 83 72 216 16 72 83 163 224 16 129 78 189 202 +4630 /data/VOCdevkit/VOC2007/JPEGImages/009230.jpg 500 375 14 126 46 326 250 13 1 100 361 375 +4631 /data/VOCdevkit/VOC2007/JPEGImages/009236.jpg 480 318 12 131 96 346 290 14 195 57 258 212 +4632 /data/VOCdevkit/VOC2007/JPEGImages/009238.jpg 500 333 14 19 57 243 333 14 62 7 500 333 +4633 /data/VOCdevkit/VOC2007/JPEGImages/009239.jpg 500 333 14 352 73 500 333 14 128 109 213 231 14 1 18 120 332 +4634 /data/VOCdevkit/VOC2007/JPEGImages/009242.jpg 500 375 17 76 97 485 261 14 266 82 424 214 14 109 93 240 228 4 171 173 192 232 4 51 161 89 245 +4635 /data/VOCdevkit/VOC2007/JPEGImages/009244.jpg 500 375 7 2 2 500 375 +4636 /data/VOCdevkit/VOC2007/JPEGImages/009245.jpg 500 375 9 17 96 288 330 9 265 150 467 248 +4637 /data/VOCdevkit/VOC2007/JPEGImages/009246.jpg 461 500 2 97 36 354 206 +4638 /data/VOCdevkit/VOC2007/JPEGImages/009247.jpg 500 333 10 2 58 499 333 +4639 /data/VOCdevkit/VOC2007/JPEGImages/009249.jpg 500 375 19 219 153 290 217 8 213 287 403 375 8 9 284 214 374 +4640 /data/VOCdevkit/VOC2007/JPEGImages/009250.jpg 375 500 1 3 1 351 499 +4641 /data/VOCdevkit/VOC2007/JPEGImages/009251.jpg 500 333 12 180 23 309 306 14 145 74 210 192 +4642 /data/VOCdevkit/VOC2007/JPEGImages/009252.jpg 500 369 17 40 200 500 369 15 325 29 423 155 +4643 /data/VOCdevkit/VOC2007/JPEGImages/009254.jpg 500 333 18 1 79 344 259 6 382 212 423 243 6 331 212 401 243 +4644 /data/VOCdevkit/VOC2007/JPEGImages/009255.jpg 257 200 12 12 5 248 197 +4645 /data/VOCdevkit/VOC2007/JPEGImages/009259.jpg 500 333 14 211 98 295 192 13 167 121 339 232 +4646 /data/VOCdevkit/VOC2007/JPEGImages/009268.jpg 375 500 11 127 123 369 377 +4647 /data/VOCdevkit/VOC2007/JPEGImages/009269.jpg 500 496 6 100 167 404 327 +4648 /data/VOCdevkit/VOC2007/JPEGImages/009270.jpg 500 335 2 5 3 404 333 +4649 /data/VOCdevkit/VOC2007/JPEGImages/009271.jpg 500 375 16 201 104 387 287 16 415 124 475 181 +4650 /data/VOCdevkit/VOC2007/JPEGImages/009272.jpg 500 333 0 14 69 487 219 +4651 /data/VOCdevkit/VOC2007/JPEGImages/009273.jpg 500 375 14 32 50 252 375 14 75 108 479 375 14 28 244 84 336 10 387 273 500 362 +4652 /data/VOCdevkit/VOC2007/JPEGImages/009278.jpg 500 375 1 81 280 121 326 +4653 /data/VOCdevkit/VOC2007/JPEGImages/009279.jpg 500 426 8 342 168 500 426 15 159 79 208 181 19 187 82 277 190 19 286 77 383 185 +4654 /data/VOCdevkit/VOC2007/JPEGImages/009281.jpg 500 375 1 29 3 425 375 +4655 /data/VOCdevkit/VOC2007/JPEGImages/009282.jpg 456 342 6 14 74 431 288 +4656 /data/VOCdevkit/VOC2007/JPEGImages/009283.jpg 500 375 5 255 220 354 317 6 203 248 253 298 6 1 245 107 370 14 463 269 493 365 14 344 261 363 319 +4657 /data/VOCdevkit/VOC2007/JPEGImages/009285.jpg 500 375 7 3 61 433 344 +4658 /data/VOCdevkit/VOC2007/JPEGImages/009286.jpg 500 332 6 1 96 500 328 14 110 3 360 167 14 121 2 206 135 14 437 2 498 90 14 397 2 431 86 +4659 /data/VOCdevkit/VOC2007/JPEGImages/009287.jpg 500 333 13 255 65 500 270 14 248 43 371 251 14 284 19 419 241 13 18 245 51 288 14 12 230 51 288 +4660 /data/VOCdevkit/VOC2007/JPEGImages/009288.jpg 213 319 14 59 73 131 195 14 72 64 127 251 +4661 /data/VOCdevkit/VOC2007/JPEGImages/009289.jpg 500 333 18 82 15 427 333 +4662 /data/VOCdevkit/VOC2007/JPEGImages/009290.jpg 500 333 14 51 57 291 266 4 345 125 372 202 17 126 61 453 208 8 2 144 58 294 +4663 /data/VOCdevkit/VOC2007/JPEGImages/009291.jpg 375 500 13 61 245 374 500 14 51 150 346 475 14 88 93 193 429 14 182 128 219 192 14 201 164 239 203 +4664 /data/VOCdevkit/VOC2007/JPEGImages/009295.jpg 500 375 14 296 39 440 337 1 43 104 307 375 19 263 1 500 206 +4665 /data/VOCdevkit/VOC2007/JPEGImages/009296.jpg 500 375 14 125 155 206 375 +4666 /data/VOCdevkit/VOC2007/JPEGImages/009299.jpg 500 333 10 88 224 500 333 14 401 62 500 313 14 266 65 403 280 14 1 47 115 308 4 194 1 225 55 4 279 1 301 56 4 14 15 28 54 +4667 /data/VOCdevkit/VOC2007/JPEGImages/009303.jpg 500 99 14 416 9 471 69 14 193 6 266 85 14 9 5 135 99 14 159 18 197 60 14 256 17 310 83 +4668 /data/VOCdevkit/VOC2007/JPEGImages/009306.jpg 375 500 7 67 338 266 451 14 49 74 372 444 +4669 /data/VOCdevkit/VOC2007/JPEGImages/009307.jpg 400 400 0 7 13 400 367 +4670 /data/VOCdevkit/VOC2007/JPEGImages/009308.jpg 500 331 9 1 1 500 286 +4671 /data/VOCdevkit/VOC2007/JPEGImages/009309.jpg 500 375 2 21 74 500 375 +4672 /data/VOCdevkit/VOC2007/JPEGImages/009312.jpg 500 375 13 137 148 401 375 14 90 78 197 324 +4673 /data/VOCdevkit/VOC2007/JPEGImages/009315.jpg 500 375 5 251 117 376 218 5 109 138 255 195 +4674 /data/VOCdevkit/VOC2007/JPEGImages/009316.jpg 500 375 14 288 87 500 375 14 213 139 353 372 14 160 117 252 370 14 4 60 167 374 +4675 /data/VOCdevkit/VOC2007/JPEGImages/009318.jpg 500 334 14 238 8 330 242 12 32 58 438 334 6 372 102 400 123 6 351 101 376 124 +4676 /data/VOCdevkit/VOC2007/JPEGImages/009323.jpg 500 375 2 378 239 483 345 2 221 79 328 145 2 2 168 82 262 +4677 /data/VOCdevkit/VOC2007/JPEGImages/009324.jpg 500 331 2 233 18 447 330 2 1 50 302 331 +4678 /data/VOCdevkit/VOC2007/JPEGImages/009325.jpg 500 375 19 118 1 262 149 +4679 /data/VOCdevkit/VOC2007/JPEGImages/009326.jpg 500 333 6 101 109 314 211 +4680 /data/VOCdevkit/VOC2007/JPEGImages/009327.jpg 334 500 14 117 79 258 403 11 67 273 113 334 +4681 /data/VOCdevkit/VOC2007/JPEGImages/009330.jpg 500 375 14 94 147 291 375 14 181 22 500 375 +4682 /data/VOCdevkit/VOC2007/JPEGImages/009331.jpg 500 375 12 1 1 58 193 14 57 22 125 256 11 100 168 217 293 11 260 195 360 266 11 331 196 412 281 +4683 /data/VOCdevkit/VOC2007/JPEGImages/009333.jpg 500 375 19 100 86 312 238 11 207 202 352 268 +4684 /data/VOCdevkit/VOC2007/JPEGImages/009334.jpg 500 375 1 93 115 435 289 +4685 /data/VOCdevkit/VOC2007/JPEGImages/009336.jpg 500 375 6 61 78 396 328 14 72 142 116 197 +4686 /data/VOCdevkit/VOC2007/JPEGImages/009337.jpg 500 349 12 231 148 495 326 +4687 /data/VOCdevkit/VOC2007/JPEGImages/009339.jpg 500 375 8 383 2 500 276 1 106 22 460 319 +4688 /data/VOCdevkit/VOC2007/JPEGImages/009342.jpg 500 375 14 75 4 171 287 7 237 139 377 278 7 219 121 274 248 15 1 214 121 375 +4689 /data/VOCdevkit/VOC2007/JPEGImages/009343.jpg 500 334 14 167 9 419 327 8 18 157 242 301 +4690 /data/VOCdevkit/VOC2007/JPEGImages/009347.jpg 500 334 3 249 14 436 292 3 93 134 198 290 +4691 /data/VOCdevkit/VOC2007/JPEGImages/009348.jpg 500 375 0 145 90 363 209 +4692 /data/VOCdevkit/VOC2007/JPEGImages/009349.jpg 375 500 16 2 304 149 500 14 136 74 312 461 14 280 94 375 500 14 85 118 119 274 14 14 115 54 217 14 40 129 92 299 +4693 /data/VOCdevkit/VOC2007/JPEGImages/009350.jpg 345 500 6 8 289 336 475 +4694 /data/VOCdevkit/VOC2007/JPEGImages/009351.jpg 500 375 0 123 2 500 375 +4695 /data/VOCdevkit/VOC2007/JPEGImages/009354.jpg 335 500 18 129 218 238 334 +4696 /data/VOCdevkit/VOC2007/JPEGImages/009358.jpg 500 375 5 282 236 362 297 6 427 309 500 353 6 330 297 401 338 +4697 /data/VOCdevkit/VOC2007/JPEGImages/009359.jpg 500 281 8 184 133 268 202 17 46 170 283 281 +4698 /data/VOCdevkit/VOC2007/JPEGImages/009362.jpg 500 333 14 278 48 400 333 14 136 76 258 311 14 32 33 178 332 14 373 238 476 333 +4699 /data/VOCdevkit/VOC2007/JPEGImages/009365.jpg 500 332 0 231 142 298 201 +4700 /data/VOCdevkit/VOC2007/JPEGImages/009368.jpg 500 375 6 166 222 429 319 6 97 188 321 259 6 309 165 442 223 6 206 144 298 183 6 142 143 227 185 6 79 146 168 185 6 10 150 77 179 6 408 133 493 184 14 122 127 139 147 14 377 131 396 172 14 410 131 434 181 14 434 127 456 191 14 460 138 489 188 +4701 /data/VOCdevkit/VOC2007/JPEGImages/009371.jpg 500 333 0 2 1 497 186 +4702 /data/VOCdevkit/VOC2007/JPEGImages/009373.jpg 500 375 19 221 27 500 314 19 1 46 223 270 +4703 /data/VOCdevkit/VOC2007/JPEGImages/009374.jpg 500 334 8 71 94 461 334 14 58 64 334 334 +4704 /data/VOCdevkit/VOC2007/JPEGImages/009375.jpg 375 500 4 128 146 145 188 14 128 92 247 380 +4705 /data/VOCdevkit/VOC2007/JPEGImages/009377.jpg 500 338 14 19 97 62 200 18 57 19 417 336 +4706 /data/VOCdevkit/VOC2007/JPEGImages/009378.jpg 332 500 7 8 19 313 394 +4707 /data/VOCdevkit/VOC2007/JPEGImages/009382.jpg 333 500 13 1 236 333 500 14 34 75 305 485 14 11 1 149 370 +4708 /data/VOCdevkit/VOC2007/JPEGImages/009386.jpg 500 375 5 3 2 409 374 +4709 /data/VOCdevkit/VOC2007/JPEGImages/009388.jpg 500 375 19 314 173 386 233 19 259 153 320 219 8 234 265 417 375 19 100 177 163 252 4 54 228 73 279 +4710 /data/VOCdevkit/VOC2007/JPEGImages/009389.jpg 500 375 18 119 117 500 364 +4711 /data/VOCdevkit/VOC2007/JPEGImages/009392.jpg 500 331 5 410 194 500 331 6 249 230 294 247 6 215 223 249 237 6 173 223 206 237 6 290 223 314 233 6 19 224 51 238 6 1 283 74 331 +4712 /data/VOCdevkit/VOC2007/JPEGImages/009393.jpg 500 372 13 145 140 321 342 1 287 160 479 372 14 295 2 457 372 14 38 162 102 296 +4713 /data/VOCdevkit/VOC2007/JPEGImages/009394.jpg 500 333 0 3 2 500 254 14 133 160 159 261 +4714 /data/VOCdevkit/VOC2007/JPEGImages/009398.jpg 500 333 7 1 4 422 333 +4715 /data/VOCdevkit/VOC2007/JPEGImages/009401.jpg 500 375 18 1 25 425 330 +4716 /data/VOCdevkit/VOC2007/JPEGImages/009405.jpg 500 375 11 139 1 500 367 +4717 /data/VOCdevkit/VOC2007/JPEGImages/009406.jpg 500 283 6 19 20 489 266 +4718 /data/VOCdevkit/VOC2007/JPEGImages/009407.jpg 432 480 14 146 97 253 304 12 25 123 322 480 +4719 /data/VOCdevkit/VOC2007/JPEGImages/009408.jpg 500 357 0 58 92 227 284 +4720 /data/VOCdevkit/VOC2007/JPEGImages/009409.jpg 500 375 5 385 172 500 226 5 168 166 353 223 5 1 132 91 263 6 89 201 201 245 +4721 /data/VOCdevkit/VOC2007/JPEGImages/009410.jpg 500 375 14 10 3 457 375 14 40 125 351 375 +4722 /data/VOCdevkit/VOC2007/JPEGImages/009411.jpg 500 375 6 62 112 463 335 14 424 150 456 191 +4723 /data/VOCdevkit/VOC2007/JPEGImages/009412.jpg 500 375 5 31 62 101 116 14 75 85 255 375 14 317 40 500 375 +4724 /data/VOCdevkit/VOC2007/JPEGImages/009413.jpg 500 500 8 24 70 149 264 14 26 231 181 500 14 252 9 500 361 10 48 333 500 500 +4725 /data/VOCdevkit/VOC2007/JPEGImages/009414.jpg 500 376 17 61 60 471 350 14 298 201 412 328 14 107 97 323 350 14 136 17 236 140 +4726 /data/VOCdevkit/VOC2007/JPEGImages/009417.jpg 500 375 16 62 29 144 93 16 216 183 299 266 16 238 94 330 220 16 136 54 164 94 16 368 15 401 36 +4727 /data/VOCdevkit/VOC2007/JPEGImages/009418.jpg 500 333 11 149 237 264 333 11 181 102 251 227 14 142 3 353 262 14 207 62 500 333 +4728 /data/VOCdevkit/VOC2007/JPEGImages/009419.jpg 500 333 15 52 68 134 195 15 145 207 181 277 +4729 /data/VOCdevkit/VOC2007/JPEGImages/009420.jpg 500 375 10 1 234 404 375 14 152 149 216 257 +4730 /data/VOCdevkit/VOC2007/JPEGImages/009421.jpg 500 375 14 135 71 234 291 14 229 64 327 184 14 117 139 253 359 14 281 123 402 333 14 200 132 295 310 17 384 109 500 212 +4731 /data/VOCdevkit/VOC2007/JPEGImages/009422.jpg 500 334 2 2 2 481 325 +4732 /data/VOCdevkit/VOC2007/JPEGImages/009424.jpg 500 375 6 50 103 422 329 14 275 95 368 335 +4733 /data/VOCdevkit/VOC2007/JPEGImages/009429.jpg 500 346 9 205 197 316 240 +4734 /data/VOCdevkit/VOC2007/JPEGImages/009432.jpg 500 332 0 5 90 497 260 +4735 /data/VOCdevkit/VOC2007/JPEGImages/009433.jpg 500 354 18 79 147 387 286 14 475 189 495 245 14 446 173 467 228 14 386 192 402 236 14 363 192 381 243 14 195 178 210 221 +4736 /data/VOCdevkit/VOC2007/JPEGImages/009434.jpg 500 333 6 16 82 482 301 14 354 15 433 105 14 209 7 284 82 14 160 1 208 45 14 395 1 472 61 +4737 /data/VOCdevkit/VOC2007/JPEGImages/009437.jpg 500 375 10 77 177 499 375 14 359 55 487 199 14 60 148 160 340 8 2 142 218 374 +4738 /data/VOCdevkit/VOC2007/JPEGImages/009438.jpg 375 500 12 103 64 343 500 +4739 /data/VOCdevkit/VOC2007/JPEGImages/009439.jpg 500 375 2 151 180 208 262 +4740 /data/VOCdevkit/VOC2007/JPEGImages/009440.jpg 500 375 14 259 82 500 375 14 1 27 204 375 +4741 /data/VOCdevkit/VOC2007/JPEGImages/009443.jpg 367 500 15 318 204 361 279 15 18 188 61 284 +4742 /data/VOCdevkit/VOC2007/JPEGImages/009445.jpg 500 375 19 89 57 203 143 +4743 /data/VOCdevkit/VOC2007/JPEGImages/009446.jpg 500 375 19 15 47 252 298 +4744 /data/VOCdevkit/VOC2007/JPEGImages/009448.jpg 500 375 14 136 168 180 271 6 284 164 322 186 6 87 158 151 222 6 2 163 89 256 6 454 162 500 242 14 39 174 73 277 14 1 162 29 303 +4745 /data/VOCdevkit/VOC2007/JPEGImages/009454.jpg 500 375 8 181 234 344 375 19 301 151 376 232 +4746 /data/VOCdevkit/VOC2007/JPEGImages/009455.jpg 500 334 7 125 2 500 334 +4747 /data/VOCdevkit/VOC2007/JPEGImages/009456.jpg 500 375 1 227 207 458 375 1 2 142 111 275 14 26 78 104 290 +4748 /data/VOCdevkit/VOC2007/JPEGImages/009457.jpg 500 375 13 60 46 411 362 +4749 /data/VOCdevkit/VOC2007/JPEGImages/009458.jpg 473 500 4 2 20 111 98 4 113 13 202 110 4 202 24 290 113 4 288 40 364 107 4 338 14 402 66 4 380 52 465 103 4 397 5 473 65 +4750 /data/VOCdevkit/VOC2007/JPEGImages/009459.jpg 500 353 2 153 87 358 297 +4751 /data/VOCdevkit/VOC2007/JPEGImages/009460.jpg 500 375 14 3 49 377 373 14 352 273 500 375 +4752 /data/VOCdevkit/VOC2007/JPEGImages/009461.jpg 500 375 0 216 164 264 201 0 229 196 278 231 +4753 /data/VOCdevkit/VOC2007/JPEGImages/009463.jpg 500 333 9 1 174 139 330 +4754 /data/VOCdevkit/VOC2007/JPEGImages/009464.jpg 500 375 7 1 91 447 358 +4755 /data/VOCdevkit/VOC2007/JPEGImages/009465.jpg 393 346 12 15 37 390 335 +4756 /data/VOCdevkit/VOC2007/JPEGImages/009466.jpg 500 450 8 157 220 398 436 +4757 /data/VOCdevkit/VOC2007/JPEGImages/009468.jpg 320 229 12 87 40 247 216 14 112 32 199 135 +4758 /data/VOCdevkit/VOC2007/JPEGImages/009469.jpg 500 375 6 36 112 482 322 6 1 111 130 188 14 414 71 463 156 14 205 80 236 117 +4759 /data/VOCdevkit/VOC2007/JPEGImages/009470.jpg 500 262 17 2 11 500 262 7 19 112 227 156 7 229 123 468 211 +4760 /data/VOCdevkit/VOC2007/JPEGImages/009472.jpg 500 333 0 160 78 496 220 +4761 /data/VOCdevkit/VOC2007/JPEGImages/009476.jpg 500 400 0 47 114 479 278 +4762 /data/VOCdevkit/VOC2007/JPEGImages/009477.jpg 332 500 14 109 63 228 224 6 199 5 332 75 6 107 33 210 88 6 31 39 179 100 +4763 /data/VOCdevkit/VOC2007/JPEGImages/009479.jpg 375 500 17 2 278 357 500 7 145 261 293 327 14 3 291 104 500 +4764 /data/VOCdevkit/VOC2007/JPEGImages/009480.jpg 375 500 0 13 111 273 281 +4765 /data/VOCdevkit/VOC2007/JPEGImages/009481.jpg 500 375 8 210 307 361 375 8 397 241 500 375 8 8 238 134 375 8 317 209 388 333 4 235 197 249 240 14 33 160 190 374 14 307 146 494 356 14 284 134 383 354 14 218 143 298 322 14 116 124 203 341 +4766 /data/VOCdevkit/VOC2007/JPEGImages/009484.jpg 500 375 19 163 223 265 321 +4767 /data/VOCdevkit/VOC2007/JPEGImages/009488.jpg 447 500 2 124 89 334 404 +4768 /data/VOCdevkit/VOC2007/JPEGImages/009490.jpg 375 500 14 1 87 210 483 +4769 /data/VOCdevkit/VOC2007/JPEGImages/009491.jpg 500 375 17 101 138 348 279 15 173 1 266 142 15 3 2 64 230 17 361 177 500 286 +4770 /data/VOCdevkit/VOC2007/JPEGImages/009494.jpg 500 333 13 185 184 254 311 14 185 154 258 285 +4771 /data/VOCdevkit/VOC2007/JPEGImages/009496.jpg 500 333 14 12 65 479 319 +4772 /data/VOCdevkit/VOC2007/JPEGImages/009497.jpg 500 375 14 97 106 299 374 14 178 80 319 255 4 403 316 417 361 4 360 312 377 354 +4773 /data/VOCdevkit/VOC2007/JPEGImages/009499.jpg 339 500 14 3 1 306 500 +4774 /data/VOCdevkit/VOC2007/JPEGImages/009500.jpg 500 374 14 375 253 475 363 14 62 236 172 374 14 228 215 385 374 +4775 /data/VOCdevkit/VOC2007/JPEGImages/009502.jpg 500 500 11 200 89 331 227 +4776 /data/VOCdevkit/VOC2007/JPEGImages/009504.jpg 480 500 13 105 106 324 482 14 137 51 395 442 +4777 /data/VOCdevkit/VOC2007/JPEGImages/009507.jpg 500 333 6 189 145 245 178 6 323 149 355 173 +4778 /data/VOCdevkit/VOC2007/JPEGImages/009508.jpg 374 500 18 175 318 228 385 +4779 /data/VOCdevkit/VOC2007/JPEGImages/009512.jpg 375 500 12 236 275 374 500 14 2 143 191 500 14 23 127 51 221 +4780 /data/VOCdevkit/VOC2007/JPEGImages/009515.jpg 360 270 6 2 216 62 250 6 66 195 135 231 6 118 172 167 198 6 115 176 144 198 +4781 /data/VOCdevkit/VOC2007/JPEGImages/009516.jpg 375 500 7 17 62 375 500 +4782 /data/VOCdevkit/VOC2007/JPEGImages/009517.jpg 333 500 14 169 80 312 500 14 57 128 142 399 6 135 111 177 132 +4783 /data/VOCdevkit/VOC2007/JPEGImages/009518.jpg 500 369 11 125 43 412 356 14 222 1 330 268 +4784 /data/VOCdevkit/VOC2007/JPEGImages/009519.jpg 375 500 15 8 127 205 419 15 256 1 375 189 15 107 1 259 81 15 180 142 230 296 +4785 /data/VOCdevkit/VOC2007/JPEGImages/009520.jpg 500 359 8 458 155 500 308 14 270 75 496 359 14 128 72 312 359 14 2 77 150 307 +4786 /data/VOCdevkit/VOC2007/JPEGImages/009523.jpg 500 375 0 125 150 231 252 +4787 /data/VOCdevkit/VOC2007/JPEGImages/009524.jpg 500 348 14 316 84 376 193 +4788 /data/VOCdevkit/VOC2007/JPEGImages/009526.jpg 375 500 10 175 314 375 500 8 215 430 323 500 14 273 206 295 263 +4789 /data/VOCdevkit/VOC2007/JPEGImages/009527.jpg 500 375 3 74 13 286 255 3 249 149 321 212 3 88 201 500 375 +4790 /data/VOCdevkit/VOC2007/JPEGImages/009528.jpg 500 375 7 86 67 489 322 +4791 /data/VOCdevkit/VOC2007/JPEGImages/009531.jpg 500 375 14 221 219 245 252 +4792 /data/VOCdevkit/VOC2007/JPEGImages/009532.jpg 500 333 6 328 211 422 288 14 427 198 454 274 14 455 188 483 275 14 486 191 500 274 14 118 183 152 270 14 179 117 208 154 +4793 /data/VOCdevkit/VOC2007/JPEGImages/009533.jpg 500 375 3 155 123 318 196 +4794 /data/VOCdevkit/VOC2007/JPEGImages/009537.jpg 500 281 14 129 161 150 201 18 8 10 500 221 +4795 /data/VOCdevkit/VOC2007/JPEGImages/009540.jpg 500 333 13 32 107 241 306 13 238 134 365 295 +4796 /data/VOCdevkit/VOC2007/JPEGImages/009541.jpg 375 500 14 101 269 241 423 14 256 256 330 391 8 87 298 208 429 8 250 293 344 409 +4797 /data/VOCdevkit/VOC2007/JPEGImages/009542.jpg 500 332 14 8 17 251 332 14 137 116 486 331 +4798 /data/VOCdevkit/VOC2007/JPEGImages/009543.jpg 500 375 8 395 88 500 318 8 277 109 367 253 11 181 125 266 229 11 230 233 344 375 +4799 /data/VOCdevkit/VOC2007/JPEGImages/009545.jpg 500 333 9 175 29 500 333 +4800 /data/VOCdevkit/VOC2007/JPEGImages/009546.jpg 375 500 17 1 215 370 492 14 158 196 363 450 14 32 173 85 218 +4801 /data/VOCdevkit/VOC2007/JPEGImages/009549.jpg 500 375 7 3 62 378 375 +4802 /data/VOCdevkit/VOC2007/JPEGImages/009550.jpg 375 500 8 24 320 87 412 8 1 327 44 419 8 217 298 255 366 8 240 314 297 395 8 314 362 375 496 8 280 351 352 458 +4803 /data/VOCdevkit/VOC2007/JPEGImages/009551.jpg 500 375 14 214 126 426 359 +4804 /data/VOCdevkit/VOC2007/JPEGImages/009557.jpg 333 500 1 121 275 199 365 14 116 216 181 365 +4805 /data/VOCdevkit/VOC2007/JPEGImages/009558.jpg 500 333 6 99 30 374 218 14 394 9 412 49 14 373 1 403 52 14 352 1 374 39 14 275 1 315 39 14 231 3 277 32 14 100 25 127 59 +4806 /data/VOCdevkit/VOC2007/JPEGImages/009560.jpg 500 336 7 4 3 244 171 +4807 /data/VOCdevkit/VOC2007/JPEGImages/009562.jpg 357 500 11 16 38 355 472 +4808 /data/VOCdevkit/VOC2007/JPEGImages/009565.jpg 500 375 17 1 113 251 375 14 215 201 439 375 +4809 /data/VOCdevkit/VOC2007/JPEGImages/009566.jpg 500 375 2 146 150 304 232 +4810 /data/VOCdevkit/VOC2007/JPEGImages/009567.jpg 500 375 17 3 59 382 375 14 100 87 302 375 +4811 /data/VOCdevkit/VOC2007/JPEGImages/009568.jpg 500 333 1 164 145 330 275 14 185 57 291 249 +4812 /data/VOCdevkit/VOC2007/JPEGImages/009571.jpg 500 333 0 88 243 249 302 +4813 /data/VOCdevkit/VOC2007/JPEGImages/009573.jpg 500 337 13 274 136 455 295 14 155 47 432 291 +4814 /data/VOCdevkit/VOC2007/JPEGImages/009576.jpg 500 375 19 191 129 351 217 +4815 /data/VOCdevkit/VOC2007/JPEGImages/009577.jpg 500 375 14 85 77 181 229 14 1 78 128 363 14 340 87 495 279 10 84 160 495 375 +4816 /data/VOCdevkit/VOC2007/JPEGImages/009579.jpg 375 500 14 20 2 375 500 +4817 /data/VOCdevkit/VOC2007/JPEGImages/009580.jpg 500 333 18 85 153 309 230 +4818 /data/VOCdevkit/VOC2007/JPEGImages/009584.jpg 500 375 7 178 4 263 104 7 323 174 487 358 7 256 225 409 375 +4819 /data/VOCdevkit/VOC2007/JPEGImages/009585.jpg 500 375 14 1 10 255 375 14 273 71 462 375 14 409 15 500 375 4 424 248 468 347 4 244 220 284 318 +4820 /data/VOCdevkit/VOC2007/JPEGImages/009586.jpg 375 500 9 170 355 205 390 +4821 /data/VOCdevkit/VOC2007/JPEGImages/009587.jpg 500 375 11 3 1 500 337 +4822 /data/VOCdevkit/VOC2007/JPEGImages/009588.jpg 500 335 18 1 144 401 228 +4823 /data/VOCdevkit/VOC2007/JPEGImages/009591.jpg 500 349 13 70 118 140 214 13 291 141 420 294 14 71 77 139 179 14 305 100 386 245 +4824 /data/VOCdevkit/VOC2007/JPEGImages/009596.jpg 500 331 13 1 143 112 236 13 164 114 291 219 13 323 113 382 196 13 312 102 342 166 14 201 70 262 191 14 233 65 281 116 14 323 69 386 181 14 374 72 419 163 14 305 48 323 86 6 14 41 54 76 6 118 47 137 64 +4825 /data/VOCdevkit/VOC2007/JPEGImages/009597.jpg 500 375 18 43 102 460 282 +4826 /data/VOCdevkit/VOC2007/JPEGImages/009598.jpg 500 375 2 160 157 246 358 2 199 135 413 302 +4827 /data/VOCdevkit/VOC2007/JPEGImages/009600.jpg 500 375 1 100 174 363 333 14 142 76 335 294 +4828 /data/VOCdevkit/VOC2007/JPEGImages/009603.jpg 500 375 3 5 153 493 375 14 330 86 456 373 +4829 /data/VOCdevkit/VOC2007/JPEGImages/009605.jpg 500 375 11 89 18 458 369 +4830 /data/VOCdevkit/VOC2007/JPEGImages/009609.jpg 500 335 2 213 90 400 175 +4831 /data/VOCdevkit/VOC2007/JPEGImages/009611.jpg 500 375 19 130 78 403 276 14 178 174 237 228 +4832 /data/VOCdevkit/VOC2007/JPEGImages/009613.jpg 375 500 8 227 246 290 311 8 78 274 141 390 8 1 288 73 407 14 39 241 60 263 14 11 253 116 383 8 170 268 253 335 +4833 /data/VOCdevkit/VOC2007/JPEGImages/009614.jpg 500 375 6 7 147 188 218 6 317 149 499 216 6 429 163 500 227 6 149 156 203 210 14 241 113 429 255 14 51 199 243 319 +4834 /data/VOCdevkit/VOC2007/JPEGImages/009615.jpg 500 333 0 17 89 490 235 +4835 /data/VOCdevkit/VOC2007/JPEGImages/009617.jpg 500 375 8 393 238 472 375 8 295 219 368 340 8 149 214 230 340 8 151 205 208 324 8 16 241 107 352 14 182 157 235 235 14 170 143 208 186 14 120 145 170 200 14 88 138 133 204 14 72 181 106 237 14 48 161 67 194 14 5 142 129 350 14 291 147 320 198 14 294 152 348 211 14 314 169 393 326 14 470 170 500 316 14 355 156 479 363 +4836 /data/VOCdevkit/VOC2007/JPEGImages/009618.jpg 500 375 1 183 230 305 311 1 391 273 500 321 14 191 170 251 309 +4837 /data/VOCdevkit/VOC2007/JPEGImages/009619.jpg 500 375 11 210 137 306 251 +4838 /data/VOCdevkit/VOC2007/JPEGImages/009620.jpg 500 375 0 4 59 499 264 6 58 283 119 329 +4839 /data/VOCdevkit/VOC2007/JPEGImages/009621.jpg 412 500 2 1 1 412 476 +4840 /data/VOCdevkit/VOC2007/JPEGImages/009623.jpg 500 333 6 149 52 454 232 +4841 /data/VOCdevkit/VOC2007/JPEGImages/009627.jpg 500 359 5 29 14 497 332 +4842 /data/VOCdevkit/VOC2007/JPEGImages/009629.jpg 500 334 0 225 165 363 189 +4843 /data/VOCdevkit/VOC2007/JPEGImages/009634.jpg 500 375 15 268 126 359 372 15 396 201 454 344 +4844 /data/VOCdevkit/VOC2007/JPEGImages/009636.jpg 375 500 1 89 224 375 500 +4845 /data/VOCdevkit/VOC2007/JPEGImages/009637.jpg 500 375 18 282 100 500 167 +4846 /data/VOCdevkit/VOC2007/JPEGImages/009638.jpg 500 375 8 410 191 500 321 8 409 179 450 255 14 96 3 500 375 14 349 155 377 184 14 383 160 404 182 14 328 156 348 181 15 15 153 51 197 15 58 141 97 204 10 337 205 422 280 +4847 /data/VOCdevkit/VOC2007/JPEGImages/009641.jpg 375 500 14 81 196 160 296 6 72 343 150 376 6 192 337 280 380 +4848 /data/VOCdevkit/VOC2007/JPEGImages/009644.jpg 500 332 6 36 78 481 303 +4849 /data/VOCdevkit/VOC2007/JPEGImages/009647.jpg 500 375 4 367 208 389 284 4 398 202 422 278 4 328 188 348 231 4 228 122 249 163 14 41 138 283 375 14 130 123 367 266 14 213 95 404 226 15 253 11 353 188 8 23 229 224 374 +4850 /data/VOCdevkit/VOC2007/JPEGImages/009649.jpg 500 375 14 324 188 434 336 14 302 128 405 340 14 277 75 364 212 14 197 138 297 258 14 196 96 307 335 14 116 86 290 347 14 53 86 344 375 8 385 72 495 283 +4851 /data/VOCdevkit/VOC2007/JPEGImages/009650.jpg 365 500 9 21 36 346 418 +4852 /data/VOCdevkit/VOC2007/JPEGImages/009654.jpg 333 500 14 1 83 296 500 +4853 /data/VOCdevkit/VOC2007/JPEGImages/009655.jpg 375 500 14 25 93 375 295 +4854 /data/VOCdevkit/VOC2007/JPEGImages/009656.jpg 500 375 1 181 156 324 345 14 207 86 327 305 19 398 98 500 217 +4855 /data/VOCdevkit/VOC2007/JPEGImages/009658.jpg 333 500 7 31 85 250 302 +4856 /data/VOCdevkit/VOC2007/JPEGImages/009659.jpg 500 375 8 243 4 500 375 14 81 11 371 370 +4857 /data/VOCdevkit/VOC2007/JPEGImages/009664.jpg 375 500 4 111 1 320 500 +4858 /data/VOCdevkit/VOC2007/JPEGImages/009666.jpg 375 500 4 183 154 307 500 14 1 1 306 500 +4859 /data/VOCdevkit/VOC2007/JPEGImages/009667.jpg 500 375 1 144 186 385 348 +4860 /data/VOCdevkit/VOC2007/JPEGImages/009668.jpg 500 375 11 1 19 321 375 14 317 91 475 375 +4861 /data/VOCdevkit/VOC2007/JPEGImages/009670.jpg 500 262 7 101 109 245 262 7 334 73 441 166 +4862 /data/VOCdevkit/VOC2007/JPEGImages/009671.jpg 500 375 6 45 195 203 261 6 253 206 444 284 6 192 202 333 255 14 109 180 128 202 14 146 180 166 200 +4863 /data/VOCdevkit/VOC2007/JPEGImages/009676.jpg 500 375 6 459 146 500 246 14 259 65 351 128 14 121 63 183 114 +4864 /data/VOCdevkit/VOC2007/JPEGImages/009678.jpg 500 371 5 49 124 472 348 +4865 /data/VOCdevkit/VOC2007/JPEGImages/009679.jpg 320 240 4 85 8 156 101 4 162 15 202 107 4 202 46 228 101 4 236 15 285 100 +4866 /data/VOCdevkit/VOC2007/JPEGImages/009681.jpg 500 375 0 6 94 442 262 +4867 /data/VOCdevkit/VOC2007/JPEGImages/009684.jpg 500 375 14 57 64 380 375 +4868 /data/VOCdevkit/VOC2007/JPEGImages/009685.jpg 500 375 5 53 147 488 357 +4869 /data/VOCdevkit/VOC2007/JPEGImages/009686.jpg 500 375 15 24 177 104 298 15 100 148 177 280 15 172 184 242 266 15 243 126 320 255 15 308 149 376 248 15 369 157 419 242 15 414 169 455 213 15 438 153 494 209 +4870 /data/VOCdevkit/VOC2007/JPEGImages/009687.jpg 500 375 14 262 60 500 375 14 1 75 278 375 4 405 165 500 273 4 28 260 96 375 +4871 /data/VOCdevkit/VOC2007/JPEGImages/009691.jpg 500 333 13 1 187 497 333 14 124 15 294 333 +4872 /data/VOCdevkit/VOC2007/JPEGImages/009692.jpg 500 375 2 167 172 224 263 2 203 157 298 249 +4873 /data/VOCdevkit/VOC2007/JPEGImages/009693.jpg 500 375 14 99 15 309 357 14 297 258 407 355 +4874 /data/VOCdevkit/VOC2007/JPEGImages/009695.jpg 500 274 18 15 111 491 256 +4875 /data/VOCdevkit/VOC2007/JPEGImages/009698.jpg 500 375 12 135 153 415 375 14 270 2 472 375 14 145 60 247 282 14 48 57 168 375 +4876 /data/VOCdevkit/VOC2007/JPEGImages/009699.jpg 500 375 6 40 49 438 284 6 404 51 500 144 6 1 44 101 151 6 262 39 411 101 +4877 /data/VOCdevkit/VOC2007/JPEGImages/009700.jpg 500 375 16 140 88 387 242 +4878 /data/VOCdevkit/VOC2007/JPEGImages/009702.jpg 500 333 0 336 49 418 85 0 198 61 278 105 0 210 135 291 170 0 47 83 132 120 0 81 140 160 175 0 87 220 164 254 +4879 /data/VOCdevkit/VOC2007/JPEGImages/009703.jpg 500 375 1 2 238 148 347 1 174 223 327 323 1 338 199 459 298 14 372 144 465 281 14 210 162 286 298 14 143 131 183 256 14 220 135 238 192 14 368 141 394 219 14 6 169 120 309 +4880 /data/VOCdevkit/VOC2007/JPEGImages/009706.jpg 500 375 10 114 223 469 375 +4881 /data/VOCdevkit/VOC2007/JPEGImages/009707.jpg 500 281 7 79 130 274 249 +4882 /data/VOCdevkit/VOC2007/JPEGImages/009709.jpg 375 500 4 257 1 375 498 4 132 2 271 495 4 1 1 141 489 +4883 /data/VOCdevkit/VOC2007/JPEGImages/009710.jpg 500 375 9 43 98 500 375 +4884 /data/VOCdevkit/VOC2007/JPEGImages/009711.jpg 500 374 6 37 59 428 314 6 422 150 500 221 14 315 186 354 303 14 377 206 419 304 +4885 /data/VOCdevkit/VOC2007/JPEGImages/009712.jpg 500 375 14 187 168 243 375 14 239 180 295 375 +4886 /data/VOCdevkit/VOC2007/JPEGImages/009713.jpg 500 375 11 114 57 406 344 14 132 1 235 107 8 358 4 497 176 +4887 /data/VOCdevkit/VOC2007/JPEGImages/009717.jpg 500 333 9 2 154 118 236 9 263 206 425 333 9 182 163 270 283 9 135 178 196 234 3 340 75 458 178 3 238 77 338 159 3 147 78 231 150 3 115 107 160 149 3 2 103 55 137 3 447 102 500 123 14 90 182 128 285 +4888 /data/VOCdevkit/VOC2007/JPEGImages/009718.jpg 500 375 18 2 194 297 252 6 362 315 408 344 6 162 337 240 372 +4889 /data/VOCdevkit/VOC2007/JPEGImages/009719.jpg 500 413 12 159 106 500 413 12 6 70 419 412 +4890 /data/VOCdevkit/VOC2007/JPEGImages/009721.jpg 375 500 8 91 174 278 424 14 25 150 245 474 14 1 72 113 399 +4891 /data/VOCdevkit/VOC2007/JPEGImages/009724.jpg 500 375 7 33 2 479 375 +4892 /data/VOCdevkit/VOC2007/JPEGImages/009726.jpg 500 375 14 232 86 446 315 14 60 73 297 335 4 293 270 330 374 4 359 263 392 370 10 63 297 489 375 +4893 /data/VOCdevkit/VOC2007/JPEGImages/009729.jpg 500 333 6 104 61 373 259 +4894 /data/VOCdevkit/VOC2007/JPEGImages/009732.jpg 480 447 12 59 98 376 411 14 192 33 310 272 +4895 /data/VOCdevkit/VOC2007/JPEGImages/009733.jpg 500 333 6 75 4 479 319 +4896 /data/VOCdevkit/VOC2007/JPEGImages/009734.jpg 500 375 5 120 97 353 263 14 395 181 458 326 +4897 /data/VOCdevkit/VOC2007/JPEGImages/009735.jpg 333 500 8 54 365 100 429 +4898 /data/VOCdevkit/VOC2007/JPEGImages/009737.jpg 500 332 17 16 105 498 330 +4899 /data/VOCdevkit/VOC2007/JPEGImages/009738.jpg 375 500 14 187 255 311 474 +4900 /data/VOCdevkit/VOC2007/JPEGImages/009743.jpg 500 379 7 150 165 342 220 +4901 /data/VOCdevkit/VOC2007/JPEGImages/009745.jpg 500 375 6 347 184 431 229 6 98 192 214 267 +4902 /data/VOCdevkit/VOC2007/JPEGImages/009746.jpg 500 375 8 69 162 293 375 19 186 97 277 194 +4903 /data/VOCdevkit/VOC2007/JPEGImages/009747.jpg 332 500 1 188 335 250 465 14 126 251 197 453 +4904 /data/VOCdevkit/VOC2007/JPEGImages/009748.jpg 500 374 11 68 86 400 338 +4905 /data/VOCdevkit/VOC2007/JPEGImages/009749.jpg 369 500 2 209 289 295 446 +4906 /data/VOCdevkit/VOC2007/JPEGImages/009754.jpg 500 375 14 178 124 421 328 +4907 /data/VOCdevkit/VOC2007/JPEGImages/009755.jpg 500 334 17 134 128 500 332 14 215 131 318 251 +4908 /data/VOCdevkit/VOC2007/JPEGImages/009756.jpg 500 375 14 205 24 380 287 13 118 82 420 316 +4909 /data/VOCdevkit/VOC2007/JPEGImages/009758.jpg 500 332 10 294 147 436 201 10 146 140 244 175 10 14 133 113 179 10 82 186 349 331 8 4 200 104 323 +4910 /data/VOCdevkit/VOC2007/JPEGImages/009761.jpg 375 500 1 43 24 375 476 +4911 /data/VOCdevkit/VOC2007/JPEGImages/009762.jpg 500 375 14 156 176 174 216 5 37 152 153 206 +4912 /data/VOCdevkit/VOC2007/JPEGImages/009763.jpg 500 375 7 281 131 484 269 11 42 32 334 318 +4913 /data/VOCdevkit/VOC2007/JPEGImages/009764.jpg 500 375 5 242 131 482 340 5 31 86 242 352 +4914 /data/VOCdevkit/VOC2007/JPEGImages/009767.jpg 375 500 12 103 114 260 500 14 90 51 219 361 +4915 /data/VOCdevkit/VOC2007/JPEGImages/009772.jpg 375 500 7 5 145 375 500 +4916 /data/VOCdevkit/VOC2007/JPEGImages/009773.jpg 500 375 14 188 71 288 245 8 205 127 375 311 8 453 131 500 197 +4917 /data/VOCdevkit/VOC2007/JPEGImages/009774.jpg 500 400 6 27 4 478 390 6 373 51 458 117 6 453 65 500 116 +4918 /data/VOCdevkit/VOC2007/JPEGImages/009776.jpg 500 375 14 192 48 321 366 13 39 123 404 357 6 1 107 150 237 +4919 /data/VOCdevkit/VOC2007/JPEGImages/009778.jpg 500 375 18 18 114 163 251 +4920 /data/VOCdevkit/VOC2007/JPEGImages/009780.jpg 500 334 11 329 99 500 317 14 1 18 500 334 +4921 /data/VOCdevkit/VOC2007/JPEGImages/009781.jpg 500 375 13 111 65 462 298 14 224 33 394 269 +4922 /data/VOCdevkit/VOC2007/JPEGImages/009785.jpg 500 333 6 75 63 394 320 +4923 /data/VOCdevkit/VOC2007/JPEGImages/009789.jpg 500 351 14 1 116 231 351 14 232 52 500 351 +4924 /data/VOCdevkit/VOC2007/JPEGImages/009790.jpg 500 284 18 11 40 479 213 +4925 /data/VOCdevkit/VOC2007/JPEGImages/009792.jpg 500 375 8 24 151 148 358 8 151 199 374 343 14 150 152 263 303 14 251 106 347 347 14 374 168 500 351 14 457 133 500 323 +4926 /data/VOCdevkit/VOC2007/JPEGImages/009794.jpg 372 500 7 1 14 324 500 +4927 /data/VOCdevkit/VOC2007/JPEGImages/009796.jpg 500 375 14 285 78 408 368 14 182 99 322 375 14 104 85 351 233 14 76 92 200 375 +4928 /data/VOCdevkit/VOC2007/JPEGImages/009797.jpg 500 333 11 132 50 238 303 11 222 110 396 312 +4929 /data/VOCdevkit/VOC2007/JPEGImages/009800.jpg 500 460 2 128 261 177 313 14 285 190 378 460 14 402 161 500 460 14 1 154 62 460 +4930 /data/VOCdevkit/VOC2007/JPEGImages/009801.jpg 500 375 6 168 209 279 249 6 1 220 33 244 6 368 218 404 233 +4931 /data/VOCdevkit/VOC2007/JPEGImages/009805.jpg 500 375 7 97 133 392 276 +4932 /data/VOCdevkit/VOC2007/JPEGImages/009807.jpg 500 333 12 191 61 474 332 +4933 /data/VOCdevkit/VOC2007/JPEGImages/009808.jpg 350 500 12 18 43 291 482 +4934 /data/VOCdevkit/VOC2007/JPEGImages/009809.jpg 500 334 14 61 1 398 334 +4935 /data/VOCdevkit/VOC2007/JPEGImages/009810.jpg 500 333 6 23 61 468 259 +4936 /data/VOCdevkit/VOC2007/JPEGImages/009813.jpg 500 375 14 185 132 500 284 +4937 /data/VOCdevkit/VOC2007/JPEGImages/009816.jpg 500 375 16 87 227 157 269 16 151 219 193 241 16 235 214 283 259 16 319 205 367 238 16 396 186 454 220 16 426 179 474 211 16 308 191 356 220 +4938 /data/VOCdevkit/VOC2007/JPEGImages/009819.jpg 500 375 8 369 34 465 188 7 232 51 383 267 +4939 /data/VOCdevkit/VOC2007/JPEGImages/009822.jpg 500 375 6 147 170 184 195 6 113 170 150 203 14 342 184 358 221 14 108 180 132 200 14 142 177 164 228 14 196 183 217 228 13 22 226 84 300 13 98 234 155 309 13 166 249 225 341 13 244 271 320 372 13 216 208 262 266 13 79 213 117 273 14 256 230 314 344 14 177 221 220 314 14 104 204 153 284 14 36 196 83 280 14 83 191 115 256 6 372 196 500 324 14 6 176 25 225 14 26 183 48 209 14 65 175 83 197 14 222 190 254 250 +4940 /data/VOCdevkit/VOC2007/JPEGImages/009823.jpg 500 375 11 3 4 498 374 +4941 /data/VOCdevkit/VOC2007/JPEGImages/009825.jpg 333 500 8 90 280 144 359 +4942 /data/VOCdevkit/VOC2007/JPEGImages/009828.jpg 333 500 8 35 214 86 285 8 18 239 88 312 8 2 259 89 342 8 1 304 91 413 14 79 5 286 500 +4943 /data/VOCdevkit/VOC2007/JPEGImages/009830.jpg 500 375 6 43 18 401 315 +4944 /data/VOCdevkit/VOC2007/JPEGImages/009831.jpg 500 343 18 194 48 500 319 18 60 84 311 289 +4945 /data/VOCdevkit/VOC2007/JPEGImages/009832.jpg 500 375 5 277 11 500 350 +4946 /data/VOCdevkit/VOC2007/JPEGImages/009833.jpg 500 375 8 339 284 425 375 8 217 274 288 375 8 128 286 209 375 8 85 264 141 352 8 80 345 141 375 8 1 262 66 343 +4947 /data/VOCdevkit/VOC2007/JPEGImages/009834.jpg 500 333 6 88 75 449 280 +4948 /data/VOCdevkit/VOC2007/JPEGImages/009836.jpg 500 333 3 192 124 302 221 +4949 /data/VOCdevkit/VOC2007/JPEGImages/009839.jpg 500 341 6 160 159 369 279 +4950 /data/VOCdevkit/VOC2007/JPEGImages/009841.jpg 500 321 14 79 148 171 226 12 175 80 354 227 +4951 /data/VOCdevkit/VOC2007/JPEGImages/009842.jpg 500 375 16 180 1 401 332 +4952 /data/VOCdevkit/VOC2007/JPEGImages/009845.jpg 500 375 6 473 207 500 246 6 404 204 475 241 14 201 209 229 307 14 185 199 203 237 5 157 89 376 280 +4953 /data/VOCdevkit/VOC2007/JPEGImages/009848.jpg 480 360 14 139 78 278 330 1 55 201 306 360 6 374 1 477 29 +4954 /data/VOCdevkit/VOC2007/JPEGImages/009851.jpg 500 375 12 147 144 312 266 12 91 136 249 267 14 221 113 256 208 14 164 122 209 202 +4955 /data/VOCdevkit/VOC2007/JPEGImages/009852.jpg 500 375 7 153 121 482 375 +4956 /data/VOCdevkit/VOC2007/JPEGImages/009855.jpg 500 325 18 107 32 500 280 +4957 /data/VOCdevkit/VOC2007/JPEGImages/009858.jpg 500 375 0 93 177 283 226 +4958 /data/VOCdevkit/VOC2007/JPEGImages/009859.jpg 500 333 14 110 40 344 333 +4959 /data/VOCdevkit/VOC2007/JPEGImages/009860.jpg 500 396 18 65 25 490 355 +4960 /data/VOCdevkit/VOC2007/JPEGImages/009862.jpg 375 500 6 2 109 375 500 +4961 /data/VOCdevkit/VOC2007/JPEGImages/009863.jpg 500 375 6 199 111 395 191 6 37 164 401 333 +4962 /data/VOCdevkit/VOC2007/JPEGImages/009865.jpg 500 334 9 150 142 238 330 9 1 141 139 333 9 220 141 316 282 +4963 /data/VOCdevkit/VOC2007/JPEGImages/009867.jpg 500 375 19 307 91 500 368 19 1 28 309 375 +4964 /data/VOCdevkit/VOC2007/JPEGImages/009868.jpg 333 500 14 73 139 234 415 +4965 /data/VOCdevkit/VOC2007/JPEGImages/009869.jpg 500 375 14 3 6 353 375 +4966 /data/VOCdevkit/VOC2007/JPEGImages/009870.jpg 500 340 11 272 70 466 290 11 26 43 315 276 +4967 /data/VOCdevkit/VOC2007/JPEGImages/009872.jpg 500 375 8 39 243 136 311 8 157 245 261 306 8 277 241 367 303 8 309 306 462 375 8 114 308 275 374 8 1 307 87 375 +4968 /data/VOCdevkit/VOC2007/JPEGImages/009874.jpg 318 480 12 116 158 238 480 14 91 108 262 325 +4969 /data/VOCdevkit/VOC2007/JPEGImages/009877.jpg 333 500 14 3 102 289 500 14 270 185 326 406 +4970 /data/VOCdevkit/VOC2007/JPEGImages/009878.jpg 500 375 17 74 119 374 349 4 13 328 49 375 14 87 106 221 254 14 352 109 443 321 14 247 104 355 375 14 170 110 280 351 15 17 3 163 210 +4971 /data/VOCdevkit/VOC2007/JPEGImages/009879.jpg 500 375 6 153 184 284 231 6 462 165 500 244 6 398 164 498 227 14 355 162 403 275 +4972 /data/VOCdevkit/VOC2007/JPEGImages/009880.jpg 375 500 14 250 150 340 252 14 292 138 375 290 14 49 118 148 324 14 32 122 364 500 14 234 143 258 208 +4973 /data/VOCdevkit/VOC2007/JPEGImages/009881.jpg 500 339 19 314 174 500 339 14 1 96 127 339 14 164 74 327 337 +4974 /data/VOCdevkit/VOC2007/JPEGImages/009882.jpg 500 372 19 370 60 497 173 19 182 2 277 82 14 327 123 472 372 14 259 74 422 372 14 231 20 322 192 14 122 22 235 273 14 9 40 123 283 14 14 155 283 372 +4975 /data/VOCdevkit/VOC2007/JPEGImages/009884.jpg 500 375 15 85 78 400 375 +4976 /data/VOCdevkit/VOC2007/JPEGImages/009886.jpg 500 375 7 87 67 395 305 +4977 /data/VOCdevkit/VOC2007/JPEGImages/009887.jpg 500 374 15 267 276 300 323 15 222 261 265 316 +4978 /data/VOCdevkit/VOC2007/JPEGImages/009894.jpg 500 335 18 215 157 271 182 +4979 /data/VOCdevkit/VOC2007/JPEGImages/009896.jpg 500 375 7 139 134 372 323 +4980 /data/VOCdevkit/VOC2007/JPEGImages/009897.jpg 500 375 9 236 68 467 317 9 125 146 267 294 +4981 /data/VOCdevkit/VOC2007/JPEGImages/009898.jpg 500 333 6 3 3 498 331 +4982 /data/VOCdevkit/VOC2007/JPEGImages/009900.jpg 375 500 6 36 40 375 500 14 312 1 372 123 14 259 1 310 93 14 78 1 124 82 +4983 /data/VOCdevkit/VOC2007/JPEGImages/009902.jpg 500 375 4 121 57 150 128 4 105 68 129 138 4 135 52 155 114 14 231 65 366 218 14 12 99 216 363 14 357 107 500 292 +4984 /data/VOCdevkit/VOC2007/JPEGImages/009904.jpg 375 500 6 72 343 160 389 +4985 /data/VOCdevkit/VOC2007/JPEGImages/009905.jpg 500 361 0 43 97 465 236 +4986 /data/VOCdevkit/VOC2007/JPEGImages/009908.jpg 500 375 9 107 110 253 268 2 277 160 317 180 2 146 70 181 119 +4987 /data/VOCdevkit/VOC2007/JPEGImages/009911.jpg 500 400 0 75 137 417 265 +4988 /data/VOCdevkit/VOC2007/JPEGImages/009913.jpg 500 375 6 40 82 447 261 +4989 /data/VOCdevkit/VOC2007/JPEGImages/009917.jpg 500 375 14 2 25 206 253 14 302 51 452 244 4 450 95 500 337 +4990 /data/VOCdevkit/VOC2007/JPEGImages/009918.jpg 500 333 11 118 123 287 333 14 182 30 465 234 14 51 1 182 107 14 1 1 268 330 +4991 /data/VOCdevkit/VOC2007/JPEGImages/009920.jpg 334 500 6 9 213 321 419 +4992 /data/VOCdevkit/VOC2007/JPEGImages/009923.jpg 500 333 7 112 148 252 333 +4993 /data/VOCdevkit/VOC2007/JPEGImages/009926.jpg 500 375 14 119 84 238 285 14 298 6 490 359 1 77 157 280 323 1 299 146 443 375 +4994 /data/VOCdevkit/VOC2007/JPEGImages/009932.jpg 375 500 6 68 324 284 498 +4995 /data/VOCdevkit/VOC2007/JPEGImages/009935.jpg 500 375 14 274 155 436 372 14 104 124 179 206 14 1 134 73 264 19 419 154 465 266 19 364 135 409 216 19 104 121 156 165 19 24 125 75 179 8 33 222 158 375 8 109 167 174 298 8 266 235 373 375 8 1 183 75 312 +4996 /data/VOCdevkit/VOC2007/JPEGImages/009938.jpg 500 375 13 137 55 320 340 6 242 1 325 52 +4997 /data/VOCdevkit/VOC2007/JPEGImages/009939.jpg 500 375 17 40 114 291 225 +4998 /data/VOCdevkit/VOC2007/JPEGImages/009940.jpg 500 375 2 218 114 387 375 2 135 133 365 375 +4999 /data/VOCdevkit/VOC2007/JPEGImages/009942.jpg 500 332 14 11 1 221 207 14 2 9 365 332 14 265 2 500 332 +5000 /data/VOCdevkit/VOC2007/JPEGImages/009944.jpg 500 331 13 87 120 329 291 14 145 38 305 290 +5001 /data/VOCdevkit/VOC2007/JPEGImages/009945.jpg 500 375 16 92 199 132 229 +5002 /data/VOCdevkit/VOC2007/JPEGImages/009946.jpg 500 375 14 181 177 198 221 14 199 180 238 257 18 193 142 499 337 +5003 /data/VOCdevkit/VOC2007/JPEGImages/009947.jpg 332 500 3 115 92 250 321 +5004 /data/VOCdevkit/VOC2007/JPEGImages/009949.jpg 500 375 17 128 121 500 350 8 195 241 500 375 14 25 90 427 312 14 203 81 331 218 14 235 116 279 159 +5005 /data/VOCdevkit/VOC2007/JPEGImages/009950.jpg 500 332 18 1 2 500 332 14 231 111 299 198 +5006 /data/VOCdevkit/VOC2007/JPEGImages/009954.jpg 500 332 12 192 126 403 275 14 143 115 185 161 +5007 /data/VOCdevkit/VOC2007/JPEGImages/009955.jpg 500 500 3 89 213 432 301 3 235 280 384 313 +5008 /data/VOCdevkit/VOC2007/JPEGImages/009958.jpg 500 333 14 344 106 444 298 14 148 108 213 187 14 89 27 149 217 14 75 39 147 124 1 77 121 178 316 +5009 /data/VOCdevkit/VOC2007/JPEGImages/009959.jpg 500 375 6 192 142 330 187 +5010 /data/VOCdevkit/VOC2007/JPEGImages/009961.jpg 500 374 11 69 4 392 345 +5011 /data/VOCdevkit/VOC2012/JPEGImages/2008_000002.jpg 500 375 19 34 11 448 293 +5012 /data/VOCdevkit/VOC2012/JPEGImages/2008_000003.jpg 500 333 18 46 11 500 333 14 62 190 83 243 +5013 /data/VOCdevkit/VOC2012/JPEGImages/2008_000007.jpg 500 375 3 1 230 428 293 +5014 /data/VOCdevkit/VOC2012/JPEGImages/2008_000008.jpg 500 442 12 53 87 471 420 14 158 44 289 167 +5015 /data/VOCdevkit/VOC2012/JPEGImages/2008_000009.jpg 500 375 9 217 161 294 221 9 465 167 500 218 +5016 /data/VOCdevkit/VOC2012/JPEGImages/2008_000015.jpg 500 327 4 270 1 378 176 4 57 1 164 150 +5017 /data/VOCdevkit/VOC2012/JPEGImages/2008_000016.jpg 500 375 19 91 15 392 353 +5018 /data/VOCdevkit/VOC2012/JPEGImages/2008_000019.jpg 480 272 11 139 2 372 197 11 165 66 318 236 11 361 1 480 112 +5019 /data/VOCdevkit/VOC2012/JPEGImages/2008_000021.jpg 500 375 0 14 148 475 288 +5020 /data/VOCdevkit/VOC2012/JPEGImages/2008_000023.jpg 333 500 19 6 1 314 262 4 40 97 121 411 14 137 36 169 109 14 180 36 216 104 14 96 39 123 103 +5021 /data/VOCdevkit/VOC2012/JPEGImages/2008_000026.jpg 500 375 14 122 7 372 375 11 211 147 325 255 +5022 /data/VOCdevkit/VOC2012/JPEGImages/2008_000027.jpg 500 375 6 9 32 500 375 +5023 /data/VOCdevkit/VOC2012/JPEGImages/2008_000028.jpg 500 375 6 158 199 231 240 6 47 202 94 238 +5024 /data/VOCdevkit/VOC2012/JPEGImages/2008_000032.jpg 500 375 5 6 118 489 274 14 336 173 364 224 +5025 /data/VOCdevkit/VOC2012/JPEGImages/2008_000033.jpg 500 333 0 104 61 476 257 +5026 /data/VOCdevkit/VOC2012/JPEGImages/2008_000034.jpg 338 500 4 6 234 45 362 14 1 156 103 336 14 36 111 198 416 14 91 42 338 500 +5027 /data/VOCdevkit/VOC2012/JPEGImages/2008_000036.jpg 500 375 1 120 1 203 35 1 117 38 273 121 14 206 74 395 237 3 24 2 500 188 3 1 187 500 282 +5028 /data/VOCdevkit/VOC2012/JPEGImages/2008_000037.jpg 500 444 0 47 157 450 282 +5029 /data/VOCdevkit/VOC2012/JPEGImages/2008_000041.jpg 500 375 14 271 170 386 234 14 295 189 328 231 14 206 176 256 236 14 122 162 198 330 14 457 212 500 297 14 438 173 500 243 8 351 272 452 375 8 265 250 353 364 8 189 260 286 375 10 149 224 402 331 14 358 188 469 359 +5030 /data/VOCdevkit/VOC2012/JPEGImages/2008_000042.jpg 500 375 6 445 254 500 335 +5031 /data/VOCdevkit/VOC2012/JPEGImages/2008_000043.jpg 500 374 10 166 175 425 344 8 244 156 316 287 8 328 162 388 194 8 355 180 440 328 8 289 197 373 336 8 164 195 264 342 8 150 161 186 282 +5032 /data/VOCdevkit/VOC2012/JPEGImages/2008_000045.jpg 500 375 18 45 42 455 342 +5033 /data/VOCdevkit/VOC2012/JPEGImages/2008_000050.jpg 500 375 6 292 197 328 228 +5034 /data/VOCdevkit/VOC2012/JPEGImages/2008_000051.jpg 500 371 8 220 192 319 371 4 182 102 193 136 4 120 70 138 109 14 150 165 275 365 14 108 133 292 371 +5035 /data/VOCdevkit/VOC2012/JPEGImages/2008_000052.jpg 312 188 6 159 71 276 140 14 156 73 169 114 14 141 78 154 113 +5036 /data/VOCdevkit/VOC2012/JPEGImages/2008_000053.jpg 500 375 11 54 2 500 375 +5037 /data/VOCdevkit/VOC2012/JPEGImages/2008_000054.jpg 500 333 2 284 100 318 184 2 112 146 198 209 +5038 /data/VOCdevkit/VOC2012/JPEGImages/2008_000056.jpg 500 375 7 1 1 395 375 +5039 /data/VOCdevkit/VOC2012/JPEGImages/2008_000059.jpg 375 500 11 1 81 375 467 +5040 /data/VOCdevkit/VOC2012/JPEGImages/2008_000060.jpg 448 336 7 1 32 343 336 +5041 /data/VOCdevkit/VOC2012/JPEGImages/2008_000062.jpg 493 500 7 1 3 491 483 +5042 /data/VOCdevkit/VOC2012/JPEGImages/2008_000064.jpg 375 500 0 1 152 375 461 +5043 /data/VOCdevkit/VOC2012/JPEGImages/2008_000066.jpg 483 500 11 1 9 439 500 +5044 /data/VOCdevkit/VOC2012/JPEGImages/2008_000067.jpg 375 500 8 94 224 255 445 14 136 225 241 346 +5045 /data/VOCdevkit/VOC2012/JPEGImages/2008_000070.jpg 500 375 19 180 260 213 293 8 367 244 447 353 8 255 247 371 375 +5046 /data/VOCdevkit/VOC2012/JPEGImages/2008_000073.jpg 500 351 9 50 193 267 293 +5047 /data/VOCdevkit/VOC2012/JPEGImages/2008_000074.jpg 500 375 6 46 178 387 335 +5048 /data/VOCdevkit/VOC2012/JPEGImages/2008_000075.jpg 500 375 5 14 73 500 257 +5049 /data/VOCdevkit/VOC2012/JPEGImages/2008_000076.jpg 500 333 12 69 37 500 310 +5050 /data/VOCdevkit/VOC2012/JPEGImages/2008_000078.jpg 457 500 11 16 1 436 500 +5051 /data/VOCdevkit/VOC2012/JPEGImages/2008_000080.jpg 500 375 11 201 72 402 285 +5052 /data/VOCdevkit/VOC2012/JPEGImages/2008_000082.jpg 500 375 14 286 197 351 291 14 143 202 185 257 3 23 186 140 246 13 128 239 346 361 +5053 /data/VOCdevkit/VOC2012/JPEGImages/2008_000084.jpg 500 370 16 141 221 261 297 +5054 /data/VOCdevkit/VOC2012/JPEGImages/2008_000085.jpg 500 375 6 1 1 395 375 +5055 /data/VOCdevkit/VOC2012/JPEGImages/2008_000089.jpg 376 500 8 71 18 307 494 +5056 /data/VOCdevkit/VOC2012/JPEGImages/2008_000090.jpg 500 333 14 302 135 355 319 14 251 40 319 182 14 111 73 177 189 14 78 97 173 218 14 1 43 32 267 1 455 88 500 142 1 342 83 392 153 +5057 /data/VOCdevkit/VOC2012/JPEGImages/2008_000093.jpg 500 375 19 392 3 479 95 8 307 178 412 280 8 328 194 473 328 17 143 163 320 247 17 1 173 145 317 +5058 /data/VOCdevkit/VOC2012/JPEGImages/2008_000095.jpg 375 500 2 251 161 287 270 +5059 /data/VOCdevkit/VOC2012/JPEGImages/2008_000096.jpg 500 375 14 1 1 500 375 7 96 124 416 375 +5060 /data/VOCdevkit/VOC2012/JPEGImages/2008_000097.jpg 333 500 2 101 203 181 274 +5061 /data/VOCdevkit/VOC2012/JPEGImages/2008_000099.jpg 500 357 11 122 11 336 223 16 98 176 425 357 +5062 /data/VOCdevkit/VOC2012/JPEGImages/2008_000103.jpg 500 375 2 156 48 287 338 +5063 /data/VOCdevkit/VOC2012/JPEGImages/2008_000105.jpg 500 375 6 215 182 377 240 +5064 /data/VOCdevkit/VOC2012/JPEGImages/2008_000107.jpg 414 500 8 68 212 288 482 +5065 /data/VOCdevkit/VOC2012/JPEGImages/2008_000109.jpg 500 375 13 293 70 420 197 6 41 95 444 375 14 228 90 338 365 +5066 /data/VOCdevkit/VOC2012/JPEGImages/2008_000112.jpg 500 375 7 83 74 386 320 4 324 1 394 116 +5067 /data/VOCdevkit/VOC2012/JPEGImages/2008_000115.jpg 500 400 7 109 131 461 295 8 1 1 497 400 +5068 /data/VOCdevkit/VOC2012/JPEGImages/2008_000116.jpg 500 400 7 44 86 321 319 +5069 /data/VOCdevkit/VOC2012/JPEGImages/2008_000119.jpg 264 499 12 29 18 264 499 +5070 /data/VOCdevkit/VOC2012/JPEGImages/2008_000120.jpg 500 332 3 21 53 408 253 +5071 /data/VOCdevkit/VOC2012/JPEGImages/2008_000123.jpg 500 333 2 111 62 287 171 +5072 /data/VOCdevkit/VOC2012/JPEGImages/2008_000128.jpg 500 375 17 11 29 500 375 14 1 85 361 375 14 92 173 212 357 +5073 /data/VOCdevkit/VOC2012/JPEGImages/2008_000131.jpg 500 308 2 185 119 332 180 +5074 /data/VOCdevkit/VOC2012/JPEGImages/2008_000132.jpg 500 375 14 431 106 474 253 14 39 111 81 262 5 1 255 500 375 +5075 /data/VOCdevkit/VOC2012/JPEGImages/2008_000133.jpg 500 377 6 1 1 500 217 1 20 30 500 332 +5076 /data/VOCdevkit/VOC2012/JPEGImages/2008_000134.jpg 375 500 2 137 79 271 157 2 68 320 179 390 +5077 /data/VOCdevkit/VOC2012/JPEGImages/2008_000138.jpg 500 466 11 170 348 285 401 14 185 117 253 316 14 118 138 188 346 14 96 158 167 367 14 293 148 359 367 14 260 116 341 312 +5078 /data/VOCdevkit/VOC2012/JPEGImages/2008_000140.jpg 375 500 3 241 255 375 467 3 1 398 221 471 +5079 /data/VOCdevkit/VOC2012/JPEGImages/2008_000141.jpg 500 333 12 94 9 500 333 14 42 167 75 223 +5080 /data/VOCdevkit/VOC2012/JPEGImages/2008_000142.jpg 500 333 12 109 75 494 333 14 93 159 105 188 14 36 100 129 333 +5081 /data/VOCdevkit/VOC2012/JPEGImages/2008_000143.jpg 500 332 6 370 105 417 122 6 392 111 500 177 13 129 80 236 249 14 102 25 212 214 +5082 /data/VOCdevkit/VOC2012/JPEGImages/2008_000144.jpg 500 332 13 147 113 359 287 14 185 56 287 241 +5083 /data/VOCdevkit/VOC2012/JPEGImages/2008_000145.jpg 500 400 19 91 59 449 297 4 201 249 247 375 +5084 /data/VOCdevkit/VOC2012/JPEGImages/2008_000148.jpg 500 375 3 1 154 57 230 +5085 /data/VOCdevkit/VOC2012/JPEGImages/2008_000149.jpg 500 357 17 126 132 407 252 8 1 118 115 265 +5086 /data/VOCdevkit/VOC2012/JPEGImages/2008_000151.jpg 500 375 0 244 225 275 261 +5087 /data/VOCdevkit/VOC2012/JPEGImages/2008_000154.jpg 500 331 4 39 194 111 295 +5088 /data/VOCdevkit/VOC2012/JPEGImages/2008_000162.jpg 494 500 11 47 20 494 500 +5089 /data/VOCdevkit/VOC2012/JPEGImages/2008_000163.jpg 500 333 6 1 38 500 333 +5090 /data/VOCdevkit/VOC2012/JPEGImages/2008_000174.jpg 500 375 6 438 265 500 348 6 180 271 246 295 6 88 263 162 294 6 63 269 123 306 6 1 256 68 309 6 1 275 40 316 +5091 /data/VOCdevkit/VOC2012/JPEGImages/2008_000176.jpg 500 375 6 5 110 500 346 14 200 127 302 349 +5092 /data/VOCdevkit/VOC2012/JPEGImages/2008_000177.jpg 457 500 12 1 36 410 500 +5093 /data/VOCdevkit/VOC2012/JPEGImages/2008_000181.jpg 486 348 7 46 76 423 321 +5094 /data/VOCdevkit/VOC2012/JPEGImages/2008_000182.jpg 411 500 7 234 326 336 429 +5095 /data/VOCdevkit/VOC2012/JPEGImages/2008_000183.jpg 258 500 11 25 45 242 500 +5096 /data/VOCdevkit/VOC2012/JPEGImages/2008_000185.jpg 500 333 6 159 43 465 272 +5097 /data/VOCdevkit/VOC2012/JPEGImages/2008_000187.jpg 500 333 6 160 119 443 203 +5098 /data/VOCdevkit/VOC2012/JPEGImages/2008_000188.jpg 500 375 15 45 59 395 375 +5099 /data/VOCdevkit/VOC2012/JPEGImages/2008_000189.jpg 500 333 6 53 55 389 295 +5100 /data/VOCdevkit/VOC2012/JPEGImages/2008_000190.jpg 500 375 18 1 138 251 167 +5101 /data/VOCdevkit/VOC2012/JPEGImages/2008_000191.jpg 500 375 14 68 185 94 215 14 23 180 55 250 1 57 194 151 255 +5102 /data/VOCdevkit/VOC2012/JPEGImages/2008_000192.jpg 500 346 2 249 57 441 246 +5103 /data/VOCdevkit/VOC2012/JPEGImages/2008_000193.jpg 500 333 6 103 127 323 204 +5104 /data/VOCdevkit/VOC2012/JPEGImages/2008_000194.jpg 500 375 1 192 183 310 277 14 226 106 272 242 +5105 /data/VOCdevkit/VOC2012/JPEGImages/2008_000195.jpg 500 333 14 254 144 314 296 14 309 99 443 300 14 16 173 102 305 3 236 206 339 282 3 98 235 200 302 +5106 /data/VOCdevkit/VOC2012/JPEGImages/2008_000196.jpg 500 375 1 348 7 500 309 15 340 105 500 306 1 1 1 206 310 7 193 155 278 304 +5107 /data/VOCdevkit/VOC2012/JPEGImages/2008_000197.jpg 500 333 0 95 134 230 203 +5108 /data/VOCdevkit/VOC2012/JPEGImages/2008_000199.jpg 500 375 14 412 59 500 354 6 229 85 386 188 +5109 /data/VOCdevkit/VOC2012/JPEGImages/2008_000202.jpg 500 333 14 60 58 125 140 14 145 38 252 333 14 245 152 342 280 14 337 140 461 306 19 17 39 159 157 4 430 258 454 322 8 14 169 94 258 +5110 /data/VOCdevkit/VOC2012/JPEGImages/2008_000203.jpg 500 400 14 114 82 147 110 14 313 117 376 248 13 354 156 411 261 6 81 108 246 258 +5111 /data/VOCdevkit/VOC2012/JPEGImages/2008_000204.jpg 303 437 14 130 206 151 251 14 132 217 164 293 +5112 /data/VOCdevkit/VOC2012/JPEGImages/2008_000207.jpg 334 500 14 72 54 253 434 +5113 /data/VOCdevkit/VOC2012/JPEGImages/2008_000213.jpg 500 333 14 95 24 414 333 +5114 /data/VOCdevkit/VOC2012/JPEGImages/2008_000215.jpg 500 375 14 1 147 162 375 14 149 119 319 375 14 316 141 500 375 +5115 /data/VOCdevkit/VOC2012/JPEGImages/2008_000217.jpg 500 375 14 64 39 259 375 14 238 54 423 375 +5116 /data/VOCdevkit/VOC2012/JPEGImages/2008_000219.jpg 500 375 12 88 147 226 245 12 381 153 465 241 +5117 /data/VOCdevkit/VOC2012/JPEGImages/2008_000222.jpg 500 360 14 1 8 500 360 7 29 90 500 360 +5118 /data/VOCdevkit/VOC2012/JPEGImages/2008_000223.jpg 500 319 14 229 99 318 311 +5119 /data/VOCdevkit/VOC2012/JPEGImages/2008_000226.jpg 500 375 14 386 167 407 231 14 310 144 335 209 14 284 96 306 152 14 311 87 334 109 6 152 156 303 219 +5120 /data/VOCdevkit/VOC2012/JPEGImages/2008_000227.jpg 500 375 7 120 152 424 346 8 194 1 384 121 10 1 90 468 375 +5121 /data/VOCdevkit/VOC2012/JPEGImages/2008_000233.jpg 461 307 14 233 76 454 307 +5122 /data/VOCdevkit/VOC2012/JPEGImages/2008_000234.jpg 500 375 14 81 70 318 375 14 210 127 436 375 14 374 3 500 375 +5123 /data/VOCdevkit/VOC2012/JPEGImages/2008_000235.jpg 500 375 14 286 98 371 225 3 111 171 488 278 +5124 /data/VOCdevkit/VOC2012/JPEGImages/2008_000236.jpg 500 375 14 62 23 382 296 +5125 /data/VOCdevkit/VOC2012/JPEGImages/2008_000237.jpg 500 375 13 1 137 32 172 6 180 103 319 162 14 252 293 288 375 14 209 333 245 375 +5126 /data/VOCdevkit/VOC2012/JPEGImages/2008_000238.jpg 500 375 5 1 84 479 375 +5127 /data/VOCdevkit/VOC2012/JPEGImages/2008_000239.jpg 500 333 11 120 126 293 308 +5128 /data/VOCdevkit/VOC2012/JPEGImages/2008_000243.jpg 500 334 14 1 1 158 334 14 216 115 445 334 +5129 /data/VOCdevkit/VOC2012/JPEGImages/2008_000244.jpg 500 375 19 55 1 457 375 +5130 /data/VOCdevkit/VOC2012/JPEGImages/2008_000246.jpg 500 375 14 3 21 310 375 8 352 1 500 233 +5131 /data/VOCdevkit/VOC2012/JPEGImages/2008_000251.jpg 500 336 0 24 14 410 245 0 213 53 500 171 0 88 93 220 166 6 1 244 94 310 +5132 /data/VOCdevkit/VOC2012/JPEGImages/2008_000252.jpg 500 375 14 184 58 339 375 14 443 109 471 181 14 165 121 204 197 6 1 130 47 170 5 194 14 500 195 +5133 /data/VOCdevkit/VOC2012/JPEGImages/2008_000253.jpg 338 500 6 255 348 320 383 +5134 /data/VOCdevkit/VOC2012/JPEGImages/2008_000254.jpg 338 500 14 69 289 87 356 14 81 301 96 347 14 93 294 119 353 14 145 296 160 351 14 164 305 186 351 14 190 301 205 345 +5135 /data/VOCdevkit/VOC2012/JPEGImages/2008_000255.jpg 500 338 14 81 284 100 331 +5136 /data/VOCdevkit/VOC2012/JPEGImages/2008_000257.jpg 334 500 16 122 319 145 343 16 253 326 277 350 16 285 329 307 352 16 188 324 215 348 16 73 319 110 343 +5137 /data/VOCdevkit/VOC2012/JPEGImages/2008_000259.jpg 500 375 14 161 144 238 338 14 234 138 293 344 14 369 146 424 278 +5138 /data/VOCdevkit/VOC2012/JPEGImages/2008_000260.jpg 500 331 14 191 101 242 254 6 303 87 500 231 6 1 80 147 222 6 65 107 183 198 +5139 /data/VOCdevkit/VOC2012/JPEGImages/2008_000261.jpg 500 375 14 166 48 370 375 +5140 /data/VOCdevkit/VOC2012/JPEGImages/2008_000262.jpg 500 375 3 23 143 430 330 +5141 /data/VOCdevkit/VOC2012/JPEGImages/2008_000264.jpg 333 500 14 48 36 332 500 +5142 /data/VOCdevkit/VOC2012/JPEGImages/2008_000266.jpg 500 333 14 16 41 165 333 14 77 95 161 333 14 144 57 266 333 14 220 56 292 245 14 250 82 347 327 14 262 53 453 333 +5143 /data/VOCdevkit/VOC2012/JPEGImages/2008_000268.jpg 500 334 11 325 136 491 334 14 170 22 388 316 14 1 1 216 317 +5144 /data/VOCdevkit/VOC2012/JPEGImages/2008_000270.jpg 500 334 14 100 124 358 332 11 307 190 500 334 17 1 89 500 334 14 24 59 251 228 +5145 /data/VOCdevkit/VOC2012/JPEGImages/2008_000271.jpg 500 375 14 266 104 500 375 +5146 /data/VOCdevkit/VOC2012/JPEGImages/2008_000272.jpg 500 375 4 51 197 74 272 +5147 /data/VOCdevkit/VOC2012/JPEGImages/2008_000273.jpg 500 375 11 184 50 443 285 11 1 158 240 319 8 1 1 464 110 8 1 1 223 161 +5148 /data/VOCdevkit/VOC2012/JPEGImages/2008_000274.jpg 500 333 15 83 193 102 239 15 109 225 128 257 15 149 249 173 282 15 185 249 264 308 15 19 179 88 275 15 120 230 191 297 8 46 257 128 333 +5149 /data/VOCdevkit/VOC2012/JPEGImages/2008_000275.jpg 500 375 14 167 187 192 274 14 184 190 202 272 14 197 187 231 280 14 224 187 246 228 14 250 203 272 271 14 322 199 342 269 15 474 15 500 41 15 441 16 472 37 +5150 /data/VOCdevkit/VOC2012/JPEGImages/2008_000277.jpg 500 375 14 305 37 500 374 14 123 184 412 375 14 1 18 214 258 14 144 22 333 243 +5151 /data/VOCdevkit/VOC2012/JPEGImages/2008_000278.jpg 500 375 14 369 94 500 375 14 208 126 388 375 14 1 122 253 375 +5152 /data/VOCdevkit/VOC2012/JPEGImages/2008_000281.jpg 500 455 6 106 377 186 419 6 194 396 283 444 14 413 399 429 444 +5153 /data/VOCdevkit/VOC2012/JPEGImages/2008_000283.jpg 500 333 14 32 95 170 333 14 387 126 436 227 +5154 /data/VOCdevkit/VOC2012/JPEGImages/2008_000284.jpg 500 375 14 121 20 419 375 15 10 1 128 323 +5155 /data/VOCdevkit/VOC2012/JPEGImages/2008_000287.jpg 500 340 15 285 100 426 321 15 3 27 226 303 +5156 /data/VOCdevkit/VOC2012/JPEGImages/2008_000289.jpg 375 500 14 47 149 185 500 +5157 /data/VOCdevkit/VOC2012/JPEGImages/2008_000290.jpg 500 371 14 65 49 390 358 4 389 156 481 371 +5158 /data/VOCdevkit/VOC2012/JPEGImages/2008_000291.jpg 500 333 0 2 196 217 251 0 392 198 439 220 +5159 /data/VOCdevkit/VOC2012/JPEGImages/2008_000297.jpg 500 335 14 2 87 302 296 8 87 205 230 331 8 260 188 372 331 8 5 141 121 293 14 225 113 355 335 +5160 /data/VOCdevkit/VOC2012/JPEGImages/2008_000298.jpg 500 374 14 94 137 319 374 +5161 /data/VOCdevkit/VOC2012/JPEGImages/2008_000304.jpg 500 375 6 59 88 462 251 6 458 152 500 221 6 1 158 25 186 6 1 159 42 183 6 14 156 63 180 +5162 /data/VOCdevkit/VOC2012/JPEGImages/2008_000305.jpg 500 375 8 80 205 193 328 19 308 89 429 160 +5163 /data/VOCdevkit/VOC2012/JPEGImages/2008_000306.jpg 375 500 7 57 65 375 384 +5164 /data/VOCdevkit/VOC2012/JPEGImages/2008_000307.jpg 500 375 14 35 111 135 281 14 121 113 184 279 14 183 113 248 286 14 241 116 307 285 14 301 116 355 286 14 346 105 421 283 +5165 /data/VOCdevkit/VOC2012/JPEGImages/2008_000309.jpg 500 373 19 240 159 413 329 +5166 /data/VOCdevkit/VOC2012/JPEGImages/2008_000311.jpg 500 333 14 240 66 440 306 14 21 74 244 309 14 70 141 105 173 +5167 /data/VOCdevkit/VOC2012/JPEGImages/2008_000313.jpg 500 375 14 73 45 332 375 +5168 /data/VOCdevkit/VOC2012/JPEGImages/2008_000315.jpg 500 375 6 208 209 263 235 6 347 200 384 220 +5169 /data/VOCdevkit/VOC2012/JPEGImages/2008_000316.jpg 500 375 14 75 95 396 375 +5170 /data/VOCdevkit/VOC2012/JPEGImages/2008_000318.jpg 403 500 2 1 79 382 500 +5171 /data/VOCdevkit/VOC2012/JPEGImages/2008_000321.jpg 500 375 17 269 112 476 269 14 305 10 327 49 14 330 8 357 48 +5172 /data/VOCdevkit/VOC2012/JPEGImages/2008_000328.jpg 333 500 14 168 147 333 350 13 151 185 274 439 +5173 /data/VOCdevkit/VOC2012/JPEGImages/2008_000330.jpg 500 375 11 88 59 500 375 14 165 1 500 375 +5174 /data/VOCdevkit/VOC2012/JPEGImages/2008_000335.jpg 500 292 9 93 89 360 260 9 1 93 110 224 +5175 /data/VOCdevkit/VOC2012/JPEGImages/2008_000336.jpg 500 375 11 115 119 317 316 +5176 /data/VOCdevkit/VOC2012/JPEGImages/2008_000338.jpg 500 375 14 338 72 500 375 14 12 56 185 375 10 130 236 342 375 +5177 /data/VOCdevkit/VOC2012/JPEGImages/2008_000339.jpg 332 500 2 32 221 77 304 2 92 297 145 354 2 9 332 68 388 +5178 /data/VOCdevkit/VOC2012/JPEGImages/2008_000340.jpg 333 500 14 1 76 333 500 +5179 /data/VOCdevkit/VOC2012/JPEGImages/2008_000342.jpg 338 500 14 114 258 147 356 +5180 /data/VOCdevkit/VOC2012/JPEGImages/2008_000343.jpg 500 338 14 359 162 410 301 18 1 1 332 338 14 422 180 438 223 +5181 /data/VOCdevkit/VOC2012/JPEGImages/2008_000345.jpg 500 347 7 172 77 500 347 +5182 /data/VOCdevkit/VOC2012/JPEGImages/2008_000346.jpg 500 375 14 123 67 216 309 6 186 130 462 330 6 1 98 133 290 +5183 /data/VOCdevkit/VOC2012/JPEGImages/2008_000348.jpg 500 374 19 185 157 279 265 19 274 82 364 200 +5184 /data/VOCdevkit/VOC2012/JPEGImages/2008_000350.jpg 479 500 2 155 42 479 405 2 14 170 181 500 +5185 /data/VOCdevkit/VOC2012/JPEGImages/2008_000354.jpg 500 333 14 3 39 375 333 14 330 83 500 333 +5186 /data/VOCdevkit/VOC2012/JPEGImages/2008_000356.jpg 500 375 6 141 195 211 241 +5187 /data/VOCdevkit/VOC2012/JPEGImages/2008_000358.jpg 500 310 7 1 42 451 284 +5188 /data/VOCdevkit/VOC2012/JPEGImages/2008_000359.jpg 500 375 14 1 56 214 375 14 141 1 488 375 +5189 /data/VOCdevkit/VOC2012/JPEGImages/2008_000361.jpg 500 334 2 67 62 405 334 +5190 /data/VOCdevkit/VOC2012/JPEGImages/2008_000364.jpg 500 375 14 99 123 275 375 14 219 139 404 370 +5191 /data/VOCdevkit/VOC2012/JPEGImages/2008_000365.jpg 300 225 14 168 129 263 225 +5192 /data/VOCdevkit/VOC2012/JPEGImages/2008_000367.jpg 500 357 14 344 67 500 357 0 1 1 500 357 +5193 /data/VOCdevkit/VOC2012/JPEGImages/2008_000371.jpg 500 333 12 189 129 374 276 14 259 95 305 208 +5194 /data/VOCdevkit/VOC2012/JPEGImages/2008_000373.jpg 500 307 18 1 1 500 303 +5195 /data/VOCdevkit/VOC2012/JPEGImages/2008_000376.jpg 500 333 14 4 1 500 333 14 237 144 362 285 +5196 /data/VOCdevkit/VOC2012/JPEGImages/2008_000378.jpg 500 333 13 15 182 228 333 +5197 /data/VOCdevkit/VOC2012/JPEGImages/2008_000380.jpg 500 375 14 337 208 500 375 14 140 249 325 375 14 26 269 154 375 +5198 /data/VOCdevkit/VOC2012/JPEGImages/2008_000381.jpg 333 500 14 35 208 333 500 8 1 430 72 500 8 70 432 134 500 +5199 /data/VOCdevkit/VOC2012/JPEGImages/2008_000382.jpg 332 500 14 1 97 282 500 +5200 /data/VOCdevkit/VOC2012/JPEGImages/2008_000383.jpg 500 375 14 354 159 500 375 14 332 194 409 372 14 246 159 336 375 14 173 107 261 375 14 72 142 184 375 14 1 133 90 375 19 8 66 106 146 +5201 /data/VOCdevkit/VOC2012/JPEGImages/2008_000391.jpg 500 375 15 1 38 189 315 15 92 238 183 337 15 164 153 297 313 15 278 202 344 306 15 338 107 433 302 +5202 /data/VOCdevkit/VOC2012/JPEGImages/2008_000392.jpg 375 500 14 115 161 226 500 14 282 179 334 388 +5203 /data/VOCdevkit/VOC2012/JPEGImages/2008_000393.jpg 500 333 14 69 94 137 313 14 144 106 208 315 14 221 122 282 317 14 17 110 67 243 14 426 167 460 229 14 430 218 490 320 14 384 162 429 225 14 208 116 241 173 14 267 131 297 195 14 347 150 383 240 13 196 178 355 307 13 274 163 380 293 14 108 91 149 167 14 1 112 25 156 +5204 /data/VOCdevkit/VOC2012/JPEGImages/2008_000397.jpg 375 500 8 1 333 189 500 10 17 284 375 500 8 61 269 216 469 8 150 259 267 443 8 321 257 375 419 +5205 /data/VOCdevkit/VOC2012/JPEGImages/2008_000398.jpg 257 385 14 2 26 158 332 14 112 66 257 385 4 1 272 26 385 +5206 /data/VOCdevkit/VOC2012/JPEGImages/2008_000399.jpg 400 267 6 25 87 378 201 +5207 /data/VOCdevkit/VOC2012/JPEGImages/2008_000400.jpg 500 333 2 216 157 297 234 +5208 /data/VOCdevkit/VOC2012/JPEGImages/2008_000401.jpg 500 375 7 1 65 327 375 +5209 /data/VOCdevkit/VOC2012/JPEGImages/2008_000403.jpg 374 500 14 180 183 228 265 12 178 211 234 295 +5210 /data/VOCdevkit/VOC2012/JPEGImages/2008_000405.jpg 500 195 3 383 102 500 139 3 88 101 383 138 +5211 /data/VOCdevkit/VOC2012/JPEGImages/2008_000406.jpg 500 375 14 159 50 430 375 +5212 /data/VOCdevkit/VOC2012/JPEGImages/2008_000407.jpg 375 500 14 54 151 331 500 14 75 74 286 407 +5213 /data/VOCdevkit/VOC2012/JPEGImages/2008_000408.jpg 500 375 14 75 88 238 278 14 300 125 413 299 14 230 143 275 197 14 179 101 224 170 +5214 /data/VOCdevkit/VOC2012/JPEGImages/2008_000413.jpg 375 500 14 1 1 375 500 +5215 /data/VOCdevkit/VOC2012/JPEGImages/2008_000414.jpg 500 334 3 1 87 385 313 3 316 104 414 144 3 1 90 230 227 +5216 /data/VOCdevkit/VOC2012/JPEGImages/2008_000415.jpg 500 375 14 1 132 255 375 +5217 /data/VOCdevkit/VOC2012/JPEGImages/2008_000416.jpg 375 500 14 69 169 279 499 14 303 169 375 500 +5218 /data/VOCdevkit/VOC2012/JPEGImages/2008_000418.jpg 500 375 14 221 155 274 325 10 341 251 500 344 8 421 264 490 375 8 307 235 385 354 +5219 /data/VOCdevkit/VOC2012/JPEGImages/2008_000419.jpg 500 375 17 1 22 458 375 11 112 78 376 328 +5220 /data/VOCdevkit/VOC2012/JPEGImages/2008_000421.jpg 500 375 14 1 171 308 375 14 61 161 414 375 4 409 128 426 158 17 1 141 446 375 14 156 106 488 375 +5221 /data/VOCdevkit/VOC2012/JPEGImages/2008_000422.jpg 375 500 14 25 36 300 407 +5222 /data/VOCdevkit/VOC2012/JPEGImages/2008_000423.jpg 500 375 14 151 45 422 334 14 301 77 500 337 3 36 261 500 375 +5223 /data/VOCdevkit/VOC2012/JPEGImages/2008_000424.jpg 375 500 14 1 64 375 500 14 329 1 375 133 14 56 11 79 71 14 74 17 100 73 14 231 47 253 89 14 206 18 226 79 14 194 45 208 76 14 113 21 131 70 14 132 27 151 72 14 22 46 42 72 +5224 /data/VOCdevkit/VOC2012/JPEGImages/2008_000426.jpg 500 332 14 25 1 500 332 +5225 /data/VOCdevkit/VOC2012/JPEGImages/2008_000428.jpg 400 253 12 1 43 378 237 +5226 /data/VOCdevkit/VOC2012/JPEGImages/2008_000432.jpg 500 375 14 215 2 446 375 8 36 1 142 200 +5227 /data/VOCdevkit/VOC2012/JPEGImages/2008_000435.jpg 447 335 14 78 36 218 240 14 200 12 389 243 14 164 174 255 246 +5228 /data/VOCdevkit/VOC2012/JPEGImages/2008_000436.jpg 447 335 14 97 66 301 335 +5229 /data/VOCdevkit/VOC2012/JPEGImages/2008_000437.jpg 500 375 3 65 342 151 375 3 99 337 172 364 +5230 /data/VOCdevkit/VOC2012/JPEGImages/2008_000442.jpg 335 447 14 10 24 332 414 14 1 1 315 447 +5231 /data/VOCdevkit/VOC2012/JPEGImages/2008_000443.jpg 335 447 14 35 1 309 409 +5232 /data/VOCdevkit/VOC2012/JPEGImages/2008_000445.jpg 335 447 14 44 139 266 405 +5233 /data/VOCdevkit/VOC2012/JPEGImages/2008_000446.jpg 335 447 14 33 134 197 447 14 196 112 335 447 14 104 171 210 382 +5234 /data/VOCdevkit/VOC2012/JPEGImages/2008_000447.jpg 335 447 14 84 156 260 409 14 59 27 307 447 +5235 /data/VOCdevkit/VOC2012/JPEGImages/2008_000448.jpg 375 500 14 1 16 278 500 14 81 255 347 500 +5236 /data/VOCdevkit/VOC2012/JPEGImages/2008_000452.jpg 500 375 14 36 105 119 375 14 194 109 311 375 14 276 127 349 354 14 356 133 456 363 +5237 /data/VOCdevkit/VOC2012/JPEGImages/2008_000455.jpg 500 333 14 1 1 500 333 +5238 /data/VOCdevkit/VOC2012/JPEGImages/2008_000457.jpg 333 500 6 1 265 47 303 6 44 271 87 297 +5239 /data/VOCdevkit/VOC2012/JPEGImages/2008_000461.jpg 500 375 14 3 8 500 375 14 7 82 137 280 14 3 109 49 222 14 94 79 151 188 14 126 84 186 218 +5240 /data/VOCdevkit/VOC2012/JPEGImages/2008_000464.jpg 500 375 7 164 11 406 334 +5241 /data/VOCdevkit/VOC2012/JPEGImages/2008_000465.jpg 500 333 17 61 155 143 220 17 217 130 355 215 17 148 220 435 333 17 353 161 485 242 15 143 49 180 83 +5242 /data/VOCdevkit/VOC2012/JPEGImages/2008_000466.jpg 500 375 1 40 90 318 257 1 62 90 400 301 +5243 /data/VOCdevkit/VOC2012/JPEGImages/2008_000469.jpg 500 338 14 253 119 288 189 14 407 89 446 184 +5244 /data/VOCdevkit/VOC2012/JPEGImages/2008_000470.jpg 500 332 18 1 1 340 325 +5245 /data/VOCdevkit/VOC2012/JPEGImages/2008_000471.jpg 500 333 3 209 100 337 261 3 326 79 359 112 3 90 83 128 136 3 164 83 197 127 3 194 78 219 121 +5246 /data/VOCdevkit/VOC2012/JPEGImages/2008_000472.jpg 500 333 2 275 65 315 149 +5247 /data/VOCdevkit/VOC2012/JPEGImages/2008_000473.jpg 375 500 14 54 167 189 321 14 1 257 345 438 8 87 301 335 458 +5248 /data/VOCdevkit/VOC2012/JPEGImages/2008_000474.jpg 500 375 14 172 74 432 337 +5249 /data/VOCdevkit/VOC2012/JPEGImages/2008_000475.jpg 333 500 14 23 78 157 467 14 117 82 221 353 14 188 120 291 409 +5250 /data/VOCdevkit/VOC2012/JPEGImages/2008_000480.jpg 500 375 14 150 108 213 289 14 323 123 393 256 14 462 138 482 178 14 479 138 496 184 +5251 /data/VOCdevkit/VOC2012/JPEGImages/2008_000481.jpg 500 375 14 56 40 451 375 +5252 /data/VOCdevkit/VOC2012/JPEGImages/2008_000488.jpg 500 375 6 307 287 486 347 +5253 /data/VOCdevkit/VOC2012/JPEGImages/2008_000489.jpg 500 375 14 111 81 315 375 8 396 208 500 375 +5254 /data/VOCdevkit/VOC2012/JPEGImages/2008_000491.jpg 500 330 15 151 1 308 256 15 185 1 313 290 15 229 1 500 330 +5255 /data/VOCdevkit/VOC2012/JPEGImages/2008_000492.jpg 500 375 14 186 86 322 335 14 1 1 497 375 14 261 1 500 234 +5256 /data/VOCdevkit/VOC2012/JPEGImages/2008_000493.jpg 500 375 14 108 132 251 375 14 177 76 471 375 14 314 161 371 242 17 1 65 500 375 10 327 1 462 120 +5257 /data/VOCdevkit/VOC2012/JPEGImages/2008_000495.jpg 500 375 19 1 53 157 206 8 273 240 500 375 4 401 124 434 179 +5258 /data/VOCdevkit/VOC2012/JPEGImages/2008_000496.jpg 375 500 14 1 56 375 500 +5259 /data/VOCdevkit/VOC2012/JPEGImages/2008_000498.jpg 500 375 8 247 2 335 132 8 321 56 440 196 8 341 29 419 143 +5260 /data/VOCdevkit/VOC2012/JPEGImages/2008_000499.jpg 500 374 12 113 144 339 277 14 226 105 287 221 +5261 /data/VOCdevkit/VOC2012/JPEGImages/2008_000501.jpg 500 375 6 172 313 467 375 +5262 /data/VOCdevkit/VOC2012/JPEGImages/2008_000502.jpg 405 500 7 99 18 397 391 7 38 182 240 483 +5263 /data/VOCdevkit/VOC2012/JPEGImages/2008_000505.jpg 500 375 3 17 81 318 375 +5264 /data/VOCdevkit/VOC2012/JPEGImages/2008_000510.jpg 500 333 14 114 46 319 285 +5265 /data/VOCdevkit/VOC2012/JPEGImages/2008_000511.jpg 500 375 14 235 60 500 375 14 76 105 237 285 +5266 /data/VOCdevkit/VOC2012/JPEGImages/2008_000512.jpg 418 500 2 53 50 352 498 +5267 /data/VOCdevkit/VOC2012/JPEGImages/2008_000514.jpg 500 333 14 37 103 250 333 14 237 105 404 333 14 374 101 500 333 +5268 /data/VOCdevkit/VOC2012/JPEGImages/2008_000515.jpg 500 490 2 142 32 429 477 2 1 1 106 351 +5269 /data/VOCdevkit/VOC2012/JPEGImages/2008_000516.jpg 500 375 14 165 71 378 241 13 205 82 440 347 +5270 /data/VOCdevkit/VOC2012/JPEGImages/2008_000519.jpg 447 335 14 106 57 358 284 +5271 /data/VOCdevkit/VOC2012/JPEGImages/2008_000522.jpg 447 335 14 18 79 447 335 4 299 99 375 197 +5272 /data/VOCdevkit/VOC2012/JPEGImages/2008_000527.jpg 335 447 14 1 48 294 369 +5273 /data/VOCdevkit/VOC2012/JPEGImages/2008_000531.jpg 500 375 1 99 183 203 263 14 106 130 191 257 6 247 156 466 239 +5274 /data/VOCdevkit/VOC2012/JPEGImages/2008_000532.jpg 500 485 2 72 25 469 485 +5275 /data/VOCdevkit/VOC2012/JPEGImages/2008_000533.jpg 500 357 2 233 116 492 268 +5276 /data/VOCdevkit/VOC2012/JPEGImages/2008_000535.jpg 500 333 14 221 16 302 274 14 90 89 179 296 14 157 50 220 277 +5277 /data/VOCdevkit/VOC2012/JPEGImages/2008_000536.jpg 500 458 7 15 3 500 456 +5278 /data/VOCdevkit/VOC2012/JPEGImages/2008_000540.jpg 500 375 14 156 118 402 375 +5279 /data/VOCdevkit/VOC2012/JPEGImages/2008_000541.jpg 500 375 14 1 177 160 375 14 114 177 236 375 14 223 168 370 375 14 299 284 436 375 17 1 169 416 375 +5280 /data/VOCdevkit/VOC2012/JPEGImages/2008_000544.jpg 500 333 14 227 1 488 333 +5281 /data/VOCdevkit/VOC2012/JPEGImages/2008_000545.jpg 500 375 13 252 170 364 243 14 294 137 339 221 +5282 /data/VOCdevkit/VOC2012/JPEGImages/2008_000547.jpg 500 375 14 134 137 181 207 14 383 226 500 375 13 124 168 200 238 +5283 /data/VOCdevkit/VOC2012/JPEGImages/2008_000548.jpg 325 500 14 47 113 196 500 14 179 142 278 500 +5284 /data/VOCdevkit/VOC2012/JPEGImages/2008_000552.jpg 500 333 12 3 77 385 330 14 157 13 304 167 +5285 /data/VOCdevkit/VOC2012/JPEGImages/2008_000553.jpg 413 500 14 1 3 302 470 14 67 298 413 499 14 1 309 287 499 +5286 /data/VOCdevkit/VOC2012/JPEGImages/2008_000558.jpg 500 375 14 315 239 367 375 +5287 /data/VOCdevkit/VOC2012/JPEGImages/2008_000559.jpg 500 375 11 1 1 500 375 +5288 /data/VOCdevkit/VOC2012/JPEGImages/2008_000561.jpg 500 476 14 225 244 426 476 14 16 96 264 476 14 98 3 299 397 14 236 21 390 290 14 319 72 499 465 +5289 /data/VOCdevkit/VOC2012/JPEGImages/2008_000562.jpg 500 375 14 152 87 237 283 14 220 68 348 294 1 132 176 394 350 6 282 134 435 204 +5290 /data/VOCdevkit/VOC2012/JPEGImages/2008_000563.jpg 328 500 6 217 83 328 221 14 60 55 308 482 13 1 240 197 492 +5291 /data/VOCdevkit/VOC2012/JPEGImages/2008_000564.jpg 500 375 15 110 256 238 367 14 385 174 422 256 +5292 /data/VOCdevkit/VOC2012/JPEGImages/2008_000566.jpg 500 375 19 225 218 347 334 19 408 117 500 206 19 280 247 401 360 +5293 /data/VOCdevkit/VOC2012/JPEGImages/2008_000567.jpg 500 318 3 103 51 412 289 +5294 /data/VOCdevkit/VOC2012/JPEGImages/2008_000568.jpg 500 375 14 1 40 294 375 14 360 50 500 375 +5295 /data/VOCdevkit/VOC2012/JPEGImages/2008_000569.jpg 453 500 14 3 1 208 457 14 250 78 327 364 14 322 153 399 300 +5296 /data/VOCdevkit/VOC2012/JPEGImages/2008_000572.jpg 500 375 14 1 1 148 260 8 348 199 500 325 +5297 /data/VOCdevkit/VOC2012/JPEGImages/2008_000573.jpg 500 333 10 1 240 324 332 14 106 61 334 332 14 329 59 490 333 14 1 1 104 254 +5298 /data/VOCdevkit/VOC2012/JPEGImages/2008_000578.jpg 500 375 19 54 192 386 375 14 103 68 270 199 +5299 /data/VOCdevkit/VOC2012/JPEGImages/2008_000579.jpg 500 326 14 58 84 460 326 14 1 27 235 326 +5300 /data/VOCdevkit/VOC2012/JPEGImages/2008_000581.jpg 375 500 7 1 115 262 373 +5301 /data/VOCdevkit/VOC2012/JPEGImages/2008_000583.jpg 500 326 14 213 100 272 300 14 248 88 310 289 6 353 118 411 144 +5302 /data/VOCdevkit/VOC2012/JPEGImages/2008_000584.jpg 500 375 14 177 144 244 342 +5303 /data/VOCdevkit/VOC2012/JPEGImages/2008_000585.jpg 500 375 0 1 5 499 375 +5304 /data/VOCdevkit/VOC2012/JPEGImages/2008_000588.jpg 500 375 14 151 55 393 323 14 33 1 287 338 8 169 45 479 373 8 1 77 188 375 +5305 /data/VOCdevkit/VOC2012/JPEGImages/2008_000589.jpg 500 333 17 118 123 252 210 17 251 122 443 207 17 265 171 475 322 17 1 111 153 192 +5306 /data/VOCdevkit/VOC2012/JPEGImages/2008_000595.jpg 412 500 6 43 358 368 489 +5307 /data/VOCdevkit/VOC2012/JPEGImages/2008_000599.jpg 500 333 14 92 53 294 310 14 168 155 301 314 14 283 144 439 333 6 263 50 339 81 6 27 78 121 114 6 77 65 149 99 +5308 /data/VOCdevkit/VOC2012/JPEGImages/2008_000602.jpg 325 500 12 20 71 293 425 +5309 /data/VOCdevkit/VOC2012/JPEGImages/2008_000605.jpg 375 500 14 1 14 284 498 +5310 /data/VOCdevkit/VOC2012/JPEGImages/2008_000607.jpg 500 333 14 148 23 500 333 +5311 /data/VOCdevkit/VOC2012/JPEGImages/2008_000609.jpg 500 335 14 89 124 200 335 14 323 145 368 264 +5312 /data/VOCdevkit/VOC2012/JPEGImages/2008_000613.jpg 500 375 6 18 69 500 375 14 263 2 297 85 14 201 33 233 63 14 128 32 168 64 14 47 44 82 101 14 20 40 49 94 6 1 59 321 250 +5313 /data/VOCdevkit/VOC2012/JPEGImages/2008_000614.jpg 500 333 14 32 144 257 333 14 216 134 311 333 14 304 160 445 333 +5314 /data/VOCdevkit/VOC2012/JPEGImages/2008_000615.jpg 500 375 14 123 51 287 339 1 50 179 311 375 14 1 111 95 375 +5315 /data/VOCdevkit/VOC2012/JPEGImages/2008_000619.jpg 500 333 7 276 166 351 208 6 82 62 201 105 6 364 77 445 114 +5316 /data/VOCdevkit/VOC2012/JPEGImages/2008_000620.jpg 500 337 14 249 145 349 312 11 205 208 327 337 +5317 /data/VOCdevkit/VOC2012/JPEGImages/2008_000622.jpg 500 375 14 142 87 339 191 +5318 /data/VOCdevkit/VOC2012/JPEGImages/2008_000623.jpg 333 500 14 1 100 333 500 +5319 /data/VOCdevkit/VOC2012/JPEGImages/2008_000626.jpg 375 500 8 73 307 265 500 +5320 /data/VOCdevkit/VOC2012/JPEGImages/2008_000628.jpg 500 333 14 69 1 500 333 +5321 /data/VOCdevkit/VOC2012/JPEGImages/2008_000629.jpg 375 500 14 112 115 375 500 +5322 /data/VOCdevkit/VOC2012/JPEGImages/2008_000630.jpg 273 500 14 92 155 174 411 +5323 /data/VOCdevkit/VOC2012/JPEGImages/2008_000634.jpg 500 375 14 157 110 217 307 14 176 126 209 197 +5324 /data/VOCdevkit/VOC2012/JPEGImages/2008_000636.jpg 320 426 14 62 156 213 426 14 62 14 257 426 17 1 136 320 426 +5325 /data/VOCdevkit/VOC2012/JPEGImages/2008_000640.jpg 320 240 14 75 9 276 240 14 60 141 248 240 +5326 /data/VOCdevkit/VOC2012/JPEGImages/2008_000641.jpg 500 375 7 3 85 231 247 11 162 163 482 356 +5327 /data/VOCdevkit/VOC2012/JPEGImages/2008_000645.jpg 320 240 14 64 19 261 240 +5328 /data/VOCdevkit/VOC2012/JPEGImages/2008_000646.jpg 320 213 14 21 33 288 191 +5329 /data/VOCdevkit/VOC2012/JPEGImages/2008_000647.jpg 500 412 14 73 241 118 378 14 349 121 500 412 +5330 /data/VOCdevkit/VOC2012/JPEGImages/2008_000648.jpg 500 331 14 121 31 374 331 17 55 49 500 331 4 12 118 42 185 +5331 /data/VOCdevkit/VOC2012/JPEGImages/2008_000650.jpg 320 240 14 16 1 293 240 +5332 /data/VOCdevkit/VOC2012/JPEGImages/2008_000652.jpg 320 213 14 1 7 238 210 +5333 /data/VOCdevkit/VOC2012/JPEGImages/2008_000655.jpg 320 480 14 1 233 146 480 14 97 3 320 480 +5334 /data/VOCdevkit/VOC2012/JPEGImages/2008_000656.jpg 320 480 14 1 32 320 480 +5335 /data/VOCdevkit/VOC2012/JPEGImages/2008_000657.jpg 500 375 18 58 99 341 333 +5336 /data/VOCdevkit/VOC2012/JPEGImages/2008_000659.jpg 500 375 6 245 264 270 282 6 285 260 305 277 +5337 /data/VOCdevkit/VOC2012/JPEGImages/2008_000660.jpg 320 213 14 135 10 302 205 7 48 82 117 192 +5338 /data/VOCdevkit/VOC2012/JPEGImages/2008_000661.jpg 500 375 14 2 56 392 260 11 218 93 451 290 11 196 122 279 258 +5339 /data/VOCdevkit/VOC2012/JPEGImages/2008_000662.jpg 500 333 14 82 35 442 294 +5340 /data/VOCdevkit/VOC2012/JPEGImages/2008_000666.jpg 320 213 14 165 85 227 203 +5341 /data/VOCdevkit/VOC2012/JPEGImages/2008_000669.jpg 500 375 16 2 2 442 375 +5342 /data/VOCdevkit/VOC2012/JPEGImages/2008_000670.jpg 384 256 7 67 76 271 168 +5343 /data/VOCdevkit/VOC2012/JPEGImages/2008_000672.jpg 320 213 14 19 1 252 213 +5344 /data/VOCdevkit/VOC2012/JPEGImages/2008_000673.jpg 320 213 14 1 20 271 213 8 70 26 320 213 14 126 83 226 167 +5345 /data/VOCdevkit/VOC2012/JPEGImages/2008_000674.jpg 320 480 14 1 187 271 480 14 1 89 194 447 +5346 /data/VOCdevkit/VOC2012/JPEGImages/2008_000676.jpg 500 483 11 192 107 500 463 11 11 36 277 318 +5347 /data/VOCdevkit/VOC2012/JPEGImages/2008_000677.jpg 500 375 14 63 103 194 375 14 134 102 208 334 14 202 86 299 292 14 298 57 394 286 14 323 88 463 366 4 243 144 262 201 +5348 /data/VOCdevkit/VOC2012/JPEGImages/2008_000678.jpg 375 500 2 17 74 375 497 +5349 /data/VOCdevkit/VOC2012/JPEGImages/2008_000683.jpg 334 500 14 1 284 330 443 14 7 6 334 500 +5350 /data/VOCdevkit/VOC2012/JPEGImages/2008_000689.jpg 500 333 13 29 145 419 329 14 127 71 323 240 14 25 15 104 88 14 84 1 168 73 14 168 1 265 72 14 366 6 483 92 +5351 /data/VOCdevkit/VOC2012/JPEGImages/2008_000690.jpg 375 500 14 74 81 375 500 11 138 1 366 176 8 1 70 375 500 +5352 /data/VOCdevkit/VOC2012/JPEGImages/2008_000691.jpg 375 500 14 1 1 267 500 14 226 218 375 500 4 332 246 375 331 +5353 /data/VOCdevkit/VOC2012/JPEGImages/2008_000694.jpg 500 375 14 239 91 308 221 14 396 102 440 171 14 239 105 431 375 14 60 13 271 375 14 411 86 500 366 +5354 /data/VOCdevkit/VOC2012/JPEGImages/2008_000695.jpg 500 375 14 458 241 500 363 +5355 /data/VOCdevkit/VOC2012/JPEGImages/2008_000696.jpg 500 286 12 208 9 284 226 +5356 /data/VOCdevkit/VOC2012/JPEGImages/2008_000697.jpg 500 375 2 364 141 432 205 +5357 /data/VOCdevkit/VOC2012/JPEGImages/2008_000699.jpg 500 375 14 177 44 239 125 14 180 163 279 287 +5358 /data/VOCdevkit/VOC2012/JPEGImages/2008_000700.jpg 500 375 14 22 70 380 300 +5359 /data/VOCdevkit/VOC2012/JPEGImages/2008_000703.jpg 500 375 4 318 187 329 223 +5360 /data/VOCdevkit/VOC2012/JPEGImages/2008_000704.jpg 500 337 8 87 179 179 282 17 136 173 397 337 14 131 164 327 337 +5361 /data/VOCdevkit/VOC2012/JPEGImages/2008_000705.jpg 500 375 14 170 1 341 375 4 455 232 475 285 4 475 231 497 286 +5362 /data/VOCdevkit/VOC2012/JPEGImages/2008_000706.jpg 480 360 14 111 87 247 360 11 313 211 395 312 +5363 /data/VOCdevkit/VOC2012/JPEGImages/2008_000711.jpg 500 334 9 1 5 294 240 9 328 39 500 265 9 133 177 274 240 9 220 15 418 226 +5364 /data/VOCdevkit/VOC2012/JPEGImages/2008_000714.jpg 500 375 14 211 57 500 375 14 1 14 211 375 14 277 193 333 276 14 242 194 293 328 +5365 /data/VOCdevkit/VOC2012/JPEGImages/2008_000716.jpg 500 278 0 5 82 277 175 0 298 116 483 182 +5366 /data/VOCdevkit/VOC2012/JPEGImages/2008_000719.jpg 500 333 14 121 46 375 333 6 1 162 136 216 6 81 192 137 236 6 132 135 172 154 6 329 142 382 175 6 460 142 500 166 6 429 137 475 155 +5367 /data/VOCdevkit/VOC2012/JPEGImages/2008_000721.jpg 500 375 11 62 4 496 375 +5368 /data/VOCdevkit/VOC2012/JPEGImages/2008_000723.jpg 500 374 14 91 92 253 374 14 228 92 375 374 +5369 /data/VOCdevkit/VOC2012/JPEGImages/2008_000724.jpg 500 375 7 1 1 474 375 +5370 /data/VOCdevkit/VOC2012/JPEGImages/2008_000725.jpg 500 332 14 17 77 109 228 1 110 82 193 240 +5371 /data/VOCdevkit/VOC2012/JPEGImages/2008_000726.jpg 320 240 14 54 37 320 230 +5372 /data/VOCdevkit/VOC2012/JPEGImages/2008_000727.jpg 320 426 14 257 135 315 208 14 138 205 302 420 14 25 22 318 426 +5373 /data/VOCdevkit/VOC2012/JPEGImages/2008_000729.jpg 320 240 14 4 4 295 200 +5374 /data/VOCdevkit/VOC2012/JPEGImages/2008_000731.jpg 320 426 14 36 57 242 400 +5375 /data/VOCdevkit/VOC2012/JPEGImages/2008_000732.jpg 500 338 14 93 112 290 333 14 94 8 385 332 +5376 /data/VOCdevkit/VOC2012/JPEGImages/2008_000733.jpg 320 426 14 79 60 282 402 +5377 /data/VOCdevkit/VOC2012/JPEGImages/2008_000734.jpg 320 457 14 87 67 319 401 14 18 12 281 457 +5378 /data/VOCdevkit/VOC2012/JPEGImages/2008_000737.jpg 320 448 14 7 39 308 411 +5379 /data/VOCdevkit/VOC2012/JPEGImages/2008_000740.jpg 320 480 14 40 10 278 455 +5380 /data/VOCdevkit/VOC2012/JPEGImages/2008_000742.jpg 333 500 14 137 30 313 500 14 23 21 312 500 +5381 /data/VOCdevkit/VOC2012/JPEGImages/2008_000745.jpg 320 480 14 70 16 286 479 +5382 /data/VOCdevkit/VOC2012/JPEGImages/2008_000748.jpg 489 480 14 1 91 202 480 14 174 1 489 480 +5383 /data/VOCdevkit/VOC2012/JPEGImages/2008_000753.jpg 375 500 14 8 123 235 454 +5384 /data/VOCdevkit/VOC2012/JPEGImages/2008_000756.jpg 500 322 0 368 215 476 253 0 1 99 425 265 +5385 /data/VOCdevkit/VOC2012/JPEGImages/2008_000758.jpg 375 500 14 232 194 330 282 +5386 /data/VOCdevkit/VOC2012/JPEGImages/2008_000760.jpg 500 375 8 392 27 500 346 8 1 16 125 326 8 27 1 134 124 8 130 1 247 124 8 247 1 394 121 8 102 20 337 362 +5387 /data/VOCdevkit/VOC2012/JPEGImages/2008_000761.jpg 500 375 11 1 3 377 375 +5388 /data/VOCdevkit/VOC2012/JPEGImages/2008_000764.jpg 375 500 14 90 239 204 487 1 39 331 243 487 +5389 /data/VOCdevkit/VOC2012/JPEGImages/2008_000765.jpg 374 500 12 90 154 283 331 +5390 /data/VOCdevkit/VOC2012/JPEGImages/2008_000769.jpg 500 375 14 188 1 500 360 +5391 /data/VOCdevkit/VOC2012/JPEGImages/2008_000775.jpg 500 375 14 1 118 484 356 +5392 /data/VOCdevkit/VOC2012/JPEGImages/2008_000776.jpg 500 333 14 71 70 298 333 14 393 60 426 151 14 341 81 359 132 14 320 83 335 130 14 309 83 324 129 +5393 /data/VOCdevkit/VOC2012/JPEGImages/2008_000777.jpg 320 387 14 4 36 301 384 +5394 /data/VOCdevkit/VOC2012/JPEGImages/2008_000778.jpg 321 500 14 63 49 266 450 +5395 /data/VOCdevkit/VOC2012/JPEGImages/2008_000780.jpg 500 375 14 62 115 262 375 14 174 110 392 375 +5396 /data/VOCdevkit/VOC2012/JPEGImages/2008_000782.jpg 333 500 13 5 124 254 500 +5397 /data/VOCdevkit/VOC2012/JPEGImages/2008_000783.jpg 500 333 12 234 91 357 300 14 244 17 363 218 +5398 /data/VOCdevkit/VOC2012/JPEGImages/2008_000785.jpg 500 400 2 152 168 403 337 +5399 /data/VOCdevkit/VOC2012/JPEGImages/2008_000787.jpg 500 375 14 9 58 281 375 14 202 37 476 375 4 437 213 500 375 4 1 226 67 375 +5400 /data/VOCdevkit/VOC2012/JPEGImages/2008_000788.jpg 334 500 11 1 77 304 500 +5401 /data/VOCdevkit/VOC2012/JPEGImages/2008_000790.jpg 500 375 15 356 6 475 89 15 168 20 243 88 15 206 259 271 310 15 350 282 391 333 15 29 113 108 208 8 182 111 273 225 15 124 29 242 199 +5402 /data/VOCdevkit/VOC2012/JPEGImages/2008_000792.jpg 384 288 14 204 198 226 250 14 241 199 262 252 14 258 197 277 259 14 294 192 328 268 14 316 195 349 267 14 349 195 374 263 +5403 /data/VOCdevkit/VOC2012/JPEGImages/2008_000793.jpg 500 331 7 53 36 466 331 +5404 /data/VOCdevkit/VOC2012/JPEGImages/2008_000795.jpg 500 332 14 1 82 232 332 14 187 94 323 332 14 291 126 500 331 4 216 291 252 332 +5405 /data/VOCdevkit/VOC2012/JPEGImages/2008_000796.jpg 500 375 14 76 1 500 375 +5406 /data/VOCdevkit/VOC2012/JPEGImages/2008_000798.jpg 500 375 2 192 181 242 236 2 125 186 196 262 2 53 156 130 237 +5407 /data/VOCdevkit/VOC2012/JPEGImages/2008_000801.jpg 375 450 4 262 339 274 372 14 87 104 302 287 14 194 129 247 214 +5408 /data/VOCdevkit/VOC2012/JPEGImages/2008_000803.jpg 500 229 13 432 11 461 64 14 386 54 430 219 14 293 41 345 208 14 319 46 366 205 14 196 28 258 182 14 85 7 136 184 14 41 3 95 155 14 420 78 471 229 1 55 79 90 181 1 164 87 264 177 1 373 115 411 224 1 277 93 332 208 14 433 2 463 63 +5409 /data/VOCdevkit/VOC2012/JPEGImages/2008_000804.jpg 500 375 0 60 98 466 296 +5410 /data/VOCdevkit/VOC2012/JPEGImages/2008_000805.jpg 500 375 0 44 16 481 307 +5411 /data/VOCdevkit/VOC2012/JPEGImages/2008_000806.jpg 500 375 14 250 63 429 362 13 247 185 446 375 +5412 /data/VOCdevkit/VOC2012/JPEGImages/2008_000808.jpg 500 334 11 172 32 360 316 +5413 /data/VOCdevkit/VOC2012/JPEGImages/2008_000811.jpg 500 375 14 313 52 476 352 14 29 49 255 328 13 30 136 268 331 13 312 101 475 360 +5414 /data/VOCdevkit/VOC2012/JPEGImages/2008_000814.jpg 500 374 14 2 86 344 374 14 220 95 500 290 +5415 /data/VOCdevkit/VOC2012/JPEGImages/2008_000815.jpg 500 375 14 5 1 134 351 11 252 223 301 259 +5416 /data/VOCdevkit/VOC2012/JPEGImages/2008_000817.jpg 500 333 8 249 155 293 246 8 207 152 246 228 8 294 163 343 244 10 221 168 328 233 +5417 /data/VOCdevkit/VOC2012/JPEGImages/2008_000824.jpg 500 375 7 82 88 358 318 8 45 55 500 375 +5418 /data/VOCdevkit/VOC2012/JPEGImages/2008_000825.jpg 345 500 14 88 35 321 489 +5419 /data/VOCdevkit/VOC2012/JPEGImages/2008_000828.jpg 500 375 6 1 1 500 375 14 127 104 242 250 +5420 /data/VOCdevkit/VOC2012/JPEGImages/2008_000829.jpg 500 375 14 13 110 213 375 14 149 127 355 375 14 292 61 500 375 11 132 214 249 375 +5421 /data/VOCdevkit/VOC2012/JPEGImages/2008_000832.jpg 500 325 2 58 63 430 301 +5422 /data/VOCdevkit/VOC2012/JPEGImages/2008_000833.jpg 500 375 3 56 26 382 233 6 392 182 500 314 14 266 180 292 229 14 334 183 357 236 14 354 170 382 246 14 208 174 231 235 14 233 175 254 233 +5423 /data/VOCdevkit/VOC2012/JPEGImages/2008_000834.jpg 500 333 14 152 141 205 219 14 329 151 404 215 3 67 193 495 242 +5424 /data/VOCdevkit/VOC2012/JPEGImages/2008_000835.jpg 500 375 14 173 110 408 375 14 412 72 460 170 14 348 85 447 246 14 1 112 120 272 14 90 66 182 217 14 198 72 271 178 14 254 67 288 137 14 282 66 344 114 8 382 231 480 375 10 1 107 404 375 +5425 /data/VOCdevkit/VOC2012/JPEGImages/2008_000837.jpg 327 490 11 1 168 294 490 14 72 1 267 490 +5426 /data/VOCdevkit/VOC2012/JPEGImages/2008_000839.jpg 495 500 7 35 18 426 500 +5427 /data/VOCdevkit/VOC2012/JPEGImages/2008_000841.jpg 500 338 14 1 19 335 338 14 261 23 500 338 +5428 /data/VOCdevkit/VOC2012/JPEGImages/2008_000842.jpg 333 500 14 85 406 106 498 +5429 /data/VOCdevkit/VOC2012/JPEGImages/2008_000844.jpg 367 500 14 77 46 202 464 14 149 178 275 446 +5430 /data/VOCdevkit/VOC2012/JPEGImages/2008_000847.jpg 500 375 7 220 138 377 293 14 35 68 446 375 8 365 219 455 334 +5431 /data/VOCdevkit/VOC2012/JPEGImages/2008_000848.jpg 500 333 2 233 147 279 246 +5432 /data/VOCdevkit/VOC2012/JPEGImages/2008_000851.jpg 500 332 14 177 15 448 332 14 22 23 212 332 4 196 257 237 332 4 35 279 75 332 +5433 /data/VOCdevkit/VOC2012/JPEGImages/2008_000853.jpg 375 500 7 37 345 186 417 +5434 /data/VOCdevkit/VOC2012/JPEGImages/2008_000854.jpg 400 263 14 107 8 162 142 13 76 56 182 143 +5435 /data/VOCdevkit/VOC2012/JPEGImages/2008_000857.jpg 500 375 17 309 131 498 257 15 277 94 360 163 +5436 /data/VOCdevkit/VOC2012/JPEGImages/2008_000858.jpg 500 339 13 12 51 382 328 13 284 16 453 211 +5437 /data/VOCdevkit/VOC2012/JPEGImages/2008_000860.jpg 500 375 7 109 176 401 235 +5438 /data/VOCdevkit/VOC2012/JPEGImages/2008_000861.jpg 500 237 2 88 100 292 194 2 260 28 426 114 +5439 /data/VOCdevkit/VOC2012/JPEGImages/2008_000863.jpg 500 336 11 240 26 387 256 +5440 /data/VOCdevkit/VOC2012/JPEGImages/2008_000864.jpg 500 375 14 87 152 277 352 14 253 163 444 355 +5441 /data/VOCdevkit/VOC2012/JPEGImages/2008_000867.jpg 500 375 14 325 309 389 375 14 172 303 195 375 14 139 300 172 375 +5442 /data/VOCdevkit/VOC2012/JPEGImages/2008_000868.jpg 375 500 14 27 312 55 380 14 210 315 240 388 14 257 316 282 392 14 174 319 196 396 14 152 317 178 387 14 48 318 83 389 14 119 328 148 397 14 13 320 35 387 6 1 312 41 348 +5443 /data/VOCdevkit/VOC2012/JPEGImages/2008_000870.jpg 375 500 14 86 179 314 500 8 1 255 248 500 +5444 /data/VOCdevkit/VOC2012/JPEGImages/2008_000873.jpg 500 375 14 442 135 500 228 14 4 91 37 179 14 16 83 102 184 14 23 24 406 375 +5445 /data/VOCdevkit/VOC2012/JPEGImages/2008_000875.jpg 500 375 14 165 75 364 375 +5446 /data/VOCdevkit/VOC2012/JPEGImages/2008_000876.jpg 500 375 9 1 7 412 375 +5447 /data/VOCdevkit/VOC2012/JPEGImages/2008_000878.jpg 500 379 14 173 125 315 249 14 136 108 219 229 +5448 /data/VOCdevkit/VOC2012/JPEGImages/2008_000880.jpg 500 333 6 1 106 157 171 12 134 126 331 324 14 220 71 294 247 6 353 108 394 124 12 345 121 403 215 14 392 115 411 143 14 406 105 427 142 12 386 134 500 256 14 391 136 436 265 14 438 106 500 219 +5449 /data/VOCdevkit/VOC2012/JPEGImages/2008_000881.jpg 500 375 14 423 151 500 317 14 241 111 358 375 14 87 94 230 375 14 1 131 157 374 +5450 /data/VOCdevkit/VOC2012/JPEGImages/2008_000883.jpg 500 342 0 1 1 500 342 +5451 /data/VOCdevkit/VOC2012/JPEGImages/2008_000884.jpg 500 266 6 171 170 419 251 6 1 169 138 263 +5452 /data/VOCdevkit/VOC2012/JPEGImages/2008_000885.jpg 500 326 4 95 181 125 273 14 49 71 148 245 14 248 115 373 232 14 318 96 500 326 10 1 205 411 326 +5453 /data/VOCdevkit/VOC2012/JPEGImages/2008_000887.jpg 375 500 14 277 181 367 448 14 236 228 251 259 +5454 /data/VOCdevkit/VOC2012/JPEGImages/2008_000897.jpg 350 500 11 247 282 350 343 +5455 /data/VOCdevkit/VOC2012/JPEGImages/2008_000899.jpg 415 500 14 3 1 351 500 +5456 /data/VOCdevkit/VOC2012/JPEGImages/2008_000901.jpg 500 375 11 84 1 415 375 +5457 /data/VOCdevkit/VOC2012/JPEGImages/2008_000902.jpg 500 375 14 1 3 302 375 14 300 12 500 375 14 242 1 355 145 +5458 /data/VOCdevkit/VOC2012/JPEGImages/2008_000904.jpg 500 320 14 222 104 424 320 14 139 15 394 320 14 74 104 236 320 8 1 72 96 306 19 281 10 415 120 6 427 40 500 72 +5459 /data/VOCdevkit/VOC2012/JPEGImages/2008_000905.jpg 500 333 9 57 1 454 333 +5460 /data/VOCdevkit/VOC2012/JPEGImages/2008_000908.jpg 300 199 14 242 100 263 160 14 157 105 177 157 14 138 101 156 155 14 122 99 145 154 14 104 97 123 154 14 92 100 109 156 14 65 99 87 153 14 49 97 65 153 +5461 /data/VOCdevkit/VOC2012/JPEGImages/2008_000910.jpg 500 375 14 216 129 349 375 14 123 152 250 375 +5462 /data/VOCdevkit/VOC2012/JPEGImages/2008_000911.jpg 374 500 4 76 198 147 438 +5463 /data/VOCdevkit/VOC2012/JPEGImages/2008_000912.jpg 338 480 12 16 157 132 249 12 108 26 338 480 +5464 /data/VOCdevkit/VOC2012/JPEGImages/2008_000914.jpg 361 290 8 13 57 267 276 +5465 /data/VOCdevkit/VOC2012/JPEGImages/2008_000915.jpg 500 375 16 214 211 263 278 +5466 /data/VOCdevkit/VOC2012/JPEGImages/2008_000916.jpg 500 375 14 351 179 385 271 14 390 170 421 273 14 445 189 479 269 15 419 145 486 254 18 75 84 408 351 +5467 /data/VOCdevkit/VOC2012/JPEGImages/2008_000917.jpg 500 400 14 51 30 238 381 +5468 /data/VOCdevkit/VOC2012/JPEGImages/2008_000919.jpg 500 375 9 1 1 256 375 +5469 /data/VOCdevkit/VOC2012/JPEGImages/2008_000922.jpg 500 375 14 32 2 373 375 14 449 75 500 267 14 19 128 41 163 +5470 /data/VOCdevkit/VOC2012/JPEGImages/2008_000923.jpg 378 500 15 226 365 377 491 +5471 /data/VOCdevkit/VOC2012/JPEGImages/2008_000924.jpg 500 375 14 104 45 327 375 +5472 /data/VOCdevkit/VOC2012/JPEGImages/2008_000928.jpg 500 375 14 26 26 318 375 14 260 39 485 375 14 404 107 460 194 14 450 118 482 196 +5473 /data/VOCdevkit/VOC2012/JPEGImages/2008_000931.jpg 500 336 11 33 41 434 264 +5474 /data/VOCdevkit/VOC2012/JPEGImages/2008_000934.jpg 500 375 11 132 115 500 375 +5475 /data/VOCdevkit/VOC2012/JPEGImages/2008_000936.jpg 335 447 14 72 98 314 447 8 2 30 335 447 +5476 /data/VOCdevkit/VOC2012/JPEGImages/2008_000939.jpg 500 375 6 1 37 500 263 14 134 26 183 82 +5477 /data/VOCdevkit/VOC2012/JPEGImages/2008_000940.jpg 500 375 14 122 81 372 375 +5478 /data/VOCdevkit/VOC2012/JPEGImages/2008_000941.jpg 500 334 14 1 59 70 334 8 363 232 431 334 8 228 233 264 334 14 157 20 368 334 14 125 6 251 334 +5479 /data/VOCdevkit/VOC2012/JPEGImages/2008_000942.jpg 375 500 14 126 158 266 470 14 46 288 139 462 14 331 142 375 297 +5480 /data/VOCdevkit/VOC2012/JPEGImages/2008_000943.jpg 375 500 11 1 127 343 380 +5481 /data/VOCdevkit/VOC2012/JPEGImages/2008_000944.jpg 500 333 6 37 61 460 277 14 230 69 257 90 6 106 87 236 131 +5482 /data/VOCdevkit/VOC2012/JPEGImages/2008_000950.jpg 500 375 14 69 27 500 375 7 17 63 413 332 +5483 /data/VOCdevkit/VOC2012/JPEGImages/2008_000952.jpg 500 375 6 1 130 96 220 6 1 206 87 375 6 355 266 500 375 6 382 126 500 207 6 261 137 361 212 6 93 140 206 224 +5484 /data/VOCdevkit/VOC2012/JPEGImages/2008_000953.jpg 500 375 14 168 148 232 329 14 154 83 250 200 4 342 1 363 36 6 122 1 233 41 +5485 /data/VOCdevkit/VOC2012/JPEGImages/2008_000956.jpg 500 441 14 55 1 457 441 11 4 10 306 441 11 146 28 457 438 +5486 /data/VOCdevkit/VOC2012/JPEGImages/2008_000957.jpg 500 375 3 72 30 493 330 +5487 /data/VOCdevkit/VOC2012/JPEGImages/2008_000959.jpg 500 375 6 26 78 496 338 14 124 19 160 111 +5488 /data/VOCdevkit/VOC2012/JPEGImages/2008_000960.jpg 333 500 2 58 42 157 418 2 184 117 280 403 15 220 1 333 98 +5489 /data/VOCdevkit/VOC2012/JPEGImages/2008_000964.jpg 500 375 9 1 144 37 196 9 364 194 435 259 9 240 170 329 230 +5490 /data/VOCdevkit/VOC2012/JPEGImages/2008_000965.jpg 500 375 14 246 7 500 375 14 1 51 332 375 +5491 /data/VOCdevkit/VOC2012/JPEGImages/2008_000970.jpg 500 418 14 43 197 121 393 14 106 194 194 391 14 168 196 245 381 14 224 199 295 385 14 292 200 375 383 14 360 201 440 382 +5492 /data/VOCdevkit/VOC2012/JPEGImages/2008_000971.jpg 376 500 14 129 255 159 352 14 153 248 187 347 14 190 261 221 348 +5493 /data/VOCdevkit/VOC2012/JPEGImages/2008_000972.jpg 500 375 14 100 68 500 375 +5494 /data/VOCdevkit/VOC2012/JPEGImages/2008_000973.jpg 500 367 11 141 1 500 367 +5495 /data/VOCdevkit/VOC2012/JPEGImages/2008_000976.jpg 500 375 14 80 104 186 375 14 174 96 278 375 14 268 107 379 375 14 387 222 448 375 8 32 245 92 347 +5496 /data/VOCdevkit/VOC2012/JPEGImages/2008_000979.jpg 500 375 6 50 125 444 315 14 3 47 81 287 14 181 68 235 145 14 278 85 322 127 +5497 /data/VOCdevkit/VOC2012/JPEGImages/2008_000981.jpg 500 375 14 188 1 212 67 13 195 50 471 327 +5498 /data/VOCdevkit/VOC2012/JPEGImages/2008_000982.jpg 500 375 6 410 168 490 271 5 144 70 407 278 14 53 183 80 287 +5499 /data/VOCdevkit/VOC2012/JPEGImages/2008_000984.jpg 500 335 14 270 1 414 331 14 140 2 267 335 14 23 1 165 335 14 76 1 344 335 +5500 /data/VOCdevkit/VOC2012/JPEGImages/2008_000985.jpg 500 375 14 1 8 251 375 14 238 3 474 375 +5501 /data/VOCdevkit/VOC2012/JPEGImages/2008_000987.jpg 500 375 14 312 81 410 375 14 249 64 335 269 14 177 86 253 243 14 85 76 186 259 14 195 213 385 375 14 1 206 203 375 14 237 42 267 116 +5502 /data/VOCdevkit/VOC2012/JPEGImages/2008_000992.jpg 500 333 14 136 6 419 333 +5503 /data/VOCdevkit/VOC2012/JPEGImages/2008_000993.jpg 500 333 14 1 87 280 333 14 271 67 500 333 +5504 /data/VOCdevkit/VOC2012/JPEGImages/2008_000999.jpg 500 375 7 119 116 400 263 +5505 /data/VOCdevkit/VOC2012/JPEGImages/2008_001004.jpg 500 375 7 54 113 388 309 +5506 /data/VOCdevkit/VOC2012/JPEGImages/2008_001007.jpg 500 375 13 95 208 327 375 14 107 138 270 373 6 433 161 488 230 +5507 /data/VOCdevkit/VOC2012/JPEGImages/2008_001009.jpg 360 480 14 57 183 306 480 14 122 59 311 373 +5508 /data/VOCdevkit/VOC2012/JPEGImages/2008_001012.jpg 500 375 14 81 23 418 375 +5509 /data/VOCdevkit/VOC2012/JPEGImages/2008_001013.jpg 375 500 14 1 173 16 314 3 14 75 373 500 14 171 175 258 286 +5510 /data/VOCdevkit/VOC2012/JPEGImages/2008_001018.jpg 500 375 6 423 255 458 272 +5511 /data/VOCdevkit/VOC2012/JPEGImages/2008_001020.jpg 500 375 2 53 77 243 274 +5512 /data/VOCdevkit/VOC2012/JPEGImages/2008_001021.jpg 375 500 19 1 154 176 356 14 95 159 375 500 +5513 /data/VOCdevkit/VOC2012/JPEGImages/2008_001022.jpg 500 359 5 29 17 436 336 14 449 211 475 288 +5514 /data/VOCdevkit/VOC2012/JPEGImages/2008_001023.jpg 500 375 14 251 109 500 374 14 1 31 338 375 +5515 /data/VOCdevkit/VOC2012/JPEGImages/2008_001024.jpg 500 333 14 176 254 207 333 14 138 246 176 333 14 290 245 356 333 +5516 /data/VOCdevkit/VOC2012/JPEGImages/2008_001026.jpg 333 500 14 2 12 320 500 +5517 /data/VOCdevkit/VOC2012/JPEGImages/2008_001028.jpg 500 375 14 353 115 425 342 +5518 /data/VOCdevkit/VOC2012/JPEGImages/2008_001030.jpg 500 375 17 36 205 406 374 +5519 /data/VOCdevkit/VOC2012/JPEGImages/2008_001031.jpg 299 500 14 65 33 157 317 12 60 138 214 500 +5520 /data/VOCdevkit/VOC2012/JPEGImages/2008_001034.jpg 500 336 14 212 101 351 336 14 322 113 438 336 14 266 132 354 336 14 104 113 229 336 +5521 /data/VOCdevkit/VOC2012/JPEGImages/2008_001035.jpg 500 375 14 107 205 133 291 14 137 159 183 247 +5522 /data/VOCdevkit/VOC2012/JPEGImages/2008_001036.jpg 500 333 14 221 44 500 333 14 1 3 246 333 +5523 /data/VOCdevkit/VOC2012/JPEGImages/2008_001039.jpg 500 324 14 332 146 395 322 14 266 146 292 222 14 174 161 202 241 6 227 143 294 197 +5524 /data/VOCdevkit/VOC2012/JPEGImages/2008_001040.jpg 500 375 3 75 120 466 210 +5525 /data/VOCdevkit/VOC2012/JPEGImages/2008_001041.jpg 500 375 3 133 37 332 319 3 299 300 350 328 +5526 /data/VOCdevkit/VOC2012/JPEGImages/2008_001042.jpg 500 375 6 428 274 500 351 6 285 272 469 342 6 210 269 331 332 6 69 263 213 320 6 1 284 62 372 +5527 /data/VOCdevkit/VOC2012/JPEGImages/2008_001046.jpg 500 375 14 102 146 149 295 14 224 156 266 281 14 271 156 318 282 14 324 152 367 281 14 403 149 452 221 14 21 154 62 313 14 187 156 224 291 14 56 156 108 284 8 34 283 119 372 8 117 283 202 375 8 215 279 286 368 8 291 276 359 370 8 394 309 477 375 8 296 313 355 375 8 205 315 293 375 8 94 317 183 375 8 1 315 75 375 8 390 217 441 301 +5528 /data/VOCdevkit/VOC2012/JPEGImages/2008_001047.jpg 500 375 3 124 180 357 291 3 346 159 425 239 3 423 144 500 216 +5529 /data/VOCdevkit/VOC2012/JPEGImages/2008_001048.jpg 500 375 14 1 80 265 375 14 148 145 473 375 +5530 /data/VOCdevkit/VOC2012/JPEGImages/2008_001052.jpg 500 375 14 196 117 347 375 14 96 41 354 373 +5531 /data/VOCdevkit/VOC2012/JPEGImages/2008_001054.jpg 500 333 0 1 55 500 308 14 284 77 331 134 14 237 108 272 154 +5532 /data/VOCdevkit/VOC2012/JPEGImages/2008_001055.jpg 500 375 14 188 77 288 259 14 152 168 280 375 14 404 2 500 157 14 180 50 453 375 +5533 /data/VOCdevkit/VOC2012/JPEGImages/2008_001056.jpg 500 440 3 124 59 232 206 +5534 /data/VOCdevkit/VOC2012/JPEGImages/2008_001057.jpg 333 500 14 98 203 244 500 14 89 128 194 230 14 192 136 303 226 14 1 218 154 500 14 202 198 333 500 +5535 /data/VOCdevkit/VOC2012/JPEGImages/2008_001060.jpg 500 333 14 81 49 500 333 4 13 163 64 258 +5536 /data/VOCdevkit/VOC2012/JPEGImages/2008_001062.jpg 500 375 9 1 107 37 238 9 110 97 264 194 9 250 94 359 183 9 383 96 423 175 9 464 75 500 132 6 100 63 140 94 6 329 55 374 91 6 404 64 438 84 6 440 69 485 83 +5537 /data/VOCdevkit/VOC2012/JPEGImages/2008_001063.jpg 500 375 14 1 63 181 375 14 308 106 458 375 14 134 130 186 375 14 188 140 262 375 14 249 130 330 375 14 437 137 500 375 +5538 /data/VOCdevkit/VOC2012/JPEGImages/2008_001066.jpg 500 375 14 209 106 291 348 14 1 191 32 303 14 71 190 139 306 14 56 189 103 300 +5539 /data/VOCdevkit/VOC2012/JPEGImages/2008_001068.jpg 500 345 12 14 73 290 240 14 99 26 165 154 12 431 118 500 229 +5540 /data/VOCdevkit/VOC2012/JPEGImages/2008_001070.jpg 500 375 11 171 115 326 296 +5541 /data/VOCdevkit/VOC2012/JPEGImages/2008_001071.jpg 500 312 7 1 28 500 274 7 272 164 500 312 +5542 /data/VOCdevkit/VOC2012/JPEGImages/2008_001073.jpg 500 375 14 15 53 266 375 19 262 79 450 265 8 1 222 67 375 +5543 /data/VOCdevkit/VOC2012/JPEGImages/2008_001074.jpg 354 500 14 21 115 280 500 +5544 /data/VOCdevkit/VOC2012/JPEGImages/2008_001075.jpg 375 500 14 1 33 375 500 +5545 /data/VOCdevkit/VOC2012/JPEGImages/2008_001076.jpg 500 375 14 137 84 314 375 +5546 /data/VOCdevkit/VOC2012/JPEGImages/2008_001077.jpg 500 375 10 1 94 500 375 4 359 31 394 139 +5547 /data/VOCdevkit/VOC2012/JPEGImages/2008_001078.jpg 500 375 7 135 100 396 346 15 19 25 122 162 +5548 /data/VOCdevkit/VOC2012/JPEGImages/2008_001080.jpg 333 500 14 286 374 314 449 14 312 380 333 450 +5549 /data/VOCdevkit/VOC2012/JPEGImages/2008_001081.jpg 500 333 14 85 40 427 333 +5550 /data/VOCdevkit/VOC2012/JPEGImages/2008_001083.jpg 500 333 14 204 107 267 168 14 21 138 204 333 14 81 99 136 200 14 348 96 420 254 14 262 99 364 309 8 12 226 182 333 8 264 188 371 332 10 113 170 303 333 +5551 /data/VOCdevkit/VOC2012/JPEGImages/2008_001089.jpg 500 333 14 1 23 500 333 +5552 /data/VOCdevkit/VOC2012/JPEGImages/2008_001090.jpg 375 500 14 195 229 346 417 14 6 174 263 500 +5553 /data/VOCdevkit/VOC2012/JPEGImages/2008_001092.jpg 500 338 14 248 90 421 338 14 62 126 258 338 17 1 99 471 338 +5554 /data/VOCdevkit/VOC2012/JPEGImages/2008_001098.jpg 333 500 14 32 30 259 500 +5555 /data/VOCdevkit/VOC2012/JPEGImages/2008_001099.jpg 500 375 14 1 78 243 375 14 177 85 350 372 14 290 72 497 373 +5556 /data/VOCdevkit/VOC2012/JPEGImages/2008_001104.jpg 500 375 14 247 67 491 375 14 1 130 196 375 6 137 195 272 259 6 119 230 188 281 +5557 /data/VOCdevkit/VOC2012/JPEGImages/2008_001105.jpg 282 500 18 1 69 282 455 +5558 /data/VOCdevkit/VOC2012/JPEGImages/2008_001106.jpg 375 500 14 25 63 247 500 +5559 /data/VOCdevkit/VOC2012/JPEGImages/2008_001111.jpg 375 500 7 12 196 272 443 +5560 /data/VOCdevkit/VOC2012/JPEGImages/2008_001112.jpg 375 500 14 142 164 330 500 12 1 205 201 468 +5561 /data/VOCdevkit/VOC2012/JPEGImages/2008_001113.jpg 500 375 14 331 106 483 375 14 33 63 298 375 +5562 /data/VOCdevkit/VOC2012/JPEGImages/2008_001114.jpg 500 360 18 148 24 442 331 +5563 /data/VOCdevkit/VOC2012/JPEGImages/2008_001115.jpg 500 375 14 230 48 444 375 14 76 16 218 238 +5564 /data/VOCdevkit/VOC2012/JPEGImages/2008_001118.jpg 500 375 18 1 151 314 219 +5565 /data/VOCdevkit/VOC2012/JPEGImages/2008_001119.jpg 500 375 14 84 1 391 375 14 159 81 308 348 13 88 170 394 375 +5566 /data/VOCdevkit/VOC2012/JPEGImages/2008_001120.jpg 500 375 2 225 159 334 227 +5567 /data/VOCdevkit/VOC2012/JPEGImages/2008_001121.jpg 333 500 14 12 18 333 500 +5568 /data/VOCdevkit/VOC2012/JPEGImages/2008_001122.jpg 333 500 14 159 47 322 500 14 1 23 167 500 +5569 /data/VOCdevkit/VOC2012/JPEGImages/2008_001130.jpg 500 375 4 327 215 347 266 19 219 153 313 259 +5570 /data/VOCdevkit/VOC2012/JPEGImages/2008_001133.jpg 500 375 17 1 184 388 347 17 1 265 317 375 8 53 256 162 337 8 1 266 45 351 8 151 247 249 326 8 68 241 179 309 8 1 235 100 286 15 449 113 500 250 +5571 /data/VOCdevkit/VOC2012/JPEGImages/2008_001134.jpg 500 375 14 325 133 500 375 14 1 51 197 375 14 168 89 394 375 +5572 /data/VOCdevkit/VOC2012/JPEGImages/2008_001135.jpg 500 375 3 124 147 449 212 +5573 /data/VOCdevkit/VOC2012/JPEGImages/2008_001136.jpg 500 375 3 72 140 175 225 3 209 139 323 223 3 321 133 452 224 +5574 /data/VOCdevkit/VOC2012/JPEGImages/2008_001137.jpg 375 500 11 105 75 271 387 +5575 /data/VOCdevkit/VOC2012/JPEGImages/2008_001139.jpg 334 500 14 87 22 329 500 +5576 /data/VOCdevkit/VOC2012/JPEGImages/2008_001140.jpg 500 375 14 62 280 93 364 14 263 280 312 353 +5577 /data/VOCdevkit/VOC2012/JPEGImages/2008_001142.jpg 500 375 14 435 249 456 295 6 199 265 222 279 6 12 255 113 316 +5578 /data/VOCdevkit/VOC2012/JPEGImages/2008_001143.jpg 500 334 19 293 161 337 212 8 42 203 181 334 19 320 186 363 253 +5579 /data/VOCdevkit/VOC2012/JPEGImages/2008_001147.jpg 500 334 14 3 36 207 332 14 298 104 498 331 8 17 111 260 331 8 261 144 391 332 +5580 /data/VOCdevkit/VOC2012/JPEGImages/2008_001150.jpg 500 375 13 109 270 208 343 +5581 /data/VOCdevkit/VOC2012/JPEGImages/2008_001154.jpg 394 500 14 1 43 324 500 +5582 /data/VOCdevkit/VOC2012/JPEGImages/2008_001155.jpg 500 375 10 1 253 233 375 +5583 /data/VOCdevkit/VOC2012/JPEGImages/2008_001158.jpg 500 375 13 280 201 397 297 13 108 230 189 271 14 129 208 165 262 14 329 171 381 271 14 277 201 301 272 +5584 /data/VOCdevkit/VOC2012/JPEGImages/2008_001159.jpg 500 375 3 26 94 493 261 3 25 124 90 156 +5585 /data/VOCdevkit/VOC2012/JPEGImages/2008_001160.jpg 500 375 3 42 80 500 174 +5586 /data/VOCdevkit/VOC2012/JPEGImages/2008_001161.jpg 500 333 2 131 245 162 278 2 232 241 271 280 2 357 248 396 287 +5587 /data/VOCdevkit/VOC2012/JPEGImages/2008_001164.jpg 331 500 18 47 12 301 406 +5588 /data/VOCdevkit/VOC2012/JPEGImages/2008_001166.jpg 500 333 14 45 1 252 333 14 230 103 403 333 +5589 /data/VOCdevkit/VOC2012/JPEGImages/2008_001167.jpg 500 365 3 50 53 74 71 3 1 150 464 365 3 77 282 351 365 14 408 76 475 295 +5590 /data/VOCdevkit/VOC2012/JPEGImages/2008_001168.jpg 500 375 13 1 25 490 296 +5591 /data/VOCdevkit/VOC2012/JPEGImages/2008_001169.jpg 500 338 18 3 71 484 300 6 455 229 491 243 +5592 /data/VOCdevkit/VOC2012/JPEGImages/2008_001170.jpg 500 375 14 142 88 417 369 +5593 /data/VOCdevkit/VOC2012/JPEGImages/2008_001171.jpg 500 406 12 14 8 475 405 14 40 101 112 252 +5594 /data/VOCdevkit/VOC2012/JPEGImages/2008_001177.jpg 500 333 14 299 117 345 195 13 214 165 351 270 +5595 /data/VOCdevkit/VOC2012/JPEGImages/2008_001182.jpg 500 374 11 210 144 317 337 14 87 1 258 340 +5596 /data/VOCdevkit/VOC2012/JPEGImages/2008_001183.jpg 500 375 14 234 73 500 375 14 449 139 500 200 14 109 149 285 375 +5597 /data/VOCdevkit/VOC2012/JPEGImages/2008_001185.jpg 500 461 2 12 53 482 402 +5598 /data/VOCdevkit/VOC2012/JPEGImages/2008_001188.jpg 500 333 14 196 123 371 333 +5599 /data/VOCdevkit/VOC2012/JPEGImages/2008_001189.jpg 500 336 14 98 18 324 231 +5600 /data/VOCdevkit/VOC2012/JPEGImages/2008_001190.jpg 500 333 14 131 214 205 288 14 100 1 484 333 +5601 /data/VOCdevkit/VOC2012/JPEGImages/2008_001192.jpg 360 480 14 23 125 310 480 +5602 /data/VOCdevkit/VOC2012/JPEGImages/2008_001194.jpg 375 500 2 85 25 375 458 +5603 /data/VOCdevkit/VOC2012/JPEGImages/2008_001196.jpg 500 343 6 323 117 500 215 14 176 151 195 222 14 198 155 220 219 +5604 /data/VOCdevkit/VOC2012/JPEGImages/2008_001199.jpg 500 375 14 177 85 270 263 14 35 99 259 375 14 340 53 478 375 14 6 60 122 327 4 395 238 420 284 4 235 215 282 307 4 223 178 244 219 +5605 /data/VOCdevkit/VOC2012/JPEGImages/2008_001202.jpg 500 333 3 1 138 409 333 14 220 146 443 306 14 110 122 242 291 14 145 168 249 275 +5606 /data/VOCdevkit/VOC2012/JPEGImages/2008_001203.jpg 500 333 13 432 272 462 324 +5607 /data/VOCdevkit/VOC2012/JPEGImages/2008_001205.jpg 375 500 14 1 171 193 500 14 1 107 375 500 +5608 /data/VOCdevkit/VOC2012/JPEGImages/2008_001206.jpg 500 371 14 53 16 492 371 +5609 /data/VOCdevkit/VOC2012/JPEGImages/2008_001208.jpg 375 500 6 214 432 375 500 +5610 /data/VOCdevkit/VOC2012/JPEGImages/2008_001210.jpg 375 500 7 3 76 293 437 +5611 /data/VOCdevkit/VOC2012/JPEGImages/2008_001215.jpg 500 375 14 72 89 381 307 +5612 /data/VOCdevkit/VOC2012/JPEGImages/2008_001218.jpg 375 500 12 1 1 375 500 +5613 /data/VOCdevkit/VOC2012/JPEGImages/2008_001219.jpg 375 500 14 70 8 303 500 14 298 343 373 500 +5614 /data/VOCdevkit/VOC2012/JPEGImages/2008_001220.jpg 500 371 11 305 20 484 282 11 56 51 500 371 +5615 /data/VOCdevkit/VOC2012/JPEGImages/2008_001221.jpg 500 375 14 136 71 407 374 +5616 /data/VOCdevkit/VOC2012/JPEGImages/2008_001223.jpg 403 500 14 240 78 403 500 14 158 25 321 458 14 26 111 221 396 14 378 91 403 140 4 154 87 237 119 +5617 /data/VOCdevkit/VOC2012/JPEGImages/2008_001225.jpg 500 375 14 146 132 216 283 14 254 138 317 278 14 333 135 407 275 1 130 175 255 289 1 237 187 335 287 1 319 191 427 288 +5618 /data/VOCdevkit/VOC2012/JPEGImages/2008_001226.jpg 500 421 14 4 9 442 421 1 191 23 500 421 +5619 /data/VOCdevkit/VOC2012/JPEGImages/2008_001227.jpg 500 375 14 280 122 396 375 14 1 103 114 375 0 1 132 443 375 +5620 /data/VOCdevkit/VOC2012/JPEGImages/2008_001230.jpg 500 375 14 247 126 358 318 14 76 85 233 312 4 106 279 139 328 4 1 248 39 352 4 156 271 187 359 4 240 275 272 375 10 1 302 500 375 +5621 /data/VOCdevkit/VOC2012/JPEGImages/2008_001231.jpg 500 333 14 215 60 292 209 1 225 110 313 250 +5622 /data/VOCdevkit/VOC2012/JPEGImages/2008_001235.jpg 500 357 14 10 66 77 348 12 130 32 488 315 +5623 /data/VOCdevkit/VOC2012/JPEGImages/2008_001236.jpg 500 375 18 259 88 310 111 +5624 /data/VOCdevkit/VOC2012/JPEGImages/2008_001238.jpg 500 375 11 13 142 296 317 11 284 148 475 220 17 1 92 500 375 +5625 /data/VOCdevkit/VOC2012/JPEGImages/2008_001241.jpg 500 333 14 179 76 375 333 +5626 /data/VOCdevkit/VOC2012/JPEGImages/2008_001245.jpg 500 375 14 54 1 379 375 14 149 103 368 375 +5627 /data/VOCdevkit/VOC2012/JPEGImages/2008_001248.jpg 360 480 14 79 152 174 365 11 142 206 244 362 +5628 /data/VOCdevkit/VOC2012/JPEGImages/2008_001249.jpg 360 480 14 167 122 334 480 +5629 /data/VOCdevkit/VOC2012/JPEGImages/2008_001255.jpg 500 375 14 128 90 500 375 14 40 39 289 375 +5630 /data/VOCdevkit/VOC2012/JPEGImages/2008_001257.jpg 375 500 14 81 50 228 491 +5631 /data/VOCdevkit/VOC2012/JPEGImages/2008_001260.jpg 500 375 3 44 83 473 269 +5632 /data/VOCdevkit/VOC2012/JPEGImages/2008_001262.jpg 500 377 6 37 98 478 362 6 104 33 292 147 +5633 /data/VOCdevkit/VOC2012/JPEGImages/2008_001263.jpg 500 333 14 217 101 453 333 14 1 7 282 333 +5634 /data/VOCdevkit/VOC2012/JPEGImages/2008_001264.jpg 500 375 2 162 156 233 226 +5635 /data/VOCdevkit/VOC2012/JPEGImages/2008_001267.jpg 500 375 7 1 1 452 325 +5636 /data/VOCdevkit/VOC2012/JPEGImages/2008_001271.jpg 500 500 14 15 15 323 485 14 249 17 480 486 +5637 /data/VOCdevkit/VOC2012/JPEGImages/2008_001272.jpg 500 375 14 449 77 500 334 14 318 78 372 174 14 316 115 364 216 14 238 91 362 375 14 102 89 172 279 14 144 90 202 252 +5638 /data/VOCdevkit/VOC2012/JPEGImages/2008_001274.jpg 500 375 6 1 114 485 274 +5639 /data/VOCdevkit/VOC2012/JPEGImages/2008_001275.jpg 500 375 14 357 1 500 375 14 199 123 421 375 14 77 33 339 375 +5640 /data/VOCdevkit/VOC2012/JPEGImages/2008_001278.jpg 400 300 12 71 32 356 300 +5641 /data/VOCdevkit/VOC2012/JPEGImages/2008_001283.jpg 500 375 14 1 1 281 375 15 105 1 254 201 +5642 /data/VOCdevkit/VOC2012/JPEGImages/2008_001284.jpg 500 452 14 287 140 500 452 14 17 14 346 452 14 1 195 96 452 +5643 /data/VOCdevkit/VOC2012/JPEGImages/2008_001285.jpg 500 339 11 49 154 288 294 +5644 /data/VOCdevkit/VOC2012/JPEGImages/2008_001290.jpg 332 500 7 63 41 332 488 +5645 /data/VOCdevkit/VOC2012/JPEGImages/2008_001294.jpg 500 375 14 269 132 345 375 14 35 153 89 349 +5646 /data/VOCdevkit/VOC2012/JPEGImages/2008_001296.jpg 375 500 14 27 92 375 500 +5647 /data/VOCdevkit/VOC2012/JPEGImages/2008_001299.jpg 500 375 14 1 53 389 375 +5648 /data/VOCdevkit/VOC2012/JPEGImages/2008_001301.jpg 500 375 14 263 85 476 375 14 37 49 269 375 +5649 /data/VOCdevkit/VOC2012/JPEGImages/2008_001302.jpg 333 500 14 202 203 245 315 14 104 55 153 118 +5650 /data/VOCdevkit/VOC2012/JPEGImages/2008_001304.jpg 500 375 4 1 256 19 309 4 13 254 34 309 4 26 255 49 309 4 43 254 63 308 4 58 255 76 308 4 73 254 93 308 4 88 253 106 307 4 102 252 120 306 4 116 254 135 307 4 131 252 150 306 4 146 250 165 305 4 162 250 180 304 4 177 251 194 304 4 190 250 209 304 4 206 249 222 304 4 220 249 237 303 4 235 249 253 304 4 313 55 330 99 14 121 75 449 375 14 400 164 500 375 +5651 /data/VOCdevkit/VOC2012/JPEGImages/2008_001306.jpg 333 500 14 92 123 184 294 14 90 230 159 298 14 269 169 333 283 +5652 /data/VOCdevkit/VOC2012/JPEGImages/2008_001307.jpg 375 500 4 93 47 139 156 14 50 2 375 500 +5653 /data/VOCdevkit/VOC2012/JPEGImages/2008_001308.jpg 500 375 14 1 194 500 375 +5654 /data/VOCdevkit/VOC2012/JPEGImages/2008_001310.jpg 500 338 14 232 126 344 338 14 301 182 407 338 14 176 188 286 338 14 1 31 157 338 +5655 /data/VOCdevkit/VOC2012/JPEGImages/2008_001312.jpg 500 375 14 169 71 280 233 14 266 76 371 236 4 462 215 479 264 4 229 195 254 277 4 256 193 280 275 +5656 /data/VOCdevkit/VOC2012/JPEGImages/2008_001314.jpg 375 500 14 232 282 297 445 14 276 258 345 440 +5657 /data/VOCdevkit/VOC2012/JPEGImages/2008_001318.jpg 375 500 14 1 1 375 500 +5658 /data/VOCdevkit/VOC2012/JPEGImages/2008_001320.jpg 480 360 14 163 20 311 311 8 100 210 180 309 +5659 /data/VOCdevkit/VOC2012/JPEGImages/2008_001322.jpg 500 375 14 1 134 216 375 14 199 181 343 375 14 299 126 500 375 +5660 /data/VOCdevkit/VOC2012/JPEGImages/2008_001325.jpg 500 375 14 299 86 498 375 14 1 121 259 375 +5661 /data/VOCdevkit/VOC2012/JPEGImages/2008_001329.jpg 375 500 6 123 194 342 389 14 115 184 160 286 14 35 179 68 267 14 63 190 87 269 14 84 209 107 266 14 108 179 129 263 +5662 /data/VOCdevkit/VOC2012/JPEGImages/2008_001333.jpg 375 500 17 86 1 375 201 14 1 30 367 500 14 176 183 297 308 8 1 91 373 500 4 257 123 275 176 4 235 133 253 182 8 198 374 375 500 +5663 /data/VOCdevkit/VOC2012/JPEGImages/2008_001334.jpg 500 375 6 212 306 331 348 +5664 /data/VOCdevkit/VOC2012/JPEGImages/2008_001335.jpg 500 375 7 29 1 500 375 +5665 /data/VOCdevkit/VOC2012/JPEGImages/2008_001336.jpg 500 372 1 1 1 500 372 +5666 /data/VOCdevkit/VOC2012/JPEGImages/2008_001338.jpg 500 333 14 185 97 290 333 14 266 68 368 333 15 420 91 448 120 8 391 93 422 151 +5667 /data/VOCdevkit/VOC2012/JPEGImages/2008_001340.jpg 334 500 14 6 81 325 498 +5668 /data/VOCdevkit/VOC2012/JPEGImages/2008_001344.jpg 333 500 14 42 41 333 500 +5669 /data/VOCdevkit/VOC2012/JPEGImages/2008_001346.jpg 500 375 14 1 93 255 374 14 223 1 500 375 +5670 /data/VOCdevkit/VOC2012/JPEGImages/2008_001349.jpg 333 500 14 1 66 221 390 14 90 3 333 471 14 225 161 332 500 +5671 /data/VOCdevkit/VOC2012/JPEGImages/2008_001350.jpg 500 344 7 39 36 468 297 +5672 /data/VOCdevkit/VOC2012/JPEGImages/2008_001351.jpg 493 500 2 27 166 391 486 2 56 204 315 439 14 354 19 471 422 14 63 69 199 420 +5673 /data/VOCdevkit/VOC2012/JPEGImages/2008_001353.jpg 375 500 14 253 195 336 445 +5674 /data/VOCdevkit/VOC2012/JPEGImages/2008_001356.jpg 500 400 14 204 124 486 342 +5675 /data/VOCdevkit/VOC2012/JPEGImages/2008_001357.jpg 500 375 7 115 108 406 326 +5676 /data/VOCdevkit/VOC2012/JPEGImages/2008_001358.jpg 500 338 14 288 122 366 202 14 330 113 385 218 +5677 /data/VOCdevkit/VOC2012/JPEGImages/2008_001359.jpg 500 400 9 1 89 463 400 14 324 54 479 400 6 182 102 313 162 +5678 /data/VOCdevkit/VOC2012/JPEGImages/2008_001366.jpg 500 375 14 160 2 439 375 17 138 1 500 375 +5679 /data/VOCdevkit/VOC2012/JPEGImages/2008_001367.jpg 379 500 14 134 151 250 374 +5680 /data/VOCdevkit/VOC2012/JPEGImages/2008_001369.jpg 500 338 14 81 87 267 332 14 116 35 443 337 +5681 /data/VOCdevkit/VOC2012/JPEGImages/2008_001373.jpg 500 375 14 271 117 500 375 14 1 152 162 375 14 197 110 375 375 14 64 123 215 375 +5682 /data/VOCdevkit/VOC2012/JPEGImages/2008_001374.jpg 500 313 7 1 28 492 280 +5683 /data/VOCdevkit/VOC2012/JPEGImages/2008_001375.jpg 500 333 1 275 249 500 333 6 235 122 383 252 14 358 50 500 333 14 9 41 257 333 +5684 /data/VOCdevkit/VOC2012/JPEGImages/2008_001376.jpg 500 333 14 225 50 482 333 14 105 50 146 163 14 129 50 165 154 14 72 38 95 147 14 87 54 108 131 14 431 67 452 107 14 456 70 480 121 14 474 63 492 133 +5685 /data/VOCdevkit/VOC2012/JPEGImages/2008_001379.jpg 500 375 11 131 62 319 360 +5686 /data/VOCdevkit/VOC2012/JPEGImages/2008_001380.jpg 500 375 0 66 18 423 155 +5687 /data/VOCdevkit/VOC2012/JPEGImages/2008_001382.jpg 500 444 14 172 59 334 444 12 101 8 500 444 +5688 /data/VOCdevkit/VOC2012/JPEGImages/2008_001383.jpg 333 500 14 1 107 322 350 14 1 65 218 343 +5689 /data/VOCdevkit/VOC2012/JPEGImages/2008_001385.jpg 500 369 14 29 59 197 369 14 217 67 317 369 14 326 87 428 369 +5690 /data/VOCdevkit/VOC2012/JPEGImages/2008_001387.jpg 500 413 2 126 92 284 228 +5691 /data/VOCdevkit/VOC2012/JPEGImages/2008_001388.jpg 378 500 14 10 37 328 500 +5692 /data/VOCdevkit/VOC2012/JPEGImages/2008_001389.jpg 333 500 3 39 73 290 428 +5693 /data/VOCdevkit/VOC2012/JPEGImages/2008_001390.jpg 500 375 14 320 43 498 295 14 1 136 344 310 17 1 68 500 375 4 457 59 479 126 +5694 /data/VOCdevkit/VOC2012/JPEGImages/2008_001391.jpg 500 389 14 191 17 500 389 +5695 /data/VOCdevkit/VOC2012/JPEGImages/2008_001395.jpg 333 500 14 8 130 333 500 +5696 /data/VOCdevkit/VOC2012/JPEGImages/2008_001399.jpg 500 375 17 1 153 315 375 +5697 /data/VOCdevkit/VOC2012/JPEGImages/2008_001401.jpg 500 375 14 88 47 284 375 14 272 90 500 375 19 370 127 500 240 +5698 /data/VOCdevkit/VOC2012/JPEGImages/2008_001402.jpg 333 500 14 98 149 234 443 1 115 279 243 482 +5699 /data/VOCdevkit/VOC2012/JPEGImages/2008_001404.jpg 333 500 14 111 126 264 500 1 91 267 245 500 +5700 /data/VOCdevkit/VOC2012/JPEGImages/2008_001405.jpg 500 375 4 173 15 270 365 +5701 /data/VOCdevkit/VOC2012/JPEGImages/2008_001406.jpg 500 332 13 1 4 181 191 13 83 1 385 173 13 78 38 466 260 +5702 /data/VOCdevkit/VOC2012/JPEGImages/2008_001408.jpg 500 375 14 242 173 337 375 +5703 /data/VOCdevkit/VOC2012/JPEGImages/2008_001410.jpg 500 375 11 211 139 301 202 11 380 1 409 42 +5704 /data/VOCdevkit/VOC2012/JPEGImages/2008_001413.jpg 500 375 14 65 41 334 375 +5705 /data/VOCdevkit/VOC2012/JPEGImages/2008_001414.jpg 500 416 7 57 31 482 401 +5706 /data/VOCdevkit/VOC2012/JPEGImages/2008_001415.jpg 500 333 2 241 126 292 215 2 79 271 158 333 +5707 /data/VOCdevkit/VOC2012/JPEGImages/2008_001419.jpg 448 336 14 8 168 147 336 14 106 198 255 335 14 225 205 317 336 14 310 202 448 336 +5708 /data/VOCdevkit/VOC2012/JPEGImages/2008_001420.jpg 452 500 11 343 148 393 252 11 118 210 179 362 11 79 129 176 184 11 38 169 102 280 14 265 26 318 179 3 336 1 452 49 +5709 /data/VOCdevkit/VOC2012/JPEGImages/2008_001427.jpg 500 375 14 168 171 346 375 +5710 /data/VOCdevkit/VOC2012/JPEGImages/2008_001428.jpg 500 375 19 39 1 463 356 +5711 /data/VOCdevkit/VOC2012/JPEGImages/2008_001429.jpg 500 333 14 18 11 296 333 +5712 /data/VOCdevkit/VOC2012/JPEGImages/2008_001430.jpg 500 386 11 1 1 500 385 +5713 /data/VOCdevkit/VOC2012/JPEGImages/2008_001431.jpg 375 500 14 26 88 373 500 4 102 249 160 429 4 265 227 324 403 +5714 /data/VOCdevkit/VOC2012/JPEGImages/2008_001432.jpg 500 321 14 295 158 313 199 6 314 146 387 199 +5715 /data/VOCdevkit/VOC2012/JPEGImages/2008_001433.jpg 500 400 7 1 22 264 400 +5716 /data/VOCdevkit/VOC2012/JPEGImages/2008_001434.jpg 500 375 14 173 169 350 370 14 238 160 297 254 8 211 271 346 375 8 1 262 73 365 8 330 194 434 306 10 52 215 284 375 +5717 /data/VOCdevkit/VOC2012/JPEGImages/2008_001436.jpg 500 334 11 140 1 500 324 +5718 /data/VOCdevkit/VOC2012/JPEGImages/2008_001437.jpg 500 375 14 338 159 457 375 14 170 216 267 375 14 1 183 135 375 14 126 185 186 375 14 247 187 343 375 +5719 /data/VOCdevkit/VOC2012/JPEGImages/2008_001439.jpg 500 278 8 7 36 180 268 8 175 37 314 275 8 324 35 491 274 8 70 9 198 200 8 205 6 310 202 8 321 6 433 202 +5720 /data/VOCdevkit/VOC2012/JPEGImages/2008_001440.jpg 333 500 6 205 79 268 116 6 14 67 132 139 14 59 97 309 500 14 5 51 307 500 +5721 /data/VOCdevkit/VOC2012/JPEGImages/2008_001444.jpg 500 375 4 291 198 342 369 14 9 2 500 375 +5722 /data/VOCdevkit/VOC2012/JPEGImages/2008_001445.jpg 500 352 6 65 56 435 320 6 316 54 457 137 6 156 36 250 68 6 85 35 135 66 6 39 30 82 69 +5723 /data/VOCdevkit/VOC2012/JPEGImages/2008_001446.jpg 500 371 6 69 22 447 338 +5724 /data/VOCdevkit/VOC2012/JPEGImages/2008_001448.jpg 500 274 0 332 126 469 169 0 1 89 298 169 +5725 /data/VOCdevkit/VOC2012/JPEGImages/2008_001451.jpg 500 375 14 264 111 321 374 14 221 145 276 346 14 171 140 217 353 14 83 111 225 339 14 143 119 177 336 14 323 189 363 223 10 318 258 498 375 8 95 259 199 374 8 65 281 179 375 15 1 185 89 326 14 203 153 227 307 +5726 /data/VOCdevkit/VOC2012/JPEGImages/2008_001454.jpg 490 500 14 5 1 490 500 +5727 /data/VOCdevkit/VOC2012/JPEGImages/2008_001455.jpg 333 500 14 155 13 333 413 14 3 2 209 404 +5728 /data/VOCdevkit/VOC2012/JPEGImages/2008_001456.jpg 500 177 11 1 12 459 166 +5729 /data/VOCdevkit/VOC2012/JPEGImages/2008_001460.jpg 500 367 15 112 1 493 367 +5730 /data/VOCdevkit/VOC2012/JPEGImages/2008_001461.jpg 500 375 8 439 94 500 228 19 433 74 498 124 17 1 91 189 288 14 107 30 240 254 11 196 178 276 309 +5731 /data/VOCdevkit/VOC2012/JPEGImages/2008_001462.jpg 500 375 14 80 67 208 293 +5732 /data/VOCdevkit/VOC2012/JPEGImages/2008_001464.jpg 333 500 12 153 192 333 390 14 215 176 275 298 14 23 268 53 348 14 84 278 106 359 14 92 282 122 366 14 119 276 151 368 14 318 251 333 285 +5733 /data/VOCdevkit/VOC2012/JPEGImages/2008_001466.jpg 500 375 14 239 82 338 234 14 1 82 148 290 +5734 /data/VOCdevkit/VOC2012/JPEGImages/2008_001467.jpg 425 298 14 36 36 144 253 15 335 1 403 140 8 55 107 151 259 15 229 80 331 141 +5735 /data/VOCdevkit/VOC2012/JPEGImages/2008_001468.jpg 500 375 0 9 120 500 359 +5736 /data/VOCdevkit/VOC2012/JPEGImages/2008_001470.jpg 225 417 14 64 158 104 357 14 105 166 147 357 +5737 /data/VOCdevkit/VOC2012/JPEGImages/2008_001475.jpg 375 500 14 8 142 375 500 +5738 /data/VOCdevkit/VOC2012/JPEGImages/2008_001478.jpg 500 375 11 133 167 411 292 +5739 /data/VOCdevkit/VOC2012/JPEGImages/2008_001479.jpg 500 375 11 88 63 425 369 +5740 /data/VOCdevkit/VOC2012/JPEGImages/2008_001481.jpg 375 500 14 1 110 226 500 14 83 143 277 483 19 296 138 375 259 19 1 134 97 259 +5741 /data/VOCdevkit/VOC2012/JPEGImages/2008_001482.jpg 375 500 14 168 61 300 500 14 75 62 189 500 4 209 287 239 345 +5742 /data/VOCdevkit/VOC2012/JPEGImages/2008_001486.jpg 500 375 4 320 109 364 201 14 83 95 375 375 14 340 109 465 375 14 323 118 391 375 +5743 /data/VOCdevkit/VOC2012/JPEGImages/2008_001488.jpg 500 333 14 156 1 500 333 +5744 /data/VOCdevkit/VOC2012/JPEGImages/2008_001491.jpg 500 333 14 17 73 447 258 +5745 /data/VOCdevkit/VOC2012/JPEGImages/2008_001493.jpg 500 375 14 131 21 262 369 14 245 80 341 368 14 318 53 423 375 14 6 66 157 375 8 434 199 500 375 14 401 72 421 108 +5746 /data/VOCdevkit/VOC2012/JPEGImages/2008_001494.jpg 500 333 14 104 57 243 333 14 160 131 326 333 +5747 /data/VOCdevkit/VOC2012/JPEGImages/2008_001495.jpg 500 237 2 7 8 495 237 +5748 /data/VOCdevkit/VOC2012/JPEGImages/2008_001498.jpg 500 333 11 152 103 372 218 +5749 /data/VOCdevkit/VOC2012/JPEGImages/2008_001500.jpg 335 500 6 223 288 267 322 +5750 /data/VOCdevkit/VOC2012/JPEGImages/2008_001501.jpg 500 366 14 20 135 83 268 14 93 152 132 263 14 146 132 187 261 14 186 134 252 273 14 237 146 312 274 14 285 164 374 277 14 175 180 199 237 14 402 199 430 288 14 422 196 446 283 14 1 163 15 196 14 337 183 356 236 +5751 /data/VOCdevkit/VOC2012/JPEGImages/2008_001503.jpg 500 333 14 150 39 332 270 8 1 44 75 142 +5752 /data/VOCdevkit/VOC2012/JPEGImages/2008_001504.jpg 375 500 14 84 17 270 500 +5753 /data/VOCdevkit/VOC2012/JPEGImages/2008_001510.jpg 500 377 14 61 106 379 377 +5754 /data/VOCdevkit/VOC2012/JPEGImages/2008_001513.jpg 500 375 7 99 104 454 287 +5755 /data/VOCdevkit/VOC2012/JPEGImages/2008_001514.jpg 500 391 2 129 66 391 262 +5756 /data/VOCdevkit/VOC2012/JPEGImages/2008_001516.jpg 500 333 14 250 281 293 314 3 49 1 442 333 +5757 /data/VOCdevkit/VOC2012/JPEGImages/2008_001520.jpg 381 500 14 1 5 381 500 14 100 201 366 500 +5758 /data/VOCdevkit/VOC2012/JPEGImages/2008_001522.jpg 500 375 2 71 291 136 355 2 126 230 245 375 2 214 135 309 372 +5759 /data/VOCdevkit/VOC2012/JPEGImages/2008_001523.jpg 333 500 1 115 244 214 349 14 118 160 198 308 +5760 /data/VOCdevkit/VOC2012/JPEGImages/2008_001525.jpg 500 375 14 184 176 261 335 13 162 218 270 375 13 269 238 500 375 13 355 233 500 375 14 228 171 264 320 +5761 /data/VOCdevkit/VOC2012/JPEGImages/2008_001527.jpg 500 375 14 82 104 386 375 14 234 118 436 340 8 1 11 500 375 +5762 /data/VOCdevkit/VOC2012/JPEGImages/2008_001529.jpg 500 333 3 58 1 500 248 +5763 /data/VOCdevkit/VOC2012/JPEGImages/2008_001531.jpg 500 333 1 77 135 349 300 14 157 16 352 224 +5764 /data/VOCdevkit/VOC2012/JPEGImages/2008_001533.jpg 500 329 14 141 106 207 322 14 218 61 303 318 14 320 72 438 329 6 1 128 155 262 6 288 48 500 329 +5765 /data/VOCdevkit/VOC2012/JPEGImages/2008_001534.jpg 500 332 14 237 17 461 332 14 437 169 500 331 14 83 82 269 332 14 30 176 98 332 +5766 /data/VOCdevkit/VOC2012/JPEGImages/2008_001536.jpg 500 333 14 204 108 343 279 14 64 23 256 333 14 249 19 469 333 +5767 /data/VOCdevkit/VOC2012/JPEGImages/2008_001538.jpg 500 366 14 394 79 491 323 14 217 76 314 323 14 53 125 155 324 +5768 /data/VOCdevkit/VOC2012/JPEGImages/2008_001539.jpg 500 375 14 243 45 405 286 +5769 /data/VOCdevkit/VOC2012/JPEGImages/2008_001540.jpg 500 334 14 167 107 282 321 14 152 89 286 168 14 244 117 332 245 +5770 /data/VOCdevkit/VOC2012/JPEGImages/2008_001541.jpg 500 376 15 39 7 88 75 15 247 223 257 242 6 339 212 370 237 6 307 212 320 224 +5771 /data/VOCdevkit/VOC2012/JPEGImages/2008_001542.jpg 500 370 12 54 55 500 359 +5772 /data/VOCdevkit/VOC2012/JPEGImages/2008_001543.jpg 500 375 6 169 216 258 266 +5773 /data/VOCdevkit/VOC2012/JPEGImages/2008_001544.jpg 500 375 12 206 66 498 375 12 1 1 164 375 +5774 /data/VOCdevkit/VOC2012/JPEGImages/2008_001546.jpg 500 297 0 29 41 495 216 +5775 /data/VOCdevkit/VOC2012/JPEGImages/2008_001547.jpg 492 500 14 221 151 349 395 +5776 /data/VOCdevkit/VOC2012/JPEGImages/2008_001549.jpg 500 375 14 316 127 500 375 14 182 122 332 375 14 117 93 275 375 14 1 97 171 375 +5777 /data/VOCdevkit/VOC2012/JPEGImages/2008_001550.jpg 500 366 11 303 45 455 348 14 47 44 252 366 +5778 /data/VOCdevkit/VOC2012/JPEGImages/2008_001551.jpg 400 500 14 2 99 179 431 14 197 169 265 329 14 244 184 301 342 14 207 255 315 387 +5779 /data/VOCdevkit/VOC2012/JPEGImages/2008_001553.jpg 500 332 14 1 167 55 261 14 243 109 323 312 +5780 /data/VOCdevkit/VOC2012/JPEGImages/2008_001563.jpg 500 375 14 237 59 500 375 14 62 72 365 375 14 87 1 266 196 8 354 120 500 304 8 1 129 78 375 8 1 33 106 204 8 38 101 109 201 8 37 188 115 375 8 194 158 425 375 +5781 /data/VOCdevkit/VOC2012/JPEGImages/2008_001564.jpg 500 322 14 97 51 335 322 +5782 /data/VOCdevkit/VOC2012/JPEGImages/2008_001566.jpg 500 333 1 1 190 149 300 14 19 118 104 270 +5783 /data/VOCdevkit/VOC2012/JPEGImages/2008_001574.jpg 500 340 14 39 63 259 340 14 171 23 370 340 14 303 36 500 340 +5784 /data/VOCdevkit/VOC2012/JPEGImages/2008_001575.jpg 500 374 3 238 99 378 226 +5785 /data/VOCdevkit/VOC2012/JPEGImages/2008_001576.jpg 500 333 19 193 1 373 94 14 125 97 336 333 +5786 /data/VOCdevkit/VOC2012/JPEGImages/2008_001577.jpg 375 500 14 112 28 375 500 +5787 /data/VOCdevkit/VOC2012/JPEGImages/2008_001580.jpg 500 333 3 73 133 434 193 +5788 /data/VOCdevkit/VOC2012/JPEGImages/2008_001582.jpg 448 336 14 161 68 244 336 14 216 93 314 336 +5789 /data/VOCdevkit/VOC2012/JPEGImages/2008_001586.jpg 375 500 6 30 255 76 289 6 88 251 133 291 13 36 270 88 315 +5790 /data/VOCdevkit/VOC2012/JPEGImages/2008_001589.jpg 301 500 14 51 10 293 495 17 7 81 301 414 +5791 /data/VOCdevkit/VOC2012/JPEGImages/2008_001590.jpg 500 375 14 62 1 347 363 +5792 /data/VOCdevkit/VOC2012/JPEGImages/2008_001591.jpg 500 375 14 76 1 258 240 14 168 26 300 206 14 307 41 464 218 14 452 47 486 105 14 408 50 473 156 14 264 39 323 169 14 326 42 357 91 +5793 /data/VOCdevkit/VOC2012/JPEGImages/2008_001592.jpg 500 375 7 178 129 419 294 +5794 /data/VOCdevkit/VOC2012/JPEGImages/2008_001593.jpg 500 375 4 116 54 286 181 14 171 60 488 375 +5795 /data/VOCdevkit/VOC2012/JPEGImages/2008_001594.jpg 500 347 4 5 109 23 148 14 57 47 202 237 14 229 18 376 240 +5796 /data/VOCdevkit/VOC2012/JPEGImages/2008_001596.jpg 500 375 14 53 6 312 375 14 454 73 500 142 14 377 1 453 291 8 288 128 363 236 8 277 140 337 275 +5797 /data/VOCdevkit/VOC2012/JPEGImages/2008_001598.jpg 500 333 14 25 66 382 251 +5798 /data/VOCdevkit/VOC2012/JPEGImages/2008_001601.jpg 500 333 16 119 58 479 312 +5799 /data/VOCdevkit/VOC2012/JPEGImages/2008_001602.jpg 333 500 14 38 63 242 410 +5800 /data/VOCdevkit/VOC2012/JPEGImages/2008_001605.jpg 400 326 14 146 59 251 317 14 72 16 160 279 14 191 16 280 258 +5801 /data/VOCdevkit/VOC2012/JPEGImages/2008_001607.jpg 500 375 14 257 27 500 375 14 66 20 293 334 +5802 /data/VOCdevkit/VOC2012/JPEGImages/2008_001609.jpg 500 375 14 405 95 499 310 14 221 51 438 375 14 17 90 161 365 +5803 /data/VOCdevkit/VOC2012/JPEGImages/2008_001610.jpg 500 375 7 125 124 280 297 +5804 /data/VOCdevkit/VOC2012/JPEGImages/2008_001613.jpg 500 332 14 201 86 310 332 14 118 162 182 313 8 279 200 358 317 8 102 194 177 313 14 10 143 57 184 8 171 218 256 332 14 341 144 368 170 8 1 194 49 281 +5805 /data/VOCdevkit/VOC2012/JPEGImages/2008_001615.jpg 500 375 14 264 52 423 375 +5806 /data/VOCdevkit/VOC2012/JPEGImages/2008_001617.jpg 500 375 14 71 149 126 228 14 384 163 468 284 8 105 239 278 348 8 28 271 107 369 8 358 222 486 346 +5807 /data/VOCdevkit/VOC2012/JPEGImages/2008_001619.jpg 375 500 14 1 217 198 325 14 197 154 375 269 +5808 /data/VOCdevkit/VOC2012/JPEGImages/2008_001620.jpg 500 400 14 371 258 435 400 14 290 262 357 400 14 207 251 279 400 14 161 276 210 400 14 89 246 118 266 3 121 50 164 205 3 263 148 328 210 3 448 184 500 209 3 471 136 500 160 +5809 /data/VOCdevkit/VOC2012/JPEGImages/2008_001622.jpg 435 500 14 2 1 435 500 +5810 /data/VOCdevkit/VOC2012/JPEGImages/2008_001624.jpg 500 375 14 209 52 433 359 8 448 184 500 276 8 1 188 184 267 +5811 /data/VOCdevkit/VOC2012/JPEGImages/2008_001625.jpg 500 375 18 1 1 499 300 +5812 /data/VOCdevkit/VOC2012/JPEGImages/2008_001626.jpg 500 375 1 20 11 439 375 +5813 /data/VOCdevkit/VOC2012/JPEGImages/2008_001629.jpg 500 375 14 171 57 419 375 14 1 138 102 375 +5814 /data/VOCdevkit/VOC2012/JPEGImages/2008_001631.jpg 500 375 6 39 97 95 137 6 398 98 455 127 6 7 95 49 119 14 159 66 200 104 14 246 37 322 153 14 311 50 362 181 14 360 56 409 166 14 470 62 500 189 13 12 85 310 354 14 101 91 116 129 14 13 89 24 129 6 436 101 475 126 +5815 /data/VOCdevkit/VOC2012/JPEGImages/2008_001632.jpg 500 333 6 11 157 468 292 +5816 /data/VOCdevkit/VOC2012/JPEGImages/2008_001636.jpg 500 375 14 322 90 392 191 14 235 110 291 190 14 68 152 198 301 4 273 146 290 188 4 290 147 305 187 8 62 177 165 316 +5817 /data/VOCdevkit/VOC2012/JPEGImages/2008_001638.jpg 500 367 4 338 276 350 314 14 2 12 137 317 14 208 18 344 363 14 375 31 496 327 14 306 35 366 322 14 199 48 254 281 +5818 /data/VOCdevkit/VOC2012/JPEGImages/2008_001640.jpg 500 375 7 159 5 465 200 +5819 /data/VOCdevkit/VOC2012/JPEGImages/2008_001641.jpg 375 500 8 227 278 320 430 19 125 217 202 282 +5820 /data/VOCdevkit/VOC2012/JPEGImages/2008_001643.jpg 500 333 14 1 8 283 333 13 1 126 500 333 +5821 /data/VOCdevkit/VOC2012/JPEGImages/2008_001645.jpg 500 350 14 284 153 489 350 12 1 1 269 350 +5822 /data/VOCdevkit/VOC2012/JPEGImages/2008_001648.jpg 333 500 14 41 32 333 500 +5823 /data/VOCdevkit/VOC2012/JPEGImages/2008_001649.jpg 335 500 3 1 141 268 500 14 133 222 216 321 14 177 217 244 367 +5824 /data/VOCdevkit/VOC2012/JPEGImages/2008_001652.jpg 335 500 14 222 217 335 478 14 287 132 335 224 14 1 187 169 405 14 1 110 149 306 3 1 107 335 500 +5825 /data/VOCdevkit/VOC2012/JPEGImages/2008_001653.jpg 332 500 9 141 294 307 430 +5826 /data/VOCdevkit/VOC2012/JPEGImages/2008_001655.jpg 500 375 14 135 55 353 375 +5827 /data/VOCdevkit/VOC2012/JPEGImages/2008_001659.jpg 500 375 14 1 36 308 375 14 255 51 500 375 +5828 /data/VOCdevkit/VOC2012/JPEGImages/2008_001660.jpg 500 371 17 1 61 500 371 14 1 40 316 371 14 142 102 383 371 11 142 114 233 192 +5829 /data/VOCdevkit/VOC2012/JPEGImages/2008_001661.jpg 500 375 14 152 1 500 375 +5830 /data/VOCdevkit/VOC2012/JPEGImages/2008_001663.jpg 500 334 15 174 145 217 190 +5831 /data/VOCdevkit/VOC2012/JPEGImages/2008_001666.jpg 500 375 8 470 81 500 198 14 83 51 296 375 14 239 61 393 231 14 239 222 332 316 14 285 117 434 291 +5832 /data/VOCdevkit/VOC2012/JPEGImages/2008_001667.jpg 333 500 14 15 64 333 500 14 191 204 310 421 +5833 /data/VOCdevkit/VOC2012/JPEGImages/2008_001668.jpg 333 500 14 52 65 324 500 14 69 131 199 392 +5834 /data/VOCdevkit/VOC2012/JPEGImages/2008_001669.jpg 333 500 14 31 67 142 464 14 169 147 276 266 14 217 125 324 461 14 141 111 263 453 +5835 /data/VOCdevkit/VOC2012/JPEGImages/2008_001670.jpg 375 500 14 253 308 366 467 14 62 173 281 500 14 16 127 99 301 +5836 /data/VOCdevkit/VOC2012/JPEGImages/2008_001673.jpg 500 375 2 201 116 289 257 14 160 71 354 375 8 20 230 173 375 +5837 /data/VOCdevkit/VOC2012/JPEGImages/2008_001676.jpg 496 500 11 1 11 496 500 +5838 /data/VOCdevkit/VOC2012/JPEGImages/2008_001679.jpg 500 498 2 92 98 448 456 +5839 /data/VOCdevkit/VOC2012/JPEGImages/2008_001680.jpg 500 400 14 1 31 192 400 14 121 74 276 400 14 241 59 442 400 14 335 10 500 400 +5840 /data/VOCdevkit/VOC2012/JPEGImages/2008_001681.jpg 500 375 6 217 251 236 263 6 145 249 166 262 6 51 231 95 296 +5841 /data/VOCdevkit/VOC2012/JPEGImages/2008_001682.jpg 500 375 12 148 131 317 302 +5842 /data/VOCdevkit/VOC2012/JPEGImages/2008_001688.jpg 500 375 19 193 111 364 222 15 223 34 299 75 15 40 131 93 175 +5843 /data/VOCdevkit/VOC2012/JPEGImages/2008_001690.jpg 500 375 13 209 190 306 255 13 262 207 390 270 14 296 137 372 267 14 244 131 309 250 14 365 116 389 211 +5844 /data/VOCdevkit/VOC2012/JPEGImages/2008_001691.jpg 500 375 13 89 32 431 360 +5845 /data/VOCdevkit/VOC2012/JPEGImages/2008_001692.jpg 500 483 14 71 102 482 483 +5846 /data/VOCdevkit/VOC2012/JPEGImages/2008_001694.jpg 500 333 8 1 183 89 314 15 426 188 476 233 17 115 162 408 270 +5847 /data/VOCdevkit/VOC2012/JPEGImages/2008_001697.jpg 500 334 14 192 201 226 310 14 255 203 288 319 14 335 208 361 274 14 288 204 325 298 14 438 186 487 317 +5848 /data/VOCdevkit/VOC2012/JPEGImages/2008_001699.jpg 500 375 14 102 17 365 375 14 417 1 500 257 13 87 224 347 373 +5849 /data/VOCdevkit/VOC2012/JPEGImages/2008_001702.jpg 375 500 8 1 1 166 500 14 97 66 299 500 +5850 /data/VOCdevkit/VOC2012/JPEGImages/2008_001704.jpg 500 375 19 1 29 237 258 +5851 /data/VOCdevkit/VOC2012/JPEGImages/2008_001706.jpg 500 375 14 106 93 249 375 4 229 226 245 265 +5852 /data/VOCdevkit/VOC2012/JPEGImages/2008_001708.jpg 500 339 7 1 65 252 301 11 218 111 500 339 +5853 /data/VOCdevkit/VOC2012/JPEGImages/2008_001709.jpg 500 375 14 174 42 393 313 +5854 /data/VOCdevkit/VOC2012/JPEGImages/2008_001710.jpg 500 284 18 29 1 481 219 14 167 110 204 252 14 204 124 244 253 14 253 127 299 261 +5855 /data/VOCdevkit/VOC2012/JPEGImages/2008_001712.jpg 340 500 14 186 277 255 450 +5856 /data/VOCdevkit/VOC2012/JPEGImages/2008_001714.jpg 342 500 14 126 184 215 353 +5857 /data/VOCdevkit/VOC2012/JPEGImages/2008_001715.jpg 500 333 8 111 39 292 333 +5858 /data/VOCdevkit/VOC2012/JPEGImages/2008_001716.jpg 498 288 6 201 128 429 272 +5859 /data/VOCdevkit/VOC2012/JPEGImages/2008_001717.jpg 500 375 6 112 257 202 325 6 65 267 122 295 +5860 /data/VOCdevkit/VOC2012/JPEGImages/2008_001719.jpg 500 241 0 49 21 376 220 +5861 /data/VOCdevkit/VOC2012/JPEGImages/2008_001722.jpg 500 357 14 247 139 290 188 14 272 133 324 178 +5862 /data/VOCdevkit/VOC2012/JPEGImages/2008_001723.jpg 500 375 10 209 262 500 375 10 139 226 311 351 8 228 275 291 375 8 117 230 209 351 8 289 222 328 266 +5863 /data/VOCdevkit/VOC2012/JPEGImages/2008_001724.jpg 333 500 14 127 87 333 500 14 1 162 274 500 14 34 331 231 500 +5864 /data/VOCdevkit/VOC2012/JPEGImages/2008_001727.jpg 500 370 13 303 192 360 244 13 212 180 267 228 14 289 185 353 243 14 189 169 250 225 +5865 /data/VOCdevkit/VOC2012/JPEGImages/2008_001729.jpg 500 344 12 71 94 229 279 14 144 71 188 205 +5866 /data/VOCdevkit/VOC2012/JPEGImages/2008_001730.jpg 500 375 14 44 1 199 375 14 183 109 332 375 +5867 /data/VOCdevkit/VOC2012/JPEGImages/2008_001731.jpg 500 375 14 249 37 367 375 14 256 156 353 375 +5868 /data/VOCdevkit/VOC2012/JPEGImages/2008_001735.jpg 500 402 14 23 19 268 402 14 256 31 491 402 +5869 /data/VOCdevkit/VOC2012/JPEGImages/2008_001736.jpg 348 500 14 34 29 310 498 +5870 /data/VOCdevkit/VOC2012/JPEGImages/2008_001737.jpg 500 333 14 248 69 500 333 14 1 69 224 333 8 129 114 221 333 4 335 246 364 305 4 449 260 493 314 +5871 /data/VOCdevkit/VOC2012/JPEGImages/2008_001741.jpg 500 379 7 6 102 450 292 +5872 /data/VOCdevkit/VOC2012/JPEGImages/2008_001742.jpg 500 375 14 40 99 154 375 +5873 /data/VOCdevkit/VOC2012/JPEGImages/2008_001744.jpg 500 375 4 182 1 320 355 4 75 1 213 305 +5874 /data/VOCdevkit/VOC2012/JPEGImages/2008_001745.jpg 375 500 14 214 80 269 285 14 159 60 239 349 14 77 87 158 405 14 1 52 119 500 +5875 /data/VOCdevkit/VOC2012/JPEGImages/2008_001746.jpg 500 375 6 112 107 182 171 6 384 138 500 249 6 351 104 404 126 6 248 105 278 126 6 84 113 125 145 6 5 117 33 148 14 97 43 266 375 +5876 /data/VOCdevkit/VOC2012/JPEGImages/2008_001750.jpg 500 375 14 1 159 31 268 +5877 /data/VOCdevkit/VOC2012/JPEGImages/2008_001751.jpg 500 375 8 1 139 133 363 8 142 135 244 283 8 287 137 385 298 14 221 89 375 217 +5878 /data/VOCdevkit/VOC2012/JPEGImages/2008_001757.jpg 500 375 14 81 114 267 375 14 209 60 410 375 +5879 /data/VOCdevkit/VOC2012/JPEGImages/2008_001758.jpg 500 375 14 263 124 417 284 14 123 108 279 285 14 1 102 178 375 4 436 198 460 283 14 374 114 424 213 14 443 141 470 198 14 463 151 495 196 10 67 266 500 375 14 126 143 156 180 14 1 103 57 171 14 219 148 250 177 14 258 156 277 186 +5880 /data/VOCdevkit/VOC2012/JPEGImages/2008_001761.jpg 379 500 14 119 23 298 440 +5881 /data/VOCdevkit/VOC2012/JPEGImages/2008_001763.jpg 333 500 14 125 108 181 261 14 85 275 289 500 +5882 /data/VOCdevkit/VOC2012/JPEGImages/2008_001764.jpg 500 375 8 404 160 493 314 14 231 116 383 315 14 188 144 276 313 +5883 /data/VOCdevkit/VOC2012/JPEGImages/2008_001765.jpg 375 500 14 97 151 252 500 14 238 161 320 500 14 291 162 375 500 +5884 /data/VOCdevkit/VOC2012/JPEGImages/2008_001769.jpg 469 500 14 93 97 352 496 +5885 /data/VOCdevkit/VOC2012/JPEGImages/2008_001770.jpg 375 500 2 73 71 361 478 +5886 /data/VOCdevkit/VOC2012/JPEGImages/2008_001772.jpg 500 333 8 86 205 159 333 19 416 173 451 211 8 220 166 286 269 +5887 /data/VOCdevkit/VOC2012/JPEGImages/2008_001773.jpg 500 375 14 309 136 438 246 10 180 209 500 375 14 181 134 328 240 14 104 197 249 315 14 134 182 204 252 8 59 230 223 375 +5888 /data/VOCdevkit/VOC2012/JPEGImages/2008_001774.jpg 500 375 0 219 170 256 203 +5889 /data/VOCdevkit/VOC2012/JPEGImages/2008_001775.jpg 500 337 14 228 84 500 337 14 1 68 260 337 +5890 /data/VOCdevkit/VOC2012/JPEGImages/2008_001781.jpg 468 312 19 336 150 416 218 17 1 202 123 312 +5891 /data/VOCdevkit/VOC2012/JPEGImages/2008_001782.jpg 500 375 14 18 73 53 155 14 398 28 427 95 14 193 179 229 271 14 217 171 306 262 +5892 /data/VOCdevkit/VOC2012/JPEGImages/2008_001783.jpg 333 500 8 38 51 303 446 +5893 /data/VOCdevkit/VOC2012/JPEGImages/2008_001784.jpg 500 375 14 355 74 437 375 14 318 63 379 364 14 257 62 325 355 14 205 72 264 348 14 68 88 139 341 14 144 94 201 270 15 1 93 63 270 +5894 /data/VOCdevkit/VOC2012/JPEGImages/2008_001787.jpg 500 375 17 11 269 500 375 +5895 /data/VOCdevkit/VOC2012/JPEGImages/2008_001789.jpg 500 338 14 304 158 417 338 +5896 /data/VOCdevkit/VOC2012/JPEGImages/2008_001791.jpg 375 500 14 54 313 111 491 1 45 393 112 500 14 121 316 151 391 +5897 /data/VOCdevkit/VOC2012/JPEGImages/2008_001792.jpg 500 375 7 99 165 234 270 7 228 109 376 307 +5898 /data/VOCdevkit/VOC2012/JPEGImages/2008_001796.jpg 500 375 14 38 86 483 375 +5899 /data/VOCdevkit/VOC2012/JPEGImages/2008_001797.jpg 500 375 14 336 210 500 375 11 166 156 306 368 14 72 93 286 375 +5900 /data/VOCdevkit/VOC2012/JPEGImages/2008_001799.jpg 375 500 3 1 1 238 387 3 130 1 375 263 +5901 /data/VOCdevkit/VOC2012/JPEGImages/2008_001801.jpg 500 375 0 1 119 389 234 0 317 145 500 206 +5902 /data/VOCdevkit/VOC2012/JPEGImages/2008_001802.jpg 500 375 14 220 73 415 275 14 158 86 500 364 14 1 74 161 375 +5903 /data/VOCdevkit/VOC2012/JPEGImages/2008_001805.jpg 500 375 0 10 89 500 302 +5904 /data/VOCdevkit/VOC2012/JPEGImages/2008_001806.jpg 500 333 14 113 1 451 333 +5905 /data/VOCdevkit/VOC2012/JPEGImages/2008_001808.jpg 500 375 14 95 68 361 375 +5906 /data/VOCdevkit/VOC2012/JPEGImages/2008_001809.jpg 500 375 8 104 194 210 359 8 202 196 321 371 8 273 185 372 332 8 155 182 261 327 8 288 183 373 307 4 299 154 313 199 10 99 196 367 374 +5907 /data/VOCdevkit/VOC2012/JPEGImages/2008_001810.jpg 500 375 2 14 1 487 310 +5908 /data/VOCdevkit/VOC2012/JPEGImages/2008_001811.jpg 500 333 14 146 56 261 304 14 260 94 334 301 14 329 119 394 299 14 406 184 468 333 14 52 237 76 281 14 84 239 112 298 14 29 240 49 278 14 105 52 179 302 14 460 241 483 314 +5909 /data/VOCdevkit/VOC2012/JPEGImages/2008_001812.jpg 500 375 14 232 127 339 252 +5910 /data/VOCdevkit/VOC2012/JPEGImages/2008_001813.jpg 334 500 1 1 35 334 500 +5911 /data/VOCdevkit/VOC2012/JPEGImages/2008_001814.jpg 500 375 14 262 231 295 341 14 216 179 258 283 +5912 /data/VOCdevkit/VOC2012/JPEGImages/2008_001815.jpg 500 375 19 1 5 214 206 +5913 /data/VOCdevkit/VOC2012/JPEGImages/2008_001816.jpg 500 334 11 170 58 500 317 14 28 2 500 247 +5914 /data/VOCdevkit/VOC2012/JPEGImages/2008_001820.jpg 500 331 5 253 45 500 321 5 1 18 256 329 +5915 /data/VOCdevkit/VOC2012/JPEGImages/2008_001821.jpg 500 375 14 38 65 335 375 +5916 /data/VOCdevkit/VOC2012/JPEGImages/2008_001823.jpg 500 71 3 37 44 103 70 +5917 /data/VOCdevkit/VOC2012/JPEGImages/2008_001825.jpg 500 266 14 352 103 394 192 14 266 133 354 199 14 317 68 342 165 14 382 67 416 174 14 354 64 387 127 14 283 100 320 172 14 286 65 313 128 14 244 113 266 173 14 228 107 246 172 14 33 100 87 199 14 107 129 193 203 14 125 101 181 185 14 163 77 190 172 14 189 72 225 170 14 217 77 253 172 14 89 72 130 180 14 69 68 99 177 +5918 /data/VOCdevkit/VOC2012/JPEGImages/2008_001829.jpg 500 321 2 88 72 263 238 +5919 /data/VOCdevkit/VOC2012/JPEGImages/2008_001830.jpg 500 375 6 288 156 500 334 6 130 150 299 226 6 1 156 51 194 +5920 /data/VOCdevkit/VOC2012/JPEGImages/2008_001832.jpg 500 375 14 54 37 398 375 +5921 /data/VOCdevkit/VOC2012/JPEGImages/2008_001834.jpg 500 375 14 225 204 264 309 14 267 156 313 298 14 210 163 261 222 14 221 157 262 296 14 253 143 285 289 14 155 138 211 306 +5922 /data/VOCdevkit/VOC2012/JPEGImages/2008_001836.jpg 500 403 7 63 167 263 265 +5923 /data/VOCdevkit/VOC2012/JPEGImages/2008_001837.jpg 500 333 14 360 44 479 305 4 364 195 397 328 14 1 163 165 333 14 217 148 423 326 14 113 15 262 326 +5924 /data/VOCdevkit/VOC2012/JPEGImages/2008_001838.jpg 500 375 14 22 107 500 375 14 297 140 500 328 14 297 71 390 199 14 398 67 483 250 17 1 165 500 375 +5925 /data/VOCdevkit/VOC2012/JPEGImages/2008_001841.jpg 500 375 14 61 6 349 375 8 45 133 476 375 +5926 /data/VOCdevkit/VOC2012/JPEGImages/2008_001842.jpg 500 328 14 21 42 161 316 5 127 1 500 328 +5927 /data/VOCdevkit/VOC2012/JPEGImages/2008_001843.jpg 500 375 3 340 208 488 281 3 14 204 209 299 3 225 215 266 229 +5928 /data/VOCdevkit/VOC2012/JPEGImages/2008_001845.jpg 332 500 14 80 57 332 394 +5929 /data/VOCdevkit/VOC2012/JPEGImages/2008_001849.jpg 500 375 3 368 87 402 223 3 424 92 463 228 3 286 146 305 213 3 29 175 297 237 +5930 /data/VOCdevkit/VOC2012/JPEGImages/2008_001850.jpg 500 334 18 1 28 500 334 +5931 /data/VOCdevkit/VOC2012/JPEGImages/2008_001852.jpg 500 375 14 190 38 386 375 +5932 /data/VOCdevkit/VOC2012/JPEGImages/2008_001854.jpg 500 375 11 101 180 317 370 14 1 1 462 375 +5933 /data/VOCdevkit/VOC2012/JPEGImages/2008_001856.jpg 500 333 2 132 59 500 307 14 36 1 500 333 +5934 /data/VOCdevkit/VOC2012/JPEGImages/2008_001858.jpg 500 375 3 216 169 286 226 +5935 /data/VOCdevkit/VOC2012/JPEGImages/2008_001860.jpg 500 333 14 271 129 400 292 14 1 86 98 320 1 1 201 151 333 6 395 235 427 281 +5936 /data/VOCdevkit/VOC2012/JPEGImages/2008_001862.jpg 375 500 15 3 125 100 308 11 138 6 281 210 8 292 28 374 167 +5937 /data/VOCdevkit/VOC2012/JPEGImages/2008_001863.jpg 500 375 14 1 68 227 375 14 252 140 463 325 +5938 /data/VOCdevkit/VOC2012/JPEGImages/2008_001865.jpg 500 375 15 1 1 251 294 15 180 17 324 275 15 301 104 389 253 15 347 124 449 242 15 431 157 471 227 15 432 80 498 199 +5939 /data/VOCdevkit/VOC2012/JPEGImages/2008_001866.jpg 500 333 18 126 25 472 287 +5940 /data/VOCdevkit/VOC2012/JPEGImages/2008_001867.jpg 500 374 6 120 234 500 374 14 107 217 165 374 14 16 220 63 374 14 1 215 18 374 +5941 /data/VOCdevkit/VOC2012/JPEGImages/2008_001869.jpg 500 375 17 343 202 485 329 15 285 203 355 243 +5942 /data/VOCdevkit/VOC2012/JPEGImages/2008_001871.jpg 300 400 11 59 62 258 400 +5943 /data/VOCdevkit/VOC2012/JPEGImages/2008_001872.jpg 500 312 11 105 3 500 312 +5944 /data/VOCdevkit/VOC2012/JPEGImages/2008_001874.jpg 500 375 14 100 68 340 375 +5945 /data/VOCdevkit/VOC2012/JPEGImages/2008_001876.jpg 500 375 7 61 108 400 355 +5946 /data/VOCdevkit/VOC2012/JPEGImages/2008_001880.jpg 492 500 19 11 3 474 491 +5947 /data/VOCdevkit/VOC2012/JPEGImages/2008_001881.jpg 500 375 14 13 1 239 372 14 214 1 491 375 +5948 /data/VOCdevkit/VOC2012/JPEGImages/2008_001882.jpg 375 500 14 142 44 307 469 +5949 /data/VOCdevkit/VOC2012/JPEGImages/2008_001885.jpg 500 375 7 176 46 500 375 +5950 /data/VOCdevkit/VOC2012/JPEGImages/2008_001888.jpg 500 334 14 92 43 282 334 19 302 88 383 199 +5951 /data/VOCdevkit/VOC2012/JPEGImages/2008_001894.jpg 500 375 14 96 137 314 375 +5952 /data/VOCdevkit/VOC2012/JPEGImages/2008_001895.jpg 500 333 11 10 24 338 333 +5953 /data/VOCdevkit/VOC2012/JPEGImages/2008_001896.jpg 500 333 19 404 159 491 259 17 1 174 207 333 +5954 /data/VOCdevkit/VOC2012/JPEGImages/2008_001899.jpg 380 285 14 87 61 272 285 14 218 19 373 285 +5955 /data/VOCdevkit/VOC2012/JPEGImages/2008_001903.jpg 400 300 14 61 54 217 300 14 203 47 355 300 +5956 /data/VOCdevkit/VOC2012/JPEGImages/2008_001905.jpg 375 500 14 154 173 224 437 14 260 185 373 500 18 1 108 255 373 14 221 174 282 489 +5957 /data/VOCdevkit/VOC2012/JPEGImages/2008_001907.jpg 500 402 14 48 26 403 383 14 2 40 81 161 +5958 /data/VOCdevkit/VOC2012/JPEGImages/2008_001908.jpg 500 375 6 190 321 232 335 6 244 312 293 328 +5959 /data/VOCdevkit/VOC2012/JPEGImages/2008_001909.jpg 375 500 14 178 130 370 337 14 1 115 172 500 14 221 160 259 229 14 195 168 226 236 14 174 165 195 219 +5960 /data/VOCdevkit/VOC2012/JPEGImages/2008_001910.jpg 375 500 4 276 210 313 319 14 106 23 375 307 8 1 220 108 320 8 42 188 98 233 +5961 /data/VOCdevkit/VOC2012/JPEGImages/2008_001911.jpg 500 375 14 252 259 280 345 14 192 271 225 357 14 95 208 112 257 14 51 201 69 241 14 14 235 40 262 14 164 231 183 286 14 208 225 232 283 14 220 226 240 272 14 330 212 349 257 14 15 208 35 242 +5962 /data/VOCdevkit/VOC2012/JPEGImages/2008_001914.jpg 500 375 14 1 54 254 375 1 154 265 474 375 14 174 94 435 375 +5963 /data/VOCdevkit/VOC2012/JPEGImages/2008_001919.jpg 500 333 14 69 84 295 333 14 243 103 398 255 14 131 1 327 190 +5964 /data/VOCdevkit/VOC2012/JPEGImages/2008_001920.jpg 500 333 19 143 58 288 189 19 297 48 480 208 +5965 /data/VOCdevkit/VOC2012/JPEGImages/2008_001921.jpg 500 375 11 115 125 363 254 +5966 /data/VOCdevkit/VOC2012/JPEGImages/2008_001926.jpg 500 333 18 1 15 230 305 +5967 /data/VOCdevkit/VOC2012/JPEGImages/2008_001928.jpg 500 375 14 132 171 302 375 14 100 134 365 369 14 88 102 150 167 14 110 128 196 198 14 170 135 226 208 14 1 141 127 363 8 1 248 93 375 4 398 238 420 278 +5968 /data/VOCdevkit/VOC2012/JPEGImages/2008_001929.jpg 500 375 14 447 114 498 245 14 350 103 442 248 14 138 76 257 345 14 79 99 164 374 14 145 99 202 206 14 123 115 176 319 14 34 114 95 375 +5969 /data/VOCdevkit/VOC2012/JPEGImages/2008_001930.jpg 500 375 14 347 97 500 300 14 176 119 389 375 14 1 75 178 375 14 130 67 207 158 +5970 /data/VOCdevkit/VOC2012/JPEGImages/2008_001932.jpg 500 375 14 112 35 458 375 14 1 45 209 375 +5971 /data/VOCdevkit/VOC2012/JPEGImages/2008_001934.jpg 182 250 12 26 23 153 223 +5972 /data/VOCdevkit/VOC2012/JPEGImages/2008_001937.jpg 375 500 14 65 21 375 500 +5973 /data/VOCdevkit/VOC2012/JPEGImages/2008_001941.jpg 500 375 6 96 1 500 363 +5974 /data/VOCdevkit/VOC2012/JPEGImages/2008_001945.jpg 500 333 3 178 176 228 221 +5975 /data/VOCdevkit/VOC2012/JPEGImages/2008_001946.jpg 500 375 14 130 1 500 375 +5976 /data/VOCdevkit/VOC2012/JPEGImages/2008_001947.jpg 375 500 14 97 1 328 500 +5977 /data/VOCdevkit/VOC2012/JPEGImages/2008_001951.jpg 500 375 14 178 69 406 375 +5978 /data/VOCdevkit/VOC2012/JPEGImages/2008_001955.jpg 500 375 14 1 39 500 375 +5979 /data/VOCdevkit/VOC2012/JPEGImages/2008_001956.jpg 500 147 18 13 3 500 141 +5980 /data/VOCdevkit/VOC2012/JPEGImages/2008_001957.jpg 500 333 4 104 74 196 120 14 1 34 298 333 14 350 93 500 333 +5981 /data/VOCdevkit/VOC2012/JPEGImages/2008_001958.jpg 375 500 14 1 92 235 500 14 140 251 375 500 +5982 /data/VOCdevkit/VOC2012/JPEGImages/2008_001961.jpg 500 375 6 150 187 253 241 6 393 174 500 243 6 175 163 470 252 +5983 /data/VOCdevkit/VOC2012/JPEGImages/2008_001965.jpg 345 480 14 203 53 269 144 11 1 128 109 392 +5984 /data/VOCdevkit/VOC2012/JPEGImages/2008_001966.jpg 333 500 2 15 165 234 333 15 1 278 168 494 +5985 /data/VOCdevkit/VOC2012/JPEGImages/2008_001967.jpg 500 333 14 1 95 500 333 14 135 143 278 288 14 13 39 61 99 14 10 13 54 78 +5986 /data/VOCdevkit/VOC2012/JPEGImages/2008_001969.jpg 332 500 14 274 212 317 323 14 227 215 273 324 14 187 212 224 324 14 139 227 176 328 14 69 215 98 332 14 17 213 63 334 14 70 170 155 377 14 1 217 19 335 +5987 /data/VOCdevkit/VOC2012/JPEGImages/2008_001970.jpg 500 375 14 229 166 422 375 3 328 136 432 205 +5988 /data/VOCdevkit/VOC2012/JPEGImages/2008_001971.jpg 500 335 0 132 125 395 194 +5989 /data/VOCdevkit/VOC2012/JPEGImages/2008_001977.jpg 500 333 3 1 73 78 222 14 117 62 176 266 14 190 47 294 325 14 240 38 294 262 14 370 59 450 264 3 275 1 500 239 +5990 /data/VOCdevkit/VOC2012/JPEGImages/2008_001978.jpg 500 375 2 266 172 290 197 +5991 /data/VOCdevkit/VOC2012/JPEGImages/2008_001979.jpg 500 333 14 379 170 399 222 14 351 166 374 221 +5992 /data/VOCdevkit/VOC2012/JPEGImages/2008_001980.jpg 312 390 14 37 1 292 390 7 26 117 303 390 +5993 /data/VOCdevkit/VOC2012/JPEGImages/2008_001982.jpg 500 375 14 1 1 500 375 +5994 /data/VOCdevkit/VOC2012/JPEGImages/2008_001985.jpg 500 333 0 187 102 222 114 +5995 /data/VOCdevkit/VOC2012/JPEGImages/2008_001986.jpg 300 500 1 49 241 286 379 14 69 190 236 354 14 192 1 276 151 14 91 1 183 151 14 30 6 105 186 +5996 /data/VOCdevkit/VOC2012/JPEGImages/2008_001987.jpg 500 375 3 67 235 269 293 3 123 204 201 254 +5997 /data/VOCdevkit/VOC2012/JPEGImages/2008_001989.jpg 424 480 14 5 22 424 480 +5998 /data/VOCdevkit/VOC2012/JPEGImages/2008_001992.jpg 500 333 14 152 89 391 333 12 65 1 305 234 +5999 /data/VOCdevkit/VOC2012/JPEGImages/2008_001997.jpg 500 375 19 358 47 452 145 8 320 156 500 375 19 8 127 85 259 8 148 165 309 375 +6000 /data/VOCdevkit/VOC2012/JPEGImages/2008_001998.jpg 500 333 14 21 35 189 282 14 173 61 394 306 14 351 52 488 322 +6001 /data/VOCdevkit/VOC2012/JPEGImages/2008_002000.jpg 500 375 0 33 84 457 294 0 420 165 483 199 +6002 /data/VOCdevkit/VOC2012/JPEGImages/2008_002001.jpg 500 375 14 69 46 416 375 +6003 /data/VOCdevkit/VOC2012/JPEGImages/2008_002002.jpg 480 360 4 110 227 148 344 4 169 229 204 324 14 120 87 338 360 +6004 /data/VOCdevkit/VOC2012/JPEGImages/2008_002003.jpg 500 375 14 1 1 224 375 11 177 76 292 227 +6005 /data/VOCdevkit/VOC2012/JPEGImages/2008_002004.jpg 375 500 7 3 11 375 467 +6006 /data/VOCdevkit/VOC2012/JPEGImages/2008_002005.jpg 500 375 4 259 26 342 335 4 191 19 267 305 4 59 151 79 228 4 78 154 97 228 4 93 136 118 173 4 66 134 94 174 +6007 /data/VOCdevkit/VOC2012/JPEGImages/2008_002007.jpg 360 270 14 138 45 281 270 +6008 /data/VOCdevkit/VOC2012/JPEGImages/2008_002009.jpg 500 375 14 139 161 328 375 14 194 150 320 375 14 409 46 449 156 +6009 /data/VOCdevkit/VOC2012/JPEGImages/2008_002011.jpg 480 360 14 1 1 428 360 +6010 /data/VOCdevkit/VOC2012/JPEGImages/2008_002013.jpg 500 331 14 40 1 425 331 +6011 /data/VOCdevkit/VOC2012/JPEGImages/2008_002017.jpg 374 500 14 70 16 200 474 14 29 94 154 478 +6012 /data/VOCdevkit/VOC2012/JPEGImages/2008_002021.jpg 329 500 14 1 168 191 500 +6013 /data/VOCdevkit/VOC2012/JPEGImages/2008_002023.jpg 500 333 14 45 42 388 333 14 438 133 500 306 +6014 /data/VOCdevkit/VOC2012/JPEGImages/2008_002026.jpg 500 375 8 148 216 275 363 15 1 56 142 307 15 1 275 145 375 +6015 /data/VOCdevkit/VOC2012/JPEGImages/2008_002031.jpg 320 240 14 140 40 226 240 +6016 /data/VOCdevkit/VOC2012/JPEGImages/2008_002032.jpg 500 375 14 1 1 107 375 14 275 70 446 308 14 256 37 324 158 14 176 120 270 249 14 87 103 211 220 14 76 108 160 205 10 32 198 500 375 +6017 /data/VOCdevkit/VOC2012/JPEGImages/2008_002033.jpg 375 500 11 131 91 222 237 +6018 /data/VOCdevkit/VOC2012/JPEGImages/2008_002035.jpg 500 333 14 53 47 250 333 +6019 /data/VOCdevkit/VOC2012/JPEGImages/2008_002036.jpg 500 375 11 223 161 259 191 14 66 122 283 375 +6020 /data/VOCdevkit/VOC2012/JPEGImages/2008_002037.jpg 500 375 14 370 223 428 272 14 142 17 313 237 14 345 217 376 262 11 354 188 365 216 +6021 /data/VOCdevkit/VOC2012/JPEGImages/2008_002039.jpg 500 375 14 309 90 397 346 14 378 99 467 316 +6022 /data/VOCdevkit/VOC2012/JPEGImages/2008_002042.jpg 500 333 14 91 133 136 250 14 148 127 211 328 14 287 119 324 263 +6023 /data/VOCdevkit/VOC2012/JPEGImages/2008_002043.jpg 500 275 2 96 17 495 205 +6024 /data/VOCdevkit/VOC2012/JPEGImages/2008_002045.jpg 500 366 7 1 16 352 272 7 130 139 500 366 +6025 /data/VOCdevkit/VOC2012/JPEGImages/2008_002046.jpg 500 367 3 1 1 500 367 +6026 /data/VOCdevkit/VOC2012/JPEGImages/2008_002047.jpg 500 375 14 229 89 500 375 14 43 127 288 375 13 88 204 128 232 14 440 194 474 276 14 406 183 441 274 14 62 187 76 217 +6027 /data/VOCdevkit/VOC2012/JPEGImages/2008_002052.jpg 375 500 14 64 123 284 500 +6028 /data/VOCdevkit/VOC2012/JPEGImages/2008_002056.jpg 500 375 14 1 1 500 375 +6029 /data/VOCdevkit/VOC2012/JPEGImages/2008_002058.jpg 500 333 14 136 3 438 236 +6030 /data/VOCdevkit/VOC2012/JPEGImages/2008_002061.jpg 500 375 14 456 3 500 375 14 175 81 326 375 16 191 226 322 375 +6031 /data/VOCdevkit/VOC2012/JPEGImages/2008_002062.jpg 500 333 6 1 20 404 331 6 220 1 473 83 +6032 /data/VOCdevkit/VOC2012/JPEGImages/2008_002064.jpg 500 374 2 173 176 328 285 +6033 /data/VOCdevkit/VOC2012/JPEGImages/2008_002066.jpg 500 377 19 84 93 386 377 +6034 /data/VOCdevkit/VOC2012/JPEGImages/2008_002067.jpg 500 375 14 153 11 483 375 7 186 192 338 375 14 1 1 225 374 +6035 /data/VOCdevkit/VOC2012/JPEGImages/2008_002069.jpg 500 375 14 1 80 301 375 14 178 64 500 375 +6036 /data/VOCdevkit/VOC2012/JPEGImages/2008_002071.jpg 500 333 8 257 127 394 297 8 81 184 264 333 +6037 /data/VOCdevkit/VOC2012/JPEGImages/2008_002073.jpg 500 376 2 278 103 386 248 +6038 /data/VOCdevkit/VOC2012/JPEGImages/2008_002079.jpg 500 375 10 120 200 403 375 4 225 164 243 209 14 304 113 416 274 14 378 147 451 321 14 419 148 500 375 14 1 162 126 375 14 46 114 161 350 14 87 121 173 268 14 261 33 299 197 14 311 39 371 116 14 274 28 321 94 14 405 76 439 126 +6039 /data/VOCdevkit/VOC2012/JPEGImages/2008_002080.jpg 443 500 14 295 62 443 500 +6040 /data/VOCdevkit/VOC2012/JPEGImages/2008_002082.jpg 500 335 19 356 88 429 143 8 178 165 224 221 17 1 213 416 335 4 399 143 407 169 4 404 143 413 170 +6041 /data/VOCdevkit/VOC2012/JPEGImages/2008_002084.jpg 500 375 14 276 131 394 322 14 186 134 382 375 11 208 201 336 343 15 164 13 200 37 +6042 /data/VOCdevkit/VOC2012/JPEGImages/2008_002086.jpg 500 375 14 366 46 490 375 15 1 266 47 375 +6043 /data/VOCdevkit/VOC2012/JPEGImages/2008_002088.jpg 500 333 14 34 41 241 333 14 164 47 418 333 +6044 /data/VOCdevkit/VOC2012/JPEGImages/2008_002092.jpg 500 374 14 91 184 239 374 14 288 189 436 374 14 374 66 500 209 14 294 16 458 134 14 279 99 444 361 14 180 96 292 353 14 88 110 210 338 14 4 82 213 344 17 1 109 480 326 +6045 /data/VOCdevkit/VOC2012/JPEGImages/2008_002093.jpg 375 500 14 1 55 341 500 +6046 /data/VOCdevkit/VOC2012/JPEGImages/2008_002094.jpg 375 500 14 51 275 148 435 14 3 269 27 339 +6047 /data/VOCdevkit/VOC2012/JPEGImages/2008_002096.jpg 500 375 11 1 251 113 375 14 200 138 274 334 14 392 74 482 335 14 322 38 413 321 +6048 /data/VOCdevkit/VOC2012/JPEGImages/2008_002098.jpg 336 448 14 115 60 289 448 14 104 112 134 194 15 33 160 52 186 +6049 /data/VOCdevkit/VOC2012/JPEGImages/2008_002099.jpg 500 333 14 457 95 488 188 14 190 184 284 333 14 221 170 294 333 +6050 /data/VOCdevkit/VOC2012/JPEGImages/2008_002103.jpg 500 375 14 264 40 500 375 14 1 75 305 375 +6051 /data/VOCdevkit/VOC2012/JPEGImages/2008_002107.jpg 500 295 14 266 4 452 295 +6052 /data/VOCdevkit/VOC2012/JPEGImages/2008_002112.jpg 500 375 14 40 28 403 375 14 380 85 498 358 8 13 136 265 375 4 301 129 316 188 +6053 /data/VOCdevkit/VOC2012/JPEGImages/2008_002113.jpg 500 375 14 88 53 500 263 14 228 257 315 375 +6054 /data/VOCdevkit/VOC2012/JPEGImages/2008_002114.jpg 500 375 8 362 195 500 375 10 1 159 354 349 14 66 47 424 375 14 288 54 478 331 14 264 77 373 177 14 229 32 324 168 +6055 /data/VOCdevkit/VOC2012/JPEGImages/2008_002115.jpg 500 352 14 21 21 262 340 13 231 1 500 319 +6056 /data/VOCdevkit/VOC2012/JPEGImages/2008_002116.jpg 500 375 11 190 133 426 375 +6057 /data/VOCdevkit/VOC2012/JPEGImages/2008_002117.jpg 500 333 14 10 1 480 333 +6058 /data/VOCdevkit/VOC2012/JPEGImages/2008_002118.jpg 375 500 6 236 456 375 500 +6059 /data/VOCdevkit/VOC2012/JPEGImages/2008_002119.jpg 500 375 17 81 125 434 343 8 1 234 214 375 19 182 21 224 72 15 385 117 408 146 +6060 /data/VOCdevkit/VOC2012/JPEGImages/2008_002123.jpg 500 375 13 452 101 500 223 13 373 106 424 226 13 232 149 381 299 13 1 139 148 349 14 41 78 106 157 14 147 73 246 326 14 297 74 365 309 14 398 59 464 292 +6061 /data/VOCdevkit/VOC2012/JPEGImages/2008_002124.jpg 500 375 14 300 1 500 373 +6062 /data/VOCdevkit/VOC2012/JPEGImages/2008_002129.jpg 500 333 14 172 51 431 333 1 6 1 432 319 +6063 /data/VOCdevkit/VOC2012/JPEGImages/2008_002131.jpg 500 321 3 91 172 173 237 3 173 174 251 226 3 332 166 391 201 14 430 151 452 202 14 462 150 481 204 14 449 147 465 205 14 118 152 147 201 +6064 /data/VOCdevkit/VOC2012/JPEGImages/2008_002132.jpg 500 375 14 53 131 147 316 14 104 137 198 315 14 191 143 252 316 14 248 144 313 319 14 305 137 380 318 14 370 143 438 315 14 415 131 464 192 14 459 134 499 195 +6065 /data/VOCdevkit/VOC2012/JPEGImages/2008_002138.jpg 500 375 0 1 99 423 241 6 410 139 450 170 +6066 /data/VOCdevkit/VOC2012/JPEGImages/2008_002140.jpg 500 333 19 1 1 304 317 14 229 89 495 333 +6067 /data/VOCdevkit/VOC2012/JPEGImages/2008_002144.jpg 500 375 14 241 60 493 375 14 81 114 259 375 +6068 /data/VOCdevkit/VOC2012/JPEGImages/2008_002145.jpg 375 500 14 77 115 375 500 +6069 /data/VOCdevkit/VOC2012/JPEGImages/2008_002146.jpg 500 375 14 368 109 500 375 14 214 88 424 375 14 1 60 237 375 +6070 /data/VOCdevkit/VOC2012/JPEGImages/2008_002148.jpg 405 400 8 2 21 399 400 14 18 45 291 386 +6071 /data/VOCdevkit/VOC2012/JPEGImages/2008_002150.jpg 500 375 16 153 108 332 302 14 149 122 480 375 2 453 35 500 74 +6072 /data/VOCdevkit/VOC2012/JPEGImages/2008_002151.jpg 500 265 0 3 52 500 242 +6073 /data/VOCdevkit/VOC2012/JPEGImages/2008_002152.jpg 500 375 7 304 155 438 283 7 111 122 313 259 7 87 76 327 174 +6074 /data/VOCdevkit/VOC2012/JPEGImages/2008_002153.jpg 500 375 4 214 135 250 236 4 242 130 269 222 +6075 /data/VOCdevkit/VOC2012/JPEGImages/2008_002155.jpg 500 375 14 193 154 273 281 14 354 166 500 375 +6076 /data/VOCdevkit/VOC2012/JPEGImages/2008_002156.jpg 400 400 14 53 44 400 400 +6077 /data/VOCdevkit/VOC2012/JPEGImages/2008_002158.jpg 500 375 18 90 29 356 292 +6078 /data/VOCdevkit/VOC2012/JPEGImages/2008_002160.jpg 500 375 11 93 100 318 242 +6079 /data/VOCdevkit/VOC2012/JPEGImages/2008_002162.jpg 500 375 14 29 111 100 252 14 118 103 192 271 14 188 104 313 324 +6080 /data/VOCdevkit/VOC2012/JPEGImages/2008_002167.jpg 500 332 14 14 20 411 332 +6081 /data/VOCdevkit/VOC2012/JPEGImages/2008_002169.jpg 500 375 14 222 113 376 375 14 133 130 294 375 +6082 /data/VOCdevkit/VOC2012/JPEGImages/2008_002172.jpg 500 302 12 67 72 205 290 14 109 36 203 231 14 190 73 236 148 12 190 124 275 280 +6083 /data/VOCdevkit/VOC2012/JPEGImages/2008_002175.jpg 500 375 8 363 260 460 375 8 353 217 449 373 +6084 /data/VOCdevkit/VOC2012/JPEGImages/2008_002176.jpg 500 294 14 9 43 340 294 14 228 59 459 294 14 153 49 312 294 14 1 1 46 60 +6085 /data/VOCdevkit/VOC2012/JPEGImages/2008_002177.jpg 500 260 7 11 28 463 239 +6086 /data/VOCdevkit/VOC2012/JPEGImages/2008_002179.jpg 500 375 5 41 97 355 333 14 23 1 40 42 13 262 9 315 49 13 283 2 332 38 +6087 /data/VOCdevkit/VOC2012/JPEGImages/2008_002181.jpg 500 454 14 1 95 103 454 14 98 122 211 454 14 89 76 184 454 14 186 103 304 454 14 245 73 325 436 14 279 106 407 454 14 337 94 409 441 14 381 99 446 315 14 404 59 500 454 +6088 /data/VOCdevkit/VOC2012/JPEGImages/2008_002182.jpg 500 375 7 223 40 337 371 +6089 /data/VOCdevkit/VOC2012/JPEGImages/2008_002185.jpg 500 375 14 239 82 500 375 +6090 /data/VOCdevkit/VOC2012/JPEGImages/2008_002191.jpg 375 500 14 150 164 217 372 13 1 305 82 468 13 21 217 107 360 13 216 219 264 295 15 299 264 348 351 15 268 266 312 341 15 100 258 134 301 15 117 232 139 262 14 150 186 168 232 15 343 406 375 500 15 325 398 375 473 +6091 /data/VOCdevkit/VOC2012/JPEGImages/2008_002193.jpg 500 375 18 109 1 500 239 14 13 158 37 250 +6092 /data/VOCdevkit/VOC2012/JPEGImages/2008_002194.jpg 500 335 3 319 155 375 180 3 274 153 321 174 3 1 167 67 204 +6093 /data/VOCdevkit/VOC2012/JPEGImages/2008_002195.jpg 500 371 0 373 10 440 44 0 277 10 338 40 0 197 11 252 36 0 87 7 151 39 +6094 /data/VOCdevkit/VOC2012/JPEGImages/2008_002197.jpg 500 335 6 1 205 83 320 6 185 191 274 266 6 259 186 328 267 6 310 173 500 310 +6095 /data/VOCdevkit/VOC2012/JPEGImages/2008_002198.jpg 500 375 6 1 126 500 320 +6096 /data/VOCdevkit/VOC2012/JPEGImages/2008_002199.jpg 500 375 6 1 154 268 306 6 342 183 500 370 14 102 164 173 370 14 177 166 216 327 14 292 160 408 375 14 272 161 334 312 14 252 177 290 303 +6097 /data/VOCdevkit/VOC2012/JPEGImages/2008_002200.jpg 500 419 2 192 168 409 398 +6098 /data/VOCdevkit/VOC2012/JPEGImages/2008_002201.jpg 500 375 7 110 1 500 375 +6099 /data/VOCdevkit/VOC2012/JPEGImages/2008_002202.jpg 320 480 13 8 137 288 456 6 258 201 320 242 +6100 /data/VOCdevkit/VOC2012/JPEGImages/2008_002204.jpg 500 332 1 117 243 247 322 +6101 /data/VOCdevkit/VOC2012/JPEGImages/2008_002205.jpg 500 375 5 1 62 453 319 +6102 /data/VOCdevkit/VOC2012/JPEGImages/2008_002206.jpg 500 375 14 53 1 487 375 +6103 /data/VOCdevkit/VOC2012/JPEGImages/2008_002207.jpg 500 375 2 269 178 306 195 2 442 35 492 73 +6104 /data/VOCdevkit/VOC2012/JPEGImages/2008_002208.jpg 500 375 2 264 153 299 200 2 207 173 264 203 2 184 148 217 191 2 129 143 160 195 +6105 /data/VOCdevkit/VOC2012/JPEGImages/2008_002209.jpg 500 375 13 291 205 451 320 +6106 /data/VOCdevkit/VOC2012/JPEGImages/2008_002210.jpg 500 375 14 2 8 410 375 14 233 84 350 375 +6107 /data/VOCdevkit/VOC2012/JPEGImages/2008_002212.jpg 500 376 6 1 153 497 339 14 116 146 186 246 14 158 87 222 171 14 96 151 228 196 +6108 /data/VOCdevkit/VOC2012/JPEGImages/2008_002215.jpg 400 300 7 76 19 316 283 +6109 /data/VOCdevkit/VOC2012/JPEGImages/2008_002218.jpg 500 375 19 87 185 254 320 8 95 50 221 201 8 246 68 428 310 +6110 /data/VOCdevkit/VOC2012/JPEGImages/2008_002220.jpg 500 333 14 353 103 497 333 14 220 114 351 333 14 135 119 252 333 14 41 111 184 333 +6111 /data/VOCdevkit/VOC2012/JPEGImages/2008_002221.jpg 500 375 0 121 125 381 254 +6112 /data/VOCdevkit/VOC2012/JPEGImages/2008_002222.jpg 500 375 18 160 88 346 275 14 47 186 109 375 14 120 190 132 238 +6113 /data/VOCdevkit/VOC2012/JPEGImages/2008_002223.jpg 500 375 6 354 195 415 224 +6114 /data/VOCdevkit/VOC2012/JPEGImages/2008_002225.jpg 500 351 7 138 129 286 249 7 197 170 338 231 +6115 /data/VOCdevkit/VOC2012/JPEGImages/2008_002227.jpg 500 375 11 86 129 219 313 11 149 139 279 313 +6116 /data/VOCdevkit/VOC2012/JPEGImages/2008_002229.jpg 500 375 5 253 171 292 201 6 1 188 197 375 6 417 181 500 375 +6117 /data/VOCdevkit/VOC2012/JPEGImages/2008_002231.jpg 375 500 14 54 81 361 468 +6118 /data/VOCdevkit/VOC2012/JPEGImages/2008_002234.jpg 375 500 7 1 1 375 500 +6119 /data/VOCdevkit/VOC2012/JPEGImages/2008_002236.jpg 500 375 14 329 60 500 375 14 62 127 297 375 14 67 141 156 375 +6120 /data/VOCdevkit/VOC2012/JPEGImages/2008_002239.jpg 500 375 11 224 15 404 288 +6121 /data/VOCdevkit/VOC2012/JPEGImages/2008_002240.jpg 500 333 13 24 12 141 333 13 139 9 244 333 13 226 1 350 331 13 329 1 462 333 +6122 /data/VOCdevkit/VOC2012/JPEGImages/2008_002241.jpg 375 500 14 81 306 145 492 14 15 304 61 470 14 212 350 228 394 14 155 332 171 378 +6123 /data/VOCdevkit/VOC2012/JPEGImages/2008_002243.jpg 375 500 14 151 260 214 342 +6124 /data/VOCdevkit/VOC2012/JPEGImages/2008_002244.jpg 328 500 14 130 295 155 359 14 176 284 206 356 14 226 286 256 355 14 111 290 135 360 14 205 290 231 356 +6125 /data/VOCdevkit/VOC2012/JPEGImages/2008_002247.jpg 326 500 14 60 127 194 482 +6126 /data/VOCdevkit/VOC2012/JPEGImages/2008_002248.jpg 500 333 14 291 126 500 333 +6127 /data/VOCdevkit/VOC2012/JPEGImages/2008_002250.jpg 500 375 3 17 23 108 66 3 340 55 417 100 14 442 31 467 78 14 299 51 323 107 14 253 48 278 74 3 1 85 500 375 +6128 /data/VOCdevkit/VOC2012/JPEGImages/2008_002251.jpg 500 375 14 1 100 173 359 14 143 96 340 361 14 301 99 466 358 +6129 /data/VOCdevkit/VOC2012/JPEGImages/2008_002255.jpg 500 333 2 196 65 327 323 +6130 /data/VOCdevkit/VOC2012/JPEGImages/2008_002258.jpg 500 333 6 130 95 447 241 +6131 /data/VOCdevkit/VOC2012/JPEGImages/2008_002259.jpg 500 375 14 12 24 414 375 14 205 62 500 375 +6132 /data/VOCdevkit/VOC2012/JPEGImages/2008_002262.jpg 500 375 14 294 139 389 306 14 44 159 137 375 +6133 /data/VOCdevkit/VOC2012/JPEGImages/2008_002267.jpg 500 375 11 1 122 500 375 11 265 268 366 356 11 189 224 328 291 +6134 /data/VOCdevkit/VOC2012/JPEGImages/2008_002269.jpg 500 374 1 22 23 416 334 1 409 64 500 292 +6135 /data/VOCdevkit/VOC2012/JPEGImages/2008_002270.jpg 500 338 9 252 206 319 255 9 232 197 268 217 +6136 /data/VOCdevkit/VOC2012/JPEGImages/2008_002272.jpg 375 500 14 44 115 333 468 +6137 /data/VOCdevkit/VOC2012/JPEGImages/2008_002273.jpg 500 375 15 56 137 231 308 +6138 /data/VOCdevkit/VOC2012/JPEGImages/2008_002278.jpg 500 375 9 345 85 431 147 9 255 200 367 288 9 1 126 135 289 9 73 139 250 289 +6139 /data/VOCdevkit/VOC2012/JPEGImages/2008_002279.jpg 500 286 18 1 105 489 263 +6140 /data/VOCdevkit/VOC2012/JPEGImages/2008_002280.jpg 400 500 14 41 56 359 500 4 300 143 333 215 +6141 /data/VOCdevkit/VOC2012/JPEGImages/2008_002281.jpg 500 375 3 409 183 456 217 3 219 175 278 226 +6142 /data/VOCdevkit/VOC2012/JPEGImages/2008_002283.jpg 500 375 14 21 73 235 375 14 288 32 325 110 14 239 179 395 375 14 261 64 482 375 14 104 56 232 375 +6143 /data/VOCdevkit/VOC2012/JPEGImages/2008_002288.jpg 375 500 8 121 205 370 500 +6144 /data/VOCdevkit/VOC2012/JPEGImages/2008_002292.jpg 500 375 4 1 1 500 375 +6145 /data/VOCdevkit/VOC2012/JPEGImages/2008_002293.jpg 500 375 7 73 9 465 375 +6146 /data/VOCdevkit/VOC2012/JPEGImages/2008_002294.jpg 500 375 7 156 1 494 255 +6147 /data/VOCdevkit/VOC2012/JPEGImages/2008_002296.jpg 375 500 14 3 126 230 500 +6148 /data/VOCdevkit/VOC2012/JPEGImages/2008_002298.jpg 500 375 7 82 169 299 375 7 258 183 456 375 +6149 /data/VOCdevkit/VOC2012/JPEGImages/2008_002299.jpg 500 375 7 7 23 294 375 14 34 1 500 375 +6150 /data/VOCdevkit/VOC2012/JPEGImages/2008_002304.jpg 500 333 14 1 1 106 333 14 250 9 443 333 14 57 82 94 190 14 100 66 142 159 14 142 95 181 153 14 65 150 167 319 14 143 126 236 223 14 239 79 279 230 14 168 50 228 137 11 68 246 228 333 11 157 203 252 291 11 233 204 489 333 14 243 68 263 87 +6151 /data/VOCdevkit/VOC2012/JPEGImages/2008_002305.jpg 452 292 14 153 79 283 292 +6152 /data/VOCdevkit/VOC2012/JPEGImages/2008_002307.jpg 316 500 15 235 300 266 339 11 236 406 297 485 15 202 286 239 327 +6153 /data/VOCdevkit/VOC2012/JPEGImages/2008_002311.jpg 375 500 4 262 387 328 500 4 220 359 274 500 4 140 174 214 444 8 297 178 375 294 8 262 232 332 304 8 1 189 74 383 14 45 50 349 500 +6154 /data/VOCdevkit/VOC2012/JPEGImages/2008_002312.jpg 500 334 14 58 21 193 334 14 229 32 363 334 14 342 12 466 334 14 45 61 64 111 +6155 /data/VOCdevkit/VOC2012/JPEGImages/2008_002314.jpg 500 375 14 89 117 445 353 +6156 /data/VOCdevkit/VOC2012/JPEGImages/2008_002317.jpg 375 500 11 222 209 294 380 14 175 29 285 288 15 1 373 112 500 15 293 267 345 319 15 345 249 375 307 15 72 285 134 334 15 93 246 140 297 15 111 186 157 259 15 135 158 173 189 15 135 116 179 162 15 144 82 179 124 15 267 162 306 210 15 1 421 60 500 15 282 134 304 170 15 152 1 215 92 15 107 37 141 90 15 288 175 357 325 11 62 167 220 423 +6157 /data/VOCdevkit/VOC2012/JPEGImages/2008_002321.jpg 500 375 14 243 1 500 375 14 186 2 409 375 14 1 45 261 375 +6158 /data/VOCdevkit/VOC2012/JPEGImages/2008_002322.jpg 500 333 14 155 61 245 269 1 120 155 295 297 6 185 95 500 237 6 1 168 162 271 +6159 /data/VOCdevkit/VOC2012/JPEGImages/2008_002324.jpg 500 375 14 106 1 185 166 +6160 /data/VOCdevkit/VOC2012/JPEGImages/2008_002325.jpg 333 500 14 155 321 195 440 18 1 187 333 395 +6161 /data/VOCdevkit/VOC2012/JPEGImages/2008_002327.jpg 500 375 6 1 59 500 375 +6162 /data/VOCdevkit/VOC2012/JPEGImages/2008_002328.jpg 500 375 14 18 105 142 288 14 90 86 268 375 14 247 77 441 353 19 1 255 235 375 +6163 /data/VOCdevkit/VOC2012/JPEGImages/2008_002329.jpg 500 375 7 148 125 312 375 +6164 /data/VOCdevkit/VOC2012/JPEGImages/2008_002330.jpg 375 500 4 127 79 157 173 14 74 1 243 166 4 252 103 284 177 +6165 /data/VOCdevkit/VOC2012/JPEGImages/2008_002331.jpg 469 500 14 177 89 289 475 +6166 /data/VOCdevkit/VOC2012/JPEGImages/2008_002335.jpg 500 375 3 101 179 384 262 +6167 /data/VOCdevkit/VOC2012/JPEGImages/2008_002338.jpg 500 375 12 238 140 333 308 12 171 116 235 305 +6168 /data/VOCdevkit/VOC2012/JPEGImages/2008_002340.jpg 500 375 14 289 113 498 375 14 1 103 307 375 +6169 /data/VOCdevkit/VOC2012/JPEGImages/2008_002343.jpg 500 375 16 1 1 297 349 16 318 203 377 309 16 240 206 327 303 +6170 /data/VOCdevkit/VOC2012/JPEGImages/2008_002344.jpg 375 500 18 1 21 375 469 14 21 196 113 451 14 140 196 222 354 14 211 184 309 312 +6171 /data/VOCdevkit/VOC2012/JPEGImages/2008_002347.jpg 439 500 14 19 38 187 442 14 109 146 422 500 +6172 /data/VOCdevkit/VOC2012/JPEGImages/2008_002349.jpg 500 399 2 7 133 224 312 2 360 130 495 314 2 198 202 257 273 2 186 129 235 172 2 54 63 123 93 2 200 9 237 33 +6173 /data/VOCdevkit/VOC2012/JPEGImages/2008_002350.jpg 500 333 2 191 91 388 269 +6174 /data/VOCdevkit/VOC2012/JPEGImages/2008_002356.jpg 500 300 14 364 150 387 223 14 467 157 492 240 14 319 128 343 202 14 266 123 281 178 14 206 114 221 154 14 184 98 200 146 +6175 /data/VOCdevkit/VOC2012/JPEGImages/2008_002357.jpg 500 375 14 117 72 403 375 +6176 /data/VOCdevkit/VOC2012/JPEGImages/2008_002358.jpg 500 333 0 8 87 489 223 +6177 /data/VOCdevkit/VOC2012/JPEGImages/2008_002359.jpg 500 363 11 25 65 291 346 11 288 59 457 186 +6178 /data/VOCdevkit/VOC2012/JPEGImages/2008_002361.jpg 500 333 14 19 9 288 333 14 245 19 467 333 +6179 /data/VOCdevkit/VOC2012/JPEGImages/2008_002362.jpg 500 375 4 237 216 277 329 4 456 207 485 290 10 120 237 500 375 14 1 69 197 375 14 252 91 438 270 +6180 /data/VOCdevkit/VOC2012/JPEGImages/2008_002365.jpg 375 500 14 244 388 312 500 +6181 /data/VOCdevkit/VOC2012/JPEGImages/2008_002366.jpg 331 500 6 1 55 331 500 14 116 99 256 285 +6182 /data/VOCdevkit/VOC2012/JPEGImages/2008_002368.jpg 500 333 6 164 10 496 191 +6183 /data/VOCdevkit/VOC2012/JPEGImages/2008_002369.jpg 376 500 2 42 187 161 491 +6184 /data/VOCdevkit/VOC2012/JPEGImages/2008_002370.jpg 320 240 13 258 1 320 110 13 182 1 244 94 13 77 1 197 240 13 98 1 143 72 1 1 1 81 240 +6185 /data/VOCdevkit/VOC2012/JPEGImages/2008_002372.jpg 344 480 4 1 1 344 480 +6186 /data/VOCdevkit/VOC2012/JPEGImages/2008_002374.jpg 500 333 14 224 101 357 185 13 187 130 450 232 +6187 /data/VOCdevkit/VOC2012/JPEGImages/2008_002377.jpg 454 294 14 1 129 44 293 14 29 167 125 262 14 122 39 248 239 14 377 103 431 292 14 286 90 400 291 14 218 128 292 252 14 211 62 339 257 +6188 /data/VOCdevkit/VOC2012/JPEGImages/2008_002378.jpg 500 375 14 185 63 384 325 14 13 47 226 372 4 487 207 500 285 +6189 /data/VOCdevkit/VOC2012/JPEGImages/2008_002379.jpg 375 500 15 80 78 282 462 8 2 241 165 371 +6190 /data/VOCdevkit/VOC2012/JPEGImages/2008_002383.jpg 324 432 13 81 16 249 417 +6191 /data/VOCdevkit/VOC2012/JPEGImages/2008_002384.jpg 500 375 14 177 161 337 375 8 40 232 147 375 10 208 271 479 375 1 368 224 500 366 +6192 /data/VOCdevkit/VOC2012/JPEGImages/2008_002389.jpg 500 376 2 1 9 460 373 +6193 /data/VOCdevkit/VOC2012/JPEGImages/2008_002395.jpg 500 396 11 202 151 309 224 +6194 /data/VOCdevkit/VOC2012/JPEGImages/2008_002399.jpg 500 400 2 153 251 285 311 +6195 /data/VOCdevkit/VOC2012/JPEGImages/2008_002401.jpg 500 375 6 340 208 390 247 13 455 219 500 258 6 241 218 282 255 +6196 /data/VOCdevkit/VOC2012/JPEGImages/2008_002403.jpg 500 375 14 271 72 469 375 14 94 65 272 359 8 1 119 282 375 +6197 /data/VOCdevkit/VOC2012/JPEGImages/2008_002404.jpg 500 333 14 244 5 491 332 14 52 58 123 137 +6198 /data/VOCdevkit/VOC2012/JPEGImages/2008_002405.jpg 500 385 14 205 72 292 206 +6199 /data/VOCdevkit/VOC2012/JPEGImages/2008_002408.jpg 500 337 11 96 112 280 250 11 254 137 341 263 +6200 /data/VOCdevkit/VOC2012/JPEGImages/2008_002410.jpg 437 500 7 153 211 350 423 7 223 34 358 159 +6201 /data/VOCdevkit/VOC2012/JPEGImages/2008_002411.jpg 500 400 12 137 216 339 388 12 1 244 197 400 14 197 174 242 302 14 42 180 112 341 +6202 /data/VOCdevkit/VOC2012/JPEGImages/2008_002412.jpg 500 376 5 25 157 486 333 +6203 /data/VOCdevkit/VOC2012/JPEGImages/2008_002414.jpg 400 500 14 1 22 400 500 +6204 /data/VOCdevkit/VOC2012/JPEGImages/2008_002418.jpg 357 500 14 63 29 264 422 1 40 201 309 475 +6205 /data/VOCdevkit/VOC2012/JPEGImages/2008_002419.jpg 375 500 14 44 21 337 500 14 1 31 159 500 +6206 /data/VOCdevkit/VOC2012/JPEGImages/2008_002422.jpg 500 333 3 442 11 495 153 14 53 27 213 333 14 202 52 404 333 +6207 /data/VOCdevkit/VOC2012/JPEGImages/2008_002424.jpg 500 375 14 1 1 500 375 +6208 /data/VOCdevkit/VOC2012/JPEGImages/2008_002425.jpg 500 333 14 102 26 235 196 +6209 /data/VOCdevkit/VOC2012/JPEGImages/2008_002428.jpg 323 500 14 1 81 323 500 +6210 /data/VOCdevkit/VOC2012/JPEGImages/2008_002429.jpg 490 500 2 99 93 469 487 +6211 /data/VOCdevkit/VOC2012/JPEGImages/2008_002430.jpg 500 328 11 31 116 94 212 16 418 60 496 258 16 370 106 424 243 16 303 65 379 257 +6212 /data/VOCdevkit/VOC2012/JPEGImages/2008_002434.jpg 500 346 14 59 1 235 204 14 1 151 106 314 17 34 68 488 332 14 145 56 330 332 14 225 27 487 333 +6213 /data/VOCdevkit/VOC2012/JPEGImages/2008_002436.jpg 500 375 14 157 55 374 363 11 111 62 370 367 +6214 /data/VOCdevkit/VOC2012/JPEGImages/2008_002437.jpg 500 332 6 193 152 240 178 +6215 /data/VOCdevkit/VOC2012/JPEGImages/2008_002438.jpg 500 375 8 104 68 252 137 +6216 /data/VOCdevkit/VOC2012/JPEGImages/2008_002439.jpg 500 333 14 79 156 283 333 +6217 /data/VOCdevkit/VOC2012/JPEGImages/2008_002441.jpg 500 375 11 48 50 367 375 +6218 /data/VOCdevkit/VOC2012/JPEGImages/2008_002442.jpg 500 375 11 5 37 386 375 8 296 1 332 41 8 257 1 292 40 8 114 12 189 114 8 65 10 119 141 8 65 1 128 127 6 359 1 481 56 +6219 /data/VOCdevkit/VOC2012/JPEGImages/2008_002444.jpg 375 500 6 218 381 375 500 6 1 362 29 413 +6220 /data/VOCdevkit/VOC2012/JPEGImages/2008_002445.jpg 333 500 14 143 85 333 500 +6221 /data/VOCdevkit/VOC2012/JPEGImages/2008_002446.jpg 500 375 14 44 93 402 375 14 267 39 500 375 +6222 /data/VOCdevkit/VOC2012/JPEGImages/2008_002448.jpg 337 405 14 31 171 95 309 14 129 157 202 317 14 246 159 306 310 8 113 233 147 287 +6223 /data/VOCdevkit/VOC2012/JPEGImages/2008_002451.jpg 500 375 5 336 100 500 238 14 386 154 431 281 14 200 170 239 277 14 142 166 177 296 14 289 160 335 287 14 325 167 398 314 14 242 175 304 286 14 167 157 217 297 14 34 177 91 284 +6224 /data/VOCdevkit/VOC2012/JPEGImages/2008_002452.jpg 500 375 18 136 4 251 106 18 285 36 500 72 +6225 /data/VOCdevkit/VOC2012/JPEGImages/2008_002454.jpg 500 333 0 1 139 500 333 +6226 /data/VOCdevkit/VOC2012/JPEGImages/2008_002456.jpg 375 500 14 238 117 286 223 +6227 /data/VOCdevkit/VOC2012/JPEGImages/2008_002457.jpg 375 500 14 72 284 188 500 14 1 333 29 500 18 1 290 375 469 +6228 /data/VOCdevkit/VOC2012/JPEGImages/2008_002458.jpg 500 443 14 112 146 413 410 14 213 177 403 443 +6229 /data/VOCdevkit/VOC2012/JPEGImages/2008_002459.jpg 500 333 14 213 5 289 217 12 67 104 394 319 14 29 103 72 200 12 5 145 84 243 14 436 176 477 224 14 466 166 493 223 +6230 /data/VOCdevkit/VOC2012/JPEGImages/2008_002461.jpg 500 332 6 201 115 308 213 +6231 /data/VOCdevkit/VOC2012/JPEGImages/2008_002464.jpg 500 334 19 154 78 494 334 +6232 /data/VOCdevkit/VOC2012/JPEGImages/2008_002465.jpg 500 333 18 33 2 500 333 +6233 /data/VOCdevkit/VOC2012/JPEGImages/2008_002466.jpg 500 375 6 31 80 450 300 6 1 65 38 80 6 321 56 351 66 +6234 /data/VOCdevkit/VOC2012/JPEGImages/2008_002467.jpg 500 375 4 68 50 182 312 4 222 89 309 298 4 359 87 447 309 +6235 /data/VOCdevkit/VOC2012/JPEGImages/2008_002470.jpg 500 332 14 203 153 401 332 14 127 152 215 280 14 294 34 444 332 14 1 138 132 317 14 213 58 325 277 14 169 71 242 204 +6236 /data/VOCdevkit/VOC2012/JPEGImages/2008_002471.jpg 500 401 2 207 94 380 238 +6237 /data/VOCdevkit/VOC2012/JPEGImages/2008_002473.jpg 400 300 6 85 32 347 245 +6238 /data/VOCdevkit/VOC2012/JPEGImages/2008_002477.jpg 500 375 14 108 28 341 375 14 296 1 500 375 +6239 /data/VOCdevkit/VOC2012/JPEGImages/2008_002481.jpg 500 377 19 271 234 320 278 8 206 290 313 377 +6240 /data/VOCdevkit/VOC2012/JPEGImages/2008_002482.jpg 500 375 3 110 263 162 298 14 109 234 143 278 +6241 /data/VOCdevkit/VOC2012/JPEGImages/2008_002483.jpg 500 375 6 280 154 500 272 6 49 154 403 303 6 1 165 123 312 14 98 121 231 375 14 450 138 482 176 +6242 /data/VOCdevkit/VOC2012/JPEGImages/2008_002484.jpg 375 500 14 102 55 327 500 14 49 13 267 500 +6243 /data/VOCdevkit/VOC2012/JPEGImages/2008_002485.jpg 500 375 14 308 115 439 375 8 81 189 335 375 14 113 153 373 375 14 76 26 229 375 +6244 /data/VOCdevkit/VOC2012/JPEGImages/2008_002487.jpg 333 500 14 24 119 265 297 +6245 /data/VOCdevkit/VOC2012/JPEGImages/2008_002491.jpg 500 400 14 2 182 104 400 14 132 186 211 400 14 320 150 478 400 14 120 187 155 269 14 205 207 241 291 14 274 211 285 266 14 242 219 263 266 +6246 /data/VOCdevkit/VOC2012/JPEGImages/2008_002492.jpg 500 400 3 126 259 172 286 +6247 /data/VOCdevkit/VOC2012/JPEGImages/2008_002494.jpg 500 375 14 46 128 287 320 11 218 227 365 354 14 244 159 359 375 +6248 /data/VOCdevkit/VOC2012/JPEGImages/2008_002495.jpg 500 333 14 80 107 161 333 14 276 117 394 333 14 171 190 212 242 +6249 /data/VOCdevkit/VOC2012/JPEGImages/2008_002499.jpg 500 375 14 32 14 445 375 +6250 /data/VOCdevkit/VOC2012/JPEGImages/2008_002501.jpg 500 375 14 125 33 328 375 14 1 105 167 375 6 431 180 500 232 6 34 152 65 173 +6251 /data/VOCdevkit/VOC2012/JPEGImages/2008_002502.jpg 354 500 8 20 86 118 322 8 232 181 327 320 14 31 1 252 329 14 227 27 354 327 +6252 /data/VOCdevkit/VOC2012/JPEGImages/2008_002504.jpg 500 375 3 13 172 478 292 +6253 /data/VOCdevkit/VOC2012/JPEGImages/2008_002506.jpg 500 375 14 332 48 500 375 14 1 21 211 375 14 180 60 384 375 +6254 /data/VOCdevkit/VOC2012/JPEGImages/2008_002508.jpg 500 333 10 299 156 500 312 8 297 151 355 246 8 318 162 380 268 8 349 170 422 297 8 416 172 499 290 8 390 152 415 172 8 276 144 318 211 8 136 161 185 217 17 193 139 270 199 17 26 134 102 204 8 54 189 157 308 8 396 162 451 269 +6255 /data/VOCdevkit/VOC2012/JPEGImages/2008_002509.jpg 434 300 12 139 69 319 300 +6256 /data/VOCdevkit/VOC2012/JPEGImages/2008_002510.jpg 500 333 14 377 305 399 333 +6257 /data/VOCdevkit/VOC2012/JPEGImages/2008_002512.jpg 500 375 14 199 288 221 332 14 241 288 264 329 +6258 /data/VOCdevkit/VOC2012/JPEGImages/2008_002514.jpg 375 500 14 109 339 254 500 +6259 /data/VOCdevkit/VOC2012/JPEGImages/2008_002515.jpg 500 375 1 1 1 500 334 +6260 /data/VOCdevkit/VOC2012/JPEGImages/2008_002516.jpg 500 375 6 40 164 64 185 +6261 /data/VOCdevkit/VOC2012/JPEGImages/2008_002521.jpg 500 375 8 211 219 285 367 +6262 /data/VOCdevkit/VOC2012/JPEGImages/2008_002523.jpg 500 375 14 233 11 370 181 +6263 /data/VOCdevkit/VOC2012/JPEGImages/2008_002524.jpg 375 500 14 75 380 120 500 14 1 378 25 466 14 32 379 54 434 6 35 378 74 406 +6264 /data/VOCdevkit/VOC2012/JPEGImages/2008_002526.jpg 375 500 14 9 109 330 500 14 14 102 157 500 +6265 /data/VOCdevkit/VOC2012/JPEGImages/2008_002527.jpg 375 500 14 41 27 375 500 +6266 /data/VOCdevkit/VOC2012/JPEGImages/2008_002533.jpg 500 375 14 165 50 376 360 17 18 15 500 286 +6267 /data/VOCdevkit/VOC2012/JPEGImages/2008_002536.jpg 500 319 16 235 36 368 194 16 365 76 493 193 11 34 138 225 228 +6268 /data/VOCdevkit/VOC2012/JPEGImages/2008_002540.jpg 375 500 14 1 94 375 500 +6269 /data/VOCdevkit/VOC2012/JPEGImages/2008_002541.jpg 333 500 14 147 30 309 500 14 36 82 158 500 +6270 /data/VOCdevkit/VOC2012/JPEGImages/2008_002542.jpg 500 375 14 4 96 243 375 14 1 74 46 278 14 201 106 280 316 14 262 98 355 336 14 333 78 464 357 14 297 26 500 375 +6271 /data/VOCdevkit/VOC2012/JPEGImages/2008_002543.jpg 375 500 14 77 254 293 500 +6272 /data/VOCdevkit/VOC2012/JPEGImages/2008_002547.jpg 500 375 19 38 77 421 365 +6273 /data/VOCdevkit/VOC2012/JPEGImages/2008_002549.jpg 450 338 14 1 11 354 338 +6274 /data/VOCdevkit/VOC2012/JPEGImages/2008_002551.jpg 500 375 0 1 174 500 375 +6275 /data/VOCdevkit/VOC2012/JPEGImages/2008_002555.jpg 375 500 14 194 288 267 403 14 1 289 83 427 6 194 289 375 385 14 139 110 201 187 +6276 /data/VOCdevkit/VOC2012/JPEGImages/2008_002558.jpg 358 294 14 42 35 245 294 +6277 /data/VOCdevkit/VOC2012/JPEGImages/2008_002562.jpg 500 333 14 101 64 352 333 +6278 /data/VOCdevkit/VOC2012/JPEGImages/2008_002564.jpg 375 500 14 1 1 308 500 14 305 108 375 196 +6279 /data/VOCdevkit/VOC2012/JPEGImages/2008_002566.jpg 500 365 14 103 237 145 316 14 70 241 93 307 14 344 223 366 285 +6280 /data/VOCdevkit/VOC2012/JPEGImages/2008_002567.jpg 500 375 10 163 191 478 375 14 58 134 316 375 14 154 110 189 165 14 370 128 500 361 14 310 118 425 239 14 308 105 373 224 14 170 89 265 195 4 247 166 270 225 +6281 /data/VOCdevkit/VOC2012/JPEGImages/2008_002568.jpg 500 375 14 187 95 439 375 +6282 /data/VOCdevkit/VOC2012/JPEGImages/2008_002574.jpg 500 375 14 110 1 319 330 11 48 161 359 343 +6283 /data/VOCdevkit/VOC2012/JPEGImages/2008_002575.jpg 500 375 14 86 67 486 375 +6284 /data/VOCdevkit/VOC2012/JPEGImages/2008_002576.jpg 332 500 14 87 116 258 500 +6285 /data/VOCdevkit/VOC2012/JPEGImages/2008_002578.jpg 500 397 14 41 95 105 234 14 97 71 140 221 14 181 63 221 174 14 20 195 105 343 14 91 188 172 354 14 118 135 181 223 14 182 140 248 306 14 243 130 316 294 14 138 62 189 168 14 218 56 266 163 +6286 /data/VOCdevkit/VOC2012/JPEGImages/2008_002579.jpg 500 375 14 244 90 474 375 14 63 99 265 375 +6287 /data/VOCdevkit/VOC2012/JPEGImages/2008_002583.jpg 500 375 7 273 61 473 363 7 13 44 241 312 +6288 /data/VOCdevkit/VOC2012/JPEGImages/2008_002584.jpg 500 293 11 1 56 378 293 +6289 /data/VOCdevkit/VOC2012/JPEGImages/2008_002588.jpg 500 375 14 367 1 500 375 +6290 /data/VOCdevkit/VOC2012/JPEGImages/2008_002589.jpg 500 375 12 38 127 209 268 12 199 134 396 266 12 315 152 492 251 +6291 /data/VOCdevkit/VOC2012/JPEGImages/2008_002590.jpg 500 375 14 118 176 208 375 14 29 163 125 375 +6292 /data/VOCdevkit/VOC2012/JPEGImages/2008_002597.jpg 500 375 7 29 21 449 375 +6293 /data/VOCdevkit/VOC2012/JPEGImages/2008_002598.jpg 375 500 14 90 12 375 500 11 89 196 330 500 +6294 /data/VOCdevkit/VOC2012/JPEGImages/2008_002599.jpg 375 500 14 1 5 323 500 +6295 /data/VOCdevkit/VOC2012/JPEGImages/2008_002601.jpg 405 500 14 18 20 372 500 14 251 301 383 386 4 232 283 295 325 8 1 18 401 500 +6296 /data/VOCdevkit/VOC2012/JPEGImages/2008_002603.jpg 500 375 14 62 74 388 375 +6297 /data/VOCdevkit/VOC2012/JPEGImages/2008_002606.jpg 500 375 14 1 1 499 362 4 148 317 257 372 +6298 /data/VOCdevkit/VOC2012/JPEGImages/2008_002610.jpg 500 375 3 53 168 323 234 14 152 75 216 268 14 199 144 305 261 11 299 212 397 263 +6299 /data/VOCdevkit/VOC2012/JPEGImages/2008_002612.jpg 500 375 11 17 54 427 337 +6300 /data/VOCdevkit/VOC2012/JPEGImages/2008_002613.jpg 500 375 14 88 72 500 375 8 11 150 424 375 +6301 /data/VOCdevkit/VOC2012/JPEGImages/2008_002616.jpg 333 500 14 1 103 185 500 14 132 57 333 500 +6302 /data/VOCdevkit/VOC2012/JPEGImages/2008_002621.jpg 500 375 14 6 35 408 359 11 187 174 301 324 +6303 /data/VOCdevkit/VOC2012/JPEGImages/2008_002622.jpg 355 500 14 1 9 355 500 +6304 /data/VOCdevkit/VOC2012/JPEGImages/2008_002623.jpg 375 500 7 1 341 375 500 +6305 /data/VOCdevkit/VOC2012/JPEGImages/2008_002624.jpg 500 375 2 244 67 327 150 +6306 /data/VOCdevkit/VOC2012/JPEGImages/2008_002625.jpg 500 333 3 104 43 437 293 +6307 /data/VOCdevkit/VOC2012/JPEGImages/2008_002631.jpg 333 500 14 76 10 254 413 1 89 238 246 500 +6308 /data/VOCdevkit/VOC2012/JPEGImages/2008_002634.jpg 369 500 14 1 1 343 500 +6309 /data/VOCdevkit/VOC2012/JPEGImages/2008_002638.jpg 500 281 11 176 33 427 281 14 1 1 500 281 14 151 1 239 136 +6310 /data/VOCdevkit/VOC2012/JPEGImages/2008_002639.jpg 233 500 14 77 185 199 424 +6311 /data/VOCdevkit/VOC2012/JPEGImages/2008_002640.jpg 500 425 14 7 161 52 308 14 159 167 224 408 6 20 172 89 200 14 390 176 479 420 +6312 /data/VOCdevkit/VOC2012/JPEGImages/2008_002641.jpg 500 333 14 8 75 173 333 14 340 175 453 333 +6313 /data/VOCdevkit/VOC2012/JPEGImages/2008_002643.jpg 375 500 14 1 83 113 363 6 1 101 56 143 6 185 136 298 185 +6314 /data/VOCdevkit/VOC2012/JPEGImages/2008_002645.jpg 500 375 14 1 109 234 375 +6315 /data/VOCdevkit/VOC2012/JPEGImages/2008_002647.jpg 500 400 2 102 72 252 272 +6316 /data/VOCdevkit/VOC2012/JPEGImages/2008_002648.jpg 500 281 14 1 1 485 281 +6317 /data/VOCdevkit/VOC2012/JPEGImages/2008_002649.jpg 333 500 14 1 149 313 500 14 95 234 215 450 8 47 183 333 500 +6318 /data/VOCdevkit/VOC2012/JPEGImages/2008_002650.jpg 435 500 19 1 1 319 350 +6319 /data/VOCdevkit/VOC2012/JPEGImages/2008_002652.jpg 500 398 14 266 80 376 398 14 105 132 220 398 14 210 156 275 398 +6320 /data/VOCdevkit/VOC2012/JPEGImages/2008_002653.jpg 375 500 14 62 120 200 437 15 150 57 358 312 +6321 /data/VOCdevkit/VOC2012/JPEGImages/2008_002662.jpg 352 288 14 38 1 352 288 +6322 /data/VOCdevkit/VOC2012/JPEGImages/2008_002665.jpg 500 375 12 46 220 277 375 14 261 26 497 375 +6323 /data/VOCdevkit/VOC2012/JPEGImages/2008_002666.jpg 332 500 14 208 82 322 330 12 87 195 332 499 +6324 /data/VOCdevkit/VOC2012/JPEGImages/2008_002668.jpg 500 333 7 1 1 500 333 +6325 /data/VOCdevkit/VOC2012/JPEGImages/2008_002670.jpg 500 375 14 286 212 441 375 14 128 138 284 375 14 90 73 186 285 14 8 149 145 375 14 32 99 104 158 +6326 /data/VOCdevkit/VOC2012/JPEGImages/2008_002672.jpg 500 400 6 340 160 417 191 6 473 168 500 196 +6327 /data/VOCdevkit/VOC2012/JPEGImages/2008_002673.jpg 500 375 0 228 140 440 231 0 18 132 262 237 0 435 177 500 213 +6328 /data/VOCdevkit/VOC2012/JPEGImages/2008_002674.jpg 363 500 14 1 17 356 500 14 17 181 189 449 8 92 3 363 500 +6329 /data/VOCdevkit/VOC2012/JPEGImages/2008_002675.jpg 375 500 14 133 248 308 500 14 74 45 227 453 +6330 /data/VOCdevkit/VOC2012/JPEGImages/2008_002676.jpg 500 375 19 121 209 357 375 14 196 123 324 213 8 82 168 410 342 +6331 /data/VOCdevkit/VOC2012/JPEGImages/2008_002677.jpg 358 500 14 211 83 346 500 14 46 49 249 500 +6332 /data/VOCdevkit/VOC2012/JPEGImages/2008_002678.jpg 500 375 14 421 174 439 227 +6333 /data/VOCdevkit/VOC2012/JPEGImages/2008_002679.jpg 333 500 1 94 103 239 306 14 131 20 263 252 14 94 388 141 461 +6334 /data/VOCdevkit/VOC2012/JPEGImages/2008_002680.jpg 342 458 19 37 34 290 237 +6335 /data/VOCdevkit/VOC2012/JPEGImages/2008_002681.jpg 375 500 7 165 134 328 465 +6336 /data/VOCdevkit/VOC2012/JPEGImages/2008_002682.jpg 375 500 7 154 125 336 419 +6337 /data/VOCdevkit/VOC2012/JPEGImages/2008_002684.jpg 375 500 2 109 194 375 473 +6338 /data/VOCdevkit/VOC2012/JPEGImages/2008_002686.jpg 500 333 12 107 19 417 333 9 429 146 486 177 +6339 /data/VOCdevkit/VOC2012/JPEGImages/2008_002687.jpg 500 388 11 24 62 415 352 +6340 /data/VOCdevkit/VOC2012/JPEGImages/2008_002696.jpg 500 375 13 90 1 500 375 +6341 /data/VOCdevkit/VOC2012/JPEGImages/2008_002697.jpg 500 375 12 69 116 333 347 +6342 /data/VOCdevkit/VOC2012/JPEGImages/2008_002698.jpg 500 375 0 156 178 281 244 +6343 /data/VOCdevkit/VOC2012/JPEGImages/2008_002700.jpg 500 365 14 138 73 360 365 +6344 /data/VOCdevkit/VOC2012/JPEGImages/2008_002701.jpg 500 375 1 27 10 500 331 +6345 /data/VOCdevkit/VOC2012/JPEGImages/2008_002704.jpg 500 375 6 40 73 459 328 +6346 /data/VOCdevkit/VOC2012/JPEGImages/2008_002705.jpg 500 355 14 10 142 48 188 14 57 167 82 185 6 1 75 500 344 +6347 /data/VOCdevkit/VOC2012/JPEGImages/2008_002709.jpg 500 332 9 213 143 290 195 +6348 /data/VOCdevkit/VOC2012/JPEGImages/2008_002710.jpg 500 375 6 68 157 439 281 +6349 /data/VOCdevkit/VOC2012/JPEGImages/2008_002712.jpg 500 375 14 81 65 295 296 14 283 103 387 277 14 209 54 500 375 +6350 /data/VOCdevkit/VOC2012/JPEGImages/2008_002714.jpg 332 500 1 1 258 332 500 14 1 1 332 470 +6351 /data/VOCdevkit/VOC2012/JPEGImages/2008_002715.jpg 371 500 14 1 50 363 500 1 64 390 354 500 +6352 /data/VOCdevkit/VOC2012/JPEGImages/2008_002716.jpg 500 375 14 163 1 500 375 +6353 /data/VOCdevkit/VOC2012/JPEGImages/2008_002718.jpg 390 335 14 63 1 390 335 +6354 /data/VOCdevkit/VOC2012/JPEGImages/2008_002719.jpg 500 333 0 210 34 475 250 +6355 /data/VOCdevkit/VOC2012/JPEGImages/2008_002720.jpg 500 290 14 271 64 500 290 14 2 12 110 129 14 80 21 185 154 14 127 29 328 272 +6356 /data/VOCdevkit/VOC2012/JPEGImages/2008_002725.jpg 500 333 14 344 70 429 333 14 289 171 381 333 14 201 117 317 333 14 143 93 213 333 14 216 65 317 164 14 417 199 466 333 14 1 183 117 333 +6357 /data/VOCdevkit/VOC2012/JPEGImages/2008_002728.jpg 500 284 14 87 22 406 284 14 202 37 351 208 +6358 /data/VOCdevkit/VOC2012/JPEGImages/2008_002730.jpg 200 258 14 1 18 182 258 +6359 /data/VOCdevkit/VOC2012/JPEGImages/2008_002732.jpg 500 206 9 42 96 153 163 9 238 101 284 135 9 149 102 179 127 +6360 /data/VOCdevkit/VOC2012/JPEGImages/2008_002733.jpg 383 500 14 27 67 362 500 +6361 /data/VOCdevkit/VOC2012/JPEGImages/2008_002735.jpg 500 375 14 261 126 367 375 14 92 98 214 375 14 178 103 262 375 +6362 /data/VOCdevkit/VOC2012/JPEGImages/2008_002736.jpg 500 375 14 80 107 285 375 14 222 131 390 316 14 370 118 500 323 4 381 244 416 361 4 323 236 351 326 +6363 /data/VOCdevkit/VOC2012/JPEGImages/2008_002738.jpg 500 375 14 78 107 262 375 14 1 107 421 375 +6364 /data/VOCdevkit/VOC2012/JPEGImages/2008_002741.jpg 500 375 14 219 189 389 375 6 1 178 478 354 +6365 /data/VOCdevkit/VOC2012/JPEGImages/2008_002746.jpg 500 333 6 269 146 472 311 6 1 129 227 291 6 208 147 309 210 14 102 136 179 307 14 1 125 46 285 14 219 156 293 307 +6366 /data/VOCdevkit/VOC2012/JPEGImages/2008_002749.jpg 500 334 7 74 103 500 286 +6367 /data/VOCdevkit/VOC2012/JPEGImages/2008_002750.jpg 500 333 14 113 148 181 326 14 166 1 220 152 14 147 1 197 126 14 443 38 500 187 14 212 130 279 298 14 256 127 327 302 14 261 141 328 305 14 297 160 352 327 14 332 128 384 287 14 330 167 378 333 +6368 /data/VOCdevkit/VOC2012/JPEGImages/2008_002751.jpg 500 333 14 86 61 260 333 +6369 /data/VOCdevkit/VOC2012/JPEGImages/2008_002752.jpg 500 375 13 1 274 286 375 13 199 147 402 263 14 253 90 319 283 14 216 112 270 256 14 108 158 230 313 14 48 217 164 375 +6370 /data/VOCdevkit/VOC2012/JPEGImages/2008_002753.jpg 375 500 14 70 151 176 500 14 175 203 260 500 14 173 158 325 500 14 311 183 375 338 +6371 /data/VOCdevkit/VOC2012/JPEGImages/2008_002756.jpg 380 472 14 1 19 207 392 14 133 51 361 395 +6372 /data/VOCdevkit/VOC2012/JPEGImages/2008_002758.jpg 500 375 8 278 32 331 84 14 457 149 489 182 +6373 /data/VOCdevkit/VOC2012/JPEGImages/2008_002760.jpg 500 375 14 24 55 131 353 +6374 /data/VOCdevkit/VOC2012/JPEGImages/2008_002762.jpg 493 500 14 107 12 357 364 12 26 93 475 495 +6375 /data/VOCdevkit/VOC2012/JPEGImages/2008_002766.jpg 500 375 7 1 1 500 375 +6376 /data/VOCdevkit/VOC2012/JPEGImages/2008_002767.jpg 500 375 11 71 40 500 375 +6377 /data/VOCdevkit/VOC2012/JPEGImages/2008_002768.jpg 375 500 14 1 59 321 500 14 9 308 248 426 +6378 /data/VOCdevkit/VOC2012/JPEGImages/2008_002772.jpg 375 500 13 76 248 370 434 +6379 /data/VOCdevkit/VOC2012/JPEGImages/2008_002773.jpg 500 333 3 31 271 150 308 3 162 275 238 308 3 247 277 321 308 3 312 274 386 309 3 390 274 490 311 0 139 111 189 141 0 121 87 173 119 0 148 75 199 106 0 166 95 219 128 +6380 /data/VOCdevkit/VOC2012/JPEGImages/2008_002774.jpg 334 500 13 99 221 221 431 14 82 137 262 405 +6381 /data/VOCdevkit/VOC2012/JPEGImages/2008_002775.jpg 500 375 4 96 162 188 375 14 104 16 259 235 +6382 /data/VOCdevkit/VOC2012/JPEGImages/2008_002776.jpg 500 333 19 8 52 136 161 4 454 23 463 48 14 332 181 477 292 8 258 138 373 256 17 325 198 500 333 +6383 /data/VOCdevkit/VOC2012/JPEGImages/2008_002778.jpg 500 375 9 106 103 425 338 +6384 /data/VOCdevkit/VOC2012/JPEGImages/2008_002783.jpg 500 375 14 185 81 294 203 +6385 /data/VOCdevkit/VOC2012/JPEGImages/2008_002784.jpg 375 500 2 113 172 244 422 +6386 /data/VOCdevkit/VOC2012/JPEGImages/2008_002787.jpg 500 375 1 35 170 231 375 14 58 26 206 325 14 358 11 500 375 1 296 176 500 375 +6387 /data/VOCdevkit/VOC2012/JPEGImages/2008_002789.jpg 500 333 14 73 195 226 333 14 247 11 382 270 14 213 4 500 333 +6388 /data/VOCdevkit/VOC2012/JPEGImages/2008_002791.jpg 500 375 14 6 81 390 375 14 212 157 390 375 4 182 295 278 375 +6389 /data/VOCdevkit/VOC2012/JPEGImages/2008_002792.jpg 500 333 14 148 113 398 333 +6390 /data/VOCdevkit/VOC2012/JPEGImages/2008_002793.jpg 500 375 7 1 51 422 278 +6391 /data/VOCdevkit/VOC2012/JPEGImages/2008_002794.jpg 500 375 14 410 180 468 347 14 233 172 280 351 14 1 167 109 353 14 218 139 280 217 +6392 /data/VOCdevkit/VOC2012/JPEGImages/2008_002795.jpg 500 375 14 190 117 302 304 8 412 185 500 375 14 190 79 213 112 +6393 /data/VOCdevkit/VOC2012/JPEGImages/2008_002801.jpg 500 375 14 1 106 204 361 14 95 124 405 375 14 117 111 300 341 17 1 114 471 375 +6394 /data/VOCdevkit/VOC2012/JPEGImages/2008_002804.jpg 500 375 14 301 101 372 271 13 272 151 370 326 +6395 /data/VOCdevkit/VOC2012/JPEGImages/2008_002806.jpg 500 375 12 85 86 310 289 +6396 /data/VOCdevkit/VOC2012/JPEGImages/2008_002808.jpg 500 375 14 170 3 340 375 +6397 /data/VOCdevkit/VOC2012/JPEGImages/2008_002809.jpg 500 375 14 75 122 151 225 14 241 116 338 298 14 33 113 421 375 14 320 103 500 375 +6398 /data/VOCdevkit/VOC2012/JPEGImages/2008_002811.jpg 333 500 14 76 159 249 387 +6399 /data/VOCdevkit/VOC2012/JPEGImages/2008_002813.jpg 500 378 14 24 21 278 378 14 269 12 484 378 +6400 /data/VOCdevkit/VOC2012/JPEGImages/2008_002814.jpg 500 375 11 1 30 500 316 +6401 /data/VOCdevkit/VOC2012/JPEGImages/2008_002817.jpg 500 375 19 154 1 404 216 14 3 270 175 366 +6402 /data/VOCdevkit/VOC2012/JPEGImages/2008_002820.jpg 375 500 14 1 44 321 500 +6403 /data/VOCdevkit/VOC2012/JPEGImages/2008_002823.jpg 500 375 14 7 156 166 375 14 136 101 306 375 14 270 74 500 375 +6404 /data/VOCdevkit/VOC2012/JPEGImages/2008_002826.jpg 500 375 19 340 107 500 250 +6405 /data/VOCdevkit/VOC2012/JPEGImages/2008_002829.jpg 375 500 14 116 99 255 426 +6406 /data/VOCdevkit/VOC2012/JPEGImages/2008_002830.jpg 500 332 14 179 94 490 332 +6407 /data/VOCdevkit/VOC2012/JPEGImages/2008_002831.jpg 375 500 19 1 1 375 237 14 79 87 361 500 +6408 /data/VOCdevkit/VOC2012/JPEGImages/2008_002834.jpg 500 375 6 105 139 326 259 +6409 /data/VOCdevkit/VOC2012/JPEGImages/2008_002835.jpg 500 419 12 99 91 348 365 14 164 29 305 278 +6410 /data/VOCdevkit/VOC2012/JPEGImages/2008_002838.jpg 380 472 14 175 143 380 472 14 1 242 186 472 14 1 21 380 472 +6411 /data/VOCdevkit/VOC2012/JPEGImages/2008_002842.jpg 375 500 14 76 1 367 500 +6412 /data/VOCdevkit/VOC2012/JPEGImages/2008_002843.jpg 500 375 14 179 113 257 313 +6413 /data/VOCdevkit/VOC2012/JPEGImages/2008_002845.jpg 500 375 7 15 108 361 342 +6414 /data/VOCdevkit/VOC2012/JPEGImages/2008_002847.jpg 500 375 2 348 10 500 188 2 268 66 425 245 2 250 151 408 259 2 209 263 380 369 2 167 159 242 357 2 97 205 152 319 2 1 230 99 375 +6415 /data/VOCdevkit/VOC2012/JPEGImages/2008_002848.jpg 375 500 14 65 1 375 500 14 1 203 189 500 +6416 /data/VOCdevkit/VOC2012/JPEGImages/2008_002850.jpg 500 333 3 32 73 425 243 +6417 /data/VOCdevkit/VOC2012/JPEGImages/2008_002852.jpg 375 500 14 196 174 357 500 14 144 128 243 500 14 55 155 161 500 14 1 127 92 500 +6418 /data/VOCdevkit/VOC2012/JPEGImages/2008_002854.jpg 500 375 14 249 268 326 375 +6419 /data/VOCdevkit/VOC2012/JPEGImages/2008_002856.jpg 500 338 14 160 163 277 338 +6420 /data/VOCdevkit/VOC2012/JPEGImages/2008_002857.jpg 500 332 6 291 109 500 228 6 1 141 169 253 14 152 83 258 332 +6421 /data/VOCdevkit/VOC2012/JPEGImages/2008_002859.jpg 500 375 11 81 50 436 345 +6422 /data/VOCdevkit/VOC2012/JPEGImages/2008_002860.jpg 500 323 12 207 120 312 213 12 32 133 175 313 12 359 115 419 309 +6423 /data/VOCdevkit/VOC2012/JPEGImages/2008_002864.jpg 500 375 4 164 168 192 245 4 211 157 230 229 4 269 150 310 258 14 238 68 494 375 14 1 55 164 375 +6424 /data/VOCdevkit/VOC2012/JPEGImages/2008_002866.jpg 331 500 12 1 27 303 500 14 200 300 216 353 14 183 302 199 356 +6425 /data/VOCdevkit/VOC2012/JPEGImages/2008_002868.jpg 500 375 14 211 231 312 375 14 268 100 372 375 14 169 114 363 375 14 40 139 63 236 14 109 131 137 237 +6426 /data/VOCdevkit/VOC2012/JPEGImages/2008_002869.jpg 500 375 8 41 146 407 375 14 205 147 280 235 +6427 /data/VOCdevkit/VOC2012/JPEGImages/2008_002870.jpg 500 375 14 99 55 500 375 4 109 1 214 197 14 1 43 86 375 14 216 46 410 281 +6428 /data/VOCdevkit/VOC2012/JPEGImages/2008_002872.jpg 500 332 7 6 1 500 332 +6429 /data/VOCdevkit/VOC2012/JPEGImages/2008_002873.jpg 500 371 14 32 39 369 371 +6430 /data/VOCdevkit/VOC2012/JPEGImages/2008_002875.jpg 500 375 6 20 53 471 355 6 1 30 255 236 6 446 20 500 184 6 284 23 453 87 6 171 20 296 59 +6431 /data/VOCdevkit/VOC2012/JPEGImages/2008_002876.jpg 500 375 15 75 330 109 360 +6432 /data/VOCdevkit/VOC2012/JPEGImages/2008_002879.jpg 500 377 14 160 15 409 377 +6433 /data/VOCdevkit/VOC2012/JPEGImages/2008_002880.jpg 334 500 14 176 213 229 291 14 127 295 192 396 1 151 245 254 301 +6434 /data/VOCdevkit/VOC2012/JPEGImages/2008_002882.jpg 500 398 14 202 70 332 398 14 64 32 227 398 14 318 93 470 398 15 9 162 72 288 +6435 /data/VOCdevkit/VOC2012/JPEGImages/2008_002883.jpg 500 375 1 8 26 496 334 +6436 /data/VOCdevkit/VOC2012/JPEGImages/2008_002885.jpg 500 375 8 232 137 370 370 14 194 39 331 308 +6437 /data/VOCdevkit/VOC2012/JPEGImages/2008_002887.jpg 500 375 3 104 97 251 175 3 37 87 127 157 3 1 155 472 375 14 358 110 399 183 +6438 /data/VOCdevkit/VOC2012/JPEGImages/2008_002890.jpg 374 500 6 1 1 374 500 +6439 /data/VOCdevkit/VOC2012/JPEGImages/2008_002891.jpg 500 375 6 1 216 98 352 6 331 240 500 310 +6440 /data/VOCdevkit/VOC2012/JPEGImages/2008_002892.jpg 449 420 10 19 225 369 420 14 331 145 443 407 14 38 135 143 330 14 107 139 161 242 14 278 139 363 284 14 257 172 303 236 8 19 255 88 391 +6441 /data/VOCdevkit/VOC2012/JPEGImages/2008_002894.jpg 500 332 1 43 154 388 332 14 140 70 341 332 +6442 /data/VOCdevkit/VOC2012/JPEGImages/2008_002897.jpg 375 500 14 134 198 275 342 15 102 285 145 337 +6443 /data/VOCdevkit/VOC2012/JPEGImages/2008_002899.jpg 500 281 7 22 33 500 241 +6444 /data/VOCdevkit/VOC2012/JPEGImages/2008_002900.jpg 331 500 18 156 1 331 439 +6445 /data/VOCdevkit/VOC2012/JPEGImages/2008_002903.jpg 375 500 8 240 241 282 319 8 122 262 246 374 8 1 326 202 500 17 1 270 70 360 10 223 242 308 318 +6446 /data/VOCdevkit/VOC2012/JPEGImages/2008_002904.jpg 500 375 11 106 60 379 302 +6447 /data/VOCdevkit/VOC2012/JPEGImages/2008_002906.jpg 500 375 14 451 153 484 271 14 316 128 363 257 14 281 157 330 258 14 14 114 54 158 +6448 /data/VOCdevkit/VOC2012/JPEGImages/2008_002908.jpg 500 375 14 36 64 500 375 +6449 /data/VOCdevkit/VOC2012/JPEGImages/2008_002909.jpg 500 375 14 1 72 157 314 14 243 36 416 302 +6450 /data/VOCdevkit/VOC2012/JPEGImages/2008_002910.jpg 500 375 14 131 47 414 375 +6451 /data/VOCdevkit/VOC2012/JPEGImages/2008_002913.jpg 500 400 11 1 80 500 400 11 132 1 490 328 +6452 /data/VOCdevkit/VOC2012/JPEGImages/2008_002916.jpg 500 375 17 4 53 433 375 +6453 /data/VOCdevkit/VOC2012/JPEGImages/2008_002917.jpg 500 332 14 111 7 224 331 14 172 82 248 329 14 300 62 439 228 +6454 /data/VOCdevkit/VOC2012/JPEGImages/2008_002920.jpg 500 375 14 59 132 216 342 14 188 75 324 201 14 338 77 469 299 17 147 97 475 301 8 1 128 109 305 +6455 /data/VOCdevkit/VOC2012/JPEGImages/2008_002922.jpg 500 333 17 1 42 500 333 14 91 45 322 333 14 250 31 435 332 +6456 /data/VOCdevkit/VOC2012/JPEGImages/2008_002926.jpg 500 375 13 41 25 468 300 +6457 /data/VOCdevkit/VOC2012/JPEGImages/2008_002929.jpg 500 333 17 96 182 429 333 14 263 161 375 333 14 124 166 255 333 +6458 /data/VOCdevkit/VOC2012/JPEGImages/2008_002930.jpg 377 500 14 69 38 321 500 +6459 /data/VOCdevkit/VOC2012/JPEGImages/2008_002931.jpg 500 375 14 398 161 441 261 14 46 170 107 375 14 111 177 147 224 14 104 183 176 375 14 135 160 264 374 14 246 141 412 375 14 394 152 500 375 +6460 /data/VOCdevkit/VOC2012/JPEGImages/2008_002932.jpg 500 375 14 211 141 333 375 14 303 77 432 375 1 24 281 161 375 14 24 143 180 375 +6461 /data/VOCdevkit/VOC2012/JPEGImages/2008_002936.jpg 500 333 11 1 58 249 320 +6462 /data/VOCdevkit/VOC2012/JPEGImages/2008_002942.jpg 500 467 14 1 1 500 338 +6463 /data/VOCdevkit/VOC2012/JPEGImages/2008_002943.jpg 500 375 6 76 114 413 282 6 412 149 500 235 6 4 117 77 174 6 81 129 158 172 +6464 /data/VOCdevkit/VOC2012/JPEGImages/2008_002946.jpg 368 500 14 93 59 178 400 14 114 70 275 500 +6465 /data/VOCdevkit/VOC2012/JPEGImages/2008_002947.jpg 500 329 14 277 69 491 329 14 179 89 309 313 14 108 60 231 252 14 46 76 134 213 +6466 /data/VOCdevkit/VOC2012/JPEGImages/2008_002948.jpg 500 375 17 89 58 398 375 1 9 1 169 333 13 397 16 500 375 1 1 1 135 306 +6467 /data/VOCdevkit/VOC2012/JPEGImages/2008_002951.jpg 500 375 14 46 76 304 375 +6468 /data/VOCdevkit/VOC2012/JPEGImages/2008_002954.jpg 337 500 14 56 77 238 461 19 155 287 279 389 +6469 /data/VOCdevkit/VOC2012/JPEGImages/2008_002955.jpg 500 333 14 224 128 338 286 13 25 94 264 306 +6470 /data/VOCdevkit/VOC2012/JPEGImages/2008_002956.jpg 500 335 14 130 285 185 335 14 211 200 287 335 14 287 130 390 335 6 139 154 167 174 +6471 /data/VOCdevkit/VOC2012/JPEGImages/2008_002957.jpg 500 375 7 120 7 487 375 +6472 /data/VOCdevkit/VOC2012/JPEGImages/2008_002958.jpg 375 500 11 82 205 232 297 6 345 182 375 209 6 1 61 310 500 +6473 /data/VOCdevkit/VOC2012/JPEGImages/2008_002960.jpg 500 375 14 255 73 427 292 14 46 92 222 375 +6474 /data/VOCdevkit/VOC2012/JPEGImages/2008_002961.jpg 500 375 2 237 71 429 317 2 143 121 217 345 +6475 /data/VOCdevkit/VOC2012/JPEGImages/2008_002965.jpg 500 375 18 86 161 472 257 +6476 /data/VOCdevkit/VOC2012/JPEGImages/2008_002966.jpg 500 331 14 49 74 117 200 14 107 19 164 178 14 142 35 173 149 14 169 39 211 119 14 170 24 210 57 14 198 27 220 108 14 213 35 230 121 14 263 54 278 134 14 227 53 272 152 14 279 84 301 138 14 303 89 320 140 3 160 1 341 281 +6477 /data/VOCdevkit/VOC2012/JPEGImages/2008_002968.jpg 375 500 14 292 321 342 497 +6478 /data/VOCdevkit/VOC2012/JPEGImages/2008_002970.jpg 421 500 2 138 151 229 343 +6479 /data/VOCdevkit/VOC2012/JPEGImages/2008_002971.jpg 299 500 14 95 117 162 269 14 109 100 198 399 +6480 /data/VOCdevkit/VOC2012/JPEGImages/2008_002972.jpg 500 375 13 100 1 424 271 +6481 /data/VOCdevkit/VOC2012/JPEGImages/2008_002973.jpg 500 375 14 244 88 500 312 14 1 82 223 291 14 226 102 327 292 14 207 51 303 175 14 104 44 142 154 14 105 51 166 163 14 298 119 333 176 14 476 114 500 147 +6482 /data/VOCdevkit/VOC2012/JPEGImages/2008_002977.jpg 500 375 6 371 225 491 271 0 1 1 494 375 +6483 /data/VOCdevkit/VOC2012/JPEGImages/2008_002983.jpg 500 333 2 88 21 414 274 +6484 /data/VOCdevkit/VOC2012/JPEGImages/2008_002984.jpg 500 375 14 276 103 426 323 +6485 /data/VOCdevkit/VOC2012/JPEGImages/2008_002985.jpg 500 375 11 251 224 329 277 14 319 71 448 351 14 170 131 263 352 +6486 /data/VOCdevkit/VOC2012/JPEGImages/2008_002988.jpg 500 395 14 34 32 462 395 +6487 /data/VOCdevkit/VOC2012/JPEGImages/2008_002992.jpg 345 500 11 68 123 195 470 14 151 55 247 461 +6488 /data/VOCdevkit/VOC2012/JPEGImages/2008_002993.jpg 500 375 12 77 142 345 303 +6489 /data/VOCdevkit/VOC2012/JPEGImages/2008_002997.jpg 500 375 14 349 74 500 375 14 237 111 352 375 14 124 86 258 375 14 7 90 159 375 +6490 /data/VOCdevkit/VOC2012/JPEGImages/2008_002999.jpg 375 500 14 1 1 375 500 +6491 /data/VOCdevkit/VOC2012/JPEGImages/2008_003001.jpg 348 500 14 103 71 242 425 14 232 182 280 316 +6492 /data/VOCdevkit/VOC2012/JPEGImages/2008_003003.jpg 500 375 19 111 73 247 164 15 34 132 76 169 +6493 /data/VOCdevkit/VOC2012/JPEGImages/2008_003005.jpg 500 332 6 23 1 500 279 +6494 /data/VOCdevkit/VOC2012/JPEGImages/2008_003008.jpg 500 333 14 377 108 500 272 14 159 94 354 333 14 1 32 137 196 +6495 /data/VOCdevkit/VOC2012/JPEGImages/2008_003013.jpg 500 333 14 65 32 320 333 +6496 /data/VOCdevkit/VOC2012/JPEGImages/2008_003015.jpg 500 333 14 162 41 448 333 +6497 /data/VOCdevkit/VOC2012/JPEGImages/2008_003017.jpg 500 400 14 93 28 500 400 +6498 /data/VOCdevkit/VOC2012/JPEGImages/2008_003018.jpg 346 500 12 32 22 317 459 14 7 182 155 483 +6499 /data/VOCdevkit/VOC2012/JPEGImages/2008_003020.jpg 500 375 14 37 37 183 375 14 305 68 445 375 14 191 122 270 280 12 183 211 319 375 +6500 /data/VOCdevkit/VOC2012/JPEGImages/2008_003021.jpg 500 375 6 22 1 500 355 +6501 /data/VOCdevkit/VOC2012/JPEGImages/2008_003022.jpg 500 375 6 438 110 500 146 6 406 115 466 141 6 32 70 475 302 +6502 /data/VOCdevkit/VOC2012/JPEGImages/2008_003023.jpg 500 335 2 78 35 302 335 +6503 /data/VOCdevkit/VOC2012/JPEGImages/2008_003025.jpg 500 375 18 397 199 500 228 14 306 244 324 287 14 280 254 292 285 14 255 248 267 276 14 60 244 69 275 +6504 /data/VOCdevkit/VOC2012/JPEGImages/2008_003026.jpg 500 375 19 353 163 500 375 +6505 /data/VOCdevkit/VOC2012/JPEGImages/2008_003030.jpg 500 375 6 146 206 464 357 14 126 246 145 279 +6506 /data/VOCdevkit/VOC2012/JPEGImages/2008_003033.jpg 500 146 0 11 36 500 136 +6507 /data/VOCdevkit/VOC2012/JPEGImages/2008_003034.jpg 500 333 14 367 95 500 333 14 88 56 245 239 +6508 /data/VOCdevkit/VOC2012/JPEGImages/2008_003037.jpg 500 375 19 81 255 112 285 +6509 /data/VOCdevkit/VOC2012/JPEGImages/2008_003039.jpg 334 500 14 86 80 315 500 +6510 /data/VOCdevkit/VOC2012/JPEGImages/2008_003041.jpg 500 333 0 20 86 500 317 +6511 /data/VOCdevkit/VOC2012/JPEGImages/2008_003043.jpg 500 375 12 298 181 458 333 12 266 174 422 321 14 104 185 142 279 14 184 183 249 274 +6512 /data/VOCdevkit/VOC2012/JPEGImages/2008_003045.jpg 500 333 7 1 56 425 290 +6513 /data/VOCdevkit/VOC2012/JPEGImages/2008_003048.jpg 500 375 7 1 1 458 323 +6514 /data/VOCdevkit/VOC2012/JPEGImages/2008_003049.jpg 333 500 2 140 203 189 283 +6515 /data/VOCdevkit/VOC2012/JPEGImages/2008_003051.jpg 500 382 14 254 153 279 228 15 361 239 404 277 15 108 239 150 278 +6516 /data/VOCdevkit/VOC2012/JPEGImages/2008_003052.jpg 500 375 7 25 1 427 273 +6517 /data/VOCdevkit/VOC2012/JPEGImages/2008_003053.jpg 500 375 13 7 1 483 375 +6518 /data/VOCdevkit/VOC2012/JPEGImages/2008_003055.jpg 500 375 12 71 78 275 361 12 282 40 400 299 +6519 /data/VOCdevkit/VOC2012/JPEGImages/2008_003056.jpg 500 375 14 1 78 151 375 +6520 /data/VOCdevkit/VOC2012/JPEGImages/2008_003057.jpg 500 375 6 77 91 500 375 +6521 /data/VOCdevkit/VOC2012/JPEGImages/2008_003059.jpg 500 335 0 144 115 271 175 +6522 /data/VOCdevkit/VOC2012/JPEGImages/2008_003060.jpg 500 375 5 1 132 31 202 6 23 164 142 285 6 421 183 487 267 5 134 36 424 356 +6523 /data/VOCdevkit/VOC2012/JPEGImages/2008_003061.jpg 500 375 6 335 43 434 99 6 216 34 337 100 6 83 44 185 107 14 1 28 48 212 6 84 98 483 285 14 13 19 97 228 +6524 /data/VOCdevkit/VOC2012/JPEGImages/2008_003062.jpg 500 334 14 200 60 441 334 14 1 80 218 334 3 1 1 500 334 +6525 /data/VOCdevkit/VOC2012/JPEGImages/2008_003063.jpg 356 500 7 7 239 159 474 7 159 238 237 486 +6526 /data/VOCdevkit/VOC2012/JPEGImages/2008_003065.jpg 375 500 9 38 1 375 500 14 145 133 375 500 +6527 /data/VOCdevkit/VOC2012/JPEGImages/2008_003067.jpg 333 500 5 120 189 288 472 5 297 344 327 389 14 149 325 186 369 +6528 /data/VOCdevkit/VOC2012/JPEGImages/2008_003068.jpg 500 371 18 135 121 315 315 +6529 /data/VOCdevkit/VOC2012/JPEGImages/2008_003072.jpg 375 500 1 178 230 199 257 +6530 /data/VOCdevkit/VOC2012/JPEGImages/2008_003073.jpg 500 333 8 58 223 165 333 +6531 /data/VOCdevkit/VOC2012/JPEGImages/2008_003075.jpg 500 318 14 129 123 287 249 1 253 1 478 203 +6532 /data/VOCdevkit/VOC2012/JPEGImages/2008_003076.jpg 500 375 14 1 137 153 375 14 311 63 481 375 4 314 164 350 238 4 411 1 435 53 4 370 3 389 51 4 385 8 413 54 +6533 /data/VOCdevkit/VOC2012/JPEGImages/2008_003079.jpg 500 375 14 1 87 500 375 4 178 151 203 233 +6534 /data/VOCdevkit/VOC2012/JPEGImages/2008_003081.jpg 500 326 14 224 152 294 249 3 83 222 227 298 +6535 /data/VOCdevkit/VOC2012/JPEGImages/2008_003082.jpg 500 375 6 378 239 439 295 +6536 /data/VOCdevkit/VOC2012/JPEGImages/2008_003083.jpg 500 375 18 23 80 490 303 +6537 /data/VOCdevkit/VOC2012/JPEGImages/2008_003087.jpg 500 334 2 157 84 379 240 +6538 /data/VOCdevkit/VOC2012/JPEGImages/2008_003088.jpg 500 375 7 1 1 398 375 +6539 /data/VOCdevkit/VOC2012/JPEGImages/2008_003089.jpg 357 500 14 27 37 285 487 +6540 /data/VOCdevkit/VOC2012/JPEGImages/2008_003090.jpg 500 490 14 131 81 344 490 14 183 14 388 407 +6541 /data/VOCdevkit/VOC2012/JPEGImages/2008_003093.jpg 500 375 14 243 1 500 375 14 141 100 282 273 8 238 148 500 375 +6542 /data/VOCdevkit/VOC2012/JPEGImages/2008_003094.jpg 500 375 9 321 219 386 322 9 213 226 287 328 9 65 195 209 324 14 344 180 385 296 +6543 /data/VOCdevkit/VOC2012/JPEGImages/2008_003095.jpg 500 351 14 166 69 332 328 +6544 /data/VOCdevkit/VOC2012/JPEGImages/2008_003099.jpg 500 382 14 296 42 500 382 14 92 40 301 331 14 1 67 120 267 4 270 312 309 382 +6545 /data/VOCdevkit/VOC2012/JPEGImages/2008_003100.jpg 500 340 3 1 57 471 340 14 201 38 355 295 +6546 /data/VOCdevkit/VOC2012/JPEGImages/2008_003101.jpg 500 375 11 146 106 287 243 +6547 /data/VOCdevkit/VOC2012/JPEGImages/2008_003104.jpg 356 500 7 84 9 356 500 +6548 /data/VOCdevkit/VOC2012/JPEGImages/2008_003105.jpg 500 340 18 76 94 456 311 +6549 /data/VOCdevkit/VOC2012/JPEGImages/2008_003106.jpg 500 376 2 239 197 290 261 2 388 213 463 289 2 9 209 113 276 +6550 /data/VOCdevkit/VOC2012/JPEGImages/2008_003107.jpg 500 375 14 233 130 337 375 +6551 /data/VOCdevkit/VOC2012/JPEGImages/2008_003108.jpg 191 500 14 69 56 191 500 14 2 94 81 303 14 33 73 84 187 14 1 75 21 197 1 1 184 83 324 +6552 /data/VOCdevkit/VOC2012/JPEGImages/2008_003110.jpg 500 355 2 25 119 250 328 2 194 85 391 297 2 289 40 467 245 +6553 /data/VOCdevkit/VOC2012/JPEGImages/2008_003112.jpg 333 500 3 88 27 282 461 +6554 /data/VOCdevkit/VOC2012/JPEGImages/2008_003114.jpg 500 436 7 1 9 500 436 +6555 /data/VOCdevkit/VOC2012/JPEGImages/2008_003120.jpg 304 320 14 45 33 297 313 +6556 /data/VOCdevkit/VOC2012/JPEGImages/2008_003122.jpg 500 345 14 247 222 285 331 +6557 /data/VOCdevkit/VOC2012/JPEGImages/2008_003127.jpg 374 500 14 56 141 374 500 +6558 /data/VOCdevkit/VOC2012/JPEGImages/2008_003128.jpg 500 420 14 125 83 447 420 14 1 1 214 369 +6559 /data/VOCdevkit/VOC2012/JPEGImages/2008_003132.jpg 500 375 6 225 91 431 260 14 220 99 270 284 14 115 125 156 264 14 44 140 99 341 +6560 /data/VOCdevkit/VOC2012/JPEGImages/2008_003133.jpg 500 346 11 185 117 460 346 11 11 5 500 229 +6561 /data/VOCdevkit/VOC2012/JPEGImages/2008_003134.jpg 500 334 14 34 74 255 334 14 231 91 483 334 +6562 /data/VOCdevkit/VOC2012/JPEGImages/2008_003135.jpg 335 500 15 258 324 335 460 15 1 270 50 443 +6563 /data/VOCdevkit/VOC2012/JPEGImages/2008_003136.jpg 400 500 14 1 23 71 193 14 111 52 397 374 8 172 68 226 181 +6564 /data/VOCdevkit/VOC2012/JPEGImages/2008_003140.jpg 500 375 6 385 116 433 153 6 421 123 500 187 6 303 131 435 236 14 166 125 198 211 14 189 147 314 330 14 89 103 183 375 1 62 239 417 375 1 1 217 276 375 +6565 /data/VOCdevkit/VOC2012/JPEGImages/2008_003141.jpg 500 375 6 1 193 148 331 5 100 32 438 314 14 437 206 467 289 14 481 209 499 256 +6566 /data/VOCdevkit/VOC2012/JPEGImages/2008_003143.jpg 500 375 14 1 27 423 375 14 290 1 500 375 +6567 /data/VOCdevkit/VOC2012/JPEGImages/2008_003144.jpg 500 375 14 42 249 99 375 14 313 242 354 370 14 347 247 373 356 14 123 235 173 375 14 122 246 147 328 15 226 262 301 285 +6568 /data/VOCdevkit/VOC2012/JPEGImages/2008_003146.jpg 500 375 14 114 93 312 375 14 289 122 497 375 8 74 262 105 375 +6569 /data/VOCdevkit/VOC2012/JPEGImages/2008_003147.jpg 500 375 16 120 161 213 263 16 209 204 257 278 16 265 219 321 295 +6570 /data/VOCdevkit/VOC2012/JPEGImages/2008_003151.jpg 500 375 13 143 216 318 320 14 225 183 275 294 +6571 /data/VOCdevkit/VOC2012/JPEGImages/2008_003152.jpg 500 375 13 23 92 368 349 14 254 30 433 362 +6572 /data/VOCdevkit/VOC2012/JPEGImages/2008_003154.jpg 500 375 14 248 8 500 375 +6573 /data/VOCdevkit/VOC2012/JPEGImages/2008_003155.jpg 500 375 0 2 112 499 266 +6574 /data/VOCdevkit/VOC2012/JPEGImages/2008_003157.jpg 480 360 14 39 161 143 360 14 139 190 229 360 14 227 163 327 360 +6575 /data/VOCdevkit/VOC2012/JPEGImages/2008_003160.jpg 500 333 2 418 96 459 170 2 266 86 332 155 2 90 139 131 230 2 28 110 93 200 2 107 105 170 197 2 98 96 136 142 2 69 98 101 145 2 88 96 110 125 +6576 /data/VOCdevkit/VOC2012/JPEGImages/2008_003161.jpg 500 375 2 165 47 360 360 +6577 /data/VOCdevkit/VOC2012/JPEGImages/2008_003167.jpg 500 400 7 141 1 463 232 +6578 /data/VOCdevkit/VOC2012/JPEGImages/2008_003168.jpg 375 500 8 303 197 375 391 +6579 /data/VOCdevkit/VOC2012/JPEGImages/2008_003170.jpg 500 464 2 79 19 457 321 +6580 /data/VOCdevkit/VOC2012/JPEGImages/2008_003178.jpg 500 375 8 119 84 381 375 8 224 146 341 314 8 322 174 389 270 8 441 167 500 287 8 88 127 244 348 +6581 /data/VOCdevkit/VOC2012/JPEGImages/2008_003180.jpg 500 375 11 269 122 406 356 +6582 /data/VOCdevkit/VOC2012/JPEGImages/2008_003181.jpg 500 421 14 31 32 315 421 14 202 74 500 421 +6583 /data/VOCdevkit/VOC2012/JPEGImages/2008_003182.jpg 333 500 14 181 187 319 500 12 71 181 333 500 4 211 312 235 358 +6584 /data/VOCdevkit/VOC2012/JPEGImages/2008_003186.jpg 500 332 14 116 92 311 278 14 250 83 500 316 4 114 150 155 293 +6585 /data/VOCdevkit/VOC2012/JPEGImages/2008_003187.jpg 500 375 3 184 91 280 223 +6586 /data/VOCdevkit/VOC2012/JPEGImages/2008_003189.jpg 500 375 0 3 85 474 291 +6587 /data/VOCdevkit/VOC2012/JPEGImages/2008_003191.jpg 500 376 14 362 284 481 376 14 315 136 459 376 14 150 75 329 376 14 22 106 161 357 +6588 /data/VOCdevkit/VOC2012/JPEGImages/2008_003193.jpg 375 500 14 28 100 175 306 14 2 1 103 239 +6589 /data/VOCdevkit/VOC2012/JPEGImages/2008_003196.jpg 500 400 0 98 62 349 153 +6590 /data/VOCdevkit/VOC2012/JPEGImages/2008_003200.jpg 460 500 4 11 323 83 475 19 1 5 340 334 +6591 /data/VOCdevkit/VOC2012/JPEGImages/2008_003202.jpg 500 375 14 88 25 194 367 14 277 83 306 133 14 254 97 272 133 6 219 133 425 245 19 455 109 498 156 +6592 /data/VOCdevkit/VOC2012/JPEGImages/2008_003203.jpg 500 375 14 12 8 397 375 +6593 /data/VOCdevkit/VOC2012/JPEGImages/2008_003205.jpg 500 375 1 109 151 356 314 6 127 53 161 81 14 192 19 330 340 +6594 /data/VOCdevkit/VOC2012/JPEGImages/2008_003208.jpg 328 500 14 78 434 114 498 +6595 /data/VOCdevkit/VOC2012/JPEGImages/2008_003209.jpg 333 500 14 42 215 189 318 14 173 223 278 365 14 262 258 333 404 +6596 /data/VOCdevkit/VOC2012/JPEGImages/2008_003210.jpg 375 500 14 13 5 303 500 14 167 240 355 412 +6597 /data/VOCdevkit/VOC2012/JPEGImages/2008_003211.jpg 438 500 2 47 63 351 421 +6598 /data/VOCdevkit/VOC2012/JPEGImages/2008_003213.jpg 400 300 7 123 52 276 300 19 1 51 116 180 +6599 /data/VOCdevkit/VOC2012/JPEGImages/2008_003220.jpg 375 500 14 129 196 270 485 +6600 /data/VOCdevkit/VOC2012/JPEGImages/2008_003222.jpg 500 375 2 181 79 422 356 +6601 /data/VOCdevkit/VOC2012/JPEGImages/2008_003224.jpg 500 375 14 347 143 482 351 14 231 136 345 297 14 11 166 188 374 4 202 246 228 333 10 111 258 456 375 10 1 204 187 294 +6602 /data/VOCdevkit/VOC2012/JPEGImages/2008_003225.jpg 355 500 15 2 158 352 500 +6603 /data/VOCdevkit/VOC2012/JPEGImages/2008_003228.jpg 500 375 7 1 176 41 320 14 90 109 152 233 14 103 27 303 375 14 279 89 442 375 +6604 /data/VOCdevkit/VOC2012/JPEGImages/2008_003231.jpg 500 353 14 153 120 359 353 7 223 214 368 321 +6605 /data/VOCdevkit/VOC2012/JPEGImages/2008_003232.jpg 500 408 2 199 94 467 408 +6606 /data/VOCdevkit/VOC2012/JPEGImages/2008_003238.jpg 375 500 11 62 104 375 449 14 1 155 156 500 +6607 /data/VOCdevkit/VOC2012/JPEGImages/2008_003239.jpg 226 353 7 47 190 116 353 7 99 197 159 353 +6608 /data/VOCdevkit/VOC2012/JPEGImages/2008_003242.jpg 500 334 14 54 4 335 334 12 1 146 480 334 +6609 /data/VOCdevkit/VOC2012/JPEGImages/2008_003244.jpg 385 500 7 1 23 385 467 +6610 /data/VOCdevkit/VOC2012/JPEGImages/2008_003245.jpg 500 375 14 16 173 307 375 14 180 14 396 370 8 1 140 336 375 8 142 77 394 335 10 360 116 500 351 +6611 /data/VOCdevkit/VOC2012/JPEGImages/2008_003248.jpg 500 333 14 295 48 500 333 19 181 93 332 196 19 1 94 104 267 +6612 /data/VOCdevkit/VOC2012/JPEGImages/2008_003249.jpg 500 340 14 430 134 456 200 14 216 138 246 200 14 182 91 256 277 13 90 168 353 309 14 128 98 204 280 14 152 97 207 228 +6613 /data/VOCdevkit/VOC2012/JPEGImages/2008_003251.jpg 500 375 14 133 80 377 375 14 229 169 348 328 +6614 /data/VOCdevkit/VOC2012/JPEGImages/2008_003252.jpg 500 375 8 136 77 436 373 +6615 /data/VOCdevkit/VOC2012/JPEGImages/2008_003255.jpg 500 375 6 106 70 372 320 6 1 161 28 191 +6616 /data/VOCdevkit/VOC2012/JPEGImages/2008_003256.jpg 500 375 9 241 108 500 375 9 89 58 299 375 +6617 /data/VOCdevkit/VOC2012/JPEGImages/2008_003261.jpg 500 333 0 17 68 490 223 6 432 170 465 181 +6618 /data/VOCdevkit/VOC2012/JPEGImages/2008_003263.jpg 500 375 18 113 96 406 272 18 1 72 173 254 +6619 /data/VOCdevkit/VOC2012/JPEGImages/2008_003264.jpg 500 375 10 89 212 326 373 8 226 224 323 375 8 111 213 208 369 8 83 207 127 342 8 106 196 160 228 8 219 202 265 232 8 265 206 313 236 19 106 175 144 218 +6620 /data/VOCdevkit/VOC2012/JPEGImages/2008_003265.jpg 500 375 14 43 9 194 375 14 292 129 500 375 8 1 229 107 375 +6621 /data/VOCdevkit/VOC2012/JPEGImages/2008_003266.jpg 500 331 5 31 51 465 303 14 475 207 495 260 +6622 /data/VOCdevkit/VOC2012/JPEGImages/2008_003269.jpg 500 281 13 9 1 471 275 15 442 1 483 37 +6623 /data/VOCdevkit/VOC2012/JPEGImages/2008_003270.jpg 500 375 1 1 37 492 361 +6624 /data/VOCdevkit/VOC2012/JPEGImages/2008_003271.jpg 500 375 14 130 22 412 375 17 23 48 500 375 +6625 /data/VOCdevkit/VOC2012/JPEGImages/2008_003272.jpg 500 227 11 156 27 195 63 11 86 35 123 65 11 50 10 93 69 12 351 70 396 206 12 390 45 456 210 +6626 /data/VOCdevkit/VOC2012/JPEGImages/2008_003275.jpg 500 375 3 76 227 119 279 0 290 245 356 273 +6627 /data/VOCdevkit/VOC2012/JPEGImages/2008_003276.jpg 500 333 11 181 134 375 284 4 402 39 426 86 4 368 38 397 84 4 303 49 351 77 4 357 22 386 65 +6628 /data/VOCdevkit/VOC2012/JPEGImages/2008_003277.jpg 500 375 14 262 79 473 375 14 109 196 310 375 +6629 /data/VOCdevkit/VOC2012/JPEGImages/2008_003278.jpg 500 375 14 385 157 500 375 14 183 42 305 375 14 274 69 380 375 14 36 49 200 375 +6630 /data/VOCdevkit/VOC2012/JPEGImages/2008_003280.jpg 375 500 19 233 180 277 262 19 275 181 310 274 14 84 190 279 434 14 39 170 113 260 8 55 288 175 455 8 25 242 94 351 4 328 279 347 340 4 338 276 352 333 +6631 /data/VOCdevkit/VOC2012/JPEGImages/2008_003283.jpg 500 341 12 1 116 340 341 14 52 21 189 341 14 325 93 466 341 +6632 /data/VOCdevkit/VOC2012/JPEGImages/2008_003286.jpg 500 375 14 1 118 500 375 11 238 167 493 305 +6633 /data/VOCdevkit/VOC2012/JPEGImages/2008_003287.jpg 333 500 14 173 172 306 500 +6634 /data/VOCdevkit/VOC2012/JPEGImages/2008_003288.jpg 500 375 14 130 127 451 375 +6635 /data/VOCdevkit/VOC2012/JPEGImages/2008_003289.jpg 500 333 4 255 215 278 292 4 84 212 102 291 4 219 214 236 276 14 256 113 451 333 +6636 /data/VOCdevkit/VOC2012/JPEGImages/2008_003290.jpg 431 500 14 230 7 431 500 14 7 12 166 500 14 143 160 304 500 8 133 309 285 500 4 47 126 75 202 +6637 /data/VOCdevkit/VOC2012/JPEGImages/2008_003291.jpg 474 500 2 65 78 394 417 +6638 /data/VOCdevkit/VOC2012/JPEGImages/2008_003295.jpg 500 374 14 110 145 411 374 +6639 /data/VOCdevkit/VOC2012/JPEGImages/2008_003297.jpg 500 375 9 158 140 334 274 +6640 /data/VOCdevkit/VOC2012/JPEGImages/2008_003300.jpg 500 456 6 1 1 500 456 +6641 /data/VOCdevkit/VOC2012/JPEGImages/2008_003302.jpg 363 500 5 21 25 350 477 +6642 /data/VOCdevkit/VOC2012/JPEGImages/2008_003303.jpg 375 500 7 1 94 375 500 +6643 /data/VOCdevkit/VOC2012/JPEGImages/2008_003304.jpg 375 500 14 118 251 197 485 +6644 /data/VOCdevkit/VOC2012/JPEGImages/2008_003305.jpg 500 375 14 80 34 299 375 14 230 90 447 375 +6645 /data/VOCdevkit/VOC2012/JPEGImages/2008_003311.jpg 500 375 14 1 1 500 375 +6646 /data/VOCdevkit/VOC2012/JPEGImages/2008_003313.jpg 500 375 3 17 147 500 251 14 188 152 254 226 +6647 /data/VOCdevkit/VOC2012/JPEGImages/2008_003316.jpg 375 500 12 57 61 331 500 12 1 69 154 500 14 203 100 292 213 14 338 160 375 222 +6648 /data/VOCdevkit/VOC2012/JPEGImages/2008_003318.jpg 500 333 14 106 30 500 333 14 281 122 467 333 +6649 /data/VOCdevkit/VOC2012/JPEGImages/2008_003320.jpg 500 375 13 80 147 393 347 14 177 60 296 296 14 448 117 483 168 15 426 162 500 276 15 79 155 143 274 +6650 /data/VOCdevkit/VOC2012/JPEGImages/2008_003321.jpg 500 375 5 150 151 406 238 6 460 194 500 226 6 405 186 474 221 6 11 206 94 264 +6651 /data/VOCdevkit/VOC2012/JPEGImages/2008_003323.jpg 500 375 13 125 31 448 375 13 1 81 132 253 +6652 /data/VOCdevkit/VOC2012/JPEGImages/2008_003326.jpg 375 500 12 1 1 307 453 +6653 /data/VOCdevkit/VOC2012/JPEGImages/2008_003329.jpg 500 375 14 385 137 500 375 14 255 91 406 375 14 226 123 279 256 14 154 116 190 210 1 237 301 427 375 1 229 183 277 280 1 153 155 186 217 6 348 135 500 219 +6654 /data/VOCdevkit/VOC2012/JPEGImages/2008_003330.jpg 270 360 14 1 71 270 360 +6655 /data/VOCdevkit/VOC2012/JPEGImages/2008_003331.jpg 331 500 11 84 206 266 304 +6656 /data/VOCdevkit/VOC2012/JPEGImages/2008_003333.jpg 400 300 6 290 79 400 174 13 115 141 310 271 14 204 67 292 235 +6657 /data/VOCdevkit/VOC2012/JPEGImages/2008_003334.jpg 400 300 14 100 56 189 212 13 84 131 234 251 +6658 /data/VOCdevkit/VOC2012/JPEGImages/2008_003335.jpg 375 500 14 90 25 375 500 14 1 161 68 307 +6659 /data/VOCdevkit/VOC2012/JPEGImages/2008_003336.jpg 500 375 14 105 248 258 375 14 1 200 137 375 +6660 /data/VOCdevkit/VOC2012/JPEGImages/2008_003338.jpg 500 375 14 411 24 500 369 14 1 169 55 375 14 75 99 184 308 14 1 68 84 312 14 210 21 289 192 14 384 44 421 114 14 149 108 271 320 14 322 41 422 320 +6661 /data/VOCdevkit/VOC2012/JPEGImages/2008_003342.jpg 500 375 14 45 1 243 375 14 446 160 500 233 14 405 143 438 179 14 215 1 412 375 +6662 /data/VOCdevkit/VOC2012/JPEGImages/2008_003343.jpg 500 375 7 60 1 500 322 +6663 /data/VOCdevkit/VOC2012/JPEGImages/2008_003344.jpg 498 500 12 211 80 444 361 14 244 20 362 276 14 34 70 188 457 +6664 /data/VOCdevkit/VOC2012/JPEGImages/2008_003347.jpg 500 382 11 136 49 402 283 +6665 /data/VOCdevkit/VOC2012/JPEGImages/2008_003348.jpg 500 500 19 201 117 293 215 +6666 /data/VOCdevkit/VOC2012/JPEGImages/2008_003350.jpg 500 374 6 160 133 200 163 6 62 138 88 153 +6667 /data/VOCdevkit/VOC2012/JPEGImages/2008_003351.jpg 500 374 1 421 105 500 205 8 371 139 456 241 1 307 117 361 233 14 276 32 336 226 +6668 /data/VOCdevkit/VOC2012/JPEGImages/2008_003359.jpg 500 375 14 112 97 260 375 +6669 /data/VOCdevkit/VOC2012/JPEGImages/2008_003360.jpg 500 332 2 153 56 397 258 +6670 /data/VOCdevkit/VOC2012/JPEGImages/2008_003361.jpg 500 375 14 83 100 226 375 14 275 70 486 375 +6671 /data/VOCdevkit/VOC2012/JPEGImages/2008_003362.jpg 500 375 3 256 52 495 143 +6672 /data/VOCdevkit/VOC2012/JPEGImages/2008_003369.jpg 500 333 0 1 104 500 272 +6673 /data/VOCdevkit/VOC2012/JPEGImages/2008_003373.jpg 500 375 5 55 132 449 265 5 1 153 62 241 +6674 /data/VOCdevkit/VOC2012/JPEGImages/2008_003374.jpg 400 88 11 7 23 103 84 11 363 3 379 34 +6675 /data/VOCdevkit/VOC2012/JPEGImages/2008_003378.jpg 500 375 6 398 238 440 276 6 313 241 354 273 8 68 261 113 334 +6676 /data/VOCdevkit/VOC2012/JPEGImages/2008_003379.jpg 500 333 12 83 87 325 287 14 189 32 264 187 +6677 /data/VOCdevkit/VOC2012/JPEGImages/2008_003380.jpg 500 333 12 251 186 299 214 +6678 /data/VOCdevkit/VOC2012/JPEGImages/2008_003381.jpg 500 375 5 32 160 430 270 +6679 /data/VOCdevkit/VOC2012/JPEGImages/2008_003382.jpg 359 500 2 21 32 343 500 +6680 /data/VOCdevkit/VOC2012/JPEGImages/2008_003384.jpg 375 500 14 42 37 314 500 +6681 /data/VOCdevkit/VOC2012/JPEGImages/2008_003386.jpg 500 381 7 115 6 494 381 +6682 /data/VOCdevkit/VOC2012/JPEGImages/2008_003393.jpg 375 500 17 68 155 375 491 14 266 169 375 490 14 115 110 328 500 +6683 /data/VOCdevkit/VOC2012/JPEGImages/2008_003394.jpg 500 375 13 1 1 500 375 +6684 /data/VOCdevkit/VOC2012/JPEGImages/2008_003395.jpg 375 500 14 123 303 231 497 1 113 372 264 497 +6685 /data/VOCdevkit/VOC2012/JPEGImages/2008_003402.jpg 500 375 3 92 180 200 228 14 118 163 182 198 +6686 /data/VOCdevkit/VOC2012/JPEGImages/2008_003405.jpg 500 292 6 143 103 189 118 6 196 102 244 116 6 260 102 306 117 6 325 103 450 147 14 1 105 96 292 +6687 /data/VOCdevkit/VOC2012/JPEGImages/2008_003406.jpg 500 375 14 371 311 392 372 14 77 276 100 320 +6688 /data/VOCdevkit/VOC2012/JPEGImages/2008_003407.jpg 500 293 14 1 107 105 282 8 9 182 90 288 14 102 129 149 188 14 142 73 217 293 14 321 173 409 293 14 354 174 409 237 14 422 171 500 249 14 232 141 294 293 14 216 149 244 209 +6689 /data/VOCdevkit/VOC2012/JPEGImages/2008_003409.jpg 500 375 14 229 17 500 375 +6690 /data/VOCdevkit/VOC2012/JPEGImages/2008_003414.jpg 500 500 18 35 84 369 462 14 348 284 399 422 +6691 /data/VOCdevkit/VOC2012/JPEGImages/2008_003415.jpg 500 375 6 1 85 500 285 +6692 /data/VOCdevkit/VOC2012/JPEGImages/2008_003417.jpg 366 500 11 1 299 210 476 11 75 175 186 266 14 1 117 68 267 14 1 13 51 174 14 103 7 366 491 +6693 /data/VOCdevkit/VOC2012/JPEGImages/2008_003418.jpg 500 375 14 50 1 500 375 +6694 /data/VOCdevkit/VOC2012/JPEGImages/2008_003420.jpg 500 375 7 122 33 313 373 +6695 /data/VOCdevkit/VOC2012/JPEGImages/2008_003423.jpg 500 333 0 1 40 500 275 +6696 /data/VOCdevkit/VOC2012/JPEGImages/2008_003424.jpg 500 333 14 329 3 493 333 14 448 1 500 131 14 183 43 354 333 +6697 /data/VOCdevkit/VOC2012/JPEGImages/2008_003426.jpg 500 333 2 47 14 373 333 +6698 /data/VOCdevkit/VOC2012/JPEGImages/2008_003429.jpg 500 375 14 159 170 193 228 14 317 141 423 325 14 386 173 452 308 13 252 211 486 360 +6699 /data/VOCdevkit/VOC2012/JPEGImages/2008_003430.jpg 500 375 7 69 25 269 289 7 243 55 500 375 +6700 /data/VOCdevkit/VOC2012/JPEGImages/2008_003432.jpg 500 375 14 288 71 492 301 8 286 185 469 358 19 44 100 141 189 19 146 91 234 175 19 221 84 308 171 19 306 85 391 164 19 198 38 279 93 +6701 /data/VOCdevkit/VOC2012/JPEGImages/2008_003433.jpg 480 301 14 292 144 388 301 +6702 /data/VOCdevkit/VOC2012/JPEGImages/2008_003434.jpg 500 375 19 216 68 458 231 15 60 264 120 322 15 17 126 98 296 +6703 /data/VOCdevkit/VOC2012/JPEGImages/2008_003435.jpg 500 375 19 32 13 500 360 +6704 /data/VOCdevkit/VOC2012/JPEGImages/2008_003437.jpg 500 374 14 1 16 324 374 14 279 74 500 374 +6705 /data/VOCdevkit/VOC2012/JPEGImages/2008_003439.jpg 500 389 2 149 52 277 343 +6706 /data/VOCdevkit/VOC2012/JPEGImages/2008_003442.jpg 320 500 14 74 142 142 380 14 142 162 218 355 8 101 277 173 356 +6707 /data/VOCdevkit/VOC2012/JPEGImages/2008_003443.jpg 500 333 11 1 43 500 333 +6708 /data/VOCdevkit/VOC2012/JPEGImages/2008_003447.jpg 500 405 12 118 82 393 366 +6709 /data/VOCdevkit/VOC2012/JPEGImages/2008_003448.jpg 375 500 14 60 224 233 304 8 78 101 273 365 +6710 /data/VOCdevkit/VOC2012/JPEGImages/2008_003449.jpg 500 375 3 113 206 316 375 3 340 95 393 146 3 286 90 343 128 3 427 167 500 257 3 64 107 122 135 3 89 97 363 244 +6711 /data/VOCdevkit/VOC2012/JPEGImages/2008_003451.jpg 500 399 13 152 195 390 386 14 224 70 378 375 +6712 /data/VOCdevkit/VOC2012/JPEGImages/2008_003452.jpg 500 375 6 1 42 477 307 6 225 33 441 136 14 435 48 475 138 14 188 44 231 85 14 171 44 202 89 14 152 47 176 89 +6713 /data/VOCdevkit/VOC2012/JPEGImages/2008_003453.jpg 500 375 14 1 1 435 375 +6714 /data/VOCdevkit/VOC2012/JPEGImages/2008_003458.jpg 500 375 3 76 54 413 241 3 1 99 151 241 +6715 /data/VOCdevkit/VOC2012/JPEGImages/2008_003461.jpg 448 336 14 133 66 198 293 14 333 86 390 230 12 36 149 333 336 12 313 118 448 309 +6716 /data/VOCdevkit/VOC2012/JPEGImages/2008_003462.jpg 500 315 2 330 70 484 162 2 23 47 164 143 +6717 /data/VOCdevkit/VOC2012/JPEGImages/2008_003463.jpg 500 332 4 257 152 368 206 4 192 158 259 253 14 113 84 354 332 +6718 /data/VOCdevkit/VOC2012/JPEGImages/2008_003464.jpg 318 480 14 1 84 285 467 +6719 /data/VOCdevkit/VOC2012/JPEGImages/2008_003466.jpg 500 375 19 128 73 357 287 15 448 1 500 262 +6720 /data/VOCdevkit/VOC2012/JPEGImages/2008_003467.jpg 500 375 4 13 11 168 325 14 13 24 500 375 +6721 /data/VOCdevkit/VOC2012/JPEGImages/2008_003469.jpg 500 333 14 170 73 307 333 14 309 95 497 333 14 4 36 211 333 +6722 /data/VOCdevkit/VOC2012/JPEGImages/2008_003472.jpg 500 375 14 188 32 480 375 8 170 107 396 374 +6723 /data/VOCdevkit/VOC2012/JPEGImages/2008_003475.jpg 500 314 0 21 81 127 104 0 95 107 272 151 0 151 130 492 220 +6724 /data/VOCdevkit/VOC2012/JPEGImages/2008_003476.jpg 500 333 14 62 120 104 179 +6725 /data/VOCdevkit/VOC2012/JPEGImages/2008_003477.jpg 500 375 10 1 195 500 375 +6726 /data/VOCdevkit/VOC2012/JPEGImages/2008_003478.jpg 500 375 0 1 46 220 121 14 272 56 304 157 14 303 55 353 175 +6727 /data/VOCdevkit/VOC2012/JPEGImages/2008_003479.jpg 375 500 6 229 109 375 293 6 1 70 132 243 13 55 139 305 469 14 72 24 279 333 +6728 /data/VOCdevkit/VOC2012/JPEGImages/2008_003480.jpg 500 375 3 44 150 264 238 +6729 /data/VOCdevkit/VOC2012/JPEGImages/2008_003482.jpg 500 375 14 281 205 372 375 14 388 193 492 375 +6730 /data/VOCdevkit/VOC2012/JPEGImages/2008_003483.jpg 500 500 14 304 118 483 500 +6731 /data/VOCdevkit/VOC2012/JPEGImages/2008_003484.jpg 500 365 2 372 80 482 329 2 12 16 87 191 +6732 /data/VOCdevkit/VOC2012/JPEGImages/2008_003485.jpg 500 375 2 172 262 265 329 2 21 252 153 306 2 141 226 221 262 2 42 232 143 264 2 269 198 345 229 2 425 170 470 212 2 345 204 426 238 2 350 222 409 264 2 321 170 361 214 2 222 183 262 236 2 358 177 391 207 +6733 /data/VOCdevkit/VOC2012/JPEGImages/2008_003488.jpg 500 375 14 183 53 270 355 14 261 44 348 374 +6734 /data/VOCdevkit/VOC2012/JPEGImages/2008_003489.jpg 332 500 6 261 452 324 500 5 127 406 256 493 +6735 /data/VOCdevkit/VOC2012/JPEGImages/2008_003492.jpg 400 500 14 99 9 346 500 +6736 /data/VOCdevkit/VOC2012/JPEGImages/2008_003493.jpg 480 360 14 272 28 407 360 14 153 36 272 358 14 104 62 173 354 14 1 148 80 321 +6737 /data/VOCdevkit/VOC2012/JPEGImages/2008_003496.jpg 500 375 14 105 201 317 375 14 232 95 396 375 +6738 /data/VOCdevkit/VOC2012/JPEGImages/2008_003497.jpg 500 318 11 202 46 281 104 11 72 48 145 122 +6739 /data/VOCdevkit/VOC2012/JPEGImages/2008_003498.jpg 500 375 6 1 280 107 326 6 164 291 222 319 +6740 /data/VOCdevkit/VOC2012/JPEGImages/2008_003499.jpg 500 375 7 97 31 486 363 +6741 /data/VOCdevkit/VOC2012/JPEGImages/2008_003500.jpg 375 500 19 1 19 366 339 +6742 /data/VOCdevkit/VOC2012/JPEGImages/2008_003501.jpg 375 500 7 44 145 280 409 8 1 1 375 500 +6743 /data/VOCdevkit/VOC2012/JPEGImages/2008_003504.jpg 500 375 8 141 88 415 375 +6744 /data/VOCdevkit/VOC2012/JPEGImages/2008_003507.jpg 500 375 14 112 1 483 375 +6745 /data/VOCdevkit/VOC2012/JPEGImages/2008_003510.jpg 500 375 14 16 97 171 375 14 282 80 500 375 14 197 125 345 375 +6746 /data/VOCdevkit/VOC2012/JPEGImages/2008_003511.jpg 500 375 11 109 152 201 316 11 155 46 210 76 14 236 26 453 375 +6747 /data/VOCdevkit/VOC2012/JPEGImages/2008_003514.jpg 500 375 14 62 106 115 181 14 65 117 205 359 14 192 138 278 375 14 230 121 287 361 14 231 43 352 241 14 342 64 403 256 4 257 166 278 195 4 264 173 285 201 +6748 /data/VOCdevkit/VOC2012/JPEGImages/2008_003515.jpg 500 375 14 1 43 219 375 14 271 66 500 375 +6749 /data/VOCdevkit/VOC2012/JPEGImages/2008_003519.jpg 500 375 7 159 57 354 309 +6750 /data/VOCdevkit/VOC2012/JPEGImages/2008_003520.jpg 500 375 11 100 42 451 375 +6751 /data/VOCdevkit/VOC2012/JPEGImages/2008_003521.jpg 500 335 11 1 36 316 305 14 248 108 426 335 +6752 /data/VOCdevkit/VOC2012/JPEGImages/2008_003522.jpg 500 333 14 45 3 426 333 +6753 /data/VOCdevkit/VOC2012/JPEGImages/2008_003523.jpg 375 500 15 218 235 375 500 15 73 308 267 500 14 112 105 271 361 +6754 /data/VOCdevkit/VOC2012/JPEGImages/2008_003524.jpg 500 400 2 115 80 392 313 +6755 /data/VOCdevkit/VOC2012/JPEGImages/2008_003526.jpg 500 375 14 414 144 437 174 14 438 134 472 178 14 410 269 433 334 14 433 277 453 342 14 63 72 239 375 14 202 55 368 375 +6756 /data/VOCdevkit/VOC2012/JPEGImages/2008_003531.jpg 375 500 14 66 71 191 401 +6757 /data/VOCdevkit/VOC2012/JPEGImages/2008_003533.jpg 371 500 14 1 135 271 500 14 150 57 280 391 +6758 /data/VOCdevkit/VOC2012/JPEGImages/2008_003534.jpg 500 375 14 11 121 161 375 14 38 192 193 375 14 280 125 394 263 14 388 121 500 301 10 142 225 500 375 +6759 /data/VOCdevkit/VOC2012/JPEGImages/2008_003542.jpg 375 500 14 51 73 309 500 +6760 /data/VOCdevkit/VOC2012/JPEGImages/2008_003544.jpg 375 500 14 156 181 343 500 14 88 82 334 500 14 92 104 204 239 +6761 /data/VOCdevkit/VOC2012/JPEGImages/2008_003545.jpg 375 500 14 1 74 170 500 14 97 35 375 500 +6762 /data/VOCdevkit/VOC2012/JPEGImages/2008_003546.jpg 500 375 14 37 65 196 375 14 187 92 294 296 14 299 60 414 267 +6763 /data/VOCdevkit/VOC2012/JPEGImages/2008_003547.jpg 375 500 8 1 227 116 459 15 121 1 325 110 +6764 /data/VOCdevkit/VOC2012/JPEGImages/2008_003552.jpg 500 333 14 222 132 290 239 +6765 /data/VOCdevkit/VOC2012/JPEGImages/2008_003557.jpg 500 375 7 116 55 381 360 7 96 71 276 185 +6766 /data/VOCdevkit/VOC2012/JPEGImages/2008_003559.jpg 500 394 7 88 21 439 276 7 34 135 429 375 8 50 1 500 394 +6767 /data/VOCdevkit/VOC2012/JPEGImages/2008_003560.jpg 375 500 14 1 271 34 425 +6768 /data/VOCdevkit/VOC2012/JPEGImages/2008_003562.jpg 500 291 7 2 132 247 240 +6769 /data/VOCdevkit/VOC2012/JPEGImages/2008_003565.jpg 500 375 14 281 128 428 375 14 174 109 283 375 14 43 101 181 375 14 21 131 81 321 +6770 /data/VOCdevkit/VOC2012/JPEGImages/2008_003571.jpg 500 333 18 105 157 366 252 +6771 /data/VOCdevkit/VOC2012/JPEGImages/2008_003572.jpg 500 334 11 162 92 307 212 +6772 /data/VOCdevkit/VOC2012/JPEGImages/2008_003575.jpg 500 375 0 1 90 500 293 +6773 /data/VOCdevkit/VOC2012/JPEGImages/2008_003576.jpg 500 333 11 183 63 404 320 +6774 /data/VOCdevkit/VOC2012/JPEGImages/2008_003577.jpg 500 375 6 1 7 500 375 6 1 59 209 230 +6775 /data/VOCdevkit/VOC2012/JPEGImages/2008_003578.jpg 500 333 18 1 1 479 333 14 373 94 414 232 14 420 86 473 230 14 402 77 442 219 +6776 /data/VOCdevkit/VOC2012/JPEGImages/2008_003579.jpg 333 500 4 81 63 277 500 4 5 1 112 380 4 206 1 333 241 4 127 1 242 132 +6777 /data/VOCdevkit/VOC2012/JPEGImages/2008_003580.jpg 500 375 2 181 37 361 375 2 338 24 442 59 2 32 199 191 356 2 1 288 50 358 +6778 /data/VOCdevkit/VOC2012/JPEGImages/2008_003582.jpg 500 375 6 263 14 391 59 6 146 17 228 58 6 86 30 144 59 6 41 31 99 59 6 1 39 77 145 6 33 58 487 312 +6779 /data/VOCdevkit/VOC2012/JPEGImages/2008_003585.jpg 500 375 19 1 24 297 325 +6780 /data/VOCdevkit/VOC2012/JPEGImages/2008_003587.jpg 500 375 11 172 87 415 375 14 1 1 202 375 +6781 /data/VOCdevkit/VOC2012/JPEGImages/2008_003589.jpg 500 375 19 215 254 277 326 +6782 /data/VOCdevkit/VOC2012/JPEGImages/2008_003590.jpg 500 375 13 27 15 411 375 +6783 /data/VOCdevkit/VOC2012/JPEGImages/2008_003591.jpg 500 375 4 346 1 478 290 +6784 /data/VOCdevkit/VOC2012/JPEGImages/2008_003592.jpg 500 315 14 1 5 483 315 +6785 /data/VOCdevkit/VOC2012/JPEGImages/2008_003593.jpg 375 500 14 66 95 320 500 +6786 /data/VOCdevkit/VOC2012/JPEGImages/2008_003596.jpg 333 500 12 87 148 243 480 14 92 15 197 246 14 166 154 333 470 +6787 /data/VOCdevkit/VOC2012/JPEGImages/2008_003598.jpg 288 192 14 4 32 272 183 +6788 /data/VOCdevkit/VOC2012/JPEGImages/2008_003604.jpg 322 484 14 100 101 180 326 +6789 /data/VOCdevkit/VOC2012/JPEGImages/2008_003607.jpg 500 375 17 6 186 481 375 11 305 242 459 375 11 56 232 194 308 7 163 272 275 325 +6790 /data/VOCdevkit/VOC2012/JPEGImages/2008_003608.jpg 375 500 14 1 2 375 500 14 145 24 375 500 +6791 /data/VOCdevkit/VOC2012/JPEGImages/2008_003609.jpg 500 363 14 328 132 500 363 14 66 112 342 344 14 1 131 186 293 19 255 15 409 139 +6792 /data/VOCdevkit/VOC2012/JPEGImages/2008_003610.jpg 500 375 14 46 77 100 307 14 35 131 128 324 14 186 18 450 375 14 177 106 288 375 +6793 /data/VOCdevkit/VOC2012/JPEGImages/2008_003611.jpg 500 375 14 97 1 482 375 14 79 1 247 272 +6794 /data/VOCdevkit/VOC2012/JPEGImages/2008_003613.jpg 500 390 14 133 172 218 342 +6795 /data/VOCdevkit/VOC2012/JPEGImages/2008_003617.jpg 375 500 14 46 3 221 500 1 1 295 79 394 +6796 /data/VOCdevkit/VOC2012/JPEGImages/2008_003618.jpg 500 375 13 333 188 500 375 13 159 151 334 260 +6797 /data/VOCdevkit/VOC2012/JPEGImages/2008_003619.jpg 500 374 14 273 204 500 374 14 311 57 500 277 14 79 55 183 210 +6798 /data/VOCdevkit/VOC2012/JPEGImages/2008_003621.jpg 500 375 4 458 151 472 198 +6799 /data/VOCdevkit/VOC2012/JPEGImages/2008_003622.jpg 500 433 7 57 12 500 374 +6800 /data/VOCdevkit/VOC2012/JPEGImages/2008_003624.jpg 500 375 7 36 96 467 355 +6801 /data/VOCdevkit/VOC2012/JPEGImages/2008_003626.jpg 500 375 14 189 155 275 274 +6802 /data/VOCdevkit/VOC2012/JPEGImages/2008_003629.jpg 500 375 8 254 154 298 236 14 162 86 192 208 +6803 /data/VOCdevkit/VOC2012/JPEGImages/2008_003635.jpg 500 333 4 329 165 387 333 14 55 61 198 281 14 187 72 349 277 14 303 97 344 134 14 344 98 382 148 14 349 88 431 191 +6804 /data/VOCdevkit/VOC2012/JPEGImages/2008_003636.jpg 375 500 15 1 1 375 500 +6805 /data/VOCdevkit/VOC2012/JPEGImages/2008_003637.jpg 500 375 13 155 131 498 347 13 1 101 291 276 +6806 /data/VOCdevkit/VOC2012/JPEGImages/2008_003638.jpg 333 500 14 75 103 273 500 +6807 /data/VOCdevkit/VOC2012/JPEGImages/2008_003645.jpg 500 474 11 5 63 436 470 +6808 /data/VOCdevkit/VOC2012/JPEGImages/2008_003647.jpg 500 375 6 1 1 500 375 +6809 /data/VOCdevkit/VOC2012/JPEGImages/2008_003650.jpg 500 375 14 227 100 353 275 14 152 80 239 280 14 58 90 222 375 14 236 88 500 368 14 234 103 312 223 +6810 /data/VOCdevkit/VOC2012/JPEGImages/2008_003652.jpg 500 375 3 233 278 343 324 +6811 /data/VOCdevkit/VOC2012/JPEGImages/2008_003653.jpg 500 375 14 334 150 404 373 14 23 181 54 252 14 99 199 132 257 +6812 /data/VOCdevkit/VOC2012/JPEGImages/2008_003655.jpg 500 332 0 1 173 417 263 +6813 /data/VOCdevkit/VOC2012/JPEGImages/2008_003658.jpg 375 500 14 76 76 318 374 +6814 /data/VOCdevkit/VOC2012/JPEGImages/2008_003659.jpg 500 375 7 162 1 410 375 +6815 /data/VOCdevkit/VOC2012/JPEGImages/2008_003662.jpg 281 500 14 107 379 142 468 +6816 /data/VOCdevkit/VOC2012/JPEGImages/2008_003665.jpg 500 375 11 29 58 414 375 15 70 1 181 65 +6817 /data/VOCdevkit/VOC2012/JPEGImages/2008_003667.jpg 375 500 19 39 211 293 429 14 72 242 275 373 8 314 303 375 500 +6818 /data/VOCdevkit/VOC2012/JPEGImages/2008_003671.jpg 375 500 14 73 110 284 500 +6819 /data/VOCdevkit/VOC2012/JPEGImages/2008_003672.jpg 333 500 14 1 73 310 495 14 26 1 175 290 14 112 1 333 356 +6820 /data/VOCdevkit/VOC2012/JPEGImages/2008_003673.jpg 500 334 0 27 64 497 197 5 283 186 355 216 6 20 274 114 325 6 244 214 272 241 +6821 /data/VOCdevkit/VOC2012/JPEGImages/2008_003674.jpg 320 213 14 121 75 209 213 14 134 48 210 213 +6822 /data/VOCdevkit/VOC2012/JPEGImages/2008_003675.jpg 500 375 14 209 62 500 375 14 1 96 235 375 +6823 /data/VOCdevkit/VOC2012/JPEGImages/2008_003676.jpg 500 375 15 282 40 382 117 14 246 154 347 375 14 164 120 261 375 15 16 249 84 328 15 389 151 469 283 +6824 /data/VOCdevkit/VOC2012/JPEGImages/2008_003677.jpg 500 348 14 216 52 315 221 12 68 83 403 301 +6825 /data/VOCdevkit/VOC2012/JPEGImages/2008_003680.jpg 500 375 6 69 212 260 267 6 97 232 293 288 6 115 189 240 226 6 186 192 257 224 6 381 176 442 207 6 468 191 500 222 6 409 183 447 214 6 82 252 288 322 +6826 /data/VOCdevkit/VOC2012/JPEGImages/2008_003681.jpg 279 424 14 38 52 240 424 8 72 226 249 424 +6827 /data/VOCdevkit/VOC2012/JPEGImages/2008_003682.jpg 500 333 1 255 163 399 333 1 1 201 82 333 14 279 47 394 321 +6828 /data/VOCdevkit/VOC2012/JPEGImages/2008_003683.jpg 333 500 2 215 133 314 352 +6829 /data/VOCdevkit/VOC2012/JPEGImages/2008_003684.jpg 500 375 14 318 183 426 375 14 263 194 335 375 14 291 129 366 194 14 229 95 302 237 14 208 168 274 317 14 153 186 233 320 14 58 171 137 320 14 138 171 184 251 14 3 167 70 360 +6830 /data/VOCdevkit/VOC2012/JPEGImages/2008_003685.jpg 500 333 6 1 75 496 294 14 194 34 314 312 +6831 /data/VOCdevkit/VOC2012/JPEGImages/2008_003688.jpg 500 375 0 87 146 438 282 0 420 207 500 267 +6832 /data/VOCdevkit/VOC2012/JPEGImages/2008_003689.jpg 500 375 14 264 99 396 375 8 1 296 230 375 8 356 261 500 375 15 349 33 410 79 8 244 219 399 362 8 364 157 466 271 +6833 /data/VOCdevkit/VOC2012/JPEGImages/2008_003691.jpg 500 375 5 121 94 468 304 6 471 174 500 206 +6834 /data/VOCdevkit/VOC2012/JPEGImages/2008_003694.jpg 500 471 2 284 144 396 225 2 66 219 211 355 +6835 /data/VOCdevkit/VOC2012/JPEGImages/2008_003697.jpg 375 500 14 135 166 217 500 14 298 190 375 482 +6836 /data/VOCdevkit/VOC2012/JPEGImages/2008_003701.jpg 500 375 3 95 78 487 283 +6837 /data/VOCdevkit/VOC2012/JPEGImages/2008_003703.jpg 500 337 0 15 83 488 217 +6838 /data/VOCdevkit/VOC2012/JPEGImages/2008_003704.jpg 500 400 7 1 1 500 400 +6839 /data/VOCdevkit/VOC2012/JPEGImages/2008_003706.jpg 500 333 14 49 1 500 333 +6840 /data/VOCdevkit/VOC2012/JPEGImages/2008_003707.jpg 500 375 14 1 1 464 375 14 274 33 500 375 +6841 /data/VOCdevkit/VOC2012/JPEGImages/2008_003709.jpg 500 333 17 156 146 316 243 17 292 188 499 333 +6842 /data/VOCdevkit/VOC2012/JPEGImages/2008_003712.jpg 429 500 14 104 211 319 500 14 265 226 397 500 14 76 53 429 364 19 88 1 215 46 19 90 190 150 280 +6843 /data/VOCdevkit/VOC2012/JPEGImages/2008_003713.jpg 500 371 1 14 1 444 371 +6844 /data/VOCdevkit/VOC2012/JPEGImages/2008_003718.jpg 500 375 11 147 9 326 375 +6845 /data/VOCdevkit/VOC2012/JPEGImages/2008_003719.jpg 500 375 6 230 209 337 298 +6846 /data/VOCdevkit/VOC2012/JPEGImages/2008_003720.jpg 337 500 14 1 124 336 500 +6847 /data/VOCdevkit/VOC2012/JPEGImages/2008_003721.jpg 402 500 14 195 90 362 500 14 62 1 251 500 +6848 /data/VOCdevkit/VOC2012/JPEGImages/2008_003722.jpg 375 500 4 232 151 299 287 4 80 203 146 343 14 63 107 298 500 +6849 /data/VOCdevkit/VOC2012/JPEGImages/2008_003726.jpg 500 382 8 20 95 274 382 7 1 78 281 343 15 351 1 500 218 +6850 /data/VOCdevkit/VOC2012/JPEGImages/2008_003729.jpg 500 230 0 46 54 455 201 +6851 /data/VOCdevkit/VOC2012/JPEGImages/2008_003732.jpg 500 375 14 165 101 233 220 14 224 57 284 159 14 218 159 371 375 14 280 80 392 336 15 78 60 104 104 15 99 30 124 99 +6852 /data/VOCdevkit/VOC2012/JPEGImages/2008_003733.jpg 375 500 14 184 178 375 500 14 52 110 356 500 +6853 /data/VOCdevkit/VOC2012/JPEGImages/2008_003737.jpg 500 373 18 44 151 110 192 +6854 /data/VOCdevkit/VOC2012/JPEGImages/2008_003743.jpg 500 375 0 93 137 472 298 +6855 /data/VOCdevkit/VOC2012/JPEGImages/2008_003744.jpg 500 375 0 1 68 500 375 +6856 /data/VOCdevkit/VOC2012/JPEGImages/2008_003745.jpg 500 334 14 275 64 395 294 14 82 70 388 334 +6857 /data/VOCdevkit/VOC2012/JPEGImages/2008_003746.jpg 500 375 11 118 24 398 375 +6858 /data/VOCdevkit/VOC2012/JPEGImages/2008_003748.jpg 500 309 14 171 155 227 309 14 75 156 147 309 14 110 179 148 249 14 135 148 164 231 +6859 /data/VOCdevkit/VOC2012/JPEGImages/2008_003749.jpg 500 389 14 72 5 500 389 +6860 /data/VOCdevkit/VOC2012/JPEGImages/2008_003753.jpg 500 375 19 322 186 376 236 8 248 225 349 375 8 102 224 160 375 8 164 215 238 329 8 150 213 193 320 10 1 250 190 375 +6861 /data/VOCdevkit/VOC2012/JPEGImages/2008_003754.jpg 459 288 14 129 36 364 288 +6862 /data/VOCdevkit/VOC2012/JPEGImages/2008_003755.jpg 500 375 6 39 121 294 367 14 321 16 454 375 14 250 51 389 375 11 238 166 320 279 +6863 /data/VOCdevkit/VOC2012/JPEGImages/2008_003756.jpg 470 399 14 73 105 148 360 14 146 122 206 344 14 218 160 274 330 14 359 83 419 326 14 194 108 250 329 14 298 81 370 310 +6864 /data/VOCdevkit/VOC2012/JPEGImages/2008_003761.jpg 375 500 14 69 35 205 183 14 160 48 354 168 +6865 /data/VOCdevkit/VOC2012/JPEGImages/2008_003762.jpg 500 375 14 218 155 370 375 14 124 31 500 375 8 37 110 235 375 +6866 /data/VOCdevkit/VOC2012/JPEGImages/2008_003763.jpg 500 375 2 106 49 382 375 +6867 /data/VOCdevkit/VOC2012/JPEGImages/2008_003764.jpg 500 375 14 119 79 328 375 14 241 101 404 375 6 437 166 500 207 6 367 163 442 207 6 338 167 378 204 6 71 156 165 222 6 1 185 37 214 6 40 174 62 195 +6868 /data/VOCdevkit/VOC2012/JPEGImages/2008_003766.jpg 415 500 14 32 127 232 500 +6869 /data/VOCdevkit/VOC2012/JPEGImages/2008_003767.jpg 400 300 15 1 1 400 300 +6870 /data/VOCdevkit/VOC2012/JPEGImages/2008_003768.jpg 500 343 1 78 135 370 343 15 392 183 500 291 15 1 159 82 307 14 203 8 278 342 +6871 /data/VOCdevkit/VOC2012/JPEGImages/2008_003769.jpg 500 311 13 135 88 274 227 14 127 33 252 173 14 342 149 419 239 +6872 /data/VOCdevkit/VOC2012/JPEGImages/2008_003772.jpg 500 375 7 102 88 290 375 7 223 105 417 357 +6873 /data/VOCdevkit/VOC2012/JPEGImages/2008_003773.jpg 334 500 14 113 97 282 500 +6874 /data/VOCdevkit/VOC2012/JPEGImages/2008_003774.jpg 500 333 10 31 195 225 333 8 110 187 222 333 8 37 169 143 331 +6875 /data/VOCdevkit/VOC2012/JPEGImages/2008_003775.jpg 500 375 6 113 171 164 211 14 320 63 488 337 14 158 110 298 338 14 161 143 299 340 +6876 /data/VOCdevkit/VOC2012/JPEGImages/2008_003776.jpg 500 462 11 271 193 397 334 7 156 157 245 268 +6877 /data/VOCdevkit/VOC2012/JPEGImages/2008_003777.jpg 432 288 5 140 1 432 288 5 80 112 142 223 5 65 153 90 193 +6878 /data/VOCdevkit/VOC2012/JPEGImages/2008_003779.jpg 500 375 14 212 31 483 375 14 113 182 204 318 +6879 /data/VOCdevkit/VOC2012/JPEGImages/2008_003780.jpg 500 375 14 288 114 411 375 14 163 168 301 375 14 242 102 297 171 14 214 118 251 173 14 84 119 216 375 14 177 118 217 175 +6880 /data/VOCdevkit/VOC2012/JPEGImages/2008_003781.jpg 333 500 14 141 214 217 445 14 203 217 263 400 14 125 221 158 399 14 59 241 111 362 +6881 /data/VOCdevkit/VOC2012/JPEGImages/2008_003782.jpg 500 375 12 82 143 389 349 +6882 /data/VOCdevkit/VOC2012/JPEGImages/2008_003788.jpg 500 333 0 13 86 488 236 +6883 /data/VOCdevkit/VOC2012/JPEGImages/2008_003789.jpg 340 500 2 86 45 288 431 2 60 208 220 470 +6884 /data/VOCdevkit/VOC2012/JPEGImages/2008_003791.jpg 356 500 14 103 47 349 500 14 17 129 153 500 6 1 1 222 76 +6885 /data/VOCdevkit/VOC2012/JPEGImages/2008_003793.jpg 500 371 14 312 194 500 371 14 226 182 362 371 14 153 168 308 371 +6886 /data/VOCdevkit/VOC2012/JPEGImages/2008_003794.jpg 400 300 14 360 174 387 218 6 177 169 228 214 6 131 185 162 209 6 237 183 304 208 6 25 184 100 209 +6887 /data/VOCdevkit/VOC2012/JPEGImages/2008_003796.jpg 500 375 14 310 121 463 375 14 393 98 448 199 14 295 98 372 192 14 20 103 147 342 14 93 115 169 231 14 136 107 222 217 8 87 282 248 375 8 339 218 485 375 4 283 181 302 252 4 202 163 218 206 10 68 175 347 375 +6888 /data/VOCdevkit/VOC2012/JPEGImages/2008_003799.jpg 500 400 11 148 106 389 300 +6889 /data/VOCdevkit/VOC2012/JPEGImages/2008_003800.jpg 500 375 12 66 133 233 295 14 187 88 500 375 +6890 /data/VOCdevkit/VOC2012/JPEGImages/2008_003801.jpg 500 375 14 1 1 238 375 11 181 104 445 375 11 208 1 360 129 +6891 /data/VOCdevkit/VOC2012/JPEGImages/2008_003802.jpg 500 331 12 178 119 370 245 12 38 97 197 245 12 1 114 77 240 14 268 106 321 166 14 90 91 151 162 +6892 /data/VOCdevkit/VOC2012/JPEGImages/2008_003805.jpg 500 389 14 241 9 434 374 14 1 222 186 389 12 108 114 494 389 +6893 /data/VOCdevkit/VOC2012/JPEGImages/2008_003811.jpg 500 375 5 311 36 500 134 6 225 125 397 196 6 1 83 43 116 6 113 79 188 121 6 108 60 167 89 6 142 22 175 38 6 179 26 218 45 6 244 31 276 48 6 283 45 316 82 6 157 10 187 23 6 172 18 207 34 +6894 /data/VOCdevkit/VOC2012/JPEGImages/2008_003812.jpg 375 500 1 111 1 375 500 +6895 /data/VOCdevkit/VOC2012/JPEGImages/2008_003813.jpg 500 336 14 211 54 395 211 14 259 99 375 336 +6896 /data/VOCdevkit/VOC2012/JPEGImages/2008_003814.jpg 500 335 19 434 184 500 268 17 1 205 169 335 +6897 /data/VOCdevkit/VOC2012/JPEGImages/2008_003815.jpg 500 375 14 1 114 315 375 14 260 154 378 375 15 313 42 500 259 +6898 /data/VOCdevkit/VOC2012/JPEGImages/2008_003819.jpg 500 375 1 293 186 422 261 1 146 187 242 254 1 65 187 137 244 1 1 189 48 242 14 322 134 394 245 14 160 143 216 248 14 74 155 115 236 14 1 158 30 218 14 459 134 487 203 14 430 144 451 201 14 416 132 434 196 14 392 135 414 198 14 307 143 322 202 14 221 143 243 196 14 58 154 69 197 14 47 154 59 197 +6899 /data/VOCdevkit/VOC2012/JPEGImages/2008_003820.jpg 480 360 13 1 86 424 360 14 57 1 214 360 +6900 /data/VOCdevkit/VOC2012/JPEGImages/2008_003821.jpg 333 500 8 33 163 231 493 +6901 /data/VOCdevkit/VOC2012/JPEGImages/2008_003825.jpg 500 417 19 1 345 269 417 14 23 60 184 314 14 172 297 241 351 14 272 12 404 416 14 350 24 422 414 14 371 1 500 416 14 81 360 148 417 +6902 /data/VOCdevkit/VOC2012/JPEGImages/2008_003826.jpg 500 375 18 67 166 209 271 18 213 134 406 268 +6903 /data/VOCdevkit/VOC2012/JPEGImages/2008_003827.jpg 500 375 13 20 61 473 299 +6904 /data/VOCdevkit/VOC2012/JPEGImages/2008_003829.jpg 500 375 6 1 108 54 143 14 1 107 16 165 14 21 105 44 164 +6905 /data/VOCdevkit/VOC2012/JPEGImages/2008_003830.jpg 300 234 14 29 23 149 218 +6906 /data/VOCdevkit/VOC2012/JPEGImages/2008_003831.jpg 500 375 2 62 52 341 252 +6907 /data/VOCdevkit/VOC2012/JPEGImages/2008_003835.jpg 375 500 6 227 408 295 442 6 311 410 373 432 +6908 /data/VOCdevkit/VOC2012/JPEGImages/2008_003838.jpg 500 342 11 206 100 312 295 8 65 11 500 342 8 382 13 500 186 15 1 1 120 162 +6909 /data/VOCdevkit/VOC2012/JPEGImages/2008_003840.jpg 500 375 3 6 166 63 190 3 1 1 413 375 14 327 288 350 375 14 282 294 311 369 14 416 347 447 375 +6910 /data/VOCdevkit/VOC2012/JPEGImages/2008_003841.jpg 500 332 7 236 12 470 300 +6911 /data/VOCdevkit/VOC2012/JPEGImages/2008_003842.jpg 500 375 14 228 94 300 223 +6912 /data/VOCdevkit/VOC2012/JPEGImages/2008_003843.jpg 333 500 14 69 42 264 491 14 71 73 161 498 +6913 /data/VOCdevkit/VOC2012/JPEGImages/2008_003844.jpg 500 338 13 269 108 345 197 6 437 102 500 196 6 114 107 288 190 6 13 120 173 189 6 331 119 385 155 6 1 134 43 154 14 95 138 245 299 +6914 /data/VOCdevkit/VOC2012/JPEGImages/2008_003846.jpg 500 375 6 17 86 477 292 +6915 /data/VOCdevkit/VOC2012/JPEGImages/2008_003847.jpg 500 375 14 133 199 405 375 14 410 192 500 375 +6916 /data/VOCdevkit/VOC2012/JPEGImages/2008_003849.jpg 500 375 3 14 6 375 342 3 383 310 420 328 3 365 185 411 214 +6917 /data/VOCdevkit/VOC2012/JPEGImages/2008_003852.jpg 500 375 11 175 126 341 240 +6918 /data/VOCdevkit/VOC2012/JPEGImages/2008_003854.jpg 500 375 14 394 190 440 263 6 324 142 438 216 +6919 /data/VOCdevkit/VOC2012/JPEGImages/2008_003856.jpg 500 375 14 96 125 340 375 +6920 /data/VOCdevkit/VOC2012/JPEGImages/2008_003858.jpg 500 375 3 5 99 500 283 +6921 /data/VOCdevkit/VOC2012/JPEGImages/2008_003860.jpg 500 375 14 130 33 410 375 6 73 144 157 206 6 1 134 107 201 +6922 /data/VOCdevkit/VOC2012/JPEGImages/2008_003864.jpg 500 375 14 375 55 500 375 +6923 /data/VOCdevkit/VOC2012/JPEGImages/2008_003866.jpg 500 338 14 169 89 327 309 14 323 1 473 287 +6924 /data/VOCdevkit/VOC2012/JPEGImages/2008_003868.jpg 500 333 6 301 139 500 287 6 138 124 395 241 14 138 100 307 333 +6925 /data/VOCdevkit/VOC2012/JPEGImages/2008_003870.jpg 500 375 3 143 117 209 204 3 209 114 263 194 3 278 162 332 203 3 245 122 268 145 3 184 182 287 323 +6926 /data/VOCdevkit/VOC2012/JPEGImages/2008_003871.jpg 500 375 14 72 26 371 375 +6927 /data/VOCdevkit/VOC2012/JPEGImages/2008_003873.jpg 500 375 14 77 108 332 375 14 215 76 497 375 14 456 60 500 259 14 106 166 152 249 +6928 /data/VOCdevkit/VOC2012/JPEGImages/2008_003874.jpg 346 336 14 4 40 157 336 14 168 15 344 323 +6929 /data/VOCdevkit/VOC2012/JPEGImages/2008_003876.jpg 500 333 0 3 112 498 213 +6930 /data/VOCdevkit/VOC2012/JPEGImages/2008_003881.jpg 500 375 14 183 160 295 342 14 261 92 376 375 14 155 91 279 375 8 366 226 473 369 10 333 213 485 366 8 423 198 482 285 +6931 /data/VOCdevkit/VOC2012/JPEGImages/2008_003882.jpg 380 378 14 51 33 380 378 +6932 /data/VOCdevkit/VOC2012/JPEGImages/2008_003883.jpg 500 375 19 137 1 350 109 14 237 95 320 244 +6933 /data/VOCdevkit/VOC2012/JPEGImages/2008_003884.jpg 320 500 14 52 146 246 480 +6934 /data/VOCdevkit/VOC2012/JPEGImages/2008_003885.jpg 500 375 19 129 47 444 308 +6935 /data/VOCdevkit/VOC2012/JPEGImages/2008_003886.jpg 500 377 3 90 114 459 219 +6936 /data/VOCdevkit/VOC2012/JPEGImages/2008_003888.jpg 400 284 6 13 107 395 227 11 100 173 156 248 14 232 94 310 235 +6937 /data/VOCdevkit/VOC2012/JPEGImages/2008_003891.jpg 500 375 14 146 178 212 360 14 208 182 266 364 14 224 196 301 371 +6938 /data/VOCdevkit/VOC2012/JPEGImages/2008_003892.jpg 500 333 14 129 87 265 279 13 29 122 389 306 +6939 /data/VOCdevkit/VOC2012/JPEGImages/2008_003894.jpg 500 375 2 36 82 459 278 +6940 /data/VOCdevkit/VOC2012/JPEGImages/2008_003904.jpg 375 500 10 1 302 375 500 8 8 268 125 315 8 132 265 255 324 4 155 164 166 186 +6941 /data/VOCdevkit/VOC2012/JPEGImages/2008_003905.jpg 500 333 0 7 41 491 261 +6942 /data/VOCdevkit/VOC2012/JPEGImages/2008_003908.jpg 374 500 14 47 137 357 500 14 165 37 346 369 +6943 /data/VOCdevkit/VOC2012/JPEGImages/2008_003913.jpg 332 500 3 70 91 301 427 +6944 /data/VOCdevkit/VOC2012/JPEGImages/2008_003914.jpg 375 500 8 82 111 341 465 14 81 82 356 494 +6945 /data/VOCdevkit/VOC2012/JPEGImages/2008_003915.jpg 480 360 14 295 47 480 360 14 1 46 480 360 14 1 62 193 360 +6946 /data/VOCdevkit/VOC2012/JPEGImages/2008_003916.jpg 375 500 14 1 73 167 500 14 88 59 375 500 +6947 /data/VOCdevkit/VOC2012/JPEGImages/2008_003920.jpg 500 375 14 129 90 374 375 +6948 /data/VOCdevkit/VOC2012/JPEGImages/2008_003921.jpg 500 375 14 135 183 218 276 14 213 181 292 280 14 289 187 375 281 +6949 /data/VOCdevkit/VOC2012/JPEGImages/2008_003922.jpg 500 281 11 252 70 395 281 11 117 30 239 177 +6950 /data/VOCdevkit/VOC2012/JPEGImages/2008_003924.jpg 500 334 5 92 47 433 295 5 372 95 459 218 5 480 89 500 217 5 1 82 236 262 6 458 179 484 195 +6951 /data/VOCdevkit/VOC2012/JPEGImages/2008_003925.jpg 500 333 14 405 126 434 193 14 342 151 368 279 14 317 170 350 298 14 240 172 286 302 14 279 156 319 299 6 73 166 125 200 6 112 165 143 190 6 160 163 180 179 6 117 159 148 187 14 219 155 248 285 +6952 /data/VOCdevkit/VOC2012/JPEGImages/2008_003926.jpg 500 313 0 1 51 489 224 +6953 /data/VOCdevkit/VOC2012/JPEGImages/2008_003929.jpg 500 375 14 129 89 375 375 14 102 62 307 338 +6954 /data/VOCdevkit/VOC2012/JPEGImages/2008_003932.jpg 500 375 7 49 1 404 375 +6955 /data/VOCdevkit/VOC2012/JPEGImages/2008_003933.jpg 500 375 14 126 66 312 326 +6956 /data/VOCdevkit/VOC2012/JPEGImages/2008_003939.jpg 375 500 13 97 336 279 469 +6957 /data/VOCdevkit/VOC2012/JPEGImages/2008_003940.jpg 500 375 14 174 86 395 375 1 1 1 142 375 1 10 1 313 375 +6958 /data/VOCdevkit/VOC2012/JPEGImages/2008_003941.jpg 375 500 6 17 331 48 355 +6959 /data/VOCdevkit/VOC2012/JPEGImages/2008_003942.jpg 500 375 2 9 99 327 264 +6960 /data/VOCdevkit/VOC2012/JPEGImages/2008_003943.jpg 500 333 6 69 110 402 223 +6961 /data/VOCdevkit/VOC2012/JPEGImages/2008_003944.jpg 500 333 11 29 24 334 303 11 177 42 473 297 +6962 /data/VOCdevkit/VOC2012/JPEGImages/2008_003945.jpg 500 322 14 82 71 233 322 14 238 73 405 322 +6963 /data/VOCdevkit/VOC2012/JPEGImages/2008_003947.jpg 500 333 14 113 134 237 262 +6964 /data/VOCdevkit/VOC2012/JPEGImages/2008_003948.jpg 500 375 19 48 149 279 310 19 269 125 465 275 +6965 /data/VOCdevkit/VOC2012/JPEGImages/2008_003951.jpg 500 375 14 98 201 147 327 14 142 205 197 338 3 320 92 391 122 +6966 /data/VOCdevkit/VOC2012/JPEGImages/2008_003956.jpg 500 375 14 158 91 193 140 14 157 100 235 261 14 222 94 262 125 14 185 100 374 375 14 20 67 228 375 14 210 51 500 375 +6967 /data/VOCdevkit/VOC2012/JPEGImages/2008_003958.jpg 390 500 14 1 1 350 500 +6968 /data/VOCdevkit/VOC2012/JPEGImages/2008_003962.jpg 500 375 14 247 140 304 304 +6969 /data/VOCdevkit/VOC2012/JPEGImages/2008_003965.jpg 500 375 14 124 64 474 375 14 1 14 153 282 14 354 59 456 217 14 73 73 200 324 +6970 /data/VOCdevkit/VOC2012/JPEGImages/2008_003966.jpg 500 333 14 215 75 321 306 +6971 /data/VOCdevkit/VOC2012/JPEGImages/2008_003967.jpg 500 375 14 265 33 465 375 14 106 186 225 337 14 66 63 231 375 8 420 152 500 363 +6972 /data/VOCdevkit/VOC2012/JPEGImages/2008_003969.jpg 500 375 4 34 88 163 375 +6973 /data/VOCdevkit/VOC2012/JPEGImages/2008_003970.jpg 500 375 6 385 169 500 280 +6974 /data/VOCdevkit/VOC2012/JPEGImages/2008_003971.jpg 500 333 14 154 54 332 333 14 390 102 500 333 +6975 /data/VOCdevkit/VOC2012/JPEGImages/2008_003974.jpg 500 500 7 67 1 500 500 +6976 /data/VOCdevkit/VOC2012/JPEGImages/2008_003975.jpg 500 333 11 1 1 500 332 +6977 /data/VOCdevkit/VOC2012/JPEGImages/2008_003976.jpg 500 345 0 13 90 494 224 +6978 /data/VOCdevkit/VOC2012/JPEGImages/2008_003978.jpg 500 377 11 92 120 348 302 14 145 86 351 377 15 340 125 418 173 15 265 115 279 156 +6979 /data/VOCdevkit/VOC2012/JPEGImages/2008_003983.jpg 500 375 14 1 39 336 375 14 154 205 331 375 14 221 101 500 375 +6980 /data/VOCdevkit/VOC2012/JPEGImages/2008_003984.jpg 500 375 14 4 27 436 375 +6981 /data/VOCdevkit/VOC2012/JPEGImages/2008_003985.jpg 500 375 14 31 63 350 375 14 229 17 500 375 +6982 /data/VOCdevkit/VOC2012/JPEGImages/2008_003986.jpg 500 375 6 38 61 454 314 +6983 /data/VOCdevkit/VOC2012/JPEGImages/2008_003988.jpg 500 375 3 106 146 160 167 3 320 288 379 364 +6984 /data/VOCdevkit/VOC2012/JPEGImages/2008_003989.jpg 500 375 3 136 109 381 271 +6985 /data/VOCdevkit/VOC2012/JPEGImages/2008_003992.jpg 460 500 18 69 23 375 430 6 426 139 452 162 +6986 /data/VOCdevkit/VOC2012/JPEGImages/2008_003995.jpg 500 375 19 291 176 421 295 14 250 197 500 375 14 156 88 314 375 14 81 58 281 316 14 1 24 282 375 +6987 /data/VOCdevkit/VOC2012/JPEGImages/2008_003996.jpg 500 375 14 160 27 465 375 +6988 /data/VOCdevkit/VOC2012/JPEGImages/2008_003997.jpg 500 344 2 4 26 313 261 +6989 /data/VOCdevkit/VOC2012/JPEGImages/2008_003998.jpg 500 375 8 288 1 447 88 +6990 /data/VOCdevkit/VOC2012/JPEGImages/2008_004000.jpg 500 333 0 25 63 500 260 0 81 139 244 206 +6991 /data/VOCdevkit/VOC2012/JPEGImages/2008_004002.jpg 500 375 14 110 109 345 375 15 287 59 500 344 +6992 /data/VOCdevkit/VOC2012/JPEGImages/2008_004003.jpg 500 333 14 229 80 285 239 15 158 111 175 137 15 135 114 151 136 15 144 177 223 252 8 377 219 467 331 15 321 143 416 289 15 27 119 138 252 15 15 170 115 272 15 44 217 125 308 15 1 201 116 323 +6993 /data/VOCdevkit/VOC2012/JPEGImages/2008_004004.jpg 500 333 19 27 22 474 322 +6994 /data/VOCdevkit/VOC2012/JPEGImages/2008_004006.jpg 500 375 7 1 1 500 375 19 1 1 451 145 +6995 /data/VOCdevkit/VOC2012/JPEGImages/2008_004007.jpg 500 375 16 1 18 371 375 +6996 /data/VOCdevkit/VOC2012/JPEGImages/2008_004008.jpg 500 375 8 206 181 331 354 8 350 251 500 375 19 208 87 294 163 +6997 /data/VOCdevkit/VOC2012/JPEGImages/2008_004014.jpg 500 375 3 119 262 339 313 +6998 /data/VOCdevkit/VOC2012/JPEGImages/2008_004015.jpg 500 479 11 16 77 261 402 11 132 11 485 464 +6999 /data/VOCdevkit/VOC2012/JPEGImages/2008_004016.jpg 500 400 14 337 1 500 400 14 1 54 303 400 4 168 264 235 400 +7000 /data/VOCdevkit/VOC2012/JPEGImages/2008_004017.jpg 500 333 14 28 2 500 333 +7001 /data/VOCdevkit/VOC2012/JPEGImages/2008_004018.jpg 500 333 14 323 104 493 333 +7002 /data/VOCdevkit/VOC2012/JPEGImages/2008_004020.jpg 500 375 6 9 1 500 343 14 461 1 500 94 +7003 /data/VOCdevkit/VOC2012/JPEGImages/2008_004021.jpg 375 500 11 94 62 313 482 +7004 /data/VOCdevkit/VOC2012/JPEGImages/2008_004022.jpg 500 334 7 102 65 349 302 +7005 /data/VOCdevkit/VOC2012/JPEGImages/2008_004024.jpg 500 333 2 130 47 476 316 +7006 /data/VOCdevkit/VOC2012/JPEGImages/2008_004026.jpg 335 500 3 38 95 250 373 +7007 /data/VOCdevkit/VOC2012/JPEGImages/2008_004027.jpg 500 333 2 200 158 352 202 +7008 /data/VOCdevkit/VOC2012/JPEGImages/2008_004030.jpg 500 402 0 135 96 216 151 0 187 178 266 232 0 297 196 370 249 0 113 234 195 291 +7009 /data/VOCdevkit/VOC2012/JPEGImages/2008_004036.jpg 500 375 13 244 134 326 200 14 265 115 306 183 +7010 /data/VOCdevkit/VOC2012/JPEGImages/2008_004037.jpg 500 333 4 194 187 223 251 4 1 226 18 306 4 77 219 106 295 14 241 130 356 333 14 120 59 256 333 +7011 /data/VOCdevkit/VOC2012/JPEGImages/2008_004040.jpg 500 333 14 211 135 278 286 14 300 142 349 293 1 274 196 402 296 1 206 204 253 299 +7012 /data/VOCdevkit/VOC2012/JPEGImages/2008_004042.jpg 500 352 2 1 80 220 220 +7013 /data/VOCdevkit/VOC2012/JPEGImages/2008_004044.jpg 500 375 11 45 102 345 338 14 225 1 348 72 +7014 /data/VOCdevkit/VOC2012/JPEGImages/2008_004045.jpg 333 500 14 1 83 298 500 +7015 /data/VOCdevkit/VOC2012/JPEGImages/2008_004046.jpg 500 375 6 254 86 384 140 6 417 55 479 91 14 327 246 376 375 +7016 /data/VOCdevkit/VOC2012/JPEGImages/2008_004048.jpg 500 375 7 138 124 318 276 +7017 /data/VOCdevkit/VOC2012/JPEGImages/2008_004053.jpg 500 375 14 201 125 328 345 14 86 128 255 291 14 60 159 119 249 14 27 153 87 231 14 15 99 77 199 3 22 187 456 375 +7018 /data/VOCdevkit/VOC2012/JPEGImages/2008_004054.jpg 500 375 14 288 9 358 241 14 119 157 261 371 14 96 251 222 375 14 195 237 360 375 8 472 196 500 281 +7019 /data/VOCdevkit/VOC2012/JPEGImages/2008_004055.jpg 500 218 14 465 134 487 188 5 444 78 500 163 5 275 37 453 202 5 145 60 287 199 5 36 52 162 192 +7020 /data/VOCdevkit/VOC2012/JPEGImages/2008_004056.jpg 333 500 6 1 98 48 136 14 181 112 277 307 +7021 /data/VOCdevkit/VOC2012/JPEGImages/2008_004058.jpg 434 500 11 1 205 372 500 +7022 /data/VOCdevkit/VOC2012/JPEGImages/2008_004064.jpg 500 375 14 59 28 447 375 +7023 /data/VOCdevkit/VOC2012/JPEGImages/2008_004066.jpg 500 333 14 57 134 337 333 14 392 7 435 102 +7024 /data/VOCdevkit/VOC2012/JPEGImages/2008_004069.jpg 500 345 6 85 56 452 305 +7025 /data/VOCdevkit/VOC2012/JPEGImages/2008_004071.jpg 500 375 14 48 125 129 238 8 32 156 160 375 +7026 /data/VOCdevkit/VOC2012/JPEGImages/2008_004074.jpg 500 375 7 1 1 500 375 +7027 /data/VOCdevkit/VOC2012/JPEGImages/2008_004075.jpg 500 333 2 201 1 500 283 +7028 /data/VOCdevkit/VOC2012/JPEGImages/2008_004076.jpg 500 333 14 206 84 370 295 +7029 /data/VOCdevkit/VOC2012/JPEGImages/2008_004077.jpg 500 375 14 140 52 360 315 8 338 55 425 197 +7030 /data/VOCdevkit/VOC2012/JPEGImages/2008_004080.jpg 500 375 6 22 108 484 324 +7031 /data/VOCdevkit/VOC2012/JPEGImages/2008_004081.jpg 500 375 14 188 176 286 211 14 113 1 460 375 +7032 /data/VOCdevkit/VOC2012/JPEGImages/2008_004084.jpg 500 333 13 458 179 500 246 13 39 158 120 281 13 232 182 482 333 14 1 120 36 326 14 318 133 341 176 14 79 125 233 333 14 319 141 417 333 14 247 141 312 247 +7033 /data/VOCdevkit/VOC2012/JPEGImages/2008_004087.jpg 500 447 2 386 16 484 173 2 274 46 362 187 2 166 35 331 251 2 39 105 150 240 2 55 267 180 435 +7034 /data/VOCdevkit/VOC2012/JPEGImages/2008_004088.jpg 438 500 5 154 27 438 500 14 54 218 95 474 14 103 242 157 476 +7035 /data/VOCdevkit/VOC2012/JPEGImages/2008_004090.jpg 500 375 14 103 60 466 375 4 195 235 268 375 +7036 /data/VOCdevkit/VOC2012/JPEGImages/2008_004092.jpg 375 500 14 97 43 336 500 15 1 246 119 365 15 241 245 375 350 +7037 /data/VOCdevkit/VOC2012/JPEGImages/2008_004093.jpg 500 375 19 73 113 349 324 +7038 /data/VOCdevkit/VOC2012/JPEGImages/2008_004097.jpg 500 375 19 173 42 271 133 +7039 /data/VOCdevkit/VOC2012/JPEGImages/2008_004100.jpg 500 332 0 36 92 500 200 6 458 191 500 222 +7040 /data/VOCdevkit/VOC2012/JPEGImages/2008_004101.jpg 500 375 1 92 240 260 375 14 181 35 500 375 14 118 37 275 375 +7041 /data/VOCdevkit/VOC2012/JPEGImages/2008_004102.jpg 500 375 6 2 1 500 375 14 207 122 300 171 +7042 /data/VOCdevkit/VOC2012/JPEGImages/2008_004103.jpg 500 433 2 347 77 405 205 2 53 275 89 326 2 148 292 318 338 2 223 285 319 331 +7043 /data/VOCdevkit/VOC2012/JPEGImages/2008_004105.jpg 500 375 14 198 32 500 375 2 31 86 142 231 +7044 /data/VOCdevkit/VOC2012/JPEGImages/2008_004106.jpg 500 319 11 164 1 420 243 +7045 /data/VOCdevkit/VOC2012/JPEGImages/2008_004110.jpg 500 375 18 1 1 414 375 +7046 /data/VOCdevkit/VOC2012/JPEGImages/2008_004112.jpg 500 375 6 56 103 441 268 +7047 /data/VOCdevkit/VOC2012/JPEGImages/2008_004113.jpg 500 333 14 228 174 269 249 14 280 174 314 250 1 281 205 309 258 1 232 209 259 260 6 1 178 27 216 +7048 /data/VOCdevkit/VOC2012/JPEGImages/2008_004119.jpg 500 333 7 50 36 499 315 +7049 /data/VOCdevkit/VOC2012/JPEGImages/2008_004120.jpg 500 333 7 266 116 312 176 7 86 26 252 250 +7050 /data/VOCdevkit/VOC2012/JPEGImages/2008_004121.jpg 500 333 11 7 56 459 286 +7051 /data/VOCdevkit/VOC2012/JPEGImages/2008_004122.jpg 500 375 8 289 77 409 305 11 319 120 381 214 +7052 /data/VOCdevkit/VOC2012/JPEGImages/2008_004123.jpg 500 334 14 59 32 500 292 +7053 /data/VOCdevkit/VOC2012/JPEGImages/2008_004124.jpg 500 375 8 104 100 436 375 3 80 1 466 250 +7054 /data/VOCdevkit/VOC2012/JPEGImages/2008_004125.jpg 500 323 12 189 178 303 300 14 210 174 251 239 +7055 /data/VOCdevkit/VOC2012/JPEGImages/2008_004126.jpg 500 432 4 341 241 419 367 14 22 96 480 367 14 22 153 101 294 +7056 /data/VOCdevkit/VOC2012/JPEGImages/2008_004127.jpg 500 375 6 22 12 472 358 6 272 27 500 241 6 313 8 397 39 +7057 /data/VOCdevkit/VOC2012/JPEGImages/2008_004130.jpg 500 375 14 238 205 253 239 +7058 /data/VOCdevkit/VOC2012/JPEGImages/2008_004134.jpg 500 375 14 290 46 500 375 14 1 28 292 375 +7059 /data/VOCdevkit/VOC2012/JPEGImages/2008_004135.jpg 500 410 14 3 17 492 410 +7060 /data/VOCdevkit/VOC2012/JPEGImages/2008_004137.jpg 500 375 14 96 149 188 375 14 171 120 276 375 14 267 116 389 375 +7061 /data/VOCdevkit/VOC2012/JPEGImages/2008_004138.jpg 500 375 0 116 150 416 266 +7062 /data/VOCdevkit/VOC2012/JPEGImages/2008_004140.jpg 375 500 14 1 88 242 500 14 115 77 252 414 10 230 214 375 336 +7063 /data/VOCdevkit/VOC2012/JPEGImages/2008_004142.jpg 500 375 14 129 136 164 214 14 211 142 239 214 14 231 126 256 183 14 257 122 290 209 14 329 118 357 209 14 439 98 479 220 14 1 262 132 375 1 113 163 196 216 1 197 164 275 214 1 309 154 393 208 6 131 142 318 206 +7064 /data/VOCdevkit/VOC2012/JPEGImages/2008_004145.jpg 500 375 4 301 112 368 322 4 242 62 301 321 4 164 43 233 323 +7065 /data/VOCdevkit/VOC2012/JPEGImages/2008_004147.jpg 500 475 2 124 100 407 392 +7066 /data/VOCdevkit/VOC2012/JPEGImages/2008_004148.jpg 500 375 14 1 95 290 375 14 241 115 500 375 +7067 /data/VOCdevkit/VOC2012/JPEGImages/2008_004155.jpg 500 183 7 30 35 485 155 +7068 /data/VOCdevkit/VOC2012/JPEGImages/2008_004161.jpg 333 500 14 203 136 306 477 14 3 105 107 488 +7069 /data/VOCdevkit/VOC2012/JPEGImages/2008_004163.jpg 333 500 1 1 350 54 439 +7070 /data/VOCdevkit/VOC2012/JPEGImages/2008_004165.jpg 500 329 0 41 107 440 244 +7071 /data/VOCdevkit/VOC2012/JPEGImages/2008_004166.jpg 500 403 12 71 51 353 229 12 47 93 188 233 +7072 /data/VOCdevkit/VOC2012/JPEGImages/2008_004171.jpg 375 500 15 68 18 343 498 +7073 /data/VOCdevkit/VOC2012/JPEGImages/2008_004174.jpg 500 375 11 68 70 500 375 +7074 /data/VOCdevkit/VOC2012/JPEGImages/2008_004175.jpg 500 151 12 130 36 275 116 +7075 /data/VOCdevkit/VOC2012/JPEGImages/2008_004176.jpg 480 438 14 316 58 454 438 14 271 89 340 428 14 167 214 276 438 14 124 103 229 309 14 219 77 295 279 14 189 68 244 181 14 48 60 146 438 +7076 /data/VOCdevkit/VOC2012/JPEGImages/2008_004178.jpg 500 406 4 411 115 487 314 +7077 /data/VOCdevkit/VOC2012/JPEGImages/2008_004182.jpg 500 375 6 437 89 488 121 14 356 121 389 234 14 323 113 365 230 14 288 122 335 295 +7078 /data/VOCdevkit/VOC2012/JPEGImages/2008_004188.jpg 500 375 14 1 89 68 310 14 18 81 90 305 14 88 95 153 281 11 98 195 198 294 14 228 176 269 290 14 208 109 297 282 +7079 /data/VOCdevkit/VOC2012/JPEGImages/2008_004189.jpg 500 375 7 98 78 366 265 +7080 /data/VOCdevkit/VOC2012/JPEGImages/2008_004190.jpg 500 240 0 152 142 309 189 +7081 /data/VOCdevkit/VOC2012/JPEGImages/2008_004195.jpg 500 333 12 30 122 304 277 14 157 71 223 203 +7082 /data/VOCdevkit/VOC2012/JPEGImages/2008_004196.jpg 500 375 14 101 141 248 375 14 175 143 294 375 +7083 /data/VOCdevkit/VOC2012/JPEGImages/2008_004198.jpg 500 375 14 240 133 328 273 +7084 /data/VOCdevkit/VOC2012/JPEGImages/2008_004201.jpg 500 498 14 72 178 247 358 +7085 /data/VOCdevkit/VOC2012/JPEGImages/2008_004203.jpg 500 458 14 322 267 387 447 14 93 104 156 257 14 43 90 93 255 14 22 62 85 227 14 117 86 166 235 +7086 /data/VOCdevkit/VOC2012/JPEGImages/2008_004205.jpg 500 375 14 197 83 335 375 +7087 /data/VOCdevkit/VOC2012/JPEGImages/2008_004208.jpg 500 375 14 1 143 132 374 8 1 259 116 375 +7088 /data/VOCdevkit/VOC2012/JPEGImages/2008_004212.jpg 500 375 18 165 149 446 275 +7089 /data/VOCdevkit/VOC2012/JPEGImages/2008_004213.jpg 375 500 14 1 28 375 500 +7090 /data/VOCdevkit/VOC2012/JPEGImages/2008_004214.jpg 500 375 18 133 1 500 375 +7091 /data/VOCdevkit/VOC2012/JPEGImages/2008_004216.jpg 500 333 10 1 113 500 333 +7092 /data/VOCdevkit/VOC2012/JPEGImages/2008_004217.jpg 500 378 19 41 93 227 272 14 170 17 500 378 +7093 /data/VOCdevkit/VOC2012/JPEGImages/2008_004218.jpg 441 211 11 14 17 366 211 +7094 /data/VOCdevkit/VOC2012/JPEGImages/2008_004221.jpg 500 333 14 23 40 139 331 14 136 52 237 318 14 220 62 337 306 14 324 72 408 290 14 436 74 500 276 +7095 /data/VOCdevkit/VOC2012/JPEGImages/2008_004224.jpg 500 337 6 189 193 311 242 +7096 /data/VOCdevkit/VOC2012/JPEGImages/2008_004230.jpg 500 335 14 214 54 395 335 +7097 /data/VOCdevkit/VOC2012/JPEGImages/2008_004231.jpg 500 334 6 31 64 500 320 14 35 45 104 156 14 218 37 258 113 14 283 47 304 68 14 423 50 472 126 6 1 1 194 184 +7098 /data/VOCdevkit/VOC2012/JPEGImages/2008_004232.jpg 500 375 7 123 36 500 310 +7099 /data/VOCdevkit/VOC2012/JPEGImages/2008_004234.jpg 500 375 2 214 118 301 263 +7100 /data/VOCdevkit/VOC2012/JPEGImages/2008_004235.jpg 500 355 18 76 1 500 355 +7101 /data/VOCdevkit/VOC2012/JPEGImages/2008_004239.jpg 500 347 0 146 158 431 251 +7102 /data/VOCdevkit/VOC2012/JPEGImages/2008_004242.jpg 500 375 3 35 22 427 179 14 252 92 500 375 +7103 /data/VOCdevkit/VOC2012/JPEGImages/2008_004243.jpg 333 500 14 1 69 333 500 +7104 /data/VOCdevkit/VOC2012/JPEGImages/2008_004245.jpg 375 500 14 297 130 375 258 14 1 151 75 325 14 127 97 335 500 14 27 140 181 500 +7105 /data/VOCdevkit/VOC2012/JPEGImages/2008_004246.jpg 500 375 14 181 1 500 375 14 1 1 257 352 +7106 /data/VOCdevkit/VOC2012/JPEGImages/2008_004247.jpg 500 375 14 1 1 381 375 +7107 /data/VOCdevkit/VOC2012/JPEGImages/2008_004251.jpg 500 333 8 25 115 67 163 2 63 69 127 102 +7108 /data/VOCdevkit/VOC2012/JPEGImages/2008_004257.jpg 488 500 7 3 1 488 500 +7109 /data/VOCdevkit/VOC2012/JPEGImages/2008_004258.jpg 500 332 14 1 1 500 332 +7110 /data/VOCdevkit/VOC2012/JPEGImages/2008_004259.jpg 500 399 19 74 66 424 384 +7111 /data/VOCdevkit/VOC2012/JPEGImages/2008_004263.jpg 443 437 14 1 65 154 437 14 140 42 287 427 14 147 195 309 433 14 316 122 413 419 +7112 /data/VOCdevkit/VOC2012/JPEGImages/2008_004265.jpg 400 300 11 11 76 392 253 +7113 /data/VOCdevkit/VOC2012/JPEGImages/2008_004269.jpg 500 375 17 1 6 500 375 14 19 1 500 375 14 15 183 258 375 +7114 /data/VOCdevkit/VOC2012/JPEGImages/2008_004270.jpg 500 375 14 69 4 487 375 14 71 215 313 374 +7115 /data/VOCdevkit/VOC2012/JPEGImages/2008_004271.jpg 500 333 17 181 207 317 333 +7116 /data/VOCdevkit/VOC2012/JPEGImages/2008_004273.jpg 500 357 11 1 23 469 295 +7117 /data/VOCdevkit/VOC2012/JPEGImages/2008_004274.jpg 500 375 14 110 97 313 206 +7118 /data/VOCdevkit/VOC2012/JPEGImages/2008_004276.jpg 500 375 2 115 11 500 375 +7119 /data/VOCdevkit/VOC2012/JPEGImages/2008_004278.jpg 375 500 14 42 129 128 379 14 84 155 259 500 14 124 116 182 206 14 232 179 304 434 +7120 /data/VOCdevkit/VOC2012/JPEGImages/2008_004279.jpg 500 375 19 130 10 379 183 +7121 /data/VOCdevkit/VOC2012/JPEGImages/2008_004280.jpg 500 375 1 17 17 500 342 8 9 26 173 310 8 341 92 449 226 +7122 /data/VOCdevkit/VOC2012/JPEGImages/2008_004284.jpg 500 334 11 116 64 343 293 7 314 146 426 257 +7123 /data/VOCdevkit/VOC2012/JPEGImages/2008_004287.jpg 500 375 14 36 104 275 375 +7124 /data/VOCdevkit/VOC2012/JPEGImages/2008_004288.jpg 500 375 14 165 50 351 375 13 63 149 467 375 6 1 147 114 242 6 1 134 94 168 +7125 /data/VOCdevkit/VOC2012/JPEGImages/2008_004289.jpg 500 333 8 306 162 491 333 8 54 31 193 94 8 184 16 297 65 10 1 39 500 333 +7126 /data/VOCdevkit/VOC2012/JPEGImages/2008_004290.jpg 375 500 7 44 66 339 427 +7127 /data/VOCdevkit/VOC2012/JPEGImages/2008_004291.jpg 500 375 3 1 154 425 254 +7128 /data/VOCdevkit/VOC2012/JPEGImages/2008_004292.jpg 500 375 16 283 224 352 278 16 476 238 499 264 +7129 /data/VOCdevkit/VOC2012/JPEGImages/2008_004293.jpg 500 375 11 254 41 500 321 11 1 221 233 356 10 1 95 303 304 +7130 /data/VOCdevkit/VOC2012/JPEGImages/2008_004296.jpg 388 500 2 35 31 301 408 +7131 /data/VOCdevkit/VOC2012/JPEGImages/2008_004297.jpg 500 375 19 273 19 445 167 11 4 188 147 303 8 119 114 257 247 11 358 62 419 125 +7132 /data/VOCdevkit/VOC2012/JPEGImages/2008_004301.jpg 500 375 14 281 1 500 375 19 34 113 288 362 +7133 /data/VOCdevkit/VOC2012/JPEGImages/2008_004303.jpg 500 375 7 1 1 344 288 +7134 /data/VOCdevkit/VOC2012/JPEGImages/2008_004306.jpg 236 280 11 25 15 203 250 +7135 /data/VOCdevkit/VOC2012/JPEGImages/2008_004307.jpg 375 500 14 205 51 355 364 6 1 64 328 477 +7136 /data/VOCdevkit/VOC2012/JPEGImages/2008_004308.jpg 500 375 4 1 122 33 243 14 108 17 348 242 +7137 /data/VOCdevkit/VOC2012/JPEGImages/2008_004312.jpg 500 333 6 33 65 489 310 +7138 /data/VOCdevkit/VOC2012/JPEGImages/2008_004313.jpg 500 329 8 346 161 410 279 8 196 176 261 288 8 239 167 293 259 8 252 177 326 303 +7139 /data/VOCdevkit/VOC2012/JPEGImages/2008_004314.jpg 201 500 14 19 29 180 469 +7140 /data/VOCdevkit/VOC2012/JPEGImages/2008_004317.jpg 500 500 2 140 64 500 500 +7141 /data/VOCdevkit/VOC2012/JPEGImages/2008_004318.jpg 500 375 14 92 81 326 375 14 195 80 416 375 14 367 26 428 262 14 320 27 376 276 14 238 14 302 172 +7142 /data/VOCdevkit/VOC2012/JPEGImages/2008_004319.jpg 500 375 11 239 229 415 322 11 1 176 207 311 +7143 /data/VOCdevkit/VOC2012/JPEGImages/2008_004321.jpg 500 333 14 212 135 324 274 14 312 137 437 324 14 117 157 188 333 14 1 160 122 333 10 135 245 415 333 8 348 193 469 333 19 430 167 500 252 17 61 175 312 333 +7144 /data/VOCdevkit/VOC2012/JPEGImages/2008_004324.jpg 500 332 11 97 17 316 196 +7145 /data/VOCdevkit/VOC2012/JPEGImages/2008_004325.jpg 375 500 1 101 308 295 424 14 108 215 238 374 +7146 /data/VOCdevkit/VOC2012/JPEGImages/2008_004326.jpg 500 298 6 110 134 271 195 6 80 135 190 188 6 38 141 136 183 6 75 126 151 147 6 475 115 500 152 6 231 99 470 213 +7147 /data/VOCdevkit/VOC2012/JPEGImages/2008_004327.jpg 500 375 14 349 278 377 360 +7148 /data/VOCdevkit/VOC2012/JPEGImages/2008_004328.jpg 375 500 7 86 369 190 450 7 88 312 167 399 14 64 62 234 392 15 243 109 295 149 +7149 /data/VOCdevkit/VOC2012/JPEGImages/2008_004330.jpg 500 377 14 90 90 253 377 19 230 52 329 143 +7150 /data/VOCdevkit/VOC2012/JPEGImages/2008_004331.jpg 375 500 14 111 18 375 485 1 117 195 375 500 +7151 /data/VOCdevkit/VOC2012/JPEGImages/2008_004333.jpg 500 375 19 310 103 500 285 14 11 79 183 371 14 167 144 349 375 +7152 /data/VOCdevkit/VOC2012/JPEGImages/2008_004339.jpg 500 333 6 1 95 228 178 +7153 /data/VOCdevkit/VOC2012/JPEGImages/2008_004342.jpg 375 500 14 98 76 242 421 +7154 /data/VOCdevkit/VOC2012/JPEGImages/2008_004344.jpg 500 375 14 135 30 317 375 14 277 114 399 375 8 1 218 147 375 +7155 /data/VOCdevkit/VOC2012/JPEGImages/2008_004345.jpg 500 374 13 100 18 406 374 +7156 /data/VOCdevkit/VOC2012/JPEGImages/2008_004347.jpg 375 500 7 1 14 339 459 +7157 /data/VOCdevkit/VOC2012/JPEGImages/2008_004348.jpg 500 375 0 20 79 500 235 +7158 /data/VOCdevkit/VOC2012/JPEGImages/2008_004353.jpg 500 380 14 13 110 255 380 14 313 126 472 380 14 241 124 359 323 14 1 83 352 380 +7159 /data/VOCdevkit/VOC2012/JPEGImages/2008_004354.jpg 500 415 12 14 115 429 384 14 223 39 312 265 +7160 /data/VOCdevkit/VOC2012/JPEGImages/2008_004357.jpg 500 375 18 188 148 290 231 +7161 /data/VOCdevkit/VOC2012/JPEGImages/2008_004358.jpg 500 375 18 293 67 500 293 18 1 24 224 294 14 232 218 269 284 +7162 /data/VOCdevkit/VOC2012/JPEGImages/2008_004361.jpg 500 333 14 264 72 500 333 14 1 26 308 333 +7163 /data/VOCdevkit/VOC2012/JPEGImages/2008_004362.jpg 500 375 2 165 49 410 260 +7164 /data/VOCdevkit/VOC2012/JPEGImages/2008_004363.jpg 500 375 1 102 178 344 336 +7165 /data/VOCdevkit/VOC2012/JPEGImages/2008_004365.jpg 333 500 13 23 140 263 476 14 36 41 278 411 +7166 /data/VOCdevkit/VOC2012/JPEGImages/2008_004367.jpg 500 348 18 1 89 500 289 18 136 85 351 291 +7167 /data/VOCdevkit/VOC2012/JPEGImages/2008_004371.jpg 500 375 13 250 17 395 263 14 351 111 475 266 14 98 101 245 259 14 30 1 199 363 +7168 /data/VOCdevkit/VOC2012/JPEGImages/2008_004372.jpg 400 267 8 232 105 276 172 14 230 96 377 267 14 35 102 169 267 14 147 67 260 183 4 143 196 168 253 +7169 /data/VOCdevkit/VOC2012/JPEGImages/2008_004374.jpg 500 332 7 173 70 316 222 +7170 /data/VOCdevkit/VOC2012/JPEGImages/2008_004376.jpg 500 324 14 196 67 361 241 +7171 /data/VOCdevkit/VOC2012/JPEGImages/2008_004378.jpg 500 332 0 133 24 434 208 0 294 214 398 242 +7172 /data/VOCdevkit/VOC2012/JPEGImages/2008_004380.jpg 500 500 14 316 144 500 387 14 264 146 418 315 14 8 99 178 300 14 1 251 178 466 15 281 61 443 152 +7173 /data/VOCdevkit/VOC2012/JPEGImages/2008_004384.jpg 375 500 8 46 244 212 443 8 1 292 84 500 8 181 269 375 500 2 1 279 79 349 4 136 270 155 339 +7174 /data/VOCdevkit/VOC2012/JPEGImages/2008_004385.jpg 500 375 2 168 149 282 241 +7175 /data/VOCdevkit/VOC2012/JPEGImages/2008_004387.jpg 500 375 6 385 263 486 303 6 193 264 216 281 6 171 263 187 276 6 154 262 169 273 14 102 262 112 291 +7176 /data/VOCdevkit/VOC2012/JPEGImages/2008_004389.jpg 500 375 14 1 193 116 356 14 220 138 367 283 14 348 184 500 375 4 25 329 49 375 +7177 /data/VOCdevkit/VOC2012/JPEGImages/2008_004391.jpg 375 500 14 53 35 175 500 14 158 37 285 500 14 1 45 114 252 14 277 38 348 186 14 178 1 230 45 +7178 /data/VOCdevkit/VOC2012/JPEGImages/2008_004394.jpg 500 375 9 57 2 435 375 +7179 /data/VOCdevkit/VOC2012/JPEGImages/2008_004396.jpg 375 500 12 50 47 290 500 +7180 /data/VOCdevkit/VOC2012/JPEGImages/2008_004398.jpg 249 363 14 99 84 193 360 14 1 132 162 363 14 9 222 121 363 +7181 /data/VOCdevkit/VOC2012/JPEGImages/2008_004399.jpg 500 333 13 260 154 328 266 14 238 114 316 232 +7182 /data/VOCdevkit/VOC2012/JPEGImages/2008_004402.jpg 500 375 11 134 31 500 375 +7183 /data/VOCdevkit/VOC2012/JPEGImages/2008_004403.jpg 500 375 14 1 41 299 375 14 249 57 500 375 +7184 /data/VOCdevkit/VOC2012/JPEGImages/2008_004406.jpg 500 375 0 53 74 500 266 +7185 /data/VOCdevkit/VOC2012/JPEGImages/2008_004408.jpg 500 375 8 280 280 331 373 8 384 290 445 375 +7186 /data/VOCdevkit/VOC2012/JPEGImages/2008_004410.jpg 500 333 11 13 1 473 333 +7187 /data/VOCdevkit/VOC2012/JPEGImages/2008_004411.jpg 500 333 6 25 71 438 306 6 1 68 140 219 +7188 /data/VOCdevkit/VOC2012/JPEGImages/2008_004412.jpg 375 500 8 121 340 246 500 +7189 /data/VOCdevkit/VOC2012/JPEGImages/2008_004414.jpg 500 375 6 33 87 441 344 6 397 70 426 82 6 424 67 449 80 +7190 /data/VOCdevkit/VOC2012/JPEGImages/2008_004416.jpg 500 375 17 143 147 442 371 +7191 /data/VOCdevkit/VOC2012/JPEGImages/2008_004417.jpg 500 375 14 315 80 401 312 14 238 78 304 315 14 1 83 101 346 +7192 /data/VOCdevkit/VOC2012/JPEGImages/2008_004418.jpg 500 344 14 52 45 182 344 14 176 1 366 344 14 423 90 500 236 4 366 198 394 292 4 310 77 379 144 4 466 185 494 263 4 1 123 23 205 4 186 77 200 123 +7193 /data/VOCdevkit/VOC2012/JPEGImages/2008_004419.jpg 500 375 14 176 20 256 166 +7194 /data/VOCdevkit/VOC2012/JPEGImages/2008_004422.jpg 500 332 7 1 14 396 332 +7195 /data/VOCdevkit/VOC2012/JPEGImages/2008_004425.jpg 500 426 2 132 101 347 297 +7196 /data/VOCdevkit/VOC2012/JPEGImages/2008_004426.jpg 333 500 14 36 1 333 500 +7197 /data/VOCdevkit/VOC2012/JPEGImages/2008_004427.jpg 375 500 11 131 134 270 413 +7198 /data/VOCdevkit/VOC2012/JPEGImages/2008_004428.jpg 500 375 15 211 227 354 309 15 66 218 175 278 15 393 203 464 246 15 225 171 262 213 15 18 176 99 250 15 80 135 226 256 15 320 155 396 233 +7199 /data/VOCdevkit/VOC2012/JPEGImages/2008_004430.jpg 500 333 12 1 1 496 333 +7200 /data/VOCdevkit/VOC2012/JPEGImages/2008_004431.jpg 500 375 14 2 54 215 292 14 158 95 373 375 14 323 1 500 375 14 1 121 56 260 14 184 115 249 228 4 218 170 238 232 +7201 /data/VOCdevkit/VOC2012/JPEGImages/2008_004433.jpg 500 375 0 200 195 258 212 +7202 /data/VOCdevkit/VOC2012/JPEGImages/2008_004435.jpg 500 375 15 83 1 153 109 8 13 25 74 125 14 101 29 214 184 14 131 77 355 336 17 142 52 469 375 +7203 /data/VOCdevkit/VOC2012/JPEGImages/2008_004436.jpg 400 300 14 55 1 195 300 14 281 103 400 300 14 218 111 339 300 14 18 95 40 153 6 4 96 55 119 +7204 /data/VOCdevkit/VOC2012/JPEGImages/2008_004438.jpg 500 375 14 1 69 220 375 14 136 131 388 375 14 285 90 500 375 14 173 38 265 141 +7205 /data/VOCdevkit/VOC2012/JPEGImages/2008_004439.jpg 500 375 14 120 41 242 362 14 242 117 327 291 14 404 77 499 357 +7206 /data/VOCdevkit/VOC2012/JPEGImages/2008_004441.jpg 500 375 1 1 1 356 233 14 143 125 394 264 6 5 1 500 164 +7207 /data/VOCdevkit/VOC2012/JPEGImages/2008_004443.jpg 333 500 3 259 382 319 430 +7208 /data/VOCdevkit/VOC2012/JPEGImages/2008_004445.jpg 500 332 8 204 233 295 332 8 293 266 397 332 8 280 221 328 254 15 249 196 273 235 +7209 /data/VOCdevkit/VOC2012/JPEGImages/2008_004450.jpg 500 375 9 105 116 178 168 +7210 /data/VOCdevkit/VOC2012/JPEGImages/2008_004452.jpg 500 333 2 211 114 297 204 +7211 /data/VOCdevkit/VOC2012/JPEGImages/2008_004453.jpg 375 500 16 43 64 213 365 16 198 16 349 200 16 194 31 375 497 +7212 /data/VOCdevkit/VOC2012/JPEGImages/2008_004455.jpg 341 251 14 1 55 139 251 14 154 39 217 251 14 161 25 298 251 +7213 /data/VOCdevkit/VOC2012/JPEGImages/2008_004457.jpg 500 375 8 1 277 83 375 8 106 221 193 333 8 318 237 405 367 8 307 193 368 273 8 423 191 492 278 10 167 246 297 365 14 371 174 458 284 14 238 132 280 248 14 191 138 233 247 14 12 116 59 233 14 51 120 100 234 14 1 227 72 375 14 284 185 400 362 14 120 197 204 329 +7214 /data/VOCdevkit/VOC2012/JPEGImages/2008_004458.jpg 500 295 6 427 65 500 295 6 323 124 366 144 6 200 119 260 141 6 365 127 387 144 +7215 /data/VOCdevkit/VOC2012/JPEGImages/2008_004459.jpg 500 375 14 1 47 341 375 14 150 212 274 375 +7216 /data/VOCdevkit/VOC2012/JPEGImages/2008_004460.jpg 500 375 4 250 126 265 163 8 101 272 297 375 8 376 297 500 375 +7217 /data/VOCdevkit/VOC2012/JPEGImages/2008_004462.jpg 500 335 7 1 120 262 335 +7218 /data/VOCdevkit/VOC2012/JPEGImages/2008_004464.jpg 378 500 14 130 165 289 422 6 336 102 378 153 6 1 1 184 411 +7219 /data/VOCdevkit/VOC2012/JPEGImages/2008_004469.jpg 500 375 3 19 175 146 228 3 242 193 275 209 +7220 /data/VOCdevkit/VOC2012/JPEGImages/2008_004470.jpg 480 360 12 144 169 308 350 14 191 76 274 254 +7221 /data/VOCdevkit/VOC2012/JPEGImages/2008_004471.jpg 500 333 14 304 31 421 333 +7222 /data/VOCdevkit/VOC2012/JPEGImages/2008_004476.jpg 360 480 12 100 135 271 422 14 106 37 266 281 +7223 /data/VOCdevkit/VOC2012/JPEGImages/2008_004477.jpg 375 500 15 33 106 195 424 +7224 /data/VOCdevkit/VOC2012/JPEGImages/2008_004478.jpg 360 500 14 62 48 359 429 +7225 /data/VOCdevkit/VOC2012/JPEGImages/2008_004479.jpg 500 219 14 238 25 500 219 +7226 /data/VOCdevkit/VOC2012/JPEGImages/2008_004480.jpg 500 375 11 2 67 229 285 +7227 /data/VOCdevkit/VOC2012/JPEGImages/2008_004482.jpg 500 375 14 27 97 109 209 14 1 125 59 375 14 102 107 212 375 14 166 97 256 375 14 269 91 391 371 14 355 152 441 297 1 51 175 118 282 6 356 150 500 254 +7228 /data/VOCdevkit/VOC2012/JPEGImages/2008_004487.jpg 500 375 8 369 181 500 375 4 232 149 249 182 +7229 /data/VOCdevkit/VOC2012/JPEGImages/2008_004488.jpg 480 263 6 20 16 470 246 +7230 /data/VOCdevkit/VOC2012/JPEGImages/2008_004490.jpg 375 500 7 125 97 327 227 8 20 28 369 500 +7231 /data/VOCdevkit/VOC2012/JPEGImages/2008_004492.jpg 500 375 17 45 85 477 240 8 1 86 46 257 14 118 101 226 245 14 276 119 423 291 +7232 /data/VOCdevkit/VOC2012/JPEGImages/2008_004493.jpg 500 375 14 141 150 185 259 14 256 202 284 263 +7233 /data/VOCdevkit/VOC2012/JPEGImages/2008_004497.jpg 500 375 17 1 97 500 340 15 22 77 71 113 15 345 1 422 122 +7234 /data/VOCdevkit/VOC2012/JPEGImages/2008_004498.jpg 500 333 11 148 144 178 193 11 345 168 379 189 +7235 /data/VOCdevkit/VOC2012/JPEGImages/2008_004499.jpg 500 281 14 229 108 312 281 14 51 114 116 281 14 1 107 73 281 14 240 122 321 185 14 109 103 225 281 +7236 /data/VOCdevkit/VOC2012/JPEGImages/2008_004501.jpg 500 375 14 177 82 372 375 19 1 119 88 276 4 283 78 311 173 14 414 4 495 86 +7237 /data/VOCdevkit/VOC2012/JPEGImages/2008_004502.jpg 300 400 6 148 120 189 152 +7238 /data/VOCdevkit/VOC2012/JPEGImages/2008_004504.jpg 500 426 14 172 142 333 293 +7239 /data/VOCdevkit/VOC2012/JPEGImages/2008_004505.jpg 500 375 11 194 146 404 221 +7240 /data/VOCdevkit/VOC2012/JPEGImages/2008_004506.jpg 500 375 19 45 99 113 158 19 116 117 178 170 19 176 112 244 170 19 241 115 305 178 8 1 262 127 375 4 4 235 25 260 14 82 27 118 93 14 411 45 437 85 19 271 212 306 241 +7241 /data/VOCdevkit/VOC2012/JPEGImages/2008_004510.jpg 500 375 14 229 33 351 375 14 86 71 199 318 14 185 42 256 223 14 256 1 296 60 14 304 4 362 285 14 63 26 111 209 14 2 33 44 111 14 38 218 101 260 14 1 166 80 326 +7242 /data/VOCdevkit/VOC2012/JPEGImages/2008_004512.jpg 391 500 14 77 59 296 494 14 108 239 309 500 +7243 /data/VOCdevkit/VOC2012/JPEGImages/2008_004513.jpg 459 500 14 80 12 372 500 14 81 190 354 500 14 296 45 431 500 +7244 /data/VOCdevkit/VOC2012/JPEGImages/2008_004515.jpg 500 396 7 76 159 197 239 11 296 113 372 274 11 341 188 401 300 14 338 55 477 272 6 213 1 500 117 +7245 /data/VOCdevkit/VOC2012/JPEGImages/2008_004518.jpg 500 324 14 110 66 423 324 +7246 /data/VOCdevkit/VOC2012/JPEGImages/2008_004519.jpg 500 375 14 1 1 334 375 14 112 10 329 327 14 238 33 500 297 +7247 /data/VOCdevkit/VOC2012/JPEGImages/2008_004520.jpg 500 376 2 81 140 281 335 +7248 /data/VOCdevkit/VOC2012/JPEGImages/2008_004522.jpg 303 396 14 50 68 247 396 +7249 /data/VOCdevkit/VOC2012/JPEGImages/2008_004525.jpg 500 375 11 100 112 390 330 +7250 /data/VOCdevkit/VOC2012/JPEGImages/2008_004526.jpg 375 500 19 1 147 325 500 +7251 /data/VOCdevkit/VOC2012/JPEGImages/2008_004528.jpg 460 500 11 1 59 330 500 +7252 /data/VOCdevkit/VOC2012/JPEGImages/2008_004532.jpg 500 333 0 81 17 156 52 0 129 117 500 273 +7253 /data/VOCdevkit/VOC2012/JPEGImages/2008_004533.jpg 456 500 14 206 167 317 476 12 107 96 219 458 14 76 58 242 336 +7254 /data/VOCdevkit/VOC2012/JPEGImages/2008_004534.jpg 375 500 14 66 51 196 500 14 190 140 313 500 +7255 /data/VOCdevkit/VOC2012/JPEGImages/2008_004538.jpg 375 500 14 1 57 375 500 7 114 217 353 500 +7256 /data/VOCdevkit/VOC2012/JPEGImages/2008_004539.jpg 500 375 12 1 59 404 375 +7257 /data/VOCdevkit/VOC2012/JPEGImages/2008_004540.jpg 312 416 7 58 156 241 313 +7258 /data/VOCdevkit/VOC2012/JPEGImages/2008_004541.jpg 375 500 19 157 141 294 255 14 184 1 375 500 +7259 /data/VOCdevkit/VOC2012/JPEGImages/2008_004544.jpg 500 332 14 260 106 494 332 +7260 /data/VOCdevkit/VOC2012/JPEGImages/2008_004545.jpg 375 500 12 174 242 205 314 12 203 237 237 311 12 268 247 309 319 12 303 241 346 308 12 114 228 147 304 12 1 186 27 251 +7261 /data/VOCdevkit/VOC2012/JPEGImages/2008_004546.jpg 375 500 12 117 202 171 323 12 1 155 40 257 12 102 384 159 500 12 185 106 241 224 12 255 147 322 269 14 109 357 163 459 14 122 173 166 250 14 198 90 236 140 14 271 124 306 191 14 2 123 42 189 +7262 /data/VOCdevkit/VOC2012/JPEGImages/2008_004547.jpg 500 375 18 62 80 370 230 +7263 /data/VOCdevkit/VOC2012/JPEGImages/2008_004549.jpg 500 375 13 32 99 437 356 14 82 16 196 210 6 1 121 59 257 +7264 /data/VOCdevkit/VOC2012/JPEGImages/2008_004550.jpg 500 404 19 60 111 140 229 +7265 /data/VOCdevkit/VOC2012/JPEGImages/2008_004551.jpg 500 375 2 214 111 263 264 +7266 /data/VOCdevkit/VOC2012/JPEGImages/2008_004552.jpg 375 500 6 1 1 375 160 +7267 /data/VOCdevkit/VOC2012/JPEGImages/2008_004553.jpg 333 500 14 1 31 333 469 8 1 27 333 500 +7268 /data/VOCdevkit/VOC2012/JPEGImages/2008_004554.jpg 500 333 13 288 105 360 175 14 236 92 301 186 +7269 /data/VOCdevkit/VOC2012/JPEGImages/2008_004559.jpg 375 500 6 193 412 305 470 6 286 409 375 485 6 1 340 35 366 +7270 /data/VOCdevkit/VOC2012/JPEGImages/2008_004564.jpg 500 333 10 161 212 500 333 4 437 147 467 249 4 318 182 339 245 8 1 220 246 333 14 26 86 206 326 +7271 /data/VOCdevkit/VOC2012/JPEGImages/2008_004567.jpg 375 500 14 115 33 270 500 +7272 /data/VOCdevkit/VOC2012/JPEGImages/2008_004568.jpg 500 281 13 159 117 449 281 14 218 51 325 175 +7273 /data/VOCdevkit/VOC2012/JPEGImages/2008_004570.jpg 347 500 3 7 89 337 418 +7274 /data/VOCdevkit/VOC2012/JPEGImages/2008_004574.jpg 500 375 14 173 90 237 325 1 104 1 223 97 1 174 2 287 99 6 13 103 305 283 14 242 101 342 320 14 119 80 194 307 +7275 /data/VOCdevkit/VOC2012/JPEGImages/2008_004575.jpg 301 500 14 1 96 125 441 14 88 64 247 425 +7276 /data/VOCdevkit/VOC2012/JPEGImages/2008_004579.jpg 500 375 7 1 30 283 375 7 189 53 444 344 8 46 1 342 176 +7277 /data/VOCdevkit/VOC2012/JPEGImages/2008_004581.jpg 500 375 4 231 285 285 364 +7278 /data/VOCdevkit/VOC2012/JPEGImages/2008_004583.jpg 500 375 7 7 96 484 279 +7279 /data/VOCdevkit/VOC2012/JPEGImages/2008_004584.jpg 500 375 12 1 148 323 375 12 1 1 421 375 +7280 /data/VOCdevkit/VOC2012/JPEGImages/2008_004585.jpg 500 375 8 1 176 98 375 8 1 37 117 232 8 1 1 126 99 8 413 1 498 107 8 353 2 449 61 +7281 /data/VOCdevkit/VOC2012/JPEGImages/2008_004588.jpg 500 377 10 251 274 500 377 +7282 /data/VOCdevkit/VOC2012/JPEGImages/2008_004589.jpg 500 281 2 184 45 253 90 +7283 /data/VOCdevkit/VOC2012/JPEGImages/2008_004590.jpg 375 500 11 75 21 159 95 11 104 81 284 203 11 199 178 262 277 11 157 258 272 410 11 75 233 194 356 11 54 319 221 500 11 35 309 138 456 11 112 305 238 437 +7284 /data/VOCdevkit/VOC2012/JPEGImages/2008_004592.jpg 500 331 8 314 1 407 98 8 302 1 500 271 8 12 1 226 260 1 20 14 474 284 +7285 /data/VOCdevkit/VOC2012/JPEGImages/2008_004593.jpg 375 500 3 90 238 137 274 +7286 /data/VOCdevkit/VOC2012/JPEGImages/2008_004599.jpg 500 381 13 85 77 402 314 14 108 89 363 303 +7287 /data/VOCdevkit/VOC2012/JPEGImages/2008_004602.jpg 375 500 14 96 75 265 500 +7288 /data/VOCdevkit/VOC2012/JPEGImages/2008_004603.jpg 500 334 1 10 154 406 315 1 1 101 104 243 14 296 1 391 235 14 1 1 60 122 +7289 /data/VOCdevkit/VOC2012/JPEGImages/2008_004605.jpg 500 327 0 32 52 463 223 6 10 161 30 176 +7290 /data/VOCdevkit/VOC2012/JPEGImages/2008_004606.jpg 500 375 19 1 1 126 137 14 389 296 500 375 +7291 /data/VOCdevkit/VOC2012/JPEGImages/2008_004607.jpg 400 500 4 137 11 254 421 +7292 /data/VOCdevkit/VOC2012/JPEGImages/2008_004610.jpg 500 321 18 61 50 411 298 +7293 /data/VOCdevkit/VOC2012/JPEGImages/2008_004611.jpg 500 375 13 269 56 469 254 14 279 1 422 203 +7294 /data/VOCdevkit/VOC2012/JPEGImages/2008_004612.jpg 500 374 8 118 76 385 331 +7295 /data/VOCdevkit/VOC2012/JPEGImages/2008_004613.jpg 500 332 5 29 12 477 304 6 477 210 500 264 +7296 /data/VOCdevkit/VOC2012/JPEGImages/2008_004614.jpg 500 375 6 388 272 425 289 6 337 273 377 291 6 290 276 324 293 6 280 285 467 373 5 111 259 252 298 5 1 262 83 288 6 1 283 24 310 +7297 /data/VOCdevkit/VOC2012/JPEGImages/2008_004615.jpg 500 375 13 12 1 485 375 13 1 1 352 290 13 1 1 303 182 15 447 1 500 100 +7298 /data/VOCdevkit/VOC2012/JPEGImages/2008_004616.jpg 500 375 14 65 108 330 334 +7299 /data/VOCdevkit/VOC2012/JPEGImages/2008_004617.jpg 375 500 13 1 1 375 500 +7300 /data/VOCdevkit/VOC2012/JPEGImages/2008_004619.jpg 375 500 8 183 112 272 207 15 90 200 146 282 15 42 223 80 280 15 78 232 114 280 +7301 /data/VOCdevkit/VOC2012/JPEGImages/2008_004620.jpg 400 500 2 36 39 373 475 +7302 /data/VOCdevkit/VOC2012/JPEGImages/2008_004621.jpg 500 375 16 148 57 343 340 +7303 /data/VOCdevkit/VOC2012/JPEGImages/2008_004624.jpg 500 354 12 150 110 438 277 +7304 /data/VOCdevkit/VOC2012/JPEGImages/2008_004629.jpg 400 300 16 98 42 331 258 +7305 /data/VOCdevkit/VOC2012/JPEGImages/2008_004630.jpg 500 333 0 1 1 500 275 +7306 /data/VOCdevkit/VOC2012/JPEGImages/2008_004631.jpg 500 333 0 35 53 493 203 0 1 120 199 199 +7307 /data/VOCdevkit/VOC2012/JPEGImages/2008_004632.jpg 375 500 17 115 194 361 336 8 1 290 283 500 +7308 /data/VOCdevkit/VOC2012/JPEGImages/2008_004633.jpg 500 333 2 212 160 250 212 +7309 /data/VOCdevkit/VOC2012/JPEGImages/2008_004634.jpg 500 375 15 235 81 367 294 15 102 47 176 172 +7310 /data/VOCdevkit/VOC2012/JPEGImages/2008_004635.jpg 332 500 7 65 1 308 472 +7311 /data/VOCdevkit/VOC2012/JPEGImages/2008_004636.jpg 500 375 3 1 174 330 375 14 115 10 351 256 +7312 /data/VOCdevkit/VOC2012/JPEGImages/2008_004640.jpg 500 375 7 15 123 500 272 +7313 /data/VOCdevkit/VOC2012/JPEGImages/2008_004646.jpg 500 333 0 96 1 500 333 0 1 48 268 134 0 127 1 369 52 0 386 116 500 153 0 1 124 156 309 14 427 191 441 225 0 7 19 119 63 +7314 /data/VOCdevkit/VOC2012/JPEGImages/2008_004647.jpg 346 500 14 172 53 344 500 11 1 223 203 486 +7315 /data/VOCdevkit/VOC2012/JPEGImages/2008_004648.jpg 500 333 0 135 247 406 333 0 71 91 500 226 0 22 188 153 238 0 417 99 500 147 0 387 26 500 96 0 330 214 460 292 +7316 /data/VOCdevkit/VOC2012/JPEGImages/2008_004649.jpg 500 375 12 185 110 264 299 14 168 58 276 217 +7317 /data/VOCdevkit/VOC2012/JPEGImages/2008_004653.jpg 500 306 11 21 34 479 306 +7318 /data/VOCdevkit/VOC2012/JPEGImages/2008_004654.jpg 333 500 1 43 213 172 453 14 54 43 319 349 +7319 /data/VOCdevkit/VOC2012/JPEGImages/2008_004656.jpg 500 375 14 220 28 295 175 1 226 91 308 202 +7320 /data/VOCdevkit/VOC2012/JPEGImages/2008_004659.jpg 402 500 4 142 1 317 500 +7321 /data/VOCdevkit/VOC2012/JPEGImages/2008_004661.jpg 500 333 17 215 208 471 333 8 68 165 116 250 8 24 165 75 247 8 90 157 129 241 8 46 153 78 231 10 36 175 132 255 15 125 133 293 304 +7322 /data/VOCdevkit/VOC2012/JPEGImages/2008_004662.jpg 375 500 11 91 276 312 500 11 21 29 375 453 +7323 /data/VOCdevkit/VOC2012/JPEGImages/2008_004663.jpg 500 375 18 55 162 439 258 +7324 /data/VOCdevkit/VOC2012/JPEGImages/2008_004665.jpg 500 333 8 293 199 432 313 19 50 170 102 211 14 258 136 424 305 +7325 /data/VOCdevkit/VOC2012/JPEGImages/2008_004666.jpg 500 375 4 4 160 28 245 4 24 149 49 245 4 312 44 334 88 4 334 44 355 88 4 356 47 374 87 14 139 37 336 375 14 363 8 500 375 +7326 /data/VOCdevkit/VOC2012/JPEGImages/2008_004667.jpg 500 375 6 377 165 415 196 +7327 /data/VOCdevkit/VOC2012/JPEGImages/2008_004668.jpg 500 375 6 1 80 164 248 13 12 28 455 375 +7328 /data/VOCdevkit/VOC2012/JPEGImages/2008_004670.jpg 500 375 8 456 191 500 283 8 383 160 460 254 8 375 139 429 230 8 318 134 373 216 8 264 131 316 210 8 242 125 288 166 8 189 128 239 188 8 88 117 129 164 8 45 116 86 166 17 71 149 311 312 +7329 /data/VOCdevkit/VOC2012/JPEGImages/2008_004671.jpg 500 335 2 222 140 272 177 +7330 /data/VOCdevkit/VOC2012/JPEGImages/2008_004672.jpg 500 375 7 1 1 500 375 +7331 /data/VOCdevkit/VOC2012/JPEGImages/2008_004677.jpg 375 500 14 1 1 373 500 +7332 /data/VOCdevkit/VOC2012/JPEGImages/2008_004678.jpg 500 375 6 81 21 500 328 14 28 1 99 172 6 78 1 230 58 +7333 /data/VOCdevkit/VOC2012/JPEGImages/2008_004679.jpg 500 375 5 68 1 471 345 14 56 210 80 276 +7334 /data/VOCdevkit/VOC2012/JPEGImages/2008_004684.jpg 466 500 6 1 5 466 500 +7335 /data/VOCdevkit/VOC2012/JPEGImages/2008_004687.jpg 500 417 12 45 72 365 303 14 34 201 102 364 +7336 /data/VOCdevkit/VOC2012/JPEGImages/2008_004688.jpg 500 333 7 1 1 500 333 +7337 /data/VOCdevkit/VOC2012/JPEGImages/2008_004689.jpg 500 367 2 207 67 308 155 +7338 /data/VOCdevkit/VOC2012/JPEGImages/2008_004690.jpg 500 375 2 233 121 289 329 2 446 147 500 255 +7339 /data/VOCdevkit/VOC2012/JPEGImages/2008_004692.jpg 480 360 14 103 180 228 360 +7340 /data/VOCdevkit/VOC2012/JPEGImages/2008_004695.jpg 500 400 11 1 118 346 400 +7341 /data/VOCdevkit/VOC2012/JPEGImages/2008_004696.jpg 333 500 12 1 1 264 485 +7342 /data/VOCdevkit/VOC2012/JPEGImages/2008_004697.jpg 500 377 8 75 72 213 308 8 232 13 386 331 8 414 89 500 377 17 1 84 437 377 +7343 /data/VOCdevkit/VOC2012/JPEGImages/2008_004701.jpg 500 375 9 1 1 443 375 +7344 /data/VOCdevkit/VOC2012/JPEGImages/2008_004702.jpg 500 333 11 207 166 429 333 +7345 /data/VOCdevkit/VOC2012/JPEGImages/2008_004703.jpg 500 375 13 1 136 158 250 14 30 95 123 219 +7346 /data/VOCdevkit/VOC2012/JPEGImages/2008_004704.jpg 500 322 0 3 1 500 322 +7347 /data/VOCdevkit/VOC2012/JPEGImages/2008_004705.jpg 333 500 12 91 85 333 478 +7348 /data/VOCdevkit/VOC2012/JPEGImages/2008_004706.jpg 500 332 14 213 59 403 332 14 12 42 222 332 +7349 /data/VOCdevkit/VOC2012/JPEGImages/2008_004707.jpg 500 375 14 36 91 106 185 14 75 92 151 296 14 252 89 295 140 14 279 67 363 243 14 338 80 382 215 14 130 7 331 375 +7350 /data/VOCdevkit/VOC2012/JPEGImages/2008_004711.jpg 500 375 14 238 61 403 337 6 1 2 274 227 +7351 /data/VOCdevkit/VOC2012/JPEGImages/2008_004713.jpg 500 375 14 402 30 459 144 6 1 71 103 223 6 80 46 449 342 +7352 /data/VOCdevkit/VOC2012/JPEGImages/2008_004716.jpg 500 333 3 248 69 405 263 +7353 /data/VOCdevkit/VOC2012/JPEGImages/2008_004718.jpg 333 500 3 27 26 333 398 +7354 /data/VOCdevkit/VOC2012/JPEGImages/2008_004719.jpg 500 375 19 29 62 254 276 19 254 53 471 264 +7355 /data/VOCdevkit/VOC2012/JPEGImages/2008_004720.jpg 500 375 19 246 84 327 169 19 171 86 251 186 8 319 113 500 375 +7356 /data/VOCdevkit/VOC2012/JPEGImages/2008_004722.jpg 500 375 11 5 1 450 310 +7357 /data/VOCdevkit/VOC2012/JPEGImages/2008_004725.jpg 382 500 5 26 165 382 494 +7358 /data/VOCdevkit/VOC2012/JPEGImages/2008_004726.jpg 500 333 0 115 112 454 223 +7359 /data/VOCdevkit/VOC2012/JPEGImages/2008_004729.jpg 500 375 6 331 133 500 247 6 1 148 73 231 13 380 172 482 255 13 297 135 376 246 14 399 139 456 254 14 301 137 345 189 14 214 161 230 177 6 57 91 344 253 +7360 /data/VOCdevkit/VOC2012/JPEGImages/2008_004730.jpg 334 500 2 66 89 215 462 +7361 /data/VOCdevkit/VOC2012/JPEGImages/2008_004732.jpg 500 333 7 52 26 411 333 +7362 /data/VOCdevkit/VOC2012/JPEGImages/2008_004736.jpg 500 375 7 190 134 291 269 +7363 /data/VOCdevkit/VOC2012/JPEGImages/2008_004739.jpg 500 333 0 23 92 465 285 +7364 /data/VOCdevkit/VOC2012/JPEGImages/2008_004740.jpg 323 500 14 8 1 323 500 +7365 /data/VOCdevkit/VOC2012/JPEGImages/2008_004742.jpg 500 326 2 119 64 161 180 +7366 /data/VOCdevkit/VOC2012/JPEGImages/2008_004745.jpg 500 450 11 48 227 251 450 14 113 13 500 421 +7367 /data/VOCdevkit/VOC2012/JPEGImages/2008_004749.jpg 360 480 14 22 8 331 480 +7368 /data/VOCdevkit/VOC2012/JPEGImages/2008_004750.jpg 500 333 3 95 101 226 260 3 290 99 399 262 3 420 145 487 252 +7369 /data/VOCdevkit/VOC2012/JPEGImages/2008_004752.jpg 500 333 11 13 79 338 333 +7370 /data/VOCdevkit/VOC2012/JPEGImages/2008_004754.jpg 500 375 19 127 1 354 192 +7371 /data/VOCdevkit/VOC2012/JPEGImages/2008_004756.jpg 500 333 15 244 204 300 305 15 11 197 82 323 14 280 86 344 320 +7372 /data/VOCdevkit/VOC2012/JPEGImages/2008_004758.jpg 500 375 1 8 45 372 353 +7373 /data/VOCdevkit/VOC2012/JPEGImages/2008_004760.jpg 500 375 11 48 77 394 375 +7374 /data/VOCdevkit/VOC2012/JPEGImages/2008_004763.jpg 500 334 2 290 142 309 159 11 315 200 381 260 11 202 197 249 252 +7375 /data/VOCdevkit/VOC2012/JPEGImages/2008_004764.jpg 500 437 12 22 109 447 417 14 202 32 331 239 +7376 /data/VOCdevkit/VOC2012/JPEGImages/2008_004766.jpg 375 500 2 286 316 316 353 +7377 /data/VOCdevkit/VOC2012/JPEGImages/2008_004767.jpg 500 375 7 20 59 496 295 +7378 /data/VOCdevkit/VOC2012/JPEGImages/2008_004768.jpg 500 375 11 1 38 500 375 +7379 /data/VOCdevkit/VOC2012/JPEGImages/2008_004770.jpg 500 324 18 1 1 484 324 14 1 79 113 217 +7380 /data/VOCdevkit/VOC2012/JPEGImages/2008_004771.jpg 500 313 0 24 72 273 161 +7381 /data/VOCdevkit/VOC2012/JPEGImages/2008_004774.jpg 352 500 14 55 111 137 277 11 103 264 182 318 11 227 263 277 339 17 50 233 352 457 +7382 /data/VOCdevkit/VOC2012/JPEGImages/2008_004776.jpg 500 375 8 214 236 268 362 8 17 297 93 375 10 22 240 223 375 +7383 /data/VOCdevkit/VOC2012/JPEGImages/2008_004777.jpg 500 336 8 360 235 430 336 +7384 /data/VOCdevkit/VOC2012/JPEGImages/2008_004778.jpg 258 400 14 14 180 137 332 14 1 41 208 400 8 63 85 258 400 4 63 172 117 216 +7385 /data/VOCdevkit/VOC2012/JPEGImages/2008_004781.jpg 500 333 14 51 65 276 333 19 215 96 500 333 +7386 /data/VOCdevkit/VOC2012/JPEGImages/2008_004783.jpg 500 375 2 144 255 172 275 6 157 189 212 216 +7387 /data/VOCdevkit/VOC2012/JPEGImages/2008_004784.jpg 375 500 14 157 63 261 239 1 167 137 246 299 +7388 /data/VOCdevkit/VOC2012/JPEGImages/2008_004786.jpg 500 375 13 199 10 462 233 13 37 10 385 370 13 439 17 500 102 +7389 /data/VOCdevkit/VOC2012/JPEGImages/2008_004794.jpg 500 300 5 90 241 192 279 +7390 /data/VOCdevkit/VOC2012/JPEGImages/2008_004795.jpg 500 333 4 237 128 258 170 4 103 97 128 167 +7391 /data/VOCdevkit/VOC2012/JPEGImages/2008_004797.jpg 375 500 7 165 261 327 353 +7392 /data/VOCdevkit/VOC2012/JPEGImages/2008_004802.jpg 500 333 0 14 88 486 213 +7393 /data/VOCdevkit/VOC2012/JPEGImages/2008_004804.jpg 500 375 11 145 50 382 375 +7394 /data/VOCdevkit/VOC2012/JPEGImages/2008_004805.jpg 424 500 2 239 158 317 315 +7395 /data/VOCdevkit/VOC2012/JPEGImages/2008_004807.jpg 375 500 14 1 113 180 500 19 172 272 335 398 14 112 155 200 420 +7396 /data/VOCdevkit/VOC2012/JPEGImages/2008_004808.jpg 500 375 2 1 1 500 375 2 3 11 99 260 +7397 /data/VOCdevkit/VOC2012/JPEGImages/2008_004812.jpg 500 375 3 240 193 379 307 +7398 /data/VOCdevkit/VOC2012/JPEGImages/2008_004814.jpg 500 375 14 171 77 492 375 4 15 34 61 130 +7399 /data/VOCdevkit/VOC2012/JPEGImages/2008_004819.jpg 500 375 0 1 100 492 272 +7400 /data/VOCdevkit/VOC2012/JPEGImages/2008_004821.jpg 500 333 11 1 1 323 333 +7401 /data/VOCdevkit/VOC2012/JPEGImages/2008_004822.jpg 500 375 13 93 98 432 300 +7402 /data/VOCdevkit/VOC2012/JPEGImages/2008_004825.jpg 500 334 2 91 27 488 303 +7403 /data/VOCdevkit/VOC2012/JPEGImages/2008_004827.jpg 500 375 9 75 229 147 293 +7404 /data/VOCdevkit/VOC2012/JPEGImages/2008_004832.jpg 324 432 13 79 91 245 403 13 237 108 324 213 13 5 143 125 237 6 1 43 238 138 14 78 75 238 326 14 21 67 124 207 14 163 27 204 104 14 9 50 31 70 +7405 /data/VOCdevkit/VOC2012/JPEGImages/2008_004833.jpg 500 369 11 18 51 453 362 +7406 /data/VOCdevkit/VOC2012/JPEGImages/2008_004834.jpg 500 375 14 202 148 283 368 10 258 161 429 267 8 124 153 205 272 8 252 135 316 259 8 383 145 451 264 +7407 /data/VOCdevkit/VOC2012/JPEGImages/2008_004837.jpg 375 500 2 222 337 375 488 +7408 /data/VOCdevkit/VOC2012/JPEGImages/2008_004838.jpg 500 375 13 131 1 341 375 +7409 /data/VOCdevkit/VOC2012/JPEGImages/2008_004841.jpg 500 333 9 192 1 500 333 14 135 91 300 303 +7410 /data/VOCdevkit/VOC2012/JPEGImages/2008_004844.jpg 500 375 5 126 178 449 303 14 23 224 51 312 14 1 233 24 313 +7411 /data/VOCdevkit/VOC2012/JPEGImages/2008_004845.jpg 500 333 11 91 55 500 333 +7412 /data/VOCdevkit/VOC2012/JPEGImages/2008_004847.jpg 500 375 0 1 74 500 299 +7413 /data/VOCdevkit/VOC2012/JPEGImages/2008_004849.jpg 500 333 14 250 83 448 333 14 119 47 268 272 14 128 1 183 78 14 464 37 500 73 +7414 /data/VOCdevkit/VOC2012/JPEGImages/2008_004850.jpg 347 500 6 81 348 221 407 6 58 426 287 500 +7415 /data/VOCdevkit/VOC2012/JPEGImages/2008_004851.jpg 500 375 14 222 33 369 252 14 176 160 281 255 14 3 59 161 298 10 1 249 500 375 +7416 /data/VOCdevkit/VOC2012/JPEGImages/2008_004852.jpg 500 375 18 1 195 322 230 18 1 215 318 267 14 476 240 487 266 +7417 /data/VOCdevkit/VOC2012/JPEGImages/2008_004854.jpg 500 375 16 199 1 494 199 16 1 61 339 321 +7418 /data/VOCdevkit/VOC2012/JPEGImages/2008_004856.jpg 500 375 7 52 146 269 305 7 225 79 455 375 +7419 /data/VOCdevkit/VOC2012/JPEGImages/2008_004858.jpg 500 333 6 86 73 405 225 14 36 66 71 155 14 443 74 474 151 14 432 96 452 140 +7420 /data/VOCdevkit/VOC2012/JPEGImages/2008_004862.jpg 500 375 1 142 174 280 325 6 1 93 113 270 6 1 138 206 245 6 142 143 248 208 6 209 142 279 196 6 396 127 435 147 14 305 120 336 269 14 259 120 330 303 +7421 /data/VOCdevkit/VOC2012/JPEGImages/2008_004866.jpg 500 375 14 369 118 408 209 14 310 133 364 349 14 255 131 306 354 14 158 132 236 328 5 9 7 271 284 14 78 111 151 170 14 238 139 276 337 +7422 /data/VOCdevkit/VOC2012/JPEGImages/2008_004868.jpg 500 357 12 2 3 320 355 14 307 67 496 356 +7423 /data/VOCdevkit/VOC2012/JPEGImages/2008_004869.jpg 500 375 18 1 62 279 342 +7424 /data/VOCdevkit/VOC2012/JPEGImages/2008_004872.jpg 500 375 6 1 205 59 306 14 331 93 448 375 +7425 /data/VOCdevkit/VOC2012/JPEGImages/2008_004873.jpg 500 375 7 78 6 415 347 +7426 /data/VOCdevkit/VOC2012/JPEGImages/2008_004874.jpg 375 500 8 1 238 133 500 14 87 99 375 500 +7427 /data/VOCdevkit/VOC2012/JPEGImages/2008_004875.jpg 500 375 14 361 23 486 180 14 137 244 310 375 14 88 12 200 125 +7428 /data/VOCdevkit/VOC2012/JPEGImages/2008_004876.jpg 500 375 6 70 148 286 280 +7429 /data/VOCdevkit/VOC2012/JPEGImages/2008_004881.jpg 500 375 19 368 50 500 229 14 178 9 334 361 14 143 160 216 369 17 1 157 164 347 +7430 /data/VOCdevkit/VOC2012/JPEGImages/2008_004885.jpg 500 333 0 22 96 375 211 +7431 /data/VOCdevkit/VOC2012/JPEGImages/2008_004887.jpg 500 375 17 270 124 500 228 17 249 115 321 177 +7432 /data/VOCdevkit/VOC2012/JPEGImages/2008_004892.jpg 500 322 12 20 92 144 308 12 131 102 228 298 12 202 99 286 307 12 289 103 374 292 12 373 88 449 286 12 430 117 500 307 14 9 66 106 201 14 120 74 202 200 14 191 71 279 181 14 269 86 334 177 14 351 65 423 184 14 411 68 500 214 +7433 /data/VOCdevkit/VOC2012/JPEGImages/2008_004893.jpg 500 380 2 64 124 287 254 +7434 /data/VOCdevkit/VOC2012/JPEGImages/2008_004894.jpg 500 375 14 179 130 324 329 +7435 /data/VOCdevkit/VOC2012/JPEGImages/2008_004896.jpg 500 376 8 206 64 428 320 +7436 /data/VOCdevkit/VOC2012/JPEGImages/2008_004898.jpg 500 375 19 61 9 176 100 4 17 94 53 173 +7437 /data/VOCdevkit/VOC2012/JPEGImages/2008_004899.jpg 500 375 6 274 294 385 328 6 331 293 395 319 0 187 185 269 212 +7438 /data/VOCdevkit/VOC2012/JPEGImages/2008_004900.jpg 375 500 11 21 64 375 500 +7439 /data/VOCdevkit/VOC2012/JPEGImages/2008_004903.jpg 333 500 13 120 167 264 300 14 120 112 269 298 +7440 /data/VOCdevkit/VOC2012/JPEGImages/2008_004904.jpg 500 375 3 1 1 401 355 +7441 /data/VOCdevkit/VOC2012/JPEGImages/2008_004907.jpg 500 248 3 423 88 443 140 +7442 /data/VOCdevkit/VOC2012/JPEGImages/2008_004908.jpg 500 281 19 75 51 236 191 19 237 52 393 190 +7443 /data/VOCdevkit/VOC2012/JPEGImages/2008_004910.jpg 500 375 19 237 158 350 256 +7444 /data/VOCdevkit/VOC2012/JPEGImages/2008_004911.jpg 500 392 12 138 64 375 363 +7445 /data/VOCdevkit/VOC2012/JPEGImages/2008_004914.jpg 375 500 18 157 124 222 207 +7446 /data/VOCdevkit/VOC2012/JPEGImages/2008_004917.jpg 500 333 0 3 74 494 214 6 414 179 438 191 +7447 /data/VOCdevkit/VOC2012/JPEGImages/2008_004920.jpg 500 333 3 241 1 437 314 3 113 41 215 264 3 1 13 95 293 +7448 /data/VOCdevkit/VOC2012/JPEGImages/2008_004921.jpg 500 333 3 1 1 144 314 3 142 230 259 318 3 244 1 500 331 3 240 156 258 253 +7449 /data/VOCdevkit/VOC2012/JPEGImages/2008_004923.jpg 500 334 6 5 90 48 117 +7450 /data/VOCdevkit/VOC2012/JPEGImages/2008_004926.jpg 500 375 4 172 233 290 375 4 316 191 354 306 4 17 115 43 172 14 222 86 491 375 14 31 84 235 338 14 1 51 114 289 +7451 /data/VOCdevkit/VOC2012/JPEGImages/2008_004930.jpg 500 375 19 24 4 476 373 14 186 108 371 273 +7452 /data/VOCdevkit/VOC2012/JPEGImages/2008_004931.jpg 500 375 11 170 131 327 331 +7453 /data/VOCdevkit/VOC2012/JPEGImages/2008_004933.jpg 500 375 7 1 1 464 375 +7454 /data/VOCdevkit/VOC2012/JPEGImages/2008_004934.jpg 500 375 4 138 16 249 296 4 317 228 381 290 4 312 290 372 345 4 308 351 366 375 4 243 341 300 375 4 253 279 309 336 4 198 264 247 323 4 122 317 180 374 4 184 328 237 375 +7455 /data/VOCdevkit/VOC2012/JPEGImages/2008_004935.jpg 500 333 0 427 163 470 187 0 224 126 267 149 0 90 130 133 151 +7456 /data/VOCdevkit/VOC2012/JPEGImages/2008_004937.jpg 500 375 14 356 126 500 279 14 189 114 316 258 14 1 100 107 325 4 256 179 293 301 4 205 181 248 300 +7457 /data/VOCdevkit/VOC2012/JPEGImages/2008_004938.jpg 374 500 17 1 133 364 436 14 53 67 352 500 +7458 /data/VOCdevkit/VOC2012/JPEGImages/2008_004940.jpg 500 333 13 42 71 500 333 13 1 57 331 333 14 186 1 361 270 +7459 /data/VOCdevkit/VOC2012/JPEGImages/2008_004942.jpg 500 375 2 208 142 474 312 2 35 71 258 240 +7460 /data/VOCdevkit/VOC2012/JPEGImages/2008_004945.jpg 500 375 6 220 256 410 348 6 21 288 134 375 6 9 269 42 287 +7461 /data/VOCdevkit/VOC2012/JPEGImages/2008_004946.jpg 500 354 18 70 100 389 321 18 385 182 427 238 +7462 /data/VOCdevkit/VOC2012/JPEGImages/2008_004948.jpg 500 375 4 266 225 287 293 4 151 233 182 321 4 14 304 46 375 4 106 339 129 375 4 157 200 178 257 14 92 116 218 254 14 249 121 350 258 10 1 223 366 375 14 286 152 491 375 +7463 /data/VOCdevkit/VOC2012/JPEGImages/2008_004950.jpg 266 400 11 150 249 201 361 14 105 241 202 400 +7464 /data/VOCdevkit/VOC2012/JPEGImages/2008_004955.jpg 500 343 6 65 142 434 259 6 456 159 500 226 +7465 /data/VOCdevkit/VOC2012/JPEGImages/2008_004961.jpg 362 241 14 1 3 193 241 19 278 1 362 101 14 126 60 238 241 +7466 /data/VOCdevkit/VOC2012/JPEGImages/2008_004964.jpg 375 500 17 157 273 375 500 8 36 237 136 406 +7467 /data/VOCdevkit/VOC2012/JPEGImages/2008_004966.jpg 500 298 7 299 59 430 253 14 1 1 157 292 +7468 /data/VOCdevkit/VOC2012/JPEGImages/2008_004967.jpg 500 375 7 185 16 500 375 +7469 /data/VOCdevkit/VOC2012/JPEGImages/2008_004968.jpg 375 500 5 99 258 131 284 14 2 255 43 368 14 48 258 63 313 +7470 /data/VOCdevkit/VOC2012/JPEGImages/2008_004969.jpg 333 500 3 109 39 288 486 +7471 /data/VOCdevkit/VOC2012/JPEGImages/2008_004970.jpg 500 500 13 1 1 500 500 +7472 /data/VOCdevkit/VOC2012/JPEGImages/2008_004973.jpg 500 357 2 20 80 320 282 +7473 /data/VOCdevkit/VOC2012/JPEGImages/2008_004974.jpg 500 375 6 168 133 337 247 +7474 /data/VOCdevkit/VOC2012/JPEGImages/2008_004975.jpg 500 333 11 209 1 500 333 +7475 /data/VOCdevkit/VOC2012/JPEGImages/2008_004976.jpg 500 333 5 73 39 341 301 5 7 91 82 216 6 15 162 55 223 6 38 162 74 225 6 435 163 473 183 14 241 87 277 164 14 176 81 233 165 +7476 /data/VOCdevkit/VOC2012/JPEGImages/2008_004977.jpg 500 375 15 1 1 500 347 +7477 /data/VOCdevkit/VOC2012/JPEGImages/2008_004979.jpg 500 375 4 176 55 222 228 10 1 131 495 375 14 209 1 422 156 +7478 /data/VOCdevkit/VOC2012/JPEGImages/2008_004981.jpg 375 500 0 1 20 375 363 +7479 /data/VOCdevkit/VOC2012/JPEGImages/2008_004982.jpg 375 500 4 241 1 336 318 +7480 /data/VOCdevkit/VOC2012/JPEGImages/2008_004983.jpg 500 375 3 49 230 292 318 14 172 244 203 300 +7481 /data/VOCdevkit/VOC2012/JPEGImages/2008_004984.jpg 500 375 14 69 1 323 260 14 63 13 239 262 14 1 173 93 268 8 305 11 401 154 +7482 /data/VOCdevkit/VOC2012/JPEGImages/2008_004985.jpg 375 500 8 174 197 225 277 8 194 226 249 310 +7483 /data/VOCdevkit/VOC2012/JPEGImages/2008_004986.jpg 500 375 11 60 64 390 309 +7484 /data/VOCdevkit/VOC2012/JPEGImages/2008_004990.jpg 500 375 7 1 3 468 372 +7485 /data/VOCdevkit/VOC2012/JPEGImages/2008_004991.jpg 480 359 4 365 266 389 325 4 202 207 219 248 14 229 79 392 297 14 24 132 233 259 +7486 /data/VOCdevkit/VOC2012/JPEGImages/2008_004995.jpg 500 333 1 27 144 216 330 +7487 /data/VOCdevkit/VOC2012/JPEGImages/2008_004998.jpg 375 500 11 131 192 291 300 +7488 /data/VOCdevkit/VOC2012/JPEGImages/2008_005000.jpg 500 333 13 61 150 170 279 14 58 56 295 261 +7489 /data/VOCdevkit/VOC2012/JPEGImages/2008_005001.jpg 500 404 15 53 241 100 293 15 80 143 115 176 15 437 208 459 234 15 441 150 473 170 15 330 146 358 185 14 295 144 328 202 +7490 /data/VOCdevkit/VOC2012/JPEGImages/2008_005003.jpg 500 375 7 1 1 457 375 +7491 /data/VOCdevkit/VOC2012/JPEGImages/2008_005006.jpg 497 500 19 114 153 323 328 +7492 /data/VOCdevkit/VOC2012/JPEGImages/2008_005008.jpg 500 375 19 219 106 389 250 +7493 /data/VOCdevkit/VOC2012/JPEGImages/2008_005010.jpg 500 375 9 1 142 37 217 9 36 61 354 375 +7494 /data/VOCdevkit/VOC2012/JPEGImages/2008_005013.jpg 500 333 7 108 73 377 266 +7495 /data/VOCdevkit/VOC2012/JPEGImages/2008_005015.jpg 367 500 11 32 74 330 422 +7496 /data/VOCdevkit/VOC2012/JPEGImages/2008_005016.jpg 368 500 11 118 72 353 500 14 10 40 283 500 +7497 /data/VOCdevkit/VOC2012/JPEGImages/2008_005023.jpg 375 500 4 244 191 278 290 4 218 223 246 289 +7498 /data/VOCdevkit/VOC2012/JPEGImages/2008_005032.jpg 500 375 6 1 96 157 350 6 67 131 221 276 14 228 79 412 342 13 290 178 386 375 +7499 /data/VOCdevkit/VOC2012/JPEGImages/2008_005033.jpg 500 416 13 16 5 322 416 13 1 1 386 225 14 254 104 494 416 +7500 /data/VOCdevkit/VOC2012/JPEGImages/2008_005035.jpg 375 500 14 52 105 243 500 14 127 1 251 224 +7501 /data/VOCdevkit/VOC2012/JPEGImages/2008_005036.jpg 500 333 0 67 83 388 199 +7502 /data/VOCdevkit/VOC2012/JPEGImages/2008_005037.jpg 500 375 19 347 29 429 132 8 181 69 331 292 +7503 /data/VOCdevkit/VOC2012/JPEGImages/2008_005040.jpg 486 500 15 414 213 486 477 15 40 229 270 500 14 428 295 455 350 +7504 /data/VOCdevkit/VOC2012/JPEGImages/2008_005042.jpg 500 375 15 153 15 500 369 15 5 165 203 313 +7505 /data/VOCdevkit/VOC2012/JPEGImages/2008_005043.jpg 448 336 3 10 120 66 149 14 79 81 219 336 14 218 32 361 336 +7506 /data/VOCdevkit/VOC2012/JPEGImages/2008_005045.jpg 333 500 6 7 162 333 431 6 1 161 58 218 14 28 114 171 442 14 135 204 239 410 +7507 /data/VOCdevkit/VOC2012/JPEGImages/2008_005046.jpg 500 375 14 2 106 500 315 11 175 207 458 328 +7508 /data/VOCdevkit/VOC2012/JPEGImages/2008_005049.jpg 500 375 13 101 146 337 331 +7509 /data/VOCdevkit/VOC2012/JPEGImages/2008_005051.jpg 500 375 11 32 1 482 366 +7510 /data/VOCdevkit/VOC2012/JPEGImages/2008_005054.jpg 500 375 6 324 108 442 196 6 127 114 216 203 6 35 128 111 221 6 232 105 342 203 6 389 82 500 184 +7511 /data/VOCdevkit/VOC2012/JPEGImages/2008_005055.jpg 375 500 14 110 161 164 261 14 185 125 220 203 1 108 212 159 289 +7512 /data/VOCdevkit/VOC2012/JPEGImages/2008_005057.jpg 500 333 0 76 140 432 233 +7513 /data/VOCdevkit/VOC2012/JPEGImages/2008_005061.jpg 500 455 7 68 43 403 454 +7514 /data/VOCdevkit/VOC2012/JPEGImages/2008_005063.jpg 500 375 3 257 28 315 46 3 1 187 500 375 14 80 133 240 375 14 228 147 410 349 +7515 /data/VOCdevkit/VOC2012/JPEGImages/2008_005064.jpg 500 400 7 158 93 290 258 19 74 257 386 400 +7516 /data/VOCdevkit/VOC2012/JPEGImages/2008_005065.jpg 500 283 11 64 107 102 162 11 66 171 195 228 +7517 /data/VOCdevkit/VOC2012/JPEGImages/2008_005066.jpg 500 371 19 1 51 65 207 8 177 99 500 371 14 135 71 411 371 +7518 /data/VOCdevkit/VOC2012/JPEGImages/2008_005068.jpg 334 500 8 136 293 259 477 +7519 /data/VOCdevkit/VOC2012/JPEGImages/2008_005070.jpg 500 375 10 19 135 467 375 8 385 66 500 250 +7520 /data/VOCdevkit/VOC2012/JPEGImages/2008_005071.jpg 500 375 3 21 14 442 324 3 341 170 500 228 +7521 /data/VOCdevkit/VOC2012/JPEGImages/2008_005072.jpg 500 400 14 1 1 494 400 7 1 177 271 378 +7522 /data/VOCdevkit/VOC2012/JPEGImages/2008_005074.jpg 500 274 5 25 138 120 220 6 201 149 359 237 +7523 /data/VOCdevkit/VOC2012/JPEGImages/2008_005078.jpg 500 334 0 1 32 492 286 6 21 191 61 222 +7524 /data/VOCdevkit/VOC2012/JPEGImages/2008_005080.jpg 343 500 2 168 285 264 383 2 36 60 255 500 +7525 /data/VOCdevkit/VOC2012/JPEGImages/2008_005081.jpg 400 300 8 218 116 335 287 8 315 109 400 263 8 89 96 196 269 8 82 81 176 202 10 112 82 400 283 +7526 /data/VOCdevkit/VOC2012/JPEGImages/2008_005082.jpg 500 375 11 194 57 500 375 +7527 /data/VOCdevkit/VOC2012/JPEGImages/2008_005084.jpg 500 357 11 46 80 434 353 +7528 /data/VOCdevkit/VOC2012/JPEGImages/2008_005085.jpg 500 338 18 1 36 500 314 +7529 /data/VOCdevkit/VOC2012/JPEGImages/2008_005088.jpg 500 375 7 46 86 348 297 +7530 /data/VOCdevkit/VOC2012/JPEGImages/2008_005089.jpg 500 374 19 155 149 299 276 14 332 139 412 279 4 325 303 360 374 4 375 270 409 346 4 225 272 249 321 14 1 276 59 374 +7531 /data/VOCdevkit/VOC2012/JPEGImages/2008_005090.jpg 375 500 19 277 236 371 322 4 216 485 279 500 14 97 224 253 444 14 1 276 176 418 17 1 201 255 454 +7532 /data/VOCdevkit/VOC2012/JPEGImages/2008_005092.jpg 500 333 2 120 26 435 327 +7533 /data/VOCdevkit/VOC2012/JPEGImages/2008_005094.jpg 500 375 19 7 168 94 235 14 154 184 316 371 4 110 237 127 298 +7534 /data/VOCdevkit/VOC2012/JPEGImages/2008_005096.jpg 500 333 2 125 107 279 203 +7535 /data/VOCdevkit/VOC2012/JPEGImages/2008_005097.jpg 500 333 9 286 64 500 333 9 139 59 380 333 9 1 62 221 333 9 50 17 334 95 +7536 /data/VOCdevkit/VOC2012/JPEGImages/2008_005098.jpg 252 400 14 32 36 252 400 +7537 /data/VOCdevkit/VOC2012/JPEGImages/2008_005101.jpg 400 500 11 117 145 276 400 14 1 1 286 500 6 114 1 400 500 +7538 /data/VOCdevkit/VOC2012/JPEGImages/2008_005105.jpg 500 375 9 66 67 376 374 +7539 /data/VOCdevkit/VOC2012/JPEGImages/2008_005107.jpg 375 500 14 96 161 375 500 8 1 75 375 500 +7540 /data/VOCdevkit/VOC2012/JPEGImages/2008_005108.jpg 500 156 3 5 82 311 109 +7541 /data/VOCdevkit/VOC2012/JPEGImages/2008_005109.jpg 333 500 7 84 73 333 361 +7542 /data/VOCdevkit/VOC2012/JPEGImages/2008_005110.jpg 500 375 6 154 141 398 295 14 101 144 157 267 +7543 /data/VOCdevkit/VOC2012/JPEGImages/2008_005111.jpg 374 500 11 230 369 336 464 8 302 161 374 284 8 202 147 300 262 8 203 112 268 189 15 76 124 107 197 14 106 13 208 367 +7544 /data/VOCdevkit/VOC2012/JPEGImages/2008_005114.jpg 500 375 0 6 143 498 319 +7545 /data/VOCdevkit/VOC2012/JPEGImages/2008_005115.jpg 327 500 2 20 32 309 489 +7546 /data/VOCdevkit/VOC2012/JPEGImages/2008_005117.jpg 500 375 3 151 46 176 84 +7547 /data/VOCdevkit/VOC2012/JPEGImages/2008_005123.jpg 500 375 11 113 75 500 349 +7548 /data/VOCdevkit/VOC2012/JPEGImages/2008_005127.jpg 500 375 6 392 260 500 375 +7549 /data/VOCdevkit/VOC2012/JPEGImages/2008_005132.jpg 500 331 3 90 208 131 238 3 209 203 257 227 3 287 213 335 233 3 327 202 370 226 +7550 /data/VOCdevkit/VOC2012/JPEGImages/2008_005133.jpg 500 375 14 53 97 222 375 +7551 /data/VOCdevkit/VOC2012/JPEGImages/2008_005134.jpg 500 333 7 1 32 469 333 +7552 /data/VOCdevkit/VOC2012/JPEGImages/2008_005136.jpg 500 429 8 194 253 306 429 +7553 /data/VOCdevkit/VOC2012/JPEGImages/2008_005137.jpg 500 375 11 158 109 296 244 +7554 /data/VOCdevkit/VOC2012/JPEGImages/2008_005139.jpg 500 375 6 261 84 341 162 6 113 108 214 188 6 257 62 340 120 6 143 66 236 153 6 256 39 332 84 6 270 8 327 60 6 286 1 341 49 6 23 78 123 155 6 348 274 500 375 6 373 173 500 279 6 434 132 500 177 6 412 109 500 177 6 400 71 486 151 6 394 54 470 116 6 377 1 446 76 6 476 18 500 79 6 453 1 500 46 6 1 116 43 183 5 133 1 277 86 13 49 272 101 366 13 235 176 288 255 13 120 82 151 125 14 56 234 115 339 14 236 152 285 239 13 123 174 182 242 14 127 145 174 233 14 120 58 149 93 +7555 /data/VOCdevkit/VOC2012/JPEGImages/2008_005140.jpg 333 500 4 202 60 306 430 +7556 /data/VOCdevkit/VOC2012/JPEGImages/2008_005146.jpg 500 375 15 198 121 328 279 14 159 5 327 375 14 48 13 182 335 8 323 148 378 219 4 74 161 93 195 +7557 /data/VOCdevkit/VOC2012/JPEGImages/2008_005147.jpg 500 375 1 119 75 463 281 +7558 /data/VOCdevkit/VOC2012/JPEGImages/2008_005150.jpg 500 375 10 132 193 421 375 8 89 278 207 375 8 92 239 183 346 14 86 114 149 324 14 126 104 183 290 14 287 117 385 237 14 378 149 490 375 14 197 117 258 194 +7559 /data/VOCdevkit/VOC2012/JPEGImages/2008_005151.jpg 333 500 14 16 19 333 500 14 27 1 199 319 +7560 /data/VOCdevkit/VOC2012/JPEGImages/2008_005156.jpg 500 333 3 1 186 500 224 14 158 129 225 205 14 262 153 308 205 14 346 154 394 203 14 419 152 480 204 +7561 /data/VOCdevkit/VOC2012/JPEGImages/2008_005158.jpg 500 333 6 389 244 457 259 +7562 /data/VOCdevkit/VOC2012/JPEGImages/2008_005159.jpg 500 400 6 205 205 295 286 6 67 211 165 279 6 363 216 500 273 6 275 204 397 266 6 103 206 220 251 6 1 209 68 274 6 464 245 500 289 6 462 215 500 235 +7563 /data/VOCdevkit/VOC2012/JPEGImages/2008_005160.jpg 500 375 11 160 19 278 348 +7564 /data/VOCdevkit/VOC2012/JPEGImages/2008_005166.jpg 500 294 12 242 69 480 259 12 23 62 229 263 6 454 88 488 101 +7565 /data/VOCdevkit/VOC2012/JPEGImages/2008_005167.jpg 500 375 11 203 178 310 271 8 1 1 92 241 +7566 /data/VOCdevkit/VOC2012/JPEGImages/2008_005168.jpg 500 375 12 13 174 215 342 14 249 132 291 188 14 291 109 429 375 +7567 /data/VOCdevkit/VOC2012/JPEGImages/2008_005171.jpg 500 332 6 142 132 500 314 14 216 141 285 268 6 350 125 405 146 +7568 /data/VOCdevkit/VOC2012/JPEGImages/2008_005172.jpg 500 307 13 20 111 175 237 14 37 72 205 231 +7569 /data/VOCdevkit/VOC2012/JPEGImages/2008_005174.jpg 500 375 11 250 39 356 211 +7570 /data/VOCdevkit/VOC2012/JPEGImages/2008_005175.jpg 500 379 1 279 301 351 348 +7571 /data/VOCdevkit/VOC2012/JPEGImages/2008_005178.jpg 500 375 11 346 122 464 325 11 276 172 369 323 11 188 223 295 346 14 61 87 292 369 +7572 /data/VOCdevkit/VOC2012/JPEGImages/2008_005181.jpg 500 375 7 115 24 185 134 11 180 248 411 375 +7573 /data/VOCdevkit/VOC2012/JPEGImages/2008_005182.jpg 500 375 2 259 22 475 193 4 111 1 211 257 +7574 /data/VOCdevkit/VOC2012/JPEGImages/2008_005183.jpg 500 375 19 270 183 384 294 +7575 /data/VOCdevkit/VOC2012/JPEGImages/2008_005185.jpg 375 500 18 66 181 375 500 +7576 /data/VOCdevkit/VOC2012/JPEGImages/2008_005186.jpg 500 375 2 152 113 279 315 +7577 /data/VOCdevkit/VOC2012/JPEGImages/2008_005190.jpg 500 332 1 196 161 376 280 14 241 83 346 263 +7578 /data/VOCdevkit/VOC2012/JPEGImages/2008_005191.jpg 500 375 19 203 186 275 232 8 263 177 387 375 +7579 /data/VOCdevkit/VOC2012/JPEGImages/2008_005193.jpg 500 333 7 42 1 413 295 +7580 /data/VOCdevkit/VOC2012/JPEGImages/2008_005194.jpg 500 375 11 1 73 460 375 +7581 /data/VOCdevkit/VOC2012/JPEGImages/2008_005196.jpg 500 375 5 1 87 496 231 +7582 /data/VOCdevkit/VOC2012/JPEGImages/2008_005197.jpg 500 383 11 1 160 101 304 11 108 151 265 306 14 290 132 397 264 14 323 42 420 278 14 421 83 494 271 14 37 140 97 268 14 234 168 271 230 14 123 132 151 164 +7583 /data/VOCdevkit/VOC2012/JPEGImages/2008_005201.jpg 500 369 1 1 128 162 281 1 116 95 371 319 1 252 108 472 359 14 182 23 325 292 6 363 4 415 24 6 451 3 486 22 4 408 202 452 236 +7584 /data/VOCdevkit/VOC2012/JPEGImages/2008_005204.jpg 500 305 4 96 10 127 154 4 173 11 207 144 4 245 13 280 133 4 368 17 390 119 4 27 7 109 278 4 108 8 188 270 4 187 10 264 265 4 262 12 332 254 4 323 14 384 244 4 378 15 442 237 4 435 18 493 229 +7585 /data/VOCdevkit/VOC2012/JPEGImages/2008_005205.jpg 500 380 8 433 198 500 380 8 74 240 263 380 8 1 183 96 348 +7586 /data/VOCdevkit/VOC2012/JPEGImages/2008_005208.jpg 500 170 2 35 63 419 97 +7587 /data/VOCdevkit/VOC2012/JPEGImages/2008_005209.jpg 500 375 2 111 24 287 155 2 208 191 477 342 +7588 /data/VOCdevkit/VOC2012/JPEGImages/2008_005213.jpg 500 333 13 240 106 500 332 13 50 78 120 183 13 193 81 278 194 14 308 25 444 265 14 254 25 355 192 14 185 27 271 167 14 49 36 119 154 +7589 /data/VOCdevkit/VOC2012/JPEGImages/2008_005214.jpg 500 333 15 1 218 43 312 15 65 268 104 311 15 113 273 145 311 15 154 281 186 310 15 193 281 220 310 15 236 283 269 310 15 284 271 317 310 15 375 259 411 310 15 403 279 444 311 15 451 281 476 309 +7590 /data/VOCdevkit/VOC2012/JPEGImages/2008_005215.jpg 500 354 12 31 29 303 336 14 369 62 479 313 14 250 79 374 329 +7591 /data/VOCdevkit/VOC2012/JPEGImages/2008_005216.jpg 500 375 6 1 1 500 360 +7592 /data/VOCdevkit/VOC2012/JPEGImages/2008_005217.jpg 500 334 15 1 8 296 334 15 122 1 290 284 +7593 /data/VOCdevkit/VOC2012/JPEGImages/2008_005218.jpg 375 500 6 55 167 375 369 6 1 160 299 315 14 110 130 182 416 14 181 130 269 405 +7594 /data/VOCdevkit/VOC2012/JPEGImages/2008_005220.jpg 500 375 6 130 237 255 280 6 380 219 469 250 +7595 /data/VOCdevkit/VOC2012/JPEGImages/2008_005221.jpg 375 500 11 56 69 305 459 +7596 /data/VOCdevkit/VOC2012/JPEGImages/2008_005231.jpg 375 500 19 177 71 326 181 14 7 174 185 500 +7597 /data/VOCdevkit/VOC2012/JPEGImages/2008_005233.jpg 500 365 2 47 45 499 322 +7598 /data/VOCdevkit/VOC2012/JPEGImages/2008_005234.jpg 500 403 6 20 61 463 364 +7599 /data/VOCdevkit/VOC2012/JPEGImages/2008_005235.jpg 375 500 7 110 123 260 385 +7600 /data/VOCdevkit/VOC2012/JPEGImages/2008_005236.jpg 375 500 14 1 30 352 500 14 167 45 372 500 4 157 1 179 55 4 200 1 223 61 +7601 /data/VOCdevkit/VOC2012/JPEGImages/2008_005240.jpg 500 333 11 221 92 379 319 +7602 /data/VOCdevkit/VOC2012/JPEGImages/2008_005242.jpg 255 500 15 6 186 249 430 15 111 3 231 109 +7603 /data/VOCdevkit/VOC2012/JPEGImages/2008_005243.jpg 500 335 13 237 149 327 241 14 227 112 326 197 +7604 /data/VOCdevkit/VOC2012/JPEGImages/2008_005244.jpg 375 500 3 1 1 375 500 +7605 /data/VOCdevkit/VOC2012/JPEGImages/2008_005245.jpg 343 419 13 31 179 301 372 13 38 152 185 237 13 280 170 343 238 6 243 144 337 181 6 1 142 134 190 +7606 /data/VOCdevkit/VOC2012/JPEGImages/2008_005247.jpg 500 375 7 1 71 273 285 7 74 119 374 375 +7607 /data/VOCdevkit/VOC2012/JPEGImages/2008_005248.jpg 500 375 8 261 167 372 307 8 166 173 262 291 +7608 /data/VOCdevkit/VOC2012/JPEGImages/2008_005250.jpg 500 375 0 243 197 311 226 +7609 /data/VOCdevkit/VOC2012/JPEGImages/2008_005251.jpg 500 375 14 89 48 438 375 +7610 /data/VOCdevkit/VOC2012/JPEGImages/2008_005252.jpg 500 375 7 38 131 350 273 +7611 /data/VOCdevkit/VOC2012/JPEGImages/2008_005253.jpg 500 375 0 1 84 500 278 14 191 119 252 285 +7612 /data/VOCdevkit/VOC2012/JPEGImages/2008_005254.jpg 500 375 19 106 37 452 286 +7613 /data/VOCdevkit/VOC2012/JPEGImages/2008_005255.jpg 500 375 19 157 63 490 294 6 68 182 157 215 +7614 /data/VOCdevkit/VOC2012/JPEGImages/2008_005257.jpg 500 375 4 383 133 406 200 8 283 215 435 375 8 36 183 180 375 8 164 147 263 310 19 243 125 306 172 10 131 166 417 356 +7615 /data/VOCdevkit/VOC2012/JPEGImages/2008_005260.jpg 500 375 2 336 224 374 291 2 134 234 230 285 2 174 176 252 219 2 46 169 121 218 2 398 44 478 94 2 142 121 239 162 2 79 93 161 133 2 1 104 35 154 2 1 242 47 288 2 221 284 299 360 2 369 146 407 197 2 445 222 500 248 2 247 15 298 54 +7616 /data/VOCdevkit/VOC2012/JPEGImages/2008_005261.jpg 500 375 3 103 201 130 245 3 178 210 261 242 +7617 /data/VOCdevkit/VOC2012/JPEGImages/2008_005266.jpg 500 375 5 109 327 497 375 +7618 /data/VOCdevkit/VOC2012/JPEGImages/2008_005269.jpg 500 359 18 24 89 441 319 +7619 /data/VOCdevkit/VOC2012/JPEGImages/2008_005270.jpg 500 375 7 22 79 492 303 +7620 /data/VOCdevkit/VOC2012/JPEGImages/2008_005271.jpg 500 375 14 37 38 280 375 14 346 187 431 375 14 266 196 371 375 +7621 /data/VOCdevkit/VOC2012/JPEGImages/2008_005272.jpg 334 500 11 3 117 311 490 +7622 /data/VOCdevkit/VOC2012/JPEGImages/2008_005276.jpg 333 500 1 8 361 77 461 14 106 300 174 482 +7623 /data/VOCdevkit/VOC2012/JPEGImages/2008_005277.jpg 375 500 5 233 173 375 498 14 150 370 187 471 14 93 364 129 466 14 59 370 94 457 14 15 373 44 449 6 197 373 219 395 +7624 /data/VOCdevkit/VOC2012/JPEGImages/2008_005279.jpg 500 333 2 270 87 373 239 +7625 /data/VOCdevkit/VOC2012/JPEGImages/2008_005281.jpg 500 375 7 142 96 500 375 +7626 /data/VOCdevkit/VOC2012/JPEGImages/2008_005282.jpg 500 375 18 304 1 500 375 18 1 59 257 273 +7627 /data/VOCdevkit/VOC2012/JPEGImages/2008_005283.jpg 500 375 6 33 45 433 302 +7628 /data/VOCdevkit/VOC2012/JPEGImages/2008_005288.jpg 500 333 7 243 24 500 285 +7629 /data/VOCdevkit/VOC2012/JPEGImages/2008_005294.jpg 360 208 14 197 32 252 172 6 18 65 335 162 6 60 62 113 77 +7630 /data/VOCdevkit/VOC2012/JPEGImages/2008_005295.jpg 500 375 4 227 238 263 259 14 119 68 246 375 +7631 /data/VOCdevkit/VOC2012/JPEGImages/2008_005296.jpg 500 377 2 120 150 255 374 2 314 291 377 365 +7632 /data/VOCdevkit/VOC2012/JPEGImages/2008_005297.jpg 500 375 13 53 61 451 307 14 442 1 489 82 +7633 /data/VOCdevkit/VOC2012/JPEGImages/2008_005300.jpg 500 379 7 26 58 467 323 +7634 /data/VOCdevkit/VOC2012/JPEGImages/2008_005303.jpg 500 393 2 154 39 485 345 +7635 /data/VOCdevkit/VOC2012/JPEGImages/2008_005304.jpg 500 333 12 63 51 390 290 12 245 97 448 297 +7636 /data/VOCdevkit/VOC2012/JPEGImages/2008_005309.jpg 500 375 7 140 1 500 283 +7637 /data/VOCdevkit/VOC2012/JPEGImages/2008_005310.jpg 500 332 0 48 32 312 188 +7638 /data/VOCdevkit/VOC2012/JPEGImages/2008_005313.jpg 500 291 12 320 34 484 160 12 66 18 201 121 +7639 /data/VOCdevkit/VOC2012/JPEGImages/2008_005315.jpg 400 300 3 304 70 400 98 14 77 79 193 300 14 81 35 245 296 +7640 /data/VOCdevkit/VOC2012/JPEGImages/2008_005316.jpg 500 375 14 314 280 359 375 6 244 233 312 279 6 54 213 191 273 +7641 /data/VOCdevkit/VOC2012/JPEGImages/2008_005319.jpg 500 375 6 1 197 205 317 12 135 181 184 215 +7642 /data/VOCdevkit/VOC2012/JPEGImages/2008_005321.jpg 375 500 3 97 182 310 438 +7643 /data/VOCdevkit/VOC2012/JPEGImages/2008_005323.jpg 480 360 17 218 192 450 343 8 22 201 193 337 17 1 177 139 265 14 229 168 326 320 +7644 /data/VOCdevkit/VOC2012/JPEGImages/2008_005324.jpg 500 375 4 318 80 367 255 4 86 200 101 249 14 39 41 417 375 +7645 /data/VOCdevkit/VOC2012/JPEGImages/2008_005325.jpg 500 375 6 11 1 471 369 +7646 /data/VOCdevkit/VOC2012/JPEGImages/2008_005327.jpg 500 375 12 1 48 414 375 +7647 /data/VOCdevkit/VOC2012/JPEGImages/2008_005329.jpg 500 375 19 162 101 242 201 +7648 /data/VOCdevkit/VOC2012/JPEGImages/2008_005331.jpg 500 375 7 1 2 414 375 +7649 /data/VOCdevkit/VOC2012/JPEGImages/2008_005333.jpg 500 309 11 219 105 372 236 11 1 138 145 214 +7650 /data/VOCdevkit/VOC2012/JPEGImages/2008_005335.jpg 500 332 11 1 1 500 332 +7651 /data/VOCdevkit/VOC2012/JPEGImages/2008_005336.jpg 500 375 14 182 11 500 375 11 71 215 132 361 6 181 139 231 174 6 417 121 457 151 14 3 19 106 365 14 5 83 107 163 +7652 /data/VOCdevkit/VOC2012/JPEGImages/2008_005337.jpg 500 375 7 102 69 276 250 7 327 125 483 235 7 258 108 374 226 +7653 /data/VOCdevkit/VOC2012/JPEGImages/2008_005338.jpg 500 375 0 1 83 500 375 14 186 196 226 323 +7654 /data/VOCdevkit/VOC2012/JPEGImages/2008_005342.jpg 500 375 19 333 128 457 226 10 1 225 344 375 8 245 200 365 375 4 400 85 418 127 4 343 136 370 217 4 267 139 290 244 4 209 133 239 207 4 176 133 206 160 4 248 147 271 207 4 216 147 233 205 +7655 /data/VOCdevkit/VOC2012/JPEGImages/2008_005345.jpg 333 500 15 30 301 185 473 +7656 /data/VOCdevkit/VOC2012/JPEGImages/2008_005346.jpg 500 375 11 80 16 500 375 +7657 /data/VOCdevkit/VOC2012/JPEGImages/2008_005347.jpg 500 375 4 378 197 401 262 +7658 /data/VOCdevkit/VOC2012/JPEGImages/2008_005348.jpg 500 287 10 5 58 500 287 8 1 31 79 162 +7659 /data/VOCdevkit/VOC2012/JPEGImages/2008_005349.jpg 500 207 6 9 22 491 198 +7660 /data/VOCdevkit/VOC2012/JPEGImages/2008_005350.jpg 375 500 5 112 288 185 347 5 104 325 230 410 6 158 382 217 417 6 240 338 279 359 6 266 321 300 343 +7661 /data/VOCdevkit/VOC2012/JPEGImages/2008_005354.jpg 500 340 18 1 1 272 244 +7662 /data/VOCdevkit/VOC2012/JPEGImages/2008_005356.jpg 500 375 1 61 18 427 365 6 5 1 384 83 +7663 /data/VOCdevkit/VOC2012/JPEGImages/2008_005357.jpg 500 356 2 41 84 382 247 +7664 /data/VOCdevkit/VOC2012/JPEGImages/2008_005359.jpg 480 360 3 21 187 158 211 14 228 192 295 360 14 275 167 352 360 +7665 /data/VOCdevkit/VOC2012/JPEGImages/2008_005360.jpg 480 360 5 31 11 461 332 5 289 51 480 263 14 301 100 348 202 14 17 189 102 360 14 166 191 224 360 +7666 /data/VOCdevkit/VOC2012/JPEGImages/2008_005361.jpg 500 375 11 129 105 319 266 6 417 94 459 127 +7667 /data/VOCdevkit/VOC2012/JPEGImages/2008_005362.jpg 500 332 0 200 136 338 212 +7668 /data/VOCdevkit/VOC2012/JPEGImages/2008_005363.jpg 500 375 11 156 115 355 298 +7669 /data/VOCdevkit/VOC2012/JPEGImages/2008_005365.jpg 500 500 12 59 51 396 465 14 176 1 282 294 14 363 168 425 398 14 386 157 470 400 +7670 /data/VOCdevkit/VOC2012/JPEGImages/2008_005367.jpg 500 375 3 80 124 380 245 +7671 /data/VOCdevkit/VOC2012/JPEGImages/2008_005369.jpg 500 375 12 243 196 421 375 12 1 1 294 375 +7672 /data/VOCdevkit/VOC2012/JPEGImages/2008_005373.jpg 500 333 0 18 23 500 238 +7673 /data/VOCdevkit/VOC2012/JPEGImages/2008_005374.jpg 500 392 13 36 91 464 343 14 176 31 346 370 +7674 /data/VOCdevkit/VOC2012/JPEGImages/2008_005375.jpg 500 371 9 156 105 252 294 9 205 163 388 324 +7675 /data/VOCdevkit/VOC2012/JPEGImages/2008_005376.jpg 500 375 7 6 2 482 374 +7676 /data/VOCdevkit/VOC2012/JPEGImages/2008_005378.jpg 500 335 6 144 143 427 270 +7677 /data/VOCdevkit/VOC2012/JPEGImages/2008_005379.jpg 500 375 11 87 35 355 251 +7678 /data/VOCdevkit/VOC2012/JPEGImages/2008_005380.jpg 333 500 7 1 11 247 391 +7679 /data/VOCdevkit/VOC2012/JPEGImages/2008_005382.jpg 500 374 11 244 247 326 312 +7680 /data/VOCdevkit/VOC2012/JPEGImages/2008_005386.jpg 500 375 7 85 30 500 375 +7681 /data/VOCdevkit/VOC2012/JPEGImages/2008_005389.jpg 500 375 18 1 59 286 375 +7682 /data/VOCdevkit/VOC2012/JPEGImages/2008_005393.jpg 500 375 19 168 131 335 261 +7683 /data/VOCdevkit/VOC2012/JPEGImages/2008_005395.jpg 500 374 14 157 152 464 279 17 40 115 500 284 +7684 /data/VOCdevkit/VOC2012/JPEGImages/2008_005396.jpg 333 500 12 1 1 290 500 +7685 /data/VOCdevkit/VOC2012/JPEGImages/2008_005398.jpg 500 375 3 170 131 337 193 +7686 /data/VOCdevkit/VOC2012/JPEGImages/2008_005399.jpg 288 352 4 134 198 160 287 4 164 192 185 281 4 177 198 203 277 4 191 184 212 270 4 204 183 227 258 4 222 195 242 250 4 233 179 267 249 14 3 111 168 352 14 125 7 262 230 +7687 /data/VOCdevkit/VOC2012/JPEGImages/2008_005400.jpg 363 500 2 106 130 166 170 +7688 /data/VOCdevkit/VOC2012/JPEGImages/2008_005404.jpg 500 375 6 91 35 483 306 +7689 /data/VOCdevkit/VOC2012/JPEGImages/2008_005405.jpg 500 375 6 200 198 311 305 6 394 203 500 302 6 307 234 330 258 6 100 240 118 256 +7690 /data/VOCdevkit/VOC2012/JPEGImages/2008_005406.jpg 500 331 11 117 24 207 157 +7691 /data/VOCdevkit/VOC2012/JPEGImages/2008_005408.jpg 461 389 12 90 70 461 353 14 216 48 337 201 +7692 /data/VOCdevkit/VOC2012/JPEGImages/2008_005412.jpg 500 375 1 49 114 367 359 14 131 94 261 324 +7693 /data/VOCdevkit/VOC2012/JPEGImages/2008_005414.jpg 500 375 8 197 113 243 170 14 197 90 247 170 14 239 105 285 172 8 323 115 361 171 +7694 /data/VOCdevkit/VOC2012/JPEGImages/2008_005415.jpg 500 375 11 103 134 219 324 +7695 /data/VOCdevkit/VOC2012/JPEGImages/2008_005417.jpg 500 375 8 50 266 142 375 8 133 300 220 375 8 227 283 313 375 15 295 207 483 375 15 198 245 221 273 +7696 /data/VOCdevkit/VOC2012/JPEGImages/2008_005421.jpg 500 375 7 8 100 321 302 +7697 /data/VOCdevkit/VOC2012/JPEGImages/2008_005422.jpg 500 375 13 71 70 448 317 +7698 /data/VOCdevkit/VOC2012/JPEGImages/2008_005423.jpg 500 333 13 187 163 447 299 14 1 107 177 300 +7699 /data/VOCdevkit/VOC2012/JPEGImages/2008_005427.jpg 500 333 13 48 83 356 333 14 114 1 278 205 +7700 /data/VOCdevkit/VOC2012/JPEGImages/2008_005429.jpg 500 370 13 65 144 407 344 13 340 122 500 241 14 156 46 292 370 14 261 5 343 238 14 438 1 479 142 14 477 25 500 133 +7701 /data/VOCdevkit/VOC2012/JPEGImages/2008_005431.jpg 373 280 12 320 128 373 227 12 143 104 226 229 14 140 52 236 280 +7702 /data/VOCdevkit/VOC2012/JPEGImages/2008_005433.jpg 500 333 13 237 189 274 209 +7703 /data/VOCdevkit/VOC2012/JPEGImages/2008_005436.jpg 500 375 11 2 26 328 375 +7704 /data/VOCdevkit/VOC2012/JPEGImages/2008_005439.jpg 375 500 19 17 114 289 483 +7705 /data/VOCdevkit/VOC2012/JPEGImages/2008_005443.jpg 500 332 0 63 61 393 332 +7706 /data/VOCdevkit/VOC2012/JPEGImages/2008_005444.jpg 400 248 14 70 12 335 243 17 9 81 393 235 +7707 /data/VOCdevkit/VOC2012/JPEGImages/2008_005445.jpg 375 500 19 58 149 147 248 14 145 64 247 407 14 68 158 188 456 +7708 /data/VOCdevkit/VOC2012/JPEGImages/2008_005446.jpg 500 324 18 78 91 389 284 6 460 211 500 236 6 444 207 481 222 +7709 /data/VOCdevkit/VOC2012/JPEGImages/2008_005447.jpg 500 333 16 391 230 465 278 16 283 213 361 264 14 1 1 319 333 +7710 /data/VOCdevkit/VOC2012/JPEGImages/2008_005449.jpg 500 375 7 160 117 368 324 +7711 /data/VOCdevkit/VOC2012/JPEGImages/2008_005451.jpg 500 375 11 119 82 356 263 +7712 /data/VOCdevkit/VOC2012/JPEGImages/2008_005455.jpg 500 333 0 32 95 464 219 +7713 /data/VOCdevkit/VOC2012/JPEGImages/2008_005456.jpg 380 500 8 42 25 380 500 +7714 /data/VOCdevkit/VOC2012/JPEGImages/2008_005460.jpg 500 375 7 90 1 364 375 +7715 /data/VOCdevkit/VOC2012/JPEGImages/2008_005463.jpg 500 331 7 13 106 185 227 7 184 45 485 283 +7716 /data/VOCdevkit/VOC2012/JPEGImages/2008_005465.jpg 500 322 2 144 61 500 267 +7717 /data/VOCdevkit/VOC2012/JPEGImages/2008_005467.jpg 500 375 11 42 119 363 319 +7718 /data/VOCdevkit/VOC2012/JPEGImages/2008_005469.jpg 375 500 7 1 39 321 500 +7719 /data/VOCdevkit/VOC2012/JPEGImages/2008_005472.jpg 500 375 14 59 175 454 375 14 226 1 383 217 6 376 141 489 180 +7720 /data/VOCdevkit/VOC2012/JPEGImages/2008_005473.jpg 500 333 12 85 139 203 232 12 220 146 247 220 12 290 143 325 229 12 314 134 384 216 +7721 /data/VOCdevkit/VOC2012/JPEGImages/2008_005477.jpg 333 500 2 25 49 333 500 +7722 /data/VOCdevkit/VOC2012/JPEGImages/2008_005480.jpg 241 173 7 53 1 178 173 +7723 /data/VOCdevkit/VOC2012/JPEGImages/2008_005484.jpg 500 375 1 80 248 332 375 14 128 32 500 375 +7724 /data/VOCdevkit/VOC2012/JPEGImages/2008_005485.jpg 500 428 12 1 48 482 421 14 373 124 484 376 +7725 /data/VOCdevkit/VOC2012/JPEGImages/2008_005490.jpg 288 432 14 18 120 283 343 +7726 /data/VOCdevkit/VOC2012/JPEGImages/2008_005491.jpg 500 375 0 128 173 195 202 0 250 196 316 223 0 393 194 462 223 0 328 195 393 225 +7727 /data/VOCdevkit/VOC2012/JPEGImages/2008_005494.jpg 500 375 16 219 127 500 375 14 73 90 196 375 +7728 /data/VOCdevkit/VOC2012/JPEGImages/2008_005496.jpg 436 500 7 31 138 214 500 7 203 262 408 405 +7729 /data/VOCdevkit/VOC2012/JPEGImages/2008_005498.jpg 500 375 12 1 118 307 373 14 126 61 292 308 +7730 /data/VOCdevkit/VOC2012/JPEGImages/2008_005500.jpg 375 500 14 110 160 254 467 +7731 /data/VOCdevkit/VOC2012/JPEGImages/2008_005501.jpg 500 422 14 229 22 356 231 12 128 72 402 289 14 105 96 137 164 15 364 307 488 422 +7732 /data/VOCdevkit/VOC2012/JPEGImages/2008_005502.jpg 500 330 3 33 1 276 304 +7733 /data/VOCdevkit/VOC2012/JPEGImages/2008_005504.jpg 500 388 3 369 89 459 285 3 276 115 346 288 3 24 141 138 342 +7734 /data/VOCdevkit/VOC2012/JPEGImages/2008_005505.jpg 500 202 16 182 90 256 178 +7735 /data/VOCdevkit/VOC2012/JPEGImages/2008_005507.jpg 486 500 2 76 93 392 393 +7736 /data/VOCdevkit/VOC2012/JPEGImages/2008_005510.jpg 401 500 7 132 135 303 342 7 67 320 229 500 +7737 /data/VOCdevkit/VOC2012/JPEGImages/2008_005511.jpg 334 500 15 163 169 309 369 15 27 109 194 257 +7738 /data/VOCdevkit/VOC2012/JPEGImages/2008_005512.jpg 500 375 3 192 51 359 268 +7739 /data/VOCdevkit/VOC2012/JPEGImages/2008_005514.jpg 500 375 11 133 34 378 375 +7740 /data/VOCdevkit/VOC2012/JPEGImages/2008_005517.jpg 500 333 3 155 2 306 213 +7741 /data/VOCdevkit/VOC2012/JPEGImages/2008_005519.jpg 480 321 15 257 120 352 230 15 76 148 165 255 14 373 17 444 171 14 279 51 360 138 8 98 81 150 152 +7742 /data/VOCdevkit/VOC2012/JPEGImages/2008_005521.jpg 500 375 2 15 231 63 288 2 11 181 59 246 2 83 191 129 237 2 218 164 284 230 2 326 113 386 188 2 355 101 399 162 +7743 /data/VOCdevkit/VOC2012/JPEGImages/2008_005522.jpg 333 500 2 170 252 251 316 2 193 381 249 473 2 84 251 138 316 +7744 /data/VOCdevkit/VOC2012/JPEGImages/2008_005523.jpg 500 375 7 63 41 421 362 +7745 /data/VOCdevkit/VOC2012/JPEGImages/2008_005525.jpg 500 375 12 206 44 330 375 +7746 /data/VOCdevkit/VOC2012/JPEGImages/2008_005526.jpg 500 375 3 188 23 336 263 3 78 181 112 239 +7747 /data/VOCdevkit/VOC2012/JPEGImages/2008_005527.jpg 500 375 11 1 113 269 313 11 208 93 364 309 14 192 1 379 299 14 319 28 500 228 +7748 /data/VOCdevkit/VOC2012/JPEGImages/2008_005530.jpg 500 375 3 131 223 161 271 3 224 231 243 260 3 256 229 270 251 3 340 217 369 255 3 454 224 486 259 +7749 /data/VOCdevkit/VOC2012/JPEGImages/2008_005531.jpg 500 400 2 94 49 289 362 +7750 /data/VOCdevkit/VOC2012/JPEGImages/2008_005534.jpg 500 333 2 119 94 240 191 2 221 180 348 300 +7751 /data/VOCdevkit/VOC2012/JPEGImages/2008_005536.jpg 350 189 3 17 65 102 160 3 108 60 344 159 +7752 /data/VOCdevkit/VOC2012/JPEGImages/2008_005538.jpg 500 333 0 163 49 402 248 +7753 /data/VOCdevkit/VOC2012/JPEGImages/2008_005541.jpg 500 375 3 35 91 500 256 +7754 /data/VOCdevkit/VOC2012/JPEGImages/2008_005544.jpg 500 375 18 337 47 500 324 +7755 /data/VOCdevkit/VOC2012/JPEGImages/2008_005548.jpg 500 314 6 148 97 411 257 +7756 /data/VOCdevkit/VOC2012/JPEGImages/2008_005549.jpg 500 281 4 462 180 475 212 8 355 190 437 281 14 264 144 378 225 14 106 5 362 281 +7757 /data/VOCdevkit/VOC2012/JPEGImages/2008_005550.jpg 500 375 7 170 43 362 292 +7758 /data/VOCdevkit/VOC2012/JPEGImages/2008_005552.jpg 375 500 8 1 1 336 500 14 1 78 375 500 +7759 /data/VOCdevkit/VOC2012/JPEGImages/2008_005553.jpg 375 500 1 154 1 375 500 14 8 1 83 216 14 294 1 375 215 +7760 /data/VOCdevkit/VOC2012/JPEGImages/2008_005558.jpg 422 500 12 62 187 389 410 14 136 79 231 272 +7761 /data/VOCdevkit/VOC2012/JPEGImages/2008_005560.jpg 375 500 4 163 402 229 500 4 299 261 336 369 4 332 279 367 377 7 156 145 332 411 +7762 /data/VOCdevkit/VOC2012/JPEGImages/2008_005561.jpg 375 500 8 67 127 317 444 8 45 105 221 344 +7763 /data/VOCdevkit/VOC2012/JPEGImages/2008_005563.jpg 432 324 14 301 52 382 127 11 75 186 162 324 +7764 /data/VOCdevkit/VOC2012/JPEGImages/2008_005564.jpg 432 324 11 279 46 382 220 11 68 112 236 293 +7765 /data/VOCdevkit/VOC2012/JPEGImages/2008_005566.jpg 500 332 7 139 174 361 290 14 54 1 438 332 +7766 /data/VOCdevkit/VOC2012/JPEGImages/2008_005567.jpg 500 375 14 1 45 500 375 +7767 /data/VOCdevkit/VOC2012/JPEGImages/2008_005569.jpg 375 500 7 1 78 375 500 19 1 24 107 184 +7768 /data/VOCdevkit/VOC2012/JPEGImages/2008_005570.jpg 500 375 10 70 213 474 375 14 1 119 115 357 14 71 128 135 232 14 143 113 234 218 14 284 113 356 269 14 339 99 464 307 14 361 65 418 165 14 294 72 357 183 8 238 177 288 236 +7769 /data/VOCdevkit/VOC2012/JPEGImages/2008_005572.jpg 500 375 6 1 224 196 339 6 401 255 500 375 +7770 /data/VOCdevkit/VOC2012/JPEGImages/2008_005573.jpg 500 333 0 412 259 453 281 +7771 /data/VOCdevkit/VOC2012/JPEGImages/2008_005574.jpg 375 500 8 1 26 286 500 8 215 32 375 407 7 45 164 311 475 +7772 /data/VOCdevkit/VOC2012/JPEGImages/2008_005582.jpg 500 375 12 127 186 209 375 12 346 171 469 375 14 356 136 453 300 14 170 197 249 375 14 91 212 139 375 14 287 215 342 375 +7773 /data/VOCdevkit/VOC2012/JPEGImages/2008_005584.jpg 500 368 2 342 177 449 293 +7774 /data/VOCdevkit/VOC2012/JPEGImages/2008_005588.jpg 500 334 14 156 75 276 201 +7775 /data/VOCdevkit/VOC2012/JPEGImages/2008_005589.jpg 500 439 12 1 1 500 439 +7776 /data/VOCdevkit/VOC2012/JPEGImages/2008_005591.jpg 500 333 11 266 97 473 252 11 201 143 401 260 +7777 /data/VOCdevkit/VOC2012/JPEGImages/2008_005593.jpg 500 375 3 75 96 453 132 6 25 140 433 295 13 405 154 471 239 +7778 /data/VOCdevkit/VOC2012/JPEGImages/2008_005599.jpg 500 375 1 42 152 117 299 1 186 200 500 375 1 76 181 299 351 14 447 103 500 369 14 269 90 430 375 14 265 169 362 356 14 380 90 426 211 14 150 74 256 358 14 88 85 147 297 +7779 /data/VOCdevkit/VOC2012/JPEGImages/2008_005600.jpg 500 375 7 91 86 252 375 14 126 29 500 375 +7780 /data/VOCdevkit/VOC2012/JPEGImages/2008_005601.jpg 500 375 11 172 123 316 191 2 195 233 242 293 2 149 159 202 198 +7781 /data/VOCdevkit/VOC2012/JPEGImages/2008_005603.jpg 468 261 13 10 34 451 241 +7782 /data/VOCdevkit/VOC2012/JPEGImages/2008_005608.jpg 500 374 8 372 194 500 250 8 304 251 416 374 10 352 230 500 374 15 30 1 94 76 +7783 /data/VOCdevkit/VOC2012/JPEGImages/2008_005609.jpg 375 500 19 1 1 375 433 14 29 43 214 240 +7784 /data/VOCdevkit/VOC2012/JPEGImages/2008_005610.jpg 500 332 3 207 243 306 272 14 223 176 263 255 +7785 /data/VOCdevkit/VOC2012/JPEGImages/2008_005611.jpg 500 388 0 1 5 500 388 +7786 /data/VOCdevkit/VOC2012/JPEGImages/2008_005612.jpg 500 375 6 10 180 159 244 6 141 193 217 249 14 330 162 480 375 14 333 172 397 375 14 249 170 307 375 14 203 178 258 375 14 289 187 325 317 14 162 249 191 324 +7787 /data/VOCdevkit/VOC2012/JPEGImages/2008_005614.jpg 333 500 7 120 209 236 291 +7788 /data/VOCdevkit/VOC2012/JPEGImages/2008_005616.jpg 270 500 14 138 274 255 500 14 12 247 131 500 8 144 297 270 495 +7789 /data/VOCdevkit/VOC2012/JPEGImages/2008_005618.jpg 429 500 2 108 102 422 440 +7790 /data/VOCdevkit/VOC2012/JPEGImages/2008_005623.jpg 500 250 17 7 5 491 247 +7791 /data/VOCdevkit/VOC2012/JPEGImages/2008_005625.jpg 500 375 19 40 185 142 279 14 376 97 500 375 14 336 65 426 375 14 127 126 206 289 14 139 110 226 375 +7792 /data/VOCdevkit/VOC2012/JPEGImages/2008_005626.jpg 500 333 2 247 109 375 172 2 103 158 241 205 2 36 259 177 318 2 109 74 206 156 2 382 220 446 299 +7793 /data/VOCdevkit/VOC2012/JPEGImages/2008_005627.jpg 500 375 17 1 1 271 204 15 211 1 287 43 +7794 /data/VOCdevkit/VOC2012/JPEGImages/2008_005628.jpg 500 333 3 32 1 199 257 +7795 /data/VOCdevkit/VOC2012/JPEGImages/2008_005631.jpg 500 333 0 79 130 317 198 +7796 /data/VOCdevkit/VOC2012/JPEGImages/2008_005633.jpg 500 341 16 131 77 473 296 +7797 /data/VOCdevkit/VOC2012/JPEGImages/2008_005634.jpg 500 333 0 6 68 493 212 +7798 /data/VOCdevkit/VOC2012/JPEGImages/2008_005635.jpg 500 375 14 183 69 247 261 16 247 112 353 183 +7799 /data/VOCdevkit/VOC2012/JPEGImages/2008_005636.jpg 400 300 7 47 27 309 257 +7800 /data/VOCdevkit/VOC2012/JPEGImages/2008_005637.jpg 500 375 13 6 103 484 307 +7801 /data/VOCdevkit/VOC2012/JPEGImages/2008_005638.jpg 500 375 6 45 135 451 298 +7802 /data/VOCdevkit/VOC2012/JPEGImages/2008_005639.jpg 500 375 19 14 100 115 192 4 394 347 422 375 4 477 341 500 375 +7803 /data/VOCdevkit/VOC2012/JPEGImages/2008_005641.jpg 500 334 6 170 91 411 188 14 29 94 51 129 14 51 94 75 129 14 76 95 100 128 +7804 /data/VOCdevkit/VOC2012/JPEGImages/2008_005642.jpg 500 375 12 286 50 443 359 +7805 /data/VOCdevkit/VOC2012/JPEGImages/2008_005643.jpg 500 375 11 48 45 371 375 +7806 /data/VOCdevkit/VOC2012/JPEGImages/2008_005646.jpg 500 375 14 87 55 500 375 4 259 298 306 375 14 86 61 308 375 +7807 /data/VOCdevkit/VOC2012/JPEGImages/2008_005649.jpg 500 333 2 94 48 500 297 +7808 /data/VOCdevkit/VOC2012/JPEGImages/2008_005650.jpg 500 375 1 282 211 345 322 1 177 256 243 368 1 125 227 176 334 1 450 142 475 179 1 206 109 231 124 14 175 164 254 353 14 286 156 341 302 14 120 151 185 319 14 452 120 476 172 14 347 108 364 144 14 303 102 317 131 +7809 /data/VOCdevkit/VOC2012/JPEGImages/2008_005652.jpg 500 333 11 68 1 366 282 14 1 95 83 223 14 14 13 74 85 +7810 /data/VOCdevkit/VOC2012/JPEGImages/2008_005653.jpg 500 386 18 210 82 500 341 +7811 /data/VOCdevkit/VOC2012/JPEGImages/2008_005656.jpg 500 374 11 84 78 500 318 +7812 /data/VOCdevkit/VOC2012/JPEGImages/2008_005657.jpg 423 500 7 92 74 415 452 +7813 /data/VOCdevkit/VOC2012/JPEGImages/2008_005660.jpg 500 375 19 4 95 263 329 19 259 105 472 294 +7814 /data/VOCdevkit/VOC2012/JPEGImages/2008_005663.jpg 466 500 6 44 69 425 435 +7815 /data/VOCdevkit/VOC2012/JPEGImages/2008_005664.jpg 500 375 3 195 225 330 240 14 302 209 322 233 +7816 /data/VOCdevkit/VOC2012/JPEGImages/2008_005668.jpg 500 375 12 114 128 500 375 +7817 /data/VOCdevkit/VOC2012/JPEGImages/2008_005673.jpg 500 375 7 186 45 500 375 +7818 /data/VOCdevkit/VOC2012/JPEGImages/2008_005675.jpg 500 375 6 43 165 119 229 +7819 /data/VOCdevkit/VOC2012/JPEGImages/2008_005676.jpg 500 375 5 25 176 212 237 +7820 /data/VOCdevkit/VOC2012/JPEGImages/2008_005677.jpg 400 264 14 252 167 400 264 14 295 67 400 196 14 226 66 334 186 14 1 134 139 264 14 1 84 84 231 14 82 38 211 145 4 229 100 242 145 4 220 105 235 152 4 207 89 222 152 14 125 105 240 264 +7821 /data/VOCdevkit/VOC2012/JPEGImages/2008_005678.jpg 500 375 19 119 86 439 343 +7822 /data/VOCdevkit/VOC2012/JPEGImages/2008_005679.jpg 500 400 11 6 58 468 400 +7823 /data/VOCdevkit/VOC2012/JPEGImages/2008_005680.jpg 500 318 15 62 183 157 318 15 138 156 250 318 15 352 13 445 88 +7824 /data/VOCdevkit/VOC2012/JPEGImages/2008_005681.jpg 500 375 9 297 253 362 295 +7825 /data/VOCdevkit/VOC2012/JPEGImages/2008_005682.jpg 500 280 12 345 102 418 242 14 355 56 423 181 +7826 /data/VOCdevkit/VOC2012/JPEGImages/2008_005683.jpg 500 375 3 385 138 456 229 3 79 127 154 228 3 221 143 289 228 +7827 /data/VOCdevkit/VOC2012/JPEGImages/2008_005685.jpg 500 333 0 1 39 500 333 +7828 /data/VOCdevkit/VOC2012/JPEGImages/2008_005686.jpg 500 333 6 20 26 452 280 6 1 36 49 137 +7829 /data/VOCdevkit/VOC2012/JPEGImages/2008_005687.jpg 375 500 2 122 385 235 467 2 125 309 201 384 2 247 296 325 381 2 215 362 253 414 +7830 /data/VOCdevkit/VOC2012/JPEGImages/2008_005691.jpg 480 360 12 128 1 480 278 +7831 /data/VOCdevkit/VOC2012/JPEGImages/2008_005695.jpg 500 333 3 99 46 398 266 +7832 /data/VOCdevkit/VOC2012/JPEGImages/2008_005698.jpg 500 384 8 73 205 298 384 14 229 34 386 384 +7833 /data/VOCdevkit/VOC2012/JPEGImages/2008_005699.jpg 380 500 7 1 60 321 500 +7834 /data/VOCdevkit/VOC2012/JPEGImages/2008_005701.jpg 375 500 14 177 34 375 453 +7835 /data/VOCdevkit/VOC2012/JPEGImages/2008_005702.jpg 500 333 12 332 112 443 276 12 256 136 308 209 +7836 /data/VOCdevkit/VOC2012/JPEGImages/2008_005703.jpg 500 333 11 131 13 249 240 +7837 /data/VOCdevkit/VOC2012/JPEGImages/2008_005705.jpg 500 375 12 325 103 464 298 12 105 115 215 241 +7838 /data/VOCdevkit/VOC2012/JPEGImages/2008_005706.jpg 500 375 16 22 12 233 324 16 177 13 485 364 +7839 /data/VOCdevkit/VOC2012/JPEGImages/2008_005707.jpg 500 375 6 1 158 491 375 14 324 108 500 275 14 221 174 350 375 6 140 122 291 169 +7840 /data/VOCdevkit/VOC2012/JPEGImages/2008_005713.jpg 500 375 1 58 99 382 308 +7841 /data/VOCdevkit/VOC2012/JPEGImages/2008_005714.jpg 500 375 9 43 46 298 218 +7842 /data/VOCdevkit/VOC2012/JPEGImages/2008_005716.jpg 500 375 7 64 5 461 216 +7843 /data/VOCdevkit/VOC2012/JPEGImages/2008_005719.jpg 500 375 0 284 164 337 192 +7844 /data/VOCdevkit/VOC2012/JPEGImages/2008_005720.jpg 500 374 3 36 119 500 328 5 1 345 120 374 +7845 /data/VOCdevkit/VOC2012/JPEGImages/2008_005721.jpg 458 342 6 47 207 93 225 6 1 209 45 226 6 437 217 458 233 +7846 /data/VOCdevkit/VOC2012/JPEGImages/2008_005724.jpg 333 500 2 86 82 333 363 2 1 215 333 500 +7847 /data/VOCdevkit/VOC2012/JPEGImages/2008_005726.jpg 500 384 12 89 74 456 333 14 166 48 297 233 +7848 /data/VOCdevkit/VOC2012/JPEGImages/2008_005727.jpg 500 375 1 57 79 464 359 +7849 /data/VOCdevkit/VOC2012/JPEGImages/2008_005728.jpg 500 375 11 165 124 307 269 +7850 /data/VOCdevkit/VOC2012/JPEGImages/2008_005732.jpg 500 375 14 87 57 215 375 19 1 114 54 172 19 455 98 500 138 14 267 56 303 149 +7851 /data/VOCdevkit/VOC2012/JPEGImages/2008_005734.jpg 500 374 2 227 151 330 283 +7852 /data/VOCdevkit/VOC2012/JPEGImages/2008_005735.jpg 290 500 7 43 32 290 455 +7853 /data/VOCdevkit/VOC2012/JPEGImages/2008_005736.jpg 500 375 16 36 92 117 146 16 324 130 439 242 16 219 157 345 240 +7854 /data/VOCdevkit/VOC2012/JPEGImages/2008_005737.jpg 269 500 1 117 310 240 500 1 54 253 112 345 1 1 332 91 500 14 134 206 248 479 14 47 202 110 319 +7855 /data/VOCdevkit/VOC2012/JPEGImages/2008_005738.jpg 333 500 1 48 253 267 408 14 160 193 267 485 +7856 /data/VOCdevkit/VOC2012/JPEGImages/2008_005739.jpg 375 500 8 27 37 75 122 +7857 /data/VOCdevkit/VOC2012/JPEGImages/2008_005742.jpg 500 375 14 1 168 35 317 14 53 187 91 297 14 352 193 410 323 18 104 138 444 263 18 1 136 172 240 14 377 215 460 375 +7858 /data/VOCdevkit/VOC2012/JPEGImages/2008_005747.jpg 375 500 6 1 32 369 500 +7859 /data/VOCdevkit/VOC2012/JPEGImages/2008_005748.jpg 500 500 11 48 40 436 454 +7860 /data/VOCdevkit/VOC2012/JPEGImages/2008_005750.jpg 375 500 0 135 326 375 500 0 1 314 272 500 +7861 /data/VOCdevkit/VOC2012/JPEGImages/2008_005752.jpg 500 332 4 102 81 145 193 +7862 /data/VOCdevkit/VOC2012/JPEGImages/2008_005757.jpg 500 333 2 269 85 434 284 +7863 /data/VOCdevkit/VOC2012/JPEGImages/2008_005758.jpg 375 500 14 103 190 234 500 4 222 1 363 500 4 1 1 130 500 +7864 /data/VOCdevkit/VOC2012/JPEGImages/2008_005761.jpg 500 388 5 23 1 250 218 6 56 42 242 258 14 178 15 332 324 14 292 97 421 381 6 344 81 500 332 +7865 /data/VOCdevkit/VOC2012/JPEGImages/2008_005763.jpg 500 311 18 40 83 399 245 +7866 /data/VOCdevkit/VOC2012/JPEGImages/2008_005764.jpg 500 351 3 160 178 302 214 +7867 /data/VOCdevkit/VOC2012/JPEGImages/2008_005767.jpg 333 500 8 1 41 333 486 +7868 /data/VOCdevkit/VOC2012/JPEGImages/2008_005768.jpg 331 500 6 39 256 293 394 +7869 /data/VOCdevkit/VOC2012/JPEGImages/2008_005770.jpg 500 375 7 54 42 500 375 +7870 /data/VOCdevkit/VOC2012/JPEGImages/2008_005774.jpg 500 280 2 268 50 338 121 2 194 85 260 144 +7871 /data/VOCdevkit/VOC2012/JPEGImages/2008_005777.jpg 400 301 7 84 45 356 266 7 56 1 314 198 +7872 /data/VOCdevkit/VOC2012/JPEGImages/2008_005779.jpg 375 500 14 70 193 161 483 14 192 210 264 475 14 9 249 27 307 +7873 /data/VOCdevkit/VOC2012/JPEGImages/2008_005780.jpg 500 414 7 68 45 197 307 7 135 189 306 370 7 289 89 432 352 +7874 /data/VOCdevkit/VOC2012/JPEGImages/2008_005788.jpg 500 375 14 108 83 274 375 14 187 116 456 344 17 279 56 500 269 +7875 /data/VOCdevkit/VOC2012/JPEGImages/2008_005790.jpg 500 335 14 126 97 257 243 13 125 117 217 253 +7876 /data/VOCdevkit/VOC2012/JPEGImages/2008_005791.jpg 450 360 12 5 113 417 346 14 203 57 310 264 +7877 /data/VOCdevkit/VOC2012/JPEGImages/2008_005792.jpg 433 342 12 86 100 430 294 14 166 75 257 244 +7878 /data/VOCdevkit/VOC2012/JPEGImages/2008_005794.jpg 500 375 15 406 70 497 179 14 308 69 358 231 14 179 135 237 215 14 137 52 178 208 14 169 92 202 194 14 171 58 207 153 14 255 74 284 155 14 61 77 98 144 14 17 44 67 215 8 67 100 103 146 8 104 100 140 139 14 209 48 254 151 14 358 65 398 169 14 224 109 287 208 +7879 /data/VOCdevkit/VOC2012/JPEGImages/2008_005796.jpg 500 375 0 1 63 500 290 14 253 99 306 282 8 12 133 35 160 6 216 109 328 161 +7880 /data/VOCdevkit/VOC2012/JPEGImages/2008_005798.jpg 500 375 15 362 1 500 340 11 73 56 307 329 +7881 /data/VOCdevkit/VOC2012/JPEGImages/2008_005800.jpg 375 500 11 1 55 375 500 +7882 /data/VOCdevkit/VOC2012/JPEGImages/2008_005801.jpg 500 375 18 1 40 500 325 +7883 /data/VOCdevkit/VOC2012/JPEGImages/2008_005803.jpg 500 477 2 98 122 420 433 +7884 /data/VOCdevkit/VOC2012/JPEGImages/2008_005805.jpg 500 332 7 1 16 500 332 +7885 /data/VOCdevkit/VOC2012/JPEGImages/2008_005808.jpg 500 375 14 280 126 350 334 14 223 110 284 324 14 163 160 234 294 14 88 100 189 282 1 233 196 429 342 1 1 171 76 298 1 1 159 76 254 +7886 /data/VOCdevkit/VOC2012/JPEGImages/2008_005810.jpg 500 375 2 194 107 328 272 +7887 /data/VOCdevkit/VOC2012/JPEGImages/2008_005812.jpg 500 375 4 65 105 123 268 14 31 5 463 375 +7888 /data/VOCdevkit/VOC2012/JPEGImages/2008_005816.jpg 500 375 7 1 1 500 369 +7889 /data/VOCdevkit/VOC2012/JPEGImages/2008_005817.jpg 500 333 19 178 84 311 183 19 298 191 350 266 +7890 /data/VOCdevkit/VOC2012/JPEGImages/2008_005818.jpg 500 334 12 315 28 465 315 12 302 102 365 272 12 188 117 314 287 12 109 91 226 287 +7891 /data/VOCdevkit/VOC2012/JPEGImages/2008_005821.jpg 500 375 2 1 1 438 333 +7892 /data/VOCdevkit/VOC2012/JPEGImages/2008_005822.jpg 500 375 6 140 173 363 265 6 370 183 500 250 +7893 /data/VOCdevkit/VOC2012/JPEGImages/2008_005823.jpg 372 500 11 95 256 295 411 +7894 /data/VOCdevkit/VOC2012/JPEGImages/2008_005825.jpg 500 375 18 1 1 460 375 14 153 130 232 375 14 230 160 311 375 14 467 104 486 145 14 441 102 466 167 14 416 102 447 201 +7895 /data/VOCdevkit/VOC2012/JPEGImages/2008_005831.jpg 383 500 11 260 256 313 339 +7896 /data/VOCdevkit/VOC2012/JPEGImages/2008_005832.jpg 289 432 6 1 88 69 147 6 160 127 289 228 14 48 94 109 311 14 96 58 178 314 +7897 /data/VOCdevkit/VOC2012/JPEGImages/2008_005834.jpg 500 357 0 1 127 474 261 +7898 /data/VOCdevkit/VOC2012/JPEGImages/2008_005838.jpg 500 454 11 106 160 464 433 14 112 1 445 362 +7899 /data/VOCdevkit/VOC2012/JPEGImages/2008_005839.jpg 500 375 1 201 297 383 375 1 1 270 189 375 +7900 /data/VOCdevkit/VOC2012/JPEGImages/2008_005843.jpg 500 375 2 158 166 230 249 +7901 /data/VOCdevkit/VOC2012/JPEGImages/2008_005845.jpg 500 333 11 142 13 363 305 +7902 /data/VOCdevkit/VOC2012/JPEGImages/2008_005846.jpg 500 375 1 109 94 430 375 14 189 43 368 375 +7903 /data/VOCdevkit/VOC2012/JPEGImages/2008_005847.jpg 500 375 15 1 5 216 375 15 163 1 500 375 +7904 /data/VOCdevkit/VOC2012/JPEGImages/2008_005848.jpg 375 500 8 247 238 375 380 14 149 132 270 493 +7905 /data/VOCdevkit/VOC2012/JPEGImages/2008_005850.jpg 500 375 14 114 36 309 266 11 170 240 369 334 17 133 48 500 322 +7906 /data/VOCdevkit/VOC2012/JPEGImages/2008_005853.jpg 500 375 7 179 157 310 348 +7907 /data/VOCdevkit/VOC2012/JPEGImages/2008_005855.jpg 500 375 14 1 175 71 259 14 77 176 135 264 14 132 176 199 268 14 186 179 274 272 14 258 178 345 276 14 368 199 444 280 3 1 247 500 304 +7908 /data/VOCdevkit/VOC2012/JPEGImages/2008_005856.jpg 500 414 15 201 294 233 345 +7909 /data/VOCdevkit/VOC2012/JPEGImages/2008_005857.jpg 500 375 8 1 1 289 375 7 1 70 314 288 +7910 /data/VOCdevkit/VOC2012/JPEGImages/2008_005860.jpg 500 375 11 1 114 371 375 +7911 /data/VOCdevkit/VOC2012/JPEGImages/2008_005863.jpg 500 375 3 1 1 474 372 14 6 254 21 285 3 382 249 401 267 3 412 224 428 266 +7912 /data/VOCdevkit/VOC2012/JPEGImages/2008_005865.jpg 500 335 11 211 210 318 333 6 5 194 419 335 6 1 185 188 317 +7913 /data/VOCdevkit/VOC2012/JPEGImages/2008_005867.jpg 500 333 4 332 117 364 211 4 452 102 492 209 4 64 63 154 206 14 150 1 297 77 14 347 15 500 333 +7914 /data/VOCdevkit/VOC2012/JPEGImages/2008_005869.jpg 500 375 4 48 243 79 336 14 116 63 500 375 14 243 6 316 101 +7915 /data/VOCdevkit/VOC2012/JPEGImages/2008_005871.jpg 500 377 11 42 54 410 377 +7916 /data/VOCdevkit/VOC2012/JPEGImages/2008_005873.jpg 500 363 0 132 197 205 235 0 60 200 126 235 +7917 /data/VOCdevkit/VOC2012/JPEGImages/2008_005874.jpg 500 375 15 116 32 445 362 +7918 /data/VOCdevkit/VOC2012/JPEGImages/2008_005875.jpg 500 355 6 63 52 434 277 +7919 /data/VOCdevkit/VOC2012/JPEGImages/2008_005877.jpg 500 375 19 8 80 262 285 14 355 214 500 375 +7920 /data/VOCdevkit/VOC2012/JPEGImages/2008_005878.jpg 375 500 5 62 1 375 500 6 18 379 53 418 +7921 /data/VOCdevkit/VOC2012/JPEGImages/2008_005881.jpg 375 500 4 188 180 244 257 14 1 65 346 500 14 1 125 97 234 14 271 1 375 313 8 1 206 115 415 8 93 186 162 325 +7922 /data/VOCdevkit/VOC2012/JPEGImages/2008_005882.jpg 500 375 11 194 136 391 258 7 83 185 218 271 17 1 75 486 375 +7923 /data/VOCdevkit/VOC2012/JPEGImages/2008_005883.jpg 480 272 11 207 33 372 255 +7924 /data/VOCdevkit/VOC2012/JPEGImages/2008_005884.jpg 500 375 14 1 95 60 207 14 96 98 239 231 14 186 67 482 375 +7925 /data/VOCdevkit/VOC2012/JPEGImages/2008_005889.jpg 500 375 0 1 84 463 252 6 435 277 500 317 +7926 /data/VOCdevkit/VOC2012/JPEGImages/2008_005890.jpg 500 161 11 1 4 141 113 7 387 68 493 120 +7927 /data/VOCdevkit/VOC2012/JPEGImages/2008_005891.jpg 500 333 6 246 180 418 260 5 16 118 312 249 5 324 123 478 193 5 444 116 500 178 +7928 /data/VOCdevkit/VOC2012/JPEGImages/2008_005893.jpg 500 333 13 23 1 483 316 6 1 1 500 196 +7929 /data/VOCdevkit/VOC2012/JPEGImages/2008_005895.jpg 500 356 2 103 131 347 179 +7930 /data/VOCdevkit/VOC2012/JPEGImages/2008_005897.jpg 500 327 11 157 95 479 268 15 83 40 122 67 15 171 13 206 58 15 226 4 259 34 15 258 1 297 39 15 31 39 62 81 15 67 1 108 70 15 94 60 128 91 +7931 /data/VOCdevkit/VOC2012/JPEGImages/2008_005898.jpg 500 375 11 141 1 412 336 +7932 /data/VOCdevkit/VOC2012/JPEGImages/2008_005902.jpg 375 500 13 80 115 237 445 6 261 52 375 126 14 214 39 248 100 14 172 39 203 105 +7933 /data/VOCdevkit/VOC2012/JPEGImages/2008_005903.jpg 500 378 2 121 117 278 346 +7934 /data/VOCdevkit/VOC2012/JPEGImages/2008_005904.jpg 500 333 4 251 1 452 304 +7935 /data/VOCdevkit/VOC2012/JPEGImages/2008_005905.jpg 293 500 0 133 109 175 143 +7936 /data/VOCdevkit/VOC2012/JPEGImages/2008_005907.jpg 500 333 6 88 220 228 269 14 268 230 299 289 0 24 136 458 260 +7937 /data/VOCdevkit/VOC2012/JPEGImages/2008_005914.jpg 500 375 8 479 171 500 200 8 275 200 321 253 15 384 157 418 212 15 184 191 286 263 +7938 /data/VOCdevkit/VOC2012/JPEGImages/2008_005915.jpg 500 375 13 1 80 500 375 +7939 /data/VOCdevkit/VOC2012/JPEGImages/2008_005916.jpg 500 333 0 1 51 461 237 +7940 /data/VOCdevkit/VOC2012/JPEGImages/2008_005918.jpg 500 375 19 160 117 356 279 +7941 /data/VOCdevkit/VOC2012/JPEGImages/2008_005921.jpg 500 453 1 53 199 341 388 1 197 217 418 356 14 248 39 347 382 14 173 66 272 378 +7942 /data/VOCdevkit/VOC2012/JPEGImages/2008_005923.jpg 500 375 3 21 41 479 314 14 87 112 138 175 14 300 156 357 218 +7943 /data/VOCdevkit/VOC2012/JPEGImages/2008_005924.jpg 500 333 2 130 183 184 226 2 346 154 400 193 2 345 229 398 261 2 131 261 186 299 +7944 /data/VOCdevkit/VOC2012/JPEGImages/2008_005926.jpg 375 500 17 1 275 257 500 +7945 /data/VOCdevkit/VOC2012/JPEGImages/2008_005928.jpg 500 335 12 146 6 500 335 14 4 22 202 335 +7946 /data/VOCdevkit/VOC2012/JPEGImages/2008_005929.jpg 500 375 19 207 1 449 208 +7947 /data/VOCdevkit/VOC2012/JPEGImages/2008_005933.jpg 400 300 5 183 94 364 144 +7948 /data/VOCdevkit/VOC2012/JPEGImages/2008_005934.jpg 500 375 12 219 34 500 289 14 318 1 428 142 +7949 /data/VOCdevkit/VOC2012/JPEGImages/2008_005935.jpg 364 500 2 18 12 364 500 +7950 /data/VOCdevkit/VOC2012/JPEGImages/2008_005936.jpg 500 375 6 1 26 500 372 6 264 1 472 82 6 197 1 300 45 +7951 /data/VOCdevkit/VOC2012/JPEGImages/2008_005937.jpg 375 500 14 48 75 316 470 8 34 216 129 378 8 1 133 28 246 +7952 /data/VOCdevkit/VOC2012/JPEGImages/2008_005938.jpg 500 330 16 74 45 338 234 +7953 /data/VOCdevkit/VOC2012/JPEGImages/2008_005939.jpg 500 466 4 1 323 46 433 14 1 3 500 466 +7954 /data/VOCdevkit/VOC2012/JPEGImages/2008_005943.jpg 500 375 7 11 2 500 375 +7955 /data/VOCdevkit/VOC2012/JPEGImages/2008_005945.jpg 375 500 4 239 1 345 236 +7956 /data/VOCdevkit/VOC2012/JPEGImages/2008_005954.jpg 500 375 8 389 214 452 328 8 1 203 57 297 10 1 278 295 375 19 194 99 315 171 8 419 269 500 375 15 8 30 131 233 +7957 /data/VOCdevkit/VOC2012/JPEGImages/2008_005956.jpg 500 375 2 50 149 206 292 +7958 /data/VOCdevkit/VOC2012/JPEGImages/2008_005957.jpg 500 332 19 342 97 500 253 14 135 45 379 332 14 1 1 176 332 +7959 /data/VOCdevkit/VOC2012/JPEGImages/2008_005959.jpg 500 375 3 271 147 295 159 +7960 /data/VOCdevkit/VOC2012/JPEGImages/2008_005960.jpg 500 381 6 11 96 472 349 +7961 /data/VOCdevkit/VOC2012/JPEGImages/2008_005962.jpg 500 375 19 80 43 390 283 +7962 /data/VOCdevkit/VOC2012/JPEGImages/2008_005964.jpg 500 375 11 61 76 461 375 +7963 /data/VOCdevkit/VOC2012/JPEGImages/2008_005967.jpg 500 375 19 206 94 295 170 +7964 /data/VOCdevkit/VOC2012/JPEGImages/2008_005968.jpg 500 375 18 1 4 500 375 +7965 /data/VOCdevkit/VOC2012/JPEGImages/2008_005970.jpg 352 288 1 1 1 330 288 +7966 /data/VOCdevkit/VOC2012/JPEGImages/2008_005972.jpg 500 381 11 12 137 289 333 14 181 91 500 304 6 1 68 500 381 6 116 10 500 153 6 173 1 214 18 6 211 1 252 18 6 256 1 292 17 6 358 1 392 16 6 465 1 492 14 +7967 /data/VOCdevkit/VOC2012/JPEGImages/2008_005975.jpg 500 375 10 1 102 500 375 +7968 /data/VOCdevkit/VOC2012/JPEGImages/2008_005976.jpg 500 357 19 26 25 496 321 14 14 43 467 357 +7969 /data/VOCdevkit/VOC2012/JPEGImages/2008_005977.jpg 500 333 7 27 23 453 291 +7970 /data/VOCdevkit/VOC2012/JPEGImages/2008_005978.jpg 375 500 14 47 53 222 475 1 44 248 194 500 +7971 /data/VOCdevkit/VOC2012/JPEGImages/2008_005979.jpg 333 500 11 52 259 333 500 7 1 191 172 330 +7972 /data/VOCdevkit/VOC2012/JPEGImages/2008_005980.jpg 375 500 11 130 401 206 500 +7973 /data/VOCdevkit/VOC2012/JPEGImages/2008_005982.jpg 500 323 1 11 16 491 315 +7974 /data/VOCdevkit/VOC2012/JPEGImages/2008_005984.jpg 500 375 5 21 34 497 357 +7975 /data/VOCdevkit/VOC2012/JPEGImages/2008_005987.jpg 500 364 16 306 110 436 249 16 35 155 85 228 16 22 73 62 98 +7976 /data/VOCdevkit/VOC2012/JPEGImages/2008_005989.jpg 500 333 6 75 118 392 260 +7977 /data/VOCdevkit/VOC2012/JPEGImages/2008_005991.jpg 495 500 4 79 162 197 209 14 73 126 316 500 +7978 /data/VOCdevkit/VOC2012/JPEGImages/2008_005997.jpg 500 375 2 137 128 223 230 +7979 /data/VOCdevkit/VOC2012/JPEGImages/2008_006000.jpg 500 333 2 203 127 312 231 2 326 48 415 144 2 359 162 394 277 +7980 /data/VOCdevkit/VOC2012/JPEGImages/2008_006002.jpg 500 375 2 227 257 482 367 2 91 27 213 212 +7981 /data/VOCdevkit/VOC2012/JPEGImages/2008_006004.jpg 375 500 4 18 308 48 336 4 42 311 70 342 4 61 310 91 336 4 220 240 257 370 4 238 249 284 386 +7982 /data/VOCdevkit/VOC2012/JPEGImages/2008_006007.jpg 500 332 11 81 30 414 332 +7983 /data/VOCdevkit/VOC2012/JPEGImages/2008_006008.jpg 375 500 8 170 323 335 500 8 38 311 179 500 8 21 270 92 452 10 24 285 264 500 +7984 /data/VOCdevkit/VOC2012/JPEGImages/2008_006010.jpg 349 500 18 83 223 188 415 18 105 152 133 188 +7985 /data/VOCdevkit/VOC2012/JPEGImages/2008_006014.jpg 500 375 3 199 175 283 194 +7986 /data/VOCdevkit/VOC2012/JPEGImages/2008_006017.jpg 500 375 13 62 45 392 374 6 1 1 81 93 +7987 /data/VOCdevkit/VOC2012/JPEGImages/2008_006020.jpg 500 334 11 1 28 422 327 +7988 /data/VOCdevkit/VOC2012/JPEGImages/2008_006021.jpg 500 375 14 204 67 265 208 3 198 187 278 245 +7989 /data/VOCdevkit/VOC2012/JPEGImages/2008_006024.jpg 500 375 14 270 91 462 375 14 1 86 238 375 4 256 225 346 375 +7990 /data/VOCdevkit/VOC2012/JPEGImages/2008_006027.jpg 500 375 4 153 265 217 375 14 121 58 499 374 +7991 /data/VOCdevkit/VOC2012/JPEGImages/2008_006028.jpg 500 375 12 145 38 323 350 12 61 1 500 304 +7992 /data/VOCdevkit/VOC2012/JPEGImages/2008_006031.jpg 500 375 19 128 93 354 273 +7993 /data/VOCdevkit/VOC2012/JPEGImages/2008_006032.jpg 333 500 11 54 206 296 500 14 25 7 218 490 14 146 57 223 201 +7994 /data/VOCdevkit/VOC2012/JPEGImages/2008_006034.jpg 348 500 0 145 251 180 292 +7995 /data/VOCdevkit/VOC2012/JPEGImages/2008_006036.jpg 375 500 12 119 298 264 374 +7996 /data/VOCdevkit/VOC2012/JPEGImages/2008_006037.jpg 500 231 6 83 178 141 210 +7997 /data/VOCdevkit/VOC2012/JPEGImages/2008_006038.jpg 500 375 11 67 46 362 166 17 1 136 500 375 +7998 /data/VOCdevkit/VOC2012/JPEGImages/2008_006039.jpg 500 375 14 1 137 117 303 14 47 76 155 242 14 117 77 195 238 14 173 73 229 186 14 243 63 328 150 14 339 69 401 198 14 381 84 455 285 14 400 134 500 375 14 214 120 426 375 +7999 /data/VOCdevkit/VOC2012/JPEGImages/2008_006041.jpg 500 375 14 1 75 64 244 11 1 195 142 375 11 99 284 209 375 11 131 35 316 207 +8000 /data/VOCdevkit/VOC2012/JPEGImages/2008_006042.jpg 375 500 13 1 212 361 500 14 1 16 172 498 +8001 /data/VOCdevkit/VOC2012/JPEGImages/2008_006045.jpg 400 300 8 1 137 197 300 8 1 94 264 300 8 78 77 364 300 8 152 59 400 300 8 218 47 400 300 8 278 34 400 281 8 331 23 400 139 +8002 /data/VOCdevkit/VOC2012/JPEGImages/2008_006046.jpg 375 500 3 203 308 375 365 3 88 196 375 359 3 1 187 245 331 +8003 /data/VOCdevkit/VOC2012/JPEGImages/2008_006047.jpg 500 375 19 262 60 368 128 14 159 154 309 375 14 327 148 395 375 14 310 71 342 122 +8004 /data/VOCdevkit/VOC2012/JPEGImages/2008_006049.jpg 500 375 11 141 95 339 320 11 256 63 400 270 +8005 /data/VOCdevkit/VOC2012/JPEGImages/2008_006050.jpg 500 298 7 1 20 480 279 +8006 /data/VOCdevkit/VOC2012/JPEGImages/2008_006052.jpg 500 335 4 157 1 461 137 14 1 1 500 335 +8007 /data/VOCdevkit/VOC2012/JPEGImages/2008_006055.jpg 500 334 18 29 50 434 246 +8008 /data/VOCdevkit/VOC2012/JPEGImages/2008_006058.jpg 500 333 2 179 145 239 216 2 244 192 287 234 +8009 /data/VOCdevkit/VOC2012/JPEGImages/2008_006059.jpg 333 500 16 104 170 213 441 14 41 127 132 457 14 229 143 333 475 +8010 /data/VOCdevkit/VOC2012/JPEGImages/2008_006062.jpg 500 375 4 306 261 327 316 19 207 211 300 301 +8011 /data/VOCdevkit/VOC2012/JPEGImages/2008_006063.jpg 375 500 9 2 2 375 500 +8012 /data/VOCdevkit/VOC2012/JPEGImages/2008_006064.jpg 500 376 1 64 274 275 359 14 184 250 342 353 +8013 /data/VOCdevkit/VOC2012/JPEGImages/2008_006065.jpg 500 375 3 133 74 367 256 +8014 /data/VOCdevkit/VOC2012/JPEGImages/2008_006067.jpg 500 375 11 45 226 192 375 +8015 /data/VOCdevkit/VOC2012/JPEGImages/2008_006068.jpg 500 375 7 39 168 394 290 15 349 53 477 235 +8016 /data/VOCdevkit/VOC2012/JPEGImages/2008_006070.jpg 500 413 16 37 50 458 413 16 140 20 473 363 +8017 /data/VOCdevkit/VOC2012/JPEGImages/2008_006071.jpg 500 295 11 287 190 388 266 11 173 189 227 281 14 65 94 174 280 14 325 163 367 216 14 350 163 385 213 6 437 142 485 160 6 311 133 359 152 6 189 123 240 142 +8018 /data/VOCdevkit/VOC2012/JPEGImages/2008_006072.jpg 375 500 4 96 1 328 487 +8019 /data/VOCdevkit/VOC2012/JPEGImages/2008_006074.jpg 500 333 11 204 112 500 262 +8020 /data/VOCdevkit/VOC2012/JPEGImages/2008_006076.jpg 500 375 8 100 228 343 375 14 139 44 337 375 +8021 /data/VOCdevkit/VOC2012/JPEGImages/2008_006078.jpg 500 375 14 1 86 152 375 14 91 157 217 375 14 182 157 289 375 14 272 156 356 375 14 323 128 457 375 14 369 129 500 375 +8022 /data/VOCdevkit/VOC2012/JPEGImages/2008_006081.jpg 375 500 7 67 58 292 457 +8023 /data/VOCdevkit/VOC2012/JPEGImages/2008_006082.jpg 500 375 6 1 321 105 375 6 374 321 433 351 +8024 /data/VOCdevkit/VOC2012/JPEGImages/2008_006085.jpg 500 357 0 1 91 485 241 +8025 /data/VOCdevkit/VOC2012/JPEGImages/2008_006087.jpg 500 375 14 281 162 340 335 14 379 200 410 310 14 398 165 438 301 14 428 180 457 303 14 120 133 163 255 12 44 175 269 355 12 341 172 399 297 6 424 170 453 187 6 387 168 413 188 6 354 172 381 189 6 319 167 356 187 6 264 163 302 178 +8026 /data/VOCdevkit/VOC2012/JPEGImages/2008_006088.jpg 333 500 1 81 244 282 500 14 56 5 301 500 +8027 /data/VOCdevkit/VOC2012/JPEGImages/2008_006090.jpg 500 346 2 126 133 400 263 +8028 /data/VOCdevkit/VOC2012/JPEGImages/2008_006092.jpg 375 500 6 211 251 323 306 +8029 /data/VOCdevkit/VOC2012/JPEGImages/2008_006094.jpg 500 333 3 1 65 439 333 3 315 18 393 35 +8030 /data/VOCdevkit/VOC2012/JPEGImages/2008_006096.jpg 500 333 12 132 76 344 238 12 65 83 184 198 14 213 36 257 166 14 134 52 170 148 12 43 88 114 187 +8031 /data/VOCdevkit/VOC2012/JPEGImages/2008_006099.jpg 375 500 7 1 6 372 473 +8032 /data/VOCdevkit/VOC2012/JPEGImages/2008_006100.jpg 375 500 16 27 206 189 431 16 168 221 301 440 16 16 110 81 178 16 36 95 120 163 +8033 /data/VOCdevkit/VOC2012/JPEGImages/2008_006102.jpg 333 500 14 114 185 268 413 4 115 279 165 345 +8034 /data/VOCdevkit/VOC2012/JPEGImages/2008_006104.jpg 375 500 4 90 47 265 486 +8035 /data/VOCdevkit/VOC2012/JPEGImages/2008_006108.jpg 500 375 14 35 92 274 327 14 274 138 453 357 +8036 /data/VOCdevkit/VOC2012/JPEGImages/2008_006109.jpg 500 333 0 25 128 132 170 +8037 /data/VOCdevkit/VOC2012/JPEGImages/2008_006111.jpg 500 375 4 388 1 413 64 4 417 1 446 75 4 446 1 477 80 4 121 78 150 183 8 110 86 214 159 8 270 130 442 371 8 358 189 500 375 +8038 /data/VOCdevkit/VOC2012/JPEGImages/2008_006112.jpg 500 375 15 74 194 242 367 +8039 /data/VOCdevkit/VOC2012/JPEGImages/2008_006113.jpg 500 375 7 1 1 429 347 +8040 /data/VOCdevkit/VOC2012/JPEGImages/2008_006117.jpg 500 375 14 30 87 451 294 17 1 90 475 375 17 164 1 392 84 +8041 /data/VOCdevkit/VOC2012/JPEGImages/2008_006119.jpg 500 338 11 76 34 500 338 +8042 /data/VOCdevkit/VOC2012/JPEGImages/2008_006120.jpg 500 375 10 52 241 340 375 14 268 143 446 375 14 273 171 381 286 14 269 160 368 304 14 260 142 323 241 14 234 154 274 216 14 155 147 233 222 14 104 150 163 231 14 124 100 215 177 14 176 88 239 196 14 180 82 348 196 14 281 91 360 180 14 13 78 120 201 14 55 155 130 264 14 1 158 97 311 4 216 190 242 257 4 159 202 183 243 4 135 185 163 242 4 184 215 206 289 4 159 241 177 298 +8043 /data/VOCdevkit/VOC2012/JPEGImages/2008_006121.jpg 375 500 3 73 170 252 258 14 236 209 275 300 +8044 /data/VOCdevkit/VOC2012/JPEGImages/2008_006124.jpg 375 500 14 32 133 160 500 +8045 /data/VOCdevkit/VOC2012/JPEGImages/2008_006128.jpg 375 500 2 1 52 343 408 +8046 /data/VOCdevkit/VOC2012/JPEGImages/2008_006129.jpg 500 375 11 280 201 347 316 14 129 62 279 317 +8047 /data/VOCdevkit/VOC2012/JPEGImages/2008_006130.jpg 500 333 11 76 64 500 265 +8048 /data/VOCdevkit/VOC2012/JPEGImages/2008_006133.jpg 369 500 8 139 230 218 397 8 91 206 149 248 8 65 261 124 360 10 82 236 216 380 +8049 /data/VOCdevkit/VOC2012/JPEGImages/2008_006135.jpg 375 500 7 26 164 99 230 19 16 242 135 361 14 107 36 354 500 7 222 131 368 391 +8050 /data/VOCdevkit/VOC2012/JPEGImages/2008_006136.jpg 500 375 19 179 100 307 214 4 153 176 174 241 4 160 182 188 256 4 189 186 214 256 4 273 171 296 236 4 293 168 315 229 19 430 239 500 317 +8051 /data/VOCdevkit/VOC2012/JPEGImages/2008_006140.jpg 500 375 0 1 93 492 266 0 1 217 97 245 +8052 /data/VOCdevkit/VOC2012/JPEGImages/2008_006143.jpg 500 375 2 213 156 263 225 +8053 /data/VOCdevkit/VOC2012/JPEGImages/2008_006144.jpg 500 375 4 162 1 305 359 4 371 156 438 375 4 1 213 51 375 4 1 1 105 330 4 98 63 154 238 4 255 1 323 285 +8054 /data/VOCdevkit/VOC2012/JPEGImages/2008_006145.jpg 500 375 4 78 333 108 375 4 28 320 56 375 4 6 338 22 375 14 173 153 339 365 14 293 220 424 375 14 205 203 336 375 14 10 114 133 369 14 62 130 163 349 14 161 116 196 165 14 293 114 378 252 14 311 86 368 180 14 119 121 232 368 14 140 90 176 136 14 208 96 238 171 14 245 94 319 213 +8055 /data/VOCdevkit/VOC2012/JPEGImages/2008_006147.jpg 500 400 19 242 6 471 372 19 2 6 245 382 +8056 /data/VOCdevkit/VOC2012/JPEGImages/2008_006148.jpg 500 375 4 97 287 169 375 14 1 6 320 375 +8057 /data/VOCdevkit/VOC2012/JPEGImages/2008_006151.jpg 480 360 14 1 162 108 360 8 80 93 196 260 8 76 125 194 309 8 175 133 313 333 8 302 117 426 302 10 68 111 399 330 +8058 /data/VOCdevkit/VOC2012/JPEGImages/2008_006152.jpg 500 375 13 1 217 427 375 14 295 111 457 375 14 181 81 352 375 +8059 /data/VOCdevkit/VOC2012/JPEGImages/2008_006154.jpg 375 500 14 329 228 375 449 14 88 258 157 390 14 9 276 57 371 14 48 274 82 378 1 76 321 164 421 1 12 324 66 402 +8060 /data/VOCdevkit/VOC2012/JPEGImages/2008_006158.jpg 376 500 18 103 157 267 281 18 316 192 376 232 +8061 /data/VOCdevkit/VOC2012/JPEGImages/2008_006159.jpg 500 375 19 303 172 444 313 +8062 /data/VOCdevkit/VOC2012/JPEGImages/2008_006163.jpg 354 500 3 225 290 265 341 +8063 /data/VOCdevkit/VOC2012/JPEGImages/2008_006164.jpg 500 351 2 68 71 424 321 +8064 /data/VOCdevkit/VOC2012/JPEGImages/2008_006166.jpg 500 333 11 41 90 356 252 +8065 /data/VOCdevkit/VOC2012/JPEGImages/2008_006169.jpg 375 500 0 1 11 375 472 +8066 /data/VOCdevkit/VOC2012/JPEGImages/2008_006170.jpg 500 333 11 122 29 348 333 +8067 /data/VOCdevkit/VOC2012/JPEGImages/2008_006175.jpg 400 300 7 1 20 356 300 +8068 /data/VOCdevkit/VOC2012/JPEGImages/2008_006178.jpg 321 425 11 73 20 267 411 +8069 /data/VOCdevkit/VOC2012/JPEGImages/2008_006179.jpg 500 391 2 171 110 268 341 +8070 /data/VOCdevkit/VOC2012/JPEGImages/2008_006181.jpg 353 500 14 103 20 271 480 6 257 184 353 294 6 1 154 101 366 +8071 /data/VOCdevkit/VOC2012/JPEGImages/2008_006182.jpg 500 333 4 1 1 235 333 +8072 /data/VOCdevkit/VOC2012/JPEGImages/2008_006185.jpg 500 375 3 1 178 141 269 +8073 /data/VOCdevkit/VOC2012/JPEGImages/2008_006186.jpg 383 500 2 85 70 310 446 +8074 /data/VOCdevkit/VOC2012/JPEGImages/2008_006188.jpg 500 375 6 25 133 399 347 14 319 122 401 326 +8075 /data/VOCdevkit/VOC2012/JPEGImages/2008_006190.jpg 300 201 7 69 25 300 197 +8076 /data/VOCdevkit/VOC2012/JPEGImages/2008_006192.jpg 500 375 10 1 12 488 375 4 121 87 158 178 4 191 30 234 119 +8077 /data/VOCdevkit/VOC2012/JPEGImages/2008_006194.jpg 500 422 7 1 37 500 422 +8078 /data/VOCdevkit/VOC2012/JPEGImages/2008_006195.jpg 375 500 14 126 64 238 292 1 146 177 237 353 +8079 /data/VOCdevkit/VOC2012/JPEGImages/2008_006200.jpg 500 333 0 1 121 419 243 0 423 154 500 209 +8080 /data/VOCdevkit/VOC2012/JPEGImages/2008_006203.jpg 500 375 11 89 79 411 352 15 1 1 72 215 +8081 /data/VOCdevkit/VOC2012/JPEGImages/2008_006205.jpg 500 335 13 95 93 265 325 14 132 4 308 192 +8082 /data/VOCdevkit/VOC2012/JPEGImages/2008_006207.jpg 375 500 15 93 175 278 435 +8083 /data/VOCdevkit/VOC2012/JPEGImages/2008_006210.jpg 500 375 9 93 27 456 375 +8084 /data/VOCdevkit/VOC2012/JPEGImages/2008_006211.jpg 500 334 11 67 80 263 220 +8085 /data/VOCdevkit/VOC2012/JPEGImages/2008_006213.jpg 500 335 0 42 103 204 200 +8086 /data/VOCdevkit/VOC2012/JPEGImages/2008_006215.jpg 500 375 6 58 50 440 335 6 1 63 230 229 14 435 97 482 203 14 423 96 448 170 +8087 /data/VOCdevkit/VOC2012/JPEGImages/2008_006216.jpg 500 375 14 86 83 152 313 14 144 106 194 313 +8088 /data/VOCdevkit/VOC2012/JPEGImages/2008_006218.jpg 500 375 7 114 32 355 324 +8089 /data/VOCdevkit/VOC2012/JPEGImages/2008_006219.jpg 500 375 12 225 126 331 323 12 78 122 232 289 +8090 /data/VOCdevkit/VOC2012/JPEGImages/2008_006220.jpg 500 326 11 259 121 316 169 6 20 1 500 326 +8091 /data/VOCdevkit/VOC2012/JPEGImages/2008_006221.jpg 500 333 16 117 94 177 150 16 81 178 168 265 16 298 142 411 221 16 375 112 420 171 +8092 /data/VOCdevkit/VOC2012/JPEGImages/2008_006222.jpg 500 375 6 258 215 456 348 14 274 174 328 371 14 221 183 274 347 14 178 177 226 343 14 137 161 188 350 14 4 210 36 284 14 40 212 60 284 14 58 212 81 285 6 1 231 103 270 14 36 94 74 159 6 391 233 500 375 6 419 241 471 266 +8093 /data/VOCdevkit/VOC2012/JPEGImages/2008_006224.jpg 500 333 6 9 55 495 294 6 314 39 475 110 6 97 34 168 74 +8094 /data/VOCdevkit/VOC2012/JPEGImages/2008_006225.jpg 500 375 6 9 1 382 129 +8095 /data/VOCdevkit/VOC2012/JPEGImages/2008_006227.jpg 500 313 2 419 126 477 195 2 420 110 452 154 2 366 90 438 124 2 280 101 351 174 2 266 83 303 124 2 204 96 256 149 2 36 47 69 94 2 83 75 141 131 2 125 68 190 106 +8096 /data/VOCdevkit/VOC2012/JPEGImages/2008_006229.jpg 500 333 3 184 30 391 297 +8097 /data/VOCdevkit/VOC2012/JPEGImages/2008_006232.jpg 375 500 2 139 276 171 321 +8098 /data/VOCdevkit/VOC2012/JPEGImages/2008_006233.jpg 350 262 19 64 1 226 144 +8099 /data/VOCdevkit/VOC2012/JPEGImages/2008_006234.jpg 500 395 1 1 1 500 395 +8100 /data/VOCdevkit/VOC2012/JPEGImages/2008_006235.jpg 375 500 12 51 61 362 489 12 208 213 375 422 14 1 158 57 434 +8101 /data/VOCdevkit/VOC2012/JPEGImages/2008_006239.jpg 333 500 11 1 1 333 500 +8102 /data/VOCdevkit/VOC2012/JPEGImages/2008_006240.jpg 500 375 6 1 1 458 375 +8103 /data/VOCdevkit/VOC2012/JPEGImages/2008_006242.jpg 500 490 13 27 1 481 490 +8104 /data/VOCdevkit/VOC2012/JPEGImages/2008_006244.jpg 500 394 6 194 350 243 368 6 351 362 396 381 6 427 364 481 394 +8105 /data/VOCdevkit/VOC2012/JPEGImages/2008_006249.jpg 500 167 0 40 96 93 135 +8106 /data/VOCdevkit/VOC2012/JPEGImages/2008_006250.jpg 500 375 14 36 2 301 375 14 181 156 293 360 +8107 /data/VOCdevkit/VOC2012/JPEGImages/2008_006253.jpg 428 500 1 102 200 383 478 14 118 19 328 434 +8108 /data/VOCdevkit/VOC2012/JPEGImages/2008_006254.jpg 374 500 1 134 287 237 485 14 116 134 244 437 14 296 110 336 231 1 69 12 145 166 1 170 9 245 159 6 26 164 358 416 +8109 /data/VOCdevkit/VOC2012/JPEGImages/2008_006256.jpg 500 375 14 95 39 395 375 14 87 98 292 375 +8110 /data/VOCdevkit/VOC2012/JPEGImages/2008_006257.jpg 430 500 1 166 207 290 443 14 175 93 291 415 6 33 11 380 332 6 321 81 420 264 14 34 24 99 151 +8111 /data/VOCdevkit/VOC2012/JPEGImages/2008_006258.jpg 500 375 8 106 16 441 375 +8112 /data/VOCdevkit/VOC2012/JPEGImages/2008_006262.jpg 375 500 15 1 51 366 474 +8113 /data/VOCdevkit/VOC2012/JPEGImages/2008_006265.jpg 500 375 0 1 35 487 293 14 385 236 406 298 14 329 245 346 294 14 353 239 376 298 +8114 /data/VOCdevkit/VOC2012/JPEGImages/2008_006267.jpg 500 375 14 314 59 499 375 14 154 157 376 375 14 58 158 180 330 14 160 131 262 312 19 19 291 204 375 19 1 164 57 261 19 45 148 142 225 +8115 /data/VOCdevkit/VOC2012/JPEGImages/2008_006269.jpg 500 333 0 43 238 230 315 0 131 140 313 211 0 31 116 207 186 +8116 /data/VOCdevkit/VOC2012/JPEGImages/2008_006271.jpg 500 375 19 21 168 118 256 19 231 220 301 281 19 133 218 197 276 8 121 258 226 375 +8117 /data/VOCdevkit/VOC2012/JPEGImages/2008_006272.jpg 321 414 6 1 165 277 360 14 36 110 135 378 14 166 113 245 373 +8118 /data/VOCdevkit/VOC2012/JPEGImages/2008_006273.jpg 500 375 19 155 240 418 375 14 124 169 398 324 14 1 143 162 330 +8119 /data/VOCdevkit/VOC2012/JPEGImages/2008_006275.jpg 500 375 14 104 62 226 375 14 187 68 338 375 14 312 60 412 375 6 78 149 115 219 +8120 /data/VOCdevkit/VOC2012/JPEGImages/2008_006276.jpg 500 362 17 1 1 500 362 +8121 /data/VOCdevkit/VOC2012/JPEGImages/2008_006280.jpg 500 375 7 164 120 352 334 +8122 /data/VOCdevkit/VOC2012/JPEGImages/2008_006281.jpg 500 375 2 65 71 472 306 +8123 /data/VOCdevkit/VOC2012/JPEGImages/2008_006282.jpg 500 375 4 1 121 105 372 4 64 101 160 337 4 106 78 192 297 4 170 61 244 275 4 231 47 298 257 4 289 42 356 251 4 353 36 412 244 4 404 38 470 261 +8124 /data/VOCdevkit/VOC2012/JPEGImages/2008_006285.jpg 500 334 7 199 10 333 167 7 1 102 500 334 +8125 /data/VOCdevkit/VOC2012/JPEGImages/2008_006288.jpg 500 375 19 43 16 201 226 +8126 /data/VOCdevkit/VOC2012/JPEGImages/2008_006289.jpg 500 333 14 313 176 369 246 14 348 166 380 226 3 1 1 363 307 +8127 /data/VOCdevkit/VOC2012/JPEGImages/2008_006290.jpg 500 336 9 196 171 250 261 9 258 171 331 262 +8128 /data/VOCdevkit/VOC2012/JPEGImages/2008_006294.jpg 300 161 7 32 50 93 132 7 85 59 128 133 7 136 46 186 132 7 185 17 245 133 +8129 /data/VOCdevkit/VOC2012/JPEGImages/2008_006295.jpg 500 375 19 161 32 337 198 4 296 236 337 375 14 49 188 224 329 14 223 134 436 375 14 252 115 448 375 15 431 11 500 275 15 10 104 63 267 15 31 1 142 246 +8130 /data/VOCdevkit/VOC2012/JPEGImages/2008_006298.jpg 480 305 12 126 171 186 253 +8131 /data/VOCdevkit/VOC2012/JPEGImages/2008_006300.jpg 500 368 8 154 248 198 349 8 197 249 235 350 8 236 249 274 349 8 281 249 318 351 8 321 248 359 352 8 360 248 407 352 8 404 248 449 354 8 446 246 496 352 +8132 /data/VOCdevkit/VOC2012/JPEGImages/2008_006303.jpg 500 333 8 85 187 179 314 8 331 188 421 314 +8133 /data/VOCdevkit/VOC2012/JPEGImages/2008_006307.jpg 500 335 7 44 113 349 283 7 148 117 446 255 8 1 1 500 335 +8134 /data/VOCdevkit/VOC2012/JPEGImages/2008_006310.jpg 500 375 6 176 134 230 182 +8135 /data/VOCdevkit/VOC2012/JPEGImages/2008_006311.jpg 500 375 10 1 152 421 233 8 254 223 363 375 8 142 185 237 349 8 1 216 124 375 14 222 75 383 344 14 365 82 496 329 14 8 104 183 305 14 177 28 272 150 14 329 48 410 151 +8136 /data/VOCdevkit/VOC2012/JPEGImages/2008_006315.jpg 500 375 11 1 97 435 298 4 200 71 224 108 +8137 /data/VOCdevkit/VOC2012/JPEGImages/2008_006316.jpg 500 375 6 376 196 494 259 6 321 190 448 264 6 239 183 403 269 6 136 186 345 279 6 12 176 219 281 +8138 /data/VOCdevkit/VOC2012/JPEGImages/2008_006317.jpg 500 333 14 261 35 317 187 12 139 88 388 285 +8139 /data/VOCdevkit/VOC2012/JPEGImages/2008_006320.jpg 480 325 11 112 111 292 297 +8140 /data/VOCdevkit/VOC2012/JPEGImages/2008_006323.jpg 500 334 13 77 5 383 334 +8141 /data/VOCdevkit/VOC2012/JPEGImages/2008_006325.jpg 500 476 7 22 9 471 462 +8142 /data/VOCdevkit/VOC2012/JPEGImages/2008_006327.jpg 400 300 16 232 117 393 286 16 6 71 188 199 16 198 75 340 170 16 167 46 251 223 +8143 /data/VOCdevkit/VOC2012/JPEGImages/2008_006329.jpg 375 500 7 57 47 182 336 7 112 99 318 498 +8144 /data/VOCdevkit/VOC2012/JPEGImages/2008_006330.jpg 375 500 8 30 277 166 500 8 1 269 85 451 +8145 /data/VOCdevkit/VOC2012/JPEGImages/2008_006331.jpg 500 374 4 376 70 390 109 4 399 274 414 323 14 131 95 256 374 14 245 107 384 374 +8146 /data/VOCdevkit/VOC2012/JPEGImages/2008_006335.jpg 500 402 11 34 24 475 379 +8147 /data/VOCdevkit/VOC2012/JPEGImages/2008_006336.jpg 500 375 6 31 194 237 272 +8148 /data/VOCdevkit/VOC2012/JPEGImages/2008_006337.jpg 500 375 8 245 110 306 195 15 335 114 365 150 15 100 264 147 345 15 96 100 208 192 15 65 173 162 268 +8149 /data/VOCdevkit/VOC2012/JPEGImages/2008_006339.jpg 500 375 16 80 139 301 322 16 90 1 482 271 +8150 /data/VOCdevkit/VOC2012/JPEGImages/2008_006341.jpg 500 375 7 57 7 384 199 14 155 121 450 370 +8151 /data/VOCdevkit/VOC2012/JPEGImages/2008_006345.jpg 500 473 13 203 216 402 425 +8152 /data/VOCdevkit/VOC2012/JPEGImages/2008_006347.jpg 500 375 7 207 55 317 162 +8153 /data/VOCdevkit/VOC2012/JPEGImages/2008_006349.jpg 500 375 3 35 110 485 226 +8154 /data/VOCdevkit/VOC2012/JPEGImages/2008_006350.jpg 500 375 8 105 1 395 375 +8155 /data/VOCdevkit/VOC2012/JPEGImages/2008_006351.jpg 375 500 7 1 1 264 244 +8156 /data/VOCdevkit/VOC2012/JPEGImages/2008_006353.jpg 500 375 0 1 82 500 241 +8157 /data/VOCdevkit/VOC2012/JPEGImages/2008_006355.jpg 500 375 9 191 121 260 255 +8158 /data/VOCdevkit/VOC2012/JPEGImages/2008_006356.jpg 500 375 11 99 66 438 375 +8159 /data/VOCdevkit/VOC2012/JPEGImages/2008_006359.jpg 500 375 5 1 10 416 375 +8160 /data/VOCdevkit/VOC2012/JPEGImages/2008_006361.jpg 375 500 1 52 1 345 479 +8161 /data/VOCdevkit/VOC2012/JPEGImages/2008_006362.jpg 500 375 7 147 26 500 375 +8162 /data/VOCdevkit/VOC2012/JPEGImages/2008_006364.jpg 500 333 0 1 15 500 277 +8163 /data/VOCdevkit/VOC2012/JPEGImages/2008_006365.jpg 500 330 6 1 229 38 258 6 23 234 78 254 18 89 77 436 301 +8164 /data/VOCdevkit/VOC2012/JPEGImages/2008_006366.jpg 375 500 19 263 310 349 386 +8165 /data/VOCdevkit/VOC2012/JPEGImages/2008_006368.jpg 500 333 18 1 1 317 333 +8166 /data/VOCdevkit/VOC2012/JPEGImages/2008_006369.jpg 500 375 2 150 178 259 262 +8167 /data/VOCdevkit/VOC2012/JPEGImages/2008_006370.jpg 500 375 17 58 138 459 375 14 87 91 365 375 +8168 /data/VOCdevkit/VOC2012/JPEGImages/2008_006373.jpg 500 375 19 243 1 466 161 19 73 222 177 328 +8169 /data/VOCdevkit/VOC2012/JPEGImages/2008_006376.jpg 500 350 2 30 73 193 287 2 271 99 471 309 +8170 /data/VOCdevkit/VOC2012/JPEGImages/2008_006377.jpg 500 375 7 155 78 346 375 14 17 1 500 375 +8171 /data/VOCdevkit/VOC2012/JPEGImages/2008_006382.jpg 500 375 6 1 163 400 375 14 205 155 303 249 14 247 129 381 289 14 280 124 351 255 +8172 /data/VOCdevkit/VOC2012/JPEGImages/2008_006384.jpg 260 500 7 25 73 197 154 +8173 /data/VOCdevkit/VOC2012/JPEGImages/2008_006386.jpg 375 500 11 92 71 279 343 +8174 /data/VOCdevkit/VOC2012/JPEGImages/2008_006387.jpg 500 375 8 346 109 500 270 +8175 /data/VOCdevkit/VOC2012/JPEGImages/2008_006389.jpg 500 375 17 1 1 500 375 +8176 /data/VOCdevkit/VOC2012/JPEGImages/2008_006390.jpg 500 376 12 84 164 240 364 14 188 133 237 192 14 221 127 246 157 14 320 119 381 237 14 312 126 337 162 14 360 119 392 231 14 374 129 406 201 14 240 67 365 191 +8177 /data/VOCdevkit/VOC2012/JPEGImages/2008_006392.jpg 500 375 6 1 228 95 343 14 77 198 101 266 14 127 207 203 368 14 211 190 252 283 14 437 166 456 236 +8178 /data/VOCdevkit/VOC2012/JPEGImages/2008_006394.jpg 500 375 0 50 124 419 232 +8179 /data/VOCdevkit/VOC2012/JPEGImages/2008_006397.jpg 483 482 12 33 183 385 436 14 197 137 294 268 +8180 /data/VOCdevkit/VOC2012/JPEGImages/2008_006400.jpg 444 333 7 10 1 444 283 +8181 /data/VOCdevkit/VOC2012/JPEGImages/2008_006401.jpg 500 344 0 51 89 455 225 +8182 /data/VOCdevkit/VOC2012/JPEGImages/2008_006403.jpg 500 375 7 139 35 372 324 +8183 /data/VOCdevkit/VOC2012/JPEGImages/2008_006404.jpg 500 333 3 45 1 259 259 14 140 221 174 237 +8184 /data/VOCdevkit/VOC2012/JPEGImages/2008_006407.jpg 500 375 3 1 106 426 306 14 146 172 213 226 14 122 155 154 209 3 399 169 459 187 +8185 /data/VOCdevkit/VOC2012/JPEGImages/2008_006408.jpg 375 500 14 6 58 286 364 +8186 /data/VOCdevkit/VOC2012/JPEGImages/2008_006409.jpg 375 500 19 58 70 329 282 +8187 /data/VOCdevkit/VOC2012/JPEGImages/2008_006410.jpg 333 500 1 57 263 266 464 14 65 142 210 386 14 183 147 258 365 +8188 /data/VOCdevkit/VOC2012/JPEGImages/2008_006416.jpg 500 333 11 123 50 309 238 +8189 /data/VOCdevkit/VOC2012/JPEGImages/2008_006417.jpg 500 375 6 42 246 155 292 6 49 224 111 247 +8190 /data/VOCdevkit/VOC2012/JPEGImages/2008_006419.jpg 500 338 2 202 183 280 271 +8191 /data/VOCdevkit/VOC2012/JPEGImages/2008_006421.jpg 375 500 11 83 318 193 500 14 158 183 203 242 +8192 /data/VOCdevkit/VOC2012/JPEGImages/2008_006424.jpg 500 332 1 121 143 320 332 14 121 35 257 321 14 159 33 307 332 +8193 /data/VOCdevkit/VOC2012/JPEGImages/2008_006425.jpg 500 334 11 184 49 411 227 11 117 40 262 231 +8194 /data/VOCdevkit/VOC2012/JPEGImages/2008_006427.jpg 500 375 4 74 5 188 241 +8195 /data/VOCdevkit/VOC2012/JPEGImages/2008_006429.jpg 500 351 12 56 109 228 335 12 198 36 403 337 +8196 /data/VOCdevkit/VOC2012/JPEGImages/2008_006430.jpg 333 500 7 1 15 280 460 +8197 /data/VOCdevkit/VOC2012/JPEGImages/2008_006432.jpg 500 334 2 125 120 380 310 +8198 /data/VOCdevkit/VOC2012/JPEGImages/2008_006433.jpg 500 375 19 112 151 226 300 14 140 23 480 375 14 384 110 440 175 +8199 /data/VOCdevkit/VOC2012/JPEGImages/2008_006434.jpg 500 333 12 150 48 433 333 +8200 /data/VOCdevkit/VOC2012/JPEGImages/2008_006436.jpg 500 335 17 1 1 348 212 11 14 161 124 259 11 256 65 500 219 +8201 /data/VOCdevkit/VOC2012/JPEGImages/2008_006438.jpg 500 369 6 88 20 404 286 6 438 53 500 207 6 363 16 476 84 6 97 8 187 82 6 1 1 52 80 +8202 /data/VOCdevkit/VOC2012/JPEGImages/2008_006441.jpg 500 375 13 8 21 407 319 15 147 45 255 136 14 371 120 500 375 +8203 /data/VOCdevkit/VOC2012/JPEGImages/2008_006447.jpg 500 375 2 102 44 288 364 +8204 /data/VOCdevkit/VOC2012/JPEGImages/2008_006448.jpg 500 375 14 300 93 500 375 12 170 202 303 375 12 34 217 160 375 14 188 135 293 313 14 34 132 164 358 +8205 /data/VOCdevkit/VOC2012/JPEGImages/2008_006449.jpg 500 333 7 91 4 352 333 +8206 /data/VOCdevkit/VOC2012/JPEGImages/2008_006452.jpg 500 333 11 139 15 500 290 +8207 /data/VOCdevkit/VOC2012/JPEGImages/2008_006458.jpg 333 500 13 21 139 236 439 14 154 47 304 445 +8208 /data/VOCdevkit/VOC2012/JPEGImages/2008_006461.jpg 500 375 2 189 105 284 144 +8209 /data/VOCdevkit/VOC2012/JPEGImages/2008_006462.jpg 500 375 7 116 121 357 330 +8210 /data/VOCdevkit/VOC2012/JPEGImages/2008_006463.jpg 500 375 0 1 82 494 281 +8211 /data/VOCdevkit/VOC2012/JPEGImages/2008_006467.jpg 500 333 1 45 114 359 314 14 155 22 331 279 +8212 /data/VOCdevkit/VOC2012/JPEGImages/2008_006470.jpg 500 375 8 83 13 427 347 +8213 /data/VOCdevkit/VOC2012/JPEGImages/2008_006474.jpg 500 375 11 178 128 241 284 +8214 /data/VOCdevkit/VOC2012/JPEGImages/2008_006475.jpg 500 262 6 322 110 489 202 +8215 /data/VOCdevkit/VOC2012/JPEGImages/2008_006477.jpg 500 399 16 1 104 291 399 +8216 /data/VOCdevkit/VOC2012/JPEGImages/2008_006480.jpg 500 316 7 1 1 446 271 +8217 /data/VOCdevkit/VOC2012/JPEGImages/2008_006481.jpg 500 303 2 200 61 229 137 3 186 229 213 263 +8218 /data/VOCdevkit/VOC2012/JPEGImages/2008_006482.jpg 500 411 10 1 341 201 411 +8219 /data/VOCdevkit/VOC2012/JPEGImages/2008_006483.jpg 500 375 5 125 142 362 255 6 298 210 398 296 6 375 197 454 247 +8220 /data/VOCdevkit/VOC2012/JPEGImages/2008_006487.jpg 500 350 3 1 42 170 278 14 268 300 283 343 14 393 300 415 341 14 448 302 464 343 +8221 /data/VOCdevkit/VOC2012/JPEGImages/2008_006488.jpg 500 298 3 125 190 221 215 +8222 /data/VOCdevkit/VOC2012/JPEGImages/2008_006489.jpg 500 188 3 436 64 489 158 3 384 75 435 160 3 183 66 252 158 3 98 88 143 151 3 2 95 31 150 3 234 105 269 147 3 362 93 406 153 +8223 /data/VOCdevkit/VOC2012/JPEGImages/2008_006490.jpg 375 500 3 100 58 302 332 +8224 /data/VOCdevkit/VOC2012/JPEGImages/2008_006491.jpg 500 375 13 67 160 477 375 14 150 99 240 276 +8225 /data/VOCdevkit/VOC2012/JPEGImages/2008_006496.jpg 500 375 9 214 144 345 323 9 139 115 233 238 14 278 49 313 104 +8226 /data/VOCdevkit/VOC2012/JPEGImages/2008_006497.jpg 500 375 13 270 137 337 187 14 247 151 297 183 14 303 126 345 174 +8227 /data/VOCdevkit/VOC2012/JPEGImages/2008_006500.jpg 500 375 3 141 198 288 216 3 165 184 192 197 +8228 /data/VOCdevkit/VOC2012/JPEGImages/2008_006502.jpg 500 375 11 99 57 257 375 11 280 44 473 341 +8229 /data/VOCdevkit/VOC2012/JPEGImages/2008_006503.jpg 500 336 2 243 67 285 93 2 273 278 306 298 2 316 268 343 284 2 406 265 433 284 2 465 255 487 270 2 455 253 477 269 2 438 238 457 252 2 319 236 339 249 2 305 232 326 247 2 286 230 303 245 2 171 244 195 260 2 98 238 118 252 2 78 230 98 245 2 24 223 43 240 2 52 222 69 236 2 136 222 158 237 +8230 /data/VOCdevkit/VOC2012/JPEGImages/2008_006506.jpg 375 500 6 46 365 153 404 +8231 /data/VOCdevkit/VOC2012/JPEGImages/2008_006509.jpg 375 500 15 186 359 221 396 15 166 381 198 411 15 51 453 120 500 +8232 /data/VOCdevkit/VOC2012/JPEGImages/2008_006511.jpg 500 375 11 137 137 291 347 +8233 /data/VOCdevkit/VOC2012/JPEGImages/2008_006512.jpg 403 303 7 1 1 403 303 +8234 /data/VOCdevkit/VOC2012/JPEGImages/2008_006517.jpg 500 375 13 1 1 418 375 +8235 /data/VOCdevkit/VOC2012/JPEGImages/2008_006519.jpg 450 338 1 221 201 346 306 14 235 134 296 305 +8236 /data/VOCdevkit/VOC2012/JPEGImages/2008_006520.jpg 500 332 7 140 58 416 332 +8237 /data/VOCdevkit/VOC2012/JPEGImages/2008_006522.jpg 500 375 6 1 157 45 185 +8238 /data/VOCdevkit/VOC2012/JPEGImages/2008_006523.jpg 500 375 18 70 1 500 375 +8239 /data/VOCdevkit/VOC2012/JPEGImages/2008_006524.jpg 213 300 15 1 2 211 300 +8240 /data/VOCdevkit/VOC2012/JPEGImages/2008_006526.jpg 500 333 14 209 13 500 333 13 1 176 85 298 13 14 163 106 252 6 204 141 248 179 6 87 128 137 155 +8241 /data/VOCdevkit/VOC2012/JPEGImages/2008_006528.jpg 500 375 9 112 72 324 350 +8242 /data/VOCdevkit/VOC2012/JPEGImages/2008_006530.jpg 500 375 5 1 1 500 375 14 124 163 196 222 14 275 128 354 223 14 334 116 417 223 +8243 /data/VOCdevkit/VOC2012/JPEGImages/2008_006534.jpg 500 375 15 17 18 476 363 15 411 158 500 328 +8244 /data/VOCdevkit/VOC2012/JPEGImages/2008_006538.jpg 500 375 6 289 209 420 326 +8245 /data/VOCdevkit/VOC2012/JPEGImages/2008_006540.jpg 500 333 0 176 112 491 208 +8246 /data/VOCdevkit/VOC2012/JPEGImages/2008_006543.jpg 333 500 15 73 277 193 365 +8247 /data/VOCdevkit/VOC2012/JPEGImages/2008_006546.jpg 500 357 11 231 56 405 245 +8248 /data/VOCdevkit/VOC2012/JPEGImages/2008_006547.jpg 500 377 9 148 215 285 324 9 81 175 126 210 9 322 186 355 214 +8249 /data/VOCdevkit/VOC2012/JPEGImages/2008_006548.jpg 500 334 0 1 128 393 217 +8250 /data/VOCdevkit/VOC2012/JPEGImages/2008_006549.jpg 500 375 13 66 161 473 375 14 149 99 240 277 13 6 244 98 306 +8251 /data/VOCdevkit/VOC2012/JPEGImages/2008_006553.jpg 500 375 18 76 50 345 297 +8252 /data/VOCdevkit/VOC2012/JPEGImages/2008_006554.jpg 500 375 5 62 79 369 278 14 318 147 377 324 14 380 143 428 338 +8253 /data/VOCdevkit/VOC2012/JPEGImages/2008_006558.jpg 303 500 4 158 29 280 488 +8254 /data/VOCdevkit/VOC2012/JPEGImages/2008_006561.jpg 500 333 7 1 24 324 303 +8255 /data/VOCdevkit/VOC2012/JPEGImages/2008_006562.jpg 500 375 15 59 1 339 375 15 269 48 442 335 6 31 183 303 271 +8256 /data/VOCdevkit/VOC2012/JPEGImages/2008_006564.jpg 500 334 0 121 166 306 212 +8257 /data/VOCdevkit/VOC2012/JPEGImages/2008_006566.jpg 500 375 2 232 142 372 258 +8258 /data/VOCdevkit/VOC2012/JPEGImages/2008_006567.jpg 500 340 13 22 130 250 266 14 79 109 174 238 +8259 /data/VOCdevkit/VOC2012/JPEGImages/2008_006568.jpg 261 500 11 21 13 219 499 +8260 /data/VOCdevkit/VOC2012/JPEGImages/2008_006570.jpg 375 500 16 119 211 227 388 14 99 142 224 474 14 249 169 375 482 +8261 /data/VOCdevkit/VOC2012/JPEGImages/2008_006576.jpg 375 500 7 84 80 361 283 +8262 /data/VOCdevkit/VOC2012/JPEGImages/2008_006578.jpg 500 375 11 208 119 285 296 +8263 /data/VOCdevkit/VOC2012/JPEGImages/2008_006579.jpg 500 375 1 16 27 480 353 +8264 /data/VOCdevkit/VOC2012/JPEGImages/2008_006585.jpg 333 500 4 239 207 264 279 4 271 192 296 266 4 212 207 234 290 +8265 /data/VOCdevkit/VOC2012/JPEGImages/2008_006586.jpg 500 375 3 120 223 209 272 +8266 /data/VOCdevkit/VOC2012/JPEGImages/2008_006587.jpg 500 375 11 184 122 344 337 +8267 /data/VOCdevkit/VOC2012/JPEGImages/2008_006588.jpg 500 375 10 1 1 189 99 14 186 20 392 375 +8268 /data/VOCdevkit/VOC2012/JPEGImages/2008_006591.jpg 500 375 19 190 1 393 71 19 388 1 500 85 +8269 /data/VOCdevkit/VOC2012/JPEGImages/2008_006598.jpg 500 333 2 43 115 114 210 2 317 115 433 266 +8270 /data/VOCdevkit/VOC2012/JPEGImages/2008_006599.jpg 300 283 7 34 1 281 283 +8271 /data/VOCdevkit/VOC2012/JPEGImages/2008_006600.jpg 500 332 6 1 172 13 193 6 416 173 463 200 +8272 /data/VOCdevkit/VOC2012/JPEGImages/2008_006602.jpg 500 375 11 139 170 380 310 11 110 58 191 190 +8273 /data/VOCdevkit/VOC2012/JPEGImages/2008_006604.jpg 500 375 0 1 97 500 375 +8274 /data/VOCdevkit/VOC2012/JPEGImages/2008_006605.jpg 500 375 19 253 123 331 227 4 103 262 138 358 4 93 247 117 355 19 361 150 445 234 4 76 257 104 352 +8275 /data/VOCdevkit/VOC2012/JPEGImages/2008_006606.jpg 500 333 8 392 232 492 333 8 221 188 294 313 8 102 203 187 333 19 366 162 430 230 19 240 152 284 188 19 108 153 182 210 +8276 /data/VOCdevkit/VOC2012/JPEGImages/2008_006609.jpg 500 363 7 37 71 231 363 14 280 1 500 363 +8277 /data/VOCdevkit/VOC2012/JPEGImages/2008_006610.jpg 500 375 2 368 191 396 246 2 292 168 311 217 14 236 149 292 273 +8278 /data/VOCdevkit/VOC2012/JPEGImages/2008_006611.jpg 500 343 8 1 183 157 343 8 167 185 346 343 10 90 219 414 343 14 1 109 205 343 14 338 95 497 343 15 203 250 229 278 15 25 88 114 142 +8279 /data/VOCdevkit/VOC2012/JPEGImages/2008_006613.jpg 500 375 12 143 133 255 366 12 247 123 341 375 14 165 35 247 252 14 280 45 365 264 +8280 /data/VOCdevkit/VOC2012/JPEGImages/2008_006614.jpg 500 375 11 115 1 463 375 +8281 /data/VOCdevkit/VOC2012/JPEGImages/2008_006616.jpg 500 448 11 187 261 348 412 14 116 10 483 444 17 26 104 500 303 +8282 /data/VOCdevkit/VOC2012/JPEGImages/2008_006617.jpg 500 375 19 107 82 379 298 +8283 /data/VOCdevkit/VOC2012/JPEGImages/2008_006619.jpg 500 333 0 7 103 495 227 +8284 /data/VOCdevkit/VOC2012/JPEGImages/2008_006621.jpg 500 333 0 1 84 499 232 +8285 /data/VOCdevkit/VOC2012/JPEGImages/2008_006623.jpg 500 333 0 3 88 496 235 +8286 /data/VOCdevkit/VOC2012/JPEGImages/2008_006624.jpg 333 500 19 90 250 165 312 8 172 313 318 470 8 144 329 193 403 15 220 243 264 308 +8287 /data/VOCdevkit/VOC2012/JPEGImages/2008_006625.jpg 500 375 14 62 1 498 311 +8288 /data/VOCdevkit/VOC2012/JPEGImages/2008_006626.jpg 407 500 2 33 69 295 467 +8289 /data/VOCdevkit/VOC2012/JPEGImages/2008_006629.jpg 500 375 7 102 1 471 302 +8290 /data/VOCdevkit/VOC2012/JPEGImages/2008_006631.jpg 500 338 0 17 52 500 335 14 191 96 341 338 +8291 /data/VOCdevkit/VOC2012/JPEGImages/2008_006634.jpg 500 332 6 1 78 225 332 +8292 /data/VOCdevkit/VOC2012/JPEGImages/2008_006635.jpg 500 375 5 180 108 376 250 +8293 /data/VOCdevkit/VOC2012/JPEGImages/2008_006637.jpg 500 343 0 87 103 411 207 +8294 /data/VOCdevkit/VOC2012/JPEGImages/2008_006638.jpg 500 375 6 250 68 453 192 6 38 79 377 349 6 1 50 137 375 +8295 /data/VOCdevkit/VOC2012/JPEGImages/2008_006641.jpg 375 500 4 50 22 165 486 +8296 /data/VOCdevkit/VOC2012/JPEGImages/2008_006642.jpg 500 375 1 162 149 254 214 14 165 118 209 200 14 180 115 233 206 6 350 139 500 195 6 84 128 289 189 6 1 133 65 183 +8297 /data/VOCdevkit/VOC2012/JPEGImages/2008_006645.jpg 500 375 1 54 82 500 375 +8298 /data/VOCdevkit/VOC2012/JPEGImages/2008_006646.jpg 500 488 12 29 88 477 476 14 160 4 273 332 +8299 /data/VOCdevkit/VOC2012/JPEGImages/2008_006649.jpg 500 500 6 31 19 461 474 +8300 /data/VOCdevkit/VOC2012/JPEGImages/2008_006650.jpg 375 500 12 63 52 280 500 14 314 248 375 500 14 1 238 118 500 +8301 /data/VOCdevkit/VOC2012/JPEGImages/2008_006654.jpg 335 500 3 129 138 161 209 +8302 /data/VOCdevkit/VOC2012/JPEGImages/2008_006655.jpg 500 375 18 1 169 426 276 +8303 /data/VOCdevkit/VOC2012/JPEGImages/2008_006656.jpg 500 375 7 19 12 500 375 +8304 /data/VOCdevkit/VOC2012/JPEGImages/2008_006657.jpg 500 375 7 1 26 312 375 4 306 185 382 349 +8305 /data/VOCdevkit/VOC2012/JPEGImages/2008_006660.jpg 500 375 8 266 165 354 320 8 234 192 358 375 +8306 /data/VOCdevkit/VOC2012/JPEGImages/2008_006662.jpg 500 375 19 51 90 180 221 19 1 110 54 220 +8307 /data/VOCdevkit/VOC2012/JPEGImages/2008_006663.jpg 500 375 14 77 14 255 338 14 212 58 485 332 14 1 91 82 227 +8308 /data/VOCdevkit/VOC2012/JPEGImages/2008_006665.jpg 500 333 8 437 239 500 333 17 6 168 330 333 +8309 /data/VOCdevkit/VOC2012/JPEGImages/2008_006667.jpg 500 375 2 182 73 273 183 +8310 /data/VOCdevkit/VOC2012/JPEGImages/2008_006668.jpg 500 375 19 76 12 401 275 +8311 /data/VOCdevkit/VOC2012/JPEGImages/2008_006671.jpg 500 333 0 106 45 500 290 0 18 159 418 242 +8312 /data/VOCdevkit/VOC2012/JPEGImages/2008_006677.jpg 500 333 0 48 131 275 208 +8313 /data/VOCdevkit/VOC2012/JPEGImages/2008_006682.jpg 500 375 11 67 132 500 323 +8314 /data/VOCdevkit/VOC2012/JPEGImages/2008_006684.jpg 500 378 8 1 96 500 378 14 45 155 255 378 14 87 64 484 378 +8315 /data/VOCdevkit/VOC2012/JPEGImages/2008_006686.jpg 500 315 13 20 35 476 282 +8316 /data/VOCdevkit/VOC2012/JPEGImages/2008_006690.jpg 500 441 7 204 230 312 283 +8317 /data/VOCdevkit/VOC2012/JPEGImages/2008_006691.jpg 375 500 6 1 281 295 479 8 324 300 367 364 +8318 /data/VOCdevkit/VOC2012/JPEGImages/2008_006692.jpg 400 300 3 95 241 187 283 14 112 227 153 268 +8319 /data/VOCdevkit/VOC2012/JPEGImages/2008_006694.jpg 500 429 6 3 51 495 399 +8320 /data/VOCdevkit/VOC2012/JPEGImages/2008_006696.jpg 324 432 8 18 53 291 422 +8321 /data/VOCdevkit/VOC2012/JPEGImages/2008_006700.jpg 500 333 0 23 113 482 223 +8322 /data/VOCdevkit/VOC2012/JPEGImages/2008_006701.jpg 333 500 4 50 179 158 500 4 185 172 312 500 4 152 176 259 500 15 279 151 321 228 +8323 /data/VOCdevkit/VOC2012/JPEGImages/2008_006703.jpg 500 333 0 58 138 336 226 +8324 /data/VOCdevkit/VOC2012/JPEGImages/2008_006705.jpg 500 375 10 114 165 393 375 14 1 107 124 375 14 63 92 147 373 14 116 82 197 308 14 115 63 247 247 14 336 120 487 375 14 341 103 414 266 14 322 85 376 228 +8325 /data/VOCdevkit/VOC2012/JPEGImages/2008_006708.jpg 500 333 13 207 37 382 163 14 281 13 338 135 +8326 /data/VOCdevkit/VOC2012/JPEGImages/2008_006710.jpg 500 375 14 293 102 473 375 14 73 169 183 275 14 110 141 163 212 8 266 120 341 223 19 1 299 99 375 19 1 243 76 326 +8327 /data/VOCdevkit/VOC2012/JPEGImages/2008_006712.jpg 375 500 8 33 293 251 481 4 221 420 243 466 4 246 205 267 259 +8328 /data/VOCdevkit/VOC2012/JPEGImages/2008_006714.jpg 500 303 6 110 49 488 300 14 236 65 277 104 6 50 46 163 102 6 1 52 55 104 +8329 /data/VOCdevkit/VOC2012/JPEGImages/2008_006715.jpg 500 393 2 302 133 399 255 +8330 /data/VOCdevkit/VOC2012/JPEGImages/2008_006716.jpg 443 313 11 26 43 245 308 14 199 29 434 290 +8331 /data/VOCdevkit/VOC2012/JPEGImages/2008_006717.jpg 331 500 11 93 96 225 399 +8332 /data/VOCdevkit/VOC2012/JPEGImages/2008_006718.jpg 500 277 6 5 66 378 268 6 363 65 464 153 +8333 /data/VOCdevkit/VOC2012/JPEGImages/2008_006719.jpg 500 375 8 59 192 244 375 19 172 120 235 173 4 65 82 75 113 +8334 /data/VOCdevkit/VOC2012/JPEGImages/2008_006720.jpg 500 375 3 209 114 257 166 +8335 /data/VOCdevkit/VOC2012/JPEGImages/2008_006722.jpg 500 306 11 152 100 500 306 14 8 17 500 235 +8336 /data/VOCdevkit/VOC2012/JPEGImages/2008_006724.jpg 500 375 11 167 67 347 241 11 60 228 230 304 11 62 109 388 375 11 342 200 500 353 +8337 /data/VOCdevkit/VOC2012/JPEGImages/2008_006728.jpg 399 500 7 12 9 339 467 +8338 /data/VOCdevkit/VOC2012/JPEGImages/2008_006730.jpg 380 481 3 62 245 380 350 14 72 214 145 292 14 112 217 176 298 +8339 /data/VOCdevkit/VOC2012/JPEGImages/2008_006731.jpg 375 500 4 86 381 141 493 14 1 23 357 500 +8340 /data/VOCdevkit/VOC2012/JPEGImages/2008_006732.jpg 320 376 14 49 56 291 351 +8341 /data/VOCdevkit/VOC2012/JPEGImages/2008_006733.jpg 500 339 19 217 29 352 152 19 353 79 411 221 19 439 114 500 274 14 131 74 324 339 8 79 181 262 339 +8342 /data/VOCdevkit/VOC2012/JPEGImages/2008_006737.jpg 500 375 17 166 167 451 356 17 1 219 110 375 +8343 /data/VOCdevkit/VOC2012/JPEGImages/2008_006743.jpg 324 500 11 83 131 256 416 +8344 /data/VOCdevkit/VOC2012/JPEGImages/2008_006746.jpg 500 325 7 25 37 467 315 +8345 /data/VOCdevkit/VOC2012/JPEGImages/2008_006747.jpg 500 375 3 218 152 253 200 +8346 /data/VOCdevkit/VOC2012/JPEGImages/2008_006748.jpg 500 375 5 144 106 457 226 +8347 /data/VOCdevkit/VOC2012/JPEGImages/2008_006750.jpg 500 375 10 1 242 432 375 14 352 121 464 262 14 265 119 375 243 14 205 131 283 235 14 27 124 130 300 4 170 187 199 257 14 123 128 223 258 +8348 /data/VOCdevkit/VOC2012/JPEGImages/2008_006751.jpg 500 375 15 236 59 464 347 +8349 /data/VOCdevkit/VOC2012/JPEGImages/2008_006752.jpg 500 332 18 1 137 300 313 +8350 /data/VOCdevkit/VOC2012/JPEGImages/2008_006753.jpg 500 375 7 305 191 340 239 7 161 197 233 242 +8351 /data/VOCdevkit/VOC2012/JPEGImages/2008_006758.jpg 500 375 12 100 99 392 316 14 195 35 272 223 +8352 /data/VOCdevkit/VOC2012/JPEGImages/2008_006761.jpg 500 375 0 1 39 500 349 +8353 /data/VOCdevkit/VOC2012/JPEGImages/2008_006762.jpg 500 375 6 131 140 404 306 6 364 129 396 144 6 131 110 167 124 +8354 /data/VOCdevkit/VOC2012/JPEGImages/2008_006764.jpg 480 500 2 42 145 480 471 +8355 /data/VOCdevkit/VOC2012/JPEGImages/2008_006765.jpg 500 375 7 1 16 403 375 +8356 /data/VOCdevkit/VOC2012/JPEGImages/2008_006767.jpg 500 390 3 356 320 471 373 3 130 318 256 373 3 55 310 80 323 3 97 310 129 325 3 317 292 447 333 +8357 /data/VOCdevkit/VOC2012/JPEGImages/2008_006773.jpg 500 375 19 241 198 316 245 17 37 235 275 375 +8358 /data/VOCdevkit/VOC2012/JPEGImages/2008_006774.jpg 500 347 6 34 104 458 304 +8359 /data/VOCdevkit/VOC2012/JPEGImages/2008_006776.jpg 500 333 14 144 71 320 333 13 61 102 450 333 +8360 /data/VOCdevkit/VOC2012/JPEGImages/2008_006777.jpg 500 375 0 369 56 500 112 0 213 50 278 77 0 17 96 473 271 +8361 /data/VOCdevkit/VOC2012/JPEGImages/2008_006778.jpg 500 375 0 1 14 500 319 +8362 /data/VOCdevkit/VOC2012/JPEGImages/2008_006779.jpg 500 334 12 18 124 391 334 14 85 20 218 334 14 153 29 225 219 +8363 /data/VOCdevkit/VOC2012/JPEGImages/2008_006781.jpg 500 333 7 86 1 500 333 +8364 /data/VOCdevkit/VOC2012/JPEGImages/2008_006784.jpg 500 375 17 170 149 334 245 +8365 /data/VOCdevkit/VOC2012/JPEGImages/2008_006785.jpg 500 375 7 1 1 500 375 +8366 /data/VOCdevkit/VOC2012/JPEGImages/2008_006792.jpg 375 500 4 113 1 294 487 +8367 /data/VOCdevkit/VOC2012/JPEGImages/2008_006793.jpg 500 375 7 1 1 361 352 +8368 /data/VOCdevkit/VOC2012/JPEGImages/2008_006796.jpg 375 500 15 140 99 332 248 14 1 46 330 500 +8369 /data/VOCdevkit/VOC2012/JPEGImages/2008_006797.jpg 500 375 12 124 133 352 286 +8370 /data/VOCdevkit/VOC2012/JPEGImages/2008_006798.jpg 500 287 11 82 94 217 259 14 182 1 375 242 +8371 /data/VOCdevkit/VOC2012/JPEGImages/2008_006800.jpg 400 300 6 79 100 339 239 6 349 78 376 96 +8372 /data/VOCdevkit/VOC2012/JPEGImages/2008_006802.jpg 375 500 2 79 346 121 387 2 136 357 180 391 +8373 /data/VOCdevkit/VOC2012/JPEGImages/2008_006807.jpg 500 375 1 1 229 109 375 14 353 121 500 375 14 12 57 146 375 15 221 112 309 273 +8374 /data/VOCdevkit/VOC2012/JPEGImages/2008_006808.jpg 500 377 8 229 249 354 377 8 358 263 438 377 10 256 253 500 377 4 458 281 474 334 +8375 /data/VOCdevkit/VOC2012/JPEGImages/2008_006810.jpg 500 471 7 1 30 416 471 +8376 /data/VOCdevkit/VOC2012/JPEGImages/2008_006811.jpg 465 451 11 42 47 465 438 +8377 /data/VOCdevkit/VOC2012/JPEGImages/2008_006813.jpg 334 500 1 82 296 297 500 14 50 49 326 500 +8378 /data/VOCdevkit/VOC2012/JPEGImages/2008_006815.jpg 375 500 4 171 30 302 461 4 47 46 176 458 +8379 /data/VOCdevkit/VOC2012/JPEGImages/2008_006816.jpg 500 478 15 124 1 479 201 14 67 63 500 478 14 181 172 481 478 14 439 230 500 310 +8380 /data/VOCdevkit/VOC2012/JPEGImages/2008_006817.jpg 500 332 7 229 126 387 218 7 148 103 211 188 7 199 109 272 192 +8381 /data/VOCdevkit/VOC2012/JPEGImages/2008_006818.jpg 500 318 18 97 84 500 211 14 74 134 92 182 +8382 /data/VOCdevkit/VOC2012/JPEGImages/2008_006819.jpg 500 375 6 61 16 463 341 +8383 /data/VOCdevkit/VOC2012/JPEGImages/2008_006820.jpg 500 331 15 228 204 265 299 14 172 175 242 331 +8384 /data/VOCdevkit/VOC2012/JPEGImages/2008_006824.jpg 500 333 3 52 137 383 198 3 279 19 457 51 +8385 /data/VOCdevkit/VOC2012/JPEGImages/2008_006825.jpg 500 254 3 23 130 423 168 11 166 79 227 137 14 195 57 302 138 +8386 /data/VOCdevkit/VOC2012/JPEGImages/2008_006827.jpg 500 375 9 302 160 366 227 9 269 161 309 223 9 88 162 119 207 6 172 163 291 254 6 368 152 449 224 6 321 141 354 166 +8387 /data/VOCdevkit/VOC2012/JPEGImages/2008_006828.jpg 374 500 15 124 122 220 340 15 124 254 172 348 15 92 233 136 358 15 1 233 117 376 +8388 /data/VOCdevkit/VOC2012/JPEGImages/2008_006831.jpg 500 332 3 184 19 488 256 +8389 /data/VOCdevkit/VOC2012/JPEGImages/2008_006832.jpg 500 331 0 192 167 229 204 0 280 145 317 178 +8390 /data/VOCdevkit/VOC2012/JPEGImages/2008_006833.jpg 500 375 3 296 97 450 223 3 1 1 308 298 6 306 182 500 375 14 312 149 464 375 +8391 /data/VOCdevkit/VOC2012/JPEGImages/2008_006834.jpg 500 375 8 10 104 327 368 14 49 99 250 375 14 136 82 438 375 +8392 /data/VOCdevkit/VOC2012/JPEGImages/2008_006835.jpg 500 375 16 104 184 346 348 16 143 92 325 215 +8393 /data/VOCdevkit/VOC2012/JPEGImages/2008_006837.jpg 343 500 11 49 118 294 395 8 229 1 343 207 8 31 1 174 182 +8394 /data/VOCdevkit/VOC2012/JPEGImages/2008_006839.jpg 500 375 6 29 79 112 128 +8395 /data/VOCdevkit/VOC2012/JPEGImages/2008_006841.jpg 500 374 8 226 136 333 286 8 311 132 392 282 +8396 /data/VOCdevkit/VOC2012/JPEGImages/2008_006843.jpg 500 333 7 155 26 500 324 +8397 /data/VOCdevkit/VOC2012/JPEGImages/2008_006844.jpg 500 375 11 200 153 289 282 14 146 38 335 375 6 76 108 424 375 6 422 183 500 243 6 30 183 86 243 +8398 /data/VOCdevkit/VOC2012/JPEGImages/2008_006847.jpg 375 500 14 195 225 300 432 14 40 129 185 425 8 139 267 375 500 8 1 264 170 500 +8399 /data/VOCdevkit/VOC2012/JPEGImages/2008_006849.jpg 500 375 18 1 1 103 375 +8400 /data/VOCdevkit/VOC2012/JPEGImages/2008_006855.jpg 375 500 14 242 361 362 490 14 203 328 312 458 1 122 239 198 389 1 218 248 303 372 +8401 /data/VOCdevkit/VOC2012/JPEGImages/2008_006857.jpg 333 500 13 139 116 304 414 14 20 128 197 369 +8402 /data/VOCdevkit/VOC2012/JPEGImages/2008_006863.jpg 500 375 8 1 99 276 375 14 213 1 487 375 7 178 127 301 298 +8403 /data/VOCdevkit/VOC2012/JPEGImages/2008_006864.jpg 500 375 14 58 55 357 375 14 88 201 321 375 14 129 234 246 375 15 96 2 192 143 +8404 /data/VOCdevkit/VOC2012/JPEGImages/2008_006865.jpg 333 500 18 34 205 333 312 +8405 /data/VOCdevkit/VOC2012/JPEGImages/2008_006868.jpg 500 375 7 275 93 371 216 17 1 38 472 375 +8406 /data/VOCdevkit/VOC2012/JPEGImages/2008_006870.jpg 500 375 11 194 181 419 353 14 133 1 254 234 +8407 /data/VOCdevkit/VOC2012/JPEGImages/2008_006872.jpg 500 377 14 433 159 477 269 6 65 158 445 283 6 1 159 193 235 6 1 158 75 187 +8408 /data/VOCdevkit/VOC2012/JPEGImages/2008_006873.jpg 500 281 2 213 88 300 165 +8409 /data/VOCdevkit/VOC2012/JPEGImages/2008_006874.jpg 377 500 13 125 210 307 500 14 231 60 356 466 14 29 28 225 483 +8410 /data/VOCdevkit/VOC2012/JPEGImages/2008_006877.jpg 500 377 3 373 202 500 251 +8411 /data/VOCdevkit/VOC2012/JPEGImages/2008_006879.jpg 333 500 13 14 97 249 425 14 118 109 324 304 +8412 /data/VOCdevkit/VOC2012/JPEGImages/2008_006880.jpg 480 360 9 91 92 480 352 14 16 142 292 360 +8413 /data/VOCdevkit/VOC2012/JPEGImages/2008_006881.jpg 500 371 15 36 171 118 357 15 391 202 500 354 14 92 105 206 371 14 211 88 309 371 14 314 113 403 371 +8414 /data/VOCdevkit/VOC2012/JPEGImages/2008_006882.jpg 375 500 2 1 93 306 500 +8415 /data/VOCdevkit/VOC2012/JPEGImages/2008_006885.jpg 500 185 6 68 53 433 154 +8416 /data/VOCdevkit/VOC2012/JPEGImages/2008_006887.jpg 500 375 19 1 132 48 187 +8417 /data/VOCdevkit/VOC2012/JPEGImages/2008_006889.jpg 500 375 13 64 46 495 349 +8418 /data/VOCdevkit/VOC2012/JPEGImages/2008_006890.jpg 500 375 4 294 97 427 363 14 180 37 495 375 +8419 /data/VOCdevkit/VOC2012/JPEGImages/2008_006892.jpg 500 375 16 180 143 377 298 14 167 41 314 252 14 1 86 130 339 +8420 /data/VOCdevkit/VOC2012/JPEGImages/2008_006896.jpg 500 333 0 1 100 497 264 +8421 /data/VOCdevkit/VOC2012/JPEGImages/2008_006898.jpg 500 375 13 1 1 246 89 13 1 1 477 375 +8422 /data/VOCdevkit/VOC2012/JPEGImages/2008_006900.jpg 500 375 18 1 1 486 340 +8423 /data/VOCdevkit/VOC2012/JPEGImages/2008_006902.jpg 500 375 16 195 198 231 223 +8424 /data/VOCdevkit/VOC2012/JPEGImages/2008_006903.jpg 500 375 3 257 1 493 264 3 168 160 266 197 +8425 /data/VOCdevkit/VOC2012/JPEGImages/2008_006904.jpg 500 375 9 161 108 500 324 9 116 153 215 274 9 335 103 500 172 9 46 160 146 226 +8426 /data/VOCdevkit/VOC2012/JPEGImages/2008_006907.jpg 500 375 6 121 210 221 253 6 1 191 89 255 +8427 /data/VOCdevkit/VOC2012/JPEGImages/2008_006908.jpg 500 332 11 45 99 257 297 +8428 /data/VOCdevkit/VOC2012/JPEGImages/2008_006909.jpg 500 375 12 186 44 354 375 +8429 /data/VOCdevkit/VOC2012/JPEGImages/2008_006910.jpg 500 375 7 157 89 286 206 +8430 /data/VOCdevkit/VOC2012/JPEGImages/2008_006912.jpg 500 387 12 90 103 497 355 14 208 23 328 244 +8431 /data/VOCdevkit/VOC2012/JPEGImages/2008_006919.jpg 500 375 18 169 167 461 313 +8432 /data/VOCdevkit/VOC2012/JPEGImages/2008_006920.jpg 500 321 0 65 94 427 181 +8433 /data/VOCdevkit/VOC2012/JPEGImages/2008_006921.jpg 500 375 6 31 104 458 350 +8434 /data/VOCdevkit/VOC2012/JPEGImages/2008_006923.jpg 333 500 2 22 55 279 500 2 180 197 333 475 +8435 /data/VOCdevkit/VOC2012/JPEGImages/2008_006924.jpg 500 333 2 132 89 331 218 +8436 /data/VOCdevkit/VOC2012/JPEGImages/2008_006925.jpg 375 500 3 1 4 169 118 +8437 /data/VOCdevkit/VOC2012/JPEGImages/2008_006926.jpg 375 500 7 55 112 336 398 +8438 /data/VOCdevkit/VOC2012/JPEGImages/2008_006933.jpg 500 375 0 18 29 500 356 14 405 263 450 358 14 448 265 487 360 14 293 264 321 354 14 315 275 333 352 14 284 292 300 340 +8439 /data/VOCdevkit/VOC2012/JPEGImages/2008_006936.jpg 500 375 6 305 316 489 375 +8440 /data/VOCdevkit/VOC2012/JPEGImages/2008_006939.jpg 500 333 16 1 1 500 333 +8441 /data/VOCdevkit/VOC2012/JPEGImages/2008_006941.jpg 500 375 4 167 28 258 250 14 1 35 421 375 +8442 /data/VOCdevkit/VOC2012/JPEGImages/2008_006944.jpg 500 375 14 192 108 291 312 14 229 90 310 216 13 107 138 406 309 +8443 /data/VOCdevkit/VOC2012/JPEGImages/2008_006946.jpg 500 375 19 219 154 319 254 19 315 152 418 246 +8444 /data/VOCdevkit/VOC2012/JPEGImages/2008_006948.jpg 500 375 19 352 109 417 161 +8445 /data/VOCdevkit/VOC2012/JPEGImages/2008_006949.jpg 320 240 3 91 1 287 68 3 54 124 210 175 +8446 /data/VOCdevkit/VOC2012/JPEGImages/2008_006950.jpg 374 500 15 41 125 97 195 15 235 161 268 206 15 197 327 236 371 +8447 /data/VOCdevkit/VOC2012/JPEGImages/2008_006951.jpg 500 333 0 128 102 472 207 +8448 /data/VOCdevkit/VOC2012/JPEGImages/2008_006952.jpg 500 375 4 224 159 243 195 14 137 72 257 206 14 306 185 436 375 14 98 186 267 375 14 404 123 497 318 14 283 73 392 217 14 3 28 162 300 10 199 183 356 364 +8449 /data/VOCdevkit/VOC2012/JPEGImages/2008_006953.jpg 327 500 12 17 169 303 500 14 86 18 244 339 +8450 /data/VOCdevkit/VOC2012/JPEGImages/2008_006954.jpg 500 409 2 1 1 500 196 +8451 /data/VOCdevkit/VOC2012/JPEGImages/2008_006956.jpg 500 375 7 76 75 452 280 +8452 /data/VOCdevkit/VOC2012/JPEGImages/2008_006959.jpg 500 375 6 21 210 124 281 +8453 /data/VOCdevkit/VOC2012/JPEGImages/2008_006960.jpg 500 332 14 356 229 388 298 14 399 229 423 298 14 137 99 388 332 +8454 /data/VOCdevkit/VOC2012/JPEGImages/2008_006961.jpg 500 374 6 9 137 357 374 3 339 1 437 52 3 265 33 341 78 6 265 187 473 321 6 373 204 483 243 3 116 1 500 230 +8455 /data/VOCdevkit/VOC2012/JPEGImages/2008_006962.jpg 500 375 7 2 170 500 375 7 234 68 500 375 +8456 /data/VOCdevkit/VOC2012/JPEGImages/2008_006965.jpg 500 375 11 145 17 251 170 11 410 11 499 149 11 325 113 492 375 11 1 125 135 364 +8457 /data/VOCdevkit/VOC2012/JPEGImages/2008_006967.jpg 500 375 7 266 76 417 345 7 114 42 291 239 +8458 /data/VOCdevkit/VOC2012/JPEGImages/2008_006968.jpg 500 333 11 135 77 349 333 +8459 /data/VOCdevkit/VOC2012/JPEGImages/2008_006969.jpg 500 333 10 78 163 487 333 14 130 129 310 333 14 59 110 156 333 14 4 96 106 310 14 74 82 176 179 14 144 80 200 171 14 201 76 298 194 14 322 99 451 239 14 391 120 500 333 4 368 188 394 273 4 250 149 272 211 +8460 /data/VOCdevkit/VOC2012/JPEGImages/2008_006973.jpg 500 333 7 206 19 500 327 +8461 /data/VOCdevkit/VOC2012/JPEGImages/2008_006979.jpg 500 375 8 335 63 494 235 17 1 66 281 343 14 22 95 234 222 +8462 /data/VOCdevkit/VOC2012/JPEGImages/2008_006980.jpg 500 334 0 316 214 500 306 +8463 /data/VOCdevkit/VOC2012/JPEGImages/2008_006981.jpg 500 375 11 108 79 263 234 +8464 /data/VOCdevkit/VOC2012/JPEGImages/2008_006986.jpg 500 375 6 42 98 447 289 +8465 /data/VOCdevkit/VOC2012/JPEGImages/2008_006987.jpg 500 334 13 158 107 344 246 14 128 87 314 238 +8466 /data/VOCdevkit/VOC2012/JPEGImages/2008_006989.jpg 500 375 6 79 116 180 154 6 295 117 333 143 13 257 162 406 260 14 292 119 374 239 +8467 /data/VOCdevkit/VOC2012/JPEGImages/2008_006991.jpg 332 500 12 79 28 332 500 14 202 1 332 247 +8468 /data/VOCdevkit/VOC2012/JPEGImages/2008_006992.jpg 375 500 4 99 379 146 410 6 315 63 375 116 +8469 /data/VOCdevkit/VOC2012/JPEGImages/2008_006997.jpg 375 500 2 235 214 283 272 2 135 229 153 275 2 8 163 60 201 +8470 /data/VOCdevkit/VOC2012/JPEGImages/2008_006998.jpg 500 333 14 50 1 496 333 +8471 /data/VOCdevkit/VOC2012/JPEGImages/2008_006999.jpg 500 405 7 147 11 420 400 +8472 /data/VOCdevkit/VOC2012/JPEGImages/2008_007003.jpg 500 333 2 99 7 356 321 +8473 /data/VOCdevkit/VOC2012/JPEGImages/2008_007004.jpg 500 380 12 38 43 487 346 +8474 /data/VOCdevkit/VOC2012/JPEGImages/2008_007006.jpg 340 500 8 18 19 335 489 +8475 /data/VOCdevkit/VOC2012/JPEGImages/2008_007009.jpg 500 375 9 63 62 168 172 9 233 135 359 199 +8476 /data/VOCdevkit/VOC2012/JPEGImages/2008_007010.jpg 500 333 19 248 135 363 214 +8477 /data/VOCdevkit/VOC2012/JPEGImages/2008_007011.jpg 500 330 18 22 100 425 260 +8478 /data/VOCdevkit/VOC2012/JPEGImages/2008_007012.jpg 500 333 11 17 36 451 333 +8479 /data/VOCdevkit/VOC2012/JPEGImages/2008_007014.jpg 500 375 9 1 5 485 307 +8480 /data/VOCdevkit/VOC2012/JPEGImages/2008_007019.jpg 500 375 1 159 181 455 375 14 187 82 357 355 +8481 /data/VOCdevkit/VOC2012/JPEGImages/2008_007021.jpg 480 360 11 21 128 137 219 11 302 137 418 265 17 1 66 480 336 +8482 /data/VOCdevkit/VOC2012/JPEGImages/2008_007022.jpg 500 334 2 246 147 293 171 +8483 /data/VOCdevkit/VOC2012/JPEGImages/2008_007025.jpg 500 333 9 212 128 470 305 9 122 107 393 291 +8484 /data/VOCdevkit/VOC2012/JPEGImages/2008_007026.jpg 500 375 9 220 71 487 344 9 98 73 300 279 9 33 89 147 208 +8485 /data/VOCdevkit/VOC2012/JPEGImages/2008_007028.jpg 500 375 11 1 63 441 375 +8486 /data/VOCdevkit/VOC2012/JPEGImages/2008_007030.jpg 500 375 8 12 160 64 279 8 206 107 464 375 +8487 /data/VOCdevkit/VOC2012/JPEGImages/2008_007031.jpg 500 375 9 119 123 374 282 +8488 /data/VOCdevkit/VOC2012/JPEGImages/2008_007032.jpg 375 500 14 120 55 194 272 14 11 228 91 431 14 87 218 180 447 14 74 210 324 500 +8489 /data/VOCdevkit/VOC2012/JPEGImages/2008_007034.jpg 500 303 6 19 24 479 246 +8490 /data/VOCdevkit/VOC2012/JPEGImages/2008_007038.jpg 500 375 14 108 70 430 375 19 373 96 500 254 14 447 53 475 97 +8491 /data/VOCdevkit/VOC2012/JPEGImages/2008_007039.jpg 500 375 7 33 39 462 327 +8492 /data/VOCdevkit/VOC2012/JPEGImages/2008_007042.jpg 375 500 15 1 20 375 500 +8493 /data/VOCdevkit/VOC2012/JPEGImages/2008_007043.jpg 500 375 17 46 163 471 375 14 193 144 291 327 14 267 150 360 314 +8494 /data/VOCdevkit/VOC2012/JPEGImages/2008_007045.jpg 500 333 11 1 37 500 333 +8495 /data/VOCdevkit/VOC2012/JPEGImages/2008_007048.jpg 375 500 8 182 257 269 427 8 178 249 251 395 8 99 257 183 428 10 115 270 259 440 +8496 /data/VOCdevkit/VOC2012/JPEGImages/2008_007050.jpg 500 374 17 134 65 422 226 +8497 /data/VOCdevkit/VOC2012/JPEGImages/2008_007054.jpg 333 500 13 39 72 279 421 +8498 /data/VOCdevkit/VOC2012/JPEGImages/2008_007056.jpg 500 375 14 397 326 415 375 14 381 329 400 375 5 114 264 410 375 3 428 190 500 238 3 71 165 429 214 +8499 /data/VOCdevkit/VOC2012/JPEGImages/2008_007057.jpg 500 375 11 1 5 225 155 11 44 81 193 326 11 219 9 424 200 11 351 1 500 227 11 145 103 345 374 11 262 181 500 313 11 289 253 500 375 +8500 /data/VOCdevkit/VOC2012/JPEGImages/2008_007058.jpg 500 334 14 128 1 498 334 4 165 193 234 334 +8501 /data/VOCdevkit/VOC2012/JPEGImages/2008_007059.jpg 500 375 7 56 1 435 332 +8502 /data/VOCdevkit/VOC2012/JPEGImages/2008_007060.jpg 500 265 6 44 49 467 236 +8503 /data/VOCdevkit/VOC2012/JPEGImages/2008_007061.jpg 500 375 8 120 65 327 320 14 154 69 316 375 +8504 /data/VOCdevkit/VOC2012/JPEGImages/2008_007064.jpg 500 337 6 1 24 494 310 6 407 4 500 125 +8505 /data/VOCdevkit/VOC2012/JPEGImages/2008_007067.jpg 500 375 1 340 240 449 328 14 338 169 461 342 +8506 /data/VOCdevkit/VOC2012/JPEGImages/2008_007069.jpg 500 375 16 411 172 445 195 16 183 186 219 215 16 206 201 260 249 16 321 202 381 258 16 368 217 397 256 16 138 197 164 221 16 404 217 429 247 16 42 213 90 255 16 282 216 308 248 16 240 243 277 266 16 124 239 157 274 16 161 215 208 270 16 422 199 452 250 +8507 /data/VOCdevkit/VOC2012/JPEGImages/2008_007070.jpg 500 288 16 71 122 161 207 16 379 106 433 149 16 448 3 474 46 16 210 161 245 203 16 238 150 276 204 +8508 /data/VOCdevkit/VOC2012/JPEGImages/2008_007073.jpg 500 375 11 205 137 292 295 11 239 36 351 254 +8509 /data/VOCdevkit/VOC2012/JPEGImages/2008_007075.jpg 500 375 13 62 42 430 373 13 79 29 451 217 +8510 /data/VOCdevkit/VOC2012/JPEGImages/2008_007076.jpg 191 500 4 13 11 172 483 +8511 /data/VOCdevkit/VOC2012/JPEGImages/2008_007081.jpg 500 375 11 234 55 477 271 +8512 /data/VOCdevkit/VOC2012/JPEGImages/2008_007082.jpg 333 500 7 54 162 259 456 +8513 /data/VOCdevkit/VOC2012/JPEGImages/2008_007084.jpg 333 500 14 209 160 266 212 14 142 200 180 295 18 1 88 333 500 +8514 /data/VOCdevkit/VOC2012/JPEGImages/2008_007085.jpg 500 492 7 21 106 353 309 8 1 206 500 492 +8515 /data/VOCdevkit/VOC2012/JPEGImages/2008_007086.jpg 500 294 7 155 69 494 285 7 10 16 304 248 +8516 /data/VOCdevkit/VOC2012/JPEGImages/2008_007090.jpg 500 333 13 25 170 156 244 6 6 166 180 228 6 421 157 490 197 6 359 152 423 187 6 326 151 379 183 6 294 156 339 182 14 255 159 281 263 14 198 159 240 276 14 171 146 212 276 +8517 /data/VOCdevkit/VOC2012/JPEGImages/2008_007091.jpg 500 375 14 168 121 288 365 14 97 68 289 356 +8518 /data/VOCdevkit/VOC2012/JPEGImages/2008_007095.jpg 500 317 0 33 229 112 250 +8519 /data/VOCdevkit/VOC2012/JPEGImages/2008_007096.jpg 500 317 0 48 171 468 316 0 416 132 481 152 +8520 /data/VOCdevkit/VOC2012/JPEGImages/2008_007097.jpg 480 360 19 266 72 311 106 8 324 239 442 360 10 209 228 325 360 14 127 180 278 360 14 223 159 391 344 +8521 /data/VOCdevkit/VOC2012/JPEGImages/2008_007098.jpg 500 333 2 65 137 209 212 +8522 /data/VOCdevkit/VOC2012/JPEGImages/2008_007101.jpg 500 375 3 107 1 457 243 14 237 136 283 195 14 203 139 246 191 5 453 17 491 29 +8523 /data/VOCdevkit/VOC2012/JPEGImages/2008_007103.jpg 500 378 1 256 208 399 289 14 277 166 350 288 +8524 /data/VOCdevkit/VOC2012/JPEGImages/2008_007105.jpg 500 332 14 1 123 17 215 18 1 45 472 295 +8525 /data/VOCdevkit/VOC2012/JPEGImages/2008_007106.jpg 500 371 7 1 113 500 371 +8526 /data/VOCdevkit/VOC2012/JPEGImages/2008_007108.jpg 500 363 15 26 135 106 236 15 168 71 234 154 15 241 71 315 127 15 266 28 300 68 15 289 94 355 171 15 338 115 412 201 15 401 155 455 233 11 212 214 351 332 15 236 2 261 61 +8527 /data/VOCdevkit/VOC2012/JPEGImages/2008_007112.jpg 375 500 14 160 184 236 457 14 84 141 179 454 +8528 /data/VOCdevkit/VOC2012/JPEGImages/2008_007114.jpg 375 500 19 45 210 301 484 +8529 /data/VOCdevkit/VOC2012/JPEGImages/2008_007115.jpg 500 333 18 1 1 308 333 +8530 /data/VOCdevkit/VOC2012/JPEGImages/2008_007118.jpg 500 375 11 89 39 389 294 +8531 /data/VOCdevkit/VOC2012/JPEGImages/2008_007119.jpg 500 375 6 1 24 474 375 14 179 54 205 105 14 156 57 178 118 +8532 /data/VOCdevkit/VOC2012/JPEGImages/2008_007120.jpg 500 333 2 253 36 368 327 +8533 /data/VOCdevkit/VOC2012/JPEGImages/2008_007123.jpg 500 375 9 139 154 370 294 +8534 /data/VOCdevkit/VOC2012/JPEGImages/2008_007124.jpg 500 333 2 137 152 246 224 +8535 /data/VOCdevkit/VOC2012/JPEGImages/2008_007129.jpg 500 375 14 213 162 453 375 +8536 /data/VOCdevkit/VOC2012/JPEGImages/2008_007130.jpg 500 357 7 1 1 500 357 +8537 /data/VOCdevkit/VOC2012/JPEGImages/2008_007131.jpg 500 375 11 90 43 348 375 +8538 /data/VOCdevkit/VOC2012/JPEGImages/2008_007133.jpg 366 500 5 1 227 63 322 6 89 288 165 321 6 164 285 217 305 14 31 278 57 353 14 211 281 228 324 14 230 275 250 324 14 248 275 266 324 14 277 261 320 381 +8539 /data/VOCdevkit/VOC2012/JPEGImages/2008_007134.jpg 375 500 4 86 455 130 500 4 146 463 178 500 4 202 465 235 500 4 254 327 310 493 4 78 175 142 357 4 139 172 193 359 4 196 174 250 364 4 258 174 312 361 4 83 321 141 482 4 141 324 195 485 4 80 17 140 221 4 141 14 195 224 4 198 12 253 222 4 259 9 314 221 +8540 /data/VOCdevkit/VOC2012/JPEGImages/2008_007138.jpg 500 375 13 133 1 500 277 14 292 1 443 287 6 1 11 73 52 6 29 1 138 46 14 440 1 500 91 +8541 /data/VOCdevkit/VOC2012/JPEGImages/2008_007142.jpg 375 500 4 85 1 265 485 +8542 /data/VOCdevkit/VOC2012/JPEGImages/2008_007143.jpg 500 375 3 42 156 363 205 3 398 160 466 204 +8543 /data/VOCdevkit/VOC2012/JPEGImages/2008_007145.jpg 500 375 0 1 1 500 274 +8544 /data/VOCdevkit/VOC2012/JPEGImages/2008_007146.jpg 375 500 11 80 172 239 440 14 81 107 366 499 14 1 239 70 349 4 35 193 50 228 4 70 193 82 222 +8545 /data/VOCdevkit/VOC2012/JPEGImages/2008_007147.jpg 375 500 4 62 168 91 252 14 197 105 298 477 14 57 64 205 476 +8546 /data/VOCdevkit/VOC2012/JPEGImages/2008_007151.jpg 500 357 7 81 40 443 298 +8547 /data/VOCdevkit/VOC2012/JPEGImages/2008_007156.jpg 500 358 3 105 137 411 283 +8548 /data/VOCdevkit/VOC2012/JPEGImages/2008_007161.jpg 500 370 0 32 86 468 258 +8549 /data/VOCdevkit/VOC2012/JPEGImages/2008_007163.jpg 375 500 11 168 196 375 442 14 23 38 293 428 +8550 /data/VOCdevkit/VOC2012/JPEGImages/2008_007164.jpg 500 338 7 307 158 367 301 +8551 /data/VOCdevkit/VOC2012/JPEGImages/2008_007165.jpg 500 375 7 182 215 312 325 7 242 95 292 142 7 76 185 234 259 +8552 /data/VOCdevkit/VOC2012/JPEGImages/2008_007166.jpg 500 375 8 437 193 500 291 8 385 201 460 304 10 375 202 500 284 +8553 /data/VOCdevkit/VOC2012/JPEGImages/2008_007167.jpg 500 331 6 206 131 456 248 +8554 /data/VOCdevkit/VOC2012/JPEGImages/2008_007168.jpg 500 375 4 92 212 152 375 4 1 229 36 375 14 303 33 417 310 14 132 101 301 337 +8555 /data/VOCdevkit/VOC2012/JPEGImages/2008_007169.jpg 375 500 11 157 331 329 475 14 36 109 174 373 14 177 122 249 295 17 160 203 375 320 8 1 180 50 263 8 1 314 307 500 +8556 /data/VOCdevkit/VOC2012/JPEGImages/2008_007171.jpg 500 375 6 77 118 363 297 14 2 51 40 118 +8557 /data/VOCdevkit/VOC2012/JPEGImages/2008_007176.jpg 500 375 7 87 82 425 246 +8558 /data/VOCdevkit/VOC2012/JPEGImages/2008_007179.jpg 420 315 1 84 211 148 260 6 332 207 357 235 +8559 /data/VOCdevkit/VOC2012/JPEGImages/2008_007181.jpg 500 375 13 116 193 383 375 6 395 296 478 346 13 50 251 110 302 14 49 229 82 295 14 164 1 381 274 +8560 /data/VOCdevkit/VOC2012/JPEGImages/2008_007182.jpg 500 375 17 1 134 500 375 14 73 145 494 325 +8561 /data/VOCdevkit/VOC2012/JPEGImages/2008_007184.jpg 500 333 13 40 181 114 242 13 203 118 279 193 14 54 135 103 241 14 221 87 262 167 +8562 /data/VOCdevkit/VOC2012/JPEGImages/2008_007185.jpg 500 338 18 131 133 500 274 14 279 149 327 229 14 459 166 500 247 14 383 172 442 246 14 401 168 458 248 +8563 /data/VOCdevkit/VOC2012/JPEGImages/2008_007187.jpg 390 347 7 40 146 374 336 11 15 15 374 217 +8564 /data/VOCdevkit/VOC2012/JPEGImages/2008_007188.jpg 500 333 2 244 134 299 246 +8565 /data/VOCdevkit/VOC2012/JPEGImages/2008_007189.jpg 500 333 18 257 144 364 194 +8566 /data/VOCdevkit/VOC2012/JPEGImages/2008_007190.jpg 328 500 13 96 196 262 456 14 109 99 259 404 +8567 /data/VOCdevkit/VOC2012/JPEGImages/2008_007194.jpg 500 375 8 41 89 171 312 8 209 92 337 318 8 355 88 489 304 +8568 /data/VOCdevkit/VOC2012/JPEGImages/2008_007195.jpg 500 375 0 101 55 500 298 14 196 131 436 375 6 1 288 72 359 +8569 /data/VOCdevkit/VOC2012/JPEGImages/2008_007196.jpg 375 500 19 1 185 180 447 19 203 1 375 179 19 176 133 355 288 +8570 /data/VOCdevkit/VOC2012/JPEGImages/2008_007197.jpg 500 375 6 461 275 500 312 +8571 /data/VOCdevkit/VOC2012/JPEGImages/2008_007201.jpg 500 375 18 97 1 500 375 +8572 /data/VOCdevkit/VOC2012/JPEGImages/2008_007205.jpg 500 375 2 29 149 116 300 2 215 42 484 270 2 133 98 334 297 2 136 180 207 299 +8573 /data/VOCdevkit/VOC2012/JPEGImages/2008_007207.jpg 288 384 14 31 14 211 288 +8574 /data/VOCdevkit/VOC2012/JPEGImages/2008_007208.jpg 375 500 11 127 184 289 305 +8575 /data/VOCdevkit/VOC2012/JPEGImages/2008_007211.jpg 500 375 0 56 84 425 231 +8576 /data/VOCdevkit/VOC2012/JPEGImages/2008_007214.jpg 352 288 6 12 75 307 235 +8577 /data/VOCdevkit/VOC2012/JPEGImages/2008_007216.jpg 375 500 7 86 54 309 315 +8578 /data/VOCdevkit/VOC2012/JPEGImages/2008_007217.jpg 500 375 19 1 63 229 375 +8579 /data/VOCdevkit/VOC2012/JPEGImages/2008_007218.jpg 500 375 17 1 106 500 360 14 1 77 184 375 14 161 77 290 375 14 259 81 359 375 14 323 106 475 375 +8580 /data/VOCdevkit/VOC2012/JPEGImages/2008_007219.jpg 500 375 4 94 77 183 226 14 122 1 500 375 +8581 /data/VOCdevkit/VOC2012/JPEGImages/2008_007221.jpg 500 333 6 470 93 492 106 6 446 93 475 108 6 350 95 411 124 6 304 92 364 115 6 53 90 190 143 6 400 98 459 131 6 439 105 500 153 6 121 105 424 230 +8582 /data/VOCdevkit/VOC2012/JPEGImages/2008_007222.jpg 500 424 14 147 60 293 346 1 126 179 308 418 +8583 /data/VOCdevkit/VOC2012/JPEGImages/2008_007223.jpg 500 375 15 265 193 390 363 8 144 194 297 375 14 141 130 341 375 +8584 /data/VOCdevkit/VOC2012/JPEGImages/2008_007225.jpg 500 375 6 1 317 75 346 14 135 311 147 349 14 183 311 197 356 14 430 315 448 357 14 67 311 85 351 14 202 316 220 359 +8585 /data/VOCdevkit/VOC2012/JPEGImages/2008_007226.jpg 375 500 15 47 180 331 493 +8586 /data/VOCdevkit/VOC2012/JPEGImages/2008_007227.jpg 470 500 6 201 210 262 249 +8587 /data/VOCdevkit/VOC2012/JPEGImages/2008_007229.jpg 500 332 0 10 95 439 239 +8588 /data/VOCdevkit/VOC2012/JPEGImages/2008_007231.jpg 375 500 18 1 259 365 500 +8589 /data/VOCdevkit/VOC2012/JPEGImages/2008_007236.jpg 500 333 11 141 1 392 317 +8590 /data/VOCdevkit/VOC2012/JPEGImages/2008_007237.jpg 500 333 12 228 132 281 218 12 64 154 118 204 14 47 156 65 196 +8591 /data/VOCdevkit/VOC2012/JPEGImages/2008_007239.jpg 426 500 7 39 38 317 415 +8592 /data/VOCdevkit/VOC2012/JPEGImages/2008_007241.jpg 500 375 6 147 1 500 280 13 101 23 376 362 +8593 /data/VOCdevkit/VOC2012/JPEGImages/2008_007242.jpg 500 375 19 81 19 230 112 14 327 94 500 354 14 158 65 364 312 14 1 101 105 375 +8594 /data/VOCdevkit/VOC2012/JPEGImages/2008_007245.jpg 500 400 16 267 84 390 174 +8595 /data/VOCdevkit/VOC2012/JPEGImages/2008_007246.jpg 500 333 19 35 191 149 274 19 242 179 346 264 19 188 161 250 219 19 63 166 130 200 19 128 139 165 172 19 157 152 202 192 19 259 142 294 170 19 306 145 353 180 19 367 150 435 195 19 429 140 473 170 19 443 148 500 189 8 397 182 472 296 +8596 /data/VOCdevkit/VOC2012/JPEGImages/2008_007247.jpg 367 500 18 25 42 339 464 14 339 320 359 408 14 1 319 36 431 +8597 /data/VOCdevkit/VOC2012/JPEGImages/2008_007250.jpg 500 376 2 94 76 240 289 2 289 262 363 376 +8598 /data/VOCdevkit/VOC2012/JPEGImages/2008_007252.jpg 500 375 3 380 197 446 228 +8599 /data/VOCdevkit/VOC2012/JPEGImages/2008_007254.jpg 375 500 14 86 207 281 500 5 4 43 375 471 +8600 /data/VOCdevkit/VOC2012/JPEGImages/2008_007256.jpg 500 375 7 105 1 500 375 +8601 /data/VOCdevkit/VOC2012/JPEGImages/2008_007260.jpg 500 375 7 1 132 500 375 +8602 /data/VOCdevkit/VOC2012/JPEGImages/2008_007261.jpg 500 375 10 1 59 500 375 4 156 92 208 260 +8603 /data/VOCdevkit/VOC2012/JPEGImages/2008_007264.jpg 500 375 13 47 47 454 346 6 196 33 441 156 +8604 /data/VOCdevkit/VOC2012/JPEGImages/2008_007265.jpg 333 500 1 2 76 313 452 +8605 /data/VOCdevkit/VOC2012/JPEGImages/2008_007266.jpg 500 375 2 152 127 374 237 +8606 /data/VOCdevkit/VOC2012/JPEGImages/2008_007269.jpg 500 312 7 26 59 461 280 +8607 /data/VOCdevkit/VOC2012/JPEGImages/2008_007273.jpg 500 375 9 1 114 314 300 9 295 209 379 246 +8608 /data/VOCdevkit/VOC2012/JPEGImages/2008_007274.jpg 500 375 11 1 1 500 375 +8609 /data/VOCdevkit/VOC2012/JPEGImages/2008_007277.jpg 500 333 12 137 127 282 223 14 193 101 220 189 +8610 /data/VOCdevkit/VOC2012/JPEGImages/2008_007279.jpg 500 375 11 127 65 435 353 +8611 /data/VOCdevkit/VOC2012/JPEGImages/2008_007280.jpg 500 400 14 390 156 500 400 18 1 1 408 400 +8612 /data/VOCdevkit/VOC2012/JPEGImages/2008_007281.jpg 500 375 8 298 136 406 278 19 398 145 428 230 14 127 145 342 328 15 356 50 475 138 15 248 69 291 96 +8613 /data/VOCdevkit/VOC2012/JPEGImages/2008_007282.jpg 500 374 17 237 248 407 338 19 64 232 121 280 +8614 /data/VOCdevkit/VOC2012/JPEGImages/2008_007285.jpg 500 333 17 77 110 500 333 14 176 72 364 333 +8615 /data/VOCdevkit/VOC2012/JPEGImages/2008_007286.jpg 500 371 11 127 172 263 371 14 332 1 500 371 4 122 5 166 92 +8616 /data/VOCdevkit/VOC2012/JPEGImages/2008_007287.jpg 500 375 8 127 1 213 134 8 4 204 304 375 8 1 169 150 375 8 247 187 407 375 8 343 164 468 347 8 417 142 482 239 8 282 69 415 187 8 173 93 319 238 8 113 79 231 205 +8617 /data/VOCdevkit/VOC2012/JPEGImages/2008_007289.jpg 500 375 7 75 44 379 291 7 126 1 417 139 +8618 /data/VOCdevkit/VOC2012/JPEGImages/2008_007291.jpg 500 342 10 80 186 312 342 8 293 234 446 342 8 1 196 124 342 14 9 111 139 334 14 149 99 240 193 14 244 92 354 259 14 192 127 437 342 +8619 /data/VOCdevkit/VOC2012/JPEGImages/2008_007293.jpg 375 500 14 27 46 375 500 8 200 276 375 500 +8620 /data/VOCdevkit/VOC2012/JPEGImages/2008_007295.jpg 500 333 11 217 161 254 253 6 47 200 141 249 +8621 /data/VOCdevkit/VOC2012/JPEGImages/2008_007298.jpg 375 500 8 1 379 178 500 +8622 /data/VOCdevkit/VOC2012/JPEGImages/2008_007305.jpg 500 375 3 71 238 208 308 3 93 249 159 266 3 190 264 228 284 +8623 /data/VOCdevkit/VOC2012/JPEGImages/2008_007307.jpg 333 500 8 184 221 333 497 +8624 /data/VOCdevkit/VOC2012/JPEGImages/2008_007311.jpg 500 375 11 58 76 378 375 6 306 1 500 115 +8625 /data/VOCdevkit/VOC2012/JPEGImages/2008_007312.jpg 500 375 11 128 152 400 260 +8626 /data/VOCdevkit/VOC2012/JPEGImages/2008_007313.jpg 500 333 13 66 107 198 252 +8627 /data/VOCdevkit/VOC2012/JPEGImages/2008_007314.jpg 500 375 6 271 303 315 338 6 130 293 211 345 6 216 304 233 320 6 241 304 257 318 +8628 /data/VOCdevkit/VOC2012/JPEGImages/2008_007317.jpg 500 375 2 159 76 392 366 +8629 /data/VOCdevkit/VOC2012/JPEGImages/2008_007319.jpg 500 375 12 102 50 500 375 12 159 133 500 375 +8630 /data/VOCdevkit/VOC2012/JPEGImages/2008_007320.jpg 480 272 11 275 110 430 261 11 35 121 281 244 11 5 8 189 133 +8631 /data/VOCdevkit/VOC2012/JPEGImages/2008_007321.jpg 500 494 11 152 201 278 371 11 272 231 347 381 6 397 87 500 123 6 275 91 366 114 6 85 81 181 118 +8632 /data/VOCdevkit/VOC2012/JPEGImages/2008_007323.jpg 500 172 6 269 141 298 156 +8633 /data/VOCdevkit/VOC2012/JPEGImages/2008_007324.jpg 500 375 7 148 22 294 126 19 128 2 310 188 +8634 /data/VOCdevkit/VOC2012/JPEGImages/2008_007325.jpg 500 375 13 328 123 500 259 13 141 127 323 239 13 57 127 246 269 14 28 103 96 308 14 69 124 181 191 +8635 /data/VOCdevkit/VOC2012/JPEGImages/2008_007327.jpg 375 500 7 116 1 365 466 +8636 /data/VOCdevkit/VOC2012/JPEGImages/2008_007332.jpg 500 375 19 1 51 158 303 +8637 /data/VOCdevkit/VOC2012/JPEGImages/2008_007334.jpg 344 500 16 1 144 170 462 14 106 60 286 458 +8638 /data/VOCdevkit/VOC2012/JPEGImages/2008_007335.jpg 500 375 8 244 203 342 360 8 61 199 167 375 8 81 260 207 375 +8639 /data/VOCdevkit/VOC2012/JPEGImages/2008_007336.jpg 334 500 13 4 202 316 500 14 23 39 247 425 +8640 /data/VOCdevkit/VOC2012/JPEGImages/2008_007339.jpg 320 240 14 93 86 200 235 14 87 1 262 240 8 41 1 275 240 +8641 /data/VOCdevkit/VOC2012/JPEGImages/2008_007343.jpg 500 375 0 152 195 372 266 +8642 /data/VOCdevkit/VOC2012/JPEGImages/2008_007344.jpg 500 375 13 333 132 466 355 11 103 161 176 225 +8643 /data/VOCdevkit/VOC2012/JPEGImages/2008_007346.jpg 500 333 3 208 199 344 212 6 410 117 456 132 6 71 142 109 153 +8644 /data/VOCdevkit/VOC2012/JPEGImages/2008_007348.jpg 500 375 13 264 228 352 297 14 276 190 327 263 14 421 277 471 375 14 465 254 486 321 +8645 /data/VOCdevkit/VOC2012/JPEGImages/2008_007350.jpg 500 274 0 37 141 482 263 +8646 /data/VOCdevkit/VOC2012/JPEGImages/2008_007352.jpg 500 375 5 185 96 317 269 6 14 201 134 235 6 316 194 414 257 +8647 /data/VOCdevkit/VOC2012/JPEGImages/2008_007353.jpg 500 375 7 23 1 475 375 +8648 /data/VOCdevkit/VOC2012/JPEGImages/2008_007356.jpg 500 325 5 27 44 334 280 14 1 180 28 218 +8649 /data/VOCdevkit/VOC2012/JPEGImages/2008_007357.jpg 500 334 0 212 117 341 155 +8650 /data/VOCdevkit/VOC2012/JPEGImages/2008_007358.jpg 375 500 11 81 163 291 413 +8651 /data/VOCdevkit/VOC2012/JPEGImages/2008_007361.jpg 500 375 4 403 262 423 298 8 264 152 362 370 4 209 144 238 209 19 37 50 116 105 +8652 /data/VOCdevkit/VOC2012/JPEGImages/2008_007363.jpg 500 375 7 93 105 349 323 8 1 1 500 375 +8653 /data/VOCdevkit/VOC2012/JPEGImages/2008_007364.jpg 500 375 6 43 62 425 327 15 47 81 78 136 15 292 1 334 29 15 144 1 175 26 +8654 /data/VOCdevkit/VOC2012/JPEGImages/2008_007374.jpg 500 333 0 1 11 484 333 +8655 /data/VOCdevkit/VOC2012/JPEGImages/2008_007375.jpg 500 309 5 135 25 365 281 6 83 191 131 225 14 359 177 382 266 14 381 178 406 269 14 402 178 421 250 14 426 179 454 256 14 446 168 475 269 14 388 178 411 259 +8656 /data/VOCdevkit/VOC2012/JPEGImages/2008_007378.jpg 500 375 11 22 136 359 295 8 296 1 500 201 +8657 /data/VOCdevkit/VOC2012/JPEGImages/2008_007382.jpg 365 486 3 1 110 365 486 +8658 /data/VOCdevkit/VOC2012/JPEGImages/2008_007383.jpg 500 404 18 68 131 285 258 +8659 /data/VOCdevkit/VOC2012/JPEGImages/2008_007384.jpg 500 333 11 1 33 449 333 +8660 /data/VOCdevkit/VOC2012/JPEGImages/2008_007388.jpg 500 375 15 182 24 276 139 15 410 182 462 227 8 182 151 223 212 8 139 233 187 282 8 75 220 130 279 8 251 198 298 250 8 310 240 344 305 8 207 288 265 343 +8661 /data/VOCdevkit/VOC2012/JPEGImages/2008_007389.jpg 500 333 6 82 123 414 240 +8662 /data/VOCdevkit/VOC2012/JPEGImages/2008_007390.jpg 500 375 15 87 196 128 244 15 412 111 443 140 +8663 /data/VOCdevkit/VOC2012/JPEGImages/2008_007392.jpg 500 375 12 158 193 349 361 14 200 118 254 290 +8664 /data/VOCdevkit/VOC2012/JPEGImages/2008_007393.jpg 500 333 14 1 1 390 333 +8665 /data/VOCdevkit/VOC2012/JPEGImages/2008_007394.jpg 187 500 4 6 1 186 500 +8666 /data/VOCdevkit/VOC2012/JPEGImages/2008_007397.jpg 500 333 0 95 110 334 235 +8667 /data/VOCdevkit/VOC2012/JPEGImages/2008_007398.jpg 500 375 9 71 169 205 341 9 18 185 76 304 +8668 /data/VOCdevkit/VOC2012/JPEGImages/2008_007402.jpg 333 500 10 188 272 333 500 14 73 54 242 500 8 18 164 79 292 8 1 193 40 327 10 1 173 68 300 8 8 152 56 258 +8669 /data/VOCdevkit/VOC2012/JPEGImages/2008_007403.jpg 313 417 7 62 29 264 406 +8670 /data/VOCdevkit/VOC2012/JPEGImages/2008_007404.jpg 400 300 7 34 137 178 284 7 172 161 367 276 7 143 66 329 266 +8671 /data/VOCdevkit/VOC2012/JPEGImages/2008_007409.jpg 500 333 0 150 112 326 201 6 422 161 500 259 14 368 173 384 205 14 56 164 77 226 14 21 172 42 228 14 107 173 131 218 13 97 192 151 223 +8672 /data/VOCdevkit/VOC2012/JPEGImages/2008_007410.jpg 500 375 1 100 191 347 346 14 230 90 315 333 +8673 /data/VOCdevkit/VOC2012/JPEGImages/2008_007415.jpg 375 500 8 109 110 300 418 +8674 /data/VOCdevkit/VOC2012/JPEGImages/2008_007417.jpg 500 333 11 102 118 146 206 +8675 /data/VOCdevkit/VOC2012/JPEGImages/2008_007421.jpg 261 400 14 44 64 167 248 1 41 147 213 293 +8676 /data/VOCdevkit/VOC2012/JPEGImages/2008_007423.jpg 500 470 2 291 155 403 414 +8677 /data/VOCdevkit/VOC2012/JPEGImages/2008_007424.jpg 500 333 12 162 35 500 333 +8678 /data/VOCdevkit/VOC2012/JPEGImages/2008_007425.jpg 500 227 3 389 78 452 197 3 172 67 245 205 3 29 105 73 211 +8679 /data/VOCdevkit/VOC2012/JPEGImages/2008_007428.jpg 500 375 13 263 265 304 310 15 324 272 380 320 +8680 /data/VOCdevkit/VOC2012/JPEGImages/2008_007430.jpg 500 449 16 1 1 500 449 +8681 /data/VOCdevkit/VOC2012/JPEGImages/2008_007431.jpg 500 375 14 389 176 404 222 6 119 173 253 232 6 288 176 343 207 +8682 /data/VOCdevkit/VOC2012/JPEGImages/2008_007432.jpg 480 360 6 252 227 311 271 +8683 /data/VOCdevkit/VOC2012/JPEGImages/2008_007433.jpg 324 432 11 74 250 206 346 +8684 /data/VOCdevkit/VOC2012/JPEGImages/2008_007434.jpg 500 338 2 155 72 423 321 2 240 1 500 157 +8685 /data/VOCdevkit/VOC2012/JPEGImages/2008_007435.jpg 500 375 14 180 154 265 351 14 244 173 308 375 14 299 160 376 375 14 253 126 330 219 +8686 /data/VOCdevkit/VOC2012/JPEGImages/2008_007438.jpg 500 375 8 125 237 232 375 8 231 234 343 375 8 359 207 403 294 8 1 227 90 375 10 36 228 387 375 +8687 /data/VOCdevkit/VOC2012/JPEGImages/2008_007441.jpg 500 375 3 15 122 484 248 +8688 /data/VOCdevkit/VOC2012/JPEGImages/2008_007442.jpg 500 333 0 57 166 165 205 0 265 165 373 200 +8689 /data/VOCdevkit/VOC2012/JPEGImages/2008_007443.jpg 500 375 13 415 199 449 258 13 340 191 396 265 14 270 173 333 295 14 121 171 154 271 14 146 169 172 222 14 167 174 194 220 14 188 178 202 219 14 235 173 258 219 14 255 169 284 214 13 207 201 293 294 13 127 206 219 315 13 61 206 119 316 14 204 170 237 261 +8690 /data/VOCdevkit/VOC2012/JPEGImages/2008_007444.jpg 500 375 12 83 20 409 358 12 1 1 166 320 +8691 /data/VOCdevkit/VOC2012/JPEGImages/2008_007446.jpg 500 375 19 175 91 344 280 19 1 118 187 375 14 340 11 500 375 +8692 /data/VOCdevkit/VOC2012/JPEGImages/2008_007448.jpg 500 333 6 172 233 191 248 +8693 /data/VOCdevkit/VOC2012/JPEGImages/2008_007452.jpg 375 500 8 33 34 346 492 14 32 29 309 500 +8694 /data/VOCdevkit/VOC2012/JPEGImages/2008_007455.jpg 500 375 11 1 1 500 263 +8695 /data/VOCdevkit/VOC2012/JPEGImages/2008_007456.jpg 500 375 6 117 261 392 375 6 140 241 294 315 6 3 250 93 330 6 1 261 38 360 +8696 /data/VOCdevkit/VOC2012/JPEGImages/2008_007458.jpg 500 333 0 169 90 246 181 +8697 /data/VOCdevkit/VOC2012/JPEGImages/2008_007459.jpg 500 457 13 1 84 487 457 14 78 46 215 234 14 169 58 335 233 +8698 /data/VOCdevkit/VOC2012/JPEGImages/2008_007461.jpg 500 348 11 24 28 481 275 15 22 7 123 62 15 115 9 154 51 +8699 /data/VOCdevkit/VOC2012/JPEGImages/2008_007465.jpg 500 371 2 59 78 393 313 +8700 /data/VOCdevkit/VOC2012/JPEGImages/2008_007466.jpg 500 333 6 75 165 410 290 +8701 /data/VOCdevkit/VOC2012/JPEGImages/2008_007469.jpg 400 496 7 211 283 254 337 7 153 320 201 383 +8702 /data/VOCdevkit/VOC2012/JPEGImages/2008_007470.jpg 382 500 1 229 104 371 237 14 211 70 324 206 +8703 /data/VOCdevkit/VOC2012/JPEGImages/2008_007471.jpg 500 375 11 1 7 365 338 +8704 /data/VOCdevkit/VOC2012/JPEGImages/2008_007472.jpg 500 333 7 108 19 500 330 +8705 /data/VOCdevkit/VOC2012/JPEGImages/2008_007473.jpg 500 326 4 156 108 172 164 4 174 103 189 163 4 195 110 209 163 +8706 /data/VOCdevkit/VOC2012/JPEGImages/2008_007476.jpg 500 375 19 1 177 119 319 14 221 60 500 362 +8707 /data/VOCdevkit/VOC2012/JPEGImages/2008_007477.jpg 500 375 2 149 203 222 244 +8708 /data/VOCdevkit/VOC2012/JPEGImages/2008_007478.jpg 500 333 11 97 171 174 285 14 332 1 485 284 14 132 1 210 152 14 183 20 219 152 6 348 63 393 120 +8709 /data/VOCdevkit/VOC2012/JPEGImages/2008_007480.jpg 500 332 0 1 13 485 317 6 256 269 364 332 +8710 /data/VOCdevkit/VOC2012/JPEGImages/2008_007485.jpg 500 333 14 156 16 265 255 13 164 105 331 289 +8711 /data/VOCdevkit/VOC2012/JPEGImages/2008_007486.jpg 500 375 11 199 94 500 375 2 1 177 200 338 +8712 /data/VOCdevkit/VOC2012/JPEGImages/2008_007488.jpg 500 375 5 43 60 419 298 13 143 228 226 300 14 165 209 197 281 6 1 234 50 286 6 446 230 500 258 6 417 239 451 292 +8713 /data/VOCdevkit/VOC2012/JPEGImages/2008_007491.jpg 500 375 11 1 95 324 319 +8714 /data/VOCdevkit/VOC2012/JPEGImages/2008_007494.jpg 500 489 7 315 192 500 489 11 1 9 323 489 +8715 /data/VOCdevkit/VOC2012/JPEGImages/2008_007496.jpg 500 307 7 25 14 467 292 +8716 /data/VOCdevkit/VOC2012/JPEGImages/2008_007497.jpg 500 375 16 172 166 300 260 +8717 /data/VOCdevkit/VOC2012/JPEGImages/2008_007498.jpg 500 375 2 208 111 491 360 +8718 /data/VOCdevkit/VOC2012/JPEGImages/2008_007500.jpg 500 333 6 351 220 411 276 6 274 212 299 234 6 237 210 264 229 6 194 222 207 235 +8719 /data/VOCdevkit/VOC2012/JPEGImages/2008_007501.jpg 375 500 2 66 31 336 424 +8720 /data/VOCdevkit/VOC2012/JPEGImages/2008_007504.jpg 500 357 0 15 110 500 264 +8721 /data/VOCdevkit/VOC2012/JPEGImages/2008_007507.jpg 266 400 0 163 219 206 276 +8722 /data/VOCdevkit/VOC2012/JPEGImages/2008_007509.jpg 500 375 14 179 1 500 375 11 1 1 186 317 +8723 /data/VOCdevkit/VOC2012/JPEGImages/2008_007510.jpg 500 375 14 93 163 141 307 14 25 166 74 301 14 2 181 32 274 1 84 233 139 332 1 27 229 73 317 1 1 232 40 305 +8724 /data/VOCdevkit/VOC2012/JPEGImages/2008_007511.jpg 500 291 17 15 17 489 268 +8725 /data/VOCdevkit/VOC2012/JPEGImages/2008_007513.jpg 500 375 11 78 121 465 315 +8726 /data/VOCdevkit/VOC2012/JPEGImages/2008_007514.jpg 275 500 12 74 153 151 384 14 135 153 218 392 14 48 86 154 278 +8727 /data/VOCdevkit/VOC2012/JPEGImages/2008_007515.jpg 375 500 5 26 1 338 500 +8728 /data/VOCdevkit/VOC2012/JPEGImages/2008_007519.jpg 335 500 11 93 89 227 415 +8729 /data/VOCdevkit/VOC2012/JPEGImages/2008_007521.jpg 500 333 18 136 149 227 238 +8730 /data/VOCdevkit/VOC2012/JPEGImages/2008_007524.jpg 500 375 12 1 95 147 320 12 161 104 368 332 14 405 98 500 375 14 350 7 500 126 +8731 /data/VOCdevkit/VOC2012/JPEGImages/2008_007525.jpg 500 375 14 340 224 370 314 14 308 219 345 312 14 261 207 298 310 14 236 219 264 305 14 51 221 74 268 14 1 224 28 298 15 373 122 500 375 +8732 /data/VOCdevkit/VOC2012/JPEGImages/2008_007527.jpg 500 375 19 177 123 293 226 8 82 219 289 375 +8733 /data/VOCdevkit/VOC2012/JPEGImages/2008_007528.jpg 375 500 4 174 360 208 434 4 144 309 190 336 4 189 293 220 335 4 180 318 222 366 6 157 1 223 50 4 196 281 257 307 +8734 /data/VOCdevkit/VOC2012/JPEGImages/2008_007529.jpg 280 210 6 21 28 280 210 +8735 /data/VOCdevkit/VOC2012/JPEGImages/2008_007531.jpg 500 375 12 233 251 301 289 12 192 249 238 288 12 152 250 215 291 12 65 249 130 291 12 1 248 49 291 12 11 250 58 289 +8736 /data/VOCdevkit/VOC2012/JPEGImages/2008_007533.jpg 500 375 0 1 117 444 278 +8737 /data/VOCdevkit/VOC2012/JPEGImages/2008_007534.jpg 500 375 11 27 182 68 245 6 454 42 500 78 +8738 /data/VOCdevkit/VOC2012/JPEGImages/2008_007536.jpg 360 480 19 31 35 345 329 +8739 /data/VOCdevkit/VOC2012/JPEGImages/2008_007537.jpg 500 375 11 101 195 177 249 14 286 85 385 251 +8740 /data/VOCdevkit/VOC2012/JPEGImages/2008_007538.jpg 500 375 11 110 69 429 375 +8741 /data/VOCdevkit/VOC2012/JPEGImages/2008_007544.jpg 374 500 9 72 251 124 333 9 159 243 199 300 +8742 /data/VOCdevkit/VOC2012/JPEGImages/2008_007546.jpg 375 500 2 132 93 206 249 +8743 /data/VOCdevkit/VOC2012/JPEGImages/2008_007548.jpg 500 375 7 45 139 345 373 +8744 /data/VOCdevkit/VOC2012/JPEGImages/2008_007556.jpg 500 375 14 328 226 358 320 14 171 236 204 320 +8745 /data/VOCdevkit/VOC2012/JPEGImages/2008_007558.jpg 500 375 13 80 11 413 369 6 1 1 169 254 +8746 /data/VOCdevkit/VOC2012/JPEGImages/2008_007559.jpg 500 333 11 41 83 349 254 +8747 /data/VOCdevkit/VOC2012/JPEGImages/2008_007561.jpg 500 375 19 274 35 381 152 8 183 228 379 375 +8748 /data/VOCdevkit/VOC2012/JPEGImages/2008_007565.jpg 375 500 13 1 203 318 500 14 86 102 254 500 14 170 119 275 462 +8749 /data/VOCdevkit/VOC2012/JPEGImages/2008_007567.jpg 500 375 11 389 223 500 370 19 223 16 388 152 14 136 44 500 337 14 34 98 231 351 +8750 /data/VOCdevkit/VOC2012/JPEGImages/2008_007573.jpg 500 375 6 173 1 500 375 +8751 /data/VOCdevkit/VOC2012/JPEGImages/2008_007574.jpg 500 375 3 71 176 108 249 3 190 24 288 317 +8752 /data/VOCdevkit/VOC2012/JPEGImages/2008_007576.jpg 333 500 12 12 209 306 491 14 79 146 177 401 +8753 /data/VOCdevkit/VOC2012/JPEGImages/2008_007579.jpg 500 375 0 51 64 500 284 +8754 /data/VOCdevkit/VOC2012/JPEGImages/2008_007581.jpg 500 375 11 1 1 494 294 +8755 /data/VOCdevkit/VOC2012/JPEGImages/2008_007583.jpg 500 316 11 173 46 461 316 +8756 /data/VOCdevkit/VOC2012/JPEGImages/2008_007584.jpg 500 375 14 100 74 219 306 14 178 118 275 375 14 250 142 320 375 14 336 114 398 271 14 297 92 404 353 +8757 /data/VOCdevkit/VOC2012/JPEGImages/2008_007585.jpg 500 375 4 75 153 102 236 4 2 225 37 328 14 54 34 474 375 14 72 81 279 362 +8758 /data/VOCdevkit/VOC2012/JPEGImages/2008_007586.jpg 500 375 9 88 77 297 298 14 276 78 441 375 +8759 /data/VOCdevkit/VOC2012/JPEGImages/2008_007587.jpg 456 500 2 40 108 417 335 +8760 /data/VOCdevkit/VOC2012/JPEGImages/2008_007588.jpg 375 500 12 277 68 331 112 12 158 79 189 110 12 77 76 124 117 12 113 93 360 480 +8761 /data/VOCdevkit/VOC2012/JPEGImages/2008_007589.jpg 288 162 7 131 28 189 134 +8762 /data/VOCdevkit/VOC2012/JPEGImages/2008_007591.jpg 500 375 4 446 1 489 86 4 413 1 447 81 4 378 1 416 79 4 346 1 379 82 4 312 1 348 78 4 290 1 321 78 4 271 1 291 76 4 156 14 167 52 14 78 1 118 54 14 166 1 190 50 +8763 /data/VOCdevkit/VOC2012/JPEGImages/2008_007593.jpg 375 500 2 65 112 181 394 14 167 29 241 262 14 227 33 321 262 +8764 /data/VOCdevkit/VOC2012/JPEGImages/2008_007594.jpg 500 375 2 87 187 183 334 2 386 143 450 260 +8765 /data/VOCdevkit/VOC2012/JPEGImages/2008_007595.jpg 375 500 6 240 250 329 382 6 270 237 375 411 6 93 333 127 360 +8766 /data/VOCdevkit/VOC2012/JPEGImages/2008_007596.jpg 500 333 9 166 136 307 215 +8767 /data/VOCdevkit/VOC2012/JPEGImages/2008_007597.jpg 369 500 3 72 325 297 358 3 78 401 357 452 3 238 377 288 394 3 196 214 268 232 +8768 /data/VOCdevkit/VOC2012/JPEGImages/2008_007599.jpg 500 375 3 46 90 424 279 +8769 /data/VOCdevkit/VOC2012/JPEGImages/2008_007604.jpg 333 500 0 1 25 333 494 +8770 /data/VOCdevkit/VOC2012/JPEGImages/2008_007608.jpg 500 375 2 154 72 369 301 2 334 85 441 291 2 38 93 171 252 2 109 61 334 188 2 160 78 205 109 2 414 86 500 211 2 258 58 365 218 +8771 /data/VOCdevkit/VOC2012/JPEGImages/2008_007610.jpg 500 338 7 83 61 360 338 7 234 162 402 278 +8772 /data/VOCdevkit/VOC2012/JPEGImages/2008_007611.jpg 500 375 6 3 84 485 280 +8773 /data/VOCdevkit/VOC2012/JPEGImages/2008_007612.jpg 333 500 12 141 220 333 433 14 185 188 278 346 +8774 /data/VOCdevkit/VOC2012/JPEGImages/2008_007613.jpg 500 374 7 212 128 264 203 +8775 /data/VOCdevkit/VOC2012/JPEGImages/2008_007617.jpg 500 375 14 271 126 460 300 14 238 121 365 263 14 23 146 188 375 8 1 235 49 375 +8776 /data/VOCdevkit/VOC2012/JPEGImages/2008_007618.jpg 500 333 0 65 91 437 206 +8777 /data/VOCdevkit/VOC2012/JPEGImages/2008_007621.jpg 500 375 15 256 1 500 277 11 1 96 327 334 +8778 /data/VOCdevkit/VOC2012/JPEGImages/2008_007623.jpg 500 375 2 71 141 451 300 +8779 /data/VOCdevkit/VOC2012/JPEGImages/2008_007625.jpg 333 500 12 1 122 257 492 14 13 37 111 359 +8780 /data/VOCdevkit/VOC2012/JPEGImages/2008_007629.jpg 500 333 0 183 150 348 198 0 1 214 421 302 +8781 /data/VOCdevkit/VOC2012/JPEGImages/2008_007630.jpg 346 286 7 45 71 346 278 +8782 /data/VOCdevkit/VOC2012/JPEGImages/2008_007632.jpg 264 440 7 7 10 230 434 +8783 /data/VOCdevkit/VOC2012/JPEGImages/2008_007635.jpg 500 375 5 1 1 500 361 +8784 /data/VOCdevkit/VOC2012/JPEGImages/2008_007640.jpg 500 375 7 90 85 500 366 +8785 /data/VOCdevkit/VOC2012/JPEGImages/2008_007641.jpg 375 500 5 1 40 375 426 +8786 /data/VOCdevkit/VOC2012/JPEGImages/2008_007643.jpg 375 500 3 1 349 375 498 3 45 294 375 397 3 79 201 375 297 3 114 69 255 112 3 125 89 209 117 3 268 122 375 175 14 151 175 176 242 14 197 268 243 371 14 67 254 130 365 3 118 119 175 159 3 1 95 57 149 14 267 180 293 242 +8787 /data/VOCdevkit/VOC2012/JPEGImages/2008_007646.jpg 500 375 13 122 101 385 368 14 220 11 349 299 +8788 /data/VOCdevkit/VOC2012/JPEGImages/2008_007648.jpg 500 375 18 1 52 405 297 14 409 153 438 189 +8789 /data/VOCdevkit/VOC2012/JPEGImages/2008_007649.jpg 500 374 11 104 55 451 303 +8790 /data/VOCdevkit/VOC2012/JPEGImages/2008_007653.jpg 500 375 3 164 1 393 254 14 311 193 341 230 +8791 /data/VOCdevkit/VOC2012/JPEGImages/2008_007656.jpg 500 375 2 1 52 377 285 +8792 /data/VOCdevkit/VOC2012/JPEGImages/2008_007660.jpg 500 333 14 276 102 318 156 6 388 145 500 247 +8793 /data/VOCdevkit/VOC2012/JPEGImages/2008_007661.jpg 500 333 2 235 149 264 181 +8794 /data/VOCdevkit/VOC2012/JPEGImages/2008_007662.jpg 500 355 7 192 78 334 297 +8795 /data/VOCdevkit/VOC2012/JPEGImages/2008_007664.jpg 500 341 11 172 181 264 314 4 394 202 494 338 +8796 /data/VOCdevkit/VOC2012/JPEGImages/2008_007665.jpg 500 375 11 194 229 270 347 14 43 1 433 375 +8797 /data/VOCdevkit/VOC2012/JPEGImages/2008_007666.jpg 500 375 9 243 231 378 311 9 358 211 401 304 9 220 210 349 290 9 58 224 149 304 9 143 242 245 313 +8798 /data/VOCdevkit/VOC2012/JPEGImages/2008_007668.jpg 500 375 11 196 70 415 272 +8799 /data/VOCdevkit/VOC2012/JPEGImages/2008_007669.jpg 500 375 2 121 62 398 307 +8800 /data/VOCdevkit/VOC2012/JPEGImages/2008_007673.jpg 500 375 2 197 63 301 153 +8801 /data/VOCdevkit/VOC2012/JPEGImages/2008_007675.jpg 500 332 14 139 20 390 288 +8802 /data/VOCdevkit/VOC2012/JPEGImages/2008_007676.jpg 500 334 14 217 46 268 163 14 316 104 460 239 14 276 113 485 286 14 238 104 333 270 14 163 91 248 288 14 6 117 196 334 14 1 55 179 295 +8803 /data/VOCdevkit/VOC2012/JPEGImages/2008_007677.jpg 500 375 16 49 83 379 233 16 242 159 437 329 +8804 /data/VOCdevkit/VOC2012/JPEGImages/2008_007682.jpg 500 375 17 1 123 384 375 14 101 107 309 375 +8805 /data/VOCdevkit/VOC2012/JPEGImages/2008_007683.jpg 476 500 7 63 160 379 448 +8806 /data/VOCdevkit/VOC2012/JPEGImages/2008_007685.jpg 500 375 19 1 141 112 375 19 154 272 244 363 8 238 294 391 375 +8807 /data/VOCdevkit/VOC2012/JPEGImages/2008_007688.jpg 500 470 2 152 168 240 272 +8808 /data/VOCdevkit/VOC2012/JPEGImages/2008_007690.jpg 333 500 0 96 35 231 87 +8809 /data/VOCdevkit/VOC2012/JPEGImages/2008_007691.jpg 375 500 8 35 1 375 500 +8810 /data/VOCdevkit/VOC2012/JPEGImages/2008_007692.jpg 500 375 8 375 234 489 375 8 323 191 388 324 8 327 222 395 350 8 380 239 500 375 10 332 202 479 350 10 63 269 303 375 14 213 160 354 375 14 203 69 267 220 +8811 /data/VOCdevkit/VOC2012/JPEGImages/2008_007693.jpg 500 375 16 85 188 230 305 16 268 170 408 291 16 442 196 500 263 +8812 /data/VOCdevkit/VOC2012/JPEGImages/2008_007694.jpg 500 375 11 101 75 398 366 +8813 /data/VOCdevkit/VOC2012/JPEGImages/2008_007696.jpg 500 375 19 314 98 424 193 4 386 229 407 296 14 238 81 397 375 14 172 158 265 366 14 1 22 286 375 +8814 /data/VOCdevkit/VOC2012/JPEGImages/2008_007697.jpg 375 500 4 84 352 136 475 +8815 /data/VOCdevkit/VOC2012/JPEGImages/2008_007698.jpg 500 375 6 189 318 305 367 6 1 326 112 364 6 135 324 193 361 +8816 /data/VOCdevkit/VOC2012/JPEGImages/2008_007701.jpg 375 500 15 129 247 178 344 15 179 279 213 329 15 211 304 244 345 15 244 296 281 335 15 325 229 351 254 15 302 190 333 240 15 280 285 312 332 15 312 304 342 343 15 337 297 372 341 15 25 200 53 242 14 57 243 132 461 15 275 250 319 285 15 1 316 33 432 +8817 /data/VOCdevkit/VOC2012/JPEGImages/2008_007702.jpg 376 500 7 1 88 251 409 +8818 /data/VOCdevkit/VOC2012/JPEGImages/2008_007704.jpg 500 333 4 276 30 322 167 8 150 1 366 142 8 357 1 500 149 +8819 /data/VOCdevkit/VOC2012/JPEGImages/2008_007706.jpg 500 375 8 1 56 500 375 14 31 68 383 375 +8820 /data/VOCdevkit/VOC2012/JPEGImages/2008_007709.jpg 500 471 2 61 156 388 424 +8821 /data/VOCdevkit/VOC2012/JPEGImages/2008_007710.jpg 375 500 11 1 160 166 483 11 172 130 333 263 14 132 26 334 445 +8822 /data/VOCdevkit/VOC2012/JPEGImages/2008_007714.jpg 500 375 2 216 47 251 85 2 227 94 276 125 2 219 207 243 241 2 272 211 298 242 2 272 287 297 327 +8823 /data/VOCdevkit/VOC2012/JPEGImages/2008_007716.jpg 500 375 14 298 32 426 367 14 160 47 307 336 13 65 121 290 368 6 1 1 193 266 +8824 /data/VOCdevkit/VOC2012/JPEGImages/2008_007717.jpg 500 333 4 251 168 264 212 14 171 99 231 181 14 112 98 208 219 14 44 134 174 333 14 299 120 445 333 14 296 100 368 214 14 284 88 334 189 10 146 169 358 333 +8825 /data/VOCdevkit/VOC2012/JPEGImages/2008_007719.jpg 500 333 1 1 3 500 333 1 419 33 469 64 1 432 33 482 64 +8826 /data/VOCdevkit/VOC2012/JPEGImages/2008_007724.jpg 500 375 4 457 1 500 108 4 424 1 467 75 4 386 1 437 72 +8827 /data/VOCdevkit/VOC2012/JPEGImages/2008_007726.jpg 500 332 7 66 54 481 316 +8828 /data/VOCdevkit/VOC2012/JPEGImages/2008_007729.jpg 500 375 9 184 150 354 285 14 80 130 152 263 14 1 102 108 263 14 353 23 481 230 +8829 /data/VOCdevkit/VOC2012/JPEGImages/2008_007730.jpg 500 375 2 78 145 253 263 +8830 /data/VOCdevkit/VOC2012/JPEGImages/2008_007733.jpg 500 375 17 66 143 500 372 +8831 /data/VOCdevkit/VOC2012/JPEGImages/2008_007735.jpg 500 375 11 84 83 450 285 +8832 /data/VOCdevkit/VOC2012/JPEGImages/2008_007736.jpg 500 375 7 42 81 455 262 +8833 /data/VOCdevkit/VOC2012/JPEGImages/2008_007737.jpg 342 500 4 154 185 202 328 4 96 211 131 308 14 72 12 258 500 8 245 339 342 500 +8834 /data/VOCdevkit/VOC2012/JPEGImages/2008_007738.jpg 500 333 0 13 103 421 257 +8835 /data/VOCdevkit/VOC2012/JPEGImages/2008_007739.jpg 500 375 13 82 10 429 361 6 266 7 500 243 +8836 /data/VOCdevkit/VOC2012/JPEGImages/2008_007741.jpg 500 375 8 35 277 111 375 14 94 97 342 375 +8837 /data/VOCdevkit/VOC2012/JPEGImages/2008_007742.jpg 500 374 8 263 158 399 374 14 1 43 148 374 14 334 58 500 374 +8838 /data/VOCdevkit/VOC2012/JPEGImages/2008_007745.jpg 500 375 11 132 243 193 282 11 28 221 71 257 11 130 223 170 249 14 458 199 486 259 14 193 187 224 257 14 53 187 114 279 +8839 /data/VOCdevkit/VOC2012/JPEGImages/2008_007746.jpg 500 375 13 236 90 500 305 13 105 93 276 262 13 67 104 159 229 13 8 95 102 211 14 126 72 151 102 14 73 63 106 119 14 35 74 68 118 +8840 /data/VOCdevkit/VOC2012/JPEGImages/2008_007748.jpg 500 377 3 191 201 250 222 +8841 /data/VOCdevkit/VOC2012/JPEGImages/2008_007749.jpg 333 500 18 1 157 333 500 +8842 /data/VOCdevkit/VOC2012/JPEGImages/2008_007750.jpg 500 333 3 1 1 487 333 3 292 104 431 187 +8843 /data/VOCdevkit/VOC2012/JPEGImages/2008_007752.jpg 500 424 2 91 83 437 403 +8844 /data/VOCdevkit/VOC2012/JPEGImages/2008_007755.jpg 500 344 3 100 79 223 263 3 310 102 372 254 3 38 109 103 255 +8845 /data/VOCdevkit/VOC2012/JPEGImages/2008_007757.jpg 500 333 14 233 1 388 333 6 16 72 422 333 +8846 /data/VOCdevkit/VOC2012/JPEGImages/2008_007758.jpg 500 375 0 46 145 220 205 0 264 136 465 206 +8847 /data/VOCdevkit/VOC2012/JPEGImages/2008_007759.jpg 500 375 18 161 165 355 233 14 466 225 499 301 +8848 /data/VOCdevkit/VOC2012/JPEGImages/2008_007760.jpg 500 374 18 1 7 500 324 +8849 /data/VOCdevkit/VOC2012/JPEGImages/2008_007761.jpg 500 375 14 238 62 336 247 14 1 37 41 90 1 1 79 62 134 1 255 143 317 324 +8850 /data/VOCdevkit/VOC2012/JPEGImages/2008_007764.jpg 500 333 0 155 99 373 197 +8851 /data/VOCdevkit/VOC2012/JPEGImages/2008_007766.jpg 375 500 1 164 192 322 442 14 166 66 327 359 +8852 /data/VOCdevkit/VOC2012/JPEGImages/2008_007768.jpg 338 500 14 79 93 304 500 14 130 220 234 322 8 38 125 285 461 +8853 /data/VOCdevkit/VOC2012/JPEGImages/2008_007770.jpg 500 334 14 118 148 166 304 11 137 253 189 292 +8854 /data/VOCdevkit/VOC2012/JPEGImages/2008_007777.jpg 500 333 7 15 1 500 333 +8855 /data/VOCdevkit/VOC2012/JPEGImages/2008_007779.jpg 500 375 18 80 141 500 258 +8856 /data/VOCdevkit/VOC2012/JPEGImages/2008_007780.jpg 500 375 8 86 200 196 343 8 350 193 458 329 +8857 /data/VOCdevkit/VOC2012/JPEGImages/2008_007781.jpg 375 500 11 45 139 316 473 +8858 /data/VOCdevkit/VOC2012/JPEGImages/2008_007786.jpg 500 375 6 349 258 500 326 6 450 298 500 342 6 234 276 369 330 6 1 258 336 375 +8859 /data/VOCdevkit/VOC2012/JPEGImages/2008_007787.jpg 500 331 18 1 1 500 331 14 180 106 242 328 14 232 60 339 249 +8860 /data/VOCdevkit/VOC2012/JPEGImages/2008_007788.jpg 500 375 2 1 34 372 375 +8861 /data/VOCdevkit/VOC2012/JPEGImages/2008_007789.jpg 375 500 14 160 92 184 139 14 197 91 217 140 +8862 /data/VOCdevkit/VOC2012/JPEGImages/2008_007791.jpg 500 375 6 41 134 237 235 6 227 142 453 236 +8863 /data/VOCdevkit/VOC2012/JPEGImages/2008_007793.jpg 500 396 6 31 194 497 350 14 266 217 321 249 +8864 /data/VOCdevkit/VOC2012/JPEGImages/2008_007794.jpg 333 500 7 1 183 333 343 +8865 /data/VOCdevkit/VOC2012/JPEGImages/2008_007797.jpg 375 500 5 58 108 375 413 +8866 /data/VOCdevkit/VOC2012/JPEGImages/2008_007798.jpg 375 500 19 96 41 288 218 15 255 95 321 234 +8867 /data/VOCdevkit/VOC2012/JPEGImages/2008_007804.jpg 500 362 6 152 219 500 362 6 188 198 292 240 6 160 201 195 229 5 86 181 138 217 6 293 200 318 213 6 271 200 295 212 6 317 201 336 214 6 137 199 149 212 6 69 193 88 215 6 216 187 271 206 +8868 /data/VOCdevkit/VOC2012/JPEGImages/2008_007805.jpg 500 375 11 117 3 379 375 +8869 /data/VOCdevkit/VOC2012/JPEGImages/2008_007806.jpg 235 290 16 19 43 152 276 16 193 60 235 122 +8870 /data/VOCdevkit/VOC2012/JPEGImages/2008_007811.jpg 375 500 4 102 50 333 500 +8871 /data/VOCdevkit/VOC2012/JPEGImages/2008_007812.jpg 500 375 2 93 90 325 375 +8872 /data/VOCdevkit/VOC2012/JPEGImages/2008_007814.jpg 500 375 16 96 59 313 375 +8873 /data/VOCdevkit/VOC2012/JPEGImages/2008_007816.jpg 500 500 12 127 45 500 500 +8874 /data/VOCdevkit/VOC2012/JPEGImages/2008_007817.jpg 376 500 2 130 49 195 125 +8875 /data/VOCdevkit/VOC2012/JPEGImages/2008_007819.jpg 375 500 11 1 329 111 496 +8876 /data/VOCdevkit/VOC2012/JPEGImages/2008_007823.jpg 500 476 15 1 1 500 476 +8877 /data/VOCdevkit/VOC2012/JPEGImages/2008_007825.jpg 500 406 6 22 144 455 304 +8878 /data/VOCdevkit/VOC2012/JPEGImages/2008_007827.jpg 450 338 14 53 90 220 291 14 268 69 383 196 14 199 113 232 174 +8879 /data/VOCdevkit/VOC2012/JPEGImages/2008_007828.jpg 500 377 14 45 14 198 376 19 185 192 233 248 19 434 187 500 296 8 196 247 316 377 +8880 /data/VOCdevkit/VOC2012/JPEGImages/2008_007829.jpg 500 375 18 1 100 472 329 +8881 /data/VOCdevkit/VOC2012/JPEGImages/2008_007831.jpg 500 375 15 430 211 500 322 15 1 104 61 188 15 52 133 106 183 15 97 115 157 150 15 179 120 235 176 15 227 111 298 174 15 310 135 346 171 15 376 123 423 166 15 422 113 467 164 15 386 265 438 332 15 338 183 417 344 15 328 294 362 351 15 273 247 335 329 15 240 317 285 375 15 29 145 321 347 15 43 321 103 375 +8882 /data/VOCdevkit/VOC2012/JPEGImages/2008_007833.jpg 500 375 1 297 287 500 375 14 168 100 301 375 +8883 /data/VOCdevkit/VOC2012/JPEGImages/2008_007835.jpg 500 375 15 180 261 269 309 +8884 /data/VOCdevkit/VOC2012/JPEGImages/2008_007836.jpg 500 375 0 231 147 287 215 +8885 /data/VOCdevkit/VOC2012/JPEGImages/2008_007837.jpg 500 375 17 16 166 500 375 14 122 119 269 375 14 234 135 369 375 14 327 138 500 375 +8886 /data/VOCdevkit/VOC2012/JPEGImages/2008_007839.jpg 500 414 2 314 32 431 129 +8887 /data/VOCdevkit/VOC2012/JPEGImages/2008_007840.jpg 500 375 11 164 24 276 96 11 273 53 348 174 11 160 154 313 371 +8888 /data/VOCdevkit/VOC2012/JPEGImages/2008_007841.jpg 448 336 3 1 81 62 124 14 49 95 206 319 14 180 112 255 336 14 230 119 348 336 3 1 120 448 336 +8889 /data/VOCdevkit/VOC2012/JPEGImages/2008_007842.jpg 500 375 7 214 71 380 273 +8890 /data/VOCdevkit/VOC2012/JPEGImages/2008_007843.jpg 500 375 8 1 1 202 228 8 182 1 330 147 14 144 134 368 328 14 62 106 239 355 4 263 236 306 271 +8891 /data/VOCdevkit/VOC2012/JPEGImages/2008_007848.jpg 500 330 2 91 216 177 273 +8892 /data/VOCdevkit/VOC2012/JPEGImages/2008_007850.jpg 500 375 12 247 143 303 203 12 65 151 97 183 +8893 /data/VOCdevkit/VOC2012/JPEGImages/2008_007852.jpg 500 375 14 218 45 347 375 14 106 33 341 375 4 36 159 48 188 4 66 159 75 186 +8894 /data/VOCdevkit/VOC2012/JPEGImages/2008_007853.jpg 500 375 14 113 111 225 223 14 221 24 500 250 10 1 221 500 375 +8895 /data/VOCdevkit/VOC2012/JPEGImages/2008_007854.jpg 500 489 2 25 101 279 404 2 233 163 465 437 +8896 /data/VOCdevkit/VOC2012/JPEGImages/2008_007855.jpg 500 454 7 16 1 446 356 +8897 /data/VOCdevkit/VOC2012/JPEGImages/2008_007858.jpg 333 500 4 78 8 225 498 +8898 /data/VOCdevkit/VOC2012/JPEGImages/2008_007861.jpg 333 500 1 99 164 240 363 14 94 127 229 297 +8899 /data/VOCdevkit/VOC2012/JPEGImages/2008_007864.jpg 375 500 19 213 97 375 294 14 41 78 375 500 +8900 /data/VOCdevkit/VOC2012/JPEGImages/2008_007869.jpg 500 333 6 72 263 115 287 6 51 260 85 284 6 64 246 104 266 6 146 245 185 269 6 196 244 223 258 +8901 /data/VOCdevkit/VOC2012/JPEGImages/2008_007870.jpg 500 333 2 210 97 368 186 +8902 /data/VOCdevkit/VOC2012/JPEGImages/2008_007871.jpg 500 337 11 396 196 447 275 +8903 /data/VOCdevkit/VOC2012/JPEGImages/2008_007872.jpg 500 375 1 304 298 384 344 6 1 281 271 375 5 420 72 500 375 14 265 236 286 303 14 235 239 264 305 14 375 215 399 277 +8904 /data/VOCdevkit/VOC2012/JPEGImages/2008_007873.jpg 500 375 7 49 129 456 293 +8905 /data/VOCdevkit/VOC2012/JPEGImages/2008_007875.jpg 500 375 11 186 39 310 317 +8906 /data/VOCdevkit/VOC2012/JPEGImages/2008_007877.jpg 500 375 6 1 215 103 287 +8907 /data/VOCdevkit/VOC2012/JPEGImages/2008_007879.jpg 500 333 0 1 39 493 313 +8908 /data/VOCdevkit/VOC2012/JPEGImages/2008_007882.jpg 375 500 1 265 351 375 460 14 160 276 211 424 15 263 351 316 439 15 319 108 375 128 +8909 /data/VOCdevkit/VOC2012/JPEGImages/2008_007883.jpg 500 332 0 39 25 465 209 3 339 224 488 322 +8910 /data/VOCdevkit/VOC2012/JPEGImages/2008_007884.jpg 500 318 3 334 163 424 203 3 34 139 397 222 3 401 117 500 156 0 149 68 408 169 +8911 /data/VOCdevkit/VOC2012/JPEGImages/2008_007887.jpg 500 333 18 20 3 445 331 +8912 /data/VOCdevkit/VOC2012/JPEGImages/2008_007888.jpg 500 325 7 1 1 500 312 +8913 /data/VOCdevkit/VOC2012/JPEGImages/2008_007890.jpg 500 375 16 401 137 434 210 16 36 139 101 194 16 108 134 182 201 16 186 147 287 222 16 259 148 350 237 16 346 142 394 231 16 286 148 382 249 +8914 /data/VOCdevkit/VOC2012/JPEGImages/2008_007891.jpg 500 349 2 185 53 328 282 +8915 /data/VOCdevkit/VOC2012/JPEGImages/2008_007893.jpg 375 500 8 87 53 290 455 +8916 /data/VOCdevkit/VOC2012/JPEGImages/2008_007895.jpg 331 500 14 110 120 287 484 6 1 175 331 491 +8917 /data/VOCdevkit/VOC2012/JPEGImages/2008_007897.jpg 500 432 12 279 141 404 387 12 1 45 295 356 12 110 44 400 228 +8918 /data/VOCdevkit/VOC2012/JPEGImages/2008_007902.jpg 500 375 11 40 117 314 325 14 240 83 337 283 +8919 /data/VOCdevkit/VOC2012/JPEGImages/2008_007904.jpg 213 500 14 1 1 213 398 +8920 /data/VOCdevkit/VOC2012/JPEGImages/2008_007907.jpg 500 375 11 223 28 388 375 +8921 /data/VOCdevkit/VOC2012/JPEGImages/2008_007909.jpg 500 375 16 1 1 500 375 +8922 /data/VOCdevkit/VOC2012/JPEGImages/2008_007912.jpg 500 375 3 218 174 258 193 +8923 /data/VOCdevkit/VOC2012/JPEGImages/2008_007913.jpg 500 375 7 55 138 222 232 14 140 39 175 120 14 160 49 196 118 +8924 /data/VOCdevkit/VOC2012/JPEGImages/2008_007914.jpg 500 375 7 143 39 500 295 +8925 /data/VOCdevkit/VOC2012/JPEGImages/2008_007915.jpg 500 355 1 51 41 468 332 +8926 /data/VOCdevkit/VOC2012/JPEGImages/2008_007916.jpg 500 375 19 264 173 424 305 +8927 /data/VOCdevkit/VOC2012/JPEGImages/2008_007917.jpg 500 332 11 309 107 402 206 14 96 21 253 332 +8928 /data/VOCdevkit/VOC2012/JPEGImages/2008_007918.jpg 500 375 6 434 228 473 247 14 379 228 396 273 15 190 242 227 293 15 242 243 275 283 +8929 /data/VOCdevkit/VOC2012/JPEGImages/2008_007922.jpg 500 375 8 177 228 327 375 8 282 213 398 367 8 1 252 109 375 8 345 175 424 283 8 54 169 118 290 8 251 160 302 214 10 71 200 412 375 +8930 /data/VOCdevkit/VOC2012/JPEGImages/2008_007923.jpg 375 500 14 8 39 375 500 4 178 319 244 490 4 113 357 189 500 +8931 /data/VOCdevkit/VOC2012/JPEGImages/2008_007928.jpg 500 375 14 1 69 202 375 14 71 89 340 375 14 277 62 500 375 4 371 116 388 149 4 388 102 407 150 +8932 /data/VOCdevkit/VOC2012/JPEGImages/2008_007931.jpg 500 338 5 1 1 500 338 14 13 137 172 338 14 360 188 467 338 14 370 70 423 239 +8933 /data/VOCdevkit/VOC2012/JPEGImages/2008_007932.jpg 500 333 9 76 87 484 333 9 1 292 44 333 +8934 /data/VOCdevkit/VOC2012/JPEGImages/2008_007933.jpg 408 308 19 17 1 266 225 19 268 1 408 229 19 17 238 267 308 19 271 247 408 308 14 63 55 124 140 14 121 54 159 140 +8935 /data/VOCdevkit/VOC2012/JPEGImages/2008_007935.jpg 500 333 14 212 94 271 232 1 158 138 354 241 1 1 136 47 208 13 34 88 132 180 +8936 /data/VOCdevkit/VOC2012/JPEGImages/2008_007936.jpg 375 500 2 72 63 375 365 +8937 /data/VOCdevkit/VOC2012/JPEGImages/2008_007937.jpg 304 291 11 44 23 257 233 +8938 /data/VOCdevkit/VOC2012/JPEGImages/2008_007938.jpg 500 375 3 169 187 340 223 +8939 /data/VOCdevkit/VOC2012/JPEGImages/2008_007940.jpg 500 485 2 22 52 480 368 +8940 /data/VOCdevkit/VOC2012/JPEGImages/2008_007941.jpg 400 300 7 116 21 265 259 8 1 1 361 300 +8941 /data/VOCdevkit/VOC2012/JPEGImages/2008_007942.jpg 500 331 14 318 81 400 214 13 318 125 395 268 +8942 /data/VOCdevkit/VOC2012/JPEGImages/2008_007945.jpg 500 361 12 27 54 453 321 12 226 113 484 326 +8943 /data/VOCdevkit/VOC2012/JPEGImages/2008_007947.jpg 500 333 6 1 1 463 331 +8944 /data/VOCdevkit/VOC2012/JPEGImages/2008_007948.jpg 393 500 2 76 115 364 336 2 58 62 276 323 +8945 /data/VOCdevkit/VOC2012/JPEGImages/2008_007949.jpg 500 375 8 87 240 152 321 10 1 295 169 375 +8946 /data/VOCdevkit/VOC2012/JPEGImages/2008_007950.jpg 309 500 14 103 20 291 483 14 64 122 147 263 14 1 75 81 239 +8947 /data/VOCdevkit/VOC2012/JPEGImages/2008_007953.jpg 500 400 3 43 119 500 281 +8948 /data/VOCdevkit/VOC2012/JPEGImages/2008_007954.jpg 500 375 4 398 93 456 229 4 92 1 228 361 +8949 /data/VOCdevkit/VOC2012/JPEGImages/2008_007955.jpg 500 331 13 33 94 219 322 13 159 169 259 289 13 228 70 423 313 14 31 19 213 304 14 163 121 261 264 14 247 1 415 290 +8950 /data/VOCdevkit/VOC2012/JPEGImages/2008_007962.jpg 500 375 19 85 107 208 240 14 74 42 189 343 14 1 61 75 374 14 14 63 60 269 14 192 91 372 324 14 264 104 332 245 14 362 52 443 259 14 399 95 500 305 +8951 /data/VOCdevkit/VOC2012/JPEGImages/2008_007964.jpg 500 375 7 77 98 381 375 +8952 /data/VOCdevkit/VOC2012/JPEGImages/2008_007966.jpg 500 375 14 53 45 246 375 14 334 53 500 375 4 166 205 189 292 4 267 116 289 163 3 1 134 94 236 3 72 124 107 148 +8953 /data/VOCdevkit/VOC2012/JPEGImages/2008_007969.jpg 500 375 5 1 1 500 375 +8954 /data/VOCdevkit/VOC2012/JPEGImages/2008_007970.jpg 500 375 0 1 49 500 253 14 311 156 371 331 +8955 /data/VOCdevkit/VOC2012/JPEGImages/2008_007973.jpg 375 500 15 56 67 295 351 +8956 /data/VOCdevkit/VOC2012/JPEGImages/2008_007975.jpg 500 375 7 44 30 500 236 +8957 /data/VOCdevkit/VOC2012/JPEGImages/2008_007977.jpg 500 334 7 109 98 300 334 7 209 28 479 275 15 1 1 237 229 +8958 /data/VOCdevkit/VOC2012/JPEGImages/2008_007981.jpg 500 375 6 6 56 498 300 +8959 /data/VOCdevkit/VOC2012/JPEGImages/2008_007985.jpg 500 307 16 24 190 161 295 16 146 132 276 252 16 183 111 300 185 16 293 75 386 188 16 310 50 431 146 16 379 2 459 119 +8960 /data/VOCdevkit/VOC2012/JPEGImages/2008_007986.jpg 480 360 14 268 49 480 360 14 1 72 277 360 4 100 265 148 360 +8961 /data/VOCdevkit/VOC2012/JPEGImages/2008_007987.jpg 480 360 19 130 1 296 113 +8962 /data/VOCdevkit/VOC2012/JPEGImages/2008_007988.jpg 375 500 8 51 23 292 500 +8963 /data/VOCdevkit/VOC2012/JPEGImages/2008_007989.jpg 300 400 7 10 64 256 325 +8964 /data/VOCdevkit/VOC2012/JPEGImages/2008_007990.jpg 400 300 14 47 63 166 300 14 157 73 253 300 14 225 110 324 300 19 1 127 35 210 15 293 103 354 171 +8965 /data/VOCdevkit/VOC2012/JPEGImages/2008_007993.jpg 500 418 1 77 121 452 392 14 47 63 238 311 +8966 /data/VOCdevkit/VOC2012/JPEGImages/2008_007994.jpg 500 329 2 192 36 432 236 14 1 1 406 329 +8967 /data/VOCdevkit/VOC2012/JPEGImages/2008_007997.jpg 500 375 5 104 104 276 214 6 1 184 64 224 6 475 28 500 56 +8968 /data/VOCdevkit/VOC2012/JPEGImages/2008_007998.jpg 500 333 4 155 119 165 150 4 168 120 177 150 4 181 120 190 151 12 266 162 410 266 +8969 /data/VOCdevkit/VOC2012/JPEGImages/2008_007999.jpg 500 333 18 60 105 278 195 +8970 /data/VOCdevkit/VOC2012/JPEGImages/2008_008001.jpg 500 333 18 1 1 327 209 6 425 198 500 259 +8971 /data/VOCdevkit/VOC2012/JPEGImages/2008_008002.jpg 500 324 2 131 168 257 211 2 361 176 449 228 +8972 /data/VOCdevkit/VOC2012/JPEGImages/2008_008004.jpg 500 375 0 31 107 474 258 +8973 /data/VOCdevkit/VOC2012/JPEGImages/2008_008007.jpg 500 356 2 258 1 475 102 +8974 /data/VOCdevkit/VOC2012/JPEGImages/2008_008011.jpg 500 351 12 88 71 438 346 12 1 1 500 351 +8975 /data/VOCdevkit/VOC2012/JPEGImages/2008_008012.jpg 299 500 12 42 30 272 490 +8976 /data/VOCdevkit/VOC2012/JPEGImages/2008_008018.jpg 500 375 13 47 34 478 369 +8977 /data/VOCdevkit/VOC2012/JPEGImages/2008_008020.jpg 500 374 18 1 141 475 295 +8978 /data/VOCdevkit/VOC2012/JPEGImages/2008_008021.jpg 500 375 1 225 187 267 237 14 227 155 265 216 +8979 /data/VOCdevkit/VOC2012/JPEGImages/2008_008022.jpg 500 357 2 174 71 446 336 +8980 /data/VOCdevkit/VOC2012/JPEGImages/2008_008024.jpg 500 375 15 31 97 229 299 15 230 98 413 294 6 33 1 301 117 +8981 /data/VOCdevkit/VOC2012/JPEGImages/2008_008025.jpg 500 236 0 41 59 296 156 0 302 112 436 164 +8982 /data/VOCdevkit/VOC2012/JPEGImages/2008_008028.jpg 500 375 0 66 62 500 224 +8983 /data/VOCdevkit/VOC2012/JPEGImages/2008_008029.jpg 500 375 14 255 126 438 375 14 228 28 445 292 17 16 88 500 375 14 58 24 302 375 +8984 /data/VOCdevkit/VOC2012/JPEGImages/2008_008031.jpg 500 375 12 117 100 372 294 +8985 /data/VOCdevkit/VOC2012/JPEGImages/2008_008034.jpg 500 389 12 151 172 431 373 14 197 103 349 335 +8986 /data/VOCdevkit/VOC2012/JPEGImages/2008_008037.jpg 500 400 2 39 102 383 323 +8987 /data/VOCdevkit/VOC2012/JPEGImages/2008_008040.jpg 500 333 12 182 93 411 248 14 243 65 318 174 +8988 /data/VOCdevkit/VOC2012/JPEGImages/2008_008043.jpg 500 375 0 329 11 500 201 6 249 154 285 165 5 138 141 175 162 +8989 /data/VOCdevkit/VOC2012/JPEGImages/2008_008044.jpg 500 375 0 1 83 500 260 +8990 /data/VOCdevkit/VOC2012/JPEGImages/2008_008048.jpg 500 375 0 303 82 339 119 0 259 79 297 116 0 270 115 307 144 0 226 143 259 172 0 218 107 255 138 0 211 77 246 111 0 166 104 202 142 0 175 141 211 174 0 119 134 153 171 +8991 /data/VOCdevkit/VOC2012/JPEGImages/2008_008050.jpg 500 338 0 1 19 500 338 +8992 /data/VOCdevkit/VOC2012/JPEGImages/2008_008052.jpg 500 354 12 1 83 437 354 +8993 /data/VOCdevkit/VOC2012/JPEGImages/2008_008053.jpg 500 333 0 61 188 89 207 0 169 186 198 200 0 312 174 339 189 0 406 166 433 183 +8994 /data/VOCdevkit/VOC2012/JPEGImages/2008_008055.jpg 500 375 18 283 187 427 266 +8995 /data/VOCdevkit/VOC2012/JPEGImages/2008_008057.jpg 333 500 2 136 243 190 391 +8996 /data/VOCdevkit/VOC2012/JPEGImages/2008_008058.jpg 335 500 13 1 156 319 500 14 94 182 271 494 +8997 /data/VOCdevkit/VOC2012/JPEGImages/2008_008064.jpg 500 375 1 119 209 310 375 1 1 241 74 375 14 104 126 159 347 14 149 149 207 331 +8998 /data/VOCdevkit/VOC2012/JPEGImages/2008_008066.jpg 378 465 5 35 16 340 465 14 336 272 365 369 +8999 /data/VOCdevkit/VOC2012/JPEGImages/2008_008069.jpg 333 500 1 17 370 266 500 14 58 59 312 500 +9000 /data/VOCdevkit/VOC2012/JPEGImages/2008_008070.jpg 500 375 8 425 156 500 336 10 1 104 500 375 15 352 1 500 190 15 172 95 272 194 +9001 /data/VOCdevkit/VOC2012/JPEGImages/2008_008072.jpg 500 375 14 103 64 422 312 14 80 1 212 137 4 79 69 114 147 +9002 /data/VOCdevkit/VOC2012/JPEGImages/2008_008073.jpg 333 500 2 73 180 200 318 +9003 /data/VOCdevkit/VOC2012/JPEGImages/2008_008074.jpg 500 171 18 32 50 493 160 +9004 /data/VOCdevkit/VOC2012/JPEGImages/2008_008075.jpg 375 500 12 1 128 219 500 12 174 114 323 500 14 309 334 337 421 +9005 /data/VOCdevkit/VOC2012/JPEGImages/2008_008080.jpg 500 449 1 56 235 486 440 5 1 70 424 191 15 458 126 500 261 +9006 /data/VOCdevkit/VOC2012/JPEGImages/2008_008083.jpg 333 500 3 145 167 333 263 14 127 55 277 209 +9007 /data/VOCdevkit/VOC2012/JPEGImages/2008_008084.jpg 333 500 1 40 273 247 500 14 87 35 292 488 +9008 /data/VOCdevkit/VOC2012/JPEGImages/2008_008086.jpg 500 500 0 111 234 373 325 +9009 /data/VOCdevkit/VOC2012/JPEGImages/2008_008091.jpg 500 375 14 23 1 297 197 +9010 /data/VOCdevkit/VOC2012/JPEGImages/2008_008092.jpg 500 375 1 251 228 289 264 +9011 /data/VOCdevkit/VOC2012/JPEGImages/2008_008093.jpg 500 375 14 1 171 153 375 14 64 172 153 305 14 147 148 250 287 14 212 144 322 257 14 314 147 410 256 14 388 145 500 350 10 123 246 490 375 +9012 /data/VOCdevkit/VOC2012/JPEGImages/2008_008095.jpg 500 375 14 1 32 363 375 1 286 131 423 309 +9013 /data/VOCdevkit/VOC2012/JPEGImages/2008_008096.jpg 500 375 0 9 119 500 299 15 292 277 345 329 15 93 41 118 67 15 256 42 278 66 15 346 44 366 67 15 472 46 492 70 +9014 /data/VOCdevkit/VOC2012/JPEGImages/2008_008097.jpg 500 333 6 424 105 500 194 1 163 180 374 288 13 364 96 438 136 14 383 80 416 125 14 244 115 325 272 5 77 55 193 104 5 324 18 500 109 6 119 81 206 111 6 224 75 257 93 +9015 /data/VOCdevkit/VOC2012/JPEGImages/2008_008098.jpg 500 375 10 1 105 500 306 14 322 18 500 365 14 119 81 381 375 8 37 131 213 306 8 275 141 420 316 +9016 /data/VOCdevkit/VOC2012/JPEGImages/2008_008103.jpg 500 375 17 206 174 500 375 +9017 /data/VOCdevkit/VOC2012/JPEGImages/2008_008105.jpg 500 355 2 233 111 345 235 +9018 /data/VOCdevkit/VOC2012/JPEGImages/2008_008106.jpg 500 375 17 24 201 225 375 +9019 /data/VOCdevkit/VOC2012/JPEGImages/2008_008109.jpg 375 500 16 109 235 202 324 +9020 /data/VOCdevkit/VOC2012/JPEGImages/2008_008112.jpg 500 333 1 131 100 472 333 14 140 1 381 291 14 422 137 500 319 +9021 /data/VOCdevkit/VOC2012/JPEGImages/2008_008113.jpg 500 375 14 66 187 106 299 5 132 94 466 289 14 34 167 56 256 +9022 /data/VOCdevkit/VOC2012/JPEGImages/2008_008115.jpg 500 333 9 1 89 189 282 9 165 97 344 333 9 259 9 500 333 9 452 100 500 284 9 120 126 170 180 +9023 /data/VOCdevkit/VOC2012/JPEGImages/2008_008116.jpg 500 375 14 31 122 362 375 14 133 173 252 342 +9024 /data/VOCdevkit/VOC2012/JPEGImages/2008_008120.jpg 500 357 5 18 29 471 324 +9025 /data/VOCdevkit/VOC2012/JPEGImages/2008_008121.jpg 375 500 9 1 191 302 500 +9026 /data/VOCdevkit/VOC2012/JPEGImages/2008_008122.jpg 500 333 14 240 138 480 333 14 1 12 195 278 +9027 /data/VOCdevkit/VOC2012/JPEGImages/2008_008123.jpg 500 375 18 1 106 500 283 +9028 /data/VOCdevkit/VOC2012/JPEGImages/2008_008125.jpg 500 333 2 219 107 367 333 2 130 119 240 250 +9029 /data/VOCdevkit/VOC2012/JPEGImages/2008_008127.jpg 500 375 13 246 160 389 325 6 207 118 246 144 14 285 115 349 289 +9030 /data/VOCdevkit/VOC2012/JPEGImages/2008_008130.jpg 500 387 0 5 1 488 363 +9031 /data/VOCdevkit/VOC2012/JPEGImages/2008_008131.jpg 500 375 1 11 41 445 375 +9032 /data/VOCdevkit/VOC2012/JPEGImages/2008_008132.jpg 474 500 9 1 47 386 500 +9033 /data/VOCdevkit/VOC2012/JPEGImages/2008_008134.jpg 500 403 2 104 67 326 377 +9034 /data/VOCdevkit/VOC2012/JPEGImages/2008_008141.jpg 500 333 6 109 161 174 193 13 438 189 479 221 14 448 167 467 204 +9035 /data/VOCdevkit/VOC2012/JPEGImages/2008_008145.jpg 375 500 2 6 57 341 500 +9036 /data/VOCdevkit/VOC2012/JPEGImages/2008_008146.jpg 500 333 0 228 114 279 151 +9037 /data/VOCdevkit/VOC2012/JPEGImages/2008_008147.jpg 500 348 12 1 56 452 348 14 1 1 265 304 +9038 /data/VOCdevkit/VOC2012/JPEGImages/2008_008148.jpg 500 381 13 114 13 444 365 +9039 /data/VOCdevkit/VOC2012/JPEGImages/2008_008150.jpg 500 333 0 188 130 313 208 0 279 190 355 254 +9040 /data/VOCdevkit/VOC2012/JPEGImages/2008_008152.jpg 500 333 18 9 10 452 324 +9041 /data/VOCdevkit/VOC2012/JPEGImages/2008_008154.jpg 500 335 14 172 24 281 263 13 66 121 182 309 +9042 /data/VOCdevkit/VOC2012/JPEGImages/2008_008155.jpg 500 337 14 208 82 369 337 10 367 210 500 337 8 371 206 484 337 8 416 174 490 325 +9043 /data/VOCdevkit/VOC2012/JPEGImages/2008_008162.jpg 500 333 17 49 94 500 333 14 61 83 303 333 14 249 64 403 333 14 132 166 245 248 +9044 /data/VOCdevkit/VOC2012/JPEGImages/2008_008166.jpg 500 374 2 131 38 419 335 +9045 /data/VOCdevkit/VOC2012/JPEGImages/2008_008169.jpg 500 300 9 1 13 451 300 +9046 /data/VOCdevkit/VOC2012/JPEGImages/2008_008170.jpg 500 375 3 181 166 374 276 +9047 /data/VOCdevkit/VOC2012/JPEGImages/2008_008175.jpg 394 500 2 219 296 331 439 +9048 /data/VOCdevkit/VOC2012/JPEGImages/2008_008176.jpg 333 500 8 237 310 291 404 +9049 /data/VOCdevkit/VOC2012/JPEGImages/2008_008177.jpg 500 375 13 291 122 418 329 13 1 116 50 248 13 134 120 304 299 6 405 125 500 174 +9050 /data/VOCdevkit/VOC2012/JPEGImages/2008_008179.jpg 471 284 0 310 133 419 167 0 176 138 311 181 0 47 144 181 182 +9051 /data/VOCdevkit/VOC2012/JPEGImages/2008_008180.jpg 500 333 0 178 111 413 194 0 119 175 342 253 +9052 /data/VOCdevkit/VOC2012/JPEGImages/2008_008184.jpg 500 375 15 441 245 500 348 15 403 294 451 362 15 240 316 299 375 15 1 330 51 375 14 89 116 201 375 14 200 103 299 375 14 295 131 372 375 14 367 135 448 375 +9053 /data/VOCdevkit/VOC2012/JPEGImages/2008_008185.jpg 500 334 2 265 227 295 257 2 230 238 251 273 14 235 157 268 242 14 253 139 288 239 +9054 /data/VOCdevkit/VOC2012/JPEGImages/2008_008190.jpg 500 375 17 65 139 355 300 14 160 67 261 324 +9055 /data/VOCdevkit/VOC2012/JPEGImages/2008_008191.jpg 500 333 0 36 51 295 146 +9056 /data/VOCdevkit/VOC2012/JPEGImages/2008_008192.jpg 500 375 18 181 1 500 166 14 38 156 219 375 14 129 190 218 375 +9057 /data/VOCdevkit/VOC2012/JPEGImages/2008_008193.jpg 500 335 12 156 42 458 299 +9058 /data/VOCdevkit/VOC2012/JPEGImages/2008_008194.jpg 500 354 2 11 104 344 297 +9059 /data/VOCdevkit/VOC2012/JPEGImages/2008_008197.jpg 500 258 2 115 52 275 218 +9060 /data/VOCdevkit/VOC2012/JPEGImages/2008_008199.jpg 500 358 9 151 147 427 295 9 192 144 395 285 +9061 /data/VOCdevkit/VOC2012/JPEGImages/2008_008200.jpg 500 333 18 169 8 500 263 +9062 /data/VOCdevkit/VOC2012/JPEGImages/2008_008203.jpg 500 375 15 28 187 57 225 18 95 1 500 375 +9063 /data/VOCdevkit/VOC2012/JPEGImages/2008_008206.jpg 500 325 17 1 216 97 325 17 359 226 500 325 19 231 164 280 211 +9064 /data/VOCdevkit/VOC2012/JPEGImages/2008_008208.jpg 375 500 15 26 206 112 264 15 260 211 336 271 +9065 /data/VOCdevkit/VOC2012/JPEGImages/2008_008210.jpg 500 375 14 163 123 246 276 1 171 188 246 316 6 355 139 459 178 6 34 152 67 174 6 58 151 85 169 6 86 151 111 165 6 111 150 135 163 +9066 /data/VOCdevkit/VOC2012/JPEGImages/2008_008211.jpg 500 296 2 199 118 302 174 +9067 /data/VOCdevkit/VOC2012/JPEGImages/2008_008212.jpg 500 391 14 192 39 275 242 12 67 97 377 346 15 156 235 245 282 +9068 /data/VOCdevkit/VOC2012/JPEGImages/2008_008215.jpg 500 335 0 63 88 500 302 +9069 /data/VOCdevkit/VOC2012/JPEGImages/2008_008217.jpg 500 375 14 245 1 500 373 +9070 /data/VOCdevkit/VOC2012/JPEGImages/2008_008218.jpg 500 333 13 237 121 483 276 14 240 75 368 260 +9071 /data/VOCdevkit/VOC2012/JPEGImages/2008_008220.jpg 500 334 15 402 136 467 227 +9072 /data/VOCdevkit/VOC2012/JPEGImages/2008_008221.jpg 500 326 14 1 160 77 326 18 1 51 461 269 +9073 /data/VOCdevkit/VOC2012/JPEGImages/2008_008223.jpg 500 326 18 43 19 365 225 +9074 /data/VOCdevkit/VOC2012/JPEGImages/2008_008224.jpg 500 378 10 155 254 343 378 +9075 /data/VOCdevkit/VOC2012/JPEGImages/2008_008227.jpg 500 235 13 274 14 381 213 +9076 /data/VOCdevkit/VOC2012/JPEGImages/2008_008229.jpg 500 356 12 184 155 303 356 14 301 194 339 341 14 159 116 296 333 +9077 /data/VOCdevkit/VOC2012/JPEGImages/2008_008231.jpg 500 375 0 51 79 98 104 14 373 140 418 316 +9078 /data/VOCdevkit/VOC2012/JPEGImages/2008_008232.jpg 500 375 12 287 187 350 242 12 420 191 498 250 14 298 176 328 227 +9079 /data/VOCdevkit/VOC2012/JPEGImages/2008_008233.jpg 500 306 2 121 45 393 306 +9080 /data/VOCdevkit/VOC2012/JPEGImages/2008_008234.jpg 500 375 5 74 17 488 375 +9081 /data/VOCdevkit/VOC2012/JPEGImages/2008_008235.jpg 500 375 15 99 232 307 375 3 148 103 382 158 3 108 108 190 127 +9082 /data/VOCdevkit/VOC2012/JPEGImages/2008_008237.jpg 500 375 15 358 217 383 307 15 276 228 298 303 15 244 249 261 296 14 18 266 39 320 15 62 256 76 291 +9083 /data/VOCdevkit/VOC2012/JPEGImages/2008_008241.jpg 500 375 9 32 32 441 296 9 1 7 235 179 9 14 6 147 102 +9084 /data/VOCdevkit/VOC2012/JPEGImages/2008_008242.jpg 375 500 2 1 58 348 500 +9085 /data/VOCdevkit/VOC2012/JPEGImages/2008_008246.jpg 500 375 13 137 213 342 375 14 238 129 328 218 14 95 113 195 352 6 1 123 222 245 14 165 170 269 306 +9086 /data/VOCdevkit/VOC2012/JPEGImages/2008_008247.jpg 500 333 0 89 150 146 174 +9087 /data/VOCdevkit/VOC2012/JPEGImages/2008_008252.jpg 375 500 5 38 79 348 373 +9088 /data/VOCdevkit/VOC2012/JPEGImages/2008_008254.jpg 500 375 0 96 225 452 341 +9089 /data/VOCdevkit/VOC2012/JPEGImages/2008_008257.jpg 500 375 2 1 144 280 375 +9090 /data/VOCdevkit/VOC2012/JPEGImages/2008_008262.jpg 500 375 12 1 210 90 287 12 110 219 247 320 12 131 198 257 302 12 418 180 470 223 14 376 241 409 368 14 418 231 441 333 14 374 203 404 268 14 82 220 98 288 6 311 182 383 232 +9091 /data/VOCdevkit/VOC2012/JPEGImages/2008_008263.jpg 500 482 0 305 85 391 125 +9092 /data/VOCdevkit/VOC2012/JPEGImages/2008_008266.jpg 500 375 14 133 19 388 298 10 364 162 486 270 4 386 136 399 174 +9093 /data/VOCdevkit/VOC2012/JPEGImages/2008_008268.jpg 500 349 2 39 43 173 114 2 308 62 402 155 2 354 237 466 315 +9094 /data/VOCdevkit/VOC2012/JPEGImages/2008_008269.jpg 500 375 19 138 54 365 263 +9095 /data/VOCdevkit/VOC2012/JPEGImages/2008_008271.jpg 432 288 17 1 95 432 288 +9096 /data/VOCdevkit/VOC2012/JPEGImages/2008_008272.jpg 500 375 14 4 169 161 375 14 109 187 198 315 14 169 216 234 314 14 214 219 262 308 14 317 207 374 323 14 268 203 331 300 14 425 167 500 375 14 341 192 463 373 14 346 206 416 323 +9097 /data/VOCdevkit/VOC2012/JPEGImages/2008_008274.jpg 500 375 2 33 3 465 375 +9098 /data/VOCdevkit/VOC2012/JPEGImages/2008_008275.jpg 500 305 18 29 120 216 233 18 317 109 500 215 14 286 154 309 215 +9099 /data/VOCdevkit/VOC2012/JPEGImages/2008_008276.jpg 500 318 17 1 155 500 318 19 260 96 295 133 +9100 /data/VOCdevkit/VOC2012/JPEGImages/2008_008278.jpg 500 333 0 1 64 500 299 0 1 8 500 194 0 74 167 163 192 0 1 164 91 191 +9101 /data/VOCdevkit/VOC2012/JPEGImages/2008_008279.jpg 500 500 12 1 41 315 500 +9102 /data/VOCdevkit/VOC2012/JPEGImages/2008_008281.jpg 500 334 5 111 44 360 297 5 1 119 128 274 +9103 /data/VOCdevkit/VOC2012/JPEGImages/2008_008284.jpg 456 500 2 100 84 327 407 +9104 /data/VOCdevkit/VOC2012/JPEGImages/2008_008287.jpg 500 375 2 113 168 226 338 +9105 /data/VOCdevkit/VOC2012/JPEGImages/2008_008288.jpg 500 337 14 164 56 333 272 13 39 1 500 337 +9106 /data/VOCdevkit/VOC2012/JPEGImages/2008_008292.jpg 333 500 2 79 65 252 500 +9107 /data/VOCdevkit/VOC2012/JPEGImages/2008_008294.jpg 500 333 0 125 75 323 271 +9108 /data/VOCdevkit/VOC2012/JPEGImages/2008_008296.jpg 500 375 12 226 198 291 269 +9109 /data/VOCdevkit/VOC2012/JPEGImages/2008_008297.jpg 500 332 18 93 48 362 270 +9110 /data/VOCdevkit/VOC2012/JPEGImages/2008_008300.jpg 500 333 0 25 129 348 206 +9111 /data/VOCdevkit/VOC2012/JPEGImages/2008_008301.jpg 500 375 5 1 93 500 253 +9112 /data/VOCdevkit/VOC2012/JPEGImages/2008_008302.jpg 500 271 18 1 1 500 252 +9113 /data/VOCdevkit/VOC2012/JPEGImages/2008_008307.jpg 500 364 1 52 119 393 333 14 143 39 362 308 +9114 /data/VOCdevkit/VOC2012/JPEGImages/2008_008309.jpg 500 356 2 17 107 238 201 2 363 241 481 303 +9115 /data/VOCdevkit/VOC2012/JPEGImages/2008_008310.jpg 500 375 15 1 1 212 340 15 1 239 22 327 +9116 /data/VOCdevkit/VOC2012/JPEGImages/2008_008313.jpg 500 375 17 104 1 500 271 +9117 /data/VOCdevkit/VOC2012/JPEGImages/2008_008314.jpg 500 333 2 73 111 291 281 +9118 /data/VOCdevkit/VOC2012/JPEGImages/2008_008315.jpg 500 482 1 198 208 312 340 14 169 114 322 319 6 1 61 493 344 +9119 /data/VOCdevkit/VOC2012/JPEGImages/2008_008318.jpg 500 393 12 1 30 371 371 +9120 /data/VOCdevkit/VOC2012/JPEGImages/2008_008319.jpg 500 375 16 355 180 500 352 16 224 166 417 277 14 129 116 197 305 14 38 88 94 241 14 10 63 61 210 14 105 120 138 223 +9121 /data/VOCdevkit/VOC2012/JPEGImages/2008_008320.jpg 500 375 1 258 125 480 347 1 1 187 276 375 14 139 49 285 337 +9122 /data/VOCdevkit/VOC2012/JPEGImages/2008_008321.jpg 500 370 18 150 151 357 233 +9123 /data/VOCdevkit/VOC2012/JPEGImages/2008_008322.jpg 500 333 16 191 145 229 179 16 237 139 274 181 16 271 151 306 186 +9124 /data/VOCdevkit/VOC2012/JPEGImages/2008_008323.jpg 500 375 16 106 132 413 333 16 187 70 323 169 +9125 /data/VOCdevkit/VOC2012/JPEGImages/2008_008324.jpg 375 500 13 105 193 243 447 +9126 /data/VOCdevkit/VOC2012/JPEGImages/2008_008325.jpg 333 500 1 1 327 333 500 1 266 238 333 322 14 3 125 333 500 14 266 197 333 308 +9127 /data/VOCdevkit/VOC2012/JPEGImages/2008_008330.jpg 375 500 4 169 258 223 390 4 234 296 289 395 10 217 129 356 229 8 231 142 314 231 8 188 129 252 212 8 316 152 372 222 15 160 27 249 218 +9128 /data/VOCdevkit/VOC2012/JPEGImages/2008_008331.jpg 500 375 15 51 1 194 228 15 193 1 338 226 15 336 1 476 224 +9129 /data/VOCdevkit/VOC2012/JPEGImages/2008_008335.jpg 377 500 14 6 62 377 474 +9130 /data/VOCdevkit/VOC2012/JPEGImages/2008_008336.jpg 500 375 18 133 98 403 287 18 1 127 185 186 14 447 161 500 231 +9131 /data/VOCdevkit/VOC2012/JPEGImages/2008_008337.jpg 500 375 1 154 124 442 350 14 180 33 391 272 +9132 /data/VOCdevkit/VOC2012/JPEGImages/2008_008338.jpg 500 375 15 212 78 292 118 6 31 113 468 358 6 1 152 156 264 +9133 /data/VOCdevkit/VOC2012/JPEGImages/2008_008341.jpg 375 500 15 59 232 173 330 +9134 /data/VOCdevkit/VOC2012/JPEGImages/2008_008342.jpg 500 317 18 175 59 500 265 +9135 /data/VOCdevkit/VOC2012/JPEGImages/2008_008343.jpg 500 375 6 401 282 493 330 5 236 207 432 333 14 34 281 53 336 14 53 282 74 336 14 134 288 149 332 14 194 287 209 327 14 208 287 223 329 +9136 /data/VOCdevkit/VOC2012/JPEGImages/2008_008344.jpg 500 400 0 8 101 500 262 +9137 /data/VOCdevkit/VOC2012/JPEGImages/2008_008345.jpg 500 223 0 73 57 415 151 0 290 29 320 44 +9138 /data/VOCdevkit/VOC2012/JPEGImages/2008_008346.jpg 349 500 2 15 57 312 492 +9139 /data/VOCdevkit/VOC2012/JPEGImages/2008_008347.jpg 300 400 2 209 74 250 115 2 84 98 132 160 2 127 164 165 206 2 102 217 178 259 2 9 280 115 345 +9140 /data/VOCdevkit/VOC2012/JPEGImages/2008_008354.jpg 357 500 2 79 9 311 486 +9141 /data/VOCdevkit/VOC2012/JPEGImages/2008_008356.jpg 500 343 12 185 137 405 275 +9142 /data/VOCdevkit/VOC2012/JPEGImages/2008_008357.jpg 500 374 1 357 196 430 317 1 285 188 352 287 1 135 163 211 281 1 297 77 327 120 1 368 176 476 264 14 92 87 150 254 14 258 126 287 224 14 286 133 344 235 14 148 111 189 215 14 427 117 498 287 14 425 134 467 257 6 234 115 344 205 +9143 /data/VOCdevkit/VOC2012/JPEGImages/2008_008359.jpg 500 354 0 5 89 495 217 +9144 /data/VOCdevkit/VOC2012/JPEGImages/2008_008362.jpg 500 375 10 60 265 378 375 8 378 232 466 375 14 190 64 347 216 14 235 154 366 276 14 130 163 240 264 14 30 172 132 306 4 199 246 215 284 14 349 159 445 375 14 299 117 340 195 14 134 104 173 209 4 180 235 196 264 +9145 /data/VOCdevkit/VOC2012/JPEGImages/2008_008363.jpg 500 375 8 159 253 266 375 8 226 199 291 307 8 62 236 159 375 8 53 207 98 318 15 132 169 227 264 10 79 239 257 375 +9146 /data/VOCdevkit/VOC2012/JPEGImages/2008_008364.jpg 500 320 18 48 47 446 165 14 305 104 338 156 14 320 117 338 157 14 58 81 74 105 14 112 83 128 105 +9147 /data/VOCdevkit/VOC2012/JPEGImages/2008_008365.jpg 500 375 10 137 271 341 375 8 56 227 132 345 8 91 256 198 375 8 274 262 389 375 8 354 231 447 351 +9148 /data/VOCdevkit/VOC2012/JPEGImages/2008_008366.jpg 500 375 12 361 1 500 375 12 237 140 308 375 14 128 30 313 375 +9149 /data/VOCdevkit/VOC2012/JPEGImages/2008_008368.jpg 500 375 1 1 2 500 375 14 1 1 117 246 14 423 17 487 138 14 312 18 360 115 +9150 /data/VOCdevkit/VOC2012/JPEGImages/2008_008370.jpg 375 500 9 106 262 208 328 +9151 /data/VOCdevkit/VOC2012/JPEGImages/2008_008373.jpg 500 363 0 6 106 497 224 +9152 /data/VOCdevkit/VOC2012/JPEGImages/2008_008376.jpg 500 333 2 82 141 295 262 2 317 94 500 328 +9153 /data/VOCdevkit/VOC2012/JPEGImages/2008_008377.jpg 500 333 2 80 44 325 275 +9154 /data/VOCdevkit/VOC2012/JPEGImages/2008_008379.jpg 436 500 18 39 1 436 472 +9155 /data/VOCdevkit/VOC2012/JPEGImages/2008_008380.jpg 375 500 2 166 182 234 362 +9156 /data/VOCdevkit/VOC2012/JPEGImages/2008_008382.jpg 500 375 14 312 110 477 375 18 75 86 218 222 +9157 /data/VOCdevkit/VOC2012/JPEGImages/2008_008384.jpg 500 333 2 177 132 281 197 +9158 /data/VOCdevkit/VOC2012/JPEGImages/2008_008387.jpg 500 333 2 81 79 302 333 +9159 /data/VOCdevkit/VOC2012/JPEGImages/2008_008388.jpg 500 375 10 1 239 449 375 14 254 138 384 262 14 342 143 500 375 14 6 47 77 259 14 73 203 333 375 14 157 35 237 222 14 1 192 52 375 4 352 208 373 268 14 1 50 68 267 +9160 /data/VOCdevkit/VOC2012/JPEGImages/2008_008391.jpg 500 347 13 203 120 361 335 14 202 29 361 293 +9161 /data/VOCdevkit/VOC2012/JPEGImages/2008_008392.jpg 500 375 12 122 78 355 275 +9162 /data/VOCdevkit/VOC2012/JPEGImages/2008_008393.jpg 500 375 12 1 1 500 375 +9163 /data/VOCdevkit/VOC2012/JPEGImages/2008_008395.jpg 500 375 12 124 152 455 351 14 231 78 308 263 +9164 /data/VOCdevkit/VOC2012/JPEGImages/2008_008402.jpg 500 377 8 361 167 417 226 8 259 179 370 271 8 61 155 161 325 8 142 165 262 366 8 1 162 113 377 10 47 191 196 375 15 310 158 333 181 +9165 /data/VOCdevkit/VOC2012/JPEGImages/2008_008403.jpg 500 374 12 112 33 250 374 14 205 66 324 374 +9166 /data/VOCdevkit/VOC2012/JPEGImages/2008_008404.jpg 335 500 2 38 94 335 500 +9167 /data/VOCdevkit/VOC2012/JPEGImages/2008_008406.jpg 500 332 2 192 106 323 243 +9168 /data/VOCdevkit/VOC2012/JPEGImages/2008_008410.jpg 500 354 17 45 98 466 354 14 53 46 249 320 14 125 59 308 354 14 188 98 427 354 +9169 /data/VOCdevkit/VOC2012/JPEGImages/2008_008411.jpg 500 375 0 58 75 500 304 +9170 /data/VOCdevkit/VOC2012/JPEGImages/2008_008416.jpg 500 375 13 246 187 347 266 14 253 133 332 229 6 28 127 91 179 6 144 114 185 137 +9171 /data/VOCdevkit/VOC2012/JPEGImages/2008_008421.jpg 333 500 12 1 39 299 461 +9172 /data/VOCdevkit/VOC2012/JPEGImages/2008_008423.jpg 500 375 2 244 224 279 263 +9173 /data/VOCdevkit/VOC2012/JPEGImages/2008_008424.jpg 500 333 0 1 55 500 278 +9174 /data/VOCdevkit/VOC2012/JPEGImages/2008_008428.jpg 481 500 9 30 50 454 479 +9175 /data/VOCdevkit/VOC2012/JPEGImages/2008_008429.jpg 375 500 19 53 78 295 258 +9176 /data/VOCdevkit/VOC2012/JPEGImages/2008_008431.jpg 357 500 12 1 234 357 500 14 77 41 286 489 +9177 /data/VOCdevkit/VOC2012/JPEGImages/2008_008432.jpg 500 375 0 16 92 481 369 6 313 289 500 375 +9178 /data/VOCdevkit/VOC2012/JPEGImages/2008_008433.jpg 500 374 17 1 117 424 374 11 94 132 295 360 14 130 13 412 374 +9179 /data/VOCdevkit/VOC2012/JPEGImages/2008_008434.jpg 333 500 15 36 55 333 500 +9180 /data/VOCdevkit/VOC2012/JPEGImages/2008_008435.jpg 500 337 2 76 25 214 162 2 335 160 470 273 +9181 /data/VOCdevkit/VOC2012/JPEGImages/2008_008437.jpg 500 352 9 39 27 412 330 9 6 160 29 189 +9182 /data/VOCdevkit/VOC2012/JPEGImages/2008_008439.jpg 500 333 8 15 208 138 308 19 379 157 489 253 8 244 200 312 314 +9183 /data/VOCdevkit/VOC2012/JPEGImages/2008_008440.jpg 500 375 14 1 58 37 109 14 151 20 236 212 14 226 50 317 208 14 309 50 387 135 14 23 138 120 375 14 103 113 186 224 14 197 113 283 210 14 287 109 405 224 14 354 131 495 375 10 23 206 447 368 +9184 /data/VOCdevkit/VOC2012/JPEGImages/2008_008443.jpg 334 500 1 1 269 334 500 14 1 13 195 500 +9185 /data/VOCdevkit/VOC2012/JPEGImages/2008_008444.jpg 500 377 14 108 85 400 377 +9186 /data/VOCdevkit/VOC2012/JPEGImages/2008_008446.jpg 500 333 0 241 78 310 160 +9187 /data/VOCdevkit/VOC2012/JPEGImages/2008_008447.jpg 470 500 2 66 109 379 474 +9188 /data/VOCdevkit/VOC2012/JPEGImages/2008_008450.jpg 500 375 13 339 130 475 342 13 155 116 302 343 13 1 138 194 319 14 451 125 500 188 14 298 124 347 239 14 174 117 210 229 +9189 /data/VOCdevkit/VOC2012/JPEGImages/2008_008453.jpg 500 375 12 172 202 231 246 12 226 205 273 247 12 325 209 370 241 12 306 209 341 235 12 437 210 458 245 +9190 /data/VOCdevkit/VOC2012/JPEGImages/2008_008455.jpg 500 402 2 61 125 327 312 +9191 /data/VOCdevkit/VOC2012/JPEGImages/2008_008461.jpg 400 408 2 149 71 303 364 +9192 /data/VOCdevkit/VOC2012/JPEGImages/2008_008462.jpg 500 375 13 310 228 413 285 +9193 /data/VOCdevkit/VOC2012/JPEGImages/2008_008464.jpg 500 362 0 33 43 436 190 +9194 /data/VOCdevkit/VOC2012/JPEGImages/2008_008466.jpg 500 375 13 217 186 275 270 14 221 138 279 244 +9195 /data/VOCdevkit/VOC2012/JPEGImages/2008_008467.jpg 500 333 0 57 66 166 101 0 130 105 235 138 0 198 144 301 177 0 261 186 362 216 0 319 227 415 258 +9196 /data/VOCdevkit/VOC2012/JPEGImages/2008_008469.jpg 352 500 5 1 1 352 397 14 72 180 231 457 +9197 /data/VOCdevkit/VOC2012/JPEGImages/2008_008470.jpg 500 375 17 1 241 375 375 17 113 199 391 321 8 62 173 119 263 +9198 /data/VOCdevkit/VOC2012/JPEGImages/2008_008471.jpg 500 375 0 241 295 288 314 +9199 /data/VOCdevkit/VOC2012/JPEGImages/2008_008474.jpg 500 375 10 1 271 114 375 10 41 240 137 330 14 352 126 474 321 14 427 171 468 214 +9200 /data/VOCdevkit/VOC2012/JPEGImages/2008_008476.jpg 500 326 12 249 141 428 297 +9201 /data/VOCdevkit/VOC2012/JPEGImages/2008_008479.jpg 500 375 0 23 1 500 375 14 200 199 307 375 14 61 355 86 375 +9202 /data/VOCdevkit/VOC2012/JPEGImages/2008_008480.jpg 500 375 1 111 195 139 222 +9203 /data/VOCdevkit/VOC2012/JPEGImages/2008_008482.jpg 500 375 9 251 215 292 243 +9204 /data/VOCdevkit/VOC2012/JPEGImages/2008_008487.jpg 500 375 12 71 167 235 328 14 307 109 371 340 14 309 125 347 217 +9205 /data/VOCdevkit/VOC2012/JPEGImages/2008_008488.jpg 500 333 12 57 74 411 315 14 145 14 220 244 +9206 /data/VOCdevkit/VOC2012/JPEGImages/2008_008490.jpg 500 333 2 132 51 232 127 2 181 126 304 212 +9207 /data/VOCdevkit/VOC2012/JPEGImages/2008_008496.jpg 500 333 0 88 116 423 217 +9208 /data/VOCdevkit/VOC2012/JPEGImages/2008_008497.jpg 500 375 13 42 35 424 353 +9209 /data/VOCdevkit/VOC2012/JPEGImages/2008_008500.jpg 500 333 12 216 88 462 331 14 180 83 219 130 14 119 63 184 149 14 59 103 101 161 14 93 96 124 136 +9210 /data/VOCdevkit/VOC2012/JPEGImages/2008_008501.jpg 500 232 6 154 160 275 232 0 12 30 500 174 +9211 /data/VOCdevkit/VOC2012/JPEGImages/2008_008506.jpg 500 402 2 82 219 287 318 +9212 /data/VOCdevkit/VOC2012/JPEGImages/2008_008507.jpg 500 229 0 60 22 474 160 +9213 /data/VOCdevkit/VOC2012/JPEGImages/2008_008508.jpg 500 375 0 209 87 478 322 0 13 152 137 203 +9214 /data/VOCdevkit/VOC2012/JPEGImages/2008_008511.jpg 500 333 13 49 130 284 305 13 244 183 390 307 13 284 206 440 305 14 71 40 211 302 14 214 117 325 303 14 299 156 386 259 +9215 /data/VOCdevkit/VOC2012/JPEGImages/2008_008512.jpg 500 340 2 160 94 266 288 +9216 /data/VOCdevkit/VOC2012/JPEGImages/2008_008517.jpg 500 375 17 8 135 500 375 15 1 70 76 193 14 61 81 295 375 14 174 45 412 375 +9217 /data/VOCdevkit/VOC2012/JPEGImages/2008_008519.jpg 500 357 0 17 119 487 250 14 20 179 59 304 14 46 172 115 303 +9218 /data/VOCdevkit/VOC2012/JPEGImages/2008_008521.jpg 500 375 9 41 151 323 262 +9219 /data/VOCdevkit/VOC2012/JPEGImages/2008_008522.jpg 500 429 17 1 111 405 347 14 151 1 292 395 +9220 /data/VOCdevkit/VOC2012/JPEGImages/2008_008523.jpg 500 375 2 1 40 447 375 +9221 /data/VOCdevkit/VOC2012/JPEGImages/2008_008524.jpg 500 333 19 429 124 500 246 14 348 62 393 145 14 385 48 462 212 14 314 67 368 187 14 276 73 319 199 14 231 63 281 173 14 200 71 240 189 14 171 79 207 176 14 118 114 173 159 14 117 131 160 185 14 185 143 230 257 14 228 157 305 258 14 286 169 353 274 14 330 198 418 315 14 263 195 352 322 14 205 160 301 296 14 133 158 213 310 14 29 126 142 321 14 81 132 154 227 +9222 /data/VOCdevkit/VOC2012/JPEGImages/2008_008525.jpg 500 500 13 48 80 378 330 +9223 /data/VOCdevkit/VOC2012/JPEGImages/2008_008526.jpg 500 375 17 1 152 500 375 4 162 232 197 338 14 66 138 352 375 14 234 141 500 375 +9224 /data/VOCdevkit/VOC2012/JPEGImages/2008_008527.jpg 500 375 18 298 84 477 255 18 23 154 110 212 +9225 /data/VOCdevkit/VOC2012/JPEGImages/2008_008528.jpg 360 270 1 234 173 352 251 1 69 193 209 270 1 11 214 129 270 1 1 154 36 200 14 20 131 122 270 14 119 115 182 270 14 254 124 319 232 14 320 133 345 196 14 3 124 41 192 +9226 /data/VOCdevkit/VOC2012/JPEGImages/2008_008530.jpg 500 333 1 123 112 310 250 14 98 58 202 225 +9227 /data/VOCdevkit/VOC2012/JPEGImages/2008_008531.jpg 500 375 15 79 94 190 192 15 270 108 382 195 +9228 /data/VOCdevkit/VOC2012/JPEGImages/2008_008533.jpg 500 376 12 80 5 435 376 +9229 /data/VOCdevkit/VOC2012/JPEGImages/2008_008536.jpg 500 375 8 219 124 379 306 +9230 /data/VOCdevkit/VOC2012/JPEGImages/2008_008537.jpg 500 375 2 214 172 281 240 +9231 /data/VOCdevkit/VOC2012/JPEGImages/2008_008538.jpg 500 375 8 286 191 383 271 17 55 181 277 375 +9232 /data/VOCdevkit/VOC2012/JPEGImages/2008_008541.jpg 375 500 9 17 86 282 445 +9233 /data/VOCdevkit/VOC2012/JPEGImages/2008_008544.jpg 500 375 2 72 29 500 375 +9234 /data/VOCdevkit/VOC2012/JPEGImages/2008_008545.jpg 500 375 18 1 137 448 342 +9235 /data/VOCdevkit/VOC2012/JPEGImages/2008_008546.jpg 500 333 0 237 145 286 173 +9236 /data/VOCdevkit/VOC2012/JPEGImages/2008_008547.jpg 500 375 14 93 81 179 365 +9237 /data/VOCdevkit/VOC2012/JPEGImages/2008_008549.jpg 500 375 5 35 159 369 300 5 364 185 423 254 5 420 212 495 246 14 312 271 348 347 14 472 270 499 333 14 91 296 123 375 +9238 /data/VOCdevkit/VOC2012/JPEGImages/2008_008550.jpg 371 500 14 48 153 175 500 14 51 69 304 500 +9239 /data/VOCdevkit/VOC2012/JPEGImages/2008_008552.jpg 500 370 13 67 108 448 337 14 169 36 340 266 +9240 /data/VOCdevkit/VOC2012/JPEGImages/2008_008554.jpg 500 375 17 1 160 162 375 8 117 129 212 245 8 229 126 331 239 8 325 139 447 256 +9241 /data/VOCdevkit/VOC2012/JPEGImages/2008_008560.jpg 500 375 17 159 189 500 375 +9242 /data/VOCdevkit/VOC2012/JPEGImages/2008_008564.jpg 440 330 1 194 99 336 268 14 192 29 314 205 +9243 /data/VOCdevkit/VOC2012/JPEGImages/2008_008567.jpg 500 483 17 1 20 500 483 14 132 13 482 483 +9244 /data/VOCdevkit/VOC2012/JPEGImages/2008_008570.jpg 500 375 0 57 121 488 320 +9245 /data/VOCdevkit/VOC2012/JPEGImages/2008_008572.jpg 333 500 1 152 161 224 262 14 142 111 207 228 +9246 /data/VOCdevkit/VOC2012/JPEGImages/2008_008574.jpg 500 333 17 1 32 500 207 +9247 /data/VOCdevkit/VOC2012/JPEGImages/2008_008578.jpg 500 375 17 132 32 500 238 11 22 184 284 307 11 331 49 468 144 11 216 80 332 142 +9248 /data/VOCdevkit/VOC2012/JPEGImages/2008_008579.jpg 500 333 1 147 139 284 235 1 325 121 436 205 14 283 141 365 333 14 182 168 288 333 14 86 170 211 333 +9249 /data/VOCdevkit/VOC2012/JPEGImages/2008_008583.jpg 500 375 18 1 107 454 268 +9250 /data/VOCdevkit/VOC2012/JPEGImages/2008_008585.jpg 500 375 7 205 98 473 375 +9251 /data/VOCdevkit/VOC2012/JPEGImages/2008_008588.jpg 500 375 17 1 133 500 375 14 281 1 500 375 14 59 80 236 375 +9252 /data/VOCdevkit/VOC2012/JPEGImages/2008_008589.jpg 375 500 8 56 52 297 448 +9253 /data/VOCdevkit/VOC2012/JPEGImages/2008_008590.jpg 500 359 19 387 95 500 197 7 180 203 233 287 17 43 151 285 323 17 1 228 171 359 +9254 /data/VOCdevkit/VOC2012/JPEGImages/2008_008591.jpg 500 332 1 187 145 328 316 14 133 37 282 286 14 438 75 500 199 +9255 /data/VOCdevkit/VOC2012/JPEGImages/2008_008593.jpg 375 500 8 194 53 366 241 14 93 18 241 238 14 48 154 375 500 +9256 /data/VOCdevkit/VOC2012/JPEGImages/2008_008595.jpg 500 390 2 84 53 274 234 +9257 /data/VOCdevkit/VOC2012/JPEGImages/2008_008598.jpg 500 375 5 455 131 500 197 5 1 12 456 287 14 48 100 190 375 14 134 125 160 165 14 226 141 268 269 14 303 130 350 268 14 232 138 317 373 +9258 /data/VOCdevkit/VOC2012/JPEGImages/2008_008600.jpg 375 500 14 25 156 375 500 +9259 /data/VOCdevkit/VOC2012/JPEGImages/2008_008601.jpg 500 333 16 1 98 288 333 16 1 1 500 333 +9260 /data/VOCdevkit/VOC2012/JPEGImages/2008_008606.jpg 500 375 17 186 90 491 310 +9261 /data/VOCdevkit/VOC2012/JPEGImages/2008_008607.jpg 375 500 0 27 36 361 162 +9262 /data/VOCdevkit/VOC2012/JPEGImages/2008_008608.jpg 500 375 17 211 212 500 375 15 224 61 322 244 19 122 128 205 199 +9263 /data/VOCdevkit/VOC2012/JPEGImages/2008_008611.jpg 500 375 1 105 110 374 282 +9264 /data/VOCdevkit/VOC2012/JPEGImages/2008_008613.jpg 447 312 16 235 200 286 268 16 143 190 194 267 16 186 186 222 253 16 41 167 77 224 16 9 212 40 266 16 240 166 281 204 16 76 180 150 240 16 365 204 415 258 16 283 192 341 248 16 84 215 131 267 +9265 /data/VOCdevkit/VOC2012/JPEGImages/2008_008615.jpg 500 423 18 1 1 500 410 +9266 /data/VOCdevkit/VOC2012/JPEGImages/2008_008616.jpg 500 334 3 80 70 435 280 +9267 /data/VOCdevkit/VOC2012/JPEGImages/2008_008617.jpg 500 375 9 29 73 438 368 9 79 115 369 368 +9268 /data/VOCdevkit/VOC2012/JPEGImages/2008_008618.jpg 500 329 18 1 54 500 232 14 228 162 264 262 +9269 /data/VOCdevkit/VOC2012/JPEGImages/2008_008619.jpg 500 333 1 261 199 500 333 14 17 25 181 333 14 303 29 445 333 1 121 244 254 333 +9270 /data/VOCdevkit/VOC2012/JPEGImages/2008_008621.jpg 500 375 17 1 122 332 361 15 218 229 305 290 8 437 191 500 328 8 315 105 500 332 15 65 211 166 328 +9271 /data/VOCdevkit/VOC2012/JPEGImages/2008_008622.jpg 500 375 17 193 1 500 267 11 223 59 386 136 11 69 254 168 358 +9272 /data/VOCdevkit/VOC2012/JPEGImages/2008_008623.jpg 500 375 16 57 42 450 322 +9273 /data/VOCdevkit/VOC2012/JPEGImages/2008_008624.jpg 500 376 14 273 139 424 376 14 64 160 358 376 14 64 31 500 376 +9274 /data/VOCdevkit/VOC2012/JPEGImages/2008_008627.jpg 400 267 1 67 1 325 267 +9275 /data/VOCdevkit/VOC2012/JPEGImages/2008_008628.jpg 500 352 17 35 229 189 310 +9276 /data/VOCdevkit/VOC2012/JPEGImages/2008_008629.jpg 500 375 1 33 55 209 187 1 111 90 371 313 1 161 109 469 375 14 108 1 152 113 +9277 /data/VOCdevkit/VOC2012/JPEGImages/2008_008632.jpg 378 500 18 241 422 352 482 +9278 /data/VOCdevkit/VOC2012/JPEGImages/2008_008635.jpg 216 288 9 11 174 67 209 +9279 /data/VOCdevkit/VOC2012/JPEGImages/2008_008636.jpg 500 416 11 33 45 414 401 +9280 /data/VOCdevkit/VOC2012/JPEGImages/2008_008637.jpg 500 375 18 1 90 500 174 14 222 125 335 375 +9281 /data/VOCdevkit/VOC2012/JPEGImages/2008_008641.jpg 333 500 18 1 147 333 459 14 95 296 240 500 15 83 241 171 390 +9282 /data/VOCdevkit/VOC2012/JPEGImages/2008_008642.jpg 500 332 17 1 47 477 332 +9283 /data/VOCdevkit/VOC2012/JPEGImages/2008_008649.jpg 500 375 19 223 79 291 143 14 347 15 396 93 17 296 192 500 375 8 141 117 219 210 +9284 /data/VOCdevkit/VOC2012/JPEGImages/2008_008652.jpg 336 287 1 5 104 336 287 14 57 1 196 237 +9285 /data/VOCdevkit/VOC2012/JPEGImages/2008_008654.jpg 375 500 9 52 161 375 475 +9286 /data/VOCdevkit/VOC2012/JPEGImages/2008_008658.jpg 500 375 17 4 137 313 295 8 294 171 448 342 +9287 /data/VOCdevkit/VOC2012/JPEGImages/2008_008659.jpg 500 375 1 280 258 352 297 14 293 233 334 288 6 144 248 198 275 +9288 /data/VOCdevkit/VOC2012/JPEGImages/2008_008662.jpg 500 374 18 1 64 466 264 18 1 94 216 283 6 34 29 92 56 +9289 /data/VOCdevkit/VOC2012/JPEGImages/2008_008665.jpg 500 375 16 1 57 392 375 +9290 /data/VOCdevkit/VOC2012/JPEGImages/2008_008666.jpg 500 382 16 171 197 293 272 +9291 /data/VOCdevkit/VOC2012/JPEGImages/2008_008668.jpg 500 243 16 249 72 285 122 16 180 83 208 108 +9292 /data/VOCdevkit/VOC2012/JPEGImages/2008_008671.jpg 500 375 1 56 46 420 375 14 196 1 500 375 +9293 /data/VOCdevkit/VOC2012/JPEGImages/2008_008673.jpg 375 500 18 105 1 375 500 +9294 /data/VOCdevkit/VOC2012/JPEGImages/2008_008674.jpg 500 333 5 272 140 473 323 6 131 97 184 125 6 214 91 264 115 +9295 /data/VOCdevkit/VOC2012/JPEGImages/2008_008675.jpg 500 375 9 1 1 500 323 +9296 /data/VOCdevkit/VOC2012/JPEGImages/2008_008676.jpg 500 375 18 1 160 309 329 14 283 189 307 265 14 305 190 329 266 14 364 63 500 375 +9297 /data/VOCdevkit/VOC2012/JPEGImages/2008_008679.jpg 500 375 6 406 243 500 365 6 350 256 436 318 6 295 261 327 284 6 1 243 116 321 6 111 256 160 297 5 244 242 273 279 +9298 /data/VOCdevkit/VOC2012/JPEGImages/2008_008681.jpg 500 357 18 29 25 500 303 6 250 228 500 357 +9299 /data/VOCdevkit/VOC2012/JPEGImages/2008_008682.jpg 480 500 5 234 194 405 354 5 137 222 253 337 5 58 218 166 321 5 1 213 89 317 +9300 /data/VOCdevkit/VOC2012/JPEGImages/2008_008683.jpg 333 500 5 112 113 236 322 5 1 147 115 287 14 251 225 283 298 14 284 230 308 301 +9301 /data/VOCdevkit/VOC2012/JPEGImages/2008_008684.jpg 500 375 5 213 171 295 260 5 287 170 359 239 +9302 /data/VOCdevkit/VOC2012/JPEGImages/2008_008685.jpg 500 375 9 144 149 341 313 9 151 110 382 281 +9303 /data/VOCdevkit/VOC2012/JPEGImages/2008_008689.jpg 375 500 15 35 27 362 456 +9304 /data/VOCdevkit/VOC2012/JPEGImages/2008_008690.jpg 500 375 18 22 16 401 340 +9305 /data/VOCdevkit/VOC2012/JPEGImages/2008_008691.jpg 500 375 1 388 201 500 299 1 141 258 382 375 1 1 224 120 320 14 114 146 183 375 14 181 145 256 375 14 248 149 321 375 14 268 153 357 373 1 1 227 113 315 +9306 /data/VOCdevkit/VOC2012/JPEGImages/2008_008694.jpg 500 333 8 21 16 276 318 4 369 119 479 333 +9307 /data/VOCdevkit/VOC2012/JPEGImages/2008_008695.jpg 500 333 1 267 100 391 210 14 191 98 330 213 +9308 /data/VOCdevkit/VOC2012/JPEGImages/2008_008696.jpg 500 333 18 1 117 262 183 +9309 /data/VOCdevkit/VOC2012/JPEGImages/2008_008697.jpg 375 500 18 35 1 375 500 14 196 88 307 407 +9310 /data/VOCdevkit/VOC2012/JPEGImages/2008_008700.jpg 375 500 4 114 1 249 500 +9311 /data/VOCdevkit/VOC2012/JPEGImages/2008_008701.jpg 500 375 5 250 161 336 255 14 207 235 239 307 6 337 218 448 288 +9312 /data/VOCdevkit/VOC2012/JPEGImages/2008_008705.jpg 500 375 5 240 114 484 286 5 7 149 209 246 14 5 206 42 305 14 208 218 224 253 14 37 217 55 291 +9313 /data/VOCdevkit/VOC2012/JPEGImages/2008_008706.jpg 375 500 5 156 360 238 460 +9314 /data/VOCdevkit/VOC2012/JPEGImages/2008_008707.jpg 500 335 1 1 184 65 265 1 64 178 173 258 1 163 182 268 257 1 293 182 370 254 1 369 184 455 252 +9315 /data/VOCdevkit/VOC2012/JPEGImages/2008_008708.jpg 333 500 1 158 210 263 430 14 148 151 270 365 +9316 /data/VOCdevkit/VOC2012/JPEGImages/2008_008711.jpg 500 375 1 14 31 486 343 +9317 /data/VOCdevkit/VOC2012/JPEGImages/2008_008713.jpg 500 333 9 184 148 291 201 +9318 /data/VOCdevkit/VOC2012/JPEGImages/2008_008714.jpg 500 375 11 183 157 207 202 16 262 173 376 285 16 187 189 286 275 16 298 175 416 267 +9319 /data/VOCdevkit/VOC2012/JPEGImages/2008_008717.jpg 333 500 14 89 39 258 337 1 98 158 232 404 14 268 127 302 198 +9320 /data/VOCdevkit/VOC2012/JPEGImages/2008_008718.jpg 500 500 1 262 270 478 433 1 10 340 109 437 14 277 184 485 431 14 16 284 105 439 +9321 /data/VOCdevkit/VOC2012/JPEGImages/2008_008719.jpg 500 375 5 26 91 500 375 +9322 /data/VOCdevkit/VOC2012/JPEGImages/2008_008724.jpg 500 375 1 1 79 137 375 1 62 22 441 375 1 130 1 396 285 1 314 1 500 227 +9323 /data/VOCdevkit/VOC2012/JPEGImages/2008_008725.jpg 500 375 1 347 178 399 245 14 347 144 395 225 +9324 /data/VOCdevkit/VOC2012/JPEGImages/2008_008726.jpg 500 375 18 55 150 492 258 +9325 /data/VOCdevkit/VOC2012/JPEGImages/2008_008732.jpg 500 362 18 108 104 399 315 +9326 /data/VOCdevkit/VOC2012/JPEGImages/2008_008735.jpg 500 333 18 99 85 297 290 +9327 /data/VOCdevkit/VOC2012/JPEGImages/2008_008739.jpg 375 500 18 1 45 210 273 +9328 /data/VOCdevkit/VOC2012/JPEGImages/2008_008744.jpg 500 375 16 1 125 288 338 14 262 77 401 313 +9329 /data/VOCdevkit/VOC2012/JPEGImages/2008_008745.jpg 500 371 1 384 145 500 260 1 328 272 500 371 14 292 18 405 274 14 213 86 320 246 +9330 /data/VOCdevkit/VOC2012/JPEGImages/2008_008746.jpg 357 500 2 68 93 335 377 +9331 /data/VOCdevkit/VOC2012/JPEGImages/2008_008748.jpg 500 348 5 51 17 431 318 +9332 /data/VOCdevkit/VOC2012/JPEGImages/2008_008749.jpg 500 334 18 31 52 416 289 +9333 /data/VOCdevkit/VOC2012/JPEGImages/2008_008751.jpg 500 316 18 1 226 411 316 +9334 /data/VOCdevkit/VOC2012/JPEGImages/2008_008753.jpg 500 375 1 80 1 489 312 +9335 /data/VOCdevkit/VOC2012/JPEGImages/2008_008755.jpg 333 500 14 116 242 151 346 14 149 229 179 347 1 138 283 170 347 +9336 /data/VOCdevkit/VOC2012/JPEGImages/2008_008757.jpg 500 375 18 282 1 500 375 14 148 116 176 184 14 172 105 225 228 14 229 99 274 202 +9337 /data/VOCdevkit/VOC2012/JPEGImages/2008_008758.jpg 500 375 1 216 218 284 311 14 220 158 283 289 +9338 /data/VOCdevkit/VOC2012/JPEGImages/2008_008765.jpg 500 375 0 111 114 441 239 +9339 /data/VOCdevkit/VOC2012/JPEGImages/2008_008767.jpg 500 374 18 1 29 150 182 +9340 /data/VOCdevkit/VOC2012/JPEGImages/2008_008770.jpg 333 500 18 1 1 333 500 +9341 /data/VOCdevkit/VOC2012/JPEGImages/2008_008772.jpg 500 375 17 131 161 446 297 +9342 /data/VOCdevkit/VOC2012/JPEGImages/2008_008773.jpg 500 376 10 27 254 285 376 +9343 /data/VOCdevkit/VOC2012/JPEGImages/2009_000001.jpg 360 270 12 149 87 338 238 12 33 107 184 251 +9344 /data/VOCdevkit/VOC2012/JPEGImages/2009_000002.jpg 500 356 7 66 199 306 356 11 109 66 229 221 +9345 /data/VOCdevkit/VOC2012/JPEGImages/2009_000006.jpg 500 408 5 38 9 286 330 +9346 /data/VOCdevkit/VOC2012/JPEGImages/2009_000009.jpg 500 375 3 203 159 227 197 3 265 178 289 189 2 13 182 25 204 +9347 /data/VOCdevkit/VOC2012/JPEGImages/2009_000010.jpg 500 375 19 36 153 124 241 8 72 205 164 286 14 157 57 346 267 +9348 /data/VOCdevkit/VOC2012/JPEGImages/2009_000011.jpg 500 332 18 139 167 428 291 18 444 209 469 241 +9349 /data/VOCdevkit/VOC2012/JPEGImages/2009_000012.jpg 418 292 12 89 61 321 204 +9350 /data/VOCdevkit/VOC2012/JPEGImages/2009_000013.jpg 500 332 7 85 116 247 273 7 233 122 485 281 +9351 /data/VOCdevkit/VOC2012/JPEGImages/2009_000014.jpg 500 375 19 342 105 448 209 8 106 174 214 298 17 1 262 82 373 +9352 /data/VOCdevkit/VOC2012/JPEGImages/2009_000015.jpg 500 375 1 96 174 203 345 +9353 /data/VOCdevkit/VOC2012/JPEGImages/2009_000016.jpg 500 375 17 1 14 500 375 11 2 102 469 324 +9354 /data/VOCdevkit/VOC2012/JPEGImages/2009_000017.jpg 500 334 12 92 168 357 334 14 202 100 252 272 14 263 97 323 186 12 179 145 443 334 +9355 /data/VOCdevkit/VOC2012/JPEGImages/2009_000021.jpg 318 500 6 39 152 215 308 6 216 172 311 279 6 1 153 47 244 14 260 138 315 295 14 297 165 318 309 14 260 150 280 183 14 207 156 228 213 14 180 150 204 210 14 13 133 35 171 14 32 138 53 195 14 54 149 69 195 +9356 /data/VOCdevkit/VOC2012/JPEGImages/2009_000022.jpg 500 375 18 62 142 367 208 +9357 /data/VOCdevkit/VOC2012/JPEGImages/2009_000026.jpg 500 440 2 115 117 383 362 +9358 /data/VOCdevkit/VOC2012/JPEGImages/2009_000027.jpg 500 375 6 449 172 484 189 6 441 180 488 230 5 15 64 451 292 6 1 141 19 316 +9359 /data/VOCdevkit/VOC2012/JPEGImages/2009_000028.jpg 500 333 8 399 154 468 226 8 312 150 382 222 8 227 152 295 221 8 147 150 213 220 +9360 /data/VOCdevkit/VOC2012/JPEGImages/2009_000029.jpg 375 500 11 1 132 375 497 +9361 /data/VOCdevkit/VOC2012/JPEGImages/2009_000030.jpg 500 375 7 72 1 500 375 +9362 /data/VOCdevkit/VOC2012/JPEGImages/2009_000032.jpg 500 334 0 59 95 491 216 +9363 /data/VOCdevkit/VOC2012/JPEGImages/2009_000035.jpg 359 500 2 80 182 237 252 +9364 /data/VOCdevkit/VOC2012/JPEGImages/2009_000037.jpg 500 363 2 162 125 310 303 +9365 /data/VOCdevkit/VOC2012/JPEGImages/2009_000039.jpg 500 333 16 191 134 328 280 +9366 /data/VOCdevkit/VOC2012/JPEGImages/2009_000040.jpg 500 334 2 102 16 433 274 +9367 /data/VOCdevkit/VOC2012/JPEGImages/2009_000041.jpg 500 375 19 192 28 452 235 19 25 95 214 326 +9368 /data/VOCdevkit/VOC2012/JPEGImages/2009_000042.jpg 500 375 6 243 130 390 184 +9369 /data/VOCdevkit/VOC2012/JPEGImages/2009_000045.jpg 500 375 11 47 1 500 375 +9370 /data/VOCdevkit/VOC2012/JPEGImages/2009_000051.jpg 500 327 18 92 89 390 217 18 436 155 477 183 18 403 153 435 185 +9371 /data/VOCdevkit/VOC2012/JPEGImages/2009_000052.jpg 500 333 0 103 101 414 220 +9372 /data/VOCdevkit/VOC2012/JPEGImages/2009_000054.jpg 500 375 5 58 164 333 347 14 181 216 206 266 +9373 /data/VOCdevkit/VOC2012/JPEGImages/2009_000055.jpg 500 375 1 322 148 457 355 +9374 /data/VOCdevkit/VOC2012/JPEGImages/2009_000056.jpg 393 500 14 317 357 363 482 14 265 371 302 477 14 197 362 235 487 14 246 367 272 441 14 98 391 141 472 8 121 423 162 474 +9375 /data/VOCdevkit/VOC2012/JPEGImages/2009_000058.jpg 375 500 10 1 331 375 500 4 348 191 372 286 4 324 220 347 285 4 174 234 218 393 14 1 69 73 398 14 27 85 180 334 14 200 70 340 347 +9376 /data/VOCdevkit/VOC2012/JPEGImages/2009_000059.jpg 500 335 14 122 72 357 302 8 1 12 500 335 +9377 /data/VOCdevkit/VOC2012/JPEGImages/2009_000060.jpg 500 375 5 98 23 476 329 6 479 184 500 233 14 189 107 242 153 +9378 /data/VOCdevkit/VOC2012/JPEGImages/2009_000063.jpg 375 500 14 1 91 375 500 +9379 /data/VOCdevkit/VOC2012/JPEGImages/2009_000066.jpg 375 500 9 284 161 339 225 9 102 155 191 227 9 1 158 90 265 +9380 /data/VOCdevkit/VOC2012/JPEGImages/2009_000067.jpg 500 334 14 184 180 220 307 14 225 140 270 308 14 246 187 291 305 14 289 186 325 301 14 333 143 381 304 14 406 183 453 307 +9381 /data/VOCdevkit/VOC2012/JPEGImages/2009_000068.jpg 384 500 12 46 62 310 423 +9382 /data/VOCdevkit/VOC2012/JPEGImages/2009_000072.jpg 375 500 14 39 43 170 404 14 143 95 274 446 14 212 48 356 391 +9383 /data/VOCdevkit/VOC2012/JPEGImages/2009_000073.jpg 333 500 18 97 141 333 387 +9384 /data/VOCdevkit/VOC2012/JPEGImages/2009_000074.jpg 500 333 13 73 21 397 320 14 143 25 334 224 +9385 /data/VOCdevkit/VOC2012/JPEGImages/2009_000078.jpg 500 333 6 95 117 404 225 14 208 123 241 152 14 231 1 261 32 14 193 1 226 32 14 57 1 93 47 14 77 9 115 41 14 5 1 41 50 +9386 /data/VOCdevkit/VOC2012/JPEGImages/2009_000080.jpg 500 375 7 96 38 328 297 +9387 /data/VOCdevkit/VOC2012/JPEGImages/2009_000082.jpg 500 336 8 315 80 469 315 8 164 86 299 314 8 27 73 165 316 +9388 /data/VOCdevkit/VOC2012/JPEGImages/2009_000084.jpg 500 334 0 1 38 500 334 +9389 /data/VOCdevkit/VOC2012/JPEGImages/2009_000085.jpg 500 375 14 143 183 172 239 +9390 /data/VOCdevkit/VOC2012/JPEGImages/2009_000087.jpg 500 455 17 215 262 450 371 +9391 /data/VOCdevkit/VOC2012/JPEGImages/2009_000088.jpg 500 335 11 169 52 382 335 +9392 /data/VOCdevkit/VOC2012/JPEGImages/2009_000089.jpg 500 375 5 59 59 462 287 6 1 202 85 300 6 460 189 500 227 +9393 /data/VOCdevkit/VOC2012/JPEGImages/2009_000090.jpg 500 333 18 93 115 261 235 +9394 /data/VOCdevkit/VOC2012/JPEGImages/2009_000091.jpg 500 330 9 54 1 500 330 +9395 /data/VOCdevkit/VOC2012/JPEGImages/2009_000093.jpg 500 374 3 1 27 450 282 +9396 /data/VOCdevkit/VOC2012/JPEGImages/2009_000096.jpg 500 375 17 1 145 169 319 17 255 138 448 221 8 109 113 158 161 +9397 /data/VOCdevkit/VOC2012/JPEGImages/2009_000097.jpg 500 333 5 185 128 408 215 6 36 162 135 199 6 411 152 467 179 6 462 156 492 179 +9398 /data/VOCdevkit/VOC2012/JPEGImages/2009_000100.jpg 333 500 12 100 86 277 449 +9399 /data/VOCdevkit/VOC2012/JPEGImages/2009_000102.jpg 500 333 14 6 87 40 168 +9400 /data/VOCdevkit/VOC2012/JPEGImages/2009_000103.jpg 380 500 2 152 87 275 457 +9401 /data/VOCdevkit/VOC2012/JPEGImages/2009_000104.jpg 500 333 5 57 49 439 219 +9402 /data/VOCdevkit/VOC2012/JPEGImages/2009_000105.jpg 500 375 18 199 135 369 210 1 465 178 500 212 1 475 181 500 216 +9403 /data/VOCdevkit/VOC2012/JPEGImages/2009_000109.jpg 500 375 10 39 35 448 375 8 38 88 147 344 8 187 186 397 375 8 319 123 500 374 8 115 30 215 60 +9404 /data/VOCdevkit/VOC2012/JPEGImages/2009_000119.jpg 500 377 13 208 174 354 348 13 371 202 441 289 14 245 161 326 313 14 380 173 436 273 +9405 /data/VOCdevkit/VOC2012/JPEGImages/2009_000120.jpg 367 500 3 6 48 293 441 +9406 /data/VOCdevkit/VOC2012/JPEGImages/2009_000121.jpg 375 500 4 86 1 181 210 4 212 1 332 202 4 313 1 375 190 4 130 17 278 481 6 162 356 254 419 +9407 /data/VOCdevkit/VOC2012/JPEGImages/2009_000122.jpg 500 333 0 25 95 476 220 +9408 /data/VOCdevkit/VOC2012/JPEGImages/2009_000124.jpg 500 375 2 314 137 419 185 2 249 261 319 291 +9409 /data/VOCdevkit/VOC2012/JPEGImages/2009_000128.jpg 375 500 14 124 407 183 500 +9410 /data/VOCdevkit/VOC2012/JPEGImages/2009_000130.jpg 333 500 4 140 6 275 493 +9411 /data/VOCdevkit/VOC2012/JPEGImages/2009_000131.jpg 500 397 13 365 90 500 274 13 14 37 490 388 +9412 /data/VOCdevkit/VOC2012/JPEGImages/2009_000132.jpg 500 500 7 1 16 500 500 14 2 1 499 426 +9413 /data/VOCdevkit/VOC2012/JPEGImages/2009_000133.jpg 500 273 0 111 144 383 234 +9414 /data/VOCdevkit/VOC2012/JPEGImages/2009_000135.jpg 500 375 5 36 145 468 275 +9415 /data/VOCdevkit/VOC2012/JPEGImages/2009_000136.jpg 500 333 19 1 109 88 240 +9416 /data/VOCdevkit/VOC2012/JPEGImages/2009_000137.jpg 500 375 18 20 53 476 363 18 441 85 500 297 +9417 /data/VOCdevkit/VOC2012/JPEGImages/2009_000140.jpg 500 375 6 479 192 489 203 6 464 191 480 205 6 441 192 464 208 6 431 190 440 207 5 88 64 431 317 14 289 152 324 192 6 3 201 97 256 6 1 209 23 265 14 151 134 202 185 14 190 141 223 195 14 448 239 476 320 14 474 206 500 324 14 493 191 500 228 6 429 205 439 237 +9418 /data/VOCdevkit/VOC2012/JPEGImages/2009_000141.jpg 500 278 10 1 91 364 278 14 322 6 500 278 14 172 41 270 185 14 68 13 167 153 14 21 3 99 132 14 1 3 31 103 +9419 /data/VOCdevkit/VOC2012/JPEGImages/2009_000142.jpg 500 375 11 12 184 275 352 11 117 101 379 243 11 199 50 473 228 17 1 1 493 375 +9420 /data/VOCdevkit/VOC2012/JPEGImages/2009_000145.jpg 500 374 14 118 73 241 279 11 318 189 443 274 +9421 /data/VOCdevkit/VOC2012/JPEGImages/2009_000146.jpg 357 500 2 107 92 243 401 +9422 /data/VOCdevkit/VOC2012/JPEGImages/2009_000149.jpg 333 500 14 241 165 333 291 1 16 158 259 460 +9423 /data/VOCdevkit/VOC2012/JPEGImages/2009_000150.jpg 375 500 7 145 11 344 231 +9424 /data/VOCdevkit/VOC2012/JPEGImages/2009_000151.jpg 500 375 2 231 189 333 248 +9425 /data/VOCdevkit/VOC2012/JPEGImages/2009_000156.jpg 500 333 11 152 123 267 242 +9426 /data/VOCdevkit/VOC2012/JPEGImages/2009_000157.jpg 333 500 19 60 256 129 323 19 286 258 333 337 14 112 148 247 314 8 66 322 121 366 14 105 226 251 400 +9427 /data/VOCdevkit/VOC2012/JPEGImages/2009_000158.jpg 500 375 15 22 1 455 375 +9428 /data/VOCdevkit/VOC2012/JPEGImages/2009_000159.jpg 500 333 0 259 103 349 136 0 13 103 473 203 +9429 /data/VOCdevkit/VOC2012/JPEGImages/2009_000160.jpg 375 500 6 1 307 251 391 6 1 311 56 336 6 158 304 246 329 +9430 /data/VOCdevkit/VOC2012/JPEGImages/2009_000161.jpg 500 374 1 47 118 211 370 +9431 /data/VOCdevkit/VOC2012/JPEGImages/2009_000164.jpg 500 375 14 188 166 310 361 14 133 89 351 375 8 224 213 447 375 10 2 91 108 218 8 57 76 113 193 8 2 113 44 204 8 1 73 16 95 8 88 67 106 89 15 36 71 67 108 +9432 /data/VOCdevkit/VOC2012/JPEGImages/2009_000165.jpg 500 375 6 139 139 262 218 14 483 103 500 155 +9433 /data/VOCdevkit/VOC2012/JPEGImages/2009_000168.jpg 500 333 16 235 118 347 233 14 82 34 238 333 +9434 /data/VOCdevkit/VOC2012/JPEGImages/2009_000169.jpg 480 359 12 12 54 459 316 14 1 228 55 319 14 383 103 419 188 14 399 40 443 177 14 404 1 446 62 12 332 36 480 150 6 239 53 315 79 6 167 60 218 75 +9435 /data/VOCdevkit/VOC2012/JPEGImages/2009_000171.jpg 375 500 4 293 323 315 401 14 42 149 311 497 +9436 /data/VOCdevkit/VOC2012/JPEGImages/2009_000176.jpg 500 375 5 309 109 500 237 5 1 135 72 202 5 43 145 385 256 +9437 /data/VOCdevkit/VOC2012/JPEGImages/2009_000177.jpg 500 375 18 41 120 500 285 +9438 /data/VOCdevkit/VOC2012/JPEGImages/2009_000181.jpg 500 444 11 39 30 444 433 +9439 /data/VOCdevkit/VOC2012/JPEGImages/2009_000182.jpg 375 500 8 1 179 18 212 8 46 154 85 207 8 138 149 168 193 8 188 149 207 190 8 215 148 244 186 8 206 146 231 186 8 31 196 375 500 14 103 203 375 476 8 276 144 298 182 8 257 143 273 169 8 245 153 261 169 8 332 163 375 216 8 301 151 355 193 +9440 /data/VOCdevkit/VOC2012/JPEGImages/2009_000183.jpg 500 375 14 1 25 500 375 +9441 /data/VOCdevkit/VOC2012/JPEGImages/2009_000184.jpg 500 375 13 29 33 483 328 +9442 /data/VOCdevkit/VOC2012/JPEGImages/2009_000188.jpg 375 500 10 89 261 367 500 8 192 270 357 497 8 89 241 242 469 8 116 226 184 273 8 231 231 329 442 +9443 /data/VOCdevkit/VOC2012/JPEGImages/2009_000189.jpg 334 500 11 52 150 288 436 17 1 87 334 500 +9444 /data/VOCdevkit/VOC2012/JPEGImages/2009_000192.jpg 500 333 8 174 62 306 250 +9445 /data/VOCdevkit/VOC2012/JPEGImages/2009_000195.jpg 500 375 1 123 1 370 370 +9446 /data/VOCdevkit/VOC2012/JPEGImages/2009_000197.jpg 500 400 14 401 121 423 178 1 418 155 465 171 1 376 162 431 183 +9447 /data/VOCdevkit/VOC2012/JPEGImages/2009_000198.jpg 500 375 8 236 100 346 290 8 15 107 180 339 15 402 105 500 313 15 452 203 500 340 15 316 175 439 294 +9448 /data/VOCdevkit/VOC2012/JPEGImages/2009_000199.jpg 500 375 5 103 117 454 284 +9449 /data/VOCdevkit/VOC2012/JPEGImages/2009_000201.jpg 333 500 4 156 76 245 411 +9450 /data/VOCdevkit/VOC2012/JPEGImages/2009_000203.jpg 500 375 5 221 105 340 245 6 354 197 407 236 +9451 /data/VOCdevkit/VOC2012/JPEGImages/2009_000205.jpg 500 375 0 1 103 362 216 +9452 /data/VOCdevkit/VOC2012/JPEGImages/2009_000206.jpg 500 485 2 138 87 286 367 +9453 /data/VOCdevkit/VOC2012/JPEGImages/2009_000209.jpg 375 500 8 115 209 315 475 +9454 /data/VOCdevkit/VOC2012/JPEGImages/2009_000212.jpg 375 500 8 217 221 298 414 8 159 215 219 385 8 72 222 153 411 8 141 238 226 452 10 88 226 291 435 6 194 192 268 226 6 190 177 227 205 6 254 172 298 197 +9455 /data/VOCdevkit/VOC2012/JPEGImages/2009_000214.jpg 500 333 19 179 109 228 173 8 230 179 348 333 15 257 148 291 197 +9456 /data/VOCdevkit/VOC2012/JPEGImages/2009_000216.jpg 282 500 19 8 12 280 265 +9457 /data/VOCdevkit/VOC2012/JPEGImages/2009_000217.jpg 500 375 17 1 223 165 375 15 14 171 32 193 15 13 102 30 125 15 21 64 40 86 +9458 /data/VOCdevkit/VOC2012/JPEGImages/2009_000218.jpg 500 442 2 77 176 431 417 2 6 13 481 206 +9459 /data/VOCdevkit/VOC2012/JPEGImages/2009_000219.jpg 500 404 9 42 147 389 404 14 374 23 500 404 9 203 115 413 274 +9460 /data/VOCdevkit/VOC2012/JPEGImages/2009_000223.jpg 500 375 14 37 196 62 243 16 242 141 333 269 16 360 197 418 253 13 187 211 276 247 13 104 201 191 244 +9461 /data/VOCdevkit/VOC2012/JPEGImages/2009_000225.jpg 500 334 0 28 152 421 238 6 1 230 59 266 6 48 237 110 268 6 87 235 156 271 6 143 246 200 273 6 173 245 228 275 6 234 254 252 273 6 330 258 370 281 6 295 261 307 275 +9462 /data/VOCdevkit/VOC2012/JPEGImages/2009_000227.jpg 500 375 7 1 1 492 361 +9463 /data/VOCdevkit/VOC2012/JPEGImages/2009_000229.jpg 500 441 2 260 174 377 264 +9464 /data/VOCdevkit/VOC2012/JPEGImages/2009_000232.jpg 299 500 11 42 37 281 500 8 1 101 53 276 +9465 /data/VOCdevkit/VOC2012/JPEGImages/2009_000233.jpg 500 375 13 17 34 429 369 +9466 /data/VOCdevkit/VOC2012/JPEGImages/2009_000237.jpg 500 375 1 207 202 471 375 14 210 20 386 373 1 85 174 137 272 14 84 115 144 249 14 127 119 157 209 1 131 159 157 228 +9467 /data/VOCdevkit/VOC2012/JPEGImages/2009_000239.jpg 500 375 5 13 51 486 330 5 452 138 500 232 14 266 138 304 217 +9468 /data/VOCdevkit/VOC2012/JPEGImages/2009_000242.jpg 500 375 17 54 218 476 375 +9469 /data/VOCdevkit/VOC2012/JPEGImages/2009_000244.jpg 500 334 18 54 113 414 219 +9470 /data/VOCdevkit/VOC2012/JPEGImages/2009_000247.jpg 500 375 4 181 113 218 148 4 355 96 374 171 4 405 98 430 159 4 181 135 218 251 4 55 113 75 170 4 66 136 103 207 14 74 8 250 365 14 264 2 425 171 14 226 1 500 375 14 1 157 116 375 10 23 138 425 375 +9471 /data/VOCdevkit/VOC2012/JPEGImages/2009_000248.jpg 500 333 12 123 117 421 315 14 230 42 295 239 +9472 /data/VOCdevkit/VOC2012/JPEGImages/2009_000249.jpg 500 333 7 1 55 396 333 14 1 1 500 333 +9473 /data/VOCdevkit/VOC2012/JPEGImages/2009_000250.jpg 500 333 9 1 81 325 313 +9474 /data/VOCdevkit/VOC2012/JPEGImages/2009_000251.jpg 500 375 17 231 200 479 375 8 29 162 171 295 15 382 72 448 121 +9475 /data/VOCdevkit/VOC2012/JPEGImages/2009_000253.jpg 500 332 14 244 206 347 332 +9476 /data/VOCdevkit/VOC2012/JPEGImages/2009_000254.jpg 500 333 2 58 28 429 294 +9477 /data/VOCdevkit/VOC2012/JPEGImages/2009_000257.jpg 500 333 10 1 176 500 333 14 223 80 500 179 4 446 48 500 173 14 1 61 134 183 +9478 /data/VOCdevkit/VOC2012/JPEGImages/2009_000260.jpg 500 325 0 1 133 485 226 +9479 /data/VOCdevkit/VOC2012/JPEGImages/2009_000268.jpg 375 500 12 116 138 235 413 +9480 /data/VOCdevkit/VOC2012/JPEGImages/2009_000276.jpg 500 375 13 1 1 500 375 +9481 /data/VOCdevkit/VOC2012/JPEGImages/2009_000277.jpg 374 500 4 1 98 222 500 14 119 35 374 500 +9482 /data/VOCdevkit/VOC2012/JPEGImages/2009_000280.jpg 500 304 6 263 132 347 184 13 477 144 500 174 13 125 141 165 186 14 126 134 166 179 +9483 /data/VOCdevkit/VOC2012/JPEGImages/2009_000281.jpg 500 375 1 64 21 444 314 1 1 34 186 200 +9484 /data/VOCdevkit/VOC2012/JPEGImages/2009_000282.jpg 494 500 11 177 213 303 427 14 161 123 339 397 6 148 129 176 150 +9485 /data/VOCdevkit/VOC2012/JPEGImages/2009_000283.jpg 500 375 18 115 80 340 351 6 1 74 33 100 14 231 107 244 131 +9486 /data/VOCdevkit/VOC2012/JPEGImages/2009_000284.jpg 347 500 7 60 30 249 500 +9487 /data/VOCdevkit/VOC2012/JPEGImages/2009_000285.jpg 333 500 9 99 182 333 500 9 215 433 255 466 +9488 /data/VOCdevkit/VOC2012/JPEGImages/2009_000286.jpg 375 500 1 1 1 375 500 +9489 /data/VOCdevkit/VOC2012/JPEGImages/2009_000287.jpg 500 333 11 220 63 437 180 +9490 /data/VOCdevkit/VOC2012/JPEGImages/2009_000288.jpg 500 334 6 119 29 390 301 14 403 52 429 119 14 417 58 452 145 14 467 32 500 178 6 1 94 99 132 6 447 65 475 149 +9491 /data/VOCdevkit/VOC2012/JPEGImages/2009_000289.jpg 500 375 16 104 203 287 296 +9492 /data/VOCdevkit/VOC2012/JPEGImages/2009_000290.jpg 500 375 5 201 161 266 201 14 357 174 366 199 14 368 171 376 197 6 130 181 141 190 +9493 /data/VOCdevkit/VOC2012/JPEGImages/2009_000291.jpg 500 366 14 1 1 456 366 +9494 /data/VOCdevkit/VOC2012/JPEGImages/2009_000293.jpg 500 334 12 1 34 397 334 12 78 1 387 334 +9495 /data/VOCdevkit/VOC2012/JPEGImages/2009_000297.jpg 500 333 15 48 1 500 333 +9496 /data/VOCdevkit/VOC2012/JPEGImages/2009_000298.jpg 335 500 8 1 267 167 500 8 190 116 331 353 8 90 105 217 290 8 16 94 144 264 8 1 92 83 238 8 1 254 68 356 +9497 /data/VOCdevkit/VOC2012/JPEGImages/2009_000300.jpg 500 333 10 1 78 500 333 17 94 1 500 209 +9498 /data/VOCdevkit/VOC2012/JPEGImages/2009_000303.jpg 500 394 7 1 1 453 379 +9499 /data/VOCdevkit/VOC2012/JPEGImages/2009_000304.jpg 500 375 7 77 150 365 329 8 1 1 500 375 +9500 /data/VOCdevkit/VOC2012/JPEGImages/2009_000305.jpg 500 332 14 211 55 396 258 3 1 232 500 332 +9501 /data/VOCdevkit/VOC2012/JPEGImages/2009_000308.jpg 500 281 3 126 112 170 163 +9502 /data/VOCdevkit/VOC2012/JPEGImages/2009_000309.jpg 500 375 9 6 7 333 289 9 203 110 339 219 9 154 3 396 227 14 316 78 495 375 +9503 /data/VOCdevkit/VOC2012/JPEGImages/2009_000312.jpg 500 375 12 175 36 500 375 +9504 /data/VOCdevkit/VOC2012/JPEGImages/2009_000316.jpg 500 375 17 243 133 500 352 8 183 156 247 218 8 47 232 83 293 +9505 /data/VOCdevkit/VOC2012/JPEGImages/2009_000317.jpg 500 379 2 32 5 500 379 +9506 /data/VOCdevkit/VOC2012/JPEGImages/2009_000318.jpg 500 375 2 199 124 294 225 2 1 1 109 165 +9507 /data/VOCdevkit/VOC2012/JPEGImages/2009_000320.jpg 500 333 0 270 7 364 63 0 306 44 402 104 0 209 88 304 146 0 341 82 439 146 0 241 131 335 187 0 263 175 359 231 0 166 220 258 276 0 178 262 273 320 +9508 /data/VOCdevkit/VOC2012/JPEGImages/2009_000321.jpg 333 500 11 48 57 333 500 +9509 /data/VOCdevkit/VOC2012/JPEGImages/2009_000322.jpg 375 500 14 54 26 375 426 +9510 /data/VOCdevkit/VOC2012/JPEGImages/2009_000327.jpg 500 334 0 1 1 500 319 +9511 /data/VOCdevkit/VOC2012/JPEGImages/2009_000328.jpg 375 500 4 203 276 220 321 +9512 /data/VOCdevkit/VOC2012/JPEGImages/2009_000330.jpg 500 500 7 105 49 500 500 +9513 /data/VOCdevkit/VOC2012/JPEGImages/2009_000335.jpg 500 333 5 112 47 384 269 6 411 184 500 254 5 1 113 145 259 +9514 /data/VOCdevkit/VOC2012/JPEGImages/2009_000336.jpg 500 333 19 4 31 268 284 +9515 /data/VOCdevkit/VOC2012/JPEGImages/2009_000337.jpg 500 334 14 99 226 172 334 14 295 51 466 334 +9516 /data/VOCdevkit/VOC2012/JPEGImages/2009_000339.jpg 500 357 11 47 7 454 357 +9517 /data/VOCdevkit/VOC2012/JPEGImages/2009_000340.jpg 375 500 14 16 356 71 500 14 260 332 375 500 4 43 250 101 395 4 147 63 185 165 14 35 157 326 500 +9518 /data/VOCdevkit/VOC2012/JPEGImages/2009_000341.jpg 500 333 13 1 15 500 278 6 465 48 500 90 6 352 50 383 85 +9519 /data/VOCdevkit/VOC2012/JPEGImages/2009_000342.jpg 500 375 7 1 89 319 375 7 115 130 491 375 17 1 1 339 165 +9520 /data/VOCdevkit/VOC2012/JPEGImages/2009_000343.jpg 500 375 14 396 100 434 196 14 365 106 395 194 14 391 99 406 118 13 289 131 352 194 13 259 147 325 239 13 186 140 271 224 14 187 116 236 154 13 3 138 154 339 +9521 /data/VOCdevkit/VOC2012/JPEGImages/2009_000344.jpg 500 375 1 64 4 440 348 +9522 /data/VOCdevkit/VOC2012/JPEGImages/2009_000347.jpg 500 333 18 84 15 433 308 +9523 /data/VOCdevkit/VOC2012/JPEGImages/2009_000350.jpg 500 461 7 1 35 500 461 +9524 /data/VOCdevkit/VOC2012/JPEGImages/2009_000351.jpg 500 375 1 40 242 371 375 +9525 /data/VOCdevkit/VOC2012/JPEGImages/2009_000354.jpg 500 375 1 1 1 500 375 +9526 /data/VOCdevkit/VOC2012/JPEGImages/2009_000356.jpg 500 375 16 268 35 481 375 16 16 64 263 333 16 442 84 494 168 16 91 44 158 99 16 1 55 43 169 16 179 28 222 67 16 235 48 269 136 16 279 44 313 73 16 262 56 284 136 16 157 44 182 67 16 39 53 91 110 16 453 167 500 252 +9527 /data/VOCdevkit/VOC2012/JPEGImages/2009_000366.jpg 500 375 7 134 145 329 342 +9528 /data/VOCdevkit/VOC2012/JPEGImages/2009_000367.jpg 500 325 0 27 181 71 224 0 12 128 479 276 +9529 /data/VOCdevkit/VOC2012/JPEGImages/2009_000370.jpg 500 332 2 31 73 388 332 +9530 /data/VOCdevkit/VOC2012/JPEGImages/2009_000375.jpg 332 500 17 1 383 200 500 14 1 187 178 447 14 230 47 332 452 14 1 144 129 260 14 30 1 159 228 14 150 1 222 192 14 189 1 271 149 +9531 /data/VOCdevkit/VOC2012/JPEGImages/2009_000377.jpg 333 500 4 96 1 275 500 +9532 /data/VOCdevkit/VOC2012/JPEGImages/2009_000378.jpg 500 375 3 1 30 500 375 14 110 32 232 375 14 233 108 266 145 14 128 105 156 179 +9533 /data/VOCdevkit/VOC2012/JPEGImages/2009_000379.jpg 500 375 17 1 1 500 375 14 62 111 430 256 +9534 /data/VOCdevkit/VOC2012/JPEGImages/2009_000385.jpg 500 375 3 119 141 379 261 +9535 /data/VOCdevkit/VOC2012/JPEGImages/2009_000387.jpg 500 324 0 51 128 487 273 +9536 /data/VOCdevkit/VOC2012/JPEGImages/2009_000389.jpg 500 178 2 350 30 421 66 2 233 58 303 111 2 134 60 208 96 +9537 /data/VOCdevkit/VOC2012/JPEGImages/2009_000390.jpg 500 333 6 112 7 500 285 6 27 132 123 182 +9538 /data/VOCdevkit/VOC2012/JPEGImages/2009_000391.jpg 500 333 19 80 18 249 202 8 1 82 68 283 +9539 /data/VOCdevkit/VOC2012/JPEGImages/2009_000393.jpg 375 500 2 82 194 232 301 +9540 /data/VOCdevkit/VOC2012/JPEGImages/2009_000397.jpg 500 335 6 172 207 446 290 14 297 220 337 303 14 52 205 71 273 14 75 200 94 276 0 41 92 465 227 14 188 191 216 249 14 231 200 250 223 14 91 208 103 274 +9541 /data/VOCdevkit/VOC2012/JPEGImages/2009_000398.jpg 400 500 19 89 338 275 500 19 182 307 225 325 19 142 324 231 349 +9542 /data/VOCdevkit/VOC2012/JPEGImages/2009_000399.jpg 500 333 6 115 104 454 256 +9543 /data/VOCdevkit/VOC2012/JPEGImages/2009_000400.jpg 333 500 11 1 43 228 459 11 55 262 156 332 11 56 303 144 376 11 53 334 128 413 +9544 /data/VOCdevkit/VOC2012/JPEGImages/2009_000402.jpg 500 375 13 46 22 468 323 6 3 1 500 237 +9545 /data/VOCdevkit/VOC2012/JPEGImages/2009_000405.jpg 500 375 5 19 1 300 374 6 383 1 446 38 14 367 12 435 197 14 438 53 471 278 +9546 /data/VOCdevkit/VOC2012/JPEGImages/2009_000408.jpg 500 321 5 25 64 459 294 14 299 127 336 172 14 451 155 468 218 +9547 /data/VOCdevkit/VOC2012/JPEGImages/2009_000409.jpg 500 375 12 40 209 119 274 12 147 203 243 263 12 121 201 217 275 12 237 205 294 307 +9548 /data/VOCdevkit/VOC2012/JPEGImages/2009_000410.jpg 300 400 11 1 79 244 397 +9549 /data/VOCdevkit/VOC2012/JPEGImages/2009_000411.jpg 500 375 14 229 113 361 375 14 78 195 149 253 4 230 208 256 254 14 352 193 417 374 14 138 81 261 374 +9550 /data/VOCdevkit/VOC2012/JPEGImages/2009_000412.jpg 500 354 12 9 61 218 282 12 174 47 428 313 12 301 76 500 282 +9551 /data/VOCdevkit/VOC2012/JPEGImages/2009_000414.jpg 333 500 4 111 207 283 433 +9552 /data/VOCdevkit/VOC2012/JPEGImages/2009_000416.jpg 500 492 17 1 1 500 492 11 1 45 478 487 +9553 /data/VOCdevkit/VOC2012/JPEGImages/2009_000417.jpg 500 206 0 1 21 492 197 +9554 /data/VOCdevkit/VOC2012/JPEGImages/2009_000418.jpg 500 429 17 1 209 350 429 14 27 130 334 429 17 451 242 500 429 15 357 146 409 344 +9555 /data/VOCdevkit/VOC2012/JPEGImages/2009_000419.jpg 400 500 15 1 13 400 500 +9556 /data/VOCdevkit/VOC2012/JPEGImages/2009_000420.jpg 500 333 3 41 126 425 271 +9557 /data/VOCdevkit/VOC2012/JPEGImages/2009_000421.jpg 500 375 3 243 145 360 225 14 117 111 153 172 14 300 102 376 185 14 190 104 249 185 14 256 100 297 150 14 274 163 347 201 +9558 /data/VOCdevkit/VOC2012/JPEGImages/2009_000422.jpg 500 333 8 337 228 408 331 8 247 225 296 309 17 145 220 221 283 8 1 231 29 303 15 50 201 101 238 +9559 /data/VOCdevkit/VOC2012/JPEGImages/2009_000426.jpg 500 330 5 1 68 241 250 5 231 95 453 242 +9560 /data/VOCdevkit/VOC2012/JPEGImages/2009_000430.jpg 500 375 11 264 197 303 286 14 125 1 232 186 1 207 19 297 224 +9561 /data/VOCdevkit/VOC2012/JPEGImages/2009_000435.jpg 333 500 2 61 49 194 446 +9562 /data/VOCdevkit/VOC2012/JPEGImages/2009_000438.jpg 500 375 7 88 105 500 305 +9563 /data/VOCdevkit/VOC2012/JPEGImages/2009_000439.jpg 500 375 15 330 161 360 194 8 259 170 341 279 19 57 195 108 288 +9564 /data/VOCdevkit/VOC2012/JPEGImages/2009_000440.jpg 500 366 0 6 115 499 226 +9565 /data/VOCdevkit/VOC2012/JPEGImages/2009_000443.jpg 500 223 18 394 74 500 157 18 201 50 423 168 18 1 54 211 167 +9566 /data/VOCdevkit/VOC2012/JPEGImages/2009_000444.jpg 500 400 19 36 19 204 199 19 198 3 280 147 +9567 /data/VOCdevkit/VOC2012/JPEGImages/2009_000445.jpg 500 325 1 68 17 458 315 +9568 /data/VOCdevkit/VOC2012/JPEGImages/2009_000446.jpg 376 500 3 44 39 271 327 +9569 /data/VOCdevkit/VOC2012/JPEGImages/2009_000449.jpg 333 500 17 1 1 333 500 11 1 141 161 299 14 1 1 333 483 +9570 /data/VOCdevkit/VOC2012/JPEGImages/2009_000452.jpg 333 500 11 34 43 333 491 +9571 /data/VOCdevkit/VOC2012/JPEGImages/2009_000453.jpg 500 375 8 4 103 500 375 14 96 1 500 375 14 349 1 500 285 +9572 /data/VOCdevkit/VOC2012/JPEGImages/2009_000454.jpg 500 375 2 135 192 195 318 +9573 /data/VOCdevkit/VOC2012/JPEGImages/2009_000455.jpg 500 375 5 212 120 353 280 14 233 207 252 226 14 414 202 424 225 +9574 /data/VOCdevkit/VOC2012/JPEGImages/2009_000456.jpg 500 375 14 1 10 459 325 +9575 /data/VOCdevkit/VOC2012/JPEGImages/2009_000457.jpg 500 333 1 4 144 267 321 6 332 128 500 209 14 58 72 168 296 +9576 /data/VOCdevkit/VOC2012/JPEGImages/2009_000461.jpg 458 500 14 123 22 374 453 1 16 204 444 481 6 375 144 458 176 6 134 147 220 178 +9577 /data/VOCdevkit/VOC2012/JPEGImages/2009_000463.jpg 500 334 4 304 82 352 252 14 1 1 273 334 4 303 68 344 149 +9578 /data/VOCdevkit/VOC2012/JPEGImages/2009_000464.jpg 500 375 14 195 1 500 375 14 31 263 200 375 14 153 218 187 290 14 95 211 134 276 4 173 256 186 307 15 67 275 116 375 +9579 /data/VOCdevkit/VOC2012/JPEGImages/2009_000466.jpg 375 500 7 74 23 330 179 +9580 /data/VOCdevkit/VOC2012/JPEGImages/2009_000469.jpg 500 335 3 55 35 349 293 3 1 53 239 291 +9581 /data/VOCdevkit/VOC2012/JPEGImages/2009_000471.jpg 500 333 9 52 201 284 317 9 49 39 362 325 +9582 /data/VOCdevkit/VOC2012/JPEGImages/2009_000472.jpg 281 500 9 25 169 174 500 +9583 /data/VOCdevkit/VOC2012/JPEGImages/2009_000474.jpg 500 333 14 273 100 484 333 14 86 90 375 333 17 2 117 500 333 +9584 /data/VOCdevkit/VOC2012/JPEGImages/2009_000476.jpg 500 373 18 1 235 488 324 14 232 248 251 271 +9585 /data/VOCdevkit/VOC2012/JPEGImages/2009_000477.jpg 500 200 3 25 56 70 67 3 99 61 370 112 +9586 /data/VOCdevkit/VOC2012/JPEGImages/2009_000483.jpg 500 375 8 47 8 422 375 +9587 /data/VOCdevkit/VOC2012/JPEGImages/2009_000486.jpg 500 180 2 32 62 58 78 2 35 55 70 70 2 103 88 131 105 2 174 87 207 108 2 222 123 251 139 2 234 115 264 135 2 312 117 341 143 2 383 78 414 99 2 343 57 378 75 2 307 93 341 109 +9588 /data/VOCdevkit/VOC2012/JPEGImages/2009_000487.jpg 288 215 17 14 146 207 215 +9589 /data/VOCdevkit/VOC2012/JPEGImages/2009_000488.jpg 500 375 19 21 1 193 95 7 224 159 287 229 15 341 100 500 306 +9590 /data/VOCdevkit/VOC2012/JPEGImages/2009_000491.jpg 500 375 3 187 199 267 241 +9591 /data/VOCdevkit/VOC2012/JPEGImages/2009_000493.jpg 500 380 7 1 75 476 380 +9592 /data/VOCdevkit/VOC2012/JPEGImages/2009_000494.jpg 500 375 4 151 32 303 375 +9593 /data/VOCdevkit/VOC2012/JPEGImages/2009_000496.jpg 500 375 11 80 70 408 348 14 262 1 500 344 14 41 1 172 57 +9594 /data/VOCdevkit/VOC2012/JPEGImages/2009_000499.jpg 500 335 11 353 247 409 300 11 324 249 357 303 +9595 /data/VOCdevkit/VOC2012/JPEGImages/2009_000500.jpg 500 357 0 1 101 500 264 +9596 /data/VOCdevkit/VOC2012/JPEGImages/2009_000501.jpg 500 375 18 101 101 347 234 +9597 /data/VOCdevkit/VOC2012/JPEGImages/2009_000502.jpg 500 375 10 1 40 500 375 4 239 4 296 187 +9598 /data/VOCdevkit/VOC2012/JPEGImages/2009_000503.jpg 500 375 2 126 112 235 265 +9599 /data/VOCdevkit/VOC2012/JPEGImages/2009_000504.jpg 500 375 7 31 23 480 375 7 330 1 500 176 +9600 /data/VOCdevkit/VOC2012/JPEGImages/2009_000505.jpg 500 333 15 329 1 410 51 14 279 25 477 273 14 158 43 351 256 14 1 119 500 333 17 2 28 500 333 +9601 /data/VOCdevkit/VOC2012/JPEGImages/2009_000511.jpg 500 375 14 221 1 500 179 7 105 114 500 375 +9602 /data/VOCdevkit/VOC2012/JPEGImages/2009_000512.jpg 500 333 11 59 45 374 293 +9603 /data/VOCdevkit/VOC2012/JPEGImages/2009_000513.jpg 500 338 0 11 123 490 222 +9604 /data/VOCdevkit/VOC2012/JPEGImages/2009_000515.jpg 375 500 13 181 308 300 482 +9605 /data/VOCdevkit/VOC2012/JPEGImages/2009_000516.jpg 500 333 3 155 41 351 232 3 135 77 169 105 3 17 71 58 99 +9606 /data/VOCdevkit/VOC2012/JPEGImages/2009_000519.jpg 500 375 5 414 181 500 249 5 134 169 394 273 5 84 184 137 240 14 71 208 80 241 +9607 /data/VOCdevkit/VOC2012/JPEGImages/2009_000522.jpg 500 333 6 90 112 370 228 14 232 127 256 148 +9608 /data/VOCdevkit/VOC2012/JPEGImages/2009_000523.jpg 375 500 6 10 177 375 480 +9609 /data/VOCdevkit/VOC2012/JPEGImages/2009_000525.jpg 500 375 14 139 23 349 375 +9610 /data/VOCdevkit/VOC2012/JPEGImages/2009_000526.jpg 333 500 15 38 1 333 500 +9611 /data/VOCdevkit/VOC2012/JPEGImages/2009_000527.jpg 500 340 2 207 26 338 243 +9612 /data/VOCdevkit/VOC2012/JPEGImages/2009_000529.jpg 500 333 12 263 92 370 316 14 401 1 500 333 14 325 292 431 333 14 223 255 323 333 14 371 176 448 333 14 8 30 168 333 14 134 117 246 333 14 195 214 246 333 +9613 /data/VOCdevkit/VOC2012/JPEGImages/2009_000532.jpg 500 375 5 128 100 373 274 +9614 /data/VOCdevkit/VOC2012/JPEGImages/2009_000535.jpg 500 332 7 1 61 500 208 +9615 /data/VOCdevkit/VOC2012/JPEGImages/2009_000536.jpg 500 424 2 272 180 390 251 2 49 168 226 232 +9616 /data/VOCdevkit/VOC2012/JPEGImages/2009_000539.jpg 500 333 11 162 52 322 333 14 128 1 500 333 +9617 /data/VOCdevkit/VOC2012/JPEGImages/2009_000542.jpg 500 375 14 72 182 82 212 6 53 200 200 256 6 57 208 392 362 +9618 /data/VOCdevkit/VOC2012/JPEGImages/2009_000544.jpg 375 500 19 138 1 375 210 14 40 161 135 400 +9619 /data/VOCdevkit/VOC2012/JPEGImages/2009_000545.jpg 500 333 0 129 137 356 240 0 349 180 500 230 +9620 /data/VOCdevkit/VOC2012/JPEGImages/2009_000546.jpg 500 333 4 166 159 210 317 4 123 143 144 225 14 261 61 500 333 14 232 89 357 246 14 2 35 140 333 10 43 229 334 333 10 76 181 171 237 14 184 84 261 233 4 163 159 182 299 +9621 /data/VOCdevkit/VOC2012/JPEGImages/2009_000547.jpg 500 382 12 186 140 407 343 12 53 153 230 335 12 64 48 403 336 6 1 26 264 293 14 334 27 453 312 14 237 54 315 326 +9622 /data/VOCdevkit/VOC2012/JPEGImages/2009_000549.jpg 500 334 19 392 85 482 215 +9623 /data/VOCdevkit/VOC2012/JPEGImages/2009_000550.jpg 500 352 11 140 77 411 321 14 76 1 371 297 +9624 /data/VOCdevkit/VOC2012/JPEGImages/2009_000552.jpg 333 500 14 28 64 269 410 4 144 128 188 169 8 80 168 300 494 19 1 1 72 109 +9625 /data/VOCdevkit/VOC2012/JPEGImages/2009_000553.jpg 500 333 7 82 91 306 294 +9626 /data/VOCdevkit/VOC2012/JPEGImages/2009_000557.jpg 500 375 5 21 70 489 325 5 363 137 500 297 6 1 214 23 234 +9627 /data/VOCdevkit/VOC2012/JPEGImages/2009_000558.jpg 375 500 5 6 109 375 429 5 279 142 375 356 +9628 /data/VOCdevkit/VOC2012/JPEGImages/2009_000559.jpg 500 333 9 86 64 261 282 9 181 134 404 282 +9629 /data/VOCdevkit/VOC2012/JPEGImages/2009_000560.jpg 500 334 0 10 33 492 207 +9630 /data/VOCdevkit/VOC2012/JPEGImages/2009_000562.jpg 500 333 4 73 2 172 188 +9631 /data/VOCdevkit/VOC2012/JPEGImages/2009_000563.jpg 500 375 17 1 77 500 305 14 339 17 477 354 +9632 /data/VOCdevkit/VOC2012/JPEGImages/2009_000565.jpg 500 400 14 3 188 82 334 12 204 23 482 347 12 29 21 273 349 14 237 113 272 234 14 380 123 469 292 +9633 /data/VOCdevkit/VOC2012/JPEGImages/2009_000566.jpg 500 499 7 234 10 500 499 +9634 /data/VOCdevkit/VOC2012/JPEGImages/2009_000567.jpg 333 500 8 1 5 333 500 +9635 /data/VOCdevkit/VOC2012/JPEGImages/2009_000568.jpg 500 304 5 24 44 471 227 6 471 139 500 153 5 470 129 495 145 +9636 /data/VOCdevkit/VOC2012/JPEGImages/2009_000573.jpg 500 375 1 56 89 450 336 4 228 180 278 236 +9637 /data/VOCdevkit/VOC2012/JPEGImages/2009_000574.jpg 500 375 9 1 190 77 362 9 213 255 269 300 9 289 192 424 254 9 342 220 500 290 9 241 227 375 308 9 327 263 411 301 +9638 /data/VOCdevkit/VOC2012/JPEGImages/2009_000575.jpg 320 240 10 1 2 320 240 4 272 1 314 69 14 51 2 159 64 +9639 /data/VOCdevkit/VOC2012/JPEGImages/2009_000576.jpg 500 333 12 9 36 351 323 +9640 /data/VOCdevkit/VOC2012/JPEGImages/2009_000577.jpg 500 375 17 173 129 419 230 11 289 172 355 210 14 236 183 420 367 8 172 295 418 375 8 1 302 141 375 11 41 216 150 329 14 222 118 292 215 4 227 186 242 216 8 137 117 183 216 14 1 207 60 316 +9641 /data/VOCdevkit/VOC2012/JPEGImages/2009_000579.jpg 500 333 2 110 28 492 333 2 35 168 230 333 2 14 1 99 245 2 354 1 417 112 +9642 /data/VOCdevkit/VOC2012/JPEGImages/2009_000585.jpg 500 375 19 74 20 469 375 +9643 /data/VOCdevkit/VOC2012/JPEGImages/2009_000586.jpg 375 500 11 39 53 297 472 +9644 /data/VOCdevkit/VOC2012/JPEGImages/2009_000590.jpg 291 500 15 146 111 232 283 8 62 131 224 421 +9645 /data/VOCdevkit/VOC2012/JPEGImages/2009_000591.jpg 500 334 6 21 28 500 326 +9646 /data/VOCdevkit/VOC2012/JPEGImages/2009_000592.jpg 500 334 18 144 177 400 295 +9647 /data/VOCdevkit/VOC2012/JPEGImages/2009_000593.jpg 333 500 11 49 146 184 270 +9648 /data/VOCdevkit/VOC2012/JPEGImages/2009_000595.jpg 500 377 14 199 84 361 376 14 344 81 491 377 +9649 /data/VOCdevkit/VOC2012/JPEGImages/2009_000597.jpg 500 375 18 294 140 451 275 18 146 196 188 259 +9650 /data/VOCdevkit/VOC2012/JPEGImages/2009_000599.jpg 500 333 7 130 116 401 308 +9651 /data/VOCdevkit/VOC2012/JPEGImages/2009_000600.jpg 500 333 11 179 37 472 333 11 40 1 309 166 +9652 /data/VOCdevkit/VOC2012/JPEGImages/2009_000602.jpg 500 321 13 22 14 487 260 13 50 9 116 133 6 436 1 500 123 +9653 /data/VOCdevkit/VOC2012/JPEGImages/2009_000603.jpg 500 333 12 108 62 322 277 +9654 /data/VOCdevkit/VOC2012/JPEGImages/2009_000604.jpg 500 375 8 11 1 168 168 8 1 125 202 367 14 254 114 476 264 +9655 /data/VOCdevkit/VOC2012/JPEGImages/2009_000606.jpg 400 498 14 131 46 304 498 +9656 /data/VOCdevkit/VOC2012/JPEGImages/2009_000608.jpg 500 375 3 217 251 270 293 +9657 /data/VOCdevkit/VOC2012/JPEGImages/2009_000611.jpg 500 375 13 19 1 468 342 +9658 /data/VOCdevkit/VOC2012/JPEGImages/2009_000614.jpg 500 326 7 41 1 468 222 +9659 /data/VOCdevkit/VOC2012/JPEGImages/2009_000615.jpg 375 500 14 8 34 333 482 17 1 50 375 500 +9660 /data/VOCdevkit/VOC2012/JPEGImages/2009_000617.jpg 500 375 14 1 135 192 375 14 108 151 216 375 14 345 154 500 375 5 81 1 500 372 +9661 /data/VOCdevkit/VOC2012/JPEGImages/2009_000619.jpg 500 427 2 141 127 301 328 +9662 /data/VOCdevkit/VOC2012/JPEGImages/2009_000624.jpg 500 375 8 1 95 237 375 15 297 136 500 359 15 37 1 205 204 +9663 /data/VOCdevkit/VOC2012/JPEGImages/2009_000625.jpg 500 375 0 280 157 300 185 +9664 /data/VOCdevkit/VOC2012/JPEGImages/2009_000626.jpg 500 375 9 224 129 459 282 9 207 140 295 240 +9665 /data/VOCdevkit/VOC2012/JPEGImages/2009_000628.jpg 500 375 18 92 142 420 315 +9666 /data/VOCdevkit/VOC2012/JPEGImages/2009_000629.jpg 500 375 19 19 66 83 120 19 179 121 272 245 19 140 113 219 222 19 263 81 288 163 19 286 90 342 171 8 339 159 470 358 8 231 239 383 375 8 78 171 178 300 +9667 /data/VOCdevkit/VOC2012/JPEGImages/2009_000631.jpg 500 263 6 32 1 500 242 +9668 /data/VOCdevkit/VOC2012/JPEGImages/2009_000632.jpg 500 375 9 1 14 449 375 +9669 /data/VOCdevkit/VOC2012/JPEGImages/2009_000634.jpg 500 375 1 65 74 468 318 +9670 /data/VOCdevkit/VOC2012/JPEGImages/2009_000635.jpg 500 375 15 195 178 285 275 15 305 194 385 267 15 117 193 188 273 +9671 /data/VOCdevkit/VOC2012/JPEGImages/2009_000636.jpg 500 375 11 76 1 367 294 +9672 /data/VOCdevkit/VOC2012/JPEGImages/2009_000637.jpg 442 500 13 34 114 290 326 13 208 126 393 294 14 152 69 294 216 14 53 35 206 246 14 148 371 285 500 14 1 386 104 500 14 332 376 356 429 +9673 /data/VOCdevkit/VOC2012/JPEGImages/2009_000638.jpg 500 375 7 1 1 500 303 +9674 /data/VOCdevkit/VOC2012/JPEGImages/2009_000641.jpg 500 381 9 23 183 233 274 9 32 93 355 262 +9675 /data/VOCdevkit/VOC2012/JPEGImages/2009_000642.jpg 500 396 12 76 132 364 343 14 183 45 269 233 14 187 236 216 305 14 251 251 283 300 +9676 /data/VOCdevkit/VOC2012/JPEGImages/2009_000647.jpg 375 500 11 58 22 345 408 +9677 /data/VOCdevkit/VOC2012/JPEGImages/2009_000648.jpg 500 314 5 121 101 389 231 +9678 /data/VOCdevkit/VOC2012/JPEGImages/2009_000651.jpg 500 403 11 17 31 484 337 +9679 /data/VOCdevkit/VOC2012/JPEGImages/2009_000653.jpg 500 333 14 83 1 459 314 17 32 107 477 285 +9680 /data/VOCdevkit/VOC2012/JPEGImages/2009_000655.jpg 375 500 8 75 221 209 407 8 194 213 329 386 8 215 201 295 329 8 100 207 209 360 10 84 216 310 405 +9681 /data/VOCdevkit/VOC2012/JPEGImages/2009_000658.jpg 500 333 18 24 72 439 312 +9682 /data/VOCdevkit/VOC2012/JPEGImages/2009_000661.jpg 500 377 0 125 31 190 53 0 186 56 252 75 0 1 181 500 377 14 366 329 454 377 14 164 281 272 377 14 24 319 88 377 14 99 319 153 377 14 146 314 172 377 14 250 324 297 377 +9683 /data/VOCdevkit/VOC2012/JPEGImages/2009_000662.jpg 360 240 0 74 67 213 132 +9684 /data/VOCdevkit/VOC2012/JPEGImages/2009_000663.jpg 500 333 18 43 97 376 243 18 1 146 36 209 +9685 /data/VOCdevkit/VOC2012/JPEGImages/2009_000664.jpg 389 500 2 175 71 307 373 2 32 147 183 492 +9686 /data/VOCdevkit/VOC2012/JPEGImages/2009_000670.jpg 333 500 16 209 315 276 421 16 82 283 175 422 +9687 /data/VOCdevkit/VOC2012/JPEGImages/2009_000672.jpg 500 375 17 359 118 500 184 8 1 200 58 235 8 1 224 126 375 17 12 135 495 321 8 337 316 487 375 +9688 /data/VOCdevkit/VOC2012/JPEGImages/2009_000674.jpg 331 500 17 1 102 331 500 14 38 63 331 500 +9689 /data/VOCdevkit/VOC2012/JPEGImages/2009_000675.jpg 500 375 16 128 134 288 246 16 358 89 490 345 +9690 /data/VOCdevkit/VOC2012/JPEGImages/2009_000676.jpg 500 333 13 1 1 461 288 13 13 1 345 128 14 414 1 500 133 +9691 /data/VOCdevkit/VOC2012/JPEGImages/2009_000677.jpg 500 333 2 125 1 500 333 +9692 /data/VOCdevkit/VOC2012/JPEGImages/2009_000679.jpg 500 375 19 67 1 436 353 19 1 1 48 272 +9693 /data/VOCdevkit/VOC2012/JPEGImages/2009_000681.jpg 500 333 7 1 42 385 333 +9694 /data/VOCdevkit/VOC2012/JPEGImages/2009_000683.jpg 500 333 6 201 95 435 256 14 323 111 377 151 14 252 114 303 150 6 74 194 141 235 +9695 /data/VOCdevkit/VOC2012/JPEGImages/2009_000684.jpg 500 375 7 201 1 409 328 7 1 127 363 375 +9696 /data/VOCdevkit/VOC2012/JPEGImages/2009_000686.jpg 500 333 3 9 105 437 200 14 35 78 119 146 +9697 /data/VOCdevkit/VOC2012/JPEGImages/2009_000689.jpg 500 375 18 1 152 411 237 18 390 172 500 193 +9698 /data/VOCdevkit/VOC2012/JPEGImages/2009_000690.jpg 500 344 3 5 65 495 230 +9699 /data/VOCdevkit/VOC2012/JPEGImages/2009_000691.jpg 375 500 12 1 6 313 500 +9700 /data/VOCdevkit/VOC2012/JPEGImages/2009_000692.jpg 500 375 2 175 79 466 271 +9701 /data/VOCdevkit/VOC2012/JPEGImages/2009_000694.jpg 375 500 9 29 281 71 299 9 75 244 184 349 9 235 241 351 343 +9702 /data/VOCdevkit/VOC2012/JPEGImages/2009_000695.jpg 500 332 0 1 14 500 332 +9703 /data/VOCdevkit/VOC2012/JPEGImages/2009_000696.jpg 375 500 1 1 1 375 500 +9704 /data/VOCdevkit/VOC2012/JPEGImages/2009_000702.jpg 500 350 11 1 1 500 304 +9705 /data/VOCdevkit/VOC2012/JPEGImages/2009_000704.jpg 500 316 19 1 162 60 227 19 308 162 358 212 14 304 32 433 249 14 186 34 333 243 14 85 116 167 209 +9706 /data/VOCdevkit/VOC2012/JPEGImages/2009_000705.jpg 500 375 12 191 133 389 261 +9707 /data/VOCdevkit/VOC2012/JPEGImages/2009_000708.jpg 500 375 6 49 167 106 191 6 466 174 482 199 5 422 152 467 219 5 102 88 427 298 6 23 171 47 190 +9708 /data/VOCdevkit/VOC2012/JPEGImages/2009_000709.jpg 334 500 9 35 215 246 467 +9709 /data/VOCdevkit/VOC2012/JPEGImages/2009_000712.jpg 500 356 18 1 95 333 302 +9710 /data/VOCdevkit/VOC2012/JPEGImages/2009_000716.jpg 500 375 7 65 69 468 332 +9711 /data/VOCdevkit/VOC2012/JPEGImages/2009_000718.jpg 500 375 4 243 125 283 173 11 186 86 249 204 +9712 /data/VOCdevkit/VOC2012/JPEGImages/2009_000719.jpg 500 332 14 234 25 347 255 14 144 56 235 173 13 101 140 432 318 13 31 133 154 286 +9713 /data/VOCdevkit/VOC2012/JPEGImages/2009_000720.jpg 500 202 6 94 87 271 159 +9714 /data/VOCdevkit/VOC2012/JPEGImages/2009_000722.jpg 375 500 19 125 186 178 232 8 68 257 140 365 15 337 236 375 283 15 179 199 219 241 15 235 232 251 252 +9715 /data/VOCdevkit/VOC2012/JPEGImages/2009_000723.jpg 500 375 3 73 2 465 244 +9716 /data/VOCdevkit/VOC2012/JPEGImages/2009_000724.jpg 500 375 14 139 32 297 327 1 122 171 353 375 +9717 /data/VOCdevkit/VOC2012/JPEGImages/2009_000725.jpg 500 333 16 313 167 449 278 16 41 159 200 263 16 35 210 127 244 +9718 /data/VOCdevkit/VOC2012/JPEGImages/2009_000726.jpg 500 315 6 55 89 380 267 13 382 169 435 231 6 1 129 102 245 6 430 137 500 227 14 288 101 326 175 14 347 101 382 169 14 5 100 31 137 14 65 105 88 129 14 413 94 447 171 14 440 105 456 165 14 450 100 478 158 14 483 99 500 140 +9719 /data/VOCdevkit/VOC2012/JPEGImages/2009_000727.jpg 480 319 12 180 91 391 290 14 228 82 292 188 +9720 /data/VOCdevkit/VOC2012/JPEGImages/2009_000730.jpg 500 335 13 72 75 362 227 14 105 53 251 201 +9721 /data/VOCdevkit/VOC2012/JPEGImages/2009_000731.jpg 500 333 9 52 1 500 333 +9722 /data/VOCdevkit/VOC2012/JPEGImages/2009_000732.jpg 336 448 17 45 27 325 343 +9723 /data/VOCdevkit/VOC2012/JPEGImages/2009_000734.jpg 500 333 0 8 55 484 221 +9724 /data/VOCdevkit/VOC2012/JPEGImages/2009_000737.jpg 500 301 6 1 91 386 289 +9725 /data/VOCdevkit/VOC2012/JPEGImages/2009_000741.jpg 500 375 6 413 56 500 133 6 6 38 500 375 14 127 91 229 164 +9726 /data/VOCdevkit/VOC2012/JPEGImages/2009_000742.jpg 319 500 4 127 100 188 344 +9727 /data/VOCdevkit/VOC2012/JPEGImages/2009_000744.jpg 333 500 14 54 45 244 500 +9728 /data/VOCdevkit/VOC2012/JPEGImages/2009_000745.jpg 500 280 7 1 1 500 280 +9729 /data/VOCdevkit/VOC2012/JPEGImages/2009_000746.jpg 500 375 2 235 176 304 252 +9730 /data/VOCdevkit/VOC2012/JPEGImages/2009_000748.jpg 500 334 2 31 140 116 173 2 211 122 309 156 2 193 183 260 201 +9731 /data/VOCdevkit/VOC2012/JPEGImages/2009_000750.jpg 333 500 16 44 190 316 469 14 22 2 158 412 16 113 23 188 62 16 182 17 268 60 +9732 /data/VOCdevkit/VOC2012/JPEGImages/2009_000752.jpg 500 333 3 60 56 494 308 3 350 61 500 232 3 16 129 65 165 +9733 /data/VOCdevkit/VOC2012/JPEGImages/2009_000755.jpg 327 500 6 171 149 327 500 14 80 64 250 417 +9734 /data/VOCdevkit/VOC2012/JPEGImages/2009_000756.jpg 500 340 1 12 27 489 313 +9735 /data/VOCdevkit/VOC2012/JPEGImages/2009_000757.jpg 500 335 14 85 49 229 270 1 14 112 263 278 14 49 57 100 146 +9736 /data/VOCdevkit/VOC2012/JPEGImages/2009_000758.jpg 500 427 2 182 44 409 369 +9737 /data/VOCdevkit/VOC2012/JPEGImages/2009_000759.jpg 500 333 14 352 110 400 165 14 277 85 350 187 14 327 96 358 166 14 227 69 297 197 14 178 53 296 196 14 97 46 210 234 14 1 27 118 257 14 401 78 497 219 14 401 97 455 201 14 359 65 500 333 10 1 171 443 333 4 174 135 213 204 +9738 /data/VOCdevkit/VOC2012/JPEGImages/2009_000760.jpg 500 375 10 151 203 396 328 8 66 169 140 279 8 256 172 312 296 8 194 172 263 298 15 332 85 391 251 +9739 /data/VOCdevkit/VOC2012/JPEGImages/2009_000762.jpg 500 459 8 146 62 407 459 +9740 /data/VOCdevkit/VOC2012/JPEGImages/2009_000763.jpg 375 500 4 186 191 278 415 14 60 83 269 406 14 1 1 317 500 +9741 /data/VOCdevkit/VOC2012/JPEGImages/2009_000768.jpg 500 375 9 119 29 282 275 9 209 137 281 277 +9742 /data/VOCdevkit/VOC2012/JPEGImages/2009_000770.jpg 500 454 11 154 50 338 283 +9743 /data/VOCdevkit/VOC2012/JPEGImages/2009_000771.jpg 500 342 9 237 34 471 333 9 19 98 259 332 +9744 /data/VOCdevkit/VOC2012/JPEGImages/2009_000774.jpg 500 375 11 1 113 438 304 +9745 /data/VOCdevkit/VOC2012/JPEGImages/2009_000777.jpg 500 375 6 5 32 478 369 6 1 101 83 165 6 66 98 176 172 14 473 119 481 153 6 486 124 500 141 +9746 /data/VOCdevkit/VOC2012/JPEGImages/2009_000778.jpg 421 500 11 95 11 362 441 +9747 /data/VOCdevkit/VOC2012/JPEGImages/2009_000779.jpg 500 375 11 1 57 500 375 17 1 1 500 375 +9748 /data/VOCdevkit/VOC2012/JPEGImages/2009_000782.jpg 333 500 7 18 66 321 399 +9749 /data/VOCdevkit/VOC2012/JPEGImages/2009_000783.jpg 500 375 4 419 6 500 159 4 423 258 500 375 4 1 49 125 249 4 80 1 141 74 14 168 1 311 64 +9750 /data/VOCdevkit/VOC2012/JPEGImages/2009_000789.jpg 500 333 18 60 78 500 311 +9751 /data/VOCdevkit/VOC2012/JPEGImages/2009_000790.jpg 500 372 2 161 91 350 300 +9752 /data/VOCdevkit/VOC2012/JPEGImages/2009_000791.jpg 500 375 19 82 1 322 198 +9753 /data/VOCdevkit/VOC2012/JPEGImages/2009_000793.jpg 500 376 12 205 206 398 339 +9754 /data/VOCdevkit/VOC2012/JPEGImages/2009_000794.jpg 375 500 8 42 49 319 482 +9755 /data/VOCdevkit/VOC2012/JPEGImages/2009_000796.jpg 500 345 0 23 99 476 247 +9756 /data/VOCdevkit/VOC2012/JPEGImages/2009_000797.jpg 279 500 4 1 201 176 500 +9757 /data/VOCdevkit/VOC2012/JPEGImages/2009_000801.jpg 500 334 0 25 116 484 276 +9758 /data/VOCdevkit/VOC2012/JPEGImages/2009_000804.jpg 500 375 11 164 100 291 300 +9759 /data/VOCdevkit/VOC2012/JPEGImages/2009_000805.jpg 500 375 1 1 1 482 375 +9760 /data/VOCdevkit/VOC2012/JPEGImages/2009_000811.jpg 500 375 10 103 67 401 375 8 306 124 486 350 8 29 137 200 354 8 299 87 432 267 8 336 58 397 143 8 58 92 135 193 8 81 62 148 147 8 1 21 55 101 8 33 11 69 75 +9761 /data/VOCdevkit/VOC2012/JPEGImages/2009_000812.jpg 500 333 2 244 152 280 196 +9762 /data/VOCdevkit/VOC2012/JPEGImages/2009_000815.jpg 334 500 14 133 189 334 500 +9763 /data/VOCdevkit/VOC2012/JPEGImages/2009_000816.jpg 500 333 8 191 164 247 259 8 98 182 182 295 +9764 /data/VOCdevkit/VOC2012/JPEGImages/2009_000817.jpg 500 333 0 46 80 478 230 +9765 /data/VOCdevkit/VOC2012/JPEGImages/2009_000820.jpg 480 343 1 157 158 372 299 14 163 82 317 277 +9766 /data/VOCdevkit/VOC2012/JPEGImages/2009_000821.jpg 500 375 14 350 3 500 375 6 1 1 500 306 +9767 /data/VOCdevkit/VOC2012/JPEGImages/2009_000823.jpg 500 340 12 88 5 344 336 +9768 /data/VOCdevkit/VOC2012/JPEGImages/2009_000824.jpg 500 375 18 19 178 414 311 +9769 /data/VOCdevkit/VOC2012/JPEGImages/2009_000825.jpg 500 333 14 265 79 297 124 14 193 95 228 130 14 400 78 422 171 14 294 146 392 303 14 113 168 202 333 13 232 207 473 333 13 27 219 281 333 6 115 127 386 254 +9770 /data/VOCdevkit/VOC2012/JPEGImages/2009_000828.jpg 500 339 3 174 109 441 272 +9771 /data/VOCdevkit/VOC2012/JPEGImages/2009_000829.jpg 500 375 3 179 222 416 293 3 410 236 470 266 3 436 103 500 256 3 3 234 75 258 +9772 /data/VOCdevkit/VOC2012/JPEGImages/2009_000830.jpg 500 326 3 101 23 387 299 +9773 /data/VOCdevkit/VOC2012/JPEGImages/2009_000831.jpg 375 500 10 138 311 375 500 14 174 92 319 337 14 25 96 222 500 +9774 /data/VOCdevkit/VOC2012/JPEGImages/2009_000833.jpg 500 375 14 232 44 478 375 14 56 70 263 375 +9775 /data/VOCdevkit/VOC2012/JPEGImages/2009_000834.jpg 500 333 10 1 239 500 333 14 184 97 316 248 14 450 1 500 207 8 1 196 123 247 8 141 196 325 238 +9776 /data/VOCdevkit/VOC2012/JPEGImages/2009_000837.jpg 500 375 16 95 89 470 326 +9777 /data/VOCdevkit/VOC2012/JPEGImages/2009_000839.jpg 333 500 11 1 34 333 500 +9778 /data/VOCdevkit/VOC2012/JPEGImages/2009_000840.jpg 375 500 4 149 113 226 387 +9779 /data/VOCdevkit/VOC2012/JPEGImages/2009_000843.jpg 500 433 14 165 1 287 260 12 71 130 388 420 +9780 /data/VOCdevkit/VOC2012/JPEGImages/2009_000845.jpg 500 287 18 192 160 427 250 +9781 /data/VOCdevkit/VOC2012/JPEGImages/2009_000846.jpg 500 375 10 1 1 500 375 +9782 /data/VOCdevkit/VOC2012/JPEGImages/2009_000848.jpg 500 375 4 172 137 209 249 19 32 23 190 173 19 182 15 369 141 +9783 /data/VOCdevkit/VOC2012/JPEGImages/2009_000849.jpg 500 386 2 13 111 459 304 +9784 /data/VOCdevkit/VOC2012/JPEGImages/2009_000851.jpg 500 336 8 52 1 407 336 8 355 1 500 330 +9785 /data/VOCdevkit/VOC2012/JPEGImages/2009_000852.jpg 500 334 12 7 159 101 207 12 157 88 454 284 12 222 143 370 289 +9786 /data/VOCdevkit/VOC2012/JPEGImages/2009_000854.jpg 500 375 7 53 65 392 299 +9787 /data/VOCdevkit/VOC2012/JPEGImages/2009_000856.jpg 500 376 11 158 163 398 311 14 225 68 305 306 +9788 /data/VOCdevkit/VOC2012/JPEGImages/2009_000858.jpg 500 375 13 94 115 484 375 13 54 74 320 283 13 1 81 57 177 14 365 1 427 147 14 438 1 496 162 14 463 3 500 220 14 227 1 269 74 13 315 8 344 44 13 274 4 314 38 13 12 23 51 68 +9789 /data/VOCdevkit/VOC2012/JPEGImages/2009_000862.jpg 500 375 7 110 71 456 312 +9790 /data/VOCdevkit/VOC2012/JPEGImages/2009_000865.jpg 500 393 14 19 36 414 355 +9791 /data/VOCdevkit/VOC2012/JPEGImages/2009_000867.jpg 500 375 10 1 97 500 375 4 320 1 373 148 4 367 1 409 103 15 181 1 330 107 +9792 /data/VOCdevkit/VOC2012/JPEGImages/2009_000869.jpg 500 375 11 143 99 408 243 +9793 /data/VOCdevkit/VOC2012/JPEGImages/2009_000871.jpg 500 333 11 167 59 331 279 +9794 /data/VOCdevkit/VOC2012/JPEGImages/2009_000874.jpg 500 335 11 21 15 500 306 +9795 /data/VOCdevkit/VOC2012/JPEGImages/2009_000879.jpg 500 357 2 119 121 237 291 +9796 /data/VOCdevkit/VOC2012/JPEGImages/2009_000882.jpg 500 375 13 19 73 477 335 1 386 163 490 234 6 460 173 500 232 6 392 145 500 203 +9797 /data/VOCdevkit/VOC2012/JPEGImages/2009_000886.jpg 500 375 6 379 193 450 255 6 438 212 500 271 6 85 171 105 191 6 66 170 88 187 5 100 110 380 257 +9798 /data/VOCdevkit/VOC2012/JPEGImages/2009_000887.jpg 500 334 0 13 37 500 301 +9799 /data/VOCdevkit/VOC2012/JPEGImages/2009_000889.jpg 500 333 6 9 26 460 313 14 74 2 122 92 +9800 /data/VOCdevkit/VOC2012/JPEGImages/2009_000890.jpg 500 333 18 1 1 267 333 14 379 110 500 333 14 386 144 410 198 14 407 129 436 164 +9801 /data/VOCdevkit/VOC2012/JPEGImages/2009_000892.jpg 500 333 11 233 77 392 271 +9802 /data/VOCdevkit/VOC2012/JPEGImages/2009_000894.jpg 500 334 13 121 74 482 319 +9803 /data/VOCdevkit/VOC2012/JPEGImages/2009_000895.jpg 500 286 19 94 45 253 251 19 259 24 398 203 +9804 /data/VOCdevkit/VOC2012/JPEGImages/2009_000896.jpg 500 375 14 385 92 415 118 1 298 121 313 160 14 114 90 176 256 1 117 166 175 286 14 180 55 303 325 1 173 182 325 375 +9805 /data/VOCdevkit/VOC2012/JPEGImages/2009_000897.jpg 500 447 13 152 105 336 420 14 157 48 345 351 +9806 /data/VOCdevkit/VOC2012/JPEGImages/2009_000898.jpg 333 500 2 152 252 270 497 +9807 /data/VOCdevkit/VOC2012/JPEGImages/2009_000899.jpg 375 500 9 32 259 299 466 +9808 /data/VOCdevkit/VOC2012/JPEGImages/2009_000901.jpg 500 334 14 107 123 198 334 14 254 129 327 333 14 361 155 442 334 +9809 /data/VOCdevkit/VOC2012/JPEGImages/2009_000902.jpg 500 500 14 255 1 500 333 7 1 1 404 441 +9810 /data/VOCdevkit/VOC2012/JPEGImages/2009_000904.jpg 335 500 6 275 185 300 200 2 45 217 117 400 2 213 195 286 399 +9811 /data/VOCdevkit/VOC2012/JPEGImages/2009_000906.jpg 500 330 6 363 184 500 330 +9812 /data/VOCdevkit/VOC2012/JPEGImages/2009_000909.jpg 500 375 0 1 1 339 332 +9813 /data/VOCdevkit/VOC2012/JPEGImages/2009_000910.jpg 500 328 18 22 62 500 291 +9814 /data/VOCdevkit/VOC2012/JPEGImages/2009_000915.jpg 500 375 7 78 16 500 375 +9815 /data/VOCdevkit/VOC2012/JPEGImages/2009_000919.jpg 500 261 3 105 189 223 221 +9816 /data/VOCdevkit/VOC2012/JPEGImages/2009_000920.jpg 500 355 18 212 130 446 268 18 1 128 189 272 +9817 /data/VOCdevkit/VOC2012/JPEGImages/2009_000923.jpg 333 500 11 124 143 333 500 +9818 /data/VOCdevkit/VOC2012/JPEGImages/2009_000924.jpg 500 375 16 182 95 422 375 +9819 /data/VOCdevkit/VOC2012/JPEGImages/2009_000925.jpg 500 375 17 1 1 500 311 +9820 /data/VOCdevkit/VOC2012/JPEGImages/2009_000926.jpg 500 375 17 372 216 500 375 15 246 206 305 248 15 258 111 319 181 15 427 165 483 209 15 354 165 379 195 15 380 120 437 168 +9821 /data/VOCdevkit/VOC2012/JPEGImages/2009_000927.jpg 500 375 3 275 159 308 270 +9822 /data/VOCdevkit/VOC2012/JPEGImages/2009_000928.jpg 375 500 8 1 78 370 500 +9823 /data/VOCdevkit/VOC2012/JPEGImages/2009_000930.jpg 334 500 2 134 228 201 402 14 96 43 334 500 +9824 /data/VOCdevkit/VOC2012/JPEGImages/2009_000931.jpg 500 375 12 365 88 500 197 12 174 70 316 192 +9825 /data/VOCdevkit/VOC2012/JPEGImages/2009_000932.jpg 333 500 2 78 84 333 500 +9826 /data/VOCdevkit/VOC2012/JPEGImages/2009_000934.jpg 500 324 12 296 168 450 287 12 177 172 317 288 12 59 160 174 286 14 227 153 261 232 14 360 136 416 235 14 108 140 149 226 +9827 /data/VOCdevkit/VOC2012/JPEGImages/2009_000935.jpg 500 375 11 234 11 344 248 +9828 /data/VOCdevkit/VOC2012/JPEGImages/2009_000937.jpg 500 265 17 221 79 491 226 17 10 82 210 210 +9829 /data/VOCdevkit/VOC2012/JPEGImages/2009_000938.jpg 500 383 2 78 82 317 318 +9830 /data/VOCdevkit/VOC2012/JPEGImages/2009_000939.jpg 500 333 19 201 158 254 198 8 82 180 120 242 17 1 229 91 333 +9831 /data/VOCdevkit/VOC2012/JPEGImages/2009_000945.jpg 500 375 5 13 67 442 294 +9832 /data/VOCdevkit/VOC2012/JPEGImages/2009_000948.jpg 500 333 6 133 124 448 237 6 273 97 323 124 +9833 /data/VOCdevkit/VOC2012/JPEGImages/2009_000953.jpg 500 333 11 140 26 500 333 +9834 /data/VOCdevkit/VOC2012/JPEGImages/2009_000954.jpg 500 375 6 260 289 296 333 +9835 /data/VOCdevkit/VOC2012/JPEGImages/2009_000955.jpg 500 334 7 79 1 435 334 +9836 /data/VOCdevkit/VOC2012/JPEGImages/2009_000958.jpg 500 333 2 238 97 439 270 +9837 /data/VOCdevkit/VOC2012/JPEGImages/2009_000960.jpg 500 333 5 103 57 499 322 14 256 144 276 169 +9838 /data/VOCdevkit/VOC2012/JPEGImages/2009_000961.jpg 333 500 2 121 233 261 354 2 137 208 194 246 +9839 /data/VOCdevkit/VOC2012/JPEGImages/2009_000962.jpg 300 500 14 32 65 272 500 +9840 /data/VOCdevkit/VOC2012/JPEGImages/2009_000964.jpg 500 374 7 110 158 299 267 +9841 /data/VOCdevkit/VOC2012/JPEGImages/2009_000966.jpg 500 375 7 224 62 393 364 7 144 53 289 325 +9842 /data/VOCdevkit/VOC2012/JPEGImages/2009_000967.jpg 500 333 0 1 68 459 260 6 453 127 500 166 6 378 127 441 144 +9843 /data/VOCdevkit/VOC2012/JPEGImages/2009_000969.jpg 333 500 8 64 174 78 196 8 12 175 28 194 10 1 360 333 500 14 14 70 263 384 +9844 /data/VOCdevkit/VOC2012/JPEGImages/2009_000970.jpg 500 375 7 220 127 500 375 +9845 /data/VOCdevkit/VOC2012/JPEGImages/2009_000971.jpg 500 333 9 32 170 219 247 +9846 /data/VOCdevkit/VOC2012/JPEGImages/2009_000973.jpg 500 375 17 153 77 402 316 8 158 14 264 114 +9847 /data/VOCdevkit/VOC2012/JPEGImages/2009_000974.jpg 500 375 18 24 111 479 311 14 423 270 454 352 18 1 198 409 375 18 61 74 402 159 +9848 /data/VOCdevkit/VOC2012/JPEGImages/2009_000975.jpg 500 333 1 332 232 441 301 1 260 227 313 304 +9849 /data/VOCdevkit/VOC2012/JPEGImages/2009_000979.jpg 500 375 11 75 189 211 331 11 273 220 412 347 +9850 /data/VOCdevkit/VOC2012/JPEGImages/2009_000980.jpg 500 375 8 1 211 103 375 8 79 196 157 375 8 181 195 275 357 8 250 205 365 324 8 249 234 387 375 8 144 273 280 375 10 1 234 316 362 +9851 /data/VOCdevkit/VOC2012/JPEGImages/2009_000981.jpg 500 332 19 186 40 453 255 +9852 /data/VOCdevkit/VOC2012/JPEGImages/2009_000985.jpg 500 285 1 37 15 469 272 +9853 /data/VOCdevkit/VOC2012/JPEGImages/2009_000987.jpg 334 500 14 195 34 319 492 19 1 86 124 226 +9854 /data/VOCdevkit/VOC2012/JPEGImages/2009_000989.jpg 500 375 11 256 118 312 194 +9855 /data/VOCdevkit/VOC2012/JPEGImages/2009_000990.jpg 500 375 5 76 66 440 349 14 229 173 306 244 14 344 186 388 216 14 1 229 36 349 +9856 /data/VOCdevkit/VOC2012/JPEGImages/2009_000991.jpg 500 375 2 83 36 392 335 2 109 231 229 326 +9857 /data/VOCdevkit/VOC2012/JPEGImages/2009_000992.jpg 500 375 4 157 1 331 246 +9858 /data/VOCdevkit/VOC2012/JPEGImages/2009_000995.jpg 333 500 17 36 270 333 432 14 104 196 161 292 +9859 /data/VOCdevkit/VOC2012/JPEGImages/2009_000996.jpg 500 375 3 124 93 245 243 3 235 190 451 245 +9860 /data/VOCdevkit/VOC2012/JPEGImages/2009_000998.jpg 500 333 2 136 70 301 305 +9861 /data/VOCdevkit/VOC2012/JPEGImages/2009_001000.jpg 500 121 14 6 1 54 121 8 28 75 46 117 15 49 64 79 83 19 84 39 124 69 8 105 36 183 121 +9862 /data/VOCdevkit/VOC2012/JPEGImages/2009_001002.jpg 500 375 14 1 119 202 375 14 138 35 500 375 14 310 113 500 325 +9863 /data/VOCdevkit/VOC2012/JPEGImages/2009_001006.jpg 500 333 11 65 1 256 223 +9864 /data/VOCdevkit/VOC2012/JPEGImages/2009_001007.jpg 500 398 18 124 218 344 330 +9865 /data/VOCdevkit/VOC2012/JPEGImages/2009_001008.jpg 500 402 7 43 59 328 394 +9866 /data/VOCdevkit/VOC2012/JPEGImages/2009_001009.jpg 500 375 8 463 200 500 260 8 362 144 417 236 8 438 144 498 232 10 375 160 500 263 +9867 /data/VOCdevkit/VOC2012/JPEGImages/2009_001011.jpg 375 500 14 89 48 232 211 4 187 110 225 235 4 106 77 144 270 4 59 74 107 273 4 4 92 52 268 10 2 209 373 500 +9868 /data/VOCdevkit/VOC2012/JPEGImages/2009_001012.jpg 377 500 8 1 1 377 419 +9869 /data/VOCdevkit/VOC2012/JPEGImages/2009_001013.jpg 500 382 14 144 24 243 258 12 35 88 377 362 +9870 /data/VOCdevkit/VOC2012/JPEGImages/2009_001016.jpg 500 375 7 1 101 444 375 +9871 /data/VOCdevkit/VOC2012/JPEGImages/2009_001019.jpg 500 375 6 145 48 182 59 3 49 1 104 51 3 1 45 116 109 3 97 77 448 169 14 325 80 335 91 +9872 /data/VOCdevkit/VOC2012/JPEGImages/2009_001021.jpg 375 500 15 272 196 303 234 8 62 320 145 470 8 1 342 93 500 17 216 275 375 500 +9873 /data/VOCdevkit/VOC2012/JPEGImages/2009_001024.jpg 500 375 14 140 107 327 375 4 207 154 297 217 4 449 316 492 375 +9874 /data/VOCdevkit/VOC2012/JPEGImages/2009_001026.jpg 500 375 14 240 51 299 144 14 285 85 314 139 14 311 102 344 139 14 334 73 445 334 14 56 49 190 342 14 176 65 309 327 11 3 271 93 367 11 89 253 177 351 11 176 245 265 349 11 246 186 333 353 11 312 250 398 361 6 474 121 500 145 6 407 125 433 144 6 45 115 78 135 +9875 /data/VOCdevkit/VOC2012/JPEGImages/2009_001027.jpg 500 333 0 13 118 500 247 +9876 /data/VOCdevkit/VOC2012/JPEGImages/2009_001028.jpg 500 500 8 302 246 441 434 8 26 244 169 434 +9877 /data/VOCdevkit/VOC2012/JPEGImages/2009_001030.jpg 500 375 14 263 107 373 370 +9878 /data/VOCdevkit/VOC2012/JPEGImages/2009_001036.jpg 500 357 12 51 98 429 257 +9879 /data/VOCdevkit/VOC2012/JPEGImages/2009_001037.jpg 500 333 7 69 63 483 241 +9880 /data/VOCdevkit/VOC2012/JPEGImages/2009_001038.jpg 346 500 8 79 75 318 434 +9881 /data/VOCdevkit/VOC2012/JPEGImages/2009_001040.jpg 394 500 2 64 17 302 491 +9882 /data/VOCdevkit/VOC2012/JPEGImages/2009_001042.jpg 500 336 14 98 182 106 209 14 108 178 130 255 14 137 176 179 294 14 1 184 39 265 14 43 181 59 198 14 38 175 82 310 14 58 187 113 331 18 120 45 397 308 18 381 134 498 213 +9883 /data/VOCdevkit/VOC2012/JPEGImages/2009_001044.jpg 500 375 5 75 107 463 295 +9884 /data/VOCdevkit/VOC2012/JPEGImages/2009_001052.jpg 500 375 11 163 75 431 233 +9885 /data/VOCdevkit/VOC2012/JPEGImages/2009_001054.jpg 375 500 10 1 1 375 500 4 1 1 81 80 14 143 1 375 106 +9886 /data/VOCdevkit/VOC2012/JPEGImages/2009_001055.jpg 500 394 12 199 98 478 315 +9887 /data/VOCdevkit/VOC2012/JPEGImages/2009_001056.jpg 500 334 0 14 71 483 220 +9888 /data/VOCdevkit/VOC2012/JPEGImages/2009_001057.jpg 500 334 7 1 40 315 334 10 1 65 500 334 8 293 70 500 324 +9889 /data/VOCdevkit/VOC2012/JPEGImages/2009_001059.jpg 500 333 4 75 1 500 257 +9890 /data/VOCdevkit/VOC2012/JPEGImages/2009_001061.jpg 500 375 13 1 1 500 375 +9891 /data/VOCdevkit/VOC2012/JPEGImages/2009_001066.jpg 500 375 11 254 141 500 375 +9892 /data/VOCdevkit/VOC2012/JPEGImages/2009_001068.jpg 333 500 14 93 85 306 482 +9893 /data/VOCdevkit/VOC2012/JPEGImages/2009_001069.jpg 500 334 19 142 25 403 265 +9894 /data/VOCdevkit/VOC2012/JPEGImages/2009_001070.jpg 375 500 8 93 71 318 500 +9895 /data/VOCdevkit/VOC2012/JPEGImages/2009_001074.jpg 500 375 1 1 1 500 375 +9896 /data/VOCdevkit/VOC2012/JPEGImages/2009_001075.jpg 500 375 11 177 58 500 251 11 57 88 500 375 +9897 /data/VOCdevkit/VOC2012/JPEGImages/2009_001078.jpg 500 375 18 111 54 394 271 6 56 87 102 112 6 180 59 212 75 6 278 55 286 62 6 285 56 298 62 6 242 62 257 70 +9898 /data/VOCdevkit/VOC2012/JPEGImages/2009_001079.jpg 500 375 9 1 99 405 308 +9899 /data/VOCdevkit/VOC2012/JPEGImages/2009_001081.jpg 500 375 17 1 1 500 375 7 121 59 500 375 +9900 /data/VOCdevkit/VOC2012/JPEGImages/2009_001082.jpg 500 375 5 261 85 500 354 5 9 13 294 339 +9901 /data/VOCdevkit/VOC2012/JPEGImages/2009_001083.jpg 500 375 14 129 127 162 163 6 319 163 361 214 6 347 169 379 213 5 27 124 92 202 5 381 112 500 216 5 92 72 320 294 +9902 /data/VOCdevkit/VOC2012/JPEGImages/2009_001084.jpg 333 500 14 82 120 240 422 +9903 /data/VOCdevkit/VOC2012/JPEGImages/2009_001085.jpg 500 334 8 53 58 248 306 15 90 53 208 246 +9904 /data/VOCdevkit/VOC2012/JPEGImages/2009_001090.jpg 500 310 0 61 92 389 205 +9905 /data/VOCdevkit/VOC2012/JPEGImages/2009_001091.jpg 500 375 5 1 1 254 251 14 1 128 74 375 14 63 146 126 350 14 120 126 185 344 14 171 122 221 283 14 189 143 251 369 14 188 120 280 306 14 217 123 355 344 14 305 117 378 352 14 370 112 440 363 14 420 113 500 375 +9906 /data/VOCdevkit/VOC2012/JPEGImages/2009_001094.jpg 500 375 7 1 1 500 375 +9907 /data/VOCdevkit/VOC2012/JPEGImages/2009_001095.jpg 375 500 8 1 174 39 238 8 33 149 97 219 8 184 134 259 187 8 265 140 345 194 8 1 353 214 500 8 337 179 375 372 8 265 213 364 500 10 1 172 365 500 +9908 /data/VOCdevkit/VOC2012/JPEGImages/2009_001096.jpg 500 375 14 11 27 270 371 1 1 200 326 375 +9909 /data/VOCdevkit/VOC2012/JPEGImages/2009_001097.jpg 500 281 6 227 1 312 30 6 56 13 219 68 6 85 51 426 241 +9910 /data/VOCdevkit/VOC2012/JPEGImages/2009_001098.jpg 500 300 5 1 1 325 300 5 305 37 472 265 14 1 131 65 225 +9911 /data/VOCdevkit/VOC2012/JPEGImages/2009_001100.jpg 356 500 15 57 241 136 377 +9912 /data/VOCdevkit/VOC2012/JPEGImages/2009_001102.jpg 500 375 3 465 172 483 176 3 381 170 439 182 3 274 169 295 175 3 192 168 227 178 3 130 168 157 177 3 55 167 69 175 3 27 163 41 167 +9913 /data/VOCdevkit/VOC2012/JPEGImages/2009_001103.jpg 500 375 19 1 176 160 375 14 137 71 354 331 4 272 276 310 375 4 371 226 401 328 4 486 272 500 375 14 399 180 500 324 +9914 /data/VOCdevkit/VOC2012/JPEGImages/2009_001104.jpg 500 335 9 389 55 434 112 9 297 42 338 82 9 143 106 258 323 9 69 88 114 162 +9915 /data/VOCdevkit/VOC2012/JPEGImages/2009_001105.jpg 500 335 8 81 48 243 109 8 288 46 443 104 10 1 112 500 335 +9916 /data/VOCdevkit/VOC2012/JPEGImages/2009_001106.jpg 500 375 19 206 228 282 328 19 158 230 204 330 14 1 38 329 375 4 431 232 452 285 +9917 /data/VOCdevkit/VOC2012/JPEGImages/2009_001107.jpg 375 500 17 154 83 375 453 +9918 /data/VOCdevkit/VOC2012/JPEGImages/2009_001108.jpg 500 500 2 316 242 426 355 +9919 /data/VOCdevkit/VOC2012/JPEGImages/2009_001110.jpg 333 500 12 258 61 333 500 14 203 1 333 336 +9920 /data/VOCdevkit/VOC2012/JPEGImages/2009_001111.jpg 500 341 19 150 38 297 198 19 14 62 50 176 14 265 12 416 330 14 459 174 490 264 14 14 157 92 254 6 67 266 158 293 19 201 271 287 330 14 178 214 254 330 +9921 /data/VOCdevkit/VOC2012/JPEGImages/2009_001113.jpg 500 335 5 25 27 401 266 6 401 132 420 147 6 466 132 479 142 6 488 132 500 147 +9922 /data/VOCdevkit/VOC2012/JPEGImages/2009_001117.jpg 500 499 7 30 31 326 293 7 141 203 364 470 7 303 120 431 353 7 303 59 470 295 +9923 /data/VOCdevkit/VOC2012/JPEGImages/2009_001118.jpg 500 375 18 1 80 69 327 18 22 52 500 353 +9924 /data/VOCdevkit/VOC2012/JPEGImages/2009_001120.jpg 500 375 14 122 14 148 62 14 178 9 196 83 14 154 28 383 375 4 303 310 400 374 14 341 1 363 25 14 336 27 355 57 14 384 15 417 232 14 410 1 500 375 14 329 9 413 262 +9925 /data/VOCdevkit/VOC2012/JPEGImages/2009_001121.jpg 500 334 13 245 146 345 200 14 262 124 313 173 +9926 /data/VOCdevkit/VOC2012/JPEGImages/2009_001124.jpg 500 333 11 178 147 259 256 +9927 /data/VOCdevkit/VOC2012/JPEGImages/2009_001126.jpg 500 375 7 285 123 458 303 7 114 19 181 165 7 9 83 22 101 +9928 /data/VOCdevkit/VOC2012/JPEGImages/2009_001128.jpg 500 404 2 112 136 489 404 2 32 27 229 404 +9929 /data/VOCdevkit/VOC2012/JPEGImages/2009_001129.jpg 500 335 0 11 61 500 335 +9930 /data/VOCdevkit/VOC2012/JPEGImages/2009_001133.jpg 378 500 11 1 14 350 500 14 1 93 115 334 19 173 1 378 60 +9931 /data/VOCdevkit/VOC2012/JPEGImages/2009_001134.jpg 500 370 9 88 154 373 346 9 137 225 323 350 +9932 /data/VOCdevkit/VOC2012/JPEGImages/2009_001135.jpg 500 375 13 20 25 468 322 +9933 /data/VOCdevkit/VOC2012/JPEGImages/2009_001137.jpg 500 334 14 187 121 355 334 15 376 1 500 261 +9934 /data/VOCdevkit/VOC2012/JPEGImages/2009_001138.jpg 500 375 5 31 98 362 231 6 438 182 471 205 +9935 /data/VOCdevkit/VOC2012/JPEGImages/2009_001139.jpg 500 375 11 142 33 364 375 +9936 /data/VOCdevkit/VOC2012/JPEGImages/2009_001140.jpg 500 333 13 64 73 486 294 14 178 46 360 204 +9937 /data/VOCdevkit/VOC2012/JPEGImages/2009_001145.jpg 500 333 9 84 68 333 270 +9938 /data/VOCdevkit/VOC2012/JPEGImages/2009_001146.jpg 500 375 17 33 94 470 291 +9939 /data/VOCdevkit/VOC2012/JPEGImages/2009_001147.jpg 500 375 12 103 107 238 269 12 290 101 415 266 12 456 156 500 278 +9940 /data/VOCdevkit/VOC2012/JPEGImages/2009_001148.jpg 500 376 5 39 31 460 323 5 403 32 500 278 14 352 130 378 157 +9941 /data/VOCdevkit/VOC2012/JPEGImages/2009_001151.jpg 500 333 13 79 100 443 317 14 182 51 358 237 +9942 /data/VOCdevkit/VOC2012/JPEGImages/2009_001152.jpg 500 346 18 1 77 484 294 +9943 /data/VOCdevkit/VOC2012/JPEGImages/2009_001153.jpg 500 334 7 1 1 500 334 +9944 /data/VOCdevkit/VOC2012/JPEGImages/2009_001154.jpg 324 411 4 159 289 199 411 14 2 42 296 411 8 2 187 81 370 +9945 /data/VOCdevkit/VOC2012/JPEGImages/2009_001155.jpg 500 333 19 1 74 163 333 14 165 5 500 333 +9946 /data/VOCdevkit/VOC2012/JPEGImages/2009_001159.jpg 500 332 5 46 28 475 316 +9947 /data/VOCdevkit/VOC2012/JPEGImages/2009_001160.jpg 373 500 2 35 120 161 446 +9948 /data/VOCdevkit/VOC2012/JPEGImages/2009_001163.jpg 500 373 9 70 90 239 373 9 241 73 421 373 +9949 /data/VOCdevkit/VOC2012/JPEGImages/2009_001164.jpg 500 375 18 79 55 425 316 +9950 /data/VOCdevkit/VOC2012/JPEGImages/2009_001166.jpg 500 375 2 17 51 391 375 +9951 /data/VOCdevkit/VOC2012/JPEGImages/2009_001172.jpg 500 500 16 87 119 486 500 +9952 /data/VOCdevkit/VOC2012/JPEGImages/2009_001177.jpg 500 333 16 231 103 462 280 16 168 165 315 300 +9953 /data/VOCdevkit/VOC2012/JPEGImages/2009_001180.jpg 336 500 12 1 1 324 451 +9954 /data/VOCdevkit/VOC2012/JPEGImages/2009_001181.jpg 500 333 4 238 293 255 333 14 309 85 431 298 14 280 108 368 332 1 415 225 500 328 14 1 134 45 333 14 20 119 111 333 14 84 106 178 333 14 163 136 181 175 14 134 129 241 333 14 249 266 334 333 14 333 250 437 333 14 410 273 498 333 +9955 /data/VOCdevkit/VOC2012/JPEGImages/2009_001184.jpg 500 333 12 274 165 387 264 12 89 172 188 246 9 274 169 298 184 12 455 167 467 181 +9956 /data/VOCdevkit/VOC2012/JPEGImages/2009_001188.jpg 500 375 19 257 82 380 198 +9957 /data/VOCdevkit/VOC2012/JPEGImages/2009_001190.jpg 500 375 17 1 145 500 375 14 1 65 436 375 14 196 38 471 375 +9958 /data/VOCdevkit/VOC2012/JPEGImages/2009_001192.jpg 500 333 18 81 94 341 234 +9959 /data/VOCdevkit/VOC2012/JPEGImages/2009_001194.jpg 500 334 1 43 32 500 334 +9960 /data/VOCdevkit/VOC2012/JPEGImages/2009_001195.jpg 500 375 0 1 1 500 270 +9961 /data/VOCdevkit/VOC2012/JPEGImages/2009_001196.jpg 500 333 12 114 84 338 262 +9962 /data/VOCdevkit/VOC2012/JPEGImages/2009_001197.jpg 500 393 5 130 101 467 353 5 107 180 169 253 6 7 229 110 270 6 117 250 133 302 +9963 /data/VOCdevkit/VOC2012/JPEGImages/2009_001198.jpg 500 333 7 11 1 500 260 +9964 /data/VOCdevkit/VOC2012/JPEGImages/2009_001199.jpg 500 333 14 355 190 384 217 0 1 60 453 196 +9965 /data/VOCdevkit/VOC2012/JPEGImages/2009_001201.jpg 500 375 11 108 97 304 242 +9966 /data/VOCdevkit/VOC2012/JPEGImages/2009_001203.jpg 500 335 16 74 45 379 303 +9967 /data/VOCdevkit/VOC2012/JPEGImages/2009_001205.jpg 500 333 7 118 32 381 296 +9968 /data/VOCdevkit/VOC2012/JPEGImages/2009_001206.jpg 453 500 13 131 1 453 500 13 1 1 453 448 +9969 /data/VOCdevkit/VOC2012/JPEGImages/2009_001207.jpg 500 333 4 139 72 198 333 14 175 95 367 333 +9970 /data/VOCdevkit/VOC2012/JPEGImages/2009_001208.jpg 500 423 2 251 163 378 313 +9971 /data/VOCdevkit/VOC2012/JPEGImages/2009_001212.jpg 500 375 17 1 26 500 375 14 133 63 311 299 +9972 /data/VOCdevkit/VOC2012/JPEGImages/2009_001215.jpg 500 375 10 1 1 500 375 14 1 1 195 60 +9973 /data/VOCdevkit/VOC2012/JPEGImages/2009_001216.jpg 333 500 6 153 40 316 133 6 1 91 333 500 +9974 /data/VOCdevkit/VOC2012/JPEGImages/2009_001217.jpg 500 334 10 2 82 500 334 8 382 264 500 334 +9975 /data/VOCdevkit/VOC2012/JPEGImages/2009_001221.jpg 500 375 2 68 104 373 273 2 415 1 500 149 +9976 /data/VOCdevkit/VOC2012/JPEGImages/2009_001224.jpg 500 375 4 160 216 393 282 11 78 20 242 263 +9977 /data/VOCdevkit/VOC2012/JPEGImages/2009_001225.jpg 500 375 11 145 74 366 284 +9978 /data/VOCdevkit/VOC2012/JPEGImages/2009_001227.jpg 500 333 7 300 24 500 312 7 1 163 386 333 +9979 /data/VOCdevkit/VOC2012/JPEGImages/2009_001229.jpg 500 375 15 310 85 416 339 +9980 /data/VOCdevkit/VOC2012/JPEGImages/2009_001230.jpg 500 375 14 167 168 184 193 14 215 163 234 217 14 256 169 275 226 14 229 167 241 217 14 361 124 371 133 3 341 116 400 147 +9981 /data/VOCdevkit/VOC2012/JPEGImages/2009_001236.jpg 333 500 16 36 212 276 469 16 1 69 312 410 16 282 94 333 391 +9982 /data/VOCdevkit/VOC2012/JPEGImages/2009_001237.jpg 500 357 6 419 245 500 320 5 89 64 403 305 14 120 191 152 219 +9983 /data/VOCdevkit/VOC2012/JPEGImages/2009_001238.jpg 500 334 14 1 61 181 334 14 147 51 456 334 +9984 /data/VOCdevkit/VOC2012/JPEGImages/2009_001240.jpg 375 500 6 1 225 205 341 +9985 /data/VOCdevkit/VOC2012/JPEGImages/2009_001241.jpg 500 375 17 4 212 250 375 15 221 237 266 290 +9986 /data/VOCdevkit/VOC2012/JPEGImages/2009_001242.jpg 500 343 2 83 79 483 286 +9987 /data/VOCdevkit/VOC2012/JPEGImages/2009_001243.jpg 500 375 8 83 16 424 375 17 342 1 500 192 +9988 /data/VOCdevkit/VOC2012/JPEGImages/2009_001245.jpg 500 375 18 79 143 407 274 6 35 209 45 221 +9989 /data/VOCdevkit/VOC2012/JPEGImages/2009_001249.jpg 500 334 8 332 177 407 259 8 318 176 383 247 8 218 196 288 279 8 101 181 178 259 8 115 176 182 245 15 304 162 371 208 15 143 165 208 230 17 209 169 305 235 15 284 152 316 166 15 199 151 225 170 15 309 110 385 170 15 114 107 235 176 +9990 /data/VOCdevkit/VOC2012/JPEGImages/2009_001251.jpg 334 500 11 1 101 288 436 +9991 /data/VOCdevkit/VOC2012/JPEGImages/2009_001252.jpg 500 382 2 56 237 123 259 2 348 244 383 260 +9992 /data/VOCdevkit/VOC2012/JPEGImages/2009_001253.jpg 375 500 13 84 105 291 454 +9993 /data/VOCdevkit/VOC2012/JPEGImages/2009_001254.jpg 500 346 14 77 18 245 307 +9994 /data/VOCdevkit/VOC2012/JPEGImages/2009_001255.jpg 500 334 1 122 50 487 297 1 55 23 427 242 6 19 1 500 172 +9995 /data/VOCdevkit/VOC2012/JPEGImages/2009_001257.jpg 500 333 9 270 53 431 333 +9996 /data/VOCdevkit/VOC2012/JPEGImages/2009_001259.jpg 500 333 18 1 71 472 292 +9997 /data/VOCdevkit/VOC2012/JPEGImages/2009_001260.jpg 500 375 7 228 152 298 256 +9998 /data/VOCdevkit/VOC2012/JPEGImages/2009_001263.jpg 500 375 16 357 234 440 291 16 409 262 500 375 16 150 271 290 375 16 28 206 108 259 16 1 281 155 375 16 1 249 70 296 16 444 233 500 277 16 190 216 251 281 16 1 220 48 257 +9999 /data/VOCdevkit/VOC2012/JPEGImages/2009_001264.jpg 331 500 2 180 151 280 263 +10000 /data/VOCdevkit/VOC2012/JPEGImages/2009_001266.jpg 500 333 14 194 110 313 333 +10001 /data/VOCdevkit/VOC2012/JPEGImages/2009_001268.jpg 333 500 17 1 182 256 308 +10002 /data/VOCdevkit/VOC2012/JPEGImages/2009_001270.jpg 438 500 7 81 150 438 436 +10003 /data/VOCdevkit/VOC2012/JPEGImages/2009_001271.jpg 500 375 11 101 148 330 375 +10004 /data/VOCdevkit/VOC2012/JPEGImages/2009_001278.jpg 500 327 4 205 143 247 296 +10005 /data/VOCdevkit/VOC2012/JPEGImages/2009_001279.jpg 500 334 7 159 1 500 334 +10006 /data/VOCdevkit/VOC2012/JPEGImages/2009_001282.jpg 500 288 3 387 38 455 194 14 394 157 417 189 14 38 203 83 239 3 59 25 141 255 +10007 /data/VOCdevkit/VOC2012/JPEGImages/2009_001283.jpg 500 333 2 220 58 303 256 2 294 118 359 179 2 187 73 249 125 +10008 /data/VOCdevkit/VOC2012/JPEGImages/2009_001285.jpg 500 375 8 27 24 484 346 +10009 /data/VOCdevkit/VOC2012/JPEGImages/2009_001286.jpg 500 375 11 150 1 409 375 14 1 58 240 274 +10010 /data/VOCdevkit/VOC2012/JPEGImages/2009_001288.jpg 500 375 11 115 1 500 339 +10011 /data/VOCdevkit/VOC2012/JPEGImages/2009_001289.jpg 333 500 3 125 52 206 370 +10012 /data/VOCdevkit/VOC2012/JPEGImages/2009_001291.jpg 408 500 18 96 100 317 389 +10013 /data/VOCdevkit/VOC2012/JPEGImages/2009_001299.jpg 500 333 14 37 43 223 307 8 32 95 197 295 8 194 98 331 287 8 330 96 480 291 8 476 95 500 290 +10014 /data/VOCdevkit/VOC2012/JPEGImages/2009_001300.jpg 500 377 18 185 146 390 286 +10015 /data/VOCdevkit/VOC2012/JPEGImages/2009_001301.jpg 400 500 2 1 92 329 500 +10016 /data/VOCdevkit/VOC2012/JPEGImages/2009_001303.jpg 500 333 10 272 193 302 227 8 249 183 279 229 8 293 185 317 226 8 254 201 382 333 8 65 200 193 304 15 18 207 76 284 +10017 /data/VOCdevkit/VOC2012/JPEGImages/2009_001305.jpg 500 375 7 20 39 500 358 +10018 /data/VOCdevkit/VOC2012/JPEGImages/2009_001306.jpg 500 385 6 324 287 500 349 +10019 /data/VOCdevkit/VOC2012/JPEGImages/2009_001308.jpg 363 500 8 217 29 254 85 8 122 16 198 86 8 282 23 341 81 8 43 29 96 82 8 87 83 278 420 8 2 133 109 261 8 2 81 89 172 +10020 /data/VOCdevkit/VOC2012/JPEGImages/2009_001309.jpg 333 500 4 9 216 244 500 +10021 /data/VOCdevkit/VOC2012/JPEGImages/2009_001311.jpg 500 375 2 173 137 300 290 +10022 /data/VOCdevkit/VOC2012/JPEGImages/2009_001312.jpg 500 333 0 19 74 471 270 +10023 /data/VOCdevkit/VOC2012/JPEGImages/2009_001313.jpg 500 375 8 33 176 142 289 8 366 156 486 265 17 162 151 367 246 14 183 132 236 254 +10024 /data/VOCdevkit/VOC2012/JPEGImages/2009_001314.jpg 500 457 2 105 131 290 318 +10025 /data/VOCdevkit/VOC2012/JPEGImages/2009_001316.jpg 500 333 0 5 30 483 297 +10026 /data/VOCdevkit/VOC2012/JPEGImages/2009_001319.jpg 500 333 10 63 167 328 333 14 119 78 216 301 14 15 85 152 318 10 306 168 441 293 10 1 158 74 277 14 1 94 45 154 4 63 116 80 160 +10027 /data/VOCdevkit/VOC2012/JPEGImages/2009_001320.jpg 500 375 13 1 1 482 375 14 372 1 500 346 +10028 /data/VOCdevkit/VOC2012/JPEGImages/2009_001321.jpg 500 333 0 1 1 500 333 0 287 267 372 284 6 47 271 63 282 +10029 /data/VOCdevkit/VOC2012/JPEGImages/2009_001322.jpg 500 375 18 107 195 145 251 +10030 /data/VOCdevkit/VOC2012/JPEGImages/2009_001323.jpg 500 375 12 179 133 298 313 +10031 /data/VOCdevkit/VOC2012/JPEGImages/2009_001326.jpg 500 375 5 72 70 437 307 5 347 141 479 231 5 59 168 75 233 14 39 191 53 232 +10032 /data/VOCdevkit/VOC2012/JPEGImages/2009_001327.jpg 500 333 10 105 211 313 333 8 108 136 190 333 8 181 3 353 333 15 234 163 283 219 +10033 /data/VOCdevkit/VOC2012/JPEGImages/2009_001328.jpg 500 375 4 102 1 240 253 4 35 1 106 122 +10034 /data/VOCdevkit/VOC2012/JPEGImages/2009_001329.jpg 500 335 11 1 27 481 270 +10035 /data/VOCdevkit/VOC2012/JPEGImages/2009_001332.jpg 500 333 0 13 78 489 219 +10036 /data/VOCdevkit/VOC2012/JPEGImages/2009_001333.jpg 500 333 18 29 111 467 315 +10037 /data/VOCdevkit/VOC2012/JPEGImages/2009_001339.jpg 500 375 4 154 191 256 375 4 204 194 244 339 14 219 56 500 284 14 27 11 199 278 10 1 275 500 375 +10038 /data/VOCdevkit/VOC2012/JPEGImages/2009_001343.jpg 500 333 19 229 70 275 112 17 319 105 435 247 17 34 171 232 312 +10039 /data/VOCdevkit/VOC2012/JPEGImages/2009_001344.jpg 500 333 0 63 87 477 244 +10040 /data/VOCdevkit/VOC2012/JPEGImages/2009_001345.jpg 500 375 0 75 35 500 375 14 84 252 113 296 14 55 243 71 292 14 2 240 20 298 14 18 244 40 299 14 46 257 59 290 +10041 /data/VOCdevkit/VOC2012/JPEGImages/2009_001348.jpg 375 500 2 86 16 374 500 +10042 /data/VOCdevkit/VOC2012/JPEGImages/2009_001349.jpg 500 375 16 26 35 282 375 +10043 /data/VOCdevkit/VOC2012/JPEGImages/2009_001350.jpg 403 500 18 60 65 403 409 14 239 415 247 459 14 233 402 242 452 +10044 /data/VOCdevkit/VOC2012/JPEGImages/2009_001354.jpg 500 375 5 168 124 500 316 14 28 184 45 225 +10045 /data/VOCdevkit/VOC2012/JPEGImages/2009_001355.jpg 500 442 12 197 288 334 399 +10046 /data/VOCdevkit/VOC2012/JPEGImages/2009_001357.jpg 500 396 19 274 155 338 239 17 1 178 100 260 8 94 183 210 294 8 126 209 239 390 +10047 /data/VOCdevkit/VOC2012/JPEGImages/2009_001359.jpg 500 333 18 158 104 462 265 +10048 /data/VOCdevkit/VOC2012/JPEGImages/2009_001360.jpg 500 334 2 144 1 344 334 +10049 /data/VOCdevkit/VOC2012/JPEGImages/2009_001361.jpg 500 293 7 32 38 497 293 +10050 /data/VOCdevkit/VOC2012/JPEGImages/2009_001363.jpg 500 375 19 180 6 342 97 +10051 /data/VOCdevkit/VOC2012/JPEGImages/2009_001364.jpg 500 375 1 1 1 500 325 +10052 /data/VOCdevkit/VOC2012/JPEGImages/2009_001366.jpg 500 374 5 14 44 496 334 +10053 /data/VOCdevkit/VOC2012/JPEGImages/2009_001367.jpg 500 375 11 12 137 433 333 +10054 /data/VOCdevkit/VOC2012/JPEGImages/2009_001368.jpg 500 333 11 124 78 381 333 11 21 81 211 333 +10055 /data/VOCdevkit/VOC2012/JPEGImages/2009_001369.jpg 480 461 7 17 9 434 461 +10056 /data/VOCdevkit/VOC2012/JPEGImages/2009_001370.jpg 500 331 13 129 226 161 272 +10057 /data/VOCdevkit/VOC2012/JPEGImages/2009_001371.jpg 500 379 8 365 63 467 259 8 161 66 284 269 8 26 77 137 293 +10058 /data/VOCdevkit/VOC2012/JPEGImages/2009_001372.jpg 500 229 0 66 46 486 199 0 1 101 115 165 +10059 /data/VOCdevkit/VOC2012/JPEGImages/2009_001374.jpg 500 334 6 1 78 463 294 +10060 /data/VOCdevkit/VOC2012/JPEGImages/2009_001375.jpg 500 375 2 63 103 341 236 2 393 104 443 139 2 355 92 380 135 2 274 112 311 137 2 253 115 264 137 +10061 /data/VOCdevkit/VOC2012/JPEGImages/2009_001376.jpg 500 375 14 116 107 500 282 17 1 15 500 375 +10062 /data/VOCdevkit/VOC2012/JPEGImages/2009_001384.jpg 375 500 14 1 222 283 500 1 39 122 352 500 +10063 /data/VOCdevkit/VOC2012/JPEGImages/2009_001385.jpg 500 332 2 79 41 135 179 2 291 173 410 224 2 412 210 500 251 2 253 258 428 317 2 135 52 319 266 +10064 /data/VOCdevkit/VOC2012/JPEGImages/2009_001387.jpg 500 333 0 1 66 479 235 +10065 /data/VOCdevkit/VOC2012/JPEGImages/2009_001388.jpg 500 375 6 250 164 328 217 +10066 /data/VOCdevkit/VOC2012/JPEGImages/2009_001389.jpg 500 333 14 5 3 206 333 14 205 23 500 333 +10067 /data/VOCdevkit/VOC2012/JPEGImages/2009_001390.jpg 500 344 0 8 107 478 223 +10068 /data/VOCdevkit/VOC2012/JPEGImages/2009_001391.jpg 334 500 7 11 98 266 404 +10069 /data/VOCdevkit/VOC2012/JPEGImages/2009_001393.jpg 500 375 19 86 1 467 375 +10070 /data/VOCdevkit/VOC2012/JPEGImages/2009_001395.jpg 338 500 14 114 211 206 325 +10071 /data/VOCdevkit/VOC2012/JPEGImages/2009_001397.jpg 333 500 2 78 79 180 384 +10072 /data/VOCdevkit/VOC2012/JPEGImages/2009_001398.jpg 280 500 8 80 282 143 308 8 190 295 211 329 8 201 313 218 359 8 3 383 128 464 4 157 301 183 397 4 5 304 38 386 10 1 307 221 444 +10073 /data/VOCdevkit/VOC2012/JPEGImages/2009_001403.jpg 335 500 16 129 131 277 441 16 1 1 158 438 16 124 1 335 399 +10074 /data/VOCdevkit/VOC2012/JPEGImages/2009_001406.jpg 500 375 3 1 130 208 240 14 174 190 194 215 14 42 183 56 213 14 16 192 28 209 +10075 /data/VOCdevkit/VOC2012/JPEGImages/2009_001407.jpg 440 500 3 41 18 304 415 14 262 325 342 378 14 258 310 313 372 +10076 /data/VOCdevkit/VOC2012/JPEGImages/2009_001409.jpg 500 250 14 267 76 320 146 +10077 /data/VOCdevkit/VOC2012/JPEGImages/2009_001411.jpg 500 375 7 1 37 192 368 +10078 /data/VOCdevkit/VOC2012/JPEGImages/2009_001412.jpg 500 333 5 1 143 82 182 6 1 174 29 199 18 92 96 429 231 15 118 208 135 223 15 153 211 173 226 15 197 215 217 232 15 247 220 270 237 15 298 223 323 242 15 409 226 431 244 14 378 187 404 242 14 361 170 374 187 +10079 /data/VOCdevkit/VOC2012/JPEGImages/2009_001413.jpg 500 375 9 329 62 494 260 9 111 157 144 195 +10080 /data/VOCdevkit/VOC2012/JPEGImages/2009_001414.jpg 500 334 14 206 1 391 154 4 391 96 442 262 4 99 90 141 214 4 125 81 152 176 +10081 /data/VOCdevkit/VOC2012/JPEGImages/2009_001417.jpg 500 281 15 340 88 500 281 15 1 1 465 281 15 173 1 461 281 +10082 /data/VOCdevkit/VOC2012/JPEGImages/2009_001419.jpg 500 333 7 150 16 384 333 +10083 /data/VOCdevkit/VOC2012/JPEGImages/2009_001422.jpg 408 500 2 63 37 282 472 +10084 /data/VOCdevkit/VOC2012/JPEGImages/2009_001424.jpg 360 500 11 5 1 355 500 +10085 /data/VOCdevkit/VOC2012/JPEGImages/2009_001426.jpg 500 375 10 209 236 500 375 8 383 182 479 254 8 157 191 238 375 8 249 137 278 198 8 68 127 139 193 8 1 171 54 254 +10086 /data/VOCdevkit/VOC2012/JPEGImages/2009_001427.jpg 500 334 13 282 89 489 315 14 342 38 459 237 +10087 /data/VOCdevkit/VOC2012/JPEGImages/2009_001431.jpg 375 500 8 38 40 307 473 +10088 /data/VOCdevkit/VOC2012/JPEGImages/2009_001433.jpg 500 375 12 111 240 283 375 14 185 134 331 367 12 254 203 340 294 14 239 138 289 216 +10089 /data/VOCdevkit/VOC2012/JPEGImages/2009_001434.jpg 500 366 10 1 277 41 326 8 3 265 66 366 8 445 322 500 366 8 454 272 500 328 10 402 253 499 351 8 364 245 417 350 8 289 246 325 274 8 302 261 371 366 8 208 253 248 361 8 233 272 306 366 10 230 254 361 366 8 106 190 129 229 8 135 195 172 246 14 145 171 181 232 14 162 171 180 200 14 300 154 324 183 14 343 162 369 182 +10090 /data/VOCdevkit/VOC2012/JPEGImages/2009_001435.jpg 500 343 0 9 93 494 264 +10091 /data/VOCdevkit/VOC2012/JPEGImages/2009_001437.jpg 500 333 17 230 141 500 333 14 294 107 500 333 14 224 143 361 235 8 78 167 188 273 8 230 149 266 185 +10092 /data/VOCdevkit/VOC2012/JPEGImages/2009_001440.jpg 500 375 17 50 72 494 329 15 1 1 93 143 8 1 131 48 263 15 1 292 67 375 +10093 /data/VOCdevkit/VOC2012/JPEGImages/2009_001443.jpg 500 337 14 388 139 464 251 13 255 208 392 297 +10094 /data/VOCdevkit/VOC2012/JPEGImages/2009_001444.jpg 500 388 7 1 1 344 388 +10095 /data/VOCdevkit/VOC2012/JPEGImages/2009_001446.jpg 500 332 17 1 124 411 332 11 178 82 313 321 15 113 1 160 45 +10096 /data/VOCdevkit/VOC2012/JPEGImages/2009_001447.jpg 500 375 10 247 274 500 375 8 1 238 203 375 8 435 211 484 280 10 210 191 255 217 14 20 89 79 224 15 294 104 303 119 15 275 95 293 119 15 216 93 254 120 8 270 209 442 279 14 134 144 163 170 14 375 143 394 164 14 243 137 272 183 14 232 122 312 258 14 292 94 414 279 14 41 113 250 375 15 68 152 100 206 +10097 /data/VOCdevkit/VOC2012/JPEGImages/2009_001448.jpg 500 375 12 197 102 306 375 12 304 101 500 375 +10098 /data/VOCdevkit/VOC2012/JPEGImages/2009_001449.jpg 500 480 11 55 14 478 480 +10099 /data/VOCdevkit/VOC2012/JPEGImages/2009_001450.jpg 485 500 7 127 160 320 500 14 87 26 412 500 +10100 /data/VOCdevkit/VOC2012/JPEGImages/2009_001452.jpg 500 333 19 29 6 463 318 +10101 /data/VOCdevkit/VOC2012/JPEGImages/2009_001453.jpg 500 334 2 318 106 500 253 2 146 118 325 316 2 38 41 173 261 +10102 /data/VOCdevkit/VOC2012/JPEGImages/2009_001456.jpg 500 333 1 39 39 483 323 +10103 /data/VOCdevkit/VOC2012/JPEGImages/2009_001457.jpg 375 500 12 82 1 375 500 +10104 /data/VOCdevkit/VOC2012/JPEGImages/2009_001462.jpg 500 375 8 249 230 500 375 +10105 /data/VOCdevkit/VOC2012/JPEGImages/2009_001463.jpg 500 333 6 333 157 500 333 14 15 85 89 324 14 153 78 228 307 +10106 /data/VOCdevkit/VOC2012/JPEGImages/2009_001466.jpg 432 330 2 132 59 226 234 +10107 /data/VOCdevkit/VOC2012/JPEGImages/2009_001468.jpg 375 500 18 48 151 247 334 14 277 256 335 437 +10108 /data/VOCdevkit/VOC2012/JPEGImages/2009_001470.jpg 500 375 17 1 70 500 375 11 168 135 336 225 +10109 /data/VOCdevkit/VOC2012/JPEGImages/2009_001472.jpg 500 375 5 30 48 460 331 6 448 208 496 240 5 1 162 37 221 +10110 /data/VOCdevkit/VOC2012/JPEGImages/2009_001474.jpg 375 500 14 84 53 352 446 +10111 /data/VOCdevkit/VOC2012/JPEGImages/2009_001475.jpg 500 332 9 33 25 497 332 +10112 /data/VOCdevkit/VOC2012/JPEGImages/2009_001476.jpg 500 422 11 169 48 371 218 +10113 /data/VOCdevkit/VOC2012/JPEGImages/2009_001479.jpg 339 500 14 31 80 324 432 +10114 /data/VOCdevkit/VOC2012/JPEGImages/2009_001480.jpg 375 500 1 1 261 362 500 4 213 369 259 456 +10115 /data/VOCdevkit/VOC2012/JPEGImages/2009_001481.jpg 500 333 1 37 70 356 296 6 415 192 500 256 +10116 /data/VOCdevkit/VOC2012/JPEGImages/2009_001484.jpg 500 333 7 123 53 500 333 +10117 /data/VOCdevkit/VOC2012/JPEGImages/2009_001490.jpg 500 375 8 4 56 418 375 +10118 /data/VOCdevkit/VOC2012/JPEGImages/2009_001493.jpg 500 333 18 136 61 474 229 8 1 143 75 333 +10119 /data/VOCdevkit/VOC2012/JPEGImages/2009_001494.jpg 375 500 4 73 7 347 500 +10120 /data/VOCdevkit/VOC2012/JPEGImages/2009_001498.jpg 500 334 11 95 1 500 317 +10121 /data/VOCdevkit/VOC2012/JPEGImages/2009_001500.jpg 500 375 12 121 89 364 294 12 382 87 423 118 12 1 93 46 238 6 115 79 171 115 +10122 /data/VOCdevkit/VOC2012/JPEGImages/2009_001501.jpg 500 333 0 22 88 482 262 +10123 /data/VOCdevkit/VOC2012/JPEGImages/2009_001502.jpg 500 375 7 164 1 448 249 +10124 /data/VOCdevkit/VOC2012/JPEGImages/2009_001505.jpg 500 374 16 1 45 41 161 16 170 168 344 368 16 297 92 500 351 16 466 230 500 310 +10125 /data/VOCdevkit/VOC2012/JPEGImages/2009_001507.jpg 500 274 11 109 54 488 236 8 1 1 500 274 +10126 /data/VOCdevkit/VOC2012/JPEGImages/2009_001508.jpg 500 204 14 31 37 151 203 14 142 45 252 203 14 351 51 486 204 14 251 48 337 153 +10127 /data/VOCdevkit/VOC2012/JPEGImages/2009_001509.jpg 500 333 14 386 34 396 59 14 370 45 379 70 14 324 54 335 83 14 279 64 288 85 14 265 65 274 83 14 86 22 101 65 0 1 66 486 261 0 119 1 343 48 +10128 /data/VOCdevkit/VOC2012/JPEGImages/2009_001514.jpg 500 486 15 240 347 325 452 15 121 351 219 473 15 15 111 263 428 15 176 12 488 423 +10129 /data/VOCdevkit/VOC2012/JPEGImages/2009_001516.jpg 500 375 18 48 139 500 289 +10130 /data/VOCdevkit/VOC2012/JPEGImages/2009_001517.jpg 500 375 0 1 54 497 375 +10131 /data/VOCdevkit/VOC2012/JPEGImages/2009_001518.jpg 500 335 9 144 133 194 217 9 353 126 488 280 9 129 51 427 335 +10132 /data/VOCdevkit/VOC2012/JPEGImages/2009_001519.jpg 500 333 6 366 231 394 245 6 403 220 411 244 6 1 189 132 333 18 1 90 345 262 +10133 /data/VOCdevkit/VOC2012/JPEGImages/2009_001521.jpg 375 500 14 270 169 374 428 14 125 123 284 475 14 1 47 207 500 +10134 /data/VOCdevkit/VOC2012/JPEGImages/2009_001522.jpg 500 332 7 135 31 444 302 +10135 /data/VOCdevkit/VOC2012/JPEGImages/2009_001526.jpg 500 409 19 122 2 478 203 +10136 /data/VOCdevkit/VOC2012/JPEGImages/2009_001534.jpg 500 339 18 16 157 497 241 +10137 /data/VOCdevkit/VOC2012/JPEGImages/2009_001535.jpg 500 334 11 190 45 500 334 +10138 /data/VOCdevkit/VOC2012/JPEGImages/2009_001536.jpg 500 375 6 61 55 397 261 +10139 /data/VOCdevkit/VOC2012/JPEGImages/2009_001537.jpg 500 375 16 90 190 215 282 +10140 /data/VOCdevkit/VOC2012/JPEGImages/2009_001538.jpg 375 500 11 74 73 375 500 +10141 /data/VOCdevkit/VOC2012/JPEGImages/2009_001539.jpg 500 375 14 223 73 300 285 14 389 85 441 255 14 129 95 184 155 12 73 152 405 375 12 301 137 495 300 +10142 /data/VOCdevkit/VOC2012/JPEGImages/2009_001541.jpg 500 333 0 1 82 154 110 0 1 142 156 223 0 55 57 500 283 +10143 /data/VOCdevkit/VOC2012/JPEGImages/2009_001542.jpg 271 500 13 16 11 271 482 13 1 6 123 241 +10144 /data/VOCdevkit/VOC2012/JPEGImages/2009_001544.jpg 500 333 3 73 194 500 322 +10145 /data/VOCdevkit/VOC2012/JPEGImages/2009_001546.jpg 500 375 6 414 283 500 361 14 430 293 449 311 6 304 296 437 357 6 1 216 343 375 +10146 /data/VOCdevkit/VOC2012/JPEGImages/2009_001549.jpg 500 334 0 1 86 489 245 +10147 /data/VOCdevkit/VOC2012/JPEGImages/2009_001550.jpg 500 375 7 32 28 485 374 +10148 /data/VOCdevkit/VOC2012/JPEGImages/2009_001553.jpg 500 333 19 435 192 500 268 14 137 100 325 333 11 44 152 236 333 +10149 /data/VOCdevkit/VOC2012/JPEGImages/2009_001554.jpg 500 333 2 213 132 347 230 +10150 /data/VOCdevkit/VOC2012/JPEGImages/2009_001555.jpg 500 375 19 300 88 500 241 +10151 /data/VOCdevkit/VOC2012/JPEGImages/2009_001558.jpg 375 500 1 96 1 311 500 +10152 /data/VOCdevkit/VOC2012/JPEGImages/2009_001562.jpg 500 333 7 119 47 359 318 +10153 /data/VOCdevkit/VOC2012/JPEGImages/2009_001565.jpg 500 333 2 58 70 451 233 +10154 /data/VOCdevkit/VOC2012/JPEGImages/2009_001566.jpg 500 375 13 246 173 308 264 14 248 146 307 244 14 236 126 255 187 14 227 130 243 187 14 130 135 144 165 +10155 /data/VOCdevkit/VOC2012/JPEGImages/2009_001567.jpg 500 365 3 18 1 286 284 +10156 /data/VOCdevkit/VOC2012/JPEGImages/2009_001568.jpg 500 357 11 21 32 389 276 +10157 /data/VOCdevkit/VOC2012/JPEGImages/2009_001570.jpg 358 500 2 90 96 358 423 +10158 /data/VOCdevkit/VOC2012/JPEGImages/2009_001575.jpg 375 500 10 1 231 375 500 14 21 163 276 380 8 242 271 368 397 10 296 94 375 123 10 244 78 275 93 14 291 15 338 58 14 232 37 251 49 14 248 32 271 51 14 91 21 116 100 14 127 19 154 97 +10159 /data/VOCdevkit/VOC2012/JPEGImages/2009_001577.jpg 500 332 17 1 1 445 332 11 1 51 249 332 11 184 2 477 133 14 116 19 500 332 +10160 /data/VOCdevkit/VOC2012/JPEGImages/2009_001581.jpg 404 500 17 1 1 404 300 14 69 1 354 330 +10161 /data/VOCdevkit/VOC2012/JPEGImages/2009_001585.jpg 333 500 14 4 103 329 497 6 4 127 330 497 +10162 /data/VOCdevkit/VOC2012/JPEGImages/2009_001587.jpg 500 317 2 176 91 346 191 +10163 /data/VOCdevkit/VOC2012/JPEGImages/2009_001589.jpg 500 333 11 163 24 500 250 +10164 /data/VOCdevkit/VOC2012/JPEGImages/2009_001590.jpg 500 375 5 43 107 428 274 14 446 182 476 250 14 428 186 460 249 14 363 168 378 201 14 311 174 353 208 14 425 185 439 203 14 34 200 40 220 14 150 164 169 200 14 234 177 260 207 +10165 /data/VOCdevkit/VOC2012/JPEGImages/2009_001591.jpg 335 500 6 14 285 327 446 +10166 /data/VOCdevkit/VOC2012/JPEGImages/2009_001593.jpg 375 500 4 103 39 250 461 +10167 /data/VOCdevkit/VOC2012/JPEGImages/2009_001594.jpg 500 333 9 213 173 260 209 +10168 /data/VOCdevkit/VOC2012/JPEGImages/2009_001595.jpg 500 182 0 18 11 480 167 +10169 /data/VOCdevkit/VOC2012/JPEGImages/2009_001598.jpg 333 500 8 46 313 177 461 +10170 /data/VOCdevkit/VOC2012/JPEGImages/2009_001602.jpg 500 375 14 1 1 359 375 +10171 /data/VOCdevkit/VOC2012/JPEGImages/2009_001605.jpg 500 375 17 68 59 500 269 11 153 140 270 267 14 27 1 152 259 14 84 42 487 154 14 1 133 94 359 19 1 1 34 68 4 369 279 423 324 +10172 /data/VOCdevkit/VOC2012/JPEGImages/2009_001606.jpg 500 375 11 1 64 500 336 +10173 /data/VOCdevkit/VOC2012/JPEGImages/2009_001607.jpg 324 500 2 53 58 230 350 +10174 /data/VOCdevkit/VOC2012/JPEGImages/2009_001608.jpg 375 500 10 6 151 198 243 8 239 147 285 221 8 42 163 104 254 8 106 163 156 253 8 161 147 217 239 8 1 157 51 241 17 1 360 274 500 19 285 148 330 229 14 89 77 121 104 +10175 /data/VOCdevkit/VOC2012/JPEGImages/2009_001611.jpg 500 375 8 64 188 270 375 14 24 86 236 375 14 277 76 500 375 11 297 154 498 375 +10176 /data/VOCdevkit/VOC2012/JPEGImages/2009_001612.jpg 500 374 6 51 81 461 308 6 1 64 231 127 6 1 71 231 244 +10177 /data/VOCdevkit/VOC2012/JPEGImages/2009_001614.jpg 500 375 5 106 85 345 275 14 413 194 433 249 +10178 /data/VOCdevkit/VOC2012/JPEGImages/2009_001615.jpg 500 375 19 27 200 180 336 14 200 100 338 347 +10179 /data/VOCdevkit/VOC2012/JPEGImages/2009_001617.jpg 500 375 14 359 75 468 330 14 38 95 114 224 +10180 /data/VOCdevkit/VOC2012/JPEGImages/2009_001618.jpg 500 375 16 406 103 467 146 16 12 70 45 87 16 89 66 125 82 16 92 87 144 124 16 126 106 183 149 16 143 97 208 130 +10181 /data/VOCdevkit/VOC2012/JPEGImages/2009_001621.jpg 500 375 8 111 122 240 262 +10182 /data/VOCdevkit/VOC2012/JPEGImages/2009_001623.jpg 500 375 7 324 122 387 267 7 298 138 424 207 8 159 1 222 158 8 49 1 175 226 +10183 /data/VOCdevkit/VOC2012/JPEGImages/2009_001625.jpg 375 500 4 120 95 238 463 +10184 /data/VOCdevkit/VOC2012/JPEGImages/2009_001627.jpg 375 500 15 1 49 375 500 +10185 /data/VOCdevkit/VOC2012/JPEGImages/2009_001631.jpg 500 333 17 1 152 176 269 +10186 /data/VOCdevkit/VOC2012/JPEGImages/2009_001633.jpg 375 500 5 20 16 346 497 5 304 153 375 386 +10187 /data/VOCdevkit/VOC2012/JPEGImages/2009_001635.jpg 333 500 12 1 135 294 500 14 168 64 231 172 14 56 23 282 428 12 107 151 333 478 +10188 /data/VOCdevkit/VOC2012/JPEGImages/2009_001636.jpg 500 333 12 85 52 341 333 12 258 13 463 333 +10189 /data/VOCdevkit/VOC2012/JPEGImages/2009_001638.jpg 500 333 13 21 1 500 297 +10190 /data/VOCdevkit/VOC2012/JPEGImages/2009_001640.jpg 375 500 4 122 1 261 500 +10191 /data/VOCdevkit/VOC2012/JPEGImages/2009_001642.jpg 500 388 1 7 134 417 378 14 160 11 308 359 1 277 146 455 280 14 348 61 432 273 +10192 /data/VOCdevkit/VOC2012/JPEGImages/2009_001643.jpg 500 346 16 318 100 391 157 16 182 194 249 239 16 80 201 191 241 +10193 /data/VOCdevkit/VOC2012/JPEGImages/2009_001644.jpg 500 375 19 288 131 386 193 15 459 109 500 202 17 112 153 288 220 17 1 158 68 255 15 4 80 89 182 +10194 /data/VOCdevkit/VOC2012/JPEGImages/2009_001645.jpg 269 500 13 7 28 269 497 13 1 45 95 258 +10195 /data/VOCdevkit/VOC2012/JPEGImages/2009_001646.jpg 500 334 13 57 35 488 296 14 321 1 398 125 13 1 2 211 125 1 425 1 500 48 +10196 /data/VOCdevkit/VOC2012/JPEGImages/2009_001648.jpg 500 315 18 237 100 404 221 18 473 134 500 194 18 2 44 189 269 +10197 /data/VOCdevkit/VOC2012/JPEGImages/2009_001651.jpg 500 375 18 1 1 264 206 18 408 119 500 184 +10198 /data/VOCdevkit/VOC2012/JPEGImages/2009_001653.jpg 333 500 12 1 1 333 500 +10199 /data/VOCdevkit/VOC2012/JPEGImages/2009_001657.jpg 500 333 14 366 158 500 328 13 410 220 500 333 14 1 47 98 176 14 96 39 124 88 14 118 41 182 92 14 167 39 218 99 14 268 63 321 102 14 437 71 492 130 +10200 /data/VOCdevkit/VOC2012/JPEGImages/2009_001660.jpg 500 333 2 190 40 308 191 +10201 /data/VOCdevkit/VOC2012/JPEGImages/2009_001663.jpg 333 500 14 134 107 226 233 1 109 205 223 330 +10202 /data/VOCdevkit/VOC2012/JPEGImages/2009_001664.jpg 500 339 12 129 1 455 301 +10203 /data/VOCdevkit/VOC2012/JPEGImages/2009_001667.jpg 500 375 15 98 48 500 375 15 1 1 228 311 +10204 /data/VOCdevkit/VOC2012/JPEGImages/2009_001670.jpg 500 375 10 17 105 458 375 8 322 32 426 128 8 58 38 155 153 8 361 121 500 375 8 1 229 140 375 15 26 43 72 102 +10205 /data/VOCdevkit/VOC2012/JPEGImages/2009_001671.jpg 500 375 18 1 12 423 375 +10206 /data/VOCdevkit/VOC2012/JPEGImages/2009_001673.jpg 500 333 9 23 84 148 263 9 381 100 489 237 9 315 94 438 251 9 181 96 319 277 9 127 94 245 269 +10207 /data/VOCdevkit/VOC2012/JPEGImages/2009_001674.jpg 500 375 5 60 87 432 292 +10208 /data/VOCdevkit/VOC2012/JPEGImages/2009_001675.jpg 500 375 5 63 27 456 374 6 1 165 74 331 +10209 /data/VOCdevkit/VOC2012/JPEGImages/2009_001676.jpg 334 500 8 22 55 307 469 +10210 /data/VOCdevkit/VOC2012/JPEGImages/2009_001677.jpg 500 375 6 1 52 28 84 6 15 51 69 85 6 59 45 132 89 6 114 30 169 77 14 123 36 136 85 14 134 37 153 85 6 164 36 208 63 6 207 36 229 59 6 222 29 255 61 6 291 37 349 71 6 339 38 426 76 6 416 29 500 79 13 80 103 390 358 14 180 16 335 348 +10211 /data/VOCdevkit/VOC2012/JPEGImages/2009_001678.jpg 500 334 6 117 43 500 334 +10212 /data/VOCdevkit/VOC2012/JPEGImages/2009_001682.jpg 500 375 19 165 126 352 250 +10213 /data/VOCdevkit/VOC2012/JPEGImages/2009_001683.jpg 400 500 2 136 68 343 416 +10214 /data/VOCdevkit/VOC2012/JPEGImages/2009_001684.jpg 500 335 15 150 61 454 268 +10215 /data/VOCdevkit/VOC2012/JPEGImages/2009_001687.jpg 375 500 11 44 95 318 375 14 207 193 375 463 +10216 /data/VOCdevkit/VOC2012/JPEGImages/2009_001689.jpg 500 375 7 55 1 362 300 +10217 /data/VOCdevkit/VOC2012/JPEGImages/2009_001690.jpg 500 281 14 223 1 500 281 14 1 15 226 281 +10218 /data/VOCdevkit/VOC2012/JPEGImages/2009_001693.jpg 333 500 2 78 1 261 161 +10219 /data/VOCdevkit/VOC2012/JPEGImages/2009_001695.jpg 331 500 1 1 295 331 500 4 257 196 273 258 4 274 197 282 245 4 286 200 301 261 4 228 222 248 260 +10220 /data/VOCdevkit/VOC2012/JPEGImages/2009_001696.jpg 500 169 14 407 130 418 141 14 190 128 202 148 0 1 42 483 146 0 151 42 409 84 0 1 92 36 112 +10221 /data/VOCdevkit/VOC2012/JPEGImages/2009_001699.jpg 500 285 16 211 124 293 198 +10222 /data/VOCdevkit/VOC2012/JPEGImages/2009_001704.jpg 500 375 15 13 51 89 193 1 38 45 500 367 +10223 /data/VOCdevkit/VOC2012/JPEGImages/2009_001705.jpg 500 375 4 179 178 281 324 14 1 10 415 375 14 451 92 500 211 +10224 /data/VOCdevkit/VOC2012/JPEGImages/2009_001706.jpg 450 350 11 97 1 450 350 +10225 /data/VOCdevkit/VOC2012/JPEGImages/2009_001707.jpg 500 386 5 116 30 472 352 14 184 120 255 193 +10226 /data/VOCdevkit/VOC2012/JPEGImages/2009_001709.jpg 500 375 14 183 182 348 375 +10227 /data/VOCdevkit/VOC2012/JPEGImages/2009_001713.jpg 500 336 0 38 91 380 216 +10228 /data/VOCdevkit/VOC2012/JPEGImages/2009_001715.jpg 500 375 3 163 48 374 191 3 1 114 489 375 3 381 185 440 233 +10229 /data/VOCdevkit/VOC2012/JPEGImages/2009_001718.jpg 375 500 14 41 140 286 500 1 40 310 264 500 +10230 /data/VOCdevkit/VOC2012/JPEGImages/2009_001719.jpg 500 375 7 318 10 469 75 17 1 39 500 317 +10231 /data/VOCdevkit/VOC2012/JPEGImages/2009_001720.jpg 500 334 4 263 1 387 115 +10232 /data/VOCdevkit/VOC2012/JPEGImages/2009_001723.jpg 500 375 3 146 171 215 214 +10233 /data/VOCdevkit/VOC2012/JPEGImages/2009_001724.jpg 500 333 12 74 76 231 321 12 181 82 438 311 +10234 /data/VOCdevkit/VOC2012/JPEGImages/2009_001731.jpg 500 318 17 190 199 347 265 +10235 /data/VOCdevkit/VOC2012/JPEGImages/2009_001732.jpg 500 333 16 163 147 249 292 16 229 135 297 270 16 407 118 458 198 16 323 105 369 179 16 286 122 336 222 16 179 94 233 148 16 134 118 195 213 16 246 115 286 150 +10236 /data/VOCdevkit/VOC2012/JPEGImages/2009_001733.jpg 375 500 11 61 81 280 402 +10237 /data/VOCdevkit/VOC2012/JPEGImages/2009_001734.jpg 500 375 5 100 154 419 269 14 52 196 79 271 +10238 /data/VOCdevkit/VOC2012/JPEGImages/2009_001735.jpg 375 500 18 112 179 326 357 +10239 /data/VOCdevkit/VOC2012/JPEGImages/2009_001738.jpg 500 375 16 137 1 199 39 16 82 21 429 301 +10240 /data/VOCdevkit/VOC2012/JPEGImages/2009_001740.jpg 375 500 14 1 1 331 329 +10241 /data/VOCdevkit/VOC2012/JPEGImages/2009_001741.jpg 375 500 2 161 151 213 184 +10242 /data/VOCdevkit/VOC2012/JPEGImages/2009_001743.jpg 500 375 14 57 2 455 375 14 73 173 268 375 17 1 12 500 375 4 156 227 255 289 +10243 /data/VOCdevkit/VOC2012/JPEGImages/2009_001744.jpg 500 375 6 79 80 423 276 +10244 /data/VOCdevkit/VOC2012/JPEGImages/2009_001746.jpg 500 375 17 17 200 500 375 +10245 /data/VOCdevkit/VOC2012/JPEGImages/2009_001747.jpg 500 248 18 1 3 500 223 18 255 46 399 130 +10246 /data/VOCdevkit/VOC2012/JPEGImages/2009_001749.jpg 500 375 12 337 104 443 375 12 422 128 478 233 12 150 104 353 375 12 81 104 189 375 12 225 99 316 181 12 1 158 132 357 12 441 159 500 374 +10247 /data/VOCdevkit/VOC2012/JPEGImages/2009_001750.jpg 500 375 13 89 161 386 357 14 120 72 235 323 13 51 168 79 193 14 54 154 73 184 +10248 /data/VOCdevkit/VOC2012/JPEGImages/2009_001751.jpg 500 333 2 136 168 279 284 +10249 /data/VOCdevkit/VOC2012/JPEGImages/2009_001752.jpg 500 375 5 77 70 382 223 +10250 /data/VOCdevkit/VOC2012/JPEGImages/2009_001754.jpg 500 375 10 115 218 383 375 8 262 259 412 375 8 304 216 407 321 8 259 204 294 236 8 122 233 243 375 8 94 215 192 361 8 145 194 198 224 8 1 207 81 303 +10251 /data/VOCdevkit/VOC2012/JPEGImages/2009_001755.jpg 500 375 13 344 123 485 265 +10252 /data/VOCdevkit/VOC2012/JPEGImages/2009_001758.jpg 375 500 1 153 103 286 249 1 53 140 254 381 1 76 142 286 476 14 118 24 172 174 14 217 3 276 234 14 280 1 375 270 14 339 36 375 353 +10253 /data/VOCdevkit/VOC2012/JPEGImages/2009_001759.jpg 500 375 14 367 111 500 235 14 308 106 347 221 14 41 91 212 338 14 246 104 274 203 14 219 101 237 128 14 190 98 216 137 13 25 134 212 375 13 371 117 500 273 13 263 129 370 229 13 206 119 282 201 +10254 /data/VOCdevkit/VOC2012/JPEGImages/2009_001764.jpg 375 500 13 129 164 265 385 14 118 81 283 348 13 173 58 200 135 +10255 /data/VOCdevkit/VOC2012/JPEGImages/2009_001765.jpg 500 333 2 178 93 344 246 +10256 /data/VOCdevkit/VOC2012/JPEGImages/2009_001767.jpg 500 333 6 143 112 322 213 14 342 109 406 280 +10257 /data/VOCdevkit/VOC2012/JPEGImages/2009_001768.jpg 500 418 14 166 1 316 70 16 71 42 197 384 16 155 31 281 373 16 244 58 458 326 +10258 /data/VOCdevkit/VOC2012/JPEGImages/2009_001770.jpg 500 374 3 161 171 250 237 3 441 126 500 301 +10259 /data/VOCdevkit/VOC2012/JPEGImages/2009_001774.jpg 500 333 11 198 43 349 315 17 1 1 500 333 +10260 /data/VOCdevkit/VOC2012/JPEGImages/2009_001775.jpg 500 415 8 1 170 193 415 17 218 193 500 372 15 150 81 261 228 15 40 294 150 401 +10261 /data/VOCdevkit/VOC2012/JPEGImages/2009_001778.jpg 500 375 11 1 151 285 355 14 286 1 369 188 14 357 4 424 183 5 440 113 488 139 +10262 /data/VOCdevkit/VOC2012/JPEGImages/2009_001779.jpg 334 500 19 79 86 200 233 19 185 90 313 219 +10263 /data/VOCdevkit/VOC2012/JPEGImages/2009_001780.jpg 500 375 1 28 17 437 342 +10264 /data/VOCdevkit/VOC2012/JPEGImages/2009_001781.jpg 500 375 0 14 88 488 311 +10265 /data/VOCdevkit/VOC2012/JPEGImages/2009_001782.jpg 500 375 6 19 80 448 275 +10266 /data/VOCdevkit/VOC2012/JPEGImages/2009_001783.jpg 500 333 16 207 120 444 294 16 152 49 449 292 +10267 /data/VOCdevkit/VOC2012/JPEGImages/2009_001784.jpg 375 500 8 20 1 375 500 +10268 /data/VOCdevkit/VOC2012/JPEGImages/2009_001792.jpg 334 500 11 3 62 334 500 +10269 /data/VOCdevkit/VOC2012/JPEGImages/2009_001794.jpg 500 375 3 23 104 171 307 3 234 109 368 331 3 232 59 392 100 14 355 49 375 87 3 1 135 40 209 3 461 120 500 254 14 464 118 487 144 3 368 120 483 360 14 366 192 412 258 14 439 205 487 268 14 435 155 470 205 14 440 181 479 229 14 364 179 405 228 14 363 168 395 212 +10270 /data/VOCdevkit/VOC2012/JPEGImages/2009_001798.jpg 500 375 9 113 122 343 277 +10271 /data/VOCdevkit/VOC2012/JPEGImages/2009_001799.jpg 500 375 14 377 55 500 358 4 376 234 456 375 4 272 238 353 375 4 255 238 300 375 4 181 180 221 375 4 133 234 210 375 4 9 227 127 375 14 198 107 396 331 14 17 111 143 266 4 1 193 29 324 +10272 /data/VOCdevkit/VOC2012/JPEGImages/2009_001800.jpg 500 333 10 1 1 500 333 8 20 1 164 168 8 214 1 310 30 8 17 1 130 95 +10273 /data/VOCdevkit/VOC2012/JPEGImages/2009_001801.jpg 500 375 14 171 60 321 375 2 222 51 325 186 14 146 104 173 192 14 4 98 25 162 +10274 /data/VOCdevkit/VOC2012/JPEGImages/2009_001802.jpg 500 442 18 196 173 306 320 +10275 /data/VOCdevkit/VOC2012/JPEGImages/2009_001804.jpg 500 385 5 84 98 454 312 5 37 159 63 200 14 155 161 188 191 +10276 /data/VOCdevkit/VOC2012/JPEGImages/2009_001805.jpg 500 336 13 1 188 412 336 14 460 86 500 231 14 270 65 442 336 14 196 77 290 233 14 209 149 278 241 +10277 /data/VOCdevkit/VOC2012/JPEGImages/2009_001806.jpg 500 375 8 1 71 229 375 15 273 1 500 375 +10278 /data/VOCdevkit/VOC2012/JPEGImages/2009_001807.jpg 334 500 2 1 85 334 500 +10279 /data/VOCdevkit/VOC2012/JPEGImages/2009_001809.jpg 500 375 19 337 11 412 87 14 440 164 500 375 14 257 180 422 375 14 99 178 276 375 14 40 34 151 375 +10280 /data/VOCdevkit/VOC2012/JPEGImages/2009_001810.jpg 375 500 14 1 46 375 500 4 50 245 238 485 +10281 /data/VOCdevkit/VOC2012/JPEGImages/2009_001811.jpg 500 375 5 152 122 394 268 6 1 271 42 364 6 1 187 102 282 6 1 172 97 231 6 94 178 120 195 +10282 /data/VOCdevkit/VOC2012/JPEGImages/2009_001812.jpg 375 500 19 66 63 356 340 +10283 /data/VOCdevkit/VOC2012/JPEGImages/2009_001816.jpg 500 375 5 16 66 411 295 +10284 /data/VOCdevkit/VOC2012/JPEGImages/2009_001817.jpg 333 500 8 121 298 181 411 +10285 /data/VOCdevkit/VOC2012/JPEGImages/2009_001818.jpg 281 500 4 144 13 265 455 +10286 /data/VOCdevkit/VOC2012/JPEGImages/2009_001820.jpg 500 251 6 199 160 303 189 +10287 /data/VOCdevkit/VOC2012/JPEGImages/2009_001822.jpg 500 375 14 93 180 133 224 14 180 182 230 375 5 32 1 444 333 +10288 /data/VOCdevkit/VOC2012/JPEGImages/2009_001823.jpg 500 333 18 116 16 369 309 +10289 /data/VOCdevkit/VOC2012/JPEGImages/2009_001825.jpg 332 500 8 211 112 265 145 8 208 329 332 500 8 9 159 209 473 8 84 134 131 242 8 116 116 151 205 10 104 143 332 460 +10290 /data/VOCdevkit/VOC2012/JPEGImages/2009_001826.jpg 500 334 3 221 200 251 220 +10291 /data/VOCdevkit/VOC2012/JPEGImages/2009_001827.jpg 500 333 13 13 109 288 261 14 83 36 210 201 +10292 /data/VOCdevkit/VOC2012/JPEGImages/2009_001828.jpg 333 500 11 146 172 248 441 +10293 /data/VOCdevkit/VOC2012/JPEGImages/2009_001830.jpg 375 500 1 239 118 369 385 1 197 153 243 299 +10294 /data/VOCdevkit/VOC2012/JPEGImages/2009_001831.jpg 500 337 18 36 188 483 295 +10295 /data/VOCdevkit/VOC2012/JPEGImages/2009_001833.jpg 500 375 11 104 115 325 264 +10296 /data/VOCdevkit/VOC2012/JPEGImages/2009_001835.jpg 375 500 7 92 1 375 500 +10297 /data/VOCdevkit/VOC2012/JPEGImages/2009_001837.jpg 500 398 12 47 82 461 365 +10298 /data/VOCdevkit/VOC2012/JPEGImages/2009_001839.jpg 500 333 19 90 105 245 231 19 368 102 461 222 19 482 102 500 215 +10299 /data/VOCdevkit/VOC2012/JPEGImages/2009_001840.jpg 500 375 1 53 33 485 342 +10300 /data/VOCdevkit/VOC2012/JPEGImages/2009_001846.jpg 500 375 8 26 35 467 375 14 61 105 232 375 14 78 43 421 375 14 237 97 411 348 14 196 138 323 347 +10301 /data/VOCdevkit/VOC2012/JPEGImages/2009_001847.jpg 500 375 5 49 95 445 288 14 461 172 487 249 +10302 /data/VOCdevkit/VOC2012/JPEGImages/2009_001848.jpg 375 500 4 132 8 250 479 8 316 216 375 315 +10303 /data/VOCdevkit/VOC2012/JPEGImages/2009_001850.jpg 500 333 0 50 73 493 170 +10304 /data/VOCdevkit/VOC2012/JPEGImages/2009_001851.jpg 500 357 0 38 107 465 264 +10305 /data/VOCdevkit/VOC2012/JPEGImages/2009_001852.jpg 500 375 14 100 100 262 258 19 12 58 450 350 +10306 /data/VOCdevkit/VOC2012/JPEGImages/2009_001853.jpg 500 375 18 242 127 408 232 +10307 /data/VOCdevkit/VOC2012/JPEGImages/2009_001854.jpg 500 333 5 83 20 386 310 5 1 68 92 275 14 1 189 34 302 +10308 /data/VOCdevkit/VOC2012/JPEGImages/2009_001856.jpg 333 500 14 161 339 247 468 8 34 375 112 485 8 146 378 214 459 8 83 392 171 474 8 1 380 67 500 +10309 /data/VOCdevkit/VOC2012/JPEGImages/2009_001858.jpg 396 500 0 171 95 227 181 +10310 /data/VOCdevkit/VOC2012/JPEGImages/2009_001861.jpg 500 333 6 37 32 474 288 14 216 80 298 152 +10311 /data/VOCdevkit/VOC2012/JPEGImages/2009_001864.jpg 500 333 19 89 122 211 213 15 1 93 55 314 8 294 216 353 326 14 293 187 344 317 +10312 /data/VOCdevkit/VOC2012/JPEGImages/2009_001865.jpg 500 375 14 391 207 423 291 14 370 224 390 296 18 1 150 500 255 +10313 /data/VOCdevkit/VOC2012/JPEGImages/2009_001867.jpg 500 369 10 1 1 500 369 +10314 /data/VOCdevkit/VOC2012/JPEGImages/2009_001868.jpg 500 308 18 264 110 404 201 +10315 /data/VOCdevkit/VOC2012/JPEGImages/2009_001869.jpg 382 500 11 1 1 365 500 +10316 /data/VOCdevkit/VOC2012/JPEGImages/2009_001871.jpg 500 375 17 1 65 292 263 8 371 176 500 373 8 118 98 288 342 8 369 45 454 114 10 144 83 500 350 8 411 146 500 305 +10317 /data/VOCdevkit/VOC2012/JPEGImages/2009_001873.jpg 500 396 9 60 22 500 396 9 52 120 224 396 +10318 /data/VOCdevkit/VOC2012/JPEGImages/2009_001874.jpg 500 375 8 1 158 75 319 17 158 251 500 375 19 400 89 497 165 +10319 /data/VOCdevkit/VOC2012/JPEGImages/2009_001875.jpg 500 333 19 197 9 378 165 14 1 120 500 333 8 396 23 500 139 +10320 /data/VOCdevkit/VOC2012/JPEGImages/2009_001881.jpg 375 500 11 25 118 375 450 +10321 /data/VOCdevkit/VOC2012/JPEGImages/2009_001884.jpg 500 296 0 115 95 332 186 +10322 /data/VOCdevkit/VOC2012/JPEGImages/2009_001885.jpg 500 333 11 247 26 500 333 12 6 3 264 333 +10323 /data/VOCdevkit/VOC2012/JPEGImages/2009_001888.jpg 500 384 17 1 251 164 384 17 253 281 500 384 15 298 124 460 327 +10324 /data/VOCdevkit/VOC2012/JPEGImages/2009_001890.jpg 500 307 12 108 106 276 225 14 191 86 229 182 +10325 /data/VOCdevkit/VOC2012/JPEGImages/2009_001894.jpg 500 375 7 1 18 500 375 +10326 /data/VOCdevkit/VOC2012/JPEGImages/2009_001897.jpg 500 333 5 51 7 359 302 5 356 104 500 279 14 426 213 463 300 +10327 /data/VOCdevkit/VOC2012/JPEGImages/2009_001898.jpg 500 112 6 260 29 458 92 +10328 /data/VOCdevkit/VOC2012/JPEGImages/2009_001902.jpg 479 500 11 17 56 427 437 +10329 /data/VOCdevkit/VOC2012/JPEGImages/2009_001904.jpg 375 500 18 1 50 294 500 +10330 /data/VOCdevkit/VOC2012/JPEGImages/2009_001905.jpg 500 333 0 241 148 344 180 +10331 /data/VOCdevkit/VOC2012/JPEGImages/2009_001906.jpg 500 375 7 141 80 415 300 17 1 1 500 375 14 1 1 204 186 +10332 /data/VOCdevkit/VOC2012/JPEGImages/2009_001907.jpg 500 333 4 172 12 287 309 +10333 /data/VOCdevkit/VOC2012/JPEGImages/2009_001908.jpg 500 333 17 1 31 500 333 14 84 208 433 333 14 98 1 422 333 4 309 151 362 220 +10334 /data/VOCdevkit/VOC2012/JPEGImages/2009_001909.jpg 332 500 14 4 126 283 500 14 1 252 40 289 +10335 /data/VOCdevkit/VOC2012/JPEGImages/2009_001910.jpg 500 318 5 82 27 444 318 +10336 /data/VOCdevkit/VOC2012/JPEGImages/2009_001911.jpg 500 375 12 27 81 128 327 12 153 91 322 229 12 348 78 500 322 +10337 /data/VOCdevkit/VOC2012/JPEGImages/2009_001915.jpg 500 375 1 1 1 500 375 +10338 /data/VOCdevkit/VOC2012/JPEGImages/2009_001916.jpg 396 500 11 51 28 332 484 +10339 /data/VOCdevkit/VOC2012/JPEGImages/2009_001917.jpg 500 333 6 1 96 413 289 +10340 /data/VOCdevkit/VOC2012/JPEGImages/2009_001922.jpg 333 500 10 1 329 333 500 15 26 239 156 398 8 139 284 249 345 8 1 429 95 500 +10341 /data/VOCdevkit/VOC2012/JPEGImages/2009_001926.jpg 500 375 1 1 22 500 375 +10342 /data/VOCdevkit/VOC2012/JPEGImages/2009_001927.jpg 500 339 0 244 113 292 192 +10343 /data/VOCdevkit/VOC2012/JPEGImages/2009_001929.jpg 500 371 2 21 30 455 250 +10344 /data/VOCdevkit/VOC2012/JPEGImages/2009_001931.jpg 333 500 7 1 1 333 500 +10345 /data/VOCdevkit/VOC2012/JPEGImages/2009_001933.jpg 500 375 7 203 69 500 375 4 1 1 238 213 +10346 /data/VOCdevkit/VOC2012/JPEGImages/2009_001934.jpg 500 375 15 31 69 164 279 15 227 134 303 263 15 305 150 417 191 15 335 101 389 154 15 217 293 319 375 14 269 57 379 375 14 132 81 263 375 15 386 253 426 285 +10347 /data/VOCdevkit/VOC2012/JPEGImages/2009_001937.jpg 500 333 4 299 85 356 274 +10348 /data/VOCdevkit/VOC2012/JPEGImages/2009_001940.jpg 500 375 0 52 101 484 257 14 205 124 220 140 14 254 154 500 375 14 1 189 185 375 +10349 /data/VOCdevkit/VOC2012/JPEGImages/2009_001941.jpg 500 375 3 234 76 500 236 3 102 74 381 271 3 1 83 162 294 +10350 /data/VOCdevkit/VOC2012/JPEGImages/2009_001945.jpg 332 500 6 20 156 332 500 6 52 134 143 179 +10351 /data/VOCdevkit/VOC2012/JPEGImages/2009_001948.jpg 333 500 7 19 19 312 423 +10352 /data/VOCdevkit/VOC2012/JPEGImages/2009_001949.jpg 500 375 3 7 210 488 273 +10353 /data/VOCdevkit/VOC2012/JPEGImages/2009_001952.jpg 500 338 14 259 116 456 338 11 44 1 300 338 +10354 /data/VOCdevkit/VOC2012/JPEGImages/2009_001959.jpg 500 375 16 9 89 309 325 +10355 /data/VOCdevkit/VOC2012/JPEGImages/2009_001960.jpg 500 375 11 120 25 451 269 8 2 31 500 375 4 304 8 331 66 4 329 5 348 68 +10356 /data/VOCdevkit/VOC2012/JPEGImages/2009_001961.jpg 500 375 19 96 20 357 211 17 377 87 500 331 +10357 /data/VOCdevkit/VOC2012/JPEGImages/2009_001962.jpg 500 375 11 191 41 415 239 +10358 /data/VOCdevkit/VOC2012/JPEGImages/2009_001964.jpg 500 375 19 309 1 500 152 +10359 /data/VOCdevkit/VOC2012/JPEGImages/2009_001965.jpg 500 336 14 19 24 436 336 +10360 /data/VOCdevkit/VOC2012/JPEGImages/2009_001967.jpg 500 375 5 40 36 404 301 14 324 178 349 222 14 407 222 433 283 14 476 202 500 287 14 461 222 470 286 +10361 /data/VOCdevkit/VOC2012/JPEGImages/2009_001971.jpg 500 334 11 279 206 342 250 14 241 129 287 250 +10362 /data/VOCdevkit/VOC2012/JPEGImages/2009_001972.jpg 359 500 2 34 215 238 433 +10363 /data/VOCdevkit/VOC2012/JPEGImages/2009_001973.jpg 500 446 13 15 11 474 446 +10364 /data/VOCdevkit/VOC2012/JPEGImages/2009_001975.jpg 374 500 15 1 21 374 481 +10365 /data/VOCdevkit/VOC2012/JPEGImages/2009_001976.jpg 500 334 8 212 175 311 334 +10366 /data/VOCdevkit/VOC2012/JPEGImages/2009_001977.jpg 500 375 18 67 242 129 310 18 130 243 190 315 18 187 244 277 311 18 343 246 405 305 +10367 /data/VOCdevkit/VOC2012/JPEGImages/2009_001979.jpg 500 375 14 1 41 237 375 14 351 59 500 375 14 195 1 385 375 +10368 /data/VOCdevkit/VOC2012/JPEGImages/2009_001980.jpg 500 332 17 1 1 451 318 +10369 /data/VOCdevkit/VOC2012/JPEGImages/2009_001984.jpg 500 318 13 21 17 485 311 6 367 1 500 168 6 68 1 369 101 +10370 /data/VOCdevkit/VOC2012/JPEGImages/2009_001988.jpg 500 375 6 21 120 474 299 +10371 /data/VOCdevkit/VOC2012/JPEGImages/2009_001990.jpg 500 333 13 158 158 324 237 12 238 161 254 176 12 282 164 300 178 12 314 164 325 180 13 473 172 500 231 +10372 /data/VOCdevkit/VOC2012/JPEGImages/2009_001991.jpg 500 500 16 71 41 447 495 +10373 /data/VOCdevkit/VOC2012/JPEGImages/2009_001994.jpg 500 375 14 91 31 417 295 +10374 /data/VOCdevkit/VOC2012/JPEGImages/2009_001997.jpg 500 375 6 356 193 368 201 5 297 168 311 183 14 173 203 177 217 14 213 201 223 221 14 12 212 26 247 1 14 227 26 247 +10375 /data/VOCdevkit/VOC2012/JPEGImages/2009_001999.jpg 500 271 2 20 49 236 226 2 292 21 500 242 +10376 /data/VOCdevkit/VOC2012/JPEGImages/2009_002000.jpg 375 500 6 1 1 375 500 +10377 /data/VOCdevkit/VOC2012/JPEGImages/2009_002001.jpg 346 500 0 235 448 346 500 14 147 227 170 285 14 110 229 135 299 14 68 226 93 306 +10378 /data/VOCdevkit/VOC2012/JPEGImages/2009_002002.jpg 500 396 9 107 119 413 298 +10379 /data/VOCdevkit/VOC2012/JPEGImages/2009_002003.jpg 500 276 10 166 42 321 264 8 116 30 255 246 8 291 25 406 252 +10380 /data/VOCdevkit/VOC2012/JPEGImages/2009_002008.jpg 500 375 7 5 59 500 342 +10381 /data/VOCdevkit/VOC2012/JPEGImages/2009_002009.jpg 500 333 18 216 142 396 251 +10382 /data/VOCdevkit/VOC2012/JPEGImages/2009_002010.jpg 500 375 6 21 76 478 267 11 313 97 359 141 +10383 /data/VOCdevkit/VOC2012/JPEGImages/2009_002011.jpg 500 334 0 1 17 491 300 +10384 /data/VOCdevkit/VOC2012/JPEGImages/2009_002012.jpg 500 333 11 33 78 350 333 +10385 /data/VOCdevkit/VOC2012/JPEGImages/2009_002018.jpg 500 269 0 323 182 472 233 +10386 /data/VOCdevkit/VOC2012/JPEGImages/2009_002019.jpg 500 375 9 289 124 342 156 9 148 143 258 206 9 116 166 208 245 +10387 /data/VOCdevkit/VOC2012/JPEGImages/2009_002024.jpg 500 356 10 1 13 500 356 +10388 /data/VOCdevkit/VOC2012/JPEGImages/2009_002031.jpg 500 375 11 9 101 251 270 11 229 69 500 331 +10389 /data/VOCdevkit/VOC2012/JPEGImages/2009_002035.jpg 500 375 9 201 103 363 228 +10390 /data/VOCdevkit/VOC2012/JPEGImages/2009_002037.jpg 500 332 12 15 3 472 332 14 284 1 407 269 +10391 /data/VOCdevkit/VOC2012/JPEGImages/2009_002039.jpg 377 500 11 44 9 377 500 +10392 /data/VOCdevkit/VOC2012/JPEGImages/2009_002040.jpg 500 333 7 1 1 500 333 +10393 /data/VOCdevkit/VOC2012/JPEGImages/2009_002042.jpg 500 334 14 167 152 263 334 +10394 /data/VOCdevkit/VOC2012/JPEGImages/2009_002044.jpg 500 375 6 399 20 422 39 8 348 73 397 105 8 242 78 274 136 8 199 86 241 162 8 154 104 195 196 8 80 129 146 223 8 3 164 51 296 8 394 92 484 187 8 394 111 490 211 8 370 132 484 275 8 330 171 483 367 8 279 248 472 374 10 2 105 423 373 +10395 /data/VOCdevkit/VOC2012/JPEGImages/2009_002046.jpg 280 500 12 12 8 190 468 14 126 91 266 481 +10396 /data/VOCdevkit/VOC2012/JPEGImages/2009_002047.jpg 500 333 0 55 82 483 236 +10397 /data/VOCdevkit/VOC2012/JPEGImages/2009_002052.jpg 500 375 5 63 115 422 221 +10398 /data/VOCdevkit/VOC2012/JPEGImages/2009_002053.jpg 500 333 7 1 1 500 333 +10399 /data/VOCdevkit/VOC2012/JPEGImages/2009_002054.jpg 500 375 14 223 70 348 375 14 35 11 258 375 4 421 214 438 273 4 411 207 426 246 +10400 /data/VOCdevkit/VOC2012/JPEGImages/2009_002055.jpg 500 375 10 69 242 340 375 8 240 228 341 375 8 114 237 227 375 8 85 210 129 367 8 234 212 274 256 8 4 205 46 316 10 1 222 61 309 +10401 /data/VOCdevkit/VOC2012/JPEGImages/2009_002056.jpg 500 495 2 140 81 378 446 +10402 /data/VOCdevkit/VOC2012/JPEGImages/2009_002057.jpg 500 377 14 78 240 114 321 14 124 238 134 255 6 420 258 500 364 5 167 164 368 291 +10403 /data/VOCdevkit/VOC2012/JPEGImages/2009_002058.jpg 375 500 1 81 390 375 500 14 224 103 375 500 6 1 181 142 484 +10404 /data/VOCdevkit/VOC2012/JPEGImages/2009_002060.jpg 500 375 4 185 1 320 365 +10405 /data/VOCdevkit/VOC2012/JPEGImages/2009_002061.jpg 500 348 7 126 1 478 307 7 1 99 125 348 +10406 /data/VOCdevkit/VOC2012/JPEGImages/2009_002064.jpg 500 375 8 45 80 240 236 +10407 /data/VOCdevkit/VOC2012/JPEGImages/2009_002066.jpg 500 375 5 27 104 420 310 14 90 177 112 199 14 116 176 137 202 14 140 177 157 199 14 163 170 182 197 14 194 174 215 195 14 248 152 286 216 +10408 /data/VOCdevkit/VOC2012/JPEGImages/2009_002072.jpg 454 329 2 99 88 342 241 +10409 /data/VOCdevkit/VOC2012/JPEGImages/2009_002073.jpg 500 333 6 28 80 477 232 +10410 /data/VOCdevkit/VOC2012/JPEGImages/2009_002077.jpg 500 375 13 17 1 483 375 +10411 /data/VOCdevkit/VOC2012/JPEGImages/2009_002078.jpg 500 375 8 268 68 319 194 8 169 63 213 106 8 127 79 168 118 8 87 85 145 225 8 35 96 118 253 8 100 129 251 338 8 377 65 439 176 8 369 83 421 167 8 315 92 429 257 8 297 101 430 307 10 71 100 389 277 +10412 /data/VOCdevkit/VOC2012/JPEGImages/2009_002082.jpg 500 375 16 59 123 268 269 16 253 217 443 285 +10413 /data/VOCdevkit/VOC2012/JPEGImages/2009_002083.jpg 500 375 17 74 134 304 355 15 129 104 231 160 +10414 /data/VOCdevkit/VOC2012/JPEGImages/2009_002086.jpg 500 375 2 267 90 355 375 +10415 /data/VOCdevkit/VOC2012/JPEGImages/2009_002087.jpg 500 375 1 19 6 484 305 +10416 /data/VOCdevkit/VOC2012/JPEGImages/2009_002088.jpg 500 375 10 169 152 379 375 14 336 217 463 375 8 456 318 500 375 8 75 255 105 375 14 115 158 192 274 14 42 115 103 309 14 162 153 220 264 14 293 175 399 324 14 288 162 361 238 14 312 143 337 203 14 192 144 226 203 14 296 148 322 213 14 187 117 217 155 14 297 134 315 151 14 287 126 305 175 14 277 124 287 158 8 445 260 485 375 14 228 136 238 152 14 213 136 230 148 14 101 200 252 375 15 31 142 112 266 +10417 /data/VOCdevkit/VOC2012/JPEGImages/2009_002089.jpg 334 500 4 120 225 230 500 +10418 /data/VOCdevkit/VOC2012/JPEGImages/2009_002093.jpg 500 375 11 59 58 414 333 +10419 /data/VOCdevkit/VOC2012/JPEGImages/2009_002094.jpg 500 375 19 259 1 439 112 19 51 1 161 67 +10420 /data/VOCdevkit/VOC2012/JPEGImages/2009_002096.jpg 500 375 3 88 133 390 284 +10421 /data/VOCdevkit/VOC2012/JPEGImages/2009_002097.jpg 500 333 12 264 171 474 279 +10422 /data/VOCdevkit/VOC2012/JPEGImages/2009_002098.jpg 500 375 10 285 202 342 262 8 264 203 300 261 8 325 206 358 264 8 264 198 297 246 10 99 196 222 245 8 159 204 200 255 8 120 200 156 242 8 194 193 219 246 8 150 193 174 202 8 114 191 135 197 14 350 177 379 205 8 334 177 373 201 +10423 /data/VOCdevkit/VOC2012/JPEGImages/2009_002099.jpg 500 375 0 1 36 500 290 +10424 /data/VOCdevkit/VOC2012/JPEGImages/2009_002103.jpg 500 400 6 315 200 497 259 6 1 188 45 280 6 25 201 63 234 6 175 191 262 219 6 7 197 385 382 +10425 /data/VOCdevkit/VOC2012/JPEGImages/2009_002104.jpg 375 500 7 6 38 370 500 +10426 /data/VOCdevkit/VOC2012/JPEGImages/2009_002105.jpg 500 375 5 247 145 428 273 6 28 222 119 258 13 161 225 177 242 +10427 /data/VOCdevkit/VOC2012/JPEGImages/2009_002107.jpg 500 375 10 330 336 500 375 14 3 67 335 375 8 333 268 445 340 +10428 /data/VOCdevkit/VOC2012/JPEGImages/2009_002110.jpg 500 375 19 1 1 258 375 19 227 94 289 190 14 415 248 500 375 14 270 94 391 356 19 281 78 311 144 14 349 142 462 303 14 373 142 487 361 14 394 157 500 375 +10429 /data/VOCdevkit/VOC2012/JPEGImages/2009_002111.jpg 368 500 8 1 235 368 476 10 1 1 368 414 +10430 /data/VOCdevkit/VOC2012/JPEGImages/2009_002112.jpg 500 333 12 81 109 284 263 14 328 89 397 194 14 406 95 460 201 +10431 /data/VOCdevkit/VOC2012/JPEGImages/2009_002116.jpg 333 500 18 29 31 333 389 +10432 /data/VOCdevkit/VOC2012/JPEGImages/2009_002117.jpg 500 333 6 48 85 426 242 +10433 /data/VOCdevkit/VOC2012/JPEGImages/2009_002118.jpg 500 375 9 298 189 500 360 9 179 197 332 316 9 110 188 337 335 9 33 215 198 327 9 54 208 126 253 9 12 226 59 310 9 1 221 14 305 +10434 /data/VOCdevkit/VOC2012/JPEGImages/2009_002119.jpg 500 281 1 37 29 451 268 +10435 /data/VOCdevkit/VOC2012/JPEGImages/2009_002120.jpg 500 332 6 1 1 500 332 6 431 1 500 99 +10436 /data/VOCdevkit/VOC2012/JPEGImages/2009_002122.jpg 500 334 9 184 91 407 248 9 43 62 248 158 +10437 /data/VOCdevkit/VOC2012/JPEGImages/2009_002123.jpg 500 375 14 145 106 437 375 15 1 138 147 375 +10438 /data/VOCdevkit/VOC2012/JPEGImages/2009_002126.jpg 500 333 5 97 32 335 277 6 1 189 96 278 14 365 192 387 253 14 405 198 415 248 +10439 /data/VOCdevkit/VOC2012/JPEGImages/2009_002127.jpg 334 500 3 13 30 334 472 +10440 /data/VOCdevkit/VOC2012/JPEGImages/2009_002128.jpg 500 333 5 151 52 421 287 6 453 228 479 319 14 106 182 162 293 14 207 190 238 232 14 238 199 270 226 6 70 184 154 243 6 25 201 54 248 6 47 188 85 239 +10441 /data/VOCdevkit/VOC2012/JPEGImages/2009_002129.jpg 500 394 13 59 191 435 394 14 170 61 362 344 +10442 /data/VOCdevkit/VOC2012/JPEGImages/2009_002131.jpg 500 357 13 176 104 461 282 14 239 67 384 205 +10443 /data/VOCdevkit/VOC2012/JPEGImages/2009_002133.jpg 500 333 16 136 98 313 275 +10444 /data/VOCdevkit/VOC2012/JPEGImages/2009_002136.jpg 500 375 9 327 236 446 298 9 356 225 444 253 3 98 192 168 216 +10445 /data/VOCdevkit/VOC2012/JPEGImages/2009_002137.jpg 500 375 4 184 163 248 280 +10446 /data/VOCdevkit/VOC2012/JPEGImages/2009_002139.jpg 500 375 19 145 147 267 241 10 1 305 455 375 14 375 174 500 375 8 399 220 463 335 8 70 220 184 330 +10447 /data/VOCdevkit/VOC2012/JPEGImages/2009_002141.jpg 500 375 7 65 1 500 355 +10448 /data/VOCdevkit/VOC2012/JPEGImages/2009_002144.jpg 500 375 18 74 92 467 300 +10449 /data/VOCdevkit/VOC2012/JPEGImages/2009_002145.jpg 500 375 1 217 224 383 375 14 1 80 124 375 14 118 100 221 375 14 358 220 500 375 6 202 338 239 365 6 154 347 200 371 +10450 /data/VOCdevkit/VOC2012/JPEGImages/2009_002146.jpg 421 500 3 80 39 394 457 3 28 235 184 449 14 205 388 219 430 14 319 413 333 436 14 346 411 360 439 +10451 /data/VOCdevkit/VOC2012/JPEGImages/2009_002147.jpg 500 375 14 32 1 500 375 +10452 /data/VOCdevkit/VOC2012/JPEGImages/2009_002149.jpg 500 333 6 204 100 333 192 +10453 /data/VOCdevkit/VOC2012/JPEGImages/2009_002150.jpg 500 375 9 87 30 401 375 +10454 /data/VOCdevkit/VOC2012/JPEGImages/2009_002151.jpg 400 500 12 53 55 366 500 +10455 /data/VOCdevkit/VOC2012/JPEGImages/2009_002152.jpg 500 375 5 29 97 467 313 14 8 216 23 264 +10456 /data/VOCdevkit/VOC2012/JPEGImages/2009_002153.jpg 500 375 2 64 107 201 375 2 202 126 344 375 2 292 70 460 361 2 144 26 364 132 +10457 /data/VOCdevkit/VOC2012/JPEGImages/2009_002155.jpg 500 375 11 44 57 330 354 +10458 /data/VOCdevkit/VOC2012/JPEGImages/2009_002164.jpg 500 340 6 130 115 414 278 +10459 /data/VOCdevkit/VOC2012/JPEGImages/2009_002165.jpg 500 375 12 143 110 377 251 12 109 134 339 293 +10460 /data/VOCdevkit/VOC2012/JPEGImages/2009_002169.jpg 375 500 8 318 46 370 130 8 15 45 68 135 8 1 91 34 207 8 39 333 351 500 8 142 21 236 45 10 1 43 375 322 +10461 /data/VOCdevkit/VOC2012/JPEGImages/2009_002171.jpg 500 375 9 119 115 243 311 9 212 181 244 219 +10462 /data/VOCdevkit/VOC2012/JPEGImages/2009_002173.jpg 500 169 3 6 6 500 152 +10463 /data/VOCdevkit/VOC2012/JPEGImages/2009_002175.jpg 500 375 18 14 159 382 333 14 177 170 207 208 +10464 /data/VOCdevkit/VOC2012/JPEGImages/2009_002176.jpg 375 500 7 1 30 323 397 +10465 /data/VOCdevkit/VOC2012/JPEGImages/2009_002177.jpg 500 333 11 340 91 500 269 11 171 125 303 226 14 1 1 201 228 14 154 1 315 215 +10466 /data/VOCdevkit/VOC2012/JPEGImages/2009_002180.jpg 500 332 13 375 1 500 129 13 266 4 393 94 13 137 1 167 44 13 157 1 190 42 13 183 1 215 45 13 201 1 238 34 14 236 1 256 57 +10467 /data/VOCdevkit/VOC2012/JPEGImages/2009_002182.jpg 500 322 12 93 27 465 287 14 27 85 138 208 +10468 /data/VOCdevkit/VOC2012/JPEGImages/2009_002185.jpg 313 500 14 1 33 313 500 4 225 76 276 272 4 12 53 35 99 4 24 56 45 102 4 37 55 54 106 +10469 /data/VOCdevkit/VOC2012/JPEGImages/2009_002191.jpg 500 375 0 19 129 469 250 14 390 219 402 247 +10470 /data/VOCdevkit/VOC2012/JPEGImages/2009_002192.jpg 500 375 17 117 83 500 301 14 170 88 273 329 11 306 143 451 216 +10471 /data/VOCdevkit/VOC2012/JPEGImages/2009_002193.jpg 400 494 11 73 47 383 476 +10472 /data/VOCdevkit/VOC2012/JPEGImages/2009_002194.jpg 500 452 1 17 1 490 452 +10473 /data/VOCdevkit/VOC2012/JPEGImages/2009_002197.jpg 500 325 18 194 29 397 188 6 157 47 183 63 +10474 /data/VOCdevkit/VOC2012/JPEGImages/2009_002198.jpg 500 358 11 71 236 345 313 11 40 51 437 279 +10475 /data/VOCdevkit/VOC2012/JPEGImages/2009_002199.jpg 500 333 0 219 30 452 104 0 33 236 260 322 +10476 /data/VOCdevkit/VOC2012/JPEGImages/2009_002202.jpg 500 332 18 1 99 436 221 +10477 /data/VOCdevkit/VOC2012/JPEGImages/2009_002203.jpg 500 333 5 113 134 320 264 5 102 181 112 229 5 26 172 100 237 1 372 213 395 243 14 372 196 397 234 6 476 204 497 221 13 416 209 437 225 +10478 /data/VOCdevkit/VOC2012/JPEGImages/2009_002204.jpg 365 500 4 192 18 321 483 4 44 17 174 483 +10479 /data/VOCdevkit/VOC2012/JPEGImages/2009_002205.jpg 500 375 2 201 90 296 159 2 69 327 107 375 3 456 218 500 251 3 386 222 472 253 3 354 223 393 253 +10480 /data/VOCdevkit/VOC2012/JPEGImages/2009_002208.jpg 500 375 17 128 159 500 306 8 283 184 389 339 8 18 174 136 315 8 106 163 183 283 8 141 201 253 329 +10481 /data/VOCdevkit/VOC2012/JPEGImages/2009_002211.jpg 500 304 0 1 53 476 241 +10482 /data/VOCdevkit/VOC2012/JPEGImages/2009_002212.jpg 333 500 6 120 60 166 94 +10483 /data/VOCdevkit/VOC2012/JPEGImages/2009_002214.jpg 500 375 18 2 97 335 353 18 305 108 500 360 14 10 185 22 219 +10484 /data/VOCdevkit/VOC2012/JPEGImages/2009_002215.jpg 375 500 11 1 64 375 478 +10485 /data/VOCdevkit/VOC2012/JPEGImages/2009_002216.jpg 500 375 13 126 125 388 280 +10486 /data/VOCdevkit/VOC2012/JPEGImages/2009_002219.jpg 500 334 18 285 77 500 298 18 1 17 334 334 +10487 /data/VOCdevkit/VOC2012/JPEGImages/2009_002221.jpg 500 375 9 1 61 357 375 9 299 94 500 375 +10488 /data/VOCdevkit/VOC2012/JPEGImages/2009_002222.jpg 400 500 14 5 62 400 500 +10489 /data/VOCdevkit/VOC2012/JPEGImages/2009_002225.jpg 500 375 18 201 134 296 246 +10490 /data/VOCdevkit/VOC2012/JPEGImages/2009_002226.jpg 500 333 2 101 65 332 217 +10491 /data/VOCdevkit/VOC2012/JPEGImages/2009_002228.jpg 376 500 7 61 36 273 474 +10492 /data/VOCdevkit/VOC2012/JPEGImages/2009_002229.jpg 448 299 9 129 1 417 286 +10493 /data/VOCdevkit/VOC2012/JPEGImages/2009_002230.jpg 500 333 12 150 101 307 326 14 197 29 268 214 +10494 /data/VOCdevkit/VOC2012/JPEGImages/2009_002231.jpg 484 500 12 104 81 390 500 +10495 /data/VOCdevkit/VOC2012/JPEGImages/2009_002232.jpg 500 375 19 23 10 461 375 +10496 /data/VOCdevkit/VOC2012/JPEGImages/2009_002235.jpg 333 500 4 179 152 206 249 +10497 /data/VOCdevkit/VOC2012/JPEGImages/2009_002236.jpg 500 375 8 253 231 421 375 8 361 289 500 375 +10498 /data/VOCdevkit/VOC2012/JPEGImages/2009_002238.jpg 500 409 5 1 12 403 409 6 390 194 500 268 14 442 188 453 197 14 388 187 398 205 14 393 192 403 204 +10499 /data/VOCdevkit/VOC2012/JPEGImages/2009_002239.jpg 500 500 13 159 51 453 500 14 131 209 200 391 6 1 261 141 367 14 179 232 212 378 +10500 /data/VOCdevkit/VOC2012/JPEGImages/2009_002240.jpg 500 333 13 144 91 500 298 14 178 17 383 186 +10501 /data/VOCdevkit/VOC2012/JPEGImages/2009_002242.jpg 375 500 14 248 238 375 500 14 51 105 241 500 14 1 346 72 481 +10502 /data/VOCdevkit/VOC2012/JPEGImages/2009_002245.jpg 500 333 16 142 65 500 333 +10503 /data/VOCdevkit/VOC2012/JPEGImages/2009_002252.jpg 375 500 8 55 32 290 457 +10504 /data/VOCdevkit/VOC2012/JPEGImages/2009_002253.jpg 500 375 17 63 87 497 332 17 1 230 135 375 +10505 /data/VOCdevkit/VOC2012/JPEGImages/2009_002254.jpg 500 317 0 9 111 494 274 0 313 156 402 179 +10506 /data/VOCdevkit/VOC2012/JPEGImages/2009_002256.jpg 500 333 2 42 51 356 306 +10507 /data/VOCdevkit/VOC2012/JPEGImages/2009_002257.jpg 422 500 8 1 224 399 500 14 3 13 379 489 +10508 /data/VOCdevkit/VOC2012/JPEGImages/2009_002258.jpg 500 333 0 20 102 482 214 +10509 /data/VOCdevkit/VOC2012/JPEGImages/2009_002259.jpg 500 375 11 1 1 440 353 +10510 /data/VOCdevkit/VOC2012/JPEGImages/2009_002262.jpg 500 500 2 112 87 364 500 +10511 /data/VOCdevkit/VOC2012/JPEGImages/2009_002264.jpg 500 400 2 179 150 370 319 +10512 /data/VOCdevkit/VOC2012/JPEGImages/2009_002265.jpg 500 333 18 31 36 366 288 +10513 /data/VOCdevkit/VOC2012/JPEGImages/2009_002267.jpg 500 333 7 241 146 274 216 6 1 1 472 202 +10514 /data/VOCdevkit/VOC2012/JPEGImages/2009_002268.jpg 333 500 7 30 242 333 500 +10515 /data/VOCdevkit/VOC2012/JPEGImages/2009_002271.jpg 500 337 1 93 174 300 310 5 303 1 500 204 6 1 120 264 242 6 184 125 263 156 +10516 /data/VOCdevkit/VOC2012/JPEGImages/2009_002272.jpg 500 334 0 52 68 431 223 +10517 /data/VOCdevkit/VOC2012/JPEGImages/2009_002273.jpg 500 375 14 1 74 97 297 11 187 113 374 291 +10518 /data/VOCdevkit/VOC2012/JPEGImages/2009_002274.jpg 500 375 18 60 155 487 285 +10519 /data/VOCdevkit/VOC2012/JPEGImages/2009_002281.jpg 500 292 18 53 85 500 214 +10520 /data/VOCdevkit/VOC2012/JPEGImages/2009_002282.jpg 500 335 16 9 2 487 335 +10521 /data/VOCdevkit/VOC2012/JPEGImages/2009_002285.jpg 500 333 11 78 202 178 333 11 29 136 147 316 14 121 34 479 279 +10522 /data/VOCdevkit/VOC2012/JPEGImages/2009_002286.jpg 500 333 2 169 105 348 211 +10523 /data/VOCdevkit/VOC2012/JPEGImages/2009_002289.jpg 375 500 14 197 279 212 299 14 137 292 164 323 3 173 327 237 354 3 160 332 314 395 3 235 325 275 351 3 68 469 144 500 3 319 330 375 363 3 272 325 347 372 +10524 /data/VOCdevkit/VOC2012/JPEGImages/2009_002291.jpg 500 330 18 1 103 500 284 +10525 /data/VOCdevkit/VOC2012/JPEGImages/2009_002295.jpg 375 500 1 27 281 349 476 +10526 /data/VOCdevkit/VOC2012/JPEGImages/2009_002297.jpg 333 500 14 113 13 248 463 8 189 117 252 212 +10527 /data/VOCdevkit/VOC2012/JPEGImages/2009_002298.jpg 500 313 2 14 40 471 266 +10528 /data/VOCdevkit/VOC2012/JPEGImages/2009_002299.jpg 500 334 6 50 51 500 285 +10529 /data/VOCdevkit/VOC2012/JPEGImages/2009_002301.jpg 375 500 8 79 13 303 432 +10530 /data/VOCdevkit/VOC2012/JPEGImages/2009_002302.jpg 500 375 11 12 1 423 375 +10531 /data/VOCdevkit/VOC2012/JPEGImages/2009_002305.jpg 500 333 14 391 150 429 252 14 316 144 341 223 14 294 150 328 223 14 260 131 274 159 12 249 136 311 220 12 206 140 258 259 12 154 155 203 215 14 156 131 187 189 14 85 133 124 188 14 22 154 34 169 14 28 149 41 169 14 1 148 15 172 12 86 148 119 213 +10532 /data/VOCdevkit/VOC2012/JPEGImages/2009_002306.jpg 500 333 3 35 195 444 293 +10533 /data/VOCdevkit/VOC2012/JPEGImages/2009_002308.jpg 357 500 14 174 144 323 430 3 1 268 357 500 +10534 /data/VOCdevkit/VOC2012/JPEGImages/2009_002311.jpg 500 394 7 1 42 407 394 7 39 1 500 312 +10535 /data/VOCdevkit/VOC2012/JPEGImages/2009_002312.jpg 500 375 14 137 205 148 226 6 318 227 422 280 +10536 /data/VOCdevkit/VOC2012/JPEGImages/2009_002314.jpg 375 500 0 69 57 375 242 +10537 /data/VOCdevkit/VOC2012/JPEGImages/2009_002317.jpg 500 326 13 82 71 351 264 14 195 55 403 263 +10538 /data/VOCdevkit/VOC2012/JPEGImages/2009_002319.jpg 398 500 2 1 93 398 500 +10539 /data/VOCdevkit/VOC2012/JPEGImages/2009_002320.jpg 500 333 0 192 74 355 186 +10540 /data/VOCdevkit/VOC2012/JPEGImages/2009_002324.jpg 500 358 11 131 97 399 265 +10541 /data/VOCdevkit/VOC2012/JPEGImages/2009_002325.jpg 500 375 17 8 185 139 337 17 128 171 333 250 8 385 191 500 294 8 338 179 434 259 +10542 /data/VOCdevkit/VOC2012/JPEGImages/2009_002326.jpg 500 334 14 31 16 445 334 +10543 /data/VOCdevkit/VOC2012/JPEGImages/2009_002328.jpg 500 333 8 1 18 116 143 4 128 15 190 144 10 1 55 500 333 +10544 /data/VOCdevkit/VOC2012/JPEGImages/2009_002331.jpg 500 375 19 14 154 34 180 19 55 152 82 178 8 57 180 104 244 8 114 174 156 229 14 107 144 130 179 14 113 145 154 196 14 168 149 218 185 14 168 159 223 258 8 163 195 217 279 19 266 163 299 192 19 245 158 261 190 19 341 160 380 195 14 337 163 409 285 8 360 200 436 318 14 409 151 476 273 8 439 192 493 277 14 374 143 397 169 14 57 150 86 224 +10545 /data/VOCdevkit/VOC2012/JPEGImages/2009_002333.jpg 500 333 11 1 52 343 333 14 82 1 500 333 +10546 /data/VOCdevkit/VOC2012/JPEGImages/2009_002335.jpg 333 500 13 26 179 308 466 +10547 /data/VOCdevkit/VOC2012/JPEGImages/2009_002338.jpg 500 334 14 1 123 54 334 14 249 97 366 334 14 85 116 292 334 14 128 116 184 212 14 376 97 436 249 14 446 147 500 276 14 430 95 500 280 1 1 250 146 334 1 90 225 369 334 1 194 258 493 334 +10548 /data/VOCdevkit/VOC2012/JPEGImages/2009_002339.jpg 500 375 12 1 1 362 375 +10549 /data/VOCdevkit/VOC2012/JPEGImages/2009_002343.jpg 500 375 6 463 137 500 164 3 332 125 480 204 6 25 131 148 175 14 3 115 18 166 6 1 110 367 315 +10550 /data/VOCdevkit/VOC2012/JPEGImages/2009_002346.jpg 500 375 14 161 14 394 375 17 1 1 142 65 17 141 1 490 173 8 373 112 500 375 11 257 124 308 261 +10551 /data/VOCdevkit/VOC2012/JPEGImages/2009_002348.jpg 500 339 5 479 48 500 231 5 113 95 453 191 +10552 /data/VOCdevkit/VOC2012/JPEGImages/2009_002349.jpg 375 500 14 106 45 344 475 +10553 /data/VOCdevkit/VOC2012/JPEGImages/2009_002350.jpg 375 500 14 229 222 325 500 1 59 321 185 500 1 1 332 136 441 +10554 /data/VOCdevkit/VOC2012/JPEGImages/2009_002352.jpg 500 375 7 83 1 497 372 +10555 /data/VOCdevkit/VOC2012/JPEGImages/2009_002358.jpg 500 375 3 349 195 391 202 14 249 178 267 202 14 276 183 294 204 14 386 170 423 214 3 1 1 499 375 +10556 /data/VOCdevkit/VOC2012/JPEGImages/2009_002360.jpg 333 500 9 176 294 333 441 9 17 287 105 350 +10557 /data/VOCdevkit/VOC2012/JPEGImages/2009_002362.jpg 375 500 15 190 356 296 500 8 233 317 375 500 +10558 /data/VOCdevkit/VOC2012/JPEGImages/2009_002363.jpg 500 375 7 65 10 500 261 +10559 /data/VOCdevkit/VOC2012/JPEGImages/2009_002366.jpg 500 375 19 196 1 408 191 +10560 /data/VOCdevkit/VOC2012/JPEGImages/2009_002370.jpg 500 333 11 72 45 434 326 17 1 1 500 333 +10561 /data/VOCdevkit/VOC2012/JPEGImages/2009_002371.jpg 500 333 1 58 53 438 317 +10562 /data/VOCdevkit/VOC2012/JPEGImages/2009_002372.jpg 500 327 4 75 65 112 140 14 36 55 191 327 4 157 149 179 229 14 122 89 302 327 14 172 28 273 190 14 326 38 452 327 14 267 48 372 327 4 269 145 292 208 4 284 116 337 188 +10563 /data/VOCdevkit/VOC2012/JPEGImages/2009_002373.jpg 500 375 11 1 1 473 375 +10564 /data/VOCdevkit/VOC2012/JPEGImages/2009_002374.jpg 375 500 8 1 1 375 500 +10565 /data/VOCdevkit/VOC2012/JPEGImages/2009_002376.jpg 333 500 14 1 183 165 415 14 151 217 205 442 14 17 235 103 448 14 1 243 11 331 +10566 /data/VOCdevkit/VOC2012/JPEGImages/2009_002377.jpg 500 375 14 384 93 398 135 18 404 71 491 149 8 366 116 380 133 +10567 /data/VOCdevkit/VOC2012/JPEGImages/2009_002380.jpg 375 500 6 48 44 375 417 +10568 /data/VOCdevkit/VOC2012/JPEGImages/2009_002381.jpg 335 500 14 71 25 265 475 +10569 /data/VOCdevkit/VOC2012/JPEGImages/2009_002382.jpg 375 500 13 7 170 313 478 14 146 85 286 260 14 324 183 355 269 14 285 184 322 254 13 327 269 375 343 13 1 199 53 269 +10570 /data/VOCdevkit/VOC2012/JPEGImages/2009_002386.jpg 375 500 15 288 282 375 473 15 13 34 293 479 15 1 344 122 500 +10571 /data/VOCdevkit/VOC2012/JPEGImages/2009_002387.jpg 500 305 6 76 117 438 264 +10572 /data/VOCdevkit/VOC2012/JPEGImages/2009_002388.jpg 500 333 0 137 43 458 175 +10573 /data/VOCdevkit/VOC2012/JPEGImages/2009_002390.jpg 375 500 17 1 132 281 451 +10574 /data/VOCdevkit/VOC2012/JPEGImages/2009_002391.jpg 500 375 16 1 156 281 375 14 123 1 500 375 +10575 /data/VOCdevkit/VOC2012/JPEGImages/2009_002393.jpg 500 319 0 219 87 345 136 2 303 5 329 19 +10576 /data/VOCdevkit/VOC2012/JPEGImages/2009_002397.jpg 500 333 3 145 114 434 280 +10577 /data/VOCdevkit/VOC2012/JPEGImages/2009_002398.jpg 500 375 5 11 12 477 340 14 209 181 232 292 5 1 126 60 251 14 1 195 19 253 +10578 /data/VOCdevkit/VOC2012/JPEGImages/2009_002399.jpg 500 375 13 1 1 240 212 13 29 1 500 375 +10579 /data/VOCdevkit/VOC2012/JPEGImages/2009_002400.jpg 500 336 1 52 29 282 316 +10580 /data/VOCdevkit/VOC2012/JPEGImages/2009_002401.jpg 500 375 1 43 7 500 375 15 405 1 473 40 +10581 /data/VOCdevkit/VOC2012/JPEGImages/2009_002404.jpg 500 333 1 276 30 396 148 14 227 48 351 171 14 267 288 324 333 1 297 295 393 333 +10582 /data/VOCdevkit/VOC2012/JPEGImages/2009_002406.jpg 333 500 1 1 209 273 500 14 128 89 266 479 +10583 /data/VOCdevkit/VOC2012/JPEGImages/2009_002407.jpg 500 333 14 152 44 266 270 14 84 87 409 333 +10584 /data/VOCdevkit/VOC2012/JPEGImages/2009_002408.jpg 500 375 11 101 69 475 342 17 1 1 500 375 +10585 /data/VOCdevkit/VOC2012/JPEGImages/2009_002409.jpg 500 313 19 311 16 495 213 8 2 151 58 313 +10586 /data/VOCdevkit/VOC2012/JPEGImages/2009_002414.jpg 500 375 2 150 114 336 259 2 228 207 338 284 +10587 /data/VOCdevkit/VOC2012/JPEGImages/2009_002415.jpg 375 500 10 1 1 375 351 8 70 25 346 500 +10588 /data/VOCdevkit/VOC2012/JPEGImages/2009_002416.jpg 500 375 12 254 123 421 299 12 112 6 269 305 +10589 /data/VOCdevkit/VOC2012/JPEGImages/2009_002419.jpg 375 500 11 91 54 318 480 +10590 /data/VOCdevkit/VOC2012/JPEGImages/2009_002420.jpg 500 333 12 143 174 321 270 +10591 /data/VOCdevkit/VOC2012/JPEGImages/2009_002422.jpg 500 333 9 228 6 500 233 9 53 83 227 210 +10592 /data/VOCdevkit/VOC2012/JPEGImages/2009_002423.jpg 500 375 2 293 142 433 214 +10593 /data/VOCdevkit/VOC2012/JPEGImages/2009_002424.jpg 500 375 6 105 93 342 266 +10594 /data/VOCdevkit/VOC2012/JPEGImages/2009_002425.jpg 500 333 14 41 67 97 184 14 173 46 244 183 14 365 70 417 159 +10595 /data/VOCdevkit/VOC2012/JPEGImages/2009_002429.jpg 500 375 7 5 2 500 364 +10596 /data/VOCdevkit/VOC2012/JPEGImages/2009_002431.jpg 500 375 2 186 75 388 218 +10597 /data/VOCdevkit/VOC2012/JPEGImages/2009_002432.jpg 500 333 0 10 60 489 215 +10598 /data/VOCdevkit/VOC2012/JPEGImages/2009_002433.jpg 500 333 8 305 194 340 201 8 384 201 417 228 8 390 224 412 311 8 333 231 392 320 8 287 247 376 333 8 198 283 288 333 8 70 254 178 333 14 253 134 270 169 14 265 122 316 203 14 243 164 282 209 4 320 181 329 201 4 296 194 309 227 4 238 198 250 234 14 182 164 227 226 14 123 173 194 312 14 80 184 195 333 14 450 116 470 129 14 407 88 500 333 15 416 10 500 333 10 139 200 399 333 +10599 /data/VOCdevkit/VOC2012/JPEGImages/2009_002434.jpg 500 375 13 131 45 500 375 +10600 /data/VOCdevkit/VOC2012/JPEGImages/2009_002436.jpg 500 328 5 31 12 447 301 6 473 189 493 210 6 442 193 462 209 +10601 /data/VOCdevkit/VOC2012/JPEGImages/2009_002438.jpg 500 375 1 26 41 480 359 +10602 /data/VOCdevkit/VOC2012/JPEGImages/2009_002439.jpg 500 375 7 254 95 500 375 14 1 98 262 367 +10603 /data/VOCdevkit/VOC2012/JPEGImages/2009_002441.jpg 500 375 18 119 108 396 295 +10604 /data/VOCdevkit/VOC2012/JPEGImages/2009_002443.jpg 500 333 10 1 23 421 333 8 369 220 500 333 8 357 84 446 184 8 252 1 343 73 8 134 1 260 48 8 1 115 45 263 14 410 88 500 203 14 314 1 479 110 +10605 /data/VOCdevkit/VOC2012/JPEGImages/2009_002444.jpg 375 500 10 163 366 375 500 8 65 335 128 500 8 91 324 236 500 8 228 304 328 369 8 134 322 224 400 15 283 167 375 422 +10606 /data/VOCdevkit/VOC2012/JPEGImages/2009_002445.jpg 500 413 11 162 103 303 300 +10607 /data/VOCdevkit/VOC2012/JPEGImages/2009_002448.jpg 333 500 0 18 101 333 383 +10608 /data/VOCdevkit/VOC2012/JPEGImages/2009_002449.jpg 500 375 3 231 120 280 163 3 99 44 315 285 +10609 /data/VOCdevkit/VOC2012/JPEGImages/2009_002452.jpg 333 500 8 109 220 233 445 10 49 244 289 422 8 249 221 283 407 8 42 221 90 408 8 66 221 92 253 +10610 /data/VOCdevkit/VOC2012/JPEGImages/2009_002453.jpg 500 375 3 140 235 200 247 +10611 /data/VOCdevkit/VOC2012/JPEGImages/2009_002456.jpg 500 435 11 33 49 407 419 +10612 /data/VOCdevkit/VOC2012/JPEGImages/2009_002457.jpg 500 333 5 30 31 434 305 +10613 /data/VOCdevkit/VOC2012/JPEGImages/2009_002460.jpg 500 375 11 103 191 276 283 +10614 /data/VOCdevkit/VOC2012/JPEGImages/2009_002464.jpg 500 375 4 204 136 500 375 11 1 44 458 375 14 1 1 173 375 +10615 /data/VOCdevkit/VOC2012/JPEGImages/2009_002465.jpg 500 240 2 442 52 461 83 2 266 21 283 48 2 119 201 147 216 2 29 43 48 67 +10616 /data/VOCdevkit/VOC2012/JPEGImages/2009_002470.jpg 500 375 7 103 60 472 339 7 41 91 290 212 +10617 /data/VOCdevkit/VOC2012/JPEGImages/2009_002471.jpg 500 375 14 306 82 447 247 14 15 96 187 375 8 1 248 169 375 8 184 291 316 375 8 1 201 32 249 8 123 165 171 193 8 183 144 226 203 8 421 143 447 168 8 301 133 332 153 10 171 141 499 301 8 171 142 241 195 10 1 173 433 375 14 212 87 327 220 +10618 /data/VOCdevkit/VOC2012/JPEGImages/2009_002472.jpg 500 339 9 31 37 368 333 +10619 /data/VOCdevkit/VOC2012/JPEGImages/2009_002474.jpg 500 358 14 39 73 500 358 14 1 32 245 358 +10620 /data/VOCdevkit/VOC2012/JPEGImages/2009_002475.jpg 183 500 4 50 10 163 311 +10621 /data/VOCdevkit/VOC2012/JPEGImages/2009_002476.jpg 250 350 11 72 47 197 285 +10622 /data/VOCdevkit/VOC2012/JPEGImages/2009_002477.jpg 369 500 12 75 24 275 440 14 275 149 346 347 14 274 159 309 318 14 1 93 97 500 +10623 /data/VOCdevkit/VOC2012/JPEGImages/2009_002487.jpg 500 333 10 157 179 333 333 8 172 150 242 284 8 255 151 338 291 8 279 171 382 333 8 102 160 193 319 15 1 1 99 262 +10624 /data/VOCdevkit/VOC2012/JPEGImages/2009_002488.jpg 500 375 1 1 1 500 375 +10625 /data/VOCdevkit/VOC2012/JPEGImages/2009_002499.jpg 500 344 7 160 19 436 344 +10626 /data/VOCdevkit/VOC2012/JPEGImages/2009_002500.jpg 500 333 11 71 179 236 333 11 66 1 349 294 14 259 1 442 166 +10627 /data/VOCdevkit/VOC2012/JPEGImages/2009_002504.jpg 500 375 7 55 92 428 375 14 1 40 500 375 +10628 /data/VOCdevkit/VOC2012/JPEGImages/2009_002505.jpg 500 375 5 481 127 500 178 6 444 158 471 178 5 83 41 438 279 5 102 126 182 177 +10629 /data/VOCdevkit/VOC2012/JPEGImages/2009_002506.jpg 500 333 3 1 16 500 247 14 367 107 397 141 14 181 47 203 94 +10630 /data/VOCdevkit/VOC2012/JPEGImages/2009_002510.jpg 500 375 9 432 28 450 55 9 179 40 221 70 9 117 49 149 72 9 156 36 198 69 9 339 84 500 333 9 80 88 214 329 9 199 114 384 345 9 1 127 103 283 +10631 /data/VOCdevkit/VOC2012/JPEGImages/2009_002512.jpg 500 341 5 403 114 500 242 5 138 23 407 304 14 176 179 223 216 14 162 75 195 108 14 192 74 226 107 +10632 /data/VOCdevkit/VOC2012/JPEGImages/2009_002514.jpg 375 500 14 91 82 298 500 14 114 1 375 500 +10633 /data/VOCdevkit/VOC2012/JPEGImages/2009_002515.jpg 500 375 12 119 93 422 301 12 443 98 491 232 +10634 /data/VOCdevkit/VOC2012/JPEGImages/2009_002517.jpg 500 334 5 20 73 457 289 6 415 194 500 296 +10635 /data/VOCdevkit/VOC2012/JPEGImages/2009_002518.jpg 500 272 9 14 16 484 258 +10636 /data/VOCdevkit/VOC2012/JPEGImages/2009_002519.jpg 500 375 1 372 168 455 300 +10637 /data/VOCdevkit/VOC2012/JPEGImages/2009_002521.jpg 281 500 4 94 61 186 430 +10638 /data/VOCdevkit/VOC2012/JPEGImages/2009_002522.jpg 500 375 14 144 77 489 375 11 225 19 457 176 17 183 102 500 323 14 475 107 500 195 +10639 /data/VOCdevkit/VOC2012/JPEGImages/2009_002523.jpg 500 375 8 318 217 451 366 8 252 199 279 265 8 231 190 292 276 8 142 193 184 211 17 63 208 283 375 8 101 169 134 214 +10640 /data/VOCdevkit/VOC2012/JPEGImages/2009_002524.jpg 500 372 10 124 235 169 272 14 76 237 139 368 14 153 230 198 282 14 163 241 250 372 14 215 233 238 262 14 230 236 284 332 10 117 282 196 309 10 229 216 258 241 14 277 200 301 244 14 258 208 307 321 14 301 205 331 312 14 328 207 375 310 10 281 244 323 317 14 486 162 500 193 14 391 208 414 227 14 366 207 402 264 14 404 211 434 256 14 462 194 492 224 14 462 203 500 250 14 443 209 496 255 6 365 183 500 222 10 391 225 458 252 10 397 255 500 286 10 363 287 500 372 +10641 /data/VOCdevkit/VOC2012/JPEGImages/2009_002525.jpg 500 333 2 187 132 260 273 +10642 /data/VOCdevkit/VOC2012/JPEGImages/2009_002527.jpg 333 500 7 57 94 312 463 +10643 /data/VOCdevkit/VOC2012/JPEGImages/2009_002530.jpg 500 334 3 70 111 460 201 +10644 /data/VOCdevkit/VOC2012/JPEGImages/2009_002531.jpg 500 281 0 48 88 499 193 +10645 /data/VOCdevkit/VOC2012/JPEGImages/2009_002532.jpg 500 375 6 47 249 70 272 5 70 118 357 317 +10646 /data/VOCdevkit/VOC2012/JPEGImages/2009_002535.jpg 500 347 5 107 73 390 280 +10647 /data/VOCdevkit/VOC2012/JPEGImages/2009_002536.jpg 500 333 2 209 144 259 203 +10648 /data/VOCdevkit/VOC2012/JPEGImages/2009_002537.jpg 500 375 19 406 211 500 375 8 300 256 367 359 +10649 /data/VOCdevkit/VOC2012/JPEGImages/2009_002539.jpg 500 318 11 42 120 329 251 +10650 /data/VOCdevkit/VOC2012/JPEGImages/2009_002542.jpg 500 375 9 101 114 378 287 14 55 96 122 287 14 350 105 458 310 9 374 115 489 205 1 1 152 54 217 +10651 /data/VOCdevkit/VOC2012/JPEGImages/2009_002543.jpg 500 333 3 54 58 118 268 3 121 72 176 250 3 393 51 483 256 3 425 102 494 237 +10652 /data/VOCdevkit/VOC2012/JPEGImages/2009_002546.jpg 500 375 10 68 299 468 375 8 213 262 279 320 8 102 274 189 344 8 451 332 500 375 +10653 /data/VOCdevkit/VOC2012/JPEGImages/2009_002549.jpg 500 332 9 306 100 467 228 9 34 123 240 264 +10654 /data/VOCdevkit/VOC2012/JPEGImages/2009_002552.jpg 500 333 14 172 86 370 333 14 90 106 162 333 +10655 /data/VOCdevkit/VOC2012/JPEGImages/2009_002553.jpg 444 500 11 42 120 444 423 +10656 /data/VOCdevkit/VOC2012/JPEGImages/2009_002556.jpg 500 375 14 252 50 373 375 14 136 59 249 375 8 88 235 152 346 8 43 243 99 348 +10657 /data/VOCdevkit/VOC2012/JPEGImages/2009_002557.jpg 500 375 18 202 114 369 352 14 227 199 259 236 14 277 201 314 231 +10658 /data/VOCdevkit/VOC2012/JPEGImages/2009_002558.jpg 500 334 8 133 203 207 295 17 216 204 421 331 8 390 253 500 334 +10659 /data/VOCdevkit/VOC2012/JPEGImages/2009_002559.jpg 500 333 2 246 140 306 184 2 66 108 122 142 +10660 /data/VOCdevkit/VOC2012/JPEGImages/2009_002561.jpg 500 333 7 1 2 410 333 +10661 /data/VOCdevkit/VOC2012/JPEGImages/2009_002562.jpg 375 500 19 1 115 375 415 +10662 /data/VOCdevkit/VOC2012/JPEGImages/2009_002563.jpg 500 375 11 192 128 299 249 +10663 /data/VOCdevkit/VOC2012/JPEGImages/2009_002565.jpg 334 500 12 1 31 334 500 +10664 /data/VOCdevkit/VOC2012/JPEGImages/2009_002566.jpg 500 297 5 109 39 429 269 14 144 125 193 168 5 28 48 113 189 +10665 /data/VOCdevkit/VOC2012/JPEGImages/2009_002567.jpg 500 333 4 1 1 90 288 4 64 1 221 297 4 215 1 349 284 4 349 1 500 279 +10666 /data/VOCdevkit/VOC2012/JPEGImages/2009_002568.jpg 500 333 18 65 64 475 304 +10667 /data/VOCdevkit/VOC2012/JPEGImages/2009_002569.jpg 500 333 14 170 137 385 315 13 213 153 376 315 13 130 20 253 143 14 132 1 279 142 +10668 /data/VOCdevkit/VOC2012/JPEGImages/2009_002570.jpg 500 313 6 439 168 500 246 5 1 64 89 224 5 86 100 191 222 5 198 98 280 206 5 285 106 351 206 5 359 110 429 213 +10669 /data/VOCdevkit/VOC2012/JPEGImages/2009_002571.jpg 500 334 17 1 46 196 191 8 228 29 329 195 8 352 1 478 205 15 274 9 311 116 15 127 1 292 189 10 293 37 472 198 +10670 /data/VOCdevkit/VOC2012/JPEGImages/2009_002573.jpg 334 500 19 160 194 272 294 4 74 71 91 112 +10671 /data/VOCdevkit/VOC2012/JPEGImages/2009_002577.jpg 375 500 3 135 247 338 475 +10672 /data/VOCdevkit/VOC2012/JPEGImages/2009_002579.jpg 375 500 14 112 151 270 376 10 1 316 375 500 4 35 196 119 500 4 131 205 199 472 4 195 279 240 423 +10673 /data/VOCdevkit/VOC2012/JPEGImages/2009_002580.jpg 500 375 14 87 6 376 295 +10674 /data/VOCdevkit/VOC2012/JPEGImages/2009_002584.jpg 375 500 14 31 256 375 500 15 115 32 237 98 15 43 133 296 284 +10675 /data/VOCdevkit/VOC2012/JPEGImages/2009_002585.jpg 334 500 8 32 71 276 436 +10676 /data/VOCdevkit/VOC2012/JPEGImages/2009_002586.jpg 500 375 11 74 72 369 357 14 357 63 486 265 +10677 /data/VOCdevkit/VOC2012/JPEGImages/2009_002588.jpg 500 332 9 269 95 292 115 9 165 90 186 106 9 123 107 149 128 9 341 213 466 301 14 54 103 65 130 +10678 /data/VOCdevkit/VOC2012/JPEGImages/2009_002591.jpg 500 375 3 313 236 403 293 +10679 /data/VOCdevkit/VOC2012/JPEGImages/2009_002592.jpg 333 500 7 49 50 287 449 +10680 /data/VOCdevkit/VOC2012/JPEGImages/2009_002594.jpg 500 429 4 190 118 267 258 +10681 /data/VOCdevkit/VOC2012/JPEGImages/2009_002595.jpg 500 317 13 278 125 500 315 14 231 36 327 302 14 78 34 216 296 13 12 137 228 312 +10682 /data/VOCdevkit/VOC2012/JPEGImages/2009_002597.jpg 500 332 9 41 245 157 314 9 119 49 424 292 +10683 /data/VOCdevkit/VOC2012/JPEGImages/2009_002599.jpg 500 333 0 48 116 500 257 +10684 /data/VOCdevkit/VOC2012/JPEGImages/2009_002604.jpg 500 333 2 179 177 277 275 +10685 /data/VOCdevkit/VOC2012/JPEGImages/2009_002605.jpg 500 499 11 81 1 417 480 +10686 /data/VOCdevkit/VOC2012/JPEGImages/2009_002607.jpg 338 500 14 39 86 170 500 14 157 73 307 500 +10687 /data/VOCdevkit/VOC2012/JPEGImages/2009_002608.jpg 500 375 2 77 89 345 343 +10688 /data/VOCdevkit/VOC2012/JPEGImages/2009_002609.jpg 500 376 11 172 12 500 376 +10689 /data/VOCdevkit/VOC2012/JPEGImages/2009_002611.jpg 500 375 17 1 152 182 370 +10690 /data/VOCdevkit/VOC2012/JPEGImages/2009_002612.jpg 478 500 17 217 202 434 362 17 1 408 163 500 10 74 213 178 325 8 162 198 229 327 8 44 206 141 328 8 110 190 175 305 8 46 193 129 309 +10691 /data/VOCdevkit/VOC2012/JPEGImages/2009_002613.jpg 500 387 10 50 49 440 357 8 42 15 145 175 8 9 58 167 321 8 79 81 255 380 8 200 8 307 214 8 275 17 389 267 8 312 74 493 380 +10692 /data/VOCdevkit/VOC2012/JPEGImages/2009_002614.jpg 500 334 0 8 82 416 278 +10693 /data/VOCdevkit/VOC2012/JPEGImages/2009_002615.jpg 500 375 7 30 1 292 202 +10694 /data/VOCdevkit/VOC2012/JPEGImages/2009_002616.jpg 316 240 18 26 4 266 232 +10695 /data/VOCdevkit/VOC2012/JPEGImages/2009_002618.jpg 500 333 6 1 110 193 333 +10696 /data/VOCdevkit/VOC2012/JPEGImages/2009_002620.jpg 500 375 4 185 147 249 324 +10697 /data/VOCdevkit/VOC2012/JPEGImages/2009_002621.jpg 500 368 5 10 44 393 281 6 1 177 53 272 14 418 169 445 247 14 474 163 500 237 14 458 179 477 237 14 435 155 462 240 +10698 /data/VOCdevkit/VOC2012/JPEGImages/2009_002624.jpg 500 334 18 50 54 392 297 18 15 200 305 275 +10699 /data/VOCdevkit/VOC2012/JPEGImages/2009_002625.jpg 500 334 0 30 81 389 232 +10700 /data/VOCdevkit/VOC2012/JPEGImages/2009_002626.jpg 500 334 5 1 171 73 275 +10701 /data/VOCdevkit/VOC2012/JPEGImages/2009_002628.jpg 500 333 7 186 75 320 327 15 183 1 396 259 +10702 /data/VOCdevkit/VOC2012/JPEGImages/2009_002629.jpg 343 500 2 54 134 257 369 +10703 /data/VOCdevkit/VOC2012/JPEGImages/2009_002632.jpg 500 336 6 142 52 417 254 +10704 /data/VOCdevkit/VOC2012/JPEGImages/2009_002634.jpg 500 375 14 456 285 500 375 8 427 328 470 375 8 402 308 439 366 8 356 299 421 348 8 352 351 420 375 8 346 328 383 375 8 309 312 339 351 8 283 303 312 338 8 204 344 274 375 8 189 328 243 369 8 171 311 223 368 8 85 321 136 373 8 48 337 121 375 10 390 297 459 325 10 208 319 279 335 10 227 331 311 355 10 257 347 354 373 10 15 333 85 355 10 1 353 48 375 +10705 /data/VOCdevkit/VOC2012/JPEGImages/2009_002635.jpg 500 375 9 229 225 348 315 9 138 186 224 241 9 1 190 42 287 +10706 /data/VOCdevkit/VOC2012/JPEGImages/2009_002638.jpg 500 375 18 40 76 494 321 +10707 /data/VOCdevkit/VOC2012/JPEGImages/2009_002645.jpg 385 500 2 1 21 338 500 +10708 /data/VOCdevkit/VOC2012/JPEGImages/2009_002648.jpg 500 334 9 1 1 500 334 +10709 /data/VOCdevkit/VOC2012/JPEGImages/2009_002649.jpg 375 500 4 103 14 251 489 14 203 1 375 219 +10710 /data/VOCdevkit/VOC2012/JPEGImages/2009_002651.jpg 500 375 13 176 123 403 297 14 220 72 362 237 +10711 /data/VOCdevkit/VOC2012/JPEGImages/2009_002652.jpg 500 333 19 120 37 355 227 8 71 294 330 333 +10712 /data/VOCdevkit/VOC2012/JPEGImages/2009_002659.jpg 500 333 13 108 82 337 322 14 66 1 243 260 +10713 /data/VOCdevkit/VOC2012/JPEGImages/2009_002662.jpg 500 333 3 71 38 480 183 +10714 /data/VOCdevkit/VOC2012/JPEGImages/2009_002663.jpg 500 375 10 1 182 444 375 8 182 270 357 375 8 340 221 459 375 8 377 182 475 375 19 236 1 310 86 17 402 114 500 201 8 104 142 176 214 8 1 152 53 242 8 301 144 376 204 +10715 /data/VOCdevkit/VOC2012/JPEGImages/2009_002665.jpg 500 375 13 9 1 500 375 +10716 /data/VOCdevkit/VOC2012/JPEGImages/2009_002667.jpg 388 500 7 147 188 319 397 +10717 /data/VOCdevkit/VOC2012/JPEGImages/2009_002668.jpg 333 500 1 120 226 222 332 +10718 /data/VOCdevkit/VOC2012/JPEGImages/2009_002669.jpg 500 375 18 1 94 248 182 18 198 98 311 187 15 28 84 61 137 18 287 106 500 149 15 469 98 486 125 14 89 124 117 193 14 59 130 77 172 14 447 117 470 165 14 388 118 400 144 14 417 116 428 144 +10719 /data/VOCdevkit/VOC2012/JPEGImages/2009_002670.jpg 333 500 15 102 355 176 427 +10720 /data/VOCdevkit/VOC2012/JPEGImages/2009_002671.jpg 500 333 1 248 119 418 199 14 96 54 215 268 4 202 144 223 189 +10721 /data/VOCdevkit/VOC2012/JPEGImages/2009_002672.jpg 410 500 11 102 174 379 344 +10722 /data/VOCdevkit/VOC2012/JPEGImages/2009_002673.jpg 500 375 17 49 133 387 321 7 126 207 182 242 7 283 167 334 198 +10723 /data/VOCdevkit/VOC2012/JPEGImages/2009_002674.jpg 500 333 0 11 51 493 231 +10724 /data/VOCdevkit/VOC2012/JPEGImages/2009_002675.jpg 500 375 4 1 1 123 375 4 78 1 402 375 4 343 1 499 375 +10725 /data/VOCdevkit/VOC2012/JPEGImages/2009_002676.jpg 500 375 18 95 38 500 322 6 163 42 184 53 +10726 /data/VOCdevkit/VOC2012/JPEGImages/2009_002680.jpg 500 347 0 1 61 500 244 +10727 /data/VOCdevkit/VOC2012/JPEGImages/2009_002681.jpg 500 375 17 376 1 500 94 11 68 1 479 309 +10728 /data/VOCdevkit/VOC2012/JPEGImages/2009_002683.jpg 500 400 17 235 250 445 400 8 128 229 257 355 8 1 339 143 400 +10729 /data/VOCdevkit/VOC2012/JPEGImages/2009_002684.jpg 333 500 12 45 72 333 500 +10730 /data/VOCdevkit/VOC2012/JPEGImages/2009_002685.jpg 500 399 2 72 52 454 275 +10731 /data/VOCdevkit/VOC2012/JPEGImages/2009_002687.jpg 375 500 11 1 60 287 330 +10732 /data/VOCdevkit/VOC2012/JPEGImages/2009_002688.jpg 500 376 15 471 66 500 136 15 220 78 261 130 4 139 202 208 236 8 421 241 500 376 8 300 186 393 249 8 211 179 292 235 8 54 216 182 376 8 175 231 330 376 10 46 223 460 376 +10733 /data/VOCdevkit/VOC2012/JPEGImages/2009_002689.jpg 500 333 18 108 86 478 297 +10734 /data/VOCdevkit/VOC2012/JPEGImages/2009_002695.jpg 500 380 18 1 151 500 261 6 475 224 500 303 6 360 242 470 307 6 207 242 352 316 6 72 244 238 317 6 1 231 30 275 6 1 246 123 312 +10735 /data/VOCdevkit/VOC2012/JPEGImages/2009_002697.jpg 500 320 12 57 34 453 307 +10736 /data/VOCdevkit/VOC2012/JPEGImages/2009_002698.jpg 375 500 14 187 123 307 500 14 93 167 209 485 8 274 267 361 413 15 33 251 71 341 15 1 191 39 339 +10737 /data/VOCdevkit/VOC2012/JPEGImages/2009_002703.jpg 500 375 4 202 210 222 242 14 117 82 238 375 14 224 98 297 360 +10738 /data/VOCdevkit/VOC2012/JPEGImages/2009_002704.jpg 500 333 7 1 27 380 333 +10739 /data/VOCdevkit/VOC2012/JPEGImages/2009_002705.jpg 500 375 14 1 47 118 375 19 130 30 500 314 +10740 /data/VOCdevkit/VOC2012/JPEGImages/2009_002708.jpg 500 363 9 13 12 500 363 +10741 /data/VOCdevkit/VOC2012/JPEGImages/2009_002710.jpg 500 375 8 408 52 473 102 8 76 81 169 146 8 130 70 208 132 14 5 69 231 375 +10742 /data/VOCdevkit/VOC2012/JPEGImages/2009_002711.jpg 500 333 6 1 1 447 291 14 123 1 147 37 6 454 14 500 142 14 48 1 72 41 +10743 /data/VOCdevkit/VOC2012/JPEGImages/2009_002712.jpg 500 375 18 1 111 445 309 +10744 /data/VOCdevkit/VOC2012/JPEGImages/2009_002713.jpg 388 500 17 1 108 388 379 +10745 /data/VOCdevkit/VOC2012/JPEGImages/2009_002714.jpg 500 375 0 84 146 317 236 +10746 /data/VOCdevkit/VOC2012/JPEGImages/2009_002715.jpg 334 500 14 114 218 208 445 1 245 427 334 500 +10747 /data/VOCdevkit/VOC2012/JPEGImages/2009_002717.jpg 500 375 17 1 69 500 375 14 76 51 486 296 +10748 /data/VOCdevkit/VOC2012/JPEGImages/2009_002719.jpg 500 375 16 1 175 44 246 16 45 171 113 240 16 193 163 238 231 16 241 155 307 231 16 243 147 358 234 16 126 173 201 249 16 367 171 413 227 16 373 147 491 231 +10749 /data/VOCdevkit/VOC2012/JPEGImages/2009_002725.jpg 500 333 18 97 7 500 321 +10750 /data/VOCdevkit/VOC2012/JPEGImages/2009_002727.jpg 500 327 3 354 192 462 241 3 278 187 416 237 +10751 /data/VOCdevkit/VOC2012/JPEGImages/2009_002728.jpg 375 500 11 145 228 309 415 +10752 /data/VOCdevkit/VOC2012/JPEGImages/2009_002732.jpg 500 333 17 1 1 500 333 14 65 135 430 333 14 147 1 461 333 4 208 204 320 274 +10753 /data/VOCdevkit/VOC2012/JPEGImages/2009_002733.jpg 500 375 19 8 27 237 294 19 226 12 395 225 +10754 /data/VOCdevkit/VOC2012/JPEGImages/2009_002734.jpg 500 327 18 81 59 397 305 +10755 /data/VOCdevkit/VOC2012/JPEGImages/2009_002739.jpg 500 450 7 1 1 500 450 +10756 /data/VOCdevkit/VOC2012/JPEGImages/2009_002741.jpg 500 375 15 117 22 500 375 15 1 1 158 251 +10757 /data/VOCdevkit/VOC2012/JPEGImages/2009_002743.jpg 500 375 10 64 186 356 375 14 337 117 434 302 14 189 114 283 191 8 1 198 97 375 8 316 197 456 375 8 351 150 441 235 8 287 97 351 181 8 401 95 431 133 +10758 /data/VOCdevkit/VOC2012/JPEGImages/2009_002744.jpg 500 375 14 42 36 84 151 14 76 37 126 186 14 117 1 167 90 14 75 20 390 375 6 403 51 497 106 6 298 59 490 226 8 16 107 81 218 +10759 /data/VOCdevkit/VOC2012/JPEGImages/2009_002746.jpg 334 500 13 1 1 334 500 +10760 /data/VOCdevkit/VOC2012/JPEGImages/2009_002749.jpg 224 500 4 16 37 93 432 +10761 /data/VOCdevkit/VOC2012/JPEGImages/2009_002750.jpg 500 333 12 84 88 344 314 12 1 91 292 323 14 134 62 213 141 14 177 78 263 183 +10762 /data/VOCdevkit/VOC2012/JPEGImages/2009_002752.jpg 500 333 0 1 59 322 162 0 59 125 463 254 14 1 161 9 183 +10763 /data/VOCdevkit/VOC2012/JPEGImages/2009_002753.jpg 375 500 7 13 116 364 385 +10764 /data/VOCdevkit/VOC2012/JPEGImages/2009_002754.jpg 480 332 2 205 98 370 303 +10765 /data/VOCdevkit/VOC2012/JPEGImages/2009_002755.jpg 500 375 8 131 40 361 374 19 327 3 479 83 15 90 35 131 121 15 27 20 82 127 +10766 /data/VOCdevkit/VOC2012/JPEGImages/2009_002758.jpg 500 333 19 209 22 362 194 +10767 /data/VOCdevkit/VOC2012/JPEGImages/2009_002759.jpg 500 333 3 201 204 348 244 3 71 144 130 197 +10768 /data/VOCdevkit/VOC2012/JPEGImages/2009_002762.jpg 500 399 8 106 58 480 340 +10769 /data/VOCdevkit/VOC2012/JPEGImages/2009_002763.jpg 500 375 13 58 54 419 297 +10770 /data/VOCdevkit/VOC2012/JPEGImages/2009_002764.jpg 500 375 1 39 45 483 307 +10771 /data/VOCdevkit/VOC2012/JPEGImages/2009_002765.jpg 500 333 0 125 112 211 197 +10772 /data/VOCdevkit/VOC2012/JPEGImages/2009_002770.jpg 500 375 0 1 9 500 339 +10773 /data/VOCdevkit/VOC2012/JPEGImages/2009_002771.jpg 375 500 15 192 101 341 467 +10774 /data/VOCdevkit/VOC2012/JPEGImages/2009_002772.jpg 334 500 14 100 130 334 500 14 281 216 334 415 9 75 272 151 322 9 1 286 105 397 +10775 /data/VOCdevkit/VOC2012/JPEGImages/2009_002774.jpg 500 375 18 298 157 499 268 18 1 169 315 249 +10776 /data/VOCdevkit/VOC2012/JPEGImages/2009_002777.jpg 500 375 14 69 139 130 339 14 198 134 246 257 6 230 166 461 345 1 126 235 405 375 +10777 /data/VOCdevkit/VOC2012/JPEGImages/2009_002778.jpg 500 358 3 133 172 291 214 3 199 79 293 111 14 355 101 362 119 +10778 /data/VOCdevkit/VOC2012/JPEGImages/2009_002779.jpg 500 375 1 18 38 480 318 +10779 /data/VOCdevkit/VOC2012/JPEGImages/2009_002780.jpg 500 333 1 60 37 480 333 14 140 1 255 146 +10780 /data/VOCdevkit/VOC2012/JPEGImages/2009_002784.jpg 500 333 13 141 82 376 285 11 239 53 282 158 14 204 11 324 242 6 301 34 500 164 +10781 /data/VOCdevkit/VOC2012/JPEGImages/2009_002785.jpg 500 333 1 352 8 463 104 8 18 130 135 299 1 1 32 182 144 1 1 9 112 123 +10782 /data/VOCdevkit/VOC2012/JPEGImages/2009_002789.jpg 500 375 11 225 40 379 375 +10783 /data/VOCdevkit/VOC2012/JPEGImages/2009_002790.jpg 500 331 10 1 147 396 331 14 274 105 433 309 14 157 81 267 192 4 312 116 323 165 4 324 114 338 163 8 123 117 217 203 +10784 /data/VOCdevkit/VOC2012/JPEGImages/2009_002791.jpg 375 500 2 111 83 268 392 +10785 /data/VOCdevkit/VOC2012/JPEGImages/2009_002792.jpg 500 333 14 406 203 432 241 14 427 109 449 148 14 398 1 500 333 14 347 54 432 333 14 272 51 348 333 14 229 119 311 287 14 166 115 320 333 14 121 112 208 333 14 94 101 169 269 14 86 83 136 211 14 52 96 74 123 14 60 108 92 265 14 26 96 75 273 14 1 99 35 276 +10786 /data/VOCdevkit/VOC2012/JPEGImages/2009_002798.jpg 500 333 0 24 84 433 265 0 4 178 85 213 +10787 /data/VOCdevkit/VOC2012/JPEGImages/2009_002799.jpg 500 333 2 431 9 499 78 2 367 189 447 292 2 304 89 439 235 2 236 124 365 238 2 173 161 280 279 2 97 112 175 190 +10788 /data/VOCdevkit/VOC2012/JPEGImages/2009_002800.jpg 333 500 14 33 11 333 500 14 73 1 333 216 +10789 /data/VOCdevkit/VOC2012/JPEGImages/2009_002803.jpg 500 334 11 153 1 500 334 +10790 /data/VOCdevkit/VOC2012/JPEGImages/2009_002806.jpg 500 341 14 303 72 451 341 14 145 74 302 258 13 16 187 209 341 13 179 187 500 341 6 262 119 500 252 +10791 /data/VOCdevkit/VOC2012/JPEGImages/2009_002807.jpg 500 333 11 341 134 500 322 11 287 27 423 90 14 1 10 313 333 +10792 /data/VOCdevkit/VOC2012/JPEGImages/2009_002808.jpg 333 500 0 2 16 333 457 +10793 /data/VOCdevkit/VOC2012/JPEGImages/2009_002809.jpg 500 408 2 18 29 335 408 +10794 /data/VOCdevkit/VOC2012/JPEGImages/2009_002813.jpg 500 328 7 4 9 486 315 +10795 /data/VOCdevkit/VOC2012/JPEGImages/2009_002814.jpg 281 500 4 14 132 69 274 14 23 36 276 500 +10796 /data/VOCdevkit/VOC2012/JPEGImages/2009_002816.jpg 375 500 8 4 314 174 500 8 159 301 305 500 8 268 308 375 500 10 1 305 316 500 +10797 /data/VOCdevkit/VOC2012/JPEGImages/2009_002817.jpg 375 500 15 1 1 375 488 +10798 /data/VOCdevkit/VOC2012/JPEGImages/2009_002820.jpg 500 375 2 144 54 369 331 19 51 1 496 125 +10799 /data/VOCdevkit/VOC2012/JPEGImages/2009_002824.jpg 500 430 6 1 86 33 109 6 1 82 208 178 6 177 72 199 92 6 183 71 206 100 6 205 70 242 98 6 255 47 334 92 6 361 54 500 108 14 211 31 282 320 13 11 87 245 352 13 221 74 460 395 +10800 /data/VOCdevkit/VOC2012/JPEGImages/2009_002827.jpg 500 375 14 155 154 336 375 19 411 155 472 322 8 66 209 172 375 +10801 /data/VOCdevkit/VOC2012/JPEGImages/2009_002830.jpg 500 333 3 30 64 451 238 +10802 /data/VOCdevkit/VOC2012/JPEGImages/2009_002831.jpg 500 334 2 135 101 399 250 +10803 /data/VOCdevkit/VOC2012/JPEGImages/2009_002833.jpg 500 333 1 25 21 480 307 1 382 31 500 272 1 289 28 386 270 1 160 49 276 264 1 1 28 142 278 +10804 /data/VOCdevkit/VOC2012/JPEGImages/2009_002835.jpg 500 375 1 12 30 500 356 +10805 /data/VOCdevkit/VOC2012/JPEGImages/2009_002836.jpg 500 375 7 208 84 353 347 7 145 18 377 178 +10806 /data/VOCdevkit/VOC2012/JPEGImages/2009_002837.jpg 500 361 7 68 1 500 361 +10807 /data/VOCdevkit/VOC2012/JPEGImages/2009_002838.jpg 500 375 18 79 51 477 335 14 48 150 59 168 14 7 149 15 169 +10808 /data/VOCdevkit/VOC2012/JPEGImages/2009_002841.jpg 375 500 8 212 395 229 433 6 182 366 193 399 +10809 /data/VOCdevkit/VOC2012/JPEGImages/2009_002842.jpg 500 375 8 1 28 500 375 +10810 /data/VOCdevkit/VOC2012/JPEGImages/2009_002843.jpg 500 375 5 69 16 466 349 +10811 /data/VOCdevkit/VOC2012/JPEGImages/2009_002844.jpg 500 374 8 71 74 190 188 8 145 117 213 174 8 341 188 477 374 8 1 290 161 374 10 25 142 467 374 +10812 /data/VOCdevkit/VOC2012/JPEGImages/2009_002845.jpg 500 333 11 173 98 428 333 +10813 /data/VOCdevkit/VOC2012/JPEGImages/2009_002847.jpg 500 375 11 77 1 417 345 +10814 /data/VOCdevkit/VOC2012/JPEGImages/2009_002849.jpg 500 375 19 318 82 470 213 +10815 /data/VOCdevkit/VOC2012/JPEGImages/2009_002850.jpg 500 333 4 369 160 470 333 4 354 74 407 319 4 238 78 293 287 4 169 78 229 282 4 98 70 163 285 4 140 45 189 241 14 291 67 356 172 14 279 68 315 127 14 74 81 102 113 +10816 /data/VOCdevkit/VOC2012/JPEGImages/2009_002851.jpg 344 500 14 284 381 306 445 3 238 339 312 354 +10817 /data/VOCdevkit/VOC2012/JPEGImages/2009_002853.jpg 500 375 5 92 158 354 307 1 414 238 463 273 +10818 /data/VOCdevkit/VOC2012/JPEGImages/2009_002855.jpg 500 330 7 1 1 500 330 +10819 /data/VOCdevkit/VOC2012/JPEGImages/2009_002856.jpg 333 500 4 107 104 213 434 +10820 /data/VOCdevkit/VOC2012/JPEGImages/2009_002862.jpg 500 333 6 303 155 408 214 +10821 /data/VOCdevkit/VOC2012/JPEGImages/2009_002865.jpg 375 500 11 39 52 375 500 +10822 /data/VOCdevkit/VOC2012/JPEGImages/2009_002867.jpg 377 500 18 19 75 371 465 14 355 289 377 347 +10823 /data/VOCdevkit/VOC2012/JPEGImages/2009_002869.jpg 500 252 9 33 34 162 224 9 390 119 445 163 9 218 96 258 122 9 1 59 68 109 +10824 /data/VOCdevkit/VOC2012/JPEGImages/2009_002872.jpg 500 375 19 47 162 141 257 +10825 /data/VOCdevkit/VOC2012/JPEGImages/2009_002876.jpg 500 375 5 40 63 463 356 5 446 93 500 236 +10826 /data/VOCdevkit/VOC2012/JPEGImages/2009_002877.jpg 333 500 2 24 165 319 500 +10827 /data/VOCdevkit/VOC2012/JPEGImages/2009_002879.jpg 500 375 14 163 46 199 110 +10828 /data/VOCdevkit/VOC2012/JPEGImages/2009_002882.jpg 500 375 12 1 1 500 375 +10829 /data/VOCdevkit/VOC2012/JPEGImages/2009_002883.jpg 500 330 12 65 65 235 330 14 213 112 320 330 +10830 /data/VOCdevkit/VOC2012/JPEGImages/2009_002885.jpg 500 375 14 1 155 80 285 14 71 63 224 252 14 217 58 393 257 14 437 98 500 318 10 1 241 500 375 +10831 /data/VOCdevkit/VOC2012/JPEGImages/2009_002887.jpg 500 243 18 218 3 498 182 +10832 /data/VOCdevkit/VOC2012/JPEGImages/2009_002888.jpg 500 333 0 2 142 213 248 0 89 96 305 211 0 183 52 498 186 +10833 /data/VOCdevkit/VOC2012/JPEGImages/2009_002890.jpg 500 267 2 134 76 342 185 +10834 /data/VOCdevkit/VOC2012/JPEGImages/2009_002893.jpg 500 375 17 1 1 471 375 14 1 136 376 346 11 128 136 261 228 +10835 /data/VOCdevkit/VOC2012/JPEGImages/2009_002894.jpg 334 500 13 1 98 252 500 14 145 40 299 500 6 272 245 334 403 6 1 259 40 382 +10836 /data/VOCdevkit/VOC2012/JPEGImages/2009_002897.jpg 500 341 3 14 88 489 209 +10837 /data/VOCdevkit/VOC2012/JPEGImages/2009_002898.jpg 500 333 7 27 44 477 312 +10838 /data/VOCdevkit/VOC2012/JPEGImages/2009_002901.jpg 500 365 9 180 106 369 341 +10839 /data/VOCdevkit/VOC2012/JPEGImages/2009_002902.jpg 500 375 13 63 57 448 357 +10840 /data/VOCdevkit/VOC2012/JPEGImages/2009_002908.jpg 375 500 11 1 58 372 500 +10841 /data/VOCdevkit/VOC2012/JPEGImages/2009_002910.jpg 500 327 0 25 119 487 225 0 455 136 498 151 0 357 140 400 161 0 1 140 82 178 +10842 /data/VOCdevkit/VOC2012/JPEGImages/2009_002912.jpg 500 357 9 91 147 181 197 9 208 148 306 194 9 303 147 415 197 +10843 /data/VOCdevkit/VOC2012/JPEGImages/2009_002914.jpg 500 333 0 111 53 422 256 +10844 /data/VOCdevkit/VOC2012/JPEGImages/2009_002917.jpg 500 332 7 49 127 489 306 +10845 /data/VOCdevkit/VOC2012/JPEGImages/2009_002918.jpg 333 500 14 1 5 310 500 +10846 /data/VOCdevkit/VOC2012/JPEGImages/2009_002920.jpg 500 375 2 77 109 405 254 +10847 /data/VOCdevkit/VOC2012/JPEGImages/2009_002921.jpg 500 375 16 1 5 235 314 16 205 121 481 359 +10848 /data/VOCdevkit/VOC2012/JPEGImages/2009_002925.jpg 500 334 11 90 94 380 314 14 66 1 187 120 +10849 /data/VOCdevkit/VOC2012/JPEGImages/2009_002928.jpg 500 375 1 45 85 441 350 15 357 70 431 142 +10850 /data/VOCdevkit/VOC2012/JPEGImages/2009_002932.jpg 500 375 14 178 103 278 358 14 273 88 367 355 19 35 196 104 267 8 343 228 399 330 8 241 221 290 327 +10851 /data/VOCdevkit/VOC2012/JPEGImages/2009_002933.jpg 500 375 5 357 79 500 321 5 61 45 421 375 6 1 221 67 291 5 31 197 58 221 +10852 /data/VOCdevkit/VOC2012/JPEGImages/2009_002935.jpg 356 500 15 1 367 133 500 15 1 109 307 495 +10853 /data/VOCdevkit/VOC2012/JPEGImages/2009_002936.jpg 500 375 7 188 72 319 341 +10854 /data/VOCdevkit/VOC2012/JPEGImages/2009_002937.jpg 500 335 2 179 132 262 186 +10855 /data/VOCdevkit/VOC2012/JPEGImages/2009_002938.jpg 500 375 18 106 204 318 344 +10856 /data/VOCdevkit/VOC2012/JPEGImages/2009_002940.jpg 500 375 4 112 112 184 332 4 184 105 246 313 4 240 96 302 296 4 294 78 342 265 4 320 88 405 274 4 92 85 146 296 4 158 75 211 152 4 223 71 266 135 4 341 67 388 114 4 1 1 22 158 4 12 1 93 149 4 15 146 85 276 4 1 161 24 288 4 1 299 27 375 4 19 274 84 375 4 121 332 176 375 4 179 324 233 375 4 235 317 282 375 4 286 299 330 375 4 321 291 375 375 4 371 275 417 375 +10857 /data/VOCdevkit/VOC2012/JPEGImages/2009_002941.jpg 500 333 0 14 46 483 221 +10858 /data/VOCdevkit/VOC2012/JPEGImages/2009_002946.jpg 500 333 3 143 33 298 303 14 157 247 179 278 14 202 261 215 279 3 284 161 302 206 +10859 /data/VOCdevkit/VOC2012/JPEGImages/2009_002947.jpg 500 333 18 84 155 282 234 +10860 /data/VOCdevkit/VOC2012/JPEGImages/2009_002952.jpg 500 375 8 246 186 308 305 10 1 257 105 375 8 1 284 76 375 8 33 241 105 372 15 330 96 363 207 15 453 170 477 235 15 434 132 461 229 15 346 171 395 236 15 395 163 411 221 15 411 187 434 225 +10861 /data/VOCdevkit/VOC2012/JPEGImages/2009_002954.jpg 500 375 14 107 217 229 298 14 298 102 404 217 14 356 4 500 215 +10862 /data/VOCdevkit/VOC2012/JPEGImages/2009_002955.jpg 375 500 7 124 167 266 313 +10863 /data/VOCdevkit/VOC2012/JPEGImages/2009_002957.jpg 500 375 12 115 23 427 375 +10864 /data/VOCdevkit/VOC2012/JPEGImages/2009_002958.jpg 500 375 11 434 5 500 47 11 1 126 334 375 +10865 /data/VOCdevkit/VOC2012/JPEGImages/2009_002960.jpg 500 323 6 2 25 315 320 14 349 45 461 323 6 439 93 500 261 14 445 77 476 97 14 475 75 495 98 14 484 67 500 97 +10866 /data/VOCdevkit/VOC2012/JPEGImages/2009_002961.jpg 480 321 7 40 1 480 321 14 1 43 480 321 +10867 /data/VOCdevkit/VOC2012/JPEGImages/2009_002962.jpg 500 343 2 73 28 395 279 +10868 /data/VOCdevkit/VOC2012/JPEGImages/2009_002967.jpg 500 333 19 96 5 372 329 +10869 /data/VOCdevkit/VOC2012/JPEGImages/2009_002970.jpg 500 333 19 179 70 234 143 19 150 170 227 251 19 98 226 142 273 19 84 297 135 333 19 259 291 317 333 19 137 278 180 329 19 301 293 412 333 19 385 22 486 112 19 378 233 471 312 19 469 233 500 316 +10870 /data/VOCdevkit/VOC2012/JPEGImages/2009_002971.jpg 500 333 6 110 70 459 228 +10871 /data/VOCdevkit/VOC2012/JPEGImages/2009_002972.jpg 500 375 7 91 124 467 311 17 3 3 498 372 +10872 /data/VOCdevkit/VOC2012/JPEGImages/2009_002975.jpg 500 333 12 41 32 375 304 +10873 /data/VOCdevkit/VOC2012/JPEGImages/2009_002976.jpg 500 375 14 433 1 500 251 14 346 5 419 154 14 149 27 408 329 14 1 186 166 375 14 1 132 121 299 14 1 97 102 191 14 83 93 247 228 14 300 290 395 375 +10874 /data/VOCdevkit/VOC2012/JPEGImages/2009_002977.jpg 500 375 2 486 172 500 229 2 459 167 489 243 2 326 170 350 241 2 236 155 267 252 2 215 153 252 252 2 200 202 227 248 2 183 174 222 249 2 108 181 164 262 2 122 161 144 225 +10875 /data/VOCdevkit/VOC2012/JPEGImages/2009_002978.jpg 500 375 8 257 276 429 375 8 319 227 391 307 8 244 205 313 278 8 98 211 165 273 8 35 252 194 375 8 10 230 148 365 10 96 239 361 375 +10876 /data/VOCdevkit/VOC2012/JPEGImages/2009_002980.jpg 312 500 4 174 15 301 462 +10877 /data/VOCdevkit/VOC2012/JPEGImages/2009_002982.jpg 500 375 18 84 102 418 309 +10878 /data/VOCdevkit/VOC2012/JPEGImages/2009_002983.jpg 500 375 14 146 196 226 375 14 48 186 136 366 1 11 263 171 366 1 95 177 162 256 14 100 123 160 240 14 153 60 174 89 1 146 74 180 93 14 100 62 121 94 1 93 75 132 97 +10879 /data/VOCdevkit/VOC2012/JPEGImages/2009_002984.jpg 500 375 19 131 84 291 268 19 320 100 475 216 4 363 205 404 313 19 388 89 500 196 +10880 /data/VOCdevkit/VOC2012/JPEGImages/2009_002985.jpg 500 375 1 1 33 500 375 +10881 /data/VOCdevkit/VOC2012/JPEGImages/2009_002986.jpg 500 375 9 190 202 290 270 9 339 223 424 264 9 34 223 115 261 +10882 /data/VOCdevkit/VOC2012/JPEGImages/2009_002988.jpg 500 309 16 282 182 368 250 16 70 113 198 228 16 220 111 302 233 16 186 109 314 210 16 303 123 380 239 +10883 /data/VOCdevkit/VOC2012/JPEGImages/2009_002990.jpg 500 335 6 28 89 465 258 +10884 /data/VOCdevkit/VOC2012/JPEGImages/2009_002993.jpg 500 457 14 6 48 146 440 14 119 32 255 443 14 213 24 356 444 14 338 19 489 444 13 14 141 171 374 13 152 210 295 368 13 330 151 397 363 13 461 141 500 366 14 476 108 500 181 14 1 122 26 247 +10885 /data/VOCdevkit/VOC2012/JPEGImages/2009_002995.jpg 500 333 19 44 1 358 280 8 301 54 430 277 8 1 88 66 266 +10886 /data/VOCdevkit/VOC2012/JPEGImages/2009_002998.jpg 375 500 17 1 364 375 500 +10887 /data/VOCdevkit/VOC2012/JPEGImages/2009_002999.jpg 500 333 0 16 74 493 291 +10888 /data/VOCdevkit/VOC2012/JPEGImages/2009_003000.jpg 500 336 14 340 104 500 252 14 271 116 356 280 14 145 99 284 277 14 70 121 183 313 14 1 120 100 302 +10889 /data/VOCdevkit/VOC2012/JPEGImages/2009_003002.jpg 500 375 2 120 94 326 204 +10890 /data/VOCdevkit/VOC2012/JPEGImages/2009_003003.jpg 375 500 10 1 226 375 500 14 6 1 73 173 14 282 1 353 96 14 328 2 375 359 6 13 20 356 255 4 204 47 345 500 +10891 /data/VOCdevkit/VOC2012/JPEGImages/2009_003005.jpg 500 333 0 17 78 482 225 +10892 /data/VOCdevkit/VOC2012/JPEGImages/2009_003006.jpg 500 375 10 1 272 46 375 14 126 31 290 375 +10893 /data/VOCdevkit/VOC2012/JPEGImages/2009_003007.jpg 333 500 1 113 47 222 474 +10894 /data/VOCdevkit/VOC2012/JPEGImages/2009_003010.jpg 500 331 3 127 1 309 281 14 317 92 385 243 +10895 /data/VOCdevkit/VOC2012/JPEGImages/2009_003012.jpg 500 333 14 212 112 320 222 13 179 126 387 238 +10896 /data/VOCdevkit/VOC2012/JPEGImages/2009_003013.jpg 500 375 7 29 51 362 355 +10897 /data/VOCdevkit/VOC2012/JPEGImages/2009_003018.jpg 500 375 5 26 61 449 280 +10898 /data/VOCdevkit/VOC2012/JPEGImages/2009_003019.jpg 500 402 3 111 14 493 377 3 9 159 164 372 14 346 337 364 355 14 363 331 379 356 14 392 341 408 358 14 439 336 459 349 +10899 /data/VOCdevkit/VOC2012/JPEGImages/2009_003020.jpg 500 375 13 337 196 405 241 14 294 184 316 242 14 191 216 237 274 14 276 180 295 242 6 146 162 276 256 +10900 /data/VOCdevkit/VOC2012/JPEGImages/2009_003022.jpg 500 333 18 62 46 443 333 +10901 /data/VOCdevkit/VOC2012/JPEGImages/2009_003023.jpg 500 333 11 169 46 363 304 +10902 /data/VOCdevkit/VOC2012/JPEGImages/2009_003031.jpg 500 375 6 24 70 475 307 +10903 /data/VOCdevkit/VOC2012/JPEGImages/2009_003032.jpg 500 375 3 1 23 500 214 +10904 /data/VOCdevkit/VOC2012/JPEGImages/2009_003033.jpg 500 333 0 106 116 433 209 +10905 /data/VOCdevkit/VOC2012/JPEGImages/2009_003034.jpg 500 333 4 297 1 374 333 4 210 10 292 324 4 106 31 198 333 4 1 75 78 332 +10906 /data/VOCdevkit/VOC2012/JPEGImages/2009_003035.jpg 500 375 14 43 140 285 375 14 215 1 500 375 +10907 /data/VOCdevkit/VOC2012/JPEGImages/2009_003039.jpg 500 333 15 261 62 495 333 15 7 87 252 333 +10908 /data/VOCdevkit/VOC2012/JPEGImages/2009_003042.jpg 500 333 1 195 174 259 243 1 84 180 139 249 14 203 124 257 227 14 85 134 140 235 +10909 /data/VOCdevkit/VOC2012/JPEGImages/2009_003043.jpg 500 375 3 208 188 230 271 3 47 55 231 331 3 43 200 74 263 14 198 283 211 310 +10910 /data/VOCdevkit/VOC2012/JPEGImages/2009_003044.jpg 500 372 0 39 38 500 372 14 107 63 489 372 +10911 /data/VOCdevkit/VOC2012/JPEGImages/2009_003052.jpg 500 390 2 198 194 311 288 +10912 /data/VOCdevkit/VOC2012/JPEGImages/2009_003053.jpg 460 306 5 22 29 441 268 5 322 23 460 174 +10913 /data/VOCdevkit/VOC2012/JPEGImages/2009_003054.jpg 500 375 18 129 175 500 233 +10914 /data/VOCdevkit/VOC2012/JPEGImages/2009_003056.jpg 331 240 7 16 21 296 219 +10915 /data/VOCdevkit/VOC2012/JPEGImages/2009_003058.jpg 333 500 6 82 146 333 365 14 295 180 324 207 14 160 170 198 207 +10916 /data/VOCdevkit/VOC2012/JPEGImages/2009_003059.jpg 500 333 9 232 15 500 333 9 1 73 284 333 +10917 /data/VOCdevkit/VOC2012/JPEGImages/2009_003063.jpg 500 375 11 18 136 222 277 11 269 207 355 268 +10918 /data/VOCdevkit/VOC2012/JPEGImages/2009_003064.jpg 500 375 14 93 10 500 375 +10919 /data/VOCdevkit/VOC2012/JPEGImages/2009_003065.jpg 500 369 1 178 197 288 349 14 179 104 285 311 +10920 /data/VOCdevkit/VOC2012/JPEGImages/2009_003066.jpg 500 335 0 17 58 490 229 +10921 /data/VOCdevkit/VOC2012/JPEGImages/2009_003067.jpg 500 375 5 115 151 308 289 +10922 /data/VOCdevkit/VOC2012/JPEGImages/2009_003068.jpg 500 374 13 1 1 500 374 +10923 /data/VOCdevkit/VOC2012/JPEGImages/2009_003070.jpg 500 339 7 1 8 479 339 +10924 /data/VOCdevkit/VOC2012/JPEGImages/2009_003071.jpg 500 333 8 17 118 158 330 8 387 110 500 190 10 82 147 500 333 14 99 86 259 248 +10925 /data/VOCdevkit/VOC2012/JPEGImages/2009_003074.jpg 500 375 15 1 105 453 375 +10926 /data/VOCdevkit/VOC2012/JPEGImages/2009_003075.jpg 500 333 1 287 120 434 270 1 69 124 299 323 +10927 /data/VOCdevkit/VOC2012/JPEGImages/2009_003076.jpg 500 313 14 40 64 263 249 16 169 62 417 228 +10928 /data/VOCdevkit/VOC2012/JPEGImages/2009_003077.jpg 500 375 7 167 206 349 327 15 181 1 392 253 15 454 1 500 244 15 48 1 227 189 15 1 1 50 193 +10929 /data/VOCdevkit/VOC2012/JPEGImages/2009_003078.jpg 500 375 19 15 111 119 192 8 153 149 318 375 8 314 132 467 367 8 259 109 328 168 8 83 119 222 310 10 139 165 387 375 +10930 /data/VOCdevkit/VOC2012/JPEGImages/2009_003080.jpg 375 500 3 112 177 323 378 +10931 /data/VOCdevkit/VOC2012/JPEGImages/2009_003082.jpg 500 333 12 99 113 331 298 12 1 179 63 319 +10932 /data/VOCdevkit/VOC2012/JPEGImages/2009_003083.jpg 500 375 12 1 66 335 375 +10933 /data/VOCdevkit/VOC2012/JPEGImages/2009_003084.jpg 500 375 3 172 60 308 261 +10934 /data/VOCdevkit/VOC2012/JPEGImages/2009_003087.jpg 500 332 17 1 1 500 332 14 64 1 434 332 +10935 /data/VOCdevkit/VOC2012/JPEGImages/2009_003088.jpg 500 435 2 133 105 305 324 +10936 /data/VOCdevkit/VOC2012/JPEGImages/2009_003089.jpg 500 334 9 58 60 469 314 9 364 43 443 93 +10937 /data/VOCdevkit/VOC2012/JPEGImages/2009_003090.jpg 500 342 13 33 79 462 260 14 157 63 365 271 +10938 /data/VOCdevkit/VOC2012/JPEGImages/2009_003091.jpg 500 375 6 2 92 436 350 6 280 95 500 199 +10939 /data/VOCdevkit/VOC2012/JPEGImages/2009_003093.jpg 500 375 19 141 40 360 193 +10940 /data/VOCdevkit/VOC2012/JPEGImages/2009_003095.jpg 500 375 11 1 57 500 375 +10941 /data/VOCdevkit/VOC2012/JPEGImages/2009_003097.jpg 500 333 0 194 92 413 167 +10942 /data/VOCdevkit/VOC2012/JPEGImages/2009_003098.jpg 500 333 11 247 97 416 219 11 1 17 299 203 8 1 1 129 106 +10943 /data/VOCdevkit/VOC2012/JPEGImages/2009_003105.jpg 500 375 18 1 75 402 282 +10944 /data/VOCdevkit/VOC2012/JPEGImages/2009_003107.jpg 500 333 0 13 112 493 243 +10945 /data/VOCdevkit/VOC2012/JPEGImages/2009_003108.jpg 500 333 0 100 108 281 150 0 16 106 220 157 0 12 90 482 232 0 303 115 399 150 +10946 /data/VOCdevkit/VOC2012/JPEGImages/2009_003109.jpg 500 333 2 35 33 397 310 +10947 /data/VOCdevkit/VOC2012/JPEGImages/2009_003110.jpg 500 333 8 300 43 481 297 +10948 /data/VOCdevkit/VOC2012/JPEGImages/2009_003114.jpg 375 500 4 3 1 176 500 +10949 /data/VOCdevkit/VOC2012/JPEGImages/2009_003115.jpg 374 500 10 28 302 337 500 +10950 /data/VOCdevkit/VOC2012/JPEGImages/2009_003116.jpg 500 500 8 130 161 475 465 14 142 21 376 463 +10951 /data/VOCdevkit/VOC2012/JPEGImages/2009_003118.jpg 500 334 7 20 1 457 334 +10952 /data/VOCdevkit/VOC2012/JPEGImages/2009_003122.jpg 500 375 11 118 13 341 262 11 370 62 465 176 +10953 /data/VOCdevkit/VOC2012/JPEGImages/2009_003123.jpg 500 375 10 1 285 149 375 8 1 230 78 286 17 59 188 414 375 +10954 /data/VOCdevkit/VOC2012/JPEGImages/2009_003125.jpg 500 333 14 1 42 274 333 14 186 1 500 333 14 110 1 414 333 +10955 /data/VOCdevkit/VOC2012/JPEGImages/2009_003126.jpg 500 375 14 46 153 425 360 +10956 /data/VOCdevkit/VOC2012/JPEGImages/2009_003127.jpg 500 333 12 241 195 335 248 12 364 199 437 244 +10957 /data/VOCdevkit/VOC2012/JPEGImages/2009_003128.jpg 500 333 12 52 65 458 333 14 197 146 294 333 14 198 25 329 251 14 11 145 117 319 +10958 /data/VOCdevkit/VOC2012/JPEGImages/2009_003129.jpg 500 333 7 110 58 429 318 17 2 2 478 333 +10959 /data/VOCdevkit/VOC2012/JPEGImages/2009_003130.jpg 500 375 11 18 38 486 312 +10960 /data/VOCdevkit/VOC2012/JPEGImages/2009_003132.jpg 334 500 6 58 346 253 431 6 219 347 256 360 +10961 /data/VOCdevkit/VOC2012/JPEGImages/2009_003136.jpg 500 370 3 1 39 489 282 3 47 297 236 350 +10962 /data/VOCdevkit/VOC2012/JPEGImages/2009_003138.jpg 500 333 6 466 137 500 176 6 395 141 481 189 6 117 119 398 301 6 40 160 202 268 6 38 158 142 196 6 145 147 203 161 6 93 149 153 165 6 52 149 111 181 6 198 143 248 170 +10963 /data/VOCdevkit/VOC2012/JPEGImages/2009_003140.jpg 500 375 19 99 32 261 206 8 247 205 409 375 +10964 /data/VOCdevkit/VOC2012/JPEGImages/2009_003142.jpg 332 500 4 151 297 206 444 +10965 /data/VOCdevkit/VOC2012/JPEGImages/2009_003143.jpg 500 482 7 1 12 419 482 +10966 /data/VOCdevkit/VOC2012/JPEGImages/2009_003144.jpg 500 375 4 169 270 200 375 4 259 255 288 365 4 290 258 314 341 4 454 243 474 293 +10967 /data/VOCdevkit/VOC2012/JPEGImages/2009_003146.jpg 500 375 9 85 111 372 253 +10968 /data/VOCdevkit/VOC2012/JPEGImages/2009_003147.jpg 500 335 0 167 73 499 203 0 101 78 293 197 0 43 81 208 191 0 1 87 162 186 +10969 /data/VOCdevkit/VOC2012/JPEGImages/2009_003150.jpg 500 331 3 1 1 500 331 8 399 230 495 327 8 315 248 413 331 8 213 258 308 331 8 152 191 216 299 14 480 121 500 174 14 453 116 500 178 14 416 142 481 225 14 404 162 493 283 14 340 136 395 199 14 308 182 403 321 14 315 128 341 169 14 286 129 333 196 14 235 145 288 210 14 222 181 312 320 14 178 155 230 302 10 227 187 419 251 +10970 /data/VOCdevkit/VOC2012/JPEGImages/2009_003151.jpg 500 375 2 225 81 372 130 +10971 /data/VOCdevkit/VOC2012/JPEGImages/2009_003153.jpg 500 276 0 15 80 489 247 +10972 /data/VOCdevkit/VOC2012/JPEGImages/2009_003154.jpg 500 375 10 77 214 403 371 14 3 101 130 375 14 80 90 199 263 14 315 118 500 375 14 308 139 404 295 4 205 190 232 240 4 229 184 244 232 4 203 180 213 233 4 216 175 227 188 4 206 175 218 189 +10973 /data/VOCdevkit/VOC2012/JPEGImages/2009_003155.jpg 375 500 6 1 84 356 500 +10974 /data/VOCdevkit/VOC2012/JPEGImages/2009_003156.jpg 334 500 11 70 162 304 487 17 1 206 114 265 17 1 108 334 500 +10975 /data/VOCdevkit/VOC2012/JPEGImages/2009_003157.jpg 333 500 8 18 197 124 318 8 1 331 105 500 19 152 156 187 188 17 254 176 327 256 +10976 /data/VOCdevkit/VOC2012/JPEGImages/2009_003164.jpg 500 375 1 220 115 489 295 1 69 122 222 255 +10977 /data/VOCdevkit/VOC2012/JPEGImages/2009_003165.jpg 500 375 7 1 1 500 375 +10978 /data/VOCdevkit/VOC2012/JPEGImages/2009_003166.jpg 375 500 14 1 129 375 500 +10979 /data/VOCdevkit/VOC2012/JPEGImages/2009_003168.jpg 375 500 2 108 141 305 468 +10980 /data/VOCdevkit/VOC2012/JPEGImages/2009_003172.jpg 500 385 11 65 64 378 324 +10981 /data/VOCdevkit/VOC2012/JPEGImages/2009_003173.jpg 500 375 9 238 220 317 269 9 80 216 126 266 +10982 /data/VOCdevkit/VOC2012/JPEGImages/2009_003175.jpg 500 333 1 1 84 281 313 1 4 96 246 262 1 264 78 432 274 1 302 91 500 249 14 437 86 499 150 +10983 /data/VOCdevkit/VOC2012/JPEGImages/2009_003181.jpg 500 333 14 247 290 262 320 +10984 /data/VOCdevkit/VOC2012/JPEGImages/2009_003183.jpg 500 375 6 89 293 192 373 +10985 /data/VOCdevkit/VOC2012/JPEGImages/2009_003185.jpg 500 333 18 1 58 500 324 +10986 /data/VOCdevkit/VOC2012/JPEGImages/2009_003187.jpg 500 375 1 57 5 423 371 +10987 /data/VOCdevkit/VOC2012/JPEGImages/2009_003189.jpg 332 500 9 63 150 216 414 +10988 /data/VOCdevkit/VOC2012/JPEGImages/2009_003191.jpg 375 500 4 145 223 235 496 14 53 133 343 493 4 1 261 40 493 19 29 194 101 264 8 313 305 351 483 10 1 397 375 500 +10989 /data/VOCdevkit/VOC2012/JPEGImages/2009_003193.jpg 500 375 1 69 60 435 285 +10990 /data/VOCdevkit/VOC2012/JPEGImages/2009_003194.jpg 500 333 11 1 23 440 327 +10991 /data/VOCdevkit/VOC2012/JPEGImages/2009_003196.jpg 500 374 13 197 199 420 323 +10992 /data/VOCdevkit/VOC2012/JPEGImages/2009_003198.jpg 500 375 10 1 217 322 375 8 220 227 385 375 8 16 248 198 375 8 1 240 75 375 8 91 168 144 222 8 154 183 214 232 8 225 186 296 245 8 1 187 65 249 15 208 196 228 219 +10993 /data/VOCdevkit/VOC2012/JPEGImages/2009_003199.jpg 500 333 0 5 96 499 255 0 373 193 500 240 +10994 /data/VOCdevkit/VOC2012/JPEGImages/2009_003200.jpg 500 327 5 80 163 336 293 +10995 /data/VOCdevkit/VOC2012/JPEGImages/2009_003201.jpg 333 500 7 28 49 333 402 +10996 /data/VOCdevkit/VOC2012/JPEGImages/2009_003204.jpg 360 270 19 86 19 230 154 +10997 /data/VOCdevkit/VOC2012/JPEGImages/2009_003208.jpg 500 334 17 204 121 456 300 +10998 /data/VOCdevkit/VOC2012/JPEGImages/2009_003209.jpg 475 500 11 95 91 293 279 +10999 /data/VOCdevkit/VOC2012/JPEGImages/2009_003212.jpg 500 375 6 24 203 68 241 6 40 206 103 256 6 71 209 197 279 6 168 209 469 351 +11000 /data/VOCdevkit/VOC2012/JPEGImages/2009_003214.jpg 500 375 19 217 84 383 225 19 36 74 219 228 4 290 242 371 280 14 257 167 280 197 14 89 173 115 202 +11001 /data/VOCdevkit/VOC2012/JPEGImages/2009_003217.jpg 500 375 11 86 83 496 299 +11002 /data/VOCdevkit/VOC2012/JPEGImages/2009_003218.jpg 500 500 9 106 333 215 401 +11003 /data/VOCdevkit/VOC2012/JPEGImages/2009_003219.jpg 500 375 0 18 76 496 300 +11004 /data/VOCdevkit/VOC2012/JPEGImages/2009_003222.jpg 500 474 7 1 27 500 474 +11005 /data/VOCdevkit/VOC2012/JPEGImages/2009_003224.jpg 500 375 1 33 27 404 365 +11006 /data/VOCdevkit/VOC2012/JPEGImages/2009_003225.jpg 500 443 11 1 77 443 380 +11007 /data/VOCdevkit/VOC2012/JPEGImages/2009_003229.jpg 500 375 3 294 241 364 294 +11008 /data/VOCdevkit/VOC2012/JPEGImages/2009_003230.jpg 500 281 18 130 1 500 281 18 1 111 99 179 +11009 /data/VOCdevkit/VOC2012/JPEGImages/2009_003232.jpg 319 480 12 61 88 319 360 +11010 /data/VOCdevkit/VOC2012/JPEGImages/2009_003233.jpg 500 335 18 111 103 441 214 +11011 /data/VOCdevkit/VOC2012/JPEGImages/2009_003234.jpg 500 227 13 129 10 476 220 +11012 /data/VOCdevkit/VOC2012/JPEGImages/2009_003238.jpg 500 332 13 114 137 355 263 14 181 81 285 269 6 281 97 500 240 14 427 113 497 149 15 113 139 168 190 14 457 75 477 101 15 127 56 193 114 +11013 /data/VOCdevkit/VOC2012/JPEGImages/2009_003241.jpg 333 500 11 1 24 333 340 +11014 /data/VOCdevkit/VOC2012/JPEGImages/2009_003247.jpg 500 287 3 373 189 492 209 3 181 129 367 209 3 275 103 352 148 3 20 156 200 214 14 394 161 414 196 14 118 157 141 187 14 76 154 99 187 3 17 137 58 149 +11015 /data/VOCdevkit/VOC2012/JPEGImages/2009_003249.jpg 500 375 16 110 158 383 288 16 1 156 32 236 +11016 /data/VOCdevkit/VOC2012/JPEGImages/2009_003251.jpg 500 375 10 97 141 442 375 15 205 66 235 98 15 180 74 211 105 8 282 122 341 148 8 416 111 500 350 8 1 259 187 375 8 55 91 105 197 14 3 120 127 345 14 423 100 491 314 14 81 33 212 199 1 328 36 353 85 1 313 38 329 84 +11017 /data/VOCdevkit/VOC2012/JPEGImages/2009_003253.jpg 375 500 8 11 139 211 487 8 212 109 339 353 10 187 184 375 487 +11018 /data/VOCdevkit/VOC2012/JPEGImages/2009_003254.jpg 500 500 16 187 281 243 327 16 280 312 322 338 +11019 /data/VOCdevkit/VOC2012/JPEGImages/2009_003255.jpg 500 332 6 32 21 481 306 6 261 15 500 191 6 35 19 328 84 14 312 1 342 51 6 234 3 309 49 6 128 9 224 48 +11020 /data/VOCdevkit/VOC2012/JPEGImages/2009_003257.jpg 500 281 14 249 42 500 263 2 17 149 64 223 14 137 39 148 54 +11021 /data/VOCdevkit/VOC2012/JPEGImages/2009_003259.jpg 500 380 2 213 124 288 260 +11022 /data/VOCdevkit/VOC2012/JPEGImages/2009_003261.jpg 500 375 12 307 84 500 290 14 114 86 263 375 14 1 18 215 375 +11023 /data/VOCdevkit/VOC2012/JPEGImages/2009_003262.jpg 500 304 11 33 11 336 240 14 130 1 294 75 +11024 /data/VOCdevkit/VOC2012/JPEGImages/2009_003265.jpg 500 333 10 140 202 357 333 8 118 251 256 333 8 441 262 500 333 8 443 199 471 279 4 253 169 271 233 14 222 33 421 217 19 222 109 301 164 14 287 127 449 333 14 26 59 173 333 14 133 107 227 222 4 225 173 243 201 8 5 193 31 297 +11025 /data/VOCdevkit/VOC2012/JPEGImages/2009_003266.jpg 500 332 14 313 31 491 332 14 152 55 317 332 14 25 60 188 332 14 14 84 69 332 14 453 98 484 147 14 430 95 454 127 14 165 96 207 144 14 256 64 344 148 14 1 86 17 216 +11026 /data/VOCdevkit/VOC2012/JPEGImages/2009_003267.jpg 325 500 6 176 343 325 435 6 1 341 97 437 +11027 /data/VOCdevkit/VOC2012/JPEGImages/2009_003269.jpg 500 375 14 122 78 500 375 4 114 166 225 313 6 207 189 267 273 +11028 /data/VOCdevkit/VOC2012/JPEGImages/2009_003271.jpg 500 375 16 248 188 500 361 16 355 146 500 300 16 289 188 500 238 11 93 166 149 239 +11029 /data/VOCdevkit/VOC2012/JPEGImages/2009_003272.jpg 375 500 8 60 265 334 500 8 317 205 375 500 7 153 338 270 450 14 26 63 334 500 +11030 /data/VOCdevkit/VOC2012/JPEGImages/2009_003273.jpg 500 375 2 34 52 376 375 +11031 /data/VOCdevkit/VOC2012/JPEGImages/2009_003276.jpg 500 375 5 56 157 327 281 14 330 214 350 274 +11032 /data/VOCdevkit/VOC2012/JPEGImages/2009_003277.jpg 500 333 11 24 1 500 298 +11033 /data/VOCdevkit/VOC2012/JPEGImages/2009_003278.jpg 500 333 0 22 76 500 266 +11034 /data/VOCdevkit/VOC2012/JPEGImages/2009_003282.jpg 375 500 10 1 319 375 500 14 21 1 345 430 14 25 1 118 115 14 1 60 30 92 +11035 /data/VOCdevkit/VOC2012/JPEGImages/2009_003284.jpg 500 333 3 81 6 452 307 +11036 /data/VOCdevkit/VOC2012/JPEGImages/2009_003285.jpg 500 330 2 99 63 481 330 +11037 /data/VOCdevkit/VOC2012/JPEGImages/2009_003288.jpg 375 500 15 100 35 283 500 15 293 289 375 421 +11038 /data/VOCdevkit/VOC2012/JPEGImages/2009_003290.jpg 306 500 14 5 48 288 463 +11039 /data/VOCdevkit/VOC2012/JPEGImages/2009_003294.jpg 500 333 12 207 38 393 310 14 213 27 313 182 +11040 /data/VOCdevkit/VOC2012/JPEGImages/2009_003297.jpg 500 334 9 64 107 318 283 +11041 /data/VOCdevkit/VOC2012/JPEGImages/2009_003299.jpg 500 332 18 84 52 409 262 +11042 /data/VOCdevkit/VOC2012/JPEGImages/2009_003300.jpg 500 375 2 236 46 396 338 +11043 /data/VOCdevkit/VOC2012/JPEGImages/2009_003301.jpg 500 375 11 87 48 266 279 11 263 100 423 259 15 1 1 74 188 +11044 /data/VOCdevkit/VOC2012/JPEGImages/2009_003304.jpg 500 339 5 47 52 454 292 +11045 /data/VOCdevkit/VOC2012/JPEGImages/2009_003305.jpg 500 333 12 272 139 356 324 +11046 /data/VOCdevkit/VOC2012/JPEGImages/2009_003309.jpg 500 375 0 3 24 500 314 +11047 /data/VOCdevkit/VOC2012/JPEGImages/2009_003310.jpg 500 375 14 177 57 356 375 6 1 1 162 375 6 94 1 500 319 +11048 /data/VOCdevkit/VOC2012/JPEGImages/2009_003311.jpg 500 333 18 343 122 500 264 18 1 117 417 267 +11049 /data/VOCdevkit/VOC2012/JPEGImages/2009_003312.jpg 500 375 7 283 79 500 277 +11050 /data/VOCdevkit/VOC2012/JPEGImages/2009_003315.jpg 500 333 2 242 141 269 175 +11051 /data/VOCdevkit/VOC2012/JPEGImages/2009_003316.jpg 500 375 19 218 46 408 239 +11052 /data/VOCdevkit/VOC2012/JPEGImages/2009_003317.jpg 500 326 8 312 106 461 315 8 289 129 495 326 8 59 103 188 318 8 7 125 215 326 10 96 96 402 326 +11053 /data/VOCdevkit/VOC2012/JPEGImages/2009_003320.jpg 375 500 8 1 220 305 500 14 126 163 229 415 14 141 71 375 500 +11054 /data/VOCdevkit/VOC2012/JPEGImages/2009_003323.jpg 422 500 14 158 184 225 372 12 197 154 339 478 +11055 /data/VOCdevkit/VOC2012/JPEGImages/2009_003326.jpg 500 375 8 112 227 171 304 15 265 139 298 191 15 294 160 322 189 +11056 /data/VOCdevkit/VOC2012/JPEGImages/2009_003327.jpg 500 482 8 44 50 432 482 +11057 /data/VOCdevkit/VOC2012/JPEGImages/2009_003333.jpg 500 339 18 1 26 483 339 +11058 /data/VOCdevkit/VOC2012/JPEGImages/2009_003338.jpg 500 332 14 131 150 200 332 14 168 153 259 332 14 277 122 365 332 12 1 34 273 332 12 232 113 500 332 14 382 141 403 159 14 459 135 468 144 14 478 130 500 170 14 357 136 375 151 +11059 /data/VOCdevkit/VOC2012/JPEGImages/2009_003340.jpg 500 332 14 171 25 471 332 +11060 /data/VOCdevkit/VOC2012/JPEGImages/2009_003343.jpg 299 500 1 20 185 299 500 +11061 /data/VOCdevkit/VOC2012/JPEGImages/2009_003345.jpg 500 375 3 133 24 351 334 +11062 /data/VOCdevkit/VOC2012/JPEGImages/2009_003346.jpg 334 500 13 1 206 161 459 13 180 199 334 464 +11063 /data/VOCdevkit/VOC2012/JPEGImages/2009_003347.jpg 500 375 4 210 110 283 315 14 46 1 464 375 +11064 /data/VOCdevkit/VOC2012/JPEGImages/2009_003348.jpg 500 375 18 1 149 323 220 +11065 /data/VOCdevkit/VOC2012/JPEGImages/2009_003349.jpg 500 333 14 229 15 500 273 10 168 237 500 333 4 153 18 245 182 +11066 /data/VOCdevkit/VOC2012/JPEGImages/2009_003350.jpg 500 375 7 1 6 489 375 +11067 /data/VOCdevkit/VOC2012/JPEGImages/2009_003351.jpg 500 375 14 231 250 266 295 14 233 267 273 344 8 272 285 298 332 14 49 240 65 282 14 64 245 77 278 15 47 276 69 318 15 15 288 41 340 13 70 270 165 330 15 157 332 234 374 15 418 322 480 375 3 24 81 500 317 +11068 /data/VOCdevkit/VOC2012/JPEGImages/2009_003352.jpg 500 333 8 1 106 79 237 8 72 106 179 241 8 174 104 272 240 8 346 105 450 241 8 452 101 500 239 +11069 /data/VOCdevkit/VOC2012/JPEGImages/2009_003353.jpg 500 375 1 1 238 239 375 1 189 202 418 375 14 247 87 376 375 +11070 /data/VOCdevkit/VOC2012/JPEGImages/2009_003360.jpg 500 375 6 42 95 454 260 +11071 /data/VOCdevkit/VOC2012/JPEGImages/2009_003361.jpg 360 270 14 1 30 53 180 14 1 75 161 207 14 93 84 271 270 14 213 62 360 270 10 1 202 168 270 +11072 /data/VOCdevkit/VOC2012/JPEGImages/2009_003363.jpg 500 375 14 358 103 500 320 14 334 141 454 375 14 269 141 358 375 14 210 148 278 342 14 94 128 224 347 4 155 264 174 324 14 1 133 105 375 +11073 /data/VOCdevkit/VOC2012/JPEGImages/2009_003365.jpg 333 500 14 1 22 130 371 12 111 195 333 500 +11074 /data/VOCdevkit/VOC2012/JPEGImages/2009_003367.jpg 478 457 19 71 1 422 275 19 43 230 385 457 +11075 /data/VOCdevkit/VOC2012/JPEGImages/2009_003369.jpg 334 500 11 183 174 313 363 11 80 271 183 381 +11076 /data/VOCdevkit/VOC2012/JPEGImages/2009_003372.jpg 500 333 0 9 62 500 229 +11077 /data/VOCdevkit/VOC2012/JPEGImages/2009_003373.jpg 500 375 17 108 182 403 375 17 1 203 104 332 19 196 110 225 179 +11078 /data/VOCdevkit/VOC2012/JPEGImages/2009_003375.jpg 500 375 11 82 155 475 375 +11079 /data/VOCdevkit/VOC2012/JPEGImages/2009_003376.jpg 500 357 6 13 35 495 316 6 279 45 500 206 +11080 /data/VOCdevkit/VOC2012/JPEGImages/2009_003377.jpg 500 442 15 1 35 48 144 17 1 125 500 442 +11081 /data/VOCdevkit/VOC2012/JPEGImages/2009_003378.jpg 500 468 2 220 34 424 456 +11082 /data/VOCdevkit/VOC2012/JPEGImages/2009_003379.jpg 500 333 14 464 156 490 220 14 323 132 364 221 14 298 153 326 219 14 154 94 248 249 14 126 78 186 247 14 195 100 230 235 14 103 138 127 219 +11083 /data/VOCdevkit/VOC2012/JPEGImages/2009_003380.jpg 500 442 7 1 1 416 417 +11084 /data/VOCdevkit/VOC2012/JPEGImages/2009_003381.jpg 500 332 1 19 24 472 316 +11085 /data/VOCdevkit/VOC2012/JPEGImages/2009_003383.jpg 500 332 5 25 22 465 315 14 441 167 465 263 +11086 /data/VOCdevkit/VOC2012/JPEGImages/2009_003384.jpg 500 332 15 1 99 59 270 +11087 /data/VOCdevkit/VOC2012/JPEGImages/2009_003385.jpg 500 500 5 1 11 490 500 14 432 210 475 268 14 486 221 500 293 14 460 223 500 297 5 316 136 350 224 +11088 /data/VOCdevkit/VOC2012/JPEGImages/2009_003386.jpg 338 257 6 1 212 60 234 6 243 208 314 236 6 303 213 338 228 +11089 /data/VOCdevkit/VOC2012/JPEGImages/2009_003387.jpg 500 375 6 1 114 500 332 6 2 96 94 188 19 114 54 164 91 19 37 57 90 91 +11090 /data/VOCdevkit/VOC2012/JPEGImages/2009_003394.jpg 500 337 17 1 56 470 337 +11091 /data/VOCdevkit/VOC2012/JPEGImages/2009_003395.jpg 500 375 11 9 44 337 375 11 153 1 480 209 +11092 /data/VOCdevkit/VOC2012/JPEGImages/2009_003396.jpg 500 375 0 1 105 500 271 +11093 /data/VOCdevkit/VOC2012/JPEGImages/2009_003399.jpg 500 393 2 104 127 347 313 +11094 /data/VOCdevkit/VOC2012/JPEGImages/2009_003400.jpg 500 242 3 256 78 356 207 3 327 94 422 197 3 90 63 266 223 3 3 79 191 228 3 1 73 98 199 +11095 /data/VOCdevkit/VOC2012/JPEGImages/2009_003402.jpg 500 325 11 25 12 396 294 +11096 /data/VOCdevkit/VOC2012/JPEGImages/2009_003406.jpg 500 285 6 20 96 414 250 +11097 /data/VOCdevkit/VOC2012/JPEGImages/2009_003407.jpg 500 333 18 72 117 421 244 +11098 /data/VOCdevkit/VOC2012/JPEGImages/2009_003409.jpg 500 335 14 37 58 275 335 17 1 198 476 335 +11099 /data/VOCdevkit/VOC2012/JPEGImages/2009_003411.jpg 395 500 13 64 118 324 482 +11100 /data/VOCdevkit/VOC2012/JPEGImages/2009_003415.jpg 500 281 7 164 79 333 281 8 101 16 399 222 8 1 1 130 186 14 106 1 500 281 +11101 /data/VOCdevkit/VOC2012/JPEGImages/2009_003416.jpg 500 333 13 89 124 323 283 6 1 114 227 228 +11102 /data/VOCdevkit/VOC2012/JPEGImages/2009_003417.jpg 333 500 2 73 104 122 266 2 270 179 304 210 +11103 /data/VOCdevkit/VOC2012/JPEGImages/2009_003419.jpg 500 333 7 1 1 500 333 +11104 /data/VOCdevkit/VOC2012/JPEGImages/2009_003422.jpg 500 357 5 28 12 482 303 14 325 64 356 94 14 378 58 425 91 +11105 /data/VOCdevkit/VOC2012/JPEGImages/2009_003425.jpg 500 374 16 278 2 500 264 14 1 1 266 374 +11106 /data/VOCdevkit/VOC2012/JPEGImages/2009_003430.jpg 375 500 16 38 36 375 500 +11107 /data/VOCdevkit/VOC2012/JPEGImages/2009_003431.jpg 500 375 14 190 133 235 234 +11108 /data/VOCdevkit/VOC2012/JPEGImages/2009_003433.jpg 500 363 18 1 114 500 242 +11109 /data/VOCdevkit/VOC2012/JPEGImages/2009_003436.jpg 500 375 18 96 31 500 375 18 1 148 97 334 +11110 /data/VOCdevkit/VOC2012/JPEGImages/2009_003440.jpg 500 374 10 233 310 442 374 8 171 359 232 374 8 206 280 266 374 15 274 155 467 307 15 92 179 144 300 8 166 213 228 286 8 245 214 306 285 17 188 179 275 220 15 212 179 239 223 15 274 180 294 193 8 93 200 160 268 8 116 192 171 250 15 129 153 181 212 +11111 /data/VOCdevkit/VOC2012/JPEGImages/2009_003441.jpg 500 375 17 53 133 500 375 14 315 137 473 375 14 67 82 238 375 14 78 69 294 375 14 483 165 500 313 +11112 /data/VOCdevkit/VOC2012/JPEGImages/2009_003443.jpg 500 375 2 203 126 244 159 +11113 /data/VOCdevkit/VOC2012/JPEGImages/2009_003445.jpg 500 306 12 125 158 187 180 12 56 182 171 236 12 278 186 320 231 12 344 155 382 174 12 338 183 358 222 12 342 170 419 215 +11114 /data/VOCdevkit/VOC2012/JPEGImages/2009_003446.jpg 375 500 13 161 256 198 315 14 163 236 199 296 +11115 /data/VOCdevkit/VOC2012/JPEGImages/2009_003447.jpg 500 375 5 71 69 428 308 6 437 185 469 218 6 425 184 441 219 6 1 175 59 231 6 56 189 71 218 14 329 161 370 201 +11116 /data/VOCdevkit/VOC2012/JPEGImages/2009_003450.jpg 409 500 2 60 264 347 427 +11117 /data/VOCdevkit/VOC2012/JPEGImages/2009_003453.jpg 500 334 18 133 119 500 309 14 53 218 132 334 +11118 /data/VOCdevkit/VOC2012/JPEGImages/2009_003454.jpg 375 500 14 127 144 211 435 14 83 203 119 311 14 50 175 94 364 +11119 /data/VOCdevkit/VOC2012/JPEGImages/2009_003455.jpg 326 500 9 2 284 297 435 +11120 /data/VOCdevkit/VOC2012/JPEGImages/2009_003456.jpg 500 313 0 1 35 500 270 +11121 /data/VOCdevkit/VOC2012/JPEGImages/2009_003457.jpg 375 500 7 49 247 231 346 +11122 /data/VOCdevkit/VOC2012/JPEGImages/2009_003458.jpg 500 375 5 72 38 398 328 5 397 112 431 171 5 1 76 150 241 +11123 /data/VOCdevkit/VOC2012/JPEGImages/2009_003459.jpg 333 500 17 204 245 333 383 15 1 292 38 500 15 1 161 42 265 14 68 310 174 457 +11124 /data/VOCdevkit/VOC2012/JPEGImages/2009_003460.jpg 500 375 16 51 309 63 325 16 84 316 107 325 16 124 311 146 320 16 148 314 174 327 16 218 313 239 327 16 247 314 276 334 16 254 313 279 323 16 305 309 330 320 16 252 308 274 315 16 359 317 383 325 16 413 318 427 325 16 278 323 323 358 +11125 /data/VOCdevkit/VOC2012/JPEGImages/2009_003461.jpg 500 357 5 19 62 447 304 +11126 /data/VOCdevkit/VOC2012/JPEGImages/2009_003462.jpg 500 375 3 16 193 101 215 14 481 217 494 247 3 101 206 132 219 +11127 /data/VOCdevkit/VOC2012/JPEGImages/2009_003466.jpg 500 375 11 152 76 500 375 +11128 /data/VOCdevkit/VOC2012/JPEGImages/2009_003467.jpg 375 500 11 74 33 325 461 +11129 /data/VOCdevkit/VOC2012/JPEGImages/2009_003468.jpg 500 375 14 178 21 500 375 10 1 304 280 375 14 1 20 109 314 4 1 246 90 375 +11130 /data/VOCdevkit/VOC2012/JPEGImages/2009_003469.jpg 500 332 1 33 10 459 311 +11131 /data/VOCdevkit/VOC2012/JPEGImages/2009_003476.jpg 500 375 15 357 235 402 344 15 371 216 409 303 15 288 222 343 319 15 301 202 358 284 15 237 229 286 307 15 163 190 250 338 +11132 /data/VOCdevkit/VOC2012/JPEGImages/2009_003481.jpg 500 333 12 111 169 390 320 12 64 100 171 256 12 158 111 364 186 +11133 /data/VOCdevkit/VOC2012/JPEGImages/2009_003482.jpg 500 375 14 387 128 452 246 14 339 81 411 281 14 289 140 309 173 14 126 80 218 164 14 10 83 172 370 3 2 1 500 375 +11134 /data/VOCdevkit/VOC2012/JPEGImages/2009_003487.jpg 500 375 2 189 65 333 184 +11135 /data/VOCdevkit/VOC2012/JPEGImages/2009_003488.jpg 333 500 0 1 144 333 387 14 57 164 203 405 +11136 /data/VOCdevkit/VOC2012/JPEGImages/2009_003489.jpg 500 375 7 90 73 500 315 +11137 /data/VOCdevkit/VOC2012/JPEGImages/2009_003490.jpg 500 375 14 60 85 222 375 +11138 /data/VOCdevkit/VOC2012/JPEGImages/2009_003491.jpg 500 375 5 30 39 367 250 5 365 87 451 172 5 449 97 497 150 14 480 123 495 159 +11139 /data/VOCdevkit/VOC2012/JPEGImages/2009_003492.jpg 305 214 18 67 74 179 128 +11140 /data/VOCdevkit/VOC2012/JPEGImages/2009_003494.jpg 375 500 14 135 4 291 411 8 137 287 301 500 8 1 313 103 477 8 176 307 273 444 +11141 /data/VOCdevkit/VOC2012/JPEGImages/2009_003497.jpg 500 488 18 1 187 429 457 +11142 /data/VOCdevkit/VOC2012/JPEGImages/2009_003498.jpg 500 365 2 116 64 377 302 +11143 /data/VOCdevkit/VOC2012/JPEGImages/2009_003499.jpg 500 328 11 234 207 430 328 14 105 42 206 316 14 153 45 213 171 +11144 /data/VOCdevkit/VOC2012/JPEGImages/2009_003500.jpg 500 333 6 45 2 415 333 +11145 /data/VOCdevkit/VOC2012/JPEGImages/2009_003504.jpg 500 334 3 1 209 112 267 3 60 149 406 298 +11146 /data/VOCdevkit/VOC2012/JPEGImages/2009_003507.jpg 334 500 15 224 259 245 290 15 321 282 334 310 8 252 308 334 468 8 136 308 249 500 8 118 340 281 500 10 139 330 333 500 +11147 /data/VOCdevkit/VOC2012/JPEGImages/2009_003508.jpg 500 375 8 358 127 387 166 8 362 156 390 191 8 456 255 500 320 8 413 226 455 280 8 413 194 448 245 8 344 172 378 217 8 355 237 390 289 8 312 165 340 214 8 324 265 359 318 8 286 292 327 346 8 238 314 274 370 8 198 314 236 375 8 258 237 292 293 8 220 180 249 230 8 230 136 261 181 8 174 125 199 164 8 144 143 169 195 8 154 212 188 266 +11148 /data/VOCdevkit/VOC2012/JPEGImages/2009_003509.jpg 500 375 16 274 180 307 209 +11149 /data/VOCdevkit/VOC2012/JPEGImages/2009_003510.jpg 441 500 9 62 30 412 452 +11150 /data/VOCdevkit/VOC2012/JPEGImages/2009_003511.jpg 500 375 3 184 216 295 269 +11151 /data/VOCdevkit/VOC2012/JPEGImages/2009_003513.jpg 375 500 11 1 19 375 500 +11152 /data/VOCdevkit/VOC2012/JPEGImages/2009_003517.jpg 375 500 4 115 37 240 489 +11153 /data/VOCdevkit/VOC2012/JPEGImages/2009_003519.jpg 500 375 1 74 66 422 375 14 421 23 500 182 +11154 /data/VOCdevkit/VOC2012/JPEGImages/2009_003520.jpg 500 333 10 179 177 364 333 8 153 172 247 326 8 205 160 249 179 8 282 164 313 190 8 281 170 344 304 8 370 172 451 276 +11155 /data/VOCdevkit/VOC2012/JPEGImages/2009_003521.jpg 500 333 9 187 41 386 295 9 131 104 192 194 +11156 /data/VOCdevkit/VOC2012/JPEGImages/2009_003522.jpg 500 375 13 300 52 465 356 3 193 100 267 155 +11157 /data/VOCdevkit/VOC2012/JPEGImages/2009_003523.jpg 500 375 19 111 108 448 350 +11158 /data/VOCdevkit/VOC2012/JPEGImages/2009_003524.jpg 500 333 0 8 79 494 238 +11159 /data/VOCdevkit/VOC2012/JPEGImages/2009_003528.jpg 500 333 7 244 118 313 220 +11160 /data/VOCdevkit/VOC2012/JPEGImages/2009_003530.jpg 500 375 12 71 52 371 299 14 1 70 66 304 +11161 /data/VOCdevkit/VOC2012/JPEGImages/2009_003531.jpg 500 375 2 1 57 483 375 +11162 /data/VOCdevkit/VOC2012/JPEGImages/2009_003533.jpg 500 400 12 61 37 425 354 +11163 /data/VOCdevkit/VOC2012/JPEGImages/2009_003534.jpg 500 375 18 62 53 440 282 18 2 62 101 263 14 419 137 440 202 14 471 142 493 211 14 450 140 473 201 +11164 /data/VOCdevkit/VOC2012/JPEGImages/2009_003537.jpg 500 375 19 47 111 195 244 +11165 /data/VOCdevkit/VOC2012/JPEGImages/2009_003538.jpg 500 375 11 243 13 500 303 11 1 95 500 375 +11166 /data/VOCdevkit/VOC2012/JPEGImages/2009_003539.jpg 500 414 13 112 48 386 392 +11167 /data/VOCdevkit/VOC2012/JPEGImages/2009_003540.jpg 500 334 14 248 72 472 334 14 44 137 201 334 +11168 /data/VOCdevkit/VOC2012/JPEGImages/2009_003541.jpg 494 500 16 35 47 439 492 7 282 1 430 116 +11169 /data/VOCdevkit/VOC2012/JPEGImages/2009_003542.jpg 500 333 9 189 36 500 333 +11170 /data/VOCdevkit/VOC2012/JPEGImages/2009_003543.jpg 500 346 18 12 125 480 247 +11171 /data/VOCdevkit/VOC2012/JPEGImages/2009_003544.jpg 334 500 8 78 130 258 440 +11172 /data/VOCdevkit/VOC2012/JPEGImages/2009_003545.jpg 500 375 10 126 198 500 375 8 356 274 500 375 8 136 228 303 375 8 156 186 237 222 8 247 177 311 216 8 425 185 500 230 17 432 164 500 198 +11173 /data/VOCdevkit/VOC2012/JPEGImages/2009_003546.jpg 500 333 0 14 92 488 199 0 473 173 500 214 +11174 /data/VOCdevkit/VOC2012/JPEGImages/2009_003549.jpg 500 284 6 45 50 469 238 +11175 /data/VOCdevkit/VOC2012/JPEGImages/2009_003551.jpg 500 500 19 187 155 481 439 19 1 1 166 500 +11176 /data/VOCdevkit/VOC2012/JPEGImages/2009_003554.jpg 500 333 19 134 122 216 202 8 386 166 470 253 +11177 /data/VOCdevkit/VOC2012/JPEGImages/2009_003555.jpg 500 338 5 82 38 301 279 +11178 /data/VOCdevkit/VOC2012/JPEGImages/2009_003560.jpg 500 375 6 264 150 305 178 13 271 172 290 202 13 273 159 291 183 13 213 258 244 294 13 200 238 227 266 +11179 /data/VOCdevkit/VOC2012/JPEGImages/2009_003562.jpg 332 500 4 52 5 258 486 +11180 /data/VOCdevkit/VOC2012/JPEGImages/2009_003563.jpg 333 500 14 21 186 166 500 14 103 59 197 260 14 197 110 333 500 +11181 /data/VOCdevkit/VOC2012/JPEGImages/2009_003564.jpg 500 375 17 1 196 315 375 15 301 126 433 246 +11182 /data/VOCdevkit/VOC2012/JPEGImages/2009_003565.jpg 500 375 12 39 99 353 345 +11183 /data/VOCdevkit/VOC2012/JPEGImages/2009_003566.jpg 500 388 5 73 139 407 298 6 23 197 56 207 +11184 /data/VOCdevkit/VOC2012/JPEGImages/2009_003569.jpg 500 375 9 198 182 364 295 9 107 181 163 280 9 192 164 318 272 9 143 176 208 258 +11185 /data/VOCdevkit/VOC2012/JPEGImages/2009_003571.jpg 500 333 0 9 85 490 214 +11186 /data/VOCdevkit/VOC2012/JPEGImages/2009_003572.jpg 500 332 12 185 82 385 288 +11187 /data/VOCdevkit/VOC2012/JPEGImages/2009_003576.jpg 500 334 13 134 108 231 299 14 228 126 389 334 +11188 /data/VOCdevkit/VOC2012/JPEGImages/2009_003577.jpg 500 375 10 1 231 429 375 14 91 62 261 257 14 263 72 457 314 8 79 149 273 242 8 394 166 461 375 8 459 142 500 194 14 432 60 500 169 14 454 94 500 169 14 369 98 390 118 14 344 89 361 130 10 364 131 395 163 10 397 125 410 159 10 402 119 415 148 +11189 /data/VOCdevkit/VOC2012/JPEGImages/2009_003581.jpg 337 500 17 1 237 311 472 14 65 138 280 500 +11190 /data/VOCdevkit/VOC2012/JPEGImages/2009_003583.jpg 500 375 18 147 101 309 263 +11191 /data/VOCdevkit/VOC2012/JPEGImages/2009_003588.jpg 391 500 4 1 1 195 500 4 232 158 391 500 +11192 /data/VOCdevkit/VOC2012/JPEGImages/2009_003589.jpg 500 375 6 31 92 469 312 +11193 /data/VOCdevkit/VOC2012/JPEGImages/2009_003592.jpg 500 375 5 5 126 466 288 6 468 206 500 239 14 63 187 87 206 +11194 /data/VOCdevkit/VOC2012/JPEGImages/2009_003594.jpg 375 500 14 1 73 375 500 14 147 243 275 500 14 1 407 53 500 14 90 346 155 476 +11195 /data/VOCdevkit/VOC2012/JPEGImages/2009_003598.jpg 500 333 13 34 44 474 300 14 148 42 320 199 +11196 /data/VOCdevkit/VOC2012/JPEGImages/2009_003600.jpg 500 338 3 115 27 499 337 3 79 46 192 164 6 31 38 54 60 +11197 /data/VOCdevkit/VOC2012/JPEGImages/2009_003601.jpg 500 333 7 1 1 453 313 +11198 /data/VOCdevkit/VOC2012/JPEGImages/2009_003605.jpg 500 332 7 120 36 500 332 17 1 1 500 332 +11199 /data/VOCdevkit/VOC2012/JPEGImages/2009_003606.jpg 500 353 2 247 18 437 292 +11200 /data/VOCdevkit/VOC2012/JPEGImages/2009_003607.jpg 500 375 17 194 149 500 375 17 1 77 285 297 +11201 /data/VOCdevkit/VOC2012/JPEGImages/2009_003608.jpg 500 317 0 134 74 460 224 +11202 /data/VOCdevkit/VOC2012/JPEGImages/2009_003609.jpg 334 500 14 1 1 334 500 4 253 277 334 500 +11203 /data/VOCdevkit/VOC2012/JPEGImages/2009_003612.jpg 500 375 11 35 20 500 375 +11204 /data/VOCdevkit/VOC2012/JPEGImages/2009_003613.jpg 500 375 17 60 289 228 360 +11205 /data/VOCdevkit/VOC2012/JPEGImages/2009_003614.jpg 500 375 5 54 115 411 298 14 423 204 447 289 +11206 /data/VOCdevkit/VOC2012/JPEGImages/2009_003618.jpg 375 500 16 13 198 248 467 16 114 112 315 329 +11207 /data/VOCdevkit/VOC2012/JPEGImages/2009_003624.jpg 500 375 16 428 12 492 90 16 141 34 237 126 16 1 65 195 375 16 21 62 448 375 +11208 /data/VOCdevkit/VOC2012/JPEGImages/2009_003626.jpg 334 500 7 16 106 292 500 +11209 /data/VOCdevkit/VOC2012/JPEGImages/2009_003627.jpg 500 360 11 120 65 420 351 14 146 1 402 324 +11210 /data/VOCdevkit/VOC2012/JPEGImages/2009_003629.jpg 500 333 4 40 1 314 333 4 306 1 492 333 +11211 /data/VOCdevkit/VOC2012/JPEGImages/2009_003633.jpg 500 375 6 393 84 500 136 14 294 61 421 375 14 88 88 229 281 +11212 /data/VOCdevkit/VOC2012/JPEGImages/2009_003634.jpg 500 375 9 84 179 384 300 +11213 /data/VOCdevkit/VOC2012/JPEGImages/2009_003635.jpg 500 333 0 9 59 496 274 +11214 /data/VOCdevkit/VOC2012/JPEGImages/2009_003636.jpg 500 375 5 73 36 425 342 14 301 99 365 142 6 67 168 82 200 14 1 158 12 208 +11215 /data/VOCdevkit/VOC2012/JPEGImages/2009_003637.jpg 375 500 12 92 11 248 381 14 104 33 283 273 +11216 /data/VOCdevkit/VOC2012/JPEGImages/2009_003638.jpg 500 334 18 26 92 455 237 +11217 /data/VOCdevkit/VOC2012/JPEGImages/2009_003639.jpg 375 500 13 1 1 375 500 +11218 /data/VOCdevkit/VOC2012/JPEGImages/2009_003640.jpg 500 388 2 91 96 360 315 +11219 /data/VOCdevkit/VOC2012/JPEGImages/2009_003642.jpg 375 500 17 159 241 375 356 15 181 324 270 383 17 1 246 137 425 +11220 /data/VOCdevkit/VOC2012/JPEGImages/2009_003644.jpg 500 375 1 28 1 500 375 +11221 /data/VOCdevkit/VOC2012/JPEGImages/2009_003646.jpg 500 375 19 109 119 313 292 19 17 139 108 230 17 45 278 376 375 14 291 45 431 375 17 1 224 104 375 14 320 1 500 281 1 274 220 358 338 1 335 337 500 375 +11222 /data/VOCdevkit/VOC2012/JPEGImages/2009_003647.jpg 500 334 7 92 22 500 332 +11223 /data/VOCdevkit/VOC2012/JPEGImages/2009_003650.jpg 500 375 18 49 147 500 304 14 413 182 435 207 14 486 170 500 241 +11224 /data/VOCdevkit/VOC2012/JPEGImages/2009_003652.jpg 500 331 3 231 133 459 281 3 193 225 232 243 +11225 /data/VOCdevkit/VOC2012/JPEGImages/2009_003654.jpg 500 375 10 1 31 293 372 7 166 85 377 221 8 159 1 475 375 8 283 1 489 352 8 1 158 67 291 15 144 110 219 204 15 444 96 465 132 15 466 107 490 147 +11226 /data/VOCdevkit/VOC2012/JPEGImages/2009_003655.jpg 327 500 7 31 91 327 500 +11227 /data/VOCdevkit/VOC2012/JPEGImages/2009_003656.jpg 500 375 17 246 58 362 109 14 92 304 183 375 14 312 336 362 375 14 441 296 478 375 14 474 277 500 375 14 140 316 161 344 +11228 /data/VOCdevkit/VOC2012/JPEGImages/2009_003657.jpg 500 375 6 26 36 74 74 6 65 40 82 69 +11229 /data/VOCdevkit/VOC2012/JPEGImages/2009_003660.jpg 500 375 7 1 97 225 375 7 177 110 448 359 7 171 4 372 117 +11230 /data/VOCdevkit/VOC2012/JPEGImages/2009_003663.jpg 500 375 7 1 34 376 375 +11231 /data/VOCdevkit/VOC2012/JPEGImages/2009_003664.jpg 500 375 4 314 210 363 342 +11232 /data/VOCdevkit/VOC2012/JPEGImages/2009_003666.jpg 500 375 16 408 133 500 287 16 237 139 326 305 16 83 125 227 294 16 1 101 136 243 16 278 114 363 189 +11233 /data/VOCdevkit/VOC2012/JPEGImages/2009_003667.jpg 500 334 0 23 43 491 298 +11234 /data/VOCdevkit/VOC2012/JPEGImages/2009_003668.jpg 333 500 14 67 31 280 482 8 68 149 314 490 +11235 /data/VOCdevkit/VOC2012/JPEGImages/2009_003669.jpg 500 375 5 116 157 270 313 5 269 193 425 303 5 334 222 500 316 14 24 250 79 361 14 100 259 113 291 +11236 /data/VOCdevkit/VOC2012/JPEGImages/2009_003671.jpg 500 312 17 8 90 281 268 8 312 199 500 312 8 411 114 500 221 15 418 72 441 98 17 94 85 208 149 +11237 /data/VOCdevkit/VOC2012/JPEGImages/2009_003677.jpg 375 500 11 134 238 227 405 8 77 161 313 500 2 243 293 261 318 15 1 115 80 320 +11238 /data/VOCdevkit/VOC2012/JPEGImages/2009_003679.jpg 375 500 15 26 54 375 466 +11239 /data/VOCdevkit/VOC2012/JPEGImages/2009_003683.jpg 500 375 14 2 119 194 375 14 202 79 358 375 14 400 89 500 375 +11240 /data/VOCdevkit/VOC2012/JPEGImages/2009_003685.jpg 369 500 2 75 49 296 473 +11241 /data/VOCdevkit/VOC2012/JPEGImages/2009_003686.jpg 335 500 12 1 50 297 500 +11242 /data/VOCdevkit/VOC2012/JPEGImages/2009_003688.jpg 500 375 18 44 201 119 236 18 163 201 234 219 +11243 /data/VOCdevkit/VOC2012/JPEGImages/2009_003689.jpg 332 500 14 184 262 294 500 +11244 /data/VOCdevkit/VOC2012/JPEGImages/2009_003690.jpg 500 400 10 1 79 500 400 14 206 1 414 92 +11245 /data/VOCdevkit/VOC2012/JPEGImages/2009_003694.jpg 375 500 8 47 38 286 434 +11246 /data/VOCdevkit/VOC2012/JPEGImages/2009_003695.jpg 500 375 8 340 256 464 375 19 383 214 444 281 17 79 164 366 294 +11247 /data/VOCdevkit/VOC2012/JPEGImages/2009_003696.jpg 500 333 0 13 49 500 224 +11248 /data/VOCdevkit/VOC2012/JPEGImages/2009_003697.jpg 333 500 7 1 203 124 397 15 1 2 264 364 +11249 /data/VOCdevkit/VOC2012/JPEGImages/2009_003698.jpg 500 375 7 157 11 500 375 +11250 /data/VOCdevkit/VOC2012/JPEGImages/2009_003702.jpg 500 375 14 14 77 437 375 +11251 /data/VOCdevkit/VOC2012/JPEGImages/2009_003703.jpg 500 375 5 75 80 496 324 5 37 133 117 278 +11252 /data/VOCdevkit/VOC2012/JPEGImages/2009_003704.jpg 500 377 0 50 100 473 229 +11253 /data/VOCdevkit/VOC2012/JPEGImages/2009_003705.jpg 500 333 0 1 18 375 237 14 77 174 97 230 14 144 174 171 234 14 255 184 269 216 14 301 145 360 333 14 366 160 419 333 +11254 /data/VOCdevkit/VOC2012/JPEGImages/2009_003707.jpg 500 333 3 1 187 116 252 +11255 /data/VOCdevkit/VOC2012/JPEGImages/2009_003708.jpg 500 375 11 35 1 500 375 +11256 /data/VOCdevkit/VOC2012/JPEGImages/2009_003709.jpg 500 336 6 1 88 493 254 +11257 /data/VOCdevkit/VOC2012/JPEGImages/2009_003710.jpg 500 375 5 64 39 373 310 14 220 187 253 228 14 301 192 321 232 14 373 202 393 302 14 392 209 418 309 14 414 211 445 313 14 448 200 472 309 14 466 210 497 250 +11258 /data/VOCdevkit/VOC2012/JPEGImages/2009_003711.jpg 333 500 17 36 1 333 328 11 80 258 312 375 +11259 /data/VOCdevkit/VOC2012/JPEGImages/2009_003713.jpg 500 375 2 177 104 355 247 +11260 /data/VOCdevkit/VOC2012/JPEGImages/2009_003714.jpg 333 500 11 95 12 323 232 +11261 /data/VOCdevkit/VOC2012/JPEGImages/2009_003717.jpg 500 421 11 233 148 381 421 11 61 32 165 209 +11262 /data/VOCdevkit/VOC2012/JPEGImages/2009_003718.jpg 500 387 7 2 1 319 347 7 93 5 485 375 +11263 /data/VOCdevkit/VOC2012/JPEGImages/2009_003720.jpg 500 333 19 283 96 357 177 14 274 86 447 321 4 186 214 232 333 8 25 187 180 303 14 42 85 172 303 +11264 /data/VOCdevkit/VOC2012/JPEGImages/2009_003722.jpg 500 375 14 215 46 376 363 13 33 71 458 340 8 280 41 303 70 6 1 1 292 181 +11265 /data/VOCdevkit/VOC2012/JPEGImages/2009_003725.jpg 500 333 12 396 191 436 288 12 335 206 388 288 14 385 142 435 193 14 336 158 382 205 14 183 254 211 293 14 89 242 120 295 14 33 246 64 297 6 130 262 266 293 6 241 255 387 290 6 368 240 469 289 +11266 /data/VOCdevkit/VOC2012/JPEGImages/2009_003726.jpg 500 375 8 1 282 13 316 8 7 280 30 315 8 26 281 46 314 +11267 /data/VOCdevkit/VOC2012/JPEGImages/2009_003732.jpg 500 333 3 272 166 353 182 3 400 168 462 185 3 217 166 271 183 3 128 161 220 195 +11268 /data/VOCdevkit/VOC2012/JPEGImages/2009_003734.jpg 500 375 12 221 143 397 256 14 260 86 334 200 +11269 /data/VOCdevkit/VOC2012/JPEGImages/2009_003735.jpg 500 334 11 98 127 217 300 +11270 /data/VOCdevkit/VOC2012/JPEGImages/2009_003736.jpg 500 375 14 304 64 470 375 +11271 /data/VOCdevkit/VOC2012/JPEGImages/2009_003738.jpg 500 375 14 1 5 273 375 14 253 51 500 364 +11272 /data/VOCdevkit/VOC2012/JPEGImages/2009_003739.jpg 500 332 14 393 85 500 301 14 154 76 214 246 12 75 169 322 303 +11273 /data/VOCdevkit/VOC2012/JPEGImages/2009_003743.jpg 500 375 13 35 96 474 345 6 2 65 148 295 6 152 72 354 285 6 435 88 500 249 6 413 133 440 148 +11274 /data/VOCdevkit/VOC2012/JPEGImages/2009_003747.jpg 500 375 13 1 1 500 375 +11275 /data/VOCdevkit/VOC2012/JPEGImages/2009_003751.jpg 500 333 14 53 78 174 333 14 111 133 284 333 14 225 70 364 333 14 315 32 500 333 +11276 /data/VOCdevkit/VOC2012/JPEGImages/2009_003752.jpg 348 500 14 47 108 69 187 14 31 112 49 183 14 323 111 346 198 8 53 191 193 416 8 66 187 161 329 8 76 182 146 235 10 124 187 348 493 15 305 171 319 197 +11277 /data/VOCdevkit/VOC2012/JPEGImages/2009_003753.jpg 500 375 19 1 104 426 375 14 193 123 395 346 +11278 /data/VOCdevkit/VOC2012/JPEGImages/2009_003756.jpg 500 375 11 1 1 307 360 +11279 /data/VOCdevkit/VOC2012/JPEGImages/2009_003757.jpg 500 333 5 25 116 97 222 5 95 112 176 226 5 117 108 235 240 5 285 27 465 277 5 270 90 284 239 5 259 165 269 226 5 176 118 242 228 +11280 /data/VOCdevkit/VOC2012/JPEGImages/2009_003758.jpg 500 363 18 68 179 221 293 18 419 210 459 253 +11281 /data/VOCdevkit/VOC2012/JPEGImages/2009_003759.jpg 500 331 10 113 182 279 322 8 91 181 131 289 8 119 195 199 316 8 180 208 270 331 8 225 180 289 294 8 219 172 253 206 8 125 163 171 188 +11282 /data/VOCdevkit/VOC2012/JPEGImages/2009_003760.jpg 500 333 0 36 89 470 249 +11283 /data/VOCdevkit/VOC2012/JPEGImages/2009_003765.jpg 500 375 18 201 143 398 228 +11284 /data/VOCdevkit/VOC2012/JPEGImages/2009_003768.jpg 355 500 12 20 158 324 426 14 143 84 236 324 +11285 /data/VOCdevkit/VOC2012/JPEGImages/2009_003771.jpg 333 500 7 100 112 275 478 +11286 /data/VOCdevkit/VOC2012/JPEGImages/2009_003773.jpg 500 334 9 151 4 500 334 +11287 /data/VOCdevkit/VOC2012/JPEGImages/2009_003775.jpg 500 470 12 1 81 454 470 +11288 /data/VOCdevkit/VOC2012/JPEGImages/2009_003776.jpg 500 334 18 2 2 98 39 14 86 1 194 162 14 334 1 422 134 +11289 /data/VOCdevkit/VOC2012/JPEGImages/2009_003781.jpg 500 333 5 75 79 380 269 6 378 170 429 196 6 429 170 500 200 +11290 /data/VOCdevkit/VOC2012/JPEGImages/2009_003783.jpg 375 500 7 1 1 375 500 +11291 /data/VOCdevkit/VOC2012/JPEGImages/2009_003784.jpg 500 412 16 2 26 474 412 +11292 /data/VOCdevkit/VOC2012/JPEGImages/2009_003785.jpg 500 375 17 1 140 377 375 14 1 98 323 338 +11293 /data/VOCdevkit/VOC2012/JPEGImages/2009_003786.jpg 500 333 11 172 161 252 258 11 1 145 151 191 +11294 /data/VOCdevkit/VOC2012/JPEGImages/2009_003790.jpg 500 375 18 1 128 389 304 18 241 144 472 293 +11295 /data/VOCdevkit/VOC2012/JPEGImages/2009_003793.jpg 500 375 4 126 174 184 286 +11296 /data/VOCdevkit/VOC2012/JPEGImages/2009_003795.jpg 500 375 14 390 36 458 144 14 398 138 481 274 14 426 173 500 375 14 339 119 417 237 14 248 134 344 233 14 159 132 299 324 14 64 127 199 282 4 156 222 179 304 4 386 247 409 345 10 250 230 451 375 10 84 246 315 375 17 26 146 300 296 +11297 /data/VOCdevkit/VOC2012/JPEGImages/2009_003799.jpg 500 334 0 14 84 500 234 +11298 /data/VOCdevkit/VOC2012/JPEGImages/2009_003800.jpg 500 334 14 348 101 421 230 14 89 101 150 232 +11299 /data/VOCdevkit/VOC2012/JPEGImages/2009_003801.jpg 500 333 6 27 20 465 322 6 1 98 138 252 6 262 44 500 182 +11300 /data/VOCdevkit/VOC2012/JPEGImages/2009_003802.jpg 500 375 13 83 17 334 357 6 401 57 500 375 1 87 7 193 87 +11301 /data/VOCdevkit/VOC2012/JPEGImages/2009_003804.jpg 375 500 12 125 96 335 442 +11302 /data/VOCdevkit/VOC2012/JPEGImages/2009_003805.jpg 500 375 0 113 153 374 228 +11303 /data/VOCdevkit/VOC2012/JPEGImages/2009_003806.jpg 500 333 0 29 86 486 214 +11304 /data/VOCdevkit/VOC2012/JPEGImages/2009_003808.jpg 500 375 9 267 227 305 303 +11305 /data/VOCdevkit/VOC2012/JPEGImages/2009_003810.jpg 500 375 11 77 84 488 346 +11306 /data/VOCdevkit/VOC2012/JPEGImages/2009_003813.jpg 368 500 8 39 50 324 456 +11307 /data/VOCdevkit/VOC2012/JPEGImages/2009_003814.jpg 500 352 6 49 37 428 223 +11308 /data/VOCdevkit/VOC2012/JPEGImages/2009_003815.jpg 500 374 15 13 1 500 374 +11309 /data/VOCdevkit/VOC2012/JPEGImages/2009_003816.jpg 500 375 11 294 69 439 275 11 113 32 265 272 14 1 1 105 269 +11310 /data/VOCdevkit/VOC2012/JPEGImages/2009_003818.jpg 500 375 4 172 1 325 375 10 14 314 500 375 8 320 219 390 326 +11311 /data/VOCdevkit/VOC2012/JPEGImages/2009_003819.jpg 500 375 17 157 213 490 375 15 111 246 149 287 15 215 185 228 204 15 136 177 150 191 15 171 182 184 206 15 99 185 120 204 +11312 /data/VOCdevkit/VOC2012/JPEGImages/2009_003820.jpg 500 379 13 40 27 448 368 +11313 /data/VOCdevkit/VOC2012/JPEGImages/2009_003821.jpg 330 500 18 1 193 211 375 5 223 286 246 308 14 184 293 194 312 +11314 /data/VOCdevkit/VOC2012/JPEGImages/2009_003822.jpg 500 408 12 8 7 457 400 6 465 93 500 144 +11315 /data/VOCdevkit/VOC2012/JPEGImages/2009_003825.jpg 500 333 9 27 115 191 315 9 179 114 323 333 9 279 71 459 333 9 411 248 500 310 +11316 /data/VOCdevkit/VOC2012/JPEGImages/2009_003827.jpg 500 333 11 240 84 412 180 +11317 /data/VOCdevkit/VOC2012/JPEGImages/2009_003829.jpg 500 334 14 47 122 223 334 14 255 106 356 293 +11318 /data/VOCdevkit/VOC2012/JPEGImages/2009_003832.jpg 500 333 1 71 1 417 333 +11319 /data/VOCdevkit/VOC2012/JPEGImages/2009_003835.jpg 500 375 8 320 213 396 316 8 248 201 313 304 10 252 205 429 303 17 178 178 347 278 +11320 /data/VOCdevkit/VOC2012/JPEGImages/2009_003836.jpg 375 500 1 79 77 275 436 15 325 173 370 241 +11321 /data/VOCdevkit/VOC2012/JPEGImages/2009_003837.jpg 500 333 2 115 62 402 220 +11322 /data/VOCdevkit/VOC2012/JPEGImages/2009_003838.jpg 500 334 6 342 243 377 276 6 322 266 364 299 6 1 261 25 296 6 403 314 500 334 +11323 /data/VOCdevkit/VOC2012/JPEGImages/2009_003840.jpg 500 375 14 9 185 201 375 14 162 187 264 349 8 56 322 213 375 10 2 267 214 375 8 204 244 296 375 8 20 232 94 277 +11324 /data/VOCdevkit/VOC2012/JPEGImages/2009_003843.jpg 500 333 17 39 21 463 325 +11325 /data/VOCdevkit/VOC2012/JPEGImages/2009_003846.jpg 500 375 13 28 65 500 317 14 458 56 500 219 14 432 116 457 176 14 1 100 56 174 +11326 /data/VOCdevkit/VOC2012/JPEGImages/2009_003847.jpg 500 370 7 112 36 500 370 +11327 /data/VOCdevkit/VOC2012/JPEGImages/2009_003848.jpg 500 407 17 6 4 493 217 17 76 208 426 405 +11328 /data/VOCdevkit/VOC2012/JPEGImages/2009_003849.jpg 500 375 14 125 63 354 375 8 355 191 498 375 10 338 181 437 267 +11329 /data/VOCdevkit/VOC2012/JPEGImages/2009_003852.jpg 500 333 19 207 70 381 217 +11330 /data/VOCdevkit/VOC2012/JPEGImages/2009_003855.jpg 500 333 12 311 33 500 333 14 202 128 291 333 12 1 28 200 333 +11331 /data/VOCdevkit/VOC2012/JPEGImages/2009_003857.jpg 500 375 19 136 82 282 187 +11332 /data/VOCdevkit/VOC2012/JPEGImages/2009_003858.jpg 500 367 2 135 87 318 261 +11333 /data/VOCdevkit/VOC2012/JPEGImages/2009_003860.jpg 500 375 1 1 1 500 375 +11334 /data/VOCdevkit/VOC2012/JPEGImages/2009_003863.jpg 500 333 18 1 142 470 210 +11335 /data/VOCdevkit/VOC2012/JPEGImages/2009_003865.jpg 500 375 4 271 164 418 251 +11336 /data/VOCdevkit/VOC2012/JPEGImages/2009_003867.jpg 500 345 7 1 1 375 345 +11337 /data/VOCdevkit/VOC2012/JPEGImages/2009_003870.jpg 434 500 2 152 120 284 474 +11338 /data/VOCdevkit/VOC2012/JPEGImages/2009_003873.jpg 370 500 13 1 76 75 312 13 24 18 365 497 +11339 /data/VOCdevkit/VOC2012/JPEGImages/2009_003874.jpg 386 500 14 1 30 386 500 +11340 /data/VOCdevkit/VOC2012/JPEGImages/2009_003879.jpg 500 333 6 1 1 162 60 11 195 122 449 333 +11341 /data/VOCdevkit/VOC2012/JPEGImages/2009_003883.jpg 500 375 0 5 136 459 266 +11342 /data/VOCdevkit/VOC2012/JPEGImages/2009_003884.jpg 375 500 8 89 197 303 488 8 1 171 127 381 8 127 156 219 272 8 119 148 189 239 10 3 142 155 282 +11343 /data/VOCdevkit/VOC2012/JPEGImages/2009_003888.jpg 500 375 10 189 199 379 375 14 447 153 500 335 14 239 94 379 375 8 236 162 418 375 14 1 90 253 375 15 209 1 268 114 4 91 37 121 136 4 71 55 100 139 4 26 61 52 148 4 17 27 49 105 4 64 54 73 83 4 64 36 78 77 4 75 34 90 72 4 100 29 124 120 +11344 /data/VOCdevkit/VOC2012/JPEGImages/2009_003892.jpg 375 500 18 1 1 375 498 14 2 84 161 500 14 78 108 258 500 14 244 52 375 500 +11345 /data/VOCdevkit/VOC2012/JPEGImages/2009_003895.jpg 500 375 19 8 111 163 255 19 157 115 336 289 19 151 1 264 38 17 364 36 500 149 14 128 149 138 169 14 119 151 134 171 8 1 63 115 131 +11346 /data/VOCdevkit/VOC2012/JPEGImages/2009_003896.jpg 375 500 0 130 216 242 296 14 229 275 345 500 14 38 284 138 500 +11347 /data/VOCdevkit/VOC2012/JPEGImages/2009_003897.jpg 500 375 14 234 30 415 375 12 61 114 500 375 +11348 /data/VOCdevkit/VOC2012/JPEGImages/2009_003899.jpg 500 375 4 84 31 208 372 +11349 /data/VOCdevkit/VOC2012/JPEGImages/2009_003900.jpg 270 360 14 130 141 176 284 +11350 /data/VOCdevkit/VOC2012/JPEGImages/2009_003901.jpg 500 375 9 1 48 317 339 +11351 /data/VOCdevkit/VOC2012/JPEGImages/2009_003902.jpg 500 333 11 1 1 294 293 +11352 /data/VOCdevkit/VOC2012/JPEGImages/2009_003903.jpg 500 362 12 7 185 36 217 12 77 135 427 356 +11353 /data/VOCdevkit/VOC2012/JPEGImages/2009_003904.jpg 333 500 7 9 180 324 436 +11354 /data/VOCdevkit/VOC2012/JPEGImages/2009_003905.jpg 333 500 1 32 37 333 439 6 249 126 333 178 6 129 159 153 171 15 190 266 256 330 +11355 /data/VOCdevkit/VOC2012/JPEGImages/2009_003908.jpg 500 375 1 1 1 414 375 14 338 1 500 246 +11356 /data/VOCdevkit/VOC2012/JPEGImages/2009_003911.jpg 500 416 2 117 169 181 278 2 317 151 376 171 2 443 120 465 154 +11357 /data/VOCdevkit/VOC2012/JPEGImages/2009_003912.jpg 500 330 2 105 94 500 225 +11358 /data/VOCdevkit/VOC2012/JPEGImages/2009_003913.jpg 500 333 11 27 83 461 312 +11359 /data/VOCdevkit/VOC2012/JPEGImages/2009_003914.jpg 500 375 10 1 1 500 375 4 5 1 123 162 +11360 /data/VOCdevkit/VOC2012/JPEGImages/2009_003916.jpg 500 375 5 10 28 488 326 +11361 /data/VOCdevkit/VOC2012/JPEGImages/2009_003920.jpg 500 333 19 71 1 266 177 8 1 33 500 333 14 76 130 313 333 +11362 /data/VOCdevkit/VOC2012/JPEGImages/2009_003921.jpg 375 500 7 110 132 375 470 14 143 1 317 192 +11363 /data/VOCdevkit/VOC2012/JPEGImages/2009_003922.jpg 500 338 2 211 81 367 208 +11364 /data/VOCdevkit/VOC2012/JPEGImages/2009_003928.jpg 394 500 11 119 213 327 410 +11365 /data/VOCdevkit/VOC2012/JPEGImages/2009_003929.jpg 334 500 15 1 1 334 500 +11366 /data/VOCdevkit/VOC2012/JPEGImages/2009_003933.jpg 362 500 9 7 73 355 442 +11367 /data/VOCdevkit/VOC2012/JPEGImages/2009_003936.jpg 500 375 3 149 133 309 252 14 227 152 249 184 +11368 /data/VOCdevkit/VOC2012/JPEGImages/2009_003938.jpg 500 367 18 79 71 500 230 +11369 /data/VOCdevkit/VOC2012/JPEGImages/2009_003942.jpg 500 335 18 43 211 331 275 +11370 /data/VOCdevkit/VOC2012/JPEGImages/2009_003944.jpg 500 375 13 1 1 500 375 +11371 /data/VOCdevkit/VOC2012/JPEGImages/2009_003947.jpg 500 337 0 13 110 497 225 +11372 /data/VOCdevkit/VOC2012/JPEGImages/2009_003950.jpg 500 333 0 14 110 495 224 14 303 203 315 223 +11373 /data/VOCdevkit/VOC2012/JPEGImages/2009_003951.jpg 500 333 18 106 89 426 247 14 100 141 113 171 14 1 147 25 181 +11374 /data/VOCdevkit/VOC2012/JPEGImages/2009_003955.jpg 500 375 7 1 1 500 375 +11375 /data/VOCdevkit/VOC2012/JPEGImages/2009_003956.jpg 500 375 9 7 135 51 202 9 57 153 79 198 9 70 150 91 184 9 87 153 119 211 9 186 135 407 331 9 135 144 197 233 +11376 /data/VOCdevkit/VOC2012/JPEGImages/2009_003958.jpg 142 500 4 11 2 131 498 +11377 /data/VOCdevkit/VOC2012/JPEGImages/2009_003961.jpg 375 500 10 96 277 255 421 8 82 274 171 402 8 154 279 251 416 15 133 188 187 259 8 118 263 196 392 8 182 268 260 395 +11378 /data/VOCdevkit/VOC2012/JPEGImages/2009_003962.jpg 333 500 2 1 64 260 500 +11379 /data/VOCdevkit/VOC2012/JPEGImages/2009_003965.jpg 500 323 17 1 63 500 323 14 1 24 201 323 14 9 15 470 323 14 308 2 500 323 4 355 87 375 158 +11380 /data/VOCdevkit/VOC2012/JPEGImages/2009_003966.jpg 500 375 17 1 157 369 375 17 73 82 304 218 10 17 53 140 120 8 86 50 135 114 8 26 51 71 128 8 5 40 30 90 8 124 46 155 86 8 96 41 121 58 15 46 20 79 52 +11381 /data/VOCdevkit/VOC2012/JPEGImages/2009_003969.jpg 375 500 5 89 114 166 176 5 164 116 320 180 +11382 /data/VOCdevkit/VOC2012/JPEGImages/2009_003971.jpg 375 500 1 56 52 364 500 +11383 /data/VOCdevkit/VOC2012/JPEGImages/2009_003973.jpg 500 372 8 398 176 480 303 8 290 175 333 269 8 191 182 274 302 8 119 186 227 325 8 74 212 227 372 8 302 185 388 325 8 252 193 365 372 10 127 187 346 372 +11384 /data/VOCdevkit/VOC2012/JPEGImages/2009_003974.jpg 500 335 6 33 99 456 281 +11385 /data/VOCdevkit/VOC2012/JPEGImages/2009_003975.jpg 334 500 9 266 211 334 453 9 79 135 264 476 +11386 /data/VOCdevkit/VOC2012/JPEGImages/2009_003976.jpg 500 333 12 1 1 297 333 14 1 73 391 333 +11387 /data/VOCdevkit/VOC2012/JPEGImages/2009_003977.jpg 500 334 6 106 67 429 319 6 375 163 479 223 6 437 168 499 207 +11388 /data/VOCdevkit/VOC2012/JPEGImages/2009_003982.jpg 431 500 12 26 3 421 500 +11389 /data/VOCdevkit/VOC2012/JPEGImages/2009_003985.jpg 500 333 7 75 74 500 170 +11390 /data/VOCdevkit/VOC2012/JPEGImages/2009_003986.jpg 388 500 11 67 42 353 475 14 297 1 388 332 +11391 /data/VOCdevkit/VOC2012/JPEGImages/2009_003991.jpg 500 375 8 207 120 329 342 14 165 57 298 327 10 1 74 142 375 +11392 /data/VOCdevkit/VOC2012/JPEGImages/2009_003992.jpg 500 375 11 80 1 500 375 +11393 /data/VOCdevkit/VOC2012/JPEGImages/2009_003993.jpg 500 413 2 60 81 474 390 +11394 /data/VOCdevkit/VOC2012/JPEGImages/2009_003994.jpg 500 375 0 38 92 456 268 +11395 /data/VOCdevkit/VOC2012/JPEGImages/2009_003995.jpg 500 331 17 23 166 142 225 +11396 /data/VOCdevkit/VOC2012/JPEGImages/2009_004001.jpg 500 333 2 61 11 435 333 +11397 /data/VOCdevkit/VOC2012/JPEGImages/2009_004002.jpg 500 427 8 55 127 240 380 8 267 163 489 411 8 300 94 486 317 8 127 78 262 226 +11398 /data/VOCdevkit/VOC2012/JPEGImages/2009_004004.jpg 500 375 14 164 116 381 375 +11399 /data/VOCdevkit/VOC2012/JPEGImages/2009_004005.jpg 500 333 8 90 74 282 304 +11400 /data/VOCdevkit/VOC2012/JPEGImages/2009_004007.jpg 500 375 14 340 103 500 375 14 110 108 330 375 3 1 156 500 375 +11401 /data/VOCdevkit/VOC2012/JPEGImages/2009_004012.jpg 333 500 11 139 197 240 416 +11402 /data/VOCdevkit/VOC2012/JPEGImages/2009_004016.jpg 500 333 11 78 10 441 323 +11403 /data/VOCdevkit/VOC2012/JPEGImages/2009_004018.jpg 500 375 5 153 155 291 237 14 296 189 317 236 6 26 198 91 244 14 309 184 318 220 6 342 226 500 375 6 86 193 130 227 6 14 194 45 214 6 53 179 97 216 +11404 /data/VOCdevkit/VOC2012/JPEGImages/2009_004019.jpg 500 375 18 35 131 462 261 +11405 /data/VOCdevkit/VOC2012/JPEGImages/2009_004020.jpg 380 500 14 1 1 210 500 11 44 76 380 500 +11406 /data/VOCdevkit/VOC2012/JPEGImages/2009_004021.jpg 352 264 2 59 102 296 196 +11407 /data/VOCdevkit/VOC2012/JPEGImages/2009_004022.jpg 500 375 7 1 11 322 281 7 271 42 500 256 +11408 /data/VOCdevkit/VOC2012/JPEGImages/2009_004023.jpg 375 500 2 110 126 297 395 +11409 /data/VOCdevkit/VOC2012/JPEGImages/2009_004025.jpg 500 375 8 189 146 299 285 8 397 143 500 302 15 26 237 146 334 +11410 /data/VOCdevkit/VOC2012/JPEGImages/2009_004031.jpg 500 333 4 73 1 497 333 +11411 /data/VOCdevkit/VOC2012/JPEGImages/2009_004032.jpg 500 375 10 27 219 459 375 14 342 51 500 372 14 8 92 114 310 14 216 85 341 233 15 277 2 300 31 15 160 1 190 31 8 91 81 131 145 8 123 82 136 149 14 23 56 69 93 +11412 /data/VOCdevkit/VOC2012/JPEGImages/2009_004033.jpg 333 500 11 145 208 204 297 +11413 /data/VOCdevkit/VOC2012/JPEGImages/2009_004034.jpg 500 333 3 133 135 197 191 +11414 /data/VOCdevkit/VOC2012/JPEGImages/2009_004037.jpg 500 400 6 345 196 354 206 6 319 196 331 209 6 333 197 352 213 5 58 122 324 285 +11415 /data/VOCdevkit/VOC2012/JPEGImages/2009_004038.jpg 333 500 7 75 129 333 435 +11416 /data/VOCdevkit/VOC2012/JPEGImages/2009_004040.jpg 500 375 5 426 116 500 203 5 350 116 439 197 5 280 115 362 188 5 1 34 22 266 5 23 122 33 204 5 42 129 59 192 5 59 36 441 327 14 214 107 264 188 +11417 /data/VOCdevkit/VOC2012/JPEGImages/2009_004042.jpg 500 375 14 389 1 468 154 14 373 1 410 93 8 309 92 394 153 8 375 201 500 371 8 94 174 309 375 8 1 161 130 375 14 103 2 163 141 14 91 1 116 50 14 1 18 50 156 8 174 85 245 145 10 1 141 490 375 +11418 /data/VOCdevkit/VOC2012/JPEGImages/2009_004043.jpg 500 333 13 92 91 470 282 14 173 52 358 241 +11419 /data/VOCdevkit/VOC2012/JPEGImages/2009_004044.jpg 337 500 2 39 31 260 288 +11420 /data/VOCdevkit/VOC2012/JPEGImages/2009_004050.jpg 500 375 14 173 162 323 326 15 259 3 370 151 15 461 255 498 297 4 388 357 413 375 +11421 /data/VOCdevkit/VOC2012/JPEGImages/2009_004051.jpg 500 380 7 109 57 418 358 14 30 239 89 288 15 1 87 78 269 +11422 /data/VOCdevkit/VOC2012/JPEGImages/2009_004052.jpg 500 375 5 49 36 440 302 14 45 176 72 268 14 69 168 98 282 14 144 154 170 213 14 173 143 216 199 14 227 167 273 211 14 12 171 24 194 14 21 167 35 206 14 34 168 47 208 +11423 /data/VOCdevkit/VOC2012/JPEGImages/2009_004055.jpg 500 336 5 4 2 500 325 14 396 107 495 336 14 80 113 156 184 +11424 /data/VOCdevkit/VOC2012/JPEGImages/2009_004058.jpg 500 375 12 101 74 378 363 +11425 /data/VOCdevkit/VOC2012/JPEGImages/2009_004062.jpg 500 375 19 1 74 59 153 19 45 74 117 146 19 112 82 184 151 19 181 71 254 145 19 253 85 316 147 19 319 67 401 142 19 399 62 478 135 19 483 65 500 145 19 1 138 52 198 19 46 143 118 213 19 116 149 182 202 19 181 139 254 203 19 252 147 315 213 19 311 139 387 212 19 387 134 459 201 19 472 143 500 215 19 1 190 36 258 19 34 195 106 264 19 108 200 174 272 19 170 194 245 265 19 244 200 318 266 19 319 198 398 272 19 396 189 464 264 19 478 199 500 277 19 1 260 55 333 19 47 260 138 325 19 152 242 237 325 19 236 255 305 326 19 313 262 384 331 19 382 262 464 317 19 465 270 500 330 19 1 329 42 351 19 42 318 128 358 19 134 321 219 362 19 226 324 311 375 19 310 337 403 375 19 322 323 387 367 19 403 339 464 375 19 468 328 500 343 +11426 /data/VOCdevkit/VOC2012/JPEGImages/2009_004069.jpg 500 320 1 1 1 500 320 14 30 1 500 170 +11427 /data/VOCdevkit/VOC2012/JPEGImages/2009_004070.jpg 500 375 16 268 269 327 313 +11428 /data/VOCdevkit/VOC2012/JPEGImages/2009_004072.jpg 500 375 5 59 30 500 375 14 200 156 266 242 +11429 /data/VOCdevkit/VOC2012/JPEGImages/2009_004073.jpg 375 500 11 62 257 247 401 7 80 181 281 289 17 2 60 375 499 +11430 /data/VOCdevkit/VOC2012/JPEGImages/2009_004074.jpg 500 375 11 136 200 397 355 14 19 1 284 154 14 304 1 500 212 11 68 21 316 231 +11431 /data/VOCdevkit/VOC2012/JPEGImages/2009_004075.jpg 500 333 14 283 115 293 124 0 1 1 500 333 +11432 /data/VOCdevkit/VOC2012/JPEGImages/2009_004076.jpg 500 333 11 115 23 412 320 17 1 1 500 333 +11433 /data/VOCdevkit/VOC2012/JPEGImages/2009_004078.jpg 500 375 3 15 127 500 275 +11434 /data/VOCdevkit/VOC2012/JPEGImages/2009_004082.jpg 500 333 11 173 127 288 259 +11435 /data/VOCdevkit/VOC2012/JPEGImages/2009_004083.jpg 500 375 7 1 1 500 375 +11436 /data/VOCdevkit/VOC2012/JPEGImages/2009_004084.jpg 384 500 2 51 117 225 441 +11437 /data/VOCdevkit/VOC2012/JPEGImages/2009_004085.jpg 333 500 10 1 381 333 500 4 116 236 155 370 14 30 73 280 435 +11438 /data/VOCdevkit/VOC2012/JPEGImages/2009_004088.jpg 500 375 8 81 61 341 347 17 330 48 500 251 +11439 /data/VOCdevkit/VOC2012/JPEGImages/2009_004091.jpg 500 375 17 76 101 376 333 8 339 71 422 207 +11440 /data/VOCdevkit/VOC2012/JPEGImages/2009_004092.jpg 500 375 8 230 177 452 375 14 231 31 451 375 8 68 88 199 222 +11441 /data/VOCdevkit/VOC2012/JPEGImages/2009_004093.jpg 500 375 13 15 102 494 339 15 374 9 500 174 +11442 /data/VOCdevkit/VOC2012/JPEGImages/2009_004094.jpg 500 333 14 68 141 187 333 14 210 2 366 225 8 1 77 136 325 8 243 18 322 98 10 1 24 262 212 +11443 /data/VOCdevkit/VOC2012/JPEGImages/2009_004095.jpg 500 333 11 317 166 407 248 14 174 78 229 250 +11444 /data/VOCdevkit/VOC2012/JPEGImages/2009_004096.jpg 500 375 6 1 80 479 315 6 327 1 500 192 +11445 /data/VOCdevkit/VOC2012/JPEGImages/2009_004099.jpg 500 333 7 182 88 261 195 17 262 1 500 333 +11446 /data/VOCdevkit/VOC2012/JPEGImages/2009_004100.jpg 300 450 14 1 14 300 450 +11447 /data/VOCdevkit/VOC2012/JPEGImages/2009_004102.jpg 500 333 6 51 66 444 296 6 21 102 154 183 14 1 55 47 216 14 414 73 462 211 14 457 44 500 195 14 150 53 188 133 14 144 85 243 136 +11448 /data/VOCdevkit/VOC2012/JPEGImages/2009_004103.jpg 500 333 2 131 51 401 333 +11449 /data/VOCdevkit/VOC2012/JPEGImages/2009_004105.jpg 500 374 12 80 40 412 374 12 1 1 207 228 +11450 /data/VOCdevkit/VOC2012/JPEGImages/2009_004108.jpg 500 333 0 26 85 465 221 +11451 /data/VOCdevkit/VOC2012/JPEGImages/2009_004109.jpg 500 375 18 27 112 500 228 +11452 /data/VOCdevkit/VOC2012/JPEGImages/2009_004111.jpg 333 500 11 1 150 333 374 +11453 /data/VOCdevkit/VOC2012/JPEGImages/2009_004112.jpg 500 335 4 44 72 120 335 14 117 1 467 335 +11454 /data/VOCdevkit/VOC2012/JPEGImages/2009_004113.jpg 361 500 14 137 221 254 500 14 314 239 361 349 +11455 /data/VOCdevkit/VOC2012/JPEGImages/2009_004117.jpg 500 335 13 47 117 311 312 +11456 /data/VOCdevkit/VOC2012/JPEGImages/2009_004118.jpg 500 328 12 209 68 479 300 14 292 44 390 155 12 106 106 237 300 14 43 55 127 162 12 1 66 60 291 14 103 66 173 137 +11457 /data/VOCdevkit/VOC2012/JPEGImages/2009_004121.jpg 500 322 1 83 31 407 272 +11458 /data/VOCdevkit/VOC2012/JPEGImages/2009_004122.jpg 375 500 4 63 1 309 500 +11459 /data/VOCdevkit/VOC2012/JPEGImages/2009_004124.jpg 500 323 10 1 70 500 323 +11460 /data/VOCdevkit/VOC2012/JPEGImages/2009_004125.jpg 500 375 3 42 143 307 263 14 93 187 107 203 14 85 191 98 204 14 140 180 166 203 14 169 190 189 203 14 210 190 225 202 14 249 187 263 200 +11461 /data/VOCdevkit/VOC2012/JPEGImages/2009_004126.jpg 500 375 14 123 13 358 353 +11462 /data/VOCdevkit/VOC2012/JPEGImages/2009_004128.jpg 500 375 7 180 48 300 306 19 60 209 186 346 +11463 /data/VOCdevkit/VOC2012/JPEGImages/2009_004129.jpg 500 375 8 170 123 322 328 +11464 /data/VOCdevkit/VOC2012/JPEGImages/2009_004131.jpg 500 375 2 119 112 149 172 14 244 82 425 375 14 58 48 259 287 8 143 204 390 372 8 77 157 252 375 8 391 142 495 335 +11465 /data/VOCdevkit/VOC2012/JPEGImages/2009_004133.jpg 500 333 14 112 80 273 333 14 340 66 456 333 6 22 202 358 333 +11466 /data/VOCdevkit/VOC2012/JPEGImages/2009_004134.jpg 500 364 12 108 60 344 346 12 99 22 452 352 +11467 /data/VOCdevkit/VOC2012/JPEGImages/2009_004138.jpg 500 375 19 50 137 164 210 +11468 /data/VOCdevkit/VOC2012/JPEGImages/2009_004139.jpg 500 367 11 11 65 383 367 11 190 31 500 358 +11469 /data/VOCdevkit/VOC2012/JPEGImages/2009_004140.jpg 500 375 17 398 169 500 251 8 189 167 251 237 8 99 180 211 327 8 305 185 390 340 10 106 234 427 375 8 60 206 248 375 8 285 218 500 375 +11470 /data/VOCdevkit/VOC2012/JPEGImages/2009_004141.jpg 500 333 2 95 61 246 164 +11471 /data/VOCdevkit/VOC2012/JPEGImages/2009_004142.jpg 500 281 14 43 1 500 281 14 148 65 236 160 14 1 28 116 164 14 1 108 69 281 14 205 76 242 174 +11472 /data/VOCdevkit/VOC2012/JPEGImages/2009_004148.jpg 334 500 3 1 285 334 429 14 70 147 259 455 8 101 269 212 462 +11473 /data/VOCdevkit/VOC2012/JPEGImages/2009_004150.jpg 500 375 7 223 182 500 375 11 1 1 328 187 +11474 /data/VOCdevkit/VOC2012/JPEGImages/2009_004152.jpg 500 333 8 128 144 144 204 8 321 152 343 239 +11475 /data/VOCdevkit/VOC2012/JPEGImages/2009_004153.jpg 500 375 0 217 172 273 227 +11476 /data/VOCdevkit/VOC2012/JPEGImages/2009_004154.jpg 500 375 4 9 88 26 124 8 12 135 81 285 10 1 99 123 150 14 205 10 265 179 8 397 82 426 152 8 423 101 484 202 14 414 23 470 126 14 426 31 500 165 4 222 303 259 375 8 434 157 489 230 10 49 217 500 375 14 36 49 230 301 14 244 58 399 264 +11477 /data/VOCdevkit/VOC2012/JPEGImages/2009_004157.jpg 500 331 7 123 25 500 331 +11478 /data/VOCdevkit/VOC2012/JPEGImages/2009_004159.jpg 500 333 18 169 22 484 313 14 259 102 287 157 15 26 201 43 232 15 147 172 173 203 +11479 /data/VOCdevkit/VOC2012/JPEGImages/2009_004161.jpg 500 375 17 1 1 495 375 14 127 156 415 267 +11480 /data/VOCdevkit/VOC2012/JPEGImages/2009_004162.jpg 500 375 10 1 27 500 375 4 189 1 241 158 4 241 12 306 169 4 370 1 440 138 4 427 1 476 112 14 65 1 371 83 +11481 /data/VOCdevkit/VOC2012/JPEGImages/2009_004163.jpg 356 500 18 1 22 352 476 18 305 243 356 306 +11482 /data/VOCdevkit/VOC2012/JPEGImages/2009_004164.jpg 500 375 16 254 9 299 85 16 295 8 399 91 16 366 55 449 126 16 214 187 361 320 16 211 203 272 323 16 109 186 222 341 16 12 192 138 312 +11483 /data/VOCdevkit/VOC2012/JPEGImages/2009_004165.jpg 500 334 17 36 218 267 334 8 325 208 421 330 8 281 202 360 267 8 357 189 381 236 19 339 157 371 183 8 277 212 309 234 +11484 /data/VOCdevkit/VOC2012/JPEGImages/2009_004166.jpg 500 346 3 25 1 442 292 14 265 215 281 244 3 13 153 44 162 3 42 152 59 161 3 291 156 343 169 3 211 150 282 168 +11485 /data/VOCdevkit/VOC2012/JPEGImages/2009_004168.jpg 500 366 8 346 121 368 145 8 368 120 390 147 15 216 213 270 252 +11486 /data/VOCdevkit/VOC2012/JPEGImages/2009_004169.jpg 500 407 9 39 188 115 340 9 182 115 476 356 9 384 93 500 306 +11487 /data/VOCdevkit/VOC2012/JPEGImages/2009_004170.jpg 500 328 18 66 101 460 262 +11488 /data/VOCdevkit/VOC2012/JPEGImages/2009_004171.jpg 500 332 16 369 171 449 269 16 145 159 255 260 6 171 90 281 178 +11489 /data/VOCdevkit/VOC2012/JPEGImages/2009_004173.jpg 500 375 15 1 1 500 375 +11490 /data/VOCdevkit/VOC2012/JPEGImages/2009_004174.jpg 500 281 2 258 201 392 250 2 180 104 300 156 2 86 76 159 111 2 80 215 136 281 +11491 /data/VOCdevkit/VOC2012/JPEGImages/2009_004175.jpg 500 294 14 339 168 387 247 13 346 216 376 264 6 250 157 330 208 13 325 170 344 203 14 132 154 147 176 14 77 142 92 166 13 78 157 95 170 13 128 162 149 177 +11492 /data/VOCdevkit/VOC2012/JPEGImages/2009_004176.jpg 500 340 7 322 59 500 340 19 1 1 416 340 +11493 /data/VOCdevkit/VOC2012/JPEGImages/2009_004177.jpg 500 375 17 168 166 249 230 10 170 228 500 375 +11494 /data/VOCdevkit/VOC2012/JPEGImages/2009_004178.jpg 333 500 3 78 224 333 332 +11495 /data/VOCdevkit/VOC2012/JPEGImages/2009_004179.jpg 500 357 11 204 65 423 283 14 95 25 240 284 14 1 1 48 192 11 462 89 500 204 8 382 71 454 161 11 293 92 356 142 14 226 41 262 75 6 10 14 126 119 6 190 1 345 121 6 344 30 500 134 6 125 22 150 52 +11496 /data/VOCdevkit/VOC2012/JPEGImages/2009_004180.jpg 500 500 17 161 261 500 389 8 1 277 115 412 17 387 375 500 500 +11497 /data/VOCdevkit/VOC2012/JPEGImages/2009_004181.jpg 500 375 16 1 1 71 95 16 82 1 222 56 16 36 1 355 213 14 206 146 422 375 14 420 1 500 197 +11498 /data/VOCdevkit/VOC2012/JPEGImages/2009_004183.jpg 500 310 7 84 62 476 302 +11499 /data/VOCdevkit/VOC2012/JPEGImages/2009_004186.jpg 500 375 9 85 89 402 342 +11500 /data/VOCdevkit/VOC2012/JPEGImages/2009_004187.jpg 500 375 5 79 41 446 276 5 438 84 486 195 6 41 130 87 155 6 1 133 41 157 14 35 150 51 209 14 6 143 23 200 14 20 153 36 210 6 95 129 137 150 +11501 /data/VOCdevkit/VOC2012/JPEGImages/2009_004188.jpg 500 375 17 1 101 500 372 14 63 57 356 351 14 128 81 377 351 +11502 /data/VOCdevkit/VOC2012/JPEGImages/2009_004191.jpg 375 500 15 133 6 356 500 +11503 /data/VOCdevkit/VOC2012/JPEGImages/2009_004193.jpg 500 333 11 1 22 379 318 17 1 2 500 333 +11504 /data/VOCdevkit/VOC2012/JPEGImages/2009_004197.jpg 500 375 5 68 194 336 283 5 333 209 451 262 6 477 228 500 248 5 1 205 75 259 +11505 /data/VOCdevkit/VOC2012/JPEGImages/2009_004199.jpg 375 500 4 361 354 375 387 4 342 337 375 384 4 326 337 362 379 4 310 334 347 376 4 292 336 333 373 4 353 402 375 444 4 337 400 372 442 4 321 397 358 437 4 302 394 343 434 4 289 393 328 429 4 295 450 336 490 +11506 /data/VOCdevkit/VOC2012/JPEGImages/2009_004200.jpg 500 333 11 102 25 441 322 +11507 /data/VOCdevkit/VOC2012/JPEGImages/2009_004201.jpg 500 375 16 243 169 273 223 16 99 183 131 232 16 40 191 82 242 +11508 /data/VOCdevkit/VOC2012/JPEGImages/2009_004202.jpg 500 335 13 55 55 469 324 14 200 16 362 319 6 365 87 500 247 +11509 /data/VOCdevkit/VOC2012/JPEGImages/2009_004203.jpg 500 333 0 23 113 483 222 +11510 /data/VOCdevkit/VOC2012/JPEGImages/2009_004205.jpg 500 393 14 142 5 408 393 14 408 229 500 393 14 327 282 407 393 14 1 263 117 393 +11511 /data/VOCdevkit/VOC2012/JPEGImages/2009_004207.jpg 500 375 13 1 1 500 361 13 166 1 278 58 13 270 1 337 55 13 321 1 360 41 +11512 /data/VOCdevkit/VOC2012/JPEGImages/2009_004210.jpg 500 335 7 105 114 261 286 +11513 /data/VOCdevkit/VOC2012/JPEGImages/2009_004211.jpg 500 346 18 27 105 500 254 +11514 /data/VOCdevkit/VOC2012/JPEGImages/2009_004212.jpg 330 500 14 202 133 247 215 +11515 /data/VOCdevkit/VOC2012/JPEGImages/2009_004213.jpg 500 375 18 132 84 352 286 18 437 200 466 233 14 492 211 500 239 18 115 170 133 265 +11516 /data/VOCdevkit/VOC2012/JPEGImages/2009_004217.jpg 333 500 8 115 251 215 415 +11517 /data/VOCdevkit/VOC2012/JPEGImages/2009_004218.jpg 500 375 14 244 173 284 217 14 69 111 145 236 14 1 102 108 375 14 140 179 173 219 14 154 155 184 180 +11518 /data/VOCdevkit/VOC2012/JPEGImages/2009_004221.jpg 396 500 14 213 55 347 500 +11519 /data/VOCdevkit/VOC2012/JPEGImages/2009_004222.jpg 500 333 16 214 108 378 257 16 135 101 261 252 +11520 /data/VOCdevkit/VOC2012/JPEGImages/2009_004224.jpg 500 334 3 29 85 62 102 3 405 83 465 107 6 360 136 500 271 6 111 119 354 245 6 1 138 63 224 14 66 81 87 157 +11521 /data/VOCdevkit/VOC2012/JPEGImages/2009_004225.jpg 500 375 7 1 1 313 375 7 222 1 500 375 +11522 /data/VOCdevkit/VOC2012/JPEGImages/2009_004227.jpg 375 500 11 34 224 191 500 14 6 36 320 382 +11523 /data/VOCdevkit/VOC2012/JPEGImages/2009_004228.jpg 500 375 10 1 235 424 375 8 395 234 472 375 14 135 78 329 246 15 253 5 302 50 4 271 266 297 333 4 300 252 326 316 4 163 220 248 251 +11524 /data/VOCdevkit/VOC2012/JPEGImages/2009_004229.jpg 500 385 11 97 67 242 196 11 180 137 410 265 8 320 1 500 192 +11525 /data/VOCdevkit/VOC2012/JPEGImages/2009_004231.jpg 500 375 5 1 1 427 375 5 425 141 500 264 +11526 /data/VOCdevkit/VOC2012/JPEGImages/2009_004232.jpg 500 375 6 1 48 213 243 6 23 1 499 368 +11527 /data/VOCdevkit/VOC2012/JPEGImages/2009_004233.jpg 500 375 9 148 49 325 349 +11528 /data/VOCdevkit/VOC2012/JPEGImages/2009_004234.jpg 500 333 7 128 6 330 275 +11529 /data/VOCdevkit/VOC2012/JPEGImages/2009_004241.jpg 500 375 13 270 1 500 207 13 106 1 475 375 +11530 /data/VOCdevkit/VOC2012/JPEGImages/2009_004242.jpg 500 334 1 1 14 204 334 +11531 /data/VOCdevkit/VOC2012/JPEGImages/2009_004243.jpg 500 333 8 67 169 191 333 19 218 120 267 160 19 153 141 192 167 +11532 /data/VOCdevkit/VOC2012/JPEGImages/2009_004244.jpg 375 500 8 209 291 285 413 8 88 304 188 434 +11533 /data/VOCdevkit/VOC2012/JPEGImages/2009_004247.jpg 380 500 4 84 191 317 247 +11534 /data/VOCdevkit/VOC2012/JPEGImages/2009_004248.jpg 500 333 7 116 41 488 333 +11535 /data/VOCdevkit/VOC2012/JPEGImages/2009_004249.jpg 500 400 6 1 1 111 60 13 77 17 376 400 +11536 /data/VOCdevkit/VOC2012/JPEGImages/2009_004255.jpg 375 500 18 53 96 349 439 +11537 /data/VOCdevkit/VOC2012/JPEGImages/2009_004258.jpg 500 375 5 67 46 465 285 6 2 173 57 195 1 11 189 37 213 1 46 188 69 210 14 102 118 148 166 14 166 109 214 160 +11538 /data/VOCdevkit/VOC2012/JPEGImages/2009_004261.jpg 500 375 7 102 1 500 375 +11539 /data/VOCdevkit/VOC2012/JPEGImages/2009_004262.jpg 500 333 12 202 1 500 333 +11540 /data/VOCdevkit/VOC2012/JPEGImages/2009_004263.jpg 500 458 8 1 197 128 458 8 356 197 500 458 8 293 211 373 298 8 116 211 181 301 15 171 70 294 327 10 120 291 369 427 +11541 /data/VOCdevkit/VOC2012/JPEGImages/2009_004264.jpg 500 333 11 219 196 396 271 17 431 226 500 333 17 38 186 437 329 15 387 54 425 181 +11542 /data/VOCdevkit/VOC2012/JPEGImages/2009_004271.jpg 500 375 6 208 203 259 245 6 250 204 265 230 +11543 /data/VOCdevkit/VOC2012/JPEGImages/2009_004272.jpg 500 314 6 161 68 389 208 +11544 /data/VOCdevkit/VOC2012/JPEGImages/2009_004273.jpg 500 345 3 6 26 500 306 +11545 /data/VOCdevkit/VOC2012/JPEGImages/2009_004274.jpg 500 375 15 4 1 439 375 +11546 /data/VOCdevkit/VOC2012/JPEGImages/2009_004276.jpg 500 375 14 1 194 53 375 14 29 219 64 360 14 166 224 227 344 14 314 215 359 350 14 267 203 323 344 14 447 193 490 262 5 1 1 447 310 +11547 /data/VOCdevkit/VOC2012/JPEGImages/2009_004277.jpg 375 500 11 22 43 375 464 +11548 /data/VOCdevkit/VOC2012/JPEGImages/2009_004278.jpg 500 333 3 256 119 365 259 +11549 /data/VOCdevkit/VOC2012/JPEGImages/2009_004279.jpg 500 334 12 86 35 224 256 14 67 116 322 334 14 186 57 496 334 +11550 /data/VOCdevkit/VOC2012/JPEGImages/2009_004283.jpg 375 500 17 1 214 274 500 15 237 391 306 481 +11551 /data/VOCdevkit/VOC2012/JPEGImages/2009_004284.jpg 500 308 9 218 154 425 262 9 40 154 189 243 9 182 161 270 242 +11552 /data/VOCdevkit/VOC2012/JPEGImages/2009_004285.jpg 333 500 14 1 39 322 500 +11553 /data/VOCdevkit/VOC2012/JPEGImages/2009_004289.jpg 500 375 9 158 176 251 235 9 158 109 331 233 +11554 /data/VOCdevkit/VOC2012/JPEGImages/2009_004290.jpg 500 333 5 136 38 356 277 14 1 147 60 266 14 7 140 61 281 6 475 190 500 222 +11555 /data/VOCdevkit/VOC2012/JPEGImages/2009_004291.jpg 500 334 17 1 1 500 334 7 168 81 429 334 +11556 /data/VOCdevkit/VOC2012/JPEGImages/2009_004295.jpg 500 375 5 7 88 490 332 +11557 /data/VOCdevkit/VOC2012/JPEGImages/2009_004298.jpg 500 375 17 8 181 487 373 +11558 /data/VOCdevkit/VOC2012/JPEGImages/2009_004300.jpg 375 500 14 64 11 365 500 14 1 1 320 290 14 320 1 375 138 +11559 /data/VOCdevkit/VOC2012/JPEGImages/2009_004301.jpg 500 375 14 219 74 333 304 14 53 227 337 375 19 129 150 254 269 17 255 119 483 375 +11560 /data/VOCdevkit/VOC2012/JPEGImages/2009_004303.jpg 500 375 6 422 4 493 28 6 266 1 379 60 6 82 1 385 235 14 244 71 373 283 1 167 168 465 366 +11561 /data/VOCdevkit/VOC2012/JPEGImages/2009_004307.jpg 500 375 7 134 64 435 329 +11562 /data/VOCdevkit/VOC2012/JPEGImages/2009_004308.jpg 500 335 0 47 34 495 252 +11563 /data/VOCdevkit/VOC2012/JPEGImages/2009_004309.jpg 500 375 10 1 197 500 375 14 2 19 240 367 14 124 65 323 311 14 249 87 373 232 4 418 169 452 239 14 281 54 417 170 14 440 68 500 169 +11564 /data/VOCdevkit/VOC2012/JPEGImages/2009_004312.jpg 500 375 8 295 150 454 345 8 125 140 275 336 8 1 136 134 307 8 389 163 500 323 4 129 91 151 154 4 297 76 310 120 10 22 147 500 312 +11565 /data/VOCdevkit/VOC2012/JPEGImages/2009_004315.jpg 500 463 2 219 51 461 327 +11566 /data/VOCdevkit/VOC2012/JPEGImages/2009_004316.jpg 500 375 9 244 152 425 258 +11567 /data/VOCdevkit/VOC2012/JPEGImages/2009_004317.jpg 500 372 0 8 101 491 286 +11568 /data/VOCdevkit/VOC2012/JPEGImages/2009_004319.jpg 500 334 11 150 68 341 311 +11569 /data/VOCdevkit/VOC2012/JPEGImages/2009_004322.jpg 375 500 17 71 119 375 500 14 129 127 375 439 +11570 /data/VOCdevkit/VOC2012/JPEGImages/2009_004323.jpg 500 375 14 333 5 497 375 14 215 72 358 301 14 5 98 197 343 +11571 /data/VOCdevkit/VOC2012/JPEGImages/2009_004324.jpg 500 375 4 139 107 448 219 +11572 /data/VOCdevkit/VOC2012/JPEGImages/2009_004327.jpg 500 332 6 40 71 459 278 +11573 /data/VOCdevkit/VOC2012/JPEGImages/2009_004328.jpg 500 375 5 1 224 92 296 5 90 138 402 331 +11574 /data/VOCdevkit/VOC2012/JPEGImages/2009_004329.jpg 500 375 18 13 140 456 275 +11575 /data/VOCdevkit/VOC2012/JPEGImages/2009_004332.jpg 375 500 4 197 195 354 500 14 1 2 375 499 +11576 /data/VOCdevkit/VOC2012/JPEGImages/2009_004334.jpg 500 338 2 125 73 210 104 2 192 85 424 261 +11577 /data/VOCdevkit/VOC2012/JPEGImages/2009_004336.jpg 500 375 18 12 127 150 243 18 138 102 480 298 +11578 /data/VOCdevkit/VOC2012/JPEGImages/2009_004338.jpg 500 333 13 254 52 500 235 13 1 64 384 304 +11579 /data/VOCdevkit/VOC2012/JPEGImages/2009_004340.jpg 500 333 6 85 45 413 286 13 64 58 146 210 1 1 96 53 207 +11580 /data/VOCdevkit/VOC2012/JPEGImages/2009_004341.jpg 500 334 19 53 1 500 291 +11581 /data/VOCdevkit/VOC2012/JPEGImages/2009_004346.jpg 500 333 2 216 134 324 222 +11582 /data/VOCdevkit/VOC2012/JPEGImages/2009_004347.jpg 500 333 14 318 131 443 333 14 323 135 370 328 +11583 /data/VOCdevkit/VOC2012/JPEGImages/2009_004350.jpg 500 375 5 70 141 382 321 14 74 115 91 147 14 128 89 145 110 +11584 /data/VOCdevkit/VOC2012/JPEGImages/2009_004351.jpg 500 332 9 102 188 189 249 9 13 186 78 237 9 78 185 130 215 14 392 175 478 269 +11585 /data/VOCdevkit/VOC2012/JPEGImages/2009_004357.jpg 500 375 19 148 204 212 247 19 189 260 271 309 19 345 246 416 294 19 464 220 500 237 19 393 157 420 177 19 130 178 179 208 19 213 177 259 204 19 261 201 315 237 19 188 162 211 186 19 134 92 157 110 19 227 85 246 100 19 15 80 40 98 19 170 148 201 170 19 364 195 410 225 19 287 164 330 195 +11586 /data/VOCdevkit/VOC2012/JPEGImages/2009_004358.jpg 500 375 7 37 20 468 285 +11587 /data/VOCdevkit/VOC2012/JPEGImages/2009_004359.jpg 500 375 19 309 14 500 253 14 85 132 344 375 14 55 45 220 345 8 1 57 106 375 +11588 /data/VOCdevkit/VOC2012/JPEGImages/2009_004361.jpg 375 500 11 1 48 375 500 +11589 /data/VOCdevkit/VOC2012/JPEGImages/2009_004364.jpg 500 396 1 4 1 499 374 6 420 58 500 147 6 455 27 500 75 6 305 55 403 96 6 255 56 322 89 6 191 63 224 85 6 129 61 211 111 +11590 /data/VOCdevkit/VOC2012/JPEGImages/2009_004366.jpg 500 375 9 88 63 392 287 +11591 /data/VOCdevkit/VOC2012/JPEGImages/2009_004368.jpg 500 333 14 217 57 418 295 13 62 39 455 271 +11592 /data/VOCdevkit/VOC2012/JPEGImages/2009_004369.jpg 500 375 5 64 132 466 297 14 1 200 8 252 +11593 /data/VOCdevkit/VOC2012/JPEGImages/2009_004370.jpg 500 374 6 1 48 500 204 +11594 /data/VOCdevkit/VOC2012/JPEGImages/2009_004371.jpg 438 500 18 97 176 365 464 +11595 /data/VOCdevkit/VOC2012/JPEGImages/2009_004374.jpg 500 239 5 1 63 453 200 +11596 /data/VOCdevkit/VOC2012/JPEGImages/2009_004375.jpg 500 298 2 169 144 286 219 +11597 /data/VOCdevkit/VOC2012/JPEGImages/2009_004377.jpg 500 375 14 3 79 366 375 8 61 122 353 374 +11598 /data/VOCdevkit/VOC2012/JPEGImages/2009_004382.jpg 313 500 7 50 1 264 500 +11599 /data/VOCdevkit/VOC2012/JPEGImages/2009_004383.jpg 500 375 5 40 122 482 284 5 476 174 500 217 5 1 150 116 273 +11600 /data/VOCdevkit/VOC2012/JPEGImages/2009_004390.jpg 500 375 11 36 87 299 181 11 214 130 464 253 +11601 /data/VOCdevkit/VOC2012/JPEGImages/2009_004392.jpg 500 333 11 121 1 500 333 +11602 /data/VOCdevkit/VOC2012/JPEGImages/2009_004394.jpg 500 401 4 98 42 125 145 7 107 134 423 336 15 280 93 341 145 15 177 10 318 144 10 1 268 500 401 15 346 220 487 273 15 1 1 90 321 +11603 /data/VOCdevkit/VOC2012/JPEGImages/2009_004397.jpg 500 375 3 77 130 414 193 3 412 176 458 192 +11604 /data/VOCdevkit/VOC2012/JPEGImages/2009_004399.jpg 500 375 10 1 1 500 375 +11605 /data/VOCdevkit/VOC2012/JPEGImages/2009_004402.jpg 500 334 0 109 94 258 334 +11606 /data/VOCdevkit/VOC2012/JPEGImages/2009_004403.jpg 500 334 11 194 112 269 298 11 70 149 201 230 14 445 1 485 49 +11607 /data/VOCdevkit/VOC2012/JPEGImages/2009_004404.jpg 333 500 15 81 140 235 252 15 180 268 294 431 15 155 330 213 441 15 102 251 214 367 8 238 369 333 500 +11608 /data/VOCdevkit/VOC2012/JPEGImages/2009_004406.jpg 500 334 18 42 128 360 218 14 336 176 357 209 14 433 167 456 194 14 66 203 100 235 +11609 /data/VOCdevkit/VOC2012/JPEGImages/2009_004409.jpg 500 333 0 1 84 452 271 +11610 /data/VOCdevkit/VOC2012/JPEGImages/2009_004410.jpg 500 375 14 1 102 81 221 14 467 72 500 159 14 1 89 500 375 14 208 1 500 375 +11611 /data/VOCdevkit/VOC2012/JPEGImages/2009_004411.jpg 500 375 11 49 1 500 335 +11612 /data/VOCdevkit/VOC2012/JPEGImages/2009_004414.jpg 500 333 0 14 98 478 205 0 33 147 94 227 0 1 149 91 187 +11613 /data/VOCdevkit/VOC2012/JPEGImages/2009_004417.jpg 500 357 5 222 187 411 304 +11614 /data/VOCdevkit/VOC2012/JPEGImages/2009_004419.jpg 500 375 8 74 232 370 375 17 311 191 500 365 8 105 164 173 215 8 49 192 106 293 10 90 204 249 292 +11615 /data/VOCdevkit/VOC2012/JPEGImages/2009_004424.jpg 333 500 7 1 1 301 489 +11616 /data/VOCdevkit/VOC2012/JPEGImages/2009_004425.jpg 500 375 11 249 50 479 197 11 105 130 243 241 11 236 146 297 222 +11617 /data/VOCdevkit/VOC2012/JPEGImages/2009_004426.jpg 500 375 10 1 183 337 375 8 1 165 57 375 8 309 108 346 341 8 242 115 290 186 8 86 108 144 221 8 1 111 79 250 17 350 131 458 230 17 296 121 393 180 8 200 121 243 178 15 401 97 467 206 +11618 /data/VOCdevkit/VOC2012/JPEGImages/2009_004429.jpg 500 375 10 109 200 500 375 8 1 259 197 375 8 1 211 187 375 14 39 120 218 375 14 105 93 208 225 14 264 110 361 226 8 349 160 384 193 8 433 173 500 375 14 357 109 453 252 +11619 /data/VOCdevkit/VOC2012/JPEGImages/2009_004432.jpg 500 333 4 102 103 142 233 14 111 63 396 333 14 170 1 500 333 +11620 /data/VOCdevkit/VOC2012/JPEGImages/2009_004434.jpg 500 333 7 131 1 421 333 +11621 /data/VOCdevkit/VOC2012/JPEGImages/2009_004435.jpg 500 375 14 35 79 382 300 +11622 /data/VOCdevkit/VOC2012/JPEGImages/2009_004436.jpg 500 375 6 1 85 491 374 +11623 /data/VOCdevkit/VOC2012/JPEGImages/2009_004438.jpg 500 333 15 86 58 207 275 14 91 159 125 239 +11624 /data/VOCdevkit/VOC2012/JPEGImages/2009_004440.jpg 500 333 5 300 59 481 270 5 20 92 159 261 6 13 173 25 212 +11625 /data/VOCdevkit/VOC2012/JPEGImages/2009_004442.jpg 375 500 7 41 26 355 272 7 8 156 333 463 +11626 /data/VOCdevkit/VOC2012/JPEGImages/2009_004444.jpg 500 467 1 26 220 399 440 +11627 /data/VOCdevkit/VOC2012/JPEGImages/2009_004445.jpg 500 375 11 124 84 500 375 8 1 1 232 356 +11628 /data/VOCdevkit/VOC2012/JPEGImages/2009_004446.jpg 500 350 0 403 9 500 42 0 409 33 500 75 0 146 12 418 96 0 3 102 500 252 14 160 141 199 194 +11629 /data/VOCdevkit/VOC2012/JPEGImages/2009_004448.jpg 375 500 7 4 4 335 458 +11630 /data/VOCdevkit/VOC2012/JPEGImages/2009_004449.jpg 500 375 17 34 99 500 375 +11631 /data/VOCdevkit/VOC2012/JPEGImages/2009_004451.jpg 500 375 9 13 28 58 89 9 69 36 217 111 9 158 66 349 198 9 443 24 473 50 9 375 22 412 43 9 301 29 371 67 9 254 29 296 69 9 179 16 198 36 9 100 20 123 38 9 141 20 170 37 +11632 /data/VOCdevkit/VOC2012/JPEGImages/2009_004452.jpg 500 332 17 390 162 500 229 8 298 170 402 332 8 336 209 486 332 8 277 170 348 233 8 207 202 262 300 +11633 /data/VOCdevkit/VOC2012/JPEGImages/2009_004453.jpg 500 375 18 1 1 220 375 14 71 165 95 216 14 71 116 95 175 14 85 78 103 126 14 102 95 110 121 +11634 /data/VOCdevkit/VOC2012/JPEGImages/2009_004454.jpg 500 350 12 162 134 337 304 +11635 /data/VOCdevkit/VOC2012/JPEGImages/2009_004455.jpg 500 332 6 1 74 90 146 6 60 67 153 114 13 97 68 292 306 13 279 67 388 217 +11636 /data/VOCdevkit/VOC2012/JPEGImages/2009_004456.jpg 500 336 7 42 34 483 336 17 1 1 500 336 +11637 /data/VOCdevkit/VOC2012/JPEGImages/2009_004457.jpg 500 281 17 22 110 500 281 14 343 55 450 281 +11638 /data/VOCdevkit/VOC2012/JPEGImages/2009_004464.jpg 500 375 17 95 89 450 336 +11639 /data/VOCdevkit/VOC2012/JPEGImages/2009_004465.jpg 500 375 11 51 1 452 356 +11640 /data/VOCdevkit/VOC2012/JPEGImages/2009_004468.jpg 500 335 18 56 89 433 284 +11641 /data/VOCdevkit/VOC2012/JPEGImages/2009_004471.jpg 500 375 6 41 109 463 286 6 398 135 500 174 6 441 141 500 224 +11642 /data/VOCdevkit/VOC2012/JPEGImages/2009_004475.jpg 500 375 0 155 137 395 221 +11643 /data/VOCdevkit/VOC2012/JPEGImages/2009_004477.jpg 500 333 7 133 24 330 333 +11644 /data/VOCdevkit/VOC2012/JPEGImages/2009_004478.jpg 500 375 19 18 4 340 370 +11645 /data/VOCdevkit/VOC2012/JPEGImages/2009_004479.jpg 500 375 11 125 55 461 247 8 44 13 500 375 +11646 /data/VOCdevkit/VOC2012/JPEGImages/2009_004483.jpg 500 375 11 1 3 500 375 +11647 /data/VOCdevkit/VOC2012/JPEGImages/2009_004486.jpg 490 326 14 39 22 449 246 +11648 /data/VOCdevkit/VOC2012/JPEGImages/2009_004492.jpg 500 335 0 1 58 500 277 0 396 1 456 58 +11649 /data/VOCdevkit/VOC2012/JPEGImages/2009_004494.jpg 500 375 6 262 1 323 66 6 395 6 474 37 +11650 /data/VOCdevkit/VOC2012/JPEGImages/2009_004496.jpg 500 375 1 1 35 467 375 +11651 /data/VOCdevkit/VOC2012/JPEGImages/2009_004497.jpg 500 375 12 1 15 390 375 12 360 148 500 375 +11652 /data/VOCdevkit/VOC2012/JPEGImages/2009_004499.jpg 500 375 8 290 54 339 126 8 185 64 305 308 8 1 113 38 266 8 19 73 186 359 8 216 80 374 354 8 363 67 471 308 10 57 123 484 336 +11653 /data/VOCdevkit/VOC2012/JPEGImages/2009_004501.jpg 500 375 8 179 162 317 307 +11654 /data/VOCdevkit/VOC2012/JPEGImages/2009_004502.jpg 500 292 13 51 106 415 292 14 161 54 342 220 +11655 /data/VOCdevkit/VOC2012/JPEGImages/2009_004503.jpg 500 333 19 350 104 481 264 19 171 93 351 228 19 25 93 170 253 14 50 127 150 181 14 192 118 327 190 14 368 136 456 185 +11656 /data/VOCdevkit/VOC2012/JPEGImages/2009_004504.jpg 369 500 7 59 120 253 469 +11657 /data/VOCdevkit/VOC2012/JPEGImages/2009_004507.jpg 500 334 11 87 29 408 329 14 359 1 472 259 +11658 /data/VOCdevkit/VOC2012/JPEGImages/2009_004508.jpg 500 375 1 270 186 338 314 14 270 93 334 294 14 195 85 255 263 1 200 163 256 280 14 182 103 215 223 1 183 165 208 248 +11659 /data/VOCdevkit/VOC2012/JPEGImages/2009_004509.jpg 500 375 2 198 159 281 319 +11660 /data/VOCdevkit/VOC2012/JPEGImages/2009_004511.jpg 500 375 18 22 126 298 291 14 262 175 282 190 +11661 /data/VOCdevkit/VOC2012/JPEGImages/2009_004513.jpg 335 500 6 201 137 282 197 16 84 168 262 398 +11662 /data/VOCdevkit/VOC2012/JPEGImages/2009_004514.jpg 500 375 10 105 222 372 375 8 230 253 315 375 8 49 247 174 375 14 352 160 480 375 14 339 165 406 237 14 281 153 345 228 14 197 161 257 225 14 104 169 180 230 14 39 172 140 363 8 81 132 123 188 8 74 178 107 223 8 24 289 81 375 8 1 200 37 281 14 1 208 45 375 15 314 75 435 206 15 34 130 51 156 +11663 /data/VOCdevkit/VOC2012/JPEGImages/2009_004518.jpg 375 500 6 325 57 340 68 6 290 56 306 65 6 127 61 153 71 6 53 94 103 129 1 341 107 350 119 14 40 87 76 170 14 341 95 348 106 14 81 78 155 296 14 333 90 340 125 14 161 77 208 142 14 322 86 335 124 14 182 54 260 333 14 239 40 337 328 14 285 61 351 280 4 322 185 345 225 +11664 /data/VOCdevkit/VOC2012/JPEGImages/2009_004519.jpg 448 336 19 245 41 384 205 +11665 /data/VOCdevkit/VOC2012/JPEGImages/2009_004524.jpg 500 334 3 44 85 500 334 2 350 86 393 117 +11666 /data/VOCdevkit/VOC2012/JPEGImages/2009_004525.jpg 375 500 14 7 28 285 500 +11667 /data/VOCdevkit/VOC2012/JPEGImages/2009_004527.jpg 500 334 18 203 209 410 290 +11668 /data/VOCdevkit/VOC2012/JPEGImages/2009_004529.jpg 500 375 7 67 15 482 375 +11669 /data/VOCdevkit/VOC2012/JPEGImages/2009_004530.jpg 336 500 12 9 116 254 495 14 275 305 314 401 14 313 293 330 399 +11670 /data/VOCdevkit/VOC2012/JPEGImages/2009_004532.jpg 500 375 10 1 182 500 375 8 360 215 500 375 8 3 139 137 261 8 139 126 236 200 8 385 121 485 209 6 385 81 459 124 6 380 90 429 129 15 127 169 235 294 +11671 /data/VOCdevkit/VOC2012/JPEGImages/2009_004535.jpg 500 375 0 72 166 382 257 +11672 /data/VOCdevkit/VOC2012/JPEGImages/2009_004536.jpg 333 500 8 19 17 307 479 +11673 /data/VOCdevkit/VOC2012/JPEGImages/2009_004537.jpg 393 500 15 236 209 381 305 8 35 297 171 490 10 19 304 381 472 4 148 264 167 311 +11674 /data/VOCdevkit/VOC2012/JPEGImages/2009_004539.jpg 399 500 3 75 128 297 436 +11675 /data/VOCdevkit/VOC2012/JPEGImages/2009_004540.jpg 500 375 2 230 18 378 375 +11676 /data/VOCdevkit/VOC2012/JPEGImages/2009_004542.jpg 333 500 4 100 64 217 461 4 121 11 176 205 +11677 /data/VOCdevkit/VOC2012/JPEGImages/2009_004543.jpg 500 375 12 162 119 276 292 +11678 /data/VOCdevkit/VOC2012/JPEGImages/2009_004545.jpg 320 240 11 22 26 222 224 +11679 /data/VOCdevkit/VOC2012/JPEGImages/2009_004547.jpg 375 500 16 1 3 337 471 +11680 /data/VOCdevkit/VOC2012/JPEGImages/2009_004548.jpg 500 319 0 65 158 431 250 14 4 210 21 256 +11681 /data/VOCdevkit/VOC2012/JPEGImages/2009_004551.jpg 500 375 1 53 93 463 364 4 203 189 249 239 4 254 191 285 244 +11682 /data/VOCdevkit/VOC2012/JPEGImages/2009_004552.jpg 500 424 2 170 72 325 325 +11683 /data/VOCdevkit/VOC2012/JPEGImages/2009_004554.jpg 333 500 15 1 1 333 500 +11684 /data/VOCdevkit/VOC2012/JPEGImages/2009_004556.jpg 500 333 6 2 93 500 296 14 423 89 457 138 14 359 83 396 132 14 62 93 92 122 14 1 81 55 132 +11685 /data/VOCdevkit/VOC2012/JPEGImages/2009_004557.jpg 375 500 3 196 75 267 156 +11686 /data/VOCdevkit/VOC2012/JPEGImages/2009_004559.jpg 500 375 18 161 89 492 314 +11687 /data/VOCdevkit/VOC2012/JPEGImages/2009_004560.jpg 500 375 17 1 1 500 375 11 75 23 490 319 +11688 /data/VOCdevkit/VOC2012/JPEGImages/2009_004561.jpg 500 375 1 176 150 488 345 8 109 180 168 291 +11689 /data/VOCdevkit/VOC2012/JPEGImages/2009_004562.jpg 500 375 8 145 194 267 375 8 24 211 170 375 8 54 173 111 220 8 1 192 37 253 15 444 91 493 145 10 1 217 219 375 +11690 /data/VOCdevkit/VOC2012/JPEGImages/2009_004565.jpg 337 500 2 76 86 225 407 +11691 /data/VOCdevkit/VOC2012/JPEGImages/2009_004567.jpg 500 375 6 1 184 30 215 6 28 191 47 210 6 120 185 145 208 5 91 138 420 256 +11692 /data/VOCdevkit/VOC2012/JPEGImages/2009_004568.jpg 500 333 2 93 88 159 148 2 205 102 262 167 2 168 93 241 221 2 161 199 198 259 2 231 241 294 312 2 380 219 450 292 2 392 181 492 239 +11693 /data/VOCdevkit/VOC2012/JPEGImages/2009_004570.jpg 500 375 14 1 1 430 375 +11694 /data/VOCdevkit/VOC2012/JPEGImages/2009_004571.jpg 375 500 1 4 44 373 497 +11695 /data/VOCdevkit/VOC2012/JPEGImages/2009_004572.jpg 500 334 6 49 57 448 265 +11696 /data/VOCdevkit/VOC2012/JPEGImages/2009_004579.jpg 334 500 4 31 14 153 493 4 190 14 314 495 +11697 /data/VOCdevkit/VOC2012/JPEGImages/2009_004580.jpg 500 333 14 97 110 154 290 +11698 /data/VOCdevkit/VOC2012/JPEGImages/2009_004581.jpg 500 375 11 125 112 339 215 +11699 /data/VOCdevkit/VOC2012/JPEGImages/2009_004582.jpg 500 375 17 1 1 500 375 14 14 19 500 308 +11700 /data/VOCdevkit/VOC2012/JPEGImages/2009_004587.jpg 400 500 14 244 250 400 500 14 1 17 325 500 +11701 /data/VOCdevkit/VOC2012/JPEGImages/2009_004588.jpg 500 337 17 1 126 500 337 +11702 /data/VOCdevkit/VOC2012/JPEGImages/2009_004590.jpg 480 332 5 1 84 65 210 5 122 37 399 263 +11703 /data/VOCdevkit/VOC2012/JPEGImages/2009_004592.jpg 333 500 11 75 234 232 374 +11704 /data/VOCdevkit/VOC2012/JPEGImages/2009_004593.jpg 500 317 17 1 1 500 317 11 291 111 483 239 11 19 71 403 278 +11705 /data/VOCdevkit/VOC2012/JPEGImages/2009_004594.jpg 500 333 6 91 30 393 301 +11706 /data/VOCdevkit/VOC2012/JPEGImages/2009_004598.jpg 500 375 7 57 21 397 375 +11707 /data/VOCdevkit/VOC2012/JPEGImages/2009_004601.jpg 500 333 0 9 86 492 221 0 161 125 231 152 +11708 /data/VOCdevkit/VOC2012/JPEGImages/2009_004606.jpg 333 500 12 1 59 305 500 +11709 /data/VOCdevkit/VOC2012/JPEGImages/2009_004607.jpg 500 333 7 71 1 405 333 +11710 /data/VOCdevkit/VOC2012/JPEGImages/2009_004614.jpg 500 332 11 1 1 500 332 +11711 /data/VOCdevkit/VOC2012/JPEGImages/2009_004616.jpg 500 375 10 1 93 484 375 4 473 126 500 196 +11712 /data/VOCdevkit/VOC2012/JPEGImages/2009_004619.jpg 500 333 18 1 1 500 276 14 151 147 209 325 14 345 65 403 185 +11713 /data/VOCdevkit/VOC2012/JPEGImages/2009_004620.jpg 500 375 0 10 69 486 313 +11714 /data/VOCdevkit/VOC2012/JPEGImages/2009_004623.jpg 500 375 12 150 1 403 375 +11715 /data/VOCdevkit/VOC2012/JPEGImages/2009_004624.jpg 500 375 18 43 102 220 227 18 113 57 500 349 +11716 /data/VOCdevkit/VOC2012/JPEGImages/2009_004625.jpg 500 375 2 161 99 294 336 +11717 /data/VOCdevkit/VOC2012/JPEGImages/2009_004626.jpg 500 175 0 164 14 331 141 +11718 /data/VOCdevkit/VOC2012/JPEGImages/2009_004628.jpg 500 334 11 1 37 294 225 +11719 /data/VOCdevkit/VOC2012/JPEGImages/2009_004629.jpg 500 375 1 100 1 462 375 +11720 /data/VOCdevkit/VOC2012/JPEGImages/2009_004630.jpg 500 375 6 48 252 179 302 6 16 253 100 294 6 2 262 22 288 6 1 249 39 268 6 187 253 227 276 6 211 245 276 279 6 236 253 305 280 6 278 248 316 265 6 302 254 334 269 6 310 250 370 283 6 363 253 398 264 6 483 253 500 274 6 417 252 456 263 6 444 247 471 265 +11721 /data/VOCdevkit/VOC2012/JPEGImages/2009_004631.jpg 500 334 8 218 124 437 332 15 339 34 437 288 19 1 85 56 209 +11722 /data/VOCdevkit/VOC2012/JPEGImages/2009_004634.jpg 500 333 11 1 41 486 306 +11723 /data/VOCdevkit/VOC2012/JPEGImages/2009_004635.jpg 500 359 3 37 183 70 199 3 255 219 349 241 3 361 173 431 203 +11724 /data/VOCdevkit/VOC2012/JPEGImages/2009_004639.jpg 500 500 7 7 44 467 482 +11725 /data/VOCdevkit/VOC2012/JPEGImages/2009_004642.jpg 375 500 1 34 109 348 435 15 261 82 359 227 +11726 /data/VOCdevkit/VOC2012/JPEGImages/2009_004643.jpg 500 334 13 1 13 474 334 13 54 35 237 131 13 72 27 191 91 14 8 1 66 131 14 37 1 72 83 14 101 1 132 26 14 177 1 200 35 14 147 1 172 36 +11727 /data/VOCdevkit/VOC2012/JPEGImages/2009_004645.jpg 372 500 15 230 43 282 95 15 231 91 279 144 15 204 124 234 154 15 279 80 317 132 15 331 51 355 124 14 262 289 309 433 11 148 408 180 437 15 305 59 335 119 +11728 /data/VOCdevkit/VOC2012/JPEGImages/2009_004647.jpg 500 333 14 259 142 270 169 +11729 /data/VOCdevkit/VOC2012/JPEGImages/2009_004648.jpg 375 500 11 44 95 375 353 14 273 351 375 450 +11730 /data/VOCdevkit/VOC2012/JPEGImages/2009_004651.jpg 333 500 13 1 1 333 500 +11731 /data/VOCdevkit/VOC2012/JPEGImages/2009_004652.jpg 500 269 2 42 110 164 253 +11732 /data/VOCdevkit/VOC2012/JPEGImages/2009_004653.jpg 500 375 0 20 159 221 215 +11733 /data/VOCdevkit/VOC2012/JPEGImages/2009_004655.jpg 500 375 7 1 1 500 375 +11734 /data/VOCdevkit/VOC2012/JPEGImages/2009_004656.jpg 500 375 4 1 221 31 346 4 16 215 62 337 4 45 205 95 329 4 85 203 129 319 4 121 188 167 314 4 149 185 203 308 4 188 175 237 300 4 230 168 273 293 4 266 158 317 284 4 305 149 357 279 4 345 129 393 268 4 390 121 439 260 4 432 112 481 253 4 477 91 500 244 +11735 /data/VOCdevkit/VOC2012/JPEGImages/2009_004661.jpg 338 500 2 141 61 321 383 2 9 116 196 405 +11736 /data/VOCdevkit/VOC2012/JPEGImages/2009_004662.jpg 500 333 12 1 86 133 220 12 32 121 249 289 12 32 72 367 283 +11737 /data/VOCdevkit/VOC2012/JPEGImages/2009_004664.jpg 500 379 14 161 24 344 352 1 121 162 370 357 +11738 /data/VOCdevkit/VOC2012/JPEGImages/2009_004667.jpg 500 375 5 236 131 445 251 6 214 110 251 140 14 420 140 431 169 14 435 138 442 166 +11739 /data/VOCdevkit/VOC2012/JPEGImages/2009_004669.jpg 500 333 18 1 137 465 279 14 234 161 253 188 14 204 171 217 217 +11740 /data/VOCdevkit/VOC2012/JPEGImages/2009_004670.jpg 500 375 5 20 60 478 276 +11741 /data/VOCdevkit/VOC2012/JPEGImages/2009_004671.jpg 500 333 18 2 36 438 333 14 450 196 474 239 14 420 197 434 235 +11742 /data/VOCdevkit/VOC2012/JPEGImages/2009_004674.jpg 500 332 17 1 105 310 314 8 325 84 450 245 14 302 59 415 283 14 132 71 315 288 14 44 78 144 332 +11743 /data/VOCdevkit/VOC2012/JPEGImages/2009_004677.jpg 500 375 18 1 92 472 336 14 488 155 500 210 14 475 161 487 203 +11744 /data/VOCdevkit/VOC2012/JPEGImages/2009_004679.jpg 500 375 9 256 82 500 186 14 72 44 198 324 +11745 /data/VOCdevkit/VOC2012/JPEGImages/2009_004681.jpg 500 324 5 96 54 395 302 14 264 190 292 232 5 3 162 96 248 +11746 /data/VOCdevkit/VOC2012/JPEGImages/2009_004683.jpg 500 301 11 7 1 492 295 7 239 3 500 204 +11747 /data/VOCdevkit/VOC2012/JPEGImages/2009_004684.jpg 500 338 6 422 276 464 314 6 467 294 488 309 6 388 270 405 275 +11748 /data/VOCdevkit/VOC2012/JPEGImages/2009_004686.jpg 500 334 2 1 58 357 334 +11749 /data/VOCdevkit/VOC2012/JPEGImages/2009_004687.jpg 500 375 17 1 160 195 372 8 403 197 500 300 +11750 /data/VOCdevkit/VOC2012/JPEGImages/2009_004688.jpg 500 375 11 1 12 398 333 +11751 /data/VOCdevkit/VOC2012/JPEGImages/2009_004694.jpg 500 356 14 118 82 241 356 14 210 54 387 356 4 230 205 264 256 14 428 231 486 306 6 60 157 139 219 +11752 /data/VOCdevkit/VOC2012/JPEGImages/2009_004697.jpg 460 460 14 52 95 219 345 +11753 /data/VOCdevkit/VOC2012/JPEGImages/2009_004701.jpg 500 375 17 229 180 500 368 4 239 200 251 233 4 247 198 258 230 14 377 69 427 136 14 330 95 373 152 +11754 /data/VOCdevkit/VOC2012/JPEGImages/2009_004705.jpg 500 333 7 120 1 500 333 +11755 /data/VOCdevkit/VOC2012/JPEGImages/2009_004706.jpg 500 375 16 94 88 391 312 16 8 96 83 223 +11756 /data/VOCdevkit/VOC2012/JPEGImages/2009_004708.jpg 500 375 18 24 69 479 360 +11757 /data/VOCdevkit/VOC2012/JPEGImages/2009_004709.jpg 500 375 0 257 254 364 289 +11758 /data/VOCdevkit/VOC2012/JPEGImages/2009_004710.jpg 323 500 14 124 229 165 339 1 134 279 159 364 +11759 /data/VOCdevkit/VOC2012/JPEGImages/2009_004713.jpg 500 375 2 227 106 375 272 2 116 147 231 267 2 178 231 197 247 2 191 195 209 208 2 102 140 114 157 +11760 /data/VOCdevkit/VOC2012/JPEGImages/2009_004716.jpg 500 375 11 113 133 346 293 +11761 /data/VOCdevkit/VOC2012/JPEGImages/2009_004718.jpg 500 375 17 1 10 500 375 14 156 65 312 303 8 88 70 395 372 +11762 /data/VOCdevkit/VOC2012/JPEGImages/2009_004719.jpg 500 375 19 46 62 455 346 +11763 /data/VOCdevkit/VOC2012/JPEGImages/2009_004720.jpg 500 375 10 7 81 500 375 8 3 293 185 375 8 270 19 349 94 8 390 19 470 141 10 343 29 500 157 8 99 21 177 107 +11764 /data/VOCdevkit/VOC2012/JPEGImages/2009_004721.jpg 500 375 7 42 25 500 375 +11765 /data/VOCdevkit/VOC2012/JPEGImages/2009_004723.jpg 332 500 2 41 122 332 471 +11766 /data/VOCdevkit/VOC2012/JPEGImages/2009_004728.jpg 500 333 11 184 3 421 302 +11767 /data/VOCdevkit/VOC2012/JPEGImages/2009_004730.jpg 500 398 18 16 119 467 181 +11768 /data/VOCdevkit/VOC2012/JPEGImages/2009_004731.jpg 352 264 1 33 126 315 264 6 1 62 97 113 6 133 47 206 96 14 89 13 232 264 +11769 /data/VOCdevkit/VOC2012/JPEGImages/2009_004732.jpg 500 375 5 70 65 416 296 5 370 96 449 272 +11770 /data/VOCdevkit/VOC2012/JPEGImages/2009_004734.jpg 500 334 10 84 112 500 334 8 58 150 144 334 8 43 104 108 334 8 390 292 500 334 8 416 117 500 247 8 340 83 427 190 8 121 30 221 132 +11771 /data/VOCdevkit/VOC2012/JPEGImages/2009_004737.jpg 500 375 8 72 1 397 375 +11772 /data/VOCdevkit/VOC2012/JPEGImages/2009_004738.jpg 500 333 13 210 64 493 231 14 326 24 447 193 +11773 /data/VOCdevkit/VOC2012/JPEGImages/2009_004744.jpg 500 331 11 1 1 500 331 +11774 /data/VOCdevkit/VOC2012/JPEGImages/2009_004745.jpg 500 375 15 123 67 352 375 4 102 1 225 323 +11775 /data/VOCdevkit/VOC2012/JPEGImages/2009_004746.jpg 243 402 8 30 46 225 382 +11776 /data/VOCdevkit/VOC2012/JPEGImages/2009_004748.jpg 500 333 6 57 106 475 316 6 1 165 61 191 +11777 /data/VOCdevkit/VOC2012/JPEGImages/2009_004749.jpg 500 375 4 369 1 485 348 4 164 1 331 375 +11778 /data/VOCdevkit/VOC2012/JPEGImages/2009_004754.jpg 483 500 2 35 77 324 475 +11779 /data/VOCdevkit/VOC2012/JPEGImages/2009_004756.jpg 500 459 14 107 12 376 459 13 3 207 483 459 +11780 /data/VOCdevkit/VOC2012/JPEGImages/2009_004758.jpg 500 375 1 8 192 164 288 1 306 162 400 238 14 226 131 273 275 14 198 187 229 258 14 211 139 239 217 14 485 123 500 206 +11781 /data/VOCdevkit/VOC2012/JPEGImages/2009_004759.jpg 500 335 13 19 48 488 326 13 64 103 166 191 14 33 89 62 181 +11782 /data/VOCdevkit/VOC2012/JPEGImages/2009_004760.jpg 500 375 19 346 137 405 191 19 401 146 450 209 8 345 223 471 375 8 423 217 500 375 +11783 /data/VOCdevkit/VOC2012/JPEGImages/2009_004761.jpg 500 375 14 1 23 483 375 +11784 /data/VOCdevkit/VOC2012/JPEGImages/2009_004763.jpg 500 375 11 219 164 299 261 19 188 87 352 280 +11785 /data/VOCdevkit/VOC2012/JPEGImages/2009_004764.jpg 500 360 4 183 1 300 360 +11786 /data/VOCdevkit/VOC2012/JPEGImages/2009_004765.jpg 500 464 2 82 37 261 365 2 187 177 470 282 +11787 /data/VOCdevkit/VOC2012/JPEGImages/2009_004766.jpg 500 384 18 47 65 425 275 +11788 /data/VOCdevkit/VOC2012/JPEGImages/2009_004768.jpg 500 426 16 86 98 500 426 +11789 /data/VOCdevkit/VOC2012/JPEGImages/2009_004769.jpg 375 500 10 1 326 375 500 8 90 415 249 500 8 275 395 375 500 8 33 328 125 357 +11790 /data/VOCdevkit/VOC2012/JPEGImages/2009_004771.jpg 500 375 18 60 25 401 328 14 108 219 183 336 14 106 223 126 327 +11791 /data/VOCdevkit/VOC2012/JPEGImages/2009_004772.jpg 375 500 11 1 51 282 500 +11792 /data/VOCdevkit/VOC2012/JPEGImages/2009_004779.jpg 500 375 7 139 75 418 323 +11793 /data/VOCdevkit/VOC2012/JPEGImages/2009_004780.jpg 500 333 3 256 144 388 179 3 375 149 490 183 +11794 /data/VOCdevkit/VOC2012/JPEGImages/2009_004781.jpg 500 375 1 190 85 354 343 14 190 1 345 275 +11795 /data/VOCdevkit/VOC2012/JPEGImages/2009_004782.jpg 500 375 17 1 90 500 375 11 1 219 256 366 14 1 19 441 375 +11796 /data/VOCdevkit/VOC2012/JPEGImages/2009_004784.jpg 500 332 14 21 24 225 273 14 2 184 173 332 8 152 218 264 332 8 306 276 371 332 14 397 257 474 332 14 343 48 463 198 8 435 85 500 164 14 288 105 500 269 +11797 /data/VOCdevkit/VOC2012/JPEGImages/2009_004786.jpg 500 375 3 195 69 436 274 3 1 1 500 375 14 85 70 113 119 14 222 223 245 277 14 182 208 195 255 14 199 191 219 249 14 247 305 279 366 14 192 204 203 248 14 62 59 74 91 14 81 62 97 102 +11798 /data/VOCdevkit/VOC2012/JPEGImages/2009_004787.jpg 500 375 9 1 1 460 375 +11799 /data/VOCdevkit/VOC2012/JPEGImages/2009_004789.jpg 500 375 5 77 73 500 347 5 12 78 232 323 5 1 75 88 313 +11800 /data/VOCdevkit/VOC2012/JPEGImages/2009_004790.jpg 485 500 12 128 16 426 500 +11801 /data/VOCdevkit/VOC2012/JPEGImages/2009_004794.jpg 500 374 10 11 258 359 374 15 325 1 440 137 14 354 141 500 374 14 184 96 356 363 14 1 205 163 374 14 12 99 153 267 4 188 285 237 374 +11802 /data/VOCdevkit/VOC2012/JPEGImages/2009_004796.jpg 500 375 7 1 28 409 358 +11803 /data/VOCdevkit/VOC2012/JPEGImages/2009_004797.jpg 500 375 1 50 15 473 369 +11804 /data/VOCdevkit/VOC2012/JPEGImages/2009_004798.jpg 500 375 14 1 6 95 375 6 62 34 500 362 +11805 /data/VOCdevkit/VOC2012/JPEGImages/2009_004799.jpg 500 333 18 1 117 319 333 +11806 /data/VOCdevkit/VOC2012/JPEGImages/2009_004801.jpg 500 334 13 277 145 361 220 14 254 134 323 220 +11807 /data/VOCdevkit/VOC2012/JPEGImages/2009_004804.jpg 500 333 18 65 107 447 201 +11808 /data/VOCdevkit/VOC2012/JPEGImages/2009_004805.jpg 500 375 16 183 118 357 216 +11809 /data/VOCdevkit/VOC2012/JPEGImages/2009_004806.jpg 500 375 14 99 67 220 319 14 213 70 337 318 +11810 /data/VOCdevkit/VOC2012/JPEGImages/2009_004812.jpg 500 375 0 35 106 472 272 14 236 145 259 171 14 165 141 190 169 +11811 /data/VOCdevkit/VOC2012/JPEGImages/2009_004813.jpg 500 375 7 1 1 143 197 7 292 1 403 76 7 138 16 352 375 +11812 /data/VOCdevkit/VOC2012/JPEGImages/2009_004815.jpg 333 500 12 68 16 333 467 +11813 /data/VOCdevkit/VOC2012/JPEGImages/2009_004817.jpg 500 332 2 35 164 417 247 +11814 /data/VOCdevkit/VOC2012/JPEGImages/2009_004820.jpg 500 376 0 1 2 500 290 +11815 /data/VOCdevkit/VOC2012/JPEGImages/2009_004822.jpg 500 375 6 1 1 144 89 6 166 1 500 70 14 179 6 366 330 1 95 141 448 358 +11816 /data/VOCdevkit/VOC2012/JPEGImages/2009_004823.jpg 500 375 17 331 270 500 375 8 110 211 236 343 +11817 /data/VOCdevkit/VOC2012/JPEGImages/2009_004824.jpg 500 375 6 1 33 492 303 +11818 /data/VOCdevkit/VOC2012/JPEGImages/2009_004828.jpg 500 416 11 126 1 381 388 +11819 /data/VOCdevkit/VOC2012/JPEGImages/2009_004829.jpg 500 375 5 86 37 392 341 +11820 /data/VOCdevkit/VOC2012/JPEGImages/2009_004830.jpg 375 500 14 1 229 102 500 14 59 236 144 500 6 338 275 355 286 6 299 274 320 285 +11821 /data/VOCdevkit/VOC2012/JPEGImages/2009_004831.jpg 375 500 1 137 267 337 500 14 103 59 340 500 1 289 162 320 206 14 121 142 143 196 +11822 /data/VOCdevkit/VOC2012/JPEGImages/2009_004834.jpg 500 375 16 1 1 173 321 16 133 7 384 366 16 357 1 500 325 +11823 /data/VOCdevkit/VOC2012/JPEGImages/2009_004836.jpg 500 333 5 9 52 492 274 14 172 117 193 171 +11824 /data/VOCdevkit/VOC2012/JPEGImages/2009_004839.jpg 500 375 17 85 176 458 338 +11825 /data/VOCdevkit/VOC2012/JPEGImages/2009_004841.jpg 500 375 7 248 145 362 238 7 1 142 276 244 +11826 /data/VOCdevkit/VOC2012/JPEGImages/2009_004845.jpg 500 375 13 21 24 440 375 +11827 /data/VOCdevkit/VOC2012/JPEGImages/2009_004846.jpg 500 333 0 10 66 500 286 +11828 /data/VOCdevkit/VOC2012/JPEGImages/2009_004847.jpg 375 500 10 38 91 375 500 14 213 1 375 155 14 1 93 111 381 +11829 /data/VOCdevkit/VOC2012/JPEGImages/2009_004848.jpg 500 375 1 164 166 341 366 14 191 38 316 328 +11830 /data/VOCdevkit/VOC2012/JPEGImages/2009_004849.jpg 500 332 13 168 45 433 180 14 83 33 244 327 14 294 78 439 292 8 101 158 219 318 +11831 /data/VOCdevkit/VOC2012/JPEGImages/2009_004855.jpg 500 408 11 3 1 492 372 +11832 /data/VOCdevkit/VOC2012/JPEGImages/2009_004856.jpg 500 333 4 23 1 243 333 +11833 /data/VOCdevkit/VOC2012/JPEGImages/2009_004857.jpg 416 500 13 1 45 108 314 13 45 30 408 500 +11834 /data/VOCdevkit/VOC2012/JPEGImages/2009_004858.jpg 271 500 2 99 155 208 188 +11835 /data/VOCdevkit/VOC2012/JPEGImages/2009_004859.jpg 500 375 10 196 121 500 375 14 104 24 255 348 8 2 25 129 375 +11836 /data/VOCdevkit/VOC2012/JPEGImages/2009_004865.jpg 375 500 14 240 99 375 500 +11837 /data/VOCdevkit/VOC2012/JPEGImages/2009_004867.jpg 500 375 5 53 59 461 321 +11838 /data/VOCdevkit/VOC2012/JPEGImages/2009_004868.jpg 500 375 14 462 214 500 320 14 388 221 480 319 14 283 81 394 238 13 298 101 421 324 14 116 15 245 223 13 89 101 250 297 +11839 /data/VOCdevkit/VOC2012/JPEGImages/2009_004869.jpg 500 333 15 212 150 281 281 14 45 60 99 126 8 111 18 473 333 +11840 /data/VOCdevkit/VOC2012/JPEGImages/2009_004871.jpg 500 375 5 29 87 449 311 +11841 /data/VOCdevkit/VOC2012/JPEGImages/2009_004872.jpg 500 333 6 176 166 252 197 +11842 /data/VOCdevkit/VOC2012/JPEGImages/2009_004874.jpg 500 375 8 434 54 500 344 8 120 1 369 375 8 4 1 169 246 +11843 /data/VOCdevkit/VOC2012/JPEGImages/2009_004876.jpg 375 500 1 1 1 375 481 +11844 /data/VOCdevkit/VOC2012/JPEGImages/2009_004877.jpg 500 331 7 14 16 481 317 +11845 /data/VOCdevkit/VOC2012/JPEGImages/2009_004880.jpg 500 316 18 51 126 259 243 14 369 221 387 264 14 389 218 401 259 +11846 /data/VOCdevkit/VOC2012/JPEGImages/2009_004882.jpg 385 500 1 11 220 374 469 1 149 298 268 385 +11847 /data/VOCdevkit/VOC2012/JPEGImages/2009_004885.jpg 480 360 15 278 187 438 352 15 148 148 310 332 15 37 147 178 312 +11848 /data/VOCdevkit/VOC2012/JPEGImages/2009_004886.jpg 500 333 2 126 58 339 313 +11849 /data/VOCdevkit/VOC2012/JPEGImages/2009_004887.jpg 500 333 7 100 102 465 273 +11850 /data/VOCdevkit/VOC2012/JPEGImages/2009_004888.jpg 500 375 3 235 254 300 293 3 283 124 306 193 14 236 239 258 275 14 271 242 294 276 14 281 240 294 257 +11851 /data/VOCdevkit/VOC2012/JPEGImages/2009_004889.jpg 500 333 11 1 6 351 333 +11852 /data/VOCdevkit/VOC2012/JPEGImages/2009_004890.jpg 500 375 14 1 244 111 375 14 106 125 190 375 14 190 119 279 375 14 269 121 371 375 8 403 284 500 375 8 330 283 383 375 10 263 251 456 328 +11853 /data/VOCdevkit/VOC2012/JPEGImages/2009_004895.jpg 500 333 2 1 75 315 269 +11854 /data/VOCdevkit/VOC2012/JPEGImages/2009_004897.jpg 500 333 12 1 22 432 333 +11855 /data/VOCdevkit/VOC2012/JPEGImages/2009_004898.jpg 500 363 2 42 72 437 363 +11856 /data/VOCdevkit/VOC2012/JPEGImages/2009_004899.jpg 500 375 14 1 83 339 375 14 181 125 425 375 14 389 139 500 375 +11857 /data/VOCdevkit/VOC2012/JPEGImages/2009_004901.jpg 500 375 17 73 150 344 212 15 224 152 326 210 8 428 227 464 304 +11858 /data/VOCdevkit/VOC2012/JPEGImages/2009_004902.jpg 500 375 19 88 1 423 166 +11859 /data/VOCdevkit/VOC2012/JPEGImages/2009_004903.jpg 500 322 6 1 23 117 142 6 19 43 471 304 +11860 /data/VOCdevkit/VOC2012/JPEGImages/2009_004904.jpg 500 375 3 168 145 363 202 +11861 /data/VOCdevkit/VOC2012/JPEGImages/2009_004905.jpg 500 375 19 127 70 242 166 1 1 155 186 375 8 293 171 498 375 +11862 /data/VOCdevkit/VOC2012/JPEGImages/2009_004907.jpg 500 332 11 265 60 296 129 +11863 /data/VOCdevkit/VOC2012/JPEGImages/2009_004913.jpg 500 333 6 9 186 493 316 14 448 130 479 227 +11864 /data/VOCdevkit/VOC2012/JPEGImages/2009_004914.jpg 500 375 1 1 1 500 375 +11865 /data/VOCdevkit/VOC2012/JPEGImages/2009_004917.jpg 500 333 0 1 93 496 269 +11866 /data/VOCdevkit/VOC2012/JPEGImages/2009_004919.jpg 500 375 14 364 66 459 273 15 1 196 68 306 +11867 /data/VOCdevkit/VOC2012/JPEGImages/2009_004921.jpg 288 360 8 2 9 277 360 +11868 /data/VOCdevkit/VOC2012/JPEGImages/2009_004922.jpg 500 334 19 278 99 339 184 8 81 123 261 334 +11869 /data/VOCdevkit/VOC2012/JPEGImages/2009_004926.jpg 333 500 14 142 224 223 441 +11870 /data/VOCdevkit/VOC2012/JPEGImages/2009_004929.jpg 500 332 9 3 16 437 332 +11871 /data/VOCdevkit/VOC2012/JPEGImages/2009_004930.jpg 500 291 3 381 181 460 260 +11872 /data/VOCdevkit/VOC2012/JPEGImages/2009_004933.jpg 500 333 6 1 1 106 117 6 92 1 264 120 6 285 25 397 124 14 160 31 293 261 1 175 169 282 284 +11873 /data/VOCdevkit/VOC2012/JPEGImages/2009_004934.jpg 500 375 1 54 11 383 373 +11874 /data/VOCdevkit/VOC2012/JPEGImages/2009_004939.jpg 332 500 14 38 61 332 406 8 1 124 332 500 +11875 /data/VOCdevkit/VOC2012/JPEGImages/2009_004940.jpg 500 334 7 113 56 430 238 +11876 /data/VOCdevkit/VOC2012/JPEGImages/2009_004942.jpg 500 443 12 97 60 436 423 +11877 /data/VOCdevkit/VOC2012/JPEGImages/2009_004943.jpg 375 500 16 38 341 155 420 16 97 313 152 346 16 201 299 249 331 16 267 292 309 332 16 308 282 361 315 16 248 291 286 318 16 235 293 250 315 16 275 268 291 277 16 140 287 147 297 16 8 311 21 320 16 178 289 192 295 16 195 277 205 288 16 212 276 228 287 16 161 275 174 285 16 114 283 122 293 16 57 287 67 295 +11878 /data/VOCdevkit/VOC2012/JPEGImages/2009_004944.jpg 500 355 0 9 82 494 273 +11879 /data/VOCdevkit/VOC2012/JPEGImages/2009_004945.jpg 500 427 16 5 27 452 402 +11880 /data/VOCdevkit/VOC2012/JPEGImages/2009_004946.jpg 335 500 2 1 60 224 500 +11881 /data/VOCdevkit/VOC2012/JPEGImages/2009_004947.jpg 500 375 5 43 55 353 283 +11882 /data/VOCdevkit/VOC2012/JPEGImages/2009_004953.jpg 360 500 7 1 65 360 398 +11883 /data/VOCdevkit/VOC2012/JPEGImages/2009_004956.jpg 500 374 18 20 117 500 291 +11884 /data/VOCdevkit/VOC2012/JPEGImages/2009_004958.jpg 500 333 18 124 1 500 333 +11885 /data/VOCdevkit/VOC2012/JPEGImages/2009_004959.jpg 468 500 2 134 84 357 422 2 86 60 350 300 +11886 /data/VOCdevkit/VOC2012/JPEGImages/2009_004961.jpg 500 334 11 276 81 357 226 +11887 /data/VOCdevkit/VOC2012/JPEGImages/2009_004962.jpg 500 366 5 57 79 468 294 6 29 168 58 201 14 82 156 96 174 14 150 156 162 173 14 195 155 207 171 14 309 126 343 173 +11888 /data/VOCdevkit/VOC2012/JPEGImages/2009_004965.jpg 500 333 19 79 103 219 207 +11889 /data/VOCdevkit/VOC2012/JPEGImages/2009_004969.jpg 500 375 0 54 121 400 279 0 362 104 414 142 0 231 108 276 124 +11890 /data/VOCdevkit/VOC2012/JPEGImages/2009_004971.jpg 500 307 7 17 63 412 307 +11891 /data/VOCdevkit/VOC2012/JPEGImages/2009_004972.jpg 500 375 1 54 39 471 336 +11892 /data/VOCdevkit/VOC2012/JPEGImages/2009_004974.jpg 281 500 10 1 168 281 500 8 123 88 267 168 +11893 /data/VOCdevkit/VOC2012/JPEGImages/2009_004975.jpg 500 371 8 25 15 435 371 14 11 1 500 371 +11894 /data/VOCdevkit/VOC2012/JPEGImages/2009_004977.jpg 500 375 18 1 177 341 239 18 354 180 435 215 +11895 /data/VOCdevkit/VOC2012/JPEGImages/2009_004979.jpg 375 500 15 14 1 38 37 10 1 162 375 500 8 249 6 322 143 8 115 4 183 70 10 1 19 120 130 8 93 1 153 37 +11896 /data/VOCdevkit/VOC2012/JPEGImages/2009_004980.jpg 500 335 0 23 66 492 222 +11897 /data/VOCdevkit/VOC2012/JPEGImages/2009_004982.jpg 500 375 14 251 113 327 243 14 313 107 369 230 14 405 94 446 198 14 366 96 415 210 +11898 /data/VOCdevkit/VOC2012/JPEGImages/2009_004983.jpg 375 500 17 127 1 375 500 7 170 59 328 377 15 1 1 188 212 +11899 /data/VOCdevkit/VOC2012/JPEGImages/2009_004984.jpg 500 375 1 46 52 462 329 4 197 160 250 220 +11900 /data/VOCdevkit/VOC2012/JPEGImages/2009_004986.jpg 500 333 6 171 107 415 216 +11901 /data/VOCdevkit/VOC2012/JPEGImages/2009_004987.jpg 500 333 13 107 152 369 301 14 51 39 225 165 +11902 /data/VOCdevkit/VOC2012/JPEGImages/2009_004988.jpg 500 375 18 40 26 446 375 +11903 /data/VOCdevkit/VOC2012/JPEGImages/2009_004990.jpg 375 500 15 141 1 318 81 +11904 /data/VOCdevkit/VOC2012/JPEGImages/2009_004993.jpg 500 375 17 113 145 407 373 19 1 152 122 353 +11905 /data/VOCdevkit/VOC2012/JPEGImages/2009_004994.jpg 500 332 14 220 94 389 332 11 105 136 248 332 +11906 /data/VOCdevkit/VOC2012/JPEGImages/2009_004996.jpg 500 375 2 272 190 347 244 2 121 71 171 92 +11907 /data/VOCdevkit/VOC2012/JPEGImages/2009_004999.jpg 318 500 7 1 20 265 500 +11908 /data/VOCdevkit/VOC2012/JPEGImages/2009_005000.jpg 333 500 12 37 48 275 500 +11909 /data/VOCdevkit/VOC2012/JPEGImages/2009_005001.jpg 500 375 14 1 70 48 289 14 19 44 148 253 14 193 11 316 318 14 158 112 287 240 14 421 33 500 120 14 424 10 500 223 14 322 55 448 277 14 233 167 429 375 14 426 39 500 375 10 1 231 304 375 +11910 /data/VOCdevkit/VOC2012/JPEGImages/2009_005005.jpg 500 281 16 369 216 500 281 16 323 203 454 280 16 7 146 124 199 16 90 96 181 212 16 185 141 249 186 16 251 86 360 196 16 307 104 403 196 16 392 118 435 172 16 393 166 483 208 +11911 /data/VOCdevkit/VOC2012/JPEGImages/2009_005006.jpg 500 333 3 150 198 236 277 3 46 185 191 227 3 173 85 247 178 15 80 96 128 160 3 168 96 237 177 +11912 /data/VOCdevkit/VOC2012/JPEGImages/2009_005008.jpg 500 375 15 1 1 477 375 +11913 /data/VOCdevkit/VOC2012/JPEGImages/2009_005015.jpg 500 174 3 162 18 439 91 3 65 68 95 88 +11914 /data/VOCdevkit/VOC2012/JPEGImages/2009_005016.jpg 500 375 10 298 127 500 375 14 171 75 340 373 8 327 55 456 128 8 1 70 51 252 8 60 153 295 375 +11915 /data/VOCdevkit/VOC2012/JPEGImages/2009_005019.jpg 500 223 0 7 97 488 210 +11916 /data/VOCdevkit/VOC2012/JPEGImages/2009_005024.jpg 333 500 18 107 180 241 317 +11917 /data/VOCdevkit/VOC2012/JPEGImages/2009_005025.jpg 500 333 6 12 94 230 207 14 82 106 112 130 +11918 /data/VOCdevkit/VOC2012/JPEGImages/2009_005030.jpg 375 500 19 135 119 286 262 8 11 327 294 500 +11919 /data/VOCdevkit/VOC2012/JPEGImages/2009_005031.jpg 500 313 0 7 94 495 236 +11920 /data/VOCdevkit/VOC2012/JPEGImages/2009_005033.jpg 357 500 7 1 16 357 486 +11921 /data/VOCdevkit/VOC2012/JPEGImages/2009_005035.jpg 500 334 14 138 81 232 230 12 157 123 218 317 +11922 /data/VOCdevkit/VOC2012/JPEGImages/2009_005036.jpg 500 375 0 6 159 489 299 6 368 191 488 238 6 50 189 87 211 +11923 /data/VOCdevkit/VOC2012/JPEGImages/2009_005037.jpg 500 331 7 221 61 440 242 +11924 /data/VOCdevkit/VOC2012/JPEGImages/2009_005038.jpg 375 500 10 1 367 375 500 4 92 270 166 500 14 56 63 375 416 15 64 190 125 262 4 297 155 315 194 14 335 152 375 215 +11925 /data/VOCdevkit/VOC2012/JPEGImages/2009_005040.jpg 500 361 2 250 71 389 243 +11926 /data/VOCdevkit/VOC2012/JPEGImages/2009_005042.jpg 500 375 19 350 24 500 162 19 134 7 240 116 19 52 1 136 53 19 1 1 55 65 8 210 247 500 375 +11927 /data/VOCdevkit/VOC2012/JPEGImages/2009_005044.jpg 321 500 4 82 53 262 361 +11928 /data/VOCdevkit/VOC2012/JPEGImages/2009_005045.jpg 500 375 14 8 130 271 375 14 248 141 393 355 14 372 159 500 375 14 241 42 374 257 14 89 46 229 251 14 23 149 85 277 +11929 /data/VOCdevkit/VOC2012/JPEGImages/2009_005051.jpg 500 355 7 44 27 500 262 +11930 /data/VOCdevkit/VOC2012/JPEGImages/2009_005055.jpg 257 198 11 79 50 173 173 +11931 /data/VOCdevkit/VOC2012/JPEGImages/2009_005056.jpg 500 333 14 1 35 469 333 14 405 123 491 238 14 352 113 431 190 +11932 /data/VOCdevkit/VOC2012/JPEGImages/2009_005057.jpg 375 500 14 21 132 166 500 4 66 159 84 193 14 185 138 288 443 4 253 176 272 216 +11933 /data/VOCdevkit/VOC2012/JPEGImages/2009_005060.jpg 500 375 5 84 52 492 285 6 29 189 106 225 +11934 /data/VOCdevkit/VOC2012/JPEGImages/2009_005061.jpg 384 500 18 26 164 343 456 +11935 /data/VOCdevkit/VOC2012/JPEGImages/2009_005062.jpg 410 410 19 83 46 183 137 8 39 172 186 399 +11936 /data/VOCdevkit/VOC2012/JPEGImages/2009_005064.jpg 500 354 1 42 51 468 308 +11937 /data/VOCdevkit/VOC2012/JPEGImages/2009_005068.jpg 500 340 9 100 121 410 291 9 244 78 312 152 +11938 /data/VOCdevkit/VOC2012/JPEGImages/2009_005069.jpg 375 500 10 1 139 375 500 15 1 1 123 150 8 163 104 257 170 8 1 130 92 272 +11939 /data/VOCdevkit/VOC2012/JPEGImages/2009_005070.jpg 500 333 19 1 242 83 333 15 123 159 239 314 17 393 250 500 333 +11940 /data/VOCdevkit/VOC2012/JPEGImages/2009_005073.jpg 500 332 11 133 129 249 223 11 242 148 388 239 11 230 136 343 237 +11941 /data/VOCdevkit/VOC2012/JPEGImages/2009_005075.jpg 500 333 0 3 23 500 333 +11942 /data/VOCdevkit/VOC2012/JPEGImages/2009_005076.jpg 500 333 2 257 158 395 305 2 362 125 468 250 +11943 /data/VOCdevkit/VOC2012/JPEGImages/2009_005078.jpg 500 358 13 121 125 368 264 14 185 99 336 194 +11944 /data/VOCdevkit/VOC2012/JPEGImages/2009_005079.jpg 342 500 8 21 1 342 500 +11945 /data/VOCdevkit/VOC2012/JPEGImages/2009_005080.jpg 500 375 8 287 164 370 278 8 1 163 61 217 8 98 231 232 375 8 80 207 185 375 10 1 212 148 375 +11946 /data/VOCdevkit/VOC2012/JPEGImages/2009_005081.jpg 500 333 9 3 7 430 333 +11947 /data/VOCdevkit/VOC2012/JPEGImages/2009_005082.jpg 500 375 14 249 17 500 375 4 333 124 399 179 1 308 292 500 375 1 12 304 221 375 14 1 13 233 375 14 136 153 216 375 14 428 245 500 375 +11948 /data/VOCdevkit/VOC2012/JPEGImages/2009_005083.jpg 500 374 7 210 137 283 187 +11949 /data/VOCdevkit/VOC2012/JPEGImages/2009_005084.jpg 500 339 18 43 142 500 266 +11950 /data/VOCdevkit/VOC2012/JPEGImages/2009_005085.jpg 500 333 6 117 114 442 333 14 257 151 299 190 +11951 /data/VOCdevkit/VOC2012/JPEGImages/2009_005086.jpg 500 367 13 241 179 466 333 6 385 163 500 242 15 324 122 350 178 +11952 /data/VOCdevkit/VOC2012/JPEGImages/2009_005087.jpg 400 500 1 63 143 245 278 14 72 94 214 322 +11953 /data/VOCdevkit/VOC2012/JPEGImages/2009_005089.jpg 500 374 16 121 271 201 324 +11954 /data/VOCdevkit/VOC2012/JPEGImages/2009_005094.jpg 375 500 14 121 344 148 428 6 1 356 39 384 +11955 /data/VOCdevkit/VOC2012/JPEGImages/2009_005095.jpg 500 390 7 102 63 407 335 +11956 /data/VOCdevkit/VOC2012/JPEGImages/2009_005098.jpg 500 375 1 118 1 454 188 14 38 2 91 119 14 372 1 434 112 +11957 /data/VOCdevkit/VOC2012/JPEGImages/2009_005102.jpg 500 414 11 32 68 279 397 +11958 /data/VOCdevkit/VOC2012/JPEGImages/2009_005103.jpg 500 375 1 65 45 413 375 14 217 68 355 320 +11959 /data/VOCdevkit/VOC2012/JPEGImages/2009_005104.jpg 500 333 6 66 35 455 311 +11960 /data/VOCdevkit/VOC2012/JPEGImages/2009_005107.jpg 500 375 11 75 64 329 298 +11961 /data/VOCdevkit/VOC2012/JPEGImages/2009_005111.jpg 500 333 0 17 69 485 230 +11962 /data/VOCdevkit/VOC2012/JPEGImages/2009_005114.jpg 500 387 2 80 148 315 258 +11963 /data/VOCdevkit/VOC2012/JPEGImages/2009_005118.jpg 375 500 3 19 166 358 443 +11964 /data/VOCdevkit/VOC2012/JPEGImages/2009_005119.jpg 375 500 7 135 177 288 324 +11965 /data/VOCdevkit/VOC2012/JPEGImages/2009_005120.jpg 500 323 0 15 97 487 230 +11966 /data/VOCdevkit/VOC2012/JPEGImages/2009_005126.jpg 500 375 18 27 115 500 264 +11967 /data/VOCdevkit/VOC2012/JPEGImages/2009_005127.jpg 500 333 0 10 162 261 257 0 305 211 391 248 +11968 /data/VOCdevkit/VOC2012/JPEGImages/2009_005128.jpg 375 500 18 1 173 360 365 +11969 /data/VOCdevkit/VOC2012/JPEGImages/2009_005129.jpg 500 318 3 1 1 412 239 +11970 /data/VOCdevkit/VOC2012/JPEGImages/2009_005130.jpg 500 375 12 1 65 351 375 +11971 /data/VOCdevkit/VOC2012/JPEGImages/2009_005131.jpg 374 500 2 23 84 320 333 +11972 /data/VOCdevkit/VOC2012/JPEGImages/2009_005133.jpg 500 375 6 445 196 500 235 6 390 191 468 215 +11973 /data/VOCdevkit/VOC2012/JPEGImages/2009_005137.jpg 500 368 2 248 70 415 283 +11974 /data/VOCdevkit/VOC2012/JPEGImages/2009_005140.jpg 500 375 14 1 1 500 374 +11975 /data/VOCdevkit/VOC2012/JPEGImages/2009_005141.jpg 500 333 14 97 12 316 333 +11976 /data/VOCdevkit/VOC2012/JPEGImages/2009_005142.jpg 500 333 0 1 25 500 321 +11977 /data/VOCdevkit/VOC2012/JPEGImages/2009_005144.jpg 500 334 1 1 1 499 334 +11978 /data/VOCdevkit/VOC2012/JPEGImages/2009_005145.jpg 500 500 10 6 340 500 500 8 184 224 353 341 +11979 /data/VOCdevkit/VOC2012/JPEGImages/2009_005147.jpg 500 375 13 68 129 329 279 13 259 100 418 205 14 52 48 108 228 4 56 83 68 114 +11980 /data/VOCdevkit/VOC2012/JPEGImages/2009_005148.jpg 320 240 18 1 72 320 191 +11981 /data/VOCdevkit/VOC2012/JPEGImages/2009_005149.jpg 500 375 18 1 108 500 219 18 1 1 500 57 +11982 /data/VOCdevkit/VOC2012/JPEGImages/2009_005150.jpg 255 500 4 9 8 247 497 +11983 /data/VOCdevkit/VOC2012/JPEGImages/2009_005152.jpg 500 375 2 231 160 297 213 +11984 /data/VOCdevkit/VOC2012/JPEGImages/2009_005153.jpg 500 375 11 74 133 357 319 +11985 /data/VOCdevkit/VOC2012/JPEGImages/2009_005154.jpg 500 375 1 29 4 433 322 6 200 38 474 213 6 459 92 500 170 +11986 /data/VOCdevkit/VOC2012/JPEGImages/2009_005155.jpg 500 400 13 26 136 477 368 14 133 110 346 267 +11987 /data/VOCdevkit/VOC2012/JPEGImages/2009_005156.jpg 500 434 1 43 29 422 248 +11988 /data/VOCdevkit/VOC2012/JPEGImages/2009_005158.jpg 375 500 7 90 91 260 404 +11989 /data/VOCdevkit/VOC2012/JPEGImages/2009_005160.jpg 500 370 7 2 10 297 370 +11990 /data/VOCdevkit/VOC2012/JPEGImages/2009_005161.jpg 448 500 12 20 19 437 416 +11991 /data/VOCdevkit/VOC2012/JPEGImages/2009_005162.jpg 356 500 11 1 73 356 500 +11992 /data/VOCdevkit/VOC2012/JPEGImages/2009_005163.jpg 328 500 8 25 60 315 486 +11993 /data/VOCdevkit/VOC2012/JPEGImages/2009_005165.jpg 375 500 8 250 293 375 500 8 1 99 106 323 15 203 31 325 309 10 15 119 375 474 +11994 /data/VOCdevkit/VOC2012/JPEGImages/2009_005168.jpg 500 342 6 483 160 500 186 6 359 154 404 181 14 332 155 347 188 5 111 103 313 195 14 34 139 54 197 +11995 /data/VOCdevkit/VOC2012/JPEGImages/2009_005170.jpg 500 375 15 1 1 500 375 +11996 /data/VOCdevkit/VOC2012/JPEGImages/2009_005171.jpg 500 375 10 211 265 500 375 8 291 293 477 375 8 434 216 500 281 8 267 217 327 303 8 149 174 260 375 8 4 181 145 375 4 172 158 182 180 4 2 159 12 201 4 120 166 138 184 +11997 /data/VOCdevkit/VOC2012/JPEGImages/2009_005172.jpg 500 375 1 112 54 500 375 14 1 143 157 375 +11998 /data/VOCdevkit/VOC2012/JPEGImages/2009_005177.jpg 500 375 7 239 167 474 334 7 11 137 256 329 7 159 76 415 193 +11999 /data/VOCdevkit/VOC2012/JPEGImages/2009_005178.jpg 500 417 1 39 33 457 396 +12000 /data/VOCdevkit/VOC2012/JPEGImages/2009_005181.jpg 500 375 14 149 1 500 375 +12001 /data/VOCdevkit/VOC2012/JPEGImages/2009_005183.jpg 500 375 14 79 68 122 163 14 110 60 183 341 14 173 64 201 132 14 26 86 45 122 14 238 63 265 97 14 470 71 489 97 4 327 236 349 285 8 241 164 304 205 8 180 159 233 207 +12002 /data/VOCdevkit/VOC2012/JPEGImages/2009_005185.jpg 500 308 14 1 49 440 277 11 257 224 384 270 +12003 /data/VOCdevkit/VOC2012/JPEGImages/2009_005189.jpg 500 334 0 21 91 487 214 +12004 /data/VOCdevkit/VOC2012/JPEGImages/2009_005190.jpg 341 500 4 124 113 187 356 +12005 /data/VOCdevkit/VOC2012/JPEGImages/2009_005191.jpg 500 333 14 265 1 500 333 2 127 56 377 333 +12006 /data/VOCdevkit/VOC2012/JPEGImages/2009_005193.jpg 500 375 16 94 27 417 330 +12007 /data/VOCdevkit/VOC2012/JPEGImages/2009_005194.jpg 500 375 13 133 219 163 290 13 116 218 139 268 +12008 /data/VOCdevkit/VOC2012/JPEGImages/2009_005198.jpg 500 356 2 116 85 433 241 +12009 /data/VOCdevkit/VOC2012/JPEGImages/2009_005201.jpg 500 375 5 18 68 486 295 +12010 /data/VOCdevkit/VOC2012/JPEGImages/2009_005202.jpg 500 375 10 1 90 371 375 8 322 227 500 375 8 30 168 250 375 8 250 53 321 102 8 278 102 430 291 8 28 69 111 160 +12011 /data/VOCdevkit/VOC2012/JPEGImages/2009_005203.jpg 500 333 1 233 116 334 259 14 236 16 342 233 14 411 132 441 185 +12012 /data/VOCdevkit/VOC2012/JPEGImages/2009_005204.jpg 333 500 8 1 133 332 500 +12013 /data/VOCdevkit/VOC2012/JPEGImages/2009_005205.jpg 375 500 10 114 139 308 218 8 119 145 143 169 8 276 147 299 174 8 282 170 318 246 8 98 165 132 245 8 53 215 111 320 8 298 220 359 323 8 6 265 194 500 8 204 298 375 500 10 49 211 359 500 14 313 12 375 337 +12014 /data/VOCdevkit/VOC2012/JPEGImages/2009_005210.jpg 500 333 0 1 93 500 231 +12015 /data/VOCdevkit/VOC2012/JPEGImages/2009_005211.jpg 500 375 7 1 103 369 339 +12016 /data/VOCdevkit/VOC2012/JPEGImages/2009_005215.jpg 500 332 6 371 206 426 219 0 35 78 464 219 +12017 /data/VOCdevkit/VOC2012/JPEGImages/2009_005216.jpg 333 500 14 26 72 91 264 14 36 121 141 363 14 126 102 213 410 14 199 92 329 408 8 1 16 333 500 +12018 /data/VOCdevkit/VOC2012/JPEGImages/2009_005217.jpg 500 375 12 59 77 407 375 14 225 1 365 262 +12019 /data/VOCdevkit/VOC2012/JPEGImages/2009_005218.jpg 500 375 0 57 86 453 260 +12020 /data/VOCdevkit/VOC2012/JPEGImages/2009_005219.jpg 500 375 7 71 1 308 301 +12021 /data/VOCdevkit/VOC2012/JPEGImages/2009_005220.jpg 500 333 18 37 48 454 285 +12022 /data/VOCdevkit/VOC2012/JPEGImages/2009_005221.jpg 400 334 19 89 47 273 248 +12023 /data/VOCdevkit/VOC2012/JPEGImages/2009_005222.jpg 500 333 14 271 42 450 333 +12024 /data/VOCdevkit/VOC2012/JPEGImages/2009_005225.jpg 500 375 11 273 190 288 218 +12025 /data/VOCdevkit/VOC2012/JPEGImages/2009_005229.jpg 500 333 9 8 27 32 153 14 292 37 468 319 9 27 14 68 159 9 32 3 97 173 9 202 1 500 280 9 148 1 230 248 9 87 1 157 210 9 72 1 121 175 +12026 /data/VOCdevkit/VOC2012/JPEGImages/2009_005231.jpg 500 375 5 92 170 273 244 5 1 181 97 226 +12027 /data/VOCdevkit/VOC2012/JPEGImages/2009_005232.jpg 500 388 0 14 72 455 324 +12028 /data/VOCdevkit/VOC2012/JPEGImages/2009_005234.jpg 500 333 2 162 158 237 270 +12029 /data/VOCdevkit/VOC2012/JPEGImages/2009_005236.jpg 355 380 7 15 15 259 327 7 105 159 334 377 +12030 /data/VOCdevkit/VOC2012/JPEGImages/2009_005239.jpg 500 375 3 357 95 463 280 14 412 244 441 264 3 29 55 146 282 14 87 237 118 264 3 90 105 177 265 14 130 228 152 251 +12031 /data/VOCdevkit/VOC2012/JPEGImages/2009_005240.jpg 500 375 19 142 87 204 141 17 217 169 500 375 +12032 /data/VOCdevkit/VOC2012/JPEGImages/2009_005242.jpg 500 333 6 23 34 500 333 14 223 76 286 134 +12033 /data/VOCdevkit/VOC2012/JPEGImages/2009_005246.jpg 500 306 18 131 122 364 239 +12034 /data/VOCdevkit/VOC2012/JPEGImages/2009_005247.jpg 500 333 14 149 28 230 203 13 120 80 342 225 +12035 /data/VOCdevkit/VOC2012/JPEGImages/2009_005251.jpg 333 500 7 1 1 333 500 +12036 /data/VOCdevkit/VOC2012/JPEGImages/2009_005256.jpg 500 375 19 1 1 308 274 +12037 /data/VOCdevkit/VOC2012/JPEGImages/2009_005257.jpg 500 374 14 39 141 253 285 8 295 214 440 374 8 50 199 177 324 +12038 /data/VOCdevkit/VOC2012/JPEGImages/2009_005260.jpg 500 375 2 202 93 322 253 +12039 /data/VOCdevkit/VOC2012/JPEGImages/2009_005262.jpg 375 500 2 79 152 364 407 +12040 /data/VOCdevkit/VOC2012/JPEGImages/2009_005263.jpg 333 500 8 45 142 314 416 +12041 /data/VOCdevkit/VOC2012/JPEGImages/2009_005265.jpg 500 375 1 131 180 375 354 14 187 70 289 329 +12042 /data/VOCdevkit/VOC2012/JPEGImages/2009_005267.jpg 500 375 9 205 193 314 230 +12043 /data/VOCdevkit/VOC2012/JPEGImages/2009_005268.jpg 333 500 3 48 412 86 457 +12044 /data/VOCdevkit/VOC2012/JPEGImages/2009_005269.jpg 383 500 12 40 30 184 429 12 131 105 316 441 14 243 86 337 179 14 103 56 148 153 +12045 /data/VOCdevkit/VOC2012/JPEGImages/2009_005272.jpg 375 500 11 94 59 343 477 +12046 /data/VOCdevkit/VOC2012/JPEGImages/2009_005278.jpg 500 375 10 34 219 334 375 8 209 220 338 375 8 276 189 327 245 8 205 187 244 232 8 67 194 117 236 8 16 217 127 375 8 52 227 190 375 8 27 182 55 222 8 1 189 14 229 15 346 1 408 35 15 204 16 286 88 15 361 189 430 257 4 347 51 363 92 4 340 53 353 91 4 333 55 345 93 15 376 45 422 80 +12047 /data/VOCdevkit/VOC2012/JPEGImages/2009_005279.jpg 500 366 5 215 149 362 285 14 455 219 478 282 6 425 247 500 278 14 126 178 218 366 14 32 180 96 366 5 6 126 202 300 +12048 /data/VOCdevkit/VOC2012/JPEGImages/2009_005282.jpg 333 500 2 42 124 307 493 +12049 /data/VOCdevkit/VOC2012/JPEGImages/2009_005286.jpg 500 281 15 387 99 485 230 15 368 185 432 235 15 244 168 273 197 15 255 110 333 182 8 267 141 350 215 14 247 53 282 145 8 310 141 431 226 +12050 /data/VOCdevkit/VOC2012/JPEGImages/2009_005287.jpg 500 375 18 9 124 496 294 +12051 /data/VOCdevkit/VOC2012/JPEGImages/2009_005288.jpg 419 500 19 361 140 419 231 8 1 208 78 336 4 127 225 159 316 +12052 /data/VOCdevkit/VOC2012/JPEGImages/2009_005292.jpg 500 333 18 44 113 369 284 +12053 /data/VOCdevkit/VOC2012/JPEGImages/2009_005293.jpg 500 375 6 452 229 486 248 6 390 229 442 260 5 382 201 429 253 5 241 184 384 277 6 130 239 250 299 5 27 177 247 278 6 464 225 493 244 +12054 /data/VOCdevkit/VOC2012/JPEGImages/2009_005294.jpg 500 400 6 77 210 187 266 6 318 220 444 296 6 36 212 328 375 +12055 /data/VOCdevkit/VOC2012/JPEGImages/2009_005297.jpg 500 375 14 291 72 431 375 +12056 /data/VOCdevkit/VOC2012/JPEGImages/2009_005299.jpg 500 375 7 27 56 500 289 17 1 1 500 375 +12057 /data/VOCdevkit/VOC2012/JPEGImages/2009_005300.jpg 375 500 8 222 263 339 461 14 239 237 344 421 1 70 140 220 252 1 263 149 375 255 +12058 /data/VOCdevkit/VOC2012/JPEGImages/2009_005302.jpg 500 381 4 36 103 87 274 4 108 107 156 279 4 161 108 211 284 4 213 112 261 291 4 276 110 325 294 4 336 106 391 296 4 389 111 444 297 4 451 113 500 293 +12059 /data/VOCdevkit/VOC2012/JPEGImages/2009_005303.jpg 500 375 18 39 21 500 296 18 1 89 54 159 +12060 /data/VOCdevkit/VOC2012/JPEGImages/2009_005307.jpg 500 333 9 90 93 455 239 +12061 /data/VOCdevkit/VOC2012/JPEGImages/2009_005308.jpg 500 333 4 177 218 207 321 +12062 /data/VOCdevkit/VOC2012/JPEGImages/2009_005309.jpg 500 375 14 211 137 320 243 +12063 /data/VOCdevkit/VOC2012/JPEGImages/2009_005310.jpg 500 390 19 124 214 192 279 15 50 87 151 233 15 181 204 238 243 15 136 165 180 222 15 232 204 274 248 15 301 214 334 253 15 400 147 475 243 15 379 252 464 364 15 326 198 366 257 15 310 324 393 390 +12064 /data/VOCdevkit/VOC2012/JPEGImages/2009_005311.jpg 500 375 10 161 200 364 301 8 176 300 298 375 14 273 205 432 339 8 297 268 413 375 14 412 177 465 273 8 427 225 463 329 8 85 250 186 374 14 74 175 232 307 14 233 148 273 200 14 313 165 369 235 14 94 166 151 244 14 156 157 204 210 14 299 157 350 216 4 215 196 225 230 4 170 184 180 210 14 110 160 179 244 8 66 192 87 270 +12065 /data/VOCdevkit/VOC2012/JPEGImages/2010_000001.jpg 500 333 7 123 13 341 313 10 1 219 500 333 10 1 1 234 188 +12066 /data/VOCdevkit/VOC2012/JPEGImages/2010_000002.jpg 500 430 16 102 46 411 400 +12067 /data/VOCdevkit/VOC2012/JPEGImages/2010_000003.jpg 500 375 11 160 156 344 307 8 17 52 455 375 +12068 /data/VOCdevkit/VOC2012/JPEGImages/2010_000009.jpg 500 333 7 160 30 345 312 +12069 /data/VOCdevkit/VOC2012/JPEGImages/2010_000014.jpg 500 375 11 74 25 394 359 +12070 /data/VOCdevkit/VOC2012/JPEGImages/2010_000015.jpg 500 375 15 284 121 430 301 15 207 235 316 345 15 106 215 211 318 15 91 43 263 195 8 342 32 500 375 +12071 /data/VOCdevkit/VOC2012/JPEGImages/2010_000018.jpg 500 375 17 137 147 500 375 8 1 154 132 374 14 147 163 394 375 +12072 /data/VOCdevkit/VOC2012/JPEGImages/2010_000020.jpg 333 500 11 85 207 211 489 14 58 1 333 500 +12073 /data/VOCdevkit/VOC2012/JPEGImages/2010_000023.jpg 500 375 2 168 66 322 341 +12074 /data/VOCdevkit/VOC2012/JPEGImages/2010_000024.jpg 500 333 3 168 72 461 234 3 1 160 169 235 +12075 /data/VOCdevkit/VOC2012/JPEGImages/2010_000026.jpg 500 375 11 119 12 425 375 +12076 /data/VOCdevkit/VOC2012/JPEGImages/2010_000027.jpg 375 500 13 3 68 351 474 15 298 153 375 245 15 162 137 242 184 +12077 /data/VOCdevkit/VOC2012/JPEGImages/2010_000031.jpg 382 500 6 131 2 230 56 6 18 34 240 194 6 4 230 276 500 +12078 /data/VOCdevkit/VOC2012/JPEGImages/2010_000033.jpg 500 333 11 83 9 377 306 +12079 /data/VOCdevkit/VOC2012/JPEGImages/2010_000035.jpg 500 319 13 14 6 486 317 +12080 /data/VOCdevkit/VOC2012/JPEGImages/2010_000036.jpg 500 375 6 33 93 450 318 +12081 /data/VOCdevkit/VOC2012/JPEGImages/2010_000038.jpg 500 476 12 49 124 466 380 14 161 47 287 216 +12082 /data/VOCdevkit/VOC2012/JPEGImages/2010_000043.jpg 500 333 7 125 101 407 251 +12083 /data/VOCdevkit/VOC2012/JPEGImages/2010_000045.jpg 375 500 11 1 1 374 499 +12084 /data/VOCdevkit/VOC2012/JPEGImages/2010_000048.jpg 375 500 7 1 60 375 500 +12085 /data/VOCdevkit/VOC2012/JPEGImages/2010_000050.jpg 375 500 4 138 51 374 483 +12086 /data/VOCdevkit/VOC2012/JPEGImages/2010_000052.jpg 500 375 16 92 125 348 308 14 197 59 324 220 +12087 /data/VOCdevkit/VOC2012/JPEGImages/2010_000053.jpg 500 375 19 61 57 498 320 +12088 /data/VOCdevkit/VOC2012/JPEGImages/2010_000054.jpg 500 360 7 1 19 466 353 +12089 /data/VOCdevkit/VOC2012/JPEGImages/2010_000055.jpg 500 375 14 21 68 500 375 +12090 /data/VOCdevkit/VOC2012/JPEGImages/2010_000056.jpg 500 380 1 50 73 457 268 +12091 /data/VOCdevkit/VOC2012/JPEGImages/2010_000061.jpg 500 361 11 45 145 164 361 11 87 40 186 209 11 309 125 459 361 +12092 /data/VOCdevkit/VOC2012/JPEGImages/2010_000063.jpg 500 375 9 214 70 500 299 9 42 60 297 265 +12093 /data/VOCdevkit/VOC2012/JPEGImages/2010_000065.jpg 375 500 1 185 194 285 403 +12094 /data/VOCdevkit/VOC2012/JPEGImages/2010_000067.jpg 375 500 7 161 218 301 293 +12095 /data/VOCdevkit/VOC2012/JPEGImages/2010_000069.jpg 500 355 5 47 6 463 341 +12096 /data/VOCdevkit/VOC2012/JPEGImages/2010_000071.jpg 333 500 12 1 207 149 428 +12097 /data/VOCdevkit/VOC2012/JPEGImages/2010_000072.jpg 500 375 11 117 58 437 375 +12098 /data/VOCdevkit/VOC2012/JPEGImages/2010_000073.jpg 500 333 6 10 34 500 333 +12099 /data/VOCdevkit/VOC2012/JPEGImages/2010_000074.jpg 500 351 11 207 135 460 244 14 1 54 432 202 +12100 /data/VOCdevkit/VOC2012/JPEGImages/2010_000075.jpg 469 500 2 55 41 432 500 +12101 /data/VOCdevkit/VOC2012/JPEGImages/2010_000076.jpg 500 332 6 470 64 500 99 13 210 138 285 195 14 230 115 280 175 +12102 /data/VOCdevkit/VOC2012/JPEGImages/2010_000079.jpg 500 375 11 195 89 420 324 11 117 225 232 347 +12103 /data/VOCdevkit/VOC2012/JPEGImages/2010_000080.jpg 500 333 18 1 162 203 327 18 163 162 422 333 +12104 /data/VOCdevkit/VOC2012/JPEGImages/2010_000082.jpg 500 375 11 66 21 410 349 +12105 /data/VOCdevkit/VOC2012/JPEGImages/2010_000083.jpg 500 334 1 43 212 127 310 14 81 154 137 301 +12106 /data/VOCdevkit/VOC2012/JPEGImages/2010_000084.jpg 500 375 3 101 116 347 235 14 166 131 201 183 14 256 85 318 133 +12107 /data/VOCdevkit/VOC2012/JPEGImages/2010_000085.jpg 500 333 18 1 77 500 237 +12108 /data/VOCdevkit/VOC2012/JPEGImages/2010_000087.jpg 500 375 13 1 58 465 323 14 432 83 448 131 14 467 90 500 176 +12109 /data/VOCdevkit/VOC2012/JPEGImages/2010_000088.jpg 500 375 10 1 131 500 374 +12110 /data/VOCdevkit/VOC2012/JPEGImages/2010_000089.jpg 500 375 16 199 111 399 252 4 147 97 205 137 14 1 1 220 331 +12111 /data/VOCdevkit/VOC2012/JPEGImages/2010_000090.jpg 500 375 11 139 34 380 360 8 11 1 464 375 +12112 /data/VOCdevkit/VOC2012/JPEGImages/2010_000091.jpg 500 333 0 167 132 288 229 +12113 /data/VOCdevkit/VOC2012/JPEGImages/2010_000095.jpg 375 500 12 163 127 301 327 14 225 159 324 348 14 10 156 89 324 14 57 149 88 297 14 88 149 124 289 14 115 189 145 284 14 170 192 195 285 +12114 /data/VOCdevkit/VOC2012/JPEGImages/2010_000097.jpg 500 375 17 1 90 396 344 14 72 59 255 351 14 221 45 361 350 14 351 104 500 341 +12115 /data/VOCdevkit/VOC2012/JPEGImages/2010_000098.jpg 500 375 11 146 154 419 353 +12116 /data/VOCdevkit/VOC2012/JPEGImages/2010_000099.jpg 500 422 7 46 55 465 394 +12117 /data/VOCdevkit/VOC2012/JPEGImages/2010_000103.jpg 500 375 2 180 172 223 282 +12118 /data/VOCdevkit/VOC2012/JPEGImages/2010_000109.jpg 500 465 7 71 40 384 464 +12119 /data/VOCdevkit/VOC2012/JPEGImages/2010_000110.jpg 333 500 11 95 59 333 420 +12120 /data/VOCdevkit/VOC2012/JPEGImages/2010_000111.jpg 500 333 0 28 57 432 212 0 403 181 484 199 +12121 /data/VOCdevkit/VOC2012/JPEGImages/2010_000113.jpg 500 375 1 107 7 466 317 +12122 /data/VOCdevkit/VOC2012/JPEGImages/2010_000114.jpg 500 375 7 29 99 484 294 +12123 /data/VOCdevkit/VOC2012/JPEGImages/2010_000117.jpg 500 333 16 204 165 269 259 +12124 /data/VOCdevkit/VOC2012/JPEGImages/2010_000118.jpg 375 500 7 68 20 225 312 +12125 /data/VOCdevkit/VOC2012/JPEGImages/2010_000120.jpg 399 500 14 9 10 393 481 +12126 /data/VOCdevkit/VOC2012/JPEGImages/2010_000124.jpg 500 375 11 1 2 308 374 +12127 /data/VOCdevkit/VOC2012/JPEGImages/2010_000127.jpg 375 500 11 51 28 359 386 +12128 /data/VOCdevkit/VOC2012/JPEGImages/2010_000131.jpg 500 374 4 147 128 259 262 14 112 1 500 374 +12129 /data/VOCdevkit/VOC2012/JPEGImages/2010_000132.jpg 330 500 15 151 130 320 500 +12130 /data/VOCdevkit/VOC2012/JPEGImages/2010_000133.jpg 500 375 14 256 95 372 307 14 23 92 100 286 14 31 98 145 297 14 160 106 209 301 14 113 110 194 301 14 188 83 285 306 14 345 168 368 225 +12131 /data/VOCdevkit/VOC2012/JPEGImages/2010_000136.jpg 500 333 18 51 1 500 333 +12132 /data/VOCdevkit/VOC2012/JPEGImages/2010_000137.jpg 333 500 4 32 116 228 500 +12133 /data/VOCdevkit/VOC2012/JPEGImages/2010_000138.jpg 500 375 12 432 183 475 229 12 205 178 264 237 12 9 175 93 233 +12134 /data/VOCdevkit/VOC2012/JPEGImages/2010_000139.jpg 500 375 16 254 204 355 278 12 1 75 166 308 14 195 131 247 287 14 234 92 297 269 +12135 /data/VOCdevkit/VOC2012/JPEGImages/2010_000140.jpg 500 375 11 81 224 273 375 14 1 88 352 375 14 263 45 500 375 +12136 /data/VOCdevkit/VOC2012/JPEGImages/2010_000141.jpg 371 500 19 99 97 286 238 +12137 /data/VOCdevkit/VOC2012/JPEGImages/2010_000145.jpg 500 375 3 10 220 357 283 +12138 /data/VOCdevkit/VOC2012/JPEGImages/2010_000148.jpg 500 375 5 80 87 355 219 6 422 133 500 176 14 55 115 153 375 14 222 172 242 228 14 5 119 77 308 +12139 /data/VOCdevkit/VOC2012/JPEGImages/2010_000151.jpg 400 500 2 96 235 236 376 +12140 /data/VOCdevkit/VOC2012/JPEGImages/2010_000152.jpg 500 433 11 2 12 500 433 +12141 /data/VOCdevkit/VOC2012/JPEGImages/2010_000157.jpg 500 375 7 1 53 500 374 +12142 /data/VOCdevkit/VOC2012/JPEGImages/2010_000159.jpg 500 333 11 224 38 500 332 11 1 1 276 333 +12143 /data/VOCdevkit/VOC2012/JPEGImages/2010_000160.jpg 500 375 6 17 24 482 368 +12144 /data/VOCdevkit/VOC2012/JPEGImages/2010_000162.jpg 500 437 11 259 52 500 437 14 1 1 500 437 +12145 /data/VOCdevkit/VOC2012/JPEGImages/2010_000163.jpg 361 500 7 1 1 335 426 +12146 /data/VOCdevkit/VOC2012/JPEGImages/2010_000165.jpg 500 356 5 28 179 256 283 +12147 /data/VOCdevkit/VOC2012/JPEGImages/2010_000169.jpg 500 328 2 335 46 459 214 +12148 /data/VOCdevkit/VOC2012/JPEGImages/2010_000170.jpg 375 500 11 16 39 375 448 +12149 /data/VOCdevkit/VOC2012/JPEGImages/2010_000172.jpg 500 375 7 336 103 420 263 7 153 128 287 217 +12150 /data/VOCdevkit/VOC2012/JPEGImages/2010_000174.jpg 500 375 10 1 310 452 374 14 55 111 214 322 14 136 13 384 328 +12151 /data/VOCdevkit/VOC2012/JPEGImages/2010_000175.jpg 500 333 7 133 1 500 333 +12152 /data/VOCdevkit/VOC2012/JPEGImages/2010_000177.jpg 500 375 10 1 254 324 375 8 318 186 477 375 14 106 78 398 375 +12153 /data/VOCdevkit/VOC2012/JPEGImages/2010_000178.jpg 500 375 19 389 220 423 248 14 151 208 222 283 8 321 237 430 338 8 153 296 215 364 8 191 250 306 372 10 1 320 208 375 +12154 /data/VOCdevkit/VOC2012/JPEGImages/2010_000182.jpg 500 333 7 98 1 409 333 +12155 /data/VOCdevkit/VOC2012/JPEGImages/2010_000183.jpg 375 500 11 79 133 374 483 +12156 /data/VOCdevkit/VOC2012/JPEGImages/2010_000184.jpg 333 500 2 121 74 309 408 +12157 /data/VOCdevkit/VOC2012/JPEGImages/2010_000187.jpg 500 389 5 80 17 425 348 5 274 51 499 308 5 17 121 88 260 +12158 /data/VOCdevkit/VOC2012/JPEGImages/2010_000189.jpg 469 500 16 102 27 418 395 +12159 /data/VOCdevkit/VOC2012/JPEGImages/2010_000190.jpg 500 321 16 270 102 448 290 +12160 /data/VOCdevkit/VOC2012/JPEGImages/2010_000193.jpg 500 375 0 1 40 499 293 +12161 /data/VOCdevkit/VOC2012/JPEGImages/2010_000194.jpg 500 375 6 355 117 413 155 6 192 117 229 146 +12162 /data/VOCdevkit/VOC2012/JPEGImages/2010_000195.jpg 500 375 3 280 105 449 251 +12163 /data/VOCdevkit/VOC2012/JPEGImages/2010_000196.jpg 500 335 14 230 103 262 145 0 25 1 500 335 +12164 /data/VOCdevkit/VOC2012/JPEGImages/2010_000197.jpg 375 500 2 13 326 231 500 2 41 28 250 169 +12165 /data/VOCdevkit/VOC2012/JPEGImages/2010_000198.jpg 500 375 6 3 35 500 374 +12166 /data/VOCdevkit/VOC2012/JPEGImages/2010_000199.jpg 500 377 18 35 128 465 276 +12167 /data/VOCdevkit/VOC2012/JPEGImages/2010_000202.jpg 375 500 15 1 1 374 499 +12168 /data/VOCdevkit/VOC2012/JPEGImages/2010_000203.jpg 500 375 11 76 75 362 210 11 236 201 463 354 +12169 /data/VOCdevkit/VOC2012/JPEGImages/2010_000204.jpg 500 375 14 1 80 196 374 14 139 72 337 371 14 309 94 479 371 +12170 /data/VOCdevkit/VOC2012/JPEGImages/2010_000209.jpg 500 375 1 61 59 473 313 +12171 /data/VOCdevkit/VOC2012/JPEGImages/2010_000211.jpg 500 329 6 9 12 500 323 +12172 /data/VOCdevkit/VOC2012/JPEGImages/2010_000213.jpg 500 404 4 22 1 488 404 +12173 /data/VOCdevkit/VOC2012/JPEGImages/2010_000216.jpg 300 200 11 59 71 266 174 +12174 /data/VOCdevkit/VOC2012/JPEGImages/2010_000218.jpg 500 333 7 1 38 500 332 +12175 /data/VOCdevkit/VOC2012/JPEGImages/2010_000222.jpg 333 500 2 66 52 265 354 +12176 /data/VOCdevkit/VOC2012/JPEGImages/2010_000224.jpg 333 500 7 110 265 333 497 14 1 5 333 500 +12177 /data/VOCdevkit/VOC2012/JPEGImages/2010_000227.jpg 500 375 11 77 15 394 374 +12178 /data/VOCdevkit/VOC2012/JPEGImages/2010_000229.jpg 500 333 0 198 187 275 213 0 326 176 402 201 0 277 208 366 232 0 394 176 467 202 +12179 /data/VOCdevkit/VOC2012/JPEGImages/2010_000233.jpg 500 375 18 2 215 465 321 +12180 /data/VOCdevkit/VOC2012/JPEGImages/2010_000234.jpg 500 375 14 1 1 131 258 14 167 109 310 340 14 367 1 500 333 10 410 171 500 290 +12181 /data/VOCdevkit/VOC2012/JPEGImages/2010_000238.jpg 500 333 14 166 140 213 266 14 233 144 280 235 0 258 15 500 280 14 1 154 22 197 +12182 /data/VOCdevkit/VOC2012/JPEGImages/2010_000241.jpg 500 333 2 144 58 424 290 +12183 /data/VOCdevkit/VOC2012/JPEGImages/2010_000244.jpg 500 333 7 140 21 410 333 +12184 /data/VOCdevkit/VOC2012/JPEGImages/2010_000245.jpg 500 375 11 249 201 277 253 14 152 42 224 267 14 119 67 142 144 14 411 65 433 130 14 138 72 156 148 14 216 62 246 144 +12185 /data/VOCdevkit/VOC2012/JPEGImages/2010_000246.jpg 500 333 6 251 38 500 290 6 24 33 369 235 6 1 1 261 187 +12186 /data/VOCdevkit/VOC2012/JPEGImages/2010_000247.jpg 500 375 11 77 1 416 375 +12187 /data/VOCdevkit/VOC2012/JPEGImages/2010_000248.jpg 500 375 6 3 105 500 315 6 1 5 182 163 +12188 /data/VOCdevkit/VOC2012/JPEGImages/2010_000249.jpg 500 375 18 153 133 326 186 6 11 177 68 235 6 1 175 36 254 +12189 /data/VOCdevkit/VOC2012/JPEGImages/2010_000250.jpg 500 333 0 5 62 495 230 +12190 /data/VOCdevkit/VOC2012/JPEGImages/2010_000254.jpg 500 376 1 130 136 339 290 +12191 /data/VOCdevkit/VOC2012/JPEGImages/2010_000255.jpg 500 375 13 5 22 500 335 +12192 /data/VOCdevkit/VOC2012/JPEGImages/2010_000256.jpg 500 300 17 54 44 420 239 4 247 128 270 204 14 241 30 354 185 +12193 /data/VOCdevkit/VOC2012/JPEGImages/2010_000260.jpg 500 375 0 1 28 500 375 +12194 /data/VOCdevkit/VOC2012/JPEGImages/2010_000261.jpg 500 500 7 116 97 500 500 +12195 /data/VOCdevkit/VOC2012/JPEGImages/2010_000262.jpg 375 500 11 69 262 134 327 13 26 84 100 191 14 221 99 283 251 14 86 28 210 371 +12196 /data/VOCdevkit/VOC2012/JPEGImages/2010_000263.jpg 500 375 11 135 51 500 221 +12197 /data/VOCdevkit/VOC2012/JPEGImages/2010_000264.jpg 332 500 6 37 34 332 500 +12198 /data/VOCdevkit/VOC2012/JPEGImages/2010_000266.jpg 500 375 11 19 82 466 313 +12199 /data/VOCdevkit/VOC2012/JPEGImages/2010_000269.jpg 500 375 7 1 70 472 352 8 363 1 500 228 +12200 /data/VOCdevkit/VOC2012/JPEGImages/2010_000270.jpg 500 334 0 16 22 465 299 +12201 /data/VOCdevkit/VOC2012/JPEGImages/2010_000272.jpg 500 281 3 40 46 468 158 +12202 /data/VOCdevkit/VOC2012/JPEGImages/2010_000273.jpg 500 375 12 180 104 305 235 +12203 /data/VOCdevkit/VOC2012/JPEGImages/2010_000276.jpg 500 401 11 178 64 393 384 +12204 /data/VOCdevkit/VOC2012/JPEGImages/2010_000279.jpg 500 439 6 32 1 500 439 +12205 /data/VOCdevkit/VOC2012/JPEGImages/2010_000283.jpg 500 332 12 142 72 476 332 12 70 121 162 332 12 1 109 95 201 +12206 /data/VOCdevkit/VOC2012/JPEGImages/2010_000284.jpg 500 375 17 247 207 498 351 17 15 172 169 321 15 53 50 76 99 +12207 /data/VOCdevkit/VOC2012/JPEGImages/2010_000285.jpg 500 375 0 140 110 317 243 +12208 /data/VOCdevkit/VOC2012/JPEGImages/2010_000286.jpg 500 375 11 138 54 445 289 +12209 /data/VOCdevkit/VOC2012/JPEGImages/2010_000291.jpg 500 375 7 300 56 494 344 19 227 1 500 277 19 1 1 229 308 +12210 /data/VOCdevkit/VOC2012/JPEGImages/2010_000293.jpg 500 333 11 185 72 500 277 +12211 /data/VOCdevkit/VOC2012/JPEGImages/2010_000295.jpg 500 357 0 137 131 326 210 +12212 /data/VOCdevkit/VOC2012/JPEGImages/2010_000296.jpg 500 333 12 163 46 450 333 14 240 1 452 320 +12213 /data/VOCdevkit/VOC2012/JPEGImages/2010_000299.jpg 375 500 2 200 205 277 244 +12214 /data/VOCdevkit/VOC2012/JPEGImages/2010_000302.jpg 500 332 6 72 65 417 288 +12215 /data/VOCdevkit/VOC2012/JPEGImages/2010_000303.jpg 360 227 7 49 19 268 222 +12216 /data/VOCdevkit/VOC2012/JPEGImages/2010_000307.jpg 500 339 16 208 59 390 225 16 66 114 380 249 +12217 /data/VOCdevkit/VOC2012/JPEGImages/2010_000308.jpg 500 375 0 2 60 500 290 14 346 201 404 353 +12218 /data/VOCdevkit/VOC2012/JPEGImages/2010_000309.jpg 500 361 16 171 161 243 219 16 171 160 250 223 16 141 189 188 226 16 115 187 148 224 16 315 107 363 139 +12219 /data/VOCdevkit/VOC2012/JPEGImages/2010_000310.jpg 500 308 4 29 1 303 308 4 195 130 500 308 +12220 /data/VOCdevkit/VOC2012/JPEGImages/2010_000312.jpg 500 375 11 10 36 500 309 +12221 /data/VOCdevkit/VOC2012/JPEGImages/2010_000313.jpg 500 375 14 82 83 132 207 14 36 172 118 369 18 28 1 499 374 +12222 /data/VOCdevkit/VOC2012/JPEGImages/2010_000317.jpg 500 375 7 133 80 443 280 +12223 /data/VOCdevkit/VOC2012/JPEGImages/2010_000318.jpg 500 375 19 336 64 500 249 19 1 99 142 245 +12224 /data/VOCdevkit/VOC2012/JPEGImages/2010_000320.jpg 500 328 11 1 1 403 315 +12225 /data/VOCdevkit/VOC2012/JPEGImages/2010_000321.jpg 500 334 18 58 177 104 231 18 111 134 365 244 +12226 /data/VOCdevkit/VOC2012/JPEGImages/2010_000323.jpg 500 375 0 1 102 500 369 +12227 /data/VOCdevkit/VOC2012/JPEGImages/2010_000324.jpg 255 324 14 29 1 255 324 +12228 /data/VOCdevkit/VOC2012/JPEGImages/2010_000325.jpg 375 500 4 22 170 100 400 4 312 96 332 161 10 1 245 375 500 +12229 /data/VOCdevkit/VOC2012/JPEGImages/2010_000327.jpg 500 371 16 1 235 21 301 16 95 240 137 285 16 284 272 339 330 16 329 277 361 328 16 349 266 397 322 16 430 315 499 371 16 383 285 425 323 16 419 255 462 313 16 378 246 439 288 +12230 /data/VOCdevkit/VOC2012/JPEGImages/2010_000329.jpg 500 375 17 68 89 443 306 +12231 /data/VOCdevkit/VOC2012/JPEGImages/2010_000330.jpg 300 400 15 1 1 299 339 +12232 /data/VOCdevkit/VOC2012/JPEGImages/2010_000335.jpg 500 333 2 243 144 305 176 +12233 /data/VOCdevkit/VOC2012/JPEGImages/2010_000336.jpg 500 375 6 1 1 500 375 +12234 /data/VOCdevkit/VOC2012/JPEGImages/2010_000337.jpg 500 375 8 245 208 315 341 8 183 223 271 369 8 310 215 394 354 10 225 235 377 375 +12235 /data/VOCdevkit/VOC2012/JPEGImages/2010_000342.jpg 500 375 1 55 37 354 360 +12236 /data/VOCdevkit/VOC2012/JPEGImages/2010_000344.jpg 500 332 17 139 103 347 245 14 146 35 358 232 +12237 /data/VOCdevkit/VOC2012/JPEGImages/2010_000347.jpg 500 375 7 1 58 500 375 +12238 /data/VOCdevkit/VOC2012/JPEGImages/2010_000349.jpg 500 374 8 72 198 112 278 +12239 /data/VOCdevkit/VOC2012/JPEGImages/2010_000351.jpg 500 375 11 44 96 176 353 +12240 /data/VOCdevkit/VOC2012/JPEGImages/2010_000352.jpg 480 360 14 1 102 93 253 14 79 105 200 273 14 272 84 480 326 4 91 240 123 360 10 1 240 480 360 +12241 /data/VOCdevkit/VOC2012/JPEGImages/2010_000356.jpg 500 375 1 133 1 500 371 +12242 /data/VOCdevkit/VOC2012/JPEGImages/2010_000358.jpg 500 375 14 1 98 317 375 14 274 142 399 375 14 153 113 311 375 14 349 142 500 375 +12243 /data/VOCdevkit/VOC2012/JPEGImages/2010_000361.jpg 500 375 8 407 49 500 244 14 144 99 340 375 14 1 172 229 375 +12244 /data/VOCdevkit/VOC2012/JPEGImages/2010_000362.jpg 500 375 11 1 1 474 375 +12245 /data/VOCdevkit/VOC2012/JPEGImages/2010_000370.jpg 500 364 11 116 28 359 352 +12246 /data/VOCdevkit/VOC2012/JPEGImages/2010_000371.jpg 500 269 14 296 1 324 81 14 205 15 225 63 14 373 1 458 115 13 26 67 473 256 13 1 19 235 196 +12247 /data/VOCdevkit/VOC2012/JPEGImages/2010_000372.jpg 432 324 6 306 133 432 205 6 18 126 432 303 6 301 108 432 157 +12248 /data/VOCdevkit/VOC2012/JPEGImages/2010_000374.jpg 500 375 7 234 30 500 375 +12249 /data/VOCdevkit/VOC2012/JPEGImages/2010_000375.jpg 500 375 19 324 164 402 236 14 6 115 164 326 +12250 /data/VOCdevkit/VOC2012/JPEGImages/2010_000376.jpg 500 375 5 50 108 387 281 +12251 /data/VOCdevkit/VOC2012/JPEGImages/2010_000377.jpg 295 382 14 1 9 295 362 +12252 /data/VOCdevkit/VOC2012/JPEGImages/2010_000379.jpg 500 375 19 232 37 411 305 +12253 /data/VOCdevkit/VOC2012/JPEGImages/2010_000381.jpg 500 375 6 13 101 490 273 6 307 98 500 186 +12254 /data/VOCdevkit/VOC2012/JPEGImages/2010_000382.jpg 500 375 3 1 95 342 291 +12255 /data/VOCdevkit/VOC2012/JPEGImages/2010_000384.jpg 500 333 8 23 1 421 333 11 107 26 459 313 +12256 /data/VOCdevkit/VOC2012/JPEGImages/2010_000386.jpg 500 333 8 391 122 454 272 8 326 137 441 267 19 158 65 218 117 4 327 132 426 180 14 104 87 500 333 +12257 /data/VOCdevkit/VOC2012/JPEGImages/2010_000388.jpg 500 375 12 133 49 412 333 +12258 /data/VOCdevkit/VOC2012/JPEGImages/2010_000389.jpg 500 333 7 101 17 267 197 +12259 /data/VOCdevkit/VOC2012/JPEGImages/2010_000390.jpg 500 375 16 1 1 380 343 16 117 36 500 375 +12260 /data/VOCdevkit/VOC2012/JPEGImages/2010_000392.jpg 500 375 0 228 145 438 223 +12261 /data/VOCdevkit/VOC2012/JPEGImages/2010_000393.jpg 500 334 2 195 2 473 88 2 6 122 473 250 +12262 /data/VOCdevkit/VOC2012/JPEGImages/2010_000394.jpg 500 375 6 62 118 329 265 +12263 /data/VOCdevkit/VOC2012/JPEGImages/2010_000395.jpg 500 375 11 9 45 354 375 +12264 /data/VOCdevkit/VOC2012/JPEGImages/2010_000399.jpg 500 384 15 1 42 500 384 +12265 /data/VOCdevkit/VOC2012/JPEGImages/2010_000401.jpg 500 333 1 116 115 424 315 +12266 /data/VOCdevkit/VOC2012/JPEGImages/2010_000404.jpg 332 500 7 90 43 315 485 +12267 /data/VOCdevkit/VOC2012/JPEGImages/2010_000406.jpg 500 375 18 1 123 432 328 +12268 /data/VOCdevkit/VOC2012/JPEGImages/2010_000409.jpg 500 375 7 1 1 475 320 +12269 /data/VOCdevkit/VOC2012/JPEGImages/2010_000413.jpg 500 281 12 311 60 485 187 12 165 55 321 180 12 42 50 163 171 14 1 63 20 149 +12270 /data/VOCdevkit/VOC2012/JPEGImages/2010_000415.jpg 500 333 11 1 159 241 331 11 210 87 384 332 +12271 /data/VOCdevkit/VOC2012/JPEGImages/2010_000418.jpg 500 333 0 11 100 489 217 +12272 /data/VOCdevkit/VOC2012/JPEGImages/2010_000419.jpg 500 333 10 2 274 500 333 14 1 1 218 333 14 173 121 377 312 14 256 13 500 312 +12273 /data/VOCdevkit/VOC2012/JPEGImages/2010_000420.jpg 500 375 14 204 67 500 318 14 147 25 298 217 +12274 /data/VOCdevkit/VOC2012/JPEGImages/2010_000422.jpg 375 500 11 5 55 312 479 +12275 /data/VOCdevkit/VOC2012/JPEGImages/2010_000426.jpg 500 334 4 71 1 428 333 +12276 /data/VOCdevkit/VOC2012/JPEGImages/2010_000427.jpg 500 375 9 34 57 454 346 +12277 /data/VOCdevkit/VOC2012/JPEGImages/2010_000431.jpg 398 500 8 3 243 146 490 14 128 56 279 480 +12278 /data/VOCdevkit/VOC2012/JPEGImages/2010_000432.jpg 500 333 14 171 32 294 311 14 293 149 355 292 +12279 /data/VOCdevkit/VOC2012/JPEGImages/2010_000433.jpg 500 331 13 31 32 257 324 +12280 /data/VOCdevkit/VOC2012/JPEGImages/2010_000435.jpg 500 375 8 164 205 311 363 8 379 183 500 307 19 259 95 323 153 +12281 /data/VOCdevkit/VOC2012/JPEGImages/2010_000436.jpg 500 375 16 92 36 285 184 16 174 56 397 242 +12282 /data/VOCdevkit/VOC2012/JPEGImages/2010_000437.jpg 500 335 0 59 107 476 287 +12283 /data/VOCdevkit/VOC2012/JPEGImages/2010_000439.jpg 500 375 7 171 122 419 361 8 203 1 456 135 +12284 /data/VOCdevkit/VOC2012/JPEGImages/2010_000442.jpg 500 375 7 84 2 372 371 19 31 165 354 375 +12285 /data/VOCdevkit/VOC2012/JPEGImages/2010_000444.jpg 500 333 1 73 163 279 306 14 135 110 185 281 14 15 124 62 199 +12286 /data/VOCdevkit/VOC2012/JPEGImages/2010_000446.jpg 500 333 12 15 182 216 331 12 203 82 359 331 14 286 1 500 333 14 59 126 191 333 +12287 /data/VOCdevkit/VOC2012/JPEGImages/2010_000447.jpg 500 347 8 89 36 188 179 +12288 /data/VOCdevkit/VOC2012/JPEGImages/2010_000448.jpg 500 375 4 277 163 318 233 14 345 54 500 230 14 186 56 349 254 14 18 32 185 292 14 344 88 415 219 +12289 /data/VOCdevkit/VOC2012/JPEGImages/2010_000449.jpg 500 375 19 57 139 120 221 4 192 136 203 162 14 170 38 231 202 14 219 50 310 334 14 262 15 414 375 +12290 /data/VOCdevkit/VOC2012/JPEGImages/2010_000453.jpg 332 500 11 128 233 263 472 +12291 /data/VOCdevkit/VOC2012/JPEGImages/2010_000456.jpg 500 375 11 122 136 342 356 +12292 /data/VOCdevkit/VOC2012/JPEGImages/2010_000458.jpg 500 375 7 98 47 411 375 +12293 /data/VOCdevkit/VOC2012/JPEGImages/2010_000459.jpg 500 375 2 233 181 282 223 +12294 /data/VOCdevkit/VOC2012/JPEGImages/2010_000461.jpg 500 375 12 149 109 500 375 +12295 /data/VOCdevkit/VOC2012/JPEGImages/2010_000462.jpg 500 385 14 157 142 257 328 1 158 228 257 385 +12296 /data/VOCdevkit/VOC2012/JPEGImages/2010_000463.jpg 500 375 10 116 236 370 375 8 127 242 241 375 8 234 232 326 375 8 316 208 401 365 8 112 196 146 328 8 170 199 216 235 8 252 196 301 240 +12297 /data/VOCdevkit/VOC2012/JPEGImages/2010_000465.jpg 500 244 9 227 129 283 208 +12298 /data/VOCdevkit/VOC2012/JPEGImages/2010_000466.jpg 500 333 6 15 92 382 235 +12299 /data/VOCdevkit/VOC2012/JPEGImages/2010_000468.jpg 500 375 7 17 72 198 333 +12300 /data/VOCdevkit/VOC2012/JPEGImages/2010_000469.jpg 500 379 7 1 28 490 370 +12301 /data/VOCdevkit/VOC2012/JPEGImages/2010_000470.jpg 500 375 8 248 13 375 291 15 1 93 139 274 15 367 158 443 265 15 430 186 500 258 +12302 /data/VOCdevkit/VOC2012/JPEGImages/2010_000473.jpg 375 500 3 105 229 166 249 +12303 /data/VOCdevkit/VOC2012/JPEGImages/2010_000474.jpg 500 333 14 18 89 222 333 14 269 64 468 333 +12304 /data/VOCdevkit/VOC2012/JPEGImages/2010_000475.jpg 500 355 11 231 4 481 282 11 4 7 348 280 +12305 /data/VOCdevkit/VOC2012/JPEGImages/2010_000477.jpg 500 234 0 11 18 488 228 +12306 /data/VOCdevkit/VOC2012/JPEGImages/2010_000480.jpg 500 326 5 128 79 414 293 5 426 166 500 254 6 1 228 96 274 +12307 /data/VOCdevkit/VOC2012/JPEGImages/2010_000483.jpg 500 375 16 367 166 420 233 16 216 195 322 271 16 198 156 243 215 16 187 215 237 268 16 309 153 349 171 +12308 /data/VOCdevkit/VOC2012/JPEGImages/2010_000484.jpg 333 500 11 66 98 267 449 +12309 /data/VOCdevkit/VOC2012/JPEGImages/2010_000485.jpg 339 500 8 47 168 292 488 +12310 /data/VOCdevkit/VOC2012/JPEGImages/2010_000488.jpg 500 375 7 103 1 500 374 +12311 /data/VOCdevkit/VOC2012/JPEGImages/2010_000490.jpg 500 375 14 106 20 210 327 14 180 14 296 190 13 47 82 464 335 +12312 /data/VOCdevkit/VOC2012/JPEGImages/2010_000492.jpg 500 375 8 103 136 324 364 8 328 184 500 375 4 63 280 135 341 14 73 79 494 316 +12313 /data/VOCdevkit/VOC2012/JPEGImages/2010_000493.jpg 500 359 6 279 156 357 214 +12314 /data/VOCdevkit/VOC2012/JPEGImages/2010_000495.jpg 500 375 13 13 32 482 328 +12315 /data/VOCdevkit/VOC2012/JPEGImages/2010_000497.jpg 500 333 7 198 39 447 331 8 40 1 234 221 8 4 1 141 219 +12316 /data/VOCdevkit/VOC2012/JPEGImages/2010_000498.jpg 500 405 9 133 104 393 363 +12317 /data/VOCdevkit/VOC2012/JPEGImages/2010_000500.jpg 500 375 7 1 150 429 286 14 13 20 441 312 +12318 /data/VOCdevkit/VOC2012/JPEGImages/2010_000502.jpg 500 375 2 206 89 257 143 +12319 /data/VOCdevkit/VOC2012/JPEGImages/2010_000503.jpg 500 375 6 320 178 488 241 14 125 154 196 375 14 245 144 326 375 14 198 168 255 375 +12320 /data/VOCdevkit/VOC2012/JPEGImages/2010_000506.jpg 375 500 7 1 1 365 438 +12321 /data/VOCdevkit/VOC2012/JPEGImages/2010_000508.jpg 500 375 6 295 132 500 238 6 1 86 231 246 +12322 /data/VOCdevkit/VOC2012/JPEGImages/2010_000510.jpg 350 467 13 61 180 294 393 14 124 103 252 333 +12323 /data/VOCdevkit/VOC2012/JPEGImages/2010_000511.jpg 500 375 8 36 6 500 375 14 143 122 389 310 +12324 /data/VOCdevkit/VOC2012/JPEGImages/2010_000513.jpg 500 375 18 1 155 418 250 +12325 /data/VOCdevkit/VOC2012/JPEGImages/2010_000515.jpg 400 500 11 51 9 372 434 +12326 /data/VOCdevkit/VOC2012/JPEGImages/2010_000519.jpg 500 424 7 191 174 343 398 +12327 /data/VOCdevkit/VOC2012/JPEGImages/2010_000522.jpg 500 333 6 40 32 419 305 +12328 /data/VOCdevkit/VOC2012/JPEGImages/2010_000524.jpg 500 375 5 65 72 412 290 6 1 183 51 227 +12329 /data/VOCdevkit/VOC2012/JPEGImages/2010_000526.jpg 500 375 6 1 1 500 375 +12330 /data/VOCdevkit/VOC2012/JPEGImages/2010_000527.jpg 500 375 16 201 144 395 333 16 7 154 163 257 16 27 140 65 172 +12331 /data/VOCdevkit/VOC2012/JPEGImages/2010_000530.jpg 500 375 6 157 242 376 349 6 168 203 237 230 14 1 183 132 375 +12332 /data/VOCdevkit/VOC2012/JPEGImages/2010_000534.jpg 500 333 18 256 83 295 132 14 61 156 97 208 14 130 117 149 155 +12333 /data/VOCdevkit/VOC2012/JPEGImages/2010_000536.jpg 375 500 7 211 45 334 175 7 238 183 365 434 7 3 206 144 346 +12334 /data/VOCdevkit/VOC2012/JPEGImages/2010_000537.jpg 500 375 18 136 206 299 255 +12335 /data/VOCdevkit/VOC2012/JPEGImages/2010_000538.jpg 500 375 7 47 25 470 375 +12336 /data/VOCdevkit/VOC2012/JPEGImages/2010_000541.jpg 500 336 0 37 17 394 323 +12337 /data/VOCdevkit/VOC2012/JPEGImages/2010_000545.jpg 375 500 9 147 40 375 387 9 28 53 257 418 +12338 /data/VOCdevkit/VOC2012/JPEGImages/2010_000547.jpg 500 375 16 133 245 168 276 +12339 /data/VOCdevkit/VOC2012/JPEGImages/2010_000548.jpg 500 390 9 20 108 194 374 14 143 106 285 390 14 126 80 366 390 +12340 /data/VOCdevkit/VOC2012/JPEGImages/2010_000549.jpg 500 353 0 181 110 391 205 0 232 229 322 265 0 57 75 172 112 +12341 /data/VOCdevkit/VOC2012/JPEGImages/2010_000552.jpg 500 375 7 110 119 500 375 7 1 60 298 305 +12342 /data/VOCdevkit/VOC2012/JPEGImages/2010_000553.jpg 500 375 7 37 3 500 375 +12343 /data/VOCdevkit/VOC2012/JPEGImages/2010_000556.jpg 500 375 6 198 138 293 219 +12344 /data/VOCdevkit/VOC2012/JPEGImages/2010_000557.jpg 500 333 1 37 24 470 315 +12345 /data/VOCdevkit/VOC2012/JPEGImages/2010_000559.jpg 500 281 14 167 35 273 281 14 2 1 283 281 3 1 179 296 281 +12346 /data/VOCdevkit/VOC2012/JPEGImages/2010_000561.jpg 500 375 11 126 104 500 374 +12347 /data/VOCdevkit/VOC2012/JPEGImages/2010_000562.jpg 375 500 16 106 109 363 415 16 51 123 138 272 16 161 1 258 119 16 1 1 146 125 16 340 7 375 43 +12348 /data/VOCdevkit/VOC2012/JPEGImages/2010_000564.jpg 500 375 14 102 12 481 374 14 1 195 153 375 +12349 /data/VOCdevkit/VOC2012/JPEGImages/2010_000567.jpg 478 478 15 28 43 466 478 +12350 /data/VOCdevkit/VOC2012/JPEGImages/2010_000568.jpg 500 347 0 27 93 481 240 +12351 /data/VOCdevkit/VOC2012/JPEGImages/2010_000571.jpg 500 375 6 13 2 500 375 1 154 31 359 170 +12352 /data/VOCdevkit/VOC2012/JPEGImages/2010_000572.jpg 500 332 0 59 159 434 235 +12353 /data/VOCdevkit/VOC2012/JPEGImages/2010_000573.jpg 500 377 5 101 61 448 346 14 450 254 471 303 14 463 259 482 309 14 305 225 326 272 4 203 175 221 251 14 150 251 168 269 +12354 /data/VOCdevkit/VOC2012/JPEGImages/2010_000574.jpg 500 334 11 173 102 412 334 14 1 1 252 290 +12355 /data/VOCdevkit/VOC2012/JPEGImages/2010_000576.jpg 500 429 7 23 33 460 423 +12356 /data/VOCdevkit/VOC2012/JPEGImages/2010_000577.jpg 500 375 11 180 236 480 375 14 358 1 437 176 +12357 /data/VOCdevkit/VOC2012/JPEGImages/2010_000578.jpg 500 375 19 1 128 78 258 19 299 193 429 375 14 75 103 301 365 +12358 /data/VOCdevkit/VOC2012/JPEGImages/2010_000581.jpg 500 375 18 201 1 500 375 +12359 /data/VOCdevkit/VOC2012/JPEGImages/2010_000582.jpg 500 375 6 1 41 459 375 +12360 /data/VOCdevkit/VOC2012/JPEGImages/2010_000583.jpg 500 375 13 44 14 427 363 +12361 /data/VOCdevkit/VOC2012/JPEGImages/2010_000586.jpg 500 375 7 13 79 500 375 +12362 /data/VOCdevkit/VOC2012/JPEGImages/2010_000588.jpg 500 375 4 236 201 252 242 8 11 112 153 235 8 223 100 360 223 17 279 98 500 375 +12363 /data/VOCdevkit/VOC2012/JPEGImages/2010_000590.jpg 333 500 6 59 102 239 290 6 246 180 290 205 6 227 182 258 211 1 1 183 38 270 +12364 /data/VOCdevkit/VOC2012/JPEGImages/2010_000591.jpg 500 375 10 1 205 500 375 4 406 16 471 233 19 238 1 317 58 8 180 125 354 207 8 1 163 84 322 +12365 /data/VOCdevkit/VOC2012/JPEGImages/2010_000601.jpg 500 375 8 176 151 239 218 8 164 165 241 274 10 205 149 265 219 10 212 161 288 245 10 228 172 315 273 10 74 150 127 217 10 69 158 127 235 10 1 219 99 375 10 1 291 65 375 10 345 292 500 375 10 296 233 500 375 10 261 202 408 352 8 176 249 330 375 15 309 67 370 128 15 62 66 135 208 +12366 /data/VOCdevkit/VOC2012/JPEGImages/2010_000602.jpg 360 270 8 300 127 343 184 7 287 190 315 224 +12367 /data/VOCdevkit/VOC2012/JPEGImages/2010_000603.jpg 500 375 5 103 65 432 295 14 81 174 105 218 +12368 /data/VOCdevkit/VOC2012/JPEGImages/2010_000604.jpg 500 333 6 14 28 109 125 6 35 84 454 279 +12369 /data/VOCdevkit/VOC2012/JPEGImages/2010_000608.jpg 500 413 11 31 11 458 412 +12370 /data/VOCdevkit/VOC2012/JPEGImages/2010_000613.jpg 500 375 12 112 37 364 307 +12371 /data/VOCdevkit/VOC2012/JPEGImages/2010_000616.jpg 500 375 7 51 98 391 322 +12372 /data/VOCdevkit/VOC2012/JPEGImages/2010_000617.jpg 500 375 14 157 61 445 375 +12373 /data/VOCdevkit/VOC2012/JPEGImages/2010_000621.jpg 500 334 2 101 136 361 334 2 3 49 240 241 +12374 /data/VOCdevkit/VOC2012/JPEGImages/2010_000622.jpg 500 375 0 9 132 360 254 +12375 /data/VOCdevkit/VOC2012/JPEGImages/2010_000624.jpg 500 375 1 1 1 500 368 +12376 /data/VOCdevkit/VOC2012/JPEGImages/2010_000626.jpg 500 375 11 58 34 361 318 +12377 /data/VOCdevkit/VOC2012/JPEGImages/2010_000628.jpg 500 375 6 148 213 312 293 +12378 /data/VOCdevkit/VOC2012/JPEGImages/2010_000630.jpg 500 375 3 148 117 266 239 3 422 174 500 275 +12379 /data/VOCdevkit/VOC2012/JPEGImages/2010_000632.jpg 500 375 1 142 83 218 207 +12380 /data/VOCdevkit/VOC2012/JPEGImages/2010_000633.jpg 500 375 18 1 45 396 172 +12381 /data/VOCdevkit/VOC2012/JPEGImages/2010_000635.jpg 500 375 11 1 1 368 330 +12382 /data/VOCdevkit/VOC2012/JPEGImages/2010_000639.jpg 500 375 15 236 77 423 357 11 119 161 230 344 8 1 1 113 304 +12383 /data/VOCdevkit/VOC2012/JPEGImages/2010_000641.jpg 500 375 16 78 23 405 321 +12384 /data/VOCdevkit/VOC2012/JPEGImages/2010_000644.jpg 500 375 11 172 113 368 285 +12385 /data/VOCdevkit/VOC2012/JPEGImages/2010_000645.jpg 500 375 14 402 200 490 375 6 1 203 60 283 6 28 212 137 253 6 273 211 334 232 14 302 221 321 261 +12386 /data/VOCdevkit/VOC2012/JPEGImages/2010_000646.jpg 500 375 8 1 272 123 375 8 124 178 197 282 +12387 /data/VOCdevkit/VOC2012/JPEGImages/2010_000647.jpg 487 500 7 29 174 281 334 +12388 /data/VOCdevkit/VOC2012/JPEGImages/2010_000648.jpg 500 426 11 161 232 328 363 14 170 14 499 426 +12389 /data/VOCdevkit/VOC2012/JPEGImages/2010_000651.jpg 500 333 18 38 59 484 223 +12390 /data/VOCdevkit/VOC2012/JPEGImages/2010_000655.jpg 500 281 11 3 11 304 277 +12391 /data/VOCdevkit/VOC2012/JPEGImages/2010_000658.jpg 500 375 19 117 19 209 113 8 119 127 245 358 8 244 123 368 356 +12392 /data/VOCdevkit/VOC2012/JPEGImages/2010_000661.jpg 500 333 7 169 66 446 250 +12393 /data/VOCdevkit/VOC2012/JPEGImages/2010_000664.jpg 500 333 6 25 133 461 300 +12394 /data/VOCdevkit/VOC2012/JPEGImages/2010_000665.jpg 500 375 7 46 128 475 304 +12395 /data/VOCdevkit/VOC2012/JPEGImages/2010_000666.jpg 500 333 12 17 72 384 296 14 190 30 285 165 +12396 /data/VOCdevkit/VOC2012/JPEGImages/2010_000667.jpg 500 375 16 338 166 472 264 16 137 157 276 260 +12397 /data/VOCdevkit/VOC2012/JPEGImages/2010_000669.jpg 500 375 10 1 301 230 373 8 53 267 122 316 8 1 314 111 374 19 200 124 271 176 15 309 73 384 178 +12398 /data/VOCdevkit/VOC2012/JPEGImages/2010_000671.jpg 375 500 4 65 443 92 500 17 45 317 350 471 14 90 325 347 401 +12399 /data/VOCdevkit/VOC2012/JPEGImages/2010_000674.jpg 375 500 8 278 235 364 357 19 210 206 245 282 +12400 /data/VOCdevkit/VOC2012/JPEGImages/2010_000675.jpg 346 500 7 5 63 287 469 +12401 /data/VOCdevkit/VOC2012/JPEGImages/2010_000678.jpg 375 500 13 72 29 331 476 +12402 /data/VOCdevkit/VOC2012/JPEGImages/2010_000679.jpg 412 291 14 344 83 367 146 14 301 117 326 152 3 79 113 161 169 +12403 /data/VOCdevkit/VOC2012/JPEGImages/2010_000681.jpg 500 333 11 209 88 280 201 +12404 /data/VOCdevkit/VOC2012/JPEGImages/2010_000682.jpg 500 252 5 94 35 339 211 14 442 110 458 139 6 41 116 86 137 +12405 /data/VOCdevkit/VOC2012/JPEGImages/2010_000683.jpg 500 334 7 1 126 361 334 7 273 58 500 266 7 1 23 336 201 +12406 /data/VOCdevkit/VOC2012/JPEGImages/2010_000685.jpg 500 375 1 89 47 456 339 +12407 /data/VOCdevkit/VOC2012/JPEGImages/2010_000687.jpg 500 268 7 145 62 479 254 7 67 11 132 42 +12408 /data/VOCdevkit/VOC2012/JPEGImages/2010_000688.jpg 500 375 13 27 240 73 299 13 77 241 126 289 14 104 210 133 283 +12409 /data/VOCdevkit/VOC2012/JPEGImages/2010_000689.jpg 500 333 6 38 1 168 76 6 1 89 63 181 5 109 1 395 223 5 245 1 500 333 +12410 /data/VOCdevkit/VOC2012/JPEGImages/2010_000690.jpg 500 306 11 88 162 283 294 +12411 /data/VOCdevkit/VOC2012/JPEGImages/2010_000691.jpg 500 375 17 391 183 500 301 14 41 118 246 299 14 215 143 324 292 14 294 128 416 301 +12412 /data/VOCdevkit/VOC2012/JPEGImages/2010_000692.jpg 500 375 7 74 11 355 371 +12413 /data/VOCdevkit/VOC2012/JPEGImages/2010_000694.jpg 500 376 7 317 143 439 227 7 52 155 176 222 8 266 11 500 355 8 1 34 193 360 17 1 1 214 165 +12414 /data/VOCdevkit/VOC2012/JPEGImages/2010_000695.jpg 500 375 13 162 128 345 232 14 199 88 287 250 +12415 /data/VOCdevkit/VOC2012/JPEGImages/2010_000697.jpg 500 333 14 12 150 132 281 14 158 124 305 275 14 299 54 409 288 14 401 177 500 333 14 427 155 494 212 4 45 239 81 333 10 3 273 410 333 +12416 /data/VOCdevkit/VOC2012/JPEGImages/2010_000702.jpg 500 375 7 1 106 285 375 +12417 /data/VOCdevkit/VOC2012/JPEGImages/2010_000705.jpg 500 375 19 115 190 202 250 8 317 207 448 307 +12418 /data/VOCdevkit/VOC2012/JPEGImages/2010_000707.jpg 500 375 2 225 160 301 331 +12419 /data/VOCdevkit/VOC2012/JPEGImages/2010_000710.jpg 500 298 3 144 109 275 230 3 265 114 492 250 3 425 103 500 161 +12420 /data/VOCdevkit/VOC2012/JPEGImages/2010_000711.jpg 500 332 6 46 1 500 172 +12421 /data/VOCdevkit/VOC2012/JPEGImages/2010_000712.jpg 500 375 7 95 36 500 374 +12422 /data/VOCdevkit/VOC2012/JPEGImages/2010_000715.jpg 500 375 0 15 61 500 265 +12423 /data/VOCdevkit/VOC2012/JPEGImages/2010_000716.jpg 500 333 11 15 9 329 236 +12424 /data/VOCdevkit/VOC2012/JPEGImages/2010_000717.jpg 500 337 14 401 76 489 211 14 177 74 259 206 14 30 70 84 191 12 414 152 472 300 12 192 113 257 269 12 1 108 106 251 +12425 /data/VOCdevkit/VOC2012/JPEGImages/2010_000721.jpg 500 375 4 201 33 290 311 +12426 /data/VOCdevkit/VOC2012/JPEGImages/2010_000722.jpg 500 398 6 21 102 486 389 14 190 10 311 155 14 288 26 433 246 14 401 1 488 146 +12427 /data/VOCdevkit/VOC2012/JPEGImages/2010_000723.jpg 500 375 14 433 139 454 199 6 46 86 421 270 6 422 132 500 176 +12428 /data/VOCdevkit/VOC2012/JPEGImages/2010_000724.jpg 266 400 7 94 49 265 269 +12429 /data/VOCdevkit/VOC2012/JPEGImages/2010_000726.jpg 454 493 5 52 44 376 440 5 391 38 454 442 +12430 /data/VOCdevkit/VOC2012/JPEGImages/2010_000727.jpg 500 375 16 183 204 307 262 16 135 117 293 228 +12431 /data/VOCdevkit/VOC2012/JPEGImages/2010_000729.jpg 500 375 3 279 163 359 233 3 245 222 287 247 +12432 /data/VOCdevkit/VOC2012/JPEGImages/2010_000731.jpg 500 375 11 11 47 195 288 11 166 73 425 290 +12433 /data/VOCdevkit/VOC2012/JPEGImages/2010_000735.jpg 500 375 16 122 65 382 357 16 1 87 119 342 16 155 204 269 344 +12434 /data/VOCdevkit/VOC2012/JPEGImages/2010_000737.jpg 375 500 15 49 174 223 396 7 183 251 375 428 +12435 /data/VOCdevkit/VOC2012/JPEGImages/2010_000738.jpg 500 375 14 91 84 387 375 19 367 119 434 189 19 307 120 368 170 4 60 147 77 190 +12436 /data/VOCdevkit/VOC2012/JPEGImages/2010_000739.jpg 500 375 14 174 44 304 375 +12437 /data/VOCdevkit/VOC2012/JPEGImages/2010_000740.jpg 500 375 18 1 1 315 375 14 376 171 405 247 +12438 /data/VOCdevkit/VOC2012/JPEGImages/2010_000743.jpg 500 375 18 147 136 393 263 +12439 /data/VOCdevkit/VOC2012/JPEGImages/2010_000744.jpg 500 375 13 24 41 469 318 14 270 1 438 235 +12440 /data/VOCdevkit/VOC2012/JPEGImages/2010_000746.jpg 375 500 11 14 47 365 462 +12441 /data/VOCdevkit/VOC2012/JPEGImages/2010_000747.jpg 500 325 1 5 133 205 312 +12442 /data/VOCdevkit/VOC2012/JPEGImages/2010_000748.jpg 500 328 3 55 38 391 272 14 134 220 149 249 14 154 223 167 252 +12443 /data/VOCdevkit/VOC2012/JPEGImages/2010_000749.jpg 500 332 12 63 135 307 307 +12444 /data/VOCdevkit/VOC2012/JPEGImages/2010_000750.jpg 375 500 15 1 5 348 409 +12445 /data/VOCdevkit/VOC2012/JPEGImages/2010_000754.jpg 500 333 10 53 206 396 333 8 13 233 139 333 8 185 234 335 333 8 284 216 406 333 8 284 194 382 333 8 81 205 155 236 +12446 /data/VOCdevkit/VOC2012/JPEGImages/2010_000759.jpg 500 375 14 222 122 271 290 +12447 /data/VOCdevkit/VOC2012/JPEGImages/2010_000760.jpg 500 333 11 195 120 401 320 14 2 1 325 333 +12448 /data/VOCdevkit/VOC2012/JPEGImages/2010_000761.jpg 500 333 11 157 43 266 187 11 230 222 331 331 8 78 8 356 288 +12449 /data/VOCdevkit/VOC2012/JPEGImages/2010_000764.jpg 500 334 18 1 90 500 334 +12450 /data/VOCdevkit/VOC2012/JPEGImages/2010_000765.jpg 500 375 8 341 71 463 271 8 104 156 216 274 +12451 /data/VOCdevkit/VOC2012/JPEGImages/2010_000769.jpg 500 375 7 167 137 301 251 +12452 /data/VOCdevkit/VOC2012/JPEGImages/2010_000770.jpg 500 375 5 120 261 348 370 +12453 /data/VOCdevkit/VOC2012/JPEGImages/2010_000771.jpg 461 500 11 49 46 442 470 +12454 /data/VOCdevkit/VOC2012/JPEGImages/2010_000772.jpg 480 320 14 112 86 308 320 14 95 107 350 320 +12455 /data/VOCdevkit/VOC2012/JPEGImages/2010_000773.jpg 333 500 15 167 40 227 133 14 232 77 275 128 19 129 204 247 317 14 10 97 34 144 +12456 /data/VOCdevkit/VOC2012/JPEGImages/2010_000778.jpg 500 332 14 95 25 363 332 14 174 63 401 332 +12457 /data/VOCdevkit/VOC2012/JPEGImages/2010_000782.jpg 500 375 4 1 80 49 104 4 4 136 48 163 8 75 110 180 217 8 240 145 350 220 8 351 178 479 276 10 27 193 500 375 +12458 /data/VOCdevkit/VOC2012/JPEGImages/2010_000785.jpg 500 375 11 124 1 486 375 +12459 /data/VOCdevkit/VOC2012/JPEGImages/2010_000786.jpg 500 375 14 350 259 376 323 14 316 259 343 325 18 1 180 500 274 +12460 /data/VOCdevkit/VOC2012/JPEGImages/2010_000787.jpg 500 375 8 313 122 412 234 19 213 169 321 298 19 342 156 461 306 +12461 /data/VOCdevkit/VOC2012/JPEGImages/2010_000788.jpg 500 375 11 73 77 398 251 +12462 /data/VOCdevkit/VOC2012/JPEGImages/2010_000791.jpg 500 375 7 56 85 343 374 +12463 /data/VOCdevkit/VOC2012/JPEGImages/2010_000792.jpg 500 375 14 95 190 374 375 14 379 238 500 375 14 351 201 464 375 14 262 178 395 318 14 111 187 197 289 14 259 195 293 260 14 296 132 407 224 14 348 211 384 241 +12464 /data/VOCdevkit/VOC2012/JPEGImages/2010_000797.jpg 500 375 5 374 180 500 232 5 58 169 250 234 14 384 246 443 318 14 34 190 54 264 14 360 226 380 249 14 174 226 190 259 14 150 224 170 257 14 446 203 464 237 14 484 204 500 235 14 467 199 483 234 +12465 /data/VOCdevkit/VOC2012/JPEGImages/2010_000799.jpg 500 375 7 26 28 421 322 +12466 /data/VOCdevkit/VOC2012/JPEGImages/2010_000800.jpg 500 375 15 288 1 369 64 8 382 131 482 338 15 50 134 85 175 15 1 70 36 250 19 39 169 126 235 +12467 /data/VOCdevkit/VOC2012/JPEGImages/2010_000802.jpg 500 375 0 255 127 436 246 +12468 /data/VOCdevkit/VOC2012/JPEGImages/2010_000803.jpg 500 375 14 1 190 24 250 3 33 1 500 359 +12469 /data/VOCdevkit/VOC2012/JPEGImages/2010_000805.jpg 500 375 11 215 57 479 374 4 74 105 255 375 +12470 /data/VOCdevkit/VOC2012/JPEGImages/2010_000806.jpg 500 281 13 118 109 338 267 14 190 69 293 234 +12471 /data/VOCdevkit/VOC2012/JPEGImages/2010_000807.jpg 375 500 19 46 221 319 464 +12472 /data/VOCdevkit/VOC2012/JPEGImages/2010_000808.jpg 500 375 9 182 126 333 280 +12473 /data/VOCdevkit/VOC2012/JPEGImages/2010_000810.jpg 500 314 2 89 148 158 211 +12474 /data/VOCdevkit/VOC2012/JPEGImages/2010_000811.jpg 500 307 11 58 78 357 303 +12475 /data/VOCdevkit/VOC2012/JPEGImages/2010_000814.jpg 375 500 2 1 62 273 500 2 210 176 375 500 +12476 /data/VOCdevkit/VOC2012/JPEGImages/2010_000815.jpg 500 346 7 1 37 465 272 +12477 /data/VOCdevkit/VOC2012/JPEGImages/2010_000821.jpg 500 375 17 1 203 258 371 8 249 202 340 375 8 399 195 459 255 8 335 239 453 375 10 275 242 500 375 +12478 /data/VOCdevkit/VOC2012/JPEGImages/2010_000822.jpg 500 375 16 69 39 473 375 +12479 /data/VOCdevkit/VOC2012/JPEGImages/2010_000827.jpg 375 500 14 104 126 374 357 +12480 /data/VOCdevkit/VOC2012/JPEGImages/2010_000828.jpg 500 375 7 179 113 357 353 +12481 /data/VOCdevkit/VOC2012/JPEGImages/2010_000829.jpg 500 375 1 32 14 496 357 13 4 83 80 130 +12482 /data/VOCdevkit/VOC2012/JPEGImages/2010_000830.jpg 500 375 17 67 146 396 294 +12483 /data/VOCdevkit/VOC2012/JPEGImages/2010_000831.jpg 500 368 16 18 200 185 317 16 189 133 426 303 16 216 219 324 289 16 242 218 373 303 +12484 /data/VOCdevkit/VOC2012/JPEGImages/2010_000836.jpg 500 405 2 208 110 290 255 +12485 /data/VOCdevkit/VOC2012/JPEGImages/2010_000837.jpg 500 333 11 60 1 500 333 +12486 /data/VOCdevkit/VOC2012/JPEGImages/2010_000838.jpg 500 455 12 8 4 407 454 +12487 /data/VOCdevkit/VOC2012/JPEGImages/2010_000842.jpg 500 375 11 262 43 451 276 7 44 26 304 310 +12488 /data/VOCdevkit/VOC2012/JPEGImages/2010_000846.jpg 333 500 11 1 10 333 464 +12489 /data/VOCdevkit/VOC2012/JPEGImages/2010_000847.jpg 500 375 16 170 147 244 204 16 208 137 322 212 16 289 156 360 208 +12490 /data/VOCdevkit/VOC2012/JPEGImages/2010_000849.jpg 500 375 12 236 71 434 375 12 56 95 237 375 +12491 /data/VOCdevkit/VOC2012/JPEGImages/2010_000855.jpg 500 340 5 150 14 378 319 5 1 131 155 303 5 443 108 500 325 14 424 198 444 241 +12492 /data/VOCdevkit/VOC2012/JPEGImages/2010_000857.jpg 330 500 11 52 43 213 348 8 26 79 321 480 +12493 /data/VOCdevkit/VOC2012/JPEGImages/2010_000860.jpg 375 500 18 1 1 169 500 +12494 /data/VOCdevkit/VOC2012/JPEGImages/2010_000862.jpg 500 375 11 44 86 459 293 +12495 /data/VOCdevkit/VOC2012/JPEGImages/2010_000863.jpg 375 500 2 2 162 287 499 +12496 /data/VOCdevkit/VOC2012/JPEGImages/2010_000865.jpg 500 375 18 62 92 500 257 14 21 164 37 205 6 1 172 16 208 +12497 /data/VOCdevkit/VOC2012/JPEGImages/2010_000866.jpg 480 360 16 78 127 353 349 14 256 1 388 307 4 459 56 474 114 +12498 /data/VOCdevkit/VOC2012/JPEGImages/2010_000870.jpg 500 375 11 251 50 445 320 +12499 /data/VOCdevkit/VOC2012/JPEGImages/2010_000871.jpg 375 500 15 186 96 375 372 15 10 1 366 500 15 342 338 375 429 +12500 /data/VOCdevkit/VOC2012/JPEGImages/2010_000872.jpg 500 375 7 109 86 486 374 +12501 /data/VOCdevkit/VOC2012/JPEGImages/2010_000874.jpg 315 500 12 8 130 176 452 12 94 96 315 490 +12502 /data/VOCdevkit/VOC2012/JPEGImages/2010_000875.jpg 500 375 7 165 101 326 325 +12503 /data/VOCdevkit/VOC2012/JPEGImages/2010_000876.jpg 500 360 15 2 38 491 360 +12504 /data/VOCdevkit/VOC2012/JPEGImages/2010_000879.jpg 498 500 11 1 102 472 478 +12505 /data/VOCdevkit/VOC2012/JPEGImages/2010_000883.jpg 500 468 11 93 269 500 468 14 42 40 397 468 +12506 /data/VOCdevkit/VOC2012/JPEGImages/2010_000885.jpg 500 338 0 96 3 466 123 0 105 165 292 199 0 146 214 240 234 +12507 /data/VOCdevkit/VOC2012/JPEGImages/2010_000887.jpg 500 357 3 218 85 424 245 +12508 /data/VOCdevkit/VOC2012/JPEGImages/2010_000889.jpg 375 500 11 83 91 255 429 +12509 /data/VOCdevkit/VOC2012/JPEGImages/2010_000891.jpg 500 375 4 181 263 271 322 14 1 1 404 375 14 255 226 354 307 +12510 /data/VOCdevkit/VOC2012/JPEGImages/2010_000893.jpg 500 375 15 365 1 428 41 15 286 47 317 106 1 111 22 344 254 +12511 /data/VOCdevkit/VOC2012/JPEGImages/2010_000897.jpg 500 375 4 259 135 350 311 +12512 /data/VOCdevkit/VOC2012/JPEGImages/2010_000898.jpg 500 333 1 12 41 495 324 +12513 /data/VOCdevkit/VOC2012/JPEGImages/2010_000899.jpg 500 333 11 201 13 402 328 +12514 /data/VOCdevkit/VOC2012/JPEGImages/2010_000904.jpg 500 400 11 59 1 500 400 +12515 /data/VOCdevkit/VOC2012/JPEGImages/2010_000906.jpg 500 378 3 159 99 364 263 +12516 /data/VOCdevkit/VOC2012/JPEGImages/2010_000907.jpg 500 375 9 218 150 482 356 9 22 269 179 353 +12517 /data/VOCdevkit/VOC2012/JPEGImages/2010_000908.jpg 500 375 6 108 115 372 330 +12518 /data/VOCdevkit/VOC2012/JPEGImages/2010_000910.jpg 375 500 9 61 167 239 483 1 233 203 375 373 14 256 99 355 349 +12519 /data/VOCdevkit/VOC2012/JPEGImages/2010_000912.jpg 267 400 14 1 26 267 361 14 1 169 267 400 +12520 /data/VOCdevkit/VOC2012/JPEGImages/2010_000914.jpg 375 500 7 26 58 277 499 +12521 /data/VOCdevkit/VOC2012/JPEGImages/2010_000915.jpg 375 500 10 116 387 374 498 4 188 283 242 433 14 1 221 139 451 +12522 /data/VOCdevkit/VOC2012/JPEGImages/2010_000918.jpg 375 500 2 80 50 147 117 +12523 /data/VOCdevkit/VOC2012/JPEGImages/2010_000920.jpg 500 375 16 315 134 360 214 16 348 130 376 197 16 250 144 321 185 16 239 178 284 231 16 182 170 241 259 16 124 173 187 250 +12524 /data/VOCdevkit/VOC2012/JPEGImages/2010_000922.jpg 434 407 14 125 89 314 360 17 1 134 430 401 6 112 45 330 142 6 9 67 139 149 +12525 /data/VOCdevkit/VOC2012/JPEGImages/2010_000923.jpg 500 351 12 23 30 473 329 +12526 /data/VOCdevkit/VOC2012/JPEGImages/2010_000926.jpg 500 332 11 1 1 403 309 +12527 /data/VOCdevkit/VOC2012/JPEGImages/2010_000927.jpg 500 344 13 17 9 477 340 +12528 /data/VOCdevkit/VOC2012/JPEGImages/2010_000928.jpg 500 375 6 204 175 333 225 +12529 /data/VOCdevkit/VOC2012/JPEGImages/2010_000929.jpg 334 500 13 95 279 156 327 14 103 261 129 309 +12530 /data/VOCdevkit/VOC2012/JPEGImages/2010_000931.jpg 500 333 19 237 70 340 176 19 128 63 239 170 +12531 /data/VOCdevkit/VOC2012/JPEGImages/2010_000938.jpg 384 288 10 1 82 384 288 +12532 /data/VOCdevkit/VOC2012/JPEGImages/2010_000939.jpg 500 375 0 183 157 399 230 +12533 /data/VOCdevkit/VOC2012/JPEGImages/2010_000941.jpg 343 500 7 1 133 276 500 +12534 /data/VOCdevkit/VOC2012/JPEGImages/2010_000942.jpg 400 265 14 280 44 396 203 14 275 144 386 265 14 171 138 265 256 14 43 122 161 265 14 1 35 96 224 14 82 30 172 167 14 195 58 283 202 +12535 /data/VOCdevkit/VOC2012/JPEGImages/2010_000944.jpg 500 375 19 218 105 351 221 4 386 195 411 267 4 111 199 132 272 14 23 86 342 375 +12536 /data/VOCdevkit/VOC2012/JPEGImages/2010_000945.jpg 500 375 14 113 84 370 375 +12537 /data/VOCdevkit/VOC2012/JPEGImages/2010_000947.jpg 500 375 5 288 78 463 294 5 56 144 293 285 6 460 221 500 257 +12538 /data/VOCdevkit/VOC2012/JPEGImages/2010_000948.jpg 500 375 7 1 10 258 196 7 198 75 338 209 7 324 57 499 212 +12539 /data/VOCdevkit/VOC2012/JPEGImages/2010_000952.jpg 500 375 6 46 57 479 309 +12540 /data/VOCdevkit/VOC2012/JPEGImages/2010_000954.jpg 500 375 9 105 203 196 239 14 327 82 500 375 +12541 /data/VOCdevkit/VOC2012/JPEGImages/2010_000955.jpg 500 345 18 101 189 500 287 +12542 /data/VOCdevkit/VOC2012/JPEGImages/2010_000956.jpg 375 500 2 172 26 198 47 +12543 /data/VOCdevkit/VOC2012/JPEGImages/2010_000959.jpg 500 333 14 405 92 465 277 18 200 1 500 331 +12544 /data/VOCdevkit/VOC2012/JPEGImages/2010_000961.jpg 373 500 2 130 132 258 320 +12545 /data/VOCdevkit/VOC2012/JPEGImages/2010_000968.jpg 500 375 11 307 217 434 303 8 25 138 233 355 17 145 74 400 211 14 195 63 341 150 15 457 80 489 147 +12546 /data/VOCdevkit/VOC2012/JPEGImages/2010_000970.jpg 500 375 16 1 131 143 374 14 83 14 364 375 14 138 101 173 163 14 68 119 82 160 +12547 /data/VOCdevkit/VOC2012/JPEGImages/2010_000971.jpg 500 375 7 7 58 434 374 +12548 /data/VOCdevkit/VOC2012/JPEGImages/2010_000973.jpg 500 375 11 163 202 418 347 11 53 71 200 314 15 425 229 490 370 15 452 113 500 359 +12549 /data/VOCdevkit/VOC2012/JPEGImages/2010_000974.jpg 375 500 7 156 196 271 319 14 109 97 272 500 19 44 255 122 330 +12550 /data/VOCdevkit/VOC2012/JPEGImages/2010_000975.jpg 357 500 11 6 11 357 490 +12551 /data/VOCdevkit/VOC2012/JPEGImages/2010_000978.jpg 500 333 16 228 178 319 289 16 143 54 313 276 +12552 /data/VOCdevkit/VOC2012/JPEGImages/2010_000979.jpg 375 500 3 191 446 257 466 +12553 /data/VOCdevkit/VOC2012/JPEGImages/2010_000981.jpg 500 375 0 59 108 462 241 +12554 /data/VOCdevkit/VOC2012/JPEGImages/2010_000983.jpg 500 375 11 207 156 260 245 +12555 /data/VOCdevkit/VOC2012/JPEGImages/2010_000984.jpg 500 366 18 86 113 421 227 +12556 /data/VOCdevkit/VOC2012/JPEGImages/2010_000986.jpg 500 318 0 275 78 454 138 +12557 /data/VOCdevkit/VOC2012/JPEGImages/2010_000989.jpg 374 500 11 29 149 346 500 +12558 /data/VOCdevkit/VOC2012/JPEGImages/2010_000991.jpg 500 375 13 115 115 389 372 14 204 14 342 342 +12559 /data/VOCdevkit/VOC2012/JPEGImages/2010_000993.jpg 292 500 14 54 164 79 244 14 29 162 72 288 14 181 147 279 319 14 19 45 230 477 +12560 /data/VOCdevkit/VOC2012/JPEGImages/2010_000994.jpg 500 333 2 185 107 299 313 +12561 /data/VOCdevkit/VOC2012/JPEGImages/2010_000995.jpg 500 375 13 1 1 500 374 +12562 /data/VOCdevkit/VOC2012/JPEGImages/2010_000996.jpg 333 500 7 21 14 295 477 +12563 /data/VOCdevkit/VOC2012/JPEGImages/2010_001000.jpg 500 334 9 41 3 500 334 +12564 /data/VOCdevkit/VOC2012/JPEGImages/2010_001002.jpg 500 375 11 102 1 500 375 +12565 /data/VOCdevkit/VOC2012/JPEGImages/2010_001006.jpg 360 270 11 203 77 299 168 14 114 40 231 234 +12566 /data/VOCdevkit/VOC2012/JPEGImages/2010_001008.jpg 500 375 14 265 76 380 310 14 45 78 177 233 14 144 69 292 375 +12567 /data/VOCdevkit/VOC2012/JPEGImages/2010_001009.jpg 500 375 11 119 1 381 329 +12568 /data/VOCdevkit/VOC2012/JPEGImages/2010_001010.jpg 500 333 9 46 20 234 328 9 261 213 322 271 +12569 /data/VOCdevkit/VOC2012/JPEGImages/2010_001011.jpg 500 375 16 164 241 329 348 16 30 190 256 328 +12570 /data/VOCdevkit/VOC2012/JPEGImages/2010_001012.jpg 500 375 7 132 61 500 375 +12571 /data/VOCdevkit/VOC2012/JPEGImages/2010_001013.jpg 183 350 4 13 4 171 344 +12572 /data/VOCdevkit/VOC2012/JPEGImages/2010_001016.jpg 500 304 2 180 57 372 252 +12573 /data/VOCdevkit/VOC2012/JPEGImages/2010_001017.jpg 500 433 0 114 130 342 306 +12574 /data/VOCdevkit/VOC2012/JPEGImages/2010_001020.jpg 500 333 0 150 91 414 275 14 378 195 396 229 +12575 /data/VOCdevkit/VOC2012/JPEGImages/2010_001021.jpg 500 375 7 1 1 448 324 +12576 /data/VOCdevkit/VOC2012/JPEGImages/2010_001023.jpg 500 375 11 57 47 404 375 +12577 /data/VOCdevkit/VOC2012/JPEGImages/2010_001024.jpg 500 332 0 2 101 500 332 14 333 51 374 163 14 221 18 269 138 14 176 70 217 145 14 89 40 136 152 +12578 /data/VOCdevkit/VOC2012/JPEGImages/2010_001025.jpg 500 382 7 1 6 500 382 +12579 /data/VOCdevkit/VOC2012/JPEGImages/2010_001030.jpg 333 500 7 83 43 310 492 +12580 /data/VOCdevkit/VOC2012/JPEGImages/2010_001032.jpg 500 375 11 140 59 463 253 +12581 /data/VOCdevkit/VOC2012/JPEGImages/2010_001036.jpg 500 375 14 249 163 283 223 3 162 169 363 279 +12582 /data/VOCdevkit/VOC2012/JPEGImages/2010_001039.jpg 500 333 0 25 57 500 270 +12583 /data/VOCdevkit/VOC2012/JPEGImages/2010_001042.jpg 500 333 2 102 103 333 254 +12584 /data/VOCdevkit/VOC2012/JPEGImages/2010_001043.jpg 468 351 6 324 69 466 172 6 72 88 413 245 6 1 99 67 168 +12585 /data/VOCdevkit/VOC2012/JPEGImages/2010_001044.jpg 500 375 6 1 32 499 367 +12586 /data/VOCdevkit/VOC2012/JPEGImages/2010_001049.jpg 500 375 1 226 159 409 270 1 45 149 218 264 +12587 /data/VOCdevkit/VOC2012/JPEGImages/2010_001051.jpg 500 375 17 191 51 499 265 17 1 61 229 320 +12588 /data/VOCdevkit/VOC2012/JPEGImages/2010_001052.jpg 500 375 18 1 170 324 214 +12589 /data/VOCdevkit/VOC2012/JPEGImages/2010_001054.jpg 500 349 7 73 15 492 340 +12590 /data/VOCdevkit/VOC2012/JPEGImages/2010_001057.jpg 500 375 7 246 85 383 230 7 68 56 315 309 +12591 /data/VOCdevkit/VOC2012/JPEGImages/2010_001061.jpg 500 375 2 115 48 303 277 +12592 /data/VOCdevkit/VOC2012/JPEGImages/2010_001063.jpg 500 375 11 75 66 367 258 +12593 /data/VOCdevkit/VOC2012/JPEGImages/2010_001066.jpg 500 375 17 155 289 288 375 +12594 /data/VOCdevkit/VOC2012/JPEGImages/2010_001069.jpg 448 500 2 64 92 338 461 +12595 /data/VOCdevkit/VOC2012/JPEGImages/2010_001070.jpg 375 500 7 128 159 268 315 +12596 /data/VOCdevkit/VOC2012/JPEGImages/2010_001074.jpg 359 269 11 46 81 183 216 11 210 37 350 192 +12597 /data/VOCdevkit/VOC2012/JPEGImages/2010_001076.jpg 500 375 16 250 227 318 266 16 179 207 269 250 +12598 /data/VOCdevkit/VOC2012/JPEGImages/2010_001077.jpg 500 333 12 109 86 371 302 14 230 44 317 231 +12599 /data/VOCdevkit/VOC2012/JPEGImages/2010_001079.jpg 500 341 16 160 59 205 101 16 142 90 212 158 16 167 120 285 202 16 161 224 290 316 16 335 112 406 157 16 326 134 428 210 +12600 /data/VOCdevkit/VOC2012/JPEGImages/2010_001080.jpg 500 375 6 44 121 490 375 +12601 /data/VOCdevkit/VOC2012/JPEGImages/2010_001082.jpg 500 374 16 196 67 500 374 16 73 118 278 374 16 229 1 324 89 +12602 /data/VOCdevkit/VOC2012/JPEGImages/2010_001085.jpg 375 500 0 1 110 375 423 +12603 /data/VOCdevkit/VOC2012/JPEGImages/2010_001087.jpg 500 375 5 36 13 404 316 5 339 82 500 253 +12604 /data/VOCdevkit/VOC2012/JPEGImages/2010_001089.jpg 500 333 7 1 1 500 333 +12605 /data/VOCdevkit/VOC2012/JPEGImages/2010_001092.jpg 500 312 11 94 130 230 282 14 301 1 500 249 +12606 /data/VOCdevkit/VOC2012/JPEGImages/2010_001094.jpg 500 375 11 155 89 298 234 4 137 147 185 204 8 268 20 347 160 14 138 13 305 220 +12607 /data/VOCdevkit/VOC2012/JPEGImages/2010_001098.jpg 500 333 2 362 104 384 143 2 250 77 276 110 2 211 109 233 141 2 149 145 169 178 2 92 149 109 195 +12608 /data/VOCdevkit/VOC2012/JPEGImages/2010_001099.jpg 500 336 11 226 7 470 336 19 7 60 500 336 +12609 /data/VOCdevkit/VOC2012/JPEGImages/2010_001100.jpg 500 375 7 84 46 499 321 +12610 /data/VOCdevkit/VOC2012/JPEGImages/2010_001103.jpg 366 500 7 79 30 308 221 7 14 97 366 500 +12611 /data/VOCdevkit/VOC2012/JPEGImages/2010_001104.jpg 355 500 18 6 254 226 339 +12612 /data/VOCdevkit/VOC2012/JPEGImages/2010_001105.jpg 500 333 18 1 226 500 278 +12613 /data/VOCdevkit/VOC2012/JPEGImages/2010_001106.jpg 500 375 14 344 1 448 152 +12614 /data/VOCdevkit/VOC2012/JPEGImages/2010_001107.jpg 500 375 14 247 24 487 375 14 24 140 161 375 9 137 125 179 147 9 110 130 134 146 +12615 /data/VOCdevkit/VOC2012/JPEGImages/2010_001109.jpg 411 500 3 110 264 160 291 +12616 /data/VOCdevkit/VOC2012/JPEGImages/2010_001110.jpg 500 375 6 32 1 487 333 6 275 1 499 188 +12617 /data/VOCdevkit/VOC2012/JPEGImages/2010_001111.jpg 500 375 15 1 1 84 285 17 39 110 394 347 14 119 91 345 375 14 352 1 500 375 +12618 /data/VOCdevkit/VOC2012/JPEGImages/2010_001112.jpg 500 375 11 250 169 300 210 14 93 198 184 330 14 175 106 274 326 14 262 191 317 321 14 306 125 332 204 14 267 124 292 195 14 251 106 267 140 14 255 103 286 172 +12619 /data/VOCdevkit/VOC2012/JPEGImages/2010_001113.jpg 500 375 14 52 213 179 375 14 180 230 288 374 14 259 230 349 370 14 362 218 489 374 14 141 109 243 367 14 231 130 313 300 14 276 108 326 190 14 286 159 378 324 10 409 235 487 287 +12620 /data/VOCdevkit/VOC2012/JPEGImages/2010_001117.jpg 500 335 6 339 55 500 122 6 58 74 411 276 6 1 55 45 88 6 102 64 155 91 6 63 60 119 91 +12621 /data/VOCdevkit/VOC2012/JPEGImages/2010_001118.jpg 455 500 6 165 232 454 489 +12622 /data/VOCdevkit/VOC2012/JPEGImages/2010_001119.jpg 500 375 1 1 258 423 375 1 6 99 79 141 14 84 45 241 375 14 95 33 389 375 14 8 69 37 163 14 206 69 231 108 +12623 /data/VOCdevkit/VOC2012/JPEGImages/2010_001120.jpg 375 500 2 146 7 342 137 14 1 205 159 500 14 142 203 251 415 +12624 /data/VOCdevkit/VOC2012/JPEGImages/2010_001121.jpg 500 375 6 380 85 500 321 6 43 84 383 253 6 1 83 168 200 +12625 /data/VOCdevkit/VOC2012/JPEGImages/2010_001123.jpg 375 500 8 219 3 375 500 +12626 /data/VOCdevkit/VOC2012/JPEGImages/2010_001124.jpg 500 375 11 4 6 498 326 +12627 /data/VOCdevkit/VOC2012/JPEGImages/2010_001125.jpg 375 500 7 1 1 374 499 +12628 /data/VOCdevkit/VOC2012/JPEGImages/2010_001126.jpg 500 335 3 182 167 258 249 +12629 /data/VOCdevkit/VOC2012/JPEGImages/2010_001127.jpg 500 375 19 1 52 42 142 17 367 78 500 181 17 43 168 453 375 +12630 /data/VOCdevkit/VOC2012/JPEGImages/2010_001130.jpg 375 500 14 1 27 256 500 +12631 /data/VOCdevkit/VOC2012/JPEGImages/2010_001131.jpg 375 500 10 1 336 375 500 14 1 1 296 357 4 256 205 352 496 +12632 /data/VOCdevkit/VOC2012/JPEGImages/2010_001134.jpg 500 333 15 38 244 186 333 15 260 169 497 333 15 417 1 500 82 15 300 26 467 193 15 158 94 323 260 15 1 91 159 250 15 78 1 260 101 +12633 /data/VOCdevkit/VOC2012/JPEGImages/2010_001139.jpg 500 317 0 3 30 500 315 +12634 /data/VOCdevkit/VOC2012/JPEGImages/2010_001140.jpg 500 333 7 53 45 408 214 +12635 /data/VOCdevkit/VOC2012/JPEGImages/2010_001142.jpg 500 375 4 264 210 282 244 14 315 103 371 220 14 283 171 379 342 14 156 180 216 260 14 218 155 280 234 +12636 /data/VOCdevkit/VOC2012/JPEGImages/2010_001143.jpg 500 279 14 337 132 359 186 14 356 132 376 185 18 94 85 304 251 +12637 /data/VOCdevkit/VOC2012/JPEGImages/2010_001147.jpg 500 375 7 31 83 500 277 +12638 /data/VOCdevkit/VOC2012/JPEGImages/2010_001148.jpg 500 375 17 86 208 464 375 14 208 33 320 207 +12639 /data/VOCdevkit/VOC2012/JPEGImages/2010_001149.jpg 500 375 17 255 180 500 329 7 253 262 288 307 7 168 108 199 141 +12640 /data/VOCdevkit/VOC2012/JPEGImages/2010_001151.jpg 500 375 14 98 180 119 237 18 1 157 412 226 +12641 /data/VOCdevkit/VOC2012/JPEGImages/2010_001152.jpg 500 375 6 357 91 446 129 6 431 112 500 199 6 31 115 90 157 6 142 104 207 122 6 107 112 450 332 6 471 90 500 128 6 101 109 150 134 +12642 /data/VOCdevkit/VOC2012/JPEGImages/2010_001154.jpg 500 375 11 84 13 393 375 +12643 /data/VOCdevkit/VOC2012/JPEGImages/2010_001158.jpg 500 375 11 294 138 321 167 11 139 236 194 309 14 287 57 313 156 +12644 /data/VOCdevkit/VOC2012/JPEGImages/2010_001159.jpg 500 374 2 244 55 356 330 +12645 /data/VOCdevkit/VOC2012/JPEGImages/2010_001160.jpg 375 500 16 252 336 317 438 16 124 439 309 500 16 105 301 139 370 16 99 258 141 313 16 289 373 375 498 +12646 /data/VOCdevkit/VOC2012/JPEGImages/2010_001163.jpg 500 376 6 208 154 500 376 6 1 280 259 376 +12647 /data/VOCdevkit/VOC2012/JPEGImages/2010_001164.jpg 500 375 3 427 167 500 218 +12648 /data/VOCdevkit/VOC2012/JPEGImages/2010_001172.jpg 500 333 11 123 24 403 333 +12649 /data/VOCdevkit/VOC2012/JPEGImages/2010_001174.jpg 500 333 0 13 92 495 241 +12650 /data/VOCdevkit/VOC2012/JPEGImages/2010_001175.jpg 500 479 16 15 67 482 479 +12651 /data/VOCdevkit/VOC2012/JPEGImages/2010_001177.jpg 333 500 7 16 27 333 467 +12652 /data/VOCdevkit/VOC2012/JPEGImages/2010_001179.jpg 500 375 16 98 104 130 134 16 273 101 311 124 16 317 133 352 160 16 367 129 398 151 +12653 /data/VOCdevkit/VOC2012/JPEGImages/2010_001181.jpg 500 375 10 3 20 500 375 +12654 /data/VOCdevkit/VOC2012/JPEGImages/2010_001183.jpg 500 333 1 89 11 449 322 +12655 /data/VOCdevkit/VOC2012/JPEGImages/2010_001184.jpg 375 500 12 26 142 375 500 14 43 56 194 335 +12656 /data/VOCdevkit/VOC2012/JPEGImages/2010_001185.jpg 250 176 11 75 58 161 176 6 1 1 250 176 +12657 /data/VOCdevkit/VOC2012/JPEGImages/2010_001188.jpg 500 375 8 1 290 160 374 4 10 113 35 213 4 36 150 57 212 4 70 156 86 214 4 95 157 112 216 4 114 156 131 215 4 181 166 198 216 4 161 162 176 217 4 139 161 152 216 14 220 19 500 375 +12658 /data/VOCdevkit/VOC2012/JPEGImages/2010_001189.jpg 500 375 17 191 184 471 339 8 52 174 166 300 +12659 /data/VOCdevkit/VOC2012/JPEGImages/2010_001192.jpg 500 375 14 53 107 438 375 14 1 19 288 375 +12660 /data/VOCdevkit/VOC2012/JPEGImages/2010_001193.jpg 500 375 7 24 189 462 327 +12661 /data/VOCdevkit/VOC2012/JPEGImages/2010_001195.jpg 500 375 7 241 98 414 250 +12662 /data/VOCdevkit/VOC2012/JPEGImages/2010_001199.jpg 500 375 10 64 146 372 374 8 244 148 349 354 8 111 158 232 360 8 129 142 224 284 8 236 140 323 307 +12663 /data/VOCdevkit/VOC2012/JPEGImages/2010_001201.jpg 500 375 2 212 102 332 323 +12664 /data/VOCdevkit/VOC2012/JPEGImages/2010_001204.jpg 327 500 5 8 150 121 332 14 225 254 261 309 14 295 260 327 350 +12665 /data/VOCdevkit/VOC2012/JPEGImages/2010_001205.jpg 394 263 0 135 64 276 191 +12666 /data/VOCdevkit/VOC2012/JPEGImages/2010_001206.jpg 478 344 5 64 83 410 248 14 49 141 67 182 +12667 /data/VOCdevkit/VOC2012/JPEGImages/2010_001210.jpg 500 375 14 365 152 481 375 +12668 /data/VOCdevkit/VOC2012/JPEGImages/2010_001211.jpg 500 375 11 162 120 269 232 +12669 /data/VOCdevkit/VOC2012/JPEGImages/2010_001212.jpg 500 375 14 378 229 398 256 3 301 178 351 262 3 457 204 500 276 3 131 193 174 283 3 178 175 240 286 3 249 274 317 290 3 277 6 462 293 +12670 /data/VOCdevkit/VOC2012/JPEGImages/2010_001214.jpg 500 333 0 330 145 381 163 +12671 /data/VOCdevkit/VOC2012/JPEGImages/2010_001215.jpg 500 312 7 108 19 446 150 +12672 /data/VOCdevkit/VOC2012/JPEGImages/2010_001216.jpg 500 375 11 181 103 393 280 8 358 1 500 265 +12673 /data/VOCdevkit/VOC2012/JPEGImages/2010_001218.jpg 500 368 11 273 174 410 244 11 30 188 175 276 14 309 1 498 268 14 141 1 325 274 +12674 /data/VOCdevkit/VOC2012/JPEGImages/2010_001219.jpg 333 500 4 127 68 234 357 15 44 1 247 500 +12675 /data/VOCdevkit/VOC2012/JPEGImages/2010_001220.jpg 500 375 6 1 1 500 375 +12676 /data/VOCdevkit/VOC2012/JPEGImages/2010_001224.jpg 500 375 14 80 1 394 374 8 18 1 448 374 4 205 169 332 330 +12677 /data/VOCdevkit/VOC2012/JPEGImages/2010_001225.jpg 500 360 12 85 1 373 283 +12678 /data/VOCdevkit/VOC2012/JPEGImages/2010_001229.jpg 500 375 11 188 168 283 361 +12679 /data/VOCdevkit/VOC2012/JPEGImages/2010_001234.jpg 500 375 13 1 1 422 269 +12680 /data/VOCdevkit/VOC2012/JPEGImages/2010_001237.jpg 500 334 11 1 20 367 322 +12681 /data/VOCdevkit/VOC2012/JPEGImages/2010_001240.jpg 500 407 7 1 1 500 407 +12682 /data/VOCdevkit/VOC2012/JPEGImages/2010_001241.jpg 375 500 14 91 264 130 318 14 222 250 264 345 14 99 219 254 500 +12683 /data/VOCdevkit/VOC2012/JPEGImages/2010_001242.jpg 500 333 11 179 24 422 333 +12684 /data/VOCdevkit/VOC2012/JPEGImages/2010_001245.jpg 500 375 16 180 202 367 348 14 1 70 113 361 +12685 /data/VOCdevkit/VOC2012/JPEGImages/2010_001246.jpg 500 375 6 418 218 458 247 1 1 125 45 236 1 29 128 71 230 15 182 165 250 229 15 287 162 324 220 15 405 204 417 226 15 388 198 405 228 +12686 /data/VOCdevkit/VOC2012/JPEGImages/2010_001247.jpg 500 334 7 170 32 240 108 7 200 69 273 161 7 167 100 230 195 7 165 163 246 246 +12687 /data/VOCdevkit/VOC2012/JPEGImages/2010_001250.jpg 500 375 18 167 1 477 293 14 129 136 240 375 +12688 /data/VOCdevkit/VOC2012/JPEGImages/2010_001251.jpg 500 375 13 1 15 428 374 +12689 /data/VOCdevkit/VOC2012/JPEGImages/2010_001253.jpg 333 500 11 1 48 319 457 +12690 /data/VOCdevkit/VOC2012/JPEGImages/2010_001254.jpg 500 375 1 291 169 389 245 14 228 55 309 277 14 204 101 245 247 14 138 69 196 267 14 71 71 135 263 +12691 /data/VOCdevkit/VOC2012/JPEGImages/2010_001256.jpg 500 375 16 97 95 406 309 +12692 /data/VOCdevkit/VOC2012/JPEGImages/2010_001257.jpg 355 500 16 267 312 312 374 16 199 308 261 395 16 81 297 184 379 16 1 332 83 438 +12693 /data/VOCdevkit/VOC2012/JPEGImages/2010_001261.jpg 375 500 10 1 362 375 500 8 170 268 259 368 +12694 /data/VOCdevkit/VOC2012/JPEGImages/2010_001263.jpg 500 375 14 70 96 104 188 +12695 /data/VOCdevkit/VOC2012/JPEGImages/2010_001264.jpg 500 375 11 121 1 500 375 +12696 /data/VOCdevkit/VOC2012/JPEGImages/2010_001270.jpg 500 375 19 241 47 351 171 +12697 /data/VOCdevkit/VOC2012/JPEGImages/2010_001271.jpg 500 375 10 194 202 370 354 8 238 210 326 364 8 287 199 368 337 8 182 203 264 342 8 279 196 343 320 8 187 198 255 256 +12698 /data/VOCdevkit/VOC2012/JPEGImages/2010_001272.jpg 500 375 18 125 10 500 303 +12699 /data/VOCdevkit/VOC2012/JPEGImages/2010_001273.jpg 500 334 11 49 18 245 307 +12700 /data/VOCdevkit/VOC2012/JPEGImages/2010_001274.jpg 500 321 6 228 264 272 301 +12701 /data/VOCdevkit/VOC2012/JPEGImages/2010_001275.jpg 500 273 6 228 112 432 195 6 43 105 246 193 +12702 /data/VOCdevkit/VOC2012/JPEGImages/2010_001277.jpg 500 375 17 17 164 304 307 8 33 289 370 375 19 468 109 500 216 +12703 /data/VOCdevkit/VOC2012/JPEGImages/2010_001279.jpg 500 375 11 280 179 452 321 11 150 135 243 325 11 135 104 309 289 +12704 /data/VOCdevkit/VOC2012/JPEGImages/2010_001282.jpg 500 333 11 253 92 500 333 +12705 /data/VOCdevkit/VOC2012/JPEGImages/2010_001286.jpg 500 333 16 228 1 500 333 16 1 1 278 333 +12706 /data/VOCdevkit/VOC2012/JPEGImages/2010_001287.jpg 500 332 17 172 44 500 227 17 1 49 221 332 14 271 19 426 213 14 60 30 254 332 10 198 191 420 332 +12707 /data/VOCdevkit/VOC2012/JPEGImages/2010_001288.jpg 386 267 5 1 1 361 229 14 130 119 176 239 +12708 /data/VOCdevkit/VOC2012/JPEGImages/2010_001289.jpg 500 401 14 182 118 297 297 3 55 54 425 401 +12709 /data/VOCdevkit/VOC2012/JPEGImages/2010_001291.jpg 336 500 7 44 105 336 386 7 1 249 267 467 +12710 /data/VOCdevkit/VOC2012/JPEGImages/2010_001292.jpg 500 412 7 3 35 339 412 +12711 /data/VOCdevkit/VOC2012/JPEGImages/2010_001293.jpg 500 333 11 142 91 500 257 +12712 /data/VOCdevkit/VOC2012/JPEGImages/2010_001294.jpg 500 332 0 7 63 487 217 0 129 189 191 210 +12713 /data/VOCdevkit/VOC2012/JPEGImages/2010_001299.jpg 279 500 11 22 3 253 457 +12714 /data/VOCdevkit/VOC2012/JPEGImages/2010_001301.jpg 500 339 11 199 81 338 304 11 71 114 218 295 +12715 /data/VOCdevkit/VOC2012/JPEGImages/2010_001305.jpg 500 375 11 168 41 358 375 +12716 /data/VOCdevkit/VOC2012/JPEGImages/2010_001310.jpg 335 500 15 231 433 321 500 +12717 /data/VOCdevkit/VOC2012/JPEGImages/2010_001311.jpg 500 335 11 50 33 458 335 +12718 /data/VOCdevkit/VOC2012/JPEGImages/2010_001312.jpg 400 266 1 184 134 284 223 14 185 99 207 205 14 202 85 262 214 +12719 /data/VOCdevkit/VOC2012/JPEGImages/2010_001313.jpg 375 500 13 18 158 146 330 14 62 155 142 287 +12720 /data/VOCdevkit/VOC2012/JPEGImages/2010_001315.jpg 500 333 6 99 79 424 215 +12721 /data/VOCdevkit/VOC2012/JPEGImages/2010_001317.jpg 500 371 9 130 74 369 371 +12722 /data/VOCdevkit/VOC2012/JPEGImages/2010_001320.jpg 375 500 0 122 245 325 326 +12723 /data/VOCdevkit/VOC2012/JPEGImages/2010_001321.jpg 500 375 6 417 190 500 244 6 310 192 424 252 6 184 183 343 258 +12724 /data/VOCdevkit/VOC2012/JPEGImages/2010_001325.jpg 500 332 12 159 119 372 325 14 215 22 299 205 +12725 /data/VOCdevkit/VOC2012/JPEGImages/2010_001326.jpg 500 375 11 102 7 466 375 +12726 /data/VOCdevkit/VOC2012/JPEGImages/2010_001327.jpg 500 374 17 32 34 500 374 +12727 /data/VOCdevkit/VOC2012/JPEGImages/2010_001328.jpg 500 376 7 3 15 432 376 +12728 /data/VOCdevkit/VOC2012/JPEGImages/2010_001329.jpg 500 334 12 258 73 396 253 14 298 72 371 186 +12729 /data/VOCdevkit/VOC2012/JPEGImages/2010_001331.jpg 500 375 7 23 97 306 343 +12730 /data/VOCdevkit/VOC2012/JPEGImages/2010_001333.jpg 500 375 7 277 6 436 115 +12731 /data/VOCdevkit/VOC2012/JPEGImages/2010_001337.jpg 333 500 11 94 315 138 359 14 93 84 141 264 14 83 208 163 339 6 207 198 333 387 +12732 /data/VOCdevkit/VOC2012/JPEGImages/2010_001338.jpg 500 375 1 240 226 500 374 1 354 237 500 374 1 14 277 362 375 1 1 212 149 375 14 68 96 287 375 4 354 270 378 301 +12733 /data/VOCdevkit/VOC2012/JPEGImages/2010_001339.jpg 500 375 11 1 1 337 375 +12734 /data/VOCdevkit/VOC2012/JPEGImages/2010_001343.jpg 333 500 8 54 172 142 243 8 266 207 333 297 8 1 222 117 456 8 11 266 174 500 10 34 232 333 500 +12735 /data/VOCdevkit/VOC2012/JPEGImages/2010_001344.jpg 500 375 7 44 71 491 327 +12736 /data/VOCdevkit/VOC2012/JPEGImages/2010_001347.jpg 500 375 7 1 95 499 279 +12737 /data/VOCdevkit/VOC2012/JPEGImages/2010_001351.jpg 500 333 7 253 36 500 249 +12738 /data/VOCdevkit/VOC2012/JPEGImages/2010_001355.jpg 335 500 11 167 298 228 367 +12739 /data/VOCdevkit/VOC2012/JPEGImages/2010_001356.jpg 500 333 16 6 1 500 333 +12740 /data/VOCdevkit/VOC2012/JPEGImages/2010_001357.jpg 500 375 14 378 184 401 229 3 249 196 422 236 +12741 /data/VOCdevkit/VOC2012/JPEGImages/2010_001360.jpg 282 192 6 5 81 253 183 +12742 /data/VOCdevkit/VOC2012/JPEGImages/2010_001361.jpg 500 375 7 1 34 500 375 +12743 /data/VOCdevkit/VOC2012/JPEGImages/2010_001363.jpg 500 500 19 285 261 486 443 19 1 251 65 464 +12744 /data/VOCdevkit/VOC2012/JPEGImages/2010_001364.jpg 500 363 5 1 62 306 354 +12745 /data/VOCdevkit/VOC2012/JPEGImages/2010_001366.jpg 500 332 10 138 197 330 332 8 309 181 395 332 +12746 /data/VOCdevkit/VOC2012/JPEGImages/2010_001367.jpg 500 411 1 142 89 433 389 4 298 271 400 356 14 268 1 500 411 19 1 50 144 283 +12747 /data/VOCdevkit/VOC2012/JPEGImages/2010_001370.jpg 375 500 11 1 51 305 500 +12748 /data/VOCdevkit/VOC2012/JPEGImages/2010_001372.jpg 500 380 2 116 133 395 209 +12749 /data/VOCdevkit/VOC2012/JPEGImages/2010_001374.jpg 500 336 18 1 237 500 336 +12750 /data/VOCdevkit/VOC2012/JPEGImages/2010_001376.jpg 300 245 11 5 6 130 229 11 78 102 215 226 11 181 48 297 237 +12751 /data/VOCdevkit/VOC2012/JPEGImages/2010_001382.jpg 500 375 7 104 111 314 325 +12752 /data/VOCdevkit/VOC2012/JPEGImages/2010_001383.jpg 500 375 13 1 1 500 375 +12753 /data/VOCdevkit/VOC2012/JPEGImages/2010_001385.jpg 500 375 7 154 49 397 282 14 1 111 123 375 +12754 /data/VOCdevkit/VOC2012/JPEGImages/2010_001386.jpg 500 375 7 44 9 394 276 +12755 /data/VOCdevkit/VOC2012/JPEGImages/2010_001390.jpg 500 305 11 75 103 290 254 11 263 65 367 168 +12756 /data/VOCdevkit/VOC2012/JPEGImages/2010_001394.jpg 500 375 6 2 16 496 318 +12757 /data/VOCdevkit/VOC2012/JPEGImages/2010_001395.jpg 500 375 18 1 56 304 258 18 1 23 500 259 +12758 /data/VOCdevkit/VOC2012/JPEGImages/2010_001397.jpg 375 500 14 42 82 324 500 +12759 /data/VOCdevkit/VOC2012/JPEGImages/2010_001399.jpg 500 326 11 171 164 267 267 11 299 176 396 268 14 258 72 285 150 +12760 /data/VOCdevkit/VOC2012/JPEGImages/2010_001401.jpg 500 375 7 1 19 500 374 14 11 1 500 375 +12761 /data/VOCdevkit/VOC2012/JPEGImages/2010_001402.jpg 500 375 7 133 50 404 375 +12762 /data/VOCdevkit/VOC2012/JPEGImages/2010_001403.jpg 500 344 5 96 1 488 325 6 1 204 111 304 +12763 /data/VOCdevkit/VOC2012/JPEGImages/2010_001405.jpg 500 375 18 240 97 500 346 +12764 /data/VOCdevkit/VOC2012/JPEGImages/2010_001406.jpg 500 375 9 7 219 105 268 9 47 232 193 306 9 216 189 315 241 9 349 174 436 236 +12765 /data/VOCdevkit/VOC2012/JPEGImages/2010_001407.jpg 500 440 11 171 198 376 427 11 326 45 419 209 11 322 28 483 125 +12766 /data/VOCdevkit/VOC2012/JPEGImages/2010_001408.jpg 375 500 14 123 262 144 319 14 62 259 105 377 18 1 177 226 375 18 319 246 375 306 +12767 /data/VOCdevkit/VOC2012/JPEGImages/2010_001410.jpg 500 375 5 18 73 486 302 +12768 /data/VOCdevkit/VOC2012/JPEGImages/2010_001411.jpg 500 334 14 180 135 234 304 14 215 143 281 314 14 336 136 391 334 14 306 118 354 315 14 8 167 18 198 +12769 /data/VOCdevkit/VOC2012/JPEGImages/2010_001412.jpg 500 333 12 232 1 486 222 14 165 90 278 270 +12770 /data/VOCdevkit/VOC2012/JPEGImages/2010_001413.jpg 500 333 0 34 114 471 228 6 486 195 500 217 14 470 186 481 217 +12771 /data/VOCdevkit/VOC2012/JPEGImages/2010_001417.jpg 361 500 7 28 42 329 500 +12772 /data/VOCdevkit/VOC2012/JPEGImages/2010_001418.jpg 500 375 7 1 48 323 375 4 179 1 228 78 +12773 /data/VOCdevkit/VOC2012/JPEGImages/2010_001421.jpg 500 400 11 117 52 463 392 +12774 /data/VOCdevkit/VOC2012/JPEGImages/2010_001422.jpg 500 376 11 1 232 178 376 +12775 /data/VOCdevkit/VOC2012/JPEGImages/2010_001425.jpg 500 375 11 185 83 500 278 +12776 /data/VOCdevkit/VOC2012/JPEGImages/2010_001426.jpg 500 266 0 28 47 480 234 +12777 /data/VOCdevkit/VOC2012/JPEGImages/2010_001430.jpg 500 336 15 289 149 323 214 14 113 92 236 302 +12778 /data/VOCdevkit/VOC2012/JPEGImages/2010_001431.jpg 375 500 1 36 242 367 437 6 1 113 46 141 6 45 118 65 140 6 152 117 204 164 14 178 64 280 491 +12779 /data/VOCdevkit/VOC2012/JPEGImages/2010_001432.jpg 321 500 11 10 3 310 494 +12780 /data/VOCdevkit/VOC2012/JPEGImages/2010_001433.jpg 333 500 2 221 193 257 217 2 15 183 50 226 2 30 248 69 291 2 161 204 190 244 +12781 /data/VOCdevkit/VOC2012/JPEGImages/2010_001434.jpg 500 375 17 39 245 398 374 8 295 184 421 309 +12782 /data/VOCdevkit/VOC2012/JPEGImages/2010_001435.jpg 400 300 7 9 80 322 300 +12783 /data/VOCdevkit/VOC2012/JPEGImages/2010_001439.jpg 500 333 1 209 273 238 315 14 213 246 234 289 +12784 /data/VOCdevkit/VOC2012/JPEGImages/2010_001441.jpg 375 500 2 79 91 276 500 +12785 /data/VOCdevkit/VOC2012/JPEGImages/2010_001448.jpg 500 375 0 136 17 440 330 +12786 /data/VOCdevkit/VOC2012/JPEGImages/2010_001449.jpg 500 375 6 2 119 391 354 14 202 138 257 202 +12787 /data/VOCdevkit/VOC2012/JPEGImages/2010_001450.jpg 333 500 11 78 105 279 413 +12788 /data/VOCdevkit/VOC2012/JPEGImages/2010_001451.jpg 314 400 12 37 1 314 384 +12789 /data/VOCdevkit/VOC2012/JPEGImages/2010_001452.jpg 500 375 7 173 80 477 343 +12790 /data/VOCdevkit/VOC2012/JPEGImages/2010_001453.jpg 500 333 5 102 66 360 252 6 1 182 38 210 14 401 202 438 257 14 45 179 58 216 +12791 /data/VOCdevkit/VOC2012/JPEGImages/2010_001455.jpg 375 500 8 115 305 224 442 8 15 301 122 464 10 1 315 190 457 8 97 305 151 434 +12792 /data/VOCdevkit/VOC2012/JPEGImages/2010_001456.jpg 375 500 3 92 415 375 456 +12793 /data/VOCdevkit/VOC2012/JPEGImages/2010_001457.jpg 500 333 7 125 30 384 236 +12794 /data/VOCdevkit/VOC2012/JPEGImages/2010_001458.jpg 500 333 5 63 67 453 318 5 1 162 73 248 14 455 223 470 288 14 469 231 489 282 +12795 /data/VOCdevkit/VOC2012/JPEGImages/2010_001461.jpg 500 333 11 92 1 373 333 +12796 /data/VOCdevkit/VOC2012/JPEGImages/2010_001463.jpg 375 500 4 210 120 314 464 +12797 /data/VOCdevkit/VOC2012/JPEGImages/2010_001464.jpg 463 500 11 4 5 459 500 +12798 /data/VOCdevkit/VOC2012/JPEGImages/2010_001465.jpg 500 375 7 31 39 500 267 +12799 /data/VOCdevkit/VOC2012/JPEGImages/2010_001468.jpg 500 355 7 1 10 472 336 +12800 /data/VOCdevkit/VOC2012/JPEGImages/2010_001472.jpg 500 333 13 93 1 175 43 13 95 40 363 290 13 289 7 371 92 13 332 33 500 278 +12801 /data/VOCdevkit/VOC2012/JPEGImages/2010_001473.jpg 500 333 11 36 1 500 299 +12802 /data/VOCdevkit/VOC2012/JPEGImages/2010_001478.jpg 500 333 6 37 104 334 251 +12803 /data/VOCdevkit/VOC2012/JPEGImages/2010_001479.jpg 375 500 14 160 217 374 481 14 1 34 138 360 14 182 1 319 247 15 1 255 56 452 15 64 127 160 325 15 310 165 375 289 +12804 /data/VOCdevkit/VOC2012/JPEGImages/2010_001480.jpg 500 375 14 98 117 146 189 14 137 123 167 181 +12805 /data/VOCdevkit/VOC2012/JPEGImages/2010_001481.jpg 480 500 2 233 305 322 397 +12806 /data/VOCdevkit/VOC2012/JPEGImages/2010_001486.jpg 500 357 14 1 11 271 357 +12807 /data/VOCdevkit/VOC2012/JPEGImages/2010_001487.jpg 500 375 11 60 53 456 375 +12808 /data/VOCdevkit/VOC2012/JPEGImages/2010_001489.jpg 492 369 0 20 140 404 251 +12809 /data/VOCdevkit/VOC2012/JPEGImages/2010_001497.jpg 498 500 11 158 142 392 397 11 128 203 166 251 +12810 /data/VOCdevkit/VOC2012/JPEGImages/2010_001499.jpg 500 375 7 131 33 500 352 +12811 /data/VOCdevkit/VOC2012/JPEGImages/2010_001501.jpg 335 500 3 59 210 335 461 +12812 /data/VOCdevkit/VOC2012/JPEGImages/2010_001502.jpg 500 375 14 67 69 144 335 18 1 1 500 148 +12813 /data/VOCdevkit/VOC2012/JPEGImages/2010_001503.jpg 375 500 12 132 115 352 427 +12814 /data/VOCdevkit/VOC2012/JPEGImages/2010_001505.jpg 500 375 0 1 41 500 306 +12815 /data/VOCdevkit/VOC2012/JPEGImages/2010_001511.jpg 500 375 8 441 249 500 372 8 341 267 438 375 10 378 263 500 375 +12816 /data/VOCdevkit/VOC2012/JPEGImages/2010_001514.jpg 500 405 1 2 17 479 391 8 171 1 414 244 17 1 1 266 133 +12817 /data/VOCdevkit/VOC2012/JPEGImages/2010_001515.jpg 375 500 18 1 74 341 480 +12818 /data/VOCdevkit/VOC2012/JPEGImages/2010_001516.jpg 500 375 7 1 18 422 263 +12819 /data/VOCdevkit/VOC2012/JPEGImages/2010_001518.jpg 500 354 11 246 160 278 195 +12820 /data/VOCdevkit/VOC2012/JPEGImages/2010_001520.jpg 375 500 2 104 165 236 334 +12821 /data/VOCdevkit/VOC2012/JPEGImages/2010_001522.jpg 500 375 16 47 133 424 327 +12822 /data/VOCdevkit/VOC2012/JPEGImages/2010_001525.jpg 500 375 3 312 87 470 222 3 282 126 383 194 3 52 193 229 274 +12823 /data/VOCdevkit/VOC2012/JPEGImages/2010_001528.jpg 500 375 14 248 127 397 295 14 2 88 324 375 8 388 228 493 375 +12824 /data/VOCdevkit/VOC2012/JPEGImages/2010_001529.jpg 281 500 11 3 44 259 473 +12825 /data/VOCdevkit/VOC2012/JPEGImages/2010_001533.jpg 500 400 19 68 67 172 211 19 1 70 101 253 8 348 111 500 400 14 183 15 438 400 +12826 /data/VOCdevkit/VOC2012/JPEGImages/2010_001534.jpg 500 375 7 13 49 500 374 +12827 /data/VOCdevkit/VOC2012/JPEGImages/2010_001535.jpg 500 375 10 108 295 405 374 8 367 97 500 251 8 307 116 490 303 4 53 274 126 375 14 1 1 453 352 3 351 82 430 120 10 421 133 500 172 +12828 /data/VOCdevkit/VOC2012/JPEGImages/2010_001536.jpg 500 375 6 309 268 490 322 +12829 /data/VOCdevkit/VOC2012/JPEGImages/2010_001537.jpg 500 333 11 162 1 467 299 11 108 106 337 277 +12830 /data/VOCdevkit/VOC2012/JPEGImages/2010_001539.jpg 500 375 18 1 28 500 309 +12831 /data/VOCdevkit/VOC2012/JPEGImages/2010_001540.jpg 375 500 1 1 1 375 500 +12832 /data/VOCdevkit/VOC2012/JPEGImages/2010_001543.jpg 500 375 11 48 95 307 282 14 91 7 474 283 +12833 /data/VOCdevkit/VOC2012/JPEGImages/2010_001544.jpg 375 500 7 81 156 375 500 15 1 1 168 500 15 249 117 294 178 +12834 /data/VOCdevkit/VOC2012/JPEGImages/2010_001547.jpg 353 400 17 189 178 319 316 8 17 172 92 256 17 65 165 169 229 15 164 139 218 228 +12835 /data/VOCdevkit/VOC2012/JPEGImages/2010_001548.jpg 500 333 9 102 130 296 318 +12836 /data/VOCdevkit/VOC2012/JPEGImages/2010_001550.jpg 500 333 6 48 14 467 330 +12837 /data/VOCdevkit/VOC2012/JPEGImages/2010_001551.jpg 500 373 3 148 113 308 156 14 316 188 344 276 +12838 /data/VOCdevkit/VOC2012/JPEGImages/2010_001552.jpg 500 335 14 1 7 132 335 14 122 1 189 206 14 132 47 393 335 +12839 /data/VOCdevkit/VOC2012/JPEGImages/2010_001553.jpg 358 500 6 47 1 358 191 13 1 34 294 500 +12840 /data/VOCdevkit/VOC2012/JPEGImages/2010_001555.jpg 500 341 7 1 23 459 340 +12841 /data/VOCdevkit/VOC2012/JPEGImages/2010_001557.jpg 375 500 16 76 169 211 396 16 149 124 245 285 16 80 76 170 189 16 216 89 323 234 +12842 /data/VOCdevkit/VOC2012/JPEGImages/2010_001560.jpg 500 310 18 146 37 499 310 +12843 /data/VOCdevkit/VOC2012/JPEGImages/2010_001561.jpg 500 370 6 13 59 488 350 +12844 /data/VOCdevkit/VOC2012/JPEGImages/2010_001562.jpg 500 334 19 413 120 500 252 +12845 /data/VOCdevkit/VOC2012/JPEGImages/2010_001563.jpg 375 500 11 229 314 302 380 11 182 298 238 341 14 215 127 286 351 +12846 /data/VOCdevkit/VOC2012/JPEGImages/2010_001569.jpg 500 332 2 182 6 306 305 +12847 /data/VOCdevkit/VOC2012/JPEGImages/2010_001571.jpg 500 375 11 126 53 417 294 +12848 /data/VOCdevkit/VOC2012/JPEGImages/2010_001572.jpg 500 374 6 216 141 478 250 6 49 140 309 265 +12849 /data/VOCdevkit/VOC2012/JPEGImages/2010_001574.jpg 500 375 8 54 119 134 219 8 125 124 214 250 +12850 /data/VOCdevkit/VOC2012/JPEGImages/2010_001576.jpg 500 375 10 1 49 500 375 +12851 /data/VOCdevkit/VOC2012/JPEGImages/2010_001577.jpg 500 375 16 109 1 368 375 16 296 260 500 375 16 1 1 115 82 +12852 /data/VOCdevkit/VOC2012/JPEGImages/2010_001579.jpg 500 375 10 1 244 500 373 14 53 3 283 253 14 305 1 500 261 14 83 92 157 135 14 12 54 104 189 8 291 177 336 245 +12853 /data/VOCdevkit/VOC2012/JPEGImages/2010_001580.jpg 500 375 19 346 166 474 288 14 14 163 243 375 +12854 /data/VOCdevkit/VOC2012/JPEGImages/2010_001583.jpg 500 333 0 21 85 482 212 +12855 /data/VOCdevkit/VOC2012/JPEGImages/2010_001584.jpg 499 500 2 347 71 422 186 +12856 /data/VOCdevkit/VOC2012/JPEGImages/2010_001586.jpg 500 399 14 196 210 295 381 14 279 258 337 381 14 317 252 391 383 14 381 222 460 390 14 323 142 420 289 18 2 80 499 311 17 261 283 454 384 +12857 /data/VOCdevkit/VOC2012/JPEGImages/2010_001587.jpg 500 334 7 97 3 397 334 +12858 /data/VOCdevkit/VOC2012/JPEGImages/2010_001590.jpg 500 302 7 17 18 481 292 +12859 /data/VOCdevkit/VOC2012/JPEGImages/2010_001592.jpg 500 327 1 16 10 489 303 +12860 /data/VOCdevkit/VOC2012/JPEGImages/2010_001594.jpg 500 375 3 138 184 203 216 +12861 /data/VOCdevkit/VOC2012/JPEGImages/2010_001595.jpg 500 388 12 26 141 314 329 12 294 186 464 284 12 185 78 447 260 +12862 /data/VOCdevkit/VOC2012/JPEGImages/2010_001596.jpg 333 500 11 125 30 301 379 +12863 /data/VOCdevkit/VOC2012/JPEGImages/2010_001599.jpg 500 334 2 95 172 147 242 2 165 181 203 240 2 239 197 263 243 2 311 184 337 214 2 315 195 372 240 +12864 /data/VOCdevkit/VOC2012/JPEGImages/2010_001601.jpg 500 375 11 183 65 352 362 +12865 /data/VOCdevkit/VOC2012/JPEGImages/2010_001602.jpg 500 375 7 158 74 347 323 +12866 /data/VOCdevkit/VOC2012/JPEGImages/2010_001603.jpg 500 478 2 97 2 472 468 +12867 /data/VOCdevkit/VOC2012/JPEGImages/2010_001606.jpg 333 500 1 72 291 266 497 +12868 /data/VOCdevkit/VOC2012/JPEGImages/2010_001607.jpg 500 333 16 63 70 276 245 16 142 64 416 260 +12869 /data/VOCdevkit/VOC2012/JPEGImages/2010_001608.jpg 500 375 8 245 211 311 261 8 458 223 500 270 8 221 247 305 375 8 253 278 335 375 10 237 240 500 375 +12870 /data/VOCdevkit/VOC2012/JPEGImages/2010_001614.jpg 375 500 13 70 98 271 463 +12871 /data/VOCdevkit/VOC2012/JPEGImages/2010_001618.jpg 500 375 16 269 183 299 195 16 177 179 200 191 +12872 /data/VOCdevkit/VOC2012/JPEGImages/2010_001619.jpg 500 377 14 1 177 55 368 14 147 179 204 320 14 78 207 151 374 14 233 187 265 323 14 291 184 346 328 14 192 181 267 377 14 419 146 488 362 +12873 /data/VOCdevkit/VOC2012/JPEGImages/2010_001625.jpg 500 335 18 27 120 483 207 +12874 /data/VOCdevkit/VOC2012/JPEGImages/2010_001626.jpg 375 500 11 1 1 375 500 +12875 /data/VOCdevkit/VOC2012/JPEGImages/2010_001630.jpg 500 335 5 89 43 299 295 5 371 126 431 211 +12876 /data/VOCdevkit/VOC2012/JPEGImages/2010_001633.jpg 500 375 11 19 1 472 375 +12877 /data/VOCdevkit/VOC2012/JPEGImages/2010_001635.jpg 288 500 11 205 285 269 342 14 10 57 278 500 +12878 /data/VOCdevkit/VOC2012/JPEGImages/2010_001636.jpg 500 375 17 1 105 500 375 14 1 95 204 375 14 211 51 500 375 +12879 /data/VOCdevkit/VOC2012/JPEGImages/2010_001637.jpg 500 453 7 124 1 500 453 +12880 /data/VOCdevkit/VOC2012/JPEGImages/2010_001638.jpg 500 333 6 57 70 454 317 14 404 71 440 129 14 375 80 403 139 14 380 66 408 103 14 106 52 131 88 +12881 /data/VOCdevkit/VOC2012/JPEGImages/2010_001640.jpg 500 328 5 1 64 210 246 5 92 84 368 237 5 358 99 470 230 5 298 121 500 220 +12882 /data/VOCdevkit/VOC2012/JPEGImages/2010_001644.jpg 401 500 11 9 57 401 500 +12883 /data/VOCdevkit/VOC2012/JPEGImages/2010_001645.jpg 500 332 14 84 135 117 197 14 104 87 160 249 14 145 72 213 219 14 205 70 276 216 14 243 115 336 299 14 215 119 374 332 14 361 160 478 332 14 414 126 490 242 10 165 213 370 332 +12884 /data/VOCdevkit/VOC2012/JPEGImages/2010_001646.jpg 500 297 5 269 49 496 265 5 142 110 258 230 5 11 77 144 244 +12885 /data/VOCdevkit/VOC2012/JPEGImages/2010_001647.jpg 500 375 7 10 62 500 289 +12886 /data/VOCdevkit/VOC2012/JPEGImages/2010_001649.jpg 500 375 14 86 1 500 375 +12887 /data/VOCdevkit/VOC2012/JPEGImages/2010_001650.jpg 500 375 5 54 26 394 370 6 1 236 29 257 14 193 210 246 264 +12888 /data/VOCdevkit/VOC2012/JPEGImages/2010_001652.jpg 500 333 0 77 96 475 231 +12889 /data/VOCdevkit/VOC2012/JPEGImages/2010_001656.jpg 375 500 7 47 95 314 500 +12890 /data/VOCdevkit/VOC2012/JPEGImages/2010_001659.jpg 500 375 11 165 102 232 247 +12891 /data/VOCdevkit/VOC2012/JPEGImages/2010_001660.jpg 500 360 7 59 40 500 360 +12892 /data/VOCdevkit/VOC2012/JPEGImages/2010_001665.jpg 500 375 11 160 48 349 340 +12893 /data/VOCdevkit/VOC2012/JPEGImages/2010_001668.jpg 500 367 6 66 176 445 301 +12894 /data/VOCdevkit/VOC2012/JPEGImages/2010_001669.jpg 500 375 6 22 150 77 202 14 89 178 231 324 +12895 /data/VOCdevkit/VOC2012/JPEGImages/2010_001671.jpg 500 417 9 124 120 378 335 9 141 204 313 329 +12896 /data/VOCdevkit/VOC2012/JPEGImages/2010_001674.jpg 375 500 8 69 90 374 500 14 20 53 339 500 +12897 /data/VOCdevkit/VOC2012/JPEGImages/2010_001675.jpg 500 333 12 1 1 500 333 +12898 /data/VOCdevkit/VOC2012/JPEGImages/2010_001676.jpg 500 333 12 43 51 419 313 12 73 48 480 323 +12899 /data/VOCdevkit/VOC2012/JPEGImages/2010_001679.jpg 500 335 11 1 17 500 335 +12900 /data/VOCdevkit/VOC2012/JPEGImages/2010_001680.jpg 500 375 10 12 38 485 375 4 233 145 282 250 8 1 1 146 133 +12901 /data/VOCdevkit/VOC2012/JPEGImages/2010_001682.jpg 500 375 8 384 124 472 296 8 165 121 230 199 4 114 182 154 250 14 151 129 215 197 14 228 108 336 301 14 240 180 391 375 10 1 190 258 375 +12902 /data/VOCdevkit/VOC2012/JPEGImages/2010_001685.jpg 500 333 6 18 22 485 333 6 340 1 500 114 6 227 1 298 20 6 130 1 219 30 6 1 1 134 55 +12903 /data/VOCdevkit/VOC2012/JPEGImages/2010_001687.jpg 500 334 11 1 1 280 333 +12904 /data/VOCdevkit/VOC2012/JPEGImages/2010_001689.jpg 500 375 11 26 60 387 357 14 1 1 500 347 +12905 /data/VOCdevkit/VOC2012/JPEGImages/2010_001690.jpg 500 418 19 1 1 489 418 +12906 /data/VOCdevkit/VOC2012/JPEGImages/2010_001691.jpg 418 291 3 145 97 174 200 +12907 /data/VOCdevkit/VOC2012/JPEGImages/2010_001692.jpg 450 338 9 173 120 450 337 14 124 53 268 338 +12908 /data/VOCdevkit/VOC2012/JPEGImages/2010_001694.jpg 500 358 9 188 131 299 301 +12909 /data/VOCdevkit/VOC2012/JPEGImages/2010_001697.jpg 500 443 2 74 141 429 313 +12910 /data/VOCdevkit/VOC2012/JPEGImages/2010_001698.jpg 375 500 4 35 2 200 500 +12911 /data/VOCdevkit/VOC2012/JPEGImages/2010_001699.jpg 500 375 14 270 91 420 375 8 258 84 421 358 15 456 100 500 169 15 199 18 410 158 +12912 /data/VOCdevkit/VOC2012/JPEGImages/2010_001700.jpg 375 500 7 131 178 312 500 +12913 /data/VOCdevkit/VOC2012/JPEGImages/2010_001705.jpg 500 375 11 93 36 365 344 +12914 /data/VOCdevkit/VOC2012/JPEGImages/2010_001706.jpg 500 375 11 235 1 500 374 +12915 /data/VOCdevkit/VOC2012/JPEGImages/2010_001709.jpg 500 377 11 137 38 437 301 +12916 /data/VOCdevkit/VOC2012/JPEGImages/2010_001710.jpg 500 375 3 50 162 122 183 3 1 165 25 184 3 113 146 195 172 +12917 /data/VOCdevkit/VOC2012/JPEGImages/2010_001712.jpg 500 375 7 94 158 335 375 8 22 236 93 375 +12918 /data/VOCdevkit/VOC2012/JPEGImages/2010_001715.jpg 500 381 11 1 25 337 377 2 251 165 489 354 +12919 /data/VOCdevkit/VOC2012/JPEGImages/2010_001717.jpg 500 333 15 59 44 319 292 +12920 /data/VOCdevkit/VOC2012/JPEGImages/2010_001718.jpg 500 375 0 335 144 412 248 +12921 /data/VOCdevkit/VOC2012/JPEGImages/2010_001719.jpg 500 375 18 1 127 500 250 +12922 /data/VOCdevkit/VOC2012/JPEGImages/2010_001720.jpg 500 367 11 190 113 375 194 14 1 1 341 346 +12923 /data/VOCdevkit/VOC2012/JPEGImages/2010_001726.jpg 445 500 11 68 200 302 390 11 37 201 194 416 8 145 56 335 287 +12924 /data/VOCdevkit/VOC2012/JPEGImages/2010_001729.jpg 500 334 14 140 223 164 256 14 263 199 288 258 3 44 206 256 285 3 377 209 402 233 +12925 /data/VOCdevkit/VOC2012/JPEGImages/2010_001731.jpg 500 500 8 109 37 385 469 +12926 /data/VOCdevkit/VOC2012/JPEGImages/2010_001732.jpg 500 375 5 172 79 354 261 5 14 80 127 209 6 271 73 289 88 +12927 /data/VOCdevkit/VOC2012/JPEGImages/2010_001734.jpg 500 375 18 188 161 336 322 14 135 269 157 330 14 3 274 44 375 +12928 /data/VOCdevkit/VOC2012/JPEGImages/2010_001737.jpg 500 375 7 323 73 411 315 +12929 /data/VOCdevkit/VOC2012/JPEGImages/2010_001739.jpg 269 500 14 50 26 189 478 +12930 /data/VOCdevkit/VOC2012/JPEGImages/2010_001743.jpg 500 375 8 375 154 456 247 8 278 140 340 207 15 2 160 97 256 17 80 145 309 291 +12931 /data/VOCdevkit/VOC2012/JPEGImages/2010_001744.jpg 500 357 7 3 78 500 357 7 1 102 265 254 +12932 /data/VOCdevkit/VOC2012/JPEGImages/2010_001746.jpg 500 333 16 1 18 481 333 +12933 /data/VOCdevkit/VOC2012/JPEGImages/2010_001747.jpg 314 500 7 19 11 215 490 +12934 /data/VOCdevkit/VOC2012/JPEGImages/2010_001748.jpg 500 341 14 466 187 492 272 14 28 216 42 244 18 75 19 480 305 +12935 /data/VOCdevkit/VOC2012/JPEGImages/2010_001749.jpg 500 375 14 159 99 283 294 3 1 124 500 375 +12936 /data/VOCdevkit/VOC2012/JPEGImages/2010_001752.jpg 500 333 19 128 25 371 191 +12937 /data/VOCdevkit/VOC2012/JPEGImages/2010_001753.jpg 500 498 1 118 28 393 490 4 243 225 279 270 +12938 /data/VOCdevkit/VOC2012/JPEGImages/2010_001754.jpg 500 375 11 23 144 261 292 7 225 51 500 283 +12939 /data/VOCdevkit/VOC2012/JPEGImages/2010_001756.jpg 500 375 11 32 144 470 375 14 1 1 473 375 +12940 /data/VOCdevkit/VOC2012/JPEGImages/2010_001757.jpg 500 375 6 163 172 500 375 14 48 56 161 375 +12941 /data/VOCdevkit/VOC2012/JPEGImages/2010_001759.jpg 500 324 12 262 137 459 295 12 1 125 218 309 +12942 /data/VOCdevkit/VOC2012/JPEGImages/2010_001760.jpg 416 500 11 30 44 386 441 +12943 /data/VOCdevkit/VOC2012/JPEGImages/2010_001762.jpg 500 375 14 148 114 312 375 14 361 26 466 173 14 124 75 218 217 +12944 /data/VOCdevkit/VOC2012/JPEGImages/2010_001763.jpg 500 335 17 7 40 464 310 +12945 /data/VOCdevkit/VOC2012/JPEGImages/2010_001767.jpg 500 375 6 1 34 215 142 17 1 142 423 375 14 212 102 383 375 14 168 12 281 159 14 1 122 143 375 +12946 /data/VOCdevkit/VOC2012/JPEGImages/2010_001768.jpg 500 333 11 132 161 181 205 11 23 159 105 223 14 402 97 435 183 +12947 /data/VOCdevkit/VOC2012/JPEGImages/2010_001770.jpg 500 334 6 113 182 155 197 +12948 /data/VOCdevkit/VOC2012/JPEGImages/2010_001771.jpg 480 297 5 45 95 375 224 +12949 /data/VOCdevkit/VOC2012/JPEGImages/2010_001773.jpg 500 375 15 295 17 432 189 15 17 70 386 302 15 1 69 93 224 +12950 /data/VOCdevkit/VOC2012/JPEGImages/2010_001776.jpg 500 375 11 94 146 416 374 11 38 17 385 225 +12951 /data/VOCdevkit/VOC2012/JPEGImages/2010_001777.jpg 375 500 10 2 154 375 500 +12952 /data/VOCdevkit/VOC2012/JPEGImages/2010_001780.jpg 500 375 19 148 147 324 299 +12953 /data/VOCdevkit/VOC2012/JPEGImages/2010_001783.jpg 500 375 7 1 52 500 375 +12954 /data/VOCdevkit/VOC2012/JPEGImages/2010_001784.jpg 500 375 2 60 30 148 68 2 141 85 300 171 +12955 /data/VOCdevkit/VOC2012/JPEGImages/2010_001785.jpg 500 375 10 64 181 440 375 4 314 132 342 204 4 248 184 294 260 4 228 207 253 251 14 400 109 500 375 14 1 107 183 375 14 34 59 215 227 4 46 1 61 32 4 32 1 47 32 15 301 133 376 204 +12956 /data/VOCdevkit/VOC2012/JPEGImages/2010_001787.jpg 396 500 7 16 6 250 493 15 218 176 396 479 +12957 /data/VOCdevkit/VOC2012/JPEGImages/2010_001788.jpg 500 375 18 207 96 401 265 +12958 /data/VOCdevkit/VOC2012/JPEGImages/2010_001794.jpg 500 393 7 1 1 448 393 +12959 /data/VOCdevkit/VOC2012/JPEGImages/2010_001795.jpg 375 500 11 119 274 251 435 +12960 /data/VOCdevkit/VOC2012/JPEGImages/2010_001796.jpg 500 375 16 34 9 500 375 +12961 /data/VOCdevkit/VOC2012/JPEGImages/2010_001797.jpg 500 375 12 102 164 307 318 +12962 /data/VOCdevkit/VOC2012/JPEGImages/2010_001801.jpg 500 375 18 38 120 486 293 +12963 /data/VOCdevkit/VOC2012/JPEGImages/2010_001803.jpg 500 333 9 371 200 474 276 9 305 203 398 274 9 189 202 312 276 9 258 195 369 273 9 11 214 49 244 +12964 /data/VOCdevkit/VOC2012/JPEGImages/2010_001806.jpg 500 324 2 86 90 349 273 +12965 /data/VOCdevkit/VOC2012/JPEGImages/2010_001807.jpg 375 500 3 83 18 284 453 +12966 /data/VOCdevkit/VOC2012/JPEGImages/2010_001808.jpg 500 348 5 24 68 488 283 6 1 162 40 226 +12967 /data/VOCdevkit/VOC2012/JPEGImages/2010_001810.jpg 432 288 13 61 46 378 242 14 188 48 293 228 +12968 /data/VOCdevkit/VOC2012/JPEGImages/2010_001814.jpg 500 375 14 61 157 160 375 14 153 147 245 375 14 239 156 320 375 14 320 151 413 375 +12969 /data/VOCdevkit/VOC2012/JPEGImages/2010_001817.jpg 500 375 14 223 103 278 331 14 122 94 226 333 14 123 96 186 347 14 191 128 265 344 14 271 103 347 345 14 263 130 334 352 +12970 /data/VOCdevkit/VOC2012/JPEGImages/2010_001819.jpg 500 454 4 362 79 395 248 4 278 85 317 249 4 193 67 225 247 +12971 /data/VOCdevkit/VOC2012/JPEGImages/2010_001820.jpg 500 375 2 242 151 302 261 +12972 /data/VOCdevkit/VOC2012/JPEGImages/2010_001821.jpg 500 375 6 284 275 439 363 6 439 279 483 300 +12973 /data/VOCdevkit/VOC2012/JPEGImages/2010_001823.jpg 333 500 8 127 333 235 500 8 239 366 333 500 10 179 340 333 408 4 317 328 327 356 +12974 /data/VOCdevkit/VOC2012/JPEGImages/2010_001827.jpg 500 375 7 4 3 342 366 +12975 /data/VOCdevkit/VOC2012/JPEGImages/2010_001828.jpg 500 339 6 1 46 492 281 13 25 119 500 339 14 142 28 436 339 +12976 /data/VOCdevkit/VOC2012/JPEGImages/2010_001829.jpg 500 333 12 1 46 216 332 12 183 43 458 333 +12977 /data/VOCdevkit/VOC2012/JPEGImages/2010_001830.jpg 375 500 4 1 11 143 500 +12978 /data/VOCdevkit/VOC2012/JPEGImages/2010_001836.jpg 500 326 0 257 157 348 180 +12979 /data/VOCdevkit/VOC2012/JPEGImages/2010_001837.jpg 332 500 11 135 218 247 369 14 197 2 332 377 +12980 /data/VOCdevkit/VOC2012/JPEGImages/2010_001838.jpg 500 480 11 1 10 492 444 +12981 /data/VOCdevkit/VOC2012/JPEGImages/2010_001841.jpg 333 500 11 1 92 224 364 +12982 /data/VOCdevkit/VOC2012/JPEGImages/2010_001842.jpg 500 333 7 112 77 474 333 +12983 /data/VOCdevkit/VOC2012/JPEGImages/2010_001843.jpg 500 375 15 361 236 500 375 15 182 221 396 375 15 17 209 201 355 11 200 114 326 312 11 51 147 195 288 +12984 /data/VOCdevkit/VOC2012/JPEGImages/2010_001845.jpg 500 333 11 184 52 325 229 +12985 /data/VOCdevkit/VOC2012/JPEGImages/2010_001846.jpg 500 375 8 37 156 128 295 8 393 145 474 242 10 124 192 381 243 14 36 34 500 375 +12986 /data/VOCdevkit/VOC2012/JPEGImages/2010_001849.jpg 500 375 8 323 221 459 375 8 378 7 452 135 +12987 /data/VOCdevkit/VOC2012/JPEGImages/2010_001850.jpg 500 375 11 112 172 210 282 11 67 191 150 318 14 398 10 500 375 6 3 84 367 375 6 248 133 410 250 +12988 /data/VOCdevkit/VOC2012/JPEGImages/2010_001851.jpg 500 375 10 142 216 273 350 8 37 211 131 355 8 218 199 309 337 15 244 60 282 154 15 230 148 291 220 15 391 109 471 177 +12989 /data/VOCdevkit/VOC2012/JPEGImages/2010_001852.jpg 500 334 12 297 26 500 323 12 1 1 215 259 +12990 /data/VOCdevkit/VOC2012/JPEGImages/2010_001853.jpg 500 375 8 271 154 336 298 8 159 154 220 195 8 1 166 95 322 8 110 186 219 360 8 291 186 398 358 8 400 168 500 320 10 44 193 456 322 +12991 /data/VOCdevkit/VOC2012/JPEGImages/2010_001856.jpg 500 375 12 1 80 165 341 14 201 78 355 365 14 386 43 494 206 14 349 103 415 218 +12992 /data/VOCdevkit/VOC2012/JPEGImages/2010_001857.jpg 375 500 8 57 210 258 414 14 63 71 330 476 +12993 /data/VOCdevkit/VOC2012/JPEGImages/2010_001858.jpg 500 315 11 320 198 388 260 +12994 /data/VOCdevkit/VOC2012/JPEGImages/2010_001860.jpg 375 500 19 159 1 375 122 +12995 /data/VOCdevkit/VOC2012/JPEGImages/2010_001862.jpg 500 375 19 1 112 88 235 14 46 1 482 375 8 202 95 456 375 +12996 /data/VOCdevkit/VOC2012/JPEGImages/2010_001863.jpg 375 500 7 1 85 340 433 +12997 /data/VOCdevkit/VOC2012/JPEGImages/2010_001864.jpg 500 375 15 61 1 500 328 +12998 /data/VOCdevkit/VOC2012/JPEGImages/2010_001868.jpg 500 333 2 202 109 358 239 +12999 /data/VOCdevkit/VOC2012/JPEGImages/2010_001869.jpg 500 333 11 167 39 421 271 +13000 /data/VOCdevkit/VOC2012/JPEGImages/2010_001870.jpg 500 375 14 110 72 325 375 14 57 73 490 327 +13001 /data/VOCdevkit/VOC2012/JPEGImages/2010_001877.jpg 438 500 4 124 203 218 292 +13002 /data/VOCdevkit/VOC2012/JPEGImages/2010_001881.jpg 500 375 16 94 43 500 375 +13003 /data/VOCdevkit/VOC2012/JPEGImages/2010_001884.jpg 500 376 7 82 135 279 270 4 447 23 500 133 +13004 /data/VOCdevkit/VOC2012/JPEGImages/2010_001885.jpg 500 426 7 116 1 437 426 +13005 /data/VOCdevkit/VOC2012/JPEGImages/2010_001891.jpg 375 500 11 142 139 286 371 14 106 1 295 360 +13006 /data/VOCdevkit/VOC2012/JPEGImages/2010_001892.jpg 500 333 5 1 1 408 249 14 225 129 286 259 +13007 /data/VOCdevkit/VOC2012/JPEGImages/2010_001893.jpg 500 335 6 96 119 410 241 +13008 /data/VOCdevkit/VOC2012/JPEGImages/2010_001896.jpg 500 375 11 1 1 500 263 +13009 /data/VOCdevkit/VOC2012/JPEGImages/2010_001899.jpg 500 375 3 1 17 274 375 3 87 27 500 375 +13010 /data/VOCdevkit/VOC2012/JPEGImages/2010_001904.jpg 500 375 11 150 90 316 317 +13011 /data/VOCdevkit/VOC2012/JPEGImages/2010_001907.jpg 500 331 10 322 149 500 331 14 1 1 497 331 +13012 /data/VOCdevkit/VOC2012/JPEGImages/2010_001908.jpg 500 375 11 233 69 459 357 14 21 58 43 114 +13013 /data/VOCdevkit/VOC2012/JPEGImages/2010_001911.jpg 480 360 11 153 72 306 298 8 198 1 368 133 +13014 /data/VOCdevkit/VOC2012/JPEGImages/2010_001913.jpg 500 332 7 306 74 500 224 7 13 187 61 259 +13015 /data/VOCdevkit/VOC2012/JPEGImages/2010_001916.jpg 500 283 3 160 102 242 172 +13016 /data/VOCdevkit/VOC2012/JPEGImages/2010_001918.jpg 500 333 19 45 46 244 235 +13017 /data/VOCdevkit/VOC2012/JPEGImages/2010_001919.jpg 500 333 2 204 30 350 192 +13018 /data/VOCdevkit/VOC2012/JPEGImages/2010_001921.jpg 500 333 1 293 152 401 260 1 1 150 55 231 14 306 112 384 236 14 1 91 40 215 +13019 /data/VOCdevkit/VOC2012/JPEGImages/2010_001922.jpg 500 375 1 114 48 412 289 1 180 62 418 289 +13020 /data/VOCdevkit/VOC2012/JPEGImages/2010_001923.jpg 500 331 13 28 44 467 288 14 137 1 201 125 +13021 /data/VOCdevkit/VOC2012/JPEGImages/2010_001924.jpg 500 375 11 1 33 500 375 +13022 /data/VOCdevkit/VOC2012/JPEGImages/2010_001927.jpg 500 375 2 116 26 439 208 +13023 /data/VOCdevkit/VOC2012/JPEGImages/2010_001929.jpg 500 375 11 71 35 500 375 +13024 /data/VOCdevkit/VOC2012/JPEGImages/2010_001931.jpg 500 341 0 2 59 494 265 +13025 /data/VOCdevkit/VOC2012/JPEGImages/2010_001933.jpg 500 375 11 41 19 418 312 +13026 /data/VOCdevkit/VOC2012/JPEGImages/2010_001934.jpg 500 375 7 96 78 298 178 7 124 229 233 370 7 223 280 368 375 +13027 /data/VOCdevkit/VOC2012/JPEGImages/2010_001937.jpg 500 375 9 1 68 401 374 +13028 /data/VOCdevkit/VOC2012/JPEGImages/2010_001938.jpg 448 336 7 1 1 448 336 +13029 /data/VOCdevkit/VOC2012/JPEGImages/2010_001939.jpg 500 375 7 3 140 230 257 19 345 136 438 217 10 1 209 500 375 +13030 /data/VOCdevkit/VOC2012/JPEGImages/2010_001940.jpg 500 375 14 122 106 225 375 14 211 15 499 375 15 1 46 134 207 +13031 /data/VOCdevkit/VOC2012/JPEGImages/2010_001941.jpg 375 500 14 61 145 232 477 18 182 70 375 283 +13032 /data/VOCdevkit/VOC2012/JPEGImages/2010_001944.jpg 500 375 11 155 61 399 375 +13033 /data/VOCdevkit/VOC2012/JPEGImages/2010_001948.jpg 500 369 6 44 7 495 356 +13034 /data/VOCdevkit/VOC2012/JPEGImages/2010_001950.jpg 500 306 0 58 77 446 230 +13035 /data/VOCdevkit/VOC2012/JPEGImages/2010_001951.jpg 448 336 14 403 166 433 237 18 80 111 397 258 +13036 /data/VOCdevkit/VOC2012/JPEGImages/2010_001954.jpg 500 333 6 131 41 415 234 14 1 72 19 191 14 16 77 31 186 14 24 86 48 189 14 41 84 59 188 14 55 92 74 188 14 69 80 100 188 14 97 96 111 148 14 113 100 129 187 14 119 96 139 186 14 135 101 147 163 +13037 /data/VOCdevkit/VOC2012/JPEGImages/2010_001956.jpg 359 500 11 1 37 306 435 +13038 /data/VOCdevkit/VOC2012/JPEGImages/2010_001957.jpg 500 409 7 1 31 495 379 +13039 /data/VOCdevkit/VOC2012/JPEGImages/2010_001960.jpg 500 375 14 1 59 500 375 14 249 30 473 251 +13040 /data/VOCdevkit/VOC2012/JPEGImages/2010_001962.jpg 500 334 17 17 82 500 334 +13041 /data/VOCdevkit/VOC2012/JPEGImages/2010_001966.jpg 480 360 6 58 245 96 275 14 145 239 162 273 14 165 241 179 273 14 344 258 358 283 6 83 244 102 265 +13042 /data/VOCdevkit/VOC2012/JPEGImages/2010_001967.jpg 500 333 3 248 1 456 319 3 45 274 122 312 +13043 /data/VOCdevkit/VOC2012/JPEGImages/2010_001968.jpg 500 375 7 55 54 447 285 +13044 /data/VOCdevkit/VOC2012/JPEGImages/2010_001970.jpg 375 500 1 72 323 280 488 +13045 /data/VOCdevkit/VOC2012/JPEGImages/2010_001973.jpg 333 500 8 19 32 326 491 +13046 /data/VOCdevkit/VOC2012/JPEGImages/2010_001974.jpg 500 334 2 307 158 362 214 +13047 /data/VOCdevkit/VOC2012/JPEGImages/2010_001976.jpg 500 375 11 166 95 358 314 +13048 /data/VOCdevkit/VOC2012/JPEGImages/2010_001978.jpg 500 375 14 40 1 432 375 +13049 /data/VOCdevkit/VOC2012/JPEGImages/2010_001979.jpg 500 369 0 123 88 395 265 +13050 /data/VOCdevkit/VOC2012/JPEGImages/2010_001980.jpg 375 500 4 321 404 358 500 +13051 /data/VOCdevkit/VOC2012/JPEGImages/2010_001981.jpg 500 375 6 1 24 420 366 6 1 1 193 162 +13052 /data/VOCdevkit/VOC2012/JPEGImages/2010_001982.jpg 333 500 5 35 266 333 384 +13053 /data/VOCdevkit/VOC2012/JPEGImages/2010_001986.jpg 500 333 13 237 161 280 211 14 249 159 274 195 +13054 /data/VOCdevkit/VOC2012/JPEGImages/2010_001987.jpg 500 333 16 129 202 162 227 16 229 94 271 134 16 178 112 217 154 16 222 32 253 76 16 58 105 96 144 16 164 176 240 218 16 121 256 152 278 16 24 245 52 268 +13055 /data/VOCdevkit/VOC2012/JPEGImages/2010_001988.jpg 500 272 2 67 1 340 235 +13056 /data/VOCdevkit/VOC2012/JPEGImages/2010_001992.jpg 500 375 2 205 81 364 210 2 180 184 321 282 +13057 /data/VOCdevkit/VOC2012/JPEGImages/2010_001993.jpg 500 333 6 92 106 448 233 14 304 104 354 150 +13058 /data/VOCdevkit/VOC2012/JPEGImages/2010_001994.jpg 375 500 7 81 9 277 408 +13059 /data/VOCdevkit/VOC2012/JPEGImages/2010_001995.jpg 375 500 2 1 170 375 498 +13060 /data/VOCdevkit/VOC2012/JPEGImages/2010_001998.jpg 500 375 6 47 117 460 280 6 396 105 439 134 6 424 100 500 165 +13061 /data/VOCdevkit/VOC2012/JPEGImages/2010_002000.jpg 500 375 7 49 128 231 236 +13062 /data/VOCdevkit/VOC2012/JPEGImages/2010_002002.jpg 500 344 14 21 110 212 331 19 280 76 363 152 14 357 106 500 328 +13063 /data/VOCdevkit/VOC2012/JPEGImages/2010_002005.jpg 372 500 11 1 20 349 393 +13064 /data/VOCdevkit/VOC2012/JPEGImages/2010_002006.jpg 324 432 14 179 54 257 167 14 1 11 175 284 14 179 29 324 266 10 1 257 324 432 +13065 /data/VOCdevkit/VOC2012/JPEGImages/2010_002015.jpg 500 375 19 240 127 319 198 17 1 202 267 375 +13066 /data/VOCdevkit/VOC2012/JPEGImages/2010_002017.jpg 500 375 6 295 59 500 247 4 287 103 348 264 14 185 54 348 367 8 309 52 500 375 +13067 /data/VOCdevkit/VOC2012/JPEGImages/2010_002018.jpg 500 375 9 264 103 412 174 9 362 119 473 171 9 234 112 291 185 14 69 31 163 169 14 121 55 246 170 14 120 43 178 169 14 350 86 369 111 14 370 86 407 127 +13068 /data/VOCdevkit/VOC2012/JPEGImages/2010_002019.jpg 500 333 0 56 106 433 227 +13069 /data/VOCdevkit/VOC2012/JPEGImages/2010_002020.jpg 375 500 11 1 26 346 500 +13070 /data/VOCdevkit/VOC2012/JPEGImages/2010_002022.jpg 500 332 11 113 42 326 316 14 238 51 500 332 +13071 /data/VOCdevkit/VOC2012/JPEGImages/2010_002023.jpg 500 351 2 145 27 448 257 +13072 /data/VOCdevkit/VOC2012/JPEGImages/2010_002025.jpg 500 375 7 1 86 260 256 7 1 148 402 375 +13073 /data/VOCdevkit/VOC2012/JPEGImages/2010_002026.jpg 500 500 7 31 166 275 415 +13074 /data/VOCdevkit/VOC2012/JPEGImages/2010_002029.jpg 500 397 11 109 29 428 394 +13075 /data/VOCdevkit/VOC2012/JPEGImages/2010_002030.jpg 500 331 1 56 5 484 322 +13076 /data/VOCdevkit/VOC2012/JPEGImages/2010_002032.jpg 500 375 8 278 203 356 325 8 209 222 280 342 8 63 205 153 326 8 148 197 206 312 8 218 194 271 315 10 86 202 316 337 +13077 /data/VOCdevkit/VOC2012/JPEGImages/2010_002037.jpg 500 333 11 191 134 477 333 11 2 85 177 253 +13078 /data/VOCdevkit/VOC2012/JPEGImages/2010_002039.jpg 500 375 16 128 141 234 301 16 235 170 317 288 16 383 191 440 277 6 373 25 452 58 14 236 90 271 184 14 273 118 307 182 14 302 111 339 238 14 330 103 366 216 14 359 93 436 198 14 450 124 500 265 +13079 /data/VOCdevkit/VOC2012/JPEGImages/2010_002040.jpg 333 500 7 18 16 333 487 +13080 /data/VOCdevkit/VOC2012/JPEGImages/2010_002041.jpg 500 281 16 447 148 500 189 16 308 123 414 198 16 178 139 294 215 16 1 147 129 232 16 22 145 140 220 +13081 /data/VOCdevkit/VOC2012/JPEGImages/2010_002042.jpg 500 375 11 128 79 377 290 +13082 /data/VOCdevkit/VOC2012/JPEGImages/2010_002044.jpg 500 375 6 38 30 472 328 6 399 78 500 243 14 63 10 93 121 14 192 95 215 179 14 221 80 291 164 14 351 69 439 133 14 363 34 405 87 14 483 56 497 100 +13083 /data/VOCdevkit/VOC2012/JPEGImages/2010_002045.jpg 500 375 17 5 83 433 353 +13084 /data/VOCdevkit/VOC2012/JPEGImages/2010_002046.jpg 500 228 6 293 115 433 165 6 87 119 200 164 +13085 /data/VOCdevkit/VOC2012/JPEGImages/2010_002047.jpg 375 500 9 45 87 276 236 +13086 /data/VOCdevkit/VOC2012/JPEGImages/2010_002048.jpg 500 333 6 104 108 460 263 +13087 /data/VOCdevkit/VOC2012/JPEGImages/2010_002050.jpg 500 375 8 1 1 135 223 +13088 /data/VOCdevkit/VOC2012/JPEGImages/2010_002054.jpg 500 375 16 391 224 448 275 16 340 232 397 272 16 322 248 356 295 +13089 /data/VOCdevkit/VOC2012/JPEGImages/2010_002055.jpg 375 500 1 37 120 375 500 14 248 262 276 306 4 229 265 286 337 15 13 241 51 312 +13090 /data/VOCdevkit/VOC2012/JPEGImages/2010_002057.jpg 500 375 7 5 22 486 367 +13091 /data/VOCdevkit/VOC2012/JPEGImages/2010_002058.jpg 318 500 16 64 30 192 241 14 35 221 168 500 +13092 /data/VOCdevkit/VOC2012/JPEGImages/2010_002060.jpg 500 375 11 85 46 328 282 +13093 /data/VOCdevkit/VOC2012/JPEGImages/2010_002065.jpg 500 333 0 6 61 495 239 +13094 /data/VOCdevkit/VOC2012/JPEGImages/2010_002067.jpg 500 377 11 154 154 253 250 11 166 194 384 289 11 46 110 117 177 11 330 182 388 213 14 337 113 399 200 +13095 /data/VOCdevkit/VOC2012/JPEGImages/2010_002068.jpg 500 242 7 162 29 457 242 7 37 51 201 200 +13096 /data/VOCdevkit/VOC2012/JPEGImages/2010_002070.jpg 500 333 8 392 208 444 333 14 26 97 204 333 14 260 92 405 333 10 140 223 344 333 +13097 /data/VOCdevkit/VOC2012/JPEGImages/2010_002073.jpg 500 375 18 3 1 500 375 +13098 /data/VOCdevkit/VOC2012/JPEGImages/2010_002080.jpg 500 374 18 1 135 359 347 +13099 /data/VOCdevkit/VOC2012/JPEGImages/2010_002085.jpg 500 375 0 1 107 500 374 +13100 /data/VOCdevkit/VOC2012/JPEGImages/2010_002086.jpg 500 333 7 112 3 403 332 8 3 1 500 333 +13101 /data/VOCdevkit/VOC2012/JPEGImages/2010_002089.jpg 343 500 11 157 68 320 211 11 141 347 229 472 +13102 /data/VOCdevkit/VOC2012/JPEGImages/2010_002094.jpg 500 333 19 9 8 499 316 14 157 41 319 287 +13103 /data/VOCdevkit/VOC2012/JPEGImages/2010_002095.jpg 500 370 11 49 1 500 313 +13104 /data/VOCdevkit/VOC2012/JPEGImages/2010_002096.jpg 500 375 14 14 105 205 375 14 106 118 242 375 14 235 132 358 375 14 387 135 488 375 14 463 84 500 375 +13105 /data/VOCdevkit/VOC2012/JPEGImages/2010_002097.jpg 500 375 19 281 132 430 275 19 48 120 226 294 +13106 /data/VOCdevkit/VOC2012/JPEGImages/2010_002098.jpg 288 208 7 65 41 177 180 +13107 /data/VOCdevkit/VOC2012/JPEGImages/2010_002100.jpg 451 500 14 14 9 435 500 +13108 /data/VOCdevkit/VOC2012/JPEGImages/2010_002102.jpg 500 333 5 105 45 391 276 +13109 /data/VOCdevkit/VOC2012/JPEGImages/2010_002104.jpg 500 333 3 243 118 319 148 +13110 /data/VOCdevkit/VOC2012/JPEGImages/2010_002105.jpg 500 375 11 35 61 302 214 +13111 /data/VOCdevkit/VOC2012/JPEGImages/2010_002106.jpg 500 333 16 182 1 500 331 16 86 1 438 235 +13112 /data/VOCdevkit/VOC2012/JPEGImages/2010_002107.jpg 500 333 6 106 49 293 190 6 185 120 464 318 14 450 92 500 310 +13113 /data/VOCdevkit/VOC2012/JPEGImages/2010_002113.jpg 500 333 16 1 38 461 333 +13114 /data/VOCdevkit/VOC2012/JPEGImages/2010_002117.jpg 368 500 3 27 22 337 429 +13115 /data/VOCdevkit/VOC2012/JPEGImages/2010_002118.jpg 500 375 7 1 1 500 330 +13116 /data/VOCdevkit/VOC2012/JPEGImages/2010_002121.jpg 500 375 8 1 191 375 375 14 13 106 459 375 +13117 /data/VOCdevkit/VOC2012/JPEGImages/2010_002124.jpg 500 333 16 2 36 438 333 16 270 155 427 333 +13118 /data/VOCdevkit/VOC2012/JPEGImages/2010_002127.jpg 500 333 4 335 267 352 298 14 361 38 459 319 14 65 46 170 304 6 437 170 500 217 +13119 /data/VOCdevkit/VOC2012/JPEGImages/2010_002128.jpg 500 375 13 108 173 397 361 14 160 79 239 367 14 104 54 225 264 +13120 /data/VOCdevkit/VOC2012/JPEGImages/2010_002129.jpg 500 375 11 264 165 300 183 +13121 /data/VOCdevkit/VOC2012/JPEGImages/2010_002130.jpg 500 375 16 393 190 451 217 16 311 197 387 239 16 347 191 396 215 16 157 216 253 259 16 211 179 274 236 16 280 176 320 194 16 121 157 156 193 +13122 /data/VOCdevkit/VOC2012/JPEGImages/2010_002132.jpg 500 328 6 36 76 487 285 +13123 /data/VOCdevkit/VOC2012/JPEGImages/2010_002133.jpg 500 375 9 1 1 483 375 +13124 /data/VOCdevkit/VOC2012/JPEGImages/2010_002136.jpg 500 375 7 229 15 421 220 7 70 206 500 375 +13125 /data/VOCdevkit/VOC2012/JPEGImages/2010_002137.jpg 375 500 7 160 189 282 312 15 52 1 371 320 +13126 /data/VOCdevkit/VOC2012/JPEGImages/2010_002138.jpg 500 375 7 1 1 465 375 +13127 /data/VOCdevkit/VOC2012/JPEGImages/2010_002139.jpg 333 500 9 30 157 333 360 14 150 49 196 190 14 186 51 238 189 +13128 /data/VOCdevkit/VOC2012/JPEGImages/2010_002141.jpg 500 333 0 175 43 416 132 0 236 58 322 89 +13129 /data/VOCdevkit/VOC2012/JPEGImages/2010_002142.jpg 375 500 2 183 80 374 274 +13130 /data/VOCdevkit/VOC2012/JPEGImages/2010_002143.jpg 500 375 7 136 23 284 316 +13131 /data/VOCdevkit/VOC2012/JPEGImages/2010_002146.jpg 375 500 7 21 185 246 428 +13132 /data/VOCdevkit/VOC2012/JPEGImages/2010_002147.jpg 500 333 0 22 17 490 289 +13133 /data/VOCdevkit/VOC2012/JPEGImages/2010_002149.jpg 500 375 13 143 88 371 252 +13134 /data/VOCdevkit/VOC2012/JPEGImages/2010_002150.jpg 500 336 3 231 192 446 261 +13135 /data/VOCdevkit/VOC2012/JPEGImages/2010_002152.jpg 500 375 19 1 1 500 198 +13136 /data/VOCdevkit/VOC2012/JPEGImages/2010_002154.jpg 500 375 14 267 91 461 375 +13137 /data/VOCdevkit/VOC2012/JPEGImages/2010_002161.jpg 500 375 12 1 23 377 158 12 1 93 252 375 14 149 127 454 375 +13138 /data/VOCdevkit/VOC2012/JPEGImages/2010_002166.jpg 500 375 14 69 136 222 374 14 207 78 325 239 8 137 35 244 256 8 1 71 97 375 +13139 /data/VOCdevkit/VOC2012/JPEGImages/2010_002167.jpg 375 500 7 89 232 375 500 19 57 96 363 424 +13140 /data/VOCdevkit/VOC2012/JPEGImages/2010_002168.jpg 500 375 12 214 24 494 375 2 158 304 186 348 12 4 66 54 192 +13141 /data/VOCdevkit/VOC2012/JPEGImages/2010_002172.jpg 500 334 13 2 9 500 322 +13142 /data/VOCdevkit/VOC2012/JPEGImages/2010_002175.jpg 332 500 6 84 299 331 466 +13143 /data/VOCdevkit/VOC2012/JPEGImages/2010_002176.jpg 500 332 16 101 149 178 219 +13144 /data/VOCdevkit/VOC2012/JPEGImages/2010_002177.jpg 437 500 7 1 1 342 393 +13145 /data/VOCdevkit/VOC2012/JPEGImages/2010_002179.jpg 500 375 14 129 107 272 375 18 1 64 500 375 +13146 /data/VOCdevkit/VOC2012/JPEGImages/2010_002180.jpg 500 375 1 57 198 393 375 +13147 /data/VOCdevkit/VOC2012/JPEGImages/2010_002181.jpg 500 343 2 130 77 474 232 +13148 /data/VOCdevkit/VOC2012/JPEGImages/2010_002182.jpg 500 375 18 1 1 355 375 +13149 /data/VOCdevkit/VOC2012/JPEGImages/2010_002183.jpg 500 355 12 140 168 365 338 14 8 136 97 253 14 450 207 473 261 14 478 204 500 264 +13150 /data/VOCdevkit/VOC2012/JPEGImages/2010_002185.jpg 500 375 6 81 113 404 273 14 278 121 352 273 +13151 /data/VOCdevkit/VOC2012/JPEGImages/2010_002187.jpg 320 240 11 80 37 320 240 +13152 /data/VOCdevkit/VOC2012/JPEGImages/2010_002191.jpg 500 375 17 127 203 400 337 8 393 178 477 275 8 1 182 80 276 14 179 128 198 174 +13153 /data/VOCdevkit/VOC2012/JPEGImages/2010_002192.jpg 500 359 7 1 74 400 359 +13154 /data/VOCdevkit/VOC2012/JPEGImages/2010_002193.jpg 500 375 19 318 100 429 203 15 1 1 197 129 17 1 129 198 313 +13155 /data/VOCdevkit/VOC2012/JPEGImages/2010_002194.jpg 500 375 6 186 153 290 193 6 46 165 283 259 +13156 /data/VOCdevkit/VOC2012/JPEGImages/2010_002195.jpg 375 500 15 110 275 227 444 +13157 /data/VOCdevkit/VOC2012/JPEGImages/2010_002199.jpg 500 375 10 116 265 230 359 8 219 254 306 350 +13158 /data/VOCdevkit/VOC2012/JPEGImages/2010_002200.jpg 500 375 0 81 100 414 212 +13159 /data/VOCdevkit/VOC2012/JPEGImages/2010_002203.jpg 375 500 5 53 118 375 363 +13160 /data/VOCdevkit/VOC2012/JPEGImages/2010_002204.jpg 500 375 7 39 25 432 375 +13161 /data/VOCdevkit/VOC2012/JPEGImages/2010_002207.jpg 500 253 0 1 33 491 226 +13162 /data/VOCdevkit/VOC2012/JPEGImages/2010_002208.jpg 500 375 18 111 129 500 375 +13163 /data/VOCdevkit/VOC2012/JPEGImages/2010_002211.jpg 375 500 1 1 180 351 500 14 172 144 358 500 15 350 351 375 460 8 121 407 212 470 +13164 /data/VOCdevkit/VOC2012/JPEGImages/2010_002213.jpg 375 500 18 162 170 198 216 +13165 /data/VOCdevkit/VOC2012/JPEGImages/2010_002215.jpg 500 375 16 16 68 157 219 16 174 88 326 294 +13166 /data/VOCdevkit/VOC2012/JPEGImages/2010_002216.jpg 500 375 3 2 77 500 246 +13167 /data/VOCdevkit/VOC2012/JPEGImages/2010_002218.jpg 375 500 5 1 82 357 500 +13168 /data/VOCdevkit/VOC2012/JPEGImages/2010_002219.jpg 500 375 14 371 175 462 307 +13169 /data/VOCdevkit/VOC2012/JPEGImages/2010_002220.jpg 375 500 11 64 2 361 500 +13170 /data/VOCdevkit/VOC2012/JPEGImages/2010_002221.jpg 500 398 12 1 68 499 397 14 75 73 230 398 14 384 224 446 398 14 443 283 500 398 14 216 187 269 252 +13171 /data/VOCdevkit/VOC2012/JPEGImages/2010_002223.jpg 310 500 18 29 87 273 402 14 286 207 310 295 +13172 /data/VOCdevkit/VOC2012/JPEGImages/2010_002224.jpg 500 375 7 143 66 500 370 +13173 /data/VOCdevkit/VOC2012/JPEGImages/2010_002226.jpg 500 375 14 177 134 313 355 14 241 151 363 351 +13174 /data/VOCdevkit/VOC2012/JPEGImages/2010_002227.jpg 500 375 8 59 9 414 373 +13175 /data/VOCdevkit/VOC2012/JPEGImages/2010_002228.jpg 375 500 11 2 96 302 498 +13176 /data/VOCdevkit/VOC2012/JPEGImages/2010_002229.jpg 500 333 0 166 30 202 60 0 205 59 229 90 +13177 /data/VOCdevkit/VOC2012/JPEGImages/2010_002232.jpg 500 375 16 233 58 393 293 16 172 151 234 303 16 66 151 137 289 +13178 /data/VOCdevkit/VOC2012/JPEGImages/2010_002236.jpg 500 300 6 100 168 445 282 +13179 /data/VOCdevkit/VOC2012/JPEGImages/2010_002242.jpg 500 277 2 156 75 384 196 2 190 111 418 239 4 179 37 243 88 +13180 /data/VOCdevkit/VOC2012/JPEGImages/2010_002243.jpg 375 500 7 15 78 324 411 +13181 /data/VOCdevkit/VOC2012/JPEGImages/2010_002244.jpg 500 379 4 82 1 384 379 4 238 1 500 378 +13182 /data/VOCdevkit/VOC2012/JPEGImages/2010_002245.jpg 500 375 19 178 117 331 249 14 51 203 244 375 +13183 /data/VOCdevkit/VOC2012/JPEGImages/2010_002247.jpg 500 375 19 106 31 286 221 19 401 31 500 145 14 180 88 500 375 +13184 /data/VOCdevkit/VOC2012/JPEGImages/2010_002248.jpg 500 375 11 1 1 500 375 +13185 /data/VOCdevkit/VOC2012/JPEGImages/2010_002251.jpg 500 375 13 1 166 359 374 14 97 91 244 352 +13186 /data/VOCdevkit/VOC2012/JPEGImages/2010_002254.jpg 375 500 9 1 13 312 336 9 321 89 363 121 +13187 /data/VOCdevkit/VOC2012/JPEGImages/2010_002255.jpg 375 500 7 10 75 305 500 +13188 /data/VOCdevkit/VOC2012/JPEGImages/2010_002261.jpg 500 333 18 65 254 241 333 18 1 259 206 332 +13189 /data/VOCdevkit/VOC2012/JPEGImages/2010_002263.jpg 500 375 5 78 127 500 339 14 1 213 82 375 +13190 /data/VOCdevkit/VOC2012/JPEGImages/2010_002267.jpg 375 500 2 140 46 264 464 +13191 /data/VOCdevkit/VOC2012/JPEGImages/2010_002269.jpg 500 375 14 1 134 117 375 4 16 246 92 375 4 168 273 214 375 4 417 242 439 322 14 122 113 203 224 14 259 143 407 309 14 102 142 278 365 10 1 287 500 375 +13192 /data/VOCdevkit/VOC2012/JPEGImages/2010_002271.jpg 500 375 13 34 10 439 368 +13193 /data/VOCdevkit/VOC2012/JPEGImages/2010_002274.jpg 333 500 14 15 33 230 309 10 7 276 333 500 +13194 /data/VOCdevkit/VOC2012/JPEGImages/2010_002276.jpg 500 375 11 217 178 317 231 14 128 126 415 218 +13195 /data/VOCdevkit/VOC2012/JPEGImages/2010_002278.jpg 500 334 7 78 85 363 334 14 1 10 73 234 14 49 1 391 334 +13196 /data/VOCdevkit/VOC2012/JPEGImages/2010_002279.jpg 500 375 6 1 1 446 240 +13197 /data/VOCdevkit/VOC2012/JPEGImages/2010_002283.jpg 500 451 12 10 15 471 430 +13198 /data/VOCdevkit/VOC2012/JPEGImages/2010_002286.jpg 500 375 7 2 2 490 375 +13199 /data/VOCdevkit/VOC2012/JPEGImages/2010_002287.jpg 500 375 11 207 83 500 322 +13200 /data/VOCdevkit/VOC2012/JPEGImages/2010_002289.jpg 500 375 0 19 126 296 220 +13201 /data/VOCdevkit/VOC2012/JPEGImages/2010_002294.jpg 500 375 16 1 1 317 265 +13202 /data/VOCdevkit/VOC2012/JPEGImages/2010_002295.jpg 500 333 0 80 89 500 296 +13203 /data/VOCdevkit/VOC2012/JPEGImages/2010_002299.jpg 500 375 11 1 36 439 375 +13204 /data/VOCdevkit/VOC2012/JPEGImages/2010_002301.jpg 500 375 14 191 156 363 375 +13205 /data/VOCdevkit/VOC2012/JPEGImages/2010_002303.jpg 342 500 7 44 1 252 500 14 55 66 342 500 +13206 /data/VOCdevkit/VOC2012/JPEGImages/2010_002305.jpg 500 375 7 1 167 429 319 +13207 /data/VOCdevkit/VOC2012/JPEGImages/2010_002307.jpg 500 449 7 1 1 341 449 +13208 /data/VOCdevkit/VOC2012/JPEGImages/2010_002309.jpg 500 375 11 239 128 361 282 11 132 92 180 157 +13209 /data/VOCdevkit/VOC2012/JPEGImages/2010_002310.jpg 500 375 0 62 139 445 268 +13210 /data/VOCdevkit/VOC2012/JPEGImages/2010_002312.jpg 500 335 17 1 59 500 332 14 1 102 359 335 +13211 /data/VOCdevkit/VOC2012/JPEGImages/2010_002313.jpg 333 500 11 76 1 333 324 +13212 /data/VOCdevkit/VOC2012/JPEGImages/2010_002315.jpg 500 375 3 34 1 441 318 +13213 /data/VOCdevkit/VOC2012/JPEGImages/2010_002316.jpg 500 400 15 382 186 500 400 15 1 1 211 400 7 193 91 330 284 +13214 /data/VOCdevkit/VOC2012/JPEGImages/2010_002318.jpg 288 352 11 97 37 249 272 +13215 /data/VOCdevkit/VOC2012/JPEGImages/2010_002319.jpg 358 500 11 153 157 201 257 8 26 150 239 385 +13216 /data/VOCdevkit/VOC2012/JPEGImages/2010_002320.jpg 500 418 9 151 71 318 296 +13217 /data/VOCdevkit/VOC2012/JPEGImages/2010_002321.jpg 500 339 3 86 163 258 256 3 136 115 295 210 3 295 150 449 243 +13218 /data/VOCdevkit/VOC2012/JPEGImages/2010_002326.jpg 500 375 1 105 16 420 375 +13219 /data/VOCdevkit/VOC2012/JPEGImages/2010_002327.jpg 500 375 19 278 93 473 284 19 11 101 238 312 +13220 /data/VOCdevkit/VOC2012/JPEGImages/2010_002332.jpg 333 500 11 1 1 333 332 +13221 /data/VOCdevkit/VOC2012/JPEGImages/2010_002333.jpg 500 375 7 1 1 500 375 +13222 /data/VOCdevkit/VOC2012/JPEGImages/2010_002336.jpg 375 500 10 44 149 332 409 8 172 144 375 496 8 1 156 157 412 8 195 103 323 357 8 24 138 195 340 15 190 80 252 157 +13223 /data/VOCdevkit/VOC2012/JPEGImages/2010_002337.jpg 500 333 17 177 65 393 225 8 1 101 223 321 +13224 /data/VOCdevkit/VOC2012/JPEGImages/2010_002338.jpg 500 375 11 1 126 407 315 +13225 /data/VOCdevkit/VOC2012/JPEGImages/2010_002340.jpg 375 500 12 15 261 204 500 12 24 104 331 500 14 226 63 375 500 +13226 /data/VOCdevkit/VOC2012/JPEGImages/2010_002346.jpg 500 375 16 1 194 166 328 16 1 164 73 201 14 268 107 395 275 14 318 118 384 306 +13227 /data/VOCdevkit/VOC2012/JPEGImages/2010_002348.jpg 500 375 7 66 2 500 375 +13228 /data/VOCdevkit/VOC2012/JPEGImages/2010_002349.jpg 500 333 11 1 3 416 332 +13229 /data/VOCdevkit/VOC2012/JPEGImages/2010_002353.jpg 500 375 14 144 170 228 334 16 255 194 358 319 16 358 233 447 335 +13230 /data/VOCdevkit/VOC2012/JPEGImages/2010_002354.jpg 333 500 7 90 59 333 499 +13231 /data/VOCdevkit/VOC2012/JPEGImages/2010_002356.jpg 500 326 5 147 18 454 266 5 43 68 198 244 14 294 177 340 277 +13232 /data/VOCdevkit/VOC2012/JPEGImages/2010_002357.jpg 500 333 0 82 85 455 215 +13233 /data/VOCdevkit/VOC2012/JPEGImages/2010_002361.jpg 500 363 6 317 55 500 242 6 12 50 488 342 +13234 /data/VOCdevkit/VOC2012/JPEGImages/2010_002363.jpg 500 375 6 65 74 405 358 14 353 26 437 206 +13235 /data/VOCdevkit/VOC2012/JPEGImages/2010_002364.jpg 500 332 3 68 151 463 280 +13236 /data/VOCdevkit/VOC2012/JPEGImages/2010_002365.jpg 500 375 11 281 204 416 329 +13237 /data/VOCdevkit/VOC2012/JPEGImages/2010_002366.jpg 375 500 10 1 330 273 500 8 183 331 309 453 8 89 308 149 349 8 1 326 123 500 8 143 354 303 500 15 323 226 375 378 +13238 /data/VOCdevkit/VOC2012/JPEGImages/2010_002368.jpg 500 333 6 48 67 370 307 +13239 /data/VOCdevkit/VOC2012/JPEGImages/2010_002369.jpg 500 333 18 42 13 417 317 +13240 /data/VOCdevkit/VOC2012/JPEGImages/2010_002370.jpg 500 375 8 170 224 325 375 8 184 191 293 320 8 201 172 282 249 8 122 163 188 238 8 8 162 75 236 +13241 /data/VOCdevkit/VOC2012/JPEGImages/2010_002371.jpg 500 357 7 188 45 500 357 7 26 18 490 357 +13242 /data/VOCdevkit/VOC2012/JPEGImages/2010_002372.jpg 500 334 9 216 126 272 152 9 255 124 308 148 +13243 /data/VOCdevkit/VOC2012/JPEGImages/2010_002373.jpg 375 500 10 1 261 260 500 4 9 304 69 408 4 85 276 129 370 14 227 103 375 500 14 128 96 278 365 +13244 /data/VOCdevkit/VOC2012/JPEGImages/2010_002374.jpg 500 333 2 405 75 440 111 2 252 118 377 231 +13245 /data/VOCdevkit/VOC2012/JPEGImages/2010_002378.jpg 375 500 16 99 156 333 430 +13246 /data/VOCdevkit/VOC2012/JPEGImages/2010_002379.jpg 500 375 15 1 1 500 375 +13247 /data/VOCdevkit/VOC2012/JPEGImages/2010_002382.jpg 500 375 11 245 63 500 324 11 13 11 244 305 +13248 /data/VOCdevkit/VOC2012/JPEGImages/2010_002383.jpg 500 381 8 139 142 271 317 +13249 /data/VOCdevkit/VOC2012/JPEGImages/2010_002387.jpg 500 375 6 212 210 434 315 6 461 234 500 260 +13250 /data/VOCdevkit/VOC2012/JPEGImages/2010_002388.jpg 333 500 4 132 203 231 500 +13251 /data/VOCdevkit/VOC2012/JPEGImages/2010_002390.jpg 500 375 9 213 47 500 374 9 135 180 437 375 +13252 /data/VOCdevkit/VOC2012/JPEGImages/2010_002391.jpg 500 333 11 1 1 401 289 +13253 /data/VOCdevkit/VOC2012/JPEGImages/2010_002392.jpg 500 483 7 2 18 500 483 +13254 /data/VOCdevkit/VOC2012/JPEGImages/2010_002393.jpg 500 387 3 117 109 251 310 3 342 150 445 313 +13255 /data/VOCdevkit/VOC2012/JPEGImages/2010_002396.jpg 500 332 14 112 33 353 332 13 129 115 319 332 +13256 /data/VOCdevkit/VOC2012/JPEGImages/2010_002398.jpg 500 310 11 137 42 323 310 +13257 /data/VOCdevkit/VOC2012/JPEGImages/2010_002399.jpg 500 382 11 49 32 462 323 11 331 193 423 305 11 279 184 351 312 +13258 /data/VOCdevkit/VOC2012/JPEGImages/2010_002400.jpg 500 375 10 1 286 499 375 8 341 156 423 288 8 447 146 500 248 8 417 145 448 213 8 315 148 369 203 8 139 153 191 193 8 112 158 183 221 14 155 67 389 296 +13259 /data/VOCdevkit/VOC2012/JPEGImages/2010_002402.jpg 500 400 11 116 259 204 308 19 343 161 409 223 +13260 /data/VOCdevkit/VOC2012/JPEGImages/2010_002405.jpg 500 374 14 1 1 500 374 +13261 /data/VOCdevkit/VOC2012/JPEGImages/2010_002406.jpg 500 375 7 70 28 435 258 +13262 /data/VOCdevkit/VOC2012/JPEGImages/2010_002408.jpg 375 500 13 44 98 295 436 14 1 1 72 271 14 173 1 278 256 14 150 1 181 60 14 267 1 357 228 14 294 1 375 277 +13263 /data/VOCdevkit/VOC2012/JPEGImages/2010_002409.jpg 480 360 6 270 72 480 259 6 1 65 156 216 6 88 94 405 311 +13264 /data/VOCdevkit/VOC2012/JPEGImages/2010_002410.jpg 500 375 11 157 114 440 303 +13265 /data/VOCdevkit/VOC2012/JPEGImages/2010_002413.jpg 500 357 5 380 127 500 224 5 106 96 320 250 5 4 118 39 174 5 60 140 107 167 5 49 132 107 163 +13266 /data/VOCdevkit/VOC2012/JPEGImages/2010_002418.jpg 375 500 10 6 294 290 479 8 41 302 152 495 8 183 312 281 500 8 180 285 237 325 8 30 274 90 317 +13267 /data/VOCdevkit/VOC2012/JPEGImages/2010_002420.jpg 500 335 18 76 15 482 335 +13268 /data/VOCdevkit/VOC2012/JPEGImages/2010_002422.jpg 500 400 7 28 15 452 390 +13269 /data/VOCdevkit/VOC2012/JPEGImages/2010_002424.jpg 500 375 6 407 14 500 66 6 255 32 500 126 6 10 43 474 266 14 378 1 412 54 +13270 /data/VOCdevkit/VOC2012/JPEGImages/2010_002425.jpg 340 500 7 1 71 294 468 +13271 /data/VOCdevkit/VOC2012/JPEGImages/2010_002427.jpg 500 333 19 70 1 500 332 +13272 /data/VOCdevkit/VOC2012/JPEGImages/2010_002429.jpg 500 313 0 63 60 355 168 +13273 /data/VOCdevkit/VOC2012/JPEGImages/2010_002431.jpg 375 500 14 32 124 212 466 14 198 134 298 434 9 216 164 255 190 +13274 /data/VOCdevkit/VOC2012/JPEGImages/2010_002435.jpg 375 500 14 255 1 299 64 14 113 1 243 323 13 206 129 362 446 1 237 26 317 71 13 96 60 261 156 1 211 39 246 77 +13275 /data/VOCdevkit/VOC2012/JPEGImages/2010_002436.jpg 500 500 2 112 109 318 433 +13276 /data/VOCdevkit/VOC2012/JPEGImages/2010_002438.jpg 500 357 5 61 70 357 266 +13277 /data/VOCdevkit/VOC2012/JPEGImages/2010_002439.jpg 500 326 2 204 16 417 252 +13278 /data/VOCdevkit/VOC2012/JPEGImages/2010_002440.jpg 500 375 14 3 41 169 375 14 137 29 275 316 14 190 23 493 372 4 216 102 290 177 +13279 /data/VOCdevkit/VOC2012/JPEGImages/2010_002445.jpg 500 375 14 5 234 97 375 +13280 /data/VOCdevkit/VOC2012/JPEGImages/2010_002446.jpg 500 375 14 1 81 250 375 14 215 62 500 375 +13281 /data/VOCdevkit/VOC2012/JPEGImages/2010_002448.jpg 500 375 7 1 13 438 375 +13282 /data/VOCdevkit/VOC2012/JPEGImages/2010_002449.jpg 375 500 11 1 1 208 330 +13283 /data/VOCdevkit/VOC2012/JPEGImages/2010_002450.jpg 500 375 2 270 134 309 231 +13284 /data/VOCdevkit/VOC2012/JPEGImages/2010_002452.jpg 500 327 13 26 23 494 301 +13285 /data/VOCdevkit/VOC2012/JPEGImages/2010_002455.jpg 500 375 4 274 2 409 375 +13286 /data/VOCdevkit/VOC2012/JPEGImages/2010_002456.jpg 500 375 11 1 1 500 349 +13287 /data/VOCdevkit/VOC2012/JPEGImages/2010_002457.jpg 375 500 14 57 114 202 349 4 273 308 290 361 6 45 127 351 282 +13288 /data/VOCdevkit/VOC2012/JPEGImages/2010_002458.jpg 500 338 11 239 1 500 232 11 1 87 295 338 +13289 /data/VOCdevkit/VOC2012/JPEGImages/2010_002459.jpg 500 375 12 66 34 270 339 +13290 /data/VOCdevkit/VOC2012/JPEGImages/2010_002460.jpg 500 348 0 225 205 352 250 +13291 /data/VOCdevkit/VOC2012/JPEGImages/2010_002461.jpg 500 333 17 1 124 500 332 14 140 35 245 141 14 198 111 477 225 14 42 127 294 333 +13292 /data/VOCdevkit/VOC2012/JPEGImages/2010_002462.jpg 500 375 10 167 234 448 330 14 200 137 248 242 14 149 141 256 332 14 29 148 197 375 14 318 142 351 187 14 343 146 406 245 14 389 108 500 348 15 162 1 297 216 4 309 200 327 253 +13293 /data/VOCdevkit/VOC2012/JPEGImages/2010_002468.jpg 500 335 11 123 66 419 307 +13294 /data/VOCdevkit/VOC2012/JPEGImages/2010_002469.jpg 500 375 13 3 23 473 368 13 1 5 213 156 +13295 /data/VOCdevkit/VOC2012/JPEGImages/2010_002472.jpg 500 375 7 209 112 371 293 +13296 /data/VOCdevkit/VOC2012/JPEGImages/2010_002475.jpg 500 375 1 11 34 461 359 +13297 /data/VOCdevkit/VOC2012/JPEGImages/2010_002479.jpg 465 500 7 128 1 465 500 +13298 /data/VOCdevkit/VOC2012/JPEGImages/2010_002480.jpg 375 500 11 57 39 374 500 +13299 /data/VOCdevkit/VOC2012/JPEGImages/2010_002482.jpg 375 500 12 160 435 197 461 +13300 /data/VOCdevkit/VOC2012/JPEGImages/2010_002484.jpg 500 368 14 468 129 500 174 14 163 194 260 368 14 300 117 419 368 14 400 107 500 368 14 232 98 350 368 14 129 150 270 368 +13301 /data/VOCdevkit/VOC2012/JPEGImages/2010_002485.jpg 480 399 7 1 1 451 399 +13302 /data/VOCdevkit/VOC2012/JPEGImages/2010_002487.jpg 500 333 18 329 139 421 208 +13303 /data/VOCdevkit/VOC2012/JPEGImages/2010_002492.jpg 500 375 14 96 43 250 316 14 182 33 362 337 14 392 223 408 272 14 370 222 393 269 14 407 225 420 251 +13304 /data/VOCdevkit/VOC2012/JPEGImages/2010_002496.jpg 500 332 0 380 95 500 207 0 35 83 400 266 +13305 /data/VOCdevkit/VOC2012/JPEGImages/2010_002497.jpg 500 375 1 242 120 401 222 14 294 75 380 184 +13306 /data/VOCdevkit/VOC2012/JPEGImages/2010_002498.jpg 432 288 3 84 182 237 244 14 207 142 232 206 14 161 147 213 206 14 108 138 174 203 +13307 /data/VOCdevkit/VOC2012/JPEGImages/2010_002499.jpg 500 332 11 156 63 340 279 +13308 /data/VOCdevkit/VOC2012/JPEGImages/2010_002501.jpg 375 500 16 74 341 196 424 16 69 318 176 391 16 2 328 100 413 14 91 232 136 327 16 1 346 40 403 +13309 /data/VOCdevkit/VOC2012/JPEGImages/2010_002504.jpg 500 333 7 47 35 387 325 14 233 79 490 333 +13310 /data/VOCdevkit/VOC2012/JPEGImages/2010_002507.jpg 500 377 16 162 117 259 174 6 142 128 308 268 +13311 /data/VOCdevkit/VOC2012/JPEGImages/2010_002509.jpg 500 333 14 234 105 499 332 14 1 118 360 333 +13312 /data/VOCdevkit/VOC2012/JPEGImages/2010_002510.jpg 500 375 14 245 1 460 375 +13313 /data/VOCdevkit/VOC2012/JPEGImages/2010_002512.jpg 500 333 7 143 65 422 235 +13314 /data/VOCdevkit/VOC2012/JPEGImages/2010_002513.jpg 500 375 19 42 94 484 375 +13315 /data/VOCdevkit/VOC2012/JPEGImages/2010_002516.jpg 500 375 6 439 101 500 141 6 200 92 255 112 6 82 87 205 156 6 1 88 88 183 6 280 94 387 145 6 19 106 382 346 14 370 88 437 278 +13316 /data/VOCdevkit/VOC2012/JPEGImages/2010_002518.jpg 500 358 16 124 66 415 304 16 135 156 226 316 +13317 /data/VOCdevkit/VOC2012/JPEGImages/2010_002520.jpg 333 500 4 157 243 196 366 10 1 349 333 500 14 52 81 285 363 +13318 /data/VOCdevkit/VOC2012/JPEGImages/2010_002526.jpg 329 500 14 17 94 329 500 14 1 169 134 304 14 222 95 329 316 19 63 190 118 238 19 288 169 329 228 +13319 /data/VOCdevkit/VOC2012/JPEGImages/2010_002527.jpg 500 333 11 1 1 256 332 +13320 /data/VOCdevkit/VOC2012/JPEGImages/2010_002529.jpg 500 375 7 83 1 500 375 +13321 /data/VOCdevkit/VOC2012/JPEGImages/2010_002531.jpg 500 375 7 106 34 494 237 17 1 1 500 375 +13322 /data/VOCdevkit/VOC2012/JPEGImages/2010_002532.jpg 500 268 0 36 109 389 210 +13323 /data/VOCdevkit/VOC2012/JPEGImages/2010_002533.jpg 500 332 7 227 159 434 332 7 1 98 300 332 +13324 /data/VOCdevkit/VOC2012/JPEGImages/2010_002534.jpg 500 375 11 74 120 500 375 +13325 /data/VOCdevkit/VOC2012/JPEGImages/2010_002536.jpg 500 375 1 92 57 454 297 1 1 110 123 347 +13326 /data/VOCdevkit/VOC2012/JPEGImages/2010_002537.jpg 500 297 15 50 15 142 250 15 54 54 148 190 15 264 86 325 208 15 310 49 368 209 10 1 231 500 297 +13327 /data/VOCdevkit/VOC2012/JPEGImages/2010_002538.jpg 500 433 8 238 336 305 407 8 154 336 220 406 +13328 /data/VOCdevkit/VOC2012/JPEGImages/2010_002539.jpg 375 500 10 1 401 197 483 4 242 388 279 499 14 76 94 243 421 14 154 233 350 471 +13329 /data/VOCdevkit/VOC2012/JPEGImages/2010_002542.jpg 500 349 0 3 108 493 217 +13330 /data/VOCdevkit/VOC2012/JPEGImages/2010_002543.jpg 500 333 7 6 85 415 230 +13331 /data/VOCdevkit/VOC2012/JPEGImages/2010_002546.jpg 500 337 5 365 102 500 314 5 67 102 340 293 6 334 163 367 210 14 348 225 375 303 3 59 50 173 74 +13332 /data/VOCdevkit/VOC2012/JPEGImages/2010_002547.jpg 500 333 16 224 197 274 232 +13333 /data/VOCdevkit/VOC2012/JPEGImages/2010_002551.jpg 500 375 11 98 81 500 373 +13334 /data/VOCdevkit/VOC2012/JPEGImages/2010_002552.jpg 500 346 11 297 153 389 199 14 166 133 233 264 +13335 /data/VOCdevkit/VOC2012/JPEGImages/2010_002553.jpg 500 375 7 89 94 464 319 +13336 /data/VOCdevkit/VOC2012/JPEGImages/2010_002556.jpg 500 333 18 40 205 463 288 +13337 /data/VOCdevkit/VOC2012/JPEGImages/2010_002561.jpg 500 375 11 1 35 230 375 14 347 18 500 375 19 219 64 367 225 +13338 /data/VOCdevkit/VOC2012/JPEGImages/2010_002562.jpg 375 500 11 1 55 315 473 +13339 /data/VOCdevkit/VOC2012/JPEGImages/2010_002565.jpg 500 332 3 39 1 408 288 +13340 /data/VOCdevkit/VOC2012/JPEGImages/2010_002567.jpg 335 500 19 113 166 219 269 19 57 1 156 76 +13341 /data/VOCdevkit/VOC2012/JPEGImages/2010_002569.jpg 500 333 2 158 123 259 249 +13342 /data/VOCdevkit/VOC2012/JPEGImages/2010_002570.jpg 500 458 11 14 149 199 458 14 16 1 500 387 +13343 /data/VOCdevkit/VOC2012/JPEGImages/2010_002573.jpg 500 375 7 63 79 342 352 +13344 /data/VOCdevkit/VOC2012/JPEGImages/2010_002575.jpg 276 448 8 23 55 229 428 +13345 /data/VOCdevkit/VOC2012/JPEGImages/2010_002577.jpg 500 331 0 7 63 499 231 +13346 /data/VOCdevkit/VOC2012/JPEGImages/2010_002578.jpg 500 375 6 107 105 479 266 +13347 /data/VOCdevkit/VOC2012/JPEGImages/2010_002579.jpg 500 375 0 72 161 292 247 0 56 212 109 232 14 41 270 59 319 14 474 278 495 334 6 389 259 497 320 +13348 /data/VOCdevkit/VOC2012/JPEGImages/2010_002580.jpg 480 326 11 216 102 436 307 +13349 /data/VOCdevkit/VOC2012/JPEGImages/2010_002582.jpg 500 375 16 270 222 440 286 16 128 137 327 260 16 98 121 249 239 16 1 156 111 236 16 425 158 442 177 +13350 /data/VOCdevkit/VOC2012/JPEGImages/2010_002583.jpg 500 375 7 1 80 275 375 7 229 90 500 375 +13351 /data/VOCdevkit/VOC2012/JPEGImages/2010_002586.jpg 500 375 11 255 173 453 295 11 52 162 204 279 4 431 55 452 137 19 153 34 260 116 +13352 /data/VOCdevkit/VOC2012/JPEGImages/2010_002587.jpg 500 375 7 1 10 413 374 +13353 /data/VOCdevkit/VOC2012/JPEGImages/2010_002589.jpg 500 375 11 1 75 336 375 +13354 /data/VOCdevkit/VOC2012/JPEGImages/2010_002592.jpg 500 333 6 11 1 500 332 +13355 /data/VOCdevkit/VOC2012/JPEGImages/2010_002594.jpg 500 375 7 50 57 429 362 +13356 /data/VOCdevkit/VOC2012/JPEGImages/2010_002597.jpg 321 480 14 38 62 242 479 14 2 169 29 223 +13357 /data/VOCdevkit/VOC2012/JPEGImages/2010_002598.jpg 500 333 6 1 10 428 327 +13358 /data/VOCdevkit/VOC2012/JPEGImages/2010_002601.jpg 500 375 11 125 88 500 375 +13359 /data/VOCdevkit/VOC2012/JPEGImages/2010_002602.jpg 500 375 7 193 77 363 375 +13360 /data/VOCdevkit/VOC2012/JPEGImages/2010_002603.jpg 375 500 8 235 248 375 500 8 6 237 107 422 14 255 138 311 190 14 87 58 263 500 +13361 /data/VOCdevkit/VOC2012/JPEGImages/2010_002605.jpg 375 500 10 33 185 362 454 8 117 44 335 346 8 272 176 375 433 8 31 200 177 449 15 281 100 375 196 8 96 246 165 395 +13362 /data/VOCdevkit/VOC2012/JPEGImages/2010_002614.jpg 357 500 2 43 46 321 500 +13363 /data/VOCdevkit/VOC2012/JPEGImages/2010_002615.jpg 375 500 12 83 116 244 422 +13364 /data/VOCdevkit/VOC2012/JPEGImages/2010_002616.jpg 500 375 11 87 12 337 375 +13365 /data/VOCdevkit/VOC2012/JPEGImages/2010_002618.jpg 500 375 18 1 89 150 201 14 324 43 500 375 +13366 /data/VOCdevkit/VOC2012/JPEGImages/2010_002620.jpg 500 375 3 239 179 337 198 +13367 /data/VOCdevkit/VOC2012/JPEGImages/2010_002621.jpg 500 333 2 246 100 424 200 2 83 138 253 223 +13368 /data/VOCdevkit/VOC2012/JPEGImages/2010_002623.jpg 500 375 14 93 1 418 375 +13369 /data/VOCdevkit/VOC2012/JPEGImages/2010_002624.jpg 500 375 16 330 171 448 238 16 212 139 285 179 16 194 166 289 225 16 253 189 317 235 16 141 145 200 191 16 46 186 150 244 +13370 /data/VOCdevkit/VOC2012/JPEGImages/2010_002625.jpg 500 400 14 166 1 500 400 7 1 118 213 324 +13371 /data/VOCdevkit/VOC2012/JPEGImages/2010_002626.jpg 500 375 7 1 52 407 331 +13372 /data/VOCdevkit/VOC2012/JPEGImages/2010_002628.jpg 448 336 16 1 94 249 284 14 230 91 414 317 +13373 /data/VOCdevkit/VOC2012/JPEGImages/2010_002629.jpg 500 333 13 137 127 352 270 14 198 94 291 243 +13374 /data/VOCdevkit/VOC2012/JPEGImages/2010_002631.jpg 375 500 11 14 2 317 500 +13375 /data/VOCdevkit/VOC2012/JPEGImages/2010_002632.jpg 440 330 14 21 1 416 330 15 75 171 108 237 2 174 82 262 152 +13376 /data/VOCdevkit/VOC2012/JPEGImages/2010_002638.jpg 500 375 0 22 81 500 260 +13377 /data/VOCdevkit/VOC2012/JPEGImages/2010_002639.jpg 500 375 8 210 120 269 163 8 18 174 123 315 8 10 236 155 375 8 253 151 311 196 8 357 174 435 243 8 312 279 485 375 10 47 160 462 375 +13378 /data/VOCdevkit/VOC2012/JPEGImages/2010_002642.jpg 500 375 8 1 34 218 294 14 74 65 500 375 +13379 /data/VOCdevkit/VOC2012/JPEGImages/2010_002644.jpg 400 500 11 81 80 400 500 +13380 /data/VOCdevkit/VOC2012/JPEGImages/2010_002645.jpg 331 500 7 1 4 331 498 +13381 /data/VOCdevkit/VOC2012/JPEGImages/2010_002647.jpg 500 310 6 350 142 492 219 6 192 143 388 229 6 15 125 220 262 +13382 /data/VOCdevkit/VOC2012/JPEGImages/2010_002652.jpg 480 361 19 68 134 183 248 14 272 171 388 361 14 140 174 335 361 +13383 /data/VOCdevkit/VOC2012/JPEGImages/2010_002653.jpg 500 375 3 267 157 335 325 3 127 151 198 342 3 175 144 238 300 +13384 /data/VOCdevkit/VOC2012/JPEGImages/2010_002654.jpg 500 368 11 1 37 408 346 +13385 /data/VOCdevkit/VOC2012/JPEGImages/2010_002656.jpg 375 500 1 79 1 375 252 1 1 1 375 500 +13386 /data/VOCdevkit/VOC2012/JPEGImages/2010_002659.jpg 480 428 11 27 50 446 423 +13387 /data/VOCdevkit/VOC2012/JPEGImages/2010_002660.jpg 333 500 1 77 171 333 500 +13388 /data/VOCdevkit/VOC2012/JPEGImages/2010_002661.jpg 375 500 15 15 4 372 460 +13389 /data/VOCdevkit/VOC2012/JPEGImages/2010_002662.jpg 500 470 7 341 34 495 176 +13390 /data/VOCdevkit/VOC2012/JPEGImages/2010_002665.jpg 500 333 16 13 7 478 323 +13391 /data/VOCdevkit/VOC2012/JPEGImages/2010_002666.jpg 500 375 2 216 130 339 253 +13392 /data/VOCdevkit/VOC2012/JPEGImages/2010_002667.jpg 500 334 18 92 73 388 269 +13393 /data/VOCdevkit/VOC2012/JPEGImages/2010_002668.jpg 500 333 4 40 116 459 243 +13394 /data/VOCdevkit/VOC2012/JPEGImages/2010_002674.jpg 500 375 11 125 18 439 244 +13395 /data/VOCdevkit/VOC2012/JPEGImages/2010_002675.jpg 500 375 14 99 100 421 375 +13396 /data/VOCdevkit/VOC2012/JPEGImages/2010_002676.jpg 500 338 11 117 161 239 217 7 237 158 365 229 15 370 84 423 130 15 60 118 171 214 +13397 /data/VOCdevkit/VOC2012/JPEGImages/2010_002678.jpg 500 334 7 1 26 500 232 +13398 /data/VOCdevkit/VOC2012/JPEGImages/2010_002679.jpg 333 500 11 1 84 196 500 14 146 1 333 500 +13399 /data/VOCdevkit/VOC2012/JPEGImages/2010_002682.jpg 500 375 14 1 176 14 208 18 46 82 500 244 +13400 /data/VOCdevkit/VOC2012/JPEGImages/2010_002684.jpg 500 375 0 26 188 453 302 +13401 /data/VOCdevkit/VOC2012/JPEGImages/2010_002686.jpg 500 375 8 1 198 130 372 19 153 160 237 236 8 297 215 486 375 +13402 /data/VOCdevkit/VOC2012/JPEGImages/2010_002688.jpg 500 210 2 304 88 451 170 +13403 /data/VOCdevkit/VOC2012/JPEGImages/2010_002691.jpg 500 367 12 1 44 445 367 +13404 /data/VOCdevkit/VOC2012/JPEGImages/2010_002692.jpg 375 500 7 85 42 264 427 +13405 /data/VOCdevkit/VOC2012/JPEGImages/2010_002693.jpg 375 500 7 89 144 215 351 8 1 270 203 500 1 1 244 233 412 1 2 245 103 380 +13406 /data/VOCdevkit/VOC2012/JPEGImages/2010_002695.jpg 500 375 0 1 38 500 299 0 311 163 390 181 +13407 /data/VOCdevkit/VOC2012/JPEGImages/2010_002696.jpg 375 500 11 148 197 366 500 14 34 1 351 500 +13408 /data/VOCdevkit/VOC2012/JPEGImages/2010_002697.jpg 500 332 18 27 62 500 264 +13409 /data/VOCdevkit/VOC2012/JPEGImages/2010_002701.jpg 500 375 9 226 166 268 217 +13410 /data/VOCdevkit/VOC2012/JPEGImages/2010_002702.jpg 500 375 14 141 167 253 374 3 77 73 487 247 6 36 209 104 264 6 1 231 35 273 +13411 /data/VOCdevkit/VOC2012/JPEGImages/2010_002704.jpg 500 375 14 1 67 433 375 +13412 /data/VOCdevkit/VOC2012/JPEGImages/2010_002705.jpg 500 333 16 141 45 280 150 +13413 /data/VOCdevkit/VOC2012/JPEGImages/2010_002708.jpg 417 289 1 136 186 253 273 14 103 150 153 272 14 169 141 227 268 +13414 /data/VOCdevkit/VOC2012/JPEGImages/2010_002710.jpg 500 375 17 84 191 387 337 +13415 /data/VOCdevkit/VOC2012/JPEGImages/2010_002713.jpg 500 375 7 174 150 284 222 +13416 /data/VOCdevkit/VOC2012/JPEGImages/2010_002714.jpg 500 375 10 1 202 500 375 14 87 51 457 270 14 124 53 177 174 +13417 /data/VOCdevkit/VOC2012/JPEGImages/2010_002716.jpg 500 375 9 7 147 152 244 +13418 /data/VOCdevkit/VOC2012/JPEGImages/2010_002720.jpg 500 328 1 295 163 423 275 1 83 109 195 212 14 323 85 406 250 14 80 75 150 185 +13419 /data/VOCdevkit/VOC2012/JPEGImages/2010_002721.jpg 500 375 10 1 118 474 375 8 382 64 471 281 8 222 152 473 375 8 1 133 231 375 +13420 /data/VOCdevkit/VOC2012/JPEGImages/2010_002722.jpg 500 375 14 31 178 67 259 14 73 171 103 253 18 36 93 500 244 +13421 /data/VOCdevkit/VOC2012/JPEGImages/2010_002723.jpg 500 375 7 297 18 500 241 7 24 57 302 313 +13422 /data/VOCdevkit/VOC2012/JPEGImages/2010_002725.jpg 500 375 10 1 297 500 375 10 1 190 82 272 14 261 50 500 329 14 60 80 260 314 +13423 /data/VOCdevkit/VOC2012/JPEGImages/2010_002728.jpg 500 375 10 169 147 456 355 8 135 174 276 373 8 277 166 413 368 +13424 /data/VOCdevkit/VOC2012/JPEGImages/2010_002729.jpg 375 500 10 16 257 371 500 +13425 /data/VOCdevkit/VOC2012/JPEGImages/2010_002733.jpg 500 375 15 273 199 313 266 +13426 /data/VOCdevkit/VOC2012/JPEGImages/2010_002734.jpg 500 333 12 129 66 222 152 12 261 1 500 333 +13427 /data/VOCdevkit/VOC2012/JPEGImages/2010_002736.jpg 500 333 16 95 253 168 314 16 406 56 472 110 +13428 /data/VOCdevkit/VOC2012/JPEGImages/2010_002737.jpg 500 382 16 1 170 280 382 14 267 25 434 382 +13429 /data/VOCdevkit/VOC2012/JPEGImages/2010_002740.jpg 375 500 2 1 22 289 499 +13430 /data/VOCdevkit/VOC2012/JPEGImages/2010_002741.jpg 500 375 11 47 68 464 340 +13431 /data/VOCdevkit/VOC2012/JPEGImages/2010_002742.jpg 500 375 19 101 36 166 89 10 1 307 266 375 14 237 146 331 375 14 151 186 281 375 8 431 211 500 341 15 68 95 199 211 +13432 /data/VOCdevkit/VOC2012/JPEGImages/2010_002746.jpg 375 500 7 1 49 350 411 +13433 /data/VOCdevkit/VOC2012/JPEGImages/2010_002747.jpg 500 333 13 58 85 334 286 14 169 46 286 262 +13434 /data/VOCdevkit/VOC2012/JPEGImages/2010_002750.jpg 500 333 16 155 182 181 208 +13435 /data/VOCdevkit/VOC2012/JPEGImages/2010_002752.jpg 500 375 2 237 114 279 169 +13436 /data/VOCdevkit/VOC2012/JPEGImages/2010_002754.jpg 386 500 16 131 328 152 345 16 205 317 236 344 16 206 344 251 376 +13437 /data/VOCdevkit/VOC2012/JPEGImages/2010_002758.jpg 500 375 5 53 62 450 301 +13438 /data/VOCdevkit/VOC2012/JPEGImages/2010_002759.jpg 500 375 11 33 108 469 260 +13439 /data/VOCdevkit/VOC2012/JPEGImages/2010_002760.jpg 500 375 8 1 181 192 375 8 207 167 422 374 +13440 /data/VOCdevkit/VOC2012/JPEGImages/2010_002763.jpg 353 500 9 23 245 250 442 7 212 321 324 404 14 257 27 323 324 14 178 82 248 331 14 43 136 230 316 +13441 /data/VOCdevkit/VOC2012/JPEGImages/2010_002767.jpg 333 500 1 1 351 331 500 14 4 81 333 500 +13442 /data/VOCdevkit/VOC2012/JPEGImages/2010_002770.jpg 500 375 19 1 1 500 375 14 11 74 474 375 +13443 /data/VOCdevkit/VOC2012/JPEGImages/2010_002771.jpg 500 375 7 296 39 500 365 +13444 /data/VOCdevkit/VOC2012/JPEGImages/2010_002772.jpg 500 455 4 93 36 480 455 +13445 /data/VOCdevkit/VOC2012/JPEGImages/2010_002774.jpg 500 308 5 77 66 455 266 5 1 76 315 261 +13446 /data/VOCdevkit/VOC2012/JPEGImages/2010_002775.jpg 500 375 11 1 87 285 374 +13447 /data/VOCdevkit/VOC2012/JPEGImages/2010_002778.jpg 333 500 7 107 68 305 461 +13448 /data/VOCdevkit/VOC2012/JPEGImages/2010_002779.jpg 375 500 14 287 383 322 450 +13449 /data/VOCdevkit/VOC2012/JPEGImages/2010_002780.jpg 500 374 3 116 46 438 281 +13450 /data/VOCdevkit/VOC2012/JPEGImages/2010_002781.jpg 500 375 18 184 159 500 194 +13451 /data/VOCdevkit/VOC2012/JPEGImages/2010_002783.jpg 500 326 6 1 134 500 326 14 105 101 292 235 14 283 105 500 298 +13452 /data/VOCdevkit/VOC2012/JPEGImages/2010_002786.jpg 500 375 11 1 97 213 375 +13453 /data/VOCdevkit/VOC2012/JPEGImages/2010_002789.jpg 500 409 7 6 144 500 382 +13454 /data/VOCdevkit/VOC2012/JPEGImages/2010_002790.jpg 500 375 6 249 66 500 263 6 52 55 406 340 +13455 /data/VOCdevkit/VOC2012/JPEGImages/2010_002791.jpg 351 500 19 38 160 336 460 +13456 /data/VOCdevkit/VOC2012/JPEGImages/2010_002792.jpg 500 333 14 140 59 500 333 1 29 65 244 235 +13457 /data/VOCdevkit/VOC2012/JPEGImages/2010_002793.jpg 500 375 11 16 82 363 288 +13458 /data/VOCdevkit/VOC2012/JPEGImages/2010_002794.jpg 500 375 11 69 35 336 375 11 1 210 208 375 +13459 /data/VOCdevkit/VOC2012/JPEGImages/2010_002797.jpg 500 375 9 1 31 327 375 9 96 62 395 374 +13460 /data/VOCdevkit/VOC2012/JPEGImages/2010_002801.jpg 500 375 1 1 1 500 375 +13461 /data/VOCdevkit/VOC2012/JPEGImages/2010_002803.jpg 500 375 2 276 188 301 220 +13462 /data/VOCdevkit/VOC2012/JPEGImages/2010_002805.jpg 500 375 11 1 37 401 368 +13463 /data/VOCdevkit/VOC2012/JPEGImages/2010_002807.jpg 500 375 11 136 173 181 231 14 204 11 309 239 6 420 47 491 103 4 94 249 136 269 +13464 /data/VOCdevkit/VOC2012/JPEGImages/2010_002808.jpg 500 333 11 1 1 389 333 +13465 /data/VOCdevkit/VOC2012/JPEGImages/2010_002811.jpg 500 333 7 284 157 424 309 10 8 109 411 286 8 106 70 180 186 8 258 69 328 183 +13466 /data/VOCdevkit/VOC2012/JPEGImages/2010_002813.jpg 500 375 11 69 17 467 365 +13467 /data/VOCdevkit/VOC2012/JPEGImages/2010_002814.jpg 500 375 1 30 14 494 314 +13468 /data/VOCdevkit/VOC2012/JPEGImages/2010_002815.jpg 372 496 8 106 375 244 496 +13469 /data/VOCdevkit/VOC2012/JPEGImages/2010_002816.jpg 500 333 0 179 116 500 259 14 67 157 98 227 +13470 /data/VOCdevkit/VOC2012/JPEGImages/2010_002817.jpg 500 473 11 112 153 431 283 11 233 16 500 208 14 1 11 332 473 17 2 1 500 414 +13471 /data/VOCdevkit/VOC2012/JPEGImages/2010_002820.jpg 375 500 1 1 272 184 409 14 143 69 251 395 14 3 220 26 277 14 28 249 58 277 +13472 /data/VOCdevkit/VOC2012/JPEGImages/2010_002821.jpg 333 500 16 207 259 333 499 14 14 39 186 473 +13473 /data/VOCdevkit/VOC2012/JPEGImages/2010_002822.jpg 333 500 12 128 187 220 420 14 118 132 241 321 +13474 /data/VOCdevkit/VOC2012/JPEGImages/2010_002824.jpg 427 500 11 1 1 425 500 +13475 /data/VOCdevkit/VOC2012/JPEGImages/2010_002827.jpg 500 143 0 15 14 500 143 +13476 /data/VOCdevkit/VOC2012/JPEGImages/2010_002830.jpg 375 500 15 21 81 272 428 15 1 271 93 426 8 250 208 375 467 10 1 259 299 500 +13477 /data/VOCdevkit/VOC2012/JPEGImages/2010_002831.jpg 500 375 7 1 1 445 302 +13478 /data/VOCdevkit/VOC2012/JPEGImages/2010_002834.jpg 350 500 9 58 18 288 480 +13479 /data/VOCdevkit/VOC2012/JPEGImages/2010_002838.jpg 423 500 18 122 44 423 471 18 21 230 157 356 +13480 /data/VOCdevkit/VOC2012/JPEGImages/2010_002839.jpg 500 375 2 131 175 188 254 +13481 /data/VOCdevkit/VOC2012/JPEGImages/2010_002840.jpg 375 500 18 1 228 257 398 +13482 /data/VOCdevkit/VOC2012/JPEGImages/2010_002841.jpg 500 333 6 7 65 497 317 +13483 /data/VOCdevkit/VOC2012/JPEGImages/2010_002842.jpg 500 368 15 1 1 338 294 15 52 14 476 343 +13484 /data/VOCdevkit/VOC2012/JPEGImages/2010_002843.jpg 500 375 19 330 2 500 213 4 241 203 351 375 +13485 /data/VOCdevkit/VOC2012/JPEGImages/2010_002844.jpg 494 347 6 62 122 420 323 14 212 65 268 167 +13486 /data/VOCdevkit/VOC2012/JPEGImages/2010_002845.jpg 500 375 7 49 68 454 347 +13487 /data/VOCdevkit/VOC2012/JPEGImages/2010_002851.jpg 500 375 18 23 131 488 341 14 1 251 13 295 14 13 250 25 286 +13488 /data/VOCdevkit/VOC2012/JPEGImages/2010_002853.jpg 375 500 14 43 170 291 500 14 283 151 354 313 14 62 84 176 203 +13489 /data/VOCdevkit/VOC2012/JPEGImages/2010_002854.jpg 500 375 2 305 89 376 153 2 152 32 236 296 2 65 261 156 375 +13490 /data/VOCdevkit/VOC2012/JPEGImages/2010_002855.jpg 500 375 7 115 82 313 368 +13491 /data/VOCdevkit/VOC2012/JPEGImages/2010_002856.jpg 463 500 11 74 9 336 409 +13492 /data/VOCdevkit/VOC2012/JPEGImages/2010_002857.jpg 485 500 11 203 43 484 500 11 1 1 323 457 +13493 /data/VOCdevkit/VOC2012/JPEGImages/2010_002858.jpg 500 374 4 232 27 288 132 +13494 /data/VOCdevkit/VOC2012/JPEGImages/2010_002860.jpg 500 375 14 1 83 500 373 17 1 141 500 373 +13495 /data/VOCdevkit/VOC2012/JPEGImages/2010_002864.jpg 500 333 14 78 91 176 298 14 202 113 307 304 +13496 /data/VOCdevkit/VOC2012/JPEGImages/2010_002865.jpg 500 375 6 385 138 500 210 6 409 171 500 375 14 164 116 308 319 +13497 /data/VOCdevkit/VOC2012/JPEGImages/2010_002868.jpg 500 375 5 11 25 287 336 5 196 87 485 302 +13498 /data/VOCdevkit/VOC2012/JPEGImages/2010_002870.jpg 335 500 8 125 228 335 411 8 210 171 335 248 8 262 131 335 182 8 269 126 335 164 +13499 /data/VOCdevkit/VOC2012/JPEGImages/2010_002871.jpg 500 333 4 402 56 421 85 14 1 1 216 333 14 225 103 439 333 14 339 83 500 333 14 261 4 377 99 14 418 1 500 266 14 337 98 379 188 14 358 17 445 90 +13500 /data/VOCdevkit/VOC2012/JPEGImages/2010_002873.jpg 374 500 2 86 136 355 248 +13501 /data/VOCdevkit/VOC2012/JPEGImages/2010_002876.jpg 500 375 7 43 16 500 315 +13502 /data/VOCdevkit/VOC2012/JPEGImages/2010_002877.jpg 500 338 8 95 195 141 302 14 108 158 196 309 14 191 159 237 286 14 237 156 283 291 14 283 155 347 297 14 306 162 393 321 8 340 213 414 338 8 118 211 192 336 8 197 226 268 338 10 157 204 320 319 +13503 /data/VOCdevkit/VOC2012/JPEGImages/2010_002879.jpg 375 500 11 148 207 314 302 4 23 435 70 500 14 37 28 334 419 +13504 /data/VOCdevkit/VOC2012/JPEGImages/2010_002880.jpg 375 500 10 133 261 375 500 14 161 168 311 351 8 8 238 163 500 14 52 66 279 405 +13505 /data/VOCdevkit/VOC2012/JPEGImages/2010_002881.jpg 500 338 14 26 6 329 338 8 54 106 250 331 +13506 /data/VOCdevkit/VOC2012/JPEGImages/2010_002884.jpg 500 375 11 203 20 451 375 +13507 /data/VOCdevkit/VOC2012/JPEGImages/2010_002887.jpg 500 375 11 117 1 415 375 +13508 /data/VOCdevkit/VOC2012/JPEGImages/2010_002891.jpg 500 333 7 1 1 500 332 +13509 /data/VOCdevkit/VOC2012/JPEGImages/2010_002892.jpg 500 333 0 156 130 301 205 +13510 /data/VOCdevkit/VOC2012/JPEGImages/2010_002896.jpg 500 333 18 174 104 456 243 +13511 /data/VOCdevkit/VOC2012/JPEGImages/2010_002899.jpg 500 375 3 92 69 423 375 +13512 /data/VOCdevkit/VOC2012/JPEGImages/2010_002900.jpg 500 443 7 1 29 478 443 +13513 /data/VOCdevkit/VOC2012/JPEGImages/2010_002901.jpg 500 375 11 104 72 339 334 +13514 /data/VOCdevkit/VOC2012/JPEGImages/2010_002902.jpg 500 334 6 62 35 395 290 6 1 73 70 220 14 390 95 460 270 +13515 /data/VOCdevkit/VOC2012/JPEGImages/2010_002903.jpg 500 375 6 1 121 398 348 14 182 138 246 183 +13516 /data/VOCdevkit/VOC2012/JPEGImages/2010_002905.jpg 375 500 9 58 65 375 500 +13517 /data/VOCdevkit/VOC2012/JPEGImages/2010_002907.jpg 500 414 11 281 21 413 254 11 311 236 434 410 11 1 211 280 414 11 190 68 301 249 +13518 /data/VOCdevkit/VOC2012/JPEGImages/2010_002909.jpg 500 375 7 1 69 450 375 +13519 /data/VOCdevkit/VOC2012/JPEGImages/2010_002914.jpg 500 375 14 131 75 306 375 +13520 /data/VOCdevkit/VOC2012/JPEGImages/2010_002915.jpg 500 337 1 349 202 500 337 14 1 37 397 337 +13521 /data/VOCdevkit/VOC2012/JPEGImages/2010_002917.jpg 500 322 7 2 20 210 284 7 287 32 472 250 +13522 /data/VOCdevkit/VOC2012/JPEGImages/2010_002921.jpg 500 375 8 121 255 336 374 8 1 210 117 374 19 258 175 354 272 19 126 169 250 276 19 48 184 129 271 +13523 /data/VOCdevkit/VOC2012/JPEGImages/2010_002924.jpg 500 357 11 21 11 438 357 +13524 /data/VOCdevkit/VOC2012/JPEGImages/2010_002927.jpg 500 375 1 1 217 390 375 14 63 30 289 375 +13525 /data/VOCdevkit/VOC2012/JPEGImages/2010_002929.jpg 500 326 6 6 57 454 314 6 1 75 52 123 6 30 76 74 111 14 423 38 500 326 14 395 65 450 145 14 295 51 381 146 14 261 65 320 134 +13526 /data/VOCdevkit/VOC2012/JPEGImages/2010_002930.jpg 500 375 18 98 186 166 222 +13527 /data/VOCdevkit/VOC2012/JPEGImages/2010_002931.jpg 332 500 14 1 80 308 500 4 106 132 168 370 +13528 /data/VOCdevkit/VOC2012/JPEGImages/2010_002935.jpg 500 213 2 106 57 388 144 +13529 /data/VOCdevkit/VOC2012/JPEGImages/2010_002937.jpg 500 362 18 106 157 423 290 +13530 /data/VOCdevkit/VOC2012/JPEGImages/2010_002938.jpg 500 375 11 64 28 483 375 +13531 /data/VOCdevkit/VOC2012/JPEGImages/2010_002939.jpg 500 196 0 1 41 497 182 +13532 /data/VOCdevkit/VOC2012/JPEGImages/2010_002940.jpg 377 500 3 145 186 217 203 +13533 /data/VOCdevkit/VOC2012/JPEGImages/2010_002941.jpg 375 500 4 80 1 295 500 +13534 /data/VOCdevkit/VOC2012/JPEGImages/2010_002946.jpg 500 333 14 395 213 435 333 14 461 242 499 333 14 458 220 496 328 18 57 58 474 280 18 1 55 232 298 +13535 /data/VOCdevkit/VOC2012/JPEGImages/2010_002947.jpg 500 333 0 128 179 375 254 +13536 /data/VOCdevkit/VOC2012/JPEGImages/2010_002948.jpg 500 375 12 106 52 499 375 12 94 159 247 304 6 1 133 194 375 +13537 /data/VOCdevkit/VOC2012/JPEGImages/2010_002954.jpg 500 333 0 8 110 493 254 +13538 /data/VOCdevkit/VOC2012/JPEGImages/2010_002955.jpg 500 333 7 133 7 328 174 2 244 176 341 302 +13539 /data/VOCdevkit/VOC2012/JPEGImages/2010_002956.jpg 500 348 4 191 99 330 347 +13540 /data/VOCdevkit/VOC2012/JPEGImages/2010_002958.jpg 332 500 8 168 195 332 447 8 1 114 255 384 +13541 /data/VOCdevkit/VOC2012/JPEGImages/2010_002960.jpg 276 500 11 31 16 254 474 +13542 /data/VOCdevkit/VOC2012/JPEGImages/2010_002962.jpg 500 375 14 1 166 54 204 14 60 128 155 208 14 413 113 500 255 14 58 162 219 375 14 190 149 442 375 14 63 178 468 375 14 311 145 500 375 +13543 /data/VOCdevkit/VOC2012/JPEGImages/2010_002963.jpg 500 376 7 108 154 435 320 +13544 /data/VOCdevkit/VOC2012/JPEGImages/2010_002965.jpg 500 333 7 171 65 500 303 7 72 130 187 227 +13545 /data/VOCdevkit/VOC2012/JPEGImages/2010_002972.jpg 500 334 11 1 1 500 334 11 61 191 281 334 11 1 122 137 334 +13546 /data/VOCdevkit/VOC2012/JPEGImages/2010_002973.jpg 388 500 7 19 8 359 452 +13547 /data/VOCdevkit/VOC2012/JPEGImages/2010_002976.jpg 500 375 7 1 1 355 375 +13548 /data/VOCdevkit/VOC2012/JPEGImages/2010_002978.jpg 500 361 5 79 54 398 311 14 416 215 445 299 14 392 217 408 304 +13549 /data/VOCdevkit/VOC2012/JPEGImages/2010_002979.jpg 500 375 11 1 95 412 375 +13550 /data/VOCdevkit/VOC2012/JPEGImages/2010_002980.jpg 500 387 14 282 22 487 244 11 108 237 195 375 +13551 /data/VOCdevkit/VOC2012/JPEGImages/2010_002982.jpg 500 479 15 403 48 500 294 19 1 129 131 281 14 43 63 442 479 +13552 /data/VOCdevkit/VOC2012/JPEGImages/2010_002985.jpg 500 375 14 172 165 199 251 14 140 163 166 255 6 234 173 272 188 6 222 186 394 273 +13553 /data/VOCdevkit/VOC2012/JPEGImages/2010_002987.jpg 500 375 14 66 84 252 361 +13554 /data/VOCdevkit/VOC2012/JPEGImages/2010_002988.jpg 500 375 6 254 176 486 310 6 154 175 361 276 6 79 173 220 259 +13555 /data/VOCdevkit/VOC2012/JPEGImages/2010_002990.jpg 500 375 7 79 57 308 375 14 49 1 500 375 +13556 /data/VOCdevkit/VOC2012/JPEGImages/2010_002991.jpg 462 500 13 193 303 415 492 +13557 /data/VOCdevkit/VOC2012/JPEGImages/2010_002993.jpg 500 375 7 34 87 434 375 +13558 /data/VOCdevkit/VOC2012/JPEGImages/2010_002995.jpg 500 335 11 204 54 423 280 +13559 /data/VOCdevkit/VOC2012/JPEGImages/2010_003002.jpg 375 500 8 255 221 313 279 8 74 241 127 311 8 1 263 56 332 10 1 259 357 500 8 1 381 83 500 8 10 213 82 322 +13560 /data/VOCdevkit/VOC2012/JPEGImages/2010_003003.jpg 319 500 14 1 276 319 500 14 71 1 319 319 +13561 /data/VOCdevkit/VOC2012/JPEGImages/2010_003007.jpg 480 360 11 62 5 469 360 +13562 /data/VOCdevkit/VOC2012/JPEGImages/2010_003010.jpg 500 332 11 319 161 430 298 11 61 147 183 303 14 159 1 247 199 +13563 /data/VOCdevkit/VOC2012/JPEGImages/2010_003011.jpg 500 375 9 1 34 470 375 +13564 /data/VOCdevkit/VOC2012/JPEGImages/2010_003013.jpg 500 333 16 217 110 292 162 16 84 113 147 161 +13565 /data/VOCdevkit/VOC2012/JPEGImages/2010_003014.jpg 500 387 14 250 170 418 387 14 279 212 500 387 14 259 9 427 301 14 119 123 258 387 14 1 133 148 340 +13566 /data/VOCdevkit/VOC2012/JPEGImages/2010_003015.jpg 500 333 2 131 49 488 128 +13567 /data/VOCdevkit/VOC2012/JPEGImages/2010_003016.jpg 500 375 9 50 123 303 372 9 165 150 382 375 14 63 42 133 180 14 358 209 411 335 +13568 /data/VOCdevkit/VOC2012/JPEGImages/2010_003017.jpg 500 375 4 156 98 254 319 4 371 191 480 375 14 170 138 390 375 15 123 154 149 255 15 71 172 123 262 15 42 211 66 238 +13569 /data/VOCdevkit/VOC2012/JPEGImages/2010_003019.jpg 500 380 11 22 32 500 380 +13570 /data/VOCdevkit/VOC2012/JPEGImages/2010_003024.jpg 500 375 6 79 1 407 271 +13571 /data/VOCdevkit/VOC2012/JPEGImages/2010_003025.jpg 500 206 0 24 75 496 198 +13572 /data/VOCdevkit/VOC2012/JPEGImages/2010_003027.jpg 500 375 17 1 171 156 296 8 48 267 352 375 3 10 85 107 176 +13573 /data/VOCdevkit/VOC2012/JPEGImages/2010_003028.jpg 500 375 16 182 118 429 293 +13574 /data/VOCdevkit/VOC2012/JPEGImages/2010_003032.jpg 500 375 11 313 81 500 375 11 1 148 226 373 7 191 65 339 243 +13575 /data/VOCdevkit/VOC2012/JPEGImages/2010_003034.jpg 500 375 14 1 72 132 375 14 100 19 199 151 14 171 1 282 169 14 385 76 500 375 14 228 14 460 375 14 89 114 308 375 +13576 /data/VOCdevkit/VOC2012/JPEGImages/2010_003035.jpg 250 165 19 191 26 250 101 14 30 5 168 165 19 5 39 53 83 +13577 /data/VOCdevkit/VOC2012/JPEGImages/2010_003037.jpg 500 333 4 92 1 211 241 +13578 /data/VOCdevkit/VOC2012/JPEGImages/2010_003040.jpg 500 336 5 60 16 458 266 14 40 128 87 249 +13579 /data/VOCdevkit/VOC2012/JPEGImages/2010_003043.jpg 500 333 11 1 54 236 333 14 301 55 475 215 +13580 /data/VOCdevkit/VOC2012/JPEGImages/2010_003044.jpg 417 500 2 43 68 357 444 +13581 /data/VOCdevkit/VOC2012/JPEGImages/2010_003047.jpg 500 375 6 1 1 485 327 +13582 /data/VOCdevkit/VOC2012/JPEGImages/2010_003050.jpg 500 375 7 1 1 395 374 +13583 /data/VOCdevkit/VOC2012/JPEGImages/2010_003051.jpg 500 333 0 84 127 492 257 +13584 /data/VOCdevkit/VOC2012/JPEGImages/2010_003053.jpg 500 375 0 284 245 500 339 0 9 144 490 303 +13585 /data/VOCdevkit/VOC2012/JPEGImages/2010_003054.jpg 500 375 0 162 47 342 116 14 155 194 273 375 14 259 210 500 375 +13586 /data/VOCdevkit/VOC2012/JPEGImages/2010_003055.jpg 393 500 11 60 58 393 500 +13587 /data/VOCdevkit/VOC2012/JPEGImages/2010_003056.jpg 350 263 11 110 45 278 263 14 1 1 350 263 +13588 /data/VOCdevkit/VOC2012/JPEGImages/2010_003057.jpg 500 407 5 183 102 447 363 6 1 249 34 305 6 14 237 113 296 6 77 232 149 283 6 141 225 181 276 +13589 /data/VOCdevkit/VOC2012/JPEGImages/2010_003060.jpg 500 333 11 78 1 319 333 +13590 /data/VOCdevkit/VOC2012/JPEGImages/2010_003062.jpg 500 375 1 79 149 401 337 14 180 42 283 307 +13591 /data/VOCdevkit/VOC2012/JPEGImages/2010_003067.jpg 500 375 7 181 92 327 259 +13592 /data/VOCdevkit/VOC2012/JPEGImages/2010_003071.jpg 340 340 11 59 43 290 320 +13593 /data/VOCdevkit/VOC2012/JPEGImages/2010_003072.jpg 500 375 14 191 165 229 196 +13594 /data/VOCdevkit/VOC2012/JPEGImages/2010_003074.jpg 500 375 16 220 163 453 337 16 59 132 244 272 +13595 /data/VOCdevkit/VOC2012/JPEGImages/2010_003077.jpg 500 331 11 135 37 409 329 +13596 /data/VOCdevkit/VOC2012/JPEGImages/2010_003078.jpg 500 375 10 20 165 131 216 10 2 213 172 372 14 80 34 469 375 8 42 213 157 375 +13597 /data/VOCdevkit/VOC2012/JPEGImages/2010_003081.jpg 500 332 2 180 127 382 286 +13598 /data/VOCdevkit/VOC2012/JPEGImages/2010_003082.jpg 375 500 11 274 36 346 140 +13599 /data/VOCdevkit/VOC2012/JPEGImages/2010_003084.jpg 500 375 8 355 207 395 266 14 420 122 473 204 14 355 113 450 268 14 148 24 339 267 10 1 263 500 375 +13600 /data/VOCdevkit/VOC2012/JPEGImages/2010_003086.jpg 500 375 11 1 1 500 375 +13601 /data/VOCdevkit/VOC2012/JPEGImages/2010_003088.jpg 500 333 0 87 117 397 213 +13602 /data/VOCdevkit/VOC2012/JPEGImages/2010_003091.jpg 500 375 14 245 125 296 203 14 136 105 250 266 14 2 107 151 334 14 325 89 500 339 10 1 236 403 375 4 183 206 218 338 4 304 176 322 242 +13603 /data/VOCdevkit/VOC2012/JPEGImages/2010_003092.jpg 500 375 4 242 150 390 340 4 393 11 459 184 +13604 /data/VOCdevkit/VOC2012/JPEGImages/2010_003093.jpg 500 375 1 133 283 434 374 14 189 138 337 375 4 297 340 319 375 +13605 /data/VOCdevkit/VOC2012/JPEGImages/2010_003094.jpg 377 500 16 304 252 370 403 16 1 331 124 460 14 81 128 346 481 +13606 /data/VOCdevkit/VOC2012/JPEGImages/2010_003097.jpg 500 375 2 212 172 289 344 +13607 /data/VOCdevkit/VOC2012/JPEGImages/2010_003098.jpg 500 333 11 4 1 500 297 +13608 /data/VOCdevkit/VOC2012/JPEGImages/2010_003101.jpg 500 333 15 27 35 367 333 +13609 /data/VOCdevkit/VOC2012/JPEGImages/2010_003102.jpg 500 334 16 65 59 500 334 +13610 /data/VOCdevkit/VOC2012/JPEGImages/2010_003103.jpg 500 455 19 332 168 437 253 8 6 229 230 450 15 118 194 189 298 15 124 68 201 130 15 285 72 337 120 3 189 1 283 120 +13611 /data/VOCdevkit/VOC2012/JPEGImages/2010_003106.jpg 500 375 7 99 110 269 277 +13612 /data/VOCdevkit/VOC2012/JPEGImages/2010_003107.jpg 424 283 14 109 104 174 218 3 1 1 368 283 +13613 /data/VOCdevkit/VOC2012/JPEGImages/2010_003108.jpg 375 500 10 1 269 61 500 14 59 12 257 270 10 58 266 375 500 +13614 /data/VOCdevkit/VOC2012/JPEGImages/2010_003112.jpg 500 375 14 197 131 449 375 14 20 139 216 375 14 36 7 367 260 +13615 /data/VOCdevkit/VOC2012/JPEGImages/2010_003114.jpg 500 375 11 201 92 393 353 17 96 89 500 375 +13616 /data/VOCdevkit/VOC2012/JPEGImages/2010_003115.jpg 500 375 8 282 236 365 348 1 60 188 252 356 +13617 /data/VOCdevkit/VOC2012/JPEGImages/2010_003117.jpg 500 374 14 350 187 369 234 3 53 20 322 242 +13618 /data/VOCdevkit/VOC2012/JPEGImages/2010_003119.jpg 500 317 2 132 130 384 185 +13619 /data/VOCdevkit/VOC2012/JPEGImages/2010_003120.jpg 500 333 6 367 106 495 200 6 14 63 312 296 6 234 97 475 240 +13620 /data/VOCdevkit/VOC2012/JPEGImages/2010_003122.jpg 500 333 14 48 63 148 205 14 117 51 500 333 +13621 /data/VOCdevkit/VOC2012/JPEGImages/2010_003123.jpg 375 500 6 213 6 271 59 6 291 1 346 50 15 1 183 375 500 +13622 /data/VOCdevkit/VOC2012/JPEGImages/2010_003127.jpg 500 375 0 13 133 227 208 0 299 167 403 205 0 398 165 495 201 0 242 169 321 203 +13623 /data/VOCdevkit/VOC2012/JPEGImages/2010_003129.jpg 500 375 6 6 234 83 295 6 135 231 228 280 6 42 241 189 333 6 258 193 500 288 6 164 236 500 375 18 9 157 486 265 +13624 /data/VOCdevkit/VOC2012/JPEGImages/2010_003132.jpg 500 333 0 2 63 500 298 +13625 /data/VOCdevkit/VOC2012/JPEGImages/2010_003133.jpg 500 375 7 87 30 453 370 +13626 /data/VOCdevkit/VOC2012/JPEGImages/2010_003135.jpg 500 375 2 200 107 241 203 +13627 /data/VOCdevkit/VOC2012/JPEGImages/2010_003137.jpg 375 500 19 24 266 92 327 +13628 /data/VOCdevkit/VOC2012/JPEGImages/2010_003138.jpg 500 334 11 143 43 453 334 +13629 /data/VOCdevkit/VOC2012/JPEGImages/2010_003139.jpg 500 375 6 42 66 426 258 +13630 /data/VOCdevkit/VOC2012/JPEGImages/2010_003143.jpg 500 375 17 1 158 188 268 8 183 153 289 277 8 140 236 240 375 8 215 204 292 301 14 195 169 254 290 +13631 /data/VOCdevkit/VOC2012/JPEGImages/2010_003146.jpg 352 288 11 150 118 270 200 11 37 53 220 246 +13632 /data/VOCdevkit/VOC2012/JPEGImages/2010_003147.jpg 500 326 11 25 69 462 272 +13633 /data/VOCdevkit/VOC2012/JPEGImages/2010_003148.jpg 500 375 1 227 180 276 212 +13634 /data/VOCdevkit/VOC2012/JPEGImages/2010_003149.jpg 500 375 17 1 76 317 357 8 391 91 500 259 +13635 /data/VOCdevkit/VOC2012/JPEGImages/2010_003151.jpg 500 331 7 39 12 468 313 +13636 /data/VOCdevkit/VOC2012/JPEGImages/2010_003153.jpg 500 375 16 180 165 415 297 +13637 /data/VOCdevkit/VOC2012/JPEGImages/2010_003154.jpg 500 375 8 147 288 271 375 8 289 270 402 375 8 144 246 240 375 8 273 239 330 348 10 121 253 363 375 +13638 /data/VOCdevkit/VOC2012/JPEGImages/2010_003156.jpg 500 375 14 425 193 447 234 3 342 217 419 233 +13639 /data/VOCdevkit/VOC2012/JPEGImages/2010_003157.jpg 375 500 8 198 161 337 369 8 54 160 196 381 10 95 142 333 419 +13640 /data/VOCdevkit/VOC2012/JPEGImages/2010_003159.jpg 500 375 13 1 1 500 375 +13641 /data/VOCdevkit/VOC2012/JPEGImages/2010_003160.jpg 500 306 14 117 148 146 231 18 1 105 500 306 +13642 /data/VOCdevkit/VOC2012/JPEGImages/2010_003162.jpg 500 333 11 93 1 406 333 +13643 /data/VOCdevkit/VOC2012/JPEGImages/2010_003168.jpg 500 338 2 74 51 284 176 2 171 193 258 253 +13644 /data/VOCdevkit/VOC2012/JPEGImages/2010_003169.jpg 500 375 17 1 34 484 375 +13645 /data/VOCdevkit/VOC2012/JPEGImages/2010_003170.jpg 500 375 8 192 282 399 375 +13646 /data/VOCdevkit/VOC2012/JPEGImages/2010_003173.jpg 500 375 5 80 61 475 336 +13647 /data/VOCdevkit/VOC2012/JPEGImages/2010_003174.jpg 375 500 7 71 107 355 431 +13648 /data/VOCdevkit/VOC2012/JPEGImages/2010_003176.jpg 500 333 11 1 1 330 333 +13649 /data/VOCdevkit/VOC2012/JPEGImages/2010_003179.jpg 500 357 5 49 33 415 327 5 410 72 500 286 +13650 /data/VOCdevkit/VOC2012/JPEGImages/2010_003183.jpg 500 375 9 177 174 408 275 9 46 226 94 270 +13651 /data/VOCdevkit/VOC2012/JPEGImages/2010_003185.jpg 500 339 14 276 23 500 339 +13652 /data/VOCdevkit/VOC2012/JPEGImages/2010_003186.jpg 375 500 11 93 135 374 500 +13653 /data/VOCdevkit/VOC2012/JPEGImages/2010_003187.jpg 500 375 11 1 1 500 224 +13654 /data/VOCdevkit/VOC2012/JPEGImages/2010_003190.jpg 500 332 7 101 50 446 280 +13655 /data/VOCdevkit/VOC2012/JPEGImages/2010_003191.jpg 500 333 6 88 188 412 287 +13656 /data/VOCdevkit/VOC2012/JPEGImages/2010_003192.jpg 500 375 12 36 9 287 268 +13657 /data/VOCdevkit/VOC2012/JPEGImages/2010_003197.jpg 500 375 7 122 58 421 343 +13658 /data/VOCdevkit/VOC2012/JPEGImages/2010_003199.jpg 500 373 4 31 199 470 313 +13659 /data/VOCdevkit/VOC2012/JPEGImages/2010_003200.jpg 500 375 13 25 65 459 304 6 39 86 63 105 +13660 /data/VOCdevkit/VOC2012/JPEGImages/2010_003201.jpg 500 375 9 128 157 500 299 +13661 /data/VOCdevkit/VOC2012/JPEGImages/2010_003203.jpg 500 400 17 1 299 111 341 3 324 68 500 240 15 138 185 209 368 +13662 /data/VOCdevkit/VOC2012/JPEGImages/2010_003204.jpg 500 375 11 154 64 493 305 11 18 47 233 322 +13663 /data/VOCdevkit/VOC2012/JPEGImages/2010_003206.jpg 500 375 6 1 50 154 155 6 18 60 488 348 +13664 /data/VOCdevkit/VOC2012/JPEGImages/2010_003207.jpg 500 375 13 24 96 226 359 +13665 /data/VOCdevkit/VOC2012/JPEGImages/2010_003212.jpg 500 375 6 111 225 347 268 14 432 249 500 375 14 344 272 413 375 14 273 299 335 375 14 154 282 226 375 14 48 268 159 375 +13666 /data/VOCdevkit/VOC2012/JPEGImages/2010_003214.jpg 500 375 11 207 63 322 257 +13667 /data/VOCdevkit/VOC2012/JPEGImages/2010_003218.jpg 500 375 15 195 288 250 333 15 150 236 220 346 15 125 271 176 354 +13668 /data/VOCdevkit/VOC2012/JPEGImages/2010_003219.jpg 431 500 6 9 175 368 437 14 219 59 337 444 +13669 /data/VOCdevkit/VOC2012/JPEGImages/2010_003220.jpg 500 375 14 119 128 285 375 +13670 /data/VOCdevkit/VOC2012/JPEGImages/2010_003222.jpg 500 375 11 153 59 482 375 +13671 /data/VOCdevkit/VOC2012/JPEGImages/2010_003223.jpg 375 500 7 58 48 337 468 +13672 /data/VOCdevkit/VOC2012/JPEGImages/2010_003227.jpg 500 375 7 1 1 500 375 +13673 /data/VOCdevkit/VOC2012/JPEGImages/2010_003230.jpg 500 370 7 213 112 432 230 +13674 /data/VOCdevkit/VOC2012/JPEGImages/2010_003231.jpg 500 500 6 182 286 360 443 +13675 /data/VOCdevkit/VOC2012/JPEGImages/2010_003232.jpg 375 500 7 112 168 210 390 +13676 /data/VOCdevkit/VOC2012/JPEGImages/2010_003233.jpg 500 334 11 43 35 500 289 +13677 /data/VOCdevkit/VOC2012/JPEGImages/2010_003236.jpg 400 300 19 66 14 351 279 +13678 /data/VOCdevkit/VOC2012/JPEGImages/2010_003238.jpg 500 375 7 1 1 500 375 +13679 /data/VOCdevkit/VOC2012/JPEGImages/2010_003239.jpg 347 500 9 65 131 277 374 9 230 97 347 345 9 1 158 83 324 9 276 124 347 362 14 1 16 186 214 +13680 /data/VOCdevkit/VOC2012/JPEGImages/2010_003240.jpg 500 375 7 125 15 500 350 7 1 67 396 361 +13681 /data/VOCdevkit/VOC2012/JPEGImages/2010_003241.jpg 500 375 19 48 14 124 86 14 201 13 500 375 14 1 48 272 375 14 48 96 91 165 +13682 /data/VOCdevkit/VOC2012/JPEGImages/2010_003244.jpg 500 340 11 111 74 315 266 11 272 69 419 240 +13683 /data/VOCdevkit/VOC2012/JPEGImages/2010_003248.jpg 500 375 14 237 127 468 359 14 1 140 233 363 14 1 127 82 222 14 77 132 127 178 14 2 89 20 121 +13684 /data/VOCdevkit/VOC2012/JPEGImages/2010_003249.jpg 500 375 7 156 1 500 375 +13685 /data/VOCdevkit/VOC2012/JPEGImages/2010_003250.jpg 500 375 14 34 1 436 375 14 295 36 443 293 14 405 1 500 375 +13686 /data/VOCdevkit/VOC2012/JPEGImages/2010_003251.jpg 500 375 1 19 52 478 344 +13687 /data/VOCdevkit/VOC2012/JPEGImages/2010_003252.jpg 500 375 16 238 159 293 212 +13688 /data/VOCdevkit/VOC2012/JPEGImages/2010_003253.jpg 500 375 16 159 65 488 366 +13689 /data/VOCdevkit/VOC2012/JPEGImages/2010_003255.jpg 500 364 2 234 20 473 193 +13690 /data/VOCdevkit/VOC2012/JPEGImages/2010_003256.jpg 500 333 6 1 59 500 292 +13691 /data/VOCdevkit/VOC2012/JPEGImages/2010_003257.jpg 500 334 11 205 161 287 310 14 180 27 438 301 14 36 31 194 168 +13692 /data/VOCdevkit/VOC2012/JPEGImages/2010_003259.jpg 334 500 0 151 134 192 152 +13693 /data/VOCdevkit/VOC2012/JPEGImages/2010_003260.jpg 375 500 3 309 157 373 243 3 104 316 327 500 +13694 /data/VOCdevkit/VOC2012/JPEGImages/2010_003263.jpg 334 500 10 36 328 157 434 14 73 183 239 432 +13695 /data/VOCdevkit/VOC2012/JPEGImages/2010_003264.jpg 500 375 1 314 254 410 331 14 328 214 393 314 6 1 235 166 375 +13696 /data/VOCdevkit/VOC2012/JPEGImages/2010_003269.jpg 500 375 11 224 167 390 234 +13697 /data/VOCdevkit/VOC2012/JPEGImages/2010_003270.jpg 500 374 12 184 145 304 295 12 245 73 344 253 +13698 /data/VOCdevkit/VOC2012/JPEGImages/2010_003274.jpg 500 375 18 1 63 375 283 +13699 /data/VOCdevkit/VOC2012/JPEGImages/2010_003275.jpg 500 500 7 97 64 372 433 +13700 /data/VOCdevkit/VOC2012/JPEGImages/2010_003276.jpg 500 363 6 30 46 441 327 6 89 45 134 60 +13701 /data/VOCdevkit/VOC2012/JPEGImages/2010_003278.jpg 500 375 17 70 217 462 374 +13702 /data/VOCdevkit/VOC2012/JPEGImages/2010_003279.jpg 500 250 0 21 71 482 184 +13703 /data/VOCdevkit/VOC2012/JPEGImages/2010_003280.jpg 500 375 12 10 132 500 375 14 40 50 259 188 +13704 /data/VOCdevkit/VOC2012/JPEGImages/2010_003283.jpg 500 334 14 174 184 222 231 +13705 /data/VOCdevkit/VOC2012/JPEGImages/2010_003285.jpg 333 500 11 19 14 270 500 +13706 /data/VOCdevkit/VOC2012/JPEGImages/2010_003287.jpg 500 375 19 363 163 500 300 14 70 106 331 375 +13707 /data/VOCdevkit/VOC2012/JPEGImages/2010_003290.jpg 500 333 6 34 166 88 188 6 116 165 158 190 6 156 164 186 194 6 183 54 500 307 6 67 168 111 190 14 18 143 43 209 6 92 165 157 189 +13708 /data/VOCdevkit/VOC2012/JPEGImages/2010_003291.jpg 500 332 7 120 40 364 311 +13709 /data/VOCdevkit/VOC2012/JPEGImages/2010_003293.jpg 500 333 5 86 52 398 293 1 432 186 469 236 14 225 138 272 189 +13710 /data/VOCdevkit/VOC2012/JPEGImages/2010_003297.jpg 500 335 12 163 118 349 286 14 76 153 206 231 +13711 /data/VOCdevkit/VOC2012/JPEGImages/2010_003299.jpg 480 361 7 196 7 480 361 +13712 /data/VOCdevkit/VOC2012/JPEGImages/2010_003300.jpg 500 375 11 366 91 450 253 11 55 146 251 371 +13713 /data/VOCdevkit/VOC2012/JPEGImages/2010_003301.jpg 500 500 11 41 15 500 500 +13714 /data/VOCdevkit/VOC2012/JPEGImages/2010_003302.jpg 500 375 8 184 212 366 375 8 31 206 157 375 15 386 187 500 374 +13715 /data/VOCdevkit/VOC2012/JPEGImages/2010_003303.jpg 500 375 13 209 107 494 302 13 48 119 272 354 14 95 70 219 185 14 269 75 340 265 +13716 /data/VOCdevkit/VOC2012/JPEGImages/2010_003304.jpg 500 375 4 101 249 163 368 14 258 1 500 375 14 151 70 378 372 14 11 124 206 375 14 44 181 92 268 14 34 152 179 334 +13717 /data/VOCdevkit/VOC2012/JPEGImages/2010_003305.jpg 500 333 17 1 1 437 333 14 2 30 500 333 +13718 /data/VOCdevkit/VOC2012/JPEGImages/2010_003309.jpg 500 375 7 6 1 486 375 +13719 /data/VOCdevkit/VOC2012/JPEGImages/2010_003314.jpg 500 375 1 18 256 158 372 13 104 221 287 356 13 226 213 365 348 +13720 /data/VOCdevkit/VOC2012/JPEGImages/2010_003316.jpg 500 333 13 1 1 500 333 +13721 /data/VOCdevkit/VOC2012/JPEGImages/2010_003321.jpg 480 360 11 129 112 246 272 +13722 /data/VOCdevkit/VOC2012/JPEGImages/2010_003325.jpg 500 375 8 164 1 500 344 10 90 301 500 375 14 214 41 477 317 +13723 /data/VOCdevkit/VOC2012/JPEGImages/2010_003326.jpg 450 500 14 9 21 427 500 +13724 /data/VOCdevkit/VOC2012/JPEGImages/2010_003329.jpg 333 500 4 58 2 238 451 +13725 /data/VOCdevkit/VOC2012/JPEGImages/2010_003331.jpg 500 375 11 127 116 327 307 17 1 16 500 375 +13726 /data/VOCdevkit/VOC2012/JPEGImages/2010_003332.jpg 500 375 14 2 115 129 375 14 74 114 151 176 14 156 117 249 295 14 460 119 500 231 14 120 159 343 375 +13727 /data/VOCdevkit/VOC2012/JPEGImages/2010_003333.jpg 500 333 11 177 30 362 289 +13728 /data/VOCdevkit/VOC2012/JPEGImages/2010_003335.jpg 500 333 18 66 99 459 289 +13729 /data/VOCdevkit/VOC2012/JPEGImages/2010_003337.jpg 500 331 11 242 99 350 288 7 452 1 500 65 +13730 /data/VOCdevkit/VOC2012/JPEGImages/2010_003341.jpg 500 375 11 1 1 500 324 +13731 /data/VOCdevkit/VOC2012/JPEGImages/2010_003342.jpg 500 375 11 1 43 430 375 +13732 /data/VOCdevkit/VOC2012/JPEGImages/2010_003343.jpg 500 375 16 68 122 264 232 16 325 129 500 298 +13733 /data/VOCdevkit/VOC2012/JPEGImages/2010_003344.jpg 500 353 2 219 218 260 267 2 178 214 217 269 2 187 105 290 224 +13734 /data/VOCdevkit/VOC2012/JPEGImages/2010_003345.jpg 500 333 9 158 147 372 261 +13735 /data/VOCdevkit/VOC2012/JPEGImages/2010_003350.jpg 500 333 1 11 18 481 276 +13736 /data/VOCdevkit/VOC2012/JPEGImages/2010_003351.jpg 500 375 11 156 1 500 375 +13737 /data/VOCdevkit/VOC2012/JPEGImages/2010_003353.jpg 500 332 0 20 58 500 247 +13738 /data/VOCdevkit/VOC2012/JPEGImages/2010_003355.jpg 500 375 14 269 113 500 352 14 3 84 181 374 14 86 54 186 164 +13739 /data/VOCdevkit/VOC2012/JPEGImages/2010_003358.jpg 500 334 7 143 2 467 334 +13740 /data/VOCdevkit/VOC2012/JPEGImages/2010_003361.jpg 500 333 14 220 121 261 264 0 1 55 500 273 14 249 136 289 185 +13741 /data/VOCdevkit/VOC2012/JPEGImages/2010_003362.jpg 500 375 2 112 82 500 375 +13742 /data/VOCdevkit/VOC2012/JPEGImages/2010_003365.jpg 500 293 0 1 36 500 248 +13743 /data/VOCdevkit/VOC2012/JPEGImages/2010_003366.jpg 500 375 11 119 34 319 240 +13744 /data/VOCdevkit/VOC2012/JPEGImages/2010_003367.jpg 500 375 1 112 17 409 328 6 1 1 140 154 6 332 1 460 36 6 285 1 499 206 +13745 /data/VOCdevkit/VOC2012/JPEGImages/2010_003368.jpg 500 301 4 355 98 386 205 +13746 /data/VOCdevkit/VOC2012/JPEGImages/2010_003370.jpg 500 375 14 247 133 417 375 14 157 82 291 371 +13747 /data/VOCdevkit/VOC2012/JPEGImages/2010_003371.jpg 500 375 7 1 52 468 375 +13748 /data/VOCdevkit/VOC2012/JPEGImages/2010_003372.jpg 500 335 16 1 33 423 334 +13749 /data/VOCdevkit/VOC2012/JPEGImages/2010_003374.jpg 500 375 4 126 106 143 152 14 104 49 197 148 14 259 62 349 172 14 282 76 413 204 14 372 76 500 247 14 1 1 159 375 10 77 130 500 375 +13750 /data/VOCdevkit/VOC2012/JPEGImages/2010_003375.jpg 337 500 11 150 297 294 433 14 10 72 134 390 +13751 /data/VOCdevkit/VOC2012/JPEGImages/2010_003376.jpg 500 374 16 269 136 362 231 16 89 158 265 270 16 89 165 202 286 16 273 186 313 219 16 327 153 376 222 +13752 /data/VOCdevkit/VOC2012/JPEGImages/2010_003379.jpg 500 375 1 1 37 500 367 8 351 242 500 375 +13753 /data/VOCdevkit/VOC2012/JPEGImages/2010_003380.jpg 375 500 12 1 39 355 500 +13754 /data/VOCdevkit/VOC2012/JPEGImages/2010_003381.jpg 500 342 6 1 93 500 342 14 160 125 272 219 14 427 146 487 212 14 350 7 445 151 14 195 44 243 96 14 71 34 136 174 +13755 /data/VOCdevkit/VOC2012/JPEGImages/2010_003383.jpg 500 332 9 234 1 499 311 9 58 1 314 294 9 1 5 159 266 +13756 /data/VOCdevkit/VOC2012/JPEGImages/2010_003384.jpg 500 374 18 1 44 383 324 +13757 /data/VOCdevkit/VOC2012/JPEGImages/2010_003385.jpg 500 332 6 1 1 488 314 +13758 /data/VOCdevkit/VOC2012/JPEGImages/2010_003390.jpg 500 500 15 2 1 500 500 +13759 /data/VOCdevkit/VOC2012/JPEGImages/2010_003391.jpg 500 333 11 37 93 423 308 +13760 /data/VOCdevkit/VOC2012/JPEGImages/2010_003395.jpg 375 500 2 99 201 177 336 +13761 /data/VOCdevkit/VOC2012/JPEGImages/2010_003397.jpg 500 375 11 1 20 483 374 +13762 /data/VOCdevkit/VOC2012/JPEGImages/2010_003398.jpg 500 375 8 107 45 298 375 +13763 /data/VOCdevkit/VOC2012/JPEGImages/2010_003400.jpg 500 375 6 39 71 466 254 +13764 /data/VOCdevkit/VOC2012/JPEGImages/2010_003401.jpg 500 333 17 72 198 500 333 8 112 211 275 333 14 1 112 279 333 +13765 /data/VOCdevkit/VOC2012/JPEGImages/2010_003402.jpg 500 375 7 1 55 443 359 +13766 /data/VOCdevkit/VOC2012/JPEGImages/2010_003405.jpg 375 500 19 81 9 280 477 +13767 /data/VOCdevkit/VOC2012/JPEGImages/2010_003406.jpg 500 375 11 242 104 320 270 +13768 /data/VOCdevkit/VOC2012/JPEGImages/2010_003409.jpg 500 375 8 425 218 457 271 14 234 169 287 338 14 147 185 223 295 8 271 232 320 312 8 215 226 243 310 +13769 /data/VOCdevkit/VOC2012/JPEGImages/2010_003411.jpg 500 333 11 87 35 286 333 +13770 /data/VOCdevkit/VOC2012/JPEGImages/2010_003415.jpg 336 500 6 1 169 336 461 14 143 211 263 279 14 166 213 224 270 +13771 /data/VOCdevkit/VOC2012/JPEGImages/2010_003418.jpg 500 375 2 158 32 322 267 +13772 /data/VOCdevkit/VOC2012/JPEGImages/2010_003419.jpg 500 335 2 1 9 500 334 +13773 /data/VOCdevkit/VOC2012/JPEGImages/2010_003421.jpg 500 375 7 63 111 331 375 +13774 /data/VOCdevkit/VOC2012/JPEGImages/2010_003427.jpg 500 375 7 54 1 457 269 +13775 /data/VOCdevkit/VOC2012/JPEGImages/2010_003429.jpg 500 332 16 93 21 418 332 +13776 /data/VOCdevkit/VOC2012/JPEGImages/2010_003432.jpg 320 240 13 1 29 64 134 13 56 23 278 207 6 195 1 320 39 6 14 1 99 19 +13777 /data/VOCdevkit/VOC2012/JPEGImages/2010_003435.jpg 500 375 7 1 1 499 375 +13778 /data/VOCdevkit/VOC2012/JPEGImages/2010_003436.jpg 500 375 11 293 47 475 270 11 123 33 312 313 +13779 /data/VOCdevkit/VOC2012/JPEGImages/2010_003437.jpg 500 400 19 115 101 353 316 14 173 171 214 250 +13780 /data/VOCdevkit/VOC2012/JPEGImages/2010_003439.jpg 500 331 11 212 21 480 331 +13781 /data/VOCdevkit/VOC2012/JPEGImages/2010_003446.jpg 500 375 14 187 111 274 232 1 160 164 345 261 6 16 105 121 182 6 96 103 243 173 6 203 104 277 161 +13782 /data/VOCdevkit/VOC2012/JPEGImages/2010_003450.jpg 500 375 6 1 1 500 240 +13783 /data/VOCdevkit/VOC2012/JPEGImages/2010_003451.jpg 500 375 7 116 165 365 373 7 136 19 266 94 17 1 15 500 375 +13784 /data/VOCdevkit/VOC2012/JPEGImages/2010_003453.jpg 500 323 6 30 42 470 318 +13785 /data/VOCdevkit/VOC2012/JPEGImages/2010_003458.jpg 500 401 0 64 60 467 358 +13786 /data/VOCdevkit/VOC2012/JPEGImages/2010_003461.jpg 500 375 19 226 117 401 299 14 21 26 494 375 +13787 /data/VOCdevkit/VOC2012/JPEGImages/2010_003465.jpg 500 375 11 173 157 341 283 +13788 /data/VOCdevkit/VOC2012/JPEGImages/2010_003467.jpg 375 500 7 1 1 314 432 +13789 /data/VOCdevkit/VOC2012/JPEGImages/2010_003468.jpg 375 500 4 178 83 283 485 7 37 60 209 397 +13790 /data/VOCdevkit/VOC2012/JPEGImages/2010_003469.jpg 500 332 14 133 10 289 257 13 56 91 433 315 +13791 /data/VOCdevkit/VOC2012/JPEGImages/2010_003470.jpg 500 375 14 428 122 466 212 18 272 79 500 235 +13792 /data/VOCdevkit/VOC2012/JPEGImages/2010_003473.jpg 500 356 2 125 28 345 324 +13793 /data/VOCdevkit/VOC2012/JPEGImages/2010_003474.jpg 500 333 0 13 124 483 246 +13794 /data/VOCdevkit/VOC2012/JPEGImages/2010_003477.jpg 375 500 11 132 201 311 500 +13795 /data/VOCdevkit/VOC2012/JPEGImages/2010_003478.jpg 500 375 6 38 66 476 337 +13796 /data/VOCdevkit/VOC2012/JPEGImages/2010_003479.jpg 339 500 11 1 1 210 500 11 201 215 339 500 +13797 /data/VOCdevkit/VOC2012/JPEGImages/2010_003481.jpg 500 333 7 327 192 500 332 6 9 1 500 285 +13798 /data/VOCdevkit/VOC2012/JPEGImages/2010_003482.jpg 500 375 18 174 118 383 245 +13799 /data/VOCdevkit/VOC2012/JPEGImages/2010_003483.jpg 500 379 7 24 63 436 354 +13800 /data/VOCdevkit/VOC2012/JPEGImages/2010_003488.jpg 500 488 7 39 23 470 449 +13801 /data/VOCdevkit/VOC2012/JPEGImages/2010_003490.jpg 500 375 12 189 145 314 240 +13802 /data/VOCdevkit/VOC2012/JPEGImages/2010_003491.jpg 500 375 16 143 276 286 358 +13803 /data/VOCdevkit/VOC2012/JPEGImages/2010_003493.jpg 500 374 11 83 1 473 373 +13804 /data/VOCdevkit/VOC2012/JPEGImages/2010_003495.jpg 500 333 0 80 10 441 289 +13805 /data/VOCdevkit/VOC2012/JPEGImages/2010_003496.jpg 500 333 0 1 105 278 194 0 1 27 500 332 +13806 /data/VOCdevkit/VOC2012/JPEGImages/2010_003497.jpg 500 375 7 231 113 387 331 7 137 108 271 246 +13807 /data/VOCdevkit/VOC2012/JPEGImages/2010_003503.jpg 500 375 2 188 78 363 236 1 1 64 499 375 +13808 /data/VOCdevkit/VOC2012/JPEGImages/2010_003506.jpg 500 397 11 124 116 471 386 +13809 /data/VOCdevkit/VOC2012/JPEGImages/2010_003507.jpg 500 249 9 383 118 489 242 9 9 125 65 213 9 114 123 186 225 9 294 113 358 217 9 215 123 300 237 +13810 /data/VOCdevkit/VOC2012/JPEGImages/2010_003508.jpg 500 334 14 351 219 371 270 14 306 234 347 270 3 121 109 309 271 +13811 /data/VOCdevkit/VOC2012/JPEGImages/2010_003509.jpg 500 332 7 2 1 500 332 +13812 /data/VOCdevkit/VOC2012/JPEGImages/2010_003512.jpg 500 313 4 103 140 496 250 +13813 /data/VOCdevkit/VOC2012/JPEGImages/2010_003513.jpg 376 500 11 72 18 295 477 +13814 /data/VOCdevkit/VOC2012/JPEGImages/2010_003514.jpg 375 500 18 1 7 336 245 +13815 /data/VOCdevkit/VOC2012/JPEGImages/2010_003520.jpg 375 500 10 88 399 294 500 8 281 447 375 500 8 21 392 127 500 8 103 372 186 491 +13816 /data/VOCdevkit/VOC2012/JPEGImages/2010_003522.jpg 500 375 11 150 100 450 375 +13817 /data/VOCdevkit/VOC2012/JPEGImages/2010_003526.jpg 500 375 14 2 156 284 375 2 115 130 339 375 +13818 /data/VOCdevkit/VOC2012/JPEGImages/2010_003527.jpg 500 333 7 107 22 379 304 +13819 /data/VOCdevkit/VOC2012/JPEGImages/2010_003529.jpg 500 375 13 1 1 432 375 +13820 /data/VOCdevkit/VOC2012/JPEGImages/2010_003531.jpg 500 375 10 44 237 500 374 8 298 268 401 375 8 164 251 302 374 8 88 245 176 374 8 64 221 118 375 8 223 218 277 259 8 297 221 352 271 8 385 227 458 277 +13821 /data/VOCdevkit/VOC2012/JPEGImages/2010_003532.jpg 500 375 12 66 41 432 364 12 10 19 147 211 +13822 /data/VOCdevkit/VOC2012/JPEGImages/2010_003534.jpg 500 428 5 58 76 450 258 +13823 /data/VOCdevkit/VOC2012/JPEGImages/2010_003535.jpg 500 375 11 78 141 263 261 8 1 1 500 375 8 165 1 500 285 +13824 /data/VOCdevkit/VOC2012/JPEGImages/2010_003537.jpg 500 374 6 10 34 458 333 14 292 52 401 321 +13825 /data/VOCdevkit/VOC2012/JPEGImages/2010_003538.jpg 334 500 14 29 41 224 500 14 160 49 334 500 8 1 165 172 460 4 180 128 216 233 8 1 305 57 454 +13826 /data/VOCdevkit/VOC2012/JPEGImages/2010_003539.jpg 487 500 7 81 24 448 487 4 442 191 464 268 +13827 /data/VOCdevkit/VOC2012/JPEGImages/2010_003540.jpg 500 375 8 437 196 470 245 8 452 196 495 264 14 348 162 408 220 14 280 163 345 220 14 226 166 273 219 14 175 160 227 222 14 118 162 175 220 +13828 /data/VOCdevkit/VOC2012/JPEGImages/2010_003541.jpg 500 338 16 1 56 314 338 +13829 /data/VOCdevkit/VOC2012/JPEGImages/2010_003546.jpg 500 375 2 122 128 333 375 +13830 /data/VOCdevkit/VOC2012/JPEGImages/2010_003547.jpg 500 375 3 163 161 500 259 +13831 /data/VOCdevkit/VOC2012/JPEGImages/2010_003549.jpg 500 324 14 34 171 93 214 2 412 217 447 276 +13832 /data/VOCdevkit/VOC2012/JPEGImages/2010_003551.jpg 500 333 7 186 99 364 213 +13833 /data/VOCdevkit/VOC2012/JPEGImages/2010_003554.jpg 500 375 11 106 47 390 350 +13834 /data/VOCdevkit/VOC2012/JPEGImages/2010_003556.jpg 500 486 17 1 108 328 401 14 191 1 342 287 15 28 93 162 428 +13835 /data/VOCdevkit/VOC2012/JPEGImages/2010_003559.jpg 500 333 0 99 148 461 266 +13836 /data/VOCdevkit/VOC2012/JPEGImages/2010_003560.jpg 470 317 11 90 98 313 311 14 26 147 470 317 +13837 /data/VOCdevkit/VOC2012/JPEGImages/2010_003561.jpg 333 500 6 30 119 331 391 +13838 /data/VOCdevkit/VOC2012/JPEGImages/2010_003562.jpg 500 331 5 66 65 472 279 6 3 171 36 197 +13839 /data/VOCdevkit/VOC2012/JPEGImages/2010_003563.jpg 333 500 8 32 174 271 500 14 84 111 297 474 +13840 /data/VOCdevkit/VOC2012/JPEGImages/2010_003567.jpg 500 375 16 96 150 500 375 16 284 286 474 375 14 1 240 63 375 +13841 /data/VOCdevkit/VOC2012/JPEGImages/2010_003568.jpg 500 500 11 59 184 374 451 +13842 /data/VOCdevkit/VOC2012/JPEGImages/2010_003569.jpg 500 375 7 46 64 422 309 +13843 /data/VOCdevkit/VOC2012/JPEGImages/2010_003573.jpg 335 500 12 46 95 335 472 14 50 101 133 229 +13844 /data/VOCdevkit/VOC2012/JPEGImages/2010_003574.jpg 500 375 6 131 79 229 155 6 172 77 476 295 +13845 /data/VOCdevkit/VOC2012/JPEGImages/2010_003576.jpg 500 334 12 295 87 456 334 12 68 95 312 288 +13846 /data/VOCdevkit/VOC2012/JPEGImages/2010_003579.jpg 375 500 7 172 34 309 132 7 1 296 157 500 8 1 1 375 419 +13847 /data/VOCdevkit/VOC2012/JPEGImages/2010_003582.jpg 500 375 11 132 91 370 367 +13848 /data/VOCdevkit/VOC2012/JPEGImages/2010_003585.jpg 500 375 6 4 39 151 102 6 139 58 279 107 14 138 134 241 292 14 245 93 348 290 1 340 229 500 301 +13849 /data/VOCdevkit/VOC2012/JPEGImages/2010_003588.jpg 430 288 11 112 24 322 187 +13850 /data/VOCdevkit/VOC2012/JPEGImages/2010_003592.jpg 500 331 0 198 119 284 172 +13851 /data/VOCdevkit/VOC2012/JPEGImages/2010_003594.jpg 500 375 10 1 30 500 373 +13852 /data/VOCdevkit/VOC2012/JPEGImages/2010_003597.jpg 500 375 10 51 221 322 375 10 447 201 500 309 17 1 180 442 375 4 181 233 201 290 14 123 139 201 231 14 292 151 373 315 14 251 124 376 256 14 196 137 257 234 15 1 39 88 197 +13853 /data/VOCdevkit/VOC2012/JPEGImages/2010_003598.jpg 350 500 7 118 250 339 423 +13854 /data/VOCdevkit/VOC2012/JPEGImages/2010_003599.jpg 500 368 14 132 162 230 274 14 174 182 244 276 14 218 147 322 271 3 90 203 453 317 +13855 /data/VOCdevkit/VOC2012/JPEGImages/2010_003601.jpg 500 375 18 179 207 486 233 +13856 /data/VOCdevkit/VOC2012/JPEGImages/2010_003603.jpg 332 500 1 38 344 227 500 4 145 414 176 450 14 42 160 224 500 +13857 /data/VOCdevkit/VOC2012/JPEGImages/2010_003604.jpg 375 500 3 74 1 375 498 +13858 /data/VOCdevkit/VOC2012/JPEGImages/2010_003605.jpg 500 333 13 49 5 457 333 +13859 /data/VOCdevkit/VOC2012/JPEGImages/2010_003608.jpg 500 375 13 119 138 499 375 14 1 75 285 375 +13860 /data/VOCdevkit/VOC2012/JPEGImages/2010_003609.jpg 500 375 18 32 91 403 303 +13861 /data/VOCdevkit/VOC2012/JPEGImages/2010_003610.jpg 500 297 2 78 87 137 150 +13862 /data/VOCdevkit/VOC2012/JPEGImages/2010_003612.jpg 500 332 6 27 81 478 282 14 49 91 75 156 14 70 95 100 152 14 94 106 107 148 14 1 89 30 190 +13863 /data/VOCdevkit/VOC2012/JPEGImages/2010_003613.jpg 500 265 17 1 1 500 265 14 67 45 455 226 +13864 /data/VOCdevkit/VOC2012/JPEGImages/2010_003618.jpg 334 500 14 60 1 257 500 +13865 /data/VOCdevkit/VOC2012/JPEGImages/2010_003625.jpg 340 500 10 1 358 340 500 4 215 142 340 500 14 66 166 272 371 +13866 /data/VOCdevkit/VOC2012/JPEGImages/2010_003628.jpg 500 339 14 459 25 500 295 14 362 79 419 260 14 261 77 329 252 14 76 79 125 247 18 57 64 438 236 +13867 /data/VOCdevkit/VOC2012/JPEGImages/2010_003629.jpg 500 375 11 131 1 365 375 +13868 /data/VOCdevkit/VOC2012/JPEGImages/2010_003630.jpg 500 375 14 327 139 341 171 14 239 116 316 350 14 186 153 248 340 18 1 1 328 284 +13869 /data/VOCdevkit/VOC2012/JPEGImages/2010_003632.jpg 500 375 8 454 254 500 300 8 444 310 500 375 14 78 38 235 375 14 189 31 363 375 14 186 34 456 375 14 16 213 79 290 +13870 /data/VOCdevkit/VOC2012/JPEGImages/2010_003634.jpg 375 500 8 86 223 230 420 +13871 /data/VOCdevkit/VOC2012/JPEGImages/2010_003635.jpg 500 335 13 38 32 440 273 6 1 27 162 151 5 150 1 478 123 +13872 /data/VOCdevkit/VOC2012/JPEGImages/2010_003640.jpg 354 500 3 14 49 332 473 +13873 /data/VOCdevkit/VOC2012/JPEGImages/2010_003641.jpg 500 333 7 5 1 342 327 +13874 /data/VOCdevkit/VOC2012/JPEGImages/2010_003643.jpg 500 375 11 203 98 405 332 14 62 1 421 375 +13875 /data/VOCdevkit/VOC2012/JPEGImages/2010_003644.jpg 500 216 3 176 106 306 162 3 1 46 207 166 +13876 /data/VOCdevkit/VOC2012/JPEGImages/2010_003645.jpg 500 375 12 196 166 287 254 14 224 140 258 214 6 63 163 206 217 +13877 /data/VOCdevkit/VOC2012/JPEGImages/2010_003648.jpg 500 375 2 196 81 378 293 +13878 /data/VOCdevkit/VOC2012/JPEGImages/2010_003649.jpg 500 375 14 247 131 407 375 14 141 139 268 375 14 204 149 271 315 14 1 191 29 292 14 6 176 17 204 14 83 179 95 206 14 98 184 106 208 14 15 180 31 238 14 412 308 427 341 +13879 /data/VOCdevkit/VOC2012/JPEGImages/2010_003651.jpg 333 500 15 28 21 314 458 +13880 /data/VOCdevkit/VOC2012/JPEGImages/2010_003653.jpg 375 500 11 24 108 292 460 +13881 /data/VOCdevkit/VOC2012/JPEGImages/2010_003655.jpg 500 375 0 1 1 500 236 +13882 /data/VOCdevkit/VOC2012/JPEGImages/2010_003656.jpg 373 500 6 69 343 226 459 +13883 /data/VOCdevkit/VOC2012/JPEGImages/2010_003659.jpg 375 500 2 97 245 205 290 +13884 /data/VOCdevkit/VOC2012/JPEGImages/2010_003664.jpg 500 333 6 365 36 435 63 6 198 44 344 96 6 52 81 500 262 14 186 108 225 144 +13885 /data/VOCdevkit/VOC2012/JPEGImages/2010_003665.jpg 500 375 7 62 92 467 309 +13886 /data/VOCdevkit/VOC2012/JPEGImages/2010_003667.jpg 500 368 15 154 41 262 193 15 380 40 498 183 +13887 /data/VOCdevkit/VOC2012/JPEGImages/2010_003670.jpg 500 375 16 175 161 231 224 11 228 192 301 232 14 88 124 133 230 14 107 96 184 296 +13888 /data/VOCdevkit/VOC2012/JPEGImages/2010_003671.jpg 279 500 1 61 275 190 418 14 91 179 210 407 14 14 232 51 318 14 88 222 116 322 14 190 223 225 333 14 237 233 279 309 14 210 221 240 329 14 40 238 56 301 +13889 /data/VOCdevkit/VOC2012/JPEGImages/2010_003672.jpg 500 375 7 74 125 419 338 +13890 /data/VOCdevkit/VOC2012/JPEGImages/2010_003673.jpg 375 500 11 27 204 375 500 14 1 65 219 500 +13891 /data/VOCdevkit/VOC2012/JPEGImages/2010_003674.jpg 500 388 15 55 69 127 122 15 186 70 257 117 19 333 233 486 340 14 332 60 484 374 +13892 /data/VOCdevkit/VOC2012/JPEGImages/2010_003675.jpg 500 375 7 9 61 500 374 +13893 /data/VOCdevkit/VOC2012/JPEGImages/2010_003677.jpg 375 500 8 1 1 375 500 14 38 94 271 500 +13894 /data/VOCdevkit/VOC2012/JPEGImages/2010_003679.jpg 500 292 3 260 132 473 229 3 220 139 334 226 3 25 109 285 207 +13895 /data/VOCdevkit/VOC2012/JPEGImages/2010_003680.jpg 500 333 0 150 34 365 281 +13896 /data/VOCdevkit/VOC2012/JPEGImages/2010_003686.jpg 500 332 0 27 76 481 246 0 2 198 88 232 +13897 /data/VOCdevkit/VOC2012/JPEGImages/2010_003687.jpg 500 375 7 226 172 374 268 +13898 /data/VOCdevkit/VOC2012/JPEGImages/2010_003688.jpg 500 326 19 125 4 399 202 +13899 /data/VOCdevkit/VOC2012/JPEGImages/2010_003689.jpg 500 492 1 143 323 294 418 14 5 296 23 335 +13900 /data/VOCdevkit/VOC2012/JPEGImages/2010_003690.jpg 500 375 11 225 135 375 285 +13901 /data/VOCdevkit/VOC2012/JPEGImages/2010_003695.jpg 500 334 13 34 91 480 281 14 166 42 369 279 +13902 /data/VOCdevkit/VOC2012/JPEGImages/2010_003696.jpg 500 274 7 18 1 500 144 +13903 /data/VOCdevkit/VOC2012/JPEGImages/2010_003701.jpg 500 364 1 262 191 373 314 +13904 /data/VOCdevkit/VOC2012/JPEGImages/2010_003703.jpg 333 500 14 26 163 102 327 14 47 203 157 352 1 107 321 236 427 +13905 /data/VOCdevkit/VOC2012/JPEGImages/2010_003708.jpg 500 375 18 304 130 352 163 18 323 135 356 171 18 237 136 274 168 +13906 /data/VOCdevkit/VOC2012/JPEGImages/2010_003709.jpg 500 333 11 102 39 500 333 +13907 /data/VOCdevkit/VOC2012/JPEGImages/2010_003714.jpg 500 300 12 61 6 199 236 +13908 /data/VOCdevkit/VOC2012/JPEGImages/2010_003716.jpg 500 339 0 1 102 500 229 +13909 /data/VOCdevkit/VOC2012/JPEGImages/2010_003717.jpg 500 375 17 34 1 498 242 4 432 305 500 332 +13910 /data/VOCdevkit/VOC2012/JPEGImages/2010_003719.jpg 500 375 8 383 153 500 368 8 1 164 140 373 19 300 51 360 108 19 147 41 218 119 14 150 14 312 338 14 1 32 162 350 14 357 31 500 298 +13911 /data/VOCdevkit/VOC2012/JPEGImages/2010_003721.jpg 500 396 11 207 38 451 386 +13912 /data/VOCdevkit/VOC2012/JPEGImages/2010_003723.jpg 500 375 0 64 52 462 259 +13913 /data/VOCdevkit/VOC2012/JPEGImages/2010_003724.jpg 419 500 14 1 94 419 500 2 210 89 370 310 +13914 /data/VOCdevkit/VOC2012/JPEGImages/2010_003725.jpg 500 333 16 33 1 439 333 +13915 /data/VOCdevkit/VOC2012/JPEGImages/2010_003728.jpg 500 375 19 197 95 288 179 15 162 87 311 265 15 267 197 423 310 8 351 208 473 303 +13916 /data/VOCdevkit/VOC2012/JPEGImages/2010_003729.jpg 500 375 6 169 21 486 314 1 3 121 156 240 14 72 73 124 218 15 375 252 463 375 15 438 251 491 375 +13917 /data/VOCdevkit/VOC2012/JPEGImages/2010_003730.jpg 500 297 6 29 94 448 266 +13918 /data/VOCdevkit/VOC2012/JPEGImages/2010_003731.jpg 500 375 14 3 115 186 375 14 72 151 228 375 14 236 158 457 375 14 256 185 500 375 4 236 204 260 277 +13919 /data/VOCdevkit/VOC2012/JPEGImages/2010_003734.jpg 500 375 11 229 105 326 311 6 1 1 500 375 6 48 121 132 155 +13920 /data/VOCdevkit/VOC2012/JPEGImages/2010_003735.jpg 500 375 11 91 49 492 375 +13921 /data/VOCdevkit/VOC2012/JPEGImages/2010_003736.jpg 500 375 13 1 13 459 375 +13922 /data/VOCdevkit/VOC2012/JPEGImages/2010_003737.jpg 500 333 0 68 135 487 251 +13923 /data/VOCdevkit/VOC2012/JPEGImages/2010_003742.jpg 500 375 16 73 1 453 231 11 160 131 239 303 +13924 /data/VOCdevkit/VOC2012/JPEGImages/2010_003743.jpg 500 375 2 80 14 362 358 +13925 /data/VOCdevkit/VOC2012/JPEGImages/2010_003744.jpg 500 375 14 283 265 401 375 +13926 /data/VOCdevkit/VOC2012/JPEGImages/2010_003745.jpg 500 375 13 69 57 472 325 13 71 10 315 199 +13927 /data/VOCdevkit/VOC2012/JPEGImages/2010_003746.jpg 375 500 11 33 73 375 500 6 1 85 143 179 +13928 /data/VOCdevkit/VOC2012/JPEGImages/2010_003747.jpg 500 375 7 38 1 408 282 +13929 /data/VOCdevkit/VOC2012/JPEGImages/2010_003752.jpg 500 333 7 194 90 500 298 14 1 1 500 333 +13930 /data/VOCdevkit/VOC2012/JPEGImages/2010_003754.jpg 500 375 16 305 164 389 294 16 206 164 318 278 +13931 /data/VOCdevkit/VOC2012/JPEGImages/2010_003755.jpg 375 500 14 11 73 375 500 14 124 191 367 500 +13932 /data/VOCdevkit/VOC2012/JPEGImages/2010_003757.jpg 500 333 3 46 2 500 333 3 178 67 253 92 +13933 /data/VOCdevkit/VOC2012/JPEGImages/2010_003758.jpg 500 335 7 149 33 351 223 +13934 /data/VOCdevkit/VOC2012/JPEGImages/2010_003761.jpg 500 375 16 401 37 500 202 16 118 19 357 202 16 117 95 323 328 +13935 /data/VOCdevkit/VOC2012/JPEGImages/2010_003762.jpg 500 359 10 1 142 500 359 4 101 24 161 205 4 163 33 222 201 +13936 /data/VOCdevkit/VOC2012/JPEGImages/2010_003764.jpg 500 332 7 149 33 500 256 +13937 /data/VOCdevkit/VOC2012/JPEGImages/2010_003768.jpg 500 295 6 152 163 334 208 6 1 76 40 100 +13938 /data/VOCdevkit/VOC2012/JPEGImages/2010_003770.jpg 500 333 19 384 139 468 207 +13939 /data/VOCdevkit/VOC2012/JPEGImages/2010_003771.jpg 500 375 2 175 84 365 332 +13940 /data/VOCdevkit/VOC2012/JPEGImages/2010_003772.jpg 500 375 5 36 138 326 277 +13941 /data/VOCdevkit/VOC2012/JPEGImages/2010_003773.jpg 375 500 7 1 1 374 500 +13942 /data/VOCdevkit/VOC2012/JPEGImages/2010_003774.jpg 500 325 16 298 84 482 295 16 283 39 495 147 16 192 6 316 111 16 146 62 306 290 16 2 93 172 325 16 1 1 65 96 +13943 /data/VOCdevkit/VOC2012/JPEGImages/2010_003779.jpg 281 500 4 84 1 217 488 +13944 /data/VOCdevkit/VOC2012/JPEGImages/2010_003781.jpg 500 375 7 11 95 259 264 15 211 24 289 109 15 272 57 359 133 15 346 1 454 149 4 8 18 62 166 +13945 /data/VOCdevkit/VOC2012/JPEGImages/2010_003784.jpg 500 375 11 297 77 422 319 11 46 82 184 276 +13946 /data/VOCdevkit/VOC2012/JPEGImages/2010_003788.jpg 500 341 18 63 147 334 292 +13947 /data/VOCdevkit/VOC2012/JPEGImages/2010_003789.jpg 500 375 6 1 1 497 373 +13948 /data/VOCdevkit/VOC2012/JPEGImages/2010_003791.jpg 375 500 11 1 75 338 465 +13949 /data/VOCdevkit/VOC2012/JPEGImages/2010_003792.jpg 500 333 16 33 115 125 174 16 66 150 178 222 16 64 166 186 242 16 330 170 441 250 +13950 /data/VOCdevkit/VOC2012/JPEGImages/2010_003798.jpg 500 375 0 6 118 494 313 +13951 /data/VOCdevkit/VOC2012/JPEGImages/2010_003799.jpg 500 375 1 111 13 442 365 +13952 /data/VOCdevkit/VOC2012/JPEGImages/2010_003800.jpg 500 375 7 213 123 500 341 +13953 /data/VOCdevkit/VOC2012/JPEGImages/2010_003801.jpg 500 375 0 1 103 464 304 0 167 1 500 203 +13954 /data/VOCdevkit/VOC2012/JPEGImages/2010_003804.jpg 500 375 17 172 213 347 320 14 218 17 281 201 +13955 /data/VOCdevkit/VOC2012/JPEGImages/2010_003805.jpg 340 500 7 1 187 340 500 7 1 15 340 249 +13956 /data/VOCdevkit/VOC2012/JPEGImages/2010_003806.jpg 500 375 16 45 122 244 303 +13957 /data/VOCdevkit/VOC2012/JPEGImages/2010_003807.jpg 333 500 6 12 154 333 472 +13958 /data/VOCdevkit/VOC2012/JPEGImages/2010_003811.jpg 500 316 14 416 45 448 140 14 382 56 421 90 1 40 33 431 283 +13959 /data/VOCdevkit/VOC2012/JPEGImages/2010_003813.jpg 500 375 6 33 130 480 336 +13960 /data/VOCdevkit/VOC2012/JPEGImages/2010_003815.jpg 500 333 3 29 134 469 241 +13961 /data/VOCdevkit/VOC2012/JPEGImages/2010_003816.jpg 500 192 0 4 27 498 155 +13962 /data/VOCdevkit/VOC2012/JPEGImages/2010_003818.jpg 500 375 7 110 52 500 374 +13963 /data/VOCdevkit/VOC2012/JPEGImages/2010_003820.jpg 400 322 2 95 110 200 172 +13964 /data/VOCdevkit/VOC2012/JPEGImages/2010_003821.jpg 500 333 9 133 1 500 298 9 1 166 129 280 +13965 /data/VOCdevkit/VOC2012/JPEGImages/2010_003822.jpg 500 375 11 138 336 228 374 8 73 257 150 355 10 93 252 262 375 17 321 209 408 260 8 174 245 238 336 +13966 /data/VOCdevkit/VOC2012/JPEGImages/2010_003823.jpg 500 333 7 63 121 466 246 +13967 /data/VOCdevkit/VOC2012/JPEGImages/2010_003825.jpg 500 333 14 182 203 202 235 +13968 /data/VOCdevkit/VOC2012/JPEGImages/2010_003826.jpg 500 375 11 163 36 401 375 +13969 /data/VOCdevkit/VOC2012/JPEGImages/2010_003828.jpg 500 333 4 17 262 35 315 1 47 138 347 330 +13970 /data/VOCdevkit/VOC2012/JPEGImages/2010_003837.jpg 500 409 11 49 40 500 291 +13971 /data/VOCdevkit/VOC2012/JPEGImages/2010_003844.jpg 500 349 19 147 9 415 200 14 248 54 391 181 +13972 /data/VOCdevkit/VOC2012/JPEGImages/2010_003845.jpg 500 375 7 308 204 392 285 +13973 /data/VOCdevkit/VOC2012/JPEGImages/2010_003847.jpg 500 375 18 1 73 500 238 +13974 /data/VOCdevkit/VOC2012/JPEGImages/2010_003848.jpg 500 332 3 254 252 322 301 +13975 /data/VOCdevkit/VOC2012/JPEGImages/2010_003852.jpg 500 375 11 68 76 217 345 11 244 52 425 358 +13976 /data/VOCdevkit/VOC2012/JPEGImages/2010_003854.jpg 500 333 6 1 33 403 333 14 341 6 374 94 +13977 /data/VOCdevkit/VOC2012/JPEGImages/2010_003855.jpg 376 500 5 3 163 335 440 +13978 /data/VOCdevkit/VOC2012/JPEGImages/2010_003856.jpg 500 375 14 12 130 55 213 14 68 125 101 218 13 180 170 460 336 +13979 /data/VOCdevkit/VOC2012/JPEGImages/2010_003857.jpg 500 375 19 40 21 470 360 +13980 /data/VOCdevkit/VOC2012/JPEGImages/2010_003859.jpg 500 333 11 207 201 321 240 14 282 55 339 238 14 114 137 207 237 +13981 /data/VOCdevkit/VOC2012/JPEGImages/2010_003860.jpg 500 333 3 1 1 235 202 +13982 /data/VOCdevkit/VOC2012/JPEGImages/2010_003861.jpg 500 375 7 429 183 497 219 8 357 111 500 302 14 38 159 375 226 17 1 119 361 316 15 380 64 405 122 +13983 /data/VOCdevkit/VOC2012/JPEGImages/2010_003863.jpg 500 375 7 116 1 466 374 +13984 /data/VOCdevkit/VOC2012/JPEGImages/2010_003864.jpg 500 335 17 25 131 199 279 19 291 103 359 170 15 178 111 210 156 10 94 98 218 155 +13985 /data/VOCdevkit/VOC2012/JPEGImages/2010_003865.jpg 500 375 16 13 1 467 375 +13986 /data/VOCdevkit/VOC2012/JPEGImages/2010_003871.jpg 500 375 14 410 70 500 375 14 140 111 425 375 +13987 /data/VOCdevkit/VOC2012/JPEGImages/2010_003874.jpg 500 333 19 1 1 130 296 +13988 /data/VOCdevkit/VOC2012/JPEGImages/2010_003875.jpg 500 375 7 44 36 453 339 +13989 /data/VOCdevkit/VOC2012/JPEGImages/2010_003877.jpg 500 394 5 204 178 303 282 6 134 188 166 270 14 314 176 335 237 14 326 173 344 236 14 121 190 148 289 14 145 180 165 217 +13990 /data/VOCdevkit/VOC2012/JPEGImages/2010_003878.jpg 500 338 3 12 229 406 303 14 81 192 140 270 14 152 214 210 267 14 255 180 319 260 +13991 /data/VOCdevkit/VOC2012/JPEGImages/2010_003879.jpg 500 333 11 44 15 428 333 +13992 /data/VOCdevkit/VOC2012/JPEGImages/2010_003884.jpg 375 500 11 7 208 375 500 14 1 12 277 500 +13993 /data/VOCdevkit/VOC2012/JPEGImages/2010_003887.jpg 500 375 7 194 195 486 317 7 33 43 209 253 +13994 /data/VOCdevkit/VOC2012/JPEGImages/2010_003890.jpg 500 375 12 54 62 410 331 +13995 /data/VOCdevkit/VOC2012/JPEGImages/2010_003891.jpg 336 396 11 2 1 329 396 +13996 /data/VOCdevkit/VOC2012/JPEGImages/2010_003892.jpg 500 375 14 226 97 245 130 14 347 100 377 135 14 389 30 483 91 19 192 46 233 84 19 27 52 174 164 +13997 /data/VOCdevkit/VOC2012/JPEGImages/2010_003893.jpg 500 375 5 1 139 448 314 6 1 247 126 348 +13998 /data/VOCdevkit/VOC2012/JPEGImages/2010_003894.jpg 500 403 11 185 273 355 403 11 72 76 230 287 14 39 28 197 403 14 252 3 469 403 8 308 137 496 403 +13999 /data/VOCdevkit/VOC2012/JPEGImages/2010_003897.jpg 500 333 10 1 129 500 333 +14000 /data/VOCdevkit/VOC2012/JPEGImages/2010_003898.jpg 500 375 7 1 78 364 342 +14001 /data/VOCdevkit/VOC2012/JPEGImages/2010_003899.jpg 500 375 3 96 24 450 306 3 303 293 407 329 +14002 /data/VOCdevkit/VOC2012/JPEGImages/2010_003900.jpg 500 375 18 29 139 366 236 +14003 /data/VOCdevkit/VOC2012/JPEGImages/2010_003906.jpg 500 327 1 89 175 181 298 1 192 171 293 282 14 197 89 293 239 14 86 95 171 265 14 98 77 147 132 +14004 /data/VOCdevkit/VOC2012/JPEGImages/2010_003910.jpg 500 375 15 1 1 483 375 +14005 /data/VOCdevkit/VOC2012/JPEGImages/2010_003911.jpg 500 375 3 101 231 145 289 3 145 228 188 290 +14006 /data/VOCdevkit/VOC2012/JPEGImages/2010_003912.jpg 400 500 1 70 39 312 416 4 189 154 215 208 +14007 /data/VOCdevkit/VOC2012/JPEGImages/2010_003914.jpg 375 500 1 216 273 346 500 14 43 173 206 500 4 48 229 74 301 +14008 /data/VOCdevkit/VOC2012/JPEGImages/2010_003915.jpg 500 425 0 215 134 382 282 +14009 /data/VOCdevkit/VOC2012/JPEGImages/2010_003919.jpg 500 375 16 254 146 321 254 16 143 198 288 255 +14010 /data/VOCdevkit/VOC2012/JPEGImages/2010_003920.jpg 476 488 11 1 6 417 488 +14011 /data/VOCdevkit/VOC2012/JPEGImages/2010_003925.jpg 500 353 7 141 121 419 272 +14012 /data/VOCdevkit/VOC2012/JPEGImages/2010_003928.jpg 500 375 7 1 65 448 288 +14013 /data/VOCdevkit/VOC2012/JPEGImages/2010_003929.jpg 500 329 2 200 100 321 190 +14014 /data/VOCdevkit/VOC2012/JPEGImages/2010_003931.jpg 500 335 6 1 149 500 277 +14015 /data/VOCdevkit/VOC2012/JPEGImages/2010_003933.jpg 500 334 0 4 67 500 284 +14016 /data/VOCdevkit/VOC2012/JPEGImages/2010_003936.jpg 500 329 5 50 26 404 284 14 397 151 444 280 +14017 /data/VOCdevkit/VOC2012/JPEGImages/2010_003937.jpg 500 375 7 191 74 313 271 +14018 /data/VOCdevkit/VOC2012/JPEGImages/2010_003938.jpg 500 375 11 63 87 500 232 +14019 /data/VOCdevkit/VOC2012/JPEGImages/2010_003939.jpg 500 375 16 241 137 299 245 +14020 /data/VOCdevkit/VOC2012/JPEGImages/2010_003942.jpg 500 375 19 165 37 457 237 19 1 44 160 229 +14021 /data/VOCdevkit/VOC2012/JPEGImages/2010_003943.jpg 500 372 7 156 15 289 238 +14022 /data/VOCdevkit/VOC2012/JPEGImages/2010_003944.jpg 500 375 14 414 117 469 248 14 448 113 500 344 18 1 1 436 375 +14023 /data/VOCdevkit/VOC2012/JPEGImages/2010_003945.jpg 500 333 0 39 119 493 252 +14024 /data/VOCdevkit/VOC2012/JPEGImages/2010_003947.jpg 500 324 13 11 48 490 301 +14025 /data/VOCdevkit/VOC2012/JPEGImages/2010_003949.jpg 500 500 14 334 95 492 500 14 1 59 118 500 14 101 101 253 495 +14026 /data/VOCdevkit/VOC2012/JPEGImages/2010_003950.jpg 384 288 7 73 1 363 288 +14027 /data/VOCdevkit/VOC2012/JPEGImages/2010_003954.jpg 500 319 16 23 81 289 307 +14028 /data/VOCdevkit/VOC2012/JPEGImages/2010_003955.jpg 375 500 14 19 175 231 500 +14029 /data/VOCdevkit/VOC2012/JPEGImages/2010_003956.jpg 500 375 18 221 124 405 290 +14030 /data/VOCdevkit/VOC2012/JPEGImages/2010_003957.jpg 500 375 14 70 52 353 374 8 220 1 500 375 +14031 /data/VOCdevkit/VOC2012/JPEGImages/2010_003958.jpg 419 500 11 28 73 343 388 +14032 /data/VOCdevkit/VOC2012/JPEGImages/2010_003961.jpg 500 375 11 271 1 500 372 14 1 1 311 375 +14033 /data/VOCdevkit/VOC2012/JPEGImages/2010_003966.jpg 500 375 7 1 1 489 366 +14034 /data/VOCdevkit/VOC2012/JPEGImages/2010_003970.jpg 500 375 9 1 7 391 375 9 115 175 452 374 +14035 /data/VOCdevkit/VOC2012/JPEGImages/2010_003971.jpg 411 500 7 93 107 276 299 8 9 141 286 500 10 136 223 411 500 +14036 /data/VOCdevkit/VOC2012/JPEGImages/2010_003974.jpg 500 375 7 52 1 489 375 +14037 /data/VOCdevkit/VOC2012/JPEGImages/2010_003976.jpg 500 375 7 133 45 366 375 8 351 138 500 276 10 1 220 500 374 +14038 /data/VOCdevkit/VOC2012/JPEGImages/2010_003980.jpg 500 375 11 109 3 407 344 +14039 /data/VOCdevkit/VOC2012/JPEGImages/2010_003981.jpg 500 334 6 1 41 152 187 6 52 15 446 314 +14040 /data/VOCdevkit/VOC2012/JPEGImages/2010_003982.jpg 375 500 7 55 220 315 398 +14041 /data/VOCdevkit/VOC2012/JPEGImages/2010_003983.jpg 500 375 0 1 12 473 375 14 122 163 198 375 14 237 123 329 375 14 340 209 420 297 14 423 209 469 259 14 399 203 430 252 14 403 221 453 281 +14042 /data/VOCdevkit/VOC2012/JPEGImages/2010_003987.jpg 500 375 11 106 54 397 355 +14043 /data/VOCdevkit/VOC2012/JPEGImages/2010_003988.jpg 500 375 7 173 98 421 257 +14044 /data/VOCdevkit/VOC2012/JPEGImages/2010_003994.jpg 500 333 4 373 70 458 332 4 209 66 302 333 4 28 59 131 333 4 163 76 220 293 +14045 /data/VOCdevkit/VOC2012/JPEGImages/2010_003995.jpg 500 333 14 60 1 407 333 +14046 /data/VOCdevkit/VOC2012/JPEGImages/2010_003996.jpg 500 333 16 254 142 478 324 16 160 79 372 292 14 49 31 167 143 14 52 43 167 333 +14047 /data/VOCdevkit/VOC2012/JPEGImages/2010_003999.jpg 500 400 11 280 196 449 344 +14048 /data/VOCdevkit/VOC2012/JPEGImages/2010_004002.jpg 500 375 11 15 86 305 375 7 363 37 500 252 +14049 /data/VOCdevkit/VOC2012/JPEGImages/2010_004005.jpg 500 375 6 311 113 500 312 6 1 119 159 301 +14050 /data/VOCdevkit/VOC2012/JPEGImages/2010_004006.jpg 500 400 3 158 30 477 226 +14051 /data/VOCdevkit/VOC2012/JPEGImages/2010_004007.jpg 500 332 7 99 94 363 282 7 99 36 310 314 7 128 99 276 212 +14052 /data/VOCdevkit/VOC2012/JPEGImages/2010_004008.jpg 375 500 7 52 37 375 500 +14053 /data/VOCdevkit/VOC2012/JPEGImages/2010_004009.jpg 375 500 19 114 125 253 271 19 95 302 227 413 +14054 /data/VOCdevkit/VOC2012/JPEGImages/2010_004010.jpg 500 334 0 1 79 485 304 +14055 /data/VOCdevkit/VOC2012/JPEGImages/2010_004011.jpg 500 397 11 93 76 418 294 +14056 /data/VOCdevkit/VOC2012/JPEGImages/2010_004014.jpg 500 375 6 365 52 500 212 6 4 1 500 326 +14057 /data/VOCdevkit/VOC2012/JPEGImages/2010_004017.jpg 500 375 11 217 1 500 132 11 229 47 477 333 11 42 157 341 375 +14058 /data/VOCdevkit/VOC2012/JPEGImages/2010_004021.jpg 500 334 11 213 140 348 265 6 1 39 192 200 6 137 61 315 124 +14059 /data/VOCdevkit/VOC2012/JPEGImages/2010_004023.jpg 500 333 7 42 20 421 311 8 27 128 463 333 +14060 /data/VOCdevkit/VOC2012/JPEGImages/2010_004025.jpg 500 376 17 1 99 469 361 14 85 150 422 279 +14061 /data/VOCdevkit/VOC2012/JPEGImages/2010_004026.jpg 500 333 2 24 99 398 261 +14062 /data/VOCdevkit/VOC2012/JPEGImages/2010_004027.jpg 399 500 6 204 254 311 344 +14063 /data/VOCdevkit/VOC2012/JPEGImages/2010_004028.jpg 500 366 13 175 143 305 241 14 228 110 282 210 +14064 /data/VOCdevkit/VOC2012/JPEGImages/2010_004029.jpg 500 375 8 281 208 354 306 15 145 290 195 351 +14065 /data/VOCdevkit/VOC2012/JPEGImages/2010_004030.jpg 500 375 9 182 191 257 232 +14066 /data/VOCdevkit/VOC2012/JPEGImages/2010_004031.jpg 500 375 14 234 64 483 375 14 3 64 422 375 +14067 /data/VOCdevkit/VOC2012/JPEGImages/2010_004033.jpg 375 500 14 175 89 268 313 14 95 95 182 328 13 221 214 375 500 13 2 197 175 500 +14068 /data/VOCdevkit/VOC2012/JPEGImages/2010_004036.jpg 375 500 11 34 36 325 391 +14069 /data/VOCdevkit/VOC2012/JPEGImages/2010_004037.jpg 500 332 7 1 1 464 332 +14070 /data/VOCdevkit/VOC2012/JPEGImages/2010_004041.jpg 500 375 3 367 123 495 244 3 240 127 393 233 3 123 128 261 215 3 1 134 164 222 +14071 /data/VOCdevkit/VOC2012/JPEGImages/2010_004042.jpg 500 349 13 72 27 295 230 +14072 /data/VOCdevkit/VOC2012/JPEGImages/2010_004043.jpg 500 375 17 140 195 376 352 +14073 /data/VOCdevkit/VOC2012/JPEGImages/2010_004045.jpg 500 375 12 222 233 304 274 12 159 147 266 275 6 400 201 484 245 +14074 /data/VOCdevkit/VOC2012/JPEGImages/2010_004048.jpg 421 500 7 1 1 421 491 +14075 /data/VOCdevkit/VOC2012/JPEGImages/2010_004050.jpg 333 500 19 67 105 151 182 14 134 135 254 292 14 139 232 333 428 14 12 238 314 500 +14076 /data/VOCdevkit/VOC2012/JPEGImages/2010_004052.jpg 500 369 11 12 31 487 368 +14077 /data/VOCdevkit/VOC2012/JPEGImages/2010_004053.jpg 500 188 8 303 48 422 188 +14078 /data/VOCdevkit/VOC2012/JPEGImages/2010_004054.jpg 500 375 4 128 152 333 314 4 219 114 286 180 +14079 /data/VOCdevkit/VOC2012/JPEGImages/2010_004056.jpg 333 500 4 4 217 185 389 +14080 /data/VOCdevkit/VOC2012/JPEGImages/2010_004059.jpg 500 374 6 64 127 435 324 +14081 /data/VOCdevkit/VOC2012/JPEGImages/2010_004060.jpg 368 500 7 154 170 291 428 +14082 /data/VOCdevkit/VOC2012/JPEGImages/2010_004061.jpg 500 383 16 131 121 220 262 16 206 121 306 263 16 275 135 363 265 16 310 154 400 300 +14083 /data/VOCdevkit/VOC2012/JPEGImages/2010_004062.jpg 500 375 17 49 104 332 235 8 92 197 255 375 8 365 143 500 309 8 377 93 442 195 15 1 4 98 238 +14084 /data/VOCdevkit/VOC2012/JPEGImages/2010_004063.jpg 500 375 0 128 137 406 275 +14085 /data/VOCdevkit/VOC2012/JPEGImages/2010_004064.jpg 500 375 11 182 165 328 286 +14086 /data/VOCdevkit/VOC2012/JPEGImages/2010_004065.jpg 500 392 16 337 9 497 200 11 21 58 175 363 +14087 /data/VOCdevkit/VOC2012/JPEGImages/2010_004066.jpg 500 375 13 152 117 334 296 +14088 /data/VOCdevkit/VOC2012/JPEGImages/2010_004067.jpg 500 375 14 331 49 495 364 14 15 81 222 346 16 111 166 344 356 +14089 /data/VOCdevkit/VOC2012/JPEGImages/2010_004069.jpg 500 375 14 184 39 312 278 1 151 127 342 305 +14090 /data/VOCdevkit/VOC2012/JPEGImages/2010_004071.jpg 500 391 2 49 182 91 208 2 140 287 198 325 2 268 271 301 297 2 280 329 319 357 +14091 /data/VOCdevkit/VOC2012/JPEGImages/2010_004072.jpg 364 500 1 46 123 282 296 15 206 138 305 199 +14092 /data/VOCdevkit/VOC2012/JPEGImages/2010_004073.jpg 500 328 14 1 1 410 328 +14093 /data/VOCdevkit/VOC2012/JPEGImages/2010_004074.jpg 500 375 16 108 44 500 375 +14094 /data/VOCdevkit/VOC2012/JPEGImages/2010_004075.jpg 500 347 18 16 131 80 196 18 143 89 425 234 +14095 /data/VOCdevkit/VOC2012/JPEGImages/2010_004081.jpg 500 375 3 30 226 329 288 +14096 /data/VOCdevkit/VOC2012/JPEGImages/2010_004084.jpg 500 375 0 34 67 479 227 0 1 23 153 95 +14097 /data/VOCdevkit/VOC2012/JPEGImages/2010_004088.jpg 500 375 15 78 24 113 55 +14098 /data/VOCdevkit/VOC2012/JPEGImages/2010_004089.jpg 375 500 16 197 145 313 288 16 100 313 307 460 16 336 305 375 379 16 303 202 375 288 16 37 195 191 311 16 1 271 64 356 16 1 414 132 500 11 225 105 295 150 11 68 281 257 369 +14099 /data/VOCdevkit/VOC2012/JPEGImages/2010_004092.jpg 500 334 12 200 166 384 298 +14100 /data/VOCdevkit/VOC2012/JPEGImages/2010_004094.jpg 500 377 14 78 82 325 377 14 28 20 500 377 14 1 1 93 377 +14101 /data/VOCdevkit/VOC2012/JPEGImages/2010_004095.jpg 500 375 17 306 203 500 375 8 1 215 123 345 19 74 153 136 219 +14102 /data/VOCdevkit/VOC2012/JPEGImages/2010_004096.jpg 500 332 6 129 140 500 324 +14103 /data/VOCdevkit/VOC2012/JPEGImages/2010_004102.jpg 500 404 19 1 145 28 204 19 1 226 27 285 19 181 188 291 289 19 69 188 180 293 14 145 159 369 404 14 91 213 164 262 +14104 /data/VOCdevkit/VOC2012/JPEGImages/2010_004104.jpg 500 333 7 112 80 420 333 +14105 /data/VOCdevkit/VOC2012/JPEGImages/2010_004105.jpg 500 375 16 122 46 371 374 +14106 /data/VOCdevkit/VOC2012/JPEGImages/2010_004107.jpg 500 333 12 261 39 500 332 12 80 55 240 333 12 1 120 152 332 +14107 /data/VOCdevkit/VOC2012/JPEGImages/2010_004108.jpg 500 375 11 31 19 322 374 11 309 48 470 373 +14108 /data/VOCdevkit/VOC2012/JPEGImages/2010_004109.jpg 500 335 17 248 78 500 334 19 25 64 177 181 4 64 173 99 295 14 327 176 500 246 +14109 /data/VOCdevkit/VOC2012/JPEGImages/2010_004111.jpg 500 333 17 246 99 500 308 14 126 173 216 307 14 249 70 375 263 +14110 /data/VOCdevkit/VOC2012/JPEGImages/2010_004116.jpg 500 375 6 49 81 498 359 +14111 /data/VOCdevkit/VOC2012/JPEGImages/2010_004118.jpg 500 333 0 8 74 495 218 +14112 /data/VOCdevkit/VOC2012/JPEGImages/2010_004119.jpg 500 333 13 49 30 425 317 +14113 /data/VOCdevkit/VOC2012/JPEGImages/2010_004120.jpg 500 375 7 23 107 493 330 +14114 /data/VOCdevkit/VOC2012/JPEGImages/2010_004121.jpg 500 375 11 16 60 483 346 +14115 /data/VOCdevkit/VOC2012/JPEGImages/2010_004123.jpg 500 334 2 111 68 174 143 +14116 /data/VOCdevkit/VOC2012/JPEGImages/2010_004124.jpg 375 500 14 1 157 160 500 3 121 128 375 217 +14117 /data/VOCdevkit/VOC2012/JPEGImages/2010_004125.jpg 500 375 8 148 150 187 203 17 228 189 481 310 10 1 260 113 375 14 21 35 147 351 19 271 139 324 179 +14118 /data/VOCdevkit/VOC2012/JPEGImages/2010_004129.jpg 500 375 11 128 45 477 374 +14119 /data/VOCdevkit/VOC2012/JPEGImages/2010_004130.jpg 500 375 14 78 49 431 375 8 28 303 113 375 +14120 /data/VOCdevkit/VOC2012/JPEGImages/2010_004133.jpg 500 375 7 111 78 499 325 +14121 /data/VOCdevkit/VOC2012/JPEGImages/2010_004137.jpg 500 334 19 190 34 350 123 +14122 /data/VOCdevkit/VOC2012/JPEGImages/2010_004138.jpg 500 295 2 447 156 476 185 3 190 79 262 142 +14123 /data/VOCdevkit/VOC2012/JPEGImages/2010_004139.jpg 500 375 6 5 36 499 346 +14124 /data/VOCdevkit/VOC2012/JPEGImages/2010_004140.jpg 500 375 9 4 129 450 274 +14125 /data/VOCdevkit/VOC2012/JPEGImages/2010_004141.jpg 500 304 7 91 58 235 166 14 237 53 390 171 +14126 /data/VOCdevkit/VOC2012/JPEGImages/2010_004143.jpg 500 375 13 5 3 469 375 +14127 /data/VOCdevkit/VOC2012/JPEGImages/2010_004144.jpg 500 333 7 18 91 269 234 +14128 /data/VOCdevkit/VOC2012/JPEGImages/2010_004145.jpg 500 334 12 77 24 361 334 +14129 /data/VOCdevkit/VOC2012/JPEGImages/2010_004148.jpg 500 375 18 1 58 199 303 +14130 /data/VOCdevkit/VOC2012/JPEGImages/2010_004149.jpg 500 328 18 311 1 500 327 +14131 /data/VOCdevkit/VOC2012/JPEGImages/2010_004154.jpg 500 375 1 215 190 360 335 1 140 169 209 278 +14132 /data/VOCdevkit/VOC2012/JPEGImages/2010_004157.jpg 500 333 7 1 19 499 293 +14133 /data/VOCdevkit/VOC2012/JPEGImages/2010_004160.jpg 500 375 14 211 118 249 207 12 255 127 366 231 12 324 117 488 248 14 287 90 318 153 6 1 112 101 177 +14134 /data/VOCdevkit/VOC2012/JPEGImages/2010_004161.jpg 471 500 11 7 198 215 483 14 16 40 471 500 +14135 /data/VOCdevkit/VOC2012/JPEGImages/2010_004162.jpg 500 428 11 131 292 412 386 +14136 /data/VOCdevkit/VOC2012/JPEGImages/2010_004163.jpg 500 283 11 286 113 500 282 9 1 1 323 249 +14137 /data/VOCdevkit/VOC2012/JPEGImages/2010_004165.jpg 500 333 11 140 124 273 333 14 115 70 341 333 +14138 /data/VOCdevkit/VOC2012/JPEGImages/2010_004168.jpg 500 375 14 158 154 217 296 14 224 162 264 269 14 273 167 303 260 18 208 23 500 328 +14139 /data/VOCdevkit/VOC2012/JPEGImages/2010_004171.jpg 333 500 7 35 41 333 499 +14140 /data/VOCdevkit/VOC2012/JPEGImages/2010_004172.jpg 500 375 6 401 255 500 344 +14141 /data/VOCdevkit/VOC2012/JPEGImages/2010_004173.jpg 333 500 8 1 293 214 500 +14142 /data/VOCdevkit/VOC2012/JPEGImages/2010_004175.jpg 400 300 7 1 39 248 300 +14143 /data/VOCdevkit/VOC2012/JPEGImages/2010_004178.jpg 500 375 9 177 62 216 90 9 247 66 298 102 9 292 68 333 103 +14144 /data/VOCdevkit/VOC2012/JPEGImages/2010_004179.jpg 500 375 11 16 54 500 289 +14145 /data/VOCdevkit/VOC2012/JPEGImages/2010_004180.jpg 500 443 5 185 260 440 418 14 245 297 280 328 +14146 /data/VOCdevkit/VOC2012/JPEGImages/2010_004182.jpg 500 375 1 14 54 483 340 +14147 /data/VOCdevkit/VOC2012/JPEGImages/2010_004184.jpg 500 332 0 8 102 491 214 +14148 /data/VOCdevkit/VOC2012/JPEGImages/2010_004186.jpg 500 375 6 294 105 489 272 6 57 116 432 324 6 1 143 243 375 14 450 141 500 271 +14149 /data/VOCdevkit/VOC2012/JPEGImages/2010_004187.jpg 500 333 2 67 73 343 275 +14150 /data/VOCdevkit/VOC2012/JPEGImages/2010_004188.jpg 500 373 16 1 28 270 373 16 206 27 500 372 +14151 /data/VOCdevkit/VOC2012/JPEGImages/2010_004191.jpg 375 500 13 1 229 70 445 13 256 187 298 250 14 105 108 220 412 +14152 /data/VOCdevkit/VOC2012/JPEGImages/2010_004192.jpg 500 375 14 115 106 328 375 14 336 1 500 375 +14153 /data/VOCdevkit/VOC2012/JPEGImages/2010_004193.jpg 500 378 18 44 165 476 321 +14154 /data/VOCdevkit/VOC2012/JPEGImages/2010_004197.jpg 500 333 4 291 162 333 318 7 141 123 282 318 +14155 /data/VOCdevkit/VOC2012/JPEGImages/2010_004198.jpg 500 375 4 161 59 254 105 14 212 4 500 375 14 189 48 326 276 +14156 /data/VOCdevkit/VOC2012/JPEGImages/2010_004201.jpg 500 333 2 172 218 265 271 2 229 238 321 288 +14157 /data/VOCdevkit/VOC2012/JPEGImages/2010_004204.jpg 500 323 11 368 141 411 200 +14158 /data/VOCdevkit/VOC2012/JPEGImages/2010_004207.jpg 489 500 8 38 110 457 474 14 27 91 459 486 +14159 /data/VOCdevkit/VOC2012/JPEGImages/2010_004208.jpg 500 375 3 229 105 326 258 +14160 /data/VOCdevkit/VOC2012/JPEGImages/2010_004209.jpg 500 375 7 101 92 410 263 +14161 /data/VOCdevkit/VOC2012/JPEGImages/2010_004210.jpg 500 375 9 285 31 500 275 9 48 106 343 329 +14162 /data/VOCdevkit/VOC2012/JPEGImages/2010_004211.jpg 500 332 11 90 95 315 280 +14163 /data/VOCdevkit/VOC2012/JPEGImages/2010_004216.jpg 500 375 11 1 1 390 282 +14164 /data/VOCdevkit/VOC2012/JPEGImages/2010_004219.jpg 500 375 13 43 42 454 360 13 1 27 242 227 13 300 1 376 41 +14165 /data/VOCdevkit/VOC2012/JPEGImages/2010_004222.jpg 326 500 14 67 176 197 500 14 121 275 249 500 +14166 /data/VOCdevkit/VOC2012/JPEGImages/2010_004223.jpg 500 375 14 1 68 488 375 +14167 /data/VOCdevkit/VOC2012/JPEGImages/2010_004224.jpg 500 375 11 247 70 391 286 15 1 1 261 375 +14168 /data/VOCdevkit/VOC2012/JPEGImages/2010_004225.jpg 500 377 16 169 262 375 377 16 216 18 339 142 14 193 87 305 278 14 402 55 482 204 +14169 /data/VOCdevkit/VOC2012/JPEGImages/2010_004226.jpg 500 375 16 176 16 336 333 16 330 137 500 329 16 294 211 418 333 16 1 137 55 329 +14170 /data/VOCdevkit/VOC2012/JPEGImages/2010_004227.jpg 334 500 11 31 41 334 500 +14171 /data/VOCdevkit/VOC2012/JPEGImages/2010_004228.jpg 500 375 12 183 75 500 374 6 1 1 84 31 +14172 /data/VOCdevkit/VOC2012/JPEGImages/2010_004229.jpg 500 375 10 124 169 307 364 8 72 166 215 369 +14173 /data/VOCdevkit/VOC2012/JPEGImages/2010_004230.jpg 475 287 2 332 13 370 55 2 394 162 433 186 2 45 141 100 168 +14174 /data/VOCdevkit/VOC2012/JPEGImages/2010_004231.jpg 473 500 8 374 251 473 500 8 10 37 218 352 10 2 108 473 499 +14175 /data/VOCdevkit/VOC2012/JPEGImages/2010_004238.jpg 500 281 0 78 68 444 180 0 27 106 100 154 +14176 /data/VOCdevkit/VOC2012/JPEGImages/2010_004239.jpg 500 457 6 1 112 499 431 6 1 72 128 315 +14177 /data/VOCdevkit/VOC2012/JPEGImages/2010_004242.jpg 500 387 0 296 116 427 261 +14178 /data/VOCdevkit/VOC2012/JPEGImages/2010_004244.jpg 384 500 7 1 120 247 433 +14179 /data/VOCdevkit/VOC2012/JPEGImages/2010_004247.jpg 500 375 12 89 39 472 371 +14180 /data/VOCdevkit/VOC2012/JPEGImages/2010_004248.jpg 500 375 11 158 70 326 245 +14181 /data/VOCdevkit/VOC2012/JPEGImages/2010_004249.jpg 500 333 8 1 169 214 333 8 70 226 135 307 8 382 198 460 321 14 26 122 173 307 14 165 1 436 333 19 351 152 466 255 4 375 125 385 155 14 98 57 114 131 14 71 58 98 131 14 63 35 85 90 +14182 /data/VOCdevkit/VOC2012/JPEGImages/2010_004252.jpg 500 399 2 14 43 397 393 +14183 /data/VOCdevkit/VOC2012/JPEGImages/2010_004253.jpg 500 333 3 13 92 431 229 +14184 /data/VOCdevkit/VOC2012/JPEGImages/2010_004254.jpg 500 375 19 337 151 500 346 14 1 116 227 375 4 144 227 183 344 +14185 /data/VOCdevkit/VOC2012/JPEGImages/2010_004256.jpg 500 311 18 102 142 378 254 +14186 /data/VOCdevkit/VOC2012/JPEGImages/2010_004257.jpg 500 375 7 302 66 500 344 +14187 /data/VOCdevkit/VOC2012/JPEGImages/2010_004258.jpg 500 375 6 272 130 495 307 +14188 /data/VOCdevkit/VOC2012/JPEGImages/2010_004259.jpg 500 375 16 1 29 500 361 +14189 /data/VOCdevkit/VOC2012/JPEGImages/2010_004263.jpg 500 286 5 132 87 425 219 6 70 141 133 173 5 45 140 83 163 +14190 /data/VOCdevkit/VOC2012/JPEGImages/2010_004264.jpg 500 332 9 191 174 248 332 14 217 121 367 332 +14191 /data/VOCdevkit/VOC2012/JPEGImages/2010_004271.jpg 500 375 7 228 157 353 298 +14192 /data/VOCdevkit/VOC2012/JPEGImages/2010_004275.jpg 500 281 8 317 222 465 281 8 25 206 74 281 10 49 220 255 281 4 109 1 118 26 4 99 1 107 24 4 86 1 97 24 4 75 1 86 23 4 63 1 74 20 +14193 /data/VOCdevkit/VOC2012/JPEGImages/2010_004276.jpg 500 334 16 301 131 366 203 16 159 102 189 147 16 127 97 154 134 16 71 92 92 118 16 52 84 70 111 16 40 78 58 106 +14194 /data/VOCdevkit/VOC2012/JPEGImages/2010_004278.jpg 500 372 10 12 24 423 349 8 283 78 493 357 8 1 122 235 368 8 15 18 187 190 8 249 14 354 52 +14195 /data/VOCdevkit/VOC2012/JPEGImages/2010_004279.jpg 500 375 11 60 40 331 329 +14196 /data/VOCdevkit/VOC2012/JPEGImages/2010_004280.jpg 500 374 14 69 80 237 374 14 270 117 467 374 14 426 123 500 374 +14197 /data/VOCdevkit/VOC2012/JPEGImages/2010_004282.jpg 415 500 14 21 231 80 387 14 6 18 284 484 14 194 201 413 482 +14198 /data/VOCdevkit/VOC2012/JPEGImages/2010_004283.jpg 375 500 9 24 100 375 489 +14199 /data/VOCdevkit/VOC2012/JPEGImages/2010_004286.jpg 500 375 7 235 103 308 280 +14200 /data/VOCdevkit/VOC2012/JPEGImages/2010_004288.jpg 333 500 4 146 254 188 411 +14201 /data/VOCdevkit/VOC2012/JPEGImages/2010_004289.jpg 333 500 13 19 233 214 396 14 199 163 244 221 14 37 231 213 387 +14202 /data/VOCdevkit/VOC2012/JPEGImages/2010_004290.jpg 500 340 10 1 4 449 340 4 153 1 230 114 4 236 2 325 139 4 7 1 228 333 +14203 /data/VOCdevkit/VOC2012/JPEGImages/2010_004291.jpg 500 375 6 71 124 458 274 +14204 /data/VOCdevkit/VOC2012/JPEGImages/2010_004295.jpg 400 300 19 103 29 226 156 +14205 /data/VOCdevkit/VOC2012/JPEGImages/2010_004296.jpg 375 500 11 120 156 262 341 +14206 /data/VOCdevkit/VOC2012/JPEGImages/2010_004297.jpg 500 469 11 79 1 224 228 14 5 53 486 469 +14207 /data/VOCdevkit/VOC2012/JPEGImages/2010_004301.jpg 500 376 7 189 125 302 284 +14208 /data/VOCdevkit/VOC2012/JPEGImages/2010_004304.jpg 500 375 11 1 1 500 375 +14209 /data/VOCdevkit/VOC2012/JPEGImages/2010_004306.jpg 500 334 7 262 185 343 328 19 117 1 331 150 8 441 87 500 251 +14210 /data/VOCdevkit/VOC2012/JPEGImages/2010_004307.jpg 335 500 1 1 241 335 497 +14211 /data/VOCdevkit/VOC2012/JPEGImages/2010_004311.jpg 500 375 11 127 11 414 371 +14212 /data/VOCdevkit/VOC2012/JPEGImages/2010_004312.jpg 500 375 0 2 121 497 274 +14213 /data/VOCdevkit/VOC2012/JPEGImages/2010_004313.jpg 500 336 18 7 79 500 321 +14214 /data/VOCdevkit/VOC2012/JPEGImages/2010_004314.jpg 500 375 14 35 164 55 215 0 94 126 438 248 0 8 154 189 218 +14215 /data/VOCdevkit/VOC2012/JPEGImages/2010_004318.jpg 500 334 14 97 52 336 334 +14216 /data/VOCdevkit/VOC2012/JPEGImages/2010_004320.jpg 500 335 7 4 2 393 264 +14217 /data/VOCdevkit/VOC2012/JPEGImages/2010_004322.jpg 500 375 9 10 24 500 374 +14218 /data/VOCdevkit/VOC2012/JPEGImages/2010_004325.jpg 500 334 12 200 101 255 269 14 140 73 204 282 14 226 91 272 281 14 262 102 319 268 +14219 /data/VOCdevkit/VOC2012/JPEGImages/2010_004327.jpg 500 378 11 81 41 475 350 7 18 179 360 348 +14220 /data/VOCdevkit/VOC2012/JPEGImages/2010_004332.jpg 500 375 16 1 168 283 364 14 275 56 419 275 14 278 103 402 327 +14221 /data/VOCdevkit/VOC2012/JPEGImages/2010_004333.jpg 500 375 6 74 41 441 316 6 407 98 480 143 6 383 100 438 143 +14222 /data/VOCdevkit/VOC2012/JPEGImages/2010_004335.jpg 500 375 7 198 173 494 338 +14223 /data/VOCdevkit/VOC2012/JPEGImages/2010_004336.jpg 500 375 6 1 105 50 133 6 253 102 282 123 6 288 97 315 119 13 282 90 450 333 13 23 112 291 316 +14224 /data/VOCdevkit/VOC2012/JPEGImages/2010_004337.jpg 500 376 6 288 196 320 222 6 266 200 288 219 13 347 219 389 287 14 341 155 390 250 +14225 /data/VOCdevkit/VOC2012/JPEGImages/2010_004339.jpg 500 375 11 1 73 329 241 +14226 /data/VOCdevkit/VOC2012/JPEGImages/2010_004341.jpg 500 375 14 208 45 408 375 14 20 88 221 375 +14227 /data/VOCdevkit/VOC2012/JPEGImages/2010_004344.jpg 500 375 4 216 13 294 330 +14228 /data/VOCdevkit/VOC2012/JPEGImages/2010_004345.jpg 500 375 11 259 162 367 244 8 387 167 500 335 8 265 130 379 285 +14229 /data/VOCdevkit/VOC2012/JPEGImages/2010_004346.jpg 500 375 7 1 41 450 294 +14230 /data/VOCdevkit/VOC2012/JPEGImages/2010_004348.jpg 500 290 5 33 47 409 290 +14231 /data/VOCdevkit/VOC2012/JPEGImages/2010_004349.jpg 500 375 6 10 171 84 221 6 66 164 193 233 6 182 156 493 264 6 418 164 455 179 +14232 /data/VOCdevkit/VOC2012/JPEGImages/2010_004350.jpg 500 357 18 2 15 465 72 18 150 176 426 349 +14233 /data/VOCdevkit/VOC2012/JPEGImages/2010_004351.jpg 500 341 12 26 31 479 328 +14234 /data/VOCdevkit/VOC2012/JPEGImages/2010_004352.jpg 375 500 2 104 221 161 374 +14235 /data/VOCdevkit/VOC2012/JPEGImages/2010_004355.jpg 500 375 13 130 1 441 344 +14236 /data/VOCdevkit/VOC2012/JPEGImages/2010_004357.jpg 500 333 0 57 73 450 221 +14237 /data/VOCdevkit/VOC2012/JPEGImages/2010_004358.jpg 500 375 17 72 128 500 375 8 344 1 466 157 15 192 1 302 108 19 72 78 137 151 +14238 /data/VOCdevkit/VOC2012/JPEGImages/2010_004360.jpg 332 500 14 1 1 332 265 +14239 /data/VOCdevkit/VOC2012/JPEGImages/2010_004361.jpg 500 373 10 236 198 500 372 8 122 160 206 326 8 206 182 308 314 8 371 266 500 372 8 192 200 316 373 8 99 160 160 269 14 231 118 360 265 +14240 /data/VOCdevkit/VOC2012/JPEGImages/2010_004362.jpg 500 375 11 148 69 403 338 11 137 49 296 205 +14241 /data/VOCdevkit/VOC2012/JPEGImages/2010_004363.jpg 400 338 12 1 1 321 315 8 121 55 170 108 +14242 /data/VOCdevkit/VOC2012/JPEGImages/2010_004365.jpg 375 500 7 50 67 375 499 +14243 /data/VOCdevkit/VOC2012/JPEGImages/2010_004366.jpg 500 375 11 9 63 500 262 +14244 /data/VOCdevkit/VOC2012/JPEGImages/2010_004367.jpg 500 375 5 79 152 426 277 +14245 /data/VOCdevkit/VOC2012/JPEGImages/2010_004368.jpg 500 375 19 186 27 291 116 4 290 75 305 118 4 205 83 221 132 +14246 /data/VOCdevkit/VOC2012/JPEGImages/2010_004369.jpg 500 375 7 1 1 500 375 +14247 /data/VOCdevkit/VOC2012/JPEGImages/2010_004370.jpg 360 270 11 93 6 281 232 +14248 /data/VOCdevkit/VOC2012/JPEGImages/2010_004371.jpg 500 375 16 253 197 292 235 16 221 177 269 216 16 202 185 237 239 +14249 /data/VOCdevkit/VOC2012/JPEGImages/2010_004373.jpg 500 333 6 25 73 487 320 +14250 /data/VOCdevkit/VOC2012/JPEGImages/2010_004374.jpg 373 473 12 68 110 349 448 14 126 51 218 304 +14251 /data/VOCdevkit/VOC2012/JPEGImages/2010_004380.jpg 334 500 10 1 279 334 500 10 52 165 295 287 10 86 94 263 180 +14252 /data/VOCdevkit/VOC2012/JPEGImages/2010_004382.jpg 500 375 15 65 8 410 360 +14253 /data/VOCdevkit/VOC2012/JPEGImages/2010_004385.jpg 300 300 2 25 23 246 226 +14254 /data/VOCdevkit/VOC2012/JPEGImages/2010_004387.jpg 267 400 11 63 244 207 400 14 1 44 259 400 8 130 1 267 175 +14255 /data/VOCdevkit/VOC2012/JPEGImages/2010_004390.jpg 500 376 6 3 105 495 349 +14256 /data/VOCdevkit/VOC2012/JPEGImages/2010_004391.jpg 500 272 10 1 1 500 272 +14257 /data/VOCdevkit/VOC2012/JPEGImages/2010_004400.jpg 500 333 14 1 1 466 333 +14258 /data/VOCdevkit/VOC2012/JPEGImages/2010_004402.jpg 500 375 7 74 1 395 375 +14259 /data/VOCdevkit/VOC2012/JPEGImages/2010_004404.jpg 333 500 0 67 125 277 383 +14260 /data/VOCdevkit/VOC2012/JPEGImages/2010_004409.jpg 500 356 17 6 40 495 347 +14261 /data/VOCdevkit/VOC2012/JPEGImages/2010_004412.jpg 500 375 18 1 132 435 332 +14262 /data/VOCdevkit/VOC2012/JPEGImages/2010_004415.jpg 500 375 7 1 116 336 274 7 13 11 430 158 +14263 /data/VOCdevkit/VOC2012/JPEGImages/2010_004417.jpg 375 500 11 1 216 375 500 +14264 /data/VOCdevkit/VOC2012/JPEGImages/2010_004419.jpg 500 375 0 1 144 486 318 +14265 /data/VOCdevkit/VOC2012/JPEGImages/2010_004420.jpg 500 375 2 196 159 318 223 +14266 /data/VOCdevkit/VOC2012/JPEGImages/2010_004422.jpg 500 333 6 309 1 500 203 13 53 7 456 292 +14267 /data/VOCdevkit/VOC2012/JPEGImages/2010_004423.jpg 500 333 0 63 113 384 214 +14268 /data/VOCdevkit/VOC2012/JPEGImages/2010_004425.jpg 500 375 7 1 142 392 374 +14269 /data/VOCdevkit/VOC2012/JPEGImages/2010_004428.jpg 500 333 16 1 141 211 299 +14270 /data/VOCdevkit/VOC2012/JPEGImages/2010_004429.jpg 500 375 8 274 84 386 269 8 398 184 500 322 19 405 86 450 134 4 25 223 70 334 +14271 /data/VOCdevkit/VOC2012/JPEGImages/2010_004431.jpg 500 333 16 143 91 354 276 2 180 72 261 116 2 208 60 291 100 2 255 59 336 93 +14272 /data/VOCdevkit/VOC2012/JPEGImages/2010_004432.jpg 500 334 14 110 111 323 334 +14273 /data/VOCdevkit/VOC2012/JPEGImages/2010_004436.jpg 500 361 16 417 217 500 326 9 197 118 362 253 +14274 /data/VOCdevkit/VOC2012/JPEGImages/2010_004439.jpg 500 375 14 105 188 137 278 14 175 233 213 302 14 196 180 225 263 14 212 183 238 266 14 240 190 266 259 14 265 184 292 256 14 295 181 322 255 14 328 175 357 251 14 359 172 379 242 1 378 300 457 342 1 411 272 467 315 +14275 /data/VOCdevkit/VOC2012/JPEGImages/2010_004441.jpg 500 375 4 84 150 116 263 14 195 7 442 375 +14276 /data/VOCdevkit/VOC2012/JPEGImages/2010_004445.jpg 500 333 11 129 12 495 331 +14277 /data/VOCdevkit/VOC2012/JPEGImages/2010_004447.jpg 375 500 14 17 187 178 441 14 208 125 375 311 14 283 130 373 248 4 39 344 74 458 17 40 231 231 361 +14278 /data/VOCdevkit/VOC2012/JPEGImages/2010_004448.jpg 384 330 7 15 1 379 330 +14279 /data/VOCdevkit/VOC2012/JPEGImages/2010_004450.jpg 500 375 11 22 56 485 290 +14280 /data/VOCdevkit/VOC2012/JPEGImages/2010_004451.jpg 400 300 2 64 104 219 252 +14281 /data/VOCdevkit/VOC2012/JPEGImages/2010_004455.jpg 500 333 0 32 127 486 238 +14282 /data/VOCdevkit/VOC2012/JPEGImages/2010_004456.jpg 500 375 9 9 67 180 177 14 278 131 307 164 +14283 /data/VOCdevkit/VOC2012/JPEGImages/2010_004457.jpg 500 377 7 31 70 335 262 +14284 /data/VOCdevkit/VOC2012/JPEGImages/2010_004459.jpg 500 375 6 14 88 482 338 +14285 /data/VOCdevkit/VOC2012/JPEGImages/2010_004460.jpg 500 375 19 108 170 314 349 4 66 254 115 370 +14286 /data/VOCdevkit/VOC2012/JPEGImages/2010_004461.jpg 500 375 11 210 1 500 354 +14287 /data/VOCdevkit/VOC2012/JPEGImages/2010_004466.jpg 300 421 15 244 144 300 293 +14288 /data/VOCdevkit/VOC2012/JPEGImages/2010_004467.jpg 500 375 7 230 176 324 269 8 330 88 451 375 10 1 198 339 375 +14289 /data/VOCdevkit/VOC2012/JPEGImages/2010_004469.jpg 500 375 14 68 172 84 229 14 86 170 110 230 14 1 115 150 375 14 148 84 300 375 14 251 61 445 375 18 117 1 500 322 +14290 /data/VOCdevkit/VOC2012/JPEGImages/2010_004472.jpg 500 336 14 157 50 500 336 +14291 /data/VOCdevkit/VOC2012/JPEGImages/2010_004475.jpg 500 333 14 178 51 257 299 14 6 204 160 333 18 2 1 500 333 +14292 /data/VOCdevkit/VOC2012/JPEGImages/2010_004476.jpg 500 375 11 269 202 320 283 11 188 212 233 280 +14293 /data/VOCdevkit/VOC2012/JPEGImages/2010_004477.jpg 500 375 12 322 179 378 319 +14294 /data/VOCdevkit/VOC2012/JPEGImages/2010_004478.jpg 500 333 18 99 147 441 251 +14295 /data/VOCdevkit/VOC2012/JPEGImages/2010_004479.jpg 500 375 14 81 15 488 374 19 1 9 139 278 7 171 197 296 374 +14296 /data/VOCdevkit/VOC2012/JPEGImages/2010_004481.jpg 375 500 14 1 48 375 500 14 1 1 144 248 +14297 /data/VOCdevkit/VOC2012/JPEGImages/2010_004483.jpg 460 500 2 99 47 449 281 +14298 /data/VOCdevkit/VOC2012/JPEGImages/2010_004484.jpg 500 333 6 69 246 300 333 +14299 /data/VOCdevkit/VOC2012/JPEGImages/2010_004486.jpg 500 375 3 35 214 98 239 3 360 215 457 240 +14300 /data/VOCdevkit/VOC2012/JPEGImages/2010_004488.jpg 500 375 4 91 94 405 287 +14301 /data/VOCdevkit/VOC2012/JPEGImages/2010_004491.jpg 500 375 14 1 93 441 375 14 68 1 500 302 +14302 /data/VOCdevkit/VOC2012/JPEGImages/2010_004492.jpg 375 500 11 26 80 375 500 +14303 /data/VOCdevkit/VOC2012/JPEGImages/2010_004493.jpg 500 380 11 51 34 499 378 +14304 /data/VOCdevkit/VOC2012/JPEGImages/2010_004499.jpg 500 375 16 334 216 417 276 16 287 212 349 265 16 199 213 287 267 14 1 1 225 375 +14305 /data/VOCdevkit/VOC2012/JPEGImages/2010_004501.jpg 500 395 7 48 17 467 329 +14306 /data/VOCdevkit/VOC2012/JPEGImages/2010_004503.jpg 350 263 19 17 40 324 263 +14307 /data/VOCdevkit/VOC2012/JPEGImages/2010_004505.jpg 375 500 11 64 1 370 500 +14308 /data/VOCdevkit/VOC2012/JPEGImages/2010_004506.jpg 500 375 14 1 28 500 375 14 215 76 358 276 +14309 /data/VOCdevkit/VOC2012/JPEGImages/2010_004509.jpg 500 333 8 319 125 409 220 8 247 123 329 220 +14310 /data/VOCdevkit/VOC2012/JPEGImages/2010_004511.jpg 500 375 11 161 39 367 333 +14311 /data/VOCdevkit/VOC2012/JPEGImages/2010_004514.jpg 500 334 16 37 85 500 334 +14312 /data/VOCdevkit/VOC2012/JPEGImages/2010_004515.jpg 500 333 7 250 60 329 288 +14313 /data/VOCdevkit/VOC2012/JPEGImages/2010_004517.jpg 500 335 13 51 1 467 335 +14314 /data/VOCdevkit/VOC2012/JPEGImages/2010_004518.jpg 500 375 7 77 34 432 319 +14315 /data/VOCdevkit/VOC2012/JPEGImages/2010_004519.jpg 500 375 12 122 39 399 375 +14316 /data/VOCdevkit/VOC2012/JPEGImages/2010_004520.jpg 333 500 4 81 23 246 481 +14317 /data/VOCdevkit/VOC2012/JPEGImages/2010_004521.jpg 271 500 2 94 60 227 493 +14318 /data/VOCdevkit/VOC2012/JPEGImages/2010_004523.jpg 500 378 14 1 83 335 378 19 201 134 390 297 +14319 /data/VOCdevkit/VOC2012/JPEGImages/2010_004529.jpg 500 333 4 47 50 441 259 +14320 /data/VOCdevkit/VOC2012/JPEGImages/2010_004533.jpg 500 375 6 94 85 353 167 6 1 131 94 165 +14321 /data/VOCdevkit/VOC2012/JPEGImages/2010_004536.jpg 500 375 18 272 130 500 220 +14322 /data/VOCdevkit/VOC2012/JPEGImages/2010_004537.jpg 500 375 1 27 73 488 341 +14323 /data/VOCdevkit/VOC2012/JPEGImages/2010_004540.jpg 500 333 7 97 115 323 252 +14324 /data/VOCdevkit/VOC2012/JPEGImages/2010_004542.jpg 500 375 12 206 42 447 375 12 17 102 68 184 14 19 73 62 150 12 70 92 221 199 14 22 61 262 375 +14325 /data/VOCdevkit/VOC2012/JPEGImages/2010_004543.jpg 500 375 8 338 123 378 218 +14326 /data/VOCdevkit/VOC2012/JPEGImages/2010_004545.jpg 480 360 19 120 61 309 252 4 238 35 259 78 7 300 116 442 266 +14327 /data/VOCdevkit/VOC2012/JPEGImages/2010_004546.jpg 500 349 0 1 16 500 326 +14328 /data/VOCdevkit/VOC2012/JPEGImages/2010_004550.jpg 500 500 11 1 65 336 482 +14329 /data/VOCdevkit/VOC2012/JPEGImages/2010_004551.jpg 333 500 4 84 56 256 498 +14330 /data/VOCdevkit/VOC2012/JPEGImages/2010_004553.jpg 500 375 7 107 1 475 374 +14331 /data/VOCdevkit/VOC2012/JPEGImages/2010_004554.jpg 500 375 5 82 32 449 341 14 447 159 500 363 +14332 /data/VOCdevkit/VOC2012/JPEGImages/2010_004556.jpg 448 299 2 297 82 448 211 +14333 /data/VOCdevkit/VOC2012/JPEGImages/2010_004557.jpg 500 333 6 359 283 393 302 6 339 288 376 304 0 154 56 493 167 6 283 288 344 313 +14334 /data/VOCdevkit/VOC2012/JPEGImages/2010_004558.jpg 333 500 5 111 205 312 344 6 71 276 94 293 +14335 /data/VOCdevkit/VOC2012/JPEGImages/2010_004559.jpg 500 375 2 1 28 450 323 +14336 /data/VOCdevkit/VOC2012/JPEGImages/2010_004560.jpg 500 375 16 32 46 252 310 16 198 90 500 358 +14337 /data/VOCdevkit/VOC2012/JPEGImages/2010_004561.jpg 334 500 14 37 308 73 353 14 1 307 26 345 3 1 1 165 412 +14338 /data/VOCdevkit/VOC2012/JPEGImages/2010_004567.jpg 500 375 14 129 181 216 275 14 300 190 378 268 3 38 244 437 309 +14339 /data/VOCdevkit/VOC2012/JPEGImages/2010_004569.jpg 500 375 6 2 1 500 375 +14340 /data/VOCdevkit/VOC2012/JPEGImages/2010_004570.jpg 500 333 2 166 115 242 199 +14341 /data/VOCdevkit/VOC2012/JPEGImages/2010_004573.jpg 500 375 8 1 51 500 375 7 103 89 392 293 +14342 /data/VOCdevkit/VOC2012/JPEGImages/2010_004575.jpg 500 375 7 175 74 492 238 +14343 /data/VOCdevkit/VOC2012/JPEGImages/2010_004576.jpg 500 333 3 1 1 371 275 +14344 /data/VOCdevkit/VOC2012/JPEGImages/2010_004577.jpg 500 375 6 25 29 487 374 6 454 3 500 98 6 402 2 483 38 14 95 19 147 83 14 1 23 46 112 14 55 12 98 91 6 63 1 125 28 +14345 /data/VOCdevkit/VOC2012/JPEGImages/2010_004581.jpg 500 334 6 60 53 368 226 14 384 1 484 220 +14346 /data/VOCdevkit/VOC2012/JPEGImages/2010_004584.jpg 375 500 7 202 84 375 379 7 95 194 250 326 +14347 /data/VOCdevkit/VOC2012/JPEGImages/2010_004585.jpg 400 266 7 75 32 273 266 +14348 /data/VOCdevkit/VOC2012/JPEGImages/2010_004586.jpg 500 333 19 356 79 441 161 11 241 129 307 175 +14349 /data/VOCdevkit/VOC2012/JPEGImages/2010_004588.jpg 500 353 5 1 41 147 344 5 146 5 433 322 +14350 /data/VOCdevkit/VOC2012/JPEGImages/2010_004591.jpg 500 375 19 164 80 346 208 +14351 /data/VOCdevkit/VOC2012/JPEGImages/2010_004592.jpg 375 500 8 1 337 44 441 8 308 312 359 374 8 244 348 299 479 10 269 369 375 500 +14352 /data/VOCdevkit/VOC2012/JPEGImages/2010_004594.jpg 375 500 5 143 116 328 311 6 201 268 284 363 14 1 210 152 500 14 128 262 280 500 14 260 265 313 400 14 105 250 173 362 +14353 /data/VOCdevkit/VOC2012/JPEGImages/2010_004596.jpg 500 333 14 336 81 489 333 14 241 57 392 333 14 187 59 283 310 14 103 55 219 317 +14354 /data/VOCdevkit/VOC2012/JPEGImages/2010_004597.jpg 500 375 14 353 78 497 370 14 286 68 396 186 14 239 73 324 144 10 122 126 477 375 14 88 112 288 375 14 67 101 141 283 14 39 75 140 182 +14355 /data/VOCdevkit/VOC2012/JPEGImages/2010_004598.jpg 500 375 9 209 151 302 234 +14356 /data/VOCdevkit/VOC2012/JPEGImages/2010_004600.jpg 423 500 8 152 299 329 500 +14357 /data/VOCdevkit/VOC2012/JPEGImages/2010_004601.jpg 500 375 14 84 202 103 231 0 78 91 399 221 6 347 189 500 247 +14358 /data/VOCdevkit/VOC2012/JPEGImages/2010_004604.jpg 500 375 18 54 150 466 327 +14359 /data/VOCdevkit/VOC2012/JPEGImages/2010_004608.jpg 500 375 0 186 138 271 166 +14360 /data/VOCdevkit/VOC2012/JPEGImages/2010_004609.jpg 480 360 1 7 22 475 323 4 220 165 262 217 +14361 /data/VOCdevkit/VOC2012/JPEGImages/2010_004616.jpg 500 375 5 1 84 460 375 +14362 /data/VOCdevkit/VOC2012/JPEGImages/2010_004618.jpg 500 375 6 136 73 363 250 14 158 57 311 286 14 1 54 46 205 +14363 /data/VOCdevkit/VOC2012/JPEGImages/2010_004620.jpg 500 378 11 65 164 212 327 11 253 168 475 214 +14364 /data/VOCdevkit/VOC2012/JPEGImages/2010_004621.jpg 331 500 7 19 100 328 478 +14365 /data/VOCdevkit/VOC2012/JPEGImages/2010_004624.jpg 375 500 13 1 105 62 273 +14366 /data/VOCdevkit/VOC2012/JPEGImages/2010_004625.jpg 500 326 5 64 24 474 292 14 253 114 327 166 +14367 /data/VOCdevkit/VOC2012/JPEGImages/2010_004627.jpg 500 197 5 125 46 350 138 +14368 /data/VOCdevkit/VOC2012/JPEGImages/2010_004628.jpg 375 500 11 114 259 242 384 11 230 256 283 353 +14369 /data/VOCdevkit/VOC2012/JPEGImages/2010_004629.jpg 500 375 16 59 160 257 314 +14370 /data/VOCdevkit/VOC2012/JPEGImages/2010_004631.jpg 500 375 11 143 23 341 374 +14371 /data/VOCdevkit/VOC2012/JPEGImages/2010_004634.jpg 500 375 7 50 20 425 375 +14372 /data/VOCdevkit/VOC2012/JPEGImages/2010_004635.jpg 500 375 9 127 122 378 328 +14373 /data/VOCdevkit/VOC2012/JPEGImages/2010_004637.jpg 500 405 5 107 74 481 357 5 17 196 109 222 14 173 177 218 229 +14374 /data/VOCdevkit/VOC2012/JPEGImages/2010_004638.jpg 500 334 7 122 1 500 334 +14375 /data/VOCdevkit/VOC2012/JPEGImages/2010_004642.jpg 500 333 11 122 36 426 317 +14376 /data/VOCdevkit/VOC2012/JPEGImages/2010_004646.jpg 500 333 7 209 125 252 172 6 65 149 500 333 +14377 /data/VOCdevkit/VOC2012/JPEGImages/2010_004654.jpg 500 330 6 33 100 462 281 +14378 /data/VOCdevkit/VOC2012/JPEGImages/2010_004655.jpg 500 420 9 118 306 155 337 9 239 317 296 348 9 294 277 460 347 +14379 /data/VOCdevkit/VOC2012/JPEGImages/2010_004656.jpg 489 500 11 1 1 489 490 +14380 /data/VOCdevkit/VOC2012/JPEGImages/2010_004657.jpg 500 375 2 200 101 352 195 +14381 /data/VOCdevkit/VOC2012/JPEGImages/2010_004659.jpg 500 375 16 249 156 291 210 16 188 167 229 231 16 127 149 147 170 +14382 /data/VOCdevkit/VOC2012/JPEGImages/2010_004660.jpg 411 500 10 10 343 292 500 +14383 /data/VOCdevkit/VOC2012/JPEGImages/2010_004661.jpg 398 500 6 12 171 385 482 6 248 140 308 183 6 299 218 374 258 6 177 165 235 203 14 5 175 44 214 +14384 /data/VOCdevkit/VOC2012/JPEGImages/2010_004662.jpg 500 375 3 1 176 500 375 +14385 /data/VOCdevkit/VOC2012/JPEGImages/2010_004665.jpg 375 500 4 198 193 247 272 4 207 420 252 500 4 133 427 196 500 14 1 307 222 428 14 197 46 329 467 +14386 /data/VOCdevkit/VOC2012/JPEGImages/2010_004666.jpg 500 375 14 80 170 299 375 +14387 /data/VOCdevkit/VOC2012/JPEGImages/2010_004667.jpg 500 375 7 91 39 500 308 +14388 /data/VOCdevkit/VOC2012/JPEGImages/2010_004669.jpg 500 376 18 6 1 421 276 +14389 /data/VOCdevkit/VOC2012/JPEGImages/2010_004670.jpg 500 375 15 1 37 500 374 +14390 /data/VOCdevkit/VOC2012/JPEGImages/2010_004672.jpg 500 332 11 210 156 362 238 14 107 44 213 262 +14391 /data/VOCdevkit/VOC2012/JPEGImages/2010_004676.jpg 500 500 7 1 136 500 499 +14392 /data/VOCdevkit/VOC2012/JPEGImages/2010_004677.jpg 500 375 18 1 160 194 242 +14393 /data/VOCdevkit/VOC2012/JPEGImages/2010_004679.jpg 500 333 11 9 12 458 280 +14394 /data/VOCdevkit/VOC2012/JPEGImages/2010_004680.jpg 361 500 4 122 20 248 490 +14395 /data/VOCdevkit/VOC2012/JPEGImages/2010_004681.jpg 500 375 11 235 147 458 330 7 105 12 371 345 7 21 90 254 375 +14396 /data/VOCdevkit/VOC2012/JPEGImages/2010_004683.jpg 500 333 11 174 66 395 243 15 71 159 189 271 15 2 150 83 255 15 237 79 257 109 15 116 9 240 174 +14397 /data/VOCdevkit/VOC2012/JPEGImages/2010_004686.jpg 355 500 6 291 348 355 480 14 201 276 251 436 +14398 /data/VOCdevkit/VOC2012/JPEGImages/2010_004690.jpg 500 375 6 1 1 500 375 +14399 /data/VOCdevkit/VOC2012/JPEGImages/2010_004691.jpg 500 375 7 212 11 500 350 +14400 /data/VOCdevkit/VOC2012/JPEGImages/2010_004692.jpg 500 375 6 200 11 319 47 6 25 7 92 37 6 1 85 457 374 14 88 100 346 244 6 88 11 123 38 6 263 13 332 44 +14401 /data/VOCdevkit/VOC2012/JPEGImages/2010_004694.jpg 375 500 16 1 145 308 500 +14402 /data/VOCdevkit/VOC2012/JPEGImages/2010_004696.jpg 500 330 5 83 178 246 226 +14403 /data/VOCdevkit/VOC2012/JPEGImages/2010_004697.jpg 500 338 13 129 156 500 338 14 226 135 464 338 14 21 1 81 267 +14404 /data/VOCdevkit/VOC2012/JPEGImages/2010_004698.jpg 500 375 14 382 37 452 131 14 258 109 500 375 14 1 140 356 375 14 1 39 233 286 +14405 /data/VOCdevkit/VOC2012/JPEGImages/2010_004703.jpg 500 375 14 184 143 250 325 14 257 143 328 324 14 310 194 367 307 15 359 256 409 286 15 395 191 450 229 +14406 /data/VOCdevkit/VOC2012/JPEGImages/2010_004704.jpg 500 375 16 197 149 262 214 16 48 183 133 263 +14407 /data/VOCdevkit/VOC2012/JPEGImages/2010_004708.jpg 500 375 14 280 96 456 375 14 70 11 219 375 14 1 161 17 362 +14408 /data/VOCdevkit/VOC2012/JPEGImages/2010_004710.jpg 500 375 16 293 206 500 341 14 14 11 254 375 +14409 /data/VOCdevkit/VOC2012/JPEGImages/2010_004712.jpg 500 375 7 233 89 322 183 8 99 129 166 203 15 136 106 164 134 +14410 /data/VOCdevkit/VOC2012/JPEGImages/2010_004714.jpg 500 374 3 237 198 453 245 3 216 196 365 230 3 179 194 319 216 3 152 189 287 208 +14411 /data/VOCdevkit/VOC2012/JPEGImages/2010_004717.jpg 360 480 7 58 85 171 472 +14412 /data/VOCdevkit/VOC2012/JPEGImages/2010_004721.jpg 500 375 0 1 97 500 368 +14413 /data/VOCdevkit/VOC2012/JPEGImages/2010_004722.jpg 500 333 11 171 88 500 332 14 59 14 268 333 +14414 /data/VOCdevkit/VOC2012/JPEGImages/2010_004726.jpg 500 376 8 197 168 236 203 10 168 151 265 255 +14415 /data/VOCdevkit/VOC2012/JPEGImages/2010_004728.jpg 500 375 14 136 65 297 375 14 145 87 316 375 +14416 /data/VOCdevkit/VOC2012/JPEGImages/2010_004729.jpg 500 333 0 8 106 495 233 +14417 /data/VOCdevkit/VOC2012/JPEGImages/2010_004730.jpg 500 374 11 60 44 494 354 +14418 /data/VOCdevkit/VOC2012/JPEGImages/2010_004733.jpg 375 500 11 162 50 374 405 +14419 /data/VOCdevkit/VOC2012/JPEGImages/2010_004735.jpg 410 500 5 1 1 410 491 +14420 /data/VOCdevkit/VOC2012/JPEGImages/2010_004738.jpg 347 500 11 1 107 255 396 8 3 2 347 500 +14421 /data/VOCdevkit/VOC2012/JPEGImages/2010_004741.jpg 500 375 17 95 95 330 228 14 310 152 418 363 14 303 124 363 250 14 181 112 263 251 14 85 142 199 316 10 149 227 344 343 10 25 305 298 375 +14422 /data/VOCdevkit/VOC2012/JPEGImages/2010_004743.jpg 359 500 14 45 54 256 500 +14423 /data/VOCdevkit/VOC2012/JPEGImages/2010_004747.jpg 500 339 6 14 95 484 266 +14424 /data/VOCdevkit/VOC2012/JPEGImages/2010_004748.jpg 500 375 0 156 64 344 256 +14425 /data/VOCdevkit/VOC2012/JPEGImages/2010_004749.jpg 500 375 11 1 1 500 375 +14426 /data/VOCdevkit/VOC2012/JPEGImages/2010_004750.jpg 500 331 11 43 37 500 331 11 84 126 381 308 +14427 /data/VOCdevkit/VOC2012/JPEGImages/2010_004751.jpg 375 500 10 1 205 375 500 4 182 243 208 342 4 249 216 277 300 4 258 167 277 227 +14428 /data/VOCdevkit/VOC2012/JPEGImages/2010_004753.jpg 500 375 7 6 95 486 359 8 47 1 500 375 +14429 /data/VOCdevkit/VOC2012/JPEGImages/2010_004756.jpg 400 500 11 66 32 286 465 +14430 /data/VOCdevkit/VOC2012/JPEGImages/2010_004757.jpg 500 375 15 78 24 397 350 17 1 1 500 146 +14431 /data/VOCdevkit/VOC2012/JPEGImages/2010_004760.jpg 375 500 11 275 26 374 298 7 76 195 266 425 +14432 /data/VOCdevkit/VOC2012/JPEGImages/2010_004763.jpg 500 365 8 319 1 500 306 8 1 128 169 295 8 1 1 325 363 8 349 35 441 271 +14433 /data/VOCdevkit/VOC2012/JPEGImages/2010_004765.jpg 500 333 17 1 11 500 332 +14434 /data/VOCdevkit/VOC2012/JPEGImages/2010_004766.jpg 500 375 13 9 11 458 326 +14435 /data/VOCdevkit/VOC2012/JPEGImages/2010_004768.jpg 333 500 7 116 122 232 420 +14436 /data/VOCdevkit/VOC2012/JPEGImages/2010_004770.jpg 500 375 11 80 32 500 359 +14437 /data/VOCdevkit/VOC2012/JPEGImages/2010_004772.jpg 500 333 3 47 1 500 333 +14438 /data/VOCdevkit/VOC2012/JPEGImages/2010_004773.jpg 375 500 14 206 333 242 374 14 250 289 286 367 3 35 1 375 403 +14439 /data/VOCdevkit/VOC2012/JPEGImages/2010_004775.jpg 500 375 14 1 142 187 375 14 285 105 500 375 8 206 224 297 351 +14440 /data/VOCdevkit/VOC2012/JPEGImages/2010_004777.jpg 500 333 2 201 144 260 199 2 251 144 298 193 +14441 /data/VOCdevkit/VOC2012/JPEGImages/2010_004778.jpg 500 375 4 237 165 252 220 8 1 223 153 375 8 318 286 500 375 14 88 87 229 357 14 231 72 357 193 14 291 82 424 244 14 266 76 500 375 14 1 88 212 375 10 148 166 388 375 +14442 /data/VOCdevkit/VOC2012/JPEGImages/2010_004779.jpg 500 375 14 39 198 67 237 18 33 87 408 327 +14443 /data/VOCdevkit/VOC2012/JPEGImages/2010_004782.jpg 500 375 14 139 28 438 375 14 39 141 249 375 6 1 71 50 156 6 159 52 192 86 6 119 60 147 84 +14444 /data/VOCdevkit/VOC2012/JPEGImages/2010_004783.jpg 500 375 8 402 152 500 306 8 1 179 115 347 17 144 142 353 309 +14445 /data/VOCdevkit/VOC2012/JPEGImages/2010_004785.jpg 500 375 6 83 91 433 309 6 1 84 123 163 14 33 44 51 84 6 94 52 123 79 6 63 52 96 77 +14446 /data/VOCdevkit/VOC2012/JPEGImages/2010_004786.jpg 500 375 14 163 37 461 375 14 48 49 279 375 8 5 83 309 375 4 208 154 241 240 8 31 110 155 201 +14447 /data/VOCdevkit/VOC2012/JPEGImages/2010_004789.jpg 500 375 9 78 69 357 327 9 110 72 162 94 +14448 /data/VOCdevkit/VOC2012/JPEGImages/2010_004791.jpg 500 321 0 125 91 467 216 +14449 /data/VOCdevkit/VOC2012/JPEGImages/2010_004792.jpg 500 375 11 1 1 499 375 +14450 /data/VOCdevkit/VOC2012/JPEGImages/2010_004793.jpg 500 375 8 153 232 218 292 8 281 232 393 304 8 1 310 73 375 8 180 336 360 375 10 1 282 500 375 +14451 /data/VOCdevkit/VOC2012/JPEGImages/2010_004795.jpg 500 375 11 153 135 329 241 +14452 /data/VOCdevkit/VOC2012/JPEGImages/2010_004797.jpg 500 375 11 125 231 347 310 +14453 /data/VOCdevkit/VOC2012/JPEGImages/2010_004804.jpg 500 375 11 126 86 500 375 +14454 /data/VOCdevkit/VOC2012/JPEGImages/2010_004805.jpg 500 375 8 265 183 377 314 17 1 158 242 289 19 239 128 284 170 +14455 /data/VOCdevkit/VOC2012/JPEGImages/2010_004806.jpg 500 224 5 21 38 463 186 +14456 /data/VOCdevkit/VOC2012/JPEGImages/2010_004807.jpg 500 375 11 45 122 400 341 11 234 47 467 167 +14457 /data/VOCdevkit/VOC2012/JPEGImages/2010_004808.jpg 375 500 7 37 63 333 392 +14458 /data/VOCdevkit/VOC2012/JPEGImages/2010_004809.jpg 500 333 1 222 208 348 285 14 262 173 318 284 +14459 /data/VOCdevkit/VOC2012/JPEGImages/2010_004812.jpg 500 347 16 230 129 445 316 16 117 106 215 229 16 149 49 205 112 16 94 46 161 114 +14460 /data/VOCdevkit/VOC2012/JPEGImages/2010_004813.jpg 236 315 8 11 14 224 304 +14461 /data/VOCdevkit/VOC2012/JPEGImages/2010_004815.jpg 375 500 7 65 207 207 500 +14462 /data/VOCdevkit/VOC2012/JPEGImages/2010_004816.jpg 500 375 19 1 1 135 144 7 190 108 479 326 +14463 /data/VOCdevkit/VOC2012/JPEGImages/2010_004817.jpg 333 500 0 1 225 245 310 +14464 /data/VOCdevkit/VOC2012/JPEGImages/2010_004821.jpg 500 333 2 130 104 172 180 +14465 /data/VOCdevkit/VOC2012/JPEGImages/2010_004822.jpg 375 500 7 1 1 374 500 +14466 /data/VOCdevkit/VOC2012/JPEGImages/2010_004824.jpg 375 500 6 139 291 345 382 +14467 /data/VOCdevkit/VOC2012/JPEGImages/2010_004825.jpg 375 500 10 85 286 363 472 8 125 252 264 500 8 52 234 141 428 15 72 153 106 244 15 177 158 204 242 +14468 /data/VOCdevkit/VOC2012/JPEGImages/2010_004826.jpg 500 333 18 1 131 324 202 +14469 /data/VOCdevkit/VOC2012/JPEGImages/2010_004828.jpg 500 375 4 327 1 383 210 4 147 1 210 217 14 405 1 500 211 +14470 /data/VOCdevkit/VOC2012/JPEGImages/2010_004829.jpg 500 375 7 132 1 500 375 +14471 /data/VOCdevkit/VOC2012/JPEGImages/2010_004830.jpg 354 500 11 174 112 280 241 11 21 118 149 288 +14472 /data/VOCdevkit/VOC2012/JPEGImages/2010_004831.jpg 500 375 1 39 8 460 338 +14473 /data/VOCdevkit/VOC2012/JPEGImages/2010_004832.jpg 500 375 11 47 46 332 375 +14474 /data/VOCdevkit/VOC2012/JPEGImages/2010_004836.jpg 500 375 19 111 70 372 267 +14475 /data/VOCdevkit/VOC2012/JPEGImages/2010_004838.jpg 500 375 14 1 1 443 375 +14476 /data/VOCdevkit/VOC2012/JPEGImages/2010_004841.jpg 500 375 7 107 15 460 248 +14477 /data/VOCdevkit/VOC2012/JPEGImages/2010_004844.jpg 500 375 14 172 305 204 371 5 286 249 500 365 13 90 325 178 372 6 181 317 283 358 14 24 306 41 340 14 121 309 151 368 14 139 306 174 363 14 173 309 205 370 13 182 332 215 365 +14478 /data/VOCdevkit/VOC2012/JPEGImages/2010_004847.jpg 500 375 2 93 32 500 375 +14479 /data/VOCdevkit/VOC2012/JPEGImages/2010_004848.jpg 500 375 13 90 54 417 344 +14480 /data/VOCdevkit/VOC2012/JPEGImages/2010_004849.jpg 500 375 11 166 101 500 365 +14481 /data/VOCdevkit/VOC2012/JPEGImages/2010_004852.jpg 500 333 3 38 38 500 301 3 1 48 211 130 3 278 92 414 124 +14482 /data/VOCdevkit/VOC2012/JPEGImages/2010_004854.jpg 500 333 6 159 11 285 66 13 173 65 315 135 14 101 23 155 142 +14483 /data/VOCdevkit/VOC2012/JPEGImages/2010_004855.jpg 500 356 0 85 113 420 207 0 445 139 500 189 +14484 /data/VOCdevkit/VOC2012/JPEGImages/2010_004856.jpg 500 357 12 55 42 500 357 +14485 /data/VOCdevkit/VOC2012/JPEGImages/2010_004857.jpg 500 375 19 142 61 265 180 19 5 85 85 228 +14486 /data/VOCdevkit/VOC2012/JPEGImages/2010_004861.jpg 500 333 7 152 3 424 327 +14487 /data/VOCdevkit/VOC2012/JPEGImages/2010_004865.jpg 360 270 6 35 72 311 224 +14488 /data/VOCdevkit/VOC2012/JPEGImages/2010_004866.jpg 500 333 4 169 96 228 295 +14489 /data/VOCdevkit/VOC2012/JPEGImages/2010_004868.jpg 500 333 16 285 158 500 308 16 124 89 286 321 +14490 /data/VOCdevkit/VOC2012/JPEGImages/2010_004871.jpg 500 375 3 349 175 394 190 3 410 147 475 188 +14491 /data/VOCdevkit/VOC2012/JPEGImages/2010_004874.jpg 500 333 7 78 1 349 333 +14492 /data/VOCdevkit/VOC2012/JPEGImages/2010_004877.jpg 500 381 6 47 116 413 307 14 100 85 173 372 6 1 110 169 267 +14493 /data/VOCdevkit/VOC2012/JPEGImages/2010_004878.jpg 381 500 1 1 156 362 489 14 183 28 312 475 14 78 34 216 376 +14494 /data/VOCdevkit/VOC2012/JPEGImages/2010_004879.jpg 328 500 8 142 295 199 400 14 1 256 26 334 +14495 /data/VOCdevkit/VOC2012/JPEGImages/2010_004888.jpg 500 333 0 85 24 407 317 +14496 /data/VOCdevkit/VOC2012/JPEGImages/2010_004889.jpg 500 346 8 114 44 500 346 8 1 1 206 122 8 1 1 124 117 14 1 41 198 226 14 35 10 280 113 14 15 28 326 240 14 66 36 379 295 14 181 41 477 346 +14497 /data/VOCdevkit/VOC2012/JPEGImages/2010_004890.jpg 500 375 6 7 10 500 364 +14498 /data/VOCdevkit/VOC2012/JPEGImages/2010_004891.jpg 500 333 7 101 106 373 222 +14499 /data/VOCdevkit/VOC2012/JPEGImages/2010_004894.jpg 500 375 1 103 45 401 339 13 202 13 500 281 4 339 17 369 60 +14500 /data/VOCdevkit/VOC2012/JPEGImages/2010_004896.jpg 500 377 11 37 27 500 347 +14501 /data/VOCdevkit/VOC2012/JPEGImages/2010_004900.jpg 500 333 11 1 84 399 333 +14502 /data/VOCdevkit/VOC2012/JPEGImages/2010_004901.jpg 500 375 11 333 214 391 252 11 288 231 335 270 11 89 159 161 203 14 225 66 305 271 +14503 /data/VOCdevkit/VOC2012/JPEGImages/2010_004903.jpg 375 500 5 1 40 358 412 +14504 /data/VOCdevkit/VOC2012/JPEGImages/2010_004906.jpg 500 375 2 15 121 274 328 +14505 /data/VOCdevkit/VOC2012/JPEGImages/2010_004908.jpg 500 500 11 160 173 346 383 15 241 1 395 252 15 100 1 244 236 15 126 142 240 235 +14506 /data/VOCdevkit/VOC2012/JPEGImages/2010_004909.jpg 500 375 10 1 140 464 375 8 430 218 500 374 8 328 107 405 156 8 18 153 113 254 8 91 127 170 216 4 248 137 280 225 +14507 /data/VOCdevkit/VOC2012/JPEGImages/2010_004910.jpg 500 375 14 155 63 403 323 15 208 55 255 177 8 373 173 464 311 10 1 239 500 375 +14508 /data/VOCdevkit/VOC2012/JPEGImages/2010_004913.jpg 500 378 12 121 168 147 184 +14509 /data/VOCdevkit/VOC2012/JPEGImages/2010_004916.jpg 500 413 11 45 36 444 363 +14510 /data/VOCdevkit/VOC2012/JPEGImages/2010_004917.jpg 500 350 0 299 190 377 268 +14511 /data/VOCdevkit/VOC2012/JPEGImages/2010_004918.jpg 500 362 7 129 16 426 362 +14512 /data/VOCdevkit/VOC2012/JPEGImages/2010_004919.jpg 500 375 11 165 58 337 310 +14513 /data/VOCdevkit/VOC2012/JPEGImages/2010_004921.jpg 500 288 1 195 180 264 235 1 456 166 500 212 14 214 152 247 219 14 470 146 500 208 +14514 /data/VOCdevkit/VOC2012/JPEGImages/2010_004922.jpg 500 375 14 199 212 298 375 14 155 237 214 320 12 165 270 214 364 +14515 /data/VOCdevkit/VOC2012/JPEGImages/2010_004928.jpg 500 375 11 113 55 474 374 +14516 /data/VOCdevkit/VOC2012/JPEGImages/2010_004930.jpg 500 332 6 108 102 354 278 +14517 /data/VOCdevkit/VOC2012/JPEGImages/2010_004931.jpg 500 375 11 7 100 500 334 +14518 /data/VOCdevkit/VOC2012/JPEGImages/2010_004933.jpg 394 500 7 16 43 371 495 15 172 1 246 38 +14519 /data/VOCdevkit/VOC2012/JPEGImages/2010_004937.jpg 500 358 14 400 190 450 281 14 244 217 287 268 10 49 263 137 353 +14520 /data/VOCdevkit/VOC2012/JPEGImages/2010_004938.jpg 500 375 0 36 145 476 245 +14521 /data/VOCdevkit/VOC2012/JPEGImages/2010_004941.jpg 333 500 13 22 115 310 474 +14522 /data/VOCdevkit/VOC2012/JPEGImages/2010_004942.jpg 500 375 10 177 218 500 375 14 197 21 369 264 14 367 121 466 233 14 23 211 141 345 4 461 166 494 241 8 18 277 195 375 +14523 /data/VOCdevkit/VOC2012/JPEGImages/2010_004943.jpg 500 334 6 313 152 390 184 +14524 /data/VOCdevkit/VOC2012/JPEGImages/2010_004944.jpg 500 375 19 1 113 122 258 15 350 175 411 207 15 234 140 276 165 15 291 84 359 115 15 349 1 466 87 15 243 26 281 46 +14525 /data/VOCdevkit/VOC2012/JPEGImages/2010_004945.jpg 500 333 11 82 1 423 333 +14526 /data/VOCdevkit/VOC2012/JPEGImages/2010_004946.jpg 375 500 6 37 165 331 423 +14527 /data/VOCdevkit/VOC2012/JPEGImages/2010_004948.jpg 375 500 2 128 172 243 312 +14528 /data/VOCdevkit/VOC2012/JPEGImages/2010_004950.jpg 500 375 3 248 178 383 211 +14529 /data/VOCdevkit/VOC2012/JPEGImages/2010_004951.jpg 375 500 14 228 140 266 242 +14530 /data/VOCdevkit/VOC2012/JPEGImages/2010_004952.jpg 500 325 8 238 78 332 325 14 1 83 236 325 14 285 33 481 325 +14531 /data/VOCdevkit/VOC2012/JPEGImages/2010_004953.jpg 500 333 2 181 43 327 298 +14532 /data/VOCdevkit/VOC2012/JPEGImages/2010_004954.jpg 375 500 7 55 44 286 497 +14533 /data/VOCdevkit/VOC2012/JPEGImages/2010_004957.jpg 375 500 11 67 62 356 500 +14534 /data/VOCdevkit/VOC2012/JPEGImages/2010_004959.jpg 500 375 11 1 1 486 375 +14535 /data/VOCdevkit/VOC2012/JPEGImages/2010_004960.jpg 500 333 2 240 143 303 238 +14536 /data/VOCdevkit/VOC2012/JPEGImages/2010_004962.jpg 334 500 8 138 170 297 485 +14537 /data/VOCdevkit/VOC2012/JPEGImages/2010_004963.jpg 500 375 7 34 32 498 375 +14538 /data/VOCdevkit/VOC2012/JPEGImages/2010_004966.jpg 500 358 6 327 187 406 216 6 221 180 267 194 6 483 199 500 227 0 182 99 318 150 +14539 /data/VOCdevkit/VOC2012/JPEGImages/2010_004967.jpg 500 375 11 143 1 413 256 +14540 /data/VOCdevkit/VOC2012/JPEGImages/2010_004968.jpg 333 500 7 124 289 333 436 +14541 /data/VOCdevkit/VOC2012/JPEGImages/2010_004970.jpg 500 375 11 148 131 381 264 +14542 /data/VOCdevkit/VOC2012/JPEGImages/2010_004971.jpg 500 362 5 102 25 477 318 5 3 155 103 252 +14543 /data/VOCdevkit/VOC2012/JPEGImages/2010_004973.jpg 500 375 7 20 87 446 215 14 1 1 500 375 +14544 /data/VOCdevkit/VOC2012/JPEGImages/2010_004974.jpg 375 500 15 1 1 373 500 +14545 /data/VOCdevkit/VOC2012/JPEGImages/2010_004980.jpg 500 324 18 208 91 420 271 +14546 /data/VOCdevkit/VOC2012/JPEGImages/2010_004982.jpg 366 500 19 38 37 136 142 8 286 110 366 259 15 124 40 297 500 +14547 /data/VOCdevkit/VOC2012/JPEGImages/2010_004983.jpg 500 331 10 2 184 405 331 8 443 183 498 330 14 1 93 170 325 14 116 139 176 219 14 313 108 500 331 14 446 71 500 140 4 213 162 236 222 4 204 152 220 213 +14548 /data/VOCdevkit/VOC2012/JPEGImages/2010_004987.jpg 500 375 14 137 46 214 170 14 1 61 205 375 14 282 41 500 375 10 19 142 365 375 +14549 /data/VOCdevkit/VOC2012/JPEGImages/2010_004989.jpg 500 375 11 138 34 472 246 +14550 /data/VOCdevkit/VOC2012/JPEGImages/2010_004991.jpg 500 333 0 163 140 358 212 +14551 /data/VOCdevkit/VOC2012/JPEGImages/2010_004992.jpg 375 500 8 161 249 371 490 8 236 55 375 324 8 80 32 224 300 10 67 89 371 373 +14552 /data/VOCdevkit/VOC2012/JPEGImages/2010_004994.jpg 500 375 2 42 86 167 343 2 217 102 340 375 2 371 109 487 375 +14553 /data/VOCdevkit/VOC2012/JPEGImages/2010_004995.jpg 375 500 14 5 87 77 200 14 273 96 325 297 13 1 140 144 500 13 1 110 254 348 13 154 150 270 279 6 171 149 372 221 +14554 /data/VOCdevkit/VOC2012/JPEGImages/2010_004997.jpg 500 375 5 51 87 415 266 +14555 /data/VOCdevkit/VOC2012/JPEGImages/2010_004998.jpg 500 375 0 32 123 444 269 +14556 /data/VOCdevkit/VOC2012/JPEGImages/2010_005000.jpg 333 500 1 1 18 295 500 +14557 /data/VOCdevkit/VOC2012/JPEGImages/2010_005002.jpg 400 300 16 217 158 325 257 16 51 140 99 205 16 19 131 65 178 +14558 /data/VOCdevkit/VOC2012/JPEGImages/2010_005005.jpg 500 375 14 1 59 246 374 14 218 55 500 375 +14559 /data/VOCdevkit/VOC2012/JPEGImages/2010_005006.jpg 500 375 7 16 1 500 375 +14560 /data/VOCdevkit/VOC2012/JPEGImages/2010_005008.jpg 500 375 11 253 74 361 209 8 151 1 295 98 +14561 /data/VOCdevkit/VOC2012/JPEGImages/2010_005011.jpg 332 500 11 1 252 332 500 +14562 /data/VOCdevkit/VOC2012/JPEGImages/2010_005013.jpg 500 273 6 342 10 493 70 +14563 /data/VOCdevkit/VOC2012/JPEGImages/2010_005016.jpg 500 375 2 7 85 496 355 +14564 /data/VOCdevkit/VOC2012/JPEGImages/2010_005017.jpg 375 500 7 1 1 374 500 +14565 /data/VOCdevkit/VOC2012/JPEGImages/2010_005018.jpg 500 375 11 26 76 234 375 14 40 1 500 375 +14566 /data/VOCdevkit/VOC2012/JPEGImages/2010_005019.jpg 500 384 12 78 107 452 350 14 212 40 288 240 6 424 152 500 188 +14567 /data/VOCdevkit/VOC2012/JPEGImages/2010_005021.jpg 500 375 7 1 82 482 375 8 100 1 500 375 +14568 /data/VOCdevkit/VOC2012/JPEGImages/2010_005022.jpg 500 333 0 11 63 491 235 +14569 /data/VOCdevkit/VOC2012/JPEGImages/2010_005023.jpg 500 333 2 146 145 263 214 +14570 /data/VOCdevkit/VOC2012/JPEGImages/2010_005026.jpg 500 375 16 1 50 500 374 14 426 1 471 39 14 393 1 435 41 14 263 1 303 47 +14571 /data/VOCdevkit/VOC2012/JPEGImages/2010_005028.jpg 500 385 2 216 138 268 183 +14572 /data/VOCdevkit/VOC2012/JPEGImages/2010_005031.jpg 432 463 9 240 193 407 463 9 1 165 191 313 14 15 129 127 364 +14573 /data/VOCdevkit/VOC2012/JPEGImages/2010_005033.jpg 500 375 11 316 1 500 292 11 31 206 289 369 +14574 /data/VOCdevkit/VOC2012/JPEGImages/2010_005035.jpg 500 332 7 87 103 371 332 +14575 /data/VOCdevkit/VOC2012/JPEGImages/2010_005041.jpg 500 400 5 146 100 355 252 6 425 201 499 258 6 348 204 422 250 14 75 195 111 261 14 93 200 110 263 +14576 /data/VOCdevkit/VOC2012/JPEGImages/2010_005042.jpg 500 354 11 2 1 499 318 +14577 /data/VOCdevkit/VOC2012/JPEGImages/2010_005044.jpg 375 500 14 84 60 303 483 8 90 127 327 500 +14578 /data/VOCdevkit/VOC2012/JPEGImages/2010_005046.jpg 480 399 10 1 303 467 398 14 23 66 238 362 14 38 49 447 372 +14579 /data/VOCdevkit/VOC2012/JPEGImages/2010_005048.jpg 500 375 7 209 71 396 169 7 188 217 329 375 +14580 /data/VOCdevkit/VOC2012/JPEGImages/2010_005049.jpg 500 375 11 169 97 395 364 14 49 18 300 375 17 1 103 276 375 19 431 48 500 144 +14581 /data/VOCdevkit/VOC2012/JPEGImages/2010_005052.jpg 375 500 8 25 4 325 500 +14582 /data/VOCdevkit/VOC2012/JPEGImages/2010_005053.jpg 500 333 2 87 87 256 223 2 61 100 448 219 +14583 /data/VOCdevkit/VOC2012/JPEGImages/2010_005054.jpg 500 111 19 86 34 121 70 17 318 42 427 111 17 1 70 98 111 +14584 /data/VOCdevkit/VOC2012/JPEGImages/2010_005055.jpg 500 333 18 51 49 500 293 +14585 /data/VOCdevkit/VOC2012/JPEGImages/2010_005059.jpg 500 375 0 167 148 315 243 +14586 /data/VOCdevkit/VOC2012/JPEGImages/2010_005060.jpg 500 395 11 1 1 500 395 +14587 /data/VOCdevkit/VOC2012/JPEGImages/2010_005061.jpg 370 500 9 240 401 299 443 9 190 401 249 435 9 185 399 218 448 9 99 394 163 433 +14588 /data/VOCdevkit/VOC2012/JPEGImages/2010_005062.jpg 500 333 9 1 102 295 303 9 416 168 499 311 +14589 /data/VOCdevkit/VOC2012/JPEGImages/2010_005063.jpg 500 375 5 404 147 500 221 5 358 141 405 216 5 223 136 363 224 5 180 147 231 209 5 86 139 182 226 5 1 142 82 232 +14590 /data/VOCdevkit/VOC2012/JPEGImages/2010_005064.jpg 352 288 11 227 82 352 274 11 18 74 205 270 +14591 /data/VOCdevkit/VOC2012/JPEGImages/2010_005066.jpg 500 375 16 187 60 318 264 +14592 /data/VOCdevkit/VOC2012/JPEGImages/2010_005068.jpg 500 375 2 13 89 425 375 +14593 /data/VOCdevkit/VOC2012/JPEGImages/2010_005071.jpg 500 334 14 1 1 267 275 19 268 1 437 117 +14594 /data/VOCdevkit/VOC2012/JPEGImages/2010_005072.jpg 500 375 7 184 143 292 197 +14595 /data/VOCdevkit/VOC2012/JPEGImages/2010_005075.jpg 500 375 6 1 87 307 352 6 109 66 500 300 +14596 /data/VOCdevkit/VOC2012/JPEGImages/2010_005079.jpg 500 375 14 1 109 382 375 4 182 200 223 259 +14597 /data/VOCdevkit/VOC2012/JPEGImages/2010_005080.jpg 500 375 5 243 143 369 280 5 43 125 232 277 5 380 173 448 248 +14598 /data/VOCdevkit/VOC2012/JPEGImages/2010_005082.jpg 500 500 7 1 1 500 500 +14599 /data/VOCdevkit/VOC2012/JPEGImages/2010_005083.jpg 445 500 11 17 23 430 500 +14600 /data/VOCdevkit/VOC2012/JPEGImages/2010_005087.jpg 500 375 6 1 1 500 375 +14601 /data/VOCdevkit/VOC2012/JPEGImages/2010_005090.jpg 500 334 11 89 17 435 329 +14602 /data/VOCdevkit/VOC2012/JPEGImages/2010_005093.jpg 500 334 1 20 3 490 323 +14603 /data/VOCdevkit/VOC2012/JPEGImages/2010_005094.jpg 500 369 8 1 17 249 328 8 331 1 500 272 10 175 31 439 369 +14604 /data/VOCdevkit/VOC2012/JPEGImages/2010_005096.jpg 500 375 2 1 53 321 290 +14605 /data/VOCdevkit/VOC2012/JPEGImages/2010_005098.jpg 500 375 16 60 126 412 375 16 83 34 484 305 +14606 /data/VOCdevkit/VOC2012/JPEGImages/2010_005099.jpg 375 500 7 55 8 375 500 +14607 /data/VOCdevkit/VOC2012/JPEGImages/2010_005100.jpg 500 333 13 11 6 468 333 +14608 /data/VOCdevkit/VOC2012/JPEGImages/2010_005101.jpg 500 375 0 94 145 386 231 +14609 /data/VOCdevkit/VOC2012/JPEGImages/2010_005106.jpg 500 375 0 80 148 500 281 14 1 181 22 250 +14610 /data/VOCdevkit/VOC2012/JPEGImages/2010_005107.jpg 334 500 12 145 76 328 427 +14611 /data/VOCdevkit/VOC2012/JPEGImages/2010_005108.jpg 500 325 7 1 41 414 325 +14612 /data/VOCdevkit/VOC2012/JPEGImages/2010_005109.jpg 202 418 11 8 11 193 415 +14613 /data/VOCdevkit/VOC2012/JPEGImages/2010_005110.jpg 500 375 14 219 160 500 375 14 1 20 500 375 +14614 /data/VOCdevkit/VOC2012/JPEGImages/2010_005111.jpg 500 375 1 90 144 349 338 14 273 57 361 294 4 237 207 267 245 +14615 /data/VOCdevkit/VOC2012/JPEGImages/2010_005115.jpg 500 334 7 63 86 479 281 +14616 /data/VOCdevkit/VOC2012/JPEGImages/2010_005116.jpg 500 375 1 32 84 498 375 +14617 /data/VOCdevkit/VOC2012/JPEGImages/2010_005118.jpg 500 406 5 40 85 420 339 14 155 182 210 365 14 141 188 190 345 +14618 /data/VOCdevkit/VOC2012/JPEGImages/2010_005119.jpg 448 297 6 64 60 435 224 +14619 /data/VOCdevkit/VOC2012/JPEGImages/2010_005120.jpg 500 375 16 261 153 393 278 16 186 174 334 297 16 17 184 200 311 +14620 /data/VOCdevkit/VOC2012/JPEGImages/2010_005123.jpg 500 375 5 117 194 218 244 +14621 /data/VOCdevkit/VOC2012/JPEGImages/2010_005127.jpg 500 333 14 149 28 369 323 +14622 /data/VOCdevkit/VOC2012/JPEGImages/2010_005128.jpg 500 375 7 76 123 396 282 +14623 /data/VOCdevkit/VOC2012/JPEGImages/2010_005129.jpg 375 500 2 167 173 227 313 +14624 /data/VOCdevkit/VOC2012/JPEGImages/2010_005130.jpg 500 334 18 34 83 383 232 +14625 /data/VOCdevkit/VOC2012/JPEGImages/2010_005133.jpg 500 375 4 447 91 477 197 4 414 85 451 196 19 99 115 376 332 +14626 /data/VOCdevkit/VOC2012/JPEGImages/2010_005134.jpg 500 451 11 72 10 500 429 +14627 /data/VOCdevkit/VOC2012/JPEGImages/2010_005136.jpg 500 333 13 20 1 499 333 +14628 /data/VOCdevkit/VOC2012/JPEGImages/2010_005138.jpg 500 375 11 285 180 412 318 +14629 /data/VOCdevkit/VOC2012/JPEGImages/2010_005141.jpg 500 375 14 324 122 457 375 14 1 144 236 375 14 33 126 323 375 +14630 /data/VOCdevkit/VOC2012/JPEGImages/2010_005143.jpg 375 500 7 1 1 374 473 +14631 /data/VOCdevkit/VOC2012/JPEGImages/2010_005147.jpg 500 333 6 1 119 500 333 +14632 /data/VOCdevkit/VOC2012/JPEGImages/2010_005148.jpg 500 375 14 233 103 336 285 +14633 /data/VOCdevkit/VOC2012/JPEGImages/2010_005149.jpg 375 500 11 22 57 325 492 +14634 /data/VOCdevkit/VOC2012/JPEGImages/2010_005152.jpg 500 375 2 1 1 500 375 +14635 /data/VOCdevkit/VOC2012/JPEGImages/2010_005155.jpg 500 375 4 1 142 71 375 +14636 /data/VOCdevkit/VOC2012/JPEGImages/2010_005158.jpg 500 375 19 59 103 420 333 15 414 128 500 332 4 419 313 441 375 +14637 /data/VOCdevkit/VOC2012/JPEGImages/2010_005159.jpg 424 500 11 39 20 424 500 +14638 /data/VOCdevkit/VOC2012/JPEGImages/2010_005160.jpg 500 375 16 253 162 350 242 13 98 147 306 334 13 322 141 496 343 13 45 111 115 273 5 1 1 212 90 +14639 /data/VOCdevkit/VOC2012/JPEGImages/2010_005161.jpg 500 375 7 2 19 316 301 +14640 /data/VOCdevkit/VOC2012/JPEGImages/2010_005164.jpg 500 375 15 456 198 500 263 +14641 /data/VOCdevkit/VOC2012/JPEGImages/2010_005166.jpg 500 274 9 193 129 354 242 14 442 1 500 162 14 116 21 209 210 14 164 27 253 129 14 253 35 325 164 14 314 42 387 153 +14642 /data/VOCdevkit/VOC2012/JPEGImages/2010_005167.jpg 500 375 0 36 133 260 258 6 1 323 118 375 +14643 /data/VOCdevkit/VOC2012/JPEGImages/2010_005169.jpg 500 375 11 182 94 296 375 +14644 /data/VOCdevkit/VOC2012/JPEGImages/2010_005170.jpg 500 375 8 335 260 441 375 8 71 226 181 341 10 43 308 381 375 14 201 170 259 302 17 2 173 175 247 8 126 143 178 182 +14645 /data/VOCdevkit/VOC2012/JPEGImages/2010_005174.jpg 500 375 12 17 28 409 369 +14646 /data/VOCdevkit/VOC2012/JPEGImages/2010_005180.jpg 500 375 17 344 220 500 375 19 157 168 221 218 +14647 /data/VOCdevkit/VOC2012/JPEGImages/2010_005182.jpg 500 375 13 27 1 500 375 +14648 /data/VOCdevkit/VOC2012/JPEGImages/2010_005183.jpg 500 375 16 172 161 268 247 16 177 162 274 233 +14649 /data/VOCdevkit/VOC2012/JPEGImages/2010_005184.jpg 500 375 0 53 120 350 242 +14650 /data/VOCdevkit/VOC2012/JPEGImages/2010_005185.jpg 400 500 7 54 31 374 483 +14651 /data/VOCdevkit/VOC2012/JPEGImages/2010_005187.jpg 500 216 15 377 87 480 203 15 260 99 369 205 15 136 94 245 208 15 18 96 125 209 +14652 /data/VOCdevkit/VOC2012/JPEGImages/2010_005188.jpg 500 375 8 159 147 324 364 14 164 85 442 375 +14653 /data/VOCdevkit/VOC2012/JPEGImages/2010_005190.jpg 375 500 19 31 186 165 326 +14654 /data/VOCdevkit/VOC2012/JPEGImages/2010_005192.jpg 500 375 3 18 128 500 306 +14655 /data/VOCdevkit/VOC2012/JPEGImages/2010_005193.jpg 375 500 17 1 23 354 369 7 116 150 271 211 +14656 /data/VOCdevkit/VOC2012/JPEGImages/2010_005198.jpg 500 334 3 1 194 500 333 +14657 /data/VOCdevkit/VOC2012/JPEGImages/2010_005199.jpg 461 346 13 164 98 443 327 14 260 74 329 285 14 300 83 371 294 +14658 /data/VOCdevkit/VOC2012/JPEGImages/2010_005201.jpg 500 375 11 1 33 450 374 +14659 /data/VOCdevkit/VOC2012/JPEGImages/2010_005202.jpg 500 333 7 181 125 500 333 +14660 /data/VOCdevkit/VOC2012/JPEGImages/2010_005206.jpg 500 375 11 1 100 343 374 +14661 /data/VOCdevkit/VOC2012/JPEGImages/2010_005208.jpg 500 375 7 1 34 334 223 +14662 /data/VOCdevkit/VOC2012/JPEGImages/2010_005211.jpg 500 375 1 31 40 482 322 6 431 1 500 51 +14663 /data/VOCdevkit/VOC2012/JPEGImages/2010_005213.jpg 500 333 0 52 113 403 215 +14664 /data/VOCdevkit/VOC2012/JPEGImages/2010_005215.jpg 500 375 11 1 1 430 375 +14665 /data/VOCdevkit/VOC2012/JPEGImages/2010_005216.jpg 266 400 7 33 74 256 371 +14666 /data/VOCdevkit/VOC2012/JPEGImages/2010_005217.jpg 500 333 2 47 96 467 286 +14667 /data/VOCdevkit/VOC2012/JPEGImages/2010_005222.jpg 500 362 8 323 149 462 362 8 120 132 223 270 14 87 9 195 254 7 284 209 346 287 14 109 40 275 269 +14668 /data/VOCdevkit/VOC2012/JPEGImages/2010_005223.jpg 500 333 9 288 132 450 267 9 187 143 295 269 9 61 138 204 267 9 27 147 97 260 +14669 /data/VOCdevkit/VOC2012/JPEGImages/2010_005224.jpg 349 500 0 135 24 188 61 0 31 241 275 325 +14670 /data/VOCdevkit/VOC2012/JPEGImages/2010_005226.jpg 500 375 6 83 150 144 184 6 210 141 230 159 1 376 188 435 300 14 380 128 436 273 +14671 /data/VOCdevkit/VOC2012/JPEGImages/2010_005229.jpg 293 400 11 62 83 282 400 +14672 /data/VOCdevkit/VOC2012/JPEGImages/2010_005230.jpg 500 375 7 1 103 352 278 +14673 /data/VOCdevkit/VOC2012/JPEGImages/2010_005232.jpg 500 311 7 14 45 481 269 +14674 /data/VOCdevkit/VOC2012/JPEGImages/2010_005236.jpg 375 500 6 1 74 374 500 14 88 102 214 189 +14675 /data/VOCdevkit/VOC2012/JPEGImages/2010_005238.jpg 396 472 8 1 49 395 472 7 102 202 293 278 +14676 /data/VOCdevkit/VOC2012/JPEGImages/2010_005239.jpg 375 500 7 217 119 310 211 19 100 324 297 456 19 121 192 309 330 +14677 /data/VOCdevkit/VOC2012/JPEGImages/2010_005241.jpg 399 500 7 53 75 399 500 +14678 /data/VOCdevkit/VOC2012/JPEGImages/2010_005242.jpg 500 375 11 91 129 363 338 11 268 115 410 235 +14679 /data/VOCdevkit/VOC2012/JPEGImages/2010_005243.jpg 500 333 12 88 94 152 252 8 175 241 322 333 19 397 91 456 140 14 333 58 400 189 14 411 203 500 333 14 339 136 367 190 14 279 136 359 333 14 179 180 307 333 +14680 /data/VOCdevkit/VOC2012/JPEGImages/2010_005245.jpg 367 500 11 145 233 201 339 14 155 160 213 312 +14681 /data/VOCdevkit/VOC2012/JPEGImages/2010_005246.jpg 500 375 11 47 1 472 375 +14682 /data/VOCdevkit/VOC2012/JPEGImages/2010_005250.jpg 500 375 7 117 1 500 375 +14683 /data/VOCdevkit/VOC2012/JPEGImages/2010_005252.jpg 500 381 14 371 170 447 250 14 282 170 388 276 13 1 145 258 277 3 352 187 495 353 +14684 /data/VOCdevkit/VOC2012/JPEGImages/2010_005253.jpg 500 375 11 134 189 327 301 +14685 /data/VOCdevkit/VOC2012/JPEGImages/2010_005257.jpg 375 500 7 38 225 183 339 +14686 /data/VOCdevkit/VOC2012/JPEGImages/2010_005258.jpg 500 375 9 1 1 371 375 +14687 /data/VOCdevkit/VOC2012/JPEGImages/2010_005260.jpg 500 335 16 38 133 339 269 +14688 /data/VOCdevkit/VOC2012/JPEGImages/2010_005261.jpg 500 375 6 3 91 210 199 6 25 28 477 311 14 14 47 31 94 +14689 /data/VOCdevkit/VOC2012/JPEGImages/2010_005264.jpg 500 333 7 1 1 374 333 +14690 /data/VOCdevkit/VOC2012/JPEGImages/2010_005266.jpg 500 375 8 116 29 500 374 +14691 /data/VOCdevkit/VOC2012/JPEGImages/2010_005268.jpg 500 335 0 36 34 455 275 +14692 /data/VOCdevkit/VOC2012/JPEGImages/2010_005270.jpg 500 375 12 179 175 261 315 12 159 169 323 299 12 277 212 339 295 11 107 251 150 293 14 227 139 264 228 14 280 150 310 249 14 165 146 247 269 +14693 /data/VOCdevkit/VOC2012/JPEGImages/2010_005272.jpg 500 333 13 40 1 499 331 +14694 /data/VOCdevkit/VOC2012/JPEGImages/2010_005273.jpg 500 375 10 1 238 500 375 14 85 66 194 259 8 206 195 275 277 14 229 142 354 305 14 320 96 482 350 +14695 /data/VOCdevkit/VOC2012/JPEGImages/2010_005274.jpg 500 500 11 42 89 446 398 15 1 1 136 310 +14696 /data/VOCdevkit/VOC2012/JPEGImages/2010_005275.jpg 328 500 7 54 20 290 483 +14697 /data/VOCdevkit/VOC2012/JPEGImages/2010_005276.jpg 500 281 9 188 56 249 230 14 192 72 372 281 14 188 1 344 207 14 353 1 366 28 +14698 /data/VOCdevkit/VOC2012/JPEGImages/2010_005277.jpg 500 312 5 32 67 439 253 +14699 /data/VOCdevkit/VOC2012/JPEGImages/2010_005279.jpg 375 500 15 1 1 346 411 15 1 1 217 169 +14700 /data/VOCdevkit/VOC2012/JPEGImages/2010_005284.jpg 500 333 5 87 25 411 268 6 423 163 464 203 14 207 114 260 160 14 456 156 480 220 14 59 142 81 203 14 40 143 61 205 14 14 146 38 209 +14701 /data/VOCdevkit/VOC2012/JPEGImages/2010_005285.jpg 333 500 16 38 73 318 386 +14702 /data/VOCdevkit/VOC2012/JPEGImages/2010_005287.jpg 500 375 7 1 1 364 375 +14703 /data/VOCdevkit/VOC2012/JPEGImages/2010_005292.jpg 500 334 11 1 1 500 334 +14704 /data/VOCdevkit/VOC2012/JPEGImages/2010_005293.jpg 500 375 14 296 208 500 375 14 60 233 233 375 +14705 /data/VOCdevkit/VOC2012/JPEGImages/2010_005297.jpg 500 375 9 336 105 397 140 9 218 173 255 219 9 77 183 139 218 +14706 /data/VOCdevkit/VOC2012/JPEGImages/2010_005299.jpg 500 345 14 79 1 495 345 +14707 /data/VOCdevkit/VOC2012/JPEGImages/2010_005301.jpg 500 338 0 20 79 493 221 0 104 60 196 100 0 161 75 255 111 0 250 76 340 104 0 328 74 406 97 0 396 70 463 97 +14708 /data/VOCdevkit/VOC2012/JPEGImages/2010_005303.jpg 375 500 14 1 247 375 500 14 118 1 375 384 +14709 /data/VOCdevkit/VOC2012/JPEGImages/2010_005305.jpg 500 312 19 1 1 199 76 15 460 1 500 107 +14710 /data/VOCdevkit/VOC2012/JPEGImages/2010_005306.jpg 500 375 11 166 7 347 222 +14711 /data/VOCdevkit/VOC2012/JPEGImages/2010_005308.jpg 500 375 8 377 98 500 237 8 300 233 474 375 8 60 246 212 375 8 1 107 133 238 +14712 /data/VOCdevkit/VOC2012/JPEGImages/2010_005309.jpg 500 291 18 148 46 336 246 +14713 /data/VOCdevkit/VOC2012/JPEGImages/2010_005310.jpg 500 375 16 301 93 474 347 16 80 77 201 199 16 49 156 98 184 +14714 /data/VOCdevkit/VOC2012/JPEGImages/2010_005312.jpg 500 375 11 117 135 305 235 7 263 200 422 300 +14715 /data/VOCdevkit/VOC2012/JPEGImages/2010_005314.jpg 500 375 14 219 312 258 375 14 8 283 49 375 14 406 242 468 328 14 336 229 373 309 14 301 231 342 317 14 263 240 294 314 14 196 234 233 316 +14716 /data/VOCdevkit/VOC2012/JPEGImages/2010_005317.jpg 500 460 7 70 1 500 460 +14717 /data/VOCdevkit/VOC2012/JPEGImages/2010_005318.jpg 500 333 6 55 111 445 252 14 247 126 278 161 14 90 62 128 148 14 144 101 179 146 14 236 85 278 136 14 311 74 340 135 +14718 /data/VOCdevkit/VOC2012/JPEGImages/2010_005320.jpg 500 374 2 56 23 300 337 +14719 /data/VOCdevkit/VOC2012/JPEGImages/2010_005323.jpg 500 334 6 9 190 490 326 +14720 /data/VOCdevkit/VOC2012/JPEGImages/2010_005327.jpg 500 375 14 30 54 190 375 14 296 28 474 375 14 185 68 310 375 +14721 /data/VOCdevkit/VOC2012/JPEGImages/2010_005330.jpg 500 375 11 67 105 360 266 +14722 /data/VOCdevkit/VOC2012/JPEGImages/2010_005331.jpg 360 270 11 144 34 360 259 11 1 13 223 242 +14723 /data/VOCdevkit/VOC2012/JPEGImages/2010_005332.jpg 375 500 3 1 1 121 267 3 100 1 372 415 +14724 /data/VOCdevkit/VOC2012/JPEGImages/2010_005338.jpg 500 306 12 6 32 461 306 14 200 78 497 236 +14725 /data/VOCdevkit/VOC2012/JPEGImages/2010_005340.jpg 500 333 7 1 1 386 333 +14726 /data/VOCdevkit/VOC2012/JPEGImages/2010_005344.jpg 500 375 7 33 164 444 374 7 39 14 338 230 +14727 /data/VOCdevkit/VOC2012/JPEGImages/2010_005345.jpg 500 375 19 86 40 358 297 +14728 /data/VOCdevkit/VOC2012/JPEGImages/2010_005346.jpg 500 333 14 437 45 500 174 14 50 102 117 172 14 141 20 289 324 13 46 58 383 296 +14729 /data/VOCdevkit/VOC2012/JPEGImages/2010_005349.jpg 500 334 10 117 208 344 313 14 231 129 455 334 14 11 122 232 334 14 133 78 237 210 14 248 92 329 219 4 256 175 277 233 4 274 181 290 250 8 432 248 500 334 +14730 /data/VOCdevkit/VOC2012/JPEGImages/2010_005350.jpg 375 500 14 256 206 319 337 14 275 201 366 341 2 49 287 116 327 2 162 262 201 345 2 140 286 169 330 2 201 298 246 340 +14731 /data/VOCdevkit/VOC2012/JPEGImages/2010_005352.jpg 500 325 14 132 143 164 218 14 154 136 190 229 14 181 138 222 226 14 211 134 248 228 14 238 132 278 223 14 271 129 302 219 14 285 132 336 228 14 332 111 402 318 14 290 204 356 310 14 248 191 315 302 14 207 195 267 300 14 188 203 229 297 14 151 200 202 298 14 137 201 171 295 14 90 204 148 307 14 84 132 141 300 14 415 13 424 34 14 492 166 500 210 +14732 /data/VOCdevkit/VOC2012/JPEGImages/2010_005353.jpg 500 357 2 248 183 322 305 +14733 /data/VOCdevkit/VOC2012/JPEGImages/2010_005359.jpg 500 375 13 56 1 500 375 +14734 /data/VOCdevkit/VOC2012/JPEGImages/2010_005361.jpg 375 500 11 30 53 300 499 +14735 /data/VOCdevkit/VOC2012/JPEGImages/2010_005364.jpg 333 500 3 56 166 259 281 +14736 /data/VOCdevkit/VOC2012/JPEGImages/2010_005365.jpg 500 375 0 78 141 322 212 +14737 /data/VOCdevkit/VOC2012/JPEGImages/2010_005366.jpg 500 375 13 44 108 493 343 +14738 /data/VOCdevkit/VOC2012/JPEGImages/2010_005369.jpg 500 375 4 265 106 277 149 14 1 79 142 375 14 179 81 327 283 14 369 93 500 345 10 1 274 500 375 +14739 /data/VOCdevkit/VOC2012/JPEGImages/2010_005371.jpg 500 375 19 161 117 217 168 8 207 165 297 304 +14740 /data/VOCdevkit/VOC2012/JPEGImages/2010_005372.jpg 375 500 8 66 311 225 500 19 157 236 242 318 +14741 /data/VOCdevkit/VOC2012/JPEGImages/2010_005374.jpg 500 375 1 21 1 500 375 14 168 1 456 342 +14742 /data/VOCdevkit/VOC2012/JPEGImages/2010_005375.jpg 500 375 11 1 1 500 375 +14743 /data/VOCdevkit/VOC2012/JPEGImages/2010_005376.jpg 500 333 12 51 128 414 332 12 1 97 181 333 +14744 /data/VOCdevkit/VOC2012/JPEGImages/2010_005377.jpg 500 333 6 14 96 479 331 +14745 /data/VOCdevkit/VOC2012/JPEGImages/2010_005379.jpg 375 500 10 37 413 375 499 4 123 372 162 499 4 150 386 192 500 4 179 369 226 500 4 227 370 278 500 4 288 376 330 500 4 322 370 364 500 4 318 368 342 442 14 110 52 262 425 4 237 364 279 500 +14746 /data/VOCdevkit/VOC2012/JPEGImages/2010_005382.jpg 500 258 0 38 53 485 190 +14747 /data/VOCdevkit/VOC2012/JPEGImages/2010_005384.jpg 334 500 11 7 175 316 498 14 18 10 322 500 +14748 /data/VOCdevkit/VOC2012/JPEGImages/2010_005385.jpg 375 500 16 1 1 337 449 +14749 /data/VOCdevkit/VOC2012/JPEGImages/2010_005386.jpg 332 500 7 1 35 331 500 +14750 /data/VOCdevkit/VOC2012/JPEGImages/2010_005388.jpg 500 374 17 205 166 413 284 8 422 159 488 328 +14751 /data/VOCdevkit/VOC2012/JPEGImages/2010_005389.jpg 500 371 5 153 176 268 220 14 29 204 50 254 14 48 201 73 257 +14752 /data/VOCdevkit/VOC2012/JPEGImages/2010_005391.jpg 500 374 11 28 69 494 341 +14753 /data/VOCdevkit/VOC2012/JPEGImages/2010_005393.jpg 460 500 13 227 193 371 313 14 194 157 354 302 +14754 /data/VOCdevkit/VOC2012/JPEGImages/2010_005394.jpg 500 375 7 70 23 404 336 +14755 /data/VOCdevkit/VOC2012/JPEGImages/2010_005398.jpg 500 375 17 1 225 323 375 8 313 153 357 186 8 250 155 297 186 8 173 163 243 238 8 397 158 464 284 8 280 177 340 313 8 330 173 420 312 10 217 184 427 299 +14756 /data/VOCdevkit/VOC2012/JPEGImages/2010_005401.jpg 499 334 3 1 1 499 263 +14757 /data/VOCdevkit/VOC2012/JPEGImages/2010_005402.jpg 500 333 1 1 1 500 333 +14758 /data/VOCdevkit/VOC2012/JPEGImages/2010_005403.jpg 500 333 14 99 103 184 333 14 174 78 361 333 14 257 80 373 333 +14759 /data/VOCdevkit/VOC2012/JPEGImages/2010_005405.jpg 500 375 14 1 76 248 375 14 234 43 500 375 +14760 /data/VOCdevkit/VOC2012/JPEGImages/2010_005406.jpg 333 500 11 1 1 333 500 +14761 /data/VOCdevkit/VOC2012/JPEGImages/2010_005408.jpg 500 375 7 99 65 448 307 +14762 /data/VOCdevkit/VOC2012/JPEGImages/2010_005409.jpg 500 375 4 190 269 296 375 4 1 135 151 265 6 437 181 500 235 14 1 34 453 375 +14763 /data/VOCdevkit/VOC2012/JPEGImages/2010_005410.jpg 500 375 19 375 133 437 182 14 329 63 401 166 14 259 50 330 179 14 197 61 261 137 14 158 66 202 139 14 73 46 131 290 14 77 64 174 325 14 307 145 411 375 +14764 /data/VOCdevkit/VOC2012/JPEGImages/2010_005414.jpg 500 344 6 111 63 439 294 +14765 /data/VOCdevkit/VOC2012/JPEGImages/2010_005415.jpg 500 375 5 31 121 493 197 +14766 /data/VOCdevkit/VOC2012/JPEGImages/2010_005416.jpg 500 375 16 169 137 357 297 +14767 /data/VOCdevkit/VOC2012/JPEGImages/2010_005417.jpg 500 375 12 1 37 432 374 +14768 /data/VOCdevkit/VOC2012/JPEGImages/2010_005419.jpg 500 375 11 160 88 275 277 4 283 149 301 165 4 313 147 330 162 4 340 146 358 162 4 340 162 363 205 4 308 164 334 206 4 279 167 306 208 14 402 16 434 57 +14769 /data/VOCdevkit/VOC2012/JPEGImages/2010_005421.jpg 375 500 7 21 157 201 339 +14770 /data/VOCdevkit/VOC2012/JPEGImages/2010_005424.jpg 500 375 9 203 157 300 233 +14771 /data/VOCdevkit/VOC2012/JPEGImages/2010_005425.jpg 500 375 7 1 1 444 375 +14772 /data/VOCdevkit/VOC2012/JPEGImages/2010_005426.jpg 500 420 2 89 129 486 351 +14773 /data/VOCdevkit/VOC2012/JPEGImages/2010_005428.jpg 500 318 2 17 85 75 124 2 66 30 255 248 2 219 15 438 248 +14774 /data/VOCdevkit/VOC2012/JPEGImages/2010_005429.jpg 500 332 13 2 4 495 315 +14775 /data/VOCdevkit/VOC2012/JPEGImages/2010_005432.jpg 500 347 6 36 71 487 319 +14776 /data/VOCdevkit/VOC2012/JPEGImages/2010_005433.jpg 500 375 13 84 48 370 375 +14777 /data/VOCdevkit/VOC2012/JPEGImages/2010_005434.jpg 500 375 11 103 18 500 374 +14778 /data/VOCdevkit/VOC2012/JPEGImages/2010_005437.jpg 500 375 6 1 27 500 374 +14779 /data/VOCdevkit/VOC2012/JPEGImages/2010_005441.jpg 500 333 4 267 165 397 290 +14780 /data/VOCdevkit/VOC2012/JPEGImages/2010_005442.jpg 500 491 7 1 1 499 491 +14781 /data/VOCdevkit/VOC2012/JPEGImages/2010_005448.jpg 500 375 11 227 140 340 278 +14782 /data/VOCdevkit/VOC2012/JPEGImages/2010_005450.jpg 500 375 19 238 31 489 204 +14783 /data/VOCdevkit/VOC2012/JPEGImages/2010_005452.jpg 500 342 12 99 73 447 342 2 155 45 230 144 +14784 /data/VOCdevkit/VOC2012/JPEGImages/2010_005455.jpg 500 375 15 298 107 431 361 15 125 186 418 375 15 52 94 218 375 +14785 /data/VOCdevkit/VOC2012/JPEGImages/2010_005456.jpg 500 375 7 1 1 500 375 +14786 /data/VOCdevkit/VOC2012/JPEGImages/2010_005457.jpg 500 375 5 52 1 452 370 6 469 162 500 229 +14787 /data/VOCdevkit/VOC2012/JPEGImages/2010_005458.jpg 333 500 9 1 78 313 500 +14788 /data/VOCdevkit/VOC2012/JPEGImages/2010_005462.jpg 500 375 7 189 1 472 267 +14789 /data/VOCdevkit/VOC2012/JPEGImages/2010_005463.jpg 500 451 18 274 244 424 297 +14790 /data/VOCdevkit/VOC2012/JPEGImages/2010_005466.jpg 500 374 16 391 140 500 220 16 248 185 330 255 14 193 119 267 242 14 250 31 292 132 14 218 35 249 135 +14791 /data/VOCdevkit/VOC2012/JPEGImages/2010_005467.jpg 500 375 14 108 182 170 303 12 368 206 422 288 12 251 198 294 284 12 316 192 361 280 12 291 193 331 274 12 189 197 231 283 12 137 178 193 272 +14792 /data/VOCdevkit/VOC2012/JPEGImages/2010_005468.jpg 500 333 9 154 158 348 287 +14793 /data/VOCdevkit/VOC2012/JPEGImages/2010_005471.jpg 332 500 12 41 228 332 500 14 84 8 319 457 +14794 /data/VOCdevkit/VOC2012/JPEGImages/2010_005472.jpg 500 366 2 93 126 212 187 +14795 /data/VOCdevkit/VOC2012/JPEGImages/2010_005474.jpg 500 333 6 217 187 346 255 6 259 163 289 185 6 156 152 199 173 +14796 /data/VOCdevkit/VOC2012/JPEGImages/2010_005475.jpg 299 450 11 66 137 299 450 +14797 /data/VOCdevkit/VOC2012/JPEGImages/2010_005480.jpg 500 375 14 54 16 416 218 +14798 /data/VOCdevkit/VOC2012/JPEGImages/2010_005482.jpg 333 500 7 1 75 199 322 +14799 /data/VOCdevkit/VOC2012/JPEGImages/2010_005483.jpg 500 333 6 1 1 500 317 +14800 /data/VOCdevkit/VOC2012/JPEGImages/2010_005484.jpg 333 500 12 1 2 324 500 +14801 /data/VOCdevkit/VOC2012/JPEGImages/2010_005489.jpg 500 333 14 239 75 462 285 +14802 /data/VOCdevkit/VOC2012/JPEGImages/2010_005491.jpg 500 375 11 207 89 320 332 +14803 /data/VOCdevkit/VOC2012/JPEGImages/2010_005492.jpg 500 415 7 7 15 460 393 +14804 /data/VOCdevkit/VOC2012/JPEGImages/2010_005493.jpg 375 500 8 16 94 326 461 8 10 1 227 229 14 22 1 307 174 10 226 35 375 432 +14805 /data/VOCdevkit/VOC2012/JPEGImages/2010_005494.jpg 500 333 13 243 120 319 183 14 254 116 326 180 +14806 /data/VOCdevkit/VOC2012/JPEGImages/2010_005496.jpg 500 375 4 112 57 327 338 +14807 /data/VOCdevkit/VOC2012/JPEGImages/2010_005497.jpg 334 500 13 84 325 240 452 +14808 /data/VOCdevkit/VOC2012/JPEGImages/2010_005498.jpg 500 375 2 93 1 500 375 +14809 /data/VOCdevkit/VOC2012/JPEGImages/2010_005500.jpg 500 333 11 129 193 193 251 14 203 124 266 238 +14810 /data/VOCdevkit/VOC2012/JPEGImages/2010_005501.jpg 500 375 6 137 1 500 206 13 107 117 353 289 13 185 79 361 231 +14811 /data/VOCdevkit/VOC2012/JPEGImages/2010_005502.jpg 500 375 5 109 133 215 217 6 211 164 273 214 +14812 /data/VOCdevkit/VOC2012/JPEGImages/2010_005505.jpg 500 375 7 95 35 394 368 +14813 /data/VOCdevkit/VOC2012/JPEGImages/2010_005506.jpg 500 333 18 74 195 435 293 +14814 /data/VOCdevkit/VOC2012/JPEGImages/2010_005508.jpg 500 375 7 2 6 440 375 +14815 /data/VOCdevkit/VOC2012/JPEGImages/2010_005511.jpg 333 500 2 132 357 213 477 2 2 133 307 490 2 200 46 297 493 +14816 /data/VOCdevkit/VOC2012/JPEGImages/2010_005512.jpg 500 375 8 288 67 399 219 4 52 229 121 350 4 60 158 92 233 4 242 118 276 210 4 274 232 306 311 4 1 75 25 159 14 316 186 500 375 14 8 102 320 375 +14817 /data/VOCdevkit/VOC2012/JPEGImages/2010_005513.jpg 500 466 7 10 258 134 392 7 132 280 306 378 +14818 /data/VOCdevkit/VOC2012/JPEGImages/2010_005514.jpg 500 375 16 276 30 500 328 16 67 72 341 284 +14819 /data/VOCdevkit/VOC2012/JPEGImages/2010_005515.jpg 500 375 14 434 169 451 209 14 78 175 111 239 18 1 133 500 241 +14820 /data/VOCdevkit/VOC2012/JPEGImages/2010_005516.jpg 500 427 2 81 31 149 119 2 254 139 431 233 2 363 262 500 334 2 59 184 177 268 2 31 219 135 265 +14821 /data/VOCdevkit/VOC2012/JPEGImages/2010_005518.jpg 500 375 6 109 113 380 296 14 79 86 113 160 14 119 92 152 154 14 130 91 145 144 6 1 109 86 140 6 187 104 252 119 +14822 /data/VOCdevkit/VOC2012/JPEGImages/2010_005519.jpg 500 327 16 372 193 474 326 16 158 152 258 254 16 226 142 273 195 +14823 /data/VOCdevkit/VOC2012/JPEGImages/2010_005522.jpg 500 375 11 245 110 384 321 +14824 /data/VOCdevkit/VOC2012/JPEGImages/2010_005527.jpg 500 302 5 127 119 343 257 14 1 193 19 255 14 20 175 41 225 14 39 184 61 226 14 473 184 500 274 14 458 175 480 263 +14825 /data/VOCdevkit/VOC2012/JPEGImages/2010_005531.jpg 425 500 2 151 166 263 382 +14826 /data/VOCdevkit/VOC2012/JPEGImages/2010_005532.jpg 500 375 11 23 71 234 245 14 213 82 401 341 17 1 137 445 360 +14827 /data/VOCdevkit/VOC2012/JPEGImages/2010_005534.jpg 500 333 0 168 107 477 231 +14828 /data/VOCdevkit/VOC2012/JPEGImages/2010_005535.jpg 500 334 7 1 1 457 334 +14829 /data/VOCdevkit/VOC2012/JPEGImages/2010_005536.jpg 500 375 15 62 256 213 375 15 286 17 380 101 15 216 204 349 353 15 300 153 437 323 15 353 133 478 241 15 331 57 396 125 15 351 85 439 145 +14830 /data/VOCdevkit/VOC2012/JPEGImages/2010_005538.jpg 500 375 14 90 62 129 243 14 93 60 387 374 +14831 /data/VOCdevkit/VOC2012/JPEGImages/2010_005540.jpg 375 500 8 1 158 112 500 4 263 94 281 151 +14832 /data/VOCdevkit/VOC2012/JPEGImages/2010_005542.jpg 500 375 1 1 154 94 291 1 95 146 183 284 14 212 180 399 283 1 462 168 500 285 14 302 131 343 199 14 368 130 412 198 +14833 /data/VOCdevkit/VOC2012/JPEGImages/2010_005543.jpg 333 500 14 13 62 333 500 +14834 /data/VOCdevkit/VOC2012/JPEGImages/2010_005546.jpg 500 332 6 65 86 489 251 +14835 /data/VOCdevkit/VOC2012/JPEGImages/2010_005548.jpg 443 500 11 12 22 418 490 +14836 /data/VOCdevkit/VOC2012/JPEGImages/2010_005551.jpg 500 462 7 41 20 500 462 +14837 /data/VOCdevkit/VOC2012/JPEGImages/2010_005556.jpg 500 375 1 70 1 443 375 +14838 /data/VOCdevkit/VOC2012/JPEGImages/2010_005557.jpg 500 333 0 40 83 452 243 +14839 /data/VOCdevkit/VOC2012/JPEGImages/2010_005559.jpg 500 333 18 459 177 494 204 18 40 22 390 265 +14840 /data/VOCdevkit/VOC2012/JPEGImages/2010_005561.jpg 500 375 11 161 16 348 375 +14841 /data/VOCdevkit/VOC2012/JPEGImages/2010_005562.jpg 500 375 9 121 124 500 375 +14842 /data/VOCdevkit/VOC2012/JPEGImages/2010_005565.jpg 500 333 18 201 58 500 330 18 105 100 252 286 18 32 11 137 267 +14843 /data/VOCdevkit/VOC2012/JPEGImages/2010_005566.jpg 500 265 16 377 67 486 245 16 241 84 336 232 16 173 86 234 225 16 112 90 208 246 16 1 97 82 235 +14844 /data/VOCdevkit/VOC2012/JPEGImages/2010_005567.jpg 500 375 16 374 107 416 192 16 312 111 370 174 16 221 76 266 116 16 6 123 58 233 16 103 132 209 251 16 181 148 336 298 +14845 /data/VOCdevkit/VOC2012/JPEGImages/2010_005570.jpg 500 375 14 219 189 288 362 +14846 /data/VOCdevkit/VOC2012/JPEGImages/2010_005571.jpg 500 375 6 1 268 67 374 14 231 208 264 316 +14847 /data/VOCdevkit/VOC2012/JPEGImages/2010_005572.jpg 336 500 13 53 13 298 477 14 277 3 336 138 +14848 /data/VOCdevkit/VOC2012/JPEGImages/2010_005573.jpg 500 332 7 74 27 451 332 +14849 /data/VOCdevkit/VOC2012/JPEGImages/2010_005575.jpg 375 500 11 1 120 288 247 +14850 /data/VOCdevkit/VOC2012/JPEGImages/2010_005576.jpg 500 375 10 1 1 500 374 +14851 /data/VOCdevkit/VOC2012/JPEGImages/2010_005578.jpg 500 375 14 327 99 500 334 14 152 142 360 350 14 4 79 186 356 14 1 114 36 186 +14852 /data/VOCdevkit/VOC2012/JPEGImages/2010_005582.jpg 333 500 4 53 101 138 158 14 34 90 289 452 +14853 /data/VOCdevkit/VOC2012/JPEGImages/2010_005584.jpg 375 500 11 1 130 352 299 +14854 /data/VOCdevkit/VOC2012/JPEGImages/2010_005585.jpg 371 500 11 103 204 286 500 14 1 1 350 500 8 271 320 323 389 +14855 /data/VOCdevkit/VOC2012/JPEGImages/2010_005586.jpg 419 500 2 14 7 404 500 +14856 /data/VOCdevkit/VOC2012/JPEGImages/2010_005587.jpg 500 367 6 43 107 399 347 +14857 /data/VOCdevkit/VOC2012/JPEGImages/2010_005588.jpg 400 300 3 129 98 241 171 +14858 /data/VOCdevkit/VOC2012/JPEGImages/2010_005591.jpg 500 500 18 210 214 253 261 +14859 /data/VOCdevkit/VOC2012/JPEGImages/2010_005592.jpg 500 375 7 262 27 432 310 7 87 13 283 344 +14860 /data/VOCdevkit/VOC2012/JPEGImages/2010_005593.jpg 500 391 15 213 1 500 367 +14861 /data/VOCdevkit/VOC2012/JPEGImages/2010_005594.jpg 500 375 11 175 122 364 375 +14862 /data/VOCdevkit/VOC2012/JPEGImages/2010_005595.jpg 375 500 12 103 190 281 311 +14863 /data/VOCdevkit/VOC2012/JPEGImages/2010_005596.jpg 500 375 5 306 117 446 225 14 462 178 486 242 14 366 177 387 250 +14864 /data/VOCdevkit/VOC2012/JPEGImages/2010_005597.jpg 500 333 3 1 1 99 114 3 92 93 462 272 +14865 /data/VOCdevkit/VOC2012/JPEGImages/2010_005601.jpg 500 376 16 110 35 488 365 +14866 /data/VOCdevkit/VOC2012/JPEGImages/2010_005603.jpg 500 489 2 147 75 330 368 +14867 /data/VOCdevkit/VOC2012/JPEGImages/2010_005604.jpg 500 375 11 1 32 500 374 +14868 /data/VOCdevkit/VOC2012/JPEGImages/2010_005606.jpg 500 375 7 181 169 464 374 14 197 68 500 375 17 121 39 500 375 +14869 /data/VOCdevkit/VOC2012/JPEGImages/2010_005608.jpg 500 333 2 89 1 500 285 2 289 183 500 331 +14870 /data/VOCdevkit/VOC2012/JPEGImages/2010_005610.jpg 500 473 17 1 156 500 446 14 35 35 442 473 +14871 /data/VOCdevkit/VOC2012/JPEGImages/2010_005612.jpg 500 375 11 43 1 451 322 +14872 /data/VOCdevkit/VOC2012/JPEGImages/2010_005614.jpg 500 375 17 1 84 500 375 11 49 178 347 315 7 334 195 494 286 +14873 /data/VOCdevkit/VOC2012/JPEGImages/2010_005615.jpg 500 375 11 22 48 369 300 +14874 /data/VOCdevkit/VOC2012/JPEGImages/2010_005616.jpg 375 500 1 8 1 375 471 +14875 /data/VOCdevkit/VOC2012/JPEGImages/2010_005619.jpg 500 333 13 135 90 382 266 14 178 34 422 253 +14876 /data/VOCdevkit/VOC2012/JPEGImages/2010_005620.jpg 500 344 8 2 237 135 344 13 384 57 411 101 14 25 122 236 344 14 95 101 205 344 14 147 89 240 237 14 230 85 304 231 14 343 109 500 344 14 366 100 422 197 14 314 111 398 269 14 279 107 364 242 +14877 /data/VOCdevkit/VOC2012/JPEGImages/2010_005625.jpg 202 270 11 30 59 143 270 +14878 /data/VOCdevkit/VOC2012/JPEGImages/2010_005626.jpg 500 375 14 283 135 500 375 14 10 100 219 375 14 156 109 278 248 10 104 226 459 375 8 256 176 333 231 +14879 /data/VOCdevkit/VOC2012/JPEGImages/2010_005627.jpg 500 334 7 16 46 310 297 7 270 61 465 298 +14880 /data/VOCdevkit/VOC2012/JPEGImages/2010_005628.jpg 500 375 11 352 210 436 322 14 23 2 258 375 15 182 101 246 180 +14881 /data/VOCdevkit/VOC2012/JPEGImages/2010_005629.jpg 500 369 11 8 145 202 369 14 1 1 500 369 +14882 /data/VOCdevkit/VOC2012/JPEGImages/2010_005632.jpg 450 299 0 50 120 402 237 +14883 /data/VOCdevkit/VOC2012/JPEGImages/2010_005635.jpg 500 333 16 224 149 293 191 16 226 163 275 192 16 166 123 189 150 16 266 143 302 181 +14884 /data/VOCdevkit/VOC2012/JPEGImages/2010_005636.jpg 500 347 5 84 45 488 310 14 170 144 216 185 +14885 /data/VOCdevkit/VOC2012/JPEGImages/2010_005637.jpg 391 500 11 37 371 200 500 11 106 112 202 210 11 255 65 315 144 8 1 47 309 366 8 165 15 384 240 +14886 /data/VOCdevkit/VOC2012/JPEGImages/2010_005640.jpg 375 500 11 100 219 253 398 +14887 /data/VOCdevkit/VOC2012/JPEGImages/2010_005643.jpg 500 376 18 92 126 376 184 +14888 /data/VOCdevkit/VOC2012/JPEGImages/2010_005644.jpg 500 334 11 72 41 362 334 +14889 /data/VOCdevkit/VOC2012/JPEGImages/2010_005646.jpg 500 333 14 306 189 419 333 14 391 190 438 333 14 335 151 376 268 3 117 178 162 189 +14890 /data/VOCdevkit/VOC2012/JPEGImages/2010_005647.jpg 375 500 7 1 1 268 500 +14891 /data/VOCdevkit/VOC2012/JPEGImages/2010_005651.jpg 500 332 2 152 107 332 327 +14892 /data/VOCdevkit/VOC2012/JPEGImages/2010_005652.jpg 333 500 7 77 166 224 363 +14893 /data/VOCdevkit/VOC2012/JPEGImages/2010_005654.jpg 500 375 10 196 241 367 375 8 264 268 382 374 8 85 258 142 374 14 125 126 210 375 14 76 116 146 375 14 176 130 291 365 14 268 191 359 375 14 338 102 423 375 14 344 133 404 199 +14894 /data/VOCdevkit/VOC2012/JPEGImages/2010_005657.jpg 500 375 11 104 183 363 375 14 22 1 416 375 +14895 /data/VOCdevkit/VOC2012/JPEGImages/2010_005658.jpg 500 375 1 1 19 360 295 1 404 103 500 265 11 309 149 474 375 +14896 /data/VOCdevkit/VOC2012/JPEGImages/2010_005663.jpg 375 500 4 76 29 232 465 6 38 232 266 289 6 248 220 369 283 +14897 /data/VOCdevkit/VOC2012/JPEGImages/2010_005664.jpg 500 333 1 93 67 425 294 +14898 /data/VOCdevkit/VOC2012/JPEGImages/2010_005665.jpg 399 500 11 1 72 377 500 +14899 /data/VOCdevkit/VOC2012/JPEGImages/2010_005666.jpg 500 375 10 1 1 144 270 14 128 1 500 375 +14900 /data/VOCdevkit/VOC2012/JPEGImages/2010_005668.jpg 500 412 9 24 14 479 412 +14901 /data/VOCdevkit/VOC2012/JPEGImages/2010_005669.jpg 500 371 11 202 151 253 311 11 219 98 264 183 +14902 /data/VOCdevkit/VOC2012/JPEGImages/2010_005670.jpg 375 500 1 80 121 340 483 1 1 66 91 353 1 34 1 258 112 +14903 /data/VOCdevkit/VOC2012/JPEGImages/2010_005671.jpg 333 500 11 1 1 333 499 +14904 /data/VOCdevkit/VOC2012/JPEGImages/2010_005672.jpg 500 375 6 1 30 500 373 +14905 /data/VOCdevkit/VOC2012/JPEGImages/2010_005676.jpg 500 375 19 241 170 362 289 +14906 /data/VOCdevkit/VOC2012/JPEGImages/2010_005678.jpg 500 375 19 20 15 500 359 +14907 /data/VOCdevkit/VOC2012/JPEGImages/2010_005681.jpg 500 375 11 290 215 407 292 14 33 1 492 375 17 1 1 500 375 +14908 /data/VOCdevkit/VOC2012/JPEGImages/2010_005683.jpg 500 375 0 7 99 414 374 0 7 133 84 165 +14909 /data/VOCdevkit/VOC2012/JPEGImages/2010_005684.jpg 500 357 13 115 85 466 326 14 200 12 332 272 +14910 /data/VOCdevkit/VOC2012/JPEGImages/2010_005688.jpg 500 333 16 1 27 337 333 +14911 /data/VOCdevkit/VOC2012/JPEGImages/2010_005692.jpg 500 375 17 42 151 453 374 +14912 /data/VOCdevkit/VOC2012/JPEGImages/2010_005696.jpg 500 375 7 135 64 399 374 +14913 /data/VOCdevkit/VOC2012/JPEGImages/2010_005697.jpg 375 500 7 23 192 313 499 7 116 210 167 262 14 51 3 338 500 +14914 /data/VOCdevkit/VOC2012/JPEGImages/2010_005700.jpg 500 375 14 110 1 353 358 6 108 163 401 375 6 1 185 156 246 +14915 /data/VOCdevkit/VOC2012/JPEGImages/2010_005705.jpg 398 500 3 74 197 190 373 3 154 189 258 375 +14916 /data/VOCdevkit/VOC2012/JPEGImages/2010_005706.jpg 500 375 18 110 155 486 235 +14917 /data/VOCdevkit/VOC2012/JPEGImages/2010_005709.jpg 375 500 7 62 168 253 311 14 48 20 360 500 +14918 /data/VOCdevkit/VOC2012/JPEGImages/2010_005712.jpg 500 334 7 1 83 382 316 +14919 /data/VOCdevkit/VOC2012/JPEGImages/2010_005715.jpg 500 333 0 62 130 443 236 +14920 /data/VOCdevkit/VOC2012/JPEGImages/2010_005716.jpg 400 300 11 1 48 320 300 +14921 /data/VOCdevkit/VOC2012/JPEGImages/2010_005718.jpg 500 333 6 19 197 79 233 6 1 212 20 251 0 80 128 498 246 6 81 197 146 224 +14922 /data/VOCdevkit/VOC2012/JPEGImages/2010_005719.jpg 500 332 16 1 109 381 332 +14923 /data/VOCdevkit/VOC2012/JPEGImages/2010_005721.jpg 500 375 13 1 2 135 152 13 30 18 438 295 +14924 /data/VOCdevkit/VOC2012/JPEGImages/2010_005723.jpg 500 375 14 141 32 500 374 +14925 /data/VOCdevkit/VOC2012/JPEGImages/2010_005725.jpg 500 376 2 168 100 423 376 +14926 /data/VOCdevkit/VOC2012/JPEGImages/2010_005727.jpg 500 375 18 1 150 410 297 +14927 /data/VOCdevkit/VOC2012/JPEGImages/2010_005731.jpg 500 335 13 38 33 463 316 +14928 /data/VOCdevkit/VOC2012/JPEGImages/2010_005732.jpg 500 375 7 181 1 500 375 +14929 /data/VOCdevkit/VOC2012/JPEGImages/2010_005733.jpg 500 375 12 254 73 396 347 14 136 6 229 193 6 1 114 131 216 14 409 132 443 228 +14930 /data/VOCdevkit/VOC2012/JPEGImages/2010_005734.jpg 500 332 17 1 169 195 300 +14931 /data/VOCdevkit/VOC2012/JPEGImages/2010_005735.jpg 500 375 11 130 2 238 206 7 153 1 500 372 +14932 /data/VOCdevkit/VOC2012/JPEGImages/2010_005736.jpg 500 375 16 219 205 269 253 16 154 217 227 266 16 141 195 199 228 16 70 186 106 229 16 165 204 200 227 +14933 /data/VOCdevkit/VOC2012/JPEGImages/2010_005738.jpg 500 333 11 1 1 486 277 +14934 /data/VOCdevkit/VOC2012/JPEGImages/2010_005740.jpg 500 333 16 165 123 277 284 16 166 198 237 306 +14935 /data/VOCdevkit/VOC2012/JPEGImages/2010_005744.jpg 500 333 19 146 101 300 252 +14936 /data/VOCdevkit/VOC2012/JPEGImages/2010_005746.jpg 500 375 8 66 22 243 283 8 248 10 433 300 +14937 /data/VOCdevkit/VOC2012/JPEGImages/2010_005747.jpg 375 500 11 81 97 308 500 4 288 20 300 68 +14938 /data/VOCdevkit/VOC2012/JPEGImages/2010_005748.jpg 500 333 12 175 39 269 273 14 187 23 266 171 +14939 /data/VOCdevkit/VOC2012/JPEGImages/2010_005750.jpg 500 333 6 65 85 394 249 6 145 236 500 333 +14940 /data/VOCdevkit/VOC2012/JPEGImages/2010_005752.jpg 376 500 6 2 116 359 466 +14941 /data/VOCdevkit/VOC2012/JPEGImages/2010_005753.jpg 333 500 11 92 120 291 398 +14942 /data/VOCdevkit/VOC2012/JPEGImages/2010_005754.jpg 374 500 8 72 244 262 500 +14943 /data/VOCdevkit/VOC2012/JPEGImages/2010_005755.jpg 500 335 10 1 245 500 335 +14944 /data/VOCdevkit/VOC2012/JPEGImages/2010_005756.jpg 500 375 5 2 44 476 246 +14945 /data/VOCdevkit/VOC2012/JPEGImages/2010_005758.jpg 500 374 14 171 90 247 177 14 123 101 219 252 14 270 103 369 261 14 175 167 475 374 14 1 150 149 374 14 122 150 317 374 15 332 133 389 201 15 422 73 475 135 +14946 /data/VOCdevkit/VOC2012/JPEGImages/2010_005761.jpg 500 335 0 204 135 327 185 +14947 /data/VOCdevkit/VOC2012/JPEGImages/2010_005762.jpg 500 375 4 1 1 238 375 +14948 /data/VOCdevkit/VOC2012/JPEGImages/2010_005763.jpg 375 500 7 16 85 272 500 +14949 /data/VOCdevkit/VOC2012/JPEGImages/2010_005764.jpg 500 375 8 384 66 500 269 14 99 1 397 303 10 1 261 500 375 +14950 /data/VOCdevkit/VOC2012/JPEGImages/2010_005767.jpg 500 333 16 170 46 400 238 16 227 147 341 265 16 64 229 139 287 +14951 /data/VOCdevkit/VOC2012/JPEGImages/2010_005768.jpg 500 375 14 341 108 390 229 14 368 181 397 300 14 429 167 461 303 18 1 58 500 375 +14952 /data/VOCdevkit/VOC2012/JPEGImages/2010_005770.jpg 500 375 17 53 83 478 359 +14953 /data/VOCdevkit/VOC2012/JPEGImages/2010_005775.jpg 500 386 11 170 138 339 271 8 1 84 179 362 +14954 /data/VOCdevkit/VOC2012/JPEGImages/2010_005776.jpg 500 375 0 1 72 440 219 +14955 /data/VOCdevkit/VOC2012/JPEGImages/2010_005777.jpg 467 500 11 37 1 423 455 +14956 /data/VOCdevkit/VOC2012/JPEGImages/2010_005780.jpg 500 333 3 181 142 444 277 +14957 /data/VOCdevkit/VOC2012/JPEGImages/2010_005782.jpg 500 375 1 11 76 459 331 +14958 /data/VOCdevkit/VOC2012/JPEGImages/2010_005784.jpg 318 260 12 13 31 271 260 +14959 /data/VOCdevkit/VOC2012/JPEGImages/2010_005785.jpg 500 375 6 88 118 434 257 +14960 /data/VOCdevkit/VOC2012/JPEGImages/2010_005788.jpg 500 330 16 348 106 439 193 16 441 109 500 217 16 195 112 366 247 16 22 131 224 276 +14961 /data/VOCdevkit/VOC2012/JPEGImages/2010_005791.jpg 500 375 7 221 65 377 243 +14962 /data/VOCdevkit/VOC2012/JPEGImages/2010_005794.jpg 500 375 11 281 214 450 375 14 42 190 192 375 14 27 1 453 375 +14963 /data/VOCdevkit/VOC2012/JPEGImages/2010_005796.jpg 377 500 7 1 74 270 375 +14964 /data/VOCdevkit/VOC2012/JPEGImages/2010_005800.jpg 375 500 8 29 102 315 500 +14965 /data/VOCdevkit/VOC2012/JPEGImages/2010_005804.jpg 500 333 6 45 1 500 333 +14966 /data/VOCdevkit/VOC2012/JPEGImages/2010_005805.jpg 375 500 7 51 27 375 163 19 1 143 375 500 +14967 /data/VOCdevkit/VOC2012/JPEGImages/2010_005806.jpg 333 500 7 2 99 300 437 +14968 /data/VOCdevkit/VOC2012/JPEGImages/2010_005807.jpg 500 467 11 13 77 482 400 +14969 /data/VOCdevkit/VOC2012/JPEGImages/2010_005810.jpg 500 375 1 324 104 483 220 14 316 40 419 226 14 426 93 454 162 14 425 51 450 118 18 1 1 420 217 +14970 /data/VOCdevkit/VOC2012/JPEGImages/2010_005815.jpg 500 327 11 1 1 324 272 +14971 /data/VOCdevkit/VOC2012/JPEGImages/2010_005816.jpg 500 375 18 271 174 500 246 +14972 /data/VOCdevkit/VOC2012/JPEGImages/2010_005817.jpg 500 375 6 45 115 473 264 14 230 134 276 162 +14973 /data/VOCdevkit/VOC2012/JPEGImages/2010_005820.jpg 500 297 16 198 192 247 249 +14974 /data/VOCdevkit/VOC2012/JPEGImages/2010_005821.jpg 266 400 7 48 11 240 243 +14975 /data/VOCdevkit/VOC2012/JPEGImages/2010_005823.jpg 500 362 13 27 87 455 290 +14976 /data/VOCdevkit/VOC2012/JPEGImages/2010_005824.jpg 500 375 9 212 105 500 336 9 163 62 479 288 9 114 109 253 208 +14977 /data/VOCdevkit/VOC2012/JPEGImages/2010_005825.jpg 375 500 10 1 100 375 500 4 1 45 29 145 +14978 /data/VOCdevkit/VOC2012/JPEGImages/2010_005826.jpg 500 375 14 1 1 500 375 11 187 19 377 347 +14979 /data/VOCdevkit/VOC2012/JPEGImages/2010_005827.jpg 500 375 19 1 1 500 286 +14980 /data/VOCdevkit/VOC2012/JPEGImages/2010_005830.jpg 500 499 17 109 232 381 452 8 355 327 500 498 14 336 82 400 164 14 1 157 115 443 14 104 205 254 482 14 123 221 183 319 15 1 219 69 329 +14981 /data/VOCdevkit/VOC2012/JPEGImages/2010_005833.jpg 500 411 7 13 91 267 411 +14982 /data/VOCdevkit/VOC2012/JPEGImages/2010_005835.jpg 500 375 14 179 102 407 363 8 57 1 500 375 +14983 /data/VOCdevkit/VOC2012/JPEGImages/2010_005836.jpg 500 375 6 1 26 458 374 6 323 60 487 188 +14984 /data/VOCdevkit/VOC2012/JPEGImages/2010_005837.jpg 500 357 2 67 55 227 218 2 173 50 360 238 +14985 /data/VOCdevkit/VOC2012/JPEGImages/2010_005838.jpg 375 500 14 1 48 375 500 +14986 /data/VOCdevkit/VOC2012/JPEGImages/2010_005840.jpg 500 375 1 99 211 260 375 1 185 221 358 375 14 235 116 351 375 14 138 133 247 359 +14987 /data/VOCdevkit/VOC2012/JPEGImages/2010_005841.jpg 500 375 19 149 131 344 263 19 371 113 500 275 19 1 128 116 280 +14988 /data/VOCdevkit/VOC2012/JPEGImages/2010_005843.jpg 333 500 8 70 237 155 388 8 128 246 328 500 15 1 329 59 455 +14989 /data/VOCdevkit/VOC2012/JPEGImages/2010_005845.jpg 500 375 6 1 59 484 375 +14990 /data/VOCdevkit/VOC2012/JPEGImages/2010_005847.jpg 500 375 11 155 135 224 229 14 91 47 292 255 14 223 171 450 370 +14991 /data/VOCdevkit/VOC2012/JPEGImages/2010_005848.jpg 500 375 1 230 215 474 345 +14992 /data/VOCdevkit/VOC2012/JPEGImages/2010_005849.jpg 298 500 13 16 5 287 500 +14993 /data/VOCdevkit/VOC2012/JPEGImages/2010_005853.jpg 336 500 7 8 9 300 500 4 296 168 336 380 +14994 /data/VOCdevkit/VOC2012/JPEGImages/2010_005854.jpg 500 375 11 1 32 437 283 +14995 /data/VOCdevkit/VOC2012/JPEGImages/2010_005855.jpg 500 375 7 97 1 283 315 +14996 /data/VOCdevkit/VOC2012/JPEGImages/2010_005860.jpg 500 339 6 124 100 457 268 1 419 118 498 212 15 4 150 120 267 +14997 /data/VOCdevkit/VOC2012/JPEGImages/2010_005865.jpg 500 375 10 1 53 500 374 4 439 9 492 142 4 459 22 500 166 +14998 /data/VOCdevkit/VOC2012/JPEGImages/2010_005867.jpg 500 375 14 308 68 500 375 14 19 63 347 375 +14999 /data/VOCdevkit/VOC2012/JPEGImages/2010_005868.jpg 500 375 6 49 79 425 302 +15000 /data/VOCdevkit/VOC2012/JPEGImages/2010_005870.jpg 500 375 11 124 1 461 303 +15001 /data/VOCdevkit/VOC2012/JPEGImages/2010_005871.jpg 500 375 18 1 1 500 122 14 93 32 345 215 14 126 51 363 330 14 155 72 328 332 +15002 /data/VOCdevkit/VOC2012/JPEGImages/2010_005874.jpg 375 500 11 24 1 338 328 +15003 /data/VOCdevkit/VOC2012/JPEGImages/2010_005875.jpg 500 375 6 343 60 500 203 6 69 73 349 255 14 315 126 412 289 +15004 /data/VOCdevkit/VOC2012/JPEGImages/2010_005876.jpg 500 375 14 173 67 320 345 15 35 194 80 241 13 77 153 408 344 +15005 /data/VOCdevkit/VOC2012/JPEGImages/2010_005877.jpg 500 375 0 115 96 446 202 +15006 /data/VOCdevkit/VOC2012/JPEGImages/2010_005882.jpg 500 375 11 49 148 140 286 11 364 157 464 275 8 353 168 500 357 8 1 171 156 369 +15007 /data/VOCdevkit/VOC2012/JPEGImages/2010_005883.jpg 333 500 4 104 59 230 443 4 247 126 333 312 4 290 1 320 110 +15008 /data/VOCdevkit/VOC2012/JPEGImages/2010_005884.jpg 500 333 8 296 179 391 253 14 322 30 500 282 14 27 22 233 257 10 14 234 500 333 19 414 1 474 29 +15009 /data/VOCdevkit/VOC2012/JPEGImages/2010_005885.jpg 500 375 11 205 97 395 374 +15010 /data/VOCdevkit/VOC2012/JPEGImages/2010_005886.jpg 500 332 7 95 169 237 272 +15011 /data/VOCdevkit/VOC2012/JPEGImages/2010_005888.jpg 500 375 0 126 136 281 280 +15012 /data/VOCdevkit/VOC2012/JPEGImages/2010_005891.jpg 500 332 6 38 9 490 315 +15013 /data/VOCdevkit/VOC2012/JPEGImages/2010_005892.jpg 500 375 7 1 1 419 375 +15014 /data/VOCdevkit/VOC2012/JPEGImages/2010_005894.jpg 500 375 8 304 127 467 340 8 75 79 204 217 +15015 /data/VOCdevkit/VOC2012/JPEGImages/2010_005896.jpg 431 376 2 215 48 352 216 +15016 /data/VOCdevkit/VOC2012/JPEGImages/2010_005897.jpg 500 350 11 216 209 272 300 14 251 95 304 287 +15017 /data/VOCdevkit/VOC2012/JPEGImages/2010_005898.jpg 500 302 11 242 61 424 249 +15018 /data/VOCdevkit/VOC2012/JPEGImages/2010_005899.jpg 500 375 7 1 67 500 320 +15019 /data/VOCdevkit/VOC2012/JPEGImages/2010_005901.jpg 500 375 8 92 209 128 241 8 126 213 169 249 8 187 223 234 259 8 240 225 307 272 8 319 236 402 294 8 408 299 486 375 10 1 233 419 375 +15020 /data/VOCdevkit/VOC2012/JPEGImages/2010_005903.jpg 500 333 7 24 19 408 333 +15021 /data/VOCdevkit/VOC2012/JPEGImages/2010_005904.jpg 500 312 14 283 14 449 172 +15022 /data/VOCdevkit/VOC2012/JPEGImages/2010_005906.jpg 500 375 7 270 157 364 244 8 40 178 188 375 14 119 58 500 375 +15023 /data/VOCdevkit/VOC2012/JPEGImages/2010_005907.jpg 500 333 6 14 10 479 309 14 221 21 275 86 +15024 /data/VOCdevkit/VOC2012/JPEGImages/2010_005909.jpg 500 322 1 37 20 459 290 +15025 /data/VOCdevkit/VOC2012/JPEGImages/2010_005914.jpg 500 333 11 164 16 373 267 +15026 /data/VOCdevkit/VOC2012/JPEGImages/2010_005919.jpg 404 500 12 16 35 404 438 +15027 /data/VOCdevkit/VOC2012/JPEGImages/2010_005921.jpg 500 375 8 247 187 500 374 +15028 /data/VOCdevkit/VOC2012/JPEGImages/2010_005922.jpg 500 375 9 358 273 416 328 9 270 230 304 252 +15029 /data/VOCdevkit/VOC2012/JPEGImages/2010_005927.jpg 500 334 3 369 134 433 248 3 60 66 136 257 +15030 /data/VOCdevkit/VOC2012/JPEGImages/2010_005928.jpg 500 375 3 361 207 466 253 +15031 /data/VOCdevkit/VOC2012/JPEGImages/2010_005929.jpg 352 288 11 62 31 307 273 +15032 /data/VOCdevkit/VOC2012/JPEGImages/2010_005930.jpg 375 500 8 232 242 340 441 19 96 259 159 323 15 29 204 111 369 +15033 /data/VOCdevkit/VOC2012/JPEGImages/2010_005932.jpg 500 334 15 304 71 456 313 +15034 /data/VOCdevkit/VOC2012/JPEGImages/2010_005934.jpg 500 333 18 1 85 474 251 +15035 /data/VOCdevkit/VOC2012/JPEGImages/2010_005935.jpg 500 358 7 1 73 405 297 +15036 /data/VOCdevkit/VOC2012/JPEGImages/2010_005936.jpg 500 375 10 1 282 500 375 14 99 110 265 279 14 77 116 276 259 14 206 84 478 319 +15037 /data/VOCdevkit/VOC2012/JPEGImages/2010_005937.jpg 500 332 17 1 1 500 332 11 1 64 414 278 +15038 /data/VOCdevkit/VOC2012/JPEGImages/2010_005938.jpg 500 374 7 2 9 350 374 10 221 50 500 374 +15039 /data/VOCdevkit/VOC2012/JPEGImages/2010_005942.jpg 500 375 0 49 163 470 293 14 154 194 221 292 +15040 /data/VOCdevkit/VOC2012/JPEGImages/2010_005943.jpg 500 375 11 178 76 394 367 +15041 /data/VOCdevkit/VOC2012/JPEGImages/2010_005948.jpg 500 375 11 2 153 239 375 7 254 32 488 374 +15042 /data/VOCdevkit/VOC2012/JPEGImages/2010_005949.jpg 375 500 6 260 403 375 478 +15043 /data/VOCdevkit/VOC2012/JPEGImages/2010_005951.jpg 500 375 6 1 129 318 324 +15044 /data/VOCdevkit/VOC2012/JPEGImages/2010_005952.jpg 375 500 4 70 1 256 474 +15045 /data/VOCdevkit/VOC2012/JPEGImages/2010_005953.jpg 500 333 0 46 89 397 211 0 136 235 500 332 +15046 /data/VOCdevkit/VOC2012/JPEGImages/2010_005954.jpg 500 375 14 59 7 279 339 4 262 11 451 375 +15047 /data/VOCdevkit/VOC2012/JPEGImages/2010_005957.jpg 500 333 13 1 1 500 333 +15048 /data/VOCdevkit/VOC2012/JPEGImages/2010_005958.jpg 500 375 11 189 207 210 234 +15049 /data/VOCdevkit/VOC2012/JPEGImages/2010_005959.jpg 500 375 5 56 1 500 374 6 1 234 155 375 +15050 /data/VOCdevkit/VOC2012/JPEGImages/2010_005960.jpg 500 333 14 103 113 297 333 2 234 128 333 285 14 287 38 353 170 14 297 1 389 117 14 347 3 387 106 +15051 /data/VOCdevkit/VOC2012/JPEGImages/2010_005967.jpg 500 375 8 227 214 444 375 14 1 143 192 375 14 2 49 173 374 14 151 83 217 362 14 203 149 255 307 14 209 129 330 375 14 242 248 356 375 14 320 92 409 313 14 384 88 480 348 14 243 78 296 193 14 150 72 182 144 +15052 /data/VOCdevkit/VOC2012/JPEGImages/2010_005968.jpg 500 361 2 148 75 314 316 +15053 /data/VOCdevkit/VOC2012/JPEGImages/2010_005972.jpg 500 375 8 454 259 500 375 8 10 261 124 374 8 1 247 58 373 8 70 246 118 299 14 93 69 411 375 14 313 171 337 249 +15054 /data/VOCdevkit/VOC2012/JPEGImages/2010_005973.jpg 500 333 7 63 2 499 333 +15055 /data/VOCdevkit/VOC2012/JPEGImages/2010_005974.jpg 500 375 0 41 126 458 360 +15056 /data/VOCdevkit/VOC2012/JPEGImages/2010_005975.jpg 500 375 7 25 92 461 356 8 1 1 500 375 15 1 74 39 181 +15057 /data/VOCdevkit/VOC2012/JPEGImages/2010_005976.jpg 500 375 12 226 214 285 260 12 213 217 265 258 +15058 /data/VOCdevkit/VOC2012/JPEGImages/2010_005978.jpg 500 375 0 2 128 470 282 +15059 /data/VOCdevkit/VOC2012/JPEGImages/2010_005980.jpg 500 375 17 272 268 493 375 +15060 /data/VOCdevkit/VOC2012/JPEGImages/2010_005981.jpg 500 375 11 1 14 311 375 11 183 96 374 225 +15061 /data/VOCdevkit/VOC2012/JPEGImages/2010_005982.jpg 500 375 11 138 108 370 281 8 31 80 500 375 +15062 /data/VOCdevkit/VOC2012/JPEGImages/2010_005984.jpg 500 331 7 141 48 374 318 +15063 /data/VOCdevkit/VOC2012/JPEGImages/2010_005985.jpg 333 500 8 251 245 297 374 8 170 255 277 405 8 140 231 163 267 8 107 237 140 276 8 58 243 158 399 8 125 267 250 442 10 19 253 296 452 +15064 /data/VOCdevkit/VOC2012/JPEGImages/2010_005986.jpg 500 378 16 16 95 103 158 16 183 88 243 130 16 154 109 223 150 16 228 136 324 292 16 122 150 217 246 16 167 163 234 258 +15065 /data/VOCdevkit/VOC2012/JPEGImages/2010_005987.jpg 500 375 11 233 160 260 205 6 110 35 249 96 +15066 /data/VOCdevkit/VOC2012/JPEGImages/2010_005991.jpg 391 500 11 30 119 277 387 14 53 47 391 500 +15067 /data/VOCdevkit/VOC2012/JPEGImages/2010_005992.jpg 500 333 11 17 54 449 315 +15068 /data/VOCdevkit/VOC2012/JPEGImages/2010_005993.jpg 500 356 9 1 147 111 356 9 100 90 500 356 2 260 72 318 143 +15069 /data/VOCdevkit/VOC2012/JPEGImages/2010_005995.jpg 500 375 11 160 114 343 375 +15070 /data/VOCdevkit/VOC2012/JPEGImages/2010_005996.jpg 500 333 15 270 137 294 163 15 365 139 413 186 18 308 87 500 190 14 21 60 393 333 +15071 /data/VOCdevkit/VOC2012/JPEGImages/2010_005997.jpg 500 375 6 273 119 307 151 13 295 116 340 166 13 201 127 283 258 14 121 116 171 229 13 400 144 500 375 +15072 /data/VOCdevkit/VOC2012/JPEGImages/2010_005998.jpg 500 313 0 109 198 498 299 +15073 /data/VOCdevkit/VOC2012/JPEGImages/2010_006000.jpg 500 375 14 165 51 309 374 4 249 172 309 304 +15074 /data/VOCdevkit/VOC2012/JPEGImages/2010_006003.jpg 500 375 6 162 199 220 248 +15075 /data/VOCdevkit/VOC2012/JPEGImages/2010_006004.jpg 500 375 14 210 145 275 278 +15076 /data/VOCdevkit/VOC2012/JPEGImages/2010_006009.jpg 500 375 11 337 157 500 375 6 1 1 179 128 +15077 /data/VOCdevkit/VOC2012/JPEGImages/2010_006010.jpg 500 375 8 271 262 345 316 14 2 203 156 375 14 143 213 315 375 14 315 213 494 375 8 145 244 209 275 10 1 266 306 336 +15078 /data/VOCdevkit/VOC2012/JPEGImages/2010_006011.jpg 500 375 7 1 45 456 317 +15079 /data/VOCdevkit/VOC2012/JPEGImages/2010_006012.jpg 500 375 6 1 18 491 361 +15080 /data/VOCdevkit/VOC2012/JPEGImages/2010_006015.jpg 500 370 8 327 37 488 251 4 148 240 189 343 +15081 /data/VOCdevkit/VOC2012/JPEGImages/2010_006021.jpg 375 500 4 131 115 218 391 +15082 /data/VOCdevkit/VOC2012/JPEGImages/2010_006023.jpg 500 330 0 68 68 256 157 +15083 /data/VOCdevkit/VOC2012/JPEGImages/2010_006025.jpg 485 500 7 89 120 439 437 7 3 290 315 500 +15084 /data/VOCdevkit/VOC2012/JPEGImages/2010_006026.jpg 332 500 16 87 412 147 463 16 141 373 183 389 +15085 /data/VOCdevkit/VOC2012/JPEGImages/2010_006028.jpg 500 333 13 1 45 347 333 13 198 31 448 200 13 285 18 497 160 +15086 /data/VOCdevkit/VOC2012/JPEGImages/2010_006031.jpg 500 375 1 140 10 377 258 +15087 /data/VOCdevkit/VOC2012/JPEGImages/2010_006032.jpg 500 334 0 1 1 500 334 +15088 /data/VOCdevkit/VOC2012/JPEGImages/2010_006033.jpg 500 338 6 1 1 500 306 +15089 /data/VOCdevkit/VOC2012/JPEGImages/2010_006034.jpg 500 375 0 1 83 499 272 +15090 /data/VOCdevkit/VOC2012/JPEGImages/2010_006035.jpg 470 353 11 1 1 470 352 +15091 /data/VOCdevkit/VOC2012/JPEGImages/2010_006037.jpg 500 375 14 159 59 500 375 14 106 121 273 375 +15092 /data/VOCdevkit/VOC2012/JPEGImages/2010_006040.jpg 500 500 7 198 156 326 424 +15093 /data/VOCdevkit/VOC2012/JPEGImages/2010_006041.jpg 375 500 8 78 156 256 344 +15094 /data/VOCdevkit/VOC2012/JPEGImages/2010_006042.jpg 375 500 11 1 71 337 500 +15095 /data/VOCdevkit/VOC2012/JPEGImages/2010_006050.jpg 500 377 19 1 20 76 106 19 74 88 174 166 19 289 94 380 177 19 421 134 500 217 14 79 91 350 377 +15096 /data/VOCdevkit/VOC2012/JPEGImages/2010_006051.jpg 500 375 13 73 102 443 356 14 199 56 346 354 +15097 /data/VOCdevkit/VOC2012/JPEGImages/2010_006054.jpg 500 333 18 202 141 443 291 +15098 /data/VOCdevkit/VOC2012/JPEGImages/2010_006056.jpg 500 375 8 296 124 333 316 8 273 112 303 209 8 70 212 213 375 4 248 177 272 250 10 1 127 304 375 17 275 107 500 207 +15099 /data/VOCdevkit/VOC2012/JPEGImages/2010_006057.jpg 500 333 11 3 1 500 333 +15100 /data/VOCdevkit/VOC2012/JPEGImages/2010_006058.jpg 375 500 7 1 2 313 500 +15101 /data/VOCdevkit/VOC2012/JPEGImages/2010_006061.jpg 375 500 14 268 275 375 500 14 1 240 75 388 14 1 101 298 500 +15102 /data/VOCdevkit/VOC2012/JPEGImages/2010_006062.jpg 500 335 12 331 202 455 300 12 219 204 340 302 12 60 191 152 291 +15103 /data/VOCdevkit/VOC2012/JPEGImages/2010_006063.jpg 500 375 1 90 177 305 345 +15104 /data/VOCdevkit/VOC2012/JPEGImages/2010_006066.jpg 500 375 11 87 1 489 375 +15105 /data/VOCdevkit/VOC2012/JPEGImages/2010_006067.jpg 500 255 0 161 110 336 159 +15106 /data/VOCdevkit/VOC2012/JPEGImages/2010_006070.jpg 500 375 6 1 1 153 105 1 1 14 497 323 +15107 /data/VOCdevkit/VOC2012/JPEGImages/2010_006073.jpg 500 375 17 112 155 358 260 +15108 /data/VOCdevkit/VOC2012/JPEGImages/2010_006076.jpg 375 500 11 1 103 375 500 +15109 /data/VOCdevkit/VOC2012/JPEGImages/2010_006078.jpg 480 373 7 1 30 468 334 +15110 /data/VOCdevkit/VOC2012/JPEGImages/2010_006079.jpg 500 375 11 32 86 254 356 14 80 18 500 375 +15111 /data/VOCdevkit/VOC2012/JPEGImages/2010_006082.jpg 500 332 0 132 118 500 259 +15112 /data/VOCdevkit/VOC2012/JPEGImages/2010_006084.jpg 500 375 2 3 26 407 363 +15113 /data/VOCdevkit/VOC2012/JPEGImages/2010_006086.jpg 500 375 11 1 95 423 252 11 283 177 500 374 +15114 /data/VOCdevkit/VOC2012/JPEGImages/2011_000002.jpg 500 375 2 150 207 224 269 +15115 /data/VOCdevkit/VOC2012/JPEGImages/2011_000003.jpg 500 338 4 368 154 389 214 14 191 107 314 331 14 367 87 500 337 +15116 /data/VOCdevkit/VOC2012/JPEGImages/2011_000006.jpg 500 375 17 17 141 479 312 14 257 115 375 290 14 93 112 241 326 14 173 111 303 280 8 152 194 500 375 14 398 83 448 119 +15117 /data/VOCdevkit/VOC2012/JPEGImages/2011_000007.jpg 375 500 5 76 106 316 434 6 64 198 87 224 14 32 264 72 377 14 30 253 48 311 +15118 /data/VOCdevkit/VOC2012/JPEGImages/2011_000009.jpg 500 375 19 95 37 215 182 14 252 144 353 348 4 306 78 329 146 8 208 197 438 375 14 340 32 353 52 14 325 30 338 48 +15119 /data/VOCdevkit/VOC2012/JPEGImages/2011_000010.jpg 480 337 15 233 84 262 163 +15120 /data/VOCdevkit/VOC2012/JPEGImages/2011_000012.jpg 500 375 18 79 110 500 277 +15121 /data/VOCdevkit/VOC2012/JPEGImages/2011_000016.jpg 500 375 8 31 178 94 270 8 64 192 116 300 8 99 210 182 333 8 124 236 222 372 8 170 274 324 374 8 346 207 410 252 8 254 189 301 214 8 184 171 216 190 10 121 170 499 375 14 12 91 49 191 14 41 90 87 243 14 94 133 153 218 14 187 90 227 190 14 268 82 306 194 14 284 105 345 223 14 360 172 500 375 14 171 217 381 373 +15122 /data/VOCdevkit/VOC2012/JPEGImages/2011_000017.jpg 500 375 2 143 39 500 375 +15123 /data/VOCdevkit/VOC2012/JPEGImages/2011_000022.jpg 348 500 12 99 100 345 488 12 60 131 254 443 +15124 /data/VOCdevkit/VOC2012/JPEGImages/2011_000025.jpg 500 375 5 85 21 437 375 5 1 102 125 284 +15125 /data/VOCdevkit/VOC2012/JPEGImages/2011_000027.jpg 375 500 4 224 306 287 413 4 142 145 238 402 +15126 /data/VOCdevkit/VOC2012/JPEGImages/2011_000028.jpg 500 375 11 73 6 500 375 +15127 /data/VOCdevkit/VOC2012/JPEGImages/2011_000030.jpg 375 500 14 323 214 367 366 14 192 147 253 380 14 114 147 217 438 4 119 152 142 203 +15128 /data/VOCdevkit/VOC2012/JPEGImages/2011_000034.jpg 500 333 6 466 151 500 230 13 76 13 483 333 +15129 /data/VOCdevkit/VOC2012/JPEGImages/2011_000036.jpg 500 375 19 130 90 285 230 8 1 213 142 375 15 234 1 280 20 +15130 /data/VOCdevkit/VOC2012/JPEGImages/2011_000037.jpg 500 375 8 77 234 166 375 17 314 200 422 346 17 103 187 195 276 19 226 166 288 217 19 12 187 40 251 +15131 /data/VOCdevkit/VOC2012/JPEGImages/2011_000038.jpg 500 375 19 204 25 337 127 14 1 8 179 360 14 79 123 157 250 14 135 141 198 215 14 192 166 227 211 14 342 89 484 375 +15132 /data/VOCdevkit/VOC2012/JPEGImages/2011_000041.jpg 500 375 14 129 83 357 375 +15133 /data/VOCdevkit/VOC2012/JPEGImages/2011_000043.jpg 333 500 12 29 17 331 495 +15134 /data/VOCdevkit/VOC2012/JPEGImages/2011_000044.jpg 500 375 7 119 136 319 375 +15135 /data/VOCdevkit/VOC2012/JPEGImages/2011_000045.jpg 500 375 11 107 75 355 307 +15136 /data/VOCdevkit/VOC2012/JPEGImages/2011_000048.jpg 500 375 5 77 55 471 336 6 6 224 52 253 +15137 /data/VOCdevkit/VOC2012/JPEGImages/2011_000051.jpg 500 375 14 348 90 500 375 14 232 160 355 375 14 8 86 136 375 +15138 /data/VOCdevkit/VOC2012/JPEGImages/2011_000052.jpg 500 375 3 411 235 480 249 14 459 236 475 267 +15139 /data/VOCdevkit/VOC2012/JPEGImages/2011_000053.jpg 500 333 13 65 89 431 317 14 291 25 415 239 14 161 37 328 270 +15140 /data/VOCdevkit/VOC2012/JPEGImages/2011_000054.jpg 500 375 14 363 164 498 333 14 250 76 492 372 14 1 80 220 374 +15141 /data/VOCdevkit/VOC2012/JPEGImages/2011_000057.jpg 500 364 9 66 34 332 340 9 269 75 488 341 +15142 /data/VOCdevkit/VOC2012/JPEGImages/2011_000058.jpg 500 341 18 96 97 451 212 +15143 /data/VOCdevkit/VOC2012/JPEGImages/2011_000060.jpg 500 375 13 104 39 363 346 +15144 /data/VOCdevkit/VOC2012/JPEGImages/2011_000061.jpg 500 356 19 321 2 447 109 19 31 29 125 113 19 279 169 428 298 +15145 /data/VOCdevkit/VOC2012/JPEGImages/2011_000065.jpg 500 375 8 190 142 425 373 8 329 40 500 283 8 1 123 212 374 10 80 58 476 374 +15146 /data/VOCdevkit/VOC2012/JPEGImages/2011_000066.jpg 500 375 4 1 84 498 375 +15147 /data/VOCdevkit/VOC2012/JPEGImages/2011_000068.jpg 500 375 2 284 200 500 319 +15148 /data/VOCdevkit/VOC2012/JPEGImages/2011_000069.jpg 500 375 9 127 193 215 284 9 24 230 90 290 14 320 129 481 375 +15149 /data/VOCdevkit/VOC2012/JPEGImages/2011_000070.jpg 500 375 17 3 34 493 354 +15150 /data/VOCdevkit/VOC2012/JPEGImages/2011_000071.jpg 500 356 8 330 211 500 356 19 224 130 345 243 14 52 56 149 356 14 280 162 499 356 +15151 /data/VOCdevkit/VOC2012/JPEGImages/2011_000072.jpg 500 375 15 274 221 500 375 8 254 117 336 215 19 354 41 421 107 14 289 79 370 173 14 180 113 248 270 14 180 77 252 166 14 93 145 200 294 +15152 /data/VOCdevkit/VOC2012/JPEGImages/2011_000076.jpg 240 500 6 11 129 240 491 +15153 /data/VOCdevkit/VOC2012/JPEGImages/2011_000077.jpg 500 375 19 75 4 315 244 +15154 /data/VOCdevkit/VOC2012/JPEGImages/2011_000082.jpg 500 375 8 297 132 459 335 17 1 154 161 375 +15155 /data/VOCdevkit/VOC2012/JPEGImages/2011_000083.jpg 375 500 11 38 37 360 462 +15156 /data/VOCdevkit/VOC2012/JPEGImages/2011_000084.jpg 500 323 14 171 8 500 323 14 52 3 162 75 +15157 /data/VOCdevkit/VOC2012/JPEGImages/2011_000086.jpg 500 375 6 62 124 446 293 3 11 57 146 105 +15158 /data/VOCdevkit/VOC2012/JPEGImages/2011_000087.jpg 500 375 1 226 188 266 211 +15159 /data/VOCdevkit/VOC2012/JPEGImages/2011_000090.jpg 500 375 5 14 103 464 304 +15160 /data/VOCdevkit/VOC2012/JPEGImages/2011_000094.jpg 500 333 6 89 59 455 289 6 331 60 500 168 6 240 63 391 106 +15161 /data/VOCdevkit/VOC2012/JPEGImages/2011_000095.jpg 500 375 5 41 38 486 325 6 1 225 201 332 14 470 195 500 304 14 302 85 328 120 +15162 /data/VOCdevkit/VOC2012/JPEGImages/2011_000096.jpg 375 500 16 46 320 100 359 16 113 318 171 351 16 248 318 303 352 16 294 317 317 347 +15163 /data/VOCdevkit/VOC2012/JPEGImages/2011_000098.jpg 500 375 1 333 109 390 270 1 374 118 442 277 10 59 117 301 375 8 54 193 213 375 8 61 139 125 201 +15164 /data/VOCdevkit/VOC2012/JPEGImages/2011_000102.jpg 500 375 16 1 1 216 186 16 112 1 500 138 16 1 96 499 375 +15165 /data/VOCdevkit/VOC2012/JPEGImages/2011_000103.jpg 500 333 0 13 99 492 229 +15166 /data/VOCdevkit/VOC2012/JPEGImages/2011_000105.jpg 500 400 18 1 166 488 324 +15167 /data/VOCdevkit/VOC2012/JPEGImages/2011_000108.jpg 350 263 7 28 37 287 192 8 1 1 350 262 +15168 /data/VOCdevkit/VOC2012/JPEGImages/2011_000109.jpg 500 333 9 40 130 296 282 +15169 /data/VOCdevkit/VOC2012/JPEGImages/2011_000112.jpg 500 364 2 69 208 202 262 2 284 198 410 277 +15170 /data/VOCdevkit/VOC2012/JPEGImages/2011_000114.jpg 436 500 2 80 342 336 400 +15171 /data/VOCdevkit/VOC2012/JPEGImages/2011_000116.jpg 500 375 0 121 152 219 189 +15172 /data/VOCdevkit/VOC2012/JPEGImages/2011_000122.jpg 500 375 11 131 170 499 368 +15173 /data/VOCdevkit/VOC2012/JPEGImages/2011_000124.jpg 375 500 8 51 28 342 487 +15174 /data/VOCdevkit/VOC2012/JPEGImages/2011_000128.jpg 375 500 6 244 45 366 78 +15175 /data/VOCdevkit/VOC2012/JPEGImages/2011_000129.jpg 500 333 0 117 165 214 194 0 247 140 342 173 0 366 129 473 156 +15176 /data/VOCdevkit/VOC2012/JPEGImages/2011_000130.jpg 500 333 3 396 145 500 213 3 18 176 143 203 14 458 131 491 229 +15177 /data/VOCdevkit/VOC2012/JPEGImages/2011_000137.jpg 500 375 14 1 16 187 375 14 285 148 405 293 14 158 109 295 311 14 416 89 499 375 14 137 78 206 315 +15178 /data/VOCdevkit/VOC2012/JPEGImages/2011_000138.jpg 500 346 5 208 80 474 259 +15179 /data/VOCdevkit/VOC2012/JPEGImages/2011_000142.jpg 500 332 17 99 125 486 325 14 293 48 430 327 14 86 48 322 332 +15180 /data/VOCdevkit/VOC2012/JPEGImages/2011_000145.jpg 375 500 15 112 84 251 470 +15181 /data/VOCdevkit/VOC2012/JPEGImages/2011_000146.jpg 500 375 17 2 28 499 375 14 1 27 75 253 14 1 54 168 375 14 95 96 270 375 14 197 100 500 375 +15182 /data/VOCdevkit/VOC2012/JPEGImages/2011_000147.jpg 480 321 12 247 154 456 280 14 301 130 404 235 +15183 /data/VOCdevkit/VOC2012/JPEGImages/2011_000149.jpg 346 500 2 53 49 306 500 +15184 /data/VOCdevkit/VOC2012/JPEGImages/2011_000152.jpg 450 338 8 115 90 209 225 8 1 117 78 299 +15185 /data/VOCdevkit/VOC2012/JPEGImages/2011_000161.jpg 333 500 3 255 213 275 227 3 207 246 254 304 3 72 245 117 301 14 114 176 189 397 14 1 252 32 336 14 88 257 111 316 +15186 /data/VOCdevkit/VOC2012/JPEGImages/2011_000162.jpg 500 374 7 185 192 290 300 7 285 24 446 241 +15187 /data/VOCdevkit/VOC2012/JPEGImages/2011_000163.jpg 500 258 0 164 70 335 168 +15188 /data/VOCdevkit/VOC2012/JPEGImages/2011_000165.jpg 375 500 7 141 166 375 484 7 11 118 288 484 4 302 10 316 49 +15189 /data/VOCdevkit/VOC2012/JPEGImages/2011_000166.jpg 500 375 9 46 67 449 330 9 456 107 497 129 +15190 /data/VOCdevkit/VOC2012/JPEGImages/2011_000173.jpg 337 500 17 1 274 210 474 +15191 /data/VOCdevkit/VOC2012/JPEGImages/2011_000176.jpg 500 313 6 15 48 493 300 +15192 /data/VOCdevkit/VOC2012/JPEGImages/2011_000178.jpg 500 375 5 1 79 461 362 14 252 159 332 350 14 380 175 440 316 +15193 /data/VOCdevkit/VOC2012/JPEGImages/2011_000180.jpg 500 375 5 331 345 389 361 +15194 /data/VOCdevkit/VOC2012/JPEGImages/2011_000181.jpg 500 321 5 119 24 391 296 5 1 139 124 234 +15195 /data/VOCdevkit/VOC2012/JPEGImages/2011_000182.jpg 500 375 14 215 147 387 375 14 2 93 438 375 +15196 /data/VOCdevkit/VOC2012/JPEGImages/2011_000185.jpg 500 375 2 21 16 500 375 +15197 /data/VOCdevkit/VOC2012/JPEGImages/2011_000192.jpg 500 375 19 331 102 405 171 8 2 172 78 307 8 47 172 152 301 14 48 99 173 314 14 145 96 245 290 10 245 172 500 375 +15198 /data/VOCdevkit/VOC2012/JPEGImages/2011_000194.jpg 500 375 14 1 32 438 288 +15199 /data/VOCdevkit/VOC2012/JPEGImages/2011_000195.jpg 408 500 18 1 190 361 450 +15200 /data/VOCdevkit/VOC2012/JPEGImages/2011_000196.jpg 500 375 15 212 25 287 96 15 324 15 414 147 15 142 23 180 99 4 302 88 322 163 8 182 215 322 375 10 113 125 390 362 14 68 40 139 191 14 323 62 455 293 14 1 35 154 341 8 359 120 390 156 +15201 /data/VOCdevkit/VOC2012/JPEGImages/2011_000197.jpg 500 333 18 11 1 499 333 +15202 /data/VOCdevkit/VOC2012/JPEGImages/2011_000202.jpg 375 500 11 43 45 375 484 8 1 129 375 500 +15203 /data/VOCdevkit/VOC2012/JPEGImages/2011_000206.jpg 500 375 4 374 228 414 371 4 158 246 205 375 10 18 344 500 375 14 240 95 455 356 14 1 115 219 375 +15204 /data/VOCdevkit/VOC2012/JPEGImages/2011_000208.jpg 500 375 5 228 84 499 298 5 20 124 473 317 5 1 14 55 331 14 11 202 68 370 +15205 /data/VOCdevkit/VOC2012/JPEGImages/2011_000210.jpg 500 333 12 147 160 283 280 18 265 113 500 238 +15206 /data/VOCdevkit/VOC2012/JPEGImages/2011_000213.jpg 323 500 8 11 16 249 382 14 1 72 268 500 +15207 /data/VOCdevkit/VOC2012/JPEGImages/2011_000214.jpg 500 334 13 231 181 322 299 13 179 177 230 229 14 233 150 299 288 14 185 164 216 227 +15208 /data/VOCdevkit/VOC2012/JPEGImages/2011_000216.jpg 500 333 11 129 2 341 333 +15209 /data/VOCdevkit/VOC2012/JPEGImages/2011_000219.jpg 500 384 2 312 162 393 291 +15210 /data/VOCdevkit/VOC2012/JPEGImages/2011_000220.jpg 500 333 13 1 160 358 333 14 90 64 265 329 14 19 22 79 178 +15211 /data/VOCdevkit/VOC2012/JPEGImages/2011_000221.jpg 500 375 18 166 97 399 217 +15212 /data/VOCdevkit/VOC2012/JPEGImages/2011_000222.jpg 500 375 2 145 61 343 366 +15213 /data/VOCdevkit/VOC2012/JPEGImages/2011_000224.jpg 500 375 17 286 116 500 375 17 1 104 309 259 +15214 /data/VOCdevkit/VOC2012/JPEGImages/2011_000226.jpg 375 500 8 176 239 359 500 8 258 237 375 471 8 1 247 202 500 10 1 258 308 492 8 214 221 269 262 8 20 219 68 253 +15215 /data/VOCdevkit/VOC2012/JPEGImages/2011_000228.jpg 500 334 9 296 153 361 184 9 255 165 296 186 9 230 163 273 190 +15216 /data/VOCdevkit/VOC2012/JPEGImages/2011_000229.jpg 500 377 7 19 46 330 309 +15217 /data/VOCdevkit/VOC2012/JPEGImages/2011_000232.jpg 500 375 2 216 171 298 214 2 210 213 301 244 +15218 /data/VOCdevkit/VOC2012/JPEGImages/2011_000233.jpg 375 500 13 116 272 288 442 +15219 /data/VOCdevkit/VOC2012/JPEGImages/2011_000234.jpg 334 500 3 55 60 290 456 3 316 339 334 400 +15220 /data/VOCdevkit/VOC2012/JPEGImages/2011_000238.jpg 375 500 3 59 250 347 454 +15221 /data/VOCdevkit/VOC2012/JPEGImages/2011_000239.jpg 500 375 5 99 83 405 290 6 2 177 52 199 +15222 /data/VOCdevkit/VOC2012/JPEGImages/2011_000241.jpg 500 375 18 337 1 500 374 14 422 101 500 333 14 411 250 455 299 +15223 /data/VOCdevkit/VOC2012/JPEGImages/2011_000243.jpg 500 375 0 17 93 486 260 +15224 /data/VOCdevkit/VOC2012/JPEGImages/2011_000246.jpg 441 500 2 1 129 159 448 +15225 /data/VOCdevkit/VOC2012/JPEGImages/2011_000248.jpg 500 332 5 272 89 428 280 5 33 80 236 269 14 448 211 496 329 14 178 178 208 271 6 260 94 299 111 +15226 /data/VOCdevkit/VOC2012/JPEGImages/2011_000249.jpg 500 375 14 458 230 480 279 +15227 /data/VOCdevkit/VOC2012/JPEGImages/2011_000250.jpg 500 375 18 1 196 320 249 +15228 /data/VOCdevkit/VOC2012/JPEGImages/2011_000252.jpg 500 375 6 107 144 415 347 14 108 96 191 323 6 1 150 55 218 +15229 /data/VOCdevkit/VOC2012/JPEGImages/2011_000253.jpg 500 375 15 135 220 191 265 8 239 235 320 361 19 391 188 456 245 19 203 161 221 182 +15230 /data/VOCdevkit/VOC2012/JPEGImages/2011_000257.jpg 375 500 4 102 1 194 222 10 1 42 375 500 +15231 /data/VOCdevkit/VOC2012/JPEGImages/2011_000258.jpg 500 332 5 103 35 425 281 6 1 191 118 268 14 425 195 474 285 14 380 169 402 210 14 316 170 336 199 14 336 168 351 202 14 285 167 315 209 +15232 /data/VOCdevkit/VOC2012/JPEGImages/2011_000267.jpg 500 375 5 1 27 496 332 +15233 /data/VOCdevkit/VOC2012/JPEGImages/2011_000268.jpg 500 334 2 187 141 264 238 2 234 129 401 278 +15234 /data/VOCdevkit/VOC2012/JPEGImages/2011_000269.jpg 500 438 2 239 51 375 364 2 1 255 145 438 +15235 /data/VOCdevkit/VOC2012/JPEGImages/2011_000273.jpg 500 333 3 198 189 313 251 14 441 60 500 310 14 369 81 441 315 14 288 68 385 313 14 115 66 204 308 14 45 81 123 294 14 1 72 38 294 +15236 /data/VOCdevkit/VOC2012/JPEGImages/2011_000276.jpg 500 375 0 1 39 500 313 +15237 /data/VOCdevkit/VOC2012/JPEGImages/2011_000277.jpg 500 375 18 1 1 487 375 14 257 114 290 202 +15238 /data/VOCdevkit/VOC2012/JPEGImages/2011_000278.jpg 500 375 3 39 74 355 248 +15239 /data/VOCdevkit/VOC2012/JPEGImages/2011_000282.jpg 500 375 8 286 190 382 279 8 4 118 51 158 10 52 225 499 375 14 316 102 500 282 14 150 84 319 300 14 1 56 285 375 8 318 124 362 192 8 262 122 308 177 8 338 123 363 154 +15240 /data/VOCdevkit/VOC2012/JPEGImages/2011_000283.jpg 500 332 18 142 93 295 269 18 277 86 500 332 +15241 /data/VOCdevkit/VOC2012/JPEGImages/2011_000285.jpg 500 333 13 274 158 337 220 14 272 155 330 215 +15242 /data/VOCdevkit/VOC2012/JPEGImages/2011_000286.jpg 500 375 3 128 232 230 283 3 1 252 291 375 3 245 254 334 298 3 351 228 433 294 3 425 230 500 296 3 241 205 310 259 3 299 220 370 268 +15243 /data/VOCdevkit/VOC2012/JPEGImages/2011_000288.jpg 375 500 19 209 88 345 227 8 1 164 220 500 +15244 /data/VOCdevkit/VOC2012/JPEGImages/2011_000290.jpg 375 500 8 96 246 290 398 14 145 259 240 347 19 1 215 74 306 +15245 /data/VOCdevkit/VOC2012/JPEGImages/2011_000291.jpg 500 375 18 150 154 344 240 +15246 /data/VOCdevkit/VOC2012/JPEGImages/2011_000293.jpg 500 333 6 189 186 463 305 +15247 /data/VOCdevkit/VOC2012/JPEGImages/2011_000297.jpg 500 375 1 1 7 499 375 +15248 /data/VOCdevkit/VOC2012/JPEGImages/2011_000299.jpg 375 500 9 3 1 375 496 +15249 /data/VOCdevkit/VOC2012/JPEGImages/2011_000304.jpg 500 375 14 240 86 492 375 14 13 88 205 375 17 1 186 500 375 +15250 /data/VOCdevkit/VOC2012/JPEGImages/2011_000305.jpg 500 375 7 51 102 453 256 +15251 /data/VOCdevkit/VOC2012/JPEGImages/2011_000307.jpg 500 333 11 260 160 500 297 +15252 /data/VOCdevkit/VOC2012/JPEGImages/2011_000309.jpg 500 375 9 200 180 350 280 9 48 142 163 313 9 137 177 192 281 9 355 173 500 313 +15253 /data/VOCdevkit/VOC2012/JPEGImages/2011_000310.jpg 375 500 17 59 299 237 462 +15254 /data/VOCdevkit/VOC2012/JPEGImages/2011_000312.jpg 500 333 5 240 63 496 174 5 28 62 314 164 +15255 /data/VOCdevkit/VOC2012/JPEGImages/2011_000314.jpg 500 442 13 115 120 477 417 14 195 34 347 255 14 39 15 204 198 13 68 74 388 296 13 30 96 193 277 +15256 /data/VOCdevkit/VOC2012/JPEGImages/2011_000315.jpg 375 500 13 2 1 375 500 +15257 /data/VOCdevkit/VOC2012/JPEGImages/2011_000317.jpg 370 500 19 295 162 370 296 14 252 24 361 162 11 50 119 314 417 8 37 301 249 458 8 53 394 302 500 +15258 /data/VOCdevkit/VOC2012/JPEGImages/2011_000319.jpg 500 375 1 217 173 304 233 14 240 134 292 225 +15259 /data/VOCdevkit/VOC2012/JPEGImages/2011_000320.jpg 319 448 2 198 77 292 280 14 1 1 319 448 +15260 /data/VOCdevkit/VOC2012/JPEGImages/2011_000321.jpg 500 296 14 179 19 500 294 14 94 43 333 271 14 1 57 148 254 +15261 /data/VOCdevkit/VOC2012/JPEGImages/2011_000322.jpg 375 500 14 164 180 375 500 +15262 /data/VOCdevkit/VOC2012/JPEGImages/2011_000324.jpg 500 350 2 61 80 423 222 +15263 /data/VOCdevkit/VOC2012/JPEGImages/2011_000329.jpg 500 400 0 3 140 452 274 +15264 /data/VOCdevkit/VOC2012/JPEGImages/2011_000332.jpg 500 375 16 204 126 356 214 16 376 182 428 233 16 170 144 218 199 16 221 182 334 235 13 321 111 480 259 4 154 105 170 145 14 154 6 316 163 14 325 41 434 161 +15265 /data/VOCdevkit/VOC2012/JPEGImages/2011_000338.jpg 500 375 8 94 263 224 375 8 126 238 183 344 8 1 277 140 375 10 1 268 208 375 8 1 241 32 280 +15266 /data/VOCdevkit/VOC2012/JPEGImages/2011_000342.jpg 500 375 3 24 1 500 375 14 338 212 413 290 +15267 /data/VOCdevkit/VOC2012/JPEGImages/2011_000343.jpg 333 500 12 2 1 320 500 +15268 /data/VOCdevkit/VOC2012/JPEGImages/2011_000344.jpg 500 375 4 132 153 192 292 14 1 1 436 362 +15269 /data/VOCdevkit/VOC2012/JPEGImages/2011_000345.jpg 500 375 7 34 67 445 237 +15270 /data/VOCdevkit/VOC2012/JPEGImages/2011_000346.jpg 500 332 18 4 55 483 283 +15271 /data/VOCdevkit/VOC2012/JPEGImages/2011_000347.jpg 500 333 3 99 1 199 233 3 249 1 349 224 3 337 1 418 211 14 83 172 110 244 14 101 171 132 247 14 239 169 272 229 14 288 168 310 195 14 374 165 399 220 +15272 /data/VOCdevkit/VOC2012/JPEGImages/2011_000359.jpg 500 375 0 1 249 284 355 +15273 /data/VOCdevkit/VOC2012/JPEGImages/2011_000361.jpg 500 375 15 238 31 357 180 4 432 193 500 375 10 1 253 500 375 14 385 86 500 193 14 200 98 373 256 14 36 102 244 316 +15274 /data/VOCdevkit/VOC2012/JPEGImages/2011_000362.jpg 500 375 14 10 37 46 100 14 150 2 199 142 14 243 44 265 101 14 208 17 339 270 14 213 52 233 104 14 194 41 216 109 +15275 /data/VOCdevkit/VOC2012/JPEGImages/2011_000364.jpg 500 375 19 394 92 494 185 17 1 101 311 270 17 1 239 488 375 +15276 /data/VOCdevkit/VOC2012/JPEGImages/2011_000369.jpg 500 375 5 274 117 448 204 +15277 /data/VOCdevkit/VOC2012/JPEGImages/2011_000370.jpg 372 480 12 108 109 267 403 14 105 60 273 256 +15278 /data/VOCdevkit/VOC2012/JPEGImages/2011_000374.jpg 500 375 2 162 53 255 322 +15279 /data/VOCdevkit/VOC2012/JPEGImages/2011_000375.jpg 500 466 4 161 346 201 466 4 248 363 292 466 14 261 112 472 343 14 212 181 349 350 14 148 25 255 386 14 79 98 242 330 14 26 11 201 458 +15280 /data/VOCdevkit/VOC2012/JPEGImages/2011_000376.jpg 500 334 1 1 14 347 296 1 326 81 500 334 1 1 1 171 141 +15281 /data/VOCdevkit/VOC2012/JPEGImages/2011_000379.jpg 500 297 7 11 10 500 294 +15282 /data/VOCdevkit/VOC2012/JPEGImages/2011_000382.jpg 500 375 19 13 55 128 184 19 117 28 280 137 +15283 /data/VOCdevkit/VOC2012/JPEGImages/2011_000383.jpg 375 500 8 63 16 228 131 8 139 106 278 291 8 72 288 202 500 +15284 /data/VOCdevkit/VOC2012/JPEGImages/2011_000385.jpg 500 375 11 147 23 392 258 11 157 257 249 354 +15285 /data/VOCdevkit/VOC2012/JPEGImages/2011_000386.jpg 375 500 17 1 320 375 500 +15286 /data/VOCdevkit/VOC2012/JPEGImages/2011_000388.jpg 403 500 15 1 1 306 500 15 303 117 403 391 +15287 /data/VOCdevkit/VOC2012/JPEGImages/2011_000391.jpg 500 375 14 168 68 500 375 14 1 107 226 375 14 359 86 433 219 14 175 89 238 265 14 184 153 269 298 15 13 172 34 221 +15288 /data/VOCdevkit/VOC2012/JPEGImages/2011_000392.jpg 500 375 2 33 15 500 375 +15289 /data/VOCdevkit/VOC2012/JPEGImages/2011_000396.jpg 374 500 12 223 208 313 312 12 78 241 132 303 +15290 /data/VOCdevkit/VOC2012/JPEGImages/2011_000397.jpg 500 375 13 27 58 475 324 +15291 /data/VOCdevkit/VOC2012/JPEGImages/2011_000398.jpg 500 375 18 200 40 500 375 14 105 147 137 216 14 88 147 114 205 +15292 /data/VOCdevkit/VOC2012/JPEGImages/2011_000399.jpg 500 375 17 1 177 283 375 19 353 114 443 190 +15293 /data/VOCdevkit/VOC2012/JPEGImages/2011_000400.jpg 375 500 19 136 188 214 260 +15294 /data/VOCdevkit/VOC2012/JPEGImages/2011_000404.jpg 500 382 16 405 241 499 331 16 261 223 391 344 16 158 200 291 317 16 106 184 178 287 16 78 210 130 275 +15295 /data/VOCdevkit/VOC2012/JPEGImages/2011_000408.jpg 500 375 10 1 177 500 375 14 1 93 135 255 14 90 105 179 219 14 175 104 273 214 14 227 93 301 195 14 350 104 412 178 14 319 53 500 357 +15296 /data/VOCdevkit/VOC2012/JPEGImages/2011_000412.jpg 500 375 1 14 5 469 375 +15297 /data/VOCdevkit/VOC2012/JPEGImages/2011_000413.jpg 500 375 14 423 113 460 164 14 323 74 471 375 14 196 99 278 351 14 72 110 163 375 14 113 98 254 375 +15298 /data/VOCdevkit/VOC2012/JPEGImages/2011_000416.jpg 480 360 6 118 41 480 300 14 2 25 163 360 +15299 /data/VOCdevkit/VOC2012/JPEGImages/2011_000418.jpg 500 375 12 402 242 487 328 +15300 /data/VOCdevkit/VOC2012/JPEGImages/2011_000419.jpg 500 375 7 90 159 178 246 7 285 176 500 253 +15301 /data/VOCdevkit/VOC2012/JPEGImages/2011_000420.jpg 500 375 14 140 125 355 375 +15302 /data/VOCdevkit/VOC2012/JPEGImages/2011_000426.jpg 500 449 7 8 43 461 438 +15303 /data/VOCdevkit/VOC2012/JPEGImages/2011_000427.jpg 500 375 10 1 202 459 375 14 315 34 500 375 14 144 54 329 250 14 76 104 151 210 +15304 /data/VOCdevkit/VOC2012/JPEGImages/2011_000428.jpg 500 375 11 117 1 363 253 +15305 /data/VOCdevkit/VOC2012/JPEGImages/2011_000430.jpg 500 375 11 17 33 500 365 +15306 /data/VOCdevkit/VOC2012/JPEGImages/2011_000432.jpg 500 375 6 150 163 382 332 6 1 108 128 254 +15307 /data/VOCdevkit/VOC2012/JPEGImages/2011_000434.jpg 500 375 17 178 104 500 288 19 40 63 122 138 14 230 98 330 268 +15308 /data/VOCdevkit/VOC2012/JPEGImages/2011_000435.jpg 500 375 3 410 1 500 130 3 71 1 500 375 14 199 65 280 279 14 114 24 199 254 +15309 /data/VOCdevkit/VOC2012/JPEGImages/2011_000436.jpg 500 374 16 166 121 301 206 16 203 159 282 205 +15310 /data/VOCdevkit/VOC2012/JPEGImages/2011_000438.jpg 500 375 4 164 313 209 375 14 1 137 202 366 14 347 103 498 375 14 207 114 385 375 14 1 220 275 375 +15311 /data/VOCdevkit/VOC2012/JPEGImages/2011_000442.jpg 500 332 18 78 103 313 204 +15312 /data/VOCdevkit/VOC2012/JPEGImages/2011_000444.jpg 500 461 19 47 21 497 435 +15313 /data/VOCdevkit/VOC2012/JPEGImages/2011_000445.jpg 500 375 14 190 172 437 375 +15314 /data/VOCdevkit/VOC2012/JPEGImages/2011_000449.jpg 500 329 11 104 10 427 314 +15315 /data/VOCdevkit/VOC2012/JPEGImages/2011_000450.jpg 500 369 16 215 143 371 302 +15316 /data/VOCdevkit/VOC2012/JPEGImages/2011_000453.jpg 500 317 1 101 83 390 301 14 159 2 311 304 4 171 200 231 225 +15317 /data/VOCdevkit/VOC2012/JPEGImages/2011_000454.jpg 500 375 16 357 180 429 239 16 184 196 242 241 16 131 216 200 280 +15318 /data/VOCdevkit/VOC2012/JPEGImages/2011_000455.jpg 500 333 13 76 186 475 333 14 145 37 388 333 14 322 1 451 333 +15319 /data/VOCdevkit/VOC2012/JPEGImages/2011_000456.jpg 500 333 2 284 78 402 294 +15320 /data/VOCdevkit/VOC2012/JPEGImages/2011_000457.jpg 500 333 17 1 1 498 331 +15321 /data/VOCdevkit/VOC2012/JPEGImages/2011_000461.jpg 500 375 10 1 1 499 375 +15322 /data/VOCdevkit/VOC2012/JPEGImages/2011_000465.jpg 281 500 1 95 271 278 391 +15323 /data/VOCdevkit/VOC2012/JPEGImages/2011_000468.jpg 500 375 15 25 4 426 369 +15324 /data/VOCdevkit/VOC2012/JPEGImages/2011_000469.jpg 401 500 7 1 9 323 494 +15325 /data/VOCdevkit/VOC2012/JPEGImages/2011_000471.jpg 500 375 14 295 124 496 375 14 74 89 300 375 14 1 93 42 262 +15326 /data/VOCdevkit/VOC2012/JPEGImages/2011_000472.jpg 500 375 8 423 260 499 363 +15327 /data/VOCdevkit/VOC2012/JPEGImages/2011_000474.jpg 500 334 1 1 1 395 334 +15328 /data/VOCdevkit/VOC2012/JPEGImages/2011_000475.jpg 500 342 17 7 78 495 338 14 221 19 406 337 14 108 87 224 337 14 151 164 238 253 14 310 126 417 227 +15329 /data/VOCdevkit/VOC2012/JPEGImages/2011_000477.jpg 500 333 17 1 17 500 333 14 38 42 466 296 +15330 /data/VOCdevkit/VOC2012/JPEGImages/2011_000479.jpg 500 333 14 310 71 470 332 14 194 115 313 309 14 130 29 336 333 14 32 88 203 333 14 1 120 98 333 +15331 /data/VOCdevkit/VOC2012/JPEGImages/2011_000481.jpg 500 333 0 188 85 302 211 +15332 /data/VOCdevkit/VOC2012/JPEGImages/2011_000482.jpg 500 333 2 1 25 427 332 +15333 /data/VOCdevkit/VOC2012/JPEGImages/2011_000485.jpg 500 333 1 1 118 500 333 14 152 2 433 333 +15334 /data/VOCdevkit/VOC2012/JPEGImages/2011_000487.jpg 332 500 13 1 1 330 495 +15335 /data/VOCdevkit/VOC2012/JPEGImages/2011_000491.jpg 500 333 18 194 142 289 201 18 1 6 137 219 +15336 /data/VOCdevkit/VOC2012/JPEGImages/2011_000492.jpg 500 375 8 300 180 432 345 8 69 206 210 371 10 145 161 331 342 10 1 144 77 283 14 63 100 227 351 14 257 90 408 331 14 257 87 330 180 10 443 190 500 363 +15337 /data/VOCdevkit/VOC2012/JPEGImages/2011_000494.jpg 500 333 2 192 105 500 303 2 151 124 244 332 +15338 /data/VOCdevkit/VOC2012/JPEGImages/2011_000496.jpg 500 375 13 194 201 242 278 6 270 180 346 250 14 194 178 240 252 +15339 /data/VOCdevkit/VOC2012/JPEGImages/2011_000498.jpg 500 375 18 232 1 499 375 +15340 /data/VOCdevkit/VOC2012/JPEGImages/2011_000499.jpg 500 334 19 193 107 220 133 8 110 138 183 208 8 1 147 94 234 17 286 166 500 334 +15341 /data/VOCdevkit/VOC2012/JPEGImages/2011_000502.jpg 257 171 9 115 70 155 107 +15342 /data/VOCdevkit/VOC2012/JPEGImages/2011_000503.jpg 500 374 6 1 250 18 287 6 12 237 103 313 6 395 243 491 289 6 459 272 499 362 6 262 251 400 306 6 170 277 495 374 +15343 /data/VOCdevkit/VOC2012/JPEGImages/2011_000505.jpg 500 375 1 55 193 266 323 6 320 215 368 241 6 370 215 406 240 6 252 214 293 244 6 1 210 71 247 6 16 214 97 248 14 96 112 194 325 6 302 216 325 232 +15344 /data/VOCdevkit/VOC2012/JPEGImages/2011_000509.jpg 500 375 6 11 122 465 337 6 244 74 376 160 6 2 91 67 163 6 374 77 448 122 14 132 69 154 133 14 163 72 180 131 14 461 54 500 225 14 68 68 81 146 14 401 60 420 118 14 441 61 467 149 14 213 70 228 124 14 232 68 249 122 +15345 /data/VOCdevkit/VOC2012/JPEGImages/2011_000511.jpg 500 333 2 115 90 425 256 +15346 /data/VOCdevkit/VOC2012/JPEGImages/2011_000512.jpg 500 375 13 91 6 431 368 13 1 1 86 375 +15347 /data/VOCdevkit/VOC2012/JPEGImages/2011_000513.jpg 500 334 18 105 107 487 244 +15348 /data/VOCdevkit/VOC2012/JPEGImages/2011_000514.jpg 334 500 15 2 39 250 444 +15349 /data/VOCdevkit/VOC2012/JPEGImages/2011_000518.jpg 500 285 8 345 140 455 249 8 310 108 343 149 8 345 114 398 162 8 235 119 285 151 14 214 116 275 153 +15350 /data/VOCdevkit/VOC2012/JPEGImages/2011_000519.jpg 500 375 12 97 13 252 363 12 284 104 428 375 +15351 /data/VOCdevkit/VOC2012/JPEGImages/2011_000520.jpg 500 375 14 110 36 388 375 +15352 /data/VOCdevkit/VOC2012/JPEGImages/2011_000521.jpg 500 333 18 1 91 428 231 +15353 /data/VOCdevkit/VOC2012/JPEGImages/2011_000526.jpg 500 332 12 68 18 500 331 +15354 /data/VOCdevkit/VOC2012/JPEGImages/2011_000530.jpg 500 375 15 1 171 52 302 15 370 161 410 239 8 341 173 375 267 10 224 176 364 214 +15355 /data/VOCdevkit/VOC2012/JPEGImages/2011_000531.jpg 500 333 0 1 102 500 311 +15356 /data/VOCdevkit/VOC2012/JPEGImages/2011_000532.jpg 500 375 11 217 139 426 272 +15357 /data/VOCdevkit/VOC2012/JPEGImages/2011_000534.jpg 500 375 14 83 89 486 375 14 116 74 371 375 14 296 102 470 375 +15358 /data/VOCdevkit/VOC2012/JPEGImages/2011_000536.jpg 500 375 11 126 50 382 353 +15359 /data/VOCdevkit/VOC2012/JPEGImages/2011_000538.jpg 500 375 12 267 113 428 275 12 183 126 335 265 14 251 83 292 160 14 332 92 390 201 +15360 /data/VOCdevkit/VOC2012/JPEGImages/2011_000541.jpg 500 326 5 86 75 399 269 5 401 54 500 289 14 221 130 257 204 +15361 /data/VOCdevkit/VOC2012/JPEGImages/2011_000542.jpg 500 375 11 1 1 450 375 +15362 /data/VOCdevkit/VOC2012/JPEGImages/2011_000548.jpg 500 273 9 289 57 409 209 9 181 70 347 229 9 119 63 262 203 9 372 32 411 131 9 404 33 459 138 2 157 138 185 186 2 114 193 148 246 2 65 147 109 187 +15363 /data/VOCdevkit/VOC2012/JPEGImages/2011_000550.jpg 500 375 17 126 105 500 343 +15364 /data/VOCdevkit/VOC2012/JPEGImages/2011_000551.jpg 500 375 5 74 176 202 212 5 197 147 426 234 +15365 /data/VOCdevkit/VOC2012/JPEGImages/2011_000554.jpg 500 333 2 435 156 478 258 2 388 161 462 273 2 365 150 407 240 2 351 145 376 229 2 310 174 349 289 2 259 160 304 272 2 304 146 349 229 2 268 129 323 221 2 270 130 291 165 2 230 129 256 209 2 187 137 247 227 2 145 192 225 309 2 106 192 166 300 2 54 177 127 286 2 8 162 76 263 2 109 149 145 196 2 137 145 190 214 2 161 131 209 200 14 29 11 66 60 14 5 1 34 64 +15366 /data/VOCdevkit/VOC2012/JPEGImages/2011_000556.jpg 500 375 3 164 35 406 246 +15367 /data/VOCdevkit/VOC2012/JPEGImages/2011_000557.jpg 500 375 14 331 1 380 118 14 382 1 427 121 14 2 2 115 277 +15368 /data/VOCdevkit/VOC2012/JPEGImages/2011_000558.jpg 500 370 18 110 131 494 284 +15369 /data/VOCdevkit/VOC2012/JPEGImages/2011_000559.jpg 500 333 5 89 78 432 283 5 1 99 54 209 6 67 153 98 205 14 474 105 500 157 14 471 183 500 231 +15370 /data/VOCdevkit/VOC2012/JPEGImages/2011_000560.jpg 500 375 6 10 3 446 190 6 429 1 500 105 13 91 20 424 361 +15371 /data/VOCdevkit/VOC2012/JPEGImages/2011_000565.jpg 500 375 17 176 105 498 299 +15372 /data/VOCdevkit/VOC2012/JPEGImages/2011_000566.jpg 500 355 9 222 149 500 355 9 32 155 206 355 14 132 62 380 355 +15373 /data/VOCdevkit/VOC2012/JPEGImages/2011_000567.jpg 500 375 8 1 88 81 228 14 131 124 248 264 14 283 125 391 269 14 320 2 400 170 +15374 /data/VOCdevkit/VOC2012/JPEGImages/2011_000569.jpg 500 375 6 1 191 119 296 +15375 /data/VOCdevkit/VOC2012/JPEGImages/2011_000572.jpg 500 375 15 29 193 144 285 15 133 164 181 229 15 219 144 266 236 17 376 183 447 294 8 137 221 277 317 +15376 /data/VOCdevkit/VOC2012/JPEGImages/2011_000573.jpg 500 375 8 189 209 359 375 8 320 148 461 357 10 30 151 447 375 8 54 206 193 375 8 146 156 238 180 +15377 /data/VOCdevkit/VOC2012/JPEGImages/2011_000575.jpg 500 375 8 93 2 232 336 14 233 153 426 302 14 1 1 291 375 8 155 121 448 375 +15378 /data/VOCdevkit/VOC2012/JPEGImages/2011_000577.jpg 500 381 11 92 141 249 260 14 282 171 351 260 +15379 /data/VOCdevkit/VOC2012/JPEGImages/2011_000578.jpg 375 500 11 59 86 347 414 +15380 /data/VOCdevkit/VOC2012/JPEGImages/2011_000579.jpg 500 375 1 52 1 499 375 +15381 /data/VOCdevkit/VOC2012/JPEGImages/2011_000585.jpg 353 500 1 74 106 302 311 14 166 30 304 266 +15382 /data/VOCdevkit/VOC2012/JPEGImages/2011_000586.jpg 500 375 0 48 65 483 364 0 36 1 393 148 14 483 89 500 141 14 457 198 478 261 14 435 202 460 262 14 422 207 437 254 +15383 /data/VOCdevkit/VOC2012/JPEGImages/2011_000589.jpg 500 332 14 419 48 480 161 14 65 10 150 177 +15384 /data/VOCdevkit/VOC2012/JPEGImages/2011_000592.jpg 500 333 0 26 84 456 241 +15385 /data/VOCdevkit/VOC2012/JPEGImages/2011_000594.jpg 500 375 12 209 53 317 334 14 28 3 228 362 +15386 /data/VOCdevkit/VOC2012/JPEGImages/2011_000596.jpg 500 375 7 132 69 287 266 +15387 /data/VOCdevkit/VOC2012/JPEGImages/2011_000598.jpg 375 500 10 1 246 298 500 +15388 /data/VOCdevkit/VOC2012/JPEGImages/2011_000600.jpg 500 332 1 472 63 500 143 14 319 22 343 127 14 343 31 373 123 14 461 20 495 130 14 388 70 412 93 14 436 70 466 126 +15389 /data/VOCdevkit/VOC2012/JPEGImages/2011_000607.jpg 500 375 8 356 259 473 375 19 367 162 425 226 +15390 /data/VOCdevkit/VOC2012/JPEGImages/2011_000608.jpg 500 375 19 347 142 450 226 17 223 239 500 375 8 1 296 152 375 +15391 /data/VOCdevkit/VOC2012/JPEGImages/2011_000609.jpg 500 338 9 190 130 250 201 +15392 /data/VOCdevkit/VOC2012/JPEGImages/2011_000612.jpg 500 404 12 168 128 299 234 14 209 74 256 193 +15393 /data/VOCdevkit/VOC2012/JPEGImages/2011_000618.jpg 500 375 13 16 112 374 375 14 136 66 318 313 +15394 /data/VOCdevkit/VOC2012/JPEGImages/2011_000621.jpg 334 500 10 1 334 334 500 +15395 /data/VOCdevkit/VOC2012/JPEGImages/2011_000622.jpg 375 500 4 2 173 38 368 4 21 49 82 354 4 81 263 131 391 4 91 2 158 336 4 119 98 238 385 +15396 /data/VOCdevkit/VOC2012/JPEGImages/2011_000627.jpg 500 375 18 46 143 486 256 +15397 /data/VOCdevkit/VOC2012/JPEGImages/2011_000628.jpg 500 375 12 7 146 153 321 12 126 146 254 333 14 103 171 137 288 14 75 157 137 375 14 341 139 383 266 +15398 /data/VOCdevkit/VOC2012/JPEGImages/2011_000629.jpg 500 333 0 1 47 500 278 +15399 /data/VOCdevkit/VOC2012/JPEGImages/2011_000630.jpg 500 375 17 1 164 225 356 14 130 77 233 227 14 222 219 500 375 14 257 217 432 285 14 68 156 244 263 +15400 /data/VOCdevkit/VOC2012/JPEGImages/2011_000631.jpg 500 333 3 136 67 388 267 3 85 152 122 192 3 368 213 421 235 +15401 /data/VOCdevkit/VOC2012/JPEGImages/2011_000634.jpg 500 375 7 16 36 490 355 +15402 /data/VOCdevkit/VOC2012/JPEGImages/2011_000637.jpg 500 375 13 1 40 500 374 14 302 1 349 80 14 196 1 253 104 14 156 1 193 104 14 116 1 164 95 13 1 17 48 58 13 455 7 500 45 +15403 /data/VOCdevkit/VOC2012/JPEGImages/2011_000638.jpg 500 333 14 370 194 489 333 14 174 121 376 332 14 2 104 172 333 +15404 /data/VOCdevkit/VOC2012/JPEGImages/2011_000641.jpg 500 333 16 412 223 459 272 16 295 214 341 248 16 48 229 111 277 +15405 /data/VOCdevkit/VOC2012/JPEGImages/2011_000642.jpg 500 375 14 54 50 345 283 14 219 129 361 298 14 367 11 500 375 +15406 /data/VOCdevkit/VOC2012/JPEGImages/2011_000646.jpg 500 375 14 1 76 110 375 14 162 85 359 375 14 110 72 316 375 +15407 /data/VOCdevkit/VOC2012/JPEGImages/2011_000651.jpg 389 500 13 55 79 342 441 +15408 /data/VOCdevkit/VOC2012/JPEGImages/2011_000652.jpg 500 375 13 73 1 500 354 +15409 /data/VOCdevkit/VOC2012/JPEGImages/2011_000655.jpg 500 327 9 193 225 219 248 9 393 223 423 244 9 226 221 243 237 +15410 /data/VOCdevkit/VOC2012/JPEGImages/2011_000656.jpg 500 289 0 8 51 471 231 +15411 /data/VOCdevkit/VOC2012/JPEGImages/2011_000657.jpg 500 375 17 31 140 429 373 14 218 114 372 375 14 40 99 235 375 +15412 /data/VOCdevkit/VOC2012/JPEGImages/2011_000658.jpg 500 375 6 367 303 499 353 6 196 312 227 350 +15413 /data/VOCdevkit/VOC2012/JPEGImages/2011_000661.jpg 500 375 7 72 49 434 347 8 1 1 489 375 +15414 /data/VOCdevkit/VOC2012/JPEGImages/2011_000666.jpg 500 333 8 362 262 442 322 +15415 /data/VOCdevkit/VOC2012/JPEGImages/2011_000669.jpg 500 334 2 184 106 250 220 2 238 74 323 167 +15416 /data/VOCdevkit/VOC2012/JPEGImages/2011_000673.jpg 500 375 2 68 181 336 273 +15417 /data/VOCdevkit/VOC2012/JPEGImages/2011_000675.jpg 500 375 12 434 180 500 251 12 296 160 433 270 12 122 167 188 311 12 33 179 77 230 12 182 176 225 210 14 1 177 25 241 14 121 102 186 231 14 218 174 240 260 14 481 137 500 220 14 336 131 366 221 +15418 /data/VOCdevkit/VOC2012/JPEGImages/2011_000679.jpg 500 375 14 130 33 364 303 +15419 /data/VOCdevkit/VOC2012/JPEGImages/2011_000682.jpg 500 375 8 123 74 277 342 8 274 71 430 339 8 1 87 75 362 +15420 /data/VOCdevkit/VOC2012/JPEGImages/2011_000683.jpg 500 375 3 352 299 474 351 3 2 230 275 282 14 267 177 420 327 14 60 197 201 283 +15421 /data/VOCdevkit/VOC2012/JPEGImages/2011_000684.jpg 500 343 6 460 157 500 225 14 4 188 75 343 14 150 124 205 299 14 197 147 271 325 14 295 163 346 342 14 346 153 429 343 14 461 214 500 327 14 437 174 473 279 8 114 278 172 343 8 186 290 286 343 8 400 277 480 343 8 460 259 500 343 10 257 264 358 343 +15422 /data/VOCdevkit/VOC2012/JPEGImages/2011_000685.jpg 500 375 19 49 26 437 359 +15423 /data/VOCdevkit/VOC2012/JPEGImages/2011_000688.jpg 500 375 18 12 59 497 374 14 1 199 26 295 +15424 /data/VOCdevkit/VOC2012/JPEGImages/2011_000689.jpg 375 500 17 108 245 373 436 14 52 72 199 485 14 184 293 319 500 8 13 167 73 274 +15425 /data/VOCdevkit/VOC2012/JPEGImages/2011_000690.jpg 375 500 1 72 1 372 499 +15426 /data/VOCdevkit/VOC2012/JPEGImages/2011_000692.jpg 333 500 10 1 234 330 500 14 174 116 235 246 14 1 118 40 318 +15427 /data/VOCdevkit/VOC2012/JPEGImages/2011_000698.jpg 500 397 0 113 150 385 229 +15428 /data/VOCdevkit/VOC2012/JPEGImages/2011_000701.jpg 500 375 6 1 100 434 297 +15429 /data/VOCdevkit/VOC2012/JPEGImages/2011_000703.jpg 500 361 5 122 23 342 321 5 1 4 103 331 5 311 38 500 303 +15430 /data/VOCdevkit/VOC2012/JPEGImages/2011_000704.jpg 500 375 7 220 68 483 314 +15431 /data/VOCdevkit/VOC2012/JPEGImages/2011_000709.jpg 500 375 11 1 7 289 370 +15432 /data/VOCdevkit/VOC2012/JPEGImages/2011_000711.jpg 500 375 14 179 1 376 375 +15433 /data/VOCdevkit/VOC2012/JPEGImages/2011_000713.jpg 500 375 4 249 199 381 374 14 35 63 368 375 +15434 /data/VOCdevkit/VOC2012/JPEGImages/2011_000718.jpg 500 375 2 181 126 267 227 +15435 /data/VOCdevkit/VOC2012/JPEGImages/2011_000724.jpg 500 313 6 118 147 419 266 14 37 25 86 131 14 77 32 126 109 14 202 71 228 162 14 246 114 282 167 14 352 79 387 156 14 408 85 430 155 14 427 87 445 156 14 439 86 451 148 14 454 93 471 151 +15436 /data/VOCdevkit/VOC2012/JPEGImages/2011_000725.jpg 500 332 14 41 36 467 332 14 199 33 482 332 +15437 /data/VOCdevkit/VOC2012/JPEGImages/2011_000730.jpg 375 500 11 116 27 375 217 11 40 351 266 500 +15438 /data/VOCdevkit/VOC2012/JPEGImages/2011_000731.jpg 500 375 15 279 185 414 271 8 2 228 111 374 8 205 241 275 348 8 249 249 305 271 8 413 255 464 280 10 179 311 499 375 10 95 257 171 330 10 246 269 461 313 14 133 180 219 315 14 21 180 110 268 +15439 /data/VOCdevkit/VOC2012/JPEGImages/2011_000734.jpg 333 500 2 76 24 238 176 2 63 128 269 500 +15440 /data/VOCdevkit/VOC2012/JPEGImages/2011_000743.jpg 375 500 15 1 13 288 500 15 1 433 117 500 +15441 /data/VOCdevkit/VOC2012/JPEGImages/2011_000744.jpg 375 500 3 257 8 334 87 3 209 166 300 262 3 271 241 358 330 3 295 154 375 246 3 347 277 375 340 3 322 357 375 448 +15442 /data/VOCdevkit/VOC2012/JPEGImages/2011_000745.jpg 500 375 4 247 1 318 130 10 82 97 247 250 10 131 204 500 375 14 250 54 500 279 14 1 141 226 375 14 28 70 118 159 8 147 104 253 247 8 171 90 200 117 8 335 92 365 130 14 303 20 376 134 14 442 30 500 100 10 344 81 500 175 +15443 /data/VOCdevkit/VOC2012/JPEGImages/2011_000747.jpg 375 500 15 260 442 308 498 15 303 442 346 494 15 341 414 375 478 15 319 300 375 419 15 304 196 368 260 4 229 174 243 226 4 214 172 229 227 4 187 173 201 226 4 174 177 190 227 4 157 177 172 228 4 137 184 154 229 4 152 245 167 297 4 138 245 154 297 4 122 245 135 297 4 111 252 129 298 4 96 245 110 297 4 85 248 100 299 4 65 250 81 299 4 35 251 51 299 4 23 251 37 296 4 106 244 118 295 +15444 /data/VOCdevkit/VOC2012/JPEGImages/2011_000748.jpg 500 391 12 254 134 426 355 12 172 135 333 364 14 303 158 397 391 +15445 /data/VOCdevkit/VOC2012/JPEGImages/2011_000749.jpg 500 375 3 148 14 335 325 +15446 /data/VOCdevkit/VOC2012/JPEGImages/2011_000753.jpg 500 375 14 1 156 498 375 +15447 /data/VOCdevkit/VOC2012/JPEGImages/2011_000755.jpg 375 500 19 18 133 149 285 8 60 283 273 500 +15448 /data/VOCdevkit/VOC2012/JPEGImages/2011_000757.jpg 500 375 11 1 1 416 375 +15449 /data/VOCdevkit/VOC2012/JPEGImages/2011_000758.jpg 500 332 7 1 54 136 188 7 34 69 220 330 7 273 68 497 206 +15450 /data/VOCdevkit/VOC2012/JPEGImages/2011_000759.jpg 500 375 16 301 1 359 70 16 224 1 305 68 16 141 1 213 70 16 73 5 146 76 16 30 59 415 375 +15451 /data/VOCdevkit/VOC2012/JPEGImages/2011_000763.jpg 500 375 9 1 1 451 355 +15452 /data/VOCdevkit/VOC2012/JPEGImages/2011_000765.jpg 500 375 17 46 21 437 335 +15453 /data/VOCdevkit/VOC2012/JPEGImages/2011_000767.jpg 333 500 5 58 264 312 482 14 166 216 211 268 14 51 366 91 475 14 1 369 37 484 +15454 /data/VOCdevkit/VOC2012/JPEGImages/2011_000768.jpg 500 375 14 1 1 348 375 14 137 203 500 375 +15455 /data/VOCdevkit/VOC2012/JPEGImages/2011_000769.jpg 500 375 7 214 83 399 375 7 2 52 282 375 +15456 /data/VOCdevkit/VOC2012/JPEGImages/2011_000770.jpg 370 500 13 59 20 308 403 13 185 333 257 383 +15457 /data/VOCdevkit/VOC2012/JPEGImages/2011_000771.jpg 500 333 12 356 166 402 212 +15458 /data/VOCdevkit/VOC2012/JPEGImages/2011_000772.jpg 500 375 11 176 21 361 375 14 18 58 408 375 14 312 1 500 375 +15459 /data/VOCdevkit/VOC2012/JPEGImages/2011_000774.jpg 500 375 14 1 1 273 375 14 185 102 472 375 +15460 /data/VOCdevkit/VOC2012/JPEGImages/2011_000778.jpg 500 363 9 290 199 336 213 9 280 213 384 274 9 191 204 228 236 9 117 205 161 256 9 3 232 151 358 9 192 211 263 279 +15461 /data/VOCdevkit/VOC2012/JPEGImages/2011_000780.jpg 375 500 7 54 6 281 421 +15462 /data/VOCdevkit/VOC2012/JPEGImages/2011_000784.jpg 500 357 9 17 14 486 337 +15463 /data/VOCdevkit/VOC2012/JPEGImages/2011_000785.jpg 332 500 6 234 81 292 103 14 125 97 286 500 14 75 200 332 475 +15464 /data/VOCdevkit/VOC2012/JPEGImages/2011_000788.jpg 500 369 11 107 54 449 362 11 70 178 210 257 +15465 /data/VOCdevkit/VOC2012/JPEGImages/2011_000789.jpg 375 500 7 1 1 374 500 +15466 /data/VOCdevkit/VOC2012/JPEGImages/2011_000790.jpg 500 375 0 67 30 432 265 +15467 /data/VOCdevkit/VOC2012/JPEGImages/2011_000791.jpg 500 375 1 1 1 500 312 +15468 /data/VOCdevkit/VOC2012/JPEGImages/2011_000793.jpg 500 375 0 1 1 482 326 +15469 /data/VOCdevkit/VOC2012/JPEGImages/2011_000800.jpg 500 375 14 273 131 452 310 +15470 /data/VOCdevkit/VOC2012/JPEGImages/2011_000804.jpg 339 500 5 2 59 339 500 +15471 /data/VOCdevkit/VOC2012/JPEGImages/2011_000806.jpg 500 333 14 196 143 394 333 14 325 34 500 333 +15472 /data/VOCdevkit/VOC2012/JPEGImages/2011_000807.jpg 500 344 0 49 83 204 134 +15473 /data/VOCdevkit/VOC2012/JPEGImages/2011_000809.jpg 500 376 8 29 102 280 351 14 52 14 266 370 +15474 /data/VOCdevkit/VOC2012/JPEGImages/2011_000813.jpg 375 500 7 105 251 374 410 8 79 17 374 500 +15475 /data/VOCdevkit/VOC2012/JPEGImages/2011_000815.jpg 500 375 8 133 82 264 190 10 15 168 494 375 8 432 121 500 205 8 1 206 176 375 8 233 203 500 375 +15476 /data/VOCdevkit/VOC2012/JPEGImages/2011_000819.jpg 500 292 18 11 61 482 265 +15477 /data/VOCdevkit/VOC2012/JPEGImages/2011_000820.jpg 375 500 17 1 180 375 500 +15478 /data/VOCdevkit/VOC2012/JPEGImages/2011_000823.jpg 500 375 4 211 192 227 246 4 160 330 184 375 8 232 322 398 375 8 340 248 457 374 8 58 198 127 353 10 160 216 327 375 14 274 165 421 375 14 319 155 432 290 14 197 120 287 326 14 89 132 199 356 15 25 110 133 322 +15479 /data/VOCdevkit/VOC2012/JPEGImages/2011_000824.jpg 500 436 7 187 54 420 420 +15480 /data/VOCdevkit/VOC2012/JPEGImages/2011_000827.jpg 500 375 4 85 314 124 375 4 96 220 115 255 10 1 228 234 375 14 201 108 500 375 14 260 142 429 375 14 189 138 312 338 14 155 145 221 249 +15481 /data/VOCdevkit/VOC2012/JPEGImages/2011_000828.jpg 500 380 14 61 164 220 380 14 200 122 327 380 14 301 155 500 380 14 31 1 143 236 14 115 33 223 201 14 223 25 353 235 14 357 26 471 269 +15482 /data/VOCdevkit/VOC2012/JPEGImages/2011_000829.jpg 500 398 16 138 134 431 374 16 226 31 392 82 16 341 11 430 63 16 450 18 489 90 16 441 5 500 51 14 13 38 287 390 14 263 63 464 343 +15483 /data/VOCdevkit/VOC2012/JPEGImages/2011_000830.jpg 347 500 5 33 34 320 430 5 1 105 173 380 5 314 220 347 308 +15484 /data/VOCdevkit/VOC2012/JPEGImages/2011_000831.jpg 375 500 2 94 110 287 500 +15485 /data/VOCdevkit/VOC2012/JPEGImages/2011_000834.jpg 500 375 2 136 140 179 167 16 329 168 429 255 16 89 153 194 256 +15486 /data/VOCdevkit/VOC2012/JPEGImages/2011_000837.jpg 500 375 8 195 1 335 44 8 1 77 57 196 8 45 318 347 375 10 1 40 455 375 +15487 /data/VOCdevkit/VOC2012/JPEGImages/2011_000839.jpg 500 336 3 6 54 498 329 +15488 /data/VOCdevkit/VOC2012/JPEGImages/2011_000840.jpg 500 309 12 16 45 304 282 12 261 107 488 270 +15489 /data/VOCdevkit/VOC2012/JPEGImages/2011_000843.jpg 500 375 4 258 239 331 297 14 22 1 387 375 14 113 135 440 375 +15490 /data/VOCdevkit/VOC2012/JPEGImages/2011_000845.jpg 333 500 0 2 19 332 500 +15491 /data/VOCdevkit/VOC2012/JPEGImages/2011_000847.jpg 500 375 4 138 34 221 358 4 222 36 306 357 10 1 223 500 375 +15492 /data/VOCdevkit/VOC2012/JPEGImages/2011_000848.jpg 500 333 18 292 158 499 242 18 63 183 305 245 +15493 /data/VOCdevkit/VOC2012/JPEGImages/2011_000850.jpg 500 375 2 112 57 447 375 +15494 /data/VOCdevkit/VOC2012/JPEGImages/2011_000851.jpg 375 500 14 55 235 248 500 +15495 /data/VOCdevkit/VOC2012/JPEGImages/2011_000853.jpg 500 375 6 1 280 16 340 6 12 300 34 326 6 58 296 99 331 6 135 298 175 332 +15496 /data/VOCdevkit/VOC2012/JPEGImages/2011_000855.jpg 400 500 7 19 39 399 496 +15497 /data/VOCdevkit/VOC2012/JPEGImages/2011_000858.jpg 500 384 18 185 64 499 381 14 97 78 342 359 14 243 102 309 314 14 43 111 121 199 +15498 /data/VOCdevkit/VOC2012/JPEGImages/2011_000859.jpg 500 375 14 214 62 500 375 14 7 85 250 375 14 1 24 64 165 +15499 /data/VOCdevkit/VOC2012/JPEGImages/2011_000872.jpg 500 336 0 109 84 364 247 +15500 /data/VOCdevkit/VOC2012/JPEGImages/2011_000874.jpg 500 313 0 7 87 494 198 14 458 171 467 199 +15501 /data/VOCdevkit/VOC2012/JPEGImages/2011_000875.jpg 500 375 15 9 10 114 98 15 107 160 214 207 15 284 166 375 207 4 489 183 500 238 8 273 202 343 274 8 173 231 226 375 10 204 270 499 374 +15502 /data/VOCdevkit/VOC2012/JPEGImages/2011_000882.jpg 334 500 0 2 162 334 500 14 136 80 237 179 +15503 /data/VOCdevkit/VOC2012/JPEGImages/2011_000885.jpg 500 375 15 328 54 459 202 8 292 229 412 375 14 274 140 362 245 14 118 143 229 368 14 64 112 105 212 14 106 145 130 189 14 259 142 288 176 8 72 212 209 375 8 448 247 500 375 8 465 193 500 247 8 12 165 38 218 8 40 163 66 212 4 260 172 280 232 4 242 171 252 195 +15504 /data/VOCdevkit/VOC2012/JPEGImages/2011_000887.jpg 500 375 6 159 145 310 205 6 45 120 120 190 14 11 142 42 193 +15505 /data/VOCdevkit/VOC2012/JPEGImages/2011_000888.jpg 500 375 5 11 64 435 290 14 332 144 369 177 +15506 /data/VOCdevkit/VOC2012/JPEGImages/2011_000893.jpg 500 375 12 285 41 454 375 12 90 71 301 374 12 1 101 196 375 12 138 183 335 303 +15507 /data/VOCdevkit/VOC2012/JPEGImages/2011_000895.jpg 500 375 18 53 144 291 334 +15508 /data/VOCdevkit/VOC2012/JPEGImages/2011_000897.jpg 500 375 6 355 206 499 301 +15509 /data/VOCdevkit/VOC2012/JPEGImages/2011_000898.jpg 500 375 13 40 76 264 279 13 160 81 356 243 13 252 75 400 223 +15510 /data/VOCdevkit/VOC2012/JPEGImages/2011_000899.jpg 500 378 14 199 1 500 371 +15511 /data/VOCdevkit/VOC2012/JPEGImages/2011_000900.jpg 500 371 6 176 94 475 311 6 438 77 500 126 6 1 57 162 294 6 1 26 160 109 6 137 46 252 140 6 184 51 359 98 6 264 52 401 101 6 324 54 423 104 6 464 48 500 74 +15512 /data/VOCdevkit/VOC2012/JPEGImages/2011_000901.jpg 500 334 5 52 12 464 292 +15513 /data/VOCdevkit/VOC2012/JPEGImages/2011_000908.jpg 500 375 14 1 64 414 333 +15514 /data/VOCdevkit/VOC2012/JPEGImages/2011_000909.jpg 500 333 18 39 71 284 286 +15515 /data/VOCdevkit/VOC2012/JPEGImages/2011_000912.jpg 500 375 2 198 197 251 228 +15516 /data/VOCdevkit/VOC2012/JPEGImages/2011_000917.jpg 351 500 8 13 242 173 500 8 234 250 347 426 8 117 243 252 462 +15517 /data/VOCdevkit/VOC2012/JPEGImages/2011_000919.jpg 500 375 15 179 105 313 239 15 324 5 443 56 8 252 160 345 319 8 281 197 461 375 8 73 161 188 355 8 81 220 266 375 10 122 201 375 375 +15518 /data/VOCdevkit/VOC2012/JPEGImages/2011_000920.jpg 396 500 4 217 11 276 172 +15519 /data/VOCdevkit/VOC2012/JPEGImages/2011_000922.jpg 437 287 0 226 64 339 151 0 179 184 287 267 +15520 /data/VOCdevkit/VOC2012/JPEGImages/2011_000927.jpg 500 333 13 22 120 261 248 14 67 121 155 261 +15521 /data/VOCdevkit/VOC2012/JPEGImages/2011_000930.jpg 500 333 12 99 1 477 332 +15522 /data/VOCdevkit/VOC2012/JPEGImages/2011_000932.jpg 500 375 8 365 231 488 375 10 1 289 169 375 14 68 48 159 299 14 152 42 232 375 14 190 90 292 375 14 240 57 299 229 14 274 68 321 227 14 285 75 382 363 14 413 26 500 218 +15523 /data/VOCdevkit/VOC2012/JPEGImages/2011_000933.jpg 500 375 1 57 113 317 375 4 191 258 234 316 14 283 24 417 335 +15524 /data/VOCdevkit/VOC2012/JPEGImages/2011_000934.jpg 375 500 15 5 53 341 500 +15525 /data/VOCdevkit/VOC2012/JPEGImages/2011_000940.jpg 500 333 13 1 1 437 333 +15526 /data/VOCdevkit/VOC2012/JPEGImages/2011_000944.jpg 500 375 18 1 1 500 343 +15527 /data/VOCdevkit/VOC2012/JPEGImages/2011_000947.jpg 500 375 4 140 264 158 326 8 295 207 336 232 8 324 215 360 304 17 373 220 500 375 14 145 181 199 261 10 25 239 357 375 +15528 /data/VOCdevkit/VOC2012/JPEGImages/2011_000950.jpg 500 375 1 42 68 468 320 +15529 /data/VOCdevkit/VOC2012/JPEGImages/2011_000951.jpg 500 333 4 35 28 132 317 +15530 /data/VOCdevkit/VOC2012/JPEGImages/2011_000953.jpg 500 375 4 349 240 380 304 10 31 211 499 375 14 277 151 363 258 14 271 103 389 260 14 192 98 281 281 14 3 110 174 338 +15531 /data/VOCdevkit/VOC2012/JPEGImages/2011_000954.jpg 500 375 6 1 108 385 375 6 296 124 489 235 14 69 134 134 200 14 183 133 249 185 14 250 103 329 222 14 319 90 347 157 14 293 112 308 133 6 1 137 35 199 +15532 /data/VOCdevkit/VOC2012/JPEGImages/2011_000957.jpg 500 375 15 261 1 335 150 14 150 106 323 375 8 113 170 367 375 8 150 130 362 234 +15533 /data/VOCdevkit/VOC2012/JPEGImages/2011_000961.jpg 400 300 11 1 79 292 300 +15534 /data/VOCdevkit/VOC2012/JPEGImages/2011_000965.jpg 500 375 19 271 136 369 237 8 119 238 231 375 +15535 /data/VOCdevkit/VOC2012/JPEGImages/2011_000969.jpg 500 321 5 177 160 440 268 +15536 /data/VOCdevkit/VOC2012/JPEGImages/2011_000971.jpg 500 375 8 34 41 368 311 +15537 /data/VOCdevkit/VOC2012/JPEGImages/2011_000973.jpg 500 488 7 48 64 359 458 +15538 /data/VOCdevkit/VOC2012/JPEGImages/2011_000975.jpg 500 375 0 1 46 428 373 +15539 /data/VOCdevkit/VOC2012/JPEGImages/2011_000977.jpg 500 334 14 222 96 303 197 14 431 30 484 60 14 100 38 124 67 14 153 28 171 62 +15540 /data/VOCdevkit/VOC2012/JPEGImages/2011_000979.jpg 500 339 18 30 84 392 230 14 126 121 272 337 14 246 148 368 336 +15541 /data/VOCdevkit/VOC2012/JPEGImages/2011_000981.jpg 375 500 11 40 162 225 405 +15542 /data/VOCdevkit/VOC2012/JPEGImages/2011_000982.jpg 333 480 12 89 222 180 412 12 126 157 243 394 +15543 /data/VOCdevkit/VOC2012/JPEGImages/2011_000983.jpg 500 321 8 1 92 189 283 14 1 33 500 321 +15544 /data/VOCdevkit/VOC2012/JPEGImages/2011_000986.jpg 500 333 3 201 131 464 190 3 196 109 358 132 +15545 /data/VOCdevkit/VOC2012/JPEGImages/2011_000987.jpg 500 375 18 1 67 420 316 +15546 /data/VOCdevkit/VOC2012/JPEGImages/2011_000990.jpg 500 375 14 30 46 283 360 14 270 104 436 327 +15547 /data/VOCdevkit/VOC2012/JPEGImages/2011_000991.jpg 500 375 14 199 103 404 375 14 367 63 493 375 14 305 43 370 204 14 189 14 309 213 14 62 159 152 319 14 1 123 63 370 14 25 213 63 293 14 154 159 188 230 14 56 157 88 228 14 100 132 156 278 +15548 /data/VOCdevkit/VOC2012/JPEGImages/2011_000996.jpg 500 375 14 1 132 92 197 14 1 72 126 271 14 124 135 500 375 14 320 79 406 157 14 201 79 307 194 14 274 62 358 210 4 104 259 135 359 4 149 287 181 352 4 238 188 262 255 4 163 176 202 290 4 218 160 240 223 10 27 136 500 375 +15549 /data/VOCdevkit/VOC2012/JPEGImages/2011_000997.jpg 500 375 18 2 60 489 216 +15550 /data/VOCdevkit/VOC2012/JPEGImages/2011_000999.jpg 420 500 7 16 21 403 468 +15551 /data/VOCdevkit/VOC2012/JPEGImages/2011_001001.jpg 500 331 2 423 80 451 102 2 126 162 154 193 3 336 108 499 324 3 130 138 253 245 3 209 62 471 296 3 351 1 420 13 14 233 125 286 220 14 286 125 332 227 +15552 /data/VOCdevkit/VOC2012/JPEGImages/2011_001004.jpg 500 350 6 32 46 489 324 +15553 /data/VOCdevkit/VOC2012/JPEGImages/2011_001005.jpg 500 375 17 43 16 465 375 +15554 /data/VOCdevkit/VOC2012/JPEGImages/2011_001008.jpg 500 375 4 201 110 249 199 10 3 191 497 373 14 371 1 500 187 14 104 1 358 195 14 147 72 212 133 4 1 99 17 146 +15555 /data/VOCdevkit/VOC2012/JPEGImages/2011_001009.jpg 500 375 15 424 79 498 257 8 176 236 388 374 8 307 187 440 375 8 399 151 456 328 10 1 134 352 375 14 190 101 405 342 14 323 70 459 222 14 249 58 346 146 14 158 72 232 159 14 74 92 154 186 14 1 88 119 358 +15556 /data/VOCdevkit/VOC2012/JPEGImages/2011_001010.jpg 500 375 14 117 71 500 258 +15557 /data/VOCdevkit/VOC2012/JPEGImages/2011_001011.jpg 500 471 14 191 225 251 329 15 49 146 113 223 15 244 163 319 229 15 89 105 154 153 15 7 62 64 123 +15558 /data/VOCdevkit/VOC2012/JPEGImages/2011_001014.jpg 500 375 11 190 117 441 277 +15559 /data/VOCdevkit/VOC2012/JPEGImages/2011_001015.jpg 500 375 5 68 174 497 328 14 2 253 31 297 +15560 /data/VOCdevkit/VOC2012/JPEGImages/2011_001016.jpg 486 500 2 19 26 472 500 +15561 /data/VOCdevkit/VOC2012/JPEGImages/2011_001019.jpg 500 333 18 326 100 461 262 +15562 /data/VOCdevkit/VOC2012/JPEGImages/2011_001020.jpg 500 375 16 133 189 236 249 16 285 213 339 245 +15563 /data/VOCdevkit/VOC2012/JPEGImages/2011_001022.jpg 500 333 13 64 1 395 154 15 218 1 326 295 +15564 /data/VOCdevkit/VOC2012/JPEGImages/2011_001023.jpg 500 333 8 85 23 296 333 8 3 58 172 333 14 243 1 481 333 8 409 69 500 333 +15565 /data/VOCdevkit/VOC2012/JPEGImages/2011_001025.jpg 333 500 1 202 346 240 384 14 190 331 207 384 14 147 325 164 383 +15566 /data/VOCdevkit/VOC2012/JPEGImages/2011_001027.jpg 500 375 14 115 179 422 375 14 186 113 362 303 14 48 120 211 239 14 59 92 272 199 8 77 102 316 230 +15567 /data/VOCdevkit/VOC2012/JPEGImages/2011_001028.jpg 375 500 1 99 185 372 495 +15568 /data/VOCdevkit/VOC2012/JPEGImages/2011_001029.jpg 375 500 3 11 315 146 395 +15569 /data/VOCdevkit/VOC2012/JPEGImages/2011_001030.jpg 375 500 1 237 300 375 500 14 97 199 154 340 14 1 272 127 500 14 122 278 206 499 14 192 276 207 347 14 260 117 343 333 +15570 /data/VOCdevkit/VOC2012/JPEGImages/2011_001031.jpg 500 333 17 317 194 421 312 8 187 182 303 256 +15571 /data/VOCdevkit/VOC2012/JPEGImages/2011_001032.jpg 500 364 8 359 166 414 238 8 414 156 499 237 8 288 162 348 231 8 232 164 277 223 8 255 165 296 191 14 102 138 493 323 8 252 165 290 201 8 185 159 224 195 +15572 /data/VOCdevkit/VOC2012/JPEGImages/2011_001033.jpg 500 375 6 76 194 165 256 +15573 /data/VOCdevkit/VOC2012/JPEGImages/2011_001034.jpg 500 375 15 1 1 500 375 +15574 /data/VOCdevkit/VOC2012/JPEGImages/2011_001036.jpg 500 375 14 93 95 400 375 +15575 /data/VOCdevkit/VOC2012/JPEGImages/2011_001040.jpg 500 334 13 40 1 495 272 +15576 /data/VOCdevkit/VOC2012/JPEGImages/2011_001044.jpg 500 333 0 113 125 431 217 +15577 /data/VOCdevkit/VOC2012/JPEGImages/2011_001047.jpg 500 378 9 206 101 321 318 9 310 121 422 258 9 453 124 496 268 +15578 /data/VOCdevkit/VOC2012/JPEGImages/2011_001052.jpg 500 375 18 22 116 481 360 +15579 /data/VOCdevkit/VOC2012/JPEGImages/2011_001054.jpg 500 375 11 73 17 461 375 +15580 /data/VOCdevkit/VOC2012/JPEGImages/2011_001055.jpg 500 332 15 384 1 459 119 14 325 105 433 194 14 70 106 192 202 +15581 /data/VOCdevkit/VOC2012/JPEGImages/2011_001056.jpg 500 375 14 141 126 207 336 14 322 124 418 302 +15582 /data/VOCdevkit/VOC2012/JPEGImages/2011_001058.jpg 500 333 14 1 90 210 333 14 278 56 423 275 14 409 24 500 321 4 212 256 254 333 10 42 248 500 333 +15583 /data/VOCdevkit/VOC2012/JPEGImages/2011_001060.jpg 500 375 18 1 1 195 279 14 293 61 390 305 14 171 22 295 375 14 122 102 177 262 14 57 105 122 275 +15584 /data/VOCdevkit/VOC2012/JPEGImages/2011_001062.jpg 500 375 6 1 38 499 375 6 240 95 500 205 14 1 81 50 168 14 393 69 427 127 14 473 64 498 134 14 417 69 454 130 +15585 /data/VOCdevkit/VOC2012/JPEGImages/2011_001064.jpg 500 375 5 61 130 470 291 5 470 164 500 245 +15586 /data/VOCdevkit/VOC2012/JPEGImages/2011_001066.jpg 500 375 14 115 34 500 375 +15587 /data/VOCdevkit/VOC2012/JPEGImages/2011_001069.jpg 375 500 14 23 11 375 500 +15588 /data/VOCdevkit/VOC2012/JPEGImages/2011_001071.jpg 384 294 8 1 56 202 294 8 244 23 384 293 14 1 28 199 294 +15589 /data/VOCdevkit/VOC2012/JPEGImages/2011_001073.jpg 500 334 0 113 60 356 228 +15590 /data/VOCdevkit/VOC2012/JPEGImages/2011_001079.jpg 500 375 9 119 49 411 329 14 172 62 500 375 +15591 /data/VOCdevkit/VOC2012/JPEGImages/2011_001080.jpg 500 337 12 123 112 492 323 14 279 46 329 197 14 41 112 139 318 +15592 /data/VOCdevkit/VOC2012/JPEGImages/2011_001081.jpg 500 333 0 1 10 487 320 0 310 86 343 99 0 343 90 369 96 0 369 90 386 97 0 385 89 407 98 0 409 93 420 97 0 417 90 441 98 +15593 /data/VOCdevkit/VOC2012/JPEGImages/2011_001082.jpg 333 500 18 128 229 179 286 +15594 /data/VOCdevkit/VOC2012/JPEGImages/2011_001084.jpg 500 326 2 25 104 372 272 +15595 /data/VOCdevkit/VOC2012/JPEGImages/2011_001086.jpg 500 334 18 140 86 280 238 18 266 64 500 262 +15596 /data/VOCdevkit/VOC2012/JPEGImages/2011_001091.jpg 375 500 14 132 143 261 386 14 1 47 234 403 14 1 1 116 238 4 205 146 225 164 4 54 236 77 264 +15597 /data/VOCdevkit/VOC2012/JPEGImages/2011_001093.jpg 500 376 14 169 37 253 162 14 223 48 311 164 +15598 /data/VOCdevkit/VOC2012/JPEGImages/2011_001097.jpg 500 333 3 1 1 499 333 +15599 /data/VOCdevkit/VOC2012/JPEGImages/2011_001100.jpg 500 375 14 150 124 351 322 +15600 /data/VOCdevkit/VOC2012/JPEGImages/2011_001105.jpg 500 250 5 29 42 403 222 14 251 88 274 129 6 438 131 500 168 +15601 /data/VOCdevkit/VOC2012/JPEGImages/2011_001106.jpg 375 500 8 2 282 188 500 10 1 210 373 500 8 53 188 137 269 8 228 227 375 500 +15602 /data/VOCdevkit/VOC2012/JPEGImages/2011_001107.jpg 500 375 14 122 143 500 375 +15603 /data/VOCdevkit/VOC2012/JPEGImages/2011_001110.jpg 500 331 6 277 163 410 231 6 1 159 233 314 6 124 157 246 209 6 223 154 293 180 6 74 143 125 166 6 1 140 63 162 6 215 150 259 172 6 363 154 405 173 5 317 136 409 168 +15604 /data/VOCdevkit/VOC2012/JPEGImages/2011_001111.jpg 375 500 8 199 237 375 500 +15605 /data/VOCdevkit/VOC2012/JPEGImages/2011_001114.jpg 500 335 0 79 123 440 208 +15606 /data/VOCdevkit/VOC2012/JPEGImages/2011_001116.jpg 500 375 7 168 87 470 375 14 134 1 500 375 +15607 /data/VOCdevkit/VOC2012/JPEGImages/2011_001117.jpg 375 500 2 52 202 227 461 2 144 181 358 338 2 265 180 312 212 2 59 207 162 290 2 1 128 27 153 2 50 37 98 64 +15608 /data/VOCdevkit/VOC2012/JPEGImages/2011_001123.jpg 500 375 13 255 68 445 321 14 264 20 415 285 +15609 /data/VOCdevkit/VOC2012/JPEGImages/2011_001124.jpg 459 308 6 4 125 145 253 6 103 134 253 236 6 357 141 431 193 14 247 144 273 231 14 273 141 303 232 14 303 144 335 232 14 329 135 359 229 14 348 143 382 240 +15610 /data/VOCdevkit/VOC2012/JPEGImages/2011_001126.jpg 500 375 18 2 173 500 375 +15611 /data/VOCdevkit/VOC2012/JPEGImages/2011_001127.jpg 500 307 11 5 96 265 291 11 91 33 318 281 11 280 20 468 216 +15612 /data/VOCdevkit/VOC2012/JPEGImages/2011_001128.jpg 500 375 7 85 76 500 339 +15613 /data/VOCdevkit/VOC2012/JPEGImages/2011_001133.jpg 500 382 0 206 140 377 280 +15614 /data/VOCdevkit/VOC2012/JPEGImages/2011_001134.jpg 477 500 2 240 70 460 419 2 336 208 447 338 2 175 141 363 496 2 17 39 145 405 +15615 /data/VOCdevkit/VOC2012/JPEGImages/2011_001135.jpg 375 500 7 13 130 271 426 8 138 410 375 500 +15616 /data/VOCdevkit/VOC2012/JPEGImages/2011_001136.jpg 500 375 6 30 125 460 286 6 330 95 500 213 +15617 /data/VOCdevkit/VOC2012/JPEGImages/2011_001137.jpg 500 375 8 149 155 234 250 8 313 161 405 242 +15618 /data/VOCdevkit/VOC2012/JPEGImages/2011_001138.jpg 500 375 1 27 41 497 322 +15619 /data/VOCdevkit/VOC2012/JPEGImages/2011_001139.jpg 500 375 2 140 20 386 152 2 77 38 226 226 10 1 1 500 375 +15620 /data/VOCdevkit/VOC2012/JPEGImages/2011_001144.jpg 500 375 11 82 111 447 375 +15621 /data/VOCdevkit/VOC2012/JPEGImages/2011_001146.jpg 500 331 5 24 17 470 315 5 462 117 499 171 +15622 /data/VOCdevkit/VOC2012/JPEGImages/2011_001149.jpg 500 375 19 400 46 500 171 14 229 7 478 337 14 2 206 404 375 +15623 /data/VOCdevkit/VOC2012/JPEGImages/2011_001150.jpg 375 500 8 1 1 375 500 +15624 /data/VOCdevkit/VOC2012/JPEGImages/2011_001152.jpg 500 336 18 33 5 500 327 14 210 150 249 272 +15625 /data/VOCdevkit/VOC2012/JPEGImages/2011_001153.jpg 375 500 1 88 324 224 408 14 109 262 162 380 +15626 /data/VOCdevkit/VOC2012/JPEGImages/2011_001158.jpg 375 500 0 1 281 94 348 0 312 322 375 348 0 1 40 375 315 14 78 130 254 455 14 179 163 287 456 +15627 /data/VOCdevkit/VOC2012/JPEGImages/2011_001159.jpg 500 500 9 73 193 477 443 14 22 58 191 445 +15628 /data/VOCdevkit/VOC2012/JPEGImages/2011_001160.jpg 500 377 3 1 1 256 263 +15629 /data/VOCdevkit/VOC2012/JPEGImages/2011_001161.jpg 500 376 3 175 147 262 261 +15630 /data/VOCdevkit/VOC2012/JPEGImages/2011_001163.jpg 500 375 9 138 46 352 356 +15631 /data/VOCdevkit/VOC2012/JPEGImages/2011_001166.jpg 500 333 18 129 1 500 332 +15632 /data/VOCdevkit/VOC2012/JPEGImages/2011_001167.jpg 500 374 8 388 232 437 300 8 247 231 306 303 8 140 242 242 373 8 130 281 239 373 8 263 328 367 373 8 31 219 114 317 8 179 200 238 274 8 41 191 83 243 10 209 291 479 373 17 85 186 203 255 +15633 /data/VOCdevkit/VOC2012/JPEGImages/2011_001168.jpg 500 376 4 28 37 279 193 14 1 43 500 376 +15634 /data/VOCdevkit/VOC2012/JPEGImages/2011_001169.jpg 500 375 12 88 55 395 299 +15635 /data/VOCdevkit/VOC2012/JPEGImages/2011_001173.jpg 500 375 7 2 61 478 358 +15636 /data/VOCdevkit/VOC2012/JPEGImages/2011_001175.jpg 500 375 15 208 146 232 171 17 56 215 225 375 8 329 210 398 296 8 288 185 340 251 8 252 182 302 240 8 202 173 241 218 +15637 /data/VOCdevkit/VOC2012/JPEGImages/2011_001176.jpg 500 375 3 280 209 411 252 3 45 226 175 254 3 403 129 483 150 3 313 134 404 163 3 227 141 336 174 3 243 119 299 132 3 1 302 82 333 3 1 280 46 300 3 114 168 218 197 3 144 175 234 194 3 218 166 303 189 3 130 158 229 181 3 296 112 356 127 3 348 109 399 122 3 384 103 435 118 3 1 186 55 202 +15638 /data/VOCdevkit/VOC2012/JPEGImages/2011_001188.jpg 500 333 0 170 72 312 241 +15639 /data/VOCdevkit/VOC2012/JPEGImages/2011_001189.jpg 333 500 2 129 121 205 182 3 90 126 134 148 3 74 106 124 123 3 152 96 241 131 3 162 93 197 106 +15640 /data/VOCdevkit/VOC2012/JPEGImages/2011_001190.jpg 333 500 6 68 266 91 288 +15641 /data/VOCdevkit/VOC2012/JPEGImages/2011_001192.jpg 500 375 17 184 141 500 375 +15642 /data/VOCdevkit/VOC2012/JPEGImages/2011_001193.jpg 500 375 6 39 137 216 233 14 220 146 248 222 14 458 153 477 203 +15643 /data/VOCdevkit/VOC2012/JPEGImages/2011_001198.jpg 500 375 11 175 138 462 262 17 1 1 500 375 +15644 /data/VOCdevkit/VOC2012/JPEGImages/2011_001201.jpg 500 375 14 45 20 500 348 +15645 /data/VOCdevkit/VOC2012/JPEGImages/2011_001203.jpg 500 281 13 203 145 429 281 13 121 128 317 255 13 334 118 426 190 14 97 99 143 246 14 149 98 218 162 14 243 93 276 163 14 321 152 374 210 +15646 /data/VOCdevkit/VOC2012/JPEGImages/2011_001208.jpg 500 375 8 187 167 351 375 10 93 184 438 339 8 327 160 500 375 8 118 164 222 351 8 63 155 150 322 8 98 141 169 191 8 230 143 280 176 8 290 144 343 195 8 347 147 417 202 +15647 /data/VOCdevkit/VOC2012/JPEGImages/2011_001211.jpg 351 500 2 46 43 286 470 +15648 /data/VOCdevkit/VOC2012/JPEGImages/2011_001213.jpg 500 218 1 68 73 310 218 14 107 1 226 188 +15649 /data/VOCdevkit/VOC2012/JPEGImages/2011_001215.jpg 500 375 10 139 262 500 375 14 244 119 394 280 14 30 130 242 375 17 70 132 279 251 +15650 /data/VOCdevkit/VOC2012/JPEGImages/2011_001216.jpg 500 375 13 1 1 500 375 +15651 /data/VOCdevkit/VOC2012/JPEGImages/2011_001217.jpg 500 375 18 14 105 264 278 +15652 /data/VOCdevkit/VOC2012/JPEGImages/2011_001220.jpg 500 332 10 60 35 436 332 14 172 1 328 50 +15653 /data/VOCdevkit/VOC2012/JPEGImages/2011_001221.jpg 500 450 3 278 315 425 367 15 165 3 335 144 8 307 368 405 430 10 157 411 421 450 14 2 204 166 450 14 59 250 179 429 +15654 /data/VOCdevkit/VOC2012/JPEGImages/2011_001223.jpg 333 500 19 116 184 164 226 19 179 186 234 232 8 134 246 277 402 8 24 230 130 383 8 239 222 294 352 +15655 /data/VOCdevkit/VOC2012/JPEGImages/2011_001226.jpg 500 375 15 112 35 171 111 15 376 83 392 115 8 271 117 345 231 8 271 107 406 197 +15656 /data/VOCdevkit/VOC2012/JPEGImages/2011_001227.jpg 500 375 5 93 71 411 344 5 58 173 140 282 6 1 192 42 294 14 134 165 194 209 +15657 /data/VOCdevkit/VOC2012/JPEGImages/2011_001229.jpg 500 334 2 54 48 458 260 +15658 /data/VOCdevkit/VOC2012/JPEGImages/2011_001232.jpg 500 306 9 21 21 475 289 +15659 /data/VOCdevkit/VOC2012/JPEGImages/2011_001238.jpg 500 375 7 2 1 500 375 7 181 106 500 294 +15660 /data/VOCdevkit/VOC2012/JPEGImages/2011_001240.jpg 500 333 16 260 128 319 157 16 84 149 142 190 16 312 169 337 227 16 247 138 309 227 16 135 129 202 201 16 307 159 394 226 +15661 /data/VOCdevkit/VOC2012/JPEGImages/2011_001245.jpg 500 375 12 181 141 236 213 +15662 /data/VOCdevkit/VOC2012/JPEGImages/2011_001246.jpg 500 375 16 394 283 485 371 16 381 198 500 298 16 462 180 499 216 16 291 186 418 292 16 347 168 384 196 16 283 177 356 234 16 100 52 209 214 16 1 70 122 233 16 1 23 60 51 16 193 253 385 375 +15663 /data/VOCdevkit/VOC2012/JPEGImages/2011_001251.jpg 500 324 12 378 204 460 253 12 198 191 250 223 +15664 /data/VOCdevkit/VOC2012/JPEGImages/2011_001252.jpg 283 500 3 125 23 190 281 3 62 126 92 167 3 127 271 195 484 +15665 /data/VOCdevkit/VOC2012/JPEGImages/2011_001253.jpg 500 500 12 54 127 500 449 6 414 168 498 194 14 192 64 290 292 +15666 /data/VOCdevkit/VOC2012/JPEGImages/2011_001254.jpg 500 333 2 1 18 344 319 +15667 /data/VOCdevkit/VOC2012/JPEGImages/2011_001255.jpg 500 286 5 102 79 406 226 14 409 147 437 201 6 65 150 107 181 14 275 127 312 164 +15668 /data/VOCdevkit/VOC2012/JPEGImages/2011_001257.jpg 500 333 0 357 47 439 77 0 285 244 474 314 0 23 238 244 318 +15669 /data/VOCdevkit/VOC2012/JPEGImages/2011_001259.jpg 500 390 2 122 129 231 266 +15670 /data/VOCdevkit/VOC2012/JPEGImages/2011_001260.jpg 500 375 6 1 118 103 316 6 97 135 371 305 6 350 133 500 253 14 228 120 293 330 6 256 103 354 154 6 368 124 500 171 6 364 117 500 167 +15671 /data/VOCdevkit/VOC2012/JPEGImages/2011_001261.jpg 500 333 6 1 46 46 130 6 39 62 460 291 +15672 /data/VOCdevkit/VOC2012/JPEGImages/2011_001263.jpg 500 332 0 185 39 392 105 0 31 270 128 305 +15673 /data/VOCdevkit/VOC2012/JPEGImages/2011_001264.jpg 355 500 7 1 1 354 500 +15674 /data/VOCdevkit/VOC2012/JPEGImages/2011_001266.jpg 500 364 13 22 12 476 356 14 439 1 500 210 +15675 /data/VOCdevkit/VOC2012/JPEGImages/2011_001270.jpg 500 352 5 65 86 491 299 6 1 228 46 248 +15676 /data/VOCdevkit/VOC2012/JPEGImages/2011_001271.jpg 500 375 1 139 186 328 323 6 1 182 183 274 6 273 179 320 213 6 164 187 229 235 6 283 161 500 256 14 202 157 289 302 +15677 /data/VOCdevkit/VOC2012/JPEGImages/2011_001272.jpg 500 375 4 161 82 239 306 +15678 /data/VOCdevkit/VOC2012/JPEGImages/2011_001276.jpg 299 500 11 99 213 280 411 14 27 25 299 500 14 1 24 55 147 10 3 293 279 395 +15679 /data/VOCdevkit/VOC2012/JPEGImages/2011_001277.jpg 375 500 14 78 159 374 500 +15680 /data/VOCdevkit/VOC2012/JPEGImages/2011_001281.jpg 500 375 18 187 144 500 346 +15681 /data/VOCdevkit/VOC2012/JPEGImages/2011_001282.jpg 500 332 9 118 64 420 315 +15682 /data/VOCdevkit/VOC2012/JPEGImages/2011_001283.jpg 500 375 17 55 172 484 374 14 77 166 255 375 14 218 148 451 375 14 330 162 489 375 +15683 /data/VOCdevkit/VOC2012/JPEGImages/2011_001284.jpg 500 342 11 162 1 499 341 +15684 /data/VOCdevkit/VOC2012/JPEGImages/2011_001285.jpg 375 500 4 84 341 117 414 14 28 437 244 500 14 108 348 240 479 14 182 73 269 186 14 250 75 277 116 +15685 /data/VOCdevkit/VOC2012/JPEGImages/2011_001286.jpg 500 355 6 349 80 500 233 6 9 55 44 76 6 45 57 80 76 13 14 143 424 355 14 163 49 210 150 6 61 65 285 147 14 258 62 393 355 +15686 /data/VOCdevkit/VOC2012/JPEGImages/2011_001287.jpg 500 357 2 7 86 451 320 +15687 /data/VOCdevkit/VOC2012/JPEGImages/2011_001288.jpg 420 387 11 138 64 253 194 15 4 141 56 182 +15688 /data/VOCdevkit/VOC2012/JPEGImages/2011_001290.jpg 500 375 13 55 46 375 311 +15689 /data/VOCdevkit/VOC2012/JPEGImages/2011_001292.jpg 500 375 7 108 49 500 349 +15690 /data/VOCdevkit/VOC2012/JPEGImages/2011_001295.jpg 375 500 4 79 256 125 424 14 62 81 375 500 10 1 320 148 500 +15691 /data/VOCdevkit/VOC2012/JPEGImages/2011_001302.jpg 500 333 19 48 15 174 129 19 161 4 288 115 19 284 13 411 128 +15692 /data/VOCdevkit/VOC2012/JPEGImages/2011_001304.jpg 500 375 19 3 104 64 171 8 289 150 492 352 17 163 104 299 207 17 310 111 486 203 +15693 /data/VOCdevkit/VOC2012/JPEGImages/2011_001305.jpg 500 375 4 18 230 79 375 4 129 191 163 266 4 205 160 233 272 4 214 182 256 318 8 360 121 454 246 10 2 217 436 375 14 1 80 109 296 14 244 54 419 242 14 295 58 500 375 14 330 3 479 130 14 392 3 474 71 +15694 /data/VOCdevkit/VOC2012/JPEGImages/2011_001310.jpg 500 375 3 176 114 361 263 14 240 120 319 216 +15695 /data/VOCdevkit/VOC2012/JPEGImages/2011_001311.jpg 500 375 6 1 67 107 211 6 128 83 360 262 13 296 90 347 137 13 103 84 147 139 14 105 56 143 122 14 311 56 345 128 14 469 61 500 132 +15696 /data/VOCdevkit/VOC2012/JPEGImages/2011_001313.jpg 500 375 6 230 363 292 375 6 95 361 150 375 +15697 /data/VOCdevkit/VOC2012/JPEGImages/2011_001315.jpg 500 375 0 16 129 492 289 +15698 /data/VOCdevkit/VOC2012/JPEGImages/2011_001318.jpg 500 375 9 1 100 96 237 9 258 103 472 314 9 18 120 221 302 +15699 /data/VOCdevkit/VOC2012/JPEGImages/2011_001319.jpg 500 375 8 269 173 385 312 +15700 /data/VOCdevkit/VOC2012/JPEGImages/2011_001320.jpg 500 333 0 6 92 495 272 +15701 /data/VOCdevkit/VOC2012/JPEGImages/2011_001323.jpg 500 375 7 34 45 500 375 +15702 /data/VOCdevkit/VOC2012/JPEGImages/2011_001326.jpg 500 375 2 211 55 427 258 +15703 /data/VOCdevkit/VOC2012/JPEGImages/2011_001327.jpg 500 375 4 253 197 295 309 14 156 128 349 375 14 1 247 77 375 +15704 /data/VOCdevkit/VOC2012/JPEGImages/2011_001329.jpg 500 375 16 331 142 376 169 16 264 139 304 171 16 132 150 171 175 16 186 150 214 176 16 455 136 489 165 16 40 131 74 152 16 104 129 140 148 16 123 133 149 157 16 141 128 167 150 16 284 125 297 148 16 258 108 268 125 16 279 119 300 136 +15705 /data/VOCdevkit/VOC2012/JPEGImages/2011_001330.jpg 500 374 8 241 156 330 312 8 289 192 428 373 10 318 157 500 374 17 1 153 221 372 8 100 129 219 168 8 423 101 500 167 +15706 /data/VOCdevkit/VOC2012/JPEGImages/2011_001333.jpg 448 336 9 325 173 361 244 9 309 166 344 241 9 278 163 324 229 9 257 165 302 228 9 179 167 255 194 9 140 153 166 183 9 95 173 175 249 9 56 172 118 239 +15707 /data/VOCdevkit/VOC2012/JPEGImages/2011_001335.jpg 500 375 12 45 197 107 296 12 110 183 222 330 12 159 184 258 316 14 240 33 291 116 14 278 30 316 82 +15708 /data/VOCdevkit/VOC2012/JPEGImages/2011_001336.jpg 500 375 10 1 210 500 375 14 54 55 161 192 14 143 1 296 192 14 238 51 406 209 +15709 /data/VOCdevkit/VOC2012/JPEGImages/2011_001337.jpg 500 334 18 2 25 204 334 14 186 211 207 264 14 215 208 229 239 14 229 209 242 241 +15710 /data/VOCdevkit/VOC2012/JPEGImages/2011_001341.jpg 500 330 5 85 24 422 290 +15711 /data/VOCdevkit/VOC2012/JPEGImages/2011_001344.jpg 500 375 11 68 1 500 375 +15712 /data/VOCdevkit/VOC2012/JPEGImages/2011_001346.jpg 500 375 8 156 157 328 253 14 239 155 313 247 +15713 /data/VOCdevkit/VOC2012/JPEGImages/2011_001350.jpg 500 414 16 255 250 401 338 16 187 141 450 338 +15714 /data/VOCdevkit/VOC2012/JPEGImages/2011_001354.jpg 500 375 9 70 62 420 344 +15715 /data/VOCdevkit/VOC2012/JPEGImages/2011_001355.jpg 500 383 5 121 60 417 309 5 257 91 483 254 5 16 73 70 330 +15716 /data/VOCdevkit/VOC2012/JPEGImages/2011_001357.jpg 500 332 19 122 131 232 210 +15717 /data/VOCdevkit/VOC2012/JPEGImages/2011_001360.jpg 500 375 15 22 1 500 375 +15718 /data/VOCdevkit/VOC2012/JPEGImages/2011_001366.jpg 500 375 8 309 166 456 372 8 91 221 269 375 10 134 118 396 355 8 69 91 172 260 8 289 71 399 165 +15719 /data/VOCdevkit/VOC2012/JPEGImages/2011_001369.jpg 380 500 15 53 6 315 341 7 18 305 372 416 +15720 /data/VOCdevkit/VOC2012/JPEGImages/2011_001370.jpg 500 375 8 19 208 166 295 8 340 211 444 357 19 48 111 139 183 14 439 163 500 334 14 379 119 437 239 14 328 133 362 308 14 286 117 340 236 14 231 159 321 350 14 159 107 237 235 14 128 170 233 375 14 80 110 160 260 14 1 95 61 212 +15721 /data/VOCdevkit/VOC2012/JPEGImages/2011_001373.jpg 500 375 16 50 57 423 267 +15722 /data/VOCdevkit/VOC2012/JPEGImages/2011_001375.jpg 500 375 18 218 116 344 248 14 130 176 144 217 14 35 187 54 244 14 59 182 81 240 14 77 181 97 233 +15723 /data/VOCdevkit/VOC2012/JPEGImages/2011_001381.jpg 500 333 18 1 1 499 333 +15724 /data/VOCdevkit/VOC2012/JPEGImages/2011_001382.jpg 500 375 15 147 93 227 258 4 446 96 499 342 4 216 1 307 288 4 336 142 424 285 10 1 172 500 375 14 1 1 228 202 +15725 /data/VOCdevkit/VOC2012/JPEGImages/2011_001384.jpg 500 354 3 63 36 414 264 +15726 /data/VOCdevkit/VOC2012/JPEGImages/2011_001387.jpg 375 500 19 36 117 291 368 14 95 1 375 500 +15727 /data/VOCdevkit/VOC2012/JPEGImages/2011_001388.jpg 500 375 14 266 70 469 375 +15728 /data/VOCdevkit/VOC2012/JPEGImages/2011_001389.jpg 500 375 11 107 86 435 358 +15729 /data/VOCdevkit/VOC2012/JPEGImages/2011_001390.jpg 500 375 7 30 1 456 375 +15730 /data/VOCdevkit/VOC2012/JPEGImages/2011_001394.jpg 500 375 19 101 244 269 375 19 437 261 500 375 +15731 /data/VOCdevkit/VOC2012/JPEGImages/2011_001399.jpg 375 500 9 4 11 375 500 +15732 /data/VOCdevkit/VOC2012/JPEGImages/2011_001400.jpg 500 375 14 1 52 177 375 +15733 /data/VOCdevkit/VOC2012/JPEGImages/2011_001402.jpg 500 375 8 62 168 99 302 8 7 147 64 254 8 1 149 24 255 17 187 172 500 375 +15734 /data/VOCdevkit/VOC2012/JPEGImages/2011_001404.jpg 500 333 17 146 157 463 333 17 1 103 124 319 19 214 53 293 124 19 306 37 352 81 8 430 26 500 129 8 427 133 500 240 8 452 98 500 167 +15735 /data/VOCdevkit/VOC2012/JPEGImages/2011_001406.jpg 331 500 6 1 364 41 399 6 1 432 38 500 14 114 382 128 418 14 146 364 174 423 14 173 361 198 423 14 197 360 219 424 +15736 /data/VOCdevkit/VOC2012/JPEGImages/2011_001407.jpg 500 332 0 12 95 491 231 +15737 /data/VOCdevkit/VOC2012/JPEGImages/2011_001411.jpg 500 331 5 2 87 500 292 +15738 /data/VOCdevkit/VOC2012/JPEGImages/2011_001412.jpg 500 375 15 114 33 219 118 17 1 107 182 220 8 125 113 225 258 8 308 128 402 248 8 330 102 442 293 8 413 107 500 276 10 223 104 500 297 +15739 /data/VOCdevkit/VOC2012/JPEGImages/2011_001414.jpg 375 500 7 2 65 275 354 +15740 /data/VOCdevkit/VOC2012/JPEGImages/2011_001416.jpg 500 375 14 114 10 500 242 +15741 /data/VOCdevkit/VOC2012/JPEGImages/2011_001421.jpg 500 375 2 155 152 257 375 +15742 /data/VOCdevkit/VOC2012/JPEGImages/2011_001422.jpg 500 375 1 158 238 311 375 14 81 118 260 375 14 244 101 371 375 +15743 /data/VOCdevkit/VOC2012/JPEGImages/2011_001424.jpg 500 373 9 268 175 418 266 +15744 /data/VOCdevkit/VOC2012/JPEGImages/2011_001432.jpg 500 388 2 49 65 487 375 +15745 /data/VOCdevkit/VOC2012/JPEGImages/2011_001434.jpg 500 333 0 1 7 500 321 +15746 /data/VOCdevkit/VOC2012/JPEGImages/2011_001440.jpg 500 375 15 79 156 133 265 17 183 192 338 307 17 1 254 233 375 +15747 /data/VOCdevkit/VOC2012/JPEGImages/2011_001441.jpg 500 375 1 1 18 500 256 7 73 138 241 252 +15748 /data/VOCdevkit/VOC2012/JPEGImages/2011_001447.jpg 500 375 8 1 57 237 375 8 205 53 500 368 14 21 101 180 375 14 223 64 500 375 14 245 144 427 375 +15749 /data/VOCdevkit/VOC2012/JPEGImages/2011_001449.jpg 386 256 6 193 114 211 129 13 232 119 299 193 14 173 107 190 168 14 212 101 223 125 14 214 105 241 161 14 193 114 238 172 14 237 95 281 177 +15750 /data/VOCdevkit/VOC2012/JPEGImages/2011_001451.jpg 500 375 8 57 92 222 254 8 1 195 232 375 17 288 87 500 328 +15751 /data/VOCdevkit/VOC2012/JPEGImages/2011_001455.jpg 500 333 0 422 44 499 94 0 316 26 477 78 0 1 38 456 198 6 236 142 500 333 +15752 /data/VOCdevkit/VOC2012/JPEGImages/2011_001456.jpg 374 500 19 1 270 49 377 15 46 274 128 357 14 104 256 267 493 8 223 306 305 456 +15753 /data/VOCdevkit/VOC2012/JPEGImages/2011_001463.jpg 500 333 2 181 143 275 214 +15754 /data/VOCdevkit/VOC2012/JPEGImages/2011_001464.jpg 500 332 11 149 6 372 317 +15755 /data/VOCdevkit/VOC2012/JPEGImages/2011_001466.jpg 500 375 19 234 125 294 198 8 304 223 424 363 15 38 109 68 147 15 84 89 123 143 +15756 /data/VOCdevkit/VOC2012/JPEGImages/2011_001467.jpg 500 333 14 36 90 214 332 14 149 104 294 288 14 266 135 471 288 14 278 108 366 155 +15757 /data/VOCdevkit/VOC2012/JPEGImages/2011_001471.jpg 500 335 2 217 90 314 177 +15758 /data/VOCdevkit/VOC2012/JPEGImages/2011_001475.jpg 375 500 14 2 1 374 140 +15759 /data/VOCdevkit/VOC2012/JPEGImages/2011_001476.jpg 333 500 0 6 429 40 448 0 283 431 318 451 0 244 430 271 450 0 205 430 236 449 0 149 427 179 450 0 84 425 124 448 0 41 425 83 449 +15760 /data/VOCdevkit/VOC2012/JPEGImages/2011_001479.jpg 500 375 5 14 1 497 363 +15761 /data/VOCdevkit/VOC2012/JPEGImages/2011_001480.jpg 500 333 0 13 75 459 257 +15762 /data/VOCdevkit/VOC2012/JPEGImages/2011_001489.jpg 500 281 0 148 195 196 210 +15763 /data/VOCdevkit/VOC2012/JPEGImages/2011_001498.jpg 500 375 13 22 28 459 307 +15764 /data/VOCdevkit/VOC2012/JPEGImages/2011_001501.jpg 500 375 1 264 197 440 298 14 314 139 390 257 14 102 137 128 216 +15765 /data/VOCdevkit/VOC2012/JPEGImages/2011_001503.jpg 500 375 14 216 166 288 336 +15766 /data/VOCdevkit/VOC2012/JPEGImages/2011_001505.jpg 500 375 2 55 52 321 374 +15767 /data/VOCdevkit/VOC2012/JPEGImages/2011_001507.jpg 500 375 19 1 94 233 258 19 265 96 499 263 +15768 /data/VOCdevkit/VOC2012/JPEGImages/2011_001508.jpg 500 375 13 46 23 500 364 +15769 /data/VOCdevkit/VOC2012/JPEGImages/2011_001510.jpg 500 335 1 137 120 181 147 14 149 102 171 143 +15770 /data/VOCdevkit/VOC2012/JPEGImages/2011_001514.jpg 500 333 0 69 101 386 212 +15771 /data/VOCdevkit/VOC2012/JPEGImages/2011_001518.jpg 500 375 17 2 154 414 316 +15772 /data/VOCdevkit/VOC2012/JPEGImages/2011_001519.jpg 500 333 5 108 53 468 325 14 478 211 500 282 +15773 /data/VOCdevkit/VOC2012/JPEGImages/2011_001521.jpg 375 500 4 212 261 331 475 14 1 2 304 460 +15774 /data/VOCdevkit/VOC2012/JPEGImages/2011_001524.jpg 500 375 8 233 95 322 225 8 277 107 389 269 1 132 52 262 188 1 140 54 261 172 6 274 1 382 51 6 193 1 274 41 6 119 1 185 39 13 2 14 292 346 14 64 14 81 58 +15775 /data/VOCdevkit/VOC2012/JPEGImages/2011_001525.jpg 500 264 18 25 103 435 216 +15776 /data/VOCdevkit/VOC2012/JPEGImages/2011_001526.jpg 500 375 8 426 147 500 294 8 1 161 75 375 10 55 220 500 375 14 1 62 256 375 14 253 76 497 292 +15777 /data/VOCdevkit/VOC2012/JPEGImages/2011_001529.jpg 375 500 1 181 166 245 261 14 183 127 247 244 +15778 /data/VOCdevkit/VOC2012/JPEGImages/2011_001530.jpg 500 377 9 269 210 312 270 9 226 211 273 268 9 207 186 256 217 9 287 192 321 217 14 1 127 371 377 14 325 223 381 289 +15779 /data/VOCdevkit/VOC2012/JPEGImages/2011_001531.jpg 500 375 17 328 191 499 374 17 104 157 375 261 +15780 /data/VOCdevkit/VOC2012/JPEGImages/2011_001532.jpg 424 500 3 84 92 187 228 3 132 182 271 408 +15781 /data/VOCdevkit/VOC2012/JPEGImages/2011_001534.jpg 500 375 7 87 48 431 328 +15782 /data/VOCdevkit/VOC2012/JPEGImages/2011_001535.jpg 500 375 1 42 177 219 375 1 184 187 306 375 6 137 87 176 143 6 203 90 225 108 14 55 70 155 257 +15783 /data/VOCdevkit/VOC2012/JPEGImages/2011_001536.jpg 500 375 5 54 50 482 279 14 388 112 444 167 +15784 /data/VOCdevkit/VOC2012/JPEGImages/2011_001537.jpg 375 500 12 96 1 332 438 +15785 /data/VOCdevkit/VOC2012/JPEGImages/2011_001538.jpg 500 328 1 426 162 500 275 14 181 148 256 308 4 232 281 247 318 +15786 /data/VOCdevkit/VOC2012/JPEGImages/2011_001541.jpg 500 289 0 23 105 202 174 0 162 98 475 207 +15787 /data/VOCdevkit/VOC2012/JPEGImages/2011_001542.jpg 500 375 6 302 97 438 144 6 9 100 487 265 +15788 /data/VOCdevkit/VOC2012/JPEGImages/2011_001543.jpg 500 375 11 1 29 483 375 +15789 /data/VOCdevkit/VOC2012/JPEGImages/2011_001544.jpg 500 379 12 1 38 422 370 +15790 /data/VOCdevkit/VOC2012/JPEGImages/2011_001546.jpg 500 375 9 177 120 370 303 +15791 /data/VOCdevkit/VOC2012/JPEGImages/2011_001547.jpg 375 500 17 11 122 298 318 11 122 395 375 500 +15792 /data/VOCdevkit/VOC2012/JPEGImages/2011_001549.jpg 500 375 16 180 90 394 266 16 55 125 297 297 +15793 /data/VOCdevkit/VOC2012/JPEGImages/2011_001557.jpg 500 375 3 233 133 280 146 3 1 193 108 229 3 1 174 177 219 14 89 79 148 326 4 135 192 157 217 14 164 202 246 292 14 209 238 331 344 14 232 192 345 274 14 337 153 408 304 14 312 203 354 261 14 439 165 457 214 14 453 163 471 211 +15794 /data/VOCdevkit/VOC2012/JPEGImages/2011_001558.jpg 500 375 2 156 85 357 334 +15795 /data/VOCdevkit/VOC2012/JPEGImages/2011_001560.jpg 500 375 18 64 50 500 370 +15796 /data/VOCdevkit/VOC2012/JPEGImages/2011_001566.jpg 500 375 15 429 76 448 95 15 393 62 413 96 8 306 317 336 374 8 279 319 308 371 8 232 313 260 370 8 154 308 184 372 8 187 309 212 339 8 435 307 459 346 +15797 /data/VOCdevkit/VOC2012/JPEGImages/2011_001567.jpg 500 333 8 334 116 419 263 8 232 101 301 232 17 2 140 212 261 14 208 183 382 333 14 238 100 306 238 14 318 85 397 227 14 161 111 230 265 14 67 134 225 333 14 130 201 218 302 8 1 179 213 333 +15798 /data/VOCdevkit/VOC2012/JPEGImages/2011_001568.jpg 500 375 7 42 128 436 296 +15799 /data/VOCdevkit/VOC2012/JPEGImages/2011_001571.jpg 500 333 4 232 253 260 332 4 181 192 215 265 4 129 201 188 257 4 54 274 85 332 4 147 269 169 333 10 1 253 364 332 14 184 118 405 333 14 40 91 186 273 +15800 /data/VOCdevkit/VOC2012/JPEGImages/2011_001572.jpg 500 375 7 113 1 500 375 +15801 /data/VOCdevkit/VOC2012/JPEGImages/2011_001573.jpg 500 333 19 264 103 335 174 19 320 135 374 203 8 43 166 221 333 +15802 /data/VOCdevkit/VOC2012/JPEGImages/2011_001582.jpg 500 348 3 94 139 307 177 14 162 111 196 161 14 153 119 222 164 +15803 /data/VOCdevkit/VOC2012/JPEGImages/2011_001586.jpg 500 374 8 118 1 340 106 10 1 103 500 374 +15804 /data/VOCdevkit/VOC2012/JPEGImages/2011_001589.jpg 500 333 3 137 117 344 173 3 447 157 498 178 +15805 /data/VOCdevkit/VOC2012/JPEGImages/2011_001591.jpg 500 333 3 372 131 444 199 14 375 163 392 186 +15806 /data/VOCdevkit/VOC2012/JPEGImages/2011_001592.jpg 500 373 3 1 2 434 319 +15807 /data/VOCdevkit/VOC2012/JPEGImages/2011_001596.jpg 500 375 6 328 168 385 196 6 23 163 79 193 6 401 178 444 197 +15808 /data/VOCdevkit/VOC2012/JPEGImages/2011_001597.jpg 333 500 7 1 23 301 500 +15809 /data/VOCdevkit/VOC2012/JPEGImages/2011_001599.jpg 500 375 1 1 2 499 179 14 1 1 186 185 +15810 /data/VOCdevkit/VOC2012/JPEGImages/2011_001600.jpg 500 375 15 391 149 500 234 8 192 172 273 309 8 269 170 330 252 8 250 176 379 369 17 1 193 51 374 17 350 224 498 371 +15811 /data/VOCdevkit/VOC2012/JPEGImages/2011_001601.jpg 500 375 7 3 159 457 304 +15812 /data/VOCdevkit/VOC2012/JPEGImages/2011_001602.jpg 500 375 18 22 16 500 266 14 317 100 342 141 +15813 /data/VOCdevkit/VOC2012/JPEGImages/2011_001605.jpg 500 333 13 44 64 419 333 14 75 12 131 159 14 274 29 307 176 14 293 17 352 186 +15814 /data/VOCdevkit/VOC2012/JPEGImages/2011_001606.jpg 500 333 6 100 64 451 225 6 1 57 43 128 +15815 /data/VOCdevkit/VOC2012/JPEGImages/2011_001607.jpg 333 500 7 1 68 306 434 +15816 /data/VOCdevkit/VOC2012/JPEGImages/2011_001608.jpg 500 375 11 372 189 499 355 14 311 108 440 353 14 89 123 350 352 +15817 /data/VOCdevkit/VOC2012/JPEGImages/2011_001611.jpg 375 500 15 41 26 310 499 +15818 /data/VOCdevkit/VOC2012/JPEGImages/2011_001612.jpg 500 375 1 181 145 299 375 14 351 1 415 304 14 63 181 211 366 +15819 /data/VOCdevkit/VOC2012/JPEGImages/2011_001613.jpg 500 333 3 216 106 293 186 14 381 250 453 287 +15820 /data/VOCdevkit/VOC2012/JPEGImages/2011_001614.jpg 500 330 18 25 84 500 296 +15821 /data/VOCdevkit/VOC2012/JPEGImages/2011_001616.jpg 500 375 10 28 319 500 375 14 406 117 500 335 14 322 100 410 255 14 242 116 345 272 14 107 102 218 257 14 5 103 107 306 14 53 183 160 358 14 153 170 296 333 14 290 182 419 329 +15822 /data/VOCdevkit/VOC2012/JPEGImages/2011_001618.jpg 375 500 14 205 143 307 294 14 142 156 231 294 +15823 /data/VOCdevkit/VOC2012/JPEGImages/2011_001619.jpg 500 375 14 388 96 482 257 14 284 84 364 375 14 137 78 239 375 14 3 90 89 365 +15824 /data/VOCdevkit/VOC2012/JPEGImages/2011_001620.jpg 375 500 7 119 198 240 334 +15825 /data/VOCdevkit/VOC2012/JPEGImages/2011_001621.jpg 500 375 8 80 213 154 296 14 1 155 127 362 +15826 /data/VOCdevkit/VOC2012/JPEGImages/2011_001622.jpg 500 333 15 126 161 153 201 15 35 160 67 204 15 15 160 42 197 15 92 160 114 198 15 406 165 423 186 15 390 164 408 184 15 365 163 382 187 15 212 156 225 175 +15827 /data/VOCdevkit/VOC2012/JPEGImages/2011_001624.jpg 500 375 0 115 148 353 223 +15828 /data/VOCdevkit/VOC2012/JPEGImages/2011_001625.jpg 500 375 12 154 96 420 279 12 131 106 374 277 14 73 112 118 269 14 108 120 128 268 14 65 109 139 224 6 444 197 500 228 +15829 /data/VOCdevkit/VOC2012/JPEGImages/2011_001628.jpg 375 500 14 87 86 282 500 +15830 /data/VOCdevkit/VOC2012/JPEGImages/2011_001629.jpg 500 333 13 135 87 300 214 13 106 121 227 214 14 215 43 284 183 14 163 83 200 133 14 477 43 500 89 14 445 74 471 131 +15831 /data/VOCdevkit/VOC2012/JPEGImages/2011_001632.jpg 500 375 1 1 201 494 375 6 55 146 413 366 14 173 12 293 375 14 156 6 416 375 +15832 /data/VOCdevkit/VOC2012/JPEGImages/2011_001641.jpg 348 500 6 1 95 345 413 14 65 27 235 500 +15833 /data/VOCdevkit/VOC2012/JPEGImages/2011_001642.jpg 500 375 11 136 11 382 341 +15834 /data/VOCdevkit/VOC2012/JPEGImages/2011_001643.jpg 500 375 1 16 35 496 325 +15835 /data/VOCdevkit/VOC2012/JPEGImages/2011_001647.jpg 500 375 0 1 87 498 375 +15836 /data/VOCdevkit/VOC2012/JPEGImages/2011_001649.jpg 500 348 14 38 113 356 348 +15837 /data/VOCdevkit/VOC2012/JPEGImages/2011_001650.jpg 500 401 8 317 275 500 401 14 312 29 486 401 14 245 60 380 401 14 136 23 260 401 14 25 57 177 401 +15838 /data/VOCdevkit/VOC2012/JPEGImages/2011_001652.jpg 500 333 2 123 67 198 204 2 230 119 322 333 +15839 /data/VOCdevkit/VOC2012/JPEGImages/2011_001653.jpg 500 309 9 11 9 158 295 9 304 41 484 280 9 193 177 316 263 9 1 2 361 276 9 108 1 226 281 +15840 /data/VOCdevkit/VOC2012/JPEGImages/2011_001655.jpg 500 370 18 15 71 388 271 +15841 /data/VOCdevkit/VOC2012/JPEGImages/2011_001656.jpg 376 500 12 1 119 234 479 +15842 /data/VOCdevkit/VOC2012/JPEGImages/2011_001662.jpg 500 375 11 208 164 346 257 17 1 115 449 375 14 186 119 418 375 +15843 /data/VOCdevkit/VOC2012/JPEGImages/2011_001663.jpg 500 375 13 67 48 457 317 +15844 /data/VOCdevkit/VOC2012/JPEGImages/2011_001665.jpg 500 333 8 99 129 168 195 8 4 129 81 271 10 47 174 500 333 8 161 120 229 183 10 59 124 252 196 8 1 209 55 333 8 264 103 294 154 8 445 92 489 181 +15845 /data/VOCdevkit/VOC2012/JPEGImages/2011_001666.jpg 500 375 8 23 180 150 349 +15846 /data/VOCdevkit/VOC2012/JPEGImages/2011_001669.jpg 500 375 6 331 240 359 259 +15847 /data/VOCdevkit/VOC2012/JPEGImages/2011_001671.jpg 500 375 18 60 119 465 241 +15848 /data/VOCdevkit/VOC2012/JPEGImages/2011_001673.jpg 500 375 6 387 1 490 48 6 464 6 499 56 6 23 17 495 374 +15849 /data/VOCdevkit/VOC2012/JPEGImages/2011_001674.jpg 500 500 14 1 205 213 500 14 263 202 500 500 +15850 /data/VOCdevkit/VOC2012/JPEGImages/2011_001678.jpg 500 375 10 72 193 459 375 14 275 4 500 375 14 172 101 312 208 14 7 50 220 375 +15851 /data/VOCdevkit/VOC2012/JPEGImages/2011_001679.jpg 500 354 9 137 125 440 282 14 100 158 153 274 +15852 /data/VOCdevkit/VOC2012/JPEGImages/2011_001689.jpg 500 375 8 23 188 193 325 19 149 153 211 211 15 387 170 439 214 15 465 127 491 212 15 2 118 60 185 +15853 /data/VOCdevkit/VOC2012/JPEGImages/2011_001691.jpg 337 500 17 2 196 167 422 14 29 191 193 424 14 278 246 337 338 +15854 /data/VOCdevkit/VOC2012/JPEGImages/2011_001693.jpg 500 195 3 140 90 185 126 3 97 99 132 116 +15855 /data/VOCdevkit/VOC2012/JPEGImages/2011_001694.jpg 500 318 2 281 106 434 247 +15856 /data/VOCdevkit/VOC2012/JPEGImages/2011_001695.jpg 500 375 6 151 265 185 296 +15857 /data/VOCdevkit/VOC2012/JPEGImages/2011_001698.jpg 500 333 6 215 175 249 200 +15858 /data/VOCdevkit/VOC2012/JPEGImages/2011_001699.jpg 500 333 0 40 84 449 253 +15859 /data/VOCdevkit/VOC2012/JPEGImages/2011_001700.jpg 375 500 4 96 284 140 411 4 283 328 330 478 14 32 96 214 376 14 158 148 356 402 +15860 /data/VOCdevkit/VOC2012/JPEGImages/2011_001705.jpg 500 375 19 148 82 297 228 +15861 /data/VOCdevkit/VOC2012/JPEGImages/2011_001707.jpg 500 334 14 5 6 409 334 +15862 /data/VOCdevkit/VOC2012/JPEGImages/2011_001708.jpg 375 500 9 77 180 253 420 +15863 /data/VOCdevkit/VOC2012/JPEGImages/2011_001710.jpg 375 500 3 2 376 374 500 14 147 67 257 500 14 81 117 169 486 +15864 /data/VOCdevkit/VOC2012/JPEGImages/2011_001712.jpg 333 500 2 46 40 260 500 +15865 /data/VOCdevkit/VOC2012/JPEGImages/2011_001713.jpg 500 375 15 209 51 274 101 15 184 181 280 234 17 253 150 500 375 +15866 /data/VOCdevkit/VOC2012/JPEGImages/2011_001714.jpg 375 500 11 146 134 340 329 14 1 1 375 447 +15867 /data/VOCdevkit/VOC2012/JPEGImages/2011_001715.jpg 401 500 8 213 1 310 148 8 295 22 395 166 10 223 1 401 130 +15868 /data/VOCdevkit/VOC2012/JPEGImages/2011_001716.jpg 333 500 7 1 78 333 500 +15869 /data/VOCdevkit/VOC2012/JPEGImages/2011_001719.jpg 500 375 15 78 122 124 187 8 136 177 182 220 8 238 188 296 244 +15870 /data/VOCdevkit/VOC2012/JPEGImages/2011_001720.jpg 500 333 4 188 188 370 333 4 260 53 435 333 4 334 1 486 151 4 136 1 283 332 4 11 103 190 333 4 32 194 175 333 4 1 1 101 238 4 74 1 170 119 +15871 /data/VOCdevkit/VOC2012/JPEGImages/2011_001722.jpg 300 219 12 24 31 267 206 +15872 /data/VOCdevkit/VOC2012/JPEGImages/2011_001726.jpg 500 375 19 155 132 233 199 +15873 /data/VOCdevkit/VOC2012/JPEGImages/2011_001727.jpg 500 332 11 1 77 388 308 +15874 /data/VOCdevkit/VOC2012/JPEGImages/2011_001730.jpg 500 375 19 269 149 482 375 14 124 55 351 266 +15875 /data/VOCdevkit/VOC2012/JPEGImages/2011_001732.jpg 375 500 1 10 207 290 500 14 104 24 285 490 +15876 /data/VOCdevkit/VOC2012/JPEGImages/2011_001733.jpg 500 375 7 217 162 499 375 7 1 111 187 375 17 1 34 500 231 +15877 /data/VOCdevkit/VOC2012/JPEGImages/2011_001739.jpg 500 375 17 2 93 499 364 +15878 /data/VOCdevkit/VOC2012/JPEGImages/2011_001740.jpg 500 375 14 233 162 264 200 14 217 166 236 202 14 149 170 170 195 +15879 /data/VOCdevkit/VOC2012/JPEGImages/2011_001741.jpg 500 386 18 105 106 413 352 +15880 /data/VOCdevkit/VOC2012/JPEGImages/2011_001745.jpg 500 333 11 2 40 409 333 +15881 /data/VOCdevkit/VOC2012/JPEGImages/2011_001747.jpg 500 333 5 95 42 443 283 14 20 160 38 223 14 1 154 12 220 6 23 160 103 204 5 441 151 455 188 +15882 /data/VOCdevkit/VOC2012/JPEGImages/2011_001748.jpg 500 334 5 324 210 380 232 +15883 /data/VOCdevkit/VOC2012/JPEGImages/2011_001751.jpg 500 375 17 110 183 442 345 +15884 /data/VOCdevkit/VOC2012/JPEGImages/2011_001753.jpg 500 332 0 1 20 500 308 +15885 /data/VOCdevkit/VOC2012/JPEGImages/2011_001754.jpg 500 375 7 121 24 358 317 +15886 /data/VOCdevkit/VOC2012/JPEGImages/2011_001755.jpg 500 374 14 96 7 481 374 +15887 /data/VOCdevkit/VOC2012/JPEGImages/2011_001757.jpg 500 374 16 365 158 437 242 16 241 151 371 223 16 204 205 266 244 +15888 /data/VOCdevkit/VOC2012/JPEGImages/2011_001764.jpg 500 281 2 241 128 336 193 +15889 /data/VOCdevkit/VOC2012/JPEGImages/2011_001765.jpg 500 334 13 35 87 485 269 14 169 32 381 287 +15890 /data/VOCdevkit/VOC2012/JPEGImages/2011_001766.jpg 333 500 15 153 167 187 210 8 6 170 260 500 15 301 53 333 175 +15891 /data/VOCdevkit/VOC2012/JPEGImages/2011_001769.jpg 500 333 8 227 86 283 175 8 170 89 230 191 8 236 81 288 155 14 358 44 422 141 14 403 22 500 333 14 22 108 137 325 14 105 105 190 301 14 4 32 194 203 14 61 34 218 130 14 284 42 380 324 4 357 79 379 107 14 158 36 238 200 +15892 /data/VOCdevkit/VOC2012/JPEGImages/2011_001770.jpg 500 375 10 1 1 500 374 +15893 /data/VOCdevkit/VOC2012/JPEGImages/2011_001771.jpg 500 375 3 102 101 382 316 14 147 197 175 232 14 302 202 326 237 +15894 /data/VOCdevkit/VOC2012/JPEGImages/2011_001775.jpg 500 375 7 1 1 499 375 +15895 /data/VOCdevkit/VOC2012/JPEGImages/2011_001776.jpg 500 333 18 254 91 500 315 18 65 20 499 194 +15896 /data/VOCdevkit/VOC2012/JPEGImages/2011_001779.jpg 462 500 2 37 97 357 414 +15897 /data/VOCdevkit/VOC2012/JPEGImages/2011_001782.jpg 500 389 9 295 251 428 346 +15898 /data/VOCdevkit/VOC2012/JPEGImages/2011_001785.jpg 500 375 10 83 203 419 351 8 50 192 78 270 8 70 194 108 282 8 102 198 146 300 8 141 203 218 323 8 204 209 302 361 8 151 186 184 207 8 182 187 223 211 8 233 188 274 214 8 274 190 340 219 8 361 193 420 246 8 354 134 497 375 +15899 /data/VOCdevkit/VOC2012/JPEGImages/2011_001789.jpg 500 287 0 3 67 465 237 +15900 /data/VOCdevkit/VOC2012/JPEGImages/2011_001790.jpg 500 375 14 1 153 500 375 14 155 59 374 222 14 288 74 425 189 +15901 /data/VOCdevkit/VOC2012/JPEGImages/2011_001791.jpg 500 375 15 195 147 236 197 15 116 158 158 203 8 98 169 134 213 8 146 159 185 217 8 115 169 143 219 8 176 170 204 210 8 224 174 255 239 8 257 179 293 242 8 204 189 245 257 8 165 182 207 243 8 176 193 227 272 8 301 207 363 291 8 300 173 327 227 8 335 171 368 197 8 325 184 367 252 8 355 185 394 244 8 249 163 271 189 8 434 167 456 207 8 399 168 425 213 8 383 167 408 207 +15902 /data/VOCdevkit/VOC2012/JPEGImages/2011_001793.jpg 500 368 3 2 2 439 342 3 194 302 248 323 +15903 /data/VOCdevkit/VOC2012/JPEGImages/2011_001794.jpg 373 500 17 226 222 373 357 14 95 88 205 378 +15904 /data/VOCdevkit/VOC2012/JPEGImages/2011_001796.jpg 500 375 18 139 1 500 319 +15905 /data/VOCdevkit/VOC2012/JPEGImages/2011_001799.jpg 500 374 13 96 20 472 312 6 1 1 188 84 13 1 141 500 374 +15906 /data/VOCdevkit/VOC2012/JPEGImages/2011_001800.jpg 375 500 0 68 109 240 162 14 126 252 289 500 +15907 /data/VOCdevkit/VOC2012/JPEGImages/2011_001801.jpg 400 300 6 25 181 109 238 +15908 /data/VOCdevkit/VOC2012/JPEGImages/2011_001805.jpg 500 375 11 98 115 324 375 9 150 1 496 174 +15909 /data/VOCdevkit/VOC2012/JPEGImages/2011_001806.jpg 375 500 1 54 353 254 494 +15910 /data/VOCdevkit/VOC2012/JPEGImages/2011_001810.jpg 500 333 16 159 155 205 191 16 288 141 338 177 +15911 /data/VOCdevkit/VOC2012/JPEGImages/2011_001811.jpg 500 375 8 386 107 500 375 17 56 1 422 200 +15912 /data/VOCdevkit/VOC2012/JPEGImages/2011_001812.jpg 375 500 8 62 45 293 452 +15913 /data/VOCdevkit/VOC2012/JPEGImages/2011_001815.jpg 500 333 12 192 103 310 240 14 240 59 301 186 14 8 115 33 157 14 24 116 60 157 14 52 116 88 155 14 62 113 98 154 +15914 /data/VOCdevkit/VOC2012/JPEGImages/2011_001819.jpg 421 500 4 95 62 116 119 10 1 101 421 360 14 10 78 415 500 14 143 8 359 234 +15915 /data/VOCdevkit/VOC2012/JPEGImages/2011_001820.jpg 500 392 15 368 114 500 301 4 349 224 393 340 10 83 269 499 392 17 1 92 321 385 14 115 79 299 341 15 283 1 357 198 +15916 /data/VOCdevkit/VOC2012/JPEGImages/2011_001822.jpg 500 356 16 340 258 392 291 16 262 240 296 275 16 244 244 276 275 16 204 236 234 267 16 186 234 213 261 16 165 229 188 257 16 122 228 148 245 +15917 /data/VOCdevkit/VOC2012/JPEGImages/2011_001824.jpg 500 333 0 48 109 500 232 6 47 200 115 231 0 239 223 500 333 +15918 /data/VOCdevkit/VOC2012/JPEGImages/2011_001825.jpg 500 498 12 75 146 446 447 +15919 /data/VOCdevkit/VOC2012/JPEGImages/2011_001826.jpg 500 375 5 329 85 496 208 6 158 168 377 264 14 275 143 322 259 14 325 150 352 262 14 167 140 185 188 14 218 143 232 178 14 190 142 207 186 14 53 147 65 186 +15920 /data/VOCdevkit/VOC2012/JPEGImages/2011_001827.jpg 500 375 18 40 142 315 292 +15921 /data/VOCdevkit/VOC2012/JPEGImages/2011_001833.jpg 375 500 8 121 256 374 497 19 1 191 66 345 +15922 /data/VOCdevkit/VOC2012/JPEGImages/2011_001834.jpg 500 375 8 156 57 316 317 +15923 /data/VOCdevkit/VOC2012/JPEGImages/2011_001837.jpg 320 240 19 75 82 141 138 14 162 144 194 175 +15924 /data/VOCdevkit/VOC2012/JPEGImages/2011_001840.jpg 500 375 9 17 10 484 348 +15925 /data/VOCdevkit/VOC2012/JPEGImages/2011_001841.jpg 500 375 7 1 49 313 348 +15926 /data/VOCdevkit/VOC2012/JPEGImages/2011_001842.jpg 500 375 8 1 248 126 375 10 130 158 366 375 14 331 113 500 375 14 346 117 439 278 14 316 114 373 228 14 286 95 334 181 14 174 120 211 176 14 136 123 182 215 14 83 116 151 278 14 1 117 135 344 +15927 /data/VOCdevkit/VOC2012/JPEGImages/2011_001845.jpg 500 375 15 409 70 499 188 4 233 88 254 144 17 1 133 492 373 14 46 153 208 375 14 152 136 266 375 14 219 118 385 375 14 238 87 461 375 +15928 /data/VOCdevkit/VOC2012/JPEGImages/2011_001847.jpg 333 500 8 225 288 332 457 8 2 307 153 500 8 26 227 162 368 8 193 221 291 399 10 50 245 295 456 4 186 208 204 270 +15929 /data/VOCdevkit/VOC2012/JPEGImages/2011_001854.jpg 500 331 9 1 1 305 277 9 2 9 443 330 +15930 /data/VOCdevkit/VOC2012/JPEGImages/2011_001855.jpg 500 375 11 63 7 433 375 +15931 /data/VOCdevkit/VOC2012/JPEGImages/2011_001856.jpg 500 375 17 274 174 407 322 19 89 143 154 199 17 1 227 227 375 +15932 /data/VOCdevkit/VOC2012/JPEGImages/2011_001858.jpg 500 399 0 18 107 498 347 +15933 /data/VOCdevkit/VOC2012/JPEGImages/2011_001862.jpg 500 375 8 267 184 315 258 8 250 178 284 254 8 211 178 259 250 10 209 188 305 266 11 175 225 293 282 15 190 82 223 141 +15934 /data/VOCdevkit/VOC2012/JPEGImages/2011_001863.jpg 375 500 15 2 1 372 500 +15935 /data/VOCdevkit/VOC2012/JPEGImages/2011_001866.jpg 500 400 2 1 21 428 400 +15936 /data/VOCdevkit/VOC2012/JPEGImages/2011_001868.jpg 500 333 11 199 1 499 332 +15937 /data/VOCdevkit/VOC2012/JPEGImages/2011_001870.jpg 375 500 5 66 38 294 421 14 79 238 140 395 14 308 262 345 369 14 15 247 70 404 14 1 284 36 411 +15938 /data/VOCdevkit/VOC2012/JPEGImages/2011_001871.jpg 500 333 0 25 94 479 224 +15939 /data/VOCdevkit/VOC2012/JPEGImages/2011_001872.jpg 500 375 0 88 173 215 213 0 379 200 439 214 +15940 /data/VOCdevkit/VOC2012/JPEGImages/2011_001873.jpg 500 375 2 228 144 483 315 +15941 /data/VOCdevkit/VOC2012/JPEGImages/2011_001875.jpg 500 333 0 120 110 275 170 0 151 273 432 333 +15942 /data/VOCdevkit/VOC2012/JPEGImages/2011_001876.jpg 500 333 13 151 107 499 333 +15943 /data/VOCdevkit/VOC2012/JPEGImages/2011_001877.jpg 500 375 11 178 179 292 289 11 111 86 171 310 +15944 /data/VOCdevkit/VOC2012/JPEGImages/2011_001880.jpg 500 375 0 324 1 500 169 0 83 114 500 300 +15945 /data/VOCdevkit/VOC2012/JPEGImages/2011_001884.jpg 500 372 10 219 172 500 372 10 102 107 297 203 8 187 148 313 372 8 260 142 316 210 8 320 136 364 194 8 367 136 402 183 8 330 224 500 372 8 403 270 500 372 8 84 109 111 203 8 103 110 168 217 8 155 118 216 220 8 223 114 257 152 8 258 112 293 146 +15946 /data/VOCdevkit/VOC2012/JPEGImages/2011_001885.jpg 500 338 6 155 208 180 237 13 209 242 257 320 14 259 215 279 275 14 283 221 301 282 14 212 219 252 307 14 239 212 263 281 +15947 /data/VOCdevkit/VOC2012/JPEGImages/2011_001886.jpg 500 375 3 60 300 128 317 +15948 /data/VOCdevkit/VOC2012/JPEGImages/2011_001889.jpg 288 384 18 1 259 286 384 +15949 /data/VOCdevkit/VOC2012/JPEGImages/2011_001891.jpg 500 333 6 268 105 500 240 6 68 102 315 275 6 433 82 500 121 6 340 84 437 110 6 241 87 315 125 6 136 88 216 125 14 292 73 319 131 14 352 71 368 110 +15950 /data/VOCdevkit/VOC2012/JPEGImages/2011_001893.jpg 500 374 12 45 43 402 374 +15951 /data/VOCdevkit/VOC2012/JPEGImages/2011_001895.jpg 500 375 17 1 141 500 375 14 44 7 494 375 14 257 46 500 375 +15952 /data/VOCdevkit/VOC2012/JPEGImages/2011_001896.jpg 500 333 1 232 174 388 326 +15953 /data/VOCdevkit/VOC2012/JPEGImages/2011_001900.jpg 500 423 7 85 37 425 360 8 210 97 500 422 10 1 96 377 423 +15954 /data/VOCdevkit/VOC2012/JPEGImages/2011_001901.jpg 500 375 3 1 64 500 368 3 296 164 470 234 3 90 198 170 245 6 1 330 189 375 +15955 /data/VOCdevkit/VOC2012/JPEGImages/2011_001902.jpg 500 471 2 70 58 231 414 +15956 /data/VOCdevkit/VOC2012/JPEGImages/2011_001904.jpg 500 375 18 67 212 454 369 18 1 221 102 297 14 409 264 449 370 14 483 268 500 322 +15957 /data/VOCdevkit/VOC2012/JPEGImages/2011_001906.jpg 500 366 14 26 16 268 366 14 224 23 498 365 +15958 /data/VOCdevkit/VOC2012/JPEGImages/2011_001910.jpg 500 466 19 235 173 326 316 +15959 /data/VOCdevkit/VOC2012/JPEGImages/2011_001911.jpg 500 333 7 2 86 301 333 7 1 1 232 152 +15960 /data/VOCdevkit/VOC2012/JPEGImages/2011_001914.jpg 500 375 4 416 313 446 375 17 1 12 485 375 1 258 1 500 209 4 290 156 316 202 14 49 55 364 375 14 138 14 458 375 14 252 5 500 238 +15961 /data/VOCdevkit/VOC2012/JPEGImages/2011_001919.jpg 500 375 14 160 16 356 329 4 442 149 493 179 +15962 /data/VOCdevkit/VOC2012/JPEGImages/2011_001920.jpg 500 375 10 1 300 290 375 14 1 44 188 315 14 160 37 410 375 14 107 98 499 375 +15963 /data/VOCdevkit/VOC2012/JPEGImages/2011_001922.jpg 246 326 17 1 148 246 295 14 24 180 246 272 14 119 122 246 256 +15964 /data/VOCdevkit/VOC2012/JPEGImages/2011_001924.jpg 500 357 2 136 108 250 222 +15965 /data/VOCdevkit/VOC2012/JPEGImages/2011_001926.jpg 500 369 19 73 38 462 369 +15966 /data/VOCdevkit/VOC2012/JPEGImages/2011_001927.jpg 500 333 18 163 170 324 202 +15967 /data/VOCdevkit/VOC2012/JPEGImages/2011_001928.jpg 500 283 19 158 46 301 158 15 463 49 500 86 14 36 82 190 283 14 303 30 481 283 +15968 /data/VOCdevkit/VOC2012/JPEGImages/2011_001929.jpg 500 333 6 44 88 321 228 +15969 /data/VOCdevkit/VOC2012/JPEGImages/2011_001930.jpg 334 500 8 66 125 317 479 +15970 /data/VOCdevkit/VOC2012/JPEGImages/2011_001932.jpg 320 240 8 48 156 129 225 17 167 147 320 229 +15971 /data/VOCdevkit/VOC2012/JPEGImages/2011_001937.jpg 500 333 1 408 143 494 205 1 299 148 402 209 1 205 143 290 216 1 149 197 263 286 1 62 185 115 257 14 351 155 397 222 14 295 159 347 224 14 147 97 193 223 14 147 129 218 286 14 20 110 41 154 14 1 101 31 254 +15972 /data/VOCdevkit/VOC2012/JPEGImages/2011_001938.jpg 360 270 19 229 61 283 109 8 17 177 195 270 4 254 148 271 180 +15973 /data/VOCdevkit/VOC2012/JPEGImages/2011_001941.jpg 500 375 8 207 257 272 338 8 153 280 226 353 8 84 266 154 343 8 87 351 223 375 8 402 352 492 375 8 364 310 474 375 8 344 293 412 375 8 320 274 400 360 8 306 264 359 334 8 1 236 48 306 10 380 272 439 316 10 413 283 480 338 10 451 315 500 375 8 5 237 40 264 +15974 /data/VOCdevkit/VOC2012/JPEGImages/2011_001942.jpg 500 374 9 102 39 436 306 +15975 /data/VOCdevkit/VOC2012/JPEGImages/2011_001944.jpg 500 375 11 102 139 428 331 11 169 110 378 164 +15976 /data/VOCdevkit/VOC2012/JPEGImages/2011_001945.jpg 375 500 1 10 227 340 429 1 125 287 375 500 +15977 /data/VOCdevkit/VOC2012/JPEGImages/2011_001946.jpg 375 500 19 103 196 148 238 15 172 78 375 500 15 187 157 299 323 8 83 213 134 336 +15978 /data/VOCdevkit/VOC2012/JPEGImages/2011_001949.jpg 500 360 5 154 60 377 316 14 70 215 92 263 5 1 161 144 249 6 1 216 65 249 1 1 237 35 264 6 372 208 409 258 6 402 207 446 243 +15979 /data/VOCdevkit/VOC2012/JPEGImages/2011_001950.jpg 500 375 9 1 72 459 375 9 1 1 164 350 +15980 /data/VOCdevkit/VOC2012/JPEGImages/2011_001951.jpg 500 375 18 107 4 387 332 18 334 156 500 313 18 1 143 176 317 +15981 /data/VOCdevkit/VOC2012/JPEGImages/2011_001952.jpg 500 333 2 75 9 498 232 2 39 187 179 242 +15982 /data/VOCdevkit/VOC2012/JPEGImages/2011_001956.jpg 333 500 12 109 72 287 449 14 122 37 275 302 +15983 /data/VOCdevkit/VOC2012/JPEGImages/2011_001959.jpg 500 327 2 222 140 287 200 +15984 /data/VOCdevkit/VOC2012/JPEGImages/2011_001961.jpg 500 375 3 5 247 491 375 6 96 35 176 78 14 129 36 370 375 +15985 /data/VOCdevkit/VOC2012/JPEGImages/2011_001962.jpg 500 333 0 91 147 442 259 +15986 /data/VOCdevkit/VOC2012/JPEGImages/2011_001964.jpg 500 400 5 64 103 383 308 +15987 /data/VOCdevkit/VOC2012/JPEGImages/2011_001966.jpg 357 500 1 83 207 296 451 14 110 63 294 392 +15988 /data/VOCdevkit/VOC2012/JPEGImages/2011_001967.jpg 375 500 2 23 22 366 423 +15989 /data/VOCdevkit/VOC2012/JPEGImages/2011_001971.jpg 375 500 7 1 91 337 409 +15990 /data/VOCdevkit/VOC2012/JPEGImages/2011_001972.jpg 500 375 8 280 27 500 373 +15991 /data/VOCdevkit/VOC2012/JPEGImages/2011_001974.jpg 500 375 17 93 73 325 197 +15992 /data/VOCdevkit/VOC2012/JPEGImages/2011_001975.jpg 500 375 4 396 182 423 251 10 91 166 499 375 14 204 72 314 219 14 68 71 195 283 +15993 /data/VOCdevkit/VOC2012/JPEGImages/2011_001977.jpg 500 376 17 1 221 337 376 19 188 171 244 221 14 157 179 207 252 14 203 179 229 209 +15994 /data/VOCdevkit/VOC2012/JPEGImages/2011_001980.jpg 500 445 17 3 197 498 444 14 217 89 487 444 14 1 75 252 445 +15995 /data/VOCdevkit/VOC2012/JPEGImages/2011_001982.jpg 500 375 6 43 117 449 303 +15996 /data/VOCdevkit/VOC2012/JPEGImages/2011_001984.jpg 500 375 11 166 30 422 375 +15997 /data/VOCdevkit/VOC2012/JPEGImages/2011_001986.jpg 500 331 16 24 23 479 331 +15998 /data/VOCdevkit/VOC2012/JPEGImages/2011_001987.jpg 500 336 1 220 194 352 276 14 261 156 330 287 +15999 /data/VOCdevkit/VOC2012/JPEGImages/2011_001988.jpg 375 500 1 191 193 302 425 14 194 49 308 312 14 3 95 214 500 +16000 /data/VOCdevkit/VOC2012/JPEGImages/2011_001989.jpg 375 500 14 207 195 239 240 +16001 /data/VOCdevkit/VOC2012/JPEGImages/2011_001991.jpg 500 333 3 390 150 464 195 +16002 /data/VOCdevkit/VOC2012/JPEGImages/2011_002002.jpg 500 375 1 302 179 428 375 6 431 69 472 88 14 311 38 433 333 14 312 81 423 302 +16003 /data/VOCdevkit/VOC2012/JPEGImages/2011_002003.jpg 500 375 1 335 1 500 267 +16004 /data/VOCdevkit/VOC2012/JPEGImages/2011_002004.jpg 500 439 7 1 1 466 439 +16005 /data/VOCdevkit/VOC2012/JPEGImages/2011_002005.jpg 500 375 8 286 260 500 374 19 249 131 349 240 14 46 34 162 252 14 350 79 443 241 14 231 133 474 375 +16006 /data/VOCdevkit/VOC2012/JPEGImages/2011_002006.jpg 500 375 1 69 169 407 375 14 143 37 313 375 14 1 1 42 118 4 153 134 177 181 +16007 /data/VOCdevkit/VOC2012/JPEGImages/2011_002012.jpg 500 475 0 237 195 391 320 +16008 /data/VOCdevkit/VOC2012/JPEGImages/2011_002016.jpg 500 374 2 210 78 326 347 +16009 /data/VOCdevkit/VOC2012/JPEGImages/2011_002018.jpg 450 338 9 247 168 329 299 9 45 153 179 280 9 216 158 265 230 9 321 165 407 260 9 1 157 35 261 9 126 146 225 225 +16010 /data/VOCdevkit/VOC2012/JPEGImages/2011_002019.jpg 500 375 9 190 53 499 297 14 1 1 206 375 +16011 /data/VOCdevkit/VOC2012/JPEGImages/2011_002021.jpg 500 375 6 389 138 500 219 14 70 105 248 375 14 257 97 483 375 14 218 76 327 375 14 409 116 425 147 14 436 112 454 146 +16012 /data/VOCdevkit/VOC2012/JPEGImages/2011_002022.jpg 500 375 15 19 67 309 375 +16013 /data/VOCdevkit/VOC2012/JPEGImages/2011_002027.jpg 500 375 16 2 50 454 375 +16014 /data/VOCdevkit/VOC2012/JPEGImages/2011_002031.jpg 500 375 15 124 1 438 279 7 130 176 217 263 +16015 /data/VOCdevkit/VOC2012/JPEGImages/2011_002033.jpg 375 500 6 1 187 373 341 14 144 210 184 354 +16016 /data/VOCdevkit/VOC2012/JPEGImages/2011_002034.jpg 500 334 7 73 54 500 299 +16017 /data/VOCdevkit/VOC2012/JPEGImages/2011_002036.jpg 500 333 3 142 155 316 214 +16018 /data/VOCdevkit/VOC2012/JPEGImages/2011_002038.jpg 500 375 8 122 44 385 353 +16019 /data/VOCdevkit/VOC2012/JPEGImages/2011_002039.jpg 334 500 13 194 351 314 427 14 255 171 334 368 14 290 141 334 240 14 35 39 99 192 14 82 33 119 185 13 295 319 334 455 +16020 /data/VOCdevkit/VOC2012/JPEGImages/2011_002040.jpg 500 489 11 5 34 483 479 +16021 /data/VOCdevkit/VOC2012/JPEGImages/2011_002041.jpg 500 333 8 123 91 257 281 +16022 /data/VOCdevkit/VOC2012/JPEGImages/2011_002042.jpg 500 208 9 107 98 165 150 9 148 60 176 94 14 420 108 451 166 14 34 55 60 115 +16023 /data/VOCdevkit/VOC2012/JPEGImages/2011_002044.jpg 500 375 11 1 1 429 375 4 403 298 460 375 4 352 297 406 375 +16024 /data/VOCdevkit/VOC2012/JPEGImages/2011_002045.jpg 500 375 15 420 142 484 219 14 54 249 134 375 14 119 212 190 373 14 197 208 280 375 14 258 237 326 375 14 303 219 416 375 14 79 134 150 265 14 152 133 214 239 14 210 136 257 241 14 257 138 304 238 14 293 133 351 241 14 334 131 394 261 8 16 166 91 351 +16025 /data/VOCdevkit/VOC2012/JPEGImages/2011_002046.jpg 333 500 5 1 188 42 314 5 7 91 323 392 14 56 249 116 461 +16026 /data/VOCdevkit/VOC2012/JPEGImages/2011_002047.jpg 500 333 14 94 101 238 333 12 274 124 470 329 12 170 71 325 321 +16027 /data/VOCdevkit/VOC2012/JPEGImages/2011_002049.jpg 375 500 1 143 338 294 441 14 171 269 239 434 +16028 /data/VOCdevkit/VOC2012/JPEGImages/2011_002050.jpg 500 375 3 225 152 324 286 3 1 248 37 298 +16029 /data/VOCdevkit/VOC2012/JPEGImages/2011_002053.jpg 500 375 18 1 113 486 342 +16030 /data/VOCdevkit/VOC2012/JPEGImages/2011_002055.jpg 500 460 2 66 94 437 460 +16031 /data/VOCdevkit/VOC2012/JPEGImages/2011_002062.jpg 500 336 13 115 1 484 312 +16032 /data/VOCdevkit/VOC2012/JPEGImages/2011_002063.jpg 500 375 12 311 184 467 375 14 53 41 251 295 +16033 /data/VOCdevkit/VOC2012/JPEGImages/2011_002064.jpg 500 364 1 77 74 357 350 6 76 86 121 124 6 133 80 256 130 6 378 67 500 139 1 62 78 318 314 +16034 /data/VOCdevkit/VOC2012/JPEGImages/2011_002073.jpg 500 375 3 134 132 226 233 3 39 101 494 230 +16035 /data/VOCdevkit/VOC2012/JPEGImages/2011_002074.jpg 500 375 10 117 199 337 291 10 1 256 306 374 14 264 91 390 213 14 299 91 459 348 14 299 104 500 375 14 215 127 251 186 14 164 101 227 206 14 95 99 213 231 14 7 94 120 269 +16036 /data/VOCdevkit/VOC2012/JPEGImages/2011_002075.jpg 500 375 10 139 287 499 375 14 3 30 343 375 +16037 /data/VOCdevkit/VOC2012/JPEGImages/2011_002079.jpg 500 375 5 1 53 344 374 +16038 /data/VOCdevkit/VOC2012/JPEGImages/2011_002085.jpg 500 334 3 38 183 284 220 14 187 157 236 203 14 72 148 124 202 +16039 /data/VOCdevkit/VOC2012/JPEGImages/2011_002088.jpg 500 313 4 9 60 469 232 +16040 /data/VOCdevkit/VOC2012/JPEGImages/2011_002091.jpg 500 375 0 3 64 383 245 +16041 /data/VOCdevkit/VOC2012/JPEGImages/2011_002093.jpg 377 500 13 1 105 377 500 13 1 92 377 352 13 1 52 321 187 13 1 39 289 118 13 1 1 275 93 +16042 /data/VOCdevkit/VOC2012/JPEGImages/2011_002096.jpg 500 375 6 105 62 409 333 6 1 87 41 196 +16043 /data/VOCdevkit/VOC2012/JPEGImages/2011_002097.jpg 500 375 13 106 77 442 374 14 210 19 402 323 +16044 /data/VOCdevkit/VOC2012/JPEGImages/2011_002098.jpg 500 375 11 68 105 387 362 4 146 80 293 173 +16045 /data/VOCdevkit/VOC2012/JPEGImages/2011_002100.jpg 500 334 2 139 25 324 209 +16046 /data/VOCdevkit/VOC2012/JPEGImages/2011_002102.jpg 375 500 13 1 111 326 495 +16047 /data/VOCdevkit/VOC2012/JPEGImages/2011_002105.jpg 500 375 18 85 131 413 248 18 1 136 500 236 +16048 /data/VOCdevkit/VOC2012/JPEGImages/2011_002106.jpg 500 336 6 272 98 478 256 6 261 95 326 180 14 155 98 220 297 14 25 98 95 300 14 209 132 235 167 +16049 /data/VOCdevkit/VOC2012/JPEGImages/2011_002107.jpg 500 375 13 1 1 476 375 +16050 /data/VOCdevkit/VOC2012/JPEGImages/2011_002108.jpg 500 333 8 162 189 214 266 8 198 186 227 253 10 155 197 248 268 +16051 /data/VOCdevkit/VOC2012/JPEGImages/2011_002109.jpg 375 500 17 1 1 375 500 14 1 103 373 500 14 62 107 214 240 +16052 /data/VOCdevkit/VOC2012/JPEGImages/2011_002110.jpg 500 332 11 62 73 355 288 14 332 1 500 177 +16053 /data/VOCdevkit/VOC2012/JPEGImages/2011_002111.jpg 500 333 1 53 103 289 319 1 304 51 338 111 6 442 40 500 64 14 331 24 359 108 4 166 171 193 199 4 189 163 206 197 +16054 /data/VOCdevkit/VOC2012/JPEGImages/2011_002113.jpg 500 375 4 351 191 395 319 4 343 196 384 326 1 1 208 456 375 14 103 5 343 375 +16055 /data/VOCdevkit/VOC2012/JPEGImages/2011_002114.jpg 500 337 0 3 49 486 301 +16056 /data/VOCdevkit/VOC2012/JPEGImages/2011_002116.jpg 500 375 13 190 145 378 246 14 226 126 362 190 +16057 /data/VOCdevkit/VOC2012/JPEGImages/2011_002119.jpg 500 400 16 1 11 489 240 16 143 149 254 267 16 17 174 498 399 16 1 192 184 400 +16058 /data/VOCdevkit/VOC2012/JPEGImages/2011_002121.jpg 480 360 11 1 17 434 359 +16059 /data/VOCdevkit/VOC2012/JPEGImages/2011_002124.jpg 500 375 8 120 205 245 331 14 337 120 401 294 +16060 /data/VOCdevkit/VOC2012/JPEGImages/2011_002128.jpg 500 333 7 238 144 279 225 +16061 /data/VOCdevkit/VOC2012/JPEGImages/2011_002131.jpg 500 333 4 1 1 292 332 +16062 /data/VOCdevkit/VOC2012/JPEGImages/2011_002132.jpg 500 333 0 125 107 357 242 +16063 /data/VOCdevkit/VOC2012/JPEGImages/2011_002134.jpg 500 309 9 26 132 186 207 9 108 109 206 156 9 155 119 307 180 9 312 122 454 176 +16064 /data/VOCdevkit/VOC2012/JPEGImages/2011_002135.jpg 466 500 1 35 274 466 500 6 1 2 188 103 6 128 1 355 80 4 237 389 294 464 14 50 40 425 500 +16065 /data/VOCdevkit/VOC2012/JPEGImages/2011_002137.jpg 500 375 11 90 68 395 375 14 1 1 500 375 +16066 /data/VOCdevkit/VOC2012/JPEGImages/2011_002142.jpg 500 375 10 67 194 369 370 14 341 190 500 375 14 26 163 191 375 14 15 135 94 303 14 119 137 169 213 14 165 112 254 200 14 253 126 331 206 14 366 132 440 203 14 271 147 427 357 +16067 /data/VOCdevkit/VOC2012/JPEGImages/2011_002143.jpg 375 500 6 220 287 273 361 6 45 261 167 387 6 155 289 186 368 6 171 293 221 347 6 253 286 295 383 6 82 137 245 195 6 233 111 375 247 +16068 /data/VOCdevkit/VOC2012/JPEGImages/2011_002144.jpg 500 375 14 157 70 364 375 +16069 /data/VOCdevkit/VOC2012/JPEGImages/2011_002147.jpg 375 500 7 68 77 342 439 10 1 17 375 500 +16070 /data/VOCdevkit/VOC2012/JPEGImages/2011_002148.jpg 500 337 14 234 154 307 337 14 152 151 224 337 +16071 /data/VOCdevkit/VOC2012/JPEGImages/2011_002149.jpg 500 334 14 87 162 121 328 14 33 164 95 334 +16072 /data/VOCdevkit/VOC2012/JPEGImages/2011_002150.jpg 500 375 1 259 291 377 372 +16073 /data/VOCdevkit/VOC2012/JPEGImages/2011_002154.jpg 500 375 19 301 161 436 298 +16074 /data/VOCdevkit/VOC2012/JPEGImages/2011_002156.jpg 500 375 11 171 119 469 370 +16075 /data/VOCdevkit/VOC2012/JPEGImages/2011_002158.jpg 500 375 14 203 31 499 375 4 117 245 160 357 4 179 258 235 306 4 205 263 245 314 +16076 /data/VOCdevkit/VOC2012/JPEGImages/2011_002159.jpg 331 500 12 98 148 314 375 +16077 /data/VOCdevkit/VOC2012/JPEGImages/2011_002160.jpg 500 380 14 115 24 444 376 +16078 /data/VOCdevkit/VOC2012/JPEGImages/2011_002163.jpg 500 333 4 203 217 306 281 8 388 44 500 243 10 212 73 447 249 14 282 211 439 332 14 1 1 301 332 +16079 /data/VOCdevkit/VOC2012/JPEGImages/2011_002167.jpg 500 375 14 199 102 312 352 14 1 53 103 230 14 382 75 477 321 4 427 140 447 175 +16080 /data/VOCdevkit/VOC2012/JPEGImages/2011_002169.jpg 500 375 16 175 216 266 294 16 22 193 41 215 +16081 /data/VOCdevkit/VOC2012/JPEGImages/2011_002173.jpg 500 375 18 1 137 457 375 +16082 /data/VOCdevkit/VOC2012/JPEGImages/2011_002174.jpg 500 375 6 340 322 383 359 6 228 302 321 367 6 314 314 349 367 6 365 318 407 351 +16083 /data/VOCdevkit/VOC2012/JPEGImages/2011_002177.jpg 500 375 8 215 28 500 375 +16084 /data/VOCdevkit/VOC2012/JPEGImages/2011_002178.jpg 500 375 16 57 28 500 375 +16085 /data/VOCdevkit/VOC2012/JPEGImages/2011_002179.jpg 500 375 14 1 134 372 375 8 93 22 200 118 8 69 61 145 128 +16086 /data/VOCdevkit/VOC2012/JPEGImages/2011_002184.jpg 500 375 17 9 63 500 364 14 148 38 379 375 +16087 /data/VOCdevkit/VOC2012/JPEGImages/2011_002185.jpg 375 500 4 271 117 298 179 10 1 190 375 500 4 42 95 95 200 4 175 107 206 213 4 104 93 134 192 4 146 105 176 206 4 122 92 142 185 4 84 97 114 175 4 139 97 154 186 4 165 86 202 145 4 130 81 163 129 4 230 133 250 171 4 250 137 265 173 +16088 /data/VOCdevkit/VOC2012/JPEGImages/2011_002186.jpg 500 335 14 2 107 276 335 7 229 59 428 183 17 1 1 480 335 4 464 100 486 163 4 476 37 492 91 +16089 /data/VOCdevkit/VOC2012/JPEGImages/2011_002189.jpg 500 375 9 27 20 450 310 +16090 /data/VOCdevkit/VOC2012/JPEGImages/2011_002192.jpg 500 334 1 302 165 354 268 1 139 181 198 290 14 134 87 200 264 14 301 81 364 252 +16091 /data/VOCdevkit/VOC2012/JPEGImages/2011_002193.jpg 500 375 0 127 72 447 190 14 380 168 414 261 14 311 166 335 224 14 435 160 449 202 14 483 162 500 204 14 410 163 425 199 +16092 /data/VOCdevkit/VOC2012/JPEGImages/2011_002200.jpg 500 375 8 5 196 104 375 10 104 147 482 375 14 35 77 182 325 14 243 65 326 153 14 108 79 242 230 14 387 89 478 280 14 364 82 420 189 14 168 79 232 162 +16093 /data/VOCdevkit/VOC2012/JPEGImages/2011_002211.jpg 500 375 7 8 63 468 331 +16094 /data/VOCdevkit/VOC2012/JPEGImages/2011_002215.jpg 500 375 5 287 1 498 374 6 1 267 177 374 6 134 287 270 374 6 222 277 292 311 14 377 251 416 303 +16095 /data/VOCdevkit/VOC2012/JPEGImages/2011_002218.jpg 500 375 19 52 27 392 345 +16096 /data/VOCdevkit/VOC2012/JPEGImages/2011_002221.jpg 500 375 2 142 1 306 270 2 14 319 94 372 +16097 /data/VOCdevkit/VOC2012/JPEGImages/2011_002222.jpg 500 376 0 112 122 370 279 +16098 /data/VOCdevkit/VOC2012/JPEGImages/2011_002223.jpg 500 375 1 78 139 361 258 1 153 108 347 197 +16099 /data/VOCdevkit/VOC2012/JPEGImages/2011_002224.jpg 339 500 6 122 239 204 324 +16100 /data/VOCdevkit/VOC2012/JPEGImages/2011_002227.jpg 500 375 5 253 1 490 222 14 170 160 246 270 14 124 196 211 300 14 104 165 166 266 14 44 165 145 364 14 4 192 51 297 +16101 /data/VOCdevkit/VOC2012/JPEGImages/2011_002228.jpg 500 340 2 115 47 427 323 +16102 /data/VOCdevkit/VOC2012/JPEGImages/2011_002230.jpg 500 375 2 1 159 317 375 +16103 /data/VOCdevkit/VOC2012/JPEGImages/2011_002234.jpg 500 333 6 15 67 500 333 14 213 96 493 333 +16104 /data/VOCdevkit/VOC2012/JPEGImages/2011_002236.jpg 500 335 13 223 192 497 335 14 21 73 252 325 14 129 68 241 290 14 231 93 282 282 14 399 165 478 254 4 370 196 392 232 4 1 183 22 231 +16105 /data/VOCdevkit/VOC2012/JPEGImages/2011_002237.jpg 500 337 4 205 297 228 337 14 55 80 244 337 14 246 68 425 337 +16106 /data/VOCdevkit/VOC2012/JPEGImages/2011_002239.jpg 300 452 11 42 38 218 434 14 60 1 298 452 +16107 /data/VOCdevkit/VOC2012/JPEGImages/2011_002241.jpg 500 375 10 62 143 480 375 8 17 124 224 375 8 153 94 240 164 8 327 99 457 340 8 220 143 438 375 +16108 /data/VOCdevkit/VOC2012/JPEGImages/2011_002244.jpg 500 375 1 363 184 377 205 14 362 168 380 206 +16109 /data/VOCdevkit/VOC2012/JPEGImages/2011_002245.jpg 500 335 2 222 96 268 178 2 337 127 419 335 14 191 109 381 335 14 454 124 500 335 +16110 /data/VOCdevkit/VOC2012/JPEGImages/2011_002246.jpg 375 500 2 222 51 285 86 +16111 /data/VOCdevkit/VOC2012/JPEGImages/2011_002247.jpg 500 335 18 1 1 499 282 14 140 148 241 282 14 61 149 145 245 14 4 163 69 255 +16112 /data/VOCdevkit/VOC2012/JPEGImages/2011_002248.jpg 500 324 0 1 1 500 324 14 180 131 350 324 +16113 /data/VOCdevkit/VOC2012/JPEGImages/2011_002251.jpg 334 500 18 1 19 284 489 +16114 /data/VOCdevkit/VOC2012/JPEGImages/2011_002252.jpg 500 333 13 1 1 500 333 +16115 /data/VOCdevkit/VOC2012/JPEGImages/2011_002253.jpg 500 375 6 1 29 494 374 +16116 /data/VOCdevkit/VOC2012/JPEGImages/2011_002260.jpg 500 375 8 43 228 185 375 8 177 280 334 375 +16117 /data/VOCdevkit/VOC2012/JPEGImages/2011_002265.jpg 500 488 2 122 108 324 387 +16118 /data/VOCdevkit/VOC2012/JPEGImages/2011_002268.jpg 500 375 17 33 231 277 375 19 71 145 120 193 +16119 /data/VOCdevkit/VOC2012/JPEGImages/2011_002269.jpg 500 375 0 68 9 396 352 +16120 /data/VOCdevkit/VOC2012/JPEGImages/2011_002270.jpg 500 332 8 397 24 463 113 8 472 86 500 189 8 2 30 52 135 8 1 100 49 193 +16121 /data/VOCdevkit/VOC2012/JPEGImages/2011_002272.jpg 500 333 9 17 64 325 306 9 374 75 469 262 9 248 42 391 208 +16122 /data/VOCdevkit/VOC2012/JPEGImages/2011_002273.jpg 333 500 14 68 98 309 500 +16123 /data/VOCdevkit/VOC2012/JPEGImages/2011_002276.jpg 375 500 7 1 1 374 449 +16124 /data/VOCdevkit/VOC2012/JPEGImages/2011_002278.jpg 500 325 18 2 1 364 280 14 91 47 113 79 +16125 /data/VOCdevkit/VOC2012/JPEGImages/2011_002279.jpg 500 375 11 1 1 459 321 +16126 /data/VOCdevkit/VOC2012/JPEGImages/2011_002280.jpg 500 375 18 301 242 500 295 +16127 /data/VOCdevkit/VOC2012/JPEGImages/2011_002281.jpg 500 500 1 298 218 432 434 +16128 /data/VOCdevkit/VOC2012/JPEGImages/2011_002284.jpg 500 333 0 12 146 497 266 0 47 150 183 201 +16129 /data/VOCdevkit/VOC2012/JPEGImages/2011_002291.jpg 500 375 17 1 126 478 239 14 115 117 213 237 14 433 80 471 164 +16130 /data/VOCdevkit/VOC2012/JPEGImages/2011_002292.jpg 500 375 19 33 26 214 218 +16131 /data/VOCdevkit/VOC2012/JPEGImages/2011_002294.jpg 500 432 18 8 194 293 301 18 287 204 370 300 +16132 /data/VOCdevkit/VOC2012/JPEGImages/2011_002295.jpg 500 344 2 190 81 315 252 +16133 /data/VOCdevkit/VOC2012/JPEGImages/2011_002298.jpg 500 375 11 1 78 368 333 +16134 /data/VOCdevkit/VOC2012/JPEGImages/2011_002300.jpg 500 375 11 134 13 324 333 +16135 /data/VOCdevkit/VOC2012/JPEGImages/2011_002301.jpg 400 300 4 126 73 175 276 4 167 59 239 286 14 39 30 326 300 +16136 /data/VOCdevkit/VOC2012/JPEGImages/2011_002303.jpg 500 333 6 78 138 206 180 14 374 34 472 331 14 223 25 363 333 +16137 /data/VOCdevkit/VOC2012/JPEGImages/2011_002308.jpg 375 500 14 60 65 334 500 +16138 /data/VOCdevkit/VOC2012/JPEGImages/2011_002312.jpg 500 333 14 85 71 306 332 +16139 /data/VOCdevkit/VOC2012/JPEGImages/2011_002317.jpg 500 375 14 275 30 438 375 14 187 89 294 375 14 20 49 198 375 +16140 /data/VOCdevkit/VOC2012/JPEGImages/2011_002318.jpg 500 375 15 135 1 215 62 15 191 2 266 63 4 1 2 118 349 +16141 /data/VOCdevkit/VOC2012/JPEGImages/2011_002322.jpg 500 375 6 1 1 339 125 13 206 151 383 357 14 358 13 448 258 14 214 40 392 342 +16142 /data/VOCdevkit/VOC2012/JPEGImages/2011_002324.jpg 500 375 4 2 1 452 375 +16143 /data/VOCdevkit/VOC2012/JPEGImages/2011_002325.jpg 333 500 1 123 424 281 495 +16144 /data/VOCdevkit/VOC2012/JPEGImages/2011_002327.jpg 500 333 0 1 26 500 260 +16145 /data/VOCdevkit/VOC2012/JPEGImages/2011_002330.jpg 500 286 5 82 62 404 246 14 24 146 49 213 5 422 108 478 166 5 467 107 500 179 +16146 /data/VOCdevkit/VOC2012/JPEGImages/2011_002335.jpg 500 375 8 85 151 211 245 17 211 150 499 375 14 233 158 500 333 14 181 136 438 375 14 59 134 196 201 +16147 /data/VOCdevkit/VOC2012/JPEGImages/2011_002341.jpg 379 500 12 11 61 370 500 14 149 33 248 333 +16148 /data/VOCdevkit/VOC2012/JPEGImages/2011_002343.jpg 375 500 14 83 9 333 491 +16149 /data/VOCdevkit/VOC2012/JPEGImages/2011_002346.jpg 500 263 0 8 13 487 183 +16150 /data/VOCdevkit/VOC2012/JPEGImages/2011_002347.jpg 420 500 7 2 9 419 440 2 15 343 356 485 +16151 /data/VOCdevkit/VOC2012/JPEGImages/2011_002348.jpg 500 375 4 281 209 305 305 10 53 262 499 375 14 299 119 500 323 14 94 161 184 287 +16152 /data/VOCdevkit/VOC2012/JPEGImages/2011_002350.jpg 500 375 15 344 229 398 309 15 236 166 272 210 15 134 148 180 212 +16153 /data/VOCdevkit/VOC2012/JPEGImages/2011_002357.jpg 375 500 13 1 1 303 482 +16154 /data/VOCdevkit/VOC2012/JPEGImages/2011_002358.jpg 500 375 4 325 239 349 297 10 65 154 409 375 14 26 110 179 368 14 123 99 212 203 14 213 77 300 172 14 255 103 500 332 14 311 81 381 155 8 1 175 131 367 +16155 /data/VOCdevkit/VOC2012/JPEGImages/2011_002359.jpg 500 375 17 2 114 453 373 14 17 84 313 375 14 195 35 427 375 14 54 203 276 363 4 162 199 219 242 +16156 /data/VOCdevkit/VOC2012/JPEGImages/2011_002362.jpg 500 338 12 116 93 435 302 12 60 88 319 275 +16157 /data/VOCdevkit/VOC2012/JPEGImages/2011_002365.jpg 500 333 14 108 111 350 278 14 272 127 355 178 14 156 81 238 169 +16158 /data/VOCdevkit/VOC2012/JPEGImages/2011_002366.jpg 500 234 6 56 48 341 141 +16159 /data/VOCdevkit/VOC2012/JPEGImages/2011_002371.jpg 355 500 11 58 77 268 380 +16160 /data/VOCdevkit/VOC2012/JPEGImages/2011_002379.jpg 500 375 18 142 108 293 261 +16161 /data/VOCdevkit/VOC2012/JPEGImages/2011_002380.jpg 500 333 0 1 154 499 314 +16162 /data/VOCdevkit/VOC2012/JPEGImages/2011_002381.jpg 405 500 2 80 9 368 207 2 67 368 220 484 2 136 312 370 442 +16163 /data/VOCdevkit/VOC2012/JPEGImages/2011_002384.jpg 500 375 5 28 157 397 246 6 305 217 494 316 6 433 208 500 249 +16164 /data/VOCdevkit/VOC2012/JPEGImages/2011_002385.jpg 500 375 18 1 1 213 375 +16165 /data/VOCdevkit/VOC2012/JPEGImages/2011_002386.jpg 500 375 15 131 2 261 307 8 210 133 460 359 14 209 34 456 375 +16166 /data/VOCdevkit/VOC2012/JPEGImages/2011_002387.jpg 500 375 4 25 127 346 246 +16167 /data/VOCdevkit/VOC2012/JPEGImages/2011_002388.jpg 500 375 1 353 109 456 230 +16168 /data/VOCdevkit/VOC2012/JPEGImages/2011_002389.jpg 316 500 7 1 131 316 264 +16169 /data/VOCdevkit/VOC2012/JPEGImages/2011_002391.jpg 500 375 15 477 228 500 301 8 347 212 449 343 17 250 291 500 375 8 285 207 340 301 +16170 /data/VOCdevkit/VOC2012/JPEGImages/2011_002393.jpg 500 375 14 309 98 500 375 14 1 21 169 375 +16171 /data/VOCdevkit/VOC2012/JPEGImages/2011_002394.jpg 500 375 4 277 99 295 163 10 62 147 373 374 14 1 57 202 375 14 102 53 230 229 14 363 64 405 120 14 348 81 500 375 +16172 /data/VOCdevkit/VOC2012/JPEGImages/2011_002395.jpg 500 333 17 158 127 432 295 +16173 /data/VOCdevkit/VOC2012/JPEGImages/2011_002396.jpg 500 375 18 17 57 500 298 +16174 /data/VOCdevkit/VOC2012/JPEGImages/2011_002397.jpg 500 375 14 417 219 500 375 14 68 211 210 375 14 181 233 275 375 +16175 /data/VOCdevkit/VOC2012/JPEGImages/2011_002398.jpg 500 332 11 162 51 406 269 +16176 /data/VOCdevkit/VOC2012/JPEGImages/2011_002402.jpg 500 423 13 40 1 500 385 +16177 /data/VOCdevkit/VOC2012/JPEGImages/2011_002406.jpg 500 374 1 1 42 500 338 +16178 /data/VOCdevkit/VOC2012/JPEGImages/2011_002407.jpg 345 500 2 6 47 315 500 +16179 /data/VOCdevkit/VOC2012/JPEGImages/2011_002409.jpg 500 333 7 116 1 252 118 +16180 /data/VOCdevkit/VOC2012/JPEGImages/2011_002410.jpg 500 332 6 18 85 479 282 +16181 /data/VOCdevkit/VOC2012/JPEGImages/2011_002413.jpg 334 500 13 67 161 226 487 14 212 120 232 175 14 196 1 334 374 14 201 9 333 412 14 1 1 61 473 14 61 33 237 419 +16182 /data/VOCdevkit/VOC2012/JPEGImages/2011_002414.jpg 500 365 11 5 136 261 337 17 1 126 500 365 +16183 /data/VOCdevkit/VOC2012/JPEGImages/2011_002418.jpg 500 375 14 123 158 319 375 19 34 1 334 204 +16184 /data/VOCdevkit/VOC2012/JPEGImages/2011_002419.jpg 500 375 11 1 1 352 375 +16185 /data/VOCdevkit/VOC2012/JPEGImages/2011_002420.jpg 500 398 6 16 44 500 378 14 1 98 20 164 +16186 /data/VOCdevkit/VOC2012/JPEGImages/2011_002421.jpg 500 333 3 48 22 399 262 +16187 /data/VOCdevkit/VOC2012/JPEGImages/2011_002422.jpg 500 375 8 73 224 187 375 10 7 223 420 375 8 210 231 300 354 4 248 299 292 375 8 398 236 446 365 +16188 /data/VOCdevkit/VOC2012/JPEGImages/2011_002429.jpg 500 375 14 1 1 500 375 14 219 173 460 375 +16189 /data/VOCdevkit/VOC2012/JPEGImages/2011_002433.jpg 500 333 11 39 56 346 332 4 35 1 115 116 +16190 /data/VOCdevkit/VOC2012/JPEGImages/2011_002435.jpg 500 375 14 2 88 332 375 +16191 /data/VOCdevkit/VOC2012/JPEGImages/2011_002436.jpg 500 375 14 44 6 402 375 14 204 115 364 358 +16192 /data/VOCdevkit/VOC2012/JPEGImages/2011_002443.jpg 375 500 15 1 73 35 123 15 60 27 109 96 15 252 97 284 131 15 241 48 325 129 14 128 195 212 390 14 280 35 303 59 8 37 20 67 79 +16193 /data/VOCdevkit/VOC2012/JPEGImages/2011_002447.jpg 500 375 16 39 202 297 375 16 66 138 465 347 16 48 35 367 204 +16194 /data/VOCdevkit/VOC2012/JPEGImages/2011_002448.jpg 500 375 12 84 90 411 324 +16195 /data/VOCdevkit/VOC2012/JPEGImages/2011_002453.jpg 500 375 15 225 23 453 366 +16196 /data/VOCdevkit/VOC2012/JPEGImages/2011_002455.jpg 333 500 1 45 216 187 486 14 112 79 258 459 14 285 121 312 181 14 273 118 290 169 +16197 /data/VOCdevkit/VOC2012/JPEGImages/2011_002457.jpg 500 375 5 1 25 499 291 +16198 /data/VOCdevkit/VOC2012/JPEGImages/2011_002458.jpg 500 333 2 185 177 394 262 +16199 /data/VOCdevkit/VOC2012/JPEGImages/2011_002459.jpg 400 300 3 68 196 166 235 3 166 168 366 246 14 1 212 53 300 +16200 /data/VOCdevkit/VOC2012/JPEGImages/2011_002460.jpg 500 279 5 130 98 311 239 +16201 /data/VOCdevkit/VOC2012/JPEGImages/2011_002461.jpg 500 375 7 89 10 403 371 +16202 /data/VOCdevkit/VOC2012/JPEGImages/2011_002462.jpg 500 375 19 318 105 450 205 10 21 225 500 375 14 106 169 168 292 8 277 134 362 225 8 3 142 103 340 8 1 214 48 375 4 271 123 278 141 +16203 /data/VOCdevkit/VOC2012/JPEGImages/2011_002463.jpg 500 333 2 176 78 500 203 2 46 172 286 332 +16204 /data/VOCdevkit/VOC2012/JPEGImages/2011_002464.jpg 500 375 16 86 60 367 340 16 98 1 162 109 16 364 56 486 215 2 298 13 340 72 +16205 /data/VOCdevkit/VOC2012/JPEGImages/2011_002470.jpg 500 364 0 10 113 498 247 +16206 /data/VOCdevkit/VOC2012/JPEGImages/2011_002474.jpg 500 375 14 1 175 95 375 14 49 151 220 375 14 179 166 293 326 +16207 /data/VOCdevkit/VOC2012/JPEGImages/2011_002476.jpg 500 375 13 292 160 359 238 14 293 155 356 229 +16208 /data/VOCdevkit/VOC2012/JPEGImages/2011_002479.jpg 500 375 13 1 1 471 339 13 401 1 500 155 14 1 1 80 239 14 90 1 218 82 +16209 /data/VOCdevkit/VOC2012/JPEGImages/2011_002482.jpg 500 375 4 41 116 75 195 14 109 115 296 375 14 296 35 458 375 14 101 92 209 321 14 1 91 120 375 14 272 11 342 149 14 375 1 500 375 4 251 282 279 367 4 294 79 309 102 14 365 1 427 73 +16210 /data/VOCdevkit/VOC2012/JPEGImages/2011_002484.jpg 500 366 6 1 122 88 195 6 27 53 459 327 6 431 108 494 157 6 1 114 89 149 +16211 /data/VOCdevkit/VOC2012/JPEGImages/2011_002488.jpg 333 500 4 218 373 239 433 14 114 164 207 430 8 142 356 230 430 10 113 380 333 493 +16212 /data/VOCdevkit/VOC2012/JPEGImages/2011_002490.jpg 500 375 3 1 187 500 375 14 84 101 326 375 +16213 /data/VOCdevkit/VOC2012/JPEGImages/2011_002491.jpg 500 375 11 27 128 349 324 +16214 /data/VOCdevkit/VOC2012/JPEGImages/2011_002492.jpg 500 333 18 1 89 464 323 +16215 /data/VOCdevkit/VOC2012/JPEGImages/2011_002494.jpg 500 333 0 72 53 500 268 +16216 /data/VOCdevkit/VOC2012/JPEGImages/2011_002495.jpg 500 375 13 1 195 41 324 14 1 166 27 202 14 119 151 206 375 +16217 /data/VOCdevkit/VOC2012/JPEGImages/2011_002498.jpg 375 500 4 190 423 253 470 14 1 48 324 500 14 175 309 375 446 +16218 /data/VOCdevkit/VOC2012/JPEGImages/2011_002503.jpg 500 375 2 30 39 430 361 +16219 /data/VOCdevkit/VOC2012/JPEGImages/2011_002504.jpg 500 375 0 213 132 374 221 +16220 /data/VOCdevkit/VOC2012/JPEGImages/2011_002505.jpg 500 375 14 331 293 465 375 +16221 /data/VOCdevkit/VOC2012/JPEGImages/2011_002507.jpg 312 245 17 2 73 312 245 19 188 42 236 83 +16222 /data/VOCdevkit/VOC2012/JPEGImages/2011_002509.jpg 500 375 8 102 196 155 297 14 417 130 489 281 8 161 199 200 297 14 133 150 163 196 14 306 174 334 221 14 229 160 271 259 14 369 169 416 220 19 359 139 416 170 +16223 /data/VOCdevkit/VOC2012/JPEGImages/2011_002511.jpg 500 375 19 374 1 500 119 14 316 124 500 375 14 217 15 348 179 14 2 90 203 334 14 34 94 200 276 +16224 /data/VOCdevkit/VOC2012/JPEGImages/2011_002514.jpg 500 375 19 143 60 341 213 +16225 /data/VOCdevkit/VOC2012/JPEGImages/2011_002515.jpg 500 333 0 113 75 415 237 14 169 177 188 215 +16226 /data/VOCdevkit/VOC2012/JPEGImages/2011_002516.jpg 326 500 18 56 257 326 500 +16227 /data/VOCdevkit/VOC2012/JPEGImages/2011_002519.jpg 500 375 3 207 164 255 196 3 419 170 499 192 14 426 140 467 178 14 458 140 497 192 14 196 139 261 171 +16228 /data/VOCdevkit/VOC2012/JPEGImages/2011_002520.jpg 500 400 12 249 17 353 264 12 146 18 250 277 12 25 27 133 277 12 342 22 466 263 +16229 /data/VOCdevkit/VOC2012/JPEGImages/2011_002526.jpg 500 253 6 263 170 366 246 6 243 176 273 213 6 214 180 266 210 6 468 187 500 206 6 387 186 421 200 +16230 /data/VOCdevkit/VOC2012/JPEGImages/2011_002528.jpg 500 375 18 1 23 499 352 +16231 /data/VOCdevkit/VOC2012/JPEGImages/2011_002531.jpg 500 375 8 264 107 321 260 8 176 117 256 290 8 254 123 354 296 8 188 147 294 332 10 158 128 350 320 +16232 /data/VOCdevkit/VOC2012/JPEGImages/2011_002532.jpg 500 375 19 251 41 426 176 19 17 41 193 181 14 1 175 33 291 14 289 183 372 267 +16233 /data/VOCdevkit/VOC2012/JPEGImages/2011_002533.jpg 500 500 14 175 221 231 361 +16234 /data/VOCdevkit/VOC2012/JPEGImages/2011_002535.jpg 500 340 18 212 107 362 222 +16235 /data/VOCdevkit/VOC2012/JPEGImages/2011_002536.jpg 500 341 6 270 270 352 309 14 19 194 52 290 14 145 184 181 290 14 91 190 119 280 14 64 178 102 277 14 261 266 273 292 +16236 /data/VOCdevkit/VOC2012/JPEGImages/2011_002542.jpg 500 375 4 205 134 223 189 10 120 173 397 375 14 283 79 369 233 14 97 87 186 257 14 276 88 500 375 14 7 94 140 333 14 299 95 424 271 +16237 /data/VOCdevkit/VOC2012/JPEGImages/2011_002543.jpg 500 375 8 154 176 253 271 8 51 196 257 374 1 180 147 304 255 +16238 /data/VOCdevkit/VOC2012/JPEGImages/2011_002548.jpg 500 375 2 243 42 343 129 2 457 152 483 229 2 298 182 387 244 2 55 113 120 154 2 25 124 61 152 2 387 306 430 346 +16239 /data/VOCdevkit/VOC2012/JPEGImages/2011_002551.jpg 500 333 8 175 82 355 333 14 188 1 396 264 +16240 /data/VOCdevkit/VOC2012/JPEGImages/2011_002552.jpg 500 332 0 1 1 461 319 +16241 /data/VOCdevkit/VOC2012/JPEGImages/2011_002553.jpg 500 375 16 379 244 457 330 16 192 218 295 347 14 442 219 500 334 14 286 143 345 353 14 199 142 254 259 14 101 188 190 332 14 19 175 62 240 4 44 208 58 245 +16242 /data/VOCdevkit/VOC2012/JPEGImages/2011_002554.jpg 500 375 19 290 139 356 193 19 215 142 279 193 19 142 140 203 190 14 11 57 265 375 17 198 233 500 375 +16243 /data/VOCdevkit/VOC2012/JPEGImages/2011_002555.jpg 500 358 12 51 23 318 357 12 289 7 409 315 14 223 49 359 334 +16244 /data/VOCdevkit/VOC2012/JPEGImages/2011_002556.jpg 500 375 10 233 254 500 375 14 50 121 139 375 14 155 176 244 375 14 405 215 500 340 14 325 232 381 293 14 311 145 371 269 14 266 209 306 260 14 259 186 315 261 14 214 191 249 239 14 97 146 132 203 14 1 179 46 221 +16245 /data/VOCdevkit/VOC2012/JPEGImages/2011_002558.jpg 500 375 3 296 212 358 297 +16246 /data/VOCdevkit/VOC2012/JPEGImages/2011_002559.jpg 500 375 4 32 1 373 375 +16247 /data/VOCdevkit/VOC2012/JPEGImages/2011_002560.jpg 500 375 19 184 54 316 158 4 372 260 432 357 +16248 /data/VOCdevkit/VOC2012/JPEGImages/2011_002561.jpg 500 333 17 1 14 500 333 14 71 40 449 333 14 1 63 323 333 +16249 /data/VOCdevkit/VOC2012/JPEGImages/2011_002566.jpg 500 336 14 10 59 360 336 +16250 /data/VOCdevkit/VOC2012/JPEGImages/2011_002567.jpg 500 375 3 100 158 333 194 14 286 137 313 179 +16251 /data/VOCdevkit/VOC2012/JPEGImages/2011_002568.jpg 500 375 2 117 134 273 231 2 254 140 355 245 +16252 /data/VOCdevkit/VOC2012/JPEGImages/2011_002571.jpg 500 341 16 89 102 311 297 +16253 /data/VOCdevkit/VOC2012/JPEGImages/2011_002575.jpg 500 375 8 16 145 176 341 8 312 111 476 338 14 257 13 428 337 14 40 33 224 345 4 304 109 328 163 +16254 /data/VOCdevkit/VOC2012/JPEGImages/2011_002578.jpg 500 375 2 414 243 489 316 3 432 61 500 131 14 1 68 456 375 14 10 1 391 373 +16255 /data/VOCdevkit/VOC2012/JPEGImages/2011_002579.jpg 500 375 10 247 174 500 256 14 288 26 474 348 14 96 94 365 375 +16256 /data/VOCdevkit/VOC2012/JPEGImages/2011_002582.jpg 500 389 2 1 105 361 388 +16257 /data/VOCdevkit/VOC2012/JPEGImages/2011_002583.jpg 500 332 12 123 110 345 326 +16258 /data/VOCdevkit/VOC2012/JPEGImages/2011_002584.jpg 500 338 9 1 146 239 338 9 185 129 290 336 9 277 131 327 276 +16259 /data/VOCdevkit/VOC2012/JPEGImages/2011_002585.jpg 500 357 1 88 53 193 160 14 110 1 195 149 6 272 8 305 29 +16260 /data/VOCdevkit/VOC2012/JPEGImages/2011_002588.jpg 500 375 3 42 1 500 375 14 265 155 300 227 14 293 163 337 217 14 392 190 424 231 14 442 193 466 223 14 417 205 451 234 14 237 180 259 231 14 205 180 234 229 +16261 /data/VOCdevkit/VOC2012/JPEGImages/2011_002589.jpg 500 404 11 34 18 484 397 +16262 /data/VOCdevkit/VOC2012/JPEGImages/2011_002590.jpg 500 375 4 3 1 74 177 4 1 134 227 280 14 202 2 500 375 +16263 /data/VOCdevkit/VOC2012/JPEGImages/2011_002592.jpg 500 375 6 45 21 473 342 14 441 57 470 83 +16264 /data/VOCdevkit/VOC2012/JPEGImages/2011_002594.jpg 500 333 7 125 77 173 117 8 353 82 500 333 8 342 1 423 86 8 274 1 347 48 17 29 32 414 239 8 221 2 305 42 +16265 /data/VOCdevkit/VOC2012/JPEGImages/2011_002598.jpg 480 320 13 1 142 401 320 13 3 88 266 229 14 231 44 340 316 14 112 73 268 320 14 78 29 212 161 6 1 12 129 161 6 197 8 244 40 6 259 3 309 41 6 138 1 187 35 +16266 /data/VOCdevkit/VOC2012/JPEGImages/2011_002601.jpg 395 500 11 1 169 395 474 +16267 /data/VOCdevkit/VOC2012/JPEGImages/2011_002605.jpg 500 333 0 115 105 285 184 0 359 135 431 159 +16268 /data/VOCdevkit/VOC2012/JPEGImages/2011_002606.jpg 375 500 10 14 119 362 420 14 267 1 369 126 +16269 /data/VOCdevkit/VOC2012/JPEGImages/2011_002609.jpg 500 375 9 165 151 241 206 9 304 140 335 182 9 273 153 298 191 9 246 153 273 194 9 149 164 176 203 +16270 /data/VOCdevkit/VOC2012/JPEGImages/2011_002610.jpg 500 334 4 104 105 123 166 4 272 101 288 164 4 202 100 222 168 19 39 96 105 149 14 328 30 471 214 +16271 /data/VOCdevkit/VOC2012/JPEGImages/2011_002612.jpg 315 440 11 121 203 192 358 11 178 216 248 360 +16272 /data/VOCdevkit/VOC2012/JPEGImages/2011_002614.jpg 500 333 8 186 84 321 268 8 1 69 52 155 8 124 59 233 240 10 3 62 255 255 10 74 255 435 333 14 309 48 500 333 14 1 65 155 333 15 243 1 348 132 +16273 /data/VOCdevkit/VOC2012/JPEGImages/2011_002616.jpg 333 500 2 75 329 104 352 +16274 /data/VOCdevkit/VOC2012/JPEGImages/2011_002617.jpg 500 375 0 71 61 481 320 +16275 /data/VOCdevkit/VOC2012/JPEGImages/2011_002618.jpg 500 375 3 266 186 335 204 +16276 /data/VOCdevkit/VOC2012/JPEGImages/2011_002620.jpg 500 375 8 4 194 105 368 8 172 253 224 350 8 229 213 295 293 19 170 150 206 193 +16277 /data/VOCdevkit/VOC2012/JPEGImages/2011_002623.jpg 333 500 14 117 173 234 465 +16278 /data/VOCdevkit/VOC2012/JPEGImages/2011_002624.jpg 500 375 14 208 144 408 375 14 126 146 285 375 14 87 198 195 375 +16279 /data/VOCdevkit/VOC2012/JPEGImages/2011_002629.jpg 500 375 5 32 40 470 319 6 472 194 500 245 +16280 /data/VOCdevkit/VOC2012/JPEGImages/2011_002631.jpg 500 375 7 171 125 384 286 +16281 /data/VOCdevkit/VOC2012/JPEGImages/2011_002636.jpg 500 333 18 62 107 405 242 +16282 /data/VOCdevkit/VOC2012/JPEGImages/2011_002638.jpg 500 252 0 365 89 492 135 0 242 103 382 152 0 17 158 475 252 +16283 /data/VOCdevkit/VOC2012/JPEGImages/2011_002639.jpg 500 439 14 248 68 454 439 14 58 96 283 439 +16284 /data/VOCdevkit/VOC2012/JPEGImages/2011_002640.jpg 500 333 4 238 165 251 204 8 350 244 431 333 8 46 218 153 333 10 149 198 361 333 8 1 177 62 329 14 347 106 452 286 14 128 124 209 250 14 53 130 221 333 +16285 /data/VOCdevkit/VOC2012/JPEGImages/2011_002641.jpg 350 262 4 108 140 205 171 14 6 75 345 262 14 111 107 299 244 14 148 114 300 193 +16286 /data/VOCdevkit/VOC2012/JPEGImages/2011_002644.jpg 500 375 19 154 150 223 221 17 85 266 470 375 17 457 240 500 375 8 410 198 455 256 8 334 196 368 252 8 365 200 411 258 +16287 /data/VOCdevkit/VOC2012/JPEGImages/2011_002649.jpg 500 375 9 359 150 400 181 9 174 149 236 186 9 294 151 328 184 9 254 154 286 182 9 275 146 309 178 +16288 /data/VOCdevkit/VOC2012/JPEGImages/2011_002650.jpg 500 375 8 81 223 285 375 8 52 146 159 307 10 145 171 355 327 14 341 101 397 304 14 104 101 216 244 +16289 /data/VOCdevkit/VOC2012/JPEGImages/2011_002652.jpg 500 325 2 129 181 280 290 +16290 /data/VOCdevkit/VOC2012/JPEGImages/2011_002656.jpg 448 336 19 43 147 121 222 1 347 162 448 272 1 368 173 448 284 +16291 /data/VOCdevkit/VOC2012/JPEGImages/2011_002657.jpg 500 375 1 74 152 386 339 +16292 /data/VOCdevkit/VOC2012/JPEGImages/2011_002658.jpg 500 387 14 1 36 260 387 14 5 1 500 387 +16293 /data/VOCdevkit/VOC2012/JPEGImages/2011_002661.jpg 375 500 3 1 1 375 499 14 180 371 207 433 14 156 368 178 439 14 89 374 115 434 +16294 /data/VOCdevkit/VOC2012/JPEGImages/2011_002662.jpg 500 332 16 422 257 461 283 16 245 250 290 276 16 68 250 104 276 16 75 263 95 279 16 233 265 250 276 +16295 /data/VOCdevkit/VOC2012/JPEGImages/2011_002664.jpg 500 375 7 49 22 499 375 +16296 /data/VOCdevkit/VOC2012/JPEGImages/2011_002673.jpg 500 331 0 40 85 461 270 +16297 /data/VOCdevkit/VOC2012/JPEGImages/2011_002674.jpg 500 496 2 119 66 408 413 +16298 /data/VOCdevkit/VOC2012/JPEGImages/2011_002675.jpg 500 375 0 45 62 445 343 14 461 137 497 236 14 440 146 459 208 14 11 155 40 213 14 40 163 57 209 +16299 /data/VOCdevkit/VOC2012/JPEGImages/2011_002676.jpg 500 375 6 397 151 482 200 6 421 159 486 198 6 443 171 486 203 +16300 /data/VOCdevkit/VOC2012/JPEGImages/2011_002677.jpg 500 375 3 1 26 500 313 14 148 18 198 149 14 229 59 289 155 14 307 50 371 128 14 350 16 409 142 14 354 1 445 94 +16301 /data/VOCdevkit/VOC2012/JPEGImages/2011_002678.jpg 500 306 14 16 7 66 130 14 74 1 122 140 14 146 8 194 92 14 207 34 289 203 14 274 48 319 192 14 307 18 359 155 14 344 10 426 160 14 425 13 466 170 14 448 1 500 186 +16302 /data/VOCdevkit/VOC2012/JPEGImages/2011_002685.jpg 500 375 7 1 1 499 375 +16303 /data/VOCdevkit/VOC2012/JPEGImages/2011_002687.jpg 441 500 5 108 165 434 484 +16304 /data/VOCdevkit/VOC2012/JPEGImages/2011_002694.jpg 500 375 12 80 133 307 280 14 243 86 301 170 14 1 127 70 375 14 361 137 383 160 14 337 135 365 158 14 51 133 63 172 12 67 149 224 250 +16305 /data/VOCdevkit/VOC2012/JPEGImages/2011_002697.jpg 500 333 12 76 1 311 333 +16306 /data/VOCdevkit/VOC2012/JPEGImages/2011_002699.jpg 500 375 7 13 3 500 263 +16307 /data/VOCdevkit/VOC2012/JPEGImages/2011_002706.jpg 500 375 14 234 90 500 330 +16308 /data/VOCdevkit/VOC2012/JPEGImages/2011_002709.jpg 500 290 14 1 1 500 290 8 14 6 500 290 +16309 /data/VOCdevkit/VOC2012/JPEGImages/2011_002713.jpg 500 375 1 37 34 473 338 +16310 /data/VOCdevkit/VOC2012/JPEGImages/2011_002714.jpg 500 375 8 305 181 364 235 8 382 181 439 231 17 3 152 188 265 10 257 228 500 264 +16311 /data/VOCdevkit/VOC2012/JPEGImages/2011_002715.jpg 500 333 2 201 48 388 246 +16312 /data/VOCdevkit/VOC2012/JPEGImages/2011_002717.jpg 500 334 11 85 45 500 334 +16313 /data/VOCdevkit/VOC2012/JPEGImages/2011_002719.jpg 500 375 9 233 174 355 245 9 157 169 236 258 +16314 /data/VOCdevkit/VOC2012/JPEGImages/2011_002724.jpg 500 375 7 2 1 500 375 +16315 /data/VOCdevkit/VOC2012/JPEGImages/2011_002725.jpg 375 500 6 59 159 290 312 14 320 152 375 322 14 226 161 330 331 14 1 228 29 323 14 282 225 336 324 14 311 225 374 322 +16316 /data/VOCdevkit/VOC2012/JPEGImages/2011_002726.jpg 500 375 19 196 166 258 211 17 89 186 199 309 17 261 185 463 328 +16317 /data/VOCdevkit/VOC2012/JPEGImages/2011_002730.jpg 500 375 12 186 158 301 259 14 219 143 254 222 +16318 /data/VOCdevkit/VOC2012/JPEGImages/2011_002738.jpg 500 375 18 125 103 418 256 +16319 /data/VOCdevkit/VOC2012/JPEGImages/2011_002740.jpg 500 333 3 306 138 380 165 3 341 212 472 248 3 202 107 247 122 3 422 34 469 100 3 67 100 95 117 3 344 85 373 104 3 35 90 60 119 3 183 100 215 116 3 274 206 427 237 3 331 254 438 315 3 192 236 342 280 3 85 234 336 301 3 1 216 158 281 +16320 /data/VOCdevkit/VOC2012/JPEGImages/2011_002742.jpg 500 375 1 115 99 407 342 +16321 /data/VOCdevkit/VOC2012/JPEGImages/2011_002746.jpg 500 321 11 1 47 287 321 11 250 69 350 187 +16322 /data/VOCdevkit/VOC2012/JPEGImages/2011_002748.jpg 375 500 10 108 289 375 500 14 1 97 210 491 14 161 106 268 351 +16323 /data/VOCdevkit/VOC2012/JPEGImages/2011_002750.jpg 500 375 19 262 128 320 184 8 249 196 379 375 +16324 /data/VOCdevkit/VOC2012/JPEGImages/2011_002751.jpg 500 375 0 1 1 499 271 +16325 /data/VOCdevkit/VOC2012/JPEGImages/2011_002752.jpg 500 375 17 24 310 440 375 +16326 /data/VOCdevkit/VOC2012/JPEGImages/2011_002754.jpg 500 266 3 286 28 377 171 +16327 /data/VOCdevkit/VOC2012/JPEGImages/2011_002756.jpg 500 375 8 1 265 129 375 17 107 109 500 375 19 438 72 500 161 +16328 /data/VOCdevkit/VOC2012/JPEGImages/2011_002760.jpg 500 419 13 14 99 486 398 14 150 11 361 397 +16329 /data/VOCdevkit/VOC2012/JPEGImages/2011_002765.jpg 500 500 11 12 177 346 443 14 190 47 500 500 +16330 /data/VOCdevkit/VOC2012/JPEGImages/2011_002766.jpg 500 375 11 195 85 339 211 +16331 /data/VOCdevkit/VOC2012/JPEGImages/2011_002767.jpg 500 375 2 180 111 275 162 +16332 /data/VOCdevkit/VOC2012/JPEGImages/2011_002770.jpg 500 337 14 1 1 481 337 +16333 /data/VOCdevkit/VOC2012/JPEGImages/2011_002772.jpg 500 375 2 120 177 178 234 +16334 /data/VOCdevkit/VOC2012/JPEGImages/2011_002775.jpg 500 375 19 85 126 179 189 17 1 190 97 290 +16335 /data/VOCdevkit/VOC2012/JPEGImages/2011_002776.jpg 500 375 2 154 161 369 373 +16336 /data/VOCdevkit/VOC2012/JPEGImages/2011_002779.jpg 500 347 18 34 103 487 326 +16337 /data/VOCdevkit/VOC2012/JPEGImages/2011_002780.jpg 500 375 5 1 3 500 371 14 316 175 369 224 +16338 /data/VOCdevkit/VOC2012/JPEGImages/2011_002782.jpg 500 375 6 263 215 404 313 +16339 /data/VOCdevkit/VOC2012/JPEGImages/2011_002784.jpg 500 375 17 265 167 500 242 17 182 220 500 375 15 90 183 122 229 +16340 /data/VOCdevkit/VOC2012/JPEGImages/2011_002786.jpg 500 319 13 74 1 383 319 +16341 /data/VOCdevkit/VOC2012/JPEGImages/2011_002790.jpg 500 375 6 76 120 453 276 14 203 80 263 160 +16342 /data/VOCdevkit/VOC2012/JPEGImages/2011_002795.jpg 375 500 14 57 175 219 377 14 107 93 217 256 14 57 184 289 413 +16343 /data/VOCdevkit/VOC2012/JPEGImages/2011_002796.jpg 500 375 6 79 68 167 137 13 31 70 500 375 13 1 110 79 334 13 259 88 328 160 6 202 69 237 92 13 379 86 448 204 13 229 81 272 165 14 152 112 268 375 14 18 44 112 204 14 142 35 215 193 14 433 2 500 258 14 356 53 379 96 14 315 53 352 111 14 288 66 313 122 +16344 /data/VOCdevkit/VOC2012/JPEGImages/2011_002798.jpg 500 333 4 283 187 302 262 4 260 184 279 249 4 242 194 258 259 4 231 197 254 270 8 23 190 152 333 8 294 179 417 333 10 80 229 386 333 14 96 112 222 333 14 289 113 499 332 8 1 245 122 333 +16345 /data/VOCdevkit/VOC2012/JPEGImages/2011_002802.jpg 500 375 19 1 76 136 197 14 280 62 497 375 14 129 24 305 375 14 1 91 170 375 +16346 /data/VOCdevkit/VOC2012/JPEGImages/2011_002803.jpg 500 375 4 239 126 272 193 8 93 219 211 375 8 328 217 443 375 10 153 214 371 374 14 245 118 395 369 14 108 120 295 367 +16347 /data/VOCdevkit/VOC2012/JPEGImages/2011_002805.jpg 375 500 8 176 231 269 336 8 157 252 294 450 8 69 228 154 334 8 27 246 162 443 8 298 240 374 315 10 74 270 251 420 +16348 /data/VOCdevkit/VOC2012/JPEGImages/2011_002808.jpg 500 375 15 325 69 435 361 15 463 82 500 109 8 6 227 50 293 8 1 292 93 375 15 147 199 179 235 8 33 207 71 265 +16349 /data/VOCdevkit/VOC2012/JPEGImages/2011_002810.jpg 500 342 19 28 201 91 259 17 259 225 500 342 15 2 184 35 265 15 162 108 178 144 15 177 107 199 142 15 195 111 216 142 15 228 109 257 128 15 264 107 286 130 15 296 105 325 142 15 323 103 350 140 15 338 162 357 186 15 309 149 340 187 15 296 149 316 186 15 158 149 175 187 15 177 158 192 187 15 203 156 217 185 15 158 190 181 226 15 168 203 181 227 15 201 192 215 225 15 237 139 252 172 15 253 139 270 173 15 268 145 284 172 15 224 178 247 233 15 244 202 264 232 15 259 191 286 223 15 320 193 341 224 15 296 191 318 225 15 308 193 328 227 +16350 /data/VOCdevkit/VOC2012/JPEGImages/2011_002811.jpg 284 442 1 53 152 257 431 14 52 7 214 404 +16351 /data/VOCdevkit/VOC2012/JPEGImages/2011_002812.jpg 400 225 15 187 181 214 215 6 1 159 123 223 15 280 181 311 223 +16352 /data/VOCdevkit/VOC2012/JPEGImages/2011_002814.jpg 500 375 8 193 185 240 263 8 236 172 286 267 8 149 174 202 259 10 168 179 276 263 17 1 261 342 375 4 434 174 446 201 4 382 154 396 194 +16353 /data/VOCdevkit/VOC2012/JPEGImages/2011_002817.jpg 500 375 16 65 19 413 291 +16354 /data/VOCdevkit/VOC2012/JPEGImages/2011_002818.jpg 500 391 8 40 212 81 319 8 90 200 115 226 +16355 /data/VOCdevkit/VOC2012/JPEGImages/2011_002821.jpg 448 336 3 28 142 166 261 18 1 1 448 336 14 23 134 99 294 +16356 /data/VOCdevkit/VOC2012/JPEGImages/2011_002823.jpg 375 500 11 33 38 302 500 +16357 /data/VOCdevkit/VOC2012/JPEGImages/2011_002826.jpg 500 375 5 355 109 404 178 5 435 117 499 162 5 399 145 438 163 5 112 85 362 291 +16358 /data/VOCdevkit/VOC2012/JPEGImages/2011_002830.jpg 500 375 4 184 272 211 318 14 329 45 440 375 14 268 44 348 375 14 192 51 295 375 14 40 51 209 375 14 25 64 152 375 +16359 /data/VOCdevkit/VOC2012/JPEGImages/2011_002831.jpg 500 375 14 264 40 499 373 14 41 95 306 375 +16360 /data/VOCdevkit/VOC2012/JPEGImages/2011_002833.jpg 500 333 11 46 35 409 332 +16361 /data/VOCdevkit/VOC2012/JPEGImages/2011_002834.jpg 352 288 17 1 109 351 252 +16362 /data/VOCdevkit/VOC2012/JPEGImages/2011_002838.jpg 500 375 10 2 251 456 375 14 1 68 218 285 14 279 59 447 290 14 324 65 499 266 14 255 60 296 258 +16363 /data/VOCdevkit/VOC2012/JPEGImages/2011_002841.jpg 500 375 14 432 33 477 94 +16364 /data/VOCdevkit/VOC2012/JPEGImages/2011_002842.jpg 480 360 19 318 81 360 125 14 37 77 237 360 14 321 75 419 360 14 149 63 228 360 8 227 151 285 222 14 324 91 353 116 +16365 /data/VOCdevkit/VOC2012/JPEGImages/2011_002851.jpg 500 375 0 35 123 470 243 0 1 193 51 223 +16366 /data/VOCdevkit/VOC2012/JPEGImages/2011_002852.jpg 500 375 17 321 130 499 346 17 1 261 424 373 17 1 119 177 287 14 149 260 375 375 4 168 243 181 277 +16367 /data/VOCdevkit/VOC2012/JPEGImages/2011_002854.jpg 500 375 3 166 273 236 321 3 84 295 162 321 3 454 288 500 316 +16368 /data/VOCdevkit/VOC2012/JPEGImages/2011_002863.jpg 500 500 4 405 155 494 371 +16369 /data/VOCdevkit/VOC2012/JPEGImages/2011_002864.jpg 500 315 9 1 37 496 315 +16370 /data/VOCdevkit/VOC2012/JPEGImages/2011_002867.jpg 500 375 14 229 184 262 279 16 468 214 491 232 +16371 /data/VOCdevkit/VOC2012/JPEGImages/2011_002868.jpg 500 357 2 119 82 369 239 +16372 /data/VOCdevkit/VOC2012/JPEGImages/2011_002870.jpg 500 375 8 261 6 492 375 +16373 /data/VOCdevkit/VOC2012/JPEGImages/2011_002871.jpg 500 248 3 173 95 464 177 3 44 88 265 156 +16374 /data/VOCdevkit/VOC2012/JPEGImages/2011_002872.jpg 500 375 3 168 53 244 145 3 340 113 392 144 14 132 144 321 375 +16375 /data/VOCdevkit/VOC2012/JPEGImages/2011_002873.jpg 500 375 9 239 245 275 308 9 79 282 123 335 9 323 225 397 318 +16376 /data/VOCdevkit/VOC2012/JPEGImages/2011_002879.jpg 500 375 19 171 125 330 239 +16377 /data/VOCdevkit/VOC2012/JPEGImages/2011_002880.jpg 361 450 10 1 308 361 450 14 1 1 361 342 14 317 28 355 95 +16378 /data/VOCdevkit/VOC2012/JPEGImages/2011_002881.jpg 500 375 10 113 258 500 375 10 73 184 209 227 14 241 1 465 299 14 1 1 329 375 14 102 77 198 194 10 112 212 356 282 +16379 /data/VOCdevkit/VOC2012/JPEGImages/2011_002883.jpg 375 500 7 134 1 374 266 +16380 /data/VOCdevkit/VOC2012/JPEGImages/2011_002884.jpg 500 294 12 201 74 500 294 14 1 38 214 294 +16381 /data/VOCdevkit/VOC2012/JPEGImages/2011_002885.jpg 500 375 9 109 101 397 276 9 1 109 111 269 +16382 /data/VOCdevkit/VOC2012/JPEGImages/2011_002887.jpg 500 375 8 192 43 402 360 8 21 21 167 299 +16383 /data/VOCdevkit/VOC2012/JPEGImages/2011_002889.jpg 500 334 2 320 147 472 252 +16384 /data/VOCdevkit/VOC2012/JPEGImages/2011_002890.jpg 375 500 4 95 108 257 317 4 1 1 121 174 4 65 1 220 197 4 174 1 342 149 4 220 114 375 298 4 12 279 148 500 4 119 271 285 476 4 194 430 315 500 4 308 402 375 500 4 229 255 375 451 +16385 /data/VOCdevkit/VOC2012/JPEGImages/2011_002897.jpg 500 375 4 473 202 500 284 +16386 /data/VOCdevkit/VOC2012/JPEGImages/2011_002900.jpg 375 500 11 96 127 297 500 14 97 2 355 292 +16387 /data/VOCdevkit/VOC2012/JPEGImages/2011_002908.jpg 500 375 11 100 59 380 375 +16388 /data/VOCdevkit/VOC2012/JPEGImages/2011_002911.jpg 500 375 11 238 24 499 375 10 1 103 132 346 4 19 21 79 137 +16389 /data/VOCdevkit/VOC2012/JPEGImages/2011_002912.jpg 500 375 3 327 138 463 201 +16390 /data/VOCdevkit/VOC2012/JPEGImages/2011_002913.jpg 500 333 1 18 1 368 333 +16391 /data/VOCdevkit/VOC2012/JPEGImages/2011_002916.jpg 500 375 7 284 38 500 222 7 1 60 355 318 +16392 /data/VOCdevkit/VOC2012/JPEGImages/2011_002917.jpg 500 333 18 84 39 402 313 18 1 56 157 307 14 406 114 420 145 +16393 /data/VOCdevkit/VOC2012/JPEGImages/2011_002920.jpg 500 374 4 232 187 336 268 14 36 69 333 374 14 286 111 436 336 4 192 19 206 65 4 180 17 192 64 4 165 18 178 64 4 150 16 164 61 4 136 15 148 61 4 122 13 136 62 4 104 11 122 61 4 91 11 106 61 4 76 10 90 58 4 60 11 74 59 4 34 9 52 57 4 18 9 34 56 4 1 11 14 57 4 138 75 148 101 4 123 73 134 120 4 107 71 121 121 4 92 73 106 120 4 76 67 93 121 4 60 65 77 121 4 37 64 52 121 4 20 69 36 121 10 108 304 500 374 4 16 251 38 298 4 1 280 23 314 +16394 /data/VOCdevkit/VOC2012/JPEGImages/2011_002921.jpg 500 354 13 148 85 450 319 14 203 25 380 268 +16395 /data/VOCdevkit/VOC2012/JPEGImages/2011_002924.jpg 375 500 15 19 1 206 110 8 57 87 375 500 10 1 2 375 344 +16396 /data/VOCdevkit/VOC2012/JPEGImages/2011_002925.jpg 375 500 5 87 242 227 341 6 271 277 317 299 6 302 356 375 467 +16397 /data/VOCdevkit/VOC2012/JPEGImages/2011_002927.jpg 479 357 4 342 192 355 223 8 234 233 340 356 8 211 221 276 357 8 108 200 159 238 10 73 227 355 357 8 89 255 200 357 8 69 237 93 357 15 8 51 90 99 +16398 /data/VOCdevkit/VOC2012/JPEGImages/2011_002929.jpg 500 333 0 6 129 433 233 +16399 /data/VOCdevkit/VOC2012/JPEGImages/2011_002930.jpg 500 332 0 34 15 488 195 +16400 /data/VOCdevkit/VOC2012/JPEGImages/2011_002932.jpg 500 337 18 168 4 447 275 5 17 117 122 220 +16401 /data/VOCdevkit/VOC2012/JPEGImages/2011_002933.jpg 375 500 8 201 221 241 318 8 235 228 252 324 8 195 213 236 295 8 1 251 91 304 8 138 275 189 392 8 106 349 191 500 10 1 302 154 500 +16402 /data/VOCdevkit/VOC2012/JPEGImages/2011_002935.jpg 500 375 14 84 48 393 375 +16403 /data/VOCdevkit/VOC2012/JPEGImages/2011_002937.jpg 375 500 9 187 199 260 300 9 101 159 183 301 +16404 /data/VOCdevkit/VOC2012/JPEGImages/2011_002938.jpg 500 378 11 334 1 499 273 11 1 29 448 330 +16405 /data/VOCdevkit/VOC2012/JPEGImages/2011_002940.jpg 500 375 4 216 208 244 299 4 243 170 260 232 10 107 198 386 375 14 372 113 500 375 14 332 92 453 353 14 81 120 199 267 14 2 116 149 375 4 222 171 239 229 +16406 /data/VOCdevkit/VOC2012/JPEGImages/2011_002942.jpg 500 375 19 112 41 397 310 +16407 /data/VOCdevkit/VOC2012/JPEGImages/2011_002943.jpg 500 375 3 103 110 393 220 +16408 /data/VOCdevkit/VOC2012/JPEGImages/2011_002944.jpg 500 375 5 232 1 499 375 14 59 102 96 212 +16409 /data/VOCdevkit/VOC2012/JPEGImages/2011_002947.jpg 500 375 14 158 50 423 347 +16410 /data/VOCdevkit/VOC2012/JPEGImages/2011_002949.jpg 500 375 13 164 314 427 375 13 334 276 497 359 13 1 282 150 374 14 35 232 87 358 14 14 232 49 353 14 178 231 281 343 14 227 237 291 375 14 251 236 358 375 14 353 234 409 340 14 385 223 450 347 +16411 /data/VOCdevkit/VOC2012/JPEGImages/2011_002951.jpg 500 375 12 56 1 224 167 +16412 /data/VOCdevkit/VOC2012/JPEGImages/2011_002953.jpg 500 375 8 14 137 130 268 17 86 156 359 374 +16413 /data/VOCdevkit/VOC2012/JPEGImages/2011_002956.jpg 500 375 5 69 82 399 343 5 1 221 32 276 6 366 232 500 365 6 1 263 22 311 14 282 226 309 259 +16414 /data/VOCdevkit/VOC2012/JPEGImages/2011_002958.jpg 500 333 1 43 87 133 279 14 379 1 475 265 14 228 43 375 333 14 112 39 230 319 +16415 /data/VOCdevkit/VOC2012/JPEGImages/2011_002962.jpg 500 375 12 31 131 299 309 12 230 111 432 291 14 461 163 494 267 6 422 152 500 238 +16416 /data/VOCdevkit/VOC2012/JPEGImages/2011_002965.jpg 500 375 17 14 15 474 355 8 139 1 234 57 +16417 /data/VOCdevkit/VOC2012/JPEGImages/2011_002966.jpg 500 375 4 367 265 422 375 4 337 210 374 350 4 239 193 260 261 19 32 1 208 94 14 1 90 176 375 14 67 101 233 375 14 171 83 295 257 14 234 115 406 289 14 353 121 420 212 14 397 132 500 336 10 177 246 500 375 +16418 /data/VOCdevkit/VOC2012/JPEGImages/2011_002967.jpg 500 375 4 207 104 470 187 14 32 13 500 375 14 104 298 340 375 +16419 /data/VOCdevkit/VOC2012/JPEGImages/2011_002969.jpg 500 349 14 275 56 427 349 +16420 /data/VOCdevkit/VOC2012/JPEGImages/2011_002970.jpg 500 375 19 63 15 376 347 +16421 /data/VOCdevkit/VOC2012/JPEGImages/2011_002971.jpg 500 375 8 88 160 250 335 14 144 159 220 358 14 233 128 351 309 14 323 86 394 301 14 324 1 453 211 14 321 141 499 373 +16422 /data/VOCdevkit/VOC2012/JPEGImages/2011_002974.jpg 333 500 4 47 14 149 366 10 1 240 332 500 14 1 1 85 161 14 226 1 333 191 14 123 2 218 96 +16423 /data/VOCdevkit/VOC2012/JPEGImages/2011_002975.jpg 500 375 3 125 237 279 346 3 274 289 324 310 3 1 206 43 310 3 29 117 352 245 3 412 283 464 304 3 112 259 173 306 3 263 228 311 278 3 317 254 365 275 3 301 234 356 257 3 364 279 418 300 3 462 278 500 296 +16424 /data/VOCdevkit/VOC2012/JPEGImages/2011_002978.jpg 500 375 6 2 185 104 236 6 19 196 103 237 14 400 153 427 270 15 328 153 420 294 14 268 90 344 333 14 168 121 227 304 14 207 106 285 335 14 149 174 190 241 15 56 207 110 265 14 101 179 147 275 14 63 164 92 216 14 38 160 64 236 +16425 /data/VOCdevkit/VOC2012/JPEGImages/2011_002979.jpg 500 375 9 217 171 267 191 +16426 /data/VOCdevkit/VOC2012/JPEGImages/2011_002983.jpg 500 375 12 232 203 270 266 14 232 172 282 244 11 151 283 181 339 +16427 /data/VOCdevkit/VOC2012/JPEGImages/2011_002985.jpg 500 377 10 1 156 500 377 14 42 33 108 104 14 20 1 331 185 14 150 5 490 373 +16428 /data/VOCdevkit/VOC2012/JPEGImages/2011_002987.jpg 375 500 18 95 39 324 326 14 191 219 236 294 +16429 /data/VOCdevkit/VOC2012/JPEGImages/2011_002988.jpg 500 375 13 1 57 500 375 +16430 /data/VOCdevkit/VOC2012/JPEGImages/2011_002992.jpg 500 335 0 1 15 472 335 +16431 /data/VOCdevkit/VOC2012/JPEGImages/2011_002993.jpg 500 352 0 55 189 112 234 +16432 /data/VOCdevkit/VOC2012/JPEGImages/2011_002994.jpg 500 333 8 297 193 365 309 10 162 207 352 304 8 125 183 159 263 8 148 193 207 304 8 192 205 256 314 8 252 204 314 317 8 215 189 259 207 8 260 189 304 206 +16433 /data/VOCdevkit/VOC2012/JPEGImages/2011_002997.jpg 500 375 14 166 108 339 375 +16434 /data/VOCdevkit/VOC2012/JPEGImages/2011_002999.jpg 430 500 12 5 141 193 414 14 119 165 189 474 14 212 150 325 474 14 193 155 223 244 14 232 162 261 237 +16435 /data/VOCdevkit/VOC2012/JPEGImages/2011_003002.jpg 500 333 15 99 58 206 147 +16436 /data/VOCdevkit/VOC2012/JPEGImages/2011_003003.jpg 500 375 1 39 116 421 353 +16437 /data/VOCdevkit/VOC2012/JPEGImages/2011_003005.jpg 500 375 8 30 1 312 340 +16438 /data/VOCdevkit/VOC2012/JPEGImages/2011_003010.jpg 500 375 11 175 159 442 325 4 110 65 148 155 4 76 174 154 316 4 139 185 183 295 14 183 16 500 354 +16439 /data/VOCdevkit/VOC2012/JPEGImages/2011_003011.jpg 333 500 8 76 17 281 456 +16440 /data/VOCdevkit/VOC2012/JPEGImages/2011_003012.jpg 500 375 0 351 34 414 68 0 289 41 350 66 0 110 16 500 375 +16441 /data/VOCdevkit/VOC2012/JPEGImages/2011_003013.jpg 500 333 13 96 101 374 284 14 144 49 284 259 +16442 /data/VOCdevkit/VOC2012/JPEGImages/2011_003016.jpg 500 375 9 179 124 395 276 6 29 63 440 230 14 266 84 318 118 14 61 100 82 130 +16443 /data/VOCdevkit/VOC2012/JPEGImages/2011_003019.jpg 500 375 9 145 129 347 286 6 116 1 341 61 13 189 229 386 375 13 87 342 193 375 14 386 111 461 277 +16444 /data/VOCdevkit/VOC2012/JPEGImages/2011_003020.jpg 500 332 3 242 201 334 329 14 305 285 321 322 +16445 /data/VOCdevkit/VOC2012/JPEGImages/2011_003023.jpg 500 375 16 149 166 244 243 16 227 149 302 234 +16446 /data/VOCdevkit/VOC2012/JPEGImages/2011_003025.jpg 500 375 3 145 265 272 375 3 1 317 98 375 3 286 276 395 375 3 141 265 163 285 +16447 /data/VOCdevkit/VOC2012/JPEGImages/2011_003027.jpg 500 375 13 1 10 500 374 +16448 /data/VOCdevkit/VOC2012/JPEGImages/2011_003028.jpg 500 391 18 76 140 384 360 18 330 142 500 354 +16449 /data/VOCdevkit/VOC2012/JPEGImages/2011_003029.jpg 500 375 6 19 50 500 375 +16450 /data/VOCdevkit/VOC2012/JPEGImages/2011_003030.jpg 500 333 2 1 67 500 333 +16451 /data/VOCdevkit/VOC2012/JPEGImages/2011_003034.jpg 500 356 0 1 71 500 292 +16452 /data/VOCdevkit/VOC2012/JPEGImages/2011_003038.jpg 500 375 15 229 2 363 94 4 188 187 208 223 14 89 143 159 226 14 1 115 136 233 14 134 87 368 375 +16453 /data/VOCdevkit/VOC2012/JPEGImages/2011_003039.jpg 500 375 17 101 138 390 286 14 385 53 411 79 +16454 /data/VOCdevkit/VOC2012/JPEGImages/2011_003041.jpg 500 375 3 189 130 324 213 3 313 145 341 167 +16455 /data/VOCdevkit/VOC2012/JPEGImages/2011_003043.jpg 500 351 9 163 16 500 351 9 7 60 209 350 9 378 63 500 305 9 149 47 216 72 +16456 /data/VOCdevkit/VOC2012/JPEGImages/2011_003044.jpg 500 375 8 1 111 116 298 8 128 88 161 160 17 174 93 457 289 4 135 94 147 124 14 246 146 333 290 +16457 /data/VOCdevkit/VOC2012/JPEGImages/2011_003047.jpg 500 375 15 70 168 169 363 15 274 17 362 74 8 1 289 108 351 19 208 202 300 293 +16458 /data/VOCdevkit/VOC2012/JPEGImages/2011_003048.jpg 500 375 14 24 116 123 375 14 109 125 192 375 14 175 154 253 375 14 244 133 327 375 14 307 150 359 375 14 327 142 409 375 14 382 132 458 375 +16459 /data/VOCdevkit/VOC2012/JPEGImages/2011_003049.jpg 480 320 8 111 148 186 304 10 2 172 247 320 8 160 162 262 320 8 12 180 146 320 8 1 154 30 193 17 134 152 358 270 +16460 /data/VOCdevkit/VOC2012/JPEGImages/2011_003050.jpg 500 238 10 1 178 499 238 14 248 1 500 187 4 212 138 230 180 4 201 143 216 181 +16461 /data/VOCdevkit/VOC2012/JPEGImages/2011_003054.jpg 500 375 1 462 257 500 314 14 311 244 335 312 14 340 244 364 310 14 354 245 375 305 14 407 242 431 296 +16462 /data/VOCdevkit/VOC2012/JPEGImages/2011_003055.jpg 500 375 6 41 54 493 371 +16463 /data/VOCdevkit/VOC2012/JPEGImages/2011_003057.jpg 500 355 13 4 16 500 355 +16464 /data/VOCdevkit/VOC2012/JPEGImages/2011_003059.jpg 500 375 18 89 18 346 341 +16465 /data/VOCdevkit/VOC2012/JPEGImages/2011_003063.jpg 500 375 13 73 16 499 352 1 1 1 149 181 +16466 /data/VOCdevkit/VOC2012/JPEGImages/2011_003065.jpg 500 375 5 207 188 241 216 6 88 206 117 224 6 271 209 376 244 +16467 /data/VOCdevkit/VOC2012/JPEGImages/2011_003066.jpg 500 375 4 218 255 263 348 8 286 75 328 128 8 316 82 394 182 8 316 92 387 201 8 89 196 142 261 8 160 170 193 238 14 38 34 153 180 14 163 28 232 96 14 130 44 232 208 10 70 86 183 206 10 350 77 493 165 14 306 32 369 163 14 1 133 164 375 14 178 65 318 237 14 374 65 500 244 10 100 212 500 375 +16468 /data/VOCdevkit/VOC2012/JPEGImages/2011_003073.jpg 500 500 6 406 251 473 333 +16469 /data/VOCdevkit/VOC2012/JPEGImages/2011_003074.jpg 500 375 8 2 23 292 375 8 390 42 500 375 8 3 32 183 375 8 190 31 393 375 +16470 /data/VOCdevkit/VOC2012/JPEGImages/2011_003076.jpg 500 375 15 71 161 126 224 8 39 212 125 351 10 34 208 192 344 8 131 189 183 308 +16471 /data/VOCdevkit/VOC2012/JPEGImages/2011_003078.jpg 500 367 13 197 98 456 367 13 21 131 214 367 14 239 80 335 267 +16472 /data/VOCdevkit/VOC2012/JPEGImages/2011_003079.jpg 329 500 8 82 281 231 488 14 135 158 278 454 19 220 182 298 260 +16473 /data/VOCdevkit/VOC2012/JPEGImages/2011_003081.jpg 500 333 3 287 113 455 220 14 331 138 355 179 14 245 149 276 203 +16474 /data/VOCdevkit/VOC2012/JPEGImages/2011_003085.jpg 500 375 12 147 164 215 258 12 196 175 246 260 12 223 178 271 255 12 259 173 310 254 12 303 173 343 245 14 346 180 384 246 +16475 /data/VOCdevkit/VOC2012/JPEGImages/2011_003086.jpg 350 500 5 124 237 305 426 14 214 283 241 336 +16476 /data/VOCdevkit/VOC2012/JPEGImages/2011_003089.jpg 400 500 5 16 38 372 455 14 220 215 282 293 14 169 212 243 360 14 85 28 144 76 +16477 /data/VOCdevkit/VOC2012/JPEGImages/2011_003091.jpg 500 333 2 187 12 373 329 +16478 /data/VOCdevkit/VOC2012/JPEGImages/2011_003097.jpg 270 360 8 1 111 236 330 +16479 /data/VOCdevkit/VOC2012/JPEGImages/2011_003098.jpg 500 407 11 1 8 418 406 +16480 /data/VOCdevkit/VOC2012/JPEGImages/2011_003103.jpg 500 375 15 79 15 184 226 8 126 145 239 312 8 286 145 335 247 +16481 /data/VOCdevkit/VOC2012/JPEGImages/2011_003109.jpg 500 375 5 135 90 405 302 14 168 179 223 216 14 366 182 405 306 14 483 202 496 247 6 75 199 136 239 6 1 210 18 243 +16482 /data/VOCdevkit/VOC2012/JPEGImages/2011_003111.jpg 500 333 0 1 105 500 333 +16483 /data/VOCdevkit/VOC2012/JPEGImages/2011_003114.jpg 500 333 5 121 63 378 316 14 401 149 435 264 14 451 154 483 264 14 474 125 500 300 14 425 164 451 260 14 388 164 413 252 14 366 159 386 248 14 326 128 350 152 6 373 172 402 234 +16484 /data/VOCdevkit/VOC2012/JPEGImages/2011_003115.jpg 500 375 3 102 221 393 256 14 290 191 332 244 14 143 193 187 243 +16485 /data/VOCdevkit/VOC2012/JPEGImages/2011_003121.jpg 500 375 6 466 212 500 281 6 97 145 475 334 +16486 /data/VOCdevkit/VOC2012/JPEGImages/2011_003124.jpg 500 333 18 80 116 361 216 +16487 /data/VOCdevkit/VOC2012/JPEGImages/2011_003132.jpg 375 500 18 147 187 227 287 6 36 248 70 276 14 112 247 133 295 14 87 246 104 290 +16488 /data/VOCdevkit/VOC2012/JPEGImages/2011_003134.jpg 500 333 3 160 162 238 183 +16489 /data/VOCdevkit/VOC2012/JPEGImages/2011_003138.jpg 500 375 14 227 150 348 305 14 104 127 256 328 +16490 /data/VOCdevkit/VOC2012/JPEGImages/2011_003141.jpg 322 500 14 61 34 236 500 +16491 /data/VOCdevkit/VOC2012/JPEGImages/2011_003145.jpg 500 375 2 105 187 293 313 +16492 /data/VOCdevkit/VOC2012/JPEGImages/2011_003146.jpg 500 375 18 28 44 461 361 +16493 /data/VOCdevkit/VOC2012/JPEGImages/2011_003148.jpg 500 375 1 112 16 403 343 +16494 /data/VOCdevkit/VOC2012/JPEGImages/2011_003149.jpg 500 339 18 75 102 442 245 +16495 /data/VOCdevkit/VOC2012/JPEGImages/2011_003150.jpg 500 375 8 321 184 500 368 +16496 /data/VOCdevkit/VOC2012/JPEGImages/2011_003151.jpg 500 330 11 141 1 355 271 +16497 /data/VOCdevkit/VOC2012/JPEGImages/2011_003152.jpg 500 334 4 168 271 186 324 4 76 243 96 276 4 5 265 31 334 10 1 290 217 334 14 223 88 389 334 +16498 /data/VOCdevkit/VOC2012/JPEGImages/2011_003154.jpg 500 375 0 27 123 468 281 +16499 /data/VOCdevkit/VOC2012/JPEGImages/2011_003158.jpg 500 317 10 1 61 489 315 4 200 64 235 145 +16500 /data/VOCdevkit/VOC2012/JPEGImages/2011_003159.jpg 500 375 7 156 105 485 300 +16501 /data/VOCdevkit/VOC2012/JPEGImages/2011_003162.jpg 500 373 15 330 1 500 340 14 15 87 265 373 14 232 92 480 373 +16502 /data/VOCdevkit/VOC2012/JPEGImages/2011_003163.jpg 500 196 2 203 33 495 169 +16503 /data/VOCdevkit/VOC2012/JPEGImages/2011_003166.jpg 500 375 10 3 109 498 375 4 190 53 214 114 7 138 145 388 334 8 317 1 500 162 +16504 /data/VOCdevkit/VOC2012/JPEGImages/2011_003167.jpg 375 500 1 235 293 337 362 14 1 96 180 480 14 159 130 238 443 +16505 /data/VOCdevkit/VOC2012/JPEGImages/2011_003168.jpg 500 375 1 277 230 499 375 1 29 236 160 375 14 37 82 204 375 14 300 25 497 375 4 365 48 416 80 +16506 /data/VOCdevkit/VOC2012/JPEGImages/2011_003169.jpg 500 333 1 28 24 451 333 +16507 /data/VOCdevkit/VOC2012/JPEGImages/2011_003171.jpg 500 333 2 137 76 360 220 +16508 /data/VOCdevkit/VOC2012/JPEGImages/2011_003176.jpg 500 332 0 31 78 472 231 6 285 214 307 229 +16509 /data/VOCdevkit/VOC2012/JPEGImages/2011_003177.jpg 500 343 0 2 31 459 237 0 399 54 500 110 +16510 /data/VOCdevkit/VOC2012/JPEGImages/2011_003182.jpg 500 375 17 1 22 500 375 +16511 /data/VOCdevkit/VOC2012/JPEGImages/2011_003183.jpg 500 375 10 176 197 374 330 8 169 203 248 329 8 260 208 332 328 8 218 188 283 301 8 286 191 349 301 +16512 /data/VOCdevkit/VOC2012/JPEGImages/2011_003184.jpg 500 375 12 152 1 499 375 +16513 /data/VOCdevkit/VOC2012/JPEGImages/2011_003185.jpg 500 375 6 1 65 500 367 14 50 1 438 333 +16514 /data/VOCdevkit/VOC2012/JPEGImages/2011_003187.jpg 500 375 18 1 51 381 228 +16515 /data/VOCdevkit/VOC2012/JPEGImages/2011_003188.jpg 500 375 17 4 1 499 163 14 196 125 423 375 +16516 /data/VOCdevkit/VOC2012/JPEGImages/2011_003192.jpg 500 375 6 74 50 423 305 6 65 19 233 111 +16517 /data/VOCdevkit/VOC2012/JPEGImages/2011_003194.jpg 500 327 8 64 176 404 327 19 138 44 267 171 19 1 47 150 203 +16518 /data/VOCdevkit/VOC2012/JPEGImages/2011_003197.jpg 400 500 18 10 9 387 489 +16519 /data/VOCdevkit/VOC2012/JPEGImages/2011_003201.jpg 500 333 8 186 168 286 271 17 278 145 495 243 8 240 153 310 258 8 15 215 78 314 +16520 /data/VOCdevkit/VOC2012/JPEGImages/2011_003205.jpg 500 329 15 86 233 97 246 15 97 246 120 265 15 251 260 282 268 15 457 237 489 257 15 439 250 451 262 15 423 249 438 263 +16521 /data/VOCdevkit/VOC2012/JPEGImages/2011_003207.jpg 500 333 11 1 41 273 297 11 157 110 468 333 +16522 /data/VOCdevkit/VOC2012/JPEGImages/2011_003211.jpg 500 375 7 52 46 500 370 +16523 /data/VOCdevkit/VOC2012/JPEGImages/2011_003212.jpg 500 375 17 54 238 306 375 +16524 /data/VOCdevkit/VOC2012/JPEGImages/2011_003213.jpg 500 333 2 260 47 416 333 +16525 /data/VOCdevkit/VOC2012/JPEGImages/2011_003216.jpg 400 300 7 164 1 400 300 +16526 /data/VOCdevkit/VOC2012/JPEGImages/2011_003220.jpg 500 375 14 120 166 266 374 14 60 90 336 373 +16527 /data/VOCdevkit/VOC2012/JPEGImages/2011_003223.jpg 500 375 16 149 133 349 272 +16528 /data/VOCdevkit/VOC2012/JPEGImages/2011_003228.jpg 500 375 18 1 1 500 345 +16529 /data/VOCdevkit/VOC2012/JPEGImages/2011_003230.jpg 375 500 4 202 60 250 85 4 127 111 176 133 14 27 88 175 463 14 170 44 331 438 +16530 /data/VOCdevkit/VOC2012/JPEGImages/2011_003232.jpg 500 375 3 1 1 367 375 +16531 /data/VOCdevkit/VOC2012/JPEGImages/2011_003236.jpg 500 375 11 214 128 365 318 14 1 42 411 375 8 281 1 500 246 +16532 /data/VOCdevkit/VOC2012/JPEGImages/2011_003238.jpg 500 375 14 167 115 259 375 14 180 106 323 375 +16533 /data/VOCdevkit/VOC2012/JPEGImages/2011_003240.jpg 350 500 4 255 124 328 162 14 15 9 270 500 +16534 /data/VOCdevkit/VOC2012/JPEGImages/2011_003242.jpg 500 375 8 324 198 352 266 8 297 177 320 223 8 100 208 133 273 8 125 181 152 238 10 72 176 393 375 10 174 132 268 179 10 369 127 500 200 14 1 127 101 375 14 351 124 500 363 +16535 /data/VOCdevkit/VOC2012/JPEGImages/2011_003244.jpg 500 426 12 48 53 382 360 +16536 /data/VOCdevkit/VOC2012/JPEGImages/2011_003246.jpg 500 375 19 46 113 128 182 14 320 138 444 233 +16537 /data/VOCdevkit/VOC2012/JPEGImages/2011_003247.jpg 500 331 5 32 132 323 222 6 476 184 495 201 +16538 /data/VOCdevkit/VOC2012/JPEGImages/2011_003253.jpg 375 500 12 245 201 375 434 12 1 23 274 500 +16539 /data/VOCdevkit/VOC2012/JPEGImages/2011_003254.jpg 375 500 19 147 199 281 309 4 130 259 148 305 +16540 /data/VOCdevkit/VOC2012/JPEGImages/2011_003255.jpg 500 375 14 1 50 284 375 14 282 1 500 375 +16541 /data/VOCdevkit/VOC2012/JPEGImages/2011_003256.jpg 500 375 11 246 130 398 218 11 5 124 287 265 17 5 75 414 307 +16542 /data/VOCdevkit/VOC2012/JPEGImages/2011_003259.jpg 500 375 14 51 173 352 375 8 109 65 332 277 +16543 /data/VOCdevkit/VOC2012/JPEGImages/2011_003260.jpg 500 375 18 1 140 349 314 18 1 165 67 208 14 310 182 330 226 14 328 182 343 228 14 336 192 367 266 14 458 190 487 274 +16544 /data/VOCdevkit/VOC2012/JPEGImages/2011_003261.jpg 375 500 1 132 245 186 332 14 130 210 186 292 +16545 /data/VOCdevkit/VOC2012/JPEGImages/2011_003262.jpg 500 359 4 283 106 307 194 4 223 97 248 173 4 215 154 253 272 10 80 116 386 359 14 2 45 190 359 14 98 49 219 222 14 116 24 226 192 14 178 31 266 139 14 341 39 397 153 14 364 54 430 172 14 336 71 448 221 14 285 77 500 359 +16546 /data/VOCdevkit/VOC2012/JPEGImages/2011_003269.jpg 334 500 6 19 347 309 461 +16547 /data/VOCdevkit/VOC2012/JPEGImages/2011_003271.jpg 500 500 4 98 1 499 405 +16548 /data/VOCdevkit/VOC2012/JPEGImages/2011_003274.jpg 500 375 18 1 113 384 215 +16549 /data/VOCdevkit/VOC2012/JPEGImages/2011_003275.jpg 500 403 0 42 50 448 282 +16550 /data/VOCdevkit/VOC2012/JPEGImages/2011_003276.jpg 500 400 2 264 142 292 217 diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/val.txt b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/val.txt new file mode 100644 index 0000000..16a9eae --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/val.txt @@ -0,0 +1,4952 @@ +0 /data/VOCdevkit/VOC2007/JPEGImages/000001.jpg 353 500 11 48 240 195 371 14 8 12 352 498 +1 /data/VOCdevkit/VOC2007/JPEGImages/000002.jpg 335 500 18 139 200 207 301 +2 /data/VOCdevkit/VOC2007/JPEGImages/000003.jpg 500 375 17 123 155 215 195 8 239 156 307 205 +3 /data/VOCdevkit/VOC2007/JPEGImages/000004.jpg 500 406 6 13 311 84 362 6 362 330 500 389 6 235 328 334 375 6 175 327 252 364 6 139 320 189 359 6 108 325 150 353 6 84 323 121 350 +4 /data/VOCdevkit/VOC2007/JPEGImages/000006.jpg 500 375 15 187 135 282 242 10 154 209 369 375 8 255 207 366 375 8 138 211 249 375 +5 /data/VOCdevkit/VOC2007/JPEGImages/000008.jpg 500 375 8 192 16 364 249 +6 /data/VOCdevkit/VOC2007/JPEGImages/000010.jpg 354 480 12 87 97 258 427 14 133 72 245 284 +7 /data/VOCdevkit/VOC2007/JPEGImages/000011.jpg 500 324 7 126 51 330 308 +8 /data/VOCdevkit/VOC2007/JPEGImages/000013.jpg 500 375 9 299 160 446 252 +9 /data/VOCdevkit/VOC2007/JPEGImages/000014.jpg 500 333 5 72 163 302 228 6 185 194 500 316 6 416 180 500 222 14 314 8 344 65 14 331 4 361 61 14 357 8 401 61 +10 /data/VOCdevkit/VOC2007/JPEGImages/000015.jpg 500 375 1 77 136 360 358 +11 /data/VOCdevkit/VOC2007/JPEGImages/000018.jpg 380 285 11 31 30 358 279 +12 /data/VOCdevkit/VOC2007/JPEGImages/000022.jpg 500 332 12 68 103 368 283 14 186 44 255 230 +13 /data/VOCdevkit/VOC2007/JPEGImages/000025.jpg 500 375 9 2 84 59 248 9 68 115 233 279 9 64 173 377 373 14 320 2 496 375 14 221 4 341 374 14 135 14 220 148 9 69 43 156 177 14 58 54 104 139 14 279 1 331 86 14 320 22 344 96 +14 /data/VOCdevkit/VOC2007/JPEGImages/000027.jpg 486 500 14 174 101 349 351 +15 /data/VOCdevkit/VOC2007/JPEGImages/000028.jpg 375 500 7 63 18 374 500 +16 /data/VOCdevkit/VOC2007/JPEGImages/000029.jpg 500 331 11 56 63 284 290 +17 /data/VOCdevkit/VOC2007/JPEGImages/000031.jpg 500 335 18 41 77 430 255 +18 /data/VOCdevkit/VOC2007/JPEGImages/000037.jpg 500 375 11 61 96 464 339 +19 /data/VOCdevkit/VOC2007/JPEGImages/000038.jpg 500 375 1 159 178 279 246 13 1 235 43 315 14 192 111 261 240 +20 /data/VOCdevkit/VOC2007/JPEGImages/000040.jpg 500 332 2 1 52 384 290 +21 /data/VOCdevkit/VOC2007/JPEGImages/000043.jpg 333 500 14 174 229 324 375 14 5 145 250 500 14 19 6 323 500 +22 /data/VOCdevkit/VOC2007/JPEGImages/000045.jpg 500 375 19 280 64 483 252 +23 /data/VOCdevkit/VOC2007/JPEGImages/000049.jpg 500 356 7 178 131 356 227 +24 /data/VOCdevkit/VOC2007/JPEGImages/000053.jpg 500 375 7 36 12 425 262 +25 /data/VOCdevkit/VOC2007/JPEGImages/000054.jpg 500 375 5 24 54 472 292 +26 /data/VOCdevkit/VOC2007/JPEGImages/000055.jpg 500 333 13 209 132 275 222 14 219 107 273 187 14 436 279 456 327 +27 /data/VOCdevkit/VOC2007/JPEGImages/000056.jpg 500 334 12 165 60 387 334 +28 /data/VOCdevkit/VOC2007/JPEGImages/000057.jpg 500 375 2 133 53 385 358 +29 /data/VOCdevkit/VOC2007/JPEGImages/000058.jpg 500 375 14 334 1 436 373 14 196 80 309 326 14 279 53 334 267 13 29 109 359 375 +30 /data/VOCdevkit/VOC2007/JPEGImages/000059.jpg 375 500 19 88 161 142 206 19 177 135 273 200 14 110 210 328 500 14 72 272 115 356 14 125 274 171 353 +31 /data/VOCdevkit/VOC2007/JPEGImages/000062.jpg 500 333 16 58 188 271 310 +32 /data/VOCdevkit/VOC2007/JPEGImages/000067.jpg 500 272 0 44 72 450 210 +33 /data/VOCdevkit/VOC2007/JPEGImages/000068.jpg 500 375 2 27 45 266 375 +34 /data/VOCdevkit/VOC2007/JPEGImages/000069.jpg 500 375 3 19 64 424 190 14 305 155 390 375 +35 /data/VOCdevkit/VOC2007/JPEGImages/000070.jpg 500 375 15 358 163 378 197 +36 /data/VOCdevkit/VOC2007/JPEGImages/000071.jpg 500 375 6 61 75 443 274 +37 /data/VOCdevkit/VOC2007/JPEGImages/000074.jpg 500 375 6 58 61 475 283 +38 /data/VOCdevkit/VOC2007/JPEGImages/000075.jpg 332 500 11 102 83 222 348 +39 /data/VOCdevkit/VOC2007/JPEGImages/000076.jpg 500 375 14 63 78 265 375 14 257 75 448 375 14 362 130 446 261 14 472 157 500 343 14 457 209 478 255 14 439 170 458 216 14 247 142 288 197 14 44 162 84 286 14 77 157 120 245 14 1 159 26 283 14 24 174 45 201 +40 /data/VOCdevkit/VOC2007/JPEGImages/000079.jpg 500 357 11 1 53 390 357 +41 /data/VOCdevkit/VOC2007/JPEGImages/000080.jpg 500 375 3 246 202 269 282 3 70 243 111 274 +42 /data/VOCdevkit/VOC2007/JPEGImages/000082.jpg 500 333 6 22 93 493 298 6 1 1 207 88 +43 /data/VOCdevkit/VOC2007/JPEGImages/000084.jpg 500 375 8 339 156 390 235 8 291 171 346 273 8 142 174 193 276 8 232 192 291 303 10 156 182 332 281 +44 /data/VOCdevkit/VOC2007/JPEGImages/000085.jpg 500 330 14 22 70 254 327 14 338 12 500 199 +45 /data/VOCdevkit/VOC2007/JPEGImages/000086.jpg 500 333 11 308 131 356 173 +46 /data/VOCdevkit/VOC2007/JPEGImages/000087.jpg 333 500 18 120 166 318 204 +47 /data/VOCdevkit/VOC2007/JPEGImages/000088.jpg 500 375 18 123 7 500 365 +48 /data/VOCdevkit/VOC2007/JPEGImages/000090.jpg 500 333 8 193 65 346 278 14 33 33 307 255 +49 /data/VOCdevkit/VOC2007/JPEGImages/000092.jpg 500 375 7 2 66 413 333 +50 /data/VOCdevkit/VOC2007/JPEGImages/000094.jpg 500 333 13 16 1 500 333 +51 /data/VOCdevkit/VOC2007/JPEGImages/000096.jpg 330 500 14 2 144 176 500 14 140 109 330 500 +52 /data/VOCdevkit/VOC2007/JPEGImages/000097.jpg 500 375 17 58 174 270 285 8 1 220 156 375 14 208 139 267 235 +53 /data/VOCdevkit/VOC2007/JPEGImages/000098.jpg 360 270 7 69 70 317 162 +54 /data/VOCdevkit/VOC2007/JPEGImages/000100.jpg 432 256 18 3 47 432 222 +55 /data/VOCdevkit/VOC2007/JPEGImages/000103.jpg 500 375 6 1 241 47 276 6 26 234 85 265 6 98 222 143 252 +56 /data/VOCdevkit/VOC2007/JPEGImages/000105.jpg 500 333 3 22 1 320 314 14 202 71 295 215 14 170 107 239 206 +57 /data/VOCdevkit/VOC2007/JPEGImages/000106.jpg 500 333 2 181 96 368 252 +58 /data/VOCdevkit/VOC2007/JPEGImages/000108.jpg 500 375 11 313 131 500 235 11 1 103 305 262 17 1 59 500 375 +59 /data/VOCdevkit/VOC2007/JPEGImages/000111.jpg 500 375 14 415 270 500 375 14 149 186 171 213 14 112 186 135 222 13 92 198 141 227 +60 /data/VOCdevkit/VOC2007/JPEGImages/000114.jpg 500 375 7 158 64 432 365 +61 /data/VOCdevkit/VOC2007/JPEGImages/000115.jpg 375 500 2 1 219 247 437 +62 /data/VOCdevkit/VOC2007/JPEGImages/000116.jpg 375 500 8 1 185 45 302 15 2 97 106 273 15 192 96 277 202 +63 /data/VOCdevkit/VOC2007/JPEGImages/000119.jpg 500 375 7 107 96 309 348 +64 /data/VOCdevkit/VOC2007/JPEGImages/000124.jpg 500 375 14 2 6 104 146 14 230 25 320 138 14 78 15 478 375 15 70 2 227 127 +65 /data/VOCdevkit/VOC2007/JPEGImages/000126.jpg 500 215 10 78 182 259 215 +66 /data/VOCdevkit/VOC2007/JPEGImages/000127.jpg 500 375 2 238 215 341 318 2 173 226 231 375 14 68 21 371 375 +67 /data/VOCdevkit/VOC2007/JPEGImages/000128.jpg 500 367 0 53 117 458 231 +68 /data/VOCdevkit/VOC2007/JPEGImages/000135.jpg 500 375 6 208 194 332 259 +69 /data/VOCdevkit/VOC2007/JPEGImages/000136.jpg 500 375 7 331 205 407 267 +70 /data/VOCdevkit/VOC2007/JPEGImages/000137.jpg 333 500 6 96 430 164 482 +71 /data/VOCdevkit/VOC2007/JPEGImages/000139.jpg 500 334 1 114 124 262 275 14 151 52 265 209 14 1 173 98 334 +72 /data/VOCdevkit/VOC2007/JPEGImages/000144.jpg 500 333 10 135 191 438 333 4 221 192 248 276 4 245 156 265 215 14 2 100 134 333 14 166 66 279 193 14 351 3 438 304 14 344 8 500 333 +73 /data/VOCdevkit/VOC2007/JPEGImages/000145.jpg 500 346 18 52 88 380 291 +74 /data/VOCdevkit/VOC2007/JPEGImages/000148.jpg 500 360 2 131 112 465 312 +75 /data/VOCdevkit/VOC2007/JPEGImages/000149.jpg 500 375 15 114 2 351 361 +76 /data/VOCdevkit/VOC2007/JPEGImages/000151.jpg 375 500 4 153 136 375 264 14 4 49 375 440 +77 /data/VOCdevkit/VOC2007/JPEGImages/000152.jpg 500 333 6 60 99 123 152 6 413 93 500 156 6 309 93 421 141 6 116 82 405 285 +78 /data/VOCdevkit/VOC2007/JPEGImages/000155.jpg 360 500 1 122 160 168 255 1 223 288 305 419 14 89 7 137 89 14 114 120 171 208 14 221 250 299 359 +79 /data/VOCdevkit/VOC2007/JPEGImages/000157.jpg 400 266 7 132 162 378 224 8 34 35 400 266 +80 /data/VOCdevkit/VOC2007/JPEGImages/000160.jpg 500 375 17 2 242 336 373 +81 /data/VOCdevkit/VOC2007/JPEGImages/000166.jpg 500 375 14 324 170 354 285 14 243 180 292 227 14 2 170 22 266 14 26 178 47 230 14 67 114 160 238 12 48 163 229 334 +82 /data/VOCdevkit/VOC2007/JPEGImages/000167.jpg 500 374 11 27 18 478 374 +83 /data/VOCdevkit/VOC2007/JPEGImages/000168.jpg 318 480 14 72 102 223 304 12 104 123 201 471 +84 /data/VOCdevkit/VOC2007/JPEGImages/000172.jpg 500 375 6 29 54 456 321 +85 /data/VOCdevkit/VOC2007/JPEGImages/000175.jpg 500 332 16 25 34 419 271 +86 /data/VOCdevkit/VOC2007/JPEGImages/000176.jpg 319 480 16 41 135 148 288 16 175 152 287 284 16 287 216 319 277 16 2 208 83 278 +87 /data/VOCdevkit/VOC2007/JPEGImages/000178.jpg 500 375 4 240 85 288 254 4 356 72 397 216 4 331 60 362 166 4 167 65 204 180 4 202 82 251 244 14 1 1 102 216 +88 /data/VOCdevkit/VOC2007/JPEGImages/000179.jpg 375 500 3 269 420 366 467 3 85 29 301 493 3 1 419 77 465 3 221 412 246 457 +89 /data/VOCdevkit/VOC2007/JPEGImages/000181.jpg 500 375 14 259 159 410 287 14 121 154 304 369 14 17 129 277 375 +90 /data/VOCdevkit/VOC2007/JPEGImages/000182.jpg 500 375 14 114 50 325 372 +91 /data/VOCdevkit/VOC2007/JPEGImages/000183.jpg 500 375 11 77 2 500 338 +92 /data/VOCdevkit/VOC2007/JPEGImages/000185.jpg 449 500 14 239 239 338 378 8 280 290 346 390 19 254 234 299 289 +93 /data/VOCdevkit/VOC2007/JPEGImages/000186.jpg 500 373 2 58 49 284 362 +94 /data/VOCdevkit/VOC2007/JPEGImages/000188.jpg 500 264 5 89 88 500 200 14 29 109 68 215 6 406 146 500 216 6 1 140 139 202 +95 /data/VOCdevkit/VOC2007/JPEGImages/000191.jpg 333 500 14 29 181 147 499 14 307 222 333 428 14 204 244 218 296 14 167 245 188 295 14 140 245 155 293 14 224 233 316 438 +96 /data/VOCdevkit/VOC2007/JPEGImages/000195.jpg 500 375 5 6 15 482 373 +97 /data/VOCdevkit/VOC2007/JPEGImages/000196.jpg 500 375 8 1 201 69 356 8 75 161 170 298 8 270 150 347 261 8 236 153 281 224 +98 /data/VOCdevkit/VOC2007/JPEGImages/000197.jpg 500 375 6 35 56 466 259 +99 /data/VOCdevkit/VOC2007/JPEGImages/000199.jpg 500 329 2 82 68 383 270 +100 /data/VOCdevkit/VOC2007/JPEGImages/000201.jpg 500 344 14 180 72 234 124 14 316 29 376 93 14 268 81 384 248 13 256 135 378 314 13 326 59 391 134 +101 /data/VOCdevkit/VOC2007/JPEGImages/000202.jpg 500 375 4 417 114 500 333 14 1 8 335 375 +102 /data/VOCdevkit/VOC2007/JPEGImages/000204.jpg 500 375 19 211 66 327 174 +103 /data/VOCdevkit/VOC2007/JPEGImages/000205.jpg 375 500 14 107 156 304 482 11 83 277 241 401 17 1 199 374 457 +104 /data/VOCdevkit/VOC2007/JPEGImages/000206.jpg 375 500 14 89 349 189 500 +105 /data/VOCdevkit/VOC2007/JPEGImages/000212.jpg 500 333 14 2 82 198 332 14 139 141 206 195 14 243 103 288 170 14 282 100 341 195 14 265 140 302 193 14 322 133 456 223 14 468 123 499 221 14 431 114 463 184 14 321 60 369 142 14 351 68 384 113 +106 /data/VOCdevkit/VOC2007/JPEGImages/000213.jpg 375 500 7 100 69 312 294 +107 /data/VOCdevkit/VOC2007/JPEGImages/000216.jpg 500 375 0 234 170 284 224 +108 /data/VOCdevkit/VOC2007/JPEGImages/000217.jpg 500 333 10 133 184 409 333 8 135 213 235 333 8 121 210 200 320 8 296 224 383 333 8 292 169 337 217 8 251 167 298 205 +109 /data/VOCdevkit/VOC2007/JPEGImages/000223.jpg 500 333 18 156 85 341 290 +110 /data/VOCdevkit/VOC2007/JPEGImages/000226.jpg 500 375 8 312 250 432 375 8 74 265 262 375 8 51 230 113 375 10 111 242 377 375 14 233 161 296 221 14 352 168 404 243 +111 /data/VOCdevkit/VOC2007/JPEGImages/000227.jpg 500 354 7 220 123 473 354 19 26 38 177 163 +112 /data/VOCdevkit/VOC2007/JPEGImages/000230.jpg 500 375 1 162 167 397 357 14 250 72 357 355 +113 /data/VOCdevkit/VOC2007/JPEGImages/000231.jpg 500 375 5 87 110 278 206 14 337 124 366 227 +114 /data/VOCdevkit/VOC2007/JPEGImages/000234.jpg 500 376 8 307 92 472 326 15 61 231 135 316 15 11 150 75 201 15 12 51 220 228 +115 /data/VOCdevkit/VOC2007/JPEGImages/000237.jpg 480 354 14 232 37 337 201 12 55 47 387 332 +116 /data/VOCdevkit/VOC2007/JPEGImages/000238.jpg 500 375 18 1 1 293 373 14 443 252 490 374 +117 /data/VOCdevkit/VOC2007/JPEGImages/000239.jpg 500 334 5 63 26 468 219 14 1 138 33 206 14 29 166 82 238 +118 /data/VOCdevkit/VOC2007/JPEGImages/000240.jpg 500 375 3 410 133 489 172 6 263 175 438 234 6 60 156 146 221 6 374 154 416 181 14 348 153 374 189 14 159 153 175 193 6 176 152 206 174 +119 /data/VOCdevkit/VOC2007/JPEGImages/000243.jpg 500 333 0 181 127 274 193 +120 /data/VOCdevkit/VOC2007/JPEGImages/000247.jpg 375 500 8 2 143 135 319 14 114 51 273 374 14 146 143 247 395 +121 /data/VOCdevkit/VOC2007/JPEGImages/000248.jpg 500 332 14 189 157 308 265 12 104 90 313 273 +122 /data/VOCdevkit/VOC2007/JPEGImages/000252.jpg 500 333 6 194 168 297 241 5 147 54 283 224 14 239 112 266 135 +123 /data/VOCdevkit/VOC2007/JPEGImages/000253.jpg 500 335 18 108 55 350 228 +124 /data/VOCdevkit/VOC2007/JPEGImages/000254.jpg 500 333 6 197 239 475 333 6 1 210 197 333 6 159 247 231 314 +125 /data/VOCdevkit/VOC2007/JPEGImages/000255.jpg 500 333 11 2 2 419 332 +126 /data/VOCdevkit/VOC2007/JPEGImages/000258.jpg 500 333 11 192 123 404 333 14 350 27 500 333 +127 /data/VOCdevkit/VOC2007/JPEGImages/000260.jpg 500 375 0 55 50 456 235 0 394 163 500 212 +128 /data/VOCdevkit/VOC2007/JPEGImages/000261.jpg 500 375 1 1 76 405 326 1 58 79 408 295 +129 /data/VOCdevkit/VOC2007/JPEGImages/000264.jpg 333 500 13 2 82 333 500 14 115 47 309 475 +130 /data/VOCdevkit/VOC2007/JPEGImages/000265.jpg 500 333 19 167 8 363 144 14 131 233 231 333 14 109 179 240 333 14 16 184 134 332 14 257 29 353 135 14 3 74 65 259 +131 /data/VOCdevkit/VOC2007/JPEGImages/000267.jpg 332 500 12 80 86 332 500 +132 /data/VOCdevkit/VOC2007/JPEGImages/000271.jpg 500 321 6 414 182 484 237 14 338 189 357 232 14 43 169 62 231 +133 /data/VOCdevkit/VOC2007/JPEGImages/000272.jpg 333 500 14 25 71 304 500 +134 /data/VOCdevkit/VOC2007/JPEGImages/000273.jpg 500 375 9 235 149 304 184 +135 /data/VOCdevkit/VOC2007/JPEGImages/000274.jpg 500 375 2 49 100 407 303 +136 /data/VOCdevkit/VOC2007/JPEGImages/000277.jpg 500 375 17 14 104 479 321 +137 /data/VOCdevkit/VOC2007/JPEGImages/000279.jpg 500 375 14 298 190 373 359 14 215 199 302 367 14 75 186 213 365 +138 /data/VOCdevkit/VOC2007/JPEGImages/000280.jpg 500 375 4 454 153 477 213 4 480 107 500 173 4 438 127 458 164 14 153 68 288 325 10 245 153 500 375 +139 /data/VOCdevkit/VOC2007/JPEGImages/000281.jpg 500 333 18 47 93 436 254 +140 /data/VOCdevkit/VOC2007/JPEGImages/000283.jpg 500 459 14 333 110 456 421 14 82 14 191 301 1 331 257 436 455 1 86 130 184 354 +141 /data/VOCdevkit/VOC2007/JPEGImages/000284.jpg 500 334 6 201 78 440 256 +142 /data/VOCdevkit/VOC2007/JPEGImages/000286.jpg 500 375 14 94 218 226 375 14 189 11 500 375 +143 /data/VOCdevkit/VOC2007/JPEGImages/000287.jpg 500 375 14 421 65 500 129 14 7 1 303 374 +144 /data/VOCdevkit/VOC2007/JPEGImages/000290.jpg 333 500 11 88 101 333 500 +145 /data/VOCdevkit/VOC2007/JPEGImages/000291.jpg 500 375 19 176 160 335 291 19 1 132 183 308 14 291 102 326 136 14 267 114 303 135 +146 /data/VOCdevkit/VOC2007/JPEGImages/000292.jpg 500 375 7 94 1 442 374 +147 /data/VOCdevkit/VOC2007/JPEGImages/000293.jpg 500 375 14 13 20 65 192 14 140 33 175 133 14 171 40 200 116 14 479 49 500 76 6 1 2 456 318 6 68 62 122 99 +148 /data/VOCdevkit/VOC2007/JPEGImages/000295.jpg 500 333 3 362 195 404 246 +149 /data/VOCdevkit/VOC2007/JPEGImages/000297.jpg 500 468 9 103 120 249 395 14 269 176 366 399 14 226 178 319 365 +150 /data/VOCdevkit/VOC2007/JPEGImages/000299.jpg 500 375 14 160 118 290 337 14 62 45 83 69 14 86 45 112 69 +151 /data/VOCdevkit/VOC2007/JPEGImages/000300.jpg 375 500 6 37 192 337 447 +152 /data/VOCdevkit/VOC2007/JPEGImages/000301.jpg 375 500 6 8 295 375 487 6 15 318 106 365 +153 /data/VOCdevkit/VOC2007/JPEGImages/000309.jpg 500 375 2 105 170 325 298 +154 /data/VOCdevkit/VOC2007/JPEGImages/000310.jpg 500 375 14 270 122 352 374 14 167 103 277 375 14 54 163 90 240 14 118 146 135 162 +155 /data/VOCdevkit/VOC2007/JPEGImages/000313.jpg 500 375 6 7 193 81 233 6 74 194 140 235 6 136 196 196 236 6 208 199 259 238 6 281 199 330 239 6 360 202 419 245 6 422 203 493 247 +156 /data/VOCdevkit/VOC2007/JPEGImages/000314.jpg 500 333 17 355 171 500 330 8 212 178 298 293 8 288 132 315 202 8 194 135 245 206 10 196 134 308 210 +157 /data/VOCdevkit/VOC2007/JPEGImages/000315.jpg 375 500 14 51 195 324 500 14 2 133 112 500 14 284 99 375 500 +158 /data/VOCdevkit/VOC2007/JPEGImages/000316.jpg 500 375 0 337 179 404 211 +159 /data/VOCdevkit/VOC2007/JPEGImages/000319.jpg 500 332 12 31 80 312 291 12 316 183 374 250 14 155 49 229 220 +160 /data/VOCdevkit/VOC2007/JPEGImages/000324.jpg 500 375 11 33 104 358 246 +161 /data/VOCdevkit/VOC2007/JPEGImages/000326.jpg 500 375 2 189 98 295 236 +162 /data/VOCdevkit/VOC2007/JPEGImages/000327.jpg 500 375 4 305 27 333 127 10 1 89 500 375 +163 /data/VOCdevkit/VOC2007/JPEGImages/000330.jpg 480 349 14 188 46 304 208 12 82 53 388 333 +164 /data/VOCdevkit/VOC2007/JPEGImages/000333.jpg 500 333 18 1 39 367 270 +165 /data/VOCdevkit/VOC2007/JPEGImages/000335.jpg 375 500 4 4 80 361 374 +166 /data/VOCdevkit/VOC2007/JPEGImages/000339.jpg 500 375 8 1 6 235 230 14 2 110 214 372 14 208 184 302 373 14 301 90 472 358 14 362 174 500 375 +167 /data/VOCdevkit/VOC2007/JPEGImages/000341.jpg 500 337 5 313 113 393 200 14 412 154 430 190 6 383 199 500 297 6 193 137 312 222 6 48 148 177 215 6 1 204 102 337 +168 /data/VOCdevkit/VOC2007/JPEGImages/000342.jpg 500 375 14 95 136 328 319 +169 /data/VOCdevkit/VOC2007/JPEGImages/000345.jpg 500 375 9 249 119 499 280 +170 /data/VOCdevkit/VOC2007/JPEGImages/000346.jpg 500 375 4 124 107 230 343 14 137 78 497 375 14 89 202 129 247 14 72 209 111 259 +171 /data/VOCdevkit/VOC2007/JPEGImages/000348.jpg 500 334 14 213 102 281 324 14 266 111 322 265 14 307 128 334 181 13 101 144 382 306 +172 /data/VOCdevkit/VOC2007/JPEGImages/000350.jpg 500 334 3 167 145 247 189 +173 /data/VOCdevkit/VOC2007/JPEGImages/000351.jpg 332 220 6 1 28 330 156 +174 /data/VOCdevkit/VOC2007/JPEGImages/000353.jpg 500 375 13 79 29 441 356 +175 /data/VOCdevkit/VOC2007/JPEGImages/000356.jpg 318 480 14 86 116 251 322 12 122 170 218 480 +176 /data/VOCdevkit/VOC2007/JPEGImages/000357.jpg 500 357 2 29 1 500 356 +177 /data/VOCdevkit/VOC2007/JPEGImages/000358.jpg 500 400 6 89 100 387 284 14 23 33 110 287 +178 /data/VOCdevkit/VOC2007/JPEGImages/000360.jpg 500 375 9 64 42 500 375 +179 /data/VOCdevkit/VOC2007/JPEGImages/000361.jpg 500 375 6 217 188 286 234 6 467 117 500 146 +180 /data/VOCdevkit/VOC2007/JPEGImages/000362.jpg 500 333 11 163 26 287 267 +181 /data/VOCdevkit/VOC2007/JPEGImages/000364.jpg 500 375 13 54 25 454 315 13 318 37 489 161 14 369 1 458 130 +182 /data/VOCdevkit/VOC2007/JPEGImages/000365.jpg 366 500 7 112 136 344 378 +183 /data/VOCdevkit/VOC2007/JPEGImages/000366.jpg 375 500 10 79 174 266 486 8 16 185 115 411 8 242 206 371 431 +184 /data/VOCdevkit/VOC2007/JPEGImages/000368.jpg 333 500 14 50 21 272 482 +185 /data/VOCdevkit/VOC2007/JPEGImages/000369.jpg 500 375 4 181 259 216 375 14 96 89 429 277 14 231 91 500 375 14 1 92 120 375 +186 /data/VOCdevkit/VOC2007/JPEGImages/000371.jpg 500 333 3 248 179 406 248 +187 /data/VOCdevkit/VOC2007/JPEGImages/000375.jpg 500 375 3 3 1 489 340 +188 /data/VOCdevkit/VOC2007/JPEGImages/000376.jpg 500 333 16 229 150 265 175 +189 /data/VOCdevkit/VOC2007/JPEGImages/000377.jpg 500 375 14 115 73 201 228 14 181 90 270 221 14 203 149 315 263 14 90 158 210 266 14 22 80 121 255 14 386 77 493 253 14 339 89 406 294 14 284 99 355 270 8 375 228 481 375 8 378 265 500 375 10 1 250 383 375 +190 /data/VOCdevkit/VOC2007/JPEGImages/000378.jpg 212 320 12 46 67 208 318 14 48 4 160 212 +191 /data/VOCdevkit/VOC2007/JPEGImages/000383.jpg 500 375 2 64 46 398 374 2 2 15 144 350 +192 /data/VOCdevkit/VOC2007/JPEGImages/000384.jpg 500 333 17 174 27 454 292 +193 /data/VOCdevkit/VOC2007/JPEGImages/000385.jpg 500 375 8 154 194 281 372 8 373 173 500 322 +194 /data/VOCdevkit/VOC2007/JPEGImages/000386.jpg 500 375 9 287 155 432 266 9 137 166 204 236 14 68 130 178 375 +195 /data/VOCdevkit/VOC2007/JPEGImages/000388.jpg 332 500 14 2 125 175 497 14 138 6 329 500 +196 /data/VOCdevkit/VOC2007/JPEGImages/000389.jpg 327 435 15 7 256 194 434 +197 /data/VOCdevkit/VOC2007/JPEGImages/000390.jpg 500 408 6 8 64 492 401 +198 /data/VOCdevkit/VOC2007/JPEGImages/000392.jpg 500 332 12 100 96 355 324 14 198 58 286 197 +199 /data/VOCdevkit/VOC2007/JPEGImages/000393.jpg 500 332 14 235 51 309 222 12 157 106 426 294 +200 /data/VOCdevkit/VOC2007/JPEGImages/000397.jpg 375 500 19 142 206 213 261 8 271 192 313 273 15 32 186 64 249 15 1 153 37 249 +201 /data/VOCdevkit/VOC2007/JPEGImages/000398.jpg 500 442 18 78 1 396 417 +202 /data/VOCdevkit/VOC2007/JPEGImages/000399.jpg 500 333 1 23 15 479 296 +203 /data/VOCdevkit/VOC2007/JPEGImages/000401.jpg 500 375 7 215 156 485 375 7 1 113 202 259 +204 /data/VOCdevkit/VOC2007/JPEGImages/000402.jpg 500 333 6 12 184 393 324 +205 /data/VOCdevkit/VOC2007/JPEGImages/000405.jpg 338 500 14 16 39 312 479 +206 /data/VOCdevkit/VOC2007/JPEGImages/000409.jpg 332 500 14 44 19 332 290 +207 /data/VOCdevkit/VOC2007/JPEGImages/000410.jpg 332 500 12 131 228 251 315 14 16 189 66 348 14 271 224 306 318 +208 /data/VOCdevkit/VOC2007/JPEGImages/000412.jpg 500 333 12 66 127 366 333 12 57 100 395 316 +209 /data/VOCdevkit/VOC2007/JPEGImages/000413.jpg 500 375 14 139 149 270 344 14 68 288 128 375 14 1 209 73 375 12 159 6 443 364 +210 /data/VOCdevkit/VOC2007/JPEGImages/000414.jpg 500 375 19 58 56 242 234 14 118 88 206 187 4 263 100 300 215 +211 /data/VOCdevkit/VOC2007/JPEGImages/000415.jpg 500 375 6 12 105 490 279 +212 /data/VOCdevkit/VOC2007/JPEGImages/000418.jpg 500 375 0 2 40 458 374 +213 /data/VOCdevkit/VOC2007/JPEGImages/000421.jpg 500 375 19 2 53 192 248 14 292 18 500 375 +214 /data/VOCdevkit/VOC2007/JPEGImages/000422.jpg 500 446 11 10 16 500 446 +215 /data/VOCdevkit/VOC2007/JPEGImages/000423.jpg 500 375 14 51 80 122 266 14 367 92 461 315 +216 /data/VOCdevkit/VOC2007/JPEGImages/000425.jpg 500 333 6 1 3 500 333 +217 /data/VOCdevkit/VOC2007/JPEGImages/000426.jpg 500 375 2 165 177 274 258 +218 /data/VOCdevkit/VOC2007/JPEGImages/000429.jpg 500 375 15 33 255 85 296 14 2 249 61 375 +219 /data/VOCdevkit/VOC2007/JPEGImages/000432.jpg 500 374 9 220 202 275 239 9 316 203 376 239 +220 /data/VOCdevkit/VOC2007/JPEGImages/000434.jpg 480 383 12 95 73 425 263 14 187 44 291 208 +221 /data/VOCdevkit/VOC2007/JPEGImages/000436.jpg 500 375 2 36 119 351 263 +222 /data/VOCdevkit/VOC2007/JPEGImages/000437.jpg 500 375 14 324 96 380 231 14 97 142 139 219 +223 /data/VOCdevkit/VOC2007/JPEGImages/000440.jpg 500 333 6 37 82 459 305 +224 /data/VOCdevkit/VOC2007/JPEGImages/000441.jpg 500 332 18 161 103 315 248 +225 /data/VOCdevkit/VOC2007/JPEGImages/000442.jpg 500 375 7 35 2 500 375 +226 /data/VOCdevkit/VOC2007/JPEGImages/000444.jpg 332 500 3 2 2 332 325 +227 /data/VOCdevkit/VOC2007/JPEGImages/000445.jpg 500 302 12 266 86 475 252 12 135 70 318 255 12 1 68 173 268 14 38 46 128 154 14 125 43 188 101 14 192 48 263 150 14 334 70 414 157 +228 /data/VOCdevkit/VOC2007/JPEGImages/000447.jpg 500 344 4 226 156 279 318 14 35 42 279 184 +229 /data/VOCdevkit/VOC2007/JPEGImages/000449.jpg 500 375 3 1 1 500 298 14 416 61 480 193 14 210 118 306 208 14 129 94 199 209 +230 /data/VOCdevkit/VOC2007/JPEGImages/000451.jpg 500 333 16 7 15 462 330 +231 /data/VOCdevkit/VOC2007/JPEGImages/000452.jpg 500 375 17 50 121 295 338 +232 /data/VOCdevkit/VOC2007/JPEGImages/000453.jpg 500 333 14 267 139 305 181 6 9 121 483 294 +233 /data/VOCdevkit/VOC2007/JPEGImages/000455.jpg 500 332 14 213 35 302 212 12 125 79 500 306 +234 /data/VOCdevkit/VOC2007/JPEGImages/000456.jpg 500 375 5 92 43 425 303 14 121 117 174 160 +235 /data/VOCdevkit/VOC2007/JPEGImages/000457.jpg 332 500 14 1 99 304 500 +236 /data/VOCdevkit/VOC2007/JPEGImages/000458.jpg 500 375 16 107 125 384 325 14 201 39 388 337 14 34 1 120 234 +237 /data/VOCdevkit/VOC2007/JPEGImages/000465.jpg 500 375 6 1 134 500 316 +238 /data/VOCdevkit/VOC2007/JPEGImages/000466.jpg 500 375 2 241 104 344 258 +239 /data/VOCdevkit/VOC2007/JPEGImages/000467.jpg 500 331 13 370 123 472 176 13 291 129 349 205 13 217 148 284 229 13 87 141 168 265 14 404 72 455 152 14 295 81 362 186 14 208 80 288 211 14 184 79 245 199 14 89 84 177 233 +240 /data/VOCdevkit/VOC2007/JPEGImages/000471.jpg 500 375 6 40 71 463 321 +241 /data/VOCdevkit/VOC2007/JPEGImages/000472.jpg 500 375 2 1 49 445 375 +242 /data/VOCdevkit/VOC2007/JPEGImages/000473.jpg 500 375 0 415 120 460 153 +243 /data/VOCdevkit/VOC2007/JPEGImages/000475.jpg 500 375 16 213 153 343 259 12 328 85 363 133 +244 /data/VOCdevkit/VOC2007/JPEGImages/000478.jpg 500 333 11 180 96 454 243 +245 /data/VOCdevkit/VOC2007/JPEGImages/000479.jpg 374 500 14 34 2 374 500 +246 /data/VOCdevkit/VOC2007/JPEGImages/000481.jpg 500 357 3 277 164 500 319 3 12 140 322 298 3 1 164 185 272 +247 /data/VOCdevkit/VOC2007/JPEGImages/000485.jpg 500 333 14 10 112 475 333 +248 /data/VOCdevkit/VOC2007/JPEGImages/000487.jpg 500 376 8 343 248 482 376 8 35 253 182 376 8 181 176 253 336 8 259 152 302 229 +249 /data/VOCdevkit/VOC2007/JPEGImages/000488.jpg 500 375 6 34 102 480 315 +250 /data/VOCdevkit/VOC2007/JPEGImages/000490.jpg 500 333 14 100 77 184 281 14 130 74 250 319 14 252 191 339 284 14 245 121 500 333 +251 /data/VOCdevkit/VOC2007/JPEGImages/000493.jpg 500 341 14 28 61 158 341 14 138 83 221 341 14 210 71 306 341 14 295 36 400 341 14 347 25 472 341 +252 /data/VOCdevkit/VOC2007/JPEGImages/000495.jpg 500 335 2 104 16 400 266 +253 /data/VOCdevkit/VOC2007/JPEGImages/000497.jpg 500 500 13 6 203 418 472 14 157 170 298 462 14 340 178 389 258 14 399 238 423 305 14 439 220 468 302 +254 /data/VOCdevkit/VOC2007/JPEGImages/000502.jpg 500 375 14 1 1 500 357 +255 /data/VOCdevkit/VOC2007/JPEGImages/000504.jpg 500 412 9 341 102 500 406 14 36 34 79 123 14 2 44 36 120 14 29 42 41 64 +256 /data/VOCdevkit/VOC2007/JPEGImages/000505.jpg 500 333 6 197 58 398 161 6 245 79 405 204 6 158 158 386 287 +257 /data/VOCdevkit/VOC2007/JPEGImages/000506.jpg 375 500 11 75 291 226 476 14 48 4 325 500 +258 /data/VOCdevkit/VOC2007/JPEGImages/000507.jpg 500 375 6 1 135 500 375 14 187 49 295 231 14 293 91 350 220 14 284 192 397 284 14 117 154 164 219 14 160 167 199 218 14 61 156 124 263 14 16 168 78 270 14 71 101 126 201 14 409 181 488 284 14 389 185 412 216 14 11 131 42 200 14 2 139 22 174 14 1 214 18 284 14 264 158 305 207 +259 /data/VOCdevkit/VOC2007/JPEGImages/000510.jpg 500 375 8 44 244 130 371 8 58 259 162 375 8 157 271 249 375 8 259 266 373 375 10 109 268 322 375 +260 /data/VOCdevkit/VOC2007/JPEGImages/000511.jpg 500 335 18 109 143 284 225 +261 /data/VOCdevkit/VOC2007/JPEGImages/000512.jpg 500 375 5 20 79 423 357 +262 /data/VOCdevkit/VOC2007/JPEGImages/000517.jpg 500 375 7 190 114 349 270 4 187 225 216 340 11 25 238 154 375 14 196 38 358 374 +263 /data/VOCdevkit/VOC2007/JPEGImages/000521.jpg 500 333 0 247 125 327 250 +264 /data/VOCdevkit/VOC2007/JPEGImages/000527.jpg 500 375 14 384 160 426 238 14 232 156 286 254 14 154 163 222 261 14 53 82 86 149 1 145 208 259 293 1 219 194 323 263 1 369 194 452 259 1 350 170 412 220 +265 /data/VOCdevkit/VOC2007/JPEGImages/000529.jpg 500 375 3 290 143 500 250 +266 /data/VOCdevkit/VOC2007/JPEGImages/000532.jpg 500 331 13 202 159 357 331 13 282 123 433 288 14 185 92 357 316 14 266 54 417 259 +267 /data/VOCdevkit/VOC2007/JPEGImages/000533.jpg 500 152 11 341 63 401 115 17 3 2 500 152 +268 /data/VOCdevkit/VOC2007/JPEGImages/000534.jpg 484 500 14 3 15 463 500 +269 /data/VOCdevkit/VOC2007/JPEGImages/000536.jpg 500 375 5 11 90 481 330 14 463 207 498 320 +270 /data/VOCdevkit/VOC2007/JPEGImages/000538.jpg 500 333 14 71 128 116 274 +271 /data/VOCdevkit/VOC2007/JPEGImages/000539.jpg 500 375 14 24 103 347 375 +272 /data/VOCdevkit/VOC2007/JPEGImages/000542.jpg 500 375 7 1 1 497 361 +273 /data/VOCdevkit/VOC2007/JPEGImages/000546.jpg 500 375 11 1 138 290 372 14 285 56 479 359 +274 /data/VOCdevkit/VOC2007/JPEGImages/000547.jpg 375 500 8 313 294 360 373 8 163 303 216 353 8 230 298 285 346 8 158 252 201 312 8 307 218 340 286 8 259 387 308 475 8 207 438 260 495 8 147 398 201 473 8 160 339 208 410 10 183 365 283 443 10 186 255 265 304 14 255 232 294 287 14 199 218 238 263 8 301 171 336 223 8 48 297 91 369 8 22 418 80 495 14 1 399 49 478 14 25 362 64 422 14 32 314 69 373 14 83 156 121 249 10 1 295 49 468 10 326 172 375 206 +275 /data/VOCdevkit/VOC2007/JPEGImages/000548.jpg 500 375 6 16 177 454 319 +276 /data/VOCdevkit/VOC2007/JPEGImages/000551.jpg 500 378 11 288 143 497 330 11 2 184 312 378 11 74 12 294 209 +277 /data/VOCdevkit/VOC2007/JPEGImages/000553.jpg 500 375 13 40 51 428 349 +278 /data/VOCdevkit/VOC2007/JPEGImages/000556.jpg 500 333 18 75 101 358 302 +279 /data/VOCdevkit/VOC2007/JPEGImages/000557.jpg 500 375 2 51 138 167 213 +280 /data/VOCdevkit/VOC2007/JPEGImages/000558.jpg 500 257 3 118 135 174 211 3 171 114 235 209 +281 /data/VOCdevkit/VOC2007/JPEGImages/000560.jpg 375 500 0 56 328 204 390 +282 /data/VOCdevkit/VOC2007/JPEGImages/000561.jpg 374 500 2 145 167 311 491 2 37 27 177 412 +283 /data/VOCdevkit/VOC2007/JPEGImages/000562.jpg 500 375 1 184 188 259 307 14 194 131 273 291 +284 /data/VOCdevkit/VOC2007/JPEGImages/000566.jpg 500 333 14 16 29 315 333 +285 /data/VOCdevkit/VOC2007/JPEGImages/000567.jpg 500 375 1 189 234 294 375 14 144 63 312 362 +286 /data/VOCdevkit/VOC2007/JPEGImages/000568.jpg 500 332 2 95 53 380 262 +287 /data/VOCdevkit/VOC2007/JPEGImages/000569.jpg 500 370 2 40 34 412 348 +288 /data/VOCdevkit/VOC2007/JPEGImages/000570.jpg 500 375 13 141 108 470 330 14 259 46 406 275 +289 /data/VOCdevkit/VOC2007/JPEGImages/000571.jpg 500 497 19 174 189 282 298 19 92 207 146 278 19 222 285 345 398 19 300 132 330 170 19 264 130 288 156 +290 /data/VOCdevkit/VOC2007/JPEGImages/000572.jpg 500 331 1 1 178 235 331 1 8 134 226 297 +291 /data/VOCdevkit/VOC2007/JPEGImages/000573.jpg 500 375 8 5 69 137 220 +292 /data/VOCdevkit/VOC2007/JPEGImages/000574.jpg 500 386 16 160 208 354 355 16 243 291 313 341 +293 /data/VOCdevkit/VOC2007/JPEGImages/000575.jpg 309 500 15 208 22 309 150 15 3 8 92 98 17 20 97 271 283 +294 /data/VOCdevkit/VOC2007/JPEGImages/000576.jpg 500 375 3 253 106 471 312 +295 /data/VOCdevkit/VOC2007/JPEGImages/000578.jpg 375 500 14 81 2 317 443 14 3 2 317 500 +296 /data/VOCdevkit/VOC2007/JPEGImages/000580.jpg 500 375 6 270 145 391 219 +297 /data/VOCdevkit/VOC2007/JPEGImages/000584.jpg 500 375 1 31 74 369 346 +298 /data/VOCdevkit/VOC2007/JPEGImages/000585.jpg 500 333 6 2 11 494 332 +299 /data/VOCdevkit/VOC2007/JPEGImages/000586.jpg 375 500 6 166 341 292 444 14 104 334 141 454 +300 /data/VOCdevkit/VOC2007/JPEGImages/000587.jpg 500 375 14 281 117 444 266 14 209 153 328 269 14 187 168 268 273 14 23 151 212 375 4 348 255 433 375 +301 /data/VOCdevkit/VOC2007/JPEGImages/000593.jpg 500 375 6 78 74 382 258 6 270 63 500 228 +302 /data/VOCdevkit/VOC2007/JPEGImages/000594.jpg 500 321 1 2 124 431 321 14 158 64 486 317 +303 /data/VOCdevkit/VOC2007/JPEGImages/000595.jpg 500 375 8 147 180 218 354 8 203 211 336 374 8 369 227 500 375 10 143 166 483 375 +304 /data/VOCdevkit/VOC2007/JPEGImages/000596.jpg 500 375 16 71 288 111 315 +305 /data/VOCdevkit/VOC2007/JPEGImages/000600.jpg 500 333 0 1 11 450 322 +306 /data/VOCdevkit/VOC2007/JPEGImages/000602.jpg 500 333 14 270 105 500 333 6 25 141 259 331 +307 /data/VOCdevkit/VOC2007/JPEGImages/000603.jpg 500 375 17 47 151 417 341 +308 /data/VOCdevkit/VOC2007/JPEGImages/000604.jpg 339 500 12 25 228 276 449 14 107 164 218 386 +309 /data/VOCdevkit/VOC2007/JPEGImages/000606.jpg 500 375 10 144 216 500 375 14 351 71 500 269 14 151 100 281 233 14 178 68 210 117 14 26 101 220 375 4 422 207 456 299 +310 /data/VOCdevkit/VOC2007/JPEGImages/000607.jpg 500 333 6 236 148 454 305 14 174 114 275 286 14 238 100 259 129 14 75 68 98 122 14 101 75 135 123 14 106 49 133 109 6 1 155 70 305 +311 /data/VOCdevkit/VOC2007/JPEGImages/000611.jpg 500 333 11 209 2 500 291 4 118 70 181 297 +312 /data/VOCdevkit/VOC2007/JPEGImages/000614.jpg 500 375 1 136 100 457 311 +313 /data/VOCdevkit/VOC2007/JPEGImages/000615.jpg 500 375 14 24 29 157 301 14 336 37 489 263 +314 /data/VOCdevkit/VOC2007/JPEGImages/000616.jpg 500 500 14 354 150 458 414 12 53 99 326 408 +315 /data/VOCdevkit/VOC2007/JPEGImages/000617.jpg 500 375 10 11 85 500 375 14 353 1 500 239 +316 /data/VOCdevkit/VOC2007/JPEGImages/000618.jpg 500 299 0 1 35 150 212 0 124 35 489 291 +317 /data/VOCdevkit/VOC2007/JPEGImages/000621.jpg 500 375 8 352 162 448 375 14 257 163 338 311 14 146 50 245 359 +318 /data/VOCdevkit/VOC2007/JPEGImages/000623.jpg 320 212 12 113 51 221 201 14 154 25 196 120 +319 /data/VOCdevkit/VOC2007/JPEGImages/000624.jpg 500 333 14 317 66 343 101 14 341 75 360 105 14 390 61 407 87 14 387 68 422 134 14 430 77 459 140 14 465 61 500 164 14 3 57 91 265 14 1 171 78 285 6 61 53 500 315 +320 /data/VOCdevkit/VOC2007/JPEGImages/000627.jpg 500 367 16 56 107 317 306 +321 /data/VOCdevkit/VOC2007/JPEGImages/000629.jpg 500 230 18 34 84 500 184 14 87 100 107 124 +322 /data/VOCdevkit/VOC2007/JPEGImages/000630.jpg 500 375 13 187 162 483 375 14 266 158 408 298 +323 /data/VOCdevkit/VOC2007/JPEGImages/000631.jpg 500 375 3 198 31 420 340 3 68 75 259 331 +324 /data/VOCdevkit/VOC2007/JPEGImages/000634.jpg 500 375 14 214 156 231 186 14 149 196 189 297 6 231 155 413 227 +325 /data/VOCdevkit/VOC2007/JPEGImages/000636.jpg 500 335 18 79 96 392 300 +326 /data/VOCdevkit/VOC2007/JPEGImages/000638.jpg 375 500 7 1 24 355 323 +327 /data/VOCdevkit/VOC2007/JPEGImages/000639.jpg 333 500 14 6 92 330 500 +328 /data/VOCdevkit/VOC2007/JPEGImages/000640.jpg 500 375 1 1 54 486 375 +329 /data/VOCdevkit/VOC2007/JPEGImages/000641.jpg 500 375 8 34 30 406 375 14 138 121 285 299 +330 /data/VOCdevkit/VOC2007/JPEGImages/000642.jpg 500 375 8 2 191 426 375 14 68 13 443 375 +331 /data/VOCdevkit/VOC2007/JPEGImages/000643.jpg 500 375 14 161 112 251 375 14 250 157 339 375 +332 /data/VOCdevkit/VOC2007/JPEGImages/000644.jpg 500 375 14 219 114 328 213 +333 /data/VOCdevkit/VOC2007/JPEGImages/000646.jpg 500 375 6 198 25 412 102 6 394 45 500 236 6 2 32 78 231 6 58 38 449 370 +334 /data/VOCdevkit/VOC2007/JPEGImages/000649.jpg 500 374 6 16 200 253 339 14 337 167 368 212 +335 /data/VOCdevkit/VOC2007/JPEGImages/000650.jpg 500 375 15 103 2 416 375 15 40 32 139 254 +336 /data/VOCdevkit/VOC2007/JPEGImages/000651.jpg 500 375 7 87 4 496 373 +337 /data/VOCdevkit/VOC2007/JPEGImages/000652.jpg 500 375 8 7 53 268 375 14 125 18 392 375 14 40 64 202 375 +338 /data/VOCdevkit/VOC2007/JPEGImages/000655.jpg 500 375 14 199 81 359 296 13 100 120 426 315 +339 /data/VOCdevkit/VOC2007/JPEGImages/000658.jpg 500 375 17 223 247 500 375 +340 /data/VOCdevkit/VOC2007/JPEGImages/000659.jpg 500 375 19 99 35 341 243 8 1 1 500 375 +341 /data/VOCdevkit/VOC2007/JPEGImages/000662.jpg 500 246 17 46 23 478 242 14 4 69 432 197 +342 /data/VOCdevkit/VOC2007/JPEGImages/000664.jpg 500 375 14 51 2 325 375 +343 /data/VOCdevkit/VOC2007/JPEGImages/000665.jpg 500 437 0 138 176 381 261 +344 /data/VOCdevkit/VOC2007/JPEGImages/000666.jpg 500 333 12 58 114 306 315 14 296 176 382 322 14 33 153 88 333 +345 /data/VOCdevkit/VOC2007/JPEGImages/000668.jpg 500 292 0 15 107 456 262 +346 /data/VOCdevkit/VOC2007/JPEGImages/000669.jpg 500 375 6 296 198 410 245 6 409 202 500 333 +347 /data/VOCdevkit/VOC2007/JPEGImages/000670.jpg 500 375 14 189 46 500 375 14 2 61 202 375 +348 /data/VOCdevkit/VOC2007/JPEGImages/000673.jpg 500 333 7 1 1 485 333 +349 /data/VOCdevkit/VOC2007/JPEGImages/000674.jpg 500 375 18 1 2 248 375 +350 /data/VOCdevkit/VOC2007/JPEGImages/000678.jpg 500 333 18 22 151 272 220 +351 /data/VOCdevkit/VOC2007/JPEGImages/000679.jpg 500 298 6 102 117 458 280 +352 /data/VOCdevkit/VOC2007/JPEGImages/000681.jpg 500 375 2 127 130 246 227 +353 /data/VOCdevkit/VOC2007/JPEGImages/000683.jpg 500 333 14 124 2 284 333 14 284 48 500 333 +354 /data/VOCdevkit/VOC2007/JPEGImages/000687.jpg 500 338 6 309 56 489 200 14 102 10 141 68 14 157 20 176 73 14 61 15 100 122 14 186 36 293 133 6 27 66 481 308 +355 /data/VOCdevkit/VOC2007/JPEGImages/000691.jpg 500 375 8 15 78 253 252 8 223 79 467 284 +356 /data/VOCdevkit/VOC2007/JPEGImages/000692.jpg 500 334 14 104 33 359 208 11 127 193 472 332 15 127 2 315 95 8 1 2 497 334 +357 /data/VOCdevkit/VOC2007/JPEGImages/000693.jpg 500 375 6 292 181 499 288 6 379 175 500 229 6 164 178 263 242 6 1 172 177 252 14 321 138 367 194 14 272 138 324 269 14 264 147 291 266 14 219 153 266 281 14 104 158 146 295 14 61 149 111 292 14 13 144 47 288 +358 /data/VOCdevkit/VOC2007/JPEGImages/000696.jpg 500 333 0 103 90 430 214 14 101 245 121 284 14 175 284 196 312 +359 /data/VOCdevkit/VOC2007/JPEGImages/000697.jpg 375 500 1 133 206 230 355 14 135 140 229 307 +360 /data/VOCdevkit/VOC2007/JPEGImages/000698.jpg 334 500 15 146 69 228 369 15 201 196 300 358 15 56 355 131 436 +361 /data/VOCdevkit/VOC2007/JPEGImages/000701.jpg 500 333 14 132 43 499 295 +362 /data/VOCdevkit/VOC2007/JPEGImages/000703.jpg 355 500 18 1 183 290 443 +363 /data/VOCdevkit/VOC2007/JPEGImages/000704.jpg 500 355 12 13 81 235 341 14 352 22 432 123 14 270 15 351 120 12 92 90 337 343 +364 /data/VOCdevkit/VOC2007/JPEGImages/000706.jpg 500 347 0 224 187 287 235 0 139 244 199 285 0 48 284 111 330 0 118 161 180 213 0 9 107 73 156 +365 /data/VOCdevkit/VOC2007/JPEGImages/000708.jpg 500 425 2 351 183 490 369 +366 /data/VOCdevkit/VOC2007/JPEGImages/000715.jpg 500 375 6 28 96 462 355 14 196 58 245 149 +367 /data/VOCdevkit/VOC2007/JPEGImages/000716.jpg 445 500 11 96 56 315 445 +368 /data/VOCdevkit/VOC2007/JPEGImages/000718.jpg 500 375 11 148 25 358 374 1 2 1 223 249 +369 /data/VOCdevkit/VOC2007/JPEGImages/000719.jpg 500 323 5 22 91 196 268 14 244 154 264 241 14 315 133 337 215 14 367 109 388 169 14 415 164 460 270 14 382 162 422 263 14 373 154 404 257 14 436 175 485 288 +370 /data/VOCdevkit/VOC2007/JPEGImages/000721.jpg 500 375 6 95 139 434 273 +371 /data/VOCdevkit/VOC2007/JPEGImages/000722.jpg 500 375 11 189 88 366 266 +372 /data/VOCdevkit/VOC2007/JPEGImages/000723.jpg 500 375 5 95 129 458 262 14 400 206 464 351 14 318 198 365 326 14 75 188 92 243 14 1 195 29 374 +373 /data/VOCdevkit/VOC2007/JPEGImages/000724.jpg 500 375 6 62 71 500 328 +374 /data/VOCdevkit/VOC2007/JPEGImages/000725.jpg 500 333 9 350 149 387 208 9 256 168 282 213 9 179 160 215 217 9 68 162 115 215 +375 /data/VOCdevkit/VOC2007/JPEGImages/000727.jpg 375 500 5 89 323 273 436 6 272 369 323 388 6 2 380 89 435 14 333 356 358 438 14 319 357 341 424 14 354 363 375 414 6 113 138 160 164 +376 /data/VOCdevkit/VOC2007/JPEGImages/000732.jpg 334 500 18 52 232 334 450 +377 /data/VOCdevkit/VOC2007/JPEGImages/000734.jpg 500 333 14 275 89 341 256 11 382 178 460 283 +378 /data/VOCdevkit/VOC2007/JPEGImages/000735.jpg 500 295 18 27 24 500 290 14 145 118 196 258 14 357 175 392 245 +379 /data/VOCdevkit/VOC2007/JPEGImages/000736.jpg 500 333 6 3 47 500 333 +380 /data/VOCdevkit/VOC2007/JPEGImages/000737.jpg 500 332 12 255 122 401 259 4 463 197 473 227 15 434 168 500 284 +381 /data/VOCdevkit/VOC2007/JPEGImages/000741.jpg 500 375 7 28 84 287 314 7 76 41 418 374 +382 /data/VOCdevkit/VOC2007/JPEGImages/000743.jpg 500 375 18 89 25 465 347 6 55 307 86 322 +383 /data/VOCdevkit/VOC2007/JPEGImages/000744.jpg 500 375 10 19 167 359 375 14 207 105 254 194 14 272 105 342 177 14 341 120 380 184 14 355 127 407 212 14 348 163 437 314 14 346 170 480 373 14 167 116 248 217 14 126 121 205 236 14 67 128 195 278 14 15 170 125 344 14 2 181 92 373 +384 /data/VOCdevkit/VOC2007/JPEGImages/000745.jpg 500 299 10 3 40 498 299 +385 /data/VOCdevkit/VOC2007/JPEGImages/000747.jpg 500 333 6 47 16 440 316 +386 /data/VOCdevkit/VOC2007/JPEGImages/000749.jpg 500 375 10 1 100 467 375 8 244 61 452 374 8 56 104 369 375 8 1 104 203 375 +387 /data/VOCdevkit/VOC2007/JPEGImages/000751.jpg 500 333 11 79 48 412 309 +388 /data/VOCdevkit/VOC2007/JPEGImages/000757.jpg 500 333 6 47 25 479 333 +389 /data/VOCdevkit/VOC2007/JPEGImages/000758.jpg 500 375 19 8 1 454 373 14 180 71 365 298 14 153 82 224 287 +390 /data/VOCdevkit/VOC2007/JPEGImages/000759.jpg 500 375 11 124 113 493 369 +391 /data/VOCdevkit/VOC2007/JPEGImages/000762.jpg 500 375 4 29 152 118 375 14 382 61 500 261 14 143 127 266 223 14 199 140 220 187 14 4 22 124 252 +392 /data/VOCdevkit/VOC2007/JPEGImages/000765.jpg 500 375 14 1 1 446 374 +393 /data/VOCdevkit/VOC2007/JPEGImages/000766.jpg 500 333 14 111 2 483 333 +394 /data/VOCdevkit/VOC2007/JPEGImages/000769.jpg 500 333 14 8 3 482 331 14 398 14 500 186 +395 /data/VOCdevkit/VOC2007/JPEGImages/000773.jpg 500 375 2 1 30 441 375 +396 /data/VOCdevkit/VOC2007/JPEGImages/000775.jpg 500 465 13 75 265 452 459 +397 /data/VOCdevkit/VOC2007/JPEGImages/000778.jpg 500 333 6 97 111 452 240 +398 /data/VOCdevkit/VOC2007/JPEGImages/000779.jpg 500 375 16 189 85 306 270 +399 /data/VOCdevkit/VOC2007/JPEGImages/000781.jpg 500 400 14 103 66 489 400 +400 /data/VOCdevkit/VOC2007/JPEGImages/000783.jpg 480 437 14 201 57 325 259 12 112 100 441 409 +401 /data/VOCdevkit/VOC2007/JPEGImages/000784.jpg 500 375 15 1 88 75 265 14 91 107 169 371 14 157 114 211 370 14 188 96 260 363 14 236 88 292 361 14 287 83 352 351 14 329 90 380 353 14 376 100 425 342 14 114 26 157 119 14 118 64 165 117 14 153 35 191 111 14 178 49 239 134 14 233 47 293 137 14 274 57 305 129 14 302 58 340 111 14 340 45 382 124 +402 /data/VOCdevkit/VOC2007/JPEGImages/000785.jpg 500 375 11 29 40 500 317 +403 /data/VOCdevkit/VOC2007/JPEGImages/000788.jpg 240 320 6 3 19 33 32 15 41 168 118 315 15 24 52 240 231 +404 /data/VOCdevkit/VOC2007/JPEGImages/000789.jpg 500 375 16 158 163 232 231 16 230 176 328 250 16 260 158 360 233 16 344 117 382 148 +405 /data/VOCdevkit/VOC2007/JPEGImages/000790.jpg 500 334 19 139 101 196 163 +406 /data/VOCdevkit/VOC2007/JPEGImages/000792.jpg 375 500 3 163 5 283 467 +407 /data/VOCdevkit/VOC2007/JPEGImages/000795.jpg 500 333 18 1 272 500 333 +408 /data/VOCdevkit/VOC2007/JPEGImages/000798.jpg 500 333 17 1 105 500 333 14 68 117 259 333 +409 /data/VOCdevkit/VOC2007/JPEGImages/000801.jpg 500 338 6 55 139 243 221 +410 /data/VOCdevkit/VOC2007/JPEGImages/000803.jpg 500 333 7 114 88 249 256 +411 /data/VOCdevkit/VOC2007/JPEGImages/000807.jpg 334 500 14 34 31 200 500 +412 /data/VOCdevkit/VOC2007/JPEGImages/000809.jpg 500 375 6 252 119 500 213 6 118 123 149 138 6 1 124 133 201 6 26 124 479 269 +413 /data/VOCdevkit/VOC2007/JPEGImages/000811.jpg 500 375 3 149 133 337 269 +414 /data/VOCdevkit/VOC2007/JPEGImages/000813.jpg 427 500 19 58 55 390 373 +415 /data/VOCdevkit/VOC2007/JPEGImages/000817.jpg 500 281 0 227 131 291 149 +416 /data/VOCdevkit/VOC2007/JPEGImages/000819.jpg 333 500 14 71 14 322 316 1 25 158 333 394 +417 /data/VOCdevkit/VOC2007/JPEGImages/000821.jpg 448 299 2 105 50 385 178 +418 /data/VOCdevkit/VOC2007/JPEGImages/000824.jpg 500 362 18 54 105 486 323 +419 /data/VOCdevkit/VOC2007/JPEGImages/000825.jpg 500 332 1 41 47 459 294 4 242 143 282 190 +420 /data/VOCdevkit/VOC2007/JPEGImages/000833.jpg 500 393 5 12 6 450 382 +421 /data/VOCdevkit/VOC2007/JPEGImages/000835.jpg 500 335 18 207 118 305 235 18 302 91 412 246 +422 /data/VOCdevkit/VOC2007/JPEGImages/000836.jpg 318 480 14 69 99 224 297 12 93 162 226 442 +423 /data/VOCdevkit/VOC2007/JPEGImages/000837.jpg 500 275 3 261 65 365 159 +424 /data/VOCdevkit/VOC2007/JPEGImages/000838.jpg 500 400 2 196 91 361 363 +425 /data/VOCdevkit/VOC2007/JPEGImages/000839.jpg 500 375 17 93 124 277 247 17 280 124 487 291 14 263 179 417 351 14 303 110 427 241 14 266 103 365 257 14 274 96 348 206 14 217 103 280 192 14 162 107 238 194 +426 /data/VOCdevkit/VOC2007/JPEGImages/000840.jpg 500 375 17 1 179 288 345 15 334 75 385 135 +427 /data/VOCdevkit/VOC2007/JPEGImages/000841.jpg 500 375 17 1 156 492 343 +428 /data/VOCdevkit/VOC2007/JPEGImages/000844.jpg 500 333 6 70 69 394 291 +429 /data/VOCdevkit/VOC2007/JPEGImages/000846.jpg 500 400 0 123 177 165 208 0 147 213 187 243 0 174 244 213 273 0 189 211 231 241 0 213 181 251 212 0 259 185 298 215 0 190 152 230 182 0 146 142 185 173 0 168 103 206 134 +430 /data/VOCdevkit/VOC2007/JPEGImages/000852.jpg 500 223 2 249 12 463 113 2 252 91 475 152 2 23 20 238 116 2 114 70 312 214 2 14 111 213 208 +431 /data/VOCdevkit/VOC2007/JPEGImages/000853.jpg 333 500 11 51 147 333 500 +432 /data/VOCdevkit/VOC2007/JPEGImages/000856.jpg 500 375 14 174 68 311 314 10 5 190 500 375 +433 /data/VOCdevkit/VOC2007/JPEGImages/000858.jpg 500 333 5 288 146 404 250 14 71 192 104 293 14 145 195 169 284 14 105 206 119 247 +434 /data/VOCdevkit/VOC2007/JPEGImages/000861.jpg 320 240 14 1 1 315 189 +435 /data/VOCdevkit/VOC2007/JPEGImages/000864.jpg 500 333 5 4 81 486 242 +436 /data/VOCdevkit/VOC2007/JPEGImages/000866.jpg 500 375 12 133 159 376 365 14 187 107 277 298 +437 /data/VOCdevkit/VOC2007/JPEGImages/000869.jpg 335 500 14 144 192 167 243 +438 /data/VOCdevkit/VOC2007/JPEGImages/000870.jpg 500 375 14 254 146 419 315 14 3 72 309 374 14 28 170 221 375 +439 /data/VOCdevkit/VOC2007/JPEGImages/000873.jpg 335 500 13 90 40 335 500 +440 /data/VOCdevkit/VOC2007/JPEGImages/000875.jpg 500 375 16 278 171 304 202 +441 /data/VOCdevkit/VOC2007/JPEGImages/000877.jpg 500 375 7 166 107 305 283 +442 /data/VOCdevkit/VOC2007/JPEGImages/000881.jpg 500 333 6 245 156 432 256 +443 /data/VOCdevkit/VOC2007/JPEGImages/000883.jpg 500 333 6 68 94 305 277 14 151 53 217 146 14 130 114 149 143 +444 /data/VOCdevkit/VOC2007/JPEGImages/000884.jpg 500 334 16 1 99 356 334 +445 /data/VOCdevkit/VOC2007/JPEGImages/000886.jpg 500 356 14 51 3 436 356 8 4 106 351 356 14 450 124 489 195 +446 /data/VOCdevkit/VOC2007/JPEGImages/000890.jpg 500 324 15 398 148 462 310 15 361 253 411 307 15 325 189 394 309 +447 /data/VOCdevkit/VOC2007/JPEGImages/000891.jpg 500 333 1 46 193 220 333 14 57 13 271 333 +448 /data/VOCdevkit/VOC2007/JPEGImages/000893.jpg 331 500 4 53 152 73 206 4 71 152 89 206 4 88 152 109 206 4 57 223 76 256 4 75 220 95 255 4 93 220 111 254 +449 /data/VOCdevkit/VOC2007/JPEGImages/000894.jpg 374 500 13 86 88 265 412 6 5 90 35 106 +450 /data/VOCdevkit/VOC2007/JPEGImages/000897.jpg 500 375 11 241 87 380 336 11 72 124 267 322 +451 /data/VOCdevkit/VOC2007/JPEGImages/000901.jpg 500 333 14 23 22 243 331 14 308 224 376 314 +452 /data/VOCdevkit/VOC2007/JPEGImages/000905.jpg 500 375 8 161 46 500 375 +453 /data/VOCdevkit/VOC2007/JPEGImages/000907.jpg 500 333 14 196 145 346 249 3 1 153 395 332 +454 /data/VOCdevkit/VOC2007/JPEGImages/000909.jpg 375 500 14 127 182 253 500 +455 /data/VOCdevkit/VOC2007/JPEGImages/000910.jpg 500 500 14 20 27 183 500 14 112 2 249 500 14 246 233 376 490 8 231 319 356 468 +456 /data/VOCdevkit/VOC2007/JPEGImages/000913.jpg 500 377 11 3 1 306 237 14 1 179 401 377 +457 /data/VOCdevkit/VOC2007/JPEGImages/000914.jpg 375 500 3 51 2 374 423 +458 /data/VOCdevkit/VOC2007/JPEGImages/000916.jpg 500 375 14 119 110 156 245 14 4 116 22 165 5 100 38 500 328 +459 /data/VOCdevkit/VOC2007/JPEGImages/000922.jpg 500 375 18 126 94 218 224 14 242 55 347 348 +460 /data/VOCdevkit/VOC2007/JPEGImages/000924.jpg 500 375 5 281 133 397 270 5 153 133 266 267 5 15 129 167 268 +461 /data/VOCdevkit/VOC2007/JPEGImages/000925.jpg 500 353 16 29 101 216 343 16 309 105 460 333 +462 /data/VOCdevkit/VOC2007/JPEGImages/000927.jpg 500 332 14 256 155 492 332 14 82 1 316 331 +463 /data/VOCdevkit/VOC2007/JPEGImages/000928.jpg 500 375 7 24 81 204 222 7 256 116 452 269 +464 /data/VOCdevkit/VOC2007/JPEGImages/000930.jpg 500 375 14 174 72 333 248 1 139 153 345 282 +465 /data/VOCdevkit/VOC2007/JPEGImages/000932.jpg 500 333 6 35 111 497 299 +466 /data/VOCdevkit/VOC2007/JPEGImages/000933.jpg 375 500 15 117 148 341 471 +467 /data/VOCdevkit/VOC2007/JPEGImages/000938.jpg 500 375 8 319 184 434 318 8 213 170 281 241 +468 /data/VOCdevkit/VOC2007/JPEGImages/000939.jpg 375 500 14 1 59 340 461 +469 /data/VOCdevkit/VOC2007/JPEGImages/000940.jpg 500 375 14 185 81 445 355 14 128 85 224 190 8 157 163 399 375 8 48 184 200 375 +470 /data/VOCdevkit/VOC2007/JPEGImages/000941.jpg 500 399 17 14 190 500 399 +471 /data/VOCdevkit/VOC2007/JPEGImages/000942.jpg 500 333 18 62 114 500 265 18 1 133 75 194 14 216 188 264 259 14 327 120 353 148 +472 /data/VOCdevkit/VOC2007/JPEGImages/000944.jpg 500 375 14 228 98 373 375 +473 /data/VOCdevkit/VOC2007/JPEGImages/000945.jpg 450 338 6 55 79 426 230 +474 /data/VOCdevkit/VOC2007/JPEGImages/000952.jpg 500 332 14 15 95 246 332 14 196 103 412 332 14 465 189 492 236 +475 /data/VOCdevkit/VOC2007/JPEGImages/000953.jpg 500 375 8 22 187 125 351 15 222 104 268 135 +476 /data/VOCdevkit/VOC2007/JPEGImages/000955.jpg 500 332 14 139 62 385 332 +477 /data/VOCdevkit/VOC2007/JPEGImages/000956.jpg 500 375 19 163 227 398 375 14 185 56 500 374 +478 /data/VOCdevkit/VOC2007/JPEGImages/000957.jpg 500 375 11 97 21 297 375 +479 /data/VOCdevkit/VOC2007/JPEGImages/000959.jpg 500 333 14 204 22 362 139 14 51 11 201 154 14 100 108 284 332 14 226 110 407 333 14 333 83 500 333 14 1 117 150 333 +480 /data/VOCdevkit/VOC2007/JPEGImages/000960.jpg 500 401 2 93 109 203 252 2 338 109 454 224 2 192 275 356 367 2 75 293 205 370 2 358 315 477 389 2 15 44 139 90 2 10 163 97 270 +481 /data/VOCdevkit/VOC2007/JPEGImages/000961.jpg 375 500 19 122 354 222 468 6 344 134 375 194 6 317 125 365 172 +482 /data/VOCdevkit/VOC2007/JPEGImages/000963.jpg 500 333 11 1 4 381 333 +483 /data/VOCdevkit/VOC2007/JPEGImages/000968.jpg 500 333 0 17 64 472 231 +484 /data/VOCdevkit/VOC2007/JPEGImages/000969.jpg 500 375 14 224 2 500 375 14 2 5 335 375 +485 /data/VOCdevkit/VOC2007/JPEGImages/000970.jpg 500 375 18 344 128 414 214 18 1 64 500 375 +486 /data/VOCdevkit/VOC2007/JPEGImages/000974.jpg 500 334 19 22 123 147 226 +487 /data/VOCdevkit/VOC2007/JPEGImages/000975.jpg 500 474 11 111 61 485 462 +488 /data/VOCdevkit/VOC2007/JPEGImages/000976.jpg 500 430 0 2 1 500 430 +489 /data/VOCdevkit/VOC2007/JPEGImages/000978.jpg 500 375 14 189 1 486 373 14 103 3 241 375 +490 /data/VOCdevkit/VOC2007/JPEGImages/000979.jpg 375 500 13 93 261 198 394 14 98 168 190 364 14 3 143 74 404 +491 /data/VOCdevkit/VOC2007/JPEGImages/000981.jpg 333 500 14 51 18 332 500 +492 /data/VOCdevkit/VOC2007/JPEGImages/000983.jpg 375 500 15 36 70 288 486 +493 /data/VOCdevkit/VOC2007/JPEGImages/000984.jpg 333 500 14 66 308 126 498 14 43 322 57 359 6 194 323 233 351 6 1 324 38 361 6 231 294 324 347 14 112 255 184 352 +494 /data/VOCdevkit/VOC2007/JPEGImages/000985.jpg 500 357 6 1 2 500 357 +495 /data/VOCdevkit/VOC2007/JPEGImages/000986.jpg 500 322 9 258 150 390 294 9 109 151 172 212 9 51 138 169 215 9 304 146 422 230 12 141 116 300 261 14 160 62 283 236 14 322 68 354 99 +496 /data/VOCdevkit/VOC2007/JPEGImages/000988.jpg 500 375 14 76 56 401 373 +497 /data/VOCdevkit/VOC2007/JPEGImages/000990.jpg 500 334 14 208 35 460 333 14 5 34 234 334 14 6 114 55 177 14 402 134 450 187 +498 /data/VOCdevkit/VOC2007/JPEGImages/000992.jpg 500 375 16 436 197 500 268 16 362 198 440 280 16 137 204 221 300 +499 /data/VOCdevkit/VOC2007/JPEGImages/000994.jpg 500 375 19 47 124 153 213 8 310 147 419 236 17 210 188 472 374 +500 /data/VOCdevkit/VOC2007/JPEGImages/000995.jpg 500 375 3 1 72 281 314 3 402 128 500 326 +501 /data/VOCdevkit/VOC2007/JPEGImages/000998.jpg 333 500 7 2 80 333 500 +502 /data/VOCdevkit/VOC2007/JPEGImages/001000.jpg 500 325 11 2 1 500 325 +503 /data/VOCdevkit/VOC2007/JPEGImages/001003.jpg 500 333 6 111 102 351 254 +504 /data/VOCdevkit/VOC2007/JPEGImages/001005.jpg 500 404 6 38 149 268 258 +505 /data/VOCdevkit/VOC2007/JPEGImages/001006.jpg 500 375 14 1 248 68 375 2 178 142 312 251 +506 /data/VOCdevkit/VOC2007/JPEGImages/001007.jpg 500 375 19 132 117 380 336 +507 /data/VOCdevkit/VOC2007/JPEGImages/001013.jpg 500 333 12 220 15 500 333 +508 /data/VOCdevkit/VOC2007/JPEGImages/001016.jpg 500 333 18 206 135 483 237 +509 /data/VOCdevkit/VOC2007/JPEGImages/001019.jpg 375 500 7 3 1 375 405 +510 /data/VOCdevkit/VOC2007/JPEGImages/001020.jpg 375 500 14 75 63 287 500 +511 /data/VOCdevkit/VOC2007/JPEGImages/001021.jpg 500 375 8 138 34 465 375 14 1 51 183 375 14 199 40 401 375 4 75 223 121 290 +512 /data/VOCdevkit/VOC2007/JPEGImages/001022.jpg 500 305 6 5 139 490 295 +513 /data/VOCdevkit/VOC2007/JPEGImages/001023.jpg 500 400 8 408 270 500 400 10 1 294 415 400 +514 /data/VOCdevkit/VOC2007/JPEGImages/001025.jpg 375 500 8 1 146 371 500 +515 /data/VOCdevkit/VOC2007/JPEGImages/001026.jpg 333 500 11 209 54 333 118 11 70 238 217 404 14 152 89 325 408 14 75 1 198 247 +516 /data/VOCdevkit/VOC2007/JPEGImages/001029.jpg 500 375 19 242 43 454 238 +517 /data/VOCdevkit/VOC2007/JPEGImages/001030.jpg 500 322 18 36 77 442 265 +518 /data/VOCdevkit/VOC2007/JPEGImages/001031.jpg 347 500 14 43 46 227 211 13 85 174 314 454 +519 /data/VOCdevkit/VOC2007/JPEGImages/001032.jpg 500 375 7 95 4 500 375 +520 /data/VOCdevkit/VOC2007/JPEGImages/001033.jpg 359 500 14 145 98 310 386 1 155 231 315 474 +521 /data/VOCdevkit/VOC2007/JPEGImages/001034.jpg 500 375 6 196 196 452 316 +522 /data/VOCdevkit/VOC2007/JPEGImages/001035.jpg 500 375 10 1 146 242 350 14 296 64 423 333 14 210 56 323 341 14 1 6 89 170 +523 /data/VOCdevkit/VOC2007/JPEGImages/001037.jpg 500 256 11 321 98 479 210 11 163 114 327 236 11 101 131 185 218 11 1 116 115 222 14 53 24 145 140 +524 /data/VOCdevkit/VOC2007/JPEGImages/001038.jpg 500 410 14 162 91 452 410 +525 /data/VOCdevkit/VOC2007/JPEGImages/001039.jpg 500 375 8 175 224 298 375 19 172 153 213 199 19 224 156 270 203 19 295 153 355 205 19 380 159 435 223 19 173 75 209 117 +526 /data/VOCdevkit/VOC2007/JPEGImages/001040.jpg 500 333 14 126 125 229 332 14 135 112 366 331 14 362 200 479 333 +527 /data/VOCdevkit/VOC2007/JPEGImages/001044.jpg 392 184 11 202 42 344 129 11 18 38 163 138 +528 /data/VOCdevkit/VOC2007/JPEGImages/001046.jpg 500 281 0 15 117 430 243 +529 /data/VOCdevkit/VOC2007/JPEGImages/001047.jpg 500 375 4 92 15 107 61 14 74 52 211 242 14 188 58 338 251 14 344 3 482 261 +530 /data/VOCdevkit/VOC2007/JPEGImages/001048.jpg 500 375 7 170 88 376 248 +531 /data/VOCdevkit/VOC2007/JPEGImages/001049.jpg 500 224 3 103 68 256 165 +532 /data/VOCdevkit/VOC2007/JPEGImages/001051.jpg 500 375 2 222 85 322 298 +533 /data/VOCdevkit/VOC2007/JPEGImages/001054.jpg 333 500 11 17 30 333 443 +534 /data/VOCdevkit/VOC2007/JPEGImages/001055.jpg 500 334 14 139 102 440 334 8 136 123 500 334 +535 /data/VOCdevkit/VOC2007/JPEGImages/001058.jpg 456 342 6 9 105 449 242 +536 /data/VOCdevkit/VOC2007/JPEGImages/001059.jpg 500 374 3 125 242 271 292 +537 /data/VOCdevkit/VOC2007/JPEGImages/001063.jpg 480 318 12 2 174 480 318 14 221 60 319 318 +538 /data/VOCdevkit/VOC2007/JPEGImages/001065.jpg 500 375 14 128 1 234 124 14 196 75 500 346 14 2 62 499 375 +539 /data/VOCdevkit/VOC2007/JPEGImages/001067.jpg 500 375 17 3 68 481 375 14 89 45 219 375 14 178 40 291 331 14 239 17 394 275 +540 /data/VOCdevkit/VOC2007/JPEGImages/001070.jpg 500 401 15 89 15 174 108 15 177 5 263 116 15 269 5 348 119 15 90 70 189 206 15 175 125 279 216 15 284 10 404 215 15 369 51 454 170 15 74 204 169 329 15 137 210 288 325 15 281 219 422 329 15 362 208 478 322 15 400 267 499 357 15 106 327 230 401 15 230 335 301 401 +541 /data/VOCdevkit/VOC2007/JPEGImages/001075.jpg 500 375 11 223 148 407 231 7 58 147 112 284 +542 /data/VOCdevkit/VOC2007/JPEGImages/001076.jpg 500 375 3 27 81 224 141 3 418 83 496 120 14 114 114 328 375 +543 /data/VOCdevkit/VOC2007/JPEGImages/001080.jpg 500 375 0 3 45 500 227 6 137 213 191 255 +544 /data/VOCdevkit/VOC2007/JPEGImages/001081.jpg 500 375 8 147 176 283 375 19 403 153 461 230 +545 /data/VOCdevkit/VOC2007/JPEGImages/001085.jpg 500 375 6 68 15 447 314 14 440 3 483 112 14 2 2 86 204 14 101 1 128 71 14 414 1 426 48 14 421 1 444 58 +546 /data/VOCdevkit/VOC2007/JPEGImages/001086.jpg 500 375 14 299 49 500 358 14 2 37 249 349 4 303 230 366 375 +547 /data/VOCdevkit/VOC2007/JPEGImages/001087.jpg 250 333 8 20 68 240 307 +548 /data/VOCdevkit/VOC2007/JPEGImages/001088.jpg 500 375 11 2 1 418 375 +549 /data/VOCdevkit/VOC2007/JPEGImages/001089.jpg 500 375 1 12 86 457 328 +550 /data/VOCdevkit/VOC2007/JPEGImages/001090.jpg 500 356 6 18 159 474 287 +551 /data/VOCdevkit/VOC2007/JPEGImages/001094.jpg 500 333 18 2 167 347 212 +552 /data/VOCdevkit/VOC2007/JPEGImages/001095.jpg 500 363 14 260 134 359 348 14 205 165 284 253 14 175 122 237 262 +553 /data/VOCdevkit/VOC2007/JPEGImages/001096.jpg 500 375 14 175 39 334 225 1 150 141 371 322 +554 /data/VOCdevkit/VOC2007/JPEGImages/001098.jpg 375 500 7 46 18 375 500 +555 /data/VOCdevkit/VOC2007/JPEGImages/001099.jpg 500 375 0 3 97 500 327 14 66 257 86 301 14 409 240 433 319 14 86 241 106 298 14 433 239 468 318 +556 /data/VOCdevkit/VOC2007/JPEGImages/001100.jpg 500 375 9 152 146 327 284 +557 /data/VOCdevkit/VOC2007/JPEGImages/001103.jpg 500 375 9 135 121 333 366 +558 /data/VOCdevkit/VOC2007/JPEGImages/001105.jpg 500 375 10 2 219 335 375 14 203 88 423 374 14 443 42 500 375 4 124 176 142 239 4 83 188 113 254 +559 /data/VOCdevkit/VOC2007/JPEGImages/001108.jpg 500 375 14 87 127 238 375 14 270 49 500 375 14 213 163 308 373 +560 /data/VOCdevkit/VOC2007/JPEGImages/001111.jpg 500 333 6 386 244 426 270 6 110 247 167 290 +561 /data/VOCdevkit/VOC2007/JPEGImages/001114.jpg 500 333 12 206 110 401 302 +562 /data/VOCdevkit/VOC2007/JPEGImages/001115.jpg 500 335 18 104 113 500 261 18 1 117 86 229 +563 /data/VOCdevkit/VOC2007/JPEGImages/001116.jpg 500 357 14 29 30 500 356 +564 /data/VOCdevkit/VOC2007/JPEGImages/001117.jpg 500 375 17 6 206 474 375 +565 /data/VOCdevkit/VOC2007/JPEGImages/001118.jpg 500 326 14 217 88 419 326 14 15 38 235 326 14 40 4 227 225 14 440 1 482 63 +566 /data/VOCdevkit/VOC2007/JPEGImages/001120.jpg 500 319 9 9 124 44 152 9 119 159 169 193 9 217 186 281 234 9 284 193 352 241 9 409 210 468 259 +567 /data/VOCdevkit/VOC2007/JPEGImages/001122.jpg 374 499 2 74 22 345 499 +568 /data/VOCdevkit/VOC2007/JPEGImages/001123.jpg 500 333 11 196 27 440 299 +569 /data/VOCdevkit/VOC2007/JPEGImages/001126.jpg 500 333 0 155 70 345 279 +570 /data/VOCdevkit/VOC2007/JPEGImages/001128.jpg 500 375 7 1 110 301 300 +571 /data/VOCdevkit/VOC2007/JPEGImages/001131.jpg 500 333 11 78 24 414 266 +572 /data/VOCdevkit/VOC2007/JPEGImages/001132.jpg 500 333 7 21 93 404 286 +573 /data/VOCdevkit/VOC2007/JPEGImages/001133.jpg 500 375 17 1 208 433 375 14 264 159 404 375 14 181 192 273 375 14 64 202 184 375 +574 /data/VOCdevkit/VOC2007/JPEGImages/001134.jpg 500 362 13 56 176 143 302 13 174 186 309 279 +575 /data/VOCdevkit/VOC2007/JPEGImages/001135.jpg 500 333 6 147 82 393 258 +576 /data/VOCdevkit/VOC2007/JPEGImages/001138.jpg 500 375 8 278 184 351 291 8 150 195 228 305 8 144 254 217 368 19 257 150 292 192 19 143 156 190 206 19 1 163 26 217 +577 /data/VOCdevkit/VOC2007/JPEGImages/001139.jpg 500 375 8 1 153 111 359 8 52 128 157 318 +578 /data/VOCdevkit/VOC2007/JPEGImages/001141.jpg 500 375 3 355 85 404 110 3 261 172 412 368 14 217 118 242 209 14 171 124 197 195 14 146 118 176 212 14 51 192 99 308 14 12 194 53 311 15 219 23 245 41 +579 /data/VOCdevkit/VOC2007/JPEGImages/001146.jpg 148 316 11 37 32 122 272 +580 /data/VOCdevkit/VOC2007/JPEGImages/001150.jpg 500 375 11 174 89 397 375 14 1 1 387 375 14 1 1 203 199 +581 /data/VOCdevkit/VOC2007/JPEGImages/001153.jpg 500 375 0 146 198 358 269 +582 /data/VOCdevkit/VOC2007/JPEGImages/001155.jpg 500 375 3 22 134 336 308 +583 /data/VOCdevkit/VOC2007/JPEGImages/001157.jpg 500 333 13 11 27 440 287 14 426 1 466 83 14 461 1 500 89 +584 /data/VOCdevkit/VOC2007/JPEGImages/001159.jpg 500 373 17 2 240 500 373 14 238 241 314 340 +585 /data/VOCdevkit/VOC2007/JPEGImages/001162.jpg 500 375 17 196 125 489 327 +586 /data/VOCdevkit/VOC2007/JPEGImages/001163.jpg 500 375 17 47 187 315 375 8 351 180 500 358 10 43 150 245 223 8 2 144 76 288 +587 /data/VOCdevkit/VOC2007/JPEGImages/001165.jpg 333 500 1 115 311 191 348 1 192 317 266 358 14 274 252 313 355 14 252 243 282 352 +588 /data/VOCdevkit/VOC2007/JPEGImages/001167.jpg 500 357 14 1 6 160 166 14 157 19 481 357 4 1 94 43 357 +589 /data/VOCdevkit/VOC2007/JPEGImages/001169.jpg 500 333 14 107 43 327 181 8 12 92 80 212 8 22 131 138 262 14 237 124 383 279 14 103 120 259 289 +590 /data/VOCdevkit/VOC2007/JPEGImages/001173.jpg 500 333 7 334 45 498 284 14 3 52 378 333 +591 /data/VOCdevkit/VOC2007/JPEGImages/001177.jpg 500 374 4 14 115 90 373 14 202 122 465 348 14 103 129 270 268 +592 /data/VOCdevkit/VOC2007/JPEGImages/001178.jpg 500 335 18 1 126 500 175 +593 /data/VOCdevkit/VOC2007/JPEGImages/001179.jpg 500 375 8 178 147 341 373 8 4 202 145 374 10 21 170 274 373 +594 /data/VOCdevkit/VOC2007/JPEGImages/001180.jpg 333 500 15 175 263 266 426 14 39 115 333 500 +595 /data/VOCdevkit/VOC2007/JPEGImages/001181.jpg 500 333 2 99 103 268 284 +596 /data/VOCdevkit/VOC2007/JPEGImages/001183.jpg 500 375 12 79 163 187 281 12 138 121 349 356 14 227 89 286 245 +597 /data/VOCdevkit/VOC2007/JPEGImages/001188.jpg 500 375 3 288 95 318 124 3 344 63 377 87 3 325 97 359 123 3 376 96 408 125 3 404 64 445 86 3 180 187 248 262 3 58 110 136 158 3 132 96 176 135 3 451 131 500 173 +598 /data/VOCdevkit/VOC2007/JPEGImages/001189.jpg 374 500 10 107 266 278 422 8 252 262 342 420 8 259 252 324 388 8 247 248 298 356 8 143 274 246 465 8 60 249 126 325 8 44 258 129 415 +599 /data/VOCdevkit/VOC2007/JPEGImages/001190.jpg 500 375 11 88 160 411 375 +600 /data/VOCdevkit/VOC2007/JPEGImages/001193.jpg 375 500 1 1 1 374 500 +601 /data/VOCdevkit/VOC2007/JPEGImages/001195.jpg 500 375 11 139 51 327 321 +602 /data/VOCdevkit/VOC2007/JPEGImages/001196.jpg 342 500 2 89 118 286 408 +603 /data/VOCdevkit/VOC2007/JPEGImages/001197.jpg 500 333 17 33 26 496 313 +604 /data/VOCdevkit/VOC2007/JPEGImages/001198.jpg 500 375 6 1 2 422 372 14 376 103 408 162 +605 /data/VOCdevkit/VOC2007/JPEGImages/001202.jpg 500 375 11 1 159 252 251 11 220 30 391 236 +606 /data/VOCdevkit/VOC2007/JPEGImages/001208.jpg 500 375 7 247 1 500 260 +607 /data/VOCdevkit/VOC2007/JPEGImages/001210.jpg 500 375 14 277 259 307 316 14 279 186 309 262 14 224 214 250 306 14 196 199 220 276 14 5 202 45 307 14 2 204 16 280 +608 /data/VOCdevkit/VOC2007/JPEGImages/001213.jpg 375 500 1 234 376 375 471 +609 /data/VOCdevkit/VOC2007/JPEGImages/001216.jpg 500 375 7 316 64 380 159 7 1 137 196 250 +610 /data/VOCdevkit/VOC2007/JPEGImages/001217.jpg 500 375 11 31 142 224 330 11 237 94 500 200 11 274 259 475 375 11 201 160 500 326 +611 /data/VOCdevkit/VOC2007/JPEGImages/001218.jpg 500 375 5 21 76 471 276 +612 /data/VOCdevkit/VOC2007/JPEGImages/001219.jpg 500 332 18 100 169 178 310 +613 /data/VOCdevkit/VOC2007/JPEGImages/001220.jpg 500 375 17 1 54 430 375 11 1 127 385 375 14 1 4 384 375 +614 /data/VOCdevkit/VOC2007/JPEGImages/001222.jpg 500 375 14 9 189 46 252 8 1 299 43 375 6 112 183 471 328 6 107 146 243 196 +615 /data/VOCdevkit/VOC2007/JPEGImages/001223.jpg 500 333 0 15 120 486 254 +616 /data/VOCdevkit/VOC2007/JPEGImages/001227.jpg 375 500 3 1 1 375 442 14 276 305 310 352 14 108 306 144 376 +617 /data/VOCdevkit/VOC2007/JPEGImages/001228.jpg 500 374 7 211 209 309 349 14 320 2 500 241 14 181 39 288 235 14 135 27 189 229 14 65 26 134 230 14 16 42 105 237 14 411 9 465 72 14 299 23 360 237 14 259 38 315 237 14 1 48 40 126 +618 /data/VOCdevkit/VOC2007/JPEGImages/001232.jpg 500 333 11 128 34 378 316 +619 /data/VOCdevkit/VOC2007/JPEGImages/001235.jpg 500 375 2 134 121 208 265 2 314 157 404 313 +620 /data/VOCdevkit/VOC2007/JPEGImages/001238.jpg 375 500 14 174 147 257 320 1 171 227 252 358 +621 /data/VOCdevkit/VOC2007/JPEGImages/001242.jpg 500 333 14 1 12 310 333 +622 /data/VOCdevkit/VOC2007/JPEGImages/001243.jpg 308 500 14 88 15 278 491 +623 /data/VOCdevkit/VOC2007/JPEGImages/001244.jpg 500 375 8 3 154 63 265 4 454 13 493 112 4 254 121 269 177 14 16 114 237 366 14 255 1 475 373 14 358 63 500 375 +624 /data/VOCdevkit/VOC2007/JPEGImages/001245.jpg 500 375 12 238 103 358 252 14 192 146 235 191 12 3 123 33 216 +625 /data/VOCdevkit/VOC2007/JPEGImages/001246.jpg 500 376 8 178 202 473 376 +626 /data/VOCdevkit/VOC2007/JPEGImages/001249.jpg 375 500 7 2 319 340 477 +627 /data/VOCdevkit/VOC2007/JPEGImages/001251.jpg 500 333 14 129 93 160 128 14 18 11 101 154 14 1 65 22 121 14 1 15 351 333 +628 /data/VOCdevkit/VOC2007/JPEGImages/001252.jpg 500 421 6 61 87 429 350 +629 /data/VOCdevkit/VOC2007/JPEGImages/001253.jpg 375 500 14 271 84 375 442 +630 /data/VOCdevkit/VOC2007/JPEGImages/001255.jpg 500 375 15 1 2 379 375 15 291 2 500 375 +631 /data/VOCdevkit/VOC2007/JPEGImages/001256.jpg 500 375 14 385 194 429 352 1 443 188 500 322 1 416 196 472 315 +632 /data/VOCdevkit/VOC2007/JPEGImages/001257.jpg 427 320 11 94 32 312 320 +633 /data/VOCdevkit/VOC2007/JPEGImages/001261.jpg 500 375 8 1 153 494 375 14 61 18 301 343 14 72 123 331 375 14 256 95 493 375 +634 /data/VOCdevkit/VOC2007/JPEGImages/001262.jpg 500 400 2 41 31 359 372 +635 /data/VOCdevkit/VOC2007/JPEGImages/001264.jpg 500 375 13 69 25 447 348 +636 /data/VOCdevkit/VOC2007/JPEGImages/001267.jpg 500 375 6 318 200 500 296 14 106 207 140 256 14 238 189 270 261 6 125 205 178 242 +637 /data/VOCdevkit/VOC2007/JPEGImages/001271.jpg 500 375 14 304 1 405 125 16 293 61 347 137 16 44 24 500 375 14 174 1 218 65 +638 /data/VOCdevkit/VOC2007/JPEGImages/001275.jpg 500 375 2 171 124 244 280 2 322 206 394 276 2 216 144 286 227 2 288 147 326 213 2 256 129 299 173 2 203 73 238 106 +639 /data/VOCdevkit/VOC2007/JPEGImages/001276.jpg 500 375 8 118 163 200 223 8 141 175 238 331 8 12 220 184 374 8 309 160 397 288 8 392 176 476 308 15 36 153 82 216 +640 /data/VOCdevkit/VOC2007/JPEGImages/001278.jpg 500 375 18 2 1 500 351 +641 /data/VOCdevkit/VOC2007/JPEGImages/001280.jpg 500 333 6 63 76 480 298 +642 /data/VOCdevkit/VOC2007/JPEGImages/001282.jpg 500 334 14 241 40 397 334 14 30 64 238 333 11 107 117 213 294 +643 /data/VOCdevkit/VOC2007/JPEGImages/001283.jpg 500 375 6 233 147 375 199 +644 /data/VOCdevkit/VOC2007/JPEGImages/001285.jpg 500 333 13 204 138 458 285 13 78 128 241 258 +645 /data/VOCdevkit/VOC2007/JPEGImages/001291.jpg 500 375 6 8 15 500 365 +646 /data/VOCdevkit/VOC2007/JPEGImages/001295.jpg 375 500 4 75 4 315 498 +647 /data/VOCdevkit/VOC2007/JPEGImages/001296.jpg 500 375 14 179 47 333 300 13 72 95 408 328 +648 /data/VOCdevkit/VOC2007/JPEGImages/001297.jpg 375 500 17 1 136 366 500 14 1 86 330 409 +649 /data/VOCdevkit/VOC2007/JPEGImages/001300.jpg 325 500 12 71 103 255 457 +650 /data/VOCdevkit/VOC2007/JPEGImages/001301.jpg 500 375 13 22 18 372 375 14 345 16 426 375 14 386 1 500 375 +651 /data/VOCdevkit/VOC2007/JPEGImages/001302.jpg 500 375 8 2 216 202 374 10 4 160 489 375 +652 /data/VOCdevkit/VOC2007/JPEGImages/001303.jpg 500 375 14 1 1 431 375 +653 /data/VOCdevkit/VOC2007/JPEGImages/001305.jpg 500 333 0 48 110 380 248 +654 /data/VOCdevkit/VOC2007/JPEGImages/001306.jpg 500 337 11 173 136 287 202 +655 /data/VOCdevkit/VOC2007/JPEGImages/001307.jpg 500 334 1 267 136 367 270 14 375 85 408 143 14 353 82 373 136 14 338 90 358 114 14 200 56 237 128 14 19 8 270 334 14 372 63 476 334 14 287 63 356 192 14 458 79 496 128 14 168 67 196 95 +656 /data/VOCdevkit/VOC2007/JPEGImages/001308.jpg 500 375 6 114 76 484 374 6 401 57 472 106 +657 /data/VOCdevkit/VOC2007/JPEGImages/001313.jpg 413 500 7 154 23 294 193 +658 /data/VOCdevkit/VOC2007/JPEGImages/001317.jpg 194 264 12 16 11 181 254 +659 /data/VOCdevkit/VOC2007/JPEGImages/001318.jpg 500 375 5 206 182 368 251 +660 /data/VOCdevkit/VOC2007/JPEGImages/001319.jpg 500 375 8 68 204 254 375 14 111 99 266 340 +661 /data/VOCdevkit/VOC2007/JPEGImages/001320.jpg 500 332 14 236 55 302 214 12 171 93 407 290 +662 /data/VOCdevkit/VOC2007/JPEGImages/001321.jpg 500 333 6 1 98 456 333 +663 /data/VOCdevkit/VOC2007/JPEGImages/001322.jpg 500 375 11 1 15 500 375 +664 /data/VOCdevkit/VOC2007/JPEGImages/001328.jpg 500 375 11 133 114 322 319 +665 /data/VOCdevkit/VOC2007/JPEGImages/001329.jpg 500 375 1 288 229 450 333 14 58 149 82 192 +666 /data/VOCdevkit/VOC2007/JPEGImages/001331.jpg 500 375 6 77 37 403 311 6 449 125 500 227 6 380 142 452 200 +667 /data/VOCdevkit/VOC2007/JPEGImages/001335.jpg 500 334 6 1 182 93 271 +668 /data/VOCdevkit/VOC2007/JPEGImages/001336.jpg 500 356 14 125 29 288 251 1 68 114 330 269 +669 /data/VOCdevkit/VOC2007/JPEGImages/001338.jpg 500 375 19 248 58 337 128 17 3 209 263 375 +670 /data/VOCdevkit/VOC2007/JPEGImages/001339.jpg 500 358 11 52 11 447 337 +671 /data/VOCdevkit/VOC2007/JPEGImages/001340.jpg 500 375 11 326 284 500 375 8 213 48 406 266 14 150 140 252 375 14 92 111 331 374 +672 /data/VOCdevkit/VOC2007/JPEGImages/001342.jpg 500 333 14 312 168 489 326 3 194 36 270 157 +673 /data/VOCdevkit/VOC2007/JPEGImages/001344.jpg 500 375 16 60 60 374 375 +674 /data/VOCdevkit/VOC2007/JPEGImages/001347.jpg 500 375 14 113 65 450 375 14 203 63 493 357 +675 /data/VOCdevkit/VOC2007/JPEGImages/001349.jpg 500 375 4 86 323 134 375 +676 /data/VOCdevkit/VOC2007/JPEGImages/001351.jpg 500 375 14 399 85 500 375 14 61 177 255 375 14 49 139 152 344 +677 /data/VOCdevkit/VOC2007/JPEGImages/001353.jpg 500 333 11 121 108 339 331 14 95 2 368 332 14 3 26 95 330 +678 /data/VOCdevkit/VOC2007/JPEGImages/001354.jpg 480 361 4 337 263 376 361 4 98 199 122 277 10 2 214 480 361 14 2 47 157 255 14 192 71 398 267 14 114 46 188 216 14 183 33 264 210 +679 /data/VOCdevkit/VOC2007/JPEGImages/001355.jpg 500 375 3 68 118 500 375 +680 /data/VOCdevkit/VOC2007/JPEGImages/001356.jpg 500 333 6 26 61 500 294 +681 /data/VOCdevkit/VOC2007/JPEGImages/001357.jpg 500 375 13 43 89 442 351 14 119 25 227 227 +682 /data/VOCdevkit/VOC2007/JPEGImages/001358.jpg 500 333 14 50 90 166 287 14 180 152 290 252 14 115 54 143 91 6 338 5 433 42 +683 /data/VOCdevkit/VOC2007/JPEGImages/001359.jpg 500 335 18 201 53 376 265 +684 /data/VOCdevkit/VOC2007/JPEGImages/001363.jpg 500 363 19 177 33 500 355 19 1 36 179 327 14 360 101 436 194 14 302 103 357 190 14 219 100 288 178 +685 /data/VOCdevkit/VOC2007/JPEGImages/001366.jpg 500 375 11 286 271 351 330 11 102 261 139 329 14 209 149 262 275 14 257 149 296 280 14 282 165 375 331 14 57 179 122 330 +686 /data/VOCdevkit/VOC2007/JPEGImages/001367.jpg 500 375 19 115 65 265 240 19 267 59 440 241 +687 /data/VOCdevkit/VOC2007/JPEGImages/001368.jpg 375 500 14 93 29 301 310 +688 /data/VOCdevkit/VOC2007/JPEGImages/001369.jpg 333 500 6 19 101 330 433 6 26 45 282 157 +689 /data/VOCdevkit/VOC2007/JPEGImages/001370.jpg 333 500 1 44 217 190 500 1 199 195 301 464 14 22 48 221 454 14 196 57 331 420 +690 /data/VOCdevkit/VOC2007/JPEGImages/001372.jpg 333 500 14 300 76 333 233 14 185 72 294 476 +691 /data/VOCdevkit/VOC2007/JPEGImages/001373.jpg 500 333 0 5 68 497 210 +692 /data/VOCdevkit/VOC2007/JPEGImages/001374.jpg 500 375 17 323 204 500 374 +693 /data/VOCdevkit/VOC2007/JPEGImages/001376.jpg 500 375 6 383 241 426 274 14 202 186 306 375 +694 /data/VOCdevkit/VOC2007/JPEGImages/001377.jpg 500 366 0 273 163 318 250 +695 /data/VOCdevkit/VOC2007/JPEGImages/001379.jpg 500 375 6 33 31 475 337 +696 /data/VOCdevkit/VOC2007/JPEGImages/001380.jpg 500 319 15 394 200 496 298 +697 /data/VOCdevkit/VOC2007/JPEGImages/001381.jpg 500 333 7 113 43 500 333 +698 /data/VOCdevkit/VOC2007/JPEGImages/001382.jpg 500 333 6 96 227 288 324 6 298 257 421 327 6 421 254 500 333 6 305 227 470 273 6 284 246 329 284 6 16 231 105 287 14 46 241 70 314 14 1 239 25 315 14 76 233 104 295 +699 /data/VOCdevkit/VOC2007/JPEGImages/001389.jpg 500 375 7 222 163 461 333 +700 /data/VOCdevkit/VOC2007/JPEGImages/001391.jpg 500 375 17 7 174 348 375 15 360 16 407 86 +701 /data/VOCdevkit/VOC2007/JPEGImages/001392.jpg 500 375 19 382 18 500 186 7 46 64 486 329 14 433 45 500 179 +702 /data/VOCdevkit/VOC2007/JPEGImages/001394.jpg 500 333 3 43 97 109 135 6 132 34 500 290 +703 /data/VOCdevkit/VOC2007/JPEGImages/001396.jpg 500 375 14 224 199 265 277 14 284 198 316 298 +704 /data/VOCdevkit/VOC2007/JPEGImages/001398.jpg 250 175 12 18 5 216 175 +705 /data/VOCdevkit/VOC2007/JPEGImages/001399.jpg 500 375 2 122 206 180 248 2 182 188 246 233 +706 /data/VOCdevkit/VOC2007/JPEGImages/001401.jpg 500 375 7 109 123 433 279 +707 /data/VOCdevkit/VOC2007/JPEGImages/001403.jpg 500 332 1 50 170 128 228 1 129 170 206 237 1 246 173 329 250 1 368 187 475 264 14 69 141 100 230 14 99 135 131 228 14 187 129 234 279 14 235 118 275 246 14 320 135 344 260 14 330 138 377 274 14 376 132 417 268 +708 /data/VOCdevkit/VOC2007/JPEGImages/001407.jpg 500 375 8 425 273 500 374 8 32 246 97 340 8 14 223 65 313 4 227 223 244 267 +709 /data/VOCdevkit/VOC2007/JPEGImages/001410.jpg 500 308 3 189 46 349 259 3 33 2 98 97 3 160 2 194 77 3 209 1 251 34 3 302 65 355 94 3 364 49 421 80 3 436 32 496 63 +710 /data/VOCdevkit/VOC2007/JPEGImages/001411.jpg 500 333 14 2 89 152 256 14 164 18 500 333 15 193 35 269 214 +711 /data/VOCdevkit/VOC2007/JPEGImages/001412.jpg 500 332 12 179 101 394 285 14 217 83 313 289 +712 /data/VOCdevkit/VOC2007/JPEGImages/001415.jpg 500 333 2 361 257 412 310 +713 /data/VOCdevkit/VOC2007/JPEGImages/001416.jpg 500 328 16 208 78 401 192 16 19 71 183 195 16 1 106 121 249 16 1 185 324 328 +714 /data/VOCdevkit/VOC2007/JPEGImages/001417.jpg 480 396 14 183 43 302 205 12 55 85 367 376 +715 /data/VOCdevkit/VOC2007/JPEGImages/001419.jpg 333 500 14 133 15 333 412 14 42 29 205 280 8 57 1 206 128 +716 /data/VOCdevkit/VOC2007/JPEGImages/001422.jpg 500 333 6 68 87 453 278 +717 /data/VOCdevkit/VOC2007/JPEGImages/001423.jpg 500 333 14 124 56 382 333 +718 /data/VOCdevkit/VOC2007/JPEGImages/001424.jpg 375 500 5 261 316 319 402 14 141 336 167 416 14 188 360 204 407 +719 /data/VOCdevkit/VOC2007/JPEGImages/001425.jpg 500 400 2 208 179 383 301 +720 /data/VOCdevkit/VOC2007/JPEGImages/001428.jpg 500 375 7 155 187 436 352 6 243 141 402 225 +721 /data/VOCdevkit/VOC2007/JPEGImages/001429.jpg 500 372 4 420 98 473 226 4 453 71 498 184 14 1 54 498 369 +722 /data/VOCdevkit/VOC2007/JPEGImages/001431.jpg 500 375 4 22 128 87 277 14 300 3 417 163 +723 /data/VOCdevkit/VOC2007/JPEGImages/001433.jpg 500 375 0 15 87 479 254 +724 /data/VOCdevkit/VOC2007/JPEGImages/001435.jpg 500 375 6 242 232 461 312 6 10 258 249 347 6 12 177 104 209 6 151 184 251 227 6 226 188 343 231 6 294 180 371 206 6 401 172 482 212 14 135 171 146 229 +725 /data/VOCdevkit/VOC2007/JPEGImages/001437.jpg 500 333 15 3 78 44 264 15 43 57 160 241 15 19 100 97 277 14 143 44 394 129 +726 /data/VOCdevkit/VOC2007/JPEGImages/001438.jpg 375 500 10 1 119 369 500 14 149 8 358 256 +727 /data/VOCdevkit/VOC2007/JPEGImages/001440.jpg 500 356 2 49 75 402 272 +728 /data/VOCdevkit/VOC2007/JPEGImages/001446.jpg 335 500 13 109 211 299 392 14 101 185 264 332 +729 /data/VOCdevkit/VOC2007/JPEGImages/001447.jpg 500 375 13 140 125 419 318 14 165 39 327 295 +730 /data/VOCdevkit/VOC2007/JPEGImages/001448.jpg 375 500 14 149 247 209 409 14 8 231 156 500 +731 /data/VOCdevkit/VOC2007/JPEGImages/001449.jpg 500 306 18 322 81 422 203 18 23 87 164 221 18 197 86 288 213 +732 /data/VOCdevkit/VOC2007/JPEGImages/001452.jpg 375 500 12 85 278 223 500 14 94 142 252 350 +733 /data/VOCdevkit/VOC2007/JPEGImages/001454.jpg 500 375 14 252 169 300 307 +734 /data/VOCdevkit/VOC2007/JPEGImages/001456.jpg 500 332 4 37 62 112 332 4 118 77 181 332 14 268 2 500 332 +735 /data/VOCdevkit/VOC2007/JPEGImages/001458.jpg 500 333 17 106 121 392 299 +736 /data/VOCdevkit/VOC2007/JPEGImages/001459.jpg 500 375 14 132 121 281 375 14 250 122 373 375 14 134 173 148 213 14 114 182 140 213 +737 /data/VOCdevkit/VOC2007/JPEGImages/001461.jpg 500 375 17 142 177 412 375 +738 /data/VOCdevkit/VOC2007/JPEGImages/001462.jpg 500 375 7 135 161 278 285 +739 /data/VOCdevkit/VOC2007/JPEGImages/001469.jpg 375 500 14 107 102 199 460 15 269 335 325 390 15 292 270 375 376 +740 /data/VOCdevkit/VOC2007/JPEGImages/001471.jpg 375 500 9 160 131 312 394 +741 /data/VOCdevkit/VOC2007/JPEGImages/001473.jpg 375 500 14 64 106 209 500 14 183 88 331 500 +742 /data/VOCdevkit/VOC2007/JPEGImages/001474.jpg 500 221 3 104 84 467 141 14 369 16 428 118 +743 /data/VOCdevkit/VOC2007/JPEGImages/001476.jpg 500 331 13 199 143 327 266 14 200 56 302 217 14 461 107 482 160 6 325 99 404 131 14 29 99 47 141 13 88 115 129 145 13 381 126 411 145 +744 /data/VOCdevkit/VOC2007/JPEGImages/001477.jpg 500 375 16 196 84 458 287 16 93 172 227 312 16 37 202 208 338 16 13 1 77 84 +745 /data/VOCdevkit/VOC2007/JPEGImages/001478.jpg 500 331 15 241 124 429 300 +746 /data/VOCdevkit/VOC2007/JPEGImages/001482.jpg 500 375 14 2 195 48 375 14 145 146 235 375 14 73 170 163 375 14 200 162 306 375 14 276 143 382 375 +747 /data/VOCdevkit/VOC2007/JPEGImages/001487.jpg 500 375 3 242 117 277 151 +748 /data/VOCdevkit/VOC2007/JPEGImages/001489.jpg 500 333 4 329 63 346 107 4 181 161 205 241 4 156 181 176 247 4 128 181 161 261 10 1 88 491 333 8 5 1 82 84 +749 /data/VOCdevkit/VOC2007/JPEGImages/001491.jpg 500 333 6 2 95 199 230 6 93 97 433 266 6 448 108 500 260 +750 /data/VOCdevkit/VOC2007/JPEGImages/001495.jpg 500 375 14 104 74 429 375 +751 /data/VOCdevkit/VOC2007/JPEGImages/001496.jpg 500 333 1 365 110 494 234 1 218 133 345 264 1 82 178 203 304 1 163 49 285 160 14 380 39 496 208 14 229 54 351 238 14 89 108 206 282 14 167 3 290 141 +752 /data/VOCdevkit/VOC2007/JPEGImages/001500.jpg 500 375 19 203 52 342 168 +753 /data/VOCdevkit/VOC2007/JPEGImages/001502.jpg 500 411 14 172 65 323 343 13 106 131 386 381 +754 /data/VOCdevkit/VOC2007/JPEGImages/001503.jpg 500 333 14 288 157 340 220 +755 /data/VOCdevkit/VOC2007/JPEGImages/001505.jpg 500 375 0 325 165 355 192 +756 /data/VOCdevkit/VOC2007/JPEGImages/001506.jpg 500 375 14 189 71 286 354 14 373 105 478 347 14 37 119 125 340 +757 /data/VOCdevkit/VOC2007/JPEGImages/001507.jpg 500 333 11 12 1 337 274 +758 /data/VOCdevkit/VOC2007/JPEGImages/001508.jpg 375 500 9 114 242 375 500 2 234 230 256 263 2 293 198 309 215 +759 /data/VOCdevkit/VOC2007/JPEGImages/001511.jpg 500 333 6 20 42 489 280 14 482 70 500 174 14 384 71 402 107 +760 /data/VOCdevkit/VOC2007/JPEGImages/001513.jpg 500 375 8 311 230 468 375 19 52 223 175 339 +761 /data/VOCdevkit/VOC2007/JPEGImages/001516.jpg 500 375 13 36 35 457 333 14 295 8 368 126 14 418 29 500 231 14 411 16 447 68 14 387 49 422 96 14 376 37 401 94 14 354 22 376 82 14 1 17 61 205 +762 /data/VOCdevkit/VOC2007/JPEGImages/001518.jpg 500 375 17 23 149 135 205 17 46 159 183 224 17 76 167 245 255 17 138 188 366 311 +763 /data/VOCdevkit/VOC2007/JPEGImages/001519.jpg 333 500 8 33 246 132 348 +764 /data/VOCdevkit/VOC2007/JPEGImages/001520.jpg 500 375 7 5 124 472 374 +765 /data/VOCdevkit/VOC2007/JPEGImages/001525.jpg 500 333 6 158 151 320 222 +766 /data/VOCdevkit/VOC2007/JPEGImages/001527.jpg 500 375 3 321 142 429 167 3 102 138 174 161 3 230 142 280 164 +767 /data/VOCdevkit/VOC2007/JPEGImages/001530.jpg 500 375 2 7 54 500 338 +768 /data/VOCdevkit/VOC2007/JPEGImages/001533.jpg 500 375 14 99 134 193 292 14 295 65 358 314 14 254 179 498 375 +769 /data/VOCdevkit/VOC2007/JPEGImages/001534.jpg 500 375 10 1 305 327 375 8 166 199 241 281 8 113 184 167 242 17 186 194 285 241 +770 /data/VOCdevkit/VOC2007/JPEGImages/001535.jpg 420 263 6 228 147 400 230 +771 /data/VOCdevkit/VOC2007/JPEGImages/001538.jpg 500 375 14 275 219 299 269 14 370 221 392 290 14 392 224 418 280 14 415 214 450 322 14 472 223 498 311 14 441 224 486 325 +772 /data/VOCdevkit/VOC2007/JPEGImages/001540.jpg 500 373 15 196 228 268 294 +773 /data/VOCdevkit/VOC2007/JPEGImages/001542.jpg 500 335 7 3 99 434 316 +774 /data/VOCdevkit/VOC2007/JPEGImages/001546.jpg 500 375 19 94 59 410 330 +775 /data/VOCdevkit/VOC2007/JPEGImages/001547.jpg 500 339 0 58 106 462 216 +776 /data/VOCdevkit/VOC2007/JPEGImages/001549.jpg 270 360 19 26 60 113 139 11 9 84 226 333 +777 /data/VOCdevkit/VOC2007/JPEGImages/001550.jpg 500 375 6 6 59 500 340 +778 /data/VOCdevkit/VOC2007/JPEGImages/001551.jpg 500 375 19 169 46 354 189 8 1 98 146 303 8 167 188 455 373 +779 /data/VOCdevkit/VOC2007/JPEGImages/001552.jpg 500 375 6 1 30 470 375 6 1 70 132 238 +780 /data/VOCdevkit/VOC2007/JPEGImages/001558.jpg 500 375 14 1 56 286 329 14 283 15 500 328 +781 /data/VOCdevkit/VOC2007/JPEGImages/001560.jpg 500 375 6 61 96 447 350 +782 /data/VOCdevkit/VOC2007/JPEGImages/001562.jpg 500 375 11 177 41 329 360 +783 /data/VOCdevkit/VOC2007/JPEGImages/001564.jpg 500 375 14 1 77 101 375 14 59 182 235 375 14 269 75 393 309 14 408 158 500 327 +784 /data/VOCdevkit/VOC2007/JPEGImages/001566.jpg 375 500 14 1 61 373 500 +785 /data/VOCdevkit/VOC2007/JPEGImages/001567.jpg 333 500 18 64 120 322 417 +786 /data/VOCdevkit/VOC2007/JPEGImages/001568.jpg 400 400 0 3 42 400 372 +787 /data/VOCdevkit/VOC2007/JPEGImages/001569.jpg 375 500 4 5 274 43 394 4 60 312 114 411 14 88 45 305 335 6 260 130 344 167 +788 /data/VOCdevkit/VOC2007/JPEGImages/001570.jpg 500 333 14 61 15 397 314 +789 /data/VOCdevkit/VOC2007/JPEGImages/001572.jpg 500 375 6 6 111 429 350 6 2 121 157 223 14 215 96 241 170 6 421 79 460 102 19 422 132 500 170 +790 /data/VOCdevkit/VOC2007/JPEGImages/001573.jpg 500 396 7 174 105 334 273 +791 /data/VOCdevkit/VOC2007/JPEGImages/001574.jpg 332 500 12 31 119 214 500 +792 /data/VOCdevkit/VOC2007/JPEGImages/001575.jpg 500 375 14 2 232 18 290 14 27 236 51 289 14 56 237 76 289 14 330 227 350 282 14 265 238 283 273 14 432 223 469 353 14 470 234 500 354 +793 /data/VOCdevkit/VOC2007/JPEGImages/001578.jpg 500 332 18 26 96 346 293 18 338 121 443 268 +794 /data/VOCdevkit/VOC2007/JPEGImages/001581.jpg 333 500 14 3 17 139 500 14 134 163 333 476 14 209 167 332 390 14 175 112 264 210 14 254 125 333 349 +795 /data/VOCdevkit/VOC2007/JPEGImages/001583.jpg 500 375 14 312 45 412 282 14 70 16 232 375 +796 /data/VOCdevkit/VOC2007/JPEGImages/001584.jpg 500 375 12 182 1 500 338 +797 /data/VOCdevkit/VOC2007/JPEGImages/001585.jpg 500 434 14 197 115 328 358 17 6 180 425 341 4 58 158 72 191 +798 /data/VOCdevkit/VOC2007/JPEGImages/001587.jpg 500 375 1 204 249 274 325 +799 /data/VOCdevkit/VOC2007/JPEGImages/001589.jpg 500 323 9 330 102 441 315 9 40 3 263 323 +800 /data/VOCdevkit/VOC2007/JPEGImages/001591.jpg 500 375 3 1 36 454 215 +801 /data/VOCdevkit/VOC2007/JPEGImages/001592.jpg 500 250 7 1 25 230 242 7 232 25 482 223 +802 /data/VOCdevkit/VOC2007/JPEGImages/001596.jpg 375 500 14 2 2 375 500 +803 /data/VOCdevkit/VOC2007/JPEGImages/001599.jpg 500 375 8 250 146 323 232 8 163 149 239 239 +804 /data/VOCdevkit/VOC2007/JPEGImages/001600.jpg 500 375 14 345 208 388 305 +805 /data/VOCdevkit/VOC2007/JPEGImages/001601.jpg 500 375 11 102 63 436 326 +806 /data/VOCdevkit/VOC2007/JPEGImages/001602.jpg 351 500 4 252 2 351 365 +807 /data/VOCdevkit/VOC2007/JPEGImages/001605.jpg 500 375 6 205 230 237 259 +808 /data/VOCdevkit/VOC2007/JPEGImages/001606.jpg 500 381 1 238 187 360 381 1 374 175 443 381 14 229 6 370 379 14 359 40 464 381 14 1 1 137 379 1 1 163 156 381 +809 /data/VOCdevkit/VOC2007/JPEGImages/001609.jpg 375 500 10 3 120 374 500 +810 /data/VOCdevkit/VOC2007/JPEGImages/001613.jpg 500 375 6 63 61 397 314 1 73 80 441 333 +811 /data/VOCdevkit/VOC2007/JPEGImages/001615.jpg 500 334 14 294 139 337 261 +812 /data/VOCdevkit/VOC2007/JPEGImages/001616.jpg 500 370 6 49 190 135 265 +813 /data/VOCdevkit/VOC2007/JPEGImages/001619.jpg 500 332 13 3 21 224 240 14 66 2 196 166 14 2 2 137 183 6 176 1 499 157 +814 /data/VOCdevkit/VOC2007/JPEGImages/001620.jpg 333 500 1 11 283 212 450 1 132 235 322 436 14 59 200 145 420 14 84 132 253 410 +815 /data/VOCdevkit/VOC2007/JPEGImages/001621.jpg 500 375 0 1 39 500 352 +816 /data/VOCdevkit/VOC2007/JPEGImages/001623.jpg 333 500 6 21 125 332 397 6 1 181 58 260 +817 /data/VOCdevkit/VOC2007/JPEGImages/001624.jpg 500 332 12 171 129 425 266 14 207 98 291 272 +818 /data/VOCdevkit/VOC2007/JPEGImages/001625.jpg 500 287 14 255 128 303 205 14 213 127 247 206 16 136 186 235 259 +819 /data/VOCdevkit/VOC2007/JPEGImages/001626.jpg 500 375 5 69 11 393 278 +820 /data/VOCdevkit/VOC2007/JPEGImages/001629.jpg 500 375 8 5 188 135 330 17 17 228 289 375 14 235 71 500 372 +821 /data/VOCdevkit/VOC2007/JPEGImages/001631.jpg 375 500 4 76 6 201 498 15 4 3 373 446 +822 /data/VOCdevkit/VOC2007/JPEGImages/001634.jpg 500 368 3 14 44 403 335 +823 /data/VOCdevkit/VOC2007/JPEGImages/001635.jpg 500 333 12 459 135 500 167 12 261 143 294 168 12 134 142 155 172 +824 /data/VOCdevkit/VOC2007/JPEGImages/001637.jpg 320 240 2 145 64 224 117 +825 /data/VOCdevkit/VOC2007/JPEGImages/001639.jpg 500 334 11 128 52 500 334 11 80 187 360 334 +826 /data/VOCdevkit/VOC2007/JPEGImages/001641.jpg 500 375 9 174 64 397 375 9 362 36 454 146 +827 /data/VOCdevkit/VOC2007/JPEGImages/001644.jpg 500 333 5 19 3 498 319 14 388 96 420 160 14 224 119 334 330 +828 /data/VOCdevkit/VOC2007/JPEGImages/001645.jpg 500 322 16 161 102 316 235 +829 /data/VOCdevkit/VOC2007/JPEGImages/001646.jpg 500 375 3 305 121 409 319 3 132 82 286 318 +830 /data/VOCdevkit/VOC2007/JPEGImages/001648.jpg 500 375 15 386 199 440 310 15 400 23 500 282 15 454 197 500 302 +831 /data/VOCdevkit/VOC2007/JPEGImages/001652.jpg 375 500 14 33 132 241 427 4 205 290 299 500 4 50 267 134 477 15 227 178 362 340 +832 /data/VOCdevkit/VOC2007/JPEGImages/001655.jpg 500 375 11 64 8 493 368 +833 /data/VOCdevkit/VOC2007/JPEGImages/001656.jpg 500 375 14 14 1 108 273 11 160 111 352 255 +834 /data/VOCdevkit/VOC2007/JPEGImages/001657.jpg 500 375 11 291 258 408 361 8 323 72 433 280 14 1 43 339 375 +835 /data/VOCdevkit/VOC2007/JPEGImages/001658.jpg 500 375 6 209 20 396 74 13 310 40 400 97 6 118 59 210 143 6 132 72 450 323 6 378 43 500 173 +836 /data/VOCdevkit/VOC2007/JPEGImages/001659.jpg 354 500 5 40 110 315 366 +837 /data/VOCdevkit/VOC2007/JPEGImages/001660.jpg 500 334 0 191 120 481 187 +838 /data/VOCdevkit/VOC2007/JPEGImages/001663.jpg 500 375 7 51 55 467 338 +839 /data/VOCdevkit/VOC2007/JPEGImages/001664.jpg 500 333 14 61 1 327 333 +840 /data/VOCdevkit/VOC2007/JPEGImages/001665.jpg 500 375 15 364 202 415 269 +841 /data/VOCdevkit/VOC2007/JPEGImages/001666.jpg 500 375 15 383 170 428 239 +842 /data/VOCdevkit/VOC2007/JPEGImages/001667.jpg 500 333 14 251 115 298 217 +843 /data/VOCdevkit/VOC2007/JPEGImages/001668.jpg 500 375 14 138 136 192 299 14 188 212 246 301 14 232 128 278 285 14 272 149 311 280 14 316 155 355 278 14 327 97 420 375 +844 /data/VOCdevkit/VOC2007/JPEGImages/001670.jpg 375 500 8 209 49 339 181 8 306 33 375 128 +845 /data/VOCdevkit/VOC2007/JPEGImages/001671.jpg 333 500 16 206 154 258 213 16 217 372 298 474 16 117 391 237 475 +846 /data/VOCdevkit/VOC2007/JPEGImages/001672.jpg 500 375 18 31 149 430 249 +847 /data/VOCdevkit/VOC2007/JPEGImages/001674.jpg 500 375 10 90 319 360 375 +848 /data/VOCdevkit/VOC2007/JPEGImages/001679.jpg 393 500 13 2 235 391 500 +849 /data/VOCdevkit/VOC2007/JPEGImages/001681.jpg 500 375 2 276 166 417 251 2 277 251 418 339 +850 /data/VOCdevkit/VOC2007/JPEGImages/001687.jpg 375 500 2 183 123 288 232 2 117 291 300 500 +851 /data/VOCdevkit/VOC2007/JPEGImages/001692.jpg 320 225 12 96 49 238 210 14 135 22 204 139 +852 /data/VOCdevkit/VOC2007/JPEGImages/001694.jpg 500 333 7 104 21 476 291 +853 /data/VOCdevkit/VOC2007/JPEGImages/001695.jpg 500 375 19 48 54 497 375 +854 /data/VOCdevkit/VOC2007/JPEGImages/001696.jpg 500 331 14 331 7 445 331 14 125 164 206 331 8 433 140 482 251 8 258 135 335 240 +855 /data/VOCdevkit/VOC2007/JPEGImages/001697.jpg 500 299 9 269 221 355 284 +856 /data/VOCdevkit/VOC2007/JPEGImages/001698.jpg 500 375 3 61 93 447 209 3 39 138 358 233 +857 /data/VOCdevkit/VOC2007/JPEGImages/001700.jpg 500 333 6 252 139 337 192 +858 /data/VOCdevkit/VOC2007/JPEGImages/001701.jpg 500 334 6 1 1 433 332 +859 /data/VOCdevkit/VOC2007/JPEGImages/001702.jpg 500 375 7 7 75 392 375 +860 /data/VOCdevkit/VOC2007/JPEGImages/001703.jpg 500 319 14 245 21 390 125 12 1 29 478 305 +861 /data/VOCdevkit/VOC2007/JPEGImages/001704.jpg 500 375 19 118 1 405 317 +862 /data/VOCdevkit/VOC2007/JPEGImages/001705.jpg 500 375 3 5 51 500 344 14 444 234 465 374 +863 /data/VOCdevkit/VOC2007/JPEGImages/001706.jpg 500 375 14 89 54 193 350 14 271 57 376 364 +864 /data/VOCdevkit/VOC2007/JPEGImages/001709.jpg 500 333 14 367 132 426 287 13 1 45 412 333 +865 /data/VOCdevkit/VOC2007/JPEGImages/001710.jpg 500 375 14 298 45 475 349 14 52 72 161 356 14 472 98 494 163 +866 /data/VOCdevkit/VOC2007/JPEGImages/001712.jpg 500 375 15 2 216 131 375 14 99 39 262 375 14 187 70 364 375 +867 /data/VOCdevkit/VOC2007/JPEGImages/001715.jpg 500 375 15 316 199 357 280 15 189 197 224 270 +868 /data/VOCdevkit/VOC2007/JPEGImages/001716.jpg 500 325 9 265 181 321 234 +869 /data/VOCdevkit/VOC2007/JPEGImages/001719.jpg 500 345 2 228 63 456 245 +870 /data/VOCdevkit/VOC2007/JPEGImages/001720.jpg 500 374 4 105 214 130 295 4 164 214 189 295 14 5 142 175 374 14 116 136 202 242 14 220 133 316 206 14 298 138 394 246 14 264 150 486 374 10 12 198 355 362 +871 /data/VOCdevkit/VOC2007/JPEGImages/001722.jpg 500 375 14 206 185 308 370 14 299 169 500 375 14 1 285 54 375 +872 /data/VOCdevkit/VOC2007/JPEGImages/001728.jpg 500 375 14 2 118 181 373 14 142 111 293 375 14 274 105 500 374 +873 /data/VOCdevkit/VOC2007/JPEGImages/001731.jpg 500 333 11 58 182 397 308 7 222 86 309 121 14 79 14 199 112 17 62 58 352 192 +874 /data/VOCdevkit/VOC2007/JPEGImages/001735.jpg 500 375 8 92 83 238 375 14 146 56 368 375 +875 /data/VOCdevkit/VOC2007/JPEGImages/001736.jpg 500 333 5 114 183 466 301 +876 /data/VOCdevkit/VOC2007/JPEGImages/001737.jpg 500 375 13 8 27 476 315 +877 /data/VOCdevkit/VOC2007/JPEGImages/001740.jpg 500 375 10 5 43 497 373 +878 /data/VOCdevkit/VOC2007/JPEGImages/001742.jpg 360 480 19 57 177 148 257 8 137 251 283 477 +879 /data/VOCdevkit/VOC2007/JPEGImages/001743.jpg 500 333 14 206 43 344 226 14 333 73 361 198 +880 /data/VOCdevkit/VOC2007/JPEGImages/001744.jpg 500 176 13 160 32 353 145 +881 /data/VOCdevkit/VOC2007/JPEGImages/001745.jpg 500 333 2 450 87 482 149 2 383 128 401 152 2 304 87 341 147 2 237 74 284 123 2 190 117 219 155 2 105 137 134 184 2 56 143 86 188 +882 /data/VOCdevkit/VOC2007/JPEGImages/001748.jpg 500 375 14 135 25 236 188 1 95 85 232 253 +883 /data/VOCdevkit/VOC2007/JPEGImages/001751.jpg 500 332 11 157 57 498 331 +884 /data/VOCdevkit/VOC2007/JPEGImages/001753.jpg 500 375 18 3 230 376 319 +885 /data/VOCdevkit/VOC2007/JPEGImages/001757.jpg 375 500 10 2 184 263 500 14 109 121 175 261 14 138 127 218 337 14 144 203 284 403 14 197 291 375 500 14 12 114 96 186 +886 /data/VOCdevkit/VOC2007/JPEGImages/001760.jpg 375 500 14 1 155 107 377 14 196 118 272 344 14 257 129 343 348 14 269 255 375 423 14 167 334 323 500 14 11 284 124 500 14 149 274 228 349 +887 /data/VOCdevkit/VOC2007/JPEGImages/001762.jpg 500 375 7 136 70 375 275 8 1 115 498 375 +888 /data/VOCdevkit/VOC2007/JPEGImages/001763.jpg 500 375 7 281 119 500 375 11 1 24 330 366 17 1 48 500 375 +889 /data/VOCdevkit/VOC2007/JPEGImages/001764.jpg 500 375 9 278 103 349 147 9 221 106 282 148 9 134 103 223 148 9 98 97 144 133 +890 /data/VOCdevkit/VOC2007/JPEGImages/001767.jpg 500 375 11 110 54 500 375 +891 /data/VOCdevkit/VOC2007/JPEGImages/001769.jpg 500 375 12 65 100 252 375 12 249 110 458 375 14 287 39 429 234 14 169 25 289 204 +892 /data/VOCdevkit/VOC2007/JPEGImages/001770.jpg 500 375 3 309 177 500 374 6 99 331 126 351 6 61 337 96 361 6 18 358 51 375 +893 /data/VOCdevkit/VOC2007/JPEGImages/001773.jpg 500 376 8 196 219 277 346 8 107 204 188 321 +894 /data/VOCdevkit/VOC2007/JPEGImages/001774.jpg 500 340 7 14 86 500 286 +895 /data/VOCdevkit/VOC2007/JPEGImages/001776.jpg 500 333 6 1 106 349 296 14 68 189 171 333 14 175 12 496 333 14 1 88 67 189 +896 /data/VOCdevkit/VOC2007/JPEGImages/001779.jpg 500 375 17 36 167 390 372 15 404 1 500 375 +897 /data/VOCdevkit/VOC2007/JPEGImages/001781.jpg 500 333 14 242 3 455 331 1 380 4 500 308 +898 /data/VOCdevkit/VOC2007/JPEGImages/001783.jpg 500 375 0 72 189 297 261 0 369 195 500 261 +899 /data/VOCdevkit/VOC2007/JPEGImages/001786.jpg 500 375 15 2 99 447 375 +900 /data/VOCdevkit/VOC2007/JPEGImages/001788.jpg 500 375 18 99 36 468 301 +901 /data/VOCdevkit/VOC2007/JPEGImages/001790.jpg 333 500 7 93 2 332 472 +902 /data/VOCdevkit/VOC2007/JPEGImages/001791.jpg 494 500 14 10 19 381 500 +903 /data/VOCdevkit/VOC2007/JPEGImages/001792.jpg 500 236 14 425 27 489 212 14 404 18 442 63 14 380 38 433 212 14 351 25 380 71 14 320 39 378 214 14 298 21 341 71 14 275 35 322 215 14 233 40 281 211 14 183 34 231 206 14 134 51 179 206 14 90 50 133 226 14 7 31 84 231 +904 /data/VOCdevkit/VOC2007/JPEGImages/001794.jpg 212 320 12 66 64 140 320 14 32 23 154 200 +905 /data/VOCdevkit/VOC2007/JPEGImages/001796.jpg 500 375 13 70 91 458 266 +906 /data/VOCdevkit/VOC2007/JPEGImages/001798.jpg 500 334 13 27 62 474 305 13 1 1 212 172 13 258 1 443 128 +907 /data/VOCdevkit/VOC2007/JPEGImages/001802.jpg 500 333 18 1 1 499 267 14 196 50 291 310 14 125 40 196 333 +908 /data/VOCdevkit/VOC2007/JPEGImages/001803.jpg 500 333 18 224 202 365 259 +909 /data/VOCdevkit/VOC2007/JPEGImages/001804.jpg 500 375 6 75 40 419 321 +910 /data/VOCdevkit/VOC2007/JPEGImages/001805.jpg 500 332 14 331 12 500 332 14 43 46 157 218 10 5 130 417 332 +911 /data/VOCdevkit/VOC2007/JPEGImages/001808.jpg 500 332 14 253 62 322 317 14 368 67 417 218 14 422 85 489 332 14 1 76 57 312 +912 /data/VOCdevkit/VOC2007/JPEGImages/001811.jpg 500 375 15 1 167 40 241 15 196 169 222 195 +913 /data/VOCdevkit/VOC2007/JPEGImages/001812.jpg 500 486 15 466 273 500 339 15 269 239 362 353 14 238 124 323 296 +914 /data/VOCdevkit/VOC2007/JPEGImages/001813.jpg 500 375 19 458 181 500 287 +915 /data/VOCdevkit/VOC2007/JPEGImages/001814.jpg 500 375 8 245 1 415 197 +916 /data/VOCdevkit/VOC2007/JPEGImages/001815.jpg 500 375 3 85 150 313 291 +917 /data/VOCdevkit/VOC2007/JPEGImages/001817.jpg 333 500 5 3 2 333 298 +918 /data/VOCdevkit/VOC2007/JPEGImages/001819.jpg 370 480 12 102 89 269 443 14 127 58 260 293 +919 /data/VOCdevkit/VOC2007/JPEGImages/001820.jpg 500 333 6 93 71 435 316 +920 /data/VOCdevkit/VOC2007/JPEGImages/001822.jpg 500 375 3 135 192 437 262 +921 /data/VOCdevkit/VOC2007/JPEGImages/001823.jpg 297 480 14 92 74 226 269 12 119 127 206 355 +922 /data/VOCdevkit/VOC2007/JPEGImages/001824.jpg 500 375 19 157 71 309 227 11 213 170 500 375 +923 /data/VOCdevkit/VOC2007/JPEGImages/001826.jpg 500 375 8 387 155 486 304 17 171 201 341 331 +924 /data/VOCdevkit/VOC2007/JPEGImages/001829.jpg 375 500 4 48 373 111 500 +925 /data/VOCdevkit/VOC2007/JPEGImages/001831.jpg 500 375 14 304 71 500 350 14 198 104 330 375 14 102 104 251 375 14 75 107 227 375 17 1 128 443 346 +926 /data/VOCdevkit/VOC2007/JPEGImages/001835.jpg 500 375 7 17 54 298 374 +927 /data/VOCdevkit/VOC2007/JPEGImages/001838.jpg 500 375 6 39 43 473 330 +928 /data/VOCdevkit/VOC2007/JPEGImages/001839.jpg 500 375 14 4 2 139 366 14 117 4 187 174 14 411 5 500 302 14 398 2 465 149 14 353 65 414 144 14 210 1 252 138 14 181 1 215 142 +929 /data/VOCdevkit/VOC2007/JPEGImages/001844.jpg 500 333 5 134 112 285 209 +930 /data/VOCdevkit/VOC2007/JPEGImages/001846.jpg 500 333 6 45 143 337 332 +931 /data/VOCdevkit/VOC2007/JPEGImages/001848.jpg 500 313 0 52 88 415 197 +932 /data/VOCdevkit/VOC2007/JPEGImages/001850.jpg 500 333 0 108 125 500 271 14 253 209 280 295 14 227 221 257 293 14 227 185 256 301 +933 /data/VOCdevkit/VOC2007/JPEGImages/001851.jpg 375 500 11 1 83 321 500 6 41 68 92 108 +934 /data/VOCdevkit/VOC2007/JPEGImages/001852.jpg 500 375 16 72 105 232 305 16 184 58 500 352 +935 /data/VOCdevkit/VOC2007/JPEGImages/001856.jpg 333 500 8 202 244 248 348 10 188 258 259 396 14 113 189 173 272 8 107 258 141 316 +936 /data/VOCdevkit/VOC2007/JPEGImages/001857.jpg 500 375 6 1 11 500 374 14 397 1 479 127 14 328 1 413 122 14 226 1 327 117 14 168 3 236 104 14 86 1 145 45 +937 /data/VOCdevkit/VOC2007/JPEGImages/001859.jpg 500 375 1 13 1 476 375 +938 /data/VOCdevkit/VOC2007/JPEGImages/001863.jpg 500 333 6 168 79 419 284 +939 /data/VOCdevkit/VOC2007/JPEGImages/001865.jpg 375 500 12 1 34 347 500 +940 /data/VOCdevkit/VOC2007/JPEGImages/001866.jpg 500 333 11 86 81 369 272 14 29 1 143 247 +941 /data/VOCdevkit/VOC2007/JPEGImages/001867.jpg 360 270 15 85 191 103 207 15 164 190 186 203 15 341 202 360 219 +942 /data/VOCdevkit/VOC2007/JPEGImages/001868.jpg 500 375 17 248 185 479 350 8 1 201 130 359 +943 /data/VOCdevkit/VOC2007/JPEGImages/001869.jpg 500 376 15 132 3 440 338 +944 /data/VOCdevkit/VOC2007/JPEGImages/001871.jpg 375 500 19 82 37 348 238 +945 /data/VOCdevkit/VOC2007/JPEGImages/001873.jpg 500 332 6 203 87 436 230 +946 /data/VOCdevkit/VOC2007/JPEGImages/001874.jpg 375 500 7 17 82 244 495 +947 /data/VOCdevkit/VOC2007/JPEGImages/001876.jpg 500 375 18 289 89 500 258 +948 /data/VOCdevkit/VOC2007/JPEGImages/001879.jpg 375 500 17 38 270 275 446 +949 /data/VOCdevkit/VOC2007/JPEGImages/001880.jpg 500 375 15 1 9 183 375 15 219 9 432 375 15 247 331 452 375 +950 /data/VOCdevkit/VOC2007/JPEGImages/001883.jpg 500 333 6 90 46 435 289 14 20 20 97 213 14 430 170 489 229 +951 /data/VOCdevkit/VOC2007/JPEGImages/001884.jpg 500 375 5 200 216 311 251 5 309 213 416 245 0 130 112 435 211 +952 /data/VOCdevkit/VOC2007/JPEGImages/001885.jpg 500 375 0 146 56 500 189 +953 /data/VOCdevkit/VOC2007/JPEGImages/001886.jpg 500 375 14 92 43 192 375 +954 /data/VOCdevkit/VOC2007/JPEGImages/001889.jpg 500 375 13 51 137 150 284 13 211 106 332 330 13 348 130 426 264 14 123 82 176 242 14 327 95 375 209 14 348 89 437 239 +955 /data/VOCdevkit/VOC2007/JPEGImages/001890.jpg 500 375 7 65 54 472 304 +956 /data/VOCdevkit/VOC2007/JPEGImages/001891.jpg 500 375 14 414 1 473 205 14 1 1 34 197 6 68 29 429 375 +957 /data/VOCdevkit/VOC2007/JPEGImages/001893.jpg 375 500 14 260 279 293 320 14 285 281 294 298 14 315 282 337 330 14 337 270 375 388 14 145 281 162 340 14 101 284 117 336 14 119 280 150 359 14 72 278 92 343 14 13 263 82 442 14 220 202 248 300 +958 /data/VOCdevkit/VOC2007/JPEGImages/001895.jpg 500 375 3 358 208 451 245 +959 /data/VOCdevkit/VOC2007/JPEGImages/001897.jpg 500 375 5 21 78 490 240 +960 /data/VOCdevkit/VOC2007/JPEGImages/001900.jpg 375 500 12 86 47 375 500 +961 /data/VOCdevkit/VOC2007/JPEGImages/001905.jpg 500 343 19 276 184 355 244 15 1 44 160 272 15 142 123 188 187 15 194 136 236 185 +962 /data/VOCdevkit/VOC2007/JPEGImages/001908.jpg 500 300 6 132 44 342 239 +963 /data/VOCdevkit/VOC2007/JPEGImages/001909.jpg 500 333 7 51 3 440 333 +964 /data/VOCdevkit/VOC2007/JPEGImages/001910.jpg 500 334 2 4 3 438 332 +965 /data/VOCdevkit/VOC2007/JPEGImages/001912.jpg 500 342 0 8 45 487 226 +966 /data/VOCdevkit/VOC2007/JPEGImages/001913.jpg 500 333 6 136 89 441 214 +967 /data/VOCdevkit/VOC2007/JPEGImages/001914.jpg 375 500 11 202 215 344 476 14 88 27 291 390 14 1 55 246 500 +968 /data/VOCdevkit/VOC2007/JPEGImages/001916.jpg 500 331 13 100 99 153 192 13 113 110 199 209 13 384 103 464 198 13 295 109 382 199 13 256 98 319 186 14 401 59 469 165 14 309 68 383 168 14 263 69 323 158 14 122 71 212 205 14 444 42 470 117 14 427 35 449 67 14 153 45 180 76 +969 /data/VOCdevkit/VOC2007/JPEGImages/001917.jpg 500 397 9 191 167 266 210 9 416 181 482 217 9 341 173 420 220 +970 /data/VOCdevkit/VOC2007/JPEGImages/001919.jpg 500 333 6 203 85 350 212 +971 /data/VOCdevkit/VOC2007/JPEGImages/001921.jpg 375 500 14 43 284 132 367 14 126 259 138 305 14 154 117 322 499 4 201 312 229 376 +972 /data/VOCdevkit/VOC2007/JPEGImages/001923.jpg 500 334 6 1 137 413 317 14 427 116 468 234 14 465 90 489 162 14 415 91 443 173 6 245 106 292 139 +973 /data/VOCdevkit/VOC2007/JPEGImages/001924.jpg 500 375 6 90 109 444 264 6 396 97 500 259 +974 /data/VOCdevkit/VOC2007/JPEGImages/001925.jpg 500 333 4 365 1 486 261 4 270 1 376 257 4 175 1 273 245 4 81 1 177 230 4 1 1 79 217 4 1 198 79 298 4 47 250 137 333 4 82 206 160 313 4 171 214 252 323 4 135 259 227 333 4 251 220 335 331 4 222 268 316 333 4 337 231 424 331 4 316 277 398 333 4 414 287 498 333 4 423 240 500 322 +975 /data/VOCdevkit/VOC2007/JPEGImages/001926.jpg 500 375 2 261 81 431 334 2 120 76 237 303 +976 /data/VOCdevkit/VOC2007/JPEGImages/001929.jpg 500 360 0 205 145 362 196 +977 /data/VOCdevkit/VOC2007/JPEGImages/001935.jpg 500 374 18 42 114 500 217 6 370 181 443 214 +978 /data/VOCdevkit/VOC2007/JPEGImages/001939.jpg 432 270 12 6 3 428 269 +979 /data/VOCdevkit/VOC2007/JPEGImages/001942.jpg 500 333 6 93 25 462 306 14 171 12 208 68 6 339 2 500 75 8 1 125 46 180 +980 /data/VOCdevkit/VOC2007/JPEGImages/001943.jpg 500 333 14 1 11 500 333 +981 /data/VOCdevkit/VOC2007/JPEGImages/001946.jpg 500 375 14 107 67 491 375 +982 /data/VOCdevkit/VOC2007/JPEGImages/001947.jpg 500 375 14 202 10 323 157 14 1 88 119 373 14 1 89 234 375 14 132 152 388 375 14 312 68 500 375 +983 /data/VOCdevkit/VOC2007/JPEGImages/001949.jpg 375 500 8 144 318 316 497 8 259 309 374 500 8 48 259 151 500 10 35 276 372 500 +984 /data/VOCdevkit/VOC2007/JPEGImages/001951.jpg 500 323 6 5 27 486 299 +985 /data/VOCdevkit/VOC2007/JPEGImages/001953.jpg 500 334 5 1 43 497 330 14 363 155 406 213 +986 /data/VOCdevkit/VOC2007/JPEGImages/001955.jpg 500 324 12 247 183 296 239 12 212 178 248 226 +987 /data/VOCdevkit/VOC2007/JPEGImages/001956.jpg 500 333 6 180 111 488 284 +988 /data/VOCdevkit/VOC2007/JPEGImages/001957.jpg 500 458 8 144 18 438 390 +989 /data/VOCdevkit/VOC2007/JPEGImages/001959.jpg 500 333 2 163 63 468 297 +990 /data/VOCdevkit/VOC2007/JPEGImages/001961.jpg 500 375 8 7 193 168 347 19 43 123 157 194 +991 /data/VOCdevkit/VOC2007/JPEGImages/001965.jpg 500 409 6 1 39 193 265 6 9 17 482 409 +992 /data/VOCdevkit/VOC2007/JPEGImages/001966.jpg 500 375 7 364 50 500 375 7 1 28 115 287 +993 /data/VOCdevkit/VOC2007/JPEGImages/001967.jpg 500 333 2 128 82 220 257 +994 /data/VOCdevkit/VOC2007/JPEGImages/001968.jpg 500 375 14 19 97 292 327 +995 /data/VOCdevkit/VOC2007/JPEGImages/001969.jpg 500 333 14 150 132 261 333 14 91 118 151 269 14 47 111 120 288 14 14 100 60 277 +996 /data/VOCdevkit/VOC2007/JPEGImages/001973.jpg 400 300 7 144 39 304 256 7 79 26 236 254 +997 /data/VOCdevkit/VOC2007/JPEGImages/001974.jpg 500 375 3 65 174 301 246 9 295 183 387 243 14 393 167 455 240 14 254 167 284 246 14 105 181 125 261 14 101 178 142 251 3 259 152 387 182 +998 /data/VOCdevkit/VOC2007/JPEGImages/001975.jpg 500 375 14 147 88 227 163 14 254 84 361 184 14 295 91 411 216 14 389 106 492 276 14 89 87 136 195 14 23 88 153 311 14 2 156 153 375 10 104 157 458 375 +999 /data/VOCdevkit/VOC2007/JPEGImages/001979.jpg 333 500 14 191 320 231 426 14 234 324 277 425 +1000 /data/VOCdevkit/VOC2007/JPEGImages/001983.jpg 500 375 5 61 123 348 226 +1001 /data/VOCdevkit/VOC2007/JPEGImages/001984.jpg 500 375 11 15 1 288 373 11 226 105 387 319 11 352 107 500 372 +1002 /data/VOCdevkit/VOC2007/JPEGImages/001986.jpg 500 333 14 1 1 468 332 +1003 /data/VOCdevkit/VOC2007/JPEGImages/001987.jpg 500 333 9 185 114 300 291 +1004 /data/VOCdevkit/VOC2007/JPEGImages/001988.jpg 333 500 1 10 151 333 495 14 78 66 269 392 +1005 /data/VOCdevkit/VOC2007/JPEGImages/001990.jpg 500 375 8 425 78 500 198 8 365 64 446 180 8 204 151 352 365 8 160 124 287 322 8 1 129 119 350 8 1 234 119 375 +1006 /data/VOCdevkit/VOC2007/JPEGImages/001991.jpg 500 375 6 4 97 369 299 6 315 76 500 202 +1007 /data/VOCdevkit/VOC2007/JPEGImages/001992.jpg 500 375 11 25 156 263 335 14 1 10 215 375 4 391 157 407 211 +1008 /data/VOCdevkit/VOC2007/JPEGImages/001993.jpg 355 500 14 195 334 338 500 14 56 293 237 500 +1009 /data/VOCdevkit/VOC2007/JPEGImages/001994.jpg 500 333 0 210 141 420 240 +1010 /data/VOCdevkit/VOC2007/JPEGImages/001996.jpg 500 299 0 21 69 472 242 0 321 201 371 217 +1011 /data/VOCdevkit/VOC2007/JPEGImages/001997.jpg 464 500 2 132 148 257 401 +1012 /data/VOCdevkit/VOC2007/JPEGImages/001998.jpg 500 375 13 56 138 329 288 14 276 63 394 275 +1013 /data/VOCdevkit/VOC2007/JPEGImages/002003.jpg 500 375 7 2 1 500 373 +1014 /data/VOCdevkit/VOC2007/JPEGImages/002005.jpg 500 333 9 348 128 486 213 9 95 95 258 324 +1015 /data/VOCdevkit/VOC2007/JPEGImages/002007.jpg 500 379 0 164 112 290 221 +1016 /data/VOCdevkit/VOC2007/JPEGImages/002008.jpg 500 375 1 74 203 144 314 14 74 142 140 272 +1017 /data/VOCdevkit/VOC2007/JPEGImages/002009.jpg 500 375 18 92 82 500 329 +1018 /data/VOCdevkit/VOC2007/JPEGImages/002010.jpg 500 333 14 1 14 472 333 +1019 /data/VOCdevkit/VOC2007/JPEGImages/002013.jpg 500 333 17 248 125 500 333 +1020 /data/VOCdevkit/VOC2007/JPEGImages/002014.jpg 500 333 0 132 146 195 206 +1021 /data/VOCdevkit/VOC2007/JPEGImages/002016.jpg 500 375 14 43 239 91 334 +1022 /data/VOCdevkit/VOC2007/JPEGImages/002017.jpg 500 354 12 148 112 415 236 +1023 /data/VOCdevkit/VOC2007/JPEGImages/002018.jpg 500 158 17 298 31 500 158 17 1 28 296 158 14 304 78 481 131 14 6 34 235 122 15 11 8 51 53 +1024 /data/VOCdevkit/VOC2007/JPEGImages/002026.jpg 500 375 17 1 133 371 375 14 143 138 390 333 4 405 292 429 358 15 367 142 400 197 +1025 /data/VOCdevkit/VOC2007/JPEGImages/002028.jpg 500 375 2 249 214 327 253 +1026 /data/VOCdevkit/VOC2007/JPEGImages/002029.jpg 331 500 3 1 51 266 449 +1027 /data/VOCdevkit/VOC2007/JPEGImages/002031.jpg 480 365 12 75 70 408 248 14 174 52 279 186 +1028 /data/VOCdevkit/VOC2007/JPEGImages/002032.jpg 500 347 18 3 2 500 347 +1029 /data/VOCdevkit/VOC2007/JPEGImages/002033.jpg 500 338 16 1 188 174 315 16 224 48 291 138 16 244 96 398 300 16 441 133 500 338 +1030 /data/VOCdevkit/VOC2007/JPEGImages/002035.jpg 500 375 17 181 147 500 374 15 266 54 406 180 15 89 102 128 162 15 14 1 104 132 15 130 103 182 146 15 146 38 183 107 +1031 /data/VOCdevkit/VOC2007/JPEGImages/002038.jpg 355 500 7 117 415 242 452 +1032 /data/VOCdevkit/VOC2007/JPEGImages/002040.jpg 500 363 6 78 38 432 334 6 366 20 500 103 14 462 2 500 111 14 408 13 436 104 14 316 7 344 59 14 64 26 97 125 +1033 /data/VOCdevkit/VOC2007/JPEGImages/002041.jpg 500 332 6 40 161 206 300 14 189 136 259 269 +1034 /data/VOCdevkit/VOC2007/JPEGImages/002044.jpg 500 375 2 203 136 332 256 +1035 /data/VOCdevkit/VOC2007/JPEGImages/002046.jpg 454 500 12 277 143 454 423 12 1 67 269 433 +1036 /data/VOCdevkit/VOC2007/JPEGImages/002048.jpg 500 359 7 103 118 398 251 +1037 /data/VOCdevkit/VOC2007/JPEGImages/002050.jpg 332 500 12 3 185 225 430 14 193 127 285 430 +1038 /data/VOCdevkit/VOC2007/JPEGImages/002052.jpg 500 333 0 38 19 479 250 +1039 /data/VOCdevkit/VOC2007/JPEGImages/002053.jpg 500 335 18 14 105 155 234 +1040 /data/VOCdevkit/VOC2007/JPEGImages/002057.jpg 500 333 6 2 1 500 320 +1041 /data/VOCdevkit/VOC2007/JPEGImages/002059.jpg 500 375 7 18 89 425 375 +1042 /data/VOCdevkit/VOC2007/JPEGImages/002060.jpg 500 375 1 203 224 310 375 14 204 151 299 335 +1043 /data/VOCdevkit/VOC2007/JPEGImages/002062.jpg 500 375 19 87 84 308 314 14 455 54 500 110 14 233 180 275 252 +1044 /data/VOCdevkit/VOC2007/JPEGImages/002065.jpg 500 377 14 79 39 391 256 +1045 /data/VOCdevkit/VOC2007/JPEGImages/002066.jpg 375 500 18 1 284 145 323 +1046 /data/VOCdevkit/VOC2007/JPEGImages/002071.jpg 500 332 14 72 116 134 201 14 205 76 254 203 14 281 104 318 204 12 85 133 120 236 12 146 123 317 279 12 339 172 403 216 12 226 138 370 249 +1047 /data/VOCdevkit/VOC2007/JPEGImages/002072.jpg 480 390 12 66 93 379 370 14 220 30 326 241 +1048 /data/VOCdevkit/VOC2007/JPEGImages/002073.jpg 500 333 19 216 1 500 333 +1049 /data/VOCdevkit/VOC2007/JPEGImages/002074.jpg 500 375 19 79 89 190 178 14 207 92 291 268 15 284 146 440 294 14 100 104 177 160 +1050 /data/VOCdevkit/VOC2007/JPEGImages/002075.jpg 500 375 2 209 74 421 212 +1051 /data/VOCdevkit/VOC2007/JPEGImages/002076.jpg 500 333 11 8 83 303 252 +1052 /data/VOCdevkit/VOC2007/JPEGImages/002077.jpg 375 500 14 1 68 374 500 +1053 /data/VOCdevkit/VOC2007/JPEGImages/002078.jpg 500 375 1 1 57 470 346 +1054 /data/VOCdevkit/VOC2007/JPEGImages/002079.jpg 500 375 14 210 37 327 374 14 313 79 433 372 +1055 /data/VOCdevkit/VOC2007/JPEGImages/002080.jpg 500 333 18 1 50 500 304 +1056 /data/VOCdevkit/VOC2007/JPEGImages/002081.jpg 500 281 19 211 141 344 252 8 1 182 87 281 +1057 /data/VOCdevkit/VOC2007/JPEGImages/002084.jpg 500 375 7 2 3 317 373 +1058 /data/VOCdevkit/VOC2007/JPEGImages/002085.jpg 500 375 3 166 213 245 285 +1059 /data/VOCdevkit/VOC2007/JPEGImages/002087.jpg 500 375 14 45 134 120 340 14 1 153 33 351 14 106 131 167 273 14 119 127 224 375 14 196 101 331 375 14 440 255 500 375 +1060 /data/VOCdevkit/VOC2007/JPEGImages/002089.jpg 500 333 0 163 140 310 182 +1061 /data/VOCdevkit/VOC2007/JPEGImages/002092.jpg 387 500 9 105 324 215 412 9 11 342 91 424 +1062 /data/VOCdevkit/VOC2007/JPEGImages/002093.jpg 500 333 19 140 5 327 251 +1063 /data/VOCdevkit/VOC2007/JPEGImages/002097.jpg 500 281 14 93 3 496 279 +1064 /data/VOCdevkit/VOC2007/JPEGImages/002100.jpg 500 375 8 234 233 266 284 8 169 235 210 284 8 104 235 144 289 +1065 /data/VOCdevkit/VOC2007/JPEGImages/002103.jpg 500 333 2 56 111 301 255 +1066 /data/VOCdevkit/VOC2007/JPEGImages/002105.jpg 500 375 13 169 96 407 276 14 237 99 358 240 +1067 /data/VOCdevkit/VOC2007/JPEGImages/002106.jpg 375 500 7 1 2 359 500 +1068 /data/VOCdevkit/VOC2007/JPEGImages/002107.jpg 500 375 0 408 243 449 257 +1069 /data/VOCdevkit/VOC2007/JPEGImages/002110.jpg 500 314 14 133 226 150 294 14 149 211 172 283 0 26 54 464 232 +1070 /data/VOCdevkit/VOC2007/JPEGImages/002111.jpg 500 375 14 387 157 412 199 14 332 137 385 263 14 316 145 351 247 14 220 113 280 287 11 97 224 211 292 +1071 /data/VOCdevkit/VOC2007/JPEGImages/002113.jpg 397 500 7 24 8 353 500 +1072 /data/VOCdevkit/VOC2007/JPEGImages/002115.jpg 500 326 9 192 101 280 254 9 343 75 373 113 +1073 /data/VOCdevkit/VOC2007/JPEGImages/002118.jpg 500 334 6 1 160 389 334 6 1 144 458 311 6 9 109 418 234 6 1 105 461 237 6 215 109 487 211 +1074 /data/VOCdevkit/VOC2007/JPEGImages/002119.jpg 500 375 19 369 135 443 202 14 155 65 256 332 14 85 36 164 368 14 30 2 143 375 14 6 117 31 153 +1075 /data/VOCdevkit/VOC2007/JPEGImages/002121.jpg 500 375 16 143 96 242 248 14 15 25 203 345 +1076 /data/VOCdevkit/VOC2007/JPEGImages/002122.jpg 300 224 17 3 26 298 208 +1077 /data/VOCdevkit/VOC2007/JPEGImages/002123.jpg 500 334 15 345 257 369 311 15 72 255 128 302 15 36 146 84 308 +1078 /data/VOCdevkit/VOC2007/JPEGImages/002127.jpg 500 375 17 2 1 470 368 +1079 /data/VOCdevkit/VOC2007/JPEGImages/002128.jpg 500 375 1 42 14 455 291 +1080 /data/VOCdevkit/VOC2007/JPEGImages/002130.jpg 500 375 13 63 85 384 312 +1081 /data/VOCdevkit/VOC2007/JPEGImages/002131.jpg 500 456 11 141 2 337 224 +1082 /data/VOCdevkit/VOC2007/JPEGImages/002133.jpg 500 375 11 185 130 319 242 16 1 189 199 375 16 94 244 357 375 +1083 /data/VOCdevkit/VOC2007/JPEGImages/002137.jpg 375 500 16 301 269 375 367 16 206 249 298 316 16 89 236 202 401 16 219 267 308 409 14 80 118 139 369 +1084 /data/VOCdevkit/VOC2007/JPEGImages/002138.jpg 500 375 11 2 28 333 318 +1085 /data/VOCdevkit/VOC2007/JPEGImages/002141.jpg 333 500 11 29 243 272 441 8 253 167 296 220 6 68 131 147 181 6 1 141 46 184 6 231 126 319 174 14 139 58 259 415 +1086 /data/VOCdevkit/VOC2007/JPEGImages/002143.jpg 500 333 6 96 36 453 266 +1087 /data/VOCdevkit/VOC2007/JPEGImages/002144.jpg 500 375 2 1 114 312 233 2 391 254 433 308 2 153 29 171 58 2 42 301 78 355 +1088 /data/VOCdevkit/VOC2007/JPEGImages/002147.jpg 500 333 7 57 17 500 328 +1089 /data/VOCdevkit/VOC2007/JPEGImages/002148.jpg 500 375 18 3 96 491 314 +1090 /data/VOCdevkit/VOC2007/JPEGImages/002149.jpg 500 400 6 96 167 448 277 +1091 /data/VOCdevkit/VOC2007/JPEGImages/002150.jpg 500 375 18 5 62 500 327 +1092 /data/VOCdevkit/VOC2007/JPEGImages/002154.jpg 500 333 6 1 91 184 217 6 407 95 461 146 6 327 96 433 174 6 39 94 362 294 6 439 94 482 132 +1093 /data/VOCdevkit/VOC2007/JPEGImages/002157.jpg 500 329 0 8 87 496 219 +1094 /data/VOCdevkit/VOC2007/JPEGImages/002159.jpg 500 375 8 423 52 500 266 8 5 73 89 214 14 157 57 357 375 14 22 4 420 375 +1095 /data/VOCdevkit/VOC2007/JPEGImages/002160.jpg 500 375 11 1 105 264 252 11 184 130 500 306 +1096 /data/VOCdevkit/VOC2007/JPEGImages/002161.jpg 500 375 8 188 223 248 305 8 149 233 214 310 15 1 179 53 344 +1097 /data/VOCdevkit/VOC2007/JPEGImages/002162.jpg 500 375 7 88 56 454 297 +1098 /data/VOCdevkit/VOC2007/JPEGImages/002164.jpg 500 346 14 1 35 463 345 +1099 /data/VOCdevkit/VOC2007/JPEGImages/002167.jpg 500 333 7 59 163 181 331 10 5 157 411 329 +1100 /data/VOCdevkit/VOC2007/JPEGImages/002168.jpg 500 375 14 114 174 164 307 14 231 174 280 302 14 298 179 342 301 14 367 179 403 294 14 461 177 500 307 14 168 188 193 252 14 326 181 353 274 14 262 185 290 273 1 430 230 500 310 1 358 227 429 299 1 295 233 351 305 1 153 223 185 281 1 121 230 155 321 +1101 /data/VOCdevkit/VOC2007/JPEGImages/002173.jpg 500 333 9 45 2 500 333 +1102 /data/VOCdevkit/VOC2007/JPEGImages/002175.jpg 500 375 3 11 216 85 240 +1103 /data/VOCdevkit/VOC2007/JPEGImages/002177.jpg 500 330 5 1 112 93 205 5 105 115 341 241 6 211 185 284 255 6 240 183 500 298 6 1 178 149 307 +1104 /data/VOCdevkit/VOC2007/JPEGImages/002185.jpg 500 331 13 168 111 500 331 13 43 93 313 265 14 312 31 500 293 14 130 46 293 216 6 289 14 420 70 14 277 21 298 56 13 128 53 161 109 13 107 49 132 103 13 63 52 110 104 13 1 58 61 106 14 335 25 396 78 +1105 /data/VOCdevkit/VOC2007/JPEGImages/002188.jpg 500 375 10 2 19 500 375 +1106 /data/VOCdevkit/VOC2007/JPEGImages/002189.jpg 500 375 10 4 220 499 375 14 84 53 295 315 14 242 83 401 263 14 18 48 137 175 14 102 68 148 119 +1107 /data/VOCdevkit/VOC2007/JPEGImages/002195.jpg 500 375 14 220 72 467 367 14 2 105 124 375 +1108 /data/VOCdevkit/VOC2007/JPEGImages/002198.jpg 500 369 0 118 106 426 177 +1109 /data/VOCdevkit/VOC2007/JPEGImages/002200.jpg 500 375 11 26 27 412 345 +1110 /data/VOCdevkit/VOC2007/JPEGImages/002203.jpg 450 338 11 44 136 213 326 14 10 41 436 338 +1111 /data/VOCdevkit/VOC2007/JPEGImages/002204.jpg 320 226 12 75 46 236 186 14 135 12 211 107 +1112 /data/VOCdevkit/VOC2007/JPEGImages/002205.jpg 500 369 7 48 1 500 355 +1113 /data/VOCdevkit/VOC2007/JPEGImages/002206.jpg 500 325 18 51 135 373 248 +1114 /data/VOCdevkit/VOC2007/JPEGImages/002207.jpg 476 500 11 68 114 440 468 8 3 204 474 500 14 4 36 474 500 4 416 156 448 226 +1115 /data/VOCdevkit/VOC2007/JPEGImages/002210.jpg 500 375 6 2 92 368 375 +1116 /data/VOCdevkit/VOC2007/JPEGImages/002211.jpg 375 500 14 13 305 61 380 14 2 344 57 440 14 61 323 119 436 14 195 307 234 369 14 189 344 247 454 14 192 334 313 497 14 297 322 375 500 14 135 337 184 447 +1117 /data/VOCdevkit/VOC2007/JPEGImages/002216.jpg 500 340 5 360 110 500 313 5 65 104 396 319 +1118 /data/VOCdevkit/VOC2007/JPEGImages/002217.jpg 500 333 0 42 73 273 155 0 191 111 422 183 0 345 152 500 212 0 74 149 299 221 0 227 188 486 257 0 118 220 372 294 +1119 /data/VOCdevkit/VOC2007/JPEGImages/002222.jpg 333 500 7 23 14 319 343 +1120 /data/VOCdevkit/VOC2007/JPEGImages/002223.jpg 375 500 14 357 214 375 311 14 321 215 354 317 14 266 225 295 346 5 1 1 220 476 +1121 /data/VOCdevkit/VOC2007/JPEGImages/002225.jpg 500 375 3 81 238 460 359 +1122 /data/VOCdevkit/VOC2007/JPEGImages/002227.jpg 500 333 19 419 64 500 135 1 33 20 450 330 +1123 /data/VOCdevkit/VOC2007/JPEGImages/002229.jpg 500 333 14 385 188 425 280 5 37 95 433 304 +1124 /data/VOCdevkit/VOC2007/JPEGImages/002230.jpg 500 375 17 118 218 325 331 14 52 246 150 356 +1125 /data/VOCdevkit/VOC2007/JPEGImages/002231.jpg 500 375 4 256 1 349 192 4 309 136 466 275 4 287 274 433 375 4 2 240 179 340 4 1 89 151 240 4 112 1 213 137 4 146 44 297 287 +1126 /data/VOCdevkit/VOC2007/JPEGImages/002232.jpg 500 303 6 396 237 493 282 6 360 220 391 237 +1127 /data/VOCdevkit/VOC2007/JPEGImages/002235.jpg 500 333 4 453 110 465 153 4 442 164 458 209 14 275 119 422 315 14 245 143 298 237 14 109 92 271 333 14 2 102 178 331 +1128 /data/VOCdevkit/VOC2007/JPEGImages/002236.jpg 500 333 18 31 30 385 302 +1129 /data/VOCdevkit/VOC2007/JPEGImages/002239.jpg 500 333 1 344 176 432 306 1 297 181 349 266 1 116 144 189 270 14 341 79 424 283 14 290 132 344 262 14 111 61 186 245 14 10 75 61 140 +1130 /data/VOCdevkit/VOC2007/JPEGImages/002240.jpg 375 500 8 212 28 318 136 15 318 1 368 43 +1131 /data/VOCdevkit/VOC2007/JPEGImages/002242.jpg 500 334 6 1 127 276 332 5 164 75 387 178 6 414 135 500 196 14 345 127 370 192 14 208 127 264 328 14 244 120 295 303 +1132 /data/VOCdevkit/VOC2007/JPEGImages/002243.jpg 500 375 11 47 45 471 373 +1133 /data/VOCdevkit/VOC2007/JPEGImages/002245.jpg 500 302 6 433 187 473 213 6 52 198 131 249 6 1 206 58 251 5 128 38 438 268 +1134 /data/VOCdevkit/VOC2007/JPEGImages/002246.jpg 333 500 0 6 73 326 471 14 54 210 82 277 +1135 /data/VOCdevkit/VOC2007/JPEGImages/002250.jpg 375 500 14 256 157 291 203 14 225 185 281 259 14 75 107 335 500 +1136 /data/VOCdevkit/VOC2007/JPEGImages/002252.jpg 500 420 19 337 116 492 324 14 26 5 357 344 +1137 /data/VOCdevkit/VOC2007/JPEGImages/002254.jpg 334 500 11 143 261 334 493 17 3 253 147 500 7 12 274 80 320 14 146 153 209 270 +1138 /data/VOCdevkit/VOC2007/JPEGImages/002258.jpg 500 375 19 194 78 361 231 +1139 /data/VOCdevkit/VOC2007/JPEGImages/002262.jpg 500 333 14 93 36 467 333 +1140 /data/VOCdevkit/VOC2007/JPEGImages/002264.jpg 375 500 8 210 219 274 363 +1141 /data/VOCdevkit/VOC2007/JPEGImages/002269.jpg 329 500 12 66 58 224 196 14 2 116 194 485 +1142 /data/VOCdevkit/VOC2007/JPEGImages/002271.jpg 500 333 6 127 96 365 203 +1143 /data/VOCdevkit/VOC2007/JPEGImages/002274.jpg 375 500 3 61 66 276 406 3 17 278 57 369 +1144 /data/VOCdevkit/VOC2007/JPEGImages/002275.jpg 500 421 7 1 9 373 421 +1145 /data/VOCdevkit/VOC2007/JPEGImages/002282.jpg 500 375 19 155 203 259 312 +1146 /data/VOCdevkit/VOC2007/JPEGImages/002283.jpg 500 379 12 235 77 419 350 14 270 52 380 248 +1147 /data/VOCdevkit/VOC2007/JPEGImages/002286.jpg 500 324 11 15 29 327 324 11 226 121 500 324 +1148 /data/VOCdevkit/VOC2007/JPEGImages/002289.jpg 500 335 18 214 136 330 196 +1149 /data/VOCdevkit/VOC2007/JPEGImages/002292.jpg 500 375 1 83 225 310 375 +1150 /data/VOCdevkit/VOC2007/JPEGImages/002294.jpg 500 375 6 1 13 498 375 14 390 1 434 115 14 355 2 390 49 14 295 3 320 35 14 26 1 77 105 14 1 1 40 111 +1151 /data/VOCdevkit/VOC2007/JPEGImages/002295.jpg 500 333 14 84 1 499 331 +1152 /data/VOCdevkit/VOC2007/JPEGImages/002296.jpg 500 333 14 425 164 457 256 +1153 /data/VOCdevkit/VOC2007/JPEGImages/002297.jpg 500 375 17 292 85 500 213 8 367 166 500 375 15 264 92 291 124 +1154 /data/VOCdevkit/VOC2007/JPEGImages/002298.jpg 500 333 14 13 89 500 306 8 3 59 410 333 8 193 40 493 163 +1155 /data/VOCdevkit/VOC2007/JPEGImages/002299.jpg 500 375 9 1 2 441 375 +1156 /data/VOCdevkit/VOC2007/JPEGImages/002301.jpg 500 375 14 381 121 448 208 14 415 92 500 340 14 366 66 432 180 14 329 66 382 181 14 257 69 319 151 14 166 62 234 138 14 19 87 65 160 14 58 102 263 375 14 1 91 110 308 14 130 71 169 108 10 167 145 426 375 +1157 /data/VOCdevkit/VOC2007/JPEGImages/002303.jpg 500 332 7 105 39 377 321 +1158 /data/VOCdevkit/VOC2007/JPEGImages/002304.jpg 500 375 7 19 47 499 333 +1159 /data/VOCdevkit/VOC2007/JPEGImages/002309.jpg 500 333 2 61 43 400 319 +1160 /data/VOCdevkit/VOC2007/JPEGImages/002312.jpg 500 375 7 1 19 499 255 +1161 /data/VOCdevkit/VOC2007/JPEGImages/002313.jpg 500 428 9 5 62 461 428 +1162 /data/VOCdevkit/VOC2007/JPEGImages/002314.jpg 333 500 9 112 1 333 276 9 38 2 255 218 9 1 50 45 86 14 54 270 298 500 +1163 /data/VOCdevkit/VOC2007/JPEGImages/002316.jpg 458 500 2 104 52 377 425 +1164 /data/VOCdevkit/VOC2007/JPEGImages/002317.jpg 500 375 5 111 3 500 280 14 221 168 278 371 14 167 192 224 375 14 150 159 206 374 14 26 121 76 272 14 1 123 20 275 +1165 /data/VOCdevkit/VOC2007/JPEGImages/002319.jpg 375 500 6 73 165 375 413 +1166 /data/VOCdevkit/VOC2007/JPEGImages/002322.jpg 375 500 8 135 369 238 500 8 6 373 121 500 8 290 334 344 499 10 1 356 280 500 +1167 /data/VOCdevkit/VOC2007/JPEGImages/002325.jpg 500 377 1 245 244 462 377 1 1 274 258 377 1 125 243 274 377 14 268 138 361 377 14 43 193 207 373 14 137 161 196 222 +1168 /data/VOCdevkit/VOC2007/JPEGImages/002326.jpg 500 375 9 376 115 424 158 9 294 128 344 178 9 177 135 220 188 9 238 171 278 248 14 364 178 401 278 +1169 /data/VOCdevkit/VOC2007/JPEGImages/002327.jpg 332 500 11 2 81 296 500 +1170 /data/VOCdevkit/VOC2007/JPEGImages/002331.jpg 500 333 12 138 87 288 333 14 114 12 309 265 14 222 54 479 333 6 2 56 53 103 6 70 52 120 101 6 224 57 292 99 6 292 54 370 97 +1171 /data/VOCdevkit/VOC2007/JPEGImages/002336.jpg 500 375 2 3 94 447 286 2 1 180 174 375 +1172 /data/VOCdevkit/VOC2007/JPEGImages/002338.jpg 500 375 16 239 111 365 207 16 176 114 254 196 16 146 90 167 114 16 426 84 454 108 16 462 92 487 115 +1173 /data/VOCdevkit/VOC2007/JPEGImages/002339.jpg 500 375 15 231 156 338 257 +1174 /data/VOCdevkit/VOC2007/JPEGImages/002341.jpg 300 250 14 28 4 165 249 14 177 11 291 249 11 22 88 130 222 11 143 168 254 250 +1175 /data/VOCdevkit/VOC2007/JPEGImages/002344.jpg 333 500 14 3 44 333 500 +1176 /data/VOCdevkit/VOC2007/JPEGImages/002346.jpg 500 375 6 95 78 398 282 +1177 /data/VOCdevkit/VOC2007/JPEGImages/002349.jpg 500 375 6 159 164 298 242 +1178 /data/VOCdevkit/VOC2007/JPEGImages/002351.jpg 500 375 18 1 121 399 287 +1179 /data/VOCdevkit/VOC2007/JPEGImages/002353.jpg 500 375 8 34 247 177 375 8 202 233 254 327 +1180 /data/VOCdevkit/VOC2007/JPEGImages/002356.jpg 500 375 19 4 54 158 223 +1181 /data/VOCdevkit/VOC2007/JPEGImages/002357.jpg 500 375 0 39 171 437 329 +1182 /data/VOCdevkit/VOC2007/JPEGImages/002358.jpg 500 375 6 223 208 288 227 +1183 /data/VOCdevkit/VOC2007/JPEGImages/002360.jpg 304 480 12 74 153 264 386 14 165 94 244 286 +1184 /data/VOCdevkit/VOC2007/JPEGImages/002363.jpg 500 375 14 234 181 275 322 14 189 181 231 325 14 106 182 151 346 14 18 189 54 344 +1185 /data/VOCdevkit/VOC2007/JPEGImages/002365.jpg 333 500 14 40 31 301 477 8 45 64 318 443 +1186 /data/VOCdevkit/VOC2007/JPEGImages/002370.jpg 500 375 6 355 174 391 213 +1187 /data/VOCdevkit/VOC2007/JPEGImages/002379.jpg 500 375 14 404 4 500 375 14 97 1 203 86 13 61 42 432 347 13 3 2 270 181 +1188 /data/VOCdevkit/VOC2007/JPEGImages/002380.jpg 500 333 2 114 121 277 331 +1189 /data/VOCdevkit/VOC2007/JPEGImages/002381.jpg 375 500 15 195 378 284 471 +1190 /data/VOCdevkit/VOC2007/JPEGImages/002383.jpg 500 333 5 95 38 338 265 6 339 178 379 207 6 381 177 405 200 6 1 212 29 253 +1191 /data/VOCdevkit/VOC2007/JPEGImages/002386.jpg 500 333 18 26 82 500 265 +1192 /data/VOCdevkit/VOC2007/JPEGImages/002388.jpg 500 375 7 134 3 500 326 +1193 /data/VOCdevkit/VOC2007/JPEGImages/002389.jpg 500 375 10 29 185 436 374 8 82 188 231 375 8 331 177 455 374 8 248 201 377 374 +1194 /data/VOCdevkit/VOC2007/JPEGImages/002390.jpg 500 332 3 157 28 393 273 +1195 /data/VOCdevkit/VOC2007/JPEGImages/002394.jpg 375 500 19 150 214 281 369 14 71 35 108 65 14 32 31 50 105 14 4 31 27 105 14 15 29 33 105 7 92 147 117 172 +1196 /data/VOCdevkit/VOC2007/JPEGImages/002395.jpg 500 375 3 75 1 484 284 +1197 /data/VOCdevkit/VOC2007/JPEGImages/002396.jpg 500 375 11 141 86 463 362 +1198 /data/VOCdevkit/VOC2007/JPEGImages/002397.jpg 333 500 14 139 199 202 341 1 136 247 202 378 +1199 /data/VOCdevkit/VOC2007/JPEGImages/002398.jpg 299 480 12 80 110 250 434 14 82 85 218 291 +1200 /data/VOCdevkit/VOC2007/JPEGImages/002399.jpg 500 379 14 11 94 429 376 14 9 50 272 327 +1201 /data/VOCdevkit/VOC2007/JPEGImages/002400.jpg 350 500 2 2 27 305 499 +1202 /data/VOCdevkit/VOC2007/JPEGImages/002402.jpg 500 281 14 332 3 351 51 14 250 16 277 54 14 122 22 146 73 6 399 1 500 74 6 55 50 464 240 +1203 /data/VOCdevkit/VOC2007/JPEGImages/002406.jpg 500 375 6 221 167 449 238 +1204 /data/VOCdevkit/VOC2007/JPEGImages/002408.jpg 500 332 11 70 48 493 332 +1205 /data/VOCdevkit/VOC2007/JPEGImages/002409.jpg 480 385 12 89 74 445 366 14 201 35 313 220 +1206 /data/VOCdevkit/VOC2007/JPEGImages/002412.jpg 500 375 2 274 181 305 220 2 210 199 247 240 +1207 /data/VOCdevkit/VOC2007/JPEGImages/002414.jpg 500 375 17 337 222 500 319 +1208 /data/VOCdevkit/VOC2007/JPEGImages/002416.jpg 500 375 6 168 150 488 316 +1209 /data/VOCdevkit/VOC2007/JPEGImages/002418.jpg 500 333 18 1 149 260 209 +1210 /data/VOCdevkit/VOC2007/JPEGImages/002421.jpg 500 322 14 249 29 323 247 12 128 83 426 301 +1211 /data/VOCdevkit/VOC2007/JPEGImages/002422.jpg 375 500 15 34 8 283 500 +1212 /data/VOCdevkit/VOC2007/JPEGImages/002424.jpg 500 323 6 401 222 490 285 +1213 /data/VOCdevkit/VOC2007/JPEGImages/002426.jpg 500 375 14 95 34 493 285 17 38 2 248 116 +1214 /data/VOCdevkit/VOC2007/JPEGImages/002428.jpg 500 375 11 383 120 500 238 14 97 79 270 374 +1215 /data/VOCdevkit/VOC2007/JPEGImages/002429.jpg 500 357 4 329 137 369 266 4 217 161 268 285 14 1 37 277 357 14 278 56 453 356 +1216 /data/VOCdevkit/VOC2007/JPEGImages/002430.jpg 500 375 7 79 28 361 375 19 1 1 466 190 +1217 /data/VOCdevkit/VOC2007/JPEGImages/002431.jpg 500 375 2 179 150 317 235 +1218 /data/VOCdevkit/VOC2007/JPEGImages/002432.jpg 472 500 2 102 235 256 344 +1219 /data/VOCdevkit/VOC2007/JPEGImages/002434.jpg 500 333 14 116 67 336 333 +1220 /data/VOCdevkit/VOC2007/JPEGImages/002438.jpg 375 500 14 43 283 269 500 14 113 2 375 500 +1221 /data/VOCdevkit/VOC2007/JPEGImages/002440.jpg 375 500 7 49 54 282 500 +1222 /data/VOCdevkit/VOC2007/JPEGImages/002446.jpg 500 375 6 187 150 289 238 14 100 138 139 238 14 286 140 323 238 14 429 132 467 238 6 15 153 149 234 6 317 157 435 233 +1223 /data/VOCdevkit/VOC2007/JPEGImages/002447.jpg 500 375 11 110 59 500 264 +1224 /data/VOCdevkit/VOC2007/JPEGImages/002449.jpg 500 375 3 275 213 338 234 8 247 294 424 375 8 161 255 224 307 10 308 267 500 374 10 1 254 183 319 +1225 /data/VOCdevkit/VOC2007/JPEGImages/002451.jpg 500 375 15 1 153 38 375 15 29 254 179 375 +1226 /data/VOCdevkit/VOC2007/JPEGImages/002453.jpg 500 209 7 17 22 252 207 7 262 34 486 193 +1227 /data/VOCdevkit/VOC2007/JPEGImages/002455.jpg 500 393 17 6 168 443 275 14 78 133 207 272 14 202 140 288 264 14 285 111 419 264 +1228 /data/VOCdevkit/VOC2007/JPEGImages/002457.jpg 500 347 18 266 160 500 278 +1229 /data/VOCdevkit/VOC2007/JPEGImages/002463.jpg 333 500 14 183 152 308 455 14 3 28 202 464 14 156 111 268 261 8 263 208 333 440 +1230 /data/VOCdevkit/VOC2007/JPEGImages/002464.jpg 500 333 11 292 110 366 199 +1231 /data/VOCdevkit/VOC2007/JPEGImages/002467.jpg 500 390 0 33 144 455 258 0 100 218 195 256 0 235 222 385 261 0 341 225 454 261 +1232 /data/VOCdevkit/VOC2007/JPEGImages/002469.jpg 500 375 19 1 131 125 375 14 206 115 435 375 +1233 /data/VOCdevkit/VOC2007/JPEGImages/002473.jpg 500 375 1 4 17 494 329 +1234 /data/VOCdevkit/VOC2007/JPEGImages/002474.jpg 347 500 3 121 102 250 262 3 85 89 212 271 3 68 114 183 283 +1235 /data/VOCdevkit/VOC2007/JPEGImages/002475.jpg 500 375 1 306 228 370 314 1 225 213 288 301 1 151 204 217 294 1 72 188 142 279 14 310 173 363 299 14 312 146 405 316 14 235 161 284 280 14 256 139 302 299 14 149 154 206 267 14 171 125 235 290 14 75 141 133 258 14 92 122 164 282 14 263 125 283 166 +1236 /data/VOCdevkit/VOC2007/JPEGImages/002482.jpg 375 500 15 60 362 140 456 +1237 /data/VOCdevkit/VOC2007/JPEGImages/002484.jpg 500 357 6 82 253 114 276 6 116 252 139 276 6 140 249 175 277 6 199 252 263 292 6 294 253 375 292 +1238 /data/VOCdevkit/VOC2007/JPEGImages/002485.jpg 500 374 11 299 167 500 374 11 9 30 240 374 +1239 /data/VOCdevkit/VOC2007/JPEGImages/002486.jpg 500 333 2 5 122 53 170 2 109 93 175 133 2 150 110 229 154 2 233 100 306 144 2 394 124 474 168 2 311 144 396 195 2 110 153 216 215 +1240 /data/VOCdevkit/VOC2007/JPEGImages/002487.jpg 500 375 18 104 64 242 333 18 219 45 443 364 +1241 /data/VOCdevkit/VOC2007/JPEGImages/002488.jpg 375 500 14 110 75 281 443 13 11 226 375 500 +1242 /data/VOCdevkit/VOC2007/JPEGImages/002489.jpg 500 288 17 3 6 500 281 +1243 /data/VOCdevkit/VOC2007/JPEGImages/002495.jpg 500 358 13 1 28 461 355 +1244 /data/VOCdevkit/VOC2007/JPEGImages/002498.jpg 500 375 14 1 87 195 375 14 259 93 452 375 +1245 /data/VOCdevkit/VOC2007/JPEGImages/002499.jpg 500 333 10 7 61 500 333 14 260 1 500 251 +1246 /data/VOCdevkit/VOC2007/JPEGImages/002503.jpg 327 500 19 2 215 137 354 14 176 54 287 449 14 33 237 121 334 +1247 /data/VOCdevkit/VOC2007/JPEGImages/002506.jpg 334 500 8 148 93 299 380 8 16 94 185 476 8 1 1 91 149 +1248 /data/VOCdevkit/VOC2007/JPEGImages/002507.jpg 500 333 13 461 2 500 84 13 2 1 479 333 +1249 /data/VOCdevkit/VOC2007/JPEGImages/002509.jpg 327 500 14 1 3 327 499 +1250 /data/VOCdevkit/VOC2007/JPEGImages/002510.jpg 500 333 17 174 121 488 329 8 3 127 177 271 8 178 102 220 183 10 160 102 277 160 15 143 4 174 103 +1251 /data/VOCdevkit/VOC2007/JPEGImages/002511.jpg 433 480 14 190 84 295 295 12 95 120 385 456 +1252 /data/VOCdevkit/VOC2007/JPEGImages/002515.jpg 500 333 14 33 106 64 190 +1253 /data/VOCdevkit/VOC2007/JPEGImages/002516.jpg 500 375 14 215 160 337 375 14 328 140 499 375 14 349 224 496 375 14 28 84 312 375 14 278 32 302 89 14 285 44 319 102 +1254 /data/VOCdevkit/VOC2007/JPEGImages/002517.jpg 500 375 6 80 75 430 315 +1255 /data/VOCdevkit/VOC2007/JPEGImages/002521.jpg 500 284 18 11 59 496 255 +1256 /data/VOCdevkit/VOC2007/JPEGImages/002522.jpg 500 333 6 1 12 495 286 +1257 /data/VOCdevkit/VOC2007/JPEGImages/002526.jpg 500 375 6 85 104 388 236 +1258 /data/VOCdevkit/VOC2007/JPEGImages/002527.jpg 375 500 15 1 40 373 500 +1259 /data/VOCdevkit/VOC2007/JPEGImages/002528.jpg 500 375 14 273 46 443 308 +1260 /data/VOCdevkit/VOC2007/JPEGImages/002530.jpg 500 374 5 109 104 391 288 5 2 164 117 278 +1261 /data/VOCdevkit/VOC2007/JPEGImages/002531.jpg 500 375 6 12 85 490 353 14 344 46 378 89 +1262 /data/VOCdevkit/VOC2007/JPEGImages/002532.jpg 500 333 18 185 111 500 231 6 111 175 157 205 6 68 172 114 203 +1263 /data/VOCdevkit/VOC2007/JPEGImages/002535.jpg 500 375 11 9 41 500 290 +1264 /data/VOCdevkit/VOC2007/JPEGImages/002536.jpg 500 333 10 3 136 489 330 4 246 117 266 180 +1265 /data/VOCdevkit/VOC2007/JPEGImages/002538.jpg 500 345 4 200 226 231 328 14 120 42 274 290 14 104 1 282 305 +1266 /data/VOCdevkit/VOC2007/JPEGImages/002541.jpg 500 337 11 34 61 474 283 +1267 /data/VOCdevkit/VOC2007/JPEGImages/002543.jpg 500 333 6 256 231 500 333 6 1 255 256 333 6 238 252 302 300 +1268 /data/VOCdevkit/VOC2007/JPEGImages/002548.jpg 500 375 6 249 115 360 208 6 31 67 247 232 6 375 117 500 219 +1269 /data/VOCdevkit/VOC2007/JPEGImages/002550.jpg 333 500 14 32 50 333 500 +1270 /data/VOCdevkit/VOC2007/JPEGImages/002551.jpg 500 333 14 455 8 500 223 14 1 11 90 163 14 104 1 199 166 14 250 74 478 333 14 94 53 294 300 +1271 /data/VOCdevkit/VOC2007/JPEGImages/002552.jpg 375 500 7 102 241 170 348 +1272 /data/VOCdevkit/VOC2007/JPEGImages/002553.jpg 500 377 12 114 28 457 377 +1273 /data/VOCdevkit/VOC2007/JPEGImages/002556.jpg 500 356 6 7 1 500 308 +1274 /data/VOCdevkit/VOC2007/JPEGImages/002557.jpg 500 375 15 421 76 466 172 15 281 65 342 112 15 330 46 410 113 15 196 2 261 108 15 118 3 212 114 15 100 87 146 123 15 63 89 103 128 15 38 1 105 70 15 25 143 94 245 15 169 177 224 230 15 133 173 182 215 15 86 184 143 234 15 228 188 291 238 15 277 151 345 222 15 340 179 405 267 +1275 /data/VOCdevkit/VOC2007/JPEGImages/002560.jpg 375 500 4 8 1 156 394 +1276 /data/VOCdevkit/VOC2007/JPEGImages/002562.jpg 500 375 6 29 76 500 308 14 99 40 197 283 14 181 66 272 294 +1277 /data/VOCdevkit/VOC2007/JPEGImages/002568.jpg 500 332 13 86 37 394 332 13 3 12 120 140 +1278 /data/VOCdevkit/VOC2007/JPEGImages/002570.jpg 375 500 14 2 2 375 500 +1279 /data/VOCdevkit/VOC2007/JPEGImages/002573.jpg 500 375 12 317 160 427 239 12 369 158 500 261 12 255 140 316 178 12 302 135 369 179 12 116 148 270 276 12 58 154 177 246 14 426 117 471 220 14 370 121 402 174 14 175 117 206 230 14 89 128 108 162 +1280 /data/VOCdevkit/VOC2007/JPEGImages/002574.jpg 500 333 11 104 69 311 295 +1281 /data/VOCdevkit/VOC2007/JPEGImages/002575.jpg 500 380 4 415 281 436 355 4 434 311 459 380 4 316 314 364 380 8 13 245 72 348 14 276 128 420 327 14 179 134 257 355 14 222 146 323 357 +1282 /data/VOCdevkit/VOC2007/JPEGImages/002576.jpg 500 375 9 154 110 442 315 +1283 /data/VOCdevkit/VOC2007/JPEGImages/002577.jpg 500 375 6 28 54 478 311 +1284 /data/VOCdevkit/VOC2007/JPEGImages/002580.jpg 500 332 3 134 25 166 143 3 54 215 324 330 +1285 /data/VOCdevkit/VOC2007/JPEGImages/002581.jpg 500 375 8 453 184 500 314 +1286 /data/VOCdevkit/VOC2007/JPEGImages/002582.jpg 375 500 18 78 62 322 409 14 43 322 89 453 14 130 337 170 442 14 361 271 375 372 14 343 270 364 366 14 330 298 347 364 14 320 274 344 351 14 25 287 40 317 +1287 /data/VOCdevkit/VOC2007/JPEGImages/002583.jpg 500 375 0 2 1 500 254 6 65 266 390 375 +1288 /data/VOCdevkit/VOC2007/JPEGImages/002587.jpg 500 375 11 1 54 107 289 11 172 88 373 359 11 92 89 327 263 11 360 48 500 177 11 435 88 500 291 +1289 /data/VOCdevkit/VOC2007/JPEGImages/002588.jpg 500 375 14 1 97 247 375 14 206 51 476 375 +1290 /data/VOCdevkit/VOC2007/JPEGImages/002591.jpg 487 377 14 266 50 471 356 14 206 15 329 236 14 14 53 170 356 14 187 2 275 110 +1291 /data/VOCdevkit/VOC2007/JPEGImages/002592.jpg 500 333 13 43 4 427 333 +1292 /data/VOCdevkit/VOC2007/JPEGImages/002596.jpg 332 500 12 47 212 300 438 14 135 150 210 337 14 182 122 240 264 12 108 152 266 412 +1293 /data/VOCdevkit/VOC2007/JPEGImages/002597.jpg 500 375 7 88 173 422 375 11 51 21 388 248 +1294 /data/VOCdevkit/VOC2007/JPEGImages/002601.jpg 500 375 19 1 82 128 273 +1295 /data/VOCdevkit/VOC2007/JPEGImages/002602.jpg 500 418 6 89 1 490 61 13 177 54 401 293 14 172 36 337 288 +1296 /data/VOCdevkit/VOC2007/JPEGImages/002604.jpg 500 375 8 235 128 492 317 15 350 2 500 266 14 23 64 206 323 14 218 105 415 313 +1297 /data/VOCdevkit/VOC2007/JPEGImages/002607.jpg 500 318 6 126 112 348 193 +1298 /data/VOCdevkit/VOC2007/JPEGImages/002608.jpg 500 375 19 273 180 435 325 +1299 /data/VOCdevkit/VOC2007/JPEGImages/002610.jpg 500 375 6 1 241 213 344 +1300 /data/VOCdevkit/VOC2007/JPEGImages/002612.jpg 500 375 13 237 6 463 375 13 1 10 288 374 +1301 /data/VOCdevkit/VOC2007/JPEGImages/002614.jpg 500 333 10 150 220 476 333 14 405 156 500 333 14 344 146 427 277 14 311 150 369 241 14 274 150 323 230 14 374 91 500 245 14 148 170 203 241 14 90 169 126 224 14 65 180 164 333 14 1 181 192 333 +1302 /data/VOCdevkit/VOC2007/JPEGImages/002616.jpg 500 319 7 18 16 381 249 +1303 /data/VOCdevkit/VOC2007/JPEGImages/002617.jpg 500 375 8 46 134 125 232 8 13 129 67 220 +1304 /data/VOCdevkit/VOC2007/JPEGImages/002619.jpg 380 500 0 26 15 345 476 +1305 /data/VOCdevkit/VOC2007/JPEGImages/002620.jpg 333 500 7 42 222 322 421 14 156 28 333 500 +1306 /data/VOCdevkit/VOC2007/JPEGImages/002622.jpg 500 333 6 263 294 311 330 6 223 298 270 330 6 188 301 228 330 6 156 308 190 330 6 10 310 75 333 +1307 /data/VOCdevkit/VOC2007/JPEGImages/002623.jpg 500 375 9 1 1 455 375 9 402 252 500 350 +1308 /data/VOCdevkit/VOC2007/JPEGImages/002624.jpg 500 375 14 109 142 281 375 14 254 150 360 256 10 217 245 500 375 +1309 /data/VOCdevkit/VOC2007/JPEGImages/002626.jpg 375 500 14 92 275 132 376 14 27 284 65 423 14 1 284 29 412 14 177 274 224 398 14 254 284 309 415 14 259 249 374 500 +1310 /data/VOCdevkit/VOC2007/JPEGImages/002628.jpg 500 375 3 235 57 351 306 3 172 78 284 280 3 64 168 121 267 +1311 /data/VOCdevkit/VOC2007/JPEGImages/002629.jpg 500 335 0 250 168 339 197 +1312 /data/VOCdevkit/VOC2007/JPEGImages/002630.jpg 500 335 2 74 41 266 335 2 317 76 479 335 2 420 99 500 182 +1313 /data/VOCdevkit/VOC2007/JPEGImages/002631.jpg 333 500 14 11 133 207 429 14 97 85 291 312 1 71 204 309 429 1 173 128 333 341 +1314 /data/VOCdevkit/VOC2007/JPEGImages/002638.jpg 500 375 19 217 78 297 146 8 212 174 346 375 19 129 79 221 167 +1315 /data/VOCdevkit/VOC2007/JPEGImages/002639.jpg 500 375 14 345 158 402 284 14 240 141 307 301 14 185 156 242 301 +1316 /data/VOCdevkit/VOC2007/JPEGImages/002640.jpg 500 375 1 61 1 500 257 +1317 /data/VOCdevkit/VOC2007/JPEGImages/002642.jpg 375 500 7 58 132 208 408 +1318 /data/VOCdevkit/VOC2007/JPEGImages/002644.jpg 268 360 8 148 197 267 346 +1319 /data/VOCdevkit/VOC2007/JPEGImages/002650.jpg 500 375 17 1 134 159 363 8 320 98 394 209 8 221 75 311 204 +1320 /data/VOCdevkit/VOC2007/JPEGImages/002651.jpg 500 375 14 256 57 500 375 +1321 /data/VOCdevkit/VOC2007/JPEGImages/002652.jpg 500 375 11 149 112 396 337 14 196 1 316 309 +1322 /data/VOCdevkit/VOC2007/JPEGImages/002654.jpg 500 375 17 121 248 401 374 8 19 246 135 372 +1323 /data/VOCdevkit/VOC2007/JPEGImages/002655.jpg 480 407 12 82 84 423 303 14 164 50 286 212 +1324 /data/VOCdevkit/VOC2007/JPEGImages/002656.jpg 375 500 4 182 196 197 248 14 269 100 365 457 14 95 93 208 494 +1325 /data/VOCdevkit/VOC2007/JPEGImages/002660.jpg 500 375 14 233 162 500 375 14 121 124 271 251 +1326 /data/VOCdevkit/VOC2007/JPEGImages/002661.jpg 500 333 0 1 130 481 233 +1327 /data/VOCdevkit/VOC2007/JPEGImages/002663.jpg 500 340 11 12 38 346 314 8 286 6 498 270 +1328 /data/VOCdevkit/VOC2007/JPEGImages/002665.jpg 500 333 0 245 107 500 209 +1329 /data/VOCdevkit/VOC2007/JPEGImages/002671.jpg 500 375 14 1 54 500 375 14 249 131 499 375 +1330 /data/VOCdevkit/VOC2007/JPEGImages/002672.jpg 500 429 2 52 72 419 394 +1331 /data/VOCdevkit/VOC2007/JPEGImages/002673.jpg 500 375 14 134 64 466 375 +1332 /data/VOCdevkit/VOC2007/JPEGImages/002674.jpg 500 375 10 239 325 386 375 8 122 276 164 331 8 33 293 97 372 14 462 223 498 305 +1333 /data/VOCdevkit/VOC2007/JPEGImages/002676.jpg 500 333 9 426 273 458 296 9 382 271 418 300 9 348 244 384 296 9 286 252 337 304 9 245 248 286 299 9 204 252 256 308 +1334 /data/VOCdevkit/VOC2007/JPEGImages/002679.jpg 500 375 5 79 24 440 375 +1335 /data/VOCdevkit/VOC2007/JPEGImages/002681.jpg 333 500 6 11 181 325 452 +1336 /data/VOCdevkit/VOC2007/JPEGImages/002685.jpg 500 375 2 266 111 327 207 2 200 71 233 110 2 183 84 260 173 2 355 72 416 162 2 422 166 500 305 2 148 61 173 102 2 41 55 65 105 2 82 171 308 375 2 1 128 125 259 2 22 113 136 172 +1337 /data/VOCdevkit/VOC2007/JPEGImages/002686.jpg 500 375 13 125 184 357 365 14 169 167 295 363 14 254 137 325 227 +1338 /data/VOCdevkit/VOC2007/JPEGImages/002687.jpg 500 375 14 12 169 166 375 14 44 79 407 357 +1339 /data/VOCdevkit/VOC2007/JPEGImages/002688.jpg 500 371 18 1 87 467 293 +1340 /data/VOCdevkit/VOC2007/JPEGImages/002692.jpg 472 500 12 274 164 362 380 14 226 188 296 291 14 231 223 270 268 +1341 /data/VOCdevkit/VOC2007/JPEGImages/002694.jpg 500 375 7 10 48 459 284 +1342 /data/VOCdevkit/VOC2007/JPEGImages/002698.jpg 500 296 1 47 48 432 292 1 106 2 472 253 +1343 /data/VOCdevkit/VOC2007/JPEGImages/002700.jpg 500 375 14 257 63 412 373 +1344 /data/VOCdevkit/VOC2007/JPEGImages/002701.jpg 500 333 6 339 260 500 318 6 133 267 305 323 14 7 267 28 321 +1345 /data/VOCdevkit/VOC2007/JPEGImages/002703.jpg 500 375 0 102 176 188 234 6 181 204 251 235 +1346 /data/VOCdevkit/VOC2007/JPEGImages/002705.jpg 500 375 14 43 54 221 375 14 185 100 433 353 4 327 284 367 375 14 446 36 500 206 +1347 /data/VOCdevkit/VOC2007/JPEGImages/002707.jpg 500 333 0 93 103 499 241 +1348 /data/VOCdevkit/VOC2007/JPEGImages/002708.jpg 500 333 11 71 124 312 333 15 254 69 362 194 +1349 /data/VOCdevkit/VOC2007/JPEGImages/002711.jpg 500 375 4 1 248 64 375 14 362 54 474 319 +1350 /data/VOCdevkit/VOC2007/JPEGImages/002712.jpg 375 500 4 240 212 290 372 14 94 72 256 327 +1351 /data/VOCdevkit/VOC2007/JPEGImages/002716.jpg 500 375 5 8 181 223 296 5 3 127 293 248 5 8 109 316 218 5 74 67 376 186 5 107 49 404 159 +1352 /data/VOCdevkit/VOC2007/JPEGImages/002719.jpg 500 374 3 53 100 468 238 14 158 130 188 168 14 183 108 206 136 14 144 107 167 132 14 87 126 122 150 +1353 /data/VOCdevkit/VOC2007/JPEGImages/002720.jpg 331 347 11 1 34 206 346 +1354 /data/VOCdevkit/VOC2007/JPEGImages/002724.jpg 500 375 10 43 213 387 375 8 2 224 142 375 8 183 233 352 374 +1355 /data/VOCdevkit/VOC2007/JPEGImages/002725.jpg 500 363 11 101 4 500 363 +1356 /data/VOCdevkit/VOC2007/JPEGImages/002726.jpg 500 375 14 410 139 500 369 14 328 135 435 375 14 243 299 301 375 14 202 164 302 375 14 157 200 220 375 +1357 /data/VOCdevkit/VOC2007/JPEGImages/002728.jpg 500 334 18 264 170 376 236 14 333 1 500 332 14 1 1 223 334 +1358 /data/VOCdevkit/VOC2007/JPEGImages/002729.jpg 500 333 6 29 32 480 333 14 443 35 500 325 14 387 58 455 149 +1359 /data/VOCdevkit/VOC2007/JPEGImages/002731.jpg 500 375 1 277 188 384 295 14 311 160 371 268 +1360 /data/VOCdevkit/VOC2007/JPEGImages/002733.jpg 500 333 6 43 50 478 267 +1361 /data/VOCdevkit/VOC2007/JPEGImages/002736.jpg 375 500 7 15 68 375 470 +1362 /data/VOCdevkit/VOC2007/JPEGImages/002739.jpg 500 375 13 347 46 397 77 13 162 234 232 324 14 152 156 229 322 14 361 25 383 78 +1363 /data/VOCdevkit/VOC2007/JPEGImages/002740.jpg 500 375 7 45 124 293 295 6 135 2 424 205 +1364 /data/VOCdevkit/VOC2007/JPEGImages/002742.jpg 500 375 14 118 45 226 289 +1365 /data/VOCdevkit/VOC2007/JPEGImages/002743.jpg 500 375 4 450 88 496 216 15 358 114 409 223 15 160 8 444 229 15 122 94 261 223 4 96 216 162 344 15 26 93 189 229 +1366 /data/VOCdevkit/VOC2007/JPEGImages/002746.jpg 500 200 6 14 91 358 174 +1367 /data/VOCdevkit/VOC2007/JPEGImages/002748.jpg 500 375 14 31 173 41 199 +1368 /data/VOCdevkit/VOC2007/JPEGImages/002750.jpg 500 375 14 143 82 219 375 14 304 88 390 375 14 217 94 317 375 +1369 /data/VOCdevkit/VOC2007/JPEGImages/002752.jpg 500 375 17 192 182 341 270 17 143 202 201 344 +1370 /data/VOCdevkit/VOC2007/JPEGImages/002753.jpg 500 375 8 368 206 475 319 8 100 219 230 365 15 249 162 317 252 +1371 /data/VOCdevkit/VOC2007/JPEGImages/002754.jpg 500 333 0 47 49 454 219 +1372 /data/VOCdevkit/VOC2007/JPEGImages/002756.jpg 375 500 18 1 1 231 500 14 160 185 188 257 +1373 /data/VOCdevkit/VOC2007/JPEGImages/002758.jpg 500 375 6 278 170 330 230 6 328 171 381 223 6 369 197 500 375 6 179 173 264 238 6 25 163 168 252 +1374 /data/VOCdevkit/VOC2007/JPEGImages/002761.jpg 500 332 14 166 80 376 332 +1375 /data/VOCdevkit/VOC2007/JPEGImages/002764.jpg 333 500 3 43 110 217 355 +1376 /data/VOCdevkit/VOC2007/JPEGImages/002768.jpg 500 334 14 305 72 396 299 11 264 199 357 290 +1377 /data/VOCdevkit/VOC2007/JPEGImages/002769.jpg 500 339 0 6 45 495 276 +1378 /data/VOCdevkit/VOC2007/JPEGImages/002770.jpg 500 375 9 73 197 167 259 +1379 /data/VOCdevkit/VOC2007/JPEGImages/002771.jpg 500 333 18 63 7 265 242 +1380 /data/VOCdevkit/VOC2007/JPEGImages/002773.jpg 500 375 4 460 216 475 276 4 475 216 493 273 4 10 14 36 105 4 75 50 97 120 4 39 123 65 206 4 61 128 86 205 4 115 136 135 202 4 17 232 43 317 4 86 224 107 298 4 101 220 115 256 4 68 317 93 375 14 110 145 245 375 14 218 85 456 375 +1381 /data/VOCdevkit/VOC2007/JPEGImages/002777.jpg 500 375 8 270 194 318 273 8 321 216 500 375 8 143 220 214 301 8 206 223 284 330 +1382 /data/VOCdevkit/VOC2007/JPEGImages/002780.jpg 500 332 12 254 95 476 280 14 1 92 103 305 +1383 /data/VOCdevkit/VOC2007/JPEGImages/002781.jpg 480 360 14 385 96 465 360 14 344 127 450 360 14 226 229 347 360 14 305 92 379 196 14 281 178 382 360 14 237 146 316 236 14 227 79 303 178 14 159 113 227 360 14 141 90 189 173 14 80 126 160 360 14 6 113 85 360 +1384 /data/VOCdevkit/VOC2007/JPEGImages/002787.jpg 500 375 7 93 61 258 284 7 153 192 422 375 8 2 10 500 375 +1385 /data/VOCdevkit/VOC2007/JPEGImages/002788.jpg 500 334 10 52 142 249 272 10 5 114 129 176 14 319 70 500 334 14 235 70 336 334 14 249 70 273 112 8 133 194 215 300 8 30 183 135 298 8 8 163 95 269 8 2 135 57 194 +1386 /data/VOCdevkit/VOC2007/JPEGImages/002789.jpg 500 314 14 376 128 427 222 9 50 130 174 219 6 459 174 485 184 +1387 /data/VOCdevkit/VOC2007/JPEGImages/002790.jpg 375 500 12 107 86 301 500 6 57 256 136 317 +1388 /data/VOCdevkit/VOC2007/JPEGImages/002792.jpg 500 375 19 29 25 265 190 14 2 47 225 374 14 194 75 426 375 14 371 66 471 365 +1389 /data/VOCdevkit/VOC2007/JPEGImages/002793.jpg 500 375 6 1 255 145 294 6 139 250 289 293 13 331 94 470 173 +1390 /data/VOCdevkit/VOC2007/JPEGImages/002797.jpg 500 375 13 381 192 422 257 14 383 170 420 243 +1391 /data/VOCdevkit/VOC2007/JPEGImages/002799.jpg 500 376 10 6 133 500 376 +1392 /data/VOCdevkit/VOC2007/JPEGImages/002802.jpg 375 500 16 102 266 375 500 16 38 79 375 225 16 57 131 374 337 +1393 /data/VOCdevkit/VOC2007/JPEGImages/002805.jpg 450 400 11 42 9 435 398 +1394 /data/VOCdevkit/VOC2007/JPEGImages/002806.jpg 500 375 13 202 109 464 279 14 274 70 418 268 +1395 /data/VOCdevkit/VOC2007/JPEGImages/002808.jpg 333 500 13 70 67 294 499 6 243 107 331 244 6 2 132 75 217 +1396 /data/VOCdevkit/VOC2007/JPEGImages/002809.jpg 375 500 19 293 241 375 337 17 1 248 106 376 +1397 /data/VOCdevkit/VOC2007/JPEGImages/002811.jpg 333 500 3 121 74 314 455 3 21 156 140 366 +1398 /data/VOCdevkit/VOC2007/JPEGImages/002813.jpg 500 375 8 266 161 335 246 8 196 213 392 373 14 184 135 290 273 +1399 /data/VOCdevkit/VOC2007/JPEGImages/002814.jpg 334 500 6 38 202 321 381 +1400 /data/VOCdevkit/VOC2007/JPEGImages/002818.jpg 500 375 9 390 209 437 259 9 3 215 41 258 9 3 206 53 247 9 79 216 121 271 9 125 211 154 256 9 153 221 182 273 +1401 /data/VOCdevkit/VOC2007/JPEGImages/002819.jpg 480 366 12 418 134 480 283 12 78 68 410 276 14 197 36 313 207 +1402 /data/VOCdevkit/VOC2007/JPEGImages/002821.jpg 500 375 3 214 153 429 304 14 263 161 323 316 14 186 146 236 303 14 228 127 247 199 +1403 /data/VOCdevkit/VOC2007/JPEGImages/002822.jpg 500 360 0 189 103 225 125 +1404 /data/VOCdevkit/VOC2007/JPEGImages/002823.jpg 500 375 13 93 227 448 375 14 213 149 327 344 +1405 /data/VOCdevkit/VOC2007/JPEGImages/002824.jpg 500 431 14 1 13 500 431 +1406 /data/VOCdevkit/VOC2007/JPEGImages/002825.jpg 500 333 2 2 83 376 332 +1407 /data/VOCdevkit/VOC2007/JPEGImages/002828.jpg 388 288 12 10 26 376 265 +1408 /data/VOCdevkit/VOC2007/JPEGImages/002829.jpg 500 333 6 36 53 443 309 +1409 /data/VOCdevkit/VOC2007/JPEGImages/002830.jpg 500 331 13 190 1 287 70 13 387 1 488 96 13 1 10 60 88 13 11 109 317 297 14 107 49 316 283 +1410 /data/VOCdevkit/VOC2007/JPEGImages/002831.jpg 375 500 11 57 64 301 433 +1411 /data/VOCdevkit/VOC2007/JPEGImages/002832.jpg 500 297 14 150 125 166 180 14 135 121 153 186 14 112 115 143 195 14 91 129 108 178 14 5 109 43 235 14 25 78 93 255 18 166 76 314 208 18 304 50 500 226 +1412 /data/VOCdevkit/VOC2007/JPEGImages/002837.jpg 500 375 12 170 119 351 307 +1413 /data/VOCdevkit/VOC2007/JPEGImages/002839.jpg 500 333 1 43 1 443 333 +1414 /data/VOCdevkit/VOC2007/JPEGImages/002840.jpg 500 333 6 7 109 421 284 +1415 /data/VOCdevkit/VOC2007/JPEGImages/002843.jpg 500 375 0 272 103 352 131 0 2 103 500 374 +1416 /data/VOCdevkit/VOC2007/JPEGImages/002846.jpg 333 500 8 48 153 112 259 14 128 13 285 500 +1417 /data/VOCdevkit/VOC2007/JPEGImages/002849.jpg 500 333 11 61 58 324 269 +1418 /data/VOCdevkit/VOC2007/JPEGImages/002850.jpg 500 375 19 327 86 481 219 19 196 80 314 192 8 128 226 309 374 +1419 /data/VOCdevkit/VOC2007/JPEGImages/002851.jpg 500 332 0 97 75 420 251 +1420 /data/VOCdevkit/VOC2007/JPEGImages/002852.jpg 500 375 11 38 57 298 157 11 68 147 458 237 11 22 202 387 361 +1421 /data/VOCdevkit/VOC2007/JPEGImages/002853.jpg 500 333 11 63 2 500 313 +1422 /data/VOCdevkit/VOC2007/JPEGImages/002856.jpg 500 333 10 19 53 469 333 14 271 1 421 81 14 36 1 179 107 14 422 1 500 162 +1423 /data/VOCdevkit/VOC2007/JPEGImages/002857.jpg 375 500 4 43 171 114 394 14 1 47 374 500 +1424 /data/VOCdevkit/VOC2007/JPEGImages/002860.jpg 500 333 11 323 192 466 332 1 135 134 341 285 14 157 22 281 245 +1425 /data/VOCdevkit/VOC2007/JPEGImages/002861.jpg 333 500 2 4 37 333 500 +1426 /data/VOCdevkit/VOC2007/JPEGImages/002862.jpg 500 334 10 98 201 269 325 8 48 244 121 334 8 210 219 271 306 8 86 202 124 252 +1427 /data/VOCdevkit/VOC2007/JPEGImages/002863.jpg 500 375 14 358 1 500 375 14 126 2 365 374 14 176 40 210 75 14 97 52 120 104 14 128 54 140 103 14 141 54 153 88 +1428 /data/VOCdevkit/VOC2007/JPEGImages/002865.jpg 500 375 5 404 215 500 257 5 46 1 394 373 +1429 /data/VOCdevkit/VOC2007/JPEGImages/002871.jpg 500 404 6 1 236 75 282 +1430 /data/VOCdevkit/VOC2007/JPEGImages/002872.jpg 500 375 14 285 117 500 375 +1431 /data/VOCdevkit/VOC2007/JPEGImages/002874.jpg 500 375 14 65 43 353 375 14 210 54 487 372 +1432 /data/VOCdevkit/VOC2007/JPEGImages/002876.jpg 500 375 11 62 28 396 351 +1433 /data/VOCdevkit/VOC2007/JPEGImages/002877.jpg 375 500 14 3 26 315 500 +1434 /data/VOCdevkit/VOC2007/JPEGImages/002878.jpg 500 375 14 1 27 155 375 14 121 46 246 244 14 97 133 367 375 14 135 18 500 375 +1435 /data/VOCdevkit/VOC2007/JPEGImages/002882.jpg 500 375 16 388 278 418 300 16 177 263 193 282 +1436 /data/VOCdevkit/VOC2007/JPEGImages/002883.jpg 332 500 14 85 111 332 500 +1437 /data/VOCdevkit/VOC2007/JPEGImages/002885.jpg 500 375 17 171 63 500 256 14 373 1 500 298 14 92 66 177 238 8 122 204 323 375 +1438 /data/VOCdevkit/VOC2007/JPEGImages/002887.jpg 500 375 17 135 244 336 333 15 340 255 377 274 +1439 /data/VOCdevkit/VOC2007/JPEGImages/002888.jpg 500 375 14 78 8 170 331 14 19 107 133 348 14 258 141 391 337 +1440 /data/VOCdevkit/VOC2007/JPEGImages/002890.jpg 500 359 18 8 80 433 279 +1441 /data/VOCdevkit/VOC2007/JPEGImages/002892.jpg 500 375 2 162 188 246 256 +1442 /data/VOCdevkit/VOC2007/JPEGImages/002894.jpg 500 330 0 1 107 495 315 +1443 /data/VOCdevkit/VOC2007/JPEGImages/002895.jpg 500 375 14 388 194 419 339 14 415 192 447 338 +1444 /data/VOCdevkit/VOC2007/JPEGImages/002897.jpg 500 332 14 448 244 464 282 14 265 238 280 280 14 210 236 227 279 14 147 235 162 276 14 119 232 139 278 14 88 230 107 278 14 58 229 72 277 +1445 /data/VOCdevkit/VOC2007/JPEGImages/002898.jpg 500 375 18 8 71 500 337 +1446 /data/VOCdevkit/VOC2007/JPEGImages/002900.jpg 500 333 6 104 122 383 248 +1447 /data/VOCdevkit/VOC2007/JPEGImages/002902.jpg 375 500 19 163 85 300 224 +1448 /data/VOCdevkit/VOC2007/JPEGImages/002903.jpg 500 376 9 16 19 480 376 +1449 /data/VOCdevkit/VOC2007/JPEGImages/002904.jpg 500 375 4 270 225 324 372 4 358 230 415 375 14 1 62 236 340 14 219 90 373 287 14 344 146 500 299 +1450 /data/VOCdevkit/VOC2007/JPEGImages/002905.jpg 375 500 19 214 282 326 380 14 1 19 280 500 +1451 /data/VOCdevkit/VOC2007/JPEGImages/002907.jpg 500 375 8 3 236 112 375 +1452 /data/VOCdevkit/VOC2007/JPEGImages/002908.jpg 500 333 0 199 102 312 231 +1453 /data/VOCdevkit/VOC2007/JPEGImages/002909.jpg 294 480 12 95 147 203 404 14 88 85 226 302 +1454 /data/VOCdevkit/VOC2007/JPEGImages/002911.jpg 500 333 14 156 100 298 257 14 114 65 393 333 14 4 224 89 332 14 64 228 125 333 +1455 /data/VOCdevkit/VOC2007/JPEGImages/002918.jpg 500 331 14 40 56 324 331 14 420 188 500 331 +1456 /data/VOCdevkit/VOC2007/JPEGImages/002920.jpg 500 281 5 8 123 242 244 1 420 229 486 281 1 315 226 394 281 1 228 209 314 279 1 72 201 177 280 1 47 203 137 273 +1457 /data/VOCdevkit/VOC2007/JPEGImages/002921.jpg 318 480 12 94 162 233 447 14 90 97 229 299 +1458 /data/VOCdevkit/VOC2007/JPEGImages/002922.jpg 375 500 2 274 365 319 443 +1459 /data/VOCdevkit/VOC2007/JPEGImages/002923.jpg 500 333 11 3 30 461 333 +1460 /data/VOCdevkit/VOC2007/JPEGImages/002925.jpg 500 371 15 9 170 100 349 15 437 195 500 344 14 369 108 450 370 14 62 112 169 371 14 170 147 247 359 14 251 148 302 359 14 291 150 391 365 +1461 /data/VOCdevkit/VOC2007/JPEGImages/002926.jpg 500 333 7 108 117 286 234 7 230 50 347 137 +1462 /data/VOCdevkit/VOC2007/JPEGImages/002927.jpg 500 375 6 17 31 466 337 6 421 84 500 256 14 35 116 59 162 +1463 /data/VOCdevkit/VOC2007/JPEGImages/002928.jpg 500 329 8 93 55 373 292 +1464 /data/VOCdevkit/VOC2007/JPEGImages/002929.jpg 374 500 18 193 152 374 383 +1465 /data/VOCdevkit/VOC2007/JPEGImages/002930.jpg 500 320 8 103 176 185 307 8 181 166 248 303 8 321 176 417 310 8 255 107 341 205 8 130 130 203 184 8 238 168 322 306 8 319 159 387 280 +1466 /data/VOCdevkit/VOC2007/JPEGImages/002936.jpg 500 333 7 2 21 447 325 +1467 /data/VOCdevkit/VOC2007/JPEGImages/002945.jpg 500 375 15 323 1 392 47 14 250 61 500 369 14 17 70 215 314 4 336 296 378 375 +1468 /data/VOCdevkit/VOC2007/JPEGImages/002948.jpg 500 333 3 2 2 291 295 +1469 /data/VOCdevkit/VOC2007/JPEGImages/002949.jpg 500 375 0 1 36 346 202 +1470 /data/VOCdevkit/VOC2007/JPEGImages/002950.jpg 333 500 4 113 321 229 500 14 86 1 333 500 +1471 /data/VOCdevkit/VOC2007/JPEGImages/002951.jpg 500 375 4 451 195 475 276 19 96 124 224 253 19 224 120 356 256 14 351 43 378 93 14 132 143 196 209 14 122 153 186 213 +1472 /data/VOCdevkit/VOC2007/JPEGImages/002955.jpg 500 375 5 128 1 500 262 +1473 /data/VOCdevkit/VOC2007/JPEGImages/002959.jpg 375 500 7 118 295 298 400 +1474 /data/VOCdevkit/VOC2007/JPEGImages/002961.jpg 500 333 6 15 7 500 309 +1475 /data/VOCdevkit/VOC2007/JPEGImages/002964.jpg 333 500 11 128 312 182 427 14 33 27 210 411 14 256 55 317 228 14 2 40 47 171 14 22 66 64 197 +1476 /data/VOCdevkit/VOC2007/JPEGImages/002968.jpg 500 375 2 181 132 341 277 +1477 /data/VOCdevkit/VOC2007/JPEGImages/002970.jpg 500 375 7 2 71 444 374 +1478 /data/VOCdevkit/VOC2007/JPEGImages/002971.jpg 500 375 0 1 107 500 333 14 354 190 442 375 14 124 209 160 299 14 74 262 104 301 14 1 248 29 298 +1479 /data/VOCdevkit/VOC2007/JPEGImages/002972.jpg 375 500 14 11 11 333 500 14 43 273 374 497 +1480 /data/VOCdevkit/VOC2007/JPEGImages/002973.jpg 333 500 11 36 59 307 419 +1481 /data/VOCdevkit/VOC2007/JPEGImages/002974.jpg 375 500 14 118 238 242 390 14 90 164 146 220 14 339 124 375 202 14 283 152 340 230 14 156 126 364 411 8 78 223 151 338 10 1 212 101 337 8 24 208 90 314 +1482 /data/VOCdevkit/VOC2007/JPEGImages/002979.jpg 500 307 18 113 129 171 207 +1483 /data/VOCdevkit/VOC2007/JPEGImages/002980.jpg 482 500 2 39 3 482 493 +1484 /data/VOCdevkit/VOC2007/JPEGImages/002981.jpg 500 375 14 217 67 397 290 14 229 141 287 277 14 62 124 164 349 +1485 /data/VOCdevkit/VOC2007/JPEGImages/002982.jpg 356 500 4 272 278 353 500 14 14 21 299 500 +1486 /data/VOCdevkit/VOC2007/JPEGImages/002983.jpg 500 375 3 1 110 429 207 +1487 /data/VOCdevkit/VOC2007/JPEGImages/002985.jpg 480 320 19 194 15 475 273 +1488 /data/VOCdevkit/VOC2007/JPEGImages/002991.jpg 375 500 9 72 91 309 500 +1489 /data/VOCdevkit/VOC2007/JPEGImages/002993.jpg 500 333 6 206 221 339 303 +1490 /data/VOCdevkit/VOC2007/JPEGImages/002996.jpg 500 403 2 100 50 166 114 2 320 65 363 121 2 348 9 426 138 2 217 151 267 220 2 82 199 129 259 2 20 280 118 322 2 58 329 132 385 2 182 243 222 325 2 398 222 476 297 +1491 /data/VOCdevkit/VOC2007/JPEGImages/002997.jpg 500 375 19 263 8 500 272 +1492 /data/VOCdevkit/VOC2007/JPEGImages/002998.jpg 500 333 18 264 79 500 181 +1493 /data/VOCdevkit/VOC2007/JPEGImages/002999.jpg 500 331 13 288 118 461 226 13 121 112 270 193 13 38 92 164 169 14 344 74 447 180 14 175 85 265 189 14 75 64 158 141 +1494 /data/VOCdevkit/VOC2007/JPEGImages/003001.jpg 343 500 5 63 33 343 500 +1495 /data/VOCdevkit/VOC2007/JPEGImages/003006.jpg 500 375 5 431 93 500 183 5 262 117 433 234 5 23 136 125 250 6 378 184 500 276 6 293 202 370 245 6 217 206 341 262 6 184 207 235 249 6 137 206 185 240 +1496 /data/VOCdevkit/VOC2007/JPEGImages/003010.jpg 500 375 4 52 35 113 198 4 104 36 160 196 4 401 25 458 188 +1497 /data/VOCdevkit/VOC2007/JPEGImages/003012.jpg 500 375 3 263 106 302 139 14 111 124 295 375 14 303 188 429 355 +1498 /data/VOCdevkit/VOC2007/JPEGImages/003014.jpg 500 375 15 61 129 87 150 15 139 117 166 142 15 204 111 238 138 15 295 106 326 136 15 387 107 416 131 +1499 /data/VOCdevkit/VOC2007/JPEGImages/003016.jpg 500 329 5 67 84 477 314 14 355 137 408 179 +1500 /data/VOCdevkit/VOC2007/JPEGImages/003018.jpg 375 500 14 110 58 300 389 +1501 /data/VOCdevkit/VOC2007/JPEGImages/003019.jpg 500 375 7 17 1 500 360 +1502 /data/VOCdevkit/VOC2007/JPEGImages/003020.jpg 500 375 15 405 205 444 245 15 415 270 450 325 14 72 122 172 375 14 171 117 281 375 14 256 142 337 352 14 330 130 405 342 +1503 /data/VOCdevkit/VOC2007/JPEGImages/003022.jpg 500 333 12 153 80 416 286 14 241 51 299 181 +1504 /data/VOCdevkit/VOC2007/JPEGImages/003025.jpg 500 375 16 320 205 500 375 16 214 174 403 375 16 26 159 283 340 16 5 124 212 256 14 213 90 314 178 +1505 /data/VOCdevkit/VOC2007/JPEGImages/003026.jpg 500 375 14 54 153 198 375 14 158 88 341 374 +1506 /data/VOCdevkit/VOC2007/JPEGImages/003029.jpg 500 375 17 1 106 444 372 14 150 101 405 300 15 366 4 479 160 +1507 /data/VOCdevkit/VOC2007/JPEGImages/003030.jpg 500 376 9 123 1 421 349 +1508 /data/VOCdevkit/VOC2007/JPEGImages/003033.jpg 340 500 6 21 232 317 416 +1509 /data/VOCdevkit/VOC2007/JPEGImages/003035.jpg 375 500 14 54 193 306 486 +1510 /data/VOCdevkit/VOC2007/JPEGImages/003036.jpg 268 400 14 5 30 264 338 14 187 116 263 221 +1511 /data/VOCdevkit/VOC2007/JPEGImages/003037.jpg 500 375 0 1 25 500 329 +1512 /data/VOCdevkit/VOC2007/JPEGImages/003040.jpg 500 375 11 164 127 406 253 +1513 /data/VOCdevkit/VOC2007/JPEGImages/003041.jpg 318 480 12 52 180 298 403 14 149 125 236 288 12 235 181 315 307 12 1 193 83 312 14 261 152 299 248 14 34 154 66 224 +1514 /data/VOCdevkit/VOC2007/JPEGImages/003043.jpg 500 400 18 5 53 256 396 +1515 /data/VOCdevkit/VOC2007/JPEGImages/003046.jpg 500 351 6 2 58 489 331 +1516 /data/VOCdevkit/VOC2007/JPEGImages/003048.jpg 500 375 17 177 113 470 308 +1517 /data/VOCdevkit/VOC2007/JPEGImages/003049.jpg 500 375 8 249 241 361 375 8 171 251 304 375 8 55 227 160 354 8 43 220 125 301 8 2 199 63 269 14 153 173 250 375 +1518 /data/VOCdevkit/VOC2007/JPEGImages/003050.jpg 500 354 16 130 166 257 233 16 141 151 231 191 16 310 85 334 105 2 426 258 500 339 +1519 /data/VOCdevkit/VOC2007/JPEGImages/003052.jpg 500 333 14 2 47 116 333 14 159 96 259 333 14 225 201 277 333 14 256 47 316 195 14 468 53 500 210 6 3 58 211 169 6 111 56 259 127 +1520 /data/VOCdevkit/VOC2007/JPEGImages/003055.jpg 500 283 6 171 129 347 190 +1521 /data/VOCdevkit/VOC2007/JPEGImages/003059.jpg 500 335 18 217 129 275 210 +1522 /data/VOCdevkit/VOC2007/JPEGImages/003060.jpg 500 333 15 59 36 435 322 +1523 /data/VOCdevkit/VOC2007/JPEGImages/003062.jpg 500 375 15 173 36 490 375 15 302 1 475 164 15 1 1 227 175 +1524 /data/VOCdevkit/VOC2007/JPEGImages/003067.jpg 500 368 4 374 68 436 270 4 301 63 375 268 4 218 69 289 268 4 127 62 204 271 4 70 73 127 271 +1525 /data/VOCdevkit/VOC2007/JPEGImages/003068.jpg 500 381 9 75 98 422 326 +1526 /data/VOCdevkit/VOC2007/JPEGImages/003069.jpg 500 333 16 97 5 500 332 +1527 /data/VOCdevkit/VOC2007/JPEGImages/003070.jpg 500 375 6 428 170 500 236 6 1 169 41 221 6 90 168 213 224 6 114 172 372 345 14 355 156 458 375 +1528 /data/VOCdevkit/VOC2007/JPEGImages/003071.jpg 328 500 4 179 10 295 469 +1529 /data/VOCdevkit/VOC2007/JPEGImages/003073.jpg 500 375 3 1 1 227 235 +1530 /data/VOCdevkit/VOC2007/JPEGImages/003075.jpg 389 500 14 145 48 328 500 14 66 5 182 356 1 4 132 167 486 1 248 143 389 500 +1531 /data/VOCdevkit/VOC2007/JPEGImages/003076.jpg 375 500 4 51 51 83 150 4 84 51 117 150 4 117 45 149 152 4 151 47 182 151 4 182 47 213 150 4 214 46 246 150 4 246 46 279 151 4 279 47 311 151 4 311 47 343 151 4 61 217 85 282 4 118 212 150 281 4 150 214 181 281 4 181 214 213 281 4 213 217 245 281 4 245 215 276 281 4 276 217 305 281 4 213 307 243 369 4 243 308 274 369 4 274 308 304 367 +1532 /data/VOCdevkit/VOC2007/JPEGImages/003079.jpg 500 375 14 309 107 474 256 +1533 /data/VOCdevkit/VOC2007/JPEGImages/003080.jpg 500 375 7 5 71 377 331 +1534 /data/VOCdevkit/VOC2007/JPEGImages/003081.jpg 500 375 1 1 156 398 375 14 5 60 316 375 +1535 /data/VOCdevkit/VOC2007/JPEGImages/003084.jpg 500 332 14 222 111 259 207 14 139 154 165 220 14 94 152 110 214 14 68 157 86 206 14 361 166 385 224 14 413 165 433 225 14 458 173 486 225 12 188 154 334 250 +1536 /data/VOCdevkit/VOC2007/JPEGImages/003087.jpg 500 375 16 189 81 378 354 16 397 135 435 166 +1537 /data/VOCdevkit/VOC2007/JPEGImages/003091.jpg 333 500 14 35 168 270 495 14 43 2 333 458 +1538 /data/VOCdevkit/VOC2007/JPEGImages/003095.jpg 374 500 11 122 55 374 500 +1539 /data/VOCdevkit/VOC2007/JPEGImages/003096.jpg 300 224 17 1 22 300 224 +1540 /data/VOCdevkit/VOC2007/JPEGImages/003097.jpg 432 286 18 248 56 431 247 18 24 52 252 246 +1541 /data/VOCdevkit/VOC2007/JPEGImages/003099.jpg 500 375 17 3 2 304 232 +1542 /data/VOCdevkit/VOC2007/JPEGImages/003101.jpg 500 333 5 292 1 500 253 5 197 59 263 209 5 1 2 211 295 6 257 170 289 188 +1543 /data/VOCdevkit/VOC2007/JPEGImages/003104.jpg 500 375 14 64 71 161 368 +1544 /data/VOCdevkit/VOC2007/JPEGImages/003109.jpg 500 334 6 203 154 358 256 +1545 /data/VOCdevkit/VOC2007/JPEGImages/003111.jpg 500 375 3 400 199 496 240 3 271 196 413 244 3 282 50 401 262 +1546 /data/VOCdevkit/VOC2007/JPEGImages/003113.jpg 500 334 15 288 4 497 213 15 302 19 335 67 19 59 96 246 251 +1547 /data/VOCdevkit/VOC2007/JPEGImages/003114.jpg 500 375 11 152 28 363 225 +1548 /data/VOCdevkit/VOC2007/JPEGImages/003115.jpg 500 375 17 201 149 453 324 8 196 133 252 226 8 156 129 205 220 14 288 99 460 368 14 36 50 115 271 +1549 /data/VOCdevkit/VOC2007/JPEGImages/003119.jpg 500 400 7 1 3 482 400 +1550 /data/VOCdevkit/VOC2007/JPEGImages/003123.jpg 500 375 14 93 79 153 160 14 146 98 200 163 14 187 99 233 165 14 233 94 297 201 14 295 115 354 207 14 337 107 390 167 14 369 105 440 234 14 20 100 89 311 14 88 126 139 206 14 100 166 168 269 14 174 160 221 246 14 212 158 272 244 14 271 166 327 251 14 314 162 380 262 10 70 245 455 375 +1551 /data/VOCdevkit/VOC2007/JPEGImages/003125.jpg 500 375 11 198 30 500 375 +1552 /data/VOCdevkit/VOC2007/JPEGImages/003128.jpg 500 375 6 174 137 288 206 +1553 /data/VOCdevkit/VOC2007/JPEGImages/003130.jpg 375 500 1 36 221 301 430 +1554 /data/VOCdevkit/VOC2007/JPEGImages/003131.jpg 500 334 3 340 214 410 330 +1555 /data/VOCdevkit/VOC2007/JPEGImages/003132.jpg 500 367 14 150 18 438 330 14 3 82 176 367 +1556 /data/VOCdevkit/VOC2007/JPEGImages/003136.jpg 500 375 19 204 55 401 232 +1557 /data/VOCdevkit/VOC2007/JPEGImages/003139.jpg 500 375 10 3 94 154 201 8 3 89 68 262 14 20 79 263 356 14 144 70 500 372 14 259 10 313 69 14 118 11 185 72 14 159 1 185 43 14 449 30 493 81 +1558 /data/VOCdevkit/VOC2007/JPEGImages/003141.jpg 500 375 8 391 188 457 340 8 389 219 500 375 10 96 203 404 375 +1559 /data/VOCdevkit/VOC2007/JPEGImages/003143.jpg 500 292 6 33 72 482 254 +1560 /data/VOCdevkit/VOC2007/JPEGImages/003144.jpg 500 333 0 68 133 454 224 +1561 /data/VOCdevkit/VOC2007/JPEGImages/003148.jpg 500 375 2 281 120 333 226 2 236 219 420 374 2 104 206 288 366 2 355 70 463 145 2 1 184 118 300 2 37 110 171 225 2 342 96 454 227 +1562 /data/VOCdevkit/VOC2007/JPEGImages/003151.jpg 327 500 1 46 201 161 354 14 80 105 224 313 +1563 /data/VOCdevkit/VOC2007/JPEGImages/003152.jpg 500 333 16 9 58 297 330 16 245 47 500 333 16 1 79 169 215 +1564 /data/VOCdevkit/VOC2007/JPEGImages/003153.jpg 500 375 10 1 231 412 375 14 74 123 173 238 14 154 132 274 236 14 358 219 478 368 +1565 /data/VOCdevkit/VOC2007/JPEGImages/003156.jpg 500 332 11 112 88 415 265 +1566 /data/VOCdevkit/VOC2007/JPEGImages/003158.jpg 500 335 19 156 139 224 186 +1567 /data/VOCdevkit/VOC2007/JPEGImages/003160.jpg 500 375 0 1 128 500 351 14 383 206 500 375 +1568 /data/VOCdevkit/VOC2007/JPEGImages/003166.jpg 500 376 7 2 73 500 376 +1569 /data/VOCdevkit/VOC2007/JPEGImages/003167.jpg 500 375 14 67 36 118 287 14 125 43 185 287 14 79 6 420 375 +1570 /data/VOCdevkit/VOC2007/JPEGImages/003168.jpg 474 316 6 270 28 474 205 +1571 /data/VOCdevkit/VOC2007/JPEGImages/003171.jpg 400 500 11 1 29 349 500 +1572 /data/VOCdevkit/VOC2007/JPEGImages/003172.jpg 500 334 14 43 126 192 334 14 150 94 321 334 14 246 60 418 334 14 321 21 500 322 +1573 /data/VOCdevkit/VOC2007/JPEGImages/003173.jpg 320 217 12 24 46 243 169 14 118 25 202 116 +1574 /data/VOCdevkit/VOC2007/JPEGImages/003174.jpg 500 320 11 1 35 482 297 +1575 /data/VOCdevkit/VOC2007/JPEGImages/003179.jpg 500 375 6 17 199 312 299 14 157 131 203 196 14 205 144 242 201 +1576 /data/VOCdevkit/VOC2007/JPEGImages/003180.jpg 500 375 11 134 60 448 368 +1577 /data/VOCdevkit/VOC2007/JPEGImages/003182.jpg 495 500 12 1 132 469 500 14 50 14 252 422 +1578 /data/VOCdevkit/VOC2007/JPEGImages/003187.jpg 500 332 14 181 20 264 214 12 37 66 362 289 +1579 /data/VOCdevkit/VOC2007/JPEGImages/003190.jpg 354 500 16 100 30 269 179 16 7 47 107 265 16 123 93 282 458 +1580 /data/VOCdevkit/VOC2007/JPEGImages/003191.jpg 500 333 14 3 1 351 333 +1581 /data/VOCdevkit/VOC2007/JPEGImages/003192.jpg 500 332 15 5 30 230 288 15 233 36 489 284 +1582 /data/VOCdevkit/VOC2007/JPEGImages/003193.jpg 500 332 12 145 85 385 275 14 222 73 300 228 14 61 104 86 193 +1583 /data/VOCdevkit/VOC2007/JPEGImages/003196.jpg 319 480 14 103 55 272 471 17 7 43 318 376 +1584 /data/VOCdevkit/VOC2007/JPEGImages/003197.jpg 500 375 14 2 86 404 375 +1585 /data/VOCdevkit/VOC2007/JPEGImages/003198.jpg 500 285 7 124 24 494 100 14 1 44 277 285 +1586 /data/VOCdevkit/VOC2007/JPEGImages/003201.jpg 500 315 9 1 53 166 260 9 137 25 416 298 9 320 30 500 261 +1587 /data/VOCdevkit/VOC2007/JPEGImages/003203.jpg 500 335 18 1 95 417 235 +1588 /data/VOCdevkit/VOC2007/JPEGImages/003206.jpg 500 375 14 157 94 218 205 8 144 139 230 275 +1589 /data/VOCdevkit/VOC2007/JPEGImages/003208.jpg 500 333 17 33 163 465 332 +1590 /data/VOCdevkit/VOC2007/JPEGImages/003209.jpg 500 335 0 48 114 427 221 0 3 143 158 205 +1591 /data/VOCdevkit/VOC2007/JPEGImages/003212.jpg 500 375 17 26 111 478 308 +1592 /data/VOCdevkit/VOC2007/JPEGImages/003215.jpg 500 335 9 105 232 178 287 +1593 /data/VOCdevkit/VOC2007/JPEGImages/003217.jpg 500 385 6 68 90 492 275 14 288 80 322 120 +1594 /data/VOCdevkit/VOC2007/JPEGImages/003220.jpg 500 375 6 1 227 61 294 6 51 241 113 294 6 169 231 243 283 6 246 243 304 279 6 288 247 341 278 6 327 248 369 274 14 100 231 199 375 14 378 237 398 288 18 1 96 363 222 +1595 /data/VOCdevkit/VOC2007/JPEGImages/003221.jpg 500 351 17 143 241 385 340 15 299 268 352 315 8 417 247 500 349 15 213 230 232 254 15 196 229 216 254 +1596 /data/VOCdevkit/VOC2007/JPEGImages/003222.jpg 500 333 14 213 29 380 224 12 53 65 378 261 +1597 /data/VOCdevkit/VOC2007/JPEGImages/003224.jpg 500 375 11 361 195 500 338 14 4 49 500 375 +1598 /data/VOCdevkit/VOC2007/JPEGImages/003225.jpg 500 375 14 429 177 478 265 14 355 213 465 359 14 200 218 341 335 14 232 174 309 252 +1599 /data/VOCdevkit/VOC2007/JPEGImages/003226.jpg 333 500 14 71 43 286 485 +1600 /data/VOCdevkit/VOC2007/JPEGImages/003227.jpg 500 375 7 57 14 500 375 +1601 /data/VOCdevkit/VOC2007/JPEGImages/003230.jpg 500 375 0 165 135 391 233 +1602 /data/VOCdevkit/VOC2007/JPEGImages/003232.jpg 320 223 12 24 47 256 182 14 141 22 199 132 +1603 /data/VOCdevkit/VOC2007/JPEGImages/003234.jpg 500 374 14 77 112 139 372 14 117 147 165 373 14 163 127 220 175 14 164 137 239 374 14 235 118 292 373 14 282 126 366 374 +1604 /data/VOCdevkit/VOC2007/JPEGImages/003235.jpg 335 480 12 111 114 247 480 14 94 67 273 294 +1605 /data/VOCdevkit/VOC2007/JPEGImages/003237.jpg 334 500 12 109 155 254 461 14 130 53 256 256 +1606 /data/VOCdevkit/VOC2007/JPEGImages/003238.jpg 500 425 7 59 77 408 397 +1607 /data/VOCdevkit/VOC2007/JPEGImages/003241.jpg 500 375 16 139 119 500 325 +1608 /data/VOCdevkit/VOC2007/JPEGImages/003245.jpg 500 332 8 33 191 101 291 8 152 199 222 306 8 327 195 390 298 14 392 98 450 311 14 238 91 297 316 14 89 80 152 297 +1609 /data/VOCdevkit/VOC2007/JPEGImages/003246.jpg 500 375 11 21 101 500 375 +1610 /data/VOCdevkit/VOC2007/JPEGImages/003248.jpg 375 500 19 188 154 329 304 +1611 /data/VOCdevkit/VOC2007/JPEGImages/003249.jpg 500 375 14 415 1 500 167 4 13 2 174 375 4 171 1 291 372 4 319 1 461 375 +1612 /data/VOCdevkit/VOC2007/JPEGImages/003251.jpg 500 375 10 120 159 392 340 8 278 226 446 375 8 258 158 353 283 8 109 174 218 330 8 135 148 202 233 +1613 /data/VOCdevkit/VOC2007/JPEGImages/003252.jpg 500 375 14 1 141 179 375 14 33 59 188 227 14 144 57 245 270 14 171 29 397 375 14 245 51 485 375 +1614 /data/VOCdevkit/VOC2007/JPEGImages/003257.jpg 500 240 6 22 14 476 222 +1615 /data/VOCdevkit/VOC2007/JPEGImages/003263.jpg 333 500 14 1 267 155 499 +1616 /data/VOCdevkit/VOC2007/JPEGImages/003264.jpg 500 335 11 52 55 415 275 17 2 2 500 335 +1617 /data/VOCdevkit/VOC2007/JPEGImages/003265.jpg 500 375 6 158 247 331 375 6 10 268 83 330 +1618 /data/VOCdevkit/VOC2007/JPEGImages/003266.jpg 400 500 11 64 95 399 500 +1619 /data/VOCdevkit/VOC2007/JPEGImages/003267.jpg 500 333 2 2 69 500 333 +1620 /data/VOCdevkit/VOC2007/JPEGImages/003268.jpg 500 333 0 1 119 496 268 +1621 /data/VOCdevkit/VOC2007/JPEGImages/003275.jpg 500 333 1 95 215 215 291 +1622 /data/VOCdevkit/VOC2007/JPEGImages/003276.jpg 500 375 6 21 43 485 359 14 320 69 370 171 14 128 81 161 122 14 159 77 188 118 14 97 80 125 128 14 433 48 487 212 14 471 62 500 243 14 417 68 443 140 +1623 /data/VOCdevkit/VOC2007/JPEGImages/003277.jpg 500 375 17 1 104 348 375 +1624 /data/VOCdevkit/VOC2007/JPEGImages/003278.jpg 500 375 4 20 278 82 375 14 15 26 287 284 14 257 7 500 337 +1625 /data/VOCdevkit/VOC2007/JPEGImages/003281.jpg 375 500 15 2 110 21 208 15 22 122 75 208 15 75 154 115 217 15 177 288 204 358 15 195 284 220 351 15 210 235 237 400 15 245 238 259 373 +1626 /data/VOCdevkit/VOC2007/JPEGImages/003283.jpg 500 375 11 229 36 411 280 +1627 /data/VOCdevkit/VOC2007/JPEGImages/003286.jpg 500 375 18 66 61 448 301 +1628 /data/VOCdevkit/VOC2007/JPEGImages/003287.jpg 336 267 7 1 9 333 242 +1629 /data/VOCdevkit/VOC2007/JPEGImages/003288.jpg 500 375 9 111 247 227 311 +1630 /data/VOCdevkit/VOC2007/JPEGImages/003289.jpg 500 375 5 239 187 410 240 6 26 217 100 244 6 384 209 452 249 14 134 216 150 270 14 47 221 63 257 +1631 /data/VOCdevkit/VOC2007/JPEGImages/003291.jpg 375 500 19 285 68 375 235 +1632 /data/VOCdevkit/VOC2007/JPEGImages/003295.jpg 500 375 14 258 68 339 300 14 111 139 284 336 +1633 /data/VOCdevkit/VOC2007/JPEGImages/003297.jpg 371 500 15 101 116 257 274 8 26 301 208 500 10 1 214 342 488 +1634 /data/VOCdevkit/VOC2007/JPEGImages/003298.jpg 346 500 14 20 19 328 483 +1635 /data/VOCdevkit/VOC2007/JPEGImages/003302.jpg 375 500 5 160 164 310 320 +1636 /data/VOCdevkit/VOC2007/JPEGImages/003304.jpg 326 500 12 115 204 220 436 14 80 67 253 404 +1637 /data/VOCdevkit/VOC2007/JPEGImages/003305.jpg 371 500 13 145 184 234 302 14 146 152 221 259 +1638 /data/VOCdevkit/VOC2007/JPEGImages/003306.jpg 500 375 6 40 109 396 291 +1639 /data/VOCdevkit/VOC2007/JPEGImages/003309.jpg 500 375 17 2 176 450 370 14 1 135 319 320 14 227 133 500 349 4 391 238 434 369 +1640 /data/VOCdevkit/VOC2007/JPEGImages/003310.jpg 335 500 11 6 12 329 479 +1641 /data/VOCdevkit/VOC2007/JPEGImages/003312.jpg 500 333 1 25 11 488 320 +1642 /data/VOCdevkit/VOC2007/JPEGImages/003314.jpg 500 375 14 242 64 421 314 14 37 51 239 375 19 176 52 304 185 19 1 68 119 202 +1643 /data/VOCdevkit/VOC2007/JPEGImages/003315.jpg 500 357 2 21 23 305 356 2 195 225 387 328 2 338 170 500 333 +1644 /data/VOCdevkit/VOC2007/JPEGImages/003317.jpg 500 375 17 1 73 302 372 +1645 /data/VOCdevkit/VOC2007/JPEGImages/003318.jpg 500 375 16 201 109 383 248 +1646 /data/VOCdevkit/VOC2007/JPEGImages/003319.jpg 500 333 7 94 55 239 289 +1647 /data/VOCdevkit/VOC2007/JPEGImages/003321.jpg 500 281 6 441 148 495 191 6 302 162 355 191 6 246 167 275 189 6 89 176 145 195 +1648 /data/VOCdevkit/VOC2007/JPEGImages/003322.jpg 500 375 19 1 172 82 259 8 446 235 500 375 +1649 /data/VOCdevkit/VOC2007/JPEGImages/003323.jpg 500 375 10 91 120 341 375 8 50 233 185 375 8 337 124 428 225 8 342 143 483 363 15 413 79 487 144 14 281 2 404 341 14 107 135 249 375 +1650 /data/VOCdevkit/VOC2007/JPEGImages/003324.jpg 500 375 14 186 59 475 375 14 136 123 307 330 +1651 /data/VOCdevkit/VOC2007/JPEGImages/003326.jpg 500 500 11 7 19 472 494 +1652 /data/VOCdevkit/VOC2007/JPEGImages/003328.jpg 500 400 6 195 158 432 333 14 11 4 159 397 +1653 /data/VOCdevkit/VOC2007/JPEGImages/003329.jpg 332 500 14 11 15 284 495 +1654 /data/VOCdevkit/VOC2007/JPEGImages/003332.jpg 500 464 11 223 66 498 250 11 2 22 339 464 +1655 /data/VOCdevkit/VOC2007/JPEGImages/003333.jpg 375 500 13 64 262 144 417 13 161 280 324 500 +1656 /data/VOCdevkit/VOC2007/JPEGImages/003334.jpg 500 333 6 19 98 383 285 6 235 55 490 182 +1657 /data/VOCdevkit/VOC2007/JPEGImages/003340.jpg 333 500 13 83 242 270 438 14 103 192 233 362 +1658 /data/VOCdevkit/VOC2007/JPEGImages/003341.jpg 500 375 8 404 148 500 255 14 26 14 147 330 14 119 85 215 318 14 189 94 284 315 14 275 92 355 298 14 316 131 422 328 14 259 38 453 312 14 377 27 486 273 +1659 /data/VOCdevkit/VOC2007/JPEGImages/003342.jpg 500 341 13 341 203 412 241 +1660 /data/VOCdevkit/VOC2007/JPEGImages/003345.jpg 500 375 8 372 209 440 328 8 302 226 373 351 10 70 224 401 326 8 22 203 85 327 +1661 /data/VOCdevkit/VOC2007/JPEGImages/003346.jpg 500 375 1 42 182 135 335 14 47 123 143 304 +1662 /data/VOCdevkit/VOC2007/JPEGImages/003347.jpg 500 375 0 97 89 162 110 +1663 /data/VOCdevkit/VOC2007/JPEGImages/003348.jpg 500 375 6 164 231 430 354 6 3 262 83 304 6 75 264 128 302 6 119 266 155 298 +1664 /data/VOCdevkit/VOC2007/JPEGImages/003352.jpg 336 448 11 1 223 193 448 14 96 44 336 448 +1665 /data/VOCdevkit/VOC2007/JPEGImages/003353.jpg 500 333 6 89 124 271 238 +1666 /data/VOCdevkit/VOC2007/JPEGImages/003357.jpg 500 375 6 24 84 477 276 6 433 52 500 168 6 263 45 450 119 6 1 38 213 205 +1667 /data/VOCdevkit/VOC2007/JPEGImages/003358.jpg 263 500 5 1 15 263 471 +1668 /data/VOCdevkit/VOC2007/JPEGImages/003361.jpg 500 375 11 209 249 270 287 +1669 /data/VOCdevkit/VOC2007/JPEGImages/003364.jpg 500 375 6 100 97 447 305 +1670 /data/VOCdevkit/VOC2007/JPEGImages/003366.jpg 500 375 16 387 213 419 251 16 298 209 331 245 16 187 205 224 243 16 67 199 109 247 +1671 /data/VOCdevkit/VOC2007/JPEGImages/003368.jpg 500 333 14 21 1 500 333 14 14 20 250 333 +1672 /data/VOCdevkit/VOC2007/JPEGImages/003371.jpg 500 375 7 269 78 500 372 7 6 46 281 315 +1673 /data/VOCdevkit/VOC2007/JPEGImages/003372.jpg 500 333 0 210 135 277 186 +1674 /data/VOCdevkit/VOC2007/JPEGImages/003375.jpg 500 375 6 93 107 390 294 +1675 /data/VOCdevkit/VOC2007/JPEGImages/003378.jpg 500 375 14 27 115 158 323 14 91 110 273 372 14 230 133 426 375 14 260 93 447 374 +1676 /data/VOCdevkit/VOC2007/JPEGImages/003381.jpg 500 375 0 6 111 496 242 +1677 /data/VOCdevkit/VOC2007/JPEGImages/003383.jpg 360 331 14 17 12 136 331 14 114 9 233 331 14 212 2 347 331 +1678 /data/VOCdevkit/VOC2007/JPEGImages/003384.jpg 500 375 8 121 1 246 140 8 267 1 387 98 +1679 /data/VOCdevkit/VOC2007/JPEGImages/003385.jpg 500 332 6 150 77 235 145 6 350 88 448 137 6 284 129 500 332 6 1 87 190 331 14 139 70 352 331 +1680 /data/VOCdevkit/VOC2007/JPEGImages/003387.jpg 500 333 6 73 109 433 248 +1681 /data/VOCdevkit/VOC2007/JPEGImages/003388.jpg 500 334 14 200 14 253 131 14 109 59 171 162 14 43 35 132 234 14 408 40 436 114 14 461 33 500 113 14 232 3 458 333 1 436 76 500 128 1 200 110 244 208 1 124 131 185 169 1 53 164 123 307 1 222 217 408 334 +1682 /data/VOCdevkit/VOC2007/JPEGImages/003389.jpg 500 375 19 75 153 251 329 +1683 /data/VOCdevkit/VOC2007/JPEGImages/003393.jpg 375 500 13 63 82 375 500 +1684 /data/VOCdevkit/VOC2007/JPEGImages/003394.jpg 500 375 9 35 26 371 375 +1685 /data/VOCdevkit/VOC2007/JPEGImages/003399.jpg 500 286 5 35 62 246 213 14 114 97 166 276 14 217 130 430 286 14 464 120 493 260 14 331 119 358 179 14 358 151 398 192 +1686 /data/VOCdevkit/VOC2007/JPEGImages/003400.jpg 500 375 1 1 12 500 360 +1687 /data/VOCdevkit/VOC2007/JPEGImages/003402.jpg 500 375 2 130 161 205 245 2 251 181 347 255 +1688 /data/VOCdevkit/VOC2007/JPEGImages/003405.jpg 500 375 6 49 121 279 248 +1689 /data/VOCdevkit/VOC2007/JPEGImages/003409.jpg 500 374 3 312 184 419 224 3 53 136 379 214 +1690 /data/VOCdevkit/VOC2007/JPEGImages/003411.jpg 500 375 9 2 15 500 375 +1691 /data/VOCdevkit/VOC2007/JPEGImages/003414.jpg 500 333 6 72 125 468 316 6 65 133 150 174 6 104 128 240 183 14 32 123 50 163 14 19 125 37 164 14 79 107 100 128 +1692 /data/VOCdevkit/VOC2007/JPEGImages/003418.jpg 375 500 11 151 259 205 384 11 1 355 182 447 14 253 244 354 380 +1693 /data/VOCdevkit/VOC2007/JPEGImages/003423.jpg 500 374 14 331 94 497 320 14 203 119 344 373 14 1 77 262 374 +1694 /data/VOCdevkit/VOC2007/JPEGImages/003426.jpg 500 333 14 107 15 363 333 +1695 /data/VOCdevkit/VOC2007/JPEGImages/003427.jpg 500 375 7 65 18 500 375 14 1 1 500 374 +1696 /data/VOCdevkit/VOC2007/JPEGImages/003428.jpg 500 335 18 191 72 330 259 +1697 /data/VOCdevkit/VOC2007/JPEGImages/003431.jpg 375 500 14 11 15 373 500 4 1 250 29 385 4 59 226 129 468 +1698 /data/VOCdevkit/VOC2007/JPEGImages/003432.jpg 500 375 2 270 130 308 230 2 170 183 205 291 +1699 /data/VOCdevkit/VOC2007/JPEGImages/003434.jpg 500 375 14 151 97 245 375 14 216 128 346 375 14 327 181 415 375 14 405 148 500 375 14 344 138 383 194 14 293 182 311 218 6 17 169 56 196 +1700 /data/VOCdevkit/VOC2007/JPEGImages/003437.jpg 500 375 17 240 126 448 286 +1701 /data/VOCdevkit/VOC2007/JPEGImages/003438.jpg 500 375 8 164 22 355 340 +1702 /data/VOCdevkit/VOC2007/JPEGImages/003440.jpg 333 500 11 79 92 333 500 +1703 /data/VOCdevkit/VOC2007/JPEGImages/003442.jpg 500 333 17 7 87 500 332 15 120 1 154 69 15 420 220 500 333 +1704 /data/VOCdevkit/VOC2007/JPEGImages/003445.jpg 500 343 0 25 115 493 223 +1705 /data/VOCdevkit/VOC2007/JPEGImages/003446.jpg 500 374 4 238 162 288 346 4 174 150 224 316 +1706 /data/VOCdevkit/VOC2007/JPEGImages/003447.jpg 500 375 11 152 160 404 291 +1707 /data/VOCdevkit/VOC2007/JPEGImages/003448.jpg 480 360 15 247 277 287 327 15 282 206 330 330 15 294 171 375 250 15 230 57 293 242 15 164 175 203 224 15 77 82 205 170 15 22 203 51 245 8 4 137 127 302 8 177 125 281 284 +1708 /data/VOCdevkit/VOC2007/JPEGImages/003454.jpg 500 375 14 192 89 380 332 +1709 /data/VOCdevkit/VOC2007/JPEGImages/003456.jpg 500 352 6 2 5 500 337 +1710 /data/VOCdevkit/VOC2007/JPEGImages/003457.jpg 375 500 18 1 109 375 483 +1711 /data/VOCdevkit/VOC2007/JPEGImages/003459.jpg 500 375 8 387 207 500 335 10 114 186 393 375 14 390 114 494 319 14 317 141 387 242 14 1 160 140 375 14 132 100 176 164 14 132 67 160 139 4 301 204 328 284 +1712 /data/VOCdevkit/VOC2007/JPEGImages/003460.jpg 500 375 6 105 129 500 289 +1713 /data/VOCdevkit/VOC2007/JPEGImages/003463.jpg 375 500 19 2 2 375 500 +1714 /data/VOCdevkit/VOC2007/JPEGImages/003467.jpg 500 333 2 1 82 451 333 +1715 /data/VOCdevkit/VOC2007/JPEGImages/003471.jpg 500 333 16 147 54 235 142 16 308 48 468 135 16 242 77 500 333 16 98 135 344 333 16 12 98 222 158 16 215 52 421 141 +1716 /data/VOCdevkit/VOC2007/JPEGImages/003472.jpg 500 375 11 367 164 493 284 +1717 /data/VOCdevkit/VOC2007/JPEGImages/003473.jpg 500 333 14 113 128 213 291 12 97 69 447 288 +1718 /data/VOCdevkit/VOC2007/JPEGImages/003474.jpg 500 367 18 30 42 500 367 +1719 /data/VOCdevkit/VOC2007/JPEGImages/003475.jpg 500 332 5 79 56 471 254 14 270 161 316 285 14 222 165 261 229 14 1 232 53 332 +1720 /data/VOCdevkit/VOC2007/JPEGImages/003476.jpg 500 375 6 1 337 262 375 +1721 /data/VOCdevkit/VOC2007/JPEGImages/003478.jpg 500 333 0 422 14 473 71 +1722 /data/VOCdevkit/VOC2007/JPEGImages/003479.jpg 500 333 11 84 29 403 333 +1723 /data/VOCdevkit/VOC2007/JPEGImages/003480.jpg 500 375 7 1 13 499 375 +1724 /data/VOCdevkit/VOC2007/JPEGImages/003481.jpg 500 375 6 310 247 348 273 6 282 262 328 297 6 242 285 298 326 +1725 /data/VOCdevkit/VOC2007/JPEGImages/003482.jpg 500 375 1 146 143 387 375 14 196 26 317 337 14 146 1 360 297 +1726 /data/VOCdevkit/VOC2007/JPEGImages/003483.jpg 500 333 14 208 104 365 330 14 31 181 79 227 14 1 176 18 235 6 1 171 499 333 +1727 /data/VOCdevkit/VOC2007/JPEGImages/003485.jpg 500 375 14 71 100 259 326 14 236 102 436 316 +1728 /data/VOCdevkit/VOC2007/JPEGImages/003486.jpg 333 500 6 8 104 204 181 6 5 102 333 482 14 1 79 43 181 14 171 84 189 132 14 150 93 174 124 +1729 /data/VOCdevkit/VOC2007/JPEGImages/003488.jpg 500 334 15 1 272 17 325 15 42 232 92 285 15 97 201 138 247 15 143 153 206 209 15 227 120 268 173 15 274 77 331 136 4 30 235 46 286 +1730 /data/VOCdevkit/VOC2007/JPEGImages/003490.jpg 500 333 11 71 99 227 333 11 236 236 358 333 +1731 /data/VOCdevkit/VOC2007/JPEGImages/003494.jpg 500 375 0 1 22 500 260 14 58 206 118 375 14 417 206 500 375 +1732 /data/VOCdevkit/VOC2007/JPEGImages/003495.jpg 375 500 13 167 237 215 292 +1733 /data/VOCdevkit/VOC2007/JPEGImages/003498.jpg 500 375 3 3 184 500 317 +1734 /data/VOCdevkit/VOC2007/JPEGImages/003501.jpg 500 367 6 107 8 398 288 14 259 76 337 342 14 36 84 149 332 +1735 /data/VOCdevkit/VOC2007/JPEGImages/003502.jpg 500 375 8 150 122 237 289 8 8 136 119 323 8 337 144 450 337 8 216 185 347 375 8 84 177 222 374 10 64 149 403 360 +1736 /data/VOCdevkit/VOC2007/JPEGImages/003503.jpg 500 334 6 456 191 500 237 6 1 187 106 244 5 102 76 378 272 14 1 200 35 321 14 16 183 58 281 +1737 /data/VOCdevkit/VOC2007/JPEGImages/003504.jpg 500 375 7 2 41 499 373 +1738 /data/VOCdevkit/VOC2007/JPEGImages/003505.jpg 500 375 13 179 161 312 337 14 189 84 306 293 +1739 /data/VOCdevkit/VOC2007/JPEGImages/003507.jpg 500 377 19 122 178 223 256 19 450 99 500 243 +1740 /data/VOCdevkit/VOC2007/JPEGImages/003512.jpg 500 333 6 161 98 394 210 14 249 116 269 142 +1741 /data/VOCdevkit/VOC2007/JPEGImages/003513.jpg 500 375 18 168 178 302 262 +1742 /data/VOCdevkit/VOC2007/JPEGImages/003514.jpg 500 375 2 181 25 380 375 2 361 1 500 375 +1743 /data/VOCdevkit/VOC2007/JPEGImages/003515.jpg 500 375 6 66 61 494 339 14 339 65 369 117 14 472 95 500 146 14 79 85 119 130 14 100 92 111 106 14 2 83 47 153 +1744 /data/VOCdevkit/VOC2007/JPEGImages/003517.jpg 500 375 5 405 151 500 237 5 364 121 426 227 5 1 106 47 209 6 32 141 119 222 14 322 77 410 340 14 117 1 346 375 +1745 /data/VOCdevkit/VOC2007/JPEGImages/003520.jpg 335 500 8 6 55 157 204 8 255 35 335 179 14 94 33 240 222 +1746 /data/VOCdevkit/VOC2007/JPEGImages/003523.jpg 500 361 6 170 136 348 269 +1747 /data/VOCdevkit/VOC2007/JPEGImages/003526.jpg 500 375 8 376 160 419 234 +1748 /data/VOCdevkit/VOC2007/JPEGImages/003527.jpg 375 500 14 89 266 134 365 14 40 272 92 405 14 41 252 89 383 6 215 280 375 416 6 164 270 199 288 +1749 /data/VOCdevkit/VOC2007/JPEGImages/003531.jpg 212 320 12 51 111 151 302 14 37 62 150 223 +1750 /data/VOCdevkit/VOC2007/JPEGImages/003532.jpg 500 334 8 1 226 118 325 +1751 /data/VOCdevkit/VOC2007/JPEGImages/003533.jpg 500 203 11 74 126 123 166 +1752 /data/VOCdevkit/VOC2007/JPEGImages/003534.jpg 500 333 1 274 187 500 333 1 153 115 416 333 1 1 72 132 272 14 294 22 500 333 14 161 1 389 269 14 1 1 114 182 +1753 /data/VOCdevkit/VOC2007/JPEGImages/003535.jpg 347 276 2 10 52 305 264 +1754 /data/VOCdevkit/VOC2007/JPEGImages/003538.jpg 500 375 13 58 121 392 334 14 191 19 340 344 +1755 /data/VOCdevkit/VOC2007/JPEGImages/003540.jpg 500 375 7 5 3 328 198 +1756 /data/VOCdevkit/VOC2007/JPEGImages/003541.jpg 375 500 14 195 18 335 500 14 34 72 222 500 +1757 /data/VOCdevkit/VOC2007/JPEGImages/003542.jpg 500 375 1 210 226 308 286 1 137 225 224 287 1 36 245 150 324 14 229 183 286 270 14 153 180 213 279 14 100 186 154 245 14 61 195 138 296 +1758 /data/VOCdevkit/VOC2007/JPEGImages/003543.jpg 500 374 3 210 60 367 189 3 357 143 403 184 3 1 85 173 374 14 7 55 38 134 14 54 56 114 264 14 112 63 138 118 +1759 /data/VOCdevkit/VOC2007/JPEGImages/003544.jpg 500 375 17 366 184 500 375 +1760 /data/VOCdevkit/VOC2007/JPEGImages/003545.jpg 500 333 6 118 1 390 225 +1761 /data/VOCdevkit/VOC2007/JPEGImages/003547.jpg 500 333 18 1 50 355 284 +1762 /data/VOCdevkit/VOC2007/JPEGImages/003552.jpg 500 375 6 63 121 500 283 +1763 /data/VOCdevkit/VOC2007/JPEGImages/003553.jpg 500 375 6 28 125 500 337 6 1 199 107 258 +1764 /data/VOCdevkit/VOC2007/JPEGImages/003557.jpg 500 332 12 175 129 284 236 14 200 94 252 203 +1765 /data/VOCdevkit/VOC2007/JPEGImages/003558.jpg 500 374 19 214 1 500 256 14 345 277 407 329 +1766 /data/VOCdevkit/VOC2007/JPEGImages/003559.jpg 500 375 6 30 203 369 328 +1767 /data/VOCdevkit/VOC2007/JPEGImages/003560.jpg 500 375 7 98 56 479 354 +1768 /data/VOCdevkit/VOC2007/JPEGImages/003561.jpg 333 500 10 2 125 333 500 +1769 /data/VOCdevkit/VOC2007/JPEGImages/003562.jpg 500 375 12 275 170 397 262 14 65 50 241 375 +1770 /data/VOCdevkit/VOC2007/JPEGImages/003563.jpg 500 333 13 230 135 269 189 13 154 126 177 164 13 130 124 154 157 +1771 /data/VOCdevkit/VOC2007/JPEGImages/003568.jpg 500 470 18 1 87 394 379 +1772 /data/VOCdevkit/VOC2007/JPEGImages/003569.jpg 392 500 17 91 107 365 284 +1773 /data/VOCdevkit/VOC2007/JPEGImages/003570.jpg 500 375 6 71 132 489 360 +1774 /data/VOCdevkit/VOC2007/JPEGImages/003571.jpg 500 333 3 259 206 500 333 +1775 /data/VOCdevkit/VOC2007/JPEGImages/003572.jpg 300 400 15 143 178 300 377 15 9 233 146 385 15 2 36 229 273 +1776 /data/VOCdevkit/VOC2007/JPEGImages/003573.jpg 500 375 14 60 96 178 375 14 160 135 274 375 14 323 123 421 375 14 446 92 500 375 14 417 174 450 228 +1777 /data/VOCdevkit/VOC2007/JPEGImages/003574.jpg 500 333 0 10 46 484 238 +1778 /data/VOCdevkit/VOC2007/JPEGImages/003578.jpg 375 500 13 77 120 354 404 6 3 185 207 295 6 274 155 375 327 6 104 162 217 203 +1779 /data/VOCdevkit/VOC2007/JPEGImages/003579.jpg 318 480 12 93 113 200 453 14 59 98 223 331 +1780 /data/VOCdevkit/VOC2007/JPEGImages/003581.jpg 500 375 14 2 24 265 375 14 305 30 498 375 14 274 1 321 69 +1781 /data/VOCdevkit/VOC2007/JPEGImages/003582.jpg 500 216 8 323 115 397 204 +1782 /data/VOCdevkit/VOC2007/JPEGImages/003583.jpg 480 318 12 59 105 388 318 14 178 4 287 318 14 459 181 480 292 +1783 /data/VOCdevkit/VOC2007/JPEGImages/003584.jpg 320 236 12 66 55 218 188 14 109 13 178 126 +1784 /data/VOCdevkit/VOC2007/JPEGImages/003590.jpg 500 375 4 194 193 212 261 8 112 135 189 238 8 324 133 430 276 14 42 7 106 232 14 8 227 229 373 14 210 224 458 368 14 411 143 500 340 19 238 131 324 198 +1785 /data/VOCdevkit/VOC2007/JPEGImages/003591.jpg 500 181 15 340 34 420 156 +1786 /data/VOCdevkit/VOC2007/JPEGImages/003592.jpg 320 480 11 95 297 261 393 11 132 265 250 318 11 233 304 296 407 14 289 166 305 207 14 18 111 112 440 +1787 /data/VOCdevkit/VOC2007/JPEGImages/003595.jpg 500 375 16 443 204 500 338 16 380 213 450 341 16 316 192 389 343 16 239 210 347 339 16 137 222 222 357 14 4 79 93 325 14 61 103 160 252 14 192 71 302 209 14 256 64 360 202 14 333 70 423 197 14 404 61 447 201 +1788 /data/VOCdevkit/VOC2007/JPEGImages/003598.jpg 500 375 2 82 11 280 141 2 55 150 143 361 2 10 266 74 368 2 82 114 290 266 2 160 267 327 370 2 99 34 486 364 +1789 /data/VOCdevkit/VOC2007/JPEGImages/003600.jpg 500 390 8 244 98 450 350 14 197 32 362 367 +1790 /data/VOCdevkit/VOC2007/JPEGImages/003601.jpg 500 353 18 43 96 489 311 +1791 /data/VOCdevkit/VOC2007/JPEGImages/003602.jpg 500 333 14 3 54 170 333 14 85 47 302 333 14 267 34 500 333 +1792 /data/VOCdevkit/VOC2007/JPEGImages/003607.jpg 375 500 6 1 12 375 500 +1793 /data/VOCdevkit/VOC2007/JPEGImages/003610.jpg 375 500 14 1 51 375 500 +1794 /data/VOCdevkit/VOC2007/JPEGImages/003612.jpg 500 333 14 81 85 231 333 14 216 103 341 333 +1795 /data/VOCdevkit/VOC2007/JPEGImages/003613.jpg 500 358 18 15 4 486 358 14 1 175 121 358 +1796 /data/VOCdevkit/VOC2007/JPEGImages/003615.jpg 500 375 7 47 74 397 305 +1797 /data/VOCdevkit/VOC2007/JPEGImages/003616.jpg 500 375 14 195 67 248 227 +1798 /data/VOCdevkit/VOC2007/JPEGImages/003617.jpg 500 375 8 21 172 139 375 8 196 294 384 375 10 113 177 346 372 14 270 78 486 375 14 61 80 242 372 14 111 87 136 107 +1799 /data/VOCdevkit/VOC2007/JPEGImages/003619.jpg 500 397 2 128 241 223 311 2 241 79 321 142 14 175 115 328 348 14 200 44 330 212 14 308 43 377 225 14 178 45 205 164 +1800 /data/VOCdevkit/VOC2007/JPEGImages/003624.jpg 500 375 15 259 181 312 213 +1801 /data/VOCdevkit/VOC2007/JPEGImages/003626.jpg 333 500 15 14 149 233 313 15 2 51 219 192 15 92 295 252 477 +1802 /data/VOCdevkit/VOC2007/JPEGImages/003630.jpg 500 333 6 202 139 334 204 +1803 /data/VOCdevkit/VOC2007/JPEGImages/003631.jpg 500 341 14 394 37 500 341 14 135 60 156 91 14 87 59 103 78 14 212 40 264 88 14 373 45 403 68 6 3 62 440 341 6 22 78 137 143 14 216 43 262 91 14 200 118 264 203 14 135 61 153 90 14 86 58 104 77 +1804 /data/VOCdevkit/VOC2007/JPEGImages/003633.jpg 500 334 9 316 155 485 247 9 183 137 337 235 9 48 139 169 237 9 3 134 60 216 14 287 137 312 232 +1805 /data/VOCdevkit/VOC2007/JPEGImages/003637.jpg 500 344 18 2 152 465 251 +1806 /data/VOCdevkit/VOC2007/JPEGImages/003641.jpg 375 500 17 1 277 345 500 14 158 75 245 306 +1807 /data/VOCdevkit/VOC2007/JPEGImages/003643.jpg 375 500 4 234 285 280 465 8 327 291 372 471 14 128 71 326 421 +1808 /data/VOCdevkit/VOC2007/JPEGImages/003647.jpg 500 375 7 72 57 252 315 7 226 45 415 374 +1809 /data/VOCdevkit/VOC2007/JPEGImages/003649.jpg 500 333 4 273 202 295 279 14 42 152 134 316 14 129 160 179 241 14 158 153 201 211 14 224 149 292 201 14 295 149 339 198 14 310 146 386 269 14 366 142 500 316 14 402 149 500 333 10 65 199 406 333 15 133 96 170 160 +1810 /data/VOCdevkit/VOC2007/JPEGImages/003650.jpg 500 371 14 192 67 371 228 8 277 1 425 124 +1811 /data/VOCdevkit/VOC2007/JPEGImages/003652.jpg 500 375 3 334 234 500 269 3 291 275 500 332 3 237 299 500 370 3 334 217 483 244 +1812 /data/VOCdevkit/VOC2007/JPEGImages/003653.jpg 500 375 12 51 64 500 295 +1813 /data/VOCdevkit/VOC2007/JPEGImages/003659.jpg 500 375 14 168 128 228 240 +1814 /data/VOCdevkit/VOC2007/JPEGImages/003661.jpg 500 468 6 151 301 474 437 +1815 /data/VOCdevkit/VOC2007/JPEGImages/003665.jpg 500 375 14 294 108 500 375 14 132 138 330 375 14 1 36 271 375 4 439 122 461 157 +1816 /data/VOCdevkit/VOC2007/JPEGImages/003666.jpg 500 375 6 29 57 465 280 +1817 /data/VOCdevkit/VOC2007/JPEGImages/003668.jpg 500 333 10 27 157 376 333 +1818 /data/VOCdevkit/VOC2007/JPEGImages/003670.jpg 500 375 13 54 99 369 278 14 155 68 299 264 +1819 /data/VOCdevkit/VOC2007/JPEGImages/003672.jpg 500 375 11 115 168 401 316 +1820 /data/VOCdevkit/VOC2007/JPEGImages/003676.jpg 500 375 8 43 177 150 294 15 135 118 204 257 15 115 146 148 187 +1821 /data/VOCdevkit/VOC2007/JPEGImages/003677.jpg 500 447 13 41 104 453 430 6 1 56 351 183 14 178 29 303 235 14 272 145 407 299 +1822 /data/VOCdevkit/VOC2007/JPEGImages/003680.jpg 500 375 12 57 134 404 341 12 437 1 500 145 14 383 9 443 124 14 351 2 397 143 14 311 8 358 123 14 293 124 349 321 14 344 284 430 375 14 247 307 317 375 14 168 10 198 54 14 128 2 164 46 14 80 2 108 142 14 94 3 142 142 14 133 20 197 142 14 2 227 49 375 +1823 /data/VOCdevkit/VOC2007/JPEGImages/003682.jpg 500 334 2 344 144 406 198 2 34 151 167 245 +1824 /data/VOCdevkit/VOC2007/JPEGImages/003683.jpg 500 375 6 1 1 498 353 +1825 /data/VOCdevkit/VOC2007/JPEGImages/003686.jpg 500 375 19 117 40 475 374 +1826 /data/VOCdevkit/VOC2007/JPEGImages/003687.jpg 500 332 18 192 222 355 310 +1827 /data/VOCdevkit/VOC2007/JPEGImages/003689.jpg 500 333 18 17 147 97 174 18 171 163 294 237 18 286 153 344 191 +1828 /data/VOCdevkit/VOC2007/JPEGImages/003692.jpg 500 250 6 126 194 181 230 6 270 187 334 227 6 52 190 105 227 6 442 190 500 226 6 39 205 125 228 6 174 205 256 230 6 330 206 366 228 +1829 /data/VOCdevkit/VOC2007/JPEGImages/003693.jpg 400 500 11 115 162 268 320 11 223 127 332 284 11 20 109 204 228 +1830 /data/VOCdevkit/VOC2007/JPEGImages/003697.jpg 500 375 4 213 195 336 375 4 91 189 217 342 4 58 132 219 375 +1831 /data/VOCdevkit/VOC2007/JPEGImages/003701.jpg 500 375 14 159 99 222 154 14 226 99 279 157 14 279 115 336 156 14 198 127 247 156 14 475 252 500 375 6 43 263 156 337 +1832 /data/VOCdevkit/VOC2007/JPEGImages/003702.jpg 500 375 17 3 103 500 275 +1833 /data/VOCdevkit/VOC2007/JPEGImages/003707.jpg 500 375 4 397 43 434 81 14 100 22 500 375 +1834 /data/VOCdevkit/VOC2007/JPEGImages/003710.jpg 500 328 18 1 25 433 280 +1835 /data/VOCdevkit/VOC2007/JPEGImages/003712.jpg 500 378 11 153 113 419 299 +1836 /data/VOCdevkit/VOC2007/JPEGImages/003715.jpg 500 375 5 44 62 476 355 +1837 /data/VOCdevkit/VOC2007/JPEGImages/003716.jpg 375 500 19 324 287 375 438 +1838 /data/VOCdevkit/VOC2007/JPEGImages/003718.jpg 500 333 6 1 3 500 333 +1839 /data/VOCdevkit/VOC2007/JPEGImages/003719.jpg 500 375 6 6 1 500 375 +1840 /data/VOCdevkit/VOC2007/JPEGImages/003720.jpg 500 333 14 137 76 220 205 14 288 121 351 171 14 351 97 422 209 12 11 124 302 326 12 235 127 487 305 +1841 /data/VOCdevkit/VOC2007/JPEGImages/003723.jpg 500 333 18 230 99 384 248 14 390 163 423 220 14 429 174 459 209 +1842 /data/VOCdevkit/VOC2007/JPEGImages/003724.jpg 500 375 7 99 121 348 267 +1843 /data/VOCdevkit/VOC2007/JPEGImages/003725.jpg 500 375 14 312 29 428 174 14 114 8 287 188 14 15 2 171 198 4 211 88 243 196 +1844 /data/VOCdevkit/VOC2007/JPEGImages/003726.jpg 500 374 1 2 62 500 306 +1845 /data/VOCdevkit/VOC2007/JPEGImages/003728.jpg 500 375 17 10 29 500 375 11 135 131 285 285 +1846 /data/VOCdevkit/VOC2007/JPEGImages/003730.jpg 500 333 13 165 45 285 319 13 292 73 377 253 +1847 /data/VOCdevkit/VOC2007/JPEGImages/003731.jpg 500 333 14 1 42 235 332 14 198 2 500 333 +1848 /data/VOCdevkit/VOC2007/JPEGImages/003733.jpg 500 370 6 53 112 208 263 6 217 107 441 258 6 436 151 500 233 +1849 /data/VOCdevkit/VOC2007/JPEGImages/003734.jpg 379 480 12 274 184 372 265 14 297 167 330 229 14 155 91 253 268 12 83 145 288 429 +1850 /data/VOCdevkit/VOC2007/JPEGImages/003736.jpg 500 375 8 84 58 392 375 8 393 153 500 375 14 134 59 340 375 4 145 181 205 274 +1851 /data/VOCdevkit/VOC2007/JPEGImages/003737.jpg 375 500 11 1 185 223 500 14 59 26 338 500 +1852 /data/VOCdevkit/VOC2007/JPEGImages/003738.jpg 500 375 8 358 40 454 193 +1853 /data/VOCdevkit/VOC2007/JPEGImages/003739.jpg 500 375 11 2 60 279 368 14 3 23 461 373 +1854 /data/VOCdevkit/VOC2007/JPEGImages/003741.jpg 335 500 2 20 355 144 444 +1855 /data/VOCdevkit/VOC2007/JPEGImages/003742.jpg 240 320 14 2 24 181 236 +1856 /data/VOCdevkit/VOC2007/JPEGImages/003744.jpg 500 374 17 8 146 447 374 +1857 /data/VOCdevkit/VOC2007/JPEGImages/003745.jpg 450 480 14 71 37 251 465 +1858 /data/VOCdevkit/VOC2007/JPEGImages/003746.jpg 500 375 14 111 93 194 281 14 70 121 139 222 14 377 91 479 239 14 426 49 500 361 1 39 164 260 308 1 284 169 500 367 6 308 83 383 116 +1859 /data/VOCdevkit/VOC2007/JPEGImages/003747.jpg 417 500 14 40 10 270 316 +1860 /data/VOCdevkit/VOC2007/JPEGImages/003755.jpg 500 375 17 73 141 355 298 8 335 231 500 375 8 118 261 308 375 +1861 /data/VOCdevkit/VOC2007/JPEGImages/003756.jpg 420 500 15 29 7 408 375 +1862 /data/VOCdevkit/VOC2007/JPEGImages/003757.jpg 500 375 19 35 93 195 247 +1863 /data/VOCdevkit/VOC2007/JPEGImages/003761.jpg 500 375 8 207 215 328 375 8 74 178 197 375 10 148 176 368 375 15 304 147 368 219 +1864 /data/VOCdevkit/VOC2007/JPEGImages/003762.jpg 500 375 11 181 184 312 266 14 31 259 48 294 +1865 /data/VOCdevkit/VOC2007/JPEGImages/003764.jpg 320 203 12 96 40 202 203 14 103 13 189 131 +1866 /data/VOCdevkit/VOC2007/JPEGImages/003765.jpg 399 500 14 40 277 119 420 14 32 214 127 379 14 235 338 274 500 14 242 230 289 295 14 248 258 312 333 14 290 196 333 260 14 288 181 317 250 14 248 187 296 238 14 248 160 275 196 14 250 69 303 201 +1867 /data/VOCdevkit/VOC2007/JPEGImages/003766.jpg 500 375 1 1 31 439 355 +1868 /data/VOCdevkit/VOC2007/JPEGImages/003768.jpg 500 400 1 36 69 259 383 14 130 11 298 365 +1869 /data/VOCdevkit/VOC2007/JPEGImages/003769.jpg 319 480 6 14 139 306 346 14 59 85 91 162 +1870 /data/VOCdevkit/VOC2007/JPEGImages/003770.jpg 500 375 10 3 102 469 375 +1871 /data/VOCdevkit/VOC2007/JPEGImages/003771.jpg 500 375 14 28 74 184 322 14 183 127 300 284 14 295 170 397 305 14 475 143 500 228 +1872 /data/VOCdevkit/VOC2007/JPEGImages/003775.jpg 500 333 8 321 1 407 84 8 75 11 436 331 +1873 /data/VOCdevkit/VOC2007/JPEGImages/003776.jpg 500 375 19 169 64 284 155 4 164 178 176 215 +1874 /data/VOCdevkit/VOC2007/JPEGImages/003777.jpg 500 334 18 80 141 344 247 +1875 /data/VOCdevkit/VOC2007/JPEGImages/003778.jpg 500 500 7 38 67 443 466 15 55 75 221 256 15 380 94 496 270 15 432 54 500 289 +1876 /data/VOCdevkit/VOC2007/JPEGImages/003782.jpg 500 375 7 33 46 451 308 +1877 /data/VOCdevkit/VOC2007/JPEGImages/003785.jpg 500 333 11 140 36 500 333 +1878 /data/VOCdevkit/VOC2007/JPEGImages/003787.jpg 500 329 15 199 179 309 282 15 312 134 415 281 15 304 41 500 254 15 16 1 200 269 2 157 183 203 222 +1879 /data/VOCdevkit/VOC2007/JPEGImages/003789.jpg 500 333 14 147 229 231 333 +1880 /data/VOCdevkit/VOC2007/JPEGImages/003794.jpg 500 375 11 284 1 500 375 +1881 /data/VOCdevkit/VOC2007/JPEGImages/003795.jpg 500 411 1 376 174 500 383 1 50 201 254 411 1 237 167 359 397 14 247 4 341 339 14 380 28 500 330 14 54 26 273 362 +1882 /data/VOCdevkit/VOC2007/JPEGImages/003799.jpg 355 500 3 1 1 167 224 3 24 3 355 500 +1883 /data/VOCdevkit/VOC2007/JPEGImages/003800.jpg 375 500 10 2 137 375 500 +1884 /data/VOCdevkit/VOC2007/JPEGImages/003801.jpg 500 333 19 93 43 293 247 +1885 /data/VOCdevkit/VOC2007/JPEGImages/003802.jpg 500 375 4 241 24 268 116 +1886 /data/VOCdevkit/VOC2007/JPEGImages/003804.jpg 500 375 7 1 1 355 363 +1887 /data/VOCdevkit/VOC2007/JPEGImages/003805.jpg 500 335 11 139 133 499 272 +1888 /data/VOCdevkit/VOC2007/JPEGImages/003810.jpg 500 375 13 101 135 240 358 13 236 127 369 288 6 1 137 87 248 14 337 102 372 145 +1889 /data/VOCdevkit/VOC2007/JPEGImages/003812.jpg 500 375 7 199 88 369 375 +1890 /data/VOCdevkit/VOC2007/JPEGImages/003813.jpg 500 333 7 1 8 305 333 +1891 /data/VOCdevkit/VOC2007/JPEGImages/003815.jpg 500 333 6 188 108 433 213 14 242 11 274 95 14 288 125 333 149 +1892 /data/VOCdevkit/VOC2007/JPEGImages/003816.jpg 500 333 7 1 22 424 245 +1893 /data/VOCdevkit/VOC2007/JPEGImages/003819.jpg 500 376 11 146 52 386 264 11 69 208 322 360 14 1 1 221 235 +1894 /data/VOCdevkit/VOC2007/JPEGImages/003822.jpg 500 500 2 51 47 412 499 +1895 /data/VOCdevkit/VOC2007/JPEGImages/003823.jpg 500 333 0 80 110 459 225 +1896 /data/VOCdevkit/VOC2007/JPEGImages/003825.jpg 500 375 14 38 2 219 231 14 233 66 453 311 8 176 93 498 374 +1897 /data/VOCdevkit/VOC2007/JPEGImages/003829.jpg 500 333 18 1 34 438 333 14 385 158 415 227 14 433 189 456 259 14 472 181 487 219 +1898 /data/VOCdevkit/VOC2007/JPEGImages/003831.jpg 500 375 14 48 18 249 359 14 182 82 321 332 +1899 /data/VOCdevkit/VOC2007/JPEGImages/003832.jpg 400 265 12 82 50 331 251 +1900 /data/VOCdevkit/VOC2007/JPEGImages/003833.jpg 500 331 13 77 114 361 273 13 426 53 500 116 13 93 59 184 131 14 157 63 364 272 14 383 24 406 121 14 407 12 445 120 14 251 20 292 79 14 196 57 238 122 6 264 7 427 85 6 114 13 284 76 14 475 17 500 52 14 47 30 94 145 13 48 62 97 145 13 103 65 179 131 +1901 /data/VOCdevkit/VOC2007/JPEGImages/003836.jpg 500 375 3 158 269 235 284 +1902 /data/VOCdevkit/VOC2007/JPEGImages/003839.jpg 500 333 14 211 210 276 301 14 218 219 260 284 14 263 205 329 304 +1903 /data/VOCdevkit/VOC2007/JPEGImages/003840.jpg 375 500 9 44 29 375 493 +1904 /data/VOCdevkit/VOC2007/JPEGImages/003841.jpg 500 446 9 2 9 408 445 +1905 /data/VOCdevkit/VOC2007/JPEGImages/003842.jpg 224 500 4 44 15 201 497 +1906 /data/VOCdevkit/VOC2007/JPEGImages/003843.jpg 500 335 18 119 44 500 308 +1907 /data/VOCdevkit/VOC2007/JPEGImages/003850.jpg 500 442 2 138 152 401 367 +1908 /data/VOCdevkit/VOC2007/JPEGImages/003851.jpg 379 500 1 159 320 374 498 1 4 378 60 473 1 133 376 177 447 14 7 327 60 448 14 183 213 322 461 14 134 325 185 398 +1909 /data/VOCdevkit/VOC2007/JPEGImages/003852.jpg 500 375 12 68 2 500 373 +1910 /data/VOCdevkit/VOC2007/JPEGImages/003853.jpg 500 245 8 292 176 358 245 8 348 129 388 180 14 346 143 492 245 14 2 157 119 245 14 63 127 134 214 14 33 100 73 148 14 256 55 338 183 +1911 /data/VOCdevkit/VOC2007/JPEGImages/003854.jpg 333 500 11 68 116 333 500 +1912 /data/VOCdevkit/VOC2007/JPEGImages/003858.jpg 500 375 18 1 190 224 347 14 68 143 157 373 14 224 186 277 309 14 237 181 334 375 14 330 188 369 375 14 362 176 409 353 14 390 118 461 373 +1913 /data/VOCdevkit/VOC2007/JPEGImages/003862.jpg 500 375 17 128 144 383 322 +1914 /data/VOCdevkit/VOC2007/JPEGImages/003864.jpg 500 375 5 2 4 500 375 +1915 /data/VOCdevkit/VOC2007/JPEGImages/003867.jpg 500 375 1 157 225 290 375 14 243 70 358 375 14 165 80 254 375 4 250 176 268 233 +1916 /data/VOCdevkit/VOC2007/JPEGImages/003870.jpg 500 375 7 1 153 356 374 +1917 /data/VOCdevkit/VOC2007/JPEGImages/003873.jpg 500 274 18 74 72 500 203 +1918 /data/VOCdevkit/VOC2007/JPEGImages/003875.jpg 333 500 14 25 92 260 342 14 151 95 212 201 14 261 60 332 204 14 72 401 157 500 +1919 /data/VOCdevkit/VOC2007/JPEGImages/003878.jpg 500 375 6 58 2 500 375 +1920 /data/VOCdevkit/VOC2007/JPEGImages/003880.jpg 500 372 7 199 27 445 304 14 2 1 238 286 +1921 /data/VOCdevkit/VOC2007/JPEGImages/003881.jpg 500 333 11 160 63 277 194 8 201 23 266 94 8 121 29 185 99 8 29 25 98 114 +1922 /data/VOCdevkit/VOC2007/JPEGImages/003882.jpg 500 333 15 54 83 151 155 15 129 102 206 166 15 181 93 267 172 15 237 117 326 187 15 302 119 400 200 15 375 140 491 293 15 12 142 89 243 15 58 143 143 255 15 112 156 202 275 15 159 157 258 298 15 227 171 337 321 15 302 177 426 333 +1923 /data/VOCdevkit/VOC2007/JPEGImages/003883.jpg 500 333 18 101 56 382 292 +1924 /data/VOCdevkit/VOC2007/JPEGImages/003884.jpg 500 375 14 2 61 153 358 14 65 85 499 375 14 242 107 500 375 +1925 /data/VOCdevkit/VOC2007/JPEGImages/003888.jpg 500 375 11 89 75 479 374 +1926 /data/VOCdevkit/VOC2007/JPEGImages/003892.jpg 500 375 3 1 1 337 131 +1927 /data/VOCdevkit/VOC2007/JPEGImages/003893.jpg 500 375 6 27 121 344 282 +1928 /data/VOCdevkit/VOC2007/JPEGImages/003894.jpg 500 375 10 1 104 500 370 +1929 /data/VOCdevkit/VOC2007/JPEGImages/003896.jpg 500 440 14 208 100 342 407 14 114 94 161 216 14 8 87 58 214 2 366 42 443 113 2 447 292 489 338 2 13 337 38 382 2 65 364 121 413 2 196 353 252 413 2 281 331 318 360 2 336 360 403 416 2 401 349 461 413 2 444 364 500 411 2 410 336 454 374 +1930 /data/VOCdevkit/VOC2007/JPEGImages/003897.jpg 500 376 14 150 145 386 376 14 384 61 500 376 +1931 /data/VOCdevkit/VOC2007/JPEGImages/003900.jpg 500 333 3 121 64 451 265 +1932 /data/VOCdevkit/VOC2007/JPEGImages/003901.jpg 338 500 11 6 89 338 492 +1933 /data/VOCdevkit/VOC2007/JPEGImages/003902.jpg 375 500 10 3 234 375 500 +1934 /data/VOCdevkit/VOC2007/JPEGImages/003903.jpg 500 332 14 394 1 500 331 14 278 2 422 332 14 131 62 330 332 14 90 2 308 332 +1935 /data/VOCdevkit/VOC2007/JPEGImages/003904.jpg 480 318 6 383 158 480 296 +1936 /data/VOCdevkit/VOC2007/JPEGImages/003906.jpg 500 333 7 150 1 394 332 4 392 142 493 333 +1937 /data/VOCdevkit/VOC2007/JPEGImages/003908.jpg 500 335 18 153 93 199 159 +1938 /data/VOCdevkit/VOC2007/JPEGImages/003909.jpg 500 333 19 198 105 248 151 19 329 131 383 202 19 384 135 443 192 +1939 /data/VOCdevkit/VOC2007/JPEGImages/003910.jpg 500 375 3 29 187 362 242 14 161 122 274 220 +1940 /data/VOCdevkit/VOC2007/JPEGImages/003914.jpg 500 306 16 93 163 245 255 16 155 148 284 226 16 274 130 397 220 16 334 109 411 166 16 418 123 500 209 16 433 91 500 147 16 268 95 328 151 +1941 /data/VOCdevkit/VOC2007/JPEGImages/003916.jpg 333 500 6 48 69 287 245 +1942 /data/VOCdevkit/VOC2007/JPEGImages/003917.jpg 500 375 6 121 1 500 216 +1943 /data/VOCdevkit/VOC2007/JPEGImages/003920.jpg 500 375 11 1 84 500 361 +1944 /data/VOCdevkit/VOC2007/JPEGImages/003922.jpg 480 358 14 215 39 331 186 12 69 49 399 309 +1945 /data/VOCdevkit/VOC2007/JPEGImages/003925.jpg 320 242 7 24 42 260 242 +1946 /data/VOCdevkit/VOC2007/JPEGImages/003927.jpg 500 333 14 147 2 475 333 +1947 /data/VOCdevkit/VOC2007/JPEGImages/003928.jpg 375 500 4 117 20 250 454 +1948 /data/VOCdevkit/VOC2007/JPEGImages/003929.jpg 500 375 3 18 62 58 112 14 266 88 373 372 14 192 96 273 374 14 135 117 229 372 +1949 /data/VOCdevkit/VOC2007/JPEGImages/003930.jpg 500 333 18 2 2 450 332 +1950 /data/VOCdevkit/VOC2007/JPEGImages/003931.jpg 500 375 0 2 74 500 324 +1951 /data/VOCdevkit/VOC2007/JPEGImages/003933.jpg 500 333 11 153 11 440 272 +1952 /data/VOCdevkit/VOC2007/JPEGImages/003934.jpg 500 375 19 1 115 85 264 15 144 259 268 375 +1953 /data/VOCdevkit/VOC2007/JPEGImages/003938.jpg 500 375 14 217 123 422 375 +1954 /data/VOCdevkit/VOC2007/JPEGImages/003940.jpg 500 333 6 76 82 412 192 6 402 119 500 178 +1955 /data/VOCdevkit/VOC2007/JPEGImages/003942.jpg 480 360 14 154 125 271 233 4 17 149 42 237 +1956 /data/VOCdevkit/VOC2007/JPEGImages/003943.jpg 500 375 4 359 310 373 361 14 101 198 186 327 14 275 250 323 316 14 318 256 385 333 14 376 221 480 302 14 412 247 499 375 14 169 224 296 375 14 39 276 158 375 15 218 132 298 177 15 39 119 147 161 +1957 /data/VOCdevkit/VOC2007/JPEGImages/003944.jpg 500 375 17 3 153 500 374 4 68 240 97 301 14 203 29 500 374 +1958 /data/VOCdevkit/VOC2007/JPEGImages/003950.jpg 500 320 8 150 187 203 282 +1959 /data/VOCdevkit/VOC2007/JPEGImages/003951.jpg 390 480 14 126 65 248 279 12 44 117 295 430 +1960 /data/VOCdevkit/VOC2007/JPEGImages/003952.jpg 332 500 3 151 48 200 264 +1961 /data/VOCdevkit/VOC2007/JPEGImages/003955.jpg 500 375 12 270 176 460 365 12 127 207 272 375 14 94 174 146 324 14 40 163 99 354 14 205 158 263 279 +1962 /data/VOCdevkit/VOC2007/JPEGImages/003958.jpg 500 375 7 8 1 333 375 +1963 /data/VOCdevkit/VOC2007/JPEGImages/003959.jpg 500 375 14 205 92 294 373 14 291 110 422 307 14 398 8 500 164 14 54 39 263 375 14 1 78 68 374 14 382 107 500 375 +1964 /data/VOCdevkit/VOC2007/JPEGImages/003962.jpg 500 375 6 1 1 387 375 +1965 /data/VOCdevkit/VOC2007/JPEGImages/003964.jpg 333 500 11 11 1 333 446 +1966 /data/VOCdevkit/VOC2007/JPEGImages/003967.jpg 500 333 6 175 155 195 176 6 178 177 210 208 6 261 130 304 147 6 237 114 271 130 6 362 201 399 235 6 37 144 66 171 +1967 /data/VOCdevkit/VOC2007/JPEGImages/003968.jpg 500 489 1 45 346 500 489 14 48 13 472 483 +1968 /data/VOCdevkit/VOC2007/JPEGImages/003972.jpg 500 375 14 1 63 228 375 14 281 18 475 316 14 139 117 294 333 +1969 /data/VOCdevkit/VOC2007/JPEGImages/003975.jpg 500 332 14 3 2 288 328 +1970 /data/VOCdevkit/VOC2007/JPEGImages/003976.jpg 333 500 1 75 267 289 480 14 96 114 277 390 +1971 /data/VOCdevkit/VOC2007/JPEGImages/003977.jpg 484 500 11 19 1 484 500 +1972 /data/VOCdevkit/VOC2007/JPEGImages/003978.jpg 480 441 14 197 34 319 217 12 34 87 418 316 +1973 /data/VOCdevkit/VOC2007/JPEGImages/003980.jpg 500 375 11 1 32 322 375 +1974 /data/VOCdevkit/VOC2007/JPEGImages/003981.jpg 500 375 19 215 154 433 375 14 1 64 263 375 +1975 /data/VOCdevkit/VOC2007/JPEGImages/003982.jpg 500 333 9 236 192 295 230 +1976 /data/VOCdevkit/VOC2007/JPEGImages/003985.jpg 500 332 2 250 136 308 257 +1977 /data/VOCdevkit/VOC2007/JPEGImages/003989.jpg 500 331 13 333 134 438 236 13 72 98 153 170 14 98 64 139 173 14 168 73 235 179 14 265 67 305 197 14 354 98 443 233 14 169 95 283 241 13 152 120 276 237 +1978 /data/VOCdevkit/VOC2007/JPEGImages/003995.jpg 500 375 14 1 52 500 375 14 310 105 458 228 +1979 /data/VOCdevkit/VOC2007/JPEGImages/003999.jpg 500 375 1 1 29 500 375 1 2 138 455 375 +1980 /data/VOCdevkit/VOC2007/JPEGImages/004000.jpg 389 500 14 192 40 331 464 14 61 23 198 494 +1981 /data/VOCdevkit/VOC2007/JPEGImages/004001.jpg 500 375 5 377 130 476 197 14 429 166 456 203 +1982 /data/VOCdevkit/VOC2007/JPEGImages/004002.jpg 500 375 11 7 92 357 287 +1983 /data/VOCdevkit/VOC2007/JPEGImages/004004.jpg 375 500 11 190 424 311 500 17 1 302 226 456 +1984 /data/VOCdevkit/VOC2007/JPEGImages/004006.jpg 500 333 14 164 54 227 195 12 69 103 298 284 12 276 77 361 144 14 306 59 327 116 14 372 88 387 133 14 408 96 431 133 14 386 100 407 132 14 62 105 85 144 14 44 109 65 142 14 26 112 46 146 14 1 101 19 145 +1985 /data/VOCdevkit/VOC2007/JPEGImages/004007.jpg 500 334 18 238 123 305 199 +1986 /data/VOCdevkit/VOC2007/JPEGImages/004018.jpg 500 333 2 2 111 348 333 +1987 /data/VOCdevkit/VOC2007/JPEGImages/004021.jpg 500 375 11 4 1 500 375 +1988 /data/VOCdevkit/VOC2007/JPEGImages/004022.jpg 500 375 9 458 149 500 189 9 210 162 240 213 9 44 216 125 269 +1989 /data/VOCdevkit/VOC2007/JPEGImages/004024.jpg 500 357 19 67 192 192 352 19 178 108 327 301 19 315 12 498 242 +1990 /data/VOCdevkit/VOC2007/JPEGImages/004026.jpg 500 375 6 143 156 316 307 6 40 132 111 175 +1991 /data/VOCdevkit/VOC2007/JPEGImages/004027.jpg 333 500 15 223 260 280 320 15 178 22 333 401 15 66 38 239 415 15 86 256 201 449 15 1 214 124 417 15 78 365 146 460 15 17 348 71 433 +1992 /data/VOCdevkit/VOC2007/JPEGImages/004029.jpg 500 195 17 10 68 489 195 7 443 52 488 129 11 13 51 59 118 +1993 /data/VOCdevkit/VOC2007/JPEGImages/004030.jpg 500 375 5 131 67 455 299 6 332 200 500 325 14 210 186 286 375 +1994 /data/VOCdevkit/VOC2007/JPEGImages/004032.jpg 500 375 10 43 1 461 364 +1995 /data/VOCdevkit/VOC2007/JPEGImages/004036.jpg 500 333 2 43 75 311 248 +1996 /data/VOCdevkit/VOC2007/JPEGImages/004038.jpg 500 375 15 135 192 229 277 15 200 144 270 237 15 240 104 309 197 +1997 /data/VOCdevkit/VOC2007/JPEGImages/004040.jpg 375 500 8 51 234 138 356 8 139 212 195 298 19 198 188 333 311 +1998 /data/VOCdevkit/VOC2007/JPEGImages/004041.jpg 500 375 14 115 118 295 375 14 267 154 427 375 +1999 /data/VOCdevkit/VOC2007/JPEGImages/004042.jpg 500 333 14 1 2 385 333 4 288 1 349 230 +2000 /data/VOCdevkit/VOC2007/JPEGImages/004043.jpg 500 375 6 160 111 375 266 14 334 158 432 296 +2001 /data/VOCdevkit/VOC2007/JPEGImages/004044.jpg 500 375 7 93 3 379 375 +2002 /data/VOCdevkit/VOC2007/JPEGImages/004045.jpg 500 375 17 29 66 475 372 +2003 /data/VOCdevkit/VOC2007/JPEGImages/004048.jpg 500 375 7 2 1 348 375 +2004 /data/VOCdevkit/VOC2007/JPEGImages/004049.jpg 469 500 14 2 2 331 499 14 79 4 469 499 +2005 /data/VOCdevkit/VOC2007/JPEGImages/004050.jpg 500 375 6 24 32 471 357 +2006 /data/VOCdevkit/VOC2007/JPEGImages/004053.jpg 500 332 19 242 184 354 270 8 74 205 103 283 8 112 207 166 294 +2007 /data/VOCdevkit/VOC2007/JPEGImages/004054.jpg 500 375 14 31 61 156 375 14 309 58 417 375 14 242 100 327 375 14 167 85 257 248 14 107 71 177 216 14 150 248 213 375 14 202 209 275 375 +2008 /data/VOCdevkit/VOC2007/JPEGImages/004055.jpg 375 500 4 204 346 263 500 4 303 389 360 500 +2009 /data/VOCdevkit/VOC2007/JPEGImages/004056.jpg 500 364 4 160 209 205 309 4 218 209 256 308 4 257 203 293 309 +2010 /data/VOCdevkit/VOC2007/JPEGImages/004059.jpg 500 375 2 185 133 234 191 2 176 170 211 208 +2011 /data/VOCdevkit/VOC2007/JPEGImages/004061.jpg 320 240 8 2 2 318 239 +2012 /data/VOCdevkit/VOC2007/JPEGImages/004062.jpg 500 333 11 1 79 283 284 +2013 /data/VOCdevkit/VOC2007/JPEGImages/004063.jpg 333 500 14 3 128 294 415 14 139 16 333 262 +2014 /data/VOCdevkit/VOC2007/JPEGImages/004064.jpg 500 375 19 55 1 240 217 14 303 89 500 375 +2015 /data/VOCdevkit/VOC2007/JPEGImages/004065.jpg 500 375 5 26 85 426 298 14 452 188 475 245 14 5 193 26 241 +2016 /data/VOCdevkit/VOC2007/JPEGImages/004068.jpg 500 375 4 306 184 348 328 4 270 172 305 241 14 260 18 430 259 8 86 22 195 151 8 1 38 112 138 +2017 /data/VOCdevkit/VOC2007/JPEGImages/004070.jpg 500 333 13 246 109 449 315 13 72 150 245 288 +2018 /data/VOCdevkit/VOC2007/JPEGImages/004071.jpg 500 375 6 24 22 493 326 +2019 /data/VOCdevkit/VOC2007/JPEGImages/004072.jpg 500 375 16 307 195 389 243 14 142 94 275 375 4 235 206 259 259 +2020 /data/VOCdevkit/VOC2007/JPEGImages/004074.jpg 500 375 14 1 20 242 375 14 194 11 460 375 +2021 /data/VOCdevkit/VOC2007/JPEGImages/004078.jpg 500 379 0 4 88 500 278 +2022 /data/VOCdevkit/VOC2007/JPEGImages/004079.jpg 500 334 11 207 29 352 298 +2023 /data/VOCdevkit/VOC2007/JPEGImages/004080.jpg 500 300 6 103 103 390 237 +2024 /data/VOCdevkit/VOC2007/JPEGImages/004081.jpg 500 375 9 174 96 348 209 15 284 103 500 375 +2025 /data/VOCdevkit/VOC2007/JPEGImages/004083.jpg 500 375 2 330 92 500 375 2 29 57 466 375 +2026 /data/VOCdevkit/VOC2007/JPEGImages/004084.jpg 320 219 12 63 35 283 217 14 107 23 181 133 +2027 /data/VOCdevkit/VOC2007/JPEGImages/004086.jpg 500 375 11 50 9 269 143 11 194 150 500 365 +2028 /data/VOCdevkit/VOC2007/JPEGImages/004088.jpg 375 500 6 128 327 292 407 +2029 /data/VOCdevkit/VOC2007/JPEGImages/004090.jpg 500 333 14 163 163 224 333 14 223 169 283 333 14 291 166 355 333 +2030 /data/VOCdevkit/VOC2007/JPEGImages/004094.jpg 500 375 5 27 33 473 303 14 66 157 106 202 +2031 /data/VOCdevkit/VOC2007/JPEGImages/004096.jpg 500 273 17 1 1 497 268 +2032 /data/VOCdevkit/VOC2007/JPEGImages/004097.jpg 500 375 6 398 148 500 205 +2033 /data/VOCdevkit/VOC2007/JPEGImages/004098.jpg 500 333 8 263 167 349 333 8 386 174 462 324 10 220 185 446 330 14 193 116 238 283 +2034 /data/VOCdevkit/VOC2007/JPEGImages/004099.jpg 333 500 5 57 178 333 406 14 174 239 333 500 +2035 /data/VOCdevkit/VOC2007/JPEGImages/004101.jpg 375 500 17 3 199 374 500 14 3 173 235 305 +2036 /data/VOCdevkit/VOC2007/JPEGImages/004103.jpg 500 375 12 189 233 229 298 14 187 199 231 268 +2037 /data/VOCdevkit/VOC2007/JPEGImages/004104.jpg 375 500 5 22 227 166 331 6 1 324 32 410 +2038 /data/VOCdevkit/VOC2007/JPEGImages/004107.jpg 500 375 6 96 259 407 354 +2039 /data/VOCdevkit/VOC2007/JPEGImages/004109.jpg 500 376 8 139 74 354 322 14 157 63 324 291 14 107 3 181 180 14 3 2 82 300 +2040 /data/VOCdevkit/VOC2007/JPEGImages/004112.jpg 500 375 11 43 134 228 345 14 71 22 500 375 +2041 /data/VOCdevkit/VOC2007/JPEGImages/004114.jpg 500 374 7 8 142 387 318 +2042 /data/VOCdevkit/VOC2007/JPEGImages/004115.jpg 500 375 6 146 189 349 313 +2043 /data/VOCdevkit/VOC2007/JPEGImages/004116.jpg 500 331 7 157 56 311 288 15 5 6 102 284 +2044 /data/VOCdevkit/VOC2007/JPEGImages/004118.jpg 500 334 4 225 257 256 334 14 291 103 419 239 14 364 111 458 290 14 375 134 500 334 14 65 102 206 334 14 189 67 283 201 +2045 /data/VOCdevkit/VOC2007/JPEGImages/004119.jpg 500 333 17 121 192 346 312 8 450 199 500 333 +2046 /data/VOCdevkit/VOC2007/JPEGImages/004123.jpg 500 375 3 132 1 358 275 +2047 /data/VOCdevkit/VOC2007/JPEGImages/004124.jpg 500 375 15 153 37 500 375 15 2 54 240 372 +2048 /data/VOCdevkit/VOC2007/JPEGImages/004125.jpg 500 375 14 190 81 489 375 14 45 1 245 334 +2049 /data/VOCdevkit/VOC2007/JPEGImages/004126.jpg 291 480 12 84 128 187 430 14 84 72 217 301 +2050 /data/VOCdevkit/VOC2007/JPEGImages/004127.jpg 500 333 4 351 186 455 291 14 284 1 500 333 +2051 /data/VOCdevkit/VOC2007/JPEGImages/004128.jpg 500 375 8 65 193 243 373 8 266 48 311 106 14 250 115 479 373 14 57 82 189 364 14 34 36 94 142 14 153 66 273 198 14 217 53 295 154 14 79 36 140 92 +2052 /data/VOCdevkit/VOC2007/JPEGImages/004130.jpg 500 336 11 28 75 426 331 +2053 /data/VOCdevkit/VOC2007/JPEGImages/004132.jpg 500 333 17 1 85 496 316 14 221 47 349 306 14 318 34 451 333 14 45 14 210 333 +2054 /data/VOCdevkit/VOC2007/JPEGImages/004134.jpg 500 400 4 105 3 143 111 4 147 3 172 103 4 184 1 212 103 4 219 1 238 100 4 243 1 276 93 4 326 298 394 400 4 324 243 408 380 4 125 312 231 349 4 195 292 299 323 +2055 /data/VOCdevkit/VOC2007/JPEGImages/004139.jpg 500 375 8 42 63 461 373 +2056 /data/VOCdevkit/VOC2007/JPEGImages/004144.jpg 365 500 5 9 330 67 396 14 200 385 250 471 14 38 374 56 440 +2057 /data/VOCdevkit/VOC2007/JPEGImages/004147.jpg 500 385 6 75 177 355 257 +2058 /data/VOCdevkit/VOC2007/JPEGImages/004151.jpg 375 500 13 4 64 320 496 +2059 /data/VOCdevkit/VOC2007/JPEGImages/004153.jpg 500 333 0 8 41 496 240 +2060 /data/VOCdevkit/VOC2007/JPEGImages/004154.jpg 500 375 6 1 213 120 301 6 171 226 222 259 14 394 214 427 284 14 286 216 302 275 14 357 213 379 273 14 461 224 484 291 14 486 221 500 292 14 448 220 470 280 6 203 199 254 251 +2061 /data/VOCdevkit/VOC2007/JPEGImages/004155.jpg 333 500 15 114 25 258 185 +2062 /data/VOCdevkit/VOC2007/JPEGImages/004156.jpg 500 375 5 1 87 383 374 +2063 /data/VOCdevkit/VOC2007/JPEGImages/004157.jpg 500 333 11 1 58 406 333 +2064 /data/VOCdevkit/VOC2007/JPEGImages/004159.jpg 500 390 15 17 78 208 363 +2065 /data/VOCdevkit/VOC2007/JPEGImages/004160.jpg 500 375 3 146 99 357 199 +2066 /data/VOCdevkit/VOC2007/JPEGImages/004161.jpg 375 500 7 46 1 375 500 +2067 /data/VOCdevkit/VOC2007/JPEGImages/004162.jpg 375 500 4 76 380 103 480 4 160 384 183 482 4 289 397 321 490 +2068 /data/VOCdevkit/VOC2007/JPEGImages/004165.jpg 500 331 7 118 1 401 330 +2069 /data/VOCdevkit/VOC2007/JPEGImages/004166.jpg 500 332 10 234 204 500 332 11 210 194 257 234 +2070 /data/VOCdevkit/VOC2007/JPEGImages/004167.jpg 500 375 14 319 146 375 375 14 287 224 327 375 14 248 201 284 340 14 79 133 130 198 5 5 41 500 375 +2071 /data/VOCdevkit/VOC2007/JPEGImages/004172.jpg 333 500 6 220 290 268 330 +2072 /data/VOCdevkit/VOC2007/JPEGImages/004173.jpg 500 356 14 234 119 464 356 +2073 /data/VOCdevkit/VOC2007/JPEGImages/004175.jpg 500 375 14 2 17 479 375 +2074 /data/VOCdevkit/VOC2007/JPEGImages/004176.jpg 333 500 2 1 102 279 482 +2075 /data/VOCdevkit/VOC2007/JPEGImages/004177.jpg 480 395 12 86 118 425 342 14 189 30 304 222 +2076 /data/VOCdevkit/VOC2007/JPEGImages/004179.jpg 500 375 14 163 78 249 233 14 229 36 380 239 14 86 82 246 375 19 407 8 498 280 +2077 /data/VOCdevkit/VOC2007/JPEGImages/004180.jpg 500 375 8 197 13 272 116 +2078 /data/VOCdevkit/VOC2007/JPEGImages/004181.jpg 500 315 9 8 8 500 311 +2079 /data/VOCdevkit/VOC2007/JPEGImages/004182.jpg 500 332 18 213 129 281 207 +2080 /data/VOCdevkit/VOC2007/JPEGImages/004183.jpg 500 375 6 57 57 456 375 6 2 75 66 128 14 192 81 268 196 +2081 /data/VOCdevkit/VOC2007/JPEGImages/004184.jpg 500 375 3 127 65 456 375 +2082 /data/VOCdevkit/VOC2007/JPEGImages/004187.jpg 500 375 6 212 309 301 365 6 316 330 493 375 +2083 /data/VOCdevkit/VOC2007/JPEGImages/004188.jpg 500 375 7 213 1 500 375 6 135 183 158 216 6 111 128 145 163 6 72 131 102 170 +2084 /data/VOCdevkit/VOC2007/JPEGImages/004197.jpg 500 334 14 246 21 485 334 +2085 /data/VOCdevkit/VOC2007/JPEGImages/004198.jpg 332 500 13 2 168 292 500 14 200 125 269 366 14 147 114 267 463 14 2 157 30 206 +2086 /data/VOCdevkit/VOC2007/JPEGImages/004199.jpg 500 333 0 5 75 496 209 +2087 /data/VOCdevkit/VOC2007/JPEGImages/004202.jpg 500 375 11 272 124 500 358 11 54 161 252 351 +2088 /data/VOCdevkit/VOC2007/JPEGImages/004206.jpg 500 416 2 49 58 377 376 +2089 /data/VOCdevkit/VOC2007/JPEGImages/004207.jpg 500 375 14 136 11 256 374 +2090 /data/VOCdevkit/VOC2007/JPEGImages/004208.jpg 333 500 14 213 95 267 206 1 209 136 261 233 +2091 /data/VOCdevkit/VOC2007/JPEGImages/004210.jpg 500 374 14 314 24 425 120 +2092 /data/VOCdevkit/VOC2007/JPEGImages/004211.jpg 375 500 15 74 382 209 497 +2093 /data/VOCdevkit/VOC2007/JPEGImages/004213.jpg 500 375 13 120 131 500 375 14 156 68 348 344 14 1 1 136 375 +2094 /data/VOCdevkit/VOC2007/JPEGImages/004214.jpg 500 375 13 185 101 361 231 14 214 67 312 212 +2095 /data/VOCdevkit/VOC2007/JPEGImages/004216.jpg 500 375 6 306 192 386 252 +2096 /data/VOCdevkit/VOC2007/JPEGImages/004217.jpg 500 333 6 1 61 496 293 +2097 /data/VOCdevkit/VOC2007/JPEGImages/004218.jpg 500 375 11 322 227 477 331 2 6 202 74 245 2 143 190 196 234 2 139 174 179 207 2 92 179 133 218 2 13 179 40 199 2 204 168 240 221 2 320 193 340 220 +2098 /data/VOCdevkit/VOC2007/JPEGImages/004219.jpg 448 255 14 365 72 448 216 14 304 72 379 215 14 202 76 308 213 14 133 67 230 205 14 41 75 161 214 14 3 66 74 200 +2099 /data/VOCdevkit/VOC2007/JPEGImages/004222.jpg 500 332 17 252 156 362 224 15 75 167 145 250 19 138 132 213 200 +2100 /data/VOCdevkit/VOC2007/JPEGImages/004225.jpg 332 500 3 2 2 284 296 3 194 1 332 111 +2101 /data/VOCdevkit/VOC2007/JPEGImages/004226.jpg 500 375 11 166 51 334 351 +2102 /data/VOCdevkit/VOC2007/JPEGImages/004227.jpg 500 375 8 54 180 333 374 8 259 139 486 375 +2103 /data/VOCdevkit/VOC2007/JPEGImages/004233.jpg 500 375 9 123 144 415 348 9 75 111 107 152 +2104 /data/VOCdevkit/VOC2007/JPEGImages/004234.jpg 500 332 12 150 60 334 215 +2105 /data/VOCdevkit/VOC2007/JPEGImages/004235.jpg 500 405 18 33 58 435 339 +2106 /data/VOCdevkit/VOC2007/JPEGImages/004236.jpg 500 333 4 81 149 157 333 4 140 113 206 333 4 207 123 284 333 4 295 125 373 333 +2107 /data/VOCdevkit/VOC2007/JPEGImages/004238.jpg 500 357 14 10 105 112 357 14 228 112 341 357 14 314 24 483 357 +2108 /data/VOCdevkit/VOC2007/JPEGImages/004240.jpg 333 500 6 66 373 274 457 6 276 388 333 446 +2109 /data/VOCdevkit/VOC2007/JPEGImages/004243.jpg 500 375 13 1 174 106 308 13 85 164 213 291 13 174 163 263 261 13 235 156 334 244 13 305 136 402 230 13 372 161 426 215 13 456 132 500 181 13 423 132 465 196 14 47 117 91 244 14 454 114 472 146 14 405 120 425 155 +2110 /data/VOCdevkit/VOC2007/JPEGImages/004245.jpg 500 375 6 88 159 500 375 6 2 127 308 332 14 205 121 272 230 +2111 /data/VOCdevkit/VOC2007/JPEGImages/004248.jpg 500 333 14 178 242 266 333 14 185 156 241 221 14 434 155 457 189 14 242 137 271 169 +2112 /data/VOCdevkit/VOC2007/JPEGImages/004249.jpg 500 333 6 175 158 422 251 14 210 104 229 156 +2113 /data/VOCdevkit/VOC2007/JPEGImages/004250.jpg 360 480 10 126 159 272 228 10 79 224 298 332 10 27 325 358 480 8 102 129 146 197 8 79 149 137 221 8 61 162 128 284 8 4 206 93 405 +2114 /data/VOCdevkit/VOC2007/JPEGImages/004251.jpg 500 333 2 188 70 313 277 +2115 /data/VOCdevkit/VOC2007/JPEGImages/004252.jpg 500 375 19 203 32 294 107 7 157 229 316 375 +2116 /data/VOCdevkit/VOC2007/JPEGImages/004254.jpg 500 375 6 77 109 450 299 6 1 111 116 206 +2117 /data/VOCdevkit/VOC2007/JPEGImages/004260.jpg 500 281 19 85 1 404 136 14 85 2 500 281 +2118 /data/VOCdevkit/VOC2007/JPEGImages/004261.jpg 500 326 18 213 140 298 193 +2119 /data/VOCdevkit/VOC2007/JPEGImages/004262.jpg 375 500 8 156 258 240 352 +2120 /data/VOCdevkit/VOC2007/JPEGImages/004266.jpg 500 375 12 49 68 456 327 14 435 64 500 177 +2121 /data/VOCdevkit/VOC2007/JPEGImages/004267.jpg 380 284 11 13 46 360 256 +2122 /data/VOCdevkit/VOC2007/JPEGImages/004268.jpg 500 375 4 149 130 192 291 14 191 104 206 135 14 208 96 228 137 14 192 154 209 189 14 206 145 230 189 14 192 206 213 239 14 193 255 217 293 +2123 /data/VOCdevkit/VOC2007/JPEGImages/004276.jpg 375 500 17 54 100 291 256 14 265 85 375 351 14 109 157 248 382 14 80 98 138 238 15 22 79 39 107 15 9 77 26 107 +2124 /data/VOCdevkit/VOC2007/JPEGImages/004277.jpg 333 500 11 200 309 318 480 +2125 /data/VOCdevkit/VOC2007/JPEGImages/004278.jpg 500 341 0 14 141 449 289 +2126 /data/VOCdevkit/VOC2007/JPEGImages/004282.jpg 500 496 2 60 56 450 347 +2127 /data/VOCdevkit/VOC2007/JPEGImages/004285.jpg 500 333 14 1 61 272 333 14 243 76 489 333 14 410 143 441 185 +2128 /data/VOCdevkit/VOC2007/JPEGImages/004288.jpg 500 375 11 207 135 390 375 17 4 57 500 368 14 30 5 280 374 14 244 3 500 375 +2129 /data/VOCdevkit/VOC2007/JPEGImages/004289.jpg 500 375 14 5 128 138 375 14 104 82 283 313 14 181 64 424 373 +2130 /data/VOCdevkit/VOC2007/JPEGImages/004290.jpg 500 375 6 337 198 417 266 6 1 213 60 294 +2131 /data/VOCdevkit/VOC2007/JPEGImages/004294.jpg 500 332 12 140 121 433 301 14 261 75 320 237 +2132 /data/VOCdevkit/VOC2007/JPEGImages/004297.jpg 500 375 11 108 156 306 375 14 210 1 500 317 +2133 /data/VOCdevkit/VOC2007/JPEGImages/004299.jpg 500 375 3 167 119 397 196 14 271 118 297 167 3 422 15 500 43 3 148 8 253 50 +2134 /data/VOCdevkit/VOC2007/JPEGImages/004301.jpg 400 480 12 56 87 320 438 14 131 46 241 282 +2135 /data/VOCdevkit/VOC2007/JPEGImages/004302.jpg 500 333 5 1 124 500 264 +2136 /data/VOCdevkit/VOC2007/JPEGImages/004305.jpg 500 375 5 79 179 280 344 14 181 231 208 265 14 288 245 351 362 13 291 280 342 368 6 341 275 395 308 +2137 /data/VOCdevkit/VOC2007/JPEGImages/004306.jpg 500 375 11 283 149 464 358 11 183 30 500 304 +2138 /data/VOCdevkit/VOC2007/JPEGImages/004308.jpg 500 400 7 50 129 294 400 19 1 61 118 329 19 172 47 500 398 +2139 /data/VOCdevkit/VOC2007/JPEGImages/004309.jpg 500 375 12 88 157 422 375 14 178 74 308 294 +2140 /data/VOCdevkit/VOC2007/JPEGImages/004311.jpg 500 497 4 253 166 271 204 4 271 158 284 202 15 281 115 355 196 14 71 44 221 487 +2141 /data/VOCdevkit/VOC2007/JPEGImages/004313.jpg 500 500 6 12 180 479 411 +2142 /data/VOCdevkit/VOC2007/JPEGImages/004314.jpg 500 372 0 15 70 489 258 +2143 /data/VOCdevkit/VOC2007/JPEGImages/004316.jpg 500 375 7 88 114 284 294 +2144 /data/VOCdevkit/VOC2007/JPEGImages/004317.jpg 500 337 14 178 188 259 300 14 89 134 160 300 14 154 205 180 254 14 1 155 65 304 +2145 /data/VOCdevkit/VOC2007/JPEGImages/004319.jpg 500 375 10 1 145 498 375 +2146 /data/VOCdevkit/VOC2007/JPEGImages/004320.jpg 500 379 6 158 160 334 263 +2147 /data/VOCdevkit/VOC2007/JPEGImages/004324.jpg 500 333 18 1 64 412 323 14 351 119 373 175 +2148 /data/VOCdevkit/VOC2007/JPEGImages/004328.jpg 500 311 14 44 117 147 265 +2149 /data/VOCdevkit/VOC2007/JPEGImages/004330.jpg 500 333 1 302 118 500 266 14 345 69 484 247 +2150 /data/VOCdevkit/VOC2007/JPEGImages/004332.jpg 334 500 9 157 328 299 470 +2151 /data/VOCdevkit/VOC2007/JPEGImages/004334.jpg 375 500 14 42 65 327 500 +2152 /data/VOCdevkit/VOC2007/JPEGImages/004335.jpg 500 333 6 111 79 367 283 +2153 /data/VOCdevkit/VOC2007/JPEGImages/004336.jpg 500 375 14 66 45 259 375 14 247 48 496 375 +2154 /data/VOCdevkit/VOC2007/JPEGImages/004337.jpg 500 333 6 357 173 500 244 6 255 173 396 227 6 202 173 302 217 6 153 171 241 211 6 125 172 193 206 6 86 168 164 205 +2155 /data/VOCdevkit/VOC2007/JPEGImages/004340.jpg 500 375 2 203 170 355 333 2 172 237 362 368 2 62 115 240 284 2 200 78 257 156 +2156 /data/VOCdevkit/VOC2007/JPEGImages/004342.jpg 500 375 14 221 89 499 375 19 179 160 228 236 19 50 126 146 266 19 1 78 65 268 14 269 108 343 196 +2157 /data/VOCdevkit/VOC2007/JPEGImages/004343.jpg 500 330 11 82 36 496 283 +2158 /data/VOCdevkit/VOC2007/JPEGImages/004344.jpg 333 500 1 102 224 202 407 14 103 140 196 333 +2159 /data/VOCdevkit/VOC2007/JPEGImages/004348.jpg 500 380 10 1 48 500 380 +2160 /data/VOCdevkit/VOC2007/JPEGImages/004350.jpg 500 375 2 197 114 357 302 +2161 /data/VOCdevkit/VOC2007/JPEGImages/004353.jpg 500 338 7 19 9 500 338 +2162 /data/VOCdevkit/VOC2007/JPEGImages/004355.jpg 500 375 14 312 52 500 361 14 240 54 364 295 14 1 58 164 287 4 234 195 278 348 4 184 182 226 324 14 114 39 263 273 +2163 /data/VOCdevkit/VOC2007/JPEGImages/004357.jpg 500 375 16 427 275 497 326 16 272 285 362 340 14 277 199 321 352 14 357 209 429 330 +2164 /data/VOCdevkit/VOC2007/JPEGImages/004358.jpg 444 500 1 30 93 403 443 +2165 /data/VOCdevkit/VOC2007/JPEGImages/004362.jpg 404 500 2 213 190 352 430 2 14 62 233 309 +2166 /data/VOCdevkit/VOC2007/JPEGImages/004363.jpg 500 332 14 125 128 453 310 14 46 119 196 264 8 88 157 219 228 +2167 /data/VOCdevkit/VOC2007/JPEGImages/004366.jpg 500 375 8 56 121 210 340 8 312 121 467 248 14 187 102 282 298 14 232 192 341 323 +2168 /data/VOCdevkit/VOC2007/JPEGImages/004373.jpg 500 375 2 337 159 497 234 2 337 205 439 270 2 100 174 322 239 2 119 218 231 301 2 7 253 118 340 +2169 /data/VOCdevkit/VOC2007/JPEGImages/004374.jpg 500 375 3 180 174 277 226 +2170 /data/VOCdevkit/VOC2007/JPEGImages/004375.jpg 500 375 9 342 135 403 206 9 110 156 178 226 +2171 /data/VOCdevkit/VOC2007/JPEGImages/004377.jpg 500 375 0 200 175 220 201 0 201 207 217 228 0 193 260 211 283 0 186 285 202 310 +2172 /data/VOCdevkit/VOC2007/JPEGImages/004378.jpg 375 500 6 46 146 148 179 6 224 97 375 302 14 4 90 273 500 14 2 102 60 339 +2173 /data/VOCdevkit/VOC2007/JPEGImages/004381.jpg 500 341 12 15 56 454 312 14 231 23 359 165 +2174 /data/VOCdevkit/VOC2007/JPEGImages/004382.jpg 500 333 3 129 149 398 212 +2175 /data/VOCdevkit/VOC2007/JPEGImages/004383.jpg 500 332 2 99 76 308 329 +2176 /data/VOCdevkit/VOC2007/JPEGImages/004385.jpg 500 364 17 12 7 443 364 +2177 /data/VOCdevkit/VOC2007/JPEGImages/004388.jpg 500 375 18 94 100 445 248 +2178 /data/VOCdevkit/VOC2007/JPEGImages/004393.jpg 333 500 18 4 209 306 349 +2179 /data/VOCdevkit/VOC2007/JPEGImages/004394.jpg 500 333 2 259 90 379 238 +2180 /data/VOCdevkit/VOC2007/JPEGImages/004395.jpg 500 375 1 123 139 379 300 14 177 53 333 270 +2181 /data/VOCdevkit/VOC2007/JPEGImages/004398.jpg 500 375 0 15 100 472 211 +2182 /data/VOCdevkit/VOC2007/JPEGImages/004399.jpg 500 368 9 240 150 361 229 +2183 /data/VOCdevkit/VOC2007/JPEGImages/004400.jpg 500 375 2 105 2 382 375 +2184 /data/VOCdevkit/VOC2007/JPEGImages/004401.jpg 500 319 11 174 71 279 189 +2185 /data/VOCdevkit/VOC2007/JPEGImages/004402.jpg 500 334 5 139 18 500 294 +2186 /data/VOCdevkit/VOC2007/JPEGImages/004403.jpg 500 333 2 162 29 309 316 +2187 /data/VOCdevkit/VOC2007/JPEGImages/004406.jpg 500 375 2 124 75 500 225 +2188 /data/VOCdevkit/VOC2007/JPEGImages/004407.jpg 333 500 12 1 34 322 482 +2189 /data/VOCdevkit/VOC2007/JPEGImages/004408.jpg 500 334 14 391 69 500 334 14 99 69 405 333 14 197 30 338 247 14 1 19 91 206 14 100 18 210 333 +2190 /data/VOCdevkit/VOC2007/JPEGImages/004410.jpg 500 375 14 129 54 257 210 14 214 15 338 206 +2191 /data/VOCdevkit/VOC2007/JPEGImages/004412.jpg 500 375 14 75 88 466 375 +2192 /data/VOCdevkit/VOC2007/JPEGImages/004413.jpg 500 333 2 58 6 466 333 +2193 /data/VOCdevkit/VOC2007/JPEGImages/004414.jpg 500 327 18 98 111 384 238 +2194 /data/VOCdevkit/VOC2007/JPEGImages/004415.jpg 500 349 2 28 129 429 217 +2195 /data/VOCdevkit/VOC2007/JPEGImages/004416.jpg 500 375 2 90 124 378 308 +2196 /data/VOCdevkit/VOC2007/JPEGImages/004417.jpg 330 500 14 193 107 238 164 14 29 126 45 171 14 309 84 327 143 14 125 210 196 290 1 183 131 245 174 1 124 238 193 323 +2197 /data/VOCdevkit/VOC2007/JPEGImages/004418.jpg 333 500 14 161 238 300 426 19 38 151 176 260 +2198 /data/VOCdevkit/VOC2007/JPEGImages/004419.jpg 500 375 11 197 120 455 289 11 189 181 454 375 +2199 /data/VOCdevkit/VOC2007/JPEGImages/004420.jpg 500 375 14 65 38 303 294 14 281 142 490 375 +2200 /data/VOCdevkit/VOC2007/JPEGImages/004422.jpg 500 375 15 323 143 415 220 +2201 /data/VOCdevkit/VOC2007/JPEGImages/004425.jpg 375 500 2 70 28 291 394 +2202 /data/VOCdevkit/VOC2007/JPEGImages/004426.jpg 500 333 6 36 14 428 319 6 24 15 140 75 14 60 1 93 79 +2203 /data/VOCdevkit/VOC2007/JPEGImages/004427.jpg 500 375 7 94 32 281 375 +2204 /data/VOCdevkit/VOC2007/JPEGImages/004428.jpg 500 375 11 113 68 268 266 14 1 1 258 248 +2205 /data/VOCdevkit/VOC2007/JPEGImages/004431.jpg 333 500 5 52 272 244 421 +2206 /data/VOCdevkit/VOC2007/JPEGImages/004435.jpg 500 333 14 157 45 327 333 14 302 151 376 333 14 12 199 185 333 +2207 /data/VOCdevkit/VOC2007/JPEGImages/004440.jpg 500 375 14 87 4 461 375 +2208 /data/VOCdevkit/VOC2007/JPEGImages/004442.jpg 500 375 6 392 247 491 305 +2209 /data/VOCdevkit/VOC2007/JPEGImages/004443.jpg 500 333 2 327 142 384 197 2 220 137 263 210 3 189 63 396 169 +2210 /data/VOCdevkit/VOC2007/JPEGImages/004444.jpg 500 332 7 49 19 407 307 +2211 /data/VOCdevkit/VOC2007/JPEGImages/004445.jpg 500 375 9 235 72 459 221 9 75 88 178 152 9 44 131 147 253 9 224 140 270 238 9 447 145 500 288 +2212 /data/VOCdevkit/VOC2007/JPEGImages/004447.jpg 500 375 1 429 181 494 235 1 177 255 345 346 14 312 125 358 307 14 69 128 98 220 14 52 139 79 216 +2213 /data/VOCdevkit/VOC2007/JPEGImages/004448.jpg 500 375 13 94 50 274 287 13 233 58 398 252 13 380 61 483 234 +2214 /data/VOCdevkit/VOC2007/JPEGImages/004449.jpg 500 375 14 287 80 490 375 14 201 151 297 362 14 93 121 205 328 14 46 2 91 92 8 70 216 203 372 8 39 178 117 322 8 75 113 128 193 8 100 101 142 172 +2215 /data/VOCdevkit/VOC2007/JPEGImages/004451.jpg 500 375 15 7 252 187 375 15 37 169 172 261 15 153 222 238 349 +2216 /data/VOCdevkit/VOC2007/JPEGImages/004453.jpg 500 375 6 68 78 416 312 +2217 /data/VOCdevkit/VOC2007/JPEGImages/004454.jpg 375 500 14 213 95 311 375 +2218 /data/VOCdevkit/VOC2007/JPEGImages/004456.jpg 500 375 6 62 79 465 297 14 162 67 208 116 +2219 /data/VOCdevkit/VOC2007/JPEGImages/004458.jpg 500 429 6 55 167 431 270 +2220 /data/VOCdevkit/VOC2007/JPEGImages/004460.jpg 500 374 2 1 2 436 374 +2221 /data/VOCdevkit/VOC2007/JPEGImages/004461.jpg 500 368 2 11 36 482 330 +2222 /data/VOCdevkit/VOC2007/JPEGImages/004462.jpg 500 375 2 355 147 436 246 2 206 88 289 157 2 117 55 160 88 2 446 75 491 121 2 285 234 371 375 +2223 /data/VOCdevkit/VOC2007/JPEGImages/004465.jpg 500 375 11 213 186 374 340 14 148 119 432 375 14 87 85 283 359 17 1 109 480 375 +2224 /data/VOCdevkit/VOC2007/JPEGImages/004467.jpg 500 332 7 174 46 390 308 +2225 /data/VOCdevkit/VOC2007/JPEGImages/004469.jpg 500 375 10 96 188 345 316 10 185 114 298 189 14 257 100 377 236 14 313 125 415 299 14 244 117 500 375 14 77 106 172 239 14 48 78 90 114 14 1 102 115 331 14 334 11 360 77 4 184 320 216 375 4 153 319 189 375 4 213 192 236 256 4 196 195 220 255 +2226 /data/VOCdevkit/VOC2007/JPEGImages/004472.jpg 500 375 11 3 1 398 375 +2227 /data/VOCdevkit/VOC2007/JPEGImages/004473.jpg 500 335 18 215 129 421 206 +2228 /data/VOCdevkit/VOC2007/JPEGImages/004475.jpg 375 500 13 67 118 333 465 14 305 307 358 435 +2229 /data/VOCdevkit/VOC2007/JPEGImages/004476.jpg 500 375 14 3 110 224 346 14 217 114 359 375 14 328 71 500 375 4 328 75 352 170 4 371 81 404 177 4 21 219 58 336 +2230 /data/VOCdevkit/VOC2007/JPEGImages/004477.jpg 500 375 0 2 184 284 255 +2231 /data/VOCdevkit/VOC2007/JPEGImages/004478.jpg 500 375 6 2 26 142 114 14 37 33 57 71 6 135 33 258 78 6 33 39 429 336 +2232 /data/VOCdevkit/VOC2007/JPEGImages/004480.jpg 334 500 14 2 12 333 500 1 1 274 333 500 +2233 /data/VOCdevkit/VOC2007/JPEGImages/004482.jpg 500 375 10 2 245 500 375 14 14 81 217 329 14 206 64 370 280 +2234 /data/VOCdevkit/VOC2007/JPEGImages/004483.jpg 500 375 18 1 89 441 318 +2235 /data/VOCdevkit/VOC2007/JPEGImages/004485.jpg 500 375 14 15 127 144 370 14 87 92 176 331 14 157 91 246 322 14 219 67 305 329 14 281 73 354 317 14 339 36 431 316 14 416 27 500 315 +2236 /data/VOCdevkit/VOC2007/JPEGImages/004486.jpg 300 358 15 217 126 275 241 15 152 168 227 247 15 92 93 138 152 15 146 117 221 173 8 31 62 159 222 +2237 /data/VOCdevkit/VOC2007/JPEGImages/004489.jpg 500 333 7 80 2 329 293 +2238 /data/VOCdevkit/VOC2007/JPEGImages/004491.jpg 500 375 8 157 147 399 368 14 185 134 333 283 8 435 261 500 375 +2239 /data/VOCdevkit/VOC2007/JPEGImages/004492.jpg 500 375 12 17 33 320 375 6 123 1 394 165 +2240 /data/VOCdevkit/VOC2007/JPEGImages/004497.jpg 500 357 0 2 16 500 342 14 277 214 344 343 14 45 252 72 317 14 461 261 480 317 +2241 /data/VOCdevkit/VOC2007/JPEGImages/004501.jpg 500 375 11 362 121 495 375 11 9 223 232 362 11 185 192 394 371 +2242 /data/VOCdevkit/VOC2007/JPEGImages/004503.jpg 500 334 2 121 104 335 297 +2243 /data/VOCdevkit/VOC2007/JPEGImages/004504.jpg 500 335 7 2 67 215 317 +2244 /data/VOCdevkit/VOC2007/JPEGImages/004505.jpg 500 333 18 1 15 322 298 +2245 /data/VOCdevkit/VOC2007/JPEGImages/004506.jpg 375 500 8 90 82 330 470 +2246 /data/VOCdevkit/VOC2007/JPEGImages/004511.jpg 500 297 7 1 1 300 238 14 224 1 500 251 +2247 /data/VOCdevkit/VOC2007/JPEGImages/004513.jpg 500 375 2 237 164 263 181 +2248 /data/VOCdevkit/VOC2007/JPEGImages/004515.jpg 364 500 7 7 111 355 341 14 10 2 364 462 +2249 /data/VOCdevkit/VOC2007/JPEGImages/004516.jpg 500 333 14 235 126 323 333 14 316 179 382 333 14 317 89 446 333 14 179 81 259 132 +2250 /data/VOCdevkit/VOC2007/JPEGImages/004521.jpg 500 334 6 399 204 500 244 6 242 196 275 214 +2251 /data/VOCdevkit/VOC2007/JPEGImages/004522.jpg 500 375 12 232 186 397 308 +2252 /data/VOCdevkit/VOC2007/JPEGImages/004523.jpg 500 375 14 365 115 460 375 14 274 116 349 375 14 137 93 242 368 14 17 136 71 222 1 15 185 98 237 +2253 /data/VOCdevkit/VOC2007/JPEGImages/004525.jpg 500 334 8 373 1 500 120 10 48 1 500 334 +2254 /data/VOCdevkit/VOC2007/JPEGImages/004529.jpg 500 229 2 235 37 476 207 +2255 /data/VOCdevkit/VOC2007/JPEGImages/004531.jpg 500 395 2 2 2 499 394 +2256 /data/VOCdevkit/VOC2007/JPEGImages/004533.jpg 500 333 0 192 186 311 233 +2257 /data/VOCdevkit/VOC2007/JPEGImages/004534.jpg 500 375 14 196 183 227 240 14 369 177 388 228 1 357 196 401 232 +2258 /data/VOCdevkit/VOC2007/JPEGImages/004536.jpg 500 375 14 310 117 363 171 14 249 160 424 206 14 120 187 392 276 +2259 /data/VOCdevkit/VOC2007/JPEGImages/004538.jpg 480 367 14 215 35 308 224 12 41 77 403 367 +2260 /data/VOCdevkit/VOC2007/JPEGImages/004541.jpg 500 375 5 2 60 225 302 5 231 62 500 307 +2261 /data/VOCdevkit/VOC2007/JPEGImages/004543.jpg 500 333 6 13 45 340 333 6 233 39 500 228 +2262 /data/VOCdevkit/VOC2007/JPEGImages/004545.jpg 500 375 12 213 69 427 375 14 217 14 351 238 11 144 202 199 347 6 3 105 135 198 14 432 123 451 181 +2263 /data/VOCdevkit/VOC2007/JPEGImages/004546.jpg 500 375 4 161 201 215 374 4 52 153 152 375 +2264 /data/VOCdevkit/VOC2007/JPEGImages/004547.jpg 500 375 14 283 99 389 350 1 262 220 372 372 +2265 /data/VOCdevkit/VOC2007/JPEGImages/004550.jpg 500 375 2 179 132 281 241 +2266 /data/VOCdevkit/VOC2007/JPEGImages/004554.jpg 500 329 6 80 16 475 284 +2267 /data/VOCdevkit/VOC2007/JPEGImages/004556.jpg 500 333 0 4 42 499 279 +2268 /data/VOCdevkit/VOC2007/JPEGImages/004557.jpg 500 375 14 44 1 500 373 +2269 /data/VOCdevkit/VOC2007/JPEGImages/004559.jpg 500 327 10 315 270 500 327 10 319 242 447 275 8 262 241 366 327 8 281 221 320 304 8 295 210 352 274 8 298 194 329 244 8 419 192 463 245 8 483 203 500 274 +2270 /data/VOCdevkit/VOC2007/JPEGImages/004560.jpg 500 281 6 13 97 481 246 6 154 68 461 159 6 102 71 178 120 6 1 60 97 113 13 431 112 500 206 +2271 /data/VOCdevkit/VOC2007/JPEGImages/004561.jpg 500 375 14 189 154 316 375 12 33 276 443 375 +2272 /data/VOCdevkit/VOC2007/JPEGImages/004564.jpg 332 500 14 82 90 265 361 12 91 127 223 453 +2273 /data/VOCdevkit/VOC2007/JPEGImages/004567.jpg 500 375 17 93 197 393 375 +2274 /data/VOCdevkit/VOC2007/JPEGImages/004568.jpg 500 332 14 1 23 128 277 +2275 /data/VOCdevkit/VOC2007/JPEGImages/004569.jpg 375 500 11 1 1 276 500 14 1 1 327 484 +2276 /data/VOCdevkit/VOC2007/JPEGImages/004572.jpg 500 375 0 235 241 279 296 +2277 /data/VOCdevkit/VOC2007/JPEGImages/004573.jpg 500 264 3 189 138 291 173 14 270 118 295 152 14 201 135 227 169 +2278 /data/VOCdevkit/VOC2007/JPEGImages/004575.jpg 500 375 17 252 202 451 342 +2279 /data/VOCdevkit/VOC2007/JPEGImages/004577.jpg 500 375 7 79 80 267 195 7 212 89 426 271 +2280 /data/VOCdevkit/VOC2007/JPEGImages/004578.jpg 500 335 6 426 185 500 228 +2281 /data/VOCdevkit/VOC2007/JPEGImages/004580.jpg 494 500 14 175 235 336 499 14 342 243 465 437 14 344 252 494 500 6 338 267 394 320 +2282 /data/VOCdevkit/VOC2007/JPEGImages/004582.jpg 480 360 16 75 2 480 360 16 1 2 293 343 +2283 /data/VOCdevkit/VOC2007/JPEGImages/004583.jpg 500 375 2 303 195 337 280 +2284 /data/VOCdevkit/VOC2007/JPEGImages/004586.jpg 500 375 6 9 200 494 364 +2285 /data/VOCdevkit/VOC2007/JPEGImages/004589.jpg 480 364 12 87 38 391 335 14 221 40 317 180 +2286 /data/VOCdevkit/VOC2007/JPEGImages/004590.jpg 400 222 10 56 84 312 222 14 201 15 360 157 14 278 70 367 222 14 346 105 400 222 14 1 31 83 222 14 47 3 126 162 +2287 /data/VOCdevkit/VOC2007/JPEGImages/004593.jpg 500 375 11 102 1 500 375 +2288 /data/VOCdevkit/VOC2007/JPEGImages/004594.jpg 500 375 5 104 82 320 266 +2289 /data/VOCdevkit/VOC2007/JPEGImages/004596.jpg 382 500 6 1 5 381 499 +2290 /data/VOCdevkit/VOC2007/JPEGImages/004598.jpg 500 333 14 133 61 228 330 14 185 71 274 333 14 263 71 360 333 14 343 42 499 330 14 433 71 500 181 14 21 53 157 332 14 1 80 51 236 +2291 /data/VOCdevkit/VOC2007/JPEGImages/004599.jpg 375 500 4 117 24 240 458 4 286 116 340 255 14 123 6 322 199 14 1 1 152 276 +2292 /data/VOCdevkit/VOC2007/JPEGImages/004602.jpg 500 333 6 56 138 483 272 +2293 /data/VOCdevkit/VOC2007/JPEGImages/004603.jpg 500 333 18 6 137 359 224 +2294 /data/VOCdevkit/VOC2007/JPEGImages/004608.jpg 500 333 9 115 49 338 312 +2295 /data/VOCdevkit/VOC2007/JPEGImages/004610.jpg 500 334 16 210 2 387 332 16 127 56 278 164 16 48 137 297 332 +2296 /data/VOCdevkit/VOC2007/JPEGImages/004613.jpg 500 375 3 247 157 269 192 +2297 /data/VOCdevkit/VOC2007/JPEGImages/004614.jpg 500 375 2 136 146 307 293 +2298 /data/VOCdevkit/VOC2007/JPEGImages/004615.jpg 375 500 6 1 337 32 404 +2299 /data/VOCdevkit/VOC2007/JPEGImages/004616.jpg 500 375 13 3 2 500 375 +2300 /data/VOCdevkit/VOC2007/JPEGImages/004617.jpg 500 346 16 143 183 239 254 16 334 129 424 187 16 329 208 378 251 +2301 /data/VOCdevkit/VOC2007/JPEGImages/004619.jpg 500 333 14 175 87 500 333 +2302 /data/VOCdevkit/VOC2007/JPEGImages/004620.jpg 500 333 11 146 63 500 234 8 11 1 196 229 +2303 /data/VOCdevkit/VOC2007/JPEGImages/004621.jpg 500 374 11 118 101 471 374 +2304 /data/VOCdevkit/VOC2007/JPEGImages/004624.jpg 500 332 18 250 115 399 281 +2305 /data/VOCdevkit/VOC2007/JPEGImages/004629.jpg 500 322 12 58 106 221 277 12 171 114 309 269 12 332 133 436 265 14 91 60 152 216 14 204 68 257 218 14 332 80 385 148 14 304 119 348 269 14 336 122 382 273 +2306 /data/VOCdevkit/VOC2007/JPEGImages/004633.jpg 500 375 0 52 69 419 202 +2307 /data/VOCdevkit/VOC2007/JPEGImages/004635.jpg 500 332 9 230 128 392 251 2 160 196 213 242 +2308 /data/VOCdevkit/VOC2007/JPEGImages/004637.jpg 500 385 1 259 190 373 301 1 15 182 111 299 14 274 117 354 259 14 19 88 109 254 +2309 /data/VOCdevkit/VOC2007/JPEGImages/004638.jpg 500 197 18 2 11 475 157 +2310 /data/VOCdevkit/VOC2007/JPEGImages/004639.jpg 475 500 14 285 6 475 500 +2311 /data/VOCdevkit/VOC2007/JPEGImages/004640.jpg 500 375 10 58 135 397 375 8 11 269 160 374 4 190 113 211 172 4 146 101 162 165 4 213 128 234 211 4 237 134 264 213 14 249 61 500 375 14 1 57 29 142 14 4 76 153 345 14 71 57 163 134 14 220 60 284 150 14 264 57 348 172 14 277 68 431 206 +2312 /data/VOCdevkit/VOC2007/JPEGImages/004641.jpg 500 375 13 79 73 479 365 14 171 4 348 310 +2313 /data/VOCdevkit/VOC2007/JPEGImages/004642.jpg 500 375 16 52 160 472 334 14 112 36 397 322 +2314 /data/VOCdevkit/VOC2007/JPEGImages/004645.jpg 500 332 0 5 121 496 250 +2315 /data/VOCdevkit/VOC2007/JPEGImages/004646.jpg 335 500 16 166 188 228 275 +2316 /data/VOCdevkit/VOC2007/JPEGImages/004650.jpg 500 375 13 44 62 479 321 14 146 96 277 331 +2317 /data/VOCdevkit/VOC2007/JPEGImages/004657.jpg 500 334 18 86 130 344 311 +2318 /data/VOCdevkit/VOC2007/JPEGImages/004658.jpg 375 500 7 135 163 200 290 +2319 /data/VOCdevkit/VOC2007/JPEGImages/004659.jpg 500 375 17 101 203 432 368 +2320 /data/VOCdevkit/VOC2007/JPEGImages/004661.jpg 500 375 14 93 92 489 375 14 1 138 212 312 8 107 139 500 373 8 74 120 282 292 +2321 /data/VOCdevkit/VOC2007/JPEGImages/004663.jpg 500 375 18 1 168 407 260 +2322 /data/VOCdevkit/VOC2007/JPEGImages/004664.jpg 375 500 19 17 329 137 488 +2323 /data/VOCdevkit/VOC2007/JPEGImages/004665.jpg 500 375 3 96 124 282 190 3 198 220 258 238 14 205 193 227 229 +2324 /data/VOCdevkit/VOC2007/JPEGImages/004666.jpg 500 375 5 21 124 336 280 14 167 195 199 298 14 211 195 231 292 14 238 192 274 261 14 270 192 298 250 14 286 182 320 263 14 444 176 477 250 14 468 175 496 236 +2325 /data/VOCdevkit/VOC2007/JPEGImages/004667.jpg 500 400 6 1 93 265 291 6 242 65 500 316 14 355 11 444 214 14 311 18 495 400 +2326 /data/VOCdevkit/VOC2007/JPEGImages/004668.jpg 500 375 8 288 131 500 375 8 1 125 290 375 14 360 128 497 323 14 38 95 210 319 +2327 /data/VOCdevkit/VOC2007/JPEGImages/004669.jpg 500 333 16 144 181 220 238 16 231 188 320 237 +2328 /data/VOCdevkit/VOC2007/JPEGImages/004670.jpg 500 325 11 308 220 394 273 +2329 /data/VOCdevkit/VOC2007/JPEGImages/004677.jpg 375 500 8 115 203 227 470 7 154 196 215 293 +2330 /data/VOCdevkit/VOC2007/JPEGImages/004678.jpg 500 357 2 108 20 500 301 2 1 69 310 338 +2331 /data/VOCdevkit/VOC2007/JPEGImages/004680.jpg 500 375 0 106 153 349 254 +2332 /data/VOCdevkit/VOC2007/JPEGImages/004681.jpg 500 333 18 180 121 500 262 +2333 /data/VOCdevkit/VOC2007/JPEGImages/004684.jpg 500 333 6 126 76 464 311 +2334 /data/VOCdevkit/VOC2007/JPEGImages/004688.jpg 500 375 6 1 43 474 336 +2335 /data/VOCdevkit/VOC2007/JPEGImages/004690.jpg 500 443 14 157 52 352 443 +2336 /data/VOCdevkit/VOC2007/JPEGImages/004695.jpg 500 375 8 323 216 475 343 +2337 /data/VOCdevkit/VOC2007/JPEGImages/004696.jpg 500 333 11 95 105 203 246 11 185 75 299 193 +2338 /data/VOCdevkit/VOC2007/JPEGImages/004697.jpg 500 375 6 82 2 421 273 +2339 /data/VOCdevkit/VOC2007/JPEGImages/004698.jpg 500 274 14 320 142 362 217 14 380 139 412 226 14 387 137 444 228 14 200 5 326 274 14 161 33 302 274 +2340 /data/VOCdevkit/VOC2007/JPEGImages/004700.jpg 375 500 7 117 244 251 367 +2341 /data/VOCdevkit/VOC2007/JPEGImages/004703.jpg 500 469 14 210 82 344 394 1 190 197 383 419 +2342 /data/VOCdevkit/VOC2007/JPEGImages/004704.jpg 375 500 14 1 136 347 395 +2343 /data/VOCdevkit/VOC2007/JPEGImages/004709.jpg 500 375 14 5 71 448 374 +2344 /data/VOCdevkit/VOC2007/JPEGImages/004711.jpg 500 375 18 210 113 340 240 18 337 114 433 230 +2345 /data/VOCdevkit/VOC2007/JPEGImages/004712.jpg 500 375 14 101 106 380 375 4 15 156 43 214 4 2 146 32 209 8 164 114 229 224 15 406 62 500 269 +2346 /data/VOCdevkit/VOC2007/JPEGImages/004713.jpg 500 375 14 60 3 500 375 +2347 /data/VOCdevkit/VOC2007/JPEGImages/004716.jpg 500 332 19 29 133 207 287 14 212 5 404 307 +2348 /data/VOCdevkit/VOC2007/JPEGImages/004717.jpg 375 500 19 163 292 273 382 8 1 398 313 500 4 244 178 258 231 4 233 179 247 232 +2349 /data/VOCdevkit/VOC2007/JPEGImages/004720.jpg 500 375 7 241 146 320 228 4 154 154 169 193 +2350 /data/VOCdevkit/VOC2007/JPEGImages/004721.jpg 500 334 4 157 241 187 332 4 309 296 334 334 14 111 121 227 320 14 203 134 292 331 14 283 126 384 334 +2351 /data/VOCdevkit/VOC2007/JPEGImages/004724.jpg 500 332 5 75 83 430 253 +2352 /data/VOCdevkit/VOC2007/JPEGImages/004725.jpg 500 375 14 189 85 381 320 13 8 57 470 375 +2353 /data/VOCdevkit/VOC2007/JPEGImages/004726.jpg 500 375 14 2 22 426 375 14 239 50 500 375 +2354 /data/VOCdevkit/VOC2007/JPEGImages/004728.jpg 500 333 14 449 199 472 253 +2355 /data/VOCdevkit/VOC2007/JPEGImages/004729.jpg 400 380 13 9 62 382 329 +2356 /data/VOCdevkit/VOC2007/JPEGImages/004730.jpg 500 375 2 166 1 500 266 +2357 /data/VOCdevkit/VOC2007/JPEGImages/004731.jpg 500 437 14 146 176 298 437 14 108 5 157 120 6 392 47 500 110 18 197 57 500 389 +2358 /data/VOCdevkit/VOC2007/JPEGImages/004733.jpg 333 500 8 21 186 283 500 +2359 /data/VOCdevkit/VOC2007/JPEGImages/004734.jpg 474 316 6 52 43 409 234 +2360 /data/VOCdevkit/VOC2007/JPEGImages/004736.jpg 315 500 7 90 43 292 464 +2361 /data/VOCdevkit/VOC2007/JPEGImages/004738.jpg 328 432 13 155 288 324 432 14 197 240 302 428 +2362 /data/VOCdevkit/VOC2007/JPEGImages/004739.jpg 375 500 14 245 171 375 500 14 191 191 333 500 14 63 157 234 500 +2363 /data/VOCdevkit/VOC2007/JPEGImages/004740.jpg 500 375 10 152 229 499 375 14 371 98 500 301 14 297 113 426 266 14 172 110 291 231 14 1 117 149 375 +2364 /data/VOCdevkit/VOC2007/JPEGImages/004741.jpg 500 375 9 139 115 223 203 9 243 93 367 185 +2365 /data/VOCdevkit/VOC2007/JPEGImages/004744.jpg 500 333 14 1 26 247 333 14 283 56 480 238 +2366 /data/VOCdevkit/VOC2007/JPEGImages/004745.jpg 500 333 6 36 34 435 307 14 445 86 482 199 14 396 90 431 152 14 75 44 116 116 +2367 /data/VOCdevkit/VOC2007/JPEGImages/004749.jpg 320 233 12 79 48 220 231 14 118 22 186 150 +2368 /data/VOCdevkit/VOC2007/JPEGImages/004751.jpg 500 335 18 55 115 453 215 +2369 /data/VOCdevkit/VOC2007/JPEGImages/004752.jpg 500 375 0 105 72 182 138 +2370 /data/VOCdevkit/VOC2007/JPEGImages/004755.jpg 500 375 6 157 170 443 252 +2371 /data/VOCdevkit/VOC2007/JPEGImages/004756.jpg 500 332 12 203 113 320 248 14 229 83 311 200 +2372 /data/VOCdevkit/VOC2007/JPEGImages/004757.jpg 500 400 2 58 50 122 103 2 289 117 448 336 +2373 /data/VOCdevkit/VOC2007/JPEGImages/004758.jpg 184 328 11 44 49 129 308 +2374 /data/VOCdevkit/VOC2007/JPEGImages/004759.jpg 500 375 7 10 2 500 355 +2375 /data/VOCdevkit/VOC2007/JPEGImages/004762.jpg 500 334 5 66 64 468 254 14 111 133 138 166 +2376 /data/VOCdevkit/VOC2007/JPEGImages/004763.jpg 500 375 1 283 26 475 346 6 1 1 192 50 +2377 /data/VOCdevkit/VOC2007/JPEGImages/004764.jpg 500 342 6 258 245 284 269 6 66 240 183 320 6 9 248 41 286 +2378 /data/VOCdevkit/VOC2007/JPEGImages/004765.jpg 313 500 1 31 231 263 500 14 18 11 293 500 +2379 /data/VOCdevkit/VOC2007/JPEGImages/004766.jpg 500 375 14 217 21 372 372 14 354 167 434 275 14 1 51 68 372 +2380 /data/VOCdevkit/VOC2007/JPEGImages/004767.jpg 500 375 11 4 84 404 375 +2381 /data/VOCdevkit/VOC2007/JPEGImages/004769.jpg 500 375 1 200 178 500 375 14 68 52 171 365 14 401 241 439 289 14 354 237 413 313 14 188 167 203 190 +2382 /data/VOCdevkit/VOC2007/JPEGImages/004771.jpg 375 500 14 110 75 318 400 14 268 154 368 330 14 221 329 374 500 14 24 353 236 500 14 3 128 84 500 +2383 /data/VOCdevkit/VOC2007/JPEGImages/004772.jpg 500 375 9 53 133 401 262 +2384 /data/VOCdevkit/VOC2007/JPEGImages/004774.jpg 500 337 16 42 103 205 293 +2385 /data/VOCdevkit/VOC2007/JPEGImages/004775.jpg 500 333 9 47 2 446 332 +2386 /data/VOCdevkit/VOC2007/JPEGImages/004778.jpg 500 330 15 1 14 180 314 +2387 /data/VOCdevkit/VOC2007/JPEGImages/004780.jpg 375 500 6 158 383 263 451 6 19 383 147 426 15 109 390 142 446 15 44 386 74 429 15 212 193 266 288 +2388 /data/VOCdevkit/VOC2007/JPEGImages/004781.jpg 500 333 19 56 72 93 103 19 47 120 86 172 19 88 123 129 174 19 350 129 394 199 19 392 129 446 210 8 212 205 318 330 8 1 188 93 324 +2389 /data/VOCdevkit/VOC2007/JPEGImages/004784.jpg 500 333 0 192 125 251 248 +2390 /data/VOCdevkit/VOC2007/JPEGImages/004787.jpg 500 375 11 130 21 430 303 +2391 /data/VOCdevkit/VOC2007/JPEGImages/004791.jpg 400 300 8 74 98 170 289 14 119 49 270 299 14 220 8 272 95 14 273 2 369 243 14 35 1 110 198 +2392 /data/VOCdevkit/VOC2007/JPEGImages/004795.jpg 480 360 14 226 122 301 292 +2393 /data/VOCdevkit/VOC2007/JPEGImages/004798.jpg 500 333 2 56 16 486 333 +2394 /data/VOCdevkit/VOC2007/JPEGImages/004800.jpg 500 240 6 234 1 500 105 13 27 48 289 199 14 156 19 262 204 +2395 /data/VOCdevkit/VOC2007/JPEGImages/004802.jpg 500 375 5 17 103 430 209 +2396 /data/VOCdevkit/VOC2007/JPEGImages/004803.jpg 500 333 14 143 38 310 257 12 128 86 295 305 +2397 /data/VOCdevkit/VOC2007/JPEGImages/004804.jpg 268 400 12 38 107 221 263 14 86 19 138 181 14 156 66 223 115 +2398 /data/VOCdevkit/VOC2007/JPEGImages/004806.jpg 500 333 6 43 195 316 296 +2399 /data/VOCdevkit/VOC2007/JPEGImages/004807.jpg 500 375 12 118 24 382 301 14 140 134 264 340 +2400 /data/VOCdevkit/VOC2007/JPEGImages/004809.jpg 500 375 7 77 4 318 333 +2401 /data/VOCdevkit/VOC2007/JPEGImages/004810.jpg 500 375 6 8 238 186 340 6 180 226 254 290 6 263 202 312 245 14 358 212 385 283 14 413 219 448 305 14 389 209 420 287 +2402 /data/VOCdevkit/VOC2007/JPEGImages/004811.jpg 375 500 1 84 202 375 386 14 153 11 284 457 +2403 /data/VOCdevkit/VOC2007/JPEGImages/004813.jpg 500 375 8 65 189 146 305 8 224 185 327 296 17 295 178 500 375 +2404 /data/VOCdevkit/VOC2007/JPEGImages/004817.jpg 500 375 18 1 291 181 340 +2405 /data/VOCdevkit/VOC2007/JPEGImages/004819.jpg 375 500 10 117 206 375 500 14 1 221 145 500 14 30 178 169 404 14 78 143 126 235 14 90 130 187 245 14 160 126 234 220 14 241 126 308 261 14 293 135 358 305 14 317 180 375 357 4 179 279 205 355 4 242 312 266 388 +2406 /data/VOCdevkit/VOC2007/JPEGImages/004820.jpg 367 500 8 2 352 65 500 +2407 /data/VOCdevkit/VOC2007/JPEGImages/004821.jpg 333 500 6 50 370 250 458 +2408 /data/VOCdevkit/VOC2007/JPEGImages/004822.jpg 500 375 14 179 28 373 317 13 184 65 465 356 +2409 /data/VOCdevkit/VOC2007/JPEGImages/004824.jpg 500 334 0 36 92 220 214 0 129 3 316 133 +2410 /data/VOCdevkit/VOC2007/JPEGImages/004827.jpg 334 500 16 94 281 261 445 16 77 235 176 363 16 303 253 333 329 16 174 257 234 339 +2411 /data/VOCdevkit/VOC2007/JPEGImages/004829.jpg 375 500 2 22 23 278 500 +2412 /data/VOCdevkit/VOC2007/JPEGImages/004833.jpg 500 375 13 1 1 355 375 +2413 /data/VOCdevkit/VOC2007/JPEGImages/004835.jpg 500 333 14 4 2 276 333 14 295 3 500 332 1 1 194 272 333 1 284 171 500 333 +2414 /data/VOCdevkit/VOC2007/JPEGImages/004838.jpg 500 338 17 3 108 434 336 +2415 /data/VOCdevkit/VOC2007/JPEGImages/004843.jpg 500 375 3 103 117 471 228 +2416 /data/VOCdevkit/VOC2007/JPEGImages/004844.jpg 281 500 6 185 390 263 435 6 2 391 176 480 6 149 381 205 419 14 135 183 204 272 +2417 /data/VOCdevkit/VOC2007/JPEGImages/004845.jpg 500 333 7 3 1 334 333 +2418 /data/VOCdevkit/VOC2007/JPEGImages/004847.jpg 500 375 1 159 5 417 375 +2419 /data/VOCdevkit/VOC2007/JPEGImages/004851.jpg 500 375 7 135 48 500 326 +2420 /data/VOCdevkit/VOC2007/JPEGImages/004853.jpg 500 333 18 33 84 447 219 +2421 /data/VOCdevkit/VOC2007/JPEGImages/004854.jpg 500 375 16 81 194 271 298 16 272 228 358 268 +2422 /data/VOCdevkit/VOC2007/JPEGImages/004855.jpg 500 375 14 79 96 220 375 14 196 110 291 296 14 269 103 429 333 14 242 96 500 375 +2423 /data/VOCdevkit/VOC2007/JPEGImages/004858.jpg 500 375 15 397 1 500 158 +2424 /data/VOCdevkit/VOC2007/JPEGImages/004860.jpg 375 500 6 20 62 374 395 +2425 /data/VOCdevkit/VOC2007/JPEGImages/004861.jpg 402 500 2 113 53 320 494 +2426 /data/VOCdevkit/VOC2007/JPEGImages/004862.jpg 375 500 8 1 358 50 500 15 232 366 260 393 15 227 295 269 351 +2427 /data/VOCdevkit/VOC2007/JPEGImages/004864.jpg 333 500 14 28 28 58 109 14 71 24 99 122 14 277 28 333 287 14 77 25 270 396 13 40 113 323 500 +2428 /data/VOCdevkit/VOC2007/JPEGImages/004865.jpg 458 304 12 17 52 417 291 +2429 /data/VOCdevkit/VOC2007/JPEGImages/004870.jpg 500 375 14 159 31 323 310 13 106 78 399 375 6 27 39 143 114 6 404 25 500 119 +2430 /data/VOCdevkit/VOC2007/JPEGImages/004871.jpg 500 375 18 67 88 478 361 +2431 /data/VOCdevkit/VOC2007/JPEGImages/004874.jpg 500 375 12 62 101 324 248 14 192 95 266 167 +2432 /data/VOCdevkit/VOC2007/JPEGImages/004875.jpg 500 375 2 2 1 359 373 +2433 /data/VOCdevkit/VOC2007/JPEGImages/004877.jpg 500 375 2 101 106 380 293 14 462 114 500 208 +2434 /data/VOCdevkit/VOC2007/JPEGImages/004880.jpg 500 332 4 397 211 419 284 4 387 215 402 271 +2435 /data/VOCdevkit/VOC2007/JPEGImages/004881.jpg 500 375 10 1 168 499 375 +2436 /data/VOCdevkit/VOC2007/JPEGImages/004883.jpg 500 333 5 10 89 488 217 +2437 /data/VOCdevkit/VOC2007/JPEGImages/004884.jpg 500 379 14 203 60 472 379 +2438 /data/VOCdevkit/VOC2007/JPEGImages/004887.jpg 500 375 17 3 142 259 294 8 305 142 496 323 +2439 /data/VOCdevkit/VOC2007/JPEGImages/004888.jpg 375 500 7 92 187 206 387 7 206 189 351 395 +2440 /data/VOCdevkit/VOC2007/JPEGImages/004889.jpg 500 337 14 1 1 118 164 14 68 98 354 291 14 64 6 500 337 +2441 /data/VOCdevkit/VOC2007/JPEGImages/004891.jpg 500 333 6 131 108 414 248 +2442 /data/VOCdevkit/VOC2007/JPEGImages/004892.jpg 500 375 8 357 168 418 275 8 273 186 338 277 8 190 202 252 280 8 140 209 195 284 10 1 279 443 375 10 2 179 441 375 +2443 /data/VOCdevkit/VOC2007/JPEGImages/004893.jpg 375 500 15 241 130 307 189 14 131 245 241 500 +2444 /data/VOCdevkit/VOC2007/JPEGImages/004894.jpg 500 334 14 93 21 378 333 +2445 /data/VOCdevkit/VOC2007/JPEGImages/004899.jpg 500 333 3 144 1 500 333 14 58 116 257 333 +2446 /data/VOCdevkit/VOC2007/JPEGImages/004900.jpg 170 500 14 65 357 101 500 14 87 344 132 500 +2447 /data/VOCdevkit/VOC2007/JPEGImages/004901.jpg 500 375 9 111 131 335 318 +2448 /data/VOCdevkit/VOC2007/JPEGImages/004904.jpg 500 333 14 373 79 454 195 14 76 118 181 238 14 267 16 334 110 1 354 118 495 210 1 65 160 244 268 +2449 /data/VOCdevkit/VOC2007/JPEGImages/004906.jpg 500 333 0 131 79 255 249 +2450 /data/VOCdevkit/VOC2007/JPEGImages/004908.jpg 375 500 14 76 47 293 426 +2451 /data/VOCdevkit/VOC2007/JPEGImages/004909.jpg 375 500 2 144 25 274 443 +2452 /data/VOCdevkit/VOC2007/JPEGImages/004914.jpg 500 375 3 78 6 373 354 +2453 /data/VOCdevkit/VOC2007/JPEGImages/004915.jpg 434 500 2 104 28 422 467 2 20 218 221 427 +2454 /data/VOCdevkit/VOC2007/JPEGImages/004917.jpg 500 375 13 100 123 378 332 14 167 89 298 304 +2455 /data/VOCdevkit/VOC2007/JPEGImages/004918.jpg 500 290 14 164 8 500 285 8 2 75 500 283 +2456 /data/VOCdevkit/VOC2007/JPEGImages/004919.jpg 500 375 4 310 32 429 261 +2457 /data/VOCdevkit/VOC2007/JPEGImages/004920.jpg 500 312 14 288 47 362 126 14 23 59 267 312 +2458 /data/VOCdevkit/VOC2007/JPEGImages/004921.jpg 369 480 18 65 133 301 382 +2459 /data/VOCdevkit/VOC2007/JPEGImages/004922.jpg 500 333 4 216 125 369 192 14 105 42 291 332 14 202 1 500 330 +2460 /data/VOCdevkit/VOC2007/JPEGImages/004923.jpg 500 375 17 58 125 500 375 14 112 124 380 374 14 2 107 265 375 14 1 68 243 326 8 12 81 153 234 +2461 /data/VOCdevkit/VOC2007/JPEGImages/004924.jpg 500 375 5 1 3 499 370 +2462 /data/VOCdevkit/VOC2007/JPEGImages/004925.jpg 375 500 11 185 200 375 500 14 3 2 206 498 +2463 /data/VOCdevkit/VOC2007/JPEGImages/004927.jpg 500 375 6 58 26 433 303 14 409 52 439 149 14 369 60 394 114 14 31 65 45 111 14 48 67 65 110 14 67 65 81 107 +2464 /data/VOCdevkit/VOC2007/JPEGImages/004930.jpg 500 333 1 40 250 327 333 14 48 19 353 333 +2465 /data/VOCdevkit/VOC2007/JPEGImages/004932.jpg 320 218 12 73 49 238 214 14 115 19 179 143 +2466 /data/VOCdevkit/VOC2007/JPEGImages/004933.jpg 500 375 6 148 163 227 200 +2467 /data/VOCdevkit/VOC2007/JPEGImages/004934.jpg 500 333 7 178 11 500 333 14 2 2 499 332 +2468 /data/VOCdevkit/VOC2007/JPEGImages/004937.jpg 500 375 14 29 126 67 228 14 100 103 129 216 14 119 103 144 138 14 143 84 232 231 14 243 103 303 213 3 83 2 415 326 3 223 298 500 375 +2469 /data/VOCdevkit/VOC2007/JPEGImages/004940.jpg 500 333 6 19 135 489 312 +2470 /data/VOCdevkit/VOC2007/JPEGImages/004941.jpg 375 500 14 9 61 112 478 15 88 1 373 423 +2471 /data/VOCdevkit/VOC2007/JPEGImages/004942.jpg 500 343 13 247 134 437 338 +2472 /data/VOCdevkit/VOC2007/JPEGImages/004944.jpg 500 375 5 1 55 189 375 14 104 227 206 375 14 196 143 259 284 +2473 /data/VOCdevkit/VOC2007/JPEGImages/004945.jpg 500 357 11 121 41 357 357 +2474 /data/VOCdevkit/VOC2007/JPEGImages/004947.jpg 500 333 14 300 107 500 333 14 155 89 280 333 14 1 40 189 333 +2475 /data/VOCdevkit/VOC2007/JPEGImages/004949.jpg 374 500 2 104 197 169 289 2 163 36 234 133 2 206 203 277 300 2 292 304 373 392 +2476 /data/VOCdevkit/VOC2007/JPEGImages/004952.jpg 335 500 18 151 236 183 280 +2477 /data/VOCdevkit/VOC2007/JPEGImages/004957.jpg 500 375 12 148 11 494 364 +2478 /data/VOCdevkit/VOC2007/JPEGImages/004959.jpg 500 333 6 115 90 196 132 14 93 100 107 152 14 104 102 121 153 14 30 123 58 162 14 46 109 68 132 14 69 117 91 158 14 204 121 285 333 14 300 128 429 333 6 273 96 500 333 +2479 /data/VOCdevkit/VOC2007/JPEGImages/004964.jpg 500 333 17 111 182 345 289 8 433 203 500 294 14 420 63 486 207 +2480 /data/VOCdevkit/VOC2007/JPEGImages/004965.jpg 281 500 6 43 400 152 471 6 152 416 281 500 +2481 /data/VOCdevkit/VOC2007/JPEGImages/004969.jpg 500 375 16 201 160 298 237 +2482 /data/VOCdevkit/VOC2007/JPEGImages/004970.jpg 500 400 12 24 22 482 400 +2483 /data/VOCdevkit/VOC2007/JPEGImages/004971.jpg 500 375 8 199 177 430 374 14 3 175 174 374 14 217 135 437 375 +2484 /data/VOCdevkit/VOC2007/JPEGImages/004975.jpg 375 500 7 12 143 366 429 +2485 /data/VOCdevkit/VOC2007/JPEGImages/004978.jpg 500 375 14 285 105 453 375 14 175 61 299 232 14 49 144 193 373 14 179 162 291 375 14 269 76 358 202 +2486 /data/VOCdevkit/VOC2007/JPEGImages/004979.jpg 500 400 11 178 117 304 280 +2487 /data/VOCdevkit/VOC2007/JPEGImages/004980.jpg 500 333 9 381 208 466 252 9 91 201 132 229 9 22 201 72 233 9 359 199 390 226 +2488 /data/VOCdevkit/VOC2007/JPEGImages/004981.jpg 500 375 6 5 61 431 305 +2489 /data/VOCdevkit/VOC2007/JPEGImages/004988.jpg 500 342 0 2 14 500 306 +2490 /data/VOCdevkit/VOC2007/JPEGImages/004989.jpg 500 375 5 57 184 434 306 +2491 /data/VOCdevkit/VOC2007/JPEGImages/004993.jpg 500 333 11 63 104 412 293 +2492 /data/VOCdevkit/VOC2007/JPEGImages/004996.jpg 500 375 6 42 89 480 347 +2493 /data/VOCdevkit/VOC2007/JPEGImages/005000.jpg 500 375 1 64 163 359 375 +2494 /data/VOCdevkit/VOC2007/JPEGImages/005002.jpg 334 500 4 152 118 263 500 14 52 2 329 217 4 119 51 183 255 +2495 /data/VOCdevkit/VOC2007/JPEGImages/005005.jpg 500 375 6 65 188 456 318 14 312 194 341 230 +2496 /data/VOCdevkit/VOC2007/JPEGImages/005008.jpg 500 333 0 69 111 390 255 +2497 /data/VOCdevkit/VOC2007/JPEGImages/005009.jpg 500 375 14 423 11 500 246 +2498 /data/VOCdevkit/VOC2007/JPEGImages/005010.jpg 500 380 11 49 138 357 312 +2499 /data/VOCdevkit/VOC2007/JPEGImages/005011.jpg 500 333 18 73 170 500 258 +2500 /data/VOCdevkit/VOC2007/JPEGImages/005012.jpg 375 500 11 2 277 147 500 7 111 359 201 500 14 190 3 329 498 +2501 /data/VOCdevkit/VOC2007/JPEGImages/005013.jpg 500 335 18 65 72 464 285 +2502 /data/VOCdevkit/VOC2007/JPEGImages/005015.jpg 500 375 2 44 155 317 255 +2503 /data/VOCdevkit/VOC2007/JPEGImages/005017.jpg 500 375 9 352 217 386 276 14 111 220 141 257 14 139 221 167 259 14 185 220 213 262 14 166 217 191 256 14 92 198 107 244 14 206 208 220 241 +2504 /data/VOCdevkit/VOC2007/JPEGImages/005019.jpg 500 341 14 135 1 441 340 14 5 128 150 340 +2505 /data/VOCdevkit/VOC2007/JPEGImages/005021.jpg 500 375 6 40 107 476 252 +2506 /data/VOCdevkit/VOC2007/JPEGImages/005022.jpg 500 333 3 209 104 274 140 +2507 /data/VOCdevkit/VOC2007/JPEGImages/005025.jpg 500 375 17 12 85 500 364 14 375 75 500 186 14 196 78 373 234 14 273 107 500 220 +2508 /data/VOCdevkit/VOC2007/JPEGImages/005030.jpg 500 375 6 25 59 478 291 +2509 /data/VOCdevkit/VOC2007/JPEGImages/005031.jpg 500 333 1 320 170 429 279 1 51 139 206 290 14 291 101 408 259 14 25 37 172 243 +2510 /data/VOCdevkit/VOC2007/JPEGImages/005034.jpg 500 375 0 337 128 459 199 +2511 /data/VOCdevkit/VOC2007/JPEGImages/005035.jpg 500 333 6 33 35 483 292 14 395 2 425 102 6 429 18 500 73 6 2 27 54 105 14 245 4 266 41 14 267 3 281 42 14 281 2 307 86 +2512 /data/VOCdevkit/VOC2007/JPEGImages/005038.jpg 500 375 7 117 135 411 289 +2513 /data/VOCdevkit/VOC2007/JPEGImages/005040.jpg 500 375 14 102 47 413 375 14 244 46 500 375 +2514 /data/VOCdevkit/VOC2007/JPEGImages/005041.jpg 500 375 6 441 175 496 227 13 316 211 369 271 14 323 163 369 245 14 366 160 422 223 14 196 153 274 246 14 74 131 252 375 +2515 /data/VOCdevkit/VOC2007/JPEGImages/005043.jpg 500 254 0 309 200 426 227 +2516 /data/VOCdevkit/VOC2007/JPEGImages/005044.jpg 500 331 8 297 113 429 331 8 65 109 266 331 8 1 109 111 331 8 98 106 201 256 8 1 105 41 188 10 351 146 490 302 +2517 /data/VOCdevkit/VOC2007/JPEGImages/005046.jpg 500 375 5 30 99 500 315 +2518 /data/VOCdevkit/VOC2007/JPEGImages/005048.jpg 500 375 1 137 12 362 340 +2519 /data/VOCdevkit/VOC2007/JPEGImages/005049.jpg 500 375 10 182 180 500 374 14 12 148 252 374 14 2 55 219 356 14 206 57 344 199 14 389 86 500 252 14 384 254 499 374 +2520 /data/VOCdevkit/VOC2007/JPEGImages/005050.jpg 500 375 11 166 37 447 342 8 1 3 500 375 +2521 /data/VOCdevkit/VOC2007/JPEGImages/005051.jpg 500 412 11 165 160 500 399 11 1 5 376 412 +2522 /data/VOCdevkit/VOC2007/JPEGImages/005053.jpg 500 333 12 22 144 69 202 12 160 126 218 203 12 263 124 332 205 +2523 /data/VOCdevkit/VOC2007/JPEGImages/005059.jpg 500 375 19 89 85 235 219 +2524 /data/VOCdevkit/VOC2007/JPEGImages/005060.jpg 500 375 14 51 42 183 189 14 47 123 156 334 14 110 120 269 315 14 120 153 252 325 14 238 153 297 251 14 162 197 405 375 14 298 162 359 255 14 317 160 405 373 14 363 146 500 375 +2525 /data/VOCdevkit/VOC2007/JPEGImages/005066.jpg 500 375 5 102 57 401 347 +2526 /data/VOCdevkit/VOC2007/JPEGImages/005069.jpg 375 500 18 1 36 337 241 14 142 224 243 394 +2527 /data/VOCdevkit/VOC2007/JPEGImages/005070.jpg 500 352 18 31 128 405 308 +2528 /data/VOCdevkit/VOC2007/JPEGImages/005074.jpg 500 334 3 36 152 387 297 6 343 194 426 240 6 396 201 469 233 6 22 189 83 222 2 419 260 472 297 +2529 /data/VOCdevkit/VOC2007/JPEGImages/005075.jpg 332 500 2 54 60 331 500 +2530 /data/VOCdevkit/VOC2007/JPEGImages/005076.jpg 500 335 0 15 4 500 267 +2531 /data/VOCdevkit/VOC2007/JPEGImages/005080.jpg 500 333 9 71 43 427 309 +2532 /data/VOCdevkit/VOC2007/JPEGImages/005082.jpg 480 360 11 172 185 210 265 17 139 170 274 248 17 1 173 111 287 17 306 181 480 337 +2533 /data/VOCdevkit/VOC2007/JPEGImages/005083.jpg 500 375 6 13 84 493 287 +2534 /data/VOCdevkit/VOC2007/JPEGImages/005087.jpg 500 331 13 178 111 358 290 14 185 35 334 234 +2535 /data/VOCdevkit/VOC2007/JPEGImages/005088.jpg 500 375 14 23 142 102 264 14 93 153 153 213 14 164 153 246 284 15 408 103 493 195 15 40 193 132 301 15 122 198 209 308 14 274 129 354 313 14 287 160 403 339 14 323 132 499 374 17 2 172 284 316 +2536 /data/VOCdevkit/VOC2007/JPEGImages/005089.jpg 500 338 7 44 63 253 228 +2537 /data/VOCdevkit/VOC2007/JPEGImages/005091.jpg 500 333 6 213 125 435 254 6 54 66 199 151 6 247 96 448 171 +2538 /data/VOCdevkit/VOC2007/JPEGImages/005092.jpg 500 332 11 97 90 315 218 15 101 2 313 154 15 285 2 392 175 15 374 58 480 159 15 443 2 500 127 15 367 2 445 69 +2539 /data/VOCdevkit/VOC2007/JPEGImages/005095.jpg 500 333 18 328 231 500 296 +2540 /data/VOCdevkit/VOC2007/JPEGImages/005096.jpg 320 306 4 2 2 163 285 +2541 /data/VOCdevkit/VOC2007/JPEGImages/005098.jpg 375 500 1 10 217 374 500 3 36 107 375 224 +2542 /data/VOCdevkit/VOC2007/JPEGImages/005099.jpg 334 500 6 2 212 326 482 +2543 /data/VOCdevkit/VOC2007/JPEGImages/005100.jpg 500 375 14 171 78 467 375 14 52 83 171 375 +2544 /data/VOCdevkit/VOC2007/JPEGImages/005103.jpg 375 500 14 122 42 287 461 14 308 111 375 359 +2545 /data/VOCdevkit/VOC2007/JPEGImages/005105.jpg 500 375 6 14 125 493 350 6 1 104 103 212 14 96 110 121 184 14 416 131 437 153 14 448 131 477 165 +2546 /data/VOCdevkit/VOC2007/JPEGImages/005106.jpg 500 375 0 124 193 289 245 0 352 219 417 243 +2547 /data/VOCdevkit/VOC2007/JPEGImages/005109.jpg 500 350 7 1 4 465 350 +2548 /data/VOCdevkit/VOC2007/JPEGImages/005112.jpg 500 375 3 103 164 171 192 3 296 183 390 204 3 32 170 81 185 3 369 175 426 190 3 146 266 255 294 +2549 /data/VOCdevkit/VOC2007/JPEGImages/005113.jpg 500 333 2 218 135 316 224 +2550 /data/VOCdevkit/VOC2007/JPEGImages/005115.jpg 500 375 2 111 46 382 375 +2551 /data/VOCdevkit/VOC2007/JPEGImages/005117.jpg 375 500 11 32 258 269 412 14 2 2 375 500 +2552 /data/VOCdevkit/VOC2007/JPEGImages/005118.jpg 500 375 7 3 141 266 375 14 243 103 443 319 14 1 7 499 374 +2553 /data/VOCdevkit/VOC2007/JPEGImages/005119.jpg 500 374 1 125 141 466 374 14 231 19 401 373 +2554 /data/VOCdevkit/VOC2007/JPEGImages/005120.jpg 333 500 1 21 224 333 477 14 41 75 206 298 14 101 5 235 245 +2555 /data/VOCdevkit/VOC2007/JPEGImages/005123.jpg 500 312 18 1 90 495 195 +2556 /data/VOCdevkit/VOC2007/JPEGImages/005125.jpg 500 375 14 435 129 475 195 6 61 54 478 333 +2557 /data/VOCdevkit/VOC2007/JPEGImages/005126.jpg 500 332 6 74 131 261 225 +2558 /data/VOCdevkit/VOC2007/JPEGImages/005127.jpg 500 375 11 186 81 318 304 +2559 /data/VOCdevkit/VOC2007/JPEGImages/005132.jpg 500 332 12 89 81 352 286 14 329 73 394 267 +2560 /data/VOCdevkit/VOC2007/JPEGImages/005133.jpg 500 375 13 220 114 442 269 14 304 93 416 254 +2561 /data/VOCdevkit/VOC2007/JPEGImages/005137.jpg 500 156 16 160 31 203 65 +2562 /data/VOCdevkit/VOC2007/JPEGImages/005139.jpg 500 332 14 358 110 411 248 12 147 121 358 269 +2563 /data/VOCdevkit/VOC2007/JPEGImages/005140.jpg 500 333 10 150 125 474 333 14 351 1 450 135 14 1 4 111 333 +2564 /data/VOCdevkit/VOC2007/JPEGImages/005141.jpg 500 375 9 1 167 179 331 14 235 184 259 238 14 256 184 282 238 +2565 /data/VOCdevkit/VOC2007/JPEGImages/005142.jpg 500 332 6 19 62 456 321 +2566 /data/VOCdevkit/VOC2007/JPEGImages/005147.jpg 500 375 16 378 74 427 111 16 212 143 302 211 16 103 133 183 195 16 2 131 50 187 16 203 125 260 171 16 268 124 305 157 +2567 /data/VOCdevkit/VOC2007/JPEGImages/005148.jpg 500 375 14 231 95 422 375 14 5 114 243 375 14 1 89 129 320 14 348 162 412 278 +2568 /data/VOCdevkit/VOC2007/JPEGImages/005149.jpg 500 333 11 205 1 341 165 11 164 132 500 333 +2569 /data/VOCdevkit/VOC2007/JPEGImages/005151.jpg 500 375 14 317 85 500 328 14 150 89 270 277 14 1 96 140 247 10 1 231 500 375 +2570 /data/VOCdevkit/VOC2007/JPEGImages/005152.jpg 500 375 11 111 14 500 375 14 1 25 376 375 +2571 /data/VOCdevkit/VOC2007/JPEGImages/005154.jpg 500 333 18 2 86 361 261 +2572 /data/VOCdevkit/VOC2007/JPEGImages/005155.jpg 500 375 7 3 3 498 374 +2573 /data/VOCdevkit/VOC2007/JPEGImages/005157.jpg 500 375 6 97 200 290 276 +2574 /data/VOCdevkit/VOC2007/JPEGImages/005158.jpg 500 375 6 19 91 469 314 +2575 /data/VOCdevkit/VOC2007/JPEGImages/005162.jpg 333 500 14 126 170 234 239 +2576 /data/VOCdevkit/VOC2007/JPEGImages/005163.jpg 500 333 13 259 140 298 213 14 245 110 302 187 +2577 /data/VOCdevkit/VOC2007/JPEGImages/005164.jpg 500 374 16 270 158 383 257 16 167 89 226 126 16 78 55 170 111 +2578 /data/VOCdevkit/VOC2007/JPEGImages/005165.jpg 500 375 11 61 71 473 333 +2579 /data/VOCdevkit/VOC2007/JPEGImages/005166.jpg 500 330 6 36 61 395 277 13 1 64 104 168 +2580 /data/VOCdevkit/VOC2007/JPEGImages/005167.jpg 500 375 2 242 169 270 215 +2581 /data/VOCdevkit/VOC2007/JPEGImages/005170.jpg 500 424 14 72 164 121 309 14 130 161 179 305 14 206 150 274 306 14 302 115 374 307 14 371 210 422 270 14 295 158 350 280 +2582 /data/VOCdevkit/VOC2007/JPEGImages/005172.jpg 500 333 18 2 57 500 333 +2583 /data/VOCdevkit/VOC2007/JPEGImages/005174.jpg 500 375 8 349 186 500 375 10 3 128 471 375 +2584 /data/VOCdevkit/VOC2007/JPEGImages/005178.jpg 500 375 19 91 33 482 375 +2585 /data/VOCdevkit/VOC2007/JPEGImages/005180.jpg 375 500 8 169 377 375 500 8 1 301 73 423 15 93 289 189 419 15 84 250 135 319 15 22 246 94 327 +2586 /data/VOCdevkit/VOC2007/JPEGImages/005182.jpg 500 333 12 154 88 369 266 14 202 27 264 208 +2587 /data/VOCdevkit/VOC2007/JPEGImages/005184.jpg 500 375 15 358 178 411 269 8 317 224 396 335 8 179 301 296 375 8 167 262 275 375 14 257 177 348 356 14 294 127 358 312 14 181 178 337 375 +2588 /data/VOCdevkit/VOC2007/JPEGImages/005187.jpg 333 500 19 51 100 298 295 14 62 117 231 253 +2589 /data/VOCdevkit/VOC2007/JPEGImages/005188.jpg 500 368 13 9 19 500 354 +2590 /data/VOCdevkit/VOC2007/JPEGImages/005192.jpg 500 350 6 272 41 500 146 6 54 15 479 310 6 1 39 197 230 +2591 /data/VOCdevkit/VOC2007/JPEGImages/005193.jpg 500 375 11 123 138 500 365 8 58 1 286 196 +2592 /data/VOCdevkit/VOC2007/JPEGImages/005194.jpg 449 500 11 4 17 435 493 +2593 /data/VOCdevkit/VOC2007/JPEGImages/005196.jpg 500 375 15 189 1 317 111 7 12 184 164 297 14 1 26 271 375 14 225 43 500 375 +2594 /data/VOCdevkit/VOC2007/JPEGImages/005197.jpg 500 334 13 7 116 352 307 14 189 70 286 229 14 91 99 207 247 +2595 /data/VOCdevkit/VOC2007/JPEGImages/005198.jpg 500 375 12 278 74 389 225 +2596 /data/VOCdevkit/VOC2007/JPEGImages/005200.jpg 500 357 7 97 12 445 144 +2597 /data/VOCdevkit/VOC2007/JPEGImages/005201.jpg 500 372 7 5 48 467 329 +2598 /data/VOCdevkit/VOC2007/JPEGImages/005204.jpg 500 375 6 145 134 369 218 6 426 139 500 219 +2599 /data/VOCdevkit/VOC2007/JPEGImages/005205.jpg 500 375 14 39 83 126 334 14 111 75 162 238 14 154 65 222 241 14 214 99 277 251 14 270 55 352 249 14 372 47 458 343 14 345 100 423 356 14 281 188 361 361 14 186 194 288 354 14 93 192 192 362 +2600 /data/VOCdevkit/VOC2007/JPEGImages/005206.jpg 500 375 14 214 146 256 298 +2601 /data/VOCdevkit/VOC2007/JPEGImages/005207.jpg 386 500 2 50 104 386 353 +2602 /data/VOCdevkit/VOC2007/JPEGImages/005211.jpg 500 333 1 37 25 463 313 +2603 /data/VOCdevkit/VOC2007/JPEGImages/005213.jpg 500 375 3 26 93 477 364 +2604 /data/VOCdevkit/VOC2007/JPEGImages/005216.jpg 500 372 4 192 48 314 349 +2605 /data/VOCdevkit/VOC2007/JPEGImages/005218.jpg 500 375 8 140 70 401 262 14 114 96 253 357 +2606 /data/VOCdevkit/VOC2007/JPEGImages/005221.jpg 500 375 17 12 98 487 372 +2607 /data/VOCdevkit/VOC2007/JPEGImages/005225.jpg 500 375 11 1 165 344 364 14 1 26 422 364 +2608 /data/VOCdevkit/VOC2007/JPEGImages/005226.jpg 500 375 10 129 287 495 375 14 259 146 450 294 14 34 93 172 357 14 181 107 276 294 14 82 26 166 194 4 330 216 358 303 4 353 194 394 319 +2609 /data/VOCdevkit/VOC2007/JPEGImages/005227.jpg 500 334 14 66 8 346 304 +2610 /data/VOCdevkit/VOC2007/JPEGImages/005228.jpg 500 219 7 295 96 500 219 7 26 81 195 198 +2611 /data/VOCdevkit/VOC2007/JPEGImages/005232.jpg 500 333 14 292 94 404 271 1 238 131 465 291 +2612 /data/VOCdevkit/VOC2007/JPEGImages/005233.jpg 500 375 14 318 146 407 247 14 368 122 498 332 14 1 160 126 362 14 11 133 167 242 14 176 106 220 164 8 377 223 498 373 4 284 205 306 286 4 207 158 223 207 4 233 165 249 211 10 98 196 373 371 +2613 /data/VOCdevkit/VOC2007/JPEGImages/005234.jpg 500 375 0 65 105 500 294 +2614 /data/VOCdevkit/VOC2007/JPEGImages/005235.jpg 288 432 19 110 175 283 364 +2615 /data/VOCdevkit/VOC2007/JPEGImages/005237.jpg 500 312 17 25 15 487 229 14 169 9 307 197 +2616 /data/VOCdevkit/VOC2007/JPEGImages/005238.jpg 500 333 0 12 125 485 231 +2617 /data/VOCdevkit/VOC2007/JPEGImages/005240.jpg 500 376 18 56 82 483 353 14 221 176 245 268 +2618 /data/VOCdevkit/VOC2007/JPEGImages/005241.jpg 500 357 11 102 1 500 349 +2619 /data/VOCdevkit/VOC2007/JPEGImages/005243.jpg 500 334 3 125 11 443 209 +2620 /data/VOCdevkit/VOC2007/JPEGImages/005247.jpg 500 375 2 88 128 416 375 +2621 /data/VOCdevkit/VOC2007/JPEGImages/005249.jpg 375 500 0 8 38 373 437 +2622 /data/VOCdevkit/VOC2007/JPEGImages/005250.jpg 500 370 17 178 25 500 365 19 33 61 214 234 +2623 /data/VOCdevkit/VOC2007/JPEGImages/005251.jpg 500 333 14 262 123 358 333 14 157 128 242 332 18 2 3 497 256 +2624 /data/VOCdevkit/VOC2007/JPEGImages/005252.jpg 333 500 10 18 199 333 500 14 79 33 297 267 14 2 132 218 500 +2625 /data/VOCdevkit/VOC2007/JPEGImages/005255.jpg 500 333 19 1 127 114 242 14 68 160 105 219 14 17 153 69 223 +2626 /data/VOCdevkit/VOC2007/JPEGImages/005256.jpg 500 332 18 30 9 449 332 +2627 /data/VOCdevkit/VOC2007/JPEGImages/005261.jpg 500 375 14 323 182 500 375 14 181 192 341 375 14 88 165 186 268 14 1 145 134 375 14 207 60 342 262 +2628 /data/VOCdevkit/VOC2007/JPEGImages/005265.jpg 500 375 5 20 68 500 298 +2629 /data/VOCdevkit/VOC2007/JPEGImages/005266.jpg 500 375 17 47 195 344 375 8 175 162 257 243 8 296 158 383 248 15 427 28 456 65 +2630 /data/VOCdevkit/VOC2007/JPEGImages/005271.jpg 500 333 5 103 73 375 296 +2631 /data/VOCdevkit/VOC2007/JPEGImages/005272.jpg 500 330 3 332 24 470 203 3 65 3 240 224 +2632 /data/VOCdevkit/VOC2007/JPEGImages/005275.jpg 500 375 6 32 131 478 331 +2633 /data/VOCdevkit/VOC2007/JPEGImages/005276.jpg 500 375 1 15 199 77 340 1 66 223 202 313 1 178 213 327 375 14 171 107 287 375 14 2 110 86 322 14 120 115 189 326 14 82 132 135 326 4 468 276 479 311 +2634 /data/VOCdevkit/VOC2007/JPEGImages/005277.jpg 500 375 11 203 108 309 235 +2635 /data/VOCdevkit/VOC2007/JPEGImages/005279.jpg 330 330 8 28 29 313 302 +2636 /data/VOCdevkit/VOC2007/JPEGImages/005280.jpg 500 333 18 185 116 404 209 +2637 /data/VOCdevkit/VOC2007/JPEGImages/005282.jpg 500 359 2 16 37 489 309 +2638 /data/VOCdevkit/VOC2007/JPEGImages/005284.jpg 500 374 15 323 8 494 359 15 132 188 314 371 15 2 68 158 367 15 153 50 316 268 +2639 /data/VOCdevkit/VOC2007/JPEGImages/005286.jpg 500 375 14 104 65 440 372 8 4 2 433 375 +2640 /data/VOCdevkit/VOC2007/JPEGImages/005287.jpg 500 333 6 119 115 385 309 14 295 90 355 156 +2641 /data/VOCdevkit/VOC2007/JPEGImages/005289.jpg 500 338 2 360 143 435 301 2 103 150 179 307 +2642 /data/VOCdevkit/VOC2007/JPEGImages/005291.jpg 500 375 14 31 13 485 375 14 379 45 430 138 14 462 43 500 123 14 430 43 467 128 +2643 /data/VOCdevkit/VOC2007/JPEGImages/005294.jpg 500 375 4 135 2 483 375 +2644 /data/VOCdevkit/VOC2007/JPEGImages/005295.jpg 500 375 8 298 203 378 326 8 295 186 355 250 14 17 167 162 375 +2645 /data/VOCdevkit/VOC2007/JPEGImages/005296.jpg 500 375 6 170 262 500 374 6 1 258 114 348 +2646 /data/VOCdevkit/VOC2007/JPEGImages/005299.jpg 480 318 12 124 23 449 318 12 1 40 286 318 14 156 1 223 47 +2647 /data/VOCdevkit/VOC2007/JPEGImages/005300.jpg 500 280 7 220 40 347 248 +2648 /data/VOCdevkit/VOC2007/JPEGImages/005301.jpg 331 500 1 53 213 231 461 1 224 224 331 424 14 56 50 233 422 14 229 93 331 326 14 199 72 263 167 14 232 65 283 146 14 286 61 331 105 14 30 73 76 220 +2649 /data/VOCdevkit/VOC2007/JPEGImages/005302.jpg 500 332 8 111 193 137 243 8 142 191 166 240 8 187 191 214 237 +2650 /data/VOCdevkit/VOC2007/JPEGImages/005308.jpg 500 310 11 235 137 334 310 14 35 87 183 302 14 173 29 338 197 14 165 126 257 310 14 337 115 500 310 11 363 196 455 308 +2651 /data/VOCdevkit/VOC2007/JPEGImages/005309.jpg 500 333 7 1 8 464 321 +2652 /data/VOCdevkit/VOC2007/JPEGImages/005313.jpg 500 375 19 298 80 379 159 8 1 124 96 333 +2653 /data/VOCdevkit/VOC2007/JPEGImages/005316.jpg 500 375 6 105 213 500 375 13 133 181 362 298 13 300 177 440 245 13 110 148 280 216 14 55 96 111 252 14 88 90 125 230 +2654 /data/VOCdevkit/VOC2007/JPEGImages/005317.jpg 500 375 7 18 44 500 375 +2655 /data/VOCdevkit/VOC2007/JPEGImages/005321.jpg 500 333 14 2 3 464 331 11 82 68 412 332 +2656 /data/VOCdevkit/VOC2007/JPEGImages/005322.jpg 294 500 14 41 8 273 500 +2657 /data/VOCdevkit/VOC2007/JPEGImages/005323.jpg 500 375 8 231 1 500 373 14 171 44 360 353 +2658 /data/VOCdevkit/VOC2007/JPEGImages/005324.jpg 500 375 16 340 193 468 366 16 75 181 211 309 +2659 /data/VOCdevkit/VOC2007/JPEGImages/005329.jpg 376 500 3 175 124 259 266 3 1 198 158 298 3 142 167 229 252 3 275 220 349 261 +2660 /data/VOCdevkit/VOC2007/JPEGImages/005330.jpg 500 333 18 2 135 379 243 +2661 /data/VOCdevkit/VOC2007/JPEGImages/005332.jpg 500 334 1 224 151 262 194 13 336 126 369 188 +2662 /data/VOCdevkit/VOC2007/JPEGImages/005333.jpg 440 431 6 1 201 151 386 14 139 209 187 332 +2663 /data/VOCdevkit/VOC2007/JPEGImages/005334.jpg 332 500 12 1 128 310 500 +2664 /data/VOCdevkit/VOC2007/JPEGImages/005335.jpg 500 375 9 295 215 435 315 9 207 209 267 280 +2665 /data/VOCdevkit/VOC2007/JPEGImages/005339.jpg 500 400 9 171 34 392 386 9 393 64 492 239 9 120 19 226 238 9 1 31 184 316 +2666 /data/VOCdevkit/VOC2007/JPEGImages/005341.jpg 500 316 14 312 101 500 316 +2667 /data/VOCdevkit/VOC2007/JPEGImages/005342.jpg 500 312 14 231 28 420 218 12 221 115 482 312 12 139 151 283 307 12 47 147 152 289 +2668 /data/VOCdevkit/VOC2007/JPEGImages/005347.jpg 500 313 13 276 199 450 313 13 282 169 335 254 14 60 74 167 313 14 320 138 353 205 14 348 154 381 204 +2669 /data/VOCdevkit/VOC2007/JPEGImages/005353.jpg 500 333 17 1 98 500 300 +2670 /data/VOCdevkit/VOC2007/JPEGImages/005354.jpg 500 375 13 230 114 330 221 13 5 98 222 375 14 361 115 437 265 14 1 89 38 184 +2671 /data/VOCdevkit/VOC2007/JPEGImages/005356.jpg 500 375 14 1 1 500 375 7 75 181 245 375 +2672 /data/VOCdevkit/VOC2007/JPEGImages/005357.jpg 500 375 14 298 131 343 268 6 1 206 407 375 +2673 /data/VOCdevkit/VOC2007/JPEGImages/005359.jpg 370 500 18 1 66 343 415 +2674 /data/VOCdevkit/VOC2007/JPEGImages/005361.jpg 500 500 11 1 98 457 487 +2675 /data/VOCdevkit/VOC2007/JPEGImages/005362.jpg 347 500 8 180 230 226 289 8 133 227 179 291 8 84 226 135 283 8 276 230 315 291 8 328 230 347 281 +2676 /data/VOCdevkit/VOC2007/JPEGImages/005364.jpg 334 500 2 91 18 297 500 +2677 /data/VOCdevkit/VOC2007/JPEGImages/005366.jpg 500 375 14 51 54 420 375 14 25 2 204 375 +2678 /data/VOCdevkit/VOC2007/JPEGImages/005372.jpg 500 401 6 16 130 369 340 +2679 /data/VOCdevkit/VOC2007/JPEGImages/005375.jpg 500 375 19 361 199 459 268 14 227 159 351 300 +2680 /data/VOCdevkit/VOC2007/JPEGImages/005376.jpg 500 334 0 172 205 378 258 +2681 /data/VOCdevkit/VOC2007/JPEGImages/005377.jpg 500 375 14 1 26 171 276 14 329 1 408 66 14 282 49 500 375 10 1 225 443 375 +2682 /data/VOCdevkit/VOC2007/JPEGImages/005381.jpg 329 500 5 22 291 255 497 +2683 /data/VOCdevkit/VOC2007/JPEGImages/005382.jpg 500 375 3 210 128 236 197 +2684 /data/VOCdevkit/VOC2007/JPEGImages/005386.jpg 500 375 14 97 1 422 343 +2685 /data/VOCdevkit/VOC2007/JPEGImages/005390.jpg 500 394 18 134 217 403 329 +2686 /data/VOCdevkit/VOC2007/JPEGImages/005392.jpg 500 333 0 34 49 500 234 14 191 103 222 170 14 289 152 340 333 14 222 150 295 332 +2687 /data/VOCdevkit/VOC2007/JPEGImages/005394.jpg 375 500 11 61 82 356 500 +2688 /data/VOCdevkit/VOC2007/JPEGImages/005399.jpg 500 333 14 94 128 266 333 14 250 64 500 333 +2689 /data/VOCdevkit/VOC2007/JPEGImages/005400.jpg 500 375 17 1 41 500 375 11 111 79 414 375 +2690 /data/VOCdevkit/VOC2007/JPEGImages/005401.jpg 500 333 6 48 79 384 317 +2691 /data/VOCdevkit/VOC2007/JPEGImages/005402.jpg 500 334 0 61 127 309 287 +2692 /data/VOCdevkit/VOC2007/JPEGImages/005403.jpg 500 375 2 134 121 283 191 +2693 /data/VOCdevkit/VOC2007/JPEGImages/005409.jpg 500 334 12 2 1 291 331 14 255 77 463 334 +2694 /data/VOCdevkit/VOC2007/JPEGImages/005411.jpg 375 500 19 22 54 137 142 14 77 8 325 497 +2695 /data/VOCdevkit/VOC2007/JPEGImages/005412.jpg 500 375 14 2 192 51 298 14 63 166 116 254 14 110 195 146 252 14 135 184 192 353 14 229 156 261 236 14 256 167 283 235 14 240 237 286 307 14 316 209 361 260 14 308 220 362 340 14 368 158 416 326 14 415 169 436 223 14 433 164 460 219 8 97 253 198 375 8 233 264 284 354 8 309 262 386 351 +2696 /data/VOCdevkit/VOC2007/JPEGImages/005415.jpg 500 375 7 413 234 465 293 7 331 244 415 294 7 358 228 428 280 14 355 66 418 234 14 206 82 265 246 14 63 61 138 276 +2697 /data/VOCdevkit/VOC2007/JPEGImages/005422.jpg 500 335 18 48 96 333 242 +2698 /data/VOCdevkit/VOC2007/JPEGImages/005425.jpg 333 500 14 93 94 181 422 14 160 54 259 443 +2699 /data/VOCdevkit/VOC2007/JPEGImages/005426.jpg 500 333 11 227 29 335 244 +2700 /data/VOCdevkit/VOC2007/JPEGImages/005427.jpg 500 375 3 86 147 397 249 +2701 /data/VOCdevkit/VOC2007/JPEGImages/005428.jpg 375 500 4 1 1 217 362 +2702 /data/VOCdevkit/VOC2007/JPEGImages/005432.jpg 500 375 6 24 13 476 360 +2703 /data/VOCdevkit/VOC2007/JPEGImages/005435.jpg 375 500 13 114 220 375 425 +2704 /data/VOCdevkit/VOC2007/JPEGImages/005437.jpg 500 375 6 2 115 499 340 +2705 /data/VOCdevkit/VOC2007/JPEGImages/005442.jpg 500 375 4 429 122 472 232 14 204 103 447 375 14 17 125 293 375 14 383 2 500 359 14 342 2 435 119 14 127 1 254 135 14 31 2 238 241 14 239 1 272 110 +2706 /data/VOCdevkit/VOC2007/JPEGImages/005443.jpg 330 500 6 11 259 319 486 +2707 /data/VOCdevkit/VOC2007/JPEGImages/005444.jpg 500 375 7 109 88 394 375 +2708 /data/VOCdevkit/VOC2007/JPEGImages/005446.jpg 333 500 11 101 1 252 226 +2709 /data/VOCdevkit/VOC2007/JPEGImages/005447.jpg 500 375 17 94 158 416 292 14 177 121 263 323 14 284 128 376 305 6 255 117 292 147 6 360 124 390 153 6 338 126 366 149 +2710 /data/VOCdevkit/VOC2007/JPEGImages/005449.jpg 470 314 14 2 30 341 313 +2711 /data/VOCdevkit/VOC2007/JPEGImages/005452.jpg 500 333 7 174 121 349 216 +2712 /data/VOCdevkit/VOC2007/JPEGImages/005456.jpg 320 213 12 263 91 320 201 12 110 29 212 213 14 116 14 179 126 +2713 /data/VOCdevkit/VOC2007/JPEGImages/005458.jpg 500 346 0 156 136 371 192 0 27 138 473 321 +2714 /data/VOCdevkit/VOC2007/JPEGImages/005459.jpg 333 500 14 124 211 213 500 14 9 212 138 500 14 84 295 146 386 14 169 210 323 500 +2715 /data/VOCdevkit/VOC2007/JPEGImages/005460.jpg 500 402 7 40 4 484 370 +2716 /data/VOCdevkit/VOC2007/JPEGImages/005462.jpg 343 500 7 1 33 320 440 +2717 /data/VOCdevkit/VOC2007/JPEGImages/005463.jpg 500 316 18 2 36 487 267 +2718 /data/VOCdevkit/VOC2007/JPEGImages/005464.jpg 333 500 10 2 137 333 500 14 178 49 205 92 +2719 /data/VOCdevkit/VOC2007/JPEGImages/005466.jpg 500 333 14 151 227 180 300 14 121 255 156 301 +2720 /data/VOCdevkit/VOC2007/JPEGImages/005468.jpg 500 457 13 16 37 472 457 14 199 13 386 438 6 380 107 500 232 6 3 98 153 204 +2721 /data/VOCdevkit/VOC2007/JPEGImages/005472.jpg 500 375 2 129 165 360 297 +2722 /data/VOCdevkit/VOC2007/JPEGImages/005473.jpg 500 346 14 127 161 167 218 17 44 173 143 227 +2723 /data/VOCdevkit/VOC2007/JPEGImages/005474.jpg 500 375 7 6 8 351 292 +2724 /data/VOCdevkit/VOC2007/JPEGImages/005476.jpg 375 500 11 93 106 375 500 +2725 /data/VOCdevkit/VOC2007/JPEGImages/005477.jpg 500 375 14 177 50 369 375 14 55 46 148 375 14 1 61 63 375 14 16 49 66 124 14 119 55 163 153 14 23 29 82 107 +2726 /data/VOCdevkit/VOC2007/JPEGImages/005479.jpg 500 331 14 133 19 337 287 13 105 74 331 293 +2727 /data/VOCdevkit/VOC2007/JPEGImages/005480.jpg 500 416 1 125 148 362 405 +2728 /data/VOCdevkit/VOC2007/JPEGImages/005482.jpg 500 221 11 1 42 307 182 14 269 1 500 179 +2729 /data/VOCdevkit/VOC2007/JPEGImages/005484.jpg 500 375 5 140 64 324 270 6 402 185 457 209 +2730 /data/VOCdevkit/VOC2007/JPEGImages/005488.jpg 500 333 14 269 118 500 333 14 34 47 270 333 +2731 /data/VOCdevkit/VOC2007/JPEGImages/005490.jpg 500 333 14 109 47 266 277 +2732 /data/VOCdevkit/VOC2007/JPEGImages/005491.jpg 500 375 4 278 162 356 375 14 181 87 440 321 +2733 /data/VOCdevkit/VOC2007/JPEGImages/005492.jpg 500 332 13 176 26 334 306 +2734 /data/VOCdevkit/VOC2007/JPEGImages/005493.jpg 500 333 6 40 47 483 248 +2735 /data/VOCdevkit/VOC2007/JPEGImages/005494.jpg 375 500 14 117 4 273 473 15 54 169 133 334 +2736 /data/VOCdevkit/VOC2007/JPEGImages/005495.jpg 476 500 2 135 66 336 436 +2737 /data/VOCdevkit/VOC2007/JPEGImages/005498.jpg 500 375 8 415 169 500 303 8 2 245 189 375 17 87 176 368 310 +2738 /data/VOCdevkit/VOC2007/JPEGImages/005500.jpg 500 374 14 266 94 500 374 14 39 94 281 352 +2739 /data/VOCdevkit/VOC2007/JPEGImages/005501.jpg 500 375 6 26 54 452 330 +2740 /data/VOCdevkit/VOC2007/JPEGImages/005502.jpg 500 375 2 182 127 238 295 2 224 129 270 295 2 248 138 315 325 +2741 /data/VOCdevkit/VOC2007/JPEGImages/005503.jpg 500 375 1 72 60 489 324 1 359 50 490 290 +2742 /data/VOCdevkit/VOC2007/JPEGImages/005504.jpg 500 333 18 1 160 500 315 +2743 /data/VOCdevkit/VOC2007/JPEGImages/005505.jpg 500 325 12 46 57 496 325 14 35 139 155 325 +2744 /data/VOCdevkit/VOC2007/JPEGImages/005506.jpg 500 331 13 97 96 360 270 14 169 50 348 258 14 276 3 371 142 13 93 15 167 79 +2745 /data/VOCdevkit/VOC2007/JPEGImages/005512.jpg 500 333 11 213 14 496 167 11 26 19 312 333 +2746 /data/VOCdevkit/VOC2007/JPEGImages/005513.jpg 320 212 12 72 48 300 212 14 132 1 304 211 +2747 /data/VOCdevkit/VOC2007/JPEGImages/005516.jpg 500 375 1 33 30 449 340 +2748 /data/VOCdevkit/VOC2007/JPEGImages/005520.jpg 334 500 6 2 32 299 434 6 280 1 318 22 6 226 1 270 22 6 137 3 183 23 6 182 1 228 23 6 92 3 137 25 6 55 6 97 26 6 20 8 56 29 +2749 /data/VOCdevkit/VOC2007/JPEGImages/005523.jpg 500 375 6 1 4 493 340 14 409 22 443 124 14 455 22 500 184 14 197 25 241 81 14 165 25 204 91 14 119 26 152 64 +2750 /data/VOCdevkit/VOC2007/JPEGImages/005525.jpg 500 375 15 169 6 500 344 +2751 /data/VOCdevkit/VOC2007/JPEGImages/005528.jpg 500 399 11 167 32 468 366 +2752 /data/VOCdevkit/VOC2007/JPEGImages/005529.jpg 500 375 12 250 137 357 187 +2753 /data/VOCdevkit/VOC2007/JPEGImages/005532.jpg 500 375 2 148 199 299 279 2 311 146 372 227 2 1 123 16 171 2 240 117 294 181 2 185 142 237 213 2 254 99 278 115 +2754 /data/VOCdevkit/VOC2007/JPEGImages/005533.jpg 332 500 14 113 193 176 348 14 158 178 214 344 14 260 196 303 286 14 262 206 332 302 14 34 216 82 301 14 2 216 26 268 +2755 /data/VOCdevkit/VOC2007/JPEGImages/005534.jpg 500 332 13 93 23 427 327 +2756 /data/VOCdevkit/VOC2007/JPEGImages/005537.jpg 500 333 0 50 137 387 290 +2757 /data/VOCdevkit/VOC2007/JPEGImages/005538.jpg 335 500 7 115 174 278 274 7 45 280 163 416 +2758 /data/VOCdevkit/VOC2007/JPEGImages/005540.jpg 500 333 1 29 148 241 284 1 253 122 479 259 1 235 142 465 273 1 156 121 380 254 +2759 /data/VOCdevkit/VOC2007/JPEGImages/005543.jpg 500 375 7 207 124 316 358 +2760 /data/VOCdevkit/VOC2007/JPEGImages/005545.jpg 334 500 19 43 177 84 243 8 46 247 83 396 +2761 /data/VOCdevkit/VOC2007/JPEGImages/005546.jpg 333 500 14 77 320 94 367 14 47 321 67 367 14 136 194 220 334 14 102 236 250 500 6 220 319 333 438 6 264 326 333 496 +2762 /data/VOCdevkit/VOC2007/JPEGImages/005548.jpg 333 500 14 2 202 86 500 14 262 153 333 500 14 29 72 333 500 +2763 /data/VOCdevkit/VOC2007/JPEGImages/005551.jpg 500 375 17 264 165 500 308 +2764 /data/VOCdevkit/VOC2007/JPEGImages/005553.jpg 415 500 13 56 105 355 432 14 109 33 314 375 +2765 /data/VOCdevkit/VOC2007/JPEGImages/005555.jpg 500 375 8 127 46 480 375 8 323 1 500 181 +2766 /data/VOCdevkit/VOC2007/JPEGImages/005556.jpg 500 333 14 240 69 379 333 14 114 42 257 333 +2767 /data/VOCdevkit/VOC2007/JPEGImages/005557.jpg 333 500 11 61 139 261 431 +2768 /data/VOCdevkit/VOC2007/JPEGImages/005558.jpg 500 333 6 100 9 469 321 14 5 1 99 180 +2769 /data/VOCdevkit/VOC2007/JPEGImages/005560.jpg 500 375 1 141 160 407 348 14 184 54 296 278 +2770 /data/VOCdevkit/VOC2007/JPEGImages/005561.jpg 375 500 1 131 226 340 448 14 192 154 256 422 18 1 1 374 500 +2771 /data/VOCdevkit/VOC2007/JPEGImages/005562.jpg 500 375 7 2 1 465 372 +2772 /data/VOCdevkit/VOC2007/JPEGImages/005564.jpg 333 500 12 20 40 213 387 +2773 /data/VOCdevkit/VOC2007/JPEGImages/005565.jpg 375 500 19 119 255 206 337 +2774 /data/VOCdevkit/VOC2007/JPEGImages/005567.jpg 500 375 15 175 214 306 366 15 161 145 302 223 15 3 2 83 139 +2775 /data/VOCdevkit/VOC2007/JPEGImages/005569.jpg 413 500 18 69 224 413 359 +2776 /data/VOCdevkit/VOC2007/JPEGImages/005570.jpg 500 375 4 316 173 351 299 14 291 41 500 375 14 1 30 295 375 14 321 81 366 128 14 1 64 61 193 14 47 75 99 146 14 85 78 132 141 14 137 77 171 133 14 298 68 331 121 +2777 /data/VOCdevkit/VOC2007/JPEGImages/005571.jpg 500 334 13 22 74 454 311 +2778 /data/VOCdevkit/VOC2007/JPEGImages/005572.jpg 500 435 12 133 78 460 433 +2779 /data/VOCdevkit/VOC2007/JPEGImages/005575.jpg 500 378 0 6 108 496 277 +2780 /data/VOCdevkit/VOC2007/JPEGImages/005578.jpg 500 375 16 195 182 231 248 16 116 125 227 266 +2781 /data/VOCdevkit/VOC2007/JPEGImages/005580.jpg 500 375 7 44 46 389 374 +2782 /data/VOCdevkit/VOC2007/JPEGImages/005581.jpg 278 500 7 98 173 140 227 7 184 157 236 223 +2783 /data/VOCdevkit/VOC2007/JPEGImages/005587.jpg 500 375 19 244 113 332 208 +2784 /data/VOCdevkit/VOC2007/JPEGImages/005589.jpg 500 281 8 388 72 458 201 8 327 102 419 252 19 324 50 372 109 +2785 /data/VOCdevkit/VOC2007/JPEGImages/005594.jpg 407 500 14 11 33 391 459 +2786 /data/VOCdevkit/VOC2007/JPEGImages/005595.jpg 500 413 13 10 51 500 413 14 122 19 373 412 +2787 /data/VOCdevkit/VOC2007/JPEGImages/005596.jpg 375 500 14 180 75 248 163 14 90 82 126 199 14 4 73 107 456 14 102 174 279 397 14 174 157 213 209 14 203 146 268 249 8 94 293 221 488 +2788 /data/VOCdevkit/VOC2007/JPEGImages/005597.jpg 500 375 8 1 231 132 375 8 362 172 407 306 8 338 179 379 333 8 271 188 354 368 8 163 202 295 375 10 21 185 408 375 +2789 /data/VOCdevkit/VOC2007/JPEGImages/005598.jpg 500 375 5 58 34 420 252 +2790 /data/VOCdevkit/VOC2007/JPEGImages/005602.jpg 500 329 11 131 105 389 271 11 362 152 444 207 +2791 /data/VOCdevkit/VOC2007/JPEGImages/005604.jpg 375 500 3 41 312 106 415 3 285 414 375 455 3 1 1 319 465 +2792 /data/VOCdevkit/VOC2007/JPEGImages/005607.jpg 500 375 7 174 121 344 263 +2793 /data/VOCdevkit/VOC2007/JPEGImages/005610.jpg 402 480 12 58 126 343 390 14 143 66 280 252 +2794 /data/VOCdevkit/VOC2007/JPEGImages/005612.jpg 270 360 14 113 4 270 244 14 1 30 153 312 14 235 59 270 113 14 93 101 111 119 +2795 /data/VOCdevkit/VOC2007/JPEGImages/005616.jpg 500 214 3 36 78 401 175 3 394 94 500 146 +2796 /data/VOCdevkit/VOC2007/JPEGImages/005617.jpg 500 375 9 199 142 346 270 14 66 71 160 267 +2797 /data/VOCdevkit/VOC2007/JPEGImages/005619.jpg 500 375 1 1 1 500 375 +2798 /data/VOCdevkit/VOC2007/JPEGImages/005621.jpg 500 411 7 138 125 355 314 7 338 155 415 259 +2799 /data/VOCdevkit/VOC2007/JPEGImages/005622.jpg 500 371 10 87 195 481 371 14 1 138 148 371 14 68 137 121 220 14 162 99 240 213 14 233 126 318 218 14 238 112 364 234 14 334 118 401 263 14 350 147 500 371 4 220 216 248 291 14 464 104 500 146 14 422 96 461 142 +2800 /data/VOCdevkit/VOC2007/JPEGImages/005623.jpg 500 403 8 378 1 496 119 +2801 /data/VOCdevkit/VOC2007/JPEGImages/005626.jpg 500 339 18 15 35 500 306 +2802 /data/VOCdevkit/VOC2007/JPEGImages/005627.jpg 500 280 6 270 95 493 215 6 101 87 351 192 6 12 82 178 168 6 281 74 358 114 8 166 178 256 270 +2803 /data/VOCdevkit/VOC2007/JPEGImages/005628.jpg 500 375 10 1 46 500 375 +2804 /data/VOCdevkit/VOC2007/JPEGImages/005632.jpg 370 278 1 2 64 297 278 +2805 /data/VOCdevkit/VOC2007/JPEGImages/005633.jpg 500 333 0 15 80 306 142 0 26 49 486 212 +2806 /data/VOCdevkit/VOC2007/JPEGImages/005634.jpg 500 333 14 273 54 435 307 +2807 /data/VOCdevkit/VOC2007/JPEGImages/005635.jpg 500 375 4 1 107 144 375 4 122 185 199 375 4 185 195 311 375 4 105 81 206 220 4 201 60 303 274 4 284 58 362 269 +2808 /data/VOCdevkit/VOC2007/JPEGImages/005638.jpg 500 333 14 73 89 362 333 6 164 181 500 333 +2809 /data/VOCdevkit/VOC2007/JPEGImages/005642.jpg 500 375 1 163 69 371 293 +2810 /data/VOCdevkit/VOC2007/JPEGImages/005643.jpg 500 333 18 2 99 474 305 +2811 /data/VOCdevkit/VOC2007/JPEGImages/005646.jpg 500 375 7 1 165 166 250 7 193 165 331 234 7 361 181 500 238 +2812 /data/VOCdevkit/VOC2007/JPEGImages/005649.jpg 500 375 6 90 124 430 313 +2813 /data/VOCdevkit/VOC2007/JPEGImages/005650.jpg 500 375 14 86 67 389 375 +2814 /data/VOCdevkit/VOC2007/JPEGImages/005651.jpg 500 367 11 231 82 382 275 +2815 /data/VOCdevkit/VOC2007/JPEGImages/005656.jpg 500 335 14 117 218 395 334 14 295 90 438 335 14 210 93 301 217 14 224 74 305 218 14 179 92 227 177 14 81 109 143 262 14 24 75 101 261 +2816 /data/VOCdevkit/VOC2007/JPEGImages/005659.jpg 500 333 18 71 166 192 209 18 1 142 79 233 18 186 60 500 260 +2817 /data/VOCdevkit/VOC2007/JPEGImages/005661.jpg 500 375 10 4 206 318 375 8 159 248 270 375 8 12 250 150 375 +2818 /data/VOCdevkit/VOC2007/JPEGImages/005663.jpg 500 335 5 1 155 75 196 6 259 307 363 335 6 40 179 79 198 +2819 /data/VOCdevkit/VOC2007/JPEGImages/005665.jpg 500 333 8 235 192 317 305 8 75 152 169 268 8 42 99 112 198 8 96 65 158 147 8 206 55 251 130 8 377 163 479 277 8 409 109 486 203 8 376 30 412 89 8 334 29 371 82 8 288 41 325 97 8 429 33 484 96 8 234 29 273 77 8 323 68 382 147 +2820 /data/VOCdevkit/VOC2007/JPEGImages/005666.jpg 265 500 14 193 400 239 500 14 85 405 137 500 14 37 409 87 500 +2821 /data/VOCdevkit/VOC2007/JPEGImages/005667.jpg 500 333 2 69 183 483 298 2 252 105 330 143 +2822 /data/VOCdevkit/VOC2007/JPEGImages/005670.jpg 500 375 5 67 84 464 304 14 12 203 59 279 3 44 220 117 274 3 113 201 224 266 3 373 241 500 297 +2823 /data/VOCdevkit/VOC2007/JPEGImages/005671.jpg 500 375 11 1 42 471 375 +2824 /data/VOCdevkit/VOC2007/JPEGImages/005673.jpg 500 375 15 22 94 125 188 15 24 200 128 291 15 132 103 229 195 15 132 199 229 294 15 246 101 341 195 15 250 206 348 301 15 364 107 453 198 15 367 198 458 287 +2825 /data/VOCdevkit/VOC2007/JPEGImages/005675.jpg 358 500 14 1 1 210 402 14 70 1 358 336 +2826 /data/VOCdevkit/VOC2007/JPEGImages/005677.jpg 500 357 12 116 66 355 357 12 80 271 118 357 14 104 274 134 357 14 202 77 315 357 +2827 /data/VOCdevkit/VOC2007/JPEGImages/005678.jpg 500 375 13 43 59 475 314 6 168 1 500 163 +2828 /data/VOCdevkit/VOC2007/JPEGImages/005681.jpg 472 382 2 18 42 469 346 +2829 /data/VOCdevkit/VOC2007/JPEGImages/005683.jpg 500 375 1 59 1 500 316 +2830 /data/VOCdevkit/VOC2007/JPEGImages/005684.jpg 300 400 11 74 247 186 291 +2831 /data/VOCdevkit/VOC2007/JPEGImages/005688.jpg 500 334 7 170 44 459 251 7 72 123 387 334 +2832 /data/VOCdevkit/VOC2007/JPEGImages/005689.jpg 500 375 18 1 17 480 372 +2833 /data/VOCdevkit/VOC2007/JPEGImages/005690.jpg 500 317 18 2 119 443 207 +2834 /data/VOCdevkit/VOC2007/JPEGImages/005691.jpg 220 500 14 3 1 218 500 +2835 /data/VOCdevkit/VOC2007/JPEGImages/005692.jpg 500 333 11 83 40 454 262 +2836 /data/VOCdevkit/VOC2007/JPEGImages/005694.jpg 500 375 6 24 81 434 352 +2837 /data/VOCdevkit/VOC2007/JPEGImages/005698.jpg 500 375 14 1 2 118 189 14 1 89 155 301 14 331 110 500 325 14 153 85 344 290 14 89 16 208 212 14 418 1 485 102 +2838 /data/VOCdevkit/VOC2007/JPEGImages/005703.jpg 375 500 8 76 108 374 483 11 134 146 238 275 15 1 161 120 330 14 70 12 335 500 +2839 /data/VOCdevkit/VOC2007/JPEGImages/005706.jpg 500 375 6 43 200 463 341 +2840 /data/VOCdevkit/VOC2007/JPEGImages/005707.jpg 500 375 13 401 203 466 246 +2841 /data/VOCdevkit/VOC2007/JPEGImages/005708.jpg 500 375 13 394 94 500 259 14 278 33 373 358 14 334 42 412 310 14 3 25 134 358 14 217 38 309 288 6 121 101 161 130 +2842 /data/VOCdevkit/VOC2007/JPEGImages/005709.jpg 500 334 14 154 54 293 257 1 76 130 313 287 +2843 /data/VOCdevkit/VOC2007/JPEGImages/005711.jpg 500 375 9 135 146 210 194 9 199 166 380 327 9 151 156 330 226 +2844 /data/VOCdevkit/VOC2007/JPEGImages/005712.jpg 500 333 11 4 18 373 298 14 206 1 500 248 +2845 /data/VOCdevkit/VOC2007/JPEGImages/005717.jpg 500 375 6 53 45 160 87 6 170 52 235 70 6 320 52 390 85 6 1 71 65 151 14 153 96 266 217 14 307 161 376 220 14 290 178 497 375 14 190 270 298 375 14 1 95 178 375 10 110 209 358 346 +2846 /data/VOCdevkit/VOC2007/JPEGImages/005720.jpg 332 500 3 26 1 310 471 14 53 350 126 447 +2847 /data/VOCdevkit/VOC2007/JPEGImages/005721.jpg 500 375 4 331 260 348 322 4 206 228 226 304 17 5 149 488 375 14 104 146 395 375 14 250 139 500 344 +2848 /data/VOCdevkit/VOC2007/JPEGImages/005722.jpg 500 375 12 45 149 391 375 14 206 118 297 374 +2849 /data/VOCdevkit/VOC2007/JPEGImages/005724.jpg 333 500 13 56 206 309 500 14 82 76 284 289 +2850 /data/VOCdevkit/VOC2007/JPEGImages/005725.jpg 375 500 14 1 71 291 500 14 32 98 156 311 8 57 178 184 326 8 52 200 336 500 +2851 /data/VOCdevkit/VOC2007/JPEGImages/005726.jpg 375 500 10 2 39 374 500 +2852 /data/VOCdevkit/VOC2007/JPEGImages/005727.jpg 500 375 17 124 158 437 333 +2853 /data/VOCdevkit/VOC2007/JPEGImages/005733.jpg 500 332 14 257 38 331 215 12 178 92 426 264 +2854 /data/VOCdevkit/VOC2007/JPEGImages/005734.jpg 500 375 8 52 184 134 306 8 197 238 334 374 +2855 /data/VOCdevkit/VOC2007/JPEGImages/005737.jpg 500 375 5 2 2 483 288 +2856 /data/VOCdevkit/VOC2007/JPEGImages/005739.jpg 500 375 5 5 16 456 373 14 297 123 336 187 +2857 /data/VOCdevkit/VOC2007/JPEGImages/005744.jpg 375 500 11 205 221 305 499 +2858 /data/VOCdevkit/VOC2007/JPEGImages/005745.jpg 366 500 14 63 12 366 462 14 1 23 183 433 +2859 /data/VOCdevkit/VOC2007/JPEGImages/005746.jpg 500 375 5 261 69 500 234 14 203 118 340 351 14 1 180 23 306 6 14 192 178 280 +2860 /data/VOCdevkit/VOC2007/JPEGImages/005748.jpg 500 375 14 336 1 463 201 14 128 66 414 375 +2861 /data/VOCdevkit/VOC2007/JPEGImages/005750.jpg 500 375 1 282 175 330 251 14 286 132 330 235 +2862 /data/VOCdevkit/VOC2007/JPEGImages/005751.jpg 500 333 18 220 121 323 213 +2863 /data/VOCdevkit/VOC2007/JPEGImages/005753.jpg 500 379 19 428 64 499 243 19 373 79 436 226 14 45 59 235 372 19 3 128 50 190 +2864 /data/VOCdevkit/VOC2007/JPEGImages/005754.jpg 500 375 17 8 201 180 372 8 195 189 278 298 14 408 198 455 276 14 464 174 500 280 15 196 223 214 266 19 295 146 366 203 +2865 /data/VOCdevkit/VOC2007/JPEGImages/005758.jpg 500 375 10 5 75 500 375 14 152 2 488 140 +2866 /data/VOCdevkit/VOC2007/JPEGImages/005759.jpg 500 375 13 348 180 461 245 13 217 180 305 239 13 130 183 206 232 13 51 184 113 234 14 187 155 213 214 +2867 /data/VOCdevkit/VOC2007/JPEGImages/005763.jpg 500 333 14 101 135 148 175 14 182 148 224 172 6 66 130 299 258 +2868 /data/VOCdevkit/VOC2007/JPEGImages/005766.jpg 500 375 14 190 92 252 202 14 356 87 404 173 14 350 94 464 216 8 14 140 102 261 8 459 138 500 259 8 387 146 462 261 +2869 /data/VOCdevkit/VOC2007/JPEGImages/005767.jpg 500 375 8 407 114 461 195 17 100 152 341 338 +2870 /data/VOCdevkit/VOC2007/JPEGImages/005770.jpg 500 333 6 102 98 484 256 +2871 /data/VOCdevkit/VOC2007/JPEGImages/005771.jpg 500 357 3 191 101 207 127 3 334 109 380 155 3 235 195 276 219 3 216 219 270 247 +2872 /data/VOCdevkit/VOC2007/JPEGImages/005772.jpg 375 500 2 86 135 264 394 +2873 /data/VOCdevkit/VOC2007/JPEGImages/005774.jpg 500 489 13 19 69 433 478 14 131 22 305 414 +2874 /data/VOCdevkit/VOC2007/JPEGImages/005775.jpg 500 333 6 53 90 302 280 14 118 128 178 172 +2875 /data/VOCdevkit/VOC2007/JPEGImages/005776.jpg 500 375 11 30 57 421 375 +2876 /data/VOCdevkit/VOC2007/JPEGImages/005777.jpg 500 333 1 128 192 500 333 1 1 167 203 331 14 185 1 470 333 14 3 34 183 331 +2877 /data/VOCdevkit/VOC2007/JPEGImages/005778.jpg 500 375 14 319 109 500 375 14 219 149 366 375 14 94 112 258 375 14 1 125 139 375 17 2 117 500 375 +2878 /data/VOCdevkit/VOC2007/JPEGImages/005785.jpg 500 375 11 172 114 331 251 +2879 /data/VOCdevkit/VOC2007/JPEGImages/005787.jpg 375 500 13 3 168 319 457 +2880 /data/VOCdevkit/VOC2007/JPEGImages/005792.jpg 500 333 14 217 83 458 333 14 6 22 323 333 +2881 /data/VOCdevkit/VOC2007/JPEGImages/005793.jpg 448 336 6 24 61 438 305 +2882 /data/VOCdevkit/VOC2007/JPEGImages/005795.jpg 500 500 16 2 32 487 500 +2883 /data/VOCdevkit/VOC2007/JPEGImages/005797.jpg 500 375 9 1 107 270 365 14 320 125 493 340 14 93 3 163 143 +2884 /data/VOCdevkit/VOC2007/JPEGImages/005798.jpg 500 195 14 43 1 131 149 14 367 4 475 174 14 273 12 357 145 14 164 2 253 130 13 32 51 135 149 13 164 55 270 164 13 352 55 465 173 13 254 56 368 169 +2885 /data/VOCdevkit/VOC2007/JPEGImages/005800.jpg 500 375 14 23 3 465 375 +2886 /data/VOCdevkit/VOC2007/JPEGImages/005801.jpg 500 375 17 15 65 478 371 +2887 /data/VOCdevkit/VOC2007/JPEGImages/005802.jpg 500 430 2 94 54 378 306 +2888 /data/VOCdevkit/VOC2007/JPEGImages/005804.jpg 500 352 17 223 178 444 350 15 384 2 500 352 15 2 91 58 177 15 134 89 185 171 15 61 130 81 175 +2889 /data/VOCdevkit/VOC2007/JPEGImages/005807.jpg 500 332 19 300 205 395 278 +2890 /data/VOCdevkit/VOC2007/JPEGImages/005808.jpg 500 375 19 369 174 500 281 14 252 100 431 375 14 27 117 316 375 +2891 /data/VOCdevkit/VOC2007/JPEGImages/005809.jpg 500 375 6 457 203 500 251 6 44 207 110 247 6 455 197 500 210 5 121 95 438 262 14 118 185 157 319 14 4 199 31 273 +2892 /data/VOCdevkit/VOC2007/JPEGImages/005810.jpg 500 375 11 91 33 500 279 +2893 /data/VOCdevkit/VOC2007/JPEGImages/005816.jpg 500 443 13 107 123 417 347 14 185 73 352 324 +2894 /data/VOCdevkit/VOC2007/JPEGImages/005820.jpg 500 310 7 7 16 500 310 +2895 /data/VOCdevkit/VOC2007/JPEGImages/005822.jpg 491 500 14 161 200 422 500 12 80 19 491 500 +2896 /data/VOCdevkit/VOC2007/JPEGImages/005823.jpg 375 500 19 91 163 255 280 14 1 8 155 500 14 137 344 308 500 14 238 108 372 415 +2897 /data/VOCdevkit/VOC2007/JPEGImages/005827.jpg 500 375 19 351 65 450 161 8 18 107 231 344 +2898 /data/VOCdevkit/VOC2007/JPEGImages/005832.jpg 500 375 7 2 130 231 274 7 208 146 342 252 +2899 /data/VOCdevkit/VOC2007/JPEGImages/005833.jpg 500 333 2 322 155 380 199 +2900 /data/VOCdevkit/VOC2007/JPEGImages/005834.jpg 333 500 19 93 225 261 380 +2901 /data/VOCdevkit/VOC2007/JPEGImages/005835.jpg 500 333 11 5 231 199 333 11 202 219 443 333 14 379 42 464 310 14 250 41 355 220 14 73 49 166 306 6 1 1 479 207 +2902 /data/VOCdevkit/VOC2007/JPEGImages/005837.jpg 500 375 18 1 30 395 365 +2903 /data/VOCdevkit/VOC2007/JPEGImages/005842.jpg 500 375 6 38 175 217 245 6 259 139 499 268 14 229 167 274 262 14 465 162 489 190 6 11 177 56 219 +2904 /data/VOCdevkit/VOC2007/JPEGImages/005844.jpg 500 375 8 76 67 216 312 8 102 52 278 350 8 199 84 320 292 8 232 76 396 329 10 157 110 390 361 +2905 /data/VOCdevkit/VOC2007/JPEGImages/005846.jpg 500 375 2 164 132 305 375 +2906 /data/VOCdevkit/VOC2007/JPEGImages/005847.jpg 500 328 18 72 35 464 297 14 217 84 278 194 +2907 /data/VOCdevkit/VOC2007/JPEGImages/005848.jpg 333 500 1 60 173 330 408 14 83 48 301 320 +2908 /data/VOCdevkit/VOC2007/JPEGImages/005849.jpg 500 375 14 242 238 286 357 14 289 229 327 359 14 266 210 338 354 14 349 112 362 141 14 284 100 316 153 +2909 /data/VOCdevkit/VOC2007/JPEGImages/005855.jpg 500 375 18 40 85 464 194 +2910 /data/VOCdevkit/VOC2007/JPEGImages/005857.jpg 375 500 15 183 133 277 302 15 86 134 175 306 +2911 /data/VOCdevkit/VOC2007/JPEGImages/005858.jpg 500 333 8 160 25 206 75 8 224 20 256 82 8 339 22 383 76 8 293 20 338 75 8 419 20 474 76 +2912 /data/VOCdevkit/VOC2007/JPEGImages/005862.jpg 500 334 6 153 79 454 252 6 1 127 256 317 +2913 /data/VOCdevkit/VOC2007/JPEGImages/005865.jpg 500 375 14 43 259 58 292 14 429 252 443 291 14 444 255 459 289 14 475 234 500 298 14 366 203 427 339 14 206 203 284 372 14 160 245 190 307 +2914 /data/VOCdevkit/VOC2007/JPEGImages/005866.jpg 500 375 15 348 215 367 247 15 365 217 391 257 15 384 172 415 260 15 465 248 496 289 15 157 137 263 294 +2915 /data/VOCdevkit/VOC2007/JPEGImages/005869.jpg 500 332 6 51 239 112 291 6 1 246 29 292 6 455 246 500 280 +2916 /data/VOCdevkit/VOC2007/JPEGImages/005870.jpg 500 375 5 28 115 485 249 14 19 173 33 214 14 1 174 13 211 14 342 135 403 221 +2917 /data/VOCdevkit/VOC2007/JPEGImages/005871.jpg 375 500 10 1 53 375 500 +2918 /data/VOCdevkit/VOC2007/JPEGImages/005872.jpg 500 375 7 47 71 419 322 +2919 /data/VOCdevkit/VOC2007/JPEGImages/005876.jpg 500 500 9 153 254 393 419 +2920 /data/VOCdevkit/VOC2007/JPEGImages/005880.jpg 500 375 14 422 173 434 206 +2921 /data/VOCdevkit/VOC2007/JPEGImages/005882.jpg 375 500 12 131 231 257 497 14 143 150 252 341 14 233 340 335 500 +2922 /data/VOCdevkit/VOC2007/JPEGImages/005883.jpg 375 500 2 272 34 354 128 2 63 90 167 205 2 78 286 297 450 2 2 249 145 358 2 128 150 181 256 2 247 139 374 248 2 133 128 248 343 +2923 /data/VOCdevkit/VOC2007/JPEGImages/005886.jpg 500 375 16 84 255 202 367 +2924 /data/VOCdevkit/VOC2007/JPEGImages/005887.jpg 500 332 14 343 62 500 332 14 1 3 391 332 +2925 /data/VOCdevkit/VOC2007/JPEGImages/005890.jpg 320 212 12 95 80 203 212 14 87 17 196 211 +2926 /data/VOCdevkit/VOC2007/JPEGImages/005891.jpg 500 375 7 192 1 379 229 +2927 /data/VOCdevkit/VOC2007/JPEGImages/005892.jpg 500 201 11 143 101 235 155 +2928 /data/VOCdevkit/VOC2007/JPEGImages/005896.jpg 334 500 14 15 98 275 500 +2929 /data/VOCdevkit/VOC2007/JPEGImages/005898.jpg 500 375 19 68 130 139 192 17 188 167 397 287 14 209 155 382 235 8 405 121 472 195 8 420 124 479 214 8 244 121 282 170 8 185 134 227 189 10 330 129 424 204 +2930 /data/VOCdevkit/VOC2007/JPEGImages/005900.jpg 500 375 14 175 197 199 262 14 70 192 115 326 14 29 202 84 352 14 258 205 278 284 14 240 191 266 275 14 17 202 37 262 +2931 /data/VOCdevkit/VOC2007/JPEGImages/005902.jpg 500 375 19 47 141 149 245 19 216 149 347 254 19 344 131 482 277 +2932 /data/VOCdevkit/VOC2007/JPEGImages/005904.jpg 500 334 6 44 125 447 256 +2933 /data/VOCdevkit/VOC2007/JPEGImages/005907.jpg 500 395 8 258 141 322 237 14 115 48 289 395 14 227 1 500 395 14 8 39 144 194 14 36 48 87 147 14 64 62 102 111 14 89 67 142 116 +2934 /data/VOCdevkit/VOC2007/JPEGImages/005913.jpg 500 333 11 1 38 498 280 +2935 /data/VOCdevkit/VOC2007/JPEGImages/005915.jpg 500 375 16 266 137 355 214 16 202 73 327 213 +2936 /data/VOCdevkit/VOC2007/JPEGImages/005916.jpg 500 375 16 316 168 448 275 16 50 159 141 262 16 3 158 42 226 +2937 /data/VOCdevkit/VOC2007/JPEGImages/005921.jpg 500 354 14 284 43 423 354 14 190 46 320 261 14 97 90 176 295 14 9 94 97 353 14 61 53 214 288 14 432 108 477 178 +2938 /data/VOCdevkit/VOC2007/JPEGImages/005922.jpg 500 375 15 71 245 194 367 15 226 252 344 352 15 2 250 73 349 14 394 28 500 375 +2939 /data/VOCdevkit/VOC2007/JPEGImages/005924.jpg 500 375 6 65 61 427 304 6 1 137 40 227 +2940 /data/VOCdevkit/VOC2007/JPEGImages/005925.jpg 500 375 1 213 280 307 332 1 352 280 447 336 14 231 247 288 324 14 368 244 428 330 +2941 /data/VOCdevkit/VOC2007/JPEGImages/005926.jpg 333 500 14 28 27 314 500 4 8 259 28 306 15 263 210 314 265 +2942 /data/VOCdevkit/VOC2007/JPEGImages/005927.jpg 500 375 0 24 82 487 254 +2943 /data/VOCdevkit/VOC2007/JPEGImages/005929.jpg 500 375 6 21 123 490 336 +2944 /data/VOCdevkit/VOC2007/JPEGImages/005931.jpg 500 375 13 302 241 396 309 14 322 210 359 286 14 128 223 160 322 14 193 269 231 362 14 242 260 274 360 14 401 304 439 374 14 455 300 489 375 +2945 /data/VOCdevkit/VOC2007/JPEGImages/005932.jpg 500 333 6 312 298 388 330 +2946 /data/VOCdevkit/VOC2007/JPEGImages/005933.jpg 500 333 18 210 143 416 229 +2947 /data/VOCdevkit/VOC2007/JPEGImages/005934.jpg 500 375 8 77 24 489 371 +2948 /data/VOCdevkit/VOC2007/JPEGImages/005935.jpg 500 375 19 58 191 104 223 +2949 /data/VOCdevkit/VOC2007/JPEGImages/005936.jpg 500 293 7 65 69 422 252 4 174 151 500 246 +2950 /data/VOCdevkit/VOC2007/JPEGImages/005937.jpg 500 369 11 48 47 243 240 17 1 120 498 369 14 215 96 496 369 14 107 138 440 369 15 327 3 401 104 +2951 /data/VOCdevkit/VOC2007/JPEGImages/005939.jpg 500 375 7 190 138 327 279 +2952 /data/VOCdevkit/VOC2007/JPEGImages/005941.jpg 500 375 15 379 134 441 229 8 247 196 354 351 8 152 224 260 375 10 30 227 323 375 +2953 /data/VOCdevkit/VOC2007/JPEGImages/005942.jpg 500 333 14 304 64 500 333 14 1 88 170 311 +2954 /data/VOCdevkit/VOC2007/JPEGImages/005943.jpg 500 375 17 309 153 500 375 17 1 141 318 346 15 309 8 426 199 +2955 /data/VOCdevkit/VOC2007/JPEGImages/005944.jpg 320 212 12 87 46 266 208 14 127 23 181 139 +2956 /data/VOCdevkit/VOC2007/JPEGImages/005945.jpg 500 375 14 229 29 419 373 14 111 89 252 375 14 416 177 500 364 +2957 /data/VOCdevkit/VOC2007/JPEGImages/005946.jpg 500 374 19 100 9 491 319 +2958 /data/VOCdevkit/VOC2007/JPEGImages/005949.jpg 500 333 7 2 25 482 323 +2959 /data/VOCdevkit/VOC2007/JPEGImages/005950.jpg 500 375 3 229 114 440 218 3 92 89 288 213 +2960 /data/VOCdevkit/VOC2007/JPEGImages/005953.jpg 375 500 14 124 140 272 293 +2961 /data/VOCdevkit/VOC2007/JPEGImages/005955.jpg 500 333 11 13 2 500 333 +2962 /data/VOCdevkit/VOC2007/JPEGImages/005957.jpg 500 375 7 105 23 450 361 +2963 /data/VOCdevkit/VOC2007/JPEGImages/005958.jpg 500 333 14 209 4 499 333 14 11 73 242 332 +2964 /data/VOCdevkit/VOC2007/JPEGImages/005959.jpg 500 333 6 87 2 449 261 14 288 63 321 87 +2965 /data/VOCdevkit/VOC2007/JPEGImages/005962.jpg 500 334 7 3 79 302 334 +2966 /data/VOCdevkit/VOC2007/JPEGImages/005965.jpg 500 333 0 24 129 186 328 +2967 /data/VOCdevkit/VOC2007/JPEGImages/005966.jpg 500 375 14 86 115 281 375 14 260 88 500 375 +2968 /data/VOCdevkit/VOC2007/JPEGImages/005967.jpg 320 223 12 89 22 212 198 14 115 28 171 134 +2969 /data/VOCdevkit/VOC2007/JPEGImages/005969.jpg 500 375 14 41 59 353 375 +2970 /data/VOCdevkit/VOC2007/JPEGImages/005972.jpg 375 500 14 92 40 308 455 +2971 /data/VOCdevkit/VOC2007/JPEGImages/005973.jpg 375 500 12 133 132 333 396 14 176 169 273 433 +2972 /data/VOCdevkit/VOC2007/JPEGImages/005974.jpg 500 375 6 142 149 331 268 +2973 /data/VOCdevkit/VOC2007/JPEGImages/005976.jpg 500 333 8 294 169 372 333 8 82 208 192 333 15 220 145 311 280 +2974 /data/VOCdevkit/VOC2007/JPEGImages/005977.jpg 500 375 7 1 100 397 375 7 43 42 483 270 +2975 /data/VOCdevkit/VOC2007/JPEGImages/005978.jpg 500 271 5 1 117 210 240 +2976 /data/VOCdevkit/VOC2007/JPEGImages/005982.jpg 375 500 14 134 77 300 500 14 8 108 160 500 14 1 89 65 500 14 93 83 148 151 14 261 90 347 475 14 204 107 239 148 +2977 /data/VOCdevkit/VOC2007/JPEGImages/005986.jpg 500 333 18 64 47 424 296 +2978 /data/VOCdevkit/VOC2007/JPEGImages/005987.jpg 500 333 6 100 87 358 260 +2979 /data/VOCdevkit/VOC2007/JPEGImages/005993.jpg 500 375 14 104 43 412 375 +2980 /data/VOCdevkit/VOC2007/JPEGImages/005994.jpg 500 333 14 135 93 346 333 +2981 /data/VOCdevkit/VOC2007/JPEGImages/005997.jpg 500 375 19 118 172 196 251 11 166 130 271 315 +2982 /data/VOCdevkit/VOC2007/JPEGImages/005999.jpg 500 339 18 40 54 443 283 +2983 /data/VOCdevkit/VOC2007/JPEGImages/006002.jpg 500 375 12 323 100 420 134 14 419 71 480 354 +2984 /data/VOCdevkit/VOC2007/JPEGImages/006003.jpg 375 500 4 205 77 333 364 4 51 62 169 356 +2985 /data/VOCdevkit/VOC2007/JPEGImages/006006.jpg 500 377 6 65 55 412 334 +2986 /data/VOCdevkit/VOC2007/JPEGImages/006007.jpg 500 333 11 175 76 325 248 +2987 /data/VOCdevkit/VOC2007/JPEGImages/006008.jpg 500 375 13 22 1 500 375 +2988 /data/VOCdevkit/VOC2007/JPEGImages/006010.jpg 500 375 8 4 223 86 353 8 72 170 142 282 8 205 191 289 292 8 316 181 355 258 8 347 173 415 286 8 107 198 193 307 +2989 /data/VOCdevkit/VOC2007/JPEGImages/006013.jpg 500 378 18 163 248 494 273 5 298 294 496 372 +2990 /data/VOCdevkit/VOC2007/JPEGImages/006014.jpg 375 500 3 177 20 325 454 +2991 /data/VOCdevkit/VOC2007/JPEGImages/006015.jpg 500 375 1 226 252 272 319 +2992 /data/VOCdevkit/VOC2007/JPEGImages/006016.jpg 500 333 6 4 40 482 301 14 90 1 143 56 14 142 29 199 94 +2993 /data/VOCdevkit/VOC2007/JPEGImages/006017.jpg 500 375 6 29 68 462 346 6 1 35 115 230 6 135 57 190 81 +2994 /data/VOCdevkit/VOC2007/JPEGImages/006019.jpg 500 375 6 1 68 496 375 +2995 /data/VOCdevkit/VOC2007/JPEGImages/006021.jpg 320 240 9 69 46 249 169 +2996 /data/VOCdevkit/VOC2007/JPEGImages/006022.jpg 388 500 15 175 3 388 500 15 1 1 222 351 +2997 /data/VOCdevkit/VOC2007/JPEGImages/006024.jpg 500 333 0 52 90 442 234 6 8 294 118 333 +2998 /data/VOCdevkit/VOC2007/JPEGImages/006031.jpg 500 375 17 20 109 475 315 +2999 /data/VOCdevkit/VOC2007/JPEGImages/006032.jpg 500 336 1 121 248 211 319 1 288 246 396 319 1 362 249 456 315 14 141 203 176 317 14 192 209 235 304 14 315 209 379 315 14 383 207 421 314 1 190 234 259 305 +3000 /data/VOCdevkit/VOC2007/JPEGImages/006034.jpg 310 139 6 6 36 287 137 +3001 /data/VOCdevkit/VOC2007/JPEGImages/006036.jpg 500 332 14 400 171 453 253 14 107 3 276 331 +3002 /data/VOCdevkit/VOC2007/JPEGImages/006037.jpg 500 207 11 101 21 312 182 +3003 /data/VOCdevkit/VOC2007/JPEGImages/006039.jpg 500 224 11 195 50 369 181 +3004 /data/VOCdevkit/VOC2007/JPEGImages/006040.jpg 500 375 14 9 92 281 375 14 378 63 429 139 14 428 62 479 140 19 354 38 500 169 14 238 160 500 375 +3005 /data/VOCdevkit/VOC2007/JPEGImages/006044.jpg 500 375 11 159 7 500 375 +3006 /data/VOCdevkit/VOC2007/JPEGImages/006047.jpg 500 333 6 150 151 227 192 6 218 146 279 188 6 277 138 334 183 +3007 /data/VOCdevkit/VOC2007/JPEGImages/006048.jpg 332 500 3 1 1 331 390 14 101 234 250 355 +3008 /data/VOCdevkit/VOC2007/JPEGImages/006049.jpg 375 500 15 206 226 371 478 15 187 206 228 244 15 46 210 84 244 15 82 348 154 429 +3009 /data/VOCdevkit/VOC2007/JPEGImages/006050.jpg 500 375 8 79 14 367 375 14 84 113 365 375 14 1 3 223 375 +3010 /data/VOCdevkit/VOC2007/JPEGImages/006051.jpg 500 334 0 158 159 220 183 0 249 188 309 210 0 320 199 381 225 0 304 221 366 242 0 381 227 442 250 0 431 258 493 283 +3011 /data/VOCdevkit/VOC2007/JPEGImages/006052.jpg 500 375 7 129 51 497 374 +3012 /data/VOCdevkit/VOC2007/JPEGImages/006053.jpg 333 500 2 1 107 291 500 +3013 /data/VOCdevkit/VOC2007/JPEGImages/006054.jpg 500 333 2 152 86 261 241 2 244 121 296 274 2 70 266 172 333 2 442 294 486 333 +3014 /data/VOCdevkit/VOC2007/JPEGImages/006056.jpg 500 333 10 3 109 500 333 4 288 89 315 186 4 175 86 209 177 8 15 13 107 170 +3015 /data/VOCdevkit/VOC2007/JPEGImages/006057.jpg 500 375 8 13 219 113 368 8 97 191 169 314 8 170 225 270 375 8 229 191 307 308 10 98 209 264 361 +3016 /data/VOCdevkit/VOC2007/JPEGImages/006059.jpg 375 500 13 2 274 255 451 14 194 155 286 433 +3017 /data/VOCdevkit/VOC2007/JPEGImages/006060.jpg 500 333 14 263 69 500 333 9 1 165 349 333 +3018 /data/VOCdevkit/VOC2007/JPEGImages/006063.jpg 500 375 7 60 88 309 310 +3019 /data/VOCdevkit/VOC2007/JPEGImages/006064.jpg 500 375 7 66 1 500 313 +3020 /data/VOCdevkit/VOC2007/JPEGImages/006068.jpg 331 500 19 4 147 111 268 +3021 /data/VOCdevkit/VOC2007/JPEGImages/006072.jpg 500 375 4 233 15 309 336 4 151 102 252 335 +3022 /data/VOCdevkit/VOC2007/JPEGImages/006075.jpg 500 375 19 351 181 419 245 +3023 /data/VOCdevkit/VOC2007/JPEGImages/006076.jpg 375 500 2 110 255 209 337 14 20 118 256 499 +3024 /data/VOCdevkit/VOC2007/JPEGImages/006077.jpg 500 333 18 157 142 302 222 +3025 /data/VOCdevkit/VOC2007/JPEGImages/006080.jpg 500 500 7 2 14 498 500 +3026 /data/VOCdevkit/VOC2007/JPEGImages/006081.jpg 281 500 10 92 191 265 299 8 207 201 268 303 8 96 208 152 290 +3027 /data/VOCdevkit/VOC2007/JPEGImages/006082.jpg 500 378 6 475 156 500 170 6 390 172 439 201 5 1 4 394 375 +3028 /data/VOCdevkit/VOC2007/JPEGImages/006083.jpg 500 375 13 76 73 379 362 15 394 77 460 211 +3029 /data/VOCdevkit/VOC2007/JPEGImages/006085.jpg 500 375 9 118 105 180 188 9 315 44 475 177 9 174 54 292 145 +3030 /data/VOCdevkit/VOC2007/JPEGImages/006086.jpg 500 476 4 109 75 168 264 +3031 /data/VOCdevkit/VOC2007/JPEGImages/006087.jpg 500 375 14 1 1 257 337 +3032 /data/VOCdevkit/VOC2007/JPEGImages/006090.jpg 375 500 7 46 68 375 500 +3033 /data/VOCdevkit/VOC2007/JPEGImages/006092.jpg 375 500 14 50 1 186 278 14 177 1 331 294 +3034 /data/VOCdevkit/VOC2007/JPEGImages/006093.jpg 500 379 14 212 92 414 378 14 433 120 486 214 14 362 132 447 303 4 187 190 289 293 8 61 158 135 266 +3035 /data/VOCdevkit/VOC2007/JPEGImages/006094.jpg 500 375 14 365 165 391 294 6 282 134 456 331 +3036 /data/VOCdevkit/VOC2007/JPEGImages/006099.jpg 500 358 11 1 1 495 355 +3037 /data/VOCdevkit/VOC2007/JPEGImages/006101.jpg 500 395 14 287 34 459 395 14 182 76 306 395 14 73 67 205 395 +3038 /data/VOCdevkit/VOC2007/JPEGImages/006102.jpg 500 375 2 157 148 317 223 +3039 /data/VOCdevkit/VOC2007/JPEGImages/006106.jpg 500 375 12 318 57 500 375 12 1 116 270 375 +3040 /data/VOCdevkit/VOC2007/JPEGImages/006109.jpg 500 375 6 42 269 133 314 +3041 /data/VOCdevkit/VOC2007/JPEGImages/006110.jpg 500 323 3 330 116 354 159 3 336 220 381 256 +3042 /data/VOCdevkit/VOC2007/JPEGImages/006112.jpg 500 371 11 1 34 335 371 +3043 /data/VOCdevkit/VOC2007/JPEGImages/006113.jpg 500 336 5 406 149 500 302 6 162 166 211 243 1 373 240 419 305 14 366 188 418 300 +3044 /data/VOCdevkit/VOC2007/JPEGImages/006114.jpg 375 500 7 205 235 375 495 +3045 /data/VOCdevkit/VOC2007/JPEGImages/006115.jpg 500 384 17 108 223 466 383 14 4 292 95 384 15 4 39 192 222 +3046 /data/VOCdevkit/VOC2007/JPEGImages/006116.jpg 500 332 19 169 98 343 232 +3047 /data/VOCdevkit/VOC2007/JPEGImages/006118.jpg 500 334 1 146 173 413 334 14 164 6 462 334 +3048 /data/VOCdevkit/VOC2007/JPEGImages/006119.jpg 500 333 13 94 137 203 283 13 191 68 452 333 +3049 /data/VOCdevkit/VOC2007/JPEGImages/006121.jpg 500 375 6 38 156 185 223 6 104 149 284 237 6 199 140 450 259 +3050 /data/VOCdevkit/VOC2007/JPEGImages/006122.jpg 500 333 12 150 40 363 330 14 107 112 174 218 14 447 98 494 191 +3051 /data/VOCdevkit/VOC2007/JPEGImages/006126.jpg 500 333 17 87 161 302 265 8 325 161 439 274 8 2 212 165 333 +3052 /data/VOCdevkit/VOC2007/JPEGImages/006127.jpg 375 500 18 1 125 310 421 +3053 /data/VOCdevkit/VOC2007/JPEGImages/006132.jpg 500 333 2 252 25 468 333 2 35 69 265 332 +3054 /data/VOCdevkit/VOC2007/JPEGImages/006137.jpg 500 375 14 238 107 273 141 14 237 120 266 140 6 106 136 394 234 +3055 /data/VOCdevkit/VOC2007/JPEGImages/006138.jpg 500 375 18 2 78 238 216 +3056 /data/VOCdevkit/VOC2007/JPEGImages/006142.jpg 500 375 10 3 130 192 255 10 11 92 205 156 8 8 135 150 263 14 293 22 500 375 14 218 4 256 146 14 250 17 278 114 +3057 /data/VOCdevkit/VOC2007/JPEGImages/006143.jpg 332 500 12 109 193 246 374 14 81 253 165 367 +3058 /data/VOCdevkit/VOC2007/JPEGImages/006144.jpg 420 500 7 82 113 260 498 19 33 19 391 405 +3059 /data/VOCdevkit/VOC2007/JPEGImages/006145.jpg 500 333 14 289 68 500 333 14 315 55 418 245 14 213 4 296 201 14 119 25 176 207 14 8 10 106 175 14 27 87 156 283 8 344 75 451 192 8 3 67 66 166 +3060 /data/VOCdevkit/VOC2007/JPEGImages/006147.jpg 500 375 14 175 105 203 209 14 146 101 171 202 +3061 /data/VOCdevkit/VOC2007/JPEGImages/006149.jpg 500 333 11 1 30 354 254 +3062 /data/VOCdevkit/VOC2007/JPEGImages/006152.jpg 500 375 14 397 10 500 375 14 363 52 487 375 14 326 75 390 195 14 238 58 384 375 14 99 32 273 375 14 1 55 109 375 14 311 34 357 85 +3063 /data/VOCdevkit/VOC2007/JPEGImages/006154.jpg 400 445 18 1 57 351 415 +3064 /data/VOCdevkit/VOC2007/JPEGImages/006155.jpg 500 375 6 393 174 496 219 6 341 173 428 212 6 291 169 368 205 6 245 169 322 206 6 178 170 250 198 6 143 169 210 195 6 118 166 169 192 6 98 168 164 186 +3065 /data/VOCdevkit/VOC2007/JPEGImages/006157.jpg 378 500 2 141 129 273 303 14 1 183 255 500 +3066 /data/VOCdevkit/VOC2007/JPEGImages/006160.jpg 500 375 3 153 166 227 267 +3067 /data/VOCdevkit/VOC2007/JPEGImages/006164.jpg 375 500 3 92 390 326 443 +3068 /data/VOCdevkit/VOC2007/JPEGImages/006165.jpg 333 500 1 18 192 234 440 14 83 104 251 411 +3069 /data/VOCdevkit/VOC2007/JPEGImages/006167.jpg 500 333 11 150 220 269 333 14 127 18 315 333 14 145 1 275 103 +3070 /data/VOCdevkit/VOC2007/JPEGImages/006168.jpg 500 335 14 61 22 500 335 +3071 /data/VOCdevkit/VOC2007/JPEGImages/006169.jpg 500 333 14 281 129 384 306 14 283 181 383 332 14 228 200 302 329 14 164 202 231 331 14 93 200 172 318 +3072 /data/VOCdevkit/VOC2007/JPEGImages/006173.jpg 500 333 9 413 265 459 299 9 354 263 399 301 9 299 225 352 294 9 210 233 284 309 9 153 228 203 305 9 93 234 193 309 9 105 277 148 314 +3073 /data/VOCdevkit/VOC2007/JPEGImages/006178.jpg 500 333 14 291 125 340 256 14 249 136 294 263 14 196 117 252 255 14 164 121 207 255 14 113 116 170 248 14 1 173 53 333 14 47 210 93 294 14 455 231 500 333 +3074 /data/VOCdevkit/VOC2007/JPEGImages/006182.jpg 500 334 11 90 94 439 274 11 74 78 232 141 +3075 /data/VOCdevkit/VOC2007/JPEGImages/006186.jpg 500 333 14 73 1 499 319 +3076 /data/VOCdevkit/VOC2007/JPEGImages/006191.jpg 500 357 18 9 83 291 279 +3077 /data/VOCdevkit/VOC2007/JPEGImages/006192.jpg 500 333 1 164 160 331 333 14 196 18 334 297 +3078 /data/VOCdevkit/VOC2007/JPEGImages/006193.jpg 500 375 13 1 184 229 337 13 419 116 488 209 13 181 149 363 294 13 270 122 450 242 14 43 55 105 206 +3079 /data/VOCdevkit/VOC2007/JPEGImages/006194.jpg 500 375 11 2 1 500 269 +3080 /data/VOCdevkit/VOC2007/JPEGImages/006195.jpg 375 500 14 119 86 259 495 14 305 339 375 464 14 233 372 320 499 14 38 305 124 412 4 55 365 72 419 4 72 366 85 419 4 29 364 46 419 +3081 /data/VOCdevkit/VOC2007/JPEGImages/006197.jpg 500 375 5 96 27 430 375 +3082 /data/VOCdevkit/VOC2007/JPEGImages/006199.jpg 500 375 1 163 167 424 350 14 235 64 433 338 +3083 /data/VOCdevkit/VOC2007/JPEGImages/006200.jpg 500 375 14 202 70 466 375 14 412 174 500 338 13 69 279 260 375 +3084 /data/VOCdevkit/VOC2007/JPEGImages/006204.jpg 316 432 18 176 181 314 230 +3085 /data/VOCdevkit/VOC2007/JPEGImages/006205.jpg 500 375 3 250 184 328 303 3 394 260 425 293 +3086 /data/VOCdevkit/VOC2007/JPEGImages/006207.jpg 480 323 12 41 43 379 323 14 178 34 277 181 +3087 /data/VOCdevkit/VOC2007/JPEGImages/006211.jpg 301 500 7 151 239 201 283 +3088 /data/VOCdevkit/VOC2007/JPEGImages/006213.jpg 375 500 6 42 240 355 444 14 351 254 375 408 14 280 253 315 326 14 316 253 347 329 +3089 /data/VOCdevkit/VOC2007/JPEGImages/006217.jpg 333 500 16 231 201 333 318 16 37 199 213 259 16 167 304 270 456 16 82 260 181 449 16 37 242 242 326 16 231 260 300 377 16 8 244 79 358 16 1 327 94 479 +3090 /data/VOCdevkit/VOC2007/JPEGImages/006226.jpg 375 500 10 2 203 300 500 14 144 145 206 206 14 300 174 375 387 14 276 194 302 234 14 190 174 266 231 14 242 164 280 202 14 199 162 230 181 14 69 131 119 199 14 57 135 144 213 14 106 180 148 236 14 68 192 117 256 14 30 217 81 289 14 1 153 60 369 14 186 207 345 500 +3091 /data/VOCdevkit/VOC2007/JPEGImages/006227.jpg 337 139 11 91 61 248 139 +3092 /data/VOCdevkit/VOC2007/JPEGImages/006228.jpg 500 375 6 2 44 458 354 +3093 /data/VOCdevkit/VOC2007/JPEGImages/006231.jpg 375 500 15 39 128 375 500 +3094 /data/VOCdevkit/VOC2007/JPEGImages/006232.jpg 500 333 0 86 145 482 282 +3095 /data/VOCdevkit/VOC2007/JPEGImages/006237.jpg 281 500 12 58 83 109 175 14 95 33 281 500 +3096 /data/VOCdevkit/VOC2007/JPEGImages/006239.jpg 334 500 14 1 143 144 450 14 235 187 334 275 14 109 62 225 371 +3097 /data/VOCdevkit/VOC2007/JPEGImages/006242.jpg 500 374 6 382 152 464 209 6 283 156 358 211 6 157 153 241 212 6 36 153 139 214 +3098 /data/VOCdevkit/VOC2007/JPEGImages/006244.jpg 500 342 2 234 108 319 184 +3099 /data/VOCdevkit/VOC2007/JPEGImages/006245.jpg 500 375 11 1 3 332 375 +3100 /data/VOCdevkit/VOC2007/JPEGImages/006246.jpg 500 375 6 10 1 500 375 +3101 /data/VOCdevkit/VOC2007/JPEGImages/006248.jpg 500 336 14 217 65 279 228 14 180 39 229 276 14 41 46 225 309 14 253 16 500 336 4 63 143 195 182 4 3 267 33 329 +3102 /data/VOCdevkit/VOC2007/JPEGImages/006253.jpg 500 334 11 3 38 223 331 7 319 109 498 262 +3103 /data/VOCdevkit/VOC2007/JPEGImages/006255.jpg 500 375 14 1 4 369 375 +3104 /data/VOCdevkit/VOC2007/JPEGImages/006256.jpg 500 337 6 261 76 496 236 6 66 85 403 300 +3105 /data/VOCdevkit/VOC2007/JPEGImages/006257.jpg 500 375 17 23 138 480 328 14 312 145 356 227 14 252 179 331 290 +3106 /data/VOCdevkit/VOC2007/JPEGImages/006263.jpg 500 333 0 11 81 493 238 +3107 /data/VOCdevkit/VOC2007/JPEGImages/006265.jpg 500 375 7 188 109 386 261 +3108 /data/VOCdevkit/VOC2007/JPEGImages/006266.jpg 500 375 14 238 36 336 237 14 1 32 64 280 11 247 132 316 307 11 370 178 461 266 11 118 138 233 255 +3109 /data/VOCdevkit/VOC2007/JPEGImages/006268.jpg 389 500 2 64 127 247 355 +3110 /data/VOCdevkit/VOC2007/JPEGImages/006271.jpg 500 375 10 1 38 500 375 +3111 /data/VOCdevkit/VOC2007/JPEGImages/006273.jpg 500 333 14 146 39 302 310 11 263 40 340 219 +3112 /data/VOCdevkit/VOC2007/JPEGImages/006274.jpg 500 245 14 116 17 381 245 14 312 59 345 111 14 304 52 323 86 14 188 45 207 80 8 370 69 417 125 8 330 68 373 155 +3113 /data/VOCdevkit/VOC2007/JPEGImages/006278.jpg 500 371 18 50 21 473 327 +3114 /data/VOCdevkit/VOC2007/JPEGImages/006280.jpg 500 333 7 294 96 434 238 +3115 /data/VOCdevkit/VOC2007/JPEGImages/006283.jpg 500 375 6 23 8 500 330 6 22 123 54 185 +3116 /data/VOCdevkit/VOC2007/JPEGImages/006287.jpg 500 375 17 1 192 463 374 14 224 142 412 375 +3117 /data/VOCdevkit/VOC2007/JPEGImages/006288.jpg 500 375 14 130 167 297 375 14 97 45 493 372 14 298 169 401 245 +3118 /data/VOCdevkit/VOC2007/JPEGImages/006292.jpg 500 333 1 75 199 364 333 14 157 109 320 304 14 355 119 453 316 14 117 25 197 274 +3119 /data/VOCdevkit/VOC2007/JPEGImages/006293.jpg 500 333 19 163 72 244 172 +3120 /data/VOCdevkit/VOC2007/JPEGImages/006294.jpg 500 333 0 11 70 494 238 +3121 /data/VOCdevkit/VOC2007/JPEGImages/006297.jpg 408 274 17 217 125 404 261 8 32 116 123 216 15 199 72 269 140 +3122 /data/VOCdevkit/VOC2007/JPEGImages/006298.jpg 500 400 5 65 25 411 372 +3123 /data/VOCdevkit/VOC2007/JPEGImages/006302.jpg 500 375 3 410 90 500 270 3 150 101 237 273 +3124 /data/VOCdevkit/VOC2007/JPEGImages/006303.jpg 500 371 7 181 136 302 320 15 354 3 500 371 +3125 /data/VOCdevkit/VOC2007/JPEGImages/006307.jpg 500 187 19 129 62 173 101 19 214 59 246 87 15 210 24 235 57 17 289 65 426 116 8 150 105 288 173 +3126 /data/VOCdevkit/VOC2007/JPEGImages/006308.jpg 375 500 7 240 378 360 500 19 34 3 373 284 +3127 /data/VOCdevkit/VOC2007/JPEGImages/006310.jpg 500 333 14 230 3 500 322 +3128 /data/VOCdevkit/VOC2007/JPEGImages/006311.jpg 448 252 15 172 85 262 236 15 116 106 205 218 +3129 /data/VOCdevkit/VOC2007/JPEGImages/006312.jpg 500 375 14 295 78 426 184 1 341 92 477 237 +3130 /data/VOCdevkit/VOC2007/JPEGImages/006313.jpg 500 375 14 88 87 225 375 14 274 264 402 374 14 284 162 412 294 14 270 146 369 235 19 1 121 88 238 +3131 /data/VOCdevkit/VOC2007/JPEGImages/006315.jpg 500 375 11 261 135 407 319 +3132 /data/VOCdevkit/VOC2007/JPEGImages/006316.jpg 500 321 9 12 37 216 301 9 181 26 402 268 9 284 39 500 270 +3133 /data/VOCdevkit/VOC2007/JPEGImages/006317.jpg 500 375 5 1 2 500 301 1 239 209 478 375 14 249 67 396 368 +3134 /data/VOCdevkit/VOC2007/JPEGImages/006322.jpg 500 334 14 61 2 500 333 +3135 /data/VOCdevkit/VOC2007/JPEGImages/006324.jpg 500 375 6 245 178 413 305 6 93 222 188 260 +3136 /data/VOCdevkit/VOC2007/JPEGImages/006326.jpg 500 375 6 333 73 500 181 6 21 76 392 320 +3137 /data/VOCdevkit/VOC2007/JPEGImages/006327.jpg 334 500 5 44 61 237 342 14 311 219 334 310 14 279 231 297 283 14 266 229 283 293 +3138 /data/VOCdevkit/VOC2007/JPEGImages/006328.jpg 500 375 11 164 96 326 284 +3139 /data/VOCdevkit/VOC2007/JPEGImages/006331.jpg 500 332 6 98 89 397 279 +3140 /data/VOCdevkit/VOC2007/JPEGImages/006332.jpg 500 375 3 1 1 398 269 14 149 171 173 214 +3141 /data/VOCdevkit/VOC2007/JPEGImages/006333.jpg 500 334 6 58 35 451 296 6 325 66 422 119 6 436 102 500 152 +3142 /data/VOCdevkit/VOC2007/JPEGImages/006334.jpg 500 400 5 74 170 221 244 6 270 194 350 233 6 282 196 322 236 14 29 200 43 234 14 439 205 468 254 14 467 200 496 280 +3143 /data/VOCdevkit/VOC2007/JPEGImages/006336.jpg 375 500 7 2 2 375 436 +3144 /data/VOCdevkit/VOC2007/JPEGImages/006340.jpg 500 375 6 12 85 459 361 14 247 56 266 92 14 226 55 251 91 14 245 59 268 92 +3145 /data/VOCdevkit/VOC2007/JPEGImages/006342.jpg 407 500 2 62 48 321 174 +3146 /data/VOCdevkit/VOC2007/JPEGImages/006343.jpg 500 313 17 281 127 406 210 +3147 /data/VOCdevkit/VOC2007/JPEGImages/006345.jpg 500 333 19 98 1 462 256 +3148 /data/VOCdevkit/VOC2007/JPEGImages/006347.jpg 500 335 0 18 102 455 207 0 321 114 479 150 0 466 119 500 138 +3149 /data/VOCdevkit/VOC2007/JPEGImages/006354.jpg 500 375 11 288 139 406 291 11 2 89 373 250 +3150 /data/VOCdevkit/VOC2007/JPEGImages/006356.jpg 500 333 18 3 68 500 277 +3151 /data/VOCdevkit/VOC2007/JPEGImages/006358.jpg 500 375 6 465 204 500 232 6 36 206 74 229 6 98 205 150 227 6 150 202 205 230 6 281 207 342 230 6 345 200 425 235 6 68 200 101 223 6 268 203 321 227 +3152 /data/VOCdevkit/VOC2007/JPEGImages/006359.jpg 500 272 4 193 43 217 129 4 221 45 244 127 15 82 142 186 230 8 167 40 500 272 +3153 /data/VOCdevkit/VOC2007/JPEGImages/006360.jpg 500 375 14 353 66 500 338 14 2 110 151 375 4 226 243 263 368 +3154 /data/VOCdevkit/VOC2007/JPEGImages/006361.jpg 500 332 12 299 131 440 268 14 205 84 238 161 14 372 78 422 206 +3155 /data/VOCdevkit/VOC2007/JPEGImages/006364.jpg 500 344 12 39 143 500 344 14 256 24 381 344 14 386 173 428 214 +3156 /data/VOCdevkit/VOC2007/JPEGImages/006365.jpg 500 333 12 73 62 402 295 14 348 103 484 206 +3157 /data/VOCdevkit/VOC2007/JPEGImages/006368.jpg 500 333 12 61 48 422 327 14 220 18 344 195 +3158 /data/VOCdevkit/VOC2007/JPEGImages/006370.jpg 375 500 14 161 119 234 427 +3159 /data/VOCdevkit/VOC2007/JPEGImages/006372.jpg 500 375 18 167 41 500 300 +3160 /data/VOCdevkit/VOC2007/JPEGImages/006373.jpg 375 500 17 235 371 374 500 14 15 281 56 471 +3161 /data/VOCdevkit/VOC2007/JPEGImages/006376.jpg 500 375 6 35 17 456 355 14 184 57 275 115 14 288 63 369 125 +3162 /data/VOCdevkit/VOC2007/JPEGImages/006378.jpg 500 375 9 278 171 369 283 9 159 174 219 262 14 140 89 189 175 14 170 111 190 167 +3163 /data/VOCdevkit/VOC2007/JPEGImages/006379.jpg 500 375 2 231 118 440 301 2 73 165 294 277 2 180 142 242 220 +3164 /data/VOCdevkit/VOC2007/JPEGImages/006380.jpg 500 375 10 73 85 421 375 4 248 165 267 200 4 256 124 277 178 4 278 114 294 167 14 343 55 362 85 14 332 62 384 134 14 346 77 424 179 14 362 96 436 209 14 311 117 500 336 14 277 40 317 83 14 238 44 263 83 14 219 57 261 102 14 181 63 241 114 14 128 64 243 143 14 120 92 210 218 14 72 105 181 259 14 1 155 164 375 +3165 /data/VOCdevkit/VOC2007/JPEGImages/006383.jpg 500 185 6 43 22 481 158 +3166 /data/VOCdevkit/VOC2007/JPEGImages/006384.jpg 500 419 19 340 4 500 148 14 36 81 338 418 +3167 /data/VOCdevkit/VOC2007/JPEGImages/006386.jpg 500 334 6 80 168 149 195 6 141 166 200 205 6 1 173 139 240 6 233 167 463 321 +3168 /data/VOCdevkit/VOC2007/JPEGImages/006388.jpg 500 375 5 15 190 446 344 +3169 /data/VOCdevkit/VOC2007/JPEGImages/006389.jpg 500 333 19 164 43 264 132 +3170 /data/VOCdevkit/VOC2007/JPEGImages/006390.jpg 500 375 4 1 249 46 375 4 189 279 258 375 4 43 211 180 375 14 86 11 500 375 +3171 /data/VOCdevkit/VOC2007/JPEGImages/006393.jpg 500 333 8 229 219 322 333 8 247 181 299 231 8 405 156 446 213 8 401 148 445 195 +3172 /data/VOCdevkit/VOC2007/JPEGImages/006394.jpg 333 500 7 33 16 322 452 +3173 /data/VOCdevkit/VOC2007/JPEGImages/006397.jpg 500 333 6 47 44 427 174 6 19 60 178 171 +3174 /data/VOCdevkit/VOC2007/JPEGImages/006399.jpg 500 333 11 208 6 479 333 14 2 3 178 273 +3175 /data/VOCdevkit/VOC2007/JPEGImages/006401.jpg 500 332 12 275 181 405 277 12 128 186 202 259 12 38 209 74 258 14 312 162 356 241 14 47 182 75 218 14 122 171 150 211 +3176 /data/VOCdevkit/VOC2007/JPEGImages/006402.jpg 400 264 4 30 73 65 157 4 71 75 107 162 +3177 /data/VOCdevkit/VOC2007/JPEGImages/006403.jpg 500 375 14 2 3 228 374 11 39 50 500 375 +3178 /data/VOCdevkit/VOC2007/JPEGImages/006405.jpg 375 500 6 193 308 375 500 5 23 215 248 405 +3179 /data/VOCdevkit/VOC2007/JPEGImages/006406.jpg 500 357 0 290 112 374 150 0 174 133 252 167 0 86 151 164 183 0 89 178 169 206 0 78 201 160 236 +3180 /data/VOCdevkit/VOC2007/JPEGImages/006407.jpg 500 375 5 47 92 385 343 14 1 214 55 349 14 259 139 298 222 +3181 /data/VOCdevkit/VOC2007/JPEGImages/006408.jpg 500 375 3 170 154 193 247 +3182 /data/VOCdevkit/VOC2007/JPEGImages/006410.jpg 500 375 18 288 168 452 273 18 63 146 298 233 +3183 /data/VOCdevkit/VOC2007/JPEGImages/006412.jpg 500 375 1 12 49 496 350 +3184 /data/VOCdevkit/VOC2007/JPEGImages/006413.jpg 282 500 1 32 181 216 496 14 25 27 110 356 +3185 /data/VOCdevkit/VOC2007/JPEGImages/006414.jpg 500 333 9 180 3 500 333 14 1 3 229 333 +3186 /data/VOCdevkit/VOC2007/JPEGImages/006415.jpg 500 375 6 15 150 483 288 +3187 /data/VOCdevkit/VOC2007/JPEGImages/006416.jpg 500 333 14 373 204 419 309 +3188 /data/VOCdevkit/VOC2007/JPEGImages/006420.jpg 500 374 6 1 176 111 269 +3189 /data/VOCdevkit/VOC2007/JPEGImages/006422.jpg 500 375 8 17 277 212 375 8 394 262 500 373 +3190 /data/VOCdevkit/VOC2007/JPEGImages/006423.jpg 500 375 6 224 117 281 155 6 277 127 324 163 +3191 /data/VOCdevkit/VOC2007/JPEGImages/006426.jpg 375 500 14 191 181 369 500 14 121 127 233 486 14 1 150 196 500 +3192 /data/VOCdevkit/VOC2007/JPEGImages/006431.jpg 500 331 13 134 133 355 295 14 221 62 341 268 +3193 /data/VOCdevkit/VOC2007/JPEGImages/006432.jpg 500 375 4 330 230 365 331 4 167 258 203 351 14 265 135 398 373 14 125 103 285 375 14 320 46 449 373 14 66 93 202 375 14 387 165 500 374 +3194 /data/VOCdevkit/VOC2007/JPEGImages/006435.jpg 500 333 6 111 185 390 291 19 252 153 320 215 +3195 /data/VOCdevkit/VOC2007/JPEGImages/006439.jpg 375 500 7 71 24 375 389 +3196 /data/VOCdevkit/VOC2007/JPEGImages/006441.jpg 500 375 6 1 184 69 262 +3197 /data/VOCdevkit/VOC2007/JPEGImages/006446.jpg 500 375 14 208 2 500 375 14 1 74 114 375 19 204 1 303 64 +3198 /data/VOCdevkit/VOC2007/JPEGImages/006451.jpg 500 372 7 1 65 298 257 8 86 1 500 223 +3199 /data/VOCdevkit/VOC2007/JPEGImages/006452.jpg 333 500 19 107 221 176 288 14 160 119 255 461 4 28 287 61 381 +3200 /data/VOCdevkit/VOC2007/JPEGImages/006453.jpg 500 375 14 323 82 450 375 14 219 68 351 369 14 164 121 246 374 14 60 73 184 371 8 1 245 61 375 +3201 /data/VOCdevkit/VOC2007/JPEGImages/006454.jpg 500 375 6 29 139 475 294 +3202 /data/VOCdevkit/VOC2007/JPEGImages/006457.jpg 500 438 11 76 25 495 395 8 12 2 500 438 +3203 /data/VOCdevkit/VOC2007/JPEGImages/006460.jpg 500 375 14 9 23 346 375 14 373 301 443 375 +3204 /data/VOCdevkit/VOC2007/JPEGImages/006461.jpg 500 333 8 25 202 55 310 8 46 205 125 324 8 127 209 210 327 10 28 217 211 328 +3205 /data/VOCdevkit/VOC2007/JPEGImages/006464.jpg 500 375 14 57 75 297 375 14 252 1 500 375 +3206 /data/VOCdevkit/VOC2007/JPEGImages/006467.jpg 500 375 1 16 40 481 342 +3207 /data/VOCdevkit/VOC2007/JPEGImages/006469.jpg 500 375 13 165 208 274 284 13 121 218 153 281 13 74 224 116 282 6 1 165 79 229 14 100 163 136 227 14 206 157 258 284 14 258 206 341 305 6 141 168 210 196 +3208 /data/VOCdevkit/VOC2007/JPEGImages/006471.jpg 500 375 14 61 39 95 80 14 100 58 121 91 14 255 157 278 186 14 298 114 311 151 14 349 252 372 283 +3209 /data/VOCdevkit/VOC2007/JPEGImages/006477.jpg 375 500 8 7 267 72 401 8 306 265 375 430 14 124 207 247 468 14 146 221 260 454 +3210 /data/VOCdevkit/VOC2007/JPEGImages/006478.jpg 500 375 12 401 192 471 238 12 330 187 392 234 12 157 178 189 204 12 54 170 93 201 +3211 /data/VOCdevkit/VOC2007/JPEGImages/006479.jpg 500 375 11 19 43 488 337 +3212 /data/VOCdevkit/VOC2007/JPEGImages/006481.jpg 500 333 6 74 29 443 324 14 412 7 436 163 14 383 26 412 136 14 330 7 366 98 14 355 17 383 82 +3213 /data/VOCdevkit/VOC2007/JPEGImages/006485.jpg 500 335 18 204 127 289 236 +3214 /data/VOCdevkit/VOC2007/JPEGImages/006487.jpg 500 332 14 113 10 340 332 11 209 129 383 278 17 119 59 500 332 +3215 /data/VOCdevkit/VOC2007/JPEGImages/006489.jpg 500 333 14 104 90 351 331 14 217 72 499 331 +3216 /data/VOCdevkit/VOC2007/JPEGImages/006490.jpg 269 358 2 80 309 109 332 14 143 165 169 248 3 210 9 269 67 3 172 27 226 65 +3217 /data/VOCdevkit/VOC2007/JPEGImages/006491.jpg 500 171 16 173 27 219 116 16 297 31 363 114 +3218 /data/VOCdevkit/VOC2007/JPEGImages/006493.jpg 500 333 6 93 126 500 284 14 65 97 82 135 +3219 /data/VOCdevkit/VOC2007/JPEGImages/006494.jpg 375 500 7 61 101 298 488 +3220 /data/VOCdevkit/VOC2007/JPEGImages/006496.jpg 375 500 15 64 220 95 276 15 95 173 158 324 15 41 1 375 500 +3221 /data/VOCdevkit/VOC2007/JPEGImages/006498.jpg 375 500 7 1 34 270 500 +3222 /data/VOCdevkit/VOC2007/JPEGImages/006500.jpg 500 333 4 288 224 330 328 4 233 216 270 314 4 186 207 224 297 4 146 200 183 285 4 111 195 144 273 4 69 161 108 266 4 34 156 72 257 4 11 155 40 250 4 1 151 19 241 4 371 95 415 217 4 326 94 367 213 4 289 94 327 203 4 252 92 290 202 4 225 95 257 188 4 190 93 225 191 4 167 96 195 185 4 141 94 169 186 4 107 98 142 179 4 290 171 332 231 4 210 161 247 282 4 154 158 197 232 4 110 153 149 224 4 86 100 114 178 4 63 98 94 176 4 46 99 69 151 4 384 1 429 128 4 338 1 382 128 4 295 1 344 132 4 252 1 288 128 4 213 1 249 125 4 177 3 213 123 4 149 6 179 124 4 127 9 156 125 4 106 11 132 121 4 81 11 111 119 4 61 11 88 120 4 13 19 40 98 +3223 /data/VOCdevkit/VOC2007/JPEGImages/006502.jpg 500 375 6 55 108 451 298 +3224 /data/VOCdevkit/VOC2007/JPEGImages/006504.jpg 375 500 17 4 224 213 500 +3225 /data/VOCdevkit/VOC2007/JPEGImages/006505.jpg 500 277 17 5 51 494 277 14 1 33 188 256 14 132 10 321 277 14 266 12 495 277 +3226 /data/VOCdevkit/VOC2007/JPEGImages/006508.jpg 500 333 2 108 202 256 277 14 116 1 479 331 14 30 12 173 333 +3227 /data/VOCdevkit/VOC2007/JPEGImages/006510.jpg 500 375 6 75 110 437 293 +3228 /data/VOCdevkit/VOC2007/JPEGImages/006511.jpg 500 332 12 8 2 497 332 +3229 /data/VOCdevkit/VOC2007/JPEGImages/006513.jpg 333 500 18 147 305 284 378 +3230 /data/VOCdevkit/VOC2007/JPEGImages/006514.jpg 375 500 14 120 230 267 500 8 133 206 258 453 +3231 /data/VOCdevkit/VOC2007/JPEGImages/006516.jpg 500 375 17 43 227 205 375 17 347 218 500 375 +3232 /data/VOCdevkit/VOC2007/JPEGImages/006517.jpg 500 334 14 10 229 39 275 14 280 203 430 334 14 219 241 284 334 14 19 210 106 296 14 5 163 217 334 14 194 134 312 303 +3233 /data/VOCdevkit/VOC2007/JPEGImages/006518.jpg 500 375 1 1 45 493 372 1 54 24 500 326 +3234 /data/VOCdevkit/VOC2007/JPEGImages/006521.jpg 500 375 14 205 128 298 273 12 221 195 284 351 +3235 /data/VOCdevkit/VOC2007/JPEGImages/006522.jpg 500 375 12 35 82 500 375 +3236 /data/VOCdevkit/VOC2007/JPEGImages/006525.jpg 375 500 6 3 310 168 433 +3237 /data/VOCdevkit/VOC2007/JPEGImages/006526.jpg 500 333 14 168 2 500 331 +3238 /data/VOCdevkit/VOC2007/JPEGImages/006527.jpg 500 332 6 2 15 99 55 6 327 23 459 68 14 132 5 149 44 14 113 6 126 42 14 98 2 116 45 +3239 /data/VOCdevkit/VOC2007/JPEGImages/006528.jpg 500 357 3 168 1 500 210 +3240 /data/VOCdevkit/VOC2007/JPEGImages/006531.jpg 500 364 13 209 256 231 297 14 210 240 227 262 +3241 /data/VOCdevkit/VOC2007/JPEGImages/006533.jpg 500 333 0 196 168 354 209 +3242 /data/VOCdevkit/VOC2007/JPEGImages/006535.jpg 375 500 2 66 33 177 348 2 202 211 294 419 +3243 /data/VOCdevkit/VOC2007/JPEGImages/006537.jpg 500 333 11 100 2 500 313 +3244 /data/VOCdevkit/VOC2007/JPEGImages/006539.jpg 500 375 14 260 112 500 375 14 2 45 234 375 +3245 /data/VOCdevkit/VOC2007/JPEGImages/006540.jpg 332 500 14 147 138 216 329 12 78 187 264 392 +3246 /data/VOCdevkit/VOC2007/JPEGImages/006541.jpg 425 319 8 89 244 140 319 8 145 265 198 319 8 3 246 55 315 10 101 227 193 311 10 144 245 258 319 10 218 267 350 319 10 1 226 60 298 +3247 /data/VOCdevkit/VOC2007/JPEGImages/006544.jpg 500 500 1 78 284 483 500 14 107 88 374 495 14 353 101 437 233 14 422 114 500 241 +3248 /data/VOCdevkit/VOC2007/JPEGImages/006545.jpg 500 281 7 75 7 362 277 +3249 /data/VOCdevkit/VOC2007/JPEGImages/006546.jpg 500 375 10 22 149 482 375 14 378 124 500 303 14 290 85 429 223 14 332 84 383 175 14 220 46 286 146 14 2 115 164 322 14 101 107 173 213 14 145 85 206 166 14 90 46 134 140 +3250 /data/VOCdevkit/VOC2007/JPEGImages/006552.jpg 500 333 14 150 22 436 277 14 255 58 320 211 14 225 156 257 197 14 85 160 141 255 14 1 67 122 333 +3251 /data/VOCdevkit/VOC2007/JPEGImages/006554.jpg 500 329 18 1 112 437 318 +3252 /data/VOCdevkit/VOC2007/JPEGImages/006555.jpg 500 359 12 185 201 405 359 12 1 28 481 359 +3253 /data/VOCdevkit/VOC2007/JPEGImages/006557.jpg 500 375 16 175 158 260 321 16 250 152 373 325 +3254 /data/VOCdevkit/VOC2007/JPEGImages/006558.jpg 480 360 7 1 96 349 325 +3255 /data/VOCdevkit/VOC2007/JPEGImages/006559.jpg 335 500 14 59 98 278 479 +3256 /data/VOCdevkit/VOC2007/JPEGImages/006561.jpg 500 343 13 56 77 447 310 14 163 9 376 252 +3257 /data/VOCdevkit/VOC2007/JPEGImages/006563.jpg 333 500 14 164 221 224 362 +3258 /data/VOCdevkit/VOC2007/JPEGImages/006566.jpg 207 298 14 53 4 204 236 14 31 42 138 241 +3259 /data/VOCdevkit/VOC2007/JPEGImages/006567.jpg 500 375 13 13 174 55 237 6 184 163 272 190 14 270 142 291 192 14 287 145 312 199 14 118 146 171 293 14 86 152 125 282 13 242 180 406 300 +3260 /data/VOCdevkit/VOC2007/JPEGImages/006568.jpg 375 500 11 1 86 357 500 +3261 /data/VOCdevkit/VOC2007/JPEGImages/006571.jpg 500 375 7 25 82 278 252 11 160 1 453 336 +3262 /data/VOCdevkit/VOC2007/JPEGImages/006573.jpg 500 375 9 44 1 414 375 +3263 /data/VOCdevkit/VOC2007/JPEGImages/006574.jpg 500 375 14 99 126 334 375 14 111 60 358 375 14 3 151 118 375 14 401 174 500 373 19 75 111 143 180 +3264 /data/VOCdevkit/VOC2007/JPEGImages/006577.jpg 500 375 0 1 99 339 361 14 349 142 362 204 14 424 158 451 229 +3265 /data/VOCdevkit/VOC2007/JPEGImages/006579.jpg 288 352 9 144 5 237 131 +3266 /data/VOCdevkit/VOC2007/JPEGImages/006580.jpg 500 375 11 375 240 415 283 11 119 235 188 291 11 114 226 178 287 11 92 220 125 273 14 434 195 487 291 14 363 180 380 218 14 318 177 361 293 14 266 178 277 217 14 210 167 277 345 14 171 167 217 262 14 9 159 93 375 +3267 /data/VOCdevkit/VOC2007/JPEGImages/006581.jpg 374 500 1 94 323 246 479 1 162 299 293 477 6 78 209 102 231 +3268 /data/VOCdevkit/VOC2007/JPEGImages/006582.jpg 500 375 2 3 11 397 375 +3269 /data/VOCdevkit/VOC2007/JPEGImages/006586.jpg 500 333 14 215 67 306 290 12 62 160 436 332 +3270 /data/VOCdevkit/VOC2007/JPEGImages/006589.jpg 500 375 9 222 133 359 224 +3271 /data/VOCdevkit/VOC2007/JPEGImages/006590.jpg 500 317 6 2 1 491 301 +3272 /data/VOCdevkit/VOC2007/JPEGImages/006591.jpg 500 333 9 217 185 341 332 14 208 153 235 216 14 188 152 207 215 +3273 /data/VOCdevkit/VOC2007/JPEGImages/006592.jpg 500 375 0 2 122 499 232 14 214 188 238 248 +3274 /data/VOCdevkit/VOC2007/JPEGImages/006594.jpg 330 500 1 76 130 255 288 1 1 188 84 295 1 260 208 330 311 14 1 171 75 330 14 84 143 238 382 14 292 172 330 260 +3275 /data/VOCdevkit/VOC2007/JPEGImages/006596.jpg 500 374 7 15 127 500 374 7 214 95 479 215 +3276 /data/VOCdevkit/VOC2007/JPEGImages/006598.jpg 500 375 14 87 1 500 322 +3277 /data/VOCdevkit/VOC2007/JPEGImages/006600.jpg 500 375 18 217 63 499 199 +3278 /data/VOCdevkit/VOC2007/JPEGImages/006601.jpg 500 375 5 128 107 363 290 +3279 /data/VOCdevkit/VOC2007/JPEGImages/006604.jpg 500 375 3 24 135 100 219 3 379 148 416 217 +3280 /data/VOCdevkit/VOC2007/JPEGImages/006607.jpg 500 375 11 25 1 459 375 +3281 /data/VOCdevkit/VOC2007/JPEGImages/006608.jpg 500 375 1 23 61 436 317 14 259 1 357 223 14 340 1 447 163 14 388 1 500 375 +3282 /data/VOCdevkit/VOC2007/JPEGImages/006613.jpg 500 334 13 321 170 435 279 14 85 16 139 95 +3283 /data/VOCdevkit/VOC2007/JPEGImages/006614.jpg 326 500 14 175 276 320 500 +3284 /data/VOCdevkit/VOC2007/JPEGImages/006615.jpg 500 375 14 1 49 345 375 +3285 /data/VOCdevkit/VOC2007/JPEGImages/006616.jpg 364 500 14 43 79 364 500 +3286 /data/VOCdevkit/VOC2007/JPEGImages/006620.jpg 333 500 1 139 29 220 292 14 193 1 323 297 +3287 /data/VOCdevkit/VOC2007/JPEGImages/006623.jpg 332 500 12 145 106 271 432 14 31 114 183 439 +3288 /data/VOCdevkit/VOC2007/JPEGImages/006624.jpg 500 375 19 208 11 263 76 14 370 128 432 336 14 295 153 388 262 14 111 149 187 229 +3289 /data/VOCdevkit/VOC2007/JPEGImages/006629.jpg 500 333 18 51 1 500 296 14 118 125 209 333 14 20 133 61 212 +3290 /data/VOCdevkit/VOC2007/JPEGImages/006630.jpg 500 375 19 252 51 410 195 8 263 221 500 375 +3291 /data/VOCdevkit/VOC2007/JPEGImages/006633.jpg 500 375 14 232 79 437 371 8 285 149 455 373 19 59 134 132 265 19 1 113 38 236 +3292 /data/VOCdevkit/VOC2007/JPEGImages/006634.jpg 500 375 6 147 216 448 335 +3293 /data/VOCdevkit/VOC2007/JPEGImages/006639.jpg 500 392 2 85 79 343 234 +3294 /data/VOCdevkit/VOC2007/JPEGImages/006640.jpg 333 500 2 25 22 179 466 2 179 49 300 500 +3295 /data/VOCdevkit/VOC2007/JPEGImages/006641.jpg 500 375 7 1 2 408 375 +3296 /data/VOCdevkit/VOC2007/JPEGImages/006642.jpg 500 375 2 145 162 309 271 +3297 /data/VOCdevkit/VOC2007/JPEGImages/006644.jpg 500 375 14 135 96 240 375 14 222 84 309 374 14 285 78 377 375 +3298 /data/VOCdevkit/VOC2007/JPEGImages/006646.jpg 375 500 19 266 295 312 362 8 40 321 122 481 14 38 271 117 461 14 163 295 269 436 15 124 259 160 374 +3299 /data/VOCdevkit/VOC2007/JPEGImages/006649.jpg 500 333 12 282 216 371 326 +3300 /data/VOCdevkit/VOC2007/JPEGImages/006650.jpg 500 334 2 195 116 346 291 +3301 /data/VOCdevkit/VOC2007/JPEGImages/006651.jpg 500 375 0 4 96 457 296 +3302 /data/VOCdevkit/VOC2007/JPEGImages/006653.jpg 500 375 6 26 102 491 354 +3303 /data/VOCdevkit/VOC2007/JPEGImages/006655.jpg 333 500 11 43 161 323 391 +3304 /data/VOCdevkit/VOC2007/JPEGImages/006656.jpg 500 375 14 416 1 500 64 14 306 71 500 375 14 2 2 311 375 +3305 /data/VOCdevkit/VOC2007/JPEGImages/006659.jpg 500 375 3 180 99 231 305 14 404 143 500 375 14 248 213 397 375 14 219 192 300 375 +3306 /data/VOCdevkit/VOC2007/JPEGImages/006662.jpg 500 375 8 34 223 209 375 4 311 194 348 312 14 37 129 199 375 14 266 99 358 276 +3307 /data/VOCdevkit/VOC2007/JPEGImages/006663.jpg 500 313 14 227 15 293 95 14 351 59 500 286 14 11 61 191 241 14 1 162 162 313 14 329 23 447 148 14 332 17 404 105 14 84 11 186 146 14 57 20 164 170 10 90 76 472 313 +3308 /data/VOCdevkit/VOC2007/JPEGImages/006665.jpg 335 500 18 201 61 241 192 +3309 /data/VOCdevkit/VOC2007/JPEGImages/006669.jpg 500 339 18 26 64 500 320 14 28 132 51 202 14 13 131 33 205 +3310 /data/VOCdevkit/VOC2007/JPEGImages/006672.jpg 320 216 14 108 16 173 126 12 87 42 198 216 +3311 /data/VOCdevkit/VOC2007/JPEGImages/006675.jpg 500 375 7 34 116 463 250 +3312 /data/VOCdevkit/VOC2007/JPEGImages/006676.jpg 500 375 17 326 163 500 344 8 48 156 173 275 +3313 /data/VOCdevkit/VOC2007/JPEGImages/006680.jpg 500 375 18 33 11 459 359 +3314 /data/VOCdevkit/VOC2007/JPEGImages/006683.jpg 500 375 2 29 20 357 372 +3315 /data/VOCdevkit/VOC2007/JPEGImages/006685.jpg 500 375 6 48 138 469 322 +3316 /data/VOCdevkit/VOC2007/JPEGImages/006686.jpg 500 375 14 1 162 232 342 14 146 146 435 367 17 40 150 476 375 14 459 307 500 351 14 479 258 500 302 +3317 /data/VOCdevkit/VOC2007/JPEGImages/006688.jpg 500 374 7 68 52 500 288 19 98 223 500 374 +3318 /data/VOCdevkit/VOC2007/JPEGImages/006691.jpg 500 375 15 290 106 447 302 15 51 64 263 326 +3319 /data/VOCdevkit/VOC2007/JPEGImages/006692.jpg 500 333 14 1 1 284 331 +3320 /data/VOCdevkit/VOC2007/JPEGImages/006693.jpg 500 375 6 65 96 288 220 6 302 82 500 184 14 433 60 456 83 14 487 53 500 84 14 458 63 474 83 14 273 71 302 156 14 250 80 266 107 14 225 77 238 96 14 207 80 227 98 14 86 83 119 124 14 37 90 65 169 14 6 96 34 171 14 203 104 226 128 14 131 103 173 136 +3321 /data/VOCdevkit/VOC2007/JPEGImages/006700.jpg 500 375 15 143 1 349 347 +3322 /data/VOCdevkit/VOC2007/JPEGImages/006701.jpg 333 500 1 1 154 333 494 +3323 /data/VOCdevkit/VOC2007/JPEGImages/006705.jpg 500 375 8 128 147 257 224 14 191 200 286 282 +3324 /data/VOCdevkit/VOC2007/JPEGImages/006710.jpg 500 375 14 202 85 287 375 14 258 67 418 375 14 412 100 466 262 14 108 57 215 375 14 468 117 500 231 +3325 /data/VOCdevkit/VOC2007/JPEGImages/006711.jpg 500 375 9 72 59 326 179 +3326 /data/VOCdevkit/VOC2007/JPEGImages/006712.jpg 333 500 15 38 42 288 444 +3327 /data/VOCdevkit/VOC2007/JPEGImages/006713.jpg 333 500 0 1 168 331 271 14 142 128 238 383 14 130 215 256 500 14 11 259 136 500 +3328 /data/VOCdevkit/VOC2007/JPEGImages/006715.jpg 364 500 18 36 39 335 461 +3329 /data/VOCdevkit/VOC2007/JPEGImages/006716.jpg 500 375 2 263 151 449 268 2 163 118 339 236 2 67 158 180 291 +3330 /data/VOCdevkit/VOC2007/JPEGImages/006717.jpg 500 333 6 305 159 356 194 6 128 191 201 232 +3331 /data/VOCdevkit/VOC2007/JPEGImages/006720.jpg 500 375 1 15 122 234 360 +3332 /data/VOCdevkit/VOC2007/JPEGImages/006721.jpg 500 375 8 180 15 278 107 10 1 86 500 375 +3333 /data/VOCdevkit/VOC2007/JPEGImages/006723.jpg 500 279 5 42 58 458 203 +3334 /data/VOCdevkit/VOC2007/JPEGImages/006724.jpg 500 333 6 110 131 454 285 6 121 12 422 136 +3335 /data/VOCdevkit/VOC2007/JPEGImages/006728.jpg 500 375 12 139 3 500 375 +3336 /data/VOCdevkit/VOC2007/JPEGImages/006729.jpg 500 333 14 56 22 236 333 +3337 /data/VOCdevkit/VOC2007/JPEGImages/006732.jpg 500 375 4 358 2 484 90 14 52 14 500 368 14 1 257 137 374 +3338 /data/VOCdevkit/VOC2007/JPEGImages/006733.jpg 500 375 6 1 39 363 372 6 290 84 500 226 +3339 /data/VOCdevkit/VOC2007/JPEGImages/006737.jpg 500 333 14 220 35 383 272 1 252 156 357 316 +3340 /data/VOCdevkit/VOC2007/JPEGImages/006741.jpg 500 375 6 66 149 372 319 +3341 /data/VOCdevkit/VOC2007/JPEGImages/006742.jpg 500 400 14 189 31 500 400 19 3 140 189 312 +3342 /data/VOCdevkit/VOC2007/JPEGImages/006743.jpg 500 375 19 89 168 184 291 7 235 276 327 313 8 1 194 35 356 +3343 /data/VOCdevkit/VOC2007/JPEGImages/006744.jpg 500 375 14 146 124 369 375 14 90 1 500 374 +3344 /data/VOCdevkit/VOC2007/JPEGImages/006745.jpg 500 332 8 263 189 347 264 8 159 156 203 211 8 102 218 178 320 +3345 /data/VOCdevkit/VOC2007/JPEGImages/006746.jpg 500 334 14 323 93 366 161 14 292 97 324 198 14 256 98 302 222 14 123 42 259 333 +3346 /data/VOCdevkit/VOC2007/JPEGImages/006749.jpg 500 375 6 31 99 425 309 +3347 /data/VOCdevkit/VOC2007/JPEGImages/006750.jpg 500 281 15 176 16 198 84 15 162 33 192 92 +3348 /data/VOCdevkit/VOC2007/JPEGImages/006752.jpg 500 375 0 213 145 280 221 +3349 /data/VOCdevkit/VOC2007/JPEGImages/006754.jpg 500 375 6 22 32 496 301 +3350 /data/VOCdevkit/VOC2007/JPEGImages/006756.jpg 322 500 12 82 190 202 418 +3351 /data/VOCdevkit/VOC2007/JPEGImages/006757.jpg 500 375 6 60 68 399 310 6 339 2 500 228 6 1 69 54 174 14 267 35 313 97 14 53 50 76 117 6 281 31 368 129 +3352 /data/VOCdevkit/VOC2007/JPEGImages/006758.jpg 500 374 0 147 83 235 124 0 194 256 479 353 0 57 290 167 343 +3353 /data/VOCdevkit/VOC2007/JPEGImages/006763.jpg 500 348 18 1 108 345 239 +3354 /data/VOCdevkit/VOC2007/JPEGImages/006764.jpg 500 375 17 27 85 500 371 14 93 166 495 287 +3355 /data/VOCdevkit/VOC2007/JPEGImages/006767.jpg 500 375 11 180 239 248 329 14 249 131 324 329 +3356 /data/VOCdevkit/VOC2007/JPEGImages/006770.jpg 500 375 9 225 157 387 294 +3357 /data/VOCdevkit/VOC2007/JPEGImages/006771.jpg 500 333 14 3 81 193 333 14 212 68 298 192 14 353 70 426 184 14 374 111 500 332 14 421 2 498 150 14 115 67 213 213 10 114 163 429 330 19 279 53 332 117 +3358 /data/VOCdevkit/VOC2007/JPEGImages/006774.jpg 500 375 7 44 114 433 284 8 4 3 500 374 19 103 1 260 91 +3359 /data/VOCdevkit/VOC2007/JPEGImages/006775.jpg 500 333 1 102 179 217 333 14 95 13 242 292 +3360 /data/VOCdevkit/VOC2007/JPEGImages/006776.jpg 500 375 15 271 144 446 363 15 363 64 461 232 +3361 /data/VOCdevkit/VOC2007/JPEGImages/006778.jpg 500 375 2 192 25 309 368 2 246 116 411 375 +3362 /data/VOCdevkit/VOC2007/JPEGImages/006779.jpg 500 320 12 9 55 459 307 14 217 26 353 129 +3363 /data/VOCdevkit/VOC2007/JPEGImages/006780.jpg 335 500 8 3 54 332 363 14 58 21 296 458 +3364 /data/VOCdevkit/VOC2007/JPEGImages/006785.jpg 500 375 6 3 10 485 308 +3365 /data/VOCdevkit/VOC2007/JPEGImages/006787.jpg 333 500 14 142 17 267 199 14 27 79 174 244 14 2 176 147 334 14 1 281 210 471 14 156 144 325 307 +3366 /data/VOCdevkit/VOC2007/JPEGImages/006788.jpg 500 375 14 74 104 239 375 +3367 /data/VOCdevkit/VOC2007/JPEGImages/006790.jpg 500 333 6 273 188 485 305 +3368 /data/VOCdevkit/VOC2007/JPEGImages/006791.jpg 500 341 11 55 19 476 329 +3369 /data/VOCdevkit/VOC2007/JPEGImages/006792.jpg 375 500 14 131 172 250 440 8 215 37 326 221 8 280 89 375 298 +3370 /data/VOCdevkit/VOC2007/JPEGImages/006793.jpg 320 216 12 111 29 175 211 14 109 11 193 139 +3371 /data/VOCdevkit/VOC2007/JPEGImages/006795.jpg 500 335 8 306 186 442 322 15 35 125 175 247 +3372 /data/VOCdevkit/VOC2007/JPEGImages/006796.jpg 500 331 13 125 91 348 298 14 146 41 345 283 13 1 32 54 104 13 33 26 93 102 13 82 35 134 102 13 128 28 164 106 13 166 42 265 100 13 343 43 366 100 13 360 42 397 98 13 390 35 462 99 +3373 /data/VOCdevkit/VOC2007/JPEGImages/006798.jpg 375 500 19 237 217 304 292 15 1 309 95 499 +3374 /data/VOCdevkit/VOC2007/JPEGImages/006801.jpg 500 375 7 82 126 500 295 +3375 /data/VOCdevkit/VOC2007/JPEGImages/006804.jpg 375 500 14 156 261 265 461 14 181 191 253 299 14 232 143 295 245 14 199 167 238 199 +3376 /data/VOCdevkit/VOC2007/JPEGImages/006807.jpg 500 375 15 2 1 500 373 +3377 /data/VOCdevkit/VOC2007/JPEGImages/006809.jpg 500 375 14 128 96 341 374 +3378 /data/VOCdevkit/VOC2007/JPEGImages/006811.jpg 320 226 12 111 52 188 218 14 114 15 194 148 +3379 /data/VOCdevkit/VOC2007/JPEGImages/006812.jpg 500 375 2 47 3 309 339 2 146 59 387 210 +3380 /data/VOCdevkit/VOC2007/JPEGImages/006815.jpg 500 289 11 216 123 431 248 16 126 90 299 226 +3381 /data/VOCdevkit/VOC2007/JPEGImages/006816.jpg 375 500 17 30 217 294 482 15 118 5 216 267 +3382 /data/VOCdevkit/VOC2007/JPEGImages/006817.jpg 500 333 19 170 110 227 195 19 226 111 302 195 19 334 105 391 196 +3383 /data/VOCdevkit/VOC2007/JPEGImages/006818.jpg 500 333 7 216 144 485 328 +3384 /data/VOCdevkit/VOC2007/JPEGImages/006820.jpg 500 375 7 100 1 500 374 +3385 /data/VOCdevkit/VOC2007/JPEGImages/006823.jpg 500 375 13 90 155 425 369 14 181 51 347 327 +3386 /data/VOCdevkit/VOC2007/JPEGImages/006826.jpg 500 375 8 114 148 171 326 8 228 143 288 252 8 194 138 259 240 10 98 152 277 266 17 281 146 500 262 8 297 196 500 375 +3387 /data/VOCdevkit/VOC2007/JPEGImages/006830.jpg 500 375 10 1 180 109 366 14 227 128 448 375 14 67 120 230 375 14 1 92 43 182 14 130 92 383 375 +3388 /data/VOCdevkit/VOC2007/JPEGImages/006831.jpg 500 375 1 8 62 479 345 +3389 /data/VOCdevkit/VOC2007/JPEGImages/006832.jpg 500 333 16 91 1 500 333 +3390 /data/VOCdevkit/VOC2007/JPEGImages/006834.jpg 457 363 2 206 29 444 363 +3391 /data/VOCdevkit/VOC2007/JPEGImages/006837.jpg 500 320 16 25 195 63 238 +3392 /data/VOCdevkit/VOC2007/JPEGImages/006843.jpg 500 375 15 274 188 315 240 15 193 184 238 238 14 234 136 267 241 +3393 /data/VOCdevkit/VOC2007/JPEGImages/006846.jpg 375 500 11 106 94 331 470 +3394 /data/VOCdevkit/VOC2007/JPEGImages/006851.jpg 432 500 2 95 122 105 141 2 84 150 94 172 +3395 /data/VOCdevkit/VOC2007/JPEGImages/006853.jpg 500 375 6 14 43 489 329 +3396 /data/VOCdevkit/VOC2007/JPEGImages/006854.jpg 375 500 6 2 18 375 426 6 313 22 375 83 14 1 12 77 80 +3397 /data/VOCdevkit/VOC2007/JPEGImages/006856.jpg 375 500 14 52 118 278 432 +3398 /data/VOCdevkit/VOC2007/JPEGImages/006857.jpg 500 334 14 151 110 263 333 14 73 135 178 334 14 442 124 500 334 +3399 /data/VOCdevkit/VOC2007/JPEGImages/006861.jpg 500 335 1 1 214 379 335 14 342 2 500 335 15 263 189 326 274 15 171 147 267 276 +3400 /data/VOCdevkit/VOC2007/JPEGImages/006863.jpg 500 333 12 370 132 500 266 12 244 129 404 287 12 134 138 313 265 14 408 114 469 225 14 274 114 359 194 14 192 113 269 207 +3401 /data/VOCdevkit/VOC2007/JPEGImages/006870.jpg 500 375 11 1 11 442 311 +3402 /data/VOCdevkit/VOC2007/JPEGImages/006871.jpg 500 333 7 185 57 500 333 +3403 /data/VOCdevkit/VOC2007/JPEGImages/006872.jpg 500 375 14 92 71 389 302 +3404 /data/VOCdevkit/VOC2007/JPEGImages/006873.jpg 480 424 12 69 95 411 276 14 209 56 325 194 +3405 /data/VOCdevkit/VOC2007/JPEGImages/006875.jpg 375 480 12 145 78 253 458 14 125 86 278 293 +3406 /data/VOCdevkit/VOC2007/JPEGImages/006877.jpg 333 500 11 34 82 244 408 +3407 /data/VOCdevkit/VOC2007/JPEGImages/006879.jpg 375 500 14 25 70 82 348 14 36 100 207 500 14 172 90 326 500 14 1 145 19 216 +3408 /data/VOCdevkit/VOC2007/JPEGImages/006881.jpg 500 349 9 114 2 500 349 +3409 /data/VOCdevkit/VOC2007/JPEGImages/006882.jpg 500 375 6 63 94 483 289 14 252 259 401 375 +3410 /data/VOCdevkit/VOC2007/JPEGImages/006885.jpg 500 375 1 277 176 333 213 1 153 184 192 209 14 286 152 320 196 14 161 170 185 200 14 131 158 150 177 +3411 /data/VOCdevkit/VOC2007/JPEGImages/006888.jpg 500 333 0 2 24 500 239 0 132 16 500 139 +3412 /data/VOCdevkit/VOC2007/JPEGImages/006889.jpg 500 333 3 354 174 482 211 +3413 /data/VOCdevkit/VOC2007/JPEGImages/006890.jpg 500 447 6 11 40 500 311 +3414 /data/VOCdevkit/VOC2007/JPEGImages/006891.jpg 500 375 14 188 2 436 375 14 50 110 186 375 +3415 /data/VOCdevkit/VOC2007/JPEGImages/006894.jpg 500 375 7 183 51 500 340 14 1 1 209 242 +3416 /data/VOCdevkit/VOC2007/JPEGImages/006895.jpg 500 375 8 20 188 178 360 17 217 196 500 375 +3417 /data/VOCdevkit/VOC2007/JPEGImages/006897.jpg 480 479 12 83 121 385 411 14 175 100 311 261 +3418 /data/VOCdevkit/VOC2007/JPEGImages/006898.jpg 375 500 14 216 274 308 500 14 1 359 63 490 +3419 /data/VOCdevkit/VOC2007/JPEGImages/006901.jpg 500 500 14 111 56 217 277 14 266 77 396 283 +3420 /data/VOCdevkit/VOC2007/JPEGImages/006902.jpg 500 333 11 135 100 352 295 15 309 1 397 117 +3421 /data/VOCdevkit/VOC2007/JPEGImages/006904.jpg 500 332 14 288 101 500 332 +3422 /data/VOCdevkit/VOC2007/JPEGImages/006905.jpg 500 375 14 130 1 500 374 +3423 /data/VOCdevkit/VOC2007/JPEGImages/006906.jpg 500 375 14 332 234 450 375 14 175 161 268 375 14 118 95 339 375 14 360 150 407 213 14 426 125 478 200 14 272 43 312 103 14 185 61 208 115 14 80 47 138 248 14 1 58 73 255 +3424 /data/VOCdevkit/VOC2007/JPEGImages/006907.jpg 375 500 6 42 327 349 419 +3425 /data/VOCdevkit/VOC2007/JPEGImages/006913.jpg 500 333 5 41 122 443 231 +3426 /data/VOCdevkit/VOC2007/JPEGImages/006915.jpg 500 375 11 87 50 371 313 11 279 181 463 375 14 366 1 489 206 +3427 /data/VOCdevkit/VOC2007/JPEGImages/006920.jpg 500 323 13 57 143 287 268 13 325 145 490 254 14 283 103 394 243 14 40 116 143 261 14 194 84 267 193 +3428 /data/VOCdevkit/VOC2007/JPEGImages/006921.jpg 500 375 13 109 149 258 319 14 247 124 294 202 13 206 184 310 274 14 71 206 154 305 14 320 118 373 328 +3429 /data/VOCdevkit/VOC2007/JPEGImages/006923.jpg 500 375 8 126 149 207 275 8 265 136 372 286 10 11 181 172 311 +3430 /data/VOCdevkit/VOC2007/JPEGImages/006925.jpg 500 375 6 12 177 109 230 6 275 169 396 235 6 348 164 500 368 +3431 /data/VOCdevkit/VOC2007/JPEGImages/006926.jpg 500 448 14 32 66 254 438 14 276 71 450 439 +3432 /data/VOCdevkit/VOC2007/JPEGImages/006927.jpg 500 375 2 278 120 480 375 14 1 1 408 375 +3433 /data/VOCdevkit/VOC2007/JPEGImages/006928.jpg 500 425 11 195 1 499 375 +3434 /data/VOCdevkit/VOC2007/JPEGImages/006929.jpg 500 375 2 89 95 281 313 +3435 /data/VOCdevkit/VOC2007/JPEGImages/006936.jpg 500 334 12 124 179 398 334 14 227 52 346 313 +3436 /data/VOCdevkit/VOC2007/JPEGImages/006937.jpg 375 500 17 24 217 189 418 15 113 129 199 266 +3437 /data/VOCdevkit/VOC2007/JPEGImages/006938.jpg 500 375 14 4 158 131 375 14 432 122 500 371 14 404 173 489 326 14 118 120 331 375 +3438 /data/VOCdevkit/VOC2007/JPEGImages/006941.jpg 500 375 10 71 203 359 375 14 320 170 500 375 14 366 140 500 294 14 333 145 406 217 14 463 75 500 191 14 167 145 264 240 14 82 147 204 329 14 2 162 157 375 14 134 123 190 177 +3439 /data/VOCdevkit/VOC2007/JPEGImages/006942.jpg 500 333 1 47 22 461 327 +3440 /data/VOCdevkit/VOC2007/JPEGImages/006946.jpg 500 333 0 7 2 489 308 +3441 /data/VOCdevkit/VOC2007/JPEGImages/006951.jpg 500 375 13 137 109 451 290 14 205 81 359 276 +3442 /data/VOCdevkit/VOC2007/JPEGImages/006954.jpg 500 375 14 232 88 394 375 14 195 159 329 375 14 2 78 241 375 14 214 5 349 196 8 4 115 189 375 +3443 /data/VOCdevkit/VOC2007/JPEGImages/006955.jpg 500 333 6 320 121 370 142 6 374 125 433 150 6 2 125 466 333 +3444 /data/VOCdevkit/VOC2007/JPEGImages/006957.jpg 500 375 14 135 231 289 375 14 129 180 295 375 14 277 200 363 351 14 339 138 497 375 +3445 /data/VOCdevkit/VOC2007/JPEGImages/006960.jpg 500 374 7 203 52 415 307 7 25 151 316 356 +3446 /data/VOCdevkit/VOC2007/JPEGImages/006961.jpg 333 500 11 1 1 333 500 +3447 /data/VOCdevkit/VOC2007/JPEGImages/006964.jpg 500 375 14 338 104 486 375 14 258 239 408 373 14 104 228 291 375 14 38 36 189 371 14 147 39 212 169 14 191 94 290 320 14 266 71 358 243 +3448 /data/VOCdevkit/VOC2007/JPEGImages/006967.jpg 365 500 2 158 158 247 312 +3449 /data/VOCdevkit/VOC2007/JPEGImages/006969.jpg 500 375 11 119 45 439 349 +3450 /data/VOCdevkit/VOC2007/JPEGImages/006970.jpg 375 500 6 60 298 372 397 +3451 /data/VOCdevkit/VOC2007/JPEGImages/006973.jpg 500 333 9 48 2 413 323 9 314 55 500 247 +3452 /data/VOCdevkit/VOC2007/JPEGImages/006974.jpg 480 269 6 397 183 480 233 +3453 /data/VOCdevkit/VOC2007/JPEGImages/006975.jpg 500 333 1 75 202 210 333 14 87 50 244 333 +3454 /data/VOCdevkit/VOC2007/JPEGImages/006977.jpg 332 500 3 64 37 253 376 +3455 /data/VOCdevkit/VOC2007/JPEGImages/006978.jpg 500 375 18 2 192 298 273 +3456 /data/VOCdevkit/VOC2007/JPEGImages/006979.jpg 416 500 7 65 31 416 500 +3457 /data/VOCdevkit/VOC2007/JPEGImages/006980.jpg 500 375 10 1 5 486 375 +3458 /data/VOCdevkit/VOC2007/JPEGImages/006982.jpg 500 332 12 220 130 281 224 12 333 107 363 157 14 220 99 278 195 +3459 /data/VOCdevkit/VOC2007/JPEGImages/006984.jpg 400 300 19 365 62 400 97 19 310 61 342 90 19 255 60 286 87 19 209 59 241 82 19 165 57 190 82 19 84 67 121 97 19 34 72 79 103 19 1 77 28 115 19 46 104 127 174 19 124 92 187 145 19 185 83 231 127 19 218 77 256 113 8 161 234 314 300 8 257 181 354 276 8 352 118 393 185 8 303 100 344 151 8 253 118 297 167 8 234 138 290 201 +3460 /data/VOCdevkit/VOC2007/JPEGImages/006985.jpg 500 333 7 201 146 326 217 +3461 /data/VOCdevkit/VOC2007/JPEGImages/006986.jpg 333 500 5 246 28 333 113 5 87 43 214 114 14 187 32 279 484 14 71 36 195 446 +3462 /data/VOCdevkit/VOC2007/JPEGImages/006991.jpg 500 338 11 201 111 469 300 +3463 /data/VOCdevkit/VOC2007/JPEGImages/006992.jpg 500 375 5 250 139 500 269 5 140 148 254 266 5 58 160 146 262 5 17 163 65 266 +3464 /data/VOCdevkit/VOC2007/JPEGImages/006993.jpg 500 375 1 40 33 426 334 +3465 /data/VOCdevkit/VOC2007/JPEGImages/006996.jpg 420 264 6 30 74 401 255 +3466 /data/VOCdevkit/VOC2007/JPEGImages/006997.jpg 500 375 3 83 3 487 275 +3467 /data/VOCdevkit/VOC2007/JPEGImages/006998.jpg 500 333 11 1 8 445 305 +3468 /data/VOCdevkit/VOC2007/JPEGImages/006999.jpg 500 375 7 11 33 381 375 +3469 /data/VOCdevkit/VOC2007/JPEGImages/007000.jpg 500 375 2 268 220 362 333 14 97 15 375 375 +3470 /data/VOCdevkit/VOC2007/JPEGImages/007001.jpg 500 375 6 213 135 444 343 +3471 /data/VOCdevkit/VOC2007/JPEGImages/007005.jpg 333 500 1 43 211 236 440 14 152 150 330 348 +3472 /data/VOCdevkit/VOC2007/JPEGImages/007010.jpg 500 375 1 66 89 379 375 +3473 /data/VOCdevkit/VOC2007/JPEGImages/007012.jpg 500 332 15 355 15 397 126 +3474 /data/VOCdevkit/VOC2007/JPEGImages/007013.jpg 500 333 1 234 71 373 333 +3475 /data/VOCdevkit/VOC2007/JPEGImages/007014.jpg 500 375 6 29 63 428 359 +3476 /data/VOCdevkit/VOC2007/JPEGImages/007015.jpg 500 375 6 102 92 424 236 +3477 /data/VOCdevkit/VOC2007/JPEGImages/007017.jpg 500 375 14 21 90 200 375 14 165 68 327 375 14 316 110 458 375 11 121 175 191 298 +3478 /data/VOCdevkit/VOC2007/JPEGImages/007019.jpg 500 344 14 397 100 487 222 14 259 50 397 334 14 150 57 311 334 +3479 /data/VOCdevkit/VOC2007/JPEGImages/007024.jpg 500 375 11 111 119 180 195 +3480 /data/VOCdevkit/VOC2007/JPEGImages/007026.jpg 500 335 0 1 153 443 335 0 243 191 489 297 0 121 132 316 190 +3481 /data/VOCdevkit/VOC2007/JPEGImages/007027.jpg 500 268 7 1 55 465 239 +3482 /data/VOCdevkit/VOC2007/JPEGImages/007028.jpg 500 375 14 297 29 429 265 14 117 68 247 300 14 220 29 313 119 14 202 1 260 82 +3483 /data/VOCdevkit/VOC2007/JPEGImages/007030.jpg 500 333 1 35 199 192 308 +3484 /data/VOCdevkit/VOC2007/JPEGImages/007032.jpg 500 375 17 2 142 500 375 14 240 26 408 346 14 46 181 293 299 +3485 /data/VOCdevkit/VOC2007/JPEGImages/007034.jpg 500 401 14 64 21 268 371 6 2 68 500 378 +3486 /data/VOCdevkit/VOC2007/JPEGImages/007037.jpg 500 325 18 5 115 343 255 +3487 /data/VOCdevkit/VOC2007/JPEGImages/007041.jpg 375 500 7 1 104 375 500 +3488 /data/VOCdevkit/VOC2007/JPEGImages/007043.jpg 500 333 14 227 56 461 332 14 5 99 274 275 14 1 91 64 203 +3489 /data/VOCdevkit/VOC2007/JPEGImages/007044.jpg 375 500 9 140 170 213 344 14 193 119 305 446 14 56 141 129 290 +3490 /data/VOCdevkit/VOC2007/JPEGImages/007047.jpg 375 500 2 20 111 273 445 +3491 /data/VOCdevkit/VOC2007/JPEGImages/007051.jpg 375 500 14 152 212 265 363 +3492 /data/VOCdevkit/VOC2007/JPEGImages/007053.jpg 500 332 14 26 91 158 332 14 158 117 265 332 14 252 110 401 332 14 259 133 401 332 14 355 111 479 332 14 217 35 444 140 14 1 2 230 160 +3493 /data/VOCdevkit/VOC2007/JPEGImages/007055.jpg 500 379 12 52 48 446 338 +3494 /data/VOCdevkit/VOC2007/JPEGImages/007057.jpg 375 500 17 220 231 375 336 8 110 217 157 300 8 153 212 174 281 8 51 217 100 299 10 72 229 128 295 8 73 210 118 292 +3495 /data/VOCdevkit/VOC2007/JPEGImages/007060.jpg 500 376 14 174 122 270 297 14 355 43 375 72 14 408 49 423 73 14 458 43 472 57 14 334 59 370 107 +3496 /data/VOCdevkit/VOC2007/JPEGImages/007061.jpg 500 375 6 11 39 496 367 +3497 /data/VOCdevkit/VOC2007/JPEGImages/007063.jpg 500 375 7 190 11 500 336 +3498 /data/VOCdevkit/VOC2007/JPEGImages/007066.jpg 500 351 3 257 208 397 272 +3499 /data/VOCdevkit/VOC2007/JPEGImages/007067.jpg 333 500 17 171 287 333 394 8 1 373 115 500 8 78 270 141 341 +3500 /data/VOCdevkit/VOC2007/JPEGImages/007069.jpg 500 333 9 374 185 436 232 9 158 151 213 195 9 100 121 184 184 +3501 /data/VOCdevkit/VOC2007/JPEGImages/007076.jpg 500 334 16 152 114 314 219 +3502 /data/VOCdevkit/VOC2007/JPEGImages/007081.jpg 500 375 11 152 84 281 315 14 32 84 223 351 14 259 105 500 375 +3503 /data/VOCdevkit/VOC2007/JPEGImages/007082.jpg 500 375 6 243 192 274 216 6 217 184 238 205 +3504 /data/VOCdevkit/VOC2007/JPEGImages/007083.jpg 332 500 14 40 120 253 412 +3505 /data/VOCdevkit/VOC2007/JPEGImages/007085.jpg 500 333 18 76 128 499 187 6 436 129 495 160 +3506 /data/VOCdevkit/VOC2007/JPEGImages/007087.jpg 500 333 2 121 157 270 244 +3507 /data/VOCdevkit/VOC2007/JPEGImages/007091.jpg 500 381 3 147 244 206 262 +3508 /data/VOCdevkit/VOC2007/JPEGImages/007094.jpg 375 500 17 3 195 375 375 +3509 /data/VOCdevkit/VOC2007/JPEGImages/007096.jpg 500 332 0 51 87 496 229 +3510 /data/VOCdevkit/VOC2007/JPEGImages/007098.jpg 500 469 7 17 65 201 351 7 167 162 499 465 +3511 /data/VOCdevkit/VOC2007/JPEGImages/007099.jpg 500 375 11 171 69 385 256 +3512 /data/VOCdevkit/VOC2007/JPEGImages/007102.jpg 500 375 2 89 2 408 370 +3513 /data/VOCdevkit/VOC2007/JPEGImages/007103.jpg 336 500 14 154 274 248 382 +3514 /data/VOCdevkit/VOC2007/JPEGImages/007106.jpg 500 332 15 335 1 456 250 15 108 1 267 284 +3515 /data/VOCdevkit/VOC2007/JPEGImages/007107.jpg 500 360 18 185 152 500 264 +3516 /data/VOCdevkit/VOC2007/JPEGImages/007110.jpg 500 375 19 1 205 28 294 8 357 210 492 348 8 349 214 494 375 10 1 238 373 375 14 463 121 500 375 +3517 /data/VOCdevkit/VOC2007/JPEGImages/007111.jpg 500 338 5 143 135 428 221 +3518 /data/VOCdevkit/VOC2007/JPEGImages/007112.jpg 500 375 6 86 139 428 241 14 69 112 105 210 14 122 101 157 180 14 178 106 211 171 14 214 114 233 153 14 283 103 322 145 14 42 109 75 186 14 14 111 51 184 +3519 /data/VOCdevkit/VOC2007/JPEGImages/007115.jpg 333 500 1 1 72 332 499 +3520 /data/VOCdevkit/VOC2007/JPEGImages/007116.jpg 500 333 17 31 37 473 304 +3521 /data/VOCdevkit/VOC2007/JPEGImages/007118.jpg 448 336 9 59 91 340 335 6 349 105 433 149 +3522 /data/VOCdevkit/VOC2007/JPEGImages/007119.jpg 375 500 14 43 1 375 492 +3523 /data/VOCdevkit/VOC2007/JPEGImages/007120.jpg 500 335 14 69 199 197 333 14 249 203 315 334 14 439 218 499 332 +3524 /data/VOCdevkit/VOC2007/JPEGImages/007124.jpg 333 500 14 19 36 172 451 1 75 215 192 500 +3525 /data/VOCdevkit/VOC2007/JPEGImages/007126.jpg 500 333 14 305 36 431 332 14 192 182 298 333 14 84 206 206 333 6 1 69 143 181 +3526 /data/VOCdevkit/VOC2007/JPEGImages/007127.jpg 500 333 18 156 156 459 248 14 4 199 47 297 +3527 /data/VOCdevkit/VOC2007/JPEGImages/007131.jpg 333 500 1 16 1 316 499 +3528 /data/VOCdevkit/VOC2007/JPEGImages/007134.jpg 480 371 14 209 22 327 216 14 437 101 479 217 12 403 141 480 293 12 42 81 410 362 +3529 /data/VOCdevkit/VOC2007/JPEGImages/007135.jpg 500 333 0 206 113 306 151 +3530 /data/VOCdevkit/VOC2007/JPEGImages/007136.jpg 500 405 14 162 86 217 245 14 305 148 488 306 14 2 200 112 405 +3531 /data/VOCdevkit/VOC2007/JPEGImages/007137.jpg 500 331 14 310 99 406 264 1 392 110 500 197 1 258 119 416 233 14 117 1 189 104 14 1 11 40 128 14 22 1 135 298 14 98 151 261 331 14 1 152 107 331 14 70 45 188 313 +3532 /data/VOCdevkit/VOC2007/JPEGImages/007142.jpg 500 333 18 240 75 449 316 18 41 83 220 317 +3533 /data/VOCdevkit/VOC2007/JPEGImages/007143.jpg 500 375 6 28 118 428 238 +3534 /data/VOCdevkit/VOC2007/JPEGImages/007145.jpg 500 334 7 118 76 500 333 +3535 /data/VOCdevkit/VOC2007/JPEGImages/007151.jpg 500 375 14 183 51 326 375 +3536 /data/VOCdevkit/VOC2007/JPEGImages/007155.jpg 500 400 0 54 138 444 284 +3537 /data/VOCdevkit/VOC2007/JPEGImages/007156.jpg 500 375 5 453 115 500 231 5 310 125 454 224 5 238 153 309 212 +3538 /data/VOCdevkit/VOC2007/JPEGImages/007157.jpg 500 375 0 47 123 481 296 14 263 167 298 294 14 224 181 271 289 +3539 /data/VOCdevkit/VOC2007/JPEGImages/007158.jpg 375 500 9 36 92 375 500 +3540 /data/VOCdevkit/VOC2007/JPEGImages/007160.jpg 330 500 1 2 133 329 500 +3541 /data/VOCdevkit/VOC2007/JPEGImages/007161.jpg 333 500 14 5 57 332 500 +3542 /data/VOCdevkit/VOC2007/JPEGImages/007164.jpg 500 333 0 1 58 458 308 6 284 239 325 263 5 426 201 500 231 +3543 /data/VOCdevkit/VOC2007/JPEGImages/007169.jpg 500 375 0 58 63 387 220 +3544 /data/VOCdevkit/VOC2007/JPEGImages/007170.jpg 500 334 14 1 155 115 334 14 121 100 397 334 14 192 119 326 296 +3545 /data/VOCdevkit/VOC2007/JPEGImages/007171.jpg 500 333 1 217 96 348 333 1 335 107 500 319 +3546 /data/VOCdevkit/VOC2007/JPEGImages/007173.jpg 500 375 3 72 36 377 312 14 397 179 417 262 +3547 /data/VOCdevkit/VOC2007/JPEGImages/007175.jpg 500 333 14 90 2 500 333 +3548 /data/VOCdevkit/VOC2007/JPEGImages/007176.jpg 491 500 6 29 197 477 430 14 76 123 184 354 +3549 /data/VOCdevkit/VOC2007/JPEGImages/007178.jpg 500 375 19 420 203 469 308 14 73 103 357 375 +3550 /data/VOCdevkit/VOC2007/JPEGImages/007179.jpg 500 333 6 172 133 225 166 14 1 57 187 333 14 159 79 389 333 14 386 104 500 333 +3551 /data/VOCdevkit/VOC2007/JPEGImages/007181.jpg 500 332 11 103 172 284 292 14 243 83 362 299 +3552 /data/VOCdevkit/VOC2007/JPEGImages/007183.jpg 500 375 11 4 93 495 314 +3553 /data/VOCdevkit/VOC2007/JPEGImages/007186.jpg 500 375 14 383 145 447 302 14 233 138 267 249 14 120 97 174 275 14 22 90 86 323 1 211 123 268 161 1 165 163 246 245 +3554 /data/VOCdevkit/VOC2007/JPEGImages/007188.jpg 500 375 2 229 141 373 259 +3555 /data/VOCdevkit/VOC2007/JPEGImages/007190.jpg 500 333 11 1 47 412 333 +3556 /data/VOCdevkit/VOC2007/JPEGImages/007192.jpg 500 375 17 1 109 500 375 +3557 /data/VOCdevkit/VOC2007/JPEGImages/007195.jpg 500 333 14 351 26 500 333 18 85 109 412 178 +3558 /data/VOCdevkit/VOC2007/JPEGImages/007196.jpg 500 375 19 338 55 500 240 19 171 57 340 235 19 2 56 170 247 +3559 /data/VOCdevkit/VOC2007/JPEGImages/007198.jpg 500 331 2 26 188 75 281 2 454 139 500 231 +3560 /data/VOCdevkit/VOC2007/JPEGImages/007199.jpg 500 375 7 87 36 500 374 +3561 /data/VOCdevkit/VOC2007/JPEGImages/007201.jpg 500 333 2 173 94 288 328 +3562 /data/VOCdevkit/VOC2007/JPEGImages/007202.jpg 500 332 8 118 127 150 177 8 80 128 118 177 8 53 127 86 179 8 255 126 320 177 +3563 /data/VOCdevkit/VOC2007/JPEGImages/007203.jpg 500 375 19 162 47 253 163 19 47 1 162 188 14 308 132 429 299 +3564 /data/VOCdevkit/VOC2007/JPEGImages/007206.jpg 375 500 18 109 165 250 270 14 284 199 306 257 +3565 /data/VOCdevkit/VOC2007/JPEGImages/007207.jpg 500 375 10 175 214 385 375 14 2 245 79 375 14 29 167 246 375 14 94 140 247 334 14 297 131 362 229 14 274 156 436 375 14 428 216 500 375 14 217 53 256 100 14 141 105 193 170 14 192 119 257 212 +3566 /data/VOCdevkit/VOC2007/JPEGImages/007209.jpg 375 500 11 64 29 273 383 +3567 /data/VOCdevkit/VOC2007/JPEGImages/007218.jpg 500 383 17 33 58 424 368 +3568 /data/VOCdevkit/VOC2007/JPEGImages/007220.jpg 500 375 14 178 154 252 252 14 240 154 308 253 8 355 213 500 345 +3569 /data/VOCdevkit/VOC2007/JPEGImages/007221.jpg 500 375 7 32 33 436 372 +3570 /data/VOCdevkit/VOC2007/JPEGImages/007225.jpg 500 375 4 386 185 419 305 4 373 170 404 269 4 96 178 133 291 4 118 149 149 259 +3571 /data/VOCdevkit/VOC2007/JPEGImages/007226.jpg 500 278 18 19 78 479 250 +3572 /data/VOCdevkit/VOC2007/JPEGImages/007228.jpg 500 374 14 21 61 186 271 8 237 108 312 215 8 252 115 357 214 10 26 206 500 374 10 144 127 303 225 +3573 /data/VOCdevkit/VOC2007/JPEGImages/007229.jpg 300 220 12 1 23 278 220 +3574 /data/VOCdevkit/VOC2007/JPEGImages/007231.jpg 500 312 11 103 87 387 253 +3575 /data/VOCdevkit/VOC2007/JPEGImages/007232.jpg 375 500 14 24 185 82 343 1 24 260 82 366 +3576 /data/VOCdevkit/VOC2007/JPEGImages/007233.jpg 500 375 3 28 2 500 287 +3577 /data/VOCdevkit/VOC2007/JPEGImages/007235.jpg 500 333 1 135 108 370 284 14 171 27 326 249 +3578 /data/VOCdevkit/VOC2007/JPEGImages/007237.jpg 500 375 4 119 240 137 287 14 99 99 211 262 14 190 70 288 297 14 263 126 411 375 14 328 65 424 244 14 365 170 500 375 15 303 1 352 50 10 1 233 258 375 +3579 /data/VOCdevkit/VOC2007/JPEGImages/007238.jpg 375 500 7 65 204 219 404 +3580 /data/VOCdevkit/VOC2007/JPEGImages/007239.jpg 500 311 2 37 55 436 230 +3581 /data/VOCdevkit/VOC2007/JPEGImages/007240.jpg 500 375 10 1 92 500 375 +3582 /data/VOCdevkit/VOC2007/JPEGImages/007242.jpg 500 375 6 1 184 45 262 5 55 1 500 375 +3583 /data/VOCdevkit/VOC2007/JPEGImages/007246.jpg 500 375 6 3 81 491 374 6 152 86 500 241 +3584 /data/VOCdevkit/VOC2007/JPEGImages/007248.jpg 375 500 15 43 138 344 500 +3585 /data/VOCdevkit/VOC2007/JPEGImages/007251.jpg 375 500 14 4 15 375 496 +3586 /data/VOCdevkit/VOC2007/JPEGImages/007252.jpg 500 332 14 26 30 206 332 12 202 106 500 332 +3587 /data/VOCdevkit/VOC2007/JPEGImages/007253.jpg 318 480 12 119 112 213 429 +3588 /data/VOCdevkit/VOC2007/JPEGImages/007254.jpg 375 500 11 64 47 374 431 +3589 /data/VOCdevkit/VOC2007/JPEGImages/007255.jpg 500 375 8 183 92 376 375 8 281 77 429 318 8 123 40 281 238 8 28 43 191 248 +3590 /data/VOCdevkit/VOC2007/JPEGImages/007257.jpg 375 500 0 175 149 226 174 +3591 /data/VOCdevkit/VOC2007/JPEGImages/007262.jpg 500 333 0 94 125 277 205 +3592 /data/VOCdevkit/VOC2007/JPEGImages/007264.jpg 500 375 17 1 153 255 329 17 229 209 500 375 +3593 /data/VOCdevkit/VOC2007/JPEGImages/007265.jpg 500 332 12 86 14 353 307 +3594 /data/VOCdevkit/VOC2007/JPEGImages/007267.jpg 500 292 14 167 139 204 253 6 367 158 399 177 0 96 86 475 187 +3595 /data/VOCdevkit/VOC2007/JPEGImages/007268.jpg 368 500 14 137 46 271 496 8 176 252 321 473 +3596 /data/VOCdevkit/VOC2007/JPEGImages/007269.jpg 500 333 2 195 172 402 248 2 216 139 408 213 2 134 75 288 152 +3597 /data/VOCdevkit/VOC2007/JPEGImages/007272.jpg 500 375 15 8 25 500 375 +3598 /data/VOCdevkit/VOC2007/JPEGImages/007273.jpg 500 333 6 75 121 486 268 +3599 /data/VOCdevkit/VOC2007/JPEGImages/007277.jpg 375 500 14 6 111 315 500 +3600 /data/VOCdevkit/VOC2007/JPEGImages/007278.jpg 500 333 6 40 245 86 276 +3601 /data/VOCdevkit/VOC2007/JPEGImages/007281.jpg 500 375 6 12 68 302 375 6 402 167 500 345 14 328 110 430 375 +3602 /data/VOCdevkit/VOC2007/JPEGImages/007282.jpg 500 332 6 196 141 333 296 6 353 160 484 283 6 1 134 170 289 +3603 /data/VOCdevkit/VOC2007/JPEGImages/007286.jpg 500 333 0 160 58 362 271 +3604 /data/VOCdevkit/VOC2007/JPEGImages/007287.jpg 500 375 17 30 47 341 269 +3605 /data/VOCdevkit/VOC2007/JPEGImages/007288.jpg 500 243 6 9 15 493 239 +3606 /data/VOCdevkit/VOC2007/JPEGImages/007290.jpg 500 375 0 129 153 320 224 0 398 177 492 214 +3607 /data/VOCdevkit/VOC2007/JPEGImages/007291.jpg 500 375 7 132 19 500 375 +3608 /data/VOCdevkit/VOC2007/JPEGImages/007293.jpg 500 322 12 82 103 422 305 12 50 80 206 301 14 210 185 369 319 14 172 17 259 121 +3609 /data/VOCdevkit/VOC2007/JPEGImages/007301.jpg 500 375 14 45 29 209 375 14 98 199 463 374 17 149 169 404 310 8 212 205 330 347 +3610 /data/VOCdevkit/VOC2007/JPEGImages/007303.jpg 332 500 14 89 137 207 341 12 112 174 232 433 +3611 /data/VOCdevkit/VOC2007/JPEGImages/007304.jpg 333 500 6 115 179 333 500 +3612 /data/VOCdevkit/VOC2007/JPEGImages/007306.jpg 500 375 14 373 100 500 338 14 310 94 394 229 14 148 114 256 241 14 1 116 167 375 10 115 222 500 375 +3613 /data/VOCdevkit/VOC2007/JPEGImages/007307.jpg 500 375 13 155 96 447 290 14 244 57 385 266 +3614 /data/VOCdevkit/VOC2007/JPEGImages/007309.jpg 374 500 1 5 28 332 470 +3615 /data/VOCdevkit/VOC2007/JPEGImages/007310.jpg 328 480 12 89 129 240 450 14 106 105 243 294 +3616 /data/VOCdevkit/VOC2007/JPEGImages/007312.jpg 500 375 11 68 76 352 300 +3617 /data/VOCdevkit/VOC2007/JPEGImages/007313.jpg 375 500 14 15 77 99 271 +3618 /data/VOCdevkit/VOC2007/JPEGImages/007315.jpg 339 500 8 151 243 226 341 +3619 /data/VOCdevkit/VOC2007/JPEGImages/007316.jpg 389 500 14 1 51 375 500 +3620 /data/VOCdevkit/VOC2007/JPEGImages/007317.jpg 500 375 2 65 172 277 330 14 150 11 322 301 +3621 /data/VOCdevkit/VOC2007/JPEGImages/007319.jpg 375 500 14 11 1 116 111 8 36 1 136 125 15 61 41 292 451 +3622 /data/VOCdevkit/VOC2007/JPEGImages/007320.jpg 333 500 14 153 238 241 440 1 146 348 240 495 +3623 /data/VOCdevkit/VOC2007/JPEGImages/007321.jpg 500 375 7 231 186 324 326 14 153 39 213 160 19 68 2 252 226 +3624 /data/VOCdevkit/VOC2007/JPEGImages/007324.jpg 500 375 1 97 238 401 375 1 197 264 500 375 14 171 111 418 375 14 250 101 500 375 +3625 /data/VOCdevkit/VOC2007/JPEGImages/007326.jpg 500 375 2 160 81 369 198 +3626 /data/VOCdevkit/VOC2007/JPEGImages/007328.jpg 288 432 14 28 66 213 331 14 28 7 249 432 +3627 /data/VOCdevkit/VOC2007/JPEGImages/007331.jpg 500 375 7 4 3 482 372 +3628 /data/VOCdevkit/VOC2007/JPEGImages/007332.jpg 500 375 19 2 126 57 202 14 22 202 204 369 14 165 152 256 328 14 265 135 383 340 14 280 2 500 227 7 166 296 234 375 15 66 103 159 192 +3629 /data/VOCdevkit/VOC2007/JPEGImages/007333.jpg 400 330 19 193 120 371 304 14 1 6 211 329 +3630 /data/VOCdevkit/VOC2007/JPEGImages/007335.jpg 447 264 8 240 148 318 237 8 125 152 217 235 15 79 168 134 237 15 166 75 194 127 15 79 146 104 175 +3631 /data/VOCdevkit/VOC2007/JPEGImages/007337.jpg 500 500 6 236 265 290 307 6 344 268 414 296 +3632 /data/VOCdevkit/VOC2007/JPEGImages/007338.jpg 500 338 13 255 86 500 338 14 273 44 487 338 13 167 30 277 214 +3633 /data/VOCdevkit/VOC2007/JPEGImages/007339.jpg 500 362 6 73 90 384 310 6 246 36 403 153 14 170 112 199 149 14 267 134 299 162 +3634 /data/VOCdevkit/VOC2007/JPEGImages/007340.jpg 340 500 2 48 27 340 450 +3635 /data/VOCdevkit/VOC2007/JPEGImages/007341.jpg 500 375 14 458 319 500 375 14 296 332 352 375 0 65 70 448 239 +3636 /data/VOCdevkit/VOC2007/JPEGImages/007342.jpg 500 375 14 153 174 197 263 +3637 /data/VOCdevkit/VOC2007/JPEGImages/007345.jpg 375 500 14 75 79 140 251 1 80 157 139 267 +3638 /data/VOCdevkit/VOC2007/JPEGImages/007347.jpg 375 500 14 297 341 347 500 +3639 /data/VOCdevkit/VOC2007/JPEGImages/007348.jpg 500 375 8 305 115 450 281 19 49 112 112 178 +3640 /data/VOCdevkit/VOC2007/JPEGImages/007349.jpg 500 375 14 84 244 105 287 14 83 202 101 236 18 98 2 500 375 +3641 /data/VOCdevkit/VOC2007/JPEGImages/007352.jpg 500 333 0 2 2 499 304 0 395 188 500 227 14 394 196 411 226 +3642 /data/VOCdevkit/VOC2007/JPEGImages/007353.jpg 500 375 17 105 203 466 375 +3643 /data/VOCdevkit/VOC2007/JPEGImages/007354.jpg 320 240 14 18 56 265 239 +3644 /data/VOCdevkit/VOC2007/JPEGImages/007355.jpg 375 500 13 2 157 374 500 14 43 6 266 282 14 4 205 37 308 +3645 /data/VOCdevkit/VOC2007/JPEGImages/007357.jpg 500 332 3 266 154 358 181 3 220 145 295 170 +3646 /data/VOCdevkit/VOC2007/JPEGImages/007358.jpg 500 375 6 5 7 470 344 6 5 113 71 158 14 68 91 110 220 +3647 /data/VOCdevkit/VOC2007/JPEGImages/007360.jpg 500 386 7 214 89 477 275 +3648 /data/VOCdevkit/VOC2007/JPEGImages/007362.jpg 500 375 6 1 65 438 330 6 306 46 500 110 +3649 /data/VOCdevkit/VOC2007/JPEGImages/007364.jpg 500 375 17 76 160 366 357 8 217 213 500 375 +3650 /data/VOCdevkit/VOC2007/JPEGImages/007366.jpg 375 500 8 2 392 95 500 +3651 /data/VOCdevkit/VOC2007/JPEGImages/007367.jpg 500 375 5 133 184 274 234 +3652 /data/VOCdevkit/VOC2007/JPEGImages/007368.jpg 387 500 6 169 91 260 145 6 268 94 346 143 6 316 85 387 163 14 52 76 144 226 13 2 198 310 397 13 45 273 387 500 +3653 /data/VOCdevkit/VOC2007/JPEGImages/007371.jpg 500 333 1 25 194 276 333 14 97 128 244 333 +3654 /data/VOCdevkit/VOC2007/JPEGImages/007377.jpg 500 375 3 157 201 458 295 +3655 /data/VOCdevkit/VOC2007/JPEGImages/007378.jpg 500 375 14 176 89 363 375 +3656 /data/VOCdevkit/VOC2007/JPEGImages/007379.jpg 500 375 14 174 86 461 375 +3657 /data/VOCdevkit/VOC2007/JPEGImages/007380.jpg 500 375 9 266 219 298 247 +3658 /data/VOCdevkit/VOC2007/JPEGImages/007382.jpg 500 335 18 169 93 317 305 14 228 166 259 185 14 186 163 207 186 +3659 /data/VOCdevkit/VOC2007/JPEGImages/007384.jpg 500 416 8 22 4 101 113 11 129 84 355 384 +3660 /data/VOCdevkit/VOC2007/JPEGImages/007386.jpg 500 330 6 1 47 500 321 +3661 /data/VOCdevkit/VOC2007/JPEGImages/007387.jpg 500 333 18 19 25 484 245 +3662 /data/VOCdevkit/VOC2007/JPEGImages/007391.jpg 500 333 10 51 193 364 333 +3663 /data/VOCdevkit/VOC2007/JPEGImages/007392.jpg 318 480 14 86 83 259 333 12 116 160 226 475 +3664 /data/VOCdevkit/VOC2007/JPEGImages/007393.jpg 500 333 10 109 227 447 333 8 314 189 440 333 +3665 /data/VOCdevkit/VOC2007/JPEGImages/007395.jpg 500 375 14 1 133 175 375 14 140 84 322 375 14 322 109 500 375 +3666 /data/VOCdevkit/VOC2007/JPEGImages/007397.jpg 328 500 2 98 189 123 225 2 138 439 170 486 +3667 /data/VOCdevkit/VOC2007/JPEGImages/007399.jpg 500 375 6 47 95 475 332 +3668 /data/VOCdevkit/VOC2007/JPEGImages/007400.jpg 333 500 3 61 354 215 415 +3669 /data/VOCdevkit/VOC2007/JPEGImages/007401.jpg 320 240 17 48 94 183 207 8 193 90 245 150 19 261 90 299 124 +3670 /data/VOCdevkit/VOC2007/JPEGImages/007402.jpg 500 375 16 118 13 404 368 +3671 /data/VOCdevkit/VOC2007/JPEGImages/007403.jpg 500 387 0 22 127 150 289 +3672 /data/VOCdevkit/VOC2007/JPEGImages/007404.jpg 500 375 14 113 80 426 310 4 207 97 225 135 +3673 /data/VOCdevkit/VOC2007/JPEGImages/007405.jpg 500 333 5 371 113 500 254 5 157 124 377 228 5 80 149 144 198 +3674 /data/VOCdevkit/VOC2007/JPEGImages/007406.jpg 500 375 8 25 292 82 375 8 195 290 243 375 8 148 292 199 375 8 390 282 432 351 8 455 285 496 352 8 430 282 461 347 15 118 303 143 354 15 93 305 123 358 15 50 345 93 374 +3675 /data/VOCdevkit/VOC2007/JPEGImages/007407.jpg 500 375 2 125 134 371 236 +3676 /data/VOCdevkit/VOC2007/JPEGImages/007409.jpg 500 375 7 99 106 457 334 7 74 56 348 174 +3677 /data/VOCdevkit/VOC2007/JPEGImages/007412.jpg 500 335 12 2 7 479 335 14 19 11 296 222 +3678 /data/VOCdevkit/VOC2007/JPEGImages/007415.jpg 500 375 14 143 252 156 281 3 32 103 479 287 14 99 250 107 269 +3679 /data/VOCdevkit/VOC2007/JPEGImages/007418.jpg 332 500 11 1 99 285 500 +3680 /data/VOCdevkit/VOC2007/JPEGImages/007420.jpg 500 333 14 161 92 387 333 +3681 /data/VOCdevkit/VOC2007/JPEGImages/007423.jpg 500 400 6 221 146 339 224 14 442 93 500 286 14 149 126 185 214 6 27 134 158 188 +3682 /data/VOCdevkit/VOC2007/JPEGImages/007426.jpg 500 333 2 119 62 488 330 +3683 /data/VOCdevkit/VOC2007/JPEGImages/007428.jpg 308 231 3 158 1 266 220 14 42 32 109 157 14 72 73 146 220 14 120 105 216 223 14 124 70 182 184 14 112 45 153 82 +3684 /data/VOCdevkit/VOC2007/JPEGImages/007429.jpg 332 500 6 16 228 310 481 +3685 /data/VOCdevkit/VOC2007/JPEGImages/007430.jpg 500 333 18 52 17 436 300 +3686 /data/VOCdevkit/VOC2007/JPEGImages/007434.jpg 480 380 11 116 2 480 380 +3687 /data/VOCdevkit/VOC2007/JPEGImages/007440.jpg 500 375 16 1 92 324 266 16 345 107 500 230 +3688 /data/VOCdevkit/VOC2007/JPEGImages/007441.jpg 500 357 7 81 44 420 356 +3689 /data/VOCdevkit/VOC2007/JPEGImages/007442.jpg 500 375 10 2 67 500 374 +3690 /data/VOCdevkit/VOC2007/JPEGImages/007444.jpg 375 500 16 158 266 275 427 14 1 81 215 500 +3691 /data/VOCdevkit/VOC2007/JPEGImages/007447.jpg 500 375 14 482 162 500 241 14 135 163 196 238 14 210 179 269 276 14 284 175 331 246 1 125 201 207 266 1 208 220 280 294 1 282 209 336 268 6 122 146 196 181 +3692 /data/VOCdevkit/VOC2007/JPEGImages/007450.jpg 500 375 18 1 178 190 241 +3693 /data/VOCdevkit/VOC2007/JPEGImages/007452.jpg 375 500 6 82 183 221 240 9 103 198 190 286 9 19 192 153 325 9 195 204 313 430 +3694 /data/VOCdevkit/VOC2007/JPEGImages/007453.jpg 500 351 11 1 93 217 218 17 1 13 499 268 +3695 /data/VOCdevkit/VOC2007/JPEGImages/007455.jpg 500 375 3 167 182 323 234 +3696 /data/VOCdevkit/VOC2007/JPEGImages/007456.jpg 500 375 4 93 63 168 168 4 123 55 185 170 4 277 29 331 122 4 223 57 288 160 4 153 92 241 287 4 322 43 433 291 +3697 /data/VOCdevkit/VOC2007/JPEGImages/007459.jpg 500 375 6 6 42 489 373 +3698 /data/VOCdevkit/VOC2007/JPEGImages/007462.jpg 500 375 16 167 107 284 321 16 162 32 213 130 2 4 151 49 205 +3699 /data/VOCdevkit/VOC2007/JPEGImages/007463.jpg 375 500 7 219 3 375 500 +3700 /data/VOCdevkit/VOC2007/JPEGImages/007464.jpg 500 375 3 167 114 255 249 3 300 264 493 310 +3701 /data/VOCdevkit/VOC2007/JPEGImages/007469.jpg 500 500 14 1 30 500 500 +3702 /data/VOCdevkit/VOC2007/JPEGImages/007471.jpg 375 500 14 216 120 290 358 14 142 187 191 273 14 82 181 156 330 14 1 199 170 496 +3703 /data/VOCdevkit/VOC2007/JPEGImages/007472.jpg 500 375 8 287 251 338 314 +3704 /data/VOCdevkit/VOC2007/JPEGImages/007473.jpg 435 500 15 2 132 369 417 +3705 /data/VOCdevkit/VOC2007/JPEGImages/007476.jpg 500 375 2 247 21 378 143 14 32 195 127 366 +3706 /data/VOCdevkit/VOC2007/JPEGImages/007478.jpg 500 375 6 341 3 500 166 6 3 3 433 375 +3707 /data/VOCdevkit/VOC2007/JPEGImages/007485.jpg 500 332 11 114 122 415 284 17 2 89 500 332 +3708 /data/VOCdevkit/VOC2007/JPEGImages/007487.jpg 500 375 7 185 2 499 375 +3709 /data/VOCdevkit/VOC2007/JPEGImages/007488.jpg 500 375 18 54 1 500 374 +3710 /data/VOCdevkit/VOC2007/JPEGImages/007492.jpg 500 375 17 1 160 489 375 8 422 80 500 227 +3711 /data/VOCdevkit/VOC2007/JPEGImages/007494.jpg 500 375 4 13 162 88 358 10 7 140 500 375 4 210 22 227 57 4 224 17 242 57 4 1 211 16 356 8 410 58 495 213 +3712 /data/VOCdevkit/VOC2007/JPEGImages/007495.jpg 500 375 5 150 60 405 337 +3713 /data/VOCdevkit/VOC2007/JPEGImages/007496.jpg 500 375 14 163 1 500 375 14 4 93 281 375 +3714 /data/VOCdevkit/VOC2007/JPEGImages/007499.jpg 500 375 15 54 108 292 373 15 141 3 412 347 +3715 /data/VOCdevkit/VOC2007/JPEGImages/007500.jpg 266 400 4 38 244 108 397 14 32 26 265 383 +3716 /data/VOCdevkit/VOC2007/JPEGImages/007501.jpg 500 375 6 2 4 500 375 14 433 46 486 156 +3717 /data/VOCdevkit/VOC2007/JPEGImages/007502.jpg 500 333 0 169 88 263 217 +3718 /data/VOCdevkit/VOC2007/JPEGImages/007504.jpg 500 375 4 97 15 405 374 +3719 /data/VOCdevkit/VOC2007/JPEGImages/007505.jpg 500 379 2 154 153 296 328 +3720 /data/VOCdevkit/VOC2007/JPEGImages/007507.jpg 500 375 6 2 186 54 233 6 59 190 160 236 6 160 187 208 223 +3721 /data/VOCdevkit/VOC2007/JPEGImages/007508.jpg 356 500 14 135 107 272 500 14 7 24 265 482 +3722 /data/VOCdevkit/VOC2007/JPEGImages/007509.jpg 332 500 14 168 177 236 366 12 32 95 248 373 +3723 /data/VOCdevkit/VOC2007/JPEGImages/007510.jpg 500 375 5 53 44 443 365 5 2 159 55 344 6 373 276 500 359 +3724 /data/VOCdevkit/VOC2007/JPEGImages/007512.jpg 500 375 2 71 154 247 234 2 293 127 390 305 +3725 /data/VOCdevkit/VOC2007/JPEGImages/007514.jpg 500 375 14 1 2 229 253 +3726 /data/VOCdevkit/VOC2007/JPEGImages/007515.jpg 500 278 11 324 38 392 218 11 78 46 199 236 +3727 /data/VOCdevkit/VOC2007/JPEGImages/007516.jpg 500 363 9 267 161 500 331 9 179 150 316 263 9 35 127 235 196 +3728 /data/VOCdevkit/VOC2007/JPEGImages/007518.jpg 500 375 6 456 234 496 294 6 196 234 305 293 6 116 231 225 284 6 49 233 159 280 6 4 221 114 271 6 309 230 353 257 6 262 222 323 253 +3729 /data/VOCdevkit/VOC2007/JPEGImages/007520.jpg 500 375 18 3 1 500 374 14 245 133 272 189 +3730 /data/VOCdevkit/VOC2007/JPEGImages/007522.jpg 500 375 14 207 54 356 241 6 3 2 500 375 +3731 /data/VOCdevkit/VOC2007/JPEGImages/007529.jpg 343 500 1 38 253 343 497 +3732 /data/VOCdevkit/VOC2007/JPEGImages/007531.jpg 500 375 14 117 92 169 182 14 238 43 291 137 14 383 18 490 198 +3733 /data/VOCdevkit/VOC2007/JPEGImages/007532.jpg 500 375 14 167 27 500 375 14 1 6 238 375 14 242 21 284 79 14 215 82 309 199 14 459 54 500 204 4 302 124 339 214 +3734 /data/VOCdevkit/VOC2007/JPEGImages/007534.jpg 500 375 16 203 155 426 375 16 1 32 294 375 +3735 /data/VOCdevkit/VOC2007/JPEGImages/007539.jpg 500 375 2 1 68 465 287 +3736 /data/VOCdevkit/VOC2007/JPEGImages/007541.jpg 500 353 1 162 116 436 350 +3737 /data/VOCdevkit/VOC2007/JPEGImages/007542.jpg 500 375 7 1 128 500 374 +3738 /data/VOCdevkit/VOC2007/JPEGImages/007545.jpg 500 375 2 231 235 311 292 +3739 /data/VOCdevkit/VOC2007/JPEGImages/007548.jpg 500 375 0 61 80 362 209 +3740 /data/VOCdevkit/VOC2007/JPEGImages/007549.jpg 500 375 15 311 1 395 160 15 351 1 500 233 15 139 2 345 223 +3741 /data/VOCdevkit/VOC2007/JPEGImages/007550.jpg 375 500 13 1 8 338 500 +3742 /data/VOCdevkit/VOC2007/JPEGImages/007552.jpg 500 374 14 246 198 266 235 +3743 /data/VOCdevkit/VOC2007/JPEGImages/007553.jpg 500 334 13 124 38 373 330 13 442 46 500 226 14 383 2 453 268 14 313 3 468 268 14 218 2 317 79 14 43 45 75 227 +3744 /data/VOCdevkit/VOC2007/JPEGImages/007554.jpg 500 333 9 420 175 470 214 9 17 195 65 231 14 221 168 288 285 14 298 166 355 304 +3745 /data/VOCdevkit/VOC2007/JPEGImages/007556.jpg 500 375 6 6 63 500 315 +3746 /data/VOCdevkit/VOC2007/JPEGImages/007557.jpg 375 500 2 167 83 207 172 +3747 /data/VOCdevkit/VOC2007/JPEGImages/007560.jpg 500 375 11 314 163 482 354 +3748 /data/VOCdevkit/VOC2007/JPEGImages/007561.jpg 500 375 17 200 68 500 305 17 3 64 192 203 +3749 /data/VOCdevkit/VOC2007/JPEGImages/007562.jpg 500 375 6 1 1 161 209 6 17 31 470 365 +3750 /data/VOCdevkit/VOC2007/JPEGImages/007564.jpg 422 318 19 322 155 372 203 8 294 211 357 310 +3751 /data/VOCdevkit/VOC2007/JPEGImages/007567.jpg 500 375 14 248 93 376 301 14 95 105 204 280 14 189 114 291 215 14 1 139 107 182 17 1 142 117 223 8 292 119 403 298 8 419 189 500 375 8 121 118 196 258 +3752 /data/VOCdevkit/VOC2007/JPEGImages/007569.jpg 500 333 4 2 289 181 333 4 210 290 387 333 4 56 154 107 197 +3753 /data/VOCdevkit/VOC2007/JPEGImages/007573.jpg 500 375 5 127 113 334 339 5 79 170 133 255 14 412 204 458 342 14 30 208 44 264 14 16 209 31 262 +3754 /data/VOCdevkit/VOC2007/JPEGImages/007574.jpg 500 370 7 39 48 486 318 +3755 /data/VOCdevkit/VOC2007/JPEGImages/007577.jpg 500 281 14 332 31 500 280 14 217 41 389 236 14 118 34 238 218 14 3 53 143 192 14 441 67 470 122 +3756 /data/VOCdevkit/VOC2007/JPEGImages/007580.jpg 500 375 6 373 278 408 290 14 68 277 83 312 +3757 /data/VOCdevkit/VOC2007/JPEGImages/007581.jpg 500 333 18 84 72 323 285 18 1 15 498 333 +3758 /data/VOCdevkit/VOC2007/JPEGImages/007582.jpg 333 500 14 57 47 333 454 +3759 /data/VOCdevkit/VOC2007/JPEGImages/007583.jpg 500 375 19 342 1 500 158 11 276 151 500 375 14 384 37 492 92 +3760 /data/VOCdevkit/VOC2007/JPEGImages/007584.jpg 500 375 14 1 2 500 375 +3761 /data/VOCdevkit/VOC2007/JPEGImages/007587.jpg 500 400 12 40 32 300 397 12 1 114 461 400 +3762 /data/VOCdevkit/VOC2007/JPEGImages/007588.jpg 500 333 11 160 55 215 156 +3763 /data/VOCdevkit/VOC2007/JPEGImages/007589.jpg 500 375 14 351 179 381 263 6 122 166 305 292 14 206 143 229 167 +3764 /data/VOCdevkit/VOC2007/JPEGImages/007591.jpg 333 500 5 25 89 311 419 +3765 /data/VOCdevkit/VOC2007/JPEGImages/007593.jpg 439 500 13 65 146 403 443 14 74 30 343 361 +3766 /data/VOCdevkit/VOC2007/JPEGImages/007595.jpg 500 333 14 117 37 370 333 +3767 /data/VOCdevkit/VOC2007/JPEGImages/007596.jpg 500 212 16 61 77 199 172 16 180 70 242 163 16 219 82 293 179 16 323 91 432 182 11 297 96 361 153 +3768 /data/VOCdevkit/VOC2007/JPEGImages/007597.jpg 500 332 8 261 179 291 234 8 294 147 382 245 +3769 /data/VOCdevkit/VOC2007/JPEGImages/007598.jpg 500 375 4 392 197 413 244 14 1 122 160 255 14 344 84 471 305 14 421 56 500 231 14 6 1 90 114 +3770 /data/VOCdevkit/VOC2007/JPEGImages/007599.jpg 500 333 9 26 139 231 287 9 226 146 387 287 +3771 /data/VOCdevkit/VOC2007/JPEGImages/007602.jpg 500 375 9 1 1 376 176 9 209 3 470 140 9 44 110 500 360 9 264 138 500 375 +3772 /data/VOCdevkit/VOC2007/JPEGImages/007604.jpg 500 404 2 171 98 467 239 +3773 /data/VOCdevkit/VOC2007/JPEGImages/007607.jpg 375 500 1 50 285 354 491 +3774 /data/VOCdevkit/VOC2007/JPEGImages/007608.jpg 500 375 2 241 132 295 245 +3775 /data/VOCdevkit/VOC2007/JPEGImages/007609.jpg 332 500 12 49 220 313 430 14 117 174 228 419 +3776 /data/VOCdevkit/VOC2007/JPEGImages/007610.jpg 375 500 14 164 196 192 257 +3777 /data/VOCdevkit/VOC2007/JPEGImages/007613.jpg 500 375 6 21 75 472 337 6 147 107 187 164 +3778 /data/VOCdevkit/VOC2007/JPEGImages/007616.jpg 500 371 12 75 98 429 351 14 182 32 261 246 +3779 /data/VOCdevkit/VOC2007/JPEGImages/007617.jpg 500 334 6 1 84 134 234 6 74 84 437 271 +3780 /data/VOCdevkit/VOC2007/JPEGImages/007620.jpg 318 480 12 91 172 253 480 14 118 99 242 304 +3781 /data/VOCdevkit/VOC2007/JPEGImages/007623.jpg 320 218 12 100 67 233 218 14 127 18 205 141 +3782 /data/VOCdevkit/VOC2007/JPEGImages/007625.jpg 500 375 11 253 135 314 250 11 207 178 266 272 14 263 84 372 373 14 118 79 230 319 +3783 /data/VOCdevkit/VOC2007/JPEGImages/007627.jpg 500 375 1 31 168 167 372 14 23 43 154 321 +3784 /data/VOCdevkit/VOC2007/JPEGImages/007628.jpg 500 375 14 81 1 499 372 +3785 /data/VOCdevkit/VOC2007/JPEGImages/007630.jpg 500 500 2 140 59 362 394 +3786 /data/VOCdevkit/VOC2007/JPEGImages/007632.jpg 500 396 0 2 131 492 306 +3787 /data/VOCdevkit/VOC2007/JPEGImages/007634.jpg 500 375 14 86 50 500 375 14 227 50 313 324 14 154 62 242 333 14 4 114 34 180 14 28 116 47 178 14 471 82 500 279 6 48 137 82 158 6 118 138 166 170 6 92 136 137 167 +3788 /data/VOCdevkit/VOC2007/JPEGImages/007635.jpg 500 375 3 316 14 500 211 +3789 /data/VOCdevkit/VOC2007/JPEGImages/007636.jpg 318 480 12 99 123 226 469 14 94 104 250 309 +3790 /data/VOCdevkit/VOC2007/JPEGImages/007638.jpg 500 375 7 166 68 323 234 +3791 /data/VOCdevkit/VOC2007/JPEGImages/007641.jpg 333 500 2 255 188 314 232 2 125 58 198 127 2 93 119 159 174 2 110 217 176 283 2 91 267 146 319 +3792 /data/VOCdevkit/VOC2007/JPEGImages/007643.jpg 375 500 15 24 25 325 448 15 1 47 124 341 +3793 /data/VOCdevkit/VOC2007/JPEGImages/007644.jpg 480 360 10 258 107 348 228 8 203 92 296 219 15 263 43 361 111 15 10 48 36 87 15 27 46 54 87 15 73 24 120 171 15 72 135 144 224 15 83 142 205 249 15 2 84 55 279 15 49 226 149 355 15 325 239 480 360 15 351 125 404 199 15 269 148 304 199 15 220 142 266 197 15 386 183 418 222 +3794 /data/VOCdevkit/VOC2007/JPEGImages/007645.jpg 500 375 13 3 10 453 337 14 395 5 453 103 14 474 27 500 83 14 360 9 377 32 +3795 /data/VOCdevkit/VOC2007/JPEGImages/007646.jpg 500 333 1 235 172 410 317 14 291 111 405 286 +3796 /data/VOCdevkit/VOC2007/JPEGImages/007648.jpg 500 375 14 33 171 294 375 14 279 163 348 235 14 313 182 446 375 8 329 262 494 375 10 139 226 350 375 +3797 /data/VOCdevkit/VOC2007/JPEGImages/007651.jpg 355 500 14 76 111 261 262 +3798 /data/VOCdevkit/VOC2007/JPEGImages/007652.jpg 500 333 14 16 51 498 305 +3799 /data/VOCdevkit/VOC2007/JPEGImages/007658.jpg 500 375 1 148 170 323 375 1 281 174 462 375 14 295 79 433 315 14 143 42 284 350 +3800 /data/VOCdevkit/VOC2007/JPEGImages/007659.jpg 333 500 11 108 195 190 375 +3801 /data/VOCdevkit/VOC2007/JPEGImages/007660.jpg 500 333 3 64 1 465 252 +3802 /data/VOCdevkit/VOC2007/JPEGImages/007661.jpg 500 375 7 3 46 415 375 +3803 /data/VOCdevkit/VOC2007/JPEGImages/007665.jpg 500 333 6 155 148 380 220 6 426 135 500 210 1 18 136 57 195 +3804 /data/VOCdevkit/VOC2007/JPEGImages/007669.jpg 500 375 14 67 30 416 375 +3805 /data/VOCdevkit/VOC2007/JPEGImages/007674.jpg 500 375 5 20 79 489 264 +3806 /data/VOCdevkit/VOC2007/JPEGImages/007676.jpg 500 333 0 79 47 500 333 14 1 246 23 270 +3807 /data/VOCdevkit/VOC2007/JPEGImages/007681.jpg 500 375 2 45 91 394 336 +3808 /data/VOCdevkit/VOC2007/JPEGImages/007684.jpg 500 375 8 238 180 274 216 8 134 239 162 279 +3809 /data/VOCdevkit/VOC2007/JPEGImages/007686.jpg 335 500 18 150 232 186 285 +3810 /data/VOCdevkit/VOC2007/JPEGImages/007689.jpg 500 272 11 17 27 186 270 14 222 2 500 268 +3811 /data/VOCdevkit/VOC2007/JPEGImages/007690.jpg 500 375 5 72 15 416 248 14 26 117 59 216 14 4 119 30 210 +3812 /data/VOCdevkit/VOC2007/JPEGImages/007693.jpg 500 375 6 133 106 448 363 +3813 /data/VOCdevkit/VOC2007/JPEGImages/007695.jpg 500 333 11 158 96 376 277 14 57 1 344 252 +3814 /data/VOCdevkit/VOC2007/JPEGImages/007698.jpg 500 333 0 185 142 327 210 +3815 /data/VOCdevkit/VOC2007/JPEGImages/007700.jpg 354 500 4 202 11 280 213 14 70 64 170 222 14 282 71 342 176 +3816 /data/VOCdevkit/VOC2007/JPEGImages/007701.jpg 500 375 6 256 175 441 274 6 167 184 288 254 6 94 190 139 239 6 2 187 113 256 +3817 /data/VOCdevkit/VOC2007/JPEGImages/007703.jpg 500 333 11 111 59 241 183 +3818 /data/VOCdevkit/VOC2007/JPEGImages/007706.jpg 500 375 14 93 59 323 334 14 255 23 373 300 +3819 /data/VOCdevkit/VOC2007/JPEGImages/007707.jpg 500 358 2 29 153 139 293 2 129 181 199 287 2 181 206 285 339 +3820 /data/VOCdevkit/VOC2007/JPEGImages/007708.jpg 500 375 8 140 276 309 375 +3821 /data/VOCdevkit/VOC2007/JPEGImages/007710.jpg 500 375 1 8 238 120 331 1 410 264 500 375 +3822 /data/VOCdevkit/VOC2007/JPEGImages/007711.jpg 480 381 0 90 173 450 321 +3823 /data/VOCdevkit/VOC2007/JPEGImages/007714.jpg 500 375 6 166 131 329 270 14 468 151 493 210 14 1 176 35 256 +3824 /data/VOCdevkit/VOC2007/JPEGImages/007716.jpg 500 375 11 197 122 372 319 +3825 /data/VOCdevkit/VOC2007/JPEGImages/007717.jpg 500 375 4 4 112 472 296 +3826 /data/VOCdevkit/VOC2007/JPEGImages/007719.jpg 221 500 14 152 153 183 239 14 44 256 110 396 14 1 206 69 405 +3827 /data/VOCdevkit/VOC2007/JPEGImages/007722.jpg 500 376 8 242 232 288 332 10 220 223 330 325 10 3 268 263 376 +3828 /data/VOCdevkit/VOC2007/JPEGImages/007725.jpg 500 377 1 138 209 346 349 14 190 147 316 346 +3829 /data/VOCdevkit/VOC2007/JPEGImages/007726.jpg 345 500 18 22 18 324 454 14 7 273 22 305 +3830 /data/VOCdevkit/VOC2007/JPEGImages/007728.jpg 500 334 14 222 82 380 334 14 86 74 250 334 +3831 /data/VOCdevkit/VOC2007/JPEGImages/007730.jpg 230 360 2 15 88 208 352 +3832 /data/VOCdevkit/VOC2007/JPEGImages/007733.jpg 500 382 7 58 204 454 382 7 82 1 482 133 +3833 /data/VOCdevkit/VOC2007/JPEGImages/007734.jpg 500 375 6 31 92 277 282 6 276 121 366 210 +3834 /data/VOCdevkit/VOC2007/JPEGImages/007737.jpg 375 500 18 84 198 374 436 +3835 /data/VOCdevkit/VOC2007/JPEGImages/007738.jpg 375 500 8 2 1 374 500 +3836 /data/VOCdevkit/VOC2007/JPEGImages/007739.jpg 375 500 4 165 210 222 372 8 4 169 161 395 8 16 101 52 174 14 85 69 373 395 +3837 /data/VOCdevkit/VOC2007/JPEGImages/007741.jpg 500 375 2 45 254 67 289 2 87 124 119 152 2 66 108 100 121 2 242 66 295 113 2 150 144 192 192 2 221 178 316 227 2 316 198 416 253 2 354 149 390 174 2 253 174 299 199 2 312 75 338 91 2 207 78 235 95 +3838 /data/VOCdevkit/VOC2007/JPEGImages/007744.jpg 500 375 4 443 160 489 305 4 378 164 440 307 4 384 131 439 225 4 341 154 373 293 4 309 133 355 313 4 278 153 308 293 4 238 126 287 312 4 219 174 246 295 4 173 140 224 309 4 140 168 180 294 4 93 142 140 308 4 38 170 82 307 4 4 170 36 286 14 168 110 217 170 +3839 /data/VOCdevkit/VOC2007/JPEGImages/007747.jpg 500 375 19 382 165 420 195 17 15 190 200 330 10 2 293 374 375 +3840 /data/VOCdevkit/VOC2007/JPEGImages/007750.jpg 391 480 12 97 113 294 480 14 119 85 252 307 +3841 /data/VOCdevkit/VOC2007/JPEGImages/007752.jpg 500 375 8 354 168 409 245 14 192 106 306 234 +3842 /data/VOCdevkit/VOC2007/JPEGImages/007755.jpg 375 500 14 90 38 374 499 +3843 /data/VOCdevkit/VOC2007/JPEGImages/007756.jpg 500 375 8 333 269 440 375 14 70 242 193 375 +3844 /data/VOCdevkit/VOC2007/JPEGImages/007757.jpg 500 332 6 15 40 483 252 6 3 11 210 92 6 391 26 479 64 +3845 /data/VOCdevkit/VOC2007/JPEGImages/007759.jpg 500 333 14 68 1 270 323 14 227 64 366 294 14 341 1 454 321 +3846 /data/VOCdevkit/VOC2007/JPEGImages/007761.jpg 500 375 6 9 18 500 308 14 19 2 63 81 +3847 /data/VOCdevkit/VOC2007/JPEGImages/007764.jpg 500 393 18 98 73 443 220 +3848 /data/VOCdevkit/VOC2007/JPEGImages/007766.jpg 480 373 14 192 35 305 188 12 60 101 407 282 +3849 /data/VOCdevkit/VOC2007/JPEGImages/007769.jpg 375 500 14 188 112 259 406 14 72 37 225 478 +3850 /data/VOCdevkit/VOC2007/JPEGImages/007770.jpg 500 333 11 295 112 500 333 14 231 1 500 333 14 1 1 373 333 +3851 /data/VOCdevkit/VOC2007/JPEGImages/007771.jpg 500 375 18 2 128 347 166 +3852 /data/VOCdevkit/VOC2007/JPEGImages/007774.jpg 500 375 12 1 43 384 375 +3853 /data/VOCdevkit/VOC2007/JPEGImages/007778.jpg 500 333 4 229 99 440 206 14 1 86 427 332 +3854 /data/VOCdevkit/VOC2007/JPEGImages/007780.jpg 500 375 17 2 139 467 375 14 1 39 259 375 14 241 71 468 375 +3855 /data/VOCdevkit/VOC2007/JPEGImages/007782.jpg 500 375 14 5 8 339 375 +3856 /data/VOCdevkit/VOC2007/JPEGImages/007783.jpg 500 375 13 1 2 489 375 4 470 206 496 279 14 295 1 353 103 +3857 /data/VOCdevkit/VOC2007/JPEGImages/007784.jpg 500 230 18 9 11 500 224 +3858 /data/VOCdevkit/VOC2007/JPEGImages/007785.jpg 500 375 17 249 215 485 347 8 77 206 177 372 14 91 135 256 359 8 380 214 472 375 8 245 234 402 375 +3859 /data/VOCdevkit/VOC2007/JPEGImages/007787.jpg 500 375 11 43 55 427 269 +3860 /data/VOCdevkit/VOC2007/JPEGImages/007788.jpg 500 375 3 5 119 494 327 +3861 /data/VOCdevkit/VOC2007/JPEGImages/007789.jpg 500 323 14 125 125 165 194 +3862 /data/VOCdevkit/VOC2007/JPEGImages/007792.jpg 375 500 13 70 151 129 275 13 121 135 142 168 +3863 /data/VOCdevkit/VOC2007/JPEGImages/007794.jpg 375 500 11 57 164 298 387 +3864 /data/VOCdevkit/VOC2007/JPEGImages/007796.jpg 500 334 18 68 118 498 334 +3865 /data/VOCdevkit/VOC2007/JPEGImages/007797.jpg 500 375 6 74 128 351 333 14 366 90 462 375 +3866 /data/VOCdevkit/VOC2007/JPEGImages/007800.jpg 500 337 6 239 180 408 233 +3867 /data/VOCdevkit/VOC2007/JPEGImages/007801.jpg 500 375 10 151 252 447 375 14 187 142 288 266 14 277 152 363 259 14 254 102 299 158 +3868 /data/VOCdevkit/VOC2007/JPEGImages/007802.jpg 500 375 11 2 11 500 375 +3869 /data/VOCdevkit/VOC2007/JPEGImages/007804.jpg 500 334 18 1 6 500 334 +3870 /data/VOCdevkit/VOC2007/JPEGImages/007805.jpg 500 375 12 121 3 354 374 +3871 /data/VOCdevkit/VOC2007/JPEGImages/007806.jpg 500 375 0 33 212 458 370 +3872 /data/VOCdevkit/VOC2007/JPEGImages/007807.jpg 500 375 6 30 27 456 317 6 409 149 500 217 +3873 /data/VOCdevkit/VOC2007/JPEGImages/007808.jpg 500 375 17 374 158 500 220 19 132 92 189 218 14 196 138 309 371 +3874 /data/VOCdevkit/VOC2007/JPEGImages/007811.jpg 500 375 17 2 99 500 375 14 54 35 465 375 7 185 142 390 375 +3875 /data/VOCdevkit/VOC2007/JPEGImages/007816.jpg 500 332 14 153 169 202 225 17 243 170 311 203 8 197 167 234 209 +3876 /data/VOCdevkit/VOC2007/JPEGImages/007817.jpg 474 500 14 2 22 388 482 14 225 98 474 446 +3877 /data/VOCdevkit/VOC2007/JPEGImages/007818.jpg 500 375 6 1 140 40 166 6 43 135 93 166 6 92 136 135 165 6 143 134 184 165 6 186 139 216 163 +3878 /data/VOCdevkit/VOC2007/JPEGImages/007822.jpg 500 375 14 176 108 250 235 14 200 98 300 163 14 238 129 311 259 +3879 /data/VOCdevkit/VOC2007/JPEGImages/007823.jpg 500 375 7 50 82 358 368 +3880 /data/VOCdevkit/VOC2007/JPEGImages/007825.jpg 500 333 0 28 125 477 254 +3881 /data/VOCdevkit/VOC2007/JPEGImages/007827.jpg 500 281 11 1 1 333 280 +3882 /data/VOCdevkit/VOC2007/JPEGImages/007828.jpg 500 333 8 237 1 395 214 11 104 43 287 277 +3883 /data/VOCdevkit/VOC2007/JPEGImages/007829.jpg 333 500 7 82 77 333 362 +3884 /data/VOCdevkit/VOC2007/JPEGImages/007830.jpg 500 375 14 208 34 492 374 +3885 /data/VOCdevkit/VOC2007/JPEGImages/007832.jpg 500 375 8 81 165 241 367 8 371 148 488 291 17 110 149 366 266 +3886 /data/VOCdevkit/VOC2007/JPEGImages/007835.jpg 500 332 19 135 88 259 198 8 377 140 475 255 8 347 238 500 332 14 174 119 200 173 +3887 /data/VOCdevkit/VOC2007/JPEGImages/007837.jpg 500 400 0 65 96 481 277 0 424 212 500 245 +3888 /data/VOCdevkit/VOC2007/JPEGImages/007839.jpg 500 333 6 51 47 443 321 6 256 1 500 131 15 1 99 34 193 +3889 /data/VOCdevkit/VOC2007/JPEGImages/007842.jpg 500 375 19 1 25 498 375 +3890 /data/VOCdevkit/VOC2007/JPEGImages/007844.jpg 500 333 6 1 31 402 316 +3891 /data/VOCdevkit/VOC2007/JPEGImages/007846.jpg 500 333 14 237 30 467 330 14 1 1 252 333 +3892 /data/VOCdevkit/VOC2007/JPEGImages/007848.jpg 500 353 13 211 62 426 340 +3893 /data/VOCdevkit/VOC2007/JPEGImages/007849.jpg 500 281 19 247 86 269 109 19 100 235 134 281 14 362 89 428 169 14 379 166 429 280 14 414 138 454 275 14 436 110 473 239 +3894 /data/VOCdevkit/VOC2007/JPEGImages/007850.jpg 500 328 3 105 25 473 255 +3895 /data/VOCdevkit/VOC2007/JPEGImages/007851.jpg 500 334 9 111 91 408 278 +3896 /data/VOCdevkit/VOC2007/JPEGImages/007852.jpg 500 420 18 26 176 500 356 +3897 /data/VOCdevkit/VOC2007/JPEGImages/007858.jpg 500 353 5 369 45 480 161 14 409 96 458 214 14 342 98 381 199 5 474 97 493 155 +3898 /data/VOCdevkit/VOC2007/JPEGImages/007860.jpg 333 500 14 116 96 274 312 1 78 178 326 353 +3899 /data/VOCdevkit/VOC2007/JPEGImages/007861.jpg 500 229 6 125 28 367 184 14 56 77 79 126 14 47 80 63 131 +3900 /data/VOCdevkit/VOC2007/JPEGImages/007862.jpg 500 375 17 111 122 500 369 14 213 105 420 375 14 196 84 358 374 14 117 99 274 347 14 29 53 304 301 14 100 45 158 129 14 167 49 212 119 4 458 52 475 90 4 423 53 439 88 +3901 /data/VOCdevkit/VOC2007/JPEGImages/007866.jpg 334 500 6 16 1 334 491 +3902 /data/VOCdevkit/VOC2007/JPEGImages/007867.jpg 500 375 7 3 50 480 287 +3903 /data/VOCdevkit/VOC2007/JPEGImages/007870.jpg 500 375 0 1 162 419 261 +3904 /data/VOCdevkit/VOC2007/JPEGImages/007871.jpg 500 375 14 8 76 212 375 14 92 100 334 375 14 250 62 500 375 +3905 /data/VOCdevkit/VOC2007/JPEGImages/007874.jpg 500 333 14 124 91 186 213 12 164 20 322 326 +3906 /data/VOCdevkit/VOC2007/JPEGImages/007875.jpg 414 500 11 44 43 333 475 +3907 /data/VOCdevkit/VOC2007/JPEGImages/007879.jpg 500 375 11 109 11 469 250 +3908 /data/VOCdevkit/VOC2007/JPEGImages/007880.jpg 500 343 7 36 54 437 268 +3909 /data/VOCdevkit/VOC2007/JPEGImages/007881.jpg 500 334 18 14 33 500 283 +3910 /data/VOCdevkit/VOC2007/JPEGImages/007882.jpg 500 333 6 46 87 458 272 6 417 82 500 178 14 157 57 181 96 +3911 /data/VOCdevkit/VOC2007/JPEGImages/007887.jpg 500 326 14 2 2 320 325 +3912 /data/VOCdevkit/VOC2007/JPEGImages/007888.jpg 500 333 14 260 55 428 227 14 61 81 194 232 +3913 /data/VOCdevkit/VOC2007/JPEGImages/007891.jpg 333 500 14 22 24 318 365 +3914 /data/VOCdevkit/VOC2007/JPEGImages/007892.jpg 360 480 14 174 94 302 479 +3915 /data/VOCdevkit/VOC2007/JPEGImages/007893.jpg 500 386 2 376 279 460 355 +3916 /data/VOCdevkit/VOC2007/JPEGImages/007894.jpg 500 375 16 274 134 331 189 16 337 135 415 193 16 285 193 472 344 16 132 181 301 316 16 19 145 93 238 16 57 140 107 216 +3917 /data/VOCdevkit/VOC2007/JPEGImages/007895.jpg 500 375 14 1 59 285 375 +3918 /data/VOCdevkit/VOC2007/JPEGImages/007896.jpg 500 333 8 221 214 320 333 8 343 191 486 332 8 12 114 61 199 8 41 192 167 333 14 227 71 285 149 14 284 75 362 160 14 137 82 196 160 14 92 87 202 185 14 46 117 237 333 14 351 84 428 181 14 319 98 479 333 10 129 140 396 240 +3919 /data/VOCdevkit/VOC2007/JPEGImages/007903.jpg 500 375 17 100 143 500 375 14 361 103 500 254 14 1 73 185 375 +3920 /data/VOCdevkit/VOC2007/JPEGImages/007904.jpg 500 375 14 89 121 140 254 14 413 109 447 175 14 348 116 375 173 14 319 113 355 178 14 160 124 174 159 14 131 128 146 160 +3921 /data/VOCdevkit/VOC2007/JPEGImages/007906.jpg 500 378 6 64 60 480 283 6 1 7 243 155 6 316 26 405 59 6 419 30 489 68 6 470 42 500 109 6 141 5 265 60 6 285 17 341 55 6 393 25 440 60 +3922 /data/VOCdevkit/VOC2007/JPEGImages/007907.jpg 500 274 11 39 66 266 192 +3923 /data/VOCdevkit/VOC2007/JPEGImages/007912.jpg 500 334 5 89 78 500 290 14 408 183 449 289 +3924 /data/VOCdevkit/VOC2007/JPEGImages/007913.jpg 500 375 15 242 56 500 375 14 19 94 126 375 14 221 90 326 266 +3925 /data/VOCdevkit/VOC2007/JPEGImages/007917.jpg 500 375 14 21 109 228 372 14 290 100 499 375 14 186 61 362 373 +3926 /data/VOCdevkit/VOC2007/JPEGImages/007918.jpg 480 360 1 1 267 72 360 1 398 231 445 272 +3927 /data/VOCdevkit/VOC2007/JPEGImages/007922.jpg 500 375 2 198 245 283 312 +3928 /data/VOCdevkit/VOC2007/JPEGImages/007927.jpg 500 374 6 1 65 478 319 14 451 117 500 176 14 487 109 500 179 +3929 /data/VOCdevkit/VOC2007/JPEGImages/007929.jpg 500 488 14 80 172 171 409 14 172 176 277 359 14 156 137 280 459 14 254 137 479 462 14 312 150 426 413 +3930 /data/VOCdevkit/VOC2007/JPEGImages/007930.jpg 500 375 11 205 274 422 354 +3931 /data/VOCdevkit/VOC2007/JPEGImages/007934.jpg 357 500 2 29 152 321 373 +3932 /data/VOCdevkit/VOC2007/JPEGImages/007936.jpg 500 471 2 23 46 477 447 +3933 /data/VOCdevkit/VOC2007/JPEGImages/007937.jpg 500 375 1 390 79 426 135 +3934 /data/VOCdevkit/VOC2007/JPEGImages/007938.jpg 500 333 7 17 137 289 275 7 179 79 440 218 +3935 /data/VOCdevkit/VOC2007/JPEGImages/007941.jpg 406 500 14 1 1 405 500 +3936 /data/VOCdevkit/VOC2007/JPEGImages/007942.jpg 500 375 12 95 29 251 255 14 309 147 415 327 14 340 151 397 324 14 328 60 429 309 +3937 /data/VOCdevkit/VOC2007/JPEGImages/007944.jpg 500 212 5 25 28 500 196 +3938 /data/VOCdevkit/VOC2007/JPEGImages/007945.jpg 500 374 18 89 113 422 283 +3939 /data/VOCdevkit/VOC2007/JPEGImages/007948.jpg 500 333 6 77 122 485 255 +3940 /data/VOCdevkit/VOC2007/JPEGImages/007949.jpg 500 400 5 386 186 486 276 5 279 181 396 292 5 178 176 291 306 5 3 157 192 344 +3941 /data/VOCdevkit/VOC2007/JPEGImages/007951.jpg 500 332 5 1 1 465 267 14 465 153 495 211 +3942 /data/VOCdevkit/VOC2007/JPEGImages/007952.jpg 500 375 3 223 138 333 303 +3943 /data/VOCdevkit/VOC2007/JPEGImages/007955.jpg 500 375 14 82 121 402 365 +3944 /data/VOCdevkit/VOC2007/JPEGImages/007957.jpg 500 332 14 91 37 380 332 14 1 141 132 314 14 125 94 213 220 +3945 /data/VOCdevkit/VOC2007/JPEGImages/007960.jpg 500 333 6 77 145 464 279 +3946 /data/VOCdevkit/VOC2007/JPEGImages/007961.jpg 500 333 6 320 150 441 199 6 48 159 135 218 6 193 199 500 333 6 396 177 500 268 6 87 168 179 252 14 157 123 243 333 +3947 /data/VOCdevkit/VOC2007/JPEGImages/007962.jpg 500 375 11 72 163 397 375 14 184 177 304 375 +3948 /data/VOCdevkit/VOC2007/JPEGImages/007965.jpg 442 500 14 77 126 356 499 14 18 86 332 498 14 349 126 389 156 +3949 /data/VOCdevkit/VOC2007/JPEGImages/007966.jpg 450 349 14 209 105 346 349 14 109 95 245 349 +3950 /data/VOCdevkit/VOC2007/JPEGImages/007967.jpg 500 375 6 193 52 326 120 6 402 68 476 116 14 63 15 124 201 +3951 /data/VOCdevkit/VOC2007/JPEGImages/007969.jpg 375 500 11 206 328 257 426 11 110 302 167 395 14 47 181 121 420 14 216 124 319 382 14 133 119 213 368 14 342 146 366 203 14 301 151 321 194 14 220 146 233 177 +3952 /data/VOCdevkit/VOC2007/JPEGImages/007972.jpg 500 307 14 303 34 406 143 14 107 60 210 151 12 226 49 472 253 12 4 61 288 275 +3953 /data/VOCdevkit/VOC2007/JPEGImages/007973.jpg 500 322 0 35 115 393 207 +3954 /data/VOCdevkit/VOC2007/JPEGImages/007975.jpg 480 360 12 1 16 368 360 14 379 203 447 283 +3955 /data/VOCdevkit/VOC2007/JPEGImages/007977.jpg 500 375 14 82 28 500 375 +3956 /data/VOCdevkit/VOC2007/JPEGImages/007978.jpg 500 333 13 255 134 327 223 14 247 107 327 215 +3957 /data/VOCdevkit/VOC2007/JPEGImages/007981.jpg 500 333 14 106 96 377 332 +3958 /data/VOCdevkit/VOC2007/JPEGImages/007982.jpg 500 281 19 89 141 166 189 19 1 138 135 272 19 86 149 331 240 +3959 /data/VOCdevkit/VOC2007/JPEGImages/007983.jpg 375 500 13 1 115 285 436 14 175 109 245 220 +3960 /data/VOCdevkit/VOC2007/JPEGImages/007985.jpg 500 375 0 1 1 500 297 14 229 104 305 330 +3961 /data/VOCdevkit/VOC2007/JPEGImages/007986.jpg 375 500 14 57 68 291 500 +3962 /data/VOCdevkit/VOC2007/JPEGImages/007988.jpg 500 375 14 247 37 500 374 +3963 /data/VOCdevkit/VOC2007/JPEGImages/007989.jpg 333 500 10 2 246 305 500 +3964 /data/VOCdevkit/VOC2007/JPEGImages/007990.jpg 500 315 3 1 70 475 299 +3965 /data/VOCdevkit/VOC2007/JPEGImages/007992.jpg 500 333 6 218 126 347 214 14 17 28 34 67 14 40 27 57 68 +3966 /data/VOCdevkit/VOC2007/JPEGImages/007993.jpg 500 332 0 5 95 481 250 0 4 197 166 245 +3967 /data/VOCdevkit/VOC2007/JPEGImages/007994.jpg 500 375 14 455 138 500 270 14 349 147 408 292 14 88 145 125 267 14 213 149 250 270 14 224 114 322 261 14 400 150 443 266 +3968 /data/VOCdevkit/VOC2007/JPEGImages/007995.jpg 500 313 0 20 115 441 218 +3969 /data/VOCdevkit/VOC2007/JPEGImages/008000.jpg 500 375 9 107 141 234 301 +3970 /data/VOCdevkit/VOC2007/JPEGImages/008003.jpg 500 298 13 19 83 489 289 14 149 8 380 266 +3971 /data/VOCdevkit/VOC2007/JPEGImages/008006.jpg 500 375 6 22 266 144 346 +3972 /data/VOCdevkit/VOC2007/JPEGImages/008007.jpg 500 375 1 139 1 460 309 +3973 /data/VOCdevkit/VOC2007/JPEGImages/008010.jpg 500 375 12 217 83 387 220 14 245 63 338 195 15 320 100 404 319 15 426 137 500 301 15 87 124 124 248 15 1 82 37 265 +3974 /data/VOCdevkit/VOC2007/JPEGImages/008011.jpg 500 333 7 27 16 271 252 +3975 /data/VOCdevkit/VOC2007/JPEGImages/008013.jpg 306 500 14 132 79 287 372 +3976 /data/VOCdevkit/VOC2007/JPEGImages/008014.jpg 375 500 14 229 21 375 242 +3977 /data/VOCdevkit/VOC2007/JPEGImages/008015.jpg 500 375 2 206 96 310 273 +3978 /data/VOCdevkit/VOC2007/JPEGImages/008016.jpg 500 333 0 22 77 450 208 +3979 /data/VOCdevkit/VOC2007/JPEGImages/008018.jpg 500 338 17 1 124 416 338 14 2 105 326 338 +3980 /data/VOCdevkit/VOC2007/JPEGImages/008020.jpg 500 375 6 12 202 137 298 +3981 /data/VOCdevkit/VOC2007/JPEGImages/008021.jpg 375 500 13 64 14 319 500 +3982 /data/VOCdevkit/VOC2007/JPEGImages/008022.jpg 500 333 14 292 10 500 333 14 1 25 210 333 14 152 96 277 331 +3983 /data/VOCdevkit/VOC2007/JPEGImages/008025.jpg 500 375 11 72 69 272 246 +3984 /data/VOCdevkit/VOC2007/JPEGImages/008027.jpg 333 500 14 1 119 172 410 12 26 248 168 500 +3985 /data/VOCdevkit/VOC2007/JPEGImages/008028.jpg 500 375 2 272 175 359 252 2 83 121 245 253 +3986 /data/VOCdevkit/VOC2007/JPEGImages/008030.jpg 432 320 6 88 77 378 234 +3987 /data/VOCdevkit/VOC2007/JPEGImages/008034.jpg 500 331 13 50 79 228 210 13 224 81 415 236 14 245 39 415 229 14 84 36 229 205 +3988 /data/VOCdevkit/VOC2007/JPEGImages/008035.jpg 375 500 6 305 369 375 475 14 131 355 163 382 14 213 383 244 429 14 13 359 43 449 +3989 /data/VOCdevkit/VOC2007/JPEGImages/008038.jpg 500 375 14 130 121 213 375 14 198 141 270 375 14 256 136 314 375 14 289 124 386 375 +3990 /data/VOCdevkit/VOC2007/JPEGImages/008039.jpg 500 375 8 207 224 236 265 8 281 223 313 261 15 121 182 175 268 15 320 224 339 259 15 221 197 288 259 14 43 188 85 298 +3991 /data/VOCdevkit/VOC2007/JPEGImages/008041.jpg 375 500 14 3 129 283 497 +3992 /data/VOCdevkit/VOC2007/JPEGImages/008045.jpg 500 379 10 235 2 463 144 14 334 6 500 143 +3993 /data/VOCdevkit/VOC2007/JPEGImages/008046.jpg 330 500 14 238 156 330 361 14 99 185 153 295 14 208 203 245 238 14 1 217 23 281 1 170 235 329 353 1 198 226 265 260 1 76 227 161 301 +3994 /data/VOCdevkit/VOC2007/JPEGImages/008047.jpg 375 500 19 85 252 289 472 6 150 1 324 184 6 250 30 375 349 6 121 1 170 107 6 98 1 133 71 +3995 /data/VOCdevkit/VOC2007/JPEGImages/008050.jpg 500 375 19 280 148 362 250 19 198 146 280 245 14 287 181 340 218 14 203 178 265 209 +3996 /data/VOCdevkit/VOC2007/JPEGImages/008052.jpg 500 180 6 239 74 338 139 14 199 38 242 153 +3997 /data/VOCdevkit/VOC2007/JPEGImages/008054.jpg 500 375 11 10 88 482 303 +3998 /data/VOCdevkit/VOC2007/JPEGImages/008055.jpg 500 364 0 319 142 336 158 0 295 149 312 163 0 305 126 324 142 0 320 69 337 85 0 308 90 327 105 0 298 112 314 125 0 274 118 291 132 0 249 119 266 132 0 261 138 280 152 +3999 /data/VOCdevkit/VOC2007/JPEGImages/008056.jpg 500 375 8 206 161 240 200 8 235 160 268 201 +4000 /data/VOCdevkit/VOC2007/JPEGImages/008058.jpg 500 375 14 397 286 500 375 14 353 64 478 356 14 153 66 281 375 14 1 46 136 375 +4001 /data/VOCdevkit/VOC2007/JPEGImages/008059.jpg 320 203 14 121 15 206 135 12 107 51 203 203 +4002 /data/VOCdevkit/VOC2007/JPEGImages/008065.jpg 500 334 18 2 261 500 334 +4003 /data/VOCdevkit/VOC2007/JPEGImages/008066.jpg 500 332 2 270 1 399 218 +4004 /data/VOCdevkit/VOC2007/JPEGImages/008070.jpg 375 500 14 2 34 341 500 14 33 129 99 322 14 14 132 56 315 14 90 143 117 249 +4005 /data/VOCdevkit/VOC2007/JPEGImages/008071.jpg 333 500 11 86 315 307 452 15 1 2 167 500 +4006 /data/VOCdevkit/VOC2007/JPEGImages/008073.jpg 500 375 10 194 221 470 375 8 162 209 264 364 8 181 231 292 374 8 291 273 437 375 14 82 56 161 348 +4007 /data/VOCdevkit/VOC2007/JPEGImages/008074.jpg 333 500 1 61 254 310 456 14 22 192 72 334 14 103 127 272 436 14 65 185 104 332 +4008 /data/VOCdevkit/VOC2007/JPEGImages/008077.jpg 500 375 14 1 114 135 365 14 333 106 500 375 14 175 157 415 375 +4009 /data/VOCdevkit/VOC2007/JPEGImages/008078.jpg 500 375 9 245 259 373 349 +4010 /data/VOCdevkit/VOC2007/JPEGImages/008080.jpg 500 375 11 160 188 488 374 14 86 110 479 362 +4011 /data/VOCdevkit/VOC2007/JPEGImages/008081.jpg 500 375 9 64 123 299 287 14 399 30 442 175 14 443 39 483 173 14 55 1 117 128 14 114 1 167 126 14 323 15 361 68 14 378 15 414 137 14 429 6 475 131 14 298 7 329 54 +4012 /data/VOCdevkit/VOC2007/JPEGImages/008088.jpg 500 375 5 51 3 500 375 6 2 225 32 258 +4013 /data/VOCdevkit/VOC2007/JPEGImages/008089.jpg 500 333 7 340 91 470 266 4 217 93 266 198 +4014 /data/VOCdevkit/VOC2007/JPEGImages/008090.jpg 500 375 9 118 174 355 347 9 14 124 43 146 9 362 133 387 153 9 436 157 476 197 +4015 /data/VOCdevkit/VOC2007/JPEGImages/008092.jpg 500 357 18 387 115 500 240 +4016 /data/VOCdevkit/VOC2007/JPEGImages/008094.jpg 500 375 4 230 294 309 372 +4017 /data/VOCdevkit/VOC2007/JPEGImages/008097.jpg 500 333 2 164 63 355 325 +4018 /data/VOCdevkit/VOC2007/JPEGImages/008099.jpg 332 500 3 140 7 225 279 3 45 114 94 245 +4019 /data/VOCdevkit/VOC2007/JPEGImages/008102.jpg 500 312 11 85 142 220 289 14 219 114 334 290 +4020 /data/VOCdevkit/VOC2007/JPEGImages/008104.jpg 500 375 0 1 76 458 282 14 231 204 266 282 14 409 189 450 310 14 362 188 401 311 14 341 190 376 303 14 472 193 499 274 14 444 192 474 262 14 426 186 447 258 6 135 204 192 222 +4021 /data/VOCdevkit/VOC2007/JPEGImages/008109.jpg 500 375 12 72 132 257 309 12 257 133 449 268 +4022 /data/VOCdevkit/VOC2007/JPEGImages/008110.jpg 375 500 7 90 210 211 288 8 46 125 265 384 14 65 139 241 460 8 306 114 375 257 8 294 118 355 250 +4023 /data/VOCdevkit/VOC2007/JPEGImages/008111.jpg 345 500 9 17 22 261 295 14 75 192 180 469 14 232 93 344 449 +4024 /data/VOCdevkit/VOC2007/JPEGImages/008113.jpg 500 333 8 119 136 209 284 8 276 134 364 270 8 211 147 291 303 10 159 142 320 284 +4025 /data/VOCdevkit/VOC2007/JPEGImages/008114.jpg 500 375 17 86 189 414 359 6 380 174 469 214 +4026 /data/VOCdevkit/VOC2007/JPEGImages/008118.jpg 500 358 2 105 164 285 271 2 278 178 489 292 +4027 /data/VOCdevkit/VOC2007/JPEGImages/008119.jpg 375 500 17 184 413 255 473 +4028 /data/VOCdevkit/VOC2007/JPEGImages/008120.jpg 378 500 14 62 65 325 432 14 229 186 377 434 6 4 1 378 136 +4029 /data/VOCdevkit/VOC2007/JPEGImages/008123.jpg 500 375 2 323 109 374 149 +4030 /data/VOCdevkit/VOC2007/JPEGImages/008124.jpg 500 332 14 317 38 360 215 12 224 80 490 295 +4031 /data/VOCdevkit/VOC2007/JPEGImages/008126.jpg 500 333 6 79 160 437 332 14 278 26 500 316 14 143 158 188 199 +4032 /data/VOCdevkit/VOC2007/JPEGImages/008128.jpg 500 333 1 85 87 349 294 14 98 43 220 249 +4033 /data/VOCdevkit/VOC2007/JPEGImages/008129.jpg 500 333 6 82 126 335 319 +4034 /data/VOCdevkit/VOC2007/JPEGImages/008131.jpg 500 375 14 295 41 498 375 14 87 79 252 375 +4035 /data/VOCdevkit/VOC2007/JPEGImages/008133.jpg 500 375 6 101 138 419 344 +4036 /data/VOCdevkit/VOC2007/JPEGImages/008134.jpg 500 333 4 19 8 71 147 4 73 10 122 146 4 124 9 172 147 4 178 20 219 147 4 222 22 267 148 4 272 22 322 149 4 327 22 373 147 4 377 21 423 147 4 429 22 477 149 4 20 195 65 319 4 69 195 114 319 4 121 198 163 318 4 173 196 213 320 4 220 196 263 318 4 271 182 316 304 4 325 196 367 318 4 373 193 417 316 4 426 195 468 317 +4037 /data/VOCdevkit/VOC2007/JPEGImages/008135.jpg 500 375 6 5 2 473 374 +4038 /data/VOCdevkit/VOC2007/JPEGImages/008136.jpg 500 375 6 21 111 462 356 +4039 /data/VOCdevkit/VOC2007/JPEGImages/008143.jpg 500 342 6 219 181 348 254 +4040 /data/VOCdevkit/VOC2007/JPEGImages/008145.jpg 500 375 3 1 153 404 356 3 343 202 500 358 +4041 /data/VOCdevkit/VOC2007/JPEGImages/008146.jpg 375 500 14 144 381 174 471 +4042 /data/VOCdevkit/VOC2007/JPEGImages/008147.jpg 320 212 14 110 30 181 123 12 49 52 234 163 +4043 /data/VOCdevkit/VOC2007/JPEGImages/008148.jpg 500 375 2 127 32 381 375 +4044 /data/VOCdevkit/VOC2007/JPEGImages/008149.jpg 500 375 11 2 22 412 375 +4045 /data/VOCdevkit/VOC2007/JPEGImages/008152.jpg 500 375 14 222 45 344 374 14 425 92 455 160 14 11 88 51 210 6 73 92 449 321 6 2 92 71 190 +4046 /data/VOCdevkit/VOC2007/JPEGImages/008153.jpg 375 500 10 2 274 371 500 +4047 /data/VOCdevkit/VOC2007/JPEGImages/008154.jpg 500 359 18 1 123 500 266 +4048 /data/VOCdevkit/VOC2007/JPEGImages/008155.jpg 375 500 17 1 224 219 461 15 334 186 369 227 +4049 /data/VOCdevkit/VOC2007/JPEGImages/008156.jpg 265 400 8 1 5 68 100 15 232 90 265 212 15 73 97 174 314 +4050 /data/VOCdevkit/VOC2007/JPEGImages/008157.jpg 500 330 14 397 107 498 327 14 353 68 451 296 14 261 87 403 330 +4051 /data/VOCdevkit/VOC2007/JPEGImages/008158.jpg 500 375 5 62 32 185 96 6 1 81 194 375 +4052 /data/VOCdevkit/VOC2007/JPEGImages/008161.jpg 375 500 6 255 267 322 316 6 320 280 349 304 6 66 254 237 367 6 141 119 364 195 6 1 200 50 272 +4053 /data/VOCdevkit/VOC2007/JPEGImages/008162.jpg 500 375 17 126 101 359 244 17 2 163 356 374 +4054 /data/VOCdevkit/VOC2007/JPEGImages/008165.jpg 500 335 18 2 72 355 299 +4055 /data/VOCdevkit/VOC2007/JPEGImages/008167.jpg 500 375 11 12 138 72 216 15 98 127 178 271 +4056 /data/VOCdevkit/VOC2007/JPEGImages/008170.jpg 500 375 14 9 1 194 374 14 301 49 401 333 14 234 57 259 114 +4057 /data/VOCdevkit/VOC2007/JPEGImages/008172.jpg 500 488 11 200 134 445 442 14 57 14 479 488 +4058 /data/VOCdevkit/VOC2007/JPEGImages/008176.jpg 500 359 11 108 137 284 321 +4059 /data/VOCdevkit/VOC2007/JPEGImages/008178.jpg 500 375 11 295 131 369 213 8 8 29 459 373 14 79 43 446 273 +4060 /data/VOCdevkit/VOC2007/JPEGImages/008179.jpg 500 357 19 82 2 380 228 +4061 /data/VOCdevkit/VOC2007/JPEGImages/008181.jpg 384 288 11 1 1 312 257 +4062 /data/VOCdevkit/VOC2007/JPEGImages/008182.jpg 500 298 7 39 30 448 248 +4063 /data/VOCdevkit/VOC2007/JPEGImages/008183.jpg 308 308 12 10 54 302 286 14 54 21 194 269 +4064 /data/VOCdevkit/VOC2007/JPEGImages/008184.jpg 375 500 8 108 366 208 500 +4065 /data/VOCdevkit/VOC2007/JPEGImages/008185.jpg 333 500 15 1 214 312 482 +4066 /data/VOCdevkit/VOC2007/JPEGImages/008187.jpg 500 329 16 274 41 463 261 16 189 62 319 281 16 1 92 192 323 +4067 /data/VOCdevkit/VOC2007/JPEGImages/008192.jpg 500 375 16 225 181 366 315 16 422 170 500 340 16 384 144 500 248 14 151 54 281 274 4 169 100 188 136 16 61 107 104 158 +4068 /data/VOCdevkit/VOC2007/JPEGImages/008193.jpg 500 333 2 179 96 354 216 +4069 /data/VOCdevkit/VOC2007/JPEGImages/008194.jpg 500 392 18 49 138 421 323 +4070 /data/VOCdevkit/VOC2007/JPEGImages/008195.jpg 500 376 13 1 78 500 376 14 33 1 282 288 +4071 /data/VOCdevkit/VOC2007/JPEGImages/008196.jpg 500 375 8 206 103 426 227 14 151 114 295 238 +4072 /data/VOCdevkit/VOC2007/JPEGImages/008198.jpg 500 333 10 1 29 488 333 +4073 /data/VOCdevkit/VOC2007/JPEGImages/008201.jpg 500 375 11 269 45 500 286 11 2 64 238 375 +4074 /data/VOCdevkit/VOC2007/JPEGImages/008205.jpg 320 212 12 91 69 227 181 14 144 22 179 130 +4075 /data/VOCdevkit/VOC2007/JPEGImages/008206.jpg 500 375 15 119 32 304 234 +4076 /data/VOCdevkit/VOC2007/JPEGImages/008207.jpg 500 424 14 375 18 492 193 14 301 37 396 193 14 206 46 356 195 14 143 39 231 193 14 106 51 167 193 14 11 90 108 193 14 8 243 172 398 14 159 264 227 338 14 144 264 309 398 14 270 264 330 361 14 308 306 357 398 14 329 243 447 395 +4077 /data/VOCdevkit/VOC2007/JPEGImages/008210.jpg 500 375 10 3 248 293 375 +4078 /data/VOCdevkit/VOC2007/JPEGImages/008212.jpg 375 500 5 155 206 238 245 6 167 247 203 263 +4079 /data/VOCdevkit/VOC2007/JPEGImages/008214.jpg 500 401 2 112 123 347 301 +4080 /data/VOCdevkit/VOC2007/JPEGImages/008215.jpg 500 405 14 79 133 194 405 16 246 129 363 263 6 67 20 165 69 +4081 /data/VOCdevkit/VOC2007/JPEGImages/008217.jpg 500 375 3 44 146 337 323 14 293 184 306 213 +4082 /data/VOCdevkit/VOC2007/JPEGImages/008219.jpg 500 375 14 96 98 208 160 +4083 /data/VOCdevkit/VOC2007/JPEGImages/008221.jpg 500 375 1 2 27 499 375 +4084 /data/VOCdevkit/VOC2007/JPEGImages/008227.jpg 500 333 13 341 137 456 333 +4085 /data/VOCdevkit/VOC2007/JPEGImages/008228.jpg 352 312 12 25 28 323 295 +4086 /data/VOCdevkit/VOC2007/JPEGImages/008230.jpg 500 375 13 33 72 436 322 13 1 172 68 264 14 61 134 84 200 +4087 /data/VOCdevkit/VOC2007/JPEGImages/008231.jpg 500 375 6 4 29 500 375 14 254 57 274 89 14 450 57 464 96 +4088 /data/VOCdevkit/VOC2007/JPEGImages/008233.jpg 500 375 14 170 50 500 370 14 135 212 268 305 +4089 /data/VOCdevkit/VOC2007/JPEGImages/008234.jpg 500 376 18 12 82 192 248 14 96 107 118 140 14 190 120 253 207 +4090 /data/VOCdevkit/VOC2007/JPEGImages/008237.jpg 400 300 18 54 35 289 204 14 330 166 344 224 14 220 184 256 244 +4091 /data/VOCdevkit/VOC2007/JPEGImages/008238.jpg 500 333 11 54 174 304 333 14 65 84 387 333 +4092 /data/VOCdevkit/VOC2007/JPEGImages/008239.jpg 500 375 14 218 43 412 269 14 52 62 241 290 +4093 /data/VOCdevkit/VOC2007/JPEGImages/008240.jpg 500 375 7 100 39 287 310 7 281 113 495 321 +4094 /data/VOCdevkit/VOC2007/JPEGImages/008242.jpg 500 375 13 7 41 415 373 +4095 /data/VOCdevkit/VOC2007/JPEGImages/008243.jpg 328 500 2 1 12 295 500 +4096 /data/VOCdevkit/VOC2007/JPEGImages/008245.jpg 500 375 10 73 213 500 375 8 199 310 304 375 8 46 234 189 362 8 2 227 81 370 14 357 162 429 288 14 298 150 364 260 14 256 158 315 248 14 211 149 262 236 14 100 153 188 223 14 26 174 86 297 15 290 98 323 161 +4097 /data/VOCdevkit/VOC2007/JPEGImages/008246.jpg 500 255 5 8 50 177 213 5 170 60 308 176 5 302 66 424 150 6 424 103 495 135 +4098 /data/VOCdevkit/VOC2007/JPEGImages/008247.jpg 500 333 18 8 16 493 330 +4099 /data/VOCdevkit/VOC2007/JPEGImages/008249.jpg 500 284 3 32 98 465 212 14 337 32 432 150 14 229 61 340 161 +4100 /data/VOCdevkit/VOC2007/JPEGImages/008255.jpg 384 500 1 41 224 214 422 14 49 117 188 339 +4101 /data/VOCdevkit/VOC2007/JPEGImages/008256.jpg 480 423 14 176 52 278 224 12 34 73 358 417 +4102 /data/VOCdevkit/VOC2007/JPEGImages/008257.jpg 400 299 10 19 53 400 299 8 287 1 367 117 +4103 /data/VOCdevkit/VOC2007/JPEGImages/008259.jpg 500 375 6 1 35 118 136 6 93 20 288 138 6 263 17 500 159 14 132 47 267 204 11 195 110 238 185 12 231 139 452 356 +4104 /data/VOCdevkit/VOC2007/JPEGImages/008264.jpg 500 375 5 33 84 479 342 14 488 192 500 227 +4105 /data/VOCdevkit/VOC2007/JPEGImages/008265.jpg 500 375 14 151 27 500 374 14 4 36 493 372 +4106 /data/VOCdevkit/VOC2007/JPEGImages/008266.jpg 500 335 18 8 98 426 291 +4107 /data/VOCdevkit/VOC2007/JPEGImages/008267.jpg 500 375 7 188 157 349 373 7 41 159 159 240 +4108 /data/VOCdevkit/VOC2007/JPEGImages/008270.jpg 500 430 6 21 7 489 427 +4109 /data/VOCdevkit/VOC2007/JPEGImages/008271.jpg 333 500 14 277 167 325 291 14 153 210 168 261 14 167 213 181 258 14 181 209 199 259 14 109 219 130 270 14 73 194 95 268 6 1 218 66 296 15 206 135 265 320 15 136 209 153 259 15 198 196 213 267 +4110 /data/VOCdevkit/VOC2007/JPEGImages/008273.jpg 375 500 13 33 303 365 500 +4111 /data/VOCdevkit/VOC2007/JPEGImages/008274.jpg 500 375 19 240 22 474 255 +4112 /data/VOCdevkit/VOC2007/JPEGImages/008276.jpg 500 375 14 100 66 499 375 6 345 188 452 229 +4113 /data/VOCdevkit/VOC2007/JPEGImages/008277.jpg 450 300 14 1 39 248 300 19 170 49 244 148 19 238 54 318 161 +4114 /data/VOCdevkit/VOC2007/JPEGImages/008278.jpg 332 500 3 92 89 232 291 3 2 185 40 241 14 123 254 159 282 +4115 /data/VOCdevkit/VOC2007/JPEGImages/008283.jpg 500 333 6 82 96 417 250 +4116 /data/VOCdevkit/VOC2007/JPEGImages/008286.jpg 500 488 17 222 296 459 421 +4117 /data/VOCdevkit/VOC2007/JPEGImages/008287.jpg 500 375 14 167 53 500 375 14 79 89 276 305 4 277 206 350 375 +4118 /data/VOCdevkit/VOC2007/JPEGImages/008288.jpg 500 375 14 15 65 298 375 19 308 79 397 176 +4119 /data/VOCdevkit/VOC2007/JPEGImages/008289.jpg 500 375 6 1 84 423 375 +4120 /data/VOCdevkit/VOC2007/JPEGImages/008290.jpg 500 375 6 103 34 370 244 6 402 46 500 103 6 131 22 381 113 +4121 /data/VOCdevkit/VOC2007/JPEGImages/008291.jpg 500 375 19 133 1 397 166 +4122 /data/VOCdevkit/VOC2007/JPEGImages/008298.jpg 500 332 12 340 112 500 271 12 84 84 356 264 12 1 81 230 230 +4123 /data/VOCdevkit/VOC2007/JPEGImages/008303.jpg 480 393 12 59 84 402 329 14 211 45 315 232 +4124 /data/VOCdevkit/VOC2007/JPEGImages/008304.jpg 375 500 9 125 162 371 490 9 2 123 252 486 +4125 /data/VOCdevkit/VOC2007/JPEGImages/008305.jpg 500 406 2 140 95 439 245 +4126 /data/VOCdevkit/VOC2007/JPEGImages/008308.jpg 500 333 18 104 162 375 221 +4127 /data/VOCdevkit/VOC2007/JPEGImages/008309.jpg 500 375 14 82 97 394 373 14 3 65 231 375 +4128 /data/VOCdevkit/VOC2007/JPEGImages/008314.jpg 500 332 14 231 51 309 224 12 162 106 453 309 +4129 /data/VOCdevkit/VOC2007/JPEGImages/008321.jpg 333 500 14 2 28 326 500 +4130 /data/VOCdevkit/VOC2007/JPEGImages/008324.jpg 500 375 13 215 219 314 280 13 276 201 344 258 6 29 184 163 273 +4131 /data/VOCdevkit/VOC2007/JPEGImages/008325.jpg 500 375 14 22 65 201 375 14 171 76 381 375 14 243 91 500 375 +4132 /data/VOCdevkit/VOC2007/JPEGImages/008328.jpg 375 500 11 137 164 250 428 +4133 /data/VOCdevkit/VOC2007/JPEGImages/008330.jpg 375 500 4 1 276 54 464 +4134 /data/VOCdevkit/VOC2007/JPEGImages/008331.jpg 500 375 18 366 156 458 288 18 89 88 367 306 +4135 /data/VOCdevkit/VOC2007/JPEGImages/008333.jpg 500 375 16 111 4 364 284 +4136 /data/VOCdevkit/VOC2007/JPEGImages/008334.jpg 500 199 16 154 82 289 188 +4137 /data/VOCdevkit/VOC2007/JPEGImages/008337.jpg 500 368 5 1 34 500 368 +4138 /data/VOCdevkit/VOC2007/JPEGImages/008339.jpg 500 375 18 73 150 350 239 +4139 /data/VOCdevkit/VOC2007/JPEGImages/008340.jpg 500 375 11 1 1 453 374 +4140 /data/VOCdevkit/VOC2007/JPEGImages/008343.jpg 334 500 16 13 123 334 500 +4141 /data/VOCdevkit/VOC2007/JPEGImages/008344.jpg 500 327 16 342 203 410 268 16 260 144 288 177 16 196 126 234 168 16 67 107 116 157 16 1 100 38 138 +4142 /data/VOCdevkit/VOC2007/JPEGImages/008347.jpg 500 333 19 387 186 441 232 17 1 169 205 306 8 284 176 341 244 +4143 /data/VOCdevkit/VOC2007/JPEGImages/008348.jpg 452 301 2 139 41 322 218 +4144 /data/VOCdevkit/VOC2007/JPEGImages/008350.jpg 375 500 14 163 132 230 376 14 124 139 192 314 +4145 /data/VOCdevkit/VOC2007/JPEGImages/008352.jpg 500 333 0 66 36 469 231 +4146 /data/VOCdevkit/VOC2007/JPEGImages/008353.jpg 500 375 6 151 114 337 188 +4147 /data/VOCdevkit/VOC2007/JPEGImages/008354.jpg 500 332 14 186 44 255 218 12 75 85 357 269 +4148 /data/VOCdevkit/VOC2007/JPEGImages/008356.jpg 500 375 11 135 14 434 262 +4149 /data/VOCdevkit/VOC2007/JPEGImages/008357.jpg 500 289 5 65 71 420 214 6 421 156 456 177 6 36 150 65 180 6 1 126 66 177 +4150 /data/VOCdevkit/VOC2007/JPEGImages/008358.jpg 500 326 9 116 29 348 282 +4151 /data/VOCdevkit/VOC2007/JPEGImages/008361.jpg 500 375 7 216 1 500 273 +4152 /data/VOCdevkit/VOC2007/JPEGImages/008362.jpg 500 334 1 373 1 500 141 14 35 35 347 334 +4153 /data/VOCdevkit/VOC2007/JPEGImages/008363.jpg 500 375 14 19 35 196 375 6 140 110 500 375 8 472 108 500 146 +4154 /data/VOCdevkit/VOC2007/JPEGImages/008366.jpg 500 375 5 47 15 455 356 +4155 /data/VOCdevkit/VOC2007/JPEGImages/008367.jpg 500 375 1 43 42 127 94 1 344 117 410 176 1 409 110 443 171 1 200 211 369 308 1 231 291 400 375 14 120 26 220 286 8 431 136 474 187 +4156 /data/VOCdevkit/VOC2007/JPEGImages/008369.jpg 500 333 3 329 228 366 259 14 320 196 364 234 +4157 /data/VOCdevkit/VOC2007/JPEGImages/008371.jpg 500 375 2 3 41 420 286 +4158 /data/VOCdevkit/VOC2007/JPEGImages/008373.jpg 500 333 3 184 153 207 173 3 291 147 352 167 3 143 118 224 165 3 87 149 138 164 +4159 /data/VOCdevkit/VOC2007/JPEGImages/008375.jpg 375 500 6 280 455 353 489 +4160 /data/VOCdevkit/VOC2007/JPEGImages/008377.jpg 500 375 14 157 2 500 374 14 1 1 137 375 +4161 /data/VOCdevkit/VOC2007/JPEGImages/008378.jpg 500 333 6 77 86 479 263 +4162 /data/VOCdevkit/VOC2007/JPEGImages/008379.jpg 500 375 4 327 3 457 308 +4163 /data/VOCdevkit/VOC2007/JPEGImages/008380.jpg 500 329 17 5 117 476 261 +4164 /data/VOCdevkit/VOC2007/JPEGImages/008382.jpg 500 437 4 169 46 192 105 10 4 127 500 437 +4165 /data/VOCdevkit/VOC2007/JPEGImages/008383.jpg 500 375 6 1 97 500 337 14 432 85 470 162 14 421 66 450 112 14 401 95 437 160 14 350 64 391 118 14 284 78 315 114 14 136 60 171 110 14 91 59 128 153 14 89 131 122 159 14 53 131 93 167 14 30 102 74 174 14 1 130 29 195 14 330 131 352 157 +4166 /data/VOCdevkit/VOC2007/JPEGImages/008389.jpg 500 375 15 436 1 500 86 15 356 121 475 257 15 1 195 132 375 15 274 214 415 329 15 228 326 352 375 +4167 /data/VOCdevkit/VOC2007/JPEGImages/008392.jpg 500 375 17 1 63 500 375 14 100 97 356 315 +4168 /data/VOCdevkit/VOC2007/JPEGImages/008393.jpg 500 375 2 15 1 238 107 2 41 29 298 358 2 203 82 500 375 2 210 158 500 375 +4169 /data/VOCdevkit/VOC2007/JPEGImages/008394.jpg 500 473 8 38 50 334 441 +4170 /data/VOCdevkit/VOC2007/JPEGImages/008395.jpg 500 375 17 212 59 496 269 +4171 /data/VOCdevkit/VOC2007/JPEGImages/008396.jpg 500 375 14 10 79 355 286 14 205 2 500 344 +4172 /data/VOCdevkit/VOC2007/JPEGImages/008399.jpg 468 480 12 72 141 429 472 14 181 108 322 301 +4173 /data/VOCdevkit/VOC2007/JPEGImages/008400.jpg 500 375 14 179 1 452 375 14 413 56 500 375 14 55 119 195 375 +4174 /data/VOCdevkit/VOC2007/JPEGImages/008401.jpg 500 375 1 253 93 400 247 +4175 /data/VOCdevkit/VOC2007/JPEGImages/008402.jpg 500 333 14 56 146 188 333 14 160 133 263 333 14 237 146 293 333 14 284 171 377 333 14 307 156 352 235 14 331 168 388 333 14 362 166 427 333 14 398 153 500 333 +4176 /data/VOCdevkit/VOC2007/JPEGImages/008404.jpg 500 375 19 183 72 329 206 +4177 /data/VOCdevkit/VOC2007/JPEGImages/008405.jpg 500 375 19 315 50 435 161 19 181 58 288 160 19 73 50 192 161 4 157 123 177 170 +4178 /data/VOCdevkit/VOC2007/JPEGImages/008406.jpg 500 375 5 134 266 335 335 +4179 /data/VOCdevkit/VOC2007/JPEGImages/008407.jpg 500 375 19 73 175 203 281 19 349 158 397 218 8 350 255 489 375 8 349 210 436 317 14 146 131 350 375 +4180 /data/VOCdevkit/VOC2007/JPEGImages/008408.jpg 500 375 6 6 68 494 366 +4181 /data/VOCdevkit/VOC2007/JPEGImages/008411.jpg 500 375 14 3 4 299 374 +4182 /data/VOCdevkit/VOC2007/JPEGImages/008412.jpg 500 334 18 1 132 358 209 +4183 /data/VOCdevkit/VOC2007/JPEGImages/008414.jpg 500 375 6 68 75 472 336 +4184 /data/VOCdevkit/VOC2007/JPEGImages/008417.jpg 375 500 17 82 322 217 399 +4185 /data/VOCdevkit/VOC2007/JPEGImages/008418.jpg 500 375 9 324 75 445 264 9 360 164 500 365 9 149 58 189 105 9 274 43 310 75 9 381 37 410 82 14 5 2 334 372 +4186 /data/VOCdevkit/VOC2007/JPEGImages/008419.jpg 500 334 11 104 180 277 299 +4187 /data/VOCdevkit/VOC2007/JPEGImages/008420.jpg 500 357 11 1 2 500 356 +4188 /data/VOCdevkit/VOC2007/JPEGImages/008421.jpg 500 328 6 100 67 397 230 +4189 /data/VOCdevkit/VOC2007/JPEGImages/008428.jpg 500 375 19 170 10 339 161 +4190 /data/VOCdevkit/VOC2007/JPEGImages/008431.jpg 450 298 8 249 182 339 298 8 361 205 434 298 10 267 166 412 298 +4191 /data/VOCdevkit/VOC2007/JPEGImages/008432.jpg 375 500 6 54 232 315 436 +4192 /data/VOCdevkit/VOC2007/JPEGImages/008435.jpg 500 335 18 145 115 291 224 +4193 /data/VOCdevkit/VOC2007/JPEGImages/008436.jpg 500 375 14 122 41 352 375 14 54 34 156 285 +4194 /data/VOCdevkit/VOC2007/JPEGImages/008439.jpg 375 500 14 58 82 375 500 +4195 /data/VOCdevkit/VOC2007/JPEGImages/008440.jpg 500 375 0 19 38 500 375 +4196 /data/VOCdevkit/VOC2007/JPEGImages/008441.jpg 500 333 11 59 15 224 266 11 172 74 472 312 +4197 /data/VOCdevkit/VOC2007/JPEGImages/008446.jpg 375 500 14 96 43 281 334 14 112 205 287 465 +4198 /data/VOCdevkit/VOC2007/JPEGImages/008447.jpg 500 375 6 22 33 500 347 6 266 1 373 50 6 112 15 144 39 +4199 /data/VOCdevkit/VOC2007/JPEGImages/008448.jpg 500 375 5 334 255 451 328 +4200 /data/VOCdevkit/VOC2007/JPEGImages/008451.jpg 500 375 14 249 48 421 375 19 61 244 169 360 +4201 /data/VOCdevkit/VOC2007/JPEGImages/008455.jpg 298 500 13 66 238 267 424 14 80 219 126 362 14 104 221 176 414 +4202 /data/VOCdevkit/VOC2007/JPEGImages/008457.jpg 219 500 15 54 43 160 169 15 34 180 109 280 15 116 227 184 278 15 34 298 84 373 15 131 293 181 373 15 37 412 92 487 +4203 /data/VOCdevkit/VOC2007/JPEGImages/008458.jpg 500 375 15 348 16 441 123 14 235 68 394 375 14 105 68 235 375 +4204 /data/VOCdevkit/VOC2007/JPEGImages/008459.jpg 500 375 0 170 238 500 334 0 107 179 270 249 0 359 154 450 186 +4205 /data/VOCdevkit/VOC2007/JPEGImages/008460.jpg 500 333 14 143 18 433 330 +4206 /data/VOCdevkit/VOC2007/JPEGImages/008463.jpg 500 375 14 27 132 228 375 14 330 134 500 375 14 60 140 236 375 +4207 /data/VOCdevkit/VOC2007/JPEGImages/008464.jpg 500 333 6 38 287 72 304 6 346 292 376 318 6 309 294 358 325 +4208 /data/VOCdevkit/VOC2007/JPEGImages/008469.jpg 500 375 14 224 1 500 375 14 1 85 223 375 +4209 /data/VOCdevkit/VOC2007/JPEGImages/008471.jpg 500 375 15 330 12 376 96 19 298 155 403 266 +4210 /data/VOCdevkit/VOC2007/JPEGImages/008473.jpg 500 375 18 2 10 397 354 +4211 /data/VOCdevkit/VOC2007/JPEGImages/008474.jpg 375 500 8 1 108 268 500 14 96 29 315 500 +4212 /data/VOCdevkit/VOC2007/JPEGImages/008476.jpg 488 500 12 108 348 229 448 12 41 344 176 449 +4213 /data/VOCdevkit/VOC2007/JPEGImages/008479.jpg 500 375 6 135 102 401 271 6 443 159 500 222 6 389 170 422 209 +4214 /data/VOCdevkit/VOC2007/JPEGImages/008480.jpg 334 500 14 79 136 181 500 14 215 231 236 302 14 233 233 256 302 14 254 227 283 303 14 49 215 72 303 14 23 248 46 323 14 168 224 195 332 +4215 /data/VOCdevkit/VOC2007/JPEGImages/008481.jpg 500 333 8 145 65 371 295 6 317 9 408 44 +4216 /data/VOCdevkit/VOC2007/JPEGImages/008486.jpg 375 500 19 156 231 215 291 8 169 241 296 438 17 1 309 138 500 +4217 /data/VOCdevkit/VOC2007/JPEGImages/008487.jpg 500 375 14 16 1 487 374 +4218 /data/VOCdevkit/VOC2007/JPEGImages/008488.jpg 500 333 6 305 188 403 248 5 218 93 353 220 6 1 161 128 252 +4219 /data/VOCdevkit/VOC2007/JPEGImages/008489.jpg 500 375 11 89 22 238 374 +4220 /data/VOCdevkit/VOC2007/JPEGImages/008490.jpg 370 500 8 10 239 173 460 8 173 242 331 454 10 70 240 281 411 +4221 /data/VOCdevkit/VOC2007/JPEGImages/008491.jpg 500 333 11 259 187 329 238 14 128 135 175 277 +4222 /data/VOCdevkit/VOC2007/JPEGImages/008493.jpg 500 333 11 108 33 342 181 8 59 12 124 95 8 143 17 208 79 8 274 15 344 97 8 369 6 453 103 11 226 28 270 80 +4223 /data/VOCdevkit/VOC2007/JPEGImages/008496.jpg 375 500 7 175 146 238 238 14 164 108 282 455 17 124 257 333 394 8 1 285 113 471 +4224 /data/VOCdevkit/VOC2007/JPEGImages/008497.jpg 500 333 7 70 1 488 294 +4225 /data/VOCdevkit/VOC2007/JPEGImages/008500.jpg 432 231 18 1 42 424 197 +4226 /data/VOCdevkit/VOC2007/JPEGImages/008501.jpg 333 500 14 220 304 236 344 14 192 301 210 344 14 171 299 188 333 14 133 293 149 324 +4227 /data/VOCdevkit/VOC2007/JPEGImages/008504.jpg 500 333 6 337 114 447 201 6 309 11 362 41 6 104 61 180 109 6 156 87 238 139 6 151 154 307 235 6 235 50 300 93 6 324 57 397 105 6 291 73 364 125 6 434 60 500 112 6 425 43 488 90 +4228 /data/VOCdevkit/VOC2007/JPEGImages/008505.jpg 500 375 14 305 109 477 375 14 68 121 210 280 14 209 122 325 311 +4229 /data/VOCdevkit/VOC2007/JPEGImages/008507.jpg 500 375 1 2 2 500 374 +4230 /data/VOCdevkit/VOC2007/JPEGImages/008508.jpg 350 500 2 42 46 350 500 +4231 /data/VOCdevkit/VOC2007/JPEGImages/008510.jpg 500 375 17 12 109 500 370 14 242 131 500 245 +4232 /data/VOCdevkit/VOC2007/JPEGImages/008511.jpg 500 375 1 8 24 493 325 +4233 /data/VOCdevkit/VOC2007/JPEGImages/008515.jpg 500 332 1 47 152 234 259 +4234 /data/VOCdevkit/VOC2007/JPEGImages/008516.jpg 500 375 7 153 43 500 375 4 267 201 379 258 +4235 /data/VOCdevkit/VOC2007/JPEGImages/008520.jpg 500 375 10 1 130 500 375 14 199 11 302 146 14 318 54 500 303 14 1 55 173 361 4 288 222 324 328 4 253 114 278 182 +4236 /data/VOCdevkit/VOC2007/JPEGImages/008525.jpg 375 480 19 3 58 262 366 7 256 253 361 449 +4237 /data/VOCdevkit/VOC2007/JPEGImages/008527.jpg 500 375 9 86 110 246 222 9 142 146 340 375 +4238 /data/VOCdevkit/VOC2007/JPEGImages/008528.jpg 500 375 10 164 147 500 375 14 445 35 500 264 14 386 75 463 252 14 243 61 403 231 14 266 93 325 172 14 192 100 247 161 14 58 75 251 306 +4239 /data/VOCdevkit/VOC2007/JPEGImages/008531.jpg 500 332 18 163 71 335 281 14 228 133 263 163 14 185 136 212 161 +4240 /data/VOCdevkit/VOC2007/JPEGImages/008532.jpg 480 405 11 42 78 447 347 +4241 /data/VOCdevkit/VOC2007/JPEGImages/008537.jpg 500 375 0 4 12 500 311 14 341 189 396 313 14 402 187 448 307 +4242 /data/VOCdevkit/VOC2007/JPEGImages/008538.jpg 400 500 14 11 8 393 479 +4243 /data/VOCdevkit/VOC2007/JPEGImages/008539.jpg 500 375 7 48 27 500 339 +4244 /data/VOCdevkit/VOC2007/JPEGImages/008540.jpg 500 333 1 176 37 414 333 1 1 1 198 283 14 249 1 433 206 +4245 /data/VOCdevkit/VOC2007/JPEGImages/008543.jpg 500 375 8 358 195 472 302 17 2 213 131 372 +4246 /data/VOCdevkit/VOC2007/JPEGImages/008544.jpg 500 375 11 4 20 500 309 +4247 /data/VOCdevkit/VOC2007/JPEGImages/008545.jpg 375 500 3 272 241 350 344 3 92 29 295 383 +4248 /data/VOCdevkit/VOC2007/JPEGImages/008546.jpg 500 375 5 2 4 497 373 +4249 /data/VOCdevkit/VOC2007/JPEGImages/008547.jpg 450 338 15 330 170 443 298 15 240 63 377 295 15 150 46 255 300 15 25 155 108 249 +4250 /data/VOCdevkit/VOC2007/JPEGImages/008548.jpg 500 375 6 47 32 475 332 6 182 1 378 106 6 440 22 500 92 14 403 7 440 113 14 376 10 400 85 14 19 13 40 70 14 361 15 378 52 +4251 /data/VOCdevkit/VOC2007/JPEGImages/008551.jpg 500 398 1 2 125 105 279 14 2 56 118 172 14 294 128 443 300 1 189 173 467 380 +4252 /data/VOCdevkit/VOC2007/JPEGImages/008552.jpg 333 500 18 1 116 333 393 +4253 /data/VOCdevkit/VOC2007/JPEGImages/008554.jpg 500 333 0 204 114 435 196 0 1 165 89 196 +4254 /data/VOCdevkit/VOC2007/JPEGImages/008555.jpg 399 500 4 273 390 299 455 +4255 /data/VOCdevkit/VOC2007/JPEGImages/008560.jpg 500 335 14 391 235 488 335 6 433 200 500 304 6 397 183 454 241 14 259 129 283 164 +4256 /data/VOCdevkit/VOC2007/JPEGImages/008561.jpg 500 375 19 328 56 500 265 19 142 61 323 232 +4257 /data/VOCdevkit/VOC2007/JPEGImages/008563.jpg 500 375 19 342 88 427 170 8 281 161 402 357 +4258 /data/VOCdevkit/VOC2007/JPEGImages/008565.jpg 357 500 2 63 131 181 456 +4259 /data/VOCdevkit/VOC2007/JPEGImages/008566.jpg 500 375 14 73 64 360 375 1 1 1 174 122 +4260 /data/VOCdevkit/VOC2007/JPEGImages/008567.jpg 334 500 14 122 5 295 500 +4261 /data/VOCdevkit/VOC2007/JPEGImages/008569.jpg 500 375 14 244 21 408 312 14 148 39 283 287 14 66 22 184 269 14 5 223 228 374 +4262 /data/VOCdevkit/VOC2007/JPEGImages/008570.jpg 333 500 15 1 151 315 500 +4263 /data/VOCdevkit/VOC2007/JPEGImages/008571.jpg 320 240 3 53 1 288 177 +4264 /data/VOCdevkit/VOC2007/JPEGImages/008574.jpg 333 500 12 57 284 309 496 14 114 174 223 377 +4265 /data/VOCdevkit/VOC2007/JPEGImages/008575.jpg 333 500 7 19 2 333 500 +4266 /data/VOCdevkit/VOC2007/JPEGImages/008577.jpg 500 375 14 345 60 500 375 14 45 44 265 375 +4267 /data/VOCdevkit/VOC2007/JPEGImages/008578.jpg 500 332 14 242 128 263 206 3 129 141 442 250 +4268 /data/VOCdevkit/VOC2007/JPEGImages/008579.jpg 500 375 13 297 213 478 308 13 47 185 229 308 14 248 181 299 337 14 202 181 245 324 14 195 160 211 198 14 157 161 177 196 14 91 164 111 191 14 73 163 90 223 14 58 162 75 220 +4269 /data/VOCdevkit/VOC2007/JPEGImages/008580.jpg 500 333 18 60 129 419 287 +4270 /data/VOCdevkit/VOC2007/JPEGImages/008583.jpg 500 375 4 403 163 433 241 4 366 165 393 242 4 340 154 366 235 14 1 1 386 375 +4271 /data/VOCdevkit/VOC2007/JPEGImages/008589.jpg 500 333 2 179 89 358 196 +4272 /data/VOCdevkit/VOC2007/JPEGImages/008590.jpg 500 375 3 328 228 421 324 +4273 /data/VOCdevkit/VOC2007/JPEGImages/008591.jpg 333 500 10 3 34 333 500 4 254 2 288 87 4 104 15 133 97 4 107 47 133 114 4 10 171 93 401 +4274 /data/VOCdevkit/VOC2007/JPEGImages/008593.jpg 480 318 12 42 122 180 262 12 138 141 221 260 12 168 122 317 252 12 266 135 341 247 12 348 137 427 246 12 323 132 371 250 6 310 103 389 125 14 79 84 123 209 14 129 102 151 137 14 213 92 249 198 14 345 112 364 136 +4275 /data/VOCdevkit/VOC2007/JPEGImages/008594.jpg 500 333 11 139 1 500 305 +4276 /data/VOCdevkit/VOC2007/JPEGImages/008597.jpg 500 375 13 121 109 500 308 14 230 103 401 309 +4277 /data/VOCdevkit/VOC2007/JPEGImages/008598.jpg 500 333 16 321 152 483 317 16 287 129 470 182 16 167 125 261 289 16 115 134 206 276 +4278 /data/VOCdevkit/VOC2007/JPEGImages/008599.jpg 261 500 11 57 26 223 477 15 1 164 24 219 15 1 143 33 184 15 60 91 99 141 +4279 /data/VOCdevkit/VOC2007/JPEGImages/008600.jpg 500 335 8 2 2 500 335 +4280 /data/VOCdevkit/VOC2007/JPEGImages/008603.jpg 332 500 11 23 159 332 393 14 172 16 332 249 +4281 /data/VOCdevkit/VOC2007/JPEGImages/008605.jpg 500 322 9 53 134 126 172 9 146 131 192 224 14 127 86 160 145 14 242 83 274 142 9 211 133 303 229 +4282 /data/VOCdevkit/VOC2007/JPEGImages/008609.jpg 500 375 6 30 72 480 308 +4283 /data/VOCdevkit/VOC2007/JPEGImages/008611.jpg 500 236 19 358 65 454 132 +4284 /data/VOCdevkit/VOC2007/JPEGImages/008613.jpg 500 332 11 22 76 493 260 +4285 /data/VOCdevkit/VOC2007/JPEGImages/008614.jpg 500 332 17 53 180 326 317 +4286 /data/VOCdevkit/VOC2007/JPEGImages/008616.jpg 500 333 14 206 23 373 325 14 132 77 227 236 14 17 50 146 320 14 342 54 497 257 14 447 75 500 201 +4287 /data/VOCdevkit/VOC2007/JPEGImages/008619.jpg 500 332 13 54 30 433 330 14 288 12 341 86 14 464 21 500 201 14 1 94 56 310 +4288 /data/VOCdevkit/VOC2007/JPEGImages/008622.jpg 500 375 6 112 142 277 245 +4289 /data/VOCdevkit/VOC2007/JPEGImages/008623.jpg 500 375 13 51 203 280 344 14 137 163 225 359 +4290 /data/VOCdevkit/VOC2007/JPEGImages/008625.jpg 500 278 0 44 63 500 244 14 364 196 387 247 14 433 199 456 244 +4291 /data/VOCdevkit/VOC2007/JPEGImages/008626.jpg 500 333 8 401 154 440 216 8 373 163 427 233 15 450 213 500 269 15 467 234 500 308 +4292 /data/VOCdevkit/VOC2007/JPEGImages/008627.jpg 500 375 4 233 168 274 319 +4293 /data/VOCdevkit/VOC2007/JPEGImages/008629.jpg 333 500 14 3 4 333 499 +4294 /data/VOCdevkit/VOC2007/JPEGImages/008630.jpg 500 333 5 100 71 429 333 +4295 /data/VOCdevkit/VOC2007/JPEGImages/008631.jpg 500 375 2 315 153 377 201 +4296 /data/VOCdevkit/VOC2007/JPEGImages/008632.jpg 500 333 6 155 122 431 242 +4297 /data/VOCdevkit/VOC2007/JPEGImages/008634.jpg 500 375 14 418 123 471 279 +4298 /data/VOCdevkit/VOC2007/JPEGImages/008637.jpg 500 375 11 107 107 387 234 +4299 /data/VOCdevkit/VOC2007/JPEGImages/008640.jpg 500 309 2 37 49 192 233 +4300 /data/VOCdevkit/VOC2007/JPEGImages/008641.jpg 500 375 11 206 101 365 351 14 73 1 417 375 +4301 /data/VOCdevkit/VOC2007/JPEGImages/008642.jpg 500 375 5 26 124 464 290 14 5 201 26 250 +4302 /data/VOCdevkit/VOC2007/JPEGImages/008643.jpg 500 375 3 154 72 482 229 3 5 103 203 229 +4303 /data/VOCdevkit/VOC2007/JPEGImages/008646.jpg 500 375 8 305 69 493 276 8 3 115 221 375 +4304 /data/VOCdevkit/VOC2007/JPEGImages/008648.jpg 500 333 13 19 234 108 333 14 19 186 108 316 +4305 /data/VOCdevkit/VOC2007/JPEGImages/008649.jpg 500 375 11 4 2 500 375 +4306 /data/VOCdevkit/VOC2007/JPEGImages/008650.jpg 500 375 17 1 24 499 375 +4307 /data/VOCdevkit/VOC2007/JPEGImages/008651.jpg 500 347 11 72 38 270 335 +4308 /data/VOCdevkit/VOC2007/JPEGImages/008652.jpg 375 500 14 171 53 365 500 14 85 234 132 332 14 12 171 70 311 +4309 /data/VOCdevkit/VOC2007/JPEGImages/008656.jpg 500 333 11 1 97 279 333 +4310 /data/VOCdevkit/VOC2007/JPEGImages/008657.jpg 500 375 6 2 104 500 375 +4311 /data/VOCdevkit/VOC2007/JPEGImages/008658.jpg 346 500 6 26 86 346 373 +4312 /data/VOCdevkit/VOC2007/JPEGImages/008659.jpg 500 333 19 125 39 412 209 +4313 /data/VOCdevkit/VOC2007/JPEGImages/008660.jpg 500 375 19 264 29 466 243 +4314 /data/VOCdevkit/VOC2007/JPEGImages/008661.jpg 500 335 15 5 157 47 225 15 167 168 202 233 15 288 168 314 232 +4315 /data/VOCdevkit/VOC2007/JPEGImages/008662.jpg 500 375 2 157 62 269 298 +4316 /data/VOCdevkit/VOC2007/JPEGImages/008664.jpg 333 500 14 67 72 307 498 +4317 /data/VOCdevkit/VOC2007/JPEGImages/008666.jpg 375 500 1 210 5 375 382 14 1 47 322 500 +4318 /data/VOCdevkit/VOC2007/JPEGImages/008668.jpg 500 333 6 178 29 489 330 6 1 86 197 321 +4319 /data/VOCdevkit/VOC2007/JPEGImages/008669.jpg 500 333 0 83 93 464 257 14 446 149 482 265 14 167 159 208 255 14 341 167 373 255 +4320 /data/VOCdevkit/VOC2007/JPEGImages/008671.jpg 500 375 8 362 142 487 258 8 58 101 149 200 17 1 110 127 284 17 305 108 440 228 +4321 /data/VOCdevkit/VOC2007/JPEGImages/008672.jpg 500 333 18 1 162 307 192 +4322 /data/VOCdevkit/VOC2007/JPEGImages/008673.jpg 375 500 8 74 217 191 462 1 36 114 94 240 +4323 /data/VOCdevkit/VOC2007/JPEGImages/008674.jpg 500 375 11 73 76 500 375 +4324 /data/VOCdevkit/VOC2007/JPEGImages/008675.jpg 500 375 19 105 4 436 359 +4325 /data/VOCdevkit/VOC2007/JPEGImages/008677.jpg 500 327 18 17 35 479 279 +4326 /data/VOCdevkit/VOC2007/JPEGImages/008678.jpg 375 500 14 89 164 234 450 8 23 240 78 329 +4327 /data/VOCdevkit/VOC2007/JPEGImages/008679.jpg 500 375 18 1 142 160 276 +4328 /data/VOCdevkit/VOC2007/JPEGImages/008681.jpg 500 332 14 266 53 469 332 14 35 156 248 332 +4329 /data/VOCdevkit/VOC2007/JPEGImages/008682.jpg 500 294 6 55 96 496 265 14 47 50 94 200 14 80 42 141 117 +4330 /data/VOCdevkit/VOC2007/JPEGImages/008684.jpg 500 333 6 3 100 433 268 +4331 /data/VOCdevkit/VOC2007/JPEGImages/008685.jpg 500 372 16 61 64 373 322 +4332 /data/VOCdevkit/VOC2007/JPEGImages/008686.jpg 500 375 19 139 57 233 137 14 347 3 500 160 4 241 159 295 316 +4333 /data/VOCdevkit/VOC2007/JPEGImages/008689.jpg 500 331 13 80 69 373 265 13 404 22 500 95 13 2 34 97 123 14 168 12 374 270 14 128 32 189 117 14 358 2 391 108 14 381 1 419 103 14 199 1 239 119 +4334 /data/VOCdevkit/VOC2007/JPEGImages/008693.jpg 500 333 6 36 77 500 332 +4335 /data/VOCdevkit/VOC2007/JPEGImages/008694.jpg 500 333 6 384 182 500 241 13 181 152 245 198 14 198 128 231 175 14 37 221 61 290 +4336 /data/VOCdevkit/VOC2007/JPEGImages/008696.jpg 500 297 18 12 50 500 291 +4337 /data/VOCdevkit/VOC2007/JPEGImages/008697.jpg 375 500 4 207 15 316 499 +4338 /data/VOCdevkit/VOC2007/JPEGImages/008700.jpg 500 375 14 237 64 440 363 14 19 64 285 375 +4339 /data/VOCdevkit/VOC2007/JPEGImages/008703.jpg 500 403 7 192 82 481 361 +4340 /data/VOCdevkit/VOC2007/JPEGImages/008704.jpg 500 375 14 237 140 250 177 +4341 /data/VOCdevkit/VOC2007/JPEGImages/008705.jpg 500 375 11 125 78 313 268 +4342 /data/VOCdevkit/VOC2007/JPEGImages/008707.jpg 500 375 19 319 99 500 248 19 154 114 344 251 19 4 131 175 254 +4343 /data/VOCdevkit/VOC2007/JPEGImages/008708.jpg 500 375 6 293 206 311 219 14 259 168 399 375 14 123 177 260 375 +4344 /data/VOCdevkit/VOC2007/JPEGImages/008711.jpg 500 334 6 21 77 446 317 6 210 8 500 166 +4345 /data/VOCdevkit/VOC2007/JPEGImages/008712.jpg 500 333 18 114 113 500 273 +4346 /data/VOCdevkit/VOC2007/JPEGImages/008714.jpg 500 333 0 15 68 479 293 +4347 /data/VOCdevkit/VOC2007/JPEGImages/008715.jpg 500 333 6 79 129 305 257 +4348 /data/VOCdevkit/VOC2007/JPEGImages/008719.jpg 500 375 14 113 1 437 257 +4349 /data/VOCdevkit/VOC2007/JPEGImages/008721.jpg 500 375 14 186 70 478 367 14 2 60 224 310 17 18 71 500 375 +4350 /data/VOCdevkit/VOC2007/JPEGImages/008724.jpg 500 332 6 267 83 460 214 +4351 /data/VOCdevkit/VOC2007/JPEGImages/008726.jpg 492 500 14 251 1 492 500 14 159 114 245 186 +4352 /data/VOCdevkit/VOC2007/JPEGImages/008729.jpg 500 375 8 1 63 500 375 +4353 /data/VOCdevkit/VOC2007/JPEGImages/008734.jpg 500 375 8 14 41 79 116 14 54 16 82 72 6 40 44 500 375 6 363 39 500 168 6 120 11 273 71 14 271 6 288 29 14 427 1 473 43 +4354 /data/VOCdevkit/VOC2007/JPEGImages/008735.jpg 500 323 1 326 269 388 313 1 1 275 51 320 +4355 /data/VOCdevkit/VOC2007/JPEGImages/008736.jpg 500 332 5 346 83 500 275 +4356 /data/VOCdevkit/VOC2007/JPEGImages/008737.jpg 500 333 7 78 1 500 333 +4357 /data/VOCdevkit/VOC2007/JPEGImages/008740.jpg 500 333 4 186 186 306 333 14 44 2 500 333 +4358 /data/VOCdevkit/VOC2007/JPEGImages/008743.jpg 500 335 18 183 142 266 268 +4359 /data/VOCdevkit/VOC2007/JPEGImages/008745.jpg 500 375 1 26 209 124 322 1 211 239 308 375 14 235 146 305 255 14 57 149 125 275 +4360 /data/VOCdevkit/VOC2007/JPEGImages/008746.jpg 500 375 2 136 210 317 372 2 206 84 380 248 2 140 74 202 225 2 47 64 112 252 +4361 /data/VOCdevkit/VOC2007/JPEGImages/008751.jpg 500 375 10 1 238 379 340 14 144 271 267 353 14 219 199 270 248 14 81 147 109 198 14 52 146 82 232 14 22 149 52 184 14 233 141 261 188 14 368 78 458 312 14 364 114 415 195 +4362 /data/VOCdevkit/VOC2007/JPEGImages/008754.jpg 500 375 15 327 153 355 301 15 291 162 337 323 15 229 165 269 318 8 4 214 75 307 8 107 192 171 262 8 110 182 159 241 10 38 183 110 273 +4363 /data/VOCdevkit/VOC2007/JPEGImages/008758.jpg 500 364 9 101 140 288 292 9 168 106 243 175 9 23 138 127 220 9 51 80 106 114 9 192 60 240 89 14 343 50 461 319 +4364 /data/VOCdevkit/VOC2007/JPEGImages/008761.jpg 500 375 0 42 16 471 357 +4365 /data/VOCdevkit/VOC2007/JPEGImages/008762.jpg 333 500 11 222 349 291 408 14 85 118 238 500 +4366 /data/VOCdevkit/VOC2007/JPEGImages/008763.jpg 375 500 9 47 107 351 460 +4367 /data/VOCdevkit/VOC2007/JPEGImages/008765.jpg 500 374 14 1 23 38 129 14 388 116 482 349 14 298 154 397 295 14 144 119 187 187 14 171 110 242 280 14 197 126 292 313 1 266 222 450 345 1 160 204 320 303 1 115 186 206 274 +4368 /data/VOCdevkit/VOC2007/JPEGImages/008767.jpg 500 375 7 173 95 431 316 +4369 /data/VOCdevkit/VOC2007/JPEGImages/008774.jpg 500 375 14 227 123 324 375 14 101 96 244 375 14 317 95 426 375 +4370 /data/VOCdevkit/VOC2007/JPEGImages/008777.jpg 500 333 6 51 86 439 280 +4371 /data/VOCdevkit/VOC2007/JPEGImages/008778.jpg 500 375 4 367 1 426 149 14 1 2 187 375 +4372 /data/VOCdevkit/VOC2007/JPEGImages/008779.jpg 500 375 8 28 181 196 375 +4373 /data/VOCdevkit/VOC2007/JPEGImages/008780.jpg 500 333 2 388 124 424 220 14 153 96 260 282 14 2 91 401 333 14 434 198 500 333 +4374 /data/VOCdevkit/VOC2007/JPEGImages/008781.jpg 500 333 11 2 21 486 330 +4375 /data/VOCdevkit/VOC2007/JPEGImages/008782.jpg 500 375 5 130 126 388 267 +4376 /data/VOCdevkit/VOC2007/JPEGImages/008785.jpg 500 375 6 1 39 447 368 6 5 56 227 182 14 68 47 123 166 +4377 /data/VOCdevkit/VOC2007/JPEGImages/008786.jpg 500 332 12 174 168 378 270 12 50 155 118 246 12 114 166 160 240 12 379 118 500 230 14 420 114 462 197 14 217 126 277 239 14 55 147 87 221 14 115 151 146 219 +4378 /data/VOCdevkit/VOC2007/JPEGImages/008787.jpg 500 349 7 175 45 493 337 +4379 /data/VOCdevkit/VOC2007/JPEGImages/008788.jpg 500 484 5 44 172 404 369 6 380 277 500 441 6 12 272 72 313 +4380 /data/VOCdevkit/VOC2007/JPEGImages/008789.jpg 500 328 18 1 56 391 283 +4381 /data/VOCdevkit/VOC2007/JPEGImages/008791.jpg 500 333 0 8 114 488 225 +4382 /data/VOCdevkit/VOC2007/JPEGImages/008792.jpg 500 375 11 178 32 449 375 11 1 11 370 375 +4383 /data/VOCdevkit/VOC2007/JPEGImages/008795.jpg 500 333 16 74 49 431 287 +4384 /data/VOCdevkit/VOC2007/JPEGImages/008797.jpg 500 375 14 51 7 108 88 14 1 65 41 122 14 148 13 167 41 14 119 22 132 46 14 98 22 131 68 14 33 32 58 91 6 1 1 499 373 +4385 /data/VOCdevkit/VOC2007/JPEGImages/008798.jpg 500 375 5 255 142 490 367 5 215 184 259 266 +4386 /data/VOCdevkit/VOC2007/JPEGImages/008800.jpg 432 324 6 39 9 406 308 6 30 11 152 112 +4387 /data/VOCdevkit/VOC2007/JPEGImages/008802.jpg 320 212 12 89 42 225 212 14 119 16 194 114 +4388 /data/VOCdevkit/VOC2007/JPEGImages/008803.jpg 500 375 17 8 190 181 305 17 185 190 444 353 8 342 298 438 373 +4389 /data/VOCdevkit/VOC2007/JPEGImages/008804.jpg 320 224 12 90 52 209 210 14 115 11 184 133 +4390 /data/VOCdevkit/VOC2007/JPEGImages/008807.jpg 500 375 14 254 78 320 206 14 156 40 196 97 +4391 /data/VOCdevkit/VOC2007/JPEGImages/008808.jpg 300 200 14 186 46 263 200 14 118 28 191 200 14 38 20 125 199 +4392 /data/VOCdevkit/VOC2007/JPEGImages/008812.jpg 500 375 14 8 206 348 373 12 332 26 500 371 +4393 /data/VOCdevkit/VOC2007/JPEGImages/008816.jpg 500 375 14 124 56 466 375 +4394 /data/VOCdevkit/VOC2007/JPEGImages/008818.jpg 500 375 14 244 46 500 375 14 2 48 163 375 +4395 /data/VOCdevkit/VOC2007/JPEGImages/008820.jpg 375 500 14 160 179 280 395 3 82 58 281 230 +4396 /data/VOCdevkit/VOC2007/JPEGImages/008821.jpg 500 375 15 171 34 256 259 15 231 200 306 266 +4397 /data/VOCdevkit/VOC2007/JPEGImages/008824.jpg 500 378 6 131 146 214 211 6 211 146 327 209 6 310 149 424 208 6 335 127 379 149 6 366 119 465 163 6 456 141 500 170 13 92 215 248 328 14 129 192 208 303 +4398 /data/VOCdevkit/VOC2007/JPEGImages/008825.jpg 500 333 0 143 128 400 211 +4399 /data/VOCdevkit/VOC2007/JPEGImages/008827.jpg 425 319 11 211 168 403 272 11 17 139 174 254 +4400 /data/VOCdevkit/VOC2007/JPEGImages/008828.jpg 333 500 6 141 93 167 117 6 120 106 152 132 6 109 125 142 153 6 93 150 135 186 6 88 183 141 231 6 88 226 156 292 13 185 335 238 441 14 189 334 231 378 +4401 /data/VOCdevkit/VOC2007/JPEGImages/008829.jpg 500 333 6 34 61 406 255 14 75 32 128 111 14 171 43 217 81 14 464 16 500 223 14 388 61 428 135 +4402 /data/VOCdevkit/VOC2007/JPEGImages/008830.jpg 500 375 7 78 124 261 256 +4403 /data/VOCdevkit/VOC2007/JPEGImages/008832.jpg 500 375 2 215 160 288 253 +4404 /data/VOCdevkit/VOC2007/JPEGImages/008834.jpg 500 375 17 1 92 479 375 +4405 /data/VOCdevkit/VOC2007/JPEGImages/008839.jpg 500 333 1 295 143 454 326 14 331 51 470 313 14 102 49 231 250 14 72 154 153 301 +4406 /data/VOCdevkit/VOC2007/JPEGImages/008842.jpg 500 375 2 203 107 267 162 +4407 /data/VOCdevkit/VOC2007/JPEGImages/008844.jpg 375 500 8 104 185 333 500 14 2 73 301 500 +4408 /data/VOCdevkit/VOC2007/JPEGImages/008845.jpg 500 414 13 43 103 455 364 14 61 20 312 340 +4409 /data/VOCdevkit/VOC2007/JPEGImages/008846.jpg 500 333 7 192 96 439 259 15 449 1 500 165 +4410 /data/VOCdevkit/VOC2007/JPEGImages/008850.jpg 500 338 15 272 10 401 145 15 170 26 318 224 15 73 150 246 328 15 9 239 72 330 +4411 /data/VOCdevkit/VOC2007/JPEGImages/008851.jpg 500 375 19 108 71 252 241 +4412 /data/VOCdevkit/VOC2007/JPEGImages/008852.jpg 500 375 13 8 3 492 294 +4413 /data/VOCdevkit/VOC2007/JPEGImages/008853.jpg 450 451 9 109 200 329 325 +4414 /data/VOCdevkit/VOC2007/JPEGImages/008855.jpg 332 500 18 2 52 303 352 +4415 /data/VOCdevkit/VOC2007/JPEGImages/008857.jpg 500 375 14 55 36 351 375 14 94 38 500 375 14 3 88 141 317 +4416 /data/VOCdevkit/VOC2007/JPEGImages/008860.jpg 500 375 7 1 4 289 294 +4417 /data/VOCdevkit/VOC2007/JPEGImages/008861.jpg 500 333 0 358 223 388 261 +4418 /data/VOCdevkit/VOC2007/JPEGImages/008863.jpg 500 333 9 196 242 244 298 9 253 211 289 262 9 119 207 155 234 9 65 238 125 297 9 307 213 354 261 9 344 209 391 263 9 436 213 479 268 +4419 /data/VOCdevkit/VOC2007/JPEGImages/008864.jpg 500 333 17 2 191 289 326 8 344 153 500 323 14 235 67 343 295 14 332 109 463 328 14 146 75 209 192 14 104 149 219 294 14 38 147 160 298 14 44 172 104 236 +4420 /data/VOCdevkit/VOC2007/JPEGImages/008866.jpg 500 375 5 405 249 500 366 +4421 /data/VOCdevkit/VOC2007/JPEGImages/008868.jpg 500 375 3 18 179 368 273 3 234 123 380 222 13 312 191 426 324 14 343 128 443 319 +4422 /data/VOCdevkit/VOC2007/JPEGImages/008869.jpg 500 375 3 217 1 483 300 3 196 190 486 285 14 132 253 160 324 +4423 /data/VOCdevkit/VOC2007/JPEGImages/008870.jpg 500 333 2 131 132 391 333 +4424 /data/VOCdevkit/VOC2007/JPEGImages/008875.jpg 375 500 7 211 256 375 500 11 46 76 238 283 +4425 /data/VOCdevkit/VOC2007/JPEGImages/008877.jpg 333 500 13 22 1 326 480 +4426 /data/VOCdevkit/VOC2007/JPEGImages/008881.jpg 500 333 0 278 100 346 219 +4427 /data/VOCdevkit/VOC2007/JPEGImages/008882.jpg 310 480 12 86 125 215 427 14 86 75 234 299 +4428 /data/VOCdevkit/VOC2007/JPEGImages/008887.jpg 500 375 8 136 225 288 372 19 355 38 447 134 19 176 142 297 244 +4429 /data/VOCdevkit/VOC2007/JPEGImages/008889.jpg 500 375 11 93 89 342 332 +4430 /data/VOCdevkit/VOC2007/JPEGImages/008893.jpg 500 333 18 27 122 321 286 18 362 114 487 192 +4431 /data/VOCdevkit/VOC2007/JPEGImages/008894.jpg 500 500 4 217 98 403 499 14 2 1 499 500 +4432 /data/VOCdevkit/VOC2007/JPEGImages/008895.jpg 500 373 5 1 127 181 301 5 270 163 320 205 5 234 170 260 196 14 50 192 101 334 6 291 194 423 246 1 115 279 222 373 +4433 /data/VOCdevkit/VOC2007/JPEGImages/008896.jpg 500 332 6 185 121 383 198 +4434 /data/VOCdevkit/VOC2007/JPEGImages/008897.jpg 500 336 14 182 79 378 336 19 435 1 500 43 8 295 41 433 220 +4435 /data/VOCdevkit/VOC2007/JPEGImages/008898.jpg 500 375 11 1 43 321 375 +4436 /data/VOCdevkit/VOC2007/JPEGImages/008899.jpg 480 359 12 80 46 410 339 14 222 18 335 206 +4437 /data/VOCdevkit/VOC2007/JPEGImages/008901.jpg 500 375 13 59 234 297 375 14 138 142 257 365 14 217 126 263 213 14 253 128 397 375 +4438 /data/VOCdevkit/VOC2007/JPEGImages/008902.jpg 500 375 4 125 269 155 319 14 93 56 388 375 +4439 /data/VOCdevkit/VOC2007/JPEGImages/008903.jpg 500 400 6 244 151 358 227 6 1 151 58 175 +4440 /data/VOCdevkit/VOC2007/JPEGImages/008904.jpg 333 500 15 64 121 332 423 +4441 /data/VOCdevkit/VOC2007/JPEGImages/008906.jpg 500 375 7 182 164 266 211 +4442 /data/VOCdevkit/VOC2007/JPEGImages/008907.jpg 500 359 11 39 49 475 359 14 153 2 477 359 +4443 /data/VOCdevkit/VOC2007/JPEGImages/008908.jpg 500 375 0 1 1 500 259 +4444 /data/VOCdevkit/VOC2007/JPEGImages/008910.jpg 288 242 6 246 156 284 184 6 172 147 203 159 6 170 156 204 182 6 194 179 231 208 6 199 206 246 241 6 106 144 133 167 6 115 161 147 186 6 111 183 150 214 6 108 215 153 242 6 227 98 249 115 6 202 95 223 109 6 190 86 209 102 6 29 178 73 218 +4445 /data/VOCdevkit/VOC2007/JPEGImages/008912.jpg 500 398 16 29 163 269 339 16 343 184 409 239 16 252 169 291 237 16 282 179 322 240 +4446 /data/VOCdevkit/VOC2007/JPEGImages/008915.jpg 333 500 5 33 100 287 392 6 283 294 333 383 14 15 283 50 360 +4447 /data/VOCdevkit/VOC2007/JPEGImages/008916.jpg 500 333 14 292 93 396 333 14 205 71 323 331 14 97 47 209 333 +4448 /data/VOCdevkit/VOC2007/JPEGImages/008918.jpg 500 375 14 3 14 309 375 14 244 1 465 375 14 154 152 302 375 +4449 /data/VOCdevkit/VOC2007/JPEGImages/008922.jpg 500 375 8 2 206 87 375 8 254 156 373 232 14 275 148 362 200 17 360 167 500 308 8 224 230 437 375 +4450 /data/VOCdevkit/VOC2007/JPEGImages/008924.jpg 500 375 7 15 43 493 358 +4451 /data/VOCdevkit/VOC2007/JPEGImages/008925.jpg 500 333 4 75 61 104 144 4 153 64 190 243 4 243 67 261 241 4 351 68 386 241 4 452 57 488 268 4 366 57 412 270 4 392 40 461 317 4 291 40 354 313 4 193 39 259 313 4 29 50 86 272 4 82 35 150 312 4 1 36 39 304 +4452 /data/VOCdevkit/VOC2007/JPEGImages/008928.jpg 500 375 14 259 82 325 372 14 209 93 268 365 14 147 89 216 375 14 316 94 383 375 14 359 75 429 374 14 406 88 489 375 14 93 91 164 375 14 19 107 111 375 +4453 /data/VOCdevkit/VOC2007/JPEGImages/008934.jpg 333 500 2 26 75 220 344 +4454 /data/VOCdevkit/VOC2007/JPEGImages/008935.jpg 500 339 7 106 18 481 324 +4455 /data/VOCdevkit/VOC2007/JPEGImages/008937.jpg 500 334 2 205 82 307 296 15 65 1 270 333 15 369 1 500 333 15 1 2 60 330 +4456 /data/VOCdevkit/VOC2007/JPEGImages/008938.jpg 375 500 8 75 52 307 448 +4457 /data/VOCdevkit/VOC2007/JPEGImages/008941.jpg 500 375 10 1 200 446 375 14 271 145 446 370 14 154 73 340 303 +4458 /data/VOCdevkit/VOC2007/JPEGImages/008945.jpg 500 333 10 5 172 500 333 14 158 28 320 224 +4459 /data/VOCdevkit/VOC2007/JPEGImages/008946.jpg 500 336 14 241 148 358 301 +4460 /data/VOCdevkit/VOC2007/JPEGImages/008947.jpg 500 375 19 61 195 121 254 15 263 140 345 258 17 312 189 485 318 8 61 220 199 368 +4461 /data/VOCdevkit/VOC2007/JPEGImages/008949.jpg 500 375 19 235 1 500 207 +4462 /data/VOCdevkit/VOC2007/JPEGImages/008950.jpg 500 333 0 117 54 294 188 +4463 /data/VOCdevkit/VOC2007/JPEGImages/008952.jpg 500 375 13 287 121 358 236 14 268 111 361 167 +4464 /data/VOCdevkit/VOC2007/JPEGImages/008954.jpg 500 375 8 1 107 205 375 19 1 36 100 138 19 180 17 311 131 19 302 34 429 173 19 419 64 500 261 19 83 31 196 131 +4465 /data/VOCdevkit/VOC2007/JPEGImages/008956.jpg 500 333 2 157 26 365 319 +4466 /data/VOCdevkit/VOC2007/JPEGImages/008957.jpg 500 375 8 1 117 42 267 14 107 101 244 375 14 220 78 360 375 14 304 50 401 375 14 185 65 240 137 +4467 /data/VOCdevkit/VOC2007/JPEGImages/008959.jpg 500 375 2 1 74 375 375 +4468 /data/VOCdevkit/VOC2007/JPEGImages/008963.jpg 500 375 10 1 222 164 336 14 161 62 334 375 14 281 64 500 375 +4469 /data/VOCdevkit/VOC2007/JPEGImages/008964.jpg 500 333 11 220 103 496 333 11 18 74 491 333 +4470 /data/VOCdevkit/VOC2007/JPEGImages/008972.jpg 481 500 7 85 82 478 482 +4471 /data/VOCdevkit/VOC2007/JPEGImages/008974.jpg 500 375 14 178 11 409 375 14 2 142 206 375 +4472 /data/VOCdevkit/VOC2007/JPEGImages/008977.jpg 500 333 11 65 36 400 316 +4473 /data/VOCdevkit/VOC2007/JPEGImages/008981.jpg 500 371 2 128 101 394 371 +4474 /data/VOCdevkit/VOC2007/JPEGImages/008984.jpg 332 500 2 147 220 188 294 2 241 448 293 500 +4475 /data/VOCdevkit/VOC2007/JPEGImages/008986.jpg 500 375 0 79 121 399 275 0 274 158 469 326 +4476 /data/VOCdevkit/VOC2007/JPEGImages/008990.jpg 282 500 14 16 29 281 450 14 10 74 124 302 +4477 /data/VOCdevkit/VOC2007/JPEGImages/008991.jpg 500 375 19 302 85 360 159 8 106 96 287 368 8 308 249 484 375 +4478 /data/VOCdevkit/VOC2007/JPEGImages/008992.jpg 500 375 16 17 125 338 375 +4479 /data/VOCdevkit/VOC2007/JPEGImages/008993.jpg 500 375 14 251 85 370 375 14 169 131 291 375 +4480 /data/VOCdevkit/VOC2007/JPEGImages/008994.jpg 500 375 13 149 149 397 360 13 2 158 132 345 +4481 /data/VOCdevkit/VOC2007/JPEGImages/008996.jpg 375 500 7 47 175 297 463 14 1 99 347 500 +4482 /data/VOCdevkit/VOC2007/JPEGImages/008998.jpg 500 374 3 412 231 452 289 3 238 242 266 281 3 118 240 150 286 3 65 220 97 275 3 8 239 30 271 +4483 /data/VOCdevkit/VOC2007/JPEGImages/009001.jpg 333 500 3 104 66 192 422 +4484 /data/VOCdevkit/VOC2007/JPEGImages/009003.jpg 333 500 14 3 65 333 499 +4485 /data/VOCdevkit/VOC2007/JPEGImages/009008.jpg 500 375 13 23 59 446 294 6 291 36 325 57 +4486 /data/VOCdevkit/VOC2007/JPEGImages/009009.jpg 400 500 8 256 323 370 500 +4487 /data/VOCdevkit/VOC2007/JPEGImages/009010.jpg 500 375 8 77 70 162 222 8 290 77 422 290 +4488 /data/VOCdevkit/VOC2007/JPEGImages/009011.jpg 500 351 18 70 92 355 287 +4489 /data/VOCdevkit/VOC2007/JPEGImages/009012.jpg 375 500 4 114 1 277 499 4 292 27 367 217 14 102 1 375 167 +4490 /data/VOCdevkit/VOC2007/JPEGImages/009013.jpg 500 375 17 69 230 415 375 14 446 99 470 146 14 450 114 480 146 +4491 /data/VOCdevkit/VOC2007/JPEGImages/009014.jpg 500 333 11 274 199 341 326 11 250 210 313 284 14 115 40 130 79 14 87 38 102 81 +4492 /data/VOCdevkit/VOC2007/JPEGImages/009017.jpg 500 375 14 182 29 458 373 14 142 32 311 252 14 90 66 206 243 +4493 /data/VOCdevkit/VOC2007/JPEGImages/009021.jpg 375 500 5 22 50 291 442 +4494 /data/VOCdevkit/VOC2007/JPEGImages/009023.jpg 500 334 6 390 49 478 120 14 415 33 458 140 6 46 50 405 319 14 178 21 206 74 14 18 13 81 187 +4495 /data/VOCdevkit/VOC2007/JPEGImages/009025.jpg 500 332 11 52 23 381 332 +4496 /data/VOCdevkit/VOC2007/JPEGImages/009026.jpg 500 375 3 36 305 169 365 +4497 /data/VOCdevkit/VOC2007/JPEGImages/009028.jpg 500 375 1 171 106 367 319 14 156 32 318 235 +4498 /data/VOCdevkit/VOC2007/JPEGImages/009030.jpg 500 375 0 2 81 421 317 +4499 /data/VOCdevkit/VOC2007/JPEGImages/009031.jpg 500 333 16 227 146 258 189 16 129 98 153 116 +4500 /data/VOCdevkit/VOC2007/JPEGImages/009033.jpg 375 500 6 271 326 358 365 6 252 337 331 371 6 207 335 303 377 6 123 327 259 382 6 98 342 242 385 6 31 341 187 397 6 2 341 138 406 6 1 367 67 419 +4501 /data/VOCdevkit/VOC2007/JPEGImages/009038.jpg 500 333 5 123 73 362 248 +4502 /data/VOCdevkit/VOC2007/JPEGImages/009040.jpg 500 375 14 157 146 284 350 +4503 /data/VOCdevkit/VOC2007/JPEGImages/009041.jpg 500 333 13 133 99 375 285 14 158 69 272 255 +4504 /data/VOCdevkit/VOC2007/JPEGImages/009043.jpg 500 330 14 169 120 277 225 +4505 /data/VOCdevkit/VOC2007/JPEGImages/009044.jpg 500 332 14 375 38 436 90 14 465 57 500 155 14 29 50 95 240 14 77 66 107 112 14 4 62 40 189 13 49 41 494 299 +4506 /data/VOCdevkit/VOC2007/JPEGImages/009046.jpg 429 500 12 49 155 420 500 14 151 1 360 418 14 355 181 419 282 +4507 /data/VOCdevkit/VOC2007/JPEGImages/009047.jpg 500 332 13 11 53 385 332 14 109 2 164 179 14 180 2 241 127 14 266 2 329 68 14 334 2 402 192 14 407 9 447 114 14 78 17 105 57 14 161 3 184 53 +4508 /data/VOCdevkit/VOC2007/JPEGImages/009050.jpg 500 333 13 53 47 458 320 13 2 8 122 176 +4509 /data/VOCdevkit/VOC2007/JPEGImages/009052.jpg 500 375 6 212 110 467 284 14 335 131 371 166 +4510 /data/VOCdevkit/VOC2007/JPEGImages/009054.jpg 242 500 2 92 301 185 383 +4511 /data/VOCdevkit/VOC2007/JPEGImages/009055.jpg 500 332 8 143 24 428 332 +4512 /data/VOCdevkit/VOC2007/JPEGImages/009056.jpg 500 333 8 312 208 377 271 8 335 230 408 310 8 345 238 426 328 8 151 209 203 266 8 109 229 182 309 8 95 238 175 326 +4513 /data/VOCdevkit/VOC2007/JPEGImages/009057.jpg 500 333 7 170 82 379 282 +4514 /data/VOCdevkit/VOC2007/JPEGImages/009061.jpg 500 334 11 158 116 417 331 +4515 /data/VOCdevkit/VOC2007/JPEGImages/009062.jpg 500 375 5 89 132 387 217 +4516 /data/VOCdevkit/VOC2007/JPEGImages/009065.jpg 500 375 13 13 107 469 316 +4517 /data/VOCdevkit/VOC2007/JPEGImages/009067.jpg 480 450 14 171 82 299 245 12 96 101 435 357 +4518 /data/VOCdevkit/VOC2007/JPEGImages/009069.jpg 500 375 13 4 3 500 336 14 2 1 61 181 14 367 1 500 77 +4519 /data/VOCdevkit/VOC2007/JPEGImages/009070.jpg 500 374 17 88 163 426 353 +4520 /data/VOCdevkit/VOC2007/JPEGImages/009071.jpg 500 333 6 55 78 477 285 +4521 /data/VOCdevkit/VOC2007/JPEGImages/009074.jpg 480 360 12 191 146 261 323 14 197 92 264 177 +4522 /data/VOCdevkit/VOC2007/JPEGImages/009075.jpg 500 375 14 1 104 132 327 14 136 29 281 234 14 130 145 284 308 14 271 147 427 374 14 337 95 500 375 14 277 61 340 188 4 335 224 378 351 4 97 238 146 331 +4523 /data/VOCdevkit/VOC2007/JPEGImages/009076.jpg 500 375 0 4 153 500 375 +4524 /data/VOCdevkit/VOC2007/JPEGImages/009077.jpg 500 333 14 392 96 468 242 14 282 102 340 260 14 307 107 418 263 14 149 114 181 196 14 88 121 140 211 14 41 143 85 185 14 17 145 58 188 6 227 135 282 163 6 121 140 210 169 +4525 /data/VOCdevkit/VOC2007/JPEGImages/009081.jpg 500 375 6 77 63 461 324 +4526 /data/VOCdevkit/VOC2007/JPEGImages/009082.jpg 500 375 9 1 96 291 345 +4527 /data/VOCdevkit/VOC2007/JPEGImages/009083.jpg 500 344 0 4 160 497 318 +4528 /data/VOCdevkit/VOC2007/JPEGImages/009084.jpg 500 375 13 43 77 481 375 11 127 68 237 240 11 1 217 98 375 8 451 83 500 191 8 369 83 437 180 8 313 76 375 137 +4529 /data/VOCdevkit/VOC2007/JPEGImages/009088.jpg 500 375 2 203 3 459 375 +4530 /data/VOCdevkit/VOC2007/JPEGImages/009090.jpg 500 375 7 234 78 342 197 +4531 /data/VOCdevkit/VOC2007/JPEGImages/009092.jpg 500 262 5 217 113 362 230 5 362 151 401 214 6 402 172 436 231 14 191 171 212 212 +4532 /data/VOCdevkit/VOC2007/JPEGImages/009093.jpg 500 313 2 80 72 451 273 +4533 /data/VOCdevkit/VOC2007/JPEGImages/009095.jpg 375 500 10 1 305 231 500 17 1 249 181 330 +4534 /data/VOCdevkit/VOC2007/JPEGImages/009096.jpg 344 208 6 11 35 339 188 +4535 /data/VOCdevkit/VOC2007/JPEGImages/009097.jpg 373 500 19 2 73 111 232 +4536 /data/VOCdevkit/VOC2007/JPEGImages/009101.jpg 480 318 12 3 80 193 318 12 3 104 363 318 12 367 131 471 318 14 76 17 175 318 14 228 90 270 132 14 344 81 477 316 +4537 /data/VOCdevkit/VOC2007/JPEGImages/009102.jpg 500 375 14 1 151 259 375 3 1 197 500 375 2 303 156 361 208 +4538 /data/VOCdevkit/VOC2007/JPEGImages/009103.jpg 500 334 11 75 1 500 261 11 135 133 370 293 +4539 /data/VOCdevkit/VOC2007/JPEGImages/009104.jpg 500 375 2 223 150 302 265 +4540 /data/VOCdevkit/VOC2007/JPEGImages/009107.jpg 500 375 7 1 44 422 374 +4541 /data/VOCdevkit/VOC2007/JPEGImages/009109.jpg 500 345 10 1 238 500 345 +4542 /data/VOCdevkit/VOC2007/JPEGImages/009110.jpg 500 375 14 144 62 293 266 +4543 /data/VOCdevkit/VOC2007/JPEGImages/009111.jpg 500 334 5 152 65 430 270 6 457 172 489 196 +4544 /data/VOCdevkit/VOC2007/JPEGImages/009115.jpg 500 375 1 135 135 343 299 14 126 59 267 367 +4545 /data/VOCdevkit/VOC2007/JPEGImages/009118.jpg 500 375 17 145 157 387 322 +4546 /data/VOCdevkit/VOC2007/JPEGImages/009119.jpg 500 375 6 152 175 452 303 14 461 142 491 225 6 313 128 385 179 +4547 /data/VOCdevkit/VOC2007/JPEGImages/009120.jpg 500 242 3 274 132 348 151 +4548 /data/VOCdevkit/VOC2007/JPEGImages/009122.jpg 500 375 5 289 266 500 355 14 82 295 97 330 6 125 297 204 333 6 226 305 290 336 +4549 /data/VOCdevkit/VOC2007/JPEGImages/009124.jpg 500 333 18 126 57 398 287 14 222 190 289 323 +4550 /data/VOCdevkit/VOC2007/JPEGImages/009125.jpg 500 375 6 119 180 262 235 14 477 172 492 208 14 465 177 479 209 14 151 178 390 375 14 56 166 256 375 +4551 /data/VOCdevkit/VOC2007/JPEGImages/009127.jpg 500 375 14 418 202 496 321 14 336 206 406 303 14 60 170 175 375 14 4 138 111 372 14 148 26 379 375 +4552 /data/VOCdevkit/VOC2007/JPEGImages/009130.jpg 436 480 12 34 140 362 462 14 137 74 301 306 +4553 /data/VOCdevkit/VOC2007/JPEGImages/009132.jpg 500 332 7 72 48 425 309 +4554 /data/VOCdevkit/VOC2007/JPEGImages/009134.jpg 500 375 18 93 82 406 288 6 397 201 466 230 +4555 /data/VOCdevkit/VOC2007/JPEGImages/009135.jpg 500 375 1 76 95 432 325 +4556 /data/VOCdevkit/VOC2007/JPEGImages/009137.jpg 500 334 3 213 147 266 169 +4557 /data/VOCdevkit/VOC2007/JPEGImages/009139.jpg 500 375 14 69 1 107 98 14 98 1 168 202 14 1 2 43 199 14 160 4 203 82 14 398 2 500 375 13 111 42 437 374 +4558 /data/VOCdevkit/VOC2007/JPEGImages/009140.jpg 500 327 6 1 1 500 327 +4559 /data/VOCdevkit/VOC2007/JPEGImages/009142.jpg 358 500 11 24 14 295 429 +4560 /data/VOCdevkit/VOC2007/JPEGImages/009143.jpg 375 500 14 4 80 251 349 14 4 157 371 500 +4561 /data/VOCdevkit/VOC2007/JPEGImages/009145.jpg 500 375 13 104 57 383 370 13 15 96 135 299 14 54 68 97 137 +4562 /data/VOCdevkit/VOC2007/JPEGImages/009146.jpg 500 375 2 155 78 359 337 +4563 /data/VOCdevkit/VOC2007/JPEGImages/009149.jpg 500 333 6 193 93 496 326 14 385 133 422 167 14 305 128 344 162 +4564 /data/VOCdevkit/VOC2007/JPEGImages/009152.jpg 500 334 14 93 133 157 326 13 134 176 202 329 +4565 /data/VOCdevkit/VOC2007/JPEGImages/009154.jpg 480 321 10 31 116 480 319 +4566 /data/VOCdevkit/VOC2007/JPEGImages/009156.jpg 500 375 6 36 74 302 191 6 158 121 500 375 6 301 75 383 109 6 410 72 475 96 6 24 82 61 99 6 284 68 341 97 +4567 /data/VOCdevkit/VOC2007/JPEGImages/009158.jpg 500 375 2 1 54 306 375 +4568 /data/VOCdevkit/VOC2007/JPEGImages/009164.jpg 375 500 4 184 304 214 400 10 59 364 375 500 14 1 214 157 500 14 54 139 201 369 14 164 225 294 366 +4569 /data/VOCdevkit/VOC2007/JPEGImages/009165.jpg 500 375 14 441 1 500 102 19 89 46 222 211 19 217 49 356 178 19 302 164 358 230 19 203 153 302 244 14 312 180 347 212 +4570 /data/VOCdevkit/VOC2007/JPEGImages/009167.jpg 500 333 0 37 101 436 213 +4571 /data/VOCdevkit/VOC2007/JPEGImages/009169.jpg 500 375 16 144 142 209 194 16 104 140 154 186 16 131 133 184 153 16 217 110 235 133 16 83 165 118 198 16 236 111 252 132 16 250 111 264 136 16 295 136 332 187 16 341 135 366 180 16 363 141 394 193 16 386 131 399 167 16 399 138 434 191 +4572 /data/VOCdevkit/VOC2007/JPEGImages/009170.jpg 375 500 9 248 158 362 292 9 153 154 207 250 9 115 141 141 189 +4573 /data/VOCdevkit/VOC2007/JPEGImages/009171.jpg 500 375 10 3 192 498 375 14 366 93 500 306 14 378 124 459 247 14 307 128 368 217 14 245 121 308 202 14 171 135 227 194 14 87 128 147 220 14 35 120 93 234 14 1 119 51 266 4 262 178 275 227 +4574 /data/VOCdevkit/VOC2007/JPEGImages/009172.jpg 500 375 15 1 15 185 272 15 154 142 263 265 15 181 30 316 244 15 239 150 316 281 15 258 100 412 246 15 295 217 376 317 15 350 230 429 337 15 394 167 500 374 +4575 /data/VOCdevkit/VOC2007/JPEGImages/009176.jpg 500 375 11 52 118 452 357 +4576 /data/VOCdevkit/VOC2007/JPEGImages/009182.jpg 500 375 6 19 27 500 335 6 431 11 500 101 +4577 /data/VOCdevkit/VOC2007/JPEGImages/009183.jpg 500 375 7 54 4 500 373 +4578 /data/VOCdevkit/VOC2007/JPEGImages/009188.jpg 500 375 5 15 56 488 286 +4579 /data/VOCdevkit/VOC2007/JPEGImages/009190.jpg 500 458 11 62 58 500 458 +4580 /data/VOCdevkit/VOC2007/JPEGImages/009198.jpg 500 403 1 22 27 484 396 +4581 /data/VOCdevkit/VOC2007/JPEGImages/009199.jpg 500 500 11 22 134 379 494 +4582 /data/VOCdevkit/VOC2007/JPEGImages/009201.jpg 500 333 6 96 163 379 331 14 181 178 299 333 +4583 /data/VOCdevkit/VOC2007/JPEGImages/009203.jpg 500 333 18 3 125 438 294 +4584 /data/VOCdevkit/VOC2007/JPEGImages/009204.jpg 500 375 11 132 62 327 374 +4585 /data/VOCdevkit/VOC2007/JPEGImages/009206.jpg 500 375 6 132 128 447 244 +4586 /data/VOCdevkit/VOC2007/JPEGImages/009207.jpg 375 500 14 92 132 374 500 +4587 /data/VOCdevkit/VOC2007/JPEGImages/009210.jpg 500 375 6 160 223 336 295 +4588 /data/VOCdevkit/VOC2007/JPEGImages/009211.jpg 500 334 0 152 140 302 214 +4589 /data/VOCdevkit/VOC2007/JPEGImages/009216.jpg 500 333 19 2 100 376 332 7 179 1 399 121 +4590 /data/VOCdevkit/VOC2007/JPEGImages/009217.jpg 500 333 19 9 1 325 224 +4591 /data/VOCdevkit/VOC2007/JPEGImages/009219.jpg 500 375 14 26 46 162 374 14 117 90 199 329 14 214 72 305 282 14 320 61 380 298 14 310 60 429 368 +4592 /data/VOCdevkit/VOC2007/JPEGImages/009220.jpg 500 345 18 47 22 429 337 +4593 /data/VOCdevkit/VOC2007/JPEGImages/009222.jpg 500 375 8 36 171 309 375 17 65 109 351 251 +4594 /data/VOCdevkit/VOC2007/JPEGImages/009223.jpg 500 375 9 61 200 230 313 14 292 71 335 187 14 244 64 274 174 +4595 /data/VOCdevkit/VOC2007/JPEGImages/009225.jpg 500 375 8 178 289 295 361 8 305 264 408 353 +4596 /data/VOCdevkit/VOC2007/JPEGImages/009226.jpg 500 375 19 128 1 351 209 +4597 /data/VOCdevkit/VOC2007/JPEGImages/009228.jpg 500 354 1 284 147 374 353 14 195 25 366 354 +4598 /data/VOCdevkit/VOC2007/JPEGImages/009229.jpg 500 375 13 320 128 500 260 13 26 133 140 245 14 412 49 496 161 14 1 80 72 255 +4599 /data/VOCdevkit/VOC2007/JPEGImages/009231.jpg 500 355 12 1 90 266 337 12 63 82 305 325 12 174 77 465 309 14 33 54 140 187 14 107 53 215 136 14 270 60 376 174 +4600 /data/VOCdevkit/VOC2007/JPEGImages/009232.jpg 500 375 2 194 71 418 375 +4601 /data/VOCdevkit/VOC2007/JPEGImages/009233.jpg 500 375 11 157 61 327 297 +4602 /data/VOCdevkit/VOC2007/JPEGImages/009234.jpg 500 375 7 2 111 316 375 +4603 /data/VOCdevkit/VOC2007/JPEGImages/009235.jpg 500 500 11 82 358 128 489 +4604 /data/VOCdevkit/VOC2007/JPEGImages/009237.jpg 333 500 1 225 194 271 319 1 112 310 187 458 14 218 63 301 168 14 231 135 289 266 14 171 146 241 250 14 126 174 216 300 14 120 233 187 417 +4605 /data/VOCdevkit/VOC2007/JPEGImages/009240.jpg 500 375 3 229 87 328 174 14 397 128 489 216 14 457 119 498 192 14 305 181 499 375 +4606 /data/VOCdevkit/VOC2007/JPEGImages/009241.jpg 500 375 6 135 142 244 174 +4607 /data/VOCdevkit/VOC2007/JPEGImages/009243.jpg 500 375 6 100 92 415 330 +4608 /data/VOCdevkit/VOC2007/JPEGImages/009248.jpg 500 375 14 3 34 331 372 +4609 /data/VOCdevkit/VOC2007/JPEGImages/009253.jpg 500 390 14 42 25 284 390 14 157 48 475 390 +4610 /data/VOCdevkit/VOC2007/JPEGImages/009256.jpg 500 375 7 132 81 496 340 +4611 /data/VOCdevkit/VOC2007/JPEGImages/009257.jpg 500 375 4 128 1 211 206 +4612 /data/VOCdevkit/VOC2007/JPEGImages/009258.jpg 334 500 1 63 175 334 500 14 52 1 321 470 +4613 /data/VOCdevkit/VOC2007/JPEGImages/009260.jpg 500 375 18 35 149 412 265 +4614 /data/VOCdevkit/VOC2007/JPEGImages/009261.jpg 500 375 6 270 311 296 330 +4615 /data/VOCdevkit/VOC2007/JPEGImages/009262.jpg 500 333 0 11 96 488 244 +4616 /data/VOCdevkit/VOC2007/JPEGImages/009263.jpg 500 375 8 61 160 136 307 14 17 96 104 307 +4617 /data/VOCdevkit/VOC2007/JPEGImages/009264.jpg 500 375 9 134 95 500 374 +4618 /data/VOCdevkit/VOC2007/JPEGImages/009265.jpg 500 324 5 30 1 382 322 +4619 /data/VOCdevkit/VOC2007/JPEGImages/009266.jpg 500 375 2 84 2 433 375 +4620 /data/VOCdevkit/VOC2007/JPEGImages/009267.jpg 500 375 6 24 233 76 256 6 323 240 427 272 6 198 248 294 284 +4621 /data/VOCdevkit/VOC2007/JPEGImages/009274.jpg 500 375 19 241 186 355 312 14 354 183 450 287 14 1 56 330 375 +4622 /data/VOCdevkit/VOC2007/JPEGImages/009275.jpg 375 500 17 46 248 265 358 +4623 /data/VOCdevkit/VOC2007/JPEGImages/009276.jpg 333 500 11 26 271 333 497 +4624 /data/VOCdevkit/VOC2007/JPEGImages/009277.jpg 500 375 13 55 143 263 322 14 130 103 252 319 +4625 /data/VOCdevkit/VOC2007/JPEGImages/009280.jpg 500 333 1 3 1 498 332 +4626 /data/VOCdevkit/VOC2007/JPEGImages/009284.jpg 500 375 6 39 271 499 373 14 196 136 446 271 14 1 274 45 374 14 74 187 93 282 14 98 183 130 280 14 140 184 169 275 14 167 188 211 266 14 167 173 189 207 14 1 169 45 310 14 377 202 400 228 14 480 211 500 279 14 453 217 482 262 14 453 241 475 271 14 107 272 150 319 14 202 196 227 241 +4627 /data/VOCdevkit/VOC2007/JPEGImages/009292.jpg 327 500 0 1 7 326 472 14 245 458 274 493 +4628 /data/VOCdevkit/VOC2007/JPEGImages/009293.jpg 298 448 13 52 1 298 448 +4629 /data/VOCdevkit/VOC2007/JPEGImages/009294.jpg 332 500 14 66 197 289 500 8 1 246 276 500 +4630 /data/VOCdevkit/VOC2007/JPEGImages/009297.jpg 500 375 4 374 134 394 206 4 397 164 426 248 4 426 199 454 262 14 205 71 280 153 14 169 66 262 183 14 101 74 305 334 14 2 107 190 375 14 412 71 484 181 14 444 80 500 224 10 181 150 500 374 +4631 /data/VOCdevkit/VOC2007/JPEGImages/009298.jpg 500 375 5 1 19 357 373 +4632 /data/VOCdevkit/VOC2007/JPEGImages/009300.jpg 307 410 2 64 153 173 369 2 173 84 286 274 +4633 /data/VOCdevkit/VOC2007/JPEGImages/009301.jpg 500 375 9 178 88 500 373 +4634 /data/VOCdevkit/VOC2007/JPEGImages/009302.jpg 497 373 6 39 131 460 314 13 1 122 91 187 +4635 /data/VOCdevkit/VOC2007/JPEGImages/009304.jpg 500 375 5 285 36 500 375 5 162 117 289 263 +4636 /data/VOCdevkit/VOC2007/JPEGImages/009305.jpg 500 334 1 76 74 401 318 +4637 /data/VOCdevkit/VOC2007/JPEGImages/009310.jpg 500 375 7 176 128 259 240 19 86 53 214 161 8 1 189 119 323 +4638 /data/VOCdevkit/VOC2007/JPEGImages/009311.jpg 500 375 14 1 34 69 250 8 416 163 490 276 8 332 167 403 286 +4639 /data/VOCdevkit/VOC2007/JPEGImages/009313.jpg 375 500 8 2 277 137 362 15 1 354 45 427 +4640 /data/VOCdevkit/VOC2007/JPEGImages/009314.jpg 375 500 5 183 192 321 330 14 90 209 351 500 14 214 252 339 437 14 202 211 254 300 14 57 235 100 351 +4641 /data/VOCdevkit/VOC2007/JPEGImages/009317.jpg 500 375 14 133 82 220 269 13 86 158 295 307 +4642 /data/VOCdevkit/VOC2007/JPEGImages/009319.jpg 500 500 19 80 55 462 465 +4643 /data/VOCdevkit/VOC2007/JPEGImages/009320.jpg 500 375 16 288 215 451 375 16 430 329 500 375 16 440 254 480 286 16 192 284 276 361 14 1 104 294 375 +4644 /data/VOCdevkit/VOC2007/JPEGImages/009321.jpg 500 315 6 33 57 478 285 +4645 /data/VOCdevkit/VOC2007/JPEGImages/009322.jpg 500 333 13 298 239 351 328 14 305 207 352 306 6 1 224 47 277 6 31 220 93 264 6 72 209 130 256 6 119 214 156 252 6 140 212 178 245 6 154 195 205 240 5 203 184 233 219 +4646 /data/VOCdevkit/VOC2007/JPEGImages/009328.jpg 425 319 14 264 2 425 319 14 38 56 170 278 14 3 69 217 319 14 169 63 296 234 +4647 /data/VOCdevkit/VOC2007/JPEGImages/009329.jpg 500 333 0 5 3 498 333 +4648 /data/VOCdevkit/VOC2007/JPEGImages/009332.jpg 334 500 0 196 247 334 356 14 158 293 233 397 +4649 /data/VOCdevkit/VOC2007/JPEGImages/009335.jpg 500 375 6 98 147 279 208 +4650 /data/VOCdevkit/VOC2007/JPEGImages/009338.jpg 500 375 13 84 112 417 331 +4651 /data/VOCdevkit/VOC2007/JPEGImages/009340.jpg 500 356 18 59 150 431 267 +4652 /data/VOCdevkit/VOC2007/JPEGImages/009341.jpg 500 375 6 23 82 480 305 +4653 /data/VOCdevkit/VOC2007/JPEGImages/009344.jpg 500 334 14 293 2 486 334 14 199 98 255 172 14 233 104 316 269 +4654 /data/VOCdevkit/VOC2007/JPEGImages/009345.jpg 500 375 17 132 118 497 292 14 298 87 460 375 14 11 110 224 375 14 188 70 319 316 +4655 /data/VOCdevkit/VOC2007/JPEGImages/009346.jpg 500 375 7 60 123 220 305 7 243 105 437 317 +4656 /data/VOCdevkit/VOC2007/JPEGImages/009352.jpg 500 375 7 248 131 382 255 14 124 2 174 228 +4657 /data/VOCdevkit/VOC2007/JPEGImages/009353.jpg 500 333 17 2 157 314 333 +4658 /data/VOCdevkit/VOC2007/JPEGImages/009355.jpg 500 375 1 15 51 454 318 +4659 /data/VOCdevkit/VOC2007/JPEGImages/009356.jpg 500 375 0 423 141 446 160 0 435 160 454 177 0 445 178 465 198 0 434 199 453 216 0 456 200 475 216 0 475 199 496 215 0 440 218 459 235 0 426 237 444 254 0 414 257 433 273 +4660 /data/VOCdevkit/VOC2007/JPEGImages/009357.jpg 500 375 19 365 149 500 305 19 189 182 305 302 +4661 /data/VOCdevkit/VOC2007/JPEGImages/009360.jpg 500 375 6 185 121 458 327 +4662 /data/VOCdevkit/VOC2007/JPEGImages/009361.jpg 500 332 13 111 140 342 258 14 137 102 266 257 14 335 13 402 170 14 375 35 426 165 +4663 /data/VOCdevkit/VOC2007/JPEGImages/009363.jpg 375 500 14 1 81 308 500 17 1 128 375 500 +4664 /data/VOCdevkit/VOC2007/JPEGImages/009364.jpg 500 375 14 263 2 500 375 14 8 92 316 375 14 145 41 174 77 14 209 39 238 78 +4665 /data/VOCdevkit/VOC2007/JPEGImages/009366.jpg 334 500 4 14 4 158 469 +4666 /data/VOCdevkit/VOC2007/JPEGImages/009367.jpg 500 333 17 333 204 496 305 17 100 201 316 294 15 344 156 382 224 +4667 /data/VOCdevkit/VOC2007/JPEGImages/009369.jpg 320 206 12 93 25 279 197 14 133 9 215 101 +4668 /data/VOCdevkit/VOC2007/JPEGImages/009370.jpg 500 375 14 90 113 210 340 1 51 207 240 370 +4669 /data/VOCdevkit/VOC2007/JPEGImages/009372.jpg 500 330 18 103 128 399 259 +4670 /data/VOCdevkit/VOC2007/JPEGImages/009376.jpg 500 375 6 1 103 366 347 14 303 104 350 192 14 256 108 297 174 14 242 68 280 176 14 277 75 305 136 14 305 75 345 150 14 345 94 380 241 14 454 85 486 148 14 444 141 494 224 6 372 110 463 144 14 178 149 198 173 14 150 151 162 172 14 1 132 38 199 14 461 160 495 217 +4671 /data/VOCdevkit/VOC2007/JPEGImages/009379.jpg 500 375 19 220 219 248 250 19 402 217 436 252 19 164 216 186 245 +4672 /data/VOCdevkit/VOC2007/JPEGImages/009380.jpg 480 369 12 87 84 397 245 14 209 41 295 184 +4673 /data/VOCdevkit/VOC2007/JPEGImages/009381.jpg 500 375 6 42 2 500 339 6 1 1 245 124 +4674 /data/VOCdevkit/VOC2007/JPEGImages/009383.jpg 500 375 11 3 3 496 341 +4675 /data/VOCdevkit/VOC2007/JPEGImages/009384.jpg 500 375 6 167 293 266 372 6 70 303 150 361 6 2 298 58 374 6 276 313 329 351 5 313 295 348 340 +4676 /data/VOCdevkit/VOC2007/JPEGImages/009385.jpg 500 375 10 5 25 500 375 +4677 /data/VOCdevkit/VOC2007/JPEGImages/009387.jpg 500 289 5 206 238 356 276 6 173 256 210 277 +4678 /data/VOCdevkit/VOC2007/JPEGImages/009390.jpg 500 333 2 6 19 406 328 +4679 /data/VOCdevkit/VOC2007/JPEGImages/009391.jpg 343 500 14 82 146 228 406 +4680 /data/VOCdevkit/VOC2007/JPEGImages/009395.jpg 500 333 2 84 160 199 234 +4681 /data/VOCdevkit/VOC2007/JPEGImages/009396.jpg 266 500 6 134 420 266 500 6 30 455 90 481 +4682 /data/VOCdevkit/VOC2007/JPEGImages/009397.jpg 500 375 19 1 163 89 240 8 105 188 190 286 +4683 /data/VOCdevkit/VOC2007/JPEGImages/009399.jpg 500 335 18 142 67 415 275 +4684 /data/VOCdevkit/VOC2007/JPEGImages/009400.jpg 500 333 9 352 134 429 260 +4685 /data/VOCdevkit/VOC2007/JPEGImages/009402.jpg 500 333 14 169 88 455 333 +4686 /data/VOCdevkit/VOC2007/JPEGImages/009403.jpg 350 249 7 104 27 293 103 +4687 /data/VOCdevkit/VOC2007/JPEGImages/009404.jpg 500 375 19 1 32 259 276 19 261 53 500 317 +4688 /data/VOCdevkit/VOC2007/JPEGImages/009415.jpg 500 321 14 70 108 256 321 14 153 1 498 320 14 465 152 500 269 14 199 179 288 278 +4689 /data/VOCdevkit/VOC2007/JPEGImages/009416.jpg 500 375 15 8 85 500 374 15 1 1 190 216 +4690 /data/VOCdevkit/VOC2007/JPEGImages/009423.jpg 500 375 3 131 4 344 315 14 287 259 309 297 14 257 260 274 297 +4691 /data/VOCdevkit/VOC2007/JPEGImages/009425.jpg 500 375 14 210 22 343 375 +4692 /data/VOCdevkit/VOC2007/JPEGImages/009426.jpg 500 375 6 181 197 383 301 +4693 /data/VOCdevkit/VOC2007/JPEGImages/009427.jpg 500 333 6 1 8 490 333 +4694 /data/VOCdevkit/VOC2007/JPEGImages/009428.jpg 375 500 14 4 40 320 500 +4695 /data/VOCdevkit/VOC2007/JPEGImages/009430.jpg 500 375 6 1 51 500 354 14 443 39 475 121 14 474 22 500 131 14 111 29 148 80 14 57 19 107 80 14 20 32 70 83 14 2 16 22 85 14 135 30 175 80 14 374 29 394 57 14 359 37 373 56 14 347 33 361 56 14 322 41 340 56 14 202 39 217 58 14 164 36 185 61 14 418 63 438 83 +4696 /data/VOCdevkit/VOC2007/JPEGImages/009431.jpg 375 500 4 1 107 121 500 7 65 1 375 500 +4697 /data/VOCdevkit/VOC2007/JPEGImages/009435.jpg 500 333 8 376 141 500 294 17 1 138 252 328 +4698 /data/VOCdevkit/VOC2007/JPEGImages/009436.jpg 500 347 18 158 29 326 254 14 370 149 443 284 +4699 /data/VOCdevkit/VOC2007/JPEGImages/009441.jpg 500 375 14 5 3 396 375 13 4 273 500 375 +4700 /data/VOCdevkit/VOC2007/JPEGImages/009442.jpg 500 333 11 2 16 392 333 +4701 /data/VOCdevkit/VOC2007/JPEGImages/009444.jpg 500 375 8 139 271 219 375 8 298 270 380 375 +4702 /data/VOCdevkit/VOC2007/JPEGImages/009447.jpg 500 281 1 41 24 377 262 +4703 /data/VOCdevkit/VOC2007/JPEGImages/009449.jpg 500 375 11 127 133 468 330 +4704 /data/VOCdevkit/VOC2007/JPEGImages/009450.jpg 375 500 9 243 170 375 334 9 30 153 166 329 9 1 141 96 242 9 160 119 281 173 9 117 119 192 237 +4705 /data/VOCdevkit/VOC2007/JPEGImages/009451.jpg 500 375 16 190 161 409 375 16 138 103 344 325 16 408 69 468 94 16 1 84 26 170 +4706 /data/VOCdevkit/VOC2007/JPEGImages/009452.jpg 500 332 14 275 77 356 313 14 414 102 500 332 14 1 27 97 175 14 1 122 234 332 +4707 /data/VOCdevkit/VOC2007/JPEGImages/009453.jpg 500 375 2 2 149 356 375 +4708 /data/VOCdevkit/VOC2007/JPEGImages/009462.jpg 369 492 15 105 286 266 472 +4709 /data/VOCdevkit/VOC2007/JPEGImages/009467.jpg 500 375 2 93 206 293 342 2 84 37 175 147 2 18 43 90 141 +4710 /data/VOCdevkit/VOC2007/JPEGImages/009471.jpg 500 375 17 2 4 500 351 +4711 /data/VOCdevkit/VOC2007/JPEGImages/009473.jpg 500 375 14 339 99 500 375 14 181 91 344 375 14 30 96 228 375 +4712 /data/VOCdevkit/VOC2007/JPEGImages/009474.jpg 375 500 19 142 1 375 365 +4713 /data/VOCdevkit/VOC2007/JPEGImages/009475.jpg 500 333 6 4 67 500 333 14 174 92 252 149 +4714 /data/VOCdevkit/VOC2007/JPEGImages/009478.jpg 448 336 8 213 1 446 316 14 96 25 309 336 +4715 /data/VOCdevkit/VOC2007/JPEGImages/009482.jpg 500 375 10 68 110 333 374 14 325 135 500 372 14 326 118 366 160 14 231 100 269 151 14 214 101 245 161 14 189 101 232 168 14 141 117 225 255 14 8 153 125 350 14 12 21 247 215 4 272 147 295 191 14 440 49 473 82 14 412 40 443 82 14 450 99 496 139 +4716 /data/VOCdevkit/VOC2007/JPEGImages/009483.jpg 334 500 7 14 19 333 487 +4717 /data/VOCdevkit/VOC2007/JPEGImages/009485.jpg 500 375 11 153 11 450 353 +4718 /data/VOCdevkit/VOC2007/JPEGImages/009486.jpg 375 500 17 3 217 202 345 8 202 231 266 401 +4719 /data/VOCdevkit/VOC2007/JPEGImages/009487.jpg 500 375 8 401 214 500 375 8 72 221 250 375 14 43 52 309 375 +4720 /data/VOCdevkit/VOC2007/JPEGImages/009489.jpg 500 375 7 173 104 300 244 +4721 /data/VOCdevkit/VOC2007/JPEGImages/009492.jpg 500 333 6 101 61 489 252 +4722 /data/VOCdevkit/VOC2007/JPEGImages/009493.jpg 500 375 1 39 189 316 330 14 16 123 192 291 +4723 /data/VOCdevkit/VOC2007/JPEGImages/009495.jpg 500 375 13 331 81 500 351 13 177 75 342 344 13 24 96 194 337 +4724 /data/VOCdevkit/VOC2007/JPEGImages/009498.jpg 500 374 5 97 65 356 299 +4725 /data/VOCdevkit/VOC2007/JPEGImages/009501.jpg 500 335 18 193 118 274 230 +4726 /data/VOCdevkit/VOC2007/JPEGImages/009503.jpg 500 375 17 55 186 323 375 +4727 /data/VOCdevkit/VOC2007/JPEGImages/009505.jpg 413 480 12 102 111 346 415 14 171 56 298 272 +4728 /data/VOCdevkit/VOC2007/JPEGImages/009506.jpg 500 333 18 2 2 500 333 +4729 /data/VOCdevkit/VOC2007/JPEGImages/009509.jpg 500 375 1 263 39 469 181 +4730 /data/VOCdevkit/VOC2007/JPEGImages/009510.jpg 500 375 5 86 141 378 284 +4731 /data/VOCdevkit/VOC2007/JPEGImages/009511.jpg 500 375 19 237 68 349 174 14 194 72 362 317 8 96 114 327 375 +4732 /data/VOCdevkit/VOC2007/JPEGImages/009513.jpg 375 500 11 105 179 286 470 +4733 /data/VOCdevkit/VOC2007/JPEGImages/009514.jpg 500 375 8 152 159 259 319 8 284 163 396 311 8 377 159 436 290 8 418 155 461 273 8 87 146 153 289 14 106 114 164 286 14 167 113 204 166 14 195 114 269 293 14 373 116 414 200 14 311 120 383 227 15 5 39 91 259 10 217 159 358 287 15 243 67 323 167 +4734 /data/VOCdevkit/VOC2007/JPEGImages/009521.jpg 500 375 19 472 189 500 267 +4735 /data/VOCdevkit/VOC2007/JPEGImages/009522.jpg 399 349 7 29 32 399 347 +4736 /data/VOCdevkit/VOC2007/JPEGImages/009525.jpg 405 480 14 149 69 259 289 12 71 113 316 413 +4737 /data/VOCdevkit/VOC2007/JPEGImages/009529.jpg 500 375 8 294 234 369 344 14 220 189 412 375 14 313 169 436 372 14 415 167 500 278 14 181 85 279 304 14 38 124 106 308 +4738 /data/VOCdevkit/VOC2007/JPEGImages/009530.jpg 500 333 5 191 245 279 272 6 280 250 316 267 6 120 266 174 287 6 42 267 112 298 +4739 /data/VOCdevkit/VOC2007/JPEGImages/009534.jpg 500 334 1 312 247 433 332 1 67 237 160 305 14 330 201 412 309 14 75 199 137 298 +4740 /data/VOCdevkit/VOC2007/JPEGImages/009535.jpg 500 332 12 181 90 424 332 14 227 48 323 275 +4741 /data/VOCdevkit/VOC2007/JPEGImages/009536.jpg 500 375 6 57 61 500 354 14 3 83 30 180 +4742 /data/VOCdevkit/VOC2007/JPEGImages/009538.jpg 500 331 3 156 236 500 308 +4743 /data/VOCdevkit/VOC2007/JPEGImages/009539.jpg 500 375 14 100 195 125 259 14 82 200 107 261 14 125 204 153 269 14 192 190 240 274 14 260 170 345 324 14 323 183 368 298 14 366 177 417 308 14 432 167 500 319 +4744 /data/VOCdevkit/VOC2007/JPEGImages/009544.jpg 500 386 7 7 2 316 237 +4745 /data/VOCdevkit/VOC2007/JPEGImages/009547.jpg 375 500 4 241 309 326 500 4 113 203 168 429 4 1 192 49 383 14 46 26 350 309 +4746 /data/VOCdevkit/VOC2007/JPEGImages/009548.jpg 375 500 18 125 155 298 387 18 1 159 168 379 +4747 /data/VOCdevkit/VOC2007/JPEGImages/009552.jpg 375 500 7 65 35 295 495 +4748 /data/VOCdevkit/VOC2007/JPEGImages/009553.jpg 500 333 0 135 167 201 198 0 239 124 309 155 0 246 153 312 184 0 255 181 319 210 0 354 83 424 116 0 359 113 424 143 0 358 141 423 173 0 362 171 425 198 0 366 195 429 221 +4749 /data/VOCdevkit/VOC2007/JPEGImages/009554.jpg 500 370 14 1 124 295 370 19 138 136 180 218 +4750 /data/VOCdevkit/VOC2007/JPEGImages/009555.jpg 500 238 5 384 95 489 128 +4751 /data/VOCdevkit/VOC2007/JPEGImages/009556.jpg 500 375 14 192 3 500 375 14 93 73 266 375 11 3 146 178 374 +4752 /data/VOCdevkit/VOC2007/JPEGImages/009559.jpg 500 375 1 346 159 467 249 1 185 155 344 248 14 248 91 295 241 14 308 86 379 248 +4753 /data/VOCdevkit/VOC2007/JPEGImages/009561.jpg 500 375 19 84 82 198 186 19 2 2 61 73 14 121 78 368 360 +4754 /data/VOCdevkit/VOC2007/JPEGImages/009563.jpg 332 500 13 5 192 283 500 14 170 135 284 418 14 229 137 284 350 13 285 220 328 305 +4755 /data/VOCdevkit/VOC2007/JPEGImages/009564.jpg 500 336 1 108 222 217 319 14 122 144 192 275 6 271 164 406 262 6 205 173 285 214 6 70 171 204 218 +4756 /data/VOCdevkit/VOC2007/JPEGImages/009569.jpg 500 375 16 133 170 234 301 12 89 203 401 340 +4757 /data/VOCdevkit/VOC2007/JPEGImages/009570.jpg 500 333 4 69 94 117 213 4 42 88 89 207 4 6 85 54 204 +4758 /data/VOCdevkit/VOC2007/JPEGImages/009572.jpg 500 375 11 203 79 335 259 +4759 /data/VOCdevkit/VOC2007/JPEGImages/009574.jpg 500 375 14 1 78 160 375 14 136 81 277 369 14 267 68 399 375 14 358 63 500 375 +4760 /data/VOCdevkit/VOC2007/JPEGImages/009575.jpg 500 333 7 95 1 500 287 +4761 /data/VOCdevkit/VOC2007/JPEGImages/009578.jpg 500 335 14 85 44 500 335 +4762 /data/VOCdevkit/VOC2007/JPEGImages/009581.jpg 500 334 15 9 22 171 266 15 178 121 325 264 15 335 124 500 275 +4763 /data/VOCdevkit/VOC2007/JPEGImages/009582.jpg 500 375 10 3 84 500 375 +4764 /data/VOCdevkit/VOC2007/JPEGImages/009583.jpg 500 333 11 281 18 398 96 14 1 1 324 331 14 259 1 500 245 +4765 /data/VOCdevkit/VOC2007/JPEGImages/009589.jpg 500 375 7 12 116 378 322 +4766 /data/VOCdevkit/VOC2007/JPEGImages/009590.jpg 500 375 6 18 85 492 299 14 43 135 75 192 14 86 133 118 169 6 8 149 93 217 +4767 /data/VOCdevkit/VOC2007/JPEGImages/009592.jpg 360 270 11 100 100 240 270 +4768 /data/VOCdevkit/VOC2007/JPEGImages/009593.jpg 500 375 6 172 174 394 269 14 393 153 429 267 +4769 /data/VOCdevkit/VOC2007/JPEGImages/009594.jpg 500 375 19 224 288 334 375 +4770 /data/VOCdevkit/VOC2007/JPEGImages/009595.jpg 500 333 8 43 17 437 263 +4771 /data/VOCdevkit/VOC2007/JPEGImages/009599.jpg 400 300 6 100 45 400 181 14 2 1 133 300 +4772 /data/VOCdevkit/VOC2007/JPEGImages/009601.jpg 500 339 6 118 180 227 255 14 438 159 475 271 14 467 156 500 273 14 388 148 429 262 14 312 147 363 248 14 378 149 394 255 14 361 152 382 254 14 241 161 264 236 14 277 162 301 238 14 262 166 279 234 14 305 166 328 241 14 212 166 249 234 14 1 117 131 339 14 332 69 366 129 14 383 58 415 116 14 361 66 379 124 +4773 /data/VOCdevkit/VOC2007/JPEGImages/009602.jpg 500 375 15 334 104 469 250 15 169 31 333 184 15 2 2 186 199 15 118 117 231 245 15 229 154 344 269 15 273 244 401 372 15 143 209 273 359 15 27 192 152 329 +4774 /data/VOCdevkit/VOC2007/JPEGImages/009604.jpg 375 500 11 50 10 375 500 +4775 /data/VOCdevkit/VOC2007/JPEGImages/009606.jpg 375 500 10 39 320 375 500 8 77 329 227 500 8 29 278 96 462 8 259 367 375 500 15 79 224 140 277 +4776 /data/VOCdevkit/VOC2007/JPEGImages/009607.jpg 500 375 2 128 129 363 284 2 175 209 460 348 +4777 /data/VOCdevkit/VOC2007/JPEGImages/009608.jpg 500 333 2 160 73 277 221 +4778 /data/VOCdevkit/VOC2007/JPEGImages/009610.jpg 375 500 14 12 30 279 497 +4779 /data/VOCdevkit/VOC2007/JPEGImages/009612.jpg 375 500 14 15 108 346 500 +4780 /data/VOCdevkit/VOC2007/JPEGImages/009616.jpg 500 333 2 47 93 406 291 +4781 /data/VOCdevkit/VOC2007/JPEGImages/009622.jpg 500 333 14 86 57 282 333 14 252 110 472 333 +4782 /data/VOCdevkit/VOC2007/JPEGImages/009624.jpg 500 333 11 205 59 274 209 +4783 /data/VOCdevkit/VOC2007/JPEGImages/009625.jpg 335 500 18 44 96 278 433 +4784 /data/VOCdevkit/VOC2007/JPEGImages/009626.jpg 500 375 17 2 129 486 353 14 35 147 441 275 4 348 316 374 374 +4785 /data/VOCdevkit/VOC2007/JPEGImages/009628.jpg 500 375 14 1 123 124 375 14 78 116 341 375 +4786 /data/VOCdevkit/VOC2007/JPEGImages/009630.jpg 500 375 7 338 159 404 308 15 295 95 331 142 15 331 103 362 142 15 370 92 419 147 4 47 145 73 213 4 20 156 47 216 +4787 /data/VOCdevkit/VOC2007/JPEGImages/009631.jpg 500 333 19 444 144 475 172 8 400 165 475 252 8 36 176 104 260 +4788 /data/VOCdevkit/VOC2007/JPEGImages/009632.jpg 500 333 8 312 268 396 333 +4789 /data/VOCdevkit/VOC2007/JPEGImages/009633.jpg 500 375 14 15 170 99 247 4 106 202 119 250 14 100 166 171 257 14 421 91 500 177 14 299 90 400 184 14 156 37 392 275 +4790 /data/VOCdevkit/VOC2007/JPEGImages/009635.jpg 335 500 17 12 386 253 497 +4791 /data/VOCdevkit/VOC2007/JPEGImages/009639.jpg 500 333 13 10 19 314 320 +4792 /data/VOCdevkit/VOC2007/JPEGImages/009640.jpg 500 375 7 150 114 370 232 +4793 /data/VOCdevkit/VOC2007/JPEGImages/009642.jpg 500 375 2 164 183 209 234 +4794 /data/VOCdevkit/VOC2007/JPEGImages/009643.jpg 375 500 5 208 195 305 249 6 344 213 366 238 +4795 /data/VOCdevkit/VOC2007/JPEGImages/009645.jpg 500 375 4 128 22 208 276 4 224 4 288 275 4 309 9 371 155 +4796 /data/VOCdevkit/VOC2007/JPEGImages/009646.jpg 500 375 7 58 82 380 375 8 1 9 500 375 +4797 /data/VOCdevkit/VOC2007/JPEGImages/009648.jpg 375 500 14 272 1 374 234 +4798 /data/VOCdevkit/VOC2007/JPEGImages/009651.jpg 500 375 14 97 21 405 375 +4799 /data/VOCdevkit/VOC2007/JPEGImages/009652.jpg 500 344 6 5 6 317 263 +4800 /data/VOCdevkit/VOC2007/JPEGImages/009653.jpg 500 375 14 2 37 168 375 14 164 85 337 375 14 119 23 500 375 +4801 /data/VOCdevkit/VOC2007/JPEGImages/009657.jpg 500 351 14 139 62 305 336 13 45 120 322 351 +4802 /data/VOCdevkit/VOC2007/JPEGImages/009660.jpg 375 500 11 196 222 337 370 14 12 156 332 412 8 43 186 374 500 +4803 /data/VOCdevkit/VOC2007/JPEGImages/009661.jpg 480 357 12 55 58 400 291 14 214 36 306 169 14 46 92 74 206 +4804 /data/VOCdevkit/VOC2007/JPEGImages/009662.jpg 500 375 10 75 263 500 375 +4805 /data/VOCdevkit/VOC2007/JPEGImages/009663.jpg 500 375 8 213 236 500 375 8 1 164 113 293 17 238 142 473 266 +4806 /data/VOCdevkit/VOC2007/JPEGImages/009665.jpg 500 332 14 118 145 155 259 12 79 170 119 255 12 340 116 453 175 12 236 148 320 184 12 193 152 245 185 +4807 /data/VOCdevkit/VOC2007/JPEGImages/009669.jpg 500 333 7 3 2 500 333 +4808 /data/VOCdevkit/VOC2007/JPEGImages/009672.jpg 500 375 7 416 76 500 206 7 150 114 443 375 +4809 /data/VOCdevkit/VOC2007/JPEGImages/009673.jpg 500 375 14 70 11 189 146 13 6 53 217 202 +4810 /data/VOCdevkit/VOC2007/JPEGImages/009674.jpg 332 500 13 74 125 324 450 14 2 138 74 375 14 98 121 156 291 14 226 128 313 401 +4811 /data/VOCdevkit/VOC2007/JPEGImages/009675.jpg 500 305 6 80 20 500 274 +4812 /data/VOCdevkit/VOC2007/JPEGImages/009677.jpg 500 333 1 86 23 422 312 8 1 2 125 156 +4813 /data/VOCdevkit/VOC2007/JPEGImages/009680.jpg 500 375 6 1 107 88 268 6 41 89 414 343 14 316 82 392 274 +4814 /data/VOCdevkit/VOC2007/JPEGImages/009682.jpg 500 335 18 1 93 407 264 18 337 108 500 199 +4815 /data/VOCdevkit/VOC2007/JPEGImages/009683.jpg 500 375 5 86 110 432 269 +4816 /data/VOCdevkit/VOC2007/JPEGImages/009688.jpg 500 375 6 100 4 329 145 6 38 105 394 375 +4817 /data/VOCdevkit/VOC2007/JPEGImages/009689.jpg 500 375 19 235 53 327 141 8 257 164 443 373 +4818 /data/VOCdevkit/VOC2007/JPEGImages/009690.jpg 500 333 8 345 195 407 294 8 242 192 270 280 8 250 227 320 333 10 266 210 390 316 +4819 /data/VOCdevkit/VOC2007/JPEGImages/009694.jpg 500 375 6 333 306 420 351 6 266 306 348 350 6 175 305 272 348 +4820 /data/VOCdevkit/VOC2007/JPEGImages/009696.jpg 500 335 2 14 203 68 253 14 231 1 500 334 +4821 /data/VOCdevkit/VOC2007/JPEGImages/009697.jpg 500 375 14 14 4 485 375 +4822 /data/VOCdevkit/VOC2007/JPEGImages/009701.jpg 500 333 6 85 135 312 221 +4823 /data/VOCdevkit/VOC2007/JPEGImages/009704.jpg 500 334 5 43 130 269 244 14 118 196 149 288 14 80 189 104 265 14 164 191 189 288 14 230 194 257 265 14 385 198 404 272 14 397 204 433 285 14 366 180 385 242 14 414 169 437 230 14 444 184 465 250 14 479 188 500 257 6 309 186 354 215 +4824 /data/VOCdevkit/VOC2007/JPEGImages/009705.jpg 500 375 13 439 8 500 138 6 239 1 397 46 13 342 5 468 96 13 202 30 416 132 13 55 60 467 259 +4825 /data/VOCdevkit/VOC2007/JPEGImages/009708.jpg 500 375 8 5 129 213 330 8 235 172 473 375 14 30 97 190 243 14 178 107 437 375 +4826 /data/VOCdevkit/VOC2007/JPEGImages/009714.jpg 287 500 14 1 401 22 450 +4827 /data/VOCdevkit/VOC2007/JPEGImages/009715.jpg 500 375 14 33 96 291 375 14 189 128 442 375 14 290 122 500 358 +4828 /data/VOCdevkit/VOC2007/JPEGImages/009716.jpg 500 374 2 79 117 302 322 +4829 /data/VOCdevkit/VOC2007/JPEGImages/009720.jpg 500 375 7 160 2 500 375 +4830 /data/VOCdevkit/VOC2007/JPEGImages/009722.jpg 332 500 12 100 180 200 362 14 70 240 205 360 +4831 /data/VOCdevkit/VOC2007/JPEGImages/009723.jpg 500 375 6 1 69 499 365 6 1 15 105 120 6 89 22 181 47 6 374 26 497 91 +4832 /data/VOCdevkit/VOC2007/JPEGImages/009725.jpg 500 375 1 4 230 129 353 +4833 /data/VOCdevkit/VOC2007/JPEGImages/009727.jpg 500 375 3 187 316 208 353 +4834 /data/VOCdevkit/VOC2007/JPEGImages/009728.jpg 500 332 3 215 41 249 183 14 348 246 387 285 +4835 /data/VOCdevkit/VOC2007/JPEGImages/009730.jpg 500 375 1 244 78 426 301 14 196 64 322 229 +4836 /data/VOCdevkit/VOC2007/JPEGImages/009731.jpg 500 333 2 86 71 341 248 +4837 /data/VOCdevkit/VOC2007/JPEGImages/009736.jpg 333 500 14 6 5 333 500 +4838 /data/VOCdevkit/VOC2007/JPEGImages/009739.jpg 375 500 14 61 66 355 500 14 48 157 246 300 +4839 /data/VOCdevkit/VOC2007/JPEGImages/009740.jpg 500 375 6 175 155 298 236 +4840 /data/VOCdevkit/VOC2007/JPEGImages/009741.jpg 500 374 8 1 216 42 328 8 109 233 199 363 14 185 77 428 372 14 133 180 205 308 14 189 196 220 242 15 103 217 134 273 +4841 /data/VOCdevkit/VOC2007/JPEGImages/009742.jpg 500 433 10 2 87 500 433 +4842 /data/VOCdevkit/VOC2007/JPEGImages/009744.jpg 500 333 11 350 88 456 223 11 38 56 157 238 +4843 /data/VOCdevkit/VOC2007/JPEGImages/009750.jpg 500 375 15 336 140 401 375 15 206 216 263 373 15 128 157 180 358 15 16 168 52 333 14 37 219 104 375 +4844 /data/VOCdevkit/VOC2007/JPEGImages/009751.jpg 500 373 18 75 33 403 329 +4845 /data/VOCdevkit/VOC2007/JPEGImages/009752.jpg 500 375 1 118 156 382 375 +4846 /data/VOCdevkit/VOC2007/JPEGImages/009753.jpg 449 362 7 107 171 262 256 +4847 /data/VOCdevkit/VOC2007/JPEGImages/009757.jpg 500 375 6 10 75 490 253 +4848 /data/VOCdevkit/VOC2007/JPEGImages/009759.jpg 500 329 2 3 3 433 328 +4849 /data/VOCdevkit/VOC2007/JPEGImages/009760.jpg 500 375 9 50 82 500 367 +4850 /data/VOCdevkit/VOC2007/JPEGImages/009765.jpg 500 375 7 111 56 338 343 +4851 /data/VOCdevkit/VOC2007/JPEGImages/009766.jpg 500 439 14 245 79 500 280 14 92 71 496 435 +4852 /data/VOCdevkit/VOC2007/JPEGImages/009768.jpg 500 322 9 52 168 94 235 9 119 162 201 239 12 345 131 426 256 14 351 96 406 209 +4853 /data/VOCdevkit/VOC2007/JPEGImages/009769.jpg 500 500 17 36 162 468 340 +4854 /data/VOCdevkit/VOC2007/JPEGImages/009770.jpg 500 399 6 72 274 401 373 +4855 /data/VOCdevkit/VOC2007/JPEGImages/009771.jpg 500 375 9 164 217 444 375 9 90 174 433 375 +4856 /data/VOCdevkit/VOC2007/JPEGImages/009775.jpg 204 430 2 39 63 173 430 +4857 /data/VOCdevkit/VOC2007/JPEGImages/009777.jpg 500 375 6 337 184 436 234 6 455 191 500 235 6 194 175 295 234 6 1 192 74 262 +4858 /data/VOCdevkit/VOC2007/JPEGImages/009779.jpg 500 375 6 97 186 323 329 6 349 177 494 311 14 264 133 302 238 14 306 135 358 282 14 354 144 401 296 +4859 /data/VOCdevkit/VOC2007/JPEGImages/009782.jpg 500 375 4 239 183 250 223 4 330 251 355 328 4 418 234 441 303 14 361 96 396 164 14 97 95 167 177 14 114 138 181 218 14 213 138 299 230 14 318 148 406 248 14 456 162 500 281 14 16 158 237 374 10 94 215 500 375 +4860 /data/VOCdevkit/VOC2007/JPEGImages/009783.jpg 500 332 14 191 119 305 296 +4861 /data/VOCdevkit/VOC2007/JPEGImages/009784.jpg 500 385 18 1 98 475 363 +4862 /data/VOCdevkit/VOC2007/JPEGImages/009786.jpg 500 375 7 89 78 281 210 11 266 1 449 280 +4863 /data/VOCdevkit/VOC2007/JPEGImages/009787.jpg 500 333 11 324 4 459 260 15 1 20 147 332 15 203 123 256 191 15 280 48 327 114 15 185 33 274 118 +4864 /data/VOCdevkit/VOC2007/JPEGImages/009788.jpg 500 375 1 58 62 487 337 +4865 /data/VOCdevkit/VOC2007/JPEGImages/009791.jpg 500 375 18 1 209 434 375 +4866 /data/VOCdevkit/VOC2007/JPEGImages/009793.jpg 500 375 3 58 80 442 352 +4867 /data/VOCdevkit/VOC2007/JPEGImages/009795.jpg 500 375 19 93 159 194 229 +4868 /data/VOCdevkit/VOC2007/JPEGImages/009798.jpg 500 375 14 295 127 456 344 14 289 128 387 250 14 118 134 191 243 14 68 139 165 273 14 12 154 121 347 10 54 153 344 372 8 281 239 435 375 4 167 202 192 278 +4869 /data/VOCdevkit/VOC2007/JPEGImages/009799.jpg 500 334 11 18 28 489 238 11 253 180 500 333 +4870 /data/VOCdevkit/VOC2007/JPEGImages/009802.jpg 500 375 11 47 218 190 375 11 76 113 264 255 14 102 25 427 368 8 1 1 461 375 +4871 /data/VOCdevkit/VOC2007/JPEGImages/009803.jpg 500 332 12 127 125 305 243 14 185 82 244 211 +4872 /data/VOCdevkit/VOC2007/JPEGImages/009804.jpg 500 333 14 458 129 471 151 14 458 131 491 227 14 486 128 500 175 14 362 130 381 163 14 390 133 404 163 6 12 135 388 333 14 157 136 171 150 14 198 133 212 156 14 135 135 142 146 +4873 /data/VOCdevkit/VOC2007/JPEGImages/009806.jpg 500 333 5 183 40 402 309 6 102 185 130 231 6 30 203 103 236 14 5 185 36 268 +4874 /data/VOCdevkit/VOC2007/JPEGImages/009811.jpg 500 375 3 2 50 368 195 3 344 96 500 195 3 438 171 468 199 +4875 /data/VOCdevkit/VOC2007/JPEGImages/009812.jpg 334 500 14 8 203 186 496 10 98 340 333 499 +4876 /data/VOCdevkit/VOC2007/JPEGImages/009814.jpg 500 375 7 146 65 347 301 +4877 /data/VOCdevkit/VOC2007/JPEGImages/009815.jpg 475 356 10 18 210 429 356 8 351 257 475 356 8 31 217 158 356 8 137 239 248 356 +4878 /data/VOCdevkit/VOC2007/JPEGImages/009817.jpg 500 375 2 149 127 448 373 +4879 /data/VOCdevkit/VOC2007/JPEGImages/009818.jpg 500 375 16 314 223 351 254 16 242 181 273 205 16 66 204 91 229 16 15 202 42 222 +4880 /data/VOCdevkit/VOC2007/JPEGImages/009820.jpg 500 375 7 1 1 500 347 +4881 /data/VOCdevkit/VOC2007/JPEGImages/009821.jpg 456 342 6 15 117 447 262 +4882 /data/VOCdevkit/VOC2007/JPEGImages/009824.jpg 500 333 0 116 134 389 219 +4883 /data/VOCdevkit/VOC2007/JPEGImages/009826.jpg 500 375 11 190 124 327 375 +4884 /data/VOCdevkit/VOC2007/JPEGImages/009827.jpg 500 335 18 43 94 198 220 18 279 150 330 178 6 471 163 500 213 +4885 /data/VOCdevkit/VOC2007/JPEGImages/009829.jpg 500 375 6 249 283 310 325 6 447 270 500 330 6 217 285 249 337 6 1 240 218 375 6 316 264 390 321 +4886 /data/VOCdevkit/VOC2007/JPEGImages/009835.jpg 500 375 0 121 130 397 229 +4887 /data/VOCdevkit/VOC2007/JPEGImages/009837.jpg 500 375 19 383 3 500 76 +4888 /data/VOCdevkit/VOC2007/JPEGImages/009838.jpg 500 333 0 5 97 486 245 +4889 /data/VOCdevkit/VOC2007/JPEGImages/009840.jpg 500 375 19 100 67 423 324 14 181 114 245 235 14 115 131 186 236 4 1 206 26 358 +4890 /data/VOCdevkit/VOC2007/JPEGImages/009843.jpg 374 500 14 2 24 369 500 +4891 /data/VOCdevkit/VOC2007/JPEGImages/009844.jpg 500 375 18 2 21 500 317 14 105 260 171 375 14 272 101 295 167 14 199 54 230 99 +4892 /data/VOCdevkit/VOC2007/JPEGImages/009846.jpg 500 375 17 95 127 487 359 8 36 116 80 193 +4893 /data/VOCdevkit/VOC2007/JPEGImages/009847.jpg 500 333 6 200 117 302 194 14 7 241 45 333 14 52 239 104 332 +4894 /data/VOCdevkit/VOC2007/JPEGImages/009849.jpg 500 375 6 82 179 253 247 +4895 /data/VOCdevkit/VOC2007/JPEGImages/009850.jpg 332 500 13 258 236 308 324 13 58 157 258 418 14 180 154 275 387 14 259 215 308 315 +4896 /data/VOCdevkit/VOC2007/JPEGImages/009853.jpg 500 373 8 2 106 128 295 14 135 2 429 343 +4897 /data/VOCdevkit/VOC2007/JPEGImages/009854.jpg 500 315 8 403 138 480 236 8 347 141 401 231 8 282 137 341 219 8 189 162 271 294 8 65 192 165 314 8 2 189 87 302 10 68 158 219 275 14 128 109 146 140 14 144 107 167 135 14 166 105 191 132 14 204 106 224 130 14 235 109 266 167 14 181 123 259 235 14 111 121 148 165 14 57 130 104 179 14 3 129 69 242 14 277 102 310 137 14 326 98 356 131 14 359 98 400 131 14 402 99 431 131 14 422 100 477 142 14 397 103 464 221 14 298 105 346 214 15 443 31 500 135 +4898 /data/VOCdevkit/VOC2007/JPEGImages/009856.jpg 500 333 6 113 245 192 302 6 380 243 499 328 6 1 252 81 327 +4899 /data/VOCdevkit/VOC2007/JPEGImages/009857.jpg 335 500 13 3 37 335 493 14 5 62 335 454 +4900 /data/VOCdevkit/VOC2007/JPEGImages/009861.jpg 500 375 16 355 169 500 340 16 310 110 390 227 16 71 167 220 368 16 129 122 282 245 16 197 102 272 143 +4901 /data/VOCdevkit/VOC2007/JPEGImages/009864.jpg 500 375 18 1 143 363 245 +4902 /data/VOCdevkit/VOC2007/JPEGImages/009866.jpg 500 375 1 51 109 424 345 +4903 /data/VOCdevkit/VOC2007/JPEGImages/009871.jpg 500 375 14 177 37 497 375 14 51 82 200 375 4 396 15 412 75 4 373 22 402 82 +4904 /data/VOCdevkit/VOC2007/JPEGImages/009873.jpg 500 333 6 169 128 461 258 +4905 /data/VOCdevkit/VOC2007/JPEGImages/009875.jpg 375 500 7 216 179 375 376 7 4 275 131 436 +4906 /data/VOCdevkit/VOC2007/JPEGImages/009876.jpg 500 333 0 90 61 417 209 +4907 /data/VOCdevkit/VOC2007/JPEGImages/009883.jpg 500 375 6 33 103 488 266 +4908 /data/VOCdevkit/VOC2007/JPEGImages/009885.jpg 500 375 3 1 2 500 375 14 185 157 335 375 14 175 198 209 229 14 44 192 90 229 +4909 /data/VOCdevkit/VOC2007/JPEGImages/009888.jpg 500 375 19 202 113 316 271 +4910 /data/VOCdevkit/VOC2007/JPEGImages/009889.jpg 500 375 11 142 156 366 265 +4911 /data/VOCdevkit/VOC2007/JPEGImages/009890.jpg 500 349 13 43 87 355 280 14 84 41 213 304 +4912 /data/VOCdevkit/VOC2007/JPEGImages/009891.jpg 500 333 4 22 1 125 188 +4913 /data/VOCdevkit/VOC2007/JPEGImages/009892.jpg 500 333 14 49 1 474 333 +4914 /data/VOCdevkit/VOC2007/JPEGImages/009893.jpg 500 326 2 127 134 164 201 2 212 126 248 198 +4915 /data/VOCdevkit/VOC2007/JPEGImages/009895.jpg 500 333 6 51 125 330 303 6 302 111 433 201 6 177 103 288 174 6 1 100 76 185 14 19 35 52 108 +4916 /data/VOCdevkit/VOC2007/JPEGImages/009899.jpg 500 375 11 140 2 466 375 +4917 /data/VOCdevkit/VOC2007/JPEGImages/009901.jpg 500 375 14 104 76 199 337 14 265 46 424 368 8 20 174 77 234 10 189 185 256 266 +4918 /data/VOCdevkit/VOC2007/JPEGImages/009903.jpg 500 333 12 86 82 412 319 14 222 49 293 219 14 340 87 401 312 6 1 80 38 101 6 36 79 82 100 +4919 /data/VOCdevkit/VOC2007/JPEGImages/009906.jpg 500 375 19 26 86 122 167 19 128 85 220 164 19 220 89 309 159 19 334 61 454 159 +4920 /data/VOCdevkit/VOC2007/JPEGImages/009907.jpg 375 500 11 2 122 313 458 +4921 /data/VOCdevkit/VOC2007/JPEGImages/009909.jpg 500 375 9 37 42 355 339 9 307 170 375 239 +4922 /data/VOCdevkit/VOC2007/JPEGImages/009910.jpg 321 500 14 183 75 321 483 14 76 220 193 391 +4923 /data/VOCdevkit/VOC2007/JPEGImages/009912.jpg 500 375 9 98 64 401 352 +4924 /data/VOCdevkit/VOC2007/JPEGImages/009914.jpg 500 375 8 305 253 365 340 +4925 /data/VOCdevkit/VOC2007/JPEGImages/009915.jpg 500 400 14 5 89 174 390 14 311 114 446 397 14 42 109 307 400 14 192 191 288 279 +4926 /data/VOCdevkit/VOC2007/JPEGImages/009916.jpg 500 375 8 217 84 271 166 17 17 96 256 250 8 278 110 439 269 +4927 /data/VOCdevkit/VOC2007/JPEGImages/009919.jpg 500 375 0 27 135 473 245 +4928 /data/VOCdevkit/VOC2007/JPEGImages/009921.jpg 500 309 18 146 152 500 194 +4929 /data/VOCdevkit/VOC2007/JPEGImages/009922.jpg 500 342 11 180 79 443 310 +4930 /data/VOCdevkit/VOC2007/JPEGImages/009924.jpg 375 500 13 6 36 373 500 +4931 /data/VOCdevkit/VOC2007/JPEGImages/009925.jpg 500 354 15 137 4 491 341 +4932 /data/VOCdevkit/VOC2007/JPEGImages/009927.jpg 500 334 6 70 156 444 265 +4933 /data/VOCdevkit/VOC2007/JPEGImages/009928.jpg 375 500 15 136 90 218 252 15 102 68 344 490 8 8 203 84 323 8 1 263 67 380 8 71 227 160 358 +4934 /data/VOCdevkit/VOC2007/JPEGImages/009929.jpg 357 500 4 1 125 356 395 +4935 /data/VOCdevkit/VOC2007/JPEGImages/009930.jpg 500 375 14 92 8 385 375 +4936 /data/VOCdevkit/VOC2007/JPEGImages/009931.jpg 500 332 14 135 159 170 250 12 90 160 143 250 12 180 158 229 189 12 226 131 298 172 12 332 103 493 161 +4937 /data/VOCdevkit/VOC2007/JPEGImages/009933.jpg 500 400 12 49 8 500 400 +4938 /data/VOCdevkit/VOC2007/JPEGImages/009934.jpg 480 321 2 215 101 283 244 +4939 /data/VOCdevkit/VOC2007/JPEGImages/009936.jpg 500 333 5 224 64 422 266 +4940 /data/VOCdevkit/VOC2007/JPEGImages/009937.jpg 500 332 12 43 117 500 276 14 350 89 463 231 +4941 /data/VOCdevkit/VOC2007/JPEGImages/009941.jpg 320 240 14 232 67 320 239 14 171 62 239 240 14 101 41 178 240 14 51 61 116 240 14 2 41 73 240 14 267 46 320 166 14 209 52 222 95 14 221 50 231 96 14 229 52 242 98 +4942 /data/VOCdevkit/VOC2007/JPEGImages/009943.jpg 500 333 6 204 111 331 208 +4943 /data/VOCdevkit/VOC2007/JPEGImages/009948.jpg 343 500 14 1 2 315 500 1 2 281 303 500 +4944 /data/VOCdevkit/VOC2007/JPEGImages/009951.jpg 500 333 18 236 128 500 333 14 379 192 418 227 14 429 189 467 227 +4945 /data/VOCdevkit/VOC2007/JPEGImages/009952.jpg 375 500 11 79 56 325 454 +4946 /data/VOCdevkit/VOC2007/JPEGImages/009953.jpg 500 375 1 27 84 491 349 +4947 /data/VOCdevkit/VOC2007/JPEGImages/009956.jpg 500 375 7 118 21 401 300 +4948 /data/VOCdevkit/VOC2007/JPEGImages/009957.jpg 353 480 14 106 89 236 308 12 54 128 295 436 +4949 /data/VOCdevkit/VOC2007/JPEGImages/009960.jpg 500 331 13 26 140 318 318 14 92 46 312 267 +4950 /data/VOCdevkit/VOC2007/JPEGImages/009962.jpg 500 375 8 211 192 324 326 14 162 72 273 248 14 250 68 473 312 14 4 2 253 374 +4951 /data/VOCdevkit/VOC2007/JPEGImages/009963.jpg 374 500 6 2 3 374 500 diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/voc.names b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/voc.names new file mode 100644 index 0000000..1168c39 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/experiments_on_voc/voc.names @@ -0,0 +1,20 @@ +aeroplane +bicycle +bird +boat +bottle +bus +car +cat +chair +cow +diningtable +dog +horse +motorbike +person +pottedplant +sheep +sofa +train +tvmonitor \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/parse_voc_xml.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/parse_voc_xml.py new file mode 100644 index 0000000..fcbac4c --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/parse_voc_xml.py @@ -0,0 +1,96 @@ +# coding: utf-8 + +import xml.etree.ElementTree as ET +import os + +names_dict = {} +cnt = 0 +f = open('./voc_names.txt', 'r').readlines() +for line in f: + line = line.strip() + names_dict[line] = cnt + cnt += 1 + +voc_07 = '/data/VOCdevkit/VOC2007' +voc_12 = '/data/VOCdevkit/VOC2012' + +anno_path = [os.path.join(voc_07, 'Annotations'), os.path.join(voc_12, 'Annotations')] +img_path = [os.path.join(voc_07, 'JPEGImages'), os.path.join(voc_12, 'JPEGImages')] + +trainval_path = [os.path.join(voc_07, 'ImageSets/Main/trainval.txt'), + os.path.join(voc_12, 'ImageSets/Main/trainval.txt')] +test_path = [os.path.join(voc_07, 'ImageSets/Main/test.txt')] + + +def parse_xml(path): + tree = ET.parse(path) + img_name = path.split('/')[-1][:-4] + + height = tree.findtext("./size/height") + width = tree.findtext("./size/width") + + objects = [img_name, width, height] + + for obj in tree.findall('object'): + difficult = obj.find('difficult').text + if difficult == '1': + continue + name = obj.find('name').text + bbox = obj.find('bndbox') + xmin = bbox.find('xmin').text + ymin = bbox.find('ymin').text + xmax = bbox.find('xmax').text + ymax = bbox.find('ymax').text + + name = str(names_dict[name]) + objects.extend([name, xmin, ymin, xmax, ymax]) + if len(objects) > 1: + return objects + else: + return None + +test_cnt = 0 +def gen_test_txt(txt_path): + global test_cnt + f = open(txt_path, 'w') + + for i, path in enumerate(test_path): + img_names = open(path, 'r').readlines() + for img_name in img_names: + img_name = img_name.strip() + xml_path = anno_path[i] + '/' + img_name + '.xml' + objects = parse_xml(xml_path) + if objects: + objects[0] = img_path[i] + '/' + img_name + '.jpg' + if os.path.exists(objects[0]): + objects.insert(0, str(test_cnt)) + test_cnt += 1 + objects = ' '.join(objects) + '\n' + f.write(objects) + f.close() + + +train_cnt = 0 +def gen_train_txt(txt_path): + global train_cnt + f = open(txt_path, 'w') + + for i, path in enumerate(trainval_path): + img_names = open(path, 'r').readlines() + for img_name in img_names: + img_name = img_name.strip() + xml_path = anno_path[i] + '/' + img_name + '.xml' + objects = parse_xml(xml_path) + if objects: + objects[0] = img_path[i] + '/' + img_name + '.jpg' + if os.path.exists(objects[0]): + objects.insert(0, str(train_cnt)) + train_cnt += 1 + objects = ' '.join(objects) + '\n' + f.write(objects) + f.close() + + +gen_train_txt('train.txt') +gen_test_txt('val.txt') + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/remove_optimizers_params_in_ckpt.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/remove_optimizers_params_in_ckpt.py new file mode 100644 index 0000000..d602e35 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/misc/remove_optimizers_params_in_ckpt.py @@ -0,0 +1,32 @@ +# coding: utf-8 + +# This script is used to remove the optimizer parameters in the saved checkpoint files. +# These parameters are useless in the forward process. +# Removing them will shrink the checkpoint size a lot. + +import sys +sys.path.append('..') + +import os +import tensorflow as tf +from model import yolov3 + +# params +ckpt_path = '' +class_num = 20 +save_dir = 'shrinked_ckpt' +if not os.path.exists(save_dir): + os.makedirs(save_dir) + +image = tf.placeholder(tf.float32, [1, 416, 416, 3]) +yolo_model = yolov3(class_num, None) +with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(image) + +saver_to_restore = tf.train.Saver() +saver_to_save = tf.train.Saver() + +with tf.Session() as sess: + sess.run(tf.global_variables_initializer()) + saver_to_restore.restore(sess, ckpt_path) + saver_to_save.save(sess, save_dir + '/shrinked') \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/model.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/model.py new file mode 100644 index 0000000..67d6e6a --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/model.py @@ -0,0 +1,457 @@ +# coding=utf-8 +# for better understanding about yolov3 architecture, refer to this website (in Chinese): +# https://blog.csdn.net/leviopku/article/details/82660381 + +from __future__ import division, print_function + +import tensorflow as tf + +slim = tf.contrib.slim + +from utils.layer_utils import conv2d, darknet53_body, yolo_block, upsample_layer + + +class yolov3(object): + + def __init__(self, class_num, anchors, use_label_smooth=False, use_focal_loss=False, batch_norm_decay=0.999, + weight_decay=5e-4, use_static_shape=True, + img_size=(416, 416), batch_size=None): + + # self.anchors = [[10, 13], [16, 30], [33, 23], + # [30, 61], [62, 45], [59, 119], + # [116, 90], [156, 198], [373, 326]] + self.class_num = class_num + self.anchors = anchors + self.batch_norm_decay = batch_norm_decay + self.use_label_smooth = use_label_smooth + self.use_focal_loss = use_focal_loss + self.weight_decay = weight_decay + # inference speed optimization + # if `use_static_shape` is True, use tensor.get_shape(), otherwise use tf.shape(tensor) + # static_shape is slightly faster + self.use_static_shape = use_static_shape + self.batch_size = batch_size + # self.img_size = (416, 416) + self.img_size = img_size + self.featrue_map_shape_base = [32, 16, 8] + self.featrue_map_shape = [(self.img_size[0] // i, self.img_size[1] // i) for i in self.featrue_map_shape_base] + + def forward(self, inputs, is_training=False, reuse=False): + # the input img_size, form: [height, weight] + # it will be used later + # self.img_size = tf.shape(inputs)[1:3] + # self.featrue_map_shape = [(self.img_size[0]//i, self.img_size[1]//i) for i in self.featrue_map_shape_base] + # set batch norm params + batch_norm_params = { + 'decay': self.batch_norm_decay, + 'epsilon': 1e-05, + 'scale': True, + 'is_training': is_training, + 'fused': None, # Use fused batch norm if possible. + } + + with slim.arg_scope([slim.conv2d, slim.batch_norm], reuse=reuse): + with slim.arg_scope([slim.conv2d], + normalizer_fn=slim.batch_norm, + normalizer_params=batch_norm_params, + biases_initializer=None, + activation_fn=lambda x: tf.nn.leaky_relu(x, alpha=0.1), + weights_regularizer=slim.l2_regularizer(self.weight_decay)): + with tf.variable_scope('darknet53_body'): + route_1, route_2, route_3 = darknet53_body(inputs) + + with tf.variable_scope('yolov3_head'): + inter1, net = yolo_block(route_3, 512) + feature_map_1 = slim.conv2d(net, 3 * (5 + self.class_num), 1, + stride=1, normalizer_fn=None, + activation_fn=None, biases_initializer=tf.zeros_initializer()) + feature_map_1 = tf.identity(feature_map_1, name='feature_map_1') + + inter1 = conv2d(inter1, 256, 1) + inter1 = upsample_layer(inter1, + route_2.get_shape().as_list() if self.use_static_shape else tf.shape( + route_2)) + concat1 = tf.concat([inter1, route_2], axis=3) + + inter2, net = yolo_block(concat1, 256) + feature_map_2 = slim.conv2d(net, 3 * (5 + self.class_num), 1, + stride=1, normalizer_fn=None, + activation_fn=None, biases_initializer=tf.zeros_initializer()) + feature_map_2 = tf.identity(feature_map_2, name='feature_map_2') + + inter2 = conv2d(inter2, 128, 1) + inter2 = upsample_layer(inter2, + route_1.get_shape().as_list() if self.use_static_shape else tf.shape( + route_1)) + concat2 = tf.concat([inter2, route_1], axis=3) + + _, feature_map_3 = yolo_block(concat2, 128) + feature_map_3 = slim.conv2d(feature_map_3, 3 * (5 + self.class_num), 1, + stride=1, normalizer_fn=None, + activation_fn=None, biases_initializer=tf.zeros_initializer()) + feature_map_3 = tf.identity(feature_map_3, name='feature_map_3') + + return feature_map_1, feature_map_2, feature_map_3 + + def reorg_layer(self, feature_map, anchors): + ''' + feature_map: a feature_map from [feature_map_1, feature_map_2, feature_map_3] returned + from `forward` function + anchors: shape: [3, 2] + ''' + # NOTE: size in [h, w] format! don't get messed up! + grid_size = feature_map.get_shape().as_list()[1:3] if self.use_static_shape else tf.shape(feature_map)[ + 1:3] # [13, 13] + # the downscale ratio in height and weight + # ratio = tf.cast(self.img_size / grid_size, tf.float32) + ratio = tf.cast([self.img_size[0] / grid_size[0], self.img_size[1] / grid_size[1]], tf.float32) + # rescale the anchors to the feature_map + # NOTE: the anchor is in [w, h] format! + rescaled_anchors = [(anchor[0] / ratio[1], anchor[1] / ratio[0]) for anchor in anchors] + + feature_map = tf.reshape(feature_map, [-1, grid_size[0], grid_size[1], 3, 5 + self.class_num]) + + # split the feature_map along the last dimension + # shape info: take 416x416 input image and the 13*13 feature_map for example: + # box_centers: [N, 13, 13, 3, 2] last_dimension: [center_x, center_y] + # box_sizes: [N, 13, 13, 3, 2] last_dimension: [width, height] + # conf_logits: [N, 13, 13, 3, 1] + # prob_logits: [N, 13, 13, 3, class_num] + + # box_centers, box_sizes, conf_logits, prob_logits = tf.split(feature_map, [2, 2, 1, self.class_num], axis=-1) + box_centers = feature_map[..., :2] + box_sizes = feature_map[..., 2:4] + conf_logits = feature_map[..., 4:5] + prob_logits = feature_map[..., 5:] + + # conf_logits = tf.expand_dims(conf_logits, -1) + + box_centers = tf.nn.sigmoid(box_centers) + + # use some broadcast tricks to get the mesh coordinates + grid_x = tf.range(grid_size[1], dtype=tf.int32) + grid_y = tf.range(grid_size[0], dtype=tf.int32) + grid_x, grid_y = tf.meshgrid(grid_x, grid_y) + x_offset = tf.reshape(grid_x, (-1, 1)) + y_offset = tf.reshape(grid_y, (-1, 1)) + x_y_offset = tf.concat([x_offset, y_offset], axis=-1) + # shape: [13, 13, 1, 2] + x_y_offset = tf.cast(tf.reshape(x_y_offset, [grid_size[0], grid_size[1], 1, 2]), tf.float32) + + # get the absolute box coordinates on the feature_map + box_centers = box_centers + x_y_offset + # rescale to the original image scale + box_centers = box_centers * ratio[::-1] + + # avoid getting possible nan value with tf.clip_by_value + box_sizes = tf.exp(box_sizes) * rescaled_anchors + # box_sizes = tf.clip_by_value(tf.exp(box_sizes), 1e-9, 100) * rescaled_anchors + # rescale to the original image scale + box_sizes = box_sizes * ratio[::-1] + + # shape: [N, 13, 13, 3, 4] + # last dimension: (center_x, center_y, w, h) + boxes = tf.concat([box_centers, box_sizes], axis=-1) + + # shape: + # x_y_offset: [13, 13, 1, 2] + # boxes: [N, 13, 13, 3, 4], rescaled to the original image scale + # conf_logits: [N, 13, 13, 3, 1] + # prob_logits: [N, 13, 13, 3, class_num] + return x_y_offset, boxes, conf_logits, prob_logits + + def predict(self, feature_maps): + ''' + Receive the returned feature_maps from `forward` function, + the produce the output predictions at the test stage. + ''' + feature_map_1, feature_map_2, feature_map_3 = feature_maps + + feature_map_anchors = [(feature_map_1, self.anchors[6:9]), + (feature_map_2, self.anchors[3:6]), + (feature_map_3, self.anchors[0:3])] + reorg_results = [self.reorg_layer(feature_map, anchors) for (feature_map, anchors) in feature_map_anchors] + + def _reshape(result): + x_y_offset, boxes, conf_logits, prob_logits = result + grid_size = x_y_offset.get_shape().as_list()[:2] if self.use_static_shape else tf.shape(x_y_offset)[:2] + boxes = tf.reshape(boxes, [-1, grid_size[0] * grid_size[1] * 3, 4]) + conf_logits = tf.reshape(conf_logits, [-1, grid_size[0] * grid_size[1] * 3, 1]) + prob_logits = tf.reshape(prob_logits, [-1, grid_size[0] * grid_size[1] * 3, self.class_num]) + # shape: (take 416*416 input image and feature_map_1 for example) + # boxes: [N, 13*13*3, 4] + # conf_logits: [N, 13*13*3, 1] + # prob_logits: [N, 13*13*3, class_num] + return boxes, conf_logits, prob_logits + + boxes_list, confs_list, probs_list = [], [], [] + for result in reorg_results: + boxes, conf_logits, prob_logits = _reshape(result) + confs = tf.sigmoid(conf_logits) + probs = tf.sigmoid(prob_logits) + boxes_list.append(boxes) + confs_list.append(confs) + probs_list.append(probs) + + # collect results on three scales + # take 416*416 input image for example: + # shape: [N, (13*13+26*26+52*52)*3, 4] + boxes = tf.concat(boxes_list, axis=1) + # shape: [N, (13*13+26*26+52*52)*3, 1] + confs = tf.concat(confs_list, axis=1) + # shape: [N, (13*13+26*26+52*52)*3, class_num] + probs = tf.concat(probs_list, axis=1) + + # center_x, center_y, width, height = tf.split(boxes, [1, 1, 1, 1], axis=-1) + + # center_x = tf.expand_dims(boxes[..., 0], 2) + # center_y = tf.expand_dims(boxes[..., 1], 2) + # width = tf.expand_dims(boxes[..., 2], 2) + # height = tf.expand_dims(boxes[..., 3], 2) + + center_x = boxes[..., 0:1] + center_y = boxes[..., 1:2] + width = boxes[..., 2:3] + height = boxes[..., 3:] + + x_min = center_x - width / 2 + y_min = center_y - height / 2 + x_max = center_x + width / 2 + y_max = center_y + height / 2 + + boxes = tf.concat([x_min, y_min, x_max, y_max], axis=-1) + + return boxes, confs, probs + + def loss_layer(self, feature_map_i, y_true, anchors, feature_map_shape_i, gt_box_i): + ''' + calc loss function from a certain scale + input: + feature_map_i: feature maps of a certain scale. shape: [N, 13, 13, 3*(5 + num_class)] etc. + y_true: y_ture from a certain scale. shape: [N, 13, 13, 3, 5 + num_class + 1] etc. + anchors: shape [9, 2] + ''' + + # size in [h, w] format! don't get messed up! + # grid_size = tf.shape(feature_map_i)[1:3] + grid_size = tf.shape(feature_map_i)[1:3] + # the downscale ratio in height and weight + ratio = tf.cast(self.img_size / grid_size, tf.float32) + # N: batch_size + N = tf.cast(tf.shape(feature_map_i)[0], tf.float32) + + x_y_offset, pred_boxes, pred_conf_logits, pred_prob_logits = self.reorg_layer(feature_map_i, anchors) + + ########### + # get mask + ########### + + # shape: take 416x416 input image and 13*13 feature_map for example: + # [N, 13, 13, 3, 1] + object_mask = y_true[..., 4:5] + + # the calculation of ignore mask if referred from + # https://github.com/pjreddie/darknet/blob/master/src/yolo_layer.c#L179 + # ignore_mask = tf.TensorArray(tf.float32, size=0, dynamic_size=True) + # def loop_cond(idx, ignore_mask): + # return tf.less(idx, tf.cast(N, tf.int32)) + # def loop_body(idx, ignore_mask=None): + # # shape: [13, 13, 3, 4] & [13, 13, 3] ==> [V, 4] + # # V: num of true gt box of each image in a batch + # valid_true_boxes = tf.boolean_mask(y_true[idx, ..., 0:4], tf.cast(object_mask[idx, ..., 0], 'bool')) + # # shape: [13, 13, 3, 4] & [V, 4] ==> [13, 13, 3, V] + # iou = self.box_iou(pred_boxes[idx], valid_true_boxes) + # # shape: [13, 13, 3] + # best_iou = tf.reduce_max(iou, axis=-1) + # # shape: [13, 13, 3] + # ignore_mask_tmp = tf.cast(best_iou < 0.5, tf.float32) + # # finally will be shape: [N, 13, 13, 3] + # # ignore_mask = ignore_mask.write(idx, ignore_mask_tmp) + # if ignore_mask is None: + # ignore_mask = tf.expand_dims(ignore_mask_tmp, 0) + # else: + # ignore_mask = tf.concat([ignore_mask, tf.expand_dims(ignore_mask_tmp, 0)], 0) + # print(idx, ignore_mask) + # return idx + 1, ignore_mask + # ignore_mask = None + # _, ignore_mask = tf.while_loop(cond=loop_cond, body=loop_body, loop_vars=[0, ignore_mask]) + # ignore_mask = ignore_mask.stack() + + iou = self.box_iou(pred_boxes, gt_box_i) # [N, 13, 13, 3, 16] + best_iou = tf.reduce_max(iou, axis=-1) # [N, 13, 13, 3] + ignore_mask = tf.cast(best_iou < 0.5, tf.float32) # [N, 13, 13, 3] + # shape: [N, 13, 13, 3, 1] + ignore_mask = tf.expand_dims(ignore_mask, -1) + ignore_mask = tf.stop_gradient(ignore_mask) + + # shape: [N, 13, 13, 3, 2] + pred_box_xy = pred_boxes[..., 0:2] + pred_box_wh = pred_boxes[..., 2:4] + + # get xy coordinates in one cell from the feature_map + # numerical range: 0 ~ 1 + # shape: [N, 13, 13, 3, 2] + print(y_true[..., 0:2], ratio[::-1], x_y_offset) + true_xy = y_true[..., 0:2] / ratio[::-1] - x_y_offset + pred_xy = pred_box_xy / ratio[::-1] - x_y_offset + + # get_tw_th + # numerical range: 0 ~ 1 + # shape: [N, 13, 13, 3, 2] + true_tw_th = y_true[..., 2:4] / anchors + pred_tw_th = pred_box_wh / anchors + # for numerical stability + true_tw_th = tf.where(condition=tf.equal(true_tw_th, 0), + x=tf.ones_like(true_tw_th), y=true_tw_th) + pred_tw_th = tf.where(condition=tf.equal(pred_tw_th, 0), + x=tf.ones_like(pred_tw_th), y=pred_tw_th) + true_tw_th = tf.log(tf.clip_by_value(true_tw_th, 1e-9, 1e9)) + pred_tw_th = tf.log(tf.clip_by_value(pred_tw_th, 1e-9, 1e9)) + + # box size punishment: + # box with smaller area has bigger weight. This is taken from the yolo darknet C source code. + # shape: [N, 13, 13, 3, 1] + box_loss_scale = 2. - (y_true[..., 2:3] / tf.cast(self.img_size[1], tf.float32)) * ( + y_true[..., 3:4] / tf.cast(self.img_size[0], tf.float32)) + + ############ + # loss_part + ############ + # mix_up weight + # mix_w = y_true[..., self.class_num+5] + # [N, 13, 13, 3, 1] + # mix_w = y_true[..., -1:] + mix_w = y_true[..., 85:] + # mix_w = tf.expand_dims(mix_w, -1) + # shape: [N, 13, 13, 3, 1] + xy_loss = tf.reduce_sum(tf.square(true_xy - pred_xy) * object_mask * box_loss_scale * mix_w) / N + wh_loss = tf.reduce_sum(tf.square(true_tw_th - pred_tw_th) * object_mask * box_loss_scale * mix_w) / N + + # shape: [N, 13, 13, 3, 1] + conf_pos_mask = object_mask + conf_neg_mask = (1 - object_mask) * ignore_mask + conf_loss_pos = conf_pos_mask * tf.nn.sigmoid_cross_entropy_with_logits(labels=object_mask, + logits=pred_conf_logits) + conf_loss_neg = conf_neg_mask * tf.nn.sigmoid_cross_entropy_with_logits(labels=object_mask, + logits=pred_conf_logits) + # TODO: may need to balance the pos-neg by multiplying some weights + conf_loss = conf_loss_pos + conf_loss_neg + if self.use_focal_loss: + alpha = 1.0 + gamma = 2.0 + # TODO: alpha should be a mask array if needed + focal_mask = alpha * tf.pow(tf.abs(object_mask - tf.sigmoid(pred_conf_logits)), gamma) + conf_loss *= focal_mask + conf_loss = tf.reduce_sum(conf_loss * mix_w) / N + + # shape: [N, 13, 13, 3, 1] + # whether to use label smooth + if self.use_label_smooth: + delta = 0.01 + label_target = (1 - delta) * y_true[..., 5:(5 + self.class_num)] + delta * 1. / self.class_num + else: + label_target = y_true[..., 5:(5 + self.class_num)] + class_loss = object_mask * tf.nn.sigmoid_cross_entropy_with_logits(labels=label_target, + logits=pred_prob_logits) * mix_w + class_loss = tf.reduce_sum(class_loss) / N + + return xy_loss, wh_loss, conf_loss, class_loss + + def box_iou(self, pred_boxes, valid_true_boxes): + ''' + param: + pred_boxes: [13, 13, 3, 4], (center_x, center_y, w, h) + valid_true: [1, 16, 4] + ''' + # valid_true_boxes = tf.expand_dims(valid_true_boxes, -2) + + # [13, 13, 3, 2] + pred_box_xy = pred_boxes[..., 0:2] + pred_box_wh = pred_boxes[..., 2:4] + + # shape: [13, 13, 3, 1, 2] + pred_box_xy = tf.expand_dims(pred_box_xy, -2) + pred_box_wh = tf.expand_dims(pred_box_wh, -2) + + print('##################pred_box_wh', pred_box_wh) + + # [V, 2] + # N,H,W,A,C = valid_true_boxes.shape + # valid_true_boxes = tf.gather(valid_true_boxes, tf.where(object_mask)) + # print(valid_true_boxes, object_mask) + # print(valid_true_boxes) + # input() + # valid_true_boxes = tf.reshape(valid_true_boxes, (self.batch_size, 1, 1, 3, -1, 4)) + + # x = tf.reshape(valid_true_boxes[..., 0], (self.batch_size, 3, -1)) + # y = tf.reshape(valid_true_boxes[..., 1], (self.batch_size, 3, -1)) + # w = tf.reshape(valid_true_boxes[..., 2], (self.batch_size, 3, -1)) + # h = tf.reshape(valid_true_boxes[..., 3], (self.batch_size, 3, -1)) + # valid_true_boxes = tf.stack([x,y,w,h], axis=-1) + valid_true_boxes = tf.expand_dims(valid_true_boxes, 1) # [1, 1, 16, 4] + valid_true_boxes = tf.expand_dims(valid_true_boxes, 1) # [1, 1, 1, 16, 4] + + print('##################valid_true_boxes', valid_true_boxes) + + # valid_true_boxes = tf.tile(valid_true_boxes, [1,H,W,1,1]) + # print(valid_true_boxes) + # input() + + true_box_xy = valid_true_boxes[..., :2] # [1, 1, 1, 16, 2] + true_box_wh = valid_true_boxes[..., 2:] # [1, 1, 1, 16, 2] + + print('##################true_box_wh', true_box_wh) + + # [13, 13, 3, 1, 2] & [1, 1, 1, 16, 2] ==> [13, 13, 3, 16, 2] + intersect_mins = tf.maximum(pred_box_xy - pred_box_wh / 2., + true_box_xy - true_box_wh / 2.) + intersect_maxs = tf.minimum(pred_box_xy + pred_box_wh / 2., + true_box_xy + true_box_wh / 2.) + intersect_wh = tf.maximum(intersect_maxs - intersect_mins, 0.) + + print('##################intersect_mins', intersect_mins) + print('##################intersect_wh', intersect_wh) + + # shape: [13, 13, 3, 16] + intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1] + # shape: [13, 13, 3, 1] + pred_box_area = pred_box_wh[..., 0] * pred_box_wh[..., 1] + # shape: [1, 1, 1, 16] + true_box_area = true_box_wh[..., 0] * true_box_wh[..., 1] + # shape: [1, V] + # true_box_area = tf.expand_dims(true_box_area, -2) + print('##################intersect_area', intersect_area) + print('##################pred_box_area', pred_box_area) + print('##################true_box_area', true_box_area) + # [13, 13, 3, 16] + iou = intersect_area / (pred_box_area + true_box_area - intersect_area + 1e-10) + print('##################iou', iou) + # iou = tf.clip_by_value(iou, 0, 1) + + # print(pred_box_xy, pred_box_wh) + # print(intersect_area , pred_box_area , true_box_area , intersect_area) + # print(iou) + # input() + + return iou + + def compute_loss(self, y_pred, y_true, gt_box): + ''' + param: + y_pred: returned feature_map list by `forward` function: [feature_map_1, feature_map_2, feature_map_3] + y_true: input y_true by the tf.data pipeline + ''' + loss_xy, loss_wh, loss_conf, loss_class = 0., 0., 0., 0. + anchor_group = [self.anchors[6:9], self.anchors[3:6], self.anchors[0:3]] + + # calc loss in 3 scales + for i in range(len(y_pred)): + print('##################level', i) + + result = self.loss_layer(y_pred[i], y_true[i], anchor_group[i], self.featrue_map_shape[i], gt_box[i]) + loss_xy += result[0] + loss_wh += result[1] + loss_conf += result[2] + loss_class += result[3] + total_loss = loss_xy + loss_wh + loss_conf + loss_class + return [total_loss, loss_xy, loss_wh, loss_conf, loss_class] diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train.sh new file mode 100644 index 0000000..a1f92ac --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train.sh @@ -0,0 +1,58 @@ +#!/bin/bash +scriptDir=$(cd "$(dirname "$0")"; pwd) +currentDir=$(cd "$(dirname "$scriptDir")"; pwd) + +# set env +source ${currentDir}/config/npu_set_env.sh + +# setting main path +CODE_PATH=currentDir/code + +# set env +export ASCEND_HOME=/usr/local/Ascend +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/ +export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/te:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/topi:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/python/site-packages/hccl:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$currentDir +export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin +export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +export DDK_VERSION_FLAG=1.60.T49.0.B201 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 +#export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=0 + +# dump op data +#export DISABLE_REUSE_MEMORY=1 +#export DUMP_OP=1 + +ulimit -c unlimited + +# local variable +RANK_SIZE=$1 +RANK_TABLE_FILE=./hccl_config/${RANK_SIZE}p.json +RANK_ID_START=0 +SAVE_PATH=training/t1 + +# training stage +MODE=$2 + +for((RANK_ID=$RANK_ID_START;RANK_ID<$((RANK_SIZE+RANK_ID_START));RANK_ID++)); +do +echo +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[error]\" --device "$RANK_ID +TMP_PATH=$SAVE_PATH/D$RANK_ID +mkdir -p $TMP_PATH +cp run_yolov3.sh $TMP_PATH/ +cp $RANK_TABLE_FILE $TMP_PATH/rank_table.json +cd $TMP_PATH +nohup bash run_yolov3.sh $RANK_ID $RANK_SIZE $CODE_PATH $MODE > train_$RANK_ID.log & +cd - + +done + + + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_multi.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_multi.sh new file mode 100644 index 0000000..726fd58 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_multi.sh @@ -0,0 +1 @@ +nohup bash npu_train.sh 1 multi & \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_single.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_single.sh new file mode 100644 index 0000000..cac9094 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_1p_single.sh @@ -0,0 +1 @@ +nohup bash npu_train.sh 1 single & \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_multi.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_multi.sh new file mode 100644 index 0000000..13ef4a4 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_multi.sh @@ -0,0 +1 @@ +nohup bash npu_train.sh 8 multi & diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_single.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_single.sh new file mode 100644 index 0000000..62e0592 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_8p_single.sh @@ -0,0 +1 @@ +nohup bash npu_train.sh 8 single & \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_wort.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_wort.sh new file mode 100644 index 0000000..6a85cbb --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/npu_train_wort.sh @@ -0,0 +1,50 @@ + +#clean slog +rm -rf /var/log/npu/slog/host-0/*.log +rm -rf /var/log/npu/slog/device-*/*.log + +# setting main path +MAIN_PATH=$(dirname $(readlink -f $0)) + +# set env +export PYTHONPATH=/usr/local/Ascend/ops/op_impl/built-in/ai_core/tbe/:$MAIN_PATH/../../../ +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu +PATH=$PATH:$HOME/bin +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin:$PATH +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export DDK_VERSION_FLAG=1.60.T49.0.B201 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +export DUMP_GE_GRAPH=1 +export DUMP_GRAPH_LEVEL=1 +export PRINT_MODEL=1 +#export SLOG_PRINT_TO_STDOUT=1 + +ulimit -c unlimited + +# local variable +RANK_SIZE=$1 +RANK_TABLE_FILE=./configs/${RANK_SIZE}p.json +RANK_ID_START=1 +SAVE_PATH=training/t1 + +for((RANK_ID=$RANK_ID_START;RANK_ID<$((RANK_SIZE+RANK_ID_START));RANK_ID++)); +do + +echo +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[debug]\" --device "$RANK_ID + +TMP_PATH=$SAVE_PATH/D$RANK_ID +mkdir -p $TMP_PATH +cp run_yolov3.sh $TMP_PATH/ +cp $RANK_TABLE_FILE $TMP_PATH/rank_table.json +cd $TMP_PATH +nohup bash run_yolov3.sh $RANK_ID $RANK_SIZE $MAIN_PATH > train_$RANK_ID.log & +cd - + +done + + + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_show.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_show.sh new file mode 100644 index 0000000..6a39581 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_show.sh @@ -0,0 +1,57 @@ + +#export CUDA_VISIBLE_DEVICES='' +#export CUDA_VISIBLE_DEVICES=7 + + + +# setting main path +MAIN_PATH=$(dirname $(readlink -f $0)) + +# set env +export PYTHONPATH=/usr/local/Ascend/ops/op_impl/built-in/ai_core/tbe/:$MAIN_PATH/../../../ +export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/fwkacllib/lib64/:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/lib/x86_64-linux-gnu +PATH=$PATH:$HOME/bin +export PATH=$PATH:/usr/local/Ascend/fwkacllib/ccec_compiler/bin:$PATH +export ASCEND_OPP_PATH=/usr/local/Ascend/opp +export DDK_VERSION_FLAG=1.60.T49.0.B201 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +export RANK_ID=7 +export RANK_SIZE=1 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export JOB_ID=10087 +export FUSION_TENSOR_SIZE=1000000000 +#export SLOG_PRINT_TO_STDOUT=1 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 + +su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[debug]\" --device "$RANK_ID + +#RESTORE_PATH=/opt/npu/wujianping/epoch200/ +RESTORE_PATH=/opt/npu/w00558981/yolov3_ok_bak_zip/training/t1/D0/training/ +#RESTORE_PATH=/opt/npu/w00558981/training_done_yolov3/training/t1/D0/training/model-epoch_200_step_182000_loss_20.7852_lr_0 + +while : +do + +#python3.7 eval.py \ +#--save_img True \ +#--score_thresh 0.2 \ +#--restore_path $RESTORE_PATH \ +#--max_test 10 \ + + +python3.7 eval.py \ +--save_json True \ +--score_thresh 0.001 \ +--restore_path $RESTORE_PATH \ +--max_test 10000 + +break +sleep 1200 + +done + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_single_image.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_single_image.py new file mode 100644 index 0000000..b81dc5e --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/test_single_image.py @@ -0,0 +1,86 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import tensorflow as tf +import numpy as np +import argparse +import cv2 + +from utils.misc_utils import parse_anchors, read_class_names +from utils.nms_utils import gpu_nms +from utils.plot_utils import get_color_table, plot_one_box +from utils.data_aug import letterbox_resize + +from model import yolov3 + +parser = argparse.ArgumentParser(description="YOLO-V3 test single image test procedure.") +parser.add_argument("input_image", type=str, + help="The path of the input image.") +parser.add_argument("--anchor_path", type=str, default="./data/yolo_anchors.txt", + help="The path of the anchor txt file.") +parser.add_argument("--new_size", nargs='*', type=int, default=[416, 416], + help="Resize the input image with `new_size`, size format: [width, height]") +parser.add_argument("--letterbox_resize", type=lambda x: (str(x).lower() == 'true'), default=True, + help="Whether to use the letterbox resize.") +parser.add_argument("--class_name_path", type=str, default="./data/coco.names", + help="The path of the class names.") +parser.add_argument("--restore_path", type=str, default="./data/darknet_weights/yolov3.ckpt", + help="The path of the weights to restore.") +args = parser.parse_args() + +args.anchors = parse_anchors(args.anchor_path) +args.classes = read_class_names(args.class_name_path) +args.num_class = len(args.classes) + +color_table = get_color_table(args.num_class) + +img_ori = cv2.imread(args.input_image) +if args.letterbox_resize: + img, resize_ratio, dw, dh = letterbox_resize(img_ori, args.new_size[0], args.new_size[1]) +else: + height_ori, width_ori = img_ori.shape[:2] + img = cv2.resize(img_ori, tuple(args.new_size)) +img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) +img = np.asarray(img, np.float32) +img = img[np.newaxis, :] / 255. + +with tf.Session() as sess: + input_data = tf.placeholder(tf.float32, [1, args.new_size[1], args.new_size[0], 3], name='input_data') + yolo_model = yolov3(args.num_class, args.anchors) + with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(input_data, False) + pred_boxes, pred_confs, pred_probs = yolo_model.predict(pred_feature_maps) + + pred_scores = pred_confs * pred_probs + + boxes, scores, labels = gpu_nms(pred_boxes, pred_scores, args.num_class, max_boxes=200, score_thresh=0.3, nms_thresh=0.45) + + saver = tf.train.Saver() + saver.restore(sess, args.restore_path) + + boxes_, scores_, labels_ = sess.run([boxes, scores, labels], feed_dict={input_data: img}) + + # rescale the coordinates to the original image + if args.letterbox_resize: + boxes_[:, [0, 2]] = (boxes_[:, [0, 2]] - dw) / resize_ratio + boxes_[:, [1, 3]] = (boxes_[:, [1, 3]] - dh) / resize_ratio + else: + boxes_[:, [0, 2]] *= (width_ori/float(args.new_size[0])) + boxes_[:, [1, 3]] *= (height_ori/float(args.new_size[1])) + + print("box coords:") + print(boxes_) + print('*' * 30) + print("scores:") + print(scores_) + print('*' * 30) + print("labels:") + print(labels_) + + for i in range(len(boxes_)): + x0, y0, x1, y1 = boxes_[i] + plot_one_box(img_ori, [x0, y0, x1, y1], label=args.classes[labels_[i]] + ', {:.2f}%'.format(scores_[i] * 100), color=color_table[labels_[i]]) + cv2.imshow('Detection result', img_ori) + cv2.imwrite('detection_result.jpg', img_ori) + cv2.waitKey(0) diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/train.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/train.py new file mode 100644 index 0000000..8768b3e --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/train.py @@ -0,0 +1,287 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import tensorflow as tf +import numpy as np +import logging +from tqdm import trange +import random +import time +import datetime +from utils.data_utils import get_batch_data, color_jitter +from utils.misc_utils import shuffle_and_overwrite, make_summary, config_learning_rate, config_optimizer, AverageMeter +from utils.eval_utils import evaluate_on_cpu, evaluate_on_gpu, get_preds_gpu, voc_eval, parse_gt_rec +from model import yolov3 +import time +import os +import sys +# npu modified +from npu_bridge.estimator import npu_ops +from npu_bridge.estimator.npu.npu_optimizer import NPUDistributedOptimizer +from npu_bridge.estimator.npu.npu_loss_scale_optimizer import NPULossScaleOptimizer +from npu_bridge.estimator.npu.npu_loss_scale_manager import FixedLossScaleManager +from npu_bridge.estimator.npu.npu_loss_scale_manager import ExponentialUpdateLossScaleManager +from tensorflow.core.protobuf.rewriter_config_pb2 import RewriterConfig +from npu_bridge.estimator.npu import util + +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../../')) +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),'../../../../utils/atlasboost')) +from benchmark_log import hwlog +from benchmark_log.basic_utils import get_environment_info +from benchmark_log.basic_utils import get_model_parameter +import argparse + +hwlog.ROOT_DIR = os.path.split(os.path.abspath(__file__))[0] +cpu_info, npu_info, framework_info, os_info, benchmark_version = get_environment_info("tensorflow") +config_info = get_model_parameter("tensorflow_config") +initinal_data={"base_lr": 0.128, "dataset": "coco1024", "optimizer": "Adam", "loss_scale": 512, "batchsize": 32} + +hwlog.remark_print(key=hwlog.CPU_INFO, value=cpu_info) +hwlog.remark_print(key=hwlog.NPU_INFO, value=npu_info) +hwlog.remark_print(key=hwlog.OS_INFO, value=os_info) +hwlog.remark_print(key=hwlog.FRAMEWORK_INFO, value=framework_info) +hwlog.remark_print(key=hwlog.BENCHMARK_VERSION, value=benchmark_version) +hwlog.remark_print(key=hwlog.CONFIG_INFO, value=config_info) +hwlog.remark_print(key=hwlog.BASE_LR, value=initinal_data.get("base_lr")) +hwlog.remark_print(key=hwlog.DATASET, value=initinal_data.get("dataset")) +hwlog.remark_print(key=hwlog.OPT_NAME, value=initinal_data.get("optimizer")) +hwlog.remark_print(key=hwlog.LOSS_SCALE, value=initinal_data.get("loss_scale")) +hwlog.remark_print(key=hwlog.INPUT_BATCH_SIZE, value=initinal_data.get("batchsize")) + +parser = argparse.ArgumentParser(description="YOLO-V3 training setting.") +parser.add_argument("--mode", type=str, default='single', + help="setting train mode of training.") +parser.add_argument("--resume", type=bool, default=False, + help="setting if train from resume.") +args_input = parser.parse_args() + +if args_input.mode == 'single': + import args_single as args +elif args_input.mode == 'multi': + import args_multi as args +print('setting train mode %s.' %args_input.mode) + +# setting loggers +logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', + datefmt='%a, %d %b %Y %H:%M:%S', filename=args.progress_log_path, filemode='w') + + +################## +# tf.data pipeline +################## +train_dataset = tf.data.TextLineDataset(args.train_file) +print('##########################args_input.rank_id', os.environ['RANK_ID']) +logging.info('shuffle seed_%s args.', os.environ['RANK_ID']) + +train_dataset = train_dataset.shuffle(args.train_img_cnt, seed=int(os.environ['RANK_ID']), + reshuffle_each_iteration=True) +print('##########################args.train_img_cnt', args.train_img_cnt) + +train_dataset = train_dataset.repeat() +train_dataset = train_dataset.batch(args.batch_size, drop_remainder=True) # npu modified +train_dataset = train_dataset.map( + lambda x: tf.py_func(get_batch_data, + inp=[x, args.class_num, args.img_size, args.anchors, 'train', args.multi_scale_train, + args.use_mix_up, args.letterbox_resize], + Tout=[tf.float32, + tf.float32, tf.float32, tf.float32, + tf.float32, tf.float32, tf.float32]), + num_parallel_calls=20 +) + + +def valid_shape(*x): + image, y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 = x + y_true = [y_true_13, y_true_26, y_true_52] + gt_box = [gt_box_13, gt_box_26, gt_box_52] + + # npu modified + if args_input.mode == 'single': + image.set_shape([args.batch_size, args.img_size[0], args.img_size[1], 3]) + y_true[0].set_shape([args.batch_size, 13, 13, 3, 86]) + y_true[1].set_shape([args.batch_size, 26, 26, 3, 86]) + y_true[2].set_shape([args.batch_size, 52, 52, 3, 86]) + elif args_input.mode == 'multi': + image.set_shape([args.batch_size, args.img_size[0], args.img_size[1], 3]) + y_true[0].set_shape([args.batch_size, 19*1, 19*1, 3, 86]) + y_true[1].set_shape([args.batch_size, 19*2, 19*2, 3, 86]) + y_true[2].set_shape([args.batch_size, 19*4, 19*4, 3, 86]) + + gt_box[0].set_shape([args.batch_size, 1, 32, 4]) + gt_box[1].set_shape([args.batch_size, 1, 64, 4]) + gt_box[2].set_shape([args.batch_size, 1, 128, 4]) + + image = color_jitter( + image, brightness=0.125, contrast=0.5, saturation=0.5, hue=0.05) + + return image, y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 + + +train_dataset = train_dataset.map(valid_shape, num_parallel_calls=20) +train_dataset = train_dataset.prefetch(args.prefetech_buffer) +iterator = tf.data.Iterator.from_structure(train_dataset.output_types, train_dataset.output_shapes) +train_init_op = iterator.make_initializer(train_dataset) +# get an element from the chosen dataset iterator +image, y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 = iterator.get_next() +y_true = [y_true_13, y_true_26, y_true_52] +gt_box = [gt_box_13, gt_box_26, gt_box_52] + + +################## +# Model definition +################## +yolo_model = yolov3(args.class_num, args.anchors, args.use_label_smooth, args.use_focal_loss, args.batch_norm_decay, + args.weight_decay, use_static_shape=False, + batch_size=args.batch_size, img_size=args.img_size) + +with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(image, is_training=True) +loss = yolo_model.compute_loss(pred_feature_maps, y_true, gt_box) +l2_loss = tf.losses.get_regularization_loss() + +# setting restore parts and vars to update +saver_to_restore = tf.train.Saver( + var_list=tf.contrib.framework.get_variables_to_restore(include=args.restore_include, exclude=args.restore_exclude)) +update_vars = tf.contrib.framework.get_variables_to_restore(include=args.update_part) + +tf.summary.scalar('train_batch_statistics/total_loss', loss[0]) +tf.summary.scalar('train_batch_statistics/loss_xy', loss[1]) +tf.summary.scalar('train_batch_statistics/loss_wh', loss[2]) +tf.summary.scalar('train_batch_statistics/loss_conf', loss[3]) +tf.summary.scalar('train_batch_statistics/loss_class', loss[4]) +tf.summary.scalar('train_batch_statistics/loss_l2', l2_loss) +tf.summary.scalar('train_batch_statistics/loss_ratio', l2_loss / loss[0]) + +def learning_rate_fn(global_step): + """Builds scaled learning rate function with 0.08 epoch warm up.""" + initial_learning_rate = args.learning_rate_init + batches_per_epoch = args.train_batch_num // args.iterations_per_loop * args.iterations_per_loop + total_steps = int(args.total_epoches * batches_per_epoch) + warmup_steps = int(batches_per_epoch * args.warm_up_epoch) + tf.compat.v1.logging.info('total_steps: %d', int(total_steps)) + tf.compat.v1.logging.info('warmup_steps: %d', int(warmup_steps)) + lr = tf.maximum( + tf.compat.v1.train.cosine_decay( + learning_rate=initial_learning_rate, + global_step=global_step - warmup_steps, + decay_steps=total_steps - warmup_steps, + ), + 0, + ) + warmup_lr = ( + initial_learning_rate * tf.cast(global_step, tf.float32) / tf.cast( + warmup_steps, tf.float32)) + return tf.cond(pred=global_step < warmup_steps, + true_fn=lambda: warmup_lr, + false_fn=lambda: lr) + + +global_step = tf.train.get_or_create_global_step() +learning_rate = learning_rate_fn(global_step) +tf.summary.scalar('learning_rate', learning_rate) + +if not args.save_optimizer: + saver_to_save = tf.train.Saver() + saver_best = tf.train.Saver() + +optimizer = config_optimizer(args.optimizer_name, learning_rate) +optimizer = NPUDistributedOptimizer(optimizer) +loss_scale_manager = FixedLossScaleManager(loss_scale=128) +if args.num_gpus > 1: + optimizer = NPULossScaleOptimizer(optimizer, loss_scale_manager, is_distributed=True) +else: + optimizer = NPULossScaleOptimizer(optimizer, loss_scale_manager, is_distributed=False) + +# set dependencies for BN ops +update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) +with tf.control_dependencies(update_ops): + # apply gradient clip to avoid gradient exploding + gvs = optimizer.compute_gradients(loss[0] + l2_loss, var_list=update_vars) + clip_grad_var = [gv if gv[0] is None else [ + tf.clip_by_norm(gv[0], 100.), gv[1]] for gv in gvs] + train_op = optimizer.apply_gradients(clip_grad_var, global_step=tf.train.get_global_step()) + +if args.save_optimizer: + print( + 'Saving optimizer parameters to checkpoint! Remember to restore the global_step in the fine-tuning afterwards.') + saver_to_save = tf.train.Saver() + saver_best = tf.train.Saver() + +# npu modified +config = tf.ConfigProto() +custom_op = config.graph_options.rewrite_options.custom_optimizers.add() +custom_op.name = "NpuOptimizer" +custom_op.parameter_map["use_off_line"].b = True # training on Ascend chips +custom_op.parameter_map["enable_data_pre_proc"].b = True +custom_op.parameter_map["iterations_per_loop"].i = args.iterations_per_loop +config.graph_options.rewrite_options.remapping = RewriterConfig.OFF + +with tf.Session(config=config) as sess: + # yolov3 finetuning训练开启(darknet53.ckpt) + sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()]) + + # 断点续训开启 + if args_input.resume: + saver_to_restore = tf.train.Saver() + saver_to_restore.restore(sess, tf.train.latest_checkpoint(args.save_dir)) + else: + saver_to_restore.restore(sess, args.restore_path) + + merged = tf.summary.merge_all() + writer = tf.summary.FileWriter(args.log_dir, sess.graph) + + print('\n----------- start to train -----------\n') + + #hwlog.logger.info("time_ts:%s, hardware:%s current os:%s" %(date_time,'Ascend910','Ubuntu 18.04')) + #hwlog.logger.info("time_ts:%s, framework is tensorflow 1.15.0 " %(date_time)) + #remark_logger.info("ABK time_ts: %s, yolov3 %s model train begain, total train_epoches:%d, file: %s, lineno: %s" %(date_time,args_input.mode,args.total_epoches,file_name,sys._getframe().f_lineno)) + hwlog.remark_print(key=hwlog.TOTAL_TRAIN_EPOCH, value=f"{args.total_epoches}") + best_mAP = -np.Inf + train_op = util.set_iteration_per_loop(sess, train_op, args.iterations_per_loop) + sess.run(train_init_op) + for epoch in range(args.total_epoches): + loss_total, loss_xy, loss_wh, loss_conf, loss_class = AverageMeter(), AverageMeter(), AverageMeter(), AverageMeter(), AverageMeter() + for i in trange(args.train_batch_num // args.iterations_per_loop): + t = time.time() + _, summary, __y_true, __loss, __global_step, __lr = sess.run( + [train_op, merged, y_true, loss, global_step, learning_rate] + ) + fps = 1 / (time.time() - t) * args.iterations_per_loop * args.num_gpus * args.batch_size + + writer.add_summary(summary, global_step=__global_step) + + loss_total.update(__loss[0], len(__y_true[0])) + loss_xy.update(__loss[1], len(__y_true[0])) + loss_wh.update(__loss[2], len(__y_true[0])) + loss_conf.update(__loss[3], len(__y_true[0])) + loss_class.update(__loss[4], len(__y_true[0])) + + info = "Epoch: {}, global_step: {} fps: {:.2f} lr: {:.5f} | loss: total: {:.2f}, xy: {:.2f}, wh: {:.2f}, conf: {:.2f}, class: {:.2f} | ".format( + epoch, int(__global_step), fps, __lr, loss_total.average, loss_xy.average, loss_wh.average, + loss_conf.average, + loss_class.average) + print(info) + logging.info(info) + #remark_logger.info("ABK time_ts:%s, global_steps %d, learning rate %2f, file: %s, lineno: %s" %(date_time,int(__global_step),__lr,file_name,sys._getframe().f_lineno)) + #remark_logger.info("ABK time_ts:%s, fps %2f, loss_total %2f, file: %s, lineno: %s" %(date_time,fps,loss_total.average,file_name,sys._getframe().f_lineno)) + + hwlog.remark_print(key=hwlog.FPS, value=f"{fps}") + hwlog.remark_print(key=hwlog.GLOBAL_STEP, value=f"{int(__global_step)}") + + # NOTE: this is just demo. You can set the conditions when to save the weights. + temp_epoch = epoch + 1 + if temp_epoch % args.save_epoch == 0 and epoch > 0: + saver_to_save.save(sess, args.save_dir + 'model-epoch_{}_step_{}_loss_{:.4f}_lr_{:.5g}'.format( \ + temp_epoch, + int(__global_step), + loss_total.average, + __lr)) + + if __lr <= 0: + break + + saver_to_save.save(sess, args.save_dir + 'model-final_step_{}_loss_{:.4f}_lr_{:.5g}'.format( \ + int(__global_step), + loss_total.average, + __lr)) diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D0/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D1/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D2/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D3/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D4/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D5/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D6/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/rank_table.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/rank_table.json new file mode 100644 index 0000000..7ad6317 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/rank_table.json @@ -0,0 +1,109 @@ +{ + "board_id": "0x002f", + "chip_info": "910", + "deploy_mode": "lab", + "group_count": "1", + "group_list": [ + { + "device_num": "8", + "server_num": "1", + "group_name": "", + "instance_count": "8", + "instance_list": [ + { + "devices": [ + { + "device_id": "0", + "device_ip": "192.168.100.101" + } + ], + "rank_id": "0", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "1", + "device_ip": "192.168.101.101" + } + ], + "rank_id": "1", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "2", + "device_ip": "192.168.102.101" + } + ], + "rank_id": "2", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "3", + "device_ip": "192.168.103.101" + } + ], + "rank_id": "3", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "4", + "device_ip": "192.168.100.100" + } + ], + "rank_id": "4", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "5", + "device_ip": "192.168.101.100" + } + ], + "rank_id": "5", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "6", + "device_ip": "192.168.102.100" + } + ], + "rank_id": "6", + "server_id": "0.0.0.0" + }, + { + "devices": [ + { + "device_id": "7", + "device_ip": "192.168.103.100" + } + ], + "rank_id": "7", + "server_id": "0.0.0.0" + } + ] + } + ], + "para_plane_nic_location": "device", + "para_plane_nic_name": [ + "eth0", + "eth1", + "eth2", + "eth3", + "eth4", + "eth5", + "eth6", + "eth7" + ], + "para_plane_nic_num": "8", + "status": "completed" +} diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/run_yolov3.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/run_yolov3.sh new file mode 100644 index 0000000..24742a7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/training/t1/D7/run_yolov3.sh @@ -0,0 +1,29 @@ +#!/bin/bash +rm -rf Onnxgraph +rm -rf Partition +rm -rf OptimizeSubGraph +rm -rf Aicpu_Optimized +rm *txt +rm -rf result_$RANK_ID + + + +export RANK_ID=$1 +export RANK_SIZE=$2 +export DEVICE_ID=$RANK_ID +export DEVICE_INDEX=$RANK_ID +export RANK_TABLE_FILE=rank_table.json +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + +KERNEL_NUM=20 +PID_START=$((KERNEL_NUM * RANK_ID)) +PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3 $3/train.py \ +--mode $4 + +mkdir graph +mv *.txt graph +mv *.pbtxt graph diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/__init__.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_aug.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_aug.py new file mode 100644 index 0000000..4aca384 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_aug.py @@ -0,0 +1,450 @@ +# coding: utf-8 +# part of this is take from Gluon's repo: +# https://github.com/dmlc/gluon-cv/blob/master/gluoncv/data/transforms/presets/yolo.py + +from __future__ import division, print_function + +import random +import numpy as np +import cv2 +# from matplotlib.colors import rgb_to_hsv, hsv_to_rgb + + +def mix_up(img1, img2, bbox1, bbox2): + ''' + return: + mix_img: HWC format mix up image + mix_bbox: [N, 5] shape mix up bbox, i.e. `x_min, y_min, x_max, y_mix, mixup_weight`. + ''' + height = max(img1.shape[0], img2.shape[0]) + width = max(img1.shape[1], img2.shape[1]) + + mix_img = np.zeros(shape=(height, width, 3), dtype='float32') + + # rand_num = np.random.random() + rand_num = np.random.beta(1.5, 1.5) + rand_num = max(0, min(1, rand_num)) + mix_img[:img1.shape[0], :img1.shape[1], :] = img1.astype('float32') * rand_num + mix_img[:img2.shape[0], :img2.shape[1], :] += img2.astype('float32') * (1. - rand_num) + + mix_img = mix_img.astype('uint8') + + # the last element of the 2nd dimention is the mix up weight + bbox1 = np.concatenate((bbox1, np.full(shape=(bbox1.shape[0], 1), fill_value=rand_num)), axis=-1) + bbox2 = np.concatenate((bbox2, np.full(shape=(bbox2.shape[0], 1), fill_value=1. - rand_num)), axis=-1) + mix_bbox = np.concatenate((bbox1, bbox2), axis=0) + + return mix_img, mix_bbox + + +def bbox_crop(bbox, crop_box=None, allow_outside_center=True): + """Crop bounding boxes according to slice area. + This method is mainly used with image cropping to ensure bonding boxes fit + within the cropped image. + Parameters + ---------- + bbox : numpy.ndarray + Numpy.ndarray with shape (N, 4+) where N is the number of bounding boxes. + The second axis represents attributes of the bounding box. + Specifically, these are :math:`(x_{min}, y_{min}, x_{max}, y_{max})`, + we allow additional attributes other than coordinates, which stay intact + during bounding box transformations. + crop_box : tuple + Tuple of length 4. :math:`(x_{min}, y_{min}, width, height)` + allow_outside_center : bool + If `False`, remove bounding boxes which have centers outside cropping area. + Returns + ------- + numpy.ndarray + Cropped bounding boxes with shape (M, 4+) where M <= N. + """ + bbox = bbox.copy() + if crop_box is None: + return bbox + if not len(crop_box) == 4: + raise ValueError( + "Invalid crop_box parameter, requires length 4, given {}".format(str(crop_box))) + if sum([int(c is None) for c in crop_box]) == 4: + return bbox + + l, t, w, h = crop_box + + left = l if l else 0 + top = t if t else 0 + right = left + (w if w else np.inf) + bottom = top + (h if h else np.inf) + crop_bbox = np.array((left, top, right, bottom)) + + if allow_outside_center: + mask = np.ones(bbox.shape[0], dtype=bool) + else: + centers = (bbox[:, :2] + bbox[:, 2:4]) / 2 + mask = np.logical_and(crop_bbox[:2] <= centers, centers < crop_bbox[2:]).all(axis=1) + + # transform borders + bbox[:, :2] = np.maximum(bbox[:, :2], crop_bbox[:2]) + bbox[:, 2:4] = np.minimum(bbox[:, 2:4], crop_bbox[2:4]) + bbox[:, :2] -= crop_bbox[:2] + bbox[:, 2:4] -= crop_bbox[:2] + + mask = np.logical_and(mask, (bbox[:, :2] < bbox[:, 2:4]).all(axis=1)) + bbox = bbox[mask] + return bbox + +def bbox_iou(bbox_a, bbox_b, offset=0): + """Calculate Intersection-Over-Union(IOU) of two bounding boxes. + Parameters + ---------- + bbox_a : numpy.ndarray + An ndarray with shape :math:`(N, 4)`. + bbox_b : numpy.ndarray + An ndarray with shape :math:`(M, 4)`. + offset : float or int, default is 0 + The ``offset`` is used to control the whether the width(or height) is computed as + (right - left + ``offset``). + Note that the offset must be 0 for normalized bboxes, whose ranges are in ``[0, 1]``. + Returns + ------- + numpy.ndarray + An ndarray with shape :math:`(N, M)` indicates IOU between each pairs of + bounding boxes in `bbox_a` and `bbox_b`. + """ + if bbox_a.shape[1] < 4 or bbox_b.shape[1] < 4: + raise IndexError("Bounding boxes axis 1 must have at least length 4") + + tl = np.maximum(bbox_a[:, None, :2], bbox_b[:, :2]) + br = np.minimum(bbox_a[:, None, 2:4], bbox_b[:, 2:4]) + + area_i = np.prod(br - tl + offset, axis=2) * (tl < br).all(axis=2) + area_a = np.prod(bbox_a[:, 2:4] - bbox_a[:, :2] + offset, axis=1) + area_b = np.prod(bbox_b[:, 2:4] - bbox_b[:, :2] + offset, axis=1) + return area_i / (area_a[:, None] + area_b - area_i) + + +def random_crop_with_constraints(bbox, size, min_scale=0.25, max_scale=1, + max_aspect_ratio=2, constraints=None, + max_trial=10): + """Crop an image randomly with bounding box constraints. + This data augmentation is used in training of + Single Shot Multibox Detector [#]_. More details can be found in + data augmentation section of the original paper. + .. [#] Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, + Scott Reed, Cheng-Yang Fu, Alexander C. Berg. + SSD: Single Shot MultiBox Detector. ECCV 2016. + Parameters + ---------- + bbox : numpy.ndarray + Numpy.ndarray with shape (N, 4+) where N is the number of bounding boxes. + The second axis represents attributes of the bounding box. + Specifically, these are :math:`(x_{min}, y_{min}, x_{max}, y_{max})`, + we allow additional attributes other than coordinates, which stay intact + during bounding box transformations. + size : tuple + Tuple of length 2 of image shape as (width, height). + min_scale : float + The minimum ratio between a cropped region and the original image. + The default value is :obj:`0.3`. + max_scale : float + The maximum ratio between a cropped region and the original image. + The default value is :obj:`1`. + max_aspect_ratio : float + The maximum aspect ratio of cropped region. + The default value is :obj:`2`. + constraints : iterable of tuples + An iterable of constraints. + Each constraint should be :obj:`(min_iou, max_iou)` format. + If means no constraint if set :obj:`min_iou` or :obj:`max_iou` to :obj:`None`. + If this argument defaults to :obj:`None`, :obj:`((0.1, None), (0.3, None), + (0.5, None), (0.7, None), (0.9, None), (None, 1))` will be used. + max_trial : int, default 40 + Maximum number of trials for each constraint before exit no matter what. + Returns + ------- + numpy.ndarray + Cropped bounding boxes with shape :obj:`(M, 4+)` where M <= N. + tuple + Tuple of length 4 as (x_offset, y_offset, new_width, new_height). + """ + # default params in paper + if constraints is None: + constraints = ( + # (0.1, None), + (0.3, None), + (0.5, None), + (0.7, None), + (0.9, None), + (None, 1), + ) + + w, h = size + + candidates = [(0, 0, w, h)] + for min_iou, max_iou in constraints: + min_iou = -np.inf if min_iou is None else min_iou + max_iou = np.inf if max_iou is None else max_iou + + for _ in range(max_trial): + scale = random.uniform(min_scale, max_scale) + aspect_ratio = random.uniform( + max(1 / max_aspect_ratio, scale * scale), + min(max_aspect_ratio, 1 / (scale * scale))) + crop_h = int(h * scale / np.sqrt(aspect_ratio)) + crop_w = int(w * scale * np.sqrt(aspect_ratio)) + + crop_t = random.randrange(h - crop_h) + crop_l = random.randrange(w - crop_w) + crop_bb = np.array((crop_l, crop_t, crop_l + crop_w, crop_t + crop_h)) + + if len(bbox) == 0: + top, bottom = crop_t, crop_t + crop_h + left, right = crop_l, crop_l + crop_w + return bbox, (left, top, right-left, bottom-top) + + iou = bbox_iou(bbox, crop_bb[np.newaxis]) + if min_iou <= iou.min() and iou.max() <= max_iou: + top, bottom = crop_t, crop_t + crop_h + left, right = crop_l, crop_l + crop_w + candidates.append((left, top, right-left, bottom-top)) + break + + # random select one + while candidates: + crop = candidates.pop(np.random.randint(0, len(candidates))) + new_bbox = bbox_crop(bbox, crop, allow_outside_center=False) + if new_bbox.size < 1: + continue + new_crop = (crop[0], crop[1], crop[2], crop[3]) + return new_bbox, new_crop + return bbox, (0, 0, w, h) + +def _rand(a=0., b=1.): + return np.random.rand() * (b - a) + a +def random_color_distort(image_data, _hue=0.1, _sat=1.5, _val=1.5): + _hue = _rand(-_hue, _hue) + _sat = _rand(1, _sat) if _rand() < .5 else 1 / _rand(1, _sat) + _val = _rand(1, _val) if _rand() < .5 else 1 / _rand(1, _val) + x = rgb_to_hsv(image_data) + x[..., 0] += _hue + x[..., 0][x[..., 0] > 1] -= 1 + x[..., 0][x[..., 0] < 0] += 1 + x[..., 1] *= _sat + x[..., 2] *= _val + x[x > 1] = 1 + x[x < 0] = 0 + image_data = hsv_to_rgb(x) + image_data = image_data.astype(np.float32) + return image_data + + +def random_color_distort_1(img, bgain=16, hgain=0.0138, sgain=0.678, vgain=0.36): + # brightness_delta = int(np.random.uniform(-bgain, bgain)) + # img = np.clip(img + brightness_delta , 0, 255) + # img = img.astype(np.uint8) + + r = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain] + 1 # random gains + hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV)) + dtype = img.dtype # uint8 + + x = np.arange(0, 256, dtype=np.int16) + lut_hue = ((x * r[0]) % 180).astype(dtype) + lut_sat = np.clip(x * r[1], 0, 255).astype(dtype) + lut_val = np.clip(x * r[2], 0, 255).astype(dtype) + + img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype) + img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) # no return needed + + return img + + + +def random_color_distort_raw(img, brightness_delta=16, hue_vari=0.01, sat_vari=0.15, val_vari=0.15, p=0.2): + ''' + randomly distort image color. Adjust brightness, hue, saturation, value. + param: + img: a BGR uint8 format OpenCV image. HWC format. + ''' + + def random_hue(img_hsv, hue_vari, p=p): + if np.random.uniform(0, 1) > p: + hue_delta = np.random.randint(-hue_vari, hue_vari) + img_hsv[:, :, 0] = (img_hsv[:, :, 0] + hue_delta) % 180 + return img_hsv + + def random_saturation(img_hsv, sat_vari, p=p): + if np.random.uniform(0, 1) > p: + sat_mult = 1 + np.random.uniform(-sat_vari, sat_vari) + img_hsv[:, :, 1] *= sat_mult + return img_hsv + + def random_value(img_hsv, val_vari, p=p): + if np.random.uniform(0, 1) > p: + val_mult = 1 + np.random.uniform(-val_vari, val_vari) + img_hsv[:, :, 2] *= val_mult + return img_hsv + + def random_brightness(img, brightness_delta, p=p): + if np.random.uniform(0, 1) > p: + img = img.astype(np.float32) + brightness_delta = int(np.random.uniform(-brightness_delta, brightness_delta)) + img = img + brightness_delta + return np.clip(img, 0, 255) + + # brightness + img = random_brightness(img, brightness_delta) + img = img.astype(np.uint8) + + # color jitter + img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.float32) + + if np.random.randint(0, 2): + img_hsv = random_value(img_hsv, val_vari) + img_hsv = random_saturation(img_hsv, sat_vari) + img_hsv = random_hue(img_hsv, hue_vari) + else: + img_hsv = random_saturation(img_hsv, sat_vari) + img_hsv = random_hue(img_hsv, hue_vari) + img_hsv = random_value(img_hsv, val_vari) + + img_hsv = np.clip(img_hsv, 0, 255) + img = cv2.cvtColor(img_hsv.astype(np.uint8), cv2.COLOR_HSV2BGR) + + return img + + +def letterbox_resize(img, new_width, new_height, interp=0): + ''' + Letterbox resize. keep the original aspect ratio in the resized image. + ''' + ori_height, ori_width = img.shape[:2] + + resize_ratio = min(new_width / ori_width, new_height / ori_height) + + resize_w = int(resize_ratio * ori_width) + resize_h = int(resize_ratio * ori_height) + + img = cv2.resize(img, (resize_w, resize_h), interpolation=interp) + image_padded = np.full((new_height, new_width, 3), 128, np.uint8) + + dw = int((new_width - resize_w) / 2) + dh = int((new_height - resize_h) / 2) + + image_padded[dh: resize_h + dh, dw: resize_w + dw, :] = img + + return image_padded, resize_ratio, dw, dh + + +def resize_with_bbox(img, bbox, new_width, new_height, interp=0, letterbox=False): + ''' + Resize the image and correct the bbox accordingly. + ''' + + if letterbox: + image_padded, resize_ratio, dw, dh = letterbox_resize(img, new_width, new_height, interp) + + # xmin, xmax + bbox[:, [0, 2]] = bbox[:, [0, 2]] * resize_ratio + dw + # ymin, ymax + bbox[:, [1, 3]] = bbox[:, [1, 3]] * resize_ratio + dh + + return image_padded, bbox + else: + ori_height, ori_width = img.shape[:2] + + img = cv2.resize(img, (new_width, new_height), interpolation=interp) + + # xmin, xmax + bbox[:, [0, 2]] = bbox[:, [0, 2]] / ori_width * new_width + # ymin, ymax + bbox[:, [1, 3]] = bbox[:, [1, 3]] / ori_height * new_height + + return img, bbox + + +def random_flip(img, bbox, px=0, py=0): + ''' + Randomly flip the image and correct the bbox. + param: + px: + the probability of horizontal flip + py: + the probability of vertical flip + ''' + height, width = img.shape[:2] + if np.random.uniform(0, 1) < px: + img = cv2.flip(img, 1) + xmax = width - bbox[:, 0] + xmin = width - bbox[:, 2] + bbox[:, 0] = xmin + bbox[:, 2] = xmax + + if np.random.uniform(0, 1) < py: + img = cv2.flip(img, 0) + ymax = height - bbox[:, 1] + ymin = height - bbox[:, 3] + bbox[:, 1] = ymin + bbox[:, 3] = ymax + return img, bbox + +def random_resize(img, bbox, min_ratio=0.25, max_ratio=2, jitter=0.3): + ''' + Random expand original image with borders, this is identical to placing + the original image on a larger canvas. + param: + max_ratio : + Maximum ratio of the output image on both direction(vertical and horizontal) + fill : + The value(s) for padded borders. + keep_ratio : bool + If `True`, will keep output image the same aspect ratio as input. + ''' + h,w,c = img.shape + max_ratio_limited = 608 / max(h,w) + scale = random.uniform(min_ratio, max_ratio) + scale = min(max_ratio_limited, scale) + + w_ratio = random.uniform(1 - jitter, 1 + jitter) * scale + h_ratio = random.uniform(1 - jitter, 1 + jitter) * scale + + dst = cv2.resize(img, None, fx=w_ratio, fy=h_ratio) + + # correct bbox + bbox[:, 0] *= w_ratio + bbox[:, 2] *= w_ratio + bbox[:, 1] *= h_ratio + bbox[:, 3] *= h_ratio + + return dst, bbox + + +def random_expand(img, bbox, max_ratio=2, fill=0, keep_ratio=True): + ''' + Random expand original image with borders, this is identical to placing + the original image on a larger canvas. + param: + max_ratio : + Maximum ratio of the output image on both direction(vertical and horizontal) + fill : + The value(s) for padded borders. + keep_ratio : bool + If `True`, will keep output image the same aspect ratio as input. + ''' + h, w, c = img.shape + ratio_x = random.uniform(1, max_ratio) + if keep_ratio: + ratio_y = ratio_x + else: + ratio_y = random.uniform(1, max_ratio) + + oh, ow = int(h * ratio_y), int(w * ratio_x) + off_y = random.randint(0, oh - h) + off_x = random.randint(0, ow - w) + + dst = np.full(shape=(oh, ow, c), fill_value=fill, dtype=img.dtype) + + dst[off_y:off_y + h, off_x:off_x + w, :] = img + + # correct bbox + bbox[:, :2] += (off_x, off_y) + bbox[:, 2:4] += (off_x, off_y) + + return dst, bbox diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_utils.py new file mode 100644 index 0000000..39133fb --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/data_utils.py @@ -0,0 +1,294 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import numpy as np +import cv2 +import sys +from utils.data_aug import * +import random +import tensorflow as tf + +PY_VERSION = sys.version_info[0] +iter_cnt = 0 +IterControl = 50 + +def color_jitter(image, brightness=0, contrast=0, saturation=0, hue=0): + """Distorts the color of the image. + + Args: + image: The input image tensor. + brightness: A float, specifying the brightness for color jitter. + contrast: A float, specifying the contrast for color jitter. + saturation: A float, specifying the saturation for color jitter. + hue: A float, specifying the hue for color jitter. + + Returns: + The distorted image tensor. + """ + with tf.name_scope('distort_color'): + if brightness > 0: + image = tf.image.random_brightness(image, max_delta=brightness) + if contrast > 0: + image = tf.image.random_contrast( + image, lower=1-contrast, upper=1+contrast) + if saturation > 0: + image = tf.image.random_saturation( + image, lower=1-saturation, upper=1+saturation) + if hue > 0: + image = tf.image.random_hue(image, max_delta=hue) + return image + +def parse_line(line): + ''' + Given a line from the training/test txt file, return parsed info. + line format: line_index, img_path, img_width, img_height, [box_info_1 (5 number)], ... + return: + line_idx: int32 + pic_path: string. + boxes: shape [N, 4], N is the ground truth count, elements in the second + dimension are [x_min, y_min, x_max, y_max] + labels: shape [N]. class index. + img_width: int. + img_height: int + ''' + if 'str' not in str(type(line)): + line = line.decode() + s = line.strip().split(' ') + assert len( + s) > 8, 'Annotation error! Please check your annotation file. Make sure there is at least one target object in each image.' + # line_idx = int(s[0]) + pic_path = s[1] + img_width = int(s[2]) + img_height = int(s[3]) + s = s[4:] + assert len( + s) % 5 == 0, 'Annotation error! Please check your annotation file. Maybe partially missing some coordinates?' + box_cnt = len(s) // 5 + boxes = [] + labels = [] + for i in range(box_cnt): + label, x_min, y_min, x_max, y_max = int(s[i * 5]), float(s[i * 5 + 1]), float(s[i * 5 + 2]), float( + s[i * 5 + 3]), float(s[i * 5 + 4]) + boxes.append([x_min, y_min, x_max, y_max]) + labels.append(label) + boxes = np.asarray(boxes, np.float32) + labels = np.asarray(labels, np.int32) + return pic_path, boxes, labels, img_width, img_height + + +def process_box(boxes, labels, img_size, class_num, anchors): + ''' + Generate the y_true label, i.e. the ground truth feature_maps in 3 different scales. + params: + boxes: [N, 5] shape, float32 dtype. `x_min, y_min, x_max, y_mix, mixup_weight`. + labels: [N] shape, int32 dtype. + class_num: int32 num. + anchors: [9, 4] shape, float32 dtype. + ''' + anchors_mask = [[6, 7, 8], [3, 4, 5], [0, 1, 2]] + + # boxes = np.random.shuffle() + # convert boxes form: + # shape: [N, 2] + # (x_center, y_center) + box_centers = (boxes[:, 0:2] + boxes[:, 2:4]) / 2 + # (width, height) + box_sizes = boxes[:, 2:4] - boxes[:, 0:2] + + # [13, 13, 3, 5+num_class+1] `5` means coords and labels. `1` means mix up weight. + y_true_13 = np.zeros((img_size[1] // 32, img_size[0] // 32, 3, 6 + class_num), np.float32) + y_true_26 = np.zeros((img_size[1] // 16, img_size[0] // 16, 3, 6 + class_num), np.float32) + y_true_52 = np.zeros((img_size[1] // 8, img_size[0] // 8, 3, 6 + class_num), np.float32) + + gt_box_13 = np.zeros((1, 32, 4), np.float32) + gt_box_26 = np.zeros((1, 64, 4), np.float32) + gt_box_52 = np.zeros((1, 128, 4), np.float32) + gt_box_list = [gt_box_13, gt_box_26, gt_box_52] + + # mix up weight default to 1. + y_true_13[..., -1] = 1. + y_true_26[..., -1] = 1. + y_true_52[..., -1] = 1. + + y_true = [y_true_13, y_true_26, y_true_52] + + # [N, 1, 2] + box_sizes = np.expand_dims(box_sizes, 1) + # broadcast tricks + # [N, 1, 2] & [9, 2] ==> [N, 9, 2] + mins = np.maximum(- box_sizes / 2, - anchors / 2) + maxs = np.minimum(box_sizes / 2, anchors / 2) + # [N, 9, 2] + whs = maxs - mins + + # [N, 9] + iou = (whs[:, :, 0] * whs[:, :, 1]) / ( + box_sizes[:, :, 0] * box_sizes[:, :, 1] + anchors[:, 0] * anchors[:, 1] - whs[:, :, 0] * whs[:, :, + 1] + 1e-10) + # [N] + best_match_idx = np.argmax(iou, axis=1) + + ratio_dict = {1.: 8., 2.: 16., 3.: 32.} + index_dict = {0: 0, 1: 0, 2: 0} + for i, idx in enumerate(best_match_idx): + # idx: 0,1,2 ==> 2; 3,4,5 ==> 1; 6,7,8 ==> 0 + feature_map_group = 2 - idx // 3 + # scale ratio: 0,1,2 ==> 8; 3,4,5 ==> 16; 6,7,8 ==> 32 + ratio = ratio_dict[np.ceil((idx + 1) / 3.)] + x = int(np.floor(box_centers[i, 0] / ratio)) + y = int(np.floor(box_centers[i, 1] / ratio)) + k = anchors_mask[feature_map_group].index(idx) + c = labels[i] + # print(feature_map_group, '|', y,x,k,c) + + y_true[feature_map_group][y, x, k, :2] = box_centers[i] + y_true[feature_map_group][y, x, k, 2:4] = box_sizes[i] + y_true[feature_map_group][y, x, k, 4] = 1. + y_true[feature_map_group][y, x, k, 5 + c] = 1. + y_true[feature_map_group][y, x, k, -1] = boxes[i, -1] + + if index_dict[feature_map_group] < gt_box_list[feature_map_group].shape[1]: + gt_box_list[feature_map_group][0, index_dict[feature_map_group], :2] = box_centers[i] + gt_box_list[feature_map_group][0, index_dict[feature_map_group], 2:4] = box_sizes[i] + index_dict[feature_map_group] += 1 + + return y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 + + +def parse_data(line, class_num, img_size, anchors, mode, letterbox_resize, multi_scale): + ''' + param: + line: a line from the training/test txt file + class_num: totol class nums. + img_size: the size of image to be resized to. [width, height] format. + anchors: anchors. + mode: 'train' or 'val'. When set to 'train', data_augmentation will be applied. + letterbox_resize: whether to use the letterbox resize, i.e., keep the original aspect ratio in the resized image. + ''' + if not isinstance(line, list): + print('###################### line') + pic_path, boxes, labels, _, _ = parse_line(line) + img = cv2.imread(pic_path) + # expand the 2nd dimension, mix up weight default to 1. + boxes = np.concatenate((boxes, np.full(shape=(boxes.shape[0], 1), fill_value=1., dtype=np.float32)), axis=-1) + else: + print('###################### mixup') + # the mix up case + pic_path1, boxes1, labels1, _, _ = parse_line(line[0]) + img1 = cv2.imread(pic_path1) + pic_path2, boxes2, labels2, _, _ = parse_line(line[1]) + img2 = cv2.imread(pic_path2) + + img, boxes = mix_up(img1, img2, boxes1, boxes2) + labels = np.concatenate((labels1, labels2)) + + if mode == 'train': + img, boxes = random_resize(img, boxes, min_ratio=0.25, max_ratio=2, jitter=0.3) + + # random expansion with prob 0.5 + if np.random.uniform(0, 1) > 0.5: + img, boxes = random_expand(img, boxes, max_ratio=3, fill=128, keep_ratio=False) + + # random cropping + h, w, _ = img.shape + boxes, crop = random_crop_with_constraints(boxes, (w, h)) + x0, y0, w, h = crop + img = img[y0: y0 + h, x0: x0 + w] + + # resize with random interpolation + h, w, _ = img.shape + interp = np.random.randint(0, 5) + img, boxes = resize_with_bbox(img, boxes, img_size[0], img_size[1], interp=interp, letterbox=letterbox_resize) + + # random horizontal flip + h, w, _ = img.shape + img, boxes = random_flip(img, boxes, px=0.5) + + else: + img, boxes = resize_with_bbox(img, boxes, img_size[0], img_size[1], interp=1, letterbox=letterbox_resize) + + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) + + # the input of yolo_v3 should be in range 0~1 + img = img / 255. + + if mode == 'train' and iter_cnt >= IterControl and multi_scale: + cav = np.zeros((608, 608, 3), dtype=np.float32) + 0.5 + true_h, true_w, c = img.shape + cav[:true_h, :true_w, :] = img + img = cav.astype(np.float32) + img_size = [608, 608] + + y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 = process_box(boxes, labels, img_size, class_num, + anchors) + + return img, y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 + + +def get_batch_data(batch_line, class_num, img_size, anchors, mode, multi_scale=False, mix_up=False, + letterbox_resize=True, interval=10): + ''' + generate a batch of imgs and labels + param: + batch_line: a batch of lines from train/val.txt files + class_num: num of total classes. + img_size: the image size to be resized to. format: [width, height]. + anchors: anchors. shape: [9, 2]. + mode: 'train' or 'val'. if set to 'train', data augmentation will be applied. + multi_scale: whether to use multi_scale training, img_size varies from [320, 320] to [640, 640] by default. Note that it will take effect only when mode is set to 'train'. + letterbox_resize: whether to use the letterbox resize, i.e., keep the original aspect ratio in the resized image. + interval: change the scale of image every interval batches. Note that it's indeterministic because of the multi threading. + ''' + if isinstance(mode, bytes): + mode = mode.decode() + + global iter_cnt + # multi_scale training + if multi_scale and mode == 'train' and iter_cnt >= IterControl: + random.seed(iter_cnt // interval) + random_img_size = [[x * 32, x * 32] for x in range(10, 20)] + img_size = random.sample(random_img_size, 1)[0] + print('multi_scale iter: %d, img_size: %d,%d' % (iter_cnt, img_size[0], img_size[1])) + else: + print('single_scale iter: %d, img_size: %d,%d' % (iter_cnt, img_size[0], img_size[1])) + iter_cnt += 1 + + img_idx_batch, img_batch, y_true_13_batch, y_true_26_batch, y_true_52_batch = [], [], [], [], [] + gt_box_13_batch, gt_box_26_batch, gt_box_52_batch = [], [], [] + + # mix up strategy + if mix_up and mode == 'train': + mix_lines = [] + batch_line = batch_line.tolist() + for idx, line in enumerate(batch_line): + if np.random.uniform(0, 1) < 0.5: + mix_lines.append([line, random.sample(batch_line[:idx] + batch_line[idx + 1:], 1)[0]]) + else: + mix_lines.append(line) + batch_line = mix_lines + + for line in batch_line: + img, y_true_13, y_true_26, y_true_52, gt_box_13, gt_box_26, gt_box_52 = parse_data(line, class_num, + img_size, anchors, + mode, + letterbox_resize, + multi_scale) + + img_batch.append(img) + y_true_13_batch.append(y_true_13) + y_true_26_batch.append(y_true_26) + y_true_52_batch.append(y_true_52) + gt_box_13_batch.append(gt_box_13) + gt_box_26_batch.append(gt_box_26) + gt_box_52_batch.append(gt_box_52) + + img_batch, y_true_13_batch, y_true_26_batch, y_true_52_batch = np.asarray(img_batch, np.float32), np.asarray( + y_true_13_batch, np.float32), np.asarray(y_true_26_batch, np.float32), np.asarray(y_true_52_batch, np.float32) + + gt_box_13_batch, gt_box_26_batch, gt_box_52_batch = \ + np.asarray(gt_box_13_batch), np.asarray(gt_box_26_batch), np.asarray(gt_box_52_batch) + + return img_batch, y_true_13_batch, y_true_26_batch, y_true_52_batch, \ + gt_box_13_batch, gt_box_26_batch, gt_box_52_batch + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/eval_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/eval_utils.py new file mode 100644 index 0000000..19bb322 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/eval_utils.py @@ -0,0 +1,423 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import numpy as np +import cv2 +from collections import Counter + +from utils.nms_utils import cpu_nms, gpu_nms +from utils.data_utils import parse_line + + +def calc_iou(pred_boxes, true_boxes): + ''' + Maintain an efficient way to calculate the ios matrix using the numpy broadcast tricks. + shape_info: pred_boxes: [N, 4] + true_boxes: [V, 4] + return: IoU matrix: shape: [N, V] + ''' + + # [N, 1, 4] + pred_boxes = np.expand_dims(pred_boxes, -2) + # [1, V, 4] + true_boxes = np.expand_dims(true_boxes, 0) + + # [N, 1, 2] & [1, V, 2] ==> [N, V, 2] + intersect_mins = np.maximum(pred_boxes[..., :2], true_boxes[..., :2]) + intersect_maxs = np.minimum(pred_boxes[..., 2:], true_boxes[..., 2:]) + intersect_wh = np.maximum(intersect_maxs - intersect_mins, 0.) + + # shape: [N, V] + intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1] + # shape: [N, 1, 2] + pred_box_wh = pred_boxes[..., 2:] - pred_boxes[..., :2] + # shape: [N, 1] + pred_box_area = pred_box_wh[..., 0] * pred_box_wh[..., 1] + # [1, V, 2] + true_boxes_wh = true_boxes[..., 2:] - true_boxes[..., :2] + # [1, V] + true_boxes_area = true_boxes_wh[..., 0] * true_boxes_wh[..., 1] + + # shape: [N, V] + iou = intersect_area / (pred_box_area + true_boxes_area - intersect_area + 1e-10) + + return iou + + +def evaluate_on_cpu(y_pred, y_true, num_classes, calc_now=True, max_boxes=50, score_thresh=0.5, iou_thresh=0.5): + ''' + Given y_pred and y_true of a batch of data, get the recall and precision of the current batch. + ''' + + num_images = y_true[0].shape[0] + true_labels_dict = {i: 0 for i in range(num_classes)} # {class: count} + pred_labels_dict = {i: 0 for i in range(num_classes)} + true_positive_dict = {i: 0 for i in range(num_classes)} + + for i in range(num_images): + true_labels_list, true_boxes_list = [], [] + for j in range(3): # three feature maps + # shape: [13, 13, 3, 80] + true_probs_temp = y_true[j][i][..., 5:-1] + # shape: [13, 13, 3, 4] (x_center, y_center, w, h) + true_boxes_temp = y_true[j][i][..., 0:4] + + # [13, 13, 3] + object_mask = true_probs_temp.sum(axis=-1) > 0 + + # [V, 3] V: Ground truth number of the current image + true_probs_temp = true_probs_temp[object_mask] + # [V, 4] + true_boxes_temp = true_boxes_temp[object_mask] + + # [V], labels + true_labels_list += np.argmax(true_probs_temp, axis=-1).tolist() + # [V, 4] (x_center, y_center, w, h) + true_boxes_list += true_boxes_temp.tolist() + + if len(true_labels_list) != 0: + for cls, count in Counter(true_labels_list).items(): + true_labels_dict[cls] += count + + # [V, 4] (xmin, ymin, xmax, ymax) + true_boxes = np.array(true_boxes_list) + box_centers, box_sizes = true_boxes[:, 0:2], true_boxes[:, 2:4] + true_boxes[:, 0:2] = box_centers - box_sizes / 2. + true_boxes[:, 2:4] = true_boxes[:, 0:2] + box_sizes + + # [1, xxx, 4] + pred_boxes = y_pred[0][i:i + 1] + pred_confs = y_pred[1][i:i + 1] + pred_probs = y_pred[2][i:i + 1] + + # pred_boxes: [N, 4] + # pred_confs: [N] + # pred_labels: [N] + # N: Detected box number of the current image + pred_boxes, pred_confs, pred_labels = cpu_nms(pred_boxes, pred_confs * pred_probs, num_classes, + max_boxes=max_boxes, score_thresh=score_thresh, iou_thresh=iou_thresh) + + # len: N + pred_labels_list = [] if pred_labels is None else pred_labels.tolist() + if pred_labels_list == []: + continue + + # calc iou + # [N, V] + iou_matrix = calc_iou(pred_boxes, true_boxes) + # [N] + max_iou_idx = np.argmax(iou_matrix, axis=-1) + + correct_idx = [] + correct_conf = [] + for k in range(max_iou_idx.shape[0]): + pred_labels_dict[pred_labels_list[k]] += 1 + match_idx = max_iou_idx[k] # V level + if iou_matrix[k, match_idx] > iou_thresh and true_labels_list[match_idx] == pred_labels_list[k]: + if match_idx not in correct_idx: + correct_idx.append(match_idx) + correct_conf.append(pred_confs[k]) + else: + same_idx = correct_idx.index(match_idx) + if pred_confs[k] > correct_conf[same_idx]: + correct_idx.pop(same_idx) + correct_conf.pop(same_idx) + correct_idx.append(match_idx) + correct_conf.append(pred_confs[k]) + + for t in correct_idx: + true_positive_dict[true_labels_list[t]] += 1 + + if calc_now: + # avoid divided by 0 + recall = sum(true_positive_dict.values()) / (sum(true_labels_dict.values()) + 1e-6) + precision = sum(true_positive_dict.values()) / (sum(pred_labels_dict.values()) + 1e-6) + + return recall, precision + else: + return true_positive_dict, true_labels_dict, pred_labels_dict + + +def evaluate_on_gpu(sess, gpu_nms_op, pred_boxes_flag, pred_scores_flag, y_pred, y_true, num_classes, iou_thresh=0.5, calc_now=True): + ''' + Given y_pred and y_true of a batch of data, get the recall and precision of the current batch. + This function will perform gpu operation on the GPU. + ''' + + num_images = y_true[0].shape[0] + true_labels_dict = {i: 0 for i in range(num_classes)} # {class: count} + pred_labels_dict = {i: 0 for i in range(num_classes)} + true_positive_dict = {i: 0 for i in range(num_classes)} + + for i in range(num_images): + true_labels_list, true_boxes_list = [], [] + for j in range(3): # three feature maps + # shape: [13, 13, 3, 80] + true_probs_temp = y_true[j][i][..., 5:-1] + # shape: [13, 13, 3, 4] (x_center, y_center, w, h) + true_boxes_temp = y_true[j][i][..., 0:4] + + # [13, 13, 3] + object_mask = true_probs_temp.sum(axis=-1) > 0 + + # [V, 80] V: Ground truth number of the current image + true_probs_temp = true_probs_temp[object_mask] + # [V, 4] + true_boxes_temp = true_boxes_temp[object_mask] + + # [V], labels, each from 0 to 79 + true_labels_list += np.argmax(true_probs_temp, axis=-1).tolist() + # [V, 4] (x_center, y_center, w, h) + true_boxes_list += true_boxes_temp.tolist() + + if len(true_labels_list) != 0: + for cls, count in Counter(true_labels_list).items(): + true_labels_dict[cls] += count + + # [V, 4] (xmin, ymin, xmax, ymax) + true_boxes = np.array(true_boxes_list) + box_centers, box_sizes = true_boxes[:, 0:2], true_boxes[:, 2:4] + true_boxes[:, 0:2] = box_centers - box_sizes / 2. + true_boxes[:, 2:4] = true_boxes[:, 0:2] + box_sizes + + # [1, xxx, 4] + pred_boxes = y_pred[0][i:i + 1] + pred_confs = y_pred[1][i:i + 1] + pred_probs = y_pred[2][i:i + 1] + + # pred_boxes: [N, 4] + # pred_confs: [N] + # pred_labels: [N] + # N: Detected box number of the current image + pred_boxes, pred_confs, pred_labels = sess.run(gpu_nms_op, + feed_dict={pred_boxes_flag: pred_boxes, + pred_scores_flag: pred_confs * pred_probs}) + # len: N + pred_labels_list = [] if pred_labels is None else pred_labels.tolist() + if pred_labels_list == []: + continue + + # calc iou + # [N, V] + iou_matrix = calc_iou(pred_boxes, true_boxes) + # [N] + max_iou_idx = np.argmax(iou_matrix, axis=-1) + + correct_idx = [] + correct_conf = [] + for k in range(max_iou_idx.shape[0]): + pred_labels_dict[pred_labels_list[k]] += 1 + match_idx = max_iou_idx[k] # V level + if iou_matrix[k, match_idx] > iou_thresh and true_labels_list[match_idx] == pred_labels_list[k]: + if match_idx not in correct_idx: + correct_idx.append(match_idx) + correct_conf.append(pred_confs[k]) + else: + same_idx = correct_idx.index(match_idx) + if pred_confs[k] > correct_conf[same_idx]: + correct_idx.pop(same_idx) + correct_conf.pop(same_idx) + correct_idx.append(match_idx) + correct_conf.append(pred_confs[k]) + + for t in correct_idx: + true_positive_dict[true_labels_list[t]] += 1 + + if calc_now: + # avoid divided by 0 + recall = sum(true_positive_dict.values()) / (sum(true_labels_dict.values()) + 1e-6) + precision = sum(true_positive_dict.values()) / (sum(pred_labels_dict.values()) + 1e-6) + + return recall, precision + else: + return true_positive_dict, true_labels_dict, pred_labels_dict + + +def get_preds_gpu(sess, gpu_nms_op, pred_boxes_flag, pred_scores_flag, image_ids, y_pred): + ''' + Given the y_pred of an input image, get the predicted bbox and label info. + return: + pred_content: 2d list. + ''' + image_id = image_ids[0] + + # keep the first dimension 1 + pred_boxes = y_pred[0][0:1] + pred_confs = y_pred[1][0:1] + pred_probs = y_pred[2][0:1] + + boxes, scores, labels = sess.run(gpu_nms_op, + feed_dict={pred_boxes_flag: pred_boxes, + pred_scores_flag: pred_confs * pred_probs}) + + pred_content = [] + for i in range(len(labels)): + x_min, y_min, x_max, y_max = boxes[i] + score = scores[i] + label = labels[i] + pred_content.append([image_id, x_min, y_min, x_max, y_max, score, label]) + + return pred_content + + +gt_dict = {} # key: img_id, value: gt object list +def parse_gt_rec(gt_filename, target_img_size, letterbox_resize=True): + ''' + parse and re-organize the gt info. + return: + gt_dict: dict. Each key is a img_id, the value is the gt bboxes in the corresponding img. + ''' + + global gt_dict + + if not gt_dict: + new_width, new_height = target_img_size + with open(gt_filename, 'r') as f: + for line in f: + img_id, pic_path, boxes, labels, ori_width, ori_height = parse_line(line) + + objects = [] + for i in range(len(labels)): + x_min, y_min, x_max, y_max = boxes[i] + label = labels[i] + + if letterbox_resize: + resize_ratio = min(new_width / ori_width, new_height / ori_height) + + resize_w = int(resize_ratio * ori_width) + resize_h = int(resize_ratio * ori_height) + + dw = int((new_width - resize_w) / 2) + dh = int((new_height - resize_h) / 2) + + objects.append([x_min * resize_ratio + dw, + y_min * resize_ratio + dh, + x_max * resize_ratio + dw, + y_max * resize_ratio + dh, + label]) + else: + objects.append([x_min * new_width / ori_width, + y_min * new_height / ori_height, + x_max * new_width / ori_width, + y_max * new_height / ori_height, + label]) + gt_dict[img_id] = objects + return gt_dict + + +# The following two functions are modified from FAIR's Detectron repo to calculate mAP: +# https://github.com/facebookresearch/Detectron/blob/master/detectron/datasets/voc_eval.py +def voc_ap(rec, prec, use_07_metric=False): + """Compute VOC AP given precision and recall. If use_07_metric is true, uses + the VOC 07 11-point method (default:False). + """ + if use_07_metric: + # 11 point metric + ap = 0. + for t in np.arange(0., 1.1, 0.1): + if np.sum(rec >= t) == 0: + p = 0 + else: + p = np.max(prec[rec >= t]) + ap = ap + p / 11. + else: + # correct AP calculation + # first append sentinel values at the end + mrec = np.concatenate(([0.], rec, [1.])) + mpre = np.concatenate(([0.], prec, [0.])) + + # compute the precision envelope + for i in range(mpre.size - 1, 0, -1): + mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) + + # to calculate area under PR curve, look for points + # where X axis (recall) changes value + i = np.where(mrec[1:] != mrec[:-1])[0] + + # and sum (\Delta recall) * prec + ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) + return ap + + +def voc_eval(gt_dict, val_preds, classidx, iou_thres=0.5, use_07_metric=False): + ''' + Top level function that does the PASCAL VOC evaluation. + ''' + # 1.obtain gt: extract all gt objects for this class + class_recs = {} + npos = 0 + for img_id in gt_dict: + R = [obj for obj in gt_dict[img_id] if obj[-1] == classidx] + bbox = np.array([x[:4] for x in R]) + det = [False] * len(R) + npos += len(R) + class_recs[img_id] = {'bbox': bbox, 'det': det} + + # 2. obtain pred results + pred = [x for x in val_preds if x[-1] == classidx] + img_ids = [x[0] for x in pred] + confidence = np.array([x[-2] for x in pred]) + BB = np.array([[x[1], x[2], x[3], x[4]] for x in pred]) + + # 3. sort by confidence + sorted_ind = np.argsort(-confidence) + try: + BB = BB[sorted_ind, :] + except: + print('no box, ignore') + return 1e-6, 1e-6, 0, 0, 0 + img_ids = [img_ids[x] for x in sorted_ind] + + # 4. mark TPs and FPs + nd = len(img_ids) + tp = np.zeros(nd) + fp = np.zeros(nd) + + for d in range(nd): + # all the gt info in some image + R = class_recs[img_ids[d]] + bb = BB[d, :] + ovmax = -np.Inf + BBGT = R['bbox'] + + if BBGT.size > 0: + # calc iou + # intersection + ixmin = np.maximum(BBGT[:, 0], bb[0]) + iymin = np.maximum(BBGT[:, 1], bb[1]) + ixmax = np.minimum(BBGT[:, 2], bb[2]) + iymax = np.minimum(BBGT[:, 3], bb[3]) + iw = np.maximum(ixmax - ixmin + 1., 0.) + ih = np.maximum(iymax - iymin + 1., 0.) + inters = iw * ih + + # union + uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) + (BBGT[:, 2] - BBGT[:, 0] + 1.) * ( + BBGT[:, 3] - BBGT[:, 1] + 1.) - inters) + + overlaps = inters / uni + ovmax = np.max(overlaps) + jmax = np.argmax(overlaps) + + if ovmax > iou_thres: + # gt not matched yet + if not R['det'][jmax]: + tp[d] = 1. + R['det'][jmax] = 1 + else: + fp[d] = 1. + else: + fp[d] = 1. + + # compute precision recall + fp = np.cumsum(fp) + tp = np.cumsum(tp) + rec = tp / float(npos) + # avoid divide by zero in case the first detection matches a difficult + # ground truth + prec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps) + ap = voc_ap(rec, prec, use_07_metric) + + # return rec, prec, ap + return npos, nd, tp[-1] / float(npos), tp[-1] / float(nd), ap diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/layer_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/layer_utils.py new file mode 100644 index 0000000..1b63eb7 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/layer_utils.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import numpy as np +import tensorflow as tf +slim = tf.contrib.slim + +def conv2d(inputs, filters, kernel_size, strides=1): + def _fixed_padding(inputs, kernel_size): + pad_total = kernel_size - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + + padded_inputs = tf.pad(inputs, [[0, 0], [pad_beg, pad_end], + [pad_beg, pad_end], [0, 0]], mode='CONSTANT') + return padded_inputs + if strides > 1: + inputs = _fixed_padding(inputs, kernel_size) + inputs = slim.conv2d(inputs, filters, kernel_size, stride=strides, + padding=('SAME' if strides == 1 else 'VALID')) + return inputs + +def darknet53_body(inputs): + def res_block(inputs, filters): + shortcut = inputs + net = conv2d(inputs, filters * 1, 1) + net = conv2d(net, filters * 2, 3) + + net = net + shortcut + + return net + + # first two conv2d layers + net = conv2d(inputs, 32, 3, strides=1) + net = conv2d(net, 64, 3, strides=2) + + # res_block * 1 + net = res_block(net, 32) + + net = conv2d(net, 128, 3, strides=2) + + # res_block * 2 + for i in range(2): + net = res_block(net, 64) + + net = conv2d(net, 256, 3, strides=2) + + # res_block * 8 + for i in range(8): + net = res_block(net, 128) + + route_1 = net + net = conv2d(net, 512, 3, strides=2) + + # res_block * 8 + for i in range(8): + net = res_block(net, 256) + + route_2 = net + net = conv2d(net, 1024, 3, strides=2) + + # res_block * 4 + for i in range(4): + net = res_block(net, 512) + route_3 = net + + return route_1, route_2, route_3 + + +def yolo_block(inputs, filters): + net = conv2d(inputs, filters * 1, 1) + net = conv2d(net, filters * 2, 3) + net = conv2d(net, filters * 1, 1) + net = conv2d(net, filters * 2, 3) + net = conv2d(net, filters * 1, 1) + route = net + net = conv2d(net, filters * 2, 3) + return route, net + + +def upsample_layer(inputs, out_shape): + new_height, new_width = out_shape[1], out_shape[2] + # NOTE: here height is the first + # TODO: Do we need to set `align_corners` as True? + inputs = tf.image.resize_nearest_neighbor(inputs, (new_height, new_width), name='upsampled') + return inputs + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/misc_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/misc_utils.py new file mode 100644 index 0000000..d3f633f --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/misc_utils.py @@ -0,0 +1,165 @@ +# coding: utf-8 + +import numpy as np +import tensorflow as tf +import random + +from tensorflow.core.framework import summary_pb2 + + +def make_summary(name, val): + return summary_pb2.Summary(value=[summary_pb2.Summary.Value(tag=name, simple_value=val)]) + + +class AverageMeter(object): + def __init__(self): + self.reset() + + def reset(self): + self.val = 0 + self.average = 0 + self.sum = 0 + self.count = 0 + + def update(self, val, n=1): + self.val = val + self.sum += val * n + self.count += n + self.average = self.sum / float(self.count) + + +def parse_anchors(anchor_path): + ''' + parse anchors. + returned data: shape [N, 2], dtype float32 + ''' + anchors = np.reshape(np.asarray(open(anchor_path, 'r').read().split(','), np.float32), [-1, 2]) + return anchors + + +def read_class_names(class_name_path): + names = {} + with open(class_name_path, 'r') as data: + for ID, name in enumerate(data): + names[ID] = name.strip('\n') + return names + + +def shuffle_and_overwrite(file_name): + content = open(file_name, 'r').readlines() + random.shuffle(content) + with open(file_name, 'w') as f: + for line in content: + f.write(line) + + +def update_dict(ori_dict, new_dict): + if not ori_dict: + return new_dict + for key in ori_dict: + ori_dict[key] += new_dict[key] + return ori_dict + + +def list_add(ori_list, new_list): + for i in range(len(ori_list)): + ori_list[i] += new_list[i] + return ori_list + + +def load_weights(var_list, weights_file): + """ + Loads and converts pre-trained weights. + param: + var_list: list of network variables. + weights_file: name of the binary file. + """ + with open(weights_file, "rb") as fp: + np.fromfile(fp, dtype=np.int32, count=5) + weights = np.fromfile(fp, dtype=np.float32) + + ptr = 0 + i = 0 + assign_ops = [] + try: + while i < len(var_list) - 1: + var1 = var_list[i] + var2 = var_list[i + 1] + # do something only if we process conv layer + if 'Conv' in var1.name.split('/')[-2]: + # check type of next layer + if 'BatchNorm' in var2.name.split('/')[-2]: + # load batch norm params + gamma, beta, mean, var = var_list[i + 1:i + 5] + batch_norm_vars = [beta, gamma, mean, var] + for var in batch_norm_vars: + shape = var.shape.as_list() + num_params = np.prod(shape) + var_weights = weights[ptr:ptr + num_params].reshape(shape) + ptr += num_params + assign_ops.append(tf.assign(var, var_weights, validate_shape=True)) + # we move the pointer by 4, because we loaded 4 variables + i += 4 + elif 'Conv' in var2.name.split('/')[-2]: + # load biases + bias = var2 + bias_shape = bias.shape.as_list() + bias_params = np.prod(bias_shape) + bias_weights = weights[ptr:ptr + + bias_params].reshape(bias_shape) + ptr += bias_params + assign_ops.append(tf.assign(bias, bias_weights, validate_shape=True)) + # we loaded 1 variable + i += 1 + # we can load weights of conv layer + shape = var1.shape.as_list() + num_params = np.prod(shape) + + var_weights = weights[ptr:ptr + num_params].reshape( + (shape[3], shape[2], shape[0], shape[1])) + # remember to transpose to column-major + var_weights = np.transpose(var_weights, (2, 3, 1, 0)) + ptr += num_params + assign_ops.append( + tf.assign(var1, var_weights, validate_shape=True)) + i += 1 + except: + pass + return assign_ops + + +def config_learning_rate(args, global_step): + if args.lr_type == 'exponential': + lr_tmp = tf.train.exponential_decay(args.learning_rate_init, global_step, args.lr_decay_freq, + args.lr_decay_factor, staircase=True, name='exponential_learning_rate') + return tf.maximum(lr_tmp, args.lr_lower_bound) + elif args.lr_type == 'cosine_decay': + train_steps = (args.total_epoches - float(args.use_warm_up) * args.warm_up_epoch) * args.train_batch_num + return args.lr_lower_bound + 0.5 * (args.learning_rate_init - args.lr_lower_bound) * \ + (1 + tf.cos(global_step / train_steps * np.pi)) + elif args.lr_type == 'cosine_decay_restart': + return tf.train.cosine_decay_restarts(args.learning_rate_init, global_step, + args.lr_decay_freq, t_mul=2.0, m_mul=1.0, + name='cosine_decay_learning_rate_restart') + elif args.lr_type == 'fixed': + return tf.convert_to_tensor(args.learning_rate_init, name='fixed_learning_rate') + elif args.lr_type == 'piecewise': + return tf.train.piecewise_constant(global_step, boundaries=args.pw_boundaries, values=args.pw_values, + name='piecewise_learning_rate') + else: + raise ValueError('Unsupported learning rate type!') + + +def config_optimizer(optimizer_name, learning_rate, decay=0.9, momentum=0.9): + if optimizer_name == 'momentum': + return tf.train.MomentumOptimizer(learning_rate, momentum=momentum, use_nesterov=False) + elif optimizer_name == 'nesterov': + return tf.train.MomentumOptimizer(learning_rate, momentum=momentum, use_nesterov=True) + elif optimizer_name == 'rmsprop': + return tf.train.RMSPropOptimizer(learning_rate, decay=decay, momentum=momentum) + elif optimizer_name == 'adam': + return tf.train.AdamOptimizer(learning_rate) + elif optimizer_name == 'sgd': + return tf.train.GradientDescentOptimizer(learning_rate) + else: + raise ValueError('Unsupported optimizer type!') \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/nms_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/nms_utils.py new file mode 100644 index 0000000..2375f36 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/nms_utils.py @@ -0,0 +1,123 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import numpy as np +import tensorflow as tf + +def gpu_nms(boxes, scores, num_classes, max_boxes=50, score_thresh=0.5, nms_thresh=0.5): + """ + Perform NMS on GPU using TensorFlow. + + params: + boxes: tensor of shape [1, 10647, 4] # 10647=(13*13+26*26+52*52)*3, for input 416*416 image + scores: tensor of shape [1, 10647, num_classes], score=conf*prob + num_classes: total number of classes + max_boxes: integer, maximum number of predicted boxes you'd like, default is 50 + score_thresh: if [ highest class probability score < score_threshold] + then get rid of the corresponding box + nms_thresh: real value, "intersection over union" threshold used for NMS filtering + """ + + boxes_list, label_list, score_list = [], [], [] + max_boxes = tf.constant(max_boxes, dtype='int32') + + # since we do nms for single image, then reshape it + boxes = tf.reshape(boxes, [-1, 4]) # '-1' means we don't konw the exact number of boxes + score = tf.reshape(scores, [-1, num_classes]) + + # Step 1: Create a filtering mask based on "box_class_scores" by using "threshold". + mask = tf.greater_equal(score, tf.constant(score_thresh)) + # Step 2: Do non_max_suppression for each class + for i in range(num_classes): + # Step 3: Apply the mask to scores, boxes and pick them out + filter_boxes = tf.boolean_mask(boxes, mask[:,i]) + filter_score = tf.boolean_mask(score[:,i], mask[:,i]) + nms_indices = tf.image.non_max_suppression(boxes=filter_boxes, + scores=filter_score, + max_output_size=max_boxes, + iou_threshold=nms_thresh, name='nms_indices') + label_list.append(tf.ones_like(tf.gather(filter_score, nms_indices), 'int32')*i) + boxes_list.append(tf.gather(filter_boxes, nms_indices)) + score_list.append(tf.gather(filter_score, nms_indices)) + + boxes = tf.concat(boxes_list, axis=0) + score = tf.concat(score_list, axis=0) + label = tf.concat(label_list, axis=0) + + return boxes, score, label + + +def py_nms(boxes, scores, max_boxes=50, iou_thresh=0.5): + """ + Pure Python NMS baseline. + + Arguments: boxes: shape of [-1, 4], the value of '-1' means that dont know the + exact number of boxes + scores: shape of [-1,] + max_boxes: representing the maximum of boxes to be selected by non_max_suppression + iou_thresh: representing iou_threshold for deciding to keep boxes + """ + assert boxes.shape[1] == 4 and len(scores.shape) == 1 + + x1 = boxes[:, 0] + y1 = boxes[:, 1] + x2 = boxes[:, 2] + y2 = boxes[:, 3] + + areas = (x2 - x1) * (y2 - y1) + order = scores.argsort()[::-1] + + keep = [] + while order.size > 0: + i = order[0] + keep.append(i) + xx1 = np.maximum(x1[i], x1[order[1:]]) + yy1 = np.maximum(y1[i], y1[order[1:]]) + xx2 = np.minimum(x2[i], x2[order[1:]]) + yy2 = np.minimum(y2[i], y2[order[1:]]) + + w = np.maximum(0.0, xx2 - xx1 + 1) + h = np.maximum(0.0, yy2 - yy1 + 1) + inter = w * h + ovr = inter / (areas[i] + areas[order[1:]] - inter) + + inds = np.where(ovr <= iou_thresh)[0] + order = order[inds + 1] + + return keep[:max_boxes] + + +def cpu_nms(boxes, scores, num_classes, max_boxes=50, score_thresh=0.5, iou_thresh=0.5): + """ + Perform NMS on CPU. + Arguments: + boxes: shape [1, 10647, 4] + scores: shape [1, 10647, num_classes] + """ + + boxes = boxes.reshape(-1, 4) + scores = scores.reshape(-1, num_classes) + # Picked bounding boxes + picked_boxes, picked_score, picked_label = [], [], [] + + for i in range(num_classes): + indices = np.where(scores[:,i] >= score_thresh) + filter_boxes = boxes[indices] + filter_scores = scores[:,i][indices] + if len(filter_boxes) == 0: + continue + # do non_max_suppression on the cpu + indices = py_nms(filter_boxes, filter_scores, + max_boxes=max_boxes, iou_thresh=iou_thresh) + picked_boxes.append(filter_boxes[indices]) + picked_score.append(filter_scores[indices]) + picked_label.append(np.ones(len(indices), dtype='int32')*i) + if len(picked_boxes) == 0: + return None, None, None + + boxes = np.concatenate(picked_boxes, axis=0) + score = np.concatenate(picked_score, axis=0) + label = np.concatenate(picked_label, axis=0) + + return boxes, score, label \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/plot_utils.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/plot_utils.py new file mode 100644 index 0000000..9f67c2e --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/utils/plot_utils.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import cv2 +import random + + +def get_color_table(class_num, seed=2): + random.seed(seed) + color_table = {} + for i in range(class_num): + color_table[i] = [random.randint(0, 255) for _ in range(3)] + return color_table + + +def plot_one_box(img, coord, label=None, color=None, line_thickness=None): + ''' + coord: [x_min, y_min, x_max, y_max] format coordinates. + img: img to plot on. + label: str. The label name. + color: int. color index. + line_thickness: int. rectangle line thickness. + ''' + tl = line_thickness or int(round(0.002 * max(img.shape[0:2]))) # line thickness + color = color or [random.randint(0, 255) for _ in range(3)] + c1, c2 = (int(coord[0]), int(coord[1])), (int(coord[2]), int(coord[3])) + cv2.rectangle(img, c1, c2, color, thickness=tl) + if label: + tf = max(tl - 1, 1) # font thickness + t_size = cv2.getTextSize(label, 0, fontScale=float(tl) / 3, thickness=tf)[0] + c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 + cv2.rectangle(img, c1, c2, color, -1) # filled + cv2.putText(img, label, (c1[0], c1[1] - 2), 0, float(tl) / 3, [0, 0, 0], thickness=tf, lineType=cv2.LINE_AA) + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/video_test.py b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/video_test.py new file mode 100644 index 0000000..7bab259 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/code/video_test.py @@ -0,0 +1,102 @@ +# coding: utf-8 + +from __future__ import division, print_function + +import tensorflow as tf +import numpy as np +import argparse +import cv2 +import time + +from utils.misc_utils import parse_anchors, read_class_names +from utils.nms_utils import gpu_nms +from utils.plot_utils import get_color_table, plot_one_box +from utils.data_aug import letterbox_resize + +from model import yolov3 + +parser = argparse.ArgumentParser(description="YOLO-V3 video test procedure.") +parser.add_argument("input_video", type=str, + help="The path of the input video.") +parser.add_argument("--anchor_path", type=str, default="./data/yolo_anchors.txt", + help="The path of the anchor txt file.") +parser.add_argument("--new_size", nargs='*', type=int, default=[416, 416], + help="Resize the input image with `new_size`, size format: [width, height]") +parser.add_argument("--letterbox_resize", type=lambda x: (str(x).lower() == 'true'), default=True, + help="Whether to use the letterbox resize.") +parser.add_argument("--class_name_path", type=str, default="./data/coco.names", + help="The path of the class names.") +parser.add_argument("--restore_path", type=str, default="./data/darknet_weights/yolov3.ckpt", + help="The path of the weights to restore.") +parser.add_argument("--save_video", type=lambda x: (str(x).lower() == 'true'), default=False, + help="Whether to save the video detection results.") +args = parser.parse_args() + +args.anchors = parse_anchors(args.anchor_path) +args.classes = read_class_names(args.class_name_path) +args.num_class = len(args.classes) + +color_table = get_color_table(args.num_class) + +vid = cv2.VideoCapture(args.input_video) +video_frame_cnt = int(vid.get(7)) +video_width = int(vid.get(3)) +video_height = int(vid.get(4)) +video_fps = int(vid.get(5)) + +if args.save_video: + fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') + videoWriter = cv2.VideoWriter('video_result.mp4', fourcc, video_fps, (video_width, video_height)) + +with tf.Session() as sess: + input_data = tf.placeholder(tf.float32, [1, args.new_size[1], args.new_size[0], 3], name='input_data') + yolo_model = yolov3(args.num_class, args.anchors) + with tf.variable_scope('yolov3'): + pred_feature_maps = yolo_model.forward(input_data, False) + pred_boxes, pred_confs, pred_probs = yolo_model.predict(pred_feature_maps) + + pred_scores = pred_confs * pred_probs + + boxes, scores, labels = gpu_nms(pred_boxes, pred_scores, args.num_class, max_boxes=200, score_thresh=0.3, nms_thresh=0.45) + + saver = tf.train.Saver() + saver.restore(sess, args.restore_path) + + for i in range(video_frame_cnt): + ret, img_ori = vid.read() + if args.letterbox_resize: + img, resize_ratio, dw, dh = letterbox_resize(img_ori, args.new_size[0], args.new_size[1]) + else: + height_ori, width_ori = img_ori.shape[:2] + img = cv2.resize(img_ori, tuple(args.new_size)) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = np.asarray(img, np.float32) + img = img[np.newaxis, :] / 255. + + start_time = time.time() + boxes_, scores_, labels_ = sess.run([boxes, scores, labels], feed_dict={input_data: img}) + end_time = time.time() + + # rescale the coordinates to the original image + if args.letterbox_resize: + boxes_[:, [0, 2]] = (boxes_[:, [0, 2]] - dw) / resize_ratio + boxes_[:, [1, 3]] = (boxes_[:, [1, 3]] - dh) / resize_ratio + else: + boxes_[:, [0, 2]] *= (width_ori/float(args.new_size[0])) + boxes_[:, [1, 3]] *= (height_ori/float(args.new_size[1])) + + + for i in range(len(boxes_)): + x0, y0, x1, y1 = boxes_[i] + plot_one_box(img_ori, [x0, y0, x1, y1], label=args.classes[labels_[i]] + ', {:.2f}%'.format(scores_[i] * 100), color=color_table[labels_[i]]) + cv2.putText(img_ori, '{:.2f}ms'.format((end_time - start_time) * 1000), (40, 40), 0, + fontScale=1, color=(0, 255, 0), thickness=2) + cv2.imshow('image', img_ori) + if args.save_video: + videoWriter.write(img_ori) + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + vid.release() + if args.save_video: + videoWriter.release() diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/hccl_sample.json b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/hccl_sample.json new file mode 100644 index 0000000..8c44f71 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} \ No newline at end of file diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/npu_set_env.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/npu_set_env.sh new file mode 100644 index 0000000..6654e67 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/config/npu_set_env.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# main env +if [ -d /usr/local/Ascend/nnae/latest ];then + + export LD_LIBRARY_PATH=/usr/local/:/usr/local/lib/:/usr/lib/:/usr/local/Ascend/nnae/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/Ascend/driver/tools/hccn_tool/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/nnae/latest/fwkacllib/python/site-packages/:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages + export PATH=$PATH:/usr/local/Ascend/nnae/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp +else + export LD_LIBRARY_PATH=/usr/local/lib/:/usr/lib/:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/lib64:/usr/local/Ascend/driver/lib64/common/:/usr/local/Ascend/driver/lib64/driver/:/usr/local/Ascend/add-ons/:/usr/local/mpirun4.0/lib + export PYTHONPATH=$PYTHONPATH:/usr/local/Ascend/tfplugin/latest/tfplugin/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:/usr/local/Ascend/ascend-toolkit/latest//fwkacllib/python/site-packages/:/usr/local/Ascend/ascend-toolkit/latest/tfplugin/python/site-packages:$projectDir + export PATH=$PATH:/usr/local/Ascend/ascend-toolkit/latest/fwkacllib/ccec_compiler/bin:/usr/local/mpirun4.0/bin + export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp/ + +fi + +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 +#export DUMP_GE_GRAPH=2 +#export DUMP_GRAPH_LEVEL=3 +#export PRINT_MODEL=1 +export SLOG_PRINT_TO_STDOUT=0 +export HCCL_CONNECT_TIMEOUT=600 + + +# system env +ulimit -c unlimited diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/eval.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/eval.sh new file mode 100644 index 0000000..650487d --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/eval.sh @@ -0,0 +1,53 @@ + +# setting main path +MAIN_PATH=$(dirname $(readlink -f $0)) +echo $MAIN_PATH + +DEVICE_NUM=$1 +ckpt_path=$2 + +#echo $1 +#echo $2 +# set env +export DDK_VERSION_FLAG=1.60.T49.0.B201 +export NEW_GE_FE_ID=1 +export GE_AICPU_FLAG=1 +export SOC_VERSION=Ascend910 + +export JOB_ID=10087 +export FUSION_TENSOR_SIZE=1000000000 + + +export RANK_ID=yolo +#echo "device_num is $DEVICE_NUM" +for((i=0;i<${DEVICE_NUM};i++)); +do + +export RANK_SIZE=$DEVICE_NUM +export DEVICE_ID=$i +export DEVICE_INDEX=$i + +#su HwHiAiUser -c "adc --host 0.0.0.0:22118 --log \"SetLogLevel(0)[debug]\" --device "$RANK_ID +cd ${MAIN_PATH}/../result +if [ x"${ckpt_path}" == x"" ];then + lastresult=$(ls -t | grep -E "Train*" | head -n 1) + RESTORE_PATH=${lastresult}/${i}/training/ + +else + lastresult=${ckpt_path} + RESTORE_PATH=${ckpt_path}/${i}/training/ + +fi +echo $RESTORE_PATH + python3.7 ${MAIN_PATH}/../code/eval.py \ +--save_json True \ +--score_thresh 0.0001 \ +--nms_thresh 0.55 \ +--max_boxes 100 \ +--restore_path $RESTORE_PATH \ +--max_test 10000 \ +--save_json_path eval_res_D$DEVICE_NUM.json > ${lastresult}/eval_$i.out 2>&1 + +done + + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/run.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/run.sh new file mode 100644 index 0000000..3d3550c --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/run.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +toolsPath=$3 +if [ -f /.dockerenv ];then + CLUSTER=$4 + MPIRUN_ALL_IP="$5" + export CLUSTER=${CLUSTER} +fi +currentDir=$(cd "$(dirname "$0")/.."; pwd) + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") +source ${currentDir}/config/npu_set_env.sh + +if [ x"$runmode" != x"evaluate" ];then + currtime=`date +%Y%m%d%H%M%S` + mkdir -p ${currentDir%train*}/train/result/tf_yolov3/training_job_${currtime}/ + train_job_dir=${currentDir%train*}/train/result/tf_yolov3/training_job_${currtime}/ + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${train_job_dir} &" +fi + + +# device 列表, 若无指定 device 根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +# get last device id in device_group, hw log in performance from the dir named first_device_id +device_group_str=`echo ${device_group} | sed 's/ //g'` +first_device_id=`echo ${device_group_str: 0:1}` + +argsFilePath=${currentDir}/code/args_${mode}.py + +#echo "argsFilePath is "${argsFilePath} +sed -i "0,/batch_size.*$/s//batch_size\ = ${batch_size}/g" ${argsFilePath} +sed -i "s/save_epoch.*$/save_epoch\ = ${save_epoch}/g" ${argsFilePath} +sed -i "s/total_epoches =.*$/total_epoches\ = ${total_epoches}/g" ${argsFilePath} +sed -i 's/\r//g' ${argsFilePath} + +if [ x"${CLUSTER}" == x"True" ];then + # ln hw log + ln -snf ${train_job_dir}/0/hw_yolov3.log ${train_job_dir} + this_ip=$(hostname -I |awk '{print $1}') + for ip in $MPIRUN_ALL_IP;do + if [ x"$ip" != x"$this_ip" ];then + scp $yamlPath root@$ip:$yamlPath + scp $argsFilePath root@$ip:$argsFilePath + fi + done + export PATH=$PATH:/usr/local/mpirun4.0/bin + mpirun -H ${mpirun_ip} \ + --bind-to none -map-by slot\ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic,virbr0,vethf40501b,docker_gwbridge,br-f42ac38052b4\ + --prefix /usr/local/mpirun4.0/ \ + ${currentDir}/scripts/train.sh 0 $rank_size $yamlPath $currtime ${toolsPath} ${CLUSTER} +elif [ $runmode == "train" ];then + ln -snf ${train_job_dir}/${first_device_id}/hw_yolov3.log ${train_job_dir} + rank_id=0 + for device_id in $device_group;do + #echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] start: train ${device_id} & " >> ${currentDir}/result/main.log + ${currentDir}/scripts/train.sh $device_id $rank_size $yamlPath $currtime ${toolsPath} $rank_id& + let rank_id++ + done +else + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] ${ckpt_path} &" + ln -snf ${train_job_dir}/${first_device_id}/hw_yolov3.log ${train_job_dir} + bash ${currentDir}/scripts/eval.sh ${rank_size} ${ckpt_path} +fi + +wait + +#echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] all train exit " >> ${currentDir}/result/main.log + diff --git a/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/train.sh b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/train.sh new file mode 100644 index 0000000..78af653 --- /dev/null +++ b/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/scripts/train.sh @@ -0,0 +1,115 @@ +#!/bin/bash +scriptDir=$(cd "$(dirname "$0")"; pwd) +mainDir=$(cd "$(dirname "$scriptDir")"; pwd) + +device_id=$1 +rank_size=$2 +yamlPath=$3 +currentDir=$(cd "$(dirname "$0")/.."; pwd) +currtime=$4 +toolsPath=$5 +export YAML_PATH=$3 +mkdir -p ${currentDir%train*}/train/result/tf_yolov3/training_job_${currtime}/ +export train_job_dir=${currentDir%train*}/train/result/tf_yolov3/training_job_${currtime}/ + + + +# 从 yaml 获取配置 +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlPath} "tensorflow_config") + + +source ${currentDir}/config/npu_set_env.sh +# 声明变量 +export REMARK_LOG_FILE=hw_yolov3.log # 打点日志文件名称, 必须hw_后跟模型名称小写 +# 添加日志打点模块路径 +benchmark_log_path=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils +export PYTHONPATH=$PYTHONPATH:${benchmark_log_path} + +# user env +export HCCL_CONNECT_TIMEOUT=600 +export RANK_TABLE_FILE=${currentDir}/config/${rank_size}p.json +export RANK_SIZE=${rank_size} +export SLOG_PRINT_TO_STDOUT=0 +export DEVICE_ID=${device_id} +export DEVICE_INDEX=${DEVICE_INDEX} +export DEVICE_INDEX=$RANK_ID +export JOB_ID=123678 +export FUSION_TENSOR_SIZE=1000000000 + + +if [ ${profiling_mode} == True ]; +then + export PROFILING_MODE=true +else + export PROFILING_MODE=false +fi + +if [ ${aicpu_profiling_mode} == True ]; +then + export AICPU_PROFILING_MODE=true +else + export AICPU_PROFILING_MODE=false +fi + +export PROFILING_OPTIONS=${profiling_options} +export FP_POINT=${fp_point} +export BP_POINT=${bp_point} + +cd ${train_job_dir} +curd_dir=${currentDir%atlas_benchmark-master*}/atlas_benchmark-master/utils/atlasboost +export PYTHONPATH=$PYTHONPATH:${curd_dir} + +if [ x"$6" != x"True" ];then + rank_id=$6 + export RANK_ID=$6 +else + device_id_mo=$(python3.7 -c "import src.tensorflow.mpi_ops as atlasboost;atlasboost.init(); \ + device_id = atlasboost.local_rank();cluster_device_id = str(device_id); \ + atlasboost.set_device_id(device_id);print(atlasboost.rank())") + device_id_mo=`echo $device_id_mo` + rank_id=${device_id_mo##* } + export RANK_ID=${rank_id} + device=${device_id_mo##*deviceid = } + device_id=${device%% phyid=*} + export DEVICE_ID=${device_id} + hccljson=${train_job_dir}/*.json + cp ${hccljson} ${currentDir}/config/${rank_size}p.json +fi + +#mkdir exec path +mkdir -p ${train_job_dir}/${device_id} +cd ${train_job_dir}/${device_id} + +num_cpus=$(getconf _NPROCESSORS_ONLN) +num_cpus_per_device=$((num_cpus/8)) +PID_START=$((num_cpus_per_device*device_id)) +PID_END=$((num_cpus_per_device*device_id+num_cpus_per_device-1)) + +startTime=`date +%Y%m%d-%H:%M:%S` +startTime_s=`date +%s` + +#KERNEL_NUM=20 +#PID_START=$((KERNEL_NUM * DEVICE_ID)) +#PID_END=$((PID_START + KERNEL_NUM - 1)) + +#sleep 5 +taskset -c $PID_START-$PID_END python3.7 $mainDir/code/train.py --mode $mode > ${train_job_dir}/train_${device_id}.log 2>&1 + +if [ $? -eq 0 ] ;then + echo ":::ABK 1.0.0 yolov3 train success" + echo ":::ABK 1.0.0 yolov3 train success" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 yolov3 train success" >> ${train_job_dir}/${device_id}/hw_yolov3.log +else + echo ":::ABK 1.0.0 yolov3 train failed" + echo ":::ABK 1.0.0 yolov3 train failed" >> ${train_job_dir}/train_${device_id}.log + echo ":::ABK 1.0.0 yolov3 train failed" >> ${train_job_dir}/${device_id}/hw_yolov3.log +fi + +endTime=`date +%Y%m%d-%H:%M:%S` +endTime_s=`date +%s` +sumTime=$[ $endTime_s - $startTime_s ] +hour=$(( $sumTime/3600 )) +min=$(( ($sumTime-${hour}*3600)/60 )) +sec=$(( $sumTime-${hour}*3600-${min}*60 )) +echo ${hour}:${min}:${sec} +echo ":::ABK 1.0.0 yolov3 train total time ${hour}:${min}:${sec}" >> ${train_job_dir}/${device_id}/hw_yolov3.log diff --git a/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/Dockerfile b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/Dockerfile new file mode 100644 index 0000000..ba9ff42 --- /dev/null +++ b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/Dockerfile @@ -0,0 +1,135 @@ +# VERSION: 20.0.0.RC1 +# 说明:提前下载好昇腾cmake包和OpenMPI软件包在在目录下 +FROM ubuntu:18.04 + +ENV http_proxy="http://ptaishanpublic2:Huawei123@90.90.64.10:8080" +ENV https_proxy="http://ptaishanpublic2:Huawei123@90.90.64.10:8080" +ENV no_proxy=127.0.0.1,.huawei.com,localhost,local,.local + + +ARG TF_PKG=tensorflow-1.15.0-cp37-cp37m-linux_aarch64.whl +ARG HOST_ASCEND_BASE=/usr/local/Ascend +ARG NNAE_PATH=/usr/local/Ascend/nnae/latest +ARG TF_PLUGIN_PATH=/usr/local/Ascend/tfplugin/latest +ARG INSTALL_ASCEND_PKGS_SH=install_ascend_pkgs.sh +ARG PREBUILD_SH=prebuild.sh +ARG POSTBUILD_SH=postbuild.sh +WORKDIR /tmp +COPY . ./ +COPY sources.list /etc/apt/ +COPY pip.conf /root/.pip/ + +# 触发prebuild.sh +RUN bash -c "test -f $PREBUILD_SH && bash $PREBUILD_SH || true" + + +# 系统包 +RUN apt update +RUN apt install --no-install-recommends python3.7 python3.7-dev -y +RUN apt install --no-install-recommends curl g++ gcc pkg-config unzip -y +RUN apt install --no-install-recommends libblas3 liblapack3 liblapack-dev libblas-dev gfortran libhdf5-dev libffi-dev libssl-dev\ + libicu60 libxml2 -y +# benchmark系统依赖包 +RUN apt-get update +RUN apt-get install -y openssh-client +RUN apt-get install -y net-tools +RUN apt-get install -y openssh-server +RUN apt-get install -y inetutils-ping +RUN apt-get install -y psmisc +RUN apt-get install -y iproute2 +RUN apt-get install -y wget +RUN apt-get install -y vim + +# pip3.7 +RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ + cd /tmp && \ + apt-get download python3-distutils && \ + dpkg-deb -x python3-distutils_*.deb / && \ + rm python3-distutils_*.deb && \ + cd - && \ + python3.7 get-pip.py && \ + rm get-pip.py + +# HwHiAiUser +RUN groupadd HwHiAiUser && \ + useradd -g HwHiAiUser -m -d /home/HwHiAiUser HwHiAiUser + +# python包 +RUN pip3.7 install numpy && \ + pip3.7 install decorator && \ + pip3.7 install attrs && \ + pip3.7 install sympy==1.4 && \ + pip3.7 install cffi==1.12.3 && \ + pip3.7 install pyyaml && \ + pip3.7 install wheel && \ + pip3.7 install pathlib2 && \ + pip3.7 install grpcio && \ + pip3.7 install grpcio-tools && \ + pip3.7 install protobuf && \ + pip3.7 install scipy && \ + pip3.7 install Pillow==5.3.0 && \ + pip3 install torchvision --no-deps && \ + pip3.7 install requests + +# Ascend包 +RUN bash $INSTALL_ASCEND_PKGS_SH + +# 安装Cmake +RUN tar -zxvf cmake-3.18.0.tar.gz +WORKDIR cmake-3.18.0 +RUN mkdir -p /usr/local/cmake-3.18.0 +RUN ./configure --prefix=/usr/local/cmake-3.18.0 +RUN make && make install + +# 安装OpenMPI开源库 +WORKDIR /tmp + +RUN tar -jxvf openmpi-4.0.2.tar.bz2 +WORKDIR openmpi-4.0.2 +RUN mkdir -p /usr/local/mpirun4.0.2 +RUN ./configure --prefix=/usr/local/mpirun4.0.2 +RUN make && make install + +WORKDIR /tmp + +# TF安装 +ENV LD_LIBRARY_PATH=\ +/usr/lib/aarch64-linux-gnu/hdf5/serial:\ +$HOST_ASCEND_BASE/add-ons:\ +$NNAE_PATH/fwkacllib/lib64:\ +$HOST_ASCEND_BASE/driver/lib64/common:\ +$HOST_ASCEND_BASE/driver/lib64/driver:$LD_LIBRARY_PATH + +RUN pip3.7 install $TF_PKG + +# 环境变量 +ENV GLOG_v=2 +ENV TBE_IMPL_PATH=$NNAE_PATH/opp/op_impl/built-in/ai_core/tbe +ENV TF_PLUGIN_PKG=$TF_PLUGIN_PATH/tfplugin/python/site-packages +ENV FWK_PYTHON_PATH=$NNAE_PATH/fwkacllib/python/site-packages +ENV PATH=$NNAE_PATH/fwkacllib/ccec_compiler/bin:$PATH +ENV ASCEND_OPP_PATH=$NNAE_PATH/opp +ENV PYTHONPATH=\ +$FWK_PYTHON_PATH:\ +$FWK_PYTHON_PATH/auto_tune.egg:\ +$FWK_PYTHON_PATH/schedule_search.egg:\ +$TF_PLUGIN_PKG:\ +$TBE_IMPL_PATH:\ +$PYTHONPATH +ENV OPENMPI=/usr/local/mpirun4.0.2/ +ENV LD_LIBRARY_PATH=$OPENMPI/lib/ +ENV PATH=$OPENMPI/bin:$PATH + +# 免密登录 +RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && \ + sed -i 's/PermitEmptyPasswords yes/PermitEmptyPasswords no /' /etc/ssh/sshd_config && \ + sed -i 's/PermitRootLogin without-password/PermitRootLogin yes /' /etc/ssh/sshd_config && \ + echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \ + echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config && \ + echo "root:1234" | chpasswd +CMD [ "sh", "-c", "sudo service ssh start; bash"] + + +# 触发postbuild.sh +RUN bash -c "test -f $POSTBUILD_SH && bash $POSTBUILD_SH || true" && \ + rm $POSTBUILD_SH \ No newline at end of file diff --git a/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/install_ascend_pkgs.sh b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/install_ascend_pkgs.sh new file mode 100644 index 0000000..8f194ea --- /dev/null +++ b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/install_ascend_pkgs.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +#-------------------------------------------------------------------------------- +# VERSION: 20.0.0.RC1 +# 请在此处使用使用bash语法编写脚本代码,安装昇腾软件包 +# +# 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 +#-------------------------------------------------------------------------------- + +ASCEND_NNAE=Ascend-cann-nnae_20.1.0.B030_linux-aarch64.run +ASCEND_TFPLUGIN=Ascend-fwk-tfplugin_20.1.0.B030_linux-aarch64.run + +# 构建之前把host上的/etc/ascend_install.info拷贝一份到当前目录 +cp ascend_install.info /etc/ +# 构建之前把host的/usr/local/Ascend/driver/version.info拷贝一份到当前目录 +mkdir -p /usr/local/Ascend/driver/ +cp version.info /usr/local/Ascend/driver/ +# Ascend-NNAE-20.0.0.B001-arm64-linux_gcc7.3.0.run +chmod +x ${ASCEND_NNAE} +./${ASCEND_NNAE} --install-path=/usr/local/Ascend/ --install --quiet +# Ascend-TFPlugin-20.0.0.B001-arm64-linux_gcc7.3.0.run +chmod +x ${ASCEND_TFPLUGIN} +./${ASCEND_TFPLUGIN} --install-path=/usr/local/Ascend/ --install --quiet + +# 只为了安装nnae包,所以需要清理,容器启动时通过ascend docker挂载进来 +rm -f version.info +rm -rf /usr/local/Ascend/driver/ \ No newline at end of file diff --git a/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/postbuild.sh b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/postbuild.sh new file mode 100644 index 0000000..68da470 --- /dev/null +++ b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/postbuild.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +#-------------------------------------------------------------------------------- +# VERSION: 20.0.0.RC1 +# 请在此处使用使用bash语法编写脚本代码,清除不需要保留在容器中的安装包、脚本、代理配置等 +# 本脚本将会在正式构建过程结束后被执行 +# +# 注:本脚本运行结束后会被自动清除,不会残留在镜像中;脚本所在位置和Working Dir位置为/tmp +#-------------------------------------------------------------------------------- +rm -f ascend_install.info +rm -f prebuild.sh +rm -f install_ascend_pkgs.sh +rm -f Dockerfile* +rm -f cmake* +rm -f openmpi* +rm -f Ascend-cann-nnae_20.1.0.B030_linux-aarch64.run +rm -f Ascend-fwk-tfplugin_20.1.0.B030_linux-aarch64.run +rm -f tensorflow-1.15.0-cp37-cp37m-linux_aarch64.whl +# rm -f /etc/apt/apt.conf.d/80proxy +tee /etc/resolv.conf <<- EOF +# This file is managed by man:systemd-resolved(8). Do not edit. +# +# This is a dynamic resolv.conf file for connecting local clients to the +# internal DNS stub resolver of systemd-resolved. This file lists all +# configured search domains. +# +# Run "systemd-resolve --status" to see details about the uplink DNS servers +# currently in use. +# +# Third party programs must not access this file directly, but only through the +# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way, +# replace this symlink by a static file or a different symlink. +# +# See man:systemd-resolved.service(8) for details about the supported modes of +# operation for /etc/resolv.conf. +options edns0 +nameserver 8.8.8.8 +nameserver 8.8.4.4 +EOF \ No newline at end of file diff --git a/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/prebuild.sh b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/prebuild.sh new file mode 100644 index 0000000..a0864b1 --- /dev/null +++ b/train/atlas_benchmark-master/utils/Dockerfile/tf_ubuntu_arm64/prebuild.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +#-------------------------------------------------------------------------------- +# VERSION: 20.0.0.RC1 +# 请在此处使用使用bash语法编写脚本代码,执行安装准备工作,例如配置代理等 +# 本脚本将会在正式构建过程启动前被执行 +# +# 注:本脚本运行结束后不会被自动清除,若无需保留在镜像中请在postbuild.sh脚本中清除 +#-------------------------------------------------------------------------------- +#dns代理配置,修改“/etc/resolv.conf”文件,在文件中加入如下粗体内容,用户需根据实际情况进行配置。 +tee /etc/resolv.conf <<- EOF +nameserver 10.72.255.100 +EOF + + + diff --git a/train/atlas_benchmark-master/utils/atlasboost/README.md b/train/atlas_benchmark-master/utils/atlasboost/README.md new file mode 100644 index 0000000..36cbd15 --- /dev/null +++ b/train/atlas_benchmark-master/utils/atlasboost/README.md @@ -0,0 +1,166 @@ +## atlasboost +[TOC] +### 产品介绍 +atlasboost提供了如下功能: +(1) 一键式地启动单机或多机上的训练脚本,并行执行训练任务; +(2) 自动收集参与训练的device信息,生成rank table file; +(3) 通过mpi重定向功能,可实时的监控训练过程; + +### 目录结构 +源代码的目录结构如下: +``` +. +├── atlasboost +│   ├── common +│   │   ├── bin +│   │   ├── CMakeLists.txt +│   │   ├── context.cpp +│   │   ├── context.h +│   │   ├── control.cpp +│   │   ├── control.h +│   │   ├── json.cpp +│   │   ├── json.h +│   │   ├── operations.cpp +│   │   └── operations.h +│   └── tensorflow +│   ├── basics.py +│   ├── __init__.py +│   └── mpi_ops.py +├── build +│   ├── build.sh +| ├── compile.sh +| ├── compile_for_ci.sh +| └── openmpi_setup.sh +├── config +├── lib +├── doc +├── opensource +├── output +├── README.md +└── test + ├── mpi_local.sh + ├── mpi.sh + └── test_tensorflow.py +``` +目录结构说明如下: +(1) atlasboost: 用户在训练python脚本中导入的模块; +(2) common: C++源代码,用于收集device信息,生成rank table file; +(3) tensorflow: 支持tensorflow框架,设置环境变量,对外提供python接口; +(4) build: 编译脚本,用于编译common中的C++源代码; +(5) test: 测试脚本,可用于测试运行环境; +### 支持的产品 +Ascend 910 +### 支持的版本 + +### atlasboost引入 +(1)按照目录结构放入到一个公共的目录中,比如当前服务器创建一个目录public,把以上目录结构放到public中,则通过修改PYTHONPATH=$PYTHONPATH:./public/,外部就可以使用atlasboot接口了。 +(2)通过执行./setup --path dir(可选,root用户的默认目录是/usr/local/atlasboost,非root用户默认目录是/home/username/atlasboost),则会在默认路径或者dir目录下创建atlasboost文件夹,把安装的内容放在此目录下,若dir/atlasboost已经存在,则会有交互提示(是否继续在此目录下安装,请输入y/n),输入y则会覆盖此目录下重名的文件,输入n则会退出安装。 + +### 环境依赖 +atlasboost依赖于开源库Open MPI和Ascend 910软件中的DSMI接口; +(1) 安装Open MPI +下载4.0.2版本的Open MPI,下载地址: +https://www.open-mpi.org/software/ompi/v4.0/ +解压 +``` +tar -jxvf openmpi-4.0.2.tar.bz2 +``` +配置,编译和安装 +``` +./configure +make && make install +``` +使配置生效 +``` +ldconfig +``` +测试 +``` +mpirun --version +``` +(2) DSMI +atlasboost中调用DSMI接口获取device的相关信息,编译脚本compile.sh内容如下: +``` +#!/bin/bash + +export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/Ascend/driver/kernel/inc/driver +export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/Ascend/driver/lib64/driver + +CUR_DIR=$(dirname $(readlink -f $0)) +cd ${CUR_DIR}/../atlasboost/common +echo 2 > /proc/sys/kernel/randomize_va_space +cmake . +make +``` +其中CPLUS_INCLUDE_PATH和LIBRARY_PATH分别指定了DSMI头文件和对应的动态链接库路径。 +### 使用说明 +提示:由于通过gethostbyname获取服务器IP,故需要配置host。 +#### 1.单机环境测试 +将源代码在服务器上解压,然后编译: +``` +cd atlasboost/build +./compile.sh +``` +然后执行atlasboost/test目录下的测试脚本: +``` +./mpi_local.sh +``` +该测试程序创建了4条进程,分别收集了服务器上device0到device3的信息,在atlasboost/test生成一份rank_table_file,检查一下该文件中信息是否正确。 +#### 2.单机多卡训练 +将atlasboost文件夹复制到训练脚本中(只要Python导入模块时能找到) ,在python的启动脚本中导入atlasboost模块: +``` +import atlasboost.tensorflow.mpi_ops as atlasboost +``` +在python的启动脚本开始时调用atlasboost接口,在main函数中添加如下代码: +``` +初始化时传入支持的框架(tensorflow或者mindspore),默认是tensorflow. +atlasboost.init(frame="tensorflow") +device_id = atlasboost.local_rank() +atlasboost. set_device_id (device_id) +``` +提示:若非mpi启动训练任务请不要调用以上接口,并且同一台机器上的device_id不要相同。 +atlasboost模块初始化之后,每条进程会动态生成一个进程id,若在一台服务器上创建了n条进程,则进程id分别为0到n-1,用户需要根据进程id为每条进程分配一个device(process_id映射到device_id),可直接使用进程id作为device id,如上所示。 +执行命令启动训练脚本: +``` +mpirun -np 8 -bind-to none -map-by slot --allow-run-as-root ./start.sh +``` +其中,-np参数指定启动进程个数,该命令在当前服务器上启动8条进程,start.sh为模型的启动脚本, atlasboost模块会在当前目录为每一台服务器创建rank_table_file,文件在启动目录中。 +#### 3.多机环境部署与测试 +首先在每台参与训练的服务器中进行单机环境测试; +在多机环境下使用atlasboost,需要配置启动训练服务器到其他参与训练服务器SSH免密登录; +在启动服务器生成公钥: +``` +ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa +``` +将启动服务器的公钥发送到其他每台服务器 +测试: +``` +ssh xx.xx.xx.xx +``` +若免密登录配置成功,则可直接使用SSH登录到xx.xx.xx.xx。 +在每台服务器的相同位置保存一份atlasdc,若OS属于不同的CPU架构(arm或X86),需要重新编译;在启动服务器中,切换到atlasdc/test目录下,配置mpi.sh脚本: +``` +#!/bin/bash + +mpirun -H xx.xx.xx.xx:2,xx.xx.xx.xx:4 \ + --allow-run-as-root \ + --mca btl_tcp_if_exclude lo,docker0,endvnic \ + python3 test_tensorflow.py +``` +该脚本为在多台服务器上同时启动多条进程的命令,其中-H参数指定了启动哪些服务器上的test_tensorflow.py脚本以及每台服务器上启动几条进程,其中冒号后数值即为在该服务器上启动进程数,根据自己的环境进行配置。 +执行测试脚本: +``` +./mpi.sh +``` +若多机环境正常,则会在每台服务器的atlasboost/test目录下生成进程的工作目录,工作目录中生成了rank table file。 +#### 4.多机多卡训练 +训练脚本经过单机多卡分布式部署的配置之后,将训练脚本复制到每台参与训练服务器的相同位置,然后执行如下命令: +``` +mpirun -H xx.xx.xx.xx:8,xx.xx.xx.xx:8 \ + --allow-run-as-root \ + -bind-to none -map-by slot \ + --mca btl_tcp_if_exclude lo,docker0,endvnic \ + ./mpi_start.sh +``` +该命令在每台服务器上都启动了8条进程进行训练,每台服务器都生成了rank_table_file,其中--mca btl_tcp_if_exclude参数用于限制tcp通信时使用的网卡(不使用lo,docker0,endvnic)。 + diff --git a/train/atlas_benchmark-master/utils/benchmark_log/__init__.py b/train/atlas_benchmark-master/utils/benchmark_log/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/train/atlas_benchmark-master/utils/benchmark_log/basic_utils.py b/train/atlas_benchmark-master/utils/benchmark_log/basic_utils.py new file mode 100644 index 0000000..9edc1f2 --- /dev/null +++ b/train/atlas_benchmark-master/utils/benchmark_log/basic_utils.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +import os +import subprocess +import yaml + + +def get_model_parameter(config_type): + yaml_path = os.getenv("YAML_PATH") + with open(yaml_path, 'r') as f: + model_parameter_dict = yaml.load(f) + parameter_dict = model_parameter_dict.get(config_type) + if "tensorflow" in config_type: + parameter_dict.pop("mpirun_ip") + parameter_dict.pop("docker_image") + return parameter_dict + + +def get_environment_info(framework): + cpu_info = subprocess.getstatusoutput('lscpu')[1] + cpu_info = cpu_info.split("\nFlags")[0] + cpu_info_list = cpu_info.split() + cpu_info_keys = [] + cpu_info_values = [] + value_info = "" + for i in cpu_info_list: + if ":" not in i: + value_info += i + else: + i = i.split(":")[0] + cpu_info_keys.append(i) + if value_info: + cpu_info_values.append(value_info) + value_info = "" + cpu_info_dict = {} + for k, v in zip(cpu_info_keys, cpu_info_values): + cpu_info_dict[k] = v + NPU_info = "Ascend910" + framework_info = "" + if framework.lower() == "tensorflow": + import tensorflow as tf + framework_info = "tensorflow {}".format(tf.__version__) + if framework.lower() == "pytorch": + import torch + framework_info = "pytorch {}".format(torch.__version__) + os_info = subprocess.getstatusoutput('cat /proc/version')[1] + benchmark_version = "v1.0.0" + return cpu_info_dict, NPU_info, framework_info, os_info, benchmark_version diff --git a/train/atlas_benchmark-master/utils/benchmark_log/hwlog.py b/train/atlas_benchmark-master/utils/benchmark_log/hwlog.py new file mode 100644 index 0000000..abb6093 --- /dev/null +++ b/train/atlas_benchmark-master/utils/benchmark_log/hwlog.py @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import inspect +import logging +import json +import os +import re +import sys +import uuid +import datetime + + +ABK_VERSION = "1.0.0" # ABK version +CPU_INFO = "cpu_info" +NPU_INFO = "npu_info" +OS_INFO = "os_info" +FRAMEWORK_INFO = "framework_info" +CONFIG_INFO = "config_info" +BENCHMARK_VERSION = "benchmark_version" +YAML_INFO = "yaml_info" +DATA_URL = "data_url" +LOSS_SCALE = "loss_scale" +ITERATION_TIME = "iteration_time" +TOTAL_RUNNING_TIME = "total_running_time" +LOSS = "loss" +MLM_LOSS = "mlm_loss" +NSP_LOSS = "nsp_loss" +Average_LOSS = "average_loss" +MASKED_LM_ACCURACY = "masked_lm_accuracy" +MASKED_LM_LOSS = "masked_lm_loss" +NEXT_SENTENCE_ACCURACY = "next_sentence_accuracy" +NEXT_SENTENCE_LOSS = "next_sentence_loss" +GLOBAL_BATCH_SIZE = "global_batch_size" +ACC = "acc" +F1 = "f1" +PREC = "prec" +REC = "rec" +RUN_START = "run_start" +RUN_STOP = "run_stop" +RUN_FINAL = "run_final" +INPUT_SIZE = "input_size" +INPUT_BATCH_SIZE = "input_batch_size" +OPT_NAME = "opt_name" +OPT_LR = "opt_learning_rate" +OPT_MOMENTUM = "opt_momentum" +OPT_WEIGHT_DECAY = "opt_weight_decay" +GLOBAL_STEP = "global_step" +CURRENT_STEP = "current_step" +EVAL_RESULTS = "eval_results" +TRAIN_LOOP = "train_loop" +TOTAL_TRAIN_EPOCH = "total_train_epoch" +CURRENT_EPOCH = "current_epoch" +FPS = "fps" +THROWOUT = "throwout" +TRAIN_ACCURACY = "train_accuracy" +TRAIN_ACCURACY_TOP1 = "train_accuracy_top1" +TRAIN_ACCURACY_TOP5 = "train_accuracy_top5" +TRAIN_CHECKPOINT = "train_checkpoint" +EVAL_START = "eval_start" +EVAL_SIZE = "eval_size" +EVAL_TARGET = "eval_target" +EVAL_ACCURACY = "eval_accuracy" +EVAL_ACCURACY_TOP1 = "eval_accuracy_top1" +EVAL_ACCURACY_TOP5 = "eval_accuracy_top5" +EVAL_STOP = "eval_stop" +EVAL_ITERATION_ACCURACY = "eval_iteration_accuracy" +DATASET = "dataset" +BASE_LR = "base_lr" +# Set by imagenet_main.py +STDOUT_TAG_SET = { + ABK_VERSION, + CPU_INFO, + NPU_INFO, + OS_INFO, + FRAMEWORK_INFO, + CONFIG_INFO, + BENCHMARK_VERSION, + YAML_INFO, + DATA_URL, + DATASET, + TRAIN_ACCURACY, + LOSS_SCALE, + ITERATION_TIME, + TOTAL_RUNNING_TIME, + RUN_START, + RUN_STOP, + RUN_FINAL, + INPUT_SIZE, + GLOBAL_BATCH_SIZE, + INPUT_BATCH_SIZE, + OPT_NAME, + OPT_LR, + BASE_LR, + OPT_MOMENTUM, + OPT_WEIGHT_DECAY, + GLOBAL_STEP, + CURRENT_STEP, + TRAIN_LOOP, + TRAIN_ACCURACY_TOP1, + TRAIN_ACCURACY_TOP5, + TOTAL_TRAIN_EPOCH, + CURRENT_EPOCH, + FPS, + THROWOUT, + TRAIN_CHECKPOINT, + EVAL_START, + EVAL_SIZE, + EVAL_TARGET, + EVAL_ACCURACY, + EVAL_ACCURACY_TOP1, + EVAL_ACCURACY_TOP5, + EVAL_STOP, + EVAL_ITERATION_ACCURACY, + MLM_LOSS, + NSP_LOSS, + Average_LOSS, + MASKED_LM_ACCURACY, + MASKED_LM_LOSS, + NEXT_SENTENCE_ACCURACY, + NEXT_SENTENCE_LOSS, + LOSS, + EVAL_RESULTS, + ACC, + F1, + PREC, + REC, +} + + +REMARK_TAGS = ( + ABK_VERSION, + CPU_INFO, + NPU_INFO, + OS_INFO, + FRAMEWORK_INFO, + CONFIG_INFO, + BENCHMARK_VERSION, + YAML_INFO, + DATA_URL, + DATASET, + LOSS_SCALE, + ITERATION_TIME, + TOTAL_RUNNING_TIME, + RUN_START, + RUN_STOP, + RUN_FINAL, + INPUT_SIZE, + GLOBAL_BATCH_SIZE, + INPUT_BATCH_SIZE, + OPT_NAME, + TRAIN_ACCURACY, + TRAIN_ACCURACY_TOP1, + TRAIN_ACCURACY_TOP5, + OPT_LR, + BASE_LR, + OPT_MOMENTUM, + OPT_WEIGHT_DECAY, + GLOBAL_STEP, + CURRENT_STEP, + TRAIN_LOOP, + TOTAL_TRAIN_EPOCH, + CURRENT_EPOCH, + FPS, + THROWOUT, + TRAIN_CHECKPOINT, + EVAL_START, + EVAL_SIZE, + EVAL_TARGET, + EVAL_ACCURACY, + EVAL_ACCURACY_TOP1, + EVAL_ACCURACY_TOP5, + EVAL_STOP, + EVAL_ITERATION_ACCURACY, + MLM_LOSS, + NSP_LOSS, + Average_LOSS, + MASKED_LM_ACCURACY, + MASKED_LM_LOSS, + NEXT_SENTENCE_ACCURACY, + NEXT_SENTENCE_LOSS, + LOSS, + EVAL_RESULTS, + ACC, + F1, + PREC, + REC, +) + + +ABK_VERSION = "1.0.0" # ABK version +ROOT_DIR = None +PATTERN = re.compile('[a-zA-Z0-9]+') +LOG_FILE = os.getenv("REMARK_LOG_FILE") +LOGGER = logging.getLogger('benchmark_log') +LOGGER.setLevel(logging.DEBUG) +_STREAM_HANDLER = logging.StreamHandler(stream=sys.stdout) +_STREAM_HANDLER.setLevel(logging.INFO) +LOGGER.addHandler(_STREAM_HANDLER) +BENCHMARK = (os.getenv("REMARK_LOG_FILE").split("_")[1]).split(".")[0] + + +if LOG_FILE: + _FILE_HANDLER = logging.FileHandler(LOG_FILE) + _FILE_HANDLER.setLevel(logging.DEBUG) + LOGGER.addHandler(_FILE_HANDLER) +else: + _STREAM_HANDLER.setLevel(logging.DEBUG) + + +def get_caller(stack_index=2, root_dir=None): + ''' Returns file.py:lineno of your caller. A stack_index of 2 will provide + the caller of the function calling this function. Notice that stack_index + of 2 or more will fail if called from global scope. ''' + caller = inspect.getframeinfo(inspect.stack()[stack_index][0]) + # Trim the filenames for readability. + filename = caller.filename + filename = os.path.basename(filename) + # if root_dir is not None: + # filename = re.sub("^" + root_dir + "/", "", filename) + return "%s:%d" % (filename, caller.lineno) + + +TAG_SET = set(REMARK_TAGS) + + +def remark_print(key, value=None, benchmark=BENCHMARK, stack_offset=0, + tag_set=TAG_SET, deferred=False, root_dir=ROOT_DIR, + extra_print=False): + ''' Prints out an benchmark Log Line. + key: The benchmark log key such as 'EVAL_ACCURACY_TOP1' or 'FPS'. + value: The value which contains no newlines. + benchmark: model type: such as resnet50 + stack_offset: Increase the value to go deeper into the stack to find the callsite. For example, if this + is being called by a wraper/helper you may want to set stack_offset=1 to use the callsite + of the wraper/helper itself. + tag_set: The set of tags in which key must belong. + deferred: The value is not presently known. In that case, a unique ID will + be assigned as the value of this call and will be returned. The + caller can then include said unique ID when the value is known + later. + root_dir: Directory prefix which will be trimmed when reporting calling file + for compliance logging. + extra_print: Print a blank line before logging to clear any text in the line. + Example output: + ::::ABK V1.0.0 resnet50 2020-08-12 06:22:09.670723 (hooks.py:149) fps: 681.8494655321242 + ''' + + return_value = None + if (tag_set is None and not PATTERN.match(key)) or key not in tag_set: + raise ValueError('Invalid key for MLPerf print: ' + str(key)) + if value is not None and deferred: + raise ValueError("deferred is set to True, but a value was provided") + if deferred: + return_value = str(uuid.uuid4()) + value = "DEFERRED: {}".format(return_value) + if value is None: + tag = key + else: + str_json = json.dumps(value) + tag = "{key}: {value}".format(key=key, value=str_json) + callsite = get_caller(2 + stack_offset, root_dir=root_dir) + # now = time.time() + now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + message = ':::ABK {version} {benchmark} {secs} ({callsite}) {tag}'.format( + version=ABK_VERSION, secs=now, benchmark=benchmark, callsite=callsite, tag=tag) + if extra_print: + print() # There could be prior text on a line + if tag in STDOUT_TAG_SET: + LOGGER.info(message) + else: + LOGGER.debug(message) + return return_value diff --git a/train/atlas_benchmark-master/utils/download_dataset.sh b/train/atlas_benchmark-master/utils/download_dataset.sh new file mode 100644 index 0000000..a524a0c --- /dev/null +++ b/train/atlas_benchmark-master/utils/download_dataset.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Get COCO 2014 data sets + +if [ $1 == 'YoLov3' ];then + echo 111 + mkdir -p /home/datasets/coco + pushd /home/datasets/coco + + curl -O http://images.cocodataset.org/zips/train2014.zip + unzip train2014.zip + + curl -O http://images.cocodataset.org/zips/val2014.zip + unzip val2014.zip + + curl -O http://images.cocodataset.org/annotations/annotations_trainval2014.zip + unzip annotations_trainval2014.zip + +# Get bert/cule data sets +elif [ $1 == 'Bert' ];then + echo 222 + mkdir -p /home/datasets/Bertdata + pushd /home/datasets/Bertdata + + curl -O xxxxxxxxxxx + tar xxxxx + +# Get imagenet_TF data sets +else + echo 333 + mkdir -p /home/datasets/imagenet_TF + pushd /home/datasets/imagenet_TF + + + curl -O http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar + tar xvf ILSVRC2012_img_val.tar + + curl -O http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar + tar xvf ILSVRC2012_img_train.tar + + curl -O http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar + tar xvf ILSVRC2012_bbox_train_v2.tar +fi + + + +popd diff --git a/train/atlas_benchmark-master/utils/shell/get_params_for_yaml.sh b/train/atlas_benchmark-master/utils/shell/get_params_for_yaml.sh new file mode 100644 index 0000000..fb2a4e9 --- /dev/null +++ b/train/atlas_benchmark-master/utils/shell/get_params_for_yaml.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# 解析 yaml 文件中的配置, 并以键值对形式输出 +# args: +# $1: yaml 文件路径 +# $2: 要获取的节点名 +# +# return: +# key1=value1 +# key2=value2 +# ... +# +# 可以使用 +# `eval $(./get_params_for_yaml.sh $yamlPath $section)` +# 直接将参数作为变量存入内存 + + +params=$(python3.7 -c "import yaml; print('\n'.join(['%s=\"%s\"' % i for i in yaml.load(open(r'$1'), Loader=yaml.FullLoader).get('$2').items()]))") +if [ x"$params" == x"" ];then + echo "path: $1 not found key: $2" + exit 1 +fi +echo -e "$params" diff --git a/train/atlas_benchmark-master/utils/shell/hccl_sample.json b/train/atlas_benchmark-master/utils/shell/hccl_sample.json new file mode 100644 index 0000000..96ec094 --- /dev/null +++ b/train/atlas_benchmark-master/utils/shell/hccl_sample.json @@ -0,0 +1,9 @@ +{ + "server_count": "1", + "server_list": [{ + "device": [{devices}], + "server_id": "127.0.0.1" + }], + "status": "completed", + "version": "1.0" +} diff --git a/train/atlas_benchmark-master/utils/shell/set_json.sh b/train/atlas_benchmark-master/utils/shell/set_json.sh new file mode 100644 index 0000000..92431eb --- /dev/null +++ b/train/atlas_benchmark-master/utils/shell/set_json.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +rank_size=$1 +yamlPath=$2 +modelDir=$3 +config_section=$4 +currentDir=$(cd "$(dirname "$0")"; pwd) + +# 从 yaml 获取配置 +eval $(${currentDir}/get_params_for_yaml.sh ${yamlPath} ${config_section}) + +# device 列表, 若无指定 device 时根据 rank_size 顺序选择 +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +arr=($device_group) +if [ ${#arr[@]} -ne ${rank_size} ];then + echo "ERROR: device_group: $device_group, quantity is not equal to rank_size: $rank_size" + exit 1 +fi + +HCCL_dir=$modelDir/config +cp ${currentDir}/hccl_sample.json ${HCCL_dir}/${rank_size}p.json + +DEVICES="" + +rank_id=0 +for device_id in $device_group;do + DEVICE_IP=`hccn_tool -i ${device_id} -ip -g|awk -F ":" '/ipaddr/{print $2}'` + DEVICES+="\n\ + {\n\ + \"device_id\": \"${device_id}\",\n\ + \"device_ip\": \"${DEVICE_IP}\",\n\ + \"rank_id\": \"${rank_id}\"\n\ + }," + let rank_id++ +done +sed -i 's#{devices}#'"${DEVICES%?}"'#g' ${HCCL_dir}/${rank_size}p.json diff --git a/train/atlas_benchmark-master/utils/shell/start.sh b/train/atlas_benchmark-master/utils/shell/start.sh new file mode 100644 index 0000000..c683660 --- /dev/null +++ b/train/atlas_benchmark-master/utils/shell/start.sh @@ -0,0 +1,139 @@ +#!/bin/bash + + +model=$1 +hardware=$2 +yamlPath=$3 +modelDir=$4 +framework=$5 + +modelScripts="$modelDir/scripts" + +currentDir=$(cd "$(dirname "$0")"; pwd) +yamlDir=$(cd "$(dirname "${yamlPath}")";pwd) +train_dir=${currentDir%train*}/train +timeout=360000 +# 从 yaml 获取配置 +if [ x"${framework}" == x"tensorflow" ]; then + config_section="tensorflow_config" +elif [ x"${framework}" == x"pytorch" ]; then + config_section="pytorch_config" +else + config_section="mindspore_config" +fi +eval $(${currentDir}/get_params_for_yaml.sh ${yamlPath} ${config_section}) + +if [ x"${hardware}" == x"cluster" ];then + export CLUSTER=True + IFS="," + array=($mpirun_ip) + m=${array[0]#*:} + rank_size=0 + mpirun_all_ip="" + for var in ${array[@]}; do + n=${var#*:} + mpirun_all_ip+=" ${var%:*}" + let a="$n & ($n-1)" + let rank_size+=$n + if [ $a -ne 0 ] || [ $n -ne $m ];then + echo "mpirun_ip: $mpirun_ip error" + exit 1 + fi + done + export MPIRUN_ALL_IP=${mpirun_all_ip#?} +else + rank_size=${hardware%?} +fi + +eval device_group=\$device_group_${rank_size}p +if [ x"${device_group}" == x"" ] || [ ${rank_size} -ge 8 ];then + device_group="$(seq 0 "$(expr $rank_size - 1)")" +fi + +#tensorflow docker时要映射的路径 +if [ x"${framework}" == x"tensorflow" ]; then + if [ x"${hardware}" != x"cluster" ];then + # 仅单机执行需要配置 json + bash ${currentDir}/set_json.sh ${rank_size} ${yamlPath} ${modelDir} ${config_section} || exit 1 + fi + yaml_file_name=${yamlPath##*/} + train_model_name=${yaml_file_name%%.*} + if [ x"${train_model_name}" == x"Bert-Base" ] || [ x"${train_model_name}" == x"Bert-Large" ]; then + data_urls="-v ${input_files_dir}:${input_files_dir} -v ${eval_files_dir}:${eval_files_dir}" + elif [ x"${train_model_name}" == x"MobileNet" ] || [ x"${train_model_name}" == x"YoLoV3" ]; then + data_urls="-v ${data_url}:${data_url} -v ${ckpt_path}:${ckpt_path}" + elif [ x"${train_model_name}" == x"SSD-Resnet34" ]; then + raw_data=${training_file_pattern%raw_data*}raw_data + data_urls="-v ${raw_data}:${raw_data}" + else + data_urls="-v ${data_url}:${data_url}" + fi +fi + + +if [ x"${framework}" == x"pytorch" ]; then + if [ x"${train_model_name}" == x"ResNet50" ]; then + data_urls="-v ${data_url}:${data_url} -v ${ckpt_path}:${ckpt_path}" + else + data_urls="-v ${data_url}:${data_url}" + fi +fi + + +if [ x"$model" == x"docker" ];then + # docker 侧执行 + if [ x"${hardware}" == x"cluster" ];then + # docker多机 + docker exec -i mpirun /bin/bash -c "${modelScripts}/run.sh ${rank_size} ${yamlPath} ${currentDir} ${CLUSTER} '${MPIRUN_ALL_IP}'" & + else + DEVICE_DEV="" + for device_id in $device_group;do + DEVICE_DEV=`echo "${DEVICE_DEV}" --device=/dev/davinci${device_id}` + done + docker run -i --ipc=host \ + ${DEVICE_DEV} --device=/dev/davinci_manager \ + --device=/dev/devmm_svm --device=/dev/hisi_hdc \ + -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ + -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \ + -v ${train_dir}:${train_dir} \ + -v ${modelDir}:${modelDir} \ + ${data_urls} \ + -v ${yamlDir}:${yamlDir} \ + -v /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \ + -v /var/log/npu/slog/:/var/log/npu/slog -v /var/log/npu/profiling/:/var/log/npu/profiling \ + -v /var/log/npu/dump/:/var/log/npu/dump -v /var/log/npu/:/usr/slog ${docker_image} \ + /bin/bash -c "${modelScripts}/run.sh ${rank_size} ${yamlPath} ${currentDir}" & + fi +elif [ x"$model" == x"host" ]; then + # host 侧执行 + bash ${modelScripts}/run.sh ${rank_size} ${yamlPath} ${currentDir} & +fi +workshell=$! +timeused=0 +while true +do + ret=`ps -ef | grep ${modelScripts}/run.sh | grep ${workshell} | grep -v grep` + if [ x"${ret}" = x ]; + then + break + else + echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] train job is working, wait more 5s " + sleep 5 + let timeused+=5 + #如果超过配置的timeout时间,则kill 掉python训练进程 + if [ ${timeused} -gt ${timeout} ]; + then + echo "[`date +%Y%m%d-%H:%M:%S`] [ERROR] training timeout ! " + #获取python进程ID + train_sh_pid=`pgrep -P $(pgrep -P $workshell)` + for pid in $train_sh_pid + do + id=`pgrep -P $pid` + kill -9 $id + done + break + fi + fi +done + +echo "[`date +%Y%m%d-%H:%M:%S`] [INFO] process end " diff --git a/train/benchmark.sh b/train/benchmark.sh new file mode 100644 index 0000000..3a904d6 --- /dev/null +++ b/train/benchmark.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +parentDir=$(dirname "$PWD") +currentDir=$(cd "$(dirname "$0")"; pwd) + +execModel=AlexNet +mode=host +framework=tensorflow +hardware=1p + +framework_group="tensorflow pytorch mindspore" +hardware_group="1p 2p 4p 8p cluster ct" + +echo_help(){ + echo "" + echo " --execmodel, -e (选填) 需要执行的模型名称, 默认 ResNet50" + echo " --hardware, -hw (选填) 选择 1p, 2p, 4p, 8p, cluster|ct(集群), 默认 1p" + echo " --yamlpath, -y (选填) yaml 文件的路径, 默认为 yaml 路径下的 {execmodel}.yaml" + echo " --framework, -f (选填) 模型训练框架, 默认 tensorflow" + echo " -docker, -host (选填) 选择 docker 或 host 下执行, 默认使用 host" + echo "" + echo " --help, -h 显示帮助信息" + echo " --list, -l 显示支持的框架与模型" + echo "" + echo " 示例1,docker 环境下启动 MobileNet 多卡(8p)训练:" + echo " ./benckmark.sh -e MobileNet -hw 8p -y ./yaml/MobileNet.yaml -docker" + echo " 示例2,host 环境下启动 MobileNet 单卡(1p)训练,yaml 使用默认文件:" + echo " ./benckmark.sh -e MobileNet" + echo "" + exit 0 +} + +error_log(){ + echo -e "\nERROR:\n\n$1" + exit 1 +} + +exec_train(){ + + if [ x"${yamlPath}" == x"" ];then + yamlPath=$(find ${currentDir}/yaml/ -iregex ".*${execModel}.yaml$" 2>/dev/null) + fi + + [ -f ${yamlPath} ] || error_log "No such file or directory: ${yamlPath}\n" + + error_msg="" + echo $hardware_group | grep -wq "$hardware" || error_msg+="hardware: $hardware not in '$hardware_group'\n" + echo $framework_group | grep -wq "$framework" || error_msg+="framework: $framework not in '$framework_group'\n" + if [ x"$error_msg" != x"" ];then + error_log "$error_msg" + fi + chmod -R u+x ${currentDir}/* + exec_train_file=$(find ${currentDir} -iregex ".*${execModel}/${framework}/scripts/run.sh$" 2>/dev/null) + file_count=$(echo ${exec_train_file} | wc -w) + start_file=$currentDir/atlas_benchmark-master/utils/shell/start.sh + [ x"$hardware" == x"ct" ] && hardware="cluster" + if [ "${file_count}" -eq 1 ] && [ -a ${exec_train_file} ]; then + modelDir=$(cd $(dirname "$exec_train_file")/..;pwd) + echo "find script path success" + echo "run train script file path is "${exec_train_file} + bash "${start_file}" ${mode} ${hardware} "${yamlPath}" "${modelDir}" "${framework}" + else + error_log "The model($execModel) does not support the framework($framework) temporarily.\nplease use --list\n" + exit 1 + fi +} + +list_model (){ + for i in $framework_group;do + echo -e "\n${i}:\n" + for d in $(find ${currentDir} -iregex ".*/${i}/scripts/run.sh$" 2>/dev/null);do + echo $d|awk -F / '{print " "$(NF-3)}' + done + done + echo "" +} + +while [ -n "$1" ] +do + case "$1" in + -e|--execmodel) + execModel=$2; + shift + ;; + -host|-docker) + tmp=$1 + mode=${tmp:1} + ;; + -y|--yamlpath) + yamlPath=$2 + shift + ;; + -f|--framework) + framework=$2 + shift + ;; + -hw|--hardware) + hardware=$2 + shift + ;; + -l|--list) + list_model; + exit + ;; + -h|--help) + echo_help; + exit + ;; + *) + echo "$1 is not an option, please use --help" + exit 1 + ;; + esac + shift +done + +exec_train diff --git a/train/docker_ct_build.sh b/train/docker_ct_build.sh new file mode 100644 index 0000000..41035fa --- /dev/null +++ b/train/docker_ct_build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +currentDir=$(cd "$(dirname "$0")"; pwd) +yamlpath=${currentDir%train*}train/yaml/cluster_info.yaml +toolsPath=${currentDir%train*}train/atlas_benchmark-master/utils/shell +# 从 yaml 获取配置 + +eval $(${toolsPath}/get_params_for_yaml.sh ${yamlpath} 'tensorflow_config') + +# docker网络桥接 +echo $(route -n|awk '{print $1}'|sed -n '4p') +echo $(route -n|awk '{print $2}'|sed -n '3p') +echo $(route -n|awk '{print $8}'|sed -n '3p') +docker network create -d macvlan --subnet=$(route -n|awk '{print $1}'|sed -n '4p')/${epcount} --gateway=$(route -n|awk '{print $2}'|sed -n '3p') -o parent=$(route -n|awk '{print $8}'|sed -n '3p') $(route -n|awk '{print $8}'|sed -n '3p') + + +data="-v ${imagenet_data}:${imagenet_data} -v ${yolo_data}:${yolo_data} -v ${ssd_data}:${ssd_data} -v ${bert_data}:${bert_data}" + +# docroute -nker容器挂载 + +docker run -ti -d --net=$(route -n|awk '{print $8}'|sed -n '3p') --ip=${ip} --name mpirun --shm-size=16g -e ASCEND_VISIBLE_DEVICES=0-7 -v ${currentDir%train*}/train:${currentDir%train*}/train ${data} -v /var/log/npu/slog/:/var/log/npu/slog -v /var/log/npu/profiling/:/var/log/npu/profiling -v /var/log/npu/dump/:/var/log/npu/dump -v /var/log/npu/:/usr/slog ${docker_images} /bin/bash + +docker exec -ti mpirun /bin/bash -c "/etc/init.d/ssh start" diff --git a/train/result/README.md b/train/result/README.md new file mode 100644 index 0000000..9864465 --- /dev/null +++ b/train/result/README.md @@ -0,0 +1,13 @@ +# 文件夹功能 +1.存放每个模型训练过程打点,记录模型训练表现 +2.每个模型一个文件,每次训练将覆盖上一次记录 +3.以名字以hw打头,如hw_resnet50.log,hw_bert.log +## 主要包含信息 +1. 芯片硬件,系统软件,训练框架信息 +2. 模型的 学习率,数据集,优化器,loss scale,batch size等 +3. 总训练步数,总训练轮数,过程中的性能,训练收敛时精度 +###差异 +1. 每个模型输出内容可能存在细微差别,但基本包含以上内容 + + + diff --git a/train/yaml/Bert-Base.yaml b/train/yaml/Bert-Base.yaml new file mode 100644 index 0000000..0541932 --- /dev/null +++ b/train/yaml/Bert-Base.yaml @@ -0,0 +1,46 @@ +tensorflow_config: + #layer层数有6和12两种,中文数据集用 bert_base_layer6_cn.json/bert_base_layer12_cn.json 英文用bert_base_layer6_cn.json/bert_base_layer12_en.json + bert_config_file: bert_base_layer6_cn.json + #数据集句子长度是256时 设置为 256,40,句子长度是128时设置为128,20 + max_seq_length: 128 + max_predictions_per_seq: 20 + + # 最佳性能train_batch_size为160 + train_batch_size: 160 + learning_rate: 1e-4 + num_warmup_steps: 100 + num_train_steps: 1000 + optimizer_type: adam + manual_fp16: True + use_fp16_cls: True + input_files_dir: /home/BertData/cn-wiki-128/ + eval_files_dir: /home/BertData/cn-wiki-128/ + npu_bert_debug: False + npu_bert_use_tdt: True + distributed: True + do_train: True + do_eval: False + num_accumulation_steps: 1 + iterations_per_loop: 100 + npu_bert_loss_scale: 0 + save_checkpoints_steps: 1000 + npu_bert_clip_by_global_norm: False + + # docker 镜像名称:版本号 + docker_image: c73:b021 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.140.199:8,90.90.140.229:8 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 6 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + #profiling 配置 + PROFILING_MODE: false + AICPU_PROFILING_MOD: false + PROFILING_OPTIONS: training_trace + FP_POINT: bert/embeddings/GatherV2 + BP_POINT: gradients/bert/embeddings/IdentityN_1_grad/UnsortedSegmentSum + diff --git a/train/yaml/Bert-Large.yaml b/train/yaml/Bert-Large.yaml new file mode 100644 index 0000000..268598e --- /dev/null +++ b/train/yaml/Bert-Large.yaml @@ -0,0 +1,47 @@ +tensorflow_config: + #中文数据用 bert_config_large_cn.json 英文用bert_config_large_en.json + bert_config_file: bert_config_large_cn.json + #数据集句子长度是256时 设置为 256,40,句子长度是128时设置为128,20 + max_seq_length: 128 + max_predictions_per_seq: 20 + + # 最佳性能train_batch_size为96,如果超显存,可调小至32 + train_batch_size: 96 + learning_rate: 3.125e-5 + num_warmup_steps: 100 + num_train_steps: 1000 + optimizer_type: adam + manual_fp16: True + use_fp16_cls: True + input_files_dir: /home/data/bert_nv/dataset/cn-wiki-128/ + eval_files_dir: /home/data/bert_nv/dataset/cn-wiki-128/ + do_train: True + do_eval: False + num_accumulation_steps: 1 + iterations_per_loop: 100 + npu_bert_loss_scale: 0 + distributed: True + graph_memory_max_size: 27917287424 + variable_memory_max_size: 5368709120 + npu_bert_tail_optimize: True + save_checkpoints_steps: 1000 + npu_bert_clip_by_global_norm: False + + # docker 镜像名称:版本号 + docker_image: c75:b031 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.140.199:8,90.90.140.229:8 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 1 4 + device_group_4p: 0 1 2 3 + + #profiling 配置 + PROFILING_MODE: false + AICPU_PROFILING_MODE: false + PROFILING_OPTIONS: training_trace + FP_POINT: bert/embeddings/GatherV2 + BP_POINT: gradients/bert/embeddings/IdentityN_1_grad/UnsortedSegmentSum + diff --git a/train/yaml/DeepMar.yaml b/train/yaml/DeepMar.yaml new file mode 100644 index 0000000..f3742c7 --- /dev/null +++ b/train/yaml/DeepMar.yaml @@ -0,0 +1,18 @@ +pytorch_config: + # 基本参数 + data_url: /home/zhusiyi/dataset/peta/ + + epoches: 150 + # 1p 参数为256 2p 512 4p 1024 8p为2048 + batch_size: 256 + + seed: 49 + + # 默认参数1p 0.01 2p 0.016 4p 0.016 8p 0.016 + lr: 0.016 + + #单P指定 卡 默认7卡 + device: 7 + + # docker 镜像名称:版本号 + docker_image: c73:b021 diff --git a/train/yaml/DenseNet121.yaml b/train/yaml/DenseNet121.yaml new file mode 100644 index 0000000..ddc0771 --- /dev/null +++ b/train/yaml/DenseNet121.yaml @@ -0,0 +1,52 @@ +tensorflow_config: + # 基本参数 + data_url: /home/imagenet_TF/ + epoches: 1 + epochs_between_evals: 1 + batch_size: 32 + log_dir: ./ckpt + + # 1p参数 + mode_1p: train # train、evaluate、train_and_evaluate三种模式 + max_train_steps_1p: 100 + iterations_per_loop_1p: 10 + display_every: 10 + log_name_1p: densenet121_1p.log + + # 8p参数 + mode_8p: train_and_evaluate # train、evaluate、train_and_evaluate三种模式 + iterations_per_loop_8p: 1000 + lr: 0.1 + log_name_8p: densenet121_8p.log + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.154:8,90.90.176.54:8 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + + epoches: 90 + # 1p 参数为256 2p 512 4p 1024 8p为2048 + batch_size: 256 + + # 默认参数1p 0.1 2p 0.2 4p 0.4 8p 0.8 + lr: 0.1 + + seed: 49 + + # 单P指定卡 默认0卡 + device_single: 0 + + # 2p 4p 8p 修改 2p可选 1,2或2,3 两两相连 4p 可选'0,1,2,3'或'1,2,3,4'规则同2p 8p默认为'0,1,2,3,4,5,6,7' + device_group_multi: '0,1,2,3,4,5,6,7' + # docker 镜像名称:版本号 + docker_image: c73:b021 diff --git a/train/yaml/EfficientNet.yaml b/train/yaml/EfficientNet.yaml new file mode 100644 index 0000000..44d1998 --- /dev/null +++ b/train/yaml/EfficientNet.yaml @@ -0,0 +1,20 @@ +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + + epoches: 90 + # 1p 参数为512 2p 1024 4p 2048 8p为4096 + batch_size: 512 + + seed: 49 + + # 默认参数1p 0.4 2p 0.8 4p 1.6 8p 3.2 + lr: 0.4 + + #单P指定 卡 默认0卡 + device: 0 + + # 2p 4p 8p 修改 2p可选 1,2或2,3 两两相连 4p 可选'0,1,2,3'或'1,2,3,4'规则同2p 8p默认为'0,1,2,3,4,5,6,7' + device_group: '0,1,2,3,4,5,6,7' + # docker 镜像名称:版本号 + docker_image: c73:b021 diff --git a/train/yaml/MobileNet.yaml b/train/yaml/MobileNet.yaml new file mode 100644 index 0000000..937c9b4 --- /dev/null +++ b/train/yaml/MobileNet.yaml @@ -0,0 +1,49 @@ +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: /home/imagenet_TF/ + epoches: 1 + + # 训练(train) 或 评测(evaluate) + mode: train + batch_size: 256 + #仅在 mode 为 evaluate 时用到 + ckpt_path: /opt/0908/benchmark-benchmark_Alpha/train/result/tf_mobilenet/trainingJob_20200905171017/0/results/model.ckpt-123125 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b021 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + profiling_mode: false + profiling_options: training_trace + fp_point: L2Loss + bp_point: gradients/AddN_30 + aicpu_profiling_mode: false + + +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + + epoches: 600 + + # 单p默认512 2p 1024 4p 2048 8p默认4096 + batch_size: 512 + + # 默认参数1p 0.05 2p 0.1 4p 0.2 8p 0.4 + lr: 0.05 + + seed: 123456 + device_single: 'npu:0' + # 指定2p 4p 8p卡 2p可选'0,1' 4p可选'0,1,2,3' 8p为'0,1,2,3,4,5,6,7' + device_group_mutli: '0,1,2,3' + + # docker 镜像名称:版本号 + docker_image: c73:b021 diff --git a/train/yaml/ResNet101.yaml b/train/yaml/ResNet101.yaml new file mode 100644 index 0000000..b51c977 --- /dev/null +++ b/train/yaml/ResNet101.yaml @@ -0,0 +1,19 @@ +tensorflow_config: + # 基本参数 + data_url: /home/imagenet_TF/ + # 1p/8p,epoches设为150 + epoches: 1 + epochs_between_evals: 1 + max_train_steps: 1000 + batch_size: 128 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 diff --git a/train/yaml/ResNet50.yaml b/train/yaml/ResNet50.yaml new file mode 100644 index 0000000..d83fd69 --- /dev/null +++ b/train/yaml/ResNet50.yaml @@ -0,0 +1,66 @@ +tensorflow_config: + # 基本参数 + data_url: /home/imagenet_TF/ + batch_size: 32 + # 1p/8p, epoches设为90 + epoches: 1 + # 跑精度时max_train_steps设为None + max_train_steps: 1000 + epochs_between_evals: 1 + iterations_per_loop: 100 + save_checkpoints_steps: 115200 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + #跑1p时batch_size为512;2p时为1024;4p时为2048;跑8p时batch_size为4096 + batch_size: 512 + epoches: 90 + # train_and_evaluate、evaluate两种模式 + mode: train_and_evaluate + ckpt_path: /home/train/result/pt_resnet50/training_job_20200916042624/7/checkpoint_npu7model_best.pth.tar + # docker 镜像名称:版本号 + docker_image: c73:b02 + # 默认参数1p时为0.2,2p/4p/8p时为2.048 + lr: 0.2 + # 指定 device id, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + +mindspore_config: + # 基本参数 + # 训练时数据集/home/data/imagenet/train, 评测是数据集是/home/data/imagenet/val + data_url: /home/data/imagenet/train + #跑1p/2p/4p/8p时batch_size均为256 + batch_size: 256 + epoches: 5 + pre_trained: None + save_checkpoint_epochs: 5 + loss_scale: 1024 + # mode:train or evaluate + mode: train + # 将训练后生成的ckpt的路径配置在此处 + checkpoint_path: /home/wx933135/benchmark_20200924-benchmark_Alpha/benchmark_20200924-benchmark_Alpha/train/result/ms_resnet50/training_job_20200928154504/2/ckpt_2/resnet-5_625.ckpt + + # eval_device_id,评测是指定的device id + eval_device_id: 4 + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_1p: 0 1 + device_group_1p: 0 1 2 3 + diff --git a/train/yaml/Resnet50_HC.yaml b/train/yaml/Resnet50_HC.yaml new file mode 100644 index 0000000..9fe11d8 --- /dev/null +++ b/train/yaml/Resnet50_HC.yaml @@ -0,0 +1,23 @@ +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: /home/imagenet_TF + epoches: 1 + epochs_between_evals: 1 + mode: train + batch_size: 32 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.154:8,90.90.176.54:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + + # 1. 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + # 2. 仅在小于 8p 时生效 + # 3. 若不使用该配置, 请使用在行首添加'#'注释的方法将其关闭 + # device_group: 0 1 2 3 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 diff --git a/train/yaml/Resnext50.yaml b/train/yaml/Resnext50.yaml new file mode 100644 index 0000000..d33e9d4 --- /dev/null +++ b/train/yaml/Resnext50.yaml @@ -0,0 +1,28 @@ +tensorflow_config: + # 基本参数 + max_steps: 1000 + data_url: /home/imagenet_TF/ + epoches: 1 + epochs_between_evals: 1 + batch_size: 32 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + + # 1. 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + # 2. 仅在小于 8p 时生效 + # 3. 若不使用该配置, 请使用在行首添加'#'注释的方法将其关闭 + # device_group: 0 1 2 3 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + profiling_mode: false + profiling_options: training_trace + fp_point: fp32_vars/conv2d/Conv2Dfp32_vars/BatchNorm/FusedBatchNormV3_Reduce + bp_point: loss_scale/gradients/AddN_70 + aicpu_profiling_mode: false diff --git a/train/yaml/SSD-Resnet34.yaml b/train/yaml/SSD-Resnet34.yaml new file mode 100644 index 0000000..bf76251 --- /dev/null +++ b/train/yaml/SSD-Resnet34.yaml @@ -0,0 +1,25 @@ +tensorflow_config: + + train_batch_size: 32 + training_file_pattern: /home/data/raw_data/tfrecord/train2017* + resnet_checkpoint: /home/data/raw_data/resnet34_pretrain_model/model.ckpt-28152 + validation_file_pattern: /home/data/raw_data/tfrecord/val2017* + val_json_file: /home/data/raw_data/annotations/instances_val2017.json + eval_batch_size: 32 + num_epochs: 1 + model_dir: result_npu + max_steps: 432000 + + # train_and_eval, train, eval + runmode: train_and_eval + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest diff --git a/train/yaml/ShuffleNet.yaml b/train/yaml/ShuffleNet.yaml new file mode 100644 index 0000000..d26e5e9 --- /dev/null +++ b/train/yaml/ShuffleNet.yaml @@ -0,0 +1,18 @@ +pytorch_config: + # 基本参数 + data_url: /home/imagenet/ + #跑1p时batch_size为1536, 2p为2048,4p为4096,8p时为8196 + batch_size: 1536 + epoches: 10 + warm_up_epochs: 5 + epochs_between_evals: 5 + # 默认参数1p 0.75 2p 1 4p 2 8p 4 + lr: 0.75 + + # docker 镜像名称:版本号 + docker_image: c73:b02 + + # 指定 device id, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_multi: 0,1,2,3,4,5,6,7 + diff --git a/train/yaml/YoLoV3.yaml b/train/yaml/YoLoV3.yaml new file mode 100644 index 0000000..a718319 --- /dev/null +++ b/train/yaml/YoLoV3.yaml @@ -0,0 +1,36 @@ +tensorflow_config: + + #mode支持single或者 multi + mode: single + + data_url: /opt/npu/dataset + + # train 或者 evaluate + runmode: train + + #仅在evaluate时用到 + ckpt_path: /train/benchmark-master720/train/atlas_benchmark-master/object_detection/yolov3/tensorflow/result/TrainingJob-20200724115042 + + total_epoches: 1 + + save_epoch: 3 + + #single 默认32 multi默认16 + batch_size: 32 + + # 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.152:8,90.90.176.154:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + profiling_mode: false + profiling_options: training_trace:task_trace + fp_point: yolov3/darknet53_body/Conv/Conv2D + bp_point: cond_1/Momentum/update_yolov3/yolov3_head/Conv_9/weights/ApplyMomentum + aicpu_profiling_mode: false diff --git a/train/yaml/cluster_info.yaml b/train/yaml/cluster_info.yaml new file mode 100644 index 0000000..b98fad1 --- /dev/null +++ b/train/yaml/cluster_info.yaml @@ -0,0 +1,17 @@ +tensorflow_config: + # 基本参数 + imagenet_data: /home/imagenet_TF/ + # yolo数据集 + yolo_data: /opt/npu/dataset/ + # bert数据集 + bert_data: /home/BertData/ + # ssd数据集 + ssd_data: /home/data/raw_data + # 镜像名称 + docker_images: ubuntu:b020 + + # 指定容器ip + ip: 90.90.176.110 + + # 掩码个数 255.255.255.0 选24 255.255.254.0 选23:wq + epcount: 24 diff --git a/train/yaml/vgg16.yaml b/train/yaml/vgg16.yaml new file mode 100644 index 0000000..34fc033 --- /dev/null +++ b/train/yaml/vgg16.yaml @@ -0,0 +1,34 @@ +tensorflow_config: + # 基本参数 + data_url: /home/imagenet_TF/ + max_epoches: 100 + epochs_between_evals: 1 + batch_size: 32 + log_dir: ckpt + max_train_steps: 1000 + + # 1p参数 + mode_1p: train # train、evaluate、train_and_evaluate三种模式,训练(train) 或训练评测(train_and_evaluate) + iterations_per_loop_1p: 10 + display_every: 10 + log_name_1p: vgg16_1p.log + + # 8p参数 + mode_8p: train_and_evaluate # train、evaluate、train_and_evaluate三种模式,训练(train) 或训练评测(train_and_evaluate) + iterations_per_loop_8p: 5004 + lr: 0.01 + log_name_8p: vgg16_8p.log + + # 仅多机执行需要配置: ip1:卡数量1,ip2:卡数量2 + mpirun_ip: 90.90.176.154:8,90.90.176.54:8 + + # docker 镜像名称:版本号 + docker_image: mpirun3:latest + + # 1. 指定 device id, 多个 id 使用空格分隔, 数量需与 rank_size 相同 + # 2. 仅在小于 8p 时生效 + # 3. 若不使用该配置, 请使用在行首添加'#'注释的方法将其关闭 + # device_group: 0 1 2 3 + device_group_1p: 0 + device_group_2p: 0 1 + device_group_4p: 0 1 2 3 \ No newline at end of file